Simple, performant, battle-tested framework for building reliable AI applications
Project description
Timbal
Simple, performant, battle-tested framework for building reliable AI applications.
Timbal gives you Agents (autonomous reasoning) and Workflows (explicit pipelines) behind one interface. No hidden magic: async functions, Pydantic validation, and event-driven streaming. If you know async/await, you already know how it works.
Documentation: docs.timbal.ai
Quickstart
pip install timbal
import asyncio
from timbal import Agent
from timbal.tools import WebSearch
agent = Agent(
name="assistant",
model="anthropic/claude-sonnet-4-6",
tools=[WebSearch()],
max_tokens=1024,
)
async def main():
result = await agent(prompt="What's new in AI this week?").collect()
print(result.output)
asyncio.run(main())
Set ANTHROPIC_API_KEY (or the key for your chosen provider) in a .env file or your environment.
Workflows use the same interface:
import asyncio
import httpx
from timbal import Workflow
from timbal.state import get_run_context
async def fetch(url: str) -> str:
async with httpx.AsyncClient(follow_redirects=True) as client:
return (await client.get(url)).text
workflow = (
Workflow(name="scraper")
.step(fetch)
.step(
lambda content: len(content),
content=lambda: get_run_context().step_span("fetch").output,
)
)
async def main():
result = await workflow.collect(url="https://timbal.ai")
print(result.output)
asyncio.run(main())
See the Quickstart for the full app flow (timbal create → timbal start).
Why Timbal
The most performant agent framework. In overhead benchmarks against LangGraph, CrewAI, the OpenAI Agents SDK, PydanticAI, and Agno (observability on both sides, faked LLMs), Timbal runs agent loops several times faster with a fraction of the memory. See Benchmarks.
Small and hackable. The core framework is under 10k lines. Easy to read, modify, and fork. Other frameworks are bloated with legacy, indirection, and abstraction.
One interface. Agents, Workflows, and Tools share the same calling convention and event stream. Compose them freely.
Human in the loop. Approval gates and suspend() pause any run for a human, persist state, and resume across process restarts. Works on agents, workflow steps, and tools.
Provider-agnostic. Swap models by changing a string (anthropic/claude-sonnet-4-6 → openai/gpt-5.5). Built-in FallbackModel chains providers for automatic failover.
Features
| Memory & compaction | Persistent context with strategies to stay under the context window |
| Tools & MCP | Built-in tool library, your own functions, any MCP server |
| Structured output | Typed Pydantic models instead of raw text |
| Skills | Reusable tool packages the agent loads on demand |
| Tracing | Full span traces, exportable over OTLP |
| Evals | Declarative YAML evaluation suite with built-in validators |
| Deployment | Run locally with timbal start, ship to the platform or self-host |
Install extras as needed:
pip install 'timbal[server]' # HTTP serving
pip install 'timbal[documents]' # PDF, Excel, Word
pip install 'timbal[evals]' # evals CLI
pip install 'timbal[all]' # everything
Benchmarks
Pure framework-overhead benchmarks: trivial handlers, faked LLM calls, observability on both sides.
| Metric (single tool call) | Timbal | LangGraph + LangSmith | CrewAI |
|---|---|---|---|
| p50 latency | 1.1 ms | 5.2 ms | 3.2 ms |
| memory / run | 2.2 KB | 110 KB | 10 KB |
| throughput @ c=10 | 1716/s | 224/s | 31/s |
Reproduce with benchmarks/README.md. Full suite covers LangGraph, CrewAI, Agno, PydanticAI, OpenAI Agents SDK, and Google ADK.
Full app
The CLI scaffolds and runs a complete application (UI + API + workforce of Python agents/workflows):
timbal create my-project
cd my-project
timbal start
Deploy by connecting the repo to the Timbal Platform, or self-host the components yourself. See deployment docs.
Development
git clone https://github.com/timbal-ai/timbal.git
cd timbal
uv sync --dev
uv run pytest
Contributor reference: CLAUDE.md, benchmarks/README.md.
Documentation
Contributing
Pull requests and issues welcome.
License
Apache 2.0. See LICENSE.
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 timbal-2.1.6.tar.gz.
File metadata
- Download URL: timbal-2.1.6.tar.gz
- Upload date:
- Size: 440.6 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.10.4 {"installer":{"name":"uv","version":"0.10.4","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
48546be8f9833767f2500e0a4e2d6c534134c5d9807eb62c1d222bfd6e9b580b
|
|
| MD5 |
d2025632a93e001ca72ed8aac895e68d
|
|
| BLAKE2b-256 |
1810b755bdb3abac050c74d823b2c93b28dc2ca6a251e563cdfe1c2296fa5a58
|
File details
Details for the file timbal-2.1.6-py3-none-any.whl.
File metadata
- Download URL: timbal-2.1.6-py3-none-any.whl
- Upload date:
- Size: 555.9 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.10.4 {"installer":{"name":"uv","version":"0.10.4","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
aa9a52c510f53b505812c0b30e9d9b35be2aec3ef3f9ddb153ccff1ba6361059
|
|
| MD5 |
aea73f64bc5affb9917bfce001fe582a
|
|
| BLAKE2b-256 |
232a7465bb4bcd98437da5ec74fbec6e66a847b7535b6119ca1026947f9373da
|