Skip to content
Judgment Labs
Esc
↑↓navigate↵open⌘Jpreview
On this page

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 after Tracer.init.
  • Frameworks that only read the global OpenTelemetry provider need one extra call, JudgmentTracerProvider.install_as_global_tracer_provider() in Python or JudgmentTracerProvider.installAsGlobalTracerProvider() in TypeScript. Tracer.init doesn’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

  1. 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.
  2. 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.
  3. Flush before short-lived processes exit. Scripts, Lambda handlers, and CLI tools should call Tracer.force_flush() (Python) or await Tracer.shutdown() (TypeScript) before they return.

Was this page helpful?