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.0a16
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.
Release files for dendrux 0.2.0a16
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.0a16.tar.gz | 1.5 MB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| dendrux-0.2.0a16-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 3.1 MB
Release files / dendrux-0.2.0a16.tar.gz
| Download URL | dendrux-0.2.0a16.tar.gz |
|---|---|
| Size | 1.5 MB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
b05c1a71056d8cfdab15050d574a565253c6b88a550d791166f1fb5ab3c99cc1
|
|
BLAKE2b-256 checksum How to use checksums |
1bf4d56367fa2e29df8e184fcef3b2146b5393ef46821655c0f35927f4a89d51
|
| 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.0a16-py3-none-any.whl
| Download URL | dendrux-0.2.0a16-py3-none-any.whl |
|---|---|
| Size | 1.6 MB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
de944ecc5f912fe0fe4f81ecb100ccc5d47845aa0867cf1db89756c8378cd085
|
|
BLAKE2b-256 checksum How to use checksums |
1c0165ddce696dd90acdc7c3f39fb2a8ef7338bb7a8d2864a423cc7f1200905e
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.12.12
|