Agent Runtime for production — LLM-native execution with tools, budget, and trace built in.
Project description
Arcana
Agent Runtime for Production — Budget, tools, trace, and error recovery. Create once, use everywhere.
面向生产环境的 Agent 运行时 — 预算管控、工具权限、全链路追踪、错误诊断。创建一次,处处复用。
Why Arcana
-
Runtime, not framework — Arcana doesn't tell your LLM how to think. It provides budget, tools, trace, and error recovery as managed services. Your agent decides the strategy.
-
Create once, use everywhere —
Runtimeholds provider connections, tool registry, and budget policy. Reuse across requests, workers, and services. -
Production defaults — Every run has budget limits, tool authorization, full trace logging, and structured error diagnosis. No configuration needed.
Quick Start
import arcana
# Create runtime (once, at startup)
runtime = arcana.Runtime(
providers={"deepseek": "sk-xxx"},
budget=arcana.Budget(max_cost_usd=5.0),
trace=True,
)
# Run tasks
result = await runtime.run("Analyze this data")
print(result.output)
print(f"Cost: ${result.cost_usd:.4f}, Steps: {result.steps}")
Add Tools
@arcana.tool(when_to_use="For math calculations")
def calc(expression: str) -> str:
return str(eval(expression))
runtime = arcana.Runtime(
providers={"deepseek": "sk-xxx"},
tools=[calc],
)
result = await runtime.run("What is 15 * 37 + 89?")
# Agent calls calc("15 * 37 + 89") → "644"
Integrate with Your Service
from fastapi import FastAPI
import arcana
import os
app = FastAPI()
runtime = arcana.Runtime(
providers={"deepseek": os.environ["DEEPSEEK_API_KEY"]},
budget=arcana.Budget(max_cost_usd=1.0),
trace=True,
)
@app.post("/agent")
async def agent_endpoint(goal: str):
result = await runtime.run(goal)
return {"answer": result.output, "cost": result.cost_usd}
What You Get for Free
| Capability | Description | Default |
|---|---|---|
| Budget Control | Token and cost limits per run | On |
| Tool Authorization | Tools need explicit capabilities | On |
| Full Trace | Every LLM call and tool invocation logged | Opt-in |
| Error Diagnosis | Structured feedback on failures | On |
| Multi-Provider | DeepSeek, OpenAI, Anthropic, Kimi, GLM, MiniMax, Ollama | Any |
| Native Tool Use | LLM calls tools directly, no wrapper | On |
Three Layers
Layer 1: SDK ← arcana.run() / Runtime.run()
Layer 2: Tool Runtime ← ToolGateway + MCP (coming soon)
Layer 3: Advanced Orchestration ← Graph / Multi-Agent (when needed)
Most users stay on Layer 1. Layer 2 activates when you add tools. Layer 3 is for complex workflows.
Installation
pip install arcana-agent
pip install arcana-agent[anthropic] # + Claude support
pip install arcana-agent[all-providers] # everything
Or from source:
git clone https://github.com/anthropic/arcana.git
cd arcana
uv sync --all-extras
Supported Providers
| Provider | Models | Status |
|---|---|---|
| DeepSeek | DeepSeek-Chat, DeepSeek-Reasoner | Verified |
| OpenAI | GPT-4o, GPT-4o-mini | Verified |
| Anthropic | Claude Opus, Sonnet, Haiku | Verified |
| Kimi (月之暗面) | Moonshot | Supported |
| GLM (智谱) | GLM-4 | Supported |
| MiniMax | abab6.5 | Supported |
| Gemini Pro, Flash | Supported | |
| Ollama | Any local model | Supported |
All cloud providers use the OpenAI-compatible adapter. Adding a new provider is one function call.
The Constitution
"The framework provides capabilities, manages risk, and records execution. The LLM understands goals, forms strategies, and adapts. Never reverse this."
Arcana is governed by a Constitution — four prohibitions (no premature structuring, no controllability theater, no context hoarding, no mechanical retry) and seven design principles. Every design decision answers to this document.
Comparison
| Arcana | LangChain | OpenAI SDK | |
|---|---|---|---|
| Type | Runtime | Framework | SDK |
| Budget control | Built-in | No | No |
| Tool auth/audit | Built-in | No | No |
| Trace logging | Built-in | Paid (LangSmith) | No |
| Error diagnosis | Structured | Retry | No |
| Create once, reuse | Runtime | Per-chain | Per-call |
| LLM decides strategy | Yes | Framework decides | Yes |
Roadmap
- Multi-provider gateway (DeepSeek, OpenAI, Anthropic, + 5 more)
- Budget enforcement and full trace logging
- Structured error diagnosis
- Native tool use with authorization
-
Runtimetop-level API (in progress) - MCP protocol support
- CLI tool —
arcana run agent.yaml - Trace Web UI (local LangSmith alternative)
- Rust core rewrite
Contributing
Before submitting a PR, self-check against the Constitution:
- Does it honor the fast path (direct by default)?
- Does it add to context only what's needed?
- Can the LLM reason about when to use it?
- Does it expand what problems the LLM can solve, not constrain how?
- Does failure produce something the LLM can act on?
- Is it a service the LLM can call, not a step it's forced through?
- Does it improve result quality, not just process visibility?
Full details in CONSTITUTION.md.
git clone https://github.com/anthropic/arcana.git
cd arcana
uv sync --all-extras
uv run ruff check . # Lint
uv run mypy src/ # Type check
uv run pytest # Test
uv run pytest --cov=arcana # Coverage
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 arcana_agent-0.1.0b1.tar.gz.
File metadata
- Download URL: arcana_agent-0.1.0b1.tar.gz
- Upload date:
- Size: 545.2 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.11.0
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
7446a25865680c59da31fc5a1bafa43be2f0d080929088b101104d02e80f7514
|
|
| MD5 |
bae54e1012739872f488619441ab96eb
|
|
| BLAKE2b-256 |
3f4ff37c48e6a2bc1c246a325f3b63f7dbd9ddc86768b5fc20a6aacb945819f9
|
File details
Details for the file arcana_agent-0.1.0b1-py3-none-any.whl.
File metadata
- Download URL: arcana_agent-0.1.0b1-py3-none-any.whl
- Upload date:
- Size: 225.2 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.11.0
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
ec890339260e8519fde79fa0396e71a1a9b5919a56375a4afe6c7d19a303aeb8
|
|
| MD5 |
560b3127d87a7ced5d9180969add0faf
|
|
| BLAKE2b-256 |
af3ac94b5e981b7118276a6508f5905b62d9280f004fae46cd9d400fbe5515ae
|