v3.8.40 cycle integration → main. All test gates green (Unit/Integration/Coverage/Node-compat/Quality-Ratchet). The only red check, 'PR Test Policy', is the test-masking heuristic firing on the cumulative ~57-commit release diff (legitimate assert consolidations already reviewed per-PR — Gemini CLI removal #5246, retired GPT models #5280, provider catalog refreshes); overridden with --admin per the documented release-PR convention. CodeQL/SonarQube advisory scans non-blocking; #5278's code already passed CodeQL on main. Homologated on VPS 192.168.0.15 (v3.8.40 healthy).
18 KiB
Pemecahan Masalah (Bahasa Indonesia)
🌐 Languages: 🇺🇸 English · 🇸🇦 ar · 🇧🇬 bg · 🇧🇩 bn · 🇨🇿 cs · 🇩🇰 da · 🇩🇪 de · 🇪🇸 es · 🇮🇷 fa · 🇫🇮 fi · 🇫🇷 fr · 🇮🇳 gu · 🇮🇱 he · 🇮🇳 hi · 🇭🇺 hu · 🇮🇩 id · 🇮🇹 it · 🇯🇵 ja · 🇰🇷 ko · 🇮🇳 mr · 🇲🇾 ms · 🇳🇱 nl · 🇳🇴 no · 🇵🇭 phi · 🇵🇱 pl · 🇵🇹 pt · 🇧🇷 pt-BR · 🇷🇴 ro · 🇷🇺 ru · 🇸🇰 sk · 🇸🇪 sv · 🇰🇪 sw · 🇮🇳 ta · 🇮🇳 te · 🇹🇭 th · 🇹🇷 tr · 🇺🇦 uk-UA · 🇵🇰 ur · 🇻🇳 vi · 🇨🇳 zh-CN
Masalah umum dan solusinya untuk OmniRoute.
Perbaikan Cepat
| Masalah | Solusi |
|---|---|
| Login pertama tidak berfungsi | Atur INITIAL_PASSWORD di .env (tidak ada nilai default yang dikodekan langsung) |
| Dashboard terbuka di port yang salah | Atur PORT=20128 dan NEXT_PUBLIC_BASE_URL=http://localhost:20128 |
| Tidak ada log yang ditulis ke disk | Atur APP_LOG_TO_FILE=true dan pastikan pengambilan log panggilan diaktifkan |
| EACCES: permission denied | Atur DATA_DIR=/path/to/writable/dir untuk mengganti ~/.omniroute |
| Strategi routing tidak tersimpan | Perbarui ke v1.4.11+ (perbaikan skema Zod untuk persistensi pengaturan) |
| Login crash / halaman kosong | Periksa versi Node.js — lihat Kompatibilitas Node.js di bawah |
dlopen / slice is not valid mach-o file (macOS) |
Jalankan cd $(npm root -g)/omniroute/app && npm rebuild better-sqlite3 && omniroute — lihat Pembangunan ulang modul native macOS di bawah |
| Proxy "fetch failed" | Pastikan konfigurasi proxy diatur pada tingkat yang tepat — lihat Masalah Proxy di bawah |
Kompatibilitas Node.js
Halaman login crash atau menampilkan error "Module self-registration"
Penyebab: Anda menjalankan versi Node.js di luar batas runtime aman yang disetujui OmniRoute. Kasus paling umum adalah menjalankan Node 20, 22, atau 24 versi patch lama yang berada di bawah batas keamanan yang diperlukan OmniRoute.
Gejala:
- Halaman login menampilkan layar kosong atau error server
- Konsol menampilkan
Error: Module did not self-registeratau error binding native serupa - Halaman login menampilkan banner peringatan oranye dengan versi Node Anda jika runtime berada di luar kebijakan keamanan yang didukung
Solusi:
- Instal rilis Node.js LTS yang didukung (disarankan: Node.js 24.x):
nvm install 24 nvm use 24 - Verifikasi versi Anda:
node --versionseharusnya menampilkanv24.0.0atau lebih baru pada lini LTS 24.x - Instal ulang OmniRoute:
npm install -g omniroute - Mulai ulang:
omniroute
Versi aman yang didukung:
>=20.20.2 <21,>=22.22.2 <23, atau>=24.0.0 <25. Node.js 24.x LTS (Krypton) sepenuhnya didukung.
macOS: dlopen / "slice is not valid mach-o file"
Penyebab: Setelah npm install -g omniroute secara global, biner native better-sqlite3 di dalam paket mungkin telah dikompilasi untuk arsitektur atau ABI Node.js yang berbeda dari yang berjalan secara lokal. Hal ini umum terjadi di macOS (baik Apple Silicon maupun Intel) ketika biner yang sudah dibangun tidak cocok dengan lingkungan Anda.
Gejala:
- Server gagal langsung saat startup dengan error
dlopen - Error berisi
slice is not valid mach-o file - Contoh lengkap:
dlopen(/Users/<user>/.nvm/versions/node/v24.14.1/lib/node_modules/omniroute/app/node_modules/better-sqlite3/build/Release/better_sqlite3.node, 0x0001): tried: '...' (slice is not valid mach-o file)
Solusi — bangun ulang untuk lingkungan lokal Anda (tidak perlu downgrade Node.js):
cd $(npm root -g)/omniroute/app
npm rebuild better-sqlite3
omniroute
Catatan: Perintah ini mengompilasi ulang binding native terhadap versi Node.js dan arsitektur CPU lokal Anda, mengatasi ketidakcocokan biner. Rentang yang resmi didukung adalah
>=20.20.2 <21,>=22.22.2 <23, atau>=24.0.0 <25(kolomenginesdipackage.json). Node.js 24.x LTS (Krypton) sepenuhnya didukung denganbetter-sqlite3v12.x.
Masalah Proxy
Validasi penyedia menampilkan "fetch failed"
Penyebab: Endpoint validasi API key (POST /api/providers/validate) sebelumnya mengabaikan konfigurasi proxy, menyebabkan kegagalan di lingkungan yang memerlukan routing melalui proxy.
Solusi (v3.5.5+): Masalah ini sudah diperbaiki. Validasi penyedia sekarang melewati runWithProxyContext, mengikuti pengaturan proxy pada tingkat penyedia dan global secara otomatis.
Pemeriksaan kesehatan token gagal dengan "fetch failed"
Penyebab: Pembaruan token OAuth di latar belakang tidak menyelesaikan konfigurasi proxy per koneksi.
Solusi (v3.5.5+): Penjadwal pemeriksaan kesehatan token sekarang menyelesaikan konfigurasi proxy per koneksi sebelum mencoba pembaruan. Perbarui ke v3.5.5+.
Proxy SOCKS5 mengembalikan "invalid onRequestStart method"
Penyebab: Pada Node.js 22, dispatcher undici@8 tidak kompatibel dengan implementasi fetch() bawaan Node.
Solusi (v3.5.5+): OmniRoute sekarang menggunakan fungsi fetch() milik undici sendiri ketika dispatcher proxy aktif, memastikan perilaku yang konsisten. Perbarui ke v3.5.5+.
Masalah Penyedia
"Language model did not provide messages"
Penyebab: Kuota penyedia habis.
Solusi:
- Periksa pelacak kuota di dashboard
- Gunakan combo dengan tier fallback
- Beralih ke tier yang lebih murah/gratis
Pembatasan Laju (Rate Limiting)
Penyebab: Kuota langganan habis.
Solusi:
- Tambahkan fallback:
cc/claude-opus-4-6 → glm/glm-4.7 → if/kimi-k2-thinking - Gunakan GLM/MiniMax sebagai cadangan murah
Token OAuth Kedaluwarsa
OmniRoute memperbarui token secara otomatis. Jika masalah berlanjut:
- Dashboard → Penyedia → Sambungkan Ulang
- Hapus dan tambahkan ulang koneksi penyedia
Masalah Cloud
Error Sinkronisasi Cloud
- Pastikan
BASE_URLmengarah ke instans yang sedang berjalan (misalnya,http://localhost:20128) - Pastikan
CLOUD_URLmengarah ke endpoint cloud Anda (misalnya,https://omniroute.dev) - Jaga agar nilai
NEXT_PUBLIC_*selaras dengan nilai sisi server
Cloud stream=false Mengembalikan 500
Gejala: Unexpected token 'd'... pada endpoint cloud untuk panggilan non-streaming.
Penyebab: Upstream mengembalikan payload SSE sementara klien mengharapkan JSON.
Solusi Sementara: Gunakan stream=true untuk panggilan langsung ke cloud. Runtime lokal sudah menyertakan fallback SSE→JSON.
Cloud Menunjukkan Terhubung tetapi "Invalid API key"
- Buat kunci baru dari dashboard lokal (
/api/keys) - Jalankan sinkronisasi cloud: Aktifkan Cloud → Sinkronkan Sekarang
- Kunci lama/yang tidak tersinkronisasi masih dapat mengembalikan
401di cloud
Masalah Docker
Alat CLI Menampilkan Belum Terinstal
- Periksa kolom runtime:
curl http://localhost:20128/api/cli-tools/runtime/codex | jq - Untuk mode portabel: gunakan target image
runner-cli(CLI yang sudah dibundel) - Untuk mode mount host: atur
CLI_EXTRA_PATHSdan mount direktori bin host sebagai read-only - Jika
installed=truedanrunnable=false: biner ditemukan tetapi gagal healthcheck
Validasi Runtime Cepat
curl -s http://localhost:20128/api/cli-tools/codex-settings | jq '{installed,runnable,commandPath,runtimeMode,reason}'
curl -s http://localhost:20128/api/cli-tools/claude-settings | jq '{installed,runnable,commandPath,runtimeMode,reason}'
curl -s http://localhost:20128/api/cli-tools/openclaw-settings | jq '{installed,runnable,commandPath,runtimeMode,reason}'
Masalah Biaya
Biaya Tinggi
- Periksa statistik penggunaan di Dashboard → Penggunaan
- Beralih model utama ke GLM/MiniMax
- Atur anggaran biaya per API key: Dashboard → API Keys → Anggaran
Debugging
Aktifkan File Log
Atur APP_LOG_TO_FILE=true di file .env Anda. Log aplikasi ditulis di bawah logs/.
Artefak permintaan disimpan di bawah ${DATA_DIR}/call_logs/ ketika pipeline log panggilan
diaktifkan di pengaturan.
Periksa Kesehatan Penyedia
# Health dashboard
http://localhost:20128/dashboard/health
# API health check
curl http://localhost:20128/api/monitoring/health
Penyimpanan Runtime
- Status utama:
${DATA_DIR}/storage.sqlite(penyedia, combo, alias, kunci, pengaturan) - Penggunaan: tabel SQLite di
storage.sqlite(usage_history,call_logs,proxy_logs) + opsional${DATA_DIR}/call_logs/ - Log aplikasi:
<repo>/logs/...(ketikaAPP_LOG_TO_FILE=true) - Artefak log panggilan:
${DATA_DIR}/call_logs/YYYY-MM-DD/...ketika pipeline log panggilan diaktifkan
Masalah Circuit Breaker
Penyedia terjebak dalam status OPEN
Ketika circuit breaker penyedia dalam status OPEN, permintaan diblokir hingga cooldown berakhir.
Solusi:
- Buka Dashboard → Settings → Resilience
- Periksa kartu circuit breaker untuk penyedia yang terdampak
- Klik Reset All untuk menghapus semua breaker, atau tunggu hingga cooldown berakhir
- Pastikan penyedia benar-benar tersedia sebelum melakukan reset
Penyedia terus memicu circuit breaker
Jika penyedia berulang kali masuk ke status OPEN:
- Periksa Dashboard → Health → Provider Health untuk pola kegagalan
- Buka Settings → Resilience → Provider Profiles dan tingkatkan ambang batas kegagalan
- Periksa apakah penyedia telah mengubah batas API atau memerlukan autentikasi ulang
- Tinjau telemetri latensi — latensi tinggi dapat menyebabkan kegagalan berbasis timeout
Masalah Transkripsi Audio
Error "Unsupported model"
- Pastikan Anda menggunakan awalan yang tepat:
deepgram/nova-3atauassemblyai/best - Pastikan penyedia terhubung di Dashboard → Providers
Transkripsi mengembalikan hasil kosong atau gagal
- Periksa format audio yang didukung:
mp3,wav,m4a,flac,ogg,webm - Pastikan ukuran file berada dalam batas penyedia (biasanya < 25MB)
- Periksa validitas API key penyedia di kartu penyedia
Debugging Translator
Gunakan Dashboard → Translator untuk melakukan debug masalah terjemahan format:
| Mode | Kapan Digunakan |
|---|---|
| Playground | Bandingkan format input/output berdampingan — tempel permintaan yang gagal untuk melihat cara terjemahannya |
| Chat Tester | Kirim pesan langsung dan periksa payload permintaan/respons lengkap termasuk header |
| Test Bench | Jalankan pengujian batch di berbagai kombinasi format untuk menemukan terjemahan mana yang rusak |
| Live Monitor | Pantau aliran permintaan secara real-time untuk menangkap masalah terjemahan yang intermiten |
Masalah format yang umum
- Tag thinking tidak muncul — Periksa apakah penyedia target mendukung thinking dan pengaturan anggaran thinking
- Tool call hilang — Beberapa terjemahan format mungkin menghapus kolom yang tidak didukung; verifikasi di mode Playground
- System prompt hilang — Claude dan Gemini menangani system prompt secara berbeda; periksa output terjemahan
- SDK mengembalikan string mentah alih-alih objek — Diperbaiki di v1.1.0: sanitizer respons sekarang menghapus kolom non-standar (
x_groq,usage_breakdown, dll.) yang menyebabkan kegagalan validasi Pydantic SDK OpenAI - GLM/ERNIE menolak role
system— Diperbaiki di v1.1.0: normalizer role secara otomatis menggabungkan pesan sistem ke dalam pesan pengguna untuk model yang tidak kompatibel - Role
developertidak dikenali — Diperbaiki di v1.1.0: secara otomatis dikonversi kesystemuntuk penyedia non-OpenAI json_schematidak berfungsi dengan Gemini — Diperbaiki di v1.1.0:response_formatsekarang dikonversi keresponseMimeType+responseSchemamilik Gemini
Pengaturan Resiliensi
Auto rate-limit tidak terpicu
- Auto rate-limit hanya berlaku untuk penyedia dengan API key (bukan OAuth/langganan)
- Pastikan Settings → Resilience → Provider Profiles telah mengaktifkan auto rate-limit
- Periksa apakah penyedia mengembalikan kode status
429atau headerRetry-After
Menyetel exponential backoff
Profil penyedia mendukung pengaturan berikut:
- Base delay — Waktu tunggu awal setelah kegagalan pertama (default: 1s)
- Max delay — Batas maksimum waktu tunggu (default: 30s)
- Multiplier — Seberapa banyak penundaan ditingkatkan per kegagalan berturut-turut (default: 2x)
Anti-thundering herd
Ketika banyak permintaan bersamaan mengenai penyedia yang dibatasi lajunya, OmniRoute menggunakan mutex + auto rate-limiting untuk membuat serialisasi permintaan dan mencegah kegagalan berantai. Ini berjalan otomatis untuk penyedia dengan API key.
Taksonomi Kegagalan RAG / LLM Opsional (16 masalah)
Beberapa pengguna OmniRoute menempatkan gateway di depan tumpukan RAG atau agen. Dalam pengaturan tersebut, umum terjadi pola yang aneh: OmniRoute terlihat sehat (penyedia aktif, profil routing baik, tidak ada peringatan batas laju) tetapi jawaban akhir masih salah.
Dalam praktiknya, insiden ini biasanya berasal dari pipeline RAG downstream, bukan dari gateway itu sendiri.
Jika Anda menginginkan kosakata bersama untuk mendeskripsikan kegagalan tersebut, Anda dapat menggunakan WFGY ProblemMap, sebuah sumber daya teks berlisensi MIT eksternal yang mendefinisikan enam belas pola kegagalan RAG / LLM yang berulang. Secara garis besar, ini mencakup:
- pergeseran retrieval dan batas konteks yang rusak
- indeks dan vector store yang kosong atau sudah usang
- ketidakcocokan embedding versus semantik
- masalah perakitan prompt dan jendela konteks
- keruntuhan logika dan jawaban yang terlalu percaya diri
- kegagalan rantai panjang dan koordinasi agen
- memori multi-agen dan pergeseran peran
- masalah urutan deployment dan bootstrap
Idenya sederhana:
- Saat Anda menyelidiki respons yang buruk, kumpulkan:
- tugas pengguna dan permintaan
- route atau combo penyedia di OmniRoute
- konteks RAG apa pun yang digunakan di downstream (dokumen yang diambil, tool call, dll.)
- Petakan insiden ke satu atau dua nomor WFGY ProblemMap (
No.1…No.16). - Simpan nomornya di dashboard, runbook, atau pelacak insiden Anda sendiri di samping log OmniRoute.
- Gunakan halaman WFGY yang sesuai untuk memutuskan apakah Anda perlu mengubah tumpukan RAG, retriever, atau strategi routing Anda.
Teks lengkap dan resep konkret tersedia di sini (lisensi MIT, hanya teks):
Anda dapat mengabaikan bagian ini jika Anda tidak menjalankan pipeline RAG atau agen di belakang OmniRoute.
Masih Terjebak?
- GitHub Issues: github.com/diegosouzapw/OmniRoute/issues
- Arsitektur: Lihat
docs/architecture/ARCHITECTURE.mduntuk detail internal - Referensi API: Lihat
docs/reference/API_REFERENCE.mduntuk semua endpoint - Health Dashboard: Periksa Dashboard → Health untuk status sistem secara real-time
- Translator: Gunakan Dashboard → Translator untuk melakukan debug masalah format