Padwan AI
Lightweight async client for OpenAI, Gemini, Mistral, Grok, Anthropic, TypeSafe (JEV, experimental), and any OpenAI-compatible API.
One runtime dependency (niquests), TypedDict everywhere, HTTP/2 and HTTP/3 out of the box.
Documentation · PyPI · Changelog
Install
pip install padwan-ai
Extras: [realtime] for voice sessions, [otel] for OpenTelemetry, [langfuse] for the Langfuse adapter.
Quickstart
from padwan_ai import LLMClient
async with LLMClient(model="gpt-5.5") as client:
response, usage = await client.complete_chat(
[{"role": "user", "content": "Hello!"}]
)
print(response["content"])
The provider is picked from the model name; only the matching *_API_KEY env var is needed.
Streaming
from padwan_ai import ConversationState, LLMClient
state = ConversationState(system="You are a concise assistant.")
state.add_user_message("What's Python?")
async with LLMClient(model="gemini-3.5-flash") as client:
chunks: list[str] = []
async for text in client.stream_chat(state.messages):
print(text, end="", flush=True)
chunks.append(text)
state.add_assistant_message("".join(chunks))
Agent with tools
AgentSession runs the tool loop: call the model, dispatch tool calls, feed results back, repeat until a final answer. Tools come from typed Python functions or from MCP servers.
from padwan_ai import AgentSession, LLMClient, McpStdio
from padwan_ai.tools import tool
@tool
async def add(a: int, b: int) -> int:
"""Add two integers."""
return a + b
async with AgentSession(
client=LLMClient(model="claude-sonnet-5"),
mcp_tools=[add, McpStdio(command="uvx", args=["my-mcp-server"])],
system="Use tools when helpful.",
) as session:
print(await session.send("What is 2 + 3, and what's the weather in Paris?"))
Typed final answers (AgentOutput), approval hooks, parallel tool execution and snapshot persistence are covered in the agents guide.
One-shot from the shell
uvx padwan-ai "Hello!" -m gpt-5.4-mini
For an interactive chat TUI use padwan-cli.
Providers
| Provider | Chat + streaming | Batch | Realtime voice | Embeddings |
|---|---|---|---|---|
| OpenAI | ✅ | ✅ | ✅ | ✅ |
| Gemini | ✅ | ✅ | ✅ | ✅ |
| Anthropic | ✅ | ❌ | ➖ | ➖ |
| Mistral | ✅ | ❌ | ❌ | ✅ |
| Grok | ✅ | ✅ | ✅ | ➖ |
| Voyage AI | ➖ | ➖ | ➖ | ✅ |
OpenAI-compatible (base_url=) |
✅ | depends on the server | depends on the server |
❌ = the provider offers it, not implemented yet. ➖ = the provider has no such API.
Thinking tokens stream separately through an on_thought callback on every client that exposes them. Per-provider details, multimodal input (images, audio, files) and embeddings: docs/clients, docs/multimodal.md.
TypeSafe (JEV, experimental) structured evaluations (Noul, Choice, Score questions) use the standalone TypeSafeClient.
More
- MCP: streamable-HTTP and stdio transports, usable standalone or inside an agent. docs/mcp.md
- Realtime voice:
RealtimeClientspeech-to-speech over WebSocket for OpenAI, Gemini Live and Grok Voice. docs/clients/openai.md - Observability: opt-in OpenTelemetry GenAI spans and metrics with
otel.instrument(), or a one-call Langfuse adapter. Ships a Grafana dashboard. docs/observability.md - Gateway mode: route every model through one OpenAI-compatible endpoint with
PADWAN_BASE_URLandPADWAN_API_KEY. docs/clients/openai-compatible.md - Testing agents:
padwan_ai.testing.ScriptedClientreplays scripted responses, no API key needed. docs/agents.md
Development
uv sync --all-extras --all-groups
just ci # ruff + pyright + pytest
just e2e # live provider tests, keys from .env (see env.template)
just docs # serve the docs site locally
Release files for padwan-ai 0.12.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| padwan_ai-0.12.1.tar.gz | 103.0 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| padwan_ai-0.12.1-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 231.7 kB
Release files / padwan_ai-0.12.1.tar.gz
| Download URL | padwan_ai-0.12.1.tar.gz |
|---|---|
| Size | 103.0 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
ab6d056c6d047c5a3b75a2c7ced1803c00a634a793e1cd13dbc2a182cdb88f96
|
|
BLAKE2b-256 checksum How to use checksums |
9158b339920ea2e9583c570f98b327e0e8b75d4a696e26abcf039326734dfbf9
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.12.17 {"installer":{"name":"uv","version":"0.12.17","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Release files / padwan_ai-0.12.1-py3-none-any.whl
| Download URL | padwan_ai-0.12.1-py3-none-any.whl |
|---|---|
| Size | 128.7 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
6195f60c49db6da6132b96c04fcfe3f050e876952958edc783c0152dba2b9264
|
|
BLAKE2b-256 checksum How to use checksums |
ecf5c9d76245b36b8ab7b7e181648dec0d2903724073e8758f57ee1802d305a3
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.12.17 {"installer":{"name":"uv","version":"0.12.17","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|