Agent frameworks

Agno

Capture traces from Agno agents and teams

Choose a setup method

Method Use it when
Voxmith skill You want your coding agent to inspect the app, make the change, and verify it.
Voxmith SDK You want explicit control over the interaction boundaries and fields.
OpenTelemetry The framework already emits useful spans or you operate an OTel pipeline.

Start with one method for a call path. Combining SDK tracking with framework OpenTelemetry on the same call can create duplicate interactions.

Recommended. Choose this path when you want your coding agent to inspect the project, select a supported transport, make the smallest instrumentation change, send a test event, and verify that it reached Voxmith.

Install the skill once in your coding-agent environment:

npx skills add Voxmith/skills --skill voxmith

Run the framework-specific prompt below from the application root. Review the resulting diff before deploying it.

Use the voxmith skill to add Voxmith analytics to this Agno application.
Org ID: your-org-id
Instrument the real agent.run() path and verify one fresh interaction.

Manual setup: Voxmith SDK

pip install voxmith
import voxmith

voxmith.init("your-org-id")
interaction = voxmith.begin(user_id="u-42", agent_name="agno-support", input=prompt)
try:
    response = agent.run(prompt)
    interaction.end(output=response.content)
except Exception as exc:
    interaction.end(output=str(exc), success=False)
    raise
finally:
    voxmith.shutdown()

Manual setup: OpenTelemetry

Install

pip install agno openinference-instrumentation-agno \
            opentelemetry-sdk opentelemetry-exporter-otlp-proto-http

Setup

import os
from agno.agent import Agent
from agno.models.openai import OpenAIChat
from openinference.instrumentation.agno import AgnoInstrumentor
from openinference.instrumentation import using_attributes
from opentelemetry import trace
from opentelemetry.sdk.trace import TracerProvider
from opentelemetry.sdk.trace.export import BatchSpanProcessor
from opentelemetry.exporter.otlp.proto.http.trace_exporter import OTLPSpanExporter

os.environ["OTEL_EXPORTER_OTLP_ENDPOINT"] = "https://otel.voxmith.com"
os.environ["OTEL_EXPORTER_OTLP_HEADERS"] = "X-Voxmith-Org-ID=<your-org-id>"

provider = TracerProvider()
provider.add_span_processor(BatchSpanProcessor(OTLPSpanExporter()))
trace.set_tracer_provider(provider)
AgnoInstrumentor().instrument()

agent = Agent(
    model=OpenAIChat(id="gpt-4o-mini"),
    session_id="sess-123",   # Agno's first-class session
    user_id="u-42",
)

with using_attributes(session_id="sess-123", user_id="u-42"):
    agent.print_response("Hello")

Agno itself supports session_id and user_id as Agent constructor params. Spans carry OpenInference attributes plus agno.agent.name / agno.team.name. Instrument once at process start; child agents in teams inherit.

Alternative: OpenLit

openlit.init(...) is also supported and auto-instruments common providers in one shot.

Verify

Run one agent.print_response call, then open Events in Voxmith. Confirm spans include session_id, user_id, and agno.agent.name.

Troubleshooting

  • Instrument once at process start before agent calls.
  • Confirm OTEL_EXPORTER_OTLP_HEADERS contains X-Voxmith-Org-ID=<your-org-id>.
  • If child team spans are missing, confirm the parent Agno agent is instrumented before teams are constructed.

References

Next steps

  • Conversations: review the complete Agno interaction.
  • Events: inspect the spans Voxmith received.
  • Intents: organize production conversations by what users wanted.