First call
This page shows minimal runnable examples for streaming, multimodal, tool use, and native Claude / Gemini formats.
Setup
bash
export PRIMEROUTER_KEY="sk-your-key"
export PRIMEROUTER_BASE="https://primerouter.ai/v1"Streaming (SSE)
bash
curl "$PRIMEROUTER_BASE/chat/completions" \
-H "Authorization: Bearer $PRIMEROUTER_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "deepseek-chat",
"stream": true,
"messages": [{"role": "user", "content": "Write a short haiku"}]
}'Each chunk looks like:
data: {"id":"...","choices":[{"delta":{"content":"An"},"index":0}]}
data: {"id":"...","choices":[{"delta":{"content":" old"},"index":0}]}
...
data: [DONE]Setting stream_options.include_usage = true makes the final chunk carry the usage field.
Multimodal (image)
bash
curl "$PRIMEROUTER_BASE/chat/completions" \
-H "Authorization: Bearer $PRIMEROUTER_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "qwen-max",
"messages": [{
"role": "user",
"content": [
{"type": "text", "text": "What's in this image?"},
{"type": "image_url", "image_url": {"url": "https://example.com/cat.jpg"}}
]
}]
}'Base64 also works: "url": "data:image/png;base64,...".
Tool use (function calling)
json
{
"model": "glm-4-plus",
"messages": [{"role": "user", "content": "Weather in Tokyo today"}],
"tools": [{
"type": "function",
"function": {
"name": "get_weather",
"description": "Look up weather for a city",
"parameters": {
"type": "object",
"properties": {"city": {"type": "string"}},
"required": ["city"]
}
}
}]
}The model returns tool_calls; handle per the standard OpenAI flow.
Native Claude format
Use the /v1/messages endpoint:
bash
curl "$PRIMEROUTER_BASE/messages" \
-H "x-api-key: $PRIMEROUTER_KEY" \
-H "anthropic-version: 2023-06-01" \
-H "Content-Type: application/json" \
-d '{
"model": "glm-4-plus",
"max_tokens": 1024,
"messages": [{"role": "user", "content": "Hello"}]
}'The official Claude SDK works by simply pointing base_url at https://primerouter.ai.
Python (OpenAI SDK)
python
from openai import OpenAI
client = OpenAI(
api_key="sk-your-key",
base_url="https://primerouter.ai/v1",
)
resp = client.chat.completions.create(
model="deepseek-chat",
messages=[{"role": "user", "content": "Hello"}],
)
print(resp.choices[0].message.content)
print(resp.usage)TypeScript (OpenAI SDK)
ts
import OpenAI from 'openai'
const client = new OpenAI({
apiKey: process.env.PRIMEROUTER_KEY,
baseURL: 'https://primerouter.ai/v1',
})
const resp = await client.chat.completions.create({
model: 'deepseek-chat',
messages: [{ role: 'user', content: 'Hello' }],
})
console.log(resp.choices[0].message.content)