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
Release history Release notifications | RSS feed
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
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
494bba960ea914b4f4f1f0f360379fad1cd4794143c8906088d8369a05cc72f3
|
|
| MD5 |
18bbef10234935d43a9ac9648f5fe907
|
|
| BLAKE2b-256 |
d1708c1f9c3e54f72eeeaffa019b63ed0affec205008d2f6d0c9597409fdbf9d
|
Provenance
The following attestation bundles were made for agenx-0.1.1.tar.gz:
Publisher:
publish-to-pypi.yml on agenx-org/agenx
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
agenx-0.1.1.tar.gz -
Subject digest:
494bba960ea914b4f4f1f0f360379fad1cd4794143c8906088d8369a05cc72f3 - Sigstore transparency entry: 1200951435
- Sigstore integration time:
-
Permalink:
agenx-org/agenx@1c011c02836d68cd00fbcb77088837196336403c -
Branch / Tag:
refs/tags/v0.1.1 - Owner: https://github.com/agenx-org
-
Access:
private
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish-to-pypi.yml@1c011c02836d68cd00fbcb77088837196336403c -
Trigger Event:
push
-
Statement type:
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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
3d25d24af4d194678339ef048b7864fb111a1da6676b274f4a2aa9629fbca44b
|
|
| MD5 |
ee0d149e6866a2d99a0849137be9d137
|
|
| BLAKE2b-256 |
2f21adf5709d0fd9d59383e435649ec0eb71129ae8fdf8229f0b29ca4d2f2c2f
|
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
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
agenx-0.1.1-py3-none-any.whl -
Subject digest:
3d25d24af4d194678339ef048b7864fb111a1da6676b274f4a2aa9629fbca44b - Sigstore transparency entry: 1200951458
- Sigstore integration time:
-
Permalink:
agenx-org/agenx@1c011c02836d68cd00fbcb77088837196336403c -
Branch / Tag:
refs/tags/v0.1.1 - Owner: https://github.com/agenx-org
-
Access:
private
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish-to-pypi.yml@1c011c02836d68cd00fbcb77088837196336403c -
Trigger Event:
push
-
Statement type: