Integrations
Point any agent framework at Hanzo. One host, one key, two lines — and the exact parameter name for each of sixteen frameworks.
An agent framework is the caller. It is not a service you connect to, so there is nothing to authorize and nothing to register. Every framework here accepts a base URL and a key, which makes pointing one at Hanzo two lines.
The parameter has four spellings — baseURL, base_url, api_base, and a few that take neither. Picking the wrong one is silent: the framework keeps calling whatever host it called before, and the first sign is a bill somewhere else.
The contract
Host. https://api.hanzo.ai. The document declares one server and that is it.
Base URL. https://api.hanzo.ai/v1 for every client that appends /chat/completions to what you hand it, which is all of them but one. The Claude Agent SDK appends /v1/messages itself, so it takes the bare host.
Key. Authorization: Bearer sk-.... A framework's apiKey or api_key parameter sets that header. Tenancy comes from the key — sk- resolves to a user, pk- to an org — so there is no header to add and no id to pass. Where keys come from →
Routes. The OpenAI shape and the Anthropic shape, on the one host:
| Route | Reached by |
|---|---|
POST /v1/chat/completions | where every snippet below lands, but one |
POST /v1/responses | Pydantic AI, the OpenAI Agents SDK, Agno and the Vercel AI SDK, each on a sibling constructor |
POST /v1/messages | the Claude Agent SDK |
POST /v1/embeddings | retrieval, wherever a framework indexes |
Each page below says which one its snippet lands on.
Picking a model
GET /v1/models is the list, and it answers without a credential:
curl -s https://api.hanzo.ai/v1/models | jq -r '.data[].id'Some frameworks want those same facts restated in their own constructor — AutoGen's model_info, LlamaIndex's is_chat_model — and the page says so where it applies.
Tools
Hanzo's own tools are one MCP endpoint — POST https://api.hanzo.ai/v1/mcp, streamable HTTP, the same bearer key. Every framework below reaches it; fifteen own an MCP client, and DSPy converts another SDK's tools into its own. Each page shows the wiring. The tool catalogue →
The frameworks
| Framework | Language | What you set | Where |
|---|---|---|---|
| Agno | Python | base_url | OpenAILike |
| AutoGen | Python | base_url | OpenAIChatCompletionClient |
| Claude Agent SDK | TypeScript, Python | ANTHROPIC_BASE_URL | the environment |
| Cloudflare Agents | TypeScript | baseURL | new OpenAI() |
| CrewAI | Python | base_url | LLM |
| DSPy | Python | api_base | dspy.LM |
| Google ADK | Python | api_base | LiteLlm |
| LangGraph | Python | base_url | ChatOpenAI |
| Letta | any | base URL and key | the /connect flow |
| LlamaIndex | Python | api_base | OpenAILike |
| Mastra | TypeScript | url | the agent's model |
| OpenAI Agents SDK | Python | base_url | AsyncOpenAI |
| Pydantic AI | Python | base_url | OpenAIProvider |
| Semantic Kernel | .NET, Python | endpoint, async_client | AddOpenAIChatCompletion |
| smolagents | Python | api_base | OpenAIModel |
| Vercel AI SDK | TypeScript | baseURL | createOpenAICompatible |
How is this guide?