Metadata-Version: 2.4
Name: arthur-observability-sdk
Version: 2.1.506.dev0
Summary: Arthur Observability SDK — telemetry, prompt management, and framework instrumentation
Author-email: Arthur AI <engineering@arthur.ai>
Requires-Python: <3.14,>=3.10
Requires-Dist: httpx<1,>=0.28
Requires-Dist: openinference-instrumentation<1,>=0.1
Requires-Dist: openinference-semantic-conventions<1,>=0.1
Requires-Dist: opentelemetry-api<2,>=1.27
Requires-Dist: opentelemetry-exporter-otlp-proto-http<2,>=1.27
Requires-Dist: opentelemetry-sdk<2,>=1.27
Requires-Dist: pydantic>=2
Requires-Dist: python-dateutil>=2.8.2
Requires-Dist: typing-extensions>=4.7.1
Requires-Dist: urllib3<3.0.0,>=1.25.3
Provides-Extra: agent-framework
Requires-Dist: openinference-instrumentation-agent-framework; extra == 'agent-framework'
Provides-Extra: agentspec
Requires-Dist: openinference-instrumentation-agentspec; extra == 'agentspec'
Provides-Extra: agno
Requires-Dist: openinference-instrumentation-agno; extra == 'agno'
Provides-Extra: all
Requires-Dist: openinference-instrumentation-agent-framework; extra == 'all'
Requires-Dist: openinference-instrumentation-agentspec; extra == 'all'
Requires-Dist: openinference-instrumentation-agno; extra == 'all'
Requires-Dist: openinference-instrumentation-anthropic; extra == 'all'
Requires-Dist: openinference-instrumentation-autogen; extra == 'all'
Requires-Dist: openinference-instrumentation-autogen-agentchat; extra == 'all'
Requires-Dist: openinference-instrumentation-bedrock; extra == 'all'
Requires-Dist: openinference-instrumentation-beeai; (python_version >= '3.11') and extra == 'all'
Requires-Dist: openinference-instrumentation-claude-agent-sdk; extra == 'all'
Requires-Dist: openinference-instrumentation-crewai; extra == 'all'
Requires-Dist: openinference-instrumentation-dspy; extra == 'all'
Requires-Dist: openinference-instrumentation-google-adk; extra == 'all'
Requires-Dist: openinference-instrumentation-google-genai; extra == 'all'
Requires-Dist: openinference-instrumentation-groq; extra == 'all'
Requires-Dist: openinference-instrumentation-guardrails; extra == 'all'
Requires-Dist: openinference-instrumentation-haystack; extra == 'all'
Requires-Dist: openinference-instrumentation-instructor; extra == 'all'
Requires-Dist: openinference-instrumentation-langchain; extra == 'all'
Requires-Dist: openinference-instrumentation-litellm; extra == 'all'
Requires-Dist: openinference-instrumentation-llama-index; extra == 'all'
Requires-Dist: openinference-instrumentation-mcp; extra == 'all'
Requires-Dist: openinference-instrumentation-mistralai; extra == 'all'
Requires-Dist: openinference-instrumentation-monkai-agent; extra == 'all'
Requires-Dist: openinference-instrumentation-openai; extra == 'all'
Requires-Dist: openinference-instrumentation-openai-agents; extra == 'all'
Requires-Dist: openinference-instrumentation-openlit; extra == 'all'
Requires-Dist: openinference-instrumentation-openllmetry; extra == 'all'
Requires-Dist: openinference-instrumentation-pipecat; extra == 'all'
Requires-Dist: openinference-instrumentation-portkey; extra == 'all'
Requires-Dist: openinference-instrumentation-pydantic-ai; extra == 'all'
Requires-Dist: openinference-instrumentation-smolagents; extra == 'all'
Requires-Dist: openinference-instrumentation-strands-agents; extra == 'all'
Requires-Dist: openinference-instrumentation-vertexai; extra == 'all'
Provides-Extra: anthropic
Requires-Dist: openinference-instrumentation-anthropic; extra == 'anthropic'
Provides-Extra: autogen
Requires-Dist: openinference-instrumentation-autogen; extra == 'autogen'
Provides-Extra: autogen-agentchat
Requires-Dist: openinference-instrumentation-autogen-agentchat; extra == 'autogen-agentchat'
Provides-Extra: bedrock
Requires-Dist: openinference-instrumentation-bedrock; extra == 'bedrock'
Provides-Extra: beeai
Requires-Dist: openinference-instrumentation-beeai; (python_version >= '3.11') and extra == 'beeai'
Provides-Extra: claude-agent-sdk
Requires-Dist: openinference-instrumentation-claude-agent-sdk; extra == 'claude-agent-sdk'
Provides-Extra: crewai
Requires-Dist: openinference-instrumentation-crewai; extra == 'crewai'
Provides-Extra: dspy
Requires-Dist: openinference-instrumentation-dspy; extra == 'dspy'
Provides-Extra: google-adk
Requires-Dist: openinference-instrumentation-google-adk; extra == 'google-adk'
Provides-Extra: google-genai
Requires-Dist: openinference-instrumentation-google-genai; extra == 'google-genai'
Provides-Extra: groq
Requires-Dist: openinference-instrumentation-groq; extra == 'groq'
Provides-Extra: guardrails
Requires-Dist: openinference-instrumentation-guardrails; extra == 'guardrails'
Provides-Extra: haystack
Requires-Dist: openinference-instrumentation-haystack; extra == 'haystack'
Provides-Extra: instructor
Requires-Dist: openinference-instrumentation-instructor; extra == 'instructor'
Provides-Extra: langchain
Requires-Dist: openinference-instrumentation-langchain; extra == 'langchain'
Provides-Extra: litellm
Requires-Dist: openinference-instrumentation-litellm; extra == 'litellm'
Provides-Extra: llama-index
Requires-Dist: openinference-instrumentation-llama-index; extra == 'llama-index'
Provides-Extra: mcp
Requires-Dist: openinference-instrumentation-mcp; extra == 'mcp'
Provides-Extra: mistralai
Requires-Dist: openinference-instrumentation-mistralai; extra == 'mistralai'
Provides-Extra: monkai-agent
Requires-Dist: openinference-instrumentation-monkai-agent; extra == 'monkai-agent'
Provides-Extra: openai
Requires-Dist: openinference-instrumentation-openai; extra == 'openai'
Provides-Extra: openai-agents
Requires-Dist: openinference-instrumentation-openai-agents; extra == 'openai-agents'
Provides-Extra: openlit
Requires-Dist: openinference-instrumentation-openlit; extra == 'openlit'
Provides-Extra: openllmetry
Requires-Dist: openinference-instrumentation-openllmetry; extra == 'openllmetry'
Provides-Extra: pipecat
Requires-Dist: openinference-instrumentation-pipecat; extra == 'pipecat'
Provides-Extra: portkey
Requires-Dist: openinference-instrumentation-portkey; extra == 'portkey'
Provides-Extra: pydantic-ai
Requires-Dist: openinference-instrumentation-pydantic-ai; extra == 'pydantic-ai'
Provides-Extra: smolagents
Requires-Dist: openinference-instrumentation-smolagents; extra == 'smolagents'
Provides-Extra: strands-agents
Requires-Dist: openinference-instrumentation-strands-agents; extra == 'strands-agents'
Provides-Extra: vertexai
Requires-Dist: openinference-instrumentation-vertexai; extra == 'vertexai'
Description-Content-Type: text/markdown

# Arthur Observability SDK

Python SDK for sending traces and managing prompts with the
[Arthur GenAI Engine](https://arthur.ai).

---

## Installation

```bash
pip install arthur-observability-sdk
```

To instrument a specific framework, install its extra:

```bash
pip install "arthur-observability-sdk[openai]"
pip install "arthur-observability-sdk[langchain]"
pip install "arthur-observability-sdk[anthropic]"
```

---

## How-to guides

Full guides are in [`docs/`](docs/):

- **[Getting started](docs/getting-started.md)** — initialisation, session/user context, framework instrumentation, shutdown
- **[Prompt management](docs/prompt-management.md)** — fetching and rendering versioned prompts, PROMPT span attributes

### Quick start

```python
from arthur_observability_sdk import Arthur

arthur = Arthur(
    api_key="your-api-key",       # or set ARTHUR_API_KEY env var
    task_id="<your-task-uuid>",
    service_name="my-app",
)
arthur.instrument_openai()

# Tag all spans in this block with session and user
with arthur.attributes(session_id="sess-1", user_id="user-42"):
    response = openai_client.chat.completions.create(...)

arthur.shutdown()
```

### Prompt management

```python
# Fetch a saved prompt by name (defaults to "latest" version)
prompt = arthur.get_prompt("system-instructions")

# Render with variable substitution
rendered = arthur.render_prompt(
    "rag-answer",
    variables={"context": "...", "question": "..."},
)
messages = rendered["messages"]
```

---

## Supported instrumentors

Pass `--extras` to install any of these alongside the SDK.

| Extra | Framework | Method |
|-------|-----------|--------|
| `agent-framework` | Agent Framework | `instrument_agent_framework()` |
| `agentspec` | AgentSpec | `instrument_agentspec()` |
| `agno` | Agno | `instrument_agno()` |
| `anthropic` | Anthropic | `instrument_anthropic()` |
| `autogen` | AutoGen | `instrument_autogen()` |
| `autogen-agentchat` | AutoGen AgentChat | `instrument_autogen_agentchat()` |
| `bedrock` | AWS Bedrock | `instrument_bedrock()` |
| `beeai` | BeeAI | `instrument_beeai()` |
| `crewai` | CrewAI | `instrument_crewai()` |
| `dspy` | DSPy | `instrument_dspy()` |
| `google-adk` | Google ADK | `instrument_google_adk()` |
| `google-genai` | Google GenAI | `instrument_google_genai()` |
| `groq` | Groq | `instrument_groq()` |
| `guardrails` | Guardrails AI | `instrument_guardrails()` |
| `haystack` | Haystack | `instrument_haystack()` |
| `instructor` | Instructor | `instrument_instructor()` |
| `langchain` | LangChain | `instrument_langchain()` |
| `litellm` | LiteLLM | `instrument_litellm()` |
| `llama-index` | LlamaIndex | `instrument_llama_index()` |
| `mcp` | MCP | `instrument_mcp()` |
| `mistralai` | Mistral AI | `instrument_mistralai()` |
| `monkai-agent` | Monkai Agent | `instrument_monkai_agent()` |
| `openai` | OpenAI | `instrument_openai()` |
| `openai-agents` | OpenAI Agents | `instrument_openai_agents()` |
| `openlit` | OpenLIT | `instrument_openlit()` |
| `openllmetry` | OpenLLMetry | `instrument_openllmetry()` |
| `pipecat` | Pipecat | `instrument_pipecat()` |
| `portkey` | Portkey | `instrument_portkey()` |
| `pydantic-ai` | Pydantic AI | `instrument_pydantic_ai()` |
| `smolagents` | SmolAgents | `instrument_smolagents()` |
| `strands-agents` | Strands Agents | `instrument_strands_agents()` |
| `vertexai` | Vertex AI | `instrument_vertexai()` |
| `claude-agent-sdk` | Claude Agent SDK | `instrument_claude_agent_sdk()` |

Install all at once: `pip install "arthur-observability-sdk[all]"`

---

## Developer guide

### Setup

```bash
cd arthur-observability-sdk

# 1. Generate the API client (requires Node.js and Java)
./scripts/generate_openapi_client.sh generate python

# 2. Install dependencies (also registers the generated client in the venv)
./scripts/generate_openapi_client.sh install python
```

> **Note:** `python/src/arthur_genai_client/` is auto-generated and gitignored. You must run
> `./scripts/generate_openapi_client.sh generate python` after cloning, and again whenever the
> GenAI Engine API changes. See [Regenerating the API client](#regenerating-the-api-client).

### Running tests

```bash
# Run from arthur-observability-sdk/python/
cd python

# Unit tests only (fast, no network)
uv run pytest tests -m "unit_tests" -v

# Integration/smoke tests (builds wheel, installs into a fresh venv)
uv run pytest tests -m "integration_tests" -v

# All tests
uv run pytest tests -v
```

### Linting

```bash
# Run from arthur-observability-sdk/
./scripts/lint.sh
```

Or individually (from `arthur-observability-sdk/python/`):

```bash
cd python
uv run black src tests
uv run isort src tests --profile black
uv run autoflake --remove-all-unused-imports --in-place --recursive src tests
uv run mypy src/arthur_observability_sdk
```

### Regenerating the API client

`python/src/arthur_genai_client/` is auto-generated from the GenAI Engine OpenAPI spec
and is **not committed to the repository**. Regenerate it after cloning or whenever
the API changes:

```bash
./scripts/generate_openapi_client.sh generate python
```

Requires Node.js (any recent LTS) and Java 11+.

### Building the wheel

```bash
uv build --wheel
```
