ย้ายจาก OpenRouter ใช้แค่บรรทัดเดียว

เปลี่ยน base URL ของคุณ แล้วใส่คีย์ OrcaRouter โมเดล SDK และโค้ดส่วนที่เหลือคงเดิมทุกอย่าง มีเพียง id ของ router ที่ขึ้นต้นด้วย openrouter/ เท่านั้นที่ต้องเปลี่ยนชื่อ

สามสิ่งที่ควรตรวจสอบ

  1. ใช้ base URL ให้ถูกกับ SDK ของคุณ — SDK ของ OpenAI ต้องการ https://api.orcarouter.ai/v1 ส่วนอีกสองตัวต้องการ https://api.orcarouter.ai โดยแต่ละตัวจะเติมพาธของตัวเองให้เอง
  2. เปลี่ยนเป็นคีย์ OrcaRouter ของคุณ — ค่าจะเปลี่ยน — คีย์ OpenRouter ใช้ยืนยันตัวตนที่นี่ไม่ได้ — แต่ตำแหน่งไม่เปลี่ยน เราอ่านจากเฮดเดอร์เดิมที่ SDK ของคุณส่งอยู่แล้ว
  3. คงชื่อโมเดลไว้อย่างเดิม — เราใช้ชื่อรูปแบบ vendor/model เหมือนกัน ดังนั้น anthropic/claude-sonnet-4 ใช้ได้ทันที ข้อยกเว้นคือ id ของ router ที่ขึ้นต้นด้วย openrouter/ ของ OpenRouter เอง ซึ่งต้องเปลี่ยนชื่อ

ก่อนและหลัง: บรรทัดที่เปลี่ยน

OrcaRouter รองรับ API ของ OpenAI, Anthropic และ Gemini โดยตรง คุณจึงใช้ SDK เดิมได้ต่อไป ในโค้ดแต่ละส่วน บรรทัดที่ขึ้นต้นด้วย - คือส่วนที่ต้องลบ และบรรทัดที่ขึ้นต้นด้วย + คือส่วนที่ต้องเพิ่ม

OpenAI — Python

  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/

Anthropic — Python

  client = Anthropic(
+     base_url="https://api.orcarouter.ai",
      api_key=ORCAROUTER_API_KEY,
  )

เรารองรับ API ของ Anthropic โดยตรง ซึ่ง OpenRouter ไม่มี หากคุณเคยเรียก Claude ผ่าน SDK ของ OpenAI เพื่อให้เข้ากับ OpenRouter ตอนนี้ไม่จำเป็นแล้ว

Gemini — TypeScript

  const ai = new GoogleGenAI({
    apiKey: ORCAROUTER_API_KEY,
+   httpOptions: { baseUrl: "https://api.orcarouter.ai" },
  });

เรารองรับ API ของ Gemini โดยตรงเช่นกัน SDK ของ Google จึงใช้งานได้โดยไม่ต้องแก้ไข

ตัวอย่างฉบับเต็มสำหรับแต่ละ SDK

มีทั้งการอิมพอร์ต การสร้างไคลเอนต์ และการเรียกจริงหนึ่งครั้ง รันได้ทันทีตามนี้ เพียงตั้งค่า ORCAROUTER_API_KEY ไว้ในสภาพแวดล้อมของคุณ

OpenAI — Python

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)

OpenAI — TypeScript

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);

OpenAI — cURL

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"}]
  }'

Anthropic — Python

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)

Anthropic — TypeScript

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);

Anthropic — cURL

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"}]
  }'

Gemini — Python

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)

Gemini — TypeScript

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);

Gemini — cURL

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"}]}]
  }'

ID ของโมเดล: สิ่งที่ต้องเปลี่ยนชื่อ

เราใช้ชื่อรูปแบบ vendor/model เหมือนกัน ดังนั้น anthropic/claude-sonnet-4 ใช้ได้ทันที ข้อยกเว้นคือ id ของ router ที่ขึ้นต้นด้วย openrouter/ ของ OpenRouter เอง ซึ่งต้องเปลี่ยนชื่อ

บน OpenRouterบน OrcaRouter
openrouter/autoorcarouter/auto
openrouter/freeorcarouter/free
router อื่นที่ขึ้นต้นด้วย openrouter/ไม่มีตัวที่เทียบเท่า — ให้ระบุโมเดลแทน
ID แบบ vendor/model ทุกตัว เช่น anthropic/claude-sonnet-4ใช้ ID เดิมได้เลย ไม่ต้องเปลี่ยน

ความแตกต่างด้านการคิดค่าบริการ

สี่สิ่งที่เราไม่ทำ

รู้ไว้ตอนนี้ย่อมดีกว่าไปพบตอนใช้งานจริง

คำถามที่พบบ่อย

ใช้ OrcaRouter แทน OpenRouter ได้ทันทีเลยไหม

สำหรับการเชื่อมต่อส่วนใหญ่ ได้ เปลี่ยน base URL และเปลี่ยนเป็นคีย์ OrcaRouter ส่วน SDK ชื่อโมเดล ข้อความ และการสตรีมยังคงเหมือนเดิม ข้อยกเว้นคือ ID ของ router ที่ขึ้นต้นด้วย openrouter/ ของ OpenRouter เองซึ่งต้องเปลี่ยนชื่อ และสี่สิ่งที่ OrcaRouter ตั้งใจไม่ทำตามที่ระบุไว้ข้างต้น

แต่ละ SDK ต้องใช้ base URL ใด

SDK ของ OpenAI ต้องการ https://api.orcarouter.ai/v1 ส่วนอีกสองตัวต้องการ https://api.orcarouter.ai โดยแต่ละตัวจะเติมพาธของตัวเองให้เอง

ยังใช้คีย์ API ของ OpenRouter ต่อได้ไหม

ค่าจะเปลี่ยน — คีย์ OpenRouter ใช้ยืนยันตัวตนที่นี่ไม่ได้ — แต่ตำแหน่งไม่เปลี่ยน เราอ่านจากเฮดเดอร์เดิมที่ SDK ของคุณส่งอยู่แล้ว

จะใช้อะไรแทน openrouter/auto และ openrouter/free

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 และ HTTP-Referer ยังระบุแอปของฉันได้อยู่ไหม

ส่ง X-Title แล้วแอปของคุณจะยังคงชื่อเดิมในหน้าวิเคราะห์ข้อมูลโดยไม่ต้องแก้อะไร และเรายังอ่านชื่อเฮดเดอร์ของ OpenRouter เองด้วย หากส่งเพียง HTTP-Referer ระบบจะระบุชื่อแอปของคุณได้ก็ต่อเมื่อโดเมนนั้นอยู่ในรายการที่เรารู้จักอยู่แล้ว ดังนั้นหากต้องการความแน่นอนให้ส่งเฮดเดอร์ชื่อแอปมาด้วย ข้อนี้มีไว้เพื่อไม่ให้คุณเผลอลบทิ้ง

provider และ transforms ในคำขอของฉันจะเป็นอย่างไร

เราไม่ได้ใช้ทั้งสองอย่าง บนแชนเนลปกติ ทั้งสองจะถูกตัดทิ้งก่อนที่คำขอจะไปถึงโมเดล ส่วนบนแชนเนลที่ตั้งให้ส่งต่อเนื้อหาดิบ ทั้งสองจะถูกส่งต่อไป และผู้ให้บริการที่เข้มงวดอาจปฏิเสธคำขอได้ การเอาออกจึงปลอดภัยทั้งสองกรณี

OrcaRouter มีปลายทางใดบ้าง

ครบตามที่คุณคาดไว้ และมีอีกไม่กี่รายการที่ 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