# Environment Variables Reference (Bahasa Melayu)
🌐 **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) · 🇲🇹 [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) · 🇵🇭 [phi](../../../phi/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)
---
> Rujukan lengkap bagi setiap pemboleh ubah persekitaran yang dikenali oleh OmniRoute.
> Untuk templat mula pantas, lihat [`.env.example`](../../.env.example).
> [!IMPORTANT]
> Setiap pemboleh ubah yang didokumentasikan di sini juga mesti terdapat dalam `.env.example`, dan
> setiap pemboleh ubah dalam `.env.example` mesti terdapat di sini. `npm run check:env-doc-sync`
> menguatkuasakan perkara ini semasa komit dan dalam CI. Untuk mengecualikan pemboleh ubah dengan sengaja, tambahkannya pada
> senarai dibenarkan dalam `scripts/check/check-env-doc-sync.mjs`.
---
## Kandungan
- [1. Rahsia yang Diperlukan](#1-required-secrets)
- [2. Storan & Pangkalan Data](#2-storage--database)
- [3. Rangkaian & Port](#3-network--ports)
- [4. Keselamatan & Pengesahan](#4-security--authentication)
- [5. Sanitasi Input & Perlindungan PII](#5-input-sanitization--pii-protection)
- [6. Dasar Alat & Penghalaan](#6-tool--routing-policies)
- [7. URL & Penyegerakan Awan](#7-urls--cloud-sync)
- [8. Proksi Keluar](#8-outbound-proxy)
- [9. Penyepaduan Alat CLI](#9-cli-tool-integration)
- [10. Penyepaduan Ejen Dalaman & MCP](#10-internal-agent--mcp-integrations)
- [11. Kelayakan Penyedia OAuth](#11-oauth-provider-credentials)
- [12. Penggantian User-Agent Penyedia](#12-provider-user-agent-overrides)
- [13. Keserasian Cap Jari CLI](#13-cli-fingerprint-compatibility)
- [14. Penyedia Kunci API](#14-api-key-providers)
- [15. Tetapan Tamat Masa](#15-timeout-settings)
- [16. Pengelogan](#16-logging)
- [17. Pengoptimuman Memori](#17-memory-optimization)
- [18. Penyegerakan Harga](#18-pricing-sync)
- [19. Penyegerakan Model (Pembangunan)](#19-model-sync-dev)
- [20. Tetapan Khusus Penyedia](#20-provider-specific-settings)
- [21. Kesihatan Proksi](#21-proxy-health)
- [22. Penyahpepijatan](#22-debugging)
- [23. Penyepaduan GitHub](#23-github-integration)
- [24. Kotak Pasir Kemahiran (v3.8.0+)](#24-skills-sandbox-v380)
- [27. Suapan Radar (Pengehosan Kendiri)](#27-radar-feed-self-hosting)
- [Senario Penggunaan](#deployment-scenarios)
- [Audit: Pemboleh Ubah yang Dialih Keluar / Tidak Digunakan](#audit-removed--dead-variables)
---
## 1. Rahsia Diperlukan
Rahsia yang belum ditetapkan yang ditandakan **Ya** dijana secara automatik pada jalankan pertama (`JWT_SECRET`, `API_KEY_SECRET`) dan dikekalkan ke `server.env` dalam direktori data — tetapkannya secara eksplisit apabila direktori tersebut bersifat sementara. Pengecualiannya ialah `OMNIROUTE_WS_BRIDGE_SECRET`: ia tidak dikekalkan ke `server.env` — titik masuk pelayan menjana nilai sementara setiap but yang hanya boleh digunakan oleh bridge dalam proses, jadi klien bridge luaran memerlukannya ditetapkan secara eksplisit.
| Pembolehubah | Diperlukan | Lalai | Fail Sumber | Penerangan |
| ---------------------------- | ----------------- | ------------------------ | --------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `JWT_SECRET` | **Ya** | _(tiada)_ | `src/lib/auth` | Menandatangani/mengesahkan semua kuki sesi papan pemuka (JWT). Jana dengan `openssl rand -base64 48`. |
| `API_KEY_SECRET` | **Ya** | _(tiada)_ | `src/lib/db/apiKeys.ts` | Kunci penyulitan AES untuk nilai kunci API semasa disimpan dalam SQLite. Jana dengan `openssl rand -hex 32`. |
| `INITIAL_PASSWORD` | Tidak | _(tidak ditetapkan)_ | `src/lib/auth/managementPassword.ts` | Menetapkan kata laluan papan pemuka semasa permulaan selagi belum ada yang disimpan; diabaikan sebaik sahaja kata laluan disimpan. Pemasangan npm dan sumber menyalin `.env.example` ke `.env`, jadi ia bermula dengan pemegang tempat yang diketahui umum `CHANGEME`: gantikannya sebelum but pertama, atau tetapkan `INITIAL_PASSWORD=` (kosong) dalam `.env` tersebut untuk mencipta kata laluan dalam wizard onboarding pada lawatan pertama, seperti yang dilakukan oleh nilai tidak ditetapkan (lalai imej Docker). Tukar kata laluan yang disimpan di Papan Pemuka → Tetapan → Keselamatan, atau jalankan `omniroute reset-password` (`node bin/reset-password.mjs` dalam checkout sumber) dengan `DATA_DIR` ditetapkan ke direktori data pelayan. |
| `OMNIROUTE_WS_BRIDGE_SECRET` | **Ya** (produksi) | _(tidak ditetapkan)_ | `src/app/api/internal/codex-responses-ws/route.ts` | Rahsia kongsi untuk bridge WebSocket Codex Responses dalaman. Mengesahkan permintaan bridge antara geganti WS Electron/pelayar dan OmniRoute. ⚠️ **DIPERLUKAN dalam produksi — apabila tidak ditetapkan, semua permintaan bridge WS ditolak.** Jana dengan `openssl rand -base64 32`. |
| `OMNIROUTE_SW_BUILD_ID` | Tidak | _(git SHA)_ | `next.config.mjs`, `scripts/build/assembleStandalone.mjs` | ID pemecah cache service-worker eksplisit untuk shell PWA (#11779); yang pertama dalam rantai penyelesaian. |
| `SOURCE_VERSION` | Tidak | _(tidak ditetapkan)_ | `next.config.mjs`, `scripts/build/assembleStandalone.mjs` | Kedua dalam rantai — ditetapkan oleh pembina PaaS (cth. gaya Heroku) sebagai commit yang diterbitkan. |
| `NEXT_PUBLIC_SW_BUILD_ID` | Tidak | _(diperoleh)_ | `src/shared/components/PwaRegister.tsx` | Nilai awam masa binaan yang digunakan klien untuk mendaftarkan `/sw.js?v=…`; diperoleh daripada dua nilai di atas, kemudian git SHA. |
| `OMNIROUTE_PEER_STAMP_TOKEN` | Tidak (automatik) | _(automatik setiap but)_ | `src/server/authz/policies/management.ts` | Rahsia setiap proses yang membuktikan setem IP rakan yang dipercayai datang daripada pelayan HTTP OmniRoute sendiri (`scripts/dev/peer-stamp.mjs`). Middleware authz mempercayai lokaliti permintaan (penggetan loopback/LAN bagi laluan LOCAL_ONLY) hanya apabila setem membawa token ini. Dijana secara automatik setiap but — biarkan tidak ditetapkan; hanya tetapkannya untuk persediaan berbilang proses yang mesti berkongsi setem. |
| `OMNIROUTE_TRUSTED_PROXIES` | Tidak | _(tidak ditetapkan)_ | `scripts/dev/peer-stamp.mjs` | IP atau julat CIDR yang dipisahkan koma bagi proksi songsang yang pengepala `X-Forwarded-For` / `X-Real-IP` mereka boleh dipercayai oleh senarai benar/tolak IP, selain loopback, alamat rangkaian persendirian dan edge Cloudflare, yang sentiasa dipercayai. Diperlukan hanya untuk proksi pada mana-mana alamat awam lain; jika tidak, alamat proksi itu sendiri yang dinilai oleh penapis. Pelembapan setiap klien geganti (`/api/v1/relay/chat/completions`) berkunci pada alamat klien yang sama diselesaikan, tidak pernah pada pengepala pemajuan sahaja. |
### Perintah Penjanaan
```bash
# Jana kesemua empat rahsia sekaligus:
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]
> Jangan sesekali commit fail `.env` yang mengandungi rahsia sebenar ke kawalan versi. `.gitignore` sudah mengecualikan `.env`, tetapi sahkan sebelum push.
---
## 2. Penyimpanan & Pangkalan Data
OmniRoute menggunakan **SQLite** (melalui `better-sqlite3`) untuk semua ketekalan. Pemboleh ubah ini mengawal lokasi data, penyulitan dan kitaran hayat.
| Pemboleh Ubah | Lalai | Fail Sumber | Keterangan |
| ------------------------------------------ | ----------------------------- | ----------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `DATA_DIR` | `~/.omniroute/` | `src/lib/db/core.ts` | Direktori akar untuk DB SQLite, sandaran dan fail data. Tindih untuk volum Docker atau laluan tersuai. |
| `OMNIROUTE_ALLOW_DEFAULT_DATA_DIR` | _(tidak ditetapkan)_ | `src/lib/dataPaths.ts` | Laluan keluar untuk pengawal DATA_DIR ujian/penilaian (#10428). Ujian dan probe eval/print Node (`-e`/`--eval`/`-p`/`--print`, termasuk bentuk `--eval=`/`--print=`) tanpa `DATA_DIR` dialihkan ke direktori sementara buang supaya ia tidak boleh membuka pangkalan data sebenar pengendali; tetapkan kepada `1` untuk memilih semula direktori sebenar. |
| `OMNIROUTE_BUILD_SHA` | _(tidak ditetapkan)_ | `src/lib/monitoring/buildSha.ts` | SHA Git bagi artifak yang sedang berjalan. Dicap oleh `npm run build:release`; boleh disuntik dalam kontena yang dihantar tanpa sentinel `dist/BUILD_SHA`. Dipaparkan sebagai `system.buildSha` pada `/api/monitoring/health`. |
| `OMNIROUTE_RELEASE_REF` | `origin/main` | `scripts/build/buildProvenance.ts` | Ref yang disemak oleh get provenans artifak pek terhadap SHA binaan (#10427). |
| `OMNIROUTE_ALLOW_CANARY_BUILD` | _(tidak ditetapkan)_ | `scripts/build/buildProvenance.ts` | Tetapkan kepada `1` untuk membenarkan pembungkusan binaan yang SHA-nya tiada pada baris keluaran, merekodkannya sebagai canary sengaja dan bukannya menggagalkan get (#10427). |
| `OMNIROUTE_SMOKE_API_KEY` | _(tidak ditetapkan)_ | `scripts/ops/deploy-canary.mjs` | Kunci API untuk probe smoke canary-deploy, dihantar sebagai `Authorization: Bearer` pada `/v1/chat/completions`. Hanya digunakan oleh skrip deploy (#10429), tidak pernah oleh pelayan. Tidak berkaitan dengan pemboleh ubah `OMNIROUTE_SMOKE_*` bagi harness smoke CLI opt-in (`RUN_CLI_SMOKE=1`, `OMNIROUTE_SMOKE_BASE_URL/MODEL/API_KEY_ENV/TARGETS/TIMEOUT_MS` dalam `tests/integration/upstream-cli-smoke.int.test.ts`) — lihat [Integrasi CLI → Sapuan smoke sebenar](../guides/CLI-INTEGRATIONS.md). |
| `OMNIROUTE_BUILDING` | _(tidak ditetapkan)_ | `src/lib/buildPhase.ts` | Isyarat fasa binaan (#10060): ditetapkan kepada `1` oleh `scripts/build/build-next-isolated.mjs` dan diwarisi oleh setiap pekerja binaan yang dijana supaya lapisan DB memulangkan stub no-op dan bukannya memuatkan addon native better-sqlite3 (yang membatalkan pekerja semasa keluar). Jangan sekali-kali ditetapkan untuk pelayan yang sedang berjalan. |
| `OMNIROUTE_SKIP_NATIVE_DEP_CHECK` | `0` | `scripts/check/check-native-deps.mjs` | Tetapkan kepada `1` untuk melangkau pemeriksaan prabina kebergantungan native pilihan bagi pokok vendored eksotik. Ini tidak menjadikan kebergantungan yang hilang boleh dibina; gunakan hanya apabila kebergantungan native dibekalkan di luar jalur. |
| `OMNIROUTE_DATA_DIR` | _(tidak ditetapkan)_ | `open-sse/executors/promptql/threadSticky.ts` | **Alias sandaran** untuk `DATA_DIR`, disemak hanya apabila `DATA_DIR` tidak ditetapkan. Digunakan untuk mencari cache sesi thread-sticky cakera pelaksana PromptQL (`
/promptql-thread-sessions.json`); jika kedua-dua pemboleh ubah tidak ditetapkan, cache kekal dalam memori sahaja (tidak dikekalkan merentas permulaan semula). |
| `OMNIROUTE_PLUGINS_DIR` | _(tidak ditetapkan)_ | `src/lib/plugins/scanner.ts` | Direktori yang dibaca oleh **pengimbas plugin runtime** — dan akar yang dipasang oleh pengurus plugin — menindih lalai terbitan home (#11827). Halakan ke pokok plugin yang dipasang bind dalam Docker/K8s dan bukannya memindahkan HOME semata-mata untuk memindahkan laluan imbasan (HOME juga mengawal setiap tingkah laku lain yang berkaitan home). Tidak ditetapkan = `~/.omniroute/plugins`, atau `/tmp/.omniroute/plugins` apabila proses tidak mengeksport home langsung — ketidakpenemuan senyap yang dibuang oleh pemboleh ubah ini. Direktori yang diselesaikan dilog sekali semasa permulaan sebagai `scanner.dir_resolved` bersama input yang menang. Hanya bahagian pelayan: plugin arahan CLI kekalkan `OMNIROUTE_PLUGIN_PATH` mereka sendiri (bahagian 9). |
| `STORAGE_ENCRYPTION_KEY` | _(kosong = dilumpuhkan)_ | `src/lib/db/encryption.ts` | Kunci AES untuk penyulitan pangkalan data SQLite penuh semasa rehat. Jana dengan `openssl rand -hex 32`. |
| `STORAGE_ENCRYPTION_KEY_VERSION` | `v1` | `scripts/build/bootstrap-env.mjs`, `electron/main.js` | Label versi untuk kunci penyulitan. Naikkan apabila melakukan putaran kunci untuk menyokong penyahsulitan sandaran lama. |
| `DISABLE_SQLITE_AUTO_BACKUP` | `false` | `src/lib/db/backup.ts` | Apabila `true`, melangkau sandaran fail SQLite rutin/pra-tulis (simpanan/penghapusan harga models.dev, penulisan tetapan). Sandaran manual dan pra-pemulihan masih dijalankan. Ia **tidak** melumpuhkan snapshot keselamatan tahan lasak mandatori pelari migrasi atau pengawal migrasi pukal untuk DB berterusan sedia ada. Sandaran bukan manual dihadkan kepada maksimum sekali setiap 60 minit. Papan Pemuka **Tetapan → Storan** boleh melumpuhkan sandaran automatik rutin secara berasingan. |
| `OMNIROUTE_SQLITE_SLOW_MS` | _(tidak ditetapkan/mati)_ | `src/lib/db/adapters/slowDiagnostics.ts` | Milisaat; nilai di bawah 1 atau bukan numerik kekal mati; memberi amaran maksimum sekali setiap 10 saat; baris log hanya mengandungi driver, operation dan elapsedMs. |
| `OMNIROUTE_CRYPT_KEY` | _(tidak ditetapkan)_ | `src/lib/db/encryption.ts` | **Alias legasi** untuk `STORAGE_ENCRYPTION_KEY`. Diterima sebagai gantian apabila pembolehubah utama tiada. |
| `OMNIROUTE_API_KEY_BASE64` | _(tidak ditetapkan)_ | `src/lib/db/encryption.ts` | **Alias legasi** (bentuk dikodkan Base64) diterima sebagai gantian. Dinyahkod secara automatik sebelum digunakan. |
| `OMNIROUTE_DB_HEALTHCHECK_INTERVAL_MS` | _(tidak ditetapkan)_ | `src/lib/db/core.ts` | Gantikan selang semakan kesihatan SQLite berkala (ms). Apabila tidak ditetapkan, nilai lalai diperoleh daripada `NODE_ENV`. |
| `OMNIROUTE_WAL_TRUNCATE_INTERVAL_MS` | _(dikeluarkan)_ | `src/lib/db/walMaintenance.ts` | **Dikeluarkan.** `wal_checkpoint(TRUNCATE)` langsung berkala boleh membatalkan pemetaan wal-index kongsi dan meranahkan proses dengan SIGBUS (#13973), jadi penjadual tidak lagi wujud. Pembolehubah ini lengai: nilai positif merekodkan amaran pengusangan satu kali, manakala `0` atau tidak ditetapkan kekal senyap. WAL diselenggara oleh checkpoint PASSIVE (di bawah) dan dipangkas oleh checkpoint penutupan. |
| `OMNIROUTE_WAL_PASSIVE_INTERVAL_MS` | `300000` (5m) | `src/lib/db/walMaintenance.ts` | Gantikan selang `wal_checkpoint(PASSIVE)` yang kerap (ms). Memastikan bingkai WAL tertangguh kecil supaya checkpoint kekal pantas dan fail WAL kekal terhad antara pemangkasan penutupan. `0` melumpuhkan. |
| `OMNIROUTE_WAL_GUARD_MAX_MB` | `256` | `src/lib/db/walMaintenance.ts` | Apabila detik PASSIVE mendapati fail WAL melebihi saiz ini, jalankan `wal_checkpoint(RESTART)` supaya WAL bermula semula tanpa menulis semula wal-index yang dipetakan. Checkpoint mod pangkas langsung telah dikeluarkan (lihat baris `OMNIROUTE_WAL_TRUNCATE_INTERVAL_MS`). |
| `OMNIROUTE_PRESSURE_SELF_RESTART` | `false` | `open-sse/utils/resourcePressure.ts` | Tetapkan kepada `1`/`true`/`yes`/`on` untuk menamatkan proses selepas tekanan sumber kritikal berterusan selama `OMNIROUTE_PRESSURE_SELF_RESTART_AFTER_MS`, membenarkan penyelia (systemd `Restart=always`, dasar mula semula Docker) mengembalikan proses yang bersih dan bukannya menyajikan 503 selama-lamanya. |
| `OMNIROUTE_PRESSURE_SELF_RESTART_AFTER_MS` | `120000` (2m) | `open-sse/utils/resourcePressure.ts` | Tempoh tekanan kritikal mesti berterusan sebelum penamatan mula semula sendiri dicetuskan. |
| `OMNIROUTE_PRESSURE_PSI_DISABLED` | `false` | `open-sse/utils/resourcePressurePolicy.ts` | Tetapkan kepada `1`/`true`/`yes`/`on` untuk mengabaikan `/proc/pressure/memory` seluruh hos (`psi_some` / `psi_full`) apabila jiran bising mencetuskan 503 sedangkan proses ini tiada masalah (#13124). Pengawal Cgroup dan timbunan V8 kekal aktif. PSI juga berhenti dikira sebagai bukti pendikitan kernel untuk `cgroup_high`: jumlah cgroup melebihi `memory.high` kemudian menjadi kritikal hanya apabila peningkatan `high`/`max` pada `memory.events`. Tanpa `memory.events`, nisbah mentah dikekalkan. |
| `OMNIROUTE_SQLJS_WASM_PATH` | _(auto-kesan)_ | `src/lib/db/adapters/sqljsAdapter.ts` | Laluan eksplisit (mutlak atau relatif kepada cwd) ke `sql-wasm.wasm` apabila menggunakan penyesuai gantian WASM `sql.js`. Dikesan secara automatik melalui kebergantungan pakej dan susun atur calon apabila tidak ditetapkan. |
| `OMNIROUTE_BATCH_RETENTION_DAYS` | `30` | `src/lib/db/cleanup.ts` | Bilangan hari checkpoint, fail input/output/ralat yang dirujuk dan baris bagi kerja Batch API berstatus terminal (completed/failed/cancelled/expired) disimpan oleh sapuan pembersihan automatik sebelum dipadam. Hanya berkuat kuasa apabila `BATCH_AND_FILE_AUTO_CLEANUP_ENABLED` diaktifkan; sepadan dengan tetingkap pengekalan output Batch API OpenAI sendiri. Tidak menjejaskan laluan `DELETE /api/v1/batches/delete-completed` yang dicetuskan operator, yang kekal tanpa syarat (tiada penapis usia) mengikut reka bentuk. |
| `BATCH_AND_FILE_AUTO_CLEANUP_ENABLED` | `false` | `src/lib/db/cleanup.ts` | Apabila `true`, sapuan pembersihan automatik akan memadam kerja Batch API berstatus terminal (dan checkpointnya) yang telah melebihi `OMNIROUTE_BATCH_RETENTION_DAYS`, serta mengosongkan kandungan BLOB fail yang dimuat naik yang telah melepasi `expires_at` masing-masing. Dimatikan secara lalai: setiap pemasangan sedia ada mengekalkan data ini tepat seperti sebelumnya sehingga operator memilih untuk mengaktifkannya. Juga merupakan feature flag yang boleh disunting melalui papan pemuka — lihat `docs/reference/FEATURE_FLAGS.md` → Runtime. |
| `OMNIROUTE_SKIP_DB_HEALTHCHECK` | `0` | `src/lib/db/core.ts`, `src/lib/db/healthCheck.ts` | Tetapkan kepada `1` untuk melangkau pemeriksaan kesihatan DB sepenuhnya semasa permulaan. Berguna untuk tugas berumur pendek dan ujian integrasi. |
| `OMNIROUTE_FORCE_DB_HEALTHCHECK` | `0` | `src/lib/db/core.ts` | Tetapkan kepada `1` untuk memaksa gelung pemeriksaan kesihatan DB aktif, walaupun ia biasanya dilangkau (cth., tugas berumur pendek). |
| `OMNIROUTE_SKIP_POSTINSTALL` | `0` | `scripts/postinstall.mjs` | Tetapkan kepada `1` untuk melangkau pemanasan runtime asli semasa `npm install`. Berguna dalam pemasangan CI/headless di mana sqlite sudah dibina. |
| `OMNIROUTE_MIGRATIONS_DIR` | _(dikesan automatik)_ | `src/lib/db/migrationRunner.ts` | Mengatasi direktori yang diimbas oleh pelari migrasi. Berguna apabila menyertakan migrasi terbungkus dalam binaan tersuai. |
| `OMNIROUTE_EXTRA_MIGRATIONS_DIRS` | _(tidak ditetapkan)_ | `src/lib/db/migrationRunner/extraDirs.ts` | Direktori migrasi tambahan sebagai entri `namespace=dir` yang dipisahkan oleh pembatas laluan platform (cth. `ee=/opt/app/enterprise/db/migrations`). Fail yang ditemui di situ direkodkan sebagai `-`, supaya pengedaran yang menyertakan migrasinya sendiri tidak akan bercanggah dengan slot numerik upstream. Entri cacat, namespace tidak sah atau direktori yang hilang akan menimbulkan ralat semasa permulaan dan bukannya melangkau skema secara senyap. |
| `OMNIROUTE_MAX_PENDING_MIGRATIONS` | `50` | `src/lib/db/migrationRunner.ts` | Ambang keselamatan migrasi tertangguh besar-besaran (#3416). Permulaan dibatalkan jika lebih daripada jumlah ini migrasi tertangguh pada DB sedia ada (melindungi daripada jadual penjejakan yang terpadam). Naikkan nilainya untuk memulihkan sandaran lama; tetapkan kepada `0` untuk melumpuhkan pemeriksaan. |
| `OMNIROUTE_INSTALL_UPGRADE_WORKDIR` | _(`/.install-upgrade`)_ | `scripts/check/check-install-upgrade.mjs` | Direktori kerja untuk get pelepasan `check:install-upgrade`. Ia memerlukan lebih kurang 12 GB (dua pokok pemasangan ~3 GB ditambah tarball), jadi ia tidak boleh dijalankan pada tmpfs kecil — pada runner self-hosted, `/tmp` ialah tmpfs 12 GB bersandarkan RAM dan get tersebut menghabiskannya, menyebabkan pakej terpangkas. |
| `OMNIROUTE_SPEND_FLUSH_INTERVAL_MS` | _(lalai dalam kod)_ | `src/lib/spend/batchWriter.ts` | Selang flush (ms) untuk penulis perbelanjaan/kos berkelompok. Nilai lebih rendah mengurangkan penggabungan penulisan; nilai lebih tinggi mengurangkan pertindihan DB. |
| `OMNIROUTE_SPEND_MAX_BUFFER_SIZE` | _(lalai dalam kod)_ | `src/lib/spend/batchWriter.ts` | Saiz maksimum entri perbelanjaan yang ditimbun sebelum flush paksa. Naikkan pada penempatan high-QPS; rendahkan apabila ingatan terhad lebih penting. |
| `OMNIROUTE_PROXY_FETCH_DEBUG` | _(tidak ditetapkan)_ | `open-sse/utils/proxyFetch.ts` | Tetapkan kepada `"true"` untuk mengeluarkan log nyahpepijat `[ProxyFetch]` pada laluan geganti Vercel. Dimatikan secara lalai bagi mengelakkan pembocoran petunjuk penghalaan. |
| `OMNIROUTE_PROXY_CORE_BINARY_PATH` | _(tidak ditetapkan)_ | `src/lib/proxySubscription/coreConfig/sync.ts` | Laluan mutlak binari teras proksi tempatan (fail bernama `sing-box`) yang menyemak konfigurasi teras yang dijana sebelum ia menggantikan fail yang diguna pakai. Jika tidak ditetapkan, hanya `.generated` ditulis di sebelah fail yang diguna pakai. Persekitaran hos sahaja: tidak pernah disimpan dalam pangkalan data mahupun diterima melalui API pengurusan, kerana binari tersebut dilaksanakan. |
| `OMNIROUTE_PROXY_CORE_RELOAD_COMMAND` | _(tidak ditetapkan)_ | `src/lib/proxySubscription/coreConfig/reload.ts` | Cara teras proksi tempatan dimuat semula selepas penggantian konfigurasi yang disahkan: tatasusunan argumen JSON yang dijalankan tanpa shell, atau tepat `external` apabila pemerhati luar mengguna pakai fail tersebut. Tidak pernah disimpan dalam pangkalan data mahupun didedahkan melalui API. |
| `PROXY_LOG_INCLUDE_IPS` | `false` | `src/lib/proxyLogger.ts` | Tetapkan kepada `"true"` atau `"1"` untuk menyertakan IP klien/egress dan awalan akaun dalam baris log proses verbose `[ProxyEgress]`. Dimatikan secara lalai supaya log proses tidak mendedahkan IP atau awalan akaun. |
| `OMNIROUTE_DEBUG` | _(tidak ditetapkan)_ | `bin/cli/commands/quota.mjs` | Tetapkan kepada `1` untuk mencetak diagnostik masa setiap permintaan (`[omniroute] GET completed in Nms`) daripada arahan kuota CLI ke stderr. |
| `OMNIROUTE_HEALTHCHECK_PATH` | _(auto)_ | `scripts/dev/healthcheck.mjs` | Laluan eksplisit yang diselidik oleh pemeriksaan kesihatan kontena. Jika tidak ditetapkan, siasatan memperolehnya daripada `OMNIROUTE_BASE_PATH`; menetapkannya memilih semula titik akhir pemantauan mendalam. |
| `OMNIROUTE_DEBUG_COMPLETION` | _(tidak ditetapkan)_ | `bin/cli/commands/completion.mjs` | Tetapkan kepada sebarang nilai bukan kosong untuk mengeluarkan diagnostik `[omniroute completion]` daripada laluan cache pelengkapan shell CLI (baca/muat semula/tulis). Dimatikan secara lalai — cache tersebut gagal secara senyap supaya cache yang hilang/rosak tidak pernah merosakkan pelengkapan tab. |
| `BATCH_RETRY_DURATION_MS` | `86400000` (24j) | `open-sse/services/batchProcessor.ts` | Tetingkap cubaan semula maksimum untuk item batch individu (ms). Item yang melebihi tempoh ini ditandakan sebagai gagal. |
| `BATCH_BACKOFF_BASE_MS` | `5000` | `open-sse/services/batchProcessor.ts` | Kelewatan asas (ms) untuk backoff eksponen pada cubaan semula item batch. |
| `BATCH_BACKOFF_MAX_MS` | `3600000` (1j) | `open-sse/services/batchProcessor.ts` | Had (ms) untuk backoff eksponen antara cubaan semula item batch. |
| `BATCH_MAX_CONCURRENT` | `1` | `open-sse/services/batchProcessor.ts` | Bilangan maksimum batch yang diproses serentak. Naikkan untuk meningkatkan daya pemprosesan; kekalkan rendah untuk mengelakkan ribut had kadar. |
> [!IMPORTANT]
> Sebelum mengubah pangkalan data kekal sedia ada, pelari migrasi menerbitkan snapshot
> lengkap beralamat kandungan di bawah `DATA_DIR/db_backups/`. Penerbitan memerlukan sistem fail
> yang menyokong pautan keras dalam sistem fail yang sama tanpa tulis ganti serta penyegerakan
> fail yang kekal. Hos POSIX juga memerlukan penyegerakan direktori; pada Windows, Node mungkin
> menolak handle direktori, jadi OmniRoute melakukan flush pada fail yang diterbitkan dan
> menganggap penyegerakan entri direktori sebagai usaha terbaik.
> Jika `DATA_DIR` yang dipasang tidak dapat memberikan jaminan tersebut, permulaan gagal
> tertutup sebelum melaksanakan migrasi. Pindahkan `DATA_DIR` ke volum yang mempunyai
> primitif tersebut; jangan gunakan `DISABLE_SQLITE_AUTO_BACKUP` untuk memintas keselamatan migrasi.
### Senario
| Senario | Konfigurasi |
| --------------------------- | ------------------------------------------------------------------------------------------- |
| **Pembangunan tempatan** | Biarkan semua nilai lalai. DB berada di `~/.omniroute/omniroute.db`. |
| **Docker** | `DATA_DIR=/data` + pasang volum pada `/data`. |
| **Disulitkan semasa rehat** | Tetapkan `STORAGE_ENCRYPTION_KEY` + simpan sandaran kunci! Kehilangannya = kehilangan data. |
| **CI/Ujian** | `DATA_DIR=/tmp/omniroute-test` — efemeral, tiada penyulitan diperlukan. |
---
## 3. Rangkaian & Port
| Pembolehubah | Lalai | Fail Sumber | Penerangan |
| ------------------------------------------- | --------------------------------------------------- | ------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `PORT` | `20128` | `src/lib/runtime/ports.ts` | Port utama untuk kedua-dua UI Dashboard dan titik hujung API (mod port tunggal). |
| `OMNIROUTE_BASE_PATH` | _(kosong = root)_ | `next.config.mjs`, `scripts/docker/ensure-docker-base-path.mjs` | Sublaluan URL untuk menyajikan OmniRoute di sebalik proksi songsang (menetapkan `basePath` Next.js; pengalihan pengesahan peka terhadap basePath). Cth. `/omniroute`. Dalam Docker, nilai dibakar semasa `docker build` (`ARG OMNIROUTE_BASE_PATH`); imej root prabina boleh menggunakan nilai masa jalan yang berbeza sekali sahaja semasa kontena bermula sebelum Next.js but. Tetapkan `NEXT_PUBLIC_BASE_URL` kepada asal awam termasuk sublaluan yang sama. |
| `NEXT_PUBLIC_OMNIROUTE_BASE_PATH` | _(kosong = root)_ | `src/shared/hooks/useDisplayBaseUrl.ts` | Cermin yang kelihatan pada pelayar bagi `OMNIROUTE_BASE_PATH`, diselitkan sebaris semasa masa bina supaya paparan titik hujung papan pemuka menunjukkan `https://host/omniroute/v1` dan bukannya `https://host/v1`. Kembali kepada `OMNIROUTE_BASE_PATH` apabila tidak ditetapkan. Bina semula selepas mengubah (`basePath` Next adalah masa bina). |
| `DASHBOARD_ALLOW_EMBED` | _(tidak ditetapkan = tidak pernah boleh dibingkai)_ | `next.config.mjs`, `scripts/build/dashboardEmbed.mjs` | Penyematan iframe opt-in bagi halaman HTML. Jika tidak ditetapkan, setiap laluan dihantar dengan `frame-ancestors 'none'` + `X-Frame-Options: DENY`. Tetapkan kepada `vscode` untuk menyajikan halaman (papan pemuka, log masuk, dok, pendaratan) dengan `frame-ancestors 'self' vscode-webview:` dan tanpa `X-Frame-Options`, supaya Simple Browser VS Code boleh memaparkannya (mod `dashboardOpen: "editor"` OmniCopilot). Permukaan API (`/api`, `/v1`, `/v1beta`, `/a2a`, `/healthz`, alias aras root) mengekalkan pengepala ketat dalam kedua-dua keadaan. Hanya `vscode` dikenali — `1`/`true` tidak mengaktifkannya. Masa bina: bina semula selepas mengubah (`docker build --build-arg DASHBOARD_ALLOW_EMBED=vscode` untuk imej; menetapkannya pada pemasangan prabina tiada kesan). |
| `API_PORT` | _(tidak ditetapkan)_ | `src/lib/runtime/ports.ts` | Apabila ditetapkan, menyajikan API proksi `/v1/*` pada port berasingan ini. |
| `API_HOST` | `0.0.0.0` | `src/lib/runtime/ports.ts` | Alamat ikat untuk port API. |
| `DASHBOARD_PORT` | _(tidak ditetapkan)_ | `src/lib/runtime/ports.ts` | Apabila ditetapkan, menyajikan UI Dashboard pada port berasingan ini. |
| `OMNI_MAX_CONCURRENT_CONNECTIONS` | `0` _(dinyahaktifkan)_ | `src/sse/utils/backpressure.ts` | Mengehadkan sambungan sembang serentak yang sedang berjalan; permintaan melebihi had menerima `503` dengan `Retry-After`. Integer positif mengaktifkan pengawal; tidak ditetapkan/`0` menyahaktifkannya. |
| `OMNIROUTE_INSTANCE_ID` | _(tidak ditetapkan)_ | `src/shared/resilience/peerRouting.ts` | ID stabil dan unik untuk get way ini apabila merantaikan instans OmniRoute. Mengaktifkan semakan gelung rakan masuk. Aksara dibenarkan: huruf, digit, `.`, `_`, `:`, dan `-`; maksimum 64 aksara. |
| `OMNIROUTE_PEER_URLS` | _(tidak ditetapkan)_ | `src/shared/resilience/peerRouting.ts`, `open-sse/executors/base.ts` | URL asas OmniRoute yang dipisahkan dengan koma yang boleh menerima `X-OmniRoute-Peer-Trace`. Hanya URL huluan yang tersenarai benar secara eksplisit menerima metadata rakan; semua pembekal lain tidak disentuh. |
| `OMNIROUTE_PEER_MAX_HOPS` | `4` | `src/shared/resilience/peerRouting.ts` | Bilangan maksimum instans OmniRoute yang telah dilawati sebelum ini yang diterima pada permintaan berantai (`1`-`32`). Instans berulang atau peruntukan yang kehabisan mengembalikan HTTP `508 Loop Detected`. |
| `PROD_DASHBOARD_PORT` | `20130` | `docker-compose.prod.yml` | Port terbitan sebelah hos untuk Dashboard dalam mod pengeluaran Docker. |
| `PROD_API_PORT` | `20131` | `docker-compose.prod.yml` | Port terbitan sebelah hos untuk API dalam mod pengeluaran Docker. |
| `OMNIROUTE_PORT` | _(tidak ditetapkan)_ | `src/lib/runtime/ports.ts` | Mengatasi `PORT` dari segi keutamaan apabila dijalankan di dalam Electron atau pembungkus lain. |
| `LIVE_WS_PORT` | `20129` | `src/server/ws/liveServer.ts` | Port untuk pelayan pemantauan langsung WebSocket masa nyata. |
| `LIVE_WS_HOST` | `127.0.0.1` | `src/server/ws/liveServer.ts` | Alamat ikat untuk pelayan WebSocket langsung. Tetapkan kepada `0.0.0.0` untuk mendedahkannya pada LAN (konfigurasikan juga `LIVE_WS_ALLOWED_ORIGINS`). Sambungan disahkan menggunakan kuki sesi papan pemuka atau kunci API Bearer yang memegang skop pengurusan (`manage`/`admin`). |
| `LIVE_WS_ALLOWED_ORIGINS` | _(tidak ditetapkan)_ | `src/server/ws/liveServer.ts` | Origin tambahan yang dipisahkan dengan koma yang dibenarkan membuka WebSocket langsung. Origin papan pemuka loopback sudah dibenarkan secara lalai. |
| `LIVE_WS_ALLOWED_HOSTS` | _(tidak ditetapkan)_ | `src/server/ws/liveServerAllowList.ts` | Nama hos tambahan yang dipisahkan dengan koma yang dibenarkan untuk origin WebSocket langsung. Berbeza dengan `LIVE_WS_ALLOWED_ORIGINS` (URL origin penuh), ia hanya memadankan bahagian hos — berguna untuk persediaan LAN/Tailscale. |
| `NEXT_PUBLIC_LIVE_WS_PUBLIC_URL` | _(tidak ditetapkan)_ | `src/hooks/useLiveDashboard.ts` | URL awam untuk WebSocket papan pemuka langsung (sebelah pelayar). Tetapkan apabila pelayan WS didahulukan dengan proksi songsang atau Cloudflare Tunnel (cth. `wss://ws.my-ai.com/live-ws`); pelayar akan menyambung ke sana dan bukannya `ws://hostname:20132`. Bahagian pathname turut digunakan sebagai laluan naik taraf WebSocket (lalai: `/live-ws`). |
| `OMNIROUTE_ENABLE_LIVE_WS` | `true` | `src/server/ws/liveServer.ts` and `scripts/start-ws-server.mjs` | Tetapkan kepada `0` atau `false` untuk melumpuhkan pelayan WebSocket masa nyata (didayakan secara lalai, terikat pada loopback). Togol CI/harness yang melumpuhkan skrip pembantu WebSocket langsung kendiri. |
| `RELAY_IP_PER_MINUTE` | `30` | `src/app/api/v1/relay/chat/completions/route.ts` | Had kadar geganti setiap (token, IP), permintaan/minit. Dalam ingatan, setiap instans. `0` atau nilai negatif melumpuhkan pintu dimensi IP (had DB setiap token masih terpakai). |
| `NODE_ENV` | `production` | Teras Next.js | Mengawal tahap verbos log, cache, pendedahan butiran ralat dan pengoptimuman Next.js. |
| `OMNIROUTE_USE_TURBOPACK` | `1` (Turbopack — lalai kod) | `package.json` / Next.js 16 | Turbopack ialah bundler lalai untuk `npm run dev` dan `npm run build` (binaan 2-3× lebih pantas, berdasarkan penanda aras). Tetapkan kepada `0` untuk kembali kepada webpack pada Windows, apabila menghadapi ketidakserasian pengikatan natif / keserasian bundler, **atau pada mesin yang terhad RAM** — binaan pengeluaran Turbopack pada baris versi Next.js ini (16.2.x) diketahui di huluan mencapai puncak memori jauh lebih tinggi daripada webpack pada graf modul besar (pembetulan pemindahan memori Turbopack Next 16.3 belum stabil); sandaran webpack mencapai puncak jauh lebih rendah. Lihat #6409. **Binaan imej Docker lalai kepada `0` (webpack)**: `Dockerfile` mengisytiharkan `ARG OMNIROUTE_USE_TURBOPACK=0` supaya `docker build .` kosong (Railway dan hos sekali klik lain, pengehos sendiri ad-hoc) tidak dibunuh OOM pada pembina yang dihadkan memori; hantar `--build-arg OMNIROUTE_USE_TURBOPACK=1` untuk membina imej dengan Turbopack. Lihat `docs/guides/DOCKER_GUIDE.md` → Sumber masa bina. |
| `OMNIROUTE_SKIP_DB_HEALTHCHECK` | _(tidak ditetapkan)_ | `src/lib/db/core.ts` / `src/lib/db/healthCheck.ts` | Tetapkan kepada `1` untuk melangkau pemeriksaan kesihatan integriti SQLite semasa permulaan. Berguna untuk but yang lebih pantas pada pangkalan data besar. |
| `NOTIFY_SOCKET` | _(tidak ditetapkan)_ | systemd (protokol sd_notify) | Ditetapkan oleh systemd apabila proses berjalan di bawah unit perkhidmatan dengan integrasi sd_notify; OmniRoute membacanya (lihat `OMNIROUTE_DISABLE_SD_NOTIFY`) untuk menghantar pemberitahuan READY/WATCHDOG. Tidak pernah ditetapkan oleh pengguna. |
| `OMNIROUTE_DISABLE_SD_NOTIFY` | _(tidak ditetapkan)_ | `scripts/dev/systemd-notify.mjs` | Tetapkan kepada `1` untuk melumpuhkan systemd sd_notify (Type=notify / WatchdogSec=) walaupun berjalan di bawah unit systemd. Pemberitahu tidak melakukan apa-apa di luar systemd dalam apa jua keadaan. |
| `CREDENTIAL_HEALTH_CHECK_INTERVAL` | `3600000` | `open-sse/config/constants.ts` / `src/lib/credentialHealth/scheduler.ts` | Selang (ms) untuk penjadual pemeriksaan kesihatan kelayakan latar belakang. Minimum: 10000 (10s). |
| `CREDENTIAL_HEALTH_CACHE_TTL` | `300000` | `open-sse/config/constants.ts` / `src/lib/credentialHealth/cache.ts` | TTL (ms) untuk status kesihatan kelayakan dalam cache. |
| `OMNIROUTE_DISABLE_CREDENTIAL_HEALTH_CHECK` | `false` | `src/lib/credentialHealth/scheduler.ts` | Tetapkan kepada `1` atau `true` untuk melumpuhkan ujian berkala latar belakang bagi sambungan penyedia. Penyedia carian (SEARCH_VALIDATOR_CONFIGS dalam `src/lib/providers/validation/searchProviders.ts`, cth. `tavily-search`) sentiasa dikecualikan daripada sapuan — "pengesahan" mereka ialah pertanyaan huluan yang dibilkan sebenar, jadi ia tidak pernah diperiksa kesihatannya pada pemasa (#9970). |
| `DEEP_HEALTH_CHECK_ENABLED` | `0` | `src/app/api/monitoring/health/route.ts` | Tetapkan kepada `1` untuk membenarkan pemanggil yang disahkan meminta `/api/monitoring/health?deep=1`, yang mengambil sampel permukaan completions sekali setiap TTL. Pemanggil tanpa nama tidak pernah mencetuskan prob. |
| `OMNIROUTE_EVENT_LOOP_STALL_THRESHOLD_MS` | `5000` | `src/lib/healthzLag.ts` | Ambang tersekat (ms) untuk perakam gelung peristiwa but: pembekuan yang lebih lama daripada ini mencatat satu baris `event loop stalled` semasa sambung semula dengan kiraan memori dan dalam-proses, dan menaikkan pembilang/maksimum `eventLoopStall` pada `/api/monitoring/health`. Tetapkan kepada `0` untuk melumpuhkan; nilai yang tidak boleh dibaca atau negatif kembali kepada `5000`. |
| `HOST` | `0.0.0.0` | `scripts/dev/run-next.mjs` | Alamat pengikatan untuk pelayan dev/start Next.js. Mengatasi lalai `0.0.0.0` apabila ditetapkan. |
| `HOSTNAME` | `127.0.0.1` | `scripts/dev/run-next-playwright.mjs` | Alamat bind yang digunakan oleh pelari Playwright semasa melancarkan Next.js. Lalai kepada `127.0.0.1` untuk ujian hermetik. **Jangan gunakan untuk `omniroute serve`** — gunakan `OMNIROUTE_SERVER_HOST` sebaliknya (shell POSIX menetapkan `HOSTNAME` secara automatik kepada nama mesin; `.env` tidak dapat mengatasinya). |
| `OMNIROUTE_SERVER_HOST` | `0.0.0.0` | `bin/cli/commands/serve.mjs` | Alamat bind untuk `omniroute serve`. Mengelakkan pertindihan dengan pembolehubah shell POSIX `HOSTNAME` (sentiasa ditetapkan kepada nama mesin oleh bash/zsh). Kembali kepada `0.0.0.0` apabila tidak ditetapkan. (#6194) |
### Mod Port
```
┌─────────────────────────── Single Port (default) ──────────────────────────┐
│ PORT=20128 │
│ → Dashboard: http://localhost:20128 │
│ → API: http://localhost:20128/v1/chat/completions │
└─────────────────────────────────────────────────────────────────────────────┘
┌─────────────────────────── Split Ports ─────────────────────────────────────┐
│ 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 │
│ Use case: Expose API to LAN while restricting Dashboard to localhost. │
└─────────────────────────────────────────────────────────────────────────────┘
┌─────────────────────────── Docker Production ──────────────────────────────┐
│ PROD_DASHBOARD_PORT=443 PROD_API_PORT=8443 │
│ → Maps container ports to host ports in docker-compose.prod.yml. │
└─────────────────────────────────────────────────────────────────────────────┘
```
---
## 4. Keselamatan & Pengesahan
| Pembolehubah | Lalai | Fail Sumber | Penerangan |
| ------------------------------------------- | ---------------------------------------------------------------------------------------------------------- | -------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `MACHINE_ID_SALT` | `endpoint-proxy-salt` | `src/lib/auth` | Garam digabungkan dengan pengecam perkakasan untuk pengecapan jari mesin. Tukar pada setiap deployment untuk pengasingan. |
| `OMNIROUTE_CLI_SALT` | _(tidak ditetapkan = garam rawak setiap pemasangan yang dikekalkan pada `/cli-token-salt.json`)_ | `src/lib/machineToken.ts` | Garam HMAC untuk memperoleh token pengesahan CLI tempatan. Menetapkan nilai ini memutar semua token CLI pada mesin dan sentiasa diutamakan berbanding garam yang dikekalkan. Lihat `docs/security/CLI_TOKEN.md`. |
| `AUTH_COOKIE_SECURE` | `false` | `src/lib/auth` | Menetapkan bendera `Secure` pada kuki sesi. **Mesti `true`** apabila berjalan di belakang HTTPS. |
| `REQUIRE_API_KEY` | `false` | middleware API | Apabila `true`, semua permintaan proksi `/v1/*` mesti menyertakan kunci API yang sah. **Bendera ini tidak mengawal `GET /v1/models`**, yang sebaliknya mengikut postur log masuk papan pemuka (`requireAuthForModels`) — jadi `401` daripada `/v1/models` TIDAK bermakna inferens dilindungi. Lihat `docs/security/INFERENCE_AUTH_POSTURE.md` (#13695). |
| `ALLOW_API_KEY_REVEAL` | `false` | `src/shared/constants/featureFlagDefinitions.ts` | Membenarkan pendedahan nilai kunci API penuh dalam UI Papan Pemuka. Boleh dikonfigurasikan daripada Feature Flags Papan Pemuka; risiko keselamatan pada instans yang dikongsi. |
| `NO_LOG_API_KEY_IDS` | _(kosong)_ | `src/lib/compliance/index.ts` | ID kunci API yang dipisahkan dengan koma yang memintas pengelogan permintaan (pematuhan GDPR). |
| `DEFAULT_RATE_LIMIT_PER_DAY` | _(tidak ditetapkan = tanpa had)_ | `src/shared/utils/apiKeyPolicy.ts` | Belanjawan permintaan harian sandaran yang dikenakan pada kunci API yang lajur `rate_limits`nya adalah null. Tidak ditetapkan atau kosong: tiada had tersirat (#2289, #11017). `0` adalah sama (tanpa had). Integer positif N membolehkan N/hari, 5N/minggu, 20N/bulan. Nilai tidak kosong yang cacat kembali kepada tetingkap legasi 1000/hari, 5000/minggu, 20000/bulan. |
| `MAX_BODY_SIZE_BYTES` | `10485760` (10 MB) | `src/shared/middleware/bodySizeGuard.ts` | Saiz badan permintaan maksimum yang dibenarkan. Menolak muatan yang melebihi had ini. |
| `OMNIROUTE_CHAT_LARGE_BODY_BYTES` | `262144` (256 KB) | `src/shared/middleware/chatBodyAdmission.ts` | Badan permintaan sebenar pada atau melebihi ambang ini mengambil pajakan kemasukan berat atomik setempat proses sebelum penghuraian JSON (laluan BYTE, termasuk `POST /v1/responses`). Jalan keluar ruang-legar sihat [#10437](https://github.com/diegosouzapw/OmniRoute/pull/10437) yang sama seperti struktur-berat; masih dibatasi oleh `OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES` / [#10110](https://github.com/diegosouzapw/OmniRoute/issues/10110) supaya [#7849](https://github.com/diegosouzapw/OmniRoute/issues/7849) tidak berulang. |
| `OMNIROUTE_CHAT_HARD_MAX_BODY_BYTES` | `52428800` (50 MB) | `src/shared/middleware/chatBodyAdmission.ts` | Had keras laluan chat yang dikuatkuasakan terhadap bait yang dibaca semasa pengambilan terhad, termasuk permintaan dengan `Content-Length` yang hilang, tidak sah, atau tidak jujur; lebihan menerima `413`. |
| `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT` | _(tidak ditetapkan — tiada had kiraan permintaan)_ | `src/shared/middleware/chatBodyAdmission.ts` | **#503-fanout:** had kiraan-PERMINTAAN legasi ini kini hanya mengikat apabila ditetapkan secara eksplisit. Jika dibiarkan tidak ditetapkan (lalai), kemasukan chat berat sebaliknya dikawal oleh `OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES` — bajet BAIT terbitan automatik yang disaizkan daripada siling memori sebenar proses dalam **satu proses** (satu timbunan V8). Dua `/v1/responses` ~750k-token yang bertindih menggugurkan timbunan ~12 Gi (#7849) — amaran **bajet memori**, bukan maksimum produk keras sebanyak 2. Proses yang sihat (timbunan di bawah nisbah shed) BOLEH menerima lebih banyak `/v1/responses` panjang serentak melalui `OMNIROUTE_CHAT_ADMISSION_HEALTHY_HEADROOM`. Berpuluh-puluh klien SSE panjang (40–50) ialah timbunan + `OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES` / #10110, bukan "maks 2". Menaikkan nilai ini secara membuta tuli untuk "menggunakan hos" memperkenalkan semula #7849. Gandakan **timbunan** dengan **N `DATA_DIR`s bebas** (#11024); jangan sekali-kali `replicas>1` pada satu fail SQLite. |
| `OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES` | _(terbitan automatik)_ | `src/shared/middleware/admissionBudget.ts` | **#503-fanout:** override untuk bajet bait ingest terbitan automatik (25% daripada siling memori V8/cgroup yang lebih ketat dibahagikan dengan amplifikasi sementara 8x). Nilai terbitan dan eksplisit diapit kepada 8 MiB–2 GiB. Badan yang lebih besar daripada bajet efektif gagal serta-merta dengan `413 body_exceeds_budget`; pertikaian antara badan yang masing-masing boleh dilayan kekal sebagai `503` yang boleh dicuba semula. 40–50 klien SSE panjang serentak ialah bajet ini + timbunan, bukan "maks 2" yang keras. Baca `chatAdmission.maxInflightBytes` / `budgetSource` / `pressureSeverity` di `/api/monitoring/health` sebelum pelarasan. |
| `OMNIROUTE_CHAT_ADMISSION_HEAP_SHED_RATIO` | `0.75` | `src/shared/middleware/chatBodyAdmission.ts` | Nisbah shed tekanan timbunan (`heapUsed / heap_size_limit`) untuk kemasukan berat BYTE dan STRUCTURE (#10183, #10268, #10437). Permintaan berat serentak yang melebihi `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT` hanya di-shed dengan `503` yang boleh dicuba semula apabila timbunan JUGA berada pada atau melebihi nisbah ini; pada timbunan yang sihat, ia diterima melalui healthy-headroom sebaliknya. |
| `OMNIROUTE_CHAT_ADMISSION_HEALTHY_HEADROOM` | `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT` (lalai `1`) | `src/shared/middleware/chatBodyAdmission.ts` | Kapasiti tambahan terhad untuk laluan pantas timbunan sihat (#10437) pada **kedua-dua** STRUCTURE dan BYTE (`admitChatRequest`, termasuk badan ≥ `OMNIROUTE_CHAT_LARGE_BODY_BYTES`). Tanpa had ini, setiap permintaan sibuk-tetapi-timbunan-sihat memintas kemasukan tanpa sebarang siling. Sebaik sahaja sebanyak ini pajakan serentak aktif melalui laluan timbunan sihat, permintaan sibuk seterusnya jatuh ke laluan tunggu-terhad/shed YANG SAMA yang digunakan di bawah tekanan timbunan sebenar. `0` menyahdayakan pintasan sepenuhnya. |
| `OMNIROUTE_CHAT_HEAVY_MESSAGE_COUNT` | `200` | `src/shared/middleware/chatBodyAdmission.ts` | Bilangan mesej yang mengklasifikasikan permintaan chat sebagai berat walaupun badannya di bawah ambang bait. |
| `OMNIROUTE_CHAT_HEAVY_TOOL_COUNT` | `64` | `src/shared/middleware/chatBodyAdmission.ts` | Bilangan alat yang mengklasifikasikan permintaan chat sebagai berat walaupun badannya di bawah ambang bait. |
| `OMNIROUTE_CHAT_HEAVY_ESTIMATED_TOKENS` | `32000` | `src/shared/middleware/chatBodyAdmission.ts` | Anggaran token saiz-rentetan yang konservatif yang mengklasifikasikan permintaan sebagai berat; ini ialah proksi kos kemasukan, bukan tokenisasi pengebilan penyedia. |
| `OMNIROUTE_CHAT_HARD_MAX_MESSAGES` | `0` (dinyahdayakan) | `src/shared/middleware/chatBodyAdmission.ts` | Had sejarah chat opt-in pilihan. Dinyahdayakan secara lalai: bilangan mesej ialah dasar deployment, bukan sifat universal sesuatu permintaan, dan menghadkan di sini menolak perbualan dengan `413` terminal sebelum saluran mampatan dapat menjadikannya boleh dilayan. Pertumbuhan timbunan dihadkan oleh `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT` dan shed tekanan timbunan. Tetapkan nilai positif pada deployment dengan memori terhad yang memerlukan siling keras; lebihan kemudian menerima `413` compact-required berstruktur. |
| `OMNIROUTE_MAX_NONSTREAMING_RESPONSE_BYTES` | `67108864` (64 MB) | `open-sse/handlers/chatCore/nonStreamingResponseBody.ts` | Had keras untuk respons upstream bukan strim yang dibufferkan sepenuhnya ke dalam memori. Melebihi had ini, pembaca upstream dibatalkan dan permintaan gagal dengan pantas, dan bukannya mengembangkan rentetan tanpa had sehingga timbunan kehabisan. |
| `OMNIROUTE_FORWARDING_HEADER_BUDGET_BYTES` | `768` | `open-sse/handlers/chatCore/responseHeaders.ts` | Bait wayar maksimum yang dikehadapkan daripada header respons huluan. Apabila bajet dilebihi, header berkeutamaan rendah (cth., `x-codex-*` tersuai, `x-oai-request-id`) digugurkan untuk kekal dalam had header proksi songsang yang biasa. Tetapkan lebih tinggi untuk mengehadapkan lebih banyak metadata huluan dengan kos saiz header respons yang lebih besar. |
| `CORS_ORIGIN` | _(tidak ditetapkan)_ | `src/server/cors/origins.ts` | Senarai benar CORS asal tunggal legasi. Utamakan `CORS_ALLOWED_ORIGINS` untuk penggunaan baharu. CORS hanya untuk klien API pelayar merentas asal; penulisan papan pemuka yang disahkan sebaliknya menggunakan permintaan asal sama serta perlindungan CSRF terikat sesi. |
| `CORS_ALLOWED_ORIGINS` | _(tidak ditetapkan)_ | `src/server/cors/origins.ts` | Senarai benar CORS yang dipisahkan koma. Tiada kad bebas yang dihantar melainkan `CORS_ALLOW_ALL=true` dikonfigurasikan secara eksplisit. |
| `CORS_ALLOW_ALL` | `false` | `src/server/cors/origins.ts` | Jalan keluar khusus pembangunan untuk menggemakan sebarang `Origin` pelayar. Jangan dayakan pada penggunaan dikongsi atau produksi. |
| `OUTBOUND_SSRF_GUARD_ENABLED` | `true` | `src/shared/network/outboundUrlGuardPolicy.ts` | Alias legasi. Togol papan pemukanya (penindihan DB) dibaca sebelum nilai persekitaran ini; `false`, `0`, `no`, atau `off` pada mana-mana satu mematikan pemeriksaan hos sebagaimana `OMNIROUTE_ALLOW_PRIVATE_PROVIDER_URLS=true`, walaupun togol papan pemuka bendera itu disimpan dalam keadaan mati; nilai lain menyerahkan pengawal kepada dua bendera di bawah. |
| `OMNIROUTE_ALLOW_PRIVATE_PROVIDER_URLS` | `false` | `src/shared/network/outboundUrlGuardPolicy.ts` | Mematikan pemeriksaan hos pengawal URL keluar, termasuk sekatan metadata awan (keseluruhan 169.254.0.0/16, metadata.google.internal), pada laluan penyedia yang mengikut mod pengawal: pengesahan URL, penemuan model, URL asas nod penyedia (termasuk nod rerank jauh), dan ujian proksi ganti, di samping laluan keluar berkaitan penyedia lain seperti pengambilan imej/media jauh. Ia juga membenarkan sasaran webhook persendirian, kecuali titik hujung metadata awan/pautan tempatan, yang kekal disekat walaupun bendera ini dihidupkan. Permintaan sembang yang dihantar melalui `BaseExecutor.execute()` mengekalkan pemeriksaan metadata awannya. Penyedia tempatan berfungsi dengan nilai lalai: `OMNIROUTE_ALLOW_LOCAL_PROVIDER_URLS` (lalai `true`) sudah membenarkan URL tempatan dan LAN pada laluan pengesahan, penemuan, dan nod penyedia; ujian proksi ganti dan sasaran webhook persendirian hanya merujuk bendera ini dan menyekat hos tempatan/LAN semasa ia dimatikan. Mengatasi `OMNIROUTE_ALLOW_LOCAL_PROVIDER_URLS=false`. Nilai yang disimpan daripada togol papan pemuka diutamakan mengatasi pembolehubah ini. |
| `OMNIROUTE_ALLOW_LOCAL_PROVIDER_URLS` | `true` | `src/shared/network/outboundUrlGuardPolicy.ts` | Benarkan URL penyedia pada alamat tempatan/persendirian (127.0.0.1, localhost, LAN, julat persendirian) untuk pengesahan penyedia, penemuan model, sembang, dan laluan keluar berkaitan penyedia lain yang ditadbir oleh mod pengawal. **Lalai `true`** (mengutamakan tempatan): pengawal kemudiannya menyekat titik hujung metadata awan — keseluruhan 169.254.0.0/16 serta nama hos metadata yang diketahui (metadata.google.internal, metadata.goog, IMDS Alibaba/Azure/Oracle, fd00:ec2::254). Tetapkan `false` untuk mod awam sahaja, yang turut menyekat hos persendirian dan gelung balik. Pengawal menyemak nama hos atau literal IP sebagaimana ditulis, sebelum sebarang carian DNS; dalam mod awam sahaja, pembungkus ambilan selamat turut menyelesaikan nama hos dan menolak sebarang jawapan persendirian. `OMNIROUTE_ALLOW_PRIVATE_PROVIDER_URLS=true` mematikan pemeriksaan ini pada laluan yang disenaraikan dalam barisnya. Penyedia tempatan terbina dalam, seperti LM Studio, Ollama, vLLM, Llamafile, dan Triton, melangkau semua pemeriksaan hos untuk pengesahan kunci dan sembang. Nilai yang disimpan daripada togol papan pemuka diutamakan mengatasi pembolehubah ini. (#5066) |
| `AUDIO_REMOTE_PROVIDER_NODES` | `false` | `src/app/api/v1/_shared/audioProviderNodes.ts` | Benarkan laluan `/v1/audio/*` (transkripsi, pertuturan, terjemahan) menggunakan nod penyedia serasi OpenAI yang dihoskan di luar localhost. Mati secara lalai — menghalakan audio ke hos jauh mengubah identiti keluar dan mestilah keputusan pengendali yang eksplisit. Nod gelung balik/persendirian (localhost, 127.0.0.1, 172.16-31.x) sentiasa dibenarkan dan tidak terjejas. (#3963) |
| `RERANK_REMOTE_PROVIDER_NODES` | `false` | `src/app/api/v1/_shared/rerankProviderNodes.ts` | Benarkan `POST /v1/rerank` (dan langkah rerank gelung balik enjin memori) menggunakan nod penyedia serasi OpenAI yang dihoskan di luar localhost — mesin LAN atau rakan Tailscale yang menjalankan TEI, Infinity, vLLM, dsb. Mati secara lalai — penghalaan ke hos jauh mengubah identiti keluar dan mestilah keputusan pengendali yang eksplisit. Nod gelung balik (localhost, 127.0.0.1, 172.16-31.x) sentiasa dibenarkan dan tidak terjejas. URL asas nod jauh juga mesti lulus dasar URL keluar penyedia (`OMNIROUTE_ALLOW_LOCAL_PROVIDER_URLS` / `OMNIROUTE_ALLOW_PRIVATE_PROVIDER_URLS`). |
| `OMNIROUTE_LOCAL_PROVIDER_NODE_HOSTS` | _(kosong)_ | `src/shared/network/localNodeHosts.ts` | Nama hos (diasingkan dengan koma atau ruang kosong) yang dianggap tempatan oleh penghalaan provider-node — biasanya nama perkhidmatan Docker/Compose bagi reranker, TEI atau sidecar audio pada rangkaian Docker OmniRoute sendiri (`http://reranker:8080/v1`), supaya nod tidak memerlukan IP kontena yang dikodkan secara tetap. Hos yang disenaraikan layak untuk `/v1/rerank`, `/v1/audio/*` dan pemeriksaan kesihatan tempatan tanpa perlu mengaktifkan `RERANK_REMOTE_PROVIDER_NODES` / `AUDIO_REMOTE_PROVIDER_NODES` untuk setiap nod jauh, dan dipanggil secara langsung — tidak pernah melalui `HTTP(S)_PROXY` atau proksi yang dipinkan pada sambungan. Ia tetap menghantar kunci API sambungan tersebut. Hanya nama satu label dan nama `.internal`/`.local` diterima; FQDN awam, literal IP dan nama metadata awan diabaikan dengan amaran. (#14635) |
| `OMNIROUTE_OIDC_DISABLE_PASSWORD_LOGIN` | `false` | `src/app/api/auth/login/route.ts` | Apabila OIDC diaktifkan, nyahdayakan log masuk kata laluan supaya pengguna hanya boleh mengesahkan diri melalui OIDC Single Sign-On. Alias ringkas `OIDC_DISABLE_PASSWORD_LOGIN` juga diterima; Feature Flag Papan Pemuka dengan kunci yang sama mengambil keutamaan. (#10889) |
| `OIDC_DISABLE_PASSWORD_LOGIN` | `false` | `src/app/api/auth/login/route.ts` | Alias ringkas bagi `OMNIROUTE_OIDC_DISABLE_PASSWORD_LOGIN` (#10889). |
### Senarai Semak Pengukuhan
```bash
# Minimum keselamatan pengeluaran:
AUTH_COOKIE_SECURE=true # Memerlukan HTTPS
REQUIRE_API_KEY=true # Sahkan semua panggilan proksi
ALLOW_API_KEY_REVEAL=false # Jangan sekali-kali dedahkan kunci dalam UI
CORS_ALLOWED_ORIGINS=https://your.domain.com
MAX_BODY_SIZE_BYTES=5242880 # Had 5 MB
```
---
## 5. Sanitasi Input & Perlindungan PII
OmniRoute menyediakan pertahanan dua lapisan: pengimbasan suntikan pada bahagian permintaan dan penyingkiran PII pada bahagian respons.
> **⚠️ Batasan:** Langkah perlindungan ini merupakan pengesanan heuristik _usaha terbaik_, bukannya tembok api suntikan gesaan atau sistem DLP PII yang lengkap. Ia boleh menghasilkan positif palsu (gesaan persona/RPG yang tidak berbahaya ditandai) dan negatif palsu (leetspeak, penjarakan, corak bukan bahasa Inggeris). Langkah ini sahaja tidak mencukupi untuk pematuhan. Laraskan mod dan uji dengan trafik anda sebelum bergantung padanya.
### Bahagian Permintaan: Perlindungan Suntikan Gesaan
| Pemboleh ubah | Lalai | Fail Sumber | Penerangan |
| --------------------------------- | -------------------- | ---------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `INPUT_SANITIZER_ENABLED` | `true` | `src/middleware/promptInjectionGuard.ts` | Dayakan pengimbasan mesej masuk untuk mengesan corak suntikan gesaan. |
| `INPUT_SANITIZER_MODE` | `warn` | `src/middleware/promptInjectionGuard.ts` | Dasar suntikan: `warn` = log sahaja, `block` = tolak permintaan dengan 400. `redact` legasi **tidak** menyingkirkan teks suntikan; gunakan `PII_REDACTION_ENABLED` untuk penulisan semula PII permintaan. |
| `INJECTION_GUARD_MODE` | _(tidak ditetapkan)_ | `src/middleware/promptInjectionGuard.ts` | Alias legasi untuk `INPUT_SANITIZER_MODE` — tingkah laku yang sama. |
| `INPUT_SANITIZER_BLOCK_THRESHOLD` | `high` | `src/shared/utils/injectionSeverity.ts` | Tahap keterukan minimum yang ditolak oleh `MODE=block`: `high` (lalai), `medium`, atau `low`. Corak sederhana hanya diperhatikan melainkan ambang diturunkan. |
| `INJECTION_GUARD_BLOCK_THRESHOLD` | _(tidak ditetapkan)_ | `src/shared/utils/injectionSeverity.ts` | Alias legasi untuk `INPUT_SANITIZER_BLOCK_THRESHOLD` — tingkah laku yang sama. |
| `PII_REDACTION_ENABLED` | `false` | `src/lib/guardrails/piiMasker.ts` | Apabila `true`, samarkan PII dalam permintaan masuk (tidak bergantung pada mod suntikan). |
| `CREDENTIAL_REDACTION_ENABLED` | `false` | `src/lib/guardrails/credentialMasker.ts` | Samarkan corak kunci API / token rahsia yang diketahui umum daripada muatan permintaan/respons. Penyertaan pilihan; mencerminkan `PII_REDACTION_ENABLED`. |
### Bahagian Respons: Sanitasi PII
| Pemboleh ubah | Lalai | Fail Sumber | Penerangan |
| -------------------------------- | -------- | ------------------------- | ------------------------------------------------------------------------------------- |
| `PII_RESPONSE_SANITIZATION` | `false` | `src/lib/piiSanitizer.ts` | Imbas respons LLM untuk mengesan PII yang bocor sebelum dikembalikan kepada klien. |
| `PII_RESPONSE_SANITIZATION_MODE` | `redact` | `src/lib/piiSanitizer.ts` | `redact` = samarkan PII, `warn` = log sahaja, `block` = gugurkan keseluruhan respons. |
### Sanitasi Konteks Laluan Bertoken VS Code
| Pemboleh ubah | Lalai | Fail Sumber | Penerangan |
| ----------------------------------- | ----- | ------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| `OMNIROUTE_VSCODE_SANITIZE_CONTEXT` | `1` | `src/app/api/v1/vscode/contextSanitizer.ts` | Menyingkirkan konteks penyunting aktif tersirat (`editorContext`, `activeEditor`, `currentFile`, `selection`, `openTabs`…) daripada permintaan `/v1/vscode/[token]/*` dan menyamarkan kandungan fail sensitif yang dilampirkan secara eksplisit. Selamat secara lalai; tetapkan kepada `0` untuk menyahdayakannya. |
### Senario
| Senario | Konfigurasi |
| ------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **Pematuhan perusahaan** | `INPUT_SANITIZER_ENABLED=true`, `INPUT_SANITIZER_MODE=block`, `PII_REDACTION_ENABLED=true`, `PII_RESPONSE_SANITIZATION=true` (suntikan disekat + penyamaran PII permintaan/respons; mod tidak saling bergantung) |
| **Pemantauan sahaja** | `INPUT_SANITIZER_ENABLED=true`, `INPUT_SANITIZER_MODE=warn` — merekodkan log tetapi tidak pernah menyekat |
| **Penggunaan peribadi** | Biarkan semuanya dinyahdayakan — sifar overhed |
---
## 6. Polisi Alat & Penghalaan
| Variable | Default | Source File | Description |
| ----------------------------------------------------------- | ------------------------------------- | ----------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `TOOL_POLICY_MODE` | `disabled` | `src/lib/toolPolicy.ts` | Mengawal akses panggilan alat/fungsi LLM. `allowlist` = hanya alat yang disenaraikan, `denylist` = semua kecuali yang disenaraikan, `disabled` = tiada sekatan. |
| `OMNIROUTE_PAYLOAD_RULES_PATH` | `./config/payloadRules.json` | `open-sse/services/payloadRules.ts` | Laluan ke fail JSON peraturan manipulasi payload (pelarasan upstream mengikut model/protokol). |
| `OMNIROUTE_PAYLOAD_RULES_RELOAD_MS` | `5000` | `open-sse/services/payloadRules.ts` | Selang muat semula (ms) untuk memuat semula fail peraturan payload secara panas. Minimum `1000`. |
| `OMNIROUTE_PREFER_CLAUDE_CODE_FOR_UNPREFIXED_CLAUDE_MODELS` | `false` | `open-sse/services/model.ts` | Pilihan sertai: halakan ID model `claude-*` tanpa awalan daripada klien Claude Code melalui akaun OAuth Claude Code dan bukannya memerlukan awalan penyedia. Awalan penyedia eksplisit tetap diutamakan. Juga boleh dikonfigurasi melalui togol papan pemuka pada halaman penyedia Claude. |
| `OMNIROUTE_REDACT_THINKING` | `true` | `open-sse/executors/base/redactThinkingBeta.ts` | Tetapkan `false` untuk menghentikan OmniRoute daripada menambah sendiri beta Anthropic `redact-thinking-2026-02-12` (blok pemikiran kosong yang hanya mengandungi tandatangan). Permintaan dengan `thinking.display: "summarized"` tetap melangkaunya; beta redact yang dirundingkan klien atau pilihan sertai `requestDefaults.redactThinking` yang serasi dengan CC mengekalkannya. Permintaan OAuth Claude mengekalkan beta (ia adalah sebahagian daripada cap jari OAuth Claude Code) melainkan bendera ciri `CLAUDE_OAUTH_SUMMARIZED_THINKING_UNREDACTED` yang lalai mati dihidupkan. |
| `BARE_MODEL_DEFAULT_OVERRIDE_LEGACY` | `false` | `open-sse/services/model.ts` | Kelakuan warisan `resolveBareModelToConnectionDefault` (#4825): gantikan mana-mana nama model tanpa awalan dengan `defaultModel` sambungan yang dipilih. Mati secara lalai, hanya `auto` atau model kosong yang digantikan; merekodkan satu amaran bagi setiap pasangan apabila dihidupkan. |
| `COMBO_CONCURRENCY_PER_MODEL` | `3` | `open-sse/services/comboConfig.ts` | Had keserentakan setiap model untuk kombo gilir-gilir (#9100). Semafor kombo gilir-gilir sebelum ini dihadkan secara tetap kepada 3 permintaan serentak setiap model tanpa sebarang penggantian, menjadikan trafik keserentakan lebih tinggi bersiri di belakang had tersebut. Disahkan kepada `>= 1`, diketatkan kepada `<= 32`. |
| `DISABLE_CONTEXT_WINDOW_CHECKS` | `false` | `open-sse/handlers/chatCore.ts` | Pilihan sertai berbahaya yang melangkau semakan tetingkap konteks / token input maksimum setempat OmniRoute untuk permintaan model tunggal langsung. Penyedia upstream masih menguatkuasakan had sebenar mereka; pemampatan gesaan dan had token output model itu sendiri kekal aktif. Keutamaan efektif ialah penggantian DB Bendera Ciri > pembolehubah persekitaran > lalai; tiada mula semula diperlukan. |
| `OMNIROUTE_SELF_HOSTED_PROVIDERS` | _(tidak ditetapkan)_ | `open-sse/services/selfHostedEntry.ts` | Dokumen YAML `providers:` sebaris (RIC-738, D4). Apabila ditetapkan (dengan atau tanpa blok `strategy:`), `/v1/chat/completions` dialihkan ke entri bersatu serasi OpenAI yang dihoskan sendiri dan bukannya saluran awan. Tidak ditetapkan (lalai): laluan tersebut terus ke saluran awan sedia ada. Lihat `docs/routing/SELF_HOSTED_OPENAI_ENTRY.md`. |
| `OMNIROUTE_SELF_HOSTED_PROVIDERS_FILE` | _(tidak ditetapkan)_ | `open-sse/services/selfHostedEntry.ts` | Laluan ke fail YAML yang mengandungi dokumen `providers:` yang sama seperti `OMNIROUTE_SELF_HOSTED_PROVIDERS`, untuk penggunaan yang lebih menggemari fail berbanding pembolehubah env sebaris. Mana-mana satu akan mengaktifkan entri hos sendiri. |
| `OMNIROUTE_SELF_HOSTED_API_KEY` | _(tidak ditetapkan — laluan terbuka)_ | `open-sse/services/selfHostedEntry.ts` | Kunci API kongsi pilihan untuk entri hos sendiri bersatu (perancah D5, ditempah untuk sistem kuota setiap kunci). Apabila ditetapkan, permintaan mesti menyertakan `Authorization: Bearer `. Tidak ditetapkan: laluan adalah terbuka, sepadan dengan corak penyedia setempat hos sendiri sedia ada (penggunaan loopback/rangkaian dipercayai). |
| `OMNIROUTE_SELF_HOSTED_STRATEGY` | _(tidak ditetapkan)_ | `open-sse/services/routingStrategies.ts` | Dokumen YAML sebaris `strategy:` untuk enjin penghalaan deterministik (M2/RIC-740, D3) — senarai hitam/senarai putih, pemutus cooldown, keutamaan kos, peka kependaman, rantaian sandaran. Mengatasi blok `strategy:` sebaris yang bersarang di dalam `OMNIROUTE_SELF_HOSTED_PROVIDERS`, mengikut kunci. Lihat `docs/routing/DETERMINISTIC_ROUTING.md`. |
| `OMNIROUTE_SELF_HOSTED_STRATEGY_FILE` | _(tidak ditetapkan)_ | `open-sse/services/routingStrategies.ts` | Laluan ke fail YAML yang mengandungi dokumen `strategy:` yang sama seperti `OMNIROUTE_SELF_HOSTED_STRATEGY`, untuk penggunaan yang lebih memilih fail berbanding pembolehubah env sebaris. |
| `OMNIROUTE_DISABLE_CONVERSATION_TRACKING` | _(tidak ditetapkan)_ | `open-sse/services/conversationTracker.ts` | Tetapkan `1` untuk berhenti mengumpul sejarah perbualan. `resolveConversationId()` mengembalikan hasil yang tidak dijejak sebelum ia membaca SQLite atau menghurai sejarah mesej, dan ID sesi yang dibekalkan klien turut dilindungi. Pengendalian sesi penghalaan tidak berubah dan rekod sedia ada tidak dipadamkan. Untuk penggunaan yang tidak menggunakan paparan perbualan papan pemuka dan mahu jadual giliran berhenti membesar. |
| `OMNIROUTE_NADIR_API_KEY` | _(tidak ditetapkan)_ | `open-sse/services/autoCombo/nadirStrategy.ts` | Kunci API untuk strategi penghala auto-kombo `nadir` pilihan, digunakan apabila `config.nadir.apiKey` kombo itu sendiri tidak ditetapkan. Pilihan: panggilan tanpa kunci akan masuk ke peringkat tanpa nama Nadir, yang dihadkan kadarnya mengikut IP dan oleh itu tidak boleh digunakan di sebalik gerbang kongsi. Sensitif; utamakan medan setiap kombo apabila kombo menggunakan akaun yang berbeza. |
| `OMNIROUTE_NADIR_BASE_URL` | `https://api.getnadir.com` | `open-sse/services/autoCombo/nadirStrategy.ts` | Asal asas API keputusan Nadir, digunakan apabila `config.nadir.baseUrl` kombo itu sendiri tidak ditetapkan. Hanya diperlukan untuk Nadir yang dihoskan sendiri, yang mengekalkan kepala prompt di dalam rangkaian anda sendiri. `/v1` di hujung diterima dan dibuang. |
| `OMNIROUTE_API_KEY_WEEKLY_WINDOW` | `provider` | `src/lib/usage/apiKeyUsageLimits.ts` | Tetingkap mingguan untuk had penggunaan USD setiap kunci API (penguatkuasaan permintaan, `GET /api/keys/{id}/usage-limits`, `@@om-usage`). `provider`: minggu berakhir pada tetapan semula mingguan terawal di kalangan sambungan huluan yang boleh dicapai kunci itu, atau merupakan 7 hari bergulir apabila tiada yang diketahui. `calendar`: minggu tempatan dari Isnin 00:00 hingga Isnin 00:00 berikutnya, sama untuk setiap kunci. `calendar` disyorkan apabila satu kumpulan akaun huluan dikongsi oleh banyak kunci yang dibajetkan secara individu. Nilai tidak sah kembali kepada `provider`. |
| `OMNIROUTE_API_KEY_WEEKLY_WINDOW_TIMEZONE` | _(zon masa proses)_ | `src/lib/usage/apiKeyUsageLimits.ts` | Zon masa IANA (contohnya `Asia/Shanghai`) yang mentakrifkan Isnin 00:00 untuk tetingkap mingguan `calendar`. Tidak ditetapkan atau tidak sah: zon masa proses OmniRoute (`TZ` hos atau bekas, yang selalunya tidak ditetapkan, iaitu Masa Universal Diselaraskan, dalam imej bekas). Diabaikan dalam mod `provider`. |
| `OMNIROUTE_MAX_TOOLS_LIMIT` | `128` | `open-sse/config/constants.ts` | Bilangan maksimum alat lalai yang dibenarkan dalam sesuatu permintaan (lalai OpenAI). Integer positif sahaja; nilai yang tidak ditetapkan atau tidak sah mengekalkan `128`. Penyedia dengan had yang diketahui/proaktif (`grok-cli` 200, `nvidia` 1536) masih menggunakan hadnya sendiri — ini hanya mengalihkan siling lalai. |
| `OMNIROUTE_PROMPT_EMULATE_TOOLS` | _(on)_ | `open-sse/executors/syntxChat.ts` | Panggilan alat emulasi prompt SYNTX.ai: tidak ditetapkan atau `1`/`true`/`on`/`yes` menyuntik katalog alat tempatan ke dalam prompt; sebarang nilai lain (cth. `0`) melangkau suntikan tersebut. |
## 7. URL & Penyegerakan Awan
| Pemboleh Ubah | Lalai | Fail Sumber | Penerangan |
| ------------------------------------------- | --------------------------------------------------------- | ------------------------------------------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `BASE_URL` | `http://localhost:20128` | `src/lib/cloudSync.ts` | URL bahagian pelayan yang digunakan oleh tugas penyegerakan dalaman untuk memanggil `/api/sync/cloud`. Kekalkan ini sebagai URL gelung balik/bekas walaupun aplikasi diproksikan secara umum. |
| `CLOUD_URL` | _(kosong)_ | `src/lib/cloudSync.ts` | URL titik akhir geganti awan (ciri premium). |
| `CLOUD_SYNC_TIMEOUT_MS` | `12000` | `src/lib/cloudSync.ts` | Had masa HTTP untuk permintaan penyegerakan awan. |
| `OMNIROUTE_BUILD_PROFILE` | `full` | Konfigurasi binaan Webpack | Profil masa binaan (tetapkan kepada `minimal` untuk mengecualikan modul istimewa secara fizikal daripada berkas). |
| `OMNIROUTE_STANDALONE_DIR` | _output kendiri .build/_ | `scripts/build/colocate-standalone.mjs` | Penggantian masa binaan untuk direktori output kendiri yang digunakan oleh langkah penempatan bersama selepas binaan. Bukan tetapan masa jalan. |
| `OMNIROUTE_CLOUD_SYNC_SECRET` | _(kosong)_ | `src/lib/cloudSync.ts` | Rahsia dikongsi yang digunakan untuk mengesahkan tandatangan HMAC-SHA256 bagi respons Penyegerakan Awan. |
| `OMNIROUTE_CLOUD_SYNC_SECRETS` | `false` | `src/lib/cloudSync.ts` | Tetapkan kepada `true` untuk membenarkan titik akhir Penyegerakan Awan menulis ganti kelayakan setempat. Nilai lalai ialah `false`. |
| `OMNIROUTE_CLOUD_SYNC_ENFORCE_SIGNATURE` | `false` | `src/lib/cloudSync.ts` | Tetapkan kepada `true` untuk menolak respons Penyegerakan Awan tanpa tandatangan apabila tiada rahsia setempat dikonfigurasikan (#13679). Tandatangan yang ada sentiasa disahkan — dan sentiasa ditolak apabila `OMNIROUTE_CLOUD_SYNC_SECRET` tidak ditetapkan — tanpa mengira bendera ini. Lalai berubah kepada penguatkuasaan dalam v3.9. |
| `OMNIROUTE_ZED_IMPORT_LEGACY_ONE_STEP` | `false` | `src/app/api/providers/zed/import/route.ts` | Tetapkan kepada `true` untuk kembali kepada tingkah laku "import everything" satu langkah v3.8.5 tanpa pengesahan pengguna. |
| `NEXT_PUBLIC_BASE_URL` | `http://localhost:20128` | OAuth, Papan Pemuka, penyegerakan | URL untuk akses umum bagi OAuth redirect_uri, pautan Papan Pemuka dan URL umum yang dijana. Tetapkan ini kepada URL umum yang stabil apabila panggil balik OAuth atau pautan pelayar yang dijana mesti menggunakan hos proksi songsang kanonik. |
| `NEXT_PUBLIC_CLOUD_URL` | _(kosong)_ | Bahagian klien | Cerminan bahagian klien bagi `CLOUD_URL`. |
| `NEXT_PUBLIC_APP_URL` | _(tidak ditetapkan)_ | `src/shared/services/cloudSyncScheduler.ts` | Sandaran legasi untuk `NEXT_PUBLIC_BASE_URL`. |
| `NEXT_PUBLIC_PORT` | _(tidak ditetapkan — kembali kepada `PORT`)_ | `src/shared/hooks/useDisplayBaseUrl.ts` | Port sandaran sebelah klien untuk URL paparan apabila tiada asal diketahui (SSR/ujian); dibaca sebelum `PORT`. |
| `OMNIROUTE_PUBLIC_BASE_URL` | _(tidak ditetapkan)_ | Penyelesai asal awam, URL imej | Asal OmniRoute yang menghadap pelayar dengan keutamaan tertinggi, digunakan untuk penjanaan URL awam dan pengesahan asal pelayar bukan papan pemuka. Tetapkan ini apabila OpenWebUI atau geganti lain mencapai OmniRoute melalui URL dalaman tetapi pelayar pengguna perlu mendapatkan media yang dijana daripada LAN, terowong atau asal awam. **Jangan** sertakan `/v1`. |
| `OMNIROUTE_PROVIDER_MANIFEST_URL` | _(tidak ditetapkan)_ | `open-sse/config/providerPluginManifestUrl.ts` | URL mutlak manifes pemalam penyedia yang diiklankan kepada klien sidecar. Apabila tidak ditetapkan, OmniRoute memperoleh `/api/v1/provider-plugin-manifest` daripada asal permintaan atau HOST/PORT. |
| `OMNIROUTE_PUBLIC_PROTOCOL` | `http` | `open-sse/config/providerPluginManifestUrl.ts` | Protokol yang digunakan apabila memperoleh URL manifes pemalam penyedia daripada HOST/PORT tanpa asal permintaan. Tetapkan kepada `https` di belakang proksi awam yang menamatkan TLS apabila tiada `OMNIROUTE_PROVIDER_MANIFEST_URL` eksplisit ditetapkan. |
| `OMNIROUTE_TRUST_PROXY` | _(tidak ditetapkan)_ | `src/server/origin/publicOrigin.ts` | Mod kepercayaan pilihan untuk pengepala asal awam yang dimajukan. Tidak ditetapkan = jangan percayai `Forwarded` / `X-Forwarded-*` untuk keputusan keselamatan. `true` / `loopback` mempercayai hos/protokol yang dimajukan hanya daripada proksi gelung balik bercap token. `private` / `lan` turut mempercayai rakan proksi LAN peribadi dan membenarkan jambatan `API_PORT` mengekalkan `X-Forwarded-For` milik rakan tersebut. Utamakan `NEXT_PUBLIC_BASE_URL` yang eksplisit dalam persekitaran pengeluaran. |
| `KIE_CALLBACK_URL` | _(tidak ditetapkan)_ | `open-sse/utils/kieTask.ts` | URL panggil balik awam untuk tugas kie.ai tak segerak. Penggantian dengan keutamaan tertinggi sebelum `OMNIROUTE_KIE_CALLBACK_URL` dan `OMNIROUTE_PUBLIC_URL`. |
| `OMNIROUTE_KIE_CALLBACK_URL` | _(tidak ditetapkan)_ | `open-sse/utils/kieTask.ts` | Ejaan alternatif bagi `KIE_CALLBACK_URL`. Kembali kepada pemboleh ubah ini apabila pemboleh ubah utama tidak ditetapkan. |
| `OMNIROUTE_PUBLIC_URL` | _(tidak ditetapkan)_ | `open-sse/utils/kieTask.ts` | Asal awam yang digunakan untuk membentuk URL panggil balik tak segerak. Sandaran dengan keutamaan terendah untuk panggil balik kie.ai; turut digunakan sebagai URL awam generik untuk geganti lain. |
| `OMNIROUTE_CROF_USAGE_URL` | `https://crof.ai/usage_api/` | `open-sse/services/usage.ts` | Titik akhir semakan kuota CrofAI yang digunakan oleh halaman Penggunaan. Gantikan untuk geganti / lekapan ujian. |
| `OMNIROUTE_CLINEPASS_USAGE_URL` | `https://api.cline.bot/api/v1/users/me/plan/usage-limits` | `open-sse/services/usage/clinepass.ts` | Titik akhir kuota 5 jam / mingguan / bulanan ClinePass yang digunakan oleh halaman Penggunaan. Gantikan untuk geganti / lekapan ujian. |
| `OMNIROUTE_OPENCODE_QUOTA_URL` | `https://opencode.ai/zen/go/v1/usage` | `open-sse/services/opencodeQuotaFetcher.ts` | Titik akhir penggunaan rasmi OpenCode Go yang disahkan melalui kunci API dan digunakan oleh halaman Penggunaan. Gantikan untuk geganti / lekapan ujian. |
| `OPENCODE_SYNTHESIZE_CLI_HEADERS` | `true` | `open-sse/executors/opencode.ts` | Sintesis pengepala identiti OpenCode CLI (User-Agent, x-opencode-client/project, UUID permintaan/sesi) pada permintaan huluan opencode-go/zen yang tidak dihantar oleh klien, supaya Cloudflare menerima permintaan keluar VPS tersebut (#6210/#5997). Didayakan secara lalai sejak #10571; pilih untuk tidak menggunakannya dengan `false`/`0`/`no`/`off`. |
| `OPENCODE_USER_AGENT` | `opencode/1.18.31` | `open-sse/utils/opencodeHeaders.ts` | User-Agent lalai yang digunakan apabila `OPENCODE_SYNTHESIZE_CLI_HEADERS` diaktifkan dan tiada penggantian `_USER_AGENT` bagi setiap penyedia ditetapkan. Hanya digunakan pada pelaksana opencode. Untuk permintaan tanpa kunci yang disekat oleh huluan, nilai dikonfigurasikan yang tidak mengandungi `opencode/= 1.17>` akan digantikan dengan nilai lalai ini dan bukannya ditolak. |
| `OMNIROUTE_FORWARD_ATTRIBUTION` | `1` (aktif) | `open-sse/utils/opencodeHeaders.ts` | Majukan pengepala atribusi aplikasi klien (`x-session-id`, `x-title`, `http-referer`) kepada penyedia huluan supaya permintaan yang bermula dalam abah-abah tersenarai mengekalkan identitinya melalui penghala (get penerbit OpenRouter bergantung pada pengepala ini). `0`/`false`/`no`/`off` mengekalkan identiti pendaftar/pengendali dan menggugurkan nilai yang dibekalkan oleh klien. Pengepala tersuai yang dikonfigurasikan oleh pengendali sentiasa mengatasi nilai klien. |
| `OPENCODE_CLIENT` | `desktop` | `open-sse/executors/opencode.ts` | Nilai untuk pengepala `x-opencode-client` yang disintesis apabila `OPENCODE_SYNTHESIZE_CLI_HEADERS` diaktifkan. |
| `OPENCODE_PROJECT` | `global` | `open-sse/executors/opencode.ts` | Nilai untuk pengepala `x-opencode-project` yang disintesis apabila `OPENCODE_SYNTHESIZE_CLI_HEADERS` diaktifkan. |
| `OMNIROUTE_EGRESS_IP_LOCK_PROVIDERS` | _(tidak ditetapkan)_ | `open-sse/config/providerErrorRules.ts` | Set penyedia berkuat kuasa yang kegagalan huluannya dikumpulkan mengikut IP egress (satu 429 menggantung setiap sambungan berkaitan yang berkongsi IP tersebut). Jika tidak ditetapkan, nilai lalai peringkat percuma `opencode,opencode-go,opencode-cli` digunakan; `none`/`off`/`false`/`0` menyahdayakan lata sepenuhnya; senarai dipisahkan koma menggantikan set tersebut. Pelan berbayar dikumpulkan mengikut akaun di huluan dan boleh menyahdayakannya dengan selamat (#9611). |
| `OMNIROUTE_EGRESS_QUOTA_ROTATION_PROVIDERS` | _(tidak ditetapkan)_ | `open-sse/config/providerErrorRules.ts` | Skop putaran egress bagi penolakan kuota. Jika tidak ditetapkan, ahli kumpulan diketepikan apabila menerima 429 hanya untuk keluarga yang dikumpulkan mengikut IP di atas; `all` memperluas penulisan tersebut kepada setiap penyedia, supaya had kadar yang diterima melalui sesuatu ahli menyebabkan pemilihan seterusnya menggunakan egress lain. Sebarang nilai selain `all` diabaikan. Memerlukan `PROXY_SKIP_RECENTLY_FAILED` (diaktifkan secara lalai). Storan dikunci mengikut alamat egress, bukan (penyedia, alamat), jadi 429 yang diperluas menggantung ahli tersebut untuk setiap penyedia sehingga tempoh tamat (5 min, berganda kepada 15). Dibaca bagi setiap hasil respons, jadi perubahan digunakan tanpa dimulakan semula. |
| `OPENCODE_FREE_TIER_REQUEST_CONTRACT` | _(tidak ditetapkan)_ | `open-sse/executors/opencodeFreeTierContract.ts` | Tetapkan kepada `off` untuk berhenti melaraskan isi permintaan OpenCode tanpa kunci (bendera penstriman dan senarai alat). Pengepala masih digunakan. Dibaca bagi setiap permintaan, jadi perubahan berkuat kuasa serta-merta. |
| `OPENCODE_FREE_TIER_PLACEHOLDER_TOOLS` | _(tidak ditetapkan)_ | `open-sse/executors/opencodeFreeTierContract.ts` | Nama alat dipisahkan koma untuk diisytiharkan dalam permintaan OpenCode tanpa kunci yang tidak membawa sebarang alat, apabila belum ada apa-apa yang diperhatikan untuk model tersebut. Nilai kosong kembali kepada satu ruang letak yang model diarahkan supaya tidak memanggilnya. Maksimum 32 entri, `[A-Za-z_][A-Za-z0-9_-]{0,63}`; entri tidak sah diabaikan. |
| `OMNIROUTE_OLLAMA_CLOUD_USAGE_URL` | `https://ollama.com/settings` | `open-sse/services/usage.ts` | URL tetapan Ollama Cloud yang digunakan untuk pengikisan kuota. Gantikan untuk geganti / lekapan ujian. |
| `OMNIROUTE_OLLAMA_CLOUD_BALANCE_URL` | `https://ollama.com/api/balance` | `open-sse/services/ollamaCloudBalance.ts` | Titik akhir baki huluan Ollama Cloud yang didokumenkan (`GET https://ollama.com/api/balance`, `Authorization: Bearer `). Dibaca sekali semasa modul dimuatkan. Digunakan terlebih dahulu untuk kuota Ollama Cloud apabila sambungan mempunyai kunci API; pengikis kuki halaman tetapan kekal sebagai pilihan sandaran. Gantikan untuk geganti / lekapan ujian. |
| `OLLAMA_USAGE_COOKIE` | _(tidak ditetapkan)_ | `open-sse/services/usage.ts` | Kuki `__Secure-session` Ollama Cloud yang digunakan untuk pengikisan kuota halaman tetapan. Sensitif; utamakan medan Dashboard bagi setiap sambungan apabila berbilang akaun dikonfigurasikan. |
| `OLLAMA_CLOUD_USAGE_COOKIE` | _(tidak ditetapkan)_ | `open-sse/services/usage.ts` | Pemboleh ubah persekitaran alternatif bagi kuki `__Secure-session` Ollama Cloud. Sensitif; utamakan medan Dashboard bagi setiap sambungan apabila berbilang akaun dikonfigurasikan. |
| `OMNIROUTE_OLLAMA_USAGE_COOKIE` | _(unset)_ | `open-sse/services/usage.ts` | Pemboleh ubah persekitaran kuki `__Secure-session` alternatif untuk Ollama Cloud yang digunakan sebelum alias yang lebih pendek. Sensitif; utamakan medan Dashboard bagi setiap sambungan apabila berbilang akaun dikonfigurasikan. |
| `OMNIROUTE_CODEWHISPERER_BASE_URL` | `https://codewhisperer.us-east-1.amazonaws.com` | `open-sse/services/usage.ts` | Titik akhir had penggunaan CodeWhisperer (AWS Kiro). Gantikan untuk geganti / lekapan ujian. |
> [!IMPORTANT]
> Apabila melaksanakan penggunaan di belakang proksi songsang (nginx, Caddy), tetapkan `NEXT_PUBLIC_BASE_URL` kepada URL awam stabil anda (cth., `https://omniroute.example.com`) apabila panggil balik OAuth atau pautan awam yang dijana perlu menggunakan nama hos tersebut. Tanpa tetapan ini, panggil balik OAuth boleh gagal kerana redirect_uri tidak sepadan dan pautan awam yang dijana boleh menghala ke asalan dalaman bekas.
>
> Kekalkan `BASE_URL` sebagai URL gelung balik/bekas dalaman untuk tugas pelayan-ke-pelayan. Jangan gunakan `Origin` pelayar atau nama hos awam untuk pengambilan kendiri dalaman yang membawa kelayakan.
>
> Penulisan dashboard yang disahkan tidak memerlukan URL asas awam statik: dashboard menghantar permintaan tidak selamat berasalan sama dengan token CSRF yang terikat pada sesi. OmniRoute masih memusatkan pengesahan asalan awam untuk penyepaduan pelayar bukan dashboard: pemboleh ubah persekitaran URL awam yang dinyatakan secara jelas dipercayai terlebih dahulu; pengepala mentah `Forwarded` / `X-Forwarded-*` diabaikan melainkan `OMNIROUTE_TRUST_PROXY` didayakan dan rakan proksi terdekat ditandai dengan token sebagai dipercayai. Jangan gunakan tetapan CORS untuk membetulkan permintaan dashboard berasalan sama; CORS hanya untuk klien pelayar rentas asalan.
---
## 8. Proksi Keluar
Halakan panggilan penyedia LLM hulu melalui proksi HTTP atau SOCKS5 untuk kawalan
keluar, penghalaan geo, atau penyamaran IP.
`OMNIROUTE_UPSTREAM_HTTP2_ENABLED` lalai kepada `true`. Tetapkannya kepada `false`,
`0`, `no`, atau `off` untuk memaksa HTTP/1.1 pada penghantar Undici dalam
`open-sse/utils/proxyDispatcher.ts` dan `open-sse/utils/proxyFetch.ts`: keluar
langsung, proksi HTTP(S)/SOCKS, geganti, dan percubaan semula soket baharunya.
Ini mengekalkan pengesahan sijil TLS, pengesahan proksi, had sambungan, dan
tetapan keep-alive. Mulakan semula OmniRoute selepas mengubahnya kerana penghantar
disimpan dalam cache dan ejen geganti dicipta semasa permulaan. Suis ini tidak
mengawal pengecapan TLS wreq atau pengangkutan khusus penyedia.
| Pembolehubah | Lalai | Fail Sumber | Penerangan |
| ---------------------------------------- | -------------------- | ---------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `ENABLE_SOCKS5_PROXY` | `true` | `open-sse/executors` | Dayakan ejen proksi SOCKS5 untuk panggilan huluan. Pilih keluar dengan `false`. |
| `NEXT_PUBLIC_ENABLE_SOCKS5_PROXY` | `true` | Sebelah klien | Kesedaran sebelah klien tentang ketersediaan SOCKS5. |
| `PROXY_SKIP_RECENTLY_FAILED` | `true` | `src/shared/utils/featureFlags.ts` | Bendera ciri yang aktif secara lalai (lihat [FEATURE_FLAGS.md](./FEATURE_FLAGS.md); penggantian DB papan pemuka diutamakan). Kolam proksi dan putaran setiap akaun berhenti melayan semula ahli yang baru sahaja gagal (siasatan TCP ditolak, atau 429 melaluinya) untuk tempoh yang berganda pada setiap pengulangan, sehingga satu had. `false` memulihkan pemilihan biasa. |
| `SELECTOR_CONTROL_ALLOWLIST` | _(tidak ditetapkan)_ | `src/lib/proxySubscription/selectorGuard.ts` | Senarai benar untuk sasaran kawalan pemilih teras tempatan di luar loopback (hos atau IP dipisahkan koma/ruang, `*` membuka LAN/peribadi tetapi tidak pernah metadata/link-local). Loopback melalui http/https dibenarkan secara lalai. Nilai DB papan pemuka mengatasi pembolehubah ini apabila ditetapkan dan tidak kosong. |
| `PROXY_QUOTA_429_BASE_MS` | `300000` | `open-sse/utils/proxyRefusalMemory.ts` | Tempoh asas (ms) bagi pengasingan 429, berganda pada setiap pengulangan. Dibaca sekali semasa permulaan. Dihadkan kepada `1000..3600000`; di luar julat atau tidak dapat dibaca akan kembali kepada lalai dengan amaran. |
| `PROXY_QUOTA_429_MAX_MS` | `900000` | `open-sse/utils/proxyRefusalMemory.ts` | Had (ms) bagi pengasingan 429. Dibaca sekali semasa permulaan. Dihadkan kepada `1000..3600000`; di luar julat atau tidak dapat dibaca akan kembali kepada lalai dengan amaran. Apabila had berada di bawah asas, ia kembali kepada lalai. Menurunkan had turut memendekkan pelupusan rentetan: entri dibersihkan `2 x max` selepas tamat tempoh. |
| `PROXY_POOL_SHARED_EGRESS_ORDER` | `false` | `src/shared/utils/featureFlags.ts` | Bendera ciri pilih masuk (lihat [FEATURE_FLAGS.md](./FEATURE_FLAGS.md); penggantian DB papan pemuka diutamakan). Untuk pembekal yang kuotanya dikumpulkan mengikut alamat keluar, kedudukan ahli kolam yang berkongsi alamat keluar yang diperhatikan milik ahli yang baru ditolak diletakkan tepat di bawah ahli yang sihat. Susunan sahaja, tidak pernah dikecualikan. Memerlukan `PROXY_SKIP_RECENTLY_FAILED`, yang menghasilkan isyarat penolakan yang dibacanya. |
| `PROXY_WEBHOOK_REBOUND_MS` | `300000` | `src/lib/proxyEvents/proxyTransitionBridge.ts` | Tetingkap lantunan (ms) yang menghadkan pengulangan makluman webhook `proxy.set_aside` bagi setiap ahli kolam supaya letusan penolakan menghantar satu peristiwa sahaja. Dibaca pada setiap pancaran. Dihadkan kepada `1000..3600000`; di luar julat atau tidak dapat dibaca akan kembali kepada lalai secara senyap. |
| `HTTP_PROXY` | _(tidak ditetapkan)_ | Piawaian Node.js | Proksi HTTP untuk panggilan huluan. |
| `HTTPS_PROXY` | _(tidak ditetapkan)_ | Piawaian Node.js | Proksi HTTPS untuk panggilan huluan. |
| `ALL_PROXY` | _(tidak ditetapkan)_ | Piawaian Node.js | Proksi universal (menyokong `socks5://`). |
| `OMNIROUTE_PROXY_ECHO_URL` | _(tidak ditetapkan)_ | `src/lib/proxyEchoTarget.ts` | Mematok sasaran echo-IP yang digunakan oleh prob egress proksi kepada satu URL tunggal. Jika tidak ditetapkan, prob akan mencuba `api64.ipify.org` kemudian `api4.ipify.org` supaya terowong khusus IPv4 tidak dilaporkan mati (#9694). |
| `NO_PROXY` | _(tidak ditetapkan)_ | Piawai Node.js | Nama hos/IP yang dipisahkan koma untuk memintas proksi. |
| `OMNIROUTE_PROXY_DISPATCHER_CONNECTIONS` | `32` | `open-sse/utils/proxyDispatcher.ts` | Soket serentak maksimum bagi setiap penghantar proksi HTTP/SOCKS yang dicache. Strim SSE jangka panjang seperti Codex `/v1/responses` memerlukan lebih daripada satu sambungan apabila beberapa permintaan berkongsi proksi peringkat akaun yang sama. Nilai melebihi `256` dihadkan. |
| `SOCKS_HANDSHAKE_TIMEOUT_MS` | `10000` | `open-sse/utils/socksConnectorWithFamily.ts` | Tamat tempoh jabat tangan SOCKS5 (sambungan) dalam ms. Naikkannya apabila satu hos gerbang kediaman menerima keserentakan tinggi (cth. 100 permintaan serentak) — jabat tangan sebenar boleh melebihi 10s di bawah kelompok yang tepu walaupun proksi boleh dicapai, yang sebaliknya akan muncul sebagai `[Proxy Fast-Fail] Proxy unreachable` palsu. Dihadkan pada `120000`. |
| `PROXY_FAIL_OPEN` | `false` | `src/sse/handlers/chatHelpers.ts` | Apabila `false` (lalai), permintaan yang proksi yang ditugaskan gagal diselesaikan akan **ditolak (fail-closed)** dan bukannya kembali kepada sambungan langsung — menghalang kebocoran IP sebenar. Tetapkan `true` untuk memulihkan gantian DIRECT warisan. |
| `ENABLE_TLS_FINGERPRINT` | `false` | `open-sse/executors` | Menyamar cap jari TLS menggunakan wreq-js (meniru Chrome 124). Menangani sekatan JA3/JA4. |
| `TLS_FINGERPRINT_PROVIDERS` | _(tidak ditetapkan)_ | `open-sse/utils/proxyFetch.ts` | Senarai benar pembekal yang dipisahkan koma untuk penghalaan TLS berproksi baharu (`open-sse/utils/proxyFetch.ts`). TLS langsung mengekalkan tingkah laku warisannya apabila tidak ditetapkan; hanya pembekal ini dihalakan melalui jambatan cap jari Chrome-124. Groq (`api.groq.com`) dikecualikan walaupun senarai benar tidak ditetapkan, kerana JA3 Chrome mencetuskan Cloudflare 1010 manakala undici asli dapat mencapai API. |
| `OMNIROUTE_TURNSTILE_IGNORE_TLS_ERRORS` | `false` | `open-sse/services/claudeTurnstileSolver.ts` | Membenarkan konteks pelayar Playwright Claude Turnstile mengabaikan ralat sijil HTTPS. |
### Senario
| Senario | Konfigurasi |
| --------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------- |
| **SOCKS5 melalui terowong SSH** | `ALL_PROXY=socks5://127.0.0.1:7890`, `ENABLE_SOCKS5_PROXY=true` |
| **Proksi HTTP korporat** | `HTTP_PROXY=http://proxy.corp.com:3128`, `HTTPS_PROXY=http://proxy.corp.com:3128`, `NO_PROXY=localhost,internal.corp.com` |
| **Anti-cap jari** | `ENABLE_TLS_FINGERPRINT=true` — memerlukan `wreq-js` (disertakan) |
| **Egress terkawal / tiada akses langsung** | Biarkan `PROXY_FAIL_OPEN=false` (lalai). Permintaan gagal sepenuhnya apabila proksi tidak tersedia dan bukannya bocor melalui sambungan langsung. |
| **Warisan / dev — benarkan gantian langsung** | `PROXY_FAIL_OPEN=true`. Memulihkan tingkah laku pra-pengukuhan: sambungan langsung digunakan apabila penyelesaian proksi gagal. |
> **Nota (pintasan pengesahan NVIDIA — #3226):** Titik hujung pengesahan kunci API
> NVIDIA terhenti apabila dihalakan melalui fetch proksi global/TLS yang ditampal
> (penghantar undici → 504).
> `src/lib/providers/validation.ts::directHttpsRequest()` dengan sengaja memintas
> tampalan proksi untuk satu panggilan pengesahan itu menggunakan `safeOutboundFetch({ bypassProxyPatch: true })`.
> Ini adalah pengecualian berskop yang didokumentasikan — ia **tidak** menjejaskan egress sembang/penggunaan.
> Pintasan ini dipatok skopnya oleh `tests/unit/proxy-bypass-scope-guard-3226.test.ts`.
---
## 9. Integrasi Alat CLI
Mengawal cara OmniRoute menemui dan melancarkan sidecar CLI (Claude Code, Codex, dsb.).
| Pemboleh Ubah | Lalai | Fail Sumber | Penerangan |
| --------------------------------- | -------------------------------- | --------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `CLI_MODE` | `auto` | `src/shared/services/cliRuntime.ts` | `auto` = cari dalam PATH sistem; `manual` = gunakan laluan eksplisit sahaja. |
| `CLI_EXTRA_PATHS` | _(tidak ditetapkan)_ | `src/shared/services/cliRuntime.ts` | Entri PATH tambahan untuk penemuan binari CLI (dipisahkan dengan titik bertindih). |
| `CLI_CONFIG_HOME` | _(tidak ditetapkan)_ | `src/shared/services/cliRuntime.ts` | Gantikan direktori home untuk membaca konfigurasi CLI (`~/.claude`, `~/.codex`). Mesti mutlak dan berada di dalam home proses — **atau**, dalam kontena, laluan bind-mounted (begitulah cara `/host-home` berfungsi). Apa-apa sahaja selain itu akan kembali kepada direktori home. |
| `CLI_ALLOW_CONFIG_WRITES` | `true` | `src/shared/services/cliRuntime.ts` | Benarkan OmniRoute menulis fail konfigurasi CLI (penyegaran token, data sesi). Tetapkan kepada `false` untuk menjadikan setiap penulisan konfigurasi CLI gagal dengan ralat eksplisit "writes disabled". |
| `CLI_CLAUDE_BIN` | `claude` | `src/shared/services/cliRuntime.ts` | Laluan tersuai kepada binari Claude CLI. |
| `CLI_CODEX_BIN` | `codex` | `src/shared/services/cliRuntime.ts` | Laluan tersuai kepada binari Codex CLI. |
| `CLI_DROID_BIN` | `droid` | `src/shared/services/cliRuntime.ts` | Laluan tersuai kepada binari Droid CLI. |
| `CLI_OPENCLAW_BIN` | `openclaw` | `src/shared/services/cliRuntime.ts` | Laluan tersuai kepada binari OpenClaw CLI. |
| `CLI_CURSOR_BIN` | `agent`, kemudian `cursor` | `src/shared/services/cliRuntime.ts` | Laluan tersuai kepada binari ejen Cursor. Tanpanya, pengesanan mencuba `agent` dahulu dan kembali kepada `cursor`. |
| `CLI_CLINE_BIN` | `cline` | `src/shared/services/cliRuntime.ts` | Laluan tersuai kepada binari Cline CLI. |
| `CLI_5DIVE_BIN` | `5dive` | `src/shared/services/cliRuntime.ts` | Laluan tersuai kepada binari 5dive CLI. |
| `CLI_5DIVE_STATE_DIR` | `/var/lib/5dive` | `src/shared/services/cliRuntime.ts` | Direktori keadaan sistem 5dive (profil auth milik root); mencerminkan lalai STATE_DIR 5dive sendiri. |
| `CLI_CONTINUE_BIN` | `cn` | `src/shared/services/cliRuntime.ts` | Laluan tersuai kepada binari Continue CLI. |
| `CLI_QODER_BIN` | `qodercli` | `src/shared/services/cliRuntime.ts` | Laluan tersuai kepada binari Qoder CLI. |
| `CLI_QWEN_BIN` | `qwen` | `src/shared/services/cliRuntime.ts` | Laluan tersuai kepada binari Qwen Code CLI. |
| `CLI_AIDER_BIN` | `aider` | `src/shared/services/cliRuntime.ts` | Laluan tersuai kepada binari Aider CLI. |
| `CLI_GOOSE_BIN` | `goose` | `src/shared/services/cliRuntime.ts` | Laluan tersuai kepada binari Goose CLI. |
| `CLI_GEMINI_BIN` | `gemini` | `src/shared/services/cliRuntime.ts` | Laluan tersuai kepada binari Google Gemini CLI — pengesanan/semakan kesihatan sebelah pelayan sahaja; `omniroute run gemini` menyelesaikan binari `gemini` daripada PATH sistem. |
| `CLI_KILO_BIN` | `kilocode` | `src/shared/services/cliRuntime.ts` | Laluan tersuai kepada binari Kilo Code CLI. |
| `CLI_OPENCODE_BIN` | `opencode` | `src/shared/services/cliRuntime.ts` | Laluan tersuai kepada binari OpenCode CLI. |
| `CLI_HERMES_BIN` | `hermes` | `src/shared/services/cliRuntime.ts` | Laluan tersuai ke binari Hermes. Dikongsi oleh kedua-dua entri katalog (`hermes` dan `hermes-agent`). |
| `CLI_FORGE_BIN` | `forge` | `src/shared/services/cliRuntime.ts` | Laluan tersuai ke binari CLI ForgeCode. |
| `CLI_JCODE_BIN` | `jcode` | `src/shared/services/cliRuntime.ts` | Laluan tersuai ke binari CLI jcode. |
| `CLI_DEEPSEEK_TUI_BIN` | `deepseek-tui` | `src/shared/services/cliRuntime.ts` | Laluan tersuai ke binari DeepSeek TUI. |
| `CLI_CODEWHALE_BIN` | `codewhale` | `src/shared/services/cliRuntime.ts` | Laluan tersuai ke binari CLI CodeWhale. |
| `CLI_SMELT_BIN` | `smelt` | `src/shared/services/cliRuntime.ts` | Laluan tersuai ke binari CLI Smelt. |
| `CLI_PI_BIN` | `pi` | `src/shared/services/cliRuntime.ts` | Laluan tersuai ke binari Pi (pi-coding-agent). |
| `CLI_CRUSH_BIN` | `crush` | `src/shared/services/cliRuntime.ts` | Laluan tersuai ke binari CLI Crush. |
| `CLI_OMP_BIN` | `omp` | `src/shared/services/cliRuntime.ts` | Laluan tersuai ke binari ejen Oh My Pi (`omp`). |
| `CLI_LETTA_BIN` | `letta` | `src/shared/services/cliRuntime.ts` | Laluan tersuai ke binari CLI Letta. |
| `CLI_PRIME_AGENT_BIN` | `prime-agent` | `src/shared/services/cliRuntime.ts` | Laluan tersuai ke binari Prime Agent (Prime Intellect). |
| `CLI_WINDSURF_BIN` | _(tiada)_ | `src/shared/services/cliRuntime.ts` | Laluan tersuai ke binari Windsurf. Windsurf **tidak menyediakan perintah lalai** — pengesanan binari kekal dilumpuhkan sehingga ini ditetapkan. |
| `CLI_DEVIN_BIN` | `devin` | `open-sse/executors/devin-cli.ts` | Laluan tersuai ke binari CLI Devin (v3.8.0). Digunakan oleh pelaksana Windsurf/Devin. |
| `DEVIN_DESKTOP_VERSION` | `3.6.27` | `open-sse/executors/devin-desktop.ts` | `ide_version` Devin Desktop. Penggantian mesti menggunakan format `x.y.z`; nilai tidak sah akan kembali kepada lalai yang telah disahkan. |
| `DEVIN_DESKTOP_EXTENSION_VERSION` | `1.48.2` | `open-sse/executors/devin-desktop.ts` | `extension_version` Codeium/language-server terbundel, berbeza daripada `ide_version` Desktop. Penggantian mesti menggunakan `x.y.z`; nilai tidak sah menggunakan lalai terbundel. |
| `CLI_DEVIN_AGENTIC_BIN` | `devin` | `open-sse/executors/devin-cli-agentic.ts` | Penggantian CLI Devin khusus untuk jambatan agentic sahaja. Pelaksana hanya menerima huluan ACP stdio tempatan. |
| `DEVIN_AGENTIC_HOME` | _(diperlukan)_ | `open-sse/executors/devin-cli-agentic.ts` | Direktori home terasing mutlak untuk subproses Devin agentic; laluan jambatan yang diterima ialah `/home/bridge` dan laluan `.sandbox` khusus tugas (pada Windows, `C:\...\.sandbox\...`). |
| `DEVIN_AGENTIC_ACP_TIMEOUT_MS` | `120000` | `open-sse/executors/devin-cli-agentic.ts` | Tempoh maksimum satu giliran ACP Devin sebelum jambatan menamatkan proses anak dan mengembalikan tamat masa yang eksplisit. |
| `DEVIN_BRIDGE_MODEL` | `devin-cli-agentic/swe-1-7` | `docker/devin-bridge/compose.yml` | Alias model Claude Code utama untuk jambatan terasing. Harness langsung menggantikan contoh dengan model yang dikembalikan oleh akaun Devin semasa. |
| `DEVIN_BRIDGE_SONNET_MODEL` | `DEVIN_BRIDGE_MODEL` | `docker/devin-bridge/compose.yml` | Alias jambatan terasing yang digunakan apabila Claude Code meminta lalai Sonnetnya. |
| `DEVIN_BRIDGE_OPUS_MODEL` | `DEVIN_BRIDGE_MODEL` | `docker/devin-bridge/compose.yml` | Alias jambatan terasing yang digunakan apabila Claude Code meminta lalai Opusnya. |
| `DEVIN_BRIDGE_HAIKU_MODEL` | `DEVIN_BRIDGE_MODEL` | `docker/devin-bridge/compose.yml` | Alias jambatan terasing yang digunakan apabila Claude Code meminta lalai Haikunya. |
| `DEVIN_BRIDGE_SUBAGENT_MODEL` | `DEVIN_BRIDGE_MODEL` | `docker/devin-bridge/compose.yml` | Alias jambatan terasing yang digunakan untuk sub-ejen Claude Code. |
| `DEVIN_SEAT_API_URL` | `https://server.codeium.com` | `open-sse/services/usage/devinCli.ts` | Penggantian pilihan untuk API pengurusan seat Codeium yang digunakan oleh kuota Devin CLI (`GetUserStatus`). |
| `AUGGIE_BIN` | `auggie` | `open-sse/executors/auggie.ts` | Penggantian laluan mutlak untuk binari CLI Augment (Auggie) yang digunakan oleh penyedia `auggie` tempatan. Kembali kepada `CLI_AUGGIE_BIN`, kemudian carian PATH. |
| `CLI_AUGGIE_BIN` | `auggie` | `open-sse/executors/auggie.ts` | Penggantian alias untuk laluan binari CLI Augment (Auggie) (disemak selepas `AUGGIE_BIN`). |
| `ZCODE_BIN` | `zcode` | `open-sse/executors/zcode.ts` | Binari yang digunakan untuk klien stdio penyedia `zcode` tempatan. Kembali kepada `zcode` pada PATH. |
| `ZCODE_ARGS` | — | `open-sse/executors/zcode.ts` | Tatasusunan JSON (≤16 rentetan) argumen tambahan yang dihantar kepada binari `zcode` apabila dilancarkan melalui `cliTools`. |
| `ZCODE_CWD` | `process.cwd()` | `open-sse/executors/zcode.ts` | Direktori kerja untuk subproses app-server ZCode. |
| `ZCODE_PROVIDER_ID` | `builtin:zai-coding-plan` | `open-sse/executors/zcode.ts` | Penggantian untuk ID penyedia yang dihantar kepada app-server. |
| `ZCODE_SERVER_RUNTIME_ROOT` | `~/.zcode/server` | `open-sse/executors/zcode.ts` | Akar runtime app-server ZCode (tempat `node` dan `zcode-server.cjs` berada). |
| `ZCODE_SERVER_NODE` | `/node` | `open-sse/executors/zcode.ts` | Boleh laksana Node yang digunakan untuk mengehoskan app-server ZCode. |
| `ZCODE_SERVER_ENTRY` | `/zcode-server.cjs` | `open-sse/executors/zcode.ts` | Skrip masuk app-server yang digunakan untuk mengehoskan pelayan ZCode. |
| `ZCODE_STARTUP_TIMEOUT_MS` | `10000` | `open-sse/executors/zcode.ts` | Tamat masa permulaan (ms) sebelum pelancaran app-server ZCode dianggap gagal. |
| `ZCODE_RPC_TIMEOUT_MS` | `30000` | `open-sse/executors/zcode.ts` | Tamat masa RPC setiap permintaan (ms) untuk panggilan app-server ZCode. |
| `ZCODE_TURN_TIMEOUT_MS` | `120000` | `open-sse/executors/zcode.ts` | Tempoh maksimum (ms) satu giliran ZCode sebelum penyelia menamatkannya. |
| `ZCODE_POLL_INTERVAL_MS` | `250` | `open-sse/executors/zcode.ts` | Selang tinjauan (ms) untuk penyiapan giliran ZCode. |
| `HERMES_HOME` | `~/.hermes` | `src/lib/cli-helper/config-generator/hermesHome.ts` | Direktori rumah Hermes Agent tempat OmniRoute membaca/menulis konfigurasi Hermes CLI. Sepadan dengan pembolehubah persekitaran yang ditetapkan oleh pemasang PowerShell Hermes pada Windows (`%LOCALAPPDATA%\hermes`). |
### Penyegerakan Automatik Profil CLI
Bendera ciri ini bersifat opt-in dan dimatikan secara lalai. Ia juga boleh ditogol daripada papan pemuka CLI Code.
| Pembolehubah | Lalai | Fail Sumber | Penerangan |
| ------------------------------------- | ------- | ------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| `OMNIROUTE_AUTO_SYNC_CODEX_PROFILES` | `false` | `src/shared/constants/featureFlagDefinitions.ts` | Selepas penyegerakan model penyedia, secara automatik menulis semula fail profil `~/.codex/*.config.toml` daripada katalog langsung. Memerlukan `CLI_ALLOW_CONFIG_WRITES`; tidak pernah mengubah konfigurasi Codex aktif/lalai, pengesahan, tetapan Codex-lb, atau pilihan penyedia. |
| `OMNIROUTE_AUTO_SYNC_CLAUDE_PROFILES` | `false` | `src/shared/constants/featureFlagDefinitions.ts` | Selepas penyegerakan model penyedia, secara automatik menulis semula fail profil Claude Code `~/.claude/profiles//settings.json` daripada katalog langsung. Memerlukan `CLI_ALLOW_CONFIG_WRITES`; tidak pernah mengubah konfigurasi Claude aktif/lalai, pengesahan, atau pilihan penyedia. |
### Contoh Docker
```bash
# Lekapkan binari hos ke dalam kontena dan beritahu OmniRoute di mana ia berada:
CLI_EXTRA_PATHS=/host-cli/bin
CLI_CONFIG_HOME=/host-home
CLI_ALLOW_CONFIG_WRITES=true
CLI_CLAUDE_BIN=/host-cli/bin/claude
```
`CLI_CONFIG_HOME` hanya berkuat kuasa apabila laluan itu benar-benar dipasang secara bind-mount daripada
hos — pasangkannya dengan mount seperti `~/.codex:/host-home/.codex:rw` (lihat
profil `host` dalam `docker-compose.yml`). Laluan yang tidak berada di dalam
home pengguna kontena mahupun bind mount akan diabaikan, kerana penulisan ke situ akan
hilang apabila kontena dicipta semula.
Imej berjalan sebagai `USER node`, jadi `/root` yang tidak dipasang **bukan** penggantian
yang sah.
| Pembolehubah | Lalai | Fail Sumber | Penerangan |
| ---------------------------------------- | ---------------- | ----------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `OMNIROUTE_CONTAINER` | _(auto)_ | `src/shared/utils/containerEnv.ts` | Paksa pengesanan kontena aktif (`1`/`true`) atau mati (`0`/`false`). Hanya diperlukan pada runtime yang terlepas daripada pengesanan automatik. |
| `OMNIROUTE_ALLOW_CONTAINER_CONFIG_WRITE` | `false` | `src/shared/services/cliRuntime.ts` | Benarkan penulisan konfigurasi alat CLI ke laluan kontena yang tidak dipasang walau bagaimanapun. Setara CLI ialah `--allow-container-write`. |
| `DOCKER_UPDATE_TRIGGER_FILE` | tidak ditetapkan | `src/lib/system/autoUpdate.ts` | Imej Docker sahaja: **Update Now** di papan pemuka menulis permintaan JSON ke fail ini (mesti berada di dalam `DATA_DIR`) untuk pemerhati di sisi hos menarik dan mencipta semula kontena. Lihat [Panduan Docker](../guides/DOCKER_GUIDE.md#dashboard-updates-in-docker). |
### Pembantu Binari CLI (`omniroute`)
Pembolehubah ini melaras tingkah laku binari CLI `omniroute` itu sendiri (bukan
pengesanan sidecar di atas).
| Pembolehubah | Lalai | Fail Sumber | Penerangan |
| ------------------------------------- | --------------------------------- | --------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `OMNIROUTE_LANG` | _(sistem)_ | `bin/cli/i18n.mjs` | Paksa bahasa output CLI. Locale BCP-47 (cth. `en`, `pt-BR`). Mengatasi pembolehubah persekitaran locale sistem (LC_ALL, LC_MESSAGES). |
| `OMNIROUTE_SHOW_LOG` | _(tidak ditetapkan)_ | `bin/cli/runtime/processSupervisor.mjs` | Tetapkan kepada `1` untuk memajukan stdout/stderr pelayan ke terminal dalam mod terselia. Setara dengan bendera `--log` pada `omniroute serve`. |
| `OMNIROUTE_CLI_TOKEN` | _(tidak ditetapkan)_ | `bin/cli/api.mjs` | Token pengesahan mesin yang disuntik sebagai pengepala `x-omniroute-cli-token`. Dijana secara automatik dalam tugas 8.12. |
| `GEMINI_CLI_HOME` | _(tidak ditetapkan)_ | `bin/cli/commands/setup-gemini.mjs` | Akar home Gemini berterusan; larian one-shot menggunakan home terpencil sementara. |
| `OMNIROUTE_CHILD_SIGNAL_TIMEOUT_MS` | `5000` | `bin/cli/commands/run.mjs` | Tempoh tangguh dalam milisaat sebelum mematikan secara paksa anak CLI yang menerima isyarat. |
| `OMNIROUTE_CLI_SKIP_DEFAULT_DATA_ENV` | _(tidak ditetapkan)_ | `bin/omniroute.mjs` | Tetapkan kepada 1 dengan DATA_DIR eksplisit untuk melangkau fail persekitaran direktori data pengguna lalai. |
| `OMNIROUTE_SYNC_TOKEN` | _(tidak ditetapkan)_ | `bin/cli/commands/sync.mjs` | Token penyegerakan untuk `omniroute sync bundle` (`GET /api/sync/bundle` hanya menerima token penyegerakan, bukan kunci API). Setara dengan `--token`. |
| `OMNIROUTE_HTTP_TIMEOUT_MS` | `30000` | `bin/cli/api.mjs` | Tamat masa HTTP setiap percubaan (ms) untuk permintaan CLI → pelayan. |
| `OMNIROUTE_READY_TIMEOUT_MS` | `60000` | `bin/cli/utils/pid.mjs` | Masa maksimum (ms) CLI menunggu titik akhir kesihatan pelayan sebelum mencetak amaran tamat masa. Berguna untuk permulaan sejuk yang perlahan (cth. Windows). Juga boleh ditetapkan melalui `--ready-timeout`. |
| `OMNIROUTE_VERBOSE` | `0` | `bin/cli/api.mjs` | Tetapkan kepada `1` untuk mencetak diagnostik cuba semula/backoff ke stderr semasa arahan CLI. |
| `OMNIROUTE_PLUGIN_PATH` | _(tidak ditetapkan)_ | `bin/cli/plugins.mjs` | Direktori tersuai untuk penemuan plugin CLI (pakej `omniroute-cmd-*`). Lalai kepada `~/.omniroute/plugins/` apabila tidak ditetapkan. CLI sahaja — ia tidak pernah sampai ke pengimbas plugin sisi pelayan, yang ditunjukkan oleh `OMNIROUTE_PLUGINS_DIR` (bahagian 2). |
| `OMNIROUTE_NO_UPDATE_NOTIFIER` | _(tidak ditetapkan)_ | `bin/omniroute.mjs` | Sekat pemberitahuan kemas kini CLI ketika proses keluar apabila ditetapkan kepada sebarang nilai bukan kosong. Notis kekal dilumpuhkan secara berasingan dalam CI, mod senyap, dan mod output bukan teks. |
| `OMNIROUTE_DOCTOR_LIVENESS_URL` | _(diperoleh)_ | `bin/cli/commands/doctor.mjs` | URL liveness yang disiasat oleh `omniroute doctor`. Pilihan `livenessUrl` programatik mengambil keutamaan; jika tidak, nilai ini digunakan seadanya. Jika tidak ditetapkan, CLI memperoleh titik akhir `/api/health/degradation` papan pemuka tempatan. |
| `OMNIROUTE_PROVIDER_CATALOG_PATH` | `src/shared/constants/providers/` | `bin/cli/provider-catalog.mjs` | Laluan katalog penyedia yang digunakan oleh arahan penyedia CLI. Pilihan `catalogPath` programatik mengambil keutamaan. Laluan mutlak digunakan seadanya; laluan relatif diselesaikan daripada akar projek. Jika tidak ditetapkan, CLI menggunakan direktori pemalar penyedia, dengan fail warisan `providers.ts` sebagai sandaran. |
| `OMNIROUTE_PROVIDER_TEST_MODEL` | _(lalai penyedia)_ | `bin/cli/provider-test.mjs` | Model sandaran global untuk ujian sambungan penyedia CLI. Keutamaan ialah model sambungan yang dikonfigurasi, penggantian model khusus penyedia, nilai ini, kemudian model ujian terbina dalam penyedia. |
---
## 10. Ejen Dalaman & Integrasi MCP
| Pembolehubah | Lalai | Fail Sumber | Penerangan |
| ----------------------------------------------- | --------------------------------------------------- | ----------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `OMNIROUTE_BASE_URL` | kesan-auto | `open-sse/mcp-server/server.ts` | URL eksplisit untuk alat MCP/A2A mencapai OmniRoute. Mengatasi pengesanan automatik localhost. |
| `OMNIROUTE_API_KEY` | _(tidak ditetapkan)_ | Modul MCP/A2A | Kunci API untuk panggilan alat MCP dalaman dan kemahiran A2A. |
| `OMNIROUTE_API_KEY_ID` | _(tidak ditetapkan)_ | `open-sse/mcp-server/audit.ts` | ID kunci untuk atribusi log audit MCP. |
| `ROUTER_API_KEY` | _(tidak ditetapkan)_ | Legasi | Alias legasi untuk `OMNIROUTE_API_KEY`. |
| `OMNIROUTE_A2A_HISTORY_RETENTION_DAYS` | `30` | `src/lib/a2a/taskManager.ts` | Bilangan hari sejarah tugas A2A disimpan dalam pangkalan data tempatan sebelum pembersihan harian memadamkan sesuatu baris. Jika tidak ditetapkan, bukan numerik, atau `<= 0`, ia kembali kepada `30`. |
| `OMNIROUTE_A2A_MEMORY_HITS` | `1` | `src/lib/a2a/taskExecution.ts` | Suis pemutus untuk ciri kebolehperhatian memory-hits A2A. Tetapkan kepada `0` untuk melangkau carian ingatan bagi sesuatu tugas sepenuhnya; sebarang nilai lain (termasuk tidak ditetapkan) mengekalkannya aktif. |
| `OMNIROUTE_ISSUE_AGENT_ENABLED` | `false` | `src/app/api/issue-agent/runs/route.ts` | Mengaktifkan titik akhir triase-terekod Issue Agent luar talian/tempatan. Biarkan dilumpuhkan melainkan anda menjalankan aliran kerja triase-terekod tempatan secara eksplisit. |
| `OMNIROUTE_ISSUE_AGENT_TIMEOUT_MS` | _(tidak ditetapkan)_ | `src/lib/issueAgent/execution.ts` | Tamat masa (ms) untuk satu larian triase-terekod Issue Agent. Dihadkan kepada maksimum dalaman; kembali kepada lalai terbina dalam apabila tidak ditetapkan atau tidak sah. |
| `OMNIROUTE_CONTEXT` | _(konteks aktif)_ | `bin/cli/program.mjs`, `bin/cli/api.mjs` | Konteks/profil mod jauh CLI untuk perintah `omniroute`; mengatasi konteks aktif dalam stor konteks tempatan. Setara dengan `--context `. |
| `OMNIROUTE_CONTEXT_KEYCHAIN_DISABLED` | `0` | `bin/cli/contexts.mjs` | Melumpuhkan backend rantai kunci OS `keytar` pilihan untuk kelayakan konteks CLI. Apabila diaktifkan, kelayakan kekal dalam `config.json` mod `0600` dan CLI mengeluarkan amaran sandaran sekali sahaja; bertujuan untuk operasi headless/kontena yang disengajakan. |
| `OMNIROUTE_MCP_ENFORCE_SCOPES` | `false` | `open-sse/mcp-server/server.ts` | Menguatkuasakan kawalan akses berasaskan skop pada panggilan alat MCP. |
| `OMNIROUTE_MCP_SCOPES` | _(semua)_ | `open-sse/mcp-server/server.ts` | Skop dipisahkan koma: `admin`, `combos`, `health`, `models`, `routing`, `budget`, `metrics`, `pricing`, `memory`, `skills`. |
| `OMNIROUTE_MCP_COMPRESS_DESCRIPTIONS` | `false` | `open-sse/mcp-server/descriptionCompressor.ts` | Mampatkan penerangan alat MCP sebelum mensirikan manifes. Nilai pengaktifan: `1`, `true`, `on`. |
| `OMNIROUTE_MCP_DESCRIPTION_COMPRESSION` | `rtk` | `open-sse/mcp-server/descriptionCompressor.ts` | Algoritma/profil pemampatan. Nilai pelumpuhan: `0`, `false`, `off`. |
| `OMNIROUTE_MCP_FETCH_TIMEOUT_MS` | `10000` | `open-sse/mcp-server/fetchTimeout.ts` | Bajet pembatalan (ms) untuk bacaan pengurusan dalaman pelayan MCP (kesihatan, daya tahan, kombo, kuota, penggunaan). |
| `OMNIROUTE_MCP_UPSTREAM_TIMEOUT_MS` | `60000` | `open-sse/mcp-server/fetchTimeout.ts` | Belanjawan batal (ms) untuk hop MCP yang menunggu penyedia (`route_request`, `web_search`, `web_fetch`). |
| `OMNIROUTE_CORPUS_CACHE_SIZE` | `5` | `src/lib/localCorpus/configured.ts` | Bilangan maksimum instans indeks korpus tempatan yang disimpan dalam cache memori (LRU, satu untuk setiap direktori akar yang diindeks). Diapit pada minimum `1`. |
| `MODEL_SYNC_INTERVAL_HOURS` | `6` | `src/shared/services/modelSyncScheduler.ts` | Selang penyegerakan katalog model dalam jam. |
| `PROVIDER_LIMITS_SYNC_INTERVAL_MINUTES` | `70` | `src/lib/usage/providerLimits.ts` | Selang pengundian had kadar dan kuota penyedia. |
| `PROVIDER_LIMITS_SYNC_SPACING_MS` | `1500` | `src/lib/usage/providerLimits.ts` | Jeda (ms) antara pengambilan kuota OAuth berturut-turut dalam penyegerakan pukal; sambungan OAuth diambil satu demi satu untuk mengelakkan membanjiri hulu. `0` untuk menyahpilih (serentak). |
| `OMNIROUTE_QUOTA_FETCH_MIN_INTERVAL_MS` | `250` | `open-sse/services/quotaFetchThrottle.ts` | Selang minimum (ms) antara pengambilan kuota hulu berturut-turut pada laluan preflight/pemantau setiap permintaan; menjarangkan panggilan rangkaian serentak supaya banyak akaun pada satu IP tidak membanjiri hulu. Disepadukan ke dalam pengambil kuota Codex (`/wham/usage`), DeepSeek, Bailian (kedua-dua tapak pengambilan), OpenCode, dan Crof (#6009, #6911). Laluan penghantaran generik `usage.ts::getUsageForProvider` (github/glm/minimax/nanogpt/xai/dll.) belum diliputi — dijejak secara berasingan. Kenaan cache tidak terjejas. `0` menyahdayakan; diapit `0..60000`. |
| `OMNIROUTE_QUOTA_FETCH_JITTER_MS` | `120` | `open-sse/services/quotaFetchThrottle.ts` | Penjarakan rawak tambahan setiap permintaan (ms), disampel pada setiap pengambilan kuota hulu yang ditempah. Lalai kepada 120; diapit `0..60000`; `0` hanya membuang jitter. Tetapkan `OMNIROUTE_QUOTA_FETCH_MIN_INTERVAL_MS=0` untuk menyahdayakan keseluruhan pendikit. Jitter tidak menjamin pencegahan sekatan hulu. |
| `PROVIDER_LIMITS_POST_USAGE_REFRESH_DELAY_MS` | `5000` | `src/lib/usage/providerLimits.ts` | Kelewatan (ms) sebelum menyegarkan had penyedia selepas peristiwa penggunaan sebenar, memberi masa kepada API kuota hulu untuk merekodkan penggunaan. |
| `OMNIROUTE_LOGIN_BROWSER_PATH` | pengesanan automatik | `open-sse/services/adobeFireflyBrowserLogin.ts` | Laluan mutlak kepada boleh laku Chrome atau Edge sistem yang digunakan untuk log masuk Adobe Firefly interaktif dan pembaharuan luar skrin. |
| `ADOBE_FIREFLY_BROWSER_REFRESH` | didayakan | `open-sse/services/adobeFireflySession.ts` | Memastikan keadaan IMS dan risiko pelayar kekal segar dengan sesi Chrome CDP berskop akaun. Tetapkan kepada `0` untuk menyahdayakan pembaharuan pelayar. |
| `ADOBE_FIREFLY_SESSION_DISK` | didayakan | `open-sse/services/adobeFireflySession.ts` | Mengekalkan sesi Adobe yang dibaiki di bawah `DATA_DIR` merentasi mula semula proses. Tetapkan kepada `0` untuk memastikan sesi hanya dalam memori. |
| `ADOBE_FIREFLY_MIN_SUBMIT_GAP_MS` | `12000` | `open-sse/services/adobeFireflySession.ts` | Penjarakan minimum dalam milisaat antara penyerahan janaan Adobe Firefly; `0` menyahdayakan penjarakan. |
| `ADOBE_FIREFLY_BATCH_EXTRA_GAP_MS` | `15000` | `open-sse/services/adobeFireflySession.ts` | Tempoh senyap tambahan dalam milisaat selepas setiap penyerahan Adobe berjaya yang ketiga. |
| `ADOBE_FIREFLY_SUBMIT_BASE_DELAY_MS` | `8000` | `open-sse/services/adobeFireflyClient.ts` | Backoff asas dalam milisaat selepas respons 408 sementara Adobe; digabungkan dengan penjarakan penyerahan merentasi sehingga lima percubaan. |
| `OMNIROUTE_DISABLE_BACKGROUND_SERVICES` | `false` | `src/instrumentation-node.ts` | Nyahdayakan semua perkhidmatan latar belakang (penyegerakan, harga, penyegaran model). Berguna untuk CI/ujian. |
| `OMNIROUTE_HEADLESS` | _(tidak ditetapkan)_ | `src/lib/system/headless.ts` | But enjin proksi sahaja: melangkau subsistem pilihan, `/dashboard` → 404. Sama seperti `omniroute serve --headless`. Lihat [HEADLESS.md](../guides/HEADLESS.md). |
| `OMNIROUTE_ENABLE_RUNTIME_BACKGROUND_TASKS` | _(tidak ditetapkan)_ | `src/lib/config/runtimeSettings.ts` | Paksa tugas latar belakang aktif di bawah pengesanan ujian automatik. Tetapkan `1` untuk mengatasi heuristik ujian. |
| `OMNIROUTE_BUDGET_RESET_JOB_INTERVAL_MS` | `600000` | `src/lib/jobs/budgetResetJob.ts` | Kekerapan semakan set semula belanjawan (ms). Minimum `10000`. |
| `OMNIROUTE_CONNECTION_RECOVERY_INTERVAL_MS` | `60000` | `src/lib/quota/connectionRecovery.ts` | Kekerapan pemulihan penyejukan sambungan secara proaktif (ms): mengesahkan semula sambungan yang `rate_limited_until` sementaranya telah berlalu, di luar laluan pantas permintaan. Minimum `5000`. |
| `OMNIROUTE_DISABLE_CONNECTION_RECOVERY` | `false` | `src/lib/quota/connectionRecovery.ts` | Lumpuhkan penjadual pemulihan penyejukan sambungan proaktif (pemulihan malas dalam `getProviderCredentials` masih terpakai). |
| `OMNIROUTE_REASONING_CACHE_CLEANUP_INTERVAL_MS` | `1800000` | `src/lib/jobs/reasoningCacheCleanupJob.ts` | Kekerapan pembersihan cache penaakulan (ms). Minimum `60000`. |
| `OMNIROUTE_REASONING_MIN_BUDGET` | _tidak ditetapkan_ (dilumpuhkan) | `open-sse/services/reasoningTokenBuffer.ts` | Had bawah opt-in untuk belanjawan output model berfikir: `max_tokens` pemanggil dalam `[256, floor)` dinaikkan ke had bawah (dihentaskan oleh had output model). Tidak ditetapkan = belanjawan klien tidak pernah dibesarkan (#9507). |
| `OMNIROUTE_REASONING_EFFORT_PROBE_PROVIDERS` | _tidak ditetapkan_ (dilumpuhkan) | `open-sse/services/learnedReasoningEffortCaps.ts` | Opt-in, ID pembekal dipisahkan koma (atau `*`): apabila `reasoning_effort` 400/422 tidak menyebut set yang diterima, cuba semula sekali satu tahap lebih rendah (tidak pernah di bawah `low`) dan pelajari tahap itu hanya jika siasatan dijawab (#14895). |
| `OMNIROUTE_LOG_EXPORT_CRON` | `0 * * * *` | `src/lib/jobs/logExportJob.ts` | Ungkapan cron (UTC) untuk tugas eksport log panggilan yang menyalurkan setiap destinasi eksport log yang didayakan. Lebih baik `*/5 * * * *` semasa mengeksport badan. |
| `OMNIROUTE_LOG_EXPORT_RUN_TIMEOUT_MS` | `900000` | `src/lib/logExport/childRunner.ts` | Tamat masa jam dinding anak setiap destinasi dalam milisaat. Tamat masa merekodkan kegagalan dan mematikan proses tanpa memajukan kelompok yang belum diakui. Nilai tidak sah/bukan positif/bukan integer menggunakan nilai lalai. |
| `OMNIROUTE_LOG_EXPORT_CHILD_MAX_OLD_SPACE_MB` | `1024` | `src/lib/logExport/childRunner.ts` | Had old-space V8 anak eksport Node dalam MB (bukan jumlah RSS). Nilai lalai meninggalkan ruang lega untuk 500 baris artifak terhad dengan badan; kelompok yang terlalu besar mungkin masih menghabiskan timbunan anak. Kegagalan menasihatkan untuk merendahkan saiz kelompok atau menaikkan had ini. Nilai tidak sah/bukan positif/bukan integer menggunakan nilai lalai. Eksport Bun kembali ke dalam proses tanpa had ini. |
| `OMNIROUTE_CONFIG_HOT_RELOAD_MS` | `5000` | `src/lib/config/hotReload.ts` | Selang pengundian (ms) untuk muat semula panas konfigurasi. Nilai lebih rendah daripada `1000` ditolak. |
| `OMNIROUTE_DISABLE_REDIS_AUTH_CACHE` | _(didayakan)_ | `src/lib/db/apiKeys.ts` | Tetapkan `1` untuk memintas cache pengesahan kunci API berasaskan Redis (memaksa bacaan DB). |
| `OMNIROUTE_RTK_TRUST_PROJECT_FILTERS` | `0` | `open-sse/services/compression/engines/rtk/filterLoader.ts` | Percayai peraturan penapis projek RTK yang diuruskan pengguna tanpa semakan tandatangan yang ketat. |
| `OMNIROUTE_LITE_MAX_TOOL_LENGTH` | `2000` | `open-sse/services/compression/lite.ts` | Had aksara untuk pemangkasan hasil alat proaktif Lite apabila `lite.maxToolLength` tidak ditetapkan. Julat 256–1000000. Tetapan papan pemuka mengatasi env ini. |
| `OMNI_COMPRESSION_WORKERS` | `2` | `open-sse/services/compression/compressionWorkerPool.ts` | Bilangan maksimum pekerja segerak RTK/Caveman serentak; tugas berlebihan menunggu mengikut FIFO. |
| `OMNI_COMPRESSION_WORKER_TIMEOUT_MS` | `120000` | `open-sse/services/compression/compressionWorkerPool.ts` | Tamat masa setiap tugas dalam milisaat. Pekerja yang tamat masa ditamatkan dan permintaan gagal terbuka tanpa perubahan. |
| `OMNI_COMPRESSION_WORKER_IDLE_MS` | `60000` | `open-sse/services/compression/compressionWorkerPool.ts` | Jangka hayat melahu dalam milisaat sebelum pekerja mampatan yang tidak digunakan ditamatkan. |
| `OMNI_COMPRESSION_WORKER_MAX_OLD_MB` | `1024` | `open-sse/services/compression/compressionWorkerPool.ts` | Had heap generasi lama V8 dalam MB untuk setiap worker mampatan, semua mod (minimum `128`). Tugas yang melebihinya akan gagal terbuka (tidak dimampatkan) dan bukannya membesarkan heap gateway. |
| `COMPRESSION_PIPELINE_BREAKER_ENABLED` | `false` | `open-sse/services/compression/pipelineEngineBreaker.ts` | Suis utama pemutus litar per-enjin bagi pipeline bertingkat T02. **Pilih-masuk (lalai mati)** — apabila diaktifkan, enjin yang berulang kali membuang ralat merentasi permintaan akan dilangkau (gagal-terbuka) untuk tempoh penyejukan; mati = tingkah laku warisan yang serupa bait. |
| `COMPRESSION_PIPELINE_BREAKER_THRESHOLD` | `3` | `open-sse/services/compression/pipelineEngineBreaker.ts` | Bilangan kegagalan merentas-permintaan berturut-turut sebelum pemutus enjin terbuka. |
| `COMPRESSION_PIPELINE_BREAKER_COOLDOWN_MS` | `30000` | `open-sse/services/compression/pipelineEngineBreaker.ts` | Tempoh milisaat enjin yang terbuka kekal dilangkau sebelum sondaan separuh terbuka. |
| `COMPRESSION_CCR_RETRIEVAL_RAMP_FACTOR` | `2` | `open-sse/services/compression/engines/ccr/index.ts` | Ramp maklum balas penerimaan CCR T08/H8: setiap penerimaan terdahulu bagi blok tersimpan menaikkan `minChars` efektifnya secara linear (kandungan yang kerap diterima kurang dimampatkan; `>=3` penerimaan = tidak pernah dimampatkan). `1` menyahaktifkan ramp (langkau binari pada ambang sahaja). |
| `COMPRESSION_CCR_DURABLE_STORE` | `true` | `open-sse/services/compression/engines/ccr/index.ts` | Storan blok tahan lasak CCR (#9061). Menyokong storan dalam ingatan dengan SQLite supaya blok terselamat daripada pengusiran LRU, TTL, mula semula, atau penerimaan yang tiba pada instans lain. Tetapkan `false` untuk menyimpan blok dalam ingatan sahaja. Blok melebihi 512KB dan runtime awan kekal dalam ingatan sahaja tanpa mengira tetapan. |
| `COMPRESSION_PREFIX_FREEZE_ENABLED` | `false` | `open-sse/services/compression/prefixFreeze.ts` | Suis utama pembekuan awalan yang diperhati berdasarkan penggunaan T08/H5. **Pilih-masuk (lalai mati)** — apabila diaktifkan, prompt sistem yang diperhati `>=` ambang dianggap sebagai awalan stabil boleh cache dan dilindungi daripada mampatan walaupun untuk pembekal yang terlepas oleh heuristik cache statik (beku hanya _memelihara_, tidak pernah mengubah). |
| `COMPRESSION_PREFIX_FREEZE_THRESHOLD` | `3` | `open-sse/services/compression/prefixFreeze.ts` | Bilangan pemerhatian terhadap prompt sistem sebelum ia dianggap sebagai awalan stabil yang dibekukan. |
| `OMNIROUTE_BOOTSTRAPPED` | `false` | `src/app/(dashboard)/dashboard/page.tsx` | Ditetapkan `true` oleh skrip bootstrap selepas persediaan awal. Mengawal kebolehnampatan wizard persediaan. |
| `OMNIROUTE_ALLOW_BODY_PROJECT_OVERRIDE` | `0` | `open-sse/executors/antigravity.ts` | Laluan kecemasan: benarkan badan permintaan menggantikan medan projek Antigravity. |
| `ANTIGRAVITY_CREDITS` | `off` | `open-sse/services/antigravityCredits.ts` | Dasar kredit Google One AI: `off` tidak pernah menyuntik kredit, `retry` menyuntik sekali selepas 429 kuota yang layak, dan `always` menyuntik pada permintaan pertama. |
| `ANTIGRAVITY_ALLOW_SIGNATURE_BYPASS` | `0` | `open-sse/translator/request/openai-to-gemini.ts` | Benarkan penterjemah permintaan Antigravity melangkau pengesahan tandatangan permintaan CLI yang ketat apabila huluan menolak tandatangan sebenar (mod nyahpepijat/CLI lapuk). Nilai bukan sifar mengaktifkan pintasan. |
| `AGY_TOKEN_FILE` | `~/.gemini/antigravity-cli/antigravity-oauth-token` | `src/app/api/providers/agy-auth/apply-local/route.ts` | Gantikan laluan fail token Antigravity CLI (agy) untuk import log masuk setempat kesan-auto. |
### Jambatan OAuth CLI (Dalaman)
| Pembolehubah | Lalai | Fail Sumber | Penerangan |
| ------------------- | -------------------- | ------------------------------- | ---------------------------------------------- |
| `OMNIROUTE_SERVER` | kesan-auto | `src/lib/oauth/config/index.ts` | URL pelayan untuk jambatan auth CLI↔OmniRoute. |
| `OMNIROUTE_TOKEN` | _(tidak ditetapkan)_ | `src/lib/oauth/config/index.ts` | Token auth untuk jambatan CLI. |
| `OMNIROUTE_USER_ID` | `cli` | `src/lib/oauth/config/index.ts` | ID pengguna untuk sesi jambatan CLI. |
| `SERVER_URL` | _(tidak ditetapkan)_ | `src/lib/oauth/config/index.ts` | Alias warisan untuk `OMNIROUTE_SERVER`. |
| `CLI_TOKEN` | _(tidak ditetapkan)_ | `src/lib/oauth/config/index.ts` | Alias warisan untuk `OMNIROUTE_TOKEN`. |
| `CLI_USER_ID` | _(tidak ditetapkan)_ | `src/lib/oauth/config/index.ts` | Alias warisan untuk `OMNIROUTE_USER_ID`. |
---
## 11. Kredensial Pembekal OAuth
Kredensial terbina dalam untuk **pembangunan localhost**. Untuk penggunaan jarak jauh, daftarkan kredensial anda sendiri di konsol pembangun setiap pembekal.
| Variable | Provider | Notes |
| ------------------------------------------- | ----------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `CLAUDE_OAUTH_CLIENT_ID` | Claude Code (Anthropic) | Klien awam — tiada rahsia diperlukan. |
| `CLAUDE_CODE_REDIRECT_URI` | Claude Code | Menggantikan URI ubah hala. Lalai: `https://platform.claude.com/oauth/code/callback` |
| `CODEX_OAUTH_CLIENT_ID` | Codex / OpenAI | Klien awam. |
| `GEMINI_OAUTH_CLIENT_ID` | Gemini (Google) | Memerlukan `_SECRET` yang sepadan. |
| `GEMINI_OAUTH_CLIENT_SECRET` | Gemini (Google) | — |
| `KIMI_CODING_OAUTH_CLIENT_ID` | Kimi Coding (Moonshot) | Klien awam. |
| `MUSE_CODE_OAUTH_CLIENT_ID` | Muse Code (Meta) | Penggantian pilihan untuk ID klien device-flow awam Muse CLI. Biarkan tidak ditetapkan untuk menggunakan klien awam terbina dalam. |
| `ANTIGRAVITY_OAUTH_CLIENT_ID` | Antigravity (Google) | Memerlukan `_SECRET` yang sepadan. |
| `ANTIGRAVITY_OAUTH_CLIENT_SECRET` | Antigravity (Google) | — |
| `GITHUB_OAUTH_CLIENT_ID` | GitHub Copilot | Klien awam. |
| `GHE_COPILOT_OAUTH_CLIENT_ID` | GHE Copilot | Penggantian pilihan untuk ID klien OAuth GitHub Enterprise Copilot. Kembali kepada nilai lalai awam `GITHUB_OAUTH_CLIENT_ID` apabila tidak ditetapkan. |
| `COPILOT_INTEGRATION_ID` | GitHub Copilot | Penggantian pilihan untuk ID integrasi klien GitHub Copilot yang dihantar dalam pengepala `Copilot-Integration-Id` dan `Editor-Plugin-Version`. Lalai kepada `copilot-developer-cli`. |
| `WINDSURF_API_KEY` | Windsurf / Devin (v3.8) | Kunci API sandaran yang digunakan oleh `open-sse/executors/devin-cli.ts` apabila tiada kredensial setiap sambungan tersedia. Pilihan. |
| `CLI_DEVIN_BIN` | Devin CLI (v3.8) | Laluan tersuai kepada binari Devin CLI (`devin`). Diselesaikan oleh `open-sse/executors/devin-cli.ts`. |
| `GITLAB_DUO_OAUTH_CLIENT_ID` | GitLab Duo (v3.8) | ID klien OAuth untuk GitLab Duo. Daftarkan aplikasi di `https://gitlab.com/-/profile/applications` dengan URI ubah hala `/callback` dan skop `api, read_user, openid, profile, email`. Kembali kepada `GITLAB_OAUTH_CLIENT_ID`. |
| `GITLAB_DUO_OAUTH_CLIENT_SECRET` | GitLab Duo (v3.8) | Rahsia klien OAuth untuk GitLab Duo. Pilihan — aliran PKCE tidak memerlukan rahsia. Kembali kepada `GITLAB_OAUTH_CLIENT_SECRET`. |
| `GITLAB_DUO_BASE_URL` | GitLab Duo (v3.8) | Menggantikan URL asas GitLab (GitLab hos sendiri). Lalai kepada `https://gitlab.com`. Kembali kepada `GITLAB_BASE_URL`. |
| `GITLAB_BASE_URL` | GitLab Duo (v3.8) | Sandaran legasi untuk `GITLAB_DUO_BASE_URL`. Digunakan apabila varian `_DUO_` tidak ditetapkan. |
| `GITLAB_OAUTH_CLIENT_ID` | GitLab Duo (v3.8) | Sandaran legasi untuk `GITLAB_DUO_OAUTH_CLIENT_ID` yang digunakan oleh `src/lib/oauth/constants/oauth.ts`. |
| `GITLAB_OAUTH_CLIENT_SECRET` | GitLab Duo (v3.8) | Sandaran legasi untuk `GITLAB_DUO_OAUTH_CLIENT_SECRET` yang digunakan oleh `src/lib/oauth/constants/oauth.ts`. |
| `QODER_OAUTH_CLIENT_SECRET` | Qoder | — |
| `QODER_OAUTH_AUTHORIZE_URL` | Qoder | Tetapkan untuk mendayakan OAuth Qoder. |
| `QODER_OAUTH_TOKEN_URL` | Qoder | — |
| `QODER_OAUTH_USERINFO_URL` | Qoder | — |
| `QODER_OAUTH_CLIENT_ID` | Qoder | — |
| `QODER_PERSONAL_ACCESS_TOKEN` | Qoder | Sandaran kunci API langsung (memintas OAuth). |
| `QODER_CLI_WORKSPACE` | Qoder | ID ruang kerja untuk CLI Qoder. |
| `OMNIROUTE_QODER_WORKSPACE` | Qoder | Alias untuk `QODER_CLI_WORKSPACE`. |
| `QODER_CLI_CONFIG_DIR` | Qoder | Mengatasi direktori konfigurasi CLI Qoder (sesi PAT terpencil, mengelakkan log masuk pelayar daripada ditulis ganti). |
| `QODER_CLI_MAX_CONCURRENCY` | Qoder | Bilangan maksimum proses qodercli yang dijalankan serentak (cetakan yang dicetuskan atau gesaan ACP); permintaan tambahan dibariskan mengikut FIFO. Tidak ditetapkan (lalai) = tiada had. |
| `QODER_CLI_QUEUE_TIMEOUT_MS` | Qoder | Tempoh permintaan Qoder menunggu slot qodercli (hanya apabila had ditetapkan) sebelum gagal dengan 429 `qodercli_busy` + `Retry-After`. Lalai `120000`. |
| `QODER_CLI_TRANSPORT` | Qoder | `print` (lalai) mencetuskan `qodercli --print` bagi setiap permintaan; `acp` mengekalkan satu proses `qodercli --acp` yang berterusan bagi setiap PAT. |
| `QODER_CLI_ACP_IDLE_TIMEOUT_MS` | Qoder | Pengangkutan ACP: tamatkan proses qodercli yang berterusan selepas tempoh melahu ini. Lalai `600000`. |
| `QODER_CLI_ACP_STARTUP_TIMEOUT_MS` | Qoder | Pengangkutan ACP: tarikh akhir untuk qodercli memberikan respons kepada `initialize` ACP. Lalai `60000`. |
| `QODER_CLI_ACP_MAX_SESSIONS_PER_PROCESS` | Qoder | Pengangkutan ACP: mulakan semula proses qodercli yang berterusan selepas bilangan sesi ini. Lalai `500`. |
| `BLACKBOX_WEB_VALIDATED_TOKEN` | Blackbox Web | Token `tk` bahagian hadapan untuk dihantar sebagai `validated` pada `/api/chat`. Diperlukan apabila Blackbox menguatkuasakan pemadanan token; jika tidak, OmniRoute menggunakan UUID rawak sebagai sandaran. Lihat isu #2252. |
| `VISION_BRIDGE_BASE_URL` | Pelindung Vision Bridge | URL asas serasi OpenAI untuk panggilan vision-bridge bukan Anthropic. Lalai kepada env URL OpenAI legasi atau api.openai.com. Halakan ke self-loop `/v1` OmniRoute atau mana-mana endpoint serasi OpenAI (Gemini OpenAI-compat, OpenRouter). Isu #2232. Apabila URL ialah `/v1` milik OmniRoute sendiri, sub-permintaan describe menghantar `x-omniroute-admission-bypass: internal` dan mengesahkan dengan kredential self-loop yang telah diselesaikan (sentinel `sk_omniroute` dalam mod setempat, atau `OMNIROUTE_API_KEY` / `ROUTER_API_KEY` — #1350) supaya deployment `REQUIRE_API_KEY=true` berfungsi. |
| `VISION_BRIDGE_API_KEY` | Pelindung Vision Bridge | Kunci API untuk URL di atas. Mengatasi pemboleh ubah env OpenAI / Google setiap penyedia untuk panggilan vision-bridge bukan Anthropic. Model Anthropic mengekalkan laluan kunci Anthropic khusus mereka. Isu #2232. |
| `OMNIROUTE_VISION_BRIDGE_NEGATIVE_CACHE_MS` | Pelindung Vision Bridge | Tempoh hasil penghalaan "tiada calon yang boleh digunakan" disimpan dalam cache, dalam ms (lalai `30000`). Nilai tidak sah atau negatif kembali kepada nilai lalai; `0` mematikan cache negatif. Sumber: `src/lib/guardrails/visionBridgeRouter.ts`. |
> [!WARNING]
>
> 1. Pergi ke [Google Cloud Console → Kredential](https://console.cloud.google.com/apis/credentials)
> 2. Cipta ID Klien OAuth 2.0 (jenis: "Web application")
> 3. Tambah URL pelayan anda sebagai URI ubah hala yang dibenarkan
> 4. Gantikan nilai kredential dalam `.env`.
---
## 12. Penindihan User-Agent Pembekal
Tindih pengepala `User-Agent` yang dihantar kepada setiap pembekal huluan. Ini diselesaikan secara dinamik semasa runtime oleh kelas asas pelaksana:
```
process.env[`${PROVIDER_ID}_USER_AGENT`]
```
> **Sumber:** `open-sse/executors/base.ts` → `buildHeaders()`
| Pembolehubah | Nilai Lalai | Bila Perlu Dikemas Kini |
| -------------------------------- | --------------------------------------------- | ------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `CLAUDE_USER_AGENT` | `claude-cli/2.1.280 (external, cli)` | Apabila Anthropic mengeluarkan versi CLI baharu |
| `CLAUDE_DISABLE_TOOL_NAME_CLOAK` | `false` | `executors/base.ts` + `executors/cliproxyapi.ts` | Tetapkan kepada `1`/`true` untuk memajukan nama alat harness pihak ketiga secara verbatim kepada Anthropic pada kedua-dua laluan terikat Anthropic (OAuth asli dan CLIProxyAPI). Secara lalai, pelaksana mengalias nama alat bukan Claude Code secara berketentuan (pemetaan berkanun Claude Code jika wujud, jika tidak PascalCase) dan membalikkannya semula pada respons melalui `_toolNameMap`, supaya harness dengan alat snake_case tidak ditolak sebagai klien pihak ketiga bercap jari. Untuk penyahpepijatan sahaja. |
| `CODEX_USER_AGENT` | `codex-cli/0.155.0 (Windows 10.0.26200; x64)` | Apabila OpenAI mengemas kini Codex CLI |
| `CODEX_CLIENT_VERSION` | `0.155.0` | Tindih versi klien Codex secara bebas daripada rentetan UA penuh |
| `GROK_CLI_CLIENT_VERSION` | `1.0.41` | Tindih `x-grok-client-version` untuk inferens, penyegerakan model, dan OAuth kod peranti, serta User-Agent Grok CLI lalai untuk inferens dan penyegerakan model. Menerima SemVer dengan metadata prakeluaran/binaan pilihan, sehingga 128 aksara selepas memangkas ruang kosong di sekelilingnya. Nilai yang tidak ditetapkan, kosong, tidak sah, atau mengandungi pemisah baris akan menggunakan pin yang disertakan. Penindihan User-Agent inferens penuh sedia ada mengekalkan keutamaan. |
| `CLAUDE_CODE_CLIENT_VERSION` | `2.1.280` | Tindih versi Claude Code yang diiklankan secara bebas daripada `CLAUDE_USER_AGENT`. Anthropic mengawal akses sesetengah model berdasarkan nilai ini (#12417). |
| `CLAUDE_CODE_CLIENT_BUILD_REVISION` | `1e2` | Tindih akhiran 3 aksara yang ditambahkan oleh OmniRoute kepada `cc_version=` dalam blok pengebilan Claude. Naikkan bersama `CLAUDE_CODE_CLIENT_VERSION` — mematok hanya versi akan mengiklankan pasangan `version.revision` yang tidak dikeluarkan oleh mana-mana binari sebenar. |
| `GITHUB_COPILOT_CLI_VERSION` | `1.0.91` | Tindih versi Copilot CLI yang diiklankan secara bebas daripada `GITHUB_USER_AGENT` |
| `GITHUB_USER_AGENT` | `GitHubCopilotChat/0.54.0` | Apabila GitHub Copilot Chat dikemas kini |
| `ANTIGRAVITY_USER_AGENT` | `antigravity/2.0.1 darwin/arm64` | Apabila Antigravity IDE dikemas kini |
| `KIRO_USER_AGENT` | `AWS-SDK-JS/3.0.0 kiro-ide/1.0.0` | Apabila Kiro IDE dikemas kini |
| `KIRO_OAUTH_CLIENT_ID` | `kiro-cli` | Tindih `clientId` kod peranti sosial Kiro (id awam) |
| `KIRO_VERIFY_FULL_CRC` | `false` | Pilihan sertai: pengesahan CRC mesej penuh setiap bingkai pada strim acara Kiro (nyahpepijat strim yang rosak) |
| `KIRO_CREDIT_PRICE_USD` | `0.02` | USD setiap kredit Kiro; menukar kredit `meteringEvent` kepada kos tepat setiap permintaan |
| `KIRO_REQUIRE_CREDITS` | `false` | Gagalkan respons Kiro yang tidak melaporkan pemeteran kredit dan bukannya merekodkannya sebagai tidak dibil |
| `QODER_USER_AGENT` | `Qoder-Cli` | Apabila Qoder CLI dikemas kini |
| `CURSOR_USER_AGENT` | `Cursor/3.3` | Apabila Cursor dikemas kini |
> [!TIP]
> Anda boleh menambah penindihan User-Agent untuk **mana-mana** pembekal menggunakan corak `{PROVIDER_ID}_USER_AGENT`. Pelaksana membina nama pembolehubah env secara dinamik.
---
## 13. Keserasian Cap Jari CLI
Apabila didayakan, OmniRoute menyusun semula pengepala HTTP dan medan isi JSON agar sepadan dengan tandatangan tepat alat CLI rasmi. Ini mengurangkan risiko akaun ditandai sambil mengekalkan IP proksi anda.
**Sumber:** `open-sse/config/cliFingerprints.ts`, `open-sse/executors/base.ts`
### Mengikut Penyedia
| Pemboleh Ubah | Pengaktifan | Kesan |
| ------------------------ | ----------- | -------------------------------------------- |
| `CLI_COMPAT_CODEX` | `=1` | Meniru tandatangan permintaan Codex CLI |
| `CLI_COMPAT_CLAUDE` | `=1` | Meniru tandatangan permintaan Claude Code |
| `CLI_COMPAT_GITHUB` | `=1` | Meniru tandatangan permintaan GitHub Copilot |
| `CLI_COMPAT_ANTIGRAVITY` | `=1` | Meniru tandatangan permintaan Antigravity |
| `CLI_COMPAT_CURSOR` | `=1` | Meniru tandatangan permintaan Cursor |
| `CLI_COMPAT_KIMI_CODING` | `=1` | Meniru tandatangan permintaan Kimi Coding |
| `CLI_COMPAT_KILOCODE` | `=1` | Meniru tandatangan permintaan Kilo Code |
| `CLI_COMPAT_CLINE` | `=1` | Meniru tandatangan permintaan Cline |
### Global
| Pemboleh Ubah | Pengaktifan | Kesan |
| ---------------- | ----------- | --------------------------------------------------------------------- |
| `CLI_COMPAT_ALL` | `=1` | Dayakan keserasian cap jari untuk **semua** penyedia secara serentak. |
### Penggantian identiti Kimi Coding CLI
| Pemboleh Ubah | Lalai | Fail Sumber | Penerangan |
| ----------------------- | ---------------------- | ---------------------------------------- | -------------------------------------------------------------------------- |
| `KIMI_CLI_VERSION` | `1.36.0` | `src/lib/oauth/providers/kimi-coding.ts` | Gantikan versi Kimi CLI yang dihantar semasa panggilan OAuth/API. |
| `KIMI_CODING_DEVICE_ID` | _(lalai yang dirakam)_ | `src/lib/oauth/providers/kimi-coding.ts` | Gantikan ID peranti Kimi yang dirakam dan digunakan dalam pengepala klien. |
> [!NOTE]
> Ciri ini berfungsi bersama penggantian User-Agent (§12). Sistem cap jari mengendalikan susunan pengepala dan susunan medan isi, manakala penggantian User-Agent mengendalikan rentetan UA tertentu. Kedua-duanya boleh didayakan secara berasingan.
---
## 14. Penyedia Kunci API
Kunci API untuk penyedia yang menggunakan pengesahan langsung. **Persediaan pilihan:** Dashboard → Providers → Add API Key.
Penetapan melalui pemboleh ubah persekitaran ialah alternatif untuk penggunaan Docker atau tanpa paparan.
Corak yang dikenal pasti: `{PROVIDER_ID}_API_KEY`
| Pemboleh Ubah | Penyedia |
| ------------------ | ------------------------------------------------------- |
| `DEEPSEEK_API_KEY` | DeepSeek |
| `NVIDIA_API_KEY` | NVIDIA NIM |
| `JINA_AI_API_KEY` | Jina AI (Foundation API + sandaran Reader) |
| `JINA_API_KEY` | Jina AI (alias untuk `JINA_AI_API_KEY`) |
| `GEMINI_API_KEY` | Gemini (Google AI Studio) pembenaman + sandaran sembang |
| `GOOGLE_API_KEY` | Gemini (alias untuk `GEMINI_API_KEY`) |
> [!NOTE]
> Entri `${PROVIDER}_API_KEY` statik untuk Groq, xAI, Mistral, Perplexity, Together AI, Fireworks, Cerebras, Cohere, Nebius dan Qianfan telah dialih keluar dalam v3.8.0 kerana masa jalan tidak lagi membacanya — penyedia tersebut bergantung sepenuhnya pada Dashboard / `data/provider-credentials.json` / pangkalan data yang disulitkan. Lihat bahagian _Audit: Pemboleh Ubah yang Dialih Keluar / Tidak Digunakan_ di bahagian bawah dokumen ini untuk laluan migrasi.
> [!TIP]
> Kunci yang ditetapkan melalui Dashboard disimpan dalam bentuk tersulit dalam SQLite dan diberi keutamaan berbanding pemboleh ubah persekitaran.
>
> **Jina:** Pembenaman, susun semula, pengelasan dan segmentasi `jina-ai/…`, serta `jina-search`, **tidak** mengenakan caj pada kunci persekitaran kluster apabila sambungan dashboard `jina-ai` (atau `jina-reader` yang dikongsi) tersedia — `getProviderCredentials` mengisi yang pertama dahulu. `JINA_AI_API_KEY` / `JINA_API_KEY` hanya digunakan apabila tiada kunci dashboard yang boleh digunakan. Log panggilan mengaitkan sandaran persekitaran sebagai `connection_id=env:JINA_AI_API_KEY`. Kad Reader (`jina-reader`, `r.jina.ai`) tidak pernah menyediakan `/v1/embeddings` atau `/v1/rerank`.
>
> **Gemini:** `gemini/gemini-embedding-2` (alias `google/gemini-embedding-2`) menggunakan sambungan dashboard `gemini` terlebih dahulu. `GEMINI_API_KEY` / `GOOGLE_API_KEY` hanya digunakan apabila tiada kunci dashboard yang boleh digunakan. Log panggilan mengaitkan sandaran persekitaran sebagai `connection_id=env:GEMINI_API_KEY`. Trafik multimodal asli menggunakan `x-goog-api-key` terhadap `:embedContent` / `:batchEmbedContents` — N item `input` OpenAI menghasilkan N vektor.
---
## 15. Tetapan Timeout
Semua nilai adalah dalam **milisaat**. Resolusi berpusat dalam `src/shared/utils/runtimeTimeouts.ts`.
### Hierarki Timeout
```
REQUEST_TIMEOUT_MS (penggantian global)
├─→ FETCH_TIMEOUT_MS (panggilan pembekal huluan, lalai: 600000)
│ ├─→ FETCH_HEADERS_TIMEOUT_MS (mewarisi daripada FETCH_TIMEOUT_MS)
│ ├─→ FETCH_BODY_TIMEOUT_MS (mewarisi daripada FETCH_TIMEOUT_MS)
│ ├─→ TLS_CLIENT_TIMEOUT_MS (mewarisi daripada FETCH_TIMEOUT_MS)
│ │ └── TLS_FIRST_BYTE_WATCHDOG_MS (bebas, lalai: 10000)
│ ├── RESPONSES_FIRST_BYTE_TIMEOUT_MS (bebas, lalai: 15000)
│ ├── OPENCODE_RESPONSES_HEADERS_WAIT_MS (bebas, lalai: 0 = mati, dicadangkan: 30000)
│ ├── OPENCODE_RESPONSES_HEADERS_WAIT_MAX_ROTATIONS (bebas, lalai: 2)
│ ├── FETCH_CONNECT_TIMEOUT_MS (bebas, lalai: 30000)
│ └── FETCH_KEEPALIVE_TIMEOUT_MS (bebas, lalai: 4000)
├─→ STREAM_IDLE_TIMEOUT_MS (mewarisi daripada REQUEST_TIMEOUT_MS, lalai: 600000)
├─→ STREAM_ACTIVE_TIMEOUT_MS (bebas, lalai: 1260000; 0 melumpuhkan)
├─→ STREAM_READINESS_TIMEOUT_MS (mewarisi daripada REQUEST_TIMEOUT_MS, lalai: 80000)
├─→ STREAM_READINESS_MAX_TIMEOUT_MS (mengehadkan pelanjutan kesediaan adaptif, lalai: 180000)
└─→ API_BRIDGE_PROXY_TIMEOUT_MS (mewarisi daripada REQUEST_TIMEOUT_MS, lalai: 30000)
├─→ API_BRIDGE_SERVER_REQUEST_TIMEOUT_MS (diperoleh, lalai: 300000)
├── API_BRIDGE_SERVER_HEADERS_TIMEOUT_MS (lalai: 60000)
├── API_BRIDGE_SERVER_KEEPALIVE_TIMEOUT_MS (lalai: 5000)
└── API_BRIDGE_SERVER_SOCKET_TIMEOUT_MS (lalai: 0 = dilumpuhkan)
```
| Pembolehubah | Lalai | Penerangan |
| ----------------------------------------------- | ----------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `REQUEST_TIMEOUT_MS` | _(tidak ditetapkan)_ | Pintasan global — mengatasi kedua-dua lalai `FETCH_TIMEOUT_MS` dan `STREAM_IDLE_TIMEOUT_MS`. |
| `FETCH_TIMEOUT_MS` | `600000` | Jumlah tamat masa permintaan HTTP untuk panggilan pembekal hulu. |
| `STREAM_IDLE_TIMEOUT_MS` | `600000` | Keheningan maksimum antara bait mentah hulu sebelum dibatalkan. Model pemikiran lanjutan jarang menjeda >90s. |
| `STREAM_ACTIVE_TIMEOUT_MS` | `1260000` | Jangka hayat strim SSE aktif maksimum keseluruhan; tidak pernah diset semula apabila menerima bait hulu dan bebas daripada `REQUEST_TIMEOUT_MS`. Diperoleh daripada `timeoutMs` setiap model yang terbesar dalam daftar (1200000, Codex) ditambah margin 60000, supaya model yang dibenarkan berjalan sehingga bajet penuhnya tidak pernah dimatikan di tengah jawapan. Tetapkan kepada `0` untuk melumpuhkan. |
| `OMNIROUTE_SSE_COMMENTS` | _(dilumpuhkan)_ | Sama ada OmniRoute boleh mengeluarkan baris komen SSE `:` (cth. denyutan `: keepalive` dan pelanduk metadata `x-omniroute-*`). Dilumpuhkan secara lalai (#10524) kerana klien serasi OpenAI yang ketat menjalankan JSON.parse pada setiap baris SSE dan ranap apabila menemui komen `:`; denyutan `data:` tidak terjejas. Tetapkan `on`/`true`/`1`/`yes` untuk memilih sertai semula. Digunakan oleh `open-sse/utils/sseHeartbeat.ts`. |
| `SSE_COALESCE_MS` | `0` (mati) | Pilih sertai: gabungkan peristiwa Claude `content_block_delta` yang berturut-turut (indeks blok dan jenis delta yang sama) yang dihantar kepada klien Claude, dengan pengosongan sekurang-kurangnya setiap N ms. Tanpa kehilangan; `signature_delta` dan peristiwa sempadan tidak pernah digabungkan. Terpakai kepada setiap jenis delta melainkan pembolehubah setiap jenis di bawah ditetapkan. Digunakan oleh `open-sse/utils/sseDeltaCoalesce.ts`. |
| `SSE_COALESCE_THINKING_MS` | `0` (mati) | Pengatasan setiap jenis bagi `SSE_COALESCE_MS` untuk `thinking_delta`. |
| `SSE_COALESCE_TEXT_MS` | `0` (mati) | Pengatasan setiap jenis bagi `SSE_COALESCE_MS` untuk `text_delta`. |
| `SSE_COALESCE_INPUT_JSON_MS` | `0` (mati) | Pengatasan setiap jenis bagi `SSE_COALESCE_MS` untuk `input_json_delta`. |
| `SSE_FRAME_COALESCE_MS` | `0` (mati) | Pilih sertai: kelompokkan bingkai SSE yang dihantar dalam tempoh N ms ke dalam satu penulisan kepada klien. Bingkai pertama dan bingkai terminal (`[DONE]`, `message_stop`, `error`, `response.completed`/`failed`/`incomplete`) tidak pernah ditangguhkan; apabila pengelompokan aktif, ITL mengukur jurang kelompok. Digunakan oleh `open-sse/utils/sseOutputSink.ts`. |
| `SSE_STALL_WATCHDOG` | `timer` | Pelaksanaan pengawas henti-bait untuk respons penstriman. `timer` menyetel semula satu pemasa bagi setiap ketulan hulu (terpicu tepat pada bajet henti); `interval` mengekalkan satu semakan bagi setiap strim dengan tempoh `clamp(budget/4, 1s, 5s)`, supaya henti terpicu dalam masa bajet + tempoh. Digunakan oleh `open-sse/utils/streamStallWatchdog.ts`. |
| `STREAM_READINESS_TIMEOUT_MS` | `80000` | Masa untuk menerima peristiwa SSE bukan-ping yang pertama. Mewarisi `REQUEST_TIMEOUT_MS` apabila ditetapkan. |
| `STREAM_READINESS_MAX_TIMEOUT_MS` | `180000` | Tetingkap kesediaan peristiwa pertama adaptif maksimum untuk permintaan penstriman yang besar, sarat alat, atau penaakulan tinggi. |
| `OMNIROUTE_AGENT_GOAL_POLICY_ENABLED` | `true` | Suis pemati untuk heuristik `/goal`. Tetapkan `false`/`0`/`off` untuk melumpuhkan pengesanan sepenuhnya — tamat masa kesediaan dan pemulihan strim tidak pernah dinaikkan oleh badan/pengepala permintaan, sekali gus mengurangkan penguatan tamat masa yang dikawal klien. |
| `OMNIROUTE_AGENT_GOAL_READINESS_MAX_TIMEOUT_MS` | `600000` | Tetingkap kesediaan peristiwa pertama maksimum untuk larian ejen `/goal` yang dikesan atau permintaan yang dipaksa dengan `x-omniroute-agent-goal`. |
| `OMNIROUTE_AGENT_GOAL_STREAM_RECOVERY` | `true` | Dayakan pemulihan strim awal secara automatik untuk larian ejen `/goal` yang dikesan. Tetapkan `false`/`0`/`off` untuk melumpuhkan pilihan sertai khusus matlamat. Ini hanya boleh MENAMBAH pemulihan di atas lalai pengendali — ia tidak pernah mengatasi pilihan keluar eksplisit `STREAM_RECOVERY_ENABLED`/tetapan DB. |
| `OMNIROUTE_CODEX_DROP_NONSTANDARD_EVENTS` | `true` | Buang peristiwa SSE `codex.*` bukan standard (cth. `codex.rate_limits`) yang merosakkan `responses.stream()` SDK OpenAI dengan ralat 502. Lalai AKTIF (#11014). Tetapkan `0`/`false`/`no`/`off` untuk meneruskannya. |
| `OMNIROUTE_CODEX_APPSERVER_WS` | _(tidak ditetapkan)_ | Pengangkutan pelayan-aplikasi Codex pilih sertai. Titik hujung WebSocket (`ws://`/`wss://`) bagi sidecar `codex app-server` setempat. Apabila ditetapkan bersama token, permintaan Codex dihalakan melalui JSON-RPC kepada sidecar dan bukannya API Responses HTTP. Juga boleh ditetapkan bagi setiap sambungan melalui `providerSpecificData.codexAppServerUrl`. Digunakan oleh `open-sse/executors/codex/appServerConfig.ts`. |
| `OMNIROUTE_CODEX_APPSERVER_WS_TOKEN` | _(tidak ditetapkan)_ | Token keupayaan/bearer sebaris yang dikemukakan kepada pelayan-aplikasi. Pengatasan setiap sambungan: `providerSpecificData.codexAppServerToken`. |
| `OMNIROUTE_CODEX_APPSERVER_WS_TOKEN_FILE` | _(tidak ditetapkan)_ | Laluan ke fail yang mengandungi token keupayaan app-server (daripada `codex app-server --ws-token-file`). Digunakan apabila `OMNIROUTE_CODEX_APPSERVER_WS_TOKEN` tidak ditetapkan. Penggantian setiap sambungan: `providerSpecificData.codexAppServerTokenFile`. |
| `OMNIROUTE_CODEX_APPSERVER_CWD` | `/tmp` | Direktori kerja tempat turn app-server dijalankan. Penggantian setiap sambungan: `providerSpecificData.codexAppServerCwd`. |
| `OMNIROUTE_CODEX_APPSERVER_APPROVAL` | _(tidak ditetapkan)_ | Polisi kelulusan yang diserahkan kepada turn app-server (cth. `never`, `on-request`). Penggantian setiap sambungan: `providerSpecificData.codexAppServerApprovalPolicy`. |
| `OMNIROUTE_CODEX_APPSERVER_SANDBOX` | _(tidak ditetapkan)_ | Polisi sandbox yang diserahkan kepada turn app-server (cth. `read-only`, `workspace-write`, `danger-full-access`). Apabila tidak ditetapkan, pelaksana menggunakan lalai `workspace-write` (diperketatkan; sebelum ini `danger-full-access`). Penggantian setiap sambungan: `providerSpecificData.codexAppServerSandbox`. |
| `OMNIROUTE_CODEX_APPSERVER_AUTO_APPROVE` | `false` | Luluskan secara automatik gesaan kelulusan app-server itu sendiri (pelaksanaan perintah/fail/kebenaran pada hos). Mati secara lalai — gesaan ditolak secara automatik; panggilan alat harness tidak terjejas (ia bergerak melalui passthrough `item/tool/call` yang berasingan). Menerima `true`/`1`/`yes`. Penggantian setiap sambungan: `providerSpecificData.codexAppServerAutoApprove`. |
| `FETCH_HEADERS_TIMEOUT_MS` | = `FETCH_TIMEOUT_MS` | Masa untuk menerima pengepala respons. |
| `OMNIROUTE_FETCH_START_TIMEOUT_CAP_MS` | `110000` | Tempoh menunggu maksimum untuk pengepala respons pada permintaan penstriman (ms). `0` melumpuhkan had ini; `fetchStartTimeoutCapMs` pembekal yang eksplisit diberi keutamaan. |
| `OMNIROUTE_DIRECT_HEADERS_TIMEOUT_MS` | `30000` (30s) | Tempoh menunggu permulaan respons maksimum (ms) untuk setiap percubaan langsung tanpa proksi. Tamat masa mencuba semula sekali pada soket baharu; tetapkan `0` untuk melumpuhkan had ini dan mengekalkan tingkah laku sebelumnya. |
| `OMNIROUTE_LOCAL_DIRECT_HEADERS_TIMEOUT_MS` | `300000` (5 min) | Paras minimum permulaan respons (ms) untuk percubaan langsung tanpa proksi yang hos sasarannya adalah persendirian/LAN/loopback (contohnya `localhost`, `host.docker.internal`, `192.168.x.x`), supaya permulaan sejuk Ollama asli tidak terputus oleh lalai 30s di atas. Bertindak sebagai paras minimum: tempoh menunggu efektif ialah nilai yang lebih besar antara nilai ini dan `OMNIROUTE_DIRECT_HEADERS_TIMEOUT_MS`; `0` atau nilai tidak sah membuang paras minimum tempatan. Hos jauh tidak terjejas. |
| `OMNIROUTE_DIRECT_RESPONSE_RETRY_TIMEOUT_MS` | `600000` (10 min) | Paras maksimum (ms) untuk percubaan CUBA SEMULA pada soket baharu selepas tamat masa permulaan respons percubaan terkumpul di atas (#13703). Hanya terpakai apabila pemanggil telah melampirkan isyarat had masa sendiri (kaskad sambungan/model/pembekal/`FETCH_TIMEOUT_MS` yang diselesaikan); isyarat itu adalah had sebenar dan berlaku dahulu dalam laluan yang dimaksudkan, jadi ini adalah sandaran longgar dan bukannya had tetap — tanpanya, percubaan semula menggunakan semula tetingkap `OMNIROUTE_DIRECT_HEADERS_TIMEOUT_MS` yang singkat dan sama seperti percubaan terkumpul, lalu mengembalikan 504 pada model penaakulan sihat dengan TTFB perlahan. Tidak pernah dibenarkan di bawah paras minimum tetap di atas; apabila pemanggil tidak membekalkan sebarang isyarat had masa, percubaan semula mengekalkan paras minimum tetap tanpa perubahan. |
| `FETCH_BODY_TIMEOUT_MS` | = `FETCH_TIMEOUT_MS` | Masa untuk menerima badan respons penuh. |
| `FETCH_CONNECT_TIMEOUT_MS` | `30000` | Tamat masa penubuhan sambungan TCP. |
| `FETCH_KEEPALIVE_TIMEOUT_MS` | `4000` | Tamat masa tidak aktif soket keep-alive. |
| `TLS_CLIENT_TIMEOUT_MS` | = `FETCH_TIMEOUT_MS` | Tamat masa proksi cap jari TLS (wreq-js). |
| `TLS_FIRST_BYTE_WATCHDOG_MS` | `10000` | Menghadkan masa-ke-bait-pertama khususnya pada badan pengangkutan cap-jari-TLS wreq-js; `TLS_CLIENT_TIMEOUT_MS` sahaja tidak dapat mengesan badan yang terhenti kerana ia selesai sebaik sahaja pengepala tiba (#12656). Tamat masa membatalkan pembaca wreq dan kembali kepada penghantar langsung/proksi; `0` melumpuhkan pengawas. |
| `RESPONSES_FIRST_BYTE_TIMEOUT_MS` | `15000` | Pelaksana OpenCode sahaja, dan hanya semasa bendera ciri `OPENCODE_RESPONSES_STALL_ROTATION` aktif (lalai mati): menghadkan tempoh menunggu bait badan pertama balasan Responses yang distrimkan selepas pengepalanya (#13484). Strim Responses dibuka dengan `response.created`, jadi kesenyapan melepasi tetingkap ini adalah kebuntuan: akaun disejukkan dan permintaan berpusing ke akaun seterusnya sekali; kebuntuan kedua gagal dengan pantas. `0` melumpuhkan pengawal walaupun dengan bendera aktif. |
| `OPENCODE_RESPONSES_HEADERS_WAIT_MS` | `0` (= mati) | Pelaksana OpenCode sahaja: menghadkan tempoh menunggu pengepala respons huluan pada panggilan Responses yang distrimkan apabila akaun lain masih tersedia — permintaan beratur berhenti menunggu dan beralih dan bukannya memegang tetingkap pengepala penuh. Hanya panggilan Responses yang distrimkan terjejas (strim Responses dibuka dengan `response.created`, jadi kesenyapan di situ bermaksud baris gilir, bukan penjanaan); pelengkapan sembang dan panggilan tidak distrimkan tidak disentuh, dan tetingkap hanya memendekkan siling fetch-start efektif, tidak pernah memanjangkannya. Nilai yang dicadangkan apabila mengaktifkan: `30000`. `0` melumpuhkan. |
| `OPENCODE_RESPONSES_HEADERS_WAIT_MAX_ROTATIONS` | `2` | Pelaksana OpenCode sahaja: berapa kali setiap permintaan had tunggu-headers di atas boleh beralih ke akaun seterusnya. Akaun terakhir yang tinggal sentiasa mengekalkan tetingkap headers penuh. |
| `OPENCODE_PARK_AND_RESUME` | `false` | Pelaksana OpenCode sahaja: parkirkan permintaan dengan heartbeat selepas 429 sementara yang berulang (atau penanda ketegangan pool baharu), kemudian main semula satu leg terhad sehingga 3 akaun berturut-turut dan bukannya mengembarkan keseluruhan armada (#13924). Mati secara lalai: setiap 429 berpusing ke akaun seterusnya tepat seperti sebelumnya. |
| `OPENCODE_PARK_REPLAY_SERVE_SETASIDE` | `false` | Pelaksana OpenCode sahaja: apabila setiap akaun sedia-cooldown dalam leg main semula park-and-resume diketepikan oleh memori penolakan proksi, layaninya juga dan bukannya tidak memainkan semula apa-apa (#14851, susulan kepada #14750). Mati secara lalai: leg main semula kosong dalam kes tersebut, seperti sebelum #14750. |
| `STREAM_READINESS_STALL_RETRY` | `false` | Sembang penstriman sahaja: apabila badan hulu pertama terhenti sebelum menghasilkan peristiwa yang boleh digunakan, buat satu percubaan kedua yang terhad melalui laluan penghalaan yang sama dengan bajet kesediaan yang sama dan tanpa penalti akaun. Mati secara lalai: badan pertama yang terhenti menggagalkan permintaan tanpa cubaan semula. |
| `OPENCODE_POOL_RESELECT` | `false` | Pelaksana OpenCode sahaja: selepas 429 daripada pembekal berbucket egress pada akaun tanpa proksi dalam konteks pool ambien, minta ahli lain daripada pool sambungan untuk percubaan seterusnya dan bukannya mencuba semula alamat egress yang sama. Menyusun semula, tidak pernah mengecualikan: pool yang kehabisan mengekalkan tingkah laku semasa. Mati secara lalai: setiap 429 berpusing ke akaun seterusnya tepat seperti sebelumnya. |
| `OPENCODE_POOL_STRAIN_MARKER_PATH` | _(tidak ditetapkan)_ | Pelaksana OpenCode sahaja: menggantikan laluan penanda ketegangan pool yang dibaca sebelum parkir (`{since, reason, ttl_s}`, lalai `/tmp/opencode-pool-strain.json`, #13924). Penanda baharu parkir tanpa mengira semula; penanda tiada atau lapuk kembali kepada pembilang burst. |
| `API_BRIDGE_PROXY_TIMEOUT_MS` | `30000` | Tamat masa hop proksi untuk permintaan bridge `/v1`. |
| `FIRECRAWL_BASE_URL` | `https://api.firecrawl.dev` | Halakan pelaksana web-fetch Firecrawl ke instans hos sendiri (kunci API pilihan di luar awan). |
| `FIRECRAWL_TIMEOUT_MS` | `30000` | Tamat masa setiap permintaan untuk pelaksana web-fetch Firecrawl. |
| `TAVILY_BASE_URL` | _(tidak ditetapkan)_ | URL asas untuk pengambil kuota `/usage` Tavily (Provider Limits); diabaikan apabila ia menghala ke `api.tavily.com`. Jika tidak ditetapkan, kembali kepada URL asas sambungan. |
| `API_BRIDGE_SERVER_REQUEST_TIMEOUT_MS` | `300000` | Tamat masa permintaan pelayan keseluruhan untuk bridge. |
| `API_BRIDGE_SERVER_HEADERS_TIMEOUT_MS` | `60000` | Masa untuk menghantar headers respons melalui bridge. |
| `API_BRIDGE_SERVER_KEEPALIVE_TIMEOUT_MS` | `5000` | Tamat masa idle keep-alive bridge. |
| `API_BRIDGE_SERVER_SOCKET_TIMEOUT_MS` | `0` | Tamat masa soket mentah (0 = dilumpuhkan). |
| `SHUTDOWN_TIMEOUT_MS` | `30000` | Tempoh tangguh pada SIGTERM/SIGINT sebelum keluar paksa. |
| `OMNIROUTE_DEFAULT_FETCH_TIMEOUT_MS` | `120000` | Sandaran yang digunakan oleh `src/shared/utils/fetchTimeout.ts` apabila `FETCH_TIMEOUT_MS` tidak ditetapkan. |
| `OMNIROUTE_PROVIDER_PROBE_TIMEOUT_MS` | `8000` | Tamat masa (ms) untuk pratetap `validationRead` dan `modelsProbe` dalam `src/shared/network/safeOutboundFetch.ts`. Naikkan untuk titik hujung yang perlahan (Cerebras, Cloudflare AI, Groq) bagi mengelakkan peralihan berulang antara aktif/ralat dalam papan pemuka. Kembali kepada 8000ms untuk nilai tidak sah (<1000) atau bukan angka. |
| `OMNIROUTE_RELAY_FETCH_TIMEOUT_MS` | `25000` | Tamat masa fetch khusus relay dalam `open-sse/utils/proxyFetch.ts` (#9158). Relay yang tergantung mesti gagal sebelum tamat masa klien/ejen (~30s) supaya pemanggil melihat kegagalan khusus relay dan bukannya tamat masa hulu generik. Dihadkan pada `29000` supaya ia sentiasa berlaku dahulu. |
| `OMNIROUTE_RETRY_BACKOFF_MS` | `10` | Backoff cuba semula bersama untuk laluan cuba-semula-sekali direct/relay/proxy dalam `open-sse/utils/proxyFetch.ts` (#9158). `0` = cuba semula serta-merta. |
| `OMNIROUTE_CLAUDE_TLS_TIMEOUT_MS` | `60000` | Tamat masa permintaan wreq-js asli (`claudeTlsClient.ts`). |
| `OMNIROUTE_CLAUDE_TLS_GRACE_MS` | `10000` | Tangguh had akhir tegar JS mutlak yang ditambah di atas tamat masa asli. |
| `OMNIROUTE_PPLX_TLS_TIMEOUT_MS` | `30000` | Tamat masa permintaan wreq-js asli (`perplexityTlsClient.ts`). |
| `OMNIROUTE_PPLX_TLS_GRACE_MS` | `10000` | Tenggang masa mutlak hard-deadline JS yang ditambah pada timeout asli. |
| `OMNIROUTE_PPLX_SEARCH_HINT` | `0` (mati) | Menambahkan "You have built-in web search. Answer questions directly using search results." pada mesej sistem pemanggil (`perplexity-web/protocol.ts`). Dimatikan secara lalai — Perplexity tetap membuat carian, dan ayat itu bocor ke dalam balasan sebagai meta-komen untuk klien pengekodan. Tetapkan `1`/`true`/`yes`/`on` untuk memulihkannya. |
| `OMNIROUTE_GROK_TLS_TIMEOUT_MS` | `60000` | Timeout permintaan wreq-js asli (`grokTlsClient.ts`). |
| `OMNIROUTE_GROK_TLS_GRACE_MS` | `10000` | Tenggang masa mutlak hard-deadline JS yang ditambah pada timeout asli. |
| `OMNIROUTE_NOTION_TLS_TIMEOUT_MS` | `30000` | Timeout permintaan wreq-js asli (`notionTlsClient.ts`); `notion-web` menaikkannya bagi setiap permintaan kepada `180000` untuk penjanaan yang lama. |
| `OMNIROUTE_NOTION_TLS_GRACE_MS` | `10000` | Tenggang masa mutlak hard-deadline JS yang ditambah pada timeout asli. |
| `OMNIROUTE_BROWSER_POOL` | `on` | Pool pelayar Playwright dikongsi untuk sembang web-cookie berasaskan pelayar (`browserPool.ts`); tetapkan `off` untuk melumpuhkan. |
| `OBSCURA_BIN` | `auto-detect` | Laluan ke binari `obscura` yang digunakan sebagai enjin utama oleh pool pelayar dan pelaksana Cloudflare Playground (`open-sse/services/obscura.ts`); dikesan secara automatik daripada PATH sistem apabila tidak ditetapkan. |
| `OBSCURA_CDP_ENDPOINT` | _(tidak ditetapkan)_ | Tudingkan kepada Obscura yang sudah berjalan (`http://host:port`) dan bukannya melancarkan satu; modul ini tidak memiliki proses tersebut (`open-sse/services/obscura.ts`). |
| `OBSCURA_PORT` | `random free port` | Port eksplisit untuk `obscura serve` yang dilancarkan; port kosong dipilih secara automatik apabila tidak ditetapkan (`open-sse/services/obscura.ts`). |
| `WEB_COOKIE_USE_BROWSER` | `0` | Memilih permintaan sembang web-cookie untuk menggunakan laluan berasaskan pelayar (`browserBackedChat.ts`); `1` untuk membolehkan. |
| `KIMI_WEB_BASE_URL` | `https://www.kimi.ai` | URL asas untuk pelaksana Kimi Web (kimi.ai antarabangsa Connect-RPC) (`kimi-web.ts`); ganti hanya untuk endpoint cermin/proksi. |
| `KIMI_WEB_CHAT_URL` | `/apiv2/kimi.gateway.chat.v1.ChatService/Chat` | Endpoint sembang penuh untuk pelaksana Kimi Web (`kimi-web.ts`). |
| `OMNIROUTE_LOGIN_BROWSER_PATH` | _(dikesan secara automatik)_ | Laluan ke executable Chrome/Edge sistem untuk log masuk pelayar interaktif Adobe Firefly (`adobeFireflyBrowserLogin.ts`); mengatasi pengesanan automatik mengikut OS. |
| `OMNIROUTE_STANDALONE_DIR` | _output standalone .build/_ | Penggantian masa bina untuk direktori output standalone yang digunakan oleh langkah kolokasi pasca-bina (`scripts/build/colocate-standalone.mjs`); alatan bina, bukan masa jalan. |
Percubaan sasaran combo mewarisi timeout permintaan upstream yang telah diselesaikan (`FETCH_TIMEOUT_MS`, atau
`REQUEST_TIMEOUT_MS` apabila ia membekalkan lalai fetch). Tetapkan `targetTimeoutMs` dalam combo,
lalai combo, atau penggantian penyedia hanya untuk mempercepatkan fallback combo; nilai yang melebihi
timeout upstream semasa dihadkan kepada timeout upstream.
`comboTimeoutMs` ialah bajet masa dinding (wall-clock) keseluruhan combo yang berasingan merentasi sasaran failover.
Biarkan ia tidak ditetapkan atau `0` untuk mengekalkan lelaran tanpa had (hentian gantung 10 minit yang
dikodkan keras dalam `comboPredicates.ts` masih terpakai). Nilai positif menggantikan
jaring keselamatan itu untuk combo tersebut. Pastikan `comboTimeoutMs` lebih lama daripada `targetTimeoutMs` supaya failover
masih mempunyai masa selepas sasaran pertama yang perlahan.
### Ambang Circuit Breaker
Penalaan circuit breaker peringkat penyedia. Nilai lalai mencerminkan nilai berskala yang digunakan sejak v3.6 untuk 500+ sambungan.
| Pembolehubah | Lalai | Fail Sumber | Penerangan |
| ------------------------------------------------------------- | --------- | ------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `OMNIROUTE_CIRCUIT_BREAKER_OAUTH_THRESHOLD` | `8` | `open-sse/config/constants.ts` | Ambang kegagalan berturut-turut untuk pembekal OAuth sebelum pemangkas litar terpicu. |
| `OMNIROUTE_CIRCUIT_BREAKER_OAUTH_RESET_MS` | `60000` | `open-sse/config/constants.ts` | Tetingkap set semula (ms) untuk pemangkas litar pembekal OAuth. |
| `OMNIROUTE_CIRCUIT_BREAKER_API_KEY_THRESHOLD` | `12` | `open-sse/config/constants.ts` | Ambang kegagalan berturut-turut untuk pembekal kunci API. |
| `OMNIROUTE_CIRCUIT_BREAKER_API_KEY_RESET_MS` | `30000` | `open-sse/config/constants.ts` | Tetingkap set semula (ms) untuk pemangkas litar pembekal kunci API. |
| `OMNIROUTE_CIRCUIT_BREAKER_LOCAL_THRESHOLD` | `2` | `open-sse/config/constants.ts` | Ambang kegagalan berturut-turut untuk pembekal tempatan (Ollama, LM Studio, ...). |
| `OMNIROUTE_CIRCUIT_BREAKER_LOCAL_RESET_MS` | `15000` | `open-sse/config/constants.ts` | Tetingkap set semula (ms) untuk pemangkas litar pembekal tempatan. |
| `OMNIROUTE_PROVIDER_BREAKER_OAUTH_FAILURE_THRESHOLD` | `10` | `open-sse/config/constants.ts` | Pemangkas litar peringkat pembekal: kegagalan dalam tetingkap sebelum keseluruhan pembekal OAuth memasuki penyejukan. |
| `OMNIROUTE_PROVIDER_BREAKER_OAUTH_FAILURE_WINDOW_MS` | `900000` | `open-sse/config/constants.ts` | Pemangkas litar peringkat pembekal: tetingkap kiraan kegagalan bergulir (ms) untuk pembekal OAuth. |
| `OMNIROUTE_PROVIDER_BREAKER_OAUTH_COOLDOWN_MS` | `300000` | `open-sse/config/constants.ts` | Pemangkas litar peringkat pembekal: penyejukan (ms) sebaik sahaja ambang pembekal OAuth dicapai. |
| `OMNIROUTE_PROVIDER_BREAKER_OAUTH_DEGRADATION_THRESHOLD` | `5` | `open-sse/config/constants.ts` | Pembekal OAuth memasuki DEGRADED apabila jumlah kegagalan mencapai angka ini. |
| `OMNIROUTE_PROVIDER_BREAKER_OAUTH_MAX_BACKOFF_MULTIPLIER` | `8` | `open-sse/config/constants.ts` | Pendarab peningkatan resetTimeout maksimum untuk pembekal OAuth. |
| `OMNIROUTE_PROVIDER_BREAKER_OAUTH_BACKOFF_ESCALATION_COUNT` | `2` | `open-sse/config/constants.ts` | Pembekal OAuth ditingkatkan selepas bilangan kitaran terbuka ini. |
| `OMNIROUTE_PROVIDER_BREAKER_API_KEY_FAILURE_THRESHOLD` | `15` | `open-sse/config/constants.ts` | Pemangkas litar peringkat pembekal: kegagalan dalam tetingkap sebelum keseluruhan pembekal kunci API memasuki penyejukan. |
| `OMNIROUTE_PROVIDER_BREAKER_API_KEY_FAILURE_WINDOW_MS` | `1800000` | `open-sse/config/constants.ts` | Pemangkas litar peringkat pembekal: tetingkap kiraan kegagalan bergulir (ms) untuk pembekal kunci API. |
| `OMNIROUTE_PROVIDER_BREAKER_API_KEY_COOLDOWN_MS` | `600000` | `open-sse/config/constants.ts` | Pemangkas litar peringkat pembekal: penyejukan (ms) sebaik sahaja ambang pembekal kunci API dicapai. |
| `OMNIROUTE_PROVIDER_BREAKER_API_KEY_DEGRADATION_THRESHOLD` | `7` | `open-sse/config/constants.ts` | Pembekal kunci API memasuki DEGRADED apabila jumlah kegagalan mencapai angka ini. |
| `OMNIROUTE_PROVIDER_BREAKER_API_KEY_MAX_BACKOFF_MULTIPLIER` | `4` | `open-sse/config/constants.ts` | Pendarab peningkatan resetTimeout maksimum untuk pembekal kunci API. |
| `OMNIROUTE_PROVIDER_BREAKER_API_KEY_BACKOFF_ESCALATION_COUNT` | `3` | `open-sse/config/constants.ts` | Pembekal kunci API ditingkatkan selepas bilangan kitaran terbuka ini. |
| `OMNIROUTE_PROVIDER_BREAKER_LOCAL_FAILURE_THRESHOLD` | `2` | `open-sse/config/constants.ts` | Pemangkas litar peringkat pembekal: kegagalan sebelum keseluruhan pembekal tempatan memasuki penyejukan. |
| `OMNIROUTE_PROVIDER_BREAKER_LOCAL_FAILURE_WINDOW_MS` | `300000` | `open-sse/config/constants.ts` | Pemangkas litar peringkat pembekal: tetingkap kiraan kegagalan bergulir (ms) untuk pembekal tempatan. |
| `OMNIROUTE_PROVIDER_BREAKER_LOCAL_COOLDOWN_MS` | `60000` | `open-sse/config/constants.ts` | Pemangkas litar peringkat pembekal: penyejukan (ms) sebaik sahaja ambang pembekal tempatan dicapai. |
| `OMNIROUTE_API_KEY_COOLDOWN_MS` | `60000` | `open-sse/services/apiKeyRotator.ts` | Penyejukan setiap kunci (ms) yang dikenakan oleh putaran kunci API berbilang kunci apabila respons 429 huluan tidak membawa `Retry-After` (#14573). Nilai bukan positif atau bukan angka akan kembali kepada nilai lalai. |
| `PIN_DROP_BACKOFF_LEVEL` | `2` | `open-sse/services/combo.ts` | Kedalaman backoff di mana pembekal bagi pin cache konteks dianggap tidak sihat secara berterusan dan pin digugurkan untuk failover. |
| `PIN_DROP_GRACE_MS` | `20000` | `open-sse/services/combo.ts` | Tetingkap anti-flap (ms) yang bertolak ansur dengan penyejukan sementara yang singkat sebelum menggugurkan pin cache konteks. |
### Senario
| Senario | Konfigurasi |
| ----------------------------------------- | ------------------------------------------------------ |
| **Penjanaan kod yang berjalan lama** | `REQUEST_TIMEOUT_MS=900000` (15 minit) |
| **Jangka hayat strim keseluruhan terhad** | `STREAM_ACTIVE_TIMEOUT_MS=1260000` (21 minit) |
| **Gagal pantas untuk API pengeluaran** | `API_BRIDGE_PROXY_TIMEOUT_MS=10000` |
| **Model pemikiran lanjutan** | `STREAM_IDLE_TIMEOUT_MS=300000` (5 minit antara chunk) |
---
## 16. Pengelogan
Sistem pengelogan menulis ke stdout dan fail log yang digilirkan. Semua konfigurasi dibaca oleh `src/lib/logEnv.ts`.
| Pemboleh ubah | Lalai | Penerangan |
| ----------------------------------------- | -------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `APP_LOG_LEVEL` | `info` | Tahap log minimum: `debug`, `info`, `warn`, `error`. |
| `APP_LOG_FORMAT` | `text` | Format output: `text` (boleh dibaca manusia) atau `json` (berstruktur). |
| `APP_LOG_TO_FILE` | `true` | Tulis log ke fail di samping stdout. |
| `APP_LOG_FILE_PATH` | `logs/application/app.log` | Laluan fail log (relatif kepada akar projek atau `DATA_DIR`). |
| `APP_LOG_MAX_FILE_SIZE` | `50M` | Saiz fail maksimum sebelum penggiliran. Menerima: `50M`, `1G`, `512K`, atau bait biasa. |
| `APP_LOG_RETENTION_DAYS` | `7` | Bilangan hari untuk menyimpan fail log aplikasi yang digilirkan. |
| `APP_LOG_MAX_FILES` | `20` | Bilangan maksimum sandaran fail log yang digilirkan. |
| `CALL_LOG_RETENTION_DAYS` | `7` | Bilangan hari untuk menyimpan entri log permintaan/panggilan dalam pangkalan data. |
| `CALL_LOG_MAX_ENTRIES` | `10000` | Bilangan maksimum entri log panggilan dalam penimbal dalam memori. |
| `CALL_LOGS_TABLE_MAX_ROWS` | `100000` | Bilangan maksimum baris dalam jadual SQLite `call_logs` sebelum pemangkasan. |
| `ENABLE_REQUEST_LOGS` | _(tidak ditetapkan)_ | Paksa pengelogan permintaan terperinci dihidupkan atau dimatikan, mengatasi tetapan papan pemuka. |
| `MAX_PENDING_REQUEST_AGE_MS` | `3600000` (1 jam) | Usia maksimum bagi entri log permintaan aktif tanpa induk sebelum pembersihan dalam memori. |
| `CALL_LOG_PIPELINE_CAPTURE_STREAM_CHUNKS` | `false` | Simpan cebisan strim dalam artifak saluran paip apabila `call_log_pipeline_enabled=true`. Pilihan ikut serta (`true`) — dimatikan secara lalai untuk menjimatkan ruang cakera. |
| `CALL_LOG_PIPELINE_MAX_SIZE_KB` | `512` | Saiz maksimum artifak log panggilan saluran paip dalam KB apabila `call_log_pipeline_enabled=true`. |
| `PROXY_LOGS_TABLE_MAX_ROWS` | `100000` | Bilangan maksimum baris dalam jadual SQLite `proxy_logs` sebelum pemangkasan. |
| `PROXY_LOG_INCLUDE_IPS` | `false` | Sertakan IP klien/keluar dan awalan akaun dalam log konsol `[ProxyEgress]`. Rekod log proksi pada papan pemuka/pangkalan data mengekalkan butiran penuh. |
| `PROXY_LOG_FIRST_CHUNK_TIMING` | `false` | Tetapkan kepada `"true"` atau `"1"` untuk merekodkan `first_chunk_ms` (dari permulaan penghantaran hingga bait isi pertama yang berguna) pada baris log proksi. Membalut setiap isi huluan dalam strim laluan terus malas dan menampal baris sebaik sahaja bait diterima; dimatikan secara lalai supaya respons diteruskan tanpa perubahan. |
| `APP_LOG_ROTATION_CHECK_INTERVAL_MS` | `60000` (1 minit) | Kekerapan `src/lib/logRotation.ts` menyemak semula saiz fail log aktif. |
| `CHAT_LOG_TEXT_LIMIT` | `65536` | Panjang rentetan maksimum yang dikekalkan dalam artifak log sembang (lalai 64 KB). |
| `CHAT_LOG_ARRAY_TAIL_ITEMS` | `128` | Bilangan item tatasusunan yang dikekalkan dari bahagian hujung apabila muatan log sembang dipendekkan. |
| `CHAT_LOG_MAX_DEPTH` | `6` | Kedalaman sarang maksimum sebelum muatan log sembang dipendekkan. |
| `CHAT_LOG_MAX_OBJECT_KEYS` | `80` | Bilangan maksimum kekunci objek yang dikekalkan dalam muatan log sembang (0 = tanpa had). |
| `CHAT_LOG_MAX_BODY_KB` | `1024` | Saiz keseluruhan isi permintaan/respons (KB) sebelum digantikan dengan ringkasan ringkas dan bukannya klon penuh. Tingkatkan nilai ini jika perbualan agen yang panjang memaparkan pemegang tempat dan bukannya mesej sebenar pada papan pemuka. |
| `CHAT_DEBUG_FILE` | `false` | Apabila benar, `serializeArtifactForStorage` melangkau pemendekan berdasarkan saiz. Untuk nyahpepijat sahaja. |
---
## 17. Pengoptimuman Memori
| Pembolehubah | Lalai | Penerangan |
| ----------------------------- | -------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `OMNIROUTE_MEMORY_MB` | _auto_ (bare metal); **`1024` dalam imej Docker** | **Disyorkan** had timbunan (heap) V8 Docker/standalone (MB). Apabila tidak ditetapkan, ditentukur secara dinamik (~35% daripada RAM sistem, dihadkan kepada `[512, 4096]`); `512` hanyalah paras minimum apabila jumlah memori tidak dapat dibaca. Pada `run-standalone.mjs` (Docker CMD), nilai **eksplisit** ditambahkan sebagai `--max-old-space-size` dan **mengatasi** bendera timbunan NODE_OPTIONS yang bercanggah (bendera terakhir V8). `omniroute serve` masih mengutamakan timbunan NODE_OPTIONS sedia ada (#5238). Jangan tetapkan kedua-duanya kepada nombor yang berbeza — proses akan merekodkan amaran yang menyebut kedua-dua nilai dan pemenangnya. **Imej Docker rasmi sentiasa menetapkan `1024`, jadi penentukuran tidak pernah dijalankan di situ.** Ejen pengekodan `/v1/responses` memerlukan `8192`–`12288` ditambah ruang lega cgroup — lihat [Panduan Docker — RAM masa larian](../guides/DOCKER_GUIDE.md#runtime-ram-for-coding-agents). |
| `OMNIROUTE_RSS_PRESSURE_MB` | _auto_ (`max(3072, 2 × OMNIROUTE_MEMORY_MB)`; mati apabila `OMNIROUTE_MEMORY_MB` tidak ditetapkan) | `open-sse/utils/resourcePressure.ts` | Fius RSS proses mutlak (MB) untuk memori asli/luaran yang tidak dapat dilihat oleh `heapUsed` V8; melebihi nilai ini, permintaan baharu akan menerima 503 `resource_pressure`. RSS jarang menurun selepas lonjakan, jadi pasangkannya dengan `OMNIROUTE_PRESSURE_SELF_RESTART`. |
| `PROMPT_CACHE_MAX_SIZE` | `50` | Maksimum entri prompt sistem yang di-cache-kan. |
| `PROMPT_CACHE_MAX_BYTES` | `2097152` (2 MB) | Saiz maksimum keseluruhan cache prompt. |
| `PROMPT_CACHE_TTL_MS` | `300000` (5 min) | TTL entri cache prompt. |
| `SEMANTIC_CACHE_MAX_SIZE` | `100` | Maksimum respons temperature=0 yang di-cache-kan. |
| `SEMANTIC_CACHE_MAX_BYTES` | `4194304` (4 MB) | Saiz maksimum keseluruhan cache semantik. |
| `SEMANTIC_CACHE_TTL_MS` | `1800000` (30 min) | TTL entri cache semantik. |
| `OMNIROUTE_CORPUS_CACHE_SIZE` | `5` | Bilangan akar korpus setempat yang mengekalkan indeks dalam memori yang aktif pada satu masa (`src/lib/localCorpus/configured.ts`). LRU: apabila mencapai had, indeks akar yang paling lama tidak digunakan dibuang dan dibina semula pada pertanyaan seterusnya. Dihadkan kepada minimum `1`; nilai bukan numerik kembali kepada lalai. |
| `STREAM_HISTORY_MAX` | `50` | Maksimum peristiwa strim terkini dalam penimbal paparan langsung Dashboard. |
| `CONTEXT_LENGTH_DEFAULT` | _(tidak ditetapkan)_ | Penggantian panjang konteks global (token) untuk setiap pembekal yang tidak mempunyai pembolehubah `CONTEXT_LENGTH_`. Apabila ditetapkan, ia **menggantikan** nilai katalog, penggantian dashboard dan registry untuk pembekal tersebut; apabila tidak ditetapkan, OmniRoute menggunakan rantaian terbina dalamnya, yang pilihan terakhirnya ialah `128000`. Lihat [Panjang konteks setiap pembekal](#per-provider-context-length-context_length_provider). |
| `USAGE_TOKEN_BUFFER` | `100` | Ruang lega token tambahan yang ditempah semasa menjejak kuota penggunaan. |
### Panjang konteks setiap pembekal (`CONTEXT_LENGTH_`)
`open-sse/services/contextManager.ts` (`getEnvOverride()` / `resolveTokenLimit()`) turut membaca
bentuk **setiap pembekal** yang namanya dibina daripada ID pembekal pada masa larian, jadi ia
tidak dapat disenaraikan baris demi baris dalam jadual di atas atau dalam `.env.example`.
**Nama.** `CONTEXT_LENGTH_`, di mana `` ialah ID penyedia dalam huruf besar, dengan
setiap aksara di luar `A-Z` / `0-9` digantikan dengan `_`. ID penyedia ialah yang kanonik selepas
penyelesaian alias (bahagian `provider` daripada rentetan `provider/model` setelah alias pendek
diselesaikan). Nod tersuai yang serasi dengan OpenAI atau Anthropic menggunakan ID nod yang dijana,
jadi UUID menjadi sebahagian daripada nama pembolehubah. Nilainya ialah integer positif bagi bilangan
token; apa-apa selain itu (kosong, `0`, negatif, bukan angka) diabaikan dan penyelesaian beralih ke
langkah seterusnya.
| ID Penyedia | Nama pembolehubah |
| ----------------------------------------------------------- | -------------------------------------------------------------------------- |
| 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 |
**Keutamaan.** Bagi pasangan `provider/model`, langkah pertama yang menghasilkan nilai akan digunakan:
1. `CONTEXT_LENGTH_` untuk penyedia tersebut.
2. `CONTEXT_LENGTH_DEFAULT` (penggantian persekitaran global).
3. Tetingkap setiap model: penggantian konteks yang disimpan (ditetapkan dalam papan pemuka, atau
dipinkan secara automatik oleh penyelaras penemuan, lihat `CONTEXT_WINDOW_RECONCILE_INTERVAL`),
jika tidak, nilai katalog / models.dev yang disegerakkan.
4. `defaultContextLength` pendaftar penyedia.
5. Heuristik nama model (`claude` 200000, `gemini` 1000000, `gpt` / `o1` / `o3` / `o4` /
`codex` 400000).
6. Nilai lalai terbina dalam setiap penyedia, kemudian `128000`.
Kedua-dua langkah persekitaran terpakai kepada **keseluruhan penyedia**: setiap model penyedia itu
mendapat had yang sama, dan ia mengatasi penggantian papan pemuka setiap model. Apabila hanya satu
model bagi sesuatu penyedia memerlukan tetingkap berbeza, gunakan penggantian setiap model dalam
papan pemuka sebaliknya.
**Skop.** Rantaian ini memacu semakan tetingkap konteks pada masa permintaan (penolakan
`context_length_exceeded` / "Input exceeds context window" dalam
`open-sse/handlers/chatCore.ts`), bajet mampatan prompt dan had konteks kombo. Nilai
`context_length` yang diiklankan oleh `GET /v1/models` masih boleh datang daripada metadata
katalog atau pendaftar dan tidak dijamin mencerminkan penggantian persekitaran.
**Contoh.** Penyedia yang modelnya menerima tetingkap 1,050,000 token manakala katalog melaporkan
128,000:
```dotenv
CONTEXT_LENGTH_AGENTROUTER=1050000
```
Mulakan semula pelayan selepas mengubahnya: nilai dibaca daripada persekitaran proses pelayan.
Pada **aplikasi desktop**, pelayan berjalan sebagai proses anak dan tidak melihat pembolehubah sistem
yang ditetapkan selepas aplikasi dilancarkan; letakkan baris tersebut dalam fail `.env` yang
dimuatkan oleh aplikasi (turutan carian dalam
[Panduan Electron: Carian fail persekitaran](../guides/ELECTRON_GUIDE.md#environment-file-lookup)),
kemudian keluar sepenuhnya dan lancarkan semula aplikasi.
### Mampatan
| Pembolehubah | Lalai | Penerangan |
| ------------------------------------- | ---------------- | ------------------------------------------------------------------------------------------------------------------------- |
| `OMNIROUTE_RTK_TRUST_PROJECT_FILTERS` | tidak ditetapkan | Percayai `.rtk/filters.json` projek tanpa hash `.rtk/trust.json`. Gunakan hanya dalam pembangunan setempat yang terkawal. |
### Enjin Memori (pelan 21)
### Kos gelung peristiwa bagi memori, kemahiran dan penyegaran token (#10349)
OmniRoute ialah **proses Node tunggal**. Pengekstrakan/pengambilan memori, suntikan kemahiran dan
penyegaran token penyedia berjalan pada **gelung peristiwa yang sama** sebagai `GET /healthz` dan
papan pemuka. Ia bukan benang pekerja.
| Kerja | Kod | Lalai | Kawalan operator |
| ---------------------------------- | ---------------------------------- | ---------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------ |
| Pengekstrakan / pengambilan memori | `src/lib/memory/` | Papan pemuka **memoryEnabled** (lalai aktif) | Matikan **Settings → Memory**. Tiada suis pemati env berasingan selain melumpuhkan ciri tersebut dalam tetapan. |
| Suntikan kemahiran | `src/lib/skills/injection.ts` | Papan pemuka **skillsEnabled** (lalai aktif) | Matikan **Settings → Memory/Skills** (`skillsEnabled`). Tombol sandbox di bawah hanya menghadkan pelaksanaan selepas suntikan telah aktif. |
| Penyegaran token | `src/sse/services/tokenRefresh.ts` | Aktif untuk penyedia OAuth/web yang bersambung | Putuskan sambungan penyedia atau biarkan token kekal sah; tiada env `TOKEN_REFRESH=0` pada masa ini. |
Jika `/healthz` perlahan pada mesin yang lengang, lumpuhkan memori + kemahiran dahulu, kemudian semak
beban katalog/mampatan (#10303, #9685). Ciri-ciri ini mengalah pada titik `await` tetapi masih
bersaing untuk satu benang yang sama.
Tombol lapisan pembenaman, stor vektor dan penarafan semula untuk subsistem memori berterusan (`src/lib/memory/`).
| Pembolehubah | Lalai | Penerangan |
| ------------------------------------ | --------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `MEMORY_EMBEDDING_CACHE_TTL_MS` | `300000` (5 minit) | TTL untuk cache embedding dalam memori (mengikut tandatangan sumber/model/dim). |
| `MEMORY_EMBEDDING_CACHE_MAX` | `1000` | Bilangan maksimum entri LRU yang disimpan dalam cache embedding. |
| `MEMORY_TRANSFORMERS_MODEL` | `Xenova/all-MiniLM-L6-v2` | ID repo HF untuk pipeline MiniLM tempatan `@huggingface/transformers` yang bersifat opt-in (~23 MB int8, ~400 MB RAM). |
| `MEMORY_STATIC_MODEL` | `minishlab/potion-base-8M` | ID repo HF untuk penyematan jadual carian statik potion/Model2Vec. Dimuat turun secara malas ke dalam direktori cache. |
| `MEMORY_STATIC_CACHE_DIR` | `/embeddings` | Direktori yang digunakan untuk menyimpan cache fail model potion statik. Lalai di bawah `DATA_DIR` apabila tidak ditetapkan. |
| `HF_HUB_ENDPOINT` | `https://huggingface.co` | Menggantikan URL asas Hugging Face Hub yang digunakan oleh `staticPotion.ts` (cth. endpoint cermin untuk persediaan air-gapped). |
| `MEMORY_VEC_TOP_K` | `20` | Top-K lalai yang digunakan oleh carian vektor brute-force `sqlite-vec` dalam `src/lib/memory/vectorStore.ts`. |
| `MEMORY_RRF_K` | `60` | Pemalar `k` Reciprocal Rank Fusion untuk pengambilan hibrid FTS5 + vektor (resepi sqlite-vec). |
| `VECTOR_STORE_DISABLE_VEC` | `false` | Sela ujian/diagnostik dalam `getVectorStore()` (`src/lib/memory/vectorStore.ts`): apabila `true`, memaksa stor vektor kepada `null` (mensimulasikan persekitaran awan/WASM tanpa `sqlite-vec`), menjadikan pengambilan memori merosot kepada carian kata kunci FTS5. Biarkan tidak ditetapkan dalam pengeluaran. |
| `NOTION_API_KEY` | _(tidak ditetapkan)_ | Kunci API untuk backend Notion (digunakan oleh praset backend dikenali `genericBackend.ts`). |
| `NOTION_API_URL` | `https://api.notion.com/v1` | URL asas untuk API Notion (boleh digantikan untuk alternatif Notion yang dihoskan sendiri). |
| `OBSIDIAN_API_KEY` | _(tidak ditetapkan)_ | Kunci API untuk backend Obsidian Vault (digunakan oleh praset backend dikenali `genericBackend.ts`). |
| `OBSIDIAN_API_URL` | `http://localhost:27123` | URL asas untuk API Obsidian Vault (boleh digantikan untuk vault jauh). |
| `MEMORY_TYPED_DECAY_ENABLED` | `false` | Suis utama pereputan memori bertaip TV6. **Opt-in (lalai mati)** — sapuan tersebut **memadam** memori yang telah reput. Apabila dimatikan, `access_count`/`last_accessed_at` hanyalah telemetri semata-mata dan tiada apa yang pernah dipadam. |
| `MEMORY_TYPED_DECAY_EPISODIC_DAYS` | `30` | TTL (hari) selepas mana memori `episodic` yang tidak digunakan akan reput. `0` menjadikan episodic kebal juga. Jenis tahan lama (`factual`/`procedural`/`semantic`) sentiasa kebal. Jam pereputan disasarkan semula pada `last_accessed_at`. |
| `MEMORY_TYPED_DECAY_ACCESS_IMMUNITY` | `3` | Memori yang disuntik `>=` sebanyak ini menjadi kebal terhadap pereputan tanpa mengira jenis. `0` mematikan imuniti akses. |
| `MEMORY_TYPED_DECAY_SWEEP_INTERVAL` | `0` (dimatikan) | Selang (saat) untuk sapuan pereputan berkala pilihan dalam `src/lib/memory/typedDecay.ts`. `0`/tidak ditetapkan = tiada sapuan berkala. Opt-in berganda: juga memerlukan `MEMORY_TYPED_DECAY_ENABLED=true`. |
| `OMNIROUTE_STRICT_SYSTEM_PROVIDERS` | _(tidak ditetapkan)_ | ID pembekal dipisahkan koma (tidak sensitif huruf besar/kecil) yang menerima mesej `system` **hanya pada indeks 0** (`src/lib/memory/injection.ts`). Untuk pembekal ini, sisipan memori di tengah tatasusunan yang selamat untuk cache adalah tidak selamat dalam perbualan berbilang pusingan, jadi memori digabung/didahulukan sebagai mesej sistem utama sebaliknya. Lalai hanya kepada `xiaomi-mimo`/`mimo`; tambah untuk endpoint serasi OpenAI yang dihoskan sendiri (cth. Qwen3.5+/3.6) yang templat perbualannya menguatkuasakan kekangan mesej sistem utama tunggal yang sama. |
### Contoh Docker RAM Rendah
`128` adalah untuk papan pemuka sahaja. Ejen pengekodan pada heap ini mengalami `FATAL ERROR` semasa `/v1/responses` yang panjang. Jangan gunakan contoh ini sebagai gerbang Claude/Codex/Grok.
```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. Penyegerakan Harga
Penyegerakan automatik data harga model daripada sumber luaran.
| Pemboleh Ubah | Lalai | Fail Sumber | Penerangan |
| ----------------------- | ------------- | ------------------------ | --------------------------------------------- |
| `PRICING_SYNC_ENABLED` | `false` | `src/lib/pricingSync.ts` | Penyegerakan harga berkala secara ikut serta. |
| `PRICING_SYNC_INTERVAL` | `86400` (24j) | `src/lib/pricingSync.ts` | Selang penyegerakan dalam saat. |
| `PRICING_SYNC_SOURCES` | `litellm` | `src/lib/pricingSync.ts` | Sumber data yang dipisahkan dengan koma. |
---
## Penyegerakan ELO Arena
| Pemboleh Ubah | Lalai | Fail Sumber | Penerangan |
| ---------------------------- | ------------- | ------------------------------------------------------------------------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `ARENA_ELO_SYNC_ENABLED` | `true` | `src/shared/constants/featureFlagDefinitions.ts` | Penyegerakan ELO berkala papan pendahulu Arena AI, boleh dikonfigurasikan melalui Bendera Ciri Papan Pemuka atau menggunakan `false` untuk tidak menyertainya. |
| `MODELS_CATALOG_PREFIX_MODE` | `dual` | `src/shared/constants/featureFlagDefinitions.ts`, `src/app/api/v1/models/catalog.ts` | Bentuk awalan yang digunakan untuk id model dalam `GET /v1/models`. `dual` mengiklankan kedua-dua awalan alias pendek dan awalan penyedia kanonik untuk setiap model (keserasian ke belakang — kira-kira menggandakan katalog); `alias` menghasilkan satu id bagi setiap model; `canonical` hanya menghasilkan awalan id penyedia penuh (penyedia yang aliasnya sudah merupakan id kanonik mengekalkan satu entri sahaja). Klien boleh mengatasi tetapan ini bagi setiap permintaan dengan `?prefix=alias`. Lihat [API_REFERENCE](API_REFERENCE.md#model-id-prefixes-prefix). |
| `ARENA_ELO_SYNC_INTERVAL` | `86400` (24j) | `src/lib/arenaEloSync.ts` | Selang penyegerakan dalam saat. |
---
## Penyedia Playground PromptQL (Tidak Rasmi/Eksperimen)
Jambatan sesi GraphQL kejuruteraan terbalik untuk prompt.ql.app (`src/shared/constants/providers/web-cookie.ts`). Semuanya pilihan — nilai lalai menghala ke titik akhir playground awam; timpa hanya untuk penggunaan PromptQL yang dihoskan sendiri/alternatif.
| Pemboleh Ubah | Lalai | Fail Sumber | Penerangan |
| ---------------------------- | ------------------------------------------------------------------ | ----------------------------------------------------------------------- | ---------------------------------------------------------------------------- |
| `PROMPTQL_GRAPHQL_ENDPOINT` | `https://data.prompt.ql.app/promptql/playground-v2-hge/v1/graphql` | `open-sse/executors/promptql.ts` | Titik akhir GraphQL yang digunakan untuk operasi sembang/sesi. |
| `PROMPTQL_CREDITS_ENDPOINT` | `https://data.pro.ql.app/v1/graphql` | `open-sse/executors/promptql.ts`, `open-sse/services/usage/promptql.ts` | Titik akhir GraphQL yang digunakan untuk menanyakan baki/penggunaan kredit. |
| `PROMPTQL_TOKEN_REFRESH_URL` | `https://auth.pro.ql.app/ddn/project/token` | `open-sse/executors/promptql.ts` | Titik akhir yang digunakan untuk percubaan terbaik menyegarkan semula token. |
| `PROMPTQL_POLL_TIMEOUT_MS` | `180000` | `open-sse/executors/promptql.ts` | Masa maksimum (ms) untuk meninjau `thread_events` sebelum tamat masa. |
---
## Penyedia Web HyperAgent (Tidak Rasmi/Eksperimen)
Jambatan sesi kejuruteraan songsang untuk hyperagent.com (`src/shared/constants/providers/web-cookie.ts`). Pilihan — lalai menghala ke titik akhir pengebilan/penggunaan awam; ubah hanya untuk penggunaan HyperAgent hos kendiri/alternatif.
| Pemboleh Ubah | Lalai | Fail Sumber | Penerangan |
| ---------------------- | --------------------------------------------------- | --------------------------------------- | ------------------------------------------------------------------------------- |
| `HYPERAGENT_USAGE_URL` | `https://hyperagent.com/api/settings/billing/usage` | `open-sse/services/usage/hyperagent.ts` | Titik akhir yang digunakan untuk mendapatkan blok kredit pengebilan/penggunaan. |
---
## Kuota Penggunaan Kilo Code
Semakan baki USD peribadi dan penggunaan Kilo Pass untuk penyedia Kilo Code. Pilihan — lalai menghala ke API Kilo awam; ubah hanya untuk geganti/lekapan ujian. Pengesahan menggunakan token akses OAuth sedia ada bagi sambungan tersebut.
| Pemboleh Ubah | Lalai | Fail Sumber | Penerangan |
| -------------- | --------------------- | ------------------------------------- | ------------------------------------------------------------------------------------------- |
| `KILO_API_URL` | `https://api.kilo.ai` | `open-sse/services/usage/kilocode.ts` | URL asas yang digunakan untuk mendapatkan baki Kilo Code peribadi dan penggunaan Kilo Pass. |
---
## Penyedia Web Adobe Firefly (Tidak Rasmi/Eksperimen)
Penyegaran sesi dipacu pelayar untuk penyedia web Adobe Firefly
(`open-sse/services/adobeFireflyBrowserLogin.ts`, `open-sse/services/adobeFireflySession.ts`,
`open-sse/services/adobeFireflyClient.ts`). Pilihan — semua lalai ditala untuk pemasangan
desktop biasa.
> **Dialih keluar dalam #9255.** Masa jalan Chrome lama yang dilampirkan melalui CDP (adobeFireflyChromeRuntime.ts) telah
> digantikan dengan perkhidmatan log masuk pelayar Playwright dan tetapannya tidak lagi wujud. Pemboleh ubah
> ADOBE_FIREFLY_CHROME_ CDP_PORT / VISIBLE / HEADED / PING / FORCE_RESTART, serta
> ADOBE_FIREFLY_LOGIN_WAIT_MS dan ADOBE_FIREFLY_FORTER_WAIT_MS, tidak dibaca di mana-mana dalam
> pangkalan kod — menetapkannya tidak memberikan sebarang kesan.
| Pemboleh Ubah | Lalai | Fail Sumber | Penerangan |
| ------------------------------------ | -------------------- | ----------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------- |
| `ADOBE_FIREFLY_CHROME_HEADLESS` | `0` | `open-sse/services/adobeFireflyBrowserLogin.ts` | Tetapkan kepada `1` untuk Chrome tanpa kepala sebenar (diketahui rosak untuk penjanaan; penyahpepijatan sahaja). |
| `ADOBE_FIREFLY_BROWSER_REFRESH` | `1` | `open-sse/services/adobeFireflySession.ts` | Pilihan ikut serta/keluar pemanasan pelayar proaktif. `0` menyahdayakan pemanasan proaktif (pemulihan 408 di pertengahan kelompok masih digunakan). |
| `ADOBE_FIREFLY_SESSION_DISK` | `1` | `open-sse/services/adobeFireflySession.ts` | Tetapkan kepada `0` untuk menyahdayakan penyimpanan berterusan sesi Adobe Firefly pada cakera. |
| `ADOBE_FIREFLY_MIN_SUBMIT_GAP_MS` | _(tidak ditetapkan)_ | `open-sse/services/adobeFireflySession.ts` | Selang minimum (ms) yang dikuatkuasakan antara penyerahan berturut-turut, mengatasi lalai terbina dalam. |
| `ADOBE_FIREFLY_BATCH_EXTRA_GAP_MS` | _(tidak ditetapkan)_ | `open-sse/services/adobeFireflySession.ts` | Selang tambahan (ms) yang ditambah selepas kelompok berjaya, mengatasi lalai terbina dalam. |
| `ADOBE_FIREFLY_SUBMIT_BASE_DELAY_MS` | _(tidak ditetapkan)_ | `open-sse/services/adobeFireflyClient.ts` | Kelewatan asas (ms) sebelum menyerahkan permintaan penjanaan, mengatasi lalai terbina dalam. |
---
## 19. Penyegerakan Model (Pembangunan)
| Pemboleh Ubah | Lalai | Fail Sumber | Penerangan |
| ----------------------------------- | -------------------- | ---------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `MODELS_DEV_SYNC_ENABLED` | _(tidak ditetapkan)_ | `src/lib/modelsDevSync.ts` | Pengatasan mutlak untuk penyegerakan harga models.dev. Tidak ditetapkan = patuhi Tetapan > AI (`modelsDevSyncEnabled`). `0`/`false`/`off`/`no` **mengatasi DB** dan melangkau kedua-dua penyegerakan berkala serta imbasan SQL/JSON `getModelsDevPricing()` (pemulihan apabila papan pemuka tersekat pada gelung peristiwa yang sama). `1`/`true`/`on`/`yes` memaksa penyegerakan diaktifkan. Penyimpanan/pengosongan harga masih memanggil `backupDbFile("pre-write")`, yang tidak melakukan apa-apa di bawah pendikitan 60 minit atau `DISABLE_SQLITE_AUTO_BACKUP`. |
| `MODELS_DEV_SYNC_INTERVAL` | `86400` (24j) | `src/lib/modelsDevSync.ts` | Selang penyegerakan katalog model semasa pembangunan dalam saat. |
| `CONTEXT_WINDOW_RECONCILE_INTERVAL` | `86400` (24j) | `src/lib/contextWindowResolver.ts` | Selang (saat) untuk penyelaras tetingkap konteks pembetulan kendiri (5004): menetapkan tetingkap yang diisytiharkan penyedia daripada penemuan `/models` sebagai pengatasan `auto:discovery` apabila ia berbeza daripada katalog. Tetapkan kepada `0` untuk menyahdayakan. Menggunakan semula data yang telah disegerakkan (tiada pengambilan baharu); tidak pernah menulis ganti pengatasan `manual`. |
---
## 20. Tetapan Khusus Penyedia
| Pembolehubah | Lalai | Fail Sumber | Penerangan |
| ---------------------------------------------- | ------------------------------------------------ | ---------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `OPENROUTER_CATALOG_TTL_MS` | `86400000` (24h) | `src/lib/catalog/openrouterCatalog.ts` | TTL cache katalog model OpenRouter. |
| `MODEL_CATALOG_INCLUDE_NAMES` | `true` | `src/shared/constants/featureFlagDefinitions.ts` | Sertakan medan `name` yang mesra paparan dalam respons `/v1/models`. Lumpuhkan untuk klien yang menjangkakan ID sahaja. |
| `CATALOG_BUILD_TIMEOUT_MS` | `8000` (8s) | `src/app/api/v1/models/catalogCache.ts` | Had masa menunggu laluan sejuk untuk pembinaan semula katalog `GET /v1/models` yang dicantumkan (#12627). Apabila tamat masa, respons 200 terakhir yang baik dihidangkan jika wujud. |
| `OMNIROUTE_SYNCED_CATALOG_STALE_AFTER_MS` | `2592000000` (30 hari) | `src/lib/db/models/activeSyncedCatalog.ts` | Tempoh umur selepas itu senarai model yang disegerakkan bagi sesuatu sambungan tidak lagi berautoriti untuk penghalaan dan gagal terbuka kepada registri (#12849). Baris yang tidak pernah dicap masa dikira sebagai lapuk. |
| `OMNIROUTE_ANALYTICS_CACHE_TTL_MS` | `60000` (60s) | `src/lib/usage/analyticsResponseCache.ts` | Tempoh respons `GET /api/usage/analytics` yang lambat digunakan semula untuk rentetan pertanyaan yang sama (#15629). `0` melumpuhkan cache. |
| `OMNIROUTE_ANALYTICS_CACHE_MIN_COMPUTE_MS` | `1000` (1s) | `src/lib/usage/analyticsResponseCache.ts` | Hanya respons analitik yang mengambil masa sekurang-kurangnya selama ini untuk dibina akan dicache, supaya instans kecil sentiasa melihat data baharu. |
| `OMNIROUTE_CACHE_METRICS_MIN_COMPUTE_MS` | tidak ditetapkan (mati) | `src/app/api/cache/route.ts` via `src/lib/usage/analyticsResponseCache.ts` | Pilihan sertai (#16361). Apabila ditetapkan kepada integer bukan negatif N, bahagian sejarah penggunaan bagi `GET /api/cache` (jumlah cache prompt + trend) dihidangkan daripada cache respons analitik kongsi apabila ia mengambil masa sekurang-kurangnya N ms untuk dibina, mengikut tetingkap `trendHours` yang dihadkan, selama `OMNIROUTE_ANALYTICS_CACHE_TTL_MS` (sejarah mungkin tertinggal sehingga TTL tersebut; `DELETE /api/cache` membatalkannya). Tidak ditetapkan atau tidak sah = sejarah dibaca secara langsung pada setiap permintaan. |
| `NANOBANANA_POLL_TIMEOUT_MS` | `120000` | `open-sse/handlers/imageGeneration.ts` | Masa menunggu maksimum untuk kerja penjanaan imej NanoBanana. |
| `NANOBANANA_POLL_INTERVAL_MS` | `2500` | `open-sse/handlers/imageGeneration.ts` | Kekerapan pengundian kerja NanoBanana. |
| `ADOBE_FIREFLY_SUBMIT_BASE_DELAY_MS` | `8000` | `open-sse/services/adobeFireflyUpscale.ts` | Kelewatan asas untuk backoff eksponen cubaan semula penyerahan peningkatan resolusi Adobe Firefly. |
| `AWS_REGION` | _(tidak ditetapkan)_ | `src/lib/providers/validation.ts`, `open-sse/handlers/audioSpeech.ts` | Wilayah yang digunakan untuk membina titik hujung AWS Bedrock (Kiro, audio). |
| `AWS_DEFAULT_REGION` | _(tidak ditetapkan)_ | `src/lib/providers/validation.ts`, `open-sse/handlers/audioSpeech.ts` | Sandaran apabila `AWS_REGION` tidak ditetapkan. |
| `CLOUDFLARE_ACCOUNT_ID` | _(tidak ditetapkan)_ | `open-sse/executors/cloudflare-ai.ts` | ID Akaun untuk Cloudflare Workers AI. |
| `CLOUDFLARE_PLAYGROUND_CHROME_PATH` | _(tidak ditetapkan)_ | `open-sse/executors/cloudflare-playground.ts` | Laluan penuh binari Chrome desktop untuk pelaksana Cloudflare AI Playground, digunakan apabila semakan cap jari headless menyekat Chromium terbun dl Playwright. |
| `CODEBUDDY_SYSTEM_PROMPT_MAX_LEN` | ∅ (∞) — _(tidak ditetapkan = tiada had panjang)_ | `open-sse/executors/codebuddy/shared.ts` | Had panjang pilihan untuk prompt sistem pemanggil yang dihantar ke CodeBuddy (CN dan Antarabangsa). Secara lalai, hanya prompt yang membawa penanda identiti ejen pengekodan digantikan dengan prompt neutral (penapis kandungan Tencent menolak prompt tersebut); prompt panjang dikekalkan. Integer > 0 turut menggantikan mana-mana prompt sistem yang melebihi bilangan aksara tersebut; tidak ditetapkan, `0` atau nilai bukan integer melumpuhkan had ini. Setiap penggantian merekodkan peraturan mana yang dicetuskan (penanda identiti atau panjang). |
| `CLOUDFLARE_API_BASE` | `https://api.cloudflare.com/client/v4` | `src/app/api/settings/proxy/cloudflare-deploy/route.ts` | Tulis ganti asas REST API Cloudflare yang digunakan oleh penggelar relay Workers kolam proksi (#4640 / 9router#1360). |
| `NEXT_PUBLIC_CLOUDFLARE_RELAY_DEFAULT_PROJECT` | `omniroute-relay` | `src/app/(dashboard)/dashboard/settings/components/proxy/CloudflareRelayModal.tsx` | Nama projek worker lalai yang dicadangkan dalam modal "Deploy Relay" kumpulan proksi. |
| `NEXT_PUBLIC_CLOUDFLARE_RELAY_ENABLED` | `true` | `src/app/(dashboard)/dashboard/settings/components/proxy/ProxyPoolTab.tsx` | Tetapkan kepada `false` untuk menyembunyikan pilihan geganti Cloudflare Workers daripada tab Proxy Pool. |
| `CLOUDFLARED_BIN` | dikesan automatik | `src/lib/cloudflaredTunnel.ts` | Laluan tersuai ke binari `cloudflared`. |
| `CLOUDFLARED_PROTOCOL` | `http2` | `src/lib/cloudflaredTunnel.ts` | Protokol pengangkutan terowong: `http2` (lalai), `quic`, atau `auto`. |
| `CLOUDFLARED_CONFIG` | _(tidak ditetapkan)_ | `src/lib/cloudflaredTunnel.ts` | Laluan ke `config.yml` cloudflared yang diuruskan secara tempatan (dengan `tunnel:`, `credentials-file:`, `ingress:`). Apabila ditetapkan, OmniRoute menjalankan `tunnel --config run` (terowong bernama) dan bukannya terowong pantas efemeral. |
| `CLOUDFLARED_HOSTNAME` | _(daripada ingress konfigurasi)_ | `src/lib/cloudflaredTunnel.ts` | Penggantian untuk nama hos awam terowong bernama (cth. `ai.example.com`), dilaporkan sebagai `publicUrl`/`apiUrl`. Apabila tidak ditetapkan, ia dibaca daripada nama hos `ingress` pertama konfigurasi. |
| `DENO_DEPLOY_API_BASE` | `https://api.deno.com/v2` | `src/app/api/settings/proxy/deno-deploy/route.ts` | Gantikan asas REST API Deno Deploy yang digunakan oleh penggelar geganti kumpulan proksi (#4643 / 9router#1437). |
| `NEXT_PUBLIC_DENO_RELAY_DEFAULT_PROJECT` | `omniroute-deno-relay` | `src/app/(dashboard)/dashboard/settings/components/proxy/DenoRelayModal.tsx` | Nama apl Deno Deploy lalai yang dicadangkan dalam modal "Deploy Relay" kumpulan proksi. |
| `NEXT_PUBLIC_DENO_RELAY_ENABLED` | `true` | `src/app/(dashboard)/dashboard/settings/components/proxy/ProxyPoolTab.tsx` | Tetapkan kepada `false` untuk menyembunyikan pilihan geganti Deno Deploy daripada tab Proxy Pool. |
| `SEARCH_CACHE_TTL_MS` | `300000` (5 minit) | `open-sse/services/searchCache.ts` | TTL untuk caching respons API carian (Perplexity, Brave, dll.). |
| `ENABLE_CC_COMPATIBLE_PROVIDER` | `false` | `src/shared/utils/featureFlags.ts` | Dedahkan UI pembekal serasi CC eksperimental untuk geganti khusus Claude Code sahaja. |
| `NINEROUTER_HOST` | `127.0.0.1` | `open-sse/executors/ninerouter.ts` | Gantikan hos tempat instans 9router terbenam mendengar. |
| `NINEROUTER_PORT` | `20130` | `open-sse/executors/ninerouter.ts` | Gantikan port tempat instans 9router terbenam mendengar. |
| `EMBED_WS_PROXY_HOST` | `127.0.0.1` | `src/lib/services/embedWsProxy.ts` | Hos bind untuk proksi WebSocket perkhidmatan terbenam (loopback sahaja secara lalai). |
| `EMBED_WS_PROXY_PORT` | `20131` | `src/lib/services/embedWsProxy.ts` | Port untuk pelayan proksi WebSocket perkhidmatan terbenam. |
| `CLIPROXYAPI_HOST` | `127.0.0.1` | `open-sse/executors/cliproxyapi.ts` | Hos jambatan CLIProxyAPI (integrasi warisan). |
| `CLIPROXYAPI_PORT` | `5544` | `open-sse/executors/cliproxyapi.ts` | Port jambatan CLIProxyAPI. |
| `CLIPROXYAPI_API_KEY` | _(kosong)_ | `open-sse/handlers/chatCore/cliproxyapiCredentials.ts` | Kunci gantian satah data apabila tetapan `cliproxyapi_api_key` tiada. |
| `CLIPROXYAPI_MANAGEMENT_KEY` | _(kosong)_ | `src/lib/services/cliproxyAccountHealth.ts` | Kunci pengurusan untuk bacaan kesihatan akaun daripada instans CLIProxyAPI yang diuruskan secara luaran. |
| `CLIPROXYAPI_CONFIG_DIR` | `~/.cli-proxy-api` | `src/lib/versionManager/processManager.ts` | Direktori konfigurasi CLIProxyAPI. |
| `CLIPROXY_BIND_HOST` | `127.0.0.1` | `docker-compose.yml` | Antara muka hos yang digunakan docker-compose untuk menerbitkan sidecar `cliproxyapi` (#12578). Volum datanya menyimpan kredensial OAuth/API pembekal dan imej yang dipinkan tiada penggantian `api-keys` satah-data berasaskan env (hanya `config.yaml` yang dilekapkan), jadi `0.0.0.0` mendedahkan perkhidmatan yang membawa kredensial kepada seluruh LAN. |
| `MUX_SERVICE_PORT` | `8322` | `src/lib/services/bootstrap.ts` | Gantikan port tempat daemon orkestrasi-ejen Mux (coder/mux) terbenam mendengar (sentiasa 127.0.0.1). |
| `OPENWA_SERVICE_PORT` | `8323` | `src/lib/services/bootstrap.ts` | Gantikan port tempat daemon open-wa (automasi WhatsApp Web) terbenam mendengar (sentiasa 127.0.0.1). |
| `DARIO_HOST` | `127.0.0.1` | `open-sse/executors/dario.ts` | Hos ikat/sambung perkhidmatan terbenam Dario (loopback sahaja secara lalai). |
| `DARIO_PORT` | `3456` | `open-sse/executors/dario.ts` | Port perkhidmatan terbenam Dario. |
| `DARIO_HOST` | `127.0.0.1` | `open-sse/executors/dario.ts` | Hos ikat/sambung perkhidmatan terbenam Dario (loopback sahaja secara lalai). |
| `DARIO_PORT` | `3456` | `open-sse/executors/dario.ts` | Port perkhidmatan terbenam Dario. |
| `LOCAL_HOSTNAMES` | _(kosong)_ | `open-sse/config/providerRegistry.ts` | Nama hos tambahan dipisahkan koma yang dianggap sebagai "tempatan" (nama perkhidmatan Docker, dll.). |
`ENABLE_CC_COMPATIBLE_PROVIDER` hanya untuk geganti pihak ketiga yang menerima klien Claude Code
secara eksklusif. OmniRoute menulis semula permintaan supaya geganti tersebut menerimanya. Jika anda
hanya mahu menggunakan Claude Code CLI, atau anda tidak pasti apa itu geganti ini, pastikan ia kekal
dilumpuhkan dan tambah pembekal serasi Anthropic biasa sebaliknya.
---
## 21. Kesihatan Proksi
| Variable | Default | Source File | Description |
| ------------------------------------------------- | --------------------------- | ---------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `PROXY_FAST_FAIL_TIMEOUT_MS` | `2000` | `src/lib/proxyHealth.ts` | Had masa tamat semakan kesihatan gagal-cepat. |
| `PROXY_LATENCY_WINDOW_HOURS` | `3` | `src/lib/db/proxies.ts` | Tetingkap masa (jam) untuk mengira purata kependaman proksi calon dalam strategi kumpulan yang dioptimumkan mengikut kependaman. |
| `PROXY_HEALTH_CACHE_TTL_MS` | `30000` | `src/lib/proxyHealth.ts` | TTL cache hasil semakan kesihatan. |
| `PROXY_HEALTH_UNHEALTHY_CACHE_TTL_MS` | `2000` | `src/lib/proxyHealth.ts` | TTL cache untuk siasatan kesihatan proksi yang gagal. Pastikan nilai ini lebih singkat daripada `PROXY_HEALTH_CACHE_TTL_MS` supaya tamat masa proksi yang bersifat sementara di bawah kebeberapaan tinggi dapat dicuba semula dengan cepat tanpa melumpuhkan gagal-cepat bagi proksi yang benar-benar mati. |
| `PROXY_HEALTH_ENABLED` | `true` | `src/lib/proxyHealth/scheduler.ts` | Tetapkan `false` untuk melumpuhkan penjadual kesihatan proksi latar belakang yang menyiasat proksi berdaftar secara berkala. |
| `PROXY_HEALTH_INTERVAL_MS` | `600000` | `src/lib/proxyHealth/scheduler.ts` | Selang sapuan penjadual kesihatan latar belakang dalam ms (minimum `60000`). |
| `PROXY_HEALTH_RELAY_INTERVAL_MS` | `21600000` | `src/lib/proxyHealth/relayCadence.ts` | Selang siasatan dalam ms untuk proksi geganti tepi (`deno`/`vercel`/`cloudflare`), yang mana siasatannya membangunkan isolate serverless yang dibilkan (minimum `60000`). |
| `PROXY_HEALTH_RECOVERY_INTERVAL_MS` | `600000` | `src/lib/proxyHealth/scheduler.ts` | Selang laluan pemulihan latar belakang dalam ms: kekerapan proksi yang sebelumnya tidak sihat disiasat semula supaya proksi yang telah pulih kembali ke putaran tanpa mula semula. Nilai di bawah `60000` akan kembali kepada nilai lalai. |
| `PROXY_HEALTH_TEST_URL` | `https://httpbin.org/ip` | `src/lib/proxyHealth/probeTarget.ts` | Sasaran siasatan kebolehcapaian yang digunakan oleh penjadual dan titik akhir `/api/settings/proxies/auto-test`. Halakan ia ke URL dalaman/layanan kendiri untuk mengelakkan lalai awam. |
| `PROXY_HEALTH_TEST_CONCURRENCY` | `10` | `src/lib/proxyHealth/probeTarget.ts` | Bilangan siasatan yang dimulakan serentak bagi setiap kelompok, dikongsi oleh penjadual dan titik akhir `/api/settings/proxies/auto-test`. Minimum 1 dan maksimum 50. |
| `PROXY_HEALTH_TEST_STAGGER_MS` | `100` | `src/lib/proxyHealth/probeTarget.ts` | Kelewatan dalam ms antara dua pelepasan siasatan di dalam satu kelompok. Tanpanya, seluruh kelompok bertolak pada masa yang sama dan IP keluar yang dikongsi boleh mencetuskan sasaran yang dihadkan kadarnya. Tetapkan kepada `0` untuk melumpuhkan jarak ini; maksimum 5000. |
| `PROXY_HEALTH_USE_PROVIDER_TARGET` | `true` | `src/lib/proxyHealth/providerProbeTarget.ts` | Tetapkan "false" untuk berhenti menyiasat hos sebenar penyedia yang ditugaskan kepada proksi (`GET /models`, tanpa kunci API) dan sentiasa gunakan `PROXY_HEALTH_TEST_URL` sebaliknya. |
| `PROXY_HEALTH_AUTO_DEACTIVATE` | `false` | `src/lib/proxyHealth/statusPolicy.ts` | Apabila `false` (lalai), siasatan kebolehcapaian automatik (penjadual + butang "Test All" `/api/settings/proxies/auto-test`) adalah **baca-sahaja** dan tidak pernah menulis status proksi — hanya pengendali yang menetapkan aktif/tidak aktif, jadi siasatan yang tidak stabil tidak boleh membiarkan proksi yang ditugaskan terkandas (#6246). Tetapkan `true` untuk memulihkan tingkah laku uji-dan-tetap warisan. |
| `FLUSH_EMPTY_RETRY_ENABLED` | `false` | `src/shared/utils/featureFlags.ts` | Bendera ciri pilih-masuk (lihat [FEATURE_FLAGS.md](./FEATURE_FLAGS.md); penggantian DB papan pemuka akan mengatasinya). `true` (atau `1`, `yes`) mencuba semula giliran strim terjemahan yang kosong melalui laluan kelayakan biasa (sehingga `STREAM_RECOVERY.EMPTY_TURN_RETRY_MAX` percubaan) dan bukannya mendedahkan 200 kosong atau 502 kandungan kosong. |
| `EMPTY_STREAM_SIBLING_RECOVERY_ENABLED` | `false` | `src/shared/utils/featureFlags.ts` | Bendera ciri pilih-masuk (lihat [FEATURE_FLAGS.md](./FEATURE_FLAGS.md); penggantian DB papan pemuka akan mengatasinya). `true` (atau `1`, `yes`) mengaktifkan siasatan kandungan strim kosong Claude/Codex dan menggunakan percubaan semula terhad yang sedia ada pada sambungan lain yang layak selepas giliran `empty_content`, tanpa penyejukan atau sekatan model. |
| `STREAM_LATE_OUTPUT_PROBE_ENABLED` | `false` | `src/shared/utils/featureFlags.ts` | Bendera ciri pilih-masuk (lihat [FEATURE_FLAGS.md](./FEATURE_FLAGS.md); penggantian DB papan pemuka akan mengatasinya). `true` (atau `1`, `yes`) terus menyampel satu daripada setiap 16 ketulan yang dihantar selepas 64 yang pertama supaya output kelihatan yang lewat masih menandakan strim sebagai telah mengeluarkan output (5xx tunggal selepas output kekal berskala permintaan dan bukannya sekatan model sahaja). |
| `PROXY_POOL_EGRESS_OBSERVATION` | `false` | `src/shared/utils/featureFlags.ts` | Bendera ciri opt-in (lihat [FEATURE_FLAGS.md](./FEATURE_FLAGS.md); penggantian DB papan pemuka diutamakan). `true` (atau `1`, `yes`) memaparkan pemerhatian egress pool baca sahaja di bawah pool proksi dalam papan pemuka (IP egress berbeza, sambungan dan yang paling kerap dilihat di belakang satu IP sepanjang 24 jam terakhir, daripada log proksi). Tidak pernah digunakan untuk penghalaan. |
| `PROXY_OPERATOR_EGRESS_ENABLED` | `false` | `src/shared/utils/featureFlags.ts` | Bendera ciri opt-in (lihat [FEATURE_FLAGS.md](./FEATURE_FLAGS.md); penggantian DB papan pemuka diutamakan). `true` (atau `1`, `yes`) menerima alamat yang diperhatikan bertarikh yang ditolak oleh operator bagi setiap ahli pool dan menggabungkannya dengan bacaan jurnal untuk paparan dan susunan pool. |
| `PROXY_OPERATOR_EGRESS_WINDOW_HOURS` | `24` | `src/lib/db/proxyOperatorEgress.ts` | Tetingkap pemerhatian dalam jam untuk baris egress yang ditolak operator (dibaca pada setiap bacaan; tiada mula semula diperlukan). Dihadkan kepada 1..168; nilai di luar julat, bukan numerik, atau kosong akan kembali kepada 24 dengan satu amaran seluruh proses sahaja, tanpa pernah melontarkan ralat. |
| `PROXY_AUTO_REMOVE` | `false` | `src/lib/proxyHealth/scheduler.ts` | Tetapkan `true` untuk membenarkan penjadual mengalih keluar proksi secara automatik selepas kegagalan berturut-turut yang berulang. |
| `PROXY_AUTO_REMOVE_AFTER` | `3` | `src/lib/proxyHealth/scheduler.ts` | Bilangan kegagalan berturut-turut sebelum penjadual mengalih keluar proksi secara automatik (apabila `PROXY_AUTO_REMOVE=true`). |
| `PROXY_AUTO_DISABLE` | `false` | `src/lib/proxyHealth/scheduler.ts` | Tetapkan `true` untuk membenarkan penjadual menyahaktifkan secara lembut (status `dead`, tidak pernah dipadamkan) sesebuah proksi selepas kegagalan berturut-turut yang berulang, dan bukannya mengalih keluarnya. Alternatif tidak merosakkan kepada `PROXY_AUTO_REMOVE`: proksi dikeluarkan daripada resolusi pool/putaran dengan serta-merta (penapis status hidup yang digunakan oleh resolusi skop-pool sudahpun mengecualikannya) dan diaktifkan semula secara automatik sebaik sahaja ia mula lulus prob semula. Berkongsi ambang `PROXY_AUTO_REMOVE_AFTER`. Jika kedua-dua bendera adalah `true`, `PROXY_AUTO_REMOVE` diutamakan. |
| `PROXY_HEALTH_PASSIVE_SKIP` | `false` | `src/lib/proxyHealth/scheduler.ts` | Langkau pasif opt-in: apabila `true`, penjadual melangkau prob langsung untuk titik hujung yang trafik pengeluaran terkininya sudah membuktikannya (sekurang-kurangnya satu kejayaan dan tiada kegagalan proksi yang dikaitkan dalam tetingkap, tepat satu penyedia diperhatikan). Dimatikan secara lalai: setiap proksi diperiksa dengan prob. |
| `PROXY_PASSIVE_WINDOW_MS` | `300000` | `src/lib/proxyHealth/passiveVerdict.ts` | Tetingkap dalam ms bagi trafik pengeluaran yang dilihat oleh langkau pasif (dihadkan `60000..599999`). Lebih pendek daripada selang sapuan 10 minit supaya kegagalan terkini mendominasi dan bukannya dicairkan. |
| `OMNIROUTE_CONTROL_PLANE_PROXY_DIRECT_FALLBACK` | `false` | `src/shared/constants/featureFlagDefinitions.ts` | Benarkan aliran OAuth dan pengesahan penyedia memintasi proksi yang disematkan dan bersambung secara langsung apabila prapemeriksaan kebolehcapaian proksi gagal. Keutamaan berkuat kuasa ialah penggantian DB Feature Flags > pemboleh ubah persekitaran > lalai. |
| `RATE_LIMIT_MAX_WAIT_MS` | `30000` (30s) | `src/lib/resilience/settings.ts` | Bajet **tunggu-giliran** lalai: berapa lama sesuatu permintaan boleh menunggu untuk slot penyedia dan berada dalam giliran sebelum ia ditolak, tanpa pernah sampai ke upstream. Pemasa dikosongkan sebaik sahaja tugas mula dilaksanakan — pelaksanaan dihadkan secara berasingan oleh `RATE_LIMIT_EXECUTION_MAX_WAIT_MS`. Env menetapkan lalai sahaja: `resilienceSettings.requestQueue.maxWaitMs` yang kekal, dan kemudian `rateLimitOverrides.maxWaitMs` setiap sambungan, masing-masing mengatasinya. |
| `RATE_LIMIT_EXECUTION_MAX_WAIT_MS` | `600000` (10 minit) | `open-sse/services/rateLimitManager.ts` | Had siling untuk berapa lama permintaan yang diterima boleh kekal dalam pelaksanaan sebelum tempahan had kadarnya luput — dipisahkan daripada bajet tunggu-giliran supaya permulaan fetch yang perlahan pada gateway bukan inkremental tidak tamat masa (#12027). |
| `RATE_LIMIT_MAX_QUEUE_DEPTH` | `0` (dinyahdayakan) | `open-sse/services/rateLimitManager.ts` | Had kemasukan giliran: tolak dengan 429 `queue_full` apabila sebanyak ini permintaan sudah berada dalam giliran. `0` = tanpa had (lalai). |
| `RATE_LIMIT_AUTO_ENABLE` | _(tidak ditetapkan)_ | `open-sse/services/rateLimitManager.ts` | Paksa pengawal keselamatan had kadar auto-enable hidup/mati tanpa mengira tetapan Dashboard yang kekal (`resilienceSettings.requestQueue.autoEnableApiKeyProviders`). Menerima `true`/`1`/`on` untuk paksa hidup, `false`/`0`/`off` untuk paksa mati. Apabila aktif (lalai), sambungan kunci API yang aktif dilindungi had kadar secara automatik. Menetapkan `rateLimitProtection: false` setiap sambungan menyahdayakan perlindungan eksplisit tetapi tidak menarik diri daripada pengawal keselamatan ini; menetapkan pemboleh ubah env ini kepada `false` ialah mekanisme global untuk menjalankan sambungan kunci API tanpa giliran had kadar. |
| `PROVIDER_COOLDOWN_ENABLED` | _(tidak ditetapkan → mati)_ | `open-sse/services/providerCooldownTracker.ts` | Penjejakan cooldown penyedia/sambungan merentas permintaan global secara opt-in. MATI secara lalai (bertindih dengan Connection Cooldown / Provider Circuit Breaker). Menerima `true`/`1`/`on` untuk mendayakan. |
| `PROVIDER_COOLDOWN_MIN_MS` | `5000` | `open-sse/services/providerCooldownTracker.ts` | Cooldown minimum (ms) sebelum penyedia/sambungan yang gagal dicuba semula. Diskalakan secara eksponen dengan kegagalan berturut-turut. Hanya digunakan apabila `PROVIDER_COOLDOWN_ENABLED`. |
| `PROVIDER_COOLDOWN_MAX_MS` | `300000` (5 minit) | `open-sse/services/providerCooldownTracker.ts` | Had maksimum cooldown (ms) sebelum penyedia/sambungan yang gagal dicuba semula walau bagaimanapun. Hanya digunakan apabila `PROVIDER_COOLDOWN_ENABLED`. |
| `STREAM_RECOVERY_ENABLED` | _(tidak ditetapkan → mati)_ | `src/lib/resilience/settings.ts` (semai) → `open-sse/services/streamRecovery.ts` (logik) | **Apa:** pemulihan telus bagi strim upstream yang terpangkas (port free-claude-code). Menahan tetingkap SSE pembuka sehingga `STREAM_RECOVERY.HOLDBACK_MS` (750 ms) supaya pemotongan _pre-commit_ — yang berlaku sebelum sebarang bait sampai ke klien — dibuka semula dan dicuba semula secara tidak kelihatan. **Bila untuk mendayakan:** upstream yang tidak stabil yang kerap terpangkas 0-bait pada permulaan strim; biarkan MATI jika anda tidak mampu menanggung sehingga 750 ms tambahan masa-ke-token-pertama pada setiap strim. Menerima `true`/`1`/`on`. Menyemai tetapan Resilience yang kekal; tetapan Dashboard mengatasinya sebaik sahaja ditetapkan. |
| `STREAM_RECOVERY_MIDSTREAM_ENABLED` | _(tidak ditetapkan → mati)_ | `src/lib/resilience/settings.ts` (seed) → `open-sse/services/streamRecovery.ts` (logic) | **Apa:** kesinambungan pertengahan strim (Fase 4.4) — selepas pemangkasan _post-commit_ (bait telah sampai ke klien), hantar semula permintaan dengan teks separa sebagai prefill pembantu dan cantumkan akhiran yang hilang. Strim teks biasa serasi OpenAI sahaja; tidak pernah aktif apabila panggilan alat sedang berjalan. **Bila untuk aktifkan:** penjanaan panjang yang terpotong di tengah jawapan dan anda menerima bahagian akhir yang dipulihkan tiba sebagai satu letusan berbanding token demi token. Bebas daripada `STREAM_RECOVERY_ENABLED` (profil risiko berbeza). Menerima `true`/`1`/`on`. |
| `STREAM_THROUGHPUT_WATCHDOG_ENABLED` | _(tidak ditetapkan → mati)_ | `src/lib/resilience/settings.ts` → `open-sse/services/throughputWatchdog.ts` | Watchdog output berguna strim aktif secara opt-in. Mengesan strim yang terus menghantar ketulan tetapi kekal di bawah kadar output pembantu yang dikonfigurasikan; heartbeat, acara penggunaan, delta kosong, dan fasa alat/penaakulan tidak menyamar sebagai kemajuan. Berasingan daripada tamat masa idle dan had akhir tegar. |
| `STREAM_THROUGHPUT_WATCHDOG_WARMUP_MS` | `30000` | `src/lib/resilience/settings/normalize.ts` | Tempoh tangguh sebelum penilaian throughput, dihadkan kepada 0–600000 ms. |
| `STREAM_THROUGHPUT_WATCHDOG_WINDOW_MS` | `30000` | `src/lib/resilience/settings/normalize.ts` | Tetingkap output berguna bergulir, dihadkan kepada 1000–600000 ms; satu tetingkap lengkap diperlukan sebelum pembatalan. |
| `STREAM_THROUGHPUT_WATCHDOG_MIN_BYTES_PER_SECOND` | `4` | `src/lib/resilience/settings/normalize.ts` | Kadar bait output pembantu UTF-8 minimum (proksi token konservatif), dihadkan kepada 1–1000000. |
| `STREAM_THROUGHPUT_WATCHDOG_MIN_USEFUL_BYTES` | `1` | `src/lib/resilience/settings/normalize.ts` | Sampel output berguna bukan sifar minimum yang dianggap boleh diukur, dihadkan kepada 1–1000000 bait. |
| `HEALTHCHECK_STAGGER_MS` | `3000` | `src/lib/tokenHealthCheck.ts` | Selang stagger (ms) antara semakan kesihatan token pembekal semasa permulaan. |
| `HEALTHCHECK_JITTER_MIN_MS` | `500` | `src/lib/tokenHealthCheck.ts` | Jitter rawak minimum (ms) yang ditambah di atas `HEALTHCHECK_STAGGER_MS` antara semakan kesihatan token pembekal, untuk mengelakkan letusan (Isu #1220). |
| `HEALTHCHECK_JITTER_MAX_MS` | `5000` | `src/lib/tokenHealthCheck.ts` | Jitter rawak maksimum (ms) yang ditambah di atas `HEALTHCHECK_STAGGER_MS` antara semakan kesihatan token pembekal, untuk mengelakkan letusan (Isu #1220). |
| `HEALTHCHECK_BATCH_SIZE` | `20` | `src/lib/tokenHealthCheck.ts` | Saiz kelompok semakan serentak untuk sapuan semakan kesihatan token permulaan; nilai lebih besar menyemak lebih banyak sambungan secara selari, nilai lebih kecil mengurangkan beban letusan (Isu #7875, regresi daripada #7719). |
| `REQUEST_RETRY` | `2` | `src/sse/services/cooldownAwareRetry.ts` | Bilangan cubaan semula automatik pada respons cooldown berskop model sebelum mengembalikan ralat kepada klien. |
| `MAX_RETRY_INTERVAL_SEC` | `30` | `src/sse/services/cooldownAwareRetry.ts` | Selang backoff maksimum (saat) antara cubaan semula cooldown. Dihadkan oleh nilai ini tanpa mengira `Retry-After` upstream. |
| `HEADROOM_URL` | `http://localhost:8787` | `src/lib/headroom/detect.ts` | URL proksi penjimatan token Headroom. Kitaran hayat dashboard (`api/headroom/*`) melancarkan CLI `headroom-ai` tempatan pada loopback secara lalai; ketepikan hanya untuk menunjuk ke proksi sidecar Docker luaran. |
### Pemalar penalaan pemulihan strim
Tingkah laku penahanan pemulihan ditala oleh pemalar yang dikodkan keras dalam
`open-sse/config/constants.ts` (`STREAM_RECOVERY`), ditunjukkan di sini untuk
rujukan — mengubahnya memerlukan suntingan kod, bukan pembolehubah persekitaran:
- `STREAM_RECOVERY.HOLDBACK_MS = 750` — berapa lama tetingkap SSE pembukaan ditahan
supaya pemotongan awal boleh dicuba semula sebelum sebarang bait diserahkan kepada klien.
- `STREAM_RECOVERY.BUFFER_MAX_BYTES = 65536` — had keras pada tetingkap yang ditahan; serah
(flush + passthrough) sebaik sahaja sebanyak ini bait terkumpul, tanpa mengira pemasa.
- `STREAM_RECOVERY.EARLY_RETRY_MAX = 4` — bilangan maksimum pembukaan semula telus strim
upstream semasa penahanan masih belum diserahkan.
> **Had kadar tetingkap gelongsor setiap penyedia (tiada pembolehubah persekitaran):** _fallback_
> had kadar tetingkap gelongsor setiap penyedia yang diport FCC wujud dalam kod
> (`open-sse/services/providerDefaultRateLimit.ts`, disambungkan melalui
> `open-sse/services/rateLimitManager.ts`) tetapi dikirimkan dengan **peta lalai kosong**
> dan **tiada pembolehubah persekitaran operator** pada masa ini — ia hanya didayakan
> melalui cangkuk ujian / suntingan kod. Ia sengaja tidak disenaraikan dalam jadual di
> atas. Pengehad geganti per-`(token, IP)` yang _memang_ mempunyai larasan ialah
> `RELAY_IP_PER_MINUTE` (§3 Rangkaian & Port).
---
## 22. Penyahpepijatan
> [!CAUTION]
> Pemboleh ubah ini menghasilkan **output terperinci** dan mungkin membocorkan data sensitif. **Jangan sekali-kali dayakan dalam persekitaran pengeluaran.**
| Pemboleh Ubah | Lalai | Fail Sumber | Perihalan |
| ------------------------------------- | ---------------------------------------- | ----------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| `CURSOR_DEBUG` | _(tidak ditetapkan)_ | `open-sse/executors/cursor.ts` | Tetapkan kepada `1` untuk mendayakan log pelaksana Cursor yang terperinci (ketulan SSE yang dinyahkod, dll.). |
| `CURSOR_STREAM_DEBUG` | _(tidak ditetapkan)_ | `open-sse/executors/cursor.ts` | Alias serasi ke belakang bagi `CURSOR_DEBUG`. |
| `CURSOR_DUMP_FILE` | _(tidak ditetapkan)_ | `open-sse/executors/cursor.ts` | Laluan fail pilihan yang menerima ketulan mentah Cursor yang dinyahkod apabila `CURSOR_DEBUG=1`. |
| `CURSOR_STREAM_TIMEOUT_MS` | `300000` | `open-sse/executors/cursor.ts` | Had masa melahu strim (ms) untuk pelaksana Cursor. |
| `CURSOR_KV_GRACE_MS` | `2000` | `open-sse/executors/cursor.ts` | Tempoh ihsan (ms) selepas penamat lembut composer kv_after_text apabila masih terdapat bait dalam penimbal — memberikan masa kepada panggilan alat exec_mcp yang menyusul untuk melengkapkan bingkainya. |
| `CURSOR_TOOL_DIRECTIVE` | didayakan (`!== "0"`) | `open-sse/executors/cursor.ts` | Arahan komit alat yang memastikan composer-2.5 mengeluarkan panggilan alat dengan pasti. Tetapkan kepada `0` untuk menyahdayakannya. |
| `OMNIROUTE_SYSTEM_INSTRUCTION_APPEND` | _(tidak ditetapkan)_ | `open-sse/translator/request/claude-to-openai.ts`, `open-sse/translator/response/openai-to-claude.ts` | Teks gesaan sistem yang ditentukan oleh pengendali dan ditambahkan pada mesej sistem SELEPAS penterjemahan (suntikan selepas penterjemahan), sehingga ke laluan codex/Responses dan `/v1/messages`. Turut digunakan sebagai awalan arahan yang dibuang daripada blok mukadimah sistem yang digemakan. Biarkan tidak ditetapkan untuk menyahdayakannya. |
| `OMNIROUTE_STRIP_SYSTEM_PREAMBLE` | `0` (mati) | `open-sse/translator/response/openai-to-claude.ts`, `open-sse/utils/directivePreambleStripper.ts` | Tetapkan kepada `1` untuk membuang blok mukadimah gesaan sistem yang digemakan dari permulaan strim openai→claude. Dimatikan secara lalai — heuristik tersebut dibentuk berasaskan prosa bahasa Inggeris dan mengubah muatan respons, jadi balasan yang sememangnya bermula dengan bahagian sedemikian akan kehilangannya. |
| `CURSOR_IMAGE_FETCH_TIMEOUT_MS` | `15000` | `open-sse/utils/cursorImages.ts` | Had masa pengambilan setiap imej (ms) untuk input penglihatan `image_url` jauh. |
| `CURSOR_STATE_DB_PATH` | _(dikesan)_ | `open-sse/utils/cursorVersionDetector.ts` | Mengatasi carian pangkalan data keadaan Cursor IDE yang digunakan untuk pengesanan versi IDE. |
| `CURSOR_AGENT_CLI_VERSION` | _(kesan / tetapkan)_ | `open-sse/utils/cursorAgentCliVersion.ts` | ID binaan Agent CLI (`YYYY.MM.DD-`) untuk `x-cursor-client-version: cli-…` pada Agent Run. |
| `CURSOR_AGENT_BIN` | _(tidak ditetapkan)_ | `open-sse/handlers/imageGeneration/providers/cursorAgentImage.ts` | Laluan kepada perduaan Cursor Agent yang digunakan untuk penjanaan imej. Jika tidak ditetapkan, pengendali menggunakan `providerSpecificData.agentBin`, kemudian PATH. |
| `CURSOR_IMG_TIMEOUT_MS` | `210000` | `open-sse/handlers/imageGeneration/providers/cursorAgentImage.ts` | Masa jam dinding setiap imej (ms) untuk tugas imej Cursor Agent. |
| `CURSOR_IMG_MAX_CONCURRENT` | `2` | `open-sse/handlers/imageGeneration/providers/cursorAgentImage.ts` | Had keserentakan tempat duduk dikongsi untuk tugas imej Cursor. |
| `CURSOR_IMG_MODEL` | permintaan / `auto` | `open-sse/handlers/imageGeneration/providers/cursorAgentImage.ts` | Mengatasi `--model` Cursor CLI untuk tugas imej. |
| `UC_IMAGE_POLL_INTERVAL_MS` | `2000` | `open-sse/handlers/imageGeneration/providers/ucImage.ts` | Kekerapan pengundian hasil penjanaan imej UC (uncensored.com) (ms). |
| `UC_IMAGE_POLL_TIMEOUT_MS` | `60000` | `open-sse/handlers/imageGeneration/providers/ucImage.ts` | Masa jam dinding pengundian hasil penjanaan imej UC (ms). |
| `UC_VIDEO_POLL_INTERVAL_MS` | `3000` | `open-sse/handlers/videoGeneration/providers/ucVideo.ts` | Kekerapan pengundian hasil penjanaan video UC (uncensored.com) (ms). |
| `UC_VIDEO_POLL_TIMEOUT_MS` | `300000` | `open-sse/handlers/videoGeneration/providers/ucVideo.ts` | Masa jam dinding pengundian hasil penjanaan video UC (ms). |
| `CURSOR_DATA_DIR` | _(dikesan)_ | `open-sse/utils/cursorAgentCliVersion.ts` | Mengatasi direktori data Cursor Agent CLI (`…/versions/`); pemboleh ubah yang sama digunakan oleh ejen rasmi. |
| `CURSOR_TOKEN` | _(tidak ditetapkan)_ | `scripts/ad-hoc/cursor-tap.cjs` | Token pembawa Cursor langsung yang digunakan oleh perkakas pembangun. |
| `OMNIROUTE_LOG_REQUEST_SHAPE` | dinyahdayakan (ikut serta melalui `"1"`) | `src/app/api/v1/chat/completions/route.ts` | Log penanda jenis/panjang kandungan untuk muatan sembang yang besar apabila `"1"` ditetapkan. Dimatikan secara lalai untuk mengurangkan hingar log. |
| `DEBUG_RESPONSES_SSE_TO_JSON` | _(tidak ditetapkan)_ | `open-sse/handlers/responseTranslator.ts` | Tetapkan kepada `true` untuk merekodkan butiran penterjemahan SSE→JSON Responses API. |
| `DEBUG_CLAUDE_NONSTREAM` | _(tidak ditetapkan)_ | `open-sse/handlers/responseTranslator.ts` | Tetapkan kepada `true` untuk memaparkan ketulan textContent kosong dalam laluan penterjemahan respons Claude (penyahpepijatan sahaja). |
| `NEXT_PUBLIC_OMNIROUTE_E2E_MODE` | _(tidak ditetapkan)_ | Abah-abah ujian E2E | Tetapkan kepada `true` untuk mendayakan mod ujian E2E (pengesahan dilonggarkan, cangkuk ujian). |
---
## 23. Integrasi GitHub
Benarkan pengguna melaporkan isu secara langsung daripada Dashboard.
| Pemboleh Ubah | Lalai | Fail Sumber | Penerangan |
| --------------------- | -------------------- | --------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| `GITHUB_ISSUES_REPO` | _(tidak ditetapkan)_ | `src/app/api/v1/issues/report/route.ts` | Repositori dalam format `owner/repo`. |
| `GITHUB_ISSUES_TOKEN` | _(tidak ditetapkan)_ | `src/app/api/v1/issues/report/route.ts` | Token Akses Peribadi GitHub dengan skop `issues:write`. |
| `GITHUB_TOKEN` | _(tidak ditetapkan)_ | pembantu pengelasan isu / ejen awan | Token akses GitHub generik yang digunakan sebagai pilihan sandaran untuk `GITHUB_ISSUES_TOKEN` dan digunakan oleh pembantu ejen awan dalam `src/lib/cloudAgent/*`. |
---
## Senario Penggunaan
Untuk panduan SRE bahagian belakang geganti (tingkah laku ts/bifrost/auto, penempatan 9router berbanding CLIProxyAPI, dan strategi sandaran daya pemprosesan tinggi), lihat [Strategi Bahagian Belakang Geganti](/docs/reference/RELAY_BACKEND_STRATEGY.md).
### Pembangunan Setempat Minimum
```bash
JWT_SECRET=$(openssl rand -base64 48)
API_KEY_SECRET=$(openssl rand -hex 32)
INITIAL_PASSWORD=dev123
PORT=20128
NODE_ENV=development
```
### Pengeluaran 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
```
### Terasing daripada Rangkaian / 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 dengan Proksi Songsang (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. Kotak Pasir Kemahiran (v3.8.0+)
Had dan kawalan keselamatan yang digunakan apabila rangka kerja Kemahiran (`src/lib/skills/`) melaksanakan automasi takrifan pengguna dalam persekitaran kotak pasir.
| Pemboleh Ubah | Lalai | Fail Sumber | Penerangan |
| --------------------------------- | ---------------------------------------------- | ------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `SKILLS_SANDBOX_TIMEOUT_MS` | `10000` (10 s) | `src/lib/skills/builtins.ts` | Tamat masa jam dinding bagi setiap pelaksanaan untuk kod kemahiran dalam kotak pasir. Had mutlak; apa-apa yang mengambil masa lebih lama akan dihentikan. |
| `SKILLS_EXECUTION_TIMEOUT_MS` | _(kembali kepada `SKILLS_SANDBOX_TIMEOUT_MS`)_ | `src/lib/skills/` | Tamat masa orkestrasi kemahiran peringkat tinggi. Tetapkan lebih tinggi daripada `SKILLS_SANDBOX_TIMEOUT_MS` untuk membenarkan aliran kerja berbilang langkah. |
| `SKILLS_MAX_FILE_BYTES` | `1048576` (1 MB) | `src/lib/skills/builtins.ts` | Bilangan bait maksimum yang boleh dibaca oleh sesuatu kemahiran daripada mana-mana satu fail dalam kotak pasir. |
| `SKILLS_MAX_HTTP_RESPONSE_BYTES` | `256000` (250 KB) | `src/lib/skills/builtins.ts` | Bilangan bait maksimum yang ditangkap daripada mana-mana satu respons HTTP dalam sesuatu kemahiran. |
| `SKILLS_MAX_SANDBOX_OUTPUT_CHARS` | `100000` | `src/lib/skills/builtins.ts` | Had mutlak bagi aksara stdout/stderr yang dikembalikan daripada panggilan kotak pasir. |
| `SKILLS_SANDBOX_NETWORK_ENABLED` | `false` | `src/lib/skills/builtins.ts` | Tetapkan `1`/`true` untuk membenarkan rangkaian keluar dari dalam kotak pasir. Secara lalai, ia **diasingkan** demi keselamatan. |
| `SKILLS_ALLOWED_SANDBOX_IMAGES` | _(kosong)_ | `src/lib/skills/builtins.ts` | Senarai imej bekas yang dibenarkan untuk pelaksanaan kotak pasir, dipisahkan dengan koma. Kosong bermaksud lalai terbina dalam sahaja. |
| `SKILLS_SANDBOX_DOCKER_IMAGE` | _(lalai terbina dalam)_ | `src/lib/skills/` | Imej bekas yang digunakan semasa menghasilkan kotak pasir berasaskan Docker. Gantikan untuk menetapkan imej asas tersuai yang diperkukuh. |
| `SKILLS_SANDBOX_RUNTIME` | `auto` | `src/lib/skills/sandbox.ts`, `src/lib/skills/containerProvider.ts` | Masa jalan bekas untuk pengotakpasiran kemahiran: `auto` \| `docker` \| `apple` \| `wsl` \| `orbstack` \| `podman`. `auto` memilih masa jalan terpasang yang terbaik bagi setiap OS hos (Apple Container/OrbStack pada macOS, WSL Container pada Windows, Podman pada Linux), dengan Docker sebagai sandaran. |
> [!CAUTION]
> Mendayakan `SKILLS_SANDBOX_NETWORK_ENABLED=true` membuka laluan trafik keluar daripada kod kemahiran sewenang-wenangnya. Gandingkan dengan `OUTBOUND_SSRF_GUARD_ENABLED=true` dan dasar `CORS_ORIGIN`/proksi yang ketat dalam pelaksanaan dikongsi.
---
## 25. Kuota Penyedia, Terowong, Sandaran & Runtime Pelbagai
Endpoint kuota penyedia, terowong rangkaian (Tailscale, Ngrok, proksi debug MITM), pool egress 1Proxy, sandaran pangkalan data dan penindihan kecil setiap ciri yang dirujuk oleh lapisan pelaksana atau skrip.
| Pembolehubah | Lalai | Fail Sumber | Penerangan |
| ---------------------------------------------- | --------------------------------------------------------------------------- | ------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `REDIS_URL` | `redis://localhost:6379` | `src/shared/utils/rateLimiter.ts` | Rentetan sambungan Redis untuk bahagian belakang pengehad kadar. |
| `ALIBABA_CODING_PLAN_HOST` | _(hos pengeluaran)_ | `open-sse/services/bailianQuotaFetcher.ts` | Menggantikan hos yang digunakan untuk mendapatkan kuota pelan pengekodan Alibaba Bailian. |
| `ALIBABA_CODING_PLAN_QUOTA_URL` | diperoleh daripada hos | `open-sse/services/bailianQuotaFetcher.ts` | Penggantian URL kuota penuh untuk Alibaba Bailian. |
| `QWEN_CLOUD_COOKIE` | _(tidak ditetapkan)_ | `open-sse/services/qwenTokenPlanQuotaFetcher.ts` | Kuki sesi konsol untuk gerbang kuota Pelan Token peribadi Qwen Cloud / Model Studio (kunci API inferens tidak dapat membacanya). Salin keseluruhan pengepala permintaan `Cookie` — ia mengandungi `login_qwencloud_ticket` — daripada mana-mana panggilan `api.json` ke `cs-data.qwencloud.com` pada home.qwencloud.com › Pengebilan › Langganan (F12 › Rangkaian). Sensitif dan terhad kepada sesi; lebih baik gunakan medan Dashboard `qwenCloudCookie` setiap sambungan. |
| `QWEN_CLOUD_SEC_TOKEN` | _(tidak ditetapkan)_ | `open-sse/services/qwenTokenPlanQuotaFetcher.ts` | Penggantian `sec_token` manual untuk gerbang konsol Pelan Token. Sensitif; apabila tidak ditetapkan, pengambil akan menyelesaikannya daripada HTML papan pemuka menggunakan kuki. |
| `QWEN_TOKEN_PLAN_HOST` | `https://cs-data.qwencloud.com` | `open-sse/services/qwenTokenPlanQuotaFetcher.ts` | Penggantian hos gerbang untuk pengambil kuota Pelan Token peribadi (cth. `bailian-singapore-cs.alibabacloud.com` untuk konsol Model Studio). |
| `QWEN_TOKEN_PLAN_DASHBOARD_URL` | `https://home.qwencloud.com/` | `open-sse/services/qwenTokenPlanQuotaFetcher.ts` | URL papan pemuka yang digunakan untuk menyelesaikan `sec_token` daripada HTML yang telah log masuk. |
| `XIAOMI_MIMO_CONSOLE_COOKIE` | _(tidak ditetapkan)_ | `open-sse/services/usage/xiaomi-mimo.ts` | Kuki sesi konsol untuk API kuota Pelan Token Xiaomi MiMo (`platform.xiaomimimo.com/api/v1/tokenPlan/usage` + `tokenPlan/detail` — kunci API inferens tidak dapat membacanya). Salin keseluruhan pengepala permintaan `Cookie` — ia mengandungi `api-platform_serviceToken` dan `userId` — daripada mana-mana permintaan ke `platform.xiaomimimo.com` pada halaman Pelan Token (F12 › Rangkaian). Sensitif dan terhad kepada sesi; lebih baik gunakan medan Dashboard `xiaomiMimoConsoleCookie` setiap sambungan. |
| `XIAOMI_MIMO_MONTHLY_TOKEN_LIMIT` | `4100000000` | `open-sse/services/usage/xiaomi-mimo.ts` | Bajet bulanan (Kredit) untuk fallback Xiaomi MiMo yang dijejak OmniRoute yang digunakan apabila tiada kuki konsol dikonfigurasikan. Lalai kepada 4.1B tier Lite; tetapkannya kepada Kredit pelan (Standard 11B / Pro 38B / Max 82B). Penggantian `providerSpecificData.monthlyTokenLimit` setiap sambungan mengatasi pemboleh ubah env ini. |
| `ALIBABA_FREE_TIER_VISION_FE_PATH` | `/costing-balance/free-quota-image-video` | `open-sse/services/alibabaFreeTierQuotaFetcher.ts` | Penggantian laluan front-end konsol untuk mendapatkan kuota visi/media tier percuma Alibaba Model Studio. |
| `ALIBABA_FREE_TIER_MULTIMODAL_FE_PATH` | `/costing-balance/free-quota-multimodal` | `open-sse/services/alibabaFreeTierQuotaFetcher.ts` | Penggantian laluan front-end konsol untuk mendapatkan kuota multimodal tier percuma Alibaba Model Studio. |
| `ALIBABA_FREE_TIER_AUDIO_FE_PATH` | `/costing-balance/free-quota-audio` | `open-sse/services/alibabaFreeTierQuotaFetcher.ts` | Penggantian laluan front-end konsol untuk mendapatkan kuota audio tier percuma Alibaba Model Studio. |
| `ALIBABA_FREE_TIER_ALLOWLIST_PATH` | _(tidak ditetapkan)_ | `open-sse/services/alibabaFreeTierAllowlist.ts` | Laluan pilihan kepada penggantian JSON tempatan untuk senarai benar model teks tier percuma Alibaba terbina dalam. Kembali kepada `$DATA_DIR/alibaba-free-tier-allowlist.json`, kemudian `config/alibaba-free-tier-allowlist.json`. |
| `CONTEXT_RESERVE_TOKENS` | `1024` | `open-sse/services/contextManager.ts` | Token yang ditempah untuk output pelengkapan apabila mengira bajet prompt. |
| `CONTEXT_KEEP_LATEST_IMAGES` | `2` | `open-sse/services/contextManager.ts` | Bilangan imej sebaris terbaharu yang disimpan apabila memangkas imej lama untuk memuatkan tetingkap konteks (#8560). |
| `MODEL_ALIAS_COMPAT_ENABLED` | didayakan | `open-sse/services/model.ts` | Togol lapisan keserasian alias model warisan yang digunakan oleh klien lama. |
| `OMNIROUTE_EMERGENCY_FALLBACK` | didayakan | `open-sse/services/emergencyFallback.ts` | Tetapkan `false` (atau `0`) untuk melumpuhkan fallback kecemasan kehabisan bajet yang mengalihkan permintaan gagal ke model percuma `nvidia`/`openai/gpt-oss-120b`. Keutamaan berkesan ialah penggantian DB Feature Flags > pemboleh ubah env > lalai; jika tidak tersedia, perkhidmatan kembali kepada nilai env mentah. |
| `COMMAND_CODE_CALLBACK_PORT` | _(tidak ditetapkan)_ | `src/app/api/providers/command-code/auth/shared.ts` | Port tempatan yang digunakan untuk panggilan balik gaya OAuth daripada pembantu CLI Command Code. |
| `COMMAND_CODE_VERSION` | `0.33.2` | `open-sse/executors/commandCode.ts` | Nilai yang dihantar sebagai pengepala `x-command-code-version` kepada hulu Command Code. Gantikan untuk menaikkan versi CLI. |
| `COMMANDCODE_API_URL` | `https://api.commandcode.ai` | `open-sse/services/usage/command-code.ts` | URL asas untuk hulu penggunaan/kuota Command Code yang digunakan oleh telemetri pengambil kuota telefon pintar. Gantikan untuk API Command Code hos sendiri/alternatif. |
| `MITM_LOCAL_PORT` | `443` | `src/mitm/server.cjs` | Port ikat tempatan untuk proksi nyahpepijat MITM. |
| `MITM_DISABLE_TLS_VERIFY` | `0` | `src/mitm/server.cjs` | Tetapkan `1` untuk melumpuhkan pengesahan TLS hulu (pembangunan sahaja). |
| `MITM_IDLE_TIMEOUT_MS` | `60000` | `src/mitm/socketTimeouts.ts`, `src/mitm/server.cjs` | Tamat masa melahu soket (ms) untuk sambungan yang diproksikan; soket melahu yang melebihi nilai ini dirobohkan untuk mengelakkan kebocoran terowong separuh terbuka. |
| `BRIDGE_PORT` | `20129` | `bin/antigravity-bridge.mjs` | Port yang didengari oleh jambatan MITM Antigravity. |
| `ROUTER_URL` | `http://127.0.0.1:20128/v1/antigravity` | `bin/antigravity-bridge.mjs` | Titik akhir penghala tempat jambatan memajukan trafik Antigravity. |
| `CERT_DIR` | `/mitm` | `bin/antigravity-bridge.mjs` | Menggantikan direktori tempat jambatan membaca bahan TLSnya. Model sijil dipilih seperti yang dilakukan oleh pelayan AgentBridge: `server.crt`/`server.key` untuk pemasangan daun warisan, jika tidak `ca.crt`/`ca.key` (CA akar, satu daun bagi setiap hos yang dipintas; dipaksa oleh `MITM_ROOT_CA_ENABLED=true`). Jambatan keluar semasa permulaan jika fail bagi model aktif tiada. |
| `MITM_VERBOSE` | `1` | `src/mitm/server.cjs`, `src/mitm/_internal/bypass.cjs` | Keteperincian log keputusan penghalaan: `0` menyenyapkan, nilai lebih tinggi merekodkan lebih banyak keputusan pintasan/laluan. |
| `MITM_ROOT_CA_ENABLED` | `false` | `src/mitm/manager.ts` | Tetapkan `true` untuk memilih masuk model sijil CA akar + daun setiap hos (#6684). Pemasangan baharu mendapatkannya secara automatik; pemasangan dengan daun warisan sedia ada yang dipercayai mengekalkan sijil SAN tetap warisan melainkan dipilih masuk. |
| `MITM_CERT_MODE` | `legacy` | `src/mitm/manager.ts`, `src/mitm/server.cjs` | Ditetapkan OLEH pengurus MITM untuk proses proksi yang dihasilkan (`root-ca` \| `legacy`) — mencerminkan keputusan penghijrahan sijil; tidak dimaksudkan untuk ditetapkan secara manual. |
| `OMNIROUTE_NO_SUDO` | `0` | `src/mitm/systemCommands.ts` | Tetapkan `1` (truthy) untuk membuang `sudo` di permulaan arahan kepercayaan sijil MITM — untuk penggunaan tanpa root / namespace pengguna di mana pengendali mempercayai CA secara manual (cth. melalui mekanisme extra-CA-certs Node). |
| `SKIP_ANTIGRAVITY_DNS` | _(tidak ditetapkan)_ | `src/mitm/dns/provision.ts` | Tetapkan `true` untuk melangkau penyediaan entri DNS `/etc/hosts` bagi nama hos proksi Antigravity sepenuhnya — untuk kontena yang tiada sudo/root tersedia. |
| `OMNIROUTE_SKIP_DNS_WRITE` | _(tidak ditetapkan)_ | `src/mitm/dns/dnsConfig.ts` | Tetapkan `1` untuk melangkau penulisan ke fail hosts apabila menambah/mengalih keluar entri DNS — untuk persekitaran ujian sandbox atau baca sahaja. |
| `OMNIROUTE_SKIP_SYSTEM_TRUST` | `0` | `src/mitm/cert/install.ts`, `src/mitm/tproxy/caTrust.ts` | Pengawal khusus ujian/CI: tetapkan `1` untuk menjadikan pemasangan/penyahpasangan kepercayaan sijil no-op supaya suite tidak pernah mengubah simpanan kepercayaan OS. Ditetapkan secara automatik oleh persediaan ujian dan aliran kerja CI. |
| `CHANGELOG_BASE_REF` | _(automatik)_ | `scripts/check/check-changelog-integrity.mjs` | Ref asas eksplisit untuk gerbang anti CHANGELOG-eat (lalai kepada cawangan asas PR dalam CI, atau `release/v*` tertinggi). |
| `FREE_PROXY_AUTO_SYNC_ENABLED` | `false` | `src/lib/freeProxyProviders/scheduler.ts` | Tetapkan `true` untuk mendayakan penjadual penyegerakan automatik kumpulan proksi percuma di latar belakang. Opt-in, dimatikan secara lalai. |
| `FREE_PROXY_AUTO_SYNC_INTERVAL_MS` | `1800000` | `src/lib/freeProxyProviders/scheduler.ts` | Selang penyegerakan automatik dalam milisaat (lalai 30 min). |
| `FREE_PROXY_1PROXY_ENABLED` | `true` | `src/lib/freeProxyProviders/oneproxy.ts` | Dayakan sumber proksi percuma 1proxy. Tetapkan kepada `false` untuk menyahdayakan. |
| `FREE_PROXY_1PROXY_API_URL` | _(lihat oneproxy.ts)_ | `src/lib/freeProxyProviders/oneproxy.ts` | Penggantian URL API 1proxy. |
| `FREE_PROXY_1PROXY_MAX` | `500` | `src/lib/freeProxyProviders/oneproxy.ts` | Bilangan maksimum proksi yang diambil setiap penyegerakan daripada 1proxy. |
| `FREE_PROXY_1PROXY_MIN_QUALITY` | `50` | `src/lib/freeProxyProviders/oneproxy.ts` | Ambang skor kualiti minimum untuk import 1proxy. |
| `FREE_PROXY_PROXIFLY_ENABLED` | `true` | `src/lib/freeProxyProviders/proxifly.ts` | Dayakan sumber proksi percuma Proxifly. Tetapkan kepada `false` untuk melumpuhkan. |
| `FREE_PROXY_PROXIFLY_QUANTITY` | `100` | `src/lib/freeProxyProviders/proxifly.ts` | Bilangan proksi untuk diambil bagi setiap penyegerakan Proxifly. |
| `FREE_PROXY_PROXIFLY_ANONYMITY` | `elite` | `src/lib/freeProxyProviders/proxifly.ts` | Penapis tahap tanpa nama untuk Proxifly (`elite`, `anonymous`, `transparent`). |
| `FREE_PROXY_IPLOCATE_ENABLED` | `false` | `src/lib/freeProxyProviders/iplocate.ts` | Dayakan sumber proksi percuma IPLocate. Hanya secara pilih masuk (opt-in). |
| `FREE_PROXY_IPLOCATE_BASE_URL` | `https://raw.githubusercontent.com/iplocate/free-proxy-list/main/protocols` | `src/lib/freeProxyProviders/iplocate.ts` | Penggantian URL asas senarai proksi IPLocate. |
| `FREE_PROXY_WEBSHARE_ENABLED` | `true` | `src/lib/freeProxyProviders/webshare.ts` | Dayakan sumber kumpulan proksi Webshare. Tetapkan kepada `false` untuk melumpuhkan; juga memerlukan `FREE_PROXY_WEBSHARE_API_KEY` ditetapkan. |
| `FREE_PROXY_WEBSHARE_API_KEY` | _(tiada)_ | `src/lib/freeProxyProviders/webshare.ts` | Token API akaun Webshare (`Authorization: Token `). Diperlukan — pembekal kekal dilumpuhkan tanpanya. |
| `FREE_PROXY_WEBSHARE_API_URL` | `https://proxy.webshare.io/api/v2/proxy/list/` | `src/lib/freeProxyProviders/webshare.ts` | Penggantian URL API senarai proksi Webshare. |
| `FREE_PROXY_WEBSHARE_MAX` | `500` | `src/lib/freeProxyProviders/webshare.ts` | Proksi maksimum yang diimport bagi setiap penyegerakan Webshare. |
| `NEXT_PUBLIC_VERCEL_RELAY_ENABLED` | `true` | `src/app/(dashboard)/…/ProxyPoolTab.tsx` | Tunjukkan/sembunyikan butang Deploy Vercel Relay dalam tab Proxy Pool. |
| `VERCEL_API_BASE` | `https://api.vercel.com` | `src/app/api/settings/proxy/vercel-deploy/route.ts` | Penggantian URL asas API Vercel (untuk ujian). |
| `NEXT_PUBLIC_VERCEL_RELAY_DEFAULT_PROJECT` | `omniroute-relay` | `src/app/(dashboard)/…/VercelRelayModal.tsx` | Nama projek lalai yang dipra-isi dalam modal deploy Vercel Relay. |
| `TAILSCALE_BIN` | _(auto-kesan)_ | `src/lib/tailscaleTunnel.ts` | Laluan eksplisit ke binari `tailscale`. |
| `TAILSCALED_BIN` | _(auto-kesan)_ | `src/lib/tailscaleTunnel.ts` | Laluan eksplisit ke binari daemon `tailscaled`. |
| `TAILSCALE_AUTHKEY` | _(tidak ditetapkan)_ | `src/lib/tailscaleTunnel.ts` | Kunci pengesahan Tailscale pra-kongsi untuk `tailscale up` bukan interaktif / headless (dihantar melalui `--auth-key=`). Apabila tidak ditetapkan, log masuk kembali kepada URL pengesahan pelayar interaktif. |
| `NGROK_AUTHTOKEN` | _(tidak ditetapkan)_ | `src/lib/ngrokTunnel.ts` | Mengesahkan terowong ngrok keluar. |
| `DB_BACKUP_MAX_FILES` | `20` | `src/lib/db/backup.ts` | Bilangan maksimum fail sandaran SQLite yang dikekalkan oleh pembersihan sandaran manual/berjadual. Snapshot migrasi dialamatkan mengikut kandungan dan digunakan semula untuk keadaan DB yang serupa; ia tidak dipangkas dalam tetingkap migrasi serentak. Menggantikan nilai yang disimpan daripada Tetapan → Pengekalan sandaran pangkalan data. |
| `DB_BACKUP_RETENTION_DAYS` | `0` | `src/lib/db/backup.ts` | Umur maksimum (hari) yang dikekalkan oleh pembersihan sandaran manual/berjadual. `0` melumpuhkan pemangkasan berasaskan umur. Snapshot migrasi tidak dipangkas dalam tetingkap migrasi serentak. Menggantikan nilai yang disimpan daripada Tetapan → Pengekalan sandaran pangkalan data. |
| `OMNIROUTE_BACKUP_SCHEDULE_JOB_INTERVAL_MS` | `30000` | `src/lib/jobs/backupScheduleJob.ts` | Selang tick (ms) tugas sisi pelayan yang melaksanakan `backup-schedule.json`. Mesti kekal jauh di bawah kekasaran cron 1 minit; nilai di bawah `5000` atau yang tidak dapat dihuraikan kembali kepada `30000`. |
| `CONTAINER_HOST` | `docker` | `scripts/check-permissions.sh` | Petunjuk runtime kontena untuk semakan kebenaran entrypoint. Tetapkan kepada `podman` untuk sebarang topologi Podman. Oleh kerana kontena tidak dapat menentukan sama ada enjin adalah tempatan atau dicapai melalui Podman Machine, amaran kekal neutral dari segi topologi dan merujuk kepada `contrib/podman/README.md`. |
| `QUOTA_STORE_DRIVER` | `sqlite` | `src/lib/quota/storeFactory.ts` | Backend stor penggunaan perkongsian kuota: `sqlite` (lalai) atau `redis`. |
| `QUOTA_STORE_REDIS_URL` | _(tidak ditetapkan)_ | `src/lib/quota/storeFactory.ts` | Rentetan sambungan Redis yang digunakan apabila `QUOTA_STORE_DRIVER=redis` (cth. `redis://localhost:6379`). |
| `QUOTA_SATURATION_THRESHOLD` | `0.5` | `src/lib/quota/enforce.ts` | Nisbah ketepuan pool (0..1); pada/melebihinya pool memasuki mod ketat (tiada pinjaman). |
| `QUOTA_SOFT_DEPRIORITIZE_FACTOR` | `0.7` | `open-sse/services/combo.ts` | Pengganda skor (0..1) yang dikenakan pada sasaran apabila dasar kuota lembut menyahutamakannya. |
| `STATUS_SOFT_DEPRIORITIZE_FACTOR` | `0.5` | `open-sse/services/combo/autoStrategy.ts` | Pengganda skor (0..1) yang dikenakan pada penyedia yang kehabisan (`credits_exhausted`/`rate_limited`) dalam pemarkahan auto-combo apabila potongan kuota preflight DIMATIKAN (#4540). |
| `QUOTA_CONSUMPTION_RETENTION_DAYS` | `14` | `src/lib/db/quotaConsumption.ts` | Tempoh pengekalan (hari) untuk bucket `quota_consumption` sebelum GC (`gcQuotaConsumption`). |
| `QUOTA_PREFLIGHT_CUTOFF_ENABLED` | `false` | `src/lib/resilience/settings.ts` | Opt-in (lalai DIMATIKAN): mendayakan potongan kuota keras penghalaan auto yang menggugurkan calon berkuota rendah sebelum pemarkahan. |
| `OMNIROUTE_AUTO_FREE_FALLBACK_TO_FULL_POOL` | `false` | `open-sse/services/autoCombo/virtualFactory.ts` | Opt-in (lalai DIMATIKAN): apabila penapis `auto/:` tidak sepadan dengan mana-mana calon yang disambungkan, pulihkan tingkah laku legasi berundur kepada pool penuh (tidak ditapis) dan bukannya memulangkan pool kosong. Lalai DIMATIKAN menjadikan `:free` bermaksud "peringkat percuma sahaja". |
| `OMNIROUTE_CHAOS_MAX_PANEL` | `5` | `open-sse/services/autoCombo/virtualFactory.ts` | Had saiz panel (diapit 1–10) untuk varian siaran `auto/*:chaos` — satu permintaan dikembangkan kepada paling banyak sebanyak nilai ini model daripada penyedia yang berbeza. |
| `OMNIROUTE_CHAOS_MIN_PANEL` | _(lalai enjin)_ | `open-sse/services/autoCombo/virtualFactory.ts` | Penalaan saiz panel minimum yang diteruskan ke pengendali siaran chaos; tidak ditetapkan bermaksud mengekalkan lalai enjin. |
| `OMNIROUTE_CHAOS_PANEL_TIMEOUT_MS` | _(lalai enjin)_ | `open-sse/services/autoCombo/virtualFactory.ts` | Had masa tamat keras (ms) untuk keseluruhan fan-out panel chaos; tidak ditetapkan bermaksud mengekalkan lalai enjin. |
| `GROK_AUTH_PATH` | `~/.grok/auth.json` | `open-sse/services/grokQuotaFetcher.ts` | Laluan fail `auth.json` Grok CLI yang digunakan untuk mendapatkan kuota mingguan grok-web; ganti untuk ujian atau pemasangan CLI bukan standard. |
| `AGENTBRIDGE_UPSTREAM_CA_CERT` | _(tidak ditetapkan)_ | `src/mitm/manager.ts` | Sijil CA tambahan (PEM) yang dipercayai untuk sambungan TLS huluan AgentBridge. |
| `INSPECTOR_BUFFER_SIZE` | `1000` | `src/mitm/inspector/buffer.ts` | Bilangan maksimum permintaan yang ditangkap dan disimpan dalam penimbal gelang Traffic Inspector. |
| `INSPECTOR_MAX_BODY_KB` | `1024` | `src/mitm/inspector/buffer.ts` | Saiz maksimum badan permintaan/respons yang ditangkap (KB) sebelum dipangkas. |
| `INSPECTOR_HTTP_PROXY_PORT` | `8080` | `src/mitm/inspector/httpProxyServer.ts` | Port tempatan untuk proksi HTTP Traffic Inspector. |
| `INSPECTOR_HTTP_PROXY_AUTOSTART` | `false` | `src/mitm/inspector/httpProxyServer.ts` | Mulakan proksi HTTP pemeriksa secara automatik semasa but. |
| `INSPECTOR_LLM_HOSTS_EXTRA` | _(tidak ditetapkan)_ | `src/lib/inspector/captureState.ts` | Nama hos tambahan (dipisahkan dengan koma) yang dianggap sebagai titik akhir LLM untuk penangkapan. |
| `INSPECTOR_MASK_SECRETS` | `true` | `src/mitm/inspector/buffer.ts` | Sorokkan rahsia (pengepala auth / kunci API) dalam trafik yang ditangkap. |
| `INSPECTOR_SYSTEM_PROXY_GUARD_MINUTES` | `30` | `src/app/api/tools/traffic-inspector/capture-modes/system-proxy/route.ts` | Minit sebelum pengawal proksi sistem mengembalikan semula tetapan proksi OS secara automatik. |
| `INSPECTOR_INTERNAL_INGEST_TOKEN` | _(automatik)_ | `src/app/api/tools/traffic-inspector/internal/ingest/route.ts` | Token yang mengesahkan ingest tangkapan dalaman ke dalam pemeriksa. |
| `PLAYGROUND_COMPARE_MAX_COLUMNS` | `4` | `src/app/(dashboard)/dashboard/playground/` | Bilangan maksimum lajur sebelah-menyebelah dalam mod perbandingan Playground. |
| `PLAYGROUND_IMPROVE_PROMPT_DEFAULT_MODEL` | _(tidak ditetapkan)_ | `src/app/(dashboard)/dashboard/playground/` | Model lalai untuk tindakan 'improve prompt' Playground (kembali kepada model aktif apabila tidak ditetapkan). |
| `BIFROST_ENABLED` | `1` | `src/app/api/v1/relay/chat/completions/bifrost/route.ts` | Suis pemutus induk untuk proksi sidecar bifrost. Apabila ditetapkan kepada `0`, laluan mengembalikan 503 dengan pengepala `X-Bifrost-Killswitch` dan operator dialihkan ke laluan TS. Gunakan untuk melumpuhkan sidecar tanpa deployment semula (insiden penghala tier-1, putaran kunci). |
| `BIFROST_BASE_URL` | _(tidak ditetapkan)_ | `src/app/api/v1/relay/chat/completions/bifrost/route.ts` | Apabila ditetapkan, laluan proksi sidecar Bifrost menghantar trafik `/v1/chat/completions` ke gerbang Go ini dan bukannya pengendali relay TS. Tidak ditetapkan → 503-dengan-fallback. Slash di hujung dibuang. |
| `BIFROST_PORT` | `8080` | `src/lib/services/bootstrap.ts` | Port yang diikat oleh perkhidmatan terbenam Bifrost yang diselia (`127.0.0.1:`) apabila OmniRoute menguruskan kitar hayat sidecar Bifrost. Lalai kepada `8080`. |
| `LLMLINGUA_PORT` | `20135` | `src/lib/services/bootstrap.ts` | Port yang diikat oleh perkhidmatan mampatan LLMLingua yang diselia (`127.0.0.1:`). Lalai kepada `20135`. |
| `LLMLINGUA_BASE_URL` | `http://127.0.0.1:20135` | `open-sse/services/compression/engines/llmlingua/index.ts` | URL asas untuk daemon mikroservis mampatan HTTP LLMLingua tempatan. Lalai kepada `http://127.0.0.1:20135`. |
| `LLMLINGUA_MODEL` | `atjsh/llmlingua-2-js-tinybert-meetingbank` | `src/lib/services/installers/llmlingua.ts` | ID model Hugging Face yang dimuatkan oleh sidecar LLMLingua yang diselia (diteruskan kepada env proses anak). |
| `BIFROST_API_KEY` | _(tidak ditetapkan)_ | `src/app/api/v1/relay/chat/completions/bifrost/route.ts` | Kunci API untuk gerbang Bifrost (dihantar sebagai `Authorization: Bearer ...`). Jika tidak ditetapkan, laluan mengharapkan permintaan membawa kunci API OmniRoute yang sah; kunci ini hanya untuk pengesahan di sebelah gerbang. |
| `BIFROST_STREAMING_ENABLED` | `true` | `src/app/api/v1/relay/chat/completions/bifrost/route.ts` | Apabila true, laluan sidecar Bifrost menstrim respons kembali melalui SSE menerusi gateway dan bukannya pelaksana penstriman TS. Tetapkan kepada `0` untuk memaksa respons JSON bukan penstriman menerusi gateway. |
| `BIFROST_TIMEOUT_MS` | `30000` | `src/app/api/v1/relay/chat/completions/bifrost/route.ts` | Had masa setiap permintaan semasa proksi ke gateway Bifrost (ms). Apabila tamat masa, laluan mengembalikan laluan geganti TS melalui pengepala `X-Bifrost-Fallback`. |
| `OMNIROUTE_BIFROST_KEY` | _(tidak ditetapkan)_ | `src/app/api/v1/relay/chat/completions/bifrost/route.ts` | Alias untuk `BIFROST_API_KEY` (digunakan oleh skrip yang membaca env melalui `OMNIROUTE_*`). `BIFROST_API_KEY` diutamakan apabila kedua-duanya ditetapkan. |
| `OMNIROUTE_RELAY_BACKEND` | `ts` / `auto` | `src/app/api/v1/relay/chat/completions/routingBackend.ts` | Backend geganti untuk `/api/v1/relay/chat/completions`: `ts \| bifrost \| auto`. `ts` = geganti TypeScript (lalai apabila Bifrost tidak dikonfigurasi); `auto` memilih Bifrost apabila `BIFROST_BASE_URL` ditetapkan dan `BIFROST_ENABLED` ≠ `0`, dengan sandaran TS automatik jika sidecar tidak dapat dicapai; `bifrost` memaksa Bifrost (ketat, tiada sandaran). Auth/had-kadar/pengawal-suntikan/senarai-benar sentiasa dijalankan dalam laluan Next dahulu. Respons membawa `X-Routing-Backend` / `X-Routing-Fallback` / `X-Routing-Fallback-Reason`. |
| `RELAY_ROUTING_BACKEND` | _(tidak ditetapkan)_ | `src/app/api/v1/relay/chat/completions/routingBackend.ts` | Alias yang diterima untuk `OMNIROUTE_RELAY_BACKEND` (nilai `ts \| bifrost \| auto` yang sama). `OMNIROUTE_RELAY_BACKEND` diutamakan apabila kedua-duanya ditetapkan. |
| `OMNIROUTE_BIFROST_FAILURE_COOLDOWN_MS` | `5000` | `src/app/api/v1/relay/chat/completions/bifrostCooldown.ts` | Tempoh bertenang (ms) selepas lompatan sidecar Bifrost gagal dalam mod `auto` sebelum geganti mencuba semula sidecar; ia menuju terus ke laluan TS semasa tempoh bertenang berlangsung, kemudian menyelidik semula. `0` menyahaktifkannya. Hanya terpakai apabila `OMNIROUTE_RELAY_BACKEND=auto`. |
| `OMNIROUTE_TLS_CERT` | _(tidak ditetapkan)_ | `bin/cli/commands/serve.mjs` | Laluan ke sijil PEM TLS untuk menyediakan `omniroute serve` melalui HTTPS (bersamaan dengan `--tls-cert`). Mesti dipadankan dengan `OMNIROUTE_TLS_KEY`; pelayan kendiri kemudiannya menamatkan TLS pada pendengar yang sama (`wss://` berfungsi tanpa perubahan). Tidak ditetapkan → HTTP biasa. Menyediakan hanya satu daripada cert/key, atau laluan yang tidak boleh dibaca, merekodkan amaran dan kekal HTTP. |
| `OMNIROUTE_TLS_KEY` | _(tidak ditetapkan)_ | `bin/cli/commands/serve.mjs` | Laluan ke kunci peribadi PEM TLS untuk HTTPS `omniroute serve` (bersamaan dengan `--tls-key`). Mesti dipadankan dengan `OMNIROUTE_TLS_CERT`. Lihat `OMNIROUTE_TLS_CERT`. |
| `OMNIROUTE_LOCAL_ENDPOINTS_ENABLED` | `0` | `src/lib/security/localEndpoints.ts` | Suis utama untuk laluan `/api/local/*`. Apabila tidak ditetapkan atau `0`, semua laluan `/api/local/*` mengembalikan 503 dalam pengeluaran. Mesti `1` dalam penggunaan bukan loopback untuk membolehkan pelancar Redis dan pemula perkhidmatan tempatan 1-klik yang serupa. Perlindungan berlapis dengan klasifikasi pengawal-laluan `isLocalOnlyPath()` (`LOCAL_ONLY_API_PREFIXES` dalam `src/server/authz/routeGuard.ts`). |
| `OMNIROUTE_LOCAL_ENDPOINTS_TOKEN` | _(tidak ditetapkan)_ | `src/lib/security/localEndpoints.ts` | Token Bearer untuk pemanggil `/api/local/*` yang bukan pada loopback (cth. aplikasi desktop). Apabila ditetapkan, permintaan daripada IP bukan loopback mesti membawa `Authorization: Bearer `. Diperlukan apabila `OMNIROUTE_LOCAL_ENDPOINTS_ENABLED=1` dalam penggunaan bukan loopback. |
| `OMNIROUTE_REDIS_CONTAINER_NAME` | `omniroute-redis` | `bin/cli/commands/redis.mjs` | Nama kontena untuk pelancar Redis 1-klik (`omniroute redis up`). Digunakan oleh kedua-dua CLI dan GUI `RedisLauncherPanel`. |
| `OMNIROUTE_REDIS_HOST_PORT` | `6379` | `bin/cli/commands/redis.mjs` | Port hos untuk pelancar Redis 1-klik. Naikkan jika hos sudah mengikat 6379. Port dalaman kontena kekal 6379. |
| `OMNIROUTE_REDIS_BIND_HOST` | `127.0.0.1` | `bin/cli/commands/redis.mjs` | Antara muka hos yang diterbitkan oleh pelancar Redis 1-klik. Pelancar memulakan Redis TANPA kata laluan, jadi mengikat `0.0.0.0` memberikan setiap hos pada LAN anda Redis tanpa pengesahan — hanya luaskan ini jika anda juga menetapkan kata laluan pada instans itu sendiri. |
| `REDIS_BIND_HOST` | `127.0.0.1` | `docker-compose.yml` | Antara muka hos yang diterbitkan docker-compose untuk sidecar Redis (#9286). Redis compose berjalan tanpa `requirepass`; kontena aplikasi mencapainya melalui rangkaian compose (`redis:6379`) — port yang diterbitkan wujud hanya untuk perkakasan sisi hos. `0.0.0.0` mendedahkan Redis tanpa pengesahan kepada seluruh LAN. |
| `REDIS_PORT` | `6379` | `docker-compose.yml` | Port hos untuk sidecar Redis compose. |
| `APP_BIND_HOST` | `127.0.0.1` | `docker-compose.yml`, `docker-compose.prod.yml` | Antara muka hos yang diterbitkan docker-compose untuk port papan pemuka/API/live-WS aplikasi itu sendiri (#12568). Dengan `REQUIRE_API_KEY=false` disediakan sebagai lalai `.env.example`, `0.0.0.0` mendedahkan proksi LLM `/v1` tanpa nama kepada seluruh LAN/WAN — hanya luaskan setelah `REQUIRE_API_KEY=true` atau proksi songsang di hadapan menguatkuasakan pengesahannya sendiri. |
| `QDRANT_BIND_HOST` | `127.0.0.1` | `docker-compose.yml` | Antara muka hos yang diterbitkan docker-compose untuk sidecar memori Qdrant (#12578). Alasan pendedahan LAN yang sama seperti `REDIS_BIND_HOST`. |
| `BIFROST_BIND_HOST` | `127.0.0.1` | `docker-compose.yml` | Antara muka hos yang diterbitkan docker-compose untuk sidecar penghala Bifrost (#12578). Alasan pendedahan LAN yang sama seperti `REDIS_BIND_HOST`. |
| `REDIS_KEY_PREFIX` | `omniroute:` | `src/shared/utils/rateLimiter.ts` | Awalan ruang nama yang digunakan pada setiap kunci Redis OmniRoute (pengehad kadar, cache pengesahan, stor kuota, pemutus litar pemanasan). Mengelakkan perlanggaran kunci apabila instans Redis dikongsi dengan aplikasi lain (#11042). |
| `OMNIROUTE_INTERNAL_SERVICE_TOKEN` | _(tidak ditetapkan — mekanisme dilumpuhkan)_ | `src/lib/api/internalServiceAuth.ts` | Rahsia bersama untuk lompatan REST dalaman yang mengekalkan identiti (#9260): komponen OmniRoute yang memanggil laluan OmniRoute tempatan lain menghantarnya sebagai `x-omniroute-internal-service-token` supaya identiti pemanggil asal dikekalkan. Dibandingkan dengan `timingSafeEqual`. |
| `OMNIROUTE_INTERNAL_SERVICE_TOKEN_FILE` | _(tidak ditetapkan)_ | `src/lib/api/internalServiceAuth.ts` | Varian fail rahsia bagi token perkhidmatan dalaman: laluan ke fail yang kandungan terpangkasnya ialah token tersebut. Hanya dirujuk apabila pemboleh ubah sebaris tidak ditetapkan. |
| `OPENROUTER_PROVIDER_STATS_ENABLED` | `true` | `src/lib/catalog/openrouterProviderStats.ts` | Memperkayakan senarai penyedia papan pemuka dengan statistik kedudukan mingguan OpenRouter (#9324). Aktif secara lalai; tetapkan `false` untuk melangkau pengambilan latar belakang sepenuhnya (tidak menyekat, tidak sekali-kali fatal). |
| `OPENROUTER_PROVIDER_STATS_TTL_MS` | `86400000` (24 jam) | `src/lib/catalog/openrouterProviderStats.ts` | TTL cache untuk snapshot statistik penyedia OpenRouter, dalam milisaat. |
| `OMNIROUTE_REDIS_IMAGE` | `redis:7-alpine` | `bin/cli/commands/redis.mjs` | Imej Redis yang digunakan oleh pelancar Redis 1-klik. Gantikan kepada `redis:8-alpine` atau cermin registri persendirian mengikut keperluan. |
| `QDRANT_HOST` | `qdrant` | _(profil kluster pilih-sertai)_ | Nama hos bagi sidecar Qdrant apabila `--profile memory` aktif. Lalai menunjuk kepada nama perkhidmatan qdrant dalam rangkaian; gantikan untuk penggunaan luaran. Hanya digunakan apabila `qdrantEnabled` adalah `true` dalam kod (`src/lib/memory/vectorStore.ts:108`). |
| `QDRANT_PORT` | `6333` | _(profil kluster pilih-sertai)_ | Port REST bagi sidecar Qdrant. |
| `QDRANT_GRPC_PORT` | `6334` | _(profil kluster pilih-sertai)_ | Port gRPC bagi sidecar Qdrant. Digunakan oleh pustaka klien yang mengutamakan gRPC berbanding REST untuk operasi penstriman. |
| `QDRANT_API_KEY` | _(tidak ditetapkan)_ | _(profil kluster pilih-sertai)_ | Kunci API pilihan untuk Qdrant Cloud atau instans on-prem yang disahkan. Kosong → tiada pengepala `api-key` dihantar. |
| `QDRANT_COLLECTION` | `omniroute-memory` | _(profil kluster pilih-sertai)_ | Nama koleksi untuk embeddings memori perbualan OmniRoute. Dicipta pada pelaksanaan pertama dengan dimensi `QDRANT_VECTOR_SIZE`. |
| `QDRANT_EMBEDDING_MODEL` | `text-embedding-3-small` | _(profil kluster pilih-sertai)_ | Nama model embedding lalai yang direkodkan dalam metadata koleksi Qdrant. Embeddings sebenar dijana oleh mana-mana penyedia yang ditunjuk oleh medan `embeddingModel` dalam tetapan OmniRoute. |
| `QDRANT_VECTOR_SIZE` | `1536` | _(profil kluster pilihan)_ | Dimensi vektor embedding. Mesti sepadan dengan model yang anda gunakan untuk embedding (text-embedding-3-small → 1536; ada-002 → 1536; nomic-embed-text → 768). |
| `QDRANT_HNSW_EF_CONSTRUCT` | `128` | _(profil kluster pilihan)_ | Ketepatan masa pembinaan indeks HNSW. Lebih tinggi = binaan lebih perlahan, carian lebih pantas. |
| `OMNIROUTE_ROTATION_ENABLED` | `true` | `open-sse/services/rotationConfig.ts` | Suis utama untuk penggiliran akaun yang boleh dikonfigurasi oleh operator. Apabila `false`, tiada kelas `OMNIROUTE_ROTATE_*` di bawah yang mencetuskan sandaran akaun (keadaan suis-utama-mati juga menyekat kelas 429/500/502 yang didayakan secara lalai). Membolehkan front-end penyelia (cth. aplikasi desktop VibeProxy) mencerminkan peraturan penggilirannya sendiri pada enjin sandaran akaun backend. |
| `OMNIROUTE_ROTATION_RATE_LIMIT_RESET_SECONDS` | `0` | `open-sse/services/rotationConfig.ts` | Tempoh bertenang (saat) yang dikenakan pada akaun yang dihadkan kadar apabila pihak hulu tidak memberikan petunjuk tetapan semula yang jelas. `0` = gunakan tempoh bertenang lalai enjin dan bukannya penggantian tetap. |
| `OMNIROUTE_ROTATION_DISABLE_TAG_WITHOUT_RESET` | `true` | `open-sse/services/rotationConfig.ts` | Cerminan keutamaan front-end "jangan tag sebagai dihadkan kadar tanpa masa tetapan semula". |
| `OMNIROUTE_ROTATE_ON_429` | `true` | `open-sse/services/rotationConfig.ts` | Pengaktifan sandaran mengikut status untuk ralat `429`. Apabila `false` (dan `OMNIROUTE_ROTATION_ENABLED=true`), ralat `429` tidak lagi mencetuskan penggiliran akaun dan sebaliknya dikembalikan kepada klien. |
| `OMNIROUTE_ROTATE_429_THRESHOLD` | `1` | `open-sse/services/rotationConfig.ts` | Bilangan ralat `429` dalam tempoh `OMNIROUTE_ROTATE_429_WINDOW_SECONDS` yang diperlukan sebelum akaun digilirkan. `1` (lalai) menggilir dengan serta-merta, mengekalkan tingkah laku terdahulu. |
| `OMNIROUTE_ROTATE_429_WINDOW_SECONDS` | `120` | `open-sse/services/rotationConfig.ts` | Tetingkap gelangsar (saat) di mana ralat `429` dikira terhadap `OMNIROUTE_ROTATE_429_THRESHOLD`. |
| `OMNIROUTE_ROTATE_ON_500` | `true` | `open-sse/services/rotationConfig.ts` | Pengaktifan sandaran mengikut status untuk ralat pelayan `5xx` (tidak termasuk `502`, yang mempunyai kelasnya sendiri). Apabila `false`, ralat ini tidak lagi mencetuskan penggiliran akaun. |
| `OMNIROUTE_ROTATE_500_THRESHOLD` | `1` | `open-sse/services/rotationConfig.ts` | Bilangan ralat `5xx` dalam tempoh `OMNIROUTE_ROTATE_500_WINDOW_SECONDS` yang diperlukan sebelum akaun digilirkan. `1` (lalai) menggilir dengan serta-merta. |
| `OMNIROUTE_ROTATE_500_WINDOW_SECONDS` | `120` | `open-sse/services/rotationConfig.ts` | Tetingkap gelongsor (saat) di mana ralat `5xx` dikira terhadap `OMNIROUTE_ROTATE_500_THRESHOLD`. |
| `OMNIROUTE_ROTATE_ON_502` | `true` | `open-sse/services/rotationConfig.ts` | Pengaktifan fallback mengikut status untuk ralat `502` (bad gateway). Apabila `false`, ralat `502` tidak lagi mencetuskan penggiliran akaun. |
| `OMNIROUTE_ROTATE_502_THRESHOLD` | `1` | `open-sse/services/rotationConfig.ts` | Bilangan ralat `502` dalam `OMNIROUTE_ROTATE_502_WINDOW_SECONDS` yang diperlukan sebelum akaun digilirkan. `1` (lalai) menggilir serta-merta. |
| `OMNIROUTE_ROTATE_502_WINDOW_SECONDS` | `120` | `open-sse/services/rotationConfig.ts` | Tetingkap gelongsor (saat) di mana ralat `502` dikira terhadap `OMNIROUTE_ROTATE_502_THRESHOLD`. |
| `OMNIROUTE_ROTATE_ON_400` | `false` | `open-sse/services/rotationConfig.ts` | Pilihan sertai (lalai MATI): apabila `true`, ralat `400` (bad request) biasa juga mencetuskan penggiliran akaun. Ini bersifat tambahan sahaja — ia tidak pernah menghalang tingkah laku sedia ada enjin di mana `400` yang membawa teks had kadar/kuota masih menyebabkan pertukaran tanpa mengira bendera ini. |
| `OMNIROUTE_ROTATE_400_THRESHOLD` | `1` | `open-sse/services/rotationConfig.ts` | Bilangan ralat `400` dalam `OMNIROUTE_ROTATE_400_WINDOW_SECONDS` yang diperlukan sebelum akaun digilirkan (hanya dirujuk apabila `OMNIROUTE_ROTATE_ON_400=true`). |
| `OMNIROUTE_ROTATE_400_WINDOW_SECONDS` | `120` | `open-sse/services/rotationConfig.ts` | Tetingkap gelongsor (saat) di mana ralat `400` dikira terhadap `OMNIROUTE_ROTATE_400_THRESHOLD`. |
### Penjadual Pemanasan Claude
Pemanasan berpandukan cron untuk sambungan Anthropic OAuth yang memilih untuk menyertai, supaya tetingkap had kadar 5 jam dibuka oleh permintaan berjadual yang remeh dan bukannya oleh permintaan sebenar yang pertama (#8848). Penjadual dimatikan melainkan `OMNIROUTE_WARMUP_ENABLED` adalah benar **dan** sambungan ditandakan dalam `settings.claudeWarmup.connections`; senarai sambungan yang kosong bermakna tiada apa yang dipanaskan walaupun pembolehubah env diaktifkan.
| Pembolehubah | Lalai | Fail Sumber | Penerangan |
| ------------------------------ | --------------------------- | ---------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `OMNIROUTE_WARMUP_ENABLED` | _(tidak ditetapkan → mati)_ | `src/lib/warmupScheduler.ts` | Suis utama untuk penjadual pemanasan. Menerima `1`/`true`/`yes`/`on` (tidak sensitif huruf besar/kecil, dipangkas). Sebarang nilai lain, atau tidak ditetapkan, membiarkan penjadual dimatikan. |
| `OMNIROUTE_WARMUP_CRON` | `0 7 * * *` | `src/lib/warmupScheduler.ts` | Ungkapan cron lima medan untuk tik pemanasan, dinilai dalam `America/Los_Angeles` (zon masa tetapan semula Anthropic) tanpa mengira jam hos. |
| `OMNIROUTE_WARMUP_CONCURRENCY` | `3` | `src/lib/warmupScheduler.ts` | Bilangan sambungan yang dipanaskan secara selari setiap tik. Diapit kepada `1`-`10`; nilai bukan numerik akan kembali kepada `3`. |
| `OMNIROUTE_WARMUP_MODEL` | `claude-3-5-haiku-20241022` | `src/lib/warmupScheduler.ts` | Model yang digunakan untuk permintaan pemanasan. Gantikan hanya jika lalai tidak tersedia pada pelan anda; pilih model termurah yang masih membuka tetingkap. |
### Sesi VNC Log Masuk Pelayar & Alias Data-Dir
Chromium+VNC terbekas digunakan untuk pengambilan kelayakan log masuk pelayar interaktif (`/api/vnc-session`), berserta alias `DATA_DIR` warisan. Semuanya pilihan — lalai VNC menyasarkan imej terbunda `omniroute-vnc-chromium:local` dan hanya digantikan untuk imej kontena tersuai, port, atau penalaan kitar hayat.
| Pembolehubah | Lalai | Fail Sumber | Penerangan |
| ------------------------------------- | ------------------------------------------------------------------------ | ------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `OMNIROUTE_VNC_IMAGE` | `omniroute-vnc-chromium:local` | `src/lib/vncSession/manifest.ts` | Tag imej Docker untuk kontena log masuk Chromium+VNC. Bina `docker/vnc-browser/chromium` atau halakan ini kepada imej tersuai. |
| `OMNIROUTE_DOCKER_BIN` | `docker` | `src/lib/vncSession/manifest.ts` | Binari masa jalan kontena yang digunakan untuk melancarkan kontena VNC (cth. tetapkan kepada `podman`). |
| `OMNIROUTE_VNC_CONTAINER_VNC_PORT` | `3000` | `src/lib/vncSession/manifest.ts` | Port VNC/noVNC yang didedahkan di dalam kontena. |
| `OMNIROUTE_VNC_CONTAINER_CDP_PORT` | `9223` | `src/lib/vncSession/manifest.ts` | Port Chrome DevTools Protocol di dalam kontena. |
| `OMNIROUTE_VNC_CONTAINER_PROFILE_DIR` | `/config` | `src/lib/vncSession/manifest.ts` | Laluan direktori profil Chromium di dalam kontena. |
| `OMNIROUTE_VNC_PROFILE_DIR` | `$HOME/.omniroute/browser-login-profiles` | `src/lib/vncSession/manifest.ts` | Direktori hos yang menyimpan profil log masuk pelayar berterusan. |
| `OMNIROUTE_VNC_IDLE_MS` | `600000` (10 minit) | `src/lib/vncSession/manifest.ts` | Tamat masa melahu (ms) sebelum sesi VNC tidak aktif dibuang. |
| `OMNIROUTE_VNC_MAX_MS` | `1800000` (30 minit) | `src/lib/vncSession/manifest.ts` | Had tetap (ms) pada jangka hayat satu sesi VNC. |
| `OMNIROUTE_VNC_MAX_SESSIONS` | `4` | `src/lib/vncSession/manifest.ts` | Bilangan maksimum sesi VNC serentak. |
| `OMNIROUTE_VNC_READY_MS` | `45000` | `src/lib/vncSession/manifest.ts` | Tamat masa (ms) menunggu pelayar terbekas menjadi sedia CDP. |
| `OMNIROUTE_VNC_HARVEST_MS` | `20000` | `src/lib/vncSession/manifest.ts` | Tamat masa (ms) untuk mengutip sesi/kuki yang diambil selepas log masuk selesai. |
| `OMNIROUTE_VNC_CHROMIUM_ARGS` | `--remote-debugging-port=9222 --no-first-run --no-default-browser-check` | `src/lib/vncSession/manifest.ts` | Bendera baris perintah tambahan yang dihantar kepada Chromium terbekas. |
| `OMNIROUTE_VNC_NETWORK` | `omniroute-vnc-browser-login` | `src/lib/vncSession/manifest.ts` | Rangkaian Docker khusus yang disertai oleh kontena log masuk VNC (#12571) dan bukannya jambatan lalai, supaya kontena sebelah tidak dapat mencapai port jambatan CDP-nya. |
| `VIBEPROXY_DATA_DIR` | _(tidak ditetapkan)_ | `open-sse/services/notionThreadSessions.ts` | **Alias warisan** untuk `DATA_DIR`, disemak hanya selepas kedua-dua `DATA_DIR` dan `OMNIROUTE_DATA_DIR` tidak ditetapkan. Mengesan cache sesi thread web Notion (`/notion-web-thread-sessions.json`). |
---
## 26. Harness Ujian & E2E
Digunakan oleh `scripts/dev/run-next-playwright.mjs`, `scripts/dev/smoke-electron-packaged.mjs`,
`scripts/dev/run-ecosystem-tests.mjs`, dan `scripts/build/uninstall.mjs`. Biarkan setiap
nilai di bawah tidak ditetapkan dalam deployment produksi.
| Pembolehubah | Lalai | Fail Sumber | Penerangan |
| -------------------------------------- | --------------------------------- | ----------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `OMNIROUTE_E2E_BOOTSTRAP_MODE` | `auth` | `scripts/dev/run-next-playwright.mjs` | Mod bootstrap E2E (`auth`, `fresh`, `reuse`) untuk pelari Playwright. |
| `OMNIROUTE_E2E_PASSWORD` | beralih kepada `INITIAL_PASSWORD` | `scripts/dev/run-next-playwright.mjs` | Kata laluan pentadbir yang disuntik ke dalam persekitaran Playwright. |
| `OMNIROUTE_DISABLE_LOCAL_HEALTHCHECK` | `true` | `scripts/dev/run-next-playwright.mjs` | Nyahdayakan undian pemeriksaan kesihatan setempat semasa larian Playwright. |
| `OMNIROUTE_DISABLE_TOKEN_HEALTHCHECK` | `true` | `scripts/dev/run-next-playwright.mjs` | Nyahdayakan gelung pemeriksaan kesihatan token OAuth semasa ujian. |
| `OMNIROUTE_HEALTHCHECK_SKIP_PROVIDERS` | _(tidak ditetapkan)_ | `src/lib/tokenHealthCheck.ts` | Senarai penyedia berpisah koma yang dikecualikan daripada sapuan penyegaran token proaktif (cth. `codex,openai`). Alternatif bersasaran kepada menyahdayakan pemeriksaan kesihatan sepenuhnya — penyedia TTL pendek terus menyegarkan manakala penyedia cascade kekal reaktif sahaja. |
| `OMNIROUTE_HIDE_HEALTHCHECK_LOGS` | `true` | `scripts/dev/run-next-playwright.mjs` | Senyapkan hingar pemeriksaan kesihatan dalam stdout Playwright. |
| `OMNIROUTE_PLAYWRIGHT_SKIP_BUILD` | `0` | `scripts/dev/run-next-playwright.mjs` | Langkau binaan produksi Next.js sebelum Playwright bermula (pengoptimuman CI). |
| `OMNIROUTE_SKIP_UNINSTALL_HOOK` | `0` | `scripts/build/uninstall.mjs` | Langkau cangkuk nyahpasang OmniRoute (digunakan oleh CI untuk memastikan `node_modules` kekal utuh). |
| `ECOSYSTEM_SERVER_WAIT_MS` | `180000` | `scripts/dev/run-ecosystem-tests.mjs` | Masa menunggu (ms) untuk pelayan menjadi sihat sebelum menjalankan ujian ekosistem/protokol. |
| `ELECTRON_SMOKE_URL` | `http://127.0.0.1:20128/login` | `scripts/dev/smoke-electron-packaged.mjs` | URL yang dijangkakan oleh harness asap Electron untuk disajikan oleh aplikasi berbungkus. |
| `ELECTRON_SMOKE_TIMEOUT_MS` | `45000` | `scripts/dev/smoke-electron-packaged.mjs` | Jumlah tamat masa (ms) sebelum harness asap berhenti mencuba. |
| `ELECTRON_SMOKE_SETTLE_MS` | `2000` | `scripts/dev/smoke-electron-packaged.mjs` | Tetingkap penstabilan (ms) selepas halaman dimuatkan. |
| `ELECTRON_SMOKE_APP_EXECUTABLE` | _(automatik)_ | `scripts/dev/smoke-electron-packaged.mjs` | Laluan eksplisit kepada fail boleh laksana Electron berbungkus. |
| `ELECTRON_SMOKE_DATA_DIR` | _(direktori sementara)_ | `scripts/dev/smoke-electron-packaged.mjs` | Direktori data untuk larian asap Electron. |
| `ELECTRON_SMOKE_KEEP_DATA` | `0` | `scripts/dev/smoke-electron-packaged.mjs` | Tetapkan `1` untuk mengekalkan direktori data smoke selepas pelaksanaan. |
| `ELECTRON_SMOKE_STREAM_LOGS` | `0` | `scripts/dev/smoke-electron-packaged.mjs` | Tetapkan `1` untuk menstrim log Electron ke stdout semasa pelaksanaan. |
| `ELECTRON_SMOKE_COLD_RESTART` | `0` | `scripts/dev/smoke-electron-packaged.mjs` | #7592: lancar semula terhadap direktori data yang sama dan sahkan pelancaran kedua memilih pemacu SQLite asli. |
| `CLI_DEVIN_BIN` | _(carian PATH)_ | `open-sse/executors/devin-cli.ts` | Gantikan laluan binari Devin CLI. |
### Saluran paip terjemahan dokumentasi
Digunakan oleh `scripts/i18n/run-translation.mjs` (perintah `npm run i18n:run`).
Kesemua enam pembolehubah tidak ditetapkan secara lalai — tetapkannya dalam `.env` hanya pada mesin
yang sepatutnya dapat menjalankan penterjemah dokumentasi.
| Pembolehubah | Lalai | Fail Sumber | Penerangan |
| ---------------------------------------- | -------------------- | ---------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| `OMNIROUTE_TRANSLATION_API_URL` | _(tidak ditetapkan)_ | `scripts/i18n/run-translation.mjs` | URL asas serasi OpenAI untuk backend terjemahan. |
| `OMNIROUTE_TRANSLATION_API_KEY` | _(tidak ditetapkan)_ | `scripts/i18n/run-translation.mjs` | Token Bearer untuk backend terjemahan (tidak pernah dilogkan). |
| `OMNIROUTE_TRANSLATION_MODEL` | _(tidak ditetapkan)_ | `scripts/i18n/run-translation.mjs` | ID model, cth. `gpt-4o-mini` atau `cx/gpt-5.4-mini`. |
| `OMNIROUTE_TRANSLATION_FALLBACK_MODELS` | _(tidak ditetapkan)_ | `scripts/i18n/lib/translate-backend.mjs` | Rantaian model pilihan dipisahkan koma yang dicuba mengikut susunan apabila model utama gagal (kuota 429, 401/402, 5xx, tamat masa, rangkaian); permintaan cacat (400/413/422) tidak dicuba semula di tempat lain. |
| `OMNIROUTE_TRANSLATION_TIMEOUT_MS` | `60000` | `scripts/i18n/run-translation.mjs` | Tamat masa setiap permintaan dalam milisaat. |
| `OMNIROUTE_TRANSLATION_REASONING_EFFORT` | _(tidak ditetapkan)_ | `scripts/i18n/lib/translate-backend.mjs` | Kawalan penaakulan pilihan, dihantar seadanya ke backend apabila ditetapkan. |
| `OMNIROUTE_TRANSLATION_CONCURRENCY` | `4` | `scripts/i18n/run-translation.mjs` | Permintaan terjemahan selari apabila dijalankan merentasi berbilang fail / lokal. |
---
## 27. Suapan Radar (Pengehosan Sendiri)
Tambahan pilihan yang dikawal oleh bendera ciri RADAR_ENABLED (dimatikan secara lalai — bendera ciri
yang ditogol melalui Tetapan/DB, bukan pemboleh ubah persekitaran; lihat
[docs/frameworks/RADAR.md](../frameworks/RADAR.md#flag-radar_enabled-default-off)).
Empat pemboleh ubah pertama di bawah ialah penggantian pilihan untuk suapan yang dihoskan sendiri atau dicabang serta
aliran kunci penyokong. Yang kelima, `RADAR_ADMIN_URL`, ialah pautan berasingan tanpa nilai lalai ke panel
operasi peribadi pemilik. Lihat [docs/frameworks/RADAR.md](../frameworks/RADAR.md) untuk dokumentasi
modul penuh dan
[urutan pengaktifan hujung ke hujung serta persediaan berpandu](../frameworks/RADAR.md#end-to-end-activation-and-guided-setup).
Pembaca pengumuman umum Laman Utama/Log Perubahan tidak dikonfigurasikan melalui pemboleh ubah
persekitaran dan tidak bergantung pada bendera ciri RADAR_ENABLED. Ia membaca URL `news.json`
repositori awam yang diisytiharkan dalam `src/shared/utils/releaseNotes.ts` menggunakan
GET sahaja; ID penolakan kekal dalam storan setempat pelayar.
| Pemboleh Ubah | Lalai | Fail Sumber | Penerangan |
| ----------------------------- | -------------------------------------------- | ------------------------------------------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `RADAR_FEED_URL` | `https://radar.omniroute.online` | `src/lib/radar/{sync,referralsSync,offersSync,intelSync}.ts` | URL asas yang dikongsi oleh suapan katalog, rujukan, tawaran penyokong dan Intel yang ditandatangani secara berasingan. Gantikan untuk menghalakannya ke perkhidmatan yang dihoskan sendiri atau dicabang. |
| `RADAR_FEED_PUBKEY` | _(kunci lalai yang disematkan)_ | `src/lib/radar/pinnedKeys.ts` | Kunci awam Ed25519 (SPKI DER base64 atau PEM) yang digunakan untuk mengesahkan tandatangan suapan daripada suapan tersuai. |
| `RADAR_CONTRIBUTOR_CLAIM_URL` | `https://radar.omniroute.online/auth/github` | `src/lib/radar/links.ts` | URL yang dibuka oleh butang papan pemuka "Saya seorang penyumbang" (aliran tuntutan kunci penyokong GitHub OAuth). |
| `RADAR_SUPPORTER_PLANS_URL` | `https://radar.omniroute.online/planos` | `src/lib/radar/links.ts` | URL yang dibuka oleh butang papan pemuka "Sokong projek" (halaman pembayaran/pelan). |
| `RADAR_ADMIN_URL` | _(tidak ditetapkan)_ | `src/lib/radar/links.ts` | Pautan panel operasi peribadi untuk pemilik sahaja. HTTPS diperlukan kecuali bagi pemajuan SSH gelung balik HTTP; nilai yang tidak ditetapkan atau tidak sah tidak menghasilkan item navigasi. |
---
## Audit: Pemboleh Ubah yang Dialih Keluar / Tidak Digunakan
Pemboleh ubah berikut muncul dalam versi terdahulu `.env.example` tetapi **tidak mempunyai rujukan masa jalan** dalam pangkalan kod semasa. Pemboleh ubah tersebut telah dialih keluar:
| Pemboleh Ubah | Sebab |
| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `STORAGE_DRIVER=sqlite` | Tidak pernah dibaca oleh mana-mana fail sumber. SQLite ialah satu-satunya pemacu yang disokong — tiada pemilihan diperlukan. |
| `INSTANCE_NAME=omniroute` | Terdapat dalam dokumentasi/templat env lama tetapi tidak digunakan semasa masa jalan. Mungkin kembali dalam ciri berbilang tika pada masa hadapan. |
| `SQLITE_MAX_SIZE_MB=2048` | Tidak dirujuk dalam kod sumber. Saiz pangkalan data tidak dihadkan secara buatan. |
| `SQLITE_CLEAN_LEGACY_FILES=true` | Tidak dirujuk dalam kod sumber. Pembersihan legasi berkemungkinan telah dialih keluar. |
| `CLI_ROO_BIN` | Tidak didaftarkan dalam `src/shared/services/cliRuntime.ts`. |
| `CLI_KIMI_CODING_BIN` | Tidak didaftarkan dalam `src/shared/services/cliRuntime.ts` (Kimi Coding menggunakan OAuth, bukan binari CLI). |
| `IFLOW_OAUTH_CLIENT_ID` / `IFLOW_OAUTH_CLIENT_SECRET` | Tidak dirujuk di mana-mana dalam kod sumber. |
| `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` | Dialih keluar dalam v3.8.0. Masa jalan tidak lagi membaca pemboleh ubah env ini — bukti kelayakan diperoleh daripada Papan Pemuka / `data/provider-credentials.json` / DB disulitkan. |
| `CURSOR_PROTOBUF_DEBUG` | Dialih keluar dalam v3.8.0. Pelaksana Cursor menggunakan `CURSOR_DEBUG` / `CURSOR_STREAM_DEBUG` (lihat §22). |
| `CLI_COMPAT_KIRO` | Dialih keluar dalam v3.8.0. Kiro berada dalam `CLI_COMPAT_OMITTED_PROVIDER_IDS` — togolnya tidak memberikan sebarang kesan. |
| `QIANFAN_API_KEY` | Dialih keluar bersama-sama stub kunci API penyedia lain yang tidak digunakan dalam v3.8.0. |
### Pembetulan Nilai Lalai
| Pemboleh Ubah | Nilai `.env.example` Lama | Lalai Kod Sebenar | Dibetulkan |
| ------------------------- | ------------------------- | ----------------- | ---------------------------------------------------------------------------------- |
| `APP_LOG_RETENTION_DAYS` | `90` | `7` | ✅ Nilai yang mengelirukan dialih keluar; `7` didokumentasikan sebagai nilai lalai |
| `CALL_LOG_RETENTION_DAYS` | `90` | `7` | ✅ Nilai yang mengelirukan dialih keluar; `7` didokumentasikan sebagai nilai lalai |
### Penjanaan semula konfigurasi OpenCode (alat ad hoc)
Digunakan oleh `scripts/ad-hoc/regen-opencode-config.ts` untuk menjana semula `opencode.json`
dengan nilai `limit.context` dan `limit.output` yang tepat, yang diambil daripada tika
OmniRoute yang sedang berjalan. Tiada satu pun daripada ini diperlukan untuk operasi biasa — skrip ini
hanyalah alat pembangun.
| Pemboleh Ubah | Lalai | Fail Sumber | Penerangan |
| ------------------ | ------------------------ | ----------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------- |
| `OMNIROUTE_URL` | `http://localhost:20128` | `scripts/ad-hoc/regen-opencode-config.ts` | URL asas bagi tika OmniRoute yang akan ditanya untuk `/v1/models`. |
| `OMNIROUTE_KEY` | _(tidak ditetapkan)_ | `scripts/ad-hoc/regen-opencode-config.ts` | Kunci API untuk mengesahkan identiti terhadap titik akhir OmniRoute `/v1/models`. Menggunakan `OPENCODE_API_KEY` jika tidak ditetapkan. |
| `OPENCODE_API_KEY` | _(tidak ditetapkan)_ | `scripts/ad-hoc/regen-opencode-config.ts` | Kunci API gaya OpenCode (`sk-...`) yang ditulis ke dalam `opencode.json` yang dijana semula. Menggunakan `OMNIROUTE_KEY` jika tidak ditetapkan. |
### Abah-abah penilaian luar talian pemampatan (alatan ad hoc)
Digunakan oleh `scripts/compression-eval/index.ts`, CLI penilaian pemampatan luar talian.
Tidak diperlukan untuk operasi biasa — untuk alatan pembangun sahaja.
| Pemboleh Ubah | Lalai | Fail Sumber | Penerangan |
| ---------------------------- | ------------- | ----------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `OMNIROUTE_EVAL_CREDENTIALS` | `{}` (kosong) | `scripts/compression-eval/index.ts` | Bukti kelayakan JSON yang dibekalkan oleh pengendali untuk penyedia yang diuji oleh CLI penilaian pemampatan luar talian (dihurai dengan `JSON.parse`). Biarkan tidak ditetapkan untuk percubaan kering. |
### Sesi Pelayar VNC
Digunakan oleh `src/lib/vncSession/manifest.ts` untuk mengkonfigurasi sesi Chromium tanpa kepala berasaskan Docker bagi penyedia automasi pelayar. Semuanya pilihan — nilai lalai ditunjukkan di bawah.
| Pemboleh Ubah | Lalai | Fail Sumber | Penerangan |
| ------------------------------------- | ------------------------------ | ------------------------------------------- | ---------------------------------------------------------------------------------- |
| `OMNIROUTE_DOCKER_BIN` | `docker` | `src/lib/vncSession/manifest.ts` | Laluan ke perduaan Docker yang digunakan untuk mewujudkan bekas VNC. |
| `OMNIROUTE_VNC_IMAGE` | `omniroute-vnc-chromium:local` | `src/lib/vncSession/manifest.ts` | Imej Docker untuk bekas VNC Chromium. |
| `OMNIROUTE_VNC_CHROMIUM_ARGS` | _(bendera terbina dalam)_ | `src/lib/vncSession/manifest.ts` | Argumen CLI Chromium tambahan yang dihantar kepada pelayar di dalam bekas. |
| `OMNIROUTE_VNC_CONTAINER_VNC_PORT` | `3000` | `src/lib/vncSession/manifest.ts` | Port VNC di dalam bekas. |
| `OMNIROUTE_VNC_CONTAINER_CDP_PORT` | `9223` | `src/lib/vncSession/manifest.ts` | Port Chrome DevTools Protocol di dalam bekas. |
| `OMNIROUTE_VNC_CONTAINER_PROFILE_DIR` | `/config` | `src/lib/vncSession/manifest.ts` | Direktori profil di dalam bekas. |
| `OMNIROUTE_VNC_PROFILE_DIR` | _(tidak ditetapkan)_ | `src/lib/vncSession/manifest.ts` | Direktori pada hos untuk profil pelayar berterusan. |
| `OMNIROUTE_VNC_IDLE_MS` | `600000` | `src/lib/vncSession/manifest.ts` | Tempoh tamat melahu (ms) sebelum sesi VNC dikutip. |
| `OMNIROUTE_VNC_MAX_MS` | `1800000` | `src/lib/vncSession/manifest.ts` | Tempoh sesi maksimum (ms). |
| `OMNIROUTE_VNC_MAX_SESSIONS` | `4` | `src/lib/vncSession/manifest.ts` | Bilangan maksimum sesi VNC serentak. |
| `OMNIROUTE_VNC_READY_MS` | `45000` | `src/lib/vncSession/manifest.ts` | Tempoh tamat kesediaan pelayar (ms). |
| `OMNIROUTE_VNC_HARVEST_MS` | `20000` | `src/lib/vncSession/manifest.ts` | Tempoh tamat pengutipan/pembersihan (ms). |
| `OMNIROUTE_VNC_NETWORK` | `omniroute-vnc-browser-login` | `src/lib/vncSession/manifest.ts` | Rangkaian Docker khusus yang disertai oleh bekas (#12571), di luar jambatan lalai. |
| `VIBEPROXY_DATA_DIR` | _(tidak ditetapkan)_ | `open-sse/services/notionThreadSessions.ts` | Direktori untuk pengekalan sesi urutan Notion. |
### Pengesahan perkhidmatan dalaman
| Pemboleh Ubah | Lalai | Penerangan |
| --------------------------------------- | ----- | --------------------------------------------------------------------------------------------------------------------- |
| `OMNIROUTE_INTERNAL_SERVICE_TOKEN` | – | Token sebaris untuk pengesahan perkhidmatan-ke-perkhidmatan satah pengurusan. |
| `OMNIROUTE_INTERNAL_SERVICE_TOKEN_FILE` | – | Laluan ke fail yang mengandungi token perkhidmatan dalaman (diutamakan dalam bekas; mengatasi pemboleh ubah sebaris). |
### Statistik penyedia OpenRouter
| Pemboleh Ubah | Lalai | Penerangan |
| ----------------------------------- | --------- | ---------------------------------------------------------------------------------------------------------------- |
| `OPENROUTER_PROVIDER_STATS_ENABLED` | `true` | Tetapkan kepada `false` untuk melangkau pengambilan statistik setiap penyedia OpenRouter bagi pengayaan katalog. |
| `OPENROUTER_PROVIDER_STATS_TTL_MS` | `3600000` | TTL cache (ms) untuk statistik penyedia OpenRouter yang diambil. |
### Pengikatan Redis terbenam
| Pemboleh Ubah | Lalai | Penerangan |
| --------------------------- | ----------- | -------------------------------------------------------------------- |
| `REDIS_BIND_HOST` | `127.0.0.1` | Alamat pengikatan untuk perkhidmatan Redis terbenam. |
| `REDIS_PORT` | `6379` | Port untuk perkhidmatan Redis terbenam. |
| `OMNIROUTE_REDIS_BIND_HOST` | – | Penggantian khusus OmniRoute untuk alamat pengikatan Redis terbenam. |
---
## 24. Tambahan keluaran v3.8.50
Tetapan ini diperkenalkan selepas petikan kontrak persekitaran sebelumnya.
| Pembolehubah | Lalai | Fail Sumber | Penerangan |
| ------------------------------------------- | -------------------------- | ---------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| `OMNIROUTE_CHAT_ADMISSION_QUEUE_MS` | `2000` | `src/shared/middleware/chatBodyAdmission.ts` | Tempoh menunggu maksimum untuk slot kemasukan sembang berat sebelum `503` yang boleh dicuba semula; tempoh menunggu singkat yang terbatas menyusun letusan ejen secara bersiri dan bukannya `503` serta-merta. `0` mengembalikan penolakan segera. |
| `OMNIROUTE_CHAT_ADMISSION_MAX_QUEUED_BYTES` | `4194304` (4 MB) | `src/shared/middleware/chatBodyAdmission.ts` | Belanjawan bait beratur untuk tempoh menunggu kemasukan: mengehadkan jumlah bait badan tertimbal yang diletakkan di seluruh proses supaya tempoh menunggu tidak dapat menggandakan heap (#4380). Tempoh menunggu yang melebihi belanjawan menerima `503` yang boleh dicuba semula dengan serta-merta. |
| `OMNIROUTE_CHAT_VIRTUAL_TTL_MS` | `60000` (60 s) | `src/shared/middleware/chatBodyAdmission.ts` | no-op lapuk sejak #10110: lorong kemasukan setiap sesi telah dialih keluar memihak kepada satu belanjawan di seluruh proses. Diterima untuk keserasian konfigurasi; diabaikan. |
| `OMNIROUTE_CHAT_VIRTUAL_MAX_SESSIONS` | `64` | `src/shared/middleware/chatBodyAdmission.ts` | no-op lapuk sejak #10110: lorong kemasukan setiap sesi telah dialih keluar memihak kepada satu belanjawan di seluruh proses. Diterima untuk keserasian konfigurasi; diabaikan. |
| `OMNIROUTE_CHAT_VIRTUAL_LANES` | `0` (mati) | `open-sse/services/admission/runtime.ts` | Lorong kemasukan maya masa jalan adaptif (#9654): suis utama untuk pintu adaptif setiap penyewa (sistem 2). Berbeza daripada pembolehubah lorong setiap sambungan yang lapuk di atas (TTL_MS / MAX_SESSIONS, no-op sejak #10110). Bendera ciri Papan Pemuka dengan nama yang sama; pembolehubah persekitaran mengatasi penggantian papan pemuka; memerlukan mula semula. |
| `OMNIROUTE_RUNNOW_TIMEOUT_MS` | `30000` | `src/app/api/jobs/[id]/run-now/route.ts` | Mengehadkan tempoh panggilan run-now menunggu kerja yang sedang berjalan sebelum memulakan larian beratur. |
| `ADOBE_FIREFLY_BROWSER_REFRESH` | didayakan | `open-sse/services/adobeFireflySession.ts` | Memastikan keadaan IMS dan risiko pelayar kekal baharu melalui sesi Chrome CDP berskop akaun; tetapkan `0` untuk melumpuhkan. |
| `ADOBE_FIREFLY_SESSION_DISK` | didayakan | `open-sse/services/adobeFireflySession.ts` | Mengekalkan sesi Adobe yang telah dibaiki di bawah `DATA_DIR`; tetapkan `0` untuk keadaan dalam memori sahaja. |
| `ADOBE_FIREFLY_MIN_SUBMIT_GAP_MS` | `12000` | `open-sse/services/adobeFireflySession.ts` | Jarak minimum antara penghantaran janaan Adobe Firefly. |
| `ADOBE_FIREFLY_BATCH_EXTRA_GAP_MS` | `15000` | `open-sse/services/adobeFireflySession.ts` | Tempoh senyap tambahan selepas setiap penghantaran Adobe ketiga yang berjaya. |
| `ADOBE_FIREFLY_CHROME_HEADLESS` | `0` | `open-sse/services/adobeFireflyBrowserLogin.ts` | Mod true-headless untuk nyahpepijat sahaja; Adobe colligo biasanya menolak sesi risiko yang terhasil. |
| `CHROME_PATH` | dikesan automatik | `open-sse/executors/cloudflare-playground.ts`, `open-sse/executors/chatgpt-web-codex.ts` | Boleh laku Chrome mutlak pilihan yang digunakan oleh pelaksana pacuan pelayar apabila pengesanan automatik platform tidak mencukupi. |
| `TELEGRAM_BOT_TOKEN` | _(tidak ditetapkan)_ | `src/lib/telegram/config.ts` | Token BotFather yang mendayakan webhook masuk dan menandatangani `initData` Mini App. |
| `TELEGRAM_WEBHOOK_SECRET` | _(tidak ditetapkan)_ | `src/lib/telegram/config.ts` | Rahsia kongsi yang didaftarkan melalui `setWebhook` dan ditentusahkan terhadap pengepala `X-Telegram-Bot-Api-Secret-Token` pada setiap penyampaian webhook. Diperlukan untuk laluan webhook; jika tidak ditetapkan, penyampaian webhook ditolak dengan 503. |
| `TELEGRAM_DEFAULT_MODEL` | `auto/chat` | `src/lib/telegram/chatProxy.ts` | Model yang digunakan untuk balasan sembang Telegram. |
| `TELEGRAM_BOT_API_BASE` | `https://api.telegram.org` | `src/lib/telegram/config.ts` | Penggantian URL asas Bot API untuk proksi atau pelayan Bot API hos sendiri. |
| `TELEGRAM_WEBHOOK_TIMEOUT_MS` | `60000` | `src/lib/telegram/config.ts` | Tamat masa dalam milisaat untuk panggilan Bot API keluar. |
| `OMNIROUTE_OPTIONAL_PACK_TAR` | `1` (didayakan) | `scripts/build/optionalPackStaging.mjs` | Tetapkan `0` untuk melangkau pengeluaran tarball `.tar.gz` semasa menyusun pek ML/pelayar pilihan untuk pokok standalone Electron (direktori pek dan `optional-packs.index.json` masih dihasilkan). Digunakan oleh aliran kerja keluaran desktop untuk mengurangkan saiz muat naik artifak. |
| `GROK_SUBSCRIPTION_IMAGES_ENABLED` | `false` | `open-sse/config/imageRegistry.ts` | Mendayakan pendaftaran laluan imej langganan xAI; dilumpuhkan secara lalai supaya laluan imej kunci API kekal tidak berubah. |
| `OMNIROUTE_API_KEY_COOLDOWN_MS` | `60000` | `open-sse/services/apiKeyRotator.ts` | Penyejukan setiap kunci dalam milisaat apabila respons `429` tidak mempunyai petunjuk `Retry-After` yang boleh digunakan. |
| `OMNIROUTE_ESTIMATOR_CALIBRATION` | didayakan | `open-sse/services/estimatorCalibration.ts` | Tetapkan kepada `off`, `0`, atau `false` untuk melumpuhkan rakaman dan penggunaan penentukuran penganggar dalam memori. |
| `NEXT_MANUAL_SIG_HANDLE` | _(dalaman)_ | `scripts/dev/standalone-server-ws.mjs` | Penggantian pengendali isyarat pelayan standalone dalaman; biasanya ditetapkan dan dikosongkan oleh pelancar dan bukannya dikonfigurasikan oleh pengendali. |
### ChatGPT Web (Codex)
Lalai global untuk pelayar headless dan terowong alat keluar. Nilai sambungan yang ditetapkan dalam Papan Pemuka diutamakan.
| Pembolehubah | Lalai | Fail Sumber | Penerangan |
| --------------------------------------- | ------------------------------ | -------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `CHATGPT_WEB_CODEX_CHROME_PATH` | _(dikesan automatik)_ | `open-sse/executors/chatgpt-web-codex.ts` | Laluan Chrome/Chromium eksplisit untuk operasi npm, systemd dan PM2. |
| `CHROME_PATH` | _(dikesan automatik)_ | `open-sse/executors/chatgpt-web-codex.ts` | Fallback dikongsi untuk laluan Chrome/Chromium eksplisit. |
| `CHATGPT_WEB_CODEX_CDP_URL` | _(tidak ditetapkan)_ | `open-sse/executors/chatgpt-web-codex.ts` | Titik akhir CDP dalaman; Docker menggunakan sidecar pada port `9223`. |
| `CHATGPT_WEB_CODEX_USE_CDP_PROFILE` | _(tidak ditetapkan — mati)_ | `open-sse/vendor/codex-chatgpt-web/persistent-cdp-context.ts` | Tetapkan kepada `1` (dengan titik akhir CDP dikonfigurasikan) untuk menggunakan semula halaman ChatGPT sedia ada bagi profil pelayar yang diuruskan secara luaran dan telah log masuk, dan bukannya konteks terpencil bagi setiap pusingan; juga mengehadkan tab ChatGPT serentak kepada 1. Dimatikan secara lalai. Lihat [profil CDP berterusan](../guides/CHATGPT-WEB-PERSISTENT-CDP.md). |
| `CDP_PROXY_TOKEN` | _(tidak ditetapkan)_ | `docker/chatgpt-web-codex-browser/cdp-proxy.mjs` | Apabila ditetapkan, setiap permintaan kepada sidecar proksi CDP mesti menyertakan nilai ini dalam pengepala `X-Omni-Cdp-Token` (#13679). Tanpa nilai, proksi meneruskan tanpa pengesahan — maka hanya pengasingan rangkaian Compose `chatgpt-web-codex-net` yang melindungi. Jana dengan `openssl rand -hex 32`. |
| `CHATGPT_WEB_CODEX_TUNNEL_ID` | _(tidak ditetapkan)_ | `open-sse/executors/chatgpt-web-codex.ts` | ID terowong OpenAI global untuk pusingan alat Codex setempat. |
| `CHATGPT_WEB_CODEX_RUNTIME_KEY` | _(tidak ditetapkan)_ | `open-sse/executors/chatgpt-web-codex.ts` | Kunci runtime terowong global; jangan sekali-kali dipaparkan dalam log. |
| `CHATGPT_WEB_CODEX_CONNECTOR_NAME` | `OmniRoute Codex v2` | `open-sse/executors/chatgpt-web-codex.ts` | Nama tepat penyambung tersuai ChatGPT yang baru dicipta untuk jambatan MCP. |
| `CODEX_CHATGPT_WEB_HOME` | `/chatgpt-web-codex` | `open-sse/vendor/codex-chatgpt-web/config.ts` | Direktori khusus untuk keadaan pelayar, broker dan terowong. |
| `CODEX_CHATGPT_WEB_BROWSER_DIAGNOSTICS` | `0` | `open-sse/vendor/codex-chatgpt-web/adapters/chatgpt-web/browser-worker.ts` | Pada `1`, imej diagnostik pelayar ditangkap pada setiap titik semak. |
| `CODEX_CHATGPT_WEB_LAUNCHER` | _(tidak ditetapkan)_ | `open-sse/vendor/codex-chatgpt-web/config.ts` | Laluan mutlak pilihan kepada binari pelancar kekal. |
| `CODEX_CHATGPT_WEB_BUN` | _(dikesan automatik)_ | `open-sse/vendor/codex-chatgpt-web/config.ts` | Laluan mutlak pilihan kepada binari runtime Bun. |
| `CODEX_WEB_GPT_BUN` | _(tidak ditetapkan)_ | `open-sse/vendor/codex-chatgpt-web/config.ts` | Fallback warisan untuk `CODEX_CHATGPT_WEB_BUN`; persediaan baharu menggunakan nama kanonik. |
---
## Jambatan OmniConductor
Pengguna SSE jangka panjang yang mencerminkan tugas hab OmniConductor ke dalam A2A TaskManager setempat (`src/lib/conductor/`). Pilih-sertai — jambatan hanya dimulakan apabila `CONDUCTOR_HUB_URL` ditetapkan. Sebelah pelayan sahaja: token hab tidak boleh sekali-kali sampai ke pelayar.
| Pembolehubah | Lalai | Fail Sumber | Penerangan |
| ------------------------------ | ----------------------- | -------------------------------- | -------------------------------------------------------------------------------------------------------------------------------- |
| `CONDUCTOR_HUB_URL` | _(kosong)_ | `src/lib/conductor/boot.ts` | URL asas hab OmniConductor (cth. `http://127.0.0.1:7910`). Tidak ditetapkan = jambatan dilumpuhkan. |
| `CONDUCTOR_HUB_TOKEN` | _(kosong)_ | `src/lib/conductor/boot.ts` | Kredensial hab untuk suapan SSE — terbitkan peer berjenis `spokesperson` pada hab (`POST /v1/peers`, admin). |
| `CONDUCTOR_ORCHESTRATOR_TOKEN` | _(kosong)_ | `src/lib/conductor/hubProxy.ts` | Kredensial untuk delegasi tugas masuk A2A→hab (`POST /v1/tasks`); kembali kepada `CONDUCTOR_HUB_TOKEN` apabila tidak ditetapkan. |
| `CONDUCTOR_SPOKESPERSON_URL` | `http://127.0.0.1:7920` | `src/lib/conductor/faroProxy.ts` | URL asas perkhidmatan jurucakap (Faro) di belakang proksi sembang papan pemuka (`/api/conductor/ask`). |
### Penjadualan peka kuota
Digunakan oleh `open-sse/services/combo.ts` dan `src/lib/quota/quotaScheduler.ts` untuk semakan bajet token pra-permintaan. Pilih-sertai — tingkah laku penghalaan lalai tidak berubah apabila tidak ditetapkan.
| Pembolehubah | Lalai | Fail Sumber | Penerangan |
| ---------------------------------- | --------- | ------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `OMNIROUTE_QUOTA_AWARE_ROUTING` | `0` | `open-sse/services/combo.ts` | Apabila `1`, langkau sambungan yang bajet token setiap tetingkapnya (`rateLimitOverrides.tpm`, jadual `provider_quota_state`) tidak mampu menampung anggaran kos permintaan sebelum dihantar. Gagal-terbuka apabila tiada bajet dikonfigurasikan. |
| `OMNIROUTE_ESTIMATOR_CALIBRATION` | _(aktif)_ | `open-sse/services/estimatorCalibration.ts` | Penentukuran maklum balas bagi penganggar token pengawal konteks (#14931): EMA setiap (penyedia, model, alatan hadir) untuk `usage.prompt_tokens` / anggaran, diapit pada 0.15–2.0, dalam memori sahaja. `off`, `0` atau `false` melumpuhkan rakaman dan penggunaannya. |
| `GROK_SUBSCRIPTION_IMAGES_ENABLED` | `false` | `open-sse/config/imageRegistry.ts` | Mendaftarkan laluan imej `xai-oauth` (`xao`) dan `grok-cli`. Bendera ciri papan pemuka dengan nama yang sama; penindihan DB mengatasi nilai ini. |