# Environment Variables Reference (Bahasa Indonesia) 🌐 **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) · 🇳🇬 [ig](../../../ig/docs/reference/ENVIRONMENT.md) · 🇮🇹 [it](../../../it/docs/reference/ENVIRONMENT.md) · 🇯🇵 [ja](../../../ja/docs/reference/ENVIRONMENT.md) · 🇬🇪 [ka](../../../ka/docs/reference/ENVIRONMENT.md) · 🇰🇭 [km](../../../km/docs/reference/ENVIRONMENT.md) · 🇮🇳 [kn](../../../kn/docs/reference/ENVIRONMENT.md) · 🇰🇷 [ko](../../../ko/docs/reference/ENVIRONMENT.md) · 🇱🇹 [lt](../../../lt/docs/reference/ENVIRONMENT.md) · 🇱🇻 [lv](../../../lv/docs/reference/ENVIRONMENT.md) · 🇮🇳 [ml](../../../ml/docs/reference/ENVIRONMENT.md) · 🇮🇳 [mr](../../../mr/docs/reference/ENVIRONMENT.md) · 🇲🇾 [ms](../../../ms/docs/reference/ENVIRONMENT.md) · 🇲🇹 [mt](../../../mt/docs/reference/ENVIRONMENT.md) · 🇲🇲 [my](../../../my/docs/reference/ENVIRONMENT.md) · 🇳🇵 [ne](../../../ne/docs/reference/ENVIRONMENT.md) · 🇳🇱 [nl](../../../nl/docs/reference/ENVIRONMENT.md) · 🇳🇴 [no](../../../no/docs/reference/ENVIRONMENT.md) · 🇮🇳 [or](../../../or/docs/reference/ENVIRONMENT.md) · 🇮🇳 [pa](../../../pa/docs/reference/ENVIRONMENT.md) · 🇵🇭 [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) --- > Referensi lengkap untuk setiap variabel lingkungan yang dikenali oleh OmniRoute. Untuk templat mulai cepat, lihat [`.env.example`](../../.env.example). > [!IMPORTANT] > Setiap variabel yang didokumentasikan di sini juga harus muncul di `.env.example`, dan setiap variabel di `.env.example` harus muncul di sini. `npm run check:env-doc-sync` menerapkan ini saat melakukan dan di CI. Untuk menghilangkan variabel dengan sengaja, tambahkan variabel tersebut ke daftar yang diizinkan di dalam `scripts/check/check-env-doc-sync.mjs`. --- ## Daftar isi - [1. Rahasia yang Diperlukan](#1-required-secrets) - [2. Penyimpanan & Basis Data](#2-storage--database) - [3. Jaringan & Port](#3-network--ports) - [4. Keamanan & Otentikasi](#4-security--authentication) - [5. Sanitasi Masukan & Perlindungan PII](#5-input-sanitization--pii-protection) - [6. Kebijakan Alat & Perutean](#6-tool--routing-policies) - [7. URLs & Sinkronisasi Cloud](#7-urls--cloud-sync) - [8. Proksi Keluar](#8-outbound-proxy) - [9. Integrasi Alat CLI](#9-cli-tool-integration) - [10. Agen Internal & Integrasi MCP](#10-internal-agent--mcp-integrations) - [11. Kredensial Penyedia OAuth](#11-oauth-provider-credentials) - [12. Penggantian Agen Pengguna Penyedia](#12-provider-user-agent-overrides) - [13. Kompatibilitas Sidik Jari CLI](#13-cli-fingerprint-compatibility) - [14. Penyedia Kunci API](#14-api-key-providers) - [15. Pengaturan Batas Waktu](#15-timeout-settings) - [16. Pencatatan](#16-logging) - [17. Optimasi Memori](#17-memory-optimization) - [18. Sinkronisasi Harga](#18-pricing-sync) - [19. Sinkronisasi Model (Pengembangan)](#19-model-sync-dev) - [20. Pengaturan Khusus Penyedia](#20-provider-specific-settings) - [21. Kesehatan Proksi](#21-proxy-health) - [22. Men-debug](#22-debugging) - [23. Integrasi GitHub](#23-github-integration) - [24. Kotak Pasir Keterampilan (v3.8.0 +)](#24-skills-sandbox-v380) - [27. Umpan Radar (Hosting Mandiri)](#27-radar-feed-self-hosting) - [Skenario Penerapan](#deployment-scenarios) - [Audit: Variabel Dihapus / Mati](#audit-removed--dead-variables) --- ## 1. Rahasia yang Diperlukan Rahasia yang belum disetel ditandai** Ya** dibuat secara otomatis saat pertama kali dijalankan (`JWT_SECRET`, `API_KEY_SECRET`) dan bertahan hingga `server.env` di direktori data — mengaturnya secara eksplisit ketika direktori tersebut bersifat sementara. Pengecualiannya adalah `OMNIROUTE_WS_BRIDGE_SECRET`: tidak bertahan hingga `server.env` — titik masuk server mencetak nilai sementara per-boot yang hanya dapat digunakan oleh jembatan dalam proses, sehingga klien jembatan eksternal memerlukannya diatur secara eksplisit. | Variabel | Diperlukan | Bawaan | Berkas Sumber | Keterangan | | ---------------------------- | ----------------- | --------------------- | --------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | `JWT_SECRET` | **Ya** | _(tidak ada)_ | `src/lib/auth` | Signs/verifies semua cookie sesi dasbor (JWT). Hasilkan dengan `openssl rand -base64 48`. | | `API_KEY_SECRET` | **Ya** | _(tidak ada)_ | `src/lib/db/apiKeys.ts` | kunci enkripsi AES untuk nilai kunci API yang tidak aktif di SQLite. Hasilkan dengan `openssl rand -hex 32`. | | `INITIAL_PASSWORD` | TIDAK | _(tidak disetel)_ | `src/lib/auth/managementPassword.ts` | Menetapkan kata sandi dasbor saat startup sementara belum ada yang disimpan; diabaikan setelah kata sandi disimpan. npm dan instalasi sumber menyalin `.env.example` ke `.env`, sehingga mereka memulai dengan placeholder yang diketahui publik `CHANGEME`: ganti sebelum boot pertama, atau setel `INITIAL_PASSWORD=` (kosong) di `.env` itu untuk membuat kata sandi di wizard orientasi pada kunjungan pertama, seperti yang dilakukan oleh nilai yang tidak disetel (default gambar Docker ). Ubah kata sandi yang disimpan di Dasbor → Pengaturan → Keamanan, atau jalankan `omniroute reset-password` (`node bin/reset-password.mjs` di checkout sumber) dengan `DATA_DIR` diatur ke direktori data server. | | `OMNIROUTE_WS_BRIDGE_SECRET` | **Ya** (produksi) | _(tidak disetel)_ | `src/app/api/internal/codex-responses-ws/route.ts` | Rahasia bersama untuk jembatan Codex Responses WebSocket internal. Mengautentikasi permintaan jembatan antara relai Electron/browser WS dan OmniRoute. ⚠️**REQUIRED dalam produksi — jika tidak disetel, semua permintaan jembatan WS ditolak.** Hasilkan dengan `openssl rand -base64 32`. | | `OMNIROUTE_SW_BUILD_ID` | TIDAK | _(git SHA)_ | `next.config.mjs`, `scripts/build/assembleStandalone.mjs` | Id penghilang cache pekerja layanan eksplisit untuk shell PWA (#11779); pertama dalam rantai resolusi. | | `SOURCE_VERSION` | TIDAK | _(tidak disetel)_ | `next.config.mjs`, `scripts/build/assembleStandalone.mjs` | Kedua dalam rantai — yang ditetapkan oleh pembuat PaaS (misalnya gaya Heroku) sebagai komit yang diterapkan. | | `NEXT_PUBLIC_SW_BUILD_ID` | TIDAK | _(berasal dari)_ | `src/shared/components/PwaRegister.tsx` | Nilai publik waktu pembangunan yang digunakan klien untuk mendaftar `/sw.js?v=…`; berasal dari dua di atas, maka git SHA. | | `OMNIROUTE_PEER_STAMP_TOKEN` | Tidak (otomatis) | _(otomatis per boot)_ | `src/server/authz/policies/management.ts` | Rahasia per-proses yang membuktikan cap peer-IP tepercaya berasal dari server HTTP milik OmniRoute(`scripts/dev/peer-stamp.mjs`). Lokalitas permintaan kepercayaan middleware authz (loopback/LAN gating dari rute LOCAL_ONLY ) hanya jika stempel membawa token ini. Setiap — boot yang dibuat secara otomatis tidak disetel; hanya sematkan untuk pengaturan multi-proses yang harus berbagi stempel. | | `OMNIROUTE_TRUSTED_PROXIES` | TIDAK | _(tidak disetel)_ | `scripts/dev/peer-stamp.mjs` | Rentang proksi terbalik IPs atau CIDR yang dipisahkan koma yang `X-Forwarded-For` / `X-Real-IP` mungkin diyakini oleh daftar IP allow/deny, di atas loopback, alamat jaringan pribadi dan tepi Cloudflare, yang selalu dipercaya. Hanya diperlukan untuk proxy pada alamat publik lainnya; jika tidak, alamat proxy itu sendirilah yang akan dinilai oleh filter. Kunci throttle per klien (`/api/v1/relay/chat/completions`) relai pada alamat klien yang diselesaikan sama, tidak pernah pada header penerusan saja. | ### Perintah Generasi ```bash # Generate all four secrets at once: 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 pernah memasukkan file `.env` dengan rahasia nyata ke kontrol versi. `.gitignore` sudah mengecualikan `.env`, tetapi verifikasi sebelum mendorong. --- ## 2. Penyimpanan & Basis Data OmniRoute menggunakan**SQLite** (melalui `better-sqlite3`) untuk semua kegigihan. Variabel-variabel ini mengontrol lokasi data, enkripsi, dan siklus hidup. | Variabel | Bawaan | Berkas Sumber | Keterangan | | ------------------------------------------ | ----------------------------- | ----------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `DATA_DIR` | `~/.omniroute/` | `src/lib/db/core.ts` | Direktori root untuk SQLite DB, cadangan, dan file data. Ganti volume Docker atau jalur khusus. | | `OMNIROUTE_ALLOW_DEFAULT_DATA_DIR` | _(tidak disetel)_ | `src/lib/dataPaths.ts` | Pintu keluar untuk penjaga DATA_DIR test/eval (#10428). Pengujian dan probe Node eval/print (`-e`/`--eval`/`-p`/`--print`, termasuk formulir `--eval=`/`--print=` ) tanpa `DATA_DIR` dialihkan ke direktori temp sekali pakai sehingga tidak dapat membuka database operator yang sebenarnya; setel ke `1` untuk ikut serta kembali ke direktori sebenarnya. | | `OMNIROUTE_BUILD_SHA` | _(tidak disetel)_ | `src/lib/monitoring/buildSha.ts` | Git SHA dari artefak yang sedang berjalan. Dicap oleh `npm run build:release`; dapat disuntikkan dalam wadah yang dikirimkan tanpa penjaga `dist/BUILD_SHA`. Muncul sebagai `system.buildSha` di `/api/monitoring/health`. | | `OMNIROUTE_RELEASE_REF` | `origin/main` | `scripts/build/buildProvenance.ts` | Ref gerbang sumber artefak paket memeriksa build SHA terhadap (#10427). | | `OMNIROUTE_ALLOW_CANARY_BUILD` | _(tidak disetel)_ | `scripts/build/buildProvenance.ts` | Atur ke `1` untuk mengijinkan pengepakan sebuah bangunan yang SHA tidak berada pada jalur pelepasan, mencatatnya sebagai kenari yang disengaja dan bukannya menggagalkan gerbang (#10427). | | `OMNIROUTE_SMOKE_API_KEY` | _(tidak disetel)_ | `scripts/ops/deploy-canary.mjs` | kunci API untuk probe asap yang menyebarkan canary, dikirim sebagai `Authorization: Bearer` di `/v1/chat/completions`. Hanya digunakan oleh skrip penerapan (#10429), tidak pernah oleh server. Tidak berhubungan dengan variabel `OMNIROUTE_SMOKE_*` dari opt-in CLI smoke harness (`RUN_CLI_SMOKE=1`, `OMNIROUTE_SMOKE_BASE_URL/MODEL/API_KEY_ENV/TARGETS/TIMEOUT_MS` in `tests/integration/upstream-cli-smoke.int.test.ts`) — see [CLI Integrations → Real smoke sapu](../guides/CLI-INTEGRATIONS.md). | | `OMNIROUTE_BUILDING` | _(tidak disetel)_ | `src/lib/buildPhase.ts` | Sinyal fase pembangunan (#10060): diatur ke `1` oleh `scripts/build/build-next-isolated.mjs` dan diwarisi oleh setiap pekerja pembangunan yang muncul sehingga lapisan DB mengembalikan sebuah stub tanpa operasi alih-alih memuat addon better-sqlite3 asli (yang membatalkan pekerja saat keluar). Jangan pernah disetel untuk server yang sedang berjalan. | | `OMNIROUTE_SKIP_NATIVE_DEP_CHECK` | `0` | `scripts/check/check-native-deps.mjs` | Setel ke `1` untuk melewati pemeriksaan prebuild ketergantungan asli opsional untuk pohon bervendor eksotis. Hal ini tidak membuat ketergantungan yang hilang dapat dibangun; gunakan hanya ketika dependensi asli diberikan di luar jalur. | | `OMNIROUTE_DATA_DIR` | _(tidak disetel)_ | `open-sse/executors/promptql/threadSticky.ts` | **Alias mundur** untuk `DATA_DIR`, dicentang hanya jika `DATA_DIR` tidak disetel. Digunakan untuk menemukan cache sesi thread-sticky pada disk pelaksana PromptQL (`/promptql-thread-sessions.json`); jika tidak ada var yang disetel, cache hanya akan tetap berada di memori (tidak bertahan selama restart). | | `OMNIROUTE_PLUGINS_DIR` | _(tidak disetel)_ | `src/lib/plugins/scanner.ts` | Direktori itu** pemindai plugin waktu proses** membaca — dan melakukan root yang diinstal oleh manajer plugin ke dalam — dengan mengesampingkan default yang diturunkan dari rumah (#11827). Arahkan ke pohon plugin yang terpasang di Docker/K8s alih-alih memindahkan HOME hanya untuk merelokasi jalur pemindaian (HOME juga mengatur setiap perilaku relatif rumah lainnya). Batalkan penyetelan = `~/.omniroute/plugins`, atau `/tmp/.omniroute/plugins` ketika proses tidak mengekspor rumah sama sekali — non-penemuan senyap yang dihapus variabel ini. Direktori yang terselesaikan dicatat sekali saat startup sebagai `scanner.dir_resolved` dengan input yang menang. Hanya di sisi server: plugin perintah CLI menyimpan `OMNIROUTE_PLUGIN_PATH` sendiri (bagian 9). | | `STORAGE_ENCRYPTION_KEY` | _( = kosong dinonaktifkan)_ | `src/lib/db/encryption.ts` | kunci AES untuk enkripsi database SQLite penuh saat istirahat. Hasilkan dengan `openssl rand -hex 32`. | | `STORAGE_ENCRYPTION_KEY_VERSION` | `v1` | `scripts/build/bootstrap-env.mjs`, `electron/main.js` | Label versi untuk kunci enkripsi. Peningkatan saat melakukan rotasi kunci untuk mendukung dekripsi cadangan lama. | | `DISABLE_SQLITE_AUTO_BACKUP` | `false` | `src/lib/db/backup.ts` | Ketika `true`, lewati pencadangan file routine/pre-write SQLite (harga models.dev save/clear, tulis pengaturan). Pencadangan manual dan pra-pemulihan masih berjalan. Memang benar** bukan** nonaktifkan snapshot keselamatan tahan lama wajib pelari migrasi atau penjaga migrasi massal untuk DB persisten yang ada. Pencadangan non-manual dibatasi hingga maksimal satu kali setiap 60 menit. Dasbor** Pengaturan Penyimpanan →** dapat menonaktifkan auto-backup rutin secara mandiri. | | `OMNIROUTE_SQLITE_SLOW_MS` | _(unset/off)_ | `src/lib/db/adapters/slowDiagnostics.ts` | Milidetik; nilai di bawah 1 atau angka non-numerik tidak aktif; memperingatkan paling banyak sekali setiap 10 detik; baris log hanya memiliki driver, operasi, dan elapsedMs. | | `OMNIROUTE_SQLITE_OPTIMIZE_ENABLED` | `true` | `src/lib/db/sqlitePlannerStats.ts` | Pemeliharaan statistik perencana latar belakang, terlepas dari pembersihan retensi: izin pembersihan pertama yang diaktifkan (biasanya 30 detik setelah startup, setelah migrasi) berjalan `PRAGMA optimize=0x10002`; lintasan berikutnya setiap 6 jam dijalankan `PRAGMA optimize` (atau `PRAGMA optimize=0x00002` untuk analisis tanpa batas). `false` atau `0` menonaktifkan semua pemeliharaan (tidak peka huruf besar-kecil, spasi dipangkas). Basis data memori dan jalur cadangan baca-saja tidak terpengaruh. Kegagalan dicatat, bukan dibuang. | | `OMNIROUTE_SQLITE_ANALYSIS_LIMIT` | `400` | `src/lib/db/sqlitePlannerStats.ts` | Menetapkan `PRAGMA analysis_limit` sebelum pengoptimalan. Bilangan bulat desimal dijepit ke [0, 100000]; nilai malformed/empty default ke 400. `0` meminta analisis tabel yang tepat dan tidak terbatas yang dipilih melalui pengoptimalan; pass periodik menghapus bit batas pengambilan sampel optimal SQLite untuk memenuhi hal ini. Tidak ada pernyataan analisis SQL mandiri yang dijalankan. | | `OMNIROUTE_CRYPT_KEY` | _(tidak disetel)_ | `src/lib/db/encryption.ts` | **Alias warisan** untuk `STORAGE_ENCRYPTION_KEY`. Diterima sebagai cadangan ketika variabel utama tidak ada. | | `OMNIROUTE_API_KEY_BASE64` | _(tidak disetel)_ | `src/lib/db/encryption.ts` | **Alias warisan** (bentuk Base64-encoded ) diterima sebagai cadangan. Didekodekan secara otomatis sebelum digunakan. | | `OMNIROUTE_DB_HEALTHCHECK_INTERVAL_MS` | _(tidak disetel)_ | `src/lib/db/core.ts` | Ganti interval pemeriksaan kesehatan SQLite berkala (ms). Jika tidak disetel, defaultnya berasal dari `NODE_ENV`. | | `OMNIROUTE_WAL_TRUNCATE_INTERVAL_MS` | _(DIHAPUS)_ | `src/lib/db/walMaintenance.ts` | **DIHAPUS.** `wal_checkpoint(TRUNCATE)` yang aktif secara periodik dapat membatalkan pemetaan indeks wal bersama dan menghentikan proses dengan SIGBUS (#13973), sehingga penjadwalnya tidak ada lagi. Variabelnya inert: nilai positif mencatat peringatan penghentian satu kali, sementara `0` atau unset tetap diam. WAL dikelola oleh pos pemeriksaan PASSIVE (di bawah) dan dipotong oleh pos pemeriksaan penutupan. | | `OMNIROUTE_WAL_PASSIVE_INTERVAL_MS` | `300000` (5m) | `src/lib/db/walMaintenance.ts` | Ganti interval `wal_checkpoint(PASSIVE)` yang sering (ms). Membuat frame WAL yang tertunda tetap kecil sehingga pos pemeriksaan tetap cepat dan file WAL tetap dibatasi di antara pemotongan pematian. `0` dinonaktifkan. | | `OMNIROUTE_WAL_GUARD_MAX_MB` | `256` | `src/lib/db/walMaintenance.ts` | Ketika tanda centang PASSIVE menemukan file WAL di atas ukuran ini, jalankan `wal_checkpoint(RESTART)` sehingga WAL dimulai kembali tanpa menulis ulang indeks wal yang dipetakan. Pos pemeriksaan mode pemotongan langsung telah dihapus (lihat baris `OMNIROUTE_WAL_TRUNCATE_INTERVAL_MS` ). | | `OMNIROUTE_PRESSURE_SELF_RESTART` | `false` | `open-sse/utils/resourcePressure.ts` | Atur ke `1`/`true`/`yes`/`on` untuk keluar dari proses setelah tekanan sumber daya kritis dipertahankan untuk `OMNIROUTE_PRESSURE_SELF_RESTART_AFTER_MS`, membiarkan supervisor (systemd `Restart=always`, Docker restart policy) mengembalikan proses yang bersih alih-alih melayani 503 tanpa batas waktu. | | `OMNIROUTE_PRESSURE_SELF_RESTART_AFTER_MS` | `120000` (2m) | `open-sse/utils/resourcePressure.ts` | Berapa lama tekanan kritis harus bertahan sebelum pintu keluar menyala kembali. | | `OMNIROUTE_PRESSURE_PSI_DISABLED` | `false` | `open-sse/utils/resourcePressurePolicy.ts` | Atur ke `1`/`true`/`yes`/`on` untuk mengabaikan `/proc/pressure/memory` di seluruh host (`psi_some` / `psi_full`) ketika tetangga yang bising melakukan trip 503 saat proses ini baik-baik saja (#13124). Penjaga tumpukan Cgroup dan V8 tetap aktif. PSI juga berhenti menghitung sebagai bukti throttle kernel untuk `cgroup_high`: total cgroup di atas `memory.high` kemudian menjadi kritis hanya pada peningkatan `memory.events` `high`/`max`. Tanpa `memory.events` rasio mentah dipertahankan. | | `OMNIROUTE_SQLJS_WASM_PATH` | _(deteksi otomatis)_ | `src/lib/db/adapters/sqljsAdapter.ts` | Jalur eksplisit (mutlak atau relatif terhadap cwd) ke `sql-wasm.wasm` saat menggunakan adaptor fallback `sql.js` WASM. Terdeteksi secara otomatis melalui dependensi paket dan tata letak kandidat jika tidak disetel. | | `OMNIROUTE_BATCH_RETENTION_DAYS` | `30` | `src/lib/db/cleanup.ts` | Hari terminal (completed/failed/cancelled/expired) Pos pemeriksaan tugas API batch, file input/output/error yang direferensikan, dan baris disimpan oleh sapuan pembersihan otomatis sebelum penghapusan. Hanya berlaku setelah `BATCH_AND_FILE_AUTO_CLEANUP_ENABLED` diaktifkan; cocok dengan jendela retensi keluaran Batch API milik OpenAI. Tidak memengaruhi rute `DELETE /api/v1/batches/delete-completed` yang dipicu oleh operator, yang menurut desainnya tetap tanpa syarat (tanpa filter usia). | | `BATCH_AND_FILE_AUTO_CLEANUP_ENABLED` | `false` | `src/lib/db/cleanup.ts` | Ketika `true`, biarkan sapuan pembersihan otomatis menghapus terminal Batch pekerjaan API (dan pos pemeriksaannya) melewati `OMNIROUTE_BATCH_RETENTION_DAYS`, dan menghapus konten BLOB dari file yang diunggah melewati `expires_at` mereka sendiri. Nonaktif secara default: setiap instalasi yang ada menyimpan data ini persis seperti sebelumnya hingga operator ikut serta. Juga tanda fitur yang dapat diedit di dasbor — lihat `docs/reference/FEATURE_FLAGS.md` → Runtime. | | `OMNIROUTE_SKIP_DB_HEALTHCHECK` | `0` | `src/lib/db/core.ts`, `src/lib/db/healthCheck.ts` | Setel ke `1` untuk melewati pemeriksaan kesehatan DB sepenuhnya saat startup. Berguna untuk tugas jangka pendek dan pengujian integrasi. | | `OMNIROUTE_FORCE_DB_HEALTHCHECK` | `0` | `src/lib/db/core.ts` | Setel ke `1` untuk mengaktifkan loop pemeriksaan kesehatan DB, meskipun biasanya dilewati (misalnya, tugas yang berumur pendek). | | `OMNIROUTE_SKIP_POSTINSTALL` | `0` | `scripts/postinstall.mjs` | Setel ke `1` untuk melewati pemanasan waktu proses asli selama `npm install`. Berguna dalam instalasi CI/headless di mana sqlite sudah dibangun. | | `OMNIROUTE_MIGRATIONS_DIR` | _(deteksi otomatis)_ | `src/lib/db/migrationRunner.ts` | Ganti direktori yang dipindai oleh pelari migrasi. Berguna saat mengirimkan migrasi yang dibundel dalam versi kustom. | | `OMNIROUTE_EXTRA_MIGRATIONS_DIRS` | _(tidak disetel)_ | `src/lib/db/migrationRunner/extraDirs.ts` | Direktori migrasi tambahan sebagai entri `namespace=dir` dipisahkan oleh pembatas jalur platform (misalnya `ee=/opt/app/enterprise/db/migrations`). File yang ditemukan di sana dicatat sebagai `-`, sehingga distribusi yang mengirimkan migrasinya sendiri tidak pernah bertabrakan dengan slot numerik hulu. Entri yang formatnya salah, namespace yang tidak valid, atau direktori yang hilang muncul saat startup alih-alih melewatkan skema secara diam-diam. | | `OMNIROUTE_MAX_PENDING_MIGRATIONS` | `50` | `src/lib/db/migrationRunner.ts` | Ambang batas keamanan migrasi massal yang tertunda (#3416). Startup dibatalkan jika lebih dari ini banyak migrasi yang tertunda pada DB yang ada (menjaga tabel pelacakan yang terhapus). Naikkan untuk memulihkan cadangan lama; atur ke `0` untuk menonaktifkan pemeriksaan. | | `OMNIROUTE_INSTALL_UPGRADE_WORKDIR` | _(`/.install-upgrade`)_ | `scripts/check/check-install-upgrade.mjs` | Direktori kerja untuk gerbang rilis `check:install-upgrade`. Dibutuhkan sekitar 12 GB (dua ~ 3 GB install tree ditambah tarball), sehingga tidak boleh berjalan pada tmpfs kecil — pada runner yang dihosting sendiri `/tmp` adalah tmpfs yang didukung RAM 12 GB dan gerbangnya habis, sehingga memotong paket. | | `OMNIROUTE_SPEND_FLUSH_INTERVAL_MS` | _(kode default)_ | `src/lib/spend/batchWriter.ts` | Interval flush (ms) untuk penulis spend/cost batch. Nilai yang lebih rendah mengurangi penggabungan penulisan; nilai yang lebih tinggi mengurangi pertikaian DB. | | `OMNIROUTE_SPEND_MAX_BUFFER_SIZE` | _(kode default)_ | `src/lib/spend/batchWriter.ts` | Entri pembelanjaan buffer maksimum sebelum flush paksa. Meningkatkan penerapan QPS tinggi; lebih rendah ketika memori terbatas lebih penting. | | `OMNIROUTE_PROXY_FETCH_DEBUG` | _(tidak disetel)_ | `open-sse/utils/proxyFetch.ts` | Atur ke `"true"` untuk mengeluarkan log debug `[ProxyFetch]` di jalur relai Vercel. Nonaktif secara default untuk menghindari bocornya petunjuk perutean. | | `OMNIROUTE_PROXY_CORE_BINARY_PATH` | _(tidak disetel)_ | `src/lib/proxySubscription/coreConfig/sync.ts` | Jalur absolut biner inti proksi lokal (file bernama `sing-box` / `mihomo`) yang memeriksa konfigurasi inti yang dihasilkan sebelum menggantikan file yang diadopsi. Unset menulis `.generated` di samping file yang diadopsi saja. Hanya lingkungan host: tidak pernah disimpan dalam database atau diterima melalui manajemen API, karena biner dijalankan. | | `OMNIROUTE_PROXY_CORE_RELOAD_COMMAND` | _(tidak disetel)_ | `src/lib/proxySubscription/coreConfig/reload.ts` | Bagaimana inti proxy lokal dimuat ulang setelah penggantian konfigurasi terverifikasi: array argumen JSON dijalankan tanpa shell, atau tepatnya `external` ketika pengamat luar menerapkan file tersebut. Tidak pernah disimpan dalam database atau diekspos melalui API. | | `PROXY_LOG_INCLUDE_IPS` | `false` | `src/lib/proxyLogger.ts` | Atur ke `"true"` atau `"1"` untuk menyertakan client/egress IPs dan awalan akun di baris log proses `[ProxyEgress]` yang panjang. Pertahankan OFF secara default sehingga log proses tidak membocorkan IPs atau awalan akun. | | `OMNIROUTE_DEBUG` | _(tidak disetel)_ | `bin/cli/commands/quota.mjs` | Atur ke `1` untuk mencetak diagnostik waktu per permintaan (`[omniroute] GET completed in Nms`) dari perintah kuota CLI ke stderr. | | `OMNIROUTE_HEALTHCHECK_PATH` | _(mobil)_ | `scripts/dev/healthcheck.mjs` | Jalur eksplisit diperiksa oleh pemeriksaan kesehatan kontainer. Tidak disetel, probe mengambilnya dari `OMNIROUTE_BASE_PATH`; mengaturnya akan memilih kembali ke titik akhir pemantauan mendalam. | | `OMNIROUTE_DEBUG_COMPLETION` | _(tidak disetel)_ | `bin/cli/commands/completion.mjs` | Setel ke nilai tidak kosong apa pun untuk memancarkan diagnostik `[omniroute completion]` dari jalur cache penyelesaian shell CLI (read/refresh/write). Dinonaktifkan secara default — cache tersebut gagal secara diam-diam sehingga cache missing/corrupt tidak pernah merusak penyelesaian tab. | | `BATCH_RETRY_DURATION_MS` | `86400000` (24 jam) | `open-sse/services/batchProcessor.ts` | Jendela percobaan ulang maksimum untuk item batch individual (md). Item yang melebihi durasi ini ditandai gagal. | | `BATCH_BACKOFF_BASE_MS` | `5000` | `open-sse/services/batchProcessor.ts` | Penundaan dasar (ms) untuk kemunduran eksponensial pada percobaan ulang item batch. | | `BATCH_BACKOFF_MAX_MS` | `3600000` (1 jam) | `open-sse/services/batchProcessor.ts` | Batas (ms) untuk backoff eksponensial antara percobaan ulang item batch. | | `BATCH_MAX_CONCURRENT` | `1` | `open-sse/services/batchProcessor.ts` | Jumlah maksimum batch yang diproses secara bersamaan. Naikkan untuk meningkatkan throughput; tetap rendah untuk menghindari badai batas tarif. | > [!IMPORTANT] > Sebelum mengubah database persisten yang ada, pelari migrasi menerbitkan snapshot lengkap dengan alamat konten di bawah `DATA_DIR/db_backups/`. Publikasi memerlukan sistem file yang mendukung sistem file yang sama, tautan keras tanpa penimpaan, dan sinkronisasi file yang tahan lama. POSIX host juga memerlukan sinkronisasi direktori; pada Windows, Node mungkin menolak pegangan direktori, jadi OmniRoute menghapus file yang diterbitkan dan memperlakukan sinkronisasi entri direktori sebagai upaya terbaik. Jika `DATA_DIR` yang terpasang tidak dapat memberikan jaminan tersebut, startup gagal ditutup sebelum menerapkan migrasi. Pindahkan `DATA_DIR` ke volume dengan primitif tersebut; jangan gunakan `DISABLE_SQLITE_AUTO_BACKUP` untuk melewati keamanan migrasi. ### Skenario | Skenario | Konfigurasi | | ----------------------------- | ------------------------------------------------------------------------------------------ | | **Pembangunan lokal** | Biarkan semua default. DB tinggal di `~/.omniroute/omniroute.db`. | | **Docker** | `DATA_DIR=/data` + memasang volume di `/data`. | | **Dienkripsi saat istirahat** | Atur `STORAGE_ENCRYPTION_KEY` + simpan cadangan kuncinya! Kehilangannya = kehilangan data. | | **CI/Testing** | `DATA_DIR=/tmp/omniroute-test` — bersifat sementara, tidak diperlukan enkripsi. | --- ## 3. Jaringan & Port | Variabel | Bawaan | Berkas Sumber | Keterangan | | ------------------------------------------- | ------------------------------------------------ | ------------------------------------------------------------------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `PORT` | `20128` | `src/lib/runtime/ports.ts` | Port utama untuk titik akhir Dashboard UI dan API (mode port tunggal). | | `OMNIROUTE_BASE_PATH` | _(akar = kosong)_ | `next.config.mjs`, `scripts/docker/ensure-docker-base-path.mjs` | subjalur URL untuk melayani OmniRoute di belakang proksi terbalik (mengatur Next.js `basePath`; pengalihan auth sadar akan basePath). Misalnya `/omniroute`. Dalam Docker nilainya dipanggang selama `docker build` (`ARG OMNIROUTE_BASE_PATH`); image root yang dibuat sebelumnya dapat menerapkan nilai runtime yang berbeda satu kali pada saat container dimulai sebelum Next.js melakukan booting. Setel `NEXT_PUBLIC_BASE_URL` ke asal publik termasuk subjalur yang sama. | | `NEXT_PUBLIC_OMNIROUTE_BASE_PATH` | _(akar = kosong)_ | `src/shared/hooks/useDisplayBaseUrl.ts` | Cermin `OMNIROUTE_BASE_PATH` yang terlihat di browser, disejajarkan pada waktu pembuatan sehingga tampilan titik akhir dasbor menunjukkan `https://host/omniroute/v1` alih-alih `https://host/v1`. Kembali ke `OMNIROUTE_BASE_PATH` jika tidak disetel. Bangun kembali setelah perubahan ( `basePath` berikutnya adalah waktu pembuatan). | | `DASHBOARD_ALLOW_EMBED` | _(tidak disetel = tidak pernah dapat dibingkai)_ | `next.config.mjs`, `scripts/build/dashboardEmbed.mjs` | Ikut serta dalam penyematan iframe pada halaman HTML. Tidak disetel, setiap rute dikirimkan `frame-ancestors 'none'` + `X-Frame-Options: DENY`. Setel ke `vscode` untuk menyajikan halaman (dasbor, login, dokumen, landing) dengan `frame-ancestors 'self' vscode-webview:` dan tanpa `X-Frame-Options`, sehingga VS Code Simple Browser dapat merendernya ( mode OmniCopilot's `dashboardOpen: "editor"` ). Permukaan API (`/api`, `/v1`, `/v1beta`, `/a2a`, `/healthz`, alias tingkat akar) mempertahankan header yang ketat. Hanya `vscode` yang dikenali — `1`/`true` jangan aktifkan. Waktu pembuatan: membangun kembali setelah perubahan (`docker build --build-arg DASHBOARD_ALLOW_EMBED=vscode` untuk gambar; mengaturnya pada instalasi bawaan tidak berpengaruh). | | `API_PORT` | _(tidak disetel)_ | `src/lib/runtime/ports.ts` | Jika disetel, sajikan proksi `/v1/*` API (ditambah `/v1beta/*` asli Gemini) pada port terpisah ini. | | `API_HOST` | `0.0.0.0` | `src/lib/runtime/ports.ts` | Ikat alamat untuk port API. | | `DASHBOARD_PORT` | _(tidak disetel)_ | `src/lib/runtime/ports.ts` | Jika disetel, sajikan Dashboard UI pada port terpisah ini. | | `OMNI_MAX_CONCURRENT_CONNECTIONS` | `0` _(dinonaktifkan)_ | `src/sse/utils/backpressure.ts` | Membatasi koneksi obrolan dalam penerbangan secara bersamaan; permintaan di atas batas dapatkan `503` dengan `Retry-After`. Bilangan bulat positif memungkinkan penjaga; unset/`0` menonaktifkannya. | | `OMNIROUTE_INSTANCE_ID` | _(tidak disetel)_ | `src/shared/resilience/peerRouting.ts` | ID unik dan stabil untuk gateway ini saat merangkai instance OmniRoute. Mengaktifkan pemeriksaan peer-loop masuk. Karakter yang diperbolehkan: huruf, angka, `.`, `_`, `:`, dan `-`; maksimal 64 karakter. | | `OMNIROUTE_PEER_URLS` | _(tidak disetel)_ | `src/shared/resilience/peerRouting.ts`, `open-sse/executors/base.ts` | Basis OmniRoute yang dipisahkan koma URLs yang dapat menerima `X-OmniRoute-Peer-Trace`. Hanya URLs upstream yang diizinkan secara eksplisit yang menerima metadata rekan; semua penyedia lainnya tidak tersentuh. | | `OMNIROUTE_PEER_MAX_HOPS` | `4` | `src/shared/resilience/peerRouting.ts` | Jumlah maksimum instance OmniRoute yang dikunjungi sebelumnya yang diterima pada permintaan berantai (`1`-`32`). Kejadian berulang atau pengembalian anggaran yang habis HTTP `508 Loop Detected`. | | `PROD_DASHBOARD_PORT` | `20130` | `docker-compose.prod.yml` | Port yang diterbitkan sisi host untuk Dasbor dalam mode produksi Docker. | | `PROD_API_PORT` | `20131` | `docker-compose.prod.yml` | Port yang diterbitkan sisi host untuk API dalam mode produksi Docker. | | `OMNIROUTE_PORT` | _(tidak disetel)_ | `src/lib/runtime/ports.ts` | Lebih diutamakan daripada `PORT` saat dijalankan di dalam Electron atau pembungkus lainnya. | | `LIVE_WS_PORT` | `20129` | `src/server/ws/liveServer.ts` | Port untuk server pemantauan langsung WebSocket waktu nyata. | | `LIVE_WS_HOST` | `127.0.0.1` | `src/server/ws/liveServer.ts` | Ikat alamat untuk server WebSocket langsung. Setel ke `0.0.0.0` untuk diekspos pada LAN (juga konfigurasikan `LIVE_WS_ALLOWED_ORIGINS`). Koneksi diautentikasi dengan cookie sesi dasbor atau kunci API Pembawa yang memiliki cakupan manajemen (`manage`/`admin`). | | `LIVE_WS_ALLOWED_ORIGINS` | _(tidak disetel)_ | `src/server/ws/liveServer.ts` | Asal tambahan yang dipisahkan koma diizinkan untuk membuka WebSocket langsung. Asal dasbor loopback sudah diizinkan secara default. | | `LIVE_WS_ALLOWED_HOSTS` | _(tidak disetel)_ | `src/server/ws/liveServerAllowList.ts` | Nama host tambahan yang dipisahkan koma diperbolehkan untuk asal WebSocket langsung. Tidak seperti `LIVE_WS_ALLOWED_ORIGINS` (asal lengkap URLs), hanya cocok dengan bagian host — yang berguna untuk pengaturan LAN/Tailscale. | | `NEXT_PUBLIC_LIVE_WS_PUBLIC_URL` | _(tidak disetel)_ | `src/hooks/useLiveDashboard.ts` | URL publik untuk dasbor langsung WebSocket (sisi browser). Atur saat menghadapkan server WS dengan proxy terbalik atau Terowongan Cloudflare (misalnya `wss://ws.my-ai.com/live-ws`); browser terhubung ke sana, bukan `ws://hostname:20132`. Bagian pathname juga digunakan sebagai jalur upgrade WebSocket (default: `/live-ws`). | | `OMNIROUTE_ENABLE_LIVE_WS` | `true` | `src/server/ws/liveServer.ts` dan `scripts/start-ws-server.mjs` | Setel ke `0` atau `false` untuk menonaktifkan server WebSocket real-time (diaktifkan secara default, terikat loopback). tombol CI/harness yang menonaktifkan skrip pembantu WebSocket langsung yang berdiri sendiri. | | `RELAY_IP_PER_MINUTE` | `30` | `src/app/api/v1/relay/chat/completions/route.ts` | Batas laju relai per-(token, IP), requests/minute. Dalam memori, per instans. `0` atau negatif menonaktifkan gerbang dimensi IP (batas DB per token masih berlaku). | | `NODE_ENV` | `production` | inti Next.js | Mengontrol verbositas logging, caching, paparan detail kesalahan, dan optimasi Next.js. | | `OMNIROUTE_USE_TURBOPACK` | _(tidak disetel)_ (pemilihan build otomatis) | `scripts/build/build-next-isolated.mjs` | Untuk `npm run build`, tidak disetel atau kosongkan pilih webpack ketika batas memori efektif ( RAM fisik atau kuota cgroup/process lebih rendah) paling banyak** 16 GiB** atau tidak dapat ditentukan dengan aman; di atas 16 GiB, Turbopack dipilih. `0` memaksa webpack secara eksplisit; `1` eksplisit dan nilai bukan nol kosong lainnya memaksa Turbopack. Nilai lingkungan kosong yang diteruskan oleh Compose dapat diteruskan** bukan** memaksa Turbopack. Ambang batas ini berasal dari regresi memori pembangunan 15,6 GiB (#18184); build host dengan 24/32 GiB tidak diukur. Webpack produksi secara otomatis melewatkan cache persistennya secara default (lihat `OMNIROUTE_WEBPACK_BUILD_CACHE` di bawah; #18141) dan dibangun dengan RSS puncak yang jauh lebih sedikit dibandingkan jalur Turbopack saat ini. Pengembangan mempertahankan perilaku bundler yang ada.**Docker build sudah default ke `0` (webpack)** ; gunakan `--build-arg OMNIROUTE_USE_TURBOPACK=1` untuk ikut serta. Lihat `docs/guides/DOCKER_GUIDE.md`. | | `OMNIROUTE_WEBPACK_BUILD_CACHE` | _(tidak disetel)_ | `next.config.mjs` | Pembuatan produksi webpack (`OMNIROUTE_USE_TURBOPACK=0`) lewati cache sistem file persisten webpack kecuali ini adalah `1`. Menulis cache itu menambahkan sekitar 2,5 GB memori build puncak pada batas heap 6144 MB, dan build bersih tidak akan pernah membacanya kembali. Setel ke `1` untuk mempertahankan `.build/next/cache/webpack` agar pengulangan lebih cepat dibuat pada mesin dengan sisa RAM ; Docker build menganggapnya sebagai `--build-arg OMNIROUTE_WEBPACK_BUILD_CACHE=1` (tahap pembuat `Dockerfile` dan `Dockerfile.bun` ). | | `OMNIROUTE_SKIP_DB_HEALTHCHECK` | _(tidak disetel)_ | `src/lib/db/core.ts` / `src/lib/db/healthCheck.ts` | Atur ke `1` untuk melewati pemeriksaan kesehatan integritas SQLite saat startup. Berguna untuk boot lebih cepat pada database besar. | | `NOTIFY_SOCKET` | _(tidak disetel)_ | systemd (protokol sd_notify) | Ditetapkan oleh systemd ketika proses berjalan di bawah unit layanan dengan integrasi sd_notify; OmniRoute membacanya (lihat `OMNIROUTE_DISABLE_SD_NOTIFY`) untuk mengirim pemberitahuan READY/WATCHDOG. Tidak pernah disetel oleh pengguna. | | `OMNIROUTE_DISABLE_SD_NOTIFY` | _(tidak disetel)_ | `scripts/dev/systemd-notify.mjs` | Setel ke `1` untuk menonaktifkan systemd sd_notify (Ketik = notify / WatchdogSec=) bahkan ketika berjalan di bawah unit systemd. Pemberitahu adalah larangan di luar systemd. | | `CREDENTIAL_HEALTH_CHECK_INTERVAL` | `3600000` | `open-sse/config/constants.ts` / `src/lib/credentialHealth/scheduler.ts` | Interval (md) untuk penjadwal pemeriksaan kondisi kredensial latar belakang. Minimal: 10.000 (10 detik). | | `CREDENTIAL_HEALTH_CACHE_TTL` | `300000` | `open-sse/config/constants.ts` / `src/lib/credentialHealth/cache.ts` | TTL (ms) untuk status kesehatan kredensial yang di-cache. | | `OMNIROUTE_DISABLE_CREDENTIAL_HEALTH_CHECK` | `false` | `src/lib/credentialHealth/scheduler.ts` | Atur ke `1` atau `true` untuk menonaktifkan pengujian periodik latar belakang koneksi penyedia. Penyedia pencarian (SEARCH_VALIDATOR_CONFIGS dalam `src/lib/providers/validation/searchProviders.ts`, misalnya `tavily-search`) selalu dikecualikan dari penyisiran — "validasi" mereka adalah permintaan hulu yang ditagih secara nyata, sehingga mereka tidak pernah diperiksa kesehatannya pada pengatur waktu (#9970). | | `DEEP_HEALTH_CHECK_ENABLED` | `0` | `src/app/api/monitoring/health/route.ts` | Setel ke `1` untuk mengizinkan pemanggil yang diautentikasi meminta `/api/monitoring/health?deep=1`, yang mengambil sampel permukaan penyelesaian satu kali per TTL. Penelepon anonim tidak pernah memicu penyelidikan. | | `OMNIROUTE_EVENT_LOOP_STALL_THRESHOLD_MS` | `5000` | `src/lib/healthzLag.ts` | Ambang batas terhenti (md) untuk perekam loop peristiwa boot: pembekuan lebih lama dari ini mencatat satu baris `event loop stalled` di resume dengan memori dan jumlah dalam penerbangan, dan menambah `eventLoopStall` counter/maximum pada `/api/monitoring/health`. Setel ke `0` untuk menonaktifkan; nilai yang tidak dapat dibaca atau negatif kembali ke `5000`. | | `HOST` | `0.0.0.0` | `scripts/dev/run-next.mjs` | Ikat alamat untuk server Next.js dev/start. Mengganti `0.0.0.0` default saat disetel. | | `HOSTNAME` | `127.0.0.1` | `scripts/dev/run-next-playwright.mjs` | Bind alamat yang digunakan oleh Playwright runner saat meluncurkan Next.js. Defaultnya adalah `127.0.0.1` untuk pengujian kedap udara.** Jangan gunakan untuk `omniroute serve`** — gunakan `OMNIROUTE_SERVER_HOST` sebagai gantinya (POSIX shells otomatis mengatur `HOSTNAME` ke nama mesin; `.env` tidak dapat menimpanya). | | `OMNIROUTE_SERVER_HOST` | `0.0.0.0` | `bin/cli/commands/serve.mjs` | Ikat alamat untuk `omniroute serve`. Menghindari tabrakan dengan variabel POSIX shell `HOSTNAME` (selalu disetel ke nama mesin dengan bash/zsh). Kembali ke `0.0.0.0` jika tidak disetel. (#6194) | ### Mode Pelabuhan ``` ┌─────────────────────────── 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. Keamanan & Otentikasi | Variabel | Bawaan | Berkas Sumber | Keterangan | | ------------------------------------------- | ---------------------------------------------------------------------------------- | -------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | `MACHINE_ID_SALT` | `endpoint-proxy-salt` | `src/lib/auth` | Salt dikombinasikan dengan pengidentifikasi perangkat keras untuk sidik jari mesin. Ubah per penerapan untuk isolasi. | | `OMNIROUTE_CLI_SALT` | _(batalkan = garam per-instal acak tetap ada di `/cli-token-salt.json`)_ | `src/lib/machineToken.ts` | HMAC salt untuk mendapatkan token autentikasi CLI lokal. Menyetel nilai ini akan merotasi semua token CLI di mesin dan selalu mengambil prioritas di atas garam yang ada. Lihat `docs/security/CLI_TOKEN.md`. | | `AUTH_COOKIE_SECURE` | `false` | `src/lib/auth` | Menyetel tanda `Secure` pada cookie sesi.** Pasti `true`** saat berlari di belakang HTTPS. | | `REQUIRE_API_KEY` | `false` | perangkat tengah API | Jika `true`, semua permintaan proksi `/v1/*` harus menyertakan kunci API yang valid.** Bendera ini tidak membuka gerbang `GET /v1/models`** , yang mengikuti postur login dasbor (`requireAuthForModels`) sebagai ganti — jadi `401` dari `/v1/models` apakah NOT berarti inferensi dilindungi. Lihat `docs/security/INFERENCE_AUTH_POSTURE.md` (#13695). Menerima `true`, `1` atau `yes`, mengabaikan huruf besar dan spasi di sekitarnya; nilai lainnya (termasuk `on`) tidak aktif. | | `ALLOW_API_KEY_REVEAL` | `false` | `src/shared/constants/featureFlagDefinitions.ts` | Memungkinkan pengungkapan nilai kunci API secara penuh di Dasbor UI. Dapat dikonfigurasi dari Bendera Fitur Dasbor; risiko keamanan pada instance bersama. | | `NO_LOG_API_KEY_IDS` | _(kosong)_ | `src/lib/compliance/index.ts` | Kunci API yang dipisahkan koma IDs yang melewati pencatatan permintaan (kepatuhan GDPR ). | | `DEFAULT_RATE_LIMIT_PER_DAY` | _(batalkan = tidak terbatas)_ | `src/shared/utils/apiKeyPolicy.ts` | Anggaran permintaan cadangan per hari diterapkan ke kunci API yang kolom `rate_limits` nol. Tidak disetel atau kosong: tidak ada batasan implisit (#2289, #11017). `0` sama (tidak terbatas). Bilangan bulat positif N memungkinkan N/day, 5N/week, 20N/month. Nilai tidak kosong yang salah format kembali ke jendela 1000/day, 5000/week, 20000/month lama. | | `MAX_BODY_SIZE_BYTES` | `10485760` (10 MB) | `src/shared/middleware/bodySizeGuard.ts` | Default untuk pengaturan `maxBodySizeMb` yang terlihat; pengaturan yang disimpan akan diutamakan. `/api/v1/chat/completions` dan `/api/v1/responses` mempertahankan default 50 MB hingga batas disimpan; batas yang disimpan kemudian menggantikannya, ke atas atau ke bawah, untuk pelindung header dan untuk penerimaan obrolan byte sebenarnya. | | `OMNIROUTE_CHAT_LARGE_BODY_BYTES` | `262144` (256 KB) | `src/shared/middleware/chatBodyAdmission.ts` | Badan permintaan sebenarnya pada atau di atas ambang batas ini mengambil sewa penerimaan kelas berat lokal proses atom sebelum penguraian JSON ( jalur BYTE, termasuk `POST /v1/responses`). [#10437](https://github.com/diegosouzapw/OmniRoute/pull/10437) sama dengan pelarian ruang kepala yang sehat dengan struktur yang berat; masih dibatasi oleh `OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES` / [#10110](https://github.com/diegosouzapw/OmniRoute/issues/10110) sehingga [#7849](https://github.com/diegosouzapw/OmniRoute/issues/7849) tidak kembali. | | `OMNIROUTE_CHAT_HARD_MAX_BODY_BYTES` | `52428800` (50 MB) | `src/shared/middleware/chatBodyAdmission.ts` | Batasan keras rute obrolan diterapkan terhadap byte yang dibaca selama penyerapan terbatas, termasuk permintaan dengan `Content-Length` yang hilang, tidak valid, atau tidak jujur; kelebihan menerima `413`. `maxBodySizeMb` yang disimpan menggantikan default 50 MB ; ketika variabel ini disetel, variabel ini juga membatasi nilai yang disimpan. | | `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT` | _(batalkan — tanpa batas jumlah permintaan)_ | `src/shared/middleware/chatBodyAdmission.ts` | **#503-fanout:** batas COUNT permintaan lama ini sekarang hanya mengikat jika ditetapkan secara eksplisit. Jika tidak disetel (default), penerimaan obrolan kelas berat malah dibatasi oleh `OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES` — anggaran BYTE yang diturunkan secara otomatis yang berukuran dari batas atas memori sebenarnya dari proses tersebut** satu proses** (satu tumpukan V8). Dua ~ 750k-token `/v1/responses` yang tumpang tindih membatalkan ~ 12 Gi heaps (#7849) — a** anggaran memori** peringatan, bukan produk keras maksimal 2. Proses yang sehat (rasio tumpukan di bawah gudang) MAY mengakui lebih banyak `/v1/responses` panjang secara bersamaan melalui `OMNIROUTE_CHAT_ADMISSION_HEALTHY_HEADROOM`. Puluhan klien SSE panjang (40–50) adalah heap + `OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES` / #10110, bukan "maks 2". Meningkatkan ini secara membabi buta untuk "menggunakan host" akan memperkenalkan kembali #7849. Berkembang biak** tumpukan** dengan** N `DATA_DIR` s independen** (#11024); jangan pernah `replicas>1` pada satu file SQLite. | | `OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES` | _(turunan otomatis)_ | `src/shared/middleware/admissionBudget.ts` | **#503-fanout:** penggantian untuk anggaran byte penyerapan yang diturunkan secara otomatis (25% dari batas atas memori V8/cgroup yang lebih ketat dibagi dengan amplifikasi sementara 8x). Nilai turunan dan eksplisit dijepit ke 8 MiB–2 GiB. Badan yang lebih besar dari anggaran efektif akan langsung gagal dengan `413 body_exceeds_budget`; pertentangan antara badan-badan yang dapat diservis secara individual tetap dapat dicoba ulang `503`. 40–50 klien SSE panjang secara bersamaan adalah tumpukan + anggaran ini, bukan “maks 2” yang sulit. Baca `chatAdmission.maxInflightBytes` / `budgetSource` / `pressureSeverity` di `/api/monitoring/health` sebelum melakukan penyetelan. | | `OMNIROUTE_CHAT_ADMISSION_HEAP_SHED_RATIO` | `0.75` | `src/shared/middleware/chatBodyAdmission.ts` | Rasio pelepasan tekanan tumpukan (`heapUsed / heap_size_limit`) untuk penerimaan kelas berat BYTE dan STRUCTURE (#10183, #10268, #10437). Permintaan kelas berat secara bersamaan yang melewati `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT` hanya akan dilepaskan dengan `503` yang dapat dicoba ulang ketika heapnya ALSO pada atau di atas rasio ini; pada tumpukan yang sehat, ia diterima melalui ruang kepala yang sehat. | | `OMNIROUTE_CHAT_ADMISSION_HEALTHY_HEADROOM` | `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT` (default `1`) | `src/shared/middleware/chatBodyAdmission.ts` | Kapasitas ekstra terbatas untuk jalur cepat tumpukan sehat (#10437) aktif** keduanya** STRUCTURE dan BYTE (`admitChatRequest`, termasuk badan ≥ `OMNIROUTE_CHAT_LARGE_BODY_BYTES`). Tanpa batasan ini, setiap permintaan heap yang sibuk namun sehat akan dilewati tanpa batas maksimum. Setelah banyak sewa serentak ini aktif melalui jalur tumpukan sehat, permintaan sibuk selanjutnya akan masuk ke jalur SAME bounded-wait/shed yang digunakan dalam tekanan tumpukan nyata. `0` menonaktifkan bypass sepenuhnya. | | `OMNIROUTE_CHAT_HEAVY_MESSAGE_COUNT` | `200` | `src/shared/middleware/chatBodyAdmission.ts` | Jumlah pesan yang mengklasifikasikan permintaan obrolan sebagai kelas berat meskipun isinya berada di bawah ambang batas byte. | | `OMNIROUTE_CHAT_HEAVY_TOOL_COUNT` | `64` | `src/shared/middleware/chatBodyAdmission.ts` | Jumlah alat yang mengklasifikasikan permintaan obrolan sebagai kelas berat meskipun isi permintaan tersebut berada di bawah ambang batas byte. | | `OMNIROUTE_CHAT_HEAVY_ESTIMATED_TOKENS` | `32000` | `src/shared/middleware/chatBodyAdmission.ts` | Perkiraan token ukuran string konservatif yang mengklasifikasikan permintaan sebagai kelas berat; ini adalah proksi biaya masuk, bukan tokenisasi penagihan penyedia. | | `OMNIROUTE_CHAT_HARD_MAX_MESSAGES` | `0` (dinonaktifkan) | `src/shared/middleware/chatBodyAdmission.ts` | Batas riwayat obrolan keikutsertaan opsional. Dinonaktifkan secara default: jumlah pesan adalah kebijakan penerapan, bukan properti universal permintaan, dan pembatasan di sini menolak percakapan dengan terminal `413` sebelum pipa kompresi dapat menjadikannya dapat diservis. Pertumbuhan tumpukan dibatasi oleh `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT` dan pelepasan tekanan tumpukan. Menetapkan nilai positif pada penerapan dengan keterbatasan memori yang memerlukan batas maksimum; kelebihan kemudian menerima `413` yang diperlukan kompak terstruktur. | | `OMNIROUTE_MAX_NONSTREAMING_RESPONSE_BYTES` | `67108864` (64 MB) | `open-sse/handlers/chatCore/nonStreamingResponseBody.ts` | Batasan keras untuk respons upstream non-streaming di-buffer sepenuhnya ke dalam memori. Setelah ini, pembaca upstream dibatalkan dan permintaan gagal dengan cepat alih-alih mengembangkan string yang tidak dibatasi hingga heap habis. | | `OMNIROUTE_FORWARDING_HEADER_BUDGET_BYTES` | `768` | `open-sse/handlers/chatCore/responseHeaders.ts` | Byte kabel maksimum diteruskan dari header respons upstream. Ketika anggaran terlampaui, header dengan prioritas lebih rendah (misalnya, `x-codex-*` khusus, `x-oai-request-id`) dihilangkan agar tetap berada dalam batas header proxy terbalik yang umum. Tetapkan lebih tinggi untuk meneruskan lebih banyak metadata upstream dengan mengorbankan ukuran header respons yang lebih besar. | | `OMNIROUTE_QUOTA_RECOVERY_MAX_PER_KEY` | `64` | `src/lib/quota/quotaSessionRecovery.ts` | Sebagian besar tiket pemulihan kuota (menunggu, berjalan, atau menunggu konfirmasi) satu kunci API dapat disimpan. Setelah kunci mencapai batasnya, giliran baru mendapatkan kesalahan kuota asli, bukan tiket `202` ; mencoba kembali belokan yang sudah diparkir tetap mengembalikan tiketnya. Nilai yang tidak valid atau non-positif menggunakan nilai default. | | `CORS_ORIGIN` | _(tidak disetel)_ | `src/server/cors/origins.ts` | Daftar CORS asal tunggal yang lama dan diizinkan. Lebih suka `CORS_ALLOWED_ORIGINS` untuk penerapan baru. CORS hanya untuk klien API browser lintas asal; penulisan dasbor yang diautentikasi menggunakan permintaan asal yang sama ditambah perlindungan CSRF terikat sesi. | | `CORS_ALLOWED_ORIGINS` | _(tidak disetel)_ | `src/server/cors/origins.ts` | Daftar CORS yang diizinkan dipisahkan koma. Tidak ada wildcard yang dikirim kecuali `CORS_ALLOW_ALL=true` dikonfigurasi secara eksplisit. | | `CORS_ALLOW_ALL` | `false` | `src/server/cors/origins.ts` | Pintu keluar khusus pengembangan untuk menggemakan browser apa pun `Origin`. Jangan aktifkan pada penerapan bersama atau produksi. | | `OUTBOUND_SSRF_GUARD_ENABLED` | `true` | `src/shared/network/outboundUrlGuardPolicy.ts` | Alias warisan. Pengalih dasbornya (penggantian DB ) dibaca sebelum nilai lingkungan ini; `false`, `0`, `no`, atau `off` di salah satu opsi tersebut akan menonaktifkan pemeriksaan host seperti yang dilakukan `OMNIROUTE_ALLOW_PRIVATE_PROVIDER_URLS=true`, bahkan ketika tombol dasbor tanda tersebut dinonaktifkan; nilai-nilai lain serahkan penjagaan pada dua bendera di bawah. | | `OMNIROUTE_ALLOW_PRIVATE_PROVIDER_URLS` | `false` | `src/shared/network/outboundUrlGuardPolicy.ts` | Menonaktifkan pemeriksaan host URL guard keluar, termasuk blok metadata cloud (semua 169.254.0.0/16, metadata.google.internal), pada jalur penyedia yang mengikuti mode penjaga: validasi URL, penemuan model, basis node penyedia URLs (termasuk node pemeringkatan ulang jarak jauh), dan pengujian fallback proxy, di antara jalur keluar lain yang berdekatan dengan penyedia seperti pengambilan image/media jarak jauh. Hal ini juga memungkinkan target webhook pribadi, kecuali titik akhir cloud-metadata/link-local, yang tetap diblokir meskipun tanda ini diaktifkan. Permintaan obrolan yang dikirim melalui `BaseExecutor.execute()` tetap memeriksa metadata cloud-nya. Penyedia lokal bekerja dengan default: `OMNIROUTE_ALLOW_LOCAL_PROVIDER_URLS` (default `true`) sudah mengizinkan lokal dan LAN URLs pada jalur validasi, penemuan, dan simpul penyedia; pengujian proksi-fallback dan target webhook pribadi hanya berkonsultasi dengan tanda ini dan memblokir host local/LAN saat tidak aktif. Mengganti `OMNIROUTE_ALLOW_LOCAL_PROVIDER_URLS=false`. Nilai yang disimpan dari tombol dasbor lebih diutamakan daripada variabel ini. | | `OMNIROUTE_ALLOW_LOCAL_PROVIDER_URLS` | `true` | `src/shared/network/outboundUrlGuardPolicy.ts` | Izinkan penyedia URLs pada alamat local/private (127.0.0.1, localhost, LAN, rentang pribadi) untuk validasi penyedia, penemuan model, obrolan, dan jalur keluar lain yang berdekatan dengan penyedia yang diatur oleh mode penjaga.** `true` bawaan** (yang mengutamakan lokal): penjaga kemudian memblokir titik akhir metadata cloud — semua 169.254.0.0/16 ditambah nama host metadata yang diketahui (metadata.google.internal, metadata.goog, Alibaba/Azure/Oracle IMDS, fd00:ec2::254). Setel `false` untuk mode publik saja, yang juga memblokir host pribadi dan loopback. Penjaga memeriksa nama host atau IP literal seperti yang tertulis, sebelum pencarian DNS ; dalam mode publik saja, pembungkus pengambilan aman juga menyelesaikan nama host dan menolak jawaban pribadi apa pun. `OMNIROUTE_ALLOW_PRIVATE_PROVIDER_URLS=true` mematikan tanda centang ini pada jalur daftar barisnya. Penyedia lokal bawaan, seperti LM Studio, Ollama, vLLM, Llamafile, dan Triton, lewati semua pemeriksaan host untuk validasi kunci dan obrolan. Nilai yang disimpan dari tombol dasbor lebih diutamakan daripada variabel ini. (#5066) | | `AUDIO_REMOTE_PROVIDER_NODES` | `false` | `src/app/api/v1/_shared/audioProviderNodes.ts` | Biarkan rute `/v1/audio/*` (transkripsi, ucapan, terjemahan) menggunakan node penyedia yang kompatibel dengan OpenAI yang dihosting di luar localhost. Dinonaktifkan secara default — merutekan audio ke host jarak jauh mengubah identitas jalan keluar dan harus merupakan keputusan operator yang eksplisit. node Loopback/private (localhost, 127.0.0.1, 172.16-31.x) selalu diizinkan dan tidak terpengaruh. (#3963) | | `RERANK_REMOTE_PROVIDER_NODES` | `false` | `src/app/api/v1/_shared/rerankProviderNodes.ts` | Biarkan `POST /v1/rerank` (dan langkah rerank loopback mesin memori) menggunakan node penyedia yang kompatibel dengan OpenAI yang dihosting di luar localhost — a LAN box atau Tailscale peer yang menjalankan TEI, Infinity, vLLM, dll. Dinonaktifkan secara default — routing ke host jarak jauh mengubah identitas jalan keluar dan harus merupakan keputusan operator yang eksplisit. Node loopback (localhost, 127.0.0.1, 172.16-31.x) selalu diizinkan dan tidak terpengaruh. URL dasar node jarak jauh juga harus melewati kebijakan 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 host (dipisahkan koma atau spasi) yang diperlakukan oleh perutean node penyedia sebagai — lokal, biasanya merupakan nama layanan Docker/Compose dari reranker, TEI, atau sidecar audio di jaringan Docker milik OmniRoute(`http://reranker:8080/v1`), sehingga node tidak memerlukan container hard-coded IP. Host yang terdaftar memenuhi syarat untuk `/v1/rerank`, `/v1/audio/*` dan pemeriksaan kesehatan lokal tanpa mengaktifkan `RERANK_REMOTE_PROVIDER_NODES` / `AUDIO_REMOTE_PROVIDER_NODES` untuk setiap node jarak jauh, dan dipanggil secara langsung — tidak pernah melalui `HTTP(S)_PROXY` atau proxy koneksi yang disematkan. Mereka masih mengirimkan kunci API koneksi. Hanya nama label tunggal dan nama `.internal`/`.local` yang diterima; public FQDNs, IP literal, dan nama metadata cloud diabaikan dengan peringatan. (#14635) | | `OMNIROUTE_OIDC_DISABLE_PASSWORD_LOGIN` | `false` | `src/app/api/auth/login/route.ts` | Ketika OIDC diaktifkan, nonaktifkan login kata sandi sehingga pengguna hanya dapat mengautentikasi melalui OIDC Single Sign-On. Alias telanjang `OIDC_DISABLE_PASSWORD_LOGIN` juga diterima; Bendera Fitur Dasbor dari kunci yang sama akan diutamakan. (#10889) | | `OIDC_DISABLE_PASSWORD_LOGIN` | `false` | `src/app/api/auth/login/route.ts` | Alias kosong dari `OMNIROUTE_OIDC_DISABLE_PASSWORD_LOGIN` (#10889). | | `OMNIROUTE_DISABLE_MFA` | `false` | `src/server/auth/dashboardMfa.ts` | Pemulihan perangkat yang hilang untuk dasbor keikutsertaan TOTP login dua faktor. Ketika `true`, faktor kedua dilewati hanya untuk proses masuk dari host itu sendiri (loopback peer dan loopback `Host`); proses masuk jarak jauh dan `POST /api/cli/connect` dari sumber lain masih memerlukan kode. Masuk secara lokal, nonaktifkan dua faktor di bawah Pengaturan → Keamanan (kode mungkin dibiarkan kosong saat ini disetel, sehingga faktor yang tidak lagi terverifikasi dapat dihapus; kata sandi masih diperlukan), lalu hapus pengaturannya. TOTP mencakup login kata sandi dan `omniroute connect` hanya — OIDC/SSO masuk bergantung pada faktor kedua penyedia identitas itu sendiri. Lihat [AUTHZ_GUIDE](../architecture/AUTHZ_GUIDE.md#optional-totp-two-factor-login-16619). | ### Daftar Periksa Pengerasan ```bash # Production security minimum: AUTH_COOKIE_SECURE=true # Requires HTTPS REQUIRE_API_KEY=true # Authenticate all proxy calls ALLOW_API_KEY_REVEAL=false # Never expose keys in UI CORS_ALLOWED_ORIGINS=https://your.domain.com MAX_BODY_SIZE_BYTES=5242880 # 5 MB limit ``` --- ## 5. Sanitasi Masukan & Perlindungan PII OmniRoute memberikan pertahanan dua lapis: pemindaian injeksi sisi permintaan dan pengupasan PII sisi respons. > **⚠️ Batasan:** Pagar pembatas ini adalah deteksi heuristik upaya terbaik_, bukan firewall injeksi cepat atau sistem PII DLP yang lengkap. Mereka dapat menghasilkan positif palsu (perintah persona/RPG yang tidak berbahaya ditandai) dan negatif palsu (leetspeak, spasi, pola non-Inggris). Hal-hal tersebut tidak cukup untuk mencapai kepatuhan. Sesuaikan mode dan uji lalu lintas Anda sebelum mengandalkannya. ### Sisi Permintaan: Pelindung Injeksi Cepat | Variabel | Bawaan | Berkas Sumber | Keterangan | | --------------------------------- | ----------------- | ---------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `INPUT_SANITIZER_ENABLED` | `true` | `src/middleware/promptInjectionGuard.ts` | Aktifkan pemindaian pesan masuk untuk pola injeksi cepat. | | `INPUT_SANITIZER_MODE` | `warn` | `src/middleware/promptInjectionGuard.ts` | Kebijakan injeksi: `warn` = log saja, `block` = menolak permintaan dengan 400. Legacy `redact` melakukannya** bukan** menghapus teks injeksi; gunakan `PII_REDACTION_ENABLED` untuk permintaan penulisan ulang PII. | | `INJECTION_GUARD_MODE` | _(tidak disetel)_ | `src/middleware/promptInjectionGuard.ts` | Alias warisan untuk `INPUT_SANITIZER_MODE` — perilaku yang sama. | | `INPUT_SANITIZER_BLOCK_THRESHOLD` | `high` | `src/shared/utils/injectionSeverity.ts` | Tingkat keparahan minimum yang ditolak `MODE=block` : `high` (default), `medium`, atau `low`. Pola sedang hanya dapat diamati kecuali diturunkan. | | `INJECTION_GUARD_BLOCK_THRESHOLD` | _(tidak disetel)_ | `src/shared/utils/injectionSeverity.ts` | Alias warisan untuk `INPUT_SANITIZER_BLOCK_THRESHOLD` — perilaku yang sama. | | `PII_REDACTION_ENABLED` | `false` | `src/lib/guardrails/piiMasker.ts` | Ketika `true`, redaksikan PII dalam permintaan masuk (terlepas dari mode injeksi). | | `CREDENTIAL_REDACTION_ENABLED` | `false` | `src/lib/guardrails/credentialMasker.ts` | Redaksikan pola kunci API/token rahasia yang terkenal dari muatan request/response. Ikut serta; cermin `PII_REDACTION_ENABLED`. | ### Sisi Respons: PII Sanitizer | Variabel | Bawaan | Berkas Sumber | Keterangan | | -------------------------------- | -------- | ------------------------- | -------------------------------------------------------------------------------- | | `PII_RESPONSE_SANITIZATION` | `false` | `src/lib/piiSanitizer.ts` | Pindai respons LLM untuk mengetahui kebocoran PII sebelum kembali ke klien. | | `PII_RESPONSE_SANITIZATION_MODE` | `redact` | `src/lib/piiSanitizer.ts` | `redact` = mask PII, `warn` = log saja, `block` = menghilangkan seluruh respons. | ### Pembersih Konteks Rute Tokenisasi Kode VS | Variabel | Bawaan | Berkas Sumber | Keterangan | | ----------------------------------- | ------ | ------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `OMNIROUTE_VSCODE_SANITIZE_CONTEXT` | `1` | `src/app/api/v1/vscode/contextSanitizer.ts` | Menghapus konteks editor aktif implisit (`editorContext`, `activeEditor`, `currentFile`, `selection`, `openTabs`…) dari permintaan `/v1/vscode/[token]/*` dan menyunting konten file sensitif yang dilampirkan secara eksplisit. Aman secara default; atur ke `0` untuk menonaktifkan. | ### Skenario | Skenario | Konfigurasi | | ------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | **Kepatuhan perusahaan** | `INPUT_SANITIZER_ENABLED=true`, `INPUT_SANITIZER_MODE=block`, `PII_REDACTION_ENABLED=true`, `PII_RESPONSE_SANITIZATION=true` (blok injeksi + request/response PII redaksi; mode bersifat independen) | | **Hanya pemantauan** | `INPUT_SANITIZER_ENABLED=true`, `INPUT_SANITIZER_MODE=warn` — mencatat tetapi tidak pernah memblokir | | **Keperluan pribadi** | Biarkan semua overhead — nol yang dinonaktifkan | --- ## 6. Kebijakan Alat & Perutean | Variabel | Bawaan | Berkas Sumber | Keterangan | | ----------------------------------------------------------- | ---------------------------- | ----------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `TOOL_POLICY_MODE` | `disabled` | `src/lib/toolPolicy.ts` | Mengontrol akses LLM tool/function-calling. `allowlist` = hanya alat yang terdaftar, `denylist` = semua kecuali terdaftar, `disabled` = tidak ada batasan. | | `OMNIROUTE_PAYLOAD_RULES_PATH` | `./config/payloadRules.json` | `open-sse/services/payloadRules.ts` | Jalur ke aturan manipulasi muatan file JSON (per-model/protocol upstream tweak). | | `OMNIROUTE_PAYLOAD_RULES_RELOAD_MS` | `5000` | `open-sse/services/payloadRules.ts` | Interval muat ulang (ms) untuk memuat ulang file aturan muatan secara panas. Minimal `1000`. | | `OMNIROUTE_PREFER_CLAUDE_CODE_FOR_UNPREFIXED_CLAUDE_MODELS` | `false` | `open-sse/services/model.ts` | Ikut serta: merutekan model `claude-*` IDs dari klien Kode Claude melalui akun Kode Claude OAuth alih-alih memerlukan awalan penyedia. Awalan penyedia eksplisit masih menang. Juga dapat dikonfigurasi melalui tombol dasbor di halaman penyedia Claude. | | `OMNIROUTE_REDACT_THINKING` | `true` | `open-sse/executors/base/redactThinkingBeta.ts` | Setel `false` untuk menghentikan OmniRoute menambahkan `redact-thinking-2026-02-12` Anthropic beta itu sendiri (blok pemikiran khusus tanda tangan kosong). Permintaan dengan `thinking.display: "summarized"` lewati saja; redact beta yang dinegosiasikan klien atau `requestDefaults.redactThinking` opt-in yang kompatibel dengan CC mempertahankannya. permintaan Claude OAuth tetap menggunakan versi beta (ini adalah bagian dari sidik jari Kode Claude OAuth ) kecuali tanda fitur `CLAUDE_OAUTH_SUMMARIZED_THINKING_UNREDACTED` yang tidak aktif secara default aktif. | | `BARE_MODEL_DEFAULT_OVERRIDE_LEGACY` | `false` | `open-sse/services/model.ts` | Perilaku `resolveBareModelToConnectionDefault` lama (#4825): ganti nama model apa pun dengan `defaultModel` koneksi yang dipilih. Nonaktif secara default, hanya `auto` atau model kosong yang diganti; mencatat satu peringatan per pasangan saat aktif. | | `COMBO_CONCURRENCY_PER_MODEL` | `3` | `open-sse/services/comboConfig.ts` | Batas konkurensi per model untuk kombo round-robin (#9100). Semaphore kombo round-robin dibatasi secara ketat pada 3 permintaan serentak per model tanpa penggantian, membuat serial lalu lintas konkurensi yang lebih tinggi di balik batasan tersebut. Divalidasi ke `>= 1`, dijepit ke `<= 32`. | | `OMNIROUTE_AGENTIC_STALL_FAILOVER` | `false` | `open-sse/services/combo/agenticStallFailover.ts` | Keikutsertaan: disetel ke `1` (atau `true`) sehingga anggota kombo menjawab giliran hasil alat dengan narasi `finish: stop` + + zero panggilan alat gagal ke target berikutnya (strategi putaran prioritas, sesi round-robin dan disematkan). Jika tidak ada target yang lebih baik, jawaban yang terhenti akan dikembalikan, bukan kesalahan, dan baik pemutus penyedia maupun penguncian model tidak akan dikenakan biaya. Giliran yang dialirkan ditahan dari klien sampai putusan diselesaikan. Permintaan yang menggunakan bentuk Responses API `input` tidak diklasifikasikan. OFF bawaan. | | `DISABLE_CONTEXT_WINDOW_CHECKS` | `false` | `open-sse/handlers/chatCore.ts` | Keikutsertaan berbahaya yang melewatkan pemeriksaan jendela konteks lokal / token input maksimal OmniRoute untuk permintaan model tunggal langsung. Penyedia hulu masih menerapkan batasan sebenarnya; kompresi cepat dan batas token keluaran model tetap aktif. Prioritas yang efektif adalah Feature Flags DB override > environment variabel > default; tidak perlu memulai ulang. | | `OMNIROUTE_SELF_HOSTED_PROVIDERS` | _(tidak disetel)_ | `open-sse/services/selfHostedEntry.ts` | Dokumen YAML `providers:` sebaris (RIC-738, D4). Jika disetel (dengan atau tanpa blok `strategy:` ), `/v1/chat/completions` beralih ke entri terpadu yang kompatibel dengan OpenAI yang dihosting sendiri, bukan ke saluran cloud. Tidak disetel (default): rute langsung menuju ke pipeline cloud yang ada. Lihat `docs/routing/SELF_HOSTED_OPENAI_ENTRY.md`. | | `OMNIROUTE_SELF_HOSTED_PROVIDERS_FILE` | _(tidak disetel)_ | `open-sse/services/selfHostedEntry.ts` | Jalur ke file YAML yang menyimpan dokumen `providers:` yang sama dengan `OMNIROUTE_SELF_HOSTED_PROVIDERS`, untuk penerapan yang lebih memilih file daripada env var inline. Salah satu dari mereka mengaktifkan entri yang dihosting sendiri. | | `OMNIROUTE_SELF_HOSTED_API_KEY` | _(batalkan rute terbuka — )_ | `open-sse/services/selfHostedEntry.ts` | Kunci API bersama opsional untuk entri terpadu yang dihosting sendiri (perancah D5, dicadangkan untuk sistem kuota per kunci). Jika disetel, permintaan harus menyertakan `Authorization: Bearer `. Tidak disetel: rute terbuka, cocok dengan pola penyedia lokal yang dihosting sendiri (loopback/trusted-network deployment). | | `OMNIROUTE_SELF_HOSTED_STRATEGY` | _(tidak disetel)_ | `open-sse/services/routingStrategies.ts` | Dokumen YAML `strategy:` sebaris untuk mesin perutean deterministik (M2/RIC-740, D3) — blacklist/whitelist, pemutus cooldown, prioritas biaya, sadar latensi, rantai cadangan. Mengganti blok `strategy:` sebaris yang bersarang di dalam `OMNIROUTE_SELF_HOSTED_PROVIDERS`, per kunci. Lihat `docs/routing/DETERMINISTIC_ROUTING.md`. | | `OMNIROUTE_SELF_HOSTED_STRATEGY_FILE` | _(tidak disetel)_ | `open-sse/services/routingStrategies.ts` | Jalur ke file YAML yang menyimpan dokumen `strategy:` yang sama dengan `OMNIROUTE_SELF_HOSTED_STRATEGY`, untuk penerapan yang lebih memilih file daripada env var inline. | | `OMNIROUTE_DISABLE_CONVERSATION_TRACKING` | _(tidak disetel)_ | `open-sse/services/conversationTracker.ts` | Setel `1` untuk berhenti mengumpulkan riwayat percakapan. `resolveConversationId()` mengembalikan hasil yang tidak terlacak sebelum membaca SQLite atau mem-parsing riwayat pesan, dan sesi IDs yang disediakan klien juga tercakup. Penanganan sesi perutean tidak berubah dan catatan yang ada tidak dihapus. Untuk penerapan yang tidak menggunakan tampilan percakapan dasbor dan ingin turn table berhenti berkembang. | | `OMNIROUTE_NADIR_API_KEY` | _(tidak disetel)_ | `open-sse/services/autoCombo/nadirStrategy.ts` | kunci API untuk strategi router kombo otomatis `nadir` keikutsertaan, digunakan ketika `config.nadir.apiKey` kombo itu sendiri tidak disetel. Opsional: panggilan tanpa kunci masuk ke tingkat anonim Nadir, yang tarifnya dibatasi per IP sehingga tidak dapat digunakan di balik gateway bersama. Peka; pilih kolom per kombo bila kombo menggunakan akun yang berbeda. | | `OMNIROUTE_NADIR_BASE_URL` | `https://api.getnadir.com` | `open-sse/services/autoCombo/nadirStrategy.ts` | Asal dasar keputusan Nadir API, digunakan ketika `config.nadir.baseUrl` kombo itu sendiri tidak disetel. Hanya diperlukan untuk Nadir yang dihosting sendiri, yang menyimpan pesan cepat di dalam jaringan Anda sendiri. `/v1` yang tertinggal ditoleransi dan dilucuti. | | `OMNIROUTE_API_KEY_WEEKLY_WINDOW` | `provider` | `src/lib/usage/apiKeyUsageLimits.ts` | Jendela mingguan untuk batas penggunaan USD per kunci API (penegakan permintaan, `GET /api/keys/{id}/usage-limits`, `@@om-usage`). `provider`: minggu berakhir pada reset mingguan paling awal di antara koneksi upstream yang dapat dijangkau oleh kunci, atau merupakan 7 hari bergulir ketika tidak ada yang diketahui. `calendar`: minggu lokal dari Senin 00:00 hingga Senin berikutnya 00:00, sama untuk setiap kunci. `calendar` direkomendasikan ketika satu kumpulan akun upstream digunakan bersama oleh banyak kunci yang dianggarkan secara individual. Nilai yang tidak valid dikembalikan ke `provider`. | | `OMNIROUTE_API_KEY_WEEKLY_WINDOW_TIMEZONE` | _(zona waktu proses)_ | `src/lib/usage/apiKeyUsageLimits.ts` | zona waktu IANA (misalnya `Asia/Shanghai`) yang menentukan Senin 00:00 untuk jendela mingguan `calendar`. Tidak disetel atau tidak valid: zona waktu proses OmniRoute ( `TZ` host atau penampung, yang sering kali tidak disetel, yaitu Waktu Universal Terkoordinasi, dalam gambar penampung). Diabaikan dalam mode `provider`. | | `OMNIROUTE_MAX_TOOLS_LIMIT` | `128` | `open-sse/config/constants.ts` | Default jumlah maksimum alat yang diperbolehkan dalam permintaan (OpenAI default). Hanya bilangan bulat positif; nilai yang tidak disetel atau tidak valid tetap `128`. Penyedia dengan batas known/proactive (`grok-cli` 200, `nvidia` 1536) masih menerapkan batasnya sendiri — ini hanya memindahkan batas atas default. Target berformat Claude tidak memiliki batasan default ( API Pesan tidak memilikinya); batas yang dipelajari masih berlaku. | | `OMNIROUTE_TOOL_OUTPUT_IMAGE_MAX_COUNT` | `16` | `open-sse/translator/request/openai-responses.ts` | Tanggapan terhadap terjemahan Obrolan: berapa banyak gambar keluaran alat (`function_call_output`, `custom_tool_call_output`, peran `tool`) yang dikirim ulang sebagai bagian gambar pengguna per permintaan. Yang terbaru disimpan dan setiap yang lama menjadi pengganti teks dengan `tool_call_id`-nya. Hanya bilangan bulat positif; nilai yang tidak disetel atau tidak valid tetap `16`. | | `OMNIROUTE_TOOL_OUTPUT_IMAGE_MAX_BYTES` | `20971520` (20 MB) | `open-sse/translator/request/openai-responses.ts` | Ukuran total gambar keluaran alat URLs dikirim ulang per permintaan dalam terjemahan yang sama. Gambar yang melebihi anggaran akan dihapus paling lama terlebih dahulu, dengan satu peringatan per permintaan. Hanya bilangan bulat positif; nilai yang tidak disetel atau tidak valid tetap `20971520`. | | `OMNIROUTE_RESPONSES_STRICT_TOOL_HISTORY` | `false` | `open-sse/translator/helpers/responsesToolHistory.ts` | Cara penanganan riwayat alat Responses yang tidak konsisten: keluaran tanpa panggilan, panggilan tanpa keluaran, `call_id` yang hilang, terlalu panjang, atau tidak valid, atau format argumen historis yang salah. Mati, OmniRoute memperbaiki riwayat dan mengirimkannya (output yatim piatu dihilangkan, panggilan yang tidak terjawab mendapatkan output kosong, id dicetak atau dijepit, argumen yang salah format menjadi `{}`). Aktif, permintaan mendapat `400` sebelum dikirim; riwayat yang valid diteruskan dengan id panggilan dan argumen JSON saat dikirim. Menerima `true` atau `1`; nilai lainnya tetap default. | | `OMNIROUTE_PROMPT_EMULATE_TOOLS` | _(pada)_ | `open-sse/executors/syntxChat.ts` | pemanggilan alat yang ditiru oleh perintah SYNTX.ai: tidak disetel atau `1`/`true`/`on`/`yes` memasukkan katalog alat lokal ke dalam prompt; nilai lainnya (misalnya `0`) melewatkan injeksi itu. | --- ## 7. URLs & Sinkronisasi Cloud | Variabel | Bawaan | Berkas Sumber | Keterangan | | ------------------------------------------- | --------------------------------------------------------- | --------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `BASE_URL` | `http://localhost:20128` | `src/lib/cloudSync.ts` | URL sisi server untuk panggilan pekerjaan sinkronisasi internal `/api/sync/cloud`. Simpan ini sebagai loopback/container URL bahkan ketika aplikasi diproksi secara publik. keterampilan A2A juga menggunakannya (lihat `OMNIROUTE_BASE_URL`) dan gagal daripada mengirim kunci API ke http biasa URL. | | `CLOUD_URL` | _(kosong)_ | `src/lib/cloudSync.ts` | Titik akhir relai cloud URL (fitur premium). | | `CLOUD_SYNC_TIMEOUT_MS` | `12000` | `src/lib/cloudSync.ts` | batas waktu HTTP untuk permintaan sinkronisasi cloud. | | `OMNIROUTE_BUILD_PROFILE` | `full` | Konfigurasi pembuatan webpack | Profil waktu pembuatan (setel ke `minimal` untuk secara fisik mengecualikan modul istimewa dari bundel). | | `OMNIROUTE_STANDALONE_DIR` | _.build/ keluaran mandiri_ | `scripts/build/colocate-standalone.mjs` | Penggantian waktu pembangunan untuk direktori keluaran mandiri yang digunakan oleh langkah kolokasi pasca-pembuatan. Bukan pengaturan runtime. | | `OMNIROUTE_DIST_DIR` | `dist/` (akar repo) | `scripts/build/prepublish.ts` | Penggantian waktu build untuk direktori tempat langkah penerbitan (`prepublish.ts`) menulis bundel CLI, bukan `dist/` di bawah root repo. Direktori dihapus sebelum pembangunan. Bukan pengaturan runtime. | | `OMNIROUTE_CLOUD_SYNC_SECRET` | _(kosong)_ | `src/lib/cloudSync.ts` | Rahasia bersama digunakan untuk memverifikasi tanda tangan HMAC-SHA256 dari respons Cloud Sync. | | `OMNIROUTE_CLOUD_SYNC_SECRETS` | `false` | `src/lib/cloudSync.ts` | Setel ke `true` untuk mengizinkan titik akhir Cloud Sync menimpa kredensial lokal. Standarnya adalah `false`. | | `OMNIROUTE_CLOUD_SYNC_ENFORCE_SIGNATURE` | `false` | `src/lib/cloudSync.ts` | Setel ke `true` untuk menolak respons Cloud Sync yang tidak ditandatangani ketika tidak ada rahasia lokal yang dikonfigurasi (#13679). Tanda tangan yang ada selalu diverifikasi — dan selalu ditolak ketika `OMNIROUTE_CLOUD_SYNC_SECRET` tidak disetel — apa pun tandanya. Defaultnya terbalik untuk diterapkan di v3.9. | | `OMNIROUTE_ZED_IMPORT_LEGACY_ONE_STEP` | `false` | `src/app/api/providers/zed/import/route.ts` | Setel ke `true` untuk kembali ke perilaku "impor semuanya" satu langkah v3.8.5 tanpa konfirmasi pengguna. | | `NEXT_PUBLIC_BASE_URL` | `http://localhost:20128` | OAuth, Dasbor, sinkronisasi | URL yang dapat diakses publik untuk OAuth redirect_uri, tautan Dashboard, dan URLs publik yang dihasilkan. Setel ini ke URL publik yang stabil ketika panggilan balik OAuth atau tautan browser yang dihasilkan harus menggunakan host proksi terbalik kanonik. | | `NEXT_PUBLIC_CLOUD_URL` | _(kosong)_ | Sisi klien | Cermin sisi klien `CLOUD_URL`. | | `NEXT_PUBLIC_APP_URL` | _(tidak disetel)_ | `src/shared/services/cloudSyncScheduler.ts` | Penggantian lama untuk `NEXT_PUBLIC_BASE_URL`. | | `NEXT_PUBLIC_PORT` | _(tidak disetel — kembali ke `PORT`)_ | `src/shared/hooks/useDisplayBaseUrl.ts` | Port cadangan sisi klien untuk menampilkan URLs ketika asal usulnya tidak diketahui (SSR/tests); baca sebelum `PORT`. | | `OMNIROUTE_PUBLIC_BASE_URL` | _(tidak disetel)_ | Resolver asal publik, image URLs | Asal OmniRoute yang menghadap browser dengan prioritas tertinggi digunakan untuk pembuatan URL publik dan validasi asal browser non-dasbor. Setel ini ketika OpenWebUI atau relai lain mencapai OmniRoute oleh URL internal tetapi browser pengguna harus mengambil media yang dihasilkan dari LAN, terowongan, atau asal publik. Melakukan** bukan** termasuk `/v1`. | | `OMNIROUTE_PROVIDER_MANIFEST_URL` | _(tidak disetel)_ | `open-sse/config/providerPluginManifestUrl.ts` | Manifes plugin penyedia absolut URL diiklankan ke klien sespan. Jika tidak disetel, OmniRoute memperoleh `/api/v1/provider-plugin-manifest` dari asal permintaan atau HOST/PORT. | | `OMNIROUTE_PUBLIC_PROTOCOL` | `http` | `open-sse/config/providerPluginManifestUrl.ts` | Protokol yang digunakan saat menurunkan manifes plugin penyedia URL dari HOST/PORT tanpa asal permintaan. Setel ke `https` di belakang proxy publik yang mengakhiri TLS ketika tidak ada `OMNIROUTE_PROVIDER_MANIFEST_URL` eksplisit yang disetel. | | `OMNIROUTE_TRUST_PROXY` | _(tidak disetel)_ | `src/server/origin/publicOrigin.ts` | Mode kepercayaan opsional untuk header asal publik yang diteruskan. Hapus = jangan percaya `Forwarded` / `X-Forwarded-*` untuk keputusan keamanan. `true` / `loopback` trust meneruskan host/proto hanya dari proxy loopback yang diberi stempel token. `private` / `lan` juga memercayai rekan proxy LAN pribadi, membiarkan jembatan `API_PORT` menyimpan `X-Forwarded-For` rekan tersebut, dan memungkinkan rute LOCAL_ONLY menerima klien jaringan pribadi yang dilaporkan oleh proxy tersebut (tidak pernah ada permintaan terowongan Cloudflare, rantai khusus loopback, atau gerbang token CLI khusus loopback). Lebih suka `NEXT_PUBLIC_BASE_URL` eksplisit dalam produksi. | | `KIE_CALLBACK_URL` | _(tidak disetel)_ | `open-sse/utils/kieTask.ts` | URL panggilan balik publik untuk pekerjaan kie.ai asinkron. Penggantian prioritas tertinggi sebelum `OMNIROUTE_KIE_CALLBACK_URL` dan `OMNIROUTE_PUBLIC_URL`. | | `OMNIROUTE_KIE_CALLBACK_URL` | _(tidak disetel)_ | `open-sse/utils/kieTask.ts` | Ejaan alternatif dari `KIE_CALLBACK_URL`. Fall back ketika variabel utama tidak disetel. | | `OMNIROUTE_PUBLIC_URL` | _(tidak disetel)_ | `open-sse/utils/kieTask.ts` | Asal publik digunakan untuk membuat panggilan balik async URLs. Penggantian prioritas terendah untuk panggilan balik kie.ai; juga digunakan sebagai URL publik generik untuk relay lainnya. | | `OMNIROUTE_CROF_USAGE_URL` | `https://crof.ai/usage_api/` | `open-sse/services/usage.ts` | titik akhir pencarian kuota CrofAI yang digunakan oleh halaman Penggunaan. Penggantian untuk relai/perlengkapan pengujian. | | `OMNIROUTE_CLINEPASS_USAGE_URL` | `https://api.cline.bot/api/v1/users/me/plan/usage-limits` | `open-sse/services/usage/clinepass.ts` | ClinePass titik akhir kuota 5 jam / mingguan / bulanan yang digunakan oleh halaman Penggunaan. Penggantian untuk relai/perlengkapan pengujian. | | `OMNIROUTE_OPENCODE_QUOTA_URL` | `https://opencode.ai/zen/go/v1/usage` | `open-sse/services/opencodeQuotaFetcher.ts` | Titik akhir penggunaan OpenCode Go resmi yang diautentikasi dengan kunci API yang digunakan oleh halaman Penggunaan. Penggantian untuk relai/perlengkapan pengujian. | | `OPENCODE_SYNTHESIZE_CLI_HEADERS` | `true` | `open-sse/executors/opencode.ts` | Sintesiskan header identitas OpenCode CLI (User-Agent, x-opencode-client/project, request/session UUIDs) pada permintaan upstream opencode-go/zen yang tidak dikirim oleh klien, sehingga Cloudflare di VPS egress menerimanya (#6210/#5997). Aktif secara default sejak #10571; menyisih dengan `false`/`0`/`no`/`off`. | | `OPENCODE_USER_AGENT` | `opencode/1.18.31` | `open-sse/utils/opencodeHeaders.ts` | Agen Pengguna Default digunakan saat `OPENCODE_SYNTHESIZE_CLI_HEADERS` aktif dan tidak ada penggantian `_USER_AGENT` per penyedia yang disetel. Hanya berlaku untuk pelaksana opencode. Pada permintaan tanpa kunci di gerbang hulu, nilai yang dikonfigurasi yang tidak membawa `opencode/= 1.17>` diganti dengan default ini daripada ditolak. | | `OMNIROUTE_FORWARD_ATTRIBUTION` | `1` (aktif) | `open-sse/utils/opencodeHeaders.ts` | Meneruskan header atribusi aplikasi klien (`x-session-id`, `x-title`, `http-referer`) ke penyedia upstream, sehingga permintaan yang dimulai di dalam harness yang terdaftar mempertahankan identitasnya melalui router ( kunci gerbang penerbit OpenRouter di sini). `0`/`false`/`no`/`off` mempertahankan identitas registry/operator dan menghilangkan nilai yang diberikan klien. Header khusus yang dikonfigurasi oleh operator selalu memenangkan nilai klien. | | `OPENCODE_CLIENT` | `desktop` | `open-sse/executors/opencode.ts` | Nilai untuk header `x-opencode-client` yang disintesis saat `OPENCODE_SYNTHESIZE_CLI_HEADERS` aktif. | | `OPENCODE_PROJECT` | `global` | `open-sse/executors/opencode.ts` | Nilai untuk header `x-opencode-project` yang disintesis saat `OPENCODE_SYNTHESIZE_CLI_HEADERS` aktif. | | `OMNIROUTE_EGRESS_IP_LOCK_PROVIDERS` | _(tidak disetel)_ | `open-sse/config/providerErrorRules.ts` | Kumpulan penyedia efektif yang kegagalan hulunya dimasukkan ke dalam egress IP (satu 429 taman setiap koneksi saudaranya berbagi IP). Tidak disetel menggunakan `opencode,opencode-go,opencode-cli` default tingkat gratis; `none`/`off`/`false`/`0` menonaktifkan kaskade sepenuhnya; daftar yang dipisahkan koma menggantikan himpunan. Paket berbayar dimasukkan ke dalam akun upstream dan dapat menonaktifkannya dengan aman (#9611). | | `OMNIROUTE_EGRESS_QUOTA_ROTATION_PROVIDERS` | _(tidak disetel)_ | `open-sse/config/providerErrorRules.ts` | Cakupan rotasi jalan keluar penolakan kuota. Unset menyisihkan anggota kumpulan pada 429 hanya untuk keluarga IP-bucket di atas; `all` memperluas penulisan itu ke setiap penyedia, sehingga batas tarif yang diterima melalui anggota membuat pilihan berikutnya keluar di tempat lain. Nilai apa pun selain `all` diabaikan. Membutuhkan `PROXY_SKIP_RECENTLY_FAILED` (diaktifkan secara default). Toko dikunci berdasarkan alamat keluar, bukan (penyedia, alamat), sehingga diperluas 429 taman yang menjadi anggota untuk setiap penyedia hingga periode tersebut berlalu (5 menit, dua kali lipat menjadi 15). Baca per hasil respons, sehingga perubahan diterapkan tanpa memulai ulang. | | `OPENCODE_FREE_TIER_REQUEST_CONTRACT` | _(tidak disetel)_ | `open-sse/executors/opencodeFreeTierContract.ts` | Setel ke `off` untuk berhenti menyesuaikan isi permintaan OpenCode tanpa kunci (tanda streaming dan daftar alat). Header masih diterapkan. Baca per permintaan, sehingga perubahan segera berlaku. | | `OPENCODE_FREE_TIER_PLACEHOLDER_TOOLS` | _(tidak disetel)_ | `open-sse/executors/opencodeFreeTierContract.ts` | Nama alat yang dipisahkan koma untuk mendeklarasikan permintaan OpenCode tanpa kunci yang tidak membawa apa pun, ketika belum ada yang diamati untuk model tersebut. Kosong jatuh kembali ke satu placeholder yang modelnya diberitahu untuk tidak dipanggil. Paling banyak 32 entri, `[A-Za-z_][A-Za-z0-9_-]{0,63}`; entri yang tidak valid diabaikan. | | `OPENCODE_FREE_TIER_CREDENTIAL` | `public` | `open-sse/executors/opencodeFreeTierContract.ts` | Kredensial dikirim di jalur tingkat bebas yang terjaga keamanannya (`https://opencode.ai/inference/v1`). Sejak 21-10-2026 jalur tersebut menjawab 403 `Model access is disabled` ke kunci API asli dan menyajikan literal anonim sebagai gantinya. `key` menyimpan kunci API operator, `none`/`off` tidak mengirimkan header kredensial, literal lainnya dikirim sebagai token pembawa. Baca per permintaan. | | `OPENCODE_FREE_TIER_RELAY_URL` | tidak disetel | `src/lib/opencodeFreeRelay.ts` | Basis URL dari relai Bun untuk permintaan OpenCode tingkat gratis yang terjaga keamanannya. Jika disetel, permintaan tersebut membawa perintah sistem OpenCode CLI dan kumpulan alat serta dikirim melalui relai (`scripts/ops/opencode-free-relay.ts`), karena upstream menjawab 429 ke klien non-Bun HTTP. Loopback URLs dimulai dengan server ketika `bun` aktif PATH; jalur di URL diabaikan. `http://` biasa hanya diterima untuk host loopback (`localhost`, `127.0.0.0/8`, `::1`); host lain mana pun harus menggunakan `https://`, jika tidak, permintaan akan gagal dengan kesalahan eksplisit. Hanya Penyelesaian Obrolan. Baca per permintaan. | | `OPENCODE_FREE_RELAY_BUN` | `bun` di PATH | `src/lib/opencodeFreeRelay.ts` | Bun biner digunakan untuk memulai relai. | | `OPENCODE_FREE_RELAY_SCRIPT` | `scripts/ops/opencode-free-relay.ts` di bawah root paket | `src/lib/opencodeFreeRelay.ts` | Jalur skrip relai. Defaultnya diselesaikan dari root paket yang diinstal, lalu direktori kerja. | | `OPENCODE_FREE_RELAY_HOST` | `127.0.0.1` | `scripts/ops/opencode-free-relay.ts` | Relay mendengarkan tuan rumah. | | `OPENCODE_FREE_RELAY_PORT` | `20199` | `scripts/ops/opencode-free-relay.ts` | Port mendengarkan relai. | | `OPENCODE_FREE_RELAY_UPSTREAM` | `https://opencode.ai` | `scripts/ops/opencode-free-relay.ts` | Asal relai diteruskan ke. Harus `https://` (`http://` hanya untuk asal pengujian loopback); relai menolak untuk memulai sebaliknya. | | `OPENCODE_FREE_RELAY_TOKEN` | tidak disetel | `scripts/ops/opencode-free-relay.ts`, `open-sse/executors/opencodeRelay.ts` | Rahasia bersama. OmniRoute mengirimkannya dalam `x-opencode-relay-auth`; relay menjawab 401 tanpa itu. Diperlukan: relai dengan `OPENCODE_FREE_RELAY_HOST` non-loopback menolak untuk memulai tanpanya. | | `OPENCODE_FREE_RELAY_PROXY_ALLOWLIST` | tidak disetel | `scripts/ops/opencode-free-relay.ts` | Proksi jalan keluar `host` atau `host:port` yang dipisahkan koma yang diterima relai non-loopback dari penelepon (`x-opencode-relay-proxy`); proxy lainnya menjawab 403. Diabaikan pada ikatan loopback. | | `OMNIROUTE_OLLAMA_CLOUD_USAGE_URL` | `https://ollama.com/settings` | `open-sse/services/usage.ts` | Ollama Pengaturan cloud URL digunakan untuk pengikisan kuota. Penggantian untuk relai/perlengkapan pengujian. | | `OMNIROUTE_OLLAMA_CLOUD_BALANCE_URL` | `https://ollama.com/api/balance` | `open-sse/services/ollamaCloudBalance.ts` | Ollama Cloud mendokumentasikan titik akhir keseimbangan hulu (`GET https://ollama.com/api/balance`, `Authorization: Bearer `). Baca sekali saat memuat modul. Digunakan pertama kali untuk kuota Ollama Cloud ketika koneksi memiliki kunci API ; pengikis cookie halaman pengaturan tetap sebagai cadangan. Penggantian untuk relai/perlengkapan pengujian. | | `OLLAMA_USAGE_COOKIE` | _(tidak disetel)_ | `open-sse/services/usage.ts` | Ollama Cloud `__Secure-session` cookie digunakan untuk pengikisan kuota halaman pengaturan. Peka; lebih memilih bidang Dasbor per koneksi ketika beberapa akun dikonfigurasi. | | `OLLAMA_CLOUD_USAGE_COOKIE` | _(tidak disetel)_ | `open-sse/services/usage.ts` | Env cookie Ollama Cloud `__Secure-session` alternatif var. Peka; lebih memilih bidang Dasbor per koneksi ketika beberapa akun dikonfigurasi. | | `OMNIROUTE_OLLAMA_USAGE_COOKIE` | _(tidak disetel)_ | `open-sse/services/usage.ts` | Alternatif Ollama Cloud `__Secure-session` cookie env var digunakan sebelum alias yang lebih pendek. Peka; lebih memilih bidang Dasbor per koneksi ketika beberapa akun dikonfigurasi. | | `OMNIROUTE_CODEWHISPERER_BASE_URL` | `https://codewhisperer.us-east-1.amazonaws.com` | `open-sse/services/usage.ts` | CodeWhisperer (AWS Kiro) batas penggunaan titik akhir. Penggantian untuk relai/perlengkapan pengujian. | > [!IMPORTANT] > Saat menerapkan di belakang proxy terbalik (nginx, Caddy), setel `NEXT_PUBLIC_BASE_URL` ke URL publik stabil Anda (misalnya, `https://omniroute.example.com`) ketika panggilan balik OAuth atau tautan publik yang dihasilkan harus menggunakan nama host tersebut. Tanpa ini, panggilan balik OAuth bisa gagal karena redirect_uri tidak cocok dan tautan publik yang dihasilkan dapat mengarah ke asal penampung internal. > > Pertahankan `BASE_URL` sebagai loopback/container URL internal untuk pekerjaan server-ke-server. Jangan gunakan browser `Origin` atau nama host publik untuk pengambilan mandiri internal yang mengandung kredensial. > > Penulisan dasbor yang diautentikasi tidak memerlukan basis publik statis URL: dasbor mengirimkan permintaan tidak aman asal yang sama dengan token CSRF yang terikat sesi. OmniRoute masih memusatkan validasi asal publik untuk integrasi browser non-dasbor: URL env vars publik eksplisit dipercaya terlebih dahulu; header `Forwarded` / `X-Forwarded-*` mentah diabaikan kecuali `OMNIROUTE_TRUST_PROXY` diaktifkan dan rekan proxy langsung diberi cap sebagai tepercaya. Jangan gunakan pengaturan CORS untuk memperbaiki permintaan dasbor asal yang sama; CORS hanya untuk klien browser lintas asal. --- ## 8. Proksi Keluar Rutekan panggilan penyedia LLM hulu melalui proksi HTTP atau SOCKS5 untuk kontrol jalan keluar, perutean geografis, atau penyembunyian IP. `OMNIROUTE_UPSTREAM_HTTP2_ENABLED` defaultnya adalah `true`. Setel ke `false`, `0`, `no`, atau `off` untuk memaksa HTTP/1.1 pada operator Undici di `open-sse/utils/proxyDispatcher.ts` dan `open-sse/utils/proxyFetch.ts`: jalan keluar langsung, proksi HTTP(S)/SOCKS, relai, dan percobaan ulang soket baru. Ini mempertahankan verifikasi sertifikat TLS, otentikasi proxy, batas koneksi, dan pengaturan tetap hidup. Mulai ulang OmniRoute setelah mengubahnya karena operator di-cache dan agen relai dibuat saat startup. Switch tidak mengontrol sidik jari wreq TLS atau transportasi khusus penyedia. | Variabel | Bawaan | Berkas Sumber | Keterangan | | ---------------------------------------- | ----------------- | ---------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | `ENABLE_SOCKS5_PROXY` | `true` | `open-sse/executors` | Aktifkan agen proksi SOCKS5 untuk panggilan upstream. Memilih untuk tidak ikut serta dengan `false`. | | `OMNIROUTE_GZIP_REQUEST_BODIES` | `true` | `open-sse/executors/base/gzipRequestBody.ts` | Gzip isi permintaan yang dikirim ke `api.anthropic.com` resmi (4096 karakter +, hanya koneksi langsung; dilewati di belakang proxy, peniruan TLS atau `NODE_EXTRA_CA_CERTS`). Anthropic hanya menerima gzip. Pengodean yang ditolak (415, 400/403 non-Antropik, atau parse JSON asal 400) dikirim ulang tanpa dikompresi satu kali dan asal tetap tidak dikompresi selama satu jam. Menyisih dengan `0`, `false`, `off` atau `no`. | | `NEXT_PUBLIC_ENABLE_SOCKS5_PROXY` | `true` | Sisi klien | Kesadaran sisi klien tentang ketersediaan SOCKS5. | | `PROXY_SKIP_RECENTLY_FAILED` | `true` | `src/shared/utils/featureFlags.ts` | Tanda fitur bawaan (lihat [FEATURE_FLAGS.md](./FEATURE_FLAGS.md) ; penggantian DB dasbor menang). Kumpulan proxy dan rotasi per akun berhenti melayani anggota yang baru saja gagal (menolak penyelidikan TCP, atau 429 melaluinya) untuk jangka waktu yang berlipat ganda pada setiap pengulangan, hingga batas tertentu. `false` mengembalikan pilihan biasa. | | `SELECTOR_CONTROL_ALLOWLIST` | _(tidak disetel)_ | `src/lib/proxySubscription/selectorGuard.ts` | Daftar yang diizinkan untuk target kontrol pemilih inti lokal di luar loopback (comma/space memisahkan host atau IPs, `*` membuka LAN/private tetapi tidak pernah metadata/link-local). Loopback melalui http/https diperbolehkan secara default. Nilai DB dasbor menang atas variabel ini jika disetel dan tidak kosong. | | `PROXY_QUOTA_429_BASE_MS` | `300000` | `open-sse/utils/proxyRefusalMemory.ts` | Periode dasar (ms) dari 429 penyisihan, dua kali lipat pada setiap pengulangan. Baca sekali saat startup. Dibatasi ke `1000..3600000`; di luar jangkauan atau tidak dapat dibaca kembali ke default dengan peringatan. | | `PROXY_QUOTA_429_MAX_MS` | `900000` | `open-sse/utils/proxyRefusalMemory.ts` | Batas (ms) dari 429 yang disisihkan. Baca sekali saat startup. Dibatasi ke `1000..3600000`; di luar jangkauan atau tidak dapat dibaca kembali ke default dengan peringatan. Ketika tutupnya berada di bawah dasar, maka akan kembali ke default. Menurunkan batas juga memperpendek lupa beruntun: entri membersihkan `2 x max` setelah habis masa berlakunya. | | `PROXY_POOL_SHARED_EGRESS_ORDER` | `false` | `src/shared/utils/featureFlags.ts` | Tanda fitur keikutsertaan (lihat [FEATURE_FLAGS.md](./FEATURE_FLAGS.md) ; penggantian DB dasbor menang). Untuk penyedia yang kuotanya dikelompokkan berdasarkan alamat keluar, beri peringkat anggota kumpulan yang membagikan alamat keluar anggota yang baru saja ditolak, tepat di bawah anggota yang sehat. Hanya pesanan, tidak pernah dikecualikan. Membutuhkan `PROXY_SKIP_RECENTLY_FAILED`, yang menghasilkan sinyal penolakan yang dibacanya. | | `PROXY_WEBHOOK_REBOUND_MS` | `300000` | `src/lib/proxyEvents/proxyTransitionBridge.ts` | Jendela pantulan (ms) membatasi peringatan webhook `proxy.set_aside` berulang per anggota kumpulan sehingga ledakan penolakan mengirimkan satu peristiwa. Baca pada setiap emisi. Dibatasi hingga `1000..3600000`; di luar jangkauan atau tidak dapat dibaca kembali ke default secara diam-diam. | | `HTTP_PROXY` | _(tidak disetel)_ | standar Node.js | proksi HTTP untuk panggilan upstream. | | `HTTPS_PROXY` | _(tidak disetel)_ | standar Node.js | proksi HTTPS untuk panggilan upstream. | | `ALL_PROXY` | _(tidak disetel)_ | standar Node.js | Proksi universal (mendukung `socks5://`). | | `OMNIROUTE_PROXY_ECHO_URL` | _(tidak disetel)_ | `src/lib/proxyEchoTarget.ts` | Menyematkan target echo-IP yang digunakan oleh probe jalan keluar proksi ke satu URL. Tidak disetel, probe mencoba `api64.ipify.org` lalu `api4.ipify.org` sehingga terowongan IPv4-only tidak dilaporkan mati (#9694). | | `NO_PROXY` | _(tidak disetel)_ | standar Node.js | hostnames/IPs yang dipisahkan koma untuk melewati proxy. | | `OMNIROUTE_PROXY_DISPATCHER_CONNECTIONS` | `32` | `open-sse/utils/proxyDispatcher.ts` | Maksimum soket serentak per operator proksi HTTP/SOCKS yang di-cache. Aliran SSE yang berumur panjang seperti Codex `/v1/responses` memerlukan lebih dari satu koneksi ketika beberapa permintaan berbagi proksi tingkat akun yang sama. Nilai di atas `256` dibatasi. | | `SOCKS_HANDSHAKE_TIMEOUT_MS` | `10000` | `open-sse/utils/socksConnectorWithFamily.ts` | batas waktu jabat tangan (koneksi)SOCKS5 dalam ms. Naikkan ketika satu host gateway perumahan terkena konkurensi tinggi (misalnya 100 permintaan simultan) — jabat tangan sebenarnya dapat melebihi 10 detik dalam kumpulan jenuh meskipun proksi dapat dijangkau, yang jika tidak maka akan muncul sebagai `[Proxy Fast-Fail] Proxy unreachable` palsu. Dibatasi pada `120000`. | | `PROXY_FAIL_OPEN` | `false` | `src/sse/handlers/chatHelpers.ts` | Ketika `false` (default), permintaan yang proksinya gagal diselesaikan adalah** ditolak (gagal-ditutup)** daripada kembali ke koneksi langsung, — mencegah kebocoran IP asli. Atur `true` untuk memulihkan fallback DIRECT lama. | | `ENABLE_TLS_FINGERPRINT` | `false` | `open-sse/executors` | Memalsukan sidik jari TLS menggunakan wreq-js (meniru Chrome 124). Menghitung pemblokiran JA3/JA4. | | `TLS_FINGERPRINT_PROVIDERS` | _(tidak disetel)_ | `open-sse/utils/proxyFetch.ts` | Daftar penyedia yang dipisahkan koma untuk perutean TLS baru yang diproksi (`open-sse/utils/proxyFetch.ts`). TLS langsung mempertahankan perilaku warisannya saat tidak disetel; hanya penyedia ini yang melakukan rute melalui jembatan sidik jari Chrome-124. Groq (`api.groq.com`) dikecualikan meskipun daftar yang diizinkan tidak disetel, karena Chrome JA3 memicu Cloudflare 1010 sementara undici asli mencapai API. | | `OMNIROUTE_TURNSTILE_IGNORE_TLS_ERRORS` | `false` | `open-sse/services/claudeTurnstileSolver.ts` | Izinkan konteks browser Claude Turnstile Playwright mengabaikan kesalahan sertifikat HTTPS. | ### Skenario | Skenario | Konfigurasi | | ----------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------- | | **SOCKS5 melalui terowongan SSH** | `ALL_PROXY=socks5://127.0.0.1:7890`, `ENABLE_SOCKS5_PROXY=true` | | **Proksi HTTP perusahaan** | `HTTP_PROXY=http://proxy.corp.com:3128`, `HTTPS_PROXY=http://proxy.corp.com:3128`, `NO_PROXY=localhost,internal.corp.com` | | **Anti-sidik jari** | `ENABLE_TLS_FINGERPRINT=true` — membutuhkan `wreq-js` (termasuk) | | **Jalan keluar dikontrol / tidak ada akses langsung** | Biarkan `PROXY_FAIL_OPEN=false` (default). Permintaan gagal total ketika proxy tidak tersedia alih-alih bocor melalui langsung. | | **Legacy / dev — memungkinkan fallback langsung** | `PROXY_FAIL_OPEN=true`. Mengembalikan perilaku pra-pengerasan: koneksi langsung digunakan ketika resolusi proxy gagal. | > **Catatan ( validasi NVIDIA melewati — #3226):** Titik akhir validasi kunci API NVIDIA terhenti saat dirutekan melalui pengambilan proxy/TLS-patched global (petugas operator undici → 504). `src/lib/providers/validation.ts::directHttpsRequest()` sengaja melewati patch proxy untuk satu panggilan validasi tersebut menggunakan `safeOutboundFetch({ bypassProxyPatch: true })`. Ini adalah pengecualian yang terdokumentasi dan tercakup — yang dimilikinya** bukan** mempengaruhi jalan keluar chat/usage. Bypass ini disematkan cakupannya oleh `tests/unit/proxy-bypass-scope-guard-3226.test.ts`. --- ## 9. Integrasi Alat CLI Mengontrol bagaimana OmniRoute menemukan dan meluncurkan sidecar CLI ( Kode Claude, Codex, dll.). | Variabel | Bawaan | Berkas Sumber | Keterangan | | --------------------------------- | ------------------------------------------------------- | ----------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `CLI_MODE` | `auto` | `src/shared/services/cliRuntime.ts` | `auto` = sistem pencarian PATH; `manual` = hanya menggunakan jalur eksplisit. | | `CLI_EXTRA_PATHS` | _(tidak disetel)_ | `src/shared/services/cliRuntime.ts` | Entri PATH tambahan untuk penemuan biner CLI (dipisahkan titik dua). | | `CLI_CONFIG_HOME` | _(tidak disetel)_ | `src/shared/services/cliRuntime.ts` | Ganti direktori home untuk membaca konfigurasi CLI (`~/.claude`, `~/.codex`). Harus mutlak dan dalam proses home —** atau** , dalam sebuah wadah, jalur yang diikat (begitulah cara kerja `/host-home` ). Segala sesuatu yang lain kembali ke direktori home. | | `CLI_ALLOW_CONFIG_WRITES` | `true` | `src/shared/services/cliRuntime.ts` | Izinkan OmniRoute untuk menulis file konfigurasi CLI (penyegaran token, data sesi). Setel ke `false` untuk membuat setiap penulisan konfigurasi CLI gagal dengan kesalahan "penulisan dinonaktifkan" yang eksplisit. | | `CLI_CLAUDE_BIN` | `claude` | `src/shared/services/cliRuntime.ts` | Jalur khusus ke biner Claude CLI. | | `CLI_CODEX_BIN` | `codex` | `src/shared/services/cliRuntime.ts` | Jalur khusus ke biner Codex CLI. | | `CLI_DROID_BIN` | `droid` | `src/shared/services/cliRuntime.ts` | Jalur khusus ke biner Droid CLI. | | `CLI_OPENCLAW_BIN` | `openclaw` | `src/shared/services/cliRuntime.ts` | Jalur khusus ke biner OpenClaw CLI. | | `CLI_CURSOR_BIN` | `agent`, lalu `cursor` | `src/shared/services/cliRuntime.ts` | Jalur khusus ke biner agen Cursor. Tanpanya, deteksi mencoba `agent` terlebih dahulu dan kembali ke `cursor`. | | `CLI_CLINE_BIN` | `cline` | `src/shared/services/cliRuntime.ts` | Jalur khusus ke biner Cline CLI. | | `CLI_5DIVE_BIN` | `5dive` | `src/shared/services/cliRuntime.ts` | Jalur khusus ke biner 5dive CLI. | | `CLI_5DIVE_STATE_DIR` | `/var/lib/5dive` | `src/shared/services/cliRuntime.ts` | direktori status sistem 5dive (profil autentikasi milik root); mencerminkan default STATE_DIR 5dive sendiri. | | `CLI_CONTINUE_BIN` | `cn` | `src/shared/services/cliRuntime.ts` | Jalur khusus untuk Melanjutkan biner CLI. | | `CLI_QODER_BIN` | `qodercli` | `src/shared/services/cliRuntime.ts` | Jalur khusus ke biner Qoder CLI. | | `CLI_QWEN_BIN` | `qwen` | `src/shared/services/cliRuntime.ts` | Jalur khusus ke biner Qwen Kode CLI. | | `CLI_AIDER_BIN` | `aider` | `src/shared/services/cliRuntime.ts` | Jalur khusus ke biner Aider CLI. | | `CLI_GOOSE_BIN` | `goose` | `src/shared/services/cliRuntime.ts` | Jalur khusus ke biner Goose CLI. | | `CLI_WHYCODES_BIN` | `whycodes` | `src/shared/services/cliRuntime.ts` | Jalur khusus ke biner WhyCodes CLI. | | `CLI_GEMINI_BIN` | `gemini` | `src/shared/services/cliRuntime.ts` | Jalur khusus ke Google Gemini CLI biner — sisi server hanya memeriksa detection/health ; `omniroute run gemini` menyelesaikan biner `gemini` dari sistem PATH. | | `CLI_KILO_BIN` | `kilocode` | `src/shared/services/cliRuntime.ts` | Jalur khusus ke biner CLI Kode Kilo. | | `CLI_OPENCODE_BIN` | `opencode` | `src/shared/services/cliRuntime.ts` | Jalur khusus ke biner OpenCode CLI. | | `CLI_HERMES_BIN` | `hermes` | `src/shared/services/cliRuntime.ts` | Jalur khusus ke biner Hermes. Dibagikan oleh kedua entri katalog (`hermes` dan `hermes-agent`). | | `CLI_FORGE_BIN` | `forge` | `src/shared/services/cliRuntime.ts` | Jalur khusus ke biner ForgeCode CLI. | | `CLI_JCODE_BIN` | `jcode` | `src/shared/services/cliRuntime.ts` | Jalur khusus ke biner jcode CLI. | | `CLI_DEEPSEEK_TUI_BIN` | `deepseek-tui` | `src/shared/services/cliRuntime.ts` | Jalur khusus ke biner DeepSeek TUI. | | `CLI_CODEWHALE_BIN` | `codewhale` | `src/shared/services/cliRuntime.ts` | Jalur khusus ke biner CodeWhale CLI. | | `CLI_SMELT_BIN` | `smelt` | `src/shared/services/cliRuntime.ts` | Jalur khusus ke biner Smelt CLI. | | `CLI_PI_BIN` | `pi` | `src/shared/services/cliRuntime.ts` | Jalur khusus ke biner Pi (pi-coding-agent). | | `CLI_CRUSH_BIN` | `crush` | `src/shared/services/cliRuntime.ts` | Jalur khusus ke biner Crush CLI. | | `CLI_OMP_BIN` | `omp` | `src/shared/services/cliRuntime.ts` | Jalur khusus ke biner agen Oh My Pi (`omp`). | | `CLI_LETTA_BIN` | `letta` | `src/shared/services/cliRuntime.ts` | Jalur khusus ke biner Letta CLI. | | `CLI_PRIME_AGENT_BIN` | `prime-agent` | `src/shared/services/cliRuntime.ts` | Jalur khusus ke biner Agen Utama (Prime Intellect). | | `CLI_WINDSURF_BIN` | _(tidak ada)_ | `src/shared/services/cliRuntime.ts` | Jalur khusus ke biner Windsurf. kapal Windsurf** tidak ada perintah default** deteksi biner — tetap dinonaktifkan hingga ini disetel. | | `CLI_DEVIN_BIN` | `devin` | `open-sse/executors/devin-cli.ts` | Jalur khusus ke biner CLI Devin (v3.8.0). Digunakan oleh pelaksana Windsurf/Devin. | | `DEVIN_DESKTOP_VERSION` | `3.6.27` | `open-sse/executors/devin-desktop.ts` | Devin Desktop `ide_version`. Penggantian harus menggunakan format `x.y.z` ; nilai yang tidak valid kembali ke default terverifikasi. | | `DEVIN_DESKTOP_EXTENSION_VERSION` | `1.48.2` | `open-sse/executors/devin-desktop.ts` | Paket Codeium/language-server `extension_version`, berbeda dari Desktop `ide_version`. Penggantian harus menggunakan `x.y.z`; nilai yang tidak valid menggunakan paket default. | | `CLI_DEVIN_AGENTIC_BIN` | `devin` | `open-sse/executors/devin-cli-agentic.ts` | Penggantian Devin CLI khusus jembatan agen. Pelaksana hanya menerima ACP stdio lokal di hulu. | | `DEVIN_AGENTIC_HOME` | _(diperlukan)_ | `open-sse/executors/devin-cli-agentic.ts` | Rumah yang benar-benar terisolasi untuk subproses agen Devin ; jalur jembatan yang diterima adalah jalur `/home/bridge` dan tugas-lokal `.sandbox` (di Windows, `C:\...\.sandbox\...`). | | `DEVIN_AGENTIC_ACP_TIMEOUT_MS` | `120000` | `open-sse/executors/devin-cli-agentic.ts` | Durasi maksimum satu putaran Devin ACP sebelum jembatan menghentikan anak dan mengembalikan batas waktu eksplisit. | | `DEVIN_BRIDGE_MODEL` | `devin-cli-agentic/swe-1-7` | `docker/devin-bridge/compose.yml` | Alias model Kode Claude utama untuk jembatan terisolasi. Live harness menggantikan contoh dengan model yang dikembalikan oleh akun Devin saat ini. | | `DEVIN_BRIDGE_SONNET_MODEL` | `DEVIN_BRIDGE_MODEL` | `docker/devin-bridge/compose.yml` | Alias jembatan terisolasi digunakan ketika Kode Claude meminta Soneta defaultnya. | | `DEVIN_BRIDGE_OPUS_MODEL` | `DEVIN_BRIDGE_MODEL` | `docker/devin-bridge/compose.yml` | Alias jembatan terisolasi digunakan ketika Kode Claude meminta default Opusnya. | | `DEVIN_BRIDGE_HAIKU_MODEL` | `DEVIN_BRIDGE_MODEL` | `docker/devin-bridge/compose.yml` | Alias jembatan terisolasi digunakan ketika Kode Claude meminta default Haiku-nya. | | `DEVIN_BRIDGE_SUBAGENT_MODEL` | `DEVIN_BRIDGE_MODEL` | `docker/devin-bridge/compose.yml` | Alias jembatan terisolasi digunakan untuk subagen Kode Claude. | | `DEVIN_SEAT_API_URL` | `https://server.codeium.com` | `open-sse/services/usage/devinCli.ts` | Penggantian opsional untuk manajemen kursi Codeium API yang digunakan oleh kuota Devin CLI (`GetUserStatus`). | | `AUGGIE_BIN` | `auggie` | `open-sse/executors/auggie.ts` | Penggantian jalur absolut untuk biner CLI Augment (Auggie) yang digunakan oleh penyedia `auggie` lokal. Kembali ke `CLI_AUGGIE_BIN`, lalu pencarian PATH. | | `CLI_AUGGIE_BIN` | `auggie` | `open-sse/executors/auggie.ts` | Penggantian alias untuk jalur biner CLI Augment (Auggie) (dicentang setelah `AUGGIE_BIN`). | | `ZCODE_BIN` | `zcode` | `open-sse/executors/zcode.ts` | Biner digunakan untuk klien stdio penyedia `zcode` lokal. Kembali ke `zcode` di PATH. | | `ZCODE_ARGS` | — | `open-sse/executors/zcode.ts` | JSON array (≤ 16 string) argumen tambahan diteruskan ke biner `zcode` saat diluncurkan melalui `cliTools`. | | `ZCODE_CWD` | `process.cwd()` | `open-sse/executors/zcode.ts` | Direktori kerja untuk subproses server aplikasi ZCode. | | `ZCODE_TRANSPORT` | `app-server` | `open-sse/executors/zcode.ts` | `app-server` (default) atau `gateway`.** Eksperimental / tidak didukung:** `gateway` mengirimkan permintaan Z.AI Coding Plan HTTP langsung dengan mereproduksi protokol klien ZCode (menandatangani jabat tangan dan header bukti kerja klien 0.16.9) dan mungkin rusak saat ZCode diperbarui. Ia hanya menerima profil Paket Pengkodean Individu. | | `ZCODE_PROVIDER_ID` | `account:zai-individual-coding-plan` | `open-sse/executors/zcode.ts` | Profil penyedia asli yang tepat untuk pemilihan model. Jika tidak disetel, profil akun Paket Individu akan digunakan, kembali ke `builtin:zai-coding-plan` (entri konfigurasi yang menyimpan kunci Paket Pengkodean Individu). Tetapkan ID yang tepat seperti `account:zai-start-plan` untuk menyematkan profil itu; profil yang disematkan tidak akan pernah mundur. | | `ZCODE_SERVER_RUNTIME_ROOT` | `~/.zcode/server` | `open-sse/executors/zcode.ts` | Root runtime server aplikasi ZCode (tempat `node` dan `zcode-server.cjs` yang dibundel berada). | | `ZCODE_SERVER_NODE` | `/node` | `open-sse/executors/zcode.ts` | Node yang dapat dieksekusi digunakan untuk menghosting server aplikasi ZCode. | | `ZCODE_SERVER_ENTRY` | `/zcode-server.cjs` | `open-sse/executors/zcode.ts` | Skrip entri server aplikasi yang digunakan untuk menghosting server ZCode. | | `ZCODE_STARTUP_TIMEOUT_MS` | `10000` | `open-sse/executors/zcode.ts` | Batas waktu startup (ms) sebelum peluncuran server aplikasi ZCode dianggap gagal. | | `ZCODE_RPC_TIMEOUT_MS` | `30000` | `open-sse/executors/zcode.ts` | Batas waktu RPC per permintaan (ms) untuk panggilan server aplikasi ZCode. | | `ZCODE_TURN_TIMEOUT_MS` | `120000` | `open-sse/executors/zcode.ts` | Durasi maksimum (ms) dari satu putaran ZCode sebelum waktu pengawas habis. | | `ZCODE_POLL_INTERVAL_MS` | `250` | `open-sse/executors/zcode.ts` | Interval polling (ms) untuk penyelesaian giliran ZCode. | | `MINIMAX_CODE_GATEWAY_URL` | `https://agent.minimax.io/mavis/api/v1/llm/v1/messages` | `open-sse/executors/minimaxCodeGateway.ts` | Titik akhir gateway MiniMax terkelola yang menjawab dengan panggilan alat asli. Ini adalah titik akhir internal aplikasi Kode MiniMax, bukan API publik yang terdokumentasi: dapat berubah tanpa pemberitahuan, dan permintaan kemudian gagal dengan 502 yang memberi nama transportasi. | | `MINIMAX_CODE_GATEWAY_TIMEOUT_MS` | `60000` | `open-sse/executors/minimax-code.ts` | Durasi maksimum (ms) dari satu upaya gateway terkelola. Seluruh panggilan (percobaan, kemunduran, satu percobaan ulang) berlangsung sekitar dua menit, sehingga gateway yang tidak dapat dijangkau tidak dapat menampung slot model dalam waktu lama. | | `MINIMAX_CODE_GATEWAY_RETRIES` | `1` | `open-sse/executors/minimaxCodeGateway.ts` | Percobaan ulang panggilan gateway terkelola yang gagal karena kesalahan sementara (429, 5xx, koneksi terputus). | | `MINIMAX_CODE_CONTEXT_WINDOW` | `1000000` | `open-sse/executors/minimaxCodeGateway.ts` | Jendela konteks yang diminta oleh gateway MiniMax terkelola. Katalog model produk Kode MiniMax menyatakan 512000 sebagai jendela default MiniMax-M3 dan MiniMax-M3.1-Flash dan menawarkan 1000000 sebagai jendela kedua; gateway menjawab di jendela yang lebih besar (permintaan 1024056 token input dijawab dengan 200 pada 23-10-2026). Setel ini ke 512000 untuk mempersempit permintaan — rencana tersebut menghitung lebih sedikit. Setiap nilai lainnya diabaikan, sehingga kesalahan ketik tidak dapat meminta jendela yang tidak dimiliki model. | | `MINIMAX_CODE_MAX_INPUT_TOKENS` | `1000000` | `open-sse/executors/minimaxCodeGateway.ts` | Plafon (dalam token masukan) dari satu permintaan yang dikirim ke gateway MiniMax terkelola. Permintaan yang lebih besar ditolak secara lokal dengan 413 alih-alih diteruskan, karena penolakan gateway akan mengunci model dari fallback. Standarnya adalah jendela konteks gateway (1000000); nilai ini dapat menurunkan langit-langit itu, jangan pernah menaikkannya ke atas jendela. | | `MINIMAX_CODE_MAX_TOKENS` | `8192` | `open-sse/executors/minimaxCodeGateway.ts` | Jumlah maksimum token yang dapat dijawab oleh gateway terkelola. | | `MINIMAX_CODE_AUTH_FILE` | `~/.minimax/auth/prod//mcode-public/auth.json` | `open-sse/executors/minimaxCodeGateway.ts` | Jalur profil autentikasi Kode MiniMax yang menyimpan token akses dan penyegaran. | | `MINIMAX_CODE_PROFILE_DIR` | `~/.minimax` | `open-sse/executors/minimaxCodeGateway.ts` | Direktori profil Kode MiniMax yang menyimpan profil autentikasi. | | `MINIMAX_CODE_AUTH_RECORD` | _(generasi terbaru)_ | `open-sse/executors/minimaxCodeGateway.ts` | Rekam profil yang akan digunakan jika profil tersebut memiliki beberapa akun. Blank memilih generasi terbaru, yang merupakan generasi yang disegarkan oleh CLI sendiri. | | `MINIMAX_CODE_REGION` | `en` | `open-sse/executors/minimaxCodeGateway.ts` | Wilayah akun MiniMax. Ini memutuskan titik akhir akun yang menyegarkan token dan direktori profil tempat kredensial dibaca. | | `HERMES_HOME` | `~/.hermes` | `src/lib/cli-helper/config-generator/hermesHome.ts` | Direktori home Agen Hermes tempat OmniRoute reads/writes konfigurasi Hermes CLI. Cocok dengan env var yang disetel oleh penginstal Hermes PowerShell pada Windows (`%LOCALAPPDATA%\hermes`). | | `WHYCODES_HOME` | `~/.whycodes` | `src/lib/cli-helper/config-generator/whycodesHome.ts` | WhyCodes instance root di mana OmniRoute reads/writes `config.toml`. Env var WhyCodes yang sama terbaca; defaultnya adalah `~/.whycodes` (`%USERPROFILE%\.whycodes` di Windows). | ### Sinkronisasi Otomatis Profil CLI Tanda fitur ini diikutsertakan dan dinonaktifkan secara default. Mereka juga dapat diubah dari dasbor Kode CLI. | Variabel | Bawaan | Berkas Sumber | Keterangan | | ------------------------------------- | ------- | ------------------------------------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `OMNIROUTE_AUTO_SYNC_CODEX_PROFILES` | `false` | `src/shared/constants/featureFlagDefinitions.ts` | Setelah sinkronisasi model penyedia, secara otomatis menulis ulang file profil `~/.codex/*.config.toml` dari katalog langsung. Membutuhkan `CLI_ALLOW_CONFIG_WRITES`; tidak pernah mengubah konfigurasi active/default Codex, auth, pengaturan Codex-lb, atau pilihan penyedia. | | `OMNIROUTE_AUTO_SYNC_CLAUDE_PROFILES` | `false` | `src/shared/constants/featureFlagDefinitions.ts` | Setelah sinkronisasi model penyedia, secara otomatis menulis ulang file profil Kode `~/.claude/profiles//settings.json` Claude dari katalog langsung. Membutuhkan `CLI_ALLOW_CONFIG_WRITES`; tidak pernah mengubah konfigurasi active/default Claude, autentikasi, atau pilihan penyedia. | ### Docker Contoh ```bash # Mount host binaries into the container and tell OmniRoute where they are: 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 berlaku ketika jalur tersebut benar-benar di-bind-mount dari host — pasangkan dengan mount seperti `~/.codex:/host-home/.codex:rw` (lihat profil `host` di `docker-compose.yml`). Jalur yang tidak berada di dalam rumah pengguna kontainer atau pengikatan pengikat akan diabaikan, karena tulisan di sana akan dibuang ketika kontainer dibuat ulang. Gambar dijalankan sebagai `USER node`, jadi `/root` yang tidak di-mount adalah** bukan** penggantian yang valid. | Variabel | Bawaan | Berkas Sumber | Keterangan | | ---------------------------------------- | ------------- | ----------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `OMNIROUTE_CONTAINER` | _(mobil)_ | `src/shared/utils/containerEnv.ts` | Aktifkan atau nonaktifkan deteksi kontainer (`1`/`true`) (`0`/`false`). Hanya diperlukan pada runtime yang deteksi otomatisnya meleset. | | `OMNIROUTE_ALLOW_CONTAINER_CONFIG_WRITE` | `false` | `src/shared/services/cliRuntime.ts` | Tetap izinkan penulisan konfigurasi alat CLI ke jalur kontainer yang tidak dipasang. Setara CLI adalah `--allow-container-write`. | | `DOCKER_UPDATE_TRIGGER_FILE` | tidak disetel | `src/lib/system/autoUpdate.ts` | hanya gambar Docker : dasbor** Perbarui Sekarang** menulis permintaan JSON ke file ini (harus berada di dalam `DATA_DIR`) agar pengamat sisi host dapat menarik dan membuat ulang container. Lihat [Panduan Docker](../guides/DOCKER_GUIDE.md#dashboard-updates-in-docker). | ### CLI Biner (`omniroute`) pembantu Variabel-variabel ini menyesuaikan perilaku biner `omniroute` CLI (bukan deteksi sespan di atas). | Variabel | Bawaan | Berkas Sumber | Keterangan | | ------------------------------------- | --------------------------------- | --------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `OMNIROUTE_LANG` | _(sistem)_ | `bin/cli/i18n.mjs` | Paksa bahasa keluaran CLI. BCP-47 lokal (misalnya `en`, `pt-BR`). Mengganti env vars lokal sistem (LC_ALL, LC_MESSAGES). | | `OMNIROUTE_SHOW_LOG` | _(tidak disetel)_ | `bin/cli/runtime/processSupervisor.mjs` | Atur ke `1` untuk meneruskan server stdout/stderr ke terminal dalam mode diawasi. Setara dengan bendera `--log` di `omniroute serve`. | | `OMNIROUTE_CLI_TOKEN` | _(tidak disetel)_ | `bin/cli/api.mjs` | Token autentikasi mesin dimasukkan sebagai header `x-omniroute-cli-token`. Dibuat secara otomatis di tugas 8.12. | | `GEMINI_CLI_HOME` | _(tidak disetel)_ | `bin/cli/commands/setup-gemini.mjs` | Akar rumah Gemini yang persisten; one-shot run menggunakan rumah terisolasi sementara. | | `OMNIROUTE_CHILD_SIGNAL_TIMEOUT_MS` | `5000` | `bin/cli/commands/run.mjs` | Masa tenggang dalam milidetik sebelum membunuh paksa anak CLI yang diberi isyarat. | | `OMNIROUTE_CLI_SKIP_DEFAULT_DATA_ENV` | _(tidak disetel)_ | `bin/omniroute.mjs` | Setel ke 1 dengan DATA_DIR eksplisit untuk melewati file lingkungan direktori data pengguna default. | | `OMNIROUTE_SYNC_TOKEN` | _(tidak disetel)_ | `bin/cli/commands/sync.mjs` | Token sinkronisasi untuk `omniroute sync bundle` (`GET /api/sync/bundle` hanya menerima token sinkronisasi, bukan kunci API ). Setara dengan `--token`. | | `OMNIROUTE_HTTP_TIMEOUT_MS` | `30000` | `bin/cli/api.mjs` | Batas waktu HTTP per percobaan (ms) untuk permintaan server CLI →. | | `OMNIROUTE_READY_TIMEOUT_MS` | `60000` | `bin/cli/utils/pid.mjs` | Waktu maksimum (ms) CLI menunggu titik akhir kesehatan server sebelum mencetak peringatan batas waktu. Berguna untuk start dingin yang lambat (misalnya Windows). Juga dapat diatur melalui `--ready-timeout`. | | `OMNIROUTE_VERBOSE` | `0` | `bin/cli/api.mjs` | Atur ke `1` untuk mencetak diagnostik retry/backoff ke stderr selama perintah CLI. | | `OMNIROUTE_PLUGIN_PATH` | _(tidak disetel)_ | `bin/cli/plugins.mjs` | Direktori khusus untuk penemuan plugin CLI (paket `omniroute-cmd-*` ). Defaultnya adalah `~/.omniroute/plugins/` jika tidak disetel. — khusus CLI tidak pernah mencapai pemindai plugin sisi server, yang ditunjukkan oleh `OMNIROUTE_PLUGINS_DIR` (bagian 2). | | `OMNIROUTE_NO_UPDATE_NOTIFIER` | _(tidak disetel)_ | `bin/omniroute.mjs` | Sembunyikan pemeriksaan pembaruan ketika disetel ke nilai apa pun yang tidak kosong: pemberitahuan CLI saat proses keluar dan spanduk "pembaruan tersedia" di dasbor (`GET /api/system/version` lalu lewati pencarian npm, GitHub, dan berita). Pemberitahuan CLI juga tetap mati dalam CI, mode senyap, dan keluaran non-teks. | | `OMNIROUTE_DOCTOR_LIVENESS_URL` | _(berasal dari)_ | `bin/cli/commands/doctor.mjs` | Keaktifan URL diselidiki oleh `omniroute doctor`. Opsi `livenessUrl` terprogram diutamakan; jika tidak, nilai ini digunakan kata demi kata. Jika tidak disetel, CLI akan memperoleh titik akhir `/api/health/degradation` dasbor lokal. | | `OMNIROUTE_PROVIDER_CATALOG_PATH` | `src/shared/constants/providers/` | `bin/cli/provider-catalog.mjs` | Jalur katalog penyedia yang digunakan oleh perintah penyedia CLI. Opsi `catalogPath` terprogram diutamakan. Jalur absolut digunakan apa adanya; jalur relatif diselesaikan dari root proyek. Tidak disetel, CLI menggunakan direktori konstanta penyedia, dengan file `providers.ts` lama sebagai cadangan. | | `OMNIROUTE_PROVIDER_TEST_MODEL` | _(default penyedia)_ | `bin/cli/provider-test.mjs` | Model fallback global untuk pengujian koneksi penyedia CLI. Prioritas adalah model koneksi yang dikonfigurasi, penggantian model khusus penyedia, nilai ini, kemudian model pengujian bawaan penyedia. | --- ## 10. Agen Internal & Integrasi MCP | Variabel | Bawaan | Berkas Sumber | Keterangan | | ----------------------------------------------- | --------------------------------------------------- | ----------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | `OMNIROUTE_BASE_URL` | deteksi otomatis | `open-sse/mcp-server/server.ts` | URL eksplisit untuk alat MCP/A2A untuk mencapai OmniRoute. Menggantikan deteksi otomatis localhost. keterampilan A2A gagal alih-alih mengirimkan kunci API ke URL ini (atau `BASE_URL` yang menjadi tujuan asalnya) ketika itu adalah http biasa ke alamat publik, nama host publik bertitik, atau host metadata cloud, atau menyimpan kredensial: gunakan https, atau http untuk loopback, nama kontainer atau layanan, atau alamat pribadi. | | `OMNIROUTE_API_KEY` | _(tidak disetel)_ | modul MCP/A2A | kunci API untuk panggilan alat MCP internal. keterampilan A2A mengirimkannya hanya untuk pemanggil tanpa kunci API (sesi dasbor); penelepon dengan kunci bertindak dengan miliknya sendiri. | | `OMNIROUTE_API_KEY_ID` | _(tidak disetel)_ | `open-sse/mcp-server/audit.ts` | Kunci ID untuk atribusi log audit MCP. | | `ROUTER_API_KEY` | _(tidak disetel)_ | Warisan | Alias warisan untuk `OMNIROUTE_API_KEY`. | | `OMNIROUTE_A2A_HISTORY_RETENTION_DAYS` | `30` | `src/lib/a2a/taskManager.ts` | Riwayat tugas A2A berhari-hari disimpan di database lokal sebelum pembersihan harian menghapus satu baris. Tidak disetel, non-numerik, atau `<= 0` kembali ke `30`. | | `OMNIROUTE_A2A_MEMORY_HITS` | `1` | `src/lib/a2a/taskExecution.ts` | Tombol pemutus (kill-switch) untuk fitur observabilitas hit memori A2A. Setel ke `0` untuk melewatkan pencarian penarikan memori untuk suatu tugas sepenuhnya; nilai lainnya (termasuk yang tidak disetel) tetap mengaktifkannya. | | `OMNIROUTE_ISSUE_AGENT_ENABLED` | `false` | `src/app/api/issue-agent/runs/route.ts` | Mengaktifkan titik akhir triase tercatat Agen Penerbit offline/local. Biarkan dinonaktifkan kecuali secara eksplisit menjalankan alur kerja triase rekaman lokal. | | `OMNIROUTE_ISSUE_AGENT_TIMEOUT_MS` | _(tidak disetel)_ | `src/lib/issueAgent/execution.ts` | Batas waktu (md) untuk satu proses triase tercatat Agen Penerbit. Dijepit hingga maksimum internal; kembali ke default bawaan jika tidak disetel atau tidak valid. | | `OMNIROUTE_CONTEXT` | _(konteks aktif)_ | `bin/cli/program.mjs`, `bin/cli/api.mjs` | CLI mode jarak jauh context/profile untuk perintah `omniroute` ; menimpa konteks aktif di penyimpanan konteks lokal. Setara dengan `--context `. | | `OMNIROUTE_CONTEXT_KEYCHAIN_DISABLED` | `0` | `bin/cli/contexts.mjs` | Nonaktifkan backend rantai kunci OS `keytar` opsional untuk kredensial konteks CLI. Saat diaktifkan, kredensial tetap berada dalam mode `config.json` `0600` dan CLI mengeluarkan peringatan fallback satu kali; dimaksudkan untuk operasi headless/container yang disengaja. | | `OMNIROUTE_MCP_ENFORCE_SCOPES` | `false` | `open-sse/mcp-server/server.ts` | Menerapkan kontrol akses berbasis cakupan pada panggilan alat MCP. | | `OMNIROUTE_MCP_SCOPES` | _(semua)_ | `open-sse/mcp-server/server.ts` | Cakupan yang dipisahkan koma: `admin`, `combos`, `health`, `models`, `routing`, `budget`, `metrics`, `pricing`, `memory`, `skills`. | | `OMNIROUTE_PPLX_RESEARCH_ENABLED` | `0` | `open-sse/mcp-server/tools/perplexityResearch.ts` | Daftarkan alat MCP Perplexity Deep Research. Hanya `1` yang mendaftarkannya; hal lain akan meninggalkannya. | | `OMNIROUTE_MCP_COMPRESS_DESCRIPTIONS` | `false` | `open-sse/mcp-server/descriptionCompressor.ts` | Kompres deskripsi alat MCP sebelum membuat serial manifes. Aktifkan nilai: `1`, `true`, `on`. | | `OMNIROUTE_MCP_DESCRIPTION_COMPRESSION` | `rtk` | `open-sse/mcp-server/descriptionCompressor.ts` | Kompresi algorithm/profile. Nonaktifkan nilai: `0`, `false`, `off`. | | `OMNIROUTE_MCP_FETCH_TIMEOUT_MS` | `10000` | `open-sse/mcp-server/fetchTimeout.ts` | Batalkan anggaran (md) untuk pembacaan manajemen internal server MCP (kesehatan, ketahanan, kombo, kuota, penggunaan). | | `OMNIROUTE_MCP_UPSTREAM_TIMEOUT_MS` | `60000` | `open-sse/mcp-server/fetchTimeout.ts` | Batalkan anggaran (ms) untuk MCP hop yang menunggu pada penyedia (`route_request`, `web_search`, `web_fetch`). | | `OMNIROUTE_MCP_SESSION_IDLE_MS` | `300000` | `open-sse/mcp-server/httpTransport.ts` | TTL menganggur (ms) sebelum sapuan menghasilkan sesi streaming MCP yang menganggur. Sesi dengan aliran terbuka atau permintaan dalam penerbangan tidak pernah dituai. Nilai yang tidak disetel, bukan bilangan bulat, atau non-positif akan dikembalikan ke default. | | `OMNIROUTE_CORPUS_CACHE_SIZE` | `5` | `src/lib/localCorpus/configured.ts` | Jumlah maksimum instance indeks korpus lokal yang di-cache di memori (LRU, satu per direktori root yang diindeks). Dijepit ke minimum `1`. | | `MODEL_SYNC_INTERVAL_HOURS` | `6` | `src/shared/services/modelSyncScheduler.ts` | Interval sinkronisasi katalog model dalam hitungan jam. | | `PROVIDER_LIMITS_SYNC_INTERVAL_MINUTES` | `70` | `src/lib/usage/providerLimits.ts` | Batas tarif penyedia dan interval jajak pendapat kuota. | | `PROVIDER_LIMITS_SYNC_SPACING_MS` | `1500` | `src/lib/usage/providerLimits.ts` | Kesenjangan (ms) antara pengambilan kuota OAuth berturut-turut dalam sinkronisasi massal; koneksi OAuth diambil satu per satu untuk menghindari meledaknya upstream. `0` memilih keluar (bersamaan). | | `OMNIROUTE_QUOTA_FETCH_MIN_INTERVAL_MS` | `250` | `open-sse/services/quotaFetchThrottle.ts` | Interval minimum (ms) antara pengambilan kuota upstream berturut-turut pada jalur preflight/monitor per permintaan; ruang panggilan jaringan secara bersamaan sehingga banyak akun di satu IP tidak memutus upstream. Disambungkan ke Codex (`/wham/usage`), DeepSeek, Bailian (keduanya situs pengambilan), OpenCode, dan pengambil kuota Crof (#6009, #6911). Jalur pengiriman `usage.ts::getUsageForProvider` generik (github/glm/minimax/nanogpt/xai/etc.) belum tercakup — dilacak secara terpisah. Cache tidak terpengaruh. `0` menonaktifkan; dijepit `0..60000`. | | `OMNIROUTE_QUOTA_FETCH_JITTER_MS` | `120` | `open-sse/services/quotaFetchThrottle.ts` | Spasi acak (md) tambahan per permintaan, diambil sampelnya pada setiap pengambilan kuota upstream yang dicadangkan. Defaultnya adalah 120; dijepit `0..60000`; `0` hanya menghilangkan jitter. Atur `OMNIROUTE_QUOTA_FETCH_MIN_INTERVAL_MS=0` untuk menonaktifkan seluruh throttle. Jitter tidak menjamin pencegahan larangan upstream. | | `CODEX_QUOTA_FETCH_TIMEOUT_MS` | `8000` | `open-sse/services/codexQuotaFetcher.ts` | Batas waktu (ms) untuk satu pengambilan kuota Codex (`chatgpt.com/backend-api/wham/usage`). Preflight menunggu pengambilan ini sebelum mengirim permintaan. Setelah batas waktu habis atau kesalahan pengangkutan, snapshot terakhir dari 15 menit terakhir digunakan kembali kecuali jendelanya habis atau telah diatur ulang; jika tidak ada, kuota tidak diketahui, sehingga akun kredit berbayar dilewati untuk permintaan tersebut dan tidak ada cooldown yang dipertahankan. Menerima bilangan bulat positif hingga `2147483647`; nilai lainnya akan kembali ke default. | | `PROVIDER_LIMITS_POST_USAGE_REFRESH_DELAY_MS` | `5000` | `src/lib/usage/providerLimits.ts` | Penundaan (ms) sebelum menyegarkan batas penyedia setelah peristiwa penggunaan nyata, memberikan waktu API kuota hulu untuk mendaftarkan konsumsi. | | `OMNIROUTE_LOGIN_BROWSER_PATH` | deteksi otomatis | `open-sse/services/adobeFireflyBrowserLogin.ts` | Jalur absolut ke sistem yang dapat dieksekusi Chrome atau Edge yang digunakan untuk login interaktif Adobe Firefly dan pembaruan di luar layar. | | `ADOBE_FIREFLY_BROWSER_REFRESH` | diaktifkan | `open-sse/services/adobeFireflySession.ts` | Menjaga IMS dan status risiko browser tetap segar dengan sesi CDP Chrome cakupan akun. Setel ke `0` untuk menonaktifkan pembaruan browser. | | `ADOBE_FIREFLY_SESSION_DISK` | diaktifkan | `open-sse/services/adobeFireflySession.ts` | Tetap memperbaiki sesi Adobe di bawah `DATA_DIR` selama proses dimulai ulang. Setel ke `0` untuk menjaga sesi hanya dalam memori. | | `ADOBE_FIREFLY_MIN_SUBMIT_GAP_MS` | `12000` | `open-sse/services/adobeFireflySession.ts` | Jarak minimum dalam milidetik antara pengiriman hasil Adobe Firefly; `0` menonaktifkan spasi. | | `ADOBE_FIREFLY_BATCH_EXTRA_GAP_MS` | `15000` | `open-sse/services/adobeFireflySession.ts` | Periode ekstra tenang dalam milidetik setelah setiap pengiriman Adobe ketiga yang berhasil. | | `ADOBE_FIREFLY_SUBMIT_BASE_DELAY_MS` | `8000` | `open-sse/services/adobeFireflyClient.ts` | Pengunduran dasar dalam milidetik setelah respons sementara Adobe 408; dikombinasikan dengan jarak pengiriman paling banyak lima upaya. | | `OMNIROUTE_DISABLE_BACKGROUND_SERVICES` | `false` | `src/instrumentation-node.ts` | Nonaktifkan semua layanan latar belakang: penyegaran kuota, sinkronisasi batas penyedia, pemulihan koneksi, kesehatan kredensial, sinkronisasi cloud/model/free-proxy/proxy-health, pembersihan retensi, VACUUM terjadwal, dan jajak pendapat hot-reload pengaturan. Berguna untuk CI/test; pada instalasi yang berjalan lama, koneksi tidak pulih secara otomatis dan database terus bertambah. | | `OMNIROUTE_HEADLESS` | _(tidak disetel)_ | `src/lib/system/headless.ts` | Boot khusus mesin proxy: melewati subsistem opsional, `/dashboard` → 404. Sama seperti `omniroute serve --headless`. Lihat [HEADLESS.md](../guides/HEADLESS.md). | | `OMNIROUTE_ENABLE_RUNTIME_BACKGROUND_TASKS` | _(tidak disetel)_ | `src/lib/config/runtimeSettings.ts` | Paksa tugas latar belakang aktif dalam deteksi pengujian otomatis. Setel `1` untuk mengganti heuristik pengujian. | | `OMNIROUTE_BUDGET_RESET_JOB_INTERVAL_MS` | `600000` | `src/lib/jobs/budgetResetJob.ts` | Irama pemeriksaan pengaturan ulang anggaran (ms). Lantai `10000`. | | `OMNIROUTE_CONNECTION_RECOVERY_INTERVAL_MS` | `60000` | `src/lib/quota/connectionRecovery.ts` | Irama pemulihan cooldown koneksi proaktif (ms): memvalidasi ulang koneksi yang `rate_limited_until` sementaranya telah berlalu, keluar dari jalur panas permintaan. Lantai `5000`. | | `OMNIROUTE_DISABLE_CONNECTION_RECOVERY` | `false` | `src/lib/quota/connectionRecovery.ts` | Nonaktifkan penjadwal pemulihan cooldown koneksi proaktif (pemulihan lambat di `getProviderCredentials` masih berlaku). | | `OMNIROUTE_REASONING_CACHE_CLEANUP_INTERVAL_MS` | `1800000` | `src/lib/jobs/reasoningCacheCleanupJob.ts` | Alasan irama pembersihan cache (ms). Lantai `60000`. | | `OMNIROUTE_REASONING_MIN_BUDGET` | _tidak disetel_ (dinonaktifkan) | `open-sse/services/reasoningTokenBuffer.ts` | Tingkat keikutsertaan untuk anggaran keluaran model pemikiran: pemanggil `max_tokens` di `[256, floor)` dinaikkan ke tingkat minimum (dibatasi oleh batas keluaran model). Anggaran klien = yang tidak disetel tidak pernah diperbesar (#9507). | | `OMNIROUTE_REASONING_EFFORT_PROBE_PROVIDERS` | _tidak disetel_ (dinonaktifkan) | `open-sse/services/learnedReasoningEffortCaps.ts` | Id penyedia yang dipisahkan koma (atau `*`): ketika `reasoning_effort` 400/422 tidak menyebutkan kumpulan yang diterima, coba lagi satu tingkat lebih rendah (jangan pernah di bawah `low`) dan pelajari tingkat tersebut hanya jika pemeriksaan dijawab (#14895). | | `OMNIROUTE_LOG_EXPORT_CRON` | `0 * * * *` | `src/lib/jobs/logExportJob.ts` | Ekspresi cron (UTC) untuk tugas ekspor log panggilan yang menguras setiap tujuan ekspor log yang diaktifkan. Lebih suka `*/5 * * * *` saat mengekspor badan. | | `OMNIROUTE_LOG_EXPORT_RUN_TIMEOUT_MS` | `900000` | `src/lib/logExport/childRunner.ts` | Batas waktu jam dinding anak per tujuan dalam milidetik. Batas waktu mencatat kegagalan dan menghentikan proses tanpa memajukan kumpulan yang tidak diakui. nilai Invalid/non-positive/non-integer menggunakan default. | | `OMNIROUTE_LOG_EXPORT_CHILD_MAX_OLD_SPACE_MB` | `1024` | `src/lib/logExport/childRunner.ts` | Batas ruang lama anak V8 ekspor node dalam MB (bukan total RSS). Defaultnya menyisakan ruang kepala untuk 500 baris artefak tertutup dengan badan; kumpulan yang terlalu besar mungkin masih menghabiskan tumpukan anak. Kegagalan menyarankan untuk menurunkan ukuran batch atau menaikkan batas ini. nilai Invalid/non-positive/non-integer menggunakan default. Bun ekspor kembali dalam proses tanpa batas ini. | | `OMNIROUTE_CONFIG_HOT_RELOAD_MS` | `5000` | `src/lib/config/hotReload.ts` | Interval polling (ms) untuk konfigurasi hot-reload. Lebih rendah dari `1000` ditolak. | | `OMNIROUTE_DISABLE_REDIS_AUTH_CACHE` | _(diaktifkan)_ | `src/lib/db/apiKeys.ts` | Atur `1` untuk melewati cache autentikasi kunci API yang didukung Redis (memaksa DB membaca). | | `OMNIROUTE_RTK_TRUST_PROJECT_FILTERS` | `0` | `open-sse/services/compression/engines/rtk/filterLoader.ts` | Percayai aturan filter proyek RTK yang dikelola pengguna tanpa pemeriksaan tanda tangan yang ketat. | | `OMNIROUTE_LITE_MAX_TOOL_LENGTH` | `2000` | `open-sse/services/compression/lite.ts` | Batas karakter untuk pemotongan hasil alat proaktif Lite ketika `lite.maxToolLength` tidak disetel. Kisaran 256–1000000. Pengaturan dasbor menang atas env ini. | | `OMNI_COMPRESSION_WORKERS` | `2` | `open-sse/services/compression/compressionWorkerPool.ts` | Pekerja RTK/Caveman sinkron konkuren maksimum; pekerjaan berlebih tunggu FIFO. | | `OMNI_COMPRESSION_WORKER_TIMEOUT_MS` | `120000` | `open-sse/services/compression/compressionWorkerPool.ts` | Batas waktu per pekerjaan dalam milidetik. Pekerja yang waktunya habis dihentikan dan permintaan gagal dibuka tanpa perubahan. | | `OMNI_COMPRESSION_WORKER_IDLE_MS` | `60000` | `open-sse/services/compression/compressionWorkerPool.ts` | Masa menganggur dalam milidetik sebelum pekerja kompresi yang tidak digunakan dihentikan. | | `OMNI_COMPRESSION_WORKER_MAX_OLD_MB` | `1024` | `open-sse/services/compression/compressionWorkerPool.ts` | Batas tumpukan V8 generasi lama dalam MB untuk setiap pekerja kompresi, semua mode (lantai `128`). Pekerjaan yang melebihi itu gagal dibuka (tidak terkompresi) alih-alih menambah tumpukan gateway. | | `COMPRESSION_PIPELINE_BREAKER_ENABLED` | `false` | `open-sse/services/compression/pipelineEngineBreaker.ts` | Sakelar master pemutus sirkuit per pipa bertumpuk T02.** Ikut serta (default nonaktif)** — saat dihidupkan, mesin yang berulang kali melakukan permintaan dilewati (fail-open) untuk cooldown; off perilaku warisan = byte-identik. | | `COMPRESSION_PIPELINE_BREAKER_THRESHOLD` | `3` | `open-sse/services/compression/pipelineEngineBreaker.ts` | Kegagalan permintaan silang berturut-turut sebelum pemutus mesin terbuka. | | `COMPRESSION_PIPELINE_BREAKER_COOLDOWN_MS` | `30000` | `open-sse/services/compression/pipelineEngineBreaker.ts` | Milidetik mesin yang terbuka tetap dilewati sebelum probe setengah terbuka. | | `COMPRESSION_CCR_RETRIEVAL_RAMP_FACTOR` | `2` | `open-sse/services/compression/engines/ccr/index.ts` | T08/H8 CCR jalur pengambilan-umpan balik: setiap pengambilan sebelumnya dari blok yang disimpan meningkatkan `minChars` efektifnya secara linier (konten yang sering diambil dikompresi lebih sedikit; pengambilan `>=3` = tidak pernah dikompresi). `1` menonaktifkan ramp (lewati biner pada ambang batas saja). | | `COMPRESSION_CCR_DURABLE_STORE` | `true` | `open-sse/services/compression/engines/ccr/index.ts` | toko blok tahan lama CCR (#9061). Mendukung penyimpanan dalam memori dengan SQLite sehingga blok bertahan dari penggusuran LRU, TTL, restart, atau pengambilan kembali pada instance lain. Atur `false` untuk menyimpan blok di memori saja. Blok lebih dari 512KB dan runtime cloud tetap hanya memori. | | `COMPRESSION_PREFIX_FREEZE_ENABLED` | `false` | `open-sse/services/compression/prefixFreeze.ts` | saklar master pembekuan awalan yang diamati penggunaan T08/H5.** Ikut serta (default nonaktif)** — ketika aktif, prompt sistem mengamati `>=` ambang batas diperlakukan sebagai awalan stabil yang dapat di-cache dan dipertahankan dari kompresi bahkan untuk penyedia heuristik cache statis yang hilang (hanya membekukan _preserves_, tidak pernah bermutasi). | | `COMPRESSION_PREFIX_FREEZE_THRESHOLD` | `3` | `open-sse/services/compression/prefixFreeze.ts` | Pengamatan prompt sistem sebelum diperlakukan sebagai awalan stabil yang dibekukan. | | `OMNIROUTE_BOOTSTRAPPED` | `false` | `src/app/(dashboard)/dashboard/page.tsx` | Setel `true` dengan skrip bootstrap setelah pengaturan awal. Mengontrol visibilitas wizard pengaturan. | | `OMNIROUTE_ALLOW_BODY_PROJECT_OVERRIDE` | `0` | `open-sse/executors/antigravity.ts` | Escape hatch: izinkan badan permintaan untuk mengganti bidang proyek Antigravity. | | `ANTIGRAVITY_CREDITS` | `off` | `open-sse/services/antigravityCredits.ts` | Google Satu kebijakan kredit AI : `off` tidak pernah menyuntikkan kredit, `retry` menyuntikkan satu kali setelah kuota yang memenuhi syarat 429, dan `always` menyuntikkan pada permintaan pertama. | | `OMNIROUTE_ANTIGRAVITY_TIMING_TELEMETRY` | `false` | `open-sse/executors/antigravity/executeAttempt.ts` | Ikut serta dalam waktu pengiriman per fisik yang sudah disanitasi: akun tidak aktif, permintaan dalam penerbangan, waktu untuk header, dan konten SSE pertama yang bermakna. Tidak ada perintah, kredensial, atau URLs upstream di log. | | `ANTIGRAVITY_MAX_429_ATTEMPTS` | `2` | `open-sse/services/antigravity429Guard.ts` | 429 hulu ditoleransi per permintaan Antigravity (`agy`/`antigravity`) di semua host (1–12) sebelum 429 kembali ke pemanggil. Isi yang menghabiskannya dijawab secara lokal saat pengiriman ulang (2 menit, dua kali lipat menjadi 30 menit, atau petunjuk coba ulang hulu), dan pengendali obrolan tidak memulai ulang permintaan setelah itu 429. | | `ANTIGRAVITY_ALLOW_SIGNATURE_BYPASS` | `0` | `open-sse/translator/request/openai-to-gemini.ts` | Izinkan penerjemah permintaan Antigravity untuk melewati validasi tanda tangan permintaan CLI yang ketat ketika upstream menolak tanda tangan asli ( mode debug/antiquated-CLI ). Bukan nol memungkinkan bypass. | | `AGY_TOKEN_FILE` | `~/.gemini/antigravity-cli/antigravity-oauth-token` | `src/app/api/providers/agy-auth/apply-local/route.ts` | Ganti jalur file token Antigravity CLI (agy) untuk deteksi otomatis impor login lokal. | ### Jembatan OAuth CLI (Internal) | Variabel | Bawaan | Berkas Sumber | Keterangan | | ------------------- | ----------------- | ------------------------------- | ---------------------------------------------------- | | `OMNIROUTE_SERVER` | deteksi otomatis | `src/lib/oauth/config/index.ts` | Server URL untuk jembatan autentikasi CLI↔OmniRoute. | | `OMNIROUTE_TOKEN` | _(tidak disetel)_ | `src/lib/oauth/config/index.ts` | Token autentikasi untuk jembatan CLI. | | `OMNIROUTE_USER_ID` | `cli` | `src/lib/oauth/config/index.ts` | Pengguna ID untuk sesi jembatan CLI. | | `SERVER_URL` | _(tidak disetel)_ | `src/lib/oauth/config/index.ts` | Alias warisan untuk `OMNIROUTE_SERVER`. | | `CLI_TOKEN` | _(tidak disetel)_ | `src/lib/oauth/config/index.ts` | Alias warisan untuk `OMNIROUTE_TOKEN`. | | `CLI_USER_ID` | _(tidak disetel)_ | `src/lib/oauth/config/index.ts` | Alias warisan untuk `OMNIROUTE_USER_ID`. | --- ## 11. Kredensial Penyedia OAuth ### Penyegaran token Codex pasif `OMNIROUTE_TOKEN_REFRESH_PASSIVE_PROVIDERS` yang disetel ke `codex` menjadikan instance ini konsumen kredensial Codex yang disinkronkan, bukan pemilik rotasi token penyegaran. Default yang kosong atau tidak disetel mempertahankan perilaku penyegaran normal. Nilai yang dipisahkan koma dipangkas dan tidak membedakan huruf besar-kecil; `cx` adalah alias untuk `codex`. Penyedia yang tidak didukung gagal dalam validasi startup. Penyedia lain tidak berubah. Pada titik penyegaran yang ada, instans melewati cache baca koneksi dan hanya mengadopsi token akses berbeda yang belum kedaluwarsa. Token yang ditolak di bagian hulu selama permintaan tidak dapat memenuhi syarat lagi setelah sinkronisasi dibatalkan: kredensial permintaan menyimpan paling banyak empat sidik jari SHA-256, dibuang bersama permintaan itu. Hanya bidang token yang diadopsi, sehingga metadata penyedia permintaan lokal tetap ada. Tidak ada kredensial yang diadopsi yang dipertahankan. Jika tidak ada penggantinya, `refresh_disabled` adalah non-terminal dan tidak diperhitungkan dalam pemutus sirkuit penyegaran token. Respons 401/403 hulu nyata mempertahankan penghitungan kegagalan normal, cooldown eksponensial, dan kesalahan klien; sinyal penonaktifan akun masih terkunci secara permanen. Penyegaran dashboard/API manual mengembalikan `409` dengan kode `refresh_disabled` dan instruksi untuk menyegarkan instance aktif dan melakukan sinkronisasi. Penyegaran implisit (obrolan, penggunaan, pemeriksaan kondisi, dan validasi impor) tidak memunculkan kesalahan tersebut; penggunaan sesuai permintaan 401 pemulihan mencoba sekali dengan token tersinkronisasi yang diadopsi. Codex auth imports menyimpan token yang disediakan tanpa pertukaran token penyegaran; login OAuth baru tidak berubah. Tidak ada sinkronisasi pra-pengiriman yang ditambahkan di luar jalur penyegaran proaktif yang ada. Pertahankan satu pemilik rotasi dan atur sinkronisasi token secara terpisah, sebelum token akses kedaluwarsa (proaktif default: lima menit). Opsi ini bukan kunci terdistribusi, replikasi database, atau penerapan SQLite bersama. Sumber: `open-sse/services/tokenRefresh/passiveCodex.ts`. Kredensial bawaan untuk** pengembangan host lokal** . Untuk penerapan jarak jauh, daftarkan penerapan Anda sendiri di konsol pengembang masing-masing penyedia. | Variabel | Penyedia | Catatan | | ------------------------------------------- | ------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `CLAUDE_OAUTH_CLIENT_ID` | Kode Claude (Anthropic) | Klien publik — tidak memerlukan rahasia. | | `CLAUDE_CODE_REDIRECT_URI` | Kode Claude | Ganti pengalihan URI. Bawaan: `https://platform.claude.com/oauth/code/callback` | | `CODEX_OAUTH_CLIENT_ID` | Codex / OpenAI | Klien publik. | | `GEMINI_OAUTH_CLIENT_ID` | Gemini (Google) | Membutuhkan pencocokan `_SECRET`. | | `GEMINI_OAUTH_CLIENT_SECRET` | Gemini (Google) | — | | `KIMI_CODING_OAUTH_CLIENT_ID` | Pengkodean Kimi (Moonshot) | Klien publik. | | `MUSE_CODE_OAUTH_CLIENT_ID` | Kode Muse (Meta) | Penggantian opsional untuk id klien aliran perangkat Muse CLI publik. Biarkan tidak disetel untuk menggunakan klien publik yang sudah dipanggang. | | `ANTIGRAVITY_OAUTH_CLIENT_ID` | Antigravity (Google) | Membutuhkan pencocokan `_SECRET`. | | `ANTIGRAVITY_OAUTH_CLIENT_SECRET` | Antigravity (Google) | — | | `GITHUB_OAUTH_CLIENT_ID` | GitHub Copilot | Klien publik. | | `GHE_COPILOT_OAUTH_CLIENT_ID` | GHE Copilot | Penggantian opsional untuk id klien OAuth GitHub Enterprise Copilot. Kembali ke default publik `GITHUB_OAUTH_CLIENT_ID` jika tidak disetel. | | `COPILOT_INTEGRATION_ID` | GitHub Copilot | Penggantian opsional untuk integrasi klien GitHub Copilot ID yang dikirim dalam header `Copilot-Integration-Id` dan `Editor-Plugin-Version`. Defaultnya adalah `copilot-developer-cli`. | | `WINDSURF_API_KEY` | Windsurf / Devin (v3.8) | fallback kunci API digunakan oleh `open-sse/executors/devin-cli.ts` ketika tidak ada kredensial per koneksi yang tersedia. Opsional. | | `CLI_DEVIN_BIN` | Devin CLI (v3.8) | Jalur khusus ke biner CLI Devin (`devin`). Diselesaikan oleh `open-sse/executors/devin-cli.ts`. | | `GITLAB_DUO_OAUTH_CLIENT_ID` | GitLab Duo (v3.8) | klien OAuth ID untuk GitLab Duo. Daftarkan aplikasi di `https://gitlab.com/-/profile/applications` dengan pengalihan URI `/callback` dan cakupan `api, read_user, openid, profile, email`. Kembali ke `GITLAB_OAUTH_CLIENT_ID`. | | `GITLAB_DUO_OAUTH_CLIENT_SECRET` | GitLab Duo (v3.8) | rahasia klien OAuth untuk GitLab Duo. Aliran — PKCE opsional tidak memerlukan rahasia. Kembali ke `GITLAB_OAUTH_CLIENT_SECRET`. | | `GITLAB_DUO_BASE_URL` | GitLab Duo (v3.8) | Ganti GitLab base URL ( GitLab yang dihosting sendiri). Defaultnya adalah `https://gitlab.com`. Kembali ke `GITLAB_BASE_URL`. | | `GITLAB_BASE_URL` | GitLab Duo (v3.8) | Penggantian lama untuk `GITLAB_DUO_BASE_URL`. Digunakan ketika varian `_DUO_` tidak disetel. | | `GITLAB_OAUTH_CLIENT_ID` | GitLab Duo (v3.8) | Penggantian lama untuk `GITLAB_DUO_OAUTH_CLIENT_ID` yang dikonsumsi oleh `src/lib/oauth/constants/oauth.ts`. | | `GITLAB_OAUTH_CLIENT_SECRET` | GitLab Duo (v3.8) | Penggantian lama untuk `GITLAB_DUO_OAUTH_CLIENT_SECRET` yang dikonsumsi oleh `src/lib/oauth/constants/oauth.ts`. | | `QODER_OAUTH_CLIENT_SECRET` | Qoder | — | | `QODER_OAUTH_AUTHORIZE_URL` | Qoder | Atur untuk mengaktifkan Qoder OAuth. | | `QODER_OAUTH_TOKEN_URL` | Qoder | — | | `QODER_OAUTH_USERINFO_URL` | Qoder | — | | `QODER_OAUTH_CLIENT_ID` | Qoder | — | | `QODER_PERSONAL_ACCESS_TOKEN` | Qoder | Penggantian kunci API langsung (melewati OAuth). | | `QODER_CLI_WORKSPACE` | Qoder | Ruang kerja ID untuk Qoder CLI. | | `OMNIROUTE_QODER_WORKSPACE` | Qoder | Alias untuk `QODER_CLI_WORKSPACE`. | | `QODER_CLI_CONFIG_DIR` | Qoder | Ganti direktori konfigurasi Qoder CLI (sesi PAT terisolasi, hindari mengganggu login browser). | | `QODER_CLI_MAX_CONCURRENCY` | Qoder | Qodercli berjalan serentak maksimal (print spawn atau ACP prompt); antrian permintaan tambahan FIFO. Tidak disetel (default) = tanpa batas. | | `QODER_CLI_QUEUE_TIMEOUT_MS` | Qoder | Berapa lama permintaan Qoder menunggu slot qodercli (hanya dengan batasan yang ditetapkan) sebelum gagal dengan 429 `qodercli_busy` + `Retry-After`. `120000` bawaan. | | `QODER_CLI_TRANSPORT` | Qoder | `print` (default) memunculkan `qodercli --print` per permintaan; `acp` menyimpan satu proses `qodercli --acp` yang persisten per PAT. | | `QODER_CLI_ACP_IDLE_TIMEOUT_MS` | Qoder | ACP transport: matikan proses qodercli yang persisten setelah waktu idle sebanyak ini. `600000` bawaan. | | `QODER_CLI_ACP_STARTUP_TIMEOUT_MS` | Qoder | ACP transport: batas waktu bagi qodercli untuk menjawab ACP `initialize`. `60000` bawaan. | | `QODER_CLI_ACP_MAX_SESSIONS_PER_PROCESS` | Qoder | ACP transport: mendaur ulang proses qodercli yang persisten setelah banyak sesi ini. `500` bawaan. | | `BLACKBOX_WEB_VALIDATED_TOKEN` | Web Kotak Hitam | Token `tk` frontend untuk dikirim sebagai `validated` di `/api/chat`. Diperlukan ketika Blackbox menerapkan pencocokan token; jika tidak, OmniRoute akan kembali ke UUID acak. Lihat masalah #2252. | | `VISION_BRIDGE_BASE_URL` | Pagar pembatas Jembatan Visi | URL dasar yang kompatibel dengan OpenAI untuk panggilan jembatan visi non-Antropik. Defaultnya adalah OpenAI URL env atau api.openai.com yang lama. Arahkan ke OmniRoute's `/v1` self-loop atau titik akhir OpenAI-compat mana pun (Gemini OpenAI-compat, OpenRouter). Masalah #2232. Ketika URL adalah milik OmniRoute `/v1`, sub-permintaan deskripsikan mengirimkan `x-omniroute-admission-bypass: internal` dan mengautentikasi dengan kredensial self-loop yang diselesaikan (`sk_omniroute` sentinel dalam mode lokal, atau `OMNIROUTE_API_KEY` / `ROUTER_API_KEY` — #1350) sehingga penerapan `REQUIRE_API_KEY=true` berfungsi. | | `VISION_BRIDGE_API_KEY` | Pagar pembatas Jembatan Visi | kunci API untuk URL di atas. Mengganti OpenAI / Google env vars per penyedia untuk panggilan jembatan visi non-Antropik. model Anthropic mempertahankan jalur kunci Anthropic khusus mereka. Masalah #2232. | | `OMNIROUTE_VISION_BRIDGE_NEGATIVE_CACHE_MS` | Pagar pembatas Jembatan Visi | Berapa lama hasil perutean "tidak ada kandidat yang dapat digunakan" di-cache, dalam ms (default `30000`). Nilai yang tidak valid atau negatif akan dikembalikan ke default; `0` menonaktifkan cache negatif. Sumber: `src/lib/guardrails/visionBridgeRouter.ts`. | | `OMNIROUTE_IMAGE_NORMALIZATION` | Normalisasi gambar penglihatan | Ikut serta (batalkan = nonaktif, tidak ada perubahan perilaku; `1`/`true`/`on` diaktifkan). Menormalkan setiap gambar sebaris (data base64 URI / Claude `source.data`) di badan permintaan obrolan sebelum pengiriman: orientasi EXIF diterapkan, RGB (alfa diratakan menjadi putih), tepi panjang `<= 4096` px, total piksel `<= ~4M`; gambar yang memerlukan perubahan dikodekan ulang sebagai JPEG dasar ( PNGs bebas alfa tetap lossless PNG), RGB JPEG/PNG yang sudah sesuai tidak tersentuh. Anggaran sudah ditetapkan. Menargetkan saluran visi Qwen2-VL-style yang menolak gambar oversized/exotic dengan 400 kesalahan penguraian atau output nol hang. http(s) URLs jarak jauh tidak diunduh; biner `sharp` yang hilang atau gambar yang tidak dapat didekodekan melewati tanpa disentuh (pembukaan gagal). Mengubah ukuran gambar besar menambah latensi permintaan. Sumber: `open-sse/utils/visionImageNormalization.ts`. | > [!WARNING] > > 1. Buka [Google Cloud Console → Credentials](https://console.cloud.google.com/apis/credentials) 2. Buat Klien OAuth 2.0 ID (ketik: "Aplikasi web") 3. Tambahkan server Anda URL sebagai Authorized redirect URI 4. Ganti nilai kredensial di `.env`. --- ## 12. Penggantian Agen Pengguna Penyedia Ganti header `User-Agent` yang dikirim ke setiap penyedia upstream. Ini diselesaikan secara dinamis pada saat runtime oleh kelas dasar pelaksana: ``` process.env[`${PROVIDER_ID}_USER_AGENT`] ``` > **Sumber:** `open-sse/executors/base.ts` → `buildHeaders()` | Variabel | Nilai Bawaan | Kapan Memperbarui | | -------------------------------- | --------------------------------------------- | ------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | `CLAUDE_USER_AGENT` | `claude-cli/2.1.280 (external, cli)` | Saat Anthropic merilis versi CLI baru | | `CLAUDE_DISABLE_TOOL_NAME_CLOAK` | `false` | `executors/base.ts` + `executors/cliproxyapi.ts` | Setel ke `1`/`true` untuk meneruskan nama alat harness pihak ketiga kata demi kata ke Anthropic di kedua jalur terikat Antropis ( OAuth asli dan CLIProxyAPI). Secara default, eksekutor secara deterministik memberikan nama alias non-Claude-Code (Claude Code pemetaan kanonik jika ada, jika tidak PascalCase) dan membalikkannya pada respons melalui `_toolNameMap`, sehingga memanfaatkan dengan alat Snake_case tidak ditolak sebagai klien pihak ketiga yang diberi sidik jari. Hanya melakukan debug. | | `CODEX_USER_AGENT` | `codex-cli/0.155.0 (Windows 10.0.26200; x64)` | Ketika OpenAI memperbarui Codex CLI | | `CODEX_CLIENT_VERSION` | `0.155.0` | Ganti versi klien Codex secara independen dari string UA lengkap | | `GROK_CLI_CLIENT_VERSION` | `1.0.41` | Ganti `x-grok-client-version` untuk inferensi, sinkronisasi model, dan kode perangkat OAuth, ditambah Grok CLI User-Agent default untuk inferensi dan sinkronisasi model. Menerima SemVer dengan metadata prerelease/build opsional, hingga 128 karakter setelah pemangkasan spasi di sekitarnya. Nilai yang tidak disetel, kosong, tidak valid, atau berisi jeda baris menggunakan pin yang dikirimkan. Penggantian Agen-Pengguna inferensi penuh yang ada tetap diutamakan. | | `CLAUDE_CODE_CLIENT_VERSION` | `2.1.280` | Ganti versi Kode Claude yang diiklankan secara independen dari `CLAUDE_USER_AGENT`. Anthropic membuat gerbang beberapa model pada nilai ini (#12417). | | `CLAUDE_CODE_CLIENT_BUILD_REVISION` | `1e2` | Ganti akhiran 3 karakter OmniRoute yang ditambahkan ke `cc_version=` di blok penagihan Claude. Benjolan di samping `CLAUDE_CODE_CLIENT_VERSION` — hanya menyematkan versi yang mengiklankan pasangan `version.revision` tanpa emisi biner nyata. | | `GITHUB_COPILOT_CLI_VERSION` | `1.0.91` | Ganti versi Copilot CLI yang diiklankan secara terpisah dari `GITHUB_USER_AGENT` | | `GITHUB_USER_AGENT` | `GitHubCopilotChat/0.54.0` | Kapan GitHub Copilot Obrolan diperbarui | | `ANTIGRAVITY_CLI_CL` | _(tidak disetel)_ | Ganti daftar perubahan Piper CLI Antigravity (`agy`) yang dilaporkan sebagai `cl=` di Agen-Pengguna CLI. Tidak dapat diturunkan dari versinya atau diekspos oleh manifes publik; diunggulkan per versi dari tangkapan langsung (1.4.4 → `1003595037`). Tidak disetel pada versi yang tidak diketahui akan menghilangkan `cl=` alih-alih mengiklankan daftar perubahan build lain. | | `KIRO_USER_AGENT` | `AWS-SDK-JS/3.0.0 kiro-ide/1.0.0` | Saat Kiro IDE diperbarui | | `KIRO_OAUTH_CLIENT_ID` | `kiro-cli` | Ganti kode perangkat sosial Kiro `clientId` (id publik) | | `KIRO_VERIFY_FULL_CRC` | `false` | Ikut serta: validasi CRC pesan per-frame penuh pada aliran peristiwa Kiro (debug aliran yang rusak) | | `KIRO_CREDIT_PRICE_USD` | `0.02` | USD per kredit Kiro ; mengubah kredit `meteringEvent` menjadi biaya per permintaan yang tepat | | `KIRO_REQUIRE_CREDITS` | `false` | Gagal dalam respons Kiro yang melaporkan tidak ada pengukuran kredit alih-alih mencatatnya sebagai belum ditagih | | `QODER_USER_AGENT` | `Qoder-Cli` | Saat Qoder CLI diperbarui | | `CURSOR_USER_AGENT` | `Cursor/3.3` | Saat Cursor diperbarui | > [!TIP] > Anda dapat menambahkan penggantian Agen-Pengguna untuk** setiap** penyedia menggunakan pola `{PROVIDER_ID}_USER_AGENT`. Pelaksana secara dinamis membuat nama env var. --- ## 13. Kompatibilitas Sidik Jari CLI Saat diaktifkan, OmniRoute menyusun ulang header HTTP dan bidang isi JSON agar sesuai dengan tanda tangan alat CLI resmi. Hal ini mengurangi risiko akun ditandai sambil mempertahankan proxy Anda IP. **Sumber:** `open-sse/config/cliFingerprints.ts`, `open-sse/executors/base.ts` ### Per Penyedia | Variabel | Pengaktifan | Memengaruhi | | ------------------------ | ----------- | ---------------------------------------------- | | `CLI_COMPAT_CODEX` | `=1` | Meniru tanda tangan permintaan Codex CLI | | `CLI_COMPAT_CLAUDE` | `=1` | Meniru tanda tangan permintaan Kode Claude | | `CLI_COMPAT_GITHUB` | `=1` | Meniru tanda tangan permintaan GitHub Copilot | | `CLI_COMPAT_ANTIGRAVITY` | `=1` | Meniru tanda tangan permintaan Antigravity | | `CLI_COMPAT_CURSOR` | `=1` | Meniru tanda tangan permintaan Cursor | | `CLI_COMPAT_KIMI_CODING` | `=1` | Meniru tanda tangan permintaan pengkodean Kimi | | `CLI_COMPAT_KILOCODE` | `=1` | Meniru tanda tangan permintaan Kode Kilo | | `CLI_COMPAT_CLINE` | `=1` | Meniru tanda tangan permintaan Cline | ### Global | Variabel | Pengaktifan | Memengaruhi | | ---------------- | ----------- | ---------------------------------------------------------------------- | | `CLI_COMPAT_ALL` | `=1` | Aktifkan kompatibilitas sidik jari untuk** semua** penyedia sekaligus. | ### Kimi Coding identitas CLI diganti | Variabel | Bawaan | Berkas Sumber | Keterangan | | ----------------------- | -------------------------- | ---------------------------------------- | -------------------------------------------------------------------- | | `KIMI_CLI_VERSION` | `1.36.0` | `src/lib/oauth/providers/kimi-coding.ts` | Ganti versi Kimi CLI yang dikirim selama panggilan OAuth/API. | | `KIMI_CODING_DEVICE_ID` | _(diambil secara default)_ | `src/lib/oauth/providers/kimi-coding.ts` | Ganti perangkat Kimi yang diambil ID yang digunakan di header klien. | > [!NOTE] > Fitur ini berfungsi bersamaan dengan penggantian Agen-Pengguna (§12). Sistem sidik jari menangani pengurutan header dan pengurutan bidang isi, sementara penggantian Agen-Pengguna menangani string UA tertentu. Keduanya dapat diaktifkan secara independen. --- ## 14. Penyedia Kunci API kunci API untuk penyedia yang menggunakan otentikasi langsung.** Pengaturan pilihan:** Dasbor Penyedia → → Tambahkan Kunci API. Pengaturan melalui variabel lingkungan adalah alternatif untuk penerapan Docker atau tanpa kepala. Pola yang dikenali: `{PROVIDER_ID}_API_KEY` | Variabel | Penyedia | | ------------------ | -------------------------------------------------------- | | `DEEPSEEK_API_KEY` | DeepSeek | | `NVIDIA_API_KEY` | NVIDIA NIM | | `JINA_AI_API_KEY` | Jina AI (Foundback pembaca API + ) | | `JINA_API_KEY` | Jina AI (alias untuk `JINA_AI_API_KEY`) | | `GEMINI_API_KEY` | Gemini (Google AI Studio) penyematan pengganti obrolan + | | `GOOGLE_API_KEY` | Gemini (alias untuk `GEMINI_API_KEY`) | > [!NOTE] > Entri `${PROVIDER}_API_KEY` statis untuk Groq, xAI, Mistral, Perplexity, Together AI, Fireworks, Cerebras, Cohere, Nebius, dan Qianfan telah dihapus di v3.8.0 karena runtime tidak lagi membacanya — penyedia tersebut hanya mengandalkan Dashboard / `data/provider-credentials.json` / DB terenkripsi. Lihat bagian _Audit: Variabel Dihapus / Mati_ di bagian bawah dokumen ini untuk mengetahui jalur migrasi. > [!TIP] > Kunci yang disetel melalui Dasbor disimpan terenkripsi di SQLite dan diutamakan daripada variabel lingkungan. > > **Jina:** `jina-ai/…` embeddings, rerank, klasifikasi, segmentasi, dan `jina-search` lakukan** bukan** menagih kunci env cluster ketika ada koneksi dasbor `jina-ai` (atau `jina-reader`) bersama — `getProviderCredentials` diisi terlebih dahulu. `JINA_AI_API_KEY` / `JINA_API_KEY` hanya digunakan jika tidak ada kunci dasbor yang dapat digunakan. Log panggilan mengatribusikan fallback env sebagai `connection_id=env:JINA_AI_API_KEY`. Kartu Pembaca (`jina-reader`, `r.jina.ai`) tidak pernah menyajikan `/v1/embeddings` atau `/v1/rerank`. > > **Gemini:** `gemini/gemini-embedding-2` (alias `google/gemini-embedding-2`) menggunakan koneksi dashboard `gemini` terlebih dahulu. `GEMINI_API_KEY` / `GOOGLE_API_KEY` hanya digunakan jika tidak ada kunci dasbor yang dapat digunakan. Log panggilan mengatribusikan fallback env sebagai `connection_id=env:GEMINI_API_KEY`. Lalu lintas multimoda asli menggunakan `x-goog-api-key` terhadap `:embedContent` / `:batchEmbedContents` — N OpenAI `input` item menjadi N vektor. --- ## 15. Pengaturan Batas Waktu Semua nilai ada di dalamnya** milidetik** . Resolusi terpusat di `src/shared/utils/runtimeTimeouts.ts`. ### Hierarki Batas Waktu ``` REQUEST_TIMEOUT_MS (global override) ├─→ FETCH_TIMEOUT_MS (upstream provider calls, default: 600000) │ ├─→ FETCH_HEADERS_TIMEOUT_MS (inherits from FETCH_TIMEOUT_MS) │ ├─→ FETCH_BODY_TIMEOUT_MS (inherits from FETCH_TIMEOUT_MS) │ ├─→ TLS_CLIENT_TIMEOUT_MS (inherits from FETCH_TIMEOUT_MS) │ │ └── TLS_FIRST_BYTE_WATCHDOG_MS (independent, default: 10000) │ ├── RESPONSES_FIRST_BYTE_TIMEOUT_MS (independent, default: 15000) │ ├── OPENCODE_RESPONSES_HEADERS_WAIT_MS (independent, default: 0 = off, suggested: 30000) │ ├── OPENCODE_RESPONSES_HEADERS_WAIT_MAX_ROTATIONS (independent, default: 2) │ ├── FETCH_CONNECT_TIMEOUT_MS (independent, default: 30000) │ └── FETCH_KEEPALIVE_TIMEOUT_MS (independent, default: 4000) ├─→ STREAM_IDLE_TIMEOUT_MS (inherits from REQUEST_TIMEOUT_MS, default: 600000) ├─→ STREAM_ACTIVE_TIMEOUT_MS (independent; unset: 1260000, raised by declared budgets; set: hard cap; 0 disables) ├─→ STREAM_READINESS_TIMEOUT_MS (inherits from REQUEST_TIMEOUT_MS, default: 80000) ├─→ STREAM_READINESS_MAX_TIMEOUT_MS (caps adaptive readiness extensions, default: 180000) └─→ API_BRIDGE_PROXY_TIMEOUT_MS (inherits from REQUEST_TIMEOUT_MS, default: 30000) ├─→ API_BRIDGE_SERVER_REQUEST_TIMEOUT_MS (derived, default: 300000) ├── API_BRIDGE_SERVER_HEADERS_TIMEOUT_MS (default: 60000) ├── API_BRIDGE_SERVER_KEEPALIVE_TIMEOUT_MS (default: 5000) └── API_BRIDGE_SERVER_SOCKET_TIMEOUT_MS (default: 0 = disabled) ``` | Variabel | Bawaan | Keterangan | | ------------------------------------------------- | ----------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `REQUEST_TIMEOUT_MS` | _(tidak disetel)_ | Pintasan global — menggantikan default `FETCH_TIMEOUT_MS` dan `STREAM_IDLE_TIMEOUT_MS`. | | `FETCH_TIMEOUT_MS` | `600000` | Total batas waktu permintaan HTTP untuk panggilan penyedia hulu. | | `STREAM_IDLE_TIMEOUT_MS` | `600000` | Keheningan maksimum antara byte upstream mentah sebelum dibatalkan. Model yang berpikiran luas jarang menghentikan > tahun 90an. | | `STREAM_ACTIVE_TIMEOUT_MS` | `1260000` | Total masa pakai aliran SSE aktif maksimum; tidak pernah menyetel ulang byte upstream dan tidak bergantung pada `REQUEST_TIMEOUT_MS`. Jika tidak disetel, defaultnya adalah `timeoutMs` per model terbesar dalam registri (1200000, Codex) ditambah margin 60000, dan target yang menyatakan anggaran lebih panjang (koneksi `timeoutMs`, lalu per model, lalu tingkat penyedia, misalnya GLM 3000000) mendapatkan anggaran tersebut ditambah 60000. Nilai positif adalah batasan yang sulit untuk setiap target yang dinyatakan tidak dapat dicapai oleh anggaran. Setel ke `0` untuk menonaktifkan setiap target. | | `OMNIROUTE_SSE_COMMENTS` | _(dengan disabilitas)_ | Apakah OmniRoute dapat mengeluarkan baris komentar SSE `:` (misalnya cuplikan detak jantung `: keepalive` dan metadata `x-omniroute-*` ). Dinonaktifkan secara default (#10524) karena klien ketat yang kompatibel dengan OpenAI JSON.parse setiap baris SSE dan mogok pada komentar `:` ; `data:` detak jantung tidak terpengaruh. Setel `on`/`true`/`1`/`yes` untuk ikut serta kembali. Digunakan oleh `open-sse/utils/sseHeartbeat.ts`. | | `SSE_COALESCE_MS` | `0` (mati) | Ikut serta: menggabungkan peristiwa Claude `content_block_delta` berturut-turut (indeks blok dan tipe delta yang sama) yang dikirim ke klien Claude, menghapus setidaknya setiap N ms. Tanpa rugi; `signature_delta` dan kejadian batas tidak pernah digabungkan. Berlaku untuk setiap tipe delta kecuali variabel per tipe di bawah ini disetel. Digunakan oleh `open-sse/utils/sseDeltaCoalesce.ts`. | | `SSE_COALESCE_THINKING_MS` | `0` (mati) | Penggantian per tipe `SSE_COALESCE_MS` untuk `thinking_delta`. | | `SSE_COALESCE_TEXT_MS` | `0` (mati) | Penggantian per tipe `SSE_COALESCE_MS` untuk `text_delta`. | | `SSE_COALESCE_INPUT_JSON_MS` | `0` (mati) | Penggantian per tipe `SSE_COALESCE_MS` untuk `input_json_delta`. | | `SSE_FRAME_COALESCE_MS` | `0` (mati) | Keikutsertaan: kumpulan frame SSE diteruskan dalam waktu N ms menjadi satu penulisan ke klien. Frame pertama dan frame terminal (`[DONE]`, `message_stop`, `error`, `response.completed`/`failed`/`incomplete`) tidak pernah tertunda; dengan batching aktif, ITL mengukur kesenjangan batch. Digunakan oleh `open-sse/utils/sseOutputSink.ts`. | | `SSE_STALL_WATCHDOG` | `timer` | Implementasi pengawas byte-stall untuk respons yang dialirkan. `timer` mempersenjatai kembali satu pengatur waktu per bongkahan hulu (menembak tepat sesuai anggaran kios); `interval` menyimpan satu cek per aliran dengan periode `clamp(budget/4, 1s, 5s)`, sehingga kios menyala dalam periode anggaran +. Digunakan oleh `open-sse/utils/streamStallWatchdog.ts`. | | `STREAM_READINESS_TIMEOUT_MS` | `80000` | Saatnya menerima acara non-ping SSE pertama. Mewarisi `REQUEST_TIMEOUT_MS` saat disetel. | | `STREAM_READINESS_MAX_TIMEOUT_MS` | `180000` | Jendela kesiapan peristiwa pertama yang adaptif maksimum untuk permintaan streaming yang besar, memerlukan banyak alat, atau beralasan tinggi. | | `OMNIROUTE_AGENT_GOAL_POLICY_ENABLED` | `true` | Tombol pemutus untuk heuristik `/goal`. Setel `false`/`0`/`off` untuk sepenuhnya menonaktifkan deteksi batas waktu kesiapan — dan pemulihan aliran tidak pernah ditingkatkan berdasarkan permintaan body/headers, sehingga mengurangi amplifikasi batas waktu yang dikontrol klien. | | `OMNIROUTE_AGENT_GOAL_READINESS_MAX_TIMEOUT_MS` | `600000` | Jendela kesiapan acara pertama maksimum untuk agen `/goal` yang terdeteksi dijalankan atau permintaan yang dipaksakan dengan `x-omniroute-agent-goal`. | | `OMNIROUTE_AGENT_GOAL_STREAM_RECOVERY` | `true` | Aktifkan pemulihan aliran awal secara otomatis untuk menjalankan agen `/goal` yang terdeteksi. Setel `false`/`0`/`off` untuk menonaktifkan keikutsertaan khusus sasaran. Ini hanya dapat memulihkan ADD di atas — default operator, tidak pernah mengesampingkan penyisihan pengaturan `STREAM_RECOVERY_ENABLED`/DB yang eksplisit. | | `OMNIROUTE_CODEX_DROP_NONSTANDARD_EVENTS` | `true` | Hapus peristiwa `codex.*` SSE non-standar (mis. `codex.rate_limits`) yang merusak OpenAI SDK dengan `responses.stream()` 502. ON (#11014). Atur `0`/`false`/`no`/`off` untuk meneruskannya. | | `OMNIROUTE_CODEX_APPSERVER_WS` | _(tidak disetel)_ | Ikut serta dalam transportasi server aplikasi Codex. titik akhir WebSocket (`ws://`/`wss://`) dari sespan `codex app-server` lokal. Saat disetel bersama dengan token, permintaan Codex dirutekan melalui JSON-RPC ke sidecar, bukan HTTP Responses API. Juga dapat diatur per koneksi melalui `providerSpecificData.codexAppServerUrl`. Digunakan oleh `open-sse/executors/codex/appServerConfig.ts`. | | `OMNIROUTE_CODEX_APPSERVER_WS_TOKEN` | _(tidak disetel)_ | Token capability/bearer sebaris disajikan ke server aplikasi. Penggantian per koneksi: `providerSpecificData.codexAppServerToken`. | | `OMNIROUTE_CODEX_APPSERVER_WS_TOKEN_FILE` | _(tidak disetel)_ | Jalur ke file yang menyimpan token kemampuan server aplikasi (dari `codex app-server --ws-token-file`). Digunakan ketika `OMNIROUTE_CODEX_APPSERVER_WS_TOKEN` tidak disetel. Penggantian per koneksi: `providerSpecificData.codexAppServerTokenFile`. | | `OMNIROUTE_CODEX_APPSERVER_CWD` | `/tmp` | Direktori kerja tempat server aplikasi berjalan. Penggantian per koneksi: `providerSpecificData.codexAppServerCwd`. | | `OMNIROUTE_CODEX_APPSERVER_APPROVAL` | _(tidak disetel)_ | Kebijakan persetujuan diteruskan ke giliran server aplikasi (misalnya `never`, `on-request`). Penggantian per koneksi: `providerSpecificData.codexAppServerApprovalPolicy`. | | `OMNIROUTE_CODEX_APPSERVER_SANDBOX` | _(tidak disetel)_ | Kebijakan sandbox diteruskan ke giliran server aplikasi (misalnya `read-only`, `workspace-write`, `danger-full-access`). Jika tidak disetel, default eksekutor adalah `workspace-write` (dikeraskan; sebelumnya `danger-full-access`). Penggantian per koneksi: `providerSpecificData.codexAppServerSandbox`. | | `OMNIROUTE_CODEX_APPSERVER_AUTO_APPROVE` | `false` | Menyetujui secara otomatis permintaan persetujuan server aplikasi ( eksekusi command/file/permission di host). Nonaktif secara default, perintah — ditolak secara otomatis; panggilan alat harness tidak terpengaruh (mereka melakukan perjalanan melalui `item/tool/call` passthrough terpisah). Menerima `true`/`1`/`yes`. Penggantian per koneksi: `providerSpecificData.codexAppServerAutoApprove`. | | `FETCH_HEADERS_TIMEOUT_MS` | = `FETCH_TIMEOUT_MS` | Saatnya menerima header respons. | | `OMNIROUTE_FETCH_START_TIMEOUT_CAP_MS` | `110000` | Waktu tunggu maksimum untuk header respons pada permintaan streaming (md). `0` menonaktifkan batasan ini; penyedia eksplisit `fetchStartTimeoutCapMs` diutamakan. | | `OMNIROUTE_CODEX_IMAGE_RESPONSE_START_TIMEOUT_MS` | `600000` (10 menit) | Batas waktu mulai respons pertama (md) untuk Codex image-generation/edit POSTs berbayar, baik langsung maupun melalui proksi HTTP(S)/SOCKS. Permintaan ini tidak pernah diputar ulang setelah batas waktu yang ambigu atau kegagalan jaringan. Relai tepi (`vercel`/`deno`/`cloudflare`) juga melakukan satu upaya, tetapi tetap memenuhi tenggat waktu `OMNIROUTE_RELAY_FETCH_TIMEOUT_MS` mereka sendiri. | | `OMNIROUTE_DIRECT_HEADERS_TIMEOUT_MS` | `30000` (30an) | Waktu tunggu mulai respons maksimum (md) untuk setiap upaya tanpa proxy langsung. Batas waktu percobaan ulang satu kali pada soket baru; atur `0` untuk menonaktifkan ikatan dan mempertahankan perilaku sebelumnya. | | `OMNIROUTE_LOCAL_DIRECT_HEADERS_TIMEOUT_MS` | `300000` (5 menit) | Tingkat permulaan respons (ms) untuk upaya tanpa proxy langsung yang host targetnya adalah private/LAN/loopback (misalnya `localhost`, `host.docker.internal`, `192.168.x.x`), sehingga permulaan dingin Ollama asli tidak terpotong oleh default 30an di atas. Bertindak sebagai dasar: waktu tunggu efektif adalah yang lebih besar dari nilai ini dan `OMNIROUTE_DIRECT_HEADERS_TIMEOUT_MS`; `0` atau nilai yang tidak valid menghapus nilai minimum lokal. Host jarak jauh tidak terpengaruh. | | `OMNIROUTE_DIRECT_HEADERS_VOLUME_ADAPTIVE` | `1` | Naikkan jendela mulai respons langsung berdasarkan tingkat muatan permintaan: badan di atas 512 KB mendapatkan × 2, di atas 2 MB × 3, dibatasi pada 180 detik dan tidak pernah menurunkan lantai yang sudah lebih tinggi (operator mengesampingkan atau lantai local/LAN di atasnya). Konteks besar diisi terlebih dahulu secara proporsional dengan ukuran masukan tanpa pemilih penalaran untuk mengaktifkan batas atas penalaran, sehingga jendela datar memotong hulu pengisian lambat yang sehat tepat di lantai. Setel `0`/`false`/`off` untuk menyematkan perilaku datar. | | `OMNIROUTE_DIRECT_RESPONSE_RETRY_TIMEOUT_MS` | `600000` (10 menit) | Batas atas (ms) untuk upaya RETRY soket baru setelah batas waktu mulai respons upaya gabungan di atas (#13703). Berlaku hanya ketika penelepon telah memasang sinyal tenggat waktunya sendiri (kaskade koneksi/model/penyedia/`FETCH_TIMEOUT_MS` yang terselesaikan); sinyal itu adalah batas sebenarnya dan menembak pertama kali di jalur yang dituju, jadi ini adalah penghalang yang murah hati daripada batas datar — tanpanya, percobaan ulang menggunakan jendela `OMNIROUTE_DIRECT_HEADERS_TIMEOUT_MS` pendek yang sama sebagai upaya gabungan dan model penalaran TTFB lambat yang sehat dari 504. Jangan pernah diperbolehkan berada di bawah lantai datar di atasnya; ketika penelepon tidak memberikan sinyal tenggat waktu sama sekali, percobaan ulang membuat lantai datar tidak berubah. | | `FETCH_BODY_TIMEOUT_MS` | = `FETCH_TIMEOUT_MS` | Saatnya menerima tanggapan penuh. | | `FETCH_CONNECT_TIMEOUT_MS` | `30000` | batas waktu pembuatan koneksi TCP. | | `FETCH_KEEPALIVE_TIMEOUT_MS` | `4000` | Batas waktu idle soket tetap hidup. | | `TLS_CLIENT_TIMEOUT_MS` | = `FETCH_TIMEOUT_MS` | batas waktu proxy sidik jari TLS (wreq-js). | | `TLS_FIRST_BYTE_WATCHDOG_MS` | `10000` | Membatasi waktu-ke-byte pertama pada badan transport sidik jari TLS wreq-js secara khusus; `TLS_CLIENT_TIMEOUT_MS` sendiri tidak dapat menangkap badan yang terhenti karena diselesaikan segera setelah header tiba (#12656). Batas waktu membatalkan pembaca wreq dan kembali ke operator direct/proxy ; `0` menonaktifkan pengawas. | | `RESPONSES_FIRST_BYTE_TIMEOUT_MS` | `15000` | OpenCode eksekutor saja, dan hanya ketika tanda fitur `OPENCODE_RESPONSES_STALL_ROTATION` aktif (default nonaktif): membatasi penantian byte isi pertama dari balasan Responses yang dialirkan setelah headernya (#13484). Aliran Respons dibuka dengan `response.created`, jadi keheningan melewati jendela ini terhenti: akun didinginkan dan permintaan diputar ke akun berikutnya satu kali; kios kedua gagal dengan cepat. `0` menonaktifkan penjaga bahkan dengan bendera menyala. | | `OPENCODE_RESPONSES_HEADERS_WAIT_MS` | `0` (= mati) | OpenCode executor only: membatasi waktu tunggu untuk header respon upstream pada panggilan Responses yang dialirkan ketika akun lain masih tersedia — permintaan antrian berhenti menunggu dan melanjutkan alih-alih menahan jendela header penuh. Hanya panggilan Responses yang dialirkan yang terpengaruh (aliran Responses dibuka dengan `response.created`, jadi keheningan terjadi dalam antrean, bukan pembuatan); penyelesaian obrolan dan panggilan non-streaming tidak tersentuh, dan jendela hanya memperpendek batas awal pengambilan yang efektif, tidak pernah memperpanjangnya. Nilai yang disarankan saat mengaktifkan: `30000`. `0` menonaktifkan. | | `OPENCODE_RESPONSES_HEADERS_WAIT_MAX_ROTATIONS` | `2` | OpenCode executor only: berapa kali per permintaan header-wait terikat di atas dapat berpindah ke akun berikutnya. Akun terakhir yang tersisa selalu menyimpan jendela header penuh. | | `OPENCODE_PARK_AND_RESUME` | `false` | hanya eksekutor OpenCode : memarkir permintaan dengan detak jantung setelah pengulangan transien 429 (atau penanda regangan kumpulan baru), lalu memutar ulang satu bagian yang dibatasi hingga 3 akun berurutan alih-alih menyebarkan seluruh armada (#13924). Nonaktif secara default: setiap 429 diputar ke akun berikutnya persis seperti sebelumnya. | | `OPENCODE_PARK_REPLAY_SERVE_SETASIDE` | `false` | hanya eksekutor OpenCode : ketika setiap akun yang siap cooldown di babak pemutaran ulang parkir dan lanjutkan disisihkan oleh memori penolakan proksi, tetap tayangkan akun tersebut alih-alih tidak memutar ulang apa pun (#14851, tindak lanjut dari #14750). Nonaktif secara default: bagian pemutaran ulang dalam hal ini kosong, seperti sebelumnya #14750. | | `STREAM_READINESS_STALL_RETRY` | `false` | Hanya obrolan streaming: ketika badan hulu pertama terhenti sebelum menghasilkan peristiwa yang dapat digunakan, lakukan satu upaya terbatas kedua melalui jalur perutean yang sama dengan anggaran kesiapan yang sama dan tanpa penalti akun. Nonaktif secara default: isi pertama yang terhenti gagal dalam permintaan tanpa mencoba lagi. | | `OPENCODE_POOL_RESELECT` | `false` | hanya eksekutor OpenCode : setelah 429 dari penyedia egress-bucket pada akun tanpa proxy dalam konteks kumpulan ambien, mintalah kumpulan koneksi untuk anggota lain untuk upaya berikutnya daripada mencoba ulang alamat egress yang sama. Perintah, jangan pernah mengecualikan: kumpulan yang habis mempertahankan perilaku saat ini. Nonaktif secara default: setiap 429 diputar ke akun berikutnya persis seperti sebelumnya. | | `OPENCODE_POOL_STRAIN_MARKER_PATH` | _(tidak disetel)_ | hanya eksekutor OpenCode : ganti jalur penanda regangan kumpulan yang dibaca sebelum parkir (`{since, reason, ttl_s}`, default `/tmp/opencode-pool-strain.json`, #13924). Penanda baru parkir tanpa menghitung ulang; tidak ada atau basi akan kembali ke penghitung burst. | | `API_BRIDGE_PROXY_TIMEOUT_MS` | `30000` | Batas waktu proxy hop untuk permintaan jembatan `/v1`. | | `FIRECRAWL_BASE_URL` | `https://api.firecrawl.dev` | Arahkan pelaksana pengambilan web Firecrawl ke instance yang dihosting sendiri ( kunci API opsional di luar cloud). | | `FIRECRAWL_TIMEOUT_MS` | `30000` | Batas waktu per permintaan untuk pelaksana pengambilan web Firecrawl. | | `TAVILY_BASE_URL` | _(tidak disetel)_ | Basis URL untuk pengambil kuota Tavily `/usage` (Batas Penyedia); diabaikan ketika menunjuk ke `api.tavily.com`. Unset akan kembali ke basis koneksi URL. | | `API_BRIDGE_SERVER_REQUEST_TIMEOUT_MS` | `300000` | Batas waktu permintaan server secara keseluruhan untuk jembatan. | | `API_BRIDGE_SERVER_HEADERS_TIMEOUT_MS` | `60000` | Saatnya mengirim header respons melalui jembatan. | | `API_BRIDGE_SERVER_KEEPALIVE_TIMEOUT_MS` | `5000` | Batas waktu menganggur jembatan tetap hidup. | | `API_BRIDGE_SERVER_SOCKET_TIMEOUT_MS` | `0` | Batas waktu soket mentah (0 = dinonaktifkan). | | `SHUTDOWN_TIMEOUT_MS` | `30000` | Masa tenggang di SIGTERM/SIGINT sebelum keluar paksa. | | `OMNIROUTE_DEFAULT_FETCH_TIMEOUT_MS` | `120000` | Penggantian digunakan oleh `src/shared/utils/fetchTimeout.ts` ketika `FETCH_TIMEOUT_MS` tidak disetel. | | `OMNIROUTE_PROVIDER_PROBE_TIMEOUT_MS` | `8000` | Batas waktu (ms) untuk preset `validationRead` dan `modelsProbe` di `src/shared/network/safeOutboundFetch.ts`. Naikkan titik akhir yang lambat (Cerebras, Cloudflare AI, Groq) untuk mencegah perpindahan antara active/error di dasbor. Kembali ke 8000ms untuk nilai yang tidak valid (< 1000) atau non-numerik. | | `OMNIROUTE_RELAY_FETCH_TIMEOUT_MS` | `25000` | Batas waktu pengambilan khusus relai di `open-sse/utils/proxyFetch.ts` (#9158). Relai yang digantung harus gagal sebelum batas waktu client/agent (~ 30s) sehingga penelepon melihat kegagalan spesifik relai dan bukan batas waktu hulu yang umum. Dibatasi pada `29000` sehingga selalu menyala terlebih dahulu. | | `OMNIROUTE_RETRY_BACKOFF_MS` | `10` | Backoff percobaan ulang bersama untuk jalur direct/relay/proxy coba lagi sekali di `open-sse/utils/proxyFetch.ts` (#9158). `0` = segera coba lagi. | | `OMNIROUTE_CLAUDE_TLS_TIMEOUT_MS` | `60000` | Batas waktu permintaan wreq-js asli (`claudeTlsClient.ts`). | | `OMNIROUTE_CLAUDE_TLS_GRACE_MS` | `10000` | Batas waktu keras JS mutlak ditambahkan di atas batas waktu asli. | | `OMNIROUTE_PPLX_TLS_TIMEOUT_MS` | `30000` | Batas waktu permintaan wreq-js asli (`perplexityTlsClient.ts`). | | `OMNIROUTE_PPLX_TLS_GRACE_MS` | `10000` | Batas waktu keras JS mutlak ditambahkan di atas batas waktu asli. | | `OMNIROUTE_PPLX_SEARCH_HINT` | `0` (mati) | Ditambahkan "Anda memiliki penelusuran web bawaan. Jawab pertanyaan secara langsung menggunakan hasil penelusuran." ke pesan sistem pemanggil (`perplexity-web/protocol.ts`). Dinonaktifkan secara default — Perplexity tetap mencari, dan kalimatnya bocor menjadi balasan sebagai komentar meta untuk klien pengkodean. Atur `1`/`true`/`yes`/`on` untuk dipulihkan. | | `OMNIROUTE_GROK_TLS_TIMEOUT_MS` | `60000` | Batas waktu permintaan wreq-js asli (`grokTlsClient.ts`). | | `OMNIROUTE_GROK_TLS_GRACE_MS` | `10000` | Batas waktu keras JS mutlak ditambahkan di atas batas waktu asli. | | `OMNIROUTE_NOTION_TLS_TIMEOUT_MS` | `30000` | Batas waktu permintaan wreq-js asli (`notionTlsClient.ts`); `notion-web` memunculkannya per permintaan ke `180000` untuk generasi yang lama. | | `OMNIROUTE_NOTION_TLS_GRACE_MS` | `10000` | Batas waktu keras JS mutlak ditambahkan di atas batas waktu asli. | | `OMNIROUTE_BROWSER_POOL` | `on` | Kumpulan browser Playwright bersama untuk obrolan cookie web yang didukung browser (`browserPool.ts`); atur `off` untuk menonaktifkan. | | `OBSCURA_BIN` | `auto-detect` | Jalur ke biner `obscura` yang digunakan sebagai mesin utama oleh kumpulan browser dan pelaksana Cloudflare Playground (`open-sse/services/obscura.ts`); terdeteksi secara otomatis dari sistem PATH ketika tidak disetel. | | `OBSCURA_CDP_ENDPOINT` | _(tidak disetel)_ | Arahkan ke Obscura yang sudah berjalan (`http://host:port`) alih-alih memunculkan Obscura; modul tidak memiliki proses itu (`open-sse/services/obscura.ts`). | | `OBSCURA_PORT` | `random free port` | Port eksplisit untuk `obscura serve` yang dihasilkan; port bebas dipilih secara otomatis ketika tidak disetel (`open-sse/services/obscura.ts`). | | `WEB_COOKIE_USE_BROWSER` | `0` | Ikut sertakan permintaan obrolan cookie web ke jalur yang didukung browser (`browserBackedChat.ts`); `1` untuk mengaktifkan. | | `KIMI_WEB_BASE_URL` | `https://www.kimi.ai` | Basis URL untuk pelaksana Kimi Web (international kimi.ai Connect-RPC) (`kimi-web.ts`); timpa hanya untuk titik akhir mirror/proxy. | | `KIMI_WEB_CHAT_URL` | `/apiv2/kimi.gateway.chat.v1.ChatService/Chat` | Titik akhir obrolan lengkap untuk pelaksana Web Kimi (`kimi-web.ts`). | | `OMNIROUTE_LOGIN_BROWSER_PATH` | _(terdeteksi otomatis)_ | Jalur ke sistem Chrome/Edge yang dapat dieksekusi untuk proses masuk browser interaktif Adobe Firefly (`adobeFireflyBrowserLogin.ts`); mengesampingkan deteksi otomatis per OS. | | `OMNIROUTE_STANDALONE_DIR` | _.build/ keluaran mandiri_ | Penggantian waktu pembangunan untuk direktori keluaran mandiri yang digunakan oleh langkah kolokasi pasca-pembuatan (`scripts/build/colocate-standalone.mjs`); membangun perkakas, bukan runtime. | Upaya target kombo mewarisi batas waktu permintaan upstream yang diselesaikan (`FETCH_TIMEOUT_MS`, atau `REQUEST_TIMEOUT_MS` ketika menyediakan pengambilan default). Setel `targetTimeoutMs` dalam kombo, default kombo, atau penggantian penyedia hanya untuk membuat fallback kombo lebih cepat; nilai di atas batas waktu upstream saat ini dibatasi pada batas waktu upstream. `comboTimeoutMs` adalah anggaran jam dinding kombo keseluruhan yang terpisah di seluruh target failover. Biarkan tidak disetel atau `0` untuk mempertahankan iterasi tanpa batas (hang-stop hardcoded 10 menit di `comboPredicates.ts` masih berlaku). Nilai positif menggantikan jaring pengaman untuk kombo tersebut. Pertahankan `comboTimeoutMs` lebih lama dari `targetTimeoutMs` sehingga failover masih memiliki waktu setelah target pertama yang lambat. ### Ambang Batas Pemutus Arus Penyetelan pemutus sirkuit tingkat penyedia. Default mencerminkan nilai skala yang digunakan sejak v3.6 untuk 500 koneksi +. | Variabel | Bawaan | Berkas Sumber | Keterangan | | ------------------------------------------------------------- | --------- | ---------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `OMNIROUTE_CIRCUIT_BREAKER_OAUTH_THRESHOLD` | `8` | `open-sse/config/constants.ts` | Ambang batas kegagalan berturut-turut untuk penyedia OAuth sebelum pemutus putus. | | `OMNIROUTE_CIRCUIT_BREAKER_OAUTH_RESET_MS` | `60000` | `open-sse/config/constants.ts` | Reset jendela (ms) untuk pemutus penyedia OAuth. | | `OMNIROUTE_CIRCUIT_BREAKER_API_KEY_THRESHOLD` | `12` | `open-sse/config/constants.ts` | Ambang batas kegagalan berturut-turut untuk penyedia kunci API. | | `OMNIROUTE_CIRCUIT_BREAKER_API_KEY_RESET_MS` | `30000` | `open-sse/config/constants.ts` | Reset jendela (ms) untuk pemutus penyedia kunci API. | | `OMNIROUTE_CIRCUIT_BREAKER_LOCAL_THRESHOLD` | `2` | `open-sse/config/constants.ts` | Ambang batas kegagalan berturut-turut untuk penyedia lokal (Ollama, LM Studio, ...). | | `OMNIROUTE_CIRCUIT_BREAKER_LOCAL_RESET_MS` | `15000` | `open-sse/config/constants.ts` | Atur ulang jendela (ms) untuk pemutus penyedia lokal. | | `OMNIROUTE_PROVIDER_BREAKER_OAUTH_FAILURE_THRESHOLD` | `10` | `open-sse/config/constants.ts` | Pemutus tingkat penyedia: kegagalan dalam jendela sebelum seluruh penyedia OAuth memasuki cooldown. | | `OMNIROUTE_PROVIDER_BREAKER_OAUTH_FAILURE_WINDOW_MS` | `900000` | `open-sse/config/constants.ts` | Pemutus tingkat penyedia: jendela penghitungan kegagalan (ms) bergulir untuk penyedia OAuth. | | `OMNIROUTE_PROVIDER_BREAKER_OAUTH_COOLDOWN_MS` | `300000` | `open-sse/config/constants.ts` | Pemutus tingkat penyedia: cooldown (ms) setelah ambang batas penyedia OAuth tercapai. | | `OMNIROUTE_PROVIDER_BREAKER_OAUTH_DEGRADATION_THRESHOLD` | `5` | `open-sse/config/constants.ts` | penyedia OAuth memasuki DEGRADED karena banyak kegagalan ini. | | `OMNIROUTE_PROVIDER_BREAKER_OAUTH_MAX_BACKOFF_MULTIPLIER` | `8` | `open-sse/config/constants.ts` | penyedia OAuth pengganda eskalasi resetTimeout maks. | | `OMNIROUTE_PROVIDER_BREAKER_OAUTH_BACKOFF_ESCALATION_COUNT` | `2` | `open-sse/config/constants.ts` | Penyedia OAuth meningkat setelah banyak siklus terbuka ini. | | `OMNIROUTE_PROVIDER_BREAKER_API_KEY_FAILURE_THRESHOLD` | `15` | `open-sse/config/constants.ts` | Pemutus tingkat penyedia: kegagalan dalam jendela sebelum seluruh penyedia kunci API memasuki masa cooldown. | | `OMNIROUTE_PROVIDER_BREAKER_API_KEY_FAILURE_WINDOW_MS` | `1800000` | `open-sse/config/constants.ts` | Pemutus tingkat penyedia: jendela penghitungan kegagalan (md) untuk penyedia kunci API. | | `OMNIROUTE_PROVIDER_BREAKER_API_KEY_COOLDOWN_MS` | `600000` | `open-sse/config/constants.ts` | Pemutus tingkat penyedia: waktu tunggu (md) setelah ambang batas penyedia kunci API tercapai. | | `OMNIROUTE_PROVIDER_BREAKER_API_KEY_DEGRADATION_THRESHOLD` | `7` | `open-sse/config/constants.ts` | Penyedia kunci API memasuki DEGRADED pada banyak kegagalan ini. | | `OMNIROUTE_PROVIDER_BREAKER_API_KEY_MAX_BACKOFF_MULTIPLIER` | `4` | `open-sse/config/constants.ts` | Pengganda eskalasi maks resetTimeout penyedia kunci API. | | `OMNIROUTE_PROVIDER_BREAKER_API_KEY_BACKOFF_ESCALATION_COUNT` | `3` | `open-sse/config/constants.ts` | Penyedia kunci API meningkat setelah banyak siklus terbuka ini. | | `OMNIROUTE_PROVIDER_BREAKER_LOCAL_FAILURE_THRESHOLD` | `2` | `open-sse/config/constants.ts` | Pemutus tingkat penyedia: kegagalan sebelum seluruh penyedia lokal memasuki masa cooldown. | | `OMNIROUTE_PROVIDER_BREAKER_LOCAL_FAILURE_WINDOW_MS` | `300000` | `open-sse/config/constants.ts` | Pemutus tingkat penyedia: jendela penghitungan kegagalan (md) yang bergulir untuk penyedia lokal. | | `OMNIROUTE_PROVIDER_BREAKER_LOCAL_COOLDOWN_MS` | `60000` | `open-sse/config/constants.ts` | Pemutus tingkat penyedia: cooldown (ms) setelah ambang batas penyedia lokal tercapai. | | `OMNIROUTE_API_KEY_COOLDOWN_MS` | `60000` | `open-sse/services/apiKeyRotator.ts` | Cooldown per kunci (ms) diterapkan oleh rotasi kunci API multi-kunci ketika upstream 429 tidak membawa `Retry-After` (#14573). Nilai non-positif atau non-numerik kembali ke default. | | `OMNIROUTE_AVALANCHE_PROTECTION_ENABLED` | `false` | `open-sse/services/accountFallback/antiAvalanche.ts` | Keikutsertaan penjaga anti-longsoran salju: hanya `true` eksplisit yang mengaktifkannya. Saat aktif, 429 yang menyebutkan batas token per menit (dan konteks meluap 400) menghentikan failover berjenjang di seluruh kunci penyedia yang tersisa. 429 yang kehabisan kuota terus gagal, seberapa pun besar permintaannya, dan HTTP 413 tidak terpengaruh (ini mempertahankan perilaku #13350 coba lagi di akun lain). | | `OMNIROUTE_AVALANCHE_BURST_COOLDOWN_MS` | `60000` | `open-sse/services/accountFallback/antiAvalanche.ts` | Cooldown penguncian model (ms) diterapkan saat penjaga menembak, bukan penguncian yang meningkat. Reset upstream yang lebih lama selalu menang. Nilai non-positif atau non-numerik kembali ke default. | | `PIN_DROP_BACKOFF_LEVEL` | `2` | `open-sse/services/combo.ts` | Kedalaman backoff saat penyedia pin cache konteks dianggap tidak sehat secara tahan lama dan pin dilepas karena failover. | | `PIN_DROP_GRACE_MS` | `20000` | `open-sse/services/combo.ts` | Jendela anti-flap (ms) mentoleransi cooldown sementara sebelum menjatuhkan pin cache konteks. | ### Skenario | Skenario | Konfigurasi | | ---------------------------------------- | -------------------------------------------------------- | | **Pembuatan kode yang berjalan lama** | `REQUEST_TIMEOUT_MS=900000` (15 menit) | | **Total streaming seumur hidup terikat** | `STREAM_ACTIVE_TIMEOUT_MS=1260000` (21 menit) | | **Gagal cepat untuk produksi API** | `API_BRIDGE_PROXY_TIMEOUT_MS=10000` | | **Model pemikiran yang diperluas** | `STREAM_IDLE_TIMEOUT_MS=300000` (5 menit antar potongan) | --- ## 16. Pencatatan Sistem logging menulis ke file log stdout dan diputar. Semua konfigurasi dibaca oleh `src/lib/logEnv.ts`. | Variabel | Bawaan | Keterangan | | ----------------------------------------- | -------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `APP_LOG_LEVEL` | `info` | Tingkat log minimum: `debug`, `info`, `warn`, `error`. | | `APP_LOG_FORMAT` | `text` | Format keluaran: `text` (dapat dibaca manusia) atau `json` (terstruktur). | | `APP_LOG_TO_FILE` | `true` | Tulis log ke file bersama stdout. | | `APP_LOG_FILE_PATH` | `logs/application/app.log` | Jalur file log (relatif terhadap root proyek atau `DATA_DIR`). | | `APP_LOG_MAX_FILE_SIZE` | `50M` | Ukuran file maksimal sebelum rotasi. Menerima: `50M`, `1G`, `512K`, atau byte biasa. | | `APP_LOG_RETENTION_DAYS` | `7` | Hari untuk menyimpan file log aplikasi yang dirotasi. | | `APP_LOG_MAX_FILES` | `20` | Cadangan file log yang diputar secara maksimal. | | `CALL_LOG_RETENTION_DAYS` | `7` | Hari untuk menyimpan entri log request/call di database. | | `CALL_LOG_MAX_ENTRIES` | `10000` | Entri log panggilan maksimal di buffer dalam memori. | | `CALL_LOGS_TABLE_MAX_ROWS` | `100000` | Maksimal baris di tabel `call_logs` SQLite sebelum pemangkasan. | | `ENABLE_REQUEST_LOGS` | _(tidak disetel)_ | Paksa masuk atau keluarnya permintaan terperinci, mengesampingkan pengaturan dasbor. | | `MAX_PENDING_REQUEST_AGE_MS` | `3600000` (1 jam) | Usia maksimum untuk entri log permintaan aktif tanpa induk sebelum pembersihan dalam memori. | | `MAX_PENDING_DETAILS` | `5000` | Detail maksimum yang tertunda (bilangan bulat positif); batas hitungan: sapuan; byte/map caps: masukkan. | | `CALL_LOG_PIPELINE_CAPTURE_STREAM_CHUNKS` | `false` | Simpan potongan aliran dalam artefak saluran pipa ketika `call_log_pipeline_enabled=true`. Ikut serta (`true`) — nonaktif secara default untuk menyimpan disk. | | `CALL_LOG_PIPELINE_MAX_SIZE_KB` | `512` | Ukuran artefak log panggilan pipa maksimum di KB ketika `call_log_pipeline_enabled=true`. | | `PROXY_LOGS_TABLE_MAX_ROWS` | `100000` | Maksimal baris di tabel `proxy_logs` SQLite sebelum pemangkasan. | | `PROXY_LOG_INCLUDE_IPS` | `false` | Sertakan client/egress IPs dan awalan akun di log konsol `[ProxyEgress]`. Catatan log proksi dashboard/database menyimpan rincian lengkap. | | `PROXY_LOG_FIRST_CHUNK_TIMING` | `false` | Setel ke `"true"` atau `"1"` untuk merekam `first_chunk_ms` (kirim mulai ke byte isi pertama yang berguna) pada baris log proxy. Membungkus setiap badan hulu dalam aliran passthrough malas dan menambal baris setelah byte tiba; dinonaktifkan secara default sehingga tanggapan tidak tersentuh. | | `APP_LOG_ROTATION_CHECK_INTERVAL_MS` | `60000` (1 menit) | Seberapa sering `src/lib/logRotation.ts` memeriksa ulang ukuran file log yang aktif. | | `CHAT_LOG_TEXT_LIMIT` | `65536` | Panjang string maksimum dipertahankan dalam artefak log obrolan (default 64 KB). | | `CHAT_LOG_ARRAY_TAIL_ITEMS` | `128` | Jumlah item larik yang dipertahankan dari bagian ekor saat memotong muatan log obrolan. | | `CHAT_LOG_MAX_DEPTH` | `6` | Kedalaman sarang maksimal sebelum muatan log obrolan terpotong. | | `CHAT_LOG_MAX_OBJECT_KEYS` | `80` | Kunci objek maksimum dipertahankan dalam muatan log obrolan (0 = tidak terbatas). | | `CHAT_LOG_MAX_BODY_KB` | `1024` | Seluruh ukuran tubuh request/response (KB) sebelum digantikan dengan ringkasan kosong, bukan klon lengkap. Naikkan ini jika percakapan agen yang panjang menunjukkan pengganti, bukan pesan sebenarnya di dasbor. | | `CHAT_DEBUG_FILE` | `false` | Jika benar, `serializeArtifactForStorage` melewatkan pemotongan berdasarkan ukuran. Hanya melakukan debug. | --- ## 17. Optimasi Memori | Variabel | Bawaan | Keterangan | | -------------------------------------------- | -------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `OMNIROUTE_HEAP_DIAGNOSTICS_ENABLED` | `0` (mati) | Setel `1` untuk mencatat metrik tekanan tumpukan V8 dari `src/lib/healthzLag.ts`. Mencatat ukuran dan jumlah penerbangan, jangan pernah meminta konten, jejak, atau cuplikan tumpukan. Berjalan di dalam perekam event-loop stall, jadi `OMNIROUTE_EVENT_LOOP_STALL_THRESHOLD_MS=0` juga mematikannya. | | `OMNIROUTE_HEAP_DIAGNOSTICS_THRESHOLD_MB` | `900` | Ambang batas positif untuk heapUsed (MiB) yang memicu log diagnostik keikutsertaan. Nilai yang tidak valid menggunakan 900 MiB; pesan high-heap dibatasi satu kali per 60 detik. | | `OMNIROUTE_MEMORY_MB` | _auto_ (logam kosong);**`1024` pada gambar Docker** | **Direkomendasikan** batas tumpukan Docker/standalone V8 (MB). Jika tidak disetel, dikalibrasi secara dinamis (~ 35% dari sistem RAM, dijepit ke `[512, 4096]`); `512` hanyalah lantai ketika total memori tidak dapat dibaca. Pada `run-standalone.mjs` (Docker CMD), an** eksplisit** nilai ditambahkan sebagai `--max-old-space-size` dan** menang** atas bendera heap NODE_OPTIONS yang bertentangan (bendera terakhir V8). `omniroute serve` masih lebih memilih tumpukan NODE_OPTIONS yang ada (#5238). Jangan atur keduanya ke nomor yang berbeda — proses akan mencatat peringatan yang menyebutkan nilai dan pemenangnya.** Gambar Docker resmi selalu disetel `1024`, jadi kalibrasi tidak pernah dijalankan di sana.** Agen pengkodean `/v1/responses` membutuhkan `8192`–`12288` plus cgroup headroom — lihat [Docker Guide — runtime RAM](../guides/DOCKER_GUIDE.md#runtime-ram-for-coding-agents). | | `OMNIROUTE_RSS_PRESSURE_MB` | _auto_ (`max(3072, 2 × OMNIROUTE_MEMORY_MB)`; mati jika `OMNIROUTE_MEMORY_MB` tidak disetel) | `open-sse/utils/resourcePressure.ts` | Sekering RSS proses absolut (MB) untuk memori native/external yang tidak dapat dilihat oleh V8 `heapUsed` ; di atasnya permintaan baru dapatkan 503 `resource_pressure`. RSS jarang turun setelah lonjakan, jadi pasangkan dengan `OMNIROUTE_PRESSURE_SELF_RESTART`. | | `PROMPT_CACHE_MAX_SIZE` | `50` | Entri prompt sistem yang di-cache maksimal. | | `PROMPT_CACHE_MAX_BYTES` | `2097152` (2 MB) | Total ukuran cache cepat maksimum. | | `PROMPT_CACHE_TTL_MS` | `300000` (5 menit) | Entri cache yang cepat TTL. | | `SEMANTIC_CACHE_MAX_SIZE` | `100` | Suhu cache maksimum = 0 respons. | | `SEMANTIC_CACHE_MAX_BYTES` | `4194304` (4 MB) | Total ukuran cache semantik maksimal. | | `SEMANTIC_CACHE_TTL_MS` | `1800000` (30 menit) | Entri cache semantik TTL. | | `OMNIROUTE_SEMANTIC_CACHE_PRUNE_INTERVAL_MS` | `1800000` (30 menit) | SQLite pangkas interval. `0` menonaktifkan startup dan pengoperasian berkala; nilai lain di bawah `60000` kembali ke default. Nilai di atas `2147483647` ms dijepit ke penundaan waktu maksimum Node, menghindari overflow hingga polling 1 ms. Jalankan pertama setelah 1 detik; pengatur waktu tidak diref dan proses tidak pernah tumpang tindih. | | `OMNIROUTE_SEMANTIC_CACHE_PRUNE_BATCH_SIZE` | `2000` | Baris per SQLite pangkas DELETE, dijepit ke `[100, 50000]`; menghasilkan loop peristiwa antar batch. | | `OMNIROUTE_SEMANTIC_CACHE_PRUNE_MAX_BATCHES` | `50` | Anggaran batch DELETE bersama per proses pada masa berlaku habis dan batas baris opsional, dijepit ke `[1, 10000]`. Backlogs berlanjut pada proses selanjutnya. | | `OMNIROUTE_SEMANTIC_CACHE_MAX_ROWS` | `0` | Batas baris SQLite opsional (`0` = tidak ada). Setelah menghapus `expires_at <=` stempel waktu ISO run-start, keluarkan `created_at` terlama, lalu `rowid`, termasuk baris aktif, sesuai dengan anggaran batch bersama. Hitungan dipotong menjadi bilangan bulat (hingga batas bilangan bulat aman). Nilai kosong, non-numerik, tidak terbatas, atau negatif untuk keempat variabel prune akan kembali ke defaultnya; pecahan dibulatkan ke bawah. Pemangkasan tidak mengubah TTL, memori LRU atau perilaku cache vektor. | | `OMNIROUTE_CORPUS_CACHE_SIZE` | `5` | Akar korpus lokal yang menyimpan indeks langsung dalam memori sekaligus (`src/lib/localCorpus/configured.ts`). LRU: pada batasnya, indeks root yang paling jarang digunakan akan dikeluarkan dan dibangun kembali pada kueri berikutnya. Dijepit ke minimum `1`; nilai non-numerik kembali ke default. | | `STREAM_HISTORY_MAX` | `50` | Maksimalkan acara streaming terkini di buffer tampilan langsung Dasbor. | | `CONTEXT_LENGTH_DEFAULT` | _(tidak disetel)_ | Penggantian panjang konteks global (token) untuk setiap penyedia yang tidak memiliki variabel `CONTEXT_LENGTH_`. Ketika diatur, itu** menggantikan** katalog, penggantian dasbor, dan nilai registri untuk penyedia tersebut; jika tidak disetel, OmniRoute menggunakan rantai bawaannya, yang pilihan terakhirnya adalah `128000`. Lihat [Panjang konteks per penyedia](#per-provider-context-length-context_length_provider). | | `USAGE_TOKEN_BUFFER` | `100` | Ruang kepala token ekstra dicadangkan saat melacak kuota penggunaan. | ### Panjang konteks per penyedia (`CONTEXT_LENGTH_`) `open-sse/services/contextManager.ts` (`getEnvOverride()` / `resolveTokenLimit()`) juga dibaca a** per penyedia** form yang namanya dibuat dari penyedia ID saat runtime, sehingga tidak dapat dicantumkan baris demi baris pada tabel di atas atau di `.env.example`. **Nama.** `CONTEXT_LENGTH_`, di mana `` adalah penyedia ID dengan huruf besar, dengan setiap karakter di luar `A-Z` / `0-9` diganti dengan `_`. Penyedia ID adalah penyedia kanonis setelah resolusi alias (bagian `provider` dari string `provider/model` setelah alias pendek diselesaikan). Node kustom yang kompatibel dengan OpenAI atau Anthropic menggunakan node yang dihasilkan ID, sehingga UUID adalah bagian dari nama variabel. Nilainya adalah bilangan bulat positif dari jumlah token; hal lain (kosong, `0`, negatif, non-numerik) diabaikan dan resolusi berpindah ke langkah berikutnya. | Penyedia ID | Nama variabel | | ----------------------------------------------------------- | -------------------------------------------------------------------------- | | 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 | **Hak lebih tinggi.** Untuk pasangan `provider/model`, langkah pertama yang menghasilkan nilai akan menang: 1. `CONTEXT_LENGTH_` untuk penyedia itu. 2. `CONTEXT_LENGTH_DEFAULT` (pengabaian lingkungan global). 3. Jendela per model: penggantian konteks yang bertahan (disetel di dasbor, atau disematkan secara otomatis oleh rekonsiliasi penemuan, lihat `CONTEXT_WINDOW_RECONCILE_INTERVAL`), jika tidak, nilai katalog / models.dev yang disinkronkan. 4. Registri penyedia `defaultContextLength`. 5. Heuristik nama model (`claude` 200000, `gemini` 1000000, `gpt` / `o1` / `o3` / `o4` / `codex` 400000). 6. Default per penyedia bawaan, lalu `128000`. Kedua langkah lingkungan berlaku untuk** seluruh penyedia** : setiap model penyedia tersebut mendapat batas yang sama, dan mereka memenangkan penggantian dasbor per model. Jika hanya satu model penyedia yang memerlukan jendela berbeda, gunakan penggantian per model di dasbor. **Cakupan.** Rantai ini mendorong pemeriksaan jendela konteks waktu permintaan (penolakan `context_length_exceeded` / "Input melebihi jendela konteks" di `open-sse/handlers/chatCore.ts`), anggaran kompresi yang cepat, dan batas konteks kombo. `context_length` yang diiklankan oleh `GET /v1/models` masih dapat berasal dari metadata katalog atau registri dan tidak dijamin mencerminkan penggantian lingkungan. **Contoh.** Penyedia yang modelnya menerima jendela 1.050.000 token sementara katalog melaporkan 128.000: ```dotenv CONTEXT_LENGTH_AGENTROUTER=1050000 ``` Mulai ulang server setelah mengubahnya: nilainya dibaca dari lingkungan proses server. Di** aplikasi desktop** server berjalan sebagai proses anak dan tidak melihat variabel sistem disetel setelah aplikasi diluncurkan; letakkan baris di file `.env` yang dimuat aplikasi (urutan pencarian di [Panduan Electron : Pencarian file lingkungan](../guides/ELECTRON_GUIDE.md#environment-file-lookup) ), lalu keluar sepenuhnya dan luncurkan kembali aplikasi. ### Kompresi | Variabel | Bawaan | Keterangan | | ------------------------------------- | ------------- | ------------------------------------------------------------------------------------------------------------------------- | | `OMNIROUTE_RTK_TRUST_PROJECT_FILTERS` | tidak disetel | Percayai proyek `.rtk/filters.json` tanpa hash `.rtk/trust.json`. Gunakan hanya dalam pengembangan lokal yang terkendali. | ### Mesin Memori (rencana 21) ### Biaya loop peristiwa untuk memori, keterampilan, dan penyegaran token (#10349) OmniRoute adalah a** proses Node tunggal** . Memori extraction/retrieval, injeksi keterampilan, dan penyegaran token penyedia dijalankan di sana** putaran peristiwa yang sama** seperti `GET /healthz` dan dasbor. Itu bukan thread pekerja. | Bekerja | Kode | Bawaan | Kontrol operator | | ------------------------------ | ---------------------------------- | --------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------- | | Ekstraksi / pengambilan memori | `src/lib/memory/` | Dasbor**memoryEnabled** (standarnya aktif) | Mematikan** Pengaturan → Memori** . Tidak ada saklar mematikan env terpisah selain menonaktifkan fitur dalam pengaturan. | | Suntikan keterampilan | `src/lib/skills/injection.ts` | Dasbor**skillsEnabled** (standarnya aktif) | Mematikan** Pengaturan → Memory/Skills** (`skillsEnabled`). Kenop Sandbox di bawah hanya eksekusi terikat setelah injeksi sudah aktif. | | Penyegaran token | `src/sse/services/tokenRefresh.ts` | Aktif untuk penyedia OAuth/web yang terhubung | Putuskan sambungan penyedia atau biarkan token tetap valid; tidak ada `TOKEN_REFRESH=0` env hari ini. | Jika `/healthz` lambat pada kotak yang tenang, nonaktifkan keterampilan memori + terlebih dahulu, lalu periksa catalog/compression load (#10303, #9685). Fitur-fitur ini menghasilkan poin `await` tetapi masih bersaing untuk satu thread. Menyematkan lapisan, penyimpanan vektor, dan tombol pemeringkatan ulang untuk subsistem memori persisten (`src/lib/memory/`). | Variabel | Bawaan | Keterangan | | ------------------------------------ | --------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `MEMORY_EMBEDDING_CACHE_TTL_MS` | `300000` (5 menit) | TTL untuk cache penyematan dalam memori (sesuai tanda tangan source/model/dim ). | | `MEMORY_EMBEDDING_CACHE_MAX` | `1000` | Entri LRU maksimal disimpan dalam cache penyematan. | | `MEMORY_TRANSFORMERS_MODEL` | `Xenova/all-MiniLM-L6-v2` | HF repo id untuk pipa MiniLM lokal `@huggingface/transformers` keikutsertaan (~ 23 MB int8, ~ 400 MB RAM). | | `MEMORY_STATIC_MODEL` | `minishlab/potion-base-8M` | HF repo id untuk penyematan tabel pencarian potion/Model2Vec statis. Diunduh dengan malas ke direktori cache. | | `MEMORY_STATIC_CACHE_DIR` | `/embeddings` | Direktori yang digunakan untuk menyimpan file model ramuan statis. Default di bawah `DATA_DIR` jika tidak disetel. | | `HF_HUB_ENDPOINT` | `https://huggingface.co` | Ganti basis Hugging Face Hub URL yang digunakan oleh `staticPotion.ts` (misalnya titik akhir cermin untuk pengaturan celah udara). | | `MEMORY_VEC_TOP_K` | `20` | Top-K default yang digunakan oleh pencarian vektor `sqlite-vec` brute-force di dalam `src/lib/memory/vectorStore.ts`. | | `MEMORY_RRF_K` | `60` | Konstanta Fusi Peringkat Timbal Balik `k` untuk pengambilan vektor + FTS5 hibrid (resep sqlite-vec). | | `VECTOR_STORE_DISABLE_VEC` | `false` | Test/diagnostic jahitan di `getVectorStore()` (`src/lib/memory/vectorStore.ts`): ketika `true`, memaksa penyimpanan vektor ke `null` (mensimulasikan lingkungan cloud/WASM tanpa `sqlite-vec`), menurunkan pengambilan memori ke pencarian kata kunci FTS5. Biarkan tidak disetel dalam produksi. | | `NOTION_API_KEY` | _(tidak disetel)_ | kunci API untuk backend Notion (digunakan oleh preset backend `genericBackend.ts` yang diketahui). | | `NOTION_API_URL` | `https://api.notion.com/v1` | Basis URL untuk Notion API (dapat menggantikan alternatif Notion yang dihosting sendiri). | | `OBSIDIAN_API_KEY` | _(tidak disetel)_ | kunci API untuk backend Obsidian Vault (digunakan oleh preset backend `genericBackend.ts` yang diketahui). | | `OBSIDIAN_API_URL` | `http://localhost:27123` | Basis URL untuk Obsidian Vault API (dapat diganti untuk brankas jarak jauh). | | `MEMORY_TYPED_DECAY_ENABLED` | `false` | saklar master peluruhan memori yang diketik TV6.** Ikut serta (default nonaktif)** — sapuan** menghapus** kenangan yang membusuk. Jika dinonaktifkan, `access_count`/`last_accessed_at` adalah telemetri murni dan tidak ada yang dihapus. | | `MEMORY_TYPED_DECAY_EPISODIC_DAYS` | `30` | TTL (hari) setelah itu memori `episodic` yang tidak terpakai akan rusak. `0` membuat kekebalan episodik juga. Tipe tahan lama (`factual`/`procedural`/`semantic`) selalu kebal. Jam peluruhan kembali didasarkan pada `last_accessed_at`. | | `MEMORY_TYPED_DECAY_ACCESS_IMMUNITY` | `3` | Memori yang disuntikkan `>=` berkali-kali menjadi kebal terhadap pembusukan apa pun jenisnya. `0` menonaktifkan kekebalan akses. | | `MEMORY_TYPED_DECAY_SWEEP_INTERVAL` | `0` (dinonaktifkan) | Interval (detik) untuk sapuan peluruhan periodik opsional dalam `src/lib/memory/typedDecay.ts`. `0`/unset = tidak ada sapuan berkala. Keikutsertaan ganda: juga memerlukan `MEMORY_TYPED_DECAY_ENABLED=true`. | | `OMNIROUTE_STRICT_SYSTEM_PROVIDERS` | _(tidak disetel)_ | Id penyedia yang dipisahkan koma (tidak peka huruf besar-kecil) yang menerima pesan `system`** hanya pada indeks 0** (`src/lib/memory/injection.ts`). Untuk hal ini, sambungan memori mid-array yang aman untuk cache tidak aman dalam percakapan multi-putaran, jadi memori adalah merged/prepended sebagai pesan sistem utama. Defaultnya hanya `xiaomi-mimo`/`mimo`; extend untuk titik akhir yang kompatibel dengan OpenAI yang dihosting sendiri (misalnya Qwen3.5 +/3.6) yang templat obrolannya menerapkan batasan pesan sistem utama tunggal yang sama. | ### Contoh Docker RAM rendah `128` hanya untuk dasbor. Agen pengkodean di tumpukan ini `FATAL ERROR` selama `/v1/responses` yang panjang. Jangan gunakan contoh ini sebagai gateway 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. Sinkronisasi Harga Sinkronisasi data harga model otomatis dari sumber eksternal. | Variabel | Bawaan | Berkas Sumber | Keterangan | | ----------------------- | ---------------- | ------------------------ | -------------------------------------------- | | `PRICING_SYNC_ENABLED` | `false` | `src/lib/pricingSync.ts` | Ikut serta dalam sinkronisasi harga berkala. | | `PRICING_SYNC_INTERVAL` | `86400` (24 jam) | `src/lib/pricingSync.ts` | Interval sinkronisasi dalam hitungan detik. | | `PRICING_SYNC_SOURCES` | `litellm` | `src/lib/pricingSync.ts` | Sumber data yang dipisahkan koma. | --- ## Sinkronisasi Arena ELO | Variabel | Bawaan | Berkas Sumber | Keterangan | | ---------------------------- | ---------------- | ------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `ARENA_ELO_SYNC_ENABLED` | `true` | `src/shared/constants/featureFlagDefinitions.ts` | Sinkronisasi ELO papan peringkat AI Arena berkala, dapat dikonfigurasi dari Bendera Fitur Dasbor atau dengan `false` untuk memilih tidak ikut. | | `MODELS_CATALOG_PREFIX_MODE` | `dual` | `src/shared/constants/featureFlagDefinitions.ts`, `src/app/api/v1/models/catalog.ts` | Bentuk awalan yang digunakan untuk id model di `GET /v1/models`. `dual` mengiklankan awalan alias pendek dan awalan penyedia kanonik untuk setiap model (kompatibilitas mundur — kira-kira menggandakan katalog); `alias` mengeluarkan satu id per model; `canonical` hanya memancarkan awalan id penyedia lengkap (penyedia yang aliasnya sudah menjadi id kanonik tetap menyimpan entri tunggalnya). Klien dapat mengganti per permintaan dengan `?prefix=alias`. Lihat [API_REFERENCE](API_REFERENCE.md#model-id-prefixes-prefix). | | `ARENA_ELO_SYNC_INTERVAL` | `86400` (24 jam) | `src/lib/arenaEloSync.ts` | Interval sinkronisasi dalam hitungan detik. | --- ## PromptQL Penyedia Taman Bermain (Unofficial/Experimental) Jembatan sesi GraphQL yang direkayasa ulang untuk prompt.ql.app (`src/shared/constants/providers/web-cookie.ts`). Semua default — opsional mengarah ke titik akhir taman bermain publik; timpa hanya untuk penerapan self-hosted/alternate PromptQL. | Variabel | Bawaan | Berkas Sumber | Keterangan | | ---------------------------- | ------------------------------------------------------------------ | ----------------------------------------------------------------------- | -------------------------------------------------------------------------------- | | `PROMPTQL_GRAPHQL_ENDPOINT` | `https://data.prompt.ql.app/promptql/playground-v2-hge/v1/graphql` | `open-sse/executors/promptql.ts` | titik akhir GraphQL digunakan untuk operasi chat/session. | | `PROMPTQL_CREDITS_ENDPOINT` | `https://data.pro.ql.app/v1/graphql` | `open-sse/executors/promptql.ts`, `open-sse/services/usage/promptql.ts` | titik akhir GraphQL digunakan untuk menanyakan kredit balance/usage. | | `PROMPTQL_TOKEN_REFRESH_URL` | `https://auth.pro.ql.app/ddn/project/token` | `open-sse/executors/promptql.ts` | Titik akhir digunakan untuk penyegaran token dengan upaya terbaik. | | `PROMPTQL_POLL_TIMEOUT_MS` | `180000` | `open-sse/executors/promptql.ts` | Waktu maksimum (md) untuk melakukan polling `thread_events` sebelum waktu habis. | --- ## HyperAgent Penyedia Web (Unofficial/Experimental) Jembatan sesi rekayasa balik untuk hyperagent.com (`src/shared/constants/providers/web-cookie.ts`). Opsional — titik default pada titik akhir billing/usage publik; timpa hanya untuk penerapan self-hosted/alternate HyperAgent. | Variabel | Bawaan | Berkas Sumber | Keterangan | | ---------------------- | --------------------------------------------------- | --------------------------------------- | ---------------------------------------------------------------- | | `HYPERAGENT_USAGE_URL` | `https://hyperagent.com/api/settings/billing/usage` | `open-sse/services/usage/hyperagent.ts` | Titik akhir digunakan untuk mengambil blok kredit billing/usage. | --- ## Kebijakan Anggaran Penggunaan Tanpa Harga | Variabel | Bawaan | Berkas Sumber | Keterangan | | ------------------------------ | ---------------------------------------------------------------------- | ---------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `UNPRICED_USAGE_BUDGET_POLICY` | _(tidak disetel; gagal ditutup kecuali penyisihan boolean diaktifkan)_ | `src/shared/utils/featureFlags.ts` | Batas daily/weekly USD per kunci: `fail_closed` memblokir penggunaan yang benar-benar tidak berharga; `count_as_zero` menghitungnya sebagai $0 sambil menerapkan pembelanjaan sesuai harga. Enum eksplisit (DB sebelum env) mengesampingkan boolean opt-out. Nilai yang tidak valid dan kegagalan pencarian harga gagal ditutup. | | `USAGE_LIMIT_IGNORE_UNPRICED` | `false` | `src/shared/utils/featureFlags.ts` | Penyisihan kompatibilitas boolean upstream: menghitung penggunaan yang benar-benar tidak diberi harga sebagai $0 hanya ketika tidak ada kebijakan enum eksplisit yang dikonfigurasi. Pembelanjaan harga dan pencarian yang gagal tetap diberlakukan. | ## Kuota Pemakaian Kode Kilo Saldo USD pribadi dan pencarian penggunaan Kilo Pass untuk penyedia Kode Kilo. Opsional — titik default di Kilo publik API; timpa hanya untuk perlengkapan relay/test. Otentikasi menggunakan token akses OAuth koneksi yang ada. | Variabel | Bawaan | Berkas Sumber | Keterangan | | -------------- | --------------------- | ------------------------------------- | ------------------------------------------------------------------------------------- | | `KILO_API_URL` | `https://api.kilo.ai` | `open-sse/services/usage/kilocode.ts` | Basis URL digunakan untuk mengambil saldo Kode Kilo pribadi dan penggunaan Kilo Pass. | --- ## Penyedia Web Adobe Firefly (Unofficial/Experimental) Penyegaran sesi berbasis browser untuk penyedia web Adobe Firefly (`open-sse/services/adobeFireflyBrowserLogin.ts`, `open-sse/services/adobeFireflySession.ts`, `open-sse/services/adobeFireflyClient.ts`). — opsional, semua default disetel untuk instalasi desktop normal. > **Dihapus di #9255.** Runtime Chrome lama yang terpasang pada CDP (adobeFireflyChromeRuntime.ts) digantikan oleh layanan login browser Playwright, dan kenopnya tidak ada lagi. Variabel ADOBE_FIREFLY_CHROME_ CDP_PORT / VISIBLE / HEADED / PING / FORCE_RESTART, ditambah ADOBE_FIREFLY_LOGIN_WAIT_MS dan ADOBE_FIREFLY_FORTER_WAIT_MS, tidak dibaca di mana pun dalam basis kode — pengaturannya tidak berpengaruh. | Variabel | Bawaan | Berkas Sumber | Keterangan | | ------------------------------------ | ----------------- | ----------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------- | | `ADOBE_FIREFLY_CHROME_HEADLESS` | `0` | `open-sse/services/adobeFireflyBrowserLogin.ts` | Setel ke `1` untuk Chrome tanpa kepala yang sebenarnya (dikenal rusak untuk pembuatan; hanya debug). | | `ADOBE_FIREFLY_BROWSER_REFRESH` | `1` | `open-sse/services/adobeFireflySession.ts` | Browser proaktif hangat opt-in/out. `0` menonaktifkan hangat proaktif (pemulihan 408 pertengahan batch masih berlaku). | | `ADOBE_FIREFLY_SESSION_DISK` | `1` | `open-sse/services/adobeFireflySession.ts` | Setel ke `0` untuk menonaktifkan sesi Adobe Firefly yang bertahan ke disk. | | `ADOBE_FIREFLY_MIN_SUBMIT_GAP_MS` | _(tidak disetel)_ | `open-sse/services/adobeFireflySession.ts` | Kesenjangan minimum (md) yang diberlakukan antara pengiriman berturut-turut, menggantikan default bawaan. | | `ADOBE_FIREFLY_BATCH_EXTRA_GAP_MS` | _(tidak disetel)_ | `open-sse/services/adobeFireflySession.ts` | Celah ekstra (ms) ditambahkan setelah batch berhasil, menggantikan default bawaan. | | `ADOBE_FIREFLY_SUBMIT_BASE_DELAY_MS` | _(tidak disetel)_ | `open-sse/services/adobeFireflyClient.ts` | Penundaan dasar (ms) sebelum mengirimkan permintaan pembuatan, mengesampingkan default bawaan. | --- ## 19. Sinkronisasi Model (Pengembangan) | Variabel | Bawaan | Berkas Sumber | Keterangan | | ----------------------------------- | ----------------- | ---------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `MODELS_DEV_SYNC_ENABLED` | _(tidak disetel)_ | `src/lib/modelsDevSync.ts` | Penggantian keras untuk sinkronisasi harga models.dev. Batalkan pengaturan = honor Pengaturan > AI (`modelsDevSyncEnabled`). `0`/`false`/`off`/`no`** menang atas DB** dan melewatkan sinkronisasi berkala dan pemindaian `getModelsDevPricing()` SQL/JSON (pemulihan saat dasbor terjepit pada loop peristiwa yang sama). `1`/`true`/`on`/`yes` memaksa sinkronisasi aktif. Harga save/clear masih memanggil `backupDbFile("pre-write")`, yang merupakan larangan pengoperasian di bawah throttle 60 menit atau `DISABLE_SQLITE_AUTO_BACKUP`. | | `MODELS_DEV_SYNC_INTERVAL` | `86400` (24 jam) | `src/lib/modelsDevSync.ts` | Interval sinkronisasi katalog model waktu pengembangan dalam hitungan detik. | | `CONTEXT_WINDOW_RECONCILE_INTERVAL` | `86400` (24 jam) | `src/lib/contextWindowResolver.ts` | Interval (detik) untuk rekonsiliasi jendela konteks yang mengoreksi sendiri (5004): menyematkan jendela yang dideklarasikan penyedia dari penemuan `/models` saat `auto:discovery` diganti ketika jendela tersebut menyimpang dari katalog. Setel ke `0` untuk menonaktifkan. Menggunakan kembali data yang sudah disinkronkan (tidak ada pengambilan baru); tidak pernah menimpa penimpaan `manual`. | --- ## 20. Pengaturan Khusus Penyedia | Variabel | Bawaan | Berkas Sumber | Keterangan | | ---------------------------------------------- | -------------------------------------- | ---------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | `OPENROUTER_CATALOG_TTL_MS` | `86400000` (24 jam) | `src/lib/catalog/openrouterCatalog.ts` | cache katalog model OpenRouter TTL. | | `MODEL_CATALOG_INCLUDE_NAMES` | `true` | `src/shared/constants/featureFlagDefinitions.ts` | Sertakan bidang `name` yang ramah tampilan dalam respons `/v1/models`. Nonaktifkan untuk klien yang mengharapkan IDs saja. | | `OMNIROUTE_GEMINI_WEB_ARGON_ENABLED` | `0` (mati) | `open-sse/config/providers/registry/gemini/web/index.ts` | Ikut serta (#16573). Atur `1` (atau `true`/`yes`) untuk mengiklankan `gweb/gemini-4-argon` di penyedia Web Gemini dan biarkan pelaksananya memilih mode itu. Nonaktif secara default karena pemilih menu mode Argon belum diperiksa terhadap akun Web Gemini langsung; saat nonaktif, model tersebut tidak terdaftar dan permintaannya ditolak karena model yang tidak dikenal, seperti sebelumnya. Baca saat startup, jadi perubahan perlu dimulai ulang. | | `CATALOG_BUILD_TIMEOUT_MS` | `8000` (8 detik) | `src/app/api/v1/models/catalogCache.ts` | Jalur dingin menunggu untuk membangun kembali katalog `GET /v1/models` yang digabungkan (#12627). Saat batas waktu habis, 200 barang terakhir disajikan jika ada. | | `OMNIROUTE_SYNCED_CATALOG_STALE_AFTER_MS` | `2592000000` (30 hari) | `src/lib/db/models/activeSyncedCatalog.ts` | Usia setelah daftar model koneksi yang disinkronkan berhenti menjadi otoritatif untuk perutean dan gagal dibuka ke registri (#12849). Baris yang tidak pernah diberi stempel waktu dianggap basi. | | `OMNIROUTE_ANALYTICS_CACHE_TTL_MS` | `60000` (60an) | `src/lib/usage/analyticsResponseCache.ts` | Berapa lama respons `GET /api/usage/analytics` yang lambat digunakan kembali untuk string kueri yang sama (#15629). `0` menonaktifkan cache. | | `OMNIROUTE_ANALYTICS_CACHE_MIN_COMPUTE_MS` | `1000` (1s) | `src/lib/usage/analyticsResponseCache.ts` | Hanya respons analitik yang memerlukan waktu setidaknya selama ini untuk dibuat yang disimpan dalam cache, sehingga instance kecil selalu melihat data baru. | | `OMNIROUTE_CACHE_METRICS_MIN_COMPUTE_MS` | tidak disetel (mati) | `src/app/api/cache/route.ts` melalui `src/lib/usage/analyticsResponseCache.ts` | Ikut serta (#16361). Saat disetel ke bilangan bulat non-negatif N, bagian riwayat penggunaan `GET /api/cache` (total cache cepat tren + ) disajikan dari cache respons analitik bersama ketika dibutuhkan setidaknya N ms untuk membangun, per jendela `trendHours` yang dijepit, untuk `OMNIROUTE_ANALYTICS_CACHE_TTL_MS` (riwayat mungkin tertinggal hingga TTL itu; `DELETE /api/cache` membuatnya tidak valid). Riwayat = yang tidak disetel atau tidak valid dibaca langsung pada setiap permintaan. | | `NANOBANANA_POLL_TIMEOUT_MS` | `120000` | `open-sse/handlers/imageGeneration.ts` | Max menunggu pekerjaan pembuatan gambar NanoBanana. | | `NANOBANANA_POLL_INTERVAL_MS` | `2500` | `open-sse/handlers/imageGeneration.ts` | frekuensi jajak pendapat pekerjaan NanoBanana. | | `ADOBE_FIREFLY_SUBMIT_BASE_DELAY_MS` | `8000` | `open-sse/services/adobeFireflyUpscale.ts` | Penundaan dasar untuk backoff eksponensial kirim-coba ulang kelas atas Adobe Firefly. | | `AWS_REGION` | _(tidak disetel)_ | `src/lib/providers/validation.ts`, `open-sse/handlers/audioSpeech.ts` | Wilayah yang digunakan untuk membangun titik akhir AWS Bedrock (Kiro, audio). | | `AWS_DEFAULT_REGION` | _(tidak disetel)_ | `src/lib/providers/validation.ts`, `open-sse/handlers/audioSpeech.ts` | Penggantian ketika `AWS_REGION` tidak disetel. | | `CLOUDFLARE_ACCOUNT_ID` | _(tidak disetel)_ | `open-sse/executors/cloudflare-ai.ts` | Akun ID untuk Cloudflare Pekerja AI. | | `CLOUDFLARE_PLAYGROUND_CHROME_PATH` | _(tidak disetel)_ | `open-sse/executors/cloudflare-playground.ts` | Jalur biner Chrome desktop lengkap untuk pelaksana Cloudflare AI Playground, digunakan saat pemeriksaan sidik jari tanpa kepala memblokir Chromium yang dibundel Playwright. | | `CODEBUDDY_SYSTEM_PROMPT_MAX_LEN` | ∅ (∞) — _unset = tanpa batas panjang_ | `open-sse/executors/codebuddy/shared.ts` | Batas panjang opsional untuk perintah sistem pemanggil yang dikirim ke CodeBuddy (CN dan Internasional). Secara default hanya prompt yang membawa penanda identitas agen pengkodean yang diganti dengan yang netral ( filter konten Tencent menolaknya); perintah panjang disimpan. Bilangan bulat > 0 juga menggantikan prompt sistem apa pun yang lebih panjang dari karakter sebanyak itu; tidak disetel, `0` atau nilai non-integer akan menonaktifkan batas. Setiap pengganti mencatat aturan mana yang diaktifkan (penanda identitas atau panjangnya). | | `CLOUDFLARE_API_BASE` | `https://api.cloudflare.com/client/v4` | `src/app/api/settings/proxy/cloudflare-deploy/route.ts` | Ganti basis Cloudflare REST API yang digunakan oleh penyebar relai Pekerja kumpulan proksi (#4640 / 9router#1360). | | `NEXT_PUBLIC_CLOUDFLARE_RELAY_DEFAULT_PROJECT` | `omniroute-relay` | `src/app/(dashboard)/dashboard/settings/components/proxy/CloudflareRelayModal.tsx` | Nama proyek pekerja default disarankan dalam modal "Deploy Relay" kumpulan proksi. | | `NEXT_PUBLIC_CLOUDFLARE_RELAY_ENABLED` | `true` | `src/app/(dashboard)/dashboard/settings/components/proxy/ProxyPoolTab.tsx` | Atur ke `false` untuk menyembunyikan opsi relai Cloudflare Workers dari tab Proxy Pool. | | `CLOUDFLARED_BIN` | deteksi otomatis | `src/lib/cloudflaredTunnel.ts` | Jalur khusus ke biner `cloudflared`. | | `CLOUDFLARED_PROTOCOL` | `http2` | `src/lib/cloudflaredTunnel.ts` | Protokol transport terowongan: `http2` (default), `quic`, atau `auto`. | | `CLOUDFLARED_CONFIG` | _(tidak disetel)_ | `src/lib/cloudflaredTunnel.ts` | Jalur ke `config.yml` cloudflared yang dikelola secara lokal (dengan `tunnel:`, `credentials-file:`, `ingress:`). Jika disetel, OmniRoute menjalankan `tunnel --config run` (bernama terowongan) alih-alih terowongan cepat sementara. | | `CLOUDFLARED_HOSTNAME` | _(dari masuknya konfigurasi)_ | `src/lib/cloudflaredTunnel.ts` | Ganti nama host publik terowongan (misalnya `ai.example.com`), dilaporkan sebagai `publicUrl`/`apiUrl`. Jika tidak disetel, itu dibaca dari nama host `ingress` pertama konfigurasi. | | `DENO_DEPLOY_API_BASE` | `https://api.deno.com/v2` | `src/app/api/settings/proxy/deno-deploy/route.ts` | Ganti basis Deno Deploy REST API yang digunakan oleh penyebar relai kumpulan proksi (#4643 / 9router#1437). | | `NEXT_PUBLIC_DENO_RELAY_DEFAULT_PROJECT` | `omniroute-deno-relay` | `src/app/(dashboard)/dashboard/settings/components/proxy/DenoRelayModal.tsx` | Nama aplikasi Deno Deploy default disarankan dalam modal "Deploy Relay" kumpulan proxy. | | `NEXT_PUBLIC_DENO_RELAY_ENABLED` | `true` | `src/app/(dashboard)/dashboard/settings/components/proxy/ProxyPoolTab.tsx` | Setel ke `false` untuk menyembunyikan opsi relai Deno Deploy dari tab Proxy Pool. | | `SEARCH_CACHE_TTL_MS` | `300000` (5 menit) | `open-sse/services/searchCache.ts` | TTL untuk pencarian cache respons API (Kebingungan, Berani, dll.). | | `ENABLE_CC_COMPATIBLE_PROVIDER` | `false` | `src/shared/utils/featureFlags.ts` | Mengungkapkan penyedia eksperimental yang kompatibel dengan CC UI untuk relai khusus Kode Claude. | | `NINEROUTER_HOST` | `127.0.0.1` | `open-sse/executors/ninerouter.ts` | Ganti host tempat instance 9router yang tertanam mendengarkan. | | `NINEROUTER_PORT` | `20130` | `open-sse/executors/ninerouter.ts` | Ganti port tempat instance 9router yang tertanam mendengarkan. | | `EMBED_WS_PROXY_HOST` | `127.0.0.1` | `src/lib/services/embedWsProxy.ts` | Ikat host untuk proksi WebSocket layanan tertanam (hanya loopback secara default). | | `EMBED_WS_PROXY_PORT` | `20131` | `src/lib/services/embedWsProxy.ts` | Port untuk server proksi WebSocket layanan tertanam. | | `CLIPROXYAPI_HOST` | `127.0.0.1` | `open-sse/executors/cliproxyapi.ts` | CLIProxyAPI bridge host (integrasi warisan). | | `CLIPROXYAPI_PORT` | `5544` | `open-sse/executors/cliproxyapi.ts` | pelabuhan jembatan CLIProxyAPI. | | `CLIPROXYAPI_API_KEY` | _(kosong)_ | `open-sse/handlers/chatCore/cliproxyapiCredentials.ts` | Penggantian kunci bidang data ketika pengaturan `cliproxyapi_api_key` tidak ada. | | `CLIPROXYAPI_MANAGEMENT_KEY` | _(kosong)_ | `src/lib/services/cliproxyAccountHealth.ts` | Kunci manajemen untuk kesehatan akun dibaca dari instance CLIProxyAPI yang dikelola secara eksternal. | | `CLIPROXYAPI_CONFIG_DIR` | `~/.cli-proxy-api` | `src/lib/versionManager/processManager.ts` | direktori konfigurasi CLIProxyAPI. | | `CLIPROXY_BIND_HOST` | `127.0.0.1` | `docker-compose.yml` | Antarmuka host docker-compose menerbitkan sespan `cliproxyapi` di (#12578). Volume datanya menyimpan kredensial penyedia OAuth/API dan gambar yang disematkan tidak memiliki bidang data berbasis env `api-keys` override (hanya `config.yaml` yang terpasang), sehingga `0.0.0.0` memaparkan layanan yang mengandung kredensial ke seluruh LAN. | | `MUX_SERVICE_PORT` | `8322` | `src/lib/services/bootstrap.ts` | Ganti port tempat daemon orkestrasi agen Mux (coder/mux) yang tertanam mendengarkan (selalu 127.0.0.1). | | `OPENWA_SERVICE_PORT` | `8323` | `src/lib/services/bootstrap.ts` | Ganti port tempat daemon open-wa (WhatsApp Web automasi) yang tertanam mendengarkan (selalu 127.0.0.1). | | `DARIO_HOST` | `127.0.0.1` | `open-sse/executors/dario.ts` | Host bind/connect layanan tertanam Dario (hanya loopback secara default). | | `DARIO_PORT` | `3456` | `open-sse/executors/dario.ts` | Port layanan tertanam Dario. | | `DARIO_HOST` | `127.0.0.1` | `open-sse/executors/dario.ts` | Host bind/connect layanan tertanam Dario (hanya loopback secara default). | | `DARIO_PORT` | `3456` | `open-sse/executors/dario.ts` | Port layanan tertanam Dario. | | `LOCAL_HOSTNAMES` | _(kosong)_ | `open-sse/config/providerRegistry.ts` | Nama host tambahan yang dipisahkan koma diperlakukan sebagai "lokal" ( nama layanan Docker, dll.). | `ENABLE_CC_COMPATIBLE_PROVIDER` hanya untuk relay pihak ketiga yang menerima klien Kode Claude secara eksklusif. OmniRoute menulis ulang permintaan sehingga relay tersebut menerimanya. Jika Anda hanya ingin menggunakan Kode Claude CLI, atau Anda tidak yakin apa itu relay, tetap nonaktifkan ini dan tambahkan penyedia reguler yang kompatibel dengan Anthropic. --- ## 21. Kesehatan Proksi | Variabel | Bawaan | Berkas Sumber | Keterangan | | ------------------------------------------------- | ------------------------ | ----------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `PROXY_FAST_FAIL_TIMEOUT_MS` | `2000` | `src/lib/proxyHealth.ts` | Batas waktu pemeriksaan kondisi gagal cepat. | | `PROXY_LATENCY_WINDOW_HOURS` | `3` | `src/lib/db/proxies.ts` | Jangka waktu (jam) untuk menghitung latensi rata-rata kandidat proksi dalam strategi kumpulan latensi yang dioptimalkan. | | `PROXY_HEALTH_CACHE_TTL_MS` | `30000` | `src/lib/proxyHealth.ts` | Cache hasil pemeriksaan kesehatan TTL. | | `NONE_HONORED_WINDOW_HOURS` | `24` | `src/lib/db/reasoningEffortCompliance.ts` | Jeda akhir dalam hitungan jam untuk penalaran_usaha = tidak ada pembaca kepatuhan di GET /v1/models/health. | | `NONE_HONORED_CACHE_TTL_MS` | `20000` | `src/lib/db/reasoningEffortCompliance.ts` | Cache TTL dalam ms untuk snapshot ketidakpatuhan (15-30 detik). | | `NONE_HONORED_MIN_SAMPLE` | `3` | `src/lib/db/reasoningEffortCompliance.ts` | Minimal tidak ada permintaan sebelum model terbaca dihormati atau tidak dihormati; di bawah ini modelnya berbunyi tidak diketahui. | | `PROXY_HEALTH_UNHEALTHY_CACHE_TTL_MS` | `2000` | `src/lib/proxyHealth.ts` | Cache TTL untuk pemeriksaan kesehatan proxy yang gagal. Jaga agar ini lebih pendek dari `PROXY_HEALTH_CACHE_TTL_MS` sehingga waktu tunggu proxy sementara di bawah konkurensi tinggi, coba lagi dengan cepat tanpa menonaktifkan fast-fail untuk proxy yang benar-benar mati. | | `PROXY_HEALTH_ENABLED` | `true` | `src/lib/proxyHealth/scheduler.ts` | Atur `false` untuk menonaktifkan penjadwal kesehatan proksi latar belakang yang secara berkala menyelidiki proksi terdaftar. | | `PROXY_HEALTH_INTERVAL_MS` | `600000` | `src/lib/proxyHealth/scheduler.ts` | Interval sapuan penjadwal kesehatan latar belakang dalam ms (minimum `60000`). | | `PROXY_HEALTH_RELAY_INTERVAL_MS` | `21600000` | `src/lib/proxyHealth/relayCadence.ts` | Interval pemeriksaan dalam ms untuk proxy edge-relay (`deno`/`vercel`/`cloudflare`), yang pemeriksaannya membangunkan isolat tanpa server yang ditagih (minimum `60000`). | | `PROXY_HEALTH_RECOVERY_INTERVAL_MS` | `600000` | `src/lib/proxyHealth/scheduler.ts` | Interval jalur pemulihan latar belakang dalam ms: seberapa sering proksi yang sebelumnya tidak sehat diperiksa ulang sehingga proksi yang dipulihkan kembali berputar tanpa memulai ulang. Nilai di bawah `60000` kembali ke default. | | `PROXY_HEALTH_TEST_URL` | `https://httpbin.org/ip` | `src/lib/proxyHealth/probeTarget.ts` | Target pemeriksaan keterjangkauan yang digunakan oleh penjadwal dan titik akhir `/api/settings/proxies/auto-test`. Arahkan ke internal/self-hosted URL untuk menghindari default publik. | | `PROXY_HEALTH_TEST_CONCURRENCY` | `10` | `src/lib/proxyHealth/probeTarget.ts` | Probe dimulai sekaligus per batch, dibagikan oleh penjadwal dan titik akhir `/api/settings/proxies/auto-test`. Berlantai 1 dan dibatasi pada 50. | | `PROXY_HEALTH_TEST_STAGGER_MS` | `100` | `src/lib/proxyHealth/probeTarget.ts` | Penundaan ms antara dua keberangkatan probe dalam satu batch. Tanpanya, seluruh kelompok akan keluar pada saat yang sama dan jalan keluar bersama IP dapat membuat target yang dibatasi lajunya tersandung. Setel ke `0` untuk menonaktifkan spasi; dibatasi pada 5000. | | `PROXY_HEALTH_USE_PROVIDER_TARGET` | `true` | `src/lib/proxyHealth/providerProbeTarget.ts` | Setel "false" untuk berhenti menyelidiki host sebenarnya dari penyedia proxy yang ditetapkan (`GET /models`, tanpa kunci API ) dan selalu gunakan `PROXY_HEALTH_TEST_URL` sebagai gantinya. | | `PROXY_HEALTH_AUTO_DEACTIVATE` | `false` | `src/lib/proxyHealth/statusPolicy.ts` | Ketika `false` (default), probe keterjangkauan otomatis (penjadwal + tombol `/api/settings/proxies/auto-test` "Uji Semua") adalah** hanya baca** dan jangan pernah menulis status proksi — hanya operator yang menetapkan active/inactive, sehingga pemeriksaan yang tidak stabil tidak dapat membuat proksi yang ditetapkan terdampar (#6246). Setel `true` untuk memulihkan perilaku pengujian dan pengaturan yang lama. | | `FLUSH_EMPTY_RETRY_ENABLED` | `false` | `src/shared/utils/featureFlags.ts` | Tanda fitur keikutsertaan (lihat [FEATURE_FLAGS.md](./FEATURE_FLAGS.md) ; penggantian DB dasbor menang). `true` (atau `1`, `yes`) mencoba ulang streaming kosong yang diterjemahkan melalui jalur kredensial normal (hingga `STREAM_RECOVERY.EMPTY_TURN_RETRY_MAX` mencoba ulang) alih-alih mengekspos 200 kosong atau konten kosong 502. | | `EMPTY_STREAM_SIBLING_RECOVERY_ENABLED` | `false` | `src/shared/utils/featureFlags.ts` | Tanda fitur keikutsertaan (lihat [FEATURE_FLAGS.md](./FEATURE_FLAGS.md) ; penggantian DB dasbor menang). `true` (atau `1`, `yes`) mempersenjatai pemeriksaan konten aliran kosong Claude/Codex dan menggunakan percobaan ulang terbatas yang ada pada koneksi lain yang memenuhi syarat setelah putaran `empty_content`, tanpa cooldown atau penguncian model. | | `STREAM_LATE_OUTPUT_PROBE_ENABLED` | `false` | `src/shared/utils/featureFlags.ts` | Tanda fitur keikutsertaan (lihat [FEATURE_FLAGS.md](./FEATURE_FLAGS.md) ; penggantian DB dasbor menang). `true` (atau `1`, `yes`) terus mengambil sampel satu potongan yang diteruskan di 16 setelah 64 yang pertama sehingga keluaran yang terlihat terlambat masih menandai aliran sebagai keluaran yang dipancarkan (satu-satunya keluaran pasca 5xx tetap dalam cakupan permintaan alih-alih penguncian hanya model). | | `PROXY_POOL_EGRESS_OBSERVATION` | `false` | `src/shared/utils/featureFlags.ts` | Tanda fitur keikutsertaan (lihat [FEATURE_FLAGS.md](./FEATURE_FLAGS.md) ; penggantian DB dasbor menang). `true` (atau `1`, `yes`) menunjukkan pengamatan jalan keluar kumpulan hanya-baca di bawah kumpulan proksi di dasbor (jalan keluar yang berbeda IPs, koneksi dan yang paling banyak terlihat di belakang satu IP selama 24 jam terakhir, dari log proksi). Tidak pernah digunakan untuk perutean. | | `PROXY_OPERATOR_EGRESS_ENABLED` | `false` | `src/shared/utils/featureFlags.ts` | Tanda fitur keikutsertaan (lihat [FEATURE_FLAGS.md](./FEATURE_FLAGS.md) ; penggantian DB dasbor menang). `true` (atau `1`, `yes`) menerima alamat observasi bertanggal yang didorong oleh operator per anggota kumpulan dan menggabungkannya dengan jurnal yang dibaca untuk tampilan dan urutan kumpulan. | | `PROXY_OPERATOR_EGRESS_WINDOW_HOURS` | `24` | `src/lib/db/proxyOperatorEgress.ts` | Jendela observasi dalam hitungan jam untuk baris jalan keluar yang didorong oleh operator (baca setiap kali dibaca; tidak perlu memulai ulang). Dibatasi hingga 1..168; di luar jangkauan, non-numerik, atau kosong kembali ke 24 dengan satu peringatan seluruh proses, tidak pernah ada lemparan. | | `PROXY_AUTO_REMOVE` | `false` | `src/lib/proxyHealth/scheduler.ts` | Atur `true` agar penjadwal menghapus proxy secara otomatis setelah kegagalan berulang kali berturut-turut. | | `PROXY_AUTO_REMOVE_AFTER` | `3` | `src/lib/proxyHealth/scheduler.ts` | Kegagalan berturut-turut sebelum penjadwal menghapus proxy secara otomatis (saat `PROXY_AUTO_REMOVE=true`). | | `PROXY_AUTO_DISABLE` | `false` | `src/lib/proxyHealth/scheduler.ts` | Setel `true` agar penjadwal menonaktifkan sementara (status `dead`, tidak pernah dihapus) proxy setelah kegagalan berulang kali berturut-turut, alih-alih menghapusnya. Alternatif non-destruktif untuk `PROXY_AUTO_REMOVE`: proxy segera keluar dari resolusi pool/rotation (filter status hidup yang digunakan oleh resolusi kumpulan cakupan sudah mengecualikannya) dan secara otomatis diaktifkan kembali setelah mulai meneruskan probe lagi. Membagikan ambang batas `PROXY_AUTO_REMOVE_AFTER`. Jika kedua benderanya `true`, `PROXY_AUTO_REMOVE` menang. | | `PROXY_HEALTH_PASSIVE_SKIP` | `false` | `src/lib/proxyHealth/scheduler.ts` | Lewati pasif keikutsertaan: ketika `true`, penjadwal melewatkan pemeriksaan langsung untuk titik akhir yang lalu lintas produksi terbarunya telah membuktikannya (setidaknya satu keberhasilan dan tidak ada kegagalan proksi yang dikaitkan di jendela, tepat satu penyedia mengamati). Nonaktif secara default: setiap proksi diperiksa. | | `PROXY_PASSIVE_WINDOW_MS` | `300000` | `src/lib/proxyHealth/passiveVerdict.ts` | Jendela dalam ms lalu lintas produksi yang dilihat oleh lompatan pasif (dibatasi `60000..599999`). Lebih pendek dari interval sapuan 10 menit sehingga kegagalan baru-baru ini mendominasi dan bukannya melemahkan. | | `OMNIROUTE_CONTROL_PLANE_PROXY_DIRECT_FALLBACK` | `false` | `src/shared/constants/featureFlagDefinitions.ts` | Izinkan aliran validasi OAuth dan penyedia melewati proksi yang dipasangi pin dan terhubung secara langsung ketika pemeriksaan awal keterjangkauan proksi gagal. Prioritas yang efektif adalah Feature Flags DB override > env var > default. | | `RATE_LIMIT_MAX_WAIT_MS` | `30000` (30an) | `src/lib/resilience/settings.ts` | Bawaan** antrian-tunggu** anggaran: berapa lama suatu permintaan menunggu slot penyedia dan mengantri sebelum ditolak, tidak pernah mencapai hulu. Pengatur waktu dihapus setelah pekerjaan mulai dijalankan. Eksekusi — dibatasi secara terpisah oleh `RATE_LIMIT_EXECUTION_MAX_WAIT_MS`. Env menetapkan default saja: `resilienceSettings.requestQueue.maxWaitMs` yang bertahan, dan kemudian `rateLimitOverrides.maxWaitMs` per koneksi, masing-masing menang atasnya. | | `RATE_LIMIT_EXECUTION_MAX_WAIT_MS` | `600000` (10 menit) | `open-sse/services/rateLimitManager.ts` | Batas atas berapa lama permintaan yang diterima dapat tetap dalam eksekusi sebelum reservasi batas tarifnya habis masa berlakunya — dipisahkan dari anggaran tunggu antrean sehingga pengambilan yang lambat pada gerbang non-inkremental tidak habis waktunya (#12027). | | `RATE_LIMIT_MAX_QUEUE_DEPTH` | `0` (dinonaktifkan) | `open-sse/services/rateLimitManager.ts` | Batas penerimaan antrian: tolak dengan 429 `queue_full` setelah permintaan sebanyak ini sudah masuk antrian. `0` = tidak terbatas (default). | | `RATE_LIMIT_AUTO_ENABLE` | _(tidak disetel)_ | `open-sse/services/rateLimitManager.ts` | Paksa jaring pengaman batas laju pengaktifan otomatis on/off terlepas dari pengaturan Dasbor yang tetap ada (`resilienceSettings.requestQueue.autoEnableApiKeyProviders`). Menerima `true`/`1`/`on` untuk menghidupkan paksa, `false`/`0`/`off` untuk mematikan paksa. Saat aktif (default), koneksi kunci API yang aktif secara otomatis dilindungi batas kecepatan. Menyetel `rateLimitProtection: false` per koneksi akan menonaktifkan perlindungan eksplisit namun tidak memilih keluar dari jaring pengaman ini; menyetel env var ini ke `false` adalah mekanisme global untuk menjalankan koneksi kunci API tanpa antrian batas kecepatan. | | `PROVIDER_COOLDOWN_ENABLED` | _(batalkan → nonaktif)_ | `open-sse/services/providerCooldownTracker.ts` | Ikut serta dalam pelacakan cooldown provider/connection permintaan silang global. OFF secara default (tumpang tindih dengan Cooldown Koneksi / Pemutus Sirkuit Penyedia). Menerima `true`/`1`/`on` untuk mengaktifkan. | | `PROVIDER_COOLDOWN_MIN_MS` | `5000` | `open-sse/services/providerCooldownTracker.ts` | Cooldown minimum (ms) sebelum provider/connection yang gagal dicoba lagi. Berskala secara eksponensial dengan kegagalan berturut-turut. Hanya digunakan saat `PROVIDER_COOLDOWN_ENABLED`. | | `PROVIDER_COOLDOWN_MAX_MS` | `300000` (5 menit) | `open-sse/services/providerCooldownTracker.ts` | Batas cooldown maksimum (ms) sebelum provider/connection yang gagal dicoba lagi. Hanya digunakan saat `PROVIDER_COOLDOWN_ENABLED`. | | `STREAM_RECOVERY_ENABLED` | _(batalkan → nonaktif)_ | `src/lib/resilience/settings.ts` (benih) → `open-sse/services/streamRecovery.ts` (logika) | **Apa:** pemulihan transparan dari aliran hulu yang terpotong (port kode claude bebas). Menahan jendela SSE pembuka hingga `STREAM_RECOVERY.HOLDBACK_MS` (750 ms) sehingga _pre-commit_ cutoff — yang terjadi sebelum byte apa pun mencapai klien — dibuka kembali dan dicoba lagi tanpa terlihat.** Kapan mengaktifkan:** flaky/upstreams yang sering terpotong 0-byte pada awal streaming; tinggalkan OFF jika Anda tidak mampu menambah waktu hingga token pertama hingga 750 ms di setiap aliran. Menerima `true`/`1`/`on`. Membenihkan pengaturan Ketahanan yang bertahan; pengaturan Dasbor menang setelah ditetapkan. | | `STREAM_RECOVERY_MIDSTREAM_ENABLED` | _(batalkan → nonaktif)_ | `src/lib/resilience/settings.ts` (benih) → `open-sse/services/streamRecovery.ts` (logika) | **Apa:** kelanjutan aliran tengah (Fase 4.4) — setelah pemotongan _post-commit_ (byte sudah mencapai klien), permintaan ulang dengan sebagian teks sebagai asisten pra-pengisian dan jahit akhiran yang hilang. Hanya streaming teks biasa yang kompatibel dengan OpenAI; tidak pernah menembak dengan panggilan alat saat terbang.** Kapan mengaktifkan:** generasi panjang yang terpotong di tengah-tengah jawaban dan Anda menerima ekor yang dipulihkan tiba sebagai satu ledakan, bukan token demi token. Independen dari `STREAM_RECOVERY_ENABLED` (profil risiko berbeda). Menerima `true`/`1`/`on`. | | `STREAM_THROUGHPUT_WATCHDOG_ENABLED` | _(batalkan → nonaktif)_ | `src/lib/resilience/settings.ts` → `open-sse/services/throughputWatchdog.ts` | Ikut serta dalam pengawas keluaran berguna aliran aktif. Mendeteksi aliran yang terus mengirimkan potongan namun tetap di bawah tingkat keluaran asisten yang dikonfigurasi; detak jantung, peristiwa penggunaan, delta kosong, dan fase tool/reasoning tidak menyamar sebagai kemajuan. Pisahkan dari batas waktu menganggur dan batas waktu yang sulit. Seeds hanya default: boolean yang disimpan di `resilienceSettings` (Dashboard → Settings → Resilience) diutamakan. | | `STREAM_THROUGHPUT_WATCHDOG_WARMUP_MS` | `30000` | `src/lib/resilience/settings/normalize.ts` | Masa tenggang sebelum evaluasi throughput, dibatasi hingga 0–600000 ms. | | `STREAM_THROUGHPUT_WATCHDOG_WINDOW_MS` | `30000` | `src/lib/resilience/settings/normalize.ts` | Jendela keluaran berguna bergulir, dibatasi hingga 1000–600000 ms; satu jendela lengkap diperlukan sebelum dibatalkan. | | `STREAM_THROUGHPUT_WATCHDOG_MIN_BYTES_PER_SECOND` | `4` | `src/lib/resilience/settings/normalize.ts` | Laju byte keluaran asisten UTF-8 minimum (proksi token konservatif), dibatasi hingga 1–1000000. | | `STREAM_THROUGHPUT_WATCHDOG_MIN_USEFUL_BYTES` | `1` | `src/lib/resilience/settings/normalize.ts` | Sampel keluaran berguna minimum bukan nol yang dianggap dapat diukur, dibatasi hingga 1–1000000 byte. | | `HEALTHCHECK_STAGGER_MS` | `3000` | `src/lib/tokenHealthCheck.ts` | Interval stagger (ms) antara pemeriksaan kesehatan token penyedia saat startup. | | `HEALTHCHECK_JITTER_MIN_MS` | `500` | `src/lib/tokenHealthCheck.ts` | Jitter acak minimum (ms) ditambahkan di atas `HEALTHCHECK_STAGGER_MS` antara pemeriksaan kesehatan token penyedia, untuk mencegah ledakan (Masalah #1220). | | `HEALTHCHECK_JITTER_MAX_MS` | `5000` | `src/lib/tokenHealthCheck.ts` | Jitter acak maksimum (ms) ditambahkan di atas `HEALTHCHECK_STAGGER_MS` antara pemeriksaan kesehatan token penyedia, untuk mencegah ledakan (Masalah #1220). | | `HEALTHCHECK_BATCH_SIZE` | `20` | `src/lib/tokenHealthCheck.ts` | Periksa ukuran batch secara bersamaan untuk sapuan token-healthcheck startup; nilai yang lebih besar memeriksa lebih banyak koneksi secara paralel, nilai yang lebih kecil mengurangi beban burst (Masalah #7875, regresi #7719). | | `REQUEST_RETRY` | `2` | `src/sse/services/cooldownAwareRetry.ts` | Jumlah percobaan ulang otomatis pada respons cooldown cakupan model sebelum mengembalikan kesalahan ke klien. | | `MAX_RETRY_INTERVAL_SEC` | `30` | `src/sse/services/cooldownAwareRetry.ts` | Interval backoff maksimum (detik) antara percobaan ulang cooldown. Dibatasi oleh nilai ini terlepas dari `Retry-After` hulu. | | `HEADROOM_URL` | `http://localhost:8787` | `src/lib/headroom/detect.ts` | Proksi penghemat token ruang kepala URL. Siklus hidup dasbor (`api/headroom/*`) memunculkan `headroom-ai` CLI lokal pada loopback secara default; override hanya untuk menunjuk pada proxy sespan Docker eksternal. | ### Konstanta penyetelan pemulihan aliran Perilaku penundaan pemulihan disetel oleh konstanta hardcode di `open-sse/config/constants.ts` (`STREAM_RECOVERY`), ditampilkan di sini sebagai referensi — mengubahnya memerlukan pengeditan kode, bukan env var: - `STREAM_RECOVERY.HOLDBACK_MS = 750` — berapa lama jendela SSE pembuka ditahan sehingga pemotongan awal dapat dicoba ulang sebelum byte apa pun dikomit ke klien. - `STREAM_RECOVERY.BUFFER_MAX_BYTES = 65536` — tutup keras pada jendela yang ditahan; komit (flush + passthrough) segera setelah byte sebanyak ini terakumulasi, terlepas dari pengatur waktunya. - `STREAM_RECOVERY.EARLY_RETRY_MAX = 4` — max transparan membuka kembali aliran hulu sementara penahan masih belum dikomit. > **Batas tarif jendela geser per penyedia (tidak ada env var):** batas kecepatan jendela geser per penyedia porting FCC _fallback_ ada dalam kode (`open-sse/services/providerDefaultRateLimit.ts`, ditransfer melalui `open-sse/services/rateLimitManager.ts`) tetapi dikirimkan dengan** peta default kosong** dan memiliki** tidak ada operator env var** hari ini — diaktifkan hanya melalui uji kait/edit kode. Sengaja tidak dicantumkan pada tabel di atas. Pembatas relai per `(token, IP)` yang _memiliki kenop adalah `RELAY_IP_PER_MINUTE` (§3 Jaringan & Port). --- ## 22. Men-debug > [!CAUTION] > Variabel-variabel ini menghasilkan** keluaran yang bertele-tele** dan mungkin membocorkan data sensitif.** Jangan pernah mengaktifkan dalam produksi.** | Variabel | Bawaan | Berkas Sumber | Keterangan | | ------------------------------------- | ---------------------------------------- | ----------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | `CURSOR_DEBUG` | _(tidak disetel)_ | `open-sse/executors/cursor.ts` | Atur `1` untuk mengaktifkan log pelaksana Cursor verbose (potongan SSE yang didekodekan, dll.). | | `CURSOR_STREAM_DEBUG` | _(tidak disetel)_ | `open-sse/executors/cursor.ts` | Alias yang kompatibel dengan `CURSOR_DEBUG`. | | `CURSOR_DUMP_FILE` | _(tidak disetel)_ | `open-sse/executors/cursor.ts` | Jalur file opsional yang menerima potongan Cursor mentah yang didekodekan saat `CURSOR_DEBUG=1`. | | `CURSOR_STREAM_TIMEOUT_MS` | `300000` | `open-sse/executors/cursor.ts` | Streaming batas waktu idle (ms) untuk pelaksana Cursor. | | `CURSOR_KV_GRACE_MS` | `2000` | `open-sse/executors/cursor.ts` | Jendela tenggang (ms) setelah terminator lembut kv_after_text komposer ketika byte tetap disangga — memberikan waktu panggilan alat exec_mcp tambahan untuk menyelesaikan bingkainya. | | `CURSOR_TOOL_DIRECTIVE` | diaktifkan (`!== "0"`) | `open-sse/executors/cursor.ts` | Arahan penerapan alat yang membuat composer-2.5 mengeluarkan panggilan alat dengan andal. Setel `0` untuk menonaktifkan. | | `OMNIROUTE_SYSTEM_INSTRUCTION_APPEND` | _(tidak disetel)_ | `open-sse/translator/request/claude-to-openai.ts`, `open-sse/translator/response/openai-to-claude.ts` | Teks perintah sistem yang ditentukan operator ditambahkan ke pesan sistem terjemahan AFTER (injeksi pasca terjemahan), mencapai jalur codex/Responses dan `/v1/messages`. Juga digunakan sebagai awalan direktif yang dihilangkan dari blok pembukaan sistem yang digaungkan. Biarkan tidak disetel untuk menonaktifkan. | | `OMNIROUTE_STRIP_SYSTEM_PREAMBLE` | `0` (mati) | `open-sse/translator/response/openai-to-claude.ts`, `open-sse/utils/directivePreambleStripper.ts` | Setel ke `1` untuk menghapus blok pembukaan perintah sistem yang bergema dari awal aliran claude openai →. Dinonaktifkan secara default — heuristik berbentuk prosa bahasa Inggris dan mengubah payload respons, sehingga balasan yang secara sah dibuka dengan bagian seperti itu akan kehilangannya. | | `CURSOR_IMAGE_FETCH_TIMEOUT_MS` | `15000` | `open-sse/utils/cursorImages.ts` | Batas waktu pengambilan per gambar (ms) untuk input `image_url` vision jarak jauh. | | `CURSOR_STATE_DB_PATH` | _(diselidiki)_ | `open-sse/utils/cursorVersionDetector.ts` | Ganti pencarian Cursor IDE state DB yang digunakan untuk deteksi versi IDE. | | `CURSOR_AGENT_CLI_VERSION` | _(deteksi / sematkan)_ | `open-sse/utils/cursorAgentCliVersion.ts` | Agen CLI membangun id (`YYYY.MM.DD-`) untuk `x-cursor-client-version: cli-…` di Agent Run. | | `CURSOR_AGENT_BIN` | _(tidak disetel)_ | `open-sse/handlers/imageGeneration/providers/cursorAgentImage.ts` | Jalur ke biner Agen Cursor yang digunakan untuk pembuatan gambar. Tidak disetel, pawang menggunakan `providerSpecificData.agentBin` lalu PATH. | | `CURSOR_IMG_TIMEOUT_MS` | `210000` | `open-sse/handlers/imageGeneration/providers/cursorAgentImage.ts` | Jam dinding per gambar (ms) untuk pekerjaan gambar Agen Cursor. | | `CURSOR_IMG_MAX_CONCURRENT` | `2` | `open-sse/handlers/imageGeneration/providers/cursorAgentImage.ts` | Gerbang konkurensi kursi bersama untuk pekerjaan Cursor image. | | `CURSOR_IMG_MODEL` | permintaan / `auto` | `open-sse/handlers/imageGeneration/providers/cursorAgentImage.ts` | Ganti Cursor CLI `--model` untuk pekerjaan gambar. | | `UC_IMAGE_POLL_INTERVAL_MS` | `2000` | `open-sse/handlers/imageGeneration/providers/ucImage.ts` | UC (uncensored.com) irama jajak pendapat hasil gen gambar (ms). | | `UC_IMAGE_POLL_TIMEOUT_MS` | `60000` | `open-sse/handlers/imageGeneration/providers/ucImage.ts` | UC jam dinding hasil jajak pendapat image-gen (ms). | | `UC_VIDEO_POLL_INTERVAL_MS` | `3000` | `open-sse/handlers/videoGeneration/providers/ucVideo.ts` | UC (uncensored.com) irama jajak pendapat hasil gen video (ms). | | `UC_VIDEO_POLL_TIMEOUT_MS` | `300000` | `open-sse/handlers/videoGeneration/providers/ucVideo.ts` | UC jam dinding hasil jajak pendapat video-gen (ms). | | `CURSOR_DATA_DIR` | _(diselidiki)_ | `open-sse/utils/cursorAgentCliVersion.ts` | Ganti direktori data Agen CLI Cursor `…/versions/`); var yang sama yang digunakan agen resmi. | | `CURSOR_TOKEN` | _(tidak disetel)_ | `scripts/ad-hoc/cursor-tap.cjs` | Token pembawa Cursor langsung yang digunakan oleh alat pengembang. | | `OMNIROUTE_LOG_REQUEST_SHAPE` | dinonaktifkan (ikut serta melalui `"1"`) | `src/app/api/v1/chat/completions/route.ts` | Catat penanda content-type/length untuk muatan obrolan besar saat `"1"` disetel. Nonaktif secara default untuk mengurangi gangguan log. | | `DEBUG_RESPONSES_SSE_TO_JSON` | _(tidak disetel)_ | `open-sse/handlers/responseTranslator.ts` | Setel `true` untuk mencatat Respons API SSE→JSON detail terjemahan. | | `DEBUG_CLAUDE_NONSTREAM` | _(tidak disetel)_ | `open-sse/handlers/responseTranslator.ts` | Atur `true` untuk memunculkan potongan textContent kosong di jalur terjemahan respons Claude (khusus debug). | | `NEXT_PUBLIC_OMNIROUTE_E2E_MODE` | _(tidak disetel)_ | tali uji E2E | Atur `true` untuk mengaktifkan mode pengujian E2E (auth santai, kait pengujian). | --- ## 23. Integrasi GitHub Izinkan pengguna melaporkan masalah langsung dari Dasbor. | Variabel | Bawaan | Berkas Sumber | Keterangan | | --------------------- | ----------------- | ----------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------- | | `GITHUB_ISSUES_REPO` | _(tidak disetel)_ | `src/app/api/v1/issues/report/route.ts` | Repositori dalam format `owner/repo`. | | `GITHUB_ISSUES_TOKEN` | _(tidak disetel)_ | `src/app/api/v1/issues/report/route.ts` | GitHub Personal Access Token dengan cakupan `issues:write`. | | `GITHUB_TOKEN` | _(tidak disetel)_ | mengeluarkan triase / pembantu agen cloud | Token akses GitHub generik digunakan sebagai cadangan untuk `GITHUB_ISSUES_TOKEN` dan digunakan oleh pembantu agen cloud di `src/lib/cloudAgent/*`. | --- ## Render Keep-Alive Tingkat Gratis Render memutar layanan web gratis setelah sekitar 15 menit tanpa lalu lintas masuk. Peluncur mandiri (`scripts/dev/run-standalone.mjs`, yang menjalankan gambar Docker ) dapat melakukan ping URL publik layanan itu sendiri untuk mencegah hal itu. Ia tidak melakukan apa pun kecuali URL publik tersedia, dan ia hanya mencatat ketika statusnya berubah. | Variabel | Bawaan | Keterangan | | ---------------------------- | ------------------------ | -------------------------------------------------------------------------------------------------------------------------------------- | | `SELF_PING_ENABLED` | aktif saat URL disetel | `0`, `false`, `off` atau `no` mematikan pinger. Gunakan pada paket Render berbayar, di mana tidak ada yang berubah. | | `SELF_PING_URL` | `RENDER_EXTERNAL_URL` | Basis URL untuk melakukan ping. Render menyetel `RENDER_EXTERNAL_URL` sendiri di setiap paket, jadi pinger ada di sana secara default. | | `SELF_PING_PATH` | `/api/monitoring/health` | Jalan di URL itu. Harus dimulai dengan `/`; apa pun yang lain menonaktifkan pinger dengan peringatan. | | `SELF_PING_INTERVAL_SECONDS` | `180` | Detik di antara ping, setelah ping pertama dalam 60 detik. Nilai di bawah `30` kembali ke `180`. | Layanan yang tetap aktif selama sebulan penuh menggunakan sekitar 744 jam instans, jadi bandingkan dengan kuota tingkat gratis Render saat ini. ## Skenario Penerapan Untuk panduan relay backend SRE ( perilaku ts/bifrost/auto, penempatan 9router vs CLIProxyAPI, dan strategi fallback throughput tinggi), lihat [Strategi Relay Backend](/docs/reference/RELAY_BACKEND_STRATEGY.md). ### Minimnya Pembangunan Lokal ```bash JWT_SECRET=$(openssl rand -base64 48) API_KEY_SECRET=$(openssl rand -hex 32) INITIAL_PASSWORD=dev123 PORT=20128 NODE_ENV=development ``` ### Docker Produksi ```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 ``` ### Celah Udara / 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 Terbalik (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 Keterampilan (v3.8.0 +) Batasan dan tombol keamanan diterapkan ketika kerangka Keterampilan (`src/lib/skills/`) menjalankan otomatisasi yang ditentukan pengguna di lingkungan sandbox. | Variabel | Bawaan | Berkas Sumber | Keterangan | | -------------------------------------- | ------------------------------------------ | ------------------------------------------------------------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `SKILLS_SANDBOX_TIMEOUT_MS` | `10000` (10 detik) | `src/lib/skills/builtins.ts` | Batas waktu jam dinding per eksekusi untuk kode keterampilan dalam kotak pasir. Tutup keras; apa pun lagi akan dibunuh. | | `SKILLS_EXECUTION_TIMEOUT_MS` | _(kembali ke `SKILLS_SANDBOX_TIMEOUT_MS`)_ | `src/lib/skills/` | Batas waktu orkestrasi keterampilan tingkat tinggi. Tetapkan lebih tinggi dari `SKILLS_SANDBOX_TIMEOUT_MS` untuk memungkinkan alur kerja multi-langkah. | | `SKILLS_MAX_FILE_BYTES` | `1048576` (1 MB) | `src/lib/skills/builtins.ts` | Maksimum byte yang dapat dibaca oleh suatu keterampilan dari satu file dalam kotak pasir. | | `SKILLS_MAX_HTTP_RESPONSE_BYTES` | `256000` (250 KB) | `src/lib/skills/builtins.ts` | Byte maksimum yang diambil dari respons HTTP apa pun di dalam suatu keterampilan. | | `SKILLS_MAX_SANDBOX_OUTPUT_CHARS` | `100000` | `src/lib/skills/builtins.ts` | Batasan keras pada karakter stdout/stderr dikembalikan dari pemanggilan kotak pasir. | | `SKILLS_SANDBOX_NETWORK_ENABLED` | `false` | `src/lib/skills/builtins.ts` | Atur `1`/`true` untuk mengizinkan jaringan keluar dari dalam kotak pasir. Defaultnya adalah** terpencil** untuk keamanan. Diabaikan oleh runtime `agent-sandbox` : isolasi jaringan, sistem file root read-only dan batas CPU/memory berasal dari `SandboxTemplate` operator. | | `SKILLS_ALLOWED_SANDBOX_IMAGES` | _(kosong)_ | `src/lib/skills/builtins.ts` | Daftar gambar container yang diizinkan dan dipisahkan koma, diizinkan untuk eksekusi sandbox. Kosong artinya bawaan bawaan saja. | | `SKILLS_SANDBOX_DOCKER_IMAGE` | _(default bawaan)_ | `src/lib/skills/` | Gambar kontainer yang digunakan saat memunculkan sandbox yang didukung Docker. Ganti untuk menyematkan gambar dasar khusus yang diperkeras. | | `SKILLS_SANDBOX_RUNTIME` | `auto` | `src/lib/skills/sandbox.ts`, `src/lib/skills/containerProvider.ts` | Waktu proses kontainer untuk keterampilan sandboxing: `auto` \| `docker` \| `apple` \| `wsl` \| `orbstack` \| `podman` \| `agent-sandbox`. `auto` memilih runtime terinstal terbaik per host OS (Apple Container/OrbStack di macOS, WSL Container di Windows, Podman di Linux), kembali ke Docker. `agent-sandbox` (kolam hangat Kubernetes jarak jauh) hanya untuk ikut serta dan tidak pernah terdeteksi secara otomatis. | | `SKILLS_AGENT_SANDBOX_POOLS` | _(kosong)_ | `src/lib/skills/agentSandboxProvider.ts` | pasangan `image=pool`, dipisahkan koma: `SandboxWarmPool` mana yang menyajikan setiap gambar kotak pasir saat `SKILLS_SANDBOX_RUNTIME=agent-sandbox`. | | `SKILLS_AGENT_SANDBOX_POOL` | _(kosong)_ | `src/lib/skills/agentSandboxProvider.ts` | Kolam hangat pengganti untuk gambar tidak tercantum di `SKILLS_AGENT_SANDBOX_POOLS`. Proses gagal (tidak ada fallback ke container lokal) jika tidak ada yang berhasil. | | `SKILLS_AGENT_SANDBOX_NAMESPACE` | `default` | `src/lib/skills/agentSandboxProvider.ts` | Namespace yang menampung kolam hangat; satu `SandboxClaim` per proses dibuat dan dihapus di sini. | | `SKILLS_AGENT_SANDBOX_KUBECONFIG` | _(kubectl default)_ | `src/lib/skills/agentSandboxProvider.ts` | Kubeconfig untuk runtime agen-sandbox. Hanya membutuhkan sandboxclaims create/get/list/watch/delete, pods get, pods/exec create di namespace. | | `SKILLS_AGENT_SANDBOX_KUBECTL` | `kubectl` | `src/lib/skills/agentSandboxProvider.ts` | biner kubectl yang digunakan oleh runtime agen-sandbox. | | `SKILLS_AGENT_SANDBOX_CONTAINER` | `main` | `src/lib/skills/agentSandboxProvider.ts` | Nama kontainer di dalam pod sandbox tempat perintah dijalankan. | | `SKILLS_AGENT_SANDBOX_CLAIM_TIMEOUT_S` | `60` | `src/lib/skills/agentSandboxProvider.ts` | Detik menunggu klaim menjadi Siap (maks 600). Klaim akan dihapus jika tidak pernah dihapus. | > [!CAUTION] > Mengaktifkan `SKILLS_SANDBOX_NETWORK_ENABLED=true` membuka jalur keluar dari kode keterampilan arbitrer. Sandingkan dengan `OUTBOUND_SSRF_GUARD_ENABLED=true` dan kebijakan `CORS_ORIGIN`/proxy yang ketat dalam penerapan bersama. --- ## 25. Kuota Provider, Tunnel, Backup & Runtime Lainnya Invalidasi fallback afinitas sesi Redis (hanya opt-in; default SQLite tidak berubah): Setiap penyimpanan afinitas Redis menerima paling banyak 8 operasi yang masih berlangsung; saat kapasitas tercapai, panggilan segera menggunakan SQLite, dan slot tetap terisi hingga pekerjaan Redis yang mendasarinya selesai, bahkan setelah batas waktu pemanggil 100 ms terlampaui. - R1. Setiap respons Redis yang diterima tepat waktu untuk operasi sesi bersifat otoritatif: mutasi yang diterima, CAS yang ditolak/gagal, kunci yang tidak ditemukan, penghapusan kunci yang tidak ada, serta hit atau miss eviksi secara sinkron menghapus baris fallback lokal sesi tersebut, tanpa `await` di antara respons dan penghapusan. Penghapusan ini aman (paling buruk terjadi satu kali pemilihan ulang saat gangguan berikutnya); baris yang kedaluwarsa tidak aman. - R2. Operasi yang mengalami batas waktu atau error dan menulis fallback lokal mencatat persis apa yang ditulisnya sebagai byte terserialisasi. Jika perintah Redis selesai terlambat, SQLite compare-and-delete secara sinkron menghapus hanya baris yang byte-nya identik tersebut, tidak pernah berdasarkan kecocokan akun atau koneksi. Penulisan gangguan yang lebih baru tetap bertahan. - R3. Eviksi selalu menghapus pin lokal akun yang gagal, termasuk selama gangguan; penanganan responsnya kemudian mengikuti R1/R2. Redis yang sehat tidak pernah menulis pin lokal: tidak ada mirror atau ledger pengurutan, dan instance dapat berbeda selama gangguan. Endpoint kuota provider, tunnel jaringan (Tailscale, Ngrok, proxy debug MITM), pool egress 1Proxy, backup database, serta override kecil per fitur yang dirujuk oleh lapisan executor atau skrip. | Variabel | Default | File Sumber | Deskripsi | | ---------------------------------------------- | --------------------------------------------------------------------------- | ------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `OMNIROUTE_SESSION_AFFINITY_STORE` | `sqlite` | `src/lib/db/sessionAffinity/storeFactory.ts` | Backend afinitas sesi-ke-akun. Hanya `redis` yang disertai `REDIS_URL` yang mengaktifkan berbagi; nilai yang tidak disetel/tidak dikenal atau konfigurasi Redis yang tidak ada akan menggunakan SQLite. Memerlukan `sessionAffinityTtlMs` yang bernilai positif. Perutean Redis menyimpan identitas akun penggunaan yang telah di-hash beserta ID koneksi; perutean SQLite default mempertahankan bentuk JSON empat bidang lama. Mencocokkan identitas dalam pool lokal yang memenuhi syarat sebelum mencocokkan berdasarkan ID. Menggunakan `REDIS_KEY_PREFIX`, nilai JSON, dan TTL `PX` milik klien bersama; mutasi membandingkan nilai teramati secara persis. Respons Redis yang sehat membatalkan fallback gangguan lokal, dan respons yang terlambat hanya dapat menghapus baris fallback berserialisasi persis yang ditulis oleh operasi yang mengalami timeout tersebut. Pin yang telah diprefetch divalidasi ulang saat digunakan. Error Redis, timeout, atau saturasi admission akan beralih ke SQLite dengan peringatan yang dibatasi lajunya (batas 100 ms per panggilan store); cache miss Redis yang berhasil tidak membaca shadow. Tidak berbagi stickiness combo, pin giliran Codex native, konkurensi akun, lockout, atau batas pengeluaran. | | `REDIS_URL` | `redis://localhost:6379` | `src/shared/utils/rateLimiter.ts` | String koneksi Redis untuk backend pembatas laju. | | `ALIBABA_CODING_PLAN_HOST` | _(host produksi)_ | `open-sse/services/bailianQuotaFetcher.ts` | Menimpa host yang digunakan untuk mengambil kuota coding plan Alibaba Bailian. | | `ALIBABA_CODING_PLAN_QUOTA_URL` | diturunkan dari host | `open-sse/services/bailianQuotaFetcher.ts` | Override URL kuota lengkap untuk Alibaba Bailian. | | `QWEN_CLOUD_COOKIE` | _(tidak disetel)_ | `open-sse/services/qwenTokenPlanQuotaFetcher.ts` | Cookie sesi konsol untuk gateway kuota Token Plan pribadi Qwen Cloud / Model Studio (API key inference tidak dapat membacanya). Salin seluruh header permintaan `Cookie` — yang berisi `login_qwencloud_ticket` — dari panggilan `api.json` apa pun ke `cs-data.qwencloud.com` di home.qwencloud.com › Penagihan › Langganan (F12 › Jaringan). Sensitif dan dibatasi pada sesi; utamakan kolom `qwenCloudCookie` per koneksi di Dashboard. | | `QWEN_CLOUD_SEC_TOKEN` | _(tidak disetel)_ | `open-sse/services/qwenTokenPlanQuotaFetcher.ts` | Override `sec_token` manual untuk gateway konsol Token Plan. Sensitif; jika tidak disetel, fetcher akan mengambilnya dari HTML dashboard menggunakan cookie. | | `QWEN_TOKEN_PLAN_HOST` | `https://cs-data.qwencloud.com` | `open-sse/services/qwenTokenPlanQuotaFetcher.ts` | Penggantian host gateway untuk pengambil kuota Token Plan pribadi (misalnya `bailian-singapore-cs.alibabacloud.com` untuk konsol Model Studio). | | `QWEN_TOKEN_PLAN_DASHBOARD_URL` | `https://home.qwencloud.com/` | `open-sse/services/qwenTokenPlanQuotaFetcher.ts` | URL dasbor yang digunakan untuk mengambil `sec_token` dari HTML yang memuat sesi login. | | `XIAOMI_MIMO_CONSOLE_COOKIE` | _(tidak disetel)_ | `open-sse/services/usage/xiaomi-mimo.ts` | Cookie sesi konsol untuk API kuota Token Plan Xiaomi MiMo (`platform.xiaomimimo.com/api/v1/tokenPlan/usage` + `tokenPlan/detail` — kunci API inferensi tidak dapat membacanya). Salin seluruh header permintaan `Cookie` — header tersebut berisi `api-platform_serviceToken` dan `userId` — dari permintaan apa pun ke `platform.xiaomimimo.com` di halaman Token Plan (F12 › Network). Bersifat sensitif dan terbatas pada sesi; sebaiknya gunakan kolom Dasbor per koneksi `xiaomiMimoConsoleCookie`. | | `XIAOMI_MIMO_MONTHLY_TOKEN_LIMIT` | `4100000000` | `open-sse/services/usage/xiaomi-mimo.ts` | Anggaran bulanan (Credits) untuk fallback Xiaomi MiMo yang dilacak OmniRoute dan digunakan saat cookie konsol tidak dikonfigurasi. Nilai default-nya adalah 4,1B milik tingkat Lite; tetapkan ke Credits paket tersebut (Standard 11B / Pro 38B / Max 82B). Penggantian `providerSpecificData.monthlyTokenLimit` per koneksi akan diprioritaskan daripada variabel lingkungan ini. | | `ALIBABA_FREE_TIER_VISION_FE_PATH` | `/costing-balance/free-quota-image-video` | `open-sse/services/alibabaFreeTierQuotaFetcher.ts` | Penggantian jalur front-end konsol untuk mengambil kuota visi/media tingkat gratis Alibaba Model Studio. | | `ALIBABA_FREE_TIER_MULTIMODAL_FE_PATH` | `/costing-balance/free-quota-multimodal` | `open-sse/services/alibabaFreeTierQuotaFetcher.ts` | Penggantian jalur front-end konsol untuk mengambil kuota multimodal tingkat gratis Alibaba Model Studio. | | `ALIBABA_FREE_TIER_AUDIO_FE_PATH` | `/costing-balance/free-quota-audio` | `open-sse/services/alibabaFreeTierQuotaFetcher.ts` | Penggantian jalur front-end konsol untuk mengambil kuota audio tingkat gratis Alibaba Model Studio. | | `ALIBABA_FREE_TIER_ALLOWLIST_PATH` | _(tidak disetel)_ | `open-sse/services/alibabaFreeTierAllowlist.ts` | Jalur opsional ke penggantian JSON lokal untuk daftar model teks tingkat gratis Alibaba bawaan. Jika tidak tersedia, gunakan `$DATA_DIR/alibaba-free-tier-allowlist.json`, lalu `config/alibaba-free-tier-allowlist.json`. | | `CONTEXT_RESERVE_TOKENS` | `1024` | `open-sse/services/contextManager.ts` | Token yang dicadangkan untuk output penyelesaian saat menghitung anggaran prompt. | | `CONTEXT_KEEP_LATEST_IMAGES` | `2` | `open-sse/services/contextManager.ts` | Jumlah gambar inline terbaru yang dipertahankan saat menghapus gambar yang lebih lama agar sesuai dengan jendela konteks (#8560). | | `MODEL_ALIAS_COMPAT_ENABLED` | enabled | `open-sse/services/model.ts` | Aktifkan atau nonaktifkan lapisan kompatibilitas alias model lama yang digunakan oleh klien terdahulu. | | `OMNIROUTE_EMERGENCY_FALLBACK` | enabled | `open-sse/services/emergencyFallback.ts` | Atur ke `false` (atau `0`) untuk menonaktifkan fallback darurat saat anggaran habis, yang mengalihkan permintaan yang gagal ke model gratis `nvidia`/`nvidia/nemotron-3.5-super-vl-120b-a12b`. Prioritas efektifnya adalah penggantian di Feature Flags DB > variabel env > default; jika tidak tersedia, layanan menggunakan nilai env mentah. | | `COMMAND_CODE_CALLBACK_PORT` | _(unset)_ | `src/app/api/providers/command-code/auth/shared.ts` | Port lokal yang digunakan untuk callback bergaya OAuth dari helper CLI Command Code. | | `COMMAND_CODE_VERSION` | `0.33.2` | `open-sse/executors/commandCode.ts` | Nilai yang dikirim sebagai header `x-command-code-version` ke upstream Command Code. Ganti untuk meningkatkan versi CLI. | | `COMMANDCODE_API_URL` | `https://api.commandcode.ai` | `open-sse/services/usage/command-code.ts` | URL dasar untuk upstream penggunaan/kuota Command Code yang digunakan oleh telemetri pengambil kuota ponsel cerdas. Ganti untuk menggunakan API Command Code yang di-hosting sendiri atau alternatif. | | `MITM_LOCAL_PORT` | `443` | `src/mitm/server.cjs` | Port bind lokal untuk proksi debug MITM. | | `MITM_DISABLE_TLS_VERIFY` | `0` | `src/mitm/server.cjs` | Atur ke `1` untuk menonaktifkan verifikasi TLS upstream (hanya untuk pengembangan). | | `MITM_IDLE_TIMEOUT_MS` | `60000` | `src/mitm/socketTimeouts.ts`, `src/mitm/server.cjs` | Batas waktu habis soket idle (ms) untuk koneksi yang diproksikan; soket idle yang melewati batas ini dihentikan untuk mencegah kebocoran tunnel yang terbuka sebagian. | | `BRIDGE_PORT` | `20129` | `bin/antigravity-bridge.mjs` | Port tempat bridge MITM Antigravity mendengarkan. | | `ROUTER_URL` | `http://127.0.0.1:20128/v1/antigravity` | `bin/antigravity-bridge.mjs` | Endpoint router yang menjadi tujuan bridge meneruskan traffic Antigravity. | | `CERT_DIR` | `/mitm` | `bin/antigravity-bridge.mjs` | Mengganti direktori tempat bridge membaca material TLS-nya. Model sertifikat dipilih seperti yang dilakukan server AgentBridge: `server.crt`/`server.key` untuk instalasi leaf lama, jika tidak, `ca.crt`/`ca.key` (CA root, satu leaf untuk setiap host yang diintersep; dipaksa oleh `MITM_ROOT_CA_ENABLED=true`). Bridge keluar saat startup jika file untuk model aktif tidak ditemukan. | | `MITM_VERBOSE` | `1` | `src/mitm/server.cjs`, `src/mitm/_internal/bypass.cjs` | Verbositas log keputusan routing: `0` menonaktifkan log, nilai yang lebih tinggi mencatat lebih banyak keputusan bypass/rute. | | `MITM_ROOT_CA_ENABLED` | `false` | `src/mitm/manager.ts` | Atur ke `true` untuk ikut menggunakan model sertifikat root-CA + leaf per host (#6684). Instalasi baru mendapatkannya secara otomatis; instalasi dengan leaf lama yang sudah tepercaya tetap menggunakan sertifikat fixed-SAN lama kecuali diikutkan secara eksplisit. | | `MITM_CERT_MODE` | `legacy` | `src/mitm/manager.ts`, `src/mitm/server.cjs` | Diatur OLEH manager MITM untuk proses proxy yang dibuat (`root-ca` \| `legacy`) — mencerminkan keputusan migrasi sertifikat; tidak dimaksudkan untuk diatur secara manual. | | `OMNIROUTE_NO_SUDO` | `0` | `src/mitm/systemCommands.ts` | Setel `1` (truthy) untuk menghapus `sudo` di awal dari perintah kepercayaan sertifikat MITM — untuk deployment tanpa root / dengan namespace pengguna, ketika operator memercayai CA secara manual (misalnya melalui mekanisme extra-CA-certs milik Node). | | `SKIP_ANTIGRAVITY_DNS` | _(tidak disetel)_ | `src/mitm/dns/provision.ts` | Setel `true` untuk sepenuhnya melewati penyediaan entri DNS `/etc/hosts` untuk nama host proxy Antigravity — untuk container yang tidak menyediakan sudo/root. | | `OMNIROUTE_SKIP_DNS_WRITE` | _(tidak disetel)_ | `src/mitm/dns/dnsConfig.ts` | Setel `1` untuk melewati penulisan ke file hosts saat menambahkan/menghapus entri DNS — untuk lingkungan pengujian yang disandbox atau hanya-baca. | | `OMNIROUTE_SKIP_SYSTEM_TRUST` | `0` | `src/mitm/cert/install.ts`, `src/mitm/tproxy/caTrust.ts` | Perlindungan khusus pengujian/CI: setel `1` agar pemasangan/penghapusan kepercayaan sertifikat tidak melakukan apa pun, sehingga rangkaian pengujian tidak pernah mengubah penyimpanan kepercayaan OS. Disetel secara otomatis oleh penyiapan pengujian dan alur kerja CI. | | `CHANGELOG_BASE_REF` | _(otomatis)_ | `scripts/check/check-changelog-integrity.mjs` | Referensi dasar eksplisit untuk gerbang anti-penghapusan CHANGELOG (secara default menggunakan cabang dasar PR di CI, atau `release/v*` dengan versi tertinggi). | | `FREE_PROXY_AUTO_SYNC_ENABLED` | `false` | `src/lib/freeProxyProviders/scheduler.ts` | Setel `true` untuk mengaktifkan penjadwal sinkronisasi otomatis kumpulan proxy gratis di latar belakang. Bersifat opt-in dan secara default dinonaktifkan. | | `FREE_PROXY_AUTO_SYNC_INTERVAL_MS` | `1800000` | `src/lib/freeProxyProviders/scheduler.ts` | Interval sinkronisasi otomatis dalam milidetik (default 30 menit). | | `FREE_PROXY_1PROXY_ENABLED` | `true` | `src/lib/freeProxyProviders/oneproxy.ts` | Aktifkan sumber proxy gratis 1proxy. Setel ke `false` untuk menonaktifkannya. | | `FREE_PROXY_1PROXY_API_URL` | _(see oneproxy.ts)_ | `src/lib/freeProxyProviders/oneproxy.ts` | Penggantian URL API 1proxy. | | `FREE_PROXY_1PROXY_MAX` | `500` | `src/lib/freeProxyProviders/oneproxy.ts` | Jumlah maksimum proksi yang diambil setiap sinkronisasi dari 1proxy. | | `FREE_PROXY_1PROXY_MIN_QUALITY` | `50` | `src/lib/freeProxyProviders/oneproxy.ts` | Ambang batas skor kualitas minimum untuk impor 1proxy. | | `FREE_PROXY_PROXIFLY_ENABLED` | `true` | `src/lib/freeProxyProviders/proxifly.ts` | Aktifkan sumber proksi gratis Proxifly. Atur ke `false` untuk menonaktifkan. | | `FREE_PROXY_PROXIFLY_QUANTITY` | `100` | `src/lib/freeProxyProviders/proxifly.ts` | Jumlah proksi yang diambil setiap sinkronisasi Proxifly. | | `FREE_PROXY_PROXIFLY_ANONYMITY` | `elite` | `src/lib/freeProxyProviders/proxifly.ts` | Filter tingkat anonimitas untuk Proxifly (`elite`, `anonymous`, `transparent`). | | `FREE_PROXY_IPLOCATE_ENABLED` | `false` | `src/lib/freeProxyProviders/iplocate.ts` | Aktifkan sumber proksi gratis IPLocate. Hanya diaktifkan secara eksplisit. | | `FREE_PROXY_IPLOCATE_BASE_URL` | `https://raw.githubusercontent.com/iplocate/free-proxy-list/main/protocols` | `src/lib/freeProxyProviders/iplocate.ts` | Penggantian URL dasar daftar proksi IPLocate. | | `FREE_PROXY_WEBSHARE_ENABLED` | `true` | `src/lib/freeProxyProviders/webshare.ts` | Aktifkan sumber kumpulan proxy Webshare. Atur ke `false` untuk menonaktifkan; juga memerlukan `FREE_PROXY_WEBSHARE_API_KEY` telah diatur. | | `FREE_PROXY_WEBSHARE_API_KEY` | _(tidak ada)_ | `src/lib/freeProxyProviders/webshare.ts` | Token API akun Webshare (`Authorization: Token `). Wajib — penyedia tetap dinonaktifkan tanpanya. | | `FREE_PROXY_WEBSHARE_API_URL` | `https://proxy.webshare.io/api/v2/proxy/list/` | `src/lib/freeProxyProviders/webshare.ts` | Penggantian URL API daftar proxy Webshare. | | `FREE_PROXY_WEBSHARE_MAX` | `500` | `src/lib/freeProxyProviders/webshare.ts` | Jumlah maksimum proxy yang diimpor pada setiap sinkronisasi Webshare. | | `NEXT_PUBLIC_VERCEL_RELAY_ENABLED` | `true` | `src/app/(dashboard)/…/ProxyPoolTab.tsx` | Tampilkan/sembunyikan tombol Deploy Vercel Relay pada tab Proxy Pool. | | `VERCEL_API_BASE` | `https://api.vercel.com` | `src/app/api/settings/proxy/vercel-deploy/route.ts` | Penggantian URL dasar API Vercel (untuk pengujian). | | `NEXT_PUBLIC_VERCEL_RELAY_DEFAULT_PROJECT` | `omniroute-relay` | `src/app/(dashboard)/…/VercelRelayModal.tsx` | Nama proyek default yang telah diisi sebelumnya pada modal penerapan Vercel Relay. | | `TAILSCALE_BIN` | _(deteksi otomatis)_ | `src/lib/tailscaleTunnel.ts` | Jalur eksplisit ke biner `tailscale`. | | `TAILSCALED_BIN` | _(deteksi otomatis)_ | `src/lib/tailscaleTunnel.ts` | Jalur eksplisit ke biner daemon `tailscaled`. | | `TAILSCALE_AUTHKEY` | _(tidak disetel)_ | `src/lib/tailscaleTunnel.ts` | Kunci autentikasi Tailscale yang telah dibagikan sebelumnya untuk `tailscale up` non-interaktif / tanpa antarmuka (diteruskan melalui `--auth-key=`). Jika tidak disetel, proses login kembali menggunakan URL autentikasi browser interaktif. | | `NGROK_AUTHTOKEN` | _(tidak disetel)_ | `src/lib/ngrokTunnel.ts` | Mengautentikasi tunnel ngrok keluar. | | `DB_BACKUP_MAX_FILES` | `20` | `src/lib/db/backup.ts` | Jumlah maksimum file cadangan SQLite yang dipertahankan oleh pembersihan cadangan manual/terjadwal. Snapshot migrasi dialamatkan berdasarkan konten dan digunakan kembali untuk status DB yang identik; snapshot tersebut tidak dihapus di dalam jendela migrasi konkuren. Mengganti nilai yang disimpan dari Pengaturan → Retensi cadangan database. | | `DB_BACKUP_RETENTION_DAYS` | `0` | `src/lib/db/backup.ts` | Usia maksimum (hari) yang dipertahankan oleh pembersihan cadangan manual/terjadwal. `0` menonaktifkan penghapusan berdasarkan usia. Snapshot migrasi tidak dihapus di dalam jendela migrasi konkuren. Mengganti nilai yang disimpan dari Pengaturan → Retensi cadangan database. | | `OMNIROUTE_BACKUP_SCHEDULE_JOB_INTERVAL_MS` | `30000` | `src/lib/jobs/backupScheduleJob.ts` | Interval tick (md) dari tugas sisi server yang menjalankan `backup-schedule.json`. Harus jauh di bawah granularitas cron 1 menit; nilai di bawah `5000` atau yang tidak dapat diuraikan akan kembali ke `30000`. | | `CONTAINER_HOST` | `docker` | `scripts/check-permissions.sh` | Petunjuk runtime kontainer untuk pemeriksaan izin entrypoint. Atur ke `podman` untuk topologi Podman apa pun. Karena kontainer tidak dapat menentukan apakah engine berjalan secara lokal atau diakses melalui Podman Machine, peringatan tetap netral terhadap topologi dan mengarahkan ke `contrib/podman/README.md`. | | `QUOTA_STORE_DRIVER` | `sqlite` | `src/lib/quota/storeFactory.ts` | Backend penyimpanan konsumsi berbagi kuota: `sqlite` (default) atau `redis`. | | `QUOTA_STORE_REDIS_URL` | _(unset)_ | `src/lib/quota/storeFactory.ts` | String koneksi Redis yang digunakan saat `QUOTA_STORE_DRIVER=redis` (misalnya `redis://localhost:6379`). | | `QUOTA_SATURATION_THRESHOLD` | `0.5` | `src/lib/quota/enforce.ts` | Rasio saturasi pool (0..1); pada atau di atas nilai ini, pool memasuki mode ketat (tanpa peminjaman). | | `QUOTA_SOFT_DEPRIORITIZE_FACTOR` | `0.7` | `open-sse/services/combo.ts` | Pengali skor (0..1) yang diterapkan pada target saat kebijakan kuota lunak menurunkan prioritasnya. | | `STATUS_SOFT_DEPRIORITIZE_FACTOR` | `0.5` | `open-sse/services/combo/autoStrategy.ts` | Pengali skor (0..1) yang diterapkan pada provider yang kehabisan kuota (`credits_exhausted`/`rate_limited`) dalam penilaian auto-combo saat cutoff kuota preflight NONAKTIF (#4540). | | `QUOTA_CONSUMPTION_RETENTION_DAYS` | `14` | `src/lib/db/quotaConsumption.ts` | Jangka retensi (hari) untuk bucket `quota_consumption` sebelum GC (`gcQuotaConsumption`). | | `QUOTA_PREFLIGHT_CUTOFF_ENABLED` | `false` | `src/lib/resilience/settings.ts` | Pilihan ikut serta (default NONAKTIF): mengaktifkan cutoff kuota keras pada perutean otomatis yang menghapus kandidat dengan kuota rendah sebelum penilaian. Hanya menetapkan default: nilai boolean yang disimpan di `resilienceSettings` (Dasbor → Pengaturan → Ketahanan) memiliki prioritas. | | `OMNIROUTE_AUTO_FREE_FALLBACK_TO_FULL_POOL` | `false` | `open-sse/services/autoCombo/virtualFactory.ts` | Pilihan ikut serta (default NONAKTIF): saat filter `auto/:` tidak cocok dengan kandidat yang terhubung, memulihkan perilaku lama dengan beralih ke pool lengkap (tanpa filter), alih-alih mengembalikan pool kosong. Default NONAKTIF membuat `:free` berarti "tingkat gratis saja". | | `OMNIROUTE_CHAOS_MAX_PANEL` | `5` | `open-sse/services/autoCombo/virtualFactory.ts` | Batas ukuran panel (dibatasi pada 1–10) untuk varian broadcast `auto/*:chaos` — satu permintaan menyebar ke maksimal sejumlah model yang beragam berdasarkan provider ini. | | `OMNIROUTE_CHAOS_MIN_PANEL` | _(default engine)_ | `open-sse/services/autoCombo/virtualFactory.ts` | Penyetelan ukuran panel minimum yang diteruskan ke handler siaran chaos; jika tidak disetel, default engine akan digunakan. | | `OMNIROUTE_CHAOS_PANEL_TIMEOUT_MS` | _(default engine)_ | `open-sse/services/autoCombo/virtualFactory.ts` | Batas waktu keras (ms) untuk seluruh fan-out panel chaos; jika tidak disetel, default engine akan digunakan. | | `GROK_AUTH_PATH` | `~/.grok/auth.json` | `open-sse/services/grokQuotaFetcher.ts` | Jalur ke `auth.json` CLI Grok yang digunakan untuk mengambil kuota mingguan grok-web; timpa untuk pengujian atau instalasi CLI non-standar. | | `AGENTBRIDGE_UPSTREAM_CA_CERT` | _(tidak disetel)_ | `src/mitm/manager.ts` | Sertifikat CA tambahan (PEM) yang dipercaya untuk koneksi TLS upstream AgentBridge. | | `INSPECTOR_BUFFER_SIZE` | `1000` | `src/mitm/inspector/buffer.ts` | Jumlah maksimum permintaan yang ditangkap dan disimpan dalam buffer ring Traffic Inspector. | | `INSPECTOR_MAX_BODY_KB` | `1024` | `src/mitm/inspector/buffer.ts` | Ukuran maksimum isi permintaan/respons yang ditangkap (KB) sebelum dipotong. | | `INSPECTOR_HTTP_PROXY_PORT` | `8080` | `src/mitm/inspector/httpProxyServer.ts` | Port lokal untuk proksi HTTP Traffic Inspector. | | `INSPECTOR_HTTP_PROXY_AUTOSTART` | `false` | `src/mitm/inspector/httpProxyServer.ts` | Memulai proksi HTTP inspector secara otomatis saat boot. | | `INSPECTOR_LLM_HOSTS_EXTRA` | _(unset)_ | `src/lib/inspector/captureState.ts` | Nama host tambahan (dipisahkan koma) yang diperlakukan sebagai endpoint LLM untuk perekaman. | | `INSPECTOR_MASK_SECRETS` | `true` | `src/mitm/inspector/buffer.ts` | Menyamarkan rahasia (header autentikasi / kunci API) dalam lalu lintas yang direkam. | | `INSPECTOR_SYSTEM_PROXY_GUARD_MINUTES` | `30` | `src/app/api/tools/traffic-inspector/capture-modes/system-proxy/route.ts` | Jumlah menit sebelum penjaga proxy sistem secara otomatis mengembalikan pengaturan proxy OS. | | `INSPECTOR_INTERNAL_INGEST_TOKEN` | _(auto)_ | `src/app/api/tools/traffic-inspector/internal/ingest/route.ts` | Token yang mengautentikasi penyerapan internal hasil perekaman ke inspector. | | `PLAYGROUND_COMPARE_MAX_COLUMNS` | `4` | `src/app/(dashboard)/dashboard/playground/` | Jumlah maksimum kolom berdampingan dalam mode perbandingan Playground. | | `PLAYGROUND_IMPROVE_PROMPT_DEFAULT_MODEL` | _(unset)_ | `src/app/(dashboard)/dashboard/playground/` | Model default untuk tindakan Playground 'improve prompt' (menggunakan model aktif jika tidak ditetapkan). | | `BIFROST_ENABLED` | `1` | `src/app/api/v1/relay/chat/completions/bifrost/route.ts` | Sakelar pemutus utama untuk proxy sidecar bifrost. Jika diatur ke `0`, rute mengembalikan 503 dengan header `X-Bifrost-Killswitch` dan operator dialihkan ke jalur TS. Gunakan untuk menonaktifkan sidecar tanpa melakukan deployment ulang (insiden router tingkat 1, rotasi kunci). | | `BIFROST_BASE_URL` | _(unset)_ | `src/app/api/v1/relay/chat/completions/bifrost/route.ts` | Jika diatur, rute proxy sidecar Bifrost meneruskan lalu lintas `/v1/chat/completions` ke gateway Go ini, bukan ke handler relay TS. Tidak diatur → 503 dengan fallback. Garis miring di akhir dihapus. | | `BIFROST_PORT` | `8080` | `src/lib/services/bootstrap.ts` | Port yang digunakan layanan Bifrost tertanam yang diawasi (`127.0.0.1:`) saat OmniRoute mengelola siklus hidup sidecar Bifrost. Defaultnya adalah `8080`. | | `SINGBOX_PORT` | `20140` | `src/lib/services/bootstrap.ts` | Port yang digunakan layanan sing-box tertanam yang diawasi (`127.0.0.1:`) saat OmniRoute mengelola siklus hidup sidecar sing-box. Defaultnya adalah `20140`. | | `LLMLINGUA_PORT` | `20135` | `src/lib/services/bootstrap.ts` | Port yang digunakan layanan kompresi LLMLingua yang diawasi (`127.0.0.1:`). Defaultnya adalah `20135`. | | `LLMLINGUA_BASE_URL` | `http://127.0.0.1:20135` | `open-sse/services/compression/engines/llmlingua/index.ts` | URL dasar untuk daemon layanan mikro kompresi HTTP LLMLingua lokal. Defaultnya adalah `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 dimuat oleh sidecar LLMLingua yang diawasi (diteruskan ke env proses anak). | | `BIFROST_API_KEY` | _(tidak disetel)_ | `src/app/api/v1/relay/chat/completions/bifrost/route.ts` | Kunci API untuk gateway Bifrost (dikirim sebagai `Authorization: Bearer ...`). Jika tidak disetel, rute mengharuskan permintaan membawa kunci API OmniRoute yang valid; kunci ini hanya digunakan untuk autentikasi di sisi gateway. | | `BIFROST_STREAMING_ENABLED` | `true` | `src/app/api/v1/relay/chat/completions/bifrost/route.ts` | Jika bernilai true, rute sidecar Bifrost mengalirkan respons kembali melalui SSE lewat gateway, bukan melalui eksekutor streaming TS. Atur ke `0` untuk memaksa respons JSON non-streaming melalui gateway. | | `BIFROST_TIMEOUT_MS` | `30000` | `src/app/api/v1/relay/chat/completions/bifrost/route.ts` | Batas waktu per permintaan saat melakukan proxy ke gateway Bifrost (ms). Jika waktu habis, rute mengembalikan jalur relay TS melalui header `X-Bifrost-Fallback`. | | `OMNIROUTE_BIFROST_KEY` | _(unset)_ | `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` memiliki prioritas saat keduanya ditetapkan. | | `OMNIROUTE_RELAY_BACKEND` | `ts` / `auto` | `src/app/api/v1/relay/chat/completions/routingBackend.ts` | Backend relay untuk `/api/v1/relay/chat/completions`: `ts \| bifrost \| auto`. `ts` = relay TypeScript (default jika Bifrost belum dikonfigurasi); `auto` memilih Bifrost ketika `BIFROST_BASE_URL` ditetapkan dan `BIFROST_ENABLED` ≠ `0`, dengan fallback otomatis ke TS jika sidecar tidak dapat dijangkau; `bifrost` memaksa Bifrost (ketat, tanpa fallback). Auth/batas laju/pengaman injeksi/allowlist selalu dijalankan terlebih dahulu di route Next. Respons menyertakan `X-Routing-Backend` / `X-Routing-Fallback` / `X-Routing-Fallback-Reason`. | | `RELAY_ROUTING_BACKEND` | _(unset)_ | `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` memiliki prioritas saat keduanya ditetapkan. | | `OMNIROUTE_BIFROST_FAILURE_COOLDOWN_MS` | `5000` | `src/app/api/v1/relay/chat/completions/bifrostCooldown.ts` | Cooldown (ms) setelah hop sidecar Bifrost gagal dalam mode `auto`, sebelum relay mencoba kembali sidecar; relay langsung mengarahkan ke jalur TS selama cooldown berlangsung, lalu melakukan probe lagi. `0` menonaktifkan. Hanya berlaku jika `OMNIROUTE_RELAY_BACKEND=auto`. | | `OMNIROUTE_TLS_CERT` | _(unset)_ | `bin/cli/commands/serve.mjs` | Jalur ke sertifikat TLS PEM untuk menjalankan `omniroute serve` melalui HTTPS (setara dengan `--tls-cert`). Harus dipasangkan dengan `OMNIROUTE_TLS_KEY`; server mandiri kemudian menghentikan TLS pada listener yang sama (`wss://` tetap berfungsi tanpa perubahan). Tidak ditetapkan → HTTP biasa. Jika hanya salah satu cert/key diberikan, atau jalur tidak dapat dibaca, peringatan akan dicatat dan server tetap menggunakan HTTP. | | `OMNIROUTE_TLS_KEY` | _(unset)_ | `bin/cli/commands/serve.mjs` | Jalur ke kunci privat TLS PEM untuk HTTPS `omniroute serve` (setara dengan `--tls-key`). Harus dipasangkan dengan `OMNIROUTE_TLS_CERT`. Lihat `OMNIROUTE_TLS_CERT`. | | `OMNIROUTE_LOCAL_ENDPOINTS_ENABLED` | `0` | `src/lib/security/localEndpoints.ts` | Sakelar utama untuk route `/api/local/*`. Jika tidak ditetapkan atau bernilai `0`, semua route `/api/local/*` mengembalikan 503 dalam produksi. Harus bernilai `1` pada deployment non-loopback untuk mengaktifkan peluncur Redis dan pemula layanan lokal sekali klik serupa. Perlindungan berlapis dengan klasifikasi penjagaan route `isLocalOnlyPath()` (`LOCAL_ONLY_API_PREFIXES` di `src/server/authz/routeGuard.ts`). | | `OMNIROUTE_LOCAL_ENDPOINTS_TOKEN` | _(unset)_ | `src/lib/security/localEndpoints.ts` | Token Bearer untuk pemanggil `/api/local/*` yang tidak berada di loopback (misalnya aplikasi desktop). Jika ditetapkan, permintaan dari IP non-loopback harus menyertakan `Authorization: Bearer `. Wajib digunakan ketika `OMNIROUTE_LOCAL_ENDPOINTS_ENABLED=1` dalam deployment non-loopback. | | `OMNIROUTE_REDIS_CONTAINER_NAME` | `omniroute-redis` | `bin/cli/commands/redis.mjs` | Nama kontainer untuk peluncur Redis 1 klik (`omniroute redis up`). Digunakan oleh CLI dan GUI `RedisLauncherPanel`. | | `OMNIROUTE_REDIS_HOST_PORT` | `6379` | `bin/cli/commands/redis.mjs` | Port host untuk peluncur Redis 1 klik. Naikkan jika host sudah menggunakan 6379. Port internal kontainer tetap 6379. | | `OMNIROUTE_REDIS_BIND_HOST` | `127.0.0.1` | `bin/cli/commands/redis.mjs` | Antarmuka host tempat peluncur Redis 1 klik mempublikasikan layanan. Peluncur memulai Redis TANPA kata sandi, sehingga mengikat ke `0.0.0.0` akan memberikan Redis tanpa autentikasi kepada setiap host di LAN Anda — perluas hanya jika Anda juga menetapkan kata sandi pada instans tersebut sendiri. | | `REDIS_BIND_HOST` | `127.0.0.1` | `docker-compose.yml` | Antarmuka host tempat docker-compose mempublikasikan sidecar Redis (#9286). Redis compose berjalan tanpa `requirepass`; kontainer aplikasi menjangkaunya melalui jaringan compose (`redis:6379`) — port yang dipublikasikan hanya ada untuk alat di sisi host. `0.0.0.0` mengekspos Redis tanpa autentikasi ke seluruh LAN. | | `REDIS_PORT` | `6379` | `docker-compose.yml` | Port host untuk sidecar Redis compose. | | `APP_BIND_HOST` | `127.0.0.1` | `docker-compose.yml`, `docker-compose.prod.yml` | Antarmuka host tempat docker-compose mempublikasikan port dashboard/API/live-WS milik aplikasi (#12568). Dengan `REQUIRE_API_KEY=false` sebagai default `.env.example`, `0.0.0.0` mengekspos proksi LLM anonim `/v1` ke seluruh LAN/WAN — perluas hanya setelah `REQUIRE_API_KEY=true` atau proksi balik di depannya menerapkan autentikasinya sendiri. | | `QDRANT_BIND_HOST` | `127.0.0.1` | `docker-compose.yml` | Antarmuka host tempat docker-compose mempublikasikan sidecar memori Qdrant (#12578). Alasan terkait paparan LAN sama seperti pada `REDIS_BIND_HOST`. | | `BIFROST_BIND_HOST` | `127.0.0.1` | `docker-compose.yml` | Antarmuka host tempat docker-compose mempublikasikan sidecar router Bifrost (#12578). Alasan terkait paparan LAN sama seperti pada `REDIS_BIND_HOST`. | | `REDIS_KEY_PREFIX` | `omniroute:` | `src/shared/utils/rateLimiter.ts` | Prefiks namespace yang diterapkan pada setiap kunci Redis OmniRoute (pembatas laju, cache autentikasi, penyimpanan kuota, pemutus sirkuit pemanasan). Mencegah benturan kunci ketika instans Redis digunakan bersama aplikasi lain (#11042). | | `OMNIROUTE_INTERNAL_SERVICE_TOKEN` | _(tidak disetel — mekanisme dinonaktifkan)_ | `src/lib/api/internalServiceAuth.ts` | Rahasia bersama untuk lompatan REST internal yang mempertahankan identitas (#9260): komponen OmniRoute yang memanggil rute OmniRoute lokal lainnya mengirimkannya sebagai `x-omniroute-internal-service-token` sehingga identitas pemanggil asli tetap dipertahankan. Dibandingkan dengan `timingSafeEqual`. | | `OMNIROUTE_INTERNAL_SERVICE_TOKEN_FILE` | _(tidak disetel)_ | `src/lib/api/internalServiceAuth.ts` | Varian berkas rahasia dari token layanan internal: jalur ke berkas yang isinya, setelah spasi di awal dan akhir dihapus, merupakan token. Hanya diperiksa ketika var inline tidak disetel. | | `OPENROUTER_PROVIDER_STATS_ENABLED` | `true` | `src/lib/catalog/openrouterProviderStats.ts` | Memperkaya daftar penyedia di dasbor dengan statistik peringkat mingguan OpenRouter (#9324). Aktif secara default; setel ke `false` untuk melewati pengambilan di latar belakang sepenuhnya (tidak memblokir, tidak pernah fatal). | | `OPENROUTER_PROVIDER_STATS_TTL_MS` | `86400000` (24j) | `src/lib/catalog/openrouterProviderStats.ts` | TTL cache untuk snapshot statistik penyedia OpenRouter, dalam milidetik. | | `OMNIROUTE_REDIS_IMAGE` | `redis:7-alpine` | `bin/cli/commands/redis.mjs` | Image Redis yang digunakan oleh peluncur Redis sekali klik. Ganti ke `redis:8-alpine` atau mirror registri privat sesuai kebutuhan. | | `QDRANT_HOST` | `qdrant` | _(profil klaster opsional)_ | Nama host sidecar Qdrant ketika `--profile memory` aktif. Default mengarah ke nama layanan qdrant dalam jaringan; ganti untuk deployment eksternal. Hanya digunakan ketika `qdrantEnabled` bernilai `true` dalam kode (`src/lib/memory/vectorStore.ts:108`). | | `QDRANT_PORT` | `6333` | _(profil klaster opsional)_ | Port REST sidecar Qdrant. | | `QDRANT_GRPC_PORT` | `6334` | _(profil cluster opt-in)_ | Port gRPC sidecar Qdrant. Digunakan oleh pustaka klien yang lebih memilih gRPC daripada REST untuk operasi streaming. | | `QDRANT_API_KEY` | _(unset)_ | _(profil cluster opt-in)_ | Kunci API opsional untuk Qdrant Cloud atau instans on-prem yang diautentikasi. Kosong → tidak ada header `api-key` yang dikirim. | | `QDRANT_COLLECTION` | `omniroute-memory` | _(profil cluster opt-in)_ | Nama koleksi untuk embedding memori percakapan OmniRoute. Dibuat pada proses pertama kali dijalankan dengan dimensi `QDRANT_VECTOR_SIZE`. | | `QDRANT_EMBEDDING_MODEL` | `text-embedding-3-small` | _(profil cluster opt-in)_ | Nama model embedding default yang dicatat dalam metadata koleksi Qdrant. Embedding sebenarnya dibuat oleh provider apa pun yang ditunjuk oleh field `embeddingModel` dalam pengaturan OmniRoute. | | `QDRANT_VECTOR_SIZE` | `1536` | _(profil cluster opt-in)_ | Dimensi vektor embedding. Harus sesuai dengan model yang digunakan untuk membuat embedding (text-embedding-3-small → 1536; ada-002 → 1536; nomic-embed-text → 768). | | `QDRANT_HNSW_EF_CONSTRUCT` | `128` | _(profil cluster opt-in)_ | Akurasi pada waktu konstruksi indeks HNSW. Nilai yang lebih tinggi = build lebih lambat, pencarian lebih cepat. | | `OMNIROUTE_ROTATION_ENABLED` | `true` | `open-sse/services/rotationConfig.ts` | Sakelar utama untuk rotasi akun yang dapat dikonfigurasi operator. Jika `false`, tidak satu pun kelas `OMNIROUTE_ROTATE_*` di bawah ini memicu fallback akun (keadaan master-off juga memblokir kelas 429/500/502 yang diaktifkan secara default). Memungkinkan front-end pengawas (misalnya aplikasi desktop VibeProxy) mencerminkan aturan rotasinya sendiri ke mesin fallback akun di backend. | | `OMNIROUTE_ROTATION_RATE_LIMIT_RESET_SECONDS` | `0` | `open-sse/services/rotationConfig.ts` | Cooldown (detik) yang diterapkan pada akun yang terkena pembatasan laju ketika upstream tidak memberikan petunjuk reset eksplisit. `0` = gunakan cooldown default mesin, bukan penggantian tetap. | | `OMNIROUTE_ROTATION_DISABLE_TAG_WITHOUT_RESET` | `true` | `open-sse/services/rotationConfig.ts` | Cerminan preferensi front-end "jangan tandai sebagai terkena batas laju tanpa waktu reset". | | `OMNIROUTE_ROTATE_ON_429` | `true` | `open-sse/services/rotationConfig.ts` | Pengaktifan fallback per status untuk error `429`. Jika `false` (dan `OMNIROUTE_ROTATION_ENABLED=true`), `429` tidak lagi memicu rotasi akun dan sebagai gantinya dikembalikan ke klien. | | `OMNIROUTE_ROTATE_429_THRESHOLD` | `1` | `open-sse/services/rotationConfig.ts` | Jumlah error `429` dalam `OMNIROUTE_ROTATE_429_WINDOW_SECONDS` yang diperlukan sebelum akun dirotasi. `1` (default) langsung melakukan rotasi, sehingga mempertahankan perilaku historis. | | `OMNIROUTE_ROTATE_429_WINDOW_SECONDS` | `120` | `open-sse/services/rotationConfig.ts` | Jendela geser (detik) yang digunakan untuk menghitung error `429` sebagai bagian dari `OMNIROUTE_ROTATE_429_THRESHOLD`. | | `OMNIROUTE_ROTATE_ON_500` | `true` | `open-sse/services/rotationConfig.ts` | Pengaktifan fallback per status untuk error server `5xx` (tidak termasuk `502`, yang memiliki kelasnya sendiri). Jika `false`, error ini tidak lagi memicu rotasi akun. | | `OMNIROUTE_ROTATE_500_THRESHOLD` | `1` | `open-sse/services/rotationConfig.ts` | Jumlah error `5xx` dalam `OMNIROUTE_ROTATE_500_WINDOW_SECONDS` yang diperlukan sebelum akun dirotasi. `1` (default) langsung melakukan rotasi. | | `OMNIROUTE_ROTATE_500_WINDOW_SECONDS` | `120` | `open-sse/services/rotationConfig.ts` | Jendela geser (detik) yang digunakan untuk menghitung error `5xx` sebagai bagian dari `OMNIROUTE_ROTATE_500_THRESHOLD`. | | `OMNIROUTE_ROTATE_ON_502` | `true` | `open-sse/services/rotationConfig.ts` | Pengaktifan fallback per status untuk error `502` (gateway buruk). Jika `false`, `502` tidak lagi memicu rotasi akun. | | `OMNIROUTE_ROTATE_502_THRESHOLD` | `1` | `open-sse/services/rotationConfig.ts` | Jumlah error `502` dalam `OMNIROUTE_ROTATE_502_WINDOW_SECONDS` yang diperlukan sebelum akun dirotasi. `1` (default) akan langsung melakukan rotasi. | | `OMNIROUTE_ROTATE_502_WINDOW_SECONDS` | `120` | `open-sse/services/rotationConfig.ts` | Jendela geser (detik) yang digunakan untuk menghitung error `502` terhadap `OMNIROUTE_ROTATE_502_THRESHOLD`. | | `OMNIROUTE_ROTATE_ON_400` | `false` | `open-sse/services/rotationConfig.ts` | Opt-in (default NONAKTIF): ketika `true`, `400` biasa (bad request) juga memicu rotasi akun. Ini hanya bersifat tambahan — tidak pernah memblokir perilaku mesin yang sudah ada, yaitu ketika `400` berisi teks rate-limit/kuota, mesin tetap melakukan fallback terlepas dari flag ini. | | `OMNIROUTE_ROTATE_400_THRESHOLD` | `1` | `open-sse/services/rotationConfig.ts` | Jumlah error `400` dalam `OMNIROUTE_ROTATE_400_WINDOW_SECONDS` yang diperlukan sebelum akun dirotasi (hanya diperiksa ketika `OMNIROUTE_ROTATE_ON_400=true`). | | `OMNIROUTE_ROTATE_400_WINDOW_SECONDS` | `120` | `open-sse/services/rotationConfig.ts` | Jendela geser (detik) yang digunakan untuk menghitung error `400` terhadap `OMNIROUTE_ROTATE_400_THRESHOLD`. | ### Penjadwal Pemanasan Claude Pemanasan berbasis cron untuk koneksi OAuth Anthropic yang telah diaktifkan, sehingga jendela rate-limit 5 jam dibuka oleh permintaan terjadwal yang sederhana, bukan oleh permintaan nyata pertama (#8848). Penjadwal dinonaktifkan kecuali `OMNIROUTE_WARMUP_ENABLED` bernilai truthy **dan** koneksi ditandai di `settings.claudeWarmup.connections`; daftar koneksi yang kosong berarti tidak ada yang dipanaskan meskipun env var aktif. | Variable | Default | Source File | Description | | ------------------------------ | --------------------------- | ---------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `OMNIROUTE_WARMUP_ENABLED` | _(unset → off)_ | `src/lib/warmupScheduler.ts` | Sakelar utama untuk penjadwal pemanasan. Menerima `1`/`true`/`yes`/`on` (tidak membedakan huruf besar-kecil, spasi di awal dan akhir dihapus). Nilai lain apa pun, atau jika tidak disetel, membuat penjadwal tetap nonaktif. | | `OMNIROUTE_WARMUP_CRON` | `0 7 * * *` | `src/lib/warmupScheduler.ts` | Ekspresi cron lima kolom untuk waktu pemanasan, dievaluasi dalam `America/Los_Angeles` (zona waktu reset Anthropic), terlepas dari waktu pada host. | | `OMNIROUTE_WARMUP_CONCURRENCY` | `3` | `src/lib/warmupScheduler.ts` | Jumlah koneksi yang dipanaskan secara paralel pada setiap waktu pemanasan. Dibatasi hingga `1`-`10`; nilai nonnumerik akan kembali ke `3`. | | `OMNIROUTE_WARMUP_MODEL` | `claude-3-5-haiku-20241022` | `src/lib/warmupScheduler.ts` | Model yang digunakan untuk permintaan pemanasan. Ganti hanya jika default tidak tersedia pada paket Anda; pilih model termurah yang tetap dapat membuka jendela tersebut. | ### Sesi VNC Login Browser & Alias Data-Dir Chromium+VNC dalam container yang digunakan untuk pengambilan kredensial login browser interaktif (`/api/vnc-session`), serta alias `DATA_DIR` lama. Semuanya opsional — default VNC menargetkan image `omniroute-vnc-chromium:local` yang disertakan dan hanya diganti untuk image container khusus, port, atau penyesuaian siklus hidup. | Variabel | Default | File Sumber | Deskripsi | | ------------------------------------- | ------------------------------------------------------------------------ | ------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `OMNIROUTE_VNC_IMAGE` | `omniroute-vnc-chromium:local` | `src/lib/vncSession/manifest.ts` | Tag image Docker untuk container login Chromium+VNC. Build `docker/vnc-browser/chromium` atau arahkan ke image kustom. | | `OMNIROUTE_DOCKER_BIN` | `docker` | `src/lib/vncSession/manifest.ts` | Biner runtime container yang digunakan untuk meluncurkan container VNC (misalnya, atur ke `podman`). | | `OMNIROUTE_VNC_CONTAINER_VNC_PORT` | `3000` | `src/lib/vncSession/manifest.ts` | Port VNC/noVNC yang diekspos di dalam container. | | `OMNIROUTE_VNC_CONTAINER_CDP_PORT` | `9223` | `src/lib/vncSession/manifest.ts` | Port Chrome DevTools Protocol di dalam container. | | `OMNIROUTE_VNC_CONTAINER_PROFILE_DIR` | `/config` | `src/lib/vncSession/manifest.ts` | Jalur direktori profil Chromium di dalam container. | | `OMNIROUTE_VNC_PROFILE_DIR` | `$HOME/.omniroute/browser-login-profiles` | `src/lib/vncSession/manifest.ts` | Direktori host yang menyimpan profil login browser yang dipertahankan. | | `OMNIROUTE_VNC_IDLE_MS` | `600000` (10 mnt) | `src/lib/vncSession/manifest.ts` | Batas waktu tidak aktif (ms) sebelum sesi VNC yang tidak aktif dihentikan. | | `OMNIROUTE_VNC_MAX_MS` | `1800000` (30 mnt) | `src/lib/vncSession/manifest.ts` | Batas maksimum (ms) masa berlaku satu sesi VNC. | | `OMNIROUTE_VNC_MAX_SESSIONS` | `4` | `src/lib/vncSession/manifest.ts` | Jumlah maksimum sesi VNC yang berjalan secara bersamaan. | | `OMNIROUTE_VNC_READY_MS` | `45000` | `src/lib/vncSession/manifest.ts` | Batas waktu (ms) untuk menunggu browser dalam container siap digunakan oleh CDP. | | `OMNIROUTE_VNC_HARVEST_MS` | `20000` | `src/lib/vncSession/manifest.ts` | Batas waktu (ms) untuk mengambil sesi/cookie yang ditangkap setelah login selesai. | | `OMNIROUTE_VNC_CHROMIUM_ARGS` | `--remote-debugging-port=9222 --no-first-run --no-default-browser-check` | `src/lib/vncSession/manifest.ts` | Flag baris perintah tambahan yang diteruskan ke Chromium dalam container. | | `OMNIROUTE_VNC_NETWORK` | `omniroute-vnc-browser-login` | `src/lib/vncSession/manifest.ts` | Jaringan Docker khusus yang diikuti container login VNC (#12571), bukan bridge default, sehingga container lain yang setara tidak dapat menjangkau port bridge CDP-nya. | | `VIBEPROXY_DATA_DIR` | _(tidak disetel)_ | `open-sse/services/notionThreadSessions.ts` | **Alias lama** untuk `DATA_DIR`, yang diperiksa hanya setelah `DATA_DIR` dan `OMNIROUTE_DATA_DIR` tidak disetel. Menentukan lokasi cache sesi thread web Notion (`/notion-web-thread-sessions.json`). | --- ## 26. Uji & E2E Memanfaatkan 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 disetel dalam penerapan produksi. | Variabel | Bawaan | Berkas Sumber | Keterangan | | -------------------------------------- | ----------------------------------- | ----------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `OMNIROUTE_E2E_BOOTSTRAP_MODE` | `auth` | `scripts/dev/run-next-playwright.mjs` | mode bootstrap E2E (`auth`, `fresh`, `reuse`) untuk pelari Playwright. | | `OMNIROUTE_E2E_PASSWORD` | jatuh kembali ke `INITIAL_PASSWORD` | `scripts/dev/run-next-playwright.mjs` | Kata sandi admin disuntikkan ke lingkungan Playwright. | | `OMNIROUTE_DISABLE_LOCAL_HEALTHCHECK` | `true` | `scripts/dev/run-next-playwright.mjs` | Nonaktifkan jajak pendapat pemeriksaan kesehatan lokal selama Playwright berjalan. | | `OMNIROUTE_DISABLE_TOKEN_HEALTHCHECK` | `true` | `scripts/dev/run-next-playwright.mjs` | Nonaktifkan loop pemeriksaan kesehatan token OAuth selama pengujian. | | `OMNIROUTE_HEALTHCHECK_SKIP_PROVIDERS` | _(tidak disetel)_ | `src/lib/tokenHealthCheck.ts` | Penyedia yang dipisahkan koma dikecualikan dari pembersihan penyegaran token proaktif (misalnya `codex,openai`). Alternatif yang ditargetkan untuk menonaktifkan sepenuhnya pemeriksaan kesehatan — penyedia TTL pendek terus diperbarui sementara penyedia kaskade tetap hanya reaktif. | | `OMNIROUTE_HIDE_HEALTHCHECK_LOGS` | `true` | `scripts/dev/run-next-playwright.mjs` | Heningkan kebisingan pemeriksaan kesehatan di Playwright stdout. | | `OMNIROUTE_PLAYWRIGHT_SKIP_BUILD` | `0` | `scripts/dev/run-next-playwright.mjs` | Lewati pembuatan produksi Next.js sebelum Playwright dimulai (optimasi CI ). | | `OMNIROUTE_SKIP_UNINSTALL_HOOK` | `0` | `scripts/build/uninstall.mjs` | Lewati kait pencopotan OmniRoute (digunakan oleh CI untuk menjaga `node_modules` tetap utuh). | | `ECOSYSTEM_SERVER_WAIT_MS` | `180000` | `scripts/dev/run-ecosystem-tests.mjs` | Waktu tunggu (ms) hingga server menjadi sehat sebelum menjalankan tes ecosystem/protocol. | | `ELECTRON_SMOKE_URL` | `http://127.0.0.1:20128/login` | `scripts/dev/smoke-electron-packaged.mjs` | URL the Electron smoke harness mengharapkan aplikasi yang dikemas untuk berfungsi. | | `ELECTRON_SMOKE_TIMEOUT_MS` | `45000` | `scripts/dev/smoke-electron-packaged.mjs` | Total waktu tunggu (ms) sebelum rangkaian asap berhenti. | | `ELECTRON_SMOKE_SETTLE_MS` | `2000` | `scripts/dev/smoke-electron-packaged.mjs` | Selesaikan jendela (ms) setelah halaman dimuat. | | `ELECTRON_SMOKE_APP_EXECUTABLE` | _(mobil)_ | `scripts/dev/smoke-electron-packaged.mjs` | Jalur eksplisit ke paket Electron yang dapat dieksekusi. | | `ELECTRON_SMOKE_DATA_DIR` | _(tmpdir)_ | `scripts/dev/smoke-electron-packaged.mjs` | Direktori data untuk menjalankan Electron smoke. | | `ELECTRON_SMOKE_KEEP_DATA` | `0` | `scripts/dev/smoke-electron-packaged.mjs` | Atur `1` untuk mempertahankan direktori data asap setelah dijalankan. | | `ELECTRON_SMOKE_STREAM_LOGS` | `0` | `scripts/dev/smoke-electron-packaged.mjs` | Atur `1` untuk mengalirkan log Electron ke stdout selama proses. | | `ELECTRON_SMOKE_COLD_RESTART` | `0` | `scripts/dev/smoke-electron-packaged.mjs` | #7592: luncurkan ulang dengan direktori data yang sama dan tegaskan bahwa peluncuran kedua akan memilih driver SQLite asli. | | `CLI_DEVIN_BIN` | _( pencarian PATH )_ | `open-sse/executors/devin-cli.ts` | Ganti jalur biner Devin CLI. | ### Saluran terjemahan dokumen Digunakan oleh `scripts/i18n/run-translation.mjs` (perintah `npm run i18n:run` ). Keenam variabel tersebut tidak disetel secara default — setel variabel tersebut dalam `.env` hanya pada mesin yang dapat menjalankan penerjemah dokumen. | Variabel | Bawaan | Berkas Sumber | Keterangan | | ------------------------------------------ | ----------------- | ----------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `OMNIROUTE_TRANSLATION_API_URL` | _(tidak disetel)_ | `scripts/i18n/run-translation.mjs` | URL dasar yang kompatibel dengan OpenAI untuk backend terjemahan. | | `OMNIROUTE_TRANSLATION_API_KEY` | _(tidak disetel)_ | `scripts/i18n/run-translation.mjs` | Token pembawa untuk backend terjemahan (tidak pernah dicatat). | | `OMNIROUTE_TRANSLATION_MODEL` | _(tidak disetel)_ | `scripts/i18n/run-translation.mjs` | Id model, misalnya `gpt-4o-mini` atau `cx/gpt-5.4-mini`. | | `OMNIROUTE_TRANSLATION_FALLBACK_MODELS` | _(tidak disetel)_ | `scripts/i18n/lib/translate-backend.mjs` | Rantai model opsional yang dipisahkan koma dicoba secara berurutan ketika model utama gagal (kuota 429, 401/402, 5xx, batas waktu, jaringan); permintaan yang salah format (400/413/422) tidak dicoba lagi di tempat lain. | | `OMNIROUTE_TRANSLATION_TIMEOUT_MS` | `60000` | `scripts/i18n/run-translation.mjs` | Batas waktu per permintaan dalam milidetik. | | `OMNIROUTE_TRANSLATION_REASONING_EFFORT` | _(tidak disetel)_ | `scripts/i18n/lib/translate-backend.mjs` | Kontrol penalaran opsional, dikirim apa adanya ke backend saat disetel. | | `OMNIROUTE_TRANSLATION_CONCURRENCY` | `4` | `scripts/i18n/run-translation.mjs` | Permintaan terjemahan paralel saat menjalankan beberapa file/lokal. | | `OMNIROUTE_TRANSLATION_ENGINE` | `llm` | `scripts/i18n/run-translation.mjs` | `llm` menggunakan backend di atas; `google` diterjemahkan melalui mesin Google yang aman terhadap struktur dan tidak memerlukan variabel LLM. | | `OMNIROUTE_TRANSLATION_GOOGLE_FALLBACK` | `1` | `scripts/i18n/run-translation.mjs` | Dengan mesin `llm`, potongan yang tidak dapat dihasilkan oleh model (penjaga keluaran gagal pada setiap upaya, atau kesalahan model) diterjemahkan oleh Google alih-alih gagal di lokal. `0` menonaktifkannya. | | `OMNIROUTE_TRANSLATION_GOOGLE_API_KEY` | _(tidak disetel)_ | `scripts/i18n/lib/google-translate.mjs` | Kunci Cloud Translation v2 opsional. Tidak disetel menggunakan titik akhir web tanpa kunci (dibatasi kecepatan, baik untuk gelombang sesekali). | | `OMNIROUTE_TRANSLATION_GOOGLE_CONCURRENCY` | `6` | `scripts/i18n/lib/google-translate.mjs` | Permintaan Google paralel dibagikan oleh setiap lokal yang dijalankan. | | `OMNIROUTE_TRANSLATION_GOOGLE_TIMEOUT_MS` | `30000` | `scripts/i18n/lib/google-translate.mjs` | Batas waktu per permintaan untuk mesin Google, dalam milidetik. | | `UI_KIT_READ_TOKEN` | _(tidak disetel)_ | `scripts/check/check-ui-kit-upstream.mjs` | Token baca-saja untuk repo UI kit upstream pribadi, digunakan oleh `npm run check:ui-kit-upstream` dan alur kerja mingguan "UI Kit upstream watch". Secara lokal, pemeriksaan tersebut menggunakan kredensial git Anda. | --- ## 27. Umpan Radar (Hosting Mandiri) Add-on opsional yang dilindungi oleh tanda fitur RADAR_ENABLED (defaultnya adalah — tanda fitur diaktifkan melalui Settings/DB, bukan env var; lihat [docs/frameworks/RADAR.md](../frameworks/RADAR.md#flag-radar_enabled-default-off) ). Empat variabel pertama di bawah ini merupakan penggantian opsional untuk aliran feed dan kunci pendukung yang dihosting sendiri atau bercabang. Yang kelima, `RADAR_ADMIN_URL`, adalah tautan bebas default terpisah ke panel operasi pribadi pemilik. Lihat [docs/frameworks/RADAR.md](../frameworks/RADAR.md) untuk dokumen modul lengkap dan [aktivasi ujung ke ujung serta urutan pengaturan terpandu](../frameworks/RADAR.md#end-to-end-activation-and-guided-setup). Pembaca pengumuman Home/Changelog generik tidak dikonfigurasi oleh variabel lingkungan dan tidak bergantung pada tanda fitur RADAR_ENABLED. Bunyinya repositori publik `news.json` URL dideklarasikan di `src/shared/utils/releaseNotes.ts` hanya oleh GET ; pemecatan IDs tetap berada di penyimpanan lokal browser. | Variabel | Bawaan | Berkas Sumber | Keterangan | | ----------------------------- | -------------------------------------------- | ------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | `RADAR_FEED_URL` | `https://radar.omniroute.online` | `src/lib/radar/{sync,referralsSync,offersSync,intelSync}.ts` | Basis URL dibagikan melalui katalog, rujukan, penawaran pendukung, dan umpan Intel yang ditandatangani secara terpisah. Ganti untuk menunjuk pada layanan yang dihosting sendiri atau bercabang. | | `RADAR_FEED_PUBKEY` | _(kunci default yang disematkan)_ | `src/lib/radar/pinnedKeys.ts` | Kunci publik Ed25519 (base64-DER SPKI atau PEM) digunakan untuk memverifikasi tanda tangan feed dari feed khusus. | | `RADAR_CONTRIBUTOR_CLAIM_URL` | `https://radar.omniroute.online/auth/github` | `src/lib/radar/links.ts` | URL tombol dasbor "Saya seorang kontributor" terbuka ( alur klaim kunci pendukung GitHub OAuth ). | | `RADAR_SUPPORTER_PLANS_URL` | `https://radar.omniroute.online/planos` | `src/lib/radar/links.ts` | URL tombol dasbor "Dukung proyek" terbuka ( halaman payment/plans ). | | `RADAR_ADMIN_URL` | _(tidak disetel)_ | `src/lib/radar/links.ts` | Tautan panel operasi pribadi khusus pemilik. HTTPS diperlukan kecuali untuk loopback HTTP SSH forward; nilai yang tidak disetel atau tidak valid tidak membuat item navigasi. | --- ## Audit: Variabel Dihapus / Mati Variabel berikut muncul di versi `.env.example` sebelumnya tetapi sudah ada** tidak ada referensi waktu proses** dalam basis kode saat ini. Mereka telah dihapus: | Variabel | Alasan | | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------- | | `STORAGE_DRIVER=sqlite` | Jangan pernah membaca file sumber apa pun. SQLite adalah satu-satunya driver yang didukung — tidak diperlukan pilihan. | | `INSTANCE_NAME=omniroute` | Hadir dalam templat docs/env lama tetapi tidak digunakan saat runtime. Dapat kembali dalam fitur multi-instance di masa mendatang. | | `SQLITE_MAX_SIZE_MB=2048` | Tidak direferensikan dalam kode sumber. Ukuran basis data tidak dibatasi secara artifisial. | | `SQLITE_CLEAN_LEGACY_FILES=true` | Tidak direferensikan dalam kode sumber. Pembersihan lama kemungkinan besar telah dihapus. | | `CLI_ROO_BIN` | Tidak terdaftar di `src/shared/services/cliRuntime.ts`. | | `CLI_KIMI_CODING_BIN` | Tidak terdaftar di `src/shared/services/cliRuntime.ts` (Kimi Coding menggunakan OAuth, bukan biner CLI ). | | `IFLOW_OAUTH_CLIENT_ID` / `IFLOW_OAUTH_CLIENT_SECRET` | Tidak direferensikan di mana pun dalam kode 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` | Dihapus di v3.8.0. Runtime tidak lagi membaca kredensial env vars — ini berasal dari Dashboard / `data/provider-credentials.json` / dienkripsi DB. | | `CURSOR_PROTOBUF_DEBUG` | Dihapus di v3.8.0. pelaksana Cursor menggunakan `CURSOR_DEBUG` / `CURSOR_STREAM_DEBUG` (lihat §22). | | `CLI_COMPAT_KIRO` | Dihapus di v3.8.0. Kiro ada di `CLI_COMPAT_OMITTED_PROVIDER_IDS` — tombolnya tidak berpengaruh. | | `QIANFAN_API_KEY` | Dihapus bersama rintisan kunci API penyedia lain yang tidak digunakan di v3.8.0. | ### Koreksi Nilai Default | Variabel | Nilai `.env.example` lama | Default Kode Aktual | Tetap | | ------------------------- | ------------------------- | ------------------- | ------------------------------------------------------------------------------ | | `APP_LOG_RETENTION_DAYS` | `90` | `7` | ✅ Menghapus nilai yang menyesatkan; `7` yang didokumentasikan sebagai default | | `CALL_LOG_RETENTION_DAYS` | `90` | `7` | ✅ Menghapus nilai yang menyesatkan; `7` yang didokumentasikan sebagai default | ### regenerasi konfigurasi OpenCode (perkakas ad-hoc) Digunakan oleh `scripts/ad-hoc/regen-opencode-config.ts` untuk membuat ulang `opencode.json` dengan nilai `limit.context` dan `limit.output` akurat yang diambil dari instance OmniRoute yang sedang berjalan. Semua ini tidak diperlukan untuk pengoperasian normal — skrip hanya merupakan alat pengembang. | Variabel | Bawaan | Berkas Sumber | Keterangan | | ------------------ | ------------------------ | ----------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------- | | `OMNIROUTE_URL` | `http://localhost:20128` | `scripts/ad-hoc/regen-opencode-config.ts` | Basis URL dari instance OmniRoute untuk menanyakan `/v1/models`. | | `OMNIROUTE_KEY` | _(tidak disetel)_ | `scripts/ad-hoc/regen-opencode-config.ts` | kunci API untuk mengautentikasi terhadap titik akhir OmniRoute `/v1/models`. Kembali ke `OPENCODE_API_KEY` jika tidak disetel. | | `OPENCODE_API_KEY` | _(tidak disetel)_ | `scripts/ad-hoc/regen-opencode-config.ts` | Kunci API gaya OpenCode (`sk-...`) ditulis ke dalam `opencode.json` yang dibuat ulang. Kembali ke `OMNIROUTE_KEY` jika tidak disetel. | ### Harness evaluasi offline kompresi (perkakas ad-hoc) Digunakan oleh `scripts/compression-eval/index.ts`, evaluasi kompresi offline CLI. Tidak diperlukan untuk pengoperasian normal perkakas pengembang — saja. | Variabel | Bawaan | Berkas Sumber | Keterangan | | ---------------------------- | ------------- | ----------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `OMNIROUTE_EVAL_CREDENTIALS` | `{}` (kosong) | `scripts/compression-eval/index.ts` | Kredensial JSON yang disediakan operator untuk penyedia yang dilaksanakan oleh eval kompresi offline CLI (diurai dengan `JSON.parse`). Biarkan tidak disetel untuk proses kering. | ### VNC Sesi Peramban Digunakan oleh `src/lib/vncSession/manifest.ts` untuk mengonfigurasi sesi Chromium tanpa kepala berbasis Docker untuk penyedia otomatisasi browser. Semua default — opsional ditampilkan di bawah. | Variabel | Bawaan | Berkas Sumber | Keterangan | | ------------------------------------- | ------------------------------ | ------------------------------------------- | --------------------------------------------------------------------------------------- | | `OMNIROUTE_DOCKER_BIN` | `docker` | `src/lib/vncSession/manifest.ts` | Jalur ke biner Docker yang digunakan untuk menelurkan kontainer VNC. | | `OMNIROUTE_VNC_IMAGE` | `omniroute-vnc-chromium:local` | `src/lib/vncSession/manifest.ts` | gambar Docker untuk wadah Chromium VNC. | | `OMNIROUTE_VNC_CHROMIUM_ARGS` | _(bendera bawaan)_ | `src/lib/vncSession/manifest.ts` | Argumen Chromium CLI ekstra diteruskan ke browser di dalam penampung. | | `OMNIROUTE_VNC_CONTAINER_VNC_PORT` | `3000` | `src/lib/vncSession/manifest.ts` | port VNC di dalam wadah. | | `OMNIROUTE_VNC_CONTAINER_CDP_PORT` | `9223` | `src/lib/vncSession/manifest.ts` | Port Protokol Chrome DevTools di dalam wadah. | | `OMNIROUTE_VNC_CONTAINER_PROFILE_DIR` | `/config` | `src/lib/vncSession/manifest.ts` | Direktori profil di dalam wadah. | | `OMNIROUTE_VNC_PROFILE_DIR` | _(tidak disetel)_ | `src/lib/vncSession/manifest.ts` | Direktori sisi host untuk profil browser persisten. | | `OMNIROUTE_VNC_IDLE_MS` | `600000` | `src/lib/vncSession/manifest.ts` | Batas waktu menganggur (ms) sebelum sesi VNC dipanen. | | `OMNIROUTE_VNC_MAX_MS` | `1800000` | `src/lib/vncSession/manifest.ts` | Durasi sesi maksimum (ms). | | `OMNIROUTE_VNC_MAX_SESSIONS` | `4` | `src/lib/vncSession/manifest.ts` | Sesi VNC serentak maksimum. | | `OMNIROUTE_VNC_READY_MS` | `45000` | `src/lib/vncSession/manifest.ts` | Batas waktu kesiapan browser (ms). | | `OMNIROUTE_VNC_HARVEST_MS` | `20000` | `src/lib/vncSession/manifest.ts` | batas waktu Harvest/cleanup (ms). | | `OMNIROUTE_VNC_NETWORK` | `omniroute-vnc-browser-login` | `src/lib/vncSession/manifest.ts` | Jaringan Docker khusus yang bergabung dengan kontainer (#12571), dari jembatan default. | | `VIBEPROXY_DATA_DIR` | _(tidak disetel)_ | `open-sse/services/notionThreadSessions.ts` | Direktori untuk persistensi sesi thread Notion. | ### Otentikasi layanan internal | Variabel | Bawaan | Keterangan | | --------------------------------------- | ------ | ----------------------------------------------------------------------------------------------------------- | | `OMNIROUTE_INTERNAL_SERVICE_TOKEN` | – | Token sebaris untuk autentikasi layanan-ke-layanan bidang manajemen. | | `OMNIROUTE_INTERNAL_SERVICE_TOKEN_FILE` | – | Jalur ke file yang berisi token layanan internal (lebih disukai dalam wadah; menggantikan variabel inline). | ### statistik penyedia OpenRouter | Variabel | Bawaan | Keterangan | | ----------------------------------- | --------- | ------------------------------------------------------------------------------------------------------ | | `OPENROUTER_PROVIDER_STATS_ENABLED` | `true` | Setel ke `false` untuk melewati pengambilan statistik OpenRouter per penyedia untuk pengayaan katalog. | | `OPENROUTER_PROVIDER_STATS_TTL_MS` | `3600000` | Cache TTL (ms) untuk statistik penyedia OpenRouter yang diambil. | ### Pengikatan Redis tertanam | Variabel | Bawaan | Keterangan | | --------------------------- | ----------- | -------------------------------------------------------------------------- | | `REDIS_BIND_HOST` | `127.0.0.1` | Ikat alamat untuk layanan Redis yang tertanam. | | `REDIS_PORT` | `6379` | Port untuk layanan Redis tertanam. | | `OMNIROUTE_REDIS_BIND_HOST` | – | Penggantian cakupan OmniRoute untuk alamat pengikatan Redis yang tertanam. | --- ## 24. Rilis tambahan v3.8.50 Pengaturan ini diperkenalkan setelah snapshot kontrak lingkungan sebelumnya. | Variabel | Bawaan | Berkas Sumber | Keterangan | | ------------------------------------------- | -------------------------------------- | ---------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `OMNIROUTE_CHAT_ADMISSION_QUEUE_MS` | `2000` | `src/shared/middleware/chatBodyAdmission.ts` | Tunggu maksimal untuk slot penerimaan obrolan kelas berat sebelum `503` yang dapat dicoba ulang; penantian berbatas singkat membuat serialisasi agen meledak alih-alih `503` instan. `0` mengembalikan penolakan langsung. | | `OMNIROUTE_CHAT_ADMISSION_MAX_QUEUED_BYTES` | `4194304` (4 MB) | `src/shared/middleware/chatBodyAdmission.ts` | Anggaran byte-antrian untuk tunggu masuk: batas total byte tubuh yang disangga yang diparkir di seluruh proses sehingga menunggu tidak dapat memperkuat heap (#4380). Penantian yang melebihi anggaran segera menerima `503` yang dapat dicoba ulang. | | `OMNIROUTE_CHAT_VIRTUAL_TTL_MS` | `60000` (60 detik) | `src/shared/middleware/chatBodyAdmission.ts` | Tidak berlaku lagi sejak #10110: jalur penerimaan per sesi dihapus demi satu anggaran seluruh proses. Diterima untuk kompatibilitas konfigurasi; diabaikan. | | `OMNIROUTE_CHAT_VIRTUAL_MAX_SESSIONS` | `64` | `src/shared/middleware/chatBodyAdmission.ts` | Tidak berlaku lagi sejak #10110: jalur penerimaan per sesi dihapus demi satu anggaran seluruh proses. Diterima untuk kompatibilitas konfigurasi; diabaikan. | | `OMNIROUTE_CHAT_VIRTUAL_LANES` | `0` (mati) | `open-sse/services/admission/runtime.ts` | Jalur penerimaan virtual waktu proses adaptif (#9654): saklar utama untuk gerbang adaptif per penyewa (sistem 2). Berbeda dari var jalur per koneksi yang tidak digunakan lagi di atas (TTL_MS / MAX_SESSIONS, tidak ada operasi sejak #10110). Bendera fitur dasbor dengan nama yang sama; env var menang atas penggantian dasbor; memerlukan restart. | | `OMNIROUTE_RUNNOW_TIMEOUT_MS` | `30000` | `src/app/api/jobs/[id]/run-now/route.ts` | Membatasi berapa lama panggilan run-now menunggu pekerjaan dalam penerbangan sebelum memulai proses antrian. | | `ADOBE_FIREFLY_BROWSER_REFRESH` | diaktifkan | `open-sse/services/adobeFireflySession.ts` | Menjaga IMS dan status risiko browser tetap segar melalui sesi CDP Chrome yang mencakup akun; atur `0` untuk menonaktifkan. | | `ADOBE_FIREFLY_SESSION_DISK` | diaktifkan | `open-sse/services/adobeFireflySession.ts` | Tetap memperbaiki sesi Adobe di bawah `DATA_DIR`; atur `0` untuk status hanya memori. | | `ADOBE_FIREFLY_MIN_SUBMIT_GAP_MS` | `12000` | `open-sse/services/adobeFireflySession.ts` | Jarak minimum antara pengiriman hasil Adobe Firefly. | | `ADOBE_FIREFLY_BATCH_EXTRA_GAP_MS` | `15000` | `open-sse/services/adobeFireflySession.ts` | Periode ekstra tenang setelah setiap pengiriman Adobe ketiga yang berhasil. | | `ADOBE_FIREFLY_CHROME_HEADLESS` | `0` | `open-sse/services/adobeFireflyBrowserLogin.ts` | Mode tanpa kepala sejati khusus debug; Adobe colligo biasanya menolak sesi risiko yang dihasilkan. | | `CHROME_PATH` | deteksi otomatis | `open-sse/executors/cloudflare-playground.ts`, `open-sse/executors/chatgpt-web-codex.ts` | Eksekusi Chrome absolut opsional yang digunakan oleh pelaksana yang digerakkan oleh browser ketika deteksi otomatis platform tidak mencukupi. | | `TELEGRAM_BOT_TOKEN` | _(tidak disetel)_ | `src/lib/telegram/config.ts` | token BotFather yang mengaktifkan webhook masuk dan menandatangani Aplikasi Mini `initData`. | | `TELEGRAM_WEBHOOK_SECRET` | _(tidak disetel)_ | `src/lib/telegram/config.ts` | Rahasia bersama didaftarkan melalui `setWebhook` dan diverifikasi terhadap header `X-Telegram-Bot-Api-Secret-Token` pada setiap pengiriman webhook. Diperlukan untuk jalur webhook; tidak disetel berarti pengiriman webhook ditolak dengan 503. | | `TELEGRAM_DEFAULT_MODEL` | `auto/chat` | `src/lib/telegram/chatProxy.ts` | Model yang digunakan untuk balasan obrolan Telegram. | | `TELEGRAM_BOT_API_BASE` | `https://api.telegram.org` | `src/lib/telegram/config.ts` | Penggantian URL dasar bot API untuk proxy atau server Bot API yang dihosting sendiri. | | `TELEGRAM_WEBHOOK_TIMEOUT_MS` | `60000` | `src/lib/telegram/config.ts` | Batas waktu dalam milidetik untuk panggilan Bot API keluar. | | `TELEGRAM_USER_ALLOWLIST_ENABLED` | `false` | `src/lib/telegram/config.ts` | Setel ke `true` untuk hanya melayani pengguna Telegram yang terdaftar di `TELEGRAM_ALLOWED_USER_IDS` (lainnya: Aplikasi Mini 403, pesan webhook hilang). Dinonaktifkan secara default: setiap pengguna Telegram dilayani dan mendapatkan kunci API yang dicetak yang menghabiskan kuota upstream. | | `TELEGRAM_ALLOWED_USER_IDS` | _(tidak disetel)_ | `src/lib/telegram/config.ts` | ID pengguna Telegram numerik yang dipisahkan koma disajikan saat `TELEGRAM_USER_ALLOWLIST_ENABLED=true`. Entri yang bukan bilangan bulat positif diabaikan dengan peringatan satu kali. Diabaikan saat daftar yang diizinkan tidak aktif; kosong dengan daftar yang diizinkan aktif tidak melayani siapa pun. | | `OMNIROUTE_OPTIONAL_PACK_TAR` | `1` (diaktifkan) | `scripts/build/optionalPackStaging.mjs` | Atur `0` untuk melewatkan pemancaran tarball `.tar.gz` sambil mementaskan paket ML/browser opsional untuk pohon mandiri Electron (direktori paket dan `optional-packs.index.json` masih diproduksi). Digunakan oleh alur kerja rilis desktop untuk memangkas ukuran unggahan artefak. | | `GROK_SUBSCRIPTION_IMAGES_ENABLED` | `false` | `open-sse/config/imageRegistry.ts` | Mengaktifkan pendaftaran rute gambar langganan xAI ; dinonaktifkan secara default sehingga jalur gambar kunci API tetap tidak berubah. | | `OMNIROUTE_API_KEY_COOLDOWN_MS` | `60000` | `open-sse/services/apiKeyRotator.ts` | Cooldown per tombol dalam milidetik ketika respons `429` tidak memiliki petunjuk `Retry-After` yang dapat digunakan. | | `OMNIROUTE_ESTIMATOR_CALIBRATION` | diaktifkan | `open-sse/services/estimatorCalibration.ts` | Atur ke `off`, `0`, atau `false` untuk menonaktifkan perekaman dan aplikasi kalibrasi estimator dalam memori. | | `NEXT_MANUAL_SIG_HANDLE` | _(intern)_ | `scripts/dev/standalone-server-ws.mjs` | Penggantian pengendali sinyal server mandiri internal; biasanya diatur dan dibersihkan oleh peluncur daripada dikonfigurasi oleh operator. | | `CHATGPT_WEB_TURN_TIMEOUT_MS` | `180000` | `open-sse/utils/chatgptWebExecutorAdapter.ts` | Plafon per putaran untuk putaran teks ChatGPT Web (Ruang Bersih); nilai di bawah `1000` diabaikan. | | `CHATGPT_WEB_TOOL_TURN_TIMEOUT_MS` | `180000` | `open-sse/utils/chatgptWebExecutorAdapter.ts` | Batas atas per putaran untuk putaran ChatGPT Web (Ruang Bersih) yang membawa alat klien (amplop `` yang ditiru); turunkan untuk mengembalikan kendali ke klien lebih cepat. Nilai di bawah `1000` diabaikan. | | `CHATGPT_WEB_HEADLESS` | `1` (tanpa kepala) | `open-sse/utils/chatgptWebExecutorAdapter.ts` | Jalankan browser ChatGPT Web (Clean Room) tanpa kepala. Tetapkan `0` hanya untuk akun yang tantangan pihak pertamanya menolak mode tanpa kepala (defaultnya diubah dari menuju ke tanpa kepala di #14948). | | `CHATGPT_WEB_BROWSER_ACQUIRE_TIMEOUT_MS` | `45000` | `open-sse/utils/chatgptWebExecutorAdapter.ts` | Plafon untuk meluncurkan browser ChatGPT Web (Clean Room) dan pemanasan chatgpt.com, sehingga browser atau sesi yang mati tidak dapat menghabiskan batas waktu antrian permintaan. | | `UI_KIT_CLONE` | `_references/cheaper-inference-ui-kit` | `scripts/check/check-ui-kit-snapshot.mjs` | Jalur CI UI Kit pribadi mengkloning gerbang snapshot-vendor berbeda `packages/ui-kit/src` melawan (KEA-7886); gerbang dilewati dengan peringatan ketika klon tidak ada. | ### ChatGPT Web (Codex) Default Global untuk Browser tanpa kepala dan Terowongan Alat yang digunakan. Im Dashboard gesetzte Connection-Werte haben Vorrang. | Variabel | Bawaan | Berkas Sumber | Keterangan | | --------------------------------------- | ------------------------------ | -------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `CHATGPT_WEB_CODEX_CHROME_PATH` | _(deteksi otomatis)_ | `open-sse/executors/chatgpt-web-codex.ts` | Eksplorasi Chrome-/Chromium-Pfad untuk npm-, systemd- dan PM2-Betrieb. | | `CHROME_PATH` | _(deteksi otomatis)_ | `open-sse/executors/chatgpt-web-codex.ts` | Gemeinsamer Fallback untuk penjelasan yang lebih Chrome-/Chromium-Pfad. | | `CHATGPT_WEB_CODEX_CDP_URL` | _(tidak disetel)_ | `open-sse/executors/chatgpt-web-codex.ts` | CDP magang-Endpunkt; Docker verwendet den Sidecar auf Port `9223`. | | `CHATGPT_WEB_CODEX_USE_CDP_PROFILE` | _(batalkan — nonaktif)_ | `open-sse/vendor/codex-chatgpt-web/persistent-cdp-context.ts` | Setel ke `1` (dengan titik akhir CDP dikonfigurasi) untuk menggunakan kembali halaman ChatGPT yang sudah ada pada profil browser yang dikelola secara eksternal dan bukan konteks terisolasi per giliran; juga membatasi tab ChatGPT secara bersamaan pada 1. Mati secara default. Lihat [profil CDP persisten](../guides/CHATGPT-WEB-PERSISTENT-CDP.md). | | `CDP_PROXY_TOKEN` | _(tidak disetel)_ | `docker/chatgpt-web-codex-browser/cdp-proxy.mjs` | Jika Anda tahu, Anda mungkin ingin Anfrage dan CDP-Proxy-Sidecar tersebut berada di Header `X-Omni-Cdp-Token` (#13679). Ohne Wert membiarkan Proxy tidak diautentikasi dengan — dan tidak melihat Netzisolierung dari Compose-Netzes `chatgpt-web-codex-net`. Erzeugen dan `openssl rand -hex 32`. | | `CHATGPT_WEB_CODEX_TUNNEL_ID` | _(tidak disetel)_ | `open-sse/executors/chatgpt-web-codex.ts` | OpenAI-Tunnel-ID Global untuk Codex-Tool-Runden lokal. | | `CHATGPT_WEB_CODEX_RUNTIME_KEY` | _(tidak disetel)_ | `open-sse/executors/chatgpt-web-codex.ts` | Kunci Runtime Terowongan Global; Niemals di Logs ausgeben. | | `CHATGPT_WEB_CODEX_CONNECTOR_NAME` | `OmniRoute Codex v2` | `open-sse/executors/chatgpt-web-codex.ts` | Nama Exakter dari ChatGPT-Custom-Connectors yang baru untuk MCP-Brücke. | | `CODEX_CHATGPT_WEB_HOME` | `/chatgpt-web-codex` | `open-sse/vendor/codex-chatgpt-web/config.ts` | Dediziertes Verzeichnis untuk Browser-, Broker- dan Tunnelzustand. | | `CODEX_CHATGPT_WEB_BROWSER_DIAGNOSTICS` | `0` | `open-sse/vendor/codex-chatgpt-web/adapters/chatgpt-web/browser-worker.ts` | `1` adalah cara untuk mendiagnosis browser dan pos pemeriksaan lainnya. | | `CODEX_CHATGPT_WEB_LAUNCHER` | _(tidak disetel)_ | `open-sse/vendor/codex-chatgpt-web/config.ts` | Opsional mutlak Pfad zu einem dauerhaften Launcher-Binary. | | `CODEX_CHATGPT_WEB_BUN` | _(deteksi otomatis)_ | `open-sse/vendor/codex-chatgpt-web/config.ts` | Opsional mutlak Pfad zum Bun-Runtime-Binary. | | `CODEX_WEB_GPT_BUN` | _(tidak disetel)_ | `open-sse/vendor/codex-chatgpt-web/config.ts` | Warisan-Fallback untuk `CODEX_CHATGPT_WEB_BUN`; nee Setup menggunakan nama kanonischen. | --- ## Jembatan OmniConductor Konsumen SSE berumur panjang yang mencerminkan tugas hub OmniConductor ke A2A TaskManager (`src/lib/conductor/`). Ikut serta — jembatan hanya dimulai ketika `CONDUCTOR_HUB_URL` diatur. Khusus sisi server: token hub tidak boleh mencapai browser. | Variabel | Bawaan | Berkas Sumber | Keterangan | | ------------------------------ | ----------------------- | -------------------------------- | ------------------------------------------------------------------------------------------------------------------------------- | | `CONDUCTOR_HUB_URL` | _(kosong)_ | `src/lib/conductor/boot.ts` | Basis URL dari hub OmniConductor (misalnya `http://127.0.0.1:7910`). Batalkan penyetelan jembatan = dinonaktifkan. | | `CONDUCTOR_HUB_TOKEN` | _(kosong)_ | `src/lib/conductor/boot.ts` | Kredensial hub untuk umpan — SSE memancarkan rekan `spokesperson` -kind di hub (`POST /v1/peers`, admin). | | `CONDUCTOR_ORCHESTRATOR_TOKEN` | _(kosong)_ | `src/lib/conductor/hubProxy.ts` | Kredensial untuk delegasi tugas hub A2A→ masuk (`POST /v1/tasks`); jatuh kembali ke `CONDUCTOR_HUB_TOKEN` ketika tidak disetel. | | `CONDUCTOR_SPOKESPERSON_URL` | `http://127.0.0.1:7920` | `src/lib/conductor/faroProxy.ts` | Basis URL layanan juru bicara (Faro) di belakang proxy obrolan dasbor (`/api/conductor/ask`). | ### Penjadwalan sadar kuota Digunakan oleh `open-sse/services/combo.ts` dan `src/lib/quota/quotaScheduler.ts` untuk pemeriksaan anggaran token pra-permintaan. Perilaku perutean default — keikutsertaan tidak berubah jika tidak disetel. | Variabel | Bawaan | Berkas Sumber | Keterangan | | ---------------------------------- | -------- | ------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `OMNIROUTE_QUOTA_AWARE_ROUTING` | `0` | `open-sse/services/combo.ts` | Ketika `1`, lewati koneksi yang anggaran token per jendelanya (`rateLimitOverrides.tpm`, tabel `provider_quota_state`) tidak mampu membayar perkiraan biaya permintaan sebelum pengiriman. Buka gagal ketika tidak ada anggaran yang dikonfigurasi. | | `OMNIROUTE_ESTIMATOR_CALIBRATION` | _(pada)_ | `open-sse/services/estimatorCalibration.ts` | Kalibrasi umpan balik dari penaksir token penjaga konteks (#14931): per (penyedia, model, alat yang ada) EMA dari `usage.prompt_tokens` / perkiraan, dimasukkan ke 0.15–2.0, hanya di memori. `off`, `0` atau `false` menonaktifkan perekaman dan aplikasi. | | `GROK_SUBSCRIPTION_IMAGES_ENABLED` | `false` | `open-sse/config/imageRegistry.ts` | Mendaftarkan rute gambar `xai-oauth` (`xao`) dan `grok-cli`. Bendera fitur dasbor dengan nama yang sama; penggantian DB memenangkan nilai ini. | ## Diagnostik sinkronisasi model | Variabel | Bawaan | Berkas Sumber | Keterangan | | ------------------------------ | ------ | -------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `OMNIROUTE_MODEL_SYNC_TIMINGS` | `0` | `src/lib/providerModels/modelSyncTimings.ts` | Atur ke `1` untuk mencatat waktu fase, permintaan ID yang dihasilkan, dan hasil fase success/error selama sinkronisasi model. Dinonaktifkan untuk semua nilai lainnya. Log menghilangkan permintaan, akun, katalog, dan muatan kesalahan. | ## Alat analisis media OpenCode lokal Digunakan oleh `scripts/cli/omniroute-media-mcp.mjs`. Tetapkan ini di lingkungan proses alat lokal. | Variabel | Default | Deskripsi | | -------------------------- | ----------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------- | | `OMNIROUTE_MEDIA_CONFIG` | `$XDG_CONFIG_HOME/opencode/opencode.json` (atau `~/.config/opencode/opencode.json`) | Konfigurasi OpenCode yang dibaca oleh alat media dan penginstal. | | `OMNIROUTE_MEDIA_PROVIDER` | `omniroute` | Entri penyedia yang dibaca dari konfigurasi OpenCode oleh alat media. | | `OMNIROUTE_MEDIA_MODEL` | `auto` | Model yang dikirim oleh alat media. Penyedianya harus mendukung jenis media yang diminta. | | `OMNIROUTE_MEDIA_API_KEY` | Kunci API penyedia yang dikonfigurasi atau referensi lingkungannya | Kredensial pengganti opsional. Simpan di lingkungan proses lokal; jangan pernah commit. |