---
title: "Choose an integration"
description: "Find the integration that fits how your agent is built, in Python or TypeScript."
sidebar:
  label: "Integrations"
seo:
  title: "Choose an integration | Judgment Docs"
  description: "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](/documentation/connect/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](/documentation/connect/integrations/model-clients) |
| You call Anthropic, Together, or Google GenAI directly | `wrap()` | OpenTelemetry instrumentation | [Model clients](/documentation/connect/integrations/model-clients) |
| Bedrock, Vertex AI, Groq, Ollama, LiteLLM, other providers | OpenTelemetry instrumentor | OpenTelemetry instrumentation | [Model clients](/documentation/connect/integrations/model-clients) |
| LangGraph or LangChain | OpenInference instrumentor | Send OTLP | [LangGraph and LangChain](/documentation/connect/integrations/langgraph-and-langchain) |
| OpenAI Agents SDK | OpenInference instrumentor | Send OTLP | [OpenAI Agents SDK](/documentation/connect/integrations/openai-agents-sdk) |
| Claude Agent SDK | `setup_claude_agent_sdk()` | Send OTLP | [Claude Agent SDK](/documentation/connect/integrations/claude-agent-sdk) |
| Claude Managed Agents | Not applicable | `wrapAnthropicManagedAgents()` | [Claude Agent SDK](/documentation/connect/integrations/claude-agent-sdk#claude-managed-agents-typescript) |
| Vercel AI SDK | Not applicable | AI SDK telemetry | [Vercel AI SDK](/documentation/connect/integrations/vercel-ai-sdk) |
| Google ADK, Pipecat, LiveKit Agents, Pydantic AI | Install Judgment as the global provider | Send OTLP | [Frameworks with built-in OpenTelemetry](/documentation/connect/integrations/frameworks-with-built-in-otel) |
| FastAPI, Flask, Django, httpx, SQLAlchemy, Redis, Celery, and other libraries | `Tracer.registerOTELInstrumentation()` | `Tracer.registerOTELInstrumentation()` | [OpenTelemetry instrumentation libraries](/documentation/connect/integrations/otel-instrumentation-libraries) |
| An OpenTelemetry SDK or Collector you already run, any language, OpenClaw | OTLP over HTTP | OTLP over HTTP | [Send OTLP directly](/documentation/connect/integrations/send-otlp-directly) |
| Logfire, LangSmith, Braintrust, or Langfuse | Dual export | Dual export | [Keep your existing tool](/documentation/connect/integrations/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](/documentation/connect/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.

{/* SCREENSHOT: Traces view showing one lunch-order-agent trace with an agent root span, LLM child spans, and tool spans, dark mode */}
