Choose an integration
Find the integration that fits how your agent is built, in Python or TypeScript.
Judgment ingests OpenTelemetry spans, and each integration is a different way to create them and hand them to the Judgment exporter. Every page in this section assumes you’ve initialized the SDK as in Set up tracing, with JUDGMENT_API_KEY and JUDGMENT_ORG_ID set.
Pick the row for whatever does the most work in your agent. That’s usually the framework running the tool loop rather than the model client underneath it.
| What creates your spans | Python | TypeScript | Page |
|---|---|---|---|
| You call the OpenAI client directly | wrap() |
wrap() |
Model clients |
| You call Anthropic, Together, or Google GenAI directly | wrap() |
OpenTelemetry instrumentation | Model clients |
| Bedrock, Vertex AI, Groq, Ollama, LiteLLM, other providers | OpenTelemetry instrumentor | OpenTelemetry instrumentation | Model clients |
| LangGraph or LangChain | OpenInference instrumentor | Send OTLP | LangGraph and LangChain |
| OpenAI Agents SDK | OpenInference instrumentor | Send OTLP | OpenAI Agents SDK |
| Claude Agent SDK | setup_claude_agent_sdk() |
Send OTLP | Claude Agent SDK |
| Claude Managed Agents | Not applicable | wrapAnthropicManagedAgents() |
Claude Agent SDK |
| Vercel AI SDK | Not applicable | AI SDK telemetry | Vercel AI SDK |
| Google ADK, Pipecat, LiveKit Agents, Pydantic AI | Install Judgment as the global provider | Send OTLP | Frameworks with built-in OpenTelemetry |
| FastAPI, Flask, Django, httpx, SQLAlchemy, Redis, Celery, and other libraries | Tracer.registerOTELInstrumentation() |
Tracer.registerOTELInstrumentation() |
OpenTelemetry instrumentation libraries |
| An OpenTelemetry SDK or Collector you already run, any language, OpenClaw | OTLP over HTTP | OTLP over HTTP | Send OTLP directly |
| Logfire, LangSmith, Braintrust, or Langfuse | Dual export | Dual export | Keep your existing tool |
“Send OTLP” in the TypeScript column means Judgment has no TypeScript helper for that framework. If the framework emits OpenTelemetry spans through the global provider, call JudgmentTracerProvider.installAsGlobalTracerProvider() after Tracer.init() so they go through the SDK to Judgment. Otherwise, point its exporter at Judgment.
What’s one line and what’s real setup
wrap(),setup_claude_agent_sdk(), and, for most libraries,Tracer.registerOTELInstrumentation(...)are one line afterTracer.init.- Frameworks that only read the global OpenTelemetry provider need one extra call,
JudgmentTracerProvider.install_as_global_tracer_provider()in Python orJudgmentTracerProvider.installAsGlobalTracerProvider()in TypeScript.Tracer.initdoesn’t install it for you. - Raw OTLP and dual export are real setup. You build the exporter, set three headers, and need the project ID instead of the project name.
Rules for every integration
- Record each model call once. If a framework integration already records the model call, don’t also
wrap()the client or add a provider instrumentor. You’d get duplicate model spans, tokens, and cost. - Keep one project name per agent. The name creates the project if it doesn’t exist (Set up tracing explains the lookup). Use
environment=for dev, staging, and production. - Flush before short-lived processes exit. Scripts, Lambda handlers, and CLI tools should call
Tracer.force_flush()(Python) orawait Tracer.shutdown()(TypeScript) before they return.