This release is a pre-release and may not be stable for production use.
dendrux
Python SDK for Dendrux — the framework for building agents with tools, persistence, and observability.
Version: 0.2.0a19
Install
pip install "dendrux[all]" # Everything
pip install "dendrux[anthropic]" # Anthropic + core runtime
pip install "dendrux[openai]" # OpenAI + core runtime
pip install "dendrux[mcp]" # Managed MCP client runtime
Quick Example
import asyncio
from dendrux import Agent, tool
from dendrux.llm.anthropic import AnthropicProvider
@tool()
async def add(a: int, b: int) -> int:
"""Add two numbers."""
return a + b
async def main():
async with Agent(
provider=AnthropicProvider(model="claude-sonnet-4-6"),
prompt="You are a calculator.",
tools=[add],
) as agent:
result = await agent.run("What is 15 + 27?")
print(result.answer)
asyncio.run(main())
Managed MCP client
MCPRuntime is the application-scoped owner of process-local MCP connections.
Bind cheaply for each request, hand an explicit tool view to an ephemeral
Agent, and close the runtime once during application shutdown:
from dendrux import Agent
from dendrux.mcp import MCPRuntime, MCPSource
runtime = MCPRuntime(max_connections=100, max_in_flight_calls=100)
connection = runtime.bind(
tenant_key=current_user.id,
connection_key=github_connection.id,
source=MCPSource.http("github", github_connection.server_url),
credentials=credential_provider,
)
agent = Agent(
provider=provider,
prompt="Help with this repository.",
tool_sources=[connection.tools(allowed_tools=["search_code", "create_issue"])],
)
try:
result = await agent.run(user_message)
finally:
await agent.close() # Releases this Agent's lease.
# Once, during application shutdown:
await runtime.close()
Dendrux is the MCP client. The vendor, your platform, or a subprocess you configure hosts the MCP server. See the MCP architecture guide and multi-user example. To test a real hosted server, run the read-only GitHub example.
Providers
| Provider | Import | Use case |
|---|---|---|
| Anthropic | from dendrux.llm.anthropic import AnthropicProvider |
Claude models |
| OpenAI | from dendrux.llm.openai import OpenAIProvider |
GPT models + vLLM, SGLang, Groq, Ollama |
| OpenAI Responses | from dendrux.llm.openai_responses import OpenAIResponsesProvider |
GPT + built-in tools (web search) |
| Mock | from dendrux.llm.mock import MockLLM |
Deterministic testing |
API Quick Reference
from pathlib import Path
from dendrux.observers.console import ConsoleObserver
async with Agent(
provider=provider, # Required: LLM provider
prompt="...", # Required: system prompt
tools=[add], # Optional: tool functions
database_url=f"sqlite+aiosqlite:///{Path.home() / '.dendrux' / 'dendrux.db'}",
redact=my_scrubber, # Optional: scrub persisted strings
) as agent:
result = await agent.run(
"What is 15 + 27?",
observer=ConsoleObserver(), # Optional: terminal output
tenant_id="org-123", # Optional: multi-tenant isolation
metadata={"thread": "t1"}, # Optional: your linking data
)
RunResult
result.answer # str | None — the agent's final answer
result.status # RunStatus — SUCCESS, ERROR, MAX_ITERATIONS, WAITING_CLIENT_TOOL, CANCELLED
result.steps # list[AgentStep] — full reasoning chain
result.iteration_count # int — how many loop iterations ran
result.usage # UsageStats — input_tokens, output_tokens, total_tokens
result.run_id # str — unique run identifier (ULID)
result.error # str | None — error message if status is ERROR
Tool Options
@tool() # Basic server tool
@tool(target="client") # Client-side — agent pauses
@tool(max_calls_per_run=3) # Limit calls per run
@tool(timeout_seconds=120) # Custom timeout (default 120s)
@tool(parallel=False) # Run alone, not concurrently
Full Documentation
See the full documentation on GitHub for provider setup, configuration, database guide, CLI, dashboard, observer system, and examples.
Metadata
Release files for dendrux 0.2.0a19
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| dendrux-0.2.0a19.tar.gz | 1.6 MB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| dendrux-0.2.0a19-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 3.2 MB
Release files / dendrux-0.2.0a19.tar.gz
| Download URL | dendrux-0.2.0a19.tar.gz |
|---|---|
| Size | 1.6 MB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
c2880591d3676b1188c72aff3b65232c9f263baff5afc2ce3a915b050803320c
|
|
BLAKE2b-256 checksum How to use checksums |
8e07c2205b8838db73007de9f903d33165c71caf21bd9987709c83ebf3fd3083
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.12.12
|
Release files / dendrux-0.2.0a19-py3-none-any.whl
| Download URL | dendrux-0.2.0a19-py3-none-any.whl |
|---|---|
| Size | 1.6 MB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
d586f1afec411ae3ddf7398eb24c868981701320c03f5b95b94716ca35bda798
|
|
BLAKE2b-256 checksum How to use checksums |
c54a1e461a19076ee9eec8e05da587e532c9256514b4cb10059847f78f96faf9
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.12.12
|