SDK và curl
Ví dụ chạy được cho Python, Node.js và curl, theo cả giao thức OpenAI lẫn Claude.
Đã kiểm tra với OpenAI Python SDK 3.41.0 và Anthropic Python SDK 2.3.0 (tài liệu tại platform.claude.com và mô tả gói trên PyPI), ngày 31/10/2026. Các ví dụ Node.js chưa được đối chiếu với tài liệu của phiên bản hiện tại (openai 7.45.1 trên npm).
Mọi SDK hoạt động chỉ cần đổi hai thứ: base URL và API key. Trong các ví dụ, hãy thay YOUR-DOMAIN bằng địa chỉ của trang này (xem Bắt đầu nhanh), sk-YOUR-KEY bằng key của bạn và MODEL-ID bằng một tên trong /v1/models.
Hai giao thức dùng hai base URL khác nhau:
| Giao thức | SDK | Base URL | Endpoint |
|---|---|---|---|
| OpenAI | OpenAI SDK | https://YOUR-DOMAIN/v1 |
/v1/chat/completions, /v1/responses, /v1/embeddings |
| Claude | Anthropic SDK | https://YOUR-DOMAIN |
/v1/messages |
Router tự chuyển đổi định dạng, nên cùng một model gọi được qua cả hai giao thức.
Python với OpenAI SDK
pip install openai
from openai import OpenAI
client = OpenAI(
base_url="https://YOUR-DOMAIN/v1",
api_key="sk-YOUR-KEY",
)
response = client.chat.completions.create(
model="MODEL-ID",
messages=[{"role": "user", "content": "Xin chào"}],
)
print(response.choices[0].message.content)
Terminal chạy script Python dùng OpenAI SDK, in ra câu trả lời của model
Streaming
Thêm stream=True và đọc từng chunk:
stream = client.chat.completions.create(
model="MODEL-ID",
messages=[{"role": "user", "content": "Đếm từ 1 đến 5"}],
stream=True,
)
for chunk in stream:
if chunk.choices and chunk.choices[0].delta.content:
print(chunk.choices[0].delta.content, end="", flush=True)
print()
Terminal in câu trả lời từng phần khi chạy script streaming
Với curl, thêm "stream": true và cờ -N để curl không giữ đệm đầu ra:
curl -N https://YOUR-DOMAIN/v1/chat/completions \
-H "Authorization: Bearer sk-YOUR-KEY" \
-H "Content-Type: application/json" \
-d '{"model":"MODEL-ID","stream":true,"messages":[{"role":"user","content":"Đếm từ 1 đến 5"}]}'
Phản hồi là các dòng data: {...} (Server-Sent Events) và kết thúc bằng data: [DONE].
Node.js với OpenAI SDK
npm install openai
import OpenAI from "openai";
const client = new OpenAI({
baseURL: "https://YOUR-DOMAIN/v1",
apiKey: process.env.DEROUTER_API_KEY,
});
const stream = await client.chat.completions.create({
model: "MODEL-ID",
messages: [{ role: "user", content: "Xin chào" }],
stream: true,
});
for await (const chunk of stream) {
process.stdout.write(chunk.choices[0]?.delta?.content ?? "");
}
Python với Anthropic SDK
pip install anthropic
Anthropic SDK tự thêm /v1/messages vào base URL, nên dùng địa chỉ không có /v1. Bạn cũng có thể đặt biến môi trường ANTHROPIC_BASE_URL thay cho tham số base_url. SDK gửi key trong header x-api-key, router nhận header này.
import anthropic
client = anthropic.Anthropic(
base_url="https://YOUR-DOMAIN",
api_key="sk-YOUR-KEY",
)
message = client.messages.create(
model="MODEL-ID",
max_tokens=1024,
messages=[{"role": "user", "content": "Xin chào"}],
)
print(message.content[0].text)
Streaming với Anthropic SDK:
with client.messages.stream(
model="MODEL-ID",
max_tokens=1024,
messages=[{"role": "user", "content": "Đếm từ 1 đến 5"}],
) as stream:
for text in stream.text_stream:
print(text, end="", flush=True)
print()
curl theo giao thức Claude
curl https://YOUR-DOMAIN/v1/messages \
-H "x-api-key: sk-YOUR-KEY" \
-H "anthropic-version: 2023-06-01" \
-H "Content-Type: application/json" \
-d '{"model":"MODEL-ID","max_tokens":256,"messages":[{"role":"user","content":"Xin chào"}]}'
Embeddings
curl https://YOUR-DOMAIN/v1/embeddings \
-H "Authorization: Bearer sk-YOUR-KEY" \
-H "Content-Type: application/json" \
-d '{"model":"EMBEDDING-MODEL-ID","input":"văn bản cần mã hóa"}'
Model embedding chỉ dùng được nếu tài khoản của bạn có model loại này. Xem Model và combo để biết cách kiểm tra.
Lưu ý
- Đặt key trong biến môi trường, không ghi thẳng vào mã nguồn.
- Lỗi từ router có dạng JSON
{ "error": { "message", "type", "code" } }, giống định dạng lỗi của OpenAI. SDK sẽ ném exception vớistatus_codetương ứng. Ý nghĩa từng mã: xem Bắt đầu nhanh. - Cả hai SDK Python mặc định tự thử lại 2 lần khi gặp lỗi kết nối, 429 và 5xx. Nếu muốn tự xử lý
Retry-After, đặtmax_retries=0khi tạo client. - Anthropic SDK 2.x tự gửi header
anthropic-versiontheo phiên bản API của nó. Router không kiểm tra giá trị header này từ client, nên bạn không cần đặt thủ công.
Cập nhật 1/11/2026