เอกสาร BasicRouter
เริ่มต้นอย่างรวดเร็ว
BasicRouter มอบ API ที่เสถียรหนึ่งรายการสำหรับทีมการผลิตเพื่อเข้าถึงโมเดล การกำหนดเส้นทาง การสำรอง การติดตามการใช้งาน และการเรียกเก็บเงินแบบเครดิต โทเค็น LLM มาจากบัญชีผู้ให้บริการต้นฉบับบนคลาวด์องค์กรที่ได้รับความไว้วางใจ พร้อมการปกป้องความเป็นส่วนตัว ความเสถียรสูง และการตรวจสอบย้อนกลับคำขอที่สร้างขึ้นในเกตเวย์
https://api.basicrouter.ai/apihttps://api.basicrouter.ai/api/v1https://api.basicrouter.ai/api/v1Authorization: Bearer <key>สร้างคีย์ API
สร้างคีย์ API BasicRouter ในคอนโซล เก็บคีย์ไว้บนเซิร์ฟเวอร์ของคุณและอย่า เปิดเผยในโค้ดเบราว์เซอร์หรือไคลเอนต์มือถือ
กลยุทธ์คีย์ที่แนะนำ:
| ประเภทคีย์ | การใช้งานที่แนะนำ |
|---|---|
| Development key | การพัฒนาในเครื่อง, การจัดเตรียม, การทดสอบ และต้นแบบ |
| คีย์สำหรับการผลิต | สำหรับงานผลิตแบ็กเอนด์เท่านั้น |
| Integration key | Dedicated key for tools such as Cursor, Claude Code, Codex, Hermes, or OpenClaw. |
| Customer / tenant key | Optional key isolation for enterprise customers, tenant traffic, or business units. |
หมุนเวียนคีย์เมื่อการเข้าถึงของทีมเปลี่ยนแปลง เพิกถอนคีย์ที่ไม่ใช้งานแล้ว
ชี้ SDK ของคุณไปยัง BasicRouter
ไคลเอนต์ที่เข้ากันได้กับ OpenAI ส่วนใหญ่ต้องการเพียง URL ฐานและคีย์ API ใหม่
import OpenAI from "openai";
const client = new OpenAI({
apiKey: process.env.BASICROUTER_API_KEY,
baseURL: "https://api.basicrouter.ai/api/v1"
});
ส่งการเติมแชท
curl --request POST \
--url https://api.basicrouter.ai/api/v1/chat/completions \
--header "Authorization: Bearer $BASICROUTER_API_KEY" \
--header "Content-Type: application/json" \
--data '{
"model": "claude-sonnet-5",
"messages": [
{ "role": "user", "content": "Explain BasicRouter in one sentence." }
]
}'
ตรวจสอบการใช้งานและยอดคงเหลือ
curl --request GET \
--url https://api.basicrouter.ai/api/v1/billing/balance \
--header "Authorization: Bearer $BASICROUTER_API_KEY"
การค้นพบโมเดล
ใช้หน้าโมเดลหรือ Models API เพื่อตรวจสอบโมเดลข้อความที่พร้อมใช้งาน ข้อมูลเมตาของโมเดล รวมถึงผู้ผลิต ผู้ให้บริการ รูปแบบ ความยาวบริบท ตระกูล API ที่รองรับ ความสามารถที่รองรับ ความพร้อมใช้งาน ขีดจำกัดระดับบัญชี และราคาเครดิต
จุดเชื่อมต่อ: GET /v1/models
วัตถุประสงค์: แสดงรายการโมเดลที่พร้อมใช้งานสำหรับบัญชีปัจจุบัน
curl --request GET \
--url https://api.basicrouter.ai/api/v1/models \
--header "Authorization: Bearer $BASICROUTER_API_KEY"
ตารางความสามารถ
| ความสามารถ | คำอธิบาย | ใช้โดยทั่วไปโดย |
|---|---|---|
streaming | รองรับการสตรีมเหตุการณ์ที่ส่งโดยเซิร์ฟเวอร์ | แอปแชท, ตัวแทนเขียนโค้ด, UX แบบเรียลไทม์ |
tool_calling | รองรับการเรียกเครื่องมือหรือฟังก์ชัน | ตัวแทน, ระบบอัตโนมัติเวิร์กโฟลว์, ผู้ช่วยเขียนโค้ด |
structured_outputs | รองรับเอาต์พุตที่จำกัดด้วยสคีมาหรือ JSON | การสกัดข้อมูล, ระบบอัตโนมัติเวิร์กโฟลว์, แอปองค์กร |
json_mode | สามารถส่งคืนเอาต์พุตในรูปแบบ JSON | การตอบกลับแบบโครงสร้างน้ำหนักเบา |
vision | รับอินพุตรูปภาพ | แชทหลายรูปแบบ, การวิเคราะห์ UI, ภาพหน้าจอเอกสาร |
prompt_caching | รองรับอินพุตแคชหรือการนำบริบทกลับมาใช้ใหม่ | ตัวแทนบริบทยาว, พร้อมต์ระบบที่ใช้ซ้ำ |
reasoning | รองรับการควบคุมการให้เหตุผลอย่างชัดเจนเมื่อมี | การวางแผนที่ซับซ้อน, การเขียนโค้ด, เวิร์กโฟลว์การวิเคราะห์ |
logprobs | รองรับเอาต์พุตความน่าจะเป็นของโทเค็น | การประเมิน, การจัดอันดับ, เวิร์กโฟลว์ NLP ขั้นสูง |
ตารางความเข้ากันได้ของตระกูล API
| ตระกูล API | ข้อความ | อินพุตภาพ | การเรียกเครื่องมือ | เอาต์พุตแบบโครงสร้าง | การสตรีม | หมายเหตุ |
|---|---|---|---|---|---|---|
| OpenAI Chat Completions | ใช่ | ขึ้นอยู่กับโมเดล | ขึ้นอยู่กับโมเดล | ขึ้นอยู่กับโมเดล | ใช่ | ค่าเริ่มต้นที่ดีที่สุดสำหรับตัวแทนและ SDK ที่เข้ากันได้กับ OpenAI |
| OpenAI Responses | ใช่ | ขึ้นอยู่กับโมเดล | ขึ้นอยู่กับโมเดล | ขึ้นอยู่กับโมเดล | ใช่ | แนะนำสำหรับเวิร์กโฟลว์ตัวแทนสไตล์ OpenAI รุ่นใหม่ |
| Anthropic Messages | ใช่ | ขึ้นอยู่กับโมเดล | ขึ้นอยู่กับโมเดล | ขึ้นอยู่กับโมเดล | ใช่ | ดีที่สุดสำหรับไคลเอนต์ที่เข้ากันได้กับ Claude และ Claude Code |
| BasicRouter image generation | ไม่ | ขึ้นอยู่กับโมเดล | ไม่ | ไม่ | ไม่ | ใช้การโพลงานอะซิงโครนัสหรือเว็บฮุก |
| BasicRouter video generation | ไม่ | ขึ้นอยู่กับโมเดล | ไม่ | ไม่ | ไม่ | ใช้การโพลงานอะซิงโครนัสหรือเว็บฮุก |
การรับรองความถูกต้อง
คำขอ API ทุกรายการใช้โทเค็นผู้ถือ เก็บคีย์ในตัวแปรสภาพแวดล้อมฝั่งเซิร์ฟเวอร์ หมุนเวียนเมื่อการเข้าถึงของทีมเปลี่ยนแปลง และบันทึกรหัสคำขอเพื่อการดีบัก
| ส่วนหัว | ค่า | หมายเหตุ |
|---|---|---|
Authorization | Bearer YOUR_API_KEY | จำเป็นสำหรับทุกคำขอ |
Content-Type | application/json | จำเป็นสำหรับเนื้อหาคำขอ JSON |
ข้อแนะนำด้านความปลอดภัยของคีย์
- เก็บคีย์ API ไว้บนเซิร์ฟเวอร์ อย่าเปิดเผยคีย์ในโค้ดเบราว์เซอร์หรือไคลเอนต์มือถือ
- Use separate keys for development, staging, production, and third-party integrations.
- กำหนดขอบเขตคีย์ตามสภาพแวดล้อม บริการ ลูกค้า หรือผู้เช่าเมื่อมีให้
- Rotate keys after employee departures, vendor access changes, or suspected leakage.
- เก็บคีย์ในตัวจัดการความลับหรือตัวแปรสภาพแวดล้อม ไม่ใช่โค้ดต้นฉบับ
ตัวแทนเขียนโค้ด
BasicRouter ทำงานร่วมกับตัวแทนเขียนโค้ดและเครื่องมือพัฒนา AI ที่รองรับ จุดเชื่อมต่อ
API ที่เข้ากันได้กับ OpenAI หรือ Anthropic ใช้นามแฝงการกำหนดเส้นทางเช่น
mwf/coding-auto เพื่อให้ BasicRouter
สามารถกำหนดเส้นทางไปยังโมเดลเขียนโค้ดที่ดีที่สุดที่พร้อมใช้งาน
โดยไม่ต้องให้นักพัฒนาเปลี่ยนการกำหนดค่าเครื่องมือ
การตั้งค่าที่เข้ากันได้กับ OpenAI แบบทั่วไป
ใช้การตั้งค่านี้สำหรับ Cursor, Codex, Hermes, OpenClaw, Continue, Aider, Cline, ตัวแทนที่ใช้ LangChain, ตัวแทนที่ใช้ LlamaIndex, และรันไทม์ตัวแทนที่เข้ากันได้กับ OpenAI แบบกำหนดเอง
export OPENAI_BASE_URL="https://api.basicrouter.ai/api/v1"
export OPENAI_API_KEY="$BASICROUTER_API_KEY"
export OPENAI_MODEL="mwf/coding-auto"
การตั้งค่าที่เข้ากันได้กับ Anthropic แบบทั่วไป
ใช้การตั้งค่านี้สำหรับไคลเอนต์ที่เข้ากันได้กับ Claude และเครื่องมือที่คาดหวังรูปแบบ Anthropic Messages
export ANTHROPIC_BASE_URL="https://api.basicrouter.ai/api/anthropic"
export ANTHROPIC_API_KEY="$BASICROUTER_API_KEY"
export ANTHROPIC_MODEL="mwf/coding-auto"
โมเดลตัวแทนที่แนะนำ
| กรณีการใช้งาน | นามแฝงที่แนะนำ | ข้อกำหนด |
|---|---|---|
| การเขียนโค้ดทั่วไป | mwf/coding-auto | การเรียกเครื่องมือ, การสตรีม, ความสามารถเขียนโค้ดที่แข็งแกร่ง |
| แชทเขียนโค้ดรวดเร็ว | mwf/coding-fast | เวลาแฝงต่ำและการสตรีม |
| วิเคราะห์รีโพสิทอรีขนาดใหญ่ | mwf/coding-long | บริบทยาวและเอาต์พุตที่เสถียร |
| ผู้ช่วยเขียนโค้ดที่คำนึงถึงต้นทุน | mwf/low-cost | ราคาต่ำกว่าและคุณภาพการเขียนโค้ดที่ยอมรับได้ |
| ภาพหน้าจอ UI / เขียนโค้ดด้วยการมองเห็น | mwf/vision-chat | อินพุตภาพและเอาต์พุตข้อความ |
คู่มือฉับไว Cursor
ใช้จุดเชื่อมต่อที่เข้ากันได้กับ OpenAI
Base URL: https://api.basicrouter.ai/api/v1
API Key: BASICROUTER_API_KEY
Model: mwf/coding-auto
ขั้นตอนที่แนะนำ:
- เปิดการตั้งค่า Cursor
- เพิ่มหรือเปิดใช้งานการกำหนดค่าคีย์ API ที่เข้ากันได้กับ OpenAI
- ตั้งค่าการแทนที่ URL ฐาน OpenAI เป็น
https://api.basicrouter.ai/api/v1 - Add a custom model such as
mwf/coding-auto,mwf/coding-fast, ormwf/coding-long. - ใช้โมเดลที่รองรับการสตรีมและการเรียกเครื่องมือเพื่อพฤติกรรมตัวแทนที่ดีที่สุด
การแก้ไขปัญหา:
| ปัญหา | การแก้ไขที่แนะนำ |
|---|---|
| โมเดลไม่แสดง | เพิ่มชื่อโมเดลด้วยตนเองเป็นโมเดลกำหนดเอง |
| การเรียกเครื่องมือล้มเหลว | ใช้โมเดลที่มี tool_calling: true ในหน้าโมเดล |
| การสตรีมถูกขัดจังหวะ | ลองใหม่ด้วยการถดถอยหรือใช้นามแฝงการกำหนดเส้นทางพร้อมการสำรอง |
| ข้อผิดพลาด 401 | ตรวจสอบคีย์ API และ URL ฐาน |
| ข้อผิดพลาดโมเดล 404 | ยืนยันว่าโมเดลถูกเปิดใช้งานสำหรับบัญชี |
คู่มือฉับไว Claude Code
ใช้จุดเชื่อมต่อเกตเวย์ที่เข้ากันได้กับ Anthropic
export ANTHROPIC_BASE_URL="https://api.basicrouter.ai/api/anthropic"
export ANTHROPIC_API_KEY="$BASICROUTER_API_KEY"
export ANTHROPIC_MODEL="mwf/coding-auto"
BasicRouter รองรับเส้นทางที่เข้ากันได้กับ Anthropic นี้สำหรับ Claude Code และความเข้ากันได้ของ Anthropic SDK:
POST /api/v1/messages
ข้อกำหนดที่แนะนำ:
| ข้อกำหนด | เหตุผล |
|---|---|
| Anthropic Messages-compatible request shape | Claude Code คาดหวังข้อความสไตล์ Anthropic |
| การรองรับการสตรีม | Claude Code พึ่งพา UX การสตรีม |
| การรองรับการเรียกเครื่องมือ | จำเป็นสำหรับเวิร์กโฟลว์การเขียนโค้ดแบบตัวแทน |
| บริบทยาว | มีประโยชน์สำหรับงานระดับรีโพสิทอรี |
| การสำรองที่เสถียร | มีประโยชน์สำหรับเซสชันเขียนโค้ดที่ใช้เวลานาน |
คู่มือฉับไว Codex
ใช้ BasicRouter เป็นผู้ให้บริการโมเดลที่เข้ากันได้กับ OpenAI แบบกำหนดเอง
ตัวอย่างการกำหนดค่าผู้ให้บริการ:
[model_providers.basicrouter]
name = "BasicRouter"
base_url = "https://api.basicrouter.ai/api/v1"
env_key = "BASICROUTER_API_KEY"
wire_api = "responses"
model_provider = "basicrouter"
model = "mwf/coding-auto"
ตัวแปรสภาพแวดล้อม:
export BASICROUTER_API_KEY="br_xxx"
โมเดลที่แนะนำ:
| โมเดล | กรณีการใช้งาน |
|---|---|
mwf/coding-auto | โมเดลตัวแทนเขียนโค้ดเริ่มต้น |
mwf/coding-long | บริบทรีโพสิทอรีขนาดใหญ่ |
mwf/coding-fast | การวนซ้ำรวดเร็วและการเปลี่ยนแปลงเล็กน้อย |
การแก้ไขปัญหา:
| ปัญหา | การแก้ไขที่แนะนำ |
|---|---|
| ข้อผิดพลาดการรับรองความถูกต้อง | Confirm env_key points to BASICROUTER_API_KEY. |
| ไม่พบโมเดล | เพิ่มนามแฝงในคอนโซล BasicRouter หรือใช้รหัสโมเดลโดยตรง |
| ข้อผิดพลาด API Responses | Use wire_api = "responses" only for models and endpoints
that support Responses. |
| โมเดลที่รองรับเฉพาะ Chat Completions | สลับไปยัง API wire ที่เข้ากันได้กับแชทหากไคลเอนต์รองรับ |
คู่มือฉับไว Hermes
ใช้จุดเชื่อมต่อที่เข้ากันได้กับ OpenAI เว้นแต่การปรับใช้ Hermes ของคุณกำหนดค่าไว้สำหรับ พิธีสารอื่น
export OPENAI_BASE_URL="https://api.basicrouter.ai/api/v1"
export OPENAI_API_KEY="$BASICROUTER_API_KEY"
export OPENAI_MODEL="mwf/coding-auto"
นโยบายโมเดลที่แนะนำ:
| งาน Hermes | โมเดล |
|---|---|
| การสร้างโค้ดทั่วไป | mwf/coding-auto |
| การดำเนินการงานเวลาแฝงต่ำ | mwf/coding-fast |
| สแกนรีโพสิทอรีบริบทยาว | mwf/coding-long |
| งานเบื้องหลังที่คำนึงถึงต้นทุน | mwf/low-cost |
คู่มือฉับไว OpenClaw
ใช้จุดเชื่อมต่อที่เข้ากันได้กับ OpenAI สำหรับการกำหนดค่ารันไทม์ตัวแทนสไตล์ OpenAI
export OPENAI_BASE_URL="https://api.basicrouter.ai/api/v1"
export OPENAI_API_KEY="$BASICROUTER_API_KEY"
export OPENAI_MODEL="mwf/coding-auto"
หาก OpenClaw รองรับผู้ให้บริการหลายราย ให้กำหนดค่า BasicRouter เป็นผู้ให้บริการที่เข้ากันได้กับ OpenAI และใช้นามแฝงการกำหนดเส้นทาง BasicRouter สำหรับการเลือกโมเดล
{
"provider": "openai-compatible",
"base_url": "https://api.basicrouter.ai/api/v1",
"api_key_env": "BASICROUTER_API_KEY",
"model": "mwf/coding-auto"
}
รายการตรวจสอบความเข้ากันได้ของตัวแทน
| ความสามารถ | จำเป็นสำหรับ |
|---|---|
| การสตรีม | UX ของเทอร์มินัล/เอดิเตอร์ที่ดี |
| การเรียกเครื่องมือ | การเขียนโค้ดแบบตัวแทน, การแก้ไขไฟล์, การดำเนินการคำสั่ง |
| บริบทยาว | พื้นที่เก็บข้อมูลขนาดใหญ่และการเปลี่ยนแปลงหลายไฟล์ |
| เอาต์พุตแบบโครงสร้าง | การวางแผน การแบ่งงาน เวิร์กโฟลว์อัตโนมัติ |
| อินพุตภาพ | การวิเคราะห์ภาพหน้าจอ UI และเวิร์กโฟลว์ออกแบบสู่โค้ด |
| การสำรอง | ความเสถียรของการผลิตและงานที่ใช้เวลานาน |
การใช้งานคอนโซล
คอนโซล BasicRouter เป็นระนาบควบคุมการดำเนินงานสำหรับการเข้าถึง API ความพร้อมของโมเดล นโยบายการกำหนดเส้นทาง การมองเห็นการใช้งาน และการบริหารการเรียกเก็บเงิน มอบ มุมมองรวมศูนย์ให้ผู้ดูแลบัญชีเกี่ยวกับคีย์ โมเดล คำขอ เครดิต และ การควบคุมระดับบัญชีสำหรับการเข้าชมโมเดลการผลิต
การจัดการคีย์ API
สร้าง หมุนเวียน เพิกถอน และติดป้ายกำกับคีย์ API จากคอนโซล ใช้คีย์แยกสำหรับ การพัฒนา การจัดเตรียม การผลิต และบริการแต่ละรายการ เพื่อให้สามารถตรวจสอบและ แยกการใช้งานตามสภาพแวดล้อมหรือแอปพลิเคชัน
| แนวปฏิบัติ | คำอธิบาย |
|---|---|
| แยกสภาพแวดล้อม | Use different API keys for development, staging, and production traffic. |
| ใช้ป้ายกำกับที่สื่อความหมาย | ติดป้ายกำกับคีย์ตามแอปพลิเคชัน บริการ สภาพแวดล้อม หรือการรวมระบบ |
| หมุนเวียนเป็นประจำ | Rotate keys when access changes or credentials may have been exposed. |
| หลีกเลี่ยงการเปิดเผยฝั่งไคลเอนต์ | Keep API keys on server-side systems only. Do not expose keys in browser or mobile client code. |
| ติดตามการใช้งานคีย์ | Review request volume, credit consumption, and error patterns by key. |
รายการโมเดล
ใช้หน้าโมเดลเพื่อตรวจสอบโมเดลที่พร้อมใช้งานสำหรับบัญชี รายการโมเดลแต่ละรายการอาจ รวมถึงผู้ผลิต ผู้ให้บริการ รูปแบบ ตระกูล API ที่รองรับ ความยาวบริบท แฟล็กความสามารถ สถานะความพร้อมใช้งาน และข้อมูลราคา
| ตัวกรอง | วัตถุประสงค์ |
|---|---|
| ผู้ผลิต | Filter by model vendor such as OpenAI, Anthropic, Google, Qwen, DeepSeek, or other providers. |
| ผู้ให้บริการ | กรองตามผู้ให้บริการหรือผู้ให้บริการคลาวด์ |
| รูปแบบ | Filter by text, image, video, embedding, audio, or multimodal support. |
| ความสามารถ | Filter by streaming, tool calling, structured outputs, vision, prompt caching, or reasoning support. |
| ความพร้อมใช้งาน | ระบุโมเดลที่พร้อมใช้งานสำหรับบัญชีปัจจุบัน |
สำหรับแอปพลิเคชันการผลิต ให้ตรวจสอบความสามารถของโมเดลก่อนเปิดใช้งานการเข้าชม พารามิเตอร์และคุณสมบัติบางอย่างขึ้นอยู่กับโมเดลและอาจไม่รองรับในทุก ตระกูล API
การใช้งาน & บันทึก
มุมมองการใช้งาน & บันทึก ให้การมองเห็นการดำเนินงานของการเข้าชม API ทีมสามารถ ตรวจสอบปริมาณคำขอ โมเดลที่เลือก เป้าหมายการกำหนดเส้นทางที่แก้ไขแล้ว การใช้เครดิต เวลาแฝง รหัสข้อผิดพลาด และรหัสคำขอ
- แก้ไขปัญหาคำขอที่ล้มเหลว
- ระบุงานที่มีต้นทุนสูง
- เปรียบเทียบการใช้งานโมเดลข้ามแอปพลิเคชันและสภาพแวดล้อม
- ตรวจสอบพฤติกรรมการกำหนดเส้นทางและการสำรอง
- สืบสวนปัญหาเวลาแฝงหรือความพร้อมของผู้ให้บริการ
- ระบุรหัสคำขอเมื่อติดต่อฝ่ายสนับสนุน
การตอบกลับ API แต่ละรายการรวมหรือเปิดเผยรหัสคำขอ BasicRouter เก็บรหัสนี้ใน บันทึกแอปพลิเคชันของคุณเพื่อให้การดีบักการผลิตและการขยายการสนับสนุนมีประสิทธิภาพมากขึ้น
การสำรอง
การสำรองเป็นกลไกความยืดหยุ่นของ BasicRouter เมื่อโมเดลหลักหรือนโยบายการกำหนดเส้นทาง ล้มเหลว ระบบจะสลับไปยังโมเดลสำรองโดยอัตโนมัติเพื่อดำเนินการ คำขอต่อ นี่ทำให้แอปพลิเคชันของคุณตอบสนองและลดความเสี่ยงของการ หยุดชะงักของบริการ
Fallback acts like a safety net, keeping your application running smoothly even when a model failure, quota limit, or network fluctuation occurs.
ทำไมการสำรองจึงสำคัญ
ในการผลิต บริการโมเดลอาจประสบปัญหาที่คาดเดาไม่ได้หลายประการ:
- ความล้มเหลวของบริการโมเดล: API ต้นน้ำกลายเป็น ไม่พร้อมใช้งานชั่วคราวหรือหมดเวลา
- การผันผวนของประสิทธิภาพ: โหลดโมเดลสูงนำไปสู่การตอบกลับ ช้าหรือล้มเหลว
- ความล้มเหลวของการกำหนดเส้นทาง: โมเดลผู้สมัครทั้งหมดที่เลือกโดยการกำหนดเส้นทางอัจฉริยะ กลายเป็นไม่พร้อมใช้งาน
การสำรองทำให้แอปพลิเคชันของคุณพร้อมใช้งานโดยให้เส้นทางสำรองที่เชื่อถือได้
ข้อได้เปรียบหลัก
| ข้อได้เปรียบ | คำอธิบาย |
|---|---|
| ความพร้อมใช้งานสูง | การสลับระบบอัตโนมัติทำให้บริการทำงานต่อไปและลดผลกระทบของ การหยุดทำงาน |
| การสลับที่โปร่งใส | ระบบสลับโมเดลโดยอัตโนมัติ — ไม่ต้องเปลี่ยนแปลงโค้ด แอปพลิเคชัน |
| การกำหนดค่าที่ยืดหยุ่น | รองรับทั้งการกำหนดค่าระดับคำขอและระดับบัญชีสำหรับกรณี การใช้งานที่แตกต่างกัน |
| การเพิ่มประสิทธิภาพต้นทุน | เลือกโมเดลที่คุ้มค่ากว่าเป็นการสำรองเพื่อควบคุม ต้นทุนฉุกเฉิน |
| การจัดการแบบรวมศูนย์ | Configure once at the account level and it applies automatically to every request. |
การกำหนดค่าโมเดลสำรองทั่วไป
BasicRouter รองรับการตั้งค่าโมเดลสำรองทั่วไปจากแบ็กเอนด์คอนโซล คำขอทั้งหมดใช้โมเดลนี้เป็นการสำรองโดยอัตโนมัติเมื่อล้มเหลว
วิธีการกำหนดค่า:
- Go to the หน้าการตั้งค่ากลยุทธ์ BasicRouter.
- ค้นหาการตั้งค่า โมเดลสำรองเริ่มต้น
- เลือกโมเดลสำรองทั่วไปจากรายการแบบเลื่อนลง
- บันทึกการตั้งค่าเพื่อใช้ทันที
ข้อได้เปรียบของการกำหนดค่าทั่วไป:
- ไม่ต้องเปลี่ยนแปลงโค้ด: กำหนดค่าครั้งเดียวและใช้ทั่วโลก โดยไม่ต้องทำซ้ำการตั้งค่าในทุกคำขอ
- การจัดการแบบรวมศูนย์: จัดการนโยบายสำรองในที่เดียวเพื่อ การปรับเปลี่ยนและการติดตามที่ง่ายขึ้น
- การบำรุงรักษาที่ง่ายขึ้น: ลดความซับซ้อนของโค้ดและโอกาส เกิดข้อผิดพลาดในการกำหนดค่า
- การแทนที่ที่ยืดหยุ่น: การกำหนดค่าสำรองระดับคำขอมี ลำดับความสำคัญสูงกว่าและสามารถแทนที่การตั้งค่าทั่วไปสำหรับสถานการณ์เฉพาะ
การกำหนดค่าสำรองระดับคำขอ
สำหรับสถานการณ์ทางธุรกิจเฉพาะ คุณสามารถระบุโมเดลสำรองใน คำขอแต่ละรายการเพื่อแทนที่การกำหนดค่าทั่วไป
ระบุโมเดลสำรองด้วยพารามิเตอร์ router.fallBackModels:
{
"model": "claude-sonnet-4",
"messages": [
{
"role": "user",
"content": "Explain what quantum computing is"
}
],
"router": {
"fallBackModels": ["glm-5.2"]
}
}
กฎลำดับความสำคัญ
เมื่อมีการกำหนดค่าสำรองหลายรายการ ลำดับความสำคัญจะทำงานจากสูงสุดไปยัง ต่ำสุด:
- ระดับคำขอ
router.fallBackModels: โมเดลสำรองที่ระบุในคำขอแต่ละรายการ - โมเดลสำรองเริ่มต้นทั่วไป: โมเดลสำรองทั่วไปที่กำหนดค่า ในคอนโซล
- ไม่มีการสำรอง: หากไม่ได้กำหนดค่าทั้งสองอย่าง คำขอจะส่งกลับข้อผิดพลาด เมื่อล้มเหลว
- หากโมเดลสำรองทั้งหมดล้มเหลว ระบบจะส่งกลับเหตุผลความล้มเหลวจาก โมเดลสุดท้ายที่ลอง
- เมื่อเกิดการสำรอง การตอบกลับจะระบุโมเดลที่ใช้จริง ทำให้ ง่ายต่อการติดตามและวิเคราะห์
การบริหารบัญชี
ขึ้นอยู่กับประเภทบัญชี คอนโซลอาจรวมถึงการเปิดใช้งานโมเดลระดับบัญชี การควบคุมผู้ค้าต่อหรือผู้แจกจ่าย การกำหนดค่าการเรียกเก็บเงิน และการตั้งค่าการเข้าถึง ผู้ดูแลสามารถใช้การควบคุมเหล่านี้เพื่อจัดการการเข้าถึงโมเดล การมองเห็นการใช้งาน และ ความรับผิดชอบการเรียกเก็บเงินให้สอดคล้องกับแอปพลิเคชัน บัญชีลูกค้า หรือหน่วยธุรกิจ
รายการตรวจสอบการดำเนินงานการผลิต
| รายการ | ข้อแนะนำ |
|---|---|
| คีย์ API | ใช้คีย์การผลิตเฉพาะที่มีป้ายกำกับชัดเจน |
| โมเดล | Confirm model availability, pricing, context length, and required capabilities. |
| การกำหนดเส้นทาง | Configure routing aliases or fallback policies for critical workloads. |
| บันทึก | ตรวจสอบให้รหัสคำขอถูกบันทึกในบันทึกแอปพลิเคชัน |
| การเรียกเก็บเงิน | ยืนยันยอดคงเหลือกระเป๋าเงิน สถานะแผน และกฎการหักเครดิต |
| ขีดจำกัดอัตรา | ตรวจสอบขีดจำกัด RPM, TPM, การทำงานพร้อมกัน และงานสื่อระดับบัญชี |
| การแจ้งเตือน | Monitor usage growth, credit balance, errors, and provider availability. |
การเรียกเก็บเงิน & เครดิต
BasicRouter ใช้โมเดลการเรียกเก็บเงินแบบเครดิตสำหรับงานโมเดลข้อความ ภาพ วิดีโอ และ งานอื่นๆ ที่รองรับ เครดิตเป็นหน่วยรวมสำหรับการใช้งานหลายโมเดลและ หลายผู้ให้บริการ เพื่อให้ทีมสามารถจัดการการใช้งานได้อย่างสม่ำเสมอข้ามรูปแบบและ ตระกูล API
ราคาโมเดลโดยละเอียดมีให้ในหน้าโมเดลหรือผ่าน API ข้อมูลเมตาของโมเดล ราคาอาจแตกต่างกันตามโมเดล ผู้ให้บริการ รูปแบบ ความละเอียด ประเภทโทเค็น ความยาวเอาต์พุต ระยะเวลางาน ประเภทบัญชี และข้อตกลงเชิงพาณิชย์
เติมเงิน & กระเป๋าเงิน
บัญชีสามารถเพิ่มเครดิตกระเป๋าเงินจ่ายตามการใช้งานสำหรับการใช้งานที่ยืดหยุ่น เครดิตกระเป๋าเงิน ใช้หลังจากเครดิตแผนรายเดือนและแพ็กเกจทรัพยากรถูกใช้หมด ยกเว้นกฎการเรียกเก็บเงิน แบบกำหนดเองที่ใช้กับบัญชี
เครดิตกระเป๋าเงินไม่หมดอายุ เว้นแต่ระบุไว้เป็นอย่างอื่นในเงื่อนไขทางพาณิชย์ที่บังคับใช้ มีค่าธรรมเนียมบริการเมื่อเติมเงินกระเป๋าเงินจ่ายตามการใช้งาน
แผนรายเดือนและแพ็กเกจทรัพยากร
ผู้ใช้หรือบัญชีแต่ละรายสามารถเลือกแผนรายเดือนที่ใช้งานอยู่หนึ่งแผน แผนรายเดือนให้ ปริมาณความจุการใช้งานที่กำหนด เงื่อนไขทางพาณิชย์ และการกำหนดค่าการเข้าถึง ระดับบัญชีสำหรับรอบการเรียกเก็บเงิน
ผู้ใช้ยังสามารถซื้อแพ็กเกจทรัพยากรหลายแพ็กเกจเพื่อเพิ่มความจุการใช้งาน แพ็กเกจ ทรัพยากรสามารถแยกการใช้งานที่ผูกมัดจากยอดคงเหลือกระเป๋าเงินจ่ายตามการใช้งานและมีประโยชน์สำหรับ การใช้งานข้อความ ภาพ วิดีโอ ปริมาณมาก หรืองานเฉพาะ
ลำดับการหักเงิน
เว้นแต่จะกำหนดค่ากฎการเรียกเก็บเงินแบบกำหนดเอง เครดิตจะถูกหักใน ลำดับต่อไปนี้:
| ลำดับความสำคัญ | แหล่งเครดิต | คำอธิบาย |
|---|---|---|
| 1 | แผนรายเดือน | ความจุการใช้งานรายเดือนที่รวมถูกใช้ก่อน |
| 2 | แพ็กเกจทรัพยากร | แพ็กเกจที่ซื้อเพิ่มถูกใช้หลังเครดิตแผนรายเดือน |
| 3 | กระเป๋าเงินจ่ายตามการใช้งาน | ยอดคงเหลือกระเป๋าเงินถูกใช้หลังเครดิตแผนและแพ็กเกจทรัพยากร |
สำหรับบัญชีที่มีเงื่อนไขทางพาณิชย์แบบกำหนดเอง ลำดับการหักเงิน กฎการหมดอายุ การใช้งาน ที่รวม และราคาอาจแตกต่างกัน กฎเฉพาะบัญชีจะแสดงในคอนโซลหรือ ระบุผ่านข้อตกลงทางพาณิชย์
ราคาที่กำหนดเอง
ราคาสามารถกำหนดเองสำหรับผู้ใช้หรือบัญชีแต่ละราย ลูกค้าองค์กร บัญชีผู้ค้าต่อ บัญชีผู้แจกจ่าย และลูกค้าที่ใช้ปริมาณมากอาจมีสิทธิ์ได้รับราคา กำหนดเอง ติดต่อฝ่ายขายเพื่อขอราคา
ราคากำหนดเองสามารถกำหนดค่าตามบัญชี โมเดล ผู้ให้บริการ รูปแบบ ภูมิภาค ปริมาณ การใช้งาน หรือข้อตกลงทางพาณิชย์ เมื่อเปิดใช้งานราคากำหนดเอง คอนโซลและ API การเรียกเก็บเงินจะแสดงราคาและกฎการหักเงินเฉพาะบัญชีเมื่อมี
หน่วยราคา
โมดอลิตี้โมเดลที่แตกต่างกันใช้หน่วยวัดที่แตกต่างกัน BasicRouter แปลง หน่วยเหล่านี้เป็นเครดิตตามกฎการกำหนดราคาของโมเดล
| รูปแบบ | พื้นฐานราคาทั่วไป |
|---|---|
| ข้อความ | โทเค็นอินพุต โทเค็นเอาต์พุต โทเค็นอ่านแคช โทเค็นเขียนแคช โทเค็น ให้เหตุผล หรือหมวดหมู่โทเค็นเฉพาะโมเดล |
| ภาพ | โมเดล ความละเอียด จำนวนภาพที่สร้าง การใช้ภาพอินพุต โหมดแก้ไข หรือการตั้งค่าคุณภาพ |
| วิดีโอ | โมเดล ความละเอียดเอาต์พุต วินาทีที่สร้าง อัตราส่วนภาพ การใช้ภาพหรือวิดีโอ อินพุต และประเภทงาน |
| การฝัง | โทเค็นอินพุตหรือจำนวนระเบียนการฝัง |
| เสียง | ระยะเวลาอินพุต ระยะเวลาเอาต์พุต ความยาวการถอดเสียง หรือหน่วย เสียงเฉพาะโมเดล |
หน่วยราคาอาจแตกต่างกันตามโมเดล โปรดดูหน้ารายละเอียดโมเดลหรือข้อมูลเมตา ราคาก่อนเปิดใช้งานโมเดลในการผลิตเสมอ
การระบุแหล่งที่มาการใช้งาน
การใช้งาน BasicRouter สามารถตรวจสอบได้ตามบัญชี คีย์ API โมเดล รูปแบบ หรือช่วงเวลา ซึ่งช่วยให้ทีมสามารถระบุต้นทุนให้กับแอปพลิเคชัน สภาพแวดล้อม ลูกค้า หรือ หน่วยธุรกิจภายใน
| มิติข้อมูล | คำอธิบาย |
|---|---|
| API key | จัดกลุ่มการใช้งานตามแอปพลิเคชัน บริการ หรือสภาพแวดล้อม |
| Model | เปรียบเทียบต้นทุนและปริมาณตามโมเดลที่เลือก |
| Resolved model | ตรวจสอบโมเดลจริงที่ใช้หลังการกำหนดเส้นทางหรือการสำรอง |
| รูปแบบ | แยกการใช้งานข้อความ ภาพ วิดีโอ การฝัง และเสียง |
| Time range | ตรวจสอบรอบการรายงานรายวัน รายเดือน หรือกำหนดเอง |
| Metadata | Group usage by custom request metadata such as customer ID, tenant ID, user ID, or environment. |
ยอดเครดิตคงเหลือ
ตรวจสอบจำนวนเครดิตที่พร้อมใช้งานในบัญชีของคุณ ยอดคงเหลือถูกแบ่งเป็น กระเป๋าเงินสามใบที่หักตามลำดับ: เงินช่วยเหลือแผนรายเดือน แพ็กเกจทรัพยากรที่ซื้อ และกระเป๋าเงินจ่ายตามการใช้งาน ยอดรวมทรัพยากรรวม (แผนรายเดือน + แพ็กเกจ ทรัพยากร ไม่รวมจ่ายตามการใช้งาน) ยังมีให้สำหรับติดตามการใช้งานที่รวมแยกจาก การใช้จ่ายเติมเงิน
เพื่อดึงข้อมูลนี้โดยใช้โปรแกรม ดู
GET /v1/billing/balance ใน การอ้างอิง API
รายละเอียดการใช้งาน
ตรวจสอบรายการการใช้งานแต่ละรายการแบบแบ่งหน้าตามลำดับเวลาสำหรับการรายงาน การติดตาม และการจัดสรรต้นทุนภายใน แต่ละรายการแสดงโมเดล ประเภทโมเดล (ข้อความ ภาพ หรือวิดีโอ) เครดิตที่หัก และรายละเอียดว่าการหักแต่ละรายการถูกหักจากกระเป๋าเงินใด ผลลัพธ์สามารถกรองตามช่วงเวลาเฉพาะ
เพื่อดึงข้อมูลนี้โดยใช้โปรแกรม ดู GET /v1/usage ใน
การอ้างอิง API
ประวัติธุรกรรม
ใช้ประวัติธุรกรรมเพื่อตรวจสอบการเคลื่อนไหวของเครดิต รวมถึงการเติมเงิน การจัดสรร แผน การให้แพ็กเกจทรัพยากร การหักการใช้งาน การปรับ และการแก้ไข ทางการบริหาร
เพื่อดึงข้อมูลนี้โดยใช้โปรแกรม ดู
GET /v1/billing/transactions ใน
การอ้างอิง API
คำขอที่ล้มเหลวและการคืนเงิน
ข้อผิดพลาดในการตรวจสอบ ข้อผิดพลาดการรับรองความถูกต้อง และข้อผิดพลาดการอนุญาต มักไม่ถูกเรียกเก็บเงินเพราะไม่มีการดำเนินการโมเดล คำขอที่ถึงโมเดลต้นน้ำหรือ สร้างเอาต์พุตบางส่วนอาจใช้เครดิตขึ้นอยู่กับโมเดล ผู้ให้บริการ และ สถานะการตอบกลับ
สำหรับงานภาพและวิดีโออะซิงโครนัส พฤติกรรมการเรียกเก็บเงินขึ้นอยู่กับว่างานถูก ยอมรับ เริ่ม เสร็จสิ้น ล้มเหลว หรือยกเลิก การตอบกลับรายละเอียดงานรวม ข้อมูลการใช้งานเมื่อเครดิตถูกใช้
การเติมเงิน แผนรายเดือน แพ็กเกจทรัพยากร และเครดิตที่ใช้แล้วไม่สามารถคืนได้ เว้นแต่ ระบุไว้เป็นอย่างอื่นในข้อตกลงทางพาณิชย์ที่บังคับใช้หรือตามที่กฎหมายกำหนด
การอ้างอิง API
ข้อตกลงทั่วไป
URL ฐาน
จุดเชื่อมต่อทั้งหมดให้บริการภายใต้คำนำหน้า /v1
การรับรองความถูกต้อง
การเรียกจุดเชื่อมต่อ /v1/* ใช้การรับรองความถูกต้อง
คีย์ API (ไม่ใช่ JWT) คีย์ API ส่งผ่านส่วนหัวต่อไปนี้:
| ส่วนหัว | รูปแบบ | คำอธิบาย |
|---|---|---|
Authorization | Bearer <api_key> | สไตล์ OpenAI จุดเชื่อมต่อที่เข้ากันได้กับ Anthropic ยังยอมรับ
x-api-key กับ anthropic-version: 2023-06-01 |
คีย์ที่ขาดหายไปหรือไม่ถูกต้องจะส่งกลับ 401
การตรวจสอบยอดคงเหลือล่วงหน้า
จุดเชื่อมต่อเรียกโมเดลทั้งหมดจะตรวจสอบยอดคงเหลือก่อนการดำเนินการ:
- Insufficient balance returns
Insufficient credit, mapped to:- พิธีสาร OpenAI: HTTP
400,code = insufficient_quota - พิธีสาร Anthropic: HTTP
402,type = billing_error
- พิธีสาร OpenAI: HTTP
- จุดเชื่อมต่อบางรายการยังประเมินต้นทุนขั้นต่ำต่อโมเดลสำหรับการตรวจสอบล่วงหน้าครั้งที่สอง
POST https://api.basicrouter.ai/api/v1/chat/completions
จุดเชื่อมต่อที่เข้ากันได้กับ OpenAI Chat Completions รองรับการสตรีมและไม่สตรีม การเรียก เครื่องมือ โหมด JSON และอินพุตหลายรูปแบบ
| ฟิลด์ | ประเภท | จำเป็น | คำอธิบาย |
|---|---|---|---|
model | String | ใช่ | ชื่อโมเดล |
messages | Message[] | ใช่ | ข้อความสนทนา |
stream | Boolean | ไม่ | โหมดสตรีม ค่าเริ่มต้น false |
temperature | Double | ไม่ | อุณหภูมิการสุ่มตัวอย่าง |
max_tokens | Integer | ไม่ | โทเค็นเอาต์พุตสูงสุด |
top_p | Double | ไม่ | การสุ่มตัวอย่างนิวเคลียส |
presence_penalty | Double | ไม่ | — |
frequency_penalty | Double | ไม่ | — |
tools | Tool[] | ไม่ | นิยามเครื่องมือ |
tool_choice | String|Object | ไม่ | auto / none / required / specific
function. |
response_format | Object | ไม่ | {type, json_schema:{name,schema,strict}};
text/json_object/json_schema. |
parallel_tool_calls | Boolean | ไม่ | — |
metadata | Map | ไม่ | ข้อมูลเมตาแบบส่งผ่าน |
Message fields:
| ฟิลด์ | ประเภท | คำอธิบาย |
|---|---|---|
role | String | system / user / assistant /
tool. |
content | String|Array | Plain text or multimodal content block array
([{type:"text",text},{type:"image_url",image_url:{url}}]). |
tool_call_id | String | เชื่อมโยงไปยัง tool_calls เมื่อ role=tool |
tool_calls | ToolCall[] | มีเมื่อ role=assistant เรียกเครื่องมือ |
| ฟิลด์ | ประเภท | คำอธิบาย |
|---|---|---|
type | String | ค่าคงที่ function |
function | Object | นิยามฟังก์ชัน |
function.name | String | ชื่อฟังก์ชัน |
function.description | String | คำอธิบายฟังก์ชัน |
function.parameters | Object | JSON Schema สำหรับอินพุต |
curl --request POST \
--url https://api.basicrouter.ai/api/v1/chat/completions \
--header "Authorization: Bearer $BASICROUTER_API_KEY" \
--header "Content-Type: application/json" \
--data '{
"model": "glm-5.2",
"messages": [{"role": "user", "content": "Describe Hangzhou in one sentence."}],
"stream": false,
"temperature": 0.7
}'
{
"id": "chatcmpl-xxx",
"object": "chat.completion",
"created": 1721380000,
"model": "glm-5.2",
"choices": [
{
"index": 0,
"message": {"role": "assistant", "content": "Hangzhou is ..."},
"finish_reason": "stop"
}
],
"usage": {"prompt_tokens": 12, "completion_tokens": 18, "total_tokens": 30}
}
ฟิลด์การตอบกลับ (ไม่สตรีม):
| ฟิลด์ | ประเภท | คำอธิบาย |
|---|---|---|
id | String | รหัสการเติมเต็ม |
object | String | ค่าคงที่ chat.completion |
created | Long | การประทับเวลาที่สร้าง (วินาที) |
model | String | ชื่อโมเดล |
choices | Choice[] | {index, message:{role, content, tool_calls?}, finish_reason}. |
usage | Object | {prompt_tokens, completion_tokens, total_tokens}. |
| ฟิลด์ | ประเภท | คำอธิบาย |
|---|---|---|
id | String | รหัสการเรียกเครื่องมือ |
type | String | ค่าคงที่ function |
function | Object | รายละเอียดการเรียกฟังก์ชัน |
function.name | String | ชื่อฟังก์ชัน |
function.arguments | Object | อาร์กิวเมนต์ฟังก์ชัน |
ตัวอย่างการตอบกลับแบบสตรีม:
data: {"object":"chat.completion.chunk","choices":[{"delta":{"role":"assistant","content":"..."}}]}
data: {"object":"chat.completion.chunk","choices":[{"delta":{"content":"..."}}]}
data: [DONE]
POST https://api.basicrouter.ai/api/v1/responses
จุดเชื่อมต่อที่เข้ากันได้กับ OpenAI Responses ใช้ input แทน
messages instructions แทนข้อความระบบ และ บล็อก
text แทน response_format
| ฟิลด์ | ประเภท | จำเป็น | คำอธิบาย |
|---|---|---|---|
model | String | ใช่ | ชื่อโมเดล |
input | String|Array | ใช่ | สตริงธรรมดา (ข้อความผู้ใช้) หรืออาร์เรย์ออบเจ็กต์ข้อความ |
instructions | String | ไม่ | พร้อมต์ระบบ |
stream | Boolean | ไม่ | ค่าเริ่มต้น false |
max_output_tokens | Integer | ไม่ | โทเค็นเอาต์พุตสูงสุด |
temperature | Double | ไม่ | ค่าเริ่มต้น 1 |
top_p | Double | ไม่ | — |
tools | Tool[] | ไม่ | ระดับบน {type, name, description, parameters} |
tool_choice | String|Object | ไม่ | auto/none/required/{type,name}. |
text | Object | ไม่ | {format:{type, name, schema, strict}};
text/json_object/json_schema. |
metadata | Map | ไม่ | — |
previous_response_id | String | ไม่ | รหัสการตอบกลับก่อนหน้าสำหรับหลายรอบ |
parallel_tool_calls | Boolean | ไม่ | — |
curl --request POST \
--url https://api.basicrouter.ai/api/v1/responses \
--header "Authorization: Bearer $BASICROUTER_API_KEY" \
--header "Content-Type: application/json" \
--data '{
"model": "glm-5.2",
"input": "Describe Hangzhou in one sentence.",
"instructions": "Be concise.",
"stream": false
}'
{
"id": "resp_xxx",
"object": "response",
"model": "glm-5.2",
"status": "completed",
"created_at": 1721380000,
"output": [
{
"id": "msg_xxx",
"type": "message",
"role": "assistant",
"content": [{"type": "output_text", "text": "Hangzhou is ..."}],
"status": "completed"
}
],
"usage": {"input_tokens": 12, "output_tokens": 18, "total_tokens": 30}
}
ฟิลด์การตอบกลับ (ไม่สตรีม):
| ฟิลด์ | ประเภท | คำอธิบาย |
|---|---|---|
id | String | รหัสการตอบกลับ |
object | String | ค่าคงที่ response |
model | String | ชื่อโมเดล |
status | String | เช่น completed |
created_at | Long | การประทับเวลาที่สร้าง (วินาที) |
output | Array | Output items. Message items:
{id, type:"message", role, content:[{type:"output_text",
text}], status}. Tool-call items:
{type:"function_call", id, name, call_id, arguments, status}. |
usage | Object | {input_tokens, output_tokens, total_tokens}. For Claude models,
input_tokens includes cache_read and
output_tokens includes cache_write. |
การสตรีมตามเหตุการณ์ API Responses:
| เหตุการณ์ | คำอธิบาย |
|---|---|
response.created | จุดเริ่มต้นของสตรีมการตอบกลับ |
response.output_text.delta | การอัปเดตเอาต์พุตข้อความแบบเพิ่มขึ้น |
response.completed | จุดสิ้นสุดของสตรีมการตอบกลับ |
POST https://api.basicrouter.ai/api/v1/messages
จุดเชื่อมต่อที่เข้ากันได้กับ Anthropic Messages ยอมรับส่วนหัว
x-api-key และ anthropic-version: 2023-06-01 บล็อกเนื้อหารองรับ
text, image, tool_use, tool_result,
thinking และ redacted_thinking
| ฟิลด์ | ประเภท | จำเป็น | ฟิลด์ JSON | คำอธิบาย |
|---|---|---|---|---|
model | String | ใช่ | model | ชื่อโมเดล |
messages | Message[] | ใช่ | messages | ข้อความสนทนา |
system | String|Array | ไม่ | system | พร้อมต์ระบบ สตริงหรือ [{type,text}] |
maxTokens | Integer | ใช่ | max_tokens | โทเค็นเอาต์พุตสูงสุด |
stream | Boolean | ไม่ | stream | การสตรีม |
temperature | Double | ไม่ | temperature | — |
topP | Double | ไม่ | top_p | — |
topK | Integer | ไม่ | top_k | — |
tools | Tool[] | ไม่ | tools | นิยามเครื่องมือ (input_schema) |
toolChoice | Object | ไม่ | tool_choice | — |
metadata | Map | ไม่ | metadata | — |
thinking | Object | ไม่ | thinking | การกำหนดค่าการคิดแบบขยาย |
stopSequences | Object | ไม่ | stop_sequences | — |
anthropicBeta | Object | ไม่ | anthropic_beta | ส่วนหัวฟีเจอร์เบต้า |
| ฟิลด์ | ประเภท | คำอธิบาย |
|---|---|---|
role | String | บทบาทข้อความ เช่น user / assistant |
content | String|ContentBlock[] | ข้อความธรรมดาหรืออาร์เรย์ของบล็อกเนื้อหา |
| ฟิลด์ | ประเภท | คำอธิบาย |
|---|---|---|
type | String | One of text, image, tool_use,
tool_result, thinking,
redacted_thinking. |
text | String | มีเมื่อ type เป็น text |
source | Object | มีเมื่อ type เป็น image |
ตัวอย่างบล็อกภาพ:
{ "type": "image", "source": { "type": "base64", "media_type": "...", "data": "..." } }
{ "type": "image", "source": { "type": "url", "url": "..." } }
| ฟิลด์ | ประเภท | คำอธิบาย |
|---|---|---|
name | String | ชื่อฟังก์ชัน |
description | String | คำอธิบายฟังก์ชัน |
input_schema | Object | JSON Schema สำหรับอินพุต |
cache_control | Object | การควบคุมแคชที่เลือกได้ |
curl --request POST \
--url https://api.basicrouter.ai/api/v1/messages \
--header "Authorization: Bearer $BASICROUTER_API_KEY" \
--header "anthropic-version: 2023-06-01" \
--header "Content-Type: application/json" \
--data '{
"model": "claude-sonnet-4.6",
"max_tokens": 1024,
"messages": [{"role": "user", "content": "Describe Hangzhou in one sentence."}]
}'
{
"id": "msg_xxx",
"type": "message",
"role": "assistant",
"model": "claude-sonnet-4.6",
"content": [{"type": "text", "text": "Hangzhou is ..."}],
"stop_reason": "end_turn",
"usage": {"input_tokens": 12, "output_tokens": 18}
}
ฟิลด์การตอบกลับ (ไม่สตรีม):
| ฟิลด์ | ประเภท | คำอธิบาย |
|---|---|---|
id | String | รหัสข้อความ |
type | String | ค่าคงที่ message |
role | String | ค่าคงที่ assistant |
model | String | ชื่อโมเดล |
content | ContentBlock[] | Response content blocks (e.g. {type:"text", text},
{type:"tool_use", ...}). |
stop_reason | String | e.g. end_turn, tool_use, max_tokens. |
usage | Object | {input_tokens, output_tokens} |
| เหตุการณ์ | คำอธิบาย |
|---|---|
message_start | จุดเริ่มต้นของสตรีมข้อความ |
content_block_start | จุดเริ่มต้นของบล็อกเนื้อหาใหม่ |
content_block_delta | การอัปเดตแบบเพิ่มขึ้นสำหรับบล็อกเนื้อหา |
content_block_stop | จุดสิ้นสุดของบล็อกเนื้อหา |
message_delta | การอัปเดตแบบเพิ่มขึ้นสำหรับข้อความ |
message_stop | จุดสิ้นสุดของสตรีมข้อความ |
GET https://api.basicrouter.ai/api/v1/models
ส่งคืนโมเดล API ที่ออนไลน์และเปิดใช้งานทั้งหมด
curl --request GET \
--url https://api.basicrouter.ai/api/v1/models \
--header "Authorization: Bearer $BASICROUTER_API_KEY"
{
"object": "list",
"data": [
{
"id": "glm-5.2",
"object": "model",
"display_name": "glm-5.2",
"created": 1721380000,
"owned_by": "Zai",
"input_modalities": ["text", "image"],
"output_modalities": ["text"],
"context_length": 128000
}
]
}
ฟิลด์ของแต่ละรายการโมเดล (data[]):
| ฟิลด์ | ประเภท | คำอธิบาย |
|---|---|---|
id | String | รหัสโมเดล |
object | String | ค่าคงที่ model |
display_name | String | ชื่อที่แสดง |
created | Long | การประทับเวลาที่สร้าง (วินาที) |
owned_by | String | เจ้าของ / ผู้ผลิต |
input_modalities | String[] | e.g. ["text","image"]. |
output_modalities | String[] | เช่น ["text"] |
context_length | Integer | ความยาวบริบทสูงสุด |
GET https://api.basicrouter.ai/api/v1/models/{model}
ส่งคืนโมเดลเดียวที่มีรูปร่างเดียวกับรายการในรายการ ส่งกลับ HTTP 404 เมื่อ โมเดลไม่มีอยู่
curl --request GET \
--url https://api.basicrouter.ai/api/v1/models/gpt-5.5 \
--header "Authorization: Bearer $BASICROUTER_API_KEY"
การตอบกลับสำเร็จ: ออบเจ็กต์โมเดลเดียวที่มีฟิลด์เดียวกันกับ รายการใน
/v1/models
เมื่อโมเดลไม่มีอยู่ จะส่งกลับ HTTP 404:
{"error": {"message": "The model 'xxx' does not exist", "type": "invalid_request_error", "code": "invalid_model_error"}}
GET https://api.basicrouter.ai/api/v1/image-models
สอบถามความละเอียด อัตราส่วน และจำนวนสูงสุดที่รองรับโดยโมเดลภาพก่อน เรียก
/v1/image-generations ไม่ต้องรับรองความถูกต้อง
| ฟิลด์ | ประเภท | คำอธิบาย |
|---|---|---|
id | String | รหัสโมเดล |
object | String | ค่าคงที่ image_model |
displayName | String | ชื่อที่แสดง |
description | String | คำอธิบายโมเดล |
icon | String | URL ไอคอน |
created | Long | การประทับเวลาที่สร้าง (วินาที) |
maxCount | Integer | ภาพสูงสุดต่อคำขอ |
fileMax | Integer | ภาพอ้างอิงสูงสุด |
resolutions | String[] | Supported resolutions, e.g.
["720p","1080p"]. |
ratios | String[] | Supported aspect ratios, e.g.
["1:1","3:2"]. |
curl --request GET \
--url https://api.basicrouter.ai/api/v1/image-models \
--header "Authorization: Bearer $BASICROUTER_API_KEY"
{
"object": "list",
"data": [
{
"id": "gpt-image-2",
"object": "image_model",
"displayName": "GPT Image 1",
"description": "...",
"icon": "...",
"created": 1721380000,
"maxCount": 4,
"fileMax": 10,
"resolutions": ["720p", "1080p"],
"ratios": ["1:1", "3:2"]
}
]
}
GET https://api.basicrouter.ai/api/v1/video-models
สอบถามค่า videoType ที่รองรับ ช่วงระยะเวลา ความละเอียด และ
อัตราส่วนสำหรับโมเดลวิดีโอก่อนเรียก /v1/video-generations ไม่
ต้องรับรองความถูกต้อง
| ฟิลด์ | ประเภท | คำอธิบาย |
|---|---|---|
id | String | รหัสโมเดล |
object | String | ค่าคงที่ video_model |
displayName | String | ชื่อที่แสดง |
description | String | คำอธิบายโมเดล |
icon | String | URL ไอคอน |
created | Long | การประทับเวลาที่สร้าง (วินาที) |
allowedVideoTypes | VideoTypeOption[] | รายการ videoType ที่รองรับ |
videoDurationMin | Integer | วินาทีขั้นต่ำต่อคลิป |
videoDurationMax | Integer | วินาทีสูงสุดต่อคลิป |
videoDurationSuggest | Integer[] | ขั้นระยะเวลาที่แนะนำ เช่น [5,8,10] |
resolutions | String[] | ความละเอียดที่รองรับ |
ratios | String[] | อัตราส่วนภาพที่รองรับ |
resolutionOptions | ResolutionOption[] | ชุดค่าผสมความละเอียด+อัตราส่วน+ขนาดแบบโครงสร้าง |
fileMax | Integer | เนื้อหาอ้างอิงสูงสุด |
VideoTypeOption fields:
| ฟิลด์ | ประเภท | คำอธิบาย |
|---|---|---|
code | Integer | The videoType value to pass to
/v1/video-generations. |
name | String | ชื่อประเภทที่แปลแล้ว (ข้อความเป็นวิดีโอ / ภาพเป็นวิดีโอ / ...) |
curl --request GET \
--url https://api.basicrouter.ai/api/v1/video-models \
--header "Authorization: Bearer $BASICROUTER_API_KEY"
{
"object": "list",
"data": [
{
"id": "sora-2",
"object": "video_model",
"displayName": "Sora 2",
"description": "...",
"icon": "...",
"created": 1721380000,
"allowedVideoTypes": [
{"code": 1, "name": "text-to-video"},
{"code": 2, "name": "image-to-video"},
{"code": 3, "name": "image-to-video (first/last frame)"}
],
"videoDurationMin": 5,
"videoDurationMax": 10,
"videoDurationSuggest": [5, 8, 10],
"resolutions": ["1080p", "720p"],
"ratios": ["16:9", "9:16"],
"fileMax": 5
}
]
}
POST https://api.basicrouter.ai/api/v1/image-generations
ส่งงานสร้างภาพแบบอะซิงโครนัส ส่งคืน taskId
ทันที ดึงผลลัพธ์โดยโพล
GET /v1/image-generations/{taskId} หรือผ่าน เว็บฮุก
callbackUrl
model ค่า resolution / ratio ที่รองรับ
ขีดจำกัดบน count และขีดจำกัดการอัปโหลดภาพอ้างอิง (fileMax)
ต้องได้รับจาก GET /v1/image-models ก่อน
ยอมรับเฉพาะค่า ที่ระบุในสเปกของโมเดลนั้นเท่านั้น
| ฟิลด์ | ประเภท | จำเป็น | คำอธิบาย |
|---|---|---|---|
text | String | ใช่ | พร้อมต์ |
model | String | ใช่ | ชื่อโมเดล |
imageUrls | String[] | ไม่ | URL ภาพอ้างอิง (ภาพเป็นภาพ) |
count | Integer | ไม่ | จำนวนภาพ (≥0) |
resolution | String | ไม่ | ความละเอียด (ดู /v1/image-models) |
ratio | String | ไม่ | อัตราส่วนภาพ |
callbackUrl | String | ไม่ | URL เว็บฮุกระดับงาน |
curl --request POST \
--url https://api.basicrouter.ai/api/v1/image-generations \
--header "Authorization: Bearer $BASICROUTER_API_KEY" \
--header "Content-Type: application/json" \
--data '{
"model": "seedream-4.5",
"text": "A cat drinking water by the river",
"count": 1,
"resolution": "2k",
"ratio": "1:1",
"imageUrls": []
}'
{
"code": 200,
"message": "image task is commit",
"data": {"taskId": "img_xxx"}
}
การตอบกลับข้อผิดพลาด:
// Insufficient credit
{ "code": 500, "message": "Insufficient credit" }
// Model not found
{ "code": 404, "message": "Model not found: xxx" }
GET https://api.basicrouter.ai/api/v1/image-generations/{taskId}
โพลงานสร้างภาพ status คือ pending / success /
failed images เป็นอาร์เรย์ URL ของภาพที่แปลงเป็นสตริง JSON
text มีคำอธิบายข้อความที่โมเดลแนบมา (เช่น เอาต์พุตหลายรูปแบบของ Gemini)
หากไม่มีจะเป็น null
curl --request GET \
--url https://api.basicrouter.ai/api/v1/image-generations/img_xxx \
--header "Authorization: Bearer $BASICROUTER_API_KEY"
{
"code": 200,
"message": "success",
"data": {
"taskId": "img_xxx",
"status": "success",
"errorMessage": null,
"images": "[\"https://.../1.png\"]",
"text": null
}
}
ฟิลด์ data การตอบกลับ:
| ฟิลด์ | ประเภท | คำอธิบาย |
|---|---|---|
taskId | String | รหัสงาน |
status | String | pending / success / failed. |
errorMessage | String | เหตุผลความล้มเหลว null เมื่อสำเร็จ |
images | String | JSON-stringified array of image URLs, e.g.
"[\"https://.../1.png\"]". |
text | String | Model-attached text description (e.g. Gemini multimodal output);
null otherwise. |
ไม่พบงาน:
{ "code": 500, "message": "task not found" }
หากระบุ callbackUrl ไว้ตอนส่ง เซิร์ฟเวอร์จะส่งผลลัพธ์
success / failed ขั้นสุดท้ายผ่านเว็บฮุกด้วยรูปแบบ
data เดียวกัน
ตัวอย่างแบบเต็ม (ส่ง + โพล)
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.time.Duration;
public class ImageGenerationExample {
private static final String BASE = "https://api.basicrouter.ai/api/v1";
private static final String API_KEY = System.getenv("BASICROUTER_API_KEY");
public static void main(String[] args) throws Exception {
HttpClient http = HttpClient.newBuilder()
.connectTimeout(Duration.ofSeconds(10)).build();
// 1. Submit the task.
String body = "{"
+ "\"model\":\"seedream-4.5\","
+ "\"text\":\"A cat drinking water by the river\","
+ "\"count\":1,"
+ "\"resolution\":\"2k\","
+ "\"ratio\":\"1:1\","
+ "\"imageUrls\":[]"
+ "}";
HttpResponse<String> submit = http.send(
HttpRequest.newBuilder(URI.create(BASE + "/image-generations"))
.header("Authorization", "Bearer " + API_KEY)
.header("Content-Type", "application/json")
.POST(HttpRequest.BodyPublishers.ofString(body)).build(),
HttpResponse.BodyHandlers.ofString());
String taskId = extract(submit.body(), "taskId");
System.out.println("taskId = " + taskId);
// 2. Poll until terminal status.
String status = "pending";
while ("pending".equals(status)) {
Thread.sleep(15_000L);
HttpResponse<String> poll = http.send(
HttpRequest.newBuilder(URI.create(BASE + "/image-generations/" + taskId))
.header("Authorization", "Bearer " + API_KEY).GET().build(),
HttpResponse.BodyHandlers.ofString());
status = extract(poll.body(), "status");
System.out.println("status = " + status);
}
if (!"success".equals(status)) {
throw new RuntimeException("image generation failed: " + status);
}
// images is a JSON-stringified array of URLs.
String images = extract(pollResult(http, taskId), "images");
System.out.println("images = " + images);
}
// Minimal JSON field extractor — use Jackson/Gson in production.
private static String extract(String json, String field) {
int i = json.indexOf("\"" + field + "\":");
if (i < 0) return null;
i += field.length() + 3;
if (json.charAt(i) == '\"') {
int end = json.indexOf('\"', i + 1);
return json.substring(i + 1, end);
}
int end = i;
while (end < json.length() && "0123456789.".indexOf(json.charAt(end)) >= 0) end++;
return json.substring(i, end);
}
private static String pollResult(HttpClient http, String taskId) throws Exception {
return http.send(HttpRequest.newBuilder(URI.create(BASE + "/image-generations/" + taskId))
.header("Authorization", "Bearer " + API_KEY).GET().build(),
HttpResponse.BodyHandlers.ofString()).body();
}
}
import os
import time
import requests
BASE = "https://api.basicrouter.ai/api/v1"
HEADERS = {"Authorization": f"Bearer {os.environ['BASICROUTER_API_KEY']}"}
# 1. Submit the task.
resp = requests.post(
f"{BASE}/image-generations",
headers={**HEADERS, "Content-Type": "application/json"},
json={
"model": "seedream-4.5",
"text": "A cat drinking water by the river",
"count": 1,
"resolution": "2k",
"ratio": "1:1",
"imageUrls": [],
},
)
resp.raise_for_status()
task_id = resp.json()["data"]["taskId"]
print(f"taskId = {task_id}")
# 2. Poll until terminal status.
while True:
time.sleep(15)
poll = requests.get(f"{BASE}/image-generations/{task_id}", headers=HEADERS)
poll.raise_for_status()
data = poll.json()["data"]
status = data["status"]
print(f"status = {status}")
if status != "pending":
break
if status != "success":
raise RuntimeError(f"image generation failed: {data.get('errorMessage')}")
# images is a JSON-stringified array of URLs.
import json
images = json.loads(data["images"])
print(f"images = {images}")
POST https://api.basicrouter.ai/api/v1/video-generations
ส่งงานสร้างวิดีโอแบบอะซิงโครนัส ส่งคืน taskId
ทันที ดึงผลลัพธ์โดยโพล
GET /v1/video-generations/{taskId} หรือผ่าน เว็บฮุก
callbackUrl
model ค่า videoType ที่อนุญาต ช่วงระยะเวลา
(videoDurationMin/Max) resolution /
ratio ที่รองรับ และขีดจำกัดการอัปโหลดเนื้อหาอ้างอิง (fileMax)
ต้อง ได้รับจาก GET /v1/video-models ก่อน
ยอมรับเฉพาะ รหัส videoType ที่ระบุใน
allowedVideoTypes ของโมเดลนั้นเท่านั้น
| ฟิลด์ | ประเภท | จำเป็น | คำอธิบาย |
|---|---|---|---|
text | String | ใช่ | พร้อมต์ |
model | String | ใช่ | ชื่อโมเดล |
videoType | Integer | ใช่ | 1 text-to-video / 2 image-to-video (first frame) / 3 image-to-video (first+last frame) / 4 image-to-video (reference) / 5 all reference. |
imageUrls | String[] | ไม่ | URL เนื้อหาภาพ |
videoUrls | VideoUrl[]|String[] | ไม่ | URL เนื้อหาวิดีโอ |
audioUrls | String[] | ไม่ | URL เนื้อหาเสียง |
resolution | String | ไม่ | ความละเอียด |
ratio | String | ไม่ | อัตราส่วนภาพ |
duration | Long | ไม่ | วินาที (>0) |
callbackUrl | String | ไม่ | URL เว็บฮุกระดับงาน |
ตัวอย่างสำหรับแต่ละ videoType:
1. ข้อความเป็นวิดีโอ (videoType=1)
สร้างวิดีโอจากพร้อมต์ข้อความเท่านั้น ไม่ต้องมีเนื้อหาอ้างอิง
curl --request POST \
--url https://api.basicrouter.ai/api/v1/video-generations \
--header "Authorization: Bearer $BASICROUTER_API_KEY" \
--header "Content-Type: application/json" \
--data '{
"videoType": 1,
"text": "A cat jumping on a bed",
"resolution": "480p",
"ratio": "16:9",
"duration": 4,
"model": "seedance-2.0"
}'
2. ภาพเป็นวิดีโอ - เฟรมแรก (videoType=2)
ระบุเฟรมเริ่มต้นเดียวใน imageUrls โมเดลจะสร้างวิดีโอ เริ่มจากเฟรมนั้น
curl --request POST \
--url https://api.basicrouter.ai/api/v1/video-generations \
--header "Authorization: Bearer $BASICROUTER_API_KEY" \
--header "Content-Type: application/json" \
--data '{
"videoType": 2,
"text": "Happily shaking head",
"resolution": "480p",
"ratio": "16:9",
"duration": 4,
"model": "seedance-2.0",
"imageUrls": ["https://basicrouter-flie.oss-accelerate.aliyuncs.com/test/first-frame.png"]
}'
3. ภาพเป็นวิดีโอ - เฟรมแรกและสุดท้าย (videoType=3)
ระบุทั้งเฟรมแรกและสุดท้ายใน imageUrls (ลำดับ: [first, last])
โมเดลจะสร้างวิดีโอเปลี่ยนผ่านระหว่างสอง เฟรม
curl --request POST \
--url https://api.basicrouter.ai/api/v1/video-generations \
--header "Authorization: Bearer $BASICROUTER_API_KEY" \
--header "Content-Type: application/json" \
--data '{
"videoType": 3,
"text": "Put on the hat",
"resolution": "480p",
"ratio": "16:9",
"duration": 4,
"model": "seedance-2.0",
"imageUrls": [
"https://basicrouter-flie.oss-accelerate.aliyuncs.com/test/first-frame.png",
"https://basicrouter-flie.oss-accelerate.aliyuncs.com/test/last-frame.png"
]
}'
4. ภาพเป็นวิดีโอ - อ้างอิง (videoType=4)
ระบุภาพอ้างอิงหนึ่งภาพขึ้นไปใน imageUrls โมเดลจะใช้
สไตล์/เนื้อหาเป็นอ้างอิง (ไม่ใช่เฟรมแรก/สุดท้ายที่บังคับ) เพื่อสร้างวิดีโอ
curl --request POST \
--url https://api.basicrouter.ai/api/v1/video-generations \
--header "Authorization: Bearer $BASICROUTER_API_KEY" \
--header "Content-Type: application/json" \
--data '{
"videoType": 4,
"text": "Two cats playing together",
"resolution": "480p",
"ratio": "16:9",
"duration": 4,
"model": "kling-v3-omni-video",
"imageUrls": [
"https://basicrouter-flie.oss-accelerate.aliyuncs.com/test/ref-1.png",
"https://basicrouter-flie.oss-accelerate.aliyuncs.com/test/ref-2.png"
]
}'
5. อ้างอิงทั้งหมด (videoType=5)
อ้างอิงภาพ / วิดีโอ / เสียงแบบผสม อ้างอิงเนื้อหาตามตำแหน่งในพร้อมต์: รายการ ที่ 1 ใน
imageUrls คือ @图片 1 รายการที่ 1 ใน
videoUrls คือ @视频 1 รายการที่ 1 ใน
audioUrls คือ @音频 1 videoUrls ยังยอมรับสตริง
URL แบบธรรมดา
curl --request POST \
--url https://api.basicrouter.ai/api/v1/video-generations \
--header "Authorization: Bearer $BASICROUTER_API_KEY" \
--header "Content-Type: application/json" \
--data '{
"videoType": 5,
"text": "Use the first-person framing of @视频 1 and @音频 1 as background music. First-person tea ad; start frame is @图片 1 ... end frame is @图片 2.",
"model": "seedance-2.0",
"imageUrls": [
"https://ark-project.tos-cn-beijing.volces.com/doc_image/r2v_tea_pic1.jpg",
"https://ark-project.tos-cn-beijing.volces.com/doc_image/r2v_tea_pic2.jpg"
],
"videoUrls": ["https://ark-project.tos-cn-beijing.volces.com/doc_video/r2v_tea_video1.mp4"],
"audioUrls": ["https://ark-project.tos-cn-beijing.volces.com/doc_audio/r2v_tea_audio1.mp3"],
"resolution": "1080p",
"ratio": "16:9",
"duration": 11
}'
การตอบกลับการส่ง (ทั้งห้าประเภท):
{
"code": 200,
"message": "success",
"data": {"taskId": "vid_xxx"}
}
GET https://api.basicrouter.ai/api/v1/video-generations/{taskId}
โพลงานสร้างวิดีโอ status คือ pending / success /
failed videoUrl คือ URL ของวิดีโอที่สร้างขึ้น และ
lastFrameUrl คือ URL ของเฟรมสุดท้าย (สถานการณ์ภาพเป็นวิดีโอ)
curl --request GET \
--url https://api.basicrouter.ai/api/v1/video-generations/vid_xxx \
--header "Authorization: Bearer $BASICROUTER_API_KEY"
{
"code": 200,
"message": "success",
"data": {
"status": "success",
"videoUrl": "https://.../out.mp4",
"lastFrameUrl": null,
"message": null
}
}
ฟิลด์ data การตอบกลับ:
| ฟิลด์ | ประเภท | คำอธิบาย |
|---|---|---|
status | String | pending / success / failed. |
videoUrl | String | URL วิดีโอที่สร้าง |
lastFrameUrl | String | Last-frame URL (image-to-video scenarios); null otherwise. |
message | String | เหตุผลความล้มเหลว null เมื่อสำเร็จ |
หากระบุ callbackUrl ไว้ตอนส่ง เซิร์ฟเวอร์จะส่งผลลัพธ์ขั้นสุดท้าย
ผ่านเว็บฮุกด้วยรูปแบบ data เดียวกัน
ตัวอย่างแบบเต็ม (ส่ง + โพล)
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.time.Duration;
public class VideoGenerationExample {
private static final String BASE = "https://api.basicrouter.ai/api/v1";
private static final String API_KEY = System.getenv("BASICROUTER_API_KEY");
public static void main(String[] args) throws Exception {
HttpClient http = HttpClient.newBuilder()
.connectTimeout(Duration.ofSeconds(10)).build();
// 1. Submit the task (videoType=1: text-to-video).
String body = "{"
+ "\"videoType\":1,"
+ "\"text\":\"A cat jumping on a bed\","
+ "\"resolution\":\"480p\","
+ "\"ratio\":\"16:9\","
+ "\"duration\":4,"
+ "\"model\":\"seedance-2.0\""
+ "}";
HttpResponse<String> submit = http.send(
HttpRequest.newBuilder(URI.create(BASE + "/video-generations"))
.header("Authorization", "Bearer " + API_KEY)
.header("Content-Type", "application/json")
.POST(HttpRequest.BodyPublishers.ofString(body)).build(),
HttpResponse.BodyHandlers.ofString());
String taskId = extract(submit.body(), "taskId");
System.out.println("taskId = " + taskId);
// 2. Poll until terminal status. Video tasks take longer — poll every 20s.
String status = "pending";
String lastBody = null;
while ("pending".equals(status)) {
Thread.sleep(20_000L);
HttpResponse<String> poll = http.send(
HttpRequest.newBuilder(URI.create(BASE + "/video-generations/" + taskId))
.header("Authorization", "Bearer " + API_KEY).GET().build(),
HttpResponse.BodyHandlers.ofString());
lastBody = poll.body();
status = extract(lastBody, "status");
System.out.println("status = " + status);
}
if (!"success".equals(status)) {
throw new RuntimeException("video generation failed: " + status);
}
String videoUrl = extract(lastBody, "videoUrl");
System.out.println("videoUrl = " + videoUrl);
}
// Minimal JSON field extractor — use Jackson/Gson in production.
private static String extract(String json, String field) {
int i = json.indexOf("\"" + field + "\":");
if (i < 0) return null;
i += field.length() + 3;
if (json.charAt(i) == '\"') {
int end = json.indexOf('\"', i + 1);
return json.substring(i + 1, end);
}
int end = i;
while (end < json.length() && "0123456789.".indexOf(json.charAt(end)) >= 0) end++;
return json.substring(i, end);
}
}
import os
import time
import requests
BASE = "https://api.basicrouter.ai/api/v1"
HEADERS = {"Authorization": f"Bearer {os.environ['BASICROUTER_API_KEY']}"}
# 1. Submit the task (videoType=1: text-to-video).
resp = requests.post(
f"{BASE}/video-generations",
headers={**HEADERS, "Content-Type": "application/json"},
json={
"videoType": 1,
"text": "A cat jumping on a bed",
"resolution": "480p",
"ratio": "16:9",
"duration": 4,
"model": "seedance-2.0",
},
)
resp.raise_for_status()
task_id = resp.json()["data"]["taskId"]
print(f"taskId = {task_id}")
# 2. Poll until terminal status. Video tasks take longer — poll every 20s.
while True:
time.sleep(20)
poll = requests.get(f"{BASE}/video-generations/{task_id}", headers=HEADERS)
poll.raise_for_status()
data = poll.json()["data"]
status = data["status"]
print(f"status = {status}")
if status != "pending":
break
if status != "success":
raise RuntimeError(f"video generation failed: {data.get('message')}")
print(f"videoUrl = {data['videoUrl']}")
if data.get("lastFrameUrl"):
print(f"lastFrameUrl = {data['lastFrameUrl']}")
GET https://api.basicrouter.ai/api/v1/billing/balance
ส่งคืนยอดคงเหลือบัญชีแบ่งเป็นกระเป๋าเงินสามใบ: แผนรายเดือน แพ็กเกจทรัพยากร และ เครดิตจ่ายตามการใช้งาน
curl --request GET \
--url https://api.basicrouter.ai/api/v1/billing/balance \
--header "Authorization: Bearer $BASICROUTER_API_KEY"
{
"totalCredit": 128.50,
"totalResourceCredit": 30.00,
"wallets": {
"monthlyPlan": {"id": "pkg_xxx", "credit": 50.00, "name": "Monthly plan"},
"resourcePacks": [
{"id": "rp_xxx", "credit": 30.00, "name": "Video resource pack"}
],
"payAsYouGo": 48.50
}
}
ฟิลด์การตอบกลับ:
| ฟิลด์ | ประเภท | คำอธิบาย |
|---|---|---|
totalCredit | BigDecimal | ยอดคงเหลือรวม |
totalResourceCredit | BigDecimal | ผลรวมยอดคงเหลือแพ็กเกจทรัพยากร |
wallets.monthlyPlan | WalletDetail | แผนรายเดือน (null หากไม่มี) |
wallets.resourcePacks | WalletDetail[] | รายการแพ็กเกจทรัพยากร |
wallets.payAsYouGo | BigDecimal | ยอดคงเหลือจ่ายตามการใช้งาน |
WalletDetailVO fields::
| ฟิลด์ | ประเภท | คำอธิบาย |
|---|---|---|
id | String | รหัสกระเป๋าเงิน |
credit | BigDecimal | เครดิตคงเหลือ |
name | String | ชื่อกระเป๋าเงิน |
GET https://api.basicrouter.ai/api/v1/usage
รายละเอียดการเรียกเก็บเงินการเรียกโมเดลแบบแบ่งหน้า สแนปชอตตามราคา
(priceSnapshotId) เรียงตามเวลาสร้างคำสั่งซื้อจากมากไปน้อย ส่งคืนเฉพาะ
ระเบียนค่าใช้จ่ายปกติ (reason = model usage) เท่านั้น
พารามิเตอร์การค้นหา:
| พารามิเตอร์ | ประเภท | จำเป็น | ค่าเริ่มต้น | คำอธิบาย |
|---|---|---|---|---|
page | Integer | ไม่ | 1 | หมายเลขหน้า เริ่มจาก 1 |
size | Integer | ไม่ | 20 | ขนาดหน้า (แบ่งหน้าตาม priceSnapshotId) |
startTime | LocalDateTime | ไม่ | — | Start time, format yyyy-MM-ddTHH:mm:ss, filters by snapshot
orderCreatedAt. |
endTime | LocalDateTime | ไม่ | — | เวลาสิ้นสุด รูปแบบ yyyy-MM-ddTHH:mm:ss |
curl --request GET \
--url "https://api.basicrouter.ai/api/v1/usage?page=1&size=20&startTime=2026-07-01T00:00:00&endTime=2026-07-31T23:59:59" \
--header "Authorization: Bearer $BASICROUTER_API_KEY"
ตัวห่อหุ้มการตอบกลับ:
{
"code": 0,
"message": "success",
"data": { ... }
}
| ฟิลด์ | ประเภท | คำอธิบาย |
|---|---|---|
records | UsageDetailVO[] | ระเบียนหน้าปัจจุบัน |
total | Long | จำนวนรวม |
current | Long | หน้าปัจจุบัน |
size | Long | ขนาดหน้า |
pages | Long | หน้าทั้งหมด |
UsageDetailVO fields:
| ฟิลด์ | ประเภท | คำอธิบาย |
|---|---|---|
priceSnapshotId | String | รหัสสแนปชอตราคา |
taskId | String | รหัสงาน |
credit | BigDecimal | จำนวนเงินที่เรียกเก็บ |
model | String | ชื่อโมเดล |
modelType | String | text / image / video. |
inputTokens | Long | โทเค็นอินพุต null สำหรับภาพ/วิดีโอ |
outputTokens | Long | โทเค็นเอาต์พุต |
totalTokens | Long | โทเค็นรวม |
cacheReadTokens | Long | โทเค็นอ่านแคช |
cacheWriteTokens | Long | โทเค็นเขียนแคช |
imageCount | Integer | จำนวนภาพ ตั้งค่าสำหรับโมเดลภาพ |
imageResolution | String | ความละเอียดภาพ เช่น 720P |
imageRatio | String | อัตราส่วนภาพ เช่น 1:1 |
videoResolution | String | ความละเอียดวิดีโอ เช่น 1080p |
videoRatio | String | อัตราส่วนวิดีโอ เช่น 16:9 |
videoDurationSec | Long | ระยะเวลาวิดีโอเป็นวินาที |
orderCreatedAt | LocalDateTime | เวลาสร้างคำสั่งซื้อ (สแนปชอต orderCreatedAt) |
creditDetails | CreditDetailItem[] | Order details under this snapshot (from credit_order_t). |
CreditDetailItem fields:
| ฟิลด์ | ประเภท | คำอธิบาย |
|---|---|---|
credit | BigDecimal | จำนวนเงินที่เรียกเก็บโดยคำสั่งซื้อนี้ |
deductionSource | String | Deduction source (Balance / Monthly Package /
Resource Package). |
packageName | String | ชื่อแพ็กเกจ null หากไม่มีแพ็กเกจ |
อนุสัญญาค่าว่าง: เฉพาะฟิลด์ที่เกี่ยวข้องกับแต่ละ modelType เท่านั้นที่
ถูกเติม ส่วนที่เหลือเป็น null text เติมฟิลด์โทเค็น
image เติม imageCount/imageResolution/imageRatio
video เติม videoResolution/videoRatio/videoDurationSec
ตัวอย่างการตอบกลับ:
{
"code": 200,
"message": "success",
"data": {
"records": [
{
"priceSnapshotId": "snap_9f3c1a2b",
"taskId": "task_5e8a1c33",
"credit": 0.0342,
"model": "glm-5.2",
"modelType": "text",
"inputTokens": 1280,
"outputTokens": 642,
"totalTokens": 1922,
"cacheReadTokens": 0,
"cacheWriteTokens": 0,
"imageCount": null,
"imageResolution": null,
"imageRatio": null,
"videoResolution": null,
"videoRatio": null,
"videoDurationSec": null,
"orderCreatedAt": "2026-07-18T14:23:11",
"creditDetails": [
{
"credit": 0.0342,
"deductionSource": "balance",
"packageName": ""
}
]
},
{
"priceSnapshotId": "snap_a12f77c0",
"taskId": "task_c71e44a2",
"credit": 1.8000,
"model": "seedance-2.0",
"modelType": "video",
"inputTokens": null,
"outputTokens": null,
"totalTokens": null,
"cacheReadTokens": null,
"cacheWriteTokens": null,
"imageCount": null,
"imageResolution": null,
"imageRatio": null,
"videoResolution": "1080p",
"videoRatio": "16:9",
"videoDurationSec": 8,
"orderCreatedAt": "2026-07-17T22:41:09",
"creditDetails": [
{
"credit": 1.5000,
"deductionSource": "Monthly Package",
"packageName": "基础月度套餐"
},
{
"credit": 0.3000,
"deductionSource": "Resource Package",
"packageName": "byteplus视频资源包"
}
]
}
],
"total": 128,
"current": 1,
"size": 20,
"pages": 7
}
}
GET https://api.basicrouter.ai/api/v1/billing/transactions
รายการแบบแบ่งหน้าของธุรกรรมการเติมเงินที่ชำระแล้ว (status=2)
ของผู้ใช้ปัจจุบัน เรียงตาม created_at จากมากไปน้อย
| พารามิเตอร์ | ประเภท | จำเป็น | ค่าเริ่มต้น | คำอธิบาย |
|---|---|---|---|---|
page | Integer | ไม่ | 1 | หมายเลขหน้า |
size | Integer | ไม่ | 20 | ขนาดหน้า |
startTime | String | ไม่ | — | เวลาเริ่มต้น yyyy-MM-dd HH:mm:ss รวม |
endTime | String | ไม่ | — | เวลาสิ้นสุด yyyy-MM-dd HH:mm:ss รวม |
curl --request GET \
--url "https://api.basicrouter.ai/api/v1/billing/transactions?page=1&size=20&startTime=2026-07-01%2000:00:00&endTime=2026-07-31%2023:59:59" \
--header "Authorization: Bearer $BASICROUTER_API_KEY"
ตัวห่อหุ้มการตอบกลับ:
{
"code": 0,
"message": "success",
"data": { ... }
}
| ฟิลด์ | ประเภท | คำอธิบาย |
|---|---|---|
records | TransactionVO[] | ธุรกรรมหน้าปัจจุบัน |
total | Long | จำนวนรวม |
current | Long | หน้าปัจจุบัน |
size | Long | ขนาดหน้า |
pages | Long | หน้าทั้งหมด |
TransactionVO fields:
| ฟิลด์ | ประเภท | คำอธิบาย |
|---|---|---|
orderNo | String | หมายเลขคำสั่งซื้อ |
thirdPartyOrderNo | String | หมายเลขคำสั่งซื้อบุคคลที่สาม |
amount | BigDecimal | จำนวนเงินคำสั่งซื้อ |
actualAmount | BigDecimal | จำนวนเงินที่ชำระจริง |
discount | BigDecimal | จำนวนเงินส่วนลด |
paymentMethod | String | Payment method (wechat / alipay / ustd /
stripe / wallyt etc.). |
TransactionVO fields:
| ฟิลด์ | ประเภท | คำอธิบาย |
|---|---|---|
serviceFeeAmount | BigDecimal | จำนวนเงินค่าธรรมเนียมบริการ |
paymentChannel | String | แพลตฟอร์มการชำระเงิน |
source | String | Order source (recharge / package_purchase etc.). |
packageName | String | Package name (set for package purchases; null for plain
recharges). |
createdAt | LocalDateTime | เวลาที่สร้าง |
{
"code": 200,
"message": "success",
"data": {
"records": [
{
"orderNo": "R20260718abc123",
"thirdPartyOrderNo": "wx_pay_xxx",
"amount": 50.00,
"actualAmount": 48.50,
"discount": 1.50,
"paymentMethod": "wechat",
"serviceFeeAmount": 0.00,
"paymentChannel": "wechat",
"source": "recharge",
"packageName": null,
"createdAt": "2026-07-18T14:23:11"
}
],
"total": 28,
"current": 1,
"size": 20,
"pages": 2
}
}
การดำเนินงาน
ข้อผิดพลาด
BasicRouter ส่งคืนรหัสข้อผิดพลาดที่เสถียรเพื่อให้แอปพลิเคชันสามารถจัดการการลองใหม่ การสำรอง ปัญหาการเรียกเก็บเงิน และการดีบักได้อย่างสม่ำเสมอ
จุดเชื่อมต่อที่เข้ากันได้กับผู้ให้บริการจะพยายามรักษารูปร่างข้อผิดพลาด ของตระกูล API ต้นฉบับเมื่อเป็นไปได้ จุดเชื่อมต่อ BasicRouter-native ใช้ออบเจ็กต์ข้อผิดพลาด BasicRouter
HTTP status and error code mapping
| HTTP status | ประเภทข้อผิดพลาด | รหัสตัวอย่าง | ลองใหม่ |
|---|---|---|---|
| 400 | invalid_request_error | invalid_request, unsupported_parameter,
invalid_messages, invalid_image_url | ไม่ |
| 401 | authentication_error | missing_api_key, invalid_api_key | ไม่ |
| 402 | billing_error | insufficient_credits, payment_required,
quota_exceeded | ไม่ |
| 403 | permission_error | model_access_denied, endpoint_access_denied,
key_scope_denied | ไม่ |
| 404 | not_found_error | model_not_found, response_not_found,
task_not_found | ไม่ |
| 408 | timeout_error | gateway_timeout, provider_timeout | ใช่ |
| 409 | conflict_error | idempotency_conflict, task_already_cancelled | ขึ้นอยู่กับ |
| 422 | validation_error | schema_validation_failed, unsupported_modality | ไม่ |
| 429 | rate_limit_error | account_rpm_exceeded, account_tpm_exceeded,
provider_rate_limited | ใช่ |
| 500 | internal_error | internal_error | ใช่ |
| 502 | provider_error | provider_bad_gateway, provider_invalid_response | ใช่ |
| 503 | service_unavailable | model_unavailable, provider_unavailable,
insufficient_capacity | ใช่ |
| 504 | timeout_error | provider_timeout, gateway_timeout | ใช่ |
รหัสข้อผิดพลาดทั่วไป
| รหัส | ความหมาย | การดำเนินการที่แนะนำ |
|---|---|---|
missing_api_key | ไม่ได้ระบุคีย์ API | เพิ่มส่วนหัว Authorization |
invalid_api_key | คีย์ API ไม่ถูกต้องหรือถูกเพิกถอน | สร้างหรือหมุนเวียนคีย์ API |
model_not_found | รหัสโมเดลไม่มีอยู่หรือไม่ได้เปิดใช้งานสำหรับบัญชี | ตรวจสอบหน้าโมเดลหรือเรียก GET /v1/models |
model_access_denied | คีย์ API หรือบัญชีไม่มีสิทธิ์เข้าถึงโมเดล | เปิดใช้งานโมเดลหรือติดต่อผู้ดูแล |
unsupported_parameter | คำขอมีพารามิเตอร์ที่ไม่รองรับโดยเอนด์พอยต์หรือโมเดลที่เลือก | ลบพารามิเตอร์หรือเลือกโมเดลที่เข้ากันได้ |
unsupported_modality | รูปแบบอินพุตหรือเอาต์พุตไม่ได้รับการรองรับโดยโมเดลที่เลือก | เลือกโมเดลที่รองรับรูปแบบ |
account_rpm_exceeded | เกินขีดจำกัดคำขอต่อนาทีของบัญชี | ลองใหม่ด้วยการถดถอยหรือขอขีดจำกัดที่สูงขึ้น |
account_tpm_exceeded | เกินขีดจำกัดโทเค็นต่อนาทีของบัญชี | ลองใหม่ด้วยการถดถอย ลดโทเค็น หรือขอขีดจำกัดที่สูงขึ้น |
provider_rate_limited | ผู้ให้บริการอัปสตรีมจำกัดอัตราคำขอ | ลองใหม่หรือเปิดใช้งานการสำรอง |
insufficient_credits | บัญชีมีเครดิตไม่เพียงพอ | เติมเงินกระเป๋าเงิน ซื้อแพ็กเกจ หรืออัปเกรดแผน |
provider_timeout | ผู้ให้บริการอัปสตรีมไม่ตอบกลับในเวลาที่กำหนด | ลองใหม่หรือเปิดใช้งานการสำรอง |
model_unavailable | โมเดลไม่พร้อมใช้งานชั่วคราว | ลองใหม่หรือใช้นามแฝงการกำหนดเส้นทาง |
content_policy_error | คำขอหรือเอาต์พุตถูกบล็อกโดยนโยบายความปลอดภัย | แก้ไขอินพุตหรือเลือกเวิร์กโฟลว์ที่เหมาะสม |
การสนับสนุน
รับความช่วยเหลือเกี่ยวกับ BasicRouter
ค้นหาคำตอบสำหรับคำถามทั่วไปเกี่ยวกับ API การเรียกเก็บเงิน การกำหนดเส้นทาง และการรวมระบบ สำหรับ ปัญหาการผลิต ส่งรหัสคำขอ ป้ายกำกับคีย์ API จุดเชื่อมต่อ โมเดล และ การประทับเวลา เพื่อให้ทีมสามารถติดตามคำขอได้อย่างรวดเร็ว
คำถามที่พบบ่อย
คลิกที่คำถามเพื่อขยายคำตอบ
ติดต่อ
เลือกกล่องจดหมายที่เหมาะสมที่สุดสำหรับคำขอ
สำหรับเหตุการณ์ ขีดจำกัดอัตรา คำถามการเรียกเก็บเงิน ปัญหาการกำหนดเส้นทางการผลิต การย้าย SDK ความเข้ากันได้ของผู้ให้บริการ คำถามการออกแบบจุดเชื่อมต่อ แผนองค์กร การใช้งานที่ผูกมัด หรือข้อกำหนดการกำหนดเส้นทางผู้ให้บริการแบบกำหนดเอง











