> ## Documentation Index
> Fetch the complete documentation index at: https://docs.pandaprobe.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Anthropic

> Auto-trace Anthropic Messages API calls

### Installation

<Tabs>
  <Tab title="pip">
    ```bash theme={null}
    pip install "pandaprobe[anthropic]"
    ```
  </Tab>

  <Tab title="uv">
    ```bash theme={null}
    uv add "pandaprobe[anthropic]"
    ```
  </Tab>
</Tabs>

### Setup

<Tabs>
  <Tab title="Sync">
    ```python theme={null}
    from pandaprobe.wrappers import wrap_anthropic
    from anthropic import Anthropic

    client = wrap_anthropic(Anthropic())
    ```
  </Tab>

  <Tab title="Async">
    ```python theme={null}
    from pandaprobe.wrappers import wrap_anthropic
    from anthropic import AsyncAnthropic

    async_client = wrap_anthropic(AsyncAnthropic())
    ```
  </Tab>
</Tabs>

## Messages API

Span name: `"anthropic-messages"`, SpanKind: `LLM`

```python theme={null}
response = client.messages.create(
    model="claude-sonnet-4-6",
    max_tokens=1024,
    system="You are a helpful assistant.",
    messages=[{"role": "user", "content": "Explain quantum computing."}],
)
```

**What gets traced**

* Input: system prompt (from top-level `system` kwarg) plus messages, normalized to a standard format
* Output: text content blocks
* Model name
* Token usage
* Model parameters: `temperature`, `top_p`, `top_k`, `max_tokens`, `stop_sequences`, thinking configuration
* Extended thinking or reasoning blocks stored in metadata as `reasoning_summary`

### Streaming

<CodeGroup>
  ```python title="stream=True" theme={null}
  response = client.messages.create(
      model="claude-sonnet-4-6",
      max_tokens=1024,
      messages=[{"role": "user", "content": "Hello!"}],
      stream=True,
  )
  for event in response:
      if hasattr(event, "delta") and hasattr(event.delta, "text"):
          print(event.delta.text, end="")
  ```

  ```python title="messages.stream context manager" theme={null}
  with client.messages.stream(
      model="claude-sonnet-4-6",
      max_tokens=1024,
      messages=[{"role": "user", "content": "Hello!"}],
  ) as stream:
      for text in stream.text_stream:
          print(text, end="")
  ```
</CodeGroup>

Both streaming patterns are fully supported with time-to-first-token tracking.

## Extended thinking

When using Anthropic's extended thinking feature, thinking blocks are automatically extracted and stored in the span metadata under the `reasoning_summary` key. Thinking content is stripped from the visible output.

## Token usage mapping

| Anthropic Field               | PandaProbe Field        |
| ----------------------------- | ----------------------- |
| `input_tokens`                | `prompt_tokens`         |
| `output_tokens`               | `completion_tokens`     |
| `cache_read_input_tokens`     | `cache_read_tokens`     |
| `cache_creation_input_tokens` | `cache_creation_tokens` |
