* feat(devin-desktop): replace public Windsurf provider * fix(migrations): renumber Devin Desktop migration to 151 (avoid 147 collision) 147_windsurf_to_devin_desktop.sql collided with the released 147_api_keys_model_access_mode.sql — getMigrationFiles throws "Migration version collision detected" on every DB start. Base occupies slots up to 150, so renumber the new migration to 151 and point the windsurf→devin RENAMED_MIGRATION_COMPATIBILITY entries (and tests) at it. 147 is freed in KNOWN_GAPS since 147_api_keys now owns the slot. Co-authored-by: diegosouzapw <8016841+diegosouzapw@users.noreply.github.com> --------- Co-authored-by: diegosouzapw <8016841+diegosouzapw@users.noreply.github.com>
32 KiB
title, version, lastUpdated
| title | version | lastUpdated |
|---|---|---|
| Rozwiązywanie problemów | 3.8.49 | 2026-07-15 |
Rozwiązywanie problemów
Dla użytkowników: Szukasz szybkich poprawek? Zobacz Szybki przewodnik poniżej.
🌐 Languages: 🇺🇸 English | 🇧🇷 Português (Brasil) | 🇪🇸 Español | 🇫🇷 Français | 🇮🇹 Italiano | 🇷🇺 Русский | 🇨🇳 中文 (简体) | 🇩🇪 Deutsch | 🇮🇳 हिन्दी | 🇹🇭 ไทย | 🇺🇦 Українська | 🇸🇦 العربية | 🇯🇵 日本語 | 🇻🇳 Tiếng Việt | 🇧🇬 Български | 🇩🇰 Dansk | 🇫🇮 Suomi | 🇮🇱 עברית | 🇭🇺 Magyar | 🇮🇩 Bahasa Indonesia | 🇰🇷 한국어 | 🇲🇾 Bahasa Melayu | 🇳🇱 Nederlands | 🇳🇴 Norsk | 🇵🇹 Português (Portugal) | 🇷🇴 Română | 🇵🇱 Polski | 🇸🇰 Slovenčina | 🇸🇪 Svenska | 🇵🇭 Filipino | 🇨🇿 Čeština
Typowe problemy i rozwiązania dla OmniRoute.
Szybki przewodnik
Nowy w OmniRoute? Zacznij tutaj — te wskazówki rozwiązują 90% problemów:
| Widzę to | Co to oznacza | Co zrobić |
|---|---|---|
| "Can't connect" | OmniRoute nie działa | Uruchom omniroute lub docker restart omniroute |
| "Invalid API key" | Klucz jest błędny lub wygasł | Skopiuj ponownie klucz ze strony providera |
| "Rate limit exceeded" | Wysyłasz zbyt wiele żądań | Poczekaj 1 minutę albo użyj model: "auto" do automatycznego fallbacku |
| "Quota exceeded" | Wykorzystałeś darmowy/płatny limit | Podłącz więcej providerów albo użyj darmowych (Kiro, Pollinations) |
| "Slow responses" | Provider jest obciążony lub daleko | Użyj model: "auto/fast" albo podłącz szybszego providera (Groq, Cerebras) |
| "Wrong provider used" | auto wybrał innego providera |
To normalne! auto wybiera najlepszy. Wymuś providera przez model: "openai/gpt-4o" |
| "502 Bad Gateway" | Provider nie działa | Poczekaj i spróbuj ponownie albo użyj model: "auto", by przełączyć providera |
| "401 Unauthorized" | Błędne poświadczenia | Sprawdź klucz API albo ponownie uwierzytelnij się przez OAuth |
| "429 Too Many Requests" | Limit zapytań | Poczekaj 1 minutę albo podłącz więcej providerów |
Nadal utknąłeś? Zobacz szczegółowe rozwiązywanie problemów poniżej albo zapytaj na Discord.
Szczegółowe rozwiązywanie problemów
Szybkie poprawki
| Problem | Rozwiązanie |
|---|---|
| Pierwsze logowanie nie działa | Ustaw INITIAL_PASSWORD w .env (brak wbudowanego domyślnego hasła) |
| Dashboard otwiera się na złym porcie | Ustaw PORT=20128 i NEXT_PUBLIC_BASE_URL=http://localhost:20128 |
| Brak logów na dysku | Ustaw APP_LOG_TO_FILE=true i sprawdź, czy przechwytywanie call logów jest włączone |
| EACCES: permission denied | Ustaw DATA_DIR=/path/to/writable/dir, by nadpisać ~/.omniroute |
| Strategia routingu się nie zapisuje | Zaktualizuj do najnowszej wersji v3.x (poprawka schematu Zod dla trwałości ustawień była w wcześniejszych wersjach) |
| Crash logowania / pusta strona | Sprawdź wersję Node.js — zobacz Kompatybilność Node.js poniżej |
dlopen / slice is not valid mach-o file (macOS) |
Uruchom cd $(npm root -g)/omniroute/app && npm rebuild better-sqlite3 && omniroute — zobacz przebudowa natywnego modułu na macOS poniżej |
| Proxy "fetch failed" | Upewnij się, że konfiguracja proxy jest na właściwym poziomie — zobacz Problemy z proxy poniżej |
Docker curl: (56) Recv failure: Connection reset by peer |
Bindowanie portu Dockera może lądować na IPv6. Użyj -p 127.0.0.1:20128:20128, by wymusić IPv4, albo przetestuj curl -4. Zobacz Docker IPv6 poniżej |
Antywirus kwarantannuje README.md |
Fałszywy alarm — zobacz Fałszywe alarmy antywirusa poniżej |
| Kaspersky oznacza aplikację Desktop jako Trojan | Behawioralny fałszywy alarm na niepodpisanym instalatorze — zobacz Fałszywe alarmy antywirusa poniżej |
Fałszywe alarmy antywirusa
Avast/AVG kwarantannuje README.md z MD:HttpRequest-inf[Susp]
To fałszywy alarm. Nic nie jest zainfekowane i nie trzeba nic robić.
Avast i AVG używają heurystyki, która oznacza pliki plain-text/Markdown zawierające wiele
linków wyglądających jak żądania HTTP. README.md OmniRoute jest w paczce npm (jest
wymieniony w package.json → files), więc ląduje w node_modules/omniroute/README.md przy
instalacji globalnej — i zawiera ok. 15 przykładów http://localhost:20128/... (endpointy MCP
HTTP/SSE, URL A2A .well-known oraz snippety curl). Taka gęstość linków wystarcza,
by uruchomić heurystykę.
Jeśli zaczęło się dopiero niedawno: plik nie zmienił się jakościowo. README rozrosło się o
tabelę endpointów (dodano MCP HTTP + SSE + A2A) i więcej przykładów curl, co przekroczyło
próg.
Plik to bierna dokumentacja bez żadnej wykonywalnej treści. Możesz bezpiecznie przywrócić go z kwarantanny.
Co zrobić:
- Zatrzymaj powiadomienia — wyklucz katalog instalacji w antywirusie
(Avast: Settings → Exceptions), dodając globalną ścieżkę
node_modulesi/lub katalog danych OmniRoute (~/.omniroute/). - Zgłoś fałszywy alarm — https://www.avast.com/false-positive-file-form.php,
dołączając skwarantannowany
README.md. To poprawka, która pomaga wszystkim, bo to heurystyka producenta nadmiernie reaguje na plik tekstowy.
Dlaczego nie „naprawiamy” tego po naszej stronie: przykłady to wyłącznie http://localhost, a
localhost nie może być https bez tarcia z self-signed certificate. Przekręcanie dokumentacji, by
obejść heurystykę jednego producenta, zaszkodziłoby każdemu czytelnikowi przez błąd skanera.
Kaspersky oznacza aplikację Desktop jako PDM:Trojan.Win32.Generic
To fałszywy alarm z heurystyki behawioralnej. Nic nie jest zainfekowane. Prefiks
PDM: u Kaspersky oznacza werdykt z Proactive Defense Module (System Watcher),
który ocenia, co robi instalator, a nie dopasowuje go do znanego malware. Gdy
się uruchomi, Kaspersky „cofa” całą instalację — usuwa pliki, które już
zapisał — więc aplikacja kończy uszkodzona lub znika.
Pliki, które oznacza, to standardowe części zadeklarowanych, open-source zależności spakowanych z aplikacją desktop, na przykład:
resources/app/.build/next/node_modules/playwright-<hash>/lib/…/agentParser.jsorazworkerProcessEntry.js— Playwright, biblioteka automatyzacji przeglądarki używana do logowania providera w aplikacji i chatu opartego o przeglądarkę.resources/app/.build/next/node_modules/tls-client-node-<hash>/bin/tls-client-windows-64-<ver>.dll— natywny binarium ztls-client-node, używane do HTTP tolerancyjnego na Cloudflare u części providerów web.
Dlaczego się odpala: instalator Windows nie jest jeszcze podpisany kodem, więc niepodpisany
instalator NSIS ma zerową reputację, a heurystyki behawioralne działają na maksymalnej agresji. W połączeniu
z dołączonym natywnym DLL i setkami plików .js zapisywanych pod
%LOCALAPPDATA%\Programs\OmniRoute (w tym katalogi paczek z sufiksem hasha z
buildu standalone Next.js) to wystarcza, by uruchomić heurystykę. Podpis kodu jest planowany;
dopóki nie wyląduje, nowe wydania mogą to powtarzać.
Co zrobić:
- Najpierw zweryfikuj pobranie (wyklucza spreparowany plik). Każde wydanie publikuje
latest.yml, którego polesha512(base64) obejmuje instalatorOmniRoute.Setup.<version>.exe. W PowerShell, z folderu z instalatorem:Wynik musi pasować do$b = [System.Security.Cryptography.SHA512]::Create().ComputeHash( [System.IO.File]::ReadAllBytes("$PWD\OmniRoute.Setup.<version>.exe")) [Convert]::ToBase64String($b)latest.yml→sha512. Jeśli nie, usuń plik i pobierz ponownie wyłącznie ze strony wydań GitHub. - Przywróć + wyklucz — przywróć cofnięte elementy z kwarantanny i dodaj wykluczenie
dla
%LOCALAPPDATA%\Programs\OmniRoute(Kaspersky → Settings → Threats and Exclusions), potem zainstaluj ponownie. - Zgłoś fałszywy alarm — https://opentip.kaspersky.com/. Zgłoszenia FP od użytkowników realnie przyspieszają allowlisting.
Kompatybilność Node.js
Strona logowania się crashuje albo pokazuje błąd "Module self-registration"
Przyczyna: Uruchamiasz wersję Node.js poza zatwierdzonym bezpiecznym progiem runtime OmniRoute. Najczęstszy przypadek to starszy patch Node 22 lub 24 poniżej wymaganego przez OmniRoute zabezpieczonego progu.
Objawy:
- Strona logowania pokazuje pusty ekran albo błąd serwera
- Konsola pokazuje
Error: Module did not self-registerlub podobne błędy natywnych bindingów - Strona logowania pokazuje pomarańczowy baner ostrzegawczy z Twoją wersją Node, jeśli runtime jest poza wspieraną bezpieczną polityką
Naprawa:
- Zainstaluj wspieraną wersję Node.js LTS (zalecane: Node.js 24.x):
nvm install 24 nvm use 24 - Sprawdź wersję:
node --versionpowinno pokazaćv24.0.0lub nowszą na linii LTS 24.x - Zainstaluj ponownie OmniRoute:
npm install -g omniroute - Uruchom ponownie:
omniroute
Wspierane bezpieczne wersje:
>=22.22.2 <23lub>=24.0.0 <27. Node.js 24.x LTS (Krypton) i Node.js 26 są w pełni wspierane.
macOS: dlopen / "slice is not valid mach-o file"
Przyczyna: Po globalnym npm install -g omniroute natywne binarium better-sqlite3 w paczce mogło zostać skompilowane pod inną architekturę lub ABI Node.js niż lokalnie uruchomione. To częste na macOS (Apple Silicon i Intel), gdy prebuilt nie pasuje do środowiska.
Objawy:
- Serwer pada od razu przy starcie z błędem
dlopen - Błąd zawiera
slice is not valid mach-o file - Pełny przykład:
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)
Naprawa — przebuduj pod lokalne środowisko (bez obniżania Node.js):
cd $(npm root -g)/omniroute/app
npm rebuild better-sqlite3
omniroute
Uwaga: To rekompiluje natywny binding względem lokalnej wersji Node.js i architektury CPU, usuwając niedopasowanie binarium. Oficjalnie wspierany zakres runtime to
>=22.22.2 <23lub>=24.0.0 <27(SUPPORTED_NODE_RANGEwsrc/shared/utils/nodeRuntimeSupport.ts, zgodny z polemengineswpackage.json). Node.js 24.x LTS (Krypton) i Node.js 26 są w pełni wspierane zbetter-sqlite3v12.x.
Problemy z proxy
Walidacja providera pokazuje "fetch failed"
Przyczyna: Endpoint walidacji klucza API (POST /api/providers/validate) wcześniej omijał konfigurację proxy, co powodowało błędy w środowiskach wymagających routingu przez proxy.
Naprawa (v3.5.5+): To już naprawione. Walidacja providera idzie przez runWithProxyContext, automatycznie honorując proxy na poziomie providera i globalne.
Health check tokena kończy się "fetch failed"
Przyczyna: Tło odświeżania tokenów OAuth nie rozwiązywało konfiguracji proxy per połączenie.
Naprawa (v3.5.5+): Scheduler health check tokenów rozwiązuje teraz config proxy per połączenie przed odświeżeniem. Zaktualizuj do v3.5.5+.
Proxy SOCKS5 zwraca "invalid onRequestStart method"
Przyczyna: Na Node.js 22 dispatcher undici@8 jest niekompatybilny z wbudowanym fetch() w Node.
Naprawa (v3.5.5+): OmniRoute używa teraz własnego fetch() z undici, gdy aktywny jest dispatcher proxy, co daje spójne zachowanie. Zaktualizuj do v3.5.5+.
Proxy MITM pod WSL: aplikacje desktop na hoście Windows nie są przechwytywane
Przyczyna: Proxy MITM i jego certyfikat CA instalują się w środowisku, w którym działa OmniRoute. Pod WSL to gość Linux, a aplikacje AI desktop (Kiro, Trae, Copilot, Zed, …) działają na hoście Windows. Aplikacje hosta nie ufają magazynowi certyfikatów gościa i nie idą przez systemowe proxy gościa, więc przechwytywanie desktop tam nie działa.
Rekomendacja: Uruchamiaj OmniRoute natywnie na tym samym OS co aplikacje desktop, które chcesz przechwytywać (Windows dla aplikacji Windows; analogicznie macOS/Linux). Trzymanie OmniRoute w WSL przy celowaniu w aplikacje hosta wymaga ręcznego zaufania wygenerowanemu certyfikatowi CA na hoście Windows i wskazania ustawień sieci/proxy każdej aplikacji hosta na endpoint proxy WSL — to nieobsługiwana, krucha konfiguracja.
Problemy z providerami
"Language model did not provide messages"
Przyczyna: Wyczerpany limit (quota) providera.
Naprawa:
- Sprawdź tracker quota w dashboardzie
- Użyj combo z warstwami fallback
- Przełącz na tańszy/darmowy tier
Limitowanie zapytań (rate limiting)
Przyczyna: Wyczerpany limit subskrypcji.
Naprawa:
- Dodaj fallback:
cc/claude-opus-4-6 → glm/glm-4.7 → if/qwen3.8-max-preview - Użyj GLM/MiniMax jako taniego backupu
Wygasły token OAuth
OmniRoute automatycznie odświeża tokeny. Jeśli problemy trwają:
- Dashboard → Provider → Reconnect
- Usuń i dodaj ponownie połączenie providera
Kiro multi-account: drugie konto unieważnia pierwsze
Przyczyna: Backend Kiro wymusza jedną aktywną sesję na rejestrację klienta OIDC. Gdy dwa konta dzielą ten sam zarejestrowany klient (połączenia zaimportowane przed v3.8.0), odświeżenie tokena jednego konta unieważnia refresh token drugiego.
Naprawa (v3.8.0+): Zaimportuj ponownie dotknięte połączenia. Od v3.8.0 każde nowe połączenie Kiro utworzone przez Import Token, Google/GitHub social login albo Auto-Import automatycznie rejestruje własny dedykowany klient OIDC. Połączenie jest więc w pełni izolowane i odświeżenie jednego konta nie wpływa na żadne inne.
Połączenia zaimportowane przed v3.8.0 nie mają rejestracji klienta per połączenie. Nadal używają współdzielonego endpointu odświeżania social-auth. Aby uzyskać izolację, usuń stare połączenie z Dashboard → Providers i dodaj je ponownie przez którykolwiek z trzech flow importu.
Pełne szczegóły i instrukcja krok po kroku dodawania dwóch kont Kiro obok siebie:
docs/guides/KIRO_SETUP.md.
Problemy z chmurą
Błędy Cloud Sync
- Sprawdź, czy
BASE_URLwskazuje na działającą instancję (np.http://localhost:20128) - Sprawdź, czy
CLOUD_URLwskazuje na endpoint chmury (np.https://omniroute.dev) - Utrzymuj wartości
NEXT_PUBLIC_*zgodne z wartościami po stronie serwera
Cloud stream=false zwraca 500
Objaw: Unexpected token 'd'... na endpoincie chmury przy wywołaniach bez streamingu.
Przyczyna: Upstream zwraca payload SSE, a klient oczekuje JSON.
Obejście: Użyj stream=true przy bezpośrednich wywołaniach chmury. Lokalny runtime ma fallback SSE→JSON.
Chmura mówi Connected, ale "Invalid API key"
- Utwórz świeży klucz z lokalnego dashboardu (
/api/keys) - Uruchom cloud sync: Enable Cloud → Sync Now
- Stare/niesynchroniczne klucze nadal mogą zwracać
401w chmurze
Problemy z Dockerem
Docker IPv6 / Connection Reset
Objawy: curl http://localhost:20128/v1/models zwraca curl: (56) Recv failure: Connection reset by peer. Dashboard i endpointy bez auth działają, ale endpointy z auth padają — wygląda to jak problem z auth, ale nim nie jest.
Przyczyna: docker run -p 20128:20128 publikuje zarówno na 0.0.0.0 (IPv4), jak i :: (IPv6), ale proces w kontenerze nasłuchuje tylko na IPv4. Na hostach, gdzie localhost najpierw rozwiązuje się do ::1, połączenie ląduje na opublikowanym porcie IPv6 bez listenera → connection reset.
Naprawa:
- Szybka diagnostyka: Uruchom
curl -4 http://localhost:20128/v1/models. Jeśli działa z-4, a bez niego nie — masz niedopasowanie bindu IPv6. - Trwała poprawka: Wymuś IPv4 przez
-p 127.0.0.1:20128:20128wdocker run:To wymusza bind IPv4 i dodatkowo nie eksponuje proxy na wszystkich interfejsach hosta.docker run -d --name omniroute --restart unless-stopped --stop-timeout 40 \ -p 127.0.0.1:20128:20128 -v omniroute-data:/app/data diegosouzapw/omniroute:latest
Narzędzie CLI pokazuje Not Installed
- Sprawdź pola runtime:
curl http://localhost:20128/api/cli-tools/runtime/codex | jq - Tryb portable: użyj image target
runner-cli(bundlowane CLI) - Tryb host mount: ustaw
CLI_EXTRA_PATHSi zamontuj katalog bin hosta jako read-only - Jeśli
installed=trueirunnable=false: binarium znaleziono, ale healthcheck nie przeszedł
Szybka walidacja runtime
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}'
Problemy z kosztami
Wysokie koszty
- Sprawdź statystyki użycia w Dashboard → Usage
- Przełącz model primary na GLM/MiniMax
- Używaj darmowego tieru (Qoder, Kiro) do zadań niekrytycznych
- Ustaw budżety kosztów per klucz API: Dashboard → API Keys → Budget
Debugowanie
Włącz pliki logów
Ustaw APP_LOG_TO_FILE=true w pliku .env. Logi aplikacji trafiają do logs/.
Artefakty żądań są przechowywane w ${DATA_DIR}/call_logs/, gdy pipeline call logów jest
włączony w ustawieniach.
Gdy przechwytywanie pipeline jest włączone, ustaw CALL_LOG_PIPELINE_CAPTURE_STREAM_CHUNKS=false, by pominąć
payloady chunków streamu, albo dostroić CALL_LOG_PIPELINE_MAX_SIZE_KB, by zmienić limit artefaktów w KB.
Sprawdź health providera
# Health dashboard
http://localhost:20128/dashboard/health
# API health check
curl http://localhost:20128/api/monitoring/health
Przechowywanie runtime
- Stan główny:
${DATA_DIR}/storage.sqlite(providerzy, combo, aliasy, klucze, ustawienia) - Użycie: tabele SQLite w
storage.sqlite(usage_history,call_logs,proxy_logs) + opcjonalnie${DATA_DIR}/call_logs/ - Logi aplikacji:
<repo>/logs/...(gdyAPP_LOG_TO_FILE=true) - Artefakty call logów:
${DATA_DIR}/call_logs/YYYY-MM-DD/..., gdy pipeline call logów jest włączony
Akcja Clean history na stronie Request Logs czyści call_logs, legacy
request_detail_logs oraz lokalny katalog artefaktów ${DATA_DIR}/call_logs/.
Problemy z circuit breakerem
Provider utknął w stanie OPEN
Gdy circuit breaker providera jest OPEN, żądania są blokowane do wygaśnięcia cooldownu.
Naprawa:
- Idź do Dashboard → Settings → Resilience
- Sprawdź kartę circuit breakera dla dotkniętego providera
- Kliknij Reset All, by wyczyścić wszystkie breakery, albo poczekaj na wygaśnięcie cooldownu
- Przed resetem upewnij się, że provider faktycznie jest dostępny
Provider wciąż wyzwala circuit breaker
Jeśli provider wielokrotnie wchodzi w stan OPEN:
- Sprawdź Dashboard → Health → Provider Health pod kątem wzorca błędów
- Idź do Settings → Resilience → Provider Profiles i podnieś próg awarii
- Sprawdź, czy provider zmienił limity API albo wymaga ponownej autentykacji
- Przejrzyj telemetrię latency — wysoka latency może dawać błędy timeout
Problemy z transkrypcją audio
Błąd "Unsupported model"
- Upewnij się, że używasz właściwego prefiksu:
deepgram/nova-3lubassemblyai/best - Sprawdź, czy provider jest podłączony w Dashboard → Providers
Transkrypcja zwraca pusto albo pada
- Sprawdź wspierane formaty audio:
mp3,wav,m4a,flac,ogg,webm - Sprawdź, czy rozmiar pliku mieści się w limitach providera (zwykle < 25MB)
- Sprawdź ważność klucza API na karcie providera
Debugowanie Translatora
Użyj Dashboard → Translator, by debugować problemy z tłumaczeniem formatów:
| Tryb | Kiedy używać |
|---|---|
| Playground | Porównaj formaty wejścia/wyjścia obok siebie — wklej padające żądanie, by zobaczyć tłumaczenie |
| Chat Tester | Wyślij live wiadomości i sprawdź pełny payload request/response wraz z nagłówkami |
| Test Bench | Uruchom testy batch po kombinacjach formatów, by znaleźć zepsute tłumaczenia |
| Live Monitor | Obserwuj przepływ żądań w czasie rzeczywistym, by złapać przerywane problemy z tłumaczeniem |
Typowe problemy z formatami
- Tagi thinking się nie pojawiają — Sprawdź, czy docelowy provider wspiera thinking i ustawienie thinking budget
- Tool calls znikają — Niektóre tłumaczenia formatów mogą obcinać nieobsługiwane pola; sprawdź w trybie Playground
- Brak system prompt — Claude i Gemini inaczej obsługują system prompt; sprawdź wynik tłumaczenia
- SDK zwraca surowy string zamiast obiektu — Rozwiązane w v1.x; sanitizer odpowiedzi usuwa niestandardowe pola (
x_groq,usage_breakdownitd.), które powodują błędy walidacji Pydantic w OpenAI SDK. Jeśli nadal to widzisz na v3.x+, zgłoś issue. - GLM/ERNIE odrzuca rolę
system— Rozwiązane w v1.x; normalizer ról automatycznie scala wiadomości system do user dla niekompatybilnych modeli. Jeśli nadal to widzisz na v3.x+, zgłoś issue. - Rola
developernierozpoznana — Rozwiązane w v1.x; automatycznie konwertowana nasystemdla providerów innych niż OpenAI. Jeśli nadal to widzisz na v3.x+, zgłoś issue. json_schemanie działa z Gemini — Rozwiązane w v1.x;response_formatjest teraz konwertowane naresponseMimeType+responseSchemaGemini. Jeśli nadal to widzisz na v3.x+, zgłoś issue.
Ustawienia Resilience
Auto rate-limit się nie uruchamia
- Auto rate-limit dotyczy tylko providerów z kluczem API (nie OAuth/subskrypcja)
- Sprawdź, czy w Settings → Resilience → Provider Profiles auto-rate-limit jest włączony
- Sprawdź, czy provider zwraca statusy
429lub nagłówkiRetry-After
Strojenie exponential backoff
Profile providerów wspierają te ustawienia:
- Base delay — Początkowy czas oczekiwania po pierwszej awarii (domyślnie: 1s)
- Max delay — Górny limit czasu oczekiwania (domyślnie: 30s)
- Multiplier — O ile rośnie opóźnienie przy kolejnych awariach (domyślnie: 2x)
Anti-thundering herd
Gdy wiele równoległych żądań trafia w rate-limitowanego providera, OmniRoute używa mutex + auto rate-limiting, by serializować żądania i zapobiec kaskadowym awariom. To automatyczne dla providerów z kluczem API.
Opcjonalna taksonomia awarii RAG / LLM (16 problemów)
Część użytkowników OmniRoute stawia gateway przed stackami RAG lub agentów. W takich setupach często widać dziwny wzorzec: OmniRoute wygląda na zdrowy (providerzy w górze, profile routingu OK, brak alertów rate limit), a końcowa odpowiedź i tak jest zła.
W praktyce te incydenty zwykle pochodzą z downstream pipeline RAG, a nie z samego gatewaya.
Jeśli chcesz wspólnego słownika do opisu tych awarii, możesz użyć WFGY ProblemMap — zewnętrznego zasobu tekstowego na licencji MIT, który definiuje szesnaście powtarzających się wzorców awarii RAG / LLM. Na wysokim poziomie obejmuje:
- drift retrieval i zepsute granice kontekstu
- puste lub nieaktualne indeksy i magazyny wektorowe
- niedopasowanie embedding vs semantyka
- składanie promptów i problemy z oknem kontekstu
- zapaść logiki i nadmiernie pewne odpowiedzi
- awarie długich łańcuchów i koordynacji agentów
- drift pamięci multi-agent i ról
- problemy z deploymentem i kolejnością bootstrapu
Idea jest prosta:
- Przy badaniu złej odpowiedzi zbierz:
- zadanie użytkownika i request
- route lub combo providera w OmniRoute
- kontekst RAG użyty downstream (pobrane dokumenty, tool calls itd.)
- Zmapuj incydent na jeden lub dwa numery WFGY ProblemMap (
No.1…No.16). - Zapisz numer we własnym dashboardzie, runbooku lub trackerze incydentów obok logów OmniRoute.
- Użyj odpowiadającej strony WFGY, by zdecydować, czy zmienić stack RAG, retriever, czy strategię routingu.
Pełny tekst i konkretne recepty są tutaj (licencja MIT, sam tekst):
Możesz pominąć tę sekcję, jeśli nie uruchamiasz pipeline’ów RAG ani agentów za OmniRoute.
Znane problemy v3.8.0
Problemy specyficzne dla wydania v3.8.0 i aktualne obejścia. Gdy poprawka wyląduje w późniejszym patchu, wpis zostanie zaktualizowany lub usunięty.
Awaria auth Devin CLI
Objawy:
- "Devin CLI not found" lub "auth failed" przy wywołaniu narzędzi opartych o Devin
- Sprawdzenie runtime CLI raportuje
installed=false
Przyczyny:
CLI_DEVIN_BINwskazuje na nieistniejącą ścieżkę- Devin CLI nie jest zainstalowany na hoście
Naprawa:
- Zainstaluj Devin CLI dla swojej platformy
- Ustaw
CLI_DEVIN_BIN=/usr/local/bin/devin(lub rzeczywistą ścieżkę) w.env - Zrestartuj OmniRoute i przetestuj ponownie z Dashboard → CLI Tools
Cooldown modelu utknął (ręczny reset)
Objawy:
- Model pozostaje na liście cooldown nawet po upływie czasu wygaśnięcia
- Żądania wciąż pomijają model w routingu combo mimo że timestamp jest w przeszłości
Ręczny reset:
- Dashboard: Settings → Model Cooldowns → kliknij Re-enable na dotkniętej karcie
- API:
DELETE /api/resilience/model-cooldownsz nagłówkami management auth
Połączenie providera Command Code pada z 403
Objawy:
- 403 przy teście połączenia providera Command Code
- Karta providera pokazuje "unauthorized" po świeżym dodaniu
Przyczyna: Flow OAuth nie dokończył się (callback nie dotarł albo token nie został zapisany).
Naprawa:
- Uruchom
omniroute providersz CLI, by ponownie odpalić flow OAuth, albo - Ponów OAuth z Dashboard → Providers → Command Code → Reconnect
ModelScope zwraca agresywne cooldowny 429
Objawy:
- Bardzo krótkie lub natychmiastowe cooldowny na ModelScope po małej serii żądań
- Routing combo pomija ModelScope wcześniej niż oczekiwano
Przyczyna: ModelScope emituje providero-specyficzne nagłówki Retry-After. v3.8.0 ma dedykowaną obsługę tych nagłówków, więc starsze wersje odczytują je jako ogólne wskazówki rate-limit.
Naprawa:
- Upewnij się, że jesteś na v3.8.0 lub nowszej
- Sprawdź, czy przełącznik
useUpstream429BreakerHintsjest włączony w Settings → Resilience
Brak OMNIROUTE_WS_BRIDGE_SECRET w produkcji
Objawy:
- 401 na każdym żądaniu mostu WebSocket Codex/Responses na zdalnym hoście produkcyjnym
- Handshake mostu WebSocket zamyka się zaraz po connect
Przyczyna: Brak zmiennej env OMNIROUTE_WS_BRIDGE_SECRET w środowisku produkcyjnym.
Naprawa:
- Wygeneruj losowy sekret:
openssl rand -hex 32 - Ustaw
OMNIROUTE_WS_BRIDGE_SECRET=<random-secret>w env serwera produkcyjnego (i każdego klienta łączącego się z mostem) - Zrestartuj OmniRoute
Responses API: tryb background zdegradowany do synchronicznego
Objawy:
- Logowane ostrzeżenie:
background mode degraded to synchronous - Żądanie z
background: truezwraca zwykłą synchroniczną odpowiedź zamiast handle joba background
Przyczyna: v3.8.0 celowo degraduje background: true w Responses API do wykonania synchronicznego z ostrzeżeniem. Pełne asynchroniczne tło to przyszła dostawa.
Naprawa:
- Dostosuj klienta, by wywoływał bez
background, albo - Poczekaj na późniejsze wydanie z pełnym trybem async background (śledź changelog)
Nadal utknąłeś?
- GitHub Issues: github.com/diegosouzapw/OmniRoute/issues
- Architektura: Zobacz
docs/architecture/ARCHITECTURE.mdpo szczegóły wewnętrzne - API Reference: Zobacz
docs/reference/API_REFERENCE.mdpo wszystkie endpointy - Health Dashboard: Sprawdź Dashboard → Health pod kątem statusu systemu na żywo
- Translator: Użyj Dashboard → Translator do debugowania problemów z formatami