Skip to main content

OpenInference Claude Agent SDK Instrumentation

Python auto-instrumentation for the Claude Agent SDK (Python). Traces query() and ClaudeSDKClient as OpenInference AGENT spans with prompt input, result output, session/model metadata, token counts, and tool child spans via hook injection.

  • query() – One span per call (one-off sessions).
  • ClaudeSDKClient – One span per response turn: each time you iterate receive_response(), a span is created for that turn. Use for continuous conversations.
  • Tools – Tool calls are captured as child TOOL spans via Claude Agent SDK hooks (PreToolUse/PostToolUse/PostToolUseFailure).
  • Subagents – Work delegated through a subagent tool such as Task is grouped under a nested AGENT span, with the subagent's own tool calls as its children.

For detailed LLM and tool spans inside agent runs, use openinference-instrumentation-anthropic together with this package; the Agent SDK uses the Anthropic API under the hood.

Traces are OpenTelemetry-compatible and can be sent to any OTLP collector, Arize Phoenix (local), Phoenix Cloud, or Arize AX.

Installation

pip install openinference-instrumentation-claude-agent-sdk

Quickstart

pip install openinference-instrumentation-claude-agent-sdk claude-agent-sdk arize-phoenix opentelemetry-sdk opentelemetry-exporter-otlp

Option A – Remote Phoenix: Set PHOENIX_COLLECTOR_ENDPOINT to your collector endpoint (e.g. https://<host>/v1/traces). If auth is enabled on that Phoenix (including Phoenix Cloud), also set PHOENIX_API_KEY; the snippet below sends it as a bearer token.

Option B – Local Phoenix: Start Phoenix, then run your script:

python -m phoenix.server.main serve

Then in Python:

import asyncio
import os
from claude_agent_sdk import query, ClaudeAgentOptions
from openinference.instrumentation.claude_agent_sdk import ClaudeAgentSDKInstrumentor
from opentelemetry.exporter.otlp.proto.http.trace_exporter import OTLPSpanExporter
from opentelemetry.sdk import trace as trace_sdk
from opentelemetry.sdk.trace.export import SimpleSpanProcessor

# Remote Phoenix: set PHOENIX_COLLECTOR_ENDPOINT, plus PHOENIX_API_KEY if auth is enabled. Defaults to local Phoenix.
endpoint = os.environ.get("PHOENIX_COLLECTOR_ENDPOINT", "http://127.0.0.1:6006/v1/traces")
api_key = os.environ.get("PHOENIX_API_KEY")
headers = {"authorization": f"Bearer {api_key}"} if api_key else None
tracer_provider = trace_sdk.TracerProvider()
tracer_provider.add_span_processor(SimpleSpanProcessor(OTLPSpanExporter(endpoint, headers=headers)))
ClaudeAgentSDKInstrumentor().instrument(tracer_provider=tracer_provider)

async def main():
    async for message in query(
        prompt="What files are in this directory?",
        options=ClaudeAgentOptions(allowed_tools=["Bash", "Glob"]),
    ):
        if hasattr(message, "result"):
            print(message.result)

asyncio.run(main())

View traces in Phoenix Cloud, at http://localhost:6006 when running Phoenix locally, or in Arize AX.

Examples

Run the example in this repo from the package directory:

pip install -r examples/requirements.txt
export ANTHROPIC_API_KEY=your-key
python examples/example.py

The example always exports spans over OTLP, defaulting to a local Phoenix at http://127.0.0.1:6006 (start it first, or set PHOENIX_COLLECTOR_ENDPOINT to another Phoenix and, if it has auth enabled, PHOENIX_API_KEY). See examples/README.md for what the example does.

What is instrumented

  • query() – Each call is wrapped in a single AGENT span named ClaudeAgentSDK.query with:

    • Input: prompt text or JSON (for async message iterables)
    • Output: result text/JSON from the SDK result message, plus llm.output_messages including any tool calls
    • Metadata: session.id, llm.model_name, llm.finish_reason, llm.provider/llm.system (anthropic), token counts (prompt, completion, total, cache read/write), and llm.cost.total when available
    • Tools: TOOL child spans created via SDK hooks, with tool.name, input parameters, and output
    • Subagents: a nested AGENT span named ClaudeAgentSDK.<tool> (e.g. ClaudeAgentSDK.Task) with agent.name set, parenting the subagent's TOOL spans
  • ClaudeSDKClient – For multi-turn conversations:

    • connect(prompt=...) and query(prompt) record the prompt for the next response.
    • Each receive_response() iteration is wrapped in an AGENT span named ClaudeAgentSDK.ClaudeSDKClient.receive_response with the same input/output/metadata/tool/subagent spans as above.
    • receive_messages() is not wrapped; use receive_response() to get a span per turn.

LLM spans for the SDK's internal Anthropic API calls are not created by this package; add openinference-instrumentation-anthropic and instrument Anthropic for that.

More Info

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

File details

Details for the file openinference_instrumentation_claude_agent_sdk-0.1.17.tar.gz.

File metadata

File hashes

Hashes for openinference_instrumentation_claude_agent_sdk-0.1.17.tar.gz
Algorithm Hash digest
SHA256 d10a2e42cd1e681a8fde1eaf9b932ae01b5654c23733f1f5d1fee5c18d8175ec
MD5 dfea5bdecf702f637185209f84bd1af2
BLAKE2b-256 239cced0c45212f776f6364549ea03d194630aed9db82010f88aa75f2b7716e9

See more details on using hashes here.

Provenance

The following attestation bundles were made for openinference_instrumentation_claude_agent_sdk-0.1.17.tar.gz:

Publisher: publish.yaml on Arize-ai/openinference

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file openinference_instrumentation_claude_agent_sdk-0.1.17-py3-none-any.whl.

File metadata

File hashes

Hashes for openinference_instrumentation_claude_agent_sdk-0.1.17-py3-none-any.whl
Algorithm Hash digest
SHA256 ad2f961c447f858223624048a51316b994577de78aa9917e6a136092f5f0f96f
MD5 491b727d7d6836cbd0c23d07b3773845
BLAKE2b-256 621a1b5c07a351b24e3dfb26604174908835a1aa4f53bdfd330c0af33689da58

See more details on using hashes here.

Provenance

The following attestation bundles were made for openinference_instrumentation_claude_agent_sdk-0.1.17-py3-none-any.whl:

Publisher: publish.yaml on Arize-ai/openinference

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Release history Release notifications | RSS feed

This release

0.1.17 This release

2 files

0.1.16

2 files

0.1.15

2 files

0.1.14

2 files

0.1.13

2 files

0.1.12

2 files

0.1.11

2 files

0.1.10

2 files

0.1.9

2 files

0.1.8

2 files

0.1.7

2 files

0.1.6

2 files

0.1.5

2 files

0.1.4

2 files

0.1.3

2 files

0.1.2

2 files

0.1.1

2 files

0.1.0

2 files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page