เปลี่ยน base URL ของคุณ แล้วใส่คีย์ OrcaRouter โมเดล SDK และโค้ดส่วนที่เหลือคงเดิมทุกอย่าง มีเพียง id ของ router ที่ขึ้นต้นด้วย openrouter/ เท่านั้นที่ต้องเปลี่ยนชื่อ
OrcaRouter รองรับ API ของ OpenAI, Anthropic และ Gemini โดยตรง คุณจึงใช้ SDK เดิมได้ต่อไป ในโค้ดแต่ละส่วน บรรทัดที่ขึ้นต้นด้วย - คือส่วนที่ต้องลบ และบรรทัดที่ขึ้นต้นด้วย + คือส่วนที่ต้องเพิ่ม
client = OpenAI(
- base_url="https://openrouter.ai/api/v1",
+ base_url="https://api.orcarouter.ai/v1",
api_key=ORCAROUTER_API_KEY,
)นั่นคือการแก้โค้ดเพียงจุดเดียว และให้ใส่คีย์ OrcaRouter ด้วย — ชื่อโมเดล ข้อความ และสตรีมมิงยังเหมือนเดิมทั้งหมด ยกเว้นกรณีที่คุณเรียก id ของ router ที่ขึ้นต้นด้วย openrouter/
client = Anthropic(
+ base_url="https://api.orcarouter.ai",
api_key=ORCAROUTER_API_KEY,
)เรารองรับ API ของ Anthropic โดยตรง ซึ่ง OpenRouter ไม่มี หากคุณเคยเรียก Claude ผ่าน SDK ของ OpenAI เพื่อให้เข้ากับ OpenRouter ตอนนี้ไม่จำเป็นแล้ว
const ai = new GoogleGenAI({
apiKey: ORCAROUTER_API_KEY,
+ httpOptions: { baseUrl: "https://api.orcarouter.ai" },
});เรารองรับ API ของ Gemini โดยตรงเช่นกัน SDK ของ Google จึงใช้งานได้โดยไม่ต้องแก้ไข
มีทั้งการอิมพอร์ต การสร้างไคลเอนต์ และการเรียกจริงหนึ่งครั้ง รันได้ทันทีตามนี้ เพียงตั้งค่า ORCAROUTER_API_KEY ไว้ในสภาพแวดล้อมของคุณ
import os
from openai import OpenAI
client = OpenAI(
base_url="https://api.orcarouter.ai/v1",
api_key=os.environ["ORCAROUTER_API_KEY"],
)
response = client.chat.completions.create(
model="anthropic/claude-sonnet-4",
messages=[{"role": "user", "content": "Hello"}],
)
print(response.choices[0].message.content)import OpenAI from "openai";
const client = new OpenAI({
baseURL: "https://api.orcarouter.ai/v1",
apiKey: process.env.ORCAROUTER_API_KEY,
});
const response = await client.chat.completions.create({
model: "anthropic/claude-sonnet-4",
messages: [{ role: "user", content: "Hello" }],
});
console.log(response.choices[0].message.content);curl https://api.orcarouter.ai/v1/chat/completions \
-H "Authorization: Bearer $ORCAROUTER_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "anthropic/claude-sonnet-4",
"messages": [{"role": "user", "content": "Hello"}]
}'import os
from anthropic import Anthropic
client = Anthropic(
base_url="https://api.orcarouter.ai",
api_key=os.environ["ORCAROUTER_API_KEY"],
)
message = client.messages.create(
model="anthropic/claude-sonnet-4",
max_tokens=1024,
messages=[{"role": "user", "content": "Hello"}],
)
print(message.content[0].text)import Anthropic from "@anthropic-ai/sdk";
const client = new Anthropic({
baseURL: "https://api.orcarouter.ai",
apiKey: process.env.ORCAROUTER_API_KEY,
});
const message = await client.messages.create({
model: "anthropic/claude-sonnet-4",
max_tokens: 1024,
messages: [{ role: "user", content: "Hello" }],
});
console.log(message.content[0].text);curl https://api.orcarouter.ai/v1/messages \
-H "x-api-key: $ORCAROUTER_API_KEY" \
-H "anthropic-version: 2023-06-01" \
-H "Content-Type: application/json" \
-d '{
"model": "anthropic/claude-sonnet-4",
"max_tokens": 1024,
"messages": [{"role": "user", "content": "Hello"}]
}'import os
from google import genai
client = genai.Client(
api_key=os.environ["ORCAROUTER_API_KEY"],
http_options={"base_url": "https://api.orcarouter.ai"},
)
response = client.models.generate_content(
model="google/gemini-2.5-pro",
contents="Hello",
)
print(response.text)import { GoogleGenAI } from "@google/genai";
const ai = new GoogleGenAI({
apiKey: process.env.ORCAROUTER_API_KEY,
httpOptions: { baseUrl: "https://api.orcarouter.ai" },
});
const response = await ai.models.generateContent({
model: "google/gemini-2.5-pro",
contents: "Hello",
});
console.log(response.text);curl "https://api.orcarouter.ai/v1beta/models/google/gemini-2.5-pro:generateContent" \
-H "x-goog-api-key: $ORCAROUTER_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"contents": [{"parts": [{"text": "Hello"}]}]
}'เราใช้ชื่อรูปแบบ vendor/model เหมือนกัน ดังนั้น anthropic/claude-sonnet-4 ใช้ได้ทันที ข้อยกเว้นคือ id ของ router ที่ขึ้นต้นด้วย openrouter/ ของ OpenRouter เอง ซึ่งต้องเปลี่ยนชื่อ
| บน OpenRouter | บน OrcaRouter |
|---|---|
openrouter/auto | orcarouter/auto |
openrouter/free | orcarouter/free |
| router อื่นที่ขึ้นต้นด้วย openrouter/ | ไม่มีตัวที่เทียบเท่า — ให้ระบุโมเดลแทน |
| ID แบบ vendor/model ทุกตัว เช่น anthropic/claude-sonnet-4 | ใช้ ID เดิมได้เลย ไม่ต้องเปลี่ยน |
รู้ไว้ตอนนี้ย่อมดีกว่าไปพบตอนใช้งานจริง
สำหรับการเชื่อมต่อส่วนใหญ่ ได้ เปลี่ยน base URL และเปลี่ยนเป็นคีย์ OrcaRouter ส่วน SDK ชื่อโมเดล ข้อความ และการสตรีมยังคงเหมือนเดิม ข้อยกเว้นคือ ID ของ router ที่ขึ้นต้นด้วย openrouter/ ของ OpenRouter เองซึ่งต้องเปลี่ยนชื่อ และสี่สิ่งที่ OrcaRouter ตั้งใจไม่ทำตามที่ระบุไว้ข้างต้น
SDK ของ OpenAI ต้องการ https://api.orcarouter.ai/v1 ส่วนอีกสองตัวต้องการ https://api.orcarouter.ai โดยแต่ละตัวจะเติมพาธของตัวเองให้เอง
ค่าจะเปลี่ยน — คีย์ OpenRouter ใช้ยืนยันตัวตนที่นี่ไม่ได้ — แต่ตำแหน่งไม่เปลี่ยน เราอ่านจากเฮดเดอร์เดิมที่ SDK ของคุณส่งอยู่แล้ว
router ของ OrcaRouter คือกลุ่ม orcarouter/ สองตัวตรงกับของเขาโดยตรง ใช้ orcarouter/auto แทน openrouter/auto และ orcarouter/free แทน openrouter/free แนวคิดเดียวกันทั้งคู่ เราจะเลือกโมเดลให้คุณ ณ เวลาที่ส่งคำขอ และตัวหลังทำให้คุณอยู่ในระดับที่ไม่มีค่าใช้จ่าย ส่วน router อื่นของเขาไม่มีตัวเทียบที่นี่ ให้ระบุชื่อโมเดลไปตรง ๆ แทน
ย้าย models และ route เข้าไปไว้ใน extra_body ส่วนอื่นเหมือนเดิมทุกอย่าง ระบุโมเดลเรียงตามลำดับที่ต้องการ แล้วเราจะลองทีละตัว อย่างน้อย 2 โมเดล มากที่สุด 5 โมเดล คุ้มที่จะแก้ให้ถูกต้อง เพราะที่ระดับนอกสุดเราจะไม่อ่านค่าเหล่านี้ ตัวสำรองของคุณจึงหยุดทำงานอย่างเงียบ ๆ และบนระบบที่ส่งต่อเนื้อหาคำขอตามเดิม โมเดลจะได้รับฟิลด์ส่วนเกินเหล่านั้นและอาจปฏิเสธการเรียกไปเลย
อ่าน X-Orca-Request-Id จากการตอบกลับ แล้วเรียก /v1/generation หากได้ 501 แปลว่าระบบชุดนี้ปิดการค้นหาค่าใช้จ่ายไว้
ส่ง X-Title แล้วแอปของคุณจะยังคงชื่อเดิมในหน้าวิเคราะห์ข้อมูลโดยไม่ต้องแก้อะไร และเรายังอ่านชื่อเฮดเดอร์ของ OpenRouter เองด้วย หากส่งเพียง HTTP-Referer ระบบจะระบุชื่อแอปของคุณได้ก็ต่อเมื่อโดเมนนั้นอยู่ในรายการที่เรารู้จักอยู่แล้ว ดังนั้นหากต้องการความแน่นอนให้ส่งเฮดเดอร์ชื่อแอปมาด้วย ข้อนี้มีไว้เพื่อไม่ให้คุณเผลอลบทิ้ง
เราไม่ได้ใช้ทั้งสองอย่าง บนแชนเนลปกติ ทั้งสองจะถูกตัดทิ้งก่อนที่คำขอจะไปถึงโมเดล ส่วนบนแชนเนลที่ตั้งให้ส่งต่อเนื้อหาดิบ ทั้งสองจะถูกส่งต่อไป และผู้ให้บริการที่เข้มงวดอาจปฏิเสธคำขอได้ การเอาออกจึงปลอดภัยทั้งสองกรณี
ครบตามที่คุณคาดไว้ และมีอีกไม่กี่รายการที่ OpenRouter ไม่มี มีที่นี่แต่ไม่มีใน OpenRouter: /v1/messages, /v1beta/models … generateContent, /v1/rerank และ /v1/realtime ไม่มีให้ใช้: /v1/fine-tunes, GET /v1/files และ /v1/images/variations
ข้อผิดพลาดกลับมาในรูปแบบเดิมที่คุณจัดการอยู่แล้ว ให้ดูที่สถานะ HTTP เป็นหลัก คือ 429 ที่เราส่ง Retry-After มาด้วยให้ลองใหม่ได้ 5xx ให้ถอยแล้วลองใหม่ ยกเว้น 501 ซึ่งหมายความว่าเราไม่ให้บริการคำขอนั้นเลย ส่วน 4xx บนการเรียกผ่าน relay ให้ถือว่าเป็นสิ่งที่ต้องแก้ในคำขอของคุณ ข้อยกเว้นคือ 404 จาก /v1/generation ซึ่งอาจแปลว่าคำขอยังชำระบัญชีไม่เสร็จ ให้ลองใหม่สั้น ๆ อย่าอ่าน error.type เป็นตัวบอกต้นทาง orcarouter_api_error เป็นของเราเสมอ แต่สำหรับความผิดพลาดบางอย่างของเราเอง เราจงใจส่งคำศัพท์ของผู้ให้บริการกลับไป เพื่อให้ SDK ของคุณเดินสายปกติของมัน ทั้งการจำกัดอัตราที่เราบังคับและที่โมเดลบังคับต่างก็เขียนว่า rate_limit_error เมื่อต้องการให้เราตรวจสอบการเรียกครั้งใดครั้งหนึ่ง กรุณาแจ้ง X-Orca-Request-Id