* chore(release): open v3.8.45 development cycle
* chore(release): parallel-cycle flow — sync-next-cycle script + Hard Rule #21 semantics (#6203)
Integrated into release/v3.8.45
* perf(test): tsx/esm loader + tsx 4.23 + órfãos recuperados + CI via npm scripts (plano testes+CI, Pacote 1) (#6214)
* perf(test): tsx/esm loader, tsx 4.23 bump, orphan tests recovered, CI runs npm scripts
Pacote 1 (quick wins) do plano mestre testes+CI:
- Swap --import tsx -> --import tsx/esm on the 19 test scripts: the repo is pure
ESM and the CJS hook costs ~1.3s PER test process (2,462 processes/run).
Measured: bootstrap 2.3s -> 1.1s; real-suite A/B (tests/unit/db, 12 files)
22.2s -> 14.1s wall (-36%), 82/82 pass. Non-test scripts keep the full hook.
- Bump tsx ^4.22.3 -> ^4.23.0 (fix for privatenumber/tsx#809 startup regression;
helps module resolution on big graphs — hook cost unchanged, honest note).
- Recover 22 ORPHAN test files (tests/unit/feature-triage/*.test.mjs, 53 cases,
53/53 pass) that matched no glob and ran in NO CI job; drop the dead
'executors' dir from the braces glob.
- Single source of truth for the unit-suite invocation: new test:unit:ci:shard
(shard via TEST_SHARD env) called by ci.yml test-unit/node24/node26/coverage
and quality.yml fast-unit — closing two silent drifts: CI was NOT importing
setupPolyfill.ts, and the fast path glob OMITTED tests/unit/memory + usage.
quality.yml TIA step + ci.yml test-integration get the tsx/esm swap only.
Validation: full unit suite 21,153 tests / 21,135 pass / 13 skip (5 fails =
known load-flake family, 10/10 green rerun isolated); vitest 237/237; smoke
db+feature-triage 135/135. Record run 2 = ci.yml workflow_dispatch on the
stacked pacote-2 branch (clean runners).
* fix(test): dashboard UI tests keep full tsx hook; recover 15 more .mjs orphans; extend discovery gate to .mjs
Follow-up do dispatch de validacao (run 28720431562), que pegou 2 problemas reais:
1. tests/unit/dashboard/** (11 arquivos, 102 casos) importam componentes React cujo
grafo puxa @lobehub/icons — o build es/ dele faz require() interno de arquivos com
sintaxe ESM, que so funciona com o patch CJS do tsx (sem ele: SyntaxError
'Unexpected token export' no CI; local vira crawl de ~60s/arquivo). Esses 11
arquivos rodam agora numa 2a invocacao com --import tsx COMPLETO (mesmo shard),
e o resto da suite mantem tsx/esm (-50% bootstrap). Validado: 102/102.
2. check:test-discovery falhou porque ancorava textualmente os globs nos workflows —
COLLECTORS atualizado p/ o modelo fonte-unica (ancora = nome do script
test:unit:ci:shard nos workflows) + varredura ESTENDIDA a .test.mjs, que era o
ponto cego que deixou os orfaos apodrecerem. A extensao revelou +15 orfaos .mjs
(top-level + db/) alem dos 22 de feature-triage — TODOS religados via glob
tests/unit/**/*.test.mjs (171/171 pass). Um deles (encryption-error-handling)
codificava o contrato PRE-hardening (decrypt falho retornava ciphertext cru —
vazamento); alinhado ao contrato shipped (null + log) com comentario.
Gate: [test-discovery] OK — 2892 arquivos, 22 collectors, 60 orfaos congelados
(divida rastreada, shrink-only).
* ci: dedup heavy pipeline — compat to nightly, coverage folded into unit shards, i18n single job, draft-skip (#6215)
Pacote 2+3-ci do plano mestre testes+CI (aprovado 2026-07-04). O CI pesado rodava a
suite unit 4x por sync da release-PR (95 jobs, 208 min-maquina) e o ciclo v3.8.44
disparou 123 desses runs (88 cancelados, 0 uteis) porque a release-PR viva fica
aberta o ciclo inteiro.
- D2: matrizes Node 24/26 (build + 8 jobs de teste, ~28% do custo por run) saem do
per-sync e viram .github/workflows/nightly-compat.yml (diario, fail-fast off,
resolve a release ativa como o nightly-release-green, abre issue de tracking em
falha). ci.yml/ci-summary limpos das referencias.
- D3: a matrix Coverage Shard x8 (~18% do custo) e eliminada — o job test-unit roda
os MESMOS shards sob c8/NODE_V8_COVERAGE e sobe os artifacts coverage-shard-N; o
job de merge (test-coverage) so repontou needs (padrao do CI do nodejs/node).
timeout test-unit 15->25min pelo overhead de instrumentacao.
- D4: a matrix i18n de ~40 jobs de <1min (saturava sozinha os 20 slots de
concorrencia da conta Free) vira 1 job que itera os idiomas com ::group:: por
idioma e artifact unico com resultados nomeados por idioma (antes 40 result.txt
colidiam no merge-multiple do ci-summary).
- P3: jobs pesados pulam pull_requests DRAFT (predicado em 10 jobs-raiz; o resto
pula pela cadeia de needs; ci-summary segue rodando como sinal unico) — a skill
/generate-release ja abre a release-PR viva como draft e flipa ready no 0a.0a
(commit eb04fc5 no repo .agents/skills).
- C5 (CodeQL schedule) NAO incluido: bloqueado na acao do dono Settings -> CodeQL
Default->Advanced (documentado no proprio codeql.yml).
Validacao: js-yaml parse ok; check:workflows zizmor 156 < baseline 159 (ratchet
verde); validacao de execucao = workflow_dispatch deste ci.yml neste branch ate
package-artifact + electron-package-smoke verdes (registrada no PR).
* feat(quality): no-new-warnings por PR — ESLint bulk suppressions + lint-guard fork-condicional (Pacote 4) (#6218)
* feat(quality): no-new-warnings per PR via native ESLint bulk suppressions
Pacote 4 do plano mestre testes+CI (aprovado 2026-07-04). O ratchet de
eslintWarnings so rodava no CI pesado (release-PR) -> o drift acumulava invisivel
e explodia na release (+41/+37/+88 por ciclo, rebaselinado as cegas — historico
no proprio quality-baseline.json). Modelo novo (SonarSource Clean-as-You-Code +
ESLint bulk suppressions nativo >=9.24):
- config/quality/eslint-suppressions.json congela a divida existente por
arquivo+regra: 476 arquivos / 4.273 violacoes.
- npm run lint + lint-staged (pre-commit) + novo job lint-guard no quality.yml
rodam suppressions-aware: violacao NOVA fica vermelha NO PR que a introduz
(bulk suppressions ainda eleva estouros de baseline por arquivo a error).
- 3 regras warn promovidas a error em src/** (react-hooks/exhaustive-deps,
@next/next/no-img-element, import/no-anonymous-default-export) — divida
existente congelada, ocorrencia nova = erro imediato.
- collect-metrics mede sob o baseline congelado -> a metrica eslintWarnings
vira 'divida liquida nova' (~0 em regime); baseline apertado 4279->0 no mesmo
PR (exigencia do require-tighten). Aperto do ESTOQUE congelado: npx eslint .
--prune-suppressions na reconciliacao da release.
- Principio Zero: lint-guard usa continue-on-error para PR de FORK (report-only;
a campanha /green-prs aplica o fix via co-autoria) — bloqueante so para
branches internas, a origem real do drift.
Validacao: negativo (any novo em tests/) exit 1; negativo (img em src/, regra
promovida) exit 1; positivo escopado exit 0; baseline gerado por --suppress-all
no tip (tree inteiro passa por construcao); YAML js-yaml ok.
* fix(quality): clear the 6 residual warnings so lint-guard runs clean at --max-warnings 0
The committed baseline still let 6 warnings through the lint-guard gate:
5 now-unused inline eslint-disable directives (the file-level suppressions
made them redundant — removed via eslint --fix, suppressions regenerated to
absorb the re-exposed occurrences) and 1 anonymous default export in
tests/load/k6-soak.js (outside the src/** severity-override scope — named
the k6 scenario function instead).
Verified on the clean tree: lint-guard exit=0; any-canary (new 'const x: any'
in open-sse) exit=1 — the gate bites on NEW violations while the 4,273
frozen ones stay suppressed (476 files).
* fix(ci): lint-guard continue-on-error must be boolean on non-PR events
github.event.pull_request is undefined on workflow_dispatch — the bare property
expression made the job fail at plan time (run 28722888456: 4 jobs green, run red,
lint-guard never materialized). Guard with event_name check so the expression is
always boolean: PR de fork = report-only (Principio Zero), resto = blocking.
* docs(changelog): v3.8.45 bullets for the tests+quality+CI pipeline overhaul (#6214, #6215, #6218)
i18n CHANGELOG mirrors intentionally left to the release reconciliation
(release:sync-changelog-i18n), per cycle practice.
* fix(api): stabilize relay SSRF-guard binding for minified builds (#6149) (#6224)
* fix(mcp): forward extra context through static tool loops (#6178) (#6228)
* fix(services): 9Router embed route + pre-spawn port probe (#6205) (#6227)
* fix(backend): system-first memory injection for strict providers (#6135) (#6225)
* fix(auth): clear error for stale-key decryption failures (#6148) (#6226)
* fix(backend): record reasoning source for zero-metered reasoning models (#6187) (#6229)
* fix(providers): refresh stale NVIDIA NIM model registry (#6108) (#6223)
* fix(backend): distinct max_input_tokens for GPT-family models (#6191) (#6230)
* fix(oauth): extract keychain-import-only guard to restore file-size freeze (base-red) (#6158)
`src/app/api/oauth/[provider]/[action]/route.ts` grew to 959 lines, past its
frozen cap of 924 (`check:file-size` → Fast Quality Gates red on release/v3.8.44).
The growth came from #6054 (graceful 400 for keychain-import-only providers / zed):
a doc block, two Sets (KEYCHAIN_IMPORT_ONLY_PROVIDERS, OAUTH_FLOW_ACTIONS) and a
keychainImportOnlyResponse() helper, plus two duplicated guard blocks in GET/POST.
That is a cohesive, self-contained leaf, so extract it to a new
`keychainImportOnly.ts` exposing `keychainImportOnlyGuard(provider, action)`
(returns the 400 NextResponse or null). The two route callsites collapse to a
2-line guard each. route.ts: 959 -> 918 (< 924, freeze restored). No behavior
change.
Tests (Rule #8/#18):
- Existing tests/unit/oauth-keychain-import-only-6041.test.ts (route-level GET/POST
zed 400) still pass unchanged — behavior preserved.
- New tests/unit/oauth-keychain-import-only-guard.test.ts pins the extracted guard
in isolation (zed+flow -> 400, normal provider -> null, zed+non-flow -> null).
* fix(dashboard): stop model-test error freezing the page (React #31 object toast) (#6161)
Clicking 'test' on a provider model (e.g. a ClinePass flash model) could freeze
the entire dashboard. Root cause: POST /api/models/test returned an OBJECT in
`error` on the Zod-validation and invalid-JSON paths (`validation.error.format()`
/ a details object). The client does `notify.error(data.error)`, and
NotificationToast renders the message directly as a React child — an object throws
React #31 ('Objects are not valid as a React child'), crashing the tree = frozen
page instead of a toast.
Fixed in three layers (defense in depth):
1. Server (root cause): /api/models/test now returns a STRING `error` on every
path — flattens Zod issues to text, returns 'Invalid JSON body' for bad JSON.
2. Client: onTestModel funnels the response through extractApiErrorMessage() so any
object-shaped error is coerced to a string before notify.error.
3. Toast: NotificationToast coerces title/message via toToastText() — a resilient
catch-all so no future caller can freeze the page with a non-string.
Tests (Rule #18, both node:test / blocking suite):
- tests/unit/models-test-error-shape.test.ts — asserts STRING error on Zod-fail,
missing-field, and invalid-JSON (fails on the pre-fix route: 3/3 red -> green).
- tests/unit/notification-toast-coercion.test.ts — toToastText coercion matrix.
* fix(dashboard): remove the always-on Auto-Routing (combo) banner from the home page (#6164)
The blue "Auto-Routing Active — OmniRoute is automatically routing requests
using combo-based strategies" banner was rendered unconditionally on the home
page (`/home`, the default dashboard landing) — it did NOT reflect whether
auto-routing was actually active, and reappeared on every fresh browser / private
window / cleared localStorage (dismissal is stored per-browser). It added noise
to the landing page without conveying live state.
Remove it: drop the <AutoRoutingBanner /> usage + import from home/page.tsx and
delete the now-unused component and its test.
* fix(cline): force upstream streaming for Cline/ClinePass (streaming-only API) (#6165)
* fix(cline): force upstream streaming for Cline/ClinePass (streaming-only API)
Cline's API (api.cline.bot) only implements streaming (streamText). A
non-streaming request returns HTTP 500 "generateText is not implemented" (Claude
models) or HTTP 502 "empty response" (others). Live-verified on the VPS:
stream:true → works (STREAM_OK), stream:false → fails. This is why testing a Cline
model in the dashboard (the test button sends stream:false) failed.
Fix (reuses the existing isClaudeCodeCompatible mechanism, no new handler):
- Flag `cline` and `clinepass` registry entries with `forceStream: true`.
- In chatCore, OR `providerRequiresStreaming` into `upstreamStream` (line 1591)
so the upstream request always streams for these providers, while the client's
original `stream` intent still drives the response format. The existing
non-streaming branch (parseNonStreamingResponseBody) already accumulates the
upstream SSE and converts it back to JSON for stream:false clients — the same
path Claude-Code-compatible providers already use.
Tests (Rule #18): tests/unit/cline-force-stream.test.ts pins the registry flags +
resolveStreamFlag forcing behavior. Live VPS before/after recorded on the PR.
* fix(sse): cline forceStream must stream upstream only, keep client JSON
The #2081 wiring fed providerRequiresStreaming into resolveStreamFlag,
forcing the client-facing stream flag to true for forceStream providers.
That skips the if(!stream) branch that drains a forced upstream SSE and
converts it back to JSON, so a stream:false caller (model-test button,
plain JSON API) got STREAM_EARLY_EOF instead of a JSON body.
Keep providerRequiresStreaming only on upstreamStream (force upstream to
stream); leave the client-facing stream as the client sent it, so
readNonStreamingResponseBody accumulates the SSE into JSON. The promised
handleForcedSSEToJson (#2081 comment) was never implemented — this uses
the existing non-streaming SSE-buffering path (same as isClaudeCodeCompatible).
Live-verified on VPS: cline stream:true worked, stream:false failed.
* fix(providers): correct Kiro model catalog to real upstream ids (#6170)
* fix(providers): correct Kiro model catalog to real upstream ids
Kiro's API (generateAssistantResponse) returns 400 "Invalid model. Please
select a different model" for any id it does not recognize. The registry
exposed fabricated ids (copied from OmniRoute's own Anthropic catalog) that
Kiro never serves, so every call to them 400'd. Live-verified on the VPS:
Removed (400 Invalid model):
- auto-kiro (no "auto" model id — was sent verbatim upstream)
- claude-fable-5 (Kiro offers no Fable)
- claude-opus-4.8/4.7/4.6 (Kiro offers no Opus)
Corrected:
- claude-sonnet-4.6 -> claude-sonnet-4.5 (Kiro's Sonnet is 4.5; 4.5 -> 200)
Kept:
- claude-sonnet-5 (real Kiro model, plan-gated per account)
- claude-haiku-4.5, deepseek-3.2, glm-5, minimax-m2.5/m2.1,
qwen3-coder-next (all proven 200 on the VPS)
Aligns the free-model catalog and drops the orphaned auto-kiro price key.
Regression guard: tests/unit/kiro-catalog-real-models.test.ts (3/3).
Kiro cluster #6112/#6113/#6099.
* test(providers): align stale Kiro-catalog tests to the corrected upstream ids
The fabricated Kiro ids removed in the parent commit (claude-fable-5,
claude-opus-4.8/4.7/4.6, claude-sonnet-4.6) were still asserted as present by
three pre-existing tests, which encoded the bug:
- catalog-updates-v3x: now asserts Kiro does NOT expose Fable 5 / Opus (kept the
legit cc exposure) and guards the real claude-sonnet-4.5 pricing.
- model-family-fallback-notation: the dot-notation example moves from kiro/ to
anthropic/ (which genuinely serves Opus/Fable in dot notation) — coverage kept.
- provider-models-route: the Kiro local-catalog assertion now expects the real
Sonnet 5 / Sonnet 4.5 set and negatively guards the fabricated ids.
Co-authored-by: diegosouzapw <diegosouza.pw@gmail.com>
* fix(sse): surface ChatGPT-web image silent-drop as an accurate error (#6208)
When ChatGPT Web generates an image as an image_asset_pointer but the pointer
fails to resolve to a downloadable URL (unknown asset scheme, download 403/
expired, oversize), resolveImagePointers returned [] — indistinguishable from
'no image produced' — so the image-generation handler reported the misleading
502 'completed without returning image markdown'. The image genuinely existed
upstream; OmniRoute dropped it silently.
Fix: the executor flags x_image_resolution_failed when a pointer existed but
none resolved (and logs the unresolved asset scheme for follow-up), and the
handler surfaces a truthful 'generated but not retrievable' 502 instead of
'no image markdown'. Adds executorFactory DI for unit testing.
TDD: tests/unit/chatgpt-web-image-silentdrop.test.ts (red -> green), plus the
existing chatgpt-web / image-generation-handler suites stay green.
Reported via community triage (mesh escalated backlog).
* fix(dashboard): providers page data-timeout guard + live-ws standalone wiring (#6211)
* fix(dashboard): providers page data-timeout guard + live-ws standalone wiring
Captura de trabalho em progresso: timeout de dados na página de providers,
ajuste em ProviderLimits e instrumentation-node, com testes novos
(providers-page-data-timeout, live-ws-standalone-wiring).
* chore(quality): rebaseline ProviderLimits/index.tsx file-size (+6, #6211 data-timeout guard)
Cohesive fix growth from PR #6211's data-timeout guard on the quota page's two
first-paint fetches (1121->1127). The fast-path PR->release skips check:file-size,
so the bump lands with the PR. Justification recorded in file-size-baseline.json.
* fix(translator): strip reasoning param for nvidia z-ai/glm-5.2 (#6181)
* fix(translator): strip reasoning param for nvidia z-ai/glm-5.2
NVIDIA NIM OpenAI-compatible wrapper rejects the reasoning body field
and returns HTTP 400 "Unsupported parameter(s): `reasoning`".
Add a StripRule scoped to provider=nvidia + model /z-ai\/glm-5\.2/i.
Mirrors PR #6102 drop pattern (minimax-m2.7 thinking).
* docs(translator): tighten nvidia glm-5.2 strip-rule comment
* fix(translator): anchor glm-5.2 strip rule with word boundary
* fix: add nvidia to PROVIDER_TOOL_LIMITS (1536) to prevent tool truncation (#6177)
NVIDIA NIM API (nvidia/* models) silently truncates the tool list to 128
(the default MAX_TOOLS_LIMIT) because nvidia is not in PROVIDER_TOOL_LIMITS.
Tools beyond index 127 are dropped, causing agents to lose access to
critical tools like task, read, or high-index MCP tools.
Verified that NVIDIA NIM API supports up to 1536 tools by direct testing.
End-to-end confirmed: 198 tools sent, model successfully called tools at
indices 193, 195, and 197 (previously dropped by truncation to 128).
Follows the same pattern as #5563 (grok-cli: 200), integrated in v3.8.43.
* feat(provider): add Claude 5 Sonnet to Claude Web provider (#6200) (#6209)
* feat(provider): add Claude 5 Sonnet to Claude Web provider (#6200)
* test(providers): guard claude-web claude-sonnet-5 registry entry (#6209)
Adds the missing regression test the PR-test-policy gate requires: asserts the
claude-web registry exposes claude-sonnet-5 (Claude 5 Sonnet web) alongside the
existing 4.6 Sonnet / 4.5 Haiku entries. Fails on the release base (no entry).
Co-authored-by: diegosouzapw <diegosouza.pw@gmail.com>
---------
Co-authored-by: Diego Rodrigues de Sa e Souza <diegosouza.pw@gmail.com>
* fix(cli): detect POSIX auto-set HOSTNAME via os.hostname() to fix bind address (#6194) (#6195)
POSIX shells (bash/zsh) always set HOSTNAME to the machine name. The
.env loader uses first-wins semantics, so HOSTNAME=0.0.0.0 in .env is
silently ignored. This causes the server to bind to the LAN hostname
instead of 0.0.0.0, breaking localhost access and all internal
self-requests (ModelSync, HealthCheck, cloud sync).
The fix compares process.env.HOSTNAME against os.hostname(): when they
match, it's the POSIX auto-set signature and HOSTNAME is ignored.
OMNIROUTE_SERVER_HOST takes precedence as the dedicated escape hatch.
Backward compatibility is preserved: users who set HOSTNAME to a value
that doesn't match the machine name (e.g. Windows CMD/PowerShell users
with HOSTNAME in .env) will still have their value honoured.
Closes #6194
* feat(sse): surface Kiro adaptive-thinking reasoning as reasoning_content (#6213)
Kiro/CodeWhisperer streams Claude's reasoning as native `reasoningContentEvent`
frames when adaptive thinking is enabled, but the Kiro executor had no handler
for them, so `reasoning_effort` requests returned no reasoning. Wire it end to
end:
- translator (openai-to-kiro): enable Kiro thinking when the request carries
`reasoning_effort`, Anthropic `output_config.effort`, or a `thinking` block
(`{type:"enabled",budget_tokens}` mapped to a level; `{type:"adaptive"}`
defaults to `high`, matching Anthropic's documented default). Prepends the
Kiro `<thinking_mode>`/`<max_thinking_length>` prompt directive and sets
top-level `additionalModelRequestFields` ({output_config.effort,
thinking:{type:"adaptive"}, max_tokens}). Gated on `supportsReasoning`; drops
non-default temperature/top_p (rejected by adaptive-only Claude models).
- executor transformRequest: forward `additionalModelRequestFields` to AWS
(previously dropped by the strict top-level allowlist).
- executor stream loop: parse `reasoningContentEvent` (and reasoningText
variants) into the OpenAI reasoning_content channel.
Verified against the live CodeWhisperer stream: reasoningContentEvent frames are
returned, and larger effort/budget measurably deepens reasoning up to the model
cap. Unit tests cover the effort sources, forwarding, temp/top_p stripping, and
native reasoning-frame parsing.
* fix(chatcore): exempt opencode client from the default 128-tool truncation (#6193)
* fix(chatcore): exempt opencode client from the default 128-tool truncation
The default MAX_TOOLS_LIMIT (128) cap made truncateToolList blind-slice
tools.slice(0, 128), dropping opencode's built-in task tool and part of
its MCP tools when the inbound list exceeded 128 — so models routed
through OmniRoute could not launch subagents or reach all their tools.
Detect the opencode client (any x-opencode-* header, or 'opencode' in
the user-agent) and bypass ONLY the speculative 128 default. A known
provider ceiling (proactive PROVIDER_TOOL_LIMITS or a detected limit)
always wins and still truncates, even for opencode, so upstreams with
real hard limits (e.g. grok-cli 200) keep their 400-avoidance guard.
Non-opencode clients are unchanged.
- requestFormat.ts: add isOpencodeClient(headers, userAgent) + expose it
on resolveChatCoreRequestFormat.
- toolLimitDetector.ts: add getKnownToolLimit(); getEffectiveToolLimit
becomes getKnownToolLimit(provider) ?? DEFAULT_LIMIT (byte-identical
for existing callers).
- upstreamBody.ts: truncateToolList takes bypassDefaultToolLimit and
encodes the precedence; fix cosmetic debug-log count.
- chatCore.ts: thread the flag into prepareUpstreamBody.
- tests: extend tool-limit-detector unit tests.
* refactor(tools): accept nullable provider in tool-limit resolvers
Address PR review: widen getKnownToolLimit / getEffectiveToolLimit to
(provider: string | null | undefined) to match the call sites in
truncateToolList, and add unit assertions covering null/undefined
providers (getKnownToolLimit -> null, getEffectiveToolLimit -> 128).
---------
Co-authored-by: DKotsyuba <16292493+DKotsyuba@users.noreply.github.com>
Co-authored-by: Diego Rodrigues de Sa e Souza <diegosouza.pw@gmail.com>
* fix(providers): refresh GitHub Copilot catalog (#6154)
* fix(providers): refresh github copilot catalog
Limit GitHub Copilot discovery to the curated supported model set and keep the provider cooldown panel client-safe by moving countdown formatting out of localDb.
* chore(quality): rebaseline providerPageHelpers.ts file-size (+13, #6154 copilot catalog)
The GitHub Copilot catalog refresh grows the provider-page model-section helper
(1021->1034). Fast-path PR->release skips check:file-size, so the bump lands with
the PR. Justification recorded in file-size-baseline.json.
Co-authored-by: diegosouzapw <diegosouza.pw@gmail.com>
---------
Co-authored-by: diegosouzapw <diegosouza.pw@gmail.com>
* chore(quality): rebaseline kiro-translator file-size debt from #6213
The #6213 kiro adaptive-thinking feature grew openai-to-kiro.ts (853->890) and its
test (1093->1234); the fast-path PR->release does not gate check:file-size on merge,
so the growth accumulated on the release tip. Rebaselined to keep the tip green.
Justification recorded in file-size-baseline.json.
* fix(doctor): resolve two false-positive WARNs (#6162) (#6163)
* fix(doctor): resolve two false-positive WARNs (#6162)
The `omniroute doctor` command reported two warnings on healthy installs
even though the underlying checks actually passed. Both came from the
doctor probing state that already worked; they looked like bugs but users
couldn't tell without manual digging.
Issue 1 — Server liveness HTTP 401
/api/health and /api/health/degradation both require the management
token. Doctor called them without auth → 401 → WARN, even when the
Next.js server was clearly alive and listening.
Fix: probe the configured health endpoint first; on 401/403, fall
back to a publicly served static asset (/favicon.ico) to confirm the
server is alive. WARN now only fires when both probes fail.
Issue 2 — CLI Tools '@/shared' import
tool-detector.ts (and 3 other cli-helper files) import @/shared/...
aliases that resolve via tsconfig.json paths. The CLI ships raw TS
source (no compile step) and runs through tsx, but tsx does not honor
tsconfig paths at runtime, and tsconfig-paths only hooks CJS
Module._resolveFilename while doctor uses ESM `import()`.
Fix: replace @/shared/... with relative imports in the 4 cli-helper
files. This is the same pattern these files already use for ./config-
generator/* imports. No new dependency, no architectural change, and
the fix doesn't regress Next.js itself which keeps using @/shared.
Verified on v3.8.43 (Node v24.17, Windows 11):
Before: 7 ok, 2 warning(s), 0 failure(s)
After: 8 ok, N warning(s), 0 failure(s)
where N accurately reflects which CLI tools are installed and
configured for OmniRoute (e.g. Hermes Agent installed but not
pointed at 20128 → 2 real warnings, not 1 false-positive).
Refs #6162
* fix(doctor): derive fallback URL from primary URL via new URL()
Per Gemini code-assist review feedback: the previous fallback constructed
the /favicon.ico URL from defaults (127.0.0.1:PORT) which ignored custom
host/port/protocol configurations supplied via:
- OMNIROUTE_DOCTOR_LIVENESS_URL
- OMNIROUTE_DOCTOR_HOST
- --liveness-url / --host CLI flags
Parse the primary URL with new URL() to preserve protocol, host, port, and
subpaths. The previous default-based fallback remains as a catch-all for
invalid primary URLs.
* test(doctor): add regression tests for #6162 fixes
Two new test files lock the fix and satisfy the PR Test Policy gate
("production code change without tests"):
- tests/unit/cli-helper-tool-detector-paths-6162.test.ts
Locks the @/shared → relative imports fix across all 4 cli-helper
files. Asserts (a) no @/shared alias remains in the cli-helper
sources, and (b) each file is importable at runtime via tsx/ESM,
which would have thrown "Cannot find package '@/shared'" before
the fix.
- tests/unit/cli-doctor-liveness-fallback-6162.test.ts
Locks the /favicon.ico fallback in doctor.mjs. Asserts the
fallback probe exists, derives its URL from the primary URL via
new URL() (per Gemini review feedback), and that the buggy
'Server responded with HTTP 401' WARN path is gone.
Both tests use only node:test + node:assert/strict so they slot into
the existing 'test' and 'test:unit' scripts with no extra config.
* test(doctor): fix primary.ok regex in fallback test
The earlier regex /primary\.ok\s*\?/ required a '?' immediately after,
but the actual doctor.mjs code uses a multi-line if-block:
if (primary.ok) {
return ok(...);
}
Use /\bprimary\.ok\b/ instead so the assertion matches the existing
branching.
---------
Co-authored-by: Diego Rodrigues de Sa e Souza <diegosouza.pw@gmail.com>
* fix(doubao-web): switch provider to Dola global (#6235)
* fix(doubao-web): switch provider to Dola global
* fix(doubao-web): use .dola.com cookie domain for s_v_web_id + rebaseline test
The Dola switch left s_v_web_id with a host-only "www.dola.com" domain, which fails
the token-source contract (domain must start with "." or "http") — the sibling
sessionid/ttwid cookies and the canonical cookieDomain already use ".dola.com", which
also matches www.dola.com. Also rebaselines web-cookie-providers-new.test.ts (850->890)
for the provider-switch regression cases.
Co-authored-by: diegosouzapw <diegosouza.pw@gmail.com>
---------
Co-authored-by: Diego Rodrigues de Sa e Souza <diegosouza.pw@gmail.com>
* fix(providers): register zed in OAuth PROVIDERS to fix Unknown provider error (#6041) (#6078)
Registers a minimal import_token entry for the existing Zed IDE keychain-import
provider so getProvider("zed") no longer throws "Unknown provider: zed" when the
UI probes the OAuth capability endpoint; generateAuthData returns { supported: false }.
Test runner fix: the regression test imported from "vitest" but lives in tests/unit/
(node:test territory, outside the vitest include globs) — it ran in no runner. Converted
to node:test + node:assert so it actually executes (8/8 green).
Co-authored-by: diegosouzapw <diegosouza.pw@gmail.com>
* fix(oauth): align zed in OAUTH_PROVIDER_IDS + config enum after #6078 merge
#6078 registered zed in the OAuth PROVIDERS registry but did not add it to the
constants PROVIDERS id map nor the oauth-providers-config enumeration test, leaving
that test red on the release tip (getProvider enumeration vs EXPECTED mismatch).
Adds ZED to the id constants + zed to EXPECTED_PROVIDER_KEYS/EXPECTED_CONFIG_BY_PROVIDER.
* fix(mitm): strip colons from macOS cert fingerprint before keychain match (#6134) (#6204)
fix(mitm): strip colons from macOS cert fingerprint before keychain match (#6134). Extracted testable macCertOutputHasFingerprint helper + regression guard. Thanks @rianonehub. Integrated into release/v3.8.45.
* docs(architecture): sync stale DB-layer counts (45+/55 → 95+/110+) in REPOSITORY_MAP, db-schema diagram and llm.txt (+42 i18n mirrors) (#6167)
docs(architecture): sync stale DB-layer counts (45+/55 → 95+/110+) across REPOSITORY_MAP, db-schema diagram, llm.txt + 42 i18n mirrors (#6167). Docs-only; check:docs-all passes locally on the reconstruction. Reds are pre-existing base-red drift on release/v3.8.45 (dast-smoke #6228; executor-kiro.test.ts eslint anys; changelog/package.json version drift) — none introduced by this PR. Integrated into release/v3.8.45.
* fix(api): count tool_use/tool_result/thinking blocks in count_tokens estimate (port from 9router#2337) (#6221)
fix(api): count tool_use/tool_result/thinking blocks in count_tokens estimate (#6221, port from 9router#2337). TDD-covered (6/6); typed the test casts to clear no-new-eslint. Reds are pre-existing base-red drift on release/v3.8.45 (dast-smoke #6228; executor-kiro.test.ts eslint anys; changelog/package.json version drift) — none introduced by this PR. Thanks @luweiCN. Integrated into release/v3.8.45.
* fix(antigravity): strip trailing assistant prefill turn for Vertex Claude models (#6114)
fix(antigravity): strip trailing assistant prefill for Vertex Claude models (#6114). TDD-covered (6/6), merged on TDD strength per owner. Reds are pre-existing base-red drift on release/v3.8.45. Thanks @anki1kr. Integrated into release/v3.8.45.
* fix(security): require management auth for mutable cloud routes (#6233) (#6233)
fix(security): require management auth for mutable cloud routes (#6233). Verified: 3 PR tests + full authz/route-guard suite 241/241 green. Thanks @vittoroliveira-dev. Integrated into release/v3.8.45.
* fix(dashboard): use connection.id (UUID) not connection.provider (category) in onboarding wizard href (issue #6144) (#6166)
refactor(dashboard): extract tested buildProviderDetailsHref helper for onboarding wizard (#6166). Behavioral #6144 fix already on tip via #6145; this lands the tested-helper hardening. Thanks @KooshaPari. Integrated into release/v3.8.45.
* feat(rankings): add 'Configured Only' filter to Free Provider Rankings page (#6245)
feat(rankings): add 'Configured Only' filter to Free Provider Rankings (#6245, closes #6150). 9/9 test green. Thanks @Iammilansoni. Integrated into release/v3.8.45.
* fix(i18n): add 118 missing Italian translations (#6212)
i18n(it): add 118 Italian translations (#6212). Audited net-additive (0 keys dropped, valid JSON). Thanks @serverless83. Integrated into release/v3.8.45.
* test(dashboard): realign #6145 onboarding-href guard to the #6166 helper refactor (#6270)
Realign the #6145 onboarding-href guard to the #6166 helper refactor (buildProviderDetailsHref). Test-only; unblocks the fast-path unit job across the open PR queue. Base-reds only (dast-smoke #6228, docs version-drift, executor-kiro anys). Integrated into release/v3.8.45.
* feat(providers): add Yuanbao (web) cookie-session provider (#6196) (#6256)
feat(providers): add Yuanbao (web) cookie-session provider (#6196). TDD-covered; base-reds only (dast-smoke #6228, docs version-drift, executor-kiro anys — #6145 guard fixed on tip via #6270). Integrated into release/v3.8.45.
* feat(providers): route built-in agentrouter through dynamic CC wire image (#6056) (#6255)
feat(providers): route built-in agentrouter through dynamic CC wire image (#6056). TDD-covered (agentrouter-cc-wire-image.test.ts). Base-reds only. Integrated into release/v3.8.45.
* feat(providers): bulk-add API keys for Cloudflare Workers AI (#6174) (#6254)
feat(providers): bulk-add API keys for Cloudflare Workers AI (#6174). Per-entry providerSpecificData (fixes shared-object reuse); TDD guard bulk-api-key-parser-cloudflare.test.ts. Base-reds only. Integrated into release/v3.8.45. (thanks @muflifadla38)
* feat(dashboard): routing/settings UX clarity — share %, Cloud Sync rename, base-URL override (#6147) (#6253)
feat(dashboard): routing/settings UX clarity (#6147) — effective share %, Cloud Sync→Remote Settings Sync rename, opt-in advanced base-URL override. TDD guard routing-settings-ux-6147.test.ts (6/6). Base-reds only. Integrated into release/v3.8.45.
* feat(combo): add option to disable session stickiness (#6168) (#6252)
feat(combo): add option to disable session stickiness (#6168) — per-combo/global, precedence config→settings→false (preserves #3825). TDD guard combo-disable-session-stickiness.test.ts (8/8). Base-reds only. Integrated into release/v3.8.45. (thanks @RCrushMe)
* feat(docker): OMNIROUTE_NO_SUDO env flag for root-less MITM cert trust (#6122) (#6249)
feat(docker): OMNIROUTE_NO_SUDO env flag for root-less MITM cert trust (#6122). resolveSudoSpawn strips sudo when set; argv-array spawn preserved (Hard Rule #13). TDD guard mitm-systemCommands-no-sudo.test.ts (5/5). Base-reds only. Integrated into release/v3.8.45. (thanks @powellnorma)
* feat(providers): add Requesty as an OpenAI-compatible gateway provider (#6120) (#6250)
feat(providers): add Requesty as an OpenAI-compatible gateway provider (#6120). Fixed the APIKEY_PROVIDERS count guard (167→168) the feature had missed. TDD guard requesty-provider.test.ts (4/4) + providers-constants-split (4/4). Base-reds only. Integrated into release/v3.8.45. (thanks @chirag127)
* fix(providers): remove deprecated MiMo v2 entries (#6248)
chore(providers): remove deprecated MiMo V2 catalog entries (superseded by V2.5); realign provider-catalog tests. Merged — thank you, @backryun! Base-reds only. Integrated into release/v3.8.45.
* fix(github-skills): add missing import, add unit tests, fix settings JSON parse (#6186)
feat(skills): GitHub skill-discovery subsystem — search/score/scan/import agent skills from GitHub, MCP tools (scope-gated) + /api/github-skills route (host-pinned api.github.com, sanitized errors). Merged — thank you, @Moseyuh333! Pre-merge fixes: passed toolDef.scopes so tools gate correctly under scope enforcement, routed the GET error path through sanitizeErrorMessage+500 (Hard Rule #12), and realigned the agent-skills count guards (catalog/routes/generator/mcp) for the new catalog entry. Base-reds only. Integrated into release/v3.8.45.
* Fix/5976 continued (#6216)
fix(combo): 5 streaming-path fixes (#5976) — locked-stream 500, error-frame-only-if-no-content, Gemini MALFORMED_RESPONSE→content_filter failover, correlationId substring, per-model-500 lockout skip + request-logger UI. Merged — thank you, @hartmark! Maintainer follow-up: releaseQualityClone cancels the abandoned quality-check tee branch (per-request memory) + regression test. All 41 combo/streaming quality tests green. Base-reds only. Integrated into release/v3.8.45.
* feat(dashboard): filter Free Provider Rankings by configured/available (#6150) (#6251)
feat(dashboard): configured-only / available-only filters on Free Provider Rankings (#6150) — server-side query params + tested lib helper; supersedes the client-side #6245 toggle with an available-only dimension. Lib logic 11/11 green; UI validated live on VPS. Base-reds only. Integrated into release/v3.8.45.
* ci: unblock test jobs from the Build gate (start at minute 0) (#6275)
test-unit x8, test-vitest, test-integration x2 and test-security all had
needs: build but never download the next-build artifact — the dependency
only serialized ~20min of Build wall-clock in front of every test run.
Switch them to needs: changes with the same skip condition Build uses
(docs-only PRs and drafts still skip), so the test chain
(test-unit -> test-coverage -> quality-gate -> sonarqube) now runs in
parallel with Build instead of after it.
Jobs that genuinely consume the artifact keep needs: build unchanged:
test-e2e x9, package-artifact, electron-package-smoke.
Expected effect on a full ci.yml run: critical path drops from
build + tests (~30min+) to max(build, tests) — roughly 15-20min saved
per run, no extra runner minutes beyond starting the same jobs earlier.
* ci(build): switch Next.js production build to Turbopack (1.9x faster) (#6273)
Next 16 ships Turbopack as the stable production bundler. Benchmarked on a
32-core box against the same tree: webpack 1035s -> Turbopack 539s (1.92x).
The build script already supports the switch via OMNIROUTE_USE_TURBOPACK=1
(scripts/build/build-next-isolated.mjs) and next.config.mjs already mirrors
the resolveAlias stubs in the turbopack block, so this only flips the CI env.
The webpack .build/next/cache actions/cache step is removed in the same
commit: Turbopack does not use the webpack cache dir (its persistent FS
cache is experimental and NOT enabled), so restoring ~0.5 GB per run would
be pure wasted download. Revert restores webpack + its cache together.
Validation: standalone output smoke-tested (server.js boots, health 200,
dashboard 307); the 428 build warnings are the known benign 'overly broad
file pattern' static-analysis notices for dynamic fs usage (covered at
runtime by outputFileTracingIncludes). Downstream e2e x9, package-artifact
and electron-package-smoke consume this artifact, so a green CI run here
validates the Turbopack artifact end-to-end. nightly-compat and npm-publish
stay on webpack until this PR proves out.
* feat(build): make Turbopack the default bundler for dev and build (#6283)
Turbopack (stable in Next 16) becomes the code default in the three entry
points that previously required an explicit OMNIROUTE_USE_TURBOPACK=1:
- scripts/build/build-next-isolated.mjs (production build)
- scripts/dev/run-next.mjs (dev server)
- scripts/dev/run-next-playwright.mjs (playwright dev runner)
OMNIROUTE_USE_TURBOPACK=0 remains the webpack escape hatch (Windows /
native-binding / bundler-compat issues), and only the documented '0'
opts out — junk values keep the default.
Benchmarked on this codebase (same tree, Next 16.2.9): webpack 1035s vs
Turbopack 539s on a 32-core box; ~20min vs 6min59s on ubuntu-latest.
Artifact validated end-to-end (standalone smoke + e2e/package-artifact/
electron-package-smoke CI jobs, Docker amd64+arm64 builds clean with the
v3.8.27 ImportTracer panic gone on 16.2.9).
TDD: tests/unit/build-bundler-default-turbopack.test.ts (new) +
run-next-playwright.test.ts extended with the unset-env default case;
both red before the flip, green after. ENVIRONMENT.md updated.
* feat(docker): build the image with Turbopack (v3.8.27 panic gone on Next 16.2.9) (#6285)
Flips the builder stage to OMNIROUTE_USE_TURBOPACK=1 and rewrites the stale
panic comment: the v3.8.27-era TurbopackInternalError ('entered unreachable
code: there must be a path to a root' in ImportTracer::get_traces) no longer
reproduces on Next 16.2.9.
Validation (2026-07-05, this exact Dockerfile, default
OMNIROUTE_BUILD_MEMORY_MB=4096, no overrides):
- amd64: docker build 659s, exit 0, zero panic/OOM strings in the full log,
container smoke-tested (/api/monitoring/health 200)
- arm64 (qemu): exit 0, zero panic strings
Webpack stays available as the escape hatch:
--build-arg / -e OMNIROUTE_USE_TURBOPACK=0. The V8 heap ceiling is kept:
Turbopack's compile is native Rust, but prerender/export still runs on V8.
* ci: opt-in self-hosted VPS runners for the release window (anti-queue) (#6284)
Adds the on-demand self-hosted runner plumbing for /generate-release:
- scripts/vps/release-runner-up.sh: starts the runner VM on Proxmox, waits
for >=1 'omni-release' runner to report online via the GitHub API, then
flips the USE_VPS_RUNNER repo variable to true. Any failure/timeout sets
it back to false and exits 1 so the caller falls back to hosted runners.
- scripts/vps/release-runner-down.sh: flips USE_VPS_RUNNER=false FIRST
(so no job gets scheduled onto a dying runner), then gracefully shuts
the VM down. Idempotent.
- ci.yml: build, test-unit x8 and test-vitest pick their runner
dynamically. Self-hosted is used ONLY when USE_VPS_RUNNER == 'true'
AND the event is own-origin (push/dispatch, or a PR whose head repo is
this repository). Fork PRs and the var's default/absent state always
fall back to ubuntu-latest.
Why: the Free plan caps hosted concurrency at 20 jobs; a release run
saturates it and queues. The benchmarked VPS (32-core, 4 runners) matches
hosted per-job times (unit ~8.5min/shard, build 9min turbo) but eliminates
the queue, which is the real release bottleneck (~30-50min on a busy day).
Scope is conservative: only the three job families benchmarked on the VPS;
e2e/electron/integration stay hosted (playwright/xvfb provisioning not
validated on the runner workspace yet).
* docs(changelog): restore v3.8.45/v3.8.44 sections eaten by the #6193 merge auto-resolve + CI-perf campaign bullets (#6273 #6275 #6283 #6284 #6285)
* fix(dashboard): null-guard connection in EditConnectionModal base-URL override (#6147) (#6287)
fix(dashboard): null-guard connection in EditConnectionModal (#6147) — fixes 'Cannot read properties of null (reading authType)' crash on every provider-detail page entry. TDD: connModals.test.tsx null-mount 9/9. Base-reds only. Integrated into release/v3.8.45.
* chore(release-green): clear test-masking + docs-all HARD reds for the v3.8.45 pre-flight
- test-masking: allowlist the 4 verified-legitimate assert reductions of the
cycle (#6248 MiMo V2 removal, #6170 Kiro catalog correction, #6154 Copilot
catalog refresh) and register the #6164 AutoRoutingBanner test deletion with
a real replacement guard (tests/unit/home-no-autorouting-banner.test.ts —
asserts the banner stays out of home/page.tsx and the component stays deleted)
- docs-sync: executors count 68 -> 73 in ARCHITECTURE.md + CODEBASE_DOCUMENTATION.md
- env-doc-sync: document OMNIROUTE_NO_SUDO (#6249/#6122) in .env.example +
docs/reference/ENVIRONMENT.md
* fix(quality): clear the cycle's 11 net-new ESLint errors + make validate-release-green suppressions-aware
- executor-kiro/save-call-log/call-logs-correlation tests: replace 15 'as any'
casts with typed shapes (net-new no-explicit-any errors from #6213/#6216);
prune the now-empty suppression entries so the frozen baseline stays exact
- github-skills + usage/call-logs routes: raw toLowerCase().includes() search
replaced by matchesSearch() (no-restricted-syntax — Turkish-safe search,
behavior covered by tests/unit/call-logs-correlation-substring.test.ts and
tests/unit/github-collector.test.ts)
- validate-release-green.mjs: run ESLint with --suppressions-location (match
the npm run lint contract — frozen debt is not a release red) and raise the
lint timeout 15->30min (a full pass takes ~14min alone; the 15min ceiling
expired under concurrent suite load and surfaced as 'could not parse eslint
json')
* fix(skills): generate the missing omni-github-skills registry entry + align catalog count tests
PR #6186 added omni-github-skills to the agent-skills catalog (API 22 -> 23)
but did not run the generator, so skills/omni-github-skills/SKILL.md never
existed and 6 integration assertions split between the old (42/43) and new
counts. Generated via scripts/skills/generate-agent-skills.mjs --apply and
aligned agent-skills-discovery to the real totals (43 = 23 API + 20 CLI;
handlers return 44 with config-codex-cli). 30/30 discovery+content tests green.
* fix(combo): restrict the #6216 empty-stream failover to truly empty bodies (restores #3399/#3685 contracts)
The 'streaming no recognized content' branch added by #6216 marked ANY
stream that ended without content deltas as invalid — sweeping in two
regression-guarded pass-through contracts: an empty stream terminated by an
explicit 'data: [DONE]' (#3399 context-cache protection) and an incomplete
Claude lifecycle (ping only, no message_start; #3685 — stream-readiness
timeout territory, not failover). Both unit guards were red on the branch
and green on main (86/86 vs 84/86).
The branch now fires only for a truly EMPTY body (zero bytes — the Gemini
HTTP-200-empty case that motivated #6216), tracked via sawAnyBytes. New
guard: '#5976 truly EMPTY streaming body (zero bytes) -> invalid for combo
failover'. 87/87 across both files.
Also in this pre-flight batch:
- agentSkillTools-mcp: api.have upper bound 22 -> 23 (the #6186 catalog
addition updated the totals but missed this bound)
- delete tests/unit/free-provider-rankings-configured-filter.test.ts:
#6251 (server-side configuredOnly/availableOnly) superseded the #6245
client-side toggle it pinned; replacement declared in the test-masking
allowlist (tests/unit/freeProviderRankings-filters.test.ts, 11/11)
* chore(quality): prune stale ESLint suppressions (4,273 -> 4,233)
Entries whose violations no longer exist (cleaned by cycle merges and the
pre-flight fixes) made 'npm run lint' exit 2 with 'suppressions left that do
not occur anymore'. Regenerated via --prune-suppressions; net-new policy
unchanged.
* fix(proxy): #6246 stop the v3.8.44 proxy IP-leak + over-deactivation regression (#6296)
Merged into release/v3.8.45. Reds pré-existentes classificados: dast-smoke (infra), check:file-size (drift de baseline de god-files congelados), e 3 testes de contagem agentSkills stale (43→44 já corrigidos no tip pelo #6186 — somem no squash sobre o tip). Núcleo do fix #6246 (proxy IP-leak + over-deactivation).
* fix(proxy): make "Test All" read-only + add bulk enable/disable (#6246) (#6299)
Merged into release/v3.8.45. Delta do par #6246 (Test-All read-only + bulk enable/disable), reconciliado com o núcleo #6296 já mergeado. CHANGELOG restaurado (ambos bullets do #6246 coexistem). Reds pré-existentes: dast-smoke (infra) + file-size drift.
* fix(resilience): evict sticky affinity on pinned-account failover (#6219) (#6231)
Merged into release/v3.8.45. Sticky affinity failover (#6219). Sincronizado com tip; CHANGELOG restaurado (base bullets preservados, net +1). Reds pré-existentes: dast-smoke + file-size drift.
* fix(sse): drop commentary-phase text in Responses passthrough (#6199) (#6232)
Merged into release/v3.8.45. Responses commentary-phase filter (#6199). Sincronizado; CHANGELOG restaurado net +1. Reds: dast-smoke + file-size drift.
* fix: bug-fix sweep — log path, AgentBridge DNS, opencode-go headers, GitLab Duo tools, M365 EDU (#6197 #6127 #6198 #5997 #6220 #6210) (#6234)
Merged into release/v3.8.45. Bug-fix sweep (#6197 log path, #6127/#6198 AgentBridge DNS, #6210 M365 EDU, #6220 GitLab Duo tools, #5997 opencode-go headers). 27 testes verdes. CHANGELOG restaurado net +5. Reds: dast-smoke + file-size drift.
* fix(docker): add id= to BuildKit cache mounts for strict builders (#6291)
Merged into release/v3.8.45. Dockerfile-only: explicit id= on BuildKit cache mounts (fixes strict-frontend parse error). Reds pré-existentes (dast-smoke/file-size drift) não relacionados a mudança de Dockerfile. Thanks @karimalsalah.
* fix(sse): strip zero-width markers from streamed tool-call arguments (follow-up to #5857) (#6292)
Merged into release/v3.8.45. Strip zero-width markers from streamed tool-call arguments (#5857 follow-up). Test 50/50. CHANGELOG reconciled net +1. Reds pré-existentes (dast-smoke/file-size drift). Thanks @DKotsyuba.
* ci(quality): merge-integrity fast-gates + pre-flight hermetic mode (#6300)
Merged into release/v3.8.45. CI merge-integrity fast-gates (changelog-integrity + agent-skills-sync) + pre-flight hermetic mode. O gate novo detectou 11 SKILL.md gerados fora de sync (drift pré-existente no tip: omni-api-keys endpoints, omni-github-skills do #6186) — regenerados neste PR, Merge-integrity GREEN no CI. Reds restantes base-red (dast-smoke/file-size drift/live-data flaky). Testes novos 17/17.
* fix(a2a): finish the #6186 catalog-count update — 3 hardcoded 22s left in production
#6186 added omni-github-skills (API 22 -> 23) and updated computeCoverage's
total, but left the old count hardcoded in the A2A layer: listCapabilities
metadata reported coverage.api.total 22 (type literal + value) and
SkillCoverageSchema pinned z.literal(22) — so the schema would REJECT the
correct runtime value. Aligned all three to 23 + the unit fixtures
(listCapabilities-a2a, agentSkills-schemas, 46/46 with agentSkillTools-mcp).
* fix(quality): type the 7 net-new 'as any' casts from #6292 (Lint red on the release tip)
#6292 rewrote/added zero-width-marker tests with 7 new 'as any' result casts,
pushing the file past its frozen suppression (84) — and when violations
exceed the suppressed count ESLint reports ALL of them, so the ci.yml Lint
job went red with 90 errors. The 7 new sites get typed shapes (delta /
arguments / choices / output accessors — same pattern as fecf888fd); the
pre-existing debt stays frozen at the exact new count (83). 50/50 tests
green, file lint-clean under the suppressions baseline.
* fix(api): Zod-validate POST /api/github-skills + document new gate envs + pin merge-integrity actions
Three latent heavy-CI reds surfaced by the VPS validation dispatch (the fast
path never runs these gates):
- t06 route-validation: POST /api/github-skills destructured request.json()
blind — a non-array 'targets' would .map-crash. Now validateBody(zod)
with defaults preserved (Hard Rule #7). Guard:
tests/unit/github-skills-route-validation.test.ts (4/4).
- env-doc-sync: document OMNIROUTE_SKIP_SYSTEM_TRUST (#6310) and the
changelog-integrity gate envs CHANGELOG_BASE_REF/ALLOW_CHANGELOG_REMOVALS
(#6300) in .env.example + ENVIRONMENT.md.
- zizmor ratchet: the new merge-integrity job's checkout/setup-node uses were
unpinned (+1 finding, 160 > baseline 159); pinned by SHA -> 158 (< baseline).
* fix(quality): clear the 2 remaining heavy-gate reds on the release tip
- check:error-helper: githubSkillTools.ts (#6186 wave) built MCP install
error results with raw err.message — routed through sanitizeErrorMessage()
(Hard Rule #12; 19/19 agentSkillTools tests green)
- check:mutation-test-coverage: tests/unit/combo-provider-cooldown-sibling.test.ts
(#6216) was missing from stryker.conf tap.testFiles — added so its mutant
kills count on nightly-mutation
* fix(security): 405 method-first for /api/keys/{id}/devices (dast-smoke QUERY check)
Schemathesis's newer unsupported-methods check (unpinned tool drift) sends
QUERY /api/keys/{id}/devices and demands 405 Method Not Allowed; the path had
no HIGH_RISK_METHOD_RULES entry, so the auth layer answered 401 first. Add
the devices rule (GET-only) so undocumented methods get a clean method-first
405 — same pattern as the v3.8.44 TRACE fix. TDD:
tests/unit/dast-method-not-allowed.test.ts gains the devices QUERY case (4/4).
* fix(mitm): test suite and CI must never mutate the OS trust store (OMNIROUTE_SKIP_SYSTEM_TRUST) (#6310)
Incident 2026-07-05 on the self-hosted release runner (VM 113): the
integration test 'POST /cert: installs trust when cert exists' exercised the
REAL install path, wrote a 105-byte fake PEM (FakeMITMCertForTestingOnly)
into /usr/local/share/ca-certificates and update-ca-certificates baked the
invalid entry into ca-certificates.crt — breaking ALL system TLS on the VM
(curl error 77, apt cert failures, and the intermittent gzip-corrupted
next-build artifacts that failed 6/9 e2e shards in run 28754447912). Hosted
runners are ephemeral, so the same mutation went unnoticed for months.
- installCert/uninstallCert: skip the OS dispatch under
OMNIROUTE_SKIP_SYSTEM_TRUST=1 — AFTER the input checks, so the #4546
environment-skip contract (missing file throws -> structured skip) and the
already-installed/not-installed early returns are preserved.
- installTproxyCa/uninstallTproxyCa: same guard, only when no run dep is
injected (DI'd tests keep exercising the full command sequence with mocks).
- tests/_setup/isolateDataDir.ts sets the env for every node:test process;
ci.yml/quality.yml/nightly-release-green.yml set it workflow-wide (e2e runs
the real app outside the test setup).
TDD: tests/unit/system-trust-test-guard.test.ts (guard exported to every test
process; guarded install resolves on a real file without touching the OS;
missing-file contract preserved). 82/82 across the affected cert/tproxy/
agent-bridge suites.
* ci(vps): hermetic nightly pre-flight on the release runner (descoped: e2e/integration/electron stay hosted) (#6305)
* ci(vps): extend the dynamic omni-release runner to e2e/integration/electron + nightly pre-flight
Completes the #6284 rollout to the jobs where the VPS pays the most:
- test-e2e (9 shards, 15-20min/shard hosted — dominated by setup, not tests),
test-integration (2 shards) and electron-package-smoke now pick the
self-hosted omni-release runner under the same gate: vars.USE_VPS_RUNNER
== 'true' AND own-origin (fork PRs never reach self-hosted).
- nightly-release-green (the release pre-flight) becomes runner-dynamic too:
on the VPS it runs in a clean env — no operator OMNIROUTE_API_KEY, no
local noauth CLIs — eliminating the machine-specific false positives that
dominated the 2026-07-05 pre-flight; passes --hermetic (no-op until the
#6300 validator lands, then belt-and-suspenders).
Validation plan (per operator request): release-runner-up.sh -> full ci.yml
workflow_dispatch on this branch exercising e2e/integration/electron on the
VPS (proves playwright --with-deps + xvfb on the runner) -> down.sh -> VM
off verified.
* fix(mitm): test suite and CI must never mutate the OS trust store (OMNIROUTE_SKIP_SYSTEM_TRUST)
Incident 2026-07-05 on the self-hosted release runner (VM 113): the
integration test 'POST /cert: installs trust when cert exists' exercised the
REAL install path, wrote a 105-byte fake PEM (FakeMITMCertForTestingOnly)
into /usr/local/share/ca-certificates and update-ca-certificates baked the
invalid entry into ca-certificates.crt — breaking ALL system TLS on the VM
(curl error 77, apt cert failures, and the intermittent gzip-corrupted
next-build artifacts that failed 6/9 e2e shards in run 28754447912). Hosted
runners are ephemeral, so the same mutation went unnoticed for months.
- installCert/uninstallCert: skip the OS dispatch under
OMNIROUTE_SKIP_SYSTEM_TRUST=1 — AFTER the input checks, so the #4546
environment-skip contract (missing file throws -> structured skip) and the
already-installed/not-installed early returns are preserved.
- installTproxyCa/uninstallTproxyCa: same guard, only when no run dep is
injected (DI'd tests keep exercising the full command sequence with mocks).
- tests/_setup/isolateDataDir.ts sets the env for every node:test process;
ci.yml/quality.yml/nightly-release-green.yml set it workflow-wide (e2e runs
the real app outside the test setup).
TDD: tests/unit/system-trust-test-guard.test.ts (guard exported to every test
process; guarded install resolves on a real file without touching the OS;
missing-file contract preserved). 82/82 across the affected cert/tproxy/
agent-bridge suites.
* ci(vps): descope — e2e/integration/electron stay on hosted runners; keep the hermetic nightly pre-flight dynamic
Validation verdict (runs 28754447912 + 28757670732, VM 113):
- e2e cannot run >1 per VM: both jobs bind port 20128 ('already used') — needs
a per-job port in the playwright runner before any VM rollout.
- concurrent ~1GB artifact downloads truncate on the VM uplink (gzip 'invalid
compressed data' — with 2 runners the e2e shard passed; corruption returned
at 4) — actions/download-artifact has no integrity retry here.
- integration shard 2 exceeded its 15-min timeout twice on the VM.
The VPS remains a win for whole-machine jobs: build/unit/vitest (already
dynamic via #6284) and nightly-release-green (single job, clean env, hermetic
pre-flight) — which this PR keeps.
* chore(quality): v3.8.45 cycle-close file-size rebaseline (Phase 0 drift absorption)
13 files grown by the cycle's merged PRs (#6216 streaming+request-logger UI;
#6251/#6253 dashboard UX) — legitimate merged-feature growth absorbed by the
release captain per the Phase 0 drift policy; all entries stay frozen (cannot
grow further). Justification key: _rebaseline_2026_07_06_v3845_release_close.
* chore(quality): v3.8.45 cycle-close cognitive/cyclomatic rebaseline (Phase 0 drift absorption)
cognitive 867->877 (+10), cyclomatic 2028->2035 (+7) — inherited cycle drift
measured by check:release-green (hermetic) on the release tip; the captain's
pre-flight fixes are gate/test/workflow changes (complexity-neutral).
Justification keys: _rebaseline_2026_07_06_v3845_release_close.
* docs(changelog): v3.8.45 reconciliation — fold Unreleased into the version section, 30 missing bullets, contributors hall
Phase 0a reconciliation (/generate-release): every commit since v3.8.44 now
has a bullet or a Maintenance rollup (82 commits; the only ref-less residues
are the bump/recording commits); #6193 bullet gains its PR ref; #6298
diagnosis credited (@subhansh-dev, landed via #6234); [3.8.44] header dated;
'### 🙌 Contributors' table injected (27 external + maintainer) + 42 i18n
mirrors resynced.
* chore(release): v3.8.45 — 2026-07-06
* fix(resilience): 502/503/504 keep the connection-unavailability path — only the exact 500 skips lockout (#5976 contract)
The #6216 branch used 'status >= 500', so a 503 on a per-model-quota /
openai-compatible provider returned cooldownMs 0 — no model lockout AND no
connection cooldown — hot-looping the failing upstream and breaking the
resilience-http-e2e 'priority combo falls back on 503' guard on the release
PR (the request after a 503 hit the same primary again). #6216's OWN unit
contract pins the narrow behavior ('Gemini 503 should NOT skip cooldown',
combo-provider-cooldown-sibling.test.ts) but computes the condition inline
instead of exercising auth.ts. Code aligned to the tested contract:
status === 500 skips (intermittent, not model-specific); 502/503/504 keep
the pre-#6216 model-lockout path. Validated: the failing integration test
flips red -> green locally (19s, deterministic before).
* fix(security): crypto-backed randomNumericId in doubao-web (CodeQL js/insecure-randomness)
The synthetic Dola device/web id was built from Math.random; CodeQL flags it
as insecure randomness in a security context. Not a secret, but
crypto.getRandomValues costs the same and closes alert #692 at the source.
Doubao executor tests 14/14 green. Alerts #693-695 (incomplete-url-substring
in unit-test asserts) dismissed as false positives per the v3.8.35 precedent
(Hard Rule #14).
* chore(quality): shave the #5976 fix comment back under the auth.ts file-size freeze (2447)
---------
Co-authored-by: Danny S <36470572+kanztu@users.noreply.github.com>
Co-authored-by: Luis Alejandro Vega <LuisAlejandroVega@redesprivadasvirtuales.com>
Co-authored-by: Milan Soni <123074437+Iammilansoni@users.noreply.github.com>
Co-authored-by: R. Beltran <rbeltran8000@gmail.com>
Co-authored-by: VXNCXNX <93332837+VXNCXNX@users.noreply.github.com>
Co-authored-by: Denis Kotsyuba <kocubads96@gmail.com>
Co-authored-by: DKotsyuba <16292493+DKotsyuba@users.noreply.github.com>
Co-authored-by: backryun <bakryun0718@proton.me>
Co-authored-by: Aris <arissunandar399@gmail.com>
Co-authored-by: Ankit <177378174+anki1kr@users.noreply.github.com>
Co-authored-by: Rian Priskanova <rian@evercore.technology>
Co-authored-by: Vittor Guilherme Borges de Oliveira <vittoroliveira.dev@gmail.com>
Co-authored-by: KooshaPari <42529354+KooshaPari@users.noreply.github.com>
Co-authored-by: serverless83 <35410475+serverless83@users.noreply.github.com>
Co-authored-by: Moseyuh333 <148680980+Moseyuh333@users.noreply.github.com>
Co-authored-by: Markus Hartung <mail@hartmark.se>
Co-authored-by: HenryHaniHannoush <karimmalsalah@gmail.com>
🚀 OmniRoute — Gateway AI Gratis (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
Jangan pernah berhenti ngoding. Routing cerdas ke model AI GRATIS & berbiaya rendah dengan fallback otomatis.
Proxy API universal Anda — satu endpoint, 100+ penyedia, tanpa downtime. Kini dengan MCP Server (25 alat), Protokol A2A, Sistem Memori/Skill & Aplikasi Desktop Electron.
Chat Completions • Embeddings • Pembuatan Gambar • Video • Musik • Audio • Reranking • Pencarian Web • MCP Server • Protokol A2A • 100% TypeScript
🌐 Available in: 🇺🇸 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
🖼️ Dashboard Utama
📸 Pratinjau Dashboard
Klik untuk melihat tangkapan layar dashboard
| Halaman | Tangkapan Layar |
|---|---|
| Providers | ![]() |
| Combos | ![]() |
| Analytics | ![]() |
| Health | ![]() |
| Translator | ![]() |
| Settings | ![]() |
| CLI Tools | ![]() |
| Usage Logs | ![]() |
| Endpoints | ![]() |
🤖 Penyedia AI Gratis untuk agen coding favorit Anda
Hubungkan IDE atau alat CLI berbasis AI apa pun melalui OmniRoute — gateway API gratis untuk coding tanpa batas.
|
OpenClaw ⭐ 205K |
NanoBot ⭐ 20.9K |
PicoClaw ⭐ 14.6K |
ZeroClaw ⭐ 9.9K |
IronClaw ⭐ 2.1K |
|
OpenCode ⭐ 106K |
Codex CLI ⭐ 60.8K |
Claude Code ⭐ 67.3K |
Kilo Code ⭐ 15.5K |
📡 Semua agen terhubung melalui http://localhost:20128/v1 atau http://cloud.omniroute.online/v1 — satu konfigurasi, model dan kuota tak terbatas
🤔 Mengapa OmniRoute?
Berhenti membuang uang dan terus mencapai batas:
Kuota langganan kedaluwarsa tanpa digunakan setiap bulan
Batas rate menghentikan Anda di tengah sesi coding
API mahal ($20-50/bulan per penyedia)
Perpindahan manual antar penyedia
OmniRoute mengatasi ini:
- ✅ Maksimalkan langganan - Pantau kuota, gunakan setiap bit sebelum reset
- ✅ Fallback otomatis - Langganan → Kunci API → Murah → Gratis, tanpa downtime
- ✅ Multi-akun - Round-robin antar akun per penyedia
📧 Dukungan
💬 Bergabunglah dengan komunitas kami! Grup WhatsApp — Dapatkan bantuan, berbagi tips, dan tetap terupdate.
- Website: omniroute.online
- GitHub: github.com/diegosouzapw/OmniRoute
- Issues: github.com/diegosouzapw/OmniRoute/issues
- WhatsApp: Grup Komunitas
- Berkontribusi: Lihat CONTRIBUTING.md, buka PR, atau pilih
good first issue
🐛 Melaporkan Bug?
Saat membuka issue, jalankan perintah system-info dan lampirkan file yang dihasilkan:
npm run system-info
Perintah ini menghasilkan system-info.txt berisi versi Node.js, versi OmniRoute, detail OS, alat CLI yang terpasang (qoder, gemini, claude, codex, antigravity, droid, dll.), status Docker/PM2, dan paket sistem — semua yang dibutuhkan untuk mereproduksi masalah Anda dengan cepat. Lampirkan file tersebut langsung ke GitHub issue Anda.
🔄 Cara Kerjanya
┌─────────────┐
│ Your CLI │ (Claude Code, Codex, OpenClaw, Cursor, Cline...)
│ Tool │
└──────┬──────┘
│ http://localhost:20128/v1
↓
┌─────────────────────────────────────────┐
│ OmniRoute (Router Cerdas) │
│ • Translasi format (OpenAI ↔ Claude) │
│ • Pelacakan kuota + Embeddings + Gambar│
│ • Refresh token otomatis │
└──────┬──────────────────────────────────┘
│
├─→ [Tier 1: LANGGANAN] Claude Code, Codex
│ ↓ kuota habis
├─→ [Tier 2: KUNCI API] DeepSeek, Groq, xAI, Mistral, NVIDIA NIM, dll.
│ ↓ batas anggaran
├─→ [Tier 3: MURAH] GLM ($0.6/1M), MiniMax ($0.2/1M)
│ ↓ batas anggaran
└─→ [Tier 4: GRATIS] Qoder, Qwen, Kiro (tidak terbatas)
Hasil: Tidak pernah berhenti coding, biaya minimal
🎯 Apa yang Diselesaikan OmniRoute — 30 Masalah Nyata & Kasus Penggunaan
Setiap developer yang menggunakan alat AI menghadapi masalah ini setiap hari. OmniRoute dibangun untuk menyelesaikannya semua — dari pembengkakan biaya hingga pemblokiran regional, dari alur OAuth yang rusak hingga operasi protokol dan observabilitas enterprise.
💸 1. "Saya membayar langganan mahal tapi masih terganggu oleh batas"
Developer membayar $20–200/bulan untuk Claude Pro, Codex Pro, atau GitHub Copilot. Meski sudah membayar, kuota memiliki batas — 5 jam penggunaan, batas mingguan, atau batas rate per menit. Di tengah sesi coding, penyedia berhenti merespons dan developer kehilangan fokus dan produktivitas.
Cara OmniRoute menyelesaikannya:
- Fallback 4-Tier Cerdas — Jika kuota langganan habis, secara otomatis mengarahkan ke Kunci API → Murah → Gratis tanpa intervensi manual
- Pelacakan Batas Penyedia — Snapshot kuota yang di-cache diperbarui sesuai jadwal sisi server (default
PROVIDER_LIMITS_SYNC_INTERVAL_MINUTES=70) dengan pembaruan manual tersedia di UI - Dukungan Multi-Akun — Beberapa akun per penyedia dengan round-robin otomatis — saat satu habis, beralih ke berikutnya
- Combo Kustom — Rantai fallback yang dapat dikustomisasi dengan 13 strategi penyeimbangan (priority, weighted, fill-first, round-robin, P2C, random, least-used, cost-optimized, strict-random, auto, lkgp, context-optimized, context-relay)
- Pembangun Combo Terstruktur — Buat combo langkah demi langkah dengan pemilihan penyedia + model + akun yang eksplisit, termasuk penyedia berulang dan target akun tetap
- P2C Berbasis Kuota — Pemilihan akun power-of-two kini mempertimbangkan kapasitas kuota, backoff, kesalahan terkini, dan penggunaan berturut-turut
- Kuota Bisnis Codex — Pemantauan kuota workspace Business/Team langsung di dashboard
🔌 2. "Saya perlu menggunakan beberapa penyedia tetapi masing-masing memiliki API berbeda"
OpenAI menggunakan satu format, Claude (Anthropic) menggunakan format lain, Gemini pun berbeda lagi. Jika seorang developer ingin menguji model dari penyedia berbeda atau melakukan fallback di antara mereka, mereka perlu mengonfigurasi ulang SDK, mengganti endpoint, dan menangani format yang tidak kompatibel. Penyedia kustom (FriendLI, NIM) memiliki endpoint model non-standar.
Cara OmniRoute menyelesaikannya:
- Endpoint Terpadu — Satu
http://localhost:20128/v1berfungsi sebagai proxy untuk semua 100+ penyedia - Translasi Format — Otomatis dan transparan: OpenAI ↔ Claude ↔ Gemini ↔ Responses API
- Sanitasi Respons — Menghapus field non-standar (
x_groq,usage_breakdown,service_tier) yang merusak OpenAI SDK v1.83+ - Normalisasi Peran — Mengonversi
developer→systemuntuk penyedia non-OpenAI;system→useruntuk GLM/ERNIE - Ekstraksi Tag Think — Mengekstrak blok
<think>dari model seperti DeepSeek R1 kereasoning_contentyang terstandarisasi - Output Terstruktur untuk Gemini — Konversi otomatis
json_schema→responseMimeType/responseSchema streamdefault kefalse— Selaras dengan spesifikasi OpenAI, menghindari SSE tak terduga di SDK Python/Rust/Go
🌐 3. "Penyedia AI saya memblokir wilayah/negara saya"
Penyedia seperti OpenAI/Codex memblokir akses dari wilayah geografis tertentu. Pengguna mendapat kesalahan seperti unsupported_country_region_territory saat OAuth dan koneksi API. Ini sangat membuat frustasi para developer dari negara berkembang.
Cara OmniRoute menyelesaikannya:
- Konfigurasi Proxy 3-Level — Proxy yang dapat dikonfigurasi di 3 level: global (semua lalu lintas), per-penyedia (hanya satu penyedia), dan per-koneksi/kunci
- Lencana Proxy Berkode Warna — Indikator visual: 🟢 proxy global, 🟡 proxy penyedia, 🔵 proxy koneksi, selalu menampilkan IP
- Pertukaran Token OAuth Melalui Proxy — Alur OAuth juga melewati proxy, menyelesaikan masalah
unsupported_country_region_territory - Uji Koneksi via Proxy — Uji koneksi menggunakan proxy yang dikonfigurasi (tidak ada lagi bypass langsung)
- Dukungan SOCKS5 — Dukungan proxy SOCKS5 penuh untuk routing keluar
- Spoofing Sidik Jari TLS — Sidik jari TLS seperti browser melalui
wreq-jsuntuk melewati deteksi bot - 🔏 Pencocokan Sidik Jari CLI — Menyusun ulang header dan field body agar sesuai dengan tanda tangan biner CLI asli, sangat mengurangi risiko pemanduan akun. IP proxy tetap dipertahankan — Anda mendapatkan kesiluman dan penyamaran IP secara bersamaan
🆓 4. "Saya ingin menggunakan AI untuk coding tapi tidak punya uang"
Tidak semua orang bisa membayar $20–200/bulan untuk langganan AI. Pelajar, developer dari negara berkembang, penghobi, dan freelancer membutuhkan akses ke model berkualitas tanpa biaya sama sekali.
Cara OmniRoute menyelesaikannya:
- Ollama Cloud — Model Ollama yang di-host di cloud pada
api.ollama.comdengan tier "Light usage" gratis; gunakan prefixollamacloud/<model> - Combo Hanya Gratis — Rantai
if/kimi-k2-thinking → qw/qwen3-coder-plus= $0/bulan tanpa downtime - Akses Gratis NVIDIA NIM — ~40 RPM akses gratis selamanya untuk 70+ model di build.nvidia.com (beralih dari kredit ke batas rate murni)
- Strategi Optimasi Biaya — Strategi routing yang secara otomatis memilih penyedia termurah yang tersedia
🔒 5. "Saya perlu melindungi gateway AI saya dari akses tidak sah"
Saat mengekspos gateway AI ke jaringan (LAN, VPS, Docker), siapa pun yang memiliki alamat tersebut dapat mengonsumsi token/kuota developer. Tanpa perlindungan, API rentan terhadap penyalahgunaan, injeksi prompt, dan eksploitasi.
Cara OmniRoute menyelesaikannya:
- Manajemen Kunci API — Pembuatan, rotasi, dan pembatasan lingkup per penyedia dengan halaman
/dashboard/api-manageryang didedikasikan - Izin Tingkat Model — Batasi kunci API ke model tertentu (
openai/*, pola wildcard), dengan toggle Izinkan Semua/Batasi - Perlindungan Endpoint API — Wajibkan kunci untuk
/v1/modelsdan blokir penyedia tertentu dari daftar - Auth Guard + Perlindungan CSRF — Semua rute dashboard dilindungi dengan middleware
withAuth+ token CSRF - Pembatas Rate — Pembatasan rate per-IP dengan jendela yang dapat dikonfigurasi
- Penyaringan IP — Allowlist/blocklist untuk kontrol akses
- Penjaga Injeksi Prompt — Sanitasi terhadap pola prompt berbahaya
- Enkripsi AES-256-GCM — Kredensial dienkripsi saat disimpan
🛑 6. "Penyedia saya mati dan saya kehilangan alur coding"
Penyedia AI bisa menjadi tidak stabil, mengembalikan kesalahan 5xx, atau mencapai batas rate sementara. Jika developer bergantung pada satu penyedia, mereka akan terganggu. Tanpa circuit breaker, percobaan ulang berulang dapat menyebabkan aplikasi crash.
Cara OmniRoute menyelesaikannya:
- Antrian & Pacing Permintaan — Bucket permintaan per-koneksi memperhalus lonjakan sebelum mencapai batas rate upstream
- Pendinginan Koneksi — Satu koneksi mendingin setelah kegagalan yang dapat dicoba ulang dengan petunjuk
Retry-Afterupstream opsional dan backoff eksponensial - Circuit Breaker Penyedia — Penyedia hanya trip setelah fallback habis dan permintaan penyedia masih gagal dengan kesalahan transien seluruh penyedia; batas rate
429yang terikat koneksi tetap di Pendinginan Koneksi - Tunggu Pendinginan — Server dapat menunggu pendinginan koneksi paling awal berakhir dan mencoba ulang permintaan klien yang sama secara otomatis
- Anti-Thundering Herd — Perlindungan mutex + semaphore terhadap badai percobaan ulang bersamaan
- Rantai Fallback Combo — Jika penyedia utama gagal, secara otomatis jatuh ke rantai berikutnya tanpa intervensi
- Dashboard Kesehatan — Pemantauan uptime, status circuit breaker penyedia, pendinginan, statistik cache, latensi p50/p95/p99
🔧 7. "Mengonfigurasi setiap alat AI membosankan dan berulang"
Cara OmniRoute menyelesaikannya:
- Dashboard Alat CLI — Halaman khusus dengan pengaturan satu klik untuk Claude Code, Codex CLI, OpenClaw, Kilo Code, Antigravity, Cline
- Generator Konfigurasi GitHub Copilot — Menghasilkan
chatLanguageModels.jsonuntuk VS Code dengan pemilihan model massal - Wizard Orientasi — Pengaturan terpandu 4 langkah untuk pengguna pertama kali
- Satu endpoint, semua model — Konfigurasi
http://localhost:20128/v1sekali, akses 100+ penyedia
🔑 8. "Mengelola token OAuth dari beberapa penyedia adalah mimpi buruk"
Cara OmniRoute menyelesaikannya:
- Refresh Token Otomatis — Token OAuth diperbarui di latar belakang sebelum kedaluwarsa
- OAuth Multi-Akun — Beberapa akun per penyedia melalui ekstraksi token JWT/ID
- Perbaikan OAuth LAN/Jarak Jauh — Deteksi IP privat untuk
redirect_uri+ mode URL manual untuk server jarak jauh - OAuth di Balik Nginx — Menggunakan
window.location.originuntuk kompatibilitas reverse proxy - Panduan OAuth Jarak Jauh — Panduan langkah demi langkah untuk kredensial Google Cloud di VPS/Docker
📊 9. "Saya tidak tahu berapa banyak yang saya belanjakan atau di mana"
Developer menggunakan beberapa penyedia berbayar tetapi tidak memiliki tampilan pengeluaran yang terpadu. Setiap penyedia memiliki dashboard penagihan sendiri, tetapi tidak ada tampilan konsolidasi. Biaya tak terduga bisa menumpuk.
Cara OmniRoute menyelesaikannya:
- Dashboard Analitik Biaya — Pelacakan biaya per-token dan manajemen anggaran per penyedia
- Batas Anggaran per Tier — Batas pengeluaran per tier yang memicu fallback otomatis
- Konfigurasi Harga Per-Model — Harga yang dapat dikonfigurasi per model
- Statistik Penggunaan Per Kunci API — Jumlah permintaan dan cap waktu terakhir digunakan per kunci
- Dashboard Analitik — Kartu statistik, grafik penggunaan model, tabel penyedia dengan tingkat keberhasilan dan latensi
🐛 10. "Saya tidak dapat mendiagnosis kesalahan dan masalah dalam panggilan AI"
Saat panggilan gagal, pengembang tidak mengetahui apakah itu batas kecepatan, token kedaluwarsa, format salah, atau kesalahan penyedia. Log terfragmentasi di terminal yang berbeda. Tanpa observabilitas, debugging adalah trial-and-error.
Bagaimana OmniRoute menyelesaikannya:
- Dasbor Log Terpadu — 4 tab: Log Permintaan, Log Proksi, Log Audit, Konsol
- Penampil Log Konsol — Penampil gaya terminal real-time dengan level kode warna, gulir otomatis, pencarian, filter
- Log Ringkasan SQLite — Indeks log permintaan dan proksi tetap dapat dikueri saat restart tanpa memuat blob payload besar ke SQLite
- Translator Playground — 4 mode debugging: Playground (terjemahan format), Chat Tester (pulang pergi), Test Bench (batch), Live Monitor (real-time)
- Telemetri Permintaan — latensi p50/p95/p99 + penelusuran X-Request-Id
- Artefak Detail Berbasis File — Log aplikasi dirotasi berdasarkan ukuran, hari penyimpanan, dan jumlah arsip; payload permintaan/respons terperinci ada di
DATA_DIR/call_logs/dan diputar secara independen dari ringkasan SQLite - Laporan Info Sistem —
npm run system-infomenghasilkansystem-info.txtdengan lingkungan lengkap Anda (versi Node, versi OmniRoute, OS, alat CLI, status Docker/PM2). Lampirkan saat melaporkan masalah untuk triase instan.
🏗️ 11. "Menyebarkan dan memelihara gateway itu rumit"
Menginstal, mengonfigurasi, dan memelihara proksi AI di berbagai lingkungan (lokal, VPS, Docker, cloud) membutuhkan banyak tenaga. Masalah seperti jalur hardcode, EACCES pada direktori, konflik port, dan pembangunan lintas platform menambah gesekan.
Bagaimana OmniRoute menyelesaikannya:
- instal global npm —
npm install -g omniroute && omniroute— selesai - Docker Multi-Platform — asli AMD64 + ARM64 (Apple Silicon, AWS Graviton, Raspberry Pi)
- Docker Compose Profiles —
base(tanpa alat CLI) dancli(dengan Claude Code, Codex, OpenClaw) - Aplikasi Desktop Electron — Aplikasi asli untuk Windows/macOS/Linux dengan baki sistem, mulai otomatis, mode offline
- Mode Port Terpisah — API dan Dasbor pada port terpisah untuk skenario tingkat lanjut (proksi terbalik, jaringan kontainer)
- Cloud Sync — Konfigurasi sinkronisasi antar perangkat melalui Cloudflare Workers
- DB Backups — Pencadangan otomatis, pemulihan, ekspor dan impor semua pengaturan, dengan
DISABLE_SQLITE_AUTO_BACKUPuntuk pencadangan yang dikelola secara eksternal
🌍 12. "Antarmuka hanya berbahasa Inggris dan tim saya tidak bisa berbahasa Inggris"
Tim di negara-negara yang tidak berbahasa Inggris, khususnya di Amerika Latin, Asia, dan Eropa, kesulitan dengan antarmuka yang hanya berbahasa Inggris. Hambatan bahasa mengurangi adopsi dan meningkatkan kesalahan konfigurasi.
Bagaimana OmniRoute menyelesaikannya:
- Dasbor i18n — 30 Bahasa — 500+ tombol diterjemahkan termasuk Arab, Bulgaria, Denmark, Jerman, Spanyol, Finlandia, Prancis, Ibrani, Hindi, Hungaria, Indonesia, Italia, Jepang, Korea, Melayu, Belanda, Norwegia, Polandia, Portugis (PT/BR), Rumania, Rusia, Slovakia, Swedia, Thailand, Ukraina, Vietnam, China, Filipina, Inggris
- Dukungan RTL — Dukungan kanan ke kiri untuk bahasa Arab dan Ibrani
- README Multi-Bahasa — 30 terjemahan dokumentasi lengkap
- Pemilih Bahasa — Ikon bola dunia di header untuk peralihan waktu nyata
🔄 13. "Saya memerlukan lebih dari sekedar chat — saya memerlukan embeddings, gambar, audio"
AI bukan hanya penyelesaian obrolan. Pengembang perlu membuat gambar, mentranskripsikan audio, membuat penyematan untuk RAG, mengubah peringkat dokumen, dan memoderasi konten. Setiap API memiliki titik akhir dan format yang berbeda.
Bagaimana OmniRoute menyelesaikannya:
- Sematan —
/v1/embeddingsdengan 6 penyedia dan 9+ model - Pembuatan Gambar —
/v1/images/generationsdengan 10 penyedia dan 20+ model (OpenAI, xAI, Together, Fireworks, Nebius, Hyperbolic, NanoBanana, Antigravity, SD WebUI, ComfyUI) - Teks-ke-Video —
/v1/videos/generations— ComfyUI (AnimateDiff, SVD) dan SD WebUI - Teks-ke-Musik —
/v1/music/generations— ComfyUI (Audio Terbuka Stabil, MusicGen) - Transkripsi Audio —
/v1/audio/transcriptions— Whisper + Nvidia NIM, HuggingFace, Qwen3 - Text-to-Speech —
/v1/audio/speech— ElevenLabs, Nvidia NIM, HuggingFace, Coqui, Tortoise, Qwen3, Inworld, Cartesia, PlayHT, + penyedia yang ada - Moderasi —
/v1/moderations— Pemeriksaan keamanan konten - Pemeringkatan ulang —
/v1/rerank— Pemeringkatan ulang relevansi dokumen - Respon API — Dukungan penuh
/v1/responsesuntuk Codex
🧪 14. "Saya tidak punya cara untuk menguji dan membandingkan kualitas antar model"
Pengembang ingin mengetahui model mana yang terbaik untuk kasus penggunaan mereka — kode, terjemahan, penalaran — tetapi membandingkan secara manual itu lambat. Tidak ada alat evaluasi terintegrasi.
Bagaimana OmniRoute menyelesaikannya:
- Evaluasi LLM — Pengujian set emas dengan 10 kasus yang dimuat sebelumnya yang mencakup salam, matematika, geografi, pembuatan kode, kepatuhan JSON, terjemahan, penurunan harga, penolakan keamanan
- 4 Strategi Pertandingan —
exact,contains,regex,custom(fungsi JS) - Bangku Tes Taman Bermain Penerjemah — Pengujian batch dengan banyak masukan dan keluaran yang diharapkan, perbandingan lintas penyedia
- Penguji Obrolan — Perjalanan bolak-balik penuh dengan rendering respons visual
- Monitor Langsung — Aliran real-time dari semua permintaan yang mengalir melalui proxy
📈 15. "Saya perlu meningkatkan skala tanpa kehilangan performa"
Seiring bertambahnya volume permintaan, tanpa menyimpan pertanyaan yang sama akan menghasilkan biaya duplikat. Tanpa idempotensi, permintaan duplikat akan membuang-buang pemrosesan. Batasan tarif per penyedia harus dipatuhi.
Bagaimana OmniRoute menyelesaikannya:
- Cache Semantik — Cache dua tingkat (tanda tangan + semantik) mengurangi biaya dan latensi
- Request Idempoency — Jendela deduplikasi 5 detik untuk permintaan yang identik
- Deteksi Batas Tarif — RPM per penyedia, selisih minimum, dan pelacakan serentak maks
- Antrian & Kecepatan Permintaan — Antrean, kecepatan, dan kecepatan konkurensi yang dapat dikonfigurasi secara default di Pengaturan → Ketahanan
- Cache Validasi Kunci API — cache 3 tingkat untuk kinerja produksi
- Dasbor Kesehatan dengan Telemetri — latensi p50/p95/p99, statistik cache, waktu aktif
🤖 16. "Saya ingin mengontrol perilaku model secara global"
Pengembang yang menginginkan semua respons dalam bahasa tertentu, dengan nada tertentu, atau ingin membatasi token penalaran. Mengonfigurasi ini di setiap alat/permintaan tidak praktis.
Bagaimana OmniRoute menyelesaikannya:
- Injeksi Perintah Sistem — Perintah global diterapkan ke semua permintaan
- Validasi Anggaran Berpikir — Kontrol alokasi token penalaran per permintaan (passthrough, otomatis, kustom, adaptif)
- 9 Strategi Perutean — Strategi global yang menentukan cara permintaan didistribusikan
- Wildcard Router — pola
provider/*merutekan secara dinamis ke penyedia mana pun - Combo Aktifkan/Nonaktifkan Toggle — Beralih kombo langsung dari dasbor
- Pengurutan Kombo Manual — Seret kartu kombo berdasarkan pegangan dan pertahankan pesanan di SQLite
- Toggle Penyedia — Mengaktifkan/menonaktifkan semua koneksi untuk penyedia dengan satu klik
- Penyedia yang Diblokir — Kecualikan penyedia tertentu dari daftar
/v1/models
🧰 17. "Saya membutuhkan alat MCP sebagai kemampuan produk kelas satu"
Many AI gateways expose MCP only as a hidden implementation detail. Teams need a visible, manageable operation layer.
Bagaimana OmniRoute menyelesaikannya:
- MCP muncul di navigasi dasbor dan tab protokol titik akhir
- Halaman manajemen MCP khusus dengan proses, alat, cakupan, dan audit
- Mulai cepat bawaan untuk
omniroute --mcpdan orientasi klien
🧠 18. "Saya memerlukan orkestrasi A2A dengan jalur tugas sinkronisasi + streaming"
Alur kerja agen memerlukan balasan langsung dan eksekusi streaming jangka panjang dengan kontrol siklus hidup.
Bagaimana OmniRoute menyelesaikannya:
- Titik akhir A2A JSON-RPC (
POST /a2a) denganmessage/senddanmessage/stream - Streaming SSE dengan propagasi status terminal
- API siklus hidup tugas untuk
tasks/getdantasks/cancel
🛰️ 19. "Saya membutuhkan kesehatan proses MCP yang nyata, bukan status yang dapat ditebak"
Tim operasional perlu mengetahui apakah MCP benar-benar aktif, bukan hanya apakah API dapat dijangkau.
Bagaimana OmniRoute menyelesaikannya:
- File detak jantung runtime dengan PID, stempel waktu, transportasi, jumlah alat, dan mode cakupan
- API status MCP menggabungkan detak jantung + aktivitas terkini
- Kartu status UI untuk kesegaran proses/waktu aktif/detak jantung
📋 20. "Saya memerlukan eksekusi alat MCP yang dapat diaudit"
Saat alat mengubah konfigurasi atau memicu tindakan operasi, tim memerlukan kemampuan penelusuran forensik.
Bagaimana OmniRoute menyelesaikannya:
- Pencatatan audit yang didukung SQLite untuk panggilan alat MCP
- Filter berdasarkan alat, keberhasilan/kegagalan, kunci API, dan penomoran halaman
- Tabel audit dasbor + titik akhir statistik untuk otomatisasi
🔐 21. "Saya memerlukan izin MCP terbatas per integrasi"
Different clients should have least-privilege access to tool categories.
Bagaimana OmniRoute menyelesaikannya:
- 10 cakupan MCP granular untuk akses alat terkontrol
- Penegakan cakupan dan visibilitas di UI manajemen MCP
- Postur default yang aman untuk perkakas operasional
⚙️ 22. "Saya memerlukan kontrol operasional tanpa memindahkan"
Tim memerlukan perubahan runtime yang cepat selama insiden atau peristiwa biaya.
Bagaimana OmniRoute menyelesaikannya:
- Beralih aktivasi kombo langsung dari dasbor MCP
- Sesuaikan pengaturan antrean, cooldown, pemutus, dan tunggu dari halaman Ketahanan khusus
- Tinjau status pemutus penyedia langsung dari dasbor Kesehatan
🔄 23. "Saya memerlukan visibilitas dan pembatalan siklus hidup tugas A2A langsung"
Without lifecycle visibility, task incidents become hard to triage.
Bagaimana OmniRoute menyelesaikannya:
- Daftar tugas/pemfilteran berdasarkan status/keterampilan dengan penomoran halaman
- Telusuri metadata tugas, peristiwa, dan artefak
- Titik akhir pembatalan tugas dan tindakan UI dengan konfirmasi
🌊 24. "Saya memerlukan metrik aliran aktif untuk memuat A2A"
Alur kerja streaming memerlukan wawasan operasional tentang konkurensi dan koneksi langsung.
Bagaimana OmniRoute menyelesaikannya:
- Penghitung aliran aktif terintegrasi ke dalam status A2A
- Stempel waktu tugas terakhir dan jumlah per negara bagian
- Kartu dasbor A2A untuk pemantauan operasi waktu nyata
🪪 25. "Saya memerlukan penemuan agen standar untuk klien"
Klien dan orkestra eksternal memerlukan metadata yang dapat dibaca mesin untuk orientasi.
Bagaimana OmniRoute menyelesaikannya:
- Kartu Agen terungkap di
/.well-known/agent.json - Kemampuan dan keterampilan yang ditunjukkan dalam manajemen UI
- API status A2A mencakup metadata penemuan untuk otomatisasi
🧭 26. "Saya memerlukan kemampuan protokol untuk ditemukan di UX produk"
If users cannot discover protocol surfaces, adoption and support quality drop.
Bagaimana OmniRoute menyelesaikannya:
- Halaman Endpoint terkonsolidasi dengan tab untuk Proxy, MCP, A2A, dan API Endpoints
- Pengalih status layanan inline (Online/Offline) untuk MCP dan A2A
- Tautan dari ikhtisar ke tab manajemen khusus
🧪 27. "Saya memerlukan validasi protokol end-to-end dengan klien nyata"
Mock tests are not enough to validate protocol compatibility before release.
Bagaimana OmniRoute menyelesaikannya:
- Suite E2E yang mem-boot aplikasi dan menggunakan transportasi klien MCP SDK yang sebenarnya
- Klien A2A menguji penemuan, pengiriman, streaming, dapatkan, dan pembatalan aliran
- Periksa silang pernyataan terhadap audit MCP dan API tugas A2A
📡 28. "Saya memerlukan observabilitas terpadu di semua antarmuka"
Splitting observability by protocol creates blind spots and longer MTTR.
Bagaimana OmniRoute menyelesaikannya:
- Dasbor/log/analitik terpadu dalam satu produk
- Kesehatan + audit + permintaan telemetri di seluruh lapisan OpenAI, MCP, dan A2A
- API Operasional untuk status dan otomatisasi
💼 29. "Saya memerlukan satu runtime untuk proxy + alat + orkestrasi agen"
Menjalankan banyak layanan terpisah akan meningkatkan biaya operasional dan mode kegagalan.
Bagaimana OmniRoute menyelesaikannya:
- Proksi yang kompatibel dengan OpenAI, server MCP, dan server A2A dalam satu tumpukan
- Otentikasi bersama, ketahanan, penyimpanan data, dan kemampuan observasi
- Model kebijakan yang konsisten di seluruh platform interaksi
🚀 30. "Saya perlu mengirim workflow agentic tanpa tumpukan glue code"
Tim kehilangan kecepatan saat menggabungkan beberapa layanan dan skrip ad-hoc.
Bagaimana OmniRoute menyelesaikannya:
- Strategi titik akhir terpadu untuk klien dan agen
- UI manajemen protokol bawaan dan jalur validasi asap
- Fondasi siap produksi (keamanan, logging, ketahanan, cadangan)
📚 31. "Sesi panjang saya crash karena batas 'context_length_exceeded'"
Selama proses debug mendalam, riwayat panjang dengan hasil alat dengan cepat melampaui jendela token penyedia, menyebabkan permintaan gagal dan konteks tidak ada lagi.
Bagaimana OmniRoute menyelesaikannya:
- Kompresi Konteks Proaktif — Mengevaluasi anggaran token sebelum permintaan mencapai hulu dan secara proaktif memangkas riwayat percakapan lama dengan mekanisme pencarian biner yang cerdas.
- Pengaman Integritas Struktural — Secara otomatis melacak definisi
tool_useyang eksplisit dan memastikan bahwa jika masukan alat terpotong,tool_resultyang terkait juga dihapus dengan aman, sehingga mencegah kesalahan validasi API. - Penghapusan Multi-Lapisan — Secara progresif menghapus pesan sistem, pesan biasa, dan akhirnya menerapkan batas panjang yang ketat tanpa merusak logika percakapan.
Contoh Playbook (Kasus Penggunaan Terintegrasi)
Playbook A: Maximize paid subscription + cheap backup
Combo: "maximize-claude"
1. cc/claude-opus-4-7
2. glm/glm-4.7
3. if/kimi-k2-thinking
Monthly cost: $20 + small backup spend
Outcome: higher quality, near-zero interruption
Playbook B: Tumpukan coding tanpa biaya
Combo: "free-forever"
1. if/kimi-k2-thinking (unlimited free)
2. qw/qwen3-coder-plus (unlimited free)
Monthly cost: $0
Outcome: stable free coding workflow
Playbook C: Rantai fallback yang selalu aktif 24/7
Combo: "always-on"
1. cc/claude-opus-4-7
2. cx/gpt-5.2-codex
3. glm/glm-4.7
4. minimax/MiniMax-M2.1
5. if/kimi-k2-thinking
Outcome: deep fallback depth for deadline-critical workloads
Playbook D: Operasi agen dengan MCP + A2A
1) Start MCP transport (`omniroute --mcp`) for tool-driven operations
2) Run A2A tasks via `message/send` and `message/stream`
3) Observe via /dashboard/endpoint (MCP and A2A tabs)
4) Toggle services via inline status controls
🆓 Mulai Gratis — Tanpa Biaya Konfigurasi
Siapkan pengkodean AI dalam hitungan menit di $0/bulan. Hubungkan akun gratis ini dan gunakan kombo Free Stack bawaan.
| Step | Action | Providers Unlocked |
|---|---|---|
| 1 | Connect Kiro (AWS Builder ID OAuth) | Claude Sonnet 4.5, Haiku 4.5 — unlimited |
| 2 | Connect Qoder (Google OAuth) | kimi-k2-thinking, qwen3-coder-plus, deepseek-r1... — unlimited |
| 3 | Connect Qwen (Device Code) | qwen3-coder-plus, qwen3-coder-flash... — unlimited |
| 4 | /dashboard/combos → Templat Tumpukan Gratis ($0) |
Round-robin semua penyedia gratis secara otomatis |
Arahkan IDE/CLI apa pun ke: http://localhost:20128/v1 · Kunci API: any-string · Selesai.
Cakupan ekstra opsional (juga gratis): Kunci API Groq (gratis 30 RPM), NVIDIA NIM (gratis 40 RPM, 70+ model), Cerebras (1 juta tok/hari), kunci API LongCat (50 juta token/hari!), Cloudflare Workers AI (10 ribu neuron/hari, 50+ model).
Mulai Cepat
1) Instal dan jalankan
npm install -g omniroute
omniroute
pengguna pnpm: Pass
--allow-buildat install time to enable native build scripts required bybetter-sqlite3and@swc/core(theapprove-builds -gcommand is not supported for global installs on pnpm v11):pnpm add -g omniroute@latest --allow-build=better-sqlite3 --allow-build=@swc/core omniroute
Dasbor terbuka di http://localhost:20128 dan URL dasar API adalah http://localhost:20128/v1.
Arch Linux (AUR)
Pengguna Arch Linux dapat menginstal AUR package, yang menginstal OmniRoute dan menyediakan layanan pengguna systemd:
yay -S omniroute-bin
systemctl --user enable --now omniroute.service
| Command | Description |
|---|---|
omniroute |
Mulai server (PORT=20128, API dan dasbor pada port yang sama) |
omniroute --port 3000 |
Set canonical/API port to 3000 |
omniroute --mcp |
Mulai server MCP (stdio transport) |
omniroute --no-open |
Don't auto-open browser |
omniroute --help |
Show help |
Optional split-port mode:
PORT=20128 DASHBOARD_PORT=20129 omniroute
# API: http://localhost:20128/v1
# Dashboard: http://localhost:20129
2) Menghapus Instalasi
Saat Anda tidak lagi memerlukan OmniRoute, kami menyediakan dua skrip cepat untuk penghapusan bersih:
| Command | Action |
|---|---|
npm run uninstall |
Menghapus aplikasi sistem tetapi menyimpan DB dan konfigurasi Anda di ~/.omniroute. |
npm run uninstall:full |
Menghapus aplikasi DAN secara permanen menghapus semua konfigurasi, kunci, dan database. |
Catatan: Untuk menjalankan perintah ini, navigasikan ke folder proyek OmniRoute (jika Anda mengkloningnya) dan jalankan. Alternatifnya, jika diinstal secara global, Anda cukup menjalankan
npm uninstall -g omniroute.
Batas Waktu Streaming yang Berlangsung Lama
Untuk sebagian besar penerapan, Anda hanya memerlukan:
| Variable | Default | Purpose |
|---|---|---|
REQUEST_TIMEOUT_MS |
600000 |
Garis dasar bersama untuk batas waktu mulai respons upstream, batas waktu Undici yang tersembunyi, permintaan sidik jari TLS, dan batas waktu permintaan/proksi jembatan API |
STREAM_IDLE_TIMEOUT_MS |
inherits REQUEST_TIMEOUT_MS |
Kesenjangan maksimum antara potongan streaming sebelum OmniRoute membatalkan aliran SSE |
Kompatibilitas mundur dipertahankan: FETCH_TIMEOUT_MS, API_BRIDGE_PROXY_TIMEOUT_MS, dan var batas waktu per lapisan lainnya yang ada masih berfungsi dan menggantikan garis dasar bersama.
Untuk upstream yang kompatibel dengan Kode Claude (anthropic-compatible-cc-*), OmniRoute juga memperoleh header X-Stainless-Timeout keluar dari batas waktu pengambilan yang diselesaikan sehingga batas waktu baca sisi penyedia tetap selaras dengan konfigurasi env Anda.
Untuk reverse proxy pihak ketiga yang kompatibel dengan Claude Code, OmniRoute tetap menggunakan default
anthropic-beta disetel konservatif dan, ketika Client Cache Control tersisa di Auto,
hanya meneruskan penanda cache_control yang disediakan klien. Jika permintaan tidak menyertakan
cache_control, OmniRoute tidak memasukkan penanda milik jembatan.
Penggantian tingkat lanjut tersedia jika Anda memerlukan kontrol yang lebih baik:
| Variable | Default | Purpose |
|---|---|---|
FETCH_TIMEOUT_MS |
inherits REQUEST_TIMEOUT_MS |
Batas waktu mulai respons hulu digunakan hingga header respons tiba |
FETCH_HEADERS_TIMEOUT_MS |
inherits FETCH_TIMEOUT_MS |
Batas waktu Undici untuk menerima header respons upstream |
FETCH_BODY_TIMEOUT_MS |
inherits FETCH_TIMEOUT_MS |
Undici time limit between upstream body chunks (0 disables it) |
FETCH_CONNECT_TIMEOUT_MS |
30000 |
Undici TCP connect timeout |
FETCH_KEEPALIVE_TIMEOUT_MS |
4000 |
Undici idle keep-alive socket timeout |
TLS_CLIENT_TIMEOUT_MS |
inherits FETCH_TIMEOUT_MS |
Batas waktu untuk permintaan sidik jari TLS yang dilakukan melalui wreq-js |
API_BRIDGE_PROXY_TIMEOUT_MS |
inherits REQUEST_TIMEOUT_MS or 600000 |
Batas waktu untuk penerusan proxy /v1 dari port API ke port dasbor |
API_BRIDGE_SERVER_REQUEST_TIMEOUT_MS |
max(API_BRIDGE_PROXY_TIMEOUT_MS, 300000) |
Batas waktu permintaan masuk di server jembatan API |
API_BRIDGE_SERVER_HEADERS_TIMEOUT_MS |
60000 |
Batas waktu header masuk di server jembatan API |
API_BRIDGE_SERVER_KEEPALIVE_TIMEOUT_MS |
5000 |
Batas waktu tetap hidup di server jembatan API |
API_BRIDGE_SERVER_SOCKET_TIMEOUT_MS |
0 |
Batas waktu ketidakaktifan soket di server jembatan API (0 menonaktifkannya) |
Untuk permintaan streaming, FETCH_TIMEOUT_MS hanya mencakup pengaturan koneksi/menunggu respons upstream pertama. Setelah aliran aktif, OmniRoute hanya akan dibatalkan pada keadaan terhenti sebenarnya (STREAM_IDLE_TIMEOUT_MS) atau tubuh Undici tidak aktif (FETCH_BODY_TIMEOUT_MS).
Jika Anda menjalankan OmniRoute di belakang Nginx, Caddy, Cloudflare, atau proksi terbalik lainnya, pastikan proksi tersebut waktu tunggu juga lebih tinggi daripada waktu tunggu aliran/pengambilan OmniRoute Anda.
2) Hubungkan penyedia dan buat kunci API Anda
- Buka Dasbor →
Providersdan sambungkan setidaknya satu penyedia (OAuth atau kunci API). - Buka Dasbor →
Endpointsdan buat kunci API. - (Opsional) Buka Dasbor →
Combosdan atur rantai cadangan Anda.
3) Arahkan alat pengkodean Anda ke OmniRoute
Base URL: http://localhost:20128/v1
API Key: [copy from Endpoint page]
Model: if/kimi-k2-thinking (or any provider/model prefix)
4) Mengaktifkan dan memvalidasi protokol (v2.0)
MCP (untuk operasi yang digerakkan oleh alat):
omniroute --mcp
Kemudian sambungkan klien MCP Anda melalui stdio dan uji alat seperti:
omniroute_get_healthomniroute_list_combos
A2A (untuk alur kerja agen-ke-agen):
curl http://localhost:20128/.well-known/agent.json
curl -X POST http://localhost:20128/a2a \
-H 'content-type: application/json' \
-d '{"jsonrpc":"2.0","id":"quickstart","method":"message/send","params":{"skill":"quota-management","messages":[{"role":"user","content":"Give me a short quota summary."}]}}'
5) Validasi semuanya end-to-end (direkomendasikan)
npm run test:protocols:e2e
Suite ini memvalidasi alur klien MCP dan A2A yang sebenarnya terhadap aplikasi yang sedang berjalan.
Alternatif: dijalankan dari sumber
cp .env.example .env
npm install
PORT=20128 DASHBOARD_PORT=20129 NEXT_PUBLIC_BASE_URL=http://localhost:20129 npm run dev
Void Linux (`xbps-src` template)
Untuk pengguna Void Linux, Anda dapat membuat paket asli menggunakan xbps-src. Simpan blok ini sebagai srcpkgs/omniroute/template:
# Template file for 'omniroute'
pkgname=omniroute
version=3.4.1
revision=1
hostmakedepends="nodejs python3 make"
depends="openssl"
short_desc="Universal AI gateway with smart routing for multiple LLM providers"
maintainer="zenobit <zenobit@disroot.org>"
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() {
# Determine target CPU arch for 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) Install all deps – skip scripts (no network in do_build, native modules
# compiled separately below; better-sqlite3 is serverExternalPackage so
# Next.js does not execute it during next build)
NODE_ENV=development npm ci --ignore-scripts
# 2) Build the Next.js standalone bundle
npm run build
# 3) Copy static assets into standalone
cp -r .next/static .next/standalone/.next/static
[ -d public ] && cp -r public .next/standalone/public || true
# 4) Compile better-sqlite3 native binding for the target architecture.
# Use node-gyp directly so CC/CXX from xbps-src cross-toolchain are used
# without npm altering them.
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) Place the compiled binding into the standalone bundle
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) Remove arch-specific sharp bundles – upstream sets images.unoptimized=true
# so sharp is not used at runtime; x64 .so files would break aarch64 strip
rm -rf .next/standalone/node_modules/@img
# 7) Copy pino runtime deps omitted by Next.js static analysis:
# pino-abstract-transport – required by pino's worker thread
# split2 – dep of pino-abstract-transport
# process-warning – dep of pino itself
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
# Prevent removal of empty Next.js app router dirs by the post-install hook
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
}
🐳 Docker
OmniRoute tersedia sebagai image Docker publik di Docker Hub.
Quick run:
docker run -d \
--name omniroute \
--restart unless-stopped \
--stop-timeout 40 \
-p 20128:20128 \
-v omniroute-data:/app/data \
diegosouzapw/omniroute:latest
Dengan file lingkungan:
# Copy and edit .env first
cp .env.example .env
docker run -d \
--name omniroute \
--restart unless-stopped \
--stop-timeout 40 \
--env-file .env \
-p 20128:20128 \
-v omniroute-data:/app/data \
diegosouzapw/omniroute:latest
Menggunakan Docker Tulis:
# Base profile (no CLI tools)
docker compose --profile base up -d
# CLI profile (Claude Code, Codex, OpenClaw built-in)
docker compose --profile cli up -d
Dukungan dasbor untuk penerapan Docker kini mencakup Cloudflare Quick Tunnel sekali klik di Dashboard → Endpoints. Yang pertama mengaktifkan pengunduhan cloudflared hanya bila diperlukan, memulai terowongan sementara ke titik akhir /v1 Anda saat ini, dan menampilkan URL https://*.trycloudflare.com/v1 yang dihasilkan langsung di bawah URL publik normal Anda.
Notes:
- URL Terowongan Cepat bersifat sementara dan berubah setelah setiap restart.
- Terowongan Cepat tidak dipulihkan secara otomatis setelah OmniRoute atau kontainer dimulai ulang. Aktifkan kembali dari dasbor bila diperlukan.
- Penginstalan terkelola saat ini mendukung Linux, macOS, dan Windows di
x64/arm64. - Terkelola Quick Tunnels default ke transportasi HTTP/2 untuk menghindari peringatan buffer UDP QUIC yang berisik di lingkungan kontainer yang terbatas. Setel
CLOUDFLARED_PROTOCOL=quicatauautojika Anda menginginkan transportasi lain. - Gambar Docker menggabungkan akar CA sistem dan meneruskannya ke
cloudflaredyang dikelola, yang menghindari kegagalan kepercayaan TLS ketika terowongan melakukan bootstrap di dalam wadah. - SQLite berjalan dalam mode WAL.
docker stopharus dibiarkan selesai sehingga OmniRoute dapat memeriksa kembali perubahan terbaru kestorage.sqlite. - File Compose yang dibundel sudah menetapkan masa tenggang penghentian 40 detik. Jika Anda menjalankan image secara langsung, pertahankan
--stop-timeout 40(atau serupa) sehingga penghentian manual tidak menghentikan pembersihan pematian. - Setel
CLOUDFLARED_BIN=/absolute/path/to/cloudflaredjika Anda ingin OmniRoute menggunakan biner yang sudah ada alih-alih mengunduhnya.
Menggunakan Docker Compose dengan Caddy (HTTPS Auto-TLS):
OmniRoute dapat diekspos dengan aman menggunakan penyediaan SSL otomatis Caddy. Pastikan data DNS A domain Anda mengarah ke IP server Anda.
services:
omniroute:
image: diegosouzapw/omniroute:latest
container_name: omniroute
restart: unless-stopped
volumes:
- omniroute-data:/app/data
environment:
- PORT=20128
- NEXT_PUBLIC_BASE_URL=https://your-domain.com
caddy:
image: caddy:latest
container_name: caddy
restart: unless-stopped
ports:
- "80:80"
- "443:443"
command: caddy reverse-proxy --from https://your-domain.com --to http://omniroute:20128
volumes:
omniroute-data:
| Image | Tag | Size | Description |
|---|---|---|---|
diegosouzapw/omniroute |
latest |
~250MB | Latest stable release |
diegosouzapw/omniroute |
3.6.2 |
~250MB | Current version |
🖥️ Aplikasi Desktop — Offline & Selalu Aktif
🆕 BARU! OmniRoute kini tersedia sebagai aplikasi desktop asli untuk Windows, macOS, dan Linux.
Jalankan OmniRoute sebagai aplikasi desktop mandiri — tanpa terminal, tanpa browser, tanpa internet untuk model lokal. Aplikasi berbasis Electron meliputi:
- 🖥️ Jendela Asli — Jendela aplikasi khusus dengan integrasi baki sistem
- 🔄 Mulai Otomatis — Luncurkan OmniRoute saat login sistem
- 🔔 Pemberitahuan Asli — Dapatkan peringatan jika kuota habis atau masalah penyedia
- ⚡ Instal Sekali Klik — NSIS (Windows), DMG (macOS), AppImage (Linux)
- 🌐 Mode Offline — Bekerja sepenuhnya offline dengan server yang dibundel
Mulai Cepat
# Development mode
npm run electron:dev
# Build for your platform
npm run electron:build # Current platform
npm run electron:build:win # Windows (.exe)
npm run electron:build:mac # macOS (.dmg) — x64 & arm64
npm run electron:build:linux # Linux (.AppImage)
System Tray
Saat diminimalkan, OmniRoute ada di baki sistem Anda dengan tindakan cepat:
- Buka dasbor
- Ubah port server
- Keluar dari aplikasi
📖 Full documentation: electron/README.md
💰 Harga Sekilas
| Tier | Provider | Cost | Quota Reset | Best For |
|---|---|---|---|---|
| 💳 SUBSCRIPTION | Claude Code (Pro) | $20/mo | 5h + weekly | Already subscribed |
| Codex (Plus/Pro) | $20-200/mo | 5h + weekly | OpenAI users | |
| GitHub Copilot | $10-19/mo | Monthly | GitHub users | |
| 🔑 API KEY | NVIDIA NIM | GRATIS (pengembangan selamanya) | ~40 RPM | 70+ open models |
| Cerebras | FREE (1M tok/day) | 60K TPM / 30 RPM | World's fastest | |
| Groq | FREE (30 RPM) | 14.4K RPD | Ultra-fast Llama/Gemma | |
| DeepSeek V3.2 | $0.27/$1.10 per 1M | None | Best price/quality reasoning | |
| xAI Grok-4 Fast | $0.20/$0.50 per 1M 🆕 | None | Fastest + tool calling, ultralow | |
| xAI Grok-4 (standard) | $0.20/$1.50 per 1M 🆕 | None | Penalaran andalan dari xAI | |
| Mistral | Uji coba gratis + berbayar | Rate limited | European AI | |
| OpenRouter | Bayar per penggunaan | None | 100+ models aggr. | |
| 💰 CHEAP | GLM-5 (via Z.AI) 🆕 | $0.5/1M | Daily 10AM | 128K output, newest flagship |
| GLM-4.7 | $0.6/1M | Daily 10AM | Budget backup | |
| MiniMax M2.5 🆕 | $0.3/1M input | 5-hour rolling | Reasoning + agentic tasks | |
| MiniMax M2.1 | $0.2/1M | 5-hour rolling | Cheapest option | |
| Kimi K2.5 (Moonshot API) 🆕 | Bayar per penggunaan | None | Direct Moonshot API access | |
| Kimi K2 | $9/mo flat | 10M tokens/mo | Predictable cost | |
| 🆓 FREE | Qoder | $0 | Unlimited | 5 models unlimited |
| Qwen | $0 | Unlimited | 4 models unlimited | |
| Kiro | $0 | Unlimited | Claude Sonnet/Haiku (AWS Builder) | |
| LongCat Flash-Lite 🆕 | $0 (50M tok/day 🔥) | 1 RPS | Kuota gratis terbesar di dunia | |
| Pollinations AI 🆕 | $0 (tidak perlu kunci) | 1 req/15s | GPT-5, Claude, DeepSeek, Llama 4 | |
| Cloudflare Workers AI 🆕 | $0 (10K Neurons/day) | ~150 resp/day | 50+ model, keunggulan global | |
| Scaleway AI 🆕 | $0 (1M tokens total) | Rate limited | EU/GDPR, Qwen3 235B, Llama 70B |
🆕 Model baru ditambahkan (Mar 2026): Keluarga Grok-4 Fast seharga $0,20/$0,50/M (dibandingkan pada 1143ms — 30% lebih cepat dibandingkan Gemini 2.5 Flash), GLM-5 melalui Z.AI dengan output 128K, penalaran MiniMax M2.5, harga DeepSeek V3.2 yang diperbarui, Kimi K2.5 melalui API langsung Moonshot.
💡 Tumpukan Kombo $0 — Penyiapan Gratis Lengkap:
# 🆓 Ultimate Free Stack 2026 — 11 Providers, $0 Forever
Kiro (kr/) → Claude Sonnet/Haiku UNLIMITED
Qoder (if/) → kimi-k2-thinking, qwen3-coder-plus, deepseek-r1 UNLIMITED
LongCat Lite (lc/) → LongCat-Flash-Lite — 50M tokens/day 🔥
Pollinations (pol/) → GPT-5, Claude, DeepSeek, Llama 4 — no key needed
Qwen (qw/) → qwen3-coder-plus, qwen3-coder-flash, qwen3-coder-next UNLIMITED
Gemini (gemini/) → Gemini 2.5 Flash — 1,500 req/day free API key
Cloudflare AI (cf/) → Llama 70B, Gemma 3, Mistral — 10K Neurons/day
Scaleway (scw/) → Qwen3 235B, Llama 70B — 1M free tokens (EU)
Groq (groq/) → Llama/Gemma ultra-fast — 14.4K req/day
NVIDIA NIM (nvidia/) → 70+ open models — 40 RPM forever
Cerebras (cerebras/) → Llama/Qwen world-fastest — 1M tok/day
Tanpa biaya. Jangan pernah berhenti melakukan pengkodean. Konfigurasikan ini sebagai satu kombo OmniRoute dan semua fallback terjadi secara otomatis — tidak pernah ada peralihan manual.
🆓 Model Gratis — Apa yang Sebenarnya Anda Dapatkan
Semua model di bawah 100% gratis tanpa memerlukan kartu kredit. OmniRoute melakukan rute otomatis di antara keduanya ketika satu kuota habis — gabungkan semuanya untuk kombo $0 yang tidak dapat dipecahkan.
🔵 MODEL CLAUDE (melalui Kiro — ID AWS Builder)
| Model | Prefix | Limit | Rate Limit |
|---|---|---|---|
claude-sonnet-4.5 |
kr/ |
Unlimited | No reported daily cap |
claude-haiku-4.5 |
kr/ |
Unlimited | No reported daily cap |
claude-opus-4.6 |
kr/ |
Unlimited | Latest Opus via Kiro |
🟢 MODEL QODER (PAT Gratis melalui qodercli)
| Model | Prefix | Limit | Rate Limit |
|---|---|---|---|
kimi-k2-thinking |
if/ |
Unlimited | No reported cap |
qwen3-coder-plus |
if/ |
Unlimited | No reported cap |
deepseek-r1 |
if/ |
Unlimited | No reported cap |
minimax-m2.1 |
if/ |
Unlimited | No reported cap |
kimi-k2 |
if/ |
Unlimited | No reported cap |
Metode koneksi yang disarankan: Token Akses Pribadi +
qodercli. Peramban OAuth adalah eksperimental dan dinonaktifkan secara default kecuali variabel lingkunganQODER_OAUTH_*dikonfigurasi.
🟡 MODEL QWEN (Otentikasi Kode Perangkat)
| Model | Prefix | Limit | Rate Limit |
|---|---|---|---|
qwen3-coder-plus |
qw/ |
Unlimited | No reported cap |
qwen3-coder-flash |
qw/ |
Unlimited | No reported cap |
qwen3-coder-next |
qw/ |
Unlimited | No reported cap |
vision-model |
qw/ |
Unlimited | Multimodal (images) |
⚫ NVIDIA NIM (Kunci API Gratis — build.nvidia.com)
| Tier | Daily Limit | Rate Limit | Notes |
|---|---|---|---|
| Free (Dev) | No token cap | ~40 RPM | 70+ model; transisi ke batas tarif murni pada pertengahan tahun 2025 |
Model gratis populer: moonshotai/kimi-k2.5 (Kimi K2.5), z-ai/glm4.7 (GLM 4.7), deepseek-ai/deepseek-v3.2 (DeepSeek V3.2), nvidia/llama-3.3-70b-instruct, deepseek/deepseek-r1
⚪ CEREBRAS (Kunci API Gratis — inference.cerebras.ai)
| Tier | Daily Limit | Rate Limit | Notes |
|---|---|---|---|
| Free | 1M tokens/day | 60K TPM / 30 RPM | World's fastest LLM inference; resets daily |
Available free: llama-3.3-70b, llama-3.1-8b, deepseek-r1-distill-llama-70b
🔴 GROQ (Kunci API Gratis — console.groq.com)
| Tier | Daily Limit | Rate Limit | Notes |
|---|---|---|---|
| Free | 14.4K RPD | 30 RPM per model | No credit card; 429 on limit, not charged |
Available free: llama-3.3-70b-versatile, gemma2-9b-it, mixtral-8x7b, whisper-large-v3
🔴 LONGCAT AI (Kunci API Gratis — longcat.chat) 🆕
| Model | Prefix | Kuota Gratis Harian | Notes |
|---|---|---|---|
LongCat-Flash-Lite |
lc/ |
50M tokens 💥 | Kuota gratis terbesar yang pernah ada |
LongCat-Flash-Chat |
lc/ |
500K tokens | Multi-turn chat |
LongCat-Flash-Thinking |
lc/ |
500K tokens | Reasoning / CoT |
LongCat-Flash-Thinking-2601 |
lc/ |
500K tokens | Jan 2026 version |
LongCat-Flash-Omni-2603 |
lc/ |
500K tokens | Multimodal |
100% gratis saat dalam versi beta publik. Daftar di longcat.chat dengan email atau telepon. Reset setiap hari pukul 00:00 UTC.
🟢 POLLINASI AI (Tidak Perlu Kunci API) 🆕
| Model | Prefix | Rate Limit | Provider Behind |
|---|---|---|---|
openai |
pol/ |
1 req/15s | GPT-5 |
claude |
pol/ |
1 req/15s | Anthropic Claude |
gemini |
pol/ |
1 req/15s | Google Gemini |
deepseek |
pol/ |
1 req/15s | DeepSeek V3 |
llama |
pol/ |
1 req/15s | Meta Llama 4 Scout |
mistral |
pol/ |
1 req/15s | Mistral AI |
✨ Tanpa gesekan: Tanpa pendaftaran, tanpa kunci API. Tambahkan penyedia Penyerbukan dengan bidang kunci kosong dan itu langsung berfungsi.
🟠 AI CLOUDFLARE WORKERS (Kunci API Gratis — cloudflare.com) 🆕
| Tier | Daily Neurons | Equivalent Usage | Notes |
|---|---|---|---|
| Free | 10,000 | ~150 LLM resp / 500s audio / 15K embeds | Keunggulan global, 50+ model |
Model gratis populer: @cf/meta/llama-3.3-70b-instruct, @cf/google/gemma-3-12b-it, @cf/openai/whisper-large-v3-turbo (audio gratis!), @cf/qwen/qwen2.5-coder-15b-instruct
Membutuhkan Token API + ID Akun dari dash.cloudflare.com. Simpan ID Akun di pengaturan penyedia.
🟣 SCALEWAY AI (1 Juta Token Gratis — scaleway.com) 🆕
| Tier | Free Quota | Location | Notes |
|---|---|---|---|
| Free | 1M tokens | 🇫🇷 Paris, EU | No credit card needed within limits |
Tersedia gratis: qwen3-235b-a22b-instruct-2507 (Qwen3 235B!), llama-3.1-70b-instruct, mistral-small-3.2-24b-instruct-2506, deepseek-v3-0324
Sesuai dengan UE/GDPR. Dapatkan kunci API di console.scaleway.com.
💡 Tumpukan Gratis Terbaik (11 Penyedia, $0 Selamanya):
Kiro (kr/) → Claude Sonnet/Haiku TANPA BATAS Qoder (if/) → kimi-k2-thinking, qwen3-coder-plus, deepseek-r1 TANPA BATAS LongCat Lite (lc/) → LongCat-Flash-Lite — 50 juta token/hari 🔥 Pollinations (pol/) → GPT-5, Claude, DeepSeek, Llama 4 — tidak perlu kunci Qwen (qw/) → model qwen3-coder TANPA BATAS Gemini (gemini/) → Gemini 2.5 Flash — 1.500 req/hari gratis Cloudflare AI (cf/) → 50+ model — 10 ribu Neurons/hari Scaleway (scw/) → Qwen3 235B, Llama 70B — 1 juta token gratis (EU) Groq (groq/) → Llama/Gemma — 14,4 ribu req/hari, sangat cepat NVIDIA NIM (nvidia/) → 70+ model terbuka — 40 RPM selamanya Cerebras (cerebras/) → Llama/Qwen tercepat di dunia — 1 juta tok/hari
🎙️ Kombo Transkripsi Gratis
Transkripsikan audio/video apa pun seharga $0 — Deepgram memimpin dengan $200 gratis, penggantian AssemblyAI $50, Groq Whisper sebagai cadangan darurat tanpa batas.
| Provider | Free Credits | Best Model | Rate Limit |
|---|---|---|---|
| 🟢 Deepgram | $200 free (signup) | nova-3 — best accuracy, 30+ languages |
Tidak ada batasan RPM pada kredit gratis |
| 🔵 AssemblyAI | $50 free (signup) | universal-3-pro — chapters, sentiment, PII |
Tidak ada batasan RPM pada kredit gratis |
| 🔴 Groq | Free forever | whisper-large-v3 — OpenAI Whisper |
30 RPM (rate limited) |
Suggested combo in /dashboard/combos:
Name: free-transcription
Strategy: Priority
Nodes:
[1] deepgram/nova-3 → uses $200 free first
[2] assemblyai/universal-3-pro → fallback when Deepgram credits run out
[3] groq/whisper-large-v3 → free forever, emergency fallback
Kemudian di tab /dashboard/media → Transkripsi: unggah file audio atau video apa pun → pilih titik akhir kombo Anda → dapatkan transkripsi dalam format yang didukung.
💡 Fitur Utama
OmniRoute v3.6 dibangun sebagai platform operasional, bukan hanya proxy relai.
🆕 Baru — Sorotan v3.6.x (Apr 2026)
| Feature | Apa Fungsinya |
|---|---|
| 🌐 V1 WebSocket Bridge | Lalu lintas WebSocket yang kompatibel dengan OpenAI ditingkatkan dan diproksi melalui /v1/ws — streaming penuh melalui WS dengan autentikasi sesi (kunci API atau cookie sesi) |
| 🔑 Sync Tokens & Config Bundle | Menerbitkan/mencabut token sinkronisasi untuk titik akhir sinkronisasi konfigurasi. Paket konfigurasi diversi dengan ETag untuk polling hemat bandwidth |
| 🧠 GLM Thinking (glmt) Preset | GLM Thinking registered first-class: 65 536 max tokens, 24 576 thinking budget, 900s timeout, usage sync & pricing — Claude-compatible API |
| 🔢 Hybrid Token Counting | Menggunakan /messages/count_tokens sisi penyedia jika tersedia; kembali ke perkiraan — pelacakan penggunaan yang akurat tanpa menebak-nebak |
| 🌱 Model Alias Benih Otomatis | 30+ cross-proxy dialect aliases normalised at startup — no more routing mismatches |
| 🛡️ Safe Outbound Fetch | Semua validasi penyedia dan penemuan model melalui lapisan pengambilan yang dilindungi yang memblokir URL pribadi/lokal dengan percobaan ulang, batas waktu, dan perlindungan SSRF |
| ⏳ Tunggu Masa Tenang | Percobaan ulang obrolan sisi server ketika setiap koneksi kandidat sedang dingin; dapat dikonfigurasi enabled, maxRetries, dan maxRetryWaitSec |
| 🔍 Validasi Env Runtime | Startup memvalidasi semua env vars dengan skema Zod - menghapus kesalahan untuk rahasia yang hilang, URL yang tidak valid, atau tipe yang salah |
| 📋 Compliance Audit Expansion | Log audit terstruktur dengan penomoran halaman, konteks permintaan, peristiwa autentikasi, peristiwa CRUD penyedia, dan pencatatan validasi yang diblokir SSRF |
| 🔐 TPS Log Metric | Modal detail log menunjukkan Token Per Second (TPS) — sekilas kinerja cepat untuk setiap permintaan |
| 🗑️ Uninstall / Full Uninstall | npm run uninstall menyimpan data, npm run uninstall:full menghapus semuanya — penghapusan bersih untuk semua metode instalasi |
| 🔧 OAuth Env Repair | Tindakan "Perbaiki env" sekali klik untuk penyedia OAuth memulihkan vars env yang hilang dan memperbaiki status autentikasi yang rusak |
| 🔒 Pematian Elektron yang Anggun | Electron before-quit dimatikan Next.js dengan baik, mencegah penguncian database SQLite WAL pada penutupan desktop |
| 👁️ Pengalih Visibilitas Model | Pengalih visibilitas per model (ikon 👁) dengan filter pencarian dan lencana jumlah aktif (N/M active) di halaman penyedia |
| 📧 Email Privacy Masking | OAuth account emails masked (di*****@g****.com), full address visible on hover |
| 🔗 Context Relay Strategy | Strategi kombo menjaga kesinambungan sesi melalui ringkasan penyerahan terstruktur saat akun dirotasi di tengah percakapan |
| 🛡️ Proxy Hardening | Pemeriksaan kesehatan token, validasi kunci API, dan operator undici semuanya menghormati konfigurasi proxy |
| ⚠️ Node.js 24 Login Warning | Login page proactively detects incompatible Node.js versions and shows a clear warning banner |
| 📎 Gemini PDF Attachments | PDF attachments correctly routed to Gemini via inline_data and generic base64 detection |
| 🔒 Pengerasan Keamanan CodeQL | Resolved SSRF, insecure randomness, polynomial ReDoS, and incomplete URL sanitization alerts |
🆕 Baru — Peningkatan Terinspirasi ClawRouter (Mar 2026)
| Feature | Apa Fungsinya |
|---|---|
| ⚡ Grok-4 Fast Family | xAI models at $0.20/$0.50/M — benchmarked 1143ms (30% faster than Gemini 2.5 Flash) |
| 🧠 GLM-5 via Z.AI | Konteks keluaran 128 ribu, $0,5/1 juta — andalan terbaru dari keluarga GLM |
| 🔮 MiniMax M2.5 | Penalaran + tugas agen seharga $0,30/1 juta — peningkatan signifikan dari M2.1 |
| 🎯 alat Memanggil Bendera per Model | Per model toolCalling: true/false di registri — AutoCombo melewatkan model yang tidak mendukung alat |
| 🌍 Multilingual Intent Detection | Kata kunci PT/ZH/ES/AR dalam penilaian AutoCombo — pemilihan model yang lebih baik untuk konten non-Inggris |
| 📊 Benchmark-Driven Fallbacks | Latensi p95 nyata dari penilaian kombo umpan permintaan langsung — AutoCombo belajar dari data aktual |
| 🔁 Request Deduplication | Content-hash based dedup window — multi-agent safe, prevents duplicate charges |
| 🔌 Pluggable RouterStrategy | Antarmuka RouterStrategy yang dapat diperluas — tambahkan logika perutean khusus sebagai plugin |
🚀 Sebelumnya v2.0.9+ — Playground, Fingerprint CLI & ACP
| Feature | Apa Fungsinya |
|---|---|
| 🎮 Model Playground | Halaman dasbor untuk menguji model apa pun secara langsung — pemilih penyedia/model/titik akhir, Editor Monaco, streaming, batalkan, pengaturan waktu |
| 🔏 CLI Fingerprint Matching | Pengurutan header/isi per penyedia agar sesuai dengan tanda tangan CLI asli — alihkan per penyedia di Pengaturan > Keamanan. IP proxy Anda dipertahankan |
| 🤖 Dasbor Agen ACP | Debug › Halaman agen — kisi 14 agen dengan status pemasangan, versi, formulir agen khusus untuk alat CLI apa pun. Pengguna OpenCode mendapatkan tombol "Unduh opencode.json" yang secara otomatis menghasilkan konfigurasi siap pakai dengan semua model yang tersedia. |
🔧 Custom Model apiFormat Routing |
Model khusus dengan apiFormat: "responses" sekarang dirutekan dengan benar ke penerjemah Responses API |
| 🏢 Codex Workspace Isolation | Multiple Codex workspaces per email — OAuth correctly separates connections by workspace ID |
| 🔄 Pembaruan Otomatis Elektron | Aplikasi desktop memeriksa pembaruan + instal otomatis saat restart |
🤖 Operasi Agen & Protokol (v2.0)
| Feature | Apa Fungsinya |
|---|---|
| 🔧 Server MCP (25 alat) | IDE/agent tools via 3 transports: stdio, SSE (/api/mcp/sse), Streamable HTTP (/api/mcp/stream). 18 core + 3 memory + 4 skill tools |
| 🤝 Server A2A (JSON-RPC + SSE) | Eksekusi tugas agen-ke-agen dengan alur sinkronisasi dan streaming |
| 🧭 Halaman Titik Akhir Konsolidasi | Halaman manajemen bertab dengan tab Proksi Titik Akhir, MCP, A2A, dan Titik Akhir API |
| 🎚️ Service Enable/Disable Toggles | Sakelar ON/OFF untuk MCP dan A2A dengan pengaturan persistensi (default: OFF) |
| 🛰️ Detak Jantung Waktu Proses MCP | Real process status (pid, uptime, heartbeat age, transport, scope mode) |
| 📋 MCP Audit Trail | Log audit yang dapat difilter dengan keberhasilan/kegagalan dan atribusi kunci |
| 🔐 MCP Scope Enforcement | 10 izin cakupan terperinci untuk akses alat terkontrol |
| 📡 Manajemen Siklus Hidup Tugas A2A | List/filter tasks, inspect events/artifacts, cancel running tasks |
| 📋 Agent Card Discovery | /.well-known/agent.json untuk penemuan otomatis klien |
| 🧪 Protocol E2E Test Harness | Klien MCP SDK + A2A asli mengalir di test:protocols:e2e |
| ⚙️ Operational Controls | Ganti kombo, sesuaikan pengaturan ketahanan, dan tinjau status pemutus dari permukaan Kesehatan dan Pengaturan khusus |
🧠 Routing & Kecerdasan
| Feature | Apa Fungsinya |
|---|---|
| 🎯 Pengembalian 4 Tingkat Cerdas | Rute otomatis: Berlangganan → Kunci API → Murah → Gratis |
| 📊 Pelacakan Kuota Waktu Nyata | Jumlah token langsung + setel ulang hitungan mundur per penyedia |
| 🔄 Format Translation | OpenAI ↔ Claude ↔ Gemini ↔ Respons dengan konversi skema-aman |
| 👥 Dukungan Multi-Akun | Banyak akun per penyedia dengan pilihan cerdas |
| 🔄 Auto Token Refresh | Token OAuth disegarkan secara otomatis dengan percobaan ulang |
| 🎨 Custom Combos | 13 strategi penyeimbangan + kontrol rantai mundur |
| 🔗 Context Relay | Penyerahan kesinambungan sesi ketika rotasi akun terjadi di tengah sesi |
| 🌐 Wildcard Router | provider/* dynamic routing |
| 🧠 Thinking Budget Controls | Batas penalaran passthrough, otomatis, kustom, dan adaptif |
| 🔀 Model Aliases | Alias model khusus + bawaan dan keamanan migrasi |
| ⚡ Background Degradation | Arahkan tugas latar belakang berprioritas rendah ke model yang lebih murah |
| 🧪 Perutean Cerdas Sadar Tugas | Pilih model secara otomatis berdasarkan jenis konten (pengkodean/visi/analisis/ringkasan) |
| 🔄 A2A Agent Workflows | Deterministic FSM orchestrator for stateful multi-step agent executions |
| 🔀 Adaptive Routing | Dynamic strategy override based on token volume and prompt complexity |
| 🎲 Provider Diversity | Shannon entropy scoring balancing auto-combo traffic distribution |
| 💬 System Prompt Injection | Global behavior controls applied consistently |
| 📄 Kompatibilitas API Respons | Dukungan penuh /v1/responses untuk Codex dan alur kerja agen tingkat lanjut |
🎵 API Multi-Modal
| Feature | Apa Fungsinya |
|---|---|
| 🖼️ Image Generation | /v1/images/generations dengan cloud dan backend lokal |
| 📐 Embeddings | /v1/embeddings untuk saluran pencarian dan RAG |
| 🎤 Audio Transcription | /v1/audio/transcriptions — 7 providers (Deepgram Nova 3, AssemblyAI, Groq Whisper, HuggingFace, ElevenLabs, OpenAI, Azure), auto-language detection, MP4/MP3/WAV support |
| 🔊 Text-to-Speech | /v1/audio/speech — 10 penyedia (ElevenLabs, OpenAI, Deepgram, Cartesia, PlayHT, HuggingFace, Nvidia NIM, Inworld, Coqui, Tortoise) dengan pesan kesalahan yang benar |
| 🎬 Video Generation | /v1/videos/generations (ComfyUI + SD WebUI workflows) |
| 🎵 Music Generation | /v1/music/generations (ComfyUI workflows) |
| 🛡️ Moderations | /v1/moderations safety checks |
| 🔀 Reranking | /v1/rerank untuk penilaian relevansi |
| 🔍 Web Search 🆕 | /v1/search — 5 providers (Serper, Brave, Perplexity, Exa, Tavily), 6,500+ free/month, auto-failover, cache |
🛡️ Ketahanan, Keamanan & Tata Kelola
| Feature | Apa Fungsinya |
|---|---|
| 🔌 Penyedia Pemutus Arus | Perjalanan/pemulihan di seluruh penyedia setelah kelelahan fallback dengan ambang batas yang dapat dikonfigurasi |
| 🔒 Kunci Kuota Harian 🆕 | Mendeteksi sinyal kelelahan dan mengunci perutean untuk model tertentu hingga tengah malam |
| 🎯 Model Sadar Titik Akhir | Model khusus mendeklarasikan titik akhir + format API yang didukung |
| 🛡️ Anti-Thundering Herd | Mutex + semaphore protections on retry/rate events |
| 🧠 Semantic + Signature Cache | Pengurangan biaya/latensi dengan dua lapisan cache |
| ⚡ Request Idempotency | Duplicate protection window |
| 🔒 TLS Fingerprint Spoofing | Sidik jari TLS seperti browser — mengurangi deteksi bot dan penandaan akun |
| 🔏 CLI Fingerprint Matching | Matches native CLI request signatures — reduces ban risk while preserving proxy IP |
| 🌐 IP Filtering | Kontrol daftar yang diizinkan/daftar blokir untuk penerapan yang terbuka |
| 🚦 Minta Antrian & Kecepatan | Bucket permintaan per koneksi yang dapat dikonfigurasi untuk RPM, spasi, konkurensi, dan waktu tunggu maksimal |
| 📉 Graceful Degradation | Multi-layer capability fallbacks protecting core gateway operations |
| 📜 Config Audit Trail | Pelacakan perubahan berbasis diff mencegah penyimpangan operasional dengan rollback sederhana |
| ⏳ Sinkronisasi Kesehatan Penyedia | Proactive token expiration monitoring triggering alerts before authorization failures |
| ❄️ Connection Cooldown | Retryable 408/429/5xx failures cool down a single connection with optional upstream hints |
| 🚪 Nonaktifkan Otomatis Akun yang Diblokir | Akun token yang diblokir secara permanen dapat dinonaktifkan secara otomatis |
| 🔑 Manajemen Kunci API + Pelingkupan | Mengamankan penerbitan/rotasi kunci dan kontrol model/penyedia |
| 👁️ Pengungkapan Kunci API Cakupan 🆕 | Ikut serta dalam pemulihan kunci API melalui ALLOW_API_KEY_REVEAL |
🛡️ Protected /models |
Gerbang autentikasi opsional dan penyembunyian penyedia untuk katalog model |
| 🛡️ Safe Outbound Fetch 🆕 | Pengambilan yang dijaga untuk panggilan penyedia — memblokir URL pribadi/lokal, percobaan ulang, perlindungan SSRF |
| ⏳ Tunggu Cooldown 🆕 | Coba ulang obrolan secara otomatis setelah cooldown koneksi; dapat dikonfigurasi enabled, maxRetries, dan maxRetryWaitSec |
| 🔍 Validasi Env Runtime 🆕 | Zod-based env schema validation at startup with actionable error messages |
| 📋 Compliance Audit v2 🆕 | Penomoran halaman, konteks permintaan, peristiwa autentikasi, CRUD penyedia, dan logging yang diblokir SSRF |
📊 Observabilitas & Analitik
| Feature | Apa Fungsinya |
|---|---|
| 📝 Permintaan + Pencatatan Proksi | Permintaan/respons penuh dan pencatatan proksi |
| 📉 Streamed Detailed Logs | Merekonstruksi aliran muatan SSE dengan rapi ke dalam UI |
| 🏷️ Lencana Model Real-Time 🆕 | Status model langsung dan penghitung waktu mundur kuota harian |
| 📋 Dasbor Log Terpadu | Tampilan permintaan, proksi, audit, dan konsol dalam satu halaman |
| 🔍 Request Telemetry | latensi p50/p95/p99 dan penelusuran permintaan |
| 🏥 Health Dashboard | Uptime, breaker states, lockouts, cache stats |
| 💰 Cost Tracking | Kontrol anggaran dan visibilitas harga per model |
| 📈 Analytics Visualizations | Wawasan penggunaan model/penyedia dan tampilan tren |
| 🧪 Evaluation Framework | Pengujian set emas dengan strategi pencocokan yang dapat dikonfigurasi |
| 📡 Live Diagnostics 🆕 | Bypass cache semantik untuk pengujian langsung kombo yang akurat |
| 🔐 TPS Log Metric 🆕 | Tokens Per Second badge in log details modal |
☁️ Deployment & Platform
| Feature | Apa Fungsinya |
|---|---|
| 🌐 Deploy Anywhere | Localhost, VPS, Docker, Cloud environments |
| 🚇 Cloudflare Tunnel 🆕 | Integrasi Quick Tunnel sekali klik dari dasbor |
| 🔑 Pemfilteran Model Kunci API | Respons asli /v1/models difilter melalui peran konteks Pembawa yang ditetapkan |
| ⚡ Smart Cache Bypass | Heuristik TTL yang dapat dikonfigurasi dan kontrol pengambilan ulang paksa |
| 🔄 Backup/Restore | Arus ekspor/impor dan pemulihan bencana |
| 🧙 Onboarding Wizard | Penyiapan terpandu yang dijalankan pertama kali |
| 🔧 Dasbor Alat CLI | Pengaturan sekali klik untuk alat pengkodean populer |
| 🎮 Model Playground | Uji penyedia/model/titik akhir apa pun dari dasbor |
| 🔏 CLI Fingerprint Toggle | Pencocokan sidik jari per penyedia di Pengaturan > Keamanan |
| 🌐 i18n (30 languages) | Dasbor lengkap + dukungan bahasa dokumen dengan cakupan RTL |
| 🧹 Hapus Semua Model | Pembersihan daftar model sekali klik di detail penyedia |
| 👁️ Sidebar Controls 🆕 | Sembunyikan komponen dan integrasi dari Pengaturan Penampilan |
| 📋 Issue Templates | Templat GitHub standar untuk bug dan fitur |
| 📂 Custom Data Directory | DATA_DIR penggantian untuk lokasi penyimpanan |
| 🌐 V1 WebSocket Bridge 🆕 | OpenAI-compatible WebSocket traffic proxied via /v1/ws |
| 🔑 Sync Tokens & Bundle 🆕 | Konfigurasikan token sinkronisasi + titik akhir bundel berversi dengan dukungan ETag |
Fitur Penyelaman Mendalam
Penggantian cerdas dengan pengendalian biaya praktis
Combo: "my-coding-stack"
1. cc/claude-opus-4-7
2. nvidia/llama-3.3-70b
3. glm/glm-4.7
4. if/kimi-k2-thinking
Ketika kuota, tarif, atau kesehatan gagal, OmniRoute secara otomatis berpindah ke kandidat berikutnya tanpa peralihan manual.
Manajemen protokol yang terlihat dan dapat dioperasikan
- MCP + A2A dapat ditemukan di UI dan dokumen (tidak disembunyikan)
- API status protokol memaparkan data operasional langsung (
/api/mcp/*,/api/a2a/*) - Dasbor mencakup tindakan untuk operasi hari ke-2 (pengalihan kombo, pengaturan ulang pemutus, pembatalan tugas)
Workflow translator + validasi
Area Penerjemah meliputi:
- Playground: request transformation checks
- Chat Tester: full request/response round-trip
- Test Bench: multiple cases in one run
- Live Monitor: real-time traffic view
Ditambah validasi protokol dengan klien nyata melalui npm run test:protocols:e2e.
📖 MCP Server README — Referensi alat, konfigurasi IDE, dan contoh klien
📖 A2A Server README — Keterampilan, metode JSON-RPC, streaming, dan siklus hidup tugas
🧪 Evaluasi (Evals)
OmniRoute menyertakan kerangka evaluasi bawaan untuk menguji kualitas respons LLM terhadap rangkaian emas. Akses melalui Analytics → Evals di dasbor.
Golden Set Bawaan
"OmniRoute Golden Set" yang dimuat sebelumnya berisi kasus uji untuk:
- Salam, matematika, geografi, pembuatan kode
- Kepatuhan format JSON, terjemahan, pembuatan penurunan harga
- Penolakan keamanan (konten berbahaya), penghitungan, logika boolean
Strategi Evaluasi
| Strategy | Description | Example |
|---|---|---|
exact |
Output must match exactly | "4" |
contains |
Output must contain substring (case-insensitive) | "Paris" |
regex |
Output must match regex pattern | "1.*2.*3" |
custom |
Custom JS function returns true/false | (output) => output.length > 10 |
📖 Panduan Setup
Pengaturan Protokol (MCP + A2A)
🧩 Penyiapan MCP (Protokol Konteks Model)
Start MCP transport in stdio mode:
omniroute --mcp
Recommended validation flow:
- Hubungkan klien MCP Anda melalui stdio.
- Jalankan
omniroute_get_health. - Jalankan
omniroute_list_combos. - Buka
/dashboard/mcpuntuk mengonfirmasi detak jantung, aktivitas, dan audit.
API yang berguna untuk otomatisasi:
GET /api/mcp/statusGET /api/mcp/toolsGET /api/mcp/auditGET /api/mcp/audit/stats
🤝 Pengaturan A2A (Agen2Agen)
Temukan agennya:
curl http://localhost:20128/.well-known/agent.json
Send a task:
curl -X POST http://localhost:20128/a2a \
-H 'content-type: application/json' \
-d '{"jsonrpc":"2.0","id":"setup-a2a","method":"message/send","params":{"skill":"quota-management","messages":[{"role":"user","content":"Summarize quota status."}]}}'
Manage lifecycle:
GET /api/a2a/statusGET /api/a2a/tasksGET /api/a2a/tasks/:idPOST /api/a2a/tasks/:id/cancel
Operational UI:
/dashboard/a2auntuk observasi tugas/status/aliran dan tindakan asap
🧪 Validasi protokol end-to-end
Validasi kedua protokol dengan klien nyata:
npm run test:protocols:e2e
This verifies:
- Koneksi/daftar/panggilan klien MCP SDK
- Penemuan A2A/kirim/aliran/dapatkan/batalkan
- Periksa silang data dalam audit MCP dan API manajemen tugas A2A
💳 Penyedia Berlangganan
Claude Code (Pro/Max)
Dashboard → Providers → Connect Claude Code
→ OAuth login → Auto token refresh
→ 5-hour + weekly quota tracking
Models:
cc/claude-opus-4-7
cc/claude-sonnet-4-5-20250929
cc/claude-haiku-4-5-20251001
Kiat Pro: Gunakan Opus untuk tugas kompleks, Soneta untuk kecepatan. OmniRoute melacak kuota per model!
OpenAI Codex (Plus/Pro)
Dashboard → Providers → Connect Codex
→ OAuth login (port 1455)
→ 5-hour + weekly reset
Models:
cx/gpt-5.2-codex
cx/gpt-5.1-codex-max
Manajemen Batas Akun Codex (5 jam + Mingguan)
Setiap akun Codex kini memiliki kebijakan yang dapat diubah di Dashboard -> Providers:
5h(ON/OFF): menerapkan kebijakan ambang jendela 5 jam.Weekly(ON/OFF): menerapkan kebijakan ambang jendela mingguan.- Perilaku ambang batas: ketika jendela yang diaktifkan mencapai >=90% penggunaan, akun tersebut dilewati.
- Perilaku rotasi: OmniRoute merutekan ke akun Codex berikutnya yang memenuhi syarat secara otomatis.
- Perilaku reset: ketika waktu
resetAtpenyedia telah berlalu, akun akan memenuhi syarat lagi secara otomatis.
Scenarios:
5h ON+Weekly ON: akun dilewati ketika salah satu jendela mencapai ambang batas.5h OFF+Weekly ON: hanya penggunaan mingguan yang dapat memblokir akun.5h ON+Weekly OFF: hanya penggunaan 5 jam yang dapat memblokir akun.resetAtlolos: akun masuk kembali ke rotasi secara otomatis (tidak ada pengaktifan ulang secara manual).
GitHub Copilot
Dashboard → Providers → Connect GitHub
→ OAuth via GitHub
→ Monthly reset (1st of month)
Models:
gh/gpt-5
gh/claude-4.5-sonnet
gh/gemini-3.1-pro-preview
🔑 Penyedia Kunci API
NVIDIA NIM (akses pengembang GRATIS — 70+ model)
- Daftar: build.nvidia.com
- Dapatkan kunci API gratis (termasuk 1000 kredit inferensi)
- Dasbor → Tambah Penyedia → NVIDIA NIM:
- Kunci API:
nvapi-your-key
- Kunci API:
Model: nvidia/llama-3.3-70b-instruct, nvidia/mistral-7b-instruct, dan 50+ lainnya
Kiat Pro: API yang kompatibel dengan OpenAI — bekerja secara lancar dengan terjemahan format OmniRoute!
DeepSeek
- Daftar: platform.deepseek.com
- Dapatkan kunci API
- Dasbor → Tambah Penyedia → DeepSeek
Models: deepseek/deepseek-chat, deepseek/deepseek-coder
Groq (Tersedia Tingkat Gratis!)
- Daftar: console.groq.com
- Dapatkan kunci API (termasuk tingkat gratis)
- Dasbor → Tambah Penyedia → Groq
Models: groq/llama-3.3-70b, groq/mixtral-8x7b
Pro Tip: Ultra-fast inference — best for real-time coding!
OpenRouter (100+ Model)
- Daftar: openrouter.ai
- Dapatkan kunci API
- Dasbor → Tambah Penyedia → OpenRouter
Model: Akses 100+ model dari semua penyedia utama melalui satu kunci API.
Perilaku dasbor: Model OpenRouter dikelola dari Model yang Tersedia. Penambahan manual, impor, dan sinkronisasi otomatis semuanya memperbarui daftar yang sama.
💰 Penyedia Murah (Cadangan)
GLM-4.7 (Reset harian, $0.6/1M)
- Daftar: Zhipu AI
- Dapatkan kunci API dari Coding Plan
- Dasbor → Tambahkan Kunci API:
- Penyedia:
glm - Kunci API:
your-key
- Penyedia:
Use: glm/glm-4.7
Tips Pro: Paket Coding menawarkan 3× kuota dengan biaya 1/7! Reset setiap hari pukul 10.00.
MiniMax M2.1 (Reset 5 jam, $0.20/1M)
- Daftar: MiniMax
- Dapatkan kunci API
- Dasbor → Tambahkan Kunci API
Use: minimax/MiniMax-M2.1
Kiat Pro: Opsi termurah untuk konteks panjang (1 juta token)!
Kimi K2 ($9/bulan flat)
- Berlangganan: Moonshot AI
- Dapatkan kunci API
- Dasbor → Tambahkan Kunci API
Use: kimi/kimi-latest
Kiat Pro: Memperbaiki $9/bulan untuk 10 juta token = biaya efektif $0,90/1 juta!
🆓 Penyedia GRATIS (Cadangan Darurat)
Qoder (5 model GRATIS melalui OAuth)
Dashboard → Connect Qoder
→ Qoder OAuth login
→ Unlimited usage
Models:
if/kimi-k2-thinking
if/qwen3-coder-plus
if/glm-4.7
if/minimax-m2
if/deepseek-r1
Qwen (4 model GRATIS melalui Kode Perangkat)
Dashboard → Connect Qwen
→ Device code authorization
→ Unlimited usage
Models:
qw/qwen3-coder-plus
qw/qwen3-coder-flash
Kiro (Claude GRATIS)
Dashboard → Connect Kiro
→ AWS Builder ID or Google/GitHub
→ Unlimited usage
Models:
kr/claude-sonnet-4.5
kr/claude-haiku-4.5
🎨 Membuat Combo
Contoh 1: Maksimalkan Langganan → Cadangan Murah
Dashboard → Combos → Create New
Name: premium-coding
Models:
1. cc/claude-opus-4-7 (Subscription primary)
2. glm/glm-4.7 (Cheap backup, $0.6/1M)
3. minimax/MiniMax-M2.1 (Cheapest fallback, $0.20/1M)
Use in CLI: premium-coding
Contoh 2: Gratis Saja (Tanpa Biaya)
Name: free-combo
Models:
1. if/kimi-k2-thinking (unlimited)
2. qw/qwen3-coder-plus (unlimited)
Cost: $0 forever!
🔧 Integrasi CLI
Cursor IDE
Settings → Models → Advanced:
OpenAI API Base URL: http://localhost:20128/v1
OpenAI API Key: [from OmniRoute dashboard]
Model: cc/claude-opus-4-7
Claude Code
Gunakan halaman Alat CLI di dasbor untuk konfigurasi sekali klik, atau edit ~/.claude/settings.json secara manual.
Codex CLI
export OPENAI_BASE_URL="http://localhost:20128"
export OPENAI_API_KEY="your-omniroute-api-key"
codex "your prompt"
OpenClaw
Opsi 1 — Dasbor (disarankan):
Dashboard → CLI Tools → OpenClaw → Select Model → Apply
Option 2 — Manual: Edit ~/.openclaw/openclaw.json:
{
"models": {
"providers": {
"omniroute": {
"baseUrl": "http://127.0.0.1:20128/v1",
"apiKey": "sk_omniroute",
"api": "openai-completions"
}
}
}
}
Catatan: OpenClaw hanya berfungsi dengan OmniRoute lokal. Gunakan
127.0.0.1alih-alihlocalhostuntuk menghindari masalah resolusi IPv6.
Cline / Continue / RooCode
Settings → API Configuration:
Provider: OpenAI Compatible
Base URL: http://localhost:20128/v1
API Key: [from OmniRoute dashboard]
Model: if/kimi-k2-thinking
OpenCode
Langkah 1: Tambahkan OmniRoute sebagai penyedia khusus:
opencode
/connect
# Select "Other" → Enter ID: "omniroute" → Enter your OmniRoute API key
Langkah 2: Buat/edit opencode.json di root proyek Anda:
{
"$schema": "https://opencode.ai/config.json",
"provider": {
"omniroute": {
"npm": "@ai-sdk/openai-compatible",
"name": "OmniRoute",
"options": {
"baseURL": "http://localhost:20128/v1"
},
"models": {
"cc/claude-sonnet-4-20250514": { "name": "Claude Sonnet 4" },
"gg/gemini-2.5-pro": { "name": "Gemini 2.5 Pro" },
"if/kimi-k2-thinking": { "name": "Kimi K2 (Free)" }
}
}
}
}
Langkah 3: Pilih model di OpenCode:
/models
# Select any OmniRoute model from the list
Tips: Tambahkan model apa pun yang tersedia di titik akhir OmniRoute
/v1/modelsAnda ke bagianmodels. Gunakan formatprovider/model-iddari dasbor OmniRoute Anda.
Pemecahan Masalah
Klik untuk memperluas panduan pemecahan masalah
"Model bahasa tidak memberikan pesan"
- Kuota penyedia habis → Periksa dashboard pelacak kuota
- Solusi: Gunakan combo fallback atau beralih ke tier yang lebih murah
Rate limiting
- Kuota berlangganan habis → Penggantian ke GLM/MiniMax
- Tambahkan kombo:
cc/claude-opus-4-7 → glm/glm-4.7 → if/kimi-k2-thinking
OAuth token expired
- Disegarkan secara otomatis oleh OmniRoute
- Jika masalah terus berlanjut: Dasbor → Penyedia → Sambungkan kembali
High costs
- Periksa statistik penggunaan di Dashboard → Biaya
- Ganti model utama ke GLM/MiniMax
Port dasbor/API salah
PORTadalah port dasar kanonik (dan port API secara default)API_PORThanya menimpa pendengar API yang kompatibel dengan OpenAIDASHBOARD_PORThanya menimpa dashboard/pendengar Next.js- Setel
NEXT_PUBLIC_BASE_URLke dasbor/URL publik Anda (untuk panggilan balik OAuth)
Cloud sync errors
- Verifikasi
BASE_URLpoin ke instance Anda yang sedang berjalan - Verifikasi
CLOUD_URLpoin ke titik akhir cloud yang Anda harapkan - Jaga agar nilai
NEXT_PUBLIC_*selaras dengan nilai sisi server
First login not working
- Periksa
INITIAL_PASSWORDdi.env - Jika tidak disetel, kata sandi cadangan adalah
123456
Tidak ada log permintaan
call_logsdi SQLite menyimpan metadata ringkasan untuk tabel Log Permintaan dan tampilan analitik- Muatan permintaan/respons terperinci ditulis ke
DATA_DIR/call_logs/sebagai satu artefak JSON per permintaan - Aktifkan pengambilan saluran pipa dari Dasbor → Log → Log Permintaan jika Anda memerlukan muatan per tahap yang terperinci
Export Logsmembaca file artefak sesuai permintaan, sementaraExport Allmenyertakan direktoricall_logs/bersamastorage.sqlite- Setel
APP_LOG_TO_FILE=truejika Anda juga ingin log konsol aplikasi dilogs/application/app.log - Sesuaikan
APP_LOG_MAX_FILE_SIZE,APP_LOG_RETENTION_DAYS,APP_LOG_MAX_FILES, danCALL_LOG_MAX_ENTRIESsesuai kebutuhan
Tes koneksi menunjukkan "Tidak Valid" untuk penyedia yang kompatibel dengan OpenAI
- Banyak penyedia tidak mengekspos titik akhir
/models - OmniRoute v1.0.6+ menyertakan validasi fallback melalui penyelesaian obrolan
- Pastikan URL dasar menyertakan akhiran
/v1
🔐 OAuth di Server Jarak Jauh
⚠️ Penting bagi pengguna yang menjalankan OmniRoute di VPS, Docker, atau server jarak jauh mana pun
Kredensial OAuth yang disertakan dalam OmniRoute didaftarkan hanya untuk localhost. Saat Anda mengakses OmniRoute di server jarak jauh (misalnya https://omniroute.myserver.com), Google menolak autentikasi dengan:
Error 400: redirect_uri_mismatch
Solusi: Konfigurasikan kredensial OAuth Anda sendiri
Anda perlu membuat ID Klien OAuth 2.0 di Google Cloud Console dengan URI server Anda.
Langkah demi langkah
1. Open Google Cloud Console
Go to: https://console.cloud.google.com/apis/credentials
2. Buat ID Klien OAuth 2.0 baru
- Klik "+ Buat Kredensial" → "ID klien OAuth"
- Jenis aplikasi: "Aplikasi web"
- Nama: apa pun yang Anda suka (mis.
OmniRoute Remote)
3. Add Authorized Redirect URIs
Di kolom "URI pengalihan resmi", tambahkan:
https://your-server.com/callback
Ganti
your-server.comdengan domain atau IP server Anda (sertakan port jika diperlukan, misalnyahttp://45.33.32.156:20128/callback).
4. Simpan dan salin kredensial
Setelah pembuatan, Google akan menampilkan ID Klien dan Rahasia Klien.
5. Tetapkan variabel lingkungan
Di .env Anda (atau variabel lingkungan Docker):
# For Antigravity:
ANTIGRAVITY_OAUTH_CLIENT_ID=your-client-id.apps.googleusercontent.com
ANTIGRAVITY_OAUTH_CLIENT_SECRET=GOCSPX-your-secret
GEMINI_OAUTH_CLIENT_ID=your-client-id.apps.googleusercontent.com
GEMINI_OAUTH_CLIENT_SECRET=GOCSPX-your-secret
6. Restart OmniRoute
# npm:
npm run dev
# Docker:
docker restart omniroute
7. Try connecting again
Google will now redirect correctly to https://your-server.com/callback.
Solusi sementara (tanpa kredensial kustom)
Jika Anda tidak ingin menyiapkan kredensial Anda sendiri saat ini, Anda masih dapat menggunakan alur URL manual:
- OmniRoute membuka URL otorisasi Google
- Setelah otorisasi, Google mencoba mengalihkan ke
localhost(yang gagal di server jauh) - Salin URL lengkap dari bilah alamat browser Anda (meskipun halaman tidak dimuat)
- Tempelkan URL tersebut ke bidang yang ditampilkan di modal koneksi OmniRoute
- Klik "Hubungkan"
Ini berfungsi karena kode otorisasi di URL valid terlepas dari apakah halaman pengalihan dimuat.
🛠️ Stack Teknologi
Klik untuk membuka detail stack teknologi
- Runtime: Node.js 18–22 LTS (⚠️ Node.js 24+ tidak didukung —
better-sqlite3biner asli tidak kompatibel) - Bahasa: TypeScript 5.9 — 100% TypeScript di
src/danopen-sse/(nolanydalam modul inti sejak v2.0) - Kerangka Kerja: Next.js 16 + React 19 + Tailwind CSS 4
- Database: lebih baik-sqlite3 (SQLite) + LowDB (JSON legacy) — status domain, log proksi, audit MCP, keputusan perutean, memori, keterampilan
- Skema: Zod (validasi I/O alat MCP, kontrak API)
- Protokol: MCP (stdio/HTTP) + A2A v0.3 (JSON-RPC 2.0 + SSE)
- Streaming: Peristiwa Terkirim Server (SSE)
- Auth: OAuth 2.0 (PKCE) + JWT + Kunci API + Otorisasi Cakupan MCP
- Pengujian: Pelari pengujian Node.js + Vitest (900+ pengujian termasuk unit, integrasi, E2E)
- CI/CD: Tindakan GitHub (publikasi npm otomatis + Docker Hub saat dirilis)
- Situs Web: omniroute.online
- Paket: npmjs.com/package/omniroute
- Pekerja Pelabuhan: hub.docker.com/r/diegosouzapw/omniroute
- Ketahanan: Pemutus arus, backoff eksponensial, kawanan anti-thundering, spoofing TLS, penyembuhan diri kombo otomatis
Dokumentasi
| Document | Description |
|---|---|
| User Guide | Penyedia, kombo, integrasi CLI, penerapan |
| API Reference | Semua titik akhir dengan contoh |
| MCP Server | 25 alat MCP, konfigurasi IDE, klien Python/TS/Go |
| A2A Server | Protokol JSON-RPC 2.0, keterampilan, streaming, manajemen tugas |
| Auto-Combo Engine | 6-factor scoring, mode packs, self-healing |
| Context Relay | Strategi penyerahan sesi untuk rotasi akun |
| Troubleshooting | Masalah umum dan solusinya |
| Architecture | Arsitektur sistem dan internal |
| Codebase Documentation | Beginner-friendly codebase walkthrough |
| Uninstall Guide | Penghapusan bersih untuk semua metode instalasi |
| Environment Config | Lengkapi .env variabel dan referensi |
| Contributing | Pengaturan dan pedoman pengembangan |
| OpenAPI Spec | OpenAPI 3.0 specification |
| Security Policy | Pelaporan kerentanan dan praktik keamanan |
| VM Deployment | Panduan lengkap: pengaturan VM + nginx + Cloudflare |
| Features Gallery | Tur dasbor visual dengan tangkapan layar |
| Release Checklist | Pre-release validation steps |
🗺️ Roadmap
OmniRoute memiliki 218+ fitur yang direncanakan di berbagai fase pengembangan. Berikut adalah bidang-bidang utamanya:
| Category | Planned Features | Highlights |
|---|---|---|
| 🧠 Routing & Intelligence | 25+ | Perutean latensi terendah, perutean berbasis tag, preflight kuota, P2C sadar kuota, perutean kombo berbasis langkah |
| 🔒 Security & Compliance | 20+ | Pengerasan SSRF, penyelubungan kredensial, batas tarif per titik akhir, pelingkupan kunci manajemen |
| 📊 Observability | 15+ | Integrasi OpenTelemetry, pemantauan kuota waktu nyata, kesehatan target kombo, pelacakan biaya per model |
| 🔄 Provider Integrations | 20+ | Registri model dinamis, cooldown koneksi, Codex multi-akun, penguraian kuota Salinan |
| ⚡ Performance | 15+ | Lapisan cache ganda, cache cepat, cache respons, streaming keepalive, API batch |
| 🌐 Ecosystem | 10+ | WebSocket API, config hot-reload, distributed config store, commercial mode |
🔜 Segera Hadir
- 🔗 Integrasi OpenCode — Dukungan penyedia asli untuk IDE pengkodean AI OpenCode
- 🔗 Integrasi TRAE — Dukungan penuh untuk kerangka pengembangan AI TRAE
- 📦 Batch API — Pemrosesan batch asinkron untuk permintaan massal
- 🎯 Perutean Berbasis Tag — Merutekan permintaan berdasarkan tag dan metadata khusus
- 💰 Strategi Biaya Terendah — Secara otomatis memilih penyedia termurah yang tersedia
📝 Spesifikasi fitur lengkap tersedia di docs/new-features/ (217 spesifikasi detail)
👥 Kontributor
Cara Berkontribusi
- Cabangkan repositori
- Buat cabang fitur Anda (
git checkout -b feature/amazing-feature) - Komit perubahan Anda (
git commit -m 'Add amazing feature') - Dorong ke cabang (
git push origin feature/amazing-feature) - Buka Permintaan Tarik
Lihat CONTRIBUTING.md untuk panduan detailnya.
Merilis Versi Baru
# Create a release — npm publish happens automatically
gh release create v2.0.0 --title "v2.0.0" --generate-notes
📊 Riwayat Star
🌍 StarMapper
🙏 Ucapan Terima Kasih
Terima kasih khusus kepada CLIProxyAPI — implementasi Go asli yang menginspirasi port JavaScript ini.
Lisensi
Lisensi MIT - lihat LICENSE untuk detailnya.









