lostbean

lostbean

AgentObs - LLM Agent Observability for Elixir

AgentObs - LLM Agent Observability for Elixir

I’m excited to share AgentObs, a new library for instrumenting LLM agentic
applications in Elixir with rich observability!

What is AgentObs?

AgentObs provides a simple, idiomatic interface for tracking agent loops, tool
calls, LLM requests, and prompts in your Elixir applications. It uses native
:telemetry events and translates them to OpenTelemetry spans with
OpenInference semantic conventions.

Key Features:

  • :bullseye: High-level instrumentation helpers - trace_agent/3, trace_tool/3,
    trace_llm/3, trace_prompt/3
  • :robot: Optional ReqLLM integration - Automatic instrumentation with token tracking
    and streaming support
  • :electric_plug: Pluggable backend architecture - Phoenix (OpenInference), Generic
    OpenTelemetry, or custom handlers
  • :bar_chart: Rich metadata tracking - Token usage, costs, tool calls, and more
  • :rocket: Built on OTP - Supervised handlers with fault tolerance

Quick Example

defmodule MyApp.WeatherAgent do
  def get_forecast(city) do
    AgentObs.trace_agent("weather_forecast", %{input: "What's the weather in #{city}?"}, fn ->
      # Call LLM to determine tool to use
      {:ok, _response, _metadata} =
        AgentObs.trace_llm("gpt-4o", %{
          input_messages: [%{role: "user", content: "Get weather for #{city}"}]
        }, fn ->
          response = call_openai(...)
          {:ok, response, %{
            output_messages: [%{role: "assistant", content: response}],
            tokens: %{prompt: 50, completion: 25, total: 75}
          }}
        end)

      # Execute the tool
      {:ok, weather_data} =
        AgentObs.trace_tool("get_weather_api", %{arguments: %{city: city}}, fn ->
          {:ok, %{temp: 72, condition: "sunny"}}
        end)

      {:ok, "The weather in #{city} is #{weather_data.condition}", %{
        tools_used: ["get_weather_api"]
      }}
    end)
  end
end

ReqLLM Integration

For apps using ReqLLM, AgentObs provides helpers
that automatically extract tokens, tool calls, and more:

# Non-streaming
{:ok, response} =
  AgentObs.ReqLLM.trace_generate_text(
    "anthropic:claude-3-5-sonnet",
    [%{role: "user", content: "Hello!"}]
  )

# Streaming
{:ok, stream_response} =
  AgentObs.ReqLLM.trace_stream_text(
    "anthropic:claude-3-5-sonnet",
    [%{role: "user", content: "Tell me a story"}]
  )

Visualization

Use with Arize Phoenix to get beautiful trace visualization with chat messages,
token usage, and nested spans:

Links

https://github.com/lostbean/agent_obs

Where Next?

Popular in Announcing Top

Hal9000
Here is my first stab at this. README pasted below. https://github.com/Hal9000/elixir_random Comments and critiques are welcome. Thank...
New
mbuhot
Leverage Open Api 3.0 (Swagger) to document, test, validate and explore your Plug and Phoenix APIs. Generate and serve a JSON Open API ...
New
danschultzer
None of the current solutions worked well for me, so I went ahead and built a user management system from scratch. This project took far...
548 30338 241
New
sasajuric
I’d like to announce a small library called boundaries. This is an experimental project which explores the idea of enforcing boundaries ...
New
mathieuprog
Hello :waving_hand: Allow me to introduce you to Tz, an alternative time zone database support to Tzdata. Why another library? First a...
New
aesmail
Hello guys, I have finally made it. I created an admin interface for a framework. It’s been on my todo list for years and with the curre...
New
Qqwy
TypeCheck: Fast and flexible runtime type-checking for your Elixir projects. Core ideas Type- and function specifications are const...
336 14703 100
New

Other popular topics Top

baxterw3b
Hi guys, i’m new in the Elixir world, and i have to say, that i love it! i’m having some problem to understand anonymous functions with ...
New
Qqwy
Original source of discussion: This topic on the Pragmatic Programmers’ Functional Web Development with Elixir, OTP, and Phoenix forum. ...
New
openscript
Hello! Sorry for this astonishing simple question, but I’m really stuck. I try to set up the intellij-elixir plugin, but I don’t know ho...
New
ashish173
I am using Ecto timestamps with postgres, I can see the timestamps() use the :naive_dateime but for my use case I wanted to store the ti...
New
sen
Hi All, I set a environment variables in dev.exs , like below code. when i start server, how can i set the ${enable} value? thanks. d...
New
saif
Hello everyone, Long time lurker first time poster here. I’ve recently begun working on Elixir full-time again! :raised_hands: It’s been...
New

We're in Beta

About us Mission Statement