Skip to main content

Observability and mesh layer for multi-agent AI systems — track what your agents decided, why they decided it, and how they're connected.

Project description

AgentWeave

Observability for multi-agent AI systems. Track what your agents decided, why they decided it, and how much it cost.

Three decorators — or zero, with auto-instrumentation. Full decision provenance. Works with any OTLP backend.

agent.nix                          94ms
├── llm.claude-sonnet-4-6          81ms  ← prompt_tokens=847, completion_tokens=312
├── tool.image_search               52ms
├── llm.claude-sonnet-4-6          79ms  ← prompt_tokens=847, completion_tokens=312
├── tool.image_search               51ms
├── llm.claude-sonnet-4-6          80ms  ← found it
└── tool.deploy_portfolio           48ms

When an agent delegates to another agent, calls an LLM ten times, and finally deploys a result — you see the output but not the chain. AgentWeave makes the chain the first-class artifact. Every span carries W3C PROV-O provenance on OpenTelemetry: what was consumed, what was generated, which agent made the call, which model ran it.

How it works

graph LR
    subgraph Agents
        A1[Claude Agent<br><small>Python / Node.js</small>]
        A2[Gemini Agent<br><small>Python / Node.js</small>]
        A3[Any Agent<br><small>OpenAI, etc.</small>]
    end

    subgraph AgentWeave Proxy :4000
        P[Multi-Provider<br>Proxy]
    end

    subgraph Upstream LLMs
        AN[api.anthropic.com]
        GO[generativelanguage<br>.googleapis.com]
    end

    subgraph Observability
        OT[OTLP Collector<br><small>Tempo / Jaeger / Langfuse</small>]
        GR[Grafana<br>Dashboard]
    end

    A1 -- "ANTHROPIC_BASE_URL" --> P
    A2 -- "GOOGLE_GENAI_BASE_URL" --> P
    A3 -. "@trace_llm decorator" .-> OT

    P -- "/v1/messages" --> AN
    P -- "/v1beta/models/*" --> GO
    P -- "OTel spans" --> OT
    OT --> GR

Three paths to instrumentation:

  1. Auto-instrumentation (auto_instrument()) — one call patches Anthropic and OpenAI SDKs. No decorators needed.
  2. Decorators (@trace_agent, @trace_llm, @trace_tool) — wrap your functions directly in Python, TypeScript, or Go. Zero infrastructure needed.
  3. Proxy — point any agent's base URL at AgentWeave. It auto-detects the provider, forwards upstream, extracts token counts, and emits OTel spans. No code changes.

AgentWeave Grafana dashboard showing LLM call counts, latency by model, and recent traces across Claude and Gemini
AgentWeave dashboard — 80 LLM calls across Claude Opus, Sonnet, and Haiku with latency breakdowns and live trace feed

Install

SDK Language Install
sdk/python Python pip install agentweave-sdk
sdk/js TypeScript / JavaScript npm install agentweave
sdk/go Go go get github.com/arniesaha/agentweave-go

Quickstart (Python)

Option A — Auto-instrumentation (zero decorators)

from agentweave import auto_instrument

auto_instrument()  # patches Anthropic + OpenAI SDKs automatically

# Every client.messages.create() and client.chat.completions.create()
# now emits OTel spans with token counts — no wrappers needed.

Option B — Decorators (explicit control)

from agentweave import AgentWeaveConfig, trace_agent, trace_llm, trace_tool

AgentWeaveConfig.setup(
    agent_id="my-agent-v1",
    agent_model="claude-sonnet-4-6",
    otel_endpoint="http://localhost:4318",
)

@trace_llm(provider="anthropic", model="claude-sonnet-4-6",
           captures_input=True, captures_output=True)
def call_claude(messages: list) -> ...:
    return client.messages.create(...)

@trace_tool(name="web_search", captures_input=True, captures_output=True)
def web_search(query: str) -> str:
    ...

@trace_agent(name="my-agent")
async def handle(message: str) -> str:
    response = call_claude(messages=[{"role": "user", "content": message}])
    return web_search(response.content[0].text)

All three spans link to the same trace ID. Open any OTLP backend and you see the waterfall.

Auto-Instrumentation

Patch LLM SDK client methods with a single call — no decorators needed.

from agentweave import auto_instrument, uninstrument

auto_instrument()                              # patch all detected SDKs
auto_instrument(providers=["anthropic"])        # selective
auto_instrument(captures_output=True)          # include response preview

uninstrument()                                 # restore originals
  • Supports Anthropic (Messages.create) and OpenAI (Completions.create), sync + async
  • Composes with explicit @trace_llm — auto-instrumentation detects existing spans and skips to avoid double-tracing
  • Idempotent — calling auto_instrument() twice is safe
  • Streaming support deferred to a follow-up

Decorators

@trace_agent

Root span for an agent turn. Nests all downstream tool and LLM calls.

@trace_agent(name="nix")
def handle(message: str) -> str: ...

@trace_tool

Span for any tool call — file ops, API calls, shell commands, A2A delegation.

@trace_tool(name="delegate_to_max", captures_input=True, captures_output=True)
def delegate_to_max(task: str) -> dict: ...

@trace_llm

Span for LLM invocations. Auto-extracts token counts and stop reason from Anthropic, OpenAI, and Google Gemini response shapes.

@trace_llm(provider="anthropic", model="claude-sonnet-4-6", captures_output=True)
def call_claude(messages: list) -> anthropic.Message: ...

Captured automatically:

  • prov.llm.prompt_tokens / prov.llm.completion_tokens / prov.llm.total_tokens
  • prov.llm.stop_reason
  • prov.llm.response_preview (first 512 chars, when captures_output=True)

PROV-O Attributes

Attribute Description
prov.activity.type tool_call, agent_turn, or llm_call
prov.agent.id Agent identifier
prov.agent.model Model name
prov.used Serialized inputs consumed by the activity
prov.wasGeneratedBy Output produced by the activity
prov.wasAssociatedWith Agent responsible for the activity
prov.llm.provider anthropic, openai, or google
prov.llm.prompt_tokens Input token count
prov.llm.completion_tokens Output token count
prov.llm.total_tokens Total tokens
prov.llm.stop_reason Why the model stopped

Full schema: sdk/python/agentweave/schema.py

Proxy — zero-code observability

For agents you can't instrument with decorators (Claude Code, Node.js, any runtime), run the AgentWeave proxy — a transparent HTTP server that sits between your agents and their LLM providers. Works with Claude Code out of the box — just set ANTHROPIC_BASE_URL in ~/.claude/settings.json (setup guide).

pip install "agentweave[proxy]"
agentweave proxy start --port 4000 --endpoint http://localhost:4318 --agent-id my-agent

# Point agents at the proxy — no code changes needed
export ANTHROPIC_BASE_URL=http://localhost:4000
export GOOGLE_GENAI_BASE_URL=http://localhost:4000

One port, all providers. Every LLM call gets a span automatically.

Docker / k8s setup: see deploy/docker/Dockerfile

Backends

AgentWeave emits standard OTLP HTTP — works with any compatible backend:

Backend Endpoint
Grafana Tempo http://tempo:4318 — recommended for self-hosted
Jaeger http://jaeger:4318
Langfuse v3 https://cloud.langfuse.com/api/public/otel
Console (dev) from agentweave import add_console_exporter; add_console_exporter()

Development

git clone https://github.com/arniesaha/agentweave && cd agentweave
pip install -e "./sdk/python[dev]"

pytest sdk/python                                    # 41 Python tests
(cd sdk/js && npm ci && npx jest --verbose)           # 10 TypeScript tests
(cd sdk/go && go test ./... -v)                       # 4 Go tests

License

MIT

Project details


Download files

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

Source Distribution

agentweave_sdk-0.2.0.tar.gz (23.3 kB view details)

Uploaded Source

Built Distribution

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

agentweave_sdk-0.2.0-py3-none-any.whl (21.0 kB view details)

Uploaded Python 3

File details

Details for the file agentweave_sdk-0.2.0.tar.gz.

File metadata

  • Download URL: agentweave_sdk-0.2.0.tar.gz
  • Upload date:
  • Size: 23.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for agentweave_sdk-0.2.0.tar.gz
Algorithm Hash digest
SHA256 8f5620bd1242fbba246bce927ab743d8ebc575c3e9fbcb6c9b1d231a099d26b7
MD5 ca2c64104a0d113bd45f4cd29524914f
BLAKE2b-256 43fedc84f82f7e211b651fadf8751b9d606719e62221f7a540ffca0f19c6a751

See more details on using hashes here.

Provenance

The following attestation bundles were made for agentweave_sdk-0.2.0.tar.gz:

Publisher: publish.yml on arniesaha/agentweave

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

File details

Details for the file agentweave_sdk-0.2.0-py3-none-any.whl.

File metadata

  • Download URL: agentweave_sdk-0.2.0-py3-none-any.whl
  • Upload date:
  • Size: 21.0 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for agentweave_sdk-0.2.0-py3-none-any.whl
Algorithm Hash digest
SHA256 601c3378f35f3cfe7a3d962dfb541bc7ea2876b69675f244663f98c1b3f171d6
MD5 feb6675347195faed1b5804242c987d2
BLAKE2b-256 f43728693eef9b6ef2ed9c7a7fb1fa23ffb81201f14cb1a14c1e214f25f5e57f

See more details on using hashes here.

Provenance

The following attestation bundles were made for agentweave_sdk-0.2.0-py3-none-any.whl:

Publisher: publish.yml on arniesaha/agentweave

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

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page