Skip to main content

Your complete Agent Ecosystem

Project description

agenx

Observability and tracing for AI agents, LLM chains, and workflows. Trace every step of your AI pipeline — LLM calls, tool use, retrieval, guardrails — with zero boilerplate.

Installation

pip install agenx

With LangChain support:

pip install agenx[langchain]

All optional dependencies:

pip install agenx[all]

Requires Python 3.11+.

Quick start

Decorators

The fastest way to add tracing. Decorate your functions and agenx handles span creation, timing, and parent-child relationships automatically.

from agenx import Tracer, StdoutExporter

tracer = Tracer()
tracer.configure(exporters=[StdoutExporter()])

@tracer.llm(model="gpt-4", provider="openai", temperature=0.7)
def chat(prompt: str) -> str:
    return call_openai(prompt)

@tracer.tool(tool_name="web_search")
def search(query: str) -> list:
    return fetch_results(query)

@tracer.agent(tools=["search", "chat"])
def assistant(question: str) -> str:
    docs = search(question)
    return chat(f"Answer using: {docs}")

assistant("What is quantum computing?")

Context managers

For manual control over span attributes and events:

from agenx import trace, SpanType

with trace.span("pipeline") as root:
    root.step.input = {"user_id": 12}

    with trace.span("search", type=SpanType.RETRIEVER) as r:
        r.retriever.query = "reset password"
        r.retriever.returned = 5
        r.add_event("cache_hit", {"key": "search_abc"})

    with trace.span("generate", type=SpanType.LLM) as llm:
        llm.llm.model = "gpt-4o"
        llm.llm.tokens_total = 843

    root.step.output = {"answer": "Click forgot password on the login page"}

trace is a pre-configured Tracer instance with StdoutExporter enabled.

Span types

Each decorator creates a span with type-specific attributes:

Decorator Span type Key attributes
@tracer.step STEP input, output, metadata
@tracer.llm LLM model, provider, temperature, tokens_*, prompt, output
@tracer.agent AGENT tools, iterations, input, output
@tracer.tool TOOL tool_name, input, output
@tracer.retriever RETRIEVER query, top_k, returned, documents
@tracer.guard GUARD guard_name, passed, reason

Decorator options

All decorators accept:

  • name — Custom span name (defaults to function name)
  • capture_args — Record function arguments (default: True)
  • capture_result — Record return value (default: True)
# Disable capture for sensitive operations
@tracer.step(capture_args=False, capture_result=False)
def handle_credentials(api_key: str) -> dict:
    ...

Type-specific options:

@tracer.llm(model="claude-sonnet-4-6", provider="anthropic", temperature=0.3)
@tracer.agent(tools=["search", "calculator"])
@tracer.tool(tool_name="math_calculator")
@tracer.retriever(top_k=10)
@tracer.guard(guard_name="content_safety_filter")

Async support

All decorators work with both sync and async functions:

@tracer.llm(model="claude-sonnet-4-6", provider="anthropic")
async def generate(prompt: str) -> str:
    return await async_llm_call(prompt)

Async context managers are also supported:

async with tracer.aspan("async_pipeline") as span:
    span.step.input = {"query": "hello"}

Exporters

StdoutExporter

Built-in colored terminal output with hierarchy and timing:

from agenx import StdoutExporter

exporter = StdoutExporter(
    indent=True,           # Show parent-child hierarchy
    show_ids=True,         # Display trace/span IDs
    min_duration_ms=0.0,   # Filter by minimum duration
)

Custom exporters

Any callable that accepts a Span works as an exporter:

def my_exporter(span):
    print(f"{span.name} took {span.to_dict().get('duration_ms', 0):.1f}ms")

tracer = Tracer()
tracer.configure(exporters=[StdoutExporter(), my_exporter])

Automatic nesting

Spans nest automatically via context. No manual ID passing needed:

@tracer.agent(name="qa_agent")
def qa_pipeline(question: str) -> str:
    docs = retrieve(question)       # child span
    answer = generate(question, docs)  # child span
    return answer

@tracer.retriever(top_k=5)
def retrieve(query: str) -> list:
    ...

@tracer.llm(model="gpt-4")
def generate(query: str, context: list) -> str:
    ...

Calling qa_pipeline produces a trace tree:

qa_agent
  ├── retrieve
  └── generate

LangChain integration

Auto-instrument LangChain and LangGraph with a single call:

from agenx import instrument

instrument("langchain")

This patches chains, LLM calls, agents, and tools. To instrument all detected frameworks:

from agenx import instrument_all

instrument_all()

To remove instrumentation:

from agenx import uninstrument, uninstrument_all

uninstrument("langchain")
# or
uninstrument_all()

Events

Record point-in-time events within a span:

with trace.span("search", type=SpanType.RETRIEVER) as r:
    r.add_event("cache_hit", {"key": "search_abc"})
    r.add_event("reranking_complete", {"top_k": 5})

API reference

Exports from agenx

Name Description
trace Pre-configured Tracer with StdoutExporter
Tracer Core tracer class
StdoutExporter Terminal exporter
SpanType Enum: ROOT, STEP, LLM, RETRIEVER, TOOL, GUARD, AGENT
instrument(name) Enable instrumentation for a framework
uninstrument(name) Disable instrumentation
instrument_all() Auto-detect and instrument all available frameworks
uninstrument_all() Disable all instrumentation

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

agenx-0.1.1.tar.gz (22.1 kB view details)

Uploaded Source

Built Distribution

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

agenx-0.1.1-py3-none-any.whl (22.2 kB view details)

Uploaded Python 3

File details

Details for the file agenx-0.1.1.tar.gz.

File metadata

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

File hashes

Hashes for agenx-0.1.1.tar.gz
Algorithm Hash digest
SHA256 494bba960ea914b4f4f1f0f360379fad1cd4794143c8906088d8369a05cc72f3
MD5 18bbef10234935d43a9ac9648f5fe907
BLAKE2b-256 d1708c1f9c3e54f72eeeaffa019b63ed0affec205008d2f6d0c9597409fdbf9d

See more details on using hashes here.

Provenance

The following attestation bundles were made for agenx-0.1.1.tar.gz:

Publisher: publish-to-pypi.yml on agenx-org/agenx

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

File details

Details for the file agenx-0.1.1-py3-none-any.whl.

File metadata

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

File hashes

Hashes for agenx-0.1.1-py3-none-any.whl
Algorithm Hash digest
SHA256 3d25d24af4d194678339ef048b7864fb111a1da6676b274f4a2aa9629fbca44b
MD5 ee0d149e6866a2d99a0849137be9d137
BLAKE2b-256 2f21adf5709d0fd9d59383e435649ec0eb71129ae8fdf8229f0b29ca4d2f2c2f

See more details on using hashes here.

Provenance

The following attestation bundles were made for agenx-0.1.1-py3-none-any.whl:

Publisher: publish-to-pypi.yml on agenx-org/agenx

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