Skip to content

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)

Next

Built for transparent, auditable, crypto-native AI inference. About · Terms · Privacy