# Environment Variables Reference (Filipino)
🌐 **Languages:** 🇺🇸 [English](../../../../reference/ENVIRONMENT.md) · 🇪🇹 [am](../../../am/docs/reference/ENVIRONMENT.md) · 🇸🇦 [ar](../../../ar/docs/reference/ENVIRONMENT.md) · 🇦🇿 [az](../../../az/docs/reference/ENVIRONMENT.md) · 🇧🇬 [bg](../../../bg/docs/reference/ENVIRONMENT.md) · 🇧🇩 [bn](../../../bn/docs/reference/ENVIRONMENT.md) · 🇧🇦 [bs](../../../bs/docs/reference/ENVIRONMENT.md) · 🇨🇿 [cs](../../../cs/docs/reference/ENVIRONMENT.md) · 🇩🇰 [da](../../../da/docs/reference/ENVIRONMENT.md) · 🇩🇪 [de](../../../de/docs/reference/ENVIRONMENT.md) · 🇬🇷 [el](../../../el/docs/reference/ENVIRONMENT.md) · 🇪🇸 [es](../../../es/docs/reference/ENVIRONMENT.md) · 🇪🇪 [et](../../../et/docs/reference/ENVIRONMENT.md) · 🇮🇷 [fa](../../../fa/docs/reference/ENVIRONMENT.md) · 🇫🇮 [fi](../../../fi/docs/reference/ENVIRONMENT.md) · 🇫🇷 [fr](../../../fr/docs/reference/ENVIRONMENT.md) · 🇮🇪 [ga](../../../ga/docs/reference/ENVIRONMENT.md) · 🇮🇳 [gu](../../../gu/docs/reference/ENVIRONMENT.md) · 🇳🇬 [ha](../../../ha/docs/reference/ENVIRONMENT.md) · 🇮🇱 [he](../../../he/docs/reference/ENVIRONMENT.md) · 🇮🇳 [hi](../../../hi/docs/reference/ENVIRONMENT.md) · 🇭🇷 [hr](../../../hr/docs/reference/ENVIRONMENT.md) · 🇭🇺 [hu](../../../hu/docs/reference/ENVIRONMENT.md) · 🇦🇲 [hy](../../../hy/docs/reference/ENVIRONMENT.md) · 🇮🇩 [id](../../../id/docs/reference/ENVIRONMENT.md) · 🇳🇬 [ig](../../../ig/docs/reference/ENVIRONMENT.md) · 🇮🇹 [it](../../../it/docs/reference/ENVIRONMENT.md) · 🇯🇵 [ja](../../../ja/docs/reference/ENVIRONMENT.md) · 🇬🇪 [ka](../../../ka/docs/reference/ENVIRONMENT.md) · 🇰🇭 [km](../../../km/docs/reference/ENVIRONMENT.md) · 🇮🇳 [kn](../../../kn/docs/reference/ENVIRONMENT.md) · 🇰🇷 [ko](../../../ko/docs/reference/ENVIRONMENT.md) · 🇱🇹 [lt](../../../lt/docs/reference/ENVIRONMENT.md) · 🇱🇻 [lv](../../../lv/docs/reference/ENVIRONMENT.md) · 🇮🇳 [ml](../../../ml/docs/reference/ENVIRONMENT.md) · 🇮🇳 [mr](../../../mr/docs/reference/ENVIRONMENT.md) · 🇲🇾 [ms](../../../ms/docs/reference/ENVIRONMENT.md) · 🇲🇹 [mt](../../../mt/docs/reference/ENVIRONMENT.md) · 🇲🇲 [my](../../../my/docs/reference/ENVIRONMENT.md) · 🇳🇵 [ne](../../../ne/docs/reference/ENVIRONMENT.md) · 🇳🇱 [nl](../../../nl/docs/reference/ENVIRONMENT.md) · 🇳🇴 [no](../../../no/docs/reference/ENVIRONMENT.md) · 🇮🇳 [or](../../../or/docs/reference/ENVIRONMENT.md) · 🇮🇳 [pa](../../../pa/docs/reference/ENVIRONMENT.md) · 🇵🇱 [pl](../../../pl/docs/reference/ENVIRONMENT.md) · 🇵🇹 [pt](../../../pt/docs/reference/ENVIRONMENT.md) · 🇧🇷 [pt-BR](../../../pt-BR/docs/reference/ENVIRONMENT.md) · 🇷🇴 [ro](../../../ro/docs/reference/ENVIRONMENT.md) · 🇷🇺 [ru](../../../ru/docs/reference/ENVIRONMENT.md) · 🇱🇰 [si](../../../si/docs/reference/ENVIRONMENT.md) · 🇸🇰 [sk](../../../sk/docs/reference/ENVIRONMENT.md) · 🇸🇮 [sl](../../../sl/docs/reference/ENVIRONMENT.md) · 🇷🇸 [sr](../../../sr/docs/reference/ENVIRONMENT.md) · 🇸🇪 [sv](../../../sv/docs/reference/ENVIRONMENT.md) · 🇰🇪 [sw](../../../sw/docs/reference/ENVIRONMENT.md) · 🇮🇳 [ta](../../../ta/docs/reference/ENVIRONMENT.md) · 🇮🇳 [te](../../../te/docs/reference/ENVIRONMENT.md) · 🇹🇭 [th](../../../th/docs/reference/ENVIRONMENT.md) · 🇹🇷 [tr](../../../tr/docs/reference/ENVIRONMENT.md) · 🇺🇦 [uk-UA](../../../uk-UA/docs/reference/ENVIRONMENT.md) · 🇵🇰 [ur](../../../ur/docs/reference/ENVIRONMENT.md) · 🇺🇿 [uz](../../../uz/docs/reference/ENVIRONMENT.md) · 🇻🇳 [vi](../../../vi/docs/reference/ENVIRONMENT.md) · 🇳🇬 [yo](../../../yo/docs/reference/ENVIRONMENT.md) · 🇨🇳 [zh-CN](../../../zh-CN/docs/reference/ENVIRONMENT.md) · 🇹🇼 [zh-TW](../../../zh-TW/docs/reference/ENVIRONMENT.md)
---
> Kumpletong sanggunian para sa bawat environment variable na kinikilala ng OmniRoute.
> Para sa template ng mabilisang pagsisimula, tingnan ang [`.env.example`](../../.env.example).
> [!IMPORTANT]
> Ang bawat variable na nakadokumento rito ay dapat ding lumitaw sa `.env.example`, at
> ang bawat variable sa `.env.example` ay dapat lumitaw rito. Ipinapatupad ito ng `npm run check:env-doc-sync`
> sa commit at sa CI. Upang sadyang hindi isama ang isang variable, idagdag ito sa
> allowlist sa loob ng `scripts/check/check-env-doc-sync.mjs`.
---
## Talaan ng mga Nilalaman
- [1. Mga Kinakailangang Lihim](#1-required-secrets)
- [2. Storage at Database](#2-storage--database)
- [3. Network at mga Port](#3-network--ports)
- [4. Seguridad at Authentication](#4-security--authentication)
- [5. Sanitization ng Input at Proteksyon ng PII](#5-input-sanitization--pii-protection)
- [6. Mga Patakaran sa Tool at Routing](#6-tool--routing-policies)
- [7. Mga URL at Cloud Sync](#7-urls--cloud-sync)
- [8. Outbound Proxy](#8-outbound-proxy)
- [9. Integrasyon ng CLI Tool](#9-cli-tool-integration)
- [10. Mga Integrasyon ng Internal Agent at MCP](#10-internal-agent--mcp-integrations)
- [11. Mga Kredensyal ng OAuth Provider](#11-oauth-provider-credentials)
- [12. Mga Override sa User-Agent ng Provider](#12-provider-user-agent-overrides)
- [13. Compatibility ng CLI Fingerprint](#13-cli-fingerprint-compatibility)
- [14. Mga Provider ng API Key](#14-api-key-providers)
- [15. Mga Setting ng Timeout](#15-timeout-settings)
- [16. Pag-log](#16-logging)
- [17. Pag-optimize ng Memory](#17-memory-optimization)
- [18. Pag-sync ng Presyo](#18-pricing-sync)
- [19. Pag-sync ng Modelo (Dev)](#19-model-sync-dev)
- [20. Mga Setting na Partikular sa Provider](#20-provider-specific-settings)
- [21. Kalagayan ng Proxy](#21-proxy-health)
- [22. Pag-debug](#22-debugging)
- [23. Integrasyon ng GitHub](#23-github-integration)
- [24. Skills Sandbox (v3.8.0+)](#24-skills-sandbox-v380)
- [27. Radar Feed (Self-Hosting)](#27-radar-feed-self-hosting)
- [Mga Sitwasyon ng Deployment](#deployment-scenarios)
- [Audit: Mga Inalis / Hindi na Ginagamit na Variable](#audit-removed--dead-variables)
---
## 1. Mga Kinakailangang Secret
Ang mga hindi naka-set na secret na minarkahang **Oo** ay awtomatikong nage-generate sa unang pagtakbo (`JWT_SECRET`, `API_KEY_SECRET`) at ini-persist sa `server.env` sa data directory — i-set ang mga ito nang tahasan kapag ephemeral ang directory na iyon. Ang pagbubukod ay ang `OMNIROUTE_WS_BRIDGE_SECRET`: hindi ito ini-persist sa `server.env` — ang mga server entrypoint ay lumilikha ng ephemeral na halaga bawat boot na tanging ang in-process bridge ang makakagamit, kaya kailangan itong i-set nang tahasan ng mga external bridge client.
| Variable | Kinakailangan | Default | Source File | Paglalarawan |
| ---------------------------- | ------------------- | ------------------- | --------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `JWT_SECRET` | **Oo** | _(wala)_ | `src/lib/auth` | Pumipirma/Nagbe-verify ng lahat ng session cookie ng dashboard (JWT). I-generate gamit ang `openssl rand -base64 48`. |
| `API_KEY_SECRET` | **Oo** | _(wala)_ | `src/lib/db/apiKeys.ts` | Susi ng AES encryption para sa mga halaga ng API key na nakaimbak sa SQLite. I-generate gamit ang `openssl rand -hex 32`. |
| `INITIAL_PASSWORD` | Hindi | _(hindi naka-set)_ | `src/lib/auth/managementPassword.ts` | Nagse-set ng password ng dashboard sa startup habang wala pang nai-save; binabaliwala kapag may nai-save nang password. Ang mga npm at source install ay kumokopya ng `.env.example` papunta sa `.env`, kaya nagsisimula ang mga ito sa pampublikong kilalang placeholder nito na `CHANGEME`: palitan ito bago ang unang boot, o i-set ang `INITIAL_PASSWORD=` (walang laman) sa `.env` na iyon upang likhain ang password sa onboarding wizard sa unang pagbisita, tulad ng ginagawa ng hindi naka-set na halaga (ang default ng Docker image). Baguhin ang nai-save na password sa Dashboard → Settings → Security, o patakbuhin ang `omniroute reset-password` (`node bin/reset-password.mjs` sa isang source checkout) na may `DATA_DIR` na naka-set sa data directory ng server. |
| `OMNIROUTE_WS_BRIDGE_SECRET` | **Oo** (production) | _(hindi naka-set)_ | `src/app/api/internal/codex-responses-ws/route.ts` | Shared secret para sa internal na Codex Responses WebSocket bridge. Nag-aauthenticate ng mga bridge request sa pagitan ng Electron/browser WS relay at ng OmniRoute. ⚠️ **KINAKAILANGAN sa production — kapag hindi naka-set, lahat ng WS bridge request ay tinatanggihan.** I-generate gamit ang `openssl rand -base64 32`. |
| `OMNIROUTE_SW_BUILD_ID` | Hindi | _(git SHA)_ | `next.config.mjs`, `scripts/build/assembleStandalone.mjs` | Tahasang service-worker cache-busting id para sa PWA shell (#11779); una sa resolution chain. |
| `SOURCE_VERSION` | Hindi | _(hindi naka-set)_ | `next.config.mjs`, `scripts/build/assembleStandalone.mjs` | Pangalawa sa chain — sine-set ng mga PaaS builder (hal. Heroku-style) bilang ang deployed commit. |
| `NEXT_PUBLIC_SW_BUILD_ID` | Hindi | _(hinango)_ | `src/shared/components/PwaRegister.tsx` | Build-time na pampublikong halaga na ginagamit ng client para i-register ang `/sw.js?v=…`; hinango mula sa dalawa sa itaas, pagkatapos ang git SHA. |
| `OMNIROUTE_PEER_STAMP_TOKEN` | Hindi (auto) | _(auto bawat boot)_ | `src/server/authz/policies/management.ts` | Per-process na secret na nagpapatunay na ang trusted peer-IP stamp ay nagmula sa sariling HTTP server ng OmniRoute (`scripts/dev/peer-stamp.mjs`). Titiwala lamang ang authz middleware sa request locality (loopback/LAN gating ng mga LOCAL_ONLY route) kapag dala ng stamp ang token na ito. Awtomatikong nage-generate bawat boot — iwanang hindi naka-set; i-pin lamang ito para sa mga multi-process setup na kailangang magbahagi ng stamp. |
| `OMNIROUTE_TRUSTED_PROXIES` | Hindi | _(hindi naka-set)_ | `scripts/dev/peer-stamp.mjs` | Mga comma-separated IP o CIDR range ng mga reverse proxy na maaaring paniwalaan ng IP allow/deny list ang kanilang `X-Forwarded-For` / `X-Real-IP`, bukod pa sa loopback, mga private-network address, at Cloudflare edge, na laging pinagkakatiwalaan. Kailangan lamang para sa proxy sa anumang ibang pampublikong address; kung hindi, ang sariling address ng proxy ang hahatulan ng filter. Ang per-client throttle ng relay (`/api/v1/relay/chat/completions`) ay nagki-key sa parehong resolved client address, hindi kailanman sa mga forwarding header lamang. |
### Mga Command para sa Pag-generate
```bash
# I-generate ang lahat ng apat na secret nang sabay-sabay:
echo "JWT_SECRET=$(openssl rand -base64 48)"
echo "API_KEY_SECRET=$(openssl rand -hex 32)"
echo "INITIAL_PASSWORD=$(openssl rand -base64 16)"
echo "OMNIROUTE_WS_BRIDGE_SECRET=$(openssl rand -base64 32)"
```
> [!CAUTION]
> Huwag kailanman i-commit ang mga `.env` file na may totoong secret sa version control. Ang `.gitignore` ay nag-eexclude na ng `.env`, ngunit mag-verify bago mag-push.
---
## 2. Imbakan at Database
Gumagamit ang OmniRoute ng **SQLite** (sa pamamagitan ng `better-sqlite3`) para sa lahat ng persistence. Kinokontrol ng mga variable na ito ang lokasyon ng data, encryption, at lifecycle.
| Variable | Default | Source File | Paglalarawan |
| ------------------------------------------ | ------------------------------- | ----------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `DATA_DIR` | `~/.omniroute/` | `src/lib/db/core.ts` | Root directory para sa SQLite DB, mga backup, at mga data file. I-override para sa Docker volumes o custom na mga path. |
| `OMNIROUTE_ALLOW_DEFAULT_DATA_DIR` | _(hindi nakatakda)_ | `src/lib/dataPaths.ts` | Escape hatch para sa test/eval `DATA_DIR` guard (#10428). Ang mga test at Node eval/print probe (`-e`/`--eval`/`-p`/`--print`, kabilang ang mga anyong `--eval=`/`--print=`) na walang `DATA_DIR` ay dinidivert sa isang pansamantalang temp dir upang hindi nila mabuksan ang tunay na database ng operator; itakda sa `1` upang muling mag-opt in sa tunay na directory. |
| `OMNIROUTE_BUILD_SHA` | _(hindi nakatakda)_ | `src/lib/monitoring/buildSha.ts` | Git SHA ng tumatakbong artifact. Ini-stamp ng `npm run build:release`; nai-inject sa mga container na ipinadadala nang walang `dist/BUILD_SHA` sentinel. Ipinapakita bilang `system.buildSha` sa `/api/monitoring/health`. |
| `OMNIROUTE_RELEASE_REF` | `origin/main` | `scripts/build/buildProvenance.ts` | Ref kung saan tinitingnan ng pack-artifact provenance gate ang build SHA (#10427). |
| `OMNIROUTE_ALLOW_CANARY_BUILD` | _(hindi nakatakda)_ | `scripts/build/buildProvenance.ts` | Itakda sa `1` upang payagan ang pag-pack ng isang build na ang SHA ay wala sa release line, na itinatala ito bilang isang sinasadyang canary sa halip na i-fail ang gate (#10427). |
| `OMNIROUTE_SMOKE_API_KEY` | _(hindi nakatakda)_ | `scripts/ops/deploy-canary.mjs` | API key para sa canary-deploy smoke probe, ipinapadala bilang `Authorization: Bearer` sa `/v1/chat/completions`. Ginagamit lamang ng deploy script (#10429), hindi kailanman ng server. Hindi kaugnay ng mga variable na `OMNIROUTE_SMOKE_*` ng opt-in CLI smoke harness (`RUN_CLI_SMOKE=1`, `OMNIROUTE_SMOKE_BASE_URL/MODEL/API_KEY_ENV/TARGETS/TIMEOUT_MS` sa `tests/integration/upstream-cli-smoke.int.test.ts`) — tingnan ang [Mga CLI Integration → Tunay na smoke sweep](../guides/CLI-INTEGRATIONS.md). |
| `OMNIROUTE_BUILDING` | _(hindi nakatakda)_ | `src/lib/buildPhase.ts` | Signal ng build-phase (#10060): itinatakda sa `1` ng `scripts/build/build-next-isolated.mjs` at minamana ng bawat spawned build worker upang magbalik ang DB layer ng no-op stub sa halip na i-load ang native better-sqlite3 addon (na nag-a-abort sa worker sa exit). Hindi kailanman itinatakda para sa tumatakbong server. |
| `OMNIROUTE_SKIP_NATIVE_DEP_CHECK` | `0` | `scripts/check/check-native-deps.mjs` | Itakda sa `1` upang laktawan ang opsyonal na native-dependency prebuild check para sa mga exotic na vendored tree. Hindi nito nagagawang ma-build ang isang nawawalang dependency; gamitin lamang kapag ang mga native dependency ay ibinibigay nang out of band. |
| `OMNIROUTE_DATA_DIR` | _(hindi nakatakda)_ | `open-sse/executors/promptql/threadSticky.ts` | **Fallback alias** para sa `DATA_DIR`, chine-check lamang kapag hindi nakatakda ang `DATA_DIR`. Ginagamit upang hanapin ang on-disk thread-sticky session cache ng PromptQL executor (`
/promptql-thread-sessions.json`); kung walang nakatakdang alinman sa mga variable, ang cache ay mananatili sa memory lamang (hindi nape-persist sa mga restart). |
| `OMNIROUTE_PLUGINS_DIR` | _(hindi nakatakda)_ | `src/lib/plugins/scanner.ts` | Directory na binabasa ng **runtime plugin scanner** — at ang root kung saan nag-i-install ang plugin manager — na nag-o-override sa home-derived default (#11827). Ituro ito sa bind-mounted plugin tree sa Docker/K8s sa halip na ilipat ang HOME para lamang ilipat ang scan path (ang HOME rin ang namamahala sa bawat iba pang home-relative na gawi). Hindi nakatakda = `~/.omniroute/plugins`, o `/tmp/.omniroute/plugins` kapag ang proseso ay walang anumang home na naka-export — ang tahimik na non-discovery na inaalis ng variable na ito. Ang resolved na directory ay nai-log nang isang beses sa startup bilang `scanner.dir_resolved` kasama ang input na nanalo. Server-side lamang: ang mga CLI command plugin ay nagpapanatili ng sariling `OMNIROUTE_PLUGIN_PATH` (seksyon 9). |
| `STORAGE_ENCRYPTION_KEY` | _(walang laman = naka-disable)_ | `src/lib/db/encryption.ts` | AES key para sa buong pag-encrypt ng SQLite database at rest. I-generate gamit ang `openssl rand -hex 32`. |
| `STORAGE_ENCRYPTION_KEY_VERSION` | `v1` | `scripts/build/bootstrap-env.mjs`, `electron/main.js` | Label ng bersyon para sa encryption key. Taasan kapag nagsasagawa ng key rotation para suportahan ang pag-decrypt ng mga lumang backup. |
| `DISABLE_SQLITE_AUTO_BACKUP` | `false` | `src/lib/db/backup.ts` | Kapag `true`, nilalaktawan ang mga routine/pre-write na backup ng SQLite file (models.dev pricing save/clear, mga pagsulat ng settings). Ang mga manual at pre-restore na backup ay tumatakbo pa rin. **Hindi** nito dine-disable ang mandatory durable safety snapshot ng migration runner o ang mass-migration guard para sa isang umiiral na persistent DB. Ang mga non-manual na backup ay naka-throttle sa hindi hihigit sa isang beses bawat 60 minuto. Ang Dashboard **Settings → Storage** ay maaaring mag-disable ng routine auto-backup nang nakapag-iisa. |
| `OMNIROUTE_SQLITE_SLOW_MS` | _(hindi naka-set/patay)_ | `src/lib/db/adapters/slowDiagnostics.ts` | Milliseconds; ang mga halagang mas mababa sa 1 o hindi numeriko ay mananatiling patay; nagbababala nang hindi hihigit sa isang beses bawat 10s; ang log line ay may driver, operation, at elapsedMs lamang. |
| `OMNIROUTE_CRYPT_KEY` | _(hindi naka-set)_ | `src/lib/db/encryption.ts` | **Legacy alias** para sa `STORAGE_ENCRYPTION_KEY`. Tinatanggap bilang fallback kapag wala ang pangunahing variable. |
| `OMNIROUTE_API_KEY_BASE64` | _(hindi naka-set)_ | `src/lib/db/encryption.ts` | **Legacy alias** (Base64-encoded na anyo) na tinatanggap bilang fallback. Awtomatikong dine-decode bago gamitin. |
| `OMNIROUTE_DB_HEALTHCHECK_INTERVAL_MS` | _(hindi naka-set)_ | `src/lib/db/core.ts` | I-override ang periodic na interval ng SQLite healthcheck (ms). Kapag hindi naka-set, ang mga default ay hinuhugot mula sa `NODE_ENV`. |
| `OMNIROUTE_WAL_TRUNCATE_INTERVAL_MS` | _(inalis)_ | `src/lib/db/walMaintenance.ts` | **Inalis.** Ang isang periodic live na `wal_checkpoint(TRUNCATE)` ay maaaring mag-invalidate ng shared wal-index mapping at mag-crash ng proseso gamit ang SIGBUS (#13973), kaya ang scheduler ay hindi na umiiral. Ang variable ay inert: ang positibong halaga ay naglo-log ng isang one-time deprecation warning, habang ang `0` o hindi naka-set ay nananatiling tahimik. Ang WAL ay pinananatili ng mga PASSIVE checkpoint (sa ibaba) at tinutruncate ng shutdown checkpoint. |
| `OMNIROUTE_WAL_PASSIVE_INTERVAL_MS` | `300000` (5m) | `src/lib/db/walMaintenance.ts` | I-override ang madalas na interval ng `wal_checkpoint(PASSIVE)` (ms). Pinapanatiling maliit ang mga pending WAL frame para manatiling mabilis ang mga checkpoint at manatiling may hangganan ang WAL file sa pagitan ng mga shutdown truncation. Ang `0` ay nag-di-disable. |
| `OMNIROUTE_WAL_GUARD_MAX_MB` | `256` | `src/lib/db/walMaintenance.ts` | Kapag ang isang PASSIVE tick ay nakakita ng WAL file na lampas sa laki na ito, patakbuhin ang `wal_checkpoint(RESTART)` para magsimulang muli ang WAL nang hindi muling sinusulat ang mapped wal-index. Inalis ang mga live truncate-mode na checkpoint (tingnan ang row ng `OMNIROUTE_WAL_TRUNCATE_INTERVAL_MS`). |
| `OMNIROUTE_PRESSURE_SELF_RESTART` | `false` | `open-sse/utils/resourcePressure.ts` | I-set sa `1`/`true`/`yes`/`on` para i-exit ang proseso matapos mapanatili ang kritikal na resource pressure sa loob ng `OMNIROUTE_PRESSURE_SELF_RESTART_AFTER_MS`, na hinahayaan ang isang supervisor (systemd `Restart=always`, Docker restart policy) na magbalik ng malinis na proseso sa halip na mag-serve ng mga 503 nang walang katapusan. |
| `OMNIROUTE_PRESSURE_SELF_RESTART_AFTER_MS` | `120000` (2m) | `open-sse/utils/resourcePressure.ts` | Gaano katagal dapat magpatuloy ang kritikal na pressure bago mag-fire ang self-restart exit. |
| `OMNIROUTE_PRESSURE_PSI_DISABLED` | `false` | `open-sse/utils/resourcePressurePolicy.ts` | I-set sa `1`/`true`/`yes`/`on` para balewalain ang host-wide na `/proc/pressure/memory` (`psi_some` / `psi_full`) kapag ang isang noisy neighbor ay nag-trigger ng mga 503 habang maayos naman ang prosesong ito (#13124). Ang mga Cgroup at V8 heap guard ay mananatiling naka-on. Ang PSI ay humihinto rin sa pagbilang bilang patunay ng kernel throttle para sa `cgroup_high`: ang isang cgroup total na lampas sa `memory.high` ay nagiging kritikal lamang sa pagtaas ng `memory.events` `high`/`max`. Kung walang `memory.events`, pinananatili ang raw ratio. |
| `OMNIROUTE_SQLJS_WASM_PATH` | _(awtomatikong tinutukoy)_ | `src/lib/db/adapters/sqljsAdapter.ts` | Explicit na path (absolute o relative sa cwd) sa `sql-wasm.wasm` kapag ginagamit ang `sql.js` WASM fallback adapter. Awtomatikong natutukoy sa pamamagitan ng mga package dependency at candidate layouts kapag hindi naka-set. |
| `OMNIROUTE_BATCH_RETENTION_DAYS` | `30` | `src/lib/db/cleanup.ts` | Bilang ng araw na pinananatili ng awtomatikong cleanup sweep ang mga checkpoint ng isang terminal (completed/failed/cancelled/expired) na Batch API job, mga tinukoy na input/output/error file, at row nito bago burahin. Magkakabisa lamang kapag naka-on ang `BATCH_AND_FILE_AUTO_CLEANUP_ENABLED`; tumutugma sa sariling output retention window ng Batch API ng OpenAI. Hindi nito naaapektuhan ang rutang `DELETE /api/v1/batches/delete-completed` na pinaaandar ng operator, na nananatiling walang kondisyon (walang age filter) ayon sa disenyo. |
| `BATCH_AND_FILE_AUTO_CLEANUP_ENABLED` | `false` | `src/lib/db/cleanup.ts` | Kapag `true`, pinahihintulutan ang awtomatikong cleanup sweep na burahin ang mga terminal na Batch API job (at ang kanilang mga checkpoint) na lampas na sa `OMNIROUTE_BATCH_RETENTION_DAYS`, at linisin ang BLOB content ng mga na-upload na file na lampas na sa kanilang sariling `expires_at`. Naka-off bilang default: pinananatili ng bawat umiiral na install ang datos na ito nang eksaktong katulad ng dati hanggang sa mag-opt in ang isang operator. Isa rin itong feature flag na maaaring i-edit sa dashboard — tingnan ang `docs/reference/FEATURE_FLAGS.md` → Runtime. |
| `OMNIROUTE_SKIP_DB_HEALTHCHECK` | `0` | `src/lib/db/core.ts`, `src/lib/db/healthCheck.ts` | Itakda sa `1` upang laktawan nang lubusan ang DB healthcheck sa startup. Kapaki-pakinabang para sa mga short-lived na gawain at integration test. |
| `OMNIROUTE_FORCE_DB_HEALTHCHECK` | `0` | `src/lib/db/core.ts` | Itakda sa `1` upang pilitin ang DB healthcheck loop na naka-on, kahit karaniwan itong nilalaktawan (hal., mga short-lived na gawain). |
| `OMNIROUTE_SKIP_POSTINSTALL` | `0` | `scripts/postinstall.mjs` | Itakda sa `1` upang laktawan ang native-runtime warm-up habang `npm install`. Kapaki-pakinabang sa mga CI/headless na install kung saan nakabuo na ang sqlite. |
| `OMNIROUTE_MIGRATIONS_DIR` | _(auto-detect)_ | `src/lib/db/migrationRunner.ts` | I-override ang direktoryo na sino-scan ng migration runner. Kapaki-pakinabang kapag nagpapadala ng mga bundled migration sa mga custom build. |
| `OMNIROUTE_EXTRA_MIGRATIONS_DIRS` | _(unset)_ | `src/lib/db/migrationRunner/extraDirs.ts` | Mga karagdagang direktoryo ng migration bilang mga entry na `namespace=dir` na pinaghihiwalay ng platform path delimiter (hal. `ee=/opt/app/enterprise/db/migrations`). Ang mga file na matatagpuan doon ay naitatala bilang `-`, kaya ang isang distribution na nagpapadala ng sarili nitong mga migration ay hindi kailanman nagbabangga sa mga upstream numeric slot. Ang isang maling format na entry, isang invalid na namespace, o isang nawawalang direktoryo ay nagta-throw sa startup sa halip na tahimik na nilalaktawan ang schema. |
| `OMNIROUTE_MAX_PENDING_MIGRATIONS` | `50` | `src/lib/db/migrationRunner.ts` | Safety threshold para sa maraming pending migration (#3416). Ang startup ay nag-a-abort kapag higit sa dami ng mga migration na ito ang pending sa isang umiiral na DB (nagbabantay laban sa isang naburang tracking table). Taasan ito upang ma-restore ang mas lumang backup; itakda sa `0` upang i-disable ang pagsusuri. |
| `OMNIROUTE_INSTALL_UPGRADE_WORKDIR` | _(`/.install-upgrade`)_ | `scripts/check/check-install-upgrade.mjs` | Working directory para sa release gate na `check:install-upgrade`. Kailangan nito ng humigit-kumulang 12 GB (dalawang ~3 GB na install tree dagdag pa ang tarball), kaya hindi ito dapat tumakbo sa isang maliit na tmpfs — sa self-hosted runner, ang `/tmp` ay isang 12 GB na RAM-backed na tmpfs at naubos ito ng gate, na nagpa-truncate sa package. |
| `OMNIROUTE_SPEND_FLUSH_INTERVAL_MS` | _(default in code)_ | `src/lib/spend/batchWriter.ts` | Flush interval (ms) para sa batched spend/cost writer. Ang mas mabababang halaga ay nagbabawas ng write coalescing; ang mas matataas na halaga ay nagbabawas ng DB contention. |
| `OMNIROUTE_SPEND_MAX_BUFFER_SIZE` | _(default in code)_ | `src/lib/spend/batchWriter.ts` | Pinakamataas na bilang ng mga buffered spend entry bago ang isang forced flush. Taasan sa mga high-QPS na deployment; bawasan kapag mas mahalaga ang bounded memory. |
| `OMNIROUTE_PROXY_FETCH_DEBUG` | _(unset)_ | `open-sse/utils/proxyFetch.ts` | Itakda sa `"true"` upang mag-emit ng mga debug log na `[ProxyFetch]` sa Vercel relay path. Naka-off bilang default upang maiwasang mag-leak ng mga routing hint. |
| `OMNIROUTE_PROXY_CORE_BINARY_PATH` | _(unset)_ | `src/lib/proxySubscription/coreConfig/sync.ts` | Absolute path ng lokal na proxy core binary (isang file na nagngangalang `sing-box`) na nagche-check ng isang nagawang core configuration bago nito palitan ang adopted file. Kapag unset, isinusulat lamang ang `.generated` sa tabi ng adopted file. Host environment lamang: hindi kailanman iniimbak sa database o tinatanggap sa pamamagitan ng management API, dahil ang binary ay pinaandar. |
| `OMNIROUTE_PROXY_CORE_RELOAD_COMMAND` | _(unset)_ | `src/lib/proxySubscription/coreConfig/reload.ts` | Kung paano nagre-reload ang lokal na proxy core pagkatapos ng isang na-verify na pagpapalit ng config: isang JSON argument array na pinapatakbo nang walang shell, o eksaktong `external` kapag isang panlabas na observer ang nag-a-apply ng file. Hindi kailanman iniimbak sa database o inilalantad sa pamamagitan ng API. |
| `PROXY_LOG_INCLUDE_IPS` | `false` | `src/lib/proxyLogger.ts` | Itakda sa `"true"` o `"1"` upang isama ang mga client/egress IP at ang account prefix sa verbose na linya ng process log na `[ProxyEgress]`. Naka-OFF bilang default upang hindi makalabas ang mga IP o ang account prefix sa process log. |
| `OMNIROUTE_DEBUG` | _(hindi nakatakda)_ | `bin/cli/commands/quota.mjs` | Itakda sa `1` upang i-print ang mga diagnostics ng per-request na timing (`[omniroute] GET completed in Nms`) mula sa mga CLI quota command papunta sa stderr. |
| `OMNIROUTE_HEALTHCHECK_PATH` | _(awtomatiko)_ | `scripts/dev/healthcheck.mjs` | Explicit na path na sinusuri ng container health check. Kapag hindi nakatakda, hinihango ito ng probe mula sa `OMNIROUTE_BASE_PATH`; ang pagtatakda nito ay nagbabalik sa paggamit ng deep monitoring endpoint. |
| `OMNIROUTE_DEBUG_COMPLETION` | _(hindi nakatakda)_ | `bin/cli/commands/completion.mjs` | Itakda sa anumang may laman na halaga upang maglabas ng mga diagnostics na `[omniroute completion]` mula sa mga cache path ng CLI shell-completion (read/refresh/write). Nakapatay bilang default — ang mga cache na iyon ay tahimik na nabibigo kaya ang nawawala o sirang cache ay hindi kailanman sumisira sa tab-completion. |
| `BATCH_RETRY_DURATION_MS` | `86400000` (24h) | `open-sse/services/batchProcessor.ts` | Pinakamataas na retry window para sa mga indibidwal na batch item (ms). Ang mga item na lalampas sa tagal na ito ay mamarkahan bilang nabigo. |
| `BATCH_BACKOFF_BASE_MS` | `5000` | `open-sse/services/batchProcessor.ts` | Base na delay (ms) para sa exponential backoff sa mga retry ng batch item. |
| `BATCH_BACKOFF_MAX_MS` | `3600000` (1h) | `open-sse/services/batchProcessor.ts` | Hangganan (ms) para sa exponential backoff sa pagitan ng mga retry ng batch item. |
| `BATCH_MAX_CONCURRENT` | `1` | `open-sse/services/batchProcessor.ts` | Pinakamataas na bilang ng mga batch na pinoproseso nang sabay-sabay. Taasan upang mapalaki ang throughput; panatilihing mababa upang maiwasan ang mga rate-limit storm. |
> [!IMPORTANT]
> Bago baguhin ang isang umiiral na persistent na database, naglalabas ang migration runner ng isang kumpleto,
> content-addressed na snapshot sa ilalim ng `DATA_DIR/db_backups/`. Ang paglalabas ay nangangailangan ng
> filesystem na sumusuporta sa same-filesystem, no-overwrite na hard links kasama ang durable na file sync.
> Ang mga POSIX host ay nangangailangan din ng directory sync; sa Windows, maaaring tanggihan ng Node ang mga
> directory handle, kaya ni-flush ng OmniRoute ang nailathalang file at itinuturing ang directory-entry sync
> bilang best effort.
> Kung ang naka-mount na `DATA_DIR` ay hindi makapagbibigay ng mga garantiyang iyon, ang startup ay mabibigo
> nang sarado (fails closed) bago mag-apply ng migration. Ilipat ang `DATA_DIR` sa isang volume na may mga
> primitive na iyon; huwag gamitin ang `DISABLE_SQLITE_AUTO_BACKUP` upang laktawan ang kaligtasan ng migration.
### Mga Senaryo
| Senaryo | Konpigurasyon |
| ------------------------ | ------------------------------------------------------------------------------------------------------------- |
| **Lokal na pag-develop** | Iwanan ang lahat ng default. Ang DB ay nasa `~/.omniroute/omniroute.db`. |
| **Docker** | `DATA_DIR=/data` + mag-mount ng volume sa `/data`. |
| **Naka-encrypt at rest** | Itakda ang `STORAGE_ENCRYPTION_KEY` + mag-ingat ng mga backup ng key! Ang pagkawala nito = pagkawala ng data. |
| **CI/Testing** | `DATA_DIR=/tmp/omniroute-test` — ephemeral, hindi kailangan ng encryption. |
---
## 3. Network at mga Port
| Variable | Default | Source File | Paglalarawan |
| ------------------------------------------- | --------------------------------- | ------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| `PORT` | `20128` | `src/lib/runtime/ports.ts` | Pangunahing port para sa Dashboard UI at mga API endpoint (single-port mode). |
| `OMNIROUTE_BASE_PATH` | _(empty = root)_ | `next.config.mjs`, `scripts/docker/ensure-docker-base-path.mjs` | URL subpath para sa pag-serve ng OmniRoute sa likod ng reverse proxy (nagtatakda ng Next.js `basePath`; ang mga auth redirect ay basePath-aware). Hal. `/omniroute`. Sa Docker, ang value ay baked habang `docker build` (`ARG OMNIROUTE_BASE_PATH`); ang mga pre-built root image ay maaaring mag-apply ng ibang runtime value nang isang beses sa container start bago mag-boot ang Next.js. Itakda ang `NEXT_PUBLIC_BASE_URL` sa public origin kasama ang parehong subpath. |
| `NEXT_PUBLIC_OMNIROUTE_BASE_PATH` | _(empty = root)_ | `src/shared/hooks/useDisplayBaseUrl.ts` | Browser-visible na mirror ng `OMNIROUTE_BASE_PATH`, naka-inline sa build time para ang dashboard endpoint display ay magpakita ng `https://host/omniroute/v1` sa halip na `https://host/v1`. Bumabalik sa `OMNIROUTE_BASE_PATH` kapag unset. I-rebuild pagkatapos baguhin (ang Next `basePath` ay build-time). |
| `DASHBOARD_ALLOW_EMBED` | _(unset = never framable)_ | `next.config.mjs`, `scripts/build/dashboardEmbed.mjs` | Opt-in na iframe embedding ng mga HTML page. Kapag unset, bawat route ay nagdadala ng `frame-ancestors 'none'` + `X-Frame-Options: DENY`. Itakda sa `vscode` para i-serve ang mga page (dashboard, login, docs, landing) na may `frame-ancestors 'self' vscode-webview:` at walang `X-Frame-Options`, para ma-render sila ng VS Code Simple Browser (ang `dashboardOpen: "editor"` mode ng OmniCopilot). Ang API surface (`/api`, `/v1`, `/v1beta`, `/a2a`, `/healthz`, root-level aliases) ay nagpapanatili ng strict headers sa alinmang kaso. Tanging `vscode` lang ang kinikilala — hindi ito ine-enable ng `1`/`true`. Build-time: i-rebuild pagkatapos baguhin (`docker build --build-arg DASHBOARD_ALLOW_EMBED=vscode` para sa mga image; walang epekto ang pag-set nito sa isang prebuilt install). |
| `API_PORT` | _(unset)_ | `src/lib/runtime/ports.ts` | Kapag naka-set, nagse-serve ng `/v1/*` proxy API sa hiwalay na port na ito. |
| `API_HOST` | `0.0.0.0` | `src/lib/runtime/ports.ts` | Bind address para sa API port. |
| `DASHBOARD_PORT` | _(unset)_ | `src/lib/runtime/ports.ts` | Kapag naka-set, nagse-serve ng Dashboard UI sa hiwalay na port na ito. |
| `OMNI_MAX_CONCURRENT_CONNECTIONS` | `0` _(disabled)_ | `src/sse/utils/backpressure.ts` | Nililimitahan ang sabay-sabay na in-flight chat connections; ang mga request na lumampas sa cap ay nakakakuha ng `503` na may `Retry-After`. Ang positive integer ay nag-e-enable ng guard; ang unset/`0` ay nagdi-disable nito. |
| `OMNIROUTE_INSTANCE_ID` | _(unset)_ | `src/shared/resilience/peerRouting.ts` | Stable at unique na ID para sa gateway na ito kapag nag-chain ng mga OmniRoute instance. Nag-e-enable ng inbound peer-loop checks. Mga pinapayagang character: letters, digits, `.`, `_`, `:`, at `-`; maximum 64 characters. |
| `OMNIROUTE_PEER_URLS` | _(hindi nakatakda)_ | `src/shared/resilience/peerRouting.ts`, `open-sse/executors/base.ts` | Mga base URL ng OmniRoute na pinaghihiwalay ng kuwit na maaaring tumanggap ng `X-OmniRoute-Peer-Trace`. Tanging mga upstream URL na tahasang nasa allowlist ang tumatanggap ng peer metadata; hindi ginagalaw ang lahat ng iba pang provider. |
| `OMNIROUTE_PEER_MAX_HOPS` | `4` | `src/shared/resilience/peerRouting.ts` | Pinakamataas na bilang ng mga naunang binisitang OmniRoute instance na tinatanggap sa isang chained request (`1`-`32`). Ang mga paulit na instance o naubos na budget ay nagbabalik ng HTTP `508 Loop Detected`. |
| `PROD_DASHBOARD_PORT` | `20130` | `docker-compose.prod.yml` | Port na naka-publish sa panig ng host para sa Dashboard sa Docker production mode. |
| `PROD_API_PORT` | `20131` | `docker-compose.prod.yml` | Port na naka-publish sa panig ng host para sa API sa Docker production mode. |
| `OMNIROUTE_PORT` | _(hindi nakatakda)_ | `src/lib/runtime/ports.ts` | May priyoridad kaysa sa `PORT` kapag tumatakbo sa loob ng Electron o iba pang wrapper. |
| `LIVE_WS_PORT` | `20129` | `src/server/ws/liveServer.ts` | Port para sa real-time WebSocket live monitoring server. |
| `LIVE_WS_HOST` | `127.0.0.1` | `src/server/ws/liveServer.ts` | Bind address para sa live WebSocket server. Itakda sa `0.0.0.0` upang i-expose sa LAN (i-configure din ang `LIVE_WS_ALLOWED_ORIGINS`). Ang mga koneksyon ay nagpapatunay gamit ang dashboard session cookie o isang Bearer API key na may management scope (`manage`/`admin`). |
| `LIVE_WS_ALLOWED_ORIGINS` | _(hindi nakatakda)_ | `src/server/ws/liveServer.ts` | Mga karagdagang origin na pinaghihiwalay ng kuwit na pinapayagang magbukas ng live WebSocket. Ang mga loopback dashboard origin ay pinapayagan na bilang default. |
| `LIVE_WS_ALLOWED_HOSTS` | _(hindi nakatakda)_ | `src/server/ws/liveServerAllowList.ts` | Mga karagdagang hostname na pinaghihiwalay ng kuwit na pinapayagan para sa mga live WebSocket origin. Hindi tulad ng `LIVE_WS_ALLOWED_ORIGINS` (mga buong origin URL), tumutugma lamang sa bahagi ng host — kapaki-pakinabang para sa mga LAN/Tailscale setup. |
| `NEXT_PUBLIC_LIVE_WS_PUBLIC_URL` | _(hindi nakatakda)_ | `src/hooks/useLiveDashboard.ts` | Pampublikong URL para sa live dashboard WebSocket (panig ng browser). Itakda kapag ang WS server ay nasa likod ng reverse proxy o Cloudflare Tunnel (hal. `wss://ws.my-ai.com/live-ws`); doon kumokonekta ang browser sa halip na `ws://hostname:20132`. Ang bahagi ng pathname ay ginagamit din bilang WebSocket upgrade path (default: `/live-ws`). |
| `OMNIROUTE_ENABLE_LIVE_WS` | `true` | `src/server/ws/liveServer.ts` at `scripts/start-ws-server.mjs` | Itakda sa `0` o `false` upang i-disable ang real-time WebSocket server (naka-enable bilang default, nakatali sa loopback). CI/harness toggle na nagdi-disable sa standalone live WebSocket helper script. |
| `RELAY_IP_PER_MINUTE` | `30` | `src/app/api/v1/relay/chat/completions/route.ts` | Relay rate limit bawat (token, IP), mga request/minuto. In-memory, bawat instance. Ang `0` o negatibo ay nagdi-disable sa IP-dimension gate (nalalapat pa rin ang per-token DB limit). |
| `NODE_ENV` | `production` | Next.js core | Kumokontrol sa verbosity ng logging, caching, paglalantad ng detalye ng error, at mga optimisasyon ng Next.js. |
| `OMNIROUTE_USE_TURBOPACK` | `1` (Turbopack — default ng code) | `package.json` / Next.js 16 | Ang Turbopack ang default na bundler para sa `npm run dev` at `npm run build` (2-3× mas mabilis na build, na-benchmark). Itakda sa `0` upang bumalik sa webpack sa Windows, kapag nakatagpo ng mga incompatibilidad sa native binding / bundler-compat, **o sa mga makinang may limitadong RAM** — ang mga production build ng Turbopack sa linyang ito ng bersyon ng Next.js (16.2.x) ay kilala sa upstream na umaakyat nang mas mataas ang memorya kaysa webpack sa malalaking module graph (ang Turbopack memory-eviction fix ng Next 16.3 ay hindi pa stable); ang webpack fallback ay mas mababa ang peak. Tingnan ang #6409. **Ang mga Docker image build ay default sa `0` (webpack)**: idineklara ng `Dockerfile` ang `ARG OMNIROUTE_USE_TURBOPACK=0` upang ang simpleng `docker build .` (Railway at iba pang one-click host, ad-hoc self-hoster) ay hindi ma-OOM-kill sa isang builder na may takip na memorya; ipasa ang `--build-arg OMNIROUTE_USE_TURBOPACK=1` upang i-build ang imahe gamit ang Turbopack. Tingnan ang `docs/guides/DOCKER_GUIDE.md` → Mga resource sa build-time. |
| `OMNIROUTE_SKIP_DB_HEALTHCHECK` | _(hindi nakatakda)_ | `src/lib/db/core.ts` / `src/lib/db/healthCheck.ts` | Itakda sa `1` upang laktawan ang SQLite integrity health check sa startup. Kapaki-pakinabang para sa mas mabilis na boot sa malalaking database. |
| `NOTIFY_SOCKET` | _(hindi nakatakda)_ | systemd (sd_notify protocol) | Itinatakda ng systemd kapag ang proseso ay tumatakbo sa ilalim ng service unit na may sd_notify integration; binabasa ito ng OmniRoute (tingnan ang `OMNIROUTE_DISABLE_SD_NOTIFY`) upang magpadala ng mga notification na READY/WATCHDOG. Hindi kailanman itinatakda ng gumagamit. |
| `OMNIROUTE_DISABLE_SD_NOTIFY` | _(hindi nakatakda)_ | `scripts/dev/systemd-notify.mjs` | Itakda sa `1` upang i-disable ang systemd sd_notify (Type=notify / WatchdogSec=) kahit na tumatakbo sa ilalim ng systemd unit. Ang notifier ay no-op sa labas ng systemd anuman. |
| `CREDENTIAL_HEALTH_CHECK_INTERVAL` | `3600000` | `open-sse/config/constants.ts` / `src/lib/credentialHealth/scheduler.ts` | Interval (ms) para sa background credential health check scheduler. Pinakamababa: 10000 (10s). |
| `CREDENTIAL_HEALTH_CACHE_TTL` | `300000` | `open-sse/config/constants.ts` / `src/lib/credentialHealth/cache.ts` | TTL (ms) para sa naka-cache na status ng credential health. |
| `OMNIROUTE_DISABLE_CREDENTIAL_HEALTH_CHECK` | `false` | `src/lib/credentialHealth/scheduler.ts` | Itakda sa `1` o `true` upang i-disable ang background na pana-panahong pagsusuri ng mga koneksyon ng provider. Ang mga search provider (SEARCH_VALIDATOR_CONFIGS sa `src/lib/providers/validation/searchProviders.ts`, hal. `tavily-search`) ay laging hindi kasama sa sweep — ang kanilang "validation" ay isang tunay na sinisingil na upstream query, kaya hindi sila kailanman sina-health-check sa timer (#9970). |
| `DEEP_HEALTH_CHECK_ENABLED` | `0` | `src/app/api/monitoring/health/route.ts` | Itakda sa `1` upang payagan ang isang authenticated na caller na humiling ng `/api/monitoring/health?deep=1`, na nagse-sample ng completions surface nang isang beses bawat TTL. Ang mga anonymous na caller ay hindi kailanman nagti-trigger ng probe. |
| `OMNIROUTE_EVENT_LOOP_STALL_THRESHOLD_MS` | `5000` | `src/lib/healthzLag.ts` | Stall threshold (ms) para sa boot event-loop recorder: ang freeze na mas mahaba dito ay naglo-log ng isang linyang `event loop stalled` sa pagpapatuloy, kasama ang memorya at mga in-flight count, at itinataas ang `eventLoopStall` counter/maximum sa `/api/monitoring/health`. Itakda sa `0` upang i-disable; ang hindi mabasa o negatibong halaga ay babalik sa `5000`. |
| `HOST` | `0.0.0.0` | `scripts/dev/run-next.mjs` | Bind address para sa Next.js dev/start server. Ino-override ang default na `0.0.0.0` kapag nakatakda. |
| `HOSTNAME` | `127.0.0.1` | `scripts/dev/run-next-playwright.mjs` | Bind address na ginagamit ng Playwright runner kapag inilulunsad ang Next.js. Naka-default sa `127.0.0.1` para sa mga hermetic na pagsubok. **Huwag gamitin para sa `omniroute serve`** — gamitin sa halip ang `OMNIROUTE_SERVER_HOST` (awtomatikong itinatakda ng mga POSIX shell ang `HOSTNAME` sa pangalan ng makina; hindi ito maaaring i-override ng `.env`). |
| `OMNIROUTE_SERVER_HOST` | `0.0.0.0` | `bin/cli/commands/serve.mjs` | Bind address para sa `omniroute serve`. Iniiwasan ang conflict sa `HOSTNAME` variable ng POSIX shell (palaging itinatakda ng bash/zsh sa pangalan ng makina). Babalik sa `0.0.0.0` kapag hindi nakatakda. (#6194) |
### Mga Mode ng Port
```
┌─────────────────────────── Isang Port (default) ───────────────────────────┐
│ PORT=20128 │
│ → Dashboard: http://localhost:20128 │
│ → API: http://localhost:20128/v1/chat/completions │
└─────────────────────────────────────────────────────────────────────────────┘
┌─────────────────────────── Mga Hiwalay na Port ────────────────────────────┐
│ DASHBOARD_PORT=20128 │
│ API_PORT=20129 │
│ API_HOST=0.0.0.0 │
│ → Dashboard: http://localhost:20128 │
│ → API: http://0.0.0.0:20129/v1/chat/completions │
│ Gamit: I-expose ang API sa LAN at limitahan ang Dashboard sa localhost. │
└─────────────────────────────────────────────────────────────────────────────┘
┌─────────────────────────── Produksyon ng Docker ───────────────────────────┐
│ PROD_DASHBOARD_PORT=443 PROD_API_PORT=8443 │
│ → Mga container port na naka-map sa host port sa docker-compose.prod.yml. │
└─────────────────────────────────────────────────────────────────────────────┘
```
---
## 4. Seguridad at Pagpapatotoo
| Variable | Default | Source File | Paglalarawan |
| ------------------------------------------- | ------------------------------------------------------------------------------------------------------- | -------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `MACHINE_ID_SALT` | `endpoint-proxy-salt` | `src/lib/auth` | Salt na pinagsama sa mga hardware identifier para sa machine fingerprinting. Baguhin bawat deployment para sa isolation. |
| `OMNIROUTE_CLI_SALT` | _(hindi nakatakda = random na per-install na salt na naka-persist sa `/cli-token-salt.json`)_ | `src/lib/machineToken.ts` | HMAC salt para sa pagkuha ng lokal na CLI auth token. Ang pagtatakda ng value na ito ay nagpa-rotate ng lahat ng CLI token sa makina at laging may priyoridad kaysa sa naka-persist na salt. Tingnan ang `docs/security/CLI_TOKEN.md`. |
| `AUTH_COOKIE_SECURE` | `false` | `src/lib/auth` | Itinatakda ang `Secure` flag sa mga session cookie. **Dapat `true`** kapag tumatakbo sa likod ng HTTPS. |
| `REQUIRE_API_KEY` | `false` | API middleware | Kapag `true`, lahat ng `/v1/*` proxy request ay dapat may kasamang valid na API key. **Ang flag na ito ay hindi nagga-gate ng `GET /v1/models`**, na sumusunod sa halip sa dashboard login posture (`requireAuthForModels`) — kaya ang `401` mula sa `/v1/models` ay HINDI ibig sabihin na protektado ang inference. Tingnan ang `docs/security/INFERENCE_AUTH_POSTURE.md` (#13695). |
| `ALLOW_API_KEY_REVEAL` | `false` | `src/shared/constants/featureFlagDefinitions.ts` | Pinapayagan ang pagpapakita ng buong mga value ng API key sa Dashboard UI. Nako-configure mula sa Dashboard Feature Flags; panganib sa seguridad sa mga shared instance. |
| `NO_LOG_API_KEY_IDS` | _(walang laman)_ | `src/lib/compliance/index.ts` | Mga API key ID na pinaghihiwalay ng kuwit na nagba-bypass sa request logging (GDPR compliance). |
| `DEFAULT_RATE_LIMIT_PER_DAY` | _(hindi nakatakda = walang limitasyon)_ | `src/shared/utils/apiKeyPolicy.ts` | Fallback na per-day na request budget na inilalapat sa mga API key na ang `rate_limits` column ay null. Unset o walang laman: walang implicit na cap (#2289, #11017). Ang `0` ay pareho rin (walang limitasyon). Ang positive integer N ay nag-e-enable ng N/day, 5N/week, 20N/month. Ang mga malformed na hindi-walang-laman na value ay bumabalik sa legacy na 1000/day, 5000/week, 20000/month na mga window. |
| `MAX_BODY_SIZE_BYTES` | `10485760` (10 MB) | `src/shared/middleware/bodySizeGuard.ts` | Pinakamataas na pinapayagang laki ng request body. Tumatanggi ng mga payload na lumalampas sa limit na ito. |
| `OMNIROUTE_CHAT_LARGE_BODY_BYTES` | `262144` (256 KB) | `src/shared/middleware/chatBodyAdmission.ts` | Ang mga aktwal na request body na nasa o higit sa threshold na ito ay kumukuha ng atomic process-local heavyweight admission lease bago ang JSON parsing (BYTE path, kabilang ang `POST /v1/responses`). Parehong [#10437](https://github.com/diegosouzapw/OmniRoute/pull/10437) healthy-headroom escape tulad ng structure-heavy; nililimitahan pa rin ng `OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES` / [#10110](https://github.com/diegosouzapw/OmniRoute/issues/10110) kaya ang [#7849](https://github.com/diegosouzapw/OmniRoute/issues/7849) ay hindi babalik. |
| `OMNIROUTE_CHAT_HARD_MAX_BODY_BYTES` | `52428800` (50 MB) | `src/shared/middleware/chatBodyAdmission.ts` | Matigas na hangganan ng chat route na ipinapatupad laban sa mga byte na nabasa sa panahon ng bounded na ingestion, kabilang ang mga request na may nawawala, hindi wasto, o hindi tapat na `Content-Length`; ang labis ay tumatanggap ng `413`. |
| `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT` | _(hindi naka-set — walang hangganan sa bilang ng request)_ | `src/shared/middleware/chatBodyAdmission.ts` | **#503-fanout:** ang legacy na hangganang ito sa BILANG ng request ay umiiral na lamang kapag tahasang itinakda. Kapag hindi itinakda (ang default), ang heavyweight na admission ng chat ay sapilitang pinapadaan sa `OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES` — isang kusang hinaong BYTE budget na sinukat mula sa tunay na hangganan ng memorya ng proseso sa **isang proseso** (isang V8 heap). Ang dalawang nag-o-overlap na ~750k-token na `/v1/responses` ay nag-aabort ng ~12 Gi na mga heap (#7849) — isang **memory-budget** na babala, hindi isang matigas na product max na 2. Ang malusog na proseso (heap na mas mababa sa shed ratio) ay MAAARING tumanggap ng mas maraming sabay-sabay na mahabang `/v1/responses` sa pamamagitan ng `OMNIROUTE_CHAT_ADMISSION_HEALTHY_HEADROOM`. Ang sampu-sampung mahabang SSE client (40–50) ay heap + `OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES` / #10110, hindi "max 2". Ang bulag na pagtaas nito para "gamitin ang host" ay nagbabalik ng #7849. Paramihin ang mga **heap** gamit ang **N magkakahiwalay na `DATA_DIR`** (#11024); huwag kailanman ang `replicas>1` sa iisang SQLite file. |
| `OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES` | _(kusang hinango)_ | `src/shared/middleware/admissionBudget.ts` | **#503-fanout:** override para sa kusang hinaong ingest byte budget (25% ng mas mahigpit na V8/cgroup memory ceiling na hinati sa 8x transient amplification). Ang mga hinaong at tahasang halaga ay ikinakapit sa 8 MiB–2 GiB. Ang body na mas malaki sa epektibong budget ay agad nabibigo na may `413 body_exceeds_budget`; ang pag-aagawan sa pagitan ng mga body na indibidwal na kayang i-serve ay nananatiling maaaring subukang muli na `503`. Ang 40–50 sabay-sabay na mahabang SSE client ay ang budget na ito + heap, hindi isang matigas na "max 2". Basahin ang `chatAdmission.maxInflightBytes` / `budgetSource` / `pressureSeverity` sa `/api/monitoring/health` bago mag-tune. |
| `OMNIROUTE_CHAT_ADMISSION_HEAP_SHED_RATIO` | `0.75` | `src/shared/middleware/chatBodyAdmission.ts` | Heap-pressure shed ratio (`heapUsed / heap_size_limit`) para sa BYTE at STRUCTURE heavyweight admission (#10183, #10268, #10437). Ang sabay na heavyweight request na lampas sa `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT` ay itinatapon (shed) lamang na may maaaring subukang muling `503` kapag ang heap ay NASA o higit pa sa ratio na ito; sa malusog na heap, ito ay tinatanggap sa pamamagitan ng healthy-headroom sa halip. |
| `OMNIROUTE_CHAT_ADMISSION_HEALTHY_HEADROOM` | `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT` (default `1`) | `src/shared/middleware/chatBodyAdmission.ts` | May hangganang dagdag na kapasidad para sa healthy-heap fast path (#10437) sa **parehong** STRUCTURE at BYTE (`admitChatRequest`, kabilang ang mga body na ≥ `OMNIROUTE_CHAT_LARGE_BODY_BYTES`). Kung wala ang hangganang ito, bawat busy-ngunit-malusog-ang-heap na request ay lumalampas sa admission nang walang kisame. Kapag ganito karaming sabay na lease ang aktibo sa pamamagitan ng healthy-heap path, ang mga susunod pang busy na request ay dadaan sa PAREHONG bounded-wait/shed path na ginagamit sa ilalim ng tunay na heap pressure. Ang `0` ay ganap na nagdi-disable ng bypass. |
| `OMNIROUTE_CHAT_HEAVY_MESSAGE_COUNT` | `200` | `src/shared/middleware/chatBodyAdmission.ts` | Bilang ng mensahe na nag-uuri sa isang chat request bilang heavyweight kahit na ang body nito ay mas mababa sa byte threshold. |
| `OMNIROUTE_CHAT_HEAVY_TOOL_COUNT` | `64` | `src/shared/middleware/chatBodyAdmission.ts` | Bilang ng tool na nag-uuri sa isang chat request bilang heavyweight kahit na ang body nito ay mas mababa sa byte threshold. |
| `OMNIROUTE_CHAT_HEAVY_ESTIMATED_TOKENS` | `32000` | `src/shared/middleware/chatBodyAdmission.ts` | Konserbatibong tantiya ng token batay sa laki ng string na nag-uuri sa isang request bilang heavyweight; ito ay proxy ng halaga ng admission, hindi tokenization para sa provider billing. |
| `OMNIROUTE_CHAT_HARD_MAX_MESSAGES` | `0` (naka-disable) | `src/shared/middleware/chatBodyAdmission.ts` | Opsyonal na opt-in na hangganan ng chat history. Naka-disable bilang default: ang bilang ng mensahe ay patakaran ng deployment, hindi isang unibersal na katangian ng request, at ang pagtatakda ng hangganan dito ay tumatanggi sa mga pag-uusap na may terminal na `413` bago pa sila magawang mai-serve ng compression pipeline. Ang paglaki ng heap ay may hangganang itinakda ng `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT` at ng heap-pressure shed. Magtakda ng positibong halaga sa mga deployment na may limitadong memorya na nangangailangan ng matigas na kisame; ang labis ay tatanggap ng structured na compact-required na `413`. |
| `OMNIROUTE_MAX_NONSTREAMING_RESPONSE_BYTES` | `67108864` (64 MB) | `open-sse/handlers/chatCore/nonStreamingResponseBody.ts` | Matigas na hangganan para sa isang non-streaming na upstream response na buong naka-buffer sa memorya. Kapag lumampas dito, kinakansela ang upstream reader at ang request ay mabilis na nabibigo sa halip na magpalaki ng walang hangganang string hanggang maubos ang heap. |
| `OMNIROUTE_FORWARDING_HEADER_BUDGET_BYTES` | `768` | `open-sse/handlers/chatCore/responseHeaders.ts` | Pinakamataas na wire bytes na ipinapasa mula sa mga upstream response header. Kapag lumampas ang budget, ang mga header na mas mababa ang priyoridad (hal., pasadyang `x-codex-*`, `x-oai-request-id`) ay ibinababa upang manatili sa loob ng mga karaniwang limitasyon ng header ng reverse-proxy. Itakda nang mas mataas upang mag-forward ng higit pang upstream metadata sa kapalit ng mas malaking laki ng response header. |
| `CORS_ORIGIN` | _(walang nakatakda)_ | `src/server/cors/origins.ts` | Legacy na single-origin na CORS allowlist. Mas gustuhin ang `CORS_ALLOWED_ORIGINS` para sa mga bagong deployment. Ang CORS ay para lamang sa mga cross-origin na browser API client; ang mga authenticated na pagsusulat sa dashboard ay gumagamit ng mga same-origin na request kasama ang session-bound na proteksyon sa CSRF sa halip. |
| `CORS_ALLOWED_ORIGINS` | _(walang nakatakda)_ | `src/server/cors/origins.ts` | CORS allowlist na pinaghihiwalay ng kuwit. Walang wildcard na ipinapadala maliban kung tahasang naka-configure ang `CORS_ALLOW_ALL=true`. |
| `CORS_ALLOW_ALL` | `false` | `src/server/cors/origins.ts` | Escape hatch na para lamang sa development upang i-echo ang anumang `Origin` ng browser. Huwag i-enable sa mga shared o production na deployment. |
| `OUTBOUND_SSRF_GUARD_ENABLED` | `true` | `src/shared/network/outboundUrlGuardPolicy.ts` | Legacy na alias. Ang dashboard toggle nito (isang DB override) ay binabasa bago ang halagang ito ng environment; ang `false`, `0`, `no`, o `off` sa alinman ay nagpapatay sa mga host check tulad ng ginagawa ng `OMNIROUTE_ALLOW_PRIVATE_PROVIDER_URLS=true`, kahit na naka-save nang patay ang dashboard toggle ng flag na iyon; ang ibang mga halaga ay nag-iiwan ng guard sa dalawang flag sa ibaba. |
| `OMNIROUTE_ALLOW_PRIVATE_PROVIDER_URLS` | `false` | `src/shared/network/outboundUrlGuardPolicy.ts` | Pinapatay ang mga host check ng outbound URL guard, kasama ang cloud-metadata block (buong 169.254.0.0/16, metadata.google.internal), sa mga provider path na sumusunod sa guard mode: URL validation, model discovery, mga base URL ng provider-node (kasama ang mga remote rerank node), at ang proxy-fallback test, bukod pa sa iba pang mga provider-adjacent na outbound path tulad ng remote na pagkuha ng image/media. Pinapayagan din nito ang mga pribadong webhook target, maliban sa mga cloud-metadata/link-local na endpoint, na nananatiling naka-block kahit naka-on ang flag na ito. Ang mga chat request na ipinadala sa pamamagitan ng `BaseExecutor.execute()` ay pinapanatili ang kanilang cloud-metadata check. Gumagana ang mga lokal na provider sa mga default: pinapayagan na ng `OMNIROUTE_ALLOW_LOCAL_PROVIDER_URLS` (default `true`) ang mga lokal at LAN na URL sa mga path ng validation, discovery, at provider-node; ang proxy-fallback test at mga pribadong webhook target ay sumusangguni lamang sa flag na ito at nagba-block ng mga lokal/LAN na host habang ito ay patay. Ina-override nito ang `OMNIROUTE_ALLOW_LOCAL_PROVIDER_URLS=false`. Ang halagang na-save mula sa dashboard toggle ay may priyoridad kaysa sa variable na ito. |
| `OMNIROUTE_ALLOW_LOCAL_PROVIDER_URLS` | `true` | `src/shared/network/outboundUrlGuardPolicy.ts` | Payagan ang mga provider URL sa mga lokal/pribadong address (127.0.0.1, localhost, LAN, mga pribadong range) para sa provider validation, model discovery, chat, at ang iba pang mga provider-adjacent na outbound path na pinamamahalaan ng guard mode. **Default `true`** (local-first): pagkatapos ay bina-block ng guard ang mga cloud-metadata endpoint — buong 169.254.0.0/16 kasama ang mga kilalang metadata hostname (metadata.google.internal, metadata.goog, Alibaba/Azure/Oracle IMDS, fd00:ec2::254). Itakda sa `false` para sa public-only na mode, na nagba-block din ng mga pribado at loopback na host. Sinusuri ng guard ang hostname o IP literal ayon sa nakasulat, bago ang anumang DNS lookup; sa public-only na mode, ang safe-fetch wrapper ay nagre-resolve pa ng hostname at tumatanggi sa anumang pribadong sagot. Pinapatay ng `OMNIROUTE_ALLOW_PRIVATE_PROVIDER_URLS=true` ang mga check na ito sa mga path na nakalista sa kanyang hilera. Ang mga built-in na lokal na provider, tulad ng LM Studio, Ollama, vLLM, Llamafile, at Triton, ay lumalaktaw sa lahat ng host check para sa key validation at chat. Ang halagang na-save mula sa dashboard toggle ay may priyoridad kaysa sa variable na ito. (#5066) |
| `AUDIO_REMOTE_PROVIDER_NODES` | `false` | `src/app/api/v1/_shared/audioProviderNodes.ts` | Hayaang gamitin ng mga route na `/v1/audio/*` (mga transkripsyon, speech, mga pagsasalin) ang isang OpenAI-compatible na provider node na naka-host sa labas ng localhost. Patay bilang default — ang pag-route ng audio sa isang remote na host ay nagbabago ng egress identity at dapat maging tahasang desisyon ng operator. Ang mga loopback/pribadong node (localhost, 127.0.0.1, 172.16-31.x) ay laging pinapayagan at hindi apektado. (#3963) |
| `RERANK_REMOTE_PROVIDER_NODES` | `false` | `src/app/api/v1/_shared/rerankProviderNodes.ts` | Hayaang gamitin ng `POST /v1/rerank` (at ang loopback rerank na hakbang ng memory engine) ang isang OpenAI-compatible na provider node na naka-host sa labas ng localhost — isang LAN box o Tailscale peer na nagpapatakbo ng TEI, Infinity, vLLM, atbp. Patay bilang default — ang pag-route sa isang remote na host ay nagbabago ng egress identity at dapat maging tahasang desisyon ng operator. Ang mga loopback node (localhost, 127.0.0.1, 172.16-31.x) ay laging pinapayagan at hindi apektado. Ang base URL ng isang remote node ay dapat ding pumasa sa provider outbound URL policy (`OMNIROUTE_ALLOW_LOCAL_PROVIDER_URLS` / `OMNIROUTE_ALLOW_PRIVATE_PROVIDER_URLS`). |
| `OMNIROUTE_LOCAL_PROVIDER_NODE_HOSTS` | _(walang laman)_ | `src/shared/network/localNodeHosts.ts` | Mga hostname (pinaghihiwalay ng kuwit o whitespace) na itinuturing na lokal ng provider-node routing — karaniwang ang pangalan ng serbisyo sa Docker/Compose ng isang reranker, TEI, o audio sidecar sa sariling Docker network ng OmniRoute (`http://reranker:8080/v1`), para hindi na kailangan ng node ang hard-coded na container IP. Ang mga nakalistang host ay kuwalipikado para sa `/v1/rerank`, `/v1/audio/*` at sa lokal na health check nang hindi pinagagana ang `RERANK_REMOTE_PROVIDER_NODES` / `AUDIO_REMOTE_PROVIDER_NODES` para sa bawat remote node, at tinatawag nang direkta — hindi kailanman dumadaan sa `HTTP(S)_PROXY` o sa naka-pin na proxy ng koneksyon. Ipinapadala pa rin nito ang API key ng koneksyon. Tanging mga pangalang single-label at mga pangalang `.internal`/`.local` ang tinatanggap; ang mga pampublikong FQDN, IP literal, at mga pangalan ng cloud-metadata ay hindi pinapansin na may kasamang babala. (#14635) |
| `OMNIROUTE_OIDC_DISABLE_PASSWORD_LOGIN` | `false` | `src/app/api/auth/login/route.ts` | Kapag naka-enable ang OIDC, i-disable ang password login para makapag-authenticate lamang ang mga user sa pamamagitan ng OIDC Single Sign-On. Ang bare alias na `OIDC_DISABLE_PASSWORD_LOGIN` ay tinatanggap din; ang Dashboard Feature Flag na may parehong key ang may prayoridad. (#10889) |
| `OIDC_DISABLE_PASSWORD_LOGIN` | `false` | `src/app/api/auth/login/route.ts` | Bare alias ng `OMNIROUTE_OIDC_DISABLE_PASSWORD_LOGIN` (#10889). |
### Checklist sa Hardening
```bash
# Pinakamababang seguridad para sa production:
AUTH_COOKIE_SECURE=true # Nangangailangan ng HTTPS
REQUIRE_API_KEY=true # I-authenticate ang lahat ng tawag sa proxy
ALLOW_API_KEY_REVEAL=false # Huwag kailanman ilantad ang mga key sa UI
CORS_ALLOWED_ORIGINS=https://your.domain.com
MAX_BODY_SIZE_BYTES=5242880 # Limitasyong 5 MB
```
---
## 5. Paglilinis ng Input at Proteksyon sa PII
Nagbibigay ang OmniRoute ng dalawang antas ng depensa: pag-scan para sa injection sa panig ng request at pag-aalis ng PII sa panig ng response.
> **⚠️ Mga Limitasyon:** Ang mga guardrail na ito ay mga _best-effort heuristic_ na pagtukoy, hindi isang kumpletong firewall laban sa prompt injection o PII DLP system. Maaari silang magdulot ng mga false positive (ma-flag ang mga ligtas na persona/RPG prompt) at mga false negative (leetspeak, spacing, mga pattern na hindi Ingles). Hindi sapat ang mga ito nang mag-isa para sa pagsunod sa mga regulasyon. Iangkop ang mga mode at subukan ang mga ito sa iyong traffic bago umasa sa mga ito.
### Panig ng Request: Prompt Injection Guard
| Variable | Default | Source File | Paglalarawan |
| --------------------------------- | ------------------- | ---------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `INPUT_SANITIZER_ENABLED` | `true` | `src/middleware/promptInjectionGuard.ts` | I-enable ang pag-scan ng mga papasok na mensahe para sa mga pattern ng prompt injection. |
| `INPUT_SANITIZER_MODE` | `warn` | `src/middleware/promptInjectionGuard.ts` | Patakaran sa injection: `warn` = mag-log lamang, `block` = tanggihan ang request gamit ang 400. Ang legacy na `redact` ay **hindi** nag-aalis ng injection text; gamitin ang `PII_REDACTION_ENABLED` para sa muling pagsulat ng PII sa request. |
| `INJECTION_GUARD_MODE` | _(hindi nakatakda)_ | `src/middleware/promptInjectionGuard.ts` | Legacy alias para sa `INPUT_SANITIZER_MODE` — parehong gawi. |
| `INPUT_SANITIZER_BLOCK_THRESHOLD` | `high` | `src/shared/utils/injectionSeverity.ts` | Pinakamababang antas ng kalubhaan na tinatanggihan ng `MODE=block`: `high` (default), `medium`, o `low`. Ang mga medium na pattern ay para lamang sa obserbasyon maliban kung ibababa ang threshold. |
| `INJECTION_GUARD_BLOCK_THRESHOLD` | _(hindi nakatakda)_ | `src/shared/utils/injectionSeverity.ts` | Legacy alias para sa `INPUT_SANITIZER_BLOCK_THRESHOLD` — parehong gawi. |
| `PII_REDACTION_ENABLED` | `false` | `src/lib/guardrails/piiMasker.ts` | Kapag `true`, i-redact ang PII sa mga papasok na request (hiwalay sa injection mode). |
| `CREDENTIAL_REDACTION_ENABLED` | `false` | `src/lib/guardrails/credentialMasker.ts` | I-redact ang mga kilalang pattern ng API key / secret token mula sa mga payload ng request/response. Opt-in; tinutularan ang `PII_REDACTION_ENABLED`. |
### Panig ng Response: PII Sanitizer
| Variable | Default | Source File | Paglalarawan |
| -------------------------------- | -------- | ------------------------- | ---------------------------------------------------------------------------------------- |
| `PII_RESPONSE_SANITIZATION` | `false` | `src/lib/piiSanitizer.ts` | I-scan ang mga response ng LLM para sa tumagas na PII bago ibalik sa client. |
| `PII_RESPONSE_SANITIZATION_MODE` | `redact` | `src/lib/piiSanitizer.ts` | `redact` = i-mask ang PII, `warn` = mag-log lamang, `block` = alisin ang buong response. |
### VS Code Tokenized-Route Context Sanitizer
| Variable | Default | Source File | Paglalarawan |
| ----------------------------------- | ------- | ------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `OMNIROUTE_VSCODE_SANITIZE_CONTEXT` | `1` | `src/app/api/v1/vscode/contextSanitizer.ts` | Inaalis ang implicit na konteksto ng aktibong editor (`editorContext`, `activeEditor`, `currentFile`, `selection`, `openTabs`…) mula sa mga request sa `/v1/vscode/[token]/*` at nire-redact ang nilalaman ng mga tahasang naka-attach na sensitibong file. Secure-by-default; itakda sa `0` upang i-disable. |
### Mga Sitwasyon
| Sitwasyon | Configuration |
| -------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| **Pagsunod ng enterprise** | `INPUT_SANITIZER_ENABLED=true`, `INPUT_SANITIZER_MODE=block`, `PII_REDACTION_ENABLED=true`, `PII_RESPONSE_SANITIZATION=true` (pag-block ng injection + pag-redact ng PII sa request/response; magkahiwalay ang mga mode) |
| **Pagsubaybay lamang** | `INPUT_SANITIZER_ENABLED=true`, `INPUT_SANITIZER_MODE=warn` — nagla-log ngunit hindi kailanman nagba-block |
| **Personal na paggamit** | Panatilihing naka-disable ang lahat — walang overhead |
---
## 6. Mga Patakaran sa Tool at Routing
| Variable | Default | Pinagmulang File | Paglalarawan |
| ----------------------------------------------------------- | ----------------------------------- | ----------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `TOOL_POLICY_MODE` | `disabled` | `src/lib/toolPolicy.ts` | Kumokontrol sa access ng LLM tool/function-calling. `allowlist` = mga nakalistang tool lamang, `denylist` = lahat maliban sa mga nakalista, `disabled` = walang mga paghihigpit. |
| `OMNIROUTE_PAYLOAD_RULES_PATH` | `./config/payloadRules.json` | `open-sse/services/payloadRules.ts` | Path sa JSON file ng mga payload manipulation rule (mga upstream tweak bawat modelo/protocol). |
| `OMNIROUTE_PAYLOAD_RULES_RELOAD_MS` | `5000` | `open-sse/services/payloadRules.ts` | Interval ng muling pag-load (ms) para sa hot-reloading ng file ng mga payload rule. Minimum na `1000`. |
| `OMNIROUTE_PREFER_CLAUDE_CODE_FOR_UNPREFIXED_CLAUDE_MODELS` | `false` | `open-sse/services/model.ts` | Opt-in: i-route ang mga bare na `claude-*` model ID mula sa mga Claude Code client sa pamamagitan ng Claude Code OAuth account sa halip na mag-require ng provider prefix. Mananatiling mananaig ang mga explicit na provider prefix. Maaari ring i-configure sa pamamagitan ng dashboard toggle sa Claude provider page. |
| `OMNIROUTE_REDACT_THINKING` | `true` | `open-sse/executors/base/redactThinkingBeta.ts` | Itakda sa `false` upang pigilan ang OmniRoute na idagdag mismo ang `redact-thinking-2026-02-12` Anthropic beta (mga walang laman na signature-only thinking block). Ang mga request na may `thinking.display: "summarized"` ay lalaktawan ito anuman; ang client-negotiated na redact beta o CC-compatible na `requestDefaults.redactThinking` opt-in ang magpapanatili nito. Pinapanatili ng mga Claude OAuth request ang beta (bahagi ito ng Claude Code OAuth fingerprint) maliban kung naka-on ang default-off na `CLAUDE_OAUTH_SUMMARIZED_THINKING_UNREDACTED` feature flag. |
| `BARE_MODEL_DEFAULT_OVERRIDE_LEGACY` | `false` | `open-sse/services/model.ts` | Legacy na pag-uugali ng `resolveBareModelToConnectionDefault` (#4825): palitan ang anumang bare na pangalan ng modelo ng `defaultModel` ng napiling connection. Naka-off bilang default, tanging ang `auto` o walang lamang modelo ang pinapalitan; naglo-log ng isang babala bawat pares kapag naka-on. |
| `COMBO_CONCURRENCY_PER_MODEL` | `3` | `open-sse/services/comboConfig.ts` | Per-model na concurrency cap para sa mga round-robin combo (#9100). Ang round-robin combo semaphore ay dating hard-capped sa 3 sabay-sabay na request bawat modelo nang walang override, na nagse-serialize ng mas mataas na concurrency na traffic sa likod ng cap na iyon. Na-validate sa `>= 1`, na-clamp sa `<= 32`. |
| `DISABLE_CONTEXT_WINDOW_CHECKS` | `false` | `open-sse/handlers/chatCore.ts` | Mapanganib na opt-in na lumalaktaw sa lokal na context-window / max-input-token check ng OmniRoute para sa mga direktang single-model request. Ipinapatupad pa rin ng mga upstream provider ang kanilang aktwal na mga limitasyon; nananatiling aktibo ang prompt compression at ang sariling output-token cap ng modelo. Ang epektibong precedence ay Feature Flags DB override > environment variable > default; hindi na kailangan ng restart. |
| `OMNIROUTE_SELF_HOSTED_PROVIDERS` | _(hindi naka-set)_ | `open-sse/services/selfHostedEntry.ts` | Inline na YAML `providers:` document (RIC-738, D4). Kapag naka-set (mayroon man o walang `strategy:` block), ang `/v1/chat/completions` ay ididivert sa self-hosted unified OpenAI-compatible entry sa halip na cloud pipeline. Kapag hindi naka-set (ang default): ang route ay diretsong dadaan sa umiiral na cloud pipeline. Tingnan ang `docs/routing/SELF_HOSTED_OPENAI_ENTRY.md`. |
| `OMNIROUTE_SELF_HOSTED_PROVIDERS_FILE` | _(hindi naka-set)_ | `open-sse/services/selfHostedEntry.ts` | Path sa isang YAML file na naglalaman ng kaparehong `providers:` document ng `OMNIROUTE_SELF_HOSTED_PROVIDERS`, para sa mga deployment na mas gustong gumamit ng file kaysa inline na env var. Alinman sa dalawa ang mag-aactivate ng self-hosted entry. |
| `OMNIROUTE_SELF_HOSTED_API_KEY` | _(hindi naka-set — bukas na route)_ | `open-sse/services/selfHostedEntry.ts` | Opsyonal na shared API key para sa unified self-hosted entry (D5 scaffold, nakalaan para sa per-key quota system). Kapag naka-set, ang mga request ay dapat may kasamang `Authorization: Bearer `. Kapag hindi naka-set: bukas ang route, tumutugma sa umiiral na self-hosted local-provider pattern (loopback/trusted-network na deployment). |
| `OMNIROUTE_SELF_HOSTED_STRATEGY` | _(walang nakatakda)_ | `open-sse/services/routingStrategies.ts` | Inline na YAML `strategy:` na dokumento para sa deterministic routing engine (M2/RIC-740, D3) — blacklist/whitelist, cooldown breaker, cost-priority, latency-aware, fallback chain. Ina-override nito ang inline na `strategy:` block na nakapaloob sa loob ng `OMNIROUTE_SELF_HOSTED_PROVIDERS`, kada key. Tingnan ang `docs/routing/DETERMINISTIC_ROUTING.md`. |
| `OMNIROUTE_SELF_HOSTED_STRATEGY_FILE` | _(walang nakatakda)_ | `open-sse/services/routingStrategies.ts` | Path sa isang YAML file na naglalaman ng parehong `strategy:` na dokumento tulad ng sa `OMNIROUTE_SELF_HOSTED_STRATEGY`, para sa mga deployment na mas gustong gumamit ng file kaysa inline na env var. |
| `OMNIROUTE_DISABLE_CONVERSATION_TRACKING` | _(walang nakatakda)_ | `open-sse/services/conversationTracker.ts` | Itakda sa `1` para ihinto ang pagkolekta ng conversation history. Ang `resolveConversationId()` ay nagbabalik ng untracked na resulta bago pa man nito basahin ang SQLite o i-parse ang message history, at saklaw rin ang mga session ID na mula sa client. Ang paghawak ng routing-session ay hindi nagbabago at ang mga umiiral na record ay hindi tinatanggal. Para sa mga deployment na hindi gumagamit ng conversation view ng dashboard at gustong ihinto ang paglaki ng turn table. |
| `OMNIROUTE_NADIR_API_KEY` | _(walang nakatakda)_ | `open-sse/services/autoCombo/nadirStrategy.ts` | API key para sa opt-in na `nadir` auto-combo router strategy, ginagamit kapag walang nakatakdang `config.nadir.apiKey` ang combo. Opsyonal: ang mga tawag na walang key ay mapupunta sa anonymous tier ng Nadir, na may rate-limit kada IP kaya hindi ito magagamit sa likod ng shared gateway. Sensitibo; mas mainam gamitin ang per-combo na field kapag magkakaibang account ang ginagamit ng mga combo. |
| `OMNIROUTE_NADIR_BASE_URL` | `https://api.getnadir.com` | `open-sse/services/autoCombo/nadirStrategy.ts` | Base origin ng Nadir decision API, ginagamit kapag walang nakatakdang `config.nadir.baseUrl` ang combo. Kailangan lang ito para sa self-hosted na Nadir, na nagpapanatili ng mga prompt head sa loob ng sarili mong network. Ang `/v1` sa dulo ay pinahihintulutan at tinatanggal. |
| `OMNIROUTE_API_KEY_WEEKLY_WINDOW` | `provider` | `src/lib/usage/apiKeyUsageLimits.ts` | Lingguhang window para sa mga limit ng paggamit ng USD kada API key (request enforcement, `GET /api/keys/{id}/usage-limits`, `@@om-usage`). `provider`: nagtatapos ang linggo sa pinakamaagang lingguhang reset sa mga upstream connection na maabot ng key, o isang rolling 7 araw kapag walang alam. `calendar`: ang lokal na linggo mula Lunes 00:00 hanggang sa susunod na Lunes 00:00, magkapareho para sa bawat key. Inirerekomenda ang `calendar` kapag ang isang pool ng mga upstream account ay pinagsasaluhan ng maraming key na may indibidwal na budget. Ang mga hindi wastong halaga ay babalik sa `provider`. |
| `OMNIROUTE_API_KEY_WEEKLY_WINDOW_TIMEZONE` | _(timezone ng proseso)_ | `src/lib/usage/apiKeyUsageLimits.ts` | IANA timezone (halimbawa `Asia/Shanghai`) na nagtatakda ng Lunes 00:00 para sa `calendar` na lingguhang window. Kapag walang nakatakda o hindi wasto: ang timezone ng proseso ng OmniRoute (ang `TZ` ng host o container, na kadalasang walang nakatakda, i.e. Coordinated Universal Time, sa mga container image). Hindi pinapansin sa `provider` mode. |
| `OMNIROUTE_MAX_TOOLS_LIMIT` | `128` | `open-sse/config/constants.ts` | Default na maximum na bilang ng mga tool na pinapayagan sa isang request (OpenAI default). Mga positibong integer lang; kapag walang nakatakda o hindi wastong halaga, mananatili ang `128`. Ang provider na may kilala/proaktibong limit (`grok-cli` 200, `nvidia` 1536) ay mag-aapply pa rin ng sarili nitong cap — ito ay naglilipat lamang ng default na ceiling. |
| `OMNIROUTE_PROMPT_EMULATE_TOOLS` | _(naka-on)_ | `open-sse/executors/syntxChat.ts` | SYNTX.ai prompt-emulated tool calling: kapag walang nakatakda o `1`/`true`/`on`/`yes`, ini-inject ang lokal na tool catalog sa prompt; ang anumang ibang halaga (hal. `0`) ay nilalaktawan ang injection na iyon. |
## 7. Mga URL at Cloud Sync
| Variable | Default | Source File | Paglalarawan |
| ------------------------------------------- | --------------------------------------------------------- | ---------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `BASE_URL` | `http://localhost:20128` | `src/lib/cloudSync.ts` | URL sa panig ng server na ginagamit ng mga internal na sync job upang tawagin ang `/api/sync/cloud`. Panatilihin itong loopback/container URL kahit na pampublikong naka-proxy ang app. |
| `CLOUD_URL` | _(walang laman)_ | `src/lib/cloudSync.ts` | URL ng cloud relay endpoint (premium na feature). |
| `CLOUD_SYNC_TIMEOUT_MS` | `12000` | `src/lib/cloudSync.ts` | HTTP timeout para sa mga kahilingan sa cloud sync. |
| `OMNIROUTE_BUILD_PROFILE` | `full` | Configuration ng Webpack build | Profile sa panahon ng build (itakda sa `minimal` upang pisikal na ibukod ang mga privileged module mula sa bundle). |
| `OMNIROUTE_STANDALONE_DIR` | _.build/ standalone na output_ | `scripts/build/colocate-standalone.mjs` | Override sa panahon ng build para sa standalone output directory na ginagamit ng post-build colocation step. Hindi ito runtime setting. |
| `OMNIROUTE_CLOUD_SYNC_SECRET` | _(walang laman)_ | `src/lib/cloudSync.ts` | Shared secret na ginagamit upang beripikahin ang HMAC-SHA256 signature ng mga tugon ng Cloud Sync. |
| `OMNIROUTE_CLOUD_SYNC_SECRETS` | `false` | `src/lib/cloudSync.ts` | Itakda sa `true` upang payagan ang Cloud Sync endpoint na i-overwrite ang mga lokal na credential. Ang default ay `false`. |
| `OMNIROUTE_CLOUD_SYNC_ENFORCE_SIGNATURE` | `false` | `src/lib/cloudSync.ts` | Itakda sa `true` upang tanggihan ang hindi nalagdaang tugon ng Cloud Sync kapag walang naka-configure na lokal na secret (#13679). Ang signature na naroroon ay palaging bineberipika—at palaging tinatanggihan kapag hindi nakatakda ang `OMNIROUTE_CLOUD_SYNC_SECRET`—anuman ang flag na ito. Magiging enforced ang default sa v3.9. |
| `OMNIROUTE_ZED_IMPORT_LEGACY_ONE_STEP` | `false` | `src/app/api/providers/zed/import/route.ts` | Itakda sa `true` upang bumalik sa one-step na gawi ng v3.8.5 na "i-import ang lahat" nang walang kumpirmasyon ng user. |
| `NEXT_PUBLIC_BASE_URL` | `http://localhost:20128` | OAuth, Dashboard, sync | URL na nakaharap sa publiko para sa OAuth redirect_uri, mga link ng Dashboard, at mga nabuong pampublikong URL. Itakda ito sa stable na pampublikong URL kapag ang mga OAuth callback o nabuong browser link ay kailangang gumamit ng canonical na reverse-proxy host. |
| `NEXT_PUBLIC_CLOUD_URL` | _(walang laman)_ | Panig ng client | Mirror sa panig ng client ng `CLOUD_URL`. |
| `NEXT_PUBLIC_APP_URL` | _(hindi nakatakda)_ | `src/shared/services/cloudSyncScheduler.ts` | Legacy na fallback para sa `NEXT_PUBLIC_BASE_URL`. |
| `NEXT_PUBLIC_PORT` | _(hindi nakatakda — gumagamit ng `PORT` bilang fallback)_ | `src/shared/hooks/useDisplayBaseUrl.ts` | Client-side na fallback port para sa mga display URL kapag walang nalalamang origin (SSR/mga pagsubok); binabasa bago ang `PORT`. |
| `OMNIROUTE_PUBLIC_BASE_URL` | _(hindi nakatakda)_ | Tagalutas ng pampublikong origin, mga URL ng larawan | Browser-facing na OmniRoute origin na may pinakamataas na priyoridad at ginagamit sa pagbuo ng mga pampublikong URL at pagpapatunay ng browser origin na hindi mula sa dashboard. Itakda ito kapag ina-access ng OpenWebUI o ibang relay ang OmniRoute gamit ang isang panloob na URL ngunit kailangang kunin ng browser ng user ang nabuong media mula sa isang LAN, tunnel, o pampublikong origin. **Huwag** isama ang `/v1`. |
| `OMNIROUTE_PROVIDER_MANIFEST_URL` | _(hindi nakatakda)_ | `open-sse/config/providerPluginManifestUrl.ts` | Ganap na URL ng provider plugin manifest na inaanunsyo sa mga sidecar client. Kapag hindi nakatakda, kinukuha ng OmniRoute ang `/api/v1/provider-plugin-manifest` mula sa origin ng request o sa HOST/PORT. |
| `OMNIROUTE_PUBLIC_PROTOCOL` | `http` | `open-sse/config/providerPluginManifestUrl.ts` | Protocol na ginagamit kapag kinukuha ang URL ng provider plugin manifest mula sa HOST/PORT nang walang origin ng request. Itakda sa `https` kapag nasa likod ng isang pampublikong proxy na nagwawakas ng TLS at walang tahasang nakatakdang `OMNIROUTE_PROVIDER_MANIFEST_URL`. |
| `OMNIROUTE_TRUST_PROXY` | _(hindi nakatakda)_ | `src/server/origin/publicOrigin.ts` | Opsyonal na trust mode para sa mga ipinasa na header ng pampublikong origin. Hindi nakatakda = huwag pagkatiwalaan ang `Forwarded` / `X-Forwarded-*` para sa mga desisyong panseguridad. Pinagkakatiwalaan ng `true` / `loopback` ang ipinasa na host/proto mula lamang sa loopback proxy na may token stamp. Pinagkakatiwalaan din ng `private` / `lan` ang mga proxy peer sa pribadong LAN, at pinapayagan ang bridge ng `API_PORT` na panatilihin ang `X-Forwarded-For` ng naturang peer. Mas mainam ang tahasang `NEXT_PUBLIC_BASE_URL` sa production. |
| `KIE_CALLBACK_URL` | _(hindi nakatakda)_ | `open-sse/utils/kieTask.ts` | Pampublikong callback URL para sa mga asynchronous na job ng kie.ai. Override na may pinakamataas na priyoridad bago ang `OMNIROUTE_KIE_CALLBACK_URL` at `OMNIROUTE_PUBLIC_URL`. |
| `OMNIROUTE_KIE_CALLBACK_URL` | _(hindi nakatakda)_ | `open-sse/utils/kieTask.ts` | Alternatibong baybay ng `KIE_CALLBACK_URL`. Ginagamit bilang fallback kapag hindi nakatakda ang pangunahing variable. |
| `OMNIROUTE_PUBLIC_URL` | _(hindi nakatakda)_ | `open-sse/utils/kieTask.ts` | Pampublikong origin na ginagamit sa pagbuo ng mga asynchronous na callback URL. Fallback na may pinakamababang priyoridad para sa mga callback ng kie.ai; ginagamit din bilang pangkalahatang pampublikong URL para sa iba pang relay. |
| `OMNIROUTE_CROF_USAGE_URL` | `https://crof.ai/usage_api/` | `open-sse/services/usage.ts` | Endpoint sa pagtingin ng quota ng CrofAI na ginagamit ng pahina ng Usage. I-override para sa mga relay / test fixture. |
| `OMNIROUTE_CLINEPASS_USAGE_URL` | `https://api.cline.bot/api/v1/users/me/plan/usage-limits` | `open-sse/services/usage/clinepass.ts` | Endpoint ng 5-oras / lingguhan / buwanang quota ng ClinePass na ginagamit ng pahina ng Usage. I-override para sa mga relay / test fixture. |
| `OMNIROUTE_OPENCODE_QUOTA_URL` | `https://opencode.ai/zen/go/v1/usage` | `open-sse/services/opencodeQuotaFetcher.ts` | Opisyal na endpoint ng paggamit ng OpenCode Go na pinapatotohanan gamit ang API key at ginagamit ng pahina ng Usage. I-override para sa mga relay / test fixture. |
| `OPENCODE_SYNTHESIZE_CLI_HEADERS` | `true` | `open-sse/executors/opencode.ts` | Bumuo ng mga header ng pagkakakilanlan ng OpenCode CLI (User-Agent, x-opencode-client/project, mga UUID ng request/session) sa mga upstream request ng opencode-go/zen na hindi ipinadala ng client, upang tanggapin ang mga ito ng Cloudflare sa VPS egress (#6210/#5997). Naka-on bilang default mula noong #10571; mag-opt out gamit ang `false`/`0`/`no`/`off`. |
| `OPENCODE_USER_AGENT` | `opencode/1.18.31` | `open-sse/utils/opencodeHeaders.ts` | Default na User-Agent na ginagamit kapag naka-on ang `OPENCODE_SYNTHESIZE_CLI_HEADERS` at walang nakatakdang override na `_USER_AGENT` para sa bawat provider. Inilalapat lamang sa mga opencode executor. Sa isang kahilingang walang key na hinaharang ng upstream, ang naka-configure na value na walang `opencode/= 1.17>` ay pinapalitan ng default na ito sa halip na tanggihan. |
| `OMNIROUTE_FORWARD_ATTRIBUTION` | `1` (naka-on) | `open-sse/utils/opencodeHeaders.ts` | I-forward ang mga client app-attribution header (`x-session-id`, `x-title`, `http-referer`) sa mga upstream provider, upang mapanatili ng kahilingang nagsimula sa loob ng isang nakalistang harness ang pagkakakilanlan nito habang dumaraan sa router (nakabatay rito ang mga OpenRouter publisher gate). Kapag `0`/`false`/`no`/`off`, pinapanatili ang pagkakakilanlan ng registry/operator at inaalis ang mga value na ibinigay ng client. Palaging nangingibabaw ang mga custom header na na-configure ng operator sa mga value ng client. |
| `OPENCODE_CLIENT` | `desktop` | `open-sse/executors/opencode.ts` | Value para sa binubuong `x-opencode-client` header kapag naka-on ang `OPENCODE_SYNTHESIZE_CLI_HEADERS`. |
| `OPENCODE_PROJECT` | `global` | `open-sse/executors/opencode.ts` | Value para sa binubuong `x-opencode-project` header kapag naka-on ang `OPENCODE_SYNTHESIZE_CLI_HEADERS`. |
| `OMNIROUTE_EGRESS_IP_LOCK_PROVIDERS` | _(hindi nakatakda)_ | `open-sse/config/providerErrorRules.ts` | Aktuwal na hanay ng mga provider na ang mga upstream failure ay pinapangkat ayon sa egress IP (kapag nagkaroon ng isang 429, ipo-pause ang lahat ng kapatid na koneksiyong gumagamit ng parehong IP). Kapag hindi nakatakda, ginagamit ang free-tier default na `opencode,opencode-go,opencode-cli`; dini-disable ng `none`/`off`/`false`/`0` ang buong cascade; pinapalitan ng listahang pinaghihiwalay ng kuwit ang hanay. Ang mga paid plan ay pinapangkat ayon sa account sa upstream at ligtas na makakapag-disable nito (#9611). |
| `OMNIROUTE_EGRESS_QUOTA_ROTATION_PROVIDERS` | _(hindi nakatakda)_ | `open-sse/config/providerErrorRules.ts` | Saklaw ng egress rotation para sa pagtanggi dahil sa quota. Kapag hindi nakatakda, isinasantabi ang isang miyembro ng pool kapag may 429 para lamang sa pamilyang pinapangkat ayon sa IP sa itaas; pinapalawak ng `all` ang pagsusulat na iyon sa bawat provider, kaya kapag nakatanggap ng rate limit sa pamamagitan ng isang miyembro, gagamit ng ibang egress ang susunod na pagpili. Binabalewala ang anumang value maliban sa `all`. Nangangailangan ng `PROXY_SKIP_RECENTLY_FAILED` (naka-on bilang default). Ang store ay naka-key ayon sa egress address, hindi sa (provider, address), kaya ipo-pause ng pinalawak na 429 ang miyembrong iyon para sa bawat provider hanggang lumipas ang panahon (5 min, na dumodoble hanggang 15). Binabasa sa bawat resulta ng response, kaya nalalapat ang pagbabago nang hindi nagre-restart. |
| `OPENCODE_FREE_TIER_REQUEST_CONTRACT` | _(hindi nakatakda)_ | `open-sse/executors/opencodeFreeTierContract.ts` | Itakda sa `off` upang ihinto ang pagsasaayos sa body ng mga kahilingang OpenCode na walang key (streaming flag at listahan ng tool). Inilalapat pa rin ang mga header. Binabasa sa bawat kahilingan, kaya agad na magkakabisa ang pagbabago. |
| `OPENCODE_FREE_TIER_PLACEHOLDER_TOOLS` | _(hindi nakatakda)_ | `open-sse/executors/opencodeFreeTierContract.ts` | Mga pangalan ng tool na pinaghihiwalay ng kuwit na idedeklara sa isang kahilingang OpenCode na walang key at walang dalang tool, kapag wala pang naoobserbahan para sa model na iyon. Kapag walang laman, bumabalik sa iisang placeholder na sinasabihan ang model na huwag tawagin. Hanggang 32 entry, `[A-Za-z_][A-Za-z0-9_-]{0,63}`; binabalewala ang mga invalid na entry. |
| `OMNIROUTE_OLLAMA_CLOUD_USAGE_URL` | `https://ollama.com/settings` | `open-sse/services/usage.ts` | URL ng mga setting ng Ollama Cloud na ginagamit para sa pag-scrape ng quota. I-override para sa mga relay / test fixture. |
| `OMNIROUTE_OLLAMA_CLOUD_BALANCE_URL` | `https://ollama.com/api/balance` | `open-sse/services/ollamaCloudBalance.ts` | Nakadokumentong upstream balance endpoint ng Ollama Cloud (`GET https://ollama.com/api/balance`, `Authorization: Bearer `). Binabasa nang isang beses sa pag-load ng module. Unang ginagamit para sa quota ng Ollama Cloud kapag may API key ang koneksiyon; nananatiling fallback ang cookie scraper ng settings page. I-override para sa mga relay / test fixture. |
| `OLLAMA_USAGE_COOKIE` | _(hindi nakatakda)_ | `open-sse/services/usage.ts` | Ollama Cloud `__Secure-session` cookie na ginagamit para sa pag-scrape ng quota mula sa settings page. Sensitibo; piliin ang Dashboard field para sa bawat koneksiyon kapag maraming account ang naka-configure. |
| `OLLAMA_CLOUD_USAGE_COOKIE` | _(hindi nakatakda)_ | `open-sse/services/usage.ts` | Alternatibong env var para sa Ollama Cloud `__Secure-session` cookie. Sensitibo; piliin ang Dashboard field para sa bawat koneksiyon kapag maraming account ang naka-configure. |
| `OMNIROUTE_OLLAMA_USAGE_COOKIE` | _(unset)_ | `open-sse/services/usage.ts` | Alternatibong env var ng cookie na `__Secure-session` ng Ollama Cloud na ginagamit bago ang mas maiikling alias. Sensitibo; mas mainam gamitin ang field sa Dashboard para sa bawat koneksyon kapag maraming account ang naka-configure. |
| `OMNIROUTE_CODEWHISPERER_BASE_URL` | `https://codewhisperer.us-east-1.amazonaws.com` | `open-sse/services/usage.ts` | Endpoint ng mga limitasyon sa paggamit ng CodeWhisperer (AWS Kiro). I-override para sa mga relay / test fixture. |
> [!IMPORTANT]
> Kapag nagde-deploy sa likod ng reverse proxy (nginx, Caddy), itakda ang `NEXT_PUBLIC_BASE_URL` sa iyong matatag na pampublikong URL (hal., `https://omniroute.example.com`) kapag kailangang gamitin ng mga OAuth callback o nabuong pampublikong link ang hostname na iyon. Kung wala ito, maaaring mabigo ang mga OAuth callback dahil hindi tutugma ang redirect_uri at maaaring tumuro ang mga nabuong pampublikong link sa internal na origin ng container.
>
> Panatilihin ang `BASE_URL` bilang internal na loopback/container URL para sa mga server-to-server job. Huwag gumamit ng browser `Origin` o pampublikong hostname para sa mga internal na self-fetch na may dalang credential.
>
> Hindi nangangailangan ng static na pampublikong base URL ang mga authenticated na pagsusulat sa dashboard: nagpapadala ang dashboard ng mga same-origin na unsafe request na may CSRF token na nakatali sa session. Sinesentralisa pa rin ng OmniRoute ang pagpapatunay ng public origin para sa mga browser integration na hindi mula sa dashboard: unang pinagkakatiwalaan ang mga tahasang env var ng pampublikong URL; binabalewala ang mga raw na `Forwarded` / `X-Forwarded-*` header maliban kung naka-enable ang `OMNIROUTE_TRUST_PROXY` at may token stamp bilang pinagkakatiwalaan ang agarang proxy peer. Huwag gumamit ng mga setting ng CORS upang ayusin ang mga same-origin na request ng dashboard; para lamang ang CORS sa mga cross-origin na browser client.
---
## 8. Outbound Proxy
I-ruta ang mga tawag ng upstream LLM provider sa pamamagitan ng isang HTTP o SOCKS5 proxy para sa kontrol ng egress, geo-routing, o pagtatago ng IP.
Ang `OMNIROUTE_UPSTREAM_HTTP2_ENABLED` ay naka-default sa `true`. Itakda ito sa `false`, `0`, `no`, o
`off` upang pilitin ang HTTP/1.1 sa mga Undici dispatcher sa `open-sse/utils/proxyDispatcher.ts`
at `open-sse/utils/proxyFetch.ts`: direktang egress, mga HTTP(S)/SOCKS proxy, mga relay, at
ang kanilang mga retry gamit ang fresh socket. Pinananatili nito ang pag-verify ng TLS certificate,
proxy authentication, mga limitasyon ng koneksyon, at mga setting ng keep-alive. I-restart ang OmniRoute
pagkatapos itong baguhin dahil naka-cache ang mga dispatcher at ang mga relay agent ay nililikha sa startup.
Hindi kontrolado ng switch na ito ang wreq TLS fingerprinting o mga transport na partikular sa provider.
| Variable | Default | Source File | Paglalarawan |
| ---------------------------------------- | --------- | ---------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| `ENABLE_SOCKS5_PROXY` | `true` | `open-sse/executors` | I-enable ang SOCKS5 proxy agent para sa mga upstream na tawag. Mag-opt-out gamit ang `false`. |
| `NEXT_PUBLIC_ENABLE_SOCKS5_PROXY` | `true` | Client-side | Kaalaman sa client-side tungkol sa availability ng SOCKS5. |
| `PROXY_SKIP_RECENTLY_FAILED` | `true` | `src/shared/utils/featureFlags.ts` | Feature flag na naka-on bilang default (tingnan ang [FEATURE_FLAGS.md](./FEATURE_FLAGS.md); ang dashboard DB override ang mananaig). Ang mga proxy pool at per-account rotation ay humihinto sa muling pag-serve ng miyembrong katatapos lang mabigo (tinanggihang TCP probe, o isang 429 sa pamamagitan nito) sa loob ng panahong dumodoble sa bawat pag-uulit, hanggang sa isang cap. Ang `false` ay nagbabalik ng payak na pagpili. |
| `SELECTOR_CONTROL_ALLOWLIST` | _(unset)_ | `src/lib/proxySubscription/selectorGuard.ts` | Allow-list para sa mga local-core selector-control target lampas sa loopback (mga host o IP na pinaghihiwalay ng kuwit/espasyo, ang `*` ay nagbubukas ng LAN/pribado ngunit hindi kailanman ang metadata/link-local). Ang loopback sa http/https ay pinapayagan bilang default. Ang halagang dashboard DB ay mananaig sa variable na ito kapag nakatakda at hindi walang laman. |
| `PROXY_QUOTA_429_BASE_MS` | `300000` | `open-sse/utils/proxyRefusalMemory.ts` | Batayang panahon (ms) ng 429 set-aside, dumodoble sa bawat pag-uulit. Binabasa nang isang beses sa startup. Nakahanggan sa `1000..3600000`; kapag lampas sa sakop o hindi mababasa, babalik sa default na may babala. |
| `PROXY_QUOTA_429_MAX_MS` | `900000` | `open-sse/utils/proxyRefusalMemory.ts` | Cap (ms) ng 429 set-aside. Binabasa nang isang beses sa startup. Nakahanggan sa `1000..3600000`; kapag lampas sa sakop o hindi mababasa, babalik sa default na may babala. Kapag ang cap ay mas mababa sa base, babalik ito sa default. Ang pagpapababa ng cap ay nagpapabilis din ng pagkalimot ng streak: ang mga entry ay pina-purge nang `2 x max` pagkatapos ng expiry. |
| `PROXY_POOL_SHARED_EGRESS_ORDER` | `false` | `src/shared/utils/featureFlags.ts` | Opt-in na feature flag (tingnan ang [FEATURE_FLAGS.md](./FEATURE_FLAGS.md); ang dashboard DB override ang mananaig). Para sa mga provider na ang quota ay naka-bucket ayon sa egress address, i-rank ang pool member na nagbabahagi ng naobserbahang egress address ng isang kamakailang tinanggihang miyembro nang bahagyang mas mababa sa mga malulusog na miyembro. Pagkakasunud-sunod lamang, hindi kailanman inaalis. Kailangan ang `PROXY_SKIP_RECENTLY_FAILED`, na siyang lumilikha ng refusal signal na binabasa nito. |
| `PROXY_WEBHOOK_REBOUND_MS` | `300000` | `src/lib/proxyEvents/proxyTransitionBridge.ts` | Rebound window (ms) na naglilimita ng mga paulit-ulit na `proxy.set_aside` webhook alert bawat pool member upang ang isang bugso ng mga pagtanggi ay magpadala lamang ng isang event. Binabasa sa bawat emit. Nakahanggan sa `1000..3600000`; kapag lampas sa sakop o hindi mababasa, tahimik na babalik sa default. |
| `HTTP_PROXY` | _(unset)_ | Node.js standard | HTTP proxy para sa mga upstream na tawag. |
| `HTTPS_PROXY` | _(unset)_ | Node.js standard | HTTPS proxy para sa mga upstream na tawag. |
| `ALL_PROXY` | _(unset)_ | Node.js standard | Pangkalahatang proxy (sumusuporta sa `socks5://`). |
| `OMNIROUTE_PROXY_ECHO_URL` | _(unset)_ | `src/lib/proxyEchoTarget.ts` | Itinatakda ang echo-IP target na ginagamit ng mga proxy egress probe sa isang URL. Kapag hindi nakatakda, susubukan ng probe ang `api64.ipify.org` pagkatapos ang `api4.ipify.org` upang ang mga tunnel na IPv4 lamang ay hindi maiulat na patay (#9694). |
| `NO_PROXY` | _(unset)_ | Node.js standard | Mga hostname/IP na pinaghiwalay ng kuwit upang laktawan ang proxy. |
| `OMNIROUTE_PROXY_DISPATCHER_CONNECTIONS` | `32` | `open-sse/utils/proxyDispatcher.ts` | Pinakamataas na bilang ng kasabay na mga socket bawat naka-cache na HTTP/SOCKS proxy dispatcher. Ang mga pangmatagalang SSE stream tulad ng Codex `/v1/responses` ay nangangailangan ng higit sa isang koneksyon kapag maraming request ang nagbabahagi ng parehong proxy sa antas ng account. Ang mga halagang higit sa `256` ay tinatakpan. |
| `SOCKS_HANDSHAKE_TIMEOUT_MS` | `10000` | `open-sse/utils/socksConnectorWithFamily.ts` | Timeout ng SOCKS5 handshake (connect) sa ms. Taasan ito kapag ang isang residential gateway host ay natamaan ng mataas na kasabayang mga request (hal. 100 sabay-sabay na request) — maaaring lumampas sa 10s ang tunay na handshake sa ilalim ng saturated na pool kahit naabot ang proxy, na kung hindi ay lalabas bilang maling `[Proxy Fast-Fail] Proxy unreachable`. Tinatakpan sa `120000`. |
| `PROXY_FAIL_OPEN` | `false` | `src/sse/handlers/chatHelpers.ts` | Kapag `false` (default), ang request na hindi na-resolve ang nakatalagang proxy ay **tatanggihan (fail-closed)** sa halip na bumalik sa direktang koneksyon — pinipigilan ang pagtagas ng tunay na IP. Itakda ang `true` upang ibalik ang legacy na DIRECT fallback. |
| `ENABLE_TLS_FINGERPRINT` | `false` | `open-sse/executors` | Mag-spoof ng TLS fingerprint gamit ang wreq-js (gumagaya sa Chrome 124). Kontra sa JA3/JA4 blocking. |
| `TLS_FINGERPRINT_PROVIDERS` | _(unset)_ | `open-sse/utils/proxyFetch.ts` | Allowlist ng mga provider na pinaghiwalay ng kuwit para sa bagong proxied TLS routing (`open-sse/utils/proxyFetch.ts`). Pinananatili ng direktang TLS ang legacy na pag-uugali nito kapag hindi nakatakda; tanging ang mga provider na ito ang daraan sa Chrome-124 fingerprint bridge. Ang Groq (`api.groq.com`) ay hindi kasama kahit hindi nakatakda ang allowlist, dahil ang Chrome JA3 ay nagti-trigger ng Cloudflare 1010 habang ang native undici ay naaabot ang API. |
| `OMNIROUTE_TURNSTILE_IGNORE_TLS_ERRORS` | `false` | `open-sse/services/claudeTurnstileSolver.ts` | Pahintulutan ang Claude Turnstile Playwright browser context na balewalain ang mga error sa HTTPS certificate. |
### Mga Senaryo
| Senaryo | Konpigurasyon |
| --------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **SOCKS5 sa pamamagitan ng SSH tunnel** | `ALL_PROXY=socks5://127.0.0.1:7890`, `ENABLE_SOCKS5_PROXY=true` |
| **Korporatibong HTTP proxy** | `HTTP_PROXY=http://proxy.corp.com:3128`, `HTTPS_PROXY=http://proxy.corp.com:3128`, `NO_PROXY=localhost,internal.corp.com` |
| **Anti-fingerprint** | `ENABLE_TLS_FINGERPRINT=true` — nangangailangan ng `wreq-js` (kasama) |
| **Kontrolado ang egress / walang direktang access** | Iwanang `PROXY_FAIL_OPEN=false` (default). Ang mga request ay tuluyang mabibigo kapag hindi available ang proxy sa halip na magtagas sa pamamagitan ng direkta. |
| **Legacy / dev — payagan ang direktang fallback** | `PROXY_FAIL_OPEN=true`. Ibinabalik ang pag-uugali bago ang hardening: direktang koneksyon ang ginagamit kapag nabigo ang pag-resolve ng proxy. |
> **Tala (NVIDIA validation bypass — #3226):** Ang API-key validation endpoint ng NVIDIA
> ay natitigilan kapag dinaan sa global proxy/TLS-patched fetch (undici dispatcher → 504).
> Ang `src/lib/providers/validation.ts::directHttpsRequest()` ay sadyang nilalaktawan ang
> proxy patch para sa isang validation call na iyon gamit ang `safeOutboundFetch({ bypassProxyPatch: true })`.
> Ito ay isang dokumentadong, may saklaw na eksepsiyon — **hindi** nito naapektuhan ang chat/usage egress.
> Ang bypass ay naka-pin sa saklaw ng `tests/unit/proxy-bypass-scope-guard-3226.test.ts`.
---
## 9. Integrasyon ng CLI Tool
Kumokontrol kung paano natutuklasan at inilulunsad ng OmniRoute ang mga CLI sidecar (Claude Code, Codex, atbp.).
| Variable | Default | Source File | Paglalarawan |
| --------------------------------- | -------------------------------- | --------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `CLI_MODE` | `auto` | `src/shared/services/cliRuntime.ts` | `auto` = maghanap sa system PATH; `manual` = gumamit lamang ng mga tahasang path. |
| `CLI_EXTRA_PATHS` | _(hindi nakatakda)_ | `src/shared/services/cliRuntime.ts` | Mga karagdagang entry sa PATH para sa pagtuklas ng CLI binary (pinaghihiwalay ng colon). |
| `CLI_CONFIG_HOME` | _(hindi nakatakda)_ | `src/shared/services/cliRuntime.ts` | I-override ang home directory para sa pagbasa ng mga CLI config (`~/.claude`, `~/.codex`). Dapat absolute at nasa loob ng home ng proseso — **o**, sa isang container, isang bind-mounted na path (ganito gumagana ang `/host-home`). Kung hindi, babalik ito sa home dir. |
| `CLI_ALLOW_CONFIG_WRITES` | `true` | `src/shared/services/cliRuntime.ts` | Payagan ang OmniRoute na sumulat ng mga CLI config file (token refresh, session data). Itakda sa `false` upang mabigo ang bawat pagsulat ng CLI config na may tahasang error na "writes disabled". |
| `CLI_CLAUDE_BIN` | `claude` | `src/shared/services/cliRuntime.ts` | Pasadyang path sa Claude CLI binary. |
| `CLI_CODEX_BIN` | `codex` | `src/shared/services/cliRuntime.ts` | Pasadyang path sa Codex CLI binary. |
| `CLI_DROID_BIN` | `droid` | `src/shared/services/cliRuntime.ts` | Pasadyang path sa Droid CLI binary. |
| `CLI_OPENCLAW_BIN` | `openclaw` | `src/shared/services/cliRuntime.ts` | Pasadyang path sa OpenClaw CLI binary. |
| `CLI_CURSOR_BIN` | `agent`, pagkatapos `cursor` | `src/shared/services/cliRuntime.ts` | Pasadyang path sa Cursor agent binary. Kung wala ito, susubukan muna ng pagtukoy ang `agent` at babalik sa `cursor`. |
| `CLI_CLINE_BIN` | `cline` | `src/shared/services/cliRuntime.ts` | Pasadyang path sa Cline CLI binary. |
| `CLI_5DIVE_BIN` | `5dive` | `src/shared/services/cliRuntime.ts` | Pasadyang path sa 5dive CLI binary. |
| `CLI_5DIVE_STATE_DIR` | `/var/lib/5dive` | `src/shared/services/cliRuntime.ts` | System state dir ng 5dive (mga auth profile na pag-aari ng root); katumbas ng sariling STATE_DIR default ng 5dive. |
| `CLI_CONTINUE_BIN` | `cn` | `src/shared/services/cliRuntime.ts` | Pasadyang path sa Continue CLI binary. |
| `CLI_QODER_BIN` | `qodercli` | `src/shared/services/cliRuntime.ts` | Pasadyang path sa Qoder CLI binary. |
| `CLI_QWEN_BIN` | `qwen` | `src/shared/services/cliRuntime.ts` | Pasadyang path sa Qwen Code CLI binary. |
| `CLI_AIDER_BIN` | `aider` | `src/shared/services/cliRuntime.ts` | Pasadyang path sa Aider CLI binary. |
| `CLI_GOOSE_BIN` | `goose` | `src/shared/services/cliRuntime.ts` | Pasadyang path sa Goose CLI binary. |
| `CLI_GEMINI_BIN` | `gemini` | `src/shared/services/cliRuntime.ts` | Pasadyang path sa Google Gemini CLI binary — para lamang sa server-side na pagtukoy/health check; nireresolba ng `omniroute run gemini` ang `gemini` binary mula sa system PATH. |
| `CLI_KILO_BIN` | `kilocode` | `src/shared/services/cliRuntime.ts` | Pasadyang path sa Kilo Code CLI binary. |
| `CLI_OPENCODE_BIN` | `opencode` | `src/shared/services/cliRuntime.ts` | Pasadyang path sa OpenCode CLI binary. |
| `CLI_HERMES_BIN` | `hermes` | `src/shared/services/cliRuntime.ts` | Pasadyang path sa Hermes binary. Binabahagi ng dalawang entry ng catalog (`hermes` at `hermes-agent`). |
| `CLI_FORGE_BIN` | `forge` | `src/shared/services/cliRuntime.ts` | Pasadyang path sa ForgeCode CLI binary. |
| `CLI_JCODE_BIN` | `jcode` | `src/shared/services/cliRuntime.ts` | Pasadyang path sa jcode CLI binary. |
| `CLI_DEEPSEEK_TUI_BIN` | `deepseek-tui` | `src/shared/services/cliRuntime.ts` | Pasadyang path sa DeepSeek TUI binary. |
| `CLI_CODEWHALE_BIN` | `codewhale` | `src/shared/services/cliRuntime.ts` | Pasadyang path sa CodeWhale CLI binary. |
| `CLI_SMELT_BIN` | `smelt` | `src/shared/services/cliRuntime.ts` | Pasadyang path sa Smelt CLI binary. |
| `CLI_PI_BIN` | `pi` | `src/shared/services/cliRuntime.ts` | Pasadyang path sa Pi (pi-coding-agent) binary. |
| `CLI_CRUSH_BIN` | `crush` | `src/shared/services/cliRuntime.ts` | Pasadyang path sa Crush CLI binary. |
| `CLI_OMP_BIN` | `omp` | `src/shared/services/cliRuntime.ts` | Pasadyang path sa Oh My Pi (`omp`) agent binary. |
| `CLI_LETTA_BIN` | `letta` | `src/shared/services/cliRuntime.ts` | Pasadyang path sa Letta CLI binary. |
| `CLI_PRIME_AGENT_BIN` | `prime-agent` | `src/shared/services/cliRuntime.ts` | Pasadyang path sa Prime Agent (Prime Intellect) binary. |
| `CLI_WINDSURF_BIN` | _(wala)_ | `src/shared/services/cliRuntime.ts` | Pasadyang path sa Windsurf binary. Ang Windsurf ay **walang default na command** — ang binary detection ay nananatiling naka-disable hangga't hindi ito nai-set. |
| `CLI_DEVIN_BIN` | `devin` | `open-sse/executors/devin-cli.ts` | Pasadyang path sa Devin CLI binary (v3.8.0). Ginagamit ng Windsurf/Devin executor. |
| `DEVIN_DESKTOP_VERSION` | `3.6.27` | `open-sse/executors/devin-desktop.ts` | Devin Desktop `ide_version`. Ang mga override ay dapat gumamit ng format na `x.y.z`; ang mga invalid na halaga ay babalik sa verified na default. |
| `DEVIN_DESKTOP_EXTENSION_VERSION` | `1.48.2` | `open-sse/executors/devin-desktop.ts` | Naka-bundle na Codeium/language-server `extension_version`, naiiba sa Desktop `ide_version`. Ang mga override ay dapat gumamit ng `x.y.z`; ang mga invalid na halaga ay gagamit ng naka-bundle na default. |
| `CLI_DEVIN_AGENTIC_BIN` | `devin` | `open-sse/executors/devin-cli-agentic.ts` | Override ng Devin CLI para lamang sa agentic bridge. Ang executor ay tumatanggap lamang ng lokal na ACP stdio upstream. |
| `DEVIN_AGENTIC_HOME` | _(kinakailangan)_ | `open-sse/executors/devin-cli-agentic.ts` | Absolutong isolated na home para sa agentic Devin subprocess; ang mga tinatanggap na bridge path ay `/home/bridge` at mga task-local na `.sandbox` path (sa Windows, `C:\...\.sandbox\...`). |
| `DEVIN_AGENTIC_ACP_TIMEOUT_MS` | `120000` | `open-sse/executors/devin-cli-agentic.ts` | Pinakamahabang tagal ng isang Devin ACP turn bago wakasan ng bridge ang child at magbalik ng explicit na timeout. |
| `DEVIN_BRIDGE_MODEL` | `devin-cli-agentic/swe-1-7` | `docker/devin-bridge/compose.yml` | Pangunahing alias ng Claude Code model para sa isolated na bridge. Pinapalitan ng live na harness ang halimbawa ng model na ibinabalik ng kasalukuyang Devin account. |
| `DEVIN_BRIDGE_SONNET_MODEL` | `DEVIN_BRIDGE_MODEL` | `docker/devin-bridge/compose.yml` | Alias ng isolated na bridge na ginagamit kapag hinihiling ng Claude Code ang default nitong Sonnet. |
| `DEVIN_BRIDGE_OPUS_MODEL` | `DEVIN_BRIDGE_MODEL` | `docker/devin-bridge/compose.yml` | Alias ng isolated na bridge na ginagamit kapag hinihiling ng Claude Code ang default nitong Opus. |
| `DEVIN_BRIDGE_HAIKU_MODEL` | `DEVIN_BRIDGE_MODEL` | `docker/devin-bridge/compose.yml` | Alias ng isolated na bridge na ginagamit kapag hinihiling ng Claude Code ang default nitong Haiku. |
| `DEVIN_BRIDGE_SUBAGENT_MODEL` | `DEVIN_BRIDGE_MODEL` | `docker/devin-bridge/compose.yml` | Alias ng isolated na bridge na ginagamit para sa mga Claude Code subagent. |
| `DEVIN_SEAT_API_URL` | `https://server.codeium.com` | `open-sse/services/usage/devinCli.ts` | Opsyonal na override para sa Codeium seat-management API na ginagamit ng Devin CLI quota (`GetUserStatus`). |
| `AUGGIE_BIN` | `auggie` | `open-sse/executors/auggie.ts` | Absolute-path override para sa Augment (Auggie) CLI binary na ginagamit ng lokal na `auggie` provider. Babalik sa `CLI_AUGGIE_BIN`, pagkatapos ay sa PATH lookup. |
| `CLI_AUGGIE_BIN` | `auggie` | `open-sse/executors/auggie.ts` | Alias override para sa path ng Augment (Auggie) CLI binary (sine-check pagkatapos ng `AUGGIE_BIN`). |
| `ZCODE_BIN` | `zcode` | `open-sse/executors/zcode.ts` | Binary na ginagamit para sa stdio client ng lokal na `zcode` provider. Babalik sa `zcode` sa PATH. |
| `ZCODE_ARGS` | — | `open-sse/executors/zcode.ts` | JSON array (≤16 string) ng mga karagdagang argument na ipinapasa sa `zcode` binary kapag inilunsad via `cliTools`. |
| `ZCODE_CWD` | `process.cwd()` | `open-sse/executors/zcode.ts` | Working directory para sa ZCode app-server subprocess. |
| `ZCODE_PROVIDER_ID` | `builtin:zai-coding-plan` | `open-sse/executors/zcode.ts` | Override para sa provider id na ipinapadala sa app-server. |
| `ZCODE_SERVER_RUNTIME_ROOT` | `~/.zcode/server` | `open-sse/executors/zcode.ts` | Root ng ZCode app-server runtime (kung saan matatagpuan ang bundled na `node` at `zcode-server.cjs`). |
| `ZCODE_SERVER_NODE` | `/node` | `open-sse/executors/zcode.ts` | Node executable na ginagamit para i-host ang ZCode app-server. |
| `ZCODE_SERVER_ENTRY` | `/zcode-server.cjs` | `open-sse/executors/zcode.ts` | App-server entry script na ginagamit para i-host ang ZCode server. |
| `ZCODE_STARTUP_TIMEOUT_MS` | `10000` | `open-sse/executors/zcode.ts` | Startup timeout (ms) bago ituring na nabigo ang paglulunsad ng ZCode app-server. |
| `ZCODE_RPC_TIMEOUT_MS` | `30000` | `open-sse/executors/zcode.ts` | Per-request na RPC timeout (ms) para sa tawag sa ZCode app-server. |
| `ZCODE_TURN_TIMEOUT_MS` | `120000` | `open-sse/executors/zcode.ts` | Pinakamataas na tagal (ms) ng isang ZCode turn bago ito i-timeout ng supervisor. |
| `ZCODE_POLL_INTERVAL_MS` | `250` | `open-sse/executors/zcode.ts` | Polling interval (ms) para sa pagkumpleto ng ZCode turn. |
| `HERMES_HOME` | `~/.hermes` | `src/lib/cli-helper/config-generator/hermesHome.ts` | Home directory ng Hermes Agent kung saan nagbabasa/nagsusulat ang OmniRoute ng Hermes CLI config. Tumutugma sa env var na itinatakda ng Hermes PowerShell installer sa Windows (`%LOCALAPPDATA%\hermes`). |
### Awtomatikong Pag-sync ng CLI Profile
Ang mga feature flag na ito ay opt-in at naka-off bilang default. Maaari rin ang mga itong i-toggle mula sa
CLI Code dashboard.
| Variable | Default | Source File | Paglalarawan |
| ------------------------------------- | ------- | ------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `OMNIROUTE_AUTO_SYNC_CODEX_PROFILES` | `false` | `src/shared/constants/featureFlagDefinitions.ts` | Pagkatapos ng sync ng provider model, awtomatikong muling isinusulat ang mga profile file na `~/.codex/*.config.toml` mula sa live na catalog. Kailangan ang `CLI_ALLOW_CONFIG_WRITES`; hindi kailanman binabago ang aktibo/default na Codex config, auth, mga setting ng Codex-lb, o napiling provider. |
| `OMNIROUTE_AUTO_SYNC_CLAUDE_PROFILES` | `false` | `src/shared/constants/featureFlagDefinitions.ts` | Pagkatapos ng sync ng provider model, awtomatikong muling isinusulat ang mga Claude Code profile file na `~/.claude/profiles//settings.json` mula sa live na catalog. Kailangan ang `CLI_ALLOW_CONFIG_WRITES`; hindi kailanman binabago ang aktibo/default na Claude config, auth, o napiling provider. |
### Halimbawa ng Docker
```bash
# I-mount ang mga host binary sa loob ng container at sabihin sa OmniRoute kung nasaan ang mga ito:
CLI_EXTRA_PATHS=/host-cli/bin
CLI_CONFIG_HOME=/host-home
CLI_ALLOW_CONFIG_WRITES=true
CLI_CLAUDE_BIN=/host-cli/bin/claude
```
Ang `CLI_CONFIG_HOME` ay may bisa lamang kapag ang path ay aktwal na naka-bind-mount mula sa host — ipares ito sa mga mount tulad ng `~/.codex:/host-home/.codex:rw` (tingnan ang `host` profile sa `docker-compose.yml`). Ang path na wala sa loob ng home ng container user at hindi rin bind mount ay binabalewala, dahil ang anumang isulat doon ay maitatapon kapag muling ginawa ang container.
Ang image ay tumatakbo bilang `USER node`, kaya ang hindi naka-mount na `/root` ay **hindi** wastong override.
| Variable | Default | Source File | Paglalarawan |
| ---------------------------------------- | --------------- | ----------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| `OMNIROUTE_CONTAINER` | _(awtomatiko)_ | `src/shared/utils/containerEnv.ts` | Pilitin ang container detection na naka-on (`1`/`true`) o naka-off (`0`/`false`). Kailangan lamang sa mga runtime na hindi natutukoy ng auto-detection. |
| `OMNIROUTE_ALLOW_CONTAINER_CONFIG_WRITE` | `false` | `src/shared/services/cliRuntime.ts` | Pahintulutan pa rin ang mga pagsulat ng config ng CLI-tool sa isang hindi naka-mount na container path. Ang katumbas nito sa CLI ay `--allow-container-write`. |
| `DOCKER_UPDATE_TRIGGER_FILE` | hindi nakatakda | `src/lib/system/autoUpdate.ts` | Para lamang sa Docker image: ang **Update Now** ng dashboard ay nagsusulat ng JSON request sa file na ito (dapat nasa loob ng `DATA_DIR`) para sa isang watcher sa panig ng host upang i-pull at muling gawin ang container. Tingnan ang [Gabay sa Docker](../guides/DOCKER_GUIDE.md#dashboard-updates-in-docker). |
### Mga helper ng CLI Binary (`omniroute`)
Ang mga variable na ito ang nag-aayos ng sariling pag-uugali ng `omniroute` CLI binary (hindi ang sidecar detection sa itaas).
| Variable | Default | Source File | Paglalarawan |
| ------------------------------------- | --------------------------------- | --------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `OMNIROUTE_LANG` | _(sistema)_ | `bin/cli/i18n.mjs` | Pilitin ang wika ng output ng CLI. BCP-47 locale (hal. `en`, `pt-BR`). Ina-override ang mga system locale env var (LC_ALL, LC_MESSAGES). |
| `OMNIROUTE_SHOW_LOG` | _(hindi nakatakda)_ | `bin/cli/runtime/processSupervisor.mjs` | Itakda sa `1` upang i-forward ang stdout/stderr ng server sa terminal sa supervised mode. Katumbas ng `--log` flag sa `omniroute serve`. |
| `OMNIROUTE_CLI_TOKEN` | _(hindi nakatakda)_ | `bin/cli/api.mjs` | Machine-auth token na ini-inject bilang `x-omniroute-cli-token` header. Awtomatikong binubuo sa task 8.12. |
| `GEMINI_CLI_HOME` | _(hindi nakatakda)_ | `bin/cli/commands/setup-gemini.mjs` | Persistent na Gemini home root; ang one-shot run ay gumagamit ng pansamantalang nakahiwalay na home. |
| `OMNIROUTE_CHILD_SIGNAL_TIMEOUT_MS` | `5000` | `bin/cli/commands/run.mjs` | Grace period sa milliseconds bago pilit na patayin ang isang na-signal na CLI child. |
| `OMNIROUTE_CLI_SKIP_DEFAULT_DATA_ENV` | _(hindi nakatakda)_ | `bin/omniroute.mjs` | Itakda sa 1 kasama ng tahasang DATA_DIR upang laktawan ang environment file ng default na data-directory ng user. |
| `OMNIROUTE_SYNC_TOKEN` | _(hindi nakatakda)_ | `bin/cli/commands/sync.mjs` | Sync token para sa `omniroute sync bundle` (ang `GET /api/sync/bundle` ay tumatanggap lamang ng sync token, hindi API key). Katumbas ng `--token`. |
| `OMNIROUTE_HTTP_TIMEOUT_MS` | `30000` | `bin/cli/api.mjs` | HTTP timeout (ms) bawat pagtatangka para sa mga request mula CLI → server. |
| `OMNIROUTE_READY_TIMEOUT_MS` | `60000` | `bin/cli/utils/pid.mjs` | Pinakamahabang oras (ms) na hinihintay ng CLI ang server health endpoint bago mag-print ng babala tungkol sa timeout. Kapaki-pakinabang para sa mga mabagal na cold start (hal. Windows). Maaari ring itakda sa pamamagitan ng `--ready-timeout`. |
| `OMNIROUTE_VERBOSE` | `0` | `bin/cli/api.mjs` | Itakda sa `1` upang i-print ang mga retry/backoff diagnostics sa stderr habang tumatakbo ang mga CLI command. |
| `OMNIROUTE_PLUGIN_PATH` | _(hindi nakatakda)_ | `bin/cli/plugins.mjs` | Custom na direktoryo para sa pagtuklas ng CLI plugin (mga package na `omniroute-cmd-*`). Nagde-default sa `~/.omniroute/plugins/` kapag hindi nakatakda. Para lamang sa CLI — hindi ito kailanman umaabot sa server-side plugin scanner, na itinutukoy ng `OMNIROUTE_PLUGINS_DIR` (seksyon 2). |
| `OMNIROUTE_NO_UPDATE_NOTIFIER` | _(hindi nakatakda)_ | `bin/omniroute.mjs` | Pigilan ang abiso ng update ng CLI sa pagtatapos ng proseso kapag nakatakda sa anumang hindi walang-laman na halaga. Nananatiling naka-disable ang abiso nang hiwalay sa CI, quiet mode, at mga non-text na output mode. |
| `OMNIROUTE_DOCTOR_LIVENESS_URL` | _(hinango)_ | `bin/cli/commands/doctor.mjs` | Liveness URL na sinisiyasat ng `omniroute doctor`. Ang programmatic na opsyong `livenessUrl` ang may priyoridad; kung hindi, ang halagang ito ang gagamitin nang tapat. Kapag hindi nakatakda, hinihango ng CLI ang `/api/health/degradation` endpoint ng lokal na dashboard. |
| `OMNIROUTE_PROVIDER_CATALOG_PATH` | `src/shared/constants/providers/` | `bin/cli/provider-catalog.mjs` | Path ng provider catalog na ginagamit ng mga CLI provider command. Ang programmatic na opsyong `catalogPath` ang may priyoridad. Ang mga absolute path ay ginagamit as-is; ang mga relative path ay nireresolba mula sa project root. Kapag hindi nakatakda, ginagamit ng CLI ang direktoryo ng provider constants, na may legacy na `providers.ts` file bilang fallback. |
| `OMNIROUTE_PROVIDER_TEST_MODEL` | _(default ng provider)_ | `bin/cli/provider-test.mjs` | Pandaigdigang fallback model para sa mga pagsubok ng koneksyon ng CLI provider. Ang pagkakasunud-sunod ng priyoridad ay: naka-configure na connection model, provider-specific na model override, ang halagang ito, at pagkatapos ay ang built-in na test model ng provider. |
---
## 10. Mga Panloob na Agent at mga Integrasyon ng MCP
| Baryable | Default | Pinagmulang File | Paglalarawan |
| ----------------------------------------------- | --------------------------------------------------- | ----------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| `OMNIROUTE_BASE_URL` | auto-detect | `open-sse/mcp-server/server.ts` | Tahasang URL para sa mga tool ng MCP/A2A upang maabot ang OmniRoute. Ina-override ang auto-detection ng localhost. |
| `OMNIROUTE_API_KEY` | _(hindi nakatakda)_ | MCP/A2A modules | API key para sa mga panloob na tawag ng MCP tool at A2A skill. |
| `OMNIROUTE_API_KEY_ID` | _(hindi nakatakda)_ | `open-sse/mcp-server/audit.ts` | Key ID para sa attribution ng MCP audit log. |
| `ROUTER_API_KEY` | _(hindi nakatakda)_ | Legacy | Legacy na alyas para sa `OMNIROUTE_API_KEY`. |
| `OMNIROUTE_A2A_HISTORY_RETENTION_DAYS` | `30` | `src/lib/a2a/taskManager.ts` | Bilang ng mga araw na itinatago ang kasaysayan ng A2A task sa lokal na database bago burahin ng pang-araw-araw na purge ang isang row. Kapag hindi nakatakda, hindi numeriko, o `<= 0`, babalik sa `30`. |
| `OMNIROUTE_A2A_MEMORY_HITS` | `1` | `src/lib/a2a/taskExecution.ts` | Kill-switch para sa A2A memory-hits observability feature. Itakda sa `0` upang tuluyang laktawan ang memory recall lookup para sa isang task; anumang ibang halaga (kabilang ang hindi nakatakda) ay pananatilihin itong naka-enable. |
| `OMNIROUTE_ISSUE_AGENT_ENABLED` | `false` | `src/app/api/issue-agent/runs/route.ts` | Pinapagana ang offline/lokal na Issue Agent recorded-triage endpoint. Iwanang naka-disable maliban kung tahasang nagpapatakbo ng mga lokal na recorded-triage workflow. |
| `OMNIROUTE_ISSUE_AGENT_TIMEOUT_MS` | _(hindi nakatakda)_ | `src/lib/issueAgent/execution.ts` | Timeout (ms) para sa isang Issue Agent recorded-triage run. Na-clamp sa isang panloob na maximum; babalik sa built-in na default kapag hindi nakatakda o hindi wasto. |
| `OMNIROUTE_CONTEXT` | _(aktibong konteksto)_ | `bin/cli/program.mjs`, `bin/cli/api.mjs` | Konteksto/profile ng CLI remote-mode para sa mga command na `omniroute`; ina-override ang aktibong konteksto sa lokal na store ng mga konteksto. Katumbas ng `--context `. |
| `OMNIROUTE_CONTEXT_KEYCHAIN_DISABLED` | `0` | `bin/cli/contexts.mjs` | I-disable ang opsyonal na `keytar` OS-keychain backend para sa mga kredensyal ng CLI context. Kapag naka-enable, mananatili ang mga kredensyal sa `config.json` mode `0600` at maglalabas ang CLI ng isang beses na fallback warning; inilaan para sa sinasadyang headless/container na operasyon. |
| `OMNIROUTE_MCP_ENFORCE_SCOPES` | `false` | `open-sse/mcp-server/server.ts` | Ipatupad ang scope-based na access control sa mga tawag ng MCP tool. |
| `OMNIROUTE_MCP_SCOPES` | _(lahat)_ | `open-sse/mcp-server/server.ts` | Mga scope na pinaghihiwalay ng kuwit: `admin`, `combos`, `health`, `models`, `routing`, `budget`, `metrics`, `pricing`, `memory`, `skills`. |
| `OMNIROUTE_MCP_COMPRESS_DESCRIPTIONS` | `false` | `open-sse/mcp-server/descriptionCompressor.ts` | I-compress ang mga paglalarawan ng MCP tool bago i-serialize ang manifest. Mga halaga para i-enable: `1`, `true`, `on`. |
| `OMNIROUTE_MCP_DESCRIPTION_COMPRESSION` | `rtk` | `open-sse/mcp-server/descriptionCompressor.ts` | Algorithm/profile ng compression. Mga halaga para i-disable: `0`, `false`, `off`. |
| `OMNIROUTE_MCP_FETCH_TIMEOUT_MS` | `10000` | `open-sse/mcp-server/fetchTimeout.ts` | Abort budget (ms) para sa mga panloob na management read ng MCP-server (health, resilience, combos, quota, usage). |
| `OMNIROUTE_MCP_UPSTREAM_TIMEOUT_MS` | `60000` | `open-sse/mcp-server/fetchTimeout.ts` | Badyet ng abort (ms) para sa mga MCP hop na naghihintay sa isang provider (`route_request`, `web_search`, `web_fetch`). |
| `OMNIROUTE_CORPUS_CACHE_SIZE` | `5` | `src/lib/localCorpus/configured.ts` | Pinakamataas na bilang ng mga local-corpus index instance na naka-cache sa memorya (LRU, isa bawat na-index na root directory). Na-clamp sa minimum na `1`. |
| `MODEL_SYNC_INTERVAL_HOURS` | `6` | `src/shared/services/modelSyncScheduler.ts` | Interval ng pag-sync ng model catalog sa mga oras. |
| `PROVIDER_LIMITS_SYNC_INTERVAL_MINUTES` | `70` | `src/lib/usage/providerLimits.ts` | Interval ng polling ng rate-limit at quota ng provider. |
| `PROVIDER_LIMITS_SYNC_SPACING_MS` | `1500` | `src/lib/usage/providerLimits.ts` | Agwat (ms) sa pagitan ng magkakasunod na OAuth quota fetch sa isang bulk sync; ang mga OAuth connection ay kinukuha isa-isa upang maiwasang i-burst ang isang upstream. Ang `0` ay nag-opt out (magkakasabay). |
| `OMNIROUTE_QUOTA_FETCH_MIN_INTERVAL_MS` | `250` | `open-sse/services/quotaFetchThrottle.ts` | Pinakamababang interval (ms) sa pagitan ng magkakasunod na upstream quota fetch sa per-request na preflight/monitor path; nag-aagwat ng magkakasabay na network call upang ang maraming account sa isang IP ay hindi mag-burst sa upstream. Nakakabit sa Codex (`/wham/usage`), DeepSeek, Bailian (parehong fetch site), OpenCode, at Crof na mga quota fetcher (#6009, #6911). Ang generic na `usage.ts::getUsageForProvider` dispatch path (github/glm/minimax/nanogpt/xai/etc.) ay hindi pa sakop — hiwalay na tinutugunan. Hindi apektado ang mga cache hit. Ang `0` ay nagdi-disable; na-clamp sa `0..60000`. |
| `OMNIROUTE_QUOTA_FETCH_JITTER_MS` | `120` | `open-sse/services/quotaFetchThrottle.ts` | Karagdagang random na agwat bawat request (ms), na sini-sample sa bawat naka-reserve na upstream quota fetch. Default ay 120; na-clamp sa `0..60000`; ang `0` ay nag-aalis lamang ng jitter. Itakda ang `OMNIROUTE_QUOTA_FETCH_MIN_INTERVAL_MS=0` upang i-disable ang buong throttle. Ang jitter ay hindi ginagarantiyahan ang pagpigil sa mga upstream ban. |
| `PROVIDER_LIMITS_POST_USAGE_REFRESH_DELAY_MS` | `5000` | `src/lib/usage/providerLimits.ts` | Delay (ms) bago i-refresh ang mga limit ng provider pagkatapos ng isang tunay na usage event, na nagbibigay sa upstream quota API ng oras upang mai-record ang konsumo. |
| `OMNIROUTE_LOGIN_BROWSER_PATH` | auto-detect | `open-sse/services/adobeFireflyBrowserLogin.ts` | Absolute path papunta sa isang system Chrome o Edge executable na ginagamit para sa interactive na Adobe Firefly sign-in at off-screen na renewal. |
| `ADOBE_FIREFLY_BROWSER_REFRESH` | enabled | `open-sse/services/adobeFireflySession.ts` | Pinapanatiling sariwa ang IMS at browser-risk na estado gamit ang mga account-scoped na Chrome CDP session. Itakda sa `0` upang i-disable ang browser renewal. |
| `ADOBE_FIREFLY_SESSION_DISK` | enabled | `open-sse/services/adobeFireflySession.ts` | Pinapanatili ang mga na-repair na Adobe session sa ilalim ng `DATA_DIR` sa kabila ng mga pag-restart ng proseso. Itakda sa `0` upang panatilihing memory-only ang mga session. |
| `ADOBE_FIREFLY_MIN_SUBMIT_GAP_MS` | `12000` | `open-sse/services/adobeFireflySession.ts` | Pinakamababang agwat sa millisecond sa pagitan ng mga Adobe Firefly generate submission; ang `0` ay nagdi-disable ng agwat. |
| `ADOBE_FIREFLY_BATCH_EXTRA_GAP_MS` | `15000` | `open-sse/services/adobeFireflySession.ts` | Karagdagang panahon ng katahimikan sa millisecond pagkatapos ng bawat ikatlong matagumpay na Adobe submission. |
| `ADOBE_FIREFLY_SUBMIT_BASE_DELAY_MS` | `8000` | `open-sse/services/adobeFireflyClient.ts` | Base na backoff sa millisecond pagkatapos ng mga pansamantalang Adobe 408 na tugon; pinagsasama sa submit spacing sa loob ng hanggang limang pagtatangka. |
| `OMNIROUTE_DISABLE_BACKGROUND_SERVICES` | `false` | `src/instrumentation-node.ts` | I-disable ang lahat ng background na serbisyo (sync, pricing, model refresh). Kapaki-pakinabang para sa CI/test. |
| `OMNIROUTE_HEADLESS` | _(unset)_ | `src/lib/system/headless.ts` | Boot na proxy-engine lamang: nilalaktawan ang mga opsyonal na subsystem, `/dashboard` → 404. Katulad ng `omniroute serve --headless`. Tingnan ang [HEADLESS.md](../guides/HEADLESS.md). |
| `OMNIROUTE_ENABLE_RUNTIME_BACKGROUND_TASKS` | _(walang nakatakda)_ | `src/lib/config/runtimeSettings.ts` | Pilit na paganahin ang mga background task sa ilalim ng automated test detection. Itakda ang `1` para i-override ang test heuristic. |
| `OMNIROUTE_BUDGET_RESET_JOB_INTERVAL_MS` | `600000` | `src/lib/jobs/budgetResetJob.ts` | Dalasan ng pagsusuri ng budget reset (ms). Pinakamababang halaga `10000`. |
| `OMNIROUTE_CONNECTION_RECOVERY_INTERVAL_MS` | `60000` | `src/lib/quota/connectionRecovery.ts` | Dalasan ng proactive na connection-cooldown recovery (ms): muling bina-validate ang mga koneksyon na lumipas na ang transient na `rate_limited_until`, labas sa request hot path. Pinakamababang halaga `5000`. |
| `OMNIROUTE_DISABLE_CONNECTION_RECOVERY` | `false` | `src/lib/quota/connectionRecovery.ts` | I-disable ang proactive na connection-cooldown recovery scheduler (ang lazy recovery sa `getProviderCredentials` ay nananatiling gumagana). |
| `OMNIROUTE_REASONING_CACHE_CLEANUP_INTERVAL_MS` | `1800000` | `src/lib/jobs/reasoningCacheCleanupJob.ts` | Dalasan ng paglilinis ng reasoning cache (ms). Pinakamababang halaga `60000`. |
| `OMNIROUTE_REASONING_MIN_BUDGET` | _walang nakatakda_ (naka-disable) | `open-sse/services/reasoningTokenBuffer.ts` | Opt-in na pinakamababang halaga para sa mga thinking-model output budget: ang `max_tokens` ng caller na nasa `[256, floor)` ay itinataas sa pinakamababang halaga (nililimitahan ng model output cap). Walang nakatakda = ang mga client budget ay hindi kailanman palalakihin (#9507). |
| `OMNIROUTE_REASONING_EFFORT_PROBE_PROVIDERS` | _walang nakatakda_ (naka-disable) | `open-sse/services/learnedReasoningEffortCaps.ts` | Opt-in, comma-separated na mga provider id (o `*`): kapag ang `reasoning_effort` 400/422 ay walang tinukoy na tinatanggap na hanay, mag-retry nang isang beses nang isang tier na mas mababa (hindi kailanman bababa sa `low`) at itala ang tier na iyon lamang kung sinagot ang probe (#14895). |
| `OMNIROUTE_LOG_EXPORT_CRON` | `0 * * * *` | `src/lib/jobs/logExportJob.ts` | Cron expression (UTC) para sa call-log export job na nagda-drain ng bawat naka-enable na log-export destination. Mas mainam ang `*/5 * * * *` kapag nag-e-export ng mga body. |
| `OMNIROUTE_LOG_EXPORT_RUN_TIMEOUT_MS` | `900000` | `src/lib/logExport/childRunner.ts` | Wall-clock timeout ng bawat destination na child sa milliseconds. Ang timeout ay nagtatala ng failure at pinapatay ang proseso nang hindi ina-advance ang hindi pa natatanggap na batch. Ang mga invalid/hindi-positibo/hindi-integer na halaga ay gagamit ng default. |
| `OMNIROUTE_LOG_EXPORT_CHILD_MAX_OLD_SPACE_MB` | `1024` | `src/lib/logExport/childRunner.ts` | Limitasyon ng V8 old-space ng Node export child sa MB (hindi kabuuang RSS). Ang default ay nag-iiwan ng headroom para sa 500 row ng mga capped na artifact na may mga body; ang mga oversized na batch ay maaari pa ring maubos ang child heap. Ang failure ay nagpapayo na bawasan ang batch size o itaas ang limitasyong ito. Ang mga invalid/hindi-positibo/hindi-integer na halaga ay gagamit ng default. Ang mga Bun export ay babalik sa in-process nang walang limitasyong ito. |
| `OMNIROUTE_CONFIG_HOT_RELOAD_MS` | `5000` | `src/lib/config/hotReload.ts` | Polling interval (ms) para sa config hot-reload. Ang mas mababa sa `1000` ay tinatanggihan. |
| `OMNIROUTE_DISABLE_REDIS_AUTH_CACHE` | _(naka-enable)_ | `src/lib/db/apiKeys.ts` | Itakda ang `1` para i-bypass ang Redis-backed na API-key auth cache (pinipilit ang mga DB read). |
| `OMNIROUTE_RTK_TRUST_PROJECT_FILTERS` | `0` | `open-sse/services/compression/engines/rtk/filterLoader.ts` | Pagkatiwalaan ang mga user-managed na RTK project filter rule nang walang mahigpit na signature check. |
| `OMNIROUTE_LITE_MAX_TOOL_LENGTH` | `2000` | `open-sse/services/compression/lite.ts` | Limitasyon sa karakter para sa Lite proactive na tool-result truncation kapag ang `lite.maxToolLength` ay walang nakatakda. Saklaw 256–1000000. Ang setting ng Dashboard ay mananaig sa env na ito. |
| `OMNI_COMPRESSION_WORKERS` | `2` | `open-sse/services/compression/compressionWorkerPool.ts` | Pinakamataas na bilang ng concurrent synchronous na RTK/Caveman workers; ang mga sobrang job ay maghihintay nang FIFO. |
| `OMNI_COMPRESSION_WORKER_TIMEOUT_MS` | `120000` | `open-sse/services/compression/compressionWorkerPool.ts` | Timeout ng bawat job sa milliseconds. Ang mga timed-out na worker ay tinatapos at ang request ay nagfa-fail open nang walang pagbabago. |
| `OMNI_COMPRESSION_WORKER_IDLE_MS` | `60000` | `open-sse/services/compression/compressionWorkerPool.ts` | Idle lifetime sa milliseconds bago itapusin ang isang hindi ginagamit na compression worker. |
| `OMNI_COMPRESSION_WORKER_MAX_OLD_MB` | `1024` | `open-sse/services/compression/compressionWorkerPool.ts` | V8 old-generation heap cap sa MB para sa bawat compression worker, sa lahat ng mode (pinakamababang `128`). Ang job na lalampas dito ay magfa-fail open (hindi naka-compress) sa halip na palaguin ang gateway heap. |
| `COMPRESSION_PIPELINE_BREAKER_ENABLED` | `false` | `open-sse/services/compression/pipelineEngineBreaker.ts` | T02 stacked-pipeline na per-engine circuit-breaker master switch. **Opt-in (default off)** — kapag naka-on, ang engine na paulit-ulit na nag-throw sa iba't ibang request ay nilalaktawan (fail-open) sa loob ng cooldown; off = byte-identical na legacy na gawi. |
| `COMPRESSION_PIPELINE_BREAKER_THRESHOLD` | `3` | `open-sse/services/compression/pipelineEngineBreaker.ts` | Magkakasunod na cross-request na pagkabigo bago magbukas ang breaker ng isang engine. |
| `COMPRESSION_PIPELINE_BREAKER_COOLDOWN_MS` | `30000` | `open-sse/services/compression/pipelineEngineBreaker.ts` | Mga millisecond na nananatiling nilaktawan ang isang nakabukas na engine bago ang isang half-open probe. |
| `COMPRESSION_CCR_RETRIEVAL_RAMP_FACTOR` | `2` | `open-sse/services/compression/engines/ccr/index.ts` | T08/H8 CCR retrieval-feedback ramp: bawat nakaraang retrieval ng isang naka-imbak na block ay itinataas ang epektibong `minChars` nito nang linear (ang madalas ma-retrieve na nilalaman ay mas kaunting nako-compress; `>=3` na retrieval = hindi na kinocompress kailanman). Ang `1` ay nag-di-disable ng ramp (binary skip sa threshold lamang). |
| `COMPRESSION_CCR_DURABLE_STORE` | `true` | `open-sse/services/compression/engines/ccr/index.ts` | CCR durable block store (#9061). Sinusuportahan nito ang in-memory store gamit ang SQLite upang ang isang block ay maka-survive sa LRU eviction, sa TTL, sa isang restart, o sa isang retrieve na napunta sa ibang instance. Itakda ang `false` upang panatilihin ang mga block sa memorya lamang. Ang mga block na lampas 512KB at ang mga cloud runtime ay nananatiling memory-only anuman ang mangyari. |
| `COMPRESSION_PREFIX_FREEZE_ENABLED` | `false` | `open-sse/services/compression/prefixFreeze.ts` | T08/H5 usage-observed na prefix freeze master switch. **Opt-in (default off)** — kapag naka-on, ang isang system prompt na na-obserbahan nang `>=` sa threshold ay itinuturing na isang matatag na cacheable na prefix at pinananatili mula sa compression kahit para sa mga provider na napapalampas ng static cache heuristic (ang freeze ay _nagpapanatili_ lamang, hindi kailanman nagbabago). |
| `COMPRESSION_PREFIX_FREEZE_THRESHOLD` | `3` | `open-sse/services/compression/prefixFreeze.ts` | Mga obserbasyon ng isang system prompt bago ito ituring na isang frozen na matatag na prefix. |
| `OMNIROUTE_BOOTSTRAPPED` | `false` | `src/app/(dashboard)/dashboard/page.tsx` | Itinatakda sa `true` ng bootstrap script pagkatapos ng paunang setup. Kinokontrol ang visibility ng setup wizard. |
| `OMNIROUTE_ALLOW_BODY_PROJECT_OVERRIDE` | `0` | `open-sse/executors/antigravity.ts` | Escape hatch: payagan ang request body na i-override ang Antigravity project field. |
| `ANTIGRAVITY_CREDITS` | `off` | `open-sse/services/antigravityCredits.ts` | Patakaran ng Google One AI credits: ang `off` ay hindi kailanman nag-i-inject ng credits, ang `retry` ay nag-i-inject nang isang beses pagkatapos ng isang kwalipikadong quota 429, at ang `always` ay nag-i-inject sa unang request. |
| `ANTIGRAVITY_ALLOW_SIGNATURE_BYPASS` | `0` | `open-sse/translator/request/openai-to-gemini.ts` | Payagan ang Antigravity request translator na laktawan ang mahigpit nitong CLI request-signature validation kapag tumatanggi ang upstream sa mga tunay na signature (debug/antiquated-CLI mode). Ang hindi-zero na halaga ay nag-e-enable ng bypass. |
| `AGY_TOKEN_FILE` | `~/.gemini/antigravity-cli/antigravity-oauth-token` | `src/app/api/providers/agy-auth/apply-local/route.ts` | I-override ang Antigravity CLI (agy) token-file path para sa auto-detect na lokal na login import. |
### OAuth CLI Bridge (Panloob)
| Variable | Default | Source File | Paglalarawan |
| ------------------- | ------------------- | ------------------------------- | --------------------------------------------- |
| `OMNIROUTE_SERVER` | auto-detect | `src/lib/oauth/config/index.ts` | Server URL para sa CLI↔OmniRoute auth bridge. |
| `OMNIROUTE_TOKEN` | _(hindi nakatakda)_ | `src/lib/oauth/config/index.ts` | Auth token para sa CLI bridge. |
| `OMNIROUTE_USER_ID` | `cli` | `src/lib/oauth/config/index.ts` | User ID para sa mga session ng CLI bridge. |
| `SERVER_URL` | _(hindi nakatakda)_ | `src/lib/oauth/config/index.ts` | Legacy na alias para sa `OMNIROUTE_SERVER`. |
| `CLI_TOKEN` | _(hindi nakatakda)_ | `src/lib/oauth/config/index.ts` | Legacy na alias para sa `OMNIROUTE_TOKEN`. |
| `CLI_USER_ID` | _(hindi nakatakda)_ | `src/lib/oauth/config/index.ts` | Legacy na alias para sa `OMNIROUTE_USER_ID`. |
---
## 11. Mga Kredensyal ng OAuth Provider
Naka-built-in na kredensyal para sa **localhost development**. Para sa mga remote deployment, irehistro ang sariling kredensyal sa bawat developer console ng provider.
| Variable | Tagapagbigay | Mga Tala |
| ------------------------------------------- | ----------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `CLAUDE_OAUTH_CLIENT_ID` | Claude Code (Anthropic) | Pampublikong kliyente — hindi kailangan ng lihim. |
| `CLAUDE_CODE_REDIRECT_URI` | Claude Code | Palitan ang redirect URI. Default: `https://platform.claude.com/oauth/code/callback` |
| `CODEX_OAUTH_CLIENT_ID` | Codex / OpenAI | Pampublikong kliyente. |
| `GEMINI_OAUTH_CLIENT_ID` | Gemini (Google) | Nangangailangan ng katugmang `_SECRET`. |
| `GEMINI_OAUTH_CLIENT_SECRET` | Gemini (Google) | — |
| `KIMI_CODING_OAUTH_CLIENT_ID` | Kimi Coding (Moonshot) | Pampublikong kliyente. |
| `MUSE_CODE_OAUTH_CLIENT_ID` | Muse Code (Meta) | Opsyonal na palitan para sa pampublikong Muse CLI device-flow client id. Iwanang hindi nakatakda upang gamitin ang built-in na pampublikong kliyente. |
| `ANTIGRAVITY_OAUTH_CLIENT_ID` | Antigravity (Google) | Nangangailangan ng katugmang `_SECRET`. |
| `ANTIGRAVITY_OAUTH_CLIENT_SECRET` | Antigravity (Google) | — |
| `GITHUB_OAUTH_CLIENT_ID` | GitHub Copilot | Pampublikong kliyente. |
| `GHE_COPILOT_OAUTH_CLIENT_ID` | GHE Copilot | Opsyonal na palitan para sa OAuth client id ng GitHub Enterprise Copilot. Bumabalik sa pampublikong default ng `GITHUB_OAUTH_CLIENT_ID` kapag hindi nakatakda. |
| `COPILOT_INTEGRATION_ID` | GitHub Copilot | Opsyonal na palitan para sa GitHub Copilot client integration ID na ipinapadala sa mga header na `Copilot-Integration-Id` at `Editor-Plugin-Version`. Nakatakda sa default na `copilot-developer-cli`. |
| `WINDSURF_API_KEY` | Windsurf / Devin (v3.8) | Fallback na API key na ginagamit ng `open-sse/executors/devin-cli.ts` kapag walang kredensyal na nakatakda per koneksyon. Opsyonal. |
| `CLI_DEVIN_BIN` | Devin CLI (v3.8) | Pasadyang landas patungo sa Devin CLI binary (`devin`). Tinutukoy ng `open-sse/executors/devin-cli.ts`. |
| `GITLAB_DUO_OAUTH_CLIENT_ID` | GitLab Duo (v3.8) | OAuth client ID para sa GitLab Duo. Irehistro ang isang app sa `https://gitlab.com/-/profile/applications` gamit ang redirect URI na `/callback` at mga saklaw na `api, read_user, openid, profile, email`. Bumabalik sa `GITLAB_OAUTH_CLIENT_ID`. |
| `GITLAB_DUO_OAUTH_CLIENT_SECRET` | GitLab Duo (v3.8) | OAuth client secret para sa GitLab Duo. Opsyonal — hindi kailangan ng lihim sa PKCE flow. Bumabalik sa `GITLAB_OAUTH_CLIENT_SECRET`. |
| `GITLAB_DUO_BASE_URL` | GitLab Duo (v3.8) | Palitan ang GitLab base URL (self-hosted na GitLab). Default: `https://gitlab.com`. Bumabalik sa `GITLAB_BASE_URL`. |
| `GITLAB_BASE_URL` | GitLab Duo (v3.8) | Legacy fallback para sa `GITLAB_DUO_BASE_URL`. Ginagamit kapag hindi nakatakda ang `_DUO_` variant. |
| `GITLAB_OAUTH_CLIENT_ID` | GitLab Duo (v3.8) | Legacy fallback para sa `GITLAB_DUO_OAUTH_CLIENT_ID` na ginagamit ng `src/lib/oauth/constants/oauth.ts`. |
| `GITLAB_OAUTH_CLIENT_SECRET` | GitLab Duo (v3.8) | Legacy fallback para sa `GITLAB_DUO_OAUTH_CLIENT_SECRET` na ginagamit ng `src/lib/oauth/constants/oauth.ts`. |
| `QODER_OAUTH_CLIENT_SECRET` | Qoder | — |
| `QODER_OAUTH_AUTHORIZE_URL` | Qoder | Itakda para paganahin ang Qoder OAuth. |
| `QODER_OAUTH_TOKEN_URL` | Qoder | — |
| `QODER_OAUTH_USERINFO_URL` | Qoder | — |
| `QODER_OAUTH_CLIENT_ID` | Qoder | — |
| `QODER_PERSONAL_ACCESS_TOKEN` | Qoder | Direktang API key fallback (nilalaktawan ang OAuth). |
| `QODER_CLI_WORKSPACE` | Qoder | Workspace ID para sa Qoder CLI. |
| `OMNIROUTE_QODER_WORKSPACE` | Qoder | Alias ng `QODER_CLI_WORKSPACE`. |
| `QODER_CLI_CONFIG_DIR` | Qoder | I-override ang config dir ng Qoder CLI (hiwalay na PAT session, iniiwasan ang pagsira sa browser login). |
| `QODER_CLI_MAX_CONCURRENCY` | Qoder | Pinakamataas na sabay-sabay na mga pagpapatakbo ng qodercli (mga print spawn o ACP prompt); ang mga sobrang request ay nakapila nang FIFO. Hindi nakatakda (default) = walang limitasyon. |
| `QODER_CLI_QUEUE_TIMEOUT_MS` | Qoder | Tagal ng paghihintay ng isang Qoder request para sa isang qodercli slot (kapag may nakatakdang limitasyon lamang) bago mabigo na may 429 `qodercli_busy` + `Retry-After`. Default `120000`. |
| `QODER_CLI_TRANSPORT` | Qoder | `print` (default) ay nag-spawn ng `qodercli --print` bawat request; `acp` ay nagpapanatili ng isang persistent na proseso ng `qodercli --acp` bawat PAT. |
| `QODER_CLI_ACP_IDLE_TIMEOUT_MS` | Qoder | ACP transport: wakasan ang persistent na proseso ng qodercli pagkatapos ng ganitong tagal ng idle time. Default `600000`. |
| `QODER_CLI_ACP_STARTUP_TIMEOUT_MS` | Qoder | ACP transport: deadline para sa qodercli na masagot ang ACP `initialize`. Default `60000`. |
| `QODER_CLI_ACP_MAX_SESSIONS_PER_PROCESS` | Qoder | ACP transport: i-recycle ang persistent na proseso ng qodercli pagkatapos ng ganito karaming session. Default `500`. |
| `BLACKBOX_WEB_VALIDATED_TOKEN` | Blackbox Web | Frontend `tk` token na ipapadala bilang `validated` sa `/api/chat`. Kinakailangan kapag ipinapatupad ng Blackbox ang token matching; kung hindi, ang OmniRoute ay magfa-fallback sa isang random na UUID. Tingnan ang issue #2252. |
| `VISION_BRIDGE_BASE_URL` | Vision Bridge guardrail | Base URL na tugma sa OpenAI para sa mga tawag sa vision-bridge na hindi Anthropic. Naka-default sa legacy na OpenAI URL env o api.openai.com. Ituro sa `/v1` self-loop ng OmniRoute o sa anumang endpoint na tugma sa OpenAI (Gemini OpenAI-compat, OpenRouter). Issue #2232. Kapag ang URL ay ang sariling `/v1` ng OmniRoute, ang describe na sub-request ay nagpapadala ng `x-omniroute-admission-bypass: internal` at nagpapatunay gamit ang nalutas na self-loop credential (`sk_omniroute` sentinel sa lokal na mode, o `OMNIROUTE_API_KEY` / `ROUTER_API_KEY` — #1350) upang gumana ang mga deployment na may `REQUIRE_API_KEY=true`. |
| `VISION_BRIDGE_API_KEY` | Vision Bridge guardrail | API key para sa URL sa itaas. Ino-override nito ang mga per-provider na OpenAI / Google env var para sa mga tawag sa vision-bridge na hindi Anthropic. Ang mga modelong Anthropic ay nagpapanatili ng kanilang nakatalagang Anthropic key path. Issue #2232. |
| `OMNIROUTE_VISION_BRIDGE_NEGATIVE_CACHE_MS` | Vision Bridge guardrail | Kung gaano katagal naka-cache ang resulta ng routing na "walang magagamit na kandidato", sa ms (default `30000`). Ang mga di-wasto o negatibong halaga ay babalik sa default; ang `0` ay naghihinto sa negative cache. Pinagmulan: `src/lib/guardrails/visionBridgeRouter.ts`. |
> [!WARNING]
>
> 1. Pumunta sa [Google Cloud Console → Mga Kredensyal](https://console.cloud.google.com/apis/credentials)
> 2. Gumawa ng OAuth 2.0 Client ID (uri: "Web application")
> 3. Idagdag ang URL ng iyong server bilang Authorized redirect URI
> 4. Palitan ang mga halaga ng kredensyal sa `.env`.
---
## 12. Mga Override ng User-Agent ng Provider
I-override ang `User-Agent` header na ipinapadala sa bawat upstream provider. Ito ay dynamic na nireresolba sa runtime ng executor base class:
```
process.env[`${PROVIDER_ID}_USER_AGENT`]
```
> **Pinagmulan:** `open-sse/executors/base.ts` → `buildHeaders()`
| Variable | Default na Halaga | Kailan I-update |
| -------------------------------- | --------------------------------------------- | ------------------------------------------------------------------------------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `CLAUDE_USER_AGENT` | `claude-cli/2.1.280 (external, cli)` | Kapag naglabas ang Anthropic ng bagong bersyon ng CLI |
| `CLAUDE_DISABLE_TOOL_NAME_CLOAK` | `false` | `executors/base.ts` + `executors/cliproxyapi.ts` | Itakda sa `1`/`true` upang ipasa nang verbatim ang mga pangalan ng tool ng third-party na harness sa Anthropic sa parehong mga path na patungo sa Anthropic (native OAuth at CLIProxyAPI). Bilang default, deterministic na nag-a-alias ang executor ng mga pangalan ng tool na hindi Claude Code (canonical na mapping ng Claude Code kung mayroon, kung wala ay PascalCase) at binabaliktad ang mga ito sa response sa pamamagitan ng `_toolNameMap`, upang ang mga harness na may mga snake_case na tool ay hindi tinatanggihan bilang mga fingerprinted na third-party client. Para sa debugging lamang. |
| `CODEX_USER_AGENT` | `codex-cli/0.155.0 (Windows 10.0.26200; x64)` | Kapag in-update ng OpenAI ang Codex CLI |
| `CODEX_CLIENT_VERSION` | `0.155.0` | I-override ang bersyon ng Codex client nang hiwalay mula sa buong UA string |
| `GROK_CLI_CLIENT_VERSION` | `1.0.41` | I-override ang `x-grok-client-version` para sa inference, model sync, at device-code OAuth, kasama ang default na User-Agent ng Grok CLI para sa inference at model sync. Tumatanggap ng SemVer na may opsyonal na prerelease/build metadata, hanggang 128 character matapos tanggalin ang nakapaligid na whitespace. Ang mga hindi nakatakda, walang laman, hindi wasto, o may line-break na halaga ay gagamit ng kasamang pin. Ang umiiral na buong override ng User-Agent ng inference ay nananatiling may prayoridad. |
| `CLAUDE_CODE_CLIENT_VERSION` | `2.1.280` | I-override ang ina-advertise na bersyon ng Claude Code nang hiwalay mula sa `CLAUDE_USER_AGENT`. Kinokontrol ng Anthropic ang access sa ilang modelo batay sa halagang ito (#12417). |
| `CLAUDE_CODE_CLIENT_BUILD_REVISION` | `1e2` | I-override ang 3-character na suffix na idinadagdag ng OmniRoute sa `cc_version=` sa Claude billing block. I-bump kasabay ng `CLAUDE_CODE_CLIENT_VERSION` — ang pag-pin lamang sa bersyon ay nag-a-advertise ng `version.revision` na pares na walang tunay na binary na naglalabas nito. |
| `GITHUB_COPILOT_CLI_VERSION` | `1.0.91` | I-override ang ina-advertise na bersyon ng Copilot CLI nang hiwalay mula sa `GITHUB_USER_AGENT` |
| `GITHUB_USER_AGENT` | `GitHubCopilotChat/0.54.0` | Kapag nag-update ang GitHub Copilot Chat |
| `ANTIGRAVITY_USER_AGENT` | `antigravity/2.0.1 darwin/arm64` | Kapag nag-update ang Antigravity IDE |
| `KIRO_USER_AGENT` | `AWS-SDK-JS/3.0.0 kiro-ide/1.0.0` | Kapag nag-update ang Kiro IDE |
| `KIRO_OAUTH_CLIENT_ID` | `kiro-cli` | I-override ang `clientId` ng Kiro social device-code (pampublikong id) |
| `KIRO_VERIFY_FULL_CRC` | `false` | Opt-in: buong per-frame na pag-validate ng CRC ng mensahe sa Kiro event stream (i-debug ang mga sirang stream) |
| `KIRO_CREDIT_PRICE_USD` | `0.02` | USD bawat Kiro credit; kino-convert ang mga `meteringEvent` credit sa eksaktong gastos bawat request |
| `KIRO_REQUIRE_CREDITS` | `false` | Ibigay na failed ang isang Kiro response na walang iniulat na credit metering sa halip na i-record ito bilang hindi siningil |
| `QODER_USER_AGENT` | `Qoder-Cli` | Kapag nag-update ang Qoder CLI |
| `CURSOR_USER_AGENT` | `Cursor/3.3` | Kapag nag-update ang Cursor |
> [!TIP]
> Maaari kang magdagdag ng mga override ng User-Agent para sa **anumang** provider gamit ang pattern na `{PROVIDER_ID}_USER_AGENT`. Dynamic na binubuo ng executor ang pangalan ng env var.
---
## 13. Pagkakatugma ng CLI Fingerprint
Kapag pinagana, muling inaayos ng OmniRoute ang mga HTTP header at field ng JSON body upang tumugma sa eksaktong signature ng mga opisyal na CLI tool. Binabawasan nito ang panganib na ma-flag ang account habang pinananatili ang iyong proxy IP.
**Pinagmulan:** `open-sse/config/cliFingerprints.ts`, `open-sse/executors/base.ts`
### Bawat Provider
| Variable | Pag-activate | Epekto |
| ------------------------ | ------------ | --------------------------------------------------- |
| `CLI_COMPAT_CODEX` | `=1` | Ginagaya ang signature ng request ng Codex CLI |
| `CLI_COMPAT_CLAUDE` | `=1` | Ginagaya ang signature ng request ng Claude Code |
| `CLI_COMPAT_GITHUB` | `=1` | Ginagaya ang signature ng request ng GitHub Copilot |
| `CLI_COMPAT_ANTIGRAVITY` | `=1` | Ginagaya ang signature ng request ng Antigravity |
| `CLI_COMPAT_CURSOR` | `=1` | Ginagaya ang signature ng request ng Cursor |
| `CLI_COMPAT_KIMI_CODING` | `=1` | Ginagaya ang signature ng request ng Kimi Coding |
| `CLI_COMPAT_KILOCODE` | `=1` | Ginagaya ang signature ng request ng Kilo Code |
| `CLI_COMPAT_CLINE` | `=1` | Ginagaya ang signature ng request ng Cline |
### Pangkalahatan
| Variable | Pag-activate | Epekto |
| ---------------- | ------------ | --------------------------------------------------------------------------------------- |
| `CLI_COMPAT_ALL` | `=1` | Paganahin nang sabay-sabay ang fingerprint compatibility para sa **lahat** ng provider. |
### Mga override sa pagkakakilanlan ng Kimi Coding CLI
| Variable | Default | Source File | Paglalarawan |
| ----------------------- | -------------------- | ---------------------------------------- | ------------------------------------------------------------------------- |
| `KIMI_CLI_VERSION` | `1.36.0` | `src/lib/oauth/providers/kimi-coding.ts` | I-override ang bersyon ng Kimi CLI na ipinapadala sa mga OAuth/API call. |
| `KIMI_CODING_DEVICE_ID` | _(nakuhang default)_ | `src/lib/oauth/providers/kimi-coding.ts` | I-override ang nakuhang Kimi device ID na ginagamit sa mga client header. |
> [!NOTE]
> Gumagana ang feature na ito kasabay ng mga User-Agent override (§12). Pinangangasiwaan ng fingerprint system ang pagkakasunod-sunod ng mga header at field ng body, habang pinangangasiwaan ng mga User-Agent override ang partikular na UA string. Maaaring paganahin ang dalawa nang magkahiwalay.
---
## 14. Mga Provider ng API Key
Mga API key para sa mga provider na gumagamit ng direktang authentication. **Inirerekomendang pag-set up:** Dashboard → Providers → Add API Key.
Alternatibo ang pagtatakda sa pamamagitan ng mga environment variable para sa mga Docker o headless deployment.
Kinikilalang pattern: `{PROVIDER_ID}_API_KEY`
| Variable | Provider |
| ------------------ | ------------------------------------------------------- |
| `DEEPSEEK_API_KEY` | DeepSeek |
| `NVIDIA_API_KEY` | NVIDIA NIM |
| `JINA_AI_API_KEY` | Jina AI (Foundation API + Reader fallback) |
| `JINA_API_KEY` | Jina AI (alias para sa `JINA_AI_API_KEY`) |
| `GEMINI_API_KEY` | Gemini (Google AI Studio) embeddings + fallback ng chat |
| `GOOGLE_API_KEY` | Gemini (alias para sa `GEMINI_API_KEY`) |
> [!NOTE]
> Inalis sa v3.8.0 ang mga static na `${PROVIDER}_API_KEY` entry para sa Groq, xAI, Mistral, Perplexity, Together AI, Fireworks, Cerebras, Cohere, Nebius, at Qianfan dahil hindi na binabasa ng runtime ang mga ito — eksklusibong umaasa ang mga provider na iyon sa Dashboard / `data/provider-credentials.json` / naka-encrypt na DB. Tingnan ang seksyong _Audit: Mga Inalis / Hindi na Ginagamit na Variable_ sa ibaba ng dokumentong ito para sa paraan ng migration.
> [!TIP]
> Ang mga key na itinakda sa pamamagitan ng Dashboard ay iniimbak nang naka-encrypt sa SQLite at inuuna kaysa sa mga environment variable.
>
> **Jina:** Ang `jina-ai/…` embeddings, rerank, classify, segment, at `jina-search` ay **hindi** naniningil sa isang cluster env key kapag may umiiral na dashboard connection na `jina-ai` (o nakabahaging `jina-reader`) — fill-first ang `getProviderCredentials`. Ginagamit lamang ang `JINA_AI_API_KEY` / `JINA_API_KEY` kapag walang magagamit na dashboard key. Itinatala ng mga call log ang env fallback bilang `connection_id=env:JINA_AI_API_KEY`. Hindi kailanman nagsisilbi ang Reader card (`jina-reader`, `r.jina.ai`) sa `/v1/embeddings` o `/v1/rerank`.
>
> **Gemini:** Ginagamit muna ng `gemini/gemini-embedding-2` (alias na `google/gemini-embedding-2`) ang dashboard connection na `gemini`. Ginagamit lamang ang `GEMINI_API_KEY` / `GOOGLE_API_KEY` kapag walang magagamit na dashboard key. Itinatala ng mga call log ang env fallback bilang `connection_id=env:GEMINI_API_KEY`. Gumagamit ang native multimodal traffic ng `x-goog-api-key` laban sa `:embedContent` / `:batchEmbedContents` — ang N OpenAI `input` item ay nagiging N vector.
---
## 15. Mga Setting ng Timeout
Ang lahat ng mga halaga ay nasa **milliseconds**. Sentralisadong resolution sa `src/shared/utils/runtimeTimeouts.ts`.
### Herarkiya ng Timeout
```
REQUEST_TIMEOUT_MS (global na override)
├─→ FETCH_TIMEOUT_MS (mga tawag sa upstream provider, default: 600000)
│ ├─→ FETCH_HEADERS_TIMEOUT_MS (nagmamana mula sa FETCH_TIMEOUT_MS)
│ ├─→ FETCH_BODY_TIMEOUT_MS (nagmamana mula sa FETCH_TIMEOUT_MS)
│ ├─→ TLS_CLIENT_TIMEOUT_MS (nagmamana mula sa FETCH_TIMEOUT_MS)
│ │ └── TLS_FIRST_BYTE_WATCHDOG_MS (independyente, default: 10000)
│ ├── RESPONSES_FIRST_BYTE_TIMEOUT_MS (independyente, default: 15000)
│ ├── OPENCODE_RESPONSES_HEADERS_WAIT_MS (independyente, default: 0 = off, iminumungkahi: 30000)
│ ├── OPENCODE_RESPONSES_HEADERS_WAIT_MAX_ROTATIONS (independyente, default: 2)
│ ├── FETCH_CONNECT_TIMEOUT_MS (independyente, default: 30000)
│ └── FETCH_KEEPALIVE_TIMEOUT_MS (independyente, default: 4000)
├─→ STREAM_IDLE_TIMEOUT_MS (nagmamana mula sa REQUEST_TIMEOUT_MS, default: 600000)
├─→ STREAM_ACTIVE_TIMEOUT_MS (independyente, default: 1260000; ang 0 ay nagdi-disable)
├─→ STREAM_READINESS_TIMEOUT_MS (nagmamana mula sa REQUEST_TIMEOUT_MS, default: 80000)
├─→ STREAM_READINESS_MAX_TIMEOUT_MS (nagca-cap sa mga adaptive na extension ng readiness, default: 180000)
└─→ API_BRIDGE_PROXY_TIMEOUT_MS (nagmamana mula sa REQUEST_TIMEOUT_MS, default: 30000)
├─→ API_BRIDGE_SERVER_REQUEST_TIMEOUT_MS (hinango, default: 300000)
├── API_BRIDGE_SERVER_HEADERS_TIMEOUT_MS (default: 60000)
├── API_BRIDGE_SERVER_KEEPALIVE_TIMEOUT_MS (default: 5000)
└── API_BRIDGE_SERVER_SOCKET_TIMEOUT_MS (default: 0 = naka-disable)
```
| Variable | Default | Paglalarawan |
| ----------------------------------------------- | ----------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `REQUEST_TIMEOUT_MS` | _(walang nakatakda)_ | Pandaigdigang shortcut — ina-override ang parehong mga default ng `FETCH_TIMEOUT_MS` at `STREAM_IDLE_TIMEOUT_MS`. |
| `FETCH_TIMEOUT_MS` | `600000` | Kabuuang timeout ng HTTP request para sa mga tawag sa upstream provider. |
| `STREAM_IDLE_TIMEOUT_MS` | `600000` | Pinakamahabang katahimikan sa pagitan ng mga raw na upstream byte bago mag-abort. Bihirang tumigil nang >90s ang mga extended-thinking na modelo. |
| `STREAM_ACTIVE_TIMEOUT_MS` | `1260000` | Pinakamataas na kabuuang aktibong haba ng buhay ng SSE stream; hindi kailanman nagre-reset sa mga upstream byte at independyente sa `REQUEST_TIMEOUT_MS`. Hinango sa pinakamalaking per-model na `timeoutMs` sa registry (1200000, Codex) dagdagan ng 60000 na margin, kaya ang isang modelong pinahihintulutang gamitin ang buong budget nito ay hindi kailanman pinapatay sa kalagitnaan ng pagsagot. Itakda sa `0` upang i-disable. |
| `OMNIROUTE_SSE_COMMENTS` | _(naka-disable)_ | Kung maaaring maglabas ang OmniRoute ng mga SSE `:` comment line (hal. ang `: keepalive` heartbeat at mga `x-omniroute-*` metadata trailer). Naka-disable bilang default (#10524) dahil ang mga mahigpit na OpenAI-compatible na client ay nag-JSON.parse ng bawat SSE line at nag-crash sa mga `:` comment; hindi apektado ang mga `data:` heartbeat. Itakda ang `on`/`true`/`1`/`yes` upang muling mag-opt in. Ginagamit ng `open-sse/utils/sseHeartbeat.ts`. |
| `SSE_COALESCE_MS` | `0` (naka-off) | Opt-in: pagsamahin ang magkakasunod na `content_block_delta` event ng Claude (parehong block index at delta type) na ipinapadala sa mga Claude client, na nag-flush hindi bababa bawat N ms. Lossless; ang `signature_delta` at mga boundary event ay hindi kailanman pinagsasama. Nalalapat sa bawat delta type maliban kung may naitakdang per-type na variable sa ibaba. Ginagamit ng `open-sse/utils/sseDeltaCoalesce.ts`. |
| `SSE_COALESCE_THINKING_MS` | `0` (naka-off) | Per-type na override ng `SSE_COALESCE_MS` para sa `thinking_delta`. |
| `SSE_COALESCE_TEXT_MS` | `0` (naka-off) | Per-type na override ng `SSE_COALESCE_MS` para sa `text_delta`. |
| `SSE_COALESCE_INPUT_JSON_MS` | `0` (naka-off) | Per-type na override ng `SSE_COALESCE_MS` para sa `input_json_delta`. |
| `SSE_FRAME_COALESCE_MS` | `0` (naka-off) | Opt-in: i-batch ang mga SSE frame na ipinapasa sa loob ng N ms sa iisang write papunta sa client. Ang unang frame at mga terminal frame (`[DONE]`, `message_stop`, `error`, `response.completed`/`failed`/`incomplete`) ay hindi kailanman ipinagpapaliban; kapag naka-on ang batching, sinusukat ng ITL ang mga pagitan ng batch. Ginagamit ng `open-sse/utils/sseOutputSink.ts`. |
| `SSE_STALL_WATCHDOG` | `timer` | Implementasyon ng byte-stall watchdog para sa mga naka-stream na tugon. Muling nag-a-arm ang `timer` ng iisang timer bawat upstream chunk (nagpaputok nang eksakto sa stall budget); pinapanatili ng `interval` ang iisang check bawat stream na may periyodong `clamp(budget/4, 1s, 5s)`, kaya ang isang stall ay nagpaputok sa loob ng budget + periyodo. Ginagamit ng `open-sse/utils/streamStallWatchdog.ts`. |
| `STREAM_READINESS_TIMEOUT_MS` | `80000` | Oras upang matanggap ang unang non-ping SSE event. Nagmamana sa `REQUEST_TIMEOUT_MS` kapag naitakda. |
| `STREAM_READINESS_MAX_TIMEOUT_MS` | `180000` | Pinakamataas na adaptive na first-event readiness window para sa malalaki, maraming tool, o high-reasoning na mga streaming request. |
| `OMNIROUTE_AGENT_GOAL_POLICY_ENABLED` | `true` | Kill-switch para sa `/goal` heuristic. Itakda ang `false`/`0`/`off` upang ganap na i-disable ang detection — ang mga readiness timeout at stream recovery ay hindi kailanman itinataas ng request body/headers, na nagpapagaan ng client-controlled timeout amplification. |
| `OMNIROUTE_AGENT_GOAL_READINESS_MAX_TIMEOUT_MS` | `600000` | Pinakamataas na first-event readiness window para sa mga natukoy na `/goal` agent run o mga request na pinilit gamit ang `x-omniroute-agent-goal`. |
| `OMNIROUTE_AGENT_GOAL_STREAM_RECOVERY` | `true` | Awtomatikong i-enable ang maagang stream recovery para sa mga natukoy na `/goal` agent run. Itakda ang `false`/`0`/`off` upang i-disable ang goal-specific na opt-in. Maaari lamang nitong IDAGDAG ang recovery sa ibabaw ng default ng operator — hindi nito kailanman ina-override ang tahasang opt-out sa `STREAM_RECOVERY_ENABLED`/mga setting ng DB. |
| `OMNIROUTE_CODEX_DROP_NONSTANDARD_EVENTS` | `true` | Inaalis ang mga non-standard na `codex.*` SSE event (hal. `codex.rate_limits`) na sumisira sa `responses.stream()` ng OpenAI SDK na may 502. Naka-ON bilang default (#11014). Itakda ang `0`/`false`/`no`/`off` upang ipasa ang mga ito. |
| `OMNIROUTE_CODEX_APPSERVER_WS` | _(walang nakatakda)_ | Opt-in na transport ng Codex app-server. WebSocket endpoint (`ws://`/`wss://`) ng isang lokal na `codex app-server` sidecar. Kapag naitakda kasama ang isang token, ang mga Codex request ay niruruta sa pamamagitan ng JSON-RPC papunta sa sidecar sa halip na sa HTTP Responses API. Maaari ring itakda bawat koneksyon sa pamamagitan ng `providerSpecificData.codexAppServerUrl`. Ginagamit ng `open-sse/executors/codex/appServerConfig.ts`. |
| `OMNIROUTE_CODEX_APPSERVER_WS_TOKEN` | _(walang nakatakda)_ | Inline capability/bearer token na ipinapakita sa app-server. Per-connection na override: `providerSpecificData.codexAppServerToken`. |
| `OMNIROUTE_CODEX_APPSERVER_WS_TOKEN_FILE` | _(hindi nakatakda)_ | Landas papunta sa isang file na naglalaman ng capability token ng app-server (mula sa `codex app-server --ws-token-file`). Ginagamit kapag hindi nakatakda ang `OMNIROUTE_CODEX_APPSERVER_WS_TOKEN`. Override bawat koneksyon: `providerSpecificData.codexAppServerTokenFile`. |
| `OMNIROUTE_CODEX_APPSERVER_CWD` | `/tmp` | Working directory kung saan tumatakbo ang turn ng app-server. Override bawat koneksyon: `providerSpecificData.codexAppServerCwd`. |
| `OMNIROUTE_CODEX_APPSERVER_APPROVAL` | _(hindi nakatakda)_ | Patakaran ng approval na ipinapasa sa turn ng app-server (hal. `never`, `on-request`). Override bawat koneksyon: `providerSpecificData.codexAppServerApprovalPolicy`. |
| `OMNIROUTE_CODEX_APPSERVER_SANDBOX` | _(hindi nakatakda)_ | Patakaran ng sandbox na ipinapasa sa turn ng app-server (hal. `read-only`, `workspace-write`, `danger-full-access`). Kapag hindi nakatakda, ang executor ay nagde-default sa `workspace-write` (hardened; dating `danger-full-access`). Override bawat koneksyon: `providerSpecificData.codexAppServerSandbox`. |
| `OMNIROUTE_CODEX_APPSERVER_AUTO_APPROVE` | `false` | Awtomatikong i-approve ang sariling mga approval prompt ng app-server (pagpapatakbo ng command/file/permission sa host). Naka-off bilang default — awtomatikong tinatanggihan ang mga prompt; hindi apektado ang mga harness tool call (dumaradaan ang mga ito sa hiwalay na `item/tool/call` passthrough). Tumatanggap ng `true`/`1`/`yes`. Override bawat koneksyon: `providerSpecificData.codexAppServerAutoApprove`. |
| `FETCH_HEADERS_TIMEOUT_MS` | = `FETCH_TIMEOUT_MS` | Oras para matanggap ang mga response header. |
| `OMNIROUTE_FETCH_START_TIMEOUT_CAP_MS` | `110000` | Pinakamataas na paghihintay para sa mga response header sa mga streaming request (ms). Hindi pinagagana ng `0` ang cap na ito; may prayoridad ang tahasang `fetchStartTimeoutCapMs` ng provider. |
| `OMNIROUTE_DIRECT_HEADERS_TIMEOUT_MS` | `30000` (30s) | Pinakamataas na paghihintay sa pagsisimula ng response (ms) para sa bawat direktang tangkang walang proxy. Ang timeout ay muling sumusubok nang isang beses sa bagong socket; itakda ang `0` para i-disable ang hangganan at panatilihin ang dating gawi. |
| `OMNIROUTE_LOCAL_DIRECT_HEADERS_TIMEOUT_MS` | `300000` (5 min) | Floor ng pagsisimula ng response (ms) para sa mga direktang tangkang walang proxy na ang target host ay pribado/LAN/loopback (halimbawa `localhost`, `host.docker.internal`, `192.168.x.x`), upang ang cold start ng katutubong Ollama ay hindi maputol ng 30s na default sa itaas. Kumikilos bilang floor: ang epektibong paghihintay ay ang mas malaki sa halagang ito at ng `OMNIROUTE_DIRECT_HEADERS_TIMEOUT_MS`; inaalis ng `0` o di-wastong halaga ang lokal na floor. Hindi apektado ang mga remote host. |
| `OMNIROUTE_DIRECT_RESPONSE_RETRY_TIMEOUT_MS` | `600000` (10 min) | Kisame (ms) para sa tangkang RETRY sa bagong socket pagkatapos ng timeout ng pooled attempt sa pagsisimula ng response sa itaas (#13703). Nalalapat lamang kapag ang caller ay nakakabit na ng sariling deadline signal (ang resolved na cascade ng connection/model/provider/`FETCH_TIMEOUT_MS`); ang signal na iyon ang tunay na hangganan at unang pumapaso sa inaasahang daan, kaya ito ay mapagbigay na backstop sa halip na patag na cap — kung wala ito, muling ginagamit ng retry ang magkatulad na maikling window ng `OMNIROUTE_DIRECT_HEADERS_TIMEOUT_MS` tulad ng pooled attempt at nag-504 sa mga malulusog na mabagal-TTFB na reasoning model. Hindi kailanman pinapayagan na bumaba sa patag na floor sa itaas; kapag walang ibinibigay na deadline signal ang caller, pinapanatili ng retry ang patag na floor nang walang pagbabago. |
| `FETCH_BODY_TIMEOUT_MS` | = `FETCH_TIMEOUT_MS` | Oras para matanggap ang buong response body. |
| `FETCH_CONNECT_TIMEOUT_MS` | `30000` | Timeout ng pagtatatag ng TCP connection. |
| `FETCH_KEEPALIVE_TIMEOUT_MS` | `4000` | Idle timeout ng keep-alive socket. |
| `TLS_CLIENT_TIMEOUT_MS` | = `FETCH_TIMEOUT_MS` | Timeout ng TLS fingerprint proxy (wreq-js). |
| `TLS_FIRST_BYTE_WATCHDOG_MS` | `10000` | Tinatakda ang hangganan ng time-to-first-byte nang partikular sa body ng wreq-js TLS-fingerprint transport; ang `TLS_CLIENT_TIMEOUT_MS` lamang ay hindi kayang mahuli ang isang natigil na body dahil nagre-resolve ito sa sandaling dumating ang mga header (#12656). Kinakansela ng timeout ang wreq reader at bumabalik sa direct/proxy dispatcher; ang `0` ang nagdi-disable sa watchdog. |
| `RESPONSES_FIRST_BYTE_TIMEOUT_MS` | `15000` | OpenCode executor lamang, at lamang habang naka-on ang feature flag na `OPENCODE_RESPONSES_STALL_ROTATION` (default na naka-off): tinatakda ang hangganan ng paghihintay para sa unang byte ng body ng isang streamed na sagot ng Responses pagkatapos ng mga header nito (#13484). Ang isang Responses stream ay nagbubukas sa `response.created`, kaya ang katahimikan lampas sa window na ito ay isang stall: ang account ay pina-cool down at ang request ay umiikot sa susunod na account nang isang beses; ang ikalawang stall ay mabilis na nabibigo. Ang `0` ang nagdi-disable sa guard kahit naka-on ang flag. |
| `OPENCODE_RESPONSES_HEADERS_WAIT_MS` | `0` (= naka-off) | OpenCode executor lamang: tinatakda ang hangganan ng paghihintay para sa mga upstream response header sa isang streamed na Responses call kapag may isa pang account na magagamit — ang nakapilang request ay humihinto sa paghihintay at lumilipat sa halip na hawakan ang buong headers window. Ang mga streamed na Responses call lamang ang apektado (ang Responses stream ay nagbubukas sa `response.created`, kaya ang katahimikan doon ay isang pila, hindi pagbuo); hindi galaw ang mga chat completion at mga non-streamed call, at ang window ay pinaikli lamang ang epektibong fetch-start ceiling, hindi ito kailanman pinalalampas. Iminumungkahing halaga kapag pinagana: `30000`. Ang `0` ang nagdi-disable. |
| `OPENCODE_RESPONSES_HEADERS_WAIT_MAX_ROTATIONS` | `2` | OpenCode executor lamang: ilang beses bawat request ang maaaring lumipat sa susunod na account ang headers-wait bound sa itaas. Ang huling natitirang account ay laging pinananatili ang buong headers window. |
| `OPENCODE_PARK_AND_RESUME` | `false` | OpenCode executor lamang: i-park ang request nang may heartbeat matapos ang paulit-ulit na pansamantalang mga 429 (o isang sariwang pool-strain marker), pagkatapos ay i-replay ang isang leg na may cap na hanggang 3 magkakasunod na account sa halip na i-fan out ang buong fleet (#13924). Naka-off bilang default: ang bawat 429 ay umiikot sa susunod na account nang eksaktong katulad ng dati. |
| `OPENCODE_PARK_REPLAY_SERVE_SETASIDE` | `false` | OpenCode executor lamang: kapag ang bawat cooldown-ready na account sa park-and-resume replay leg ay itinabi ng proxy-refusal memory, i-serve pa rin ang mga ito sa halip na walang ma-replay (#14851, follow-up sa #14750). Naka-off bilang default: walang laman ang replay leg sa kasong iyon, tulad ng bago ang #14750. |
| `STREAM_READINESS_STALL_RETRY` | `false` | Streaming chat lamang: kapag ang unang upstream body ay nag-stall bago makagawa ng magagamit na event, magbigay ng isang bounded na pangalawang pagtatangka sa pamamagitan ng parehong routing path na may parehong readiness budget at walang penalty sa account. Naka-off bilang default: ang isang nag-stall na unang body ay nagpapabagsak sa request nang walang retry. |
| `OPENCODE_POOL_RESELECT` | `false` | OpenCode executor lamang: matapos ang 429 mula sa isang egress-bucketed na provider sa isang proxy-less na account sa ilalim ng ambient pool context, humingi sa connection pool ng isa pang miyembro para sa susunod na pagtatangka sa halip na i-retry ang parehong egress address. Nag-aayos lamang ng pagkakasunod, hindi kailanman nag-e-exclude: ang isang naubos na pool ay pinananatili ang kasalukuyang behavior. Naka-off bilang default: ang bawat 429 ay umiikot sa susunod na account nang eksaktong katulad ng dati. |
| `OPENCODE_POOL_STRAIN_MARKER_PATH` | _(hindi nakatakda)_ | OpenCode executor lamang: i-override ang path ng pool-strain marker na binabasa bago mag-park (`{since, reason, ttl_s}`, default `/tmp/opencode-pool-strain.json`, #13924). Ang isang sariwang marker ay nag-pa-park nang walang muling pagbibilang; kapag wala ito o luma na, babalik sa burst counter. |
| `API_BRIDGE_PROXY_TIMEOUT_MS` | `30000` | Proxy hop timeout para sa mga `/v1` bridge request. |
| `FIRECRAWL_BASE_URL` | `https://api.firecrawl.dev` | Ituro ang Firecrawl web-fetch executor sa isang self-hosted na instance (opsyonal ang API key kapag off-cloud). |
| `FIRECRAWL_TIMEOUT_MS` | `30000` | Timeout na bawat-request para sa Firecrawl web-fetch executor. |
| `TAVILY_BASE_URL` | _(hindi nakatakda)_ | Base URL para sa Tavily `/usage` quota fetcher (Provider Limits); hindi pinapansin kapag nakaturo ito sa `api.tavily.com`. Kapag hindi nakatakda, babalik sa base URL ng koneksyon. |
| `API_BRIDGE_SERVER_REQUEST_TIMEOUT_MS` | `300000` | Kabuuang server request timeout para sa bridge. |
| `API_BRIDGE_SERVER_HEADERS_TIMEOUT_MS` | `60000` | Oras para ipadala ang mga response header sa pamamagitan ng bridge. |
| `API_BRIDGE_SERVER_KEEPALIVE_TIMEOUT_MS` | `5000` | Bridge keep-alive idle timeout. |
| `API_BRIDGE_SERVER_SOCKET_TIMEOUT_MS` | `0` | Raw socket timeout (0 = naka-disable). |
| `SHUTDOWN_TIMEOUT_MS` | `30000` | Grace period sa SIGTERM/SIGINT bago ang force-exit. |
| `OMNIROUTE_DEFAULT_FETCH_TIMEOUT_MS` | `120000` | Fallback na ginagamit ng `src/shared/utils/fetchTimeout.ts` kapag ang `FETCH_TIMEOUT_MS` ay hindi nakatakda. |
| `OMNIROUTE_PROVIDER_PROBE_TIMEOUT_MS` | `8000` | Timeout (ms) para sa mga preset na `validationRead` at `modelsProbe` sa `src/shared/network/safeOutboundFetch.ts`. Taasan para sa mga mabagal na endpoint (Cerebras, Cloudflare AI, Groq) upang maiwasan ang pag-flap sa pagitan ng active/error sa dashboard. Babalik sa 8000ms para sa mga invalid (<1000) o hindi numerikong halaga. |
| `OMNIROUTE_RELAY_FETCH_TIMEOUT_MS` | `25000` | Fetch timeout na partikular sa relay sa `open-sse/utils/proxyFetch.ts` (#9158). Ang isang nakahang na relay ay dapat mag-fail bago ang client/agent timeout (~30s) upang makita ng mga caller ang isang failure na partikular sa relay sa halip na isang generic na upstream timeout. Naka-cap sa `29000` upang laging mauna itong mag-fire. |
| `OMNIROUTE_RETRY_BACKOFF_MS` | `10` | Nakabahaging retry backoff para sa mga direct/relay/proxy retry-once na path sa `open-sse/utils/proxyFetch.ts` (#9158). `0` = mag-retry kaagad. |
| `OMNIROUTE_CLAUDE_TLS_TIMEOUT_MS` | `60000` | Timeout ng native wreq-js request (`claudeTlsClient.ts`). |
| `OMNIROUTE_CLAUDE_TLS_GRACE_MS` | `10000` | Ganap na JS hard-deadline grace na idinagdag sa itaas ng native timeout. |
| `OMNIROUTE_PPLX_TLS_TIMEOUT_MS` | `30000` | Timeout ng native wreq-js request (`perplexityTlsClient.ts`). |
| `OMNIROUTE_PPLX_TLS_GRACE_MS` | `10000` | Absolutong grace period ng JS hard-deadline na idinaragdag sa ibabaw ng native na timeout. |
| `OMNIROUTE_PPLX_SEARCH_HINT` | `0` (off) | Nagdaragdag ng "You have built-in web search. Answer questions directly using search results." sa system message ng tumatawag (`perplexity-web/protocol.ts`). Naka-off bilang default — naghahanap pa rin naman ang Perplexity, at tumatagas ang pangungusap sa mga tugon bilang meta-commentary para sa mga coding client. Itakda ang `1`/`true`/`yes`/`on` para ibalik. |
| `OMNIROUTE_GROK_TLS_TIMEOUT_MS` | `60000` | Native na timeout ng request ng wreq-js (`grokTlsClient.ts`). |
| `OMNIROUTE_GROK_TLS_GRACE_MS` | `10000` | Absolutong grace period ng JS hard-deadline na idinaragdag sa ibabaw ng native na timeout. |
| `OMNIROUTE_NOTION_TLS_TIMEOUT_MS` | `30000` | Native na timeout ng request ng wreq-js (`notionTlsClient.ts`); itinataas ito ng `notion-web` kada request sa `180000` para sa mahahabang generation. |
| `OMNIROUTE_NOTION_TLS_GRACE_MS` | `10000` | Absolutong grace period ng JS hard-deadline na idinaragdag sa ibabaw ng native na timeout. |
| `OMNIROUTE_BROWSER_POOL` | `on` | Shared na Playwright browser pool para sa browser-backed na web-cookie chat (`browserPool.ts`); itakda ang `off` para i-disable. |
| `OBSCURA_BIN` | `auto-detect` | Landas patungo sa `obscura` binary na ginagamit bilang pangunahing engine ng browser pool at Cloudflare Playground executor (`open-sse/services/obscura.ts`); awtomatikong natutukoy mula sa system PATH kapag hindi nakatakda. |
| `OBSCURA_CDP_ENDPOINT` | _(hindi nakatakda)_ | Ituro sa isang Obscura na tumatakbo na (`http://host:port`) sa halip na mag-spawn ng bago; hindi pagmamay-ari ng module ang prosesong iyon (`open-sse/services/obscura.ts`). |
| `OBSCURA_PORT` | `random free port` | Tiyak na port para sa nai-spawn na `obscura serve`; awtomatikong pinipili ang isang libreng port kapag hindi nakatakda (`open-sse/services/obscura.ts`). |
| `WEB_COOKIE_USE_BROWSER` | `0` | I-opt in ang isang web-cookie chat request sa browser-backed na landas (`browserBackedChat.ts`); `1` para i-enable. |
| `KIMI_WEB_BASE_URL` | `https://www.kimi.ai` | Base URL para sa Kimi Web (internasyonal na kimi.ai Connect-RPC) executor (`kimi-web.ts`); i-override lamang para sa mga mirror/proxy endpoint. |
| `KIMI_WEB_CHAT_URL` | `/apiv2/kimi.gateway.chat.v1.ChatService/Chat` | Buong chat endpoint para sa Kimi Web executor (`kimi-web.ts`). |
| `OMNIROUTE_LOGIN_BROWSER_PATH` | _(awtomatikong natutukoy)_ | Landas patungo sa isang system Chrome/Edge executable para sa Adobe Firefly interactive na browser sign-in (`adobeFireflyBrowserLogin.ts`); ina-override ang awtomatikong pagtukoy kada OS. |
| `OMNIROUTE_STANDALONE_DIR` | _.build/ na standalone output_ | Override sa build-time para sa standalone output directory na ginagamit ng post-build colocation step (`scripts/build/colocate-standalone.mjs`); para sa build tooling, hindi runtime. |
Ang mga pagtatangka ng combo target ay nagmamana ng naresolbang upstream request timeout
(`FETCH_TIMEOUT_MS`, o `REQUEST_TIMEOUT_MS` kapag ito ang nagbibigay ng fetch default).
Itakda ang `targetTimeoutMs` sa isang combo, combo defaults, o provider override lamang para
mapabilis ang combo fallback; ang mga halagang higit sa kasalukuyang upstream timeout ay
tatakpan sa upstream timeout.
Ang `comboTimeoutMs` ay isang hiwalay na wall-clock na badyet ng buong combo sa lahat ng
failover target. Iwanan itong hindi nakatakda o `0` para panatilihin ang walang limitasyong
pag-ulit (may 10-minutong hardcoded na hang-stop sa `comboPredicates.ts` na umaandar pa
rin). Ang isang positibong halaga ay pumapalit sa safety net na iyon para sa combo.
Panatilihing mas mahaba ang `comboTimeoutMs` kaysa sa `targetTimeoutMs` upang may oras pa
ang failover pagkatapos ng isang mabagal na unang target.
### Mga Threshold ng Circuit Breaker
Pag-tuning ng circuit breaker sa antas ng provider. Ang mga default ay sumasalamin sa mga na-scale na halagang ginagamit mula pa v3.6 para sa 500+ na koneksyon.
| Baryable | Default | Pinagmulang File | Paglalarawan |
| ------------------------------------------------------------- | --------- | ------------------------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `OMNIROUTE_CIRCUIT_BREAKER_OAUTH_THRESHOLD` | `8` | `open-sse/config/constants.ts` | Hangganan ng magkakasunod na kabiguan para sa mga OAuth provider bago mag-trip ang breaker. |
| `OMNIROUTE_CIRCUIT_BREAKER_OAUTH_RESET_MS` | `60000` | `open-sse/config/constants.ts` | Window ng pag-reset (ms) para sa breaker ng OAuth provider. |
| `OMNIROUTE_CIRCUIT_BREAKER_API_KEY_THRESHOLD` | `12` | `open-sse/config/constants.ts` | Hangganan ng magkakasunod na kabiguan para sa mga API-key provider. |
| `OMNIROUTE_CIRCUIT_BREAKER_API_KEY_RESET_MS` | `30000` | `open-sse/config/constants.ts` | Window ng pag-reset (ms) para sa breaker ng API-key provider. |
| `OMNIROUTE_CIRCUIT_BREAKER_LOCAL_THRESHOLD` | `2` | `open-sse/config/constants.ts` | Hangganan ng magkakasunod na kabiguan para sa mga lokal na provider (Ollama, LM Studio, ...). |
| `OMNIROUTE_CIRCUIT_BREAKER_LOCAL_RESET_MS` | `15000` | `open-sse/config/constants.ts` | Window ng pag-reset (ms) para sa breaker ng lokal na provider. |
| `OMNIROUTE_PROVIDER_BREAKER_OAUTH_FAILURE_THRESHOLD` | `10` | `open-sse/config/constants.ts` | Provider-level na breaker: mga kabiguan sa loob ng window bago pumasok sa cooldown ang buong OAuth provider. |
| `OMNIROUTE_PROVIDER_BREAKER_OAUTH_FAILURE_WINDOW_MS` | `900000` | `open-sse/config/constants.ts` | Provider-level na breaker: rolling na window ng bilang ng kabiguan (ms) para sa mga OAuth provider. |
| `OMNIROUTE_PROVIDER_BREAKER_OAUTH_COOLDOWN_MS` | `300000` | `open-sse/config/constants.ts` | Provider-level na breaker: cooldown (ms) kapag naabot na ang threshold ng OAuth provider. |
| `OMNIROUTE_PROVIDER_BREAKER_OAUTH_DEGRADATION_THRESHOLD` | `5` | `open-sse/config/constants.ts` | Papasok ang OAuth provider sa DEGRADED sa ganitong dami ng kabiguan. |
| `OMNIROUTE_PROVIDER_BREAKER_OAUTH_MAX_BACKOFF_MULTIPLIER` | `8` | `open-sse/config/constants.ts` | Pinakamataas na escalation multiplier ng resetTimeout para sa OAuth provider. |
| `OMNIROUTE_PROVIDER_BREAKER_OAUTH_BACKOFF_ESCALATION_COUNT` | `2` | `open-sse/config/constants.ts` | Mag-e-escalate ang OAuth provider pagkatapos ng ganitong dami ng open cycles. |
| `OMNIROUTE_PROVIDER_BREAKER_API_KEY_FAILURE_THRESHOLD` | `15` | `open-sse/config/constants.ts` | Provider-level na breaker: mga kabiguan sa loob ng window bago pumasok sa cooldown ang buong API-key provider. |
| `OMNIROUTE_PROVIDER_BREAKER_API_KEY_FAILURE_WINDOW_MS` | `1800000` | `open-sse/config/constants.ts` | Provider-level na breaker: rolling na window ng bilang ng kabiguan (ms) para sa mga API-key provider. |
| `OMNIROUTE_PROVIDER_BREAKER_API_KEY_COOLDOWN_MS` | `600000` | `open-sse/config/constants.ts` | Provider-level na breaker: cooldown (ms) kapag naabot na ang threshold ng API-key provider. |
| `OMNIROUTE_PROVIDER_BREAKER_API_KEY_DEGRADATION_THRESHOLD` | `7` | `open-sse/config/constants.ts` | Papasok ang API-key provider sa DEGRADED sa ganitong dami ng kabiguan. |
| `OMNIROUTE_PROVIDER_BREAKER_API_KEY_MAX_BACKOFF_MULTIPLIER` | `4` | `open-sse/config/constants.ts` | Pinakamataas na escalation multiplier ng resetTimeout para sa API-key provider. |
| `OMNIROUTE_PROVIDER_BREAKER_API_KEY_BACKOFF_ESCALATION_COUNT` | `3` | `open-sse/config/constants.ts` | Mag-e-escalate ang API-key provider pagkatapos ng ganitong dami ng open cycles. |
| `OMNIROUTE_PROVIDER_BREAKER_LOCAL_FAILURE_THRESHOLD` | `2` | `open-sse/config/constants.ts` | Provider-level na breaker: mga kabiguan bago pumasok sa cooldown ang buong lokal na provider. |
| `OMNIROUTE_PROVIDER_BREAKER_LOCAL_FAILURE_WINDOW_MS` | `300000` | `open-sse/config/constants.ts` | Provider-level na breaker: rolling na window ng bilang ng kabiguan (ms) para sa mga lokal na provider. |
| `OMNIROUTE_PROVIDER_BREAKER_LOCAL_COOLDOWN_MS` | `60000` | `open-sse/config/constants.ts` | Provider-level na breaker: cooldown (ms) kapag naabot na ang threshold ng lokal na provider. |
| `OMNIROUTE_API_KEY_COOLDOWN_MS` | `60000` | `open-sse/services/apiKeyRotator.ts` | Cooldown na bawat-key (ms) na inilalapat ng multi-key na API-key rotation kapag ang isang upstream 429 ay walang dalang `Retry-After` (#14573). Ang mga hindi-positibo o hindi-numerikong halaga ay babalik sa default. |
| `PIN_DROP_BACKOFF_LEVEL` | `2` | `open-sse/services/combo.ts` | Lalim ng backoff kung saan itinuturing na pangmatagalang unhealthy ang provider ng isang context-cache pin at ibinababa ang pin para sa failover. |
| `PIN_DROP_GRACE_MS` | `20000` | `open-sse/services/combo.ts` | Anti-flap na window (ms) na nagpaparaya sa mga maikling pansamantalang cooldown bago ibaba ang isang context-cache pin. |
### Mga Senaryo
| Senaryo | Konpigurasyon |
| ----------------------------------------------- | ------------------------------------------------------------------ |
| **Matagalang pag-generate ng code** | `REQUEST_TIMEOUT_MS=900000` (15 minuto) |
| **Takdang kabuuang buhay ng stream** | `STREAM_ACTIVE_TIMEOUT_MS=1260000` (21 minuto) |
| **Mabilis na pagkabigo para sa production API** | `API_BRIDGE_PROXY_TIMEOUT_MS=10000` |
| **Mga extended thinking model** | `STREAM_IDLE_TIMEOUT_MS=300000` (5 minuto sa pagitan ng mga chunk) |
---
## 16. Pag-log
Nagsusulat ang sistema ng pag-log sa stdout at sa mga naka-rotate na log file. Binabasa ang lahat ng configuration mula sa `src/lib/logEnv.ts`.
| Variable | Default | Paglalarawan |
| ----------------------------------------- | -------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `APP_LOG_LEVEL` | `info` | Pinakamababang antas ng log: `debug`, `info`, `warn`, `error`. |
| `APP_LOG_FORMAT` | `text` | Format ng output: `text` (nababasa ng tao) o `json` (nakabalangkas). |
| `APP_LOG_TO_FILE` | `true` | Isulat ang mga log sa file kasabay ng stdout. |
| `APP_LOG_FILE_PATH` | `logs/application/app.log` | Path ng log file (kaugnay ng project root o `DATA_DIR`). |
| `APP_LOG_MAX_FILE_SIZE` | `50M` | Pinakamalaking laki ng file bago ang pag-rotate. Tinatanggap ang: `50M`, `1G`, `512K`, o mga byte lamang. |
| `APP_LOG_RETENTION_DAYS` | `7` | Bilang ng araw na pananatilihin ang mga naka-rotate na application log file. |
| `APP_LOG_MAX_FILES` | `20` | Pinakamaraming backup ng mga naka-rotate na log file. |
| `CALL_LOG_RETENTION_DAYS` | `7` | Bilang ng araw na pananatilihin sa database ang mga entry ng request/call log. |
| `CALL_LOG_MAX_ENTRIES` | `10000` | Pinakamaraming entry ng call log sa in-memory buffer. |
| `CALL_LOGS_TABLE_MAX_ROWS` | `100000` | Pinakamaraming row sa SQLite table na `call_logs` bago mag-prune. |
| `ENABLE_REQUEST_LOGS` | _(hindi nakatakda)_ | Sapilitang i-on o i-off ang detalyadong pag-log ng request, na ino-override ang setting ng dashboard. |
| `MAX_PENDING_REQUEST_AGE_MS` | `3600000` (1 oras) | Pinakamatagal na edad ng mga naulilang aktibong request log entry bago ang in-memory cleanup. |
| `CALL_LOG_PIPELINE_CAPTURE_STREAM_CHUNKS` | `false` | I-store ang mga stream chunk sa mga pipeline artifact kapag `call_log_pipeline_enabled=true`. Opsyonal (`true`) — naka-off bilang default upang makatipid ng espasyo sa disk. |
| `CALL_LOG_PIPELINE_MAX_SIZE_KB` | `512` | Pinakamalaking laki sa KB ng pipeline call log artifact kapag `call_log_pipeline_enabled=true`. |
| `PROXY_LOGS_TABLE_MAX_ROWS` | `100000` | Pinakamaraming row sa SQLite table na `proxy_logs` bago mag-prune. |
| `PROXY_LOG_INCLUDE_IPS` | `false` | Isama ang mga client/egress IP at account prefix sa mga console log na `[ProxyEgress]`. Pinananatili ng mga proxy-log record sa dashboard/database ang kumpletong detalye. |
| `PROXY_LOG_FIRST_CHUNK_TIMING` | `false` | Itakda sa `"true"` o `"1"` upang itala ang `first_chunk_ms` (mula sa pagsisimula ng pagpapadala hanggang sa unang kapaki-pakinabang na body byte) sa mga proxy-log row. Binabalot nito ang bawat upstream body sa isang lazy passthrough stream at ina-update ang row kapag dumating ang byte; naka-off bilang default upang dumaan ang mga response nang hindi binabago. |
| `APP_LOG_ROTATION_CHECK_INTERVAL_MS` | `60000` (1 minuto) | Dalas ng muling pagsuri ng `src/lib/logRotation.ts` sa laki ng aktibong log file. |
| `CHAT_LOG_TEXT_LIMIT` | `65536` | Pinakamahabang string na pananatilihin sa mga chat log artifact (default na 64 KB). |
| `CHAT_LOG_ARRAY_TAIL_ITEMS` | `128` | Bilang ng mga array item na pananatilihin mula sa hulihan kapag tina-truncate ang mga chat log payload. |
| `CHAT_LOG_MAX_DEPTH` | `6` | Pinakamalalim na antas ng nesting bago i-truncate ang mga chat log payload. |
| `CHAT_LOG_MAX_OBJECT_KEYS` | `80` | Pinakamaraming object key na pananatilihin sa mga chat log payload (0 = walang limitasyon). |
| `CHAT_LOG_MAX_BODY_KB` | `1024` | Laki ng buong request/response body (KB) bago ito palitan ng payak na buod sa halip na buong clone. Taasan ito kung nagpapakita ang mahahabang agentic na pag-uusap ng placeholder sa halip na mga aktuwal na mensahe sa dashboard. |
| `CHAT_DEBUG_FILE` | `false` | Kapag true, nilalaktawan ng `serializeArtifactForStorage` ang truncation batay sa laki. Para lamang sa pag-debug. |
---
## 17. Pag-optimize ng Memorya
| Variable | Default | Paglalarawan |
| ----------------------------- | ------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `OMNIROUTE_MEMORY_MB` | _auto_ (bare metal); **`1024` sa Docker image** | **Inirerekomendang** limitasyon ng V8 heap (MB) para sa Docker/standalone. Kapag hindi nakatakda, kinakalibrate nang dynamic (~35% ng system RAM, na-clamp sa `[512, 4096]`); ang `512` ay floor lang kapag hindi mabasa ang kabuuang memorya. Sa `run-standalone.mjs` (Docker CMD), ang **explicit** na halaga ay idinaragdag bilang `--max-old-space-size` at **nananalo** laban sa salungatang NODE_OPTIONS heap flag (V8 last-flag). Ang `omniroute serve` ay mas prayoridad pa rin sa umiiral na NODE_OPTIONS heap (#5238). Huwag itakda ang pareho sa magkaibang numero — magla-log ang proseso ng warn na binabanggit ang dalawang halaga at ang panalo. **Laging nagtatakda ang opisyal na Docker image ng `1024`, kaya hindi kailanman tumatakbo ang kalibrasyon doon.** Ang coding-agent `/v1/responses` ay nangangailangan ng `8192`–`12288` dagdag pa ang cgroup headroom — tingnan ang [Gabay sa Docker — runtime RAM](../guides/DOCKER_GUIDE.md#runtime-ram-for-coding-agents). |
| `OMNIROUTE_RSS_PRESSURE_MB` | _auto_ (`max(3072, 2 × OMNIROUTE_MEMORY_MB)`; naka-off kapag hindi nakatakda ang `OMNIROUTE_MEMORY_MB`) | `open-sse/utils/resourcePressure.ts` | Absolutong fuse ng process-RSS (MB) para sa native/external na memorya na hindi nakikita ng V8 `heapUsed`; kapag lumampas dito, ang mga bagong request ay makakatanggap ng 503 `resource_pressure`. Bihirang bumaba ang RSS matapos ang spike, kaya ipares ito sa `OMNIROUTE_PRESSURE_SELF_RESTART`. |
| `PROMPT_CACHE_MAX_SIZE` | `50` | Maximum na mga naka-cache na system prompt entry. |
| `PROMPT_CACHE_MAX_BYTES` | `2097152` (2 MB) | Maximum na kabuuang laki ng prompt cache. |
| `PROMPT_CACHE_TTL_MS` | `300000` (5 min) | TTL ng prompt cache entry. |
| `SEMANTIC_CACHE_MAX_SIZE` | `100` | Maximum na mga naka-cache na temperature=0 na tugon. |
| `SEMANTIC_CACHE_MAX_BYTES` | `4194304` (4 MB) | Maximum na kabuuang laki ng semantic cache. |
| `SEMANTIC_CACHE_TTL_MS` | `1800000` (30 min) | TTL ng semantic cache entry. |
| `OMNIROUTE_CORPUS_CACHE_SIZE` | `5` | Mga local-corpus root na sabay-sabay na nagpapanatili ng live na in-memory index (`src/lib/localCorpus/configured.ts`). LRU: sa limitasyon, ang index ng pinakabihirang-gamitin na root ay inaalis at muling binubuo sa susunod nitong query. Na-clamp sa minimum na `1`; ang hindi numerikong halaga ay babalik sa default. |
| `STREAM_HISTORY_MAX` | `50` | Maximum na mga kamakailang stream event sa live view buffer ng Dashboard. |
| `CONTEXT_LENGTH_DEFAULT` | _(hindi nakatakda)_ | Pandaigdigang override ng context-length (mga token) para sa bawat provider na walang `CONTEXT_LENGTH_` na variable. Kapag nakatakda, **pinapalitan** nito ang catalog, dashboard override at mga halaga ng registry para sa mga provider na iyon; kapag hindi nakatakda, ginagamit ng OmniRoute ang built-in na chain nito, na ang huling fallback ay `128000`. Tingnan ang [Context length bawat provider](#per-provider-context-length-context_length_provider). |
| `USAGE_TOKEN_BUFFER` | `100` | Karagdagang token headroom na nakareserba kapag sinusubaybayan ang mga usage quota. |
### Context length bawat provider (`CONTEXT_LENGTH_`)
Ang `open-sse/services/contextManager.ts` (`getEnvOverride()` / `resolveTokenLimit()`) ay nagbabasa rin ng
**per-provider** na anyo na ang pangalan ay binubuo mula sa provider ID sa runtime, kaya hindi ito
maililista nang hilera bawat isa sa talahanayan sa itaas o sa `.env.example`.
**Pangalan.** `CONTEXT_LENGTH_`, kung saan ang `` ay ang provider ID na ginawang uppercase, na ang bawat karakter sa labas ng `A-Z` / `0-9` ay pinalitan ng `_`. Ang provider ID ay ang canonical na ID pagkatapos ng alias resolution (ang `provider` na bahagi ng isang `provider/model` string kapag naresolba na ang maikling alias). Ang mga custom na OpenAI- o Anthropic-compatible na node ay gumagamit ng kanilang generated na node ID, kaya ang UUID ay bahagi ng pangalan ng variable. Ang halaga ay isang positibong integer na bilang ng mga token; ang anumang iba pa (walang laman, `0`, negatibo, hindi numero) ay binabalewala at ang resolution ay magpapatuloy sa susunod na hakbang.
| Provider ID | Pangalan ng variable |
| ----------------------------------------------------------- | -------------------------------------------------------------------------- |
| agentrouter | CONTEXT_LENGTH_AGENTROUTER |
| openrouter | CONTEXT_LENGTH_OPENROUTER |
| openai-compatible-chat-0f8e2c1a-5b7d-4e3f-9a6c-2d1b8e4f7a90 | CONTEXT_LENGTH_OPENAI_COMPATIBLE_CHAT_0F8E2C1A_5B7D_4E3F_9A6C_2D1B8E4F7A90 |
**Priyoridad.** Para sa isang pares na `provider/model`, ang unang hakbang na magbibigay ng halaga ang mananalo:
1. `CONTEXT_LENGTH_` para sa provider na iyon.
2. `CONTEXT_LENGTH_DEFAULT` (pandaigdigang override ng environment).
3. Ang window na bawat-modelo: isang naka-persist na context override (itinakda sa dashboard, o awtomatikong na-pin ng discovery reconciler, tingnan ang `CONTEXT_WINDOW_RECONCILE_INTERVAL`), kung hindi, ang naka-sync na halaga ng catalog / models.dev.
4. Ang `defaultContextLength` ng registry ng provider.
5. Mga heuristic batay sa pangalan ng modelo (`claude` 200000, `gemini` 1000000, `gpt` / `o1` / `o3` / `o4` /
`codex` 400000).
6. Mga built-in na default bawat provider, pagkatapos ang `128000`.
Parehong mga hakbang ng environment ay nalalapat sa **buong provider**: bawat modelo ng provider na iyon ay nakakakuha ng parehong limit, at ang mga ito ay nananaig sa mga override bawat-modelo sa dashboard. Kapag isang modelo lang ng provider ang nangangailangan ng ibang window, gumamit na lang ng override bawat-modelo sa dashboard.
**Saklaw.** Ang chain na ito ang nagpapatakbo ng pagsusuri ng context window sa oras ng request (ang `context_length_exceeded` / "Input exceeds context window" na pagtanggi sa `open-sse/handlers/chatCore.ts`), mga badyet ng prompt compression at mga combo context limit. Ang `context_length` na ina-advertise ng `GET /v1/models` ay maaari pa ring magmula sa metadata ng catalog o registry at hindi ginagarantiyahang sumasalamin sa override ng environment.
**Halimbawa.** Isang provider na ang modelo ay tumatanggap ng window na 1,050,000 token habang ang catalog ay nag-uulat ng 128,000:
```dotenv
CONTEXT_LENGTH_AGENTROUTER=1050000
```
I-restart ang server pagkatapos itong baguhin: ang halaga ay binabasa mula sa environment ng proseso ng server.
Sa **desktop app** ang server ay tumatakbo bilang isang child process at hindi nakikita ang system variable na itinakda pagkatapos ilunsad ang app; ilagay ang linya sa `.env` file na ni-lo-load ng app (ang pagkakasunud-sunod ng paghahanap sa
[Gabay sa Electron: Paghahanap ng environment file](../guides/ELECTRON_GUIDE.md#environment-file-lookup)),
pagkatapos ay ganap na isara at i-relaunch ang app.
### Kompresyon
| Variable | Default | Paglalarawan |
| ------------------------------------- | --------------- | --------------------------------------------------------------------------------------------------------------------------------------------- |
| `OMNIROUTE_RTK_TRUST_PROJECT_FILTERS` | hindi nakatakda | Pagkatiwalaan ang `.rtk/filters.json` ng proyekto nang walang hash na `.rtk/trust.json`. Gamitin lamang sa kontroladong lokal na development. |
### Memory Engine (plan 21)
### Gastos sa event-loop ng memorya, mga skill, at token refresh (#10349)
Ang OmniRoute ay isang **iisang proseso ng Node**. Ang pagkuha/pagbawi ng memorya, skills injection, at token refresh ng provider ay tumatakbo sa **parehong event loop** na iyon kasama ng `GET /healthz` at ng dashboard. Hindi ang mga ito ay isang worker thread.
| Trabaho | Code | Default | Kontrol ng operator |
| ---------------------------- | ---------------------------------- | -------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Pagkuha / pagbawi ng memorya | `src/lib/memory/` | Dashboard **memoryEnabled** (default na naka-on) | I-off ang **Settings → Memory**. Walang hiwalay na env kill switch bukod sa pag-disable ng feature sa mga setting. |
| Skills injection | `src/lib/skills/injection.ts` | Dashboard **skillsEnabled** (default na naka-on) | I-off ang **Settings → Memory/Skills** (`skillsEnabled`). Ang mga knob ng sandbox sa ibaba ay naglilimita lamang ng execution kapag naka-on na ang injection. |
| Token refresh | `src/sse/services/tokenRefresh.ts` | Naka-on para sa mga konektadong OAuth/web provider | Idiskonekta ang provider o hayaang manatiling valid ang mga token; walang `TOKEN_REFRESH=0` na env sa ngayon. |
Kung mabagal ang `/healthz` sa isang makinang walang gaanong load, i-disable muna ang memory + skills, pagkatapos suriin ang load ng catalog/compression (#10303, #9685). Ang mga feature na ito ay nagbibigay-daan sa mga `await` na punto ngunit nakikipag-agawan pa rin sa iisang thread.
Mga knob ng embedding layer, vector store at reranking para sa persistent memory subsystem (`src/lib/memory/`).
| Variable | Default | Paglalarawan |
| ------------------------------------ | --------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `MEMORY_EMBEDDING_CACHE_TTL_MS` | `300000` (5 min) | TTL para sa in-memory embedding cache (bawat pirma ng source/model/dim). |
| `MEMORY_EMBEDDING_CACHE_MAX` | `1000` | Pinakamataas na bilang ng LRU entry na iniingatan sa embedding cache. |
| `MEMORY_TRANSFORMERS_MODEL` | `Xenova/all-MiniLM-L6-v2` | HF repo id para sa opt-in na lokal na MiniLM pipeline ng `@huggingface/transformers` (~23 MB int8, ~400 MB RAM). |
| `MEMORY_STATIC_MODEL` | `minishlab/potion-base-8M` | HF repo id para sa static na potion/Model2Vec lookup-table embedder. Dinu-download nang lazy papunta sa cache dir. |
| `MEMORY_STATIC_CACHE_DIR` | `/embeddings` | Direktoryong ginagamit para i-cache ang mga file ng static potion model. Nagde-default sa ilalim ng `DATA_DIR` kapag hindi nakatakda. |
| `HF_HUB_ENDPOINT` | `https://huggingface.co` | I-override ang Hugging Face Hub base URL na ginagamit ng `staticPotion.ts` (hal. mirror endpoint para sa mga air-gapped na setup). |
| `MEMORY_VEC_TOP_K` | `20` | Default na top-K na ginagamit ng `sqlite-vec` brute-force vector search sa loob ng `src/lib/memory/vectorStore.ts`. |
| `MEMORY_RRF_K` | `60` | Reciprocal Rank Fusion constant `k` para sa hybrid na FTS5 + vector retrieval (sqlite-vec recipe). |
| `VECTOR_STORE_DISABLE_VEC` | `false` | Test/diagnostic seam sa `getVectorStore()` (`src/lib/memory/vectorStore.ts`): kapag `true`, pinipilit ang vector store na maging `null` (ginagaya ang isang cloud/WASM environment na walang `sqlite-vec`), na nagpapababa ng memory retrieval sa FTS5 keyword search. Iwanang hindi nakatakda sa production. |
| `NOTION_API_KEY` | _(hindi nakatakda)_ | API key para sa Notion backend (ginagamit ng kilalang backend preset ng `genericBackend.ts`). |
| `NOTION_API_URL` | `https://api.notion.com/v1` | Base URL para sa Notion API (maaaring i-override para sa mga self-hosted na alternatibo sa Notion). |
| `OBSIDIAN_API_KEY` | _(hindi nakatakda)_ | API key para sa Obsidian Vault backend (ginagamit ng kilalang backend preset ng `genericBackend.ts`). |
| `OBSIDIAN_API_URL` | `http://localhost:27123` | Base URL para sa Obsidian Vault API (maaaring i-override para sa remote vault). |
| `MEMORY_TYPED_DECAY_ENABLED` | `false` | TV6 typed memory decay master switch. **Opt-in (default na nakapatay)** — **binubura** ng sweep ang mga nag-decay na memorya. Kapag nakapatay ito, ang `access_count`/`last_accessed_at` ay purong telemetry lamang at walang anumang nabubura kailanman. |
| `MEMORY_TYPED_DECAY_EPISODIC_DAYS` | `30` | TTL (mga araw) pagkatapos nito ay nag-decay ang isang hindi nagagamit na `episodic` na memorya. Ang `0` ay nagiging immune rin ang episodic. Ang mga durable na uri (`factual`/`procedural`/`semantic`) ay laging immune. Ang decay clock ay nagre-rebase sa `last_accessed_at`. |
| `MEMORY_TYPED_DECAY_ACCESS_IMMUNITY` | `3` | Ang isang memoryang na-inject nang `>=` sa ganitong karaming beses ay nagiging immune sa decay anuman ang uri. Ang `0` ay nagdi-disable ng access immunity. |
| `MEMORY_TYPED_DECAY_SWEEP_INTERVAL` | `0` (disabled) | Interval (mga segundo) para sa opsyonal na pana-panahong decay sweep sa `src/lib/memory/typedDecay.ts`. Ang `0`/hindi nakatakda = walang pana-panahong sweep. Dobleng opt-in: nangangailangan din ng `MEMORY_TYPED_DECAY_ENABLED=true`. |
| `OMNIROUTE_STRICT_SYSTEM_PROVIDERS` | _(hindi nakatakda)_ | Mga comma-separated provider id (case-insensitive) na tumatanggap ng `system` message **sa index 0 lamang** (`src/lib/memory/injection.ts`). Para sa mga ito, ang cache-safe na mid-array memory splice ay hindi ligtas sa mga multi-turn na pag-uusap, kaya ang memorya ay pinagsasama/ino-prepend bilang ang nangungunang system message sa halip. Nagde-default sa `xiaomi-mimo`/`mimo` lamang; palawakin para sa mga self-hosted na OpenAI-compatible endpoint (hal. Qwen3.5+/3.6) na ang chat template ay nagpapatupad ng parehong single-leading-system-message constraint. |
### Halimbawa ng Low-RAM na Docker
Ang `128` ay para lamang sa dashboard. Ang mga coding agent sa heap na ito ay nagkakaroon ng `FATAL ERROR` sa mga mahabang `/v1/responses`. Huwag gamitin ang halimbawang ito bilang isang Claude/Codex/Grok gateway.
```bash
OMNIROUTE_MEMORY_MB=128
PROMPT_CACHE_MAX_SIZE=20
PROMPT_CACHE_MAX_BYTES=524288 # 512 KB
SEMANTIC_CACHE_MAX_SIZE=25
SEMANTIC_CACHE_MAX_BYTES=1048576 # 1 MB
STREAM_HISTORY_MAX=10
```
---
## 18. Pag-sync ng Presyo
Awtomatikong pag-synchronize ng datos ng pagpepresyo ng modelo mula sa mga panlabas na source.
| Variable | Default | Source File | Paglalarawan |
| ----------------------- | ------------- | ------------------------ | ----------------------------------------------- |
| `PRICING_SYNC_ENABLED` | `false` | `src/lib/pricingSync.ts` | Opsyonal na pana-panahong pag-sync ng presyo. |
| `PRICING_SYNC_INTERVAL` | `86400` (24h) | `src/lib/pricingSync.ts` | Agwat ng pag-sync sa segundo. |
| `PRICING_SYNC_SOURCES` | `litellm` | `src/lib/pricingSync.ts` | Mga source ng datos na pinaghihiwalay ng kuwit. |
---
## Pag-sync ng Arena ELO
| Variable | Default | Source File | Paglalarawan |
| ---------------------------- | ------------- | ------------------------------------------------------------------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `ARENA_ELO_SYNC_ENABLED` | `true` | `src/shared/constants/featureFlagDefinitions.ts` | Pana-panahong pag-sync ng ELO ng leaderboard ng Arena AI, na maaaring i-configure mula sa Dashboard Feature Flags o i-opt out gamit ang `false`. |
| `MODELS_CATALOG_PREFIX_MODE` | `dual` | `src/shared/constants/featureFlagDefinitions.ts`, `src/app/api/v1/models/catalog.ts` | Anyo ng prefix na ginagamit para sa mga model id sa `GET /v1/models`. Inilalathala ng `dual` ang prefix ng maikling alias at ang canonical na prefix ng provider para sa bawat modelo (backward compatibility — halos dinodoble ang catalog); naglalabas ang `alias` ng isang id bawat modelo; ang `canonical` ay naglalabas lamang ng buong provider-id prefix (ang mga provider na ang alias ay canonical id na rin ay nagpapanatili ng kanilang nag-iisang entry). Maaaring i-override ng mga client ang bawat request gamit ang `?prefix=alias`. Tingnan ang [API_REFERENCE](API_REFERENCE.md#model-id-prefixes-prefix). |
| `ARENA_ELO_SYNC_INTERVAL` | `86400` (24h) | `src/lib/arenaEloSync.ts` | Agwat ng pag-sync sa segundo. |
---
## Provider ng PromptQL Playground (Hindi Opisyal/Eksperimental)
Reverse-engineered na GraphQL session bridge para sa prompt.ql.app (`src/shared/constants/providers/web-cookie.ts`). Opsyonal ang lahat — ang mga default ay tumuturo sa mga pampublikong endpoint ng playground; i-override lamang para sa isang self-hosted/alternatibong deployment ng PromptQL.
| Variable | Default | Source File | Paglalarawan |
| ---------------------------- | ------------------------------------------------------------------ | ----------------------------------------------------------------------- | --------------------------------------------------------------------------- |
| `PROMPTQL_GRAPHQL_ENDPOINT` | `https://data.prompt.ql.app/promptql/playground-v2-hge/v1/graphql` | `open-sse/executors/promptql.ts` | GraphQL endpoint na ginagamit para sa mga operasyon ng chat/session. |
| `PROMPTQL_CREDITS_ENDPOINT` | `https://data.pro.ql.app/v1/graphql` | `open-sse/executors/promptql.ts`, `open-sse/services/usage/promptql.ts` | GraphQL endpoint na ginagamit upang i-query ang balanse/paggamit ng credit. |
| `PROMPTQL_TOKEN_REFRESH_URL` | `https://auth.pro.ql.app/ddn/project/token` | `open-sse/executors/promptql.ts` | Endpoint na ginagamit para sa best-effort na pag-refresh ng token. |
| `PROMPTQL_POLL_TIMEOUT_MS` | `180000` | `open-sse/executors/promptql.ts` | Pinakamahabang oras (ms) ng pag-poll sa `thread_events` bago mag-timeout. |
---
## HyperAgent Web Provider (Hindi Opisyal/Eksperimental)
Na-reverse-engineer na session bridge para sa hyperagent.com (`src/shared/constants/providers/web-cookie.ts`). Opsyonal — nakaturo ang default sa pampublikong endpoint ng billing/paggamit; i-override lamang para sa self-hosted/alternatibong deployment ng HyperAgent.
| Variable | Default | Source File | Paglalarawan |
| ---------------------- | --------------------------------------------------- | --------------------------------------- | --------------------------------------------------------------------------- |
| `HYPERAGENT_USAGE_URL` | `https://hyperagent.com/api/settings/billing/usage` | `open-sse/services/usage/hyperagent.ts` | Endpoint na ginagamit upang kunin ang mga credit block ng billing/paggamit. |
---
## Mga Quota sa Paggamit ng Kilo Code
Pagkuha ng personal na balanseng USD at paggamit ng Kilo Pass para sa provider na Kilo Code. Opsyonal — nakaturo ang default sa pampublikong Kilo API; i-override lamang para sa relay/test fixture. Ginagamit ng authentication ang umiiral na OAuth access token ng koneksyon.
| Variable | Default | Source File | Paglalarawan |
| -------------- | --------------------- | ------------------------------------- | ------------------------------------------------------------------------------------------------ |
| `KILO_API_URL` | `https://api.kilo.ai` | `open-sse/services/usage/kilocode.ts` | Base URL na ginagamit upang kunin ang personal na balanse sa Kilo Code at paggamit ng Kilo Pass. |
---
## Adobe Firefly Web Provider (Hindi Opisyal/Eksperimental)
Pag-refresh ng session na pinapatakbo sa pamamagitan ng browser para sa Adobe Firefly web provider
(`open-sse/services/adobeFireflyBrowserLogin.ts`, `open-sse/services/adobeFireflySession.ts`,
`open-sse/services/adobeFireflyClient.ts`). Opsyonal — iniangkop ang lahat ng default para sa isang normal
na desktop install.
> **Inalis sa #9255.** Ang lumang CDP-attached Chrome runtime (adobeFireflyChromeRuntime.ts) ay
> pinalitan ng isang Playwright browser-login service, at hindi na umiiral ang mga setting nito. Ang mga
> variable na ADOBE_FIREFLY_CHROME_ CDP_PORT / VISIBLE / HEADED / PING / FORCE_RESTART, pati ang
> ADOBE_FIREFLY_LOGIN_WAIT_MS at ADOBE_FIREFLY_FORTER_WAIT_MS, ay hindi binabasa saanman sa
> codebase — walang epekto ang pagtatakda sa mga ito.
| Variable | Default | Source File | Paglalarawan |
| ------------------------------------ | ------------------- | ----------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------- |
| `ADOBE_FIREFLY_CHROME_HEADLESS` | `0` | `open-sse/services/adobeFireflyBrowserLogin.ts` | Itakda sa `1` para sa tunay na headless Chrome (kilalang hindi gumagana para sa pag-generate; para lamang sa pag-debug). |
| `ADOBE_FIREFLY_BROWSER_REFRESH` | `1` | `open-sse/services/adobeFireflySession.ts` | Pag-opt in/out sa maagap na browser warm-up. Hindi pinapagana ng `0` ang maagap na warm-up (nalalapat pa rin ang mid-batch 408 recovery). |
| `ADOBE_FIREFLY_SESSION_DISK` | `1` | `open-sse/services/adobeFireflySession.ts` | Itakda sa `0` upang hindi i-persist sa disk ang session ng Adobe Firefly. |
| `ADOBE_FIREFLY_MIN_SUBMIT_GAP_MS` | _(hindi nakatakda)_ | `open-sse/services/adobeFireflySession.ts` | Minimum na agwat (ms) na ipinapatupad sa pagitan ng magkakasunod na pagsusumite, na nag-o-override sa built-in na default. |
| `ADOBE_FIREFLY_BATCH_EXTRA_GAP_MS` | _(hindi nakatakda)_ | `open-sse/services/adobeFireflySession.ts` | Karagdagang agwat (ms) na idinaragdag pagkatapos ng matagumpay na batch, na nag-o-override sa built-in na default. |
| `ADOBE_FIREFLY_SUBMIT_BASE_DELAY_MS` | _(hindi nakatakda)_ | `open-sse/services/adobeFireflyClient.ts` | Pangunahing pagkaantala (ms) bago magsumite ng generation request, na nag-o-override sa built-in na default. |
---
## 19. Pag-sync ng Modelo (Dev)
| Variable | Default | Source File | Paglalarawan |
| ----------------------------------- | ------------------- | ---------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `MODELS_DEV_SYNC_ENABLED` | _(hindi nakatakda)_ | `src/lib/modelsDevSync.ts` | Tahasang override para sa pag-sync ng presyo ng models.dev. Hindi nakatakda = sundin ang Settings > AI (`modelsDevSyncEnabled`). Ang `0`/`false`/`off`/`no` ay **nangingibabaw sa DB** at nilalaktawan ang parehong pana-panahong pag-sync at mga SQL/JSON scan ng `getModelsDevPricing()` (para sa pagbawi kapag hindi tumutugon ang dashboard sa parehong event loop). Pinipilit ng `1`/`true`/`on`/`yes` na i-on ang pag-sync. Tinatawag pa rin ng pag-save/pag-clear ng presyo ang `backupDbFile("pre-write")`, na walang ginagawa sa ilalim ng 60-minutong throttle o ng `DISABLE_SQLITE_AUTO_BACKUP`. |
| `MODELS_DEV_SYNC_INTERVAL` | `86400` (24h) | `src/lib/modelsDevSync.ts` | Agwat ng pag-sync ng katalogo ng modelo sa panahon ng development, sa mga segundo. |
| `CONTEXT_WINDOW_RECONCILE_INTERVAL` | `86400` (24h) | `src/lib/contextWindowResolver.ts` | Agwat (sa mga segundo) para sa kusang nagtutuwid na reconciler ng context window (5004): itinatakda ang mga window na idineklara ng provider mula sa pagtuklas sa `/models` bilang mga override na `auto:discovery` kapag naiiba ang mga ito sa katalogo. Itakda sa `0` upang i-disable. Muling ginagamit ang naka-sync nang data (walang bagong pag-fetch); hindi kailanman ino-overwrite ang mga `manual` na override. |
---
## 20. Mga Setting na Partikular sa Provider
| Variable | Default | Pinagmulang File | Paglalarawan |
| ---------------------------------------------- | -------------------------------------------- | ---------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `OPENROUTER_CATALOG_TTL_MS` | `86400000` (24h) | `src/lib/catalog/openrouterCatalog.ts` | TTL ng cache ng model catalog ng OpenRouter. |
| `MODEL_CATALOG_INCLUDE_NAMES` | `true` | `src/shared/constants/featureFlagDefinitions.ts` | Isama ang mga display-friendly na `name` field sa mga response ng `/v1/models`. I-disable para sa mga client na nangangailangan ng mga ID lamang. |
| `CATALOG_BUILD_TIMEOUT_MS` | `8000` (8s) | `src/app/api/v1/models/catalogCache.ts` | Hangganan ng paghihintay sa cold-path para sa pinagsamang muling pagbuo ng catalog ng `GET /v1/models` (#12627). Kapag nag-timeout, ang huling kilalang maayos na 200 ang ibinibigay kapag mayroon nito. |
| `OMNIROUTE_SYNCED_CATALOG_STALE_AFTER_MS` | `2592000000` (30 araw) | `src/lib/db/models/activeSyncedCatalog.ts` | Edad kung kailan ang naka-sync na listahan ng model ng isang koneksyon ay hindi na awtoritatibo para sa routing at nag-fail open sa registry (#12849). Ang mga row na hindi kailanman na-timestamp ay itinuturing na stale. |
| `OMNIROUTE_ANALYTICS_CACHE_TTL_MS` | `60000` (60s) | `src/lib/usage/analyticsResponseCache.ts` | Gaano katagal muling ginagamit ang isang mabagal na response ng `GET /api/usage/analytics` para sa parehong query string (#15629). Ang `0` ay nagdi-disable ng cache. |
| `OMNIROUTE_ANALYTICS_CACHE_MIN_COMPUTE_MS` | `1000` (1s) | `src/lib/usage/analyticsResponseCache.ts` | Tanging ang mga analytics response na tumagal nang hindi bababa sa ganito katagal bago mabuuo ang naka-cache, kaya ang mga maliit na instance ay laging nakakakuha ng sariwang data. |
| `OMNIROUTE_CACHE_METRICS_MIN_COMPUTE_MS` | hindi nakatakda (naka-off) | `src/app/api/cache/route.ts` sa pamamagitan ng `src/lib/usage/analyticsResponseCache.ts` | Opt-in (#16361). Kapag nakatakda sa isang non-negatibong integer na N, ang bahaging usage-history ng `GET /api/cache` (mga kabuuan ng prompt-cache + trend) ay ibinibigay mula sa pinagsamahang analytics response cache kapag tumagal ito ng hindi bababa sa N ms bago mabuuo, bawat na-clamp na `trendHours` window, sa loob ng `OMNIROUTE_ANALYTICS_CACHE_TTL_MS` (ang history ay maaaring maantala nang hanggang sa TTL na iyon; ini-invalidate ito ng `DELETE /api/cache`). Ang unset o hindi wastong halaga = binabasa nang live ang history sa bawat request. |
| `NANOBANANA_POLL_TIMEOUT_MS` | `120000` | `open-sse/handlers/imageGeneration.ts` | Pinakamahabang paghihintay para sa mga NanoBanana image generation job. |
| `NANOBANANA_POLL_INTERVAL_MS` | `2500` | `open-sse/handlers/imageGeneration.ts` | Dalas ng polling ng NanoBanana job. |
| `ADOBE_FIREFLY_SUBMIT_BASE_DELAY_MS` | `8000` | `open-sse/services/adobeFireflyUpscale.ts` | Base na delay para sa submit-retry exponential backoff ng Adobe Firefly upscale. |
| `AWS_REGION` | _(hindi nakatakda)_ | `src/lib/providers/validation.ts`, `open-sse/handlers/audioSpeech.ts` | Rehiyon na ginagamit sa pagbuo ng mga AWS Bedrock endpoint (Kiro, audio). |
| `AWS_DEFAULT_REGION` | _(hindi nakatakda)_ | `src/lib/providers/validation.ts`, `open-sse/handlers/audioSpeech.ts` | Fallback kapag hindi nakatakda ang `AWS_REGION`. |
| `CLOUDFLARE_ACCOUNT_ID` | _(hindi nakatakda)_ | `open-sse/executors/cloudflare-ai.ts` | Account ID para sa Cloudflare Workers AI. |
| `CLOUDFLARE_PLAYGROUND_CHROME_PATH` | _(hindi nakatakda)_ | `open-sse/executors/cloudflare-playground.ts` | Buong path ng desktop Chrome binary para sa Cloudflare AI Playground executor, ginagamit kapag hinaharang ng headless fingerprint check ang bundled Chromium ng Playwright. |
| `CODEBUDDY_SYSTEM_PROMPT_MAX_LEN` | ∅ (∞) — _(unset = walang hangganan ng haba)_ | `open-sse/executors/codebuddy/shared.ts` | Opsyonal na hangganan ng haba para sa mga system prompt ng caller na ipinapadala sa CodeBuddy (CN at International). Bilang default, tanging ang prompt na may dalang coding-agent identity marker ang pinapalitan ng isang neutral na prompt (tinatanggihan ng content filter ng Tencent ang mga ito); ang mga mahabang prompt ay pinananatili. Ang isang integer > 0 ay nagpapalit din ng anumang system prompt na mas mahaba sa ganitong dami ng mga character; ang unset, `0` o isang non-integer na halaga ay nagdi-disable ng cap. Ang bawat pagpapalit ay naglo-log kung aling panuntunan ang nag-fire (identity marker o haba). |
| `CLOUDFLARE_API_BASE` | `https://api.cloudflare.com/client/v4` | `src/app/api/settings/proxy/cloudflare-deploy/route.ts` | I-override ang Cloudflare REST API base na ginagamit ng proxy-pool Workers relay deployer (#4640 / 9router#1360). |
| `NEXT_PUBLIC_CLOUDFLARE_RELAY_DEFAULT_PROJECT` | `omniroute-relay` | `src/app/(dashboard)/dashboard/settings/components/proxy/CloudflareRelayModal.tsx` | Default na pangalan ng worker project na iminumungkahi sa "Deploy Relay" modal ng proxy-pool. |
| `NEXT_PUBLIC_CLOUDFLARE_RELAY_ENABLED` | `true` | `src/app/(dashboard)/dashboard/settings/components/proxy/ProxyPoolTab.tsx` | Itakda sa `false` upang itago ang opsyon ng Cloudflare Workers relay mula sa Proxy Pool tab. |
| `CLOUDFLARED_BIN` | awtomatikong natutukoy | `src/lib/cloudflaredTunnel.ts` | Custom na path patungo sa `cloudflared` binary. |
| `CLOUDFLARED_PROTOCOL` | `http2` | `src/lib/cloudflaredTunnel.ts` | Protocol ng transport ng tunnel: `http2` (default), `quic`, o `auto`. |
| `CLOUDFLARED_CONFIG` | _(hindi naitakda)_ | `src/lib/cloudflaredTunnel.ts` | Path sa lokal na pinamamahalaang cloudflared `config.yml` (may `tunnel:`, `credentials-file:`, `ingress:`). Kapag naitakda, pinapatakbo ng OmniRoute ang `tunnel --config run` (named tunnel) sa halip na ephemeral quick tunnel. |
| `CLOUDFLARED_HOSTNAME` | _(mula sa config ingress)_ | `src/lib/cloudflaredTunnel.ts` | Override para sa pampublikong hostname ng named tunnel (hal. `ai.example.com`), na iniulat bilang `publicUrl`/`apiUrl`. Kapag hindi naitakda, binabasa ito mula sa unang `ingress` hostname ng config. |
| `DENO_DEPLOY_API_BASE` | `https://api.deno.com/v2` | `src/app/api/settings/proxy/deno-deploy/route.ts` | I-override ang Deno Deploy REST API base na ginagamit ng proxy-pool relay deployer (#4643 / 9router#1437). |
| `NEXT_PUBLIC_DENO_RELAY_DEFAULT_PROJECT` | `omniroute-deno-relay` | `src/app/(dashboard)/dashboard/settings/components/proxy/DenoRelayModal.tsx` | Default na pangalan ng Deno Deploy app na iminumungkahi sa "Deploy Relay" modal ng proxy-pool. |
| `NEXT_PUBLIC_DENO_RELAY_ENABLED` | `true` | `src/app/(dashboard)/dashboard/settings/components/proxy/ProxyPoolTab.tsx` | Itakda sa `false` upang itago ang opsyon ng Deno Deploy relay mula sa Proxy Pool tab. |
| `SEARCH_CACHE_TTL_MS` | `300000` (5 minuto) | `open-sse/services/searchCache.ts` | TTL para sa caching ng response ng search API (Perplexity, Brave, atbp.). |
| `ENABLE_CC_COMPATIBLE_PROVIDER` | `false` | `src/shared/utils/featureFlags.ts` | Ipakita ang eksperimental na CC-compatible provider UI para sa mga relay na para lamang sa Claude Code. |
| `NINEROUTER_HOST` | `127.0.0.1` | `open-sse/executors/ninerouter.ts` | I-override ang host kung saan nakikinig ang naka-embed na instance ng 9router. |
| `NINEROUTER_PORT` | `20130` | `open-sse/executors/ninerouter.ts` | I-override ang port kung saan nakikinig ang naka-embed na instance ng 9router. |
| `EMBED_WS_PROXY_HOST` | `127.0.0.1` | `src/lib/services/embedWsProxy.ts` | Bind host para sa embedded-service WebSocket proxy (loopback lamang bilang default). |
| `EMBED_WS_PROXY_PORT` | `20131` | `src/lib/services/embedWsProxy.ts` | Port para sa embedded-service WebSocket proxy server. |
| `CLIPROXYAPI_HOST` | `127.0.0.1` | `open-sse/executors/cliproxyapi.ts` | CLIProxyAPI bridge host (legacy na integrasyon). |
| `CLIPROXYAPI_PORT` | `5544` | `open-sse/executors/cliproxyapi.ts` | CLIProxyAPI bridge port. |
| `CLIPROXYAPI_API_KEY` | _(walang laman)_ | `open-sse/handlers/chatCore/cliproxyapiCredentials.ts` | Data-plane key fallback kapag wala ang `cliproxyapi_api_key` setting. |
| `CLIPROXYAPI_MANAGEMENT_KEY` | _(walang laman)_ | `src/lib/services/cliproxyAccountHealth.ts` | Management key para sa mga pagbasa ng account-health mula sa panlabas na pinamamahalaang instance ng CLIProxyAPI. |
| `CLIPROXYAPI_CONFIG_DIR` | `~/.cli-proxy-api` | `src/lib/versionManager/processManager.ts` | Direktoryo ng config ng CLIProxyAPI. |
| `CLIPROXY_BIND_HOST` | `127.0.0.1` | `docker-compose.yml` | Host interface kung saan inilalathala ng docker-compose ang `cliproxyapi` sidecar (#12578). Ang data volume nito ay naglalaman ng mga provider OAuth/API credential at ang naka-pin na image ay walang env-based na data-plane `api-keys` override (isang naka-mount na `config.yaml` lamang), kaya ang `0.0.0.0` ay naglalantad ng isang serbisyong may kredensyal sa buong LAN. |
| `MUX_SERVICE_PORT` | `8322` | `src/lib/services/bootstrap.ts` | I-override ang port kung saan nakikinig ang naka-embed na Mux (coder/mux) agent-orchestration daemon (palaging 127.0.0.1). |
| `OPENWA_SERVICE_PORT` | `8323` | `src/lib/services/bootstrap.ts` | I-override ang port kung saan nakikinig ang naka-embed na open-wa (WhatsApp Web automation) daemon (palaging 127.0.0.1). |
| `DARIO_HOST` | `127.0.0.1` | `open-sse/executors/dario.ts` | Bind/connect host ng naka-embed na serbisyo ng Dario (loopback lamang bilang default). |
| `DARIO_PORT` | `3456` | `open-sse/executors/dario.ts` | Port ng naka-embed na serbisyo ng Dario. |
| `DARIO_HOST` | `127.0.0.1` | `open-sse/executors/dario.ts` | Bind/connect host ng naka-embed na serbisyo ng Dario (loopback lamang bilang default). |
| `DARIO_PORT` | `3456` | `open-sse/executors/dario.ts` | Port ng naka-embed na serbisyo ng Dario. |
| `LOCAL_HOSTNAMES` | _(walang laman)_ | `open-sse/config/providerRegistry.ts` | Mga karagdagang hostname na pinaghiwalay ng kuwit na itinuturing na "local" (mga pangalan ng Docker service, atbp.). |
Ang `ENABLE_CC_COMPATIBLE_PROVIDER` ay para lamang sa mga third-party relay na tumatanggap
ng mga Claude Code client nang eksklusibo. Muling isinusulat ng OmniRoute ang mga request upang
tanggapin ng mga relay na iyon. Kung gusto mo lamang gamitin ang Claude Code CLI, o hindi ka
sigurado kung ano ang mga relay na ito, panatilihin itong naka-disable at magdagdag na lang ng
karaniwang Anthropic-compatible provider.
---
## 21. Kalusugan ng Proxy
| Variable | Default | Source File | Paglalarawan |
| ------------------------------------------------- | ----------------------------- | ---------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `PROXY_FAST_FAIL_TIMEOUT_MS` | `2000` | `src/lib/proxyHealth.ts` | Timeout ng fast-fail health check. |
| `PROXY_LATENCY_WINDOW_HOURS` | `3` | `src/lib/db/proxies.ts` | Time window (mga oras) para sa pagkalkula ng average latency ng mga kandidatong proxy sa latency-optimized pool strategy. |
| `PROXY_HEALTH_CACHE_TTL_MS` | `30000` | `src/lib/proxyHealth.ts` | TTL ng cache ng resulta ng health check. |
| `PROXY_HEALTH_UNHEALTHY_CACHE_TTL_MS` | `2000` | `src/lib/proxyHealth.ts` | TTL ng cache para sa mga nabigong proxy health probe. Panatilihin itong mas maikli kaysa sa `PROXY_HEALTH_CACHE_TTL_MS` upang ang mga pansamantalang proxy timeout sa ilalim ng mataas na concurrency ay mabilis na mag-retry nang hindi dine-disable ang fast-fail para sa mga proxy na talagang patay na. |
| `PROXY_HEALTH_ENABLED` | `true` | `src/lib/proxyHealth/scheduler.ts` | Itakda sa `false` upang i-disable ang background proxy health scheduler na pana-panahong nagpo-probe sa mga nakarehistrong proxy. |
| `PROXY_HEALTH_INTERVAL_MS` | `600000` | `src/lib/proxyHealth/scheduler.ts` | Interval ng sweep ng background health-scheduler sa ms (minimum na `60000`). |
| `PROXY_HEALTH_RELAY_INTERVAL_MS` | `21600000` | `src/lib/proxyHealth/relayCadence.ts` | Ang interval ng probe sa ms para sa mga edge-relay proxy (`deno`/`vercel`/`cloudflare`), na ang mga probe ay gumigising sa isang sinisingil na serverless isolate (minimum na `60000`). |
| `PROXY_HEALTH_RECOVERY_INTERVAL_MS` | `600000` | `src/lib/proxyHealth/scheduler.ts` | Ang interval ng background recovery-pass sa ms: kung gaano kadalas i-re-probe ang mga dating unhealthy na proxy upang ang isang nakabawing proxy ay makabalik sa rotation nang walang restart. Ang mga halagang mas mababa sa `60000` ay babalik sa default. |
| `PROXY_HEALTH_TEST_URL` | `https://httpbin.org/ip` | `src/lib/proxyHealth/probeTarget.ts` | Ang target ng reachability probe na ginagamit ng scheduler at ng `/api/settings/proxies/auto-test` endpoint. Ituro ito sa isang internal/self-hosted na URL upang maiwasan ang pampublikong default. |
| `PROXY_HEALTH_TEST_CONCURRENCY` | `10` | `src/lib/proxyHealth/probeTarget.ts` | Mga probe na sinisimulan nang sabay-sabay bawat batch, na ibinabahagi ng scheduler at ng `/api/settings/proxies/auto-test` endpoint. Hindi bababa sa 1 at hindi hihigit sa 50. |
| `PROXY_HEALTH_TEST_STAGGER_MS` | `100` | `src/lib/proxyHealth/probeTarget.ts` | Ang pagkaantala sa ms sa pagitan ng dalawang pag-alis ng probe sa loob ng isang batch. Kung wala ito, aalis ang buong batch nang magkakasabay at ang isang shared na egress IP ay maaaring mag-trigger sa isang rate-limited na target. Itakda sa `0` upang i-disable ang pagkakahiwalay; hindi hihigit sa 5000. |
| `PROXY_HEALTH_USE_PROVIDER_TARGET` | `true` | `src/lib/proxyHealth/providerProbeTarget.ts` | Itakda sa "false" upang ihinto ang pag-probe sa tunay na host ng nakatalagang provider ng isang proxy (`GET /models`, walang API key) at laging gamitin ang `PROXY_HEALTH_TEST_URL` sa halip. |
| `PROXY_HEALTH_AUTO_DEACTIVATE` | `false` | `src/lib/proxyHealth/statusPolicy.ts` | Kapag `false` (default), ang mga automated na reachability probe (ang scheduler + ang `/api/settings/proxies/auto-test` na "Test All" na button) ay **read-only** at hindi kailanman nagsusulat ng status ng isang proxy — ang operator lang ang nagtatakda ng active/inactive, kaya ang isang hindi maaasahang probe ay hindi makapag-iiwan ng isang nakatalagang proxy (#6246). Itakda sa `true` upang ibalik ang lumang test-and-set na pag-uugali. |
| `FLUSH_EMPTY_RETRY_ENABLED` | `false` | `src/shared/utils/featureFlags.ts` | Opt-in na feature flag (tingnan ang [FEATURE_FLAGS.md](./FEATURE_FLAGS.md); ang dashboard DB override ang mananaig). Ang `true` (o `1`, `yes`) ay nag-re-retry ng mga walang laman na isinaling streaming turn sa pamamagitan ng normal na credential path (hanggang sa `STREAM_RECOVERY.EMPTY_TURN_RETRY_MAX` na retry) sa halip na ilantad ang isang walang laman na 200 o isang empty-content na 502. |
| `EMPTY_STREAM_SIBLING_RECOVERY_ENABLED` | `false` | `src/shared/utils/featureFlags.ts` | Opt-in na feature flag (tingnan ang [FEATURE_FLAGS.md](./FEATURE_FLAGS.md); ang dashboard DB override ang mananaig). Ang `true` (o `1`, `yes`) ay nag-a-arm ng Claude/Codex empty-stream content probe at gumagamit ng umiiral na bounded retry sa isa pang karapat-dapat na koneksyon pagkatapos ng isang `empty_content` na turn, nang walang cooldown o model lockout. |
| `STREAM_LATE_OUTPUT_PROBE_ENABLED` | `false` | `src/shared/utils/featureFlags.ts` | Opt-in na feature flag (tingnan ang [FEATURE_FLAGS.md](./FEATURE_FLAGS.md); ang dashboard DB override ang mananaig). Ang `true` (o `1`, `yes`) ay patuloy na nagsa-sample ng isang na-forward na chunk sa bawat 16 pagkatapos ng unang 64 upang ang huling nakikitang output ay nagmamarka pa rin sa stream bilang naglabas ng output (ang isang nag-iisang post-output na 5xx ay nananatiling request-scoped sa halip na model-only na lockout). |
| `PROXY_POOL_EGRESS_OBSERVATION` | `false` | `src/shared/utils/featureFlags.ts` | Opt-in na feature flag (tingnan ang [FEATURE_FLAGS.md](./FEATURE_FLAGS.md); ang dashboard DB override ang mananalo). Ang `true` (o `1`, `yes`) ay nagpapakita ng read-only na pool egress observation sa ilalim ng proxy pool sa dashboard (mga natatanging egress IP, mga koneksyon, at ang pinakamadalas na nakita sa likod ng isang IP sa nakaraang 24 na oras, mula sa proxy log). Hindi kailanman ginagamit para sa routing. |
| `PROXY_OPERATOR_EGRESS_ENABLED` | `false` | `src/shared/utils/featureFlags.ts` | Opt-in na feature flag (tingnan ang [FEATURE_FLAGS.md](./FEATURE_FLAGS.md); ang dashboard DB override ang mananalo). Ang `true` (o `1`, `yes`) ay tumatanggap ng mga operator-pushed na may petsang obserbadong address bawat pool member at pinagsasama ang mga ito sa journal read para sa display at pagkakasunud-sunod ng pool. |
| `PROXY_OPERATOR_EGRESS_WINDOW_HOURS` | `24` | `src/lib/db/proxyOperatorEgress.ts` | Observation window sa mga oras para sa mga operator-pushed na egress row (binabasa sa bawat pagbasa; hindi kailangan ng restart). Nakahangganan sa 1..168; ang out-of-range, hindi numero, o walang laman ay babalik sa 24 na may isang process-wide na babala, hindi kailanman magta-throw. |
| `PROXY_AUTO_REMOVE` | `false` | `src/lib/proxyHealth/scheduler.ts` | Itakda sa `true` upang payagan ang scheduler na awtomatikong mag-alis ng mga proxy pagkatapos ng paulit-ulit na magkakasunod na pagkabigo. |
| `PROXY_AUTO_REMOVE_AFTER` | `3` | `src/lib/proxyHealth/scheduler.ts` | Mga magkakasunod na pagkabigo bago awtomatikong alisin ng scheduler ang isang proxy (kapag `PROXY_AUTO_REMOVE=true`). |
| `PROXY_AUTO_DISABLE` | `false` | `src/lib/proxyHealth/scheduler.ts` | Itakda sa `true` upang payagan ang scheduler na mag-soft-disable (status na `dead`, hindi kailanman buburahin) ng isang proxy pagkatapos ng paulit-ulit na magkakasunod na pagkabigo, sa halip na alisin ito. Hindi mapanirang alternatibo sa `PROXY_AUTO_REMOVE`: ang proxy ay kaagad na aalis sa pool/rotation resolution (ang alive-status filter na ginagamit ng scope-pool resolution ay inaalis na ito) at awtomatikong ma-reactivate kapag nagsimula na itong pumasa sa mga probe muli. Ibinabahagi ang threshold ng `PROXY_AUTO_REMOVE_AFTER`. Kung parehong `true` ang mga flag, ang `PROXY_AUTO_REMOVE` ang mananalo. |
| `PROXY_HEALTH_PASSIVE_SKIP` | `false` | `src/lib/proxyHealth/scheduler.ts` | Opt-in na passive skip: kapag `true`, nilalaktawan ng scheduler ang live probe para sa isang endpoint na ang kamakailang production traffic ay sapat nang patunay nito (may kahit isang tagumpay at walang naiugnay na proxy failure sa window, eksaktong isang provider ang naobserbahan). Naka-off bilang default: bawat proxy ay napi-probe. |
| `PROXY_PASSIVE_WINDOW_MS` | `300000` | `src/lib/proxyHealth/passiveVerdict.ts` | Window sa ms ng production traffic na tinitingnan ng passive skip (nakahangganan sa `60000..599999`). Mas maikli kaysa sa 10-minutong sweep interval upang ang kamakailang pagkabigo ang mamayani sa halip na mapalabnaw. |
| `OMNIROUTE_CONTROL_PLANE_PROXY_DIRECT_FALLBACK` | `false` | `src/shared/constants/featureFlagDefinitions.ts` | Payagan ang mga OAuth at provider validation flow na i-bypass ang isang naka-pin na proxy at kumonekta nang direkta kapag nabigo ang mga proxy reachability pre-check. Ang epektibong precedence ay Feature Flags DB override > env var > default. |
| `RATE_LIMIT_MAX_WAIT_MS` | `30000` (30 segundo) | `src/lib/resilience/settings.ts` | Default na budget ng **paghihintay sa pila**: kung gaano katagal maaaring maghintay ang isang request para sa isang provider slot at manatiling nakapila bago ito tanggihan, nang hindi kailanman umaabot sa upstream. Tinatanggal ang timer kapag nagsimula nang mag-execute ang job — ang execution ay hiwalay na binabantayan ng `RATE_LIMIT_EXECUTION_MAX_WAIT_MS`. Ang env ay nagtatakda lamang ng default: ang naka-persist na `resilienceSettings.requestQueue.maxWaitMs`, at pagkatapos ang per-connection na `rateLimitOverrides.maxWaitMs`, ay pawang nananaig dito. |
| `RATE_LIMIT_EXECUTION_MAX_WAIT_MS` | `600000` (10 min) | `open-sse/services/rateLimitManager.ts` | Hangganan kung gaano katagal maaaring manatili sa execution ang isang tinanggap na request bago mag-expire ang rate-limit reservation nito — hiwalay sa budget ng paghihintay sa pila upang ang mabagal na fetch-start sa mga non-incremental na gateway ay hindi mag-time out (#12027). |
| `RATE_LIMIT_MAX_QUEUE_DEPTH` | `0` (naka-disable) | `open-sse/services/rateLimitManager.ts` | Hangganan ng pagtanggap sa pila: tanggihan gamit ang 429 `queue_full` kapag ganito karaming request ang nakapila na. `0` = walang hanggan (default). |
| `RATE_LIMIT_AUTO_ENABLE` | _(hindi itinakda)_ | `open-sse/services/rateLimitManager.ts` | Pilit na i-on/i-off ang auto-enable na safety net ng rate limit anuman ang naka-persist na setting sa Dashboard (`resilienceSettings.requestQueue.autoEnableApiKeyProviders`). Tumatanggap ng `true`/`1`/`on` upang pilit na i-on, `false`/`0`/`off` upang pilit na i-off. Kapag aktibo (default), ang mga aktibong API-key connection ay awtomatikong protektado ng rate limit. Ang pagtatakda ng per-connection na `rateLimitProtection: false` ay nagdi-disable ng tahasang proteksyon ngunit hindi umaalis sa safety net na ito; ang pagtatakda ng env var na ito sa `false` ang pandaigdigang mekanismo upang patakbuhin ang mga API-key connection nang walang mga rate-limit queue. |
| `PROVIDER_COOLDOWN_ENABLED` | _(hindi itinakda → naka-off)_ | `open-sse/services/providerCooldownTracker.ts` | Opt-in na pandaigdigang cross-request na pagsubaybay ng provider/connection cooldown. Naka-OFF bilang default (nag-ooverlap sa Connection Cooldown / Provider Circuit Breaker). Tumatanggap ng `true`/`1`/`on` upang i-enable. |
| `PROVIDER_COOLDOWN_MIN_MS` | `5000` | `open-sse/services/providerCooldownTracker.ts` | Pinakamababang cooldown (ms) bago subukang muli ang isang nabigong provider/connection. Lumalaki nang exponential kasabay ng mga magkakasunod na pagkabigo. Ginagamit lamang kapag `PROVIDER_COOLDOWN_ENABLED`. |
| `PROVIDER_COOLDOWN_MAX_MS` | `300000` (5 min) | `open-sse/services/providerCooldownTracker.ts` | Pinakamataas na hangganan ng cooldown (ms) bago gayunpaman subukang muli ang isang nabigong provider/connection. Ginagamit lamang kapag `PROVIDER_COOLDOWN_ENABLED`. |
| `STREAM_RECOVERY_ENABLED` | _(hindi itinakda → naka-off)_ | `src/lib/resilience/settings.ts` (seed) → `open-sse/services/streamRecovery.ts` (lohika) | **Ano:** transparent na pag-recover ng mga pinutol na upstream stream (port ng free-claude-code). Hini-hold ang panimulang SSE window hanggang `STREAM_RECOVERY.HOLDBACK_MS` (750 ms) upang ang isang _pre-commit_ na pagkaputol — na nagaganap bago pa makarating ang anumang byte sa client — ay muling mabuksan at subukan nang hindi namamalayan. **Kailan i-enable:** mga pabagu-bagong upstream na madalas mag-0-byte-truncate sa simula ng stream; iwanang naka-OFF kung hindi mo kayang tanggapin ang hanggang 750 ms na dagdag na time-to-first-token sa bawat stream. Tumatanggap ng `true`/`1`/`on`. Nagse-seed ng naka-persist na Resilience setting; ang setting sa Dashboard ang mananaig kapag naitakda na. |
| `STREAM_RECOVERY_MIDSTREAM_ENABLED` | _(unset → off)_ | `src/lib/resilience/settings.ts` (seed) → `open-sse/services/streamRecovery.ts` (logic) | **Ano:** pagpapatuloy sa gitna ng stream (Fase 4.4) — pagkatapos ng _post-commit_ na truncation (ang mga byte ay nakarating na sa client), muling hilingin gamit ang partial na teksto bilang assistant prefill at dugtungin ang nawawalang suffix. Mga plain-text na OpenAI-compatible na stream lamang; hindi kailanman tatakbo habang may tool call na nasa flight. **Kailan i-enable:** mga mahabang generation na napuputol sa gitna ng sagot at tinatanggap mo na ang na-recover na buntot ay darating bilang isang burst sa halip na token-by-token. Independyente sa `STREAM_RECOVERY_ENABLED` (ibang risk profile). Tumatanggap ng `true`/`1`/`on`. |
| `STREAM_THROUGHPUT_WATCHDOG_ENABLED` | _(unset → off)_ | `src/lib/resilience/settings.ts` → `open-sse/services/throughputWatchdog.ts` | Opt-in na watchdog ng useful-output ng aktibong stream. Nakakadetect ng mga stream na patuloy na nagpapadala ng mga chunk ngunit nananatiling mababa sa naka-configure na rate ng assistant-output; ang mga heartbeat, usage event, empty delta, at mga yugto ng tool/reasoning ay hindi nagpapanggap bilang progreso. Hiwalay sa idle at hard-deadline na mga timeout. |
| `STREAM_THROUGHPUT_WATCHDOG_WARMUP_MS` | `30000` | `src/lib/resilience/settings/normalize.ts` | Grace period bago ang pagsusuri ng throughput, limitado sa 0–600000 ms. |
| `STREAM_THROUGHPUT_WATCHDOG_WINDOW_MS` | `30000` | `src/lib/resilience/settings/normalize.ts` | Rolling na window ng useful-output, limitado sa 1000–600000 ms; kailangan ng isang kumpletong window bago ang abort. |
| `STREAM_THROUGHPUT_WATCHDOG_MIN_BYTES_PER_SECOND` | `4` | `src/lib/resilience/settings/normalize.ts` | Minimum na rate ng byte ng UTF-8 assistant-output (conservative na proxy ng token), limitado sa 1–1000000. |
| `STREAM_THROUGHPUT_WATCHDOG_MIN_USEFUL_BYTES` | `1` | `src/lib/resilience/settings/normalize.ts` | Minimum na non-zero na sample ng useful-output na itinuturing na nasusukat, limitado sa 1–1000000 byte. |
| `HEALTHCHECK_STAGGER_MS` | `3000` | `src/lib/tokenHealthCheck.ts` | Stagger interval (ms) sa pagitan ng mga healthcheck ng provider token sa startup. |
| `HEALTHCHECK_JITTER_MIN_MS` | `500` | `src/lib/tokenHealthCheck.ts` | Minimum na randomized jitter (ms) na idinadagdag sa ibabaw ng `HEALTHCHECK_STAGGER_MS` sa pagitan ng mga healthcheck ng provider token, upang maiwasan ang bursting (Issue #1220). |
| `HEALTHCHECK_JITTER_MAX_MS` | `5000` | `src/lib/tokenHealthCheck.ts` | Maximum na randomized jitter (ms) na idinadagdag sa ibabaw ng `HEALTHCHECK_STAGGER_MS` sa pagitan ng mga healthcheck ng provider token, upang maiwasan ang bursting (Issue #1220). |
| `HEALTHCHECK_BATCH_SIZE` | `20` | `src/lib/tokenHealthCheck.ts` | Batch size ng concurrent na pagsusuri para sa startup token-healthcheck sweep; ang mas malalaking halaga ay sumusuri ng mas maraming koneksyon nang sabay-sabay, ang mas maliliit na halaga ay nagbabawas ng burst load (Issue #7875, regression ng #7719). |
| `REQUEST_RETRY` | `2` | `src/sse/services/cooldownAwareRetry.ts` | Bilang ng mga awtomatikong retry sa mga model-scoped cooldown na tugon bago ibalik ang error sa client. |
| `MAX_RETRY_INTERVAL_SEC` | `30` | `src/sse/services/cooldownAwareRetry.ts` | Pinakamataas na backoff interval (mga segundo) sa pagitan ng mga cooldown retry. Naka-cap sa value na ito anuman ang upstream na `Retry-After`. |
| `HEADROOM_URL` | `http://localhost:8787` | `src/lib/headroom/detect.ts` | URL ng Headroom token-saver proxy. Ang dashboard lifecycle (`api/headroom/*`) ay nagpo-spawn ng lokal na `headroom-ai` CLI sa loopback bilang default; i-override lamang para ituro sa isang external na Docker sidecar proxy. |
### Mga tuning constant ng stream-recovery
Ang holdback behavior ng recovery ay naka-tune ng mga hardcoded na constant sa
`open-sse/config/constants.ts` (`STREAM_RECOVERY`), na ipinapakita dito bilang
sanggunian — ang pagbabago ng mga ito ay nangangailangan ng pag-edit ng code,
hindi env var:
- `STREAM_RECOVERY.HOLDBACK_MS = 750` — kung gaano katagal hinahawakan ang opening
SSE window para ma-retry ang maagang truncation bago ma-commit ang anumang byte
sa client.
- `STREAM_RECOVERY.BUFFER_MAX_BYTES = 65536` — matigas na cap sa hinahawakang
window; i-commit (flush + passthrough) sa sandaling maipon ang ganito karaming
bytes, anuman ang timer.
- `STREAM_RECOVERY.EARLY_RETRY_MAX = 4` — pinakamataas na transparent na muling
pagbubukas ng upstream stream habang ang holdback ay hindi pa naka-commit.
> **Per-provider sliding-window rate limit (walang env var):** ang FCC-ported na
> per-provider sliding-window rate-limit na _fallback_ ay umiiral sa code
> (`open-sse/services/providerDefaultRateLimit.ts`, nakakabit sa pamamagitan ng
> `open-sse/services/rateLimitManager.ts`) ngunit inilalabas nang may **walang
> laman na default map** at **walang operator env var** ngayon — naka-enable
> lamang ito sa pamamagitan ng test hook / pag-edit ng code. Sinasadyang hindi
> ito nakalista sa talahanayan sa itaas. Ang per-`(token, IP)` relay limiter na
> _may_ knob ay `RELAY_IP_PER_MINUTE` (§3 Network at mga Port).
---
## 22. Pag-debug
> [!CAUTION]
> Lumilikha ang mga variable na ito ng **detalyadong output** at maaaring maglantad ng sensitibong data. **Huwag kailanman i-enable sa production.**
| Variable | Default | Source File | Paglalarawan |
| ------------------------------------- | --------------------------------------------- | ----------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `CURSOR_DEBUG` | _(hindi nakatakda)_ | `open-sse/executors/cursor.ts` | Itakda sa `1` upang i-enable ang mga detalyadong log ng Cursor executor (mga na-decode na SSE chunk, atbp.). |
| `CURSOR_STREAM_DEBUG` | _(hindi nakatakda)_ | `open-sse/executors/cursor.ts` | Alias ng `CURSOR_DEBUG` na backward-compatible. |
| `CURSOR_DUMP_FILE` | _(hindi nakatakda)_ | `open-sse/executors/cursor.ts` | Opsyonal na file path na tatanggap ng mga raw na na-decode na Cursor chunk kapag `CURSOR_DEBUG=1`. |
| `CURSOR_STREAM_TIMEOUT_MS` | `300000` | `open-sse/executors/cursor.ts` | Timeout ng kawalan ng aktibidad ng stream (ms) para sa Cursor executor. |
| `CURSOR_KV_GRACE_MS` | `2000` | `open-sse/executors/cursor.ts` | Palugit (ms) pagkatapos ng isang composer kv_after_text soft terminator kapag may mga byte pang naka-buffer — binibigyan nito ng oras ang kasunod na exec_mcp tool call upang makumpleto ang frame nito. |
| `CURSOR_TOOL_DIRECTIVE` | naka-enable (`!== "0"`) | `open-sse/executors/cursor.ts` | Tool-commit directive na nagsisigurong maaasahang maglalabas ang composer-2.5 ng mga tool call. Itakda sa `0` upang i-disable. |
| `OMNIROUTE_SYSTEM_INSTRUCTION_APPEND` | _(hindi nakatakda)_ | `open-sse/translator/request/claude-to-openai.ts`, `open-sse/translator/response/openai-to-claude.ts` | Teksto ng system prompt na itinakda ng operator at idinaragdag sa system message PAGKATAPOS ng pagsasalin (post-translation injection), na umaabot sa mga path ng codex/Responses at `/v1/messages`. Ginagamit din bilang directive prefix na inaalis mula sa mga na-echo na system preamble block. Huwag itakda upang i-disable. |
| `OMNIROUTE_STRIP_SYSTEM_PREAMBLE` | `0` (naka-off) | `open-sse/translator/response/openai-to-claude.ts`, `open-sse/utils/directivePreambleStripper.ts` | Itakda sa `1` upang alisin ang mga na-echo na system-prompt preamble block mula sa simula ng isang openai→claude stream. Naka-off bilang default — nakabatay sa anyo ng Ingles na prosa ang heuristics at binabago nito ang response payload, kaya mawawala ang naturang seksyon kung lehitimong nagsisimula rito ang isang tugon. |
| `CURSOR_IMAGE_FETCH_TIMEOUT_MS` | `15000` | `open-sse/utils/cursorImages.ts` | Timeout ng pag-fetch sa bawat larawan (ms) para sa remote na `image_url` vision input. |
| `CURSOR_STATE_DB_PATH` | _(sinusuri)_ | `open-sse/utils/cursorVersionDetector.ts` | I-override ang paghahanap sa Cursor IDE state DB na ginagamit para sa pagtukoy ng bersyon ng IDE. |
| `CURSOR_AGENT_CLI_VERSION` | _(tukuyin / i-pin)_ | `open-sse/utils/cursorAgentCliVersion.ts` | Build id ng Agent CLI (`YYYY.MM.DD-`) para sa `x-cursor-client-version: cli-…` sa Agent Run. |
| `CURSOR_AGENT_BIN` | _(hindi nakatakda)_ | `open-sse/handlers/imageGeneration/providers/cursorAgentImage.ts` | Path patungo sa Cursor Agent binary na ginagamit para sa pagbuo ng larawan. Kapag hindi nakatakda, ginagamit ng handler ang `providerSpecificData.agentBin` at pagkatapos ay ang PATH. |
| `CURSOR_IMG_TIMEOUT_MS` | `210000` | `open-sse/handlers/imageGeneration/providers/cursorAgentImage.ts` | Kabuuang oras sa wall clock para sa bawat larawan (ms) para sa mga image job ng Cursor Agent. |
| `CURSOR_IMG_MAX_CONCURRENT` | `2` | `open-sse/handlers/imageGeneration/providers/cursorAgentImage.ts` | Hangganan sa concurrency ng shared seat para sa mga image job ng Cursor. |
| `CURSOR_IMG_MODEL` | request / `auto` | `open-sse/handlers/imageGeneration/providers/cursorAgentImage.ts` | I-override ang `--model` ng Cursor CLI para sa mga image job. |
| `UC_IMAGE_POLL_INTERVAL_MS` | `2000` | `open-sse/handlers/imageGeneration/providers/ucImage.ts` | Dalas ng pag-poll sa resulta ng pagbuo ng larawan ng UC (uncensored.com) (ms). |
| `UC_IMAGE_POLL_TIMEOUT_MS` | `60000` | `open-sse/handlers/imageGeneration/providers/ucImage.ts` | Kabuuang oras sa wall clock ng pag-poll sa resulta ng pagbuo ng larawan ng UC (ms). |
| `UC_VIDEO_POLL_INTERVAL_MS` | `3000` | `open-sse/handlers/videoGeneration/providers/ucVideo.ts` | Dalas ng pag-poll sa resulta ng pagbuo ng video ng UC (uncensored.com) (ms). |
| `UC_VIDEO_POLL_TIMEOUT_MS` | `300000` | `open-sse/handlers/videoGeneration/providers/ucVideo.ts` | Kabuuang oras sa wall clock ng pag-poll sa resulta ng pagbuo ng video ng UC (ms). |
| `CURSOR_DATA_DIR` | _(sinusuri)_ | `open-sse/utils/cursorAgentCliVersion.ts` | I-override ang data dir ng Cursor Agent CLI (`…/versions/`); ito rin ang variable na ginagamit ng opisyal na agent. |
| `CURSOR_TOKEN` | _(hindi nakatakda)_ | `scripts/ad-hoc/cursor-tap.cjs` | Direktang Cursor bearer token na ginagamit ng mga tool ng developer. |
| `OMNIROUTE_LOG_REQUEST_SHAPE` | naka-disable (opt-in sa pamamagitan ng `"1"`) | `src/app/api/v1/chat/completions/route.ts` | I-log ang mga marker ng uri/haba ng content para sa malalaking chat payload kapag nakatakda ang `"1"`. Naka-off bilang default upang bawasan ang ingay sa log. |
| `DEBUG_RESPONSES_SSE_TO_JSON` | _(hindi nakatakda)_ | `open-sse/handlers/responseTranslator.ts` | Itakda sa `true` upang i-log ang mga detalye ng pagsasalin ng Responses API SSE→JSON. |
| `DEBUG_CLAUDE_NONSTREAM` | _(hindi nakatakda)_ | `open-sse/handlers/responseTranslator.ts` | Itakda sa `true` upang ilantad ang mga walang-lamang textContent chunk sa path ng pagsasalin ng tugon ng Claude (para lamang sa pag-debug). |
| `NEXT_PUBLIC_OMNIROUTE_E2E_MODE` | _(hindi nakatakda)_ | E2E test harness | Itakda sa `true` upang i-enable ang E2E test mode (mas maluwag na auth, mga test hook). |
---
## 23. Integrasyon sa GitHub
Payagan ang mga user na direktang mag-ulat ng mga isyu mula sa Dashboard.
| Variable | Default | Source File | Paglalarawan |
| --------------------- | ------------------- | -------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| `GITHUB_ISSUES_REPO` | _(hindi nakatakda)_ | `src/app/api/v1/issues/report/route.ts` | Repository na nasa format na `owner/repo`. |
| `GITHUB_ISSUES_TOKEN` | _(hindi nakatakda)_ | `src/app/api/v1/issues/report/route.ts` | GitHub Personal Access Token na may saklaw na `issues:write`. |
| `GITHUB_TOKEN` | _(hindi nakatakda)_ | pag-uuri ng isyu / mga helper ng cloud agent | Pangkalahatang GitHub access token na ginagamit bilang fallback para sa `GITHUB_ISSUES_TOKEN` at ginagamit ng mga helper ng cloud agent sa `src/lib/cloudAgent/*`. |
---
## Mga Sitwasyon sa Deployment
Para sa gabay ng SRE sa relay backend (gawi ng ts/bifrost/auto, paglalagay ng 9router kumpara sa CLIProxyAPI, at fallback strategy para sa mataas na throughput), tingnan ang [Diskarte sa Relay Backend](/docs/reference/RELAY_BACKEND_STRATEGY.md).
### Minimal na Lokal na Development
```bash
JWT_SECRET=$(openssl rand -base64 48)
API_KEY_SECRET=$(openssl rand -hex 32)
INITIAL_PASSWORD=dev123
PORT=20128
NODE_ENV=development
```
### Produksyon gamit ang Docker
```bash
JWT_SECRET=
API_KEY_SECRET=
INITIAL_PASSWORD=
STORAGE_ENCRYPTION_KEY=
DATA_DIR=/data
PORT=20128
API_PORT=20129
NODE_ENV=production
AUTH_COOKIE_SECURE=true
REQUIRE_API_KEY=true
NEXT_PUBLIC_BASE_URL=https://omniroute.example.com
BASE_URL=http://localhost:20128
OMNIROUTE_MEMORY_MB=8192
CORS_ORIGIN=https://your-frontend.example.com
```
### Air-Gapped / CI
```bash
JWT_SECRET=test-jwt-secret-for-ci
API_KEY_SECRET=test-api-key-secret-for-ci
INITIAL_PASSWORD=testpass
NODE_ENV=production
OMNIROUTE_DISABLE_BACKGROUND_SERVICES=true
APP_LOG_TO_FILE=false
```
### VPS na may Reverse Proxy (nginx + Cloudflare)
```bash
JWT_SECRET=
API_KEY_SECRET=
STORAGE_ENCRYPTION_KEY=
PORT=20128
AUTH_COOKIE_SECURE=true
REQUIRE_API_KEY=true
NEXT_PUBLIC_BASE_URL=https://omniroute.example.com
BASE_URL=http://127.0.0.1:20128
CORS_ORIGIN=https://omniroute.example.com
ENABLE_TLS_FINGERPRINT=true
CLI_COMPAT_ALL=1
```
---
## 24. Skills Sandbox (v3.8.0+)
Mga limitasyon at kontrol sa kaligtasan na inilalapat kapag nagpapatakbo ang Skills framework (`src/lib/skills/`) ng mga automation na tinukoy ng user sa isang sandboxed na kapaligiran.
| Variable | Default | Source File | Paglalarawan |
| --------------------------------- | -------------------------------------------- | ------------------------------------------------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `SKILLS_SANDBOX_TIMEOUT_MS` | `10000` (10 s) | `src/lib/skills/builtins.ts` | Wall-clock timeout sa bawat pagpapatakbo para sa sandboxed skill code. Mahigpit na limitasyon; anumang lalampas dito ay ihihinto. |
| `SKILLS_EXECUTION_TIMEOUT_MS` | _(bumabalik sa `SKILLS_SANDBOX_TIMEOUT_MS`)_ | `src/lib/skills/` | Timeout para sa high-level na orkestrasyon ng skill. Magtakda ng mas mataas na halaga kaysa sa `SKILLS_SANDBOX_TIMEOUT_MS` upang payagan ang mga multi-step workflow. |
| `SKILLS_MAX_FILE_BYTES` | `1048576` (1 MB) | `src/lib/skills/builtins.ts` | Maximum na bilang ng byte na maaaring basahin ng isang skill mula sa anumang indibidwal na sandboxed file. |
| `SKILLS_MAX_HTTP_RESPONSE_BYTES` | `256000` (250 KB) | `src/lib/skills/builtins.ts` | Maximum na bilang ng byte na maaaring makuha mula sa anumang indibidwal na HTTP response sa loob ng isang skill. |
| `SKILLS_MAX_SANDBOX_OUTPUT_CHARS` | `100000` | `src/lib/skills/builtins.ts` | Mahigpit na limitasyon sa bilang ng mga character ng stdout/stderr na ibinabalik mula sa isang sandbox invocation. |
| `SKILLS_SANDBOX_NETWORK_ENABLED` | `false` | `src/lib/skills/builtins.ts` | Itakda sa `1`/`true` upang payagan ang outbound network mula sa loob ng sandbox. Bilang default, **nakahiwalay** ito para sa kaligtasan. |
| `SKILLS_ALLOWED_SANDBOX_IMAGES` | _(walang laman)_ | `src/lib/skills/builtins.ts` | Allowlist na pinaghihiwalay ng kuwit ng mga container image na pinapayagan para sa sandbox execution. Kapag walang laman, built-in na default lamang ang pinapayagan. |
| `SKILLS_SANDBOX_DOCKER_IMAGE` | _(built-in na default)_ | `src/lib/skills/` | Container image na ginagamit kapag gumagawa ng Docker-backed sandbox. I-override upang i-pin ang isang custom at pinatibay na base image. |
| `SKILLS_SANDBOX_RUNTIME` | `auto` | `src/lib/skills/sandbox.ts`, `src/lib/skills/containerProvider.ts` | Container runtime para sa pag-sandbox ng skill: `auto` \| `docker` \| `apple` \| `wsl` \| `orbstack` \| `podman`. Pinipili ng `auto` ang pinakamahusay na naka-install na runtime ayon sa host OS (Apple Container/OrbStack sa macOS, WSL Container sa Windows, Podman sa Linux), at bumabalik sa Docker kung kinakailangan. |
> [!CAUTION]
> Ang pagpapagana sa `SKILLS_SANDBOX_NETWORK_ENABLED=true` ay nagbubukas ng egress path mula sa arbitraryong skill code. Ipares ito sa `OUTBOUND_SSRF_GUARD_ENABLED=true` at isang mahigpit na patakaran sa `CORS_ORIGIN`/proxy sa mga shared deployment.
---
## 25. Mga Quota ng Provider, Mga Tunnel, Mga Backup at Iba pang Runtime
Mga endpoint ng quota ng provider, mga network tunnel (Tailscale, Ngrok, MITM debug proxy), ang 1Proxy egress pool, mga backup ng database at maliliit na override kada feature na tinutukoy ng executor layer o mga script.
| Variable | Default | Pinagmulang File | Paglalarawan |
| ---------------------------------------------- | --------------------------------------------------------------------------- | ------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `REDIS_URL` | `redis://localhost:6379` | `src/shared/utils/rateLimiter.ts` | Connection string ng Redis para sa backend ng rate limiter. |
| `ALIBABA_CODING_PLAN_HOST` | _(host ng production)_ | `open-sse/services/bailianQuotaFetcher.ts` | I-override ang host na ginagamit para kunin ang mga quota ng Alibaba Bailian coding-plan. |
| `ALIBABA_CODING_PLAN_QUOTA_URL` | hinango mula sa host | `open-sse/services/bailianQuotaFetcher.ts` | Buong override ng quota URL para sa Alibaba Bailian. |
| `QWEN_CLOUD_COOKIE` | _(hindi nakatakda)_ | `open-sse/services/qwenTokenPlanQuotaFetcher.ts` | Cookie ng sesyon ng console para sa personal na Token Plan quota gateway ng Qwen Cloud / Model Studio (hindi ito mababasa ng inference API key). Kopyahin ang buong `Cookie` request header — naglalaman ito ng `login_qwencloud_ticket` — mula sa anumang tawag ng `api.json` sa `cs-data.qwencloud.com` sa home.qwencloud.com › Billing › Subscription (F12 › Network). Sensitibo at sakop lamang ng sesyon; mas mainam na gamitin ang bawat-koneksyon na field na `qwenCloudCookie` sa Dashboard. |
| `QWEN_CLOUD_SEC_TOKEN` | _(hindi nakatakda)_ | `open-sse/services/qwenTokenPlanQuotaFetcher.ts` | Manu-manong override ng `sec_token` para sa Token Plan console gateway. Sensitibo; kapag hindi nakatakda, kukunin ito ng fetcher mula sa HTML ng dashboard gamit ang cookie. |
| `QWEN_TOKEN_PLAN_HOST` | `https://cs-data.qwencloud.com` | `open-sse/services/qwenTokenPlanQuotaFetcher.ts` | Override ng gateway host para sa personal na Token Plan quota fetcher (hal. `bailian-singapore-cs.alibabacloud.com` para sa Model Studio console). |
| `QWEN_TOKEN_PLAN_DASHBOARD_URL` | `https://home.qwencloud.com/` | `open-sse/services/qwenTokenPlanQuotaFetcher.ts` | Dashboard URL na ginagamit para makuha ang `sec_token` mula sa naka-login na HTML. |
| `XIAOMI_MIMO_CONSOLE_COOKIE` | _(hindi nakatakda)_ | `open-sse/services/usage/xiaomi-mimo.ts` | Cookie ng sesyon ng console para sa Xiaomi MiMo Token Plan quota API (`platform.xiaomimimo.com/api/v1/tokenPlan/usage` + `tokenPlan/detail` — hindi ito mababasa ng inference API key). Kopyahin ang buong `Cookie` request header — naglalaman ito ng `api-platform_serviceToken` at `userId` — mula sa anumang request sa `platform.xiaomimimo.com` sa pahina ng Token Plan (F12 › Network). Sensitibo at sakop lamang ng sesyon; mas mainam na gamitin ang bawat-koneksyon na field na `xiaomiMimoConsoleCookie` sa Dashboard. |
| `XIAOMI_MIMO_MONTHLY_TOKEN_LIMIT` | `4100000000` | `open-sse/services/usage/xiaomi-mimo.ts` | Buwanang badyet (Credits) para sa OmniRoute-tracked na Xiaomi MiMo fallback na ginagamit kapag walang naka-configure na console cookie. Naka-default sa 4.1B ng Lite tier; itakda ito sa Credits ng plano (Standard 11B / Pro 38B / Max 82B). Ang bawat-koneksyon na `providerSpecificData.monthlyTokenLimit` override ay nananaig sa env var na ito. |
| `ALIBABA_FREE_TIER_VISION_FE_PATH` | `/costing-balance/free-quota-image-video` | `open-sse/services/alibabaFreeTierQuotaFetcher.ts` | Console front-end path override para sa pagkuha ng Alibaba Model Studio free-tier vision/media quota. |
| `ALIBABA_FREE_TIER_MULTIMODAL_FE_PATH` | `/costing-balance/free-quota-multimodal` | `open-sse/services/alibabaFreeTierQuotaFetcher.ts` | Console front-end path override para sa pagkuha ng Alibaba Model Studio free-tier multimodal quota. |
| `ALIBABA_FREE_TIER_AUDIO_FE_PATH` | `/costing-balance/free-quota-audio` | `open-sse/services/alibabaFreeTierQuotaFetcher.ts` | Console front-end path override para sa pagkuha ng Alibaba Model Studio free-tier audio quota. |
| `ALIBABA_FREE_TIER_ALLOWLIST_PATH` | _(hindi nakatakda)_ | `open-sse/services/alibabaFreeTierAllowlist.ts` | Opsyonal na path sa isang lokal na JSON override para sa built-in na Alibaba free-tier text-model allowlist. Nagfa-fallback sa `$DATA_DIR/alibaba-free-tier-allowlist.json`, pagkatapos ay `config/alibaba-free-tier-allowlist.json`. |
| `CONTEXT_RESERVE_TOKENS` | `1024` | `open-sse/services/contextManager.ts` | Mga token na nakalaan para sa completion output kapag kinakalkula ang mga prompt budget. |
| `CONTEXT_KEEP_LATEST_IMAGES` | `2` | `open-sse/services/contextManager.ts` | Ilan sa mga pinakabagong inline na imahe ang itatago kapag nag-aalis ng mga mas lumang imahe para umangkop sa context window (#8560). |
| `MODEL_ALIAS_COMPAT_ENABLED` | naka-enable | `open-sse/services/model.ts` | I-toggle ang legacy model-alias compatibility layer na ginagamit ng mga mas lumang client. |
| `OMNIROUTE_EMERGENCY_FALLBACK` | naka-enable | `open-sse/services/emergencyFallback.ts` | Itakda ang `false` (o `0`) para i-disable ang emergency budget-exhaustion fallback na nagre-reroute ng mga nabigong request sa libreng `nvidia`/`openai/gpt-oss-120b` na modelo. Ang epektibong precedence ay Feature Flags DB override > env var > default; kung hindi available, ang serbisyo ay nagfa-fallback sa raw na halaga ng env. |
| `COMMAND_CODE_CALLBACK_PORT` | _(hindi nakatakda)_ | `src/app/api/providers/command-code/auth/shared.ts` | Lokal na port na ginagamit para sa mga OAuth-style na callback mula sa Command Code CLI helper. |
| `COMMAND_CODE_VERSION` | `0.33.2` | `open-sse/executors/commandCode.ts` | Halagang ipinadala bilang `x-command-code-version` header sa Command Code upstream. I-override para itaas ang bersyon ng CLI. |
| `COMMANDCODE_API_URL` | `https://api.commandcode.ai` | `open-sse/services/usage/command-code.ts` | Base URL para sa Command Code usage/quota upstream na ginagamit ng smartphone quota-fetcher telemetry. I-override para sa self-hosted/alternatibong Command Code API. |
| `MITM_LOCAL_PORT` | `443` | `src/mitm/server.cjs` | Lokal na bind port para sa MITM debug proxy. |
| `MITM_DISABLE_TLS_VERIFY` | `0` | `src/mitm/server.cjs` | Itakda sa `1` para i-disable ang upstream TLS verification (development lamang). |
| `MITM_IDLE_TIMEOUT_MS` | `60000` | `src/mitm/socketTimeouts.ts`, `src/mitm/server.cjs` | Idle socket timeout (ms) para sa mga proxied connection; ang mga idle socket na lumampas dito ay tinatanggal para maiwasang mag-leak ng mga half-open tunnel. |
| `BRIDGE_PORT` | `20129` | `bin/antigravity-bridge.mjs` | Port na pinakikinggan ng Antigravity MITM bridge. |
| `ROUTER_URL` | `http://127.0.0.1:20128/v1/antigravity` | `bin/antigravity-bridge.mjs` | Router endpoint kung saan ipinapasa ng bridge ang Antigravity traffic. |
| `CERT_DIR` | `/mitm` | `bin/antigravity-bridge.mjs` | Ina-override ang direktoryo kung saan binabasa ng bridge ang TLS material nito. Ang cert model ay pinipili tulad ng ginagawa ng AgentBridge server: `server.crt`/`server.key` para sa legacy leaf install, kung hindi ay `ca.crt`/`ca.key` (root CA, isang leaf bawat intercepted host; pinipilit ng `MITM_ROOT_CA_ENABLED=true`). Mag-e-exit ang bridge sa startup kung nawawala ang mga file para sa aktibong model. |
| `MITM_VERBOSE` | `1` | `src/mitm/server.cjs`, `src/mitm/_internal/bypass.cjs` | Verbosity ng routing-decision log: `0` ay nagpapatahimik, ang mas mataas na halaga ay nagla-log ng mas maraming bypass/route decision. |
| `MITM_ROOT_CA_ENABLED` | `false` | `src/mitm/manager.ts` | Itakda sa `true` para mag-opt in sa root-CA + per-host-leaf cert model (#6684). Ang mga bagong install ay awtomatikong nakakakuha nito; ang mga install na may paunang-umiiral na trusted legacy leaf ay nagpapanatili ng legacy fixed-SAN cert maliban kung nag-opt in. |
| `MITM_CERT_MODE` | `legacy` | `src/mitm/manager.ts`, `src/mitm/server.cjs` | Itinatakda NG MITM manager para sa spawned proxy process (`root-ca` \| `legacy`) — sumasalamin sa cert-migration decision; hindi nilalayong itakda nang manu-mano. |
| `OMNIROUTE_NO_SUDO` | `0` | `src/mitm/systemCommands.ts` | Itakda ang `1` (truthy) upang alisin ang nauunang `sudo` mula sa mga MITM cert-trust command — para sa mga root-less / user-namespaced na deployment kung saan ang operator ay manual na nagtitiwala sa CA (hal. sa pamamagitan ng extra-CA-certs mechanism ng Node). |
| `SKIP_ANTIGRAVITY_DNS` | _(hindi nakatakda)_ | `src/mitm/dns/provision.ts` | Itakda ang `true` upang ganap na laktawan ang pag-provision ng mga `/etc/hosts` DNS entry para sa mga Antigravity proxy hostname — para sa mga container na walang available na sudo/root. |
| `OMNIROUTE_SKIP_DNS_WRITE` | _(hindi nakatakda)_ | `src/mitm/dns/dnsConfig.ts` | Itakda ang `1` upang laktawan ang pagsulat sa hosts file kapag nagdaragdag/nag-aalis ng mga DNS entry — para sa mga sandboxed o read-only na test environment. |
| `OMNIROUTE_SKIP_SYSTEM_TRUST` | `0` | `src/mitm/cert/install.ts`, `src/mitm/tproxy/caTrust.ts` | Guard na para lamang sa Test/CI: itakda ang `1` upang gawing no-op ang cert trust install/uninstall upang hindi kailanman mabago ng suite ang OS trust store. Awtomatikong itinatakda ng test setup at mga CI workflow. |
| `CHANGELOG_BASE_REF` | _(awtomatiko)_ | `scripts/check/check-changelog-integrity.mjs` | Explicit na base ref para sa anti CHANGELOG-eat gate (nagde-default sa PR base branch sa CI, o sa pinakamataas na `release/v*`). |
| `FREE_PROXY_AUTO_SYNC_ENABLED` | `false` | `src/lib/freeProxyProviders/scheduler.ts` | Itakda ang `true` upang paganahin ang background free-proxy pool auto-sync scheduler. Opt-in, nakapatay bilang default. |
| `FREE_PROXY_AUTO_SYNC_INTERVAL_MS` | `1800000` | `src/lib/freeProxyProviders/scheduler.ts` | Auto-sync interval sa milliseconds (default na 30 min). |
| `FREE_PROXY_1PROXY_ENABLED` | `true` | `src/lib/freeProxyProviders/oneproxy.ts` | Paganahin ang 1proxy free proxy source. Itakda sa `false` upang huwag paganahin. |
| `FREE_PROXY_1PROXY_API_URL` | _(tingnan ang oneproxy.ts)_ | `src/lib/freeProxyProviders/oneproxy.ts` | Override ng 1proxy API URL. |
| `FREE_PROXY_1PROXY_MAX` | `500` | `src/lib/freeProxyProviders/oneproxy.ts` | Pinakamataas na bilang ng mga proxy na kinukuha bawat sync mula sa 1proxy. |
| `FREE_PROXY_1PROXY_MIN_QUALITY` | `50` | `src/lib/freeProxyProviders/oneproxy.ts` | Pinakamababang threshold ng quality score para sa mga import ng 1proxy. |
| `FREE_PROXY_PROXIFLY_ENABLED` | `true` | `src/lib/freeProxyProviders/proxifly.ts` | I-enable ang Proxifly free proxy source. Itakda sa `false` para i-disable. |
| `FREE_PROXY_PROXIFLY_QUANTITY` | `100` | `src/lib/freeProxyProviders/proxifly.ts` | Bilang ng mga proxy na kukunin bawat Proxifly sync. |
| `FREE_PROXY_PROXIFLY_ANONYMITY` | `elite` | `src/lib/freeProxyProviders/proxifly.ts` | Filter ng anonymity level para sa Proxifly (`elite`, `anonymous`, `transparent`). |
| `FREE_PROXY_IPLOCATE_ENABLED` | `false` | `src/lib/freeProxyProviders/iplocate.ts` | I-enable ang IPLocate free proxy source. Opt-in lamang. |
| `FREE_PROXY_IPLOCATE_BASE_URL` | `https://raw.githubusercontent.com/iplocate/free-proxy-list/main/protocols` | `src/lib/freeProxyProviders/iplocate.ts` | Override ng base URL ng IPLocate proxy list. |
| `FREE_PROXY_WEBSHARE_ENABLED` | `true` | `src/lib/freeProxyProviders/webshare.ts` | I-enable ang Webshare proxy pool source. Itakda sa `false` para i-disable; kailangan din na nakatakda ang `FREE_PROXY_WEBSHARE_API_KEY`. |
| `FREE_PROXY_WEBSHARE_API_KEY` | _(wala)_ | `src/lib/freeProxyProviders/webshare.ts` | Webshare account API token (`Authorization: Token `). Kinakailangan — mananatiling naka-disable ang provider kung wala ito. |
| `FREE_PROXY_WEBSHARE_API_URL` | `https://proxy.webshare.io/api/v2/proxy/list/` | `src/lib/freeProxyProviders/webshare.ts` | Override ng Webshare proxy list API URL. |
| `FREE_PROXY_WEBSHARE_MAX` | `500` | `src/lib/freeProxyProviders/webshare.ts` | Pinakamataas na bilang ng mga proxy na ma-i-import bawat Webshare sync. |
| `NEXT_PUBLIC_VERCEL_RELAY_ENABLED` | `true` | `src/app/(dashboard)/…/ProxyPoolTab.tsx` | Ipakita/itago ang pindutang Deploy Vercel Relay sa tab ng Proxy Pool. |
| `VERCEL_API_BASE` | `https://api.vercel.com` | `src/app/api/settings/proxy/vercel-deploy/route.ts` | Override ng base URL ng Vercel API (para sa pagsubok). |
| `NEXT_PUBLIC_VERCEL_RELAY_DEFAULT_PROJECT` | `omniroute-relay` | `src/app/(dashboard)/…/VercelRelayModal.tsx` | Default na pangalan ng proyekto na paunang nakalagay sa Vercel Relay deploy modal. |
| `TAILSCALE_BIN` | _(awtomatikong tukuyin)_ | `src/lib/tailscaleTunnel.ts` | Tiyak na path patungo sa `tailscale` binary. |
| `TAILSCALED_BIN` | _(awtomatikong tukuyin)_ | `src/lib/tailscaleTunnel.ts` | Tiyak na path patungo sa `tailscaled` daemon binary. |
| `TAILSCALE_AUTHKEY` | _(hindi nakatakda)_ | `src/lib/tailscaleTunnel.ts` | Pre-shared na Tailscale auth key para sa non-interactive / headless na `tailscale up` (ipinapasa gamit ang `--auth-key=`). Kapag hindi nakatakda, babalik ang login sa interactive na browser auth URL. |
| `NGROK_AUTHTOKEN` | _(hindi nakatakda)_ | `src/lib/ngrokTunnel.ts` | Nagpapatunay ng mga outbound na ngrok tunnel. |
| `DB_BACKUP_MAX_FILES` | `20` | `src/lib/db/backup.ts` | Pinakamataas na bilang ng mga SQLite backup file na pinananatili ng manual/scheduled na backup cleanup. Ang mga migration snapshot ay content-addressed at muling ginagamit para sa magkaparehong DB state; hindi ang mga ito isinasailalim sa pruning sa loob ng concurrent migration window. Ino-override ang halagang naka-save mula sa Mga Setting → Retention ng backup ng database. |
| `DB_BACKUP_RETENTION_DAYS` | `0` | `src/lib/db/backup.ts` | Pinakamataas na edad (mga araw) na pinananatili ng manual/scheduled na backup cleanup. Ang `0` ay nagdi-disable ng pruning na batay sa edad. Ang mga migration snapshot ay hindi isinasailalim sa pruning sa loob ng concurrent migration window. Ino-override ang halagang naka-save mula sa Mga Setting → Retention ng backup ng database. |
| `OMNIROUTE_BACKUP_SCHEDULE_JOB_INTERVAL_MS` | `30000` | `src/lib/jobs/backupScheduleJob.ts` | Tick interval (ms) ng server-side na job na nagpapatakbo ng `backup-schedule.json`. Dapat manatiling mas mababa nang malayo sa 1-minutong cron granularity; ang mga halagang mas mababa sa `5000` o hindi ma-parse ay babalik sa `30000`. |
| `CONTAINER_HOST` | `docker` | `scripts/check-permissions.sh` | Pahiwatig ng container runtime para sa permission check ng entrypoint. Itakda sa `podman` para sa anumang topology ng Podman. Dahil hindi matukoy ng container kung lokal ang engine o naabot sa pamamagitan ng Podman Machine, nananatiling topology-neutral ang babala at tumuturo ito sa `contrib/podman/README.md`. |
| `QUOTA_STORE_DRIVER` | `sqlite` | `src/lib/quota/storeFactory.ts` | Backend ng quota-share consumption store: `sqlite` (default) o `redis`. |
| `QUOTA_STORE_REDIS_URL` | _(walang nakatakda)_ | `src/lib/quota/storeFactory.ts` | Connection string ng Redis na ginagamit kapag `QUOTA_STORE_DRIVER=redis` (hal. `redis://localhost:6379`). |
| `QUOTA_SATURATION_THRESHOLD` | `0.5` | `src/lib/quota/enforce.ts` | Ratio ng saturation ng pool (0..1); kapag naabot o lumampas dito, pumapasok ang pool sa strict mode (walang borrowing). |
| `QUOTA_SOFT_DEPRIORITIZE_FACTOR` | `0.7` | `open-sse/services/combo.ts` | Multiplier ng score (0..1) na inilalapat sa isang target kapag ibinababa ito ng soft quota policy sa priyoridad. |
| `STATUS_SOFT_DEPRIORITIZE_FACTOR` | `0.5` | `open-sse/services/combo/autoStrategy.ts` | Multiplier ng score (0..1) na inilalapat sa isang ubos na provider (`credits_exhausted`/`rate_limited`) sa auto-combo scoring kapag naka-OFF ang preflight quota cutoff (#4540). |
| `QUOTA_CONSUMPTION_RETENTION_DAYS` | `14` | `src/lib/db/quotaConsumption.ts` | Bintana ng retention (mga araw) para sa mga bucket ng `quota_consumption` bago ang GC (`gcQuotaConsumption`). |
| `QUOTA_PREFLIGHT_CUTOFF_ENABLED` | `false` | `src/lib/resilience/settings.ts` | Opt-in (default OFF): pinagagana ang auto-routing hard quota cutoff na nag-aalis ng mga kandidatong mababa ang quota bago ang scoring. |
| `OMNIROUTE_AUTO_FREE_FALLBACK_TO_FULL_POOL` | `false` | `open-sse/services/autoCombo/virtualFactory.ts` | Opt-in (default OFF): kapag walang tumugmang konektadong kandidato ang isang `auto/:` na filter, ibalik ang legacy na pag-uugali ng pag-fallback sa buong (hindi na-filter) pool sa halip na magbalik ng walang laman na pool. Ang default na OFF ay nagpapahiwatig na ang `:free` ay "free tier lamang". |
| `OMNIROUTE_CHAOS_MAX_PANEL` | `5` | `open-sse/services/autoCombo/virtualFactory.ts` | Limitasyon ng laki ng panel (na-clamp sa 1–10) para sa `auto/*:chaos` na broadcast variant — ang isang request ay kumakalat sa hindi hihigit sa ganitong karaming modelo na magkakaiba ang provider. |
| `OMNIROUTE_CHAOS_MIN_PANEL` | _(default ng engine)_ | `open-sse/services/autoCombo/virtualFactory.ts` | Pinakamababang tuning ng laki ng panel na ipinapasa sa chaos broadcast handler; kapag hindi nakatakda, pinapanatili ang default ng engine. |
| `OMNIROUTE_CHAOS_PANEL_TIMEOUT_MS` | _(default ng engine)_ | `open-sse/services/autoCombo/virtualFactory.ts` | Hard timeout (ms) para sa buong chaos panel fan-out; kapag hindi nakatakda, pinapanatili ang default ng engine. |
| `GROK_AUTH_PATH` | `~/.grok/auth.json` | `open-sse/services/grokQuotaFetcher.ts` | Path ng Grok CLI `auth.json` na ginagamit para kunin ang lingguhang quota ng grok-web; i-override para sa mga test o hindi standard na pag-install ng CLI. |
| `AGENTBRIDGE_UPSTREAM_CA_CERT` | _(hindi nakatakda)_ | `src/mitm/manager.ts` | Karagdagang CA certificate (PEM) na pinagkakatiwalaan para sa mga AgentBridge upstream TLS connection. |
| `INSPECTOR_BUFFER_SIZE` | `1000` | `src/mitm/inspector/buffer.ts` | Pinakamataas na bilang ng nakuhang mga request na hinahawakan sa Traffic Inspector ring buffer. |
| `INSPECTOR_MAX_BODY_KB` | `1024` | `src/mitm/inspector/buffer.ts` | Pinakamataas na laki ng nakuhang request/response body (KB) bago putulin. |
| `INSPECTOR_HTTP_PROXY_PORT` | `8080` | `src/mitm/inspector/httpProxyServer.ts` | Lokal na port para sa Traffic Inspector HTTP proxy. |
| `INSPECTOR_HTTP_PROXY_AUTOSTART` | `false` | `src/mitm/inspector/httpProxyServer.ts` | Awtomatikong simulan ang inspector HTTP proxy sa pag-boot. |
| `INSPECTOR_LLM_HOSTS_EXTRA` | _(hindi nakatakda)_ | `src/lib/inspector/captureState.ts` | Karagdagang mga hostname (pinaghiwalay ng kuwit) na itinuturing na mga LLM endpoint para sa capture. |
| `INSPECTOR_MASK_SECRETS` | `true` | `src/mitm/inspector/buffer.ts` | Itago ang mga sekreto (mga auth header / API key) sa nakuhang trapiko. |
| `INSPECTOR_SYSTEM_PROXY_GUARD_MINUTES` | `30` | `src/app/api/tools/traffic-inspector/capture-modes/system-proxy/route.ts` | Mga minuto bago awtomatikong ibalik ng system-proxy guard ang mga OS proxy setting. |
| `INSPECTOR_INTERNAL_INGEST_TOKEN` | _(auto)_ | `src/app/api/tools/traffic-inspector/internal/ingest/route.ts` | Token na nagpapatunay ng internal na capture ingest papunta sa inspector. |
| `PLAYGROUND_COMPARE_MAX_COLUMNS` | `4` | `src/app/(dashboard)/dashboard/playground/` | Pinakamataas na bilang ng magkatabing column sa compare mode ng Playground. |
| `PLAYGROUND_IMPROVE_PROMPT_DEFAULT_MODEL` | _(unset)_ | `src/app/(dashboard)/dashboard/playground/` | Default na modelo para sa aksyong 'improve prompt' ng Playground (nagba-balk sa aktibong modelo kapag hindi naka-set). |
| `BIFROST_ENABLED` | `1` | `src/app/api/v1/relay/chat/completions/bifrost/route.ts` | Pangunahing kill switch para sa bifrost sidecar proxy. Kapag naka-set sa `0`, nagbabalik ang route ng 503 na may `X-Bifrost-Killswitch` header at ang operator ay ibinabaling sa TS path. Gamitin para i-disable ang sidecar nang walang redeploy (insidente sa tier-1 router, key rotation). |
| `BIFROST_BASE_URL` | _(unset)_ | `src/app/api/v1/relay/chat/completions/bifrost/route.ts` | Kapag naka-set, ang Bifrost sidecar proxy route ay nagpapasa ng `/v1/chat/completions` na traffic sa Go gateway na ito sa halip na sa TS relay handler. Kapag hindi naka-set → 503-with-fallback. Tinatanggal ang trailing slash. |
| `BIFROST_PORT` | `8080` | `src/lib/services/bootstrap.ts` | Port kung saan nagbi-bind ang supervised Bifrost embedded service (`127.0.0.1:`) kapag ang OmniRoute ang namamahala sa lifecycle ng Bifrost sidecar. Default ay `8080`. |
| `LLMLINGUA_PORT` | `20135` | `src/lib/services/bootstrap.ts` | Port kung saan nagbi-bind ang supervised LLMLingua compression service (`127.0.0.1:`). Default ay `20135`. |
| `LLMLINGUA_BASE_URL` | `http://127.0.0.1:20135` | `open-sse/services/compression/engines/llmlingua/index.ts` | Base URL para sa lokal na LLMLingua HTTP compression microservice daemon. Default ay `http://127.0.0.1:20135`. |
| `LLMLINGUA_MODEL` | `atjsh/llmlingua-2-js-tinybert-meetingbank` | `src/lib/services/installers/llmlingua.ts` | Hugging Face model id na nilo-load ng supervised LLMLingua sidecar (ipinapasa sa env ng child process). |
| `BIFROST_API_KEY` | _(unset)_ | `src/app/api/v1/relay/chat/completions/bifrost/route.ts` | API key para sa Bifrost gateway (ipinapadala bilang `Authorization: Bearer ...`). Kapag hindi naka-set, inaasahan ng route na ang request ay may dalang wastong OmniRoute API key; ang key na ito ay para lamang sa gateway-side na auth. |
| `BIFROST_STREAMING_ENABLED` | `true` | `src/app/api/v1/relay/chat/completions/bifrost/route.ts` | Kapag true, ang Bifrost sidecar route ay nag-stream ng mga response pabalik sa pamamagitan ng SSE sa gateway sa halip na ang TS streaming executor. Itakda sa `0` upang pilitin ang mga non-streaming na JSON response sa gateway. |
| `BIFROST_TIMEOUT_MS` | `30000` | `src/app/api/v1/relay/chat/completions/bifrost/route.ts` | Timeout bawat request kapag nag-proxy papunta sa Bifrost gateway (ms). Kapag nag-timeout, ibinabalik ng route ang TS relay path sa pamamagitan ng `X-Bifrost-Fallback` header. |
| `OMNIROUTE_BIFROST_KEY` | _(hindi naka-set)_ | `src/app/api/v1/relay/chat/completions/bifrost/route.ts` | Alias para sa `BIFROST_API_KEY` (ginagamit ng mga script na nagbabasa ng env sa pamamagitan ng `OMNIROUTE_*`). Ang `BIFROST_API_KEY` ang may prayoridad kapag parehong naka-set. |
| `OMNIROUTE_RELAY_BACKEND` | `ts` / `auto` | `src/app/api/v1/relay/chat/completions/routingBackend.ts` | Relay backend para sa `/api/v1/relay/chat/completions`: `ts \| bifrost \| auto`. `ts` = TypeScript relay (default kapag hindi naka-configure ang Bifrost); `auto` pumipili ng Bifrost kapag naka-set ang `BIFROST_BASE_URL` at ang `BIFROST_ENABLED` ≠ `0`, na may awtomatikong TS fallback kung hindi maabot ang sidecar; `bifrost` pinipilit ang Bifrost (mahigpit, walang fallback). Ang Auth/rate-limit/injection-guard/allowlist ay palaging tumatakbo muna sa Next route. Ang mga response ay may dalang `X-Routing-Backend` / `X-Routing-Fallback` / `X-Routing-Fallback-Reason`. |
| `RELAY_ROUTING_BACKEND` | _(hindi naka-set)_ | `src/app/api/v1/relay/chat/completions/routingBackend.ts` | Tinatanggap na alias para sa `OMNIROUTE_RELAY_BACKEND` (parehong mga halagang `ts \| bifrost \| auto`). Ang `OMNIROUTE_RELAY_BACKEND` ang may prayoridad kapag parehong naka-set. |
| `OMNIROUTE_BIFROST_FAILURE_COOLDOWN_MS` | `5000` | `src/app/api/v1/relay/chat/completions/bifrostCooldown.ts` | Cooldown (ms) matapos mabigo ang Bifrost sidecar hop sa `auto` mode bago muling subukan ng relay ang sidecar; dumariretso ito sa TS path habang nagtatagal ang cooldown, pagkatapos ay susuriin muli. Ang `0` ay nagdi-disable. Nalalapat lamang kapag `OMNIROUTE_RELAY_BACKEND=auto`. |
| `OMNIROUTE_TLS_CERT` | _(hindi naka-set)_ | `bin/cli/commands/serve.mjs` | Path sa PEM TLS certificate upang i-serve ang `omniroute serve` sa HTTPS (katumbas ng `--tls-cert`). Dapat ipares sa `OMNIROUTE_TLS_KEY`; ang standalone server ay nagtatapos ng TLS sa parehong listener (`wss://` ay gumagana nang walang pagbabago). Kapag unset → plain HTTP. Ang pagbibigay lamang ng isa sa cert/key, o isang hindi mababasang path, ay nag-log ng babala at nananatili sa HTTP. |
| `OMNIROUTE_TLS_KEY` | _(hindi naka-set)_ | `bin/cli/commands/serve.mjs` | Path sa PEM TLS private key para sa `omniroute serve` HTTPS (katumbas ng `--tls-key`). Dapat ipares sa `OMNIROUTE_TLS_CERT`. Tingnan ang `OMNIROUTE_TLS_CERT`. |
| `OMNIROUTE_LOCAL_ENDPOINTS_ENABLED` | `0` | `src/lib/security/localEndpoints.ts` | Pangunahing switch para sa mga `/api/local/*` route. Kapag unset o `0`, lahat ng `/api/local/*` route ay nagbabalik ng 503 sa production. Dapat ay `1` sa mga non-loopback deploy upang i-enable ang Redis launcher at mga katulad na 1-click local service starter. Dobleng pananggalang kasama ang `isLocalOnlyPath()` route-guard classification (`LOCAL_ONLY_API_PREFIXES` sa `src/server/authz/routeGuard.ts`). |
| `OMNIROUTE_LOCAL_ENDPOINTS_TOKEN` | _(hindi naka-set)_ | `src/lib/security/localEndpoints.ts` | Bearer token para sa mga caller ng `/api/local/*` na hindi nasa loopback (hal. ang desktop app). Kapag naka-set, ang mga request mula sa mga non-loopback IP ay dapat may dalang `Authorization: Bearer `. Kinakailangan kapag `OMNIROUTE_LOCAL_ENDPOINTS_ENABLED=1` sa mga non-loopback deployment. |
| `OMNIROUTE_REDIS_CONTAINER_NAME` | `omniroute-redis` | `bin/cli/commands/redis.mjs` | Pangalan ng container para sa 1-click Redis launcher (`omniroute redis up`). Ginagamit ng parehong CLI at ng `RedisLauncherPanel` GUI. |
| `OMNIROUTE_REDIS_HOST_PORT` | `6379` | `bin/cli/commands/redis.mjs` | Host port para sa 1-click Redis launcher. Baguhin kung may nakatali nang 6379 ang host. Ang panloob na port ng container ay nananatili sa 6379. |
| `OMNIROUTE_REDIS_BIND_HOST` | `127.0.0.1` | `bin/cli/commands/redis.mjs` | Host interface kung saan naglalathala ang 1-click Redis launcher. Sinisimulan ng launcher ang Redis nang WALANG password, kaya ang pag-bind sa `0.0.0.0` ay nag-aabot ng isang Redis na walang authentication sa bawat host sa iyong LAN — palawakin lamang ito kung ikaw mismo ay magse-set din ng password sa instance. |
| `REDIS_BIND_HOST` | `127.0.0.1` | `docker-compose.yml` | Host interface kung saan inilalathala ng docker-compose ang Redis sidecar (#9286). Tumatakbo ang compose Redis nang walang `requirepass`; naaabot ito ng mga app container sa pamamagitan ng compose network (`redis:6379`) — ang naka-publish na port ay para lamang sa mga tooling sa panig ng host. Ang `0.0.0.0` ay naglalantad ng isang Redis na walang authentication sa buong LAN. |
| `REDIS_PORT` | `6379` | `docker-compose.yml` | Host port para sa compose Redis sidecar. |
| `APP_BIND_HOST` | `127.0.0.1` | `docker-compose.yml`, `docker-compose.prod.yml` | Host interface kung saan inilalathala ng docker-compose ang sariling mga port ng dashboard/API/live-WS ng app (#12568). Dahil ang `REQUIRE_API_KEY=false` ang default na nakapaloob sa `.env.example`, ang `0.0.0.0` ay naglalantad ng anonymous na `/v1` LLM proxy sa buong LAN/WAN — palawakin lamang kapag `REQUIRE_API_KEY=true` na o kapag may reverse proxy sa harapan na nagpapatupad ng sarili nitong auth. |
| `QDRANT_BIND_HOST` | `127.0.0.1` | `docker-compose.yml` | Host interface kung saan inilalathala ng docker-compose ang Qdrant memory sidecar (#12578). Parehong pangangatwiran sa pagkalantad sa LAN tulad ng `REDIS_BIND_HOST`. |
| `BIFROST_BIND_HOST` | `127.0.0.1` | `docker-compose.yml` | Host interface kung saan inilalathala ng docker-compose ang Bifrost router sidecar (#12578). Parehong pangangatwiran sa pagkalantad sa LAN tulad ng `REDIS_BIND_HOST`. |
| `REDIS_KEY_PREFIX` | `omniroute:` | `src/shared/utils/rateLimiter.ts` | Namespace prefix na inilalapat sa bawat OmniRoute Redis key (rate limiter, auth cache, quota store, warmup circuit breaker). Pinipigilan ang mga key collision kapag ang Redis instance ay ibinabahagi sa iba pang mga app (#11042). |
| `OMNIROUTE_INTERNAL_SERVICE_TOKEN` | _(hindi naka-set — naka-disable ang mekanismo)_ | `src/lib/api/internalServiceAuth.ts` | Shared secret para sa mga internal REST hop na nagpapanatili ng pagkakakilanlan (#9260): ipinapadala ito ng mga OmniRoute component na tumatawag sa iba pang lokal na OmniRoute route bilang `x-omniroute-internal-service-token` upang mapanatili ang pagkakakilanlan ng orihinal na tumatawag. Inihahambing gamit ang `timingSafeEqual`. |
| `OMNIROUTE_INTERNAL_SERVICE_TOKEN_FILE` | _(hindi naka-set)_ | `src/lib/api/internalServiceAuth.ts` | Variant ng secret-file ng internal service token: path sa isang file na ang na-trim na nilalaman ay ang token. Titingnan lang kapag hindi naka-set ang inline var. |
| `OPENROUTER_PROVIDER_STATS_ENABLED` | `true` | `src/lib/catalog/openrouterProviderStats.ts` | Pagyamanin ang listahan ng mga provider sa dashboard gamit ang OpenRouter weekly ranking stats (#9324). Naka-on bilang default; i-set sa `false` upang laktawan nang ganap ang background fetch (non-blocking, hindi kailanman fatal). |
| `OPENROUTER_PROVIDER_STATS_TTL_MS` | `86400000` (24h) | `src/lib/catalog/openrouterProviderStats.ts` | Cache TTL para sa OpenRouter provider-stats snapshot, sa milliseconds. |
| `OMNIROUTE_REDIS_IMAGE` | `redis:7-alpine` | `bin/cli/commands/redis.mjs` | Redis image na ginagamit ng 1-click Redis launcher. I-override sa `redis:8-alpine` o isang private registry mirror kung kinakailangan. |
| `QDRANT_HOST` | `qdrant` | _(opt-in na cluster profile)_ | Hostname ng Qdrant sidecar kapag aktibo ang `--profile memory`. Ang default ay tumuturo sa in-network na pangalan ng qdrant service; i-override para sa isang external na deployment. Kinokonsumo lang kapag ang `qdrantEnabled` ay `true` sa code (`src/lib/memory/vectorStore.ts:108`). |
| `QDRANT_PORT` | `6333` | _(opt-in na cluster profile)_ | REST port ng Qdrant sidecar. |
| `QDRANT_GRPC_PORT` | `6334` | _(opt-in na cluster profile)_ | gRPC port ng Qdrant sidecar. Ginagamit ng mga client library na mas gustong gRPC kaysa REST para sa mga streaming ops. |
| `QDRANT_API_KEY` | _(hindi naka-set)_ | _(opt-in na cluster profile)_ | Opsyonal na API key para sa Qdrant Cloud o isang authenticated na on-prem instance. Walang laman → walang `api-key` header na ipinapadala. |
| `QDRANT_COLLECTION` | `omniroute-memory` | _(opt-in na cluster profile)_ | Pangalan ng collection para sa mga conversation memory embedding ng OmniRoute. Ginagawa sa unang pagtakbo na may `QDRANT_VECTOR_SIZE` na mga dimension. |
| `QDRANT_EMBEDDING_MODEL` | `text-embedding-3-small` | _(opt-in na cluster profile)_ | Default na pangalan ng embedding model na naitala sa metadata ng Qdrant collection. Ang aktwal na mga embedding ay binubuo ng anumang provider na tinuturo ng `embeddingModel` field sa mga setting ng OmniRoute. |
| `QDRANT_VECTOR_SIZE` | `1536` | _(opt-in na cluster profile)_ | Dimensyon ng embedding vector. Dapat tumugma sa modelong ginagamit mo sa pag-embed (text-embedding-3-small → 1536; ada-002 → 1536; nomic-embed-text → 768). |
| `QDRANT_HNSW_EF_CONSTRUCT` | `128` | _(opt-in na cluster profile)_ | Katumpakan ng HNSW index sa panahon ng konstruksyon. Mas mataas = mas mabagal na build, mas mabilis na paghahanap. |
| `OMNIROUTE_ROTATION_ENABLED` | `true` | `open-sse/services/rotationConfig.ts` | Pangunahing switch para sa account rotation na mako-configure ng operator. Kapag `false`, walang alinman sa mga `OMNIROUTE_ROTATE_*` class sa ibaba ang magti-trigger ng account fallback (ang master-off na estado ay nagba-block din sa mga default-enabled na 429/500/502 class). Nagbibigay-daan sa isang nagbabantay na front-end (hal. ang VibeProxy desktop app) na i-mirror ang sarili nitong mga rotation rule sa account-fallback engine ng backend. |
| `OMNIROUTE_ROTATION_RATE_LIMIT_RESET_SECONDS` | `0` | `open-sse/services/rotationConfig.ts` | Cooldown (mga segundo) na inilalapat sa isang rate-limited na account kapag walang explicit na reset hint ang ibinibigay ng upstream. `0` = gamitin ang default cooldown ng engine sa halip na isang nakapirming override. |
| `OMNIROUTE_ROTATION_DISABLE_TAG_WITHOUT_RESET` | `true` | `open-sse/services/rotationConfig.ts` | Salamin ng front-end preference na "huwag i-tag bilang rate-limited nang walang reset time". |
| `OMNIROUTE_ROTATE_ON_429` | `true` | `open-sse/services/rotationConfig.ts` | Pag-enable ng fallback bawat status para sa mga `429` error. Kapag `false` (at `OMNIROUTE_ROTATION_ENABLED=true`), ang `429` ay hindi na magti-trigger ng account rotation at sa halip ay ibinabalik sa client. |
| `OMNIROUTE_ROTATE_429_THRESHOLD` | `1` | `open-sse/services/rotationConfig.ts` | Bilang ng mga `429` error sa loob ng `OMNIROUTE_ROTATE_429_WINDOW_SECONDS` na kinakailangan bago i-rotate ang account. Ang `1` (default) ay nagro-rotate kaagad, na pinananatili ang nakagawiang behavior. |
| `OMNIROUTE_ROTATE_429_WINDOW_SECONDS` | `120` | `open-sse/services/rotationConfig.ts` | Sliding window (mga segundo) kung saan binibilang ang mga `429` error para sa `OMNIROUTE_ROTATE_429_THRESHOLD`. |
| `OMNIROUTE_ROTATE_ON_500` | `true` | `open-sse/services/rotationConfig.ts` | Pag-enable ng fallback bawat status para sa mga `5xx` server error (hindi kasama ang `502`, na may sariling class). Kapag `false`, ang mga error na ito ay hindi na magti-trigger ng account rotation. |
| `OMNIROUTE_ROTATE_500_THRESHOLD` | `1` | `open-sse/services/rotationConfig.ts` | Bilang ng mga `5xx` error sa loob ng `OMNIROUTE_ROTATE_500_WINDOW_SECONDS` na kinakailangan bago i-rotate ang account. Ang `1` (default) ay nagro-rotate kaagad. |
| `OMNIROUTE_ROTATE_500_WINDOW_SECONDS` | `120` | `open-sse/services/rotationConfig.ts` | Sliding window (mga segundo) kung saan binibilang ang mga error na `5xx` para sa `OMNIROUTE_ROTATE_500_THRESHOLD`. |
| `OMNIROUTE_ROTATE_ON_502` | `true` | `open-sse/services/rotationConfig.ts` | Paganahin ang per-status na fallback para sa mga error na `502` (bad gateway). Kapag `false`, ang mga `502` ay hindi na magti-trigger ng account rotation. |
| `OMNIROUTE_ROTATE_502_THRESHOLD` | `1` | `open-sse/services/rotationConfig.ts` | Bilang ng mga error na `502` sa loob ng `OMNIROUTE_ROTATE_502_WINDOW_SECONDS` na kinakailangan bago ma-rotate ang account. Ang `1` (default) ay nagro-rotate kaagad. |
| `OMNIROUTE_ROTATE_502_WINDOW_SECONDS` | `120` | `open-sse/services/rotationConfig.ts` | Sliding window (mga segundo) kung saan binibilang ang mga error na `502` para sa `OMNIROUTE_ROTATE_502_THRESHOLD`. |
| `OMNIROUTE_ROTATE_ON_400` | `false` | `open-sse/services/rotationConfig.ts` | Opt-in (default na OFF): kapag `true`, ang isang plain na `400` (bad request) ay magti-trigger din ng account rotation. Ito ay additive lamang — hindi nito kailanman hinahadlangan ang umiiral na behavior ng engine kung saan ang isang `400` na may dalang rate-limit/quota na text ay nagfa-fall over pa rin anuman ang flag na ito. |
| `OMNIROUTE_ROTATE_400_THRESHOLD` | `1` | `open-sse/services/rotationConfig.ts` | Bilang ng mga error na `400` sa loob ng `OMNIROUTE_ROTATE_400_WINDOW_SECONDS` na kinakailangan bago ma-rotate ang account (tinutukoy lamang kapag `OMNIROUTE_ROTATE_ON_400=true`). |
| `OMNIROUTE_ROTATE_400_WINDOW_SECONDS` | `120` | `open-sse/services/rotationConfig.ts` | Sliding window (mga segundo) kung saan binibilang ang mga error na `400` para sa `OMNIROUTE_ROTATE_400_THRESHOLD`. |
### Scheduler ng Claude Warmup
Warmup na pinapatakbo ng cron para sa mga naka-opt-in na Anthropic OAuth connection, para ang 5-oras na rate-limit window ay mabuksan ng isang maliit na naka-iskedyul na request sa halip na sa unang tunay na request (#8848). Ang scheduler ay naka-off maliban kung ang `OMNIROUTE_WARMUP_ENABLED` ay truthy **at** ang connection ay naka-flag sa `settings.claudeWarmup.connections`; ang walang laman na listahan ng mga connection ay nangangahulugang walang nai-warmup kahit naka-on ang env var.
| Variable | Default | Source File | Paglalarawan |
| ------------------------------ | ---------------------------- | ---------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `OMNIROUTE_WARMUP_ENABLED` | _(walang nakatakda → patay)_ | `src/lib/warmupScheduler.ts` | Pangunahing switch para sa warmup scheduler. Tumatanggap ng `1`/`true`/`yes`/`on` (case-insensitive, tinanggal ang mga espasyo). Anumang ibang halaga, o kapag walang nakatakda, ay nag-iiwan sa scheduler na patay. |
| `OMNIROUTE_WARMUP_CRON` | `0 7 * * *` | `src/lib/warmupScheduler.ts` | Limang-field na cron expression para sa warmup tick, sinusuri sa `America/Los_Angeles` (reset timezone ng Anthropic) anuman ang orasan ng host. |
| `OMNIROUTE_WARMUP_CONCURRENCY` | `3` | `src/lib/warmupScheduler.ts` | Ilang koneksyon ang pina-painit nang sabay-sabay bawat tick. Nililimitahan sa `1`-`10`; ang hindi numerikong halaga ay babalik sa `3`. |
| `OMNIROUTE_WARMUP_MODEL` | `claude-3-5-haiku-20241022` | `src/lib/warmupScheduler.ts` | Modelong ginagamit para sa warmup request. I-override lamang kung ang default ay hindi available sa iyong plan; piliin ang pinakamurang modelo na nagbubukas pa rin ng window. |
### Mga Browser-Login VNC Session at Data-Dir Alias
Naka-containerize na Chromium+VNC na ginagamit para sa interactive na pagkuha ng browser-login credential (`/api/vnc-session`), kasama ang isang legacy `DATA_DIR` alias. Lahat opsyonal — ang mga VNC default ay nakatuon sa kasamang `omniroute-vnc-chromium:local` image at ini-override lamang para sa custom na container image, mga port, o lifecycle tuning.
| Variable | Default | Source File | Paglalarawan |
| ------------------------------------- | ------------------------------------------------------------------------ | ------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `OMNIROUTE_VNC_IMAGE` | `omniroute-vnc-chromium:local` | `src/lib/vncSession/manifest.ts` | Docker image tag para sa Chromium+VNC login container. I-build ang `docker/vnc-browser/chromium` o ituro ito sa isang custom na image. |
| `OMNIROUTE_DOCKER_BIN` | `docker` | `src/lib/vncSession/manifest.ts` | Container runtime binary na ginagamit para ilunsad ang VNC container (hal. itakda sa `podman`). |
| `OMNIROUTE_VNC_CONTAINER_VNC_PORT` | `3000` | `src/lib/vncSession/manifest.ts` | VNC/noVNC port na nakalantad sa loob ng container. |
| `OMNIROUTE_VNC_CONTAINER_CDP_PORT` | `9223` | `src/lib/vncSession/manifest.ts` | Chrome DevTools Protocol port sa loob ng container. |
| `OMNIROUTE_VNC_CONTAINER_PROFILE_DIR` | `/config` | `src/lib/vncSession/manifest.ts` | Path ng Chromium profile directory sa loob ng container. |
| `OMNIROUTE_VNC_PROFILE_DIR` | `$HOME/.omniroute/browser-login-profiles` | `src/lib/vncSession/manifest.ts` | Host directory na naglalaman ng mga naka-persist na browser-login profile. |
| `OMNIROUTE_VNC_IDLE_MS` | `600000` (10 minuto) | `src/lib/vncSession/manifest.ts` | Idle timeout (ms) bago tanggalin ang isang hindi aktibong VNC session. |
| `OMNIROUTE_VNC_MAX_MS` | `1800000` (30 minuto) | `src/lib/vncSession/manifest.ts` | Mahigpit na hangganan (ms) sa tagal ng buhay ng isang VNC session. |
| `OMNIROUTE_VNC_MAX_SESSIONS` | `4` | `src/lib/vncSession/manifest.ts` | Pinakamataas na bilang ng magkakasabay na VNC session. |
| `OMNIROUTE_VNC_READY_MS` | `45000` | `src/lib/vncSession/manifest.ts` | Timeout (ms) sa paghihintay na maging CDP-ready ang naka-containerize na browser. |
| `OMNIROUTE_VNC_HARVEST_MS` | `20000` | `src/lib/vncSession/manifest.ts` | Timeout (ms) para sa pagkuha ng nakuhang session/cookies pagkatapos makumpleto ang login. |
| `OMNIROUTE_VNC_CHROMIUM_ARGS` | `--remote-debugging-port=9222 --no-first-run --no-default-browser-check` | `src/lib/vncSession/manifest.ts` | Mga karagdagang command-line flag na ipinapasa sa naka-containerize na Chromium. |
| `OMNIROUTE_VNC_NETWORK` | `omniroute-vnc-browser-login` | `src/lib/vncSession/manifest.ts` | Dedikadong Docker network na sinalihan ng VNC login container (#12571) sa halip na ang default na bridge, para hindi maabot ng mga sibling container ang CDP bridge port nito. |
| `VIBEPROXY_DATA_DIR` | _(walang nakatakda)_ | `open-sse/services/notionThreadSessions.ts` | **Legacy alias** para sa `DATA_DIR`, tinitingnan lamang matapos na parehong walang nakatakda ang `DATA_DIR` at `OMNIROUTE_DATA_DIR`. Hinahanap ang Notion web-thread session cache (`/notion-web-thread-sessions.json`). |
---
## 26. Harness ng Test at E2E
Ginagamit ng `scripts/dev/run-next-playwright.mjs`, `scripts/dev/smoke-electron-packaged.mjs`,
`scripts/dev/run-ecosystem-tests.mjs`, at `scripts/build/uninstall.mjs`. Iwanang hindi
nakatakda ang bawat halaga sa ibaba sa mga production deployment.
| Variable | Default | Pinagmulang File | Paglalarawan |
| -------------------------------------- | ------------------------------------ | ----------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `OMNIROUTE_E2E_BOOTSTRAP_MODE` | `auth` | `scripts/dev/run-next-playwright.mjs` | E2E bootstrap mode (`auth`, `fresh`, `reuse`) para sa Playwright runner. |
| `OMNIROUTE_E2E_PASSWORD` | nagfa-fallback sa `INITIAL_PASSWORD` | `scripts/dev/run-next-playwright.mjs` | Password ng admin na ini-inject sa environment ng Playwright. |
| `OMNIROUTE_DISABLE_LOCAL_HEALTHCHECK` | `true` | `scripts/dev/run-next-playwright.mjs` | I-disable ang lokal na healthcheck poll habang tumatakbo ang Playwright. |
| `OMNIROUTE_DISABLE_TOKEN_HEALTHCHECK` | `true` | `scripts/dev/run-next-playwright.mjs` | I-disable ang OAuth token healthcheck loop sa panahon ng mga pagsusuri. |
| `OMNIROUTE_HEALTHCHECK_SKIP_PROVIDERS` | _(hindi nakatakda)_ | `src/lib/tokenHealthCheck.ts` | Mga provider na pinaghihiwalay ng kuwit na hindi isasama sa proactive token-refresh sweep (hal. `codex,openai`). Tukoy na alternatibo sa ganap na pag-disable ng healthcheck — patuloy na nagre-refresh ang mga short-TTL provider habang nananatiling reactive-only ang mga cascade provider. |
| `OMNIROUTE_HIDE_HEALTHCHECK_LOGS` | `true` | `scripts/dev/run-next-playwright.mjs` | Patahimikin ang ingay ng healthcheck sa stdout ng Playwright. |
| `OMNIROUTE_PLAYWRIGHT_SKIP_BUILD` | `0` | `scripts/dev/run-next-playwright.mjs` | Laktawan ang Next.js production build bago magsimula ang Playwright (CI optimization). |
| `OMNIROUTE_SKIP_UNINSTALL_HOOK` | `0` | `scripts/build/uninstall.mjs` | Laktawan ang uninstall hook ng OmniRoute (ginagamit ng CI upang panatilihing buo ang `node_modules`). |
| `ECOSYSTEM_SERVER_WAIT_MS` | `180000` | `scripts/dev/run-ecosystem-tests.mjs` | Oras ng paghihintay (ms) para maging healthy ang server bago patakbuhin ang mga pagsusuri sa ecosystem/protocol. |
| `ELECTRON_SMOKE_URL` | `http://127.0.0.1:20128/login` | `scripts/dev/smoke-electron-packaged.mjs` | URL na inaasahan ng Electron smoke harness na ise-serve ng packaged app. |
| `ELECTRON_SMOKE_TIMEOUT_MS` | `45000` | `scripts/dev/smoke-electron-packaged.mjs` | Kabuuang timeout (ms) bago sumuko ang smoke harness. |
| `ELECTRON_SMOKE_SETTLE_MS` | `2000` | `scripts/dev/smoke-electron-packaged.mjs` | Settle window (ms) pagkatapos mag-load ng pahina. |
| `ELECTRON_SMOKE_APP_EXECUTABLE` | _(awtomatiko)_ | `scripts/dev/smoke-electron-packaged.mjs` | Tiyak na path sa packaged Electron executable. |
| `ELECTRON_SMOKE_DATA_DIR` | _(tmpdir)_ | `scripts/dev/smoke-electron-packaged.mjs` | Data directory para sa pagpapatakbo ng Electron smoke. |
| `ELECTRON_SMOKE_KEEP_DATA` | `0` | `scripts/dev/smoke-electron-packaged.mjs` | Itakda ang `1` upang panatilihin ang smoke data directory pagkatapos ng pagtakbo. |
| `ELECTRON_SMOKE_STREAM_LOGS` | `0` | `scripts/dev/smoke-electron-packaged.mjs` | Itakda ang `1` upang i-stream ang mga Electron log sa stdout habang tumatakbo. |
| `ELECTRON_SMOKE_COLD_RESTART` | `0` | `scripts/dev/smoke-electron-packaged.mjs` | #7592: muling ilunsad gamit ang parehong data dir at tiyakin na ang ikalawang paglunsad ay pumipili ng native na SQLite driver. |
| `CLI_DEVIN_BIN` | _(paghahanap sa PATH)_ | `open-sse/executors/devin-cli.ts` | I-override ang path ng Devin CLI binary. |
### Pipeline ng pagsasalin ng docs
Ginagamit ng `scripts/i18n/run-translation.mjs` (ang `npm run i18n:run` na command).
Ang lahat ng anim na variable ay hindi nakatakda bilang default — itakda ang mga ito sa `.env`
lamang sa mga machine na dapat may kakayahang patakbuhin ang docs translator.
| Variable | Default | Source File | Paglalarawan |
| ---------------------------------------- | ------------------- | ---------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `OMNIROUTE_TRANSLATION_API_URL` | _(hindi nakatakda)_ | `scripts/i18n/run-translation.mjs` | OpenAI-compatible na base URL para sa translation backend. |
| `OMNIROUTE_TRANSLATION_API_KEY` | _(hindi nakatakda)_ | `scripts/i18n/run-translation.mjs` | Bearer token para sa translation backend (hindi kailanman naka-log). |
| `OMNIROUTE_TRANSLATION_MODEL` | _(hindi nakatakda)_ | `scripts/i18n/run-translation.mjs` | Model id, hal. `gpt-4o-mini` o `cx/gpt-5.4-mini`. |
| `OMNIROUTE_TRANSLATION_FALLBACK_MODELS` | _(hindi nakatakda)_ | `scripts/i18n/lib/translate-backend.mjs` | Opsyonal na comma-separated na model chain na sinusubukan nang sunud-sunod kapag nabigo ang pangunahing model (429 quota, 401/402, 5xx, timeout, network); ang malformed na request (400/413/422) ay hindi na muling sinusubukan sa iba. |
| `OMNIROUTE_TRANSLATION_TIMEOUT_MS` | `60000` | `scripts/i18n/run-translation.mjs` | Timeout bawat request sa milliseconds. |
| `OMNIROUTE_TRANSLATION_REASONING_EFFORT` | _(hindi nakatakda)_ | `scripts/i18n/lib/translate-backend.mjs` | Opsyonal na reasoning control, ipinapadala nang as-is sa backend kapag nakatakda. |
| `OMNIROUTE_TRANSLATION_CONCURRENCY` | `4` | `scripts/i18n/run-translation.mjs` | Magkakahilera na mga translation request kapag tumatakbo sa maraming file / locale. |
---
## 27. Radar Feed (Sariling Pagho-host)
Opsyonal na add-on na kinokontrol ng RADAR_ENABLED feature flag (naka-off bilang default — isang feature
flag na binabago sa pamamagitan ng Settings/DB, hindi isang env var; tingnan ang
[docs/frameworks/RADAR.md](../frameworks/RADAR.md#flag-radar_enabled-default-off)).
Ang unang apat na variable sa ibaba ay mga opsyonal na override para sa isang sariling hino-host o forked na feed at
mga daloy ng supporter key. Ang ikalima, `RADAR_ADMIN_URL`, ay isang hiwalay na link na walang default papunta sa
pribadong operations panel ng may-ari. Tingnan ang [docs/frameworks/RADAR.md](../frameworks/RADAR.md) para sa kumpletong
dokumentasyon ng module at sa
[end-to-end na pagkakasunod-sunod ng pag-activate at ginabayang pag-setup](../frameworks/RADAR.md#end-to-end-activation-and-guided-setup).
Ang generic na reader ng anunsyo sa Home/Changelog ay hindi kino-configure ng isang environment
variable at hindi nakadepende sa RADAR_ENABLED feature flag. Binabasa nito ang pampublikong repository
na `news.json` URL na idineklara sa `src/shared/utils/releaseNotes.ts` gamit lamang ang
GET; nananatili sa lokal na storage ng browser ang mga dismissal ID.
| Variable | Default | Source File | Paglalarawan |
| ----------------------------- | -------------------------------------------- | ------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| `RADAR_FEED_URL` | `https://radar.omniroute.online` | `src/lib/radar/{sync,referralsSync,offersSync,intelSync}.ts` | Base URL na pinagsasaluhan ng magkakahiwalay na nilagdaang catalog, referrals, supporter-offers, at Intel feed. I-override upang ituro sa isang sariling hino-host o forked na serbisyo. |
| `RADAR_FEED_PUBKEY` | _(naka-pin na default na key)_ | `src/lib/radar/pinnedKeys.ts` | Ed25519 public key (base64-DER SPKI o PEM) na ginagamit upang beripikahin ang mga lagda ng feed mula sa isang custom na feed. |
| `RADAR_CONTRIBUTOR_CLAIM_URL` | `https://radar.omniroute.online/auth/github` | `src/lib/radar/links.ts` | URL na binubuksan ng button na "Contributor ako" sa dashboard (daloy ng pag-claim ng supporter key gamit ang GitHub OAuth). |
| `RADAR_SUPPORTER_PLANS_URL` | `https://radar.omniroute.online/planos` | `src/lib/radar/links.ts` | URL na binubuksan ng button na "Suportahan ang proyekto" sa dashboard (pahina ng pagbabayad/mga plano). |
| `RADAR_ADMIN_URL` | _(hindi nakatakda)_ | `src/lib/radar/links.ts` | Pribadong link ng operations panel para lamang sa may-ari. Kinakailangan ang HTTPS maliban sa isang HTTP loopback SSH forward; hindi gumagawa ng navigation item ang mga hindi nakatakda o invalid na value. |
---
## Audit: Mga Inalis / Hindi Na Ginagamit na Variable
Lumitaw ang mga sumusunod na variable sa mga nakaraang bersyon ng `.env.example` ngunit **walang runtime reference** sa kasalukuyang codebase. Inalis na ang mga ito:
| Variable | Dahilan |
| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `STORAGE_DRIVER=sqlite` | Hindi kailanman binabasa ng anumang source file. SQLite lang ang sinusuportahang driver — hindi kailangan ang pagpili. |
| `INSTANCE_NAME=omniroute` | Makikita sa mga lumang dokumento/env template ngunit hindi ginagamit sa runtime. Maaaring ibalik sa isang feature para sa maraming instance sa hinaharap. |
| `SQLITE_MAX_SIZE_MB=2048` | Hindi nire-reference sa source code. Hindi artipisyal na nililimitahan ang laki ng database. |
| `SQLITE_CLEAN_LEGACY_FILES=true` | Hindi nire-reference sa source code. Malamang na inalis na ang paglilinis ng mga legacy file. |
| `CLI_ROO_BIN` | Hindi nakarehistro sa `src/shared/services/cliRuntime.ts`. |
| `CLI_KIMI_CODING_BIN` | Hindi nakarehistro sa `src/shared/services/cliRuntime.ts` (gumagamit ang Kimi Coding ng OAuth, hindi ng CLI binary). |
| `IFLOW_OAUTH_CLIENT_ID` / `IFLOW_OAUTH_CLIENT_SECRET` | Hindi nire-reference saanman sa source code. |
| `CEREBRAS_API_KEY` / `COHERE_API_KEY` / `FIREWORKS_API_KEY` / `GROQ_API_KEY` / `MISTRAL_API_KEY` / `NEBIUS_API_KEY` / `PERPLEXITY_API_KEY` / `TOGETHER_API_KEY` / `XAI_API_KEY` | Inalis sa v3.8.0. Hindi na binabasa ng runtime ang mga env var na ito — nagmumula ang mga credential sa Dashboard / `data/provider-credentials.json` / naka-encrypt na DB. |
| `CURSOR_PROTOBUF_DEBUG` | Inalis sa v3.8.0. Ginagamit ng Cursor executor ang `CURSOR_DEBUG` / `CURSOR_STREAM_DEBUG` (tingnan ang §22). |
| `CLI_COMPAT_KIRO` | Inalis sa v3.8.0. Kasama ang Kiro sa `CLI_COMPAT_OMITTED_PROVIDER_IDS` — walang epekto ang toggle nito. |
| `QIANFAN_API_KEY` | Inalis kasama ng iba pang hindi ginagamit na stub ng provider API key sa v3.8.0. |
### Mga Pagwawasto sa Default na Value
| Variable | Lumang Value sa `.env.example` | Aktuwal na Default sa Code | Pagwawasto |
| ------------------------- | ------------------------------ | -------------------------- | ------------------------------------------------------------------- |
| `APP_LOG_RETENTION_DAYS` | `90` | `7` | ✅ Inalis ang mapanlinlang na value; idinokumentong `7` ang default |
| `CALL_LOG_RETENTION_DAYS` | `90` | `7` | ✅ Inalis ang mapanlinlang na value; idinokumentong `7` ang default |
### Muling pagbuo ng config ng OpenCode (ad-hoc na tooling)
Ginagamit ng `scripts/ad-hoc/regen-opencode-config.ts` upang muling bumuo ng `opencode.json`
na may mga tumpak na value ng `limit.context` at `limit.output` na kinukuha mula sa tumatakbong
instance ng OmniRoute. Wala sa mga ito ang kinakailangan para sa normal na operasyon — para
lamang sa mga developer ang script na ito.
| Variable | Default | Source File | Paglalarawan |
| ------------------ | ------------------------ | ----------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `OMNIROUTE_URL` | `http://localhost:20128` | `scripts/ad-hoc/regen-opencode-config.ts` | Base URL ng instance ng OmniRoute na kukunan ng `/v1/models`. |
| `OMNIROUTE_KEY` | _(hindi nakatakda)_ | `scripts/ad-hoc/regen-opencode-config.ts` | API key para mag-authenticate sa endpoint na `/v1/models` ng OmniRoute. Gagamitin ang `OPENCODE_API_KEY` bilang fallback kapag hindi ito nakatakda. |
| `OPENCODE_API_KEY` | _(hindi nakatakda)_ | `scripts/ad-hoc/regen-opencode-config.ts` | OpenCode-style API key (`sk-...`) na isinusulat sa muling nabuong `opencode.json`. Gagamitin ang `OMNIROUTE_KEY` bilang fallback kapag hindi ito nakatakda. |
### Offline-eval harness ng compression (ad-hoc na tooling)
Ginagamit ng `scripts/compression-eval/index.ts`, ang offline compression evaluation CLI.
Hindi kinakailangan para sa normal na operasyon — tooling lamang para sa developer.
| Variable | Default | Source File | Paglalarawan |
| ---------------------------- | ------------------- | ----------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| `OMNIROUTE_EVAL_CREDENTIALS` | `{}` (walang laman) | `scripts/compression-eval/index.ts` | Mga JSON credential na ibinigay ng operator para sa provider na sinusubukan ng offline compression-eval CLI (pina-parse gamit ang `JSON.parse`). Huwag itakda para sa dry run. |
### Mga VNC Browser Session
Ginagamit ng `src/lib/vncSession/manifest.ts` upang i-configure ang mga Docker-based na headless Chromium session para sa mga browser-automation provider. Opsyonal ang lahat — ipinapakita sa ibaba ang mga default.
| Variable | Default | Source File | Paglalarawan |
| ------------------------------------- | ------------------------------ | ------------------------------------------- | ----------------------------------------------------------------------------------------- |
| `OMNIROUTE_DOCKER_BIN` | `docker` | `src/lib/vncSession/manifest.ts` | Path patungo sa Docker binary na ginagamit upang gumawa ng mga VNC container. |
| `OMNIROUTE_VNC_IMAGE` | `omniroute-vnc-chromium:local` | `src/lib/vncSession/manifest.ts` | Docker image para sa VNC Chromium container. |
| `OMNIROUTE_VNC_CHROMIUM_ARGS` | _(mga built-in na flag)_ | `src/lib/vncSession/manifest.ts` | Mga karagdagang Chromium CLI argument na ipinapasa sa browser sa loob ng container. |
| `OMNIROUTE_VNC_CONTAINER_VNC_PORT` | `3000` | `src/lib/vncSession/manifest.ts` | VNC port sa loob ng container. |
| `OMNIROUTE_VNC_CONTAINER_CDP_PORT` | `9223` | `src/lib/vncSession/manifest.ts` | Chrome DevTools Protocol port sa loob ng container. |
| `OMNIROUTE_VNC_CONTAINER_PROFILE_DIR` | `/config` | `src/lib/vncSession/manifest.ts` | Directory ng profile sa loob ng container. |
| `OMNIROUTE_VNC_PROFILE_DIR` | _(hindi nakatakda)_ | `src/lib/vncSession/manifest.ts` | Directory sa panig ng host para sa mga persistent na browser profile. |
| `OMNIROUTE_VNC_IDLE_MS` | `600000` | `src/lib/vncSession/manifest.ts` | Idle timeout (ms) bago i-harvest ang isang VNC session. |
| `OMNIROUTE_VNC_MAX_MS` | `1800000` | `src/lib/vncSession/manifest.ts` | Pinakamahabang tagal ng session (ms). |
| `OMNIROUTE_VNC_MAX_SESSIONS` | `4` | `src/lib/vncSession/manifest.ts` | Pinakamaraming magkakasabay na VNC session. |
| `OMNIROUTE_VNC_READY_MS` | `45000` | `src/lib/vncSession/manifest.ts` | Timeout sa paghihintay na maging handa ang browser (ms). |
| `OMNIROUTE_VNC_HARVEST_MS` | `20000` | `src/lib/vncSession/manifest.ts` | Timeout sa pag-harvest/paglilinis (ms). |
| `OMNIROUTE_VNC_NETWORK` | `omniroute-vnc-browser-login` | `src/lib/vncSession/manifest.ts` | Nakalaang Docker network na sinasalihan ng container (#12571), hiwalay sa default bridge. |
| `VIBEPROXY_DATA_DIR` | _(hindi nakatakda)_ | `open-sse/services/notionThreadSessions.ts` | Directory para sa persistence ng Notion thread session. |
### Authentication ng internal service
| Variable | Default | Paglalarawan |
| --------------------------------------- | ------- | -------------------------------------------------------------------------------------------------------------------------------------- |
| `OMNIROUTE_INTERNAL_SERVICE_TOKEN` | – | Inline token para sa service-to-service authentication ng management plane. |
| `OMNIROUTE_INTERNAL_SERVICE_TOKEN_FILE` | – | Path patungo sa file na naglalaman ng internal service token (inirerekomenda sa mga container; ino-override nito ang inline variable). |
### Mga stats ng OpenRouter provider
| Variable | Default | Paglalarawan |
| ----------------------------------- | --------- | ------------------------------------------------------------------------------------------------------------------------------- |
| `OPENROUTER_PROVIDER_STATS_ENABLED` | `true` | Itakda sa `false` upang laktawan ang pagkuha ng mga stats ng OpenRouter para sa bawat provider para sa pagpapayaman ng catalog. |
| `OPENROUTER_PROVIDER_STATS_TTL_MS` | `3600000` | Cache TTL (ms) para sa mga nakuhang stats ng OpenRouter provider. |
### Naka-embed na Redis binding
| Variable | Default | Paglalarawan |
| --------------------------- | ----------- | ---------------------------------------------------------------------------- |
| `REDIS_BIND_HOST` | `127.0.0.1` | Bind address para sa naka-embed na serbisyo ng Redis. |
| `REDIS_PORT` | `6379` | Port para sa naka-embed na serbisyo ng Redis. |
| `OMNIROUTE_REDIS_BIND_HOST` | – | Override na saklaw ng OmniRoute para sa bind address ng naka-embed na Redis. |
---
## 24. Mga dagdag sa Release v3.8.50
Ang mga setting na ito ay ipinakilala pagkatapos ng nakaraang environment-contract snapshot.
| Variable | Default | Source File | Deskripsyon |
| ------------------------------------------- | -------------------------- | ---------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `OMNIROUTE_CHAT_ADMISSION_QUEUE_MS` | `2000` | `src/shared/middleware/chatBodyAdmission.ts` | Pinakamataas na paghihintay para sa isang heavyweight na chat admission slot bago ang isang retryable na `503`; ang maikling may hangganang paghihintay ay nagse-serialize ng mga burst ng ahente sa halip na agarang `503`. Ang `0` ay nagbabalik ng agarang pagtanggi. |
| `OMNIROUTE_CHAT_ADMISSION_MAX_QUEUED_BYTES` | `4194304` (4 MB) | `src/shared/middleware/chatBodyAdmission.ts` | Badyet ng naka-queue na bytes para sa admission wait: nililimitahan ang kabuuang naka-buffer na body bytes na nakaparada sa buong proseso upang ang paghihintay ay hindi makapagpalaki ng heap (#4380). Ang mga paghihintay na lampas sa badyet ay kaagad na tumatanggap ng retryable na `503`. |
| `OMNIROUTE_CHAT_VIRTUAL_TTL_MS` | `60000` (60 s) | `src/shared/middleware/chatBodyAdmission.ts` | Deprecated na no-op mula #10110: inalis ang mga per-session na admission lane pabor sa isang process-wide na badyet. Tinatanggap para sa compatibility ng konfigurasyon; binabalewala. |
| `OMNIROUTE_CHAT_VIRTUAL_MAX_SESSIONS` | `64` | `src/shared/middleware/chatBodyAdmission.ts` | Deprecated na no-op mula #10110: inalis ang mga per-session na admission lane pabor sa isang process-wide na badyet. Tinatanggap para sa compatibility ng konfigurasyon; binabalewala. |
| `OMNIROUTE_CHAT_VIRTUAL_LANES` | `0` (naka-off) | `open-sse/services/admission/runtime.ts` | Mga adaptive runtime virtual admission lane (#9654): master switch para sa per-tenant adaptive gate (system 2). Naiiba sa mga deprecated na per-connection lane variable sa itaas (TTL_MS / MAX_SESSIONS, mga no-op mula #10110). Dashboard feature flag na may parehong pangalan; ang env var ang nananaig laban sa dashboard override; nangangailangan ng restart. |
| `OMNIROUTE_RUNNOW_TIMEOUT_MS` | `30000` | `src/app/api/jobs/[id]/run-now/route.ts` | Nililimitahan kung gaano katagal maghihintay ang isang run-now na tawag para sa isang in-flight na trabaho bago simulan ang naka-queue na run. |
| `ADOBE_FIREFLY_BROWSER_REFRESH` | naka-enable | `open-sse/services/adobeFireflySession.ts` | Pinapanatiling sariwa ang IMS at browser-risk na estado sa pamamagitan ng mga account-scoped na Chrome CDP session; itakda ang `0` para i-disable. |
| `ADOBE_FIREFLY_SESSION_DISK` | naka-enable | `open-sse/services/adobeFireflySession.ts` | Pinananatili ang mga na-repair na Adobe session sa ilalim ng `DATA_DIR`; itakda ang `0` para sa memory-only na estado. |
| `ADOBE_FIREFLY_MIN_SUBMIT_GAP_MS` | `12000` | `open-sse/services/adobeFireflySession.ts` | Pinakamababang agwat sa pagitan ng mga Adobe Firefly generate submission. |
| `ADOBE_FIREFLY_BATCH_EXTRA_GAP_MS` | `15000` | `open-sse/services/adobeFireflySession.ts` | Karagdagang panahon ng katahimikan pagkatapos ng bawat ikatlong matagumpay na Adobe submission. |
| `ADOBE_FIREFLY_CHROME_HEADLESS` | `0` | `open-sse/services/adobeFireflyBrowserLogin.ts` | Debug-only na true-headless mode; karaniwang tinatanggihan ng Adobe colligo ang nagresultang risk session. |
| `CHROME_PATH` | awtomatikong pagtukoy | `open-sse/executors/cloudflare-playground.ts`, `open-sse/executors/chatgpt-web-codex.ts` | Opsyonal na absolute na Chrome executable na ginagamit ng mga browser-driven na executor kapag hindi sapat ang platform auto-detection. |
| `TELEGRAM_BOT_TOKEN` | _(hindi nakatakda)_ | `src/lib/telegram/config.ts` | BotFather token na nag-e-enable ng inbound webhook at pumipirma sa Mini App `initData`. |
| `TELEGRAM_WEBHOOK_SECRET` | _(hindi nakatakda)_ | `src/lib/telegram/config.ts` | Shared secret na nakarehistro sa pamamagitan ng `setWebhook` at bine-verify laban sa `X-Telegram-Bot-Api-Secret-Token` header sa bawat webhook delivery. Kinakailangan para sa webhook path; ang hindi pagkakatakda ay nangangahulugang ang mga webhook delivery ay tinatanggihan na may 503. |
| `TELEGRAM_DEFAULT_MODEL` | `auto/chat` | `src/lib/telegram/chatProxy.ts` | Model na ginagamit para sa mga sagot sa Telegram chat. |
| `TELEGRAM_BOT_API_BASE` | `https://api.telegram.org` | `src/lib/telegram/config.ts` | Bot API base URL override para sa mga proxy o self-hosted na Bot API server. |
| `TELEGRAM_WEBHOOK_TIMEOUT_MS` | `60000` | `src/lib/telegram/config.ts` | Timeout sa milliseconds para sa mga outbound na Bot API call. |
| `OMNIROUTE_OPTIONAL_PACK_TAR` | `1` (naka-enable) | `scripts/build/optionalPackStaging.mjs` | Itakda ang `0` para laktawan ang pag-emit ng mga `.tar.gz` tarball habang nag-i-stage ng mga opsyonal na ML/browser pack para sa Electron standalone tree (ang mga pack directory at `optional-packs.index.json` ay ginagawa pa rin). Ginagamit ng desktop release workflow para bawasan ang laki ng artifact upload. |
| `GROK_SUBSCRIPTION_IMAGES_ENABLED` | `false` | `open-sse/config/imageRegistry.ts` | Nag-e-enable ng registration ng mga xAI subscription image route; naka-disable by default upang manatiling hindi nagbabago ang API-key image path. |
| `OMNIROUTE_API_KEY_COOLDOWN_MS` | `60000` | `open-sse/services/apiKeyRotator.ts` | Per-key na cooldown sa milliseconds kapag walang magagamit na `Retry-After` na hint ang isang `429` na tugon. |
| `OMNIROUTE_ESTIMATOR_CALIBRATION` | naka-enable | `open-sse/services/estimatorCalibration.ts` | Itakda sa `off`, `0`, o `false` para i-disable ang in-memory na pagrekord at pag-apply ng estimator calibration. |
| `NEXT_MANUAL_SIG_HANDLE` | _(panloob)_ | `scripts/dev/standalone-server-ws.mjs` | Panloob na standalone-server signal-handler override; karaniwang itinatakda at tinatanggal ng launcher sa halip na i-configure ng mga operator. |
### ChatGPT Web (Codex)
Mga global na default para sa headless browser at ang papalabas na tool tunnel. Ang mga connection value na itinakda sa Dashboard ay may priyoridad.
| Variable | Default | Source File | Paglalarawan |
| --------------------------------------- | ------------------------------ | -------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `CHATGPT_WEB_CODEX_CHROME_PATH` | _(awtomatikong tinutukoy)_ | `open-sse/executors/chatgpt-web-codex.ts` | Explicit na path ng Chrome/Chromium para sa operasyon sa npm, systemd, at PM2. |
| `CHROME_PATH` | _(awtomatikong tinutukoy)_ | `open-sse/executors/chatgpt-web-codex.ts` | Pinagsamang fallback para sa isang explicit na path ng Chrome/Chromium. |
| `CHATGPT_WEB_CODEX_CDP_URL` | _(hindi nakatakda)_ | `open-sse/executors/chatgpt-web-codex.ts` | Panloob na CDP endpoint; ginagamit ng Docker ang sidecar sa port `9223`. |
| `CHATGPT_WEB_CODEX_USE_CDP_PROFILE` | _(hindi nakatakda — patay)_ | `open-sse/vendor/codex-chatgpt-web/persistent-cdp-context.ts` | Itakda sa `1` (na may naka-configure na CDP endpoint) upang muling gamitin ang kasalukuyang ChatGPT page ng panlabas na pinamamahalaan at naka-sign-in na browser profile sa halip na isang hiwalay na context bawat turn; nililimitahan din ang magkakasabay na ChatGPT tab sa 1. Patay bilang default. Tingnan ang [persistent CDP profile](../guides/CHATGPT-WEB-PERSISTENT-CDP.md). |
| `CDP_PROXY_TOKEN` | _(hindi nakatakda)_ | `docker/chatgpt-web-codex-browser/cdp-proxy.mjs` | Kapag nakatakda, kailangang isama ng bawat kahilingan sa CDP proxy sidecar ang halagang ito sa header na `X-Omni-Cdp-Token` (#13679). Kapag walang halaga, magpapasa ang proxy nang walang authentication — sa kasong iyon, ang network isolation ng Compose network na `chatgpt-web-codex-net` lamang ang nagpoprotekta. Gawin gamit ang `openssl rand -hex 32`. |
| `CHATGPT_WEB_CODEX_TUNNEL_ID` | _(hindi nakatakda)_ | `open-sse/executors/chatgpt-web-codex.ts` | Pandaigdigang OpenAI tunnel ID para sa mga lokal na Codex tool round. |
| `CHATGPT_WEB_CODEX_RUNTIME_KEY` | _(hindi nakatakda)_ | `open-sse/executors/chatgpt-web-codex.ts` | Pandaigdigang tunnel runtime key; huwag kailanman ilabas sa mga log. |
| `CHATGPT_WEB_CODEX_CONNECTOR_NAME` | `OmniRoute Codex v2` | `open-sse/executors/chatgpt-web-codex.ts` | Eksaktong pangalan ng bagong likhang ChatGPT custom connector para sa MCP bridge. |
| `CODEX_CHATGPT_WEB_HOME` | `/chatgpt-web-codex` | `open-sse/vendor/codex-chatgpt-web/config.ts` | Nakalaang direktoryo para sa estado ng browser, broker, at tunnel. |
| `CODEX_CHATGPT_WEB_BROWSER_DIAGNOSTICS` | `0` | `open-sse/vendor/codex-chatgpt-web/adapters/chatgpt-web/browser-worker.ts` | Kapag `1`, kukunin ang mga browser diagnostic image sa bawat checkpoint. |
| `CODEX_CHATGPT_WEB_LAUNCHER` | _(hindi nakatakda)_ | `open-sse/vendor/codex-chatgpt-web/config.ts` | Opsyonal na absolutong path sa isang permanenteng launcher binary. |
| `CODEX_CHATGPT_WEB_BUN` | _(awtomatikong tinutukoy)_ | `open-sse/vendor/codex-chatgpt-web/config.ts` | Opsyonal na absolutong path sa Bun runtime binary. |
| `CODEX_WEB_GPT_BUN` | _(hindi nakatakda)_ | `open-sse/vendor/codex-chatgpt-web/config.ts` | Legacy fallback para sa `CODEX_CHATGPT_WEB_BUN`; ang mga bagong setup ay gumagamit ng canonical na pangalan. |
---
## Tulay ng OmniConductor
SSE consumer na may mahabang buhay na nagmimirror ng mga gawain ng OmniConductor hub papunta sa lokal na A2A TaskManager (`src/lib/conductor/`). Opt-in — magsisimula lamang ang tulay kapag nakatakda ang `CONDUCTOR_HUB_URL`. Server-side lamang: ang hub token ay hindi dapat kailanman makarating sa browser.
| Variable | Default | Pinagmulang File | Paglalarawan |
| ------------------------------ | ----------------------- | -------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `CONDUCTOR_HUB_URL` | _(walang laman)_ | `src/lib/conductor/boot.ts` | Base URL ng OmniConductor hub (hal. `http://127.0.0.1:7910`). Kapag hindi nakatakda = naka-disable ang tulay. |
| `CONDUCTOR_HUB_TOKEN` | _(walang laman)_ | `src/lib/conductor/boot.ts` | Kredensyal ng hub para sa SSE feed — mag-emit ng peer na may uring `spokesperson` sa hub (`POST /v1/peers`, admin). |
| `CONDUCTOR_ORCHESTRATOR_TOKEN` | _(walang laman)_ | `src/lib/conductor/hubProxy.ts` | Kredensyal para sa papasok na delegasyon ng gawaing A2A→hub (`POST /v1/tasks`); gagamitin ang `CONDUCTOR_HUB_TOKEN` bilang fallback kapag hindi nakatakda. |
| `CONDUCTOR_SPOKESPERSON_URL` | `http://127.0.0.1:7920` | `src/lib/conductor/faroProxy.ts` | Base URL ng serbisyo ng spokesperson (Faro) sa likod ng chat proxy ng dashboard (`/api/conductor/ask`). |
### Pag-iiskedyul na may kamalayan sa kuota
Ginagamit ng `open-sse/services/combo.ts` at `src/lib/quota/quotaScheduler.ts` para sa mga pagsusuri ng token budget bago ang request. Opt-in — hindi nagbabago ang default na pag-uugali ng routing kapag hindi nakatakda.
| Variable | Default | Pinagmulang File | Paglalarawan |
| ---------------------------------- | ----------- | ------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| `OMNIROUTE_QUOTA_AWARE_ROUTING` | `0` | `open-sse/services/combo.ts` | Kapag `1`, lalaktawan ang mga koneksyon na ang token budget kada window (`rateLimitOverrides.tpm`, talahanayang `provider_quota_state`) ay hindi sapat para sa tinatayang gastos ng request bago i-dispatch. Fail-open kapag walang naka-configure na budget. |
| `OMNIROUTE_ESTIMATOR_CALIBRATION` | _(naka-on)_ | `open-sse/services/estimatorCalibration.ts` | Feedback calibration ng context-guard token estimator (#14931): EMA ng `usage.prompt_tokens` / estimate kada (provider, model, may mga tool na kasama), naka-clamp sa 0.15–2.0, sa memory lamang. Ang `off`, `0` o `false` ay nag-di-disable ng pagrekord at aplikasyon. |
| `GROK_SUBSCRIPTION_IMAGES_ENABLED` | `false` | `open-sse/config/imageRegistry.ts` | Nagrerehistro ng mga image route na `xai-oauth` (`xao`) at `grok-cli`. Dashboard feature flag na may parehong pangalan; mananaig ang DB override sa halagang ito. |