Integrations
Tool integrations
Celon accepts both the OpenAI and the Anthropic Messages formats, so an existing client works by changing a base URL and a key. Both formats run the same gateway, so routing, savings, guardrails and the audit trail apply identically.
Which endpoint
Most tools use the OpenAI format. Claude Code supports only the Anthropic Messages format, so it gets a dedicated endpoint and connects without a proxy.
| Format | Endpoint | Auth header | Tools |
|---|---|---|---|
| OpenAI | https://api.celon.ai/v1 | Authorization: Bearer | Cursor, OpenClaw, Hermes, AI SDK, OpenAI SDK |
| Anthropic Messages | https://api.celon.ai | x-api-key | Claude Code, Anthropic SDK |
Setup via agent
Most of the tools below are agents. Rather than editing config by hand, paste the following prompt — the agent works out its own format and config location.
Set up Celon as this tool's model provider.
- OpenAI-compatible endpoint: https://api.celon.ai/v1
- Anthropic Messages endpoint: https://api.celon.ai (for tools that only speak
the Anthropic format, like Claude Code)
- API key: sk-celon-... ← replace with my key
- Model: celon/code for a coding tool, celon/auto for a general one
- If the tool takes a separate background/summary model: celon/floor
Work out whether this tool speaks the OpenAI or the Anthropic format, then edit
the right config file or env vars. When you're done, send one short request to
confirm it works.Claude Code
Claude Code pins claude-* model names internally, so set ANTHROPIC_MODEL to route through Celon. Without it the model you named is served as-is, bypassing the router.
export ANTHROPIC_BASE_URL="https://api.celon.ai"
export ANTHROPIC_API_KEY="sk-celon-..."
# Coding work — hard code to the frontier, lighter code to strong cheap coders
export ANTHROPIC_MODEL="celon/code"
# Background work (summaries, titles) — cheapest quality-vetted model
export ANTHROPIC_SMALL_FAST_MODEL="celon/floor"ANTHROPIC_SMALL_FAST_MODEL is the model Claude Code uses for background work like summaries and titles. Pointing it at celon/floor serves that work from the cheapest quality-vetted model.
claude
> /statusCursor
Settings → Models: add an OpenAI-compatible provider with an override base URL.
Base URL: https://api.celon.ai/v1
API Key: sk-celon-...
Model: celon/codeOpenClaw
Add a provider with api: "openai-completions". The model must also be allowlisted under agents.defaults.models as provider-name/model-id. Celon model ids already contain a slash, so the entry reads celon/celon/auto.
{
"models": {
"providers": {
"celon": {
"baseUrl": "https://api.celon.ai/v1",
"apiKey": "sk-celon-...",
"api": "openai-completions",
"models": [
{ "id": "celon/auto", "name": "Celon Auto", "contextWindow": 1000000, "maxTokens": 8192 }
]
}
}
},
"agents": { "defaults": { "models": ["celon/celon/auto"] } }
}Hermes
Hermes supports any OpenAI-compatible endpoint. After connecting, select the model with hermes model.
export OPENAI_BASE_URL="https://api.celon.ai/v1"
export OPENAI_API_KEY="sk-celon-..."
hermes model # pick celon/autoVercel AI SDK
Use createOpenAI with a baseURL. Streaming and tool calling work unchanged.
import { createOpenAI } from "@ai-sdk/openai";
import { generateText } from "ai";
const celon = createOpenAI({
baseURL: "https://api.celon.ai/v1",
apiKey: process.env.CELON_API_KEY,
});
const { text } = await generateText({
model: celon("celon/auto"),
prompt: "Summarize this quarter's metrics",
});OpenAI SDK
The same two-line change covered in the quick start.
const client = new OpenAI({
- baseURL: "https://api.openai.com/v1",
- apiKey: process.env.OPENAI_API_KEY,
+ baseURL: "https://api.celon.ai/v1", // ← Celon gateway
+ apiKey: process.env.CELON_API_KEY, // ← sk-celon-…
});Anthropic Messages directly
For clients implemented directly against the Messages format. Routing options are identical to the OpenAI endpoint — see Smart routing.
curl https://api.celon.ai/v1/messages \
-H "x-api-key: $CELON_API_KEY" \
-H "anthropic-version: 2023-06-01" \
-H "content-type: application/json" \
-d '{
"model": "celon/auto",
"max_tokens": 1024,
"messages": [{ "role": "user", "content": "Hello" }]
}'Unsupported fields
These three fields are ignored when present. Accepting a value that is never applied would misrepresent what the endpoint does, so it is stated here instead.
| Field | Why |
|---|---|
thinking | The gateway's internal response shape has no field for reasoning content, so an upstream trace cannot be carried back even when the model produces one. Thinking blocks in your history are accepted and ignored. |
cache_control | There is no path to carry prompt-cache markers upstream, and a request may route to a model that is not Anthropic's. |
top_k | No counterpart in the OpenAI-shaped pipeline the request runs through. |
POST /v1/messages/count_tokens returns an estimate. It is computed before the request resolves to a model, so there is no single tokenizer to be exact against.