# User Guide (ไทย)
🌐 **Languages:** 🇺🇸 [English](../../../../guides/USER_GUIDE.md) · 🇪🇹 [am](../../../am/docs/guides/USER_GUIDE.md) · 🇸🇦 [ar](../../../ar/docs/guides/USER_GUIDE.md) · 🇦🇿 [az](../../../az/docs/guides/USER_GUIDE.md) · 🇧🇬 [bg](../../../bg/docs/guides/USER_GUIDE.md) · 🇧🇩 [bn](../../../bn/docs/guides/USER_GUIDE.md) · 🇧🇦 [bs](../../../bs/docs/guides/USER_GUIDE.md) · 🇨🇿 [cs](../../../cs/docs/guides/USER_GUIDE.md) · 🇩🇰 [da](../../../da/docs/guides/USER_GUIDE.md) · 🇩🇪 [de](../../../de/docs/guides/USER_GUIDE.md) · 🇬🇷 [el](../../../el/docs/guides/USER_GUIDE.md) · 🇪🇸 [es](../../../es/docs/guides/USER_GUIDE.md) · 🇪🇪 [et](../../../et/docs/guides/USER_GUIDE.md) · 🇮🇷 [fa](../../../fa/docs/guides/USER_GUIDE.md) · 🇫🇮 [fi](../../../fi/docs/guides/USER_GUIDE.md) · 🇫🇷 [fr](../../../fr/docs/guides/USER_GUIDE.md) · 🇮🇪 [ga](../../../ga/docs/guides/USER_GUIDE.md) · 🇮🇳 [gu](../../../gu/docs/guides/USER_GUIDE.md) · 🇳🇬 [ha](../../../ha/docs/guides/USER_GUIDE.md) · 🇮🇱 [he](../../../he/docs/guides/USER_GUIDE.md) · 🇮🇳 [hi](../../../hi/docs/guides/USER_GUIDE.md) · 🇭🇷 [hr](../../../hr/docs/guides/USER_GUIDE.md) · 🇭🇺 [hu](../../../hu/docs/guides/USER_GUIDE.md) · 🇦🇲 [hy](../../../hy/docs/guides/USER_GUIDE.md) · 🇮🇩 [id](../../../id/docs/guides/USER_GUIDE.md) · 🇳🇬 [ig](../../../ig/docs/guides/USER_GUIDE.md) · 🇮🇹 [it](../../../it/docs/guides/USER_GUIDE.md) · 🇯🇵 [ja](../../../ja/docs/guides/USER_GUIDE.md) · 🇬🇪 [ka](../../../ka/docs/guides/USER_GUIDE.md) · 🇰🇭 [km](../../../km/docs/guides/USER_GUIDE.md) · 🇮🇳 [kn](../../../kn/docs/guides/USER_GUIDE.md) · 🇰🇷 [ko](../../../ko/docs/guides/USER_GUIDE.md) · 🇱🇹 [lt](../../../lt/docs/guides/USER_GUIDE.md) · 🇱🇻 [lv](../../../lv/docs/guides/USER_GUIDE.md) · 🇮🇳 [ml](../../../ml/docs/guides/USER_GUIDE.md) · 🇮🇳 [mr](../../../mr/docs/guides/USER_GUIDE.md) · 🇲🇾 [ms](../../../ms/docs/guides/USER_GUIDE.md) · 🇲🇹 [mt](../../../mt/docs/guides/USER_GUIDE.md) · 🇲🇲 [my](../../../my/docs/guides/USER_GUIDE.md) · 🇳🇵 [ne](../../../ne/docs/guides/USER_GUIDE.md) · 🇳🇱 [nl](../../../nl/docs/guides/USER_GUIDE.md) · 🇳🇴 [no](../../../no/docs/guides/USER_GUIDE.md) · 🇮🇳 [or](../../../or/docs/guides/USER_GUIDE.md) · 🇮🇳 [pa](../../../pa/docs/guides/USER_GUIDE.md) · 🇵🇭 [phi](../../../phi/docs/guides/USER_GUIDE.md) · 🇵🇱 [pl](../../../pl/docs/guides/USER_GUIDE.md) · 🇵🇹 [pt](../../../pt/docs/guides/USER_GUIDE.md) · 🇧🇷 [pt-BR](../../../pt-BR/docs/guides/USER_GUIDE.md) · 🇷🇴 [ro](../../../ro/docs/guides/USER_GUIDE.md) · 🇷🇺 [ru](../../../ru/docs/guides/USER_GUIDE.md) · 🇱🇰 [si](../../../si/docs/guides/USER_GUIDE.md) · 🇸🇰 [sk](../../../sk/docs/guides/USER_GUIDE.md) · 🇸🇮 [sl](../../../sl/docs/guides/USER_GUIDE.md) · 🇷🇸 [sr](../../../sr/docs/guides/USER_GUIDE.md) · 🇸🇪 [sv](../../../sv/docs/guides/USER_GUIDE.md) · 🇰🇪 [sw](../../../sw/docs/guides/USER_GUIDE.md) · 🇮🇳 [ta](../../../ta/docs/guides/USER_GUIDE.md) · 🇮🇳 [te](../../../te/docs/guides/USER_GUIDE.md) · 🇹🇷 [tr](../../../tr/docs/guides/USER_GUIDE.md) · 🇺🇦 [uk-UA](../../../uk-UA/docs/guides/USER_GUIDE.md) · 🇵🇰 [ur](../../../ur/docs/guides/USER_GUIDE.md) · 🇺🇿 [uz](../../../uz/docs/guides/USER_GUIDE.md) · 🇻🇳 [vi](../../../vi/docs/guides/USER_GUIDE.md) · 🇳🇬 [yo](../../../yo/docs/guides/USER_GUIDE.md) · 🇨🇳 [zh-CN](../../../zh-CN/docs/guides/USER_GUIDE.md) · 🇹🇼 [zh-TW](../../../zh-TW/docs/guides/USER_GUIDE.md)
---
🌐 **Languages:** 🇺🇸 [English](../../../../guides/USER_GUIDE.md) · 🇪🇹 [am](../../../am/docs/guides/USER_GUIDE.md) · 🇸🇦 [ar](../../../ar/docs/guides/USER_GUIDE.md) · 🇦🇿 [az](../../../az/docs/guides/USER_GUIDE.md) · 🇧🇬 [bg](../../../bg/docs/guides/USER_GUIDE.md) · 🇧🇩 [bn](../../../bn/docs/guides/USER_GUIDE.md) · 🇧🇦 [bs](../../../bs/docs/guides/USER_GUIDE.md) · 🇨🇿 [cs](../../../cs/docs/guides/USER_GUIDE.md) · 🇩🇰 [da](../../../da/docs/guides/USER_GUIDE.md) · 🇩🇪 [de](../../../de/docs/guides/USER_GUIDE.md) · 🇬🇷 [el](../../../el/docs/guides/USER_GUIDE.md) · 🇪🇸 [es](../../../es/docs/guides/USER_GUIDE.md) · 🇪🇪 [et](../../../et/docs/guides/USER_GUIDE.md) · 🇮🇷 [fa](../../../fa/docs/guides/USER_GUIDE.md) · 🇫🇮 [fi](../../../fi/docs/guides/USER_GUIDE.md) · 🇫🇷 [fr](../../../fr/docs/guides/USER_GUIDE.md) · 🇮🇪 [ga](../../../ga/docs/guides/USER_GUIDE.md) · 🇮🇳 [gu](../../../gu/docs/guides/USER_GUIDE.md) · 🇳🇬 [ha](../../../ha/docs/guides/USER_GUIDE.md) · 🇮🇱 [he](../../../he/docs/guides/USER_GUIDE.md) · 🇮🇳 [hi](../../../hi/docs/guides/USER_GUIDE.md) · 🇭🇷 [hr](../../../hr/docs/guides/USER_GUIDE.md) · 🇭🇺 [hu](../../../hu/docs/guides/USER_GUIDE.md) · 🇦🇲 [hy](../../../hy/docs/guides/USER_GUIDE.md) · 🇮🇩 [id](../../../id/docs/guides/USER_GUIDE.md) · 🇳🇬 [ig](../../../ig/docs/guides/USER_GUIDE.md) · 🇮🇹 [it](../../../it/docs/guides/USER_GUIDE.md) · 🇯🇵 [ja](../../../ja/docs/guides/USER_GUIDE.md) · 🇬🇪 [ka](../../../ka/docs/guides/USER_GUIDE.md) · 🇰🇭 [km](../../../km/docs/guides/USER_GUIDE.md) · 🇮🇳 [kn](../../../kn/docs/guides/USER_GUIDE.md) · 🇰🇷 [ko](../../../ko/docs/guides/USER_GUIDE.md) · 🇱🇹 [lt](../../../lt/docs/guides/USER_GUIDE.md) · 🇱🇻 [lv](../../../lv/docs/guides/USER_GUIDE.md) · 🇮🇳 [ml](../../../ml/docs/guides/USER_GUIDE.md) · 🇮🇳 [mr](../../../mr/docs/guides/USER_GUIDE.md) · 🇲🇾 [ms](../../../ms/docs/guides/USER_GUIDE.md) · 🇲🇹 [mt](../../../mt/docs/guides/USER_GUIDE.md) · 🇲🇲 [my](../../../my/docs/guides/USER_GUIDE.md) · 🇳🇵 [ne](../../../ne/docs/guides/USER_GUIDE.md) · 🇳🇱 [nl](../../../nl/docs/guides/USER_GUIDE.md) · 🇳🇴 [no](../../../no/docs/guides/USER_GUIDE.md) · 🇮🇳 [or](../../../or/docs/guides/USER_GUIDE.md) · 🇮🇳 [pa](../../../pa/docs/guides/USER_GUIDE.md) · 🇵🇭 [phi](../../../phi/docs/guides/USER_GUIDE.md) · 🇵🇱 [pl](../../../pl/docs/guides/USER_GUIDE.md) · 🇵🇹 [pt](../../../pt/docs/guides/USER_GUIDE.md) · 🇧🇷 [pt-BR](../../../pt-BR/docs/guides/USER_GUIDE.md) · 🇷🇴 [ro](../../../ro/docs/guides/USER_GUIDE.md) · 🇷🇺 [ru](../../../ru/docs/guides/USER_GUIDE.md) · 🇱🇰 [si](../../../si/docs/guides/USER_GUIDE.md) · 🇸🇰 [sk](../../../sk/docs/guides/USER_GUIDE.md) · 🇸🇮 [sl](../../../sl/docs/guides/USER_GUIDE.md) · 🇷🇸 [sr](../../../sr/docs/guides/USER_GUIDE.md) · 🇸🇪 [sv](../../../sv/docs/guides/USER_GUIDE.md) · 🇰🇪 [sw](../../../sw/docs/guides/USER_GUIDE.md) · 🇮🇳 [ta](../../../ta/docs/guides/USER_GUIDE.md) · 🇮🇳 [te](../../../te/docs/guides/USER_GUIDE.md) · 🇹🇷 [tr](../../../tr/docs/guides/USER_GUIDE.md) · 🇺🇦 [uk-UA](../../../uk-UA/docs/guides/USER_GUIDE.md) · 🇵🇰 [ur](../../../ur/docs/guides/USER_GUIDE.md) · 🇺🇿 [uz](../../../uz/docs/guides/USER_GUIDE.md) · 🇻🇳 [vi](../../../vi/docs/guides/USER_GUIDE.md) · 🇳🇬 [yo](../../../yo/docs/guides/USER_GUIDE.md) · 🇨🇳 [zh-CN](../../../zh-CN/docs/guides/USER_GUIDE.md) · 🇹🇼 [zh-TW](../../../zh-TW/docs/guides/USER_GUIDE.md)
คู่มือฉบับสมบูรณ์สำหรับการกำหนดค่าผู้ให้บริการ การสร้างคอมโบ การผสานรวมเครื่องมือ CLI และการปรับใช้ OmniRoute
---
## สารบัญ
- [ภาพรวมราคา](#-pricing-at-a-glance)
- [กรณีการใช้งาน](#-use-cases)
- [การตั้งค่าผู้ให้บริการ](#-provider-setup)
- [การผสานรวม CLI](#-cli-integration)
- [การปรับใช้](#-deployment)
- [โมเดลที่พร้อมใช้งาน](#-available-models)
- [ฟีเจอร์ขั้นสูง](#-advanced-features)
- [การกำหนดเส้นทางอัตโนมัติ (ไม่ต้องกำหนดค่า)](#-auto-routing-zero-config)
- [การผสานรวม MCP และ A2A](#-mcp--a2a-integration)
- [ระบบทักษะ](#-skills-system)
- [ระบบหน่วยความจำ](#-memory-system)
- [เว็บฮุก](#-webhooks)
- [เอเจนต์บนคลาวด์](#-cloud-agents)
- [การจัดการด้วยโปรแกรม](#-programmatic-management)
- [CLI ภายใน](#-internal-cli)
- [แอปพลิเคชันเดสก์ท็อป (Electron)](#-desktop-application-electron)
---
## 💰 ภาพรวมราคา
| ระดับ | ผู้ให้บริการ | ค่าใช้จ่าย | การรีเซ็ตโควตา | เหมาะที่สุดสำหรับ |
| --------------------- | ----------------- | ----------------- | -------------------------------- | ----------------------------- |
| **💳 การสมัครสมาชิก** | Claude Code (Pro) | $20/เดือน | ทุก 5 ชม. + รายสัปดาห์ | ผู้ที่สมัครสมาชิกอยู่แล้ว |
| | Codex (Plus/Pro) | $20-200/เดือน | ทุก 5 ชม. + รายสัปดาห์ | ผู้ใช้ OpenAI |
| | GitHub Copilot | $10-19/เดือน | รายเดือน | ผู้ใช้ GitHub |
| **🔑 คีย์ API** | DeepSeek | จ่ายตามการใช้งาน | ไม่มี | การให้เหตุผลราคาประหยัด |
| | Groq | จ่ายตามการใช้งาน | ไม่มี | การอนุมานที่รวดเร็วเป็นพิเศษ |
| | xAI (Grok) | จ่ายตามการใช้งาน | ไม่มี | การให้เหตุผลด้วย Grok 4 |
| | Mistral | จ่ายตามการใช้งาน | ไม่มี | โมเดลที่โฮสต์ในสหภาพยุโรป |
| | Perplexity | จ่ายตามการใช้งาน | ไม่มี | การทำงานที่เสริมด้วยการค้นหา |
| | Together AI | จ่ายตามการใช้งาน | ไม่มี | โมเดลโอเพนซอร์ส |
| | Fireworks AI | จ่ายตามการใช้งาน | ไม่มี | การสร้างภาพ FLUX อย่างรวดเร็ว |
| | Cerebras | จ่ายตามการใช้งาน | ไม่มี | ความเร็วระดับเวเฟอร์สเกล |
| | Cohere | จ่ายตามการใช้งาน | ไม่มี | RAG ด้วย Command R+ |
| | NVIDIA NIM | จ่ายตามการใช้งาน | ไม่มี | โมเดลระดับองค์กร |
| | Baidu Qianfan | จ่ายตามการใช้งาน | ไม่มี | โมเดล ERNIE |
| **💰 ราคาประหยัด** | GLM-4.7 | $0.6/1M | ทุกวันเวลา 10:00 น. | ตัวสำรองราคาประหยัด |
| | MiniMax M2.1 | $0.2/1M | แบบต่อเนื่องทุก 5 ชั่วโมง | ตัวเลือกที่ถูกที่สุด |
| | Kimi K2 | เหมาจ่าย $9/เดือน | 10M โทเค็น/เดือน | ค่าใช้จ่ายที่คาดการณ์ได้ |
| **🆓 ฟรี** | Qoder | $0 | เป็นไปตามข้อจำกัดของผู้ให้บริการ | ตรวจสอบแค็ตตาล็อกปัจจุบัน |
| | Kiro | $0 | ~50 เครดิต/เดือน | ใช้ Claude ฟรี |
---
## 🎯 กรณีการใช้งาน
### กรณีที่ 1: "ฉันมีการสมัครสมาชิก Claude Pro"
**ปัญหา:** โควตาหมดอายุโดยไม่ได้ใช้งาน และติดข้อจำกัดอัตราการใช้งานระหว่างเขียนโค้ดหนัก
```
ชุดผสม: "maximize-claude"
1. cc/claude-opus-4-7 (ใช้สิทธิ์การสมัครสมาชิกอย่างเต็มที่)
2. glm/glm-4.7 (ตัวสำรองราคาประหยัดเมื่อโควตาหมด)
3. if/qwen3.8-max-preview (ตัวสำรองฉุกเฉินฟรี)
ค่าใช้จ่ายรายเดือน: $20 (ค่าสมัครสมาชิก) + ~$5 (ตัวสำรอง) = รวม $25
เทียบกับ $20 + การติดข้อจำกัด = ความหงุดหงิด
```
### กรณีที่ 2: "ฉันไม่ต้องการเสียค่าใช้จ่ายเลย"
**ปัญหา:** ไม่สามารถจ่ายค่าสมัครสมาชิกได้ แต่ต้องการ AI สำหรับเขียนโค้ดที่เชื่อถือได้
```
ชุดผสม: "zero-cost"
1. if/kimi-k2.7-code (ระบุว่าเข้าถึงได้ฟรี แต่อาจมีข้อจำกัดอัตราการใช้งาน)
2. kr/qwen3-coder-next (ตัวสำรอง Kiro ฟรี)
ค่าใช้จ่ายรายเดือน: $0
คุณภาพ: ตรวจสอบโมเดล ข้อจำกัด ความเป็นส่วนตัว และ SLA ให้เหมาะกับเวิร์กโหลดของคุณ
```
### กรณีที่ 3: "ฉันต้องการเขียนโค้ดได้ตลอด 24/7 โดยไม่สะดุด"
**ปัญหา:** มีเส้นตายและไม่สามารถยอมรับช่วงเวลาที่ระบบหยุดให้บริการได้
```
ชุดผสม: "always-on"
1. cc/claude-opus-4-7 (คุณภาพดีที่สุด)
2. cx/gpt-5.5 (การสมัครสมาชิกรายการที่สอง)
3. glm/glm-4.7 (ราคาประหยัด รีเซ็ตทุกวัน)
4. minimax/MiniMax-M2.1 (ถูกที่สุด รีเซ็ตทุก 5 ชม.)
5. if/deepseek-v4-flash (ระบุว่าเข้าถึงได้ฟรี แต่อาจมีข้อจำกัดอัตราการใช้งาน)
ผลลัพธ์: ตัวสำรอง 5 ชั้นช่วยเพิ่มความยืดหยุ่น แต่ไม่รับประกันความพร้อมใช้งานของบริการต้นทาง
ค่าใช้จ่ายรายเดือน: $20-200 (ค่าสมัครสมาชิก) + $10-20 (ตัวสำรอง)
```
### กรณีที่ 4: "ฉันต้องการ AI ฟรีใน OpenClaw"
**ปัญหา:** ต้องการผู้ช่วย AI ในแอปรับส่งข้อความโดยไม่มีค่าใช้จ่ายใด ๆ
```
ชุดผสม: "openclaw-free"
1. if/qwen3.8-max-preview (ระบุว่าเข้าถึงได้ฟรี แต่อาจมีข้อจำกัดอัตราการใช้งาน)
2. if/deepseek-v4-flash (ระบุว่าเข้าถึงได้ฟรี แต่อาจมีข้อจำกัดอัตราการใช้งาน)
3. if/kimi-k2.7-code (ระบุว่าเข้าถึงได้ฟรี แต่อาจมีข้อจำกัดอัตราการใช้งาน)
ค่าใช้จ่ายรายเดือน: $0
เข้าถึงผ่าน: WhatsApp, Telegram, Slack, Discord, iMessage, Signal...
```
---
## 📖 การตั้งค่าผู้ให้บริการ
หากต้องการเพิ่มการเชื่อมต่อ API Key จำนวนมากจากไฟล์ CSV หรือ JSON ให้ใช้ **แดชบอร์ด → ผู้ให้บริการ → นำเข้าจากไฟล์** คอลัมน์จะเรียงตามตำแหน่ง (`provider,name,apiKey,baseUrl,priority`) โดย `provider` ต้องมีอยู่แล้วในฐานะผู้ให้บริการที่มีการจัดการหรือโหนดที่เข้ากันได้ ดู [นำเข้าผู้ให้บริการจากไฟล์ CSV หรือ JSON](../providers/CSV-IMPORT.md)
### 🔐 ผู้ให้บริการแบบสมัครสมาชิก
#### Claude Code (Pro/Max)
```bash
แดชบอร์ด → ผู้ให้บริการ → เชื่อมต่อ Claude Code
→ เข้าสู่ระบบด้วย OAuth → รีเฟรชโทเค็นอัตโนมัติ
→ ติดตามโควตาแบบ 5 ชั่วโมงและรายสัปดาห์
โมเดล:
cc/claude-opus-4-7
cc/claude-sonnet-4-6
cc/claude-haiku-4-5-20251001
```
**เคล็ดลับ:** ใช้ Opus สำหรับงานที่ซับซ้อน และ Sonnet เมื่อต้องการความเร็ว OmniRoute ติดตามโควตาแยกตามโมเดล!
ไม่มีเบราว์เซอร์บนโฮสต์ OmniRoute ใช่ไหม? เรียกใช้ `claude setup-token` บนอุปกรณ์ใดก็ได้ที่เข้าสู่ระบบ Claude Code อยู่ แล้ววางโทเค็นอายุหนึ่งปีลงในแท็บ **Setup Token** ดู [Claude Code พร้อม setup token](../providers/CLAUDE_CODE_SETUP_TOKEN.md)
เส้นทางที่เข้ากันได้กับ Claude และ Claude Code จะคงระดับความพยายามในการคิด `max` ไว้สำหรับโมเดล Opus และ Sonnet โมเดล Haiku ไม่รองรับระดับความพยายาม `max` ดังนั้น OmniRoute จะปรับลดคำขอนั้นเป็นงบประมาณการคิดระดับสูงก่อนส่งไปยังต้นทาง
#### OpenAI Codex (Plus/Pro)
```bash
แดชบอร์ด → ผู้ให้บริการ → เชื่อมต่อ Codex
→ เข้าสู่ระบบด้วย OAuth (พอร์ต 1455)
→ รีเซ็ตทุก 5 ชั่วโมงและรายสัปดาห์
โมเดล:
cx/gpt-5.5
cx/gpt-5.4
cx/gpt-5.3-codex
cx/gpt-5.3-codex-spark
```
#### GitHub Copilot
```bash
แดชบอร์ด → ผู้ให้บริการ → เชื่อมต่อ GitHub
→ OAuth ผ่าน GitHub
→ รีเซ็ตรายเดือน (วันที่ 1 ของเดือน)
โมเดล:
gh/gpt-5.5
gh/gpt-5.4
gh/claude-sonnet-4.6
gh/claude-opus-4.7
gh/gemini-3.1-pro-preview
```
### 💰 ผู้ให้บริการราคาประหยัด
#### GLM-4.7 (รีเซ็ตรายวัน, $0.6/1M)
1. สมัครใช้งาน: [Zhipu AI](https://open.bigmodel.cn)
2. รับ API Key จาก Coding Plan
3. แดชบอร์ด → เพิ่ม API Key: ผู้ให้บริการ: `glm`, API Key: `your-key`
**การใช้งาน:** `glm/glm-4.7` — **เคล็ดลับ:** Coding Plan มอบโควตา 3 เท่าในราคาเพียง 1/7! รีเซ็ตทุกวันเวลา 10:00 น.
#### MiniMax M2.1 (รีเซ็ตทุก 5 ชม., $0.20/1M)
1. สมัครใช้งาน: [MiniMax](https://www.minimax.io)
2. รับ API Key → แดชบอร์ด → เพิ่ม API Key
**การใช้งาน:** `minimax/MiniMax-M2.1` — **เคล็ดลับ:** ตัวเลือกที่ถูกที่สุดสำหรับบริบทยาว (1M โทเค็น)!
#### Kimi K2 (เหมาจ่าย $9/เดือน)
1. สมัครสมาชิก: [Moonshot AI](https://platform.kimi.ai?aff=omniroute)
2. รับ API Key → แดชบอร์ด → เพิ่ม API Key
**การใช้งาน:** `kimi/kimi-k2.5` — **เคล็ดลับ:** ราคาเหมาจ่าย $9/เดือนสำหรับ 10M โทเค็น = ต้นทุนจริง $0.90/1M!
#### Baidu Qianfan / ERNIE
1. สมัครใช้งาน: [Baidu AI Cloud Qianfan](https://cloud.baidu.com/product/wenxinworkshop)
2. สร้าง Qianfan API Key → แดชบอร์ด → เพิ่ม API Key: ผู้ให้บริการ: `qianfan`
**การใช้งาน:** `qianfan/ernie-5.1`, `qianfan/ernie-x1.1` หรือ ID โมเดลอื่นของ Qianfan ที่เข้ากันได้กับ OpenAI
### 🆓 ผู้ให้บริการฟรี
ผู้ให้บริการฟรีที่ไม่ต้องยืนยันตัวตนจะมีสวิตช์อยู่ข้าง **ไม่ต้องยืนยันตัวตน** บนหน้าผู้ให้บริการ การปิดสวิตช์จะปิดใช้งานผู้ให้บริการนั้น นำผู้ให้บริการออกจากมุมมองผู้ให้บริการที่กำหนดค่าแล้ว/แบบย่อ และนำโมเดลของผู้ให้บริการออกจาก `/v1/models`
#### Qoder (9 โมเดลฟรี)
```bash
แดชบอร์ด → เชื่อมต่อ Qoder → เข้าสู่ระบบด้วย OAuth → การเข้าถึงขึ้นอยู่กับขีดจำกัดปัจจุบันของผู้ให้บริการ
โมเดล: if/qwen3.8-max-preview, if/qwen3.7-max, if/qwen3.7-plus, if/kimi-k3, if/kimi-k2.7-code, if/glm-5.2, if/deepseek-v4-pro, if/deepseek-v4-flash, if/minimax-m3
```
#### Kiro (Claude ฟรี)
```bash
แดชบอร์ด → เชื่อมต่อ Kiro → AWS Builder ID หรือ Google/GitHub → ~50 เครดิต/เดือน
โมเดล: kr/claude-sonnet-4.5, kr/claude-haiku-4.5
```
---
## 🎨 คอมโบ
คุณสามารถจัดลำดับการ์ดคอมโบใหม่ได้โดยตรงใน **แดชบอร์ด → คอมโบ** ด้วยการลากจุดจับบนการ์ดแต่ละใบ ลำดับจะถูกบันทึกไว้ใน SQLite และกู้คืนเมื่อโหลดใหม่
### ตัวอย่างที่ 1: ใช้การสมัครสมาชิกให้คุ้มค่าสูงสุด → ตัวสำรองราคาถูก
```
แดชบอร์ด → คอมโบ → สร้างใหม่
ชื่อ: premium-coding
โมเดล:
1. cc/claude-opus-4-7 (โมเดลหลักจากการสมัครสมาชิก)
2. glm/glm-4.7 (ตัวสำรองราคาถูก, $0.6/1M)
3. minimax/MiniMax-M2.7 (ตัวเลือกสำรองที่ถูกที่สุด, $0.3/1M)
ใช้ใน CLI: premium-coding
```
### ตัวอย่างที่ 2: ใช้เฉพาะของฟรี (ไม่มีค่าใช้จ่าย)
```
ชื่อ: free-combo
โมเดล:
1. if/kimi-k2.7-code (ระบุว่าเข้าถึงได้ฟรี แต่อาจมีข้อจำกัดจากผู้ให้บริการ)
2. kr/qwen3-coder-next (ตัวสำรองฟรีจาก Kiro)
ค่าใช้จ่าย: ขณะนี้ระบุเป็น $0 แต่ข้อกำหนดและความพร้อมให้บริการอาจเปลี่ยนแปลงได้
```
---
## 🔧 การผสานรวม CLI
### Cursor IDE
**การใช้ Cursor เป็นไคลเอนต์ OmniRoute** (กำหนดเส้นทางแชตของ Cursor ผ่าน OmniRoute):
```
การตั้งค่า → โมเดล → ขั้นสูง:
OpenAI API Base URL: http://localhost:20128/v1
OpenAI API Key: [จากแดชบอร์ด omniroute]
โมเดล: cc/claude-opus-4-7
```
**การใช้ OmniRoute เป็นผู้ให้บริการ Cursor** (OmniRoute เรียกใช้ Cursor ต้นทาง): แนะนำให้ใช้
**แดชบอร์ด → ผู้ให้บริการ → Cursor → เข้าสู่ระบบด้วย Cursor** สำหรับ Docker โปรดดู
[`docs/providers/CURSOR-DOCKER.md`](../providers/CURSOR-DOCKER.md)
### Claude Code
แก้ไข `~/.claude/settings.json`:
```json
{
"env": {
"ANTHROPIC_BASE_URL": "http://localhost:20128",
"ANTHROPIC_AUTH_TOKEN": "your-omniroute-api-key"
}
}
```
ใช้ปลายทางรากที่เข้ากันได้กับ Claude ที่นี่ อย่าเติม `/v1` ต่อท้าย `ANTHROPIC_BASE_URL`
### Codex CLI
```bash
export OPENAI_BASE_URL="http://localhost:20128"
export OPENAI_API_KEY="your-omniroute-api-key"
codex "your prompt"
```
### OpenClaw
แก้ไข `~/.openclaw/openclaw.json`:
```json
{
"agents": {
"defaults": {
"model": { "primary": "omniroute/if/kimi-k2.7-code" }
}
},
"models": {
"providers": {
"omniroute": {
"baseUrl": "http://localhost:20128/v1",
"apiKey": "your-omniroute-api-key",
"api": "openai-completions",
"models": [{ "id": "if/kimi-k2.7-code", "name": "Kimi K2.7 Code" }]
}
}
}
}
```
**หรือใช้แดชบอร์ด:** เครื่องมือ CLI → OpenClaw → กำหนดค่าอัตโนมัติ
### Cline / Continue / RooCode
```
ผู้ให้บริการ: รองรับ OpenAI
Base URL: http://localhost:20128/v1
API Key: [จากแดชบอร์ด]
โมเดล: cc/claude-opus-4-7
```
---
## 🚀 การปรับใช้
### การติดตั้ง npm แบบส่วนกลาง (แนะนำ)
```bash
npm install -g omniroute
# สร้างไดเรกทอรีการกำหนดค่า
mkdir -p ~/.omniroute
# สร้างไฟล์ .env (ดู .env.example)
cp .env.example ~/.omniroute/.env
# เริ่มต้นเซิร์ฟเวอร์
omniroute
# หรือใช้พอร์ตที่กำหนดเอง:
omniroute --port 3000
```
CLI จะโหลด `.env` จาก `~/.omniroute/.env` หรือ `./.env` โดยอัตโนมัติ
### โหมดถาดระบบ
เริ่มต้น OmniRoute ในถาดระบบ:
```bash
omniroute serve --tray
```
คำสั่งจะสิ้นสุดการทำงานหลังจากเซิร์ฟเวอร์และถาดระบบพร้อมใช้งานแล้ว
เซิร์ฟเวอร์จะทำงานต่อไปโดยไม่ต้องเปิดเทอร์มินัลไว้
โหมดถาดระบบรองรับ macOS, Windows และเซสชัน Linux แบบกราฟิก โหมดถาดระบบจะไม่เปิดแดชบอร์ดโดยอัตโนมัติ
ใช้เมนูถาดระบบเพื่อดำเนินการต่อไปนี้:
- เปิดแดชบอร์ด
- เปิด `/dashboard/logs`
- เปลี่ยนการตั้งค่าเริ่มต้นอัตโนมัติ
- หยุด OmniRoute
อย่าใช้ `--tray` ร่วมกับตัวเลือกต่อไปนี้:
- `--daemon`
- `--log`
- `--no-recovery`
โหมดเหล่านี้ต้องใช้การเป็นเจ้าของโปรเซสที่แตกต่างกัน
เปิดใช้งานการเริ่มต้นระบบเมื่อเข้าสู่ระบบเครื่องครั้งถัดไป:
```bash
omniroute autostart enable
```
การเริ่มต้นอัตโนมัติจะใช้โหมดถาดระบบบน macOS, Windows และเซสชัน Linux แบบกราฟิก ส่วน Linux แบบไม่มีส่วนติดต่อกราฟิกจะใช้บริการผู้ใช้ systemd ที่มีอยู่
ปิดใช้งานการเริ่มต้นระบบเมื่อเข้าสู่ระบบ:
```bash
omniroute autostart disable
```
### การถอนการติดตั้ง
เมื่อคุณไม่ต้องการใช้ OmniRoute อีกต่อไป เรามีสคริปต์ด่วนสองรายการสำหรับการลบออกอย่างหมดจด:
| คำสั่ง | การดำเนินการ |
| ------------------------ | ------------------------------------------------------------------------ |
| `npm run uninstall` | ลบแอประบบ แต่ **เก็บฐานข้อมูลและการกำหนดค่าของคุณไว้** ใน `~/.omniroute` |
| `npm run uninstall:full` | ลบแอป และ **ลบการกำหนดค่า คีย์ และฐานข้อมูลทั้งหมดอย่างถาวร** |
> หมายเหตุ: หากต้องการเรียกใช้คำสั่งเหล่านี้ ให้ไปยังโฟลเดอร์โปรเจกต์ OmniRoute (หากคุณโคลนโปรเจกต์ไว้) แล้วเรียกใช้คำสั่งดังกล่าว หรือหากติดตั้งแบบส่วนกลาง คุณสามารถเรียกใช้ `npm uninstall -g omniroute` ได้โดยตรง
### การปรับใช้บน VPS
```bash
git clone https://github.com/diegosouzapw/OmniRoute.git
cd OmniRoute && npm install && npm run build
export JWT_SECRET="your-secure-secret-change-this"
export INITIAL_PASSWORD="your-password"
export DATA_DIR="/var/lib/omniroute"
export PORT="20128"
export HOSTNAME="0.0.0.0"
export NODE_ENV="production"
export NEXT_PUBLIC_BASE_URL="http://localhost:20128"
export API_KEY_SECRET="endpoint-proxy-api-key-secret"
npm run start
# หรือ: pm2 start npm --name omniroute -- start
```
### การปรับใช้ด้วย PM2 (หน่วยความจำน้อย)
สำหรับเซิร์ฟเวอร์ที่มี RAM จำกัด ให้ใช้ตัวเลือกจำกัดหน่วยความจำ:
```bash
# พร้อมขีดจำกัด 512MB (ค่าเริ่มต้น)
pm2 start npm --name omniroute -- start
# หรือใช้ขีดจำกัดหน่วยความจำที่กำหนดเอง
OMNIROUTE_MEMORY_MB=512 pm2 start npm --name omniroute -- start
# หรือใช้ ecosystem.config.js
pm2 start ecosystem.config.js
```
สร้าง `ecosystem.config.js`:
```javascript
module.exports = {
apps: [
{
name: "omniroute",
script: "npm",
args: "start",
env: {
NODE_ENV: "production",
OMNIROUTE_MEMORY_MB: "512",
JWT_SECRET: "your-secret",
INITIAL_PASSWORD: "your-password",
},
node_args: "--max-old-space-size=512",
max_memory_restart: "300M",
},
],
};
```
### Docker
```bash
# สร้างอิมเมจ (ค่าเริ่มต้น = runner-cli ที่ติดตั้ง codex/claude/droid ไว้ล่วงหน้า)
docker build -t omniroute:cli .
# โหมดพกพา (แนะนำ)
docker run -d --name omniroute -p 20128:20128 --env-file ./.env -v omniroute-data:/app/data omniroute:cli
```
สำหรับโหมดที่ผสานรวมกับโฮสต์พร้อมไบนารี CLI โปรดดูส่วน Docker ในเอกสารหลัก
### Void Linux (xbps-src)
ผู้ใช้ Void Linux สามารถจัดแพ็กเกจและติดตั้ง OmniRoute แบบเนทีฟได้โดยใช้เฟรมเวิร์กการคอมไพล์ข้ามแพลตฟอร์ม `xbps-src` ซึ่งจะทำให้การสร้าง Node.js แบบสแตนด์อโลนพร้อมกับไบนารีไบน์ดิงแบบเนทีฟของ `better-sqlite3` ที่จำเป็นเป็นไปโดยอัตโนมัติ
ดูเทมเพลต xbps-src
```bash
# ไฟล์เทมเพลตสำหรับ 'omniroute'
pkgname=omniroute
version=3.8.0
revision=1
hostmakedepends="nodejs python3 make"
depends="openssl"
short_desc="Universal AI gateway with smart routing for multiple LLM providers"
maintainer="zenobit "
license="MIT"
homepage="https://github.com/diegosouzapw/OmniRoute"
distfiles="https://github.com/diegosouzapw/OmniRoute/archive/refs/tags/v${version}.tar.gz"
checksum=009400afee90a9f32599d8fe734145cfd84098140b7287990183dde45ae2245b
system_accounts="_omniroute"
omniroute_homedir="/var/lib/omniroute"
export NODE_ENV=production
export npm_config_engine_strict=false
export npm_config_loglevel=error
export npm_config_fund=false
export npm_config_audit=false
do_build() {
# กำหนดสถาปัตยกรรม CPU เป้าหมายสำหรับ node-gyp
local _gyp_arch
case "$XBPS_TARGET_MACHINE" in
aarch64*) _gyp_arch=arm64 ;;
armv7*|armv6*) _gyp_arch=arm ;;
i686*) _gyp_arch=ia32 ;;
*) _gyp_arch=x64 ;;
esac
# 1) ติดตั้งการขึ้นต่อกันทั้งหมด – ข้ามสคริปต์
NODE_ENV=development npm ci --ignore-scripts
# 2) สร้างบันเดิล Next.js แบบสแตนด์อโลน
npm run build
# 3) คัดลอกแอสเซ็ตแบบสแตติกไปยังสแตนด์อโลน
cp -r .next/static .next/standalone/.next/static
[ -d public ] && cp -r public .next/standalone/public || true
# 4) คอมไพล์ไบนารีไบน์ดิงแบบเนทีฟของ better-sqlite3
local _node_gyp=/usr/lib/node_modules/npm/node_modules/node-gyp/bin/node-gyp.js
(cd node_modules/better-sqlite3 && node "$_node_gyp" rebuild --arch="$_gyp_arch")
# 5) วางไบนารีไบน์ดิงที่คอมไพล์แล้วลงในบันเดิลสแตนด์อโลน
local _bs3_release=.next/standalone/node_modules/better-sqlite3/build/Release
mkdir -p "$_bs3_release"
cp node_modules/better-sqlite3/build/Release/better_sqlite3.node "$_bs3_release/"
# 6) ลบบันเดิล sharp ที่เจาะจงตามสถาปัตยกรรม
rm -rf .next/standalone/node_modules/@img
# 7) คัดลอกการขึ้นต่อกันขณะรันไทม์ของ pino ที่การวิเคราะห์แบบสแตติกของ Next.js ไม่ได้นำมารวมไว้:
for _mod in pino-abstract-transport split2 process-warning; do
cp -r "node_modules/$_mod" .next/standalone/node_modules/
done
}
do_check() {
npm run test:unit
}
do_install() {
vmkdir usr/lib/omniroute/.next
vcopy .next/standalone/. usr/lib/omniroute/.next/standalone
# ป้องกันไม่ให้ฮุกหลังการติดตั้งลบไดเรกทอรีเราเตอร์แอป Next.js ที่ว่างเปล่า
for _d in \
.next/standalone/.next/server/app/dashboard \
.next/standalone/.next/server/app/dashboard/settings \
.next/standalone/.next/server/app/dashboard/providers; do
touch "${DESTDIR}/usr/lib/omniroute/${_d}/.keep"
done
cat > "${WRKDIR}/omniroute" <<'EOF'
#!/bin/sh
export PORT="${PORT:-20128}"
export DATA_DIR="${DATA_DIR:-${XDG_DATA_HOME:-${HOME}/.local/share}/omniroute}"
export APP_LOG_TO_FILE="${APP_LOG_TO_FILE:-false}"
mkdir -p "${DATA_DIR}"
exec node /usr/lib/omniroute/.next/standalone/server.js "$@"
EOF
vbin "${WRKDIR}/omniroute"
}
post_install() {
vlicense LICENSE
}
```
### ตัวแปรสภาพแวดล้อม
| ตัวแปร | ค่าเริ่มต้น | คำอธิบาย |
| --------------------------------------- | ------------------------------------ | ------------------------------------------------------------------------------------------------------------------- |
| `JWT_SECRET` | `omniroute-default-secret-change-me` | คีย์ลับสำหรับลงนาม JWT (**ต้องเปลี่ยนในระบบที่ใช้งานจริง**) |
| `INITIAL_PASSWORD` | `CHANGEME` | รหัสผ่านสำหรับการเข้าสู่ระบบครั้งแรก |
| `DATA_DIR` | `~/.omniroute` | ไดเรกทอรีข้อมูล (ฐานข้อมูล ข้อมูลการใช้งาน และบันทึกเหตุการณ์) |
| `PORT` | ค่าเริ่มต้นของเฟรมเวิร์ก | พอร์ตของบริการ (`20128` ในตัวอย่าง) |
| `HOSTNAME` | ค่าเริ่มต้นของเฟรมเวิร์ก | โฮสต์ที่ใช้รับการเชื่อมต่อ (Docker ใช้ค่าเริ่มต้นเป็น `0.0.0.0`) |
| `NODE_ENV` | ค่าเริ่มต้นของรันไทม์ | ตั้งค่าเป็น `production` สำหรับการนำไปใช้งาน |
| `NEXT_PUBLIC_BASE_URL` | `http://localhost:20128` | URL ฐานแบบสาธารณะที่แสดงต่อแดชบอร์ดและเปิดให้เซิร์ฟเวอร์ใช้งาน (ใช้แทน `BASE_URL` แบบเดิม) |
| `NEXT_PUBLIC_CLOUD_URL` | `https://omniroute.dev` | URL ฐานของปลายทางการซิงค์กับคลาวด์ (ใช้แทน `CLOUD_URL` แบบเดิม) |
| `API_KEY_SECRET` | `endpoint-proxy-api-key-secret` | คีย์ลับ HMAC สำหรับคีย์ API ที่สร้างขึ้น |
| `REQUIRE_API_KEY` | `false` | บังคับใช้คีย์ API แบบ Bearer กับ `/v1/*` |
| `ALLOW_API_KEY_REVEAL` | `false` | อนุญาตให้ผู้ใช้แดชบอร์ดที่ผ่านการยืนยันตัวตนเปิดดูค่าคีย์ API ที่จัดเก็บไว้แบบเต็มได้ตามต้องการ |
| `PROVIDER_LIMITS_SYNC_INTERVAL_MINUTES` | `70` | ความถี่ในการรีเฟรชข้อมูล Provider Limits ที่แคชไว้จากฝั่งเซิร์ฟเวอร์ ปุ่มรีเฟรชใน UI ยังคงเรียกใช้การซิงค์ด้วยตนเอง |
| `DISABLE_SQLITE_AUTO_BACKUP` | `false` | ปิดใช้สแนปช็อต SQLite อัตโนมัติก่อนการเขียน/นำเข้า/กู้คืน โดยการสำรองข้อมูลด้วยตนเองยังคงใช้งานได้ |
| `APP_LOG_TO_FILE` | `true` | เปิดใช้การบันทึกเหตุการณ์ของแอปพลิเคชันและการตรวจสอบลงดิสก์ |
| `AUTH_COOKIE_SECURE` | `false` | บังคับใช้คุกกี้การยืนยันตัวตนแบบ `Secure` (เมื่ออยู่หลังพร็อกซีย้อนกลับ HTTPS) |
| `CLOUDFLARED_BIN` | ไม่ได้ตั้งค่า | ใช้ไบนารี `cloudflared` ที่มีอยู่แทนการดาวน์โหลดที่มีการจัดการ |
| `CLOUDFLARED_PROTOCOL` | `http2` | การขนส่งสำหรับ Quick Tunnels ที่มีการจัดการ (`http2`, `quic` หรือ `auto`) |
| `OMNIROUTE_MEMORY_MB` | `512` | ขีดจำกัดฮีปของ Node.js หน่วยเป็น MB |
| `PROMPT_CACHE_MAX_SIZE` | `50` | จำนวนรายการสูงสุดในแคชพรอมต์ |
| `SEMANTIC_CACHE_MAX_SIZE` | `100` | จำนวนรายการสูงสุดในแคชเชิงความหมาย |
สำหรับข้อมูลอ้างอิงตัวแปรสภาพแวดล้อมทั้งหมด โปรดดู [README](../README.md)
---
## 📊 โมเดลที่พร้อมใช้งาน
ดูโมเดลที่พร้อมใช้งานทั้งหมด
> รายการด้านล่างได้รับการคัดสรรมาจาก `open-sse/config/providerRegistry.ts` สำหรับ v3.8.0 แค็ตตาล็อกบนคลาวด์ (Gemini, OpenRouter ฯลฯ) จะซิงค์แบบไดนามิก — หากต้องการดูแค็ตตาล็อกปัจจุบันทั้งหมด ให้เปิด **แดชบอร์ด → ผู้ให้บริการ → [ผู้ให้บริการ] → โมเดลที่พร้อมใช้งาน** หรือเรียก `GET /api/models/catalog`
>
> หากรายการในตัวของผู้ให้บริการไม่เป็นปัจจุบัน ให้ใช้ **นำเข้าจาก /models** ในหน้านั้น (หรือเปิดใช้ **ซิงค์อัตโนมัติ**) เพื่อดึงแค็ตตาล็อกปัจจุบันจากต้นทาง การทำงานนี้ได้รับการตรวจสอบแล้วใน v3.8.50 สำหรับ LLM7.io (`gemini-3.1-flash-lite`) และ UncloseAI (`solidrust/Hermes-3-Llama-3.1-8B-AWQ`) ส่วนการเข้าถึง Pollinations แบบไม่ระบุตัวตนยังคงถูกจำกัดโดยต้นทางในระหว่างการทดสอบรอบเดียวกัน
**Claude Code (`cc/`)** — OAuth สำหรับ Pro/Max: `cc/claude-opus-4-8`, `cc/claude-opus-4-7`, `cc/claude-opus-4-6`, `cc/claude-opus-4-5-20251101`, `cc/claude-sonnet-4-6`, `cc/claude-sonnet-4-5-20250929`, `cc/claude-haiku-4-5-20251001`
**Codex (`cx/`)** — OAuth สำหรับ Plus/Pro: `cx/gpt-5.5` (+ ระดับความพยายาม: `gpt-5.5-xhigh`, `gpt-5.5-high`, `gpt-5.5-medium`, `gpt-5.5-low`), `cx/gpt-5.4`, `cx/gpt-5.4-mini`, `cx/gpt-5.3-codex`, `cx/gpt-5.3-codex-spark`
**GitHub Copilot (`gh/`)** — OAuth: `gh/gpt-5.5`, `gh/gpt-5.4`, `gh/gpt-5.4-mini`, `gh/gpt-5-mini`, `gh/gpt-5.3-codex`, `gh/claude-opus-4.7`, `gh/claude-opus-4.6`, `gh/claude-opus-4-5-20251101`, `gh/claude-sonnet-4.6`, `gh/claude-sonnet-4.5`, `gh/claude-haiku-4.5`, `gh/gemini-3.1-pro-preview`, `gh/gemini-3-flash-preview`, `gh/oswe-vscode-prime`
**Kiro (`kr/`)** — OAuth ฟรี: ใช้แค็ตตาล็อกปัจจุบันที่แสดงใน **แดชบอร์ด → ผู้ให้บริการ → Kiro → โมเดลที่พร้อมใช้งาน** ความพร้อมใช้งานขึ้นอยู่กับบัญชีและแผนบริการ
**Qoder (`if/`)** — OAuth ฟรี: `if/qwen3.8-max-preview`, `if/qwen3.7-max`, `if/qwen3.7-plus`, `if/kimi-k3`, `if/kimi-k2.7-code`, `if/glm-5.2`, `if/deepseek-v4-pro`, `if/deepseek-v4-flash`, `if/minimax-m3`
**GLM (`glm/`, `glm-cn/`, `zai/`, `glmt/`)** — $0.2–0.6/1M: `glm/glm-5.1`, `glm/glm-5`, `glm/glm-5-turbo`, `glm/glm-4.7`, `glm/glm-4.7-flash`, `glm/glm-4.6`, `glm/glm-4.6v`, `glm/glm-4.5`, `glm/glm-4.5v`, `glm/glm-4.5-air`
**MiniMax (`minimax/`, `minimax-cn/`)** — $0.2/1M: `minimax/MiniMax-M2.7`, `minimax/MiniMax-M2.7-highspeed`, `minimax/MiniMax-M2.5`, `minimax/MiniMax-M2.5-highspeed`
**Kimi (`kimi/`, `kimi-coding/`, `kimi-coding-apikey/`)** — $9/เดือนแบบเหมาจ่ายหรือคิดตามการใช้งาน: `kimi/kimi-k2.6`, `kimi/kimi-k2.5`
**DeepSeek (`ds/`)** — คีย์ API: `ds/deepseek-v4-pro`, `ds/deepseek-v4-flash`
**Groq (`groq/`)** — เร็วเป็นพิเศษ: `groq/llama-3.3-70b-versatile`, `groq/meta-llama/llama-4-maverick-17b-128e-instruct`, `groq/qwen/qwen3-32b`, `groq/openai/gpt-oss-120b`
**xAI (`xai/`)** — Grok แบบเนทีฟ: `xai/grok-4.3`, `xai/grok-4.20-multi-agent-0309`, `xai/grok-4.20-0309-reasoning`, `xai/grok-4.20-0309-non-reasoning`
**Mistral (`mistral/`)** — โฮสต์ในสหภาพยุโรป: `mistral/mistral-large-latest`, `mistral/mistral-medium-3-5`, `mistral/mistral-small-latest`, `mistral/devstral-latest`, `mistral/codestral-latest`
**Perplexity (`pplx/`)** — เสริมด้วยการค้นหา: `pplx/sonar-deep-research`, `pplx/sonar-reasoning-pro`, `pplx/sonar-pro`, `pplx/sonar`
**Together AI (`together/`)** — โอเพนซอร์ส: `together/meta-llama/Llama-3.3-70B-Instruct-Turbo-Free` (ฟรี), `together/meta-llama/Llama-Vision-Free`, `together/deepseek-ai/DeepSeek-R1-Distill-Llama-70B-Free`, `together/deepseek-ai/DeepSeek-R1`, `together/Qwen/Qwen3-235B-A22B`, `together/meta-llama/Llama-4-Maverick-17B-128E-Instruct-FP8`
**Fireworks AI (`fireworks/`)** — การอนุมานที่รวดเร็ว: `fireworks/accounts/fireworks/models/kimi-k2p6`, `fireworks/accounts/fireworks/models/minimax-m2p7`, `fireworks/accounts/fireworks/models/qwen3p6-plus`, `fireworks/accounts/fireworks/models/glm-5p1`, `fireworks/accounts/fireworks/models/deepseek-v4-pro`
**Cerebras (`cerebras/`)** — ระดับเวเฟอร์: `cerebras/zai-glm-4.7`, `cerebras/gpt-oss-120b`
**Cohere (`cohere/`)** — มุ่งเน้น RAG: `cohere/command-a-reasoning-08-2025`, `cohere/command-a-vision-07-2025`, `cohere/command-a-03-2025`, `cohere/command-r-08-2024`
**NVIDIA NIM (`nvidia/`)** — สำหรับองค์กร: `nvidia/z-ai/glm-5.1`, `nvidia/minimaxai/minimax-m2.7`, `nvidia/google/gemma-4-31b-it`, `nvidia/mistralai/mistral-small-4-119b-2603`, `nvidia/mistralai/mistral-large-3-675b-instruct-2512`, `nvidia/qwen/qwen3.5-397b-a17b`, `nvidia/deepseek-ai/deepseek-v4-pro`, `nvidia/openai/gpt-oss-120b`, `nvidia/nvidia/nemotron-3-super-120b-a12b`
**Baidu Qianfan (`qianfan/`)** — ERNIE: `qianfan/ernie-5.1`, `qianfan/ernie-5.0-thinking-latest`, `qianfan/ernie-x1.1`
**Ollama Cloud (`ollama-cloud/`)**: `ollama-cloud/deepseek-v4-pro`, `ollama-cloud/deepseek-v4-flash`, `ollama-cloud/kimi-k2.6`, `ollama-cloud/glm-5.1`, `ollama-cloud/minimax-m2.7`, `ollama-cloud/gemma4:31b`, `ollama-cloud/qwen3.5:397b`
**Gemini (Google Cloud `gemini/`)**: ซิงค์แบบเรียลไทม์จาก Google ตามคีย์ API — ไม่มีรายการแบบคงที่ เชื่อมต่อคีย์ใน **แดชบอร์ด → ผู้ให้บริการ** แล้วใช้ **โมเดลที่พร้อมใช้งาน** เพื่อนำเข้าแค็ตตาล็อกปัจจุบัน (เช่น `gemini/gemini-3-pro`, `gemini/gemini-3-flash`)
**ผู้ให้บริการอื่นที่เข้ากันได้** (บางส่วน): `cohere`, `databricks`, `snowflake`, `together`, `vertex`, `alibaba`, `alibaba-cn`, `bedrock` (ผ่าน `aws-bedrock`), `azure-ai`, `openrouter` (แค็ตตาล็อกแบบส่งผ่าน), `siliconflow`, `hyperbolic`, `huggingface`, `featherless-ai`, `cloudflare-ai`, `scaleway`, `deepinfra`, `vercel-ai-gateway`, `bazaarlink`, `friendliai`, `nous-research`, `reka`, `volcengine`, `ai21`, `gigachat` แต่ละรายดูแลรายการโมเดลของตนเองใน `providerRegistry.ts` และสามารถซิงค์อัตโนมัติได้เมื่อผู้ให้บริการเปิดเผยเอนด์พอยต์ `/models`
**หมายเหตุเกี่ยวกับรหัสโมเดล:** OmniRoute ใช้รหัสแบบเนทีฟของผู้ให้บริการ (`claude-opus-4-8`, `gpt-5.5`, `glm-5.1`, `MiniMax-M2.7`, `kimi-k2.5`, `grok-4.20-0309-reasoning`) บางรหัสมีหมายเลขเวอร์ชันที่ใช้จุด เนื่องจาก API ต้นทางกำหนดไว้เช่นนั้น หากโมเดลไม่อยู่ในรายการข้างต้น ให้เรียกใช้ `omniroute models --search ` หรือเรียก `GET /api/models/catalog` เพื่อยืนยันความพร้อมใช้งาน
---
## 🧩 ฟีเจอร์ขั้นสูง
### โมเดลแบบกำหนดเอง
เพิ่ม ID ของโมเดลใดก็ได้ให้กับผู้ให้บริการรายใดก็ได้ โดยไม่ต้องรอการอัปเดตแอป:
```bash
# ผ่าน API
curl -X POST http://localhost:20128/api/provider-models \
-H "Content-Type: application/json" \
-d '{"provider": "openai", "modelId": "gpt-5.2", "modelName": "GPT-5.2"}'
# แสดงรายการ: curl http://localhost:20128/api/provider-models?provider=openai
# ลบ: curl -X DELETE "http://localhost:20128/api/provider-models?provider=openai&model=gpt-5.2"
```
หรือใช้แดชบอร์ด: **Providers → [Provider] → Custom Models**
หมายเหตุ:
- ผู้ให้บริการที่เข้ากันได้กับ OpenRouter และ OpenAI/Anthropic จะได้รับการจัดการจาก **Available Models** เท่านั้น การเพิ่มด้วยตนเอง การนำเข้า และการซิงค์อัตโนมัติทั้งหมดจะรวมอยู่ในรายการโมเดลที่พร้อมใช้งานเดียวกัน ดังนั้นจึงไม่มีส่วน Custom Models แยกต่างหากสำหรับผู้ให้บริการเหล่านั้น
- ส่วน **Custom Models** มีไว้สำหรับผู้ให้บริการที่ไม่มีการนำเข้าโมเดลที่พร้อมใช้งานแบบมีการจัดการ
### ผู้ให้บริการแบบกำหนดเองที่เข้ากันได้กับ OpenAI
เกตเวย์ใดก็ตามที่รองรับ OpenAI API (พร็อกซีที่โฮสต์เอง, vLLM, ตัวรวบรวมจากบุคคลที่สาม)
สามารถเพิ่มเป็นโหนดผู้ให้บริการแยกต่างหากได้:
1. **Providers → Add OpenAI Compatible**
2. **Name**: ป้ายชื่อที่ใช้แสดงสำหรับโหนด
3. **Prefix**: ชื่อสำหรับการกำหนดเส้นทาง ไคลเอนต์เรียกโมเดลในรูปแบบ `/` ดังนั้นโหนดที่มี
คำนำหน้า `mygw` จะให้บริการ `mygw/gpt-4o-mini` จำเป็นต้องระบุ และไม่มีข้อจำกัดด้านอักขระ
4. **API Type**: กลุ่มเอนด์พอยต์ที่เกตเวย์ให้บริการ (Chat Completions, Responses,
Embeddings, เสียง, รูปภาพ)
5. **Base URL**: รากของ API จนถึงและรวม `/v1` (ตัวอย่างเช่น
`https://gateway.example.com/v1`) ไม่ใช่พาธ `/chat/completions` แบบเต็ม สำหรับเกตเวย์ที่มี
พาธที่ไม่เป็นมาตรฐาน ให้ตั้งค่าภายใต้ **Advanced Settings** (พาธแชต, พาธโมเดล)
6. ช่อง **API Key (for Check)** ใช้ทดสอบการเชื่อมต่อเท่านั้น หลังจากสร้างโหนดแล้ว
ให้เปิดโหนดและใช้ **Add Connection** เพื่อจัดเก็บคีย์ที่จะใช้กับคำขอ
โหนดจะได้รับ ID ภายในในรูปแบบ `openai-compatible--` โดยคุณไม่จำเป็นต้อง
พิมพ์ ID นี้ เนื่องจากคำนำหน้าคือชื่อสาธารณะ
#### คำนำหน้าที่สงวนไว้
คำนำหน้าต้องไม่เป็น ID หรือนามแฝงของผู้ให้บริการในตัว (ตัวอย่างเช่น `openai`, `cf`) และต้องไม่เป็น
ID ของผู้ให้บริการที่ยุติการใช้งานแล้ว ตัวแก้ไขโมเดลจะตรวจสอบ ID และนามแฝงในตัวก่อน
โหนดแบบกำหนดเอง ดังนั้นโหนดที่ใช้คำนำหน้าเหล่านั้นจะไม่มีวันได้รับทราฟฟิก:
`/model` จะถูกส่งไปยังผู้ให้บริการในตัวแทน หรือถูกปฏิเสธแบบ fail-closed หากผู้ให้บริการนั้น
ยุติการใช้งานแล้ว การสร้างหรือแก้ไขโหนดด้วยคำนำหน้าดังกล่าวจะถูกปฏิเสธพร้อมข้อความ:
```text
prefix: "" เป็นคำนำหน้าผู้ให้บริการที่สงวนไว้ — โปรดเลือกคำนำหน้าอื่น (ไม่สามารถใช้ ID/นามแฝงที่สงวนไว้กับโหนดแบบกำหนดเองได้ เนื่องจากคำขออย่าง /model จะถูกกำหนดเส้นทางไปยังผู้ให้บริการในตัว หรือถูกปฏิเสธแบบ fail-closed เมื่อยุติการใช้งานแล้ว)
```
เลือกคำนำหน้าที่ไม่ซ้ำกัน (`mygw`, `acme-proxy`) หากคำขอไปยังโหนดแบบกำหนดเองล้มเหลวโดยมี
ข้อผิดพลาดที่ระบุชื่อผู้ให้บริการในตัวหรือข้อมูลประจำตัวของผู้ให้บริการนั้น ให้ตรวจสอบว่าคำนำหน้าของโหนด
เป็นคำนำหน้าที่สงวนไว้หรือไม่: โหนดที่บันทึกไว้ก่อนมีกฎนี้จะยังคงถูกจัดเก็บอยู่ แต่คำนำหน้าของโหนดจะกำหนดเส้นทางไปยัง
ผู้ให้บริการในตัว ให้แก้ไขโหนดและกำหนดคำนำหน้าใหม่
### การเชื่อมต่อ OmniRoute เพียร์แบบลูกโซ่
สามารถเพิ่มเกตเวย์ OmniRoute อื่นเป็นผู้ให้บริการ **Custom OpenAI-compatible** ได้ โดยใช้
Base URL `/v1` ของเพียร์และ API key เฉพาะที่มีสิทธิ์น้อยที่สุดซึ่งออกโดยเพียร์นั้น
สำหรับลูกโซ่แบบสองทางหรือหลายทอด ให้เปิดใช้กลไกป้องกันลูปแบบเลือกเข้าร่วมบนทุกเกตเวย์:
```bash
# gateway-a
OMNIROUTE_INSTANCE_ID=gateway-a
OMNIROUTE_PEER_URLS=http://gateway-b:20128/v1
OMNIROUTE_PEER_MAX_HOPS=4
```
```bash
# gateway-b
OMNIROUTE_INSTANCE_ID=gateway-b
OMNIROUTE_PEER_URLS=http://gateway-a:20128/v1
OMNIROUTE_PEER_MAX_HOPS=4
```
เฉพาะคำขอที่ส่งไปยัง URL ของเพียร์ซึ่งอยู่ในรายการอนุญาตอย่างชัดเจนเท่านั้นที่จะได้รับส่วนหัว
`X-OmniRoute-Peer-Trace` เกตเวย์จะปฏิเสธ ID ของอินสแตนซ์ที่ซ้ำกันหรือเมื่อโควตาจำนวนทอด
หมดลงด้วย HTTP `508 Loop Detected` ส่วนผู้ให้บริการต้นทางทั่วไปจะไม่ได้รับเมตาดาต้าของเพียร์
การเชื่อมต่อเพียร์แบบลูกโซ่ไม่ใช่การจำลองฐานข้อมูลหรือการทำ failover ของโฮสต์ แต่ละเกตเวย์จะเก็บ
สถานะ SQLite, แคช, ตัวนับอัตรา และเซสชันแยกจากกัน ใช้ reverse proxy ที่มีการตรวจสอบสถานะหรือกลไก
failover ฝั่งไคลเอนต์สำหรับความพร้อมใช้งานแบบ active/passive หรือ active/active และห้ามเมานต์ฐานข้อมูล SQLite เดียวกัน
เข้ากับอินสแตนซ์ OmniRoute หลายตัวที่กำลังทำงานอยู่
### เส้นทางเฉพาะสำหรับผู้ให้บริการ
กำหนดเส้นทางคำขอไปยังผู้ให้บริการที่ระบุโดยตรง พร้อมการตรวจสอบความถูกต้องของโมเดล:
```bash
POST http://localhost:20128/v1/providers/openai/chat/completions
POST http://localhost:20128/v1/providers/openai/embeddings
POST http://localhost:20128/v1/providers/fireworks/images/generations
```
ระบบจะเพิ่มคำนำหน้าของผู้ให้บริการโดยอัตโนมัติหากยังไม่มี โมเดลที่ไม่ตรงกันจะส่งคืน `400`
### การกำหนดค่าพร็อกซีเครือข่าย
```bash
# ตั้งค่าพร็อกซีส่วนกลาง
curl -X PUT http://localhost:20128/api/settings/proxy \
-d '{"global": {"type":"http","host":"proxy.example.com","port":"8080"}}'
# พร็อกซีรายผู้ให้บริการ
curl -X PUT http://localhost:20128/api/settings/proxy \
-d '{"providers": {"openai": {"type":"socks5","host":"proxy.example.com","port":"1080"}}}'
# ทดสอบพร็อกซี
curl -X POST http://localhost:20128/api/settings/proxy/test \
-d '{"proxy":{"type":"socks5","host":"proxy.example.com","port":"1080"}}'
```
**ลำดับความสำคัญ:** เฉพาะคีย์ → เฉพาะคอมโบ → เฉพาะผู้ให้บริการ → ส่วนกลาง → สภาพแวดล้อม
### API แค็ตตาล็อกโมเดล
```bash
curl http://localhost:20128/api/models/catalog
```
ส่งคืนโมเดลที่จัดกลุ่มตามผู้ให้บริการพร้อมประเภท (`chat`, `embedding`, `image`)
### การซิงค์บนคลาวด์
- ซิงค์ผู้ให้บริการ คอมโบ และการตั้งค่าระหว่างอุปกรณ์
- ซิงค์เบื้องหลังโดยอัตโนมัติ พร้อมการหมดเวลาและการล้มเหลวอย่างรวดเร็ว
- ในระบบใช้งานจริง ควรเลือกใช้ `NEXT_PUBLIC_BASE_URL`/`NEXT_PUBLIC_CLOUD_URL` ฝั่งเซิร์ฟเวอร์
### Cloudflare Quick Tunnel
- พร้อมใช้งานใน **Dashboard → Endpoints** สำหรับ Docker และการติดตั้งแบบโฮสต์ด้วยตนเองอื่นๆ
- สร้าง URL ชั่วคราว `https://*.trycloudflare.com` ซึ่งส่งต่อไปยัง endpoint `/v1` ปัจจุบันของคุณที่เข้ากันได้กับ OpenAI
- การเปิดใช้งานครั้งแรกจะติดตั้ง `cloudflared` เฉพาะเมื่อจำเป็น ส่วนการรีสตาร์ตครั้งต่อๆ ไปจะใช้ไบนารีที่จัดการไว้ตัวเดิม
- Quick Tunnels จะไม่ถูกกู้คืนโดยอัตโนมัติหลังจากรีสตาร์ต OmniRoute หรือคอนเทนเนอร์ ให้เปิดใช้งานอีกครั้งจากแดชบอร์ดเมื่อจำเป็น
- URL ของ tunnel เป็นแบบชั่วคราวและจะเปลี่ยนทุกครั้งที่คุณหยุด/เริ่ม tunnel
- Quick Tunnels ที่จัดการโดยระบบจะใช้การรับส่งข้อมูลผ่าน HTTP/2 เป็นค่าเริ่มต้น เพื่อหลีกเลี่ยงคำเตือนเกี่ยวกับบัฟเฟอร์ UDP ของ QUIC ที่รบกวนในคอนเทนเนอร์ซึ่งมีทรัพยากรจำกัด
- ตั้งค่า `CLOUDFLARED_PROTOCOL=quic` หรือ `auto` หากคุณต้องการแทนที่ตัวเลือกการรับส่งข้อมูลที่ระบบจัดการไว้
- ตั้งค่า `CLOUDFLARED_BIN` หากคุณต้องการใช้ไบนารี `cloudflared` ที่ติดตั้งไว้ล่วงหน้าแทนการดาวน์โหลดที่ระบบจัดการให้
- สามารถแสดงหรือซ่อนแผง Cloudflare Quick Tunnel, Tailscale Funnel และ ngrok Tunnel ได้ใน **Settings → Appearance** การซ่อนแผงจะไม่หยุด tunnel ที่กำลังทำงานอยู่
### ความสามารถอัจฉริยะของ LLM Gateway (ระยะที่ 9)
- **แคชเชิงความหมาย** — แคชการตอบกลับแบบไม่สตรีมและ temperature=0 โดยอัตโนมัติ (ข้ามแคชด้วย `X-OmniRoute-No-Cache: true`)
- **การรับประกันว่าแต่ละคำขอมีผลเพียงครั้งเดียว** — กำจัดคำขอซ้ำภายใน 5 วินาทีผ่านเฮดเดอร์ `Idempotency-Key` หรือ `X-Request-Id`
- **การติดตามความคืบหน้า** — เลือกรับเหตุการณ์ SSE `event: progress` ผ่านเฮดเดอร์ `X-OmniRoute-Progress: true`
---
### พื้นที่ทดลอง Translator
เข้าถึงผ่าน **Dashboard → Translator** ดีบักและแสดงภาพวิธีที่ OmniRoute แปลคำขอ API ระหว่างผู้ให้บริการต่างๆ
| โหมด | วัตถุประสงค์ |
| ---------------- | ----------------------------------------------------------------------- |
| **Playground** | เลือกรูปแบบต้นทาง/ปลายทาง วางคำขอ และดูผลลัพธ์ที่แปลแล้วได้ทันที |
| **Chat Tester** | ส่งข้อความแชตแบบสดผ่านพร็อกซีและตรวจสอบวงจรคำขอ/การตอบกลับทั้งหมด |
| **Test Bench** | เรียกใช้การทดสอบแบบกลุ่มกับรูปแบบหลายชุดเพื่อยืนยันความถูกต้องของการแปล |
| **Live Monitor** | ดูการแปลแบบเรียลไทม์ขณะที่คำขอไหลผ่านพร็อกซี |
**กรณีการใช้งาน:**
- ดีบักสาเหตุที่ชุดไคลเอนต์/ผู้ให้บริการหนึ่งๆ ทำงานล้มเหลว
- ตรวจสอบว่าแท็กการคิด การเรียกใช้เครื่องมือ และพรอมต์ระบบได้รับการแปลอย่างถูกต้อง
- เปรียบเทียบความแตกต่างของรูปแบบระหว่าง OpenAI, Claude, Gemini และ Responses API
---
### กลยุทธ์การกำหนดเส้นทาง
กำหนดค่าผ่าน **Dashboard → Settings → Routing** แดชบอร์ดแสดงกลยุทธ์ที่ใช้บ่อยที่สุดหกแบบ ส่วน combo และ auto-router รองรับกลยุทธ์ที่หลากหลายกว่าภายในระบบ
**กลยุทธ์ที่แสดงในแดชบอร์ด (การกำหนดเส้นทางระดับบัญชี):**
| กลยุทธ์ | คำอธิบาย |
| ------------------------------ | ----------------------------------------------------------------------------------------------------------- |
| **Fill First** | ใช้บัญชีตามลำดับความสำคัญ โดยบัญชีหลักจะจัดการคำขอทั้งหมดจนกว่าจะไม่พร้อมใช้งาน |
| **Round Robin** | วนใช้ทุกบัญชีโดยมีขีดจำกัดการยึดติดที่กำหนดค่าได้ (ค่าเริ่มต้น: 3 การเรียกต่อบัญชี) |
| **P2C (Power of Two Choices)** | เลือกบัญชีแบบสุ่ม 2 บัญชีและกำหนดเส้นทางไปยังบัญชีที่มีสถานะดีกว่า เพื่อกระจายโหลดโดยคำนึงถึงสถานะความพร้อม |
| **Random** | เลือกบัญชีแบบสุ่มสำหรับแต่ละคำขอโดยใช้การสับแบบ Fisher-Yates |
| **Least Used** | กำหนดเส้นทางไปยังบัญชีที่มีเวลาประทับ `lastUsedAt` เก่าที่สุด เพื่อกระจายทราฟฟิกอย่างสม่ำเสมอ |
| **Cost Optimized** | กำหนดเส้นทางไปยังบัญชีที่มีค่าลำดับความสำคัญต่ำที่สุด เพื่อเลือกผู้ให้บริการที่มีต้นทุนต่ำที่สุด |
**กลยุทธ์ combo และ auto ขั้นสูง** (กำหนดค่าได้ต่อ combo หรือผ่านคำนำหน้า `auto/*` — ดู [AUTO-COMBO.md](../routing/AUTO-COMBO.md)):
- `priority` — ใช้ลำดับอย่างเคร่งครัดและไม่สลับแบบ round-robin
- `weighted` — แบ่งทราฟฟิกตามสัดส่วนโดยอิงน้ำหนักของแต่ละโมเดล
- `fill-first` — ใช้โมเดลแรกจนถึงขีดจำกัด
- `round-robin` / `strict-random` / `random`
- `p2c` (Power of Two Choices)
- `least-used` และ `cost-optimized`
- `auto` — ขับเคลื่อนด้วยคะแนนจากตัวเลือกทั้งหมด
- `lkgp` (Last Known Good Provider) — ยึดกับผู้ให้บริการล่าสุดที่ทำงานสำเร็จ จากนั้นจึงย้อนกลับไปใช้กฎ
- `context-optimized` — เลือกโมเดลที่มีหน้าต่างบริบทว่างมากที่สุด
- `context-relay` — เชื่อมต่อโมเดลบริบทยาวเป็นลำดับสำหรับรอบการสนทนาต่อเนื่อง
#### เฮดเดอร์ Sticky Session ภายนอก
สำหรับการยึดโยงเซสชันจากภายนอก (ตัวอย่างเช่น เอเจนต์ Claude Code/Codex ที่อยู่หลัง reverse proxy) ให้ส่ง:
```http
X-Session-Id: your-session-key
```
OmniRoute ยังยอมรับ `x_session_id` และส่งคืนคีย์เซสชันที่ใช้งานจริงใน `X-OmniRoute-Session-Id`
หากคุณใช้ Nginx และส่งเฮดเดอร์ในรูปแบบที่มีเครื่องหมายขีดล่าง ให้เปิดใช้งาน:
```nginx
underscores_in_headers on;
```
#### นามแฝงโมเดลแบบ Wildcard
สร้างรูปแบบ wildcard เพื่อแมปชื่อโมเดลใหม่:
```
Pattern: claude-sonnet-* → Target: cc/claude-sonnet-4-6
Pattern: gpt-* → Target: gh/gpt-5.3-codex
```
Wildcard รองรับ `*` (อักขระใดๆ) และ `?` (อักขระหนึ่งตัว)
#### ลำดับ Fallback
กำหนดลำดับ fallback ส่วนกลางที่ใช้กับคำขอทั้งหมด:
```
Chain: production-fallback
1. cc/claude-opus-4-7
2. gh/gpt-5.3-codex
3. glm/glm-4.7
```
---
### ชุดผู้ให้บริการและรูปแบบการกำหนดเส้นทางที่ใช้บ่อย
ต่อไปนี้คือตัวอย่างรูปแบบสำหรับการรวมผู้ให้บริการหลายรายและกำหนดเส้นทางระหว่างผู้ให้บริการเหล่านั้นใน OmniRoute:
#### 1. Combo สำหรับเอเจนต์เขียนโค้ด: การให้เหตุผลระดับสูงพร้อม Fallback ด้านต้นทุน/ความเร็ว
เหมาะสำหรับเอเจนต์เขียนโค้ด (OpenCode, Claude Code, Cursor, Cline) โดยเริ่มกำหนดเส้นทางไปยังโมเดลการให้เหตุผลระดับแนวหน้า และ fallback ไปยังโมเดลเขียนโค้ดที่รวดเร็วเมื่อโควตาหมดหรือเกิดข้อผิดพลาด
- **Dashboard**: Combos → New Combo → Name: `agent-coding` → Strategy: `Priority`
- **โมเดล**:
1. `claude/claude-sonnet-4-6` (เอเจนต์เขียนโค้ดหลัก)
2. `openai/gpt-4o` (fallback รองที่มีความจุสูง)
3. `deepseek/deepseek-v4-flash` (fallback ประสิทธิภาพสูงและคุ้มค่า)
```bash
# ตัวอย่างผ่าน API
curl -X POST http://localhost:20128/api/combos \
-H "Authorization: Bearer $OMNIROUTE_MANAGE_KEY" \
-H "Content-Type: application/json" \
-d '{
"name": "agent-coding",
"strategy": "priority",
"models": [
{ "model": "claude/claude-sonnet-4-6" },
{ "model": "openai/gpt-4o" },
{ "model": "deepseek/deepseek-v4-flash" }
]
}'
```
#### 2. คอมโบสลับไปใช้ Free Tier โดยอัตโนมัติ
เชื่อมต่อผู้ให้บริการแบบ Free Tier และแบบไม่ต้องใช้คีย์หลายรายเข้าด้วยกัน เพื่อเพิ่มความพร้อมใช้งานสูงสุดโดยไม่มีค่าใช้จ่าย API
- **กลยุทธ์**: `Least Used` หรือ `Round Robin` (กระจายโหลดระหว่างโควตา)
- **โมเดล**:
1. `groq/llama-3.3-70b-versatile`
2. `gemini/gemini-2.5-flash`
3. `cerebras/gpt-oss-120b`
```bash
# ตัวอย่างผ่าน CLI
omniroute combo create free-stack \
--models "groq/llama-3.3-70b-versatile,gemini/gemini-2.5-flash,cerebras/gpt-oss-120b" \
--strategy round-robin
```
#### 3. ไปป์ไลน์มัลติโมดัล / ภาพและข้อความ
จับคู่โมเดลด้านการมองเห็นเฉพาะทางกับการสร้างข้อความความเร็วสูง สำหรับเวิร์กโฟลว์ที่เกี่ยวข้องกับการทำความเข้าใจรูปภาพและการสร้างโค้ด
- **รูปแบบ**: คอมโบ `Priority` ที่เรียงโมเดลซึ่งรองรับการมองเห็นไว้ก่อน และวางโมเดลข้อความ/โค้ดที่มีอัตราการประมวลผลสูงไว้ท้ายสุด
- **โมเดล**:
1. `gemini/gemini-2.5-pro` (มีความสามารถสูงในการทำความเข้าใจรูปภาพ/มัลติโมดัล)
2. `openai/gpt-4o` (สมดุลระหว่างการมองเห็นและการใช้เครื่องมือ)
3. `deepseek/deepseek-v4-flash` (การสร้างข้อความ/โค้ด)
---
### ความทนทานและ Circuit Breaker
กำหนดค่าผ่าน **แดชบอร์ด → การตั้งค่า → ความทนทาน**
OmniRoute ใช้กลไกความทนทานระดับผู้ให้บริการซึ่งประกอบด้วยองค์ประกอบ 5 ส่วน:
1. **คิวคำขอและการควบคุมจังหวะ** — การปรับรูปแบบคำขอในระดับระบบ:
- **คำขอต่อนาที (RPM)** — จำนวนคำขอสูงสุดต่อนาทีต่อบัญชี
- **ช่วงเวลาขั้นต่ำระหว่างคำขอ** — ระยะห่างขั้นต่ำเป็นมิลลิวินาทีระหว่างคำขอ
- **จำนวนคำขอพร้อมกันสูงสุด** — จำนวนคำขอที่ทำงานพร้อมกันสูงสุดต่อบัญชี
2. **ช่วงพักการเชื่อมต่อ** — การกำหนดค่าตามประเภทการยืนยันตัวตนสำหรับการเชื่อมต่อหนึ่งรายการหลังเกิดข้อผิดพลาดที่ลองใหม่ได้:
- **ช่วงพักพื้นฐาน** — ช่วงพักเริ่มต้นสำหรับข้อผิดพลาดจากต้นทางที่ลองใหม่ได้
- **ใช้คำแนะนำการลองใหม่จากต้นทาง** — ปฏิบัติตามค่า `Retry-After` หรือคำแนะนำการรีเซ็ตที่เชื่อถือได้เมื่อมีการระบุ
- **ขั้นตอนการถอยกลับสูงสุด** — ระดับการถอยกลับแบบทวีคูณสูงสุดสำหรับความล้มเหลวที่เกิดซ้ำ
3. **Circuit Breaker ของผู้ให้บริการ** — ติดตามความล้มเหลวแบบต้นทางถึงปลายทางของผู้ให้บริการ ทำเครื่องหมายว่าผู้ให้บริการมีประสิทธิภาพลดลงเมื่อถึงเกณฑ์คำเตือนที่กำหนด และเปิด Breaker เมื่อถึงเกณฑ์ความล้มเหลวที่กำหนด:
- **เกณฑ์การลดประสิทธิภาพ** — จำนวนความล้มเหลวต่อเนื่องของผู้ให้บริการก่อนเข้าสู่สถานะ `DEGRADED`
- **เกณฑ์ความล้มเหลว** — จำนวนความล้มเหลวต่อเนื่องของผู้ให้บริการก่อนเข้าสู่สถานะ `OPEN`
- **ระยะเวลารอก่อนรีเซ็ต** — ช่วงเวลาก่อนทดสอบผู้ให้บริการอีกครั้ง
- **CLOSED** (ปกติ) — คำขอไหลผ่านตามปกติ
- **DEGRADED** — คำขอยังคงไหลผ่าน ขณะที่ระบบติดตามความล้มเหลวที่เพิ่มสูงขึ้น
- **OPEN** — ผู้ให้บริการถูกบล็อกชั่วคราวหลังจากเกิดความล้มเหลวซ้ำหลายครั้ง
- **HALF_OPEN** — กำลังทดสอบว่าผู้ให้บริการกลับมาทำงานได้แล้วหรือไม่
ขีดจำกัดอัตรา `429` ในขอบเขตการเชื่อมต่อจะยังคงอยู่ใน **ช่วงพักการเชื่อมต่อ** และไม่นับรวมใน Breaker ของผู้ให้บริการ
สถานะรันไทม์ของ Breaker ผู้ให้บริการจะแสดงเฉพาะใน **แดชบอร์ด → สถานะระบบ** เท่านั้น
4. **รอช่วงพัก** — หากการเชื่อมต่อที่เป็นตัวเลือกทั้งหมดอยู่ในช่วงพักแล้ว OmniRoute สามารถรอจนกว่าช่วงพักที่สิ้นสุดเร็วที่สุดจะหมดลง แล้วลองคำขอเดิมของไคลเอ็นต์อีกครั้งโดยอัตโนมัติ
5. **การตรวจจับขีดจำกัดอัตราอัตโนมัติ** — เมื่อผู้ให้บริการต้นทางส่งคืนช่วงเวลารออย่างชัดเจน คำแนะนำเหล่านั้นจะแทนที่ช่วงพักการเชื่อมต่อภายในเครื่องเมื่อเปิดใช้งานการตั้งค่านี้
**เคล็ดลับระดับมืออาชีพ:** ใช้หน้า **สถานะระบบ** เพื่อตรวจสอบและรีเซ็ต Breaker ของผู้ให้บริการที่กำลังทำงานอยู่หลังจากระบบหยุดให้บริการ หน้าความทนทานมีไว้สำหรับเปลี่ยนการกำหนดค่าเท่านั้น
---
### การส่งออก / นำเข้าฐานข้อมูล
จัดการข้อมูลสำรองของฐานข้อมูลใน **แดชบอร์ด → การตั้งค่า → ระบบและพื้นที่จัดเก็บข้อมูล**
| การดำเนินการ | คำอธิบาย |
| --------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------- |
| **ส่งออกฐานข้อมูล** | ดาวน์โหลดฐานข้อมูล SQLite ปัจจุบันเป็นไฟล์ `.sqlite` |
| **ส่งออกทั้งหมด (.tar.gz)** | ดาวน์โหลดไฟล์เก็บถาวรสำรองแบบเต็ม ซึ่งประกอบด้วยฐานข้อมูล การตั้งค่า คอมโบ การเชื่อมต่อผู้ให้บริการ (ไม่มีข้อมูลประจำตัว) และข้อมูลเมตาของคีย์ API |
| **นำเข้าฐานข้อมูล** | อัปโหลดไฟล์ `.sqlite` เพื่อแทนที่ฐานข้อมูลปัจจุบัน ระบบจะสร้างข้อมูลสำรองก่อนนำเข้าโดยอัตโนมัติ เว้นแต่กำหนด `DISABLE_SQLITE_AUTO_BACKUP=true` |
```bash
# API: ส่งออกฐานข้อมูล
curl -o backup.sqlite http://localhost:20128/api/db-backups/export
# API: ส่งออกทั้งหมด (ไฟล์เก็บถาวรแบบเต็ม)
curl -o backup.tar.gz http://localhost:20128/api/db-backups/exportAll
# API: นำเข้าฐานข้อมูล
curl -X POST http://localhost:20128/api/db-backups/import \
-F "file=@backup.sqlite"
```
**การตรวจสอบความถูกต้องเมื่อนำเข้า:** ไฟล์ที่นำเข้าจะได้รับการตรวจสอบความสมบูรณ์ (การตรวจสอบด้วย pragma ของ SQLite) ตารางที่จำเป็น (`provider_connections`, `provider_nodes`, `combos`, `api_keys`) และขนาด (สูงสุด 100MB)
**กรณีการใช้งาน:**
- ย้าย OmniRoute ระหว่างเครื่อง
- สร้างข้อมูลสำรองภายนอกสำหรับการกู้คืนจากภัยพิบัติ
- แชร์การกำหนดค่าระหว่างสมาชิกในทีม (ส่งออกทั้งหมด → แชร์ไฟล์เก็บถาวร)
---
### แดชบอร์ดการตั้งค่า
หน้าการตั้งค่าแบ่งออกเป็น **7 แท็บ** เพื่อให้ไปยังส่วนต่าง ๆ ได้ง่าย:
| แท็บ | เนื้อหา |
| ------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **ทั่วไป** | เครื่องมือจัดเก็บข้อมูลของระบบ ลักษณะการทำงานเริ่มต้น การมองเห็นทันเนลของ Endpoint |
| **รูปลักษณ์** | การควบคุมธีม (สว่าง/มืด/ระบบ) การมองเห็นแถบด้านข้าง การเปิด/ปิดแผงการ์ดทันเนล Cloudflare/Tailscale/ngrok |
| **AI** | งบประมาณการคิด (ส่งผ่าน / ตัดออกอัตโนมัติ / กำหนดเอง / ปรับตามสถานการณ์ — ดู [THINKING_BUDGET.md](./THINKING_BUDGET.md)) พรอมต์ระบบส่วนกลาง สถิติแคชพรอมต์ |
| **ความปลอดภัย** | การตั้งค่าการเข้าสู่ระบบ/รหัสผ่าน การควบคุมการเข้าถึงด้วย IP การยืนยันตัวตน API สำหรับ `/models` การบล็อกผู้ให้บริการ ระบบป้องกันการแทรกพรอมต์ |
| **การกำหนดเส้นทาง** | กลยุทธ์การกำหนดเส้นทางส่วนกลาง (Fill First / Round Robin / P2C / Random / Least Used / Cost Optimized) นามแฝงโมเดลแบบไวลด์การ์ด สายโซ่สำรอง ค่าเริ่มต้นของคอมโบ |
| **ความทนทาน** | คิวคำขอ ช่วงพักการเชื่อมต่อ การกำหนดค่าเบรกเกอร์ของผู้ให้บริการ และลักษณะการรอให้ช่วงพักสิ้นสุด |
| **ขั้นสูง** | การกำหนดค่าพร็อกซีส่วนกลาง (HTTP/SOCKS5) การแทนที่ค่าพร็อกซีแยกตามผู้ให้บริการ |
ส่วนทั่วไปจะไม่แสดงหมายเหตุแบบอ่านอย่างเดียวเกี่ยวกับการบันทึกและแคชซ้ำอีกต่อไป การตั้งค่าการเก็บรักษาและ
การเพิ่มประสิทธิภาพฐานข้อมูลจะถูกบันทึกผ่าน `/api/settings/database`; การล้างแคชด้วยตนเองใช้
`DELETE /api/cache` จำนวนแถวสูงสุดของบันทึกคำขอและบันทึกพร็อกซีควบคุมโดย
`CALL_LOGS_TABLE_MAX_ROWS` และ `PROXY_LOGS_TABLE_MAX_ROWS`
---
### การจัดการค่าใช้จ่ายและงบประมาณ
เข้าถึงผ่าน **แดชบอร์ด → ค่าใช้จ่าย**
| แท็บ | วัตถุประสงค์ |
| ---------------- | -------------------------------------------------------------------------------------------- |
| **งบประมาณ** | กำหนดวงเงินใช้จ่ายต่อคีย์ API ด้วยงบประมาณรายวัน/รายสัปดาห์/รายเดือนและการติดตามแบบเรียลไทม์ |
| **การกำหนดราคา** | ดูและแก้ไขรายการราคาโมเดล — ค่าใช้จ่ายต่อโทเค็นอินพุต/เอาต์พุต 1K แยกตามผู้ให้บริการ |
```bash
# API: กำหนดงบประมาณ
curl -X POST http://localhost:20128/api/usage/budget \
-H "Content-Type: application/json" \
-d '{"keyId": "key-123", "limit": 50.00, "period": "monthly"}'
# API: ดูสถานะงบประมาณปัจจุบัน
curl http://localhost:20128/api/usage/budget
```
**การติดตามค่าใช้จ่าย:** ทุกคำขอจะบันทึกการใช้โทเค็นและคำนวณค่าใช้จ่ายโดยอิงจากตารางราคา ดูรายละเอียดแยกตามผู้ให้บริการ โมเดล และคีย์ API ได้ที่ **แดชบอร์ด → การใช้งาน**
---
### การถอดเสียง
OmniRoute รองรับการถอดเสียงผ่าน Endpoint ที่เข้ากันได้กับ OpenAI:
```bash
POST /v1/audio/transcriptions
Authorization: Bearer your-api-key
Content-Type: multipart/form-data
# ตัวอย่างการใช้ curl
curl -X POST http://localhost:20128/v1/audio/transcriptions \
-H "Authorization: Bearer your-api-key" \
-F "file=@audio.mp3" \
-F "model=openai/whisper-1"
```
`deepgram/nova-3` เป็นเส้นทางดั้งเดิมของ Deepgram และต้องใช้คีย์ API ของ Deepgram
หากกำหนดค่าเฉพาะ OpenRouter ให้ใช้ `openrouter/deepgram/nova-3`
ผู้ให้บริการ **การแปลงเสียงเป็นข้อความ (การถอดเสียง)**:
- `openai/` (เข้ากันได้กับ Whisper)
- `groq/` (Groq Whisper Turbo)
- `deepgram/` (ตระกูล Nova)
- `assemblyai/`
- `nvidia/` (Parakeet, Canary)
- `huggingface/` (รุ่นย่อยของ Whisper)
- `qwen/`
ผู้ให้บริการ **การแปลงข้อความเป็นเสียง (`POST /v1/audio/speech`)**:
- `openai/` (tts-1, tts-1-hd)
- `hyperbolic/`
- `deepgram/` (Aura)
- `nvidia/` (Magpie TTS)
- `elevenlabs/`
- `huggingface/`
- `inworld/`
- `cartesia/`
- `playht/`
- `kie/`
- `aws-polly/`
- `xiaomi-mimo/`
- `coqui/`, `tortoise/`
- `qwen/`
รูปแบบเสียงที่รองรับสำหรับการถอดเสียง: `mp3`, `wav`, `m4a`, `flac`, `ogg`, `webm` รูปแบบเอาต์พุต TTS ขึ้นอยู่กับผู้ให้บริการ (mp3, wav, opus, pcm, mulaw)
---
### กลยุทธ์การกระจายโหลดของคอมโบ
กำหนดค่าการกระจายโหลดสำหรับแต่ละคอมโบได้ที่ **แดชบอร์ด → คอมโบ → สร้าง/แก้ไข → กลยุทธ์**
| กลยุทธ์ | คำอธิบาย |
| ------------------ | --------------------------------------------------------------------- |
| **Round-Robin** | หมุนเวียนใช้งานโมเดลตามลำดับ |
| **Priority** | ลองใช้โมเดลแรกเสมอ และเปลี่ยนไปใช้โมเดลสำรองเฉพาะเมื่อเกิดข้อผิดพลาด |
| **Random** | สุ่มเลือกโมเดลจากคอมโบสำหรับแต่ละคำขอ |
| **Weighted** | กำหนดเส้นทางตามสัดส่วนของน้ำหนักที่กำหนดให้แต่ละโมเดล |
| **Least-Used** | กำหนดเส้นทางไปยังโมเดลที่มีคำขอล่าสุดน้อยที่สุด (ใช้เมตริกของคอมโบ) |
| **Cost-Optimized** | กำหนดเส้นทางไปยังโมเดลที่พร้อมใช้งานและมีราคาถูกที่สุด (ใช้ตารางราคา) |
สามารถตั้งค่าเริ่มต้นของคอมโบส่วนกลางได้ที่ **แดชบอร์ด → การตั้งค่า → การกำหนดเส้นทาง → ค่าเริ่มต้นของคอมโบ**
โดยค่าเริ่มต้น การหมดเวลาของเป้าหมายคอมโบจะสืบทอดค่าหมดเวลาของคำขอปัจจุบัน ใช้ **การหมดเวลาของเป้าหมาย
(วินาที)** ในค่าเริ่มต้นของคอมโบหรือในคอมโบแต่ละรายการ เฉพาะเมื่อต้องการให้ขีดจำกัดต่อเป้าหมายที่สั้นกว่า
เรียกใช้กลไกสำรองได้เร็วขึ้น
การเพิ่มประสิทธิภาพคอมโบแบบไม่มีเวลาแฝงเป็นคุณสมบัติที่ต้องเลือกเปิดใช้งาน ปล่อยให้ **การเพิ่มประสิทธิภาพแบบไม่มีเวลาแฝง** ปิดอยู่เพื่อ
ป้องกันไม่ให้คุณสมบัติด้านเวลาแฝงเหล่านี้แข่งขันกับเป้าหมายสำรอง ข้ามเป้าหมายตามประวัติ TTFT
หรือบีบอัดคำขอสำรอง; การเปิดใช้งานจะอนุญาตให้ใช้การส่งคำขอแบบป้องกันความเสี่ยงที่กำหนดค่าไว้ การข้ามตามการคาดการณ์ TTFT
และการบีบอัดคำขอสำรองเชิงรุก เพื่อแลกความเที่ยงตรงของการกำหนดเส้นทาง/คำขอกับเวลาแฝงส่วนปลายที่ต่ำลง
ปิดใช้งาน **บัฟเฟอร์โทเค็นสำหรับการให้เหตุผล** เมื่อผู้ให้บริการต้นทางกำหนดขีดจำกัด
`max_tokens` / `maxOutputTokens` อย่างเคร่งครัด เมื่อเปิดใช้งาน การกำหนดเส้นทางแบบผสมจะเพิ่มพื้นที่สำรองสำหรับโมเดลการให้เหตุผลเฉพาะ
โมเดลที่ทราบขีดจำกัดเอาต์พุตเท่านั้น และจะคงขีดจำกัดโทเค็นของไคลเอ็นต์ไว้โดยไม่เปลี่ยนแปลง หากค่าที่บัฟเฟอร์ไว้อย่างปลอดภัย
จะเกินขีดจำกัดดังกล่าว หากขีดจำกัดของไคลเอ็นต์สูงกว่าขีดจำกัดที่ทราบอยู่แล้ว
OmniRoute จะลดค่าให้เท่ากับขีดจำกัดดังกล่าวก่อนส่งคำขอไปยังต้นทาง
---
### แดชบอร์ดสถานะระบบ
เข้าถึงผ่าน **แดชบอร์ด → สถานะระบบ** ภาพรวมสถานะระบบแบบเรียลไทม์ประกอบด้วยการ์ด 6 ใบ:
| การ์ด | สิ่งที่แสดง |
| ----------------------- | ------------------------------------------------------------------ |
| **สถานะระบบ** | ระยะเวลาทำงาน เวอร์ชัน การใช้หน่วยความจำ ไดเรกทอรีข้อมูล |
| **สถานะผู้ให้บริการ** | สถานะรันไทม์ของเซอร์กิตเบรกเกอร์ส่วนกลางสำหรับผู้ให้บริการ |
| **ขีดจำกัดอัตรา** | ช่วงพักการเชื่อมต่อที่มีผลอยู่ในแต่ละบัญชี พร้อมเวลาที่เหลือ |
| **การล็อกที่มีผลอยู่** | การล็อกเฉพาะโมเดลที่มีผลอยู่และการยกเว้นชั่วคราว |
| **แคชลายเซ็น** | สถิติแคชการขจัดข้อมูลซ้ำ (คีย์ที่ใช้งานอยู่ อัตราการพบข้อมูลในแคช) |
| **ข้อมูลการวัดเวลาแฝง** | การรวมค่าเวลาแฝง p50/p95/p99 แยกตามผู้ให้บริการ |
**เคล็ดลับระดับโปร:** หน้าสถานะระบบจะรีเฟรชอัตโนมัติทุก 10 วินาที ใช้การ์ดเซอร์กิตเบรกเกอร์เพื่อระบุว่าผู้ให้บริการรายใดกำลังประสบปัญหา
---
## 🤖 การกำหนดเส้นทางอัตโนมัติ (ไม่ต้องตั้งค่า)
OmniRoute มาพร้อมกับ **เราเตอร์อัตโนมัติที่ขับเคลื่อนด้วยคะแนน** ซึ่งเลือกโมเดลที่ดีที่สุดสำหรับแต่ละคำขอจากผู้ให้บริการที่เชื่อมต่อทั้งหมด โดยไม่ต้องดูแลคอมโบใดๆ เพียงส่งคำขอโดยใช้คำนำหน้า `auto/*` รายการใดรายการหนึ่ง แล้ว OmniRoute จะประกอบคอมโบเสมือนขึ้นทันที พร้อมให้คะแนนตัวเลือกโดยพิจารณาจากเวลาแฝง ต้นทุน อัตราความสำเร็จ ความเหมาะสมกับบริบท ความเหมาะสมของโมเดลต่องาน ความล้มเหลวล่าสุด โควตา และสถานะของเซอร์กิตเบรกเกอร์
| คำนำหน้า | ปรับให้เหมาะสมสำหรับ |
| -------------- | ---------------------------------------------------------------------------------------------------------- |
| `auto` | ค่าเริ่มต้นแบบสมดุล (เวลาแฝง × ต้นทุน × อัตราความสำเร็จ) |
| `auto/coding` | งานเขียนโค้ด: ให้ความสำคัญกับ Claude, GPT-5, GLM, Kimi, Qwen Coder และโมเดลเขียนโค้ดของ DeepSeek |
| `auto/cheap` | ราคาต่อโทเค็นต่ำที่สุด โดยยอมรับเวลาแฝงที่สูงขึ้น |
| `auto/fast` | เวลาแฝงต่ำที่สุด โดยไม่คำนึงถึงต้นทุน |
| `auto/offline` | ผู้ให้บริการภายในเครื่องเท่านั้น (Ollama, vLLM, llama.cpp) — มีประโยชน์สำหรับระบบที่ตัดขาดจากเครือข่าย |
| `auto/smart` | ให้ความสำคัญกับคุณภาพการให้เหตุผลเป็นอันดับแรก (Opus, GPT-5 xhigh, R1, การให้เหตุผลของ GLM 5.1) |
| `auto/lkgp` | "ผู้ให้บริการล่าสุดที่ใช้งานได้" — ตรึงไว้กับผู้ให้บริการรายล่าสุดที่ทำงานสำเร็จ จากนั้นจึงย้อนกลับไปใช้กฎ |
ตัวอย่าง:
```bash
curl -X POST http://localhost:20128/v1/chat/completions \
-H "Authorization: Bearer $OMNIROUTE_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "auto/coding",
"messages": [{ "role": "user", "content": "ปรับโครงสร้างฟังก์ชัน Python นี้" }],
"stream": true
}'
```
เราเตอร์อัตโนมัติมีคำอธิบายฉบับสมบูรณ์อยู่ใน [AUTO-COMBO.md](../routing/AUTO-COMBO.md) ซึ่งรวมถึงวิธีปรับแต่งค่าน้ำหนักการให้คะแนน ขึ้นบัญชีดำผู้ให้บริการ และตรวจสอบการตัดสินใจกำหนดเส้นทางใน **แดชบอร์ด → คอมโบอัตโนมัติ**
---
## 🔌 การผสานรวม MCP และ A2A
OmniRoute เป็นทั้ง **เซิร์ฟเวอร์ MCP** (Model Context Protocol) และ **เซิร์ฟเวอร์ A2A** (Agent-to-Agent JSON-RPC 2.0) IDE หรือโฮสต์เอเจนต์ใดๆ ที่รองรับ MCP สามารถเรียกใช้เครื่องมือของ OmniRoute ได้โดยตรง โดยไม่ต้องมีแรปเปอร์เพิ่มเติม
### การรับส่งข้อมูลของ MCP
- **SSE**: `http://localhost:20128/api/mcp/sse`
- **HTTP แบบสตรีมได้**: `http://localhost:20128/api/mcp/stream`
- **stdio**: `omniroute --mcp` (สำหรับปลั๊กอิน IDE ที่ต้องการใช้ stdio)
### เชื่อมต่อ Claude Desktop
แก้ไข `~/Library/Application Support/Claude/claude_desktop_config.json` (macOS) หรือไฟล์ที่เทียบเท่ากันบน Windows/Linux:
```json
{
"mcpServers": {
"omniroute": {
"command": "omniroute",
"args": ["--mcp"]
}
}
}
```
### เชื่อมต่อ Cursor / Continue / VS Code MCP
ใช้ URL ของ SSE `http://localhost:20128/api/mcp/sse` และคีย์ Bearer API ที่สร้างใน **แดชบอร์ด → คีย์ API**
### ขอบเขตสิทธิ์
ปัจจุบัน MCP กำหนดขอบเขตสิทธิ์ที่มีชื่อไว้ 32 รายการ โดยคีย์ Bearer แต่ละคีย์สามารถจำกัดให้ใช้เฉพาะขอบเขตสิทธิ์ที่กำหนดได้ — ดูรายการขอบเขตสิทธิ์และเครื่องมือที่เป็นแหล่งอ้างอิงหลักได้ใน [MCP-SERVER.md](../frameworks/MCP-SERVER.md) และดูสคีมา JSON-RPC ได้ใน [A2A-SERVER.md](../frameworks/A2A-SERVER.md)
---
## 🧠 ระบบทักษะ
OmniRoute มี **เฟรมเวิร์กทักษะ** ที่ขยายความสามารถได้ (`src/lib/skills/`) เพื่อให้เอเจนต์และปลายทาง A2A สามารถเรียกใช้รูทีนเฉพาะด้านได้ (เช่น `code-review`, `summarize`, `extract-facts`, `web-research`)
- **UI มาร์เก็ตเพลส** — เรียกดูและติดตั้งทักษะจาก **แดชบอร์ด → ทักษะ**
- **ขอบเขตต่อคีย์** — จำกัดว่า API key ใดสามารถเรียกใช้ทักษะใดได้บ้าง
- **ทักษะแบบกำหนดเอง** — วางไฟล์ TypeScript ใน `src/lib/a2a/skills/` ลงทะเบียนไฟล์ดังกล่าว แล้วทักษะนั้นจะพร้อมให้เรียกใช้ผ่าน A2A ได้ทันที
เอกสารอ้างอิงฉบับเต็ม: [SKILLS.md](../frameworks/SKILLS.md)
---
## 💾 ระบบหน่วยความจำ
OmniRoute จัดเก็บ **หน่วยความจำการสนทนาระยะยาว** พร้อมการค้นคืนแบบไฮบริด:
- **SQLite FTS5** สำหรับค้นหาด้วยคีย์เวิร์ดจากบทสนทนาที่ผ่านมา
- **ที่เก็บเวกเตอร์ Qdrant** (ไม่บังคับ) สำหรับเรียกคืนข้อมูลตามความหมาย
- **การสกัดข้อเท็จจริงอัตโนมัติ** — เอนทิตี ความชอบ และการตัดสินใจจะถูกสรุปหลังจากแต่ละเซสชันและจัดเก็บไว้ในตาราง `memory_facts`
- หน่วยความจำจะถูกแยกขอบเขตตาม API key และตามเซสชัน
จัดการหน่วยความจำได้ใน **แดชบอร์ด → หน่วยความจำ** (ค้นหา แก้ไข ส่งออก ล้างข้อมูล) อินเทอร์เฟซ HTTP (`/api/memory/*`) ช่วยให้เอเจนต์ส่งและค้นหาข้อเท็จจริงผ่านโปรแกรมได้ — ดู [MEMORY.md](../frameworks/MEMORY.md)
---
## 🔔 Webhook
สมัครรับเหตุการณ์จาก OmniRoute เพื่อการตรวจสอบและระบบอัตโนมัติแบบเรียลไทม์
- สร้าง webhook ใน **แดชบอร์ด → Webhook** พร้อม URL ปลายทางและข้อมูลลับสำหรับการลงนาม HMAC
- เหตุการณ์ที่พร้อมใช้งาน: `request.completed`, `request.failed`, `provider.unavailable`, `budget.exceeded`, `combo.switched`, `circuit_breaker.opened`, `circuit_breaker.closed`
- ทุกเพย์โหลดมี `X-OmniRoute-Signature` (HMAC-SHA256) สำหรับการตรวจสอบความถูกต้อง
- การลองใหม่: 3 ครั้งโดยเพิ่มระยะเวลารอแบบทวีคูณ จากนั้นส่งไปยังคิวข้อความที่ไม่สามารถประมวลผลได้
สคีมาฉบับเต็มอยู่ใน [WEBHOOKS.md](../frameworks/WEBHOOKS.md)
---
## ☁️ เอเจนต์บนคลาวด์
OmniRoute ทำงานร่วมกับเอเจนต์เขียนโค้ดบนคลาวด์ (**OpenAI Codex Cloud**, **Devin**, **Jules**, **Antigravity**) เพื่อให้คุณสามารถมอบหมายงานที่ใช้เวลานานจากแดชบอร์ดเดียวกับที่ใช้จัดการการกำหนดเส้นทางภายในเครื่องได้
- สร้างงานใน **แดชบอร์ด → เอเจนต์บนคลาวด์** หรือผ่าน `POST /api/v1/agents/tasks`
- ติดตามสถานะ บันทึก และอาร์ติแฟกต์ของแต่ละงาน
- ใช้ API key ของคุณเองสำหรับผู้ให้บริการแต่ละราย — ข้อมูลประจำตัวจะไม่ออกจากอินสแตนซ์ OmniRoute
เอกสารอ้างอิงฉบับเต็ม: [CLOUD_AGENT.md](../frameworks/CLOUD_AGENT.md)
---
## 🛠️ การจัดการผ่านโปรแกรม
คุณสามารถจัดการทรัพยากรทั้งหมดของ OmniRoute (ผู้ให้บริการ คอมโบ คีย์ และการตั้งค่า) ผ่าน HTTP โดยใช้ **Bearer key ที่มีขอบเขต `manage`**
สร้างคีย์ใน **แดชบอร์ด → API Key → คีย์ใหม่ → ขอบเขต: manage** จากนั้น:
```bash
# แสดงรายการผู้ให้บริการ
curl http://localhost:20128/api/providers \
-H "Authorization: Bearer $OMNIROUTE_MANAGE_KEY"
# เพิ่มการเชื่อมต่อผู้ให้บริการ
curl -X POST http://localhost:20128/api/providers \
-H "Authorization: Bearer $OMNIROUTE_MANAGE_KEY" \
-H "Content-Type: application/json" \
-d '{ "provider": "openai", "apiKey": "sk-...", "name": "main" }'
# สร้างคอมโบ
curl -X POST http://localhost:20128/api/combos \
-H "Authorization: Bearer $OMNIROUTE_MANAGE_KEY" \
-H "Content-Type: application/json" \
-d '{ "name": "premium", "strategy": "priority", "models": [{ "model": "cc/claude-opus-4-7" }, { "model": "glm/glm-5.1" }] }'
# แสดงรายการ/สร้าง API key
curl http://localhost:20128/api/keys -H "Authorization: Bearer $OMNIROUTE_MANAGE_KEY"
curl -X POST http://localhost:20128/api/keys -H "Authorization: Bearer $OMNIROUTE_MANAGE_KEY" \
-d '{ "name": "ci-bot", "scopes": ["chat"] }'
```
ดูแค็ตตาล็อกปลายทางและสคีมาคำขอ/การตอบกลับทั้งหมดได้ใน [API_REFERENCE.md](../reference/API_REFERENCE.md)
---
## 💻 CLI ภายใน
OmniRoute มาพร้อม CLI ภายใน (`omniroute …`) สำหรับการตั้งค่า การวินิจฉัย และการควบคุมขณะรันไทม์ ซึ่ง **แยกจากหน้า "CLI Tools" ในแดชบอร์ด** ที่ใช้กำหนดค่า CLI ของบุคคลที่สาม (Claude Code, Cursor, Codex, Cline, …) เพื่อให้สามารถสื่อสารกับ OmniRoute ได้
```bash
omniroute setup # วิซาร์ดแบบโต้ตอบ (รหัสผ่าน ผู้ให้บริการ คอมโบ)
omniroute setup --non-interactive # เหมาะสำหรับ CI
omniroute doctor # การวินิจฉัยสถานะ (ไดเรกทอรีข้อมูล, DB, ผู้ให้บริการ, พอร์ต)
omniroute providers available # แสดงรายการผู้ให้บริการที่รองรับ
omniroute providers list # แสดงรายการการเชื่อมต่อที่กำหนดค่าไว้
omniroute providers test # ทดสอบการเชื่อมต่อผู้ให้บริการแบบสด
omniroute combos list # แสดงรายการคอมโบ
omniroute combos switch # ตั้งค่าคอมโบเริ่มต้น
omniroute models # แสดงรายการโมเดลที่พร้อมใช้งาน (--json, --search)
omniroute keys add | list | remove # จัดการคีย์ API จากเทอร์มินัล
omniroute backup # สร้างสแนปช็อตการกำหนดค่า + DB
omniroute restore [] # กู้คืนจากสแนปช็อต
omniroute health # สถานะโดยละเอียด (เบรกเกอร์, แคช, หน่วยความจำ)
omniroute quota # การใช้โควตาของผู้ให้บริการ
omniroute mcp status # สถานะเซิร์ฟเวอร์ MCP
omniroute a2a status # สถานะเซิร์ฟเวอร์ A2A
omniroute tunnel list|create|stop # ทันเนล Cloudflare/Tailscale/ngrok
omniroute reset-password # รีเซ็ตรหัสผ่านผู้ดูแลระบบ
omniroute --mcp # เริ่มเซิร์ฟเวอร์ MCP ผ่าน stdio
omniroute --port 3000 # เริ่มเซิร์ฟเวอร์บนพอร์ตที่กำหนดเอง
```
เคล็ดลับ: ใช้ `omniroute doctor --json` ร่วมกับเครื่องมือตรวจสอบของคุณเพื่อแจ้งเตือนเมื่อการเชื่อมต่อผู้ให้บริการมีปัญหา
---
## 🖥️ แอปพลิเคชันเดสก์ท็อป (Electron)
OmniRoute มีให้ใช้งานเป็นแอปพลิเคชันเดสก์ท็อปแบบเนทีฟสำหรับ Windows, macOS และ Linux
### การติดตั้ง
```bash
# จากไดเรกทอรี electron:
cd electron
npm install
# โหมดการพัฒนา (เชื่อมต่อกับเซิร์ฟเวอร์สำหรับการพัฒนา Next.js ที่กำลังทำงานอยู่):
npm run dev
# โหมดโปรดักชัน (ใช้บิลด์แบบสแตนด์อโลน):
npm start
```
### การสร้างตัวติดตั้ง
```bash
cd electron
npm run build # แพลตฟอร์มปัจจุบัน
npm run build:win # Windows (.exe NSIS)
npm run build:mac # macOS (.dmg universal)
npm run build:linux # Linux (.AppImage)
```
เอาต์พุต → `electron/dist-electron/`
### คุณสมบัติหลัก
| คุณสมบัติ | คำอธิบาย |
| ------------------------------- | ------------------------------------------------------------------- |
| **ความพร้อมของเซิร์ฟเวอร์** | ตรวจสอบเซิร์ฟเวอร์เป็นระยะก่อนแสดงหน้าต่าง (ไม่มีหน้าจอว่าง) |
| **ถาดระบบ** | ย่อไปยังถาดระบบ เปลี่ยนพอร์ต และออกจากเมนูถาดระบบ |
| **การจัดการพอร์ต** | เปลี่ยนพอร์ตเซิร์ฟเวอร์จากถาดระบบ (รีสตาร์ตเซิร์ฟเวอร์โดยอัตโนมัติ) |
| **นโยบายความปลอดภัยของเนื้อหา** | CSP แบบเข้มงวดผ่านส่วนหัวเซสชัน |
| **อินสแตนซ์เดียว** | สามารถเรียกใช้แอปได้ครั้งละหนึ่งอินสแตนซ์เท่านั้น |
| **โหมดออฟไลน์** | เซิร์ฟเวอร์ Next.js ที่รวมมาด้วยสามารถทำงานได้โดยไม่ใช้อินเทอร์เน็ต |
### ตัวแปรสภาพแวดล้อม
| ตัวแปร | ค่าเริ่มต้น | คำอธิบาย |
| --------------------- | ----------- | ------------------------------------ |
| `OMNIROUTE_PORT` | `20128` | พอร์ตเซิร์ฟเวอร์ |
| `OMNIROUTE_MEMORY_MB` | `512` | ขีดจำกัดฮีปของ Node.js (64–16384 MB) |
📖 เอกสารฉบับเต็ม: [`electron/README.md`](../../electron/README.md)