1,104 mirrors rewritten over five passes of run-translation on the 22-source core set: the 14 sources edited since their translation, the 322 mirrors that were still English copies, and the frontmatter the old extractor leaked into the newer locales' bodies. The pipeline now caches per-`## `-section hashes and retranslates only changed sections, never reuses a section that is still English, rebuilds English-copy / leaked mirrors even when the source is unchanged, merges the state on save (parallel runs), and the drift gate (scoped to the core set) is blocking. Final audit: 0 stale, 0 English copies, 0 leaked frontmatter across 1,430 core mirrors. ⚠️ base-red inherited: #12732
135 KiB
OmniRoute Architecture (ไทย)
🌐 Languages: 🇺🇸 English · 🇪🇹 am · 🇸🇦 ar · 🇦🇿 az · 🇧🇬 bg · 🇧🇩 bn · 🇨🇿 cs · 🇩🇰 da · 🇩🇪 de · 🇬🇷 el · 🇪🇸 es · 🇪🇪 et · 🇮🇷 fa · 🇫🇮 fi · 🇫🇷 fr · 🇮🇪 ga · 🇮🇳 gu · 🇳🇬 ha · 🇮🇱 he · 🇮🇳 hi · 🇭🇷 hr · 🇭🇺 hu · 🇦🇲 hy · 🇮🇩 id · 🇳🇬 ig · 🇮🇹 it · 🇯🇵 ja · 🇬🇪 ka · 🇰🇭 km · 🇮🇳 kn · 🇰🇷 ko · 🇱🇹 lt · 🇱🇻 lv · 🇮🇳 ml · 🇮🇳 mr · 🇲🇾 ms · 🇲🇹 mt · 🇲🇲 my · 🇳🇵 ne · 🇳🇱 nl · 🇳🇴 no · 🇮🇳 or · 🇮🇳 pa · 🇵🇭 phi · 🇵🇱 pl · 🇵🇹 pt · 🇧🇷 pt-BR · 🇷🇴 ro · 🇷🇺 ru · 🇱🇰 si · 🇸🇰 sk · 🇸🇮 sl · 🇷🇸 sr · 🇸🇪 sv · 🇰🇪 sw · 🇮🇳 ta · 🇮🇳 te · 🇹🇷 tr · 🇺🇦 uk-UA · 🇵🇰 ur · 🇺🇿 uz · 🇻🇳 vi · 🇳🇬 yo · 🇨🇳 zh-CN · 🇹🇼 zh-TW
🌐 ภาษา: 🇺🇸 English | 🇪🇹 አማርኛ | 🇸🇦 العربية | 🇦🇿 Azərbaycan dili | 🇧🇬 Български | 🇧🇩 বাংলা | 🇨🇿 Čeština | 🇩🇰 Dansk | 🇩🇪 Deutsch | 🇬🇷 Ελληνικά | 🇪🇸 Español | 🇪🇪 Eesti | 🇮🇷 فارسی | 🇫🇮 Suomi | 🇫🇷 Français | 🇮🇪 Gaeilge | 🇮🇳 ગુજરાતી | 🇳🇬 Hausa | 🇮🇱 עברית | 🇮🇳 हिन्दी | 🇭🇷 Hrvatski | 🇭🇺 Magyar | 🇦🇲 Հայերեն | 🇮🇩 Bahasa Indonesia | 🇳🇬 Igbo | 🇮🇹 Italiano | 🇯🇵 日本語 | 🇬🇪 ქართული | 🇰🇭 ខ្មែរ | 🇮🇳 ಕನ್ನಡ | 🇰🇷 한국어 | 🇱🇹 Lietuvių | 🇱🇻 Latviešu | 🇮🇳 മലയാളം | 🇮🇳 मराठी | 🇲🇾 Bahasa Melayu | 🇲🇹 Malti | 🇲🇲 မြန်မာ | 🇳🇵 नेपाली | 🇳🇱 Nederlands | 🇳🇴 Norsk | 🇮🇳 ଓଡ଼ିଆ | 🇮🇳 ਪੰਜਾਬੀ | 🇵🇭 Filipino | 🇵🇱 Polski | 🇵🇹 Português (Portugal) | 🇧🇷 Português (Brasil) | 🇷🇴 Română | 🇷🇺 Русский | 🇱🇰 සිංහල | 🇸🇰 Slovenčina | 🇸🇮 Slovenščina | 🇷🇸 Српски | 🇸🇪 Svenska | 🇰🇪 Kiswahili | 🇮🇳 தமிழ் | 🇮🇳 తెలుగు | 🇹🇭 ไทย | 🇹🇷 Türkçe | 🇺🇦 Українська | 🇵🇰 اردو | 🇺🇿 Oʻzbekcha | 🇻🇳 Tiếng Việt | 🇳🇬 Yorùbá | 🇨🇳 中文 (简体) | 🇹🇼 中文 (繁體)
อัปเดตล่าสุด: 2026-06-28
บทสรุปสำหรับผู้บริหาร
OmniRoute คือเกตเวย์กำหนดเส้นทาง AI ภายในเครื่องและแดชบอร์ดที่สร้างขึ้นบน Next.js
โดยมีปลายทางเดียวที่เข้ากันได้กับ OpenAI (/v1/*) และกำหนดเส้นทางทราฟฟิกไปยังผู้ให้บริการต้นทางหลายราย พร้อมการแปลงรูปแบบ การสำรองเมื่อเกิดข้อผิดพลาด การรีเฟรชโทเค็น และการติดตามการใช้งาน
ความสามารถหลัก:
- พื้นผิว API ที่เข้ากันได้กับ OpenAI สำหรับ CLI/เครื่องมือ (ผู้ให้บริการ 355 ราย, ตัวดำเนินการ 108 ตัว)
- การแปลงคำขอ/การตอบกลับระหว่างรูปแบบของผู้ให้บริการ
- การสำรองด้วยชุดโมเดล (ลำดับหลายโมเดล)
- ขั้นตอนชุดแบบมีโครงสร้าง (
provider + model + connection) พร้อมการจัดลำดับขณะรันตามcompositeTiers - การสำรองระดับบัญชี (หลายบัญชีต่อผู้ให้บริการ)
- การตรวจสอบโควตาล่วงหน้าและการเลือกบัญชีแบบ P2C ที่คำนึงถึงโควตาในเส้นทางแชตหลัก
- การจัดการการเชื่อมต่อผู้ให้บริการด้วย OAuth + คีย์ API (โมดูลผู้ให้บริการ OAuth 22 โมดูล)
- การสร้างเวกเตอร์ฝังผ่าน
/v1/embeddings(ผู้ให้บริการ 18 ราย) - การสร้างรูปภาพผ่าน
/v1/images/generations(ผู้ให้บริการมากกว่า 10 ราย, โมเดลมากกว่า 20 โมเดล) - การถอดเสียงผ่าน
/v1/audio/transcriptions(ผู้ให้บริการ 18 ราย) - การแปลงข้อความเป็นเสียงผ่าน
/v1/audio/speech(ผู้ให้บริการในตัว 24 ราย) - การสร้างวิดีโอผ่าน
/v1/videos/generations(ComfyUI + SD WebUI) - การสร้างเพลงผ่าน
/v1/music/generations(ComfyUI) - การค้นหาเว็บผ่าน
/v1/search(ผู้ให้บริการ 20 ราย) - การกลั่นกรองเนื้อหาผ่าน
/v1/moderations - การจัดอันดับใหม่ผ่าน
/v1/rerank - การแยกวิเคราะห์แท็กการคิด (
<think>...</think>) สำหรับโมเดลการให้เหตุผล - การปรับการตอบกลับให้เป็นมาตรฐานเพื่อให้เข้ากันได้อย่างเคร่งครัดกับ OpenAI SDK
- การปรับบทบาทให้เป็นมาตรฐาน (developer→system, system→user) เพื่อความเข้ากันได้ระหว่างผู้ให้บริการ
- การแปลงเอาต์พุตแบบมีโครงสร้าง (json_schema → Gemini responseSchema)
- การจัดเก็บภายในเครื่องสำหรับผู้ให้บริการ คีย์ นามแฝง ชุด การตั้งค่า และราคา (โมดูล DB 122 โมดูล)
- การติดตามการใช้งาน/ค่าใช้จ่ายและการบันทึกคำขอ
- การซิงค์กับคลาวด์แบบเลือกใช้สำหรับการซิงค์สถานะระหว่างอุปกรณ์
- รายการอนุญาต/รายการบล็อก IP สำหรับควบคุมการเข้าถึง API
- การจัดการงบประมาณการคิด (ส่งผ่าน/อัตโนมัติ/กำหนดเอง/ปรับตามสถานการณ์)
- การแทรกพรอมต์ระบบส่วนกลาง
- การติดตามเซสชันและการสร้างลายนิ้วมือ
- การจำกัดอัตราขั้นสูงต่อบัญชีด้วยโปรไฟล์เฉพาะของผู้ให้บริการ
- รูปแบบเซอร์กิตเบรกเกอร์เพื่อเพิ่มความทนทานต่อความล้มเหลวของผู้ให้บริการ
- การป้องกันปัญหา thundering herd ด้วยการล็อกแบบ mutex
- แคชขจัดคำขอซ้ำโดยอิงลายเซ็น
- เลเยอร์โดเมน: กฎค่าใช้จ่าย นโยบายการสำรอง และนโยบายการล็อก
- Context Relay: สรุปการส่งต่อเซสชันเพื่อรักษาความต่อเนื่องเมื่อหมุนเวียนบัญชี
- การจัดเก็บสถานะโดเมน (แคชแบบเขียนผ่านของ SQLite สำหรับการสำรอง งบประมาณ การล็อก และเซอร์กิตเบรกเกอร์)
- กลไกนโยบายสำหรับการประเมินคำขอจากศูนย์กลาง (การล็อก → งบประมาณ → การสำรอง)
- เทเลเมทรีคำขอพร้อมการรวมค่าความหน่วง p50/p95/p99
- เทเลเมทรีเป้าหมายของชุดและสถานะย้อนหลังของเป้าหมายในชุดผ่าน
combo_execution_key/combo_step_id - ID สหสัมพันธ์ (X-Request-Id) สำหรับการติดตามแบบต้นทางถึงปลายทาง
- การบันทึกการตรวจสอบด้านการปฏิบัติตามข้อกำหนด พร้อมตัวเลือกปิดใช้งานสำหรับแต่ละคีย์ API
- เฟรมเวิร์กการประเมินสำหรับการประกันคุณภาพ LLM
- แดชบอร์ดสถานะพร้อมสถานะเซอร์กิตเบรกเกอร์ของผู้ให้บริการแบบเรียลไทม์
- MCP Server (เครื่องมือ 110 รายการ) พร้อมการรับส่งข้อมูล 3 รูปแบบ (stdio/SSE/Streamable HTTP)
- A2A Server (JSON-RPC 2.0 + SSE) พร้อมทักษะและวงจรชีวิตของงาน
- ระบบหน่วยความจำ (การสกัด การแทรก การเรียกค้น และการสรุป)
- ระบบทักษะ (รีจิสทรี ตัวดำเนินการ แซนด์บ็อกซ์ และทักษะในตัว)
- พร็อกซี MITM พร้อมการจัดการใบรับรองและ DNS
- มิดเดิลแวร์ป้องกันการแทรกพรอมต์
- ไปป์ไลน์บีบอัดพรอมต์พร้อม Caveman, RTK, ไปป์ไลน์แบบซ้อน ชุดการบีบอัด ชุดภาษา และการวิเคราะห์
- รีจิสทรี ACP (Agent Communication Protocol)
- ผู้ให้บริการ OAuth แบบโมดูลาร์ (โมดูลแยก 22 โมดูลภายใต้
src/lib/oauth/providers/) - สคริปต์ถอนการติดตั้ง/ถอนการติดตั้งทั้งหมด
- การดำเนินการซ่อมแซมสภาพแวดล้อม OAuth
- บริดจ์ WebSocket สำหรับไคลเอ็นต์ WS ที่เข้ากันได้กับ OpenAI (
/v1/ws) - การจัดการโทเค็นซิงค์ (การออก/เพิกถอน และการดาวน์โหลดชุดการกำหนดค่าที่กำหนดเวอร์ชันด้วย ETag)
- พรีเซ็ตผู้ให้บริการระดับเฟิร์สคลาส GLM Thinking (
glmt) - การนับโทเค็นแบบไฮบริด (
/messages/count_tokensฝั่งผู้ให้บริการ พร้อมการประมาณค่าเป็นทางเลือกสำรอง) - การสร้างนามแฝงโมเดลเริ่มต้นโดยอัตโนมัติ (การปรับภาษาถิ่นข้ามพร็อกซีมากกว่า 30 รายการเมื่อเริ่มต้นระบบ)
- การดึงข้อมูลขาออกอย่างปลอดภัย พร้อมการป้องกัน SSRF การบล็อก URL ส่วนตัว และการลองใหม่ที่กำหนดค่าได้
- การลองส่งแชตใหม่โดยคำนึงถึงช่วงพัก พร้อม
requestRetryและmaxRetryIntervalSecที่กำหนดค่าได้ - การตรวจสอบสภาพแวดล้อมรันไทม์ด้วย Zod เมื่อเริ่มต้นระบบ
- การตรวจสอบด้านการปฏิบัติตามข้อกำหนด v2 พร้อมการแบ่งหน้า เหตุการณ์ CRUD ของผู้ให้บริการ และการบันทึกการตรวจสอบเมื่อถูกบล็อกโดย SSRF
โมเดลรันไทม์หลัก:
- เส้นทางแอป Next.js ภายใต้
src/app/api/*ใช้งานทั้ง API ของแดชบอร์ดและ API สำหรับความเข้ากันได้ - แกนกลาง SSE/การกำหนดเส้นทางที่ใช้ร่วมกันใน
src/sse/*+open-sse/*จัดการการดำเนินการของผู้ให้บริการ การแปลงรูปแบบ การสตรีม การสำรอง และการใช้งาน
ไดอะแกรมอ้างอิง
ซอร์ส Mermaid มาตรฐานที่ควบคุมเวอร์ชันสำหรับแพลตฟอร์ม v3.8.0 อยู่ใน
docs/diagrams/ โดยนำมาจัดแสดงด้านล่างสองรายการเพื่อช่วยให้เห็นภาพรวม
ส่วนรายการที่เหลือเชื่อมโยงจากคู่มือเฉพาะโดเมนที่เกี่ยวข้อง
ซอร์ส: diagrams/resilience-3layers.mmd — เชื่อมโยงจาก RESILIENCE_GUIDE.md และเอกสารอ้างอิงด้านความยืดหยุ่นใน
CLAUDE.mdด้วย
ขอบเขตและข้อจำกัด
อยู่ในขอบเขต
- รันไทม์เกตเวย์ภายในเครื่อง
- API สำหรับจัดการแดชบอร์ด
- การยืนยันตัวตนกับผู้ให้บริการและการรีเฟรชโทเค็น
- การแปลงคำขอและการสตรีมแบบ SSE
- สถานะภายในเครื่อง + การจัดเก็บข้อมูลการใช้งาน
- การประสานงานการซิงค์กับคลาวด์ที่เปิดใช้ได้ตามต้องการ
อยู่นอกขอบเขต
- การติดตั้งใช้งานบริการคลาวด์เบื้องหลัง
NEXT_PUBLIC_CLOUD_URL - SLA/ระนาบควบคุมของผู้ให้บริการที่อยู่นอกโพรเซสภายในเครื่อง
- ไบนารี CLI ภายนอกโดยตรง (Claude CLI, Codex CLI เป็นต้น)
ส่วนติดต่อแดชบอร์ด (ปัจจุบัน)
หน้าหลักภายใต้ src/app/(dashboard)/dashboard/:
/dashboard— เริ่มต้นอย่างรวดเร็ว + ภาพรวมผู้ให้บริการ/dashboard/endpoint— พร็อกซีเอนด์พอยต์ + MCP + A2A + แท็บ API เอนด์พอยต์/dashboard/providers— การเชื่อมต่อและข้อมูลประจำตัวของผู้ให้บริการ/dashboard/combos— กลยุทธ์คอมโบ เทมเพลต เครื่องมือสร้างแบบเป็นขั้นตอน กฎการกำหนดเส้นทางโมเดล และลำดับที่จัดเก็บแบบกำหนดเอง/dashboard/auto-combo— Auto Combo Engine: ค่าน้ำหนักการให้คะแนน ชุดโหมด พรีเซ็ตโรงงานเสมือน และข้อมูลเทเลเมทรี/dashboard/costs— การรวมค่าใช้จ่ายและการแสดงข้อมูลราคา/dashboard/analytics— การวิเคราะห์การใช้งาน การประเมินผล และสถานะเป้าหมายของคอมโบ/dashboard/limits— การควบคุมโควตา/อัตรา/dashboard/cli-tools— การเริ่มต้นใช้งาน CLI การตรวจหารันไทม์ และการสร้างการกำหนดค่า/dashboard/agents— เอเจนต์ ACP ที่ตรวจพบ + การลงทะเบียนเอเจนต์แบบกำหนดเอง/dashboard/cloud-agents— งานของเอเจนต์ที่โฮสต์บนคลาวด์ (Codex Cloud, Devin, Jules) และวงจรชีวิตของงาน/dashboard/skills— รีจิสทรีทักษะ A2A การดำเนินการในแซนด์บ็อกซ์ และแค็ตตาล็อกทักษะในตัว/dashboard/memory— การตรวจสอบและเรียกคืนหน่วยความจำการสนทนาแบบถาวร/dashboard/webhooks— การสมัครรับเว็บฮุกขาออก การหมุนเวียนข้อมูลลับ และสถิติการลองใหม่/dashboard/batch— การส่งงานแบบแบตช์และความคืบหน้า/dashboard/cache— สถิติแคชแบบอ่านผ่านและแคชการให้เหตุผล รวมถึงการควบคุมการขับข้อมูลออก/dashboard/playground— สนามทดลองแชตแบบโต้ตอบกับคอมโบ/โมเดลที่กำหนดค่าไว้/dashboard/changelog— ตัวแสดงบันทึกการเปลี่ยนแปลงภายในแอป (เรนเดอร์CHANGELOG.md)/dashboard/system— การวินิจฉัยรันไทม์ ข้อมูลเวอร์ชัน และส่วนตรวจสอบความถูกต้องของสภาพแวดล้อม/dashboard/onboarding— วิซาร์ดตั้งค่าครั้งแรกสำหรับการติดตั้งใหม่/dashboard/media— สนามทดลองรูปภาพ/วิดีโอ/เพลง/dashboard/search-tools— การทดสอบและประวัติผู้ให้บริการค้นหา/dashboard/health— ระยะเวลาทำงาน เซอร์กิตเบรกเกอร์ ขีดจำกัดอัตรา และเซสชันที่มีการตรวจสอบโควตา/dashboard/logs— บันทึกคำขอ/พร็อกซี/การตรวจสอบ/คอนโซล/dashboard/settings— แท็บการตั้งค่าระบบ (ทั่วไป การกำหนดเส้นทาง ค่าเริ่มต้นของคอมโบ เป็นต้น)/dashboard/context/caveman— กฎการบีบอัด Caveman ชุดภาษา ตัวอย่าง และโหมดเอาต์พุต/dashboard/context/rtk— ตัวกรองเอาต์พุตคำสั่ง RTK ตัวอย่าง และการตั้งค่าความปลอดภัยของรันไทม์/dashboard/context/combos— ไปป์ไลน์การบีบอัดที่มีชื่อซึ่งกำหนดให้กับคอมโบการกำหนดเส้นทาง/dashboard/translator— การตรวจสอบตัวแปลและตัวอย่างการแปลงรูปแบบคำขอ/dashboard/audit— เบราว์เซอร์บันทึกการตรวจสอบการปฏิบัติตามข้อกำหนด พร้อมการแบ่งหน้าและข้อมูลเมตาแบบมีโครงสร้าง/dashboard/usage— เบราว์เซอร์การใช้งานรายคำขอที่เชื่อมโยงกับusage_history/dashboard/compression— การวิเคราะห์และสถิติการบีบอัด รวมถึงการกำหนดไปป์ไลน์/dashboard/api-manager— วงจรชีวิตของคีย์ API และสิทธิ์อนุญาตของโมเดล
บริบทระบบระดับสูง
flowchart LR
subgraph Clients[ไคลเอนต์สำหรับนักพัฒนา]
C1[Claude Code]
C2[Codex CLI]
C3[OpenClaw / Droid / Cline / Continue / Roo]
C4[ไคลเอนต์แบบกำหนดเองที่เข้ากันได้กับ OpenAI]
BROWSER[แดชบอร์ดบนเบราว์เซอร์]
end
subgraph Router[โปรเซส OmniRoute ภายในเครื่อง]
API[API ที่เข้ากันได้กับ V1\n/v1/*]
DASH[แดชบอร์ด + API การจัดการ\n/api/*]
CORE[แกนหลัก SSE + การแปล\nopen-sse + src/sse]
DB[(storage.sqlite)]
UDB[(ตารางการใช้งาน + อาร์ติแฟกต์บันทึก)]
end
subgraph Upstreams[ผู้ให้บริการต้นทาง]
P1[ผู้ให้บริการ OAuth\nClaude/Codex/Gemini/Qoder/GitHub/Kiro/Cursor/Antigravity]
P2[ผู้ให้บริการ API Key\nOpenAI/Anthropic/OpenRouter/GLM/Kimi/MiniMax\nDeepSeek/Groq/xAI/Mistral/Perplexity\nTogether/Fireworks/Cerebras/Cohere/NVIDIA]
P3[โหนดที่เข้ากันได้\nเข้ากันได้กับ OpenAI / เข้ากันได้กับ Anthropic]
end
subgraph Cloud[การซิงค์กับคลาวด์ที่เป็นตัวเลือก]
CLOUD[เอนด์พอยต์การซิงค์กับคลาวด์\nNEXT_PUBLIC_CLOUD_URL]
end
C1 --> API
C2 --> API
C3 --> API
C4 --> API
BROWSER --> DASH
API --> CORE
DASH --> DB
CORE --> DB
CORE --> UDB
CORE --> P1
CORE --> P2
CORE --> P3
DASH --> CLOUD
คอมโพเนนต์รันไทม์หลัก
1) เลเยอร์ API และการกำหนดเส้นทาง (Next.js App Routes)
ไดเรกทอรีหลัก:
src/app/api/v1/*และsrc/app/api/v1beta/*สำหรับ API ที่เข้ากันได้src/app/api/*สำหรับ API การจัดการ/การกำหนดค่า- การเขียนเส้นทางใหม่ของ Next ใน
next.config.mjsแมป/v1/*ไปยัง/api/v1/*
เส้นทางความเข้ากันได้ที่สำคัญ:
src/app/api/v1/chat/completions/route.tssrc/app/api/v1/messages/route.tssrc/app/api/v1/responses/route.tssrc/app/api/v1/models/route.ts— รวมโมเดลแบบกำหนดเองที่มีcustom: truesrc/app/api/v1/embeddings/route.ts— การสร้าง embedding (ผู้ให้บริการ 6 ราย)src/app/api/v1/images/generations/route.ts— การสร้างรูปภาพ (ผู้ให้บริการ 4 รายขึ้นไป รวมถึง Antigravity/Nebius)src/app/api/v1/messages/count_tokens/route.tssrc/app/api/v1/providers/[provider]/chat/completions/route.ts— แชตเฉพาะสำหรับผู้ให้บริการแต่ละรายsrc/app/api/v1/providers/[provider]/embeddings/route.ts— embedding เฉพาะสำหรับผู้ให้บริการแต่ละรายsrc/app/api/v1/providers/[provider]/images/generations/route.ts— รูปภาพเฉพาะสำหรับผู้ให้บริการแต่ละรายsrc/app/api/v1beta/models/route.tssrc/app/api/v1beta/models/[...path]/route.ts
โดเมนการจัดการ:
- การยืนยันตัวตน/การตั้งค่า:
src/app/api/auth/*,src/app/api/settings/* - ผู้ให้บริการ/การเชื่อมต่อ:
src/app/api/providers* - โหนดผู้ให้บริการ:
src/app/api/provider-nodes* - โมเดลแบบกำหนดเอง:
src/app/api/provider-models(GET/POST/DELETE) - แค็ตตาล็อกโมเดล:
src/app/api/models/route.ts(GET) - การกำหนดค่าพร็อกซี:
src/app/api/settings/proxy(GET/PUT/DELETE) +src/app/api/settings/proxy/test(POST) - OAuth:
src/app/api/oauth/* - คีย์/นามแฝง/คอมโบ/ราคา:
src/app/api/keys*,src/app/api/models/alias,src/app/api/combos*,src/app/api/pricing - การใช้งาน:
src/app/api/usage/* - การซิงค์/คลาวด์:
src/app/api/sync/*,src/app/api/cloud/* - ตัวช่วยเครื่องมือ CLI:
src/app/api/cli-tools/* - ตัวกรอง IP:
src/app/api/settings/ip-filter(GET/PUT) - งบประมาณการคิด:
src/app/api/settings/thinking-budget(GET/PUT) - พรอมป์ต์ระบบ:
src/app/api/settings/system-prompt(GET/PUT) - การบีบอัด:
src/app/api/settings/compression,src/app/api/compression/*และsrc/app/api/context/* - เซสชัน:
src/app/api/sessions(GET) - ขีดจำกัดอัตรา:
src/app/api/rate-limits(GET) - ความยืดหยุ่นต่อความล้มเหลว:
src/app/api/resilience(GET/PATCH) — คิวคำขอ ช่วงพักการเชื่อมต่อ ตัวตัดวงจรของผู้ให้บริการ และการกำหนดค่าการรอช่วงพัก - การรีเซ็ตความยืดหยุ่นต่อความล้มเหลว:
src/app/api/resilience/reset(POST) — รีเซ็ตตัวตัดวงจรของผู้ให้บริการ - สถิติแคช:
src/app/api/cache/stats(GET/DELETE) - เทเลเมทรี:
src/app/api/telemetry/summary(GET) - งบประมาณ:
src/app/api/usage/budget(GET/POST) - เชนสำรอง:
src/app/api/fallback/chains(GET/POST/DELETE) - การตรวจสอบการปฏิบัติตามข้อกำหนด:
src/app/api/compliance/audit-log(GET พร้อมการแบ่งหน้า + เมทาดาทาที่มีโครงสร้าง) - การประเมินผล:
src/app/api/evals(GET/POST),src/app/api/evals/[suiteId](GET) - นโยบาย:
src/app/api/policies(GET/POST) - โทเค็นการซิงค์:
src/app/api/sync/tokens(GET/POST),src/app/api/sync/tokens/[id](GET/DELETE) - บันเดิลการกำหนดค่า:
src/app/api/sync/bundle(GET, สแนปช็อตของการตั้งค่า/ผู้ให้บริการ/คอมโบ/คีย์ที่กำหนดเวอร์ชันด้วย ETag) - WebSocket:
src/app/api/v1/ws/route.ts— ตัวจัดการ Upgrade สำหรับไคลเอนต์ WS ที่เข้ากันได้กับ OpenAI
2) SSE + แกนหลักการแปล
โมดูลโฟลว์หลัก:
- จุดเริ่มต้น:
src/sse/handlers/chat.ts - การประสานงานหลัก:
open-sse/handlers/chatCore.ts - อะแดปเตอร์สำหรับดำเนินการกับผู้ให้บริการ:
open-sse/executors/* - การตรวจหารูปแบบ/การกำหนดค่าผู้ให้บริการ:
open-sse/services/provider.ts - การแยกวิเคราะห์/ระบุโมเดล:
src/sse/services/model.ts,open-sse/services/model.ts - ตรรกะการใช้บัญชีสำรอง:
open-sse/services/accountFallback.ts - รีจิสทรีการแปล:
open-sse/translator/index.ts - การแปลงสตรีม:
open-sse/utils/stream.ts,open-sse/utils/streamHandler.ts - การดึงข้อมูล/ปรับข้อมูลการใช้งานให้เป็นมาตรฐาน:
open-sse/utils/usageTracking.ts - ตัวแยกวิเคราะห์แท็ก Think:
open-sse/utils/thinkTagParser.ts - ตัวจัดการ Embedding:
open-sse/handlers/embeddings.ts - รีจิสทรีผู้ให้บริการ Embedding:
open-sse/config/embeddingRegistry.ts - ตัวจัดการการสร้างรูปภาพ:
open-sse/handlers/imageGeneration.ts - รีจิสทรีผู้ให้บริการรูปภาพ:
open-sse/config/imageRegistry.ts - การปรับแต่งการตอบกลับให้ปลอดภัย:
open-sse/handlers/responseSanitizer.ts - การปรับบทบาทให้เป็นมาตรฐาน:
open-sse/services/roleNormalizer.ts
บริการ (ตรรกะทางธุรกิจ):
- การเลือก/ให้คะแนนบัญชี:
open-sse/services/accountSelector.ts - การจัดการวงจรชีวิตของบริบท:
open-sse/services/contextManager.ts - การบังคับใช้ตัวกรอง IP:
open-sse/services/ipFilter.ts - การติดตามเซสชัน:
open-sse/services/sessionManager.ts - การขจัดคำขอซ้ำ:
open-sse/services/signatureCache.ts - การแทรกพรอมต์ระบบ:
open-sse/services/systemPrompt.ts - การจัดการงบประมาณการคิด:
open-sse/services/thinkingBudget.ts - การกำหนดเส้นทางโมเดลด้วยไวลด์การ์ด:
open-sse/services/wildcardRouter.ts - การจัดการขีดจำกัดอัตรา:
open-sse/services/rateLimitManager.ts - เซอร์กิตเบรกเกอร์:
src/shared/utils/circuitBreaker.ts - การส่งมอบบริบท:
open-sse/services/contextHandoff.ts— การสร้างและแทรกข้อมูลสรุปการส่งมอบสำหรับกลยุทธ์การส่งต่อบริบท - การบีบอัด:
open-sse/services/compression/*— การบีบอัดเชิงรุกก่อนการแปลของผู้ให้บริการ; รวมถึงกฎ Caveman, ตัวกรอง RTK, ไปป์ไลน์แบบซ้อน, ชุดการบีบอัด, สถิติ และการตรวจสอบความถูกต้อง - ตัวดึงโควตา Codex:
open-sse/services/codexQuotaFetcher.ts— ดึงโควตา Codex สำหรับการตัดสินใจส่งมอบในการส่งต่อบริบท - การลองใหม่โดยคำนึงถึงช่วงพัก:
src/sse/services/cooldownAwareRetry.ts— ลองใหม่ตามช่วงพักของแต่ละโมเดลด้วยrequestRetry/maxRetryIntervalSecที่กำหนดค่าได้ - การดึงข้อมูลขาออกอย่างปลอดภัย:
src/shared/network/safeOutboundFetch.ts— การดึงข้อมูลผู้ให้บริการ/โมเดลที่มีการป้องกัน SSRF, การบล็อก URL ส่วนตัว, การลองใหม่ และการหมดเวลา - ตัวป้องกัน URL ขาออก:
src/shared/network/outboundUrlGuard.ts— ตรวจสอบ URL ของผู้ให้บริการเทียบกับช่วง CIDR ส่วนตัว/localhost - ค่าเริ่มต้นคำขอของผู้ให้บริการ:
open-sse/services/providerRequestDefaults.ts— ค่าเริ่มต้นระดับผู้ให้บริการสำหรับmaxTokens,temperature,thinkingBudgetTokens - ค่าคงที่ของผู้ให้บริการ GLM:
open-sse/config/glmProvider.ts— โมเดล GLM, URL โควตา และค่าหมดเวลา/ค่าเริ่มต้น GLMT ที่ใช้ร่วมกัน - อัปสตรีม Antigravity:
open-sse/config/antigravityUpstream.ts— URL ฐานและค่าคงที่ของพาธสำหรับการค้นหา - ค่าคงที่ไคลเอนต์ Codex:
open-sse/config/codexClient.ts— ค่า user-agent และ client-version ที่มีการกำหนดเวอร์ชัน - ข้อมูลตั้งต้นนามแฝงโมเดล:
src/lib/modelAliasSeed.ts— สร้างข้อมูลตั้งต้นนามแฝงข้ามสำเนียงพร็อกซีมากกว่า 30 รายการเมื่อเริ่มต้นระบบ
โมดูลเลเยอร์โดเมน:
- กฎต้นทุน/งบประมาณ:
src/domain/costRules.ts - นโยบายสำรอง:
src/domain/fallbackPolicy.ts - ตัวระบุชุดผสม:
src/domain/comboResolver.ts - นโยบายการล็อกเอาต์:
src/domain/lockoutPolicy.ts - กลไกนโยบาย:
src/domain/policyEngine.ts— การประเมินแบบรวมศูนย์ตามลำดับ การล็อกเอาต์ → งบประมาณ → การสำรอง - แค็ตตาล็อกรหัสข้อผิดพลาด:
src/shared/constants/errorCodes.ts - ID คำขอ:
src/shared/utils/requestId.ts - การหมดเวลาการดึงข้อมูล:
src/shared/utils/fetchTimeout.ts - ข้อมูลเทเลเมทรีของคำขอ:
src/shared/utils/requestTelemetry.ts - การปฏิบัติตามข้อกำหนด/การตรวจสอบ:
src/lib/compliance/index.ts - ตัวรันการประเมิน:
src/lib/evals/evalRunner.ts - การคงอยู่ของสถานะโดเมน:
src/lib/db/domainState.ts— CRUD ของ SQLite สำหรับสายโซ่สำรอง, งบประมาณ, ประวัติต้นทุน, สถานะการล็อกเอาต์ และเซอร์กิตเบรกเกอร์
โมดูลผู้ให้บริการ OAuth (ไฟล์แยกกัน 22 ไฟล์ภายใต้ src/lib/oauth/providers/):
- ดัชนีรีจิสทรี:
src/lib/oauth/providers/index.ts - ผู้ให้บริการแต่ละราย:
agy.ts,antigravity.ts,claude.ts,cline.ts,codebuddy-cn.ts,codex.ts,cursor.ts,devin-desktop.ts,ghe-copilot.ts,github.ts,gitlab-duo.ts,grok-cli-oauth.ts,grok-cli.ts,kilocode.ts,kimi-coding.ts,kiro.ts,openference.ts,qoder.ts,trae.ts,xai-oauth.ts,zed-hosted.ts,zed.ts - แรปเปอร์แบบบาง:
src/lib/oauth/providers.ts— ส่งออกซ้ำจากแต่ละโมดูล
5) บริการแบบฝังตัว (v3.8.4)
OmniRoute สามารถติดตั้ง กำกับดูแล และกำหนดเส้นทางไปยังกระบวนการเครื่องมือ AI ที่ทำงานอยู่ภายในเครื่อง ซึ่งเรียกว่า บริการแบบฝังตัว โดยมีบริการที่มาพร้อมกันห้ารายการ ได้แก่ 9Router, CLIProxyAPI, Bifrost, Mux และ Dario
ชั้นสถาปัตยกรรม:
- UI (
/dashboard/providers/services) — หน้าแบบสองแท็บพร้อมตัวควบคุมวงจรชีวิต การสตรีมบันทึกแบบเรียลไทม์ การจัดการคีย์ API และ (สำหรับ 9Router) UI แบบเนทีฟที่ฝังอยู่ผ่าน reverse proxy ภายใน - API (
/api/services/{name}/*) — 11 endpoint สำหรับ 9Router, 10 สำหรับ CLIProxyAPI และอย่างละ 8 สำหรับ Bifrost / Mux / Dario โดยทั้งหมดจัดประเภทเป็น LOCAL_ONLY (กฎบังคับ #17) endpoint SSE ที่ใช้ร่วมกันGET /api/services/[name]/logsให้บริการทั้งสองบริการ - Supervisor (
src/lib/services/) — คลาสServiceSupervisorแบบทั่วไปครอบchild_process.spawnมี ring buffer ขนาด 5 MB สำหรับการสตรีมบันทึกผ่าน SSE มีลูป ตรวจสอบสถานะการทำงาน ล็อกการดำเนินการแบบอะตอมมิก และการปิดระบบอย่างนุ่มนวลด้วย SIGTERM→SIGKILLbootstrap.tsเชื่อมต่อบริการทั้งหมดที่กำหนดค่าไว้เมื่อกระบวนการเริ่มทำงาน - Provider/executor (
open-sse/executors/ninerouter.ts) — 9Router ถูกเปิดให้ใช้งานในฐานะ provider จริง โมเดลใช้คำนำหน้า9router/{sub}/{model}และซิงค์ทุก 5 นาที จาก endpoint/v1/modelsของ 9Router
รายละเอียดเชิงลึก: docs/frameworks/EMBEDDED-SERVICES.md
ระบบย่อยหลัก (v3.8.0)
A. กลไก Auto Combo
Auto Combo ให้คะแนนและเลือกเป้าหมายการกำหนดเส้นทางแบบไดนามิกในขณะรับคำขอ แทนที่จะ
อาศัยข้อกำหนด combo แบบคงที่ โดยเป็นกลไกเบื้องหลังตระกูลคำนำหน้าโมเดล auto/*
- จุดเริ่มต้นของกลไก:
open-sse/services/autoCombo/(autoComboEngine.ts,scoringEngine.ts,virtualFactory.ts,modePacks.ts) - ตัวแก้ไขเส้นทาง:
src/domain/comboResolver.ts(ตรวจจับคำนำหน้าauto/โดยอัตโนมัติ) - แดชบอร์ด:
/dashboard/auto-combo - ข้อมูลเทเลเมทรี: ตาราง SQLite
auto_combo_decisions
ความสามารถหลัก:
- กลยุทธ์การกำหนดเส้นทาง 19 แบบ (ตามลำดับความสำคัญ, ถ่วงน้ำหนัก, เติมรายการแรกให้เต็ม, วนรอบ, P2C, สุ่ม,
ใช้น้อยที่สุด, ปรับต้นทุนให้เหมาะสม, คำนึงถึงการรีเซ็ต, ช่วงเวลาการรีเซ็ต, ความจุสำรอง, สุ่มแบบเคร่งครัด,
auto, lkgp, ปรับตามบริบท, ส่งต่อบริบท, fusion รวมถึงเส้นทางสำรอง) —
auto คือฟีเจอร์เด่นที่เพิ่มเข้ามาใน v3.8.0 ส่วน
fusion(กระจายคำขอไปยังพาเนล + สังเคราะห์ผลโดยตัวตัดสิน,open-sse/services/fusion.ts) เพิ่มเข้ามาใหม่ใน v3.8.36 - การให้คะแนนด้วย 16 ปัจจัย: โควตา สถานะการทำงาน ค่าผกผันของต้นทุน ค่าผกผันของเวลาแฝง ความเหมาะสมกับงาน และ
อีกสิบปัจจัย ตารางมาตรฐานของปัจจัยและค่าน้ำหนักเริ่มต้นอยู่ใน
docs/routing/AUTO-COMBO.md— การระบุซ้ำที่นี่จะ ทำให้มีอีกจุดหนึ่งที่ข้อมูลอาจล้าสมัย - Virtual factory สร้าง combo ชั่วคราวเมื่อไม่มี combo ที่มีชื่อตรงกัน โดยดึงตัวเลือกจากการเชื่อมต่อ provider ที่ทำงานอยู่และมีสถานะสมบูรณ์
- คำนำหน้า Auto:
auto/coding,auto/cheap,auto/fast,auto/offline,auto/smart,auto/lkgp— แต่ละรายการรองรับด้วยโปรไฟล์ค่าน้ำหนักที่ปรับแต่งมาแล้ว - ชุดโหมด 6 ชุด:
ship-fast,cost-saver,quality-first,offline-friendly,reliability-firstและchaos-mode— การกำหนดค่าค่าน้ำหนักสำเร็จรูปที่เรียกใช้ได้จาก แดชบอร์ด (อย่าสับสนกับคำนำหน้าauto/*ข้างต้น ซึ่งเป็นตัวแปรที่ใช้ในขณะรับคำขอ)
สำหรับรายละเอียดทั้งหมดของอัลกอริทึม (สูตรปัจจัย การปรับแต่งค่าน้ำหนัก) โปรดดู
docs/routing/AUTO-COMBO.md
B. Cloud Agents
Cloud Agents ครอบแพลตฟอร์ม code agent ที่โฮสต์โดยบุคคลที่สาม (Codex Cloud, Devin, Jules) ไว้เบื้องหลังวงจรชีวิตงานแบบเดียวกันซึ่งมีฐานข้อมูลรองรับ endpoint ทั้งหมดสำหรับการสร้าง/ตรวจสอบงาน ต้องมีการยืนยันตัวตนเพื่อการจัดการ
- รูทของโมดูล:
src/lib/cloudAgent/(baseAgent.ts,registry.ts,api.ts,types.ts,db.tsรวมถึงไดเรกทอรีย่อยของแต่ละ agent ภายใต้agents/) - การใช้งานสำหรับแต่ละ agent:
agents/codex/,agents/devin/,agents/jules/ - endpoint สาธารณะ:
/api/v1/agents/tasks/*(แสดงรายการ/สร้าง/รับ/ยกเลิก) - endpoint สำหรับการจัดการ:
/api/cloud/*(การจัดเตรียม สถานะ การประมวลผลแบบกลุ่ม) - แดชบอร์ด:
/dashboard/cloud-agents - ที่จัดเก็บข้อมูล: ตาราง
cloud_agent_tasks
สำหรับรายละเอียดการจัดเตรียมและ OAuth ของแต่ละ agent โปรดดู
docs/frameworks/CLOUD_AGENT.md
C. Guardrails
โมดูล guardrails เป็นชั้น middleware ที่โหลดซ้ำขณะทำงานได้ ซึ่งตรวจสอบคำขอ และการตอบกลับเพื่อค้นหา PII, prompt injection และเนื้อหาภาพที่ไม่ปลอดภัย การละเมิด จะยุติคำขอทันทีด้วย HTTP 503 พร้อมรหัสข้อผิดพลาดที่มีโครงสร้าง ทำให้ ผู้เรียกใช้ปลายทางสามารถลองใหม่หรือแยกเส้นทางการทำงานได้
- รูทของโมดูล:
src/lib/guardrails/(base.ts,registry.ts,piiMasker.ts,promptInjection.ts,visionBridge.ts,visionBridgeHelpers.ts) - การโหลดซ้ำขณะทำงาน: registry เฝ้าดูการเปลี่ยนแปลงการกำหนดค่าและสร้างสายโซ่ใหม่ภายในตำแหน่งเดิม
- จุดเชื่อมต่อ: จุดเริ่มต้นของตัวจัดการแชต ตัวจัดการการสร้างภาพ และตัวทำความสะอาดการตอบกลับ
- ข้อตกลง HTTP: การละเมิดแสดงผลเป็น
503พร้อมerror.code = "GUARDRAIL_VIOLATION"
สำหรับการสร้างชุดกฎและการปรับแต่งค่าเกณฑ์ โปรดดู
docs/security/GUARDRAILS.md
D. ชั้นโดเมน
namespace src/domain/ รวมศูนย์การตัดสินใจด้านนโยบาย เพื่อให้ตัวจัดการเส้นทางไม่จำเป็นต้อง
ประกอบตรรกะการล็อกเอาต์/งบประมาณ/เส้นทางสำรองด้วยตนเอง
- กลไกนโยบาย:
src/domain/policyEngine.ts— จุดเริ่มต้นเดียวสำหรับ การประเมินก่อนดำเนินการ (ลำดับการล็อกเอาต์ → งบประมาณ → เส้นทางสำรอง) - กฎต้นทุน:
src/domain/costRules.ts - นโยบายเส้นทางสำรอง:
src/domain/fallbackPolicy.ts - นโยบายการล็อกเอาต์:
src/domain/lockoutPolicy.ts - การกำหนดเส้นทางตามแท็ก:
src/domain/tagRouter.ts - ตัวแก้ไข combo:
src/domain/comboResolver.ts— แปลงชื่อ combo, คำนำหน้า auto/* และเป้าหมายโมเดลแบบ wildcard ให้เป็นแผนการดำเนินงานที่เป็นรูปธรรม - ตัวเชื่อมกฎการเชื่อมต่อ/โมเดล:
src/domain/connectionModelRules.ts - สแนปช็อตความพร้อมใช้งานของโมเดล:
src/domain/modelAvailability.ts - การติดตามวันหมดอายุของ provider:
src/domain/providerExpiration.ts - แคชโควตา:
src/domain/quotaCache.ts - สถานะการลดระดับ:
src/domain/degradation.ts - การตรวจสอบการกำหนดค่า:
src/domain/configAudit.ts - ตัวสร้างข้อมูลเมตาการตอบกลับของ OmniRoute:
src/domain/omnirouteResponseMeta.ts - ระบบย่อยการประเมิน:
src/domain/assessment/— งานประเมินผลตามรอบเวลา
E. ไปป์ไลน์การให้สิทธิ์
คลาสไปป์ไลน์การอนุญาตจะจำแนกทุกคำขอขาเข้าและใช้ลำดับนโยบายที่เหมาะสมก่อนส่งต่อ
- จุดเข้าสู่ไปป์ไลน์:
src/server/authz/pipeline.ts - ตัวจำแนกคำขอ:
src/server/authz/classify.ts— แยกเส้นทางความเข้ากันได้แบบสาธารณะออกจากเส้นทางการจัดการ - รายการเส้นทางสาธารณะ:
src/shared/constants/publicApiRoutes.ts - นโยบาย:
src/server/authz/policies/— เพรดิเคตที่ประกอบร่วมกันได้ (requireApiKey,requireManagement,requireFreshAuthเป็นต้น) - ยูทิลิตีส่วนหัว:
src/server/authz/headers.ts - ตัวช่วยการยืนยันเงื่อนไข:
src/server/authz/assertAuth.ts - บริบทคำขอ:
src/server/authz/context.ts
เส้นทางสาธารณะและเส้นทางการจัดการมีขอบเขตแบ่งแยกที่ชัดเจน: API ของเอเจนต์/ช่วงพัก และการเปลี่ยนแปลงผู้ให้บริการจำเป็นต้องมีการยืนยันตัวตนสำหรับการจัดการ (HTTP 401 หากไม่มี)
สำหรับกฎการจำแนกเส้นทางฉบับเต็ม โปรดดู
docs/architecture/AUTHZ_GUIDE.md
F. FSM เวิร์กโฟลว์และเราเตอร์ที่ตระหนักถึงงาน
เราเตอร์ที่ขับเคลื่อนด้วยเครื่องสถานะจำกัดซึ่งวางซ้อนเหนือการเลือกคอมโบ เพื่อกำหนดทิศทางทราฟฟิกตามขั้นตอนของเวิร์กโฟลว์ที่ตรวจพบ (การวางแผน การดำเนินการ การตรวจทาน) และความเชื่อมโยงกับงานเบื้องหลัง
- FSM เวิร์กโฟลว์:
open-sse/services/workflowFSM.ts - เราเตอร์ที่ตระหนักถึงงาน:
open-sse/services/taskAwareRouter.ts - ตัวตรวจจับงานเบื้องหลัง:
open-sse/services/backgroundTaskDetector.ts - ตัวจำแนกเจตนา:
open-sse/services/intentClassifier.ts
การเปลี่ยนสถานะของ FSM จะถูกป้อนเข้าสู่การให้คะแนนของ Auto Combo โดยให้น้ำหนักไปยังโมเดลที่มีต้นทุนต่ำกว่าสำหรับงานเบื้องหลัง/งานอัตโนมัติ และให้น้ำหนักไปยังโมเดลที่มีประสิทธิภาพสูงกว่าสำหรับรอบการวางแผน/ตรวจทานแบบโต้ตอบ
G. ความยืดหยุ่นเฉพาะผู้ให้บริการ
ผู้ให้บริการหลายรายมาพร้อมโมดูลความยืดหยุ่นและการพรางตัวโดยเฉพาะ ซึ่งทำงานเสริมกับชั้นตัวตัดวงจรส่วนกลาง / ช่วงพักการเชื่อมต่อ / การล็อกโมเดล:
- เอนจิน Antigravity 429:
open-sse/services/antigravity429Engine.ts(หมุนเวียนข้อมูลประจำตัว ล้างส่วนหัวการตอบกลับ และขับเคลื่อนการติดตามเครดิต/เวอร์ชันผ่านantigravityCredits.ts,antigravityHeaderScrub.ts,antigravityHeaders.ts,antigravityIdentity.ts,antigravityVersion.ts) - นโยบายโควตา ModelScope:
open-sse/services/modelscopePolicy.ts - Claude Code CCH (แฮนด์เช็กช่องทางความเข้ากันได้):
open-sse/services/claudeCodeCCH.ts, รวมถึงclaudeCodeCompatible.ts,claudeCodeConstraints.ts,claudeCodeExtraRemap.ts,claudeCodeToolRemapper.ts - การปรับแต่งลายนิ้วมือ Claude Code:
open-sse/services/claudeCodeFingerprint.ts - การทำให้อ่านไม่ออกของ Claude Code:
open-sse/services/claudeCodeObfuscation.ts
สำหรับคู่มือการพรางตัวฉบับเต็มและแนวทางการปฏิบัติงาน โปรดดู
docs/security/STEALTH_GUIDE.md (git; ไม่ได้คอมไพล์ไว้ใน /docs)
H. เว็บฮุก แคชการให้เหตุผล และแคชการอ่าน
- เว็บฮุก — การส่งข้อมูลขาออกสำหรับเหตุการณ์ของผู้ให้บริการ/บัญชี/งาน
- ตัวส่ง:
src/lib/webhookDispatcher.ts - พื้นที่จัดเก็บ: ตาราง SQLite
webhooks(ผ่านsrc/lib/db/webhooks.ts) - แดชบอร์ด:
/dashboard/webhooks(การสมัครรับข้อมูล ข้อมูลลับ ประวัติการลองใหม่) - สำหรับอนุกรมวิธานของเหตุการณ์และความหมายของการลองใหม่ โปรดดู
docs/frameworks/WEBHOOKS.md
- ตัวส่ง:
- แคชการให้เหตุผล — บล็อกการให้เหตุผลที่เล่นซ้ำได้สำหรับผู้ให้บริการที่ปล่อยโทเค็นการคิด (Claude, GLMT เป็นต้น) เพื่อให้รอบสนทนาต่อเนื่องสามารถข้ามการคิดซ้ำได้
- ชั้นฐานข้อมูล:
src/lib/db/reasoningCache.ts - ชั้นบริการ:
open-sse/services/reasoningCache.ts - สำหรับความหมายของการเล่นซ้ำ โปรดดู
docs/routing/REASONING_REPLAY.md
- ชั้นฐานข้อมูล:
- แคชการอ่าน — แคชการตอบกลับอายุสั้นที่ใช้ลายเซ็นเป็นคีย์ และใช้รวมการลองใหม่ที่เหมือนกันจาก SDK ต้นทางที่ทำงานผิดพลาด
- ชั้นฐานข้อมูล:
src/lib/db/readCache.ts - เอนด์พอยต์สถิติ:
GET /api/cache/stats, แดชบอร์ดที่/dashboard/cache
- ชั้นฐานข้อมูล:
3) เลเยอร์การจัดเก็บข้อมูลถาวร
ฐานข้อมูลสถานะหลัก (SQLite):
- โครงสร้างพื้นฐานหลัก:
src/lib/db/core.ts(better-sqlite3, การย้ายข้อมูล, WAL) - การเข้าถึงฐานข้อมูล: นำเข้าโมดูล
src/lib/db/*ที่ต้องการโดยตรง (barrellocalDb.tsแบบเก่าถูกนำออกแล้ว) - ไฟล์:
${DATA_DIR}/storage.sqlite(หรือ$XDG_CONFIG_HOME/omniroute/storage.sqliteเมื่อตั้งค่าไว้ มิฉะนั้นใช้~/.omniroute/storage.sqlite) - เอนทิตี (ตาราง + เนมสเปซ KV): providerConnections, providerNodes, modelAliases, combos, apiKeys, settings, pricing, customModels, proxyConfig, ipFilter, thinkingBudget, systemPrompt
การจัดเก็บข้อมูลการใช้งาน:
- facade:
src/lib/usageDb.ts(โมดูลที่แยกย่อยอยู่ในsrc/lib/usage/*) - ตาราง SQLite ใน
storage.sqlite:usage_history,call_logs,proxy_logs - อาร์ติแฟกต์ไฟล์เสริมยังคงมีไว้เพื่อความเข้ากันได้/การดีบัก (
${DATA_DIR}/log.txt,${DATA_DIR}/call_logs/,<repo>/logs/...) - ไฟล์ JSON แบบเดิมจะถูกย้ายไปยัง SQLite โดยการย้ายข้อมูลเมื่อเริ่มต้นระบบ หากตรวจพบไฟล์เหล่านั้น
ฐานข้อมูลสถานะโดเมน (SQLite):
src/lib/db/domainState.ts— การดำเนินการ CRUD สำหรับสถานะโดเมน- ตาราง (สร้างใน
src/lib/db/core.ts):domain_fallback_chains,domain_budgets,domain_cost_history,domain_lockout_state,domain_circuit_breakers - รูปแบบแคชแบบเขียนผ่าน: Maps ในหน่วยความจำเป็นแหล่งข้อมูลหลักขณะรันไทม์ การเปลี่ยนแปลงจะถูกเขียนไปยัง SQLite แบบซิงโครนัส และสถานะจะถูกกู้คืนจากฐานข้อมูลเมื่อเริ่มต้นระบบแบบ cold start
4) พื้นผิวการยืนยันตัวตน + ความปลอดภัย
- การยืนยันตัวตนด้วยคุกกี้ของแดชบอร์ด:
src/proxy.ts,src/app/api/auth/login/route.ts - การสร้าง/ตรวจสอบ API key:
src/shared/utils/apiKey.ts - ข้อมูลลับของผู้ให้บริการถูกจัดเก็บถาวรในรายการ
providerConnections - รองรับพร็อกซีขาออกผ่าน
open-sse/utils/proxyFetch.ts(ตัวแปรสภาพแวดล้อม) และopen-sse/utils/networkProxy.ts(กำหนดค่าได้แยกตามผู้ให้บริการหรือแบบส่วนกลาง) - ตัวป้องกัน SSRF / URL ขาออก:
src/shared/network/outboundUrlGuard.ts— บล็อกช่วงเครือข่ายแบบ private/loopback/link-local สำหรับการเรียกผู้ให้บริการทั้งหมด - การตรวจสอบตัวแปรสภาพแวดล้อมขณะรันไทม์:
src/lib/env/runtimeEnv.ts— สคีมา Zod สำหรับตัวแปรสภาพแวดล้อมทั้งหมด โดยแสดงผลเป็นข้อผิดพลาด/คำเตือนเมื่อเริ่มต้นระบบ - โทเค็นการซิงค์:
src/lib/db/syncTokens.ts— โทเค็นที่จำกัดขอบเขตสำหรับเอนด์พอยต์ดาวน์โหลดบันเดิลการกำหนดค่า รองรับโดยตาราง SQLitesync_tokens(การย้ายข้อมูล024_create_sync_tokens.sql) - การยืนยันตัวตนระหว่าง WebSocket handshake:
src/lib/ws/handshake.ts— ตรวจสอบคำขออัปเกรด WS ผ่าน API key หรือคุกกี้เซสชัน
5) การซิงค์กับคลาวด์
- การเริ่มต้นตัวกำหนดเวลา:
src/lib/initCloudSync.ts,src/shared/services/initializeCloudSync.ts,src/shared/services/modelSyncScheduler.ts - งานตามรอบเวลา:
src/shared/services/cloudSyncScheduler.ts - งานตามรอบเวลา:
src/shared/services/modelSyncScheduler.ts - เส้นทางควบคุม:
src/app/api/sync/cloud/route.ts
วงจรชีวิตของคำขอ (/v1/chat/completions)
sequenceDiagram
autonumber
participant Client as ไคลเอนต์ CLI/SDK
participant Route as /api/v1/chat/completions
participant Chat as src/sse/handlers/chat
participant Core as open-sse/handlers/chatCore
participant Model as ตัวแก้ไขโมเดล
participant Auth as ตัวเลือกข้อมูลรับรอง
participant Exec as ตัวดำเนินการของผู้ให้บริการ
participant Prov as ผู้ให้บริการต้นทาง
participant Stream as ตัวแปลงสตรีม
participant Usage as usageDb
Client->>Route: POST /v1/chat/completions
Route->>Chat: handleChat(request)
Chat->>Model: แยกวิเคราะห์/แก้ไขโมเดลหรือคอมโบ
alt โมเดลคอมโบ
Chat->>Chat: วนซ้ำโมเดลในคอมโบ (handleComboChat)
end
Chat->>Auth: getProviderCredentials(provider)
Auth-->>Chat: บัญชีที่ใช้งานอยู่ + โทเค็น/API key
Chat->>Core: handleChatCore(body, modelInfo, credentials)
Core->>Core: ตรวจหารูปแบบต้นทาง
Core->>Core: แปลงคำขอเป็นรูปแบบเป้าหมาย
Core->>Exec: execute(provider, transformedBody)
Exec->>Prov: เรียก API ต้นทาง
Prov-->>Exec: การตอบกลับ SSE/JSON
Exec-->>Core: การตอบกลับ + ข้อมูลเมตา
alt 401/403
Core->>Exec: refreshCredentials()
Exec-->>Core: โทเค็นที่อัปเดตแล้ว
Core->>Exec: ลองส่งคำขออีกครั้ง
end
Core->>Stream: แปลง/ปรับสตรีมให้อยู่ในรูปแบบของไคลเอนต์
Stream-->>Client: ส่วนย่อย SSE / การตอบกลับ JSON
Stream->>Usage: ดึงข้อมูลการใช้งาน + จัดเก็บประวัติ/บันทึกถาวร
โฟลว์คอมโบ + การสลับไปใช้บัญชีสำรอง
flowchart TD
A[สตริงโมเดลขาเข้า] --> B{เป็นชื่อคอมโบหรือไม่?}
B -- ใช่ --> C[โหลดลำดับโมเดลของคอมโบ]
B -- ไม่ใช่ --> D[เส้นทางโมเดลเดี่ยว]
C --> E[ลองใช้โมเดล N]
E --> F[ระบุผู้ให้บริการ/โมเดล]
D --> F
F --> G[เลือกข้อมูลประจำตัวของบัญชี]
G --> H{มีข้อมูลประจำตัวหรือไม่?}
H -- ไม่มี --> I[ส่งคืนว่าผู้ให้บริการไม่พร้อมใช้งาน]
H -- มี --> J[ดำเนินการคำขอ]
J --> K{สำเร็จหรือไม่?}
K -- ใช่ --> L[ส่งคืนการตอบกลับ]
K -- ไม่ใช่ --> M{เป็นข้อผิดพลาดที่สามารถสลับไปใช้รายการสำรองได้หรือไม่?}
M -- ไม่ใช่ --> N[ส่งคืนข้อผิดพลาด]
M -- ใช่ --> O[ทำเครื่องหมายบัญชีว่าไม่พร้อมใช้งานในช่วงพัก]
O --> P{มีบัญชีอื่นสำหรับผู้ให้บริการหรือไม่?}
P -- ใช่ --> G
P -- ไม่ใช่ --> Q{อยู่ในคอมโบที่มีโมเดลถัดไปหรือไม่?}
Q -- ใช่ --> E
Q -- ไม่ใช่ --> R[ส่งคืนว่าทั้งหมดไม่พร้อมใช้งาน]
การตัดสินใจสลับไปใช้รายการสำรองขับเคลื่อนโดย open-sse/services/accountFallback.ts ซึ่งใช้รหัสสถานะและฮิวริสติกจากข้อความข้อผิดพลาด การกำหนดเส้นทางแบบคอมโบเพิ่มเงื่อนไขป้องกันอีกหนึ่งชั้น: ข้อผิดพลาด 400 ที่จำกัดขอบเขตเฉพาะผู้ให้บริการ เช่น ความล้มเหลวจากการบล็อกเนื้อหาต้นทางและการตรวจสอบบทบาท จะถือเป็นความล้มเหลวเฉพาะโมเดล เพื่อให้เป้าหมายลำดับถัดไปในคอมโบยังคงทำงานได้
วงจรการเริ่มต้นใช้งาน OAuth และการรีเฟรชโทเค็น
sequenceDiagram
autonumber
participant UI as UI แดชบอร์ด
participant OAuth as /api/oauth/[provider]/[action]
participant ProvAuth as เซิร์ฟเวอร์การยืนยันตัวตนของผู้ให้บริการ
participant DB as localDb
participant Test as /api/providers/[id]/test
participant Exec as ตัวดำเนินการของผู้ให้บริการ
UI->>OAuth: GET authorize หรือ device-code
OAuth->>ProvAuth: สร้างโฟลว์การยืนยันตัวตน/อุปกรณ์
ProvAuth-->>OAuth: URL การยืนยันตัวตนหรือเพย์โหลดรหัสอุปกรณ์
OAuth-->>UI: ข้อมูลโฟลว์
UI->>OAuth: POST exchange หรือ poll
OAuth->>ProvAuth: แลกเปลี่ยน/ตรวจสอบโทเค็น
ProvAuth-->>OAuth: โทเค็นการเข้าถึง/รีเฟรช
OAuth->>DB: createProviderConnection(ข้อมูล oauth)
OAuth-->>UI: สำเร็จ + ID การเชื่อมต่อ
UI->>Test: POST /api/providers/[id]/test
Test->>Exec: ตรวจสอบข้อมูลประจำตัว / รีเฟรชเพิ่มเติม
Exec-->>Test: ข้อมูลโทเค็นที่ถูกต้องหรือได้รับการรีเฟรชแล้ว
Test->>DB: อัปเดตสถานะ/โทเค็น/ข้อผิดพลาด
Test-->>UI: ผลการตรวจสอบ
การรีเฟรชระหว่างการรับส่งข้อมูลจริงจะดำเนินการภายใน open-sse/handlers/chatCore.ts ผ่าน refreshCredentials() ของตัวดำเนินการ
วงจรการซิงค์กับคลาวด์ (เปิดใช้งาน / ซิงค์ / ปิดใช้งาน)
sequenceDiagram
autonumber
participant UI as UI หน้าเอนด์พอยต์
participant Sync as /api/sync/cloud
participant DB as localDb
participant Cloud as บริการซิงค์กับคลาวด์ภายนอก
participant Claude as ~/.claude/settings.json
UI->>Sync: POST action=enable
Sync->>DB: ตั้งค่า cloudEnabled=true
Sync->>DB: ตรวจสอบให้แน่ใจว่ามีคีย์ API
Sync->>Cloud: POST /sync/{machineId} (ผู้ให้บริการ/นามแฝง/คอมโบ/คีย์)
Cloud-->>Sync: ผลการซิงค์
Sync->>Cloud: GET /{machineId}/v1/verify
Sync-->>UI: เปิดใช้งานแล้ว + สถานะการตรวจสอบ
UI->>Sync: POST action=sync
Sync->>Cloud: POST /sync/{machineId}
Cloud-->>Sync: ข้อมูลระยะไกล
Sync->>DB: อัปเดตโทเค็น/สถานะในเครื่องที่ใหม่กว่า
Sync-->>UI: ซิงค์แล้ว
UI->>Sync: POST action=disable
Sync->>DB: ตั้งค่า cloudEnabled=false
Sync->>Cloud: DELETE /sync/{machineId}
Sync->>Claude: เปลี่ยน ANTHROPIC_BASE_URL กลับเป็นภายในเครื่อง (หากจำเป็น)
Sync-->>UI: ปิดใช้งานแล้ว
การซิงค์ตามช่วงเวลาจะถูกทริกเกอร์โดย CloudSyncScheduler เมื่อเปิดใช้งานคลาวด์
โมเดลข้อมูลและแผนผังพื้นที่จัดเก็บ
erDiagram
SETTINGS ||--o{ PROVIDER_CONNECTION : controls
PROVIDER_NODE ||--o{ PROVIDER_CONNECTION : backs_compatible_provider
PROVIDER_CONNECTION ||--o{ USAGE_ENTRY : emits_usage
SETTINGS {
boolean cloudEnabled
number stickyRoundRobinLimit
boolean requireLogin
string password_hash
string fallbackStrategy
json rateLimitDefaults
json providerProfiles
}
PROVIDER_CONNECTION {
string id
string provider
string authType
string name
number priority
boolean isActive
string apiKey
string accessToken
string refreshToken
string expiresAt
string testStatus
string lastError
string rateLimitedUntil
json providerSpecificData
}
PROVIDER_NODE {
string id
string type
string name
string prefix
string apiType
string baseUrl
}
MODEL_ALIAS {
string alias
string targetModel
}
COMBO {
string id
string name
string[] models
}
API_KEY {
string id
string name
string key
string machineId
}
USAGE_ENTRY {
string provider
string model
number prompt_tokens
number completion_tokens
string connectionId
string timestamp
}
CUSTOM_MODEL {
string id
string name
string providerId
}
PROXY_CONFIG {
string global
json providers
}
IP_FILTER {
string mode
string[] allowlist
string[] blocklist
}
THINKING_BUDGET {
string mode
number customBudget
string effortLevel
}
SYSTEM_PROMPT {
boolean enabled
string prompt
string position
}
ไฟล์จัดเก็บจริง:
- ฐานข้อมูลรันไทม์หลัก:
${DATA_DIR}/storage.sqlite - บรรทัดบันทึกคำขอ:
${DATA_DIR}/log.txt(อาร์ติแฟกต์สำหรับความเข้ากันได้/การดีบัก) - ที่จัดเก็บถาวรสำหรับเพย์โหลดการเรียกแบบมีโครงสร้าง:
${DATA_DIR}/call_logs/ - เซสชันดีบักตัวแปล/คำขอที่ไม่บังคับ:
<repo>/logs/...
โทโพโลยีการปรับใช้
flowchart LR
subgraph LocalHost[Developer Host]
CLI[CLI Tools]
Browser[Dashboard Browser]
end
subgraph ContainerOrProcess[OmniRoute Runtime]
Next[Next.js Server\nPORT=20128]
Core[SSE Core + Executors]
MainDB[(storage.sqlite)]
UsageDB[(usage tables + log artifacts)]
end
subgraph External[External Services]
Providers[AI Providers]
SyncCloud[Cloud Sync Service]
end
CLI --> Next
Browser --> Next
Next --> Core
Next --> MainDB
Core --> MainDB
Core --> UsageDB
Core --> Providers
Next --> SyncCloud
การแมปโมดูล (สำคัญต่อการตัดสินใจ)
โมดูลเส้นทางและ API
src/app/api/v1/*,src/app/api/v1beta/*: API สำหรับความเข้ากันได้src/app/api/v1/providers/[provider]/*: เส้นทางเฉพาะสำหรับผู้ให้บริการแต่ละราย (แชต, embeddings, รูปภาพ)src/app/api/providers*: การดำเนินการ CRUD, การตรวจสอบความถูกต้อง และการทดสอบผู้ให้บริการsrc/app/api/provider-nodes*: การจัดการโหนดแบบกำหนดเองที่เข้ากันได้src/app/api/provider-models: การจัดการโมเดลแบบกำหนดเอง (CRUD)src/app/api/models/route.ts: API แค็ตตาล็อกโมเดล (ชื่อแทน + โมเดลแบบกำหนดเอง)src/app/api/oauth/*: โฟลว์ OAuth/รหัสอุปกรณ์src/app/api/keys*: วงจรชีวิตของคีย์ API ภายในเครื่องsrc/app/api/models/alias: การจัดการชื่อแทนsrc/app/api/combos*: การจัดการคอมโบสำรองsrc/app/api/pricing: การแทนที่ราคาสำหรับการคำนวณต้นทุนsrc/app/api/settings/proxy: การกำหนดค่าพร็อกซี (GET/PUT/DELETE)src/app/api/settings/proxy/test: การทดสอบการเชื่อมต่อพร็อกซีขาออก (POST)src/app/api/usage/*: API สำหรับการใช้งานและบันทึกsrc/app/api/sync/*+src/app/api/cloud/*: การซิงค์กับคลาวด์และตัวช่วยสำหรับการติดต่อกับคลาวด์src/app/api/cli-tools/*: ตัวเขียน/ตัวตรวจสอบการกำหนดค่า CLI ภายในเครื่องsrc/app/api/settings/ip-filter: รายการอนุญาต/รายการบล็อก IP (GET/PUT)src/app/api/settings/thinking-budget: การกำหนดค่างบประมาณโทเค็นสำหรับการคิด (GET/PUT)src/app/api/settings/system-prompt: พรอมต์ระบบส่วนกลาง (GET/PUT)src/app/api/settings/compression: การตั้งค่าการบีบอัดส่วนกลาง (GET/PUT)src/app/api/compression/*: ตัวอย่างการบีบอัด ข้อมูลเมตาของกฎ และชุดภาษาsrc/app/api/context/caveman/config: ชื่อแทนสำหรับการตั้งค่า Caveman (GET/PUT)src/app/api/context/rtk/*: การกำหนดค่า RTK, แค็ตตาล็อกตัวกรอง, เอนด์พอยต์ทดสอบ และการกู้คืนเอาต์พุตดิบsrc/app/api/context/combos*: การดำเนินการ CRUD สำหรับคอมโบการบีบอัดและการกำหนดคอมโบการกำหนดเส้นทางsrc/app/api/context/analytics: ชื่อแทนสำหรับการวิเคราะห์การบีบอัดsrc/app/api/sessions: รายการเซสชันที่ใช้งานอยู่ (GET)src/app/api/rate-limits: สถานะขีดจำกัดอัตราต่อบัญชี (GET)src/app/api/sync/tokens: การดำเนินการ CRUD สำหรับโทเค็นการซิงค์ (GET/POST)src/app/api/sync/tokens/[id]: การรับ/ลบโทเค็นการซิงค์ (GET/DELETE)src/app/api/sync/bundle: การดาวน์โหลดบันเดิลการกำหนดค่า (GET, การกำหนดเวอร์ชันด้วย ETag)src/app/api/v1/ws: ตัวจัดการการอัปเกรด WebSocket สำหรับไคลเอนต์ WS ที่เข้ากันได้กับ OpenAI
แกนหลักของการกำหนดเส้นทางและการดำเนินการ
src/sse/handlers/chat.ts: การแยกวิเคราะห์คำขอ การจัดการคอมโบ และลูปการเลือกบัญชีopen-sse/handlers/chatCore.ts: การแปล การส่งต่อไปยังตัวดำเนินการ การจัดการการลองใหม่/รีเฟรช และการตั้งค่าสตรีมopen-sse/executors/*: พฤติกรรมด้านเครือข่ายและรูปแบบที่เฉพาะเจาะจงสำหรับผู้ให้บริการ
รีจิสทรีการแปลและตัวแปลงรูปแบบ
open-sse/translator/index.ts: รีจิสทรีและการประสานงานของตัวแปล- ตัวแปลคำขอ:
open-sse/translator/request/*(9 โมดูล —antigravity-to-openai,claude-to-gemini,claude-to-openai,gemini-to-openai,openai-responses,openai-to-claude,openai-to-cursor,openai-to-gemini,openai-to-kiro) - ตัวแปลการตอบกลับ:
open-sse/translator/response/*(11 โมดูล —claude-to-openai,cursor-to-openai,gemini-to-claude,gemini-to-openai,kiro-to-openai,openai-responses,openai-to-antigravity,openai-to-claude,openai-to-gemini,openai-to-gemini-sse,responsesToolItem) - ตัวช่วย:
open-sse/translator/helpers/*(12 โมดูล —claudeHelper,geminiHelper,geminiToolsSanitizer,jsonUtil,markdownBoundary,maxTokensHelper,openaiHelper,responsesApiHelper,schemaCoercion,strictSystemHoist,toolCallHelper,toolCallShim) - ค่าคงที่ของรูปแบบ:
open-sse/translator/formats.ts - การเริ่มต้นระบบและรีจิสทรี:
open-sse/translator/bootstrap.ts,open-sse/translator/registry.ts - ตัวช่วยสำหรับรูปแบบรูปภาพ:
open-sse/translator/image/
การจัดเก็บถาวร
src/lib/db/*: การกำหนดค่า/สถานะถาวรและการจัดเก็บข้อมูลโดเมนบน SQLitesrc/lib/db/*: นำเข้าโมดูลที่ต้องการโดยตรง — ไม่มี barrel (เลเยอร์ re-export เดิมlocalDb.tsถูกนำออกแล้ว)src/lib/usageDb.ts: facade สำหรับประวัติการใช้งาน/บันทึกการเรียกที่อยู่บนตาราง SQLite
ความครอบคลุมของ Provider Executor (รูปแบบ Strategy)
ผู้ให้บริการแต่ละรายมี executor เฉพาะทางที่สืบทอดจาก BaseExecutor (ใน open-sse/executors/base.ts) ซึ่งมีความสามารถในการสร้าง URL, การสร้าง header, การลองใหม่โดยใช้ exponential backoff, hook สำหรับรีเฟรชข้อมูลประจำตัว และเมธอด execute() สำหรับควบคุมลำดับการทำงาน
| ตัวดำเนินการ | ผู้ให้บริการ | การจัดการพิเศษ |
|---|---|---|
DefaultExecutor |
OpenAI, Claude, Gemini, Qwen, OpenRouter, GLM, Kimi, MiniMax, DeepSeek, Groq, xAI, Mistral, Perplexity, Together, Fireworks, Cerebras, Cohere, NVIDIA ฯลฯ | การกำหนดค่า URL/ส่วนหัวแบบไดนามิกสำหรับผู้ให้บริการแต่ละราย |
AntigravityExecutor |
Google Antigravity | ID โปรเจกต์/เซสชันแบบกำหนดเอง การแยกวิเคราะห์ Retry-After และการพรางข้อผิดพลาด 429 |
AzureOpenAIExecutor |
Azure OpenAI | การกำหนดเส้นทางตามการปรับใช้ และการบังคับใช้คิวรี api-version |
BlackboxWebExecutor |
Blackbox AI (โหมดเว็บ) | การทำวิศวกรรมย้อนกลับเซสชันเว็บพร้อมจำลองลายนิ้วมือ TLS |
ClaudeIdentityExecutor |
Claude.ai (เส้นทาง CCH) | ไปป์ไลน์ข้อจำกัดและการแมปเครื่องมือใหม่ พร้อมการปรับแต่งลายนิ้วมือ |
CliProxyApiExecutor |
ผู้ให้บริการที่เข้ากันได้กับ CLIProxyAPI | การจัดการการยืนยันตัวตนและโปรโตคอลแบบกำหนดเอง |
CloudflareAiExecutor |
Cloudflare Workers AI | การแทรก ID บัญชี และการติดตามการใช้งานที่อิงกับ Neurons |
CodexExecutor |
OpenAI Codex | แทรกคำสั่งระบบและบังคับระดับความพยายามในการให้เหตุผล |
ChatGptWebCodexExecutor |
ChatGPT Web (Codex) | บริดจ์ Responses API สำหรับเซสชันเบราว์เซอร์ พร้อมการตรึงเธรด/เทิร์น |
CommandCodeExecutor |
Command Code | OAuth และการหมุนเวียนส่วนหัวต่อเซสชัน |
CursorExecutor |
Cursor IDE | โปรโตคอล ConnectRPC การเข้ารหัส Protobuf และการลงนามคำขอผ่าน checksum |
DevinCliExecutor |
Devin CLI | บริดจ์วงจรชีวิตงาน Devin ผ่านโมดูลเอเจนต์บนคลาวด์ |
GithubExecutor |
GitHub Copilot | การรีเฟรชโทเค็น Copilot และส่วนหัวที่เลียนแบบ VSCode |
GitlabExecutor |
GitLab Duo | GitLab OAuth และการกำหนดเส้นทางตามขอบเขตโปรเจกต์ |
GlmExecutor |
Z.AI GLM (รวมพรีเซ็ต glmt) |
รองรับงบประมาณการคิด พร้อมค่าคงที่ของพรีเซ็ต GLMT |
GrokWebExecutor |
xAI Grok web | การทำวิศวกรรมย้อนกลับเซสชันเว็บ และการเลือกโหมด (คิด/มาตรฐาน) |
KieExecutor |
KIE | การออกโทเค็นแบบกำหนดเองพร้อมจุดยึดเซสชันที่หมุนเวียน |
KiroExecutor |
AWS CodeWhisperer/Kiro | การแปลงรูปแบบไบนารี AWS EventStream → SSE |
MuseSparkWebExecutor |
Muse Spark (เว็บ) | การทำวิศวกรรมย้อนกลับเซสชันเว็บพร้อมบริดจ์ข้อความรูปภาพ |
NlpCloudExecutor |
NLP Cloud | รูปแบบเนื้อหาคำขอเฉพาะผู้ให้บริการ |
OpenCodeExecutor |
OpenCode | การตั้งค่าผู้ให้บริการที่เข้ากันได้กับ AI SDK |
PerplexityWebExecutor |
Perplexity web | การทำวิศวกรรมย้อนกลับเซสชันเว็บเพื่อสนทนาต่อเนื่อง |
PetalsExecutor |
การอนุมานแบบกระจายของ Petals | การกำหนดเส้นทางผ่านสวอร์มแบบกระจายศูนย์ |
PollinationsExecutor |
Pollinations AI | ไม่ต้องใช้คีย์ API และมีการจำกัดอัตราคำขอ |
QoderExecutor |
Qoder AI | รองรับ PAT และ OAuth พร้อมระดับใช้งานฟรีแบบหลายโมเดล |
VertexExecutor |
Google Vertex AI | การยืนยันตัวตนด้วยบัญชีบริการ และเอนด์พอยต์ตามภูมิภาค |
DevinDesktopExecutor |
Devin Desktop | คีย์ API ที่นำเข้า และการสตรีมแชตผ่าน Connect-protobuf |
ผู้ให้บริการอื่นๆ ทั้งหมด (รวมถึงโหนดแบบกำหนดเองที่เข้ากันได้) ใช้ DefaultExecutor
เมทริกซ์ความเข้ากันได้ของผู้ให้บริการ
หมายเหตุ: เมทริกซ์ด้านล่างเป็นตัวอย่างที่ใช้เป็นตัวแทนของผู้ให้บริการที่ลงทะเบียนไว้ทั้งหมด 351 รายใน OmniRoute v3.8.0 สำหรับรายการมาตรฐานที่อัปเดตอย่างต่อเนื่อง โปรดดูที่
docs/reference/PROVIDER_REFERENCE.md(สร้างขึ้นโดยอัตโนมัติ) หรือแหล่งข้อมูล ที่เป็นข้อมูลอ้างอิงหลักที่src/shared/constants/providers.ts(ตรวจสอบความถูกต้องด้วย Zod ขณะโหลด)
| ผู้ให้บริการ | รูปแบบ | การยืนยันตัวตน | สตรีม | ไม่สตรีม | การรีเฟรชโทเค็น | API การใช้งาน |
|---|---|---|---|---|---|---|
| Claude | claude | คีย์ API / OAuth | ✅ | ✅ | ✅ | ⚠️ ผู้ดูแลระบบเท่านั้น |
| Gemini | gemini | คีย์ API / OAuth | ✅ | ✅ | ✅ | ⚠️ Cloud Console |
| Antigravity | antigravity | OAuth | ✅ | ✅ | ✅ | ✅ API โควตาแบบเต็ม |
| OpenAI | openai | คีย์ API | ✅ | ✅ | ❌ | ❌ |
| Codex | openai-responses | OAuth | ✅ บังคับ | ❌ | ✅ | ✅ ขีดจำกัดอัตราการใช้งาน |
| ChatGPT Web (Codex) | openai-responses | เซสชันเบราว์เซอร์ | ✅ บังคับ | ❌ | ❌ | ❌ |
| GitHub Copilot | openai | OAuth + โทเค็น Copilot | ✅ | ✅ | ✅ | ✅ สแนปชอตโควตา |
| Cursor | cursor | เช็กซัมแบบกำหนดเอง | ✅ | ✅ | ❌ | ❌ |
| Kiro | kiro | AWS SSO OIDC | ✅ (EventStream) | ❌ | ✅ | ✅ ขีดจำกัดการใช้งาน |
| Qoder | openai | OAuth / PAT | ✅ | ✅ | ✅ | ⚠️ ต่อคำขอ |
| Kilo Code | openai | OAuth | ✅ | ✅ | ✅ | ❌ |
| Cline | openai | OAuth | ✅ | ✅ | ✅ | ❌ |
| Kimi Coding | openai | OAuth | ✅ | ✅ | ✅ | ❌ |
| OpenRouter | openai | คีย์ API | ✅ | ✅ | ❌ | ❌ |
| GLM/Kimi/MiniMax | claude | คีย์ API | ✅ | ✅ | ❌ | ❌ |
| DeepSeek | openai | คีย์ API | ✅ | ✅ | ❌ | ❌ |
| Groq | openai | คีย์ API | ✅ | ✅ | ❌ | ❌ |
| xAI (Grok) | openai | คีย์ API | ✅ | ✅ | ❌ | ❌ |
| Mistral | openai | คีย์ API | ✅ | ✅ | ❌ | ❌ |
| Perplexity | openai | คีย์ API | ✅ | ✅ | ❌ | ❌ |
| Together AI | openai | คีย์ API | ✅ | ✅ | ❌ | ❌ |
| Fireworks AI | openai | คีย์ API | ✅ | ✅ | ❌ | ❌ |
| Cerebras | openai | คีย์ API | ✅ | ✅ | ❌ | ❌ |
| Cohere | openai | คีย์ API | ✅ | ✅ | ❌ | ❌ |
| NVIDIA NIM | openai | คีย์ API | ✅ | ✅ | ❌ | ❌ |
| Cloudflare AI | openai | โทเค็น API + ID บัญชี | ✅ | ✅ | ❌ | ❌ |
| Pollinations | openai | ไม่มี (ไม่ต้องใช้คีย์) | ✅ | ✅ | ❌ | ❌ |
| Scaleway AI | openai | คีย์ API | ✅ | ✅ | ❌ | ❌ |
| LongCat | openai | คีย์ API | ✅ | ✅ | ❌ | ❌ |
| Ollama Cloud | openai | คีย์ API (ไม่บังคับ) | ✅ | ✅ | ❌ | ❌ |
| HuggingFace | openai | คีย์ API | ✅ | ✅ | ❌ | ❌ |
| Nebius | openai | คีย์ API | ✅ | ✅ | ❌ | ❌ |
| SiliconFlow | openai | คีย์ API | ✅ | ✅ | ❌ | ❌ |
| Hyperbolic | openai | คีย์ API | ✅ | ✅ | ❌ | ❌ |
| Vertex AI | gemini | บัญชีบริการ | ✅ | ✅ | ✅ | ⚠️ Cloud Console |
| Command Code | openai | OAuth | ✅ | ✅ | ✅ | ⚠️ ต่อคำขอ |
| Z.AI / GLM | openai | คีย์ API / OAuth | ✅ | ✅ | ❌ | ❌ |
| GLMT (ค่าที่ตั้งไว้ล่วงหน้า) | claude | คีย์ API | ✅ | ✅ | ❌ | ⚠️ ต่อคำขอ |
| Kimi Coding | openai | OAuth / คีย์ API | ✅ | ✅ | ✅ | ❌ |
| KIE | openai | คีย์ API | ✅ | ✅ | ❌ | ❌ |
| Devin Desktop | openai | คีย์ API ที่นำเข้า | ✅ (Connect→SSE) | ✅ | ❌ | ⚠️ ต่อคำขอ |
| GitLab Duo | openai | OAuth (GitLab) | ✅ | ✅ | ✅ | ❌ |
| Devin CLI | openai | การเข้าสู่ระบบ CLI ภายในเครื่อง | ✅ | ✅ | ❌ | ✅ API งาน |
| Codex Cloud | openai-responses | OAuth | ✅ | ❌ | ✅ | ✅ ขีดจำกัดอัตราการใช้งาน |
| Jules | openai | OAuth | ✅ | ✅ | ✅ | ✅ API งาน |
| AgentRouter | openai | คีย์ API | ✅ | ✅ | ❌ | ❌ |
| Grok-Web | openai | คุกกี้เซสชัน | ✅ | ✅ | ❌ | ❌ |
| Perplexity-Web | openai | คุกกี้เซสชัน | ✅ | ✅ | ❌ | ❌ |
| BlackBox-Web | openai | คุกกี้เซสชัน + TLS | ✅ | ✅ | ❌ | ❌ |
| Muse-Spark-Web | openai | คุกกี้เซสชัน | ✅ | ✅ | ❌ | ❌ |
| ModelScope | openai | คีย์ API | ✅ | ✅ | ❌ | ⚠️ นโยบายโควตา |
| BazaarLink | openai | คีย์ API | ✅ | ✅ | ❌ | ❌ |
| Petals | openai | ไม่มี | ✅ | ✅ | ❌ | ❌ |
| Qoder | openai | OAuth / PAT | ✅ | ✅ | ✅ | ⚠️ ต่อคำขอ |
| OpenCode (Go/Zen) | openai | OAuth | ✅ | ✅ | ✅ | ❌ |
| CLIProxyAPI | openai | กำหนดเอง | ✅ | ✅ | ❌ | ❌ |
ความครอบคลุมของการแปลงรูปแบบ
รูปแบบต้นทางที่ตรวจพบประกอบด้วย:
openaiopenai-responsesclaudegemini
รูปแบบปลายทางประกอบด้วย:
- แชต/Responses ของ OpenAI
- Claude
- เอนเวโลป Gemini/Antigravity
- Kiro
- Cursor
การแปลงใช้ OpenAI เป็นรูปแบบศูนย์กลาง — การแปลงทั้งหมดจะผ่าน OpenAI เป็นรูปแบบตัวกลาง:
รูปแบบต้นทาง → OpenAI (ศูนย์กลาง) → รูปแบบปลายทาง
ระบบจะเลือกวิธีการแปลงแบบไดนามิกตามโครงสร้างเพย์โหลดต้นทางและรูปแบบปลายทางของผู้ให้บริการ
ชั้นการประมวลผลเพิ่มเติมในไปป์ไลน์การแปลง:
- การปรับการตอบกลับให้เป็นมาตรฐาน — ลบฟิลด์ที่ไม่เป็นมาตรฐานออกจากการตอบกลับในรูปแบบ OpenAI (ทั้งแบบสตรีมและไม่ใช่สตรีม) เพื่อให้สอดคล้องกับข้อกำหนดของ SDK อย่างเคร่งครัด
- การปรับบทบาทให้เป็นมาตรฐาน — แปลง
developer→systemสำหรับปลายทางที่ไม่ใช่ OpenAI และผสานsystem→userสำหรับโมเดลที่ไม่รองรับบทบาท system (GLM, ERNIE) - การแยกแท็กการคิดวิเคราะห์ — แยกวิเคราะห์บล็อก
<think>...</think>จากเนื้อหาไปยังฟิลด์reasoning_content - เอาต์พุตแบบมีโครงสร้าง — แปลง
response_format.json_schemaของ OpenAI เป็นresponseMimeType+responseSchemaของ Gemini
เอนด์พอยต์ API ที่รองรับ
| เอนด์พอยต์ | รูปแบบ | ตัวจัดการ |
|---|---|---|
POST /v1/chat/completions |
แชต OpenAI | src/sse/handlers/chat.ts |
POST /v1/messages |
Messages ของ Claude | ตัวจัดการเดียวกัน (ตรวจจับอัตโนมัติ) |
POST /v1/responses |
Responses ของ OpenAI | open-sse/handlers/responsesHandler.ts |
POST /v1/embeddings |
Embeddings ของ OpenAI | open-sse/handlers/embeddings.ts |
GET /v1/embeddings |
รายการโมเดล | เส้นทาง API |
POST /v1/images/generations |
Images ของ OpenAI | open-sse/handlers/imageGeneration.ts |
GET /v1/images/generations |
รายการโมเดล | เส้นทาง API |
POST /v1/providers/{provider}/chat/completions |
แชต OpenAI | เอนด์พอยต์เฉพาะสำหรับผู้ให้บริการแต่ละราย พร้อมการตรวจสอบโมเดล |
POST /v1/providers/{provider}/embeddings |
Embeddings ของ OpenAI | เอนด์พอยต์เฉพาะสำหรับผู้ให้บริการแต่ละราย พร้อมการตรวจสอบโมเดล |
POST /v1/providers/{provider}/images/generations |
Images ของ OpenAI | เอนด์พอยต์เฉพาะสำหรับผู้ให้บริการแต่ละราย พร้อมการตรวจสอบโมเดล |
POST /v1/messages/count_tokens |
การนับโทเค็นของ Claude | เส้นทาง API |
GET /v1/models |
รายการโมเดลของ OpenAI | เส้นทาง API (โมเดลแชต + embedding + รูปภาพ + โมเดลกำหนดเอง) |
GET /api/models/catalog |
แค็ตตาล็อก | โมเดลทั้งหมดที่จัดกลุ่มตามผู้ให้บริการ + ประเภท |
POST /v1beta/models/*:streamGenerateContent |
Gemini แบบเนทีฟ | เส้นทาง API |
GET/PUT/DELETE /api/settings/proxy |
การกำหนดค่าพร็อกซี | การกำหนดค่าพร็อกซีเครือข่าย |
POST /api/settings/proxy/test |
การเชื่อมต่อพร็อกซี | เอนด์พอยต์สำหรับทดสอบสถานะและการเชื่อมต่อของพร็อกซี |
GET/POST/DELETE /api/provider-models |
โมเดลของผู้ให้บริการ | เมทาดาทาโมเดลของผู้ให้บริการที่รองรับโมเดลพร้อมใช้งานทั้งแบบกำหนดเองและแบบจัดการ |
ตัวจัดการการข้ามคำขอ
ตัวจัดการการข้ามคำขอ (open-sse/utils/bypassHandler.ts) จะดักจับคำขอแบบ "ใช้แล้วทิ้ง" ที่ทราบจักจาก Claude CLI ได้แก่ ping สำหรับการอุ่นระบบ การดึงชื่อเรื่อง และการนับโทเค็น แล้วส่งคืน การตอบกลับปลอม โดยไม่ใช้โทเค็นของผู้ให้บริการต้นทาง กลไกนี้จะทำงานเฉพาะเมื่อ User-Agent มี claude-cli
การบันทึกคำขอและอาร์ติแฟกต์
ตัวบันทึกคำขอแบบไฟล์รุ่นเก่า (open-sse/utils/requestLogger.ts) ยังคงมีไว้เพื่อ
รองรับความเข้ากันได้กับระบบเดิมเท่านั้น ข้อกำหนดของรันไทม์ปัจจุบันใช้:
APP_LOG_TO_FILE=trueสำหรับบันทึกของแอปพลิเคชันและบันทึกการตรวจสอบที่เขียนไว้ภายใต้<repo>/logs/- ระเบียนบันทึกการเรียกที่ใช้ SQLite เป็นระบบจัดเก็บใน
call_logs - อาร์ติแฟกต์
${DATA_DIR}/call_logs/YYYY-MM-DD/...เมื่อเปิดใช้งานไปป์ไลน์บันทึกการเรียก
โหมดความล้มเหลวและความยืดหยุ่น
1) ความพร้อมใช้งานของบัญชี/ผู้ให้บริการ
- พักการเชื่อมต่อชั่วคราวเมื่อเกิดความล้มเหลวจากต้นทางที่ลองใหม่ได้
- สลับไปใช้บัญชีสำรองก่อนทำให้คำขอล้มเหลว
- สลับไปใช้โมเดลแบบผสมสำรองเมื่อเส้นทางโมเดล/ผู้ให้บริการปัจจุบันไม่สามารถใช้งานต่อได้
2) การหมดอายุของโทเค็น
- ตรวจสอบล่วงหน้าและรีเฟรชพร้อมการลองใหม่สำหรับผู้ให้บริการที่รองรับการรีเฟรช
- ลองใหม่เมื่อได้รับ 401/403 หลังจากพยายามรีเฟรชในเส้นทางหลัก
3) ความปลอดภัยของสตรีม
- ตัวควบคุมสตรีมที่รับรู้การตัดการเชื่อมต่อ
- สตรีมการแปลงที่มีการระบายข้อมูลเมื่อสิ้นสุดสตรีมและการจัดการ
[DONE] - ใช้การประมาณการใช้งานเป็นทางเลือกสำรองเมื่อไม่มีข้อมูลเมตาการใช้งานจากผู้ให้บริการ
4) การลดระดับการทำงานของการซิงค์กับคลาวด์
- ข้อผิดพลาดจากการซิงค์จะถูกรายงาน แต่รันไทม์ภายในเครื่องยังคงทำงานต่อไป
- ตัวจัดกำหนดการมีตรรกะที่รองรับการลองใหม่ แต่ปัจจุบันการทำงานตามรอบจะเรียกใช้การซิงค์แบบพยายามครั้งเดียวโดยค่าเริ่มต้น
5) ความสมบูรณ์ของข้อมูล
- การย้ายสคีมา SQLite และฮุกอัปเกรดอัตโนมัติเมื่อเริ่มต้นระบบ
- เส้นทางความเข้ากันได้สำหรับการย้ายข้อมูลจาก JSON รุ่นเก่า → SQLite
6) ตัวป้องกัน SSRF / URL ขาออก
src/shared/network/outboundUrlGuard.tsบล็อก URL เป้าหมายที่เป็นเครือข่ายส่วนตัว/ลูปแบ็ก/ลิงก์โลคัลทั้งหมดก่อนที่จะไปถึงตัวดำเนินการของผู้ให้บริการ- เส้นทางการค้นหาและตรวจสอบความถูกต้องของโมเดลผู้ให้บริการใช้
src/shared/network/safeOutboundFetch.tsซึ่งใช้ตัวป้องกันก่อนคำขอขาออกทุกครั้ง - ข้อผิดพลาดของตัวป้องกันจะแสดงเป็น
URL_GUARD_BLOCKEDพร้อม HTTP 422 และถูกบันทึกลงในบันทึกการตรวจสอบการปฏิบัติตามข้อกำหนดผ่านproviderAudit.ts
การสังเกตการณ์และสัญญาณการปฏิบัติงาน
แหล่งข้อมูลสำหรับตรวจสอบสถานะรันไทม์:
- บันทึกคอนโซลจาก
src/sse/utils/logger.ts - ข้อมูลสรุปการใช้งานต่อคำขอใน SQLite (
usage_history,call_logs,proxy_logs) - การบันทึกเพย์โหลดโดยละเอียดสี่ขั้นตอนใน SQLite (
request_detail_logs) เมื่อsettings.detailed_logs_enabled=true - บันทึกสถานะคำขอแบบข้อความใน
log.txt(เป็นทางเลือก/เพื่อความเข้ากันได้) - ไฟล์บันทึกของแอปพลิเคชันภายใต้
logs/ซึ่งเป็นทางเลือก เมื่อAPP_LOG_TO_FILE=true - อาร์ติแฟกต์คำขอภายใต้
${DATA_DIR}/call_logs/ซึ่งเป็นทางเลือก เมื่อเปิดใช้งานไปป์ไลน์บันทึกการเรียก - เอนด์พอยต์การใช้งานของแดชบอร์ด (
/api/usage/*) สำหรับการใช้งานโดย UI
การบันทึกเพย์โหลดคำขอโดยละเอียดจะจัดเก็บเพย์โหลด JSON ได้สูงสุดสี่ขั้นตอนต่อการเรียกที่ผ่านการกำหนดเส้นทาง:
- คำขอดิบที่ได้รับจากไคลเอนต์
- คำขอที่แปลงแล้วและส่งไปยังต้นทางจริง
- การตอบกลับจากผู้ให้บริการที่สร้างกลับเป็น JSON โดยการตอบกลับแบบสตรีมจะถูกย่อให้เหลือข้อมูลสรุปสุดท้ายพร้อมข้อมูลเมตาของสตรีม
- การตอบกลับสุดท้ายของไคลเอนต์ที่ส่งคืนโดย OmniRoute โดยการตอบกลับแบบสตรีมจะถูกจัดเก็บในรูปแบบสรุปแบบย่อเดียวกัน
ขอบเขตที่มีความอ่อนไหวด้านความปลอดภัย
- ข้อมูลลับ JWT (
JWT_SECRET) ใช้รักษาความปลอดภัยในการตรวจสอบ/ลงนามคุกกี้เซสชันของแดชบอร์ด - การตั้งรหัสผ่านเริ่มต้น (
INITIAL_PASSWORD) ควรได้รับการกำหนดค่าอย่างชัดเจนสำหรับการจัดเตรียมระบบเมื่อเรียกใช้ครั้งแรก - ข้อมูลลับ HMAC ของ API key (
API_KEY_SECRET) ใช้รักษาความปลอดภัยของรูปแบบ API key ภายในเครื่องที่สร้างขึ้น - ข้อมูลลับของผู้ให้บริการ (API key/token) จะถูกจัดเก็บไว้ในฐานข้อมูลภายในเครื่อง และควรได้รับการปกป้องในระดับระบบไฟล์
- Endpoint สำหรับการซิงค์กับคลาวด์อาศัยการยืนยันตัวตนด้วย API key ร่วมกับความหมายเชิงตรรกะของ machine id
เมทริกซ์สภาพแวดล้อมและรันไทม์
ตัวแปรสภาพแวดล้อมที่โค้ดใช้งานอยู่:
- แอป/การยืนยันตัวตน:
JWT_SECRET,INITIAL_PASSWORD - พื้นที่จัดเก็บ:
DATA_DIR - ตัวเลือกสำหรับแทนที่ไดเรกทอรีฐานของพื้นที่จัดเก็บ (Linux/macOS เมื่อไม่ได้ตั้งค่า
DATA_DIR):XDG_CONFIG_HOME - การแฮชเพื่อความปลอดภัย:
API_KEY_SECRET,MACHINE_ID_SALT - การบันทึกล็อก:
APP_LOG_TO_FILE,APP_LOG_RETENTION_DAYS,CALL_LOG_RETENTION_DAYS - การกำหนด URL สำหรับการซิงค์/คลาวด์:
NEXT_PUBLIC_BASE_URL,NEXT_PUBLIC_CLOUD_URL - พร็อกซีขาออก:
HTTP_PROXY,HTTPS_PROXY,ALL_PROXY,NO_PROXYและรูปแบบตัวพิมพ์เล็ก - Feature flag สำหรับ SOCKS5:
ENABLE_SOCKS5_PROXY,NEXT_PUBLIC_ENABLE_SOCKS5_PROXY - ตัวช่วยด้านแพลตฟอร์ม/รันไทม์ (ไม่ใช่การกำหนดค่าเฉพาะของแอป):
APPDATA,NODE_ENV,PORT,HOSTNAME
หมายเหตุด้านสถาปัตยกรรมที่ทราบ
usageDbและlocalDbใช้นโยบายไดเรกทอรีฐานเดียวกัน (DATA_DIR->XDG_CONFIG_HOME/omniroute->~/.omniroute) พร้อมการย้ายไฟล์แบบเดิม/api/v1/route.tsมอบหมายการทำงานให้กับตัวสร้างแค็ตตาล็อกแบบรวมศูนย์เดียวกับที่/api/v1/modelsใช้ (src/app/api/v1/models/catalog.ts) เพื่อหลีกเลี่ยงความคลาดเคลื่อนเชิงความหมาย- ตัวบันทึกคำขอจะเขียน header/body ทั้งหมดเมื่อเปิดใช้งาน โปรดถือว่าไดเรกทอรีล็อกเป็นพื้นที่ที่มีข้อมูลอ่อนไหว
- พฤติกรรมของคลาวด์ขึ้นอยู่กับความถูกต้องของ
NEXT_PUBLIC_BASE_URLและความสามารถในการเข้าถึง endpoint ของคลาวด์ - ไดเรกทอรี
open-sse/ถูกเผยแพร่เป็น แพ็กเกจ npm workspace@omniroute/open-sseซอร์สโค้ดนำเข้าแพ็กเกจนี้ผ่าน@omniroute/open-sse/...(แก้ไขการอ้างอิงโดย Next.jstranspilePackages) พาธไฟล์ในเอกสารนี้ยังคงใช้ชื่อไดเรกทอรีopen-sse/เพื่อความสอดคล้อง - แผนภูมิในแดชบอร์ดใช้ Recharts (ทำงานบน SVG) เพื่อแสดงภาพการวิเคราะห์ที่เข้าถึงได้และโต้ตอบได้ (แผนภูมิแท่งแสดงการใช้งานโมเดล ตารางแจกแจงตามผู้ให้บริการพร้อมอัตราความสำเร็จ)
- การทดสอบ E2E ใช้ Playwright (
tests/e2e/) และเรียกใช้ผ่านnpm run test:e2eการทดสอบหน่วยใช้ ตัวรันการทดสอบของ Node.js (tests/unit/) และเรียกใช้ผ่านnpm run test:unitซอร์สโค้ดภายใต้src/เป็น TypeScript (.ts/.tsx) ส่วน workspaceopen-sse/ยังคงเป็น JavaScript (.js) - หน้าการตั้งค่าแบ่งออกเป็น 7 แท็บ: ทั่วไป, รูปลักษณ์, AI, ความปลอดภัย, การกำหนดเส้นทาง, ความยืดหยุ่น และขั้นสูง หน้าความยืดหยุ่นกำหนดค่าเฉพาะคิวคำขอ ช่วงพักการเชื่อมต่อ ตัวตัดวงจรของผู้ให้บริการ และพฤติกรรมการรอให้ช่วงพักสิ้นสุดลงเท่านั้น ส่วนสถานะรันไทม์ปัจจุบันของตัวตัดวงจรจะแสดงในหน้าสถานภาพ
- กลยุทธ์ Context Relay (
context-relay) แบ่งออกเป็นสองชั้น:combo.tsตัดสินใจว่าควรสร้างการส่งต่อหรือไม่ ส่วนchat.tsจะแทรกการส่งต่อหลังจากระบุบัญชีแล้ว ข้อมูลการส่งต่อจัดเก็บอยู่ในตาราง SQLitecontext_handoffsการแบ่งเช่นนี้เป็นไปโดยเจตนา เนื่องจากมีเพียงchat.tsเท่านั้นที่ทราบว่าบัญชีจริงมีการเปลี่ยนแปลงหรือไม่ - ขณะนี้มีการ บังคับใช้พร็อกซี อย่างครอบคลุม:
tokenHealthCheck.tsระบุพร็อกซีแยกตามการเชื่อมต่อ,/api/providers/validateใช้runWithProxyContextและproxyFetch.tsใช้undici.fetch()เพื่อรักษาความเข้ากันได้กับ dispatcher บน Node 22 - การตรวจหานโยบายรันไทม์ Node.js:
/api/settings/require-loginส่งคืนฟิลด์nodeVersionและnodeCompatibleหน้าล็อกอินจะแสดงแบนเนอร์คำเตือนเมื่อรันไทม์อยู่นอกสายรุ่น Node.js ที่ปลอดภัยและรองรับ
รายการตรวจสอบการทำงาน
- สร้างจากซอร์สโค้ด:
npm run build - สร้างอิมเมจ Docker:
docker build -t omniroute . - เริ่มบริการและตรวจสอบ:
GET /api/settingsGET /api/v1/models- URL ฐานเป้าหมายของ CLI ควรเป็น
http://<host>:20128/v1เมื่อPORT=20128