SDK chính chủ của Anthropic rất tốt, nhưng toàn bộ hệ sinh thái AI đã chuẩn hóa theo dạng client OpenAI — mọi ví dụ, mọi bộ điều hợp framework, mọi hướng dẫn "hello world" đều giả định bạn có sẵn một đối tượng OpenAI(...). Di chuyển mã của bạn để gọi trực tiếp SDK Anthropic là một lần tái cấu trúc đáng kể.
Không nhất thiết phải vậy. Bài viết này hướng dẫn cách gọi Claude Opus 4.7, Sonnet 4.6 và Haiku 4.5 qua OpenAI SDK mà không thay đổi — bằng cách định tuyến các lệnh gọi qua Kunavo. Cùng SDK, cùng kiểu dữ liệu, cùng tính năng streaming, cùng khả năng dùng công cụ. Chỉ một dòng thay đổi là base_url.
Thay đổi tối thiểu
Khi gói openai của Python đã được cài đặt, toàn bộ quá trình chuyển đổi sẽ như sau.
from openai import OpenAI
client = OpenAI(
api_key="sk-kn-...",
base_url="https://api.kunavo.com/v1", # the only line that changes
)
resp = client.chat.completions.create(
model="claude-sonnet-4-6", # a Claude slug, not gpt-4o
messages=[
{"role": "system", "content": "You are a senior platform engineer."},
{"role": "user", "content": "Critique this SQL migration..."},
],
)
print(resp.choices[0].message.content)api_key trở thành khóa Kunavo của bạn (tạo tại /app/keys). base_url trỏ đến gateway của chúng tôi. ID model chuyển từ gpt-4o sang một slug Claude — claude-opus-4-7, claude-sonnet-4-6, claude-haiku-4-5. Nội dung yêu cầu, dạng phản hồi và mọi trợ giúp trong SDK hoạt động chính xác như khi dùng OpenAI.
Truyền dữ liệu theo luồng
Streaming hoạt động giống hệt. Kunavo chuyển tiếp các đoạn SSE của Anthropic theo định dạng chat.completion.chunk của OpenAI, nên mẫu lặp bất đồng bộ hiện có hoạt động mà không cần sửa đổi.
for chunk in client.chat.completions.create(
model="claude-opus-4-7",
messages=[{"role": "user", "content": "Explain Raft in 200 words."}],
stream=True,
):
delta = chunk.choices[0].delta.content
if delta:
print(delta, end="", flush=True)Dùng công cụ / gọi hàm
Giao thức dùng công cụ của Anthropic về mặt ngữ nghĩa giống với gọi hàm của OpenAI — chúng chỉ khác nhau ở cấp truyền tải. Kunavo chuyển đổi mảng tools, phản hồi tool_calls và các tin nhắn tiếp theo tool theo cả hai chiều. Hãy dùng tool_choice="auto", "none" hoặc một công cụ có tên — tất cả đều được ánh xạ.
tools = [
{
"type": "function",
"function": {
"name": "get_weather",
"description": "Get current weather in a city",
"parameters": {
"type": "object",
"properties": {
"city": {"type": "string"},
"unit": {"type": "string", "enum": ["celsius", "fahrenheit"]},
},
"required": ["city"],
},
},
}
]
resp = client.chat.completions.create(
model="claude-sonnet-4-6",
messages=[{"role": "user", "content": "What's the weather in Tokyo?"}],
tools=tools,
tool_choice="auto",
)
print(resp.choices[0].message.tool_calls)Thị giác
Claude đã hỗ trợ đa phương thức từ phiên bản 3.5; truyền hình ảnh sử dụng mảng content: [{ type: 'text' }, { type: 'image_url' }] tiêu chuẩn của OpenAI. image_url.url có thể là URL https hoặc URI base64 data:.
resp = client.chat.completions.create(
model="claude-sonnet-4-6",
messages=[{
"role": "user",
"content": [
{"type": "text", "text": "What's in this image?"},
{"type": "image_url",
"image_url": {"url": "https://example.com/cat.jpg"}},
],
}],
)Khi bạn thực sự muốn dùng SDK Anthropic gốc
Một số tính năng chỉ có ở Anthropic không thể biểu đạt trong dạng OpenAI — quan trọng nhất là chỉ thị cache_control cho bộ nhớ đệm prompt và token thinking mở rộng. Nếu cần một trong hai, hãy chuyển SDK nhưng giữ nguyên khóa: Kunavo cũng cung cấp endpoint /v1/messages gốc, nên SDK Anthropic cũng hoạt động chỉ với một thay đổi base_url.
from anthropic import Anthropic
client = Anthropic(
api_key="sk-kn-...",
base_url="https://api.kunavo.com", # SDK appends /v1/messages
)
resp = client.messages.create(
model="claude-opus-4-7",
max_tokens=1024,
system="You are a senior platform engineer.",
messages=[{"role": "user", "content": "What is a hot standby?"}],
)
print(resp.content[0].text)Xem tài liệu Native Messages API để biết đầy đủ các tham số được truyền nguyên trạng, và /docs/caching để biết cách bộ nhớ đệm prompt tiết kiệm đến 90% chi phí đầu vào cho các prompt lặp lại.
Bản thân bộ nhớ đệm prompt không đòi hỏi phải chuyển SDK. Với prompt dài, Kunavo đặt các điểm ngắt bộ nhớ đệm cho bạn trên tuyến dạng OpenAI: trên system prompt, trên các định nghĩa công cụ và trên tin nhắn cuối cùng của một cuộc trò chuyện đã có lượt trả lời của trợ lý. Một cache_control mà bạn tự thêm vào tin nhắn hệ thống, tin nhắn người dùng hoặc định nghĩa công cụ sẽ được chuyển tiếp đến Claude.
Những gì bạn từ bỏ — và những gì bạn nhận được
Tuyến dạng OpenAI là một lớp chuyển đổi, không phải giao thức gốc. Hai điểm nhỏ không đi qua được ranh giới:
- Điều khiển suy nghĩ — tuyến này không chuyển tiếp
thinkingvàreasoning_effortđến Claude. Để bật hoặc điều chỉnh suy nghĩ mở rộng, hãy dùng Messages API gốc. - Đầu ra suy nghĩ — khi model suy nghĩ, phản hồi không bao gồm phần suy nghĩ đó và đối tượng usage không có số đếm riêng cho phần này: token suy nghĩ được tính trong
completion_tokens.
Đổi lại, bạn nhận được rất nhiều: một SDK dùng chung cho Claude, GPT, GPT-Image, Veo và phần còn lại của danh mục; thấp hơn giá chính thức của nhà cung cấp tùy model; thanh toán tích hợp Stripe bằng tiền tệ địa phương; không âm thầm thay model — chuyển dự phòng chỉ thay đổi nhà cung cấp, không bao giờ thay model, và bảng điều khiển liệt kê chi tiết model, token và chi phí của từng lệnh gọi.
Xác nhận trong hai phút
Đăng ký tại kunavo.com/app/signup — khoản nạp $10 đủ cho vài nghìn lệnh gọi Claude, thanh toán theo mức dùng và số dư không bao giờ hết hạn. Thêm base_url vào, đổi ID model sang slug Claude rồi chạy bộ kiểm thử hiện có. Nếu có gì đó không chuyển đổi trơn tru, hãy gửi email đến contact@kunavo.com — chúng tôi đọc mọi tin nhắn.