# Environment Variables Reference (ខ្មែរ) 🌐 **Languages:** 🇺🇸 [English](../../../../reference/ENVIRONMENT.md) · 🇪🇹 [am](../../../am/docs/reference/ENVIRONMENT.md) · 🇸🇦 [ar](../../../ar/docs/reference/ENVIRONMENT.md) · 🇦🇿 [az](../../../az/docs/reference/ENVIRONMENT.md) · 🇧🇬 [bg](../../../bg/docs/reference/ENVIRONMENT.md) · 🇧🇩 [bn](../../../bn/docs/reference/ENVIRONMENT.md) · 🇧🇦 [bs](../../../bs/docs/reference/ENVIRONMENT.md) · 🇨🇿 [cs](../../../cs/docs/reference/ENVIRONMENT.md) · 🇩🇰 [da](../../../da/docs/reference/ENVIRONMENT.md) · 🇩🇪 [de](../../../de/docs/reference/ENVIRONMENT.md) · 🇬🇷 [el](../../../el/docs/reference/ENVIRONMENT.md) · 🇪🇸 [es](../../../es/docs/reference/ENVIRONMENT.md) · 🇪🇪 [et](../../../et/docs/reference/ENVIRONMENT.md) · 🇮🇷 [fa](../../../fa/docs/reference/ENVIRONMENT.md) · 🇫🇮 [fi](../../../fi/docs/reference/ENVIRONMENT.md) · 🇫🇷 [fr](../../../fr/docs/reference/ENVIRONMENT.md) · 🇮🇪 [ga](../../../ga/docs/reference/ENVIRONMENT.md) · 🇮🇳 [gu](../../../gu/docs/reference/ENVIRONMENT.md) · 🇳🇬 [ha](../../../ha/docs/reference/ENVIRONMENT.md) · 🇮🇱 [he](../../../he/docs/reference/ENVIRONMENT.md) · 🇮🇳 [hi](../../../hi/docs/reference/ENVIRONMENT.md) · 🇭🇷 [hr](../../../hr/docs/reference/ENVIRONMENT.md) · 🇭🇺 [hu](../../../hu/docs/reference/ENVIRONMENT.md) · 🇦🇲 [hy](../../../hy/docs/reference/ENVIRONMENT.md) · 🇮🇩 [id](../../../id/docs/reference/ENVIRONMENT.md) · 🇳🇬 [ig](../../../ig/docs/reference/ENVIRONMENT.md) · 🇮🇹 [it](../../../it/docs/reference/ENVIRONMENT.md) · 🇯🇵 [ja](../../../ja/docs/reference/ENVIRONMENT.md) · 🇬🇪 [ka](../../../ka/docs/reference/ENVIRONMENT.md) · 🇮🇳 [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) --- > ឯកសារយោងពេញលេញសម្រាប់អថេរបរិស្ថានទាំងអស់ដែល OmniRoute ទទួលស្គាល់។ > សម្រាប់គំរូចាប់ផ្តើមរហ័ស សូមមើល [`.env.example`](../../.env.example)។ > [!IMPORTANT] > អថេរនីមួយៗដែលបានចងក្រងជាឯកសារនៅទីនេះ ក៏ត្រូវតែមាននៅក្នុង `.env.example` ផងដែរ ហើយ > អថេរនីមួយៗនៅក្នុង `.env.example` ត្រូវតែមាននៅទីនេះ។ `npm run check:env-doc-sync` > អនុវត្តការផ្ទៀងផ្ទាត់នេះនៅពេល commit និងក្នុង CI។ ដើម្បីលុបអថេរណាមួយចេញដោយចេតនា សូមបន្ថែមវាទៅក្នុង > បញ្ជីអនុញ្ញាតនៅក្នុង `scripts/check/check-env-doc-sync.mjs`។ --- ## មាតិកា - [1. ព័ត៌មានសម្ងាត់ចាំបាច់](#1-required-secrets) - [2. ការផ្ទុក និងមូលដ្ឋានទិន្នន័យ](#2-storage--database) - [3. បណ្ដាញ និងច្រក](#3-network--ports) - [4. សុវត្ថិភាព និងការផ្ទៀងផ្ទាត់អត្តសញ្ញាណ](#4-security--authentication) - [5. ការសម្អាតទិន្នន័យបញ្ចូល និងការការពារ PII](#5-input-sanitization--pii-protection) - [6. គោលការណ៍ឧបករណ៍ និងការកំណត់ផ្លូវ](#6-tool--routing-policies) - [7. URL និងការធ្វើសមកាលកម្មជាមួយ Cloud](#7-urls--cloud-sync) - [8. Proxy ចេញក្រៅ](#8-outbound-proxy) - [9. ការរួមបញ្ចូលឧបករណ៍ CLI](#9-cli-tool-integration) - [10. ការរួមបញ្ចូល Agent ខាងក្នុង និង MCP](#10-internal-agent--mcp-integrations) - [11. ព័ត៌មានសម្ងាត់របស់អ្នកផ្ដល់សេវា OAuth](#11-oauth-provider-credentials) - [12. ការកំណត់ជំនួស User-Agent របស់អ្នកផ្ដល់សេវា](#12-provider-user-agent-overrides) - [13. ភាពឆបគ្នានៃ Fingerprint របស់ CLI](#13-cli-fingerprint-compatibility) - [14. អ្នកផ្ដល់សេវា API Key](#14-api-key-providers) - [15. ការកំណត់រយៈពេលអស់ពេល](#15-timeout-settings) - [16. ការកត់ត្រា](#16-logging) - [17. ការបង្កើនប្រសិទ្ធភាពអង្គចងចាំ](#17-memory-optimization) - [18. ការធ្វើសមកាលកម្មតម្លៃ](#18-pricing-sync) - [19. ការធ្វើសមកាលកម្មម៉ូដែល (Dev)](#19-model-sync-dev) - [20. ការកំណត់ជាក់លាក់សម្រាប់អ្នកផ្ដល់សេវា](#20-provider-specific-settings) - [21. ស្ថានភាព Proxy](#21-proxy-health) - [22. ការបំបាត់កំហុស](#22-debugging) - [23. ការរួមបញ្ចូល GitHub](#23-github-integration) - [24. Skills Sandbox (v3.8.0+)](#24-skills-sandbox-v380) - [27. Radar Feed (ការបង្ហោះដោយខ្លួនឯង)](#27-radar-feed-self-hosting) - [សេណារីយ៉ូនៃការដាក់ឱ្យដំណើរការ](#deployment-scenarios) - [សវនកម្ម៖ អថេរដែលបានដកចេញ / លែងប្រើ](#audit-removed--dead-variables) --- ## 1. តម្លៃសម្ងាត់ដែលត្រូវការ តម្លៃសម្ងាត់ដែលមិនទាន់កំណត់ ប៉ុន្តែត្រូវបានសម្គាល់ថា **បាទ/ចាស** នឹងត្រូវបង្កើតដោយស្វ័យប្រវត្តិនៅពេលដំណើរការលើកដំបូង (`JWT_SECRET`, `API_KEY_SECRET`) ហើយរក្សាទុកក្នុង `server.env` នៅក្នុងថតទិន្នន័យ — សូមកំណត់វាដោយច្បាស់លាស់នៅពេលថតនោះជាថតបណ្ដោះអាសន្ន។ ករណីលើកលែងគឺ `OMNIROUTE_WS_BRIDGE_SECRET`៖ វាមិនត្រូវបានរក្សាទុកក្នុង `server.env` ទេ — ចំណុចចាប់ផ្ដើមរបស់ម៉ាស៊ីនបម្រើបង្កើតតម្លៃបណ្ដោះអាសន្នសម្រាប់ពេលចាប់ផ្ដើមរាល់ដង ដែលមានតែស្ពានក្នុងដំណើរការប៉ុណ្ណោះអាចប្រើបាន ដូច្នេះម៉ាស៊ីនភាគីស្ពានពីខាងក្រៅត្រូវការកំណត់វាដោយច្បាស់លាស់។ | អថេរ | តម្រូវការ | លំនាំដើម | ឯកសារប្រភព | សេចក្ដីពិពណ៌នា | | ---------------------------- | -------------------------------- | --------------------------------- | --------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `JWT_SECRET` | **បាទ/ចាស** | _(គ្មាន)_ | `src/lib/auth` | ចុះហត្ថលេខា/ផ្ទៀងផ្ទាត់ខូគីសម័យទាំងអស់របស់ផ្ទាំងគ្រប់គ្រង (JWT)។ បង្កើតដោយប្រើ `openssl rand -base64 48`។ | | `API_KEY_SECRET` | **បាទ/ចាស** | _(គ្មាន)_ | `src/lib/db/apiKeys.ts` | សោអ៊ិនគ្រីប AES សម្រាប់តម្លៃ API key ដែលផ្ទុកក្នុង SQLite។ បង្កើតដោយប្រើ `openssl rand -hex 32`។ | | `INITIAL_PASSWORD` | ទេ | _(មិនបានកំណត់)_ | `src/lib/auth/managementPassword.ts` | កំណត់ពាក្យសម្ងាត់ផ្ទាំងគ្រប់គ្រងនៅពេលចាប់ផ្ដើម ខណៈពេលដែលមិនទាន់មានពាក្យសម្ងាត់ត្រូវបានរក្សាទុក; វានឹងមិនត្រូវអើពើនៅពេលពាក្យសម្ងាត់ត្រូវបានរក្សាទុករួចហើយ។ ការដំឡើងតាម npm និងពី source ចម្លង `.env.example` ទៅជា `.env` ដូច្នេះពួកវាចាប់ផ្ដើមជាមួយគោលកំណត់ជំនួសដែលគេស្គាល់ធំទូលាយរបស់វា `CHANGEME`៖ សូមផ្លាស់ប្ដូរវាមុនពេលចាប់ផ្ដើមលើកដំបូង ឬកំណត់ `INITIAL_PASSWORD=` (ទទេ) ក្នុង `.env` នោះ ដើម្បីបង្កើតពាក្យសម្ងាត់ក្នុង setup wizard នៅពេលចូលប្រើលើកដំបូង ដូចដែលតម្លៃមិនបានកំណត់ (លំនាំដើមរបស់រូបភាព Docker) ធ្វើដូច្នេះ។ ផ្លាស់ប្ដូរពាក្យសម្ងាត់ដែលបានរក្សាទុកតាមរយៈ ផ្ទាំងគ្រប់គ្រង → ការកំណត់ → សុវត្ថិភាព ឬរត់ `omniroute reset-password` (`node bin/reset-password.mjs` ក្នុង source checkout) ដោយកំណត់ `DATA_DIR` ទៅថតទិន្នន័យរបស់ម៉ាស៊ីនបម្រើ។ | | `OMNIROUTE_WS_BRIDGE_SECRET` | **បាទ/ចាស** (សម្រាប់ production) | _(មិនបានកំណត់)_ | `src/app/api/internal/codex-responses-ws/route.ts` | តម្លៃសម្ងាត់រួមសម្រាប់ស្ពាន WebSocket ខាងក្នុងរបស់ Codex Responses។ ផ្ទៀងផ្ទាត់សំណើស្ពានរវាង WS relay របស់ Electron/browser និង OmniRoute។ ⚠️ **តម្រូវជាចាំបាច់នៅក្នុង production — នៅពេលមិនបានកំណត់ សំណើស្ពាន WS ទាំងអស់នឹងត្រូវបដិសេធ។** បង្កើតដោយប្រើ `openssl rand -base64 32`។ | | `OMNIROUTE_SW_BUILD_ID` | ទេ | _(git SHA)_ | `next.config.mjs`, `scripts/build/assembleStandalone.mjs` | លេខសម្គាល់សម្រាប់បំបាត់ cache របស់ service worker ដែលកំណត់ជាក់លាក់សម្រាប់ PWA shell (#11779); ជាតម្លៃទីមួយក្នុងលំដាប់ដោះស្រាយ។ | | `SOURCE_VERSION` | ទេ | _(មិនបានកំណត់)_ | `next.config.mjs`, `scripts/build/assembleStandalone.mjs` | ជាតម្លៃទីពីរក្នុងលំដាប់ — កំណត់ដោយកម្មវិធីបង្កើត PaaS (ឧ. បែប Heroku) ជា commit ដែលបានដាក់ឱ្យដំណើរការ។ | | `NEXT_PUBLIC_SW_BUILD_ID` | ទេ | _(បានមកពីការគណនា)_ | `src/shared/components/PwaRegister.tsx` | តម្លៃសាធារណៈនៅពេល build ដែល client ប្រើដើម្បីចុះឈ្មោះ `/sw.js?v=…`; បានមកពីតម្លៃទាំងពីរខាងលើ បន្ទាប់មក git SHA។ | | `OMNIROUTE_PEER_STAMP_TOKEN` | ទេ (ស្វ័យប្រវត្តិ) | _(ស្វ័យប្រវត្តិរាល់ពេលចាប់ផ្ដើម)_ | `src/server/authz/policies/management.ts` | តម្លៃសម្ងាត់សម្រាប់ process នីមួយៗ ដែលបញ្ជាក់ថាត្រា peer-IP ដែលទុកចិត្តបានមកពី HTTP server ផ្ទាល់របស់ OmniRoute (`scripts/dev/peer-stamp.mjs`)។ middleware ផ្នែក authz ទុកចិត្តលើភាពជិតខាងរបស់សំណើ (ការកំណត់ loopback/LAN សម្រាប់ route ប្រភេទ LOCAL_ONLY) តែនៅពេលត្រានោះមាន token នេះប៉ុណ្ណោះ។ វាត្រូវបានបង្កើតដោយស្វ័យប្រវត្តិរាល់ពេលចាប់ផ្ដើម — សូមទុកវាមិនឱ្យកំណត់; កំណត់វាជាក់លាក់តែសម្រាប់ការរៀបចំ multi-process ដែលត្រូវចែករំលែកត្រាប៉ុណ្ណោះ។ | | `OMNIROUTE_TRUSTED_PROXIES` | ទេ | _(មិនបានកំណត់)_ | `scripts/dev/peer-stamp.mjs` | IP ឬជួរ CIDR របស់ reverse proxy ដែលបំបែកដោយសញ្ញាក្បៀស ហើយដែលបញ្ជីអនុញ្ញាត/បដិសេធ IP អាចជឿលើ `X-Forwarded-For` / `X-Real-IP` របស់ពួកវា បន្ថែមពីលើ loopback, អាសយដ្ឋានបណ្ដាញឯកជន និង Cloudflare edge ដែលតែងតែត្រូវបានទុកចិត្ត។ ត្រូវការតែសម្រាប់ proxy នៅលើអាសយដ្ឋានសាធារណៈផ្សេងទៀតប៉ុណ្ណោះ; បើមិនដូច្នោះទេ អាសយដ្ឋានផ្ទាល់របស់ proxy នោះគឺជាអាសយដ្ឋានដែលតម្រងយកមកវាយតម្លៃ។ | ### ពាក្យបញ្ជាសម្រាប់បង្កើត ```bash # បង្កើតតម្លៃសម្ងាត់ទាំងបួនក្នុងពេលតែមួយ៖ 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] > កុំ commit ឯកសារ `.env` ដែលមានតម្លៃសម្ងាត់ពិតប្រាកដទៅក្នុង version control ឱ្យសោះ។ `.gitignore` បានដក `.env` ចេញរួចហើយ ប៉ុន្តែសូមផ្ទៀងផ្ទាត់មុនពេល push។ --- ## 2. ការផ្ទុកទិន្នន័យ និងមូលដ្ឋានទិន្នន័យ OmniRoute ប្រើ **SQLite** (តាមរយៈ `better-sqlite3`) សម្រាប់ការរក្សាទុកទិន្នន័យទាំងអស់។ អថេរទាំងនេះគ្រប់គ្រងទីតាំងទិន្នន័យ ការអ៊ិនគ្រីប និងវដ្តជីវិត។ | អថេរ | លំនាំដើម | ឯកសារប្រភព | សេចក្ដីពិពណ៌នា | | ------------------------------------------ | ----------------------------- | ----------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `DATA_DIR` | `~/.omniroute/` | `src/lib/db/core.ts` | ថតឫសសម្រាប់ SQLite DB ឯកសារបម្រុងទុក និងឯកសារទិន្នន័យ។ កំណត់ជំនួសសម្រាប់ Docker volumes ឬផ្លូវផ្ទាល់ខ្លួន។ | | `OMNIROUTE_ALLOW_DEFAULT_DATA_DIR` | _(មិនបានកំណត់)_ | `src/lib/dataPaths.ts` | ច្រកគេចសម្រាប់របាំងការពារ DATA_DIR នៃការធ្វើតេស្ត/eval (#10428)។ ការធ្វើតេស្ត និង Node eval/print probes (`-e`/`--eval`/`-p`/`--print` រួមទាំងទម្រង់ `--eval=`/`--print=`) ដែលគ្មាន `DATA_DIR` ត្រូវបានបញ្ជូនបន្តទៅថតបណ្ដោះអាសន្នដែលអាចបោះចោលបាន ដើម្បីកុំឱ្យពួកវាបើកមូលដ្ឋានទិន្នន័យពិតប្រាកដរបស់ប្រតិបត្តិករ។ កំណត់ជា `1` ដើម្បីជ្រើសប្រើថតពិតប្រាកដវិញ។ | | `OMNIROUTE_BUILD_SHA` | _(មិនបានកំណត់)_ | `src/lib/monitoring/buildSha.ts` | Git SHA នៃ artifact ដែលកំពុងដំណើរការ។ ត្រូវបានបោះត្រាដោយ `npm run build:release` និងអាចបញ្ចូលបានក្នុង containers ដែលមិនមានសញ្ញាសម្គាល់ `dist/BUILD_SHA`។ ត្រូវបានបង្ហាញជា `system.buildSha` នៅលើ `/api/monitoring/health`។ | | `OMNIROUTE_RELEASE_REF` | `origin/main` | `scripts/build/buildProvenance.ts` | Ref ដែលច្រកត្រួតពិនិត្យប្រភពដើមរបស់ pack-artifact ប្រើដើម្បីផ្ទៀងផ្ទាត់ build SHA (#10427)។ | | `OMNIROUTE_ALLOW_CANARY_BUILD` | _(មិនបានកំណត់)_ | `scripts/build/buildProvenance.ts` | កំណត់ជា `1` ដើម្បីអនុញ្ញាតឱ្យវេចខ្ចប់ build ដែល SHA របស់វាមិនស្ថិតនៅលើខ្សែ release ដោយកត់ត្រាវាជា canary ដែលបានធ្វើដោយចេតនា ជំនួសឱ្យការធ្វើឱ្យច្រកត្រួតពិនិត្យបរាជ័យ (#10427)។ | | `OMNIROUTE_SMOKE_API_KEY` | _(មិនបានកំណត់)_ | `scripts/ops/deploy-canary.mjs` | API key សម្រាប់ smoke probe នៃការដាក់ឱ្យប្រើប្រាស់ canary ដែលត្រូវបានផ្ញើជា `Authorization: Bearer` នៅលើ `/v1/chat/completions`។ ប្រើដោយតែស្គ្រីបដាក់ឱ្យប្រើប្រាស់ប៉ុណ្ណោះ (#10429) មិនដែលប្រើដោយម៉ាស៊ីនមេទេ។ វាមិនទាក់ទងនឹងអថេរ `OMNIROUTE_SMOKE_*` របស់ CLI smoke harness ដែលត្រូវជ្រើសបើកប្រើ (`RUN_CLI_SMOKE=1`, `OMNIROUTE_SMOKE_BASE_URL/MODEL/API_KEY_ENV/TARGETS/TIMEOUT_MS` ក្នុង `tests/integration/upstream-cli-smoke.int.test.ts`) ទេ — សូមមើល [ការរួមបញ្ចូល CLI → ការស្កេន smoke ពិតប្រាកដ](../guides/CLI-INTEGRATIONS.md)។ | | `OMNIROUTE_BUILDING` | _(មិនបានកំណត់)_ | `src/lib/buildPhase.ts` | សញ្ញាដំណាក់កាល build (#10060)៖ ត្រូវបានកំណត់ជា `1` ដោយ `scripts/build/build-next-isolated.mjs` និងទទួលបន្តដោយ build worker ទាំងអស់ដែលបានបង្កើត ដើម្បីឱ្យស្រទាប់ DB ត្រឡប់ no-op stub ជំនួសឱ្យការផ្ទុក native addon របស់ better-sqlite3 (ដែលបញ្ឈប់ worker នៅពេលចាកចេញ)។ មិនត្រូវបានកំណត់សម្រាប់ម៉ាស៊ីនមេដែលកំពុងដំណើរការឡើយ។ | | `OMNIROUTE_SKIP_NATIVE_DEP_CHECK` | `0` | `scripts/check/check-native-deps.mjs` | កំណត់ជា `1` ដើម្បីរំលងការត្រួតពិនិត្យ prebuild ជាជម្រើសសម្រាប់ native dependency នៅក្នុង vendored trees ពិសេសៗ។ វាមិនធ្វើឱ្យ dependency ដែលបាត់អាច build បានទេ។ ប្រើតែនៅពេល native dependencies ត្រូវបានផ្ដល់តាមមធ្យោបាយខាងក្រៅប៉ុណ្ណោះ។ | | `OMNIROUTE_DATA_DIR` | _(មិនបានកំណត់)_ | `open-sse/executors/promptql/threadSticky.ts` | **ឈ្មោះជំនួស fallback** សម្រាប់ `DATA_DIR` ដែលត្រូវបានពិនិត្យតែនៅពេល `DATA_DIR` មិនបានកំណត់ប៉ុណ្ណោះ។ ប្រើដើម្បីកំណត់ទីតាំង thread-sticky session cache នៅលើថាសរបស់ PromptQL executor (`/promptql-thread-sessions.json`)។ ប្រសិនបើអថេរទាំងពីរមិនត្រូវបានកំណត់ cache នឹងស្ថិតតែក្នុងអង្គចងចាំប៉ុណ្ណោះ (មិនត្រូវបានរក្សាទុកឆ្លងកាត់ការចាប់ផ្ដើមឡើងវិញទេ)។ | | `OMNIROUTE_PLUGINS_DIR` | _(មិនបានកំណត់)_ | `src/lib/plugins/scanner.ts` | ថតដែល **runtime plugin scanner** អាន — ហើយក៏ជាថតឫសដែល plugin manager ដំឡើងចូលផងដែរ — ដោយកំណត់ជំនួសលំនាំដើមដែលបានមកពី home (#11827)។ កំណត់វាឱ្យចង្អុលទៅ bind-mounted plugin tree ក្នុង Docker/K8s ជំនួសឱ្យការផ្លាស់ទី HOME គ្រាន់តែដើម្បីប្ដូរទីតាំងផ្លូវស្កេន (HOME គ្រប់គ្រងឥរិយាបថដែលទាក់ទងនឹង home ផ្សេងទៀតទាំងអស់ផងដែរ)។ មិនកំណត់ = `~/.omniroute/plugins` ឬ `/tmp/.omniroute/plugins` នៅពេល process មិនបញ្ចេញ home ទាល់តែសោះ — នេះជាការមិនរកឃើញដោយស្ងៀមស្ងាត់ដែលអថេរនេះដោះស្រាយ។ ថតដែលបានដោះស្រាយត្រូវបានកត់ត្រាមួយដងនៅពេលចាប់ផ្ដើមជា `scanner.dir_resolved` ជាមួយ input ដែលត្រូវបានជ្រើស។ សម្រាប់តែផ្នែកម៉ាស៊ីនមេប៉ុណ្ណោះ៖ CLI command plugins រក្សា `OMNIROUTE_PLUGIN_PATH` ផ្ទាល់ខ្លួន (ផ្នែកទី 9)។ | | `STORAGE_ENCRYPTION_KEY` | _(ទទេ = បិទ)_ | `src/lib/db/encryption.ts` | សោ AES សម្រាប់ការអ៊ិនគ្រីបមូលដ្ឋានទិន្នន័យ SQLite ទាំងមូលនៅពេលរក្សាទុក។ បង្កើតដោយប្រើ `openssl rand -hex 32`។ | | `STORAGE_ENCRYPTION_KEY_VERSION` | `v1` | `scripts/build/bootstrap-env.mjs`, `electron/main.js` | ស្លាកកំណែសម្រាប់សោអ៊ិនគ្រីប។ បង្កើនតម្លៃនេះនៅពេលបង្វិលសោ ដើម្បីគាំទ្រការឌិគ្រីបទិន្នន័យបម្រុងទុកចាស់ៗ។ | | `DISABLE_SQLITE_AUTO_BACKUP` | `false` | `src/lib/db/backup.ts` | នៅពេលជា `true` វារំលងការបម្រុងទុកឯកសារ SQLite ជាប្រចាំ/មុនពេលសរសេរ (ការរក្សាទុក/សម្អាតតម្លៃ models.dev និងការសរសេរការកំណត់)។ ការបម្រុងទុកដោយដៃ និងមុនពេលស្ដារឡើងវិញ នៅតែដំណើរការ។ វា **មិន** បិទ snapshot សុវត្ថិភាពអចិន្ត្រៃយ៍ចាំបាច់របស់កម្មវិធីដំណើរការ migration ឬរបាំងការពារ mass-migration សម្រាប់ DB អចិន្ត្រៃយ៍ដែលមានស្រាប់ទេ។ ការបម្រុងទុកដែលមិនមែនធ្វើដោយដៃ ត្រូវបានកម្រិតឱ្យកើតឡើងច្រើនបំផុតម្តងក្នុងរយៈពេល 60 នាទី។ **Settings → Storage** ក្នុង Dashboard អាចបិទការបម្រុងទុកស្វ័យប្រវត្តិជាប្រចាំដោយឯករាជ្យ។ | | `OMNIROUTE_CRYPT_KEY` | _(មិនបានកំណត់)_ | `src/lib/db/encryption.ts` | **ឈ្មោះក្លែងក្លាយចាស់** សម្រាប់ `STORAGE_ENCRYPTION_KEY`។ ត្រូវបានទទួលយកជាតម្លៃជំនួស នៅពេលអថេរចម្បងមិនមាន។ | | `OMNIROUTE_API_KEY_BASE64` | _(មិនបានកំណត់)_ | `src/lib/db/encryption.ts` | **ឈ្មោះក្លែងក្លាយចាស់** (ទម្រង់ដែលបានអ៊ិនកូដជា Base64) ដែលត្រូវបានទទួលយកជាតម្លៃជំនួស។ វាត្រូវបានឌីកូដដោយស្វ័យប្រវត្តិមុនពេលប្រើ។ | | `OMNIROUTE_DB_HEALTHCHECK_INTERVAL_MS` | _(មិនបានកំណត់)_ | `src/lib/db/core.ts` | កំណត់ជំនួសចន្លោះពេលពិនិត្យសុខភាព SQLite តាមកាលកំណត់ (ms)។ នៅពេលមិនបានកំណត់ តម្លៃលំនាំដើមត្រូវបានកំណត់ដោយផ្អែកលើ `NODE_ENV`។ | | `OMNIROUTE_WAL_TRUNCATE_INTERVAL_MS` | _(បានដកចេញ)_ | `src/lib/db/walMaintenance.ts` | **បានដកចេញ។** ការដំណើរការ `wal_checkpoint(TRUNCATE)` ជាប្រចាំលើប្រព័ន្ធដែលកំពុងដំណើរការ អាចធ្វើឱ្យការផ្គូផ្គង wal-index ដែលប្រើរួមគ្នាលែងមានសុពលភាព និងធ្វើឱ្យដំណើរការគាំងដោយ SIGBUS (#13973) ដូច្នេះកម្មវិធីកំណត់ពេលនេះលែងមានទៀតហើយ។ អថេរនេះមិនមានប្រសិទ្ធភាពទេ៖ តម្លៃវិជ្ជមាននឹងកត់ត្រាការព្រមានអំពីការឈប់គាំទ្រម្តង ខណៈដែលតម្លៃ `0` ឬមិនបានកំណត់នឹងមិនបង្ហាញអ្វីឡើយ។ WAL ត្រូវបានថែទាំដោយ checkpoint ប្រភេទ PASSIVE (ខាងក្រោម) និងត្រូវបានកាត់តម្រឹមដោយ checkpoint នៅពេលបិទប្រព័ន្ធ។ | | `OMNIROUTE_WAL_PASSIVE_INTERVAL_MS` | `300000` (5m) | `src/lib/db/walMaintenance.ts` | កំណត់ជំនួសចន្លោះពេលញឹកញាប់របស់ `wal_checkpoint(PASSIVE)` (ms)។ វារក្សា WAL frame ដែលកំពុងរង់ចាំឱ្យមានចំនួនតិច ដើម្បីឱ្យ checkpoint នៅតែលឿន និងទំហំឯកសារ WAL នៅមានកម្រិតនៅចន្លោះការកាត់តម្រឹមពេលបិទប្រព័ន្ធ។ `0` បិទមុខងារនេះ។ | | `OMNIROUTE_WAL_GUARD_MAX_MB` | `256` | `src/lib/db/walMaintenance.ts` | នៅពេលវដ្ត PASSIVE រកឃើញថាឯកសារ WAL លើសទំហំនេះ វានឹងដំណើរការ `wal_checkpoint(RESTART)` ដើម្បីឱ្យ WAL ចាប់ផ្ដើមឡើងវិញដោយមិនសរសេរ wal-index ដែលបានផ្គូផ្គងឡើងវិញ។ checkpoint បែប truncate លើប្រព័ន្ធដែលកំពុងដំណើរការត្រូវបានដកចេញ (សូមមើលជួរដេក `OMNIROUTE_WAL_TRUNCATE_INTERVAL_MS`)។ | | `OMNIROUTE_PRESSURE_SELF_RESTART` | `false` | `open-sse/utils/resourcePressure.ts` | កំណត់ជា `1`/`true`/`yes`/`on` ដើម្បីបិទដំណើរការ បន្ទាប់ពីសម្ពាធធនធានកម្រិតធ្ងន់ធ្ងរបន្តអស់រយៈពេល `OMNIROUTE_PRESSURE_SELF_RESTART_AFTER_MS` ដោយអនុញ្ញាតឱ្យកម្មវិធីគ្រប់គ្រង (systemd `Restart=always`, គោលការណ៍ចាប់ផ្ដើមឡើងវិញរបស់ Docker) នាំយកដំណើរការថ្មីស្អាតមួយមកវិញ ជំនួសឱ្យការបន្តឆ្លើយតប 503 ដោយគ្មានកំណត់។ | | `OMNIROUTE_PRESSURE_SELF_RESTART_AFTER_MS` | `120000` (2m) | `open-sse/utils/resourcePressure.ts` | រយៈពេលដែលសម្ពាធកម្រិតធ្ងន់ធ្ងរត្រូវបន្តមាន មុនពេលការបិទដើម្បីចាប់ផ្ដើមឡើងវិញដោយខ្លួនឯងត្រូវបានអនុវត្ត។ | | `OMNIROUTE_PRESSURE_PSI_DISABLED` | `false` | `open-sse/utils/resourcePressurePolicy.ts` | កំណត់ជា `1`/`true`/`yes`/`on` ដើម្បីមិនអើពើ `/proc/pressure/memory` ទូទាំង host (`psi_some` / `psi_full`) នៅពេល neighbor ដែលបង្កសំឡេងរំខានធ្វើឱ្យមានការឆ្លើយតប 503 ខណៈដែលដំណើរការនេះមិនមានបញ្ហា (#13124)។ របាំងការពារ cgroup និង V8 heap នៅតែបើក។ PSI ក៏ឈប់ត្រូវបានរាប់ជាភស្តុតាងនៃការកម្រិតដោយ kernel សម្រាប់ `cgroup_high` ផងដែរ៖ ដូច្នេះ ផលសរុប cgroup ដែលលើស `memory.high` នឹងប្រែជាធ្ងន់ធ្ងរតែនៅពេលតម្លៃ `high`/`max` ក្នុង `memory.events` កើនឡើងប៉ុណ្ណោះ។ ប្រសិនបើគ្មាន `memory.events` សមាមាត្រដើមត្រូវបានរក្សាទុក។ | | `OMNIROUTE_SQLJS_WASM_PATH` | _(រកឃើញដោយស្វ័យប្រវត្តិ)_ | `src/lib/db/adapters/sqljsAdapter.ts` | ផ្លូវជាក់លាក់ (ដាច់ខាត ឬធៀបទៅនឹង cwd) ទៅកាន់ `sql-wasm.wasm` នៅពេលប្រើអាដាប់ទ័រជំនួស WASM របស់ `sql.js`។ នៅពេលមិនបានកំណត់ វាត្រូវបានរកឃើញដោយស្វ័យប្រវត្តិតាមរយៈ dependency របស់ package និងប្លង់ដែលអាចប្រើបាន។ | | `OMNIROUTE_BATCH_RETENTION_DAYS` | `30` | `src/lib/db/cleanup.ts` | ចំនួនថ្ងៃដែល checkpoint របស់កិច្ចការ Batch API ដែលបានបញ្ចប់ស្ថានភាព (បានបញ្ចប់/បរាជ័យ/បានបោះបង់/ផុតកំណត់) ឯកសារ input/output/error ដែលបានយោង និងជួរដេករបស់វា ត្រូវបានរក្សាទុកដោយការសម្អាតស្វ័យប្រវត្តិ មុនពេលលុប។ វាមានប្រសិទ្ធភាពតែនៅពេល `BATCH_AND_FILE_AUTO_CLEANUP_ENABLED` ត្រូវបានបើកប៉ុណ្ណោះ ហើយស្របនឹងរយៈពេលរក្សាទុក output របស់ Batch API ផ្ទាល់របស់ OpenAI។ វាមិនប៉ះពាល់ដល់ route `DELETE /api/v1/batches/delete-completed` ដែលដំណើរការដោយប្រតិបត្តិករទេ ព្រោះ route នោះនៅតែដំណើរការដោយគ្មានលក្ខខណ្ឌ (គ្មានតម្រងតាមអាយុ) តាមការរចនា។ | | `BATCH_AND_FILE_AUTO_CLEANUP_ENABLED` | `false` | `src/lib/db/cleanup.ts` | នៅពេលកំណត់ជា `true` អនុញ្ញាតឱ្យដំណើរការសម្អាតដោយស្វ័យប្រវត្តិលុបកិច្ចការ Batch API ដែលបានបញ្ចប់ (រួមទាំងចំណុចត្រួតពិនិត្យរបស់វា) ដែលហួសរយៈពេល `OMNIROUTE_BATCH_RETENTION_DAYS` ហើយសម្អាតមាតិកា BLOB នៃឯកសារដែលបានផ្ទុកឡើង និងហួសពេល `expires_at` របស់វា។ តាមលំនាំដើម វាត្រូវបានបិទ៖ រាល់ការដំឡើងដែលមានស្រាប់នឹងរក្សាទិន្នន័យនេះដូចមុនដដែល រហូតដល់អ្នកប្រតិបត្តិជ្រើសរើសបើកវា។ វាក៏ជាទង់មុខងារដែលអាចកែសម្រួលតាមផ្ទាំងគ្រប់គ្រងផងដែរ — សូមមើល `docs/reference/FEATURE_FLAGS.md` → ពេលដំណើរការ។ | | `OMNIROUTE_SKIP_DB_HEALTHCHECK` | `0` | `src/lib/db/core.ts`, `src/lib/db/healthCheck.ts` | កំណត់ជា `1` ដើម្បីរំលងការត្រួតពិនិត្យសុខភាព DB ទាំងស្រុងនៅពេលចាប់ផ្ដើម។ មានប្រយោជន៍សម្រាប់កិច្ចការដែលមានអាយុកាលខ្លី និងការធ្វើតេស្តរួមបញ្ចូល។ | | `OMNIROUTE_FORCE_DB_HEALTHCHECK` | `0` | `src/lib/db/core.ts` | កំណត់ជា `1` ដើម្បីបង្ខំឱ្យបើករង្វិលជុំត្រួតពិនិត្យសុខភាព DB ទោះបីជាជាធម្មតាវាត្រូវបានរំលងក៏ដោយ (ឧ. កិច្ចការដែលមានអាយុកាលខ្លី)។ | | `OMNIROUTE_SKIP_POSTINSTALL` | `0` | `scripts/postinstall.mjs` | កំណត់ជា `1` ដើម្បីរំលងការរៀបចំបឋមសម្រាប់ runtime ដើមក្នុងអំឡុងពេល `npm install`។ មានប្រយោជន៍សម្រាប់ការដំឡើង CI/headless ដែល sqlite ត្រូវបាន build រួចហើយ។ | | `OMNIROUTE_MIGRATIONS_DIR` | _(រកឃើញដោយស្វ័យប្រវត្តិ)_ | `src/lib/db/migrationRunner.ts` | កំណត់ជំនួសថតដែលកម្មវិធីដំណើរការ migration ស្កេន។ មានប្រយោជន៍នៅពេលចែកចាយ migration ដែលបានចងបញ្ចូលក្នុង build ផ្ទាល់ខ្លួន។ | | `OMNIROUTE_EXTRA_MIGRATIONS_DIRS` | _(មិនបានកំណត់)_ | `src/lib/db/migrationRunner/extraDirs.ts` | ថត migration បន្ថែមជា entry ទម្រង់ `namespace=dir` ដែលបំបែកដោយសញ្ញាបំបែក path របស់ platform (ឧ. `ee=/opt/app/enterprise/db/migrations`)។ ឯកសារដែលរកឃើញនៅទីនោះត្រូវបានកត់ត្រាជា `-` ដូច្នេះការចែកចាយដែលភ្ជាប់មកជាមួយ migration ផ្ទាល់ខ្លួននឹងមិនប៉ះទង្គិចជាមួយ slot លេខរបស់ upstream ឡើយ។ entry ដែលមានទ្រង់ទ្រាយមិនត្រឹមត្រូវ namespace មិនត្រឹមត្រូវ ឬថតដែលបាត់ នឹងបង្កកំហុសនៅពេលចាប់ផ្ដើម ជំនួសឱ្យការរំលង schema ដោយស្ងៀមស្ងាត់។ | | `OMNIROUTE_MAX_PENDING_MIGRATIONS` | `50` | `src/lib/db/migrationRunner.ts` | កម្រិតសុវត្ថិភាពសម្រាប់ migration ដែលកំពុងរង់ចាំច្រើន (#3416)។ ការចាប់ផ្ដើមនឹងបញ្ឈប់ ប្រសិនបើមាន migration កំពុងរង់ចាំច្រើនជាងចំនួននេះនៅលើ DB ដែលមានស្រាប់ (ដើម្បីការពារករណីតារាងតាមដានត្រូវបានលុបសម្អាត)។ បង្កើនតម្លៃនេះដើម្បីស្ដារ backup ចាស់ ឬកំណត់ជា `0` ដើម្បីបិទការត្រួតពិនិត្យ។ | | `OMNIROUTE_INSTALL_UPGRADE_WORKDIR` | _(`/.install-upgrade`)_ | `scripts/check/check-install-upgrade.mjs` | ថតធ្វើការសម្រាប់ច្រកត្រួតពិនិត្យ release `check:install-upgrade`។ វាត្រូវការទំហំប្រហែល 12 GB (មែកធាងដំឡើងពីរដែលនីមួយៗមានទំហំប្រហែល 3 GB បូកនឹង tarball) ដូច្នេះវាមិនត្រូវដំណើរការលើ tmpfs តូចឡើយ — នៅលើ runner ដែលបង្ហោះដោយខ្លួនឯង `/tmp` គឺជា tmpfs ទំហំ 12 GB ដែលគាំទ្រដោយ RAM ហើយច្រកត្រួតពិនិត្យបានប្រើវាអស់ ដែលធ្វើឱ្យ package ត្រូវបានកាត់ខ្លី។ | | `OMNIROUTE_SPEND_FLUSH_INTERVAL_MS` | _(លំនាំដើមនៅក្នុងកូដ)_ | `src/lib/spend/batchWriter.ts` | ចន្លោះពេល flush (ms) សម្រាប់កម្មវិធីសរសេរចំណាយ/ថ្លៃដើមជាបាច់។ តម្លៃទាបកាត់បន្ថយការរួមបញ្ចូលប្រតិបត្តិការសរសេរ ចំណែកតម្លៃខ្ពស់កាត់បន្ថយការប្រជែងប្រើ DB។ | | `OMNIROUTE_SPEND_MAX_BUFFER_SIZE` | _(លំនាំដើមនៅក្នុងកូដ)_ | `src/lib/spend/batchWriter.ts` | ចំនួនអតិបរមានៃ entry ចំណាយដែលបានរក្សាទុកក្នុង buffer មុនពេលត្រូវបង្ខំឱ្យ flush។ បង្កើនតម្លៃសម្រាប់ការដាក់ឱ្យដំណើរការដែលមាន QPS ខ្ពស់ ហើយបន្ថយវានៅពេលអង្គចងចាំមានដែនកំណត់សំខាន់ជាង។ | | `OMNIROUTE_PROXY_FETCH_DEBUG` | _(មិនបានកំណត់)_ | `open-sse/utils/proxyFetch.ts` | កំណត់ជា `"true"` ដើម្បីបញ្ចេញ log បំបាត់កំហុស `[ProxyFetch]` នៅលើផ្លូវ relay របស់ Vercel។ តាមលំនាំដើម វាត្រូវបានបិទ ដើម្បីជៀសវាងការលេចធ្លាយតម្រុយ routing។ | | `OMNIROUTE_PROXY_CORE_BINARY_PATH` | _(មិនបានកំណត់)_ | `src/lib/proxySubscription/coreConfig/sync.ts` | path ដាច់ខាតរបស់ binary proxy core មូលដ្ឋាន (ឯកសារមួយឈ្មោះ `sing-box`) ដែលត្រួតពិនិត្យការកំណត់រចនាសម្ព័ន្ធ core ដែលបានបង្កើត មុនពេលវាជំនួសឯកសារដែលកំពុងប្រើ។ ប្រសិនបើមិនបានកំណត់ វានឹងសរសេរ `.generated` នៅក្បែរឯកសារដែលកំពុងប្រើប៉ុណ្ណោះ។ សម្រាប់តែបរិស្ថាន host៖ មិនត្រូវបានរក្សាទុកក្នុងមូលដ្ឋានទិន្នន័យ ឬទទួលយកតាម management API ឡើយ ព្រោះ binary នេះត្រូវបានប្រតិបត្តិ។ | | `OMNIROUTE_PROXY_CORE_RELOAD_COMMAND` | _(មិនបានកំណត់)_ | `src/lib/proxySubscription/coreConfig/reload.ts` | របៀបដែល proxy core មូលដ្ឋាន reload បន្ទាប់ពីការជំនួស config ដែលបានផ្ទៀងផ្ទាត់៖ អារេ argument JSON ដែលដំណើរការដោយគ្មាន shell ឬពាក្យ `external` យ៉ាងជាក់លាក់ នៅពេលអ្នកសង្កេតការណ៍ខាងក្រៅអនុវត្តឯកសារនោះ។ វាមិនត្រូវបានរក្សាទុកក្នុងមូលដ្ឋានទិន្នន័យ ឬបង្ហាញតាម API ឡើយ។ | | `PROXY_LOG_INCLUDE_IPS` | `false` | `src/lib/proxyLogger.ts` | កំណត់ជា `"true"` ឬ `"1"` ដើម្បីរួមបញ្ចូល IP របស់ client/egress និងបុព្វបទគណនីក្នុងបន្ទាត់ process-log លម្អិត `[ProxyEgress]`។ តាមលំនាំដើម វាត្រូវបានបិទ ដើម្បីឱ្យ process log មិនលេចធ្លាយ IP ឬបុព្វបទគណនី។ | | `OMNIROUTE_DEBUG` | _(មិនបានកំណត់)_ | `bin/cli/commands/quota.mjs` | កំណត់ជា `1` ដើម្បីបង្ហាញព័ត៌មានវិនិច្ឆ័យរយៈពេលនៃសំណើនីមួយៗ (`[omniroute] GET completed in Nms`) ពីពាក្យបញ្ជាកូតារបស់ CLI ទៅកាន់ stderr។ | | `OMNIROUTE_HEALTHCHECK_PATH` | _(ស្វ័យប្រវត្តិ)_ | `scripts/dev/healthcheck.mjs` | ផ្លូវជាក់លាក់ដែលត្រូវបានស្ទង់ដោយការត្រួតពិនិត្យសុខភាពរបស់កុងតឺន័រ។ នៅពេលមិនបានកំណត់ ការស្ទង់នឹងកំណត់វាដោយផ្អែកលើ `OMNIROUTE_BASE_PATH`; ការកំណត់វានឹងជ្រើសប្រើ endpoint ត្រួតពិនិត្យស៊ីជម្រៅឡើងវិញ។ | | `OMNIROUTE_DEBUG_COMPLETION` | _(មិនបានកំណត់)_ | `bin/cli/commands/completion.mjs` | កំណត់ជាតម្លៃមិនទទេណាមួយ ដើម្បីបញ្ចេញព័ត៌មានវិនិច្ឆ័យ `[omniroute completion]` ពីផ្លូវ cache នៃការបំពេញដោយស្វ័យប្រវត្តិរបស់ shell សម្រាប់ CLI (អាន/ផ្ទុកឡើងវិញ/សរសេរ)។ បិទតាមលំនាំដើម — cache ទាំងនោះបរាជ័យដោយស្ងៀមស្ងាត់ ដូច្នេះ cache ដែលបាត់ ឬខូច មិនធ្វើឱ្យការបំពេញដោយចុច tab ខូចឡើយ។ | | `BATCH_RETRY_DURATION_MS` | `86400000` (24 ម៉ោង) | `open-sse/services/batchProcessor.ts` | ចន្លោះពេលអតិបរមាសម្រាប់ការព្យាយាមធាតុនីមួយៗក្នុង batch ឡើងវិញ (ms)។ ធាតុដែលលើសរយៈពេលនេះនឹងត្រូវបានសម្គាល់ថាបរាជ័យ។ | | `BATCH_BACKOFF_BASE_MS` | `5000` | `open-sse/services/batchProcessor.ts` | រយៈពេលពន្យារមូលដ្ឋាន (ms) សម្រាប់ការបង្កើនចន្លោះពេលព្យាយាមឡើងវិញតាមអិចស្ប៉ូណង់ស្យែលលើធាតុក្នុង batch។ | | `BATCH_BACKOFF_MAX_MS` | `3600000` (1 ម៉ោង) | `open-sse/services/batchProcessor.ts` | កម្រិតអតិបរមា (ms) សម្រាប់ការបង្កើនចន្លោះពេលតាមអិចស្ប៉ូណង់ស្យែលរវាងការព្យាយាមធាតុក្នុង batch ឡើងវិញ។ | | `BATCH_MAX_CONCURRENT` | `1` | `open-sse/services/batchProcessor.ts` | ចំនួនអតិបរមានៃ batch ដែលដំណើរការក្នុងពេលដំណាលគ្នា។ បង្កើនដើម្បីបង្កើនលំហូរការងារ; រក្សាឱ្យទាបដើម្បីជៀសវាងការស្នើសុំច្រើនលើសកម្រិតក្នុងពេលតែមួយ។ | > [!IMPORTANT] > មុនពេលផ្លាស់ប្តូរមូលដ្ឋានទិន្នន័យអចិន្ត្រៃយ៍ដែលមានស្រាប់ កម្មវិធីដំណើរការ migration នឹងបោះពុម្ពផ្សាយ snapshot ពេញលេញ > ដែលកំណត់អត្តសញ្ញាណតាមខ្លឹមសារ នៅក្រោម `DATA_DIR/db_backups/`។ ការបោះពុម្ពផ្សាយតម្រូវឱ្យមានប្រព័ន្ធឯកសារ > ដែលគាំទ្រ hard link មិនសរសេរជាន់លើ នៅក្នុងប្រព័ន្ធឯកសារតែមួយ ព្រមទាំងការធ្វើសមកាលកម្មឯកសារបែបធន់។ ម៉ាស៊ីន POSIX ក៏ > តម្រូវឱ្យធ្វើសមកាលកម្មថតផងដែរ; នៅលើ Windows, Node អាចបដិសេធ handle របស់ថត ដូច្នេះ OmniRoute នឹង flush > ឯកសារដែលបានបោះពុម្ពផ្សាយ ហើយចាត់ទុកការធ្វើសមកាលកម្មធាតុថតជាការខិតខំអស់ពីលទ្ធភាព។ > ប្រសិនបើ `DATA_DIR` ដែលបាន mount មិនអាចផ្តល់ការធានាទាំងនោះបានទេ ការចាប់ផ្តើមនឹងបរាជ័យដោយសុវត្ថិភាព មុនពេលអនុវត្ត > migration។ ផ្លាស់ទី `DATA_DIR` ទៅ volume ដែលមានសមត្ថភាពទាំងនោះ; កុំប្រើ > `DISABLE_SQLITE_AUTO_BACKUP` ដើម្បីរំលងសុវត្ថិភាព migration។ ### សេណារីយ៉ូ | សេណារីយ៉ូ | ការកំណត់រចនាសម្ព័ន្ធ | | ----------------------------- | -------------------------------------------------------------------------------------------------- | | **ការអភិវឌ្ឍក្នុងមូលដ្ឋាន** | រក្សាតម្លៃលំនាំដើមទាំងអស់។ DB ស្ថិតនៅ `~/.omniroute/omniroute.db`។ | | **Docker** | `DATA_DIR=/data` + mount volume មួយនៅ `/data`។ | | **បានអ៊ិនគ្រីបនៅពេលរក្សាទុក** | កំណត់ `STORAGE_ENCRYPTION_KEY` + រក្សាទុកច្បាប់ចម្លងបម្រុងនៃសោ! ការបាត់បង់សោ = ការបាត់បង់ទិន្នន័យ។ | | **CI/ការធ្វើតេស្ត** | `DATA_DIR=/tmp/omniroute-test` — បណ្តោះអាសន្ន មិនត្រូវការការអ៊ិនគ្រីបទេ។ | --- ## 3. បណ្ដាញ និងច្រក | អថេរ | តម្លៃលំនាំដើម | ឯកសារប្រភព | សេចក្ដីពិពណ៌នា | | ------------------------------------------- | ------------------------------------------- | ------------------------------------------------------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `PORT` | `20128` | `src/lib/runtime/ports.ts` | ច្រកចម្បងសម្រាប់ទាំង Dashboard UI និង API endpoints (របៀបច្រកតែមួយ)។ | | `OMNIROUTE_BASE_PATH` | _(ទទេ = root)_ | `next.config.mjs`, `scripts/docker/ensure-docker-base-path.mjs` | ផ្លូវរង URL សម្រាប់បម្រើ OmniRoute នៅពីក្រោយ reverse proxy (កំណត់ `basePath` របស់ Next.js ហើយការបញ្ជូនបន្តសម្រាប់ការផ្ទៀងផ្ទាត់អត្តសញ្ញាណគិតគូរពី basePath)។ ឧ. `/omniroute`។ នៅក្នុង Docker តម្លៃនេះត្រូវបានបញ្ចូលអចិន្ត្រៃយ៍អំឡុងពេល `docker build` (`ARG OMNIROUTE_BASE_PATH`)។ image root ដែលបាន build ជាមុនអាចអនុវត្តតម្លៃ runtime ផ្សេងមួយម្ដង នៅពេល container ចាប់ផ្ដើម មុនពេល Next.js ដំណើរការ។ កំណត់ `NEXT_PUBLIC_BASE_URL` ទៅជា origin សាធារណៈដែលរួមបញ្ចូលផ្លូវរងដូចគ្នា។ | | `NEXT_PUBLIC_OMNIROUTE_BASE_PATH` | _(ទទេ = root)_ | `src/shared/hooks/useDisplayBaseUrl.ts` | តម្លៃឆ្លុះដែលអាចមើលឃើញក្នុង browser របស់ `OMNIROUTE_BASE_PATH` ដែលត្រូវបានបញ្ចូលក្នុងកូដនៅពេល build ដើម្បីឱ្យការបង្ហាញ endpoint លើ dashboard បង្ហាញ `https://host/omniroute/v1` ជំនួសឱ្យ `https://host/v1`។ ប្រើ `OMNIROUTE_BASE_PATH` ជាតម្លៃជំនួសនៅពេលមិនបានកំណត់។ ត្រូវ build ឡើងវិញបន្ទាប់ពីផ្លាស់ប្ដូរ (`basePath` របស់ Next ត្រូវបានកំណត់នៅពេល build)។ | | `DASHBOARD_ALLOW_EMBED` | _(មិនបានកំណត់ = មិនអាចដាក់ក្នុង frame បាន)_ | `next.config.mjs`, `scripts/build/dashboardEmbed.mjs` | អនុញ្ញាតដោយជ្រើសរើសសម្រាប់ការបង្កប់ទំព័រ HTML ក្នុង iframe។ នៅពេលមិនបានកំណត់ route នីមួយៗនឹងផ្ដល់ `frame-ancestors 'none'` + `X-Frame-Options: DENY`។ កំណត់ជា `vscode` ដើម្បីបម្រើទំព័រទាំងនោះ (dashboard, login, docs, landing) ជាមួយ `frame-ancestors 'self' vscode-webview:` និងដោយគ្មាន `X-Frame-Options` ដើម្បីឱ្យ VS Code Simple Browser អាចបង្ហាញពួកវាបាន (របៀប `dashboardOpen: "editor"` របស់ OmniCopilot)។ ផ្ទៃ API (`/api`, `/v1`, `/v1beta`, `/a2a`, `/healthz`, alias កម្រិត root) នៅតែរក្សា header តឹងរ៉ឹង ទោះបីកំណត់បែបណាក៏ដោយ។ មានតែ `vscode` ប៉ុណ្ណោះដែលត្រូវបានទទួលស្គាល់ — `1`/`true` មិនបើកមុខងារនេះទេ។ កំណត់នៅពេល build៖ ត្រូវ build ឡើងវិញបន្ទាប់ពីផ្លាស់ប្ដូរ (`docker build --build-arg DASHBOARD_ALLOW_EMBED=vscode` សម្រាប់ image; ការកំណត់វាលើការដំឡើងដែលបាន build ជាមុនមិនមានប្រសិទ្ធភាពទេ)។ | | `API_PORT` | _(មិនបានកំណត់)_ | `src/lib/runtime/ports.ts` | នៅពេលកំណត់ វាបម្រើ proxy API `/v1/*` លើច្រកដាច់ដោយឡែកនេះ។ | | `API_HOST` | `0.0.0.0` | `src/lib/runtime/ports.ts` | អាសយដ្ឋានសម្រាប់ bind ច្រក API។ | | `DASHBOARD_PORT` | _(មិនបានកំណត់)_ | `src/lib/runtime/ports.ts` | នៅពេលកំណត់ វាបម្រើ Dashboard UI លើច្រកដាច់ដោយឡែកនេះ។ | | `OMNI_MAX_CONCURRENT_CONNECTIONS` | `0` _(បានបិទ)_ | `src/sse/utils/backpressure.ts` | កំណត់ចំនួនអតិបរមានៃការតភ្ជាប់ chat ដែលកំពុងដំណើរការក្នុងពេលដំណាលគ្នា។ សំណើលើសកម្រិតកំណត់នឹងទទួលបាន `503` ជាមួយ `Retry-After`។ ចំនួនគត់វិជ្ជមាននឹងបើកការការពារនេះ ខណៈដែលការមិនកំណត់ ឬ `0` នឹងបិទវា។ | | `OMNIROUTE_INSTANCE_ID` | _(មិនបានកំណត់)_ | `src/shared/resilience/peerRouting.ts` | ID មានស្ថិរភាព និងមានតែមួយគត់សម្រាប់ gateway នេះ នៅពេលភ្ជាប់ OmniRoute instances ជាខ្សែសង្វាក់។ វាបើកការត្រួតពិនិត្យ peer-loop ចូល។ តួអក្សរដែលអនុញ្ញាត៖ អក្សរ លេខ `.`, `_`, `:` និង `-` ហើយមានប្រវែងអតិបរមា 64 តួអក្សរ។ | | `OMNIROUTE_PEER_URLS` | _(មិនបានកំណត់)_ | `src/shared/resilience/peerRouting.ts`, `open-sse/executors/base.ts` | URL មូលដ្ឋានរបស់ OmniRoute ដែលបំបែកដោយសញ្ញាក្បៀស ហើយអាចទទួល `X-OmniRoute-Peer-Trace`។ មានតែ URL ខ្សែខាងលើដែលបានដាក់ក្នុងបញ្ជីអនុញ្ញាតយ៉ាងជាក់លាក់ប៉ុណ្ណោះដែលទទួលបានទិន្នន័យមេតារបស់ peer; អ្នកផ្តល់សេវាផ្សេងទៀតទាំងអស់មិនត្រូវបានប៉ះពាល់ទេ។ | | `OMNIROUTE_PEER_MAX_HOPS` | `4` | `src/shared/resilience/peerRouting.ts` | ចំនួនអតិបរមានៃ instance របស់ OmniRoute ដែលបានចូលមើលពីមុន និងត្រូវបានទទួលយកលើសំណើជាបន្តបន្ទាប់ (`1`-`32`)។ instance ដែលកើតឡើងម្តងទៀត ឬថវិកាដែលបានប្រើអស់ នឹងត្រឡប់ HTTP `508 Loop Detected`។ | | `PROD_DASHBOARD_PORT` | `20130` | `docker-compose.prod.yml` | port ដែលបានផ្សព្វផ្សាយនៅផ្នែក host សម្រាប់ Dashboard ក្នុងរបៀប production របស់ Docker។ | | `PROD_API_PORT` | `20131` | `docker-compose.prod.yml` | port ដែលបានផ្សព្វផ្សាយនៅផ្នែក host សម្រាប់ API ក្នុងរបៀប production របស់ Docker។ | | `OMNIROUTE_PORT` | _(មិនបានកំណត់)_ | `src/lib/runtime/ports.ts` | មានអាទិភាពលើ `PORT` នៅពេលដំណើរការនៅក្នុង Electron ឬ wrapper ផ្សេងទៀត។ | | `LIVE_WS_PORT` | `20129` | `src/server/ws/liveServer.ts` | port សម្រាប់ម៉ាស៊ីនបម្រើត្រួតពិនិត្យផ្ទាល់តាម WebSocket ក្នុងពេលជាក់ស្តែង។ | | `LIVE_WS_HOST` | `127.0.0.1` | `src/server/ws/liveServer.ts` | អាសយដ្ឋាន bind សម្រាប់ម៉ាស៊ីនបម្រើ WebSocket ផ្ទាល់។ កំណត់ជា `0.0.0.0` ដើម្បីបើកឱ្យចូលប្រើលើ LAN (ត្រូវកំណត់រចនាសម្ព័ន្ធ `LIVE_WS_ALLOWED_ORIGINS` ផងដែរ)។ | | `LIVE_WS_ALLOWED_ORIGINS` | _(មិនបានកំណត់)_ | `src/server/ws/liveServer.ts` | origin បន្ថែមដែលបំបែកដោយសញ្ញាក្បៀស និងត្រូវបានអនុញ្ញាតឱ្យបើក WebSocket ផ្ទាល់។ origin របស់ dashboard លើ loopback ត្រូវបានអនុញ្ញាតតាមលំនាំដើមរួចហើយ។ | | `LIVE_WS_ALLOWED_HOSTS` | _(មិនបានកំណត់)_ | `src/server/ws/liveServerAllowList.ts` | hostname បន្ថែមដែលបំបែកដោយសញ្ញាក្បៀស និងត្រូវបានអនុញ្ញាតសម្រាប់ origin របស់ WebSocket ផ្ទាល់។ មិនដូច `LIVE_WS_ALLOWED_ORIGINS` (URL origin ពេញលេញ) ទេ វាផ្គូផ្គងតែផ្នែក host ប៉ុណ្ណោះ — មានប្រយោជន៍សម្រាប់ការរៀបចំ LAN/Tailscale។ | | `NEXT_PUBLIC_LIVE_WS_PUBLIC_URL` | _(មិនបានកំណត់)_ | `src/hooks/useLiveDashboard.ts` | URL សាធារណៈសម្រាប់ WebSocket របស់ dashboard ផ្ទាល់ (ផ្នែក browser)។ កំណត់វានៅពេលដាក់ reverse proxy ឬ Cloudflare Tunnel នៅពីមុខម៉ាស៊ីនបម្រើ WS (ឧ. `wss://ws.my-ai.com/live-ws`); browser នឹងភ្ជាប់ទៅទីនោះជំនួសឱ្យ `ws://hostname:20132`។ ផ្នែក pathname ក៏ត្រូវបានប្រើជាផ្លូវ upgrade របស់ WebSocket ផងដែរ (លំនាំដើម៖ `/live-ws`)។ | | `OMNIROUTE_ENABLE_LIVE_WS` | `true` | `src/server/ws/liveServer.ts` និង `scripts/start-ws-server.mjs` | កំណត់ជា `0` ឬ `false` ដើម្បីបិទម៉ាស៊ីនបម្រើ WebSocket ក្នុងពេលជាក់ស្តែង (បានបើកតាមលំនាំដើម និង bind ទៅ loopback)។ ជម្រើសបិទបើកសម្រាប់ CI/harness ដែលបិទស្គ្រីបជំនួយ WebSocket ផ្ទាល់បែប standalone។ | | `RELAY_IP_PER_MINUTE` | `30` | `src/app/api/v1/relay/chat/completions/route.ts` | ដែនកំណត់អត្រា relay ក្នុងមួយ (token, IP) គិតជាសំណើ/នាទី។ រក្សាទុកក្នុងអង្គចងចាំ និងអនុវត្តក្នុងមួយ instance។ `0` ឬតម្លៃអវិជ្ជមាននឹងបិទច្រកកំណត់តាមវិមាត្រ IP (ដែនកំណត់ DB ក្នុងមួយ token នៅតែអនុវត្ត)។ | | `NODE_ENV` | `production` | Next.js core | គ្រប់គ្រងកម្រិតលម្អិតនៃការកត់ត្រា ការរក្សាទុកក្នុងឃ្លាំងសម្ងាត់ ការបង្ហាញព័ត៌មានលម្អិតអំពីកំហុស និងការបង្កើនប្រសិទ្ធភាពរបស់ Next.js។ | | `OMNIROUTE_USE_TURBOPACK` | `1` (Turbopack — លំនាំដើមរបស់កូដ) | `package.json` / Next.js 16 | Turbopack គឺជា bundler លំនាំដើមសម្រាប់ `npm run dev` និង `npm run build` (ការបង្កើតលឿនជាង 2-3× តាមការធ្វើ benchmark)។ កំណត់ជា `0` ដើម្បីត្រឡប់ទៅប្រើ webpack វិញនៅលើ Windows នៅពេលជួបបញ្ហាភាពមិនឆបគ្នារវាង native binding / bundler **ឬនៅលើម៉ាស៊ីនដែលមាន RAM កម្រិតទាប** — ការបង្កើត production របស់ Turbopack នៅលើខ្សែកំណែ Next.js នេះ (16.2.x) ត្រូវបានគេដឹងក្នុង upstream ថា ប្រើអង្គចងចាំកម្រិតកំពូលខ្ពស់ជាង webpack យ៉ាងច្រើនលើក្រាហ្វម៉ូឌុលធំៗ (ដំណោះស្រាយ memory-eviction របស់ Turbopack ក្នុង Next 16.3 មិនទាន់មានស្ថិរភាពនៅឡើយ) ខណៈជម្រើសត្រឡប់ទៅ webpack វិញប្រើអង្គចងចាំកម្រិតកំពូលទាបជាងច្រើន។ សូមមើល #6409។ **ការបង្កើត Docker image មានលំនាំដើមជា `0` (webpack)**៖ `Dockerfile` ប្រកាស `ARG OMNIROUTE_USE_TURBOPACK=0` ដូច្នេះ `docker build .` ធម្មតា (Railway និងសេវា host ដោយចុចតែមួយផ្សេងទៀត ព្រមទាំងអ្នក self-host បណ្ដោះអាសន្ន) នឹងមិនត្រូវបានសម្លាប់ដោយ OOM លើ builder ដែលមានដែនកំណត់អង្គចងចាំទេ។ បញ្ជូន `--build-arg OMNIROUTE_USE_TURBOPACK=1` ដើម្បីបង្កើត image ជាមួយ Turbopack។ សូមមើល `docs/guides/DOCKER_GUIDE.md` → ធនធានពេលបង្កើត។ | | `OMNIROUTE_SKIP_DB_HEALTHCHECK` | _(មិនបានកំណត់)_ | `src/lib/db/core.ts` / `src/lib/db/healthCheck.ts` | កំណត់ជា `1` ដើម្បីរំលងការត្រួតពិនិត្យសុខភាពសុចរិតភាព SQLite នៅពេលចាប់ផ្ដើម។ មានប្រយោជន៍សម្រាប់ការចាប់ផ្ដើមលឿនជាងមុនលើមូលដ្ឋានទិន្នន័យធំៗ។ | | `NOTIFY_SOCKET` | _(មិនបានកំណត់)_ | systemd (ពិធីការ sd_notify) | ត្រូវបានកំណត់ដោយ systemd នៅពេលដំណើរការរត់ក្រោម service unit ដែលមានការរួមបញ្ចូល sd_notify។ OmniRoute អានវា (សូមមើល `OMNIROUTE_DISABLE_SD_NOTIFY`) ដើម្បីផ្ញើការជូនដំណឹង READY/WATCHDOG។ អ្នកប្រើមិនត្រូវកំណត់វាឡើយ។ | | `OMNIROUTE_DISABLE_SD_NOTIFY` | _(មិនបានកំណត់)_ | `scripts/dev/systemd-notify.mjs` | កំណត់ជា `1` ដើម្បីបិទ systemd sd_notify (Type=notify / WatchdogSec=) ទោះបីកំពុងដំណើរការក្រោម systemd unit ក៏ដោយ។ notifier នឹងមិនធ្វើអ្វីឡើយនៅខាងក្រៅ systemd ដោយមិនគិតពីការកំណត់នេះ។ | | `CREDENTIAL_HEALTH_CHECK_INTERVAL` | `3600000` | `open-sse/config/constants.ts` / `src/lib/credentialHealth/scheduler.ts` | ចន្លោះពេល (ms) សម្រាប់ scheduler ត្រួតពិនិត្យសុខភាព credential នៅផ្ទៃខាងក្រោយ។ អប្បបរមា៖ 10000 (10s)។ | | `CREDENTIAL_HEALTH_CACHE_TTL` | `300000` | `open-sse/config/constants.ts` / `src/lib/credentialHealth/cache.ts` | TTL (ms) សម្រាប់ស្ថានភាពសុខភាព credential ដែលបានរក្សាទុកក្នុងឃ្លាំងសម្ងាត់។ | | `OMNIROUTE_DISABLE_CREDENTIAL_HEALTH_CHECK` | `false` | `src/lib/credentialHealth/scheduler.ts` | កំណត់ជា `1` ឬ `true` ដើម្បីបិទការធ្វើតេស្តតាមកាលកំណត់នៅផ្ទៃខាងក្រោយលើការតភ្ជាប់ទៅ provider។ provider ស្វែងរក (SEARCH_VALIDATOR_CONFIGS នៅក្នុង `src/lib/providers/validation/searchProviders.ts` ឧ. `tavily-search`) តែងតែត្រូវបានដកចេញពីការត្រួតពិនិត្យជុំ — "validation" របស់វាគឺជាសំណួរ upstream ពិតប្រាកដដែលគិតថ្លៃ ដូច្នេះវាមិនត្រូវបានត្រួតពិនិត្យសុខភាពតាមកម្មវិធីកំណត់ពេលឡើយ (#9970)។ | | `DEEP_HEALTH_CHECK_ENABLED` | `0` | `src/app/api/monitoring/health/route.ts` | កំណត់ជា `1` ដើម្បីអនុញ្ញាតឱ្យអ្នកហៅដែលបានផ្ទៀងផ្ទាត់ស្នើសុំ `/api/monitoring/health?deep=1` ដែលនឹងយកសំណាកពីផ្ទៃ completions ម្ដងក្នុងមួយ TTL។ អ្នកហៅអនាមិកមិនដែលបង្កឱ្យ probe ដំណើរការឡើយ។ | | `HOST` | `0.0.0.0` | `scripts/dev/run-next.mjs` | អាសយដ្ឋាន bind សម្រាប់ម៉ាស៊ីនមេ dev/start របស់ Next.js។ ជំនួសតម្លៃលំនាំដើម `0.0.0.0` នៅពេលបានកំណត់។ | | `HOSTNAME` | `127.0.0.1` | `scripts/dev/run-next-playwright.mjs` | អាសយដ្ឋាន bind ដែល Playwright runner ប្រើនៅពេលបើកដំណើរការ Next.js។ តម្លៃលំនាំដើមគឺ `127.0.0.1` សម្រាប់ការធ្វើតេស្តដែលមានបរិស្ថានឯកោ។ **កុំប្រើសម្រាប់ `omniroute serve`** — ប្រើ `OMNIROUTE_SERVER_HOST` ជំនួសវិញ (POSIX shells កំណត់ `HOSTNAME` ដោយស្វ័យប្រវត្តិជាឈ្មោះម៉ាស៊ីន ហើយ `.env` មិនអាចជំនួសវាបានទេ)។ | | `OMNIROUTE_SERVER_HOST` | `0.0.0.0` | `bin/cli/commands/serve.mjs` | អាសយដ្ឋានចងសម្រាប់ `omniroute serve`។ ជៀសវាងការប៉ះទង្គិចជាមួយអថេរ POSIX shell `HOSTNAME` (ដែល bash/zsh តែងតែកំណត់ជាឈ្មោះម៉ាស៊ីន)។ ត្រឡប់ទៅប្រើ `0.0.0.0` នៅពេលមិនបានកំណត់។ (#6194) | ### របៀបច្រក ``` ┌─────────────────────────── ច្រកតែមួយ (លំនាំដើម) ──────────────────────────┐ │ PORT=20128 │ │ → ផ្ទាំងគ្រប់គ្រង: http://localhost:20128 │ │ → API: http://localhost:20128/v1/chat/completions │ └─────────────────────────────────────────────────────────────────────────────┘ ┌─────────────────────────── ច្រកដាច់ដោយឡែក ────────────────────────────────┐ │ DASHBOARD_PORT=20128 │ │ API_PORT=20129 │ │ API_HOST=0.0.0.0 │ │ → ផ្ទាំងគ្រប់គ្រង: http://localhost:20128 │ │ → API: http://0.0.0.0:20129/v1/chat/completions │ │ ករណីប្រើប្រាស់៖ បើក API ឱ្យ LAN ចូលប្រើ ខណៈពេលដាក់កម្រិតផ្ទាំងគ្រប់គ្រងឱ្យប្រើបានតែតាម localhost។ │ └─────────────────────────────────────────────────────────────────────────────┘ ┌─────────────────────────── Docker សម្រាប់ផលិតកម្ម ────────────────────────┐ │ PROD_DASHBOARD_PORT=443 PROD_API_PORT=8443 │ │ → ផ្គូផ្គងច្រកកុងតឺន័រទៅនឹងច្រកម៉ាស៊ីនមេក្នុង docker-compose.prod.yml។ │ └─────────────────────────────────────────────────────────────────────────────┘ ``` --- ## 4. សុវត្ថិភាព និងការផ្ទៀងផ្ទាត់អត្តសញ្ញាណ | អថេរ | តម្លៃលំនាំដើម | ឯកសារប្រភព | សេចក្ដីពិពណ៌នា | | ------------------------------------------- | ------------------------------------------------------------------------------------------------- | -------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `MACHINE_ID_SALT` | `endpoint-proxy-salt` | `src/lib/auth` | Salt ដែលត្រូវបានបញ្ចូលជាមួយឧបករណ៍សម្គាល់ផ្នែករឹង ដើម្បីបង្កើតស្នាមសម្គាល់ម៉ាស៊ីន។ ផ្លាស់ប្ដូរវាសម្រាប់ការដាក់ឱ្យប្រើប្រាស់នីមួយៗ ដើម្បីធានាការដាច់ដោយឡែក។ | | `OMNIROUTE_CLI_SALT` | _(មិនបានកំណត់ = salt ចៃដន្យសម្រាប់ការដំឡើងនីមួយៗ ដែលរក្សាទុកនៅ `/cli-token-salt.json`)_ | `src/lib/machineToken.ts` | HMAC salt សម្រាប់បង្កើតថូខឹនផ្ទៀងផ្ទាត់អត្តសញ្ញាណ CLI មូលដ្ឋាន។ ការកំណត់តម្លៃនេះនឹងប្ដូរថូខឹន CLI ទាំងអស់នៅលើម៉ាស៊ីន ហើយតែងតែមានអាទិភាពលើ salt ដែលបានរក្សាទុក។ សូមមើល `docs/security/CLI_TOKEN.md`។ | | `AUTH_COOKIE_SECURE` | `false` | `src/lib/auth` | កំណត់សញ្ញាសម្គាល់ `Secure` លើខូគីសម័យ។ **ត្រូវតែជា `true`** នៅពេលដំណើរការនៅពីក្រោយ HTTPS។ | | `REQUIRE_API_KEY` | `false` | API middleware | នៅពេលជា `true` សំណើប្រូកស៊ី `/v1/*` ទាំងអស់ត្រូវតែរួមបញ្ចូល API key ដែលមានសុពលភាព។ **សញ្ញាសម្គាល់នេះមិនគ្រប់គ្រង `GET /v1/models` ទេ** ដែលជំនួសមកវិញ អនុវត្តតាមគោលជំហរចូលប្រើផ្ទាំងគ្រប់គ្រង (`requireAuthForModels`) — ដូច្នេះ `401` ពី `/v1/models` **មិនមានន័យថា** inference ត្រូវបានការពារទេ។ សូមមើល `docs/security/INFERENCE_AUTH_POSTURE.md` (#13695)។ | | `ALLOW_API_KEY_REVEAL` | `false` | `src/shared/constants/featureFlagDefinitions.ts` | អនុញ្ញាតឱ្យបង្ហាញតម្លៃ API key ពេញលេញនៅក្នុង UI របស់ផ្ទាំងគ្រប់គ្រង។ អាចកំណត់រចនាសម្ព័ន្ធពី Feature Flags របស់ផ្ទាំងគ្រប់គ្រងបាន; វាជាហានិភ័យសុវត្ថិភាពលើ instance ដែលប្រើរួមគ្នា។ | | `NO_LOG_API_KEY_IDS` | _(ទទេ)_ | `src/lib/compliance/index.ts` | លេខសម្គាល់ API key ដែលបំបែកដោយសញ្ញាក្បៀស និងមិនត្រូវបានកត់ត្រាសំណើ (សម្រាប់ការអនុលោមតាម GDPR)។ | | `DEFAULT_RATE_LIMIT_PER_DAY` | _(មិនបានកំណត់ = គ្មានដែនកំណត់)_ | `src/shared/utils/apiKeyPolicy.ts` | ថវិកាសំណើប្រចាំថ្ងៃជំនួស ដែលអនុវត្តចំពោះ API key ដែលជួរឈរ `rate_limits` របស់វាមានតម្លៃ null។ មិនបានកំណត់ ឬទទេ៖ គ្មានដែនកំណត់ដោយប្រយោលទេ (#2289, #11017)។ `0` មានន័យដូចគ្នា (គ្មានដែនកំណត់)។ ចំនួនគត់វិជ្ជមាន N បើកដំណើរការ N/ថ្ងៃ, 5N/សប្ដាហ៍, 20N/ខែ។ តម្លៃមិនទទេដែលមានទម្រង់មិនត្រឹមត្រូវ នឹងត្រឡប់ទៅប្រើចន្លោះកំណត់ចាស់ 1000/ថ្ងៃ, 5000/សប្ដាហ៍, 20000/ខែ។ | | `MAX_BODY_SIZE_BYTES` | `10485760` (10 MB) | `src/shared/middleware/bodySizeGuard.ts` | ទំហំ body អតិបរមាដែលត្រូវបានអនុញ្ញាតសម្រាប់សំណើ។ បដិសេធ payload ដែលលើសពីដែនកំណត់នេះ។ | | `OMNIROUTE_CHAT_LARGE_BODY_BYTES` | `262144` (256 KB) | `src/shared/middleware/chatBodyAdmission.ts` | body ពិតប្រាកដរបស់សំណើដែលមានទំហំស្មើ ឬលើសពីកម្រិតនេះ នឹងទទួលយក heavyweight admission lease ដែលមានលក្ខណៈ atomic និងស្ថិតក្នុង process មូលដ្ឋាន មុនពេលញែក JSON (ផ្លូវ BYTE រួមទាំង `POST /v1/responses`)។ មានច្រកគេច healthy-headroom ដូចគ្នានឹង [#10437](https://github.com/diegosouzapw/OmniRoute/pull/10437) សម្រាប់សំណុំទិន្នន័យដែលមានរចនាសម្ព័ន្ធធ្ងន់; ប៉ុន្តែនៅតែត្រូវបានកំណត់ដោយ `OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES` / [#10110](https://github.com/diegosouzapw/OmniRoute/issues/10110) ដើម្បីកុំឱ្យ [#7849](https://github.com/diegosouzapw/OmniRoute/issues/7849) កើតឡើងវិញ។ | | `OMNIROUTE_CHAT_HARD_MAX_BODY_BYTES` | `52428800` (50 MB) | `src/shared/middleware/chatBodyAdmission.ts` | ដែនកំណត់អតិបរមាដាច់ខាតសម្រាប់ route ជជែក ដែលត្រូវបានអនុវត្តលើចំនួន byte ដែលបានអានកំឡុងពេលទទួលទិន្នន័យដោយមានព្រំដែន រួមទាំង request ដែលបាត់ មានតម្លៃមិនត្រឹមត្រូវ ឬក្លែងបន្លំ `Content-Length`; ទិន្នន័យដែលលើសនឹងទទួលបាន `413`។ | | `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT` | _(មិនបានកំណត់ — គ្មានដែនកំណត់ចំនួន request)_ | `src/shared/middleware/chatBodyAdmission.ts` | **#503-fanout:** ដែនកំណត់ចំនួន request ចាស់នេះ ឥឡូវមានប្រសិទ្ធភាពតែនៅពេលកំណត់យ៉ាងជាក់លាក់ប៉ុណ្ណោះ។ នៅពេលទុកមិនកំណត់ (លំនាំដើម) ការអនុញ្ញាតឱ្យ request ជជែកធ្ងន់ចូល ត្រូវបានគ្រប់គ្រងជំនួសដោយ `OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES` — ថវិកា BYTE ដែលទាញយកដោយស្វ័យប្រវត្តិ ដោយកំណត់ទំហំតាមដែនកំណត់អង្គចងចាំពិតប្រាកដរបស់ process ក្នុង **process តែមួយ** (V8 heap មួយ)។ `/v1/responses` ពីរ ដែលត្រួតគ្នា និងមានប្រហែល 750k token អាចធ្វើឱ្យ heap ប្រហែល 12 Gi ខូច (#7849) — នេះជាការព្រមានអំពី **ថវិកាអង្គចងចាំ** មិនមែនជាដែនកំណត់ផលិតផលដាច់ខាតត្រឹម 2 ទេ។ Process ដែលមានសុខភាពល្អ (heap ទាបជាងអនុបាតបន្ធូរបន្ទុក) អាចទទួលយក `/v1/responses` រយៈពេលវែងច្រើនជាងនេះក្នុងពេលដំណាលគ្នា តាមរយៈ `OMNIROUTE_CHAT_ADMISSION_HEALTHY_HEADROOM`។ Client SSE រយៈពេលវែងរាប់សិប (40–50) អាស្រ័យលើ heap + `OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES` / #10110 មិនមែន “អតិបរមា 2” ទេ។ ការបង្កើនតម្លៃនេះដោយមិនគិតគូរ ដើម្បី “ប្រើប្រាស់ host” នឹងនាំឱ្យបញ្ហា #7849 កើតឡើងវិញ។ បង្កើនចំនួន **heap** ដោយប្រើ **`DATA_DIR` ឯករាជ្យចំនួន N** (#11024); កុំប្រើ `replicas>1` លើឯកសារ SQLite តែមួយ។ | | `OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES` | _(ទាញយកដោយស្វ័យប្រវត្តិ)_ | `src/shared/middleware/admissionBudget.ts` | **#503-fanout:** តម្លៃបដិសេធសម្រាប់ថវិកា byte នៃការទទួលទិន្នន័យដែលបានទាញយកដោយស្វ័យប្រវត្តិ (25% នៃដែនកំណត់អង្គចងចាំ V8/cgroup ដែលតឹងជាង បែងចែកនឹងការពង្រីកបណ្ដោះអាសន្ន 8x)។ តម្លៃដែលបានទាញយក និងតម្លៃជាក់លាក់ ត្រូវបានកម្រិតនៅចន្លោះ 8 MiB–2 GiB។ Body ដែលធំជាងថវិកាមានប្រសិទ្ធភាព នឹងបរាជ័យភ្លាមៗជាមួយ `413 body_exceeds_budget`; ការប្រជែងធនធានរវាង body ដែលនីមួយៗអាចផ្ដល់សេវាបាន នៅតែអាចសាកល្បងឡើងវិញជាមួយ `503`។ Client SSE រយៈពេលវែងចំនួន 40–50 ក្នុងពេលដំណាលគ្នា អាស្រ័យលើថវិកានេះ + heap មិនមែនជាដែនកំណត់ដាច់ខាត “អតិបរមា 2” ទេ។ សូមពិនិត្យ `chatAdmission.maxInflightBytes` / `budgetSource` / `pressureSeverity` នៅ `/api/monitoring/health` មុនពេលកែសម្រួល។ | | `OMNIROUTE_CHAT_ADMISSION_HEAP_SHED_RATIO` | `0.75` | `src/shared/middleware/chatBodyAdmission.ts` | អនុបាតបន្ធូរបន្ទុកពេល heap រងសម្ពាធ (`heapUsed / heap_size_limit`) សម្រាប់ការអនុញ្ញាត request ធ្ងន់ប្រភេទ BYTE និង STRUCTURE (#10183, #10268, #10437)។ Request ធ្ងន់ដែលដំណើរការក្នុងពេលដំណាលគ្នា និងលើស `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT` នឹងត្រូវបានបដិសេធជាមួយ `503` ដែលអាចសាកល្បងឡើងវិញបាន លុះត្រាតែ heap ក៏ស្មើ ឬលើសអនុបាតនេះផងដែរ; នៅលើ heap ដែលមានសុខភាពល្អ វានឹងត្រូវបានអនុញ្ញាតតាមរយៈ healthy-headroom ជំនួសវិញ។ | | `OMNIROUTE_CHAT_ADMISSION_HEALTHY_HEADROOM` | `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT` (លំនាំដើម `1`) | `src/shared/middleware/chatBodyAdmission.ts` | សមត្ថភាពបន្ថែមដែលមានព្រំដែន សម្រាប់ផ្លូវលឿននៅពេល heap មានសុខភាពល្អ (#10437) លើ **ទាំង** STRUCTURE និង BYTE (`admitChatRequest` រួមទាំង body ≥ `OMNIROUTE_CHAT_LARGE_BODY_BYTES`)។ បើគ្មានព្រំដែននេះ រាល់ request ដែលរវល់ ប៉ុន្តែមាន heap ដែលមានសុខភាពល្អ នឹងរំលងការគ្រប់គ្រងការអនុញ្ញាតដោយគ្មានដែនកំណត់។ នៅពេល lease ដែលដំណើរការក្នុងពេលដំណាលគ្នាចំនួននេះ សកម្មតាមរយៈផ្លូវ heap ដែលមានសុខភាពល្អ request រវល់បន្ថែមទៀតនឹងធ្លាក់ទៅកាន់ផ្លូវរង់ចាំមានព្រំដែន/បន្ធូរបន្ទុក **ដូចគ្នា** ដែលប្រើនៅក្រោមសម្ពាធ heap ពិតប្រាកដ។ `0` បិទការរំលងនេះទាំងស្រុង។ | | `OMNIROUTE_CHAT_HEAVY_MESSAGE_COUNT` | `200` | `src/shared/middleware/chatBodyAdmission.ts` | ចំនួនសារដែលចាត់ថ្នាក់ request ជជែកថាជា request ធ្ងន់ ទោះបី body របស់វាទាបជាងកម្រិត byte ក៏ដោយ។ | | `OMNIROUTE_CHAT_HEAVY_TOOL_COUNT` | `64` | `src/shared/middleware/chatBodyAdmission.ts` | ចំនួន tool ដែលចាត់ថ្នាក់ request ជជែកថាជា request ធ្ងន់ ទោះបី body របស់វាទាបជាងកម្រិត byte ក៏ដោយ។ | | `OMNIROUTE_CHAT_HEAVY_ESTIMATED_TOKENS` | `32000` | `src/shared/middleware/chatBodyAdmission.ts` | ការប៉ាន់ស្មាន token តាមទំហំ string បែបប្រុងប្រយ័ត្ន ដែលចាត់ថ្នាក់ request ថាជា request ធ្ងន់; នេះគឺជាតម្លៃតំណាងសម្រាប់ថ្លៃដើមនៃការអនុញ្ញាត មិនមែនជាវិធីបំបែកជា token សម្រាប់ការគិតថ្លៃរបស់ provider ទេ។ | | `OMNIROUTE_CHAT_HARD_MAX_MESSAGES` | `0` (បានបិទ) | `src/shared/middleware/chatBodyAdmission.ts` | ដែនកំណត់ប្រវត្តិជជែកជាជម្រើស ដែលត្រូវបើកដោយចេតនា។ វាត្រូវបានបិទតាមលំនាំដើម៖ ចំនួនសារគឺជាគោលការណ៍នៃការ deployment មិនមែនជាលក្ខណៈសកលរបស់ request ទេ ហើយការកំណត់នៅទីនេះ នឹងបដិសេធការសន្ទនាដោយ `413` ចុងក្រោយ មុនពេល pipeline បង្ហាប់អាចធ្វើឱ្យវាអាចផ្ដល់សេវាបាន។ កំណើន heap ត្រូវបានកំណត់ដោយ `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT` និងការបន្ធូរបន្ទុកពេល heap រងសម្ពាធ។ កំណត់តម្លៃវិជ្ជមានលើ deployment ដែលមានអង្គចងចាំមានកម្រិត និងត្រូវការដែនកំណត់ដាច់ខាត; បន្ទាប់មក ទិន្នន័យដែលលើសនឹងទទួលបាន `413` មានរចនាសម្ព័ន្ធ ដែលបញ្ជាក់ថាតម្រូវឱ្យបង្ហាប់។ | | `OMNIROUTE_MAX_NONSTREAMING_RESPONSE_BYTES` | `67108864` (64 MB) | `open-sse/handlers/chatCore/nonStreamingResponseBody.ts` | ដែនកំណត់អតិបរមាដាច់ខាតសម្រាប់ response ពី upstream ដែលមិនមែនជា streaming និងត្រូវបានរក្សាទុកពេញលេញក្នុងអង្គចងចាំ។ នៅពេលលើសដែនកំណត់នេះ កម្មវិធីអាន upstream នឹងត្រូវបានបោះបង់ ហើយ request នឹងបរាជ័យភ្លាមៗ ជំនួសឱ្យការបង្កើន string ដោយគ្មានព្រំដែន រហូតដល់ heap អស់។ | | `OMNIROUTE_FORWARDING_HEADER_BUDGET_BYTES` | `768` | `open-sse/handlers/chatCore/responseHeaders.ts` | ចំនួនបៃអតិបរមាតាមខ្សែបណ្ដាញដែលត្រូវបញ្ជូនបន្តពី response headers របស់ upstream។ នៅពេលលើសកម្រិតកំណត់ headers ដែលមានអាទិភាពទាបជាង (ឧ. `x-codex-*`, `x-oai-request-id`) នឹងត្រូវបានលុបចេញ ដើម្បីរក្សាឱ្យស្ថិតក្នុងដែនកំណត់ header ទូទៅរបស់ reverse proxy។ កំណត់តម្លៃឱ្យខ្ពស់ជាងនេះ ដើម្បីបញ្ជូន metadata របស់ upstream បានច្រើនជាងមុន ដោយប្ដូរជាមួយនឹងទំហំ response header ដែលធំជាងមុន។ | | `CORS_ORIGIN` | _(មិនបានកំណត់)_ | `src/server/cors/origins.ts` | បញ្ជីអនុញ្ញាត CORS សម្រាប់ origin តែមួយបែបចាស់។ សម្រាប់ការដាក់ឱ្យប្រើប្រាស់ថ្មី គួរប្រើ `CORS_ALLOWED_ORIGINS`។ CORS គឺសម្រាប់តែ browser API clients ឆ្លង origin ប៉ុណ្ណោះ។ ប្រតិបត្តិការសរសេររបស់ dashboard ដែលបានផ្ទៀងផ្ទាត់អត្តសញ្ញាណ ប្រើសំណើ same-origin រួមជាមួយការការពារ CSRF ដែលភ្ជាប់នឹង session ជំនួសវិញ។ | | `CORS_ALLOWED_ORIGINS` | _(មិនបានកំណត់)_ | `src/server/cors/origins.ts` | បញ្ជីអនុញ្ញាត CORS ដែលបំបែកដោយសញ្ញាក្បៀស។ wildcard នឹងមិនត្រូវបានផ្ញើឡើយ លុះត្រាតែបានកំណត់ `CORS_ALLOW_ALL=true` យ៉ាងច្បាស់លាស់។ | | `CORS_ALLOW_ALL` | `false` | `src/server/cors/origins.ts` | ច្រកគេចសម្រាប់ការអភិវឌ្ឍតែប៉ុណ្ណោះ ដើម្បីឆ្លើយតបត្រឡប់នូវ `Origin` ណាមួយរបស់ browser។ កុំបើកវាលើការដាក់ឱ្យប្រើប្រាស់រួមគ្នា ឬក្នុង production។ | | `OUTBOUND_SSRF_GUARD_ENABLED` | `true` | `src/shared/network/outboundUrlGuardPolicy.ts` | ឈ្មោះជំនួសបែបចាស់។ toggle របស់វានៅក្នុង dashboard (ជា DB override) ត្រូវបានអានមុនតម្លៃ environment នេះ។ `false`, `0`, `no` ឬ `off` នៅក្នុងតម្លៃណាមួយក្នុងចំណោមទាំងពីរ នឹងបិទការត្រួតពិនិត្យ host ដូចដែល `OMNIROUTE_ALLOW_PRIVATE_PROVIDER_URLS=true` ធ្វើ ទោះបីជា toggle របស់ flag នោះនៅក្នុង dashboard ត្រូវបានរក្សាទុកជាស្ថានភាពបិទក៏ដោយ។ តម្លៃផ្សេងទៀតទុកឱ្យ guard ស្ថិតក្រោមការគ្រប់គ្រងរបស់ flags ទាំងពីរខាងក្រោម។ | | `OMNIROUTE_ALLOW_PRIVATE_PROVIDER_URLS` | `false` | `src/shared/network/outboundUrlGuardPolicy.ts` | បិទការត្រួតពិនិត្យ host របស់ outbound URL guard រួមទាំង cloud-metadata block (169.254.0.0/16 ទាំងមូល, metadata.google.internal) នៅលើ provider paths ដែលអនុវត្តតាម guard mode៖ ការផ្ទៀងផ្ទាត់ URL, ការស្វែងរក model, base URLs របស់ provider-node (រួមទាំង remote rerank nodes) និងការសាកល្បង proxy-fallback ព្រមទាំង provider-adjacent outbound paths ផ្សេងទៀត ដូចជាការទាញយក image/media ពីចម្ងាយ។ វាក៏អនុញ្ញាត private webhook targets ផងដែរ លើកលែងតែ cloud-metadata/link-local endpoints ដែលនៅតែត្រូវបានរារាំង ទោះបីជា flag នេះបើកក៏ដោយ។ សំណើ chat ដែលបញ្ជូនតាម `BaseExecutor.execute()` នៅតែរក្សាការត្រួតពិនិត្យ cloud-metadata របស់វា។ Local providers ដំណើរការជាមួយតម្លៃលំនាំដើម៖ `OMNIROUTE_ALLOW_LOCAL_PROVIDER_URLS` (លំនាំដើម `true`) អនុញ្ញាត local និង LAN URLs រួចហើយ នៅលើ validation, discovery និង provider-node paths។ ការសាកល្បង proxy-fallback និង private webhook targets ពិនិត្យតែ flag នេះប៉ុណ្ណោះ ហើយរារាំង local/LAN hosts ខណៈពេលវាបិទ។ វាមានអាទិភាពលើ `OMNIROUTE_ALLOW_LOCAL_PROVIDER_URLS=false`។ តម្លៃដែលបានរក្សាទុកពី toggle ក្នុង dashboard មានអាទិភាពលើ variable នេះ។ | | `OMNIROUTE_ALLOW_LOCAL_PROVIDER_URLS` | `true` | `src/shared/network/outboundUrlGuardPolicy.ts` | អនុញ្ញាត provider URLs នៅលើ local/private addresses (127.0.0.1, localhost, LAN, private ranges) សម្រាប់ provider validation, model discovery, chat និង provider-adjacent outbound paths ផ្សេងទៀតដែលគ្រប់គ្រងដោយ guard mode។ **លំនាំដើម `true`** (local-first)៖ បន្ទាប់មក guard នឹងរារាំង cloud-metadata endpoints — 169.254.0.0/16 ទាំងមូល បូករួមទាំង metadata hostnames ដែលស្គាល់ (metadata.google.internal, metadata.goog, Alibaba/Azure/Oracle IMDS, fd00:ec2::254)។ កំណត់ជា `false` សម្រាប់ public-only mode ដែលរារាំង private និង loopback hosts ផងដែរ។ guard ពិនិត្យ hostname ឬ IP literal ដូចដែលបានសរសេរ មុនពេលធ្វើ DNS lookup ណាមួយ។ ក្នុង public-only mode safe-fetch wrapper នឹង resolve hostname បន្ថែម ហើយបដិសេធ private answer ណាមួយ។ `OMNIROUTE_ALLOW_PRIVATE_PROVIDER_URLS=true` បិទការត្រួតពិនិត្យទាំងនេះនៅលើ paths ដែលបានរាយក្នុងជួររបស់វា។ Built-in local providers ដូចជា LM Studio, Ollama, vLLM, Llamafile និង Triton រំលងការត្រួតពិនិត្យ host ទាំងអស់សម្រាប់ key validation និង chat។ តម្លៃដែលបានរក្សាទុកពី toggle ក្នុង dashboard មានអាទិភាពលើ variable នេះ។ (#5066) | | `AUDIO_REMOTE_PROVIDER_NODES` | `false` | `src/app/api/v1/_shared/audioProviderNodes.ts` | អនុញ្ញាតឱ្យ routes `/v1/audio/*` (transcriptions, speech, translations) ប្រើ OpenAI-compatible provider node ដែល host នៅក្រៅ localhost។ បិទតាមលំនាំដើម — ការបញ្ជូន audio ទៅ remote host ផ្លាស់ប្ដូរ egress identity ហើយត្រូវតែជាការសម្រេចចិត្តយ៉ាងច្បាស់លាស់របស់ operator។ Loopback/private nodes (localhost, 127.0.0.1, 172.16-31.x) តែងតែត្រូវបានអនុញ្ញាត និងមិនរងផលប៉ះពាល់ឡើយ។ (#3963) | | `RERANK_REMOTE_PROVIDER_NODES` | `false` | `src/app/api/v1/_shared/rerankProviderNodes.ts` | អនុញ្ញាតឱ្យ `POST /v1/rerank` (និង loopback rerank step របស់ memory engine) ប្រើ OpenAI-compatible provider node ដែល host នៅក្រៅ localhost — ដូចជា LAN box ឬ Tailscale peer ដែលកំពុងដំណើរការ TEI, Infinity, vLLM ជាដើម។ បិទតាមលំនាំដើម — ការបញ្ជូនទៅ remote host ផ្លាស់ប្ដូរ egress identity ហើយត្រូវតែជាការសម្រេចចិត្តយ៉ាងច្បាស់លាស់របស់ operator។ Loopback nodes (localhost, 127.0.0.1, 172.16-31.x) តែងតែត្រូវបានអនុញ្ញាត និងមិនរងផលប៉ះពាល់ឡើយ។ base URL របស់ remote node ក៏ត្រូវតែឆ្លងកាត់ provider outbound URL policy (`OMNIROUTE_ALLOW_LOCAL_PROVIDER_URLS` / `OMNIROUTE_ALLOW_PRIVATE_PROVIDER_URLS`) ផងដែរ។ | | `OMNIROUTE_LOCAL_PROVIDER_NODE_HOSTS` | _(ទទេ)_ | `src/shared/network/localNodeHosts.ts` | ឈ្មោះម៉ាស៊ីន (បំបែកដោយសញ្ញាក្បៀស ឬចន្លោះ) ដែលការកំណត់ផ្លូវទៅកាន់ provider-node ចាត់ទុកថាជា local — ជាទូទៅគឺជាឈ្មោះសេវា Docker/Compose របស់ reranker, TEI ឬ audio sidecar នៅលើបណ្ដាញ Docker ផ្ទាល់របស់ OmniRoute (`http://reranker:8080/v1`) ដូច្នេះ node មិនចាំបាច់មាន IP របស់ container ដែលកំណត់ថេរទេ។ ម៉ាស៊ីនដែលបានរាយបញ្ជីអាចប្រើបានសម្រាប់ `/v1/rerank`, `/v1/audio/*` និងការត្រួតពិនិត្យសុខភាព local ដោយមិនចាំបាច់បើក `RERANK_REMOTE_PROVIDER_NODES` / `AUDIO_REMOTE_PROVIDER_NODES` សម្រាប់ remote node នីមួយៗ ហើយត្រូវបានហៅដោយផ្ទាល់ — មិនដែលឆ្លងកាត់ `HTTP(S)_PROXY` ឬ proxy ដែលបានភ្ជាប់ថេររបស់ connection ឡើយ។ ពួកវានៅតែផ្ញើ API key របស់ connection។ មានតែឈ្មោះ single-label និងឈ្មោះ `.internal`/`.local` ប៉ុណ្ណោះដែលត្រូវបានទទួលយក; public FQDNs, IP literals និងឈ្មោះ cloud-metadata ត្រូវបានមិនអើពើដោយមានការព្រមាន។ (#14635) | | `OMNIROUTE_OIDC_DISABLE_PASSWORD_LOGIN` | `false` | `src/app/api/auth/login/route.ts` | នៅពេលបើក OIDC សូមបិទការចូលដោយពាក្យសម្ងាត់ ដើម្បីឱ្យអ្នកប្រើប្រាស់អាចផ្ទៀងផ្ទាត់អត្តសញ្ញាណបានតែតាមរយៈ OIDC Single Sign-On ប៉ុណ្ណោះ។ Alias ទម្រង់ខ្លី `OIDC_DISABLE_PASSWORD_LOGIN` ក៏ត្រូវបានទទួលយកផងដែរ; Dashboard Feature Flag ដែលមាន key ដូចគ្នាមានអាទិភាពជាង។ (#10889) | | `OIDC_DISABLE_PASSWORD_LOGIN` | `false` | `src/app/api/auth/login/route.ts` | Alias ទម្រង់ខ្លីរបស់ `OMNIROUTE_OIDC_DISABLE_PASSWORD_LOGIN` (#10889)។ | ### បញ្ជីត្រួតពិនិត្យការពង្រឹងសុវត្ថិភាព ```bash # កម្រិតសុវត្ថិភាពអប្បបរមាសម្រាប់ production: AUTH_COOKIE_SECURE=true # តម្រូវឱ្យប្រើ HTTPS REQUIRE_API_KEY=true # ផ្ទៀងផ្ទាត់រាល់ការហៅ proxy ALLOW_API_KEY_REVEAL=false # កុំបង្ហាញ key នៅក្នុង UI CORS_ALLOWED_ORIGINS=https://your.domain.com MAX_BODY_SIZE_BYTES=5242880 # ដែនកំណត់ 5 MB ``` --- ## 5. ការសម្អាតទិន្នន័យបញ្ចូល និងការការពារ PII OmniRoute ផ្តល់ការការពារពីរស្រទាប់៖ ការស្កេនការបញ្ចូលពាក្យបញ្ជានៅផ្នែកសំណើ និងការលុប PII នៅផ្នែកការឆ្លើយតប។ > **⚠️ ដែនកំណត់៖** របាំងការពារទាំងនេះគឺជាការរកឃើញតាមបែប _heuristic ដោយប្រឹងប្រែងឱ្យបានល្អបំផុត_ មិនមែនជា firewall ពេញលេញសម្រាប់ការបញ្ចូលពាក្យបញ្ជា ឬប្រព័ន្ធ DLP សម្រាប់ PII នោះទេ។ វាអាចបង្កើតលទ្ធផលវិជ្ជមានក្លែងក្លាយ (សម្គាល់ពាក្យបញ្ជា persona/RPG ដែលគ្មានគ្រោះថ្នាក់) និងលទ្ធផលអវិជ្ជមានក្លែងក្លាយ (leetspeak ការដកឃ្លា និងលំនាំដែលមិនមែនជាភាសាអង់គ្លេស)។ របាំងទាំងនេះតែឯងមិនគ្រប់គ្រាន់សម្រាប់ការអនុលោមតាមបទប្បញ្ញត្តិទេ។ សម្រួលរបៀបដំណើរការ និងសាកល្បងជាមួយចរាចរណ៍របស់អ្នក មុនពេលពឹងផ្អែកលើវា។ ### ផ្នែកសំណើ៖ របាំងការពារការបញ្ចូលពាក្យបញ្ជា | អថេរ | លំនាំដើម | ឯកសារប្រភព | សេចក្ដីពិពណ៌នា | | --------------------------------- | --------------- | ---------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `INPUT_SANITIZER_ENABLED` | `true` | `src/middleware/promptInjectionGuard.ts` | បើកការស្កេនសារចូល ដើម្បីស្វែងរកលំនាំនៃការបញ្ចូលពាក្យបញ្ជា។ | | `INPUT_SANITIZER_MODE` | `warn` | `src/middleware/promptInjectionGuard.ts` | គោលការណ៍ការបញ្ចូលពាក្យបញ្ជា៖ `warn` = កត់ត្រាតែប៉ុណ្ណោះ, `block` = បដិសេធសំណើដោយប្រើ 400។ `redact` ចាស់ **មិន** លុបអត្ថបទការបញ្ចូលពាក្យបញ្ជាទេ; ប្រើ `PII_REDACTION_ENABLED` សម្រាប់ការកែសម្រួល PII ក្នុងសំណើ។ | | `INJECTION_GUARD_MODE` | _(មិនបានកំណត់)_ | `src/middleware/promptInjectionGuard.ts` | ឈ្មោះជំនួសចាស់សម្រាប់ `INPUT_SANITIZER_MODE` — មានឥរិយាបថដូចគ្នា។ | | `INPUT_SANITIZER_BLOCK_THRESHOLD` | `high` | `src/shared/utils/injectionSeverity.ts` | កម្រិតធ្ងន់ធ្ងរអប្បបរមាដែល `MODE=block` បដិសេធ៖ `high` (លំនាំដើម), `medium`, ឬ `low`។ លំនាំកម្រិតមធ្យមត្រូវបានតាមដានតែប៉ុណ្ណោះ លុះត្រាតែបន្ថយកម្រិតកំណត់។ | | `INJECTION_GUARD_BLOCK_THRESHOLD` | _(មិនបានកំណត់)_ | `src/shared/utils/injectionSeverity.ts` | ឈ្មោះជំនួសចាស់សម្រាប់ `INPUT_SANITIZER_BLOCK_THRESHOLD` — មានឥរិយាបថដូចគ្នា។ | | `PII_REDACTION_ENABLED` | `false` | `src/lib/guardrails/piiMasker.ts` | នៅពេលជា `true` លាក់ទិន្នន័យ PII ក្នុងសំណើចូល (មិនអាស្រ័យលើរបៀបការបញ្ចូលពាក្យបញ្ជា)។ | | `CREDENTIAL_REDACTION_ENABLED` | `false` | `src/lib/guardrails/credentialMasker.ts` | លាក់លំនាំ API key / secret token ដែលគេស្គាល់ច្បាស់ពី payload នៃសំណើ/ការឆ្លើយតប។ ត្រូវបើកប្រើដោយខ្លួនឯង; មានលក្ខណៈដូច `PII_REDACTION_ENABLED`។ | ### ផ្នែកការឆ្លើយតប៖ ឧបករណ៍សម្អាត PII | អថេរ | លំនាំដើម | ឯកសារប្រភព | សេចក្ដីពិពណ៌នា | | -------------------------------- | -------- | ------------------------- | ------------------------------------------------------------------------------------ | | `PII_RESPONSE_SANITIZATION` | `false` | `src/lib/piiSanitizer.ts` | ស្កេនការឆ្លើយតបរបស់ LLM រក PII ដែលលេចធ្លាយ មុនពេលបញ្ជូនត្រឡប់ទៅម៉ាស៊ីនភ្ញៀវ។ | | `PII_RESPONSE_SANITIZATION_MODE` | `redact` | `src/lib/piiSanitizer.ts` | `redact` = លាក់ PII, `warn` = កត់ត្រាតែប៉ុណ្ណោះ, `block` = ទម្លាក់ការឆ្លើយតបទាំងមូល។ | ### ឧបករណ៍សម្អាតបរិបទ Tokenized-Route របស់ VS Code | អថេរ | លំនាំដើម | ឯកសារប្រភព | សេចក្ដីពិពណ៌នា | | ----------------------------------- | -------- | ------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `OMNIROUTE_VSCODE_SANITIZE_CONTEXT` | `1` | `src/app/api/v1/vscode/contextSanitizer.ts` | លុបបរិបទរបស់កម្មវិធីកែសម្រួលដែលកំពុងសកម្មដោយប្រយោល (`editorContext`, `activeEditor`, `currentFile`, `selection`, `openTabs`…) ចេញពីសំណើ `/v1/vscode/[token]/*` ហើយលាក់ខ្លឹមសារនៃឯកសាររសើបដែលបានភ្ជាប់ដោយច្បាស់លាស់។ មានសុវត្ថិភាពតាមលំនាំដើម; កំណត់ជា `0` ដើម្បីបិទ។ | ### សេណារីយ៉ូ | សេណារីយ៉ូ | ការកំណត់រចនាសម្ព័ន្ធ | | ------------------------------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | **ការអនុលោមតាមបទប្បញ្ញត្តិសម្រាប់សហគ្រាស** | `INPUT_SANITIZER_ENABLED=true`, `INPUT_SANITIZER_MODE=block`, `PII_REDACTION_ENABLED=true`, `PII_RESPONSE_SANITIZATION=true` (ទប់ស្កាត់ការបញ្ចូលពាក្យបញ្ជា + លាក់ PII ក្នុងសំណើ/ការឆ្លើយតប; របៀបដំណើរការមិនអាស្រ័យគ្នា) | | **ការតាមដានតែប៉ុណ្ណោះ** | `INPUT_SANITIZER_ENABLED=true`, `INPUT_SANITIZER_MODE=warn` — កត់ត្រា ប៉ុន្តែមិនដែលទប់ស្កាត់ | | **ការប្រើប្រាស់ផ្ទាល់ខ្លួន** | ទុកឱ្យទាំងអស់បិទ — គ្មានបន្ទុកបន្ថែម | --- ## 6. គោលការណ៍ឧបករណ៍ និងការកំណត់ផ្លូវ | អថេរ | តម្លៃលំនាំដើម | ឯកសារប្រភព | សេចក្ដីពិពណ៌នា | | ----------------------------------------------------------- | ----------------------------- | ---------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `TOOL_POLICY_MODE` | `disabled` | `src/lib/toolPolicy.ts` | គ្រប់គ្រងសិទ្ធិចូលប្រើការហៅឧបករណ៍/មុខងាររបស់ LLM។ `allowlist` = អនុញ្ញាតតែឧបករណ៍ដែលបានរាយបញ្ជី, `denylist` = អនុញ្ញាតទាំងអស់ លើកលែងតែឧបករណ៍ដែលបានរាយបញ្ជី, `disabled` = គ្មានការរឹតត្បិត។ | | `OMNIROUTE_PAYLOAD_RULES_PATH` | `./config/payloadRules.json` | `open-sse/services/payloadRules.ts` | ផ្លូវទៅកាន់ឯកសារ JSON នៃច្បាប់កែសម្រួល payload (ការកែតម្រូវ upstream តាមម៉ូដែល/ពិធីការ)។ | | `OMNIROUTE_PAYLOAD_RULES_RELOAD_MS` | `5000` | `open-sse/services/payloadRules.ts` | ចន្លោះពេលផ្ទុកឡើងវិញ (ms) សម្រាប់ការផ្ទុកឡើងវិញភ្លាមៗនៃឯកសារច្បាប់ payload។ អប្បបរមា `1000`។ | | `OMNIROUTE_PREFER_CLAUDE_CODE_FOR_UNPREFIXED_CLAUDE_MODELS` | `false` | `open-sse/services/model.ts` | ជម្រើសដែលត្រូវបើកដោយចេតនា៖ កំណត់ផ្លូវលេខសម្គាល់ម៉ូដែល `claude-*` ទទេគ្មានបុព្វបទពីម៉ាស៊ីនភ្ញៀវ Claude Code តាមរយៈគណនី OAuth របស់ Claude Code ជំនួសឱ្យការទាមទារបុព្វបទអ្នកផ្ដល់សេវា។ បុព្វបទអ្នកផ្ដល់សេវាដែលបានបញ្ជាក់ច្បាស់នៅតែមានអាទិភាព។ ក៏អាចកំណត់តាមរយៈប៊ូតុងបិទបើកលើផ្ទាំងគ្រប់គ្រងនៅទំព័រអ្នកផ្ដល់សេវា Claude ផងដែរ។ | | `BARE_MODEL_DEFAULT_OVERRIDE_LEGACY` | `false` | `open-sse/services/model.ts` | ឥរិយាបថចាស់របស់ `resolveBareModelToConnectionDefault` (#4825)៖ ជំនួសឈ្មោះម៉ូដែលទទេគ្មានបុព្វបទណាមួយដោយ `defaultModel` របស់ការតភ្ជាប់ដែលបានជ្រើស។ ត្រូវបានបិទតាមលំនាំដើម ដោយជំនួសតែ `auto` ឬម៉ូដែលទទេប៉ុណ្ណោះ; នៅពេលបើក វាកត់ត្រាការព្រមានមួយសម្រាប់គូនីមួយៗ។ | | `COMBO_CONCURRENCY_PER_MODEL` | `3` | `open-sse/services/comboConfig.ts` | កម្រិតព្រមគ្នាតាមម៉ូដែលសម្រាប់បន្សំ round-robin (#9100)។ semaphore របស់បន្សំ round-robin ត្រូវបានកំណត់កម្រិតថេរនៅត្រឹមសំណើព្រមគ្នា 3 ក្នុងមួយម៉ូដែល ដោយមិនអាចកំណត់ជំនួសបាន ដែលធ្វើឱ្យចរាចរណ៍មានភាពព្រមគ្នាខ្ពស់ជាងនេះត្រូវដំណើរការតាមលំដាប់នៅពីក្រោយកម្រិតនោះ។ ផ្ទៀងផ្ទាត់ឱ្យ `>= 1` និងកំណត់កម្រិតអតិបរមាទៅ `<= 32`។ | | `DISABLE_CONTEXT_WINDOW_CHECKS` | `false` | `open-sse/handlers/chatCore.ts` | ជម្រើសគ្រោះថ្នាក់ដែលត្រូវបើកដោយចេតនា ដើម្បីរំលងការត្រួតពិនិត្យ context-window / max-input-token ក្នុងមូលដ្ឋានរបស់ OmniRoute សម្រាប់សំណើដោយផ្ទាល់ទៅម៉ូដែលតែមួយ។ អ្នកផ្ដល់សេវា upstream នៅតែអនុវត្តដែនកំណត់ជាក់ស្ដែងរបស់ពួកគេ; ការបង្រួម prompt និងកម្រិត output-token របស់ម៉ូដែលផ្ទាល់នៅតែសកម្ម។ លំដាប់អាទិភាពដែលមានប្រសិទ្ធភាពគឺ ការកំណត់ជំនួសក្នុង Feature Flags DB > អថេរបរិស្ថាន > តម្លៃលំនាំដើម; មិនចាំបាច់ចាប់ផ្ដើមឡើងវិញទេ។ | | `OMNIROUTE_SELF_HOSTED_PROVIDERS` | _(មិនបានកំណត់)_ | `open-sse/services/selfHostedEntry.ts` | ឯកសារ YAML `providers:` ក្នុងបន្ទាត់ (RIC-738, D4)។ នៅពេលកំណត់ (ដោយមាន ឬគ្មានប្លុក `strategy:`) `/v1/chat/completions` នឹងបង្វែរទៅចំណុចចូលរួមដែល self-hosted និងឆបគ្នាជាមួយ OpenAI ជំនួសឱ្យ cloud pipeline។ មិនបានកំណត់ (តម្លៃលំនាំដើម)៖ ផ្លូវនឹងបន្តត្រង់ទៅកាន់ cloud pipeline ដែលមានស្រាប់។ សូមមើល `docs/routing/SELF_HOSTED_OPENAI_ENTRY.md`។ | | `OMNIROUTE_SELF_HOSTED_PROVIDERS_FILE` | _(មិនបានកំណត់)_ | `open-sse/services/selfHostedEntry.ts` | ផ្លូវទៅកាន់ឯកសារ YAML ដែលផ្ទុកឯកសារ `providers:` ដូចគ្នានឹង `OMNIROUTE_SELF_HOSTED_PROVIDERS` សម្រាប់ការដាក់ឱ្យប្រើប្រាស់ដែលចូលចិត្តប្រើឯកសារជំនួសអថេរបរិស្ថានក្នុងបន្ទាត់។ ការកំណត់មួយណាក៏ដោយនឹងធ្វើឱ្យចំណុចចូល self-hosted សកម្ម។ | | `OMNIROUTE_SELF_HOSTED_API_KEY` | _(មិនបានកំណត់ — ផ្លូវបើកចំហ)_ | `open-sse/services/selfHostedEntry.ts` | API key រួមដែលជាជម្រើសសម្រាប់ចំណុចចូល self-hosted រួម (គ្រោងមូលដ្ឋាន D5 ដែលបានបម្រុងទុកសម្រាប់ប្រព័ន្ធកូតាតាម key)។ នៅពេលកំណត់ សំណើត្រូវតែរួមបញ្ចូល `Authorization: Bearer `។ មិនបានកំណត់៖ ផ្លូវបើកចំហ ដោយត្រូវគ្នានឹងលំនាំអ្នកផ្ដល់សេវាមូលដ្ឋាន self-hosted ដែលមានស្រាប់ (ការដាក់ឱ្យប្រើប្រាស់លើ loopback/បណ្ដាញដែលទុកចិត្ត)។ | | `OMNIROUTE_SELF_HOSTED_STRATEGY` | _(មិនបានកំណត់)_ | `open-sse/services/routingStrategies.ts` | ឯកសារ YAML `strategy:` ក្នុងបន្ទាត់សម្រាប់ម៉ាស៊ីនកំណត់ផ្លូវបែបកំណត់ជាក់លាក់ (M2/RIC-740, D3) — blacklist/whitelist, cooldown breaker, អាទិភាពតាមតម្លៃ, ផ្អែកលើ latency និងខ្សែសង្វាក់ fallback។ វាកំណត់ជំនួសប្លុក `strategy:` ក្នុងបន្ទាត់ដែលដាក់នៅក្នុង `OMNIROUTE_SELF_HOSTED_PROVIDERS` តាម key នីមួយៗ។ សូមមើល `docs/routing/DETERMINISTIC_ROUTING.md`។ | | `OMNIROUTE_SELF_HOSTED_STRATEGY_FILE` | _(មិនបានកំណត់)_ | `open-sse/services/routingStrategies.ts` | ផ្លូវទៅកាន់ឯកសារ YAML ដែលផ្ទុកឯកសារ `strategy:` ដូចគ្នានឹង `OMNIROUTE_SELF_HOSTED_STRATEGY` សម្រាប់ការដាក់ឱ្យដំណើរការដែលចង់ប្រើឯកសារជំនួសឱ្យអថេរបរិស្ថានដែលសរសេរដោយផ្ទាល់។ | | `OMNIROUTE_DISABLE_CONVERSATION_TRACKING` | _(មិនបានកំណត់)_ | `open-sse/services/conversationTracker.ts` | កំណត់ជា `1` ដើម្បីបញ្ឈប់ការប្រមូលប្រវត្តិសន្ទនា។ `resolveConversationId()` ត្រឡប់លទ្ធផលដែលមិនត្រូវបានតាមដាន មុនពេលវាអាន SQLite ឬញែកប្រវត្តិសារ ហើយ ID សម័យដែលផ្ដល់ដោយកម្មវិធីអតិថិជនក៏ត្រូវបានគ្របដណ្ដប់ផងដែរ។ ការគ្រប់គ្រងសម័យកំណត់ផ្លូវមិនផ្លាស់ប្ដូរទេ ហើយកំណត់ត្រាដែលមានស្រាប់ក៏មិនត្រូវបានលុបដែរ។ សម្រាប់ការដាក់ឱ្យដំណើរការដែលមិនប្រើទិដ្ឋភាពសន្ទនារបស់ផ្ទាំងគ្រប់គ្រង និងចង់ឱ្យតារាងវេនសន្ទនាឈប់កើនឡើង។ | | `OMNIROUTE_NADIR_API_KEY` | _(មិនបានកំណត់)_ | `open-sse/services/autoCombo/nadirStrategy.ts` | កូនសោ API សម្រាប់យុទ្ធសាស្ត្ររ៉ោតទ័រ auto-combo `nadir` ដែលអាចជ្រើសរើសប្រើបាន ហើយត្រូវបានប្រើនៅពេល `config.nadir.apiKey` ផ្ទាល់របស់ combo មិនបានកំណត់។ ជាជម្រើស៖ ការហៅដោយគ្មានកូនសោនឹងចូលទៅកម្រិតអនាមិករបស់ Nadir ដែលត្រូវបានកំណត់អត្រាតាម IP ដូច្នេះមិនអាចប្រើបាននៅពីក្រោយច្រកចេញចូលរួមទេ។ នេះជាទិន្នន័យរសើប; គួរប្រើវាលសម្រាប់ combo នីមួយៗ នៅពេល combo ប្រើគណនីផ្សេងៗគ្នា។ | | `OMNIROUTE_NADIR_BASE_URL` | `https://api.getnadir.com` | `open-sse/services/autoCombo/nadirStrategy.ts` | ប្រភពមូលដ្ឋានរបស់ API សម្រេចចិត្ត Nadir ដែលត្រូវបានប្រើនៅពេល `config.nadir.baseUrl` ផ្ទាល់របស់ combo មិនបានកំណត់។ ត្រូវការតែសម្រាប់ Nadir ដែលបង្ហោះដោយខ្លួនឯងប៉ុណ្ណោះ ដែលរក្សាផ្នែកដើមនៃប្រអប់បញ្ចូលនៅក្នុងបណ្ដាញផ្ទាល់ខ្លួនរបស់អ្នក។ `/v1` នៅខាងចុងអាចទទួលយកបាន ហើយនឹងត្រូវបានដកចេញ។ | | `OMNIROUTE_API_KEY_WEEKLY_WINDOW` | `provider` | `src/lib/usage/apiKeyUsageLimits.ts` | ចន្លោះពេលប្រចាំសប្ដាហ៍សម្រាប់ដែនកំណត់ការប្រើប្រាស់ជាដុល្លារអាមេរិកតាមកូនសោ API នីមួយៗ (ការអនុវត្តលើសំណើ, `GET /api/keys/{id}/usage-limits`, `@@om-usage`)។ `provider`៖ សប្ដាហ៍បញ្ចប់នៅពេលកំណត់ឡើងវិញប្រចាំសប្ដាហ៍ដំបូងបំផុតក្នុងចំណោមការតភ្ជាប់ទៅប្រភពខាងលើដែលកូនសោអាចចូលដំណើរការ ឬជារយៈពេលរំកិល 7 ថ្ងៃ នៅពេលមិនស្គាល់ពេលកំណត់ឡើងវិញណាមួយ។ `calendar`៖ សប្ដាហ៍តាមម៉ោងក្នុងតំបន់ ចាប់ពីថ្ងៃចន្ទ ម៉ោង 00:00 ដល់ថ្ងៃចន្ទបន្ទាប់ ម៉ោង 00:00 ដែលដូចគ្នាសម្រាប់គ្រប់កូនសោ។ `calendar` ត្រូវបានណែនាំ នៅពេលបណ្ដុំគណនីប្រភពខាងលើមួយត្រូវបានចែករំលែកដោយកូនសោជាច្រើនដែលមានថវិកាដាច់ដោយឡែកពីគ្នា។ តម្លៃមិនត្រឹមត្រូវនឹងត្រឡប់ទៅប្រើ `provider`។ | | `OMNIROUTE_API_KEY_WEEKLY_WINDOW_TIMEZONE` | _(តំបន់ម៉ោងរបស់ដំណើរការ)_ | `src/lib/usage/apiKeyUsageLimits.ts` | តំបន់ម៉ោង IANA (ឧទាហរណ៍ `Asia/Shanghai`) ដែលកំណត់ថ្ងៃចន្ទ ម៉ោង 00:00 សម្រាប់ចន្លោះពេលប្រចាំសប្ដាហ៍ `calendar`។ ប្រសិនបើមិនបានកំណត់ ឬមិនត្រឹមត្រូវ៖ ប្រើតំបន់ម៉ោងរបស់ដំណើរការ OmniRoute (`TZ` របស់ម៉ាស៊ីនមេ ឬកុងតឺន័រ ដែលជាញឹកញាប់មិនបានកំណត់ ពោលគឺម៉ោងសកលសម្របសម្រួល នៅក្នុងរូបភាពកុងតឺន័រ)។ ត្រូវបានមិនអើពើក្នុងមុខងារ `provider`។ | | `OMNIROUTE_MAX_TOOLS_LIMIT` | `128` | `open-sse/config/constants.ts` | ចំនួនអតិបរមាលំនាំដើមនៃឧបករណ៍ដែលអនុញ្ញាតក្នុងសំណើមួយ (លំនាំដើមរបស់ OpenAI)។ អនុញ្ញាតតែចំនួនគត់វិជ្ជមានប៉ុណ្ណោះ; តម្លៃដែលមិនបានកំណត់ ឬមិនត្រឹមត្រូវនឹងរក្សា `128`។ អ្នកផ្ដល់សេវាដែលមានដែនកំណត់ដែលបានដឹង ឬកំណត់ទុកជាមុន (`grok-cli` 200, `nvidia` 1536) នៅតែអនុវត្តដែនកំណត់របស់ខ្លួន — នេះគ្រាន់តែផ្លាស់ប្ដូរពិដានលំនាំដើមប៉ុណ្ណោះ។ | | `OMNIROUTE_PROMPT_EMULATE_TOOLS` | _(បើក)_ | `open-sse/executors/syntxChat.ts` | ការហៅឧបករណ៍ដែលត្រាប់តាមតាមរយៈប្រអប់បញ្ចូលរបស់ SYNTX.ai៖ ប្រសិនបើមិនបានកំណត់ ឬកំណត់ជា `1`/`true`/`on`/`yes` វានឹងបញ្ចូលបញ្ជីឧបករណ៍មូលដ្ឋានទៅក្នុងប្រអប់បញ្ចូល; តម្លៃផ្សេងទៀតណាមួយ (ឧ. `0`) នឹងរំលងការបញ្ចូលនោះ។ | --- ## 7. URLs និងការធ្វើសមកាលកម្ម Cloud | អថេរ | លំនាំដើម | ឯកសារប្រភព | ការពិពណ៌នា | | ---------------------------------------- | --------------------------------------------------------- | ------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `BASE_URL` | `http://localhost:20128` | `src/lib/cloudSync.ts` | URL ខាងម៉ាស៊ីនមេ សម្រាប់ឱ្យការងារធ្វើសមកាលកម្មខាងក្នុងហៅទៅកាន់ `/api/sync/cloud`។ សូមរក្សាវាជា URL បែប loopback/container ទោះបីជាកម្មវិធីត្រូវបានដាក់ឱ្យប្រើជាសាធារណៈតាមរយៈប្រូកស៊ីក៏ដោយ។ | | `CLOUD_URL` | _(ទទេ)_ | `src/lib/cloudSync.ts` | URL ចំណុចចុងនៃ Cloud relay (មុខងារបង់ប្រាក់)។ | | `CLOUD_SYNC_TIMEOUT_MS` | `12000` | `src/lib/cloudSync.ts` | រយៈពេលអស់សុពលភាព HTTP សម្រាប់សំណើធ្វើសមកាលកម្ម Cloud។ | | `OMNIROUTE_BUILD_PROFILE` | `full` | ការកំណត់រចនាសម្ព័ន្ធ build របស់ Webpack | ទម្រង់ build-time (កំណត់ជា `minimal` ដើម្បីដកម៉ូឌុលដែលមានសិទ្ធិពិសេសចេញពី bundle ទាំងស្រុង)។ | | `OMNIROUTE_STANDALONE_DIR` | _លទ្ធផល standalone ក្នុង .build/_ | `scripts/build/colocate-standalone.mjs` | ការកំណត់ជំនួសនៅពេល build សម្រាប់ថតលទ្ធផល standalone ដែលត្រូវបានប្រើដោយជំហាន colocation ក្រោយពេល build។ វាមិនមែនជាការកំណត់ runtime ទេ។ | | `OMNIROUTE_CLOUD_SYNC_SECRET` | _(ទទេ)_ | `src/lib/cloudSync.ts` | Secret រួមដែលប្រើដើម្បីផ្ទៀងផ្ទាត់ហត្ថលេខា HMAC-SHA256 នៃការឆ្លើយតបរបស់ Cloud Sync។ | | `OMNIROUTE_CLOUD_SYNC_SECRETS` | `false` | `src/lib/cloudSync.ts` | កំណត់ជា `true` ដើម្បីអនុញ្ញាតឱ្យចំណុចចុង Cloud Sync សរសេរជាន់លើព័ត៌មានសម្គាល់អត្តសញ្ញាណមូលដ្ឋាន។ លំនាំដើមគឺ `false`។ | | `OMNIROUTE_CLOUD_SYNC_ENFORCE_SIGNATURE` | `false` | `src/lib/cloudSync.ts` | កំណត់ជា `true` ដើម្បីបដិសេធការឆ្លើយតប Cloud Sync ដែលគ្មានហត្ថលេខា នៅពេលគ្មាន secret មូលដ្ឋានត្រូវបានកំណត់ (#13679)។ ហត្ថលេខាដែលមានស្រាប់នឹងត្រូវបានផ្ទៀងផ្ទាត់ជានិច្ច — ហើយត្រូវបានបដិសេធជានិច្ចនៅពេល `OMNIROUTE_CLOUD_SYNC_SECRET` មិនត្រូវបានកំណត់ — ដោយមិនគិតពី flag នេះឡើយ។ លំនាំដើមនឹងប្តូរទៅជាការបង្ខំអនុវត្តនៅក្នុង v3.9។ | | `OMNIROUTE_ZED_IMPORT_LEGACY_ONE_STEP` | `false` | `src/app/api/providers/zed/import/route.ts` | កំណត់ជា `true` ដើម្បីត្រឡប់ទៅប្រើឥរិយាបថ «នាំចូលអ្វីៗទាំងអស់» ក្នុងមួយជំហានរបស់ v3.8.5 ដោយមិនចាំបាច់មានការបញ្ជាក់ពីអ្នកប្រើ។ | | `NEXT_PUBLIC_BASE_URL` | `http://localhost:20128` | OAuth, ផ្ទាំងគ្រប់គ្រង, ការធ្វើសមកាលកម្ម | URL សាធារណៈសម្រាប់ OAuth redirect_uri, តំណផ្ទាំងគ្រប់គ្រង និង URL សាធារណៈដែលបានបង្កើត។ កំណត់វាជា URL សាធារណៈថេរ នៅពេល OAuth callbacks ឬតំណកម្មវិធីរុករកដែលបានបង្កើត ត្រូវប្រើម៉ាស៊ីន reverse-proxy គោល។ | | `NEXT_PUBLIC_CLOUD_URL` | _(ទទេ)_ | ខាង client | ច្បាប់ចម្លងខាង client របស់ `CLOUD_URL`។ | | `NEXT_PUBLIC_APP_URL` | _(មិនបានកំណត់)_ | `src/shared/services/cloudSyncScheduler.ts` | ជម្រើសបម្រុងចាស់សម្រាប់ `NEXT_PUBLIC_BASE_URL`។ | | `NEXT_PUBLIC_PORT` | _(មិនបានកំណត់ — ប្រើ `PORT` ជំនួស)_ | `src/shared/hooks/useDisplayBaseUrl.ts` | ច្រកជម្រើសបម្រុងនៅផ្នែកម៉ាស៊ីនភ្ញៀវសម្រាប់ URL បង្ហាញ នៅពេលមិនស្គាល់ប្រភពដើម (SSR/ការធ្វើតេស្ត); អានមុន `PORT`។ | | `OMNIROUTE_PUBLIC_BASE_URL` | _(មិនបានកំណត់)_ | កម្មវិធីដោះស្រាយប្រភពដើមសាធារណៈ, URL រូបភាព | ប្រភពដើម OmniRoute សម្រាប់កម្មវិធីរុករកដែលមានអាទិភាពខ្ពស់បំផុត ដែលប្រើសម្រាប់បង្កើត URL សាធារណៈ និងផ្ទៀងផ្ទាត់ប្រភពដើមនៃកម្មវិធីរុករកដែលមិនមែនជាផ្ទាំងគ្រប់គ្រង។ កំណត់វានៅពេល OpenWebUI ឬឧបករណ៍បញ្ជូនបន្តផ្សេងទៀតចូលទៅកាន់ OmniRoute តាមរយៈ URL ខាងក្នុង ប៉ុន្តែកម្មវិធីរុករករបស់អ្នកប្រើត្រូវទាញយកមេឌៀដែលបានបង្កើតពី LAN, tunnel ឬប្រភពដើមសាធារណៈ។ **កុំ** បញ្ចូល `/v1`។ | | `OMNIROUTE_PROVIDER_MANIFEST_URL` | _(មិនបានកំណត់)_ | `open-sse/config/providerPluginManifestUrl.ts` | URL ដាច់ខាតនៃ manifest កម្មវិធីជំនួយរបស់អ្នកផ្តល់សេវា ដែលផ្សព្វផ្សាយទៅកាន់ម៉ាស៊ីនភ្ញៀវ sidecar។ នៅពេលមិនបានកំណត់ OmniRoute នឹងទាញយក `/api/v1/provider-plugin-manifest` ពីប្រភពដើមនៃសំណើ ឬ HOST/PORT។ | | `OMNIROUTE_PUBLIC_PROTOCOL` | `http` | `open-sse/config/providerPluginManifestUrl.ts` | ពិធីការដែលប្រើនៅពេលទាញយក URL នៃ manifest កម្មវិធីជំនួយរបស់អ្នកផ្តល់សេវាពី HOST/PORT ដោយគ្មានប្រភពដើមនៃសំណើ។ កំណត់ជា `https` នៅពីក្រោយប្រូកស៊ីសាធារណៈដែលបញ្ចប់ TLS នៅពេលមិនបានកំណត់ `OMNIROUTE_PROVIDER_MANIFEST_URL` ជាក់លាក់។ | | `OMNIROUTE_TRUST_PROXY` | _(មិនបានកំណត់)_ | `src/server/origin/publicOrigin.ts` | របៀបជឿទុកចិត្តស្រេចចិត្តសម្រាប់បឋមកថាប្រភពដើមសាធារណៈដែលបានបញ្ជូនបន្ត។ មិនកំណត់ = កុំជឿទុកចិត្ត `Forwarded` / `X-Forwarded-*` សម្រាប់ការសម្រេចចិត្តផ្នែកសុវត្ថិភាព។ `true` / `loopback` ជឿទុកចិត្ត host/proto ដែលបានបញ្ជូនបន្ត តែពីប្រូកស៊ី loopback ដែលមានសញ្ញាសម្គាល់ token ប៉ុណ្ណោះ។ `private` / `lan` ក៏ជឿទុកចិត្តម៉ាស៊ីនប្រូកស៊ីក្នុងបណ្តាញ LAN ឯកជនផងដែរ ហើយអនុញ្ញាតឱ្យ bridge របស់ `API_PORT` រក្សាទុក `X-Forwarded-For` របស់ម៉ាស៊ីនដូចនោះ។ សម្រាប់ production គួរប្រើ `NEXT_PUBLIC_BASE_URL` ជាក់លាក់។ | | `KIE_CALLBACK_URL` | _(មិនបានកំណត់)_ | `open-sse/utils/kieTask.ts` | URL callback សាធារណៈសម្រាប់ការងារ kie.ai អសមកាល។ ជាការកំណត់ជំនួសដែលមានអាទិភាពខ្ពស់បំផុត មុន `OMNIROUTE_KIE_CALLBACK_URL` និង `OMNIROUTE_PUBLIC_URL`។ | | `OMNIROUTE_KIE_CALLBACK_URL` | _(មិនបានកំណត់)_ | `open-sse/utils/kieTask.ts` | ឈ្មោះជំនួសនៃ `KIE_CALLBACK_URL`។ ប្រើជាជម្រើសបម្រុងនៅពេលអថេរចម្បងមិនបានកំណត់។ | | `OMNIROUTE_PUBLIC_URL` | _(មិនបានកំណត់)_ | `open-sse/utils/kieTask.ts` | ប្រភពដើមសាធារណៈដែលប្រើដើម្បីបង្កើត URL callback អសមកាល។ ជម្រើសបម្រុងដែលមានអាទិភាពទាបបំផុតសម្រាប់ callback របស់ kie.ai; ក៏ប្រើជា URL សាធារណៈទូទៅសម្រាប់ឧបករណ៍បញ្ជូនបន្តផ្សេងទៀតផងដែរ។ | | `OMNIROUTE_CROF_USAGE_URL` | `https://crof.ai/usage_api/` | `open-sse/services/usage.ts` | endpoint សម្រាប់ស្វែងរកកូតា CrofAI ដែលប្រើដោយទំព័រ Usage។ កំណត់ជំនួសសម្រាប់ឧបករណ៍បញ្ជូនបន្ត / fixture សាកល្បង។ | | `OMNIROUTE_CLINEPASS_USAGE_URL` | `https://api.cline.bot/api/v1/users/me/plan/usage-limits` | `open-sse/services/usage/clinepass.ts` | endpoint កូតា 5 ម៉ោង / ប្រចាំសប្តាហ៍ / ប្រចាំខែរបស់ ClinePass ដែលប្រើដោយទំព័រ Usage។ កំណត់ជំនួសសម្រាប់ឧបករណ៍បញ្ជូនបន្ត / fixture សាកល្បង។ | | `OMNIROUTE_OPENCODE_QUOTA_URL` | `https://opencode.ai/zen/go/v1/usage` | `open-sse/services/opencodeQuotaFetcher.ts` | endpoint ផ្លូវការសម្រាប់ការប្រើប្រាស់ OpenCode Go ដែលផ្ទៀងផ្ទាត់ដោយ API key និងប្រើដោយទំព័រ Usage។ កំណត់ជំនួសសម្រាប់ឧបករណ៍បញ្ជូនបន្ត / fixture សាកល្បង។ | | `OPENCODE_SYNTHESIZE_CLI_HEADERS` | `true` | `open-sse/executors/opencode.ts` | បង្កើតបឋមកថាអត្តសញ្ញាណ OpenCode CLI (User-Agent, x-opencode-client/project, UUID នៃសំណើ/សម័យ) លើសំណើ upstream របស់ opencode-go/zen ដែលម៉ាស៊ីនភ្ញៀវមិនបានផ្ញើ ដើម្បីឱ្យ Cloudflare នៅលើច្រកចេញ VPS ទទួលយកពួកវា (#6210/#5997)។ បើកតាមលំនាំដើមចាប់តាំងពី #10571; បិទដោយប្រើ `false`/`0`/`no`/`off`។ | | `OPENCODE_USER_AGENT` | `opencode/1.18.31` | `open-sse/utils/opencodeHeaders.ts` | User-Agent លំនាំដើមដែលត្រូវបានប្រើ នៅពេល `OPENCODE_SYNTHESIZE_CLI_HEADERS` បើក ហើយគ្មានការកំណត់ជាន់លើ `_USER_AGENT` សម្រាប់អ្នកផ្តល់សេវានីមួយៗ។ អនុវត្តចំពោះតែ executor របស់ opencode ប៉ុណ្ណោះ។ នៅលើសំណើដែលគ្មាន key ដែលត្រូវបានទប់ដោយ upstream gate តម្លៃដែលបានកំណត់ដែលមិនមាន `opencode/= 1.17>` នឹងត្រូវបានជំនួសដោយតម្លៃលំនាំដើមនេះ ជាជាងត្រូវបានបដិសេធ។ | | `OMNIROUTE_FORWARD_ATTRIBUTION` | `1` (បើក) | `open-sse/utils/opencodeHeaders.ts` | បញ្ជូនបន្ត header សម្គាល់ប្រភពកម្មវិធី client (`x-session-id`, `x-title`, `http-referer`) ទៅកាន់អ្នកផ្តល់សេវា upstream ដើម្បីឱ្យសំណើដែលចាប់ផ្តើមនៅក្នុង harness ដែលបានរាយបញ្ជី រក្សាអត្តសញ្ញាណរបស់វាឆ្លងកាត់ router (OpenRouter publisher gate ពឹងផ្អែកលើទាំងនេះ)។ `0`/`false`/`no`/`off` រក្សាអត្តសញ្ញាណ registry/operator ហើយបោះបង់តម្លៃដែល client បានផ្តល់។ header ផ្ទាល់ខ្លួនដែល operator បានកំណត់ តែងតែមានអាទិភាពលើតម្លៃរបស់ client។ | | `OPENCODE_CLIENT` | `desktop` | `open-sse/executors/opencode.ts` | តម្លៃសម្រាប់ header `x-opencode-client` ដែលបានសំយោគ នៅពេល `OPENCODE_SYNTHESIZE_CLI_HEADERS` បើក។ | | `OPENCODE_PROJECT` | `global` | `open-sse/executors/opencode.ts` | តម្លៃសម្រាប់ header `x-opencode-project` ដែលបានសំយោគ នៅពេល `OPENCODE_SYNTHESIZE_CLI_HEADERS` បើក។ | | `OMNIROUTE_EGRESS_IP_LOCK_PROVIDERS` | _(មិនបានកំណត់)_ | `open-sse/config/providerErrorRules.ts` | សំណុំអ្នកផ្តល់សេវាដែលមានប្រសិទ្ធភាព ដែលការបរាជ័យ upstream របស់ពួកគេត្រូវបានដាក់ជាក្រុមតាម egress IP (429 មួយ នឹងផ្អាករាល់ការតភ្ជាប់រួមដែលចែករំលែក IP នោះ)។ បើមិនបានកំណត់ វានឹងប្រើតម្លៃលំនាំដើមនៃកម្រិតឥតគិតថ្លៃ `opencode,opencode-go,opencode-cli`; `none`/`off`/`false`/`0` បិទដំណើរការបន្តជាលំដាប់នេះទាំងស្រុង; បញ្ជីដែលបំបែកដោយសញ្ញាក្បៀសនឹងជំនួសសំណុំនេះ។ គម្រោងបង់ប្រាក់ត្រូវបានដាក់ជាក្រុមតាមគណនីនៅ upstream ហើយអាចបិទវាបានដោយសុវត្ថិភាព (#9611)។ | | `OPENCODE_FREE_TIER_REQUEST_CONTRACT` | _(មិនបានកំណត់)_ | `open-sse/executors/opencodeFreeTierContract.ts` | កំណត់ជា `off` ដើម្បីបញ្ឈប់ការកែសម្រួល body នៃសំណើ OpenCode ដែលគ្មាន key (streaming flag និងបញ្ជី tool)។ header នៅតែត្រូវបានអនុវត្ត។ ត្រូវបានអានតាមសំណើនីមួយៗ ដូច្នេះការផ្លាស់ប្តូរមានប្រសិទ្ធភាពភ្លាមៗ។ | | `OPENCODE_FREE_TIER_PLACEHOLDER_TOOLS` | _(មិនបានកំណត់)_ | `open-sse/executors/opencodeFreeTierContract.ts` | ឈ្មោះ tool ដែលបំបែកដោយសញ្ញាក្បៀស ដើម្បីប្រកាសនៅលើសំណើ OpenCode ដែលគ្មាន key និងមិនមាន tool ណាមួយ នៅពេលមិនទាន់មានអ្វីត្រូវបានសង្កេតឃើញសម្រាប់ model នោះ។ តម្លៃទទេនឹងត្រឡប់ទៅប្រើ placeholder តែមួយ ដែល model ត្រូវបានប្រាប់កុំឱ្យហៅប្រើ។ អតិបរមា 32 ធាតុ, `[A-Za-z_][A-Za-z0-9_-]{0,63}`; ធាតុមិនត្រឹមត្រូវត្រូវបានមិនអើពើ។ | | `OMNIROUTE_OLLAMA_CLOUD_USAGE_URL` | `https://ollama.com/settings` | `open-sse/services/usage.ts` | URL ការកំណត់ Ollama Cloud ដែលប្រើសម្រាប់ទាញយកព័ត៌មានកូតា។ កំណត់ជាន់លើសម្រាប់ relay / test fixture។ | | `OLLAMA_USAGE_COOKIE` | _(មិនបានកំណត់)_ | `open-sse/services/usage.ts` | cookie `__Secure-session` របស់ Ollama Cloud ដែលប្រើសម្រាប់ទាញយកព័ត៌មានកូតាពីទំព័រការកំណត់។ ជាព័ត៌មានរសើប; គួរប្រើ field ក្នុង Dashboard សម្រាប់ការតភ្ជាប់នីមួយៗ នៅពេលគណនីច្រើនត្រូវបានកំណត់រចនាសម្ព័ន្ធ។ | | `OLLAMA_CLOUD_USAGE_COOKIE` | _(មិនបានកំណត់)_ | `open-sse/services/usage.ts` | env var ជំនួសសម្រាប់ cookie `__Secure-session` របស់ Ollama Cloud។ ជាព័ត៌មានរសើប; គួរប្រើ field ក្នុង Dashboard សម្រាប់ការតភ្ជាប់នីមួយៗ នៅពេលគណនីច្រើនត្រូវបានកំណត់រចនាសម្ព័ន្ធ។ | | `OMNIROUTE_OLLAMA_USAGE_COOKIE` | _(មិនបានកំណត់)_ | `open-sse/services/usage.ts` | env var ជំនួសសម្រាប់ cookie `__Secure-session` របស់ Ollama Cloud ដែលត្រូវបានប្រើមុន alias ខ្លីៗ។ ជាព័ត៌មានរសើប; គួរប្រើ field ក្នុង Dashboard សម្រាប់ការតភ្ជាប់នីមួយៗ នៅពេលគណនីច្រើនត្រូវបានកំណត់រចនាសម្ព័ន្ធ។ | | `OMNIROUTE_CODEWHISPERER_BASE_URL` | `https://codewhisperer.us-east-1.amazonaws.com` | `open-sse/services/usage.ts` | endpoint កំណត់ការប្រើប្រាស់ CodeWhisperer (AWS Kiro)។ កំណត់ជាន់លើសម្រាប់ relay / test fixture។ | > [!IMPORTANT] > នៅពេលដាក់ឱ្យដំណើរការនៅពីក្រោយ reverse proxy (nginx, Caddy) សូមកំណត់ `NEXT_PUBLIC_BASE_URL` ទៅជា URL សាធារណៈដែលមានស្ថិរភាពរបស់អ្នក (ឧ., `https://omniroute.example.com`) នៅពេល OAuth callbacks ឬតំណសាធារណៈដែលបានបង្កើតត្រូវប្រើ hostname នោះ។ បើគ្មានការកំណត់នេះ OAuth callbacks អាចបរាជ័យ ដោយសារ redirect_uri មិនត្រូវគ្នា ហើយតំណសាធារណៈដែលបានបង្កើតអាចចង្អុលទៅកាន់ origin ខាងក្នុងរបស់ container។ > > រក្សា `BASE_URL` ជា URL ខាងក្នុងបែប loopback/container សម្រាប់កិច្ចការពី server ទៅ server។ កុំប្រើ `Origin` របស់ browser ឬ hostname សាធារណៈសម្រាប់ internal self-fetches ដែលភ្ជាប់មកជាមួយ credentials។ > > ការសរសេរទិន្នន័យលើ dashboard ដែលបានផ្ទៀងផ្ទាត់អត្តសញ្ញាណ មិនតម្រូវឱ្យមាន base URL សាធារណៈថេរទេ៖ dashboard ផ្ញើ unsafe requests ដែលមាន origin ដូចគ្នា ជាមួយនឹង CSRF token ដែលភ្ជាប់នឹង session។ OmniRoute នៅតែគ្រប់គ្រងការផ្ទៀងផ្ទាត់ public-origin ជាកណ្តាល សម្រាប់ browser integrations ដែលមិនមែនជា dashboard៖ env vars សម្រាប់ URL សាធារណៈដែលបានកំណត់យ៉ាងច្បាស់ ត្រូវបានទុកចិត្តជាមុនសិន។ headers `Forwarded` / `X-Forwarded-*` ដើមត្រូវបានមិនអើពើ លុះត្រាតែ `OMNIROUTE_TRUST_PROXY` ត្រូវបានបើក ហើយ proxy peer ផ្ទាល់ត្រូវបានសម្គាល់ដោយ token ថាអាចទុកចិត្តបាន។ កុំប្រើការកំណត់ CORS ដើម្បីដោះស្រាយ requests របស់ dashboard ដែលមាន origin ដូចគ្នា។ CORS គឺសម្រាប់តែ browser clients ដែលឆ្លង origin ប៉ុណ្ណោះ។ --- ## 8. ប្រូកស៊ីចេញក្រៅ បញ្ជូនការហៅទៅកាន់អ្នកផ្តល់សេវា LLM ខាងលើតាមរយៈប្រូកស៊ី HTTP ឬ SOCKS5 ដើម្បីគ្រប់គ្រងចរាចរណ៍ចេញ កំណត់ផ្លូវតាមភូមិសាស្ត្រ ឬលាក់អាសយដ្ឋាន IP។ `OMNIROUTE_UPSTREAM_HTTP2_ENABLED` មានតម្លៃលំនាំដើមជា `true`។ កំណត់វាទៅជា `false`, `0`, `no` ឬ `off` ដើម្បីបង្ខំឱ្យប្រើ HTTP/1.1 លើកម្មវិធីបញ្ជូន Undici នៅក្នុង `open-sse/utils/proxyDispatcher.ts` និង `open-sse/utils/proxyFetch.ts`៖ ការតភ្ជាប់ចេញដោយផ្ទាល់ ប្រូកស៊ី HTTP(S)/SOCKS ការបញ្ជូនបន្ត និង ការព្យាយាមឡើងវិញដោយប្រើសុកខិតថ្មីរបស់វា។ វារក្សាទុកការផ្ទៀងផ្ទាត់វិញ្ញាបនបត្រ TLS ការផ្ទៀងផ្ទាត់អត្តសញ្ញាណ ប្រូកស៊ី ដែនកំណត់ការតភ្ជាប់ និងការកំណត់ keep-alive។ ចាប់ផ្តើម OmniRoute ឡើងវិញបន្ទាប់ពី ផ្លាស់ប្តូរវា ពីព្រោះកម្មវិធីបញ្ជូនត្រូវបានរក្សាទុកក្នុងឃ្លាំងសម្ងាត់ ហើយភ្នាក់ងារបញ្ជូនបន្តត្រូវបានបង្កើតនៅពេលចាប់ផ្តើម។ កុងតាក់នេះមិនគ្រប់គ្រងការក្លែងស្នាមម្រាមដៃ TLS របស់ wreq ឬយន្តការបញ្ជូនជាក់លាក់របស់អ្នកផ្តល់សេវាទេ។ | អថេរ | លំនាំដើម | ឯកសារប្រភព | សេចក្ដីពិពណ៌នា | | ---------------------------------------- | --------------- | ---------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `ENABLE_SOCKS5_PROXY` | `true` | `open-sse/executors` | បើកប្រើភ្នាក់ងារ proxy SOCKS5 សម្រាប់ការហៅទៅ upstream។ បិទដោយប្រើ `false`។ | | `NEXT_PUBLIC_ENABLE_SOCKS5_PROXY` | `true` | ផ្នែក client | ការយល់ដឹងនៅផ្នែក client អំពីភាពអាចប្រើបាននៃ SOCKS5។ | | `PROXY_SKIP_RECENTLY_FAILED` | `true` | `src/shared/utils/featureFlags.ts` | feature flag ដែលបើកតាមលំនាំដើម (សូមមើល [FEATURE_FLAGS.md](./FEATURE_FLAGS.md); ការកំណត់ជំនួសក្នុង DB របស់ dashboard មានអាទិភាព)។ ក្រុម proxy និងការប្ដូរវេនតាមគណនី នឹងឈប់ផ្ដល់សមាជិកដែលទើបតែបរាជ័យម្ដងទៀត (ការស្ទង់ TCP ត្រូវបានបដិសេធ ឬមាន 429 តាមរយៈវា) ក្នុងរយៈពេលមួយដែលកើនទ្វេដងរាល់ពេលកើតឡើងម្ដងទៀត រហូតដល់កម្រិតអតិបរមា។ `false` ស្ដារការជ្រើសរើសធម្មតាវិញ។ | | `SELECTOR_CONTROL_ALLOWLIST` | _(unset)_ | `src/lib/proxySubscription/selectorGuard.ts` | បញ្ជីអនុញ្ញាតសម្រាប់គោលដៅគ្រប់គ្រង selector របស់ local-core ដែលលើសពី loopback (host ឬ IP ដែលបំបែកដោយសញ្ញាក្បៀស/ដកឃ្លា, `*` បើក LAN/private ប៉ុន្តែមិនបើក metadata/link-local ឡើយ)។ Loopback តាមរយៈ http/https ត្រូវបានអនុញ្ញាតតាមលំនាំដើម។ តម្លៃក្នុង DB របស់ dashboard មានអាទិភាពលើអថេរនេះ នៅពេលវាត្រូវបានកំណត់ និងមិនទទេ។ | | `PROXY_QUOTA_429_BASE_MS` | `300000` | `open-sse/utils/proxyRefusalMemory.ts` | រយៈពេលមូលដ្ឋាន (ms) នៃការដាក់ 429 ដោយឡែក ដែលកើនទ្វេដងរាល់ពេលកើតឡើងម្ដងទៀត។ អានតែម្ដងនៅពេលចាប់ផ្ដើម។ កំណត់ក្នុងចន្លោះ `1000..3600000`; តម្លៃក្រៅចន្លោះ ឬមិនអាចអានបាន នឹងត្រឡប់ទៅតម្លៃលំនាំដើមវិញជាមួយនឹងការព្រមាន។ | | `PROXY_QUOTA_429_MAX_MS` | `900000` | `open-sse/utils/proxyRefusalMemory.ts` | កម្រិតអតិបរមា (ms) នៃការដាក់ 429 ដោយឡែក។ អានតែម្ដងនៅពេលចាប់ផ្ដើម។ កំណត់ក្នុងចន្លោះ `1000..3600000`; តម្លៃក្រៅចន្លោះ ឬមិនអាចអានបាន នឹងត្រឡប់ទៅតម្លៃលំនាំដើមវិញជាមួយនឹងការព្រមាន។ នៅពេលកម្រិតអតិបរមាទាបជាងតម្លៃមូលដ្ឋាន វានឹងត្រឡប់ទៅតម្លៃលំនាំដើមវិញ។ ការបន្ថយកម្រិតអតិបរមាក៏កាត់បន្ថយរយៈពេលចងចាំលំដាប់បរាជ័យផងដែរ៖ ធាតុត្រូវបានលុបចេញនៅ `2 x max` បន្ទាប់ពីផុតកំណត់។ | | `PROXY_POOL_SHARED_EGRESS_ORDER` | `false` | `src/shared/utils/featureFlags.ts` | feature flag ដែលត្រូវជ្រើសរើសបើក (សូមមើល [FEATURE_FLAGS.md](./FEATURE_FLAGS.md); ការកំណត់ជំនួសក្នុង DB របស់ dashboard មានអាទិភាព)។ សម្រាប់អ្នកផ្ដល់សេវាដែល quota របស់ពួកគេត្រូវបានដាក់ជាក្រុមតាមអាសយដ្ឋាន egress សមាជិកក្នុងក្រុមដែលប្រើអាសយដ្ឋាន egress ដែលបានសង្កេតឃើញដូចគ្នានឹងសមាជិកដែលទើបត្រូវបានបដិសេធ នឹងត្រូវដាក់លំដាប់នៅក្រោមសមាជិកដែលមានសុខភាពល្អបន្តិច។ គ្រាន់តែរៀបលំដាប់ប៉ុណ្ណោះ មិនដកចេញឡើយ។ ត្រូវការ `PROXY_SKIP_RECENTLY_FAILED` ដែលបង្កើតសញ្ញាបដិសេធដែលវាអាន។ | | `PROXY_WEBHOOK_REBOUND_MS` | `300000` | `src/lib/proxyEvents/proxyTransitionBridge.ts` | ចន្លោះពេល rebound (ms) ដែលកំណត់ការជូនដំណឹង webhook `proxy.set_aside` ដដែលៗសម្រាប់សមាជិកនីមួយៗក្នុងក្រុម ដើម្បីឱ្យការបដិសេធជាបន្តបន្ទាប់ផ្ញើត្រឹមតែព្រឹត្តិការណ៍មួយ។ អានរាល់ពេល emit។ កំណត់ក្នុងចន្លោះ `1000..3600000`; តម្លៃក្រៅចន្លោះ ឬមិនអាចអានបាន នឹងត្រឡប់ទៅតម្លៃលំនាំដើមវិញដោយស្ងៀមស្ងាត់។ | | `HTTP_PROXY` | _(unset)_ | ស្តង់ដារ Node.js | HTTP proxy សម្រាប់ការហៅទៅ upstream។ | | `HTTPS_PROXY` | _(unset)_ | ស្តង់ដារ Node.js | HTTPS proxy សម្រាប់ការហៅទៅ upstream។ | | `ALL_PROXY` | _(unset)_ | ស្តង់ដារ Node.js | proxy សកល (គាំទ្រ `socks5://`)។ | | `OMNIROUTE_PROXY_ECHO_URL` | _(មិនបានកំណត់)_ | `src/lib/proxyEchoTarget.ts` | កំណត់គោលដៅ echo-IP ដែលប្រើដោយការស្ទង់សាកល្បង proxy egress ទៅ URL តែមួយ។ នៅពេលមិនបានកំណត់ ការស្ទង់សាកល្បងនឹងសាកល្បង `api64.ipify.org` រួចបន្ទាប់មក `api4.ipify.org` ដើម្បីកុំឱ្យ tunnel ដែលគាំទ្រតែ IPv4 ត្រូវបានរាយការណ៍ថាមិនដំណើរការ (#9694)។ | | `NO_PROXY` | _(មិនបានកំណត់)_ | ស្តង់ដារ Node.js | ឈ្មោះម៉ាស៊ីន/IP ដែលបំបែកដោយសញ្ញាក្បៀស ដើម្បីរំលង proxy។ | | `OMNIROUTE_PROXY_DISPATCHER_CONNECTIONS` | `32` | `open-sse/utils/proxyDispatcher.ts` | ចំនួន socket ដំណាលគ្នាអតិបរមាសម្រាប់ HTTP/SOCKS proxy dispatcher នីមួយៗដែលបានរក្សាទុកក្នុង cache។ ស្ទ្រីម SSE ដែលមានអាយុកាលវែង ដូចជា Codex `/v1/responses` ត្រូវការការតភ្ជាប់ច្រើនជាងមួយ នៅពេលសំណើជាច្រើនប្រើ proxy កម្រិតគណនីដូចគ្នា។ តម្លៃលើសពី `256` ត្រូវបានកំណត់ត្រឹមកម្រិតនេះ។ | | `SOCKS_HANDSHAKE_TIMEOUT_MS` | `10000` | `open-sse/utils/socksConnectorWithFamily.ts` | ពេលអស់កំណត់នៃ SOCKS5 handshake (ការតភ្ជាប់) គិតជាមិល្លីវិនាទី។ បង្កើនវា នៅពេលម៉ាស៊ីន residential gateway តែមួយរងការភ្ជាប់ដំណាលគ្នាខ្ពស់ (ឧ. សំណើ 100 ក្នុងពេលតែមួយ) — handshake ពិតប្រាកដអាចលើសពី 10 វិនាទីនៅក្រោម pool ដែលប្រើប្រាស់ពេញសមត្ថភាព ទោះបីជា proxy អាចចូលប្រើបានក៏ដោយ ដែលបើមិនដូច្នោះទេ នឹងបង្ហាញជាកំហុសមិនពិត `[Proxy Fast-Fail] Proxy unreachable`។ កំណត់អតិបរមាត្រឹម `120000`។ | | `PROXY_FAIL_OPEN` | `false` | `src/sse/handlers/chatHelpers.ts` | នៅពេល `false` (លំនាំដើម) សំណើដែល proxy ដែលបានកំណត់ឱ្យវាមិនអាច resolve បាន នឹងត្រូវបាន **បដិសេធ (fail-closed)** ជំនួសឱ្យការត្រឡប់ទៅប្រើការតភ្ជាប់ផ្ទាល់ — វាការពារការលេចធ្លាយ IP ពិត។ កំណត់ជា `true` ដើម្បីស្ដារ DIRECT fallback ចាស់។ | | `ENABLE_TLS_FINGERPRINT` | `false` | `open-sse/executors` | ក្លែងបន្លំ TLS fingerprint ដោយប្រើ wreq-js (ធ្វើត្រាប់តាម Chrome 124)។ ទប់ទល់នឹងការទប់ស្កាត់ JA3/JA4។ | | `TLS_FINGERPRINT_PROVIDERS` | _(មិនបានកំណត់)_ | `open-sse/utils/proxyFetch.ts` | បញ្ជីអនុញ្ញាត provider ដែលបំបែកដោយសញ្ញាក្បៀស សម្រាប់ការកំណត់ផ្លូវ TLS តាម proxy ថ្មី (`open-sse/utils/proxyFetch.ts`)។ TLS ផ្ទាល់រក្សាឥរិយាបថចាស់របស់វា នៅពេលមិនបានកំណត់; មានតែ provider ទាំងនេះប៉ុណ្ណោះដែលត្រូវបានកំណត់ផ្លូវតាមរយៈ Chrome-124 fingerprint bridge។ Groq (`api.groq.com`) ត្រូវបានដកចេញ ទោះបីជាបញ្ជីអនុញ្ញាតមិនបានកំណត់ក៏ដោយ ព្រោះ Chrome JA3 បង្កឱ្យ Cloudflare 1010 ខណៈដែល undici ដើមអាចចូលដល់ API បាន។ | | `OMNIROUTE_TURNSTILE_IGNORE_TLS_ERRORS` | `false` | `open-sse/services/claudeTurnstileSolver.ts` | អនុញ្ញាតឱ្យ browser context របស់ Claude Turnstile Playwright មិនអើពើនឹងកំហុសវិញ្ញាបនបត្រ HTTPS។ | ### សេណារីយ៉ូ | សេណារីយ៉ូ | ការកំណត់រចនាសម្ព័ន្ធ | | ----------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------- | | **SOCKS5 តាមរយៈ SSH tunnel** | `ALL_PROXY=socks5://127.0.0.1:7890`, `ENABLE_SOCKS5_PROXY=true` | | **HTTP proxy របស់សាជីវកម្ម** | `HTTP_PROXY=http://proxy.corp.com:3128`, `HTTPS_PROXY=http://proxy.corp.com:3128`, `NO_PROXY=localhost,internal.corp.com` | | **ការប្រឆាំង fingerprint** | `ENABLE_TLS_FINGERPRINT=true` — ត្រូវការ `wreq-js` (បានរួមបញ្ចូល) | | **គ្រប់គ្រង egress / គ្មានសិទ្ធិចូលប្រើផ្ទាល់** | ទុក `PROXY_FAIL_OPEN=false` (លំនាំដើម)។ សំណើនឹងបរាជ័យភ្លាមៗ នៅពេល proxy មិនអាចប្រើបាន ជំនួសឱ្យការលេចធ្លាយតាមការតភ្ជាប់ផ្ទាល់។ | | **ចាស់ / dev — អនុញ្ញាត direct fallback** | `PROXY_FAIL_OPEN=true`។ ស្ដារឥរិយាបថមុនការពង្រឹងសុវត្ថិភាព៖ ប្រើការតភ្ជាប់ផ្ទាល់ នៅពេលការ resolve proxy បរាជ័យ។ | > **ចំណាំ (ការរំលងការផ្ទៀងផ្ទាត់ NVIDIA — #3226)៖** endpoint សម្រាប់ផ្ទៀងផ្ទាត់ API key របស់ NVIDIA > ជាប់គាំង នៅពេលកំណត់ផ្លូវតាម global proxy/TLS-patched fetch (undici dispatcher → 504)។ > `src/lib/providers/validation.ts::directHttpsRequest()` រំលង > proxy patch ដោយចេតនាសម្រាប់ការហៅផ្ទៀងផ្ទាត់តែមួយនោះ ដោយប្រើ `safeOutboundFetch({ bypassProxyPatch: true })`។ > នេះគឺជាករណីលើកលែងដែលមានឯកសារបញ្ជាក់ និងមានវិសាលភាពកំណត់ — វា **មិន** ប៉ះពាល់ដល់ chat/usage egress ទេ។ > វិសាលភាពនៃការរំលងត្រូវបានកំណត់ដោយ `tests/unit/proxy-bypass-scope-guard-3226.test.ts`។ --- ## 9. ការរួមបញ្ចូលឧបករណ៍ CLI គ្រប់គ្រងរបៀបដែល OmniRoute ស្វែងរក និងដំណើរការ CLI sidecars (Claude Code, Codex ជាដើម)។ | អថេរ | លំនាំដើម | ឯកសារប្រភព | សេចក្ដីពិពណ៌នា | | --------------------------------- | -------------------------------- | --------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `CLI_MODE` | `auto` | `src/shared/services/cliRuntime.ts` | `auto` = ស្វែងរកក្នុង PATH របស់ប្រព័ន្ធ; `manual` = ប្រើតែ path ដែលបានបញ្ជាក់ច្បាស់លាស់ប៉ុណ្ណោះ។ | | `CLI_EXTRA_PATHS` | _(មិនបានកំណត់)_ | `src/shared/services/cliRuntime.ts` | ធាតុ PATH បន្ថែមសម្រាប់ការស្វែងរក binary របស់ CLI (បំបែកដោយសញ្ញា colon)។ | | `CLI_CONFIG_HOME` | _(មិនបានកំណត់)_ | `src/shared/services/cliRuntime.ts` | កំណត់ជំនួសថត home សម្រាប់អានការកំណត់រចនាសម្ព័ន្ធ CLI (`~/.claude`, `~/.codex`)។ ត្រូវតែជា path ដាច់ខាត និងស្ថិតនៅក្នុង home របស់ process — **ឬ** ក្នុង container ជា path ដែលបាន bind-mount (នោះគឺជារបៀបដែល `/host-home` ដំណើរការ)។ អ្វីផ្សេងទៀតនឹងត្រឡប់ទៅប្រើថត home វិញ។ | | `CLI_ALLOW_CONFIG_WRITES` | `true` | `src/shared/services/cliRuntime.ts` | អនុញ្ញាតឱ្យ OmniRoute សរសេរឯកសារកំណត់រចនាសម្ព័ន្ធ CLI (ការធ្វើឱ្យ token ថ្មីឡើងវិញ ទិន្នន័យ session)។ កំណត់ជា `false` ដើម្បីធ្វើឱ្យរាល់ការសរសេរការកំណត់រចនាសម្ព័ន្ធ CLI បរាជ័យជាមួយកំហុស "ការសរសេរត្រូវបានបិទ" យ៉ាងច្បាស់លាស់។ | | `CLI_CLAUDE_BIN` | `claude` | `src/shared/services/cliRuntime.ts` | path ផ្ទាល់ខ្លួនទៅកាន់ binary របស់ Claude CLI។ | | `CLI_CODEX_BIN` | `codex` | `src/shared/services/cliRuntime.ts` | path ផ្ទាល់ខ្លួនទៅកាន់ binary របស់ Codex CLI។ | | `CLI_DROID_BIN` | `droid` | `src/shared/services/cliRuntime.ts` | path ផ្ទាល់ខ្លួនទៅកាន់ binary របស់ Droid CLI។ | | `CLI_OPENCLAW_BIN` | `openclaw` | `src/shared/services/cliRuntime.ts` | path ផ្ទាល់ខ្លួនទៅកាន់ binary របស់ OpenClaw CLI។ | | `CLI_CURSOR_BIN` | `agent`, បន្ទាប់មក `cursor` | `src/shared/services/cliRuntime.ts` | path ផ្ទាល់ខ្លួនទៅកាន់ binary របស់ Cursor agent។ បើគ្មានវា ការរកឃើញនឹងសាកល្បង `agent` ជាមុន ហើយប្តូរទៅ `cursor` ប្រសិនបើមិនបានសម្រេច។ | | `CLI_CLINE_BIN` | `cline` | `src/shared/services/cliRuntime.ts` | path ផ្ទាល់ខ្លួនទៅកាន់ binary របស់ Cline CLI។ | | `CLI_5DIVE_BIN` | `5dive` | `src/shared/services/cliRuntime.ts` | path ផ្ទាល់ខ្លួនទៅកាន់ binary របស់ 5dive CLI។ | | `CLI_5DIVE_STATE_DIR` | `/var/lib/5dive` | `src/shared/services/cliRuntime.ts` | ថតស្ថានភាពប្រព័ន្ធរបស់ 5dive (ប្រវត្តិរូបផ្ទៀងផ្ទាត់ដែលគ្រប់គ្រងដោយ root); ឆ្លុះបញ្ចាំងពីលំនាំដើម STATE_DIR របស់ 5dive ផ្ទាល់។ | | `CLI_CONTINUE_BIN` | `cn` | `src/shared/services/cliRuntime.ts` | path ផ្ទាល់ខ្លួនទៅកាន់ binary របស់ Continue CLI។ | | `CLI_QODER_BIN` | `qodercli` | `src/shared/services/cliRuntime.ts` | path ផ្ទាល់ខ្លួនទៅកាន់ binary របស់ Qoder CLI។ | | `CLI_QWEN_BIN` | `qwen` | `src/shared/services/cliRuntime.ts` | path ផ្ទាល់ខ្លួនទៅកាន់ binary របស់ Qwen Code CLI។ | | `CLI_AIDER_BIN` | `aider` | `src/shared/services/cliRuntime.ts` | path ផ្ទាល់ខ្លួនទៅកាន់ binary របស់ Aider CLI។ | | `CLI_GOOSE_BIN` | `goose` | `src/shared/services/cliRuntime.ts` | path ផ្ទាល់ខ្លួនទៅកាន់ binary របស់ Goose CLI។ | | `CLI_GEMINI_BIN` | `gemini` | `src/shared/services/cliRuntime.ts` | path ផ្ទាល់ខ្លួនទៅកាន់ binary របស់ Google Gemini CLI — សម្រាប់តែការរកឃើញ/ការត្រួតពិនិត្យស្ថានភាពនៅផ្នែក server ប៉ុណ្ណោះ; `omniroute run gemini` កំណត់ទីតាំង binary `gemini` ពី PATH របស់ប្រព័ន្ធ។ | | `CLI_KILO_BIN` | `kilocode` | `src/shared/services/cliRuntime.ts` | path ផ្ទាល់ខ្លួនទៅកាន់ binary របស់ Kilo Code CLI។ | | `CLI_OPENCODE_BIN` | `opencode` | `src/shared/services/cliRuntime.ts` | path ផ្ទាល់ខ្លួនទៅកាន់ binary របស់ OpenCode CLI។ | | `CLI_HERMES_BIN` | `hermes` | `src/shared/services/cliRuntime.ts` | ផ្លូវផ្ទាល់ខ្លួនទៅកាន់ binary របស់ Hermes។ ប្រើរួមគ្នាដោយធាតុទាំងពីរក្នុងកាតាឡុក (`hermes` និង `hermes-agent`)។ | | `CLI_FORGE_BIN` | `forge` | `src/shared/services/cliRuntime.ts` | ផ្លូវផ្ទាល់ខ្លួនទៅកាន់ binary របស់ ForgeCode CLI។ | | `CLI_JCODE_BIN` | `jcode` | `src/shared/services/cliRuntime.ts` | ផ្លូវផ្ទាល់ខ្លួនទៅកាន់ binary របស់ jcode CLI។ | | `CLI_DEEPSEEK_TUI_BIN` | `deepseek-tui` | `src/shared/services/cliRuntime.ts` | ផ្លូវផ្ទាល់ខ្លួនទៅកាន់ binary របស់ DeepSeek TUI។ | | `CLI_CODEWHALE_BIN` | `codewhale` | `src/shared/services/cliRuntime.ts` | ផ្លូវផ្ទាល់ខ្លួនទៅកាន់ binary របស់ CodeWhale CLI។ | | `CLI_SMELT_BIN` | `smelt` | `src/shared/services/cliRuntime.ts` | ផ្លូវផ្ទាល់ខ្លួនទៅកាន់ binary របស់ Smelt CLI។ | | `CLI_PI_BIN` | `pi` | `src/shared/services/cliRuntime.ts` | ផ្លូវផ្ទាល់ខ្លួនទៅកាន់ binary របស់ Pi (pi-coding-agent)។ | | `CLI_CRUSH_BIN` | `crush` | `src/shared/services/cliRuntime.ts` | ផ្លូវផ្ទាល់ខ្លួនទៅកាន់ binary របស់ Crush CLI។ | | `CLI_OMP_BIN` | `omp` | `src/shared/services/cliRuntime.ts` | ផ្លូវផ្ទាល់ខ្លួនទៅកាន់ binary របស់ភ្នាក់ងារ Oh My Pi (`omp`)។ | | `CLI_LETTA_BIN` | `letta` | `src/shared/services/cliRuntime.ts` | ផ្លូវផ្ទាល់ខ្លួនទៅកាន់ binary របស់ Letta CLI។ | | `CLI_PRIME_AGENT_BIN` | `prime-agent` | `src/shared/services/cliRuntime.ts` | ផ្លូវផ្ទាល់ខ្លួនទៅកាន់ binary របស់ Prime Agent (Prime Intellect)។ | | `CLI_WINDSURF_BIN` | _(គ្មាន)_ | `src/shared/services/cliRuntime.ts` | ផ្លូវផ្ទាល់ខ្លួនទៅកាន់ binary របស់ Windsurf។ Windsurf **មិនមាន command លំនាំដើមទេ** — ការរកឃើញ binary នឹងនៅតែបិទ រហូតដល់តម្លៃនេះត្រូវបានកំណត់។ | | `CLI_DEVIN_BIN` | `devin` | `open-sse/executors/devin-cli.ts` | ផ្លូវផ្ទាល់ខ្លួនទៅកាន់ binary របស់ Devin CLI (v3.8.0)។ ប្រើដោយ executor របស់ Windsurf/Devin។ | | `DEVIN_DESKTOP_VERSION` | `3.6.27` | `open-sse/executors/devin-desktop.ts` | `ide_version` របស់ Devin Desktop។ តម្លៃជំនួសត្រូវប្រើទម្រង់ `x.y.z`; តម្លៃមិនត្រឹមត្រូវនឹងត្រឡប់ទៅប្រើតម្លៃលំនាំដើមដែលបានផ្ទៀងផ្ទាត់។ | | `DEVIN_DESKTOP_EXTENSION_VERSION` | `1.48.2` | `open-sse/executors/devin-desktop.ts` | `extension_version` របស់ Codeium/language-server ដែលបានរួមបញ្ចូល ដែលខុសពី `ide_version` របស់ Desktop។ តម្លៃជំនួសត្រូវប្រើ `x.y.z`; តម្លៃមិនត្រឹមត្រូវនឹងប្រើតម្លៃលំនាំដើមដែលបានរួមបញ្ចូល។ | | `CLI_DEVIN_AGENTIC_BIN` | `devin` | `open-sse/executors/devin-cli-agentic.ts` | តម្លៃជំនួស Devin CLI សម្រាប់តែ agentic bridge ប៉ុណ្ណោះ។ executor ទទួលយកតែ upstream ACP stdio ក្នុងម៉ាស៊ីនប៉ុណ្ណោះ។ | | `DEVIN_AGENTIC_HOME` | _(តម្រូវឱ្យមាន)_ | `open-sse/executors/devin-cli-agentic.ts` | home ដាច់ដោយឡែកជាផ្លូវដាច់ខាតសម្រាប់ subprocess របស់ agentic Devin; ផ្លូវ bridge ដែលទទួលយកគឺ `/home/bridge` និងផ្លូវ `.sandbox` ក្នុង task (នៅលើ Windows គឺ `C:\...\.sandbox\...`)។ | | `DEVIN_AGENTIC_ACP_TIMEOUT_MS` | `120000` | `open-sse/executors/devin-cli-agentic.ts` | រយៈពេលអតិបរមានៃជុំ Devin ACP មួយ មុនពេល bridge បញ្ចប់ child process ហើយត្រឡប់ timeout ជាក់លាក់។ | | `DEVIN_BRIDGE_MODEL` | `devin-cli-agentic/swe-1-7` | `docker/devin-bridge/compose.yml` | alias ម៉ូដែល Claude Code ចម្បងសម្រាប់ bridge ដាច់ដោយឡែក។ live harness ជំនួសឧទាហរណ៍នេះដោយម៉ូដែលដែលត្រឡប់មកពីគណនី Devin បច្ចុប្បន្ន។ | | `DEVIN_BRIDGE_SONNET_MODEL` | `DEVIN_BRIDGE_MODEL` | `docker/devin-bridge/compose.yml` | alias របស់ bridge ដាច់ដោយឡែក ដែលប្រើនៅពេល Claude Code ស្នើសុំលំនាំដើម Sonnet របស់វា។ | | `DEVIN_BRIDGE_OPUS_MODEL` | `DEVIN_BRIDGE_MODEL` | `docker/devin-bridge/compose.yml` | alias របស់ bridge ដាច់ដោយឡែក ដែលប្រើនៅពេល Claude Code ស្នើសុំលំនាំដើម Opus របស់វា។ | | `DEVIN_BRIDGE_HAIKU_MODEL` | `DEVIN_BRIDGE_MODEL` | `docker/devin-bridge/compose.yml` | alias របស់ bridge ដាច់ដោយឡែក ដែលប្រើនៅពេល Claude Code ស្នើសុំលំនាំដើម Haiku របស់វា។ | | `DEVIN_BRIDGE_SUBAGENT_MODEL` | `DEVIN_BRIDGE_MODEL` | `docker/devin-bridge/compose.yml` | alias របស់ bridge ដាច់ដោយឡែក ដែលប្រើសម្រាប់ subagent របស់ Claude Code។ | | `DEVIN_SEAT_API_URL` | `https://server.codeium.com` | `open-sse/services/usage/devinCli.ts` | ជម្រើសកំណត់ជំនួសសម្រាប់ API គ្រប់គ្រង seat របស់ Codeium ដែលប្រើដោយកូតា Devin CLI (`GetUserStatus`)។ | | `AUGGIE_BIN` | `auggie` | `open-sse/executors/auggie.ts` | ជម្រើសកំណត់ជំនួសជា absolute path សម្រាប់ CLI binary របស់ Augment (Auggie) ដែលប្រើដោយ provider មូលដ្ឋាន `auggie`។ ប្រសិនបើមិនកំណត់ វានឹងប្រើ `CLI_AUGGIE_BIN` ហើយបន្ទាប់មកស្វែងរកក្នុង PATH។ | | `CLI_AUGGIE_BIN` | `auggie` | `open-sse/executors/auggie.ts` | ជម្រើសកំណត់ជំនួស alias សម្រាប់ path របស់ Augment (Auggie) CLI binary (ត្រូវបានពិនិត្យបន្ទាប់ពី `AUGGIE_BIN`)។ | | `ZCODE_BIN` | `zcode` | `open-sse/executors/zcode.ts` | Binary ដែលប្រើសម្រាប់ stdio client របស់ provider មូលដ្ឋាន `zcode`។ ប្រសិនបើមិនកំណត់ វានឹងប្រើ `zcode` ក្នុង PATH។ | | `ZCODE_ARGS` | — | `open-sse/executors/zcode.ts` | Array JSON (≤16 strings) នៃ argument បន្ថែមដែលត្រូវបញ្ជូនទៅ binary `zcode` នៅពេលដំណើរការតាមរយៈ `cliTools`។ | | `ZCODE_CWD` | `process.cwd()` | `open-sse/executors/zcode.ts` | ថតការងារសម្រាប់ subprocess របស់ ZCode app-server។ | | `ZCODE_PROVIDER_ID` | `builtin:zai-coding-plan` | `open-sse/executors/zcode.ts` | ជម្រើសកំណត់ជំនួសសម្រាប់ provider id ដែលផ្ញើទៅ app-server។ | | `ZCODE_SERVER_RUNTIME_ROOT` | `~/.zcode/server` | `open-sse/executors/zcode.ts` | Root នៃ runtime របស់ ZCode app-server (ជាទីតាំងដែល `node` និង `zcode-server.cjs` ដែលបានរួមបញ្ចូលស្ថិតនៅ)។ | | `ZCODE_SERVER_NODE` | `/node` | `open-sse/executors/zcode.ts` | Node executable ដែលប្រើសម្រាប់ដំណើរការ ZCode app-server។ | | `ZCODE_SERVER_ENTRY` | `/zcode-server.cjs` | `open-sse/executors/zcode.ts` | Entry script របស់ app-server ដែលប្រើសម្រាប់ដំណើរការ ZCode server។ | | `ZCODE_STARTUP_TIMEOUT_MS` | `10000` | `open-sse/executors/zcode.ts` | រយៈពេលអតិបរមាសម្រាប់ការចាប់ផ្ដើម (ms) មុនពេលការដំណើរការ ZCode app-server ត្រូវបានចាត់ទុកថាបរាជ័យ។ | | `ZCODE_RPC_TIMEOUT_MS` | `30000` | `open-sse/executors/zcode.ts` | រយៈពេលអតិបរមា RPC ក្នុងមួយសំណើ (ms) សម្រាប់ការហៅ ZCode app-server។ | | `ZCODE_TURN_TIMEOUT_MS` | `120000` | `open-sse/executors/zcode.ts` | រយៈពេលអតិបរមា (ms) នៃវេន ZCode មួយ មុនពេល supervisor បញ្ចប់វាដោយសារអស់ពេល។ | | `ZCODE_POLL_INTERVAL_MS` | `250` | `open-sse/executors/zcode.ts` | ចន្លោះពេល polling (ms) សម្រាប់ពិនិត្យការបញ្ចប់វេន ZCode។ | | `HERMES_HOME` | `~/.hermes` | `src/lib/cli-helper/config-generator/hermesHome.ts` | ថត home របស់ Hermes Agent ដែល OmniRoute អាន/សរសេរ config របស់ Hermes CLI។ ត្រូវគ្នានឹង env var ដែលកម្មវិធីដំឡើង Hermes PowerShell កំណត់លើ Windows (`%LOCALAPPDATA%\hermes`)។ | ### ការធ្វើសមកាលកម្ម Profile របស់ CLI ដោយស្វ័យប្រវត្តិ Feature flag ទាំងនេះត្រូវតែបើកប្រើដោយចេតនា ហើយតាមលំនាំដើមគឺបិទ។ វាក៏អាចត្រូវបានបិទបើកពី ផ្ទាំងគ្រប់គ្រង CLI Code ផងដែរ។ | អថេរ | លំនាំដើម | ឯកសារប្រភព | ការពិពណ៌នា | | ------------------------------------- | -------- | ------------------------------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `OMNIROUTE_AUTO_SYNC_CODEX_PROFILES` | `false` | `src/shared/constants/featureFlagDefinitions.ts` | បន្ទាប់ពីការធ្វើសមកាលកម្ម model របស់ provider វានឹងសរសេរឯកសារ profile `~/.codex/*.config.toml` ឡើងវិញដោយស្វ័យប្រវត្តិពី catalog បច្ចុប្បន្ន។ តម្រូវឱ្យមាន `CLI_ALLOW_CONFIG_WRITES`; វាមិនផ្លាស់ប្ដូរ config Codex ដែលសកម្ម/លំនាំដើម, auth, ការកំណត់ Codex-lb ឬជម្រើស provider ឡើយ។ | | `OMNIROUTE_AUTO_SYNC_CLAUDE_PROFILES` | `false` | `src/shared/constants/featureFlagDefinitions.ts` | បន្ទាប់ពីការធ្វើសមកាលកម្ម model របស់ provider វានឹងសរសេរឯកសារ Claude Code profile `~/.claude/profiles//settings.json` ឡើងវិញដោយស្វ័យប្រវត្តិពី catalog បច្ចុប្បន្ន។ តម្រូវឱ្យមាន `CLI_ALLOW_CONFIG_WRITES`; វាមិនផ្លាស់ប្ដូរ config Claude ដែលសកម្ម/លំនាំដើម, auth ឬជម្រើស provider ឡើយ។ | ### ឧទាហរណ៍ Docker ```bash # Mount binary របស់ host ចូលក្នុង container ហើយប្រាប់ OmniRoute អំពីទីតាំងរបស់វា៖ 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` មានប្រសិទ្ធភាពតែនៅពេលដែល path នោះពិតជាត្រូវបាន bind-mount ពី host ប៉ុណ្ណោះ — ប្រើវាជាមួយ mount ដូចជា `~/.codex:/host-home/.codex:rw` (សូមមើល profile `host` នៅក្នុង `docker-compose.yml`)។ Path ដែលមិនស្ថិតនៅក្នុង home របស់អ្នកប្រើ ក្នុង container ហើយក៏មិនមែនជា bind mount នឹងត្រូវបានមិនអើពើ ព្រោះទិន្នន័យដែលសរសេរនៅទីនោះ នឹងត្រូវបោះបង់នៅពេល container ត្រូវបានបង្កើតឡើងវិញ។ Image ដំណើរការជា `USER node` ដូច្នេះ `/root` ដែលមិនបាន mount **មិនមែនជា** override ដែលត្រឹមត្រូវទេ។ | អថេរ | លំនាំដើម | ឯកសារប្រភព | សេចក្ដីពិពណ៌នា | | ---------------------------------------- | ----------------- | ----------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------- | | `OMNIROUTE_CONTAINER` | _(ស្វ័យប្រវត្តិ)_ | `src/shared/utils/containerEnv.ts` | បង្ខំឱ្យបើកការរកឃើញ container (`1`/`true`) ឬបិទ (`0`/`false`)។ ត្រូវការតែលើ runtime ដែលការរកឃើញដោយស្វ័យប្រវត្តិមិនអាចរកឃើញប៉ុណ្ណោះ។ | | `OMNIROUTE_ALLOW_CONTAINER_CONFIG_WRITE` | `false` | `src/shared/services/cliRuntime.ts` | អនុញ្ញាតឱ្យឧបករណ៍ CLI សរសេរ config ទៅក្នុង path របស់ container ដែលមិនបាន mount។ ជម្រើស CLI ដែលមានន័យដូចគ្នាគឺ `--allow-container-write`។ | ### ឧបករណ៍ជំនួយសម្រាប់ CLI Binary (`omniroute`) អថេរទាំងនេះកំណត់ឥរិយាបថផ្ទាល់របស់ CLI binary `omniroute` (មិនមែនការរកឃើញ sidecar ខាងលើទេ)។ | អថេរ | លំនាំដើម | ឯកសារប្រភព | សេចក្ដីពិពណ៌នា | | ------------------------------------- | --------------------------------- | --------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `OMNIROUTE_LANG` | _(ប្រព័ន្ធ)_ | `bin/cli/i18n.mjs` | បង្ខំភាសាបង្ហាញលទ្ធផលរបស់ CLI។ ប្រើ locale BCP-47 (ឧ. `en`, `pt-BR`)។ ជំនួសអថេរបរិស្ថាន locale របស់ប្រព័ន្ធ (LC_ALL, LC_MESSAGES)។ | | `OMNIROUTE_SHOW_LOG` | _(មិនបានកំណត់)_ | `bin/cli/runtime/processSupervisor.mjs` | កំណត់ជា `1` ដើម្បីបញ្ជូន stdout/stderr របស់ server ទៅ terminal ក្នុង supervised mode។ មានន័យស្មើនឹង flag `--log` លើ `omniroute serve`។ | | `OMNIROUTE_CLI_TOKEN` | _(មិនបានកំណត់)_ | `bin/cli/api.mjs` | Token សម្រាប់ machine-auth ដែលត្រូវបានបញ្ចូលជា header `x-omniroute-cli-token`។ បង្កើតដោយស្វ័យប្រវត្តិក្នុង task 8.12។ | | `GEMINI_CLI_HOME` | _(មិនបានកំណត់)_ | `bin/cli/commands/setup-gemini.mjs` | Root នៃ Gemini home ដែលរក្សាទុកជាអចិន្ត្រៃយ៍; ការដំណើរការម្ដងប្រើ home បណ្ដោះអាសន្នដាច់ដោយឡែក។ | | `OMNIROUTE_CHILD_SIGNAL_TIMEOUT_MS` | `5000` | `bin/cli/commands/run.mjs` | រយៈពេលអនុគ្រោះគិតជាមីលីវិនាទី មុនពេលបង្ខំឱ្យបញ្ឈប់ child របស់ CLI ដែលបានទទួល signal។ | | `OMNIROUTE_CLI_SKIP_DEFAULT_DATA_ENV` | _(មិនបានកំណត់)_ | `bin/omniroute.mjs` | កំណត់ជា 1 ជាមួយ DATA_DIR ដែលបានបញ្ជាក់ច្បាស់ ដើម្បីរំលងឯកសារបរិស្ថាន data-directory របស់អ្នកប្រើលំនាំដើម។ | | `OMNIROUTE_SYNC_TOKEN` | _(មិនបានកំណត់)_ | `bin/cli/commands/sync.mjs` | Sync token សម្រាប់ `omniroute sync bundle` (`GET /api/sync/bundle` ទទួលយកតែ sync token ប៉ុណ្ណោះ មិនទទួល API key ទេ)។ មានន័យស្មើនឹង `--token`។ | | `OMNIROUTE_HTTP_TIMEOUT_MS` | `30000` | `bin/cli/api.mjs` | រយៈពេល timeout របស់ HTTP ក្នុងការព្យាយាមនីមួយៗ (ms) សម្រាប់សំណើពី CLI → server។ | | `OMNIROUTE_READY_TIMEOUT_MS` | `60000` | `bin/cli/utils/pid.mjs` | រយៈពេលអតិបរមា (ms) ដែល CLI រង់ចាំ health endpoint របស់ server មុនពេលបង្ហាញការព្រមាន timeout។ មានប្រយោជន៍សម្រាប់ cold start ដែលយឺត (ឧ. Windows)។ ក៏អាចកំណត់តាម `--ready-timeout` បានផងដែរ។ | | `OMNIROUTE_VERBOSE` | `0` | `bin/cli/api.mjs` | កំណត់ជា `1` ដើម្បីបង្ហាញព័ត៌មានវិនិច្ឆ័យអំពី retry/backoff ទៅ stderr អំឡុងពេលប្រតិបត្តិ command របស់ CLI។ | | `OMNIROUTE_PLUGIN_PATH` | _(មិនបានកំណត់)_ | `bin/cli/plugins.mjs` | ថតផ្ទាល់ខ្លួនសម្រាប់ការស្វែងរក plugin របស់ CLI (package `omniroute-cmd-*`)។ នៅពេលមិនបានកំណត់ វាប្រើ `~/.omniroute/plugins/` ជាលំនាំដើម។ សម្រាប់តែ CLI ប៉ុណ្ណោះ — វាមិនដែលទៅដល់ plugin scanner ខាង server ដែលត្រូវបានកំណត់ទីតាំងដោយ `OMNIROUTE_PLUGINS_DIR` (ផ្នែកទី 2) ទេ។ | | `OMNIROUTE_NO_UPDATE_NOTIFIER` | _(មិនបានកំណត់)_ | `bin/omniroute.mjs` | ទប់ស្កាត់ការជូនដំណឹងអំពី update របស់ CLI នៅពេល process បិទ ប្រសិនបើកំណត់ជាតម្លៃណាមួយដែលមិនទទេ។ ការជូនដំណឹងនេះនៅតែត្រូវបានបិទដោយឯករាជ្យនៅក្នុង CI, quiet mode និង non-text output mode។ | | `OMNIROUTE_DOCTOR_LIVENESS_URL` | _(បានដេរីវេ)_ | `bin/cli/commands/doctor.mjs` | Liveness URL ដែលត្រូវបានសាកល្បងដោយ `omniroute doctor`។ ជម្រើស `livenessUrl` ដែលកំណត់តាមកម្មវិធីមានអាទិភាព; បើមិនដូច្នោះទេ តម្លៃនេះត្រូវបានប្រើដូចដែលបានផ្ដល់។ នៅពេលមិនបានកំណត់ CLI នឹងដេរីវេ endpoint `/api/health/degradation` របស់ dashboard មូលដ្ឋាន។ | | `OMNIROUTE_PROVIDER_CATALOG_PATH` | `src/shared/constants/providers/` | `bin/cli/provider-catalog.mjs` | Path នៃ provider catalog ដែលប្រើដោយ command របស់ CLI សម្រាប់ provider។ ជម្រើស `catalogPath` ដែលកំណត់តាមកម្មវិធីមានអាទិភាព។ Absolute path ត្រូវបានប្រើដូចដែលបានផ្ដល់; relative path ត្រូវបានដោះស្រាយពី project root។ នៅពេលមិនបានកំណត់ CLI ប្រើថត constants របស់ provider ដោយប្រើឯកសារ `providers.ts` ចាស់ជា fallback។ | | `OMNIROUTE_PROVIDER_TEST_MODEL` | _(លំនាំដើមរបស់ provider)_ | `bin/cli/provider-test.mjs` | Model fallback សកលសម្រាប់ការធ្វើតេស្តការតភ្ជាប់ provider របស់ CLI។ លំដាប់អាទិភាពគឺ model នៃ connection ដែលបានកំណត់, model override ជាក់លាក់របស់ provider, តម្លៃនេះ ហើយបន្ទាប់មក test model ដែលភ្ជាប់មកជាមួយ provider។ | --- ## 10. ការរួមបញ្ចូល Agent ខាងក្នុង និង MCP | អថេរ | លំនាំដើម | ឯកសារប្រភព | សេចក្ដីពិពណ៌នា | | ----------------------------------------------- | --------------------------------------------------- | ----------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `OMNIROUTE_BASE_URL` | រកឃើញដោយស្វ័យប្រវត្តិ | `open-sse/mcp-server/server.ts` | URL ជាក់លាក់សម្រាប់ឧបករណ៍ MCP/A2A ដើម្បីចូលប្រើ OmniRoute។ វាជំនួសការរកឃើញ localhost ដោយស្វ័យប្រវត្តិ។ | | `OMNIROUTE_API_KEY` | _(មិនបានកំណត់)_ | ម៉ូឌុល MCP/A2A | API key សម្រាប់ការហៅឧបករណ៍ MCP ខាងក្នុង និងជំនាញ A2A។ | | `OMNIROUTE_API_KEY_ID` | _(មិនបានកំណត់)_ | `open-sse/mcp-server/audit.ts` | ID របស់ key សម្រាប់កំណត់ប្រភពក្នុងកំណត់ហេតុសវនកម្ម MCP។ | | `ROUTER_API_KEY` | _(មិនបានកំណត់)_ | ប្រព័ន្ធចាស់ | ឈ្មោះក្លែងក្លាយចាស់សម្រាប់ `OMNIROUTE_API_KEY`។ | | `OMNIROUTE_A2A_HISTORY_RETENTION_DAYS` | `30` | `src/lib/a2a/taskManager.ts` | ចំនួនថ្ងៃដែលប្រវត្តិកិច្ចការ A2A ត្រូវបានរក្សាទុកក្នុងមូលដ្ឋានទិន្នន័យក្នុងម៉ាស៊ីន មុនពេលការសម្អាតប្រចាំថ្ងៃលុបជួរទិន្នន័យមួយ។ ប្រសិនបើមិនបានកំណត់ មិនមែនជាលេខ ឬ `<= 0` នោះវានឹងត្រឡប់ទៅប្រើ `30`។ | | `OMNIROUTE_A2A_MEMORY_HITS` | `1` | `src/lib/a2a/taskExecution.ts` | កុងតាក់បិទបន្ទាន់សម្រាប់មុខងារសង្កេតតាមដាន memory-hits របស់ A2A។ កំណត់ជា `0` ដើម្បីរំលងការស្វែងរកការរំឭកអង្គចងចាំសម្រាប់កិច្ចការមួយទាំងស្រុង។ តម្លៃផ្សេងទៀតណាមួយ (រួមទាំងមិនបានកំណត់) នឹងរក្សាឱ្យវាដំណើរការ។ | | `OMNIROUTE_ISSUE_AGENT_ENABLED` | `false` | `src/app/api/issue-agent/runs/route.ts` | បើក endpoint វិភាគបញ្ហាដែលបានកត់ត្រារបស់ Issue Agent សម្រាប់ការប្រើប្រាស់ក្រៅបណ្ដាញ/ក្នុងម៉ាស៊ីន។ ទុកវាឱ្យបិទ លុះត្រាតែកំពុងដំណើរការលំហូរការងារវិភាគបញ្ហាដែលបានកត់ត្រាក្នុងម៉ាស៊ីនដោយចេតនា។ | | `OMNIROUTE_ISSUE_AGENT_TIMEOUT_MS` | _(មិនបានកំណត់)_ | `src/lib/issueAgent/execution.ts` | រយៈពេលអស់ពេល (ms) សម្រាប់ការដំណើរការវិភាគបញ្ហាដែលបានកត់ត្រារបស់ Issue Agent មួយលើក។ វាត្រូវបានកម្រិតត្រឹមអតិបរមាខាងក្នុង ហើយត្រឡប់ទៅប្រើតម្លៃលំនាំដើមដែលមានស្រាប់ នៅពេលមិនបានកំណត់ ឬមិនត្រឹមត្រូវ។ | | `OMNIROUTE_CONTEXT` | _(បរិបទសកម្ម)_ | `bin/cli/program.mjs`, `bin/cli/api.mjs` | បរិបទ/ប្រូហ្វាល់មុខងារពីចម្ងាយរបស់ CLI សម្រាប់ពាក្យបញ្ជា `omniroute`។ វាជំនួសបរិបទសកម្មក្នុងឃ្លាំងបរិបទក្នុងម៉ាស៊ីន។ ស្មើនឹង `--context `។ | | `OMNIROUTE_CONTEXT_KEYCHAIN_DISABLED` | `0` | `bin/cli/contexts.mjs` | បិទ backend ខ្សែសោ OS `keytar` ជាជម្រើស សម្រាប់ព័ត៌មានសម្គាល់អត្តសញ្ញាណនៃបរិបទ CLI។ នៅពេលបើក ព័ត៌មានសម្គាល់អត្តសញ្ញាណនឹងនៅតែស្ថិតក្នុង `config.json` ជាមួយ mode `0600` ហើយ CLI បញ្ចេញការព្រមានអំពីការប្រើជម្រើសបម្រុងតែមួយលើក។ វាត្រូវបានរៀបចំសម្រាប់ប្រតិបត្តិការគ្មានចំណុចប្រទាក់/ក្នុង container ដោយចេតនា។ | | `OMNIROUTE_MCP_ENFORCE_SCOPES` | `false` | `open-sse/mcp-server/server.ts` | អនុវត្តការគ្រប់គ្រងសិទ្ធិចូលប្រើដោយផ្អែកលើ scope ចំពោះការហៅឧបករណ៍ MCP។ | | `OMNIROUTE_MCP_SCOPES` | _(ទាំងអស់)_ | `open-sse/mcp-server/server.ts` | scope ដែលបំបែកដោយសញ្ញាក្បៀស៖ `admin`, `combos`, `health`, `models`, `routing`, `budget`, `metrics`, `pricing`, `memory`, `skills`។ | | `OMNIROUTE_MCP_COMPRESS_DESCRIPTIONS` | `false` | `open-sse/mcp-server/descriptionCompressor.ts` | បង្ហាប់សេចក្ដីពិពណ៌នាឧបករណ៍ MCP មុនពេលធ្វើ serialization លើ manifest។ តម្លៃសម្រាប់បើក៖ `1`, `true`, `on`។ | | `OMNIROUTE_MCP_DESCRIPTION_COMPRESSION` | `rtk` | `open-sse/mcp-server/descriptionCompressor.ts` | ក្បួនដោះស្រាយ/ប្រូហ្វាល់បង្ហាប់។ តម្លៃសម្រាប់បិទ៖ `0`, `false`, `off`។ | | `OMNIROUTE_MCP_FETCH_TIMEOUT_MS` | `10000` | `open-sse/mcp-server/fetchTimeout.ts` | ថវិការយៈពេលមុនបោះបង់ (ms) សម្រាប់ការអានគ្រប់គ្រងខាងក្នុងរបស់ MCP-server (ស្ថានភាពប្រព័ន្ធ ភាពធន់ បន្សំ កូតា និងការប្រើប្រាស់)។ | | `OMNIROUTE_MCP_UPSTREAM_TIMEOUT_MS` | `60000` | `open-sse/mcp-server/fetchTimeout.ts` | ថវិកាពេលវេលាបោះបង់ (ms) សម្រាប់ការឆ្លងកាត់ MCP ដែលរង់ចាំអ្នកផ្តល់សេវា (`route_request`, `web_search`, `web_fetch`)។ | | `OMNIROUTE_CORPUS_CACHE_SIZE` | `5` | `src/lib/localCorpus/configured.ts` | ចំនួនអតិបរមានៃអ៊ីនស្តង់សន្ទស្សន៍ local-corpus ដែលបានរក្សាទុកក្នុងឃ្លាំងសម្ងាត់ក្នុងអង្គចងចាំ (LRU មួយសម្រាប់ថតឫសនីមួយៗដែលបានធ្វើសន្ទស្សន៍)។ ត្រូវបានកំណត់ត្រឹមអប្បបរមា `1`។ | | `MODEL_SYNC_INTERVAL_HOURS` | `6` | `src/shared/services/modelSyncScheduler.ts` | ចន្លោះពេលធ្វើសមកាលកម្មកាតាឡុកម៉ូដែល គិតជាម៉ោង។ | | `PROVIDER_LIMITS_SYNC_INTERVAL_MINUTES` | `70` | `src/lib/usage/providerLimits.ts` | ចន្លោះពេលពិនិត្យកម្រិតអត្រា និងកូតារបស់អ្នកផ្តល់សេវា។ | | `PROVIDER_LIMITS_SYNC_SPACING_MS` | `1500` | `src/lib/usage/providerLimits.ts` | គម្លាត (ms) រវាងការទាញយកកូតា OAuth ជាបន្តបន្ទាប់ក្នុងការធ្វើសមកាលកម្មជាបាច់; ការតភ្ជាប់ OAuth ត្រូវបានទាញយកម្តងមួយៗ ដើម្បីជៀសវាងការផ្ញើសំណើផ្ទុះទៅកាន់ប្រព័ន្ធខាងលើ។ `0` បិទចន្លោះពេលនេះ (ដំណើរការដំណាលគ្នា)។ | | `OMNIROUTE_QUOTA_FETCH_MIN_INTERVAL_MS` | `250` | `open-sse/services/quotaFetchThrottle.ts` | ចន្លោះពេលអប្បបរមា (ms) រវាងការទាញយកកូតាពីប្រព័ន្ធខាងលើជាបន្តបន្ទាប់ នៅលើផ្លូវត្រួតពិនិត្យជាមុន/តាមដានសម្រាប់សំណើនីមួយៗ; វាកំណត់គម្លាតរវាងការហៅបណ្តាញដំណាលគ្នា ដើម្បីកុំឱ្យគណនីជាច្រើននៅលើ IP តែមួយផ្ញើសំណើផ្ទុះទៅកាន់ប្រព័ន្ធខាងលើ។ ត្រូវបានភ្ជាប់ទៅកម្មវិធីទាញយកកូតារបស់ Codex (`/wham/usage`), DeepSeek, Bailian (ទីតាំងទាញយកទាំងពីរ), OpenCode និង Crof (#6009, #6911)។ ផ្លូវបញ្ជូនទូទៅ `usage.ts::getUsageForProvider` (github/glm/minimax/nanogpt/xai/etc.) មិនទាន់ត្រូវបានគ្របដណ្តប់ទេ — ត្រូវបានតាមដានដោយឡែក។ ការចូលត្រូវឃ្លាំងសម្ងាត់មិនរងផលប៉ះពាល់ទេ។ `0` បិទមុខងារ; ត្រូវបានកំណត់ក្នុងចន្លោះ `0..5000`។ | | `PROVIDER_LIMITS_POST_USAGE_REFRESH_DELAY_MS` | `5000` | `src/lib/usage/providerLimits.ts` | ការពន្យារពេល (ms) មុនពេលធ្វើឱ្យកម្រិតរបស់អ្នកផ្តល់សេវាស្រស់ឡើងវិញ បន្ទាប់ពីព្រឹត្តិការណ៍ប្រើប្រាស់ពិតប្រាកដ ដើម្បីទុកពេលឱ្យ API កូតារបស់ប្រព័ន្ធខាងលើកត់ត្រាការប្រើប្រាស់។ | | `OMNIROUTE_LOGIN_BROWSER_PATH` | រកឃើញដោយស្វ័យប្រវត្តិ | `open-sse/services/adobeFireflyBrowserLogin.ts` | ផ្លូវដាច់ខាតទៅកាន់ឯកសារប្រតិបត្តិ Chrome ឬ Edge របស់ប្រព័ន្ធ ដែលប្រើសម្រាប់ការចូល Adobe Firefly បែបអន្តរកម្ម និងការបន្តនៅក្រៅអេក្រង់។ | | `ADOBE_FIREFLY_BROWSER_REFRESH` | បានបើក | `open-sse/services/adobeFireflySession.ts` | រក្សាស្ថានភាព IMS និងហានិភ័យរបស់កម្មវិធីរុករកឱ្យនៅស្រស់តាមរយៈសម័យ Chrome CDP ដែលកំណត់តាមគណនី។ កំណត់ជា `0` ដើម្បីបិទការបន្តតាមកម្មវិធីរុករក។ | | `ADOBE_FIREFLY_SESSION_DISK` | បានបើក | `open-sse/services/adobeFireflySession.ts` | រក្សាទុកសម័យ Adobe ដែលបានជួសជុលនៅក្រោម `DATA_DIR` ឆ្លងកាត់ការចាប់ផ្តើមដំណើរការឡើងវិញ។ កំណត់ជា `0` ដើម្បីរក្សាសម័យតែក្នុងអង្គចងចាំប៉ុណ្ណោះ។ | | `ADOBE_FIREFLY_MIN_SUBMIT_GAP_MS` | `12000` | `open-sse/services/adobeFireflySession.ts` | គម្លាតអប្បបរមាគិតជាមិល្លីវិនាទី រវាងការដាក់ស្នើបង្កើតរបស់ Adobe Firefly; `0` បិទគម្លាត។ | | `ADOBE_FIREFLY_BATCH_EXTRA_GAP_MS` | `15000` | `open-sse/services/adobeFireflySession.ts` | រយៈពេលស្ងាត់បន្ថែមគិតជាមិល្លីវិនាទី បន្ទាប់ពីការដាក់ស្នើ Adobe ជោគជ័យរៀងរាល់លើកទីបី។ | | `ADOBE_FIREFLY_SUBMIT_BASE_DELAY_MS` | `8000` | `open-sse/services/adobeFireflyClient.ts` | រយៈពេលរង់ចាំបង្កើនឡើងវិញមូលដ្ឋាន គិតជាមិល្លីវិនាទី បន្ទាប់ពីការឆ្លើយតប Adobe 408 បណ្តោះអាសន្ន; ត្រូវបានរួមបញ្ចូលជាមួយគម្លាតការដាក់ស្នើ ក្នុងចំនួនអតិបរមាប្រាំដងនៃការព្យាយាម។ | | `OMNIROUTE_DISABLE_BACKGROUND_SERVICES` | `false` | `src/instrumentation-node.ts` | បិទសេវាផ្ទៃខាងក្រោយទាំងអស់ (ការធ្វើសមកាលកម្ម ការកំណត់តម្លៃ ការធ្វើឱ្យម៉ូដែលស្រស់ឡើងវិញ)។ មានប្រយោជន៍សម្រាប់ CI/ការធ្វើតេស្ត។ | | `OMNIROUTE_HEADLESS` | _(មិនបានកំណត់)_ | `src/lib/system/headless.ts` | ការចាប់ផ្តើមសម្រាប់តែម៉ាស៊ីនប្រូកស៊ី៖ រំលងប្រព័ន្ធរងស្រេចចិត្ត, `/dashboard` → 404។ ដូចគ្នានឹង `omniroute serve --headless`។ សូមមើល [HEADLESS.md](../guides/HEADLESS.md)។ | | `OMNIROUTE_ENABLE_RUNTIME_BACKGROUND_TASKS` | _(មិនបានកំណត់)_ | `src/lib/config/runtimeSettings.ts` | បង្ខំឱ្យបើកកិច្ចការផ្ទៃខាងក្រោយ នៅពេលរកឃើញការធ្វើតេស្តស្វ័យប្រវត្តិ។ កំណត់ជា `1` ដើម្បីបដិសេធ heuristic របស់ការធ្វើតេស្ត។ | | `OMNIROUTE_BUDGET_RESET_JOB_INTERVAL_MS` | `600000` | `src/lib/jobs/budgetResetJob.ts` | ចន្លោះពេលត្រួតពិនិត្យការកំណត់ថវិកាឡើងវិញ (ms)។ តម្លៃអប្បបរមា `10000`។ | | `OMNIROUTE_CONNECTION_RECOVERY_INTERVAL_MS` | `60000` | `src/lib/quota/connectionRecovery.ts` | ចន្លោះពេលស្ដារការតភ្ជាប់ដែលស្ថិតក្នុងរយៈពេលសម្រាកឡើងវិញជាមុន (ms)៖ ធ្វើសុពលកម្មការតភ្ជាប់ឡើងវិញ ដែលតម្លៃបណ្ដោះអាសន្ន `rate_limited_until` របស់វាបានផុតកំណត់ ដោយមិនស្ថិតនៅលើផ្លូវសំខាន់នៃសំណើ។ តម្លៃអប្បបរមា `5000`។ | | `OMNIROUTE_DISABLE_CONNECTION_RECOVERY` | `false` | `src/lib/quota/connectionRecovery.ts` | បិទកម្មវិធីកំណត់ពេលសម្រាប់ការស្ដារការតភ្ជាប់ដែលស្ថិតក្នុងរយៈពេលសម្រាកឡើងវិញជាមុន (ការស្ដារដោយខ្ជិលក្នុង `getProviderCredentials` នៅតែអនុវត្ត)។ | | `OMNIROUTE_REASONING_CACHE_CLEANUP_INTERVAL_MS` | `1800000` | `src/lib/jobs/reasoningCacheCleanupJob.ts` | ចន្លោះពេលសម្អាតឃ្លាំងសម្ងាត់សម្រាប់ការវែកញែក (ms)។ តម្លៃអប្បបរមា `60000`។ | | `OMNIROUTE_REASONING_MIN_BUDGET` | _មិនបានកំណត់_ (បានបិទ) | `open-sse/services/reasoningTokenBuffer.ts` | តម្លៃអប្បបរមាដែលត្រូវជ្រើសបើកសម្រាប់ថវិកាលទ្ធផលនៃម៉ូដែលគិត៖ `max_tokens` របស់អ្នកហៅដែលស្ថិតក្នុង `[256, floor)` នឹងត្រូវបានដំឡើងដល់តម្លៃអប្បបរមា (កំណត់មិនឱ្យលើសកម្រិតលទ្ធផលរបស់ម៉ូដែល)។ មិនបានកំណត់ = ថវិការបស់ម៉ាស៊ីនភ្ញៀវមិនត្រូវបានពង្រីកឡើយ (#9507)។ | | `OMNIROUTE_REASONING_EFFORT_PROBE_PROVIDERS` | _មិនបានកំណត់_ (បានបិទ) | `open-sse/services/learnedReasoningEffortCaps.ts` | ជម្រើសបើក ដែលជាលេខសម្គាល់អ្នកផ្ដល់សេវាបំបែកដោយសញ្ញាក្បៀស (ឬ `*`)៖ នៅពេលកំហុស 400/422 របស់ `reasoning_effort` មិនបញ្ជាក់សំណុំដែលអាចទទួលយកបាន សូមព្យាយាមម្ដងទៀតនៅកម្រិតទាបជាងមួយ (មិនដែលទាបជាង `low`) ហើយរៀនយកកម្រិតនោះតែក្នុងករណីដែលការស្ទាបស្ទង់ទទួលបានចម្លើយប៉ុណ្ណោះ (#14895)។ | | `OMNIROUTE_LOG_EXPORT_CRON` | `0 * * * *` | `src/lib/jobs/logExportJob.ts` | កន្សោម Cron (UTC) សម្រាប់កិច្ចការនាំចេញកំណត់ហេតុការហៅ ដែលបញ្ចេញទិន្នន័យទៅកាន់គោលដៅនាំចេញកំណត់ហេតុដែលបានបើកទាំងអស់។ | | `OMNIROUTE_CONFIG_HOT_RELOAD_MS` | `5000` | `src/lib/config/hotReload.ts` | ចន្លោះពេលស្ទង់ពិនិត្យ (ms) សម្រាប់ការផ្ទុកការកំណត់រចនាសម្ព័ន្ធឡើងវិញភ្លាមៗ។ តម្លៃទាបជាង `1000` នឹងត្រូវបានបដិសេធ។ | | `OMNIROUTE_DISABLE_REDIS_AUTH_CACHE` | _(បានបើក)_ | `src/lib/db/apiKeys.ts` | កំណត់ជា `1` ដើម្បីរំលងឃ្លាំងសម្ងាត់ផ្ទៀងផ្ទាត់ API key ដែលគាំទ្រដោយ Redis (បង្ខំឱ្យអានពី DB)។ | | `OMNIROUTE_RTK_TRUST_PROJECT_FILTERS` | `0` | `open-sse/services/compression/engines/rtk/filterLoader.ts` | ជឿទុកចិត្តលើច្បាប់តម្រងគម្រោង RTK ដែលគ្រប់គ្រងដោយអ្នកប្រើប្រាស់ ដោយមិនត្រួតពិនិត្យហត្ថលេខាយ៉ាងតឹងរ៉ឹង។ | | `OMNIROUTE_LITE_MAX_TOOL_LENGTH` | `2000` | `open-sse/services/compression/lite.ts` | ចំនួនតួអក្សរអតិបរមាសម្រាប់ការកាត់ឱ្យខ្លីជាមុននូវលទ្ធផលរបស់ឧបករណ៍ Lite នៅពេលមិនបានកំណត់ `lite.maxToolLength`។ ចន្លោះ 256–1000000។ ការកំណត់លើផ្ទាំងគ្រប់គ្រងមានអាទិភាពលើ env នេះ។ | | `OMNI_COMPRESSION_WORKERS` | `2` | `open-sse/services/compression/compressionWorkerPool.ts` | ចំនួន worker សមកាលកម្ម RTK/Caveman ដែលអាចដំណើរការស្របគ្នាអតិបរមា; កិច្ចការលើសត្រូវរង់ចាំតាម FIFO។ | | `OMNI_COMPRESSION_WORKER_TIMEOUT_MS` | `120000` | `open-sse/services/compression/compressionWorkerPool.ts` | ពេលកំណត់សម្រាប់កិច្ចការនីមួយៗគិតជាមិល្លីវិនាទី។ worker ដែលអស់ពេលកំណត់នឹងត្រូវបានបញ្ឈប់ ហើយសំណើនឹងបរាជ័យដោយបើកចំហដោយមិនមានការផ្លាស់ប្ដូរ។ | | `OMNI_COMPRESSION_WORKER_IDLE_MS` | `60000` | `open-sse/services/compression/compressionWorkerPool.ts` | អាយុកាលនៅទំនេរគិតជាមិល្លីវិនាទី មុនពេល worker បង្ហាប់ដែលមិនត្រូវបានប្រើត្រូវបានបញ្ឈប់។ | | `OMNI_COMPRESSION_WORKER_MAX_OLD_MB` | `1024` | `open-sse/services/compression/compressionWorkerPool.ts` | ដែនកំណត់ heap ជំនាន់ចាស់របស់ V8 គិតជា MB សម្រាប់ worker បង្ហាប់នីមួយៗ និងគ្រប់របៀប (តម្លៃអប្បបរមា `128`)។ កិច្ចការដែលលើសពីដែនកំណត់នេះនឹងបរាជ័យដោយបើកចំហ (មិនបានបង្ហាប់) ជំនួសឱ្យការពង្រីក heap របស់ gateway។ | | `COMPRESSION_PIPELINE_BREAKER_ENABLED` | `false` | `open-sse/services/compression/pipelineEngineBreaker.ts` | កុងតាក់មេសម្រាប់ circuit breaker តាម engine នៃ stacked-pipeline T02។ **ត្រូវជ្រើសបើក (លំនាំដើមបិទ)** — នៅពេលបើក engine ដែលបោះកំហុសដដែលៗឆ្លងកាត់សំណើជាច្រើននឹងត្រូវបានរំលង (បរាជ័យដោយបើកចំហ) ក្នុងអំឡុងពេលសម្រាក; បិទ = ឥរិយាបថចាស់ដូចគ្នាគ្រប់ byte។ | | `COMPRESSION_PIPELINE_BREAKER_THRESHOLD` | `3` | `open-sse/services/compression/pipelineEngineBreaker.ts` | ចំនួនបរាជ័យជាប់គ្នាឆ្លងកាត់សំណើជាច្រើន មុនពេល breaker របស់ engine បើក។ | | `COMPRESSION_PIPELINE_BREAKER_COOLDOWN_MS` | `30000` | `open-sse/services/compression/pipelineEngineBreaker.ts` | ចំនួនមិល្លីវិនាទីដែលម៉ាស៊ីនដែលបានបើកត្រូវបានរំលង មុនពេលធ្វើការសាកល្បងក្នុងស្ថានភាពបើកពាក់កណ្តាល។ | | `COMPRESSION_CCR_RETRIEVAL_RAMP_FACTOR` | `2` | `open-sse/services/compression/engines/ccr/index.ts` | កម្រិតកើនឡើងនៃ retrieval-feedback របស់ T08/H8 CCR៖ ការទាញយកប្លុកដែលបានរក្សាទុកពីមុននីមួយៗ បង្កើនតម្លៃ `minChars` ដែលមានប្រសិទ្ធភាពរបស់វាតាមលីនេអ៊ែរ (មាតិកាដែលត្រូវបានទាញយកញឹកញាប់ នឹងត្រូវបានបង្ហាប់តិចជាងមុន; ការទាញយក `>=3` ដង = មិនត្រូវបានបង្ហាប់ឡើយ)។ `1` បិទកម្រិតកើនឡើងនេះ (រំលងជាលក្ខណៈទ្វេភាគត្រឹមតែនៅកម្រិតកំណត់ប៉ុណ្ណោះ)។ | | `COMPRESSION_CCR_DURABLE_STORE` | `true` | `open-sse/services/compression/engines/ccr/index.ts` | ឃ្លាំងប្លុកអចិន្ត្រៃយ៍ CCR (#9061)។ វាប្រើ SQLite ជាឃ្លាំងគាំទ្រសម្រាប់ឃ្លាំងក្នុងអង្គចងចាំ ដើម្បីឱ្យប្លុកអាចនៅគង់វង្សបន្ទាប់ពីការបណ្តេញចេញដោយ LRU, ការផុតកំណត់ TTL, ការចាប់ផ្តើមឡើងវិញ ឬការទាញយកដែលទៅដល់ instance ផ្សេង។ កំណត់ជា `false` ដើម្បីរក្សាប្លុកតែក្នុងអង្គចងចាំប៉ុណ្ណោះ។ ប្លុកលើសពី 512KB និង cloud runtimes នឹងនៅតែរក្សាទុកតែក្នុងអង្គចងចាំ ទោះជាកំណត់យ៉ាងណាក៏ដោយ។ | | `COMPRESSION_PREFIX_FREEZE_ENABLED` | `false` | `open-sse/services/compression/prefixFreeze.ts` | កុងតាក់មេបង្កកបុព្វបទតាមការប្រើប្រាស់ដែលបានសង្កេតរបស់ T08/H5។ **ត្រូវបើកប្រើដោយជាក់លាក់ (លំនាំដើមបិទ)** — នៅពេលបើក system prompt ដែលត្រូវបានសង្កេត `>=` កម្រិតកំណត់ នឹងត្រូវបានចាត់ទុកជាបុព្វបទមានស្ថិរភាពដែលអាចរក្សាទុកក្នុង cache បាន ហើយត្រូវបានការពារមិនឱ្យបង្ហាប់ សូម្បីតែសម្រាប់ provider ដែល static cache heuristic មិនបានរកឃើញក៏ដោយ (ការបង្កកគ្រាន់តែ _រក្សាទុក_ ប៉ុណ្ណោះ មិនដែលកែប្រែឡើយ)។ | | `COMPRESSION_PREFIX_FREEZE_THRESHOLD` | `3` | `open-sse/services/compression/prefixFreeze.ts` | ចំនួនដងនៃការសង្កេត system prompt មុនពេលវាត្រូវបានចាត់ទុកជាបុព្វបទមានស្ថិរភាពដែលបានបង្កក។ | | `OMNIROUTE_BOOTSTRAPPED` | `false` | `src/app/(dashboard)/dashboard/page.tsx` | ត្រូវបានកំណត់ជា `true` ដោយស្គ្រីប bootstrap បន្ទាប់ពីការដំឡើងដំបូង។ គ្រប់គ្រងការបង្ហាញ setup wizard។ | | `OMNIROUTE_ALLOW_BODY_PROJECT_OVERRIDE` | `0` | `open-sse/executors/antigravity.ts` | ច្រកគេច៖ អនុញ្ញាតឱ្យ request body សរសេរជាន់លើ field របស់ project Antigravity។ | | `ANTIGRAVITY_CREDITS` | `off` | `open-sse/services/antigravityCredits.ts` | គោលការណ៍ Google One AI credits៖ `off` មិនបញ្ចូល credits ឡើយ, `retry` បញ្ចូលម្តងបន្ទាប់ពីមាន quota 429 ដែលមានលក្ខណៈសម្បត្តិគ្រប់គ្រាន់ ហើយ `always` បញ្ចូលនៅលើ request ដំបូង។ | | `ANTIGRAVITY_ALLOW_SIGNATURE_BYPASS` | `0` | `open-sse/translator/request/openai-to-gemini.ts` | អនុញ្ញាតឱ្យ Antigravity request translator រំលងការផ្ទៀងផ្ទាត់ request-signature របស់ CLI ដ៏តឹងរ៉ឹង នៅពេល upstream បដិសេធ signature ពិតប្រាកដ (របៀប debug/CLI ចាស់ហួសសម័យ)។ តម្លៃមិនស្មើសូន្យនឹងបើកការរំលងនេះ។ | | `AGY_TOKEN_FILE` | `~/.gemini/antigravity-cli/antigravity-oauth-token` | `src/app/api/providers/agy-auth/apply-local/route.ts` | សរសេរជាន់លើ path នៃ token-file របស់ Antigravity CLI (agy) សម្រាប់ការនាំចូល local login ដែលរកឃើញដោយស្វ័យប្រវត្តិ។ | ### ស្ពាន OAuth CLI (ផ្ទៃក្នុង) | អថេរ | លំនាំដើម | ឯកសារប្រភព | សេចក្ដីពិពណ៌នា | | ------------------- | --------------------- | ------------------------------- | ----------------------------------------------------- | | `OMNIROUTE_SERVER` | រកឃើញដោយស្វ័យប្រវត្តិ | `src/lib/oauth/config/index.ts` | URL របស់ server សម្រាប់ស្ពាន auth រវាង CLI↔OmniRoute។ | | `OMNIROUTE_TOKEN` | _(មិនបានកំណត់)_ | `src/lib/oauth/config/index.ts` | Auth token សម្រាប់ស្ពាន CLI។ | | `OMNIROUTE_USER_ID` | `cli` | `src/lib/oauth/config/index.ts` | User ID សម្រាប់ session របស់ស្ពាន CLI។ | | `SERVER_URL` | _(មិនបានកំណត់)_ | `src/lib/oauth/config/index.ts` | ឈ្មោះជំនួសចាស់សម្រាប់ `OMNIROUTE_SERVER`។ | | `CLI_TOKEN` | _(មិនបានកំណត់)_ | `src/lib/oauth/config/index.ts` | ឈ្មោះជំនួសចាស់សម្រាប់ `OMNIROUTE_TOKEN`។ | | `CLI_USER_ID` | _(មិនបានកំណត់)_ | `src/lib/oauth/config/index.ts` | ឈ្មោះជំនួសចាស់សម្រាប់ `OMNIROUTE_USER_ID`។ | --- ## 11. លិខិតសម្គាល់អ្នកផ្តល់សេវា OAuth លិខិតសម្គាល់ដែលបានបង្កើតឡើងសម្រាប់ **ការអភិវឌ្ឍន៍ localhost**។ សម្រាប់ការដាក់ពង្រាយពីចម្ងាយ សូមចុះឈ្មោះដោយខ្លួនឯងនៅកុងសូលអ្នកអភិវឌ្ឍន៍របស់អ្នកផ្តល់សេវា។ | អថេរ | អ្នកផ្តល់សេវា | កំណត់ចំណាំ | | :------------------------------------------ | :---------------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `CLAUDE_OAUTH_CLIENT_ID` | Claude Code (Anthropic) | កម្មវិធីអតិថិជនសាធារណៈ — មិនត្រូវការសម្ងាត់ទេ។ | | `CLAUDE_CODE_REDIRECT_URI` | Claude Code | បដិសេធ URI បញ្ជូនបន្ត។ លំនាំដើម៖ `https://platform.claude.com/oauth/code/callback` | | `CODEX_OAUTH_CLIENT_ID` | Codex / OpenAI | កម្មវិធីអតិថិជនសាធារណៈ។ | | `GEMINI_OAUTH_CLIENT_ID` | Gemini (Google) | តម្រូវឱ្យផ្គូផ្គង `_SECRET`។ | | `GEMINI_OAUTH_CLIENT_SECRET` | Gemini (Google) | — | | `KIMI_CODING_OAUTH_CLIENT_ID` | Kimi Coding (Moonshot) | កម្មវិធីអតិថិជនសាធារណៈ។ | | `MUSE_CODE_OAUTH_CLIENT_ID` | Muse Code (Meta) | ការបដិសេធជាជម្រើសសម្រាប់លេខសម្គាល់កម្មវិធីអតិថិជនឧបករណ៍លំហូរ Muse CLI សាធារណៈ។ ទុកចោលមិនកំណត់ដើម្បីប្រើកម្មវិធីអតិថិជនសាធារណៈដែលបានបង្កើតឡើង។ | | `ANTIGRAVITY_OAUTH_CLIENT_ID` | Antigravity (Google) | តម្រូវឱ្យផ្គូផ្គង `_SECRET`។ | | `ANTIGRAVITY_OAUTH_CLIENT_SECRET` | Antigravity (Google) | — | | `GITHUB_OAUTH_CLIENT_ID` | GitHub Copilot | កម្មវិធីអតិថិជនសាធារណៈ។ | | `GHE_COPILOT_OAUTH_CLIENT_ID` | GHE Copilot | ការបដិសេធជាជម្រើសសម្រាប់លេខសម្គាល់កម្មវិធីអតិថិជន OAuth របស់ GitHub Enterprise Copilot។ ត្រឡប់ទៅលំនាំដើមសាធារណៈរបស់ `GITHUB_OAUTH_CLIENT_ID` នៅពេលមិនកំណត់។ | | `COPILOT_INTEGRATION_ID` | GitHub Copilot | ការបដិសេធជាជម្រើសសម្រាប់លេខសម្គាល់ការរួមបញ្ចូលកម្មវិធីអតិថិជន GitHub Copilot ដែលបានផ្ញើនៅក្នុងបឋមកថា `Copilot-Integration-Id` និង `Editor-Plugin-Version`។ លំនាំដើមទៅ `copilot-developer-cli`។ | | `WINDSURF_API_KEY` | Windsurf / Devin (v3.8) | គន្លឹះ API ជំនួសដែលប្រើដោយ `open-sse/executors/devin-cli.ts` នៅពេលដែលគ្មានលិខិតសម្គាល់ក្នុងមួយការតភ្ជាប់។ ស្រេចចិត្ត។ | | `CLI_DEVIN_BIN` | Devin CLI (v3.8) | ផ្លូវផ្ទាល់ខ្លួនទៅកាន់ binary Devin CLI (`devin`)។ ដោះស្រាយដោយ `open-sse/executors/devin-cli.ts`។ | | `GITLAB_DUO_OAUTH_CLIENT_ID` | GitLab Duo (v3.8) | លេខសម្គាល់កម្មវិធីអតិថិជន OAuth សម្រាប់ GitLab Duo។ ចុះឈ្មោះកម្មវិធីនៅ `https://gitlab.com/-/profile/applications` ជាមួយនឹង URI បញ្ជូនបន្ត `/callback` និងវិសាលភាព `api, read_user, openid, profile, email`។ ត្រឡប់ទៅ `GITLAB_OAUTH_CLIENT_ID`។ | | `GITLAB_DUO_OAUTH_CLIENT_SECRET` | GitLab Duo (v3.8) | សម្ងាត់កម្មវិធីអតិថិជន OAuth សម្រាប់ GitLab Duo។ ស្រេចចិត្ត — លំហូរ PKCE មិនតម្រូវឱ្យមានសម្ងាត់ទេ។ ត្រឡប់ទៅ `GITLAB_OAUTH_CLIENT_SECRET`។ | | `GITLAB_DUO_BASE_URL` | GitLab Duo (v3.8) | បដិសេធ URL មូលដ្ឋាន GitLab (GitLab ដែលបានបង្ហោះដោយខ្លួនឯង)។ លំនាំដើមទៅ `https://gitlab.com`។ ត្រឡប់ទៅ `GITLAB_BASE_URL`។ | | `GITLAB_BASE_URL` | GitLab Duo (v3.8) | ការបម្រុងទុកចាស់សម្រាប់ `GITLAB_DUO_BASE_URL`។ ប្រើនៅពេលដែលវ៉ារ្យ៉ង់ `_DUO_` មិនត្រូវបានកំណត់។ | | `GITLAB_OAUTH_CLIENT_ID` | GitLab Duo (v3.8) | ការបម្រុងទុកចាស់សម្រាប់ `GITLAB_DUO_OAUTH_CLIENT_ID` ដែលប្រើដោយ `src/lib/oauth/constants/oauth.ts`។ | | `GITLAB_OAUTH_CLIENT_SECRET` | GitLab Duo (v3.8) | ការបម្រុងទុកចាស់សម្រាប់ `GITLAB_DUO_OAUTH_CLIENT_SECRET` ដែលប្រើដោយ `src/lib/oauth/constants/oauth.ts`។ | | `QODER_OAUTH_CLIENT_SECRET` | Qoder | — | | `QODER_OAUTH_AUTHORIZE_URL` | Qoder | កំណត់ដើម្បីបើក Qoder OAuth។ | | `QODER_OAUTH_TOKEN_URL` | Qoder | — | | `QODER_OAUTH_USERINFO_URL` | Qoder | — | | `QODER_OAUTH_CLIENT_ID` | Qoder | — | | `QODER_PERSONAL_ACCESS_TOKEN` | Qoder | ការបម្រុងទុកគន្លឹះ API ដោយផ្ទាល់ (រំលង OAuth)។ | | `QODER_CLI_WORKSPACE` | Qoder | ID Workspace សម្រាប់ Qoder CLI។ | | `OMNIROUTE_QODER_WORKSPACE` | Qoder | ឈ្មោះហៅក្រៅសម្រាប់ `QODER_CLI_WORKSPACE`។ | | `QODER_CLI_CONFIG_DIR` | Qoder | បដិសេធថតកំណត់រចនាសម្ព័ន្ធ Qoder CLI (វគ្គ PAT ដាច់ដោយឡែក ជៀសវាងការបិទបាំងការចូលគណនីកម្មវិធីរុករក)។ | | `BLACKBOX_WEB_VALIDATED_TOKEN` | Blackbox Web | ថូខឹន `tk` ផ្នែកខាងមុខដើម្បីផ្ញើជា `validated` នៅលើ `/api/chat`។ តម្រូវនៅពេល Blackbox អនុវត្តការផ្គូផ្គងថូខឹន; បើមិនដូច្នេះទេ OmniRoute នឹងត្រឡប់ទៅ UUID ចៃដន្យវិញ។ សូមមើលបញ្ហា #2252។ | | `VISION_BRIDGE_BASE_URL` | Vision Bridge guardrail | URL មូលដ្ឋានដែលត្រូវគ្នាជាមួយ OpenAI សម្រាប់ការហៅទូរសព្ទ vision-bridge មិនមែន Anthropic។ លំនាំដើមទៅ env URL OpenAI ចាស់ ឬ api.openai.com។ ចង្អុលទៅ self-loop `/v1` របស់ OmniRoute ឬចំណុចបញ្ចប់ដែលត្រូវគ្នាជាមួយ OpenAI ណាមួយ (Gemini OpenAI-compat, OpenRouter)។ បញ្ហា #2232។ នៅពេលដែល URL គឺជា `/v1` របស់ OmniRoute ផ្ទាល់ សំណើ describe sub-request ផ្ញើ `x-omniroute-admission-bypass: internal` និងផ្ទៀងផ្ទាត់ជាមួយ credential self-loop ដែលបានដោះស្រាយ (`sk_omniroute` sentinel ក្នុងរបៀបមូលដ្ឋាន ឬ `OMNIROUTE_API_KEY` / `ROUTER_API_KEY` — #1350) ដូច្នេះការដាក់ពង្រាយ `REQUIRE_API_KEY=true` ដំណើរការ។ | | `VISION_BRIDGE_API_KEY` | Vision Bridge guardrail | គន្លឹះ API សម្រាប់ URL ខាងលើ។ បដិសេធ env vars OpenAI / Google សម្រាប់អ្នកផ្តល់សេវាសម្រាប់ការហៅទូរសព្ទ vision-bridge មិនមែន Anthropic។ ម៉ូដែល Anthropic រក្សាផ្លូវគន្លឹះ Anthropic របស់ពួកគេ។ បញ្ហា #2232។ | | `OMNIROUTE_VISION_BRIDGE_NEGATIVE_CACHE_MS` | Vision Bridge guardrail | រយៈពេលដែលលទ្ធផលនៃការកំណត់ផ្លូវ "គ្មានបេក្ខជនដែលអាចប្រើបាន" ត្រូវបានរក្សាទុកក្នុងឃ្លាំងសម្ងាត់ គិតជា ms (លំនាំដើម `30000`)។ តម្លៃមិនត្រឹមត្រូវ ឬអវិជ្ជមាននឹងត្រឡប់ទៅលំនាំដើមវិញ; `0` បិទឃ្លាំងសម្ងាត់អវិជ្ជមាន។ ប្រភព៖ `src/lib/guardrails/visionBridgeRouter.ts`។ | > [!WARNING] > > 1. ចូលទៅកាន់ [Google Cloud Console → Credentials](https://console.cloud.google.com/apis/credentials) > 2. បង្កើត OAuth 2.0 Client ID (ប្រភេទ៖ "Web application") > 3. បន្ថែម URL ម៉ាស៊ីនមេរបស់អ្នកជា Authorized redirect URI > 4. ជំនួសតម្លៃ credential នៅក្នុង `.env`។ --- ## 12. ការកំណត់ជំនួស User-Agent របស់អ្នកផ្តល់សេវា កំណត់ជំនួស header `User-Agent` ដែលត្រូវបានផ្ញើទៅអ្នកផ្តល់សេវាខាងដើមនីមួយៗ។ តម្លៃនេះត្រូវបានកំណត់ជាឌីណាមិកនៅពេលដំណើរការដោយ executor base class៖ ``` process.env[`${PROVIDER_ID}_USER_AGENT`] ``` > **ប្រភព៖** `open-sse/executors/base.ts` → `buildHeaders()` | អថេរ | តម្លៃលំនាំដើម | ពេលដែលត្រូវធ្វើបច្ចុប្បន្នភាព | | -------------------------------- | --------------------------------------------- | ------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | `CLAUDE_USER_AGENT` | `claude-cli/2.1.280 (external, cli)` | នៅពេល Anthropic ចេញផ្សាយកំណែ CLI ថ្មី | | `CLAUDE_DISABLE_TOOL_NAME_CLOAK` | `false` | `executors/base.ts` + `executors/cliproxyapi.ts` | កំណត់ជា `1`/`true` ដើម្បីបញ្ជូនឈ្មោះ tool របស់ harness ភាគីទីបីទៅ Anthropic ដោយមិនកែប្រែ តាមរយៈផ្លូវទាំងពីរដែលភ្ជាប់ទៅ Anthropic (OAuth ដើម និង CLIProxyAPI)។ តាមលំនាំដើម executor នឹងកំណត់ឈ្មោះក្លែងក្លាយសម្រាប់ឈ្មោះ tool ដែលមិនមែនជា Claude Code តាមរបៀបកំណត់ជាក់លាក់ (ប្រើការផ្គូផ្គងស្តង់ដារ Claude Code នៅពេលមាន បើមិនដូច្នោះទេប្រើ PascalCase) ហើយបម្លែងឈ្មោះទាំងនោះត្រឡប់វិញក្នុង response តាមរយៈ `_toolNameMap` ដើម្បីកុំឱ្យ harness ដែលមាន tool ឈ្មោះជា snake_case ត្រូវបានបដិសេធដោយសារត្រូវបានសម្គាល់ថាជា client ភាគីទីបី។ សម្រាប់តែការបំបាត់កំហុសប៉ុណ្ណោះ។ | | `CODEX_USER_AGENT` | `codex-cli/0.155.0 (Windows 10.0.26200; x64)` | នៅពេល OpenAI ធ្វើបច្ចុប្បន្នភាព Codex CLI | | `CODEX_CLIENT_VERSION` | `0.155.0` | កំណត់ជំនួសកំណែ Codex client ដោយឯករាជ្យពីខ្សែអក្សរ UA ពេញលេញ | | `CLAUDE_CODE_CLIENT_VERSION` | `2.1.280` | កំណត់ជំនួសកំណែ Claude Code ដែលបានប្រកាសដោយឯករាជ្យពី `CLAUDE_USER_AGENT`។ Anthropic ដាក់កម្រិតការចូលប្រើ model មួយចំនួនដោយផ្អែកលើតម្លៃនេះ (#12417)។ | | `CLAUDE_CODE_CLIENT_BUILD_REVISION` | `1e2` | កំណត់ជំនួសបច្ច័យ 3 តួអក្សរដែល OmniRoute បន្ថែមទៅ `cc_version=` ក្នុងប្លុកវិក្កយបត្រ Claude។ បង្កើនវារួមជាមួយ `CLAUDE_CODE_CLIENT_VERSION` — ការកំណត់ថេរតែកំណែប៉ុណ្ណោះនឹងប្រកាសគូ `version.revision` ដែលគ្មាន binary ពិតប្រាកដណាមួយបញ្ចេញ។ | | `GITHUB_COPILOT_CLI_VERSION` | `1.0.91` | កំណត់ជំនួសកំណែ Copilot CLI ដែលបានប្រកាសដោយឯករាជ្យពី `GITHUB_USER_AGENT` | | `GITHUB_USER_AGENT` | `GitHubCopilotChat/0.54.0` | នៅពេល GitHub Copilot Chat ធ្វើបច្ចុប្បន្នភាព | | `ANTIGRAVITY_USER_AGENT` | `antigravity/2.0.1 darwin/arm64` | នៅពេល Antigravity IDE ធ្វើបច្ចុប្បន្នភាព | | `KIRO_USER_AGENT` | `AWS-SDK-JS/3.0.0 kiro-ide/1.0.0` | នៅពេល Kiro IDE ធ្វើបច្ចុប្បន្នភាព | | `KIRO_OAUTH_CLIENT_ID` | `kiro-cli` | កំណត់ជំនួស `clientId` (លេខសម្គាល់សាធារណៈ) សម្រាប់ device-code សង្គមរបស់ Kiro | | `KIRO_VERIFY_FULL_CRC` | `false` | ជម្រើសចូលរួម៖ ការផ្ទៀងផ្ទាត់ CRC សារពេញលេញសម្រាប់ frame នីមួយៗនៅលើ event stream របស់ Kiro (សម្រាប់បំបាត់កំហុស stream ដែលខូច) | | `QODER_USER_AGENT` | `Qoder-Cli` | នៅពេល Qoder CLI ធ្វើបច្ចុប្បន្នភាព | | `CURSOR_USER_AGENT` | `Cursor/3.3` | នៅពេល Cursor ធ្វើបច្ចុប្បន្នភាព | > [!TIP] > អ្នកអាចបន្ថែមការកំណត់ជំនួស User-Agent សម្រាប់អ្នកផ្តល់សេវា **ណាមួយ** ដោយប្រើលំនាំ `{PROVIDER_ID}_USER_AGENT`។ executor នឹងបង្កើតឈ្មោះ env var ជាឌីណាមិក។ --- ## 13. ភាពឆបគ្នានៃស្នាមសម្គាល់ CLI នៅពេលបើកដំណើរការ OmniRoute នឹងរៀបចំលំដាប់ HTTP headers និងវាលក្នុង JSON body ឡើងវិញ ដើម្បីផ្គូផ្គងសញ្ញាសម្គាល់ពិតប្រាកដរបស់ឧបករណ៍ CLI ផ្លូវការ។ វាជួយកាត់បន្ថយហានិភ័យដែលគណនីត្រូវបានដាក់សញ្ញាសម្គាល់ ខណៈពេលដែលនៅតែរក្សា proxy IP របស់អ្នក។ **ប្រភព:** `open-sse/config/cliFingerprints.ts`, `open-sse/executors/base.ts` ### តាមអ្នកផ្ដល់សេវា | អថេរ | ការបើកដំណើរការ | ឥទ្ធិពល | | ------------------------ | -------------- | -------------------------------------------- | | `CLI_COMPAT_CODEX` | `=1` | ត្រាប់តាមសញ្ញាសម្គាល់សំណើរបស់ Codex CLI | | `CLI_COMPAT_CLAUDE` | `=1` | ត្រាប់តាមសញ្ញាសម្គាល់សំណើរបស់ Claude Code | | `CLI_COMPAT_GITHUB` | `=1` | ត្រាប់តាមសញ្ញាសម្គាល់សំណើរបស់ GitHub Copilot | | `CLI_COMPAT_ANTIGRAVITY` | `=1` | ត្រាប់តាមសញ្ញាសម្គាល់សំណើរបស់ Antigravity | | `CLI_COMPAT_CURSOR` | `=1` | ត្រាប់តាមសញ្ញាសម្គាល់សំណើរបស់ Cursor | | `CLI_COMPAT_KIMI_CODING` | `=1` | ត្រាប់តាមសញ្ញាសម្គាល់សំណើរបស់ Kimi Coding | | `CLI_COMPAT_KILOCODE` | `=1` | ត្រាប់តាមសញ្ញាសម្គាល់សំណើរបស់ Kilo Code | | `CLI_COMPAT_CLINE` | `=1` | ត្រាប់តាមសញ្ញាសម្គាល់សំណើរបស់ Cline | ### ជាសកល | អថេរ | ការបើកដំណើរការ | ឥទ្ធិពល | | ---------------- | -------------- | --------------------------------------------------------------------------------- | | `CLI_COMPAT_ALL` | `=1` | បើកដំណើរការភាពឆបគ្នានៃស្នាមសម្គាល់សម្រាប់អ្នកផ្ដល់សេវា **ទាំងអស់** ក្នុងពេលតែមួយ។ | ### ការកំណត់អត្តសញ្ញាណ Kimi Coding CLI ជំនួស | អថេរ | លំនាំដើម | ឯកសារប្រភព | សេចក្ដីពិពណ៌នា | | ----------------------- | ------------------------ | ---------------------------------------- | ------------------------------------------------------------------- | | `KIMI_CLI_VERSION` | `1.36.0` | `src/lib/oauth/providers/kimi-coding.ts` | កំណត់ជំនួសកំណែ Kimi CLI ដែលបានផ្ញើក្នុងអំឡុងការហៅ OAuth/API។ | | `KIMI_CODING_DEVICE_ID` | _(លំនាំដើមដែលបានចាប់យក)_ | `src/lib/oauth/providers/kimi-coding.ts` | កំណត់ជំនួស Kimi device ID ដែលបានចាប់យក និងប្រើក្នុង client headers។ | > [!NOTE] > មុខងារនេះដំណើរការរួមជាមួយការកំណត់ User-Agent ជំនួស (§12)។ ប្រព័ន្ធស្នាមសម្គាល់គ្រប់គ្រងលំដាប់ header និងលំដាប់វាលក្នុង body ខណៈដែលការកំណត់ User-Agent ជំនួសគ្រប់គ្រងខ្សែអក្សរ UA ជាក់លាក់។ មុខងារទាំងពីរអាចត្រូវបានបើកដោយឯករាជ្យពីគ្នា។ --- ## 14. អ្នកផ្ដល់សេវា API Key API keys សម្រាប់អ្នកផ្ដល់សេវាដែលប្រើការផ្ទៀងផ្ទាត់ដោយផ្ទាល់។ **ការរៀបចំដែលបានណែនាំ:** Dashboard → Providers → Add API Key។ ការកំណត់តាមរយៈអថេរបរិស្ថានគឺជាជម្រើសមួយសម្រាប់ការដាក់ឱ្យដំណើរការតាម Docker ឬដោយគ្មានចំណុចប្រទាក់អ្នកប្រើ។ លំនាំដែលប្រព័ន្ធទទួលស្គាល់៖ `{PROVIDER_ID}_API_KEY` | អថេរ | អ្នកផ្ដល់សេវា | | ------------------ | ------------------------------------------------------- | | `DEEPSEEK_API_KEY` | DeepSeek | | `NVIDIA_API_KEY` | NVIDIA NIM | | `JINA_AI_API_KEY` | Jina AI (Foundation API + Reader ជំនួសបម្រុង) | | `JINA_API_KEY` | Jina AI (ឈ្មោះជំនួសសម្រាប់ `JINA_AI_API_KEY`) | | `GEMINI_API_KEY` | Gemini (Google AI Studio) embeddings + chat ជំនួសបម្រុង | | `GOOGLE_API_KEY` | Gemini (ឈ្មោះជំនួសសម្រាប់ `GEMINI_API_KEY`) | > [!NOTE] > ធាតុឋិតិវន្ត `${PROVIDER}_API_KEY` សម្រាប់ Groq, xAI, Mistral, Perplexity, Together AI, Fireworks, Cerebras, Cohere, Nebius និង Qianfan ត្រូវបានដកចេញក្នុង v3.8.0 ពីព្រោះ runtime លែងអានពួកវាទៀតហើយ — អ្នកផ្ដល់សេវាទាំងនោះពឹងផ្អែកទាំងស្រុងលើ Dashboard / `data/provider-credentials.json` / DB ដែលបានអ៊ិនគ្រីប។ សូមមើលផ្នែក _សវនកម្ម៖ អថេរដែលបានដកចេញ / លែងប្រើ_ នៅផ្នែកខាងក្រោមនៃឯកសារនេះសម្រាប់វិធីផ្ទេរ។ > [!TIP] > Keys ដែលបានកំណត់តាមរយៈ Dashboard ត្រូវបានរក្សាទុកដោយអ៊ិនគ្រីបក្នុង SQLite និងមានអាទិភាពលើអថេរបរិស្ថាន។ > > **Jina:** `jina-ai/…` embeddings, rerank, classify, segment និង `jina-search` មិនគិតថ្លៃលើ cluster env key ទេ នៅពេលមានការតភ្ជាប់ `jina-ai` (ឬ `jina-reader` ដែលបានចែករំលែក) ក្នុង dashboard — `getProviderCredentials` បំពេញតម្លៃដែលរកឃើញមុនគេ។ `JINA_AI_API_KEY` / `JINA_API_KEY` ត្រូវបានប្រើតែនៅពេលគ្មាន dashboard key ដែលអាចប្រើបាន។ កំណត់ហេតុការហៅកំណត់អត្តសញ្ញាណ env fallback ជា `connection_id=env:JINA_AI_API_KEY`។ Reader card (`jina-reader`, `r.jina.ai`) មិនដែលបម្រើ `/v1/embeddings` ឬ `/v1/rerank` ទេ។ > > **Gemini:** `gemini/gemini-embedding-2` (ឈ្មោះជំនួស `google/gemini-embedding-2`) ប្រើការតភ្ជាប់ `gemini` ក្នុង dashboard ជាមុន។ `GEMINI_API_KEY` / `GOOGLE_API_KEY` ត្រូវបានប្រើតែនៅពេលគ្មាន dashboard key ដែលអាចប្រើបាន។ កំណត់ហេតុការហៅកំណត់អត្តសញ្ញាណ env fallback ជា `connection_id=env:GEMINI_API_KEY`។ ចរាចរណ៍ multimodal ដើមប្រើ `x-goog-api-key` ជាមួយ `:embedContent` / `:batchEmbedContents` — ធាតុ OpenAI `input` ចំនួន N នឹងក្លាយជាវ៉ិចទ័រចំនួន N។ --- ## 15. ការកំណត់ពេលអស់កំណត់ តម្លៃទាំងអស់គិតជា **មិល្លីវិនាទី**។ ការកំណត់តម្លៃជាកណ្ដាលស្ថិតនៅក្នុង `src/shared/utils/runtimeTimeouts.ts`។ ### ឋានានុក្រមពេលអស់កំណត់ ``` REQUEST_TIMEOUT_MS (ការកំណត់ជំនួសសកល) ├─→ FETCH_TIMEOUT_MS (ការហៅទៅកាន់អ្នកផ្តល់សេវាខាងលើ, លំនាំដើម៖ 600000) │ ├─→ FETCH_HEADERS_TIMEOUT_MS (ទទួលតម្លៃបន្តពី FETCH_TIMEOUT_MS) │ ├─→ FETCH_BODY_TIMEOUT_MS (ទទួលតម្លៃបន្តពី FETCH_TIMEOUT_MS) │ ├─→ TLS_CLIENT_TIMEOUT_MS (ទទួលតម្លៃបន្តពី FETCH_TIMEOUT_MS) │ │ └── TLS_FIRST_BYTE_WATCHDOG_MS (ឯករាជ្យ, លំនាំដើម៖ 10000) │ ├── RESPONSES_FIRST_BYTE_TIMEOUT_MS (ឯករាជ្យ, លំនាំដើម៖ 15000) │ ├── OPENCODE_RESPONSES_HEADERS_WAIT_MS (ឯករាជ្យ, លំនាំដើម៖ 0 = បិទ, តម្លៃដែលបានណែនាំ៖ 30000) │ ├── OPENCODE_RESPONSES_HEADERS_WAIT_MAX_ROTATIONS (ឯករាជ្យ, លំនាំដើម៖ 2) │ ├── FETCH_CONNECT_TIMEOUT_MS (ឯករាជ្យ, លំនាំដើម៖ 30000) │ └── FETCH_KEEPALIVE_TIMEOUT_MS (ឯករាជ្យ, លំនាំដើម៖ 4000) ├─→ STREAM_IDLE_TIMEOUT_MS (ទទួលតម្លៃបន្តពី REQUEST_TIMEOUT_MS, លំនាំដើម៖ 600000) ├─→ STREAM_ACTIVE_TIMEOUT_MS (ឯករាជ្យ, លំនាំដើម៖ 1260000; 0 បិទមុខងារ) ├─→ STREAM_READINESS_TIMEOUT_MS (ទទួលតម្លៃបន្តពី REQUEST_TIMEOUT_MS, លំនាំដើម៖ 80000) ├─→ STREAM_READINESS_MAX_TIMEOUT_MS (កំណត់ព្រំដែនអតិបរមាសម្រាប់ការពន្យារពេលត្រៀមខ្លួនបែបសម្របខ្លួន, លំនាំដើម៖ 180000) └─→ API_BRIDGE_PROXY_TIMEOUT_MS (ទទួលតម្លៃបន្តពី REQUEST_TIMEOUT_MS, លំនាំដើម៖ 30000) ├─→ API_BRIDGE_SERVER_REQUEST_TIMEOUT_MS (បានគណនាចេញពីតម្លៃផ្សេង, លំនាំដើម៖ 300000) ├── API_BRIDGE_SERVER_HEADERS_TIMEOUT_MS (លំនាំដើម៖ 60000) ├── API_BRIDGE_SERVER_KEEPALIVE_TIMEOUT_MS (លំនាំដើម៖ 5000) └── API_BRIDGE_SERVER_SOCKET_TIMEOUT_MS (លំនាំដើម៖ 0 = បានបិទ) ``` | អថេរ | លំនាំដើម | ការពិពណ៌នា | | ----------------------------------------------- | ----------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `REQUEST_TIMEOUT_MS` | _(មិនបានកំណត់)_ | ផ្លូវកាត់សកល — សរសេរជាន់លើតម្លៃលំនាំដើមទាំង `FETCH_TIMEOUT_MS` និង `STREAM_IDLE_TIMEOUT_MS`។ | | `FETCH_TIMEOUT_MS` | `600000` | រយៈពេលអស់ពេលសរុបនៃសំណើ HTTP សម្រាប់ការហៅទៅកាន់អ្នកផ្តល់សេវាខាងលើ។ | | `STREAM_IDLE_TIMEOUT_MS` | `600000` | រយៈពេលស្ងាត់អតិបរមារវាងបៃឆៅពីខាងលើ មុនពេលបោះបង់។ ម៉ូដែលដែលគិតពិចារណាបន្ថែមកម្រផ្អាកលើសពី 90 វិនាទី។ | | `STREAM_ACTIVE_TIMEOUT_MS` | `1260000` | អាយុកាលសកម្មសរុបអតិបរមារបស់ស្ទ្រីម SSE; វាមិនកំណត់ឡើងវិញពេលទទួលបានបៃពីខាងលើឡើយ ហើយឯករាជ្យពី `REQUEST_TIMEOUT_MS`។ តម្លៃនេះបានមកពី `timeoutMs` ធំបំផុតតាមម៉ូដែលនីមួយៗក្នុងបញ្ជីចុះឈ្មោះ (1200000, Codex) បូករឹម 60000 ដូច្នេះម៉ូដែលដែលត្រូវបានអនុញ្ញាតឱ្យដំណើរការពេញថវិកាពេលវេលារបស់វា នឹងមិនត្រូវបានបញ្ឈប់នៅពាក់កណ្តាលចម្លើយឡើយ។ កំណត់ជា `0` ដើម្បីបិទ។ | | `OMNIROUTE_SSE_COMMENTS` | _(បានបិទ)_ | ថាតើ OmniRoute អាចបញ្ចេញបន្ទាត់មតិយោបល់ SSE `:` (ឧ. ចង្វាក់បេះដូង `: keepalive` និងទិន្នន័យមេតាបញ្ចប់ `x-omniroute-*`) ដែរឬទេ។ ត្រូវបានបិទតាមលំនាំដើម (#10524) ព្រោះកម្មវិធីអតិថិជនដែលឆបគ្នាជាមួយ OpenAI យ៉ាងតឹងរ៉ឹងប្រើ JSON.parse លើគ្រប់បន្ទាត់ SSE ហើយគាំងនៅពេលជួបមតិយោបល់ `:`; ចង្វាក់បេះដូង `data:` មិនរងផលប៉ះពាល់ទេ។ កំណត់ជា `on`/`true`/`1`/`yes` ដើម្បីបើកប្រើវិញ។ ប្រើដោយ `open-sse/utils/sseHeartbeat.ts`។ | | `SSE_COALESCE_MS` | `0` (បិទ) | ជម្រើសចូលប្រើ៖ បញ្ចូលព្រឹត្តិការណ៍ Claude `content_block_delta` ដែលនៅជាប់គ្នា (មានលិបិក្រមប្លុក និងប្រភេទ delta ដូចគ្នា) ដែលបានផ្ញើទៅកម្មវិធីអតិថិជន Claude ដោយបញ្ចេញយ៉ាងហោចណាស់រៀងរាល់ N ms។ គ្មានការបាត់បង់ទិន្នន័យ; `signature_delta` និងព្រឹត្តិការណ៍ព្រំដែនមិនត្រូវបានបញ្ចូលគ្នាឡើយ។ អនុវត្តចំពោះគ្រប់ប្រភេទ delta លុះត្រាតែអថេរតាមប្រភេទខាងក្រោមត្រូវបានកំណត់។ ប្រើដោយ `open-sse/utils/sseDeltaCoalesce.ts`។ | | `SSE_COALESCE_THINKING_MS` | `0` (បិទ) | សរសេរជាន់លើ `SSE_COALESCE_MS` តាមប្រភេទសម្រាប់ `thinking_delta`។ | | `SSE_COALESCE_TEXT_MS` | `0` (បិទ) | សរសេរជាន់លើ `SSE_COALESCE_MS` តាមប្រភេទសម្រាប់ `text_delta`។ | | `SSE_COALESCE_INPUT_JSON_MS` | `0` (បិទ) | សរសេរជាន់លើ `SSE_COALESCE_MS` តាមប្រភេទសម្រាប់ `input_json_delta`។ | | `SSE_FRAME_COALESCE_MS` | `0` (បិទ) | ជម្រើសចូលប្រើ៖ ដាក់ស៊ុម SSE ដែលបានបញ្ជូនបន្តក្នុងរយៈពេល N ms ជាបាច់ ដើម្បីសរសេរទៅកម្មវិធីអតិថិជនតែម្តង។ ស៊ុមដំបូង និងស៊ុមបញ្ចប់ (`[DONE]`, `message_stop`, `error`, `response.completed`/`failed`/`incomplete`) មិនត្រូវបានពន្យារពេលឡើយ; នៅពេលបើកការដាក់ជាបាច់ ITL វាស់គម្លាតរវាងបាច់។ ប្រើដោយ `open-sse/utils/sseOutputSink.ts`។ | | `SSE_STALL_WATCHDOG` | `timer` | ការអនុវត្តកម្មវិធីឃ្លាំមើលការជាប់គាំងបៃសម្រាប់ការឆ្លើយតបជាស្ទ្រីម។ `timer` រៀបចំកម្មវិធីកំណត់ពេលមួយឡើងវិញសម្រាប់គ្រប់កំណាត់ទិន្នន័យពីខាងលើ (ដំណើរការត្រឹមត្រូវនៅខ្ទង់ពេលវេលាជាប់គាំង); `interval` រក្សាការត្រួតពិនិត្យមួយសម្រាប់ស្ទ្រីមនីមួយៗ ដោយមានចន្លោះពេល `clamp(budget/4, 1s, 5s)` ដូច្នេះការជាប់គាំងនឹងត្រូវរកឃើញក្នុងរយៈពេលថវិកា + ចន្លោះពេល។ ប្រើដោយ `open-sse/utils/streamStallWatchdog.ts`។ | | `STREAM_READINESS_TIMEOUT_MS` | `80000` | រយៈពេលសម្រាប់ទទួលព្រឹត្តិការណ៍ SSE ដំបូងដែលមិនមែនជា ping។ ទទួលតម្លៃបន្តពី `REQUEST_TIMEOUT_MS` នៅពេលវាត្រូវបានកំណត់។ | | `STREAM_READINESS_MAX_TIMEOUT_MS` | `180000` | រយៈពេលអតិបរមាដែលអាចសម្របខ្លួនបានសម្រាប់ការត្រៀមរួចរាល់នៃព្រឹត្តិការណ៍ដំបូង សម្រាប់សំណើស្ទ្រីមដែលមានទំហំធំ ប្រើឧបករណ៍ច្រើន ឬមានការគិតវិភាគខ្ពស់។ | | `OMNIROUTE_AGENT_GOAL_POLICY_ENABLED` | `true` | កុងតាក់បិទបន្ទាន់សម្រាប់ហេរីស្ទិក `/goal`។ កំណត់ជា `false`/`0`/`off` ដើម្បីបិទការរកឃើញទាំងស្រុង — រយៈពេលអស់ពេលសម្រាប់ការត្រៀមរួចរាល់ និងការសង្គ្រោះស្ទ្រីម នឹងមិនត្រូវបានបង្កើនដោយតួសំណើ/ក្បាលទេ ដែលជួយកាត់បន្ថយការពង្រីករយៈពេលអស់ពេលដែលអាចគ្រប់គ្រងដោយកម្មវិធីអតិថិជន។ | | `OMNIROUTE_AGENT_GOAL_READINESS_MAX_TIMEOUT_MS` | `600000` | រយៈពេលអតិបរមាសម្រាប់ការត្រៀមរួចរាល់នៃព្រឹត្តិការណ៍ដំបូង សម្រាប់ការដំណើរការភ្នាក់ងារ `/goal` ដែលបានរកឃើញ ឬសំណើដែលត្រូវបានបង្ខំដោយ `x-omniroute-agent-goal`។ | | `OMNIROUTE_AGENT_GOAL_STREAM_RECOVERY` | `true` | បើកការសង្គ្រោះស្ទ្រីមដំបូងដោយស្វ័យប្រវត្តិ សម្រាប់ការដំណើរការភ្នាក់ងារ `/goal` ដែលបានរកឃើញ។ កំណត់ជា `false`/`0`/`off` ដើម្បីបិទការចូលរួមតាមជម្រើសជាក់លាក់សម្រាប់ goal។ វាអាចត្រឹមតែបន្ថែមការសង្គ្រោះពីលើតម្លៃលំនាំដើមរបស់ប្រតិបត្តិករប៉ុណ្ណោះ — វាមិនដែលសរសេរជាន់លើការបដិសេធច្បាស់លាស់ក្នុងការកំណត់ `STREAM_RECOVERY_ENABLED`/DB ឡើយ។ | | `OMNIROUTE_CODEX_DROP_NONSTANDARD_EVENTS` | `true` | ដកព្រឹត្តិការណ៍ SSE `codex.*` មិនស្តង់ដារ (ឧ. `codex.rate_limits`) ដែលធ្វើឱ្យ `responses.stream()` របស់ OpenAI SDK ខូចដោយមានកំហុស 502។ បើកតាមលំនាំដើម (#11014)។ កំណត់ជា `0`/`false`/`no`/`off` ដើម្បីបញ្ជូនពួកវាបន្ត។ | | `OMNIROUTE_CODEX_APPSERVER_WS` | _(មិនបានកំណត់)_ | ការដឹកជញ្ជូនតាម app-server របស់ Codex ដែលជាជម្រើសចូលប្រើ។ ចំណុចបញ្ចប់ WebSocket (`ws://`/`wss://`) របស់ sidecar `codex app-server` មូលដ្ឋាន។ នៅពេលកំណត់វាជាមួយនឹង token សំណើ Codex នឹងត្រូវបានបញ្ជូនតាម JSON-RPC ទៅកាន់ sidecar ជំនួសឱ្យ HTTP Responses API។ ក៏អាចកំណត់តាមការតភ្ជាប់នីមួយៗតាមរយៈ `providerSpecificData.codexAppServerUrl` ផងដែរ។ ប្រើដោយ `open-sse/executors/codex/appServerConfig.ts`។ | | `OMNIROUTE_CODEX_APPSERVER_WS_TOKEN` | _(មិនបានកំណត់)_ | token សមត្ថភាព/bearer ដែលបង្ហាញដោយផ្ទាល់ទៅ app-server។ ការសរសេរជាន់លើតាមការតភ្ជាប់នីមួយៗ៖ `providerSpecificData.codexAppServerToken`។ | | `OMNIROUTE_CODEX_APPSERVER_WS_TOKEN_FILE` | _(មិនបានកំណត់)_ | ផ្លូវទៅកាន់ឯកសារដែលផ្ទុក capability token របស់ app-server (ពី `codex app-server --ws-token-file`)។ ប្រើនៅពេល `OMNIROUTE_CODEX_APPSERVER_WS_TOKEN` មិនត្រូវបានកំណត់។ ការកំណត់ជំនួសសម្រាប់ការតភ្ជាប់នីមួយៗ៖ `providerSpecificData.codexAppServerTokenFile`។ | | `OMNIROUTE_CODEX_APPSERVER_CWD` | `/tmp` | ថតការងារដែលវេនរបស់ app-server ដំណើរការនៅក្នុងនោះ។ ការកំណត់ជំនួសសម្រាប់ការតភ្ជាប់នីមួយៗ៖ `providerSpecificData.codexAppServerCwd`។ | | `OMNIROUTE_CODEX_APPSERVER_APPROVAL` | _(មិនបានកំណត់)_ | គោលការណ៍អនុម័តដែលត្រូវបញ្ជូនទៅវេនរបស់ app-server (ឧ. `never`, `on-request`)។ ការកំណត់ជំនួសសម្រាប់ការតភ្ជាប់នីមួយៗ៖ `providerSpecificData.codexAppServerApprovalPolicy`។ | | `OMNIROUTE_CODEX_APPSERVER_SANDBOX` | _(មិនបានកំណត់)_ | គោលការណ៍ sandbox ដែលត្រូវបញ្ជូនទៅវេនរបស់ app-server (ឧ. `read-only`, `workspace-write`, `danger-full-access`)។ នៅពេលមិនបានកំណត់ executor ប្រើ `workspace-write` ជាលំនាំដើម (បានពង្រឹងសុវត្ថិភាព; ពីមុនជា `danger-full-access`)។ ការកំណត់ជំនួសសម្រាប់ការតភ្ជាប់នីមួយៗ៖ `providerSpecificData.codexAppServerSandbox`។ | | `OMNIROUTE_CODEX_APPSERVER_AUTO_APPROVE` | `false` | អនុម័តដោយស្វ័យប្រវត្តិនូវសំណើអនុម័តផ្ទាល់ខ្លួនរបស់ app-server (ការប្រតិបត្តិ command/file/permission នៅលើ host)។ បិទជាលំនាំដើម — សំណើត្រូវបានបដិសេធដោយស្វ័យប្រវត្តិ; ការហៅឧបករណ៍របស់ harness មិនរងផលប៉ះពាល់ទេ (ពួកវាឆ្លងកាត់ passthrough `item/tool/call` ដាច់ដោយឡែក)។ ទទួលយក `true`/`1`/`yes`។ ការកំណត់ជំនួសសម្រាប់ការតភ្ជាប់នីមួយៗ៖ `providerSpecificData.codexAppServerAutoApprove`។ | | `FETCH_HEADERS_TIMEOUT_MS` | = `FETCH_TIMEOUT_MS` | ពេលវេលាសម្រាប់ទទួល header នៃ response។ | | `OMNIROUTE_FETCH_START_TIMEOUT_CAP_MS` | `110000` | ពេលរង់ចាំអតិបរមាសម្រាប់ header នៃ response លើសំណើ streaming (ms)។ `0` បិទដែនកំណត់នេះ; `fetchStartTimeoutCapMs` ដែលកំណត់ជាក់លាក់សម្រាប់ provider មានអាទិភាព។ | | `OMNIROUTE_DIRECT_HEADERS_TIMEOUT_MS` | `30000` (30s) | ពេលរង់ចាំអតិបរមាសម្រាប់ការចាប់ផ្ដើម response (ms) សម្រាប់ការប៉ុនប៉ងផ្ទាល់ដោយមិនប្រើ proxy នីមួយៗ។ ករណី timeout នឹងសាកល្បងម្ដងទៀតលើ socket ថ្មី; កំណត់ជា `0` ដើម្បីបិទដែនកំណត់ និងរក្សាឥរិយាបថពីមុន។ | | `OMNIROUTE_LOCAL_DIRECT_HEADERS_TIMEOUT_MS` | `300000` (5 min) | កម្រិតអប្បបរមានៃពេលចាប់ផ្ដើម response (ms) សម្រាប់ការប៉ុនប៉ងផ្ទាល់ដោយមិនប្រើ proxy ដែល target host ជា private/LAN/loopback (ឧទាហរណ៍ `localhost`, `host.docker.internal`, `192.168.x.x`) ដើម្បីកុំឱ្យ cold start របស់ Ollama ដើមត្រូវបានផ្ដាច់ដោយតម្លៃលំនាំដើម 30s ខាងលើ។ ដំណើរការជាកម្រិតអប្បបរមា៖ ពេលរង់ចាំជាក់ស្តែងគឺតម្លៃធំជាងរវាងតម្លៃនេះ និង `OMNIROUTE_DIRECT_HEADERS_TIMEOUT_MS`; `0` ឬតម្លៃមិនត្រឹមត្រូវនឹងលុបកម្រិតអប្បបរមាសម្រាប់ local។ Remote host មិនរងផលប៉ះពាល់ទេ។ | | `OMNIROUTE_DIRECT_RESPONSE_RETRY_TIMEOUT_MS` | `600000` (10 min) | កម្រិតអតិបរមា (ms) សម្រាប់ការប៉ុនប៉ង RETRY ដោយប្រើ socket ថ្មី បន្ទាប់ពី timeout ពេលចាប់ផ្ដើម response នៃការប៉ុនប៉ង pooled ខាងលើ (#13703)។ អនុវត្តតែនៅពេល caller បានភ្ជាប់ deadline signal ផ្ទាល់ខ្លួនរួចហើយ (លំដាប់បន្តបន្ទាប់នៃ connection/model/provider/`FETCH_TIMEOUT_MS` ដែលបានដោះស្រាយ); signal នោះជាដែនកំណត់ពិតប្រាកដ ហើយនឹងកើតមុនក្នុងផ្លូវដែលបានគ្រោងទុក ដូច្នេះនេះគ្រាន់តែជាការការពារបន្ថែមដ៏ទូលំទូលាយ មិនមែនជាដែនកំណត់ថេរទេ — បើគ្មានវា ការសាកល្បងឡើងវិញនឹងប្រើផ្ទាំងពេលខ្លី `OMNIROUTE_DIRECT_HEADERS_TIMEOUT_MS` ដដែលដូចការប៉ុនប៉ង pooled ហើយបណ្ដាលឱ្យម៉ូដែល reasoning ដែលមាន TTFB យឺតប៉ុន្តែដំណើរការធម្មតា ទទួល 504។ មិនត្រូវបានអនុញ្ញាតឱ្យទាបជាងកម្រិតអប្បបរមាថេរខាងលើឡើយ; នៅពេល caller មិនផ្ដល់ deadline signal សោះ ការសាកល្បងឡើងវិញនឹងរក្សាកម្រិតអប្បបរមាថេរដដែល។ | | `FETCH_BODY_TIMEOUT_MS` | = `FETCH_TIMEOUT_MS` | ពេលវេលាសម្រាប់ទទួល body ទាំងមូលនៃ response។ | | `FETCH_CONNECT_TIMEOUT_MS` | `30000` | timeout សម្រាប់ការបង្កើតការតភ្ជាប់ TCP។ | | `FETCH_KEEPALIVE_TIMEOUT_MS` | `4000` | timeout ពេលទំនេររបស់ keep-alive socket។ | | `TLS_CLIENT_TIMEOUT_MS` | = `FETCH_TIMEOUT_MS` | timeout សម្រាប់ TLS fingerprint proxy (wreq-js)។ | | `TLS_FIRST_BYTE_WATCHDOG_MS` | `10000` | កំណត់ time-to-first-byte ជាក់លាក់លើ body របស់ TLS-fingerprint transport នៃ wreq-js; `TLS_CLIENT_TIMEOUT_MS` តែមួយមិនអាចចាប់បាននូវ body ដែលជាប់គាំងទេ ព្រោះវាបញ្ចប់ការរង់ចាំភ្លាមៗនៅពេល header មកដល់ (#12656)។ timeout នឹងបោះបង់ wreq reader ហើយត្រឡប់ទៅប្រើ direct/proxy dispatcher; `0` បិទ watchdog។ | | `RESPONSES_FIRST_BYTE_TIMEOUT_MS` | `15000` | សម្រាប់តែ OpenCode executor ហើយតែនៅពេល feature flag `OPENCODE_RESPONSES_STALL_ROTATION` បើកប៉ុណ្ណោះ (បិទជាលំនាំដើម)៖ កំណត់ពេលរង់ចាំសម្រាប់ body byte ដំបូងនៃ Responses reply ដែលបាន streamed បន្ទាប់ពី header របស់វា (#13484)។ Responses stream ចាប់ផ្ដើមជាមួយ `response.created` ដូច្នេះភាពស្ងាត់លើសពីផ្ទាំងពេលនេះគឺជាការជាប់គាំង៖ account នឹងត្រូវបាន cooldown ហើយសំណើនឹងប្ដូរទៅ account បន្ទាប់ម្ដង; ការជាប់គាំងជាលើកទីពីរនឹងបរាជ័យភ្លាមៗ។ `0` បិទការការពារ ទោះបី flag បើកក៏ដោយ។ | | `OPENCODE_RESPONSES_HEADERS_WAIT_MS` | `0` (= បិទ) | សម្រាប់តែ OpenCode executor៖ កំណត់ពេលរង់ចាំ header នៃ upstream response លើការហៅ Responses ដែលបាន streamed នៅពេលនៅមាន account មួយទៀត — សំណើដែលកំពុងរង់ចាំក្នុងជួរនឹងឈប់រង់ចាំ ហើយបន្តទៅមុខ ជំនួសឱ្យការរង់ចាំរហូតដល់ផ្ទាំងពេល header ពេញលេញ។ មានតែការហៅ Responses ដែលបាន streamed ប៉ុណ្ណោះដែលរងផលប៉ះពាល់ (Responses stream ចាប់ផ្ដើមជាមួយ `response.created` ដូច្នេះភាពស្ងាត់នៅទីនោះគឺជាជួររង់ចាំ មិនមែនការបង្កើតទិន្នន័យទេ); chat completions និងការហៅដែលមិនបាន streamed មិនត្រូវបានប៉ះពាល់ទេ ហើយផ្ទាំងពេលនេះគ្រាន់តែកាត់បន្ថយកម្រិតអតិបរមានៃ fetch-start ជាក់ស្តែងប៉ុណ្ណោះ មិនដែលពង្រីកវាទេ។ តម្លៃដែលបានណែនាំនៅពេលបើក៖ `30000`។ `0` បិទ។ | | `OPENCODE_RESPONSES_HEADERS_WAIT_MAX_ROTATIONS` | `2` | សម្រាប់ OpenCode executor តែប៉ុណ្ណោះ៖ ចំនួនដងក្នុងមួយសំណើដែលដែនកំណត់ការរង់ចាំ headers ខាងលើអាចប្តូរទៅគណនីបន្ទាប់។ គណនីដែលនៅសល់ចុងក្រោយតែងតែរក្សាទុកចន្លោះពេលពេញលេញសម្រាប់ headers។ | | `OPENCODE_PARK_AND_RESUME` | `false` | សម្រាប់ OpenCode executor តែប៉ុណ្ណោះ៖ ផ្អាកទុកសំណើដោយប្រើ heartbeat បន្ទាប់ពីមានកំហុសបណ្តោះអាសន្ន 429 ម្តងហើយម្តងទៀត (ឬមានសញ្ញាសម្គាល់ pool-strain ថ្មី) បន្ទាប់មកចាក់ឡើងវិញនូវផ្នែកមួយដែលមានដែនកំណត់រហូតដល់ 3 គណនីតាមលំដាប់ ជំនួសឱ្យការបញ្ជូនទៅកាន់គណនីទាំងអស់ក្នុងពេលតែមួយ (#13924)។ បិទតាមលំនាំដើម៖ រាល់ 429 នឹងប្តូរទៅគណនីបន្ទាប់ដូចពីមុន។ | | `OPENCODE_PARK_REPLAY_SERVE_SETASIDE` | `false` | សម្រាប់ OpenCode executor តែប៉ុណ្ណោះ៖ នៅពេលគណនីទាំងអស់ដែលផុតរយៈពេល cooldown និងរួចរាល់ក្នុងផ្នែកចាក់ឡើងវិញនៃ park-and-resume ត្រូវបានទុកមួយឡែកដោយអង្គចងចាំការបដិសេធរបស់ proxy សូមបម្រើតាមរយៈគណនីទាំងនោះទោះជាយ៉ាងណាក៏ដោយ ជំនួសឱ្យការមិនចាក់ឡើងវិញអ្វីទាំងអស់ (#14851, ការបន្តពី #14750)។ បិទតាមលំនាំដើម៖ ផ្នែកចាក់ឡើងវិញនឹងទទេក្នុងករណីនោះ ដូចមុន #14750។ | | `STREAM_READINESS_STALL_RETRY` | `false` | សម្រាប់ streaming chat តែប៉ុណ្ណោះ៖ នៅពេល body ដំបូងពី upstream ជាប់គាំងមុនពេលបង្កើត event ដែលអាចប្រើបាន សូមធ្វើការព្យាយាមជាលើកទីពីរមួយដងដែលមានដែនកំណត់ តាមរយៈផ្លូវ routing ដដែល ដោយប្រើថវិកាពេលវេលាត្រៀមខ្លួនដដែល និងគ្មានការពិន័យគណនី។ បិទតាមលំនាំដើម៖ body ដំបូងដែលជាប់គាំងនឹងធ្វើឱ្យសំណើបរាជ័យដោយមិនព្យាយាមម្តងទៀត។ | | `OPENCODE_POOL_RESELECT` | `false` | សម្រាប់ OpenCode executor តែប៉ុណ្ណោះ៖ បន្ទាប់ពីទទួលបាន 429 ពី provider ដែលដាក់ជាក្រុមតាម egress លើគណនីដែលគ្មាន proxy ក្រោមបរិបទ pool បច្ចុប្បន្ន សូមឱ្យ connection pool ជ្រើសរើសសមាជិកផ្សេងសម្រាប់ការព្យាយាមបន្ទាប់ ជំនួសឱ្យការព្យាយាមម្ដងទៀតដោយប្រើអាសយដ្ឋាន egress ដដែល។ វាកំណត់លំដាប់ ប៉ុន្តែមិនដកចេញទេ៖ pool ដែលបានប្រើអស់នៅតែរក្សាឥរិយាបថបច្ចុប្បន្ន។ បិទតាមលំនាំដើម៖ រាល់ 429 នឹងប្តូរទៅគណនីបន្ទាប់ដូចពីមុន។ | | `OPENCODE_POOL_STRAIN_MARKER_PATH` | _(មិនបានកំណត់)_ | សម្រាប់ OpenCode executor តែប៉ុណ្ណោះ៖ កំណត់ជំនួស path របស់សញ្ញាសម្គាល់ pool-strain ដែលត្រូវបានអានមុនពេលផ្អាកទុក (`{since, reason, ttl_s}`, លំនាំដើម `/tmp/opencode-pool-strain.json`, #13924)។ សញ្ញាសម្គាល់ថ្មីនឹងផ្អាកទុកដោយមិនរាប់ឡើងវិញ។ ប្រសិនបើគ្មាន ឬហួសសុពលភាព វានឹងត្រឡប់ទៅប្រើ burst counter។ | | `API_BRIDGE_PROXY_TIMEOUT_MS` | `30000` | រយៈពេលអតិបរមាសម្រាប់ proxy hop នៃសំណើ bridge `/v1`។ | | `FIRECRAWL_BASE_URL` | `https://api.firecrawl.dev` | កំណត់ Firecrawl web-fetch executor ឱ្យប្រើ instance ដែល host ដោយខ្លួនឯង (API key មិនចាំបាច់សម្រាប់ការប្រើប្រាស់ក្រៅ cloud)។ | | `FIRECRAWL_TIMEOUT_MS` | `30000` | រយៈពេលអតិបរមាក្នុងមួយសំណើសម្រាប់ Firecrawl web-fetch executor។ | | `TAVILY_BASE_URL` | _(មិនបានកំណត់)_ | URL មូលដ្ឋានសម្រាប់ Tavily `/usage` quota fetcher (Provider Limits)។ វាត្រូវបានមិនអើពើនៅពេលចង្អុលទៅ `api.tavily.com`។ ប្រសិនបើមិនបានកំណត់ វានឹងត្រឡប់ទៅប្រើ URL មូលដ្ឋានរបស់ connection។ | | `API_BRIDGE_SERVER_REQUEST_TIMEOUT_MS` | `300000` | រយៈពេលអតិបរមាសរុបនៃសំណើ server សម្រាប់ bridge។ | | `API_BRIDGE_SERVER_HEADERS_TIMEOUT_MS` | `60000` | រយៈពេលសម្រាប់ផ្ញើ response headers តាមរយៈ bridge។ | | `API_BRIDGE_SERVER_KEEPALIVE_TIMEOUT_MS` | `5000` | រយៈពេលអតិបរមានៃភាពទំនេរ keep-alive របស់ bridge។ | | `API_BRIDGE_SERVER_SOCKET_TIMEOUT_MS` | `0` | រយៈពេលអតិបរមារបស់ raw socket (0 = បិទ)។ | | `SHUTDOWN_TIMEOUT_MS` | `30000` | រយៈពេលអនុគ្រោះនៅពេលទទួល SIGTERM/SIGINT មុនពេលបង្ខំឱ្យចាកចេញ។ | | `OMNIROUTE_DEFAULT_FETCH_TIMEOUT_MS` | `120000` | តម្លៃបម្រុងដែលប្រើដោយ `src/shared/utils/fetchTimeout.ts` នៅពេល `FETCH_TIMEOUT_MS` មិនបានកំណត់។ | | `OMNIROUTE_PROVIDER_PROBE_TIMEOUT_MS` | `8000` | រយៈពេលអតិបរមា (ms) សម្រាប់ preset `validationRead` និង `modelsProbe` ក្នុង `src/shared/network/safeOutboundFetch.ts`។ បង្កើនតម្លៃនេះសម្រាប់ endpoint ដែលយឺត (Cerebras, Cloudflare AI, Groq) ដើម្បីទប់ស្កាត់ការប្រែប្រួលទៅមករវាង active/error នៅក្នុង dashboard។ ត្រឡប់ទៅប្រើ 8000ms សម្រាប់តម្លៃមិនត្រឹមត្រូវ (<1000) ឬតម្លៃដែលមិនមែនជាលេខ។ | | `OMNIROUTE_RELAY_FETCH_TIMEOUT_MS` | `25000` | រយៈពេលអតិបរមានៃ fetch ដែលសម្គាល់ជាក់លាក់សម្រាប់ relay ក្នុង `open-sse/utils/proxyFetch.ts` (#9158)។ relay ដែលជាប់គាំងត្រូវតែបរាជ័យមុនរយៈពេលអតិបរមារបស់ client/agent (~30s) ដើម្បីឱ្យអ្នកហៅឃើញការបរាជ័យជាក់លាក់របស់ relay ជំនួសឱ្យរយៈពេលអតិបរមា upstream ទូទៅ។ ត្រូវបានកំណត់ត្រឹម `29000` ដើម្បីឱ្យវាកើតឡើងមុនជានិច្ច។ | | `OMNIROUTE_RETRY_BACKOFF_MS` | `10` | រយៈពេលរង់ចាំរួមមុនព្យាយាមម្តងទៀត សម្រាប់ផ្លូវដែលព្យាយាមម្ដងទៀតតែមួយដងតាម direct/relay/proxy ក្នុង `open-sse/utils/proxyFetch.ts` (#9158)។ `0` = ព្យាយាមម្ដងទៀតភ្លាមៗ។ | | `OMNIROUTE_CLAUDE_TLS_TIMEOUT_MS` | `60000` | រយៈពេលអតិបរមានៃសំណើ wreq-js ដើម (`claudeTlsClient.ts`)។ | | `OMNIROUTE_CLAUDE_TLS_GRACE_MS` | `10000` | រយៈពេលអនុគ្រោះនៃ hard-deadline ដាច់ខាតរបស់ JS ដែលបន្ថែមពីលើរយៈពេលអតិបរមាដើម។ | | `OMNIROUTE_PPLX_TLS_TIMEOUT_MS` | `30000` | រយៈពេលអតិបរមានៃសំណើ wreq-js ដើម (`perplexityTlsClient.ts`)។ | | `OMNIROUTE_PPLX_TLS_GRACE_MS` | `10000` | រយៈពេលបន្ថែមសម្រាប់ hard-deadline ដាច់ខាតរបស់ JS ដែលត្រូវបានបន្ថែមពីលើ timeout ដើម។ | | `OMNIROUTE_PPLX_SEARCH_HINT` | `0` (បិទ) | បន្ថែម "អ្នកមានការស្វែងរកតាមវេបដែលភ្ជាប់មកជាមួយ។ ឆ្លើយសំណួរដោយផ្ទាល់ដោយប្រើលទ្ធផលស្វែងរក។" ទៅកាន់ system message របស់អ្នកហៅ (`perplexity-web/protocol.ts`)។ តាមលំនាំដើម វាត្រូវបានបិទ — ទោះយ៉ាងណា Perplexity នៅតែស្វែងរក ហើយប្រយោគនេះលេចធ្លាយចូលក្នុងចម្លើយជា meta-commentary សម្រាប់ coding clients។ កំណត់ជា `1`/`true`/`yes`/`on` ដើម្បីស្ដារឡើងវិញ។ | | `OMNIROUTE_GROK_TLS_TIMEOUT_MS` | `60000` | timeout សំណើដើមរបស់ wreq-js (`grokTlsClient.ts`)។ | | `OMNIROUTE_GROK_TLS_GRACE_MS` | `10000` | រយៈពេលបន្ថែមសម្រាប់ hard-deadline ដាច់ខាតរបស់ JS ដែលត្រូវបានបន្ថែមពីលើ timeout ដើម។ | | `OMNIROUTE_NOTION_TLS_TIMEOUT_MS` | `30000` | timeout សំណើដើមរបស់ wreq-js (`notionTlsClient.ts`); `notion-web` បង្កើនវាទៅជា `180000` សម្រាប់សំណើនីមួយៗ ក្នុងករណីការបង្កើតមាតិកាដែលចំណាយពេលយូរ។ | | `OMNIROUTE_NOTION_TLS_GRACE_MS` | `10000` | រយៈពេលបន្ថែមសម្រាប់ hard-deadline ដាច់ខាតរបស់ JS ដែលត្រូវបានបន្ថែមពីលើ timeout ដើម។ | | `OMNIROUTE_BROWSER_POOL` | `on` | pool កម្មវិធីរុករក Playwright រួម សម្រាប់ការជជែកដោយប្រើ web-cookie ដែលដំណើរការតាមកម្មវិធីរុករក (`browserPool.ts`); កំណត់ជា `off` ដើម្បីបិទ។ | | `OBSCURA_BIN` | `auto-detect` | ផ្លូវទៅកាន់ binary `obscura` ដែលត្រូវបានប្រើជា engine ចម្បងដោយ browser pool និង Cloudflare Playground executor (`open-sse/services/obscura.ts`); វាត្រូវបានរកឃើញដោយស្វ័យប្រវត្តិពី PATH របស់ប្រព័ន្ធ នៅពេលមិនបានកំណត់។ | | `OBSCURA_CDP_ENDPOINT` | _(មិនបានកំណត់)_ | ចង្អុលទៅ Obscura ដែលកំពុងដំណើរការរួចហើយ (`http://host:port`) ជំនួសឱ្យការបង្កើត process ថ្មី; module នេះមិនមែនជាម្ចាស់ process នោះទេ (`open-sse/services/obscura.ts`)។ | | `OBSCURA_PORT` | `random free port` | port ជាក់លាក់សម្រាប់ `obscura serve` ដែលត្រូវបានបង្កើត; port ទំនេរមួយត្រូវបានជ្រើសរើសដោយស្វ័យប្រវត្តិ នៅពេលមិនបានកំណត់ (`open-sse/services/obscura.ts`)។ | | `WEB_COOKIE_USE_BROWSER` | `0` | ជ្រើសឱ្យសំណើជជែកដោយប្រើ web-cookie មួយប្រើផ្លូវដែលដំណើរការតាមកម្មវិធីរុករក (`browserBackedChat.ts`); កំណត់ជា `1` ដើម្បីបើក។ | | `KIMI_WEB_BASE_URL` | `https://www.kimi.ai` | URL មូលដ្ឋានសម្រាប់ Kimi Web executor (Connect-RPC អន្តរជាតិរបស់ kimi.ai) (`kimi-web.ts`); កែតម្លៃនេះតែសម្រាប់ endpoint ឆ្លុះបញ្ចាំង/proxy ប៉ុណ្ណោះ។ | | `KIMI_WEB_CHAT_URL` | `/apiv2/kimi.gateway.chat.v1.ChatService/Chat` | endpoint ជជែកពេញលេញសម្រាប់ Kimi Web executor (`kimi-web.ts`)។ | | `OMNIROUTE_LOGIN_BROWSER_PATH` | _(រកឃើញដោយស្វ័យប្រវត្តិ)_ | ផ្លូវទៅកាន់ executable របស់ Chrome/Edge ក្នុងប្រព័ន្ធ សម្រាប់ការចូលប្រើកម្មវិធីរុករកអន្តរកម្មរបស់ Adobe Firefly (`adobeFireflyBrowserLogin.ts`); វាជំនួសការរកឃើញដោយស្វ័យប្រវត្តិតាម OS នីមួយៗ។ | | `OMNIROUTE_STANDALONE_DIR` | _លទ្ធផល standalone ក្នុង .build/_ | ការកំណត់ជំនួសនៅពេល build សម្រាប់ថតលទ្ធផល standalone ដែលត្រូវបានប្រើដោយជំហានដាក់ឯកសាររួមគ្នាក្រោយ build (`scripts/build/colocate-standalone.mjs`); វាជាឧបករណ៍ build មិនមែន runtime ទេ។ | ការព្យាយាមលើ target របស់ combo ទទួលបន្ត timeout របស់សំណើ upstream ដែលបានដោះស្រាយរួច (`FETCH_TIMEOUT_MS` ឬ `REQUEST_TIMEOUT_MS` នៅពេលវាផ្ដល់តម្លៃលំនាំដើមសម្រាប់ fetch)។ កំណត់ `targetTimeoutMs` ក្នុង combo, តម្លៃលំនាំដើមរបស់ combo ឬការកំណត់ជំនួសរបស់ provider តែដើម្បីធ្វើឱ្យ combo fallback លឿនជាងមុនប៉ុណ្ណោះ; តម្លៃដែលលើសពី timeout របស់ upstream បច្ចុប្បន្ន នឹងត្រូវបានកំណត់ត្រឹម timeout របស់ upstream។ `comboTimeoutMs` គឺជាថវិកាពេលវេលា wall-clock ដាច់ដោយឡែកសម្រាប់ combo ទាំងមូល នៅទូទាំង failover targets។ ទុកវាដោយមិនកំណត់ ឬកំណត់ជា `0` ដើម្បីរក្សាការធ្វើ iteration ដោយគ្មានដែនកំណត់ (ការបញ្ឈប់ការជាប់គាំងដែលបានកំណត់ថេរជា 10 នាទីក្នុង `comboPredicates.ts` នៅតែត្រូវបានអនុវត្ត)។ តម្លៃវិជ្ជមាននឹងជំនួស យន្តការសុវត្ថិភាពនោះសម្រាប់ combo។ រក្សា `comboTimeoutMs` ឱ្យវែងជាង `targetTimeoutMs` ដើម្បីឱ្យ failover នៅតែមានពេល បន្ទាប់ពី target ដំបូងមួយដំណើរការយឺត។ ### កម្រិតកំណត់របស់ Circuit Breaker ការកែតម្រូវ circuit breaker នៅកម្រិត provider។ តម្លៃលំនាំដើមឆ្លុះបញ្ចាំងពីតម្លៃដែលបានធ្វើមាត្រដ្ឋាន និងប្រើចាប់តាំងពី v3.6 សម្រាប់ការតភ្ជាប់ 500+។ | អថេរ | លំនាំដើម | ឯកសារប្រភព | សេចក្តីពិពណ៌នា | | ------------------------------------------------------------- | --------- | ------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `OMNIROUTE_CIRCUIT_BREAKER_OAUTH_THRESHOLD` | `8` | `open-sse/config/constants.ts` | កម្រិតបរាជ័យជាប់គ្នាសម្រាប់អ្នកផ្តល់ OAuth មុនពេល breaker ដំណើរការ។ | | `OMNIROUTE_CIRCUIT_BREAKER_OAUTH_RESET_MS` | `60000` | `open-sse/config/constants.ts` | ចន្លោះពេលកំណត់ឡើងវិញ (ms) សម្រាប់ breaker របស់អ្នកផ្តល់ OAuth។ | | `OMNIROUTE_CIRCUIT_BREAKER_API_KEY_THRESHOLD` | `12` | `open-sse/config/constants.ts` | កម្រិតបរាជ័យជាប់គ្នាសម្រាប់អ្នកផ្តល់ API-key។ | | `OMNIROUTE_CIRCUIT_BREAKER_API_KEY_RESET_MS` | `30000` | `open-sse/config/constants.ts` | ចន្លោះពេលកំណត់ឡើងវិញ (ms) សម្រាប់ breaker របស់អ្នកផ្តល់ API-key។ | | `OMNIROUTE_CIRCUIT_BREAKER_LOCAL_THRESHOLD` | `2` | `open-sse/config/constants.ts` | កម្រិតបរាជ័យជាប់គ្នាសម្រាប់អ្នកផ្តល់ក្នុងមូលដ្ឋាន (Ollama, LM Studio, ...)។ | | `OMNIROUTE_CIRCUIT_BREAKER_LOCAL_RESET_MS` | `15000` | `open-sse/config/constants.ts` | ចន្លោះពេលកំណត់ឡើងវិញ (ms) សម្រាប់ breaker របស់អ្នកផ្តល់ក្នុងមូលដ្ឋាន។ | | `OMNIROUTE_PROVIDER_BREAKER_OAUTH_FAILURE_THRESHOLD` | `10` | `open-sse/config/constants.ts` | Breaker កម្រិតអ្នកផ្តល់៖ ចំនួនបរាជ័យក្នុងចន្លោះពេល មុនពេលអ្នកផ្តល់ OAuth ទាំងមូលចូលក្នុងរយៈពេលរង់ចាំ។ | | `OMNIROUTE_PROVIDER_BREAKER_OAUTH_FAILURE_WINDOW_MS` | `900000` | `open-sse/config/constants.ts` | Breaker កម្រិតអ្នកផ្តល់៖ ចន្លោះពេលរាប់ចំនួនបរាជ័យបែបរំកិល (ms) សម្រាប់អ្នកផ្តល់ OAuth។ | | `OMNIROUTE_PROVIDER_BREAKER_OAUTH_COOLDOWN_MS` | `300000` | `open-sse/config/constants.ts` | Breaker កម្រិតអ្នកផ្តល់៖ រយៈពេលរង់ចាំ (ms) នៅពេលឈានដល់កម្រិតរបស់អ្នកផ្តល់ OAuth។ | | `OMNIROUTE_PROVIDER_BREAKER_OAUTH_DEGRADATION_THRESHOLD` | `5` | `open-sse/config/constants.ts` | អ្នកផ្តល់ OAuth ចូលស្ថានភាព DEGRADED នៅពេលមានបរាជ័យចំនួននេះ។ | | `OMNIROUTE_PROVIDER_BREAKER_OAUTH_MAX_BACKOFF_MULTIPLIER` | `8` | `open-sse/config/constants.ts` | មេគុណអតិបរមាសម្រាប់ការបង្កើន resetTimeout របស់អ្នកផ្តល់ OAuth។ | | `OMNIROUTE_PROVIDER_BREAKER_OAUTH_BACKOFF_ESCALATION_COUNT` | `2` | `open-sse/config/constants.ts` | អ្នកផ្តល់ OAuth បង្កើនកម្រិតបន្ទាប់ពីវដ្តបើកចំហចំនួននេះ។ | | `OMNIROUTE_PROVIDER_BREAKER_API_KEY_FAILURE_THRESHOLD` | `15` | `open-sse/config/constants.ts` | Breaker កម្រិតអ្នកផ្តល់៖ ចំនួនបរាជ័យក្នុងចន្លោះពេល មុនពេលអ្នកផ្តល់ API-key ទាំងមូលចូលក្នុងរយៈពេលរង់ចាំ។ | | `OMNIROUTE_PROVIDER_BREAKER_API_KEY_FAILURE_WINDOW_MS` | `1800000` | `open-sse/config/constants.ts` | Breaker កម្រិតអ្នកផ្តល់៖ ចន្លោះពេលរាប់ចំនួនបរាជ័យបែបរំកិល (ms) សម្រាប់អ្នកផ្តល់ API-key។ | | `OMNIROUTE_PROVIDER_BREAKER_API_KEY_COOLDOWN_MS` | `600000` | `open-sse/config/constants.ts` | Breaker កម្រិតអ្នកផ្តល់៖ រយៈពេលរង់ចាំ (ms) នៅពេលឈានដល់កម្រិតរបស់អ្នកផ្តល់ API-key។ | | `OMNIROUTE_PROVIDER_BREAKER_API_KEY_DEGRADATION_THRESHOLD` | `7` | `open-sse/config/constants.ts` | អ្នកផ្តល់ API-key ចូលស្ថានភាព DEGRADED នៅពេលមានបរាជ័យចំនួននេះ។ | | `OMNIROUTE_PROVIDER_BREAKER_API_KEY_MAX_BACKOFF_MULTIPLIER` | `4` | `open-sse/config/constants.ts` | មេគុណអតិបរមាសម្រាប់ការបង្កើន resetTimeout របស់អ្នកផ្តល់ API-key។ | | `OMNIROUTE_PROVIDER_BREAKER_API_KEY_BACKOFF_ESCALATION_COUNT` | `3` | `open-sse/config/constants.ts` | អ្នកផ្តល់ API-key បង្កើនកម្រិតបន្ទាប់ពីវដ្តបើកចំហចំនួននេះ។ | | `OMNIROUTE_PROVIDER_BREAKER_LOCAL_FAILURE_THRESHOLD` | `2` | `open-sse/config/constants.ts` | Breaker កម្រិតអ្នកផ្តល់៖ ចំនួនបរាជ័យមុនពេលអ្នកផ្តល់ក្នុងមូលដ្ឋានទាំងមូលចូលក្នុងរយៈពេលរង់ចាំ។ | | `OMNIROUTE_PROVIDER_BREAKER_LOCAL_FAILURE_WINDOW_MS` | `300000` | `open-sse/config/constants.ts` | Breaker កម្រិតអ្នកផ្តល់៖ ចន្លោះពេលរាប់ចំនួនបរាជ័យបែបរំកិល (ms) សម្រាប់អ្នកផ្តល់ក្នុងមូលដ្ឋាន។ | | `OMNIROUTE_PROVIDER_BREAKER_LOCAL_COOLDOWN_MS` | `60000` | `open-sse/config/constants.ts` | Breaker កម្រិតអ្នកផ្តល់៖ រយៈពេលរង់ចាំ (ms) នៅពេលឈានដល់កម្រិតរបស់អ្នកផ្តល់ក្នុងមូលដ្ឋាន។ | | `OMNIROUTE_API_KEY_COOLDOWN_MS` | `60000` | `open-sse/services/apiKeyRotator.ts` | រយៈពេលរង់ចាំក្នុងមួយ key (ms) ដែលត្រូវបានអនុវត្តដោយការប្តូរ API-key ច្រើន នៅពេល upstream 429 មិនមាន `Retry-After` (#14573)។ តម្លៃដែលមិនវិជ្ជមាន ឬមិនមែនជាលេខ នឹងត្រឡប់ទៅប្រើលំនាំដើម។ | | `PIN_DROP_BACKOFF_LEVEL` | `2` | `open-sse/services/combo.ts` | ជម្រៅ backoff ដែលនៅកម្រិតនោះ អ្នកផ្តល់របស់ pin នៃ context-cache ត្រូវបានចាត់ទុកថាមិនមានសុខភាពល្អជាអចិន្ត្រៃយ៍ ហើយ pin ត្រូវបានទម្លាក់ដើម្បីធ្វើ failover។ | | `PIN_DROP_GRACE_MS` | `20000` | `open-sse/services/combo.ts` | ចន្លោះពេលទប់ស្កាត់ការប្រែប្រួលញឹកញាប់ (ms) ដែលអនុញ្ញាតឱ្យមានរយៈពេលរង់ចាំបណ្តោះអាសន្នខ្លីៗ មុនពេលទម្លាក់ pin នៃ context-cache។ | ### សេណារីយ៉ូ | សេណារីយ៉ូ | ការកំណត់រចនាសម្ព័ន្ធ | | ---------------------------------- | --------------------------------------------------------- | | **ការបង្កើតកូដដែលដំណើរការយូរ** | `REQUEST_TIMEOUT_MS=900000` (15 នាទី) | | **កំណត់អាយុកាលសរុបរបស់ stream** | `STREAM_ACTIVE_TIMEOUT_MS=1260000` (21 នាទី) | | **បរាជ័យរហ័សសម្រាប់ API ផលិតកម្ម** | `API_BRIDGE_PROXY_TIMEOUT_MS=10000` | | **ម៉ូដែលគិតពិចារណាបន្ថែម** | `STREAM_IDLE_TIMEOUT_MS=300000` (5 នាទីរវាង chunk នីមួយៗ) | --- ## 16. ការកត់ត្រា ប្រព័ន្ធកត់ត្រាសរសេរទាំងទៅកាន់ stdout និងឯកសារកំណត់ហេតុដែលត្រូវបានបង្វិល។ ការកំណត់រចនាសម្ព័ន្ធទាំងអស់ត្រូវបានអានដោយ `src/lib/logEnv.ts`។ | អថេរ | លំនាំដើម | សេចក្ដីពិពណ៌នា | | ----------------------------------------- | -------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `APP_LOG_LEVEL` | `info` | កម្រិតកំណត់ហេតុអប្បបរមា៖ `debug`, `info`, `warn`, `error`។ | | `APP_LOG_FORMAT` | `text` | ទម្រង់លទ្ធផល៖ `text` (ងាយស្រួលអានដោយមនុស្ស) ឬ `json` (មានរចនាសម្ព័ន្ធ)។ | | `APP_LOG_TO_FILE` | `true` | សរសេរកំណត់ហេតុទៅឯកសារ រួមជាមួយ stdout។ | | `APP_LOG_FILE_PATH` | `logs/application/app.log` | ផ្លូវឯកសារកំណត់ហេតុ (ដែលទាក់ទងនឹងថតឫសរបស់គម្រោង ឬ `DATA_DIR`)។ | | `APP_LOG_MAX_FILE_SIZE` | `50M` | ទំហំឯកសារអតិបរមាមុនពេលបង្វិល។ ទទួលយក៖ `50M`, `1G`, `512K` ឬចំនួនបៃធម្មតា។ | | `APP_LOG_RETENTION_DAYS` | `7` | ចំនួនថ្ងៃដែលត្រូវរក្សាទុកឯកសារកំណត់ហេតុកម្មវិធីដែលបានបង្វិល។ | | `APP_LOG_MAX_FILES` | `20` | ចំនួនអតិបរមានៃឯកសារបម្រុងទុកកំណត់ហេតុដែលបានបង្វិល។ | | `CALL_LOG_RETENTION_DAYS` | `7` | ចំនួនថ្ងៃដែលត្រូវរក្សាទុកធាតុកំណត់ហេតុសំណើ/ការហៅនៅក្នុងមូលដ្ឋានទិន្នន័យ។ | | `CALL_LOG_MAX_ENTRIES` | `10000` | ចំនួនអតិបរមានៃធាតុកំណត់ហេតុការហៅនៅក្នុងអង្គចងចាំបណ្ដោះអាសន្ន។ | | `CALL_LOGS_TABLE_MAX_ROWS` | `100000` | ចំនួនជួរដេកអតិបរមានៅក្នុងតារាង SQLite `call_logs` មុនពេលកាត់ចេញ។ | | `ENABLE_REQUEST_LOGS` | _(មិនបានកំណត់)_ | បង្ខំឱ្យបើក ឬបិទការកត់ត្រាសំណើលម្អិត ដោយជំនួសការកំណត់ផ្ទាំងគ្រប់គ្រង។ | | `MAX_PENDING_REQUEST_AGE_MS` | `3600000` (1 ម៉ោង) | អាយុកាលអតិបរមារបស់ធាតុកំណត់ហេតុសំណើសកម្មដែលគ្មានម្ចាស់ មុនពេលសម្អាតចេញពីអង្គចងចាំ។ | | `CALL_LOG_PIPELINE_CAPTURE_STREAM_CHUNKS` | `false` | រក្សាទុកផ្នែកទិន្នន័យស្ទ្រីមនៅក្នុងវត្ថុបន្សល់ទុករបស់ pipeline នៅពេល `call_log_pipeline_enabled=true`។ ត្រូវជ្រើសបើក (`true`) — បិទតាមលំនាំដើមដើម្បីសន្សំទំហំថាស។ | | `CALL_LOG_PIPELINE_MAX_SIZE_KB` | `512` | ទំហំអតិបរមាគិតជា KB របស់វត្ថុបន្សល់ទុកកំណត់ហេតុការហៅក្នុង pipeline នៅពេល `call_log_pipeline_enabled=true`។ | | `PROXY_LOGS_TABLE_MAX_ROWS` | `100000` | ចំនួនជួរដេកអតិបរមានៅក្នុងតារាង SQLite `proxy_logs` មុនពេលកាត់ចេញ។ | | `PROXY_LOG_INCLUDE_IPS` | `false` | រួមបញ្ចូល IP របស់អតិថិជន/ច្រកចេញ និងបុព្វបទគណនីនៅក្នុងកំណត់ហេតុកុងសូល `[ProxyEgress]`។ កំណត់ត្រា proxy-log ក្នុងផ្ទាំងគ្រប់គ្រង/មូលដ្ឋានទិន្នន័យនៅតែរក្សាព័ត៌មានលម្អិតពេញលេញ។ | | `PROXY_LOG_FIRST_CHUNK_TIMING` | `false` | កំណត់ជា `"true"` ឬ `"1"` ដើម្បីកត់ត្រា `first_chunk_ms` (ចាប់ពីពេលចាប់ផ្ដើមផ្ញើ រហូតដល់បៃដំបូងនៃតួទិន្នន័យដែលមានប្រយោជន៍) នៅលើជួរដេក proxy-log។ វារុំតួទិន្នន័យ upstream នីមួយៗក្នុងស្ទ្រីមបញ្ជូនបន្តបែប lazy ហើយកែជួរដេកនៅពេលបៃមកដល់។ វាត្រូវបានបិទតាមលំនាំដើម ដើម្បីឱ្យការឆ្លើយតបឆ្លងកាត់ដោយមិនត្រូវបានប៉ះពាល់។ | | `APP_LOG_ROTATION_CHECK_INTERVAL_MS` | `60000` (1 នាទី) | ភាពញឹកញាប់ដែល `src/lib/logRotation.ts` ពិនិត្យទំហំឯកសារកំណត់ហេតុសកម្មឡើងវិញ។ | | `CHAT_LOG_TEXT_LIMIT` | `65536` | ប្រវែងអតិបរមារបស់ខ្សែអក្សរដែលត្រូវរក្សាទុកក្នុងវត្ថុបន្សល់ទុកកំណត់ហេតុជជែក (លំនាំដើម 64 KB)។ | | `CHAT_LOG_ARRAY_TAIL_ITEMS` | `128` | ចំនួនធាតុអារេដែលត្រូវរក្សាទុកពីផ្នែកចុង នៅពេលកាត់ទិន្នន័យកំណត់ហេតុជជែកឱ្យខ្លី។ | | `CHAT_LOG_MAX_DEPTH` | `6` | ជម្រៅនៃការដាក់ត្រួតគ្នាអតិបរមា មុនពេលទិន្នន័យកំណត់ហេតុជជែកត្រូវបានកាត់ឱ្យខ្លី។ | | `CHAT_LOG_MAX_OBJECT_KEYS` | `80` | ចំនួនសោវត្ថុអតិបរមាដែលត្រូវរក្សាទុកក្នុងទិន្នន័យកំណត់ហេតុជជែក (0 = គ្មានដែនកំណត់)។ | | `CHAT_LOG_MAX_BODY_KB` | `1024` | ទំហំតួទិន្នន័យសំណើ/ការឆ្លើយតបទាំងមូល (KB) ដែលលើសពីនេះ វានឹងត្រូវបានជំនួសដោយសេចក្ដីសង្ខេបសាមញ្ញ ជំនួសឱ្យច្បាប់ចម្លងពេញលេញ។ បង្កើនតម្លៃនេះ ប្រសិនបើការសន្ទនាដែលដំណើរការដោយភ្នាក់ងាររយៈពេលវែងបង្ហាញអត្ថបទជំនួស ជំនួសឱ្យសារពិតប្រាកដនៅក្នុងផ្ទាំងគ្រប់គ្រង។ | | `CHAT_DEBUG_FILE` | `false` | នៅពេលជា true `serializeArtifactForStorage` នឹងរំលងការកាត់ឱ្យខ្លីដោយផ្អែកលើទំហំ។ សម្រាប់តែការបំបាត់កំហុសប៉ុណ្ណោះ។ | --- ## 17. ការបង្កើនប្រសិទ្ធភាពអង្គចងចាំ | អថេរ | លំនាំដើម | សេចក្ដីពិពណ៌នា | | ----------------------------- | ------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `OMNIROUTE_MEMORY_MB` | _ស្វ័យប្រវត្តិ_ (bare metal); **`1024` នៅក្នុង Docker image** | ដែនកំណត់ V8 heap (MB) ដែល**បានណែនាំ**សម្រាប់ Docker/standalone។ នៅពេលមិនបានកំណត់ វាត្រូវបានក្រិតតាមខ្នាតដោយថាមវន្ត (~35% នៃ RAM របស់ប្រព័ន្ធ ដោយកំណត់ឱ្យស្ថិតក្នុង `[512, 4096]`); `512` គ្រាន់តែជាតម្លៃអប្បបរមាប៉ុណ្ណោះ នៅពេលមិនអាចអានអង្គចងចាំសរុបបាន។ នៅលើ `run-standalone.mjs` (Docker CMD) តម្លៃដែលបានបញ្ជាក់**យ៉ាងច្បាស់**ត្រូវបានបន្ថែមជា `--max-old-space-size` ហើយ**មានអាទិភាព**លើ heap flag របស់ NODE_OPTIONS ដែលមានការប៉ះទង្គិច (V8 last-flag)។ `omniroute serve` នៅតែផ្ដល់អាទិភាពដល់ heap ដែលមានស្រាប់ក្នុង NODE_OPTIONS (#5238)។ កុំកំណត់ទាំងពីរជាលេខខុសគ្នា — ដំណើរការនឹងកត់ត្រាការព្រមានដែលបញ្ជាក់ឈ្មោះតម្លៃទាំងពីរ និងតម្លៃដែលមានអាទិភាព។ **Docker image ផ្លូវការតែងតែកំណត់ `1024` ដូច្នេះការក្រិតតាមខ្នាតមិនដែលដំណើរការនៅទីនោះទេ។** Coding-agent `/v1/responses` ត្រូវការ `8192`–`12288` បូកនឹងទំហំបម្រុង cgroup — សូមមើល [មគ្គុទ្ទេសក៍ Docker — RAM ពេលដំណើរការ](../guides/DOCKER_GUIDE.md#runtime-ram-for-coding-agents)។ | | `OMNIROUTE_RSS_PRESSURE_MB` | _ស្វ័យប្រវត្តិ_ (`max(3072, 2 × OMNIROUTE_MEMORY_MB)`; បិទនៅពេលមិនបានកំណត់ `OMNIROUTE_MEMORY_MB`) | `open-sse/utils/resourcePressure.ts` | កម្រិតកាត់ផ្ដាច់ process-RSS ដាច់ខាត (MB) សម្រាប់អង្គចងចាំ native/external ដែល V8 `heapUsed` មិនអាចមើលឃើញ; លើសកម្រិតនេះ សំណើថ្មីទទួលបាន 503 `resource_pressure`។ RSS កម្រនឹងថយចុះបន្ទាប់ពីកើនឡើងខ្លាំង ដូច្នេះសូមប្រើវាជាមួយ `OMNIROUTE_PRESSURE_SELF_RESTART`។ | | `PROMPT_CACHE_MAX_SIZE` | `50` | ចំនួនអតិបរមានៃធាតុ system prompt ដែលបានដាក់ក្នុង cache។ | | `PROMPT_CACHE_MAX_BYTES` | `2097152` (2 MB) | ទំហំសរុបអតិបរមារបស់ prompt cache។ | | `PROMPT_CACHE_TTL_MS` | `300000` (5 នាទី) | TTL របស់ធាតុ prompt cache។ | | `SEMANTIC_CACHE_MAX_SIZE` | `100` | ចំនួនអតិបរមានៃ response ដែលមាន temperature=0 និងបានដាក់ក្នុង cache។ | | `SEMANTIC_CACHE_MAX_BYTES` | `4194304` (4 MB) | ទំហំសរុបអតិបរមារបស់ semantic cache។ | | `SEMANTIC_CACHE_TTL_MS` | `1800000` (30 នាទី) | TTL របស់ធាតុ semantic cache។ | | `OMNIROUTE_CORPUS_CACHE_SIZE` | `5` | ចំនួន root របស់ local-corpus ដែលរក្សាទុក index ក្នុងអង្គចងចាំឱ្យដំណើរការក្នុងពេលតែមួយ (`src/lib/localCorpus/configured.ts`)។ LRU៖ នៅពេលដល់ដែនកំណត់ index របស់ root ដែលបានប្រើកន្លងមកយូរជាងគេនឹងត្រូវបានដកចេញ ហើយសាងសង់ឡើងវិញនៅពេលមាន query បន្ទាប់។ ត្រូវបានកំណត់តម្លៃអប្បបរមាត្រឹម `1`; តម្លៃដែលមិនមែនជាលេខនឹងត្រឡប់ទៅប្រើតម្លៃលំនាំដើម។ | | `STREAM_HISTORY_MAX` | `50` | ចំនួនអតិបរមានៃ stream event ថ្មីៗនៅក្នុង buffer សម្រាប់ទិដ្ឋភាពបន្តផ្ទាល់របស់ Dashboard។ | | `CONTEXT_LENGTH_DEFAULT` | _(មិនបានកំណត់)_ | ការកំណត់ជំនួស context-length សកល (tokens) សម្រាប់ provider ទាំងអស់ដែលមិនមានអថេរ `CONTEXT_LENGTH_`។ នៅពេលកំណត់ វា**ជំនួស**តម្លៃ catalog, ការកំណត់ជំនួសរបស់ dashboard និងតម្លៃ registry សម្រាប់ provider ទាំងនោះ; នៅពេលមិនបានកំណត់ OmniRoute ប្រើខ្សែសង្វាក់ដែលមានស្រាប់របស់វា ដែលជម្រើសចុងក្រោយគឺ `128000`។ សូមមើល [ប្រវែង context តាម provider](#per-provider-context-length-context_length_provider)។ | | `USAGE_TOKEN_BUFFER` | `100` | ទំហំបម្រុង token បន្ថែមដែលរក្សាទុកនៅពេលតាមដានកូតាការប្រើប្រាស់។ | ### ប្រវែង context តាម provider (`CONTEXT_LENGTH_`) `open-sse/services/contextManager.ts` (`getEnvOverride()` / `resolveTokenLimit()`) ក៏អានទម្រង់ **តាម provider** ដែលឈ្មោះរបស់វាត្រូវបានបង្កើតពី provider ID នៅពេលដំណើរការ ដូច្នេះវាមិនអាច ត្រូវបានរាយជាជួរម្ដងមួយៗនៅក្នុងតារាងខាងលើ ឬក្នុង `.env.example` បានទេ។ **ឈ្មោះ។** `CONTEXT_LENGTH_` ដែល `` គឺជា ID របស់អ្នកផ្តល់សេវាដែលបានបម្លែងជាអក្សរធំ ដោយ តួអក្សរទាំងអស់ក្រៅពី `A-Z` / `0-9` ត្រូវបានជំនួសដោយ `_`។ ID របស់អ្នកផ្តល់សេវាគឺជា ID ស្តង់ដារបន្ទាប់ពី ការដោះស្រាយឈ្មោះក្លែងកាត់រួច (ផ្នែក `provider` នៃខ្សែអក្សរ `provider/model` បន្ទាប់ពីឈ្មោះក្លែងកាត់ត្រូវបាន ដោះស្រាយ)។ Node ផ្ទាល់ខ្លួនដែលឆបគ្នាជាមួយ OpenAI ឬ Anthropic ប្រើ ID របស់ node ដែលបានបង្កើត ដូច្នេះ UUID គឺជាផ្នែកមួយនៃឈ្មោះអថេរ។ តម្លៃគឺជាចំនួនគត់វិជ្ជមាននៃ token; តម្លៃផ្សេងទៀត (ទទេ, `0`, អវិជ្ជមាន, មិនមែនជាលេខ) ត្រូវបានមិនអើពើ ហើយការដោះស្រាយបន្តទៅជំហានបន្ទាប់។ | ID របស់អ្នកផ្តល់សេវា | ឈ្មោះអថេរ | | ----------------------------------------------------------- | -------------------------------------------------------------------------- | | 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 | **លំដាប់អាទិភាព។** សម្រាប់គូ `provider/model` ជំហានដំបូងដែលផ្តល់តម្លៃនឹងត្រូវបានប្រើ៖ 1. `CONTEXT_LENGTH_` សម្រាប់អ្នកផ្តល់សេវានោះ។ 2. `CONTEXT_LENGTH_DEFAULT` (ការកំណត់ជាន់លើជាសកលតាម environment)។ 3. ទំហំ window តាម model៖ ការកំណត់ជាន់លើ context ដែលបានរក្សាទុក (កំណត់ក្នុង dashboard ឬត្រូវបាន pin ដោយស្វ័យប្រវត្តិដោយ discovery reconciler សូមមើល `CONTEXT_WINDOW_RECONCILE_INTERVAL`) បើមិនដូច្នោះទេ ប្រើតម្លៃពី catalog ដែលបាន sync / models.dev។ 4. `defaultContextLength` នៃ registry របស់អ្នកផ្តល់សេវា។ 5. ការប៉ាន់ស្មានតាមឈ្មោះ model (`claude` 200000, `gemini` 1000000, `gpt` / `o1` / `o3` / `o4` / `codex` 400000)។ 6. តម្លៃលំនាំដើមតាមអ្នកផ្តល់សេវាដែលមានស្រាប់ បន្ទាប់មក `128000`។ ជំហាន environment ទាំងពីរអនុវត្តចំពោះ **អ្នកផ្តល់សេវាទាំងមូល**៖ model ទាំងអស់របស់អ្នកផ្តល់សេវានោះទទួលបាន ដែនកំណត់ដូចគ្នា ហើយពួកវាមានអាទិភាពលើការកំណត់ជាន់លើតាម model នៅក្នុង dashboard។ នៅពេលដែលមានតែ model មួយរបស់អ្នកផ្តល់សេវា ត្រូវការទំហំ window ខុសគ្នា សូមប្រើការកំណត់ជាន់លើតាម model នៅក្នុង dashboard ជំនួសវិញ។ **វិសាលភាព។** លំដាប់នេះគ្រប់គ្រងការត្រួតពិនិត្យ context window នៅពេល request (ការបដិសេធ `context_length_exceeded` / "Input exceeds context window" នៅក្នុង `open-sse/handlers/chatCore.ts`), ថវិកាសម្រាប់ការបង្ហាប់ prompt និងដែនកំណត់ combo context។ តម្លៃ `context_length` ដែលប្រកាសដោយ `GET /v1/models` នៅតែអាចមកពី metadata របស់ catalog ឬ registry ហើយមិនត្រូវបានធានាថាឆ្លុះបញ្ចាំងការកំណត់ជាន់លើតាម environment នោះទេ។ **ឧទាហរណ៍។** អ្នកផ្តល់សេវាមួយដែល model របស់វាទទួលយក window ទំហំ 1,050,000 token ខណៈដែល catalog រាយការណ៍ 128,000៖ ```dotenv CONTEXT_LENGTH_AGENTROUTER=1050000 ``` ចាប់ផ្តើម server ឡើងវិញបន្ទាប់ពីផ្លាស់ប្តូរវា៖ តម្លៃត្រូវបានអានពី environment របស់ process server។ នៅលើ **កម្មវិធី desktop** server ដំណើរការជា child process ហើយមិនអាចមើលឃើញអថេរប្រព័ន្ធ ដែលបានកំណត់បន្ទាប់ពីកម្មវិធីត្រូវបានបើកនោះទេ។ សូមដាក់បន្ទាត់នេះក្នុងឯកសារ `.env` ដែលកម្មវិធីផ្ទុក (លំដាប់ស្វែងរកនៅក្នុង [មគ្គុទ្ទេសក៍ Electron៖ ការស្វែងរកឯកសារ environment](../guides/ELECTRON_GUIDE.md#environment-file-lookup)), បន្ទាប់មកបិទកម្មវិធីទាំងស្រុង ហើយបើកវាឡើងវិញ។ ### ការបង្ហាប់ | អថេរ | លំនាំដើម | សេចក្ដីពិពណ៌នា | | ------------------------------------- | ----------- | ---------------------------------------------------------------------------------------------------------------------------------------- | | `OMNIROUTE_RTK_TRUST_PROJECT_FILTERS` | មិនបានកំណត់ | ជឿទុកចិត្តលើ `.rtk/filters.json` របស់ project ដោយគ្មាន hash `.rtk/trust.json`។ ប្រើតែនៅក្នុងការអភិវឌ្ឍ local ដែលមានការគ្រប់គ្រងប៉ុណ្ណោះ។ | ### Memory Engine (គម្រោង 21) ### ថ្លៃចំណាយលើ event loop នៃ memory, skills និងការធ្វើឱ្យ token ថ្មី (#10349) OmniRoute គឺជា **process Node តែមួយ**។ ការស្រង់ចេញ/ទាញយក memory, ការបញ្ចូល skills និងការធ្វើឱ្យ token របស់អ្នកផ្តល់សេវាថ្មី ដំណើរការលើ **event loop ដូចគ្នា** នឹង `GET /healthz` និង dashboard។ ពួកវាមិនមែនជា worker thread ទេ។ | ការងារ | កូដ | លំនាំដើម | ការគ្រប់គ្រងរបស់ប្រតិបត្តិករ | | -------------------------- | ---------------------------------- | -------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------- | | ការស្រង់ចេញ / ទាញយក memory | `src/lib/memory/` | **memoryEnabled** ក្នុង dashboard (បើកតាមលំនាំដើម) | បិទ **Settings → Memory**។ មិនមាន env kill switch ដាច់ដោយឡែកក្រៅពីការបិទមុខងារនេះក្នុង settings ទេ។ | | ការបញ្ចូល skills | `src/lib/skills/injection.ts` | **skillsEnabled** ក្នុង dashboard (បើកតាមលំនាំដើម) | បិទ **Settings → Memory/Skills** (`skillsEnabled`)។ ការកំណត់ sandbox ខាងក្រោមគ្រាន់តែកំណត់ព្រំដែនការប្រតិបត្តិ បន្ទាប់ពីការបញ្ចូលត្រូវបានបើករួចហើយ។ | | ការធ្វើឱ្យ token ថ្មី | `src/sse/services/tokenRefresh.ts` | បើកសម្រាប់អ្នកផ្តល់សេវា OAuth/web ដែលបានភ្ជាប់ | ផ្តាច់អ្នកផ្តល់សេវា ឬទុកឱ្យ token នៅមានសុពលភាព។ បច្ចុប្បន្នមិនមាន env `TOKEN_REFRESH=0` ទេ។ | ប្រសិនបើ `/healthz` យឺតនៅលើម៉ាស៊ីនដែលមិនសូវមានបន្ទុក សូមបិទ memory + skills ជាមុនសិន បន្ទាប់មកពិនិត្យបន្ទុក catalog/compression (#10303, #9685)។ មុខងារទាំងនេះប្រគល់ការគ្រប់គ្រងនៅត្រង់ចំណុច `await` ប៉ុន្តែនៅតែប្រកួតប្រជែងប្រើ thread តែមួយដដែល។ ស្រទាប់ embedding, vector store និងការកំណត់ reranking សម្រាប់ប្រព័ន្ធរង memory ដែលរក្សាទុកជាអចិន្ត្រៃយ៍ (`src/lib/memory/`)។ | អថេរ | លំនាំដើម | សេចក្ដីពិពណ៌នា | | ------------------------------------ | --------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `MEMORY_EMBEDDING_CACHE_TTL_MS` | `300000` (5 នាទី) | TTL សម្រាប់ឃ្លាំងសម្ងាត់ embedding ក្នុងអង្គចងចាំ (សម្រាប់ហត្ថលេខា source/model/dim នីមួយៗ)។ | | `MEMORY_EMBEDDING_CACHE_MAX` | `1000` | ចំនួនអតិបរមានៃធាតុ LRU ដែលត្រូវរក្សាទុកក្នុងឃ្លាំងសម្ងាត់ embedding។ | | `MEMORY_TRANSFORMERS_MODEL` | `Xenova/all-MiniLM-L6-v2` | លេខសម្គាល់ repo របស់ HF សម្រាប់ pipeline MiniLM មូលដ្ឋាន `@huggingface/transformers` ដែលត្រូវបើកប្រើដោយចេតនា (~23 MB int8, ~400 MB RAM)។ | | `MEMORY_STATIC_MODEL` | `minishlab/potion-base-8M` | លេខសម្គាល់ repo របស់ HF សម្រាប់ embedder ដែលប្រើតារាងស្វែងរក static potion/Model2Vec។ វាត្រូវបានទាញយកនៅពេលចាំបាច់ទៅក្នុងថតឃ្លាំងសម្ងាត់។ | | `MEMORY_STATIC_CACHE_DIR` | `/embeddings` | ថតដែលប្រើសម្រាប់រក្សាទុកឯកសារម៉ូដែល static potion ក្នុងឃ្លាំងសម្ងាត់។ តាមលំនាំដើម វាស្ថិតនៅក្រោម `DATA_DIR` នៅពេលមិនបានកំណត់។ | | `HF_HUB_ENDPOINT` | `https://huggingface.co` | កំណត់ជំនួស URL មូលដ្ឋានរបស់ Hugging Face Hub ដែលប្រើដោយ `staticPotion.ts` (ឧ. endpoint កញ្ចក់សម្រាប់ការដំឡើងដែលផ្ដាច់ពីបណ្ដាញ)។ | | `MEMORY_VEC_TOP_K` | `20` | តម្លៃ top-K លំនាំដើមដែលប្រើដោយការស្វែងរកវ៉ិចទ័របែប brute-force របស់ `sqlite-vec` នៅក្នុង `src/lib/memory/vectorStore.ts`។ | | `MEMORY_RRF_K` | `60` | ថេរ `k` របស់ Reciprocal Rank Fusion សម្រាប់ការទាញយកបែបកូនកាត់ FTS5 + វ៉ិចទ័រ (រូបមន្ត sqlite-vec)។ | | `VECTOR_STORE_DISABLE_VEC` | `false` | ចំណុចសាកល្បង/វិនិច្ឆ័យនៅក្នុង `getVectorStore()` (`src/lib/memory/vectorStore.ts`)៖ នៅពេល `true` វាបង្ខំឱ្យ vector store ទៅជា `null` (ត្រាប់តាមបរិស្ថាន cloud/WASM ដែលគ្មាន `sqlite-vec`) ដោយបន្ថយសមត្ថភាពទាញយកអង្គចងចាំមកត្រឹមការស្វែងរកពាក្យគន្លឹះ FTS5។ កុំកំណត់វានៅក្នុង production។ | | `NOTION_API_KEY` | _(មិនបានកំណត់)_ | API key សម្រាប់ backend របស់ Notion (ប្រើដោយ preset backend ដែលស្គាល់របស់ `genericBackend.ts`)។ | | `NOTION_API_URL` | `https://api.notion.com/v1` | URL មូលដ្ឋានសម្រាប់ Notion API (អាចកំណត់ជំនួសសម្រាប់ជម្រើស Notion ដែលបង្ហោះដោយខ្លួនឯង)។ | | `OBSIDIAN_API_KEY` | _(មិនបានកំណត់)_ | API key សម្រាប់ backend របស់ Obsidian Vault (ប្រើដោយ preset backend ដែលស្គាល់របស់ `genericBackend.ts`)។ | | `OBSIDIAN_API_URL` | `http://localhost:27123` | URL មូលដ្ឋានសម្រាប់ Obsidian Vault API (អាចកំណត់ជំនួសសម្រាប់ vault ពីចម្ងាយ)។ | | `MEMORY_TYPED_DECAY_ENABLED` | `false` | កុងតាក់មេសម្រាប់ការថយចុះនៃអង្គចងចាំដែលបានកំណត់ប្រភេទ TV6។ **ត្រូវបើកប្រើដោយចេតនា (លំនាំដើមបិទ)** — ដំណើរការសម្អាត **លុប** អង្គចងចាំដែលបានថយចុះ។ នៅពេលវាបិទ `access_count`/`last_accessed_at` គ្រាន់តែជាទិន្នន័យ telemetry ហើយគ្មានអ្វីត្រូវបានលុបឡើយ។ | | `MEMORY_TYPED_DECAY_EPISODIC_DAYS` | `30` | TTL (គិតជាថ្ងៃ) ដែលបន្ទាប់ពីរយៈពេលនេះ អង្គចងចាំ `episodic` ដែលមិនបានប្រើនឹងថយចុះ។ `0` ធ្វើឱ្យ episodic មានភាពស៊ាំផងដែរ។ ប្រភេទដែលស្ថិតស្ថេរ (`factual`/`procedural`/`semantic`) តែងតែមានភាពស៊ាំ។ នាឡិកាថយចុះត្រូវបានកំណត់មូលដ្ឋានឡើងវិញតាម `last_accessed_at`។ | | `MEMORY_TYPED_DECAY_ACCESS_IMMUNITY` | `3` | អង្គចងចាំដែលត្រូវបានបញ្ចូល `>=` ចំនួនដងនេះ នឹងមានភាពស៊ាំនឹងការថយចុះដោយមិនគិតពីប្រភេទ។ `0` បិទភាពស៊ាំតាមការចូលប្រើ។ | | `MEMORY_TYPED_DECAY_SWEEP_INTERVAL` | `0` (បានបិទ) | ចន្លោះពេល (គិតជាវិនាទី) សម្រាប់ដំណើរការសម្អាតការថយចុះតាមកាលកំណត់ជាជម្រើស នៅក្នុង `src/lib/memory/typedDecay.ts`។ `0`/មិនបានកំណត់ = គ្មានការសម្អាតតាមកាលកំណត់។ ត្រូវបើកប្រើដោយចេតនាពីរជាន់៖ ក៏តម្រូវឱ្យមាន `MEMORY_TYPED_DECAY_ENABLED=true` ផងដែរ។ | | `OMNIROUTE_STRICT_SYSTEM_PROVIDERS` | _(មិនបានកំណត់)_ | លេខសម្គាល់ provider ដែលបំបែកដោយសញ្ញាក្បៀស (មិនប្រកាន់អក្សរធំតូច) ដែលទទួលយកសារ `system` **តែនៅ index 0 ប៉ុណ្ណោះ** (`src/lib/memory/injection.ts`)។ សម្រាប់ provider ទាំងនេះ ការបញ្ចូលអង្គចងចាំនៅកណ្ដាល array ដែលមានសុវត្ថិភាពសម្រាប់ឃ្លាំងសម្ងាត់ មិនមានសុវត្ថិភាពក្នុងការសន្ទនាច្រើនវេនទេ ដូច្នេះអង្គចងចាំត្រូវបានបញ្ចូលរួម/បន្ថែមនៅខាងមុខជាសារ system ដំបូងជំនួសវិញ។ តាមលំនាំដើមមានតែ `xiaomi-mimo`/`mimo` ប៉ុណ្ណោះ។ ពង្រីកវាសម្រាប់ endpoint ដែលឆបគ្នាជាមួយ OpenAI និងបង្ហោះដោយខ្លួនឯង (ឧ. Qwen3.5+/3.6) ដែល chat template របស់វាអនុវត្តលក្ខខណ្ឌតម្រូវសារ system តែមួយនៅខាងមុខដូចគ្នា។ | ### ឧទាហរណ៍ Docker ដែលប្រើ RAM ទាប `128` គឺសម្រាប់តែ dashboard ប៉ុណ្ណោះ។ Coding agent នៅលើ heap នេះនឹងជួប `FATAL ERROR` អំឡុងពេលដំណើរការ `/v1/responses` យូរ។ កុំប្រើឧទាហរណ៍នេះជា 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. ការធ្វើសមកាលកម្មតម្លៃ ការធ្វើសមកាលកម្មទិន្នន័យតម្លៃម៉ូដែលដោយស្វ័យប្រវត្តិពីប្រភពខាងក្រៅ។ | អថេរ | លំនាំដើម | ឯកសារប្រភព | សេចក្តីពិពណ៌នា | | ----------------------- | ------------- | ------------------------ | --------------------------------------------- | | `PRICING_SYNC_ENABLED` | `false` | `src/lib/pricingSync.ts` | ការធ្វើសមកាលកម្មតម្លៃជាប្រចាំដែលត្រូវបើកប្រើ។ | | `PRICING_SYNC_INTERVAL` | `86400` (24h) | `src/lib/pricingSync.ts` | ចន្លោះពេលធ្វើសមកាលកម្មគិតជាវិនាទី។ | | `PRICING_SYNC_SOURCES` | `litellm` | `src/lib/pricingSync.ts` | ប្រភពទិន្នន័យដែលបំបែកដោយសញ្ញាក្បៀស។ | --- ## ការធ្វើសមកាលកម្ម Arena ELO | អថេរ | លំនាំដើម | ឯកសារប្រភព | សេចក្តីពិពណ៌នា | | ---------------------------- | ------------- | ------------------------------------------------------------------------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `ARENA_ELO_SYNC_ENABLED` | `true` | `src/shared/constants/featureFlagDefinitions.ts` | ការធ្វើសមកាលកម្ម ELO ជាប្រចាំនៃតារាងចំណាត់ថ្នាក់ Arena AI ដែលអាចកំណត់រចនាសម្ព័ន្ធពីទង់មុខងារនៅ Dashboard ឬកំណត់ជា `false` ដើម្បីបិទ។ | | `MODELS_CATALOG_PREFIX_MODE` | `dual` | `src/shared/constants/featureFlagDefinitions.ts`, `src/app/api/v1/models/catalog.ts` | ទម្រង់បុព្វបទដែលប្រើសម្រាប់លេខសម្គាល់ម៉ូដែលក្នុង `GET /v1/models`។ `dual` បង្ហាញទាំងបុព្វបទឈ្មោះក្លែងកាត់ និងបុព្វបទអ្នកផ្តល់ស្តង់ដារសម្រាប់ម៉ូដែលនីមួយៗ (ភាពឆបគ្នាជាមួយកំណែមុន — ធ្វើឱ្យកាតាឡុកធំប្រហែលទ្វេដង); `alias` បញ្ចេញលេខសម្គាល់មួយក្នុងមួយម៉ូដែល; `canonical` បញ្ចេញតែបុព្វបទលេខសម្គាល់អ្នកផ្តល់ពេញលេញប៉ុណ្ណោះ (អ្នកផ្តល់ដែលឈ្មោះក្លែងរបស់ពួកគេជាលេខសម្គាល់ស្តង់ដាររួចហើយ នឹងរក្សាទុកធាតុតែមួយរបស់ពួកគេ)។ កម្មវិធីភ្ញៀវអាចកំណត់ជាន់លើសម្រាប់សំណើនីមួយៗដោយប្រើ `?prefix=alias`។ សូមមើល [API_REFERENCE](API_REFERENCE.md#model-id-prefixes-prefix)។ | | `ARENA_ELO_SYNC_INTERVAL` | `86400` (24h) | `src/lib/arenaEloSync.ts` | ចន្លោះពេលធ្វើសមកាលកម្មគិតជាវិនាទី។ | --- ## អ្នកផ្តល់ PromptQL Playground (មិនផ្លូវការ/ពិសោធន៍) ស្ពានសម័យ GraphQL ដែលត្រូវបានវិស្វកម្មបញ្ច្រាសសម្រាប់ prompt.ql.app (`src/shared/constants/providers/web-cookie.ts`)។ ទាំងអស់នេះជាជម្រើស — លំនាំដើមចង្អុលទៅកាន់ចំណុចបញ្ចប់ Playground សាធារណៈ; កំណត់ជាន់លើតែក្នុងករណីប្រើការដាក់ពង្រាយ PromptQL ដែលបង្ហោះដោយខ្លួនឯង ឬជំនួសប៉ុណ្ណោះ។ | អថេរ | លំនាំដើម | ឯកសារប្រភព | សេចក្តីពិពណ៌នា | | ---------------------------- | ------------------------------------------------------------------ | ----------------------------------------------------------------------- | ----------------------------------------------------------------- | | `PROMPTQL_GRAPHQL_ENDPOINT` | `https://data.prompt.ql.app/promptql/playground-v2-hge/v1/graphql` | `open-sse/executors/promptql.ts` | ចំណុចបញ្ចប់ GraphQL ដែលប្រើសម្រាប់ប្រតិបត្តិការជជែក/សម័យ។ | | `PROMPTQL_CREDITS_ENDPOINT` | `https://data.pro.ql.app/v1/graphql` | `open-sse/executors/promptql.ts`, `open-sse/services/usage/promptql.ts` | ចំណុចបញ្ចប់ GraphQL ដែលប្រើដើម្បីសួររកសមតុល្យឥណទាន/ការប្រើប្រាស់។ | | `PROMPTQL_TOKEN_REFRESH_URL` | `https://auth.pro.ql.app/ddn/project/token` | `open-sse/executors/promptql.ts` | ចំណុចបញ្ចប់ដែលប្រើសម្រាប់ព្យាយាមផ្ទុក token ឡើងវិញ។ | | `PROMPTQL_POLL_TIMEOUT_MS` | `180000` | `open-sse/executors/promptql.ts` | រយៈពេលអតិបរមា (ms) សម្រាប់ការស្ទង់ `thread_events` មុនពេលអស់ពេល។ | --- ## អ្នកផ្តល់សេវា HyperAgent តាមវេប (មិនផ្លូវការ/សាកល្បង) ស្ពានសម័យដែលបានធ្វើវិស្វកម្មបញ្ច្រាសសម្រាប់ hyperagent.com (`src/shared/constants/providers/web-cookie.ts`)។ ជាជម្រើស — តម្លៃលំនាំដើមចង្អុលទៅកាន់ endpoint សាធារណៈសម្រាប់ការចេញវិក្កយបត្រ/ការប្រើប្រាស់; កំណត់ជំនួសតែក្នុងករណីដាក់ឱ្យដំណើរការ HyperAgent ដោយខ្លួនឯង ឬប្រើការដាក់ឱ្យដំណើរការជំនួសប៉ុណ្ណោះ។ | អថេរ | លំនាំដើម | ឯកសារប្រភព | សេចក្ដីពិពណ៌នា | | ---------------------- | --------------------------------------------------- | --------------------------------------- | --------------------------------------------------------------------------- | | `HYPERAGENT_USAGE_URL` | `https://hyperagent.com/api/settings/billing/usage` | `open-sse/services/usage/hyperagent.ts` | Endpoint ដែលប្រើដើម្បីទាញយកប្លុកឥណទានសម្រាប់ការចេញវិក្កយបត្រ/ការប្រើប្រាស់។ | --- ## កូតាការប្រើប្រាស់ Kilo Code ការស្វែងរកសមតុល្យ USD ផ្ទាល់ខ្លួន និងការប្រើប្រាស់ Kilo Pass សម្រាប់អ្នកផ្តល់សេវា Kilo Code។ ជាជម្រើស — តម្លៃលំនាំដើមចង្អុលទៅកាន់ Kilo API សាធារណៈ; កំណត់ជំនួសតែសម្រាប់ relay/test fixture ប៉ុណ្ណោះ។ ការផ្ទៀងផ្ទាត់អត្តសញ្ញាណប្រើ OAuth access token ដែលមានស្រាប់របស់ការតភ្ជាប់។ | អថេរ | លំនាំដើម | ឯកសារប្រភព | សេចក្ដីពិពណ៌នា | | -------------- | --------------------- | ------------------------------------- | --------------------------------------------------------------------------------------- | | `KILO_API_URL` | `https://api.kilo.ai` | `open-sse/services/usage/kilocode.ts` | URL មូលដ្ឋានដែលប្រើដើម្បីទាញយកសមតុល្យ Kilo Code ផ្ទាល់ខ្លួន និងការប្រើប្រាស់ Kilo Pass។ | --- ## អ្នកផ្តល់សេវា Adobe Firefly តាមវេប (មិនផ្លូវការ/សាកល្បង) ការធ្វើឱ្យសម័យថ្មីឡើងវិញតាមរយៈកម្មវិធីរុករក សម្រាប់អ្នកផ្តល់សេវា Adobe Firefly តាមវេប (`open-sse/services/adobeFireflyBrowserLogin.ts`, `open-sse/services/adobeFireflySession.ts`, `open-sse/services/adobeFireflyClient.ts`)។ ជាជម្រើស — តម្លៃលំនាំដើមទាំងអស់ត្រូវបានកែតម្រូវឱ្យសមស្របសម្រាប់ ការដំឡើងលើកុំព្យូទ័រលើតុធម្មតា។ > **បានដកចេញនៅក្នុង #9255។** Chrome runtime ចាស់ដែលភ្ជាប់តាម CDP (adobeFireflyChromeRuntime.ts) ត្រូវបាន > ជំនួសដោយសេវាចូលតាមកម្មវិធីរុករក Playwright ហើយជម្រើសកំណត់របស់វាលែងមានទៀតហើយ។ អថេរ > ADOBE_FIREFLY_CHROME_ CDP_PORT / VISIBLE / HEADED / PING / FORCE_RESTART រួមជាមួយ > ADOBE_FIREFLY_LOGIN_WAIT_MS និង ADOBE_FIREFLY_FORTER_WAIT_MS មិនត្រូវបានអាននៅកន្លែងណាមួយក្នុង > codebase ទេ — ការកំណត់ពួកវាមិនមានឥទ្ធិពលទេ។ | អថេរ | លំនាំដើម | ឯកសារប្រភព | សេចក្ដីពិពណ៌នា | | ------------------------------------ | --------------- | ----------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------- | | `ADOBE_FIREFLY_CHROME_HEADLESS` | `0` | `open-sse/services/adobeFireflyBrowserLogin.ts` | កំណត់ជា `1` ដើម្បីប្រើ Chrome ដោយគ្មានផ្ទាំងបង្ហាញពិតប្រាកដ (ត្រូវបានដឹងថាមិនដំណើរការសម្រាប់ការបង្កើត; សម្រាប់ការបំបាត់កំហុសប៉ុណ្ណោះ)។ | | `ADOBE_FIREFLY_BROWSER_REFRESH` | `1` | `open-sse/services/adobeFireflySession.ts` | ជ្រើសរើសបើក/បិទការកម្តៅកម្មវិធីរុករកជាមុន។ `0` បិទការកម្តៅជាមុន (ការស្ដារឡើងវិញពី 408 នៅពាក់កណ្តាលបាច់នៅតែអនុវត្ត)។ | | `ADOBE_FIREFLY_SESSION_DISK` | `1` | `open-sse/services/adobeFireflySession.ts` | កំណត់ជា `0` ដើម្បីបិទការរក្សាទុកសម័យ Adobe Firefly ជាអចិន្ត្រៃយ៍ទៅក្នុងថាស។ | | `ADOBE_FIREFLY_MIN_SUBMIT_GAP_MS` | _(មិនបានកំណត់)_ | `open-sse/services/adobeFireflySession.ts` | ចន្លោះពេលអប្បបរមា (ms) ដែលត្រូវបានបង្ខំឱ្យមានរវាងការដាក់ស្នើបន្តបន្ទាប់ ដោយជំនួសតម្លៃលំនាំដើមដែលមានស្រាប់។ | | `ADOBE_FIREFLY_BATCH_EXTRA_GAP_MS` | _(មិនបានកំណត់)_ | `open-sse/services/adobeFireflySession.ts` | ចន្លោះពេលបន្ថែម (ms) ដែលត្រូវបានបន្ថែមបន្ទាប់ពីបាច់ជោគជ័យ ដោយជំនួសតម្លៃលំនាំដើមដែលមានស្រាប់។ | | `ADOBE_FIREFLY_SUBMIT_BASE_DELAY_MS` | _(មិនបានកំណត់)_ | `open-sse/services/adobeFireflyClient.ts` | ការពន្យារពេលមូលដ្ឋាន (ms) មុនពេលដាក់ស្នើសំណើបង្កើត ដោយជំនួសតម្លៃលំនាំដើមដែលមានស្រាប់។ | --- ## 19. ការធ្វើសមកាលកម្មម៉ូដែល (Dev) | អថេរ | តម្លៃលំនាំដើម | ឯកសារប្រភព | សេចក្តីពិពណ៌នា | | ----------------------------------- | ----------------- | ---------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `MODELS_DEV_SYNC_ENABLED` | _(មិនបានកំណត់)_ | `src/lib/modelsDevSync.ts` | ការកំណត់ជំនួសដាច់ខាតសម្រាប់ការធ្វើសមកាលកម្មតម្លៃ models.dev។ មិនបានកំណត់ = គោរពតាម Settings > AI (`modelsDevSyncEnabled`)។ `0`/`false`/`off`/`no` **មានអាទិភាពលើ DB** ហើយរំលងទាំងការធ្វើសមកាលកម្មតាមកាលកំណត់ និងការស្កេន SQL/JSON របស់ `getModelsDevPricing()` (សម្រាប់ស្ដារឡើងវិញ នៅពេលផ្ទាំងគ្រប់គ្រងជាប់គាំងលើ event loop ដដែល)។ `1`/`true`/`on`/`yes` បង្ខំឱ្យបើកការធ្វើសមកាលកម្ម។ ការរក្សាទុក/សម្អាតតម្លៃនៅតែហៅ `backupDbFile("pre-write")` ដែលមិនធ្វើអ្វីឡើយ ក្រោមការកម្រិតចន្លោះពេល 60 នាទី ឬ `DISABLE_SQLITE_AUTO_BACKUP`។ | | `MODELS_DEV_SYNC_INTERVAL` | `86400` (24 ម៉ោង) | `src/lib/modelsDevSync.ts` | ចន្លោះពេលធ្វើសមកាលកម្មកាតាឡុកម៉ូដែលក្នុងអំឡុងពេលអភិវឌ្ឍន៍ គិតជាវិនាទី។ | | `CONTEXT_WINDOW_RECONCILE_INTERVAL` | `86400` (24 ម៉ោង) | `src/lib/contextWindowResolver.ts` | ចន្លោះពេល (គិតជាវិនាទី) សម្រាប់កម្មវិធីសម្របសម្រួល context-window ដែលកែតម្រូវដោយខ្លួនឯង (5004)៖ ខ្ទាស់ទំហំ window ដែលបានប្រកាសដោយ provider ពីការរកឃើញ `/models` ជាការកំណត់ជំនួស `auto:discovery` នៅពេលវាខុសពីកាតាឡុក។ កំណត់ជា `0` ដើម្បីបិទ។ ប្រើទិន្នន័យដែលបានធ្វើសមកាលកម្មរួចឡើងវិញ (មិនមានការទាញយកថ្មី) ហើយមិនដែលសរសេរជាន់លើការកំណត់ជំនួស `manual` ទេ។ | --- ## 20. ការកំណត់ជាក់លាក់តាមអ្នកផ្តល់សេវា | អថេរ | លំនាំដើម | ឯកសារប្រភព | សេចក្តីពិពណ៌នា | | ---------------------------------------------- | -------------------------------------- | ---------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `OPENROUTER_CATALOG_TTL_MS` | `86400000` (24h) | `src/lib/catalog/openrouterCatalog.ts` | TTL នៃឃ្លាំងសម្ងាត់កាតាឡុកម៉ូដែល OpenRouter។ | | `MODEL_CATALOG_INCLUDE_NAMES` | `true` | `src/shared/constants/featureFlagDefinitions.ts` | រួមបញ្ចូលវាល `name` ដែលងាយស្រួលបង្ហាញនៅក្នុងការឆ្លើយតប `/v1/models`។ បិទសម្រាប់កម្មវិធីអតិថិជនដែលរំពឹងតែ ID ប៉ុណ្ណោះ។ | | `CATALOG_BUILD_TIMEOUT_MS` | `8000` (8s) | `src/app/api/v1/models/catalogCache.ts` | ដែនកំណត់ពេលរង់ចាំលើ cold path សម្រាប់ការស្ថាបនាកាតាឡុក `GET /v1/models` ឡើងវិញដែលបានរួមបញ្ចូលគ្នា (#12627)។ នៅពេលអស់ពេល ប្រព័ន្ធនឹងផ្តល់ការឆ្លើយតប 200 ចុងក្រោយដែលមានសុពលភាព ប្រសិនបើមាន។ | | `OMNIROUTE_SYNCED_CATALOG_STALE_AFTER_MS` | `2592000000` (30 ថ្ងៃ) | `src/lib/db/models/activeSyncedCatalog.ts` | អាយុកាលដែលបន្ទាប់ពីនោះ បញ្ជីម៉ូដែលដែលបានធ្វើសមកាលកម្មរបស់ការតភ្ជាប់នឹងលែងត្រូវបានចាត់ទុកថាជាប្រភពសម្រេចសម្រាប់ការកំណត់ផ្លូវ ហើយបើកឱ្យប្រើបញ្ជីចុះឈ្មោះជំនួសវិញ (#12849)។ ជួរដេកដែលមិនធ្លាប់មានត្រាពេលវេលា ត្រូវបានចាត់ទុកថាហួសសម័យ។ | | `OMNIROUTE_ANALYTICS_CACHE_TTL_MS` | `60000` (60s) | `src/lib/usage/analyticsResponseCache.ts` | រយៈពេលដែលការឆ្លើយតបយឺតពី `GET /api/usage/analytics` ត្រូវបានប្រើឡើងវិញសម្រាប់ខ្សែអក្សរសំណួរដូចគ្នា (#15629)។ `0` បិទឃ្លាំងសម្ងាត់។ | | `OMNIROUTE_ANALYTICS_CACHE_MIN_COMPUTE_MS` | `1000` (1s) | `src/lib/usage/analyticsResponseCache.ts` | មានតែការឆ្លើយតបវិភាគដែលចំណាយពេលបង្កើតយ៉ាងហោចណាស់ស្មើរយៈពេលនេះប៉ុណ្ណោះ ដែលត្រូវបានរក្សាទុកក្នុងឃ្លាំងសម្ងាត់ ដូច្នេះ instance តូចៗតែងតែឃើញទិន្នន័យថ្មី។ | | `NANOBANANA_POLL_TIMEOUT_MS` | `120000` | `open-sse/handlers/imageGeneration.ts` | រយៈពេលរង់ចាំអតិបរមាសម្រាប់ការងារបង្កើតរូបភាព NanoBanana។ | | `NANOBANANA_POLL_INTERVAL_MS` | `2500` | `open-sse/handlers/imageGeneration.ts` | ប្រេកង់ពិនិត្យស្ថានភាពការងារ NanoBanana។ | | `ADOBE_FIREFLY_SUBMIT_BASE_DELAY_MS` | `8000` | `open-sse/services/adobeFireflyUpscale.ts` | រយៈពេលពន្យារមូលដ្ឋានសម្រាប់ exponential backoff នៃការព្យាយាមដាក់ស្នើការពង្រីកគុណភាព Adobe Firefly ឡើងវិញ។ | | `AWS_REGION` | _(មិនបានកំណត់)_ | `src/lib/providers/validation.ts`, `open-sse/handlers/audioSpeech.ts` | តំបន់ដែលប្រើសម្រាប់បង្កើត endpoint របស់ AWS Bedrock (Kiro, អូឌីយ៉ូ)។ | | `AWS_DEFAULT_REGION` | _(មិនបានកំណត់)_ | `src/lib/providers/validation.ts`, `open-sse/handlers/audioSpeech.ts` | តម្លៃបម្រុងនៅពេល `AWS_REGION` មិនត្រូវបានកំណត់។ | | `CLOUDFLARE_ACCOUNT_ID` | _(មិនបានកំណត់)_ | `open-sse/executors/cloudflare-ai.ts` | ID គណនីសម្រាប់ Cloudflare Workers AI។ | | `CLOUDFLARE_PLAYGROUND_CHROME_PATH` | _(មិនបានកំណត់)_ | `open-sse/executors/cloudflare-playground.ts` | ផ្លូវពេញលេញទៅកាន់ឯកសារ binary របស់ Chrome លើ desktop សម្រាប់ executor របស់ Cloudflare AI Playground ដែលត្រូវប្រើនៅពេលការត្រួតពិនិត្យស្នាមសម្គាល់ headless រារាំង Chromium ដែលភ្ជាប់មកជាមួយ Playwright។ | | `CODEBUDDY_SYSTEM_PROMPT_MAX_LEN` | ∅ (∞) | `open-sse/executors/codebuddy/shared.ts` | ដែនកំណត់ប្រវែងជាជម្រើសសម្រាប់ system prompt របស់អ្នកហៅ ដែលផ្ញើទៅ CodeBuddy (CN និង International)។ តាមលំនាំដើម មានតែ prompt ដែលផ្ទុកសញ្ញាសម្គាល់អត្តសញ្ញាណ coding-agent ប៉ុណ្ណោះ ដែលត្រូវបានជំនួសដោយ prompt អព្យាក្រឹត (តម្រងមាតិការបស់ Tencent បដិសេធ prompt ទាំងនោះ) ហើយ prompt វែងៗត្រូវបានរក្សាទុក។ ចំនួនគត់ > 0 ក៏ជំនួស system prompt ណាមួយដែលវែងជាងចំនួនតួអក្សរនោះផងដែរ។ ការមិនកំណត់, `0` ឬតម្លៃដែលមិនមែនជាចំនួនគត់ នឹងបិទដែនកំណត់នេះ។ រាល់ការជំនួសនីមួយៗ នឹងកត់ត្រាថាច្បាប់ណាមួយត្រូវបានអនុវត្ត (សញ្ញាសម្គាល់អត្តសញ្ញាណ ឬប្រវែង)។ | | `CLOUDFLARE_API_BASE` | `https://api.cloudflare.com/client/v4` | `src/app/api/settings/proxy/cloudflare-deploy/route.ts` | កំណត់ជំនួសមូលដ្ឋាន Cloudflare REST API ដែលប្រើដោយកម្មវិធីដាក់ពង្រាយ relay របស់ proxy-pool Workers (#4640 / 9router#1360)។ | | `NEXT_PUBLIC_CLOUDFLARE_RELAY_DEFAULT_PROJECT` | `omniroute-relay` | `src/app/(dashboard)/dashboard/settings/components/proxy/CloudflareRelayModal.tsx` | ឈ្មោះគម្រោង worker លំនាំដើមដែលត្រូវបានណែនាំក្នុង modal "Deploy Relay" របស់ proxy-pool។ | | `NEXT_PUBLIC_CLOUDFLARE_RELAY_ENABLED` | `true` | `src/app/(dashboard)/dashboard/settings/components/proxy/ProxyPoolTab.tsx` | កំណត់ជា `false` ដើម្បីលាក់ជម្រើស relay របស់ Cloudflare Workers ពីផ្ទាំង Proxy Pool។ | | `CLOUDFLARED_BIN` | រកឃើញដោយស្វ័យប្រវត្តិ | `src/lib/cloudflaredTunnel.ts` | ផ្លូវផ្ទាល់ខ្លួនទៅកាន់ binary `cloudflared`។ | | `CLOUDFLARED_PROTOCOL` | `http2` | `src/lib/cloudflaredTunnel.ts` | ពិធីការដឹកជញ្ជូន tunnel៖ `http2` (លំនាំដើម), `quic` ឬ `auto`។ | | `CLOUDFLARED_CONFIG` | _(មិនបានកំណត់)_ | `src/lib/cloudflaredTunnel.ts` | ផ្លូវទៅកាន់ `config.yml` របស់ cloudflared ដែលគ្រប់គ្រងក្នុងមូលដ្ឋាន (ជាមួយ `tunnel:`, `credentials-file:`, `ingress:`)។ នៅពេលកំណត់ OmniRoute នឹងដំណើរការ `tunnel --config run` (tunnel ដែលមានឈ្មោះ) ជំនួសឱ្យ quick tunnel បណ្ដោះអាសន្ន។ | | `CLOUDFLARED_HOSTNAME` | _(ពី ingress នៃការកំណត់រចនាសម្ព័ន្ធ)_ | `src/lib/cloudflaredTunnel.ts` | កំណត់ជំនួសឈ្មោះម៉ាស៊ីនសាធារណៈរបស់ tunnel ដែលមានឈ្មោះ (ឧ. `ai.example.com`) ដែលត្រូវបានរាយការណ៍ជា `publicUrl`/`apiUrl`។ នៅពេលមិនបានកំណត់ វាត្រូវបានអានពីឈ្មោះម៉ាស៊ីន `ingress` ដំបូងនៃការកំណត់រចនាសម្ព័ន្ធ។ | | `DENO_DEPLOY_API_BASE` | `https://api.deno.com/v2` | `src/app/api/settings/proxy/deno-deploy/route.ts` | កំណត់ជំនួសមូលដ្ឋាន Deno Deploy REST API ដែលប្រើដោយកម្មវិធីដាក់ពង្រាយ relay នៃ proxy-pool (#4643 / 9router#1437)។ | | `NEXT_PUBLIC_DENO_RELAY_DEFAULT_PROJECT` | `omniroute-deno-relay` | `src/app/(dashboard)/dashboard/settings/components/proxy/DenoRelayModal.tsx` | ឈ្មោះកម្មវិធី Deno Deploy លំនាំដើមដែលបានណែនាំក្នុង modal "Deploy Relay" របស់ proxy-pool។ | | `NEXT_PUBLIC_DENO_RELAY_ENABLED` | `true` | `src/app/(dashboard)/dashboard/settings/components/proxy/ProxyPoolTab.tsx` | កំណត់ជា `false` ដើម្បីលាក់ជម្រើស relay របស់ Deno Deploy ពីផ្ទាំង Proxy Pool។ | | `SEARCH_CACHE_TTL_MS` | `300000` (5 នាទី) | `open-sse/services/searchCache.ts` | TTL សម្រាប់ការរក្សាទុកឃ្លាំងសម្ងាត់នៃការឆ្លើយតបពី search API (Perplexity, Brave ជាដើម)។ | | `ENABLE_CC_COMPATIBLE_PROVIDER` | `false` | `src/shared/utils/featureFlags.ts` | បង្ហាញ UI សាកល្បងសម្រាប់ provider ដែលត្រូវគ្នាជាមួយ CC សម្រាប់ relay ដែលប្រើតែ Claude Code។ | | `NINEROUTER_HOST` | `127.0.0.1` | `open-sse/executors/ninerouter.ts` | កំណត់ជំនួស host ដែល instance 9router ដែលបានបង្កប់ប្រើសម្រាប់ស្ដាប់។ | | `NINEROUTER_PORT` | `20130` | `open-sse/executors/ninerouter.ts` | កំណត់ជំនួស port ដែល instance 9router ដែលបានបង្កប់ប្រើសម្រាប់ស្ដាប់។ | | `EMBED_WS_PROXY_HOST` | `127.0.0.1` | `src/lib/services/embedWsProxy.ts` | host សម្រាប់ bind នៃ proxy WebSocket របស់សេវាដែលបានបង្កប់ (តាមលំនាំដើមសម្រាប់តែ loopback)។ | | `EMBED_WS_PROXY_PORT` | `20131` | `src/lib/services/embedWsProxy.ts` | port សម្រាប់ម៉ាស៊ីនមេ proxy WebSocket របស់សេវាដែលបានបង្កប់។ | | `CLIPROXYAPI_HOST` | `127.0.0.1` | `open-sse/executors/cliproxyapi.ts` | host សម្រាប់ bridge CLIProxyAPI (ការរួមបញ្ចូលចាស់)។ | | `CLIPROXYAPI_PORT` | `5544` | `open-sse/executors/cliproxyapi.ts` | port សម្រាប់ bridge CLIProxyAPI។ | | `CLIPROXYAPI_API_KEY` | _(ទទេ)_ | `open-sse/handlers/chatCore/cliproxyapiCredentials.ts` | key បម្រុងសម្រាប់ data-plane នៅពេលមិនមានការកំណត់ `cliproxyapi_api_key`។ | | `CLIPROXYAPI_MANAGEMENT_KEY` | _(ទទេ)_ | `src/lib/services/cliproxyAccountHealth.ts` | key គ្រប់គ្រងសម្រាប់អានសុខភាពគណនីពី instance CLIProxyAPI ដែលគ្រប់គ្រងពីខាងក្រៅ។ | | `CLIPROXYAPI_CONFIG_DIR` | `~/.cli-proxy-api` | `src/lib/versionManager/processManager.ts` | ថតការកំណត់រចនាសម្ព័ន្ធ CLIProxyAPI។ | | `CLIPROXY_BIND_HOST` | `127.0.0.1` | `docker-compose.yml` | ចំណុចប្រទាក់ host ដែល docker-compose ប្រើដើម្បីបោះផ្សាយ sidecar `cliproxyapi` (#12578)។ volume ទិន្នន័យរបស់វាផ្ទុកព័ត៌មានសម្ងាត់ OAuth/API របស់ provider ហើយ image ដែលបានខ្ទាស់មិនមានការកំណត់ជំនួស `api-keys` សម្រាប់ data-plane តាម env ទេ (មានតែ `config.yaml` ដែលបាន mount) ដូច្នេះ `0.0.0.0` នឹងបង្ហាញសេវាដែលផ្ទុកព័ត៌មានសម្ងាត់ទៅកាន់ LAN ទាំងមូល។ | | `MUX_SERVICE_PORT` | `8322` | `src/lib/services/bootstrap.ts` | កំណត់ជំនួស port ដែល daemon សម្របសម្រួល agent Mux (coder/mux) ដែលបានបង្កប់ស្តាប់ (ជានិច្ចកាលនៅ 127.0.0.1)។ | | `OPENWA_SERVICE_PORT` | `8323` | `src/lib/services/bootstrap.ts` | កំណត់ជំនួស port ដែល daemon open-wa (ស្វ័យប្រវត្តិកម្ម WhatsApp Web) ដែលបានបង្កប់ស្តាប់ (ជានិច្ចកាលនៅ 127.0.0.1)។ | | `DARIO_HOST` | `127.0.0.1` | `open-sse/executors/dario.ts` | host សម្រាប់ bind/connect នៃសេវាកម្ម Dario ដែលបានបង្កប់ (តាមលំនាំដើម ប្រើតែ loopback ប៉ុណ្ណោះ)។ | | `DARIO_PORT` | `3456` | `open-sse/executors/dario.ts` | port នៃសេវាកម្ម Dario ដែលបានបង្កប់។ | | `DARIO_HOST` | `127.0.0.1` | `open-sse/executors/dario.ts` | host សម្រាប់ bind/connect នៃសេវាកម្ម Dario ដែលបានបង្កប់ (តាមលំនាំដើម ប្រើតែ loopback ប៉ុណ្ណោះ)។ | | `DARIO_PORT` | `3456` | `open-sse/executors/dario.ts` | port នៃសេវាកម្ម Dario ដែលបានបង្កប់។ | | `LOCAL_HOSTNAMES` | _(ទទេ)_ | `open-sse/config/providerRegistry.ts` | hostname បន្ថែមដែលបំបែកដោយសញ្ញាក្បៀស និងត្រូវបានចាត់ទុកថាជា "local" (ឈ្មោះសេវាកម្ម Docker ជាដើម)។ | `ENABLE_CC_COMPATIBLE_PROVIDER` គឺសម្រាប់តែ relay របស់ភាគីទីបីដែលទទួលយក Claude Code clients ផ្តាច់មុខប៉ុណ្ណោះ។ OmniRoute សរសេរសំណើឡើងវិញ ដើម្បីឱ្យ relay ទាំងនោះទទួលយកវា។ ប្រសិនបើអ្នកគ្រាន់តែចង់ប្រើ Claude Code CLI ឬអ្នកមិនប្រាកដថា relay ទាំងនេះជាអ្វីទេ សូមរក្សាវាឱ្យបិទ ហើយបន្ថែម provider ដែលត្រូវគ្នាជាមួយ Anthropic ធម្មតាជំនួសវិញ។ --- ## 21. សុខភាពប្រូកស៊ី | អថេរ | លំនាំដើម | ឯកសារប្រភព | សេចក្ដីពិពណ៌នា | | ------------------------------------------------- | ------------------------ | ---------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `PROXY_FAST_FAIL_TIMEOUT_MS` | `2000` | `src/lib/proxyHealth.ts` | រយៈពេលអស់ពេលសម្រាប់ការពិនិត្យសុខភាពបែបបរាជ័យរហ័ស។ | | `PROXY_LATENCY_WINDOW_HOURS` | `3` | `src/lib/db/proxies.ts` | ចន្លោះពេល (គិតជាម៉ោង) សម្រាប់គណនាភាពយឺតយ៉ាវជាមធ្យមរបស់ប្រូកស៊ីបេក្ខភាពក្នុងយុទ្ធសាស្ត្រក្រុមដែលបង្កើនប្រសិទ្ធភាពភាពយឺតយ៉ាវ។ | | `PROXY_HEALTH_CACHE_TTL_MS` | `30000` | `src/lib/proxyHealth.ts` | TTL របស់ឃ្លាំងសម្ងាត់សម្រាប់លទ្ធផលពិនិត្យសុខភាព។ | | `PROXY_HEALTH_UNHEALTHY_CACHE_TTL_MS` | `2000` | `src/lib/proxyHealth.ts` | TTL របស់ឃ្លាំងសម្ងាត់សម្រាប់ការស្ទង់សុខភាពប្រូកស៊ីដែលបរាជ័យ។ រក្សាតម្លៃនេះឱ្យខ្លីជាង `PROXY_HEALTH_CACHE_TTL_MS` ដើម្បីឱ្យការអស់ពេលបណ្ដោះអាសន្នរបស់ប្រូកស៊ីក្រោមស្របគ្នាកម្រិតខ្ពស់អាចព្យាយាមឡើងវិញបានយ៉ាងឆាប់រហ័ស ដោយមិនបិទមុខងារបរាជ័យរហ័សសម្រាប់ប្រូកស៊ីដែលលែងដំណើរការពិតប្រាកដ។ | | `PROXY_HEALTH_ENABLED` | `true` | `src/lib/proxyHealth/scheduler.ts` | កំណត់ជា `false` ដើម្បីបិទកម្មវិធីកំណត់ពេលសុខភាពប្រូកស៊ីដែលដំណើរការនៅផ្ទៃខាងក្រោយ និងស្ទង់ពិនិត្យប្រូកស៊ីដែលបានចុះឈ្មោះជាប្រចាំ។ | | `PROXY_HEALTH_INTERVAL_MS` | `600000` | `src/lib/proxyHealth/scheduler.ts` | ចន្លោះពេលនៃការស្កេនរបស់កម្មវិធីកំណត់ពេលសុខភាពនៅផ្ទៃខាងក្រោយ គិតជា ms (អប្បបរមា `60000`)។ | | `PROXY_HEALTH_RELAY_INTERVAL_MS` | `21600000` | `src/lib/proxyHealth/relayCadence.ts` | ចន្លោះពេលស្ទង់ជាមិល្លីវិនាទីសម្រាប់ប្រូកស៊ី edge-relay (`deno`/`vercel`/`cloudflare`) ដែលការស្ទង់របស់វាដាស់ serverless isolate ដែលមានគិតថ្លៃ (អប្បបរមា `60000`)។ | | `PROXY_HEALTH_RECOVERY_INTERVAL_MS` | `600000` | `src/lib/proxyHealth/scheduler.ts` | ចន្លោះពេលដំណើរការស្ដារឡើងវិញក្នុងផ្ទៃខាងក្រោយជាមិល្លីវិនាទី៖ កំណត់ថាតើត្រូវស្ទង់ប្រូកស៊ីដែលពីមុនមិនដំណើរការឡើងវិញញឹកញាប់ប៉ុណ្ណា ដើម្បីឱ្យប្រូកស៊ីដែលបានស្ដារឡើងវិញចូលក្នុងរង្វិលជុំវិញដោយមិនចាំបាច់ចាប់ផ្ដើមឡើងវិញ។ តម្លៃក្រោម `60000` នឹងត្រឡប់ទៅប្រើតម្លៃលំនាំដើម។ | | `PROXY_HEALTH_TEST_URL` | `https://httpbin.org/ip` | `src/lib/proxyHealth/probeTarget.ts` | គោលដៅស្ទង់ការតភ្ជាប់ដែលប្រើដោយកម្មវិធីកំណត់ពេល និង endpoint `/api/settings/proxies/auto-test`។ កំណត់វាទៅកាន់ URL ខាងក្នុង/ដែលបង្ហោះដោយខ្លួនឯង ដើម្បីចៀសវាងការប្រើតម្លៃលំនាំដើមសាធារណៈ។ | | `PROXY_HEALTH_TEST_CONCURRENCY` | `10` | `src/lib/proxyHealth/probeTarget.ts` | ចំនួនការស្ទង់ដែលចាប់ផ្ដើមក្នុងពេលតែមួយក្នុងមួយបាច់ និងត្រូវបានប្រើរួមគ្នាដោយកម្មវិធីកំណត់ពេល និង endpoint `/api/settings/proxies/auto-test`។ ត្រូវបានបង្គត់ចុះដោយមានតម្លៃអប្បបរមា 1 និងកំណត់អតិបរមាត្រឹម 50។ | | `PROXY_HEALTH_TEST_STAGGER_MS` | `100` | `src/lib/proxyHealth/probeTarget.ts` | ការពន្យារពេលជាមិល្លីវិនាទីរវាងការបញ្ជូនសំណើស្ទង់ពីរនៅក្នុងបាច់មួយ។ បើគ្មានវា បាច់ទាំងមូលនឹងចេញនៅពេលតែមួយ ហើយ IP ចេញរួមអាចប៉ះពាល់ដល់គោលដៅដែលមានការកំណត់អត្រា។ កំណត់ជា `0` ដើម្បីបិទគម្លាតនេះ; កំណត់អតិបរមាត្រឹម 5000។ | | `PROXY_HEALTH_USE_PROVIDER_TARGET` | `true` | `src/lib/proxyHealth/providerProbeTarget.ts` | កំណត់ជា "false" ដើម្បីបញ្ឈប់ការស្ទង់ម៉ាស៊ីនពិតរបស់អ្នកផ្ដល់សេវាដែលបានកំណត់ទៅឱ្យប្រូកស៊ី (`GET /models` ដោយគ្មាន API key) ហើយតែងតែប្រើ `PROXY_HEALTH_TEST_URL` ជំនួសវិញ។ | | `PROXY_HEALTH_AUTO_DEACTIVATE` | `false` | `src/lib/proxyHealth/statusPolicy.ts` | នៅពេល `false` (លំនាំដើម) ការស្ទង់ការតភ្ជាប់ដោយស្វ័យប្រវត្តិ (កម្មវិធីកំណត់ពេល + ប៊ូតុង "សាកល្បងទាំងអស់" របស់ `/api/settings/proxies/auto-test`) គឺ **បានតែអានប៉ុណ្ណោះ** ហើយមិនដែលកែប្រែស្ថានភាពរបស់ប្រូកស៊ីឡើយ — មានតែប្រតិបត្តិករប៉ុណ្ណោះដែលកំណត់ថាសកម្ម/អសកម្ម ដូច្នេះការស្ទង់មិនស្ថិរមិនអាចធ្វើឱ្យប្រូកស៊ីដែលបានកំណត់ជាប់គាំងទេ (#6246)។ កំណត់ជា `true` ដើម្បីស្ដារឥរិយាបថសាកល្បងហើយកំណត់ស្ថានភាពបែបចាស់។ | | `FLUSH_EMPTY_RETRY_ENABLED` | `false` | `src/shared/utils/featureFlags.ts` | ទង់មុខងារដែលត្រូវបើកប្រើដោយចេតនា (សូមមើល [FEATURE_FLAGS.md](./FEATURE_FLAGS.md); ការកំណត់ជាន់លើក្នុង DB របស់ផ្ទាំងគ្រប់គ្រងមានអាទិភាព)។ `true` (ឬ `1`, `yes`) ព្យាយាមឡើងវិញនូវវេន streaming ដែលបានបកប្រែហើយទទេ តាមរយៈផ្លូវព័ត៌មានសម្ងាត់ធម្មតា (រហូតដល់ `STREAM_RECOVERY.EMPTY_TURN_RETRY_MAX` ដង) ជំនួសឱ្យការបង្ហាញ 200 ទទេ ឬ 502 ដែលមានខ្លឹមសារទទេ។ | | `PROXY_POOL_EGRESS_OBSERVATION` | `false` | `src/shared/utils/featureFlags.ts` | ទង់មុខងារដែលត្រូវបើកប្រើដោយចេតនា (សូមមើល [FEATURE_FLAGS.md](./FEATURE_FLAGS.md); ការកំណត់ជាន់លើក្នុង DB របស់ផ្ទាំងគ្រប់គ្រងមានអាទិភាព)។ `true` (ឬ `1`, `yes`) បង្ហាញការសង្កេតចរាចរចេញរបស់ក្រុមប្រូកស៊ីដែលបានតែអាន នៅក្រោមក្រុមប្រូកស៊ីក្នុងផ្ទាំងគ្រប់គ្រង (IP ចេញផ្សេងៗគ្នា ការតភ្ជាប់ និងចំនួនដែលត្រូវបានឃើញច្រើនបំផុតនៅពីក្រោយ IP មួយក្នុងរយៈពេល 24 ម៉ោងចុងក្រោយ ដោយយកពីកំណត់ហេតុប្រូកស៊ី)។ មិនដែលប្រើសម្រាប់ការកំណត់ផ្លូវឡើយ។ | | `PROXY_OPERATOR_EGRESS_ENABLED` | `false` | `src/shared/utils/featureFlags.ts` | ទង់មុខងារដែលត្រូវបើកប្រើដោយចេតនា (សូមមើល [FEATURE_FLAGS.md](./FEATURE_FLAGS.md); ការកំណត់ជាន់លើពី DB របស់ផ្ទាំងគ្រប់គ្រងមានអាទិភាព)។ `true` (ឬ `1`, `yes`) ទទួលយកអាសយដ្ឋានដែលបានសង្កេតឃើញ និងមានកាលបរិច្ឆេទ ដែល operator បានបញ្ជូនសម្រាប់សមាជិកនីមួយៗនៃ pool ហើយបញ្ចូលពួកវាជាមួយនឹងការអាន journal សម្រាប់ការបង្ហាញ និងលំដាប់ pool។ | | `PROXY_OPERATOR_EGRESS_WINDOW_HOURS` | `24` | `src/lib/db/proxyOperatorEgress.ts` | ចន្លោះពេលសង្កេតគិតជាម៉ោងសម្រាប់ជួរទិន្នន័យ egress ដែល operator បានបញ្ជូន (ត្រូវបានអានរាល់ពេលអាន; មិនចាំបាច់ចាប់ផ្តើមឡើងវិញទេ)។ កំណត់ក្នុងចន្លោះ 1..168; តម្លៃក្រៅចន្លោះ មិនមែនជាលេខ ឬទទេ នឹងត្រឡប់ទៅប្រើ 24 ជាមួយនឹងការព្រមានតែមួយដងសម្រាប់ process ទាំងមូល ហើយមិនបង្ក throw ឡើយ។ | | `PROXY_AUTO_REMOVE` | `false` | `src/lib/proxyHealth/scheduler.ts` | កំណត់ជា `true` ដើម្បីអនុញ្ញាតឱ្យ scheduler ដក proxy ចេញដោយស្វ័យប្រវត្តិ បន្ទាប់ពីបរាជ័យជាប់ៗគ្នាជាច្រើនដង។ | | `PROXY_AUTO_REMOVE_AFTER` | `3` | `src/lib/proxyHealth/scheduler.ts` | ចំនួនការបរាជ័យជាប់ៗគ្នា មុនពេល scheduler ដក proxy ចេញដោយស្វ័យប្រវត្តិ (នៅពេល `PROXY_AUTO_REMOVE=true`)។ | | `PROXY_AUTO_DISABLE` | `false` | `src/lib/proxyHealth/scheduler.ts` | កំណត់ជា `true` ដើម្បីអនុញ្ញាតឱ្យ scheduler បិទ proxy បែបទន់ (ស្ថានភាព `dead` និងមិនត្រូវបានលុប) បន្ទាប់ពីបរាជ័យជាប់ៗគ្នាជាច្រើនដង ជំនួសឱ្យការដកវាចេញ។ នេះជាជម្រើសដែលមិនបំផ្លាញទិន្នន័យជំនួសឱ្យ `PROXY_AUTO_REMOVE`៖ proxy នឹងត្រូវបានដកចេញពីការដោះស្រាយ pool/rotation ភ្លាមៗ (តម្រងស្ថានភាព alive ដែលប្រើដោយការដោះស្រាយ scope-pool បានដកវាចេញរួចហើយ) ហើយនឹងត្រូវបានដំណើរការឡើងវិញដោយស្វ័យប្រវត្តិ នៅពេលវាចាប់ផ្តើមឆ្លងកាត់ probe ម្តងទៀត។ ប្រើកម្រិត `PROXY_AUTO_REMOVE_AFTER` រួមគ្នា។ ប្រសិនបើទង់ទាំងពីរជា `true` នោះ `PROXY_AUTO_REMOVE` មានអាទិភាព។ | | `PROXY_HEALTH_PASSIVE_SKIP` | `false` | `src/lib/proxyHealth/scheduler.ts` | ការរំលងបែប passive ដែលត្រូវបើកប្រើដោយចេតនា៖ នៅពេលជា `true` scheduler នឹងរំលង live probe សម្រាប់ endpoint ដែលចរាចរណ៍ production ថ្មីៗរបស់វាបានបញ្ជាក់ភាពដំណើរការរួចហើយ (យ៉ាងហោចណាស់ជោគជ័យមួយដង និងគ្មានការបរាជ័យ proxy ដែលត្រូវបានកំណត់ប្រភពក្នុងចន្លោះពេលនោះ ហើយបានសង្កេតឃើញ provider តែមួយគត់)។ តាមលំនាំដើម វាត្រូវបានបិទ៖ proxy ទាំងអស់ត្រូវបាន probe។ | | `PROXY_PASSIVE_WINDOW_MS` | `300000` | `src/lib/proxyHealth/passiveVerdict.ts` | ចន្លោះពេលគិតជា ms នៃចរាចរណ៍ production ដែលការរំលងបែប passive ត្រួតពិនិត្យ (កំណត់ក្នុងចន្លោះ `60000..599999`)។ វាខ្លីជាងចន្លោះពេល sweep 10 នាទី ដូច្នេះការបរាជ័យថ្មីៗមានឥទ្ធិពលជាង ជំនួសឱ្យត្រូវបានបន្ថយឥទ្ធិពល។ | | `OMNIROUTE_CONTROL_PLANE_PROXY_DIRECT_FALLBACK` | `false` | `src/shared/constants/featureFlagDefinitions.ts` | អនុញ្ញាតឱ្យលំហូរ OAuth និងការផ្ទៀងផ្ទាត់ provider រំលង proxy ដែលបាន pin ហើយភ្ជាប់ដោយផ្ទាល់ នៅពេលការត្រួតពិនិត្យជាមុនអំពីលទ្ធភាពចូលដំណើរការ proxy បរាជ័យ។ លំដាប់អាទិភាពដែលមានប្រសិទ្ធភាពគឺ ការកំណត់ជាន់លើពី Feature Flags DB > env var > តម្លៃលំនាំដើម។ | | `RATE_LIMIT_MAX_WAIT_MS` | `30000` (30 វិនាទី) | `src/lib/resilience/settings.ts` | ថវិកា **រង់ចាំក្នុងជួរ** លំនាំដើម៖ រយៈពេលដែលសំណើអាចរង់ចាំចន្លោះទំនេររបស់អ្នកផ្តល់សេវា និងស្ថិតក្នុងជួរ មុនពេលវាត្រូវបានបដិសេធដោយមិនបានទៅដល់ upstream។ កម្មវិធីកំណត់ពេលត្រូវបានលុបចោលនៅពេល job ចាប់ផ្តើមប្រតិបត្តិ — ការប្រតិបត្តិត្រូវបានកំណត់ដាច់ដោយឡែកដោយ `RATE_LIMIT_EXECUTION_MAX_WAIT_MS`។ Env កំណត់តែលំនាំដើមប៉ុណ្ណោះ៖ `resilienceSettings.requestQueue.maxWaitMs` ដែលបានរក្សាទុក និងបន្ទាប់មក `rateLimitOverrides.maxWaitMs` សម្រាប់ connection នីមួយៗ មានអាទិភាពលើវារៀងៗខ្លួន។ | | `RATE_LIMIT_EXECUTION_MAX_WAIT_MS` | `600000` (10 នាទី) | `open-sse/services/rateLimitManager.ts` | កម្រិតអតិបរមានៃរយៈពេលដែលសំណើដែលបានទទួលយកអាចស្ថិតក្នុងការប្រតិបត្តិ មុនពេលការកក់ទុក rate-limit របស់វាផុតកំណត់ — ត្រូវបានបំបែកចេញពីថវិការង់ចាំក្នុងជួរ ដើម្បីកុំឱ្យការចាប់ផ្តើម fetch យឺតនៅលើ gateway ដែលមិនមែនជា incremental អស់ពេល (#12027)។ | | `RATE_LIMIT_MAX_QUEUE_DEPTH` | `0` (បានបិទ) | `open-sse/services/rateLimitManager.ts` | កម្រិតអនុញ្ញាតឱ្យចូលជួរ៖ បដិសេធដោយ 429 `queue_full` នៅពេលមានសំណើចំនួននេះនៅក្នុងជួររួចហើយ។ `0` = គ្មានដែនកំណត់ (លំនាំដើម)។ | | `RATE_LIMIT_AUTO_ENABLE` | _(មិនបានកំណត់)_ | `open-sse/services/rateLimitManager.ts` | បង្ខំឱ្យបើក/បិទសំណាញ់សុវត្ថិភាព rate limit ដែលបើកដោយស្វ័យប្រវត្តិ ដោយមិនគិតពីការកំណត់ Dashboard ដែលបានរក្សាទុក។ ទទួលយក `true`/`1`/`on` ដើម្បីបង្ខំឱ្យបើក និង `false`/`0`/`off` ដើម្បីបង្ខំឱ្យបិទ។ | | `PROVIDER_COOLDOWN_ENABLED` | _(មិនបានកំណត់ → បិទ)_ | `open-sse/services/providerCooldownTracker.ts` | ការតាមដាន cooldown សកលឆ្លងកាត់សំណើសម្រាប់ provider/connection ដែលត្រូវជ្រើសរើសបើក។ បិទតាមលំនាំដើម (ត្រួតស៊ីគ្នាជាមួយ Connection Cooldown / Provider Circuit Breaker)។ ទទួលយក `true`/`1`/`on` ដើម្បីបើក។ | | `PROVIDER_COOLDOWN_MIN_MS` | `5000` | `open-sse/services/providerCooldownTracker.ts` | cooldown អប្បបរមា (ms) មុនពេលសាកល្បង provider/connection ដែលបរាជ័យឡើងវិញ។ វាកើនឡើងតាមស្វ័យគុណដោយផ្អែកលើការបរាជ័យជាប់ៗគ្នា។ ប្រើតែនៅពេល `PROVIDER_COOLDOWN_ENABLED` ប៉ុណ្ណោះ។ | | `PROVIDER_COOLDOWN_MAX_MS` | `300000` (5 នាទី) | `open-sse/services/providerCooldownTracker.ts` | កម្រិតអតិបរមានៃ cooldown (ms) មុនពេលសាកល្បង provider/connection ដែលបរាជ័យឡើងវិញដោយមិនគិតពីលក្ខខណ្ឌផ្សេងទៀត។ ប្រើតែនៅពេល `PROVIDER_COOLDOWN_ENABLED` ប៉ុណ្ណោះ។ | | `STREAM_RECOVERY_ENABLED` | _(មិនបានកំណត់ → បិទ)_ | `src/lib/resilience/settings.ts` (ការកំណត់តម្លៃដំបូង) → `open-sse/services/streamRecovery.ts` (តក្កវិជ្ជា) | **អ្វី៖** ការសង្គ្រោះដោយតម្លាភាពនៃ stream upstream ដែលត្រូវបានកាត់ផ្តាច់ (port របស់ free-claude-code)។ ពន្យារពេល window SSE ដំបូងរហូតដល់ `STREAM_RECOVERY.HOLDBACK_MS` (750 ms) ដើម្បីឱ្យការកាត់ផ្តាច់ _មុន commit_ — ដែលកើតឡើងមុនពេល byte ណាមួយទៅដល់ client — ត្រូវបានបើកឡើងវិញ និងសាកល្បងម្ដងទៀតដោយមិនឱ្យមើលឃើញ។ **ពេលណាគួរបើក៖** upstream ដែលមិនស្ថិរភាព/ជាញឹកញាប់កាត់ stream នៅពេលចាប់ផ្តើមដោយមាន 0 byte; ទុកឱ្យបិទ ប្រសិនបើអ្នកមិនអាចទទួលយកការបន្ថែមរយៈពេលរហូតដល់ 750 ms មុនពេលទទួលបាន token ដំបូងនៅលើ stream នីមួយៗ។ ទទួលយក `true`/`1`/`on`។ កំណត់តម្លៃដំបូងសម្រាប់ការកំណត់ Resilience ដែលបានរក្សាទុក; ការកំណត់ Dashboard មានអាទិភាពនៅពេលបានកំណត់។ | | `STREAM_RECOVERY_MIDSTREAM_ENABLED` | _(មិនបានកំណត់ → បិទ)_ | `src/lib/resilience/settings.ts` (តម្លៃដើម) → `open-sse/services/streamRecovery.ts` (តក្កវិជ្ជា) | **អ្វី៖** ការបន្តស្ទ្រីមពីពាក់កណ្តាល (ដំណាក់កាល 4.4) — បន្ទាប់ពីការកាត់ផ្តាច់ _ក្រោយពេល commit_ (បៃបានទៅដល់ម៉ាស៊ីនភ្ញៀវរួចហើយ) ស្នើសុំឡើងវិញដោយប្រើអត្ថបទមួយផ្នែកជា assistant prefill ហើយតភ្ជាប់បច្ច័យដែលបាត់។ សម្រាប់តែស្ទ្រីមអត្ថបទធម្មតាដែលត្រូវគ្នាជាមួយ OpenAI ប៉ុណ្ណោះ; មិនដំណើរការឡើយ នៅពេលមាន tool call កំពុងប្រតិបត្តិ។ **ពេលណាគួរបើក៖** ការបង្កើតអត្ថបទវែងៗដែលត្រូវបានកាត់ផ្តាច់នៅពាក់កណ្តាលចម្លើយ ហើយអ្នកទទួលយកបាននូវផ្នែកចុងដែលស្ដារឡើងវិញមកដល់ជាបណ្តុំតែមួយ ជាជាងមកដល់មួយ token ម្តងៗ។ ឯករាជ្យពី `STREAM_RECOVERY_ENABLED` (ទម្រង់ហានិភ័យខុសគ្នា)។ ទទួលយក `true`/`1`/`on`។ | | `STREAM_THROUGHPUT_WATCHDOG_ENABLED` | _(មិនបានកំណត់ → បិទ)_ | `src/lib/resilience/settings.ts` → `open-sse/services/throughputWatchdog.ts` | ឧបករណ៍ឃ្លាំមើលលទ្ធផលមានប្រយោជន៍សម្រាប់ស្ទ្រីមសកម្ម ដែលត្រូវជ្រើសបើក។ វារកឃើញស្ទ្រីមដែលបន្តផ្ញើ chunks ប៉ុន្តែស្ថិតក្រោមអត្រាលទ្ធផល assistant ដែលបានកំណត់; heartbeats, usage events, deltas ទទេ និងដំណាក់កាល tool/reasoning មិនត្រូវបានចាត់ទុកខុសថាជាវឌ្ឍនភាពឡើយ។ ដាច់ដោយឡែកពីអស់ពេលដោយសារទំនេរ និងការអស់ពេលកំណត់ចុងក្រោយដាច់ខាត។ | | `STREAM_THROUGHPUT_WATCHDOG_WARMUP_MS` | `30000` | `src/lib/resilience/settings/normalize.ts` | រយៈពេលអនុគ្រោះមុនពេលវាយតម្លៃ throughput ដែលកំណត់ចន្លោះពី 0–600000 ms។ | | `STREAM_THROUGHPUT_WATCHDOG_WINDOW_MS` | `30000` | `src/lib/resilience/settings/normalize.ts` | ចន្លោះពេលរំកិលសម្រាប់លទ្ធផលមានប្រយោជន៍ ដែលកំណត់ចន្លោះពី 1000–600000 ms; ត្រូវការចន្លោះពេលពេញលេញមួយ មុនពេលបោះបង់។ | | `STREAM_THROUGHPUT_WATCHDOG_MIN_BYTES_PER_SECOND` | `4` | `src/lib/resilience/settings/normalize.ts` | អត្រាបៃអប្បបរមាក្នុងមួយវិនាទីនៃលទ្ធផល UTF-8 របស់ assistant (តំណាង token បែបប្រុងប្រយ័ត្ន) ដែលកំណត់ចន្លោះពី 1–1000000។ | | `STREAM_THROUGHPUT_WATCHDOG_MIN_USEFUL_BYTES` | `1` | `src/lib/resilience/settings/normalize.ts` | ទំហំគំរូលទ្ធផលមានប្រយោជន៍អប្បបរមាដែលមិនស្មើសូន្យ និងត្រូវបានចាត់ទុកថាអាចវាស់វែងបាន ដែលកំណត់ចន្លោះពី 1–1000000 បៃ។ | | `HEALTHCHECK_STAGGER_MS` | `3000` | `src/lib/tokenHealthCheck.ts` | ចន្លោះពេលរំលោះ (ms) រវាងការត្រួតពិនិត្យសុខភាព token របស់ provider នៅពេលចាប់ផ្ដើម។ | | `HEALTHCHECK_JITTER_MIN_MS` | `500` | `src/lib/tokenHealthCheck.ts` | jitter ចៃដន្យអប្បបរមា (ms) ដែលបន្ថែមពីលើ `HEALTHCHECK_STAGGER_MS` រវាងការត្រួតពិនិត្យសុខភាព token របស់ provider ដើម្បីការពារការកើនឡើងខ្លាំងភ្លាមៗ (បញ្ហា #1220)។ | | `HEALTHCHECK_JITTER_MAX_MS` | `5000` | `src/lib/tokenHealthCheck.ts` | jitter ចៃដន្យអតិបរមា (ms) ដែលបន្ថែមពីលើ `HEALTHCHECK_STAGGER_MS` រវាងការត្រួតពិនិត្យសុខភាព token របស់ provider ដើម្បីការពារការកើនឡើងខ្លាំងភ្លាមៗ (បញ្ហា #1220)។ | | `HEALTHCHECK_BATCH_SIZE` | `20` | `src/lib/tokenHealthCheck.ts` | ទំហំ batch នៃការត្រួតពិនិត្យដំណាលគ្នា សម្រាប់ការស្កេនត្រួតពិនិត្យសុខភាព token នៅពេលចាប់ផ្ដើម; តម្លៃធំជាងអនុញ្ញាតឱ្យត្រួតពិនិត្យការតភ្ជាប់ច្រើនជាងក្នុងពេលតែមួយ ខណៈតម្លៃតូចជាងកាត់បន្ថយបន្ទុកកើនឡើងខ្លាំងភ្លាមៗ (បញ្ហា #7875, ការថយចុះមុខងារនៃ #7719)។ | | `REQUEST_RETRY` | `2` | `src/sse/services/cooldownAwareRetry.ts` | ចំនួនដងនៃការព្យាយាមឡើងវិញដោយស្វ័យប្រវត្តិ នៅពេលទទួលបានការឆ្លើយតប cooldown ក្នុងវិសាលភាព model មុនពេលត្រឡប់កំហុសទៅម៉ាស៊ីនភ្ញៀវ។ | | `MAX_RETRY_INTERVAL_SEC` | `30` | `src/sse/services/cooldownAwareRetry.ts` | ចន្លោះពេល backoff អតិបរមា (វិនាទី) រវាងការព្យាយាមឡើងវិញបន្ទាប់ពី cooldown។ ត្រូវបានកំណត់មិនឱ្យលើសតម្លៃនេះ ដោយមិនគិតពី `Retry-After` របស់ upstream។ | | `HEADROOM_URL` | `http://localhost:8787` | `src/lib/headroom/detect.ts` | URL របស់ប្រូកស៊ីសន្សំសំចៃ token Headroom។ តាមលំនាំដើម វដ្តជីវិតរបស់ dashboard (`api/headroom/*`) បើកដំណើរការ CLI `headroom-ai` មូលដ្ឋាននៅលើ loopback; កំណត់ជាន់លើតែក្នុងករណីចង់ចង្អុលទៅប្រូកស៊ី Docker sidecar ខាងក្រៅប៉ុណ្ណោះ។ | ### ថេរសម្រាប់កែសម្រួលការស្ដារ stream ឡើងវិញ ឥរិយាបថ holdback សម្រាប់ការស្ដារឡើងវិញ ត្រូវបានកែសម្រួលដោយថេរដែលបានកំណត់ដោយផ្ទាល់នៅក្នុង `open-sse/config/constants.ts` (`STREAM_RECOVERY`) ដែលបង្ហាញនៅទីនេះសម្រាប់ជាឯកសារយោង — ការផ្លាស់ប្ដូរពួកវាតម្រូវឱ្យកែសម្រួលកូដ មិនមែន env var ទេ៖ - `STREAM_RECOVERY.HOLDBACK_MS = 750` — រយៈពេលដែលផ្ទាំង SSE ដំបូងត្រូវបានរក្សាទុក ដើម្បីឱ្យការកាត់ផ្ដាច់មុនពេលអាចត្រូវបានព្យាយាមឡើងវិញ មុនពេល byte ណាមួយត្រូវបានបញ្ជូនជាផ្លូវការទៅ client។ - `STREAM_RECOVERY.BUFFER_MAX_BYTES = 65536` — ដែនកំណត់ខ្ពស់បំផុតជាក់លាក់សម្រាប់ផ្ទាំងដែលបានរក្សាទុក; បញ្ជូនជាផ្លូវការ (flush + passthrough) ភ្លាមៗនៅពេលដែលចំនួន byte កើនដល់កម្រិតនេះ ដោយមិនគិតពីកម្មវិធីកំណត់ពេល។ - `STREAM_RECOVERY.EARLY_RETRY_MAX = 4` — ចំនួនអតិបរមានៃការបើក stream upstream ឡើងវិញដោយមិនឱ្យសង្កេតឃើញ ខណៈដែល holdback មិនទាន់ត្រូវបានបញ្ជូនជាផ្លូវការ។ > **ដែនកំណត់អត្រាតាមផ្ទាំងរំកិលសម្រាប់ provider នីមួយៗ (គ្មាន env var)៖** _fallback_ នៃ > ដែនកំណត់អត្រាតាមផ្ទាំងរំកិលសម្រាប់ provider នីមួយៗ ដែលបាននាំចូលពី FCC មាននៅក្នុងកូដ > (`open-sse/services/providerDefaultRateLimit.ts` ដែលត្រូវបានភ្ជាប់តាមរយៈ > `open-sse/services/rateLimitManager.ts`) ប៉ុន្តែត្រូវបានចេញផ្សាយជាមួយ **map លំនាំដើមទទេ** > ហើយបច្ចុប្បន្ន **មិនមាន env var សម្រាប់ប្រតិបត្តិករ** ទេ — វាត្រូវបានបើកដំណើរការតែតាមរយៈ test hook / > ការកែសម្រួលកូដប៉ុណ្ណោះ។ វាមិនត្រូវបានរាយក្នុងតារាងខាងលើដោយចេតនា។ ឧបករណ៍កំណត់អត្រា relay តាម > `(token, IP)` ដែល_មាន_ជម្រើសកំណត់ គឺ `RELAY_IP_PER_MINUTE` (§3 បណ្ដាញ និងច្រក)។ --- ## 22. ការបំបាត់កំហុស > [!CAUTION] > អថេរទាំងនេះបង្កើត **លទ្ធផលលម្អិតច្រើន** ហើយអាចធ្វើឱ្យទិន្នន័យរសើបលេចធ្លាយ។ **កុំបើកប្រើក្នុងបរិស្ថាន production ជាដាច់ខាត។** | អថេរ | លំនាំដើម | ឯកសារប្រភព | ការពិពណ៌នា | | ------------------------------------- | -------------------------------- | ----------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `CURSOR_DEBUG` | _(មិនបានកំណត់)_ | `open-sse/executors/cursor.ts` | កំណត់ជា `1` ដើម្បីបើកកំណត់ហេតុលម្អិតរបស់ Cursor executor (កំណាត់ SSE ដែលបានឌិកូដ ជាដើម)។ | | `CURSOR_STREAM_DEBUG` | _(មិនបានកំណត់)_ | `open-sse/executors/cursor.ts` | ឈ្មោះជំនួសដែលត្រូវគ្នាជាមួយកំណែចាស់របស់ `CURSOR_DEBUG`។ | | `CURSOR_DUMP_FILE` | _(មិនបានកំណត់)_ | `open-sse/executors/cursor.ts` | ផ្លូវឯកសារជាជម្រើស ដែលទទួលកំណាត់ Cursor ដែលបានឌិកូដឆៅ នៅពេល `CURSOR_DEBUG=1`។ | | `CURSOR_STREAM_TIMEOUT_MS` | `300000` | `open-sse/executors/cursor.ts` | រយៈពេលអស់កំណត់ពេលស្ទ្រីមនៅទំនេរ (ms) សម្រាប់ Cursor executor។ | | `CURSOR_KV_GRACE_MS` | `2000` | `open-sse/executors/cursor.ts` | ចន្លោះពេលអនុគ្រោះ (ms) បន្ទាប់ពី soft terminator `kv_after_text` របស់ composer នៅពេលនៅមានបៃផ្ទុកក្នុងអង្គចងចាំបណ្ដោះអាសន្ន — ផ្តល់ពេលឱ្យការហៅឧបករណ៍ `exec_mcp` ដែលនៅខាងចុង បំពេញ frame របស់វា។ | | `CURSOR_TOOL_DIRECTIVE` | បានបើក (`!== "0"`) | `open-sse/executors/cursor.ts` | សេចក្តីបង្គាប់ tool-commit ដែលធ្វើឱ្យ composer-2.5 ចេញការហៅឧបករណ៍បានដោយទុកចិត្ត។ កំណត់ជា `0` ដើម្បីបិទ។ | | `OMNIROUTE_SYSTEM_INSTRUCTION_APPEND` | _(មិនបានកំណត់)_ | `open-sse/translator/request/claude-to-openai.ts`, `open-sse/translator/response/openai-to-claude.ts` | អត្ថបទ system prompt ដែលកំណត់ដោយប្រតិបត្តិករ និងត្រូវបានបន្ថែមទៅសារ system បន្ទាប់ពីការបកប្រែ (ការបញ្ចូលក្រោយការបកប្រែ) ដោយទៅដល់ផ្លូវ codex/Responses និង `/v1/messages`។ វាក៏ត្រូវបានប្រើជាបុព្វបទសេចក្តីបង្គាប់ ដែលត្រូវដកចេញពីប្លុកបុព្វកថា system ដែលបានបន្ទរត្រឡប់មកវិញផងដែរ។ ទុកមិនកំណត់ដើម្បីបិទ។ | | `OMNIROUTE_STRIP_SYSTEM_PREAMBLE` | `0` (បិទ) | `open-sse/translator/response/openai-to-claude.ts`, `open-sse/utils/directivePreambleStripper.ts` | កំណត់ជា `1` ដើម្បីដកប្លុកបុព្វកថា system-prompt ដែលបានបន្ទរត្រឡប់មកវិញ ចេញពីផ្នែកដើមនៃស្ទ្រីម openai→claude។ តាមលំនាំដើម វាត្រូវបានបិទ — វិធីសាស្ត្រសន្និដ្ឋានត្រូវបានរៀបចំតាមទម្រង់អត្ថបទរាយជាភាសាអង់គ្លេស និងកែប្រែ payload នៃចម្លើយ ដូច្នេះចម្លើយដែលចាប់ផ្តើមដោយស្របច្បាប់ជាមួយផ្នែកបែបនេះ នឹងបាត់បង់ផ្នែកនោះ។ | | `CURSOR_IMAGE_FETCH_TIMEOUT_MS` | `15000` | `open-sse/utils/cursorImages.ts` | រយៈពេលអស់កំណត់សម្រាប់ការទាញយករូបភាពនីមួយៗ (ms) សម្រាប់ធាតុបញ្ចូល vision `image_url` ពីចម្ងាយ។ | | `CURSOR_STATE_DB_PATH` | _(បានស្ទង់រក)_ | `open-sse/utils/cursorVersionDetector.ts` | ជំនួសការស្វែងរកមូលដ្ឋានទិន្នន័យ state របស់ Cursor IDE ដែលប្រើសម្រាប់រកឃើញកំណែ IDE។ | | `CURSOR_AGENT_CLI_VERSION` | _(រកឃើញ / ចាក់សោ)_ | `open-sse/utils/cursorAgentCliVersion.ts` | លេខសម្គាល់ build របស់ Agent CLI (`YYYY.MM.DD-`) សម្រាប់ `x-cursor-client-version: cli-…` នៅលើ Agent Run។ | | `CURSOR_AGENT_BIN` | _(មិនបានកំណត់)_ | `open-sse/handlers/imageGeneration/providers/cursorAgentImage.ts` | ផ្លូវទៅកាន់ binary របស់ Cursor Agent ដែលប្រើសម្រាប់បង្កើតរូបភាព។ នៅពេលមិនបានកំណត់ handler នឹងប្រើ `providerSpecificData.agentBin` បន្ទាប់មក PATH។ | | `CURSOR_IMG_TIMEOUT_MS` | `210000` | `open-sse/handlers/imageGeneration/providers/cursorAgentImage.ts` | រយៈពេលជាក់ស្តែងអតិបរមាសម្រាប់រូបភាពនីមួយៗ (ms) សម្រាប់ការងាររូបភាពរបស់ Cursor Agent។ | | `CURSOR_IMG_MAX_CONCURRENT` | `2` | `open-sse/handlers/imageGeneration/providers/cursorAgentImage.ts` | ច្រកកំណត់ចំនួនការងារដំណាលគ្នាលើ seat រួម សម្រាប់ការងាររូបភាពរបស់ Cursor។ | | `CURSOR_IMG_MODEL` | សំណើ / `auto` | `open-sse/handlers/imageGeneration/providers/cursorAgentImage.ts` | ជំនួស `--model` របស់ Cursor CLI សម្រាប់ការងាររូបភាព។ | | `UC_IMAGE_POLL_INTERVAL_MS` | `2000` | `open-sse/handlers/imageGeneration/providers/ucImage.ts` | ចន្លោះពេលពិនិត្យលទ្ធផលជាបន្តបន្ទាប់ (ms) សម្រាប់ការបង្កើតរូបភាពរបស់ UC (uncensored.com)។ | | `UC_IMAGE_POLL_TIMEOUT_MS` | `60000` | `open-sse/handlers/imageGeneration/providers/ucImage.ts` | រយៈពេលជាក់ស្តែងអតិបរមាសម្រាប់ការពិនិត្យលទ្ធផលជាបន្តបន្ទាប់ (ms) នៃការបង្កើតរូបភាពរបស់ UC។ | | `UC_VIDEO_POLL_INTERVAL_MS` | `3000` | `open-sse/handlers/videoGeneration/providers/ucVideo.ts` | ចន្លោះពេលពិនិត្យលទ្ធផលជាបន្តបន្ទាប់ (ms) សម្រាប់ការបង្កើតវីដេអូរបស់ UC (uncensored.com)។ | | `UC_VIDEO_POLL_TIMEOUT_MS` | `300000` | `open-sse/handlers/videoGeneration/providers/ucVideo.ts` | រយៈពេលជាក់ស្តែងអតិបរមាសម្រាប់ការពិនិត្យលទ្ធផលជាបន្តបន្ទាប់ (ms) នៃការបង្កើតវីដេអូរបស់ UC។ | | `CURSOR_DATA_DIR` | _(បានស្ទង់រក)_ | `open-sse/utils/cursorAgentCliVersion.ts` | ជំនួសថតទិន្នន័យរបស់ Cursor Agent CLI (`…/versions/`); ជាអថេរដូចគ្នាដែល agent ផ្លូវការប្រើ។ | | `CURSOR_TOKEN` | _(មិនបានកំណត់)_ | `scripts/ad-hoc/cursor-tap.cjs` | bearer token របស់ Cursor ដោយផ្ទាល់ ដែលប្រើដោយឧបករណ៍សម្រាប់អ្នកអភិវឌ្ឍន៍។ | | `OMNIROUTE_LOG_REQUEST_SHAPE` | បានបិទ (ជ្រើសរើសបើកតាមរយៈ `"1"`) | `src/app/api/v1/chat/completions/route.ts` | កត់ត្រាសញ្ញាសម្គាល់ content-type/length សម្រាប់ payload ការជជែកទំហំធំ នៅពេលកំណត់ `"1"`។ តាមលំនាំដើម វាត្រូវបានបិទ ដើម្បីកាត់បន្ថយភាពរំខានក្នុងកំណត់ហេតុ។ | | `DEBUG_RESPONSES_SSE_TO_JSON` | _(មិនបានកំណត់)_ | `open-sse/handlers/responseTranslator.ts` | កំណត់ជា `true` ដើម្បីកត់ត្រាព័ត៌មានលម្អិតនៃការបកប្រែ Responses API SSE→JSON។ | | `DEBUG_CLAUDE_NONSTREAM` | _(មិនបានកំណត់)_ | `open-sse/handlers/responseTranslator.ts` | កំណត់ជា `true` ដើម្បីបង្ហាញកំណាត់ textContent ទទេនៅក្នុងផ្លូវបកប្រែចម្លើយរបស់ Claude (សម្រាប់បំបាត់កំហុសតែប៉ុណ្ណោះ)។ | | `NEXT_PUBLIC_OMNIROUTE_E2E_MODE` | _(មិនបានកំណត់)_ | ឧបករណ៍ដំណើរការតេស្ត E2E | កំណត់ជា `true` ដើម្បីបើករបៀបតេស្ត E2E (ការផ្ទៀងផ្ទាត់អត្តសញ្ញាណដែលបានបន្ធូរបន្ថយ និង test hooks)។ | --- ## 23. ការរួមបញ្ចូល GitHub អនុញ្ញាតឱ្យអ្នកប្រើប្រាស់រាយការណ៍បញ្ហាដោយផ្ទាល់ពីផ្ទាំងគ្រប់គ្រង។ | អថេរ | លំនាំដើម | ឯកសារប្រភព | ការពិពណ៌នា | | --------------------- | --------------- | ------------------------------------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `GITHUB_ISSUES_REPO` | _(មិនបានកំណត់)_ | `src/app/api/v1/issues/report/route.ts` | Repository ក្នុងទម្រង់ `owner/repo`។ | | `GITHUB_ISSUES_TOKEN` | _(មិនបានកំណត់)_ | `src/app/api/v1/issues/report/route.ts` | GitHub Personal Access Token ដែលមាន scope `issues:write`។ | | `GITHUB_TOKEN` | _(មិនបានកំណត់)_ | កម្មវិធីជំនួយសម្រាប់ការតម្រៀបបញ្ហា / cloud agent | Token ចូលប្រើ GitHub ទូទៅ ដែលប្រើជាជម្រើសបម្រុងសម្រាប់ `GITHUB_ISSUES_TOKEN` និងត្រូវបានប្រើប្រាស់ដោយកម្មវិធីជំនួយ cloud agent នៅក្នុង `src/lib/cloudAgent/*`។ | --- ## សេណារីយ៉ូនៃការដាក់ឱ្យដំណើរការ សម្រាប់ការណែនាំ SRE នៃ relay backend (ឥរិយាបថ ts/bifrost/auto ទីតាំងដាក់ 9router ធៀបនឹង CLIProxyAPI និងយុទ្ធសាស្ត្របម្រុងសម្រាប់បន្ទុកខ្ពស់) សូមមើល [យុទ្ធសាស្ត្រ Relay Backend](/docs/reference/RELAY_BACKEND_STRATEGY.md)។ ### ការអភិវឌ្ឍក្នុងមូលដ្ឋានកម្រិតអប្បបរមា ```bash JWT_SECRET=$(openssl rand -base64 48) API_KEY_SECRET=$(openssl rand -hex 32) INITIAL_PASSWORD=dev123 PORT=20128 NODE_ENV=development ``` ### ផលិតកម្ម Docker ```bash JWT_SECRET=<បានបង្កើត> API_KEY_SECRET=<បានបង្កើត> INITIAL_PASSWORD=<បានបង្កើត> STORAGE_ENCRYPTION_KEY=<បានបង្កើត> DATA_DIR=/data PORT=20128 API_PORT=20129 NODE_ENV=production AUTH_COOKIE_SECURE=true REQUIRE_API_KEY=true NEXT_PUBLIC_BASE_URL=https://omniroute.example.com BASE_URL=http://localhost:20128 OMNIROUTE_MEMORY_MB=8192 CORS_ORIGIN=https://your-frontend.example.com ``` ### បរិស្ថានផ្តាច់ពីបណ្ដាញ / 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 ជាមួយប្រូកស៊ីបញ្ច្រាស (nginx + Cloudflare) ```bash JWT_SECRET=<បានបង្កើត> API_KEY_SECRET=<បានបង្កើត> STORAGE_ENCRYPTION_KEY=<បានបង្កើត> PORT=20128 AUTH_COOKIE_SECURE=true REQUIRE_API_KEY=true NEXT_PUBLIC_BASE_URL=https://omniroute.example.com BASE_URL=http://127.0.0.1:20128 CORS_ORIGIN=https://omniroute.example.com ENABLE_TLS_FINGERPRINT=true CLI_COMPAT_ALL=1 ``` --- ## 24. Skills Sandbox (v3.8.0+) ដែនកំណត់ និងការកំណត់សុវត្ថិភាពដែលត្រូវបានអនុវត្ត នៅពេលក្របខណ្ឌ Skills (`src/lib/skills/`) ប្រតិបត្តិស្វ័យប្រវត្តិកម្មដែលកំណត់ដោយអ្នកប្រើប្រាស់នៅក្នុងបរិស្ថាន sandbox។ | អថេរ | លំនាំដើម | ឯកសារប្រភព | ការពិពណ៌នា | | --------------------------------- | ------------------------------------------ | ------------------------------------------------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `SKILLS_SANDBOX_TIMEOUT_MS` | `10000` (10 វិនាទី) | `src/lib/skills/builtins.ts` | រយៈពេលផុតកំណត់តាមម៉ោងជាក់ស្ដែង សម្រាប់ការប្រតិបត្តិនីមួយៗនៃកូដ skill ក្នុង sandbox។ ជាដែនកំណត់ដាច់ខាត ហើយអ្វីដែលដំណើរការយូរជាងនេះនឹងត្រូវបានបញ្ឈប់។ | | `SKILLS_EXECUTION_TIMEOUT_MS` | _(ប្រើ `SKILLS_SANDBOX_TIMEOUT_MS` ជំនួស)_ | `src/lib/skills/` | រយៈពេលផុតកំណត់សម្រាប់ការសម្របសម្រួល skill កម្រិតខ្ពស់។ កំណត់ឱ្យខ្ពស់ជាង `SKILLS_SANDBOX_TIMEOUT_MS` ដើម្បីអនុញ្ញាតលំហូរការងារដែលមានច្រើនជំហាន។ | | `SKILLS_MAX_FILE_BYTES` | `1048576` (1 MB) | `src/lib/skills/builtins.ts` | ចំនួន byte អតិបរមាដែល skill អាចអានពីឯកសារតែមួយណាមួយនៅក្នុង sandbox។ | | `SKILLS_MAX_HTTP_RESPONSE_BYTES` | `256000` (250 KB) | `src/lib/skills/builtins.ts` | ចំនួន byte អតិបរមាដែលអាចចាប់យកពី HTTP response តែមួយណាមួយនៅក្នុង skill។ | | `SKILLS_MAX_SANDBOX_OUTPUT_CHARS` | `100000` | `src/lib/skills/builtins.ts` | ដែនកំណត់ដាច់ខាតលើចំនួនតួអក្សរ stdout/stderr ដែលត្រឡប់ពីការហៅប្រតិបត្តិ sandbox។ | | `SKILLS_SANDBOX_NETWORK_ENABLED` | `false` | `src/lib/skills/builtins.ts` | កំណត់ជា `1`/`true` ដើម្បីអនុញ្ញាតបណ្ដាញចេញពីក្នុង sandbox។ តាមលំនាំដើម វាត្រូវបាន **ដាក់ឱ្យដាច់ដោយឡែក** ដើម្បីសុវត្ថិភាព។ | | `SKILLS_ALLOWED_SANDBOX_IMAGES` | _(ទទេ)_ | `src/lib/skills/builtins.ts` | បញ្ជីអនុញ្ញាតនៃ container image ដែលបំបែកដោយសញ្ញាក្បៀស និងត្រូវបានអនុញ្ញាតសម្រាប់ការប្រតិបត្តិក្នុង sandbox។ ទទេមានន័យថា ប្រើតែលំនាំដើមដែលភ្ជាប់មកស្រាប់ប៉ុណ្ណោះ។ | | `SKILLS_SANDBOX_DOCKER_IMAGE` | _(លំនាំដើមដែលភ្ជាប់មកស្រាប់)_ | `src/lib/skills/` | Container image ដែលប្រើនៅពេលបង្កើត sandbox ដែលដំណើរការដោយ Docker។ កំណត់ជំនួសដើម្បីភ្ជាប់ទៅ base image ផ្ទាល់ខ្លួនដែលបានពង្រឹងសុវត្ថិភាព។ | | `SKILLS_SANDBOX_RUNTIME` | `auto` | `src/lib/skills/sandbox.ts`, `src/lib/skills/containerProvider.ts` | Container runtime សម្រាប់ដំណើរការ skill ក្នុង sandbox៖ `auto` \| `docker` \| `apple` \| `wsl` \| `orbstack` \| `podman`។ `auto` ជ្រើសរើស runtime ដែលបានដំឡើងល្អបំផុតសម្រាប់ OS របស់ host នីមួយៗ (Apple Container/OrbStack លើ macOS, WSL Container លើ Windows និង Podman លើ Linux) ហើយប្រើ Docker ជាជម្រើសបម្រុង។ | > [!CAUTION] > ការបើក `SKILLS_SANDBOX_NETWORK_ENABLED=true` បង្កើតផ្លូវចេញពីកូដ skill ណាមួយ។ សម្រាប់ការដាក់ឱ្យដំណើរការរួម សូមប្រើវាជាមួយ `OUTBOUND_SSRF_GUARD_ENABLED=true` និងគោលការណ៍ `CORS_ORIGIN`/proxy ដ៏តឹងរ៉ឹង។ --- ## 25. កូតាអ្នកផ្តល់សេវា ផ្លូវរូង បម្រុងទុក និង Runtime ផ្សេងៗ Endpoint កូតារបស់អ្នកផ្តល់សេវា ផ្លូវរូងបណ្តាញ (Tailscale, Ngrok, ប្រូកស៊ីបំបាត់កំហុស MITM) ក្រុមបណ្តាញចេញ 1Proxy ការបម្រុងទុកមូលដ្ឋានទិន្នន័យ និងការកំណត់ជំនួសតូចៗតាមមុខងារ ដែលត្រូវបានយោងដោយស្រទាប់ executor ឬស្គ្រីប។ | អថេរ | លំនាំដើម | ឯកសារប្រភព | សេចក្ដីពិពណ៌នា | | ---------------------------------------------- | --------------------------------------------------------------------------- | ------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `REDIS_URL` | `redis://localhost:6379` | `src/shared/utils/rateLimiter.ts` | ខ្សែអក្សរតភ្ជាប់ Redis សម្រាប់ backend របស់កម្មវិធីកំណត់អត្រា។ | | `ALIBABA_CODING_PLAN_HOST` | _(host សម្រាប់ production)_ | `open-sse/services/bailianQuotaFetcher.ts` | កំណត់ជំនួស host ដែលប្រើដើម្បីទៅប្រមូលកូតានៃ coding-plan របស់ Alibaba Bailian។ | | `ALIBABA_CODING_PLAN_QUOTA_URL` | បានកំណត់ពី host | `open-sse/services/bailianQuotaFetcher.ts` | កំណត់ជំនួស URL កូតាពេញលេញសម្រាប់ Alibaba Bailian។ | | `QWEN_CLOUD_COOKIE` | _(មិនបានកំណត់)_ | `open-sse/services/qwenTokenPlanQuotaFetcher.ts` | Cookie សម័យរបស់ console សម្រាប់ gateway កូតា Token Plan ផ្ទាល់ខ្លួនរបស់ Qwen Cloud / Model Studio (API key សម្រាប់ inference មិនអាចអានវាបានទេ)។ ចម្លង header សំណើ `Cookie` ទាំងមូល — វាមាន `login_qwencloud_ticket` — ពីការហៅ `api.json` ណាមួយទៅកាន់ `cs-data.qwencloud.com` នៅលើ home.qwencloud.com › Billing › Subscription (F12 › Network)។ វាជាទិន្នន័យរសើប និងមានវិសាលភាពត្រឹមសម័យ; គួរប្រើវាល Dashboard `qwenCloudCookie` សម្រាប់ការតភ្ជាប់នីមួយៗ។ | | `QWEN_CLOUD_SEC_TOKEN` | _(មិនបានកំណត់)_ | `open-sse/services/qwenTokenPlanQuotaFetcher.ts` | ការកំណត់ជំនួស `sec_token` ដោយដៃសម្រាប់ gateway របស់ console Token Plan។ វាជាទិន្នន័យរសើប; នៅពេលមិនបានកំណត់ កម្មវិធីប្រមូលនឹងដោះស្រាយវាពី HTML របស់ dashboard ដោយប្រើ cookie។ | | `QWEN_TOKEN_PLAN_HOST` | `https://cs-data.qwencloud.com` | `open-sse/services/qwenTokenPlanQuotaFetcher.ts` | ការកំណត់ជំនួស host របស់ gateway សម្រាប់កម្មវិធីប្រមូលកូតា Token Plan ផ្ទាល់ខ្លួន (ឧ. `bailian-singapore-cs.alibabacloud.com` សម្រាប់ console របស់ Model Studio)។ | | `QWEN_TOKEN_PLAN_DASHBOARD_URL` | `https://home.qwencloud.com/` | `open-sse/services/qwenTokenPlanQuotaFetcher.ts` | URL របស់ dashboard ដែលប្រើដើម្បីដោះស្រាយ `sec_token` ពី HTML ដែលបានចូលប្រើដោយគណនី។ | | `XIAOMI_MIMO_CONSOLE_COOKIE` | _(មិនបានកំណត់)_ | `open-sse/services/usage/xiaomi-mimo.ts` | Cookie សម័យរបស់ console សម្រាប់ API កូតា Xiaomi MiMo Token Plan (`platform.xiaomimimo.com/api/v1/tokenPlan/usage` + `tokenPlan/detail` — API key សម្រាប់ inference មិនអាចអានវាបានទេ)។ ចម្លង header សំណើ `Cookie` ទាំងមូល — វាមាន `api-platform_serviceToken` និង `userId` — ពីសំណើណាមួយទៅកាន់ `platform.xiaomimimo.com` នៅលើទំព័រ Token Plan (F12 › Network)។ វាជាទិន្នន័យរសើប និងមានវិសាលភាពត្រឹមសម័យ; គួរប្រើវាល Dashboard `xiaomiMimoConsoleCookie` សម្រាប់ការតភ្ជាប់នីមួយៗ។ | | `XIAOMI_MIMO_MONTHLY_TOKEN_LIMIT` | `4100000000` | `open-sse/services/usage/xiaomi-mimo.ts` | ថវិកាប្រចាំខែ (Credits) សម្រាប់ Xiaomi MiMo fallback ដែលតាមដានដោយ OmniRoute និងត្រូវបានប្រើនៅពេលមិនមានការកំណត់ console cookie។ តម្លៃលំនាំដើមគឺ 4.1B របស់កម្រិត Lite; កំណត់វាទៅជា Credits របស់គម្រោង (Standard 11B / Pro 38B / Max 82B)។ ការកំណត់ជំនួស `providerSpecificData.monthlyTokenLimit` សម្រាប់ការតភ្ជាប់នីមួយៗ មានអាទិភាពលើ env var នេះ។ | | `ALIBABA_FREE_TIER_VISION_FE_PATH` | `/costing-balance/free-quota-image-video` | `open-sse/services/alibabaFreeTierQuotaFetcher.ts` | ការកំណត់ជំនួសផ្លូវ front-end របស់ console សម្រាប់ទាញយកកូតា vision/media នៃកម្រិតឥតគិតថ្លៃរបស់ Alibaba Model Studio។ | | `ALIBABA_FREE_TIER_MULTIMODAL_FE_PATH` | `/costing-balance/free-quota-multimodal` | `open-sse/services/alibabaFreeTierQuotaFetcher.ts` | ការកំណត់ជំនួសផ្លូវ front-end របស់ console សម្រាប់ទាញយកកូតា multimodal នៃកម្រិតឥតគិតថ្លៃរបស់ Alibaba Model Studio។ | | `ALIBABA_FREE_TIER_AUDIO_FE_PATH` | `/costing-balance/free-quota-audio` | `open-sse/services/alibabaFreeTierQuotaFetcher.ts` | ការកំណត់ជំនួសផ្លូវ front-end របស់ console សម្រាប់ទាញយកកូតា audio នៃកម្រិតឥតគិតថ្លៃរបស់ Alibaba Model Studio។ | | `ALIBABA_FREE_TIER_ALLOWLIST_PATH` | _(មិនបានកំណត់)_ | `open-sse/services/alibabaFreeTierAllowlist.ts` | ផ្លូវជាជម្រើសទៅកាន់ឯកសារ JSON មូលដ្ឋាន សម្រាប់កំណត់ជំនួសបញ្ជីអនុញ្ញាត text-model កម្រិតឥតគិតថ្លៃដែលភ្ជាប់មកជាស្រេចរបស់ Alibaba។ ប្រសិនបើមិនមាន វានឹងប្រើ `$DATA_DIR/alibaba-free-tier-allowlist.json` បន្ទាប់មក `config/alibaba-free-tier-allowlist.json`។ | | `CONTEXT_RESERVE_TOKENS` | `1024` | `open-sse/services/contextManager.ts` | Tokens ដែលបានបម្រុងទុកសម្រាប់លទ្ធផល completion នៅពេលគណនាថវិកា prompt។ | | `CONTEXT_KEEP_LATEST_IMAGES` | `2` | `open-sse/services/contextManager.ts` | ចំនួនរូបភាព inline ថ្មីបំផុតដែលត្រូវរក្សាទុក នៅពេលកាត់ចេញរូបភាពចាស់ៗដើម្បីឱ្យសមនឹង context window (#8560)។ | | `MODEL_ALIAS_COMPAT_ENABLED` | បានបើក | `open-sse/services/model.ts` | បិទបើកស្រទាប់ភាពត្រូវគ្នាជាមួយ model-alias ចាស់ ដែលត្រូវបានប្រើដោយ clients ជំនាន់ចាស់។ | | `OMNIROUTE_EMERGENCY_FALLBACK` | បានបើក | `open-sse/services/emergencyFallback.ts` | កំណត់ជា `false` (ឬ `0`) ដើម្បីបិទ emergency budget-exhaustion fallback ដែលបញ្ជូន requests ដែលបរាជ័យឡើងវិញទៅកាន់ model ឥតគិតថ្លៃ `nvidia`/`openai/gpt-oss-120b`។ លំដាប់អាទិភាពដែលមានប្រសិទ្ធភាពគឺ ការកំណត់ជំនួសក្នុង Feature Flags DB > env var > លំនាំដើម; ប្រសិនបើមិនអាចប្រើបាន service នឹងត្រឡប់ទៅប្រើតម្លៃ env ដើមវិញ។ | | `COMMAND_CODE_CALLBACK_PORT` | _(មិនបានកំណត់)_ | `src/app/api/providers/command-code/auth/shared.ts` | Port មូលដ្ឋានដែលប្រើសម្រាប់ callbacks បែប OAuth ពីកម្មវិធីជំនួយ Command Code CLI។ | | `COMMAND_CODE_VERSION` | `0.33.2` | `open-sse/executors/commandCode.ts` | តម្លៃដែលត្រូវបានផ្ញើជា header `x-command-code-version` ទៅកាន់ upstream របស់ Command Code។ កំណត់ជាន់លើ ដើម្បីដំឡើងកំណែ CLI។ | | `COMMANDCODE_API_URL` | `https://api.commandcode.ai` | `open-sse/services/usage/command-code.ts` | URL មូលដ្ឋានសម្រាប់ upstream នៃការប្រើប្រាស់/កូតារបស់ Command Code ដែលប្រើដោយ telemetry ទាញយកកូតារបស់ស្មាតហ្វូន។ កំណត់ជាន់លើសម្រាប់ Command Code API ដែលបង្ហោះដោយខ្លួនឯង/ជំនួស។ | | `MITM_LOCAL_PORT` | `443` | `src/mitm/server.cjs` | ច្រក bind មូលដ្ឋានសម្រាប់ប្រូកស៊ីបំបាត់កំហុស MITM។ | | `MITM_DISABLE_TLS_VERIFY` | `0` | `src/mitm/server.cjs` | កំណត់ជា `1` ដើម្បីបិទការផ្ទៀងផ្ទាត់ TLS របស់ upstream (សម្រាប់តែការអភិវឌ្ឍប៉ុណ្ណោះ)។ | | `MITM_IDLE_TIMEOUT_MS` | `60000` | `src/mitm/socketTimeouts.ts`, `src/mitm/server.cjs` | រយៈពេលអស់កំណត់របស់ socket ដែលនៅទំនេរ (ms) សម្រាប់ការតភ្ជាប់ដែលត្រូវបានប្រូកស៊ី; socket ដែលនៅទំនេរលើសពីរយៈពេលនេះនឹងត្រូវបានផ្តាច់ ដើម្បីជៀសវាងការលេចធ្លាយ tunnel ដែលបើកពាក់កណ្តាល។ | | `BRIDGE_PORT` | `20129` | `bin/antigravity-bridge.mjs` | ច្រកដែល bridge MITM របស់ Antigravity ស្តាប់។ | | `ROUTER_URL` | `http://127.0.0.1:20128/v1/antigravity` | `bin/antigravity-bridge.mjs` | endpoint របស់ router ដែល bridge បញ្ជូនបន្តចរាចរណ៍ Antigravity ទៅកាន់។ | | `CERT_DIR` | `/mitm` | `bin/antigravity-bridge.mjs` | កំណត់ជាន់លើថតដែល bridge អានសម្ភារៈ TLS របស់វា។ ម៉ូដែលវិញ្ញាបនបត្រត្រូវបានជ្រើសរើសដូចគ្នានឹងម៉ាស៊ីនមេ AgentBridge៖ `server.crt`/`server.key` សម្រាប់ការដំឡើង leaf បែបចាស់ បើមិនដូច្នោះទេ `ca.crt`/`ca.key` (root CA និង leaf មួយសម្រាប់ host នីមួយៗដែលត្រូវបានស្ទាក់ចាប់; ត្រូវបានបង្ខំដោយ `MITM_ROOT_CA_ENABLED=true`)។ bridge នឹងបិទនៅពេលចាប់ផ្តើម ប្រសិនបើបាត់ឯកសារសម្រាប់ម៉ូដែលដែលកំពុងប្រើ។ | | `MITM_VERBOSE` | `1` | `src/mitm/server.cjs`, `src/mitm/_internal/bypass.cjs` | កម្រិតលម្អិតនៃ log សេចក្តីសម្រេចចិត្តផ្លូវបញ្ជូន៖ `0` បិទសំឡេង log ខណៈតម្លៃខ្ពស់ជាងនេះកត់ត្រាសេចក្តីសម្រេចចិត្ត bypass/route កាន់តែច្រើន។ | | `MITM_ROOT_CA_ENABLED` | `false` | `src/mitm/manager.ts` | កំណត់ជា `true` ដើម្បីជ្រើសរើសប្រើម៉ូដែលវិញ្ញាបនបត្រ root-CA + leaf តាម host នីមួយៗ (#6684)។ ការដំឡើងថ្មីទទួលបានវាដោយស្វ័យប្រវត្តិ; ការដំឡើងដែលមាន leaf បែបចាស់ដែលបានទុកចិត្តរួចហើយ នឹងរក្សាវិញ្ញាបនបត្រ fixed-SAN បែបចាស់ លុះត្រាតែបានជ្រើសរើសប្រើម៉ូដែលថ្មី។ | | `MITM_CERT_MODE` | `legacy` | `src/mitm/manager.ts`, `src/mitm/server.cjs` | ត្រូវបានកំណត់ដោយកម្មវិធីគ្រប់គ្រង MITM សម្រាប់ដំណើរការប្រូកស៊ីដែលបានបង្កើត (`root-ca` \| `legacy`) — ឆ្លុះបញ្ចាំងពីសេចក្តីសម្រេចចិត្តផ្លាស់ប្តូរវិញ្ញាបនបត្រ; មិនមានបំណងឱ្យកំណត់ដោយដៃទេ។ | | `OMNIROUTE_NO_SUDO` | `0` | `src/mitm/systemCommands.ts` | កំណត់ជា `1` (truthy) ដើម្បីដក `sudo` ដែលនៅខាងមុខចេញពីពាក្យបញ្ជាទុកចិត្តវិញ្ញាបនបត្រ MITM — សម្រាប់ការដាក់ឱ្យដំណើរការដោយគ្មាន root / ប្រើ user namespace ដែលប្រតិបត្តិករទុកចិត្ត CA ដោយដៃ (ឧ. តាមរយៈយន្តការ extra-CA-certs របស់ Node)។ | | `SKIP_ANTIGRAVITY_DNS` | _(មិនបានកំណត់)_ | `src/mitm/dns/provision.ts` | កំណត់ជា `true` ដើម្បីរំលងទាំងស្រុងនូវការរៀបចំធាតុ DNS ក្នុង `/etc/hosts` សម្រាប់ hostname របស់ប្រូកស៊ី Antigravity — សម្រាប់ container ដែលមិនមាន sudo/root។ | | `OMNIROUTE_SKIP_DNS_WRITE` | _(មិនបានកំណត់)_ | `src/mitm/dns/dnsConfig.ts` | កំណត់ជា `1` ដើម្បីរំលងការសរសេរទៅកាន់ឯកសារ hosts នៅពេលបន្ថែម/លុបធាតុ DNS — សម្រាប់បរិស្ថានសាកល្បងដែលស្ថិតក្នុង sandbox ឬបានតែអាន។ | | `OMNIROUTE_SKIP_SYSTEM_TRUST` | `0` | `src/mitm/cert/install.ts`, `src/mitm/tproxy/caTrust.ts` | របាំងការពារសម្រាប់តែការធ្វើតេស្ត/CI៖ កំណត់ជា `1` ដើម្បីធ្វើឱ្យការដំឡើង/លុបការទុកចិត្តវិញ្ញាបនបត្រមិនអនុវត្តអ្វីទាំងអស់ ដូច្នេះសំណុំតេស្តមិនកែប្រែឃ្លាំងទុកចិត្តរបស់ OS ឡើយ។ វាត្រូវបានកំណត់ដោយស្វ័យប្រវត្តិដោយការរៀបចំតេស្ត និងលំហូរការងារ CI។ | | `CHANGELOG_BASE_REF` | _(ស្វ័យប្រវត្តិ)_ | `scripts/check/check-changelog-integrity.mjs` | base ref ជាក់លាក់សម្រាប់ anti CHANGELOG-eat gate (លំនាំដើមគឺ branch មូលដ្ឋានរបស់ PR ក្នុង CI ឬ `release/v*` ដែលខ្ពស់បំផុត)។ | | `FREE_PROXY_AUTO_SYNC_ENABLED` | `false` | `src/lib/freeProxyProviders/scheduler.ts` | កំណត់ជា `true` ដើម្បីបើក scheduler ធ្វើសមកាលកម្មដោយស្វ័យប្រវត្តិនៃបណ្តុំប្រូកស៊ីឥតគិតថ្លៃនៅផ្ទៃខាងក្រោយ។ ត្រូវជ្រើសរើសបើក ហើយតាមលំនាំដើមគឺបិទ។ | | `FREE_PROXY_AUTO_SYNC_INTERVAL_MS` | `1800000` | `src/lib/freeProxyProviders/scheduler.ts` | ចន្លោះពេលធ្វើសមកាលកម្មដោយស្វ័យប្រវត្តិគិតជាមិល្លីវិនាទី (លំនាំដើម 30 នាទី)។ | | `FREE_PROXY_1PROXY_ENABLED` | `true` | `src/lib/freeProxyProviders/oneproxy.ts` | បើកប្រភពប្រូកស៊ីឥតគិតថ្លៃ 1proxy។ កំណត់ជា `false` ដើម្បីបិទ។ | | `FREE_PROXY_1PROXY_API_URL` | _(មើល oneproxy.ts)_ | `src/lib/freeProxyProviders/oneproxy.ts` | កំណត់ URL របស់ API 1proxy ជំនួសតម្លៃលំនាំដើម។ | | `FREE_PROXY_1PROXY_MAX` | `500` | `src/lib/freeProxyProviders/oneproxy.ts` | ចំនួនប្រូកស៊ីអតិបរមាដែលត្រូវទាញយកក្នុងការធ្វើសមកាលកម្មនីមួយៗពី 1proxy។ | | `FREE_PROXY_1PROXY_MIN_QUALITY` | `50` | `src/lib/freeProxyProviders/oneproxy.ts` | កម្រិតពិន្ទុគុណភាពអប្បបរមាសម្រាប់ការនាំចូលពី 1proxy។ | | `FREE_PROXY_PROXIFLY_ENABLED` | `true` | `src/lib/freeProxyProviders/proxifly.ts` | បើកប្រភពប្រូកស៊ីឥតគិតថ្លៃ Proxifly។ កំណត់ជា `false` ដើម្បីបិទ។ | | `FREE_PROXY_PROXIFLY_QUANTITY` | `100` | `src/lib/freeProxyProviders/proxifly.ts` | ចំនួនប្រូកស៊ីដែលត្រូវទាញយកក្នុងការធ្វើសមកាលកម្ម Proxifly ម្តងៗ។ | | `FREE_PROXY_PROXIFLY_ANONYMITY` | `elite` | `src/lib/freeProxyProviders/proxifly.ts` | តម្រងកម្រិតអនាមិកភាពសម្រាប់ Proxifly (`elite`, `anonymous`, `transparent`)។ | | `FREE_PROXY_IPLOCATE_ENABLED` | `false` | `src/lib/freeProxyProviders/iplocate.ts` | បើកប្រភពប្រូកស៊ីឥតគិតថ្លៃ IPLocate។ អាចប្រើបានតែនៅពេលជ្រើសរើសបើកប៉ុណ្ណោះ។ | | `FREE_PROXY_IPLOCATE_BASE_URL` | `https://raw.githubusercontent.com/iplocate/free-proxy-list/main/protocols` | `src/lib/freeProxyProviders/iplocate.ts` | កំណត់ URL មូលដ្ឋាននៃបញ្ជីប្រូកស៊ី IPLocate ជំនួសតម្លៃលំនាំដើម។ | | `FREE_PROXY_WEBSHARE_ENABLED` | `true` | `src/lib/freeProxyProviders/webshare.ts` | បើកប្រភពក្រុមប្រូកស៊ី Webshare។ កំណត់ជា `false` ដើម្បីបិទ; ហើយក៏តម្រូវឱ្យកំណត់ `FREE_PROXY_WEBSHARE_API_KEY` ផងដែរ។ | | `FREE_PROXY_WEBSHARE_API_KEY` | _(គ្មាន)_ | `src/lib/freeProxyProviders/webshare.ts` | តូខឹន API របស់គណនី Webshare (`Authorization: Token `)។ ចាំបាច់ត្រូវមាន — អ្នកផ្តល់សេវានឹងនៅតែបិទ ប្រសិនបើគ្មានវា។ | | `FREE_PROXY_WEBSHARE_API_URL` | `https://proxy.webshare.io/api/v2/proxy/list/` | `src/lib/freeProxyProviders/webshare.ts` | កំណត់ URL នៃ API បញ្ជីប្រូកស៊ី Webshare ជំនួសតម្លៃលំនាំដើម។ | | `FREE_PROXY_WEBSHARE_MAX` | `500` | `src/lib/freeProxyProviders/webshare.ts` | ចំនួនប្រូកស៊ីអតិបរមាដែលត្រូវនាំចូលក្នុងការធ្វើសមកាលកម្ម Webshare ម្តងៗ។ | | `NEXT_PUBLIC_VERCEL_RELAY_ENABLED` | `true` | `src/app/(dashboard)/…/ProxyPoolTab.tsx` | បង្ហាញ/លាក់ប៊ូតុង Deploy Vercel Relay នៅក្នុងផ្ទាំង Proxy Pool។ | | `VERCEL_API_BASE` | `https://api.vercel.com` | `src/app/api/settings/proxy/vercel-deploy/route.ts` | កំណត់ជំនួស URL មូលដ្ឋានរបស់ Vercel API (សម្រាប់ការធ្វើតេស្ត)។ | | `NEXT_PUBLIC_VERCEL_RELAY_DEFAULT_PROJECT` | `omniroute-relay` | `src/app/(dashboard)/…/VercelRelayModal.tsx` | ឈ្មោះគម្រោងលំនាំដើមដែលបានបំពេញជាមុននៅក្នុងម៉ូឌុលដាក់ឱ្យដំណើរការ Vercel Relay។ | | `TAILSCALE_BIN` | _(រកឃើញដោយស្វ័យប្រវត្តិ)_ | `src/lib/tailscaleTunnel.ts` | ផ្លូវជាក់លាក់ទៅកាន់ឯកសារប្រតិបត្តិ `tailscale`។ | | `TAILSCALED_BIN` | _(រកឃើញដោយស្វ័យប្រវត្តិ)_ | `src/lib/tailscaleTunnel.ts` | ផ្លូវជាក់លាក់ទៅកាន់ឯកសារប្រតិបត្តិ daemon `tailscaled`។ | | `TAILSCALE_AUTHKEY` | _(មិនបានកំណត់)_ | `src/lib/tailscaleTunnel.ts` | សោផ្ទៀងផ្ទាត់ Tailscale ដែលបានចែករំលែកជាមុន សម្រាប់ `tailscale up` ដែលមិនត្រូវការអន្តរកម្ម / គ្មានអ៊ីនធឺហ្វេស (បញ្ជូនតាម `--auth-key=`)។ នៅពេលមិនបានកំណត់ ការចូលប្រើនឹងត្រឡប់ទៅប្រើ URL ផ្ទៀងផ្ទាត់តាមកម្មវិធីរុករកដែលមានអន្តរកម្មវិញ។ | | `NGROK_AUTHTOKEN` | _(មិនបានកំណត់)_ | `src/lib/ngrokTunnel.ts` | ផ្ទៀងផ្ទាត់ភាពត្រឹមត្រូវរបស់ធ្យូនែល ngrok ចេញក្រៅ។ | | `DB_BACKUP_MAX_FILES` | `20` | `src/lib/db/backup.ts` | ចំនួនអតិបរមានៃឯកសារបម្រុងទុក SQLite ដែលត្រូវរក្សាទុកដោយការសម្អាតការបម្រុងទុកដោយដៃ/តាមកាលវិភាគ។ ស្នាដៃថតចម្លងនៃការផ្លាស់ប្ដូរទិន្នន័យត្រូវបានកំណត់អាសយដ្ឋានតាមខ្លឹមសារ និងប្រើឡើងវិញសម្រាប់ស្ថានភាព DB ដូចគ្នា។ ឯកសារទាំងនោះមិនត្រូវបានកាត់ចេញក្នុងអំឡុងពេលផ្លាស់ប្ដូរទិន្នន័យស្របពេលគ្នាទេ។ កំណត់ជំនួសតម្លៃដែលបានរក្សាទុកពី ការកំណត់ → ការរក្សាទុកឯកសារបម្រុងទុកមូលដ្ឋានទិន្នន័យ។ | | `DB_BACKUP_RETENTION_DAYS` | `0` | `src/lib/db/backup.ts` | អាយុកាលអតិបរមា (គិតជាថ្ងៃ) ដែលត្រូវរក្សាទុកដោយការសម្អាតការបម្រុងទុកដោយដៃ/តាមកាលវិភាគ។ `0` បិទការកាត់ចេញផ្អែកលើអាយុកាល។ ស្នាដៃថតចម្លងនៃការផ្លាស់ប្ដូរទិន្នន័យមិនត្រូវបានកាត់ចេញក្នុងអំឡុងពេលផ្លាស់ប្ដូរទិន្នន័យស្របពេលគ្នាទេ។ កំណត់ជំនួសតម្លៃដែលបានរក្សាទុកពី ការកំណត់ → ការរក្សាទុកឯកសារបម្រុងទុកមូលដ្ឋានទិន្នន័យ។ | | `OMNIROUTE_BACKUP_SCHEDULE_JOB_INTERVAL_MS` | `30000` | `src/lib/jobs/backupScheduleJob.ts` | ចន្លោះពេលដំណើរការ (មិល្លីវិនាទី) របស់ការងារខាងម៉ាស៊ីនមេដែលប្រតិបត្តិ `backup-schedule.json`។ ត្រូវតែទាបជាងកម្រិតលម្អិត 1 នាទីរបស់ cron ឱ្យបានច្រើន។ តម្លៃក្រោម `5000` ឬដែលមិនអាចញែកបាន នឹងត្រឡប់ទៅប្រើ `30000`។ | | `CONTAINER_HOST` | `docker` | `scripts/check-permissions.sh` | ព័ត៌មានណែនាំអំពី container runtime សម្រាប់ការត្រួតពិនិត្យសិទ្ធិរបស់ entrypoint។ កំណត់ជា `podman` សម្រាប់ topology របស់ Podman ណាមួយ។ ដោយសារ container មិនអាចកំណត់បានថា engine ស្ថិតនៅមូលដ្ឋាន ឬត្រូវបានចូលប្រើតាមរយៈ Podman Machine នោះការព្រមាននៅតែមានលក្ខណៈអព្យាក្រឹតចំពោះ topology ហើយចង្អុលទៅ `contrib/podman/README.md`។ | | `QUOTA_STORE_DRIVER` | `sqlite` | `src/lib/quota/storeFactory.ts` | backend នៃកន្លែងផ្ទុកការប្រើប្រាស់ចំណែកកូតា៖ `sqlite` (លំនាំដើម) ឬ `redis`។ | | `QUOTA_STORE_REDIS_URL` | _(មិនបានកំណត់)_ | `src/lib/quota/storeFactory.ts` | ខ្សែអក្សរតភ្ជាប់ Redis ដែលប្រើនៅពេល `QUOTA_STORE_DRIVER=redis` (ឧ. `redis://localhost:6379`)។ | | `QUOTA_SATURATION_THRESHOLD` | `0.5` | `src/lib/quota/enforce.ts` | សមាមាត្រតិត្ថិភាពរបស់ pool (0..1)៖ នៅពេលស្មើ ឬលើសពីតម្លៃនេះ pool នឹងចូលទៅក្នុងរបៀបតឹងរ៉ឹង (មិនអនុញ្ញាតឱ្យខ្ចី)។ | | `QUOTA_SOFT_DEPRIORITIZE_FACTOR` | `0.7` | `open-sse/services/combo.ts` | មេគុណពិន្ទុ (0..1) ដែលអនុវត្តចំពោះគោលដៅ នៅពេលគោលការណ៍កូតាទន់បន្ថយអាទិភាពរបស់វា។ | | `STATUS_SOFT_DEPRIORITIZE_FACTOR` | `0.5` | `open-sse/services/combo/autoStrategy.ts` | មេគុណពិន្ទុ (0..1) ដែលអនុវត្តចំពោះ provider ដែលបានប្រើអស់ (`credits_exhausted`/`rate_limited`) ក្នុងការគណនាពិន្ទុ auto-combo នៅពេលការកាត់ផ្តាច់កូតា preflight ត្រូវបានបិទ (#4540)។ | | `QUOTA_CONSUMPTION_RETENTION_DAYS` | `14` | `src/lib/db/quotaConsumption.ts` | រយៈពេលរក្សាទុក (គិតជាថ្ងៃ) សម្រាប់ bucket របស់ `quota_consumption` មុនពេល GC (`gcQuotaConsumption`)។ | | `QUOTA_PREFLIGHT_CUTOFF_ENABLED` | `false` | `src/lib/resilience/settings.ts` | ជម្រើសដែលត្រូវបើកដោយចេតនា (លំនាំដើមបិទ)៖ បើកការកាត់ផ្តាច់កូតាតឹងរ៉ឹងនៃ auto-routing ដែលដកបេក្ខភាពមានកូតាទាបចេញ មុនពេលគណនាពិន្ទុ។ | | `OMNIROUTE_AUTO_FREE_FALLBACK_TO_FULL_POOL` | `false` | `open-sse/services/autoCombo/virtualFactory.ts` | ជម្រើសដែលត្រូវបើកដោយចេតនា (លំនាំដើមបិទ)៖ នៅពេល filter `auto/:` មិនត្រូវនឹងបេក្ខភាពដែលបានតភ្ជាប់ណាមួយ សូមស្ដារឥរិយាបថចាស់នៃការប្រើ pool ពេញលេញ (មិនបានត្រង) ជាជម្រើសជំនួស ជំនួសឱ្យការត្រឡប់ pool ទទេ។ លំនាំដើមបិទធ្វើឱ្យ `:free` មានន័យថា "តែកម្រិតឥតគិតថ្លៃប៉ុណ្ណោះ"។ | | `OMNIROUTE_CHAOS_MAX_PANEL` | `5` | `open-sse/services/autoCombo/virtualFactory.ts` | ដែនកំណត់ទំហំ panel (កំណត់ក្នុងចន្លោះ 1–10) សម្រាប់ variant ផ្សាយ `auto/*:chaos` — សំណើមួយត្រូវបានបញ្ជូនទៅកាន់ model ចម្រុះតាម provider ច្រើនបំផុតត្រឹមចំនួននេះ។ | | `OMNIROUTE_CHAOS_MIN_PANEL` | _(តម្លៃលំនាំដើមរបស់ម៉ាស៊ីន)_ | `open-sse/services/autoCombo/virtualFactory.ts` | ការកំណត់ទំហំផ្ទាំងអប្បបរមាដែលត្រូវបានបញ្ជូនទៅកម្មវិធីដោះស្រាយការផ្សាយ chaos; ការមិនកំណត់នឹងរក្សាតម្លៃលំនាំដើមរបស់ម៉ាស៊ីន។ | | `OMNIROUTE_CHAOS_PANEL_TIMEOUT_MS` | _(តម្លៃលំនាំដើមរបស់ម៉ាស៊ីន)_ | `open-sse/services/autoCombo/virtualFactory.ts` | រយៈពេលអស់ពេលកំណត់ដាច់ខាត (ms) សម្រាប់ការបញ្ជូនចេញទៅកាន់ផ្ទាំង chaos ទាំងមូល; ការមិនកំណត់នឹងរក្សាតម្លៃលំនាំដើមរបស់ម៉ាស៊ីន។ | | `GROK_AUTH_PATH` | `~/.grok/auth.json` | `open-sse/services/grokQuotaFetcher.ts` | ផ្លូវទៅកាន់ `auth.json` របស់ Grok CLI ដែលប្រើសម្រាប់ទាញយកកូតាប្រចាំសប្តាហ៍របស់ grok-web; កំណត់ជំនួសសម្រាប់ការធ្វើតេស្ត ឬការដំឡើង CLI ដែលមិនមែនជាស្តង់ដារ។ | | `AGENTBRIDGE_UPSTREAM_CA_CERT` | _(មិនបានកំណត់)_ | `src/mitm/manager.ts` | វិញ្ញាបនបត្រ CA បន្ថែម (PEM) ដែលត្រូវបានទុកចិត្តសម្រាប់ការតភ្ជាប់ TLS ខ្សែខាងលើរបស់ AgentBridge។ | | `INSPECTOR_BUFFER_SIZE` | `1000` | `src/mitm/inspector/buffer.ts` | ចំនួនអតិបរមានៃសំណើដែលបានចាប់យក និងរក្សាទុកក្នុងអង្គចងចាំបណ្តោះអាសន្នជារង្វង់របស់ Traffic Inspector។ | | `INSPECTOR_MAX_BODY_KB` | `1024` | `src/mitm/inspector/buffer.ts` | ទំហំអតិបរមា (KB) នៃតួសំណើ/ការឆ្លើយតបដែលបានចាប់យក មុនពេលកាត់ខ្លី។ | | `INSPECTOR_HTTP_PROXY_PORT` | `8080` | `src/mitm/inspector/httpProxyServer.ts` | ច្រកមូលដ្ឋានសម្រាប់ប្រូកស៊ី HTTP របស់ Traffic Inspector។ | | `INSPECTOR_HTTP_PROXY_AUTOSTART` | `false` | `src/mitm/inspector/httpProxyServer.ts` | ចាប់ផ្តើមប្រូកស៊ី HTTP របស់ inspector ដោយស្វ័យប្រវត្តិនៅពេលចាប់ផ្តើមប្រព័ន្ធ។ | | `INSPECTOR_LLM_HOSTS_EXTRA` | _(មិនបានកំណត់)_ | `src/lib/inspector/captureState.ts` | ឈ្មោះម៉ាស៊ីនបន្ថែម (បំបែកដោយសញ្ញាក្បៀស) ដែលត្រូវបានចាត់ទុកជាចំណុចបញ្ចប់ LLM សម្រាប់ការចាប់យក។ | | `INSPECTOR_MASK_SECRETS` | `true` | `src/mitm/inspector/buffer.ts` | លាក់ព័ត៌មានសម្ងាត់ (បឋមកថាផ្ទៀងផ្ទាត់ / សោ API) នៅក្នុងចរាចរណ៍ដែលបានចាប់យក។ | | `INSPECTOR_SYSTEM_PROXY_GUARD_MINUTES` | `30` | `src/app/api/tools/traffic-inspector/capture-modes/system-proxy/route.ts` | ចំនួននាទី មុនពេលកម្មវិធីការពារ system-proxy ត្រឡប់ការកំណត់ប្រូកស៊ីរបស់ប្រព័ន្ធប្រតិបត្តិការដោយស្វ័យប្រវត្តិ។ | | `INSPECTOR_INTERNAL_INGEST_TOKEN` | _(ស្វ័យប្រវត្តិ)_ | `src/app/api/tools/traffic-inspector/internal/ingest/route.ts` | ថូខឹនសម្រាប់ផ្ទៀងផ្ទាត់ការបញ្ចូលទិន្នន័យចាប់យកខាងក្នុងទៅក្នុងឧបករណ៍ត្រួតពិនិត្យ។ | | `PLAYGROUND_COMPARE_MAX_COLUMNS` | `4` | `src/app/(dashboard)/dashboard/playground/` | ចំនួនអតិបរមានៃជួរឈរដែលបង្ហាញទន្ទឹមគ្នានៅក្នុងរបៀបប្រៀបធៀបរបស់ Playground។ | | `PLAYGROUND_IMPROVE_PROMPT_DEFAULT_MODEL` | _(មិនបានកំណត់)_ | `src/app/(dashboard)/dashboard/playground/` | ម៉ូដែលលំនាំដើមសម្រាប់សកម្មភាព 'កែលម្អប្រូម' របស់ Playground (ប្រើម៉ូដែលសកម្មជំនួស នៅពេលមិនបានកំណត់)។ | | `BIFROST_ENABLED` | `1` | `src/app/api/v1/relay/chat/completions/bifrost/route.ts` | កុងតាក់បិទមេបន្ទាន់សម្រាប់ប្រូកស៊ី sidecar របស់ Bifrost។ នៅពេលកំណត់ជា `0` route នឹងត្រឡប់ 503 ជាមួយ header `X-Bifrost-Killswitch` ហើយប្រតិបត្តិករត្រូវបានបញ្ជូនត្រឡប់ទៅផ្លូវ TS។ ប្រើវាដើម្បីបិទ sidecar ដោយមិនចាំបាច់ដាក់ឱ្យដំណើរការឡើងវិញ (ឧប្បត្តិហេតុរ៉ោតទ័រកម្រិតទី 1, ការប្ដូរសោ)។ | | `BIFROST_BASE_URL` | _(មិនបានកំណត់)_ | `src/app/api/v1/relay/chat/completions/bifrost/route.ts` | នៅពេលកំណត់ route ប្រូកស៊ី sidecar របស់ Bifrost នឹងបញ្ជូនបន្តចរាចរណ៍ `/v1/chat/completions` ទៅ gateway ដែលសរសេរជា Go នេះ ជំនួសឱ្យកម្មវិធីដោះស្រាយ relay របស់ TS។ មិនបានកំណត់ → 503 ជាមួយការប្រើផ្លូវជំនួស។ សញ្ញា slash នៅខាងចុងត្រូវបានដកចេញ។ | | `BIFROST_PORT` | `8080` | `src/lib/services/bootstrap.ts` | ច្រកដែលសេវាកម្មបង្កប់ Bifrost ក្រោមការត្រួតពិនិត្យត្រូវភ្ជាប់ (`127.0.0.1:`) នៅពេល OmniRoute គ្រប់គ្រងវដ្ដជីវិតរបស់ Bifrost sidecar។ តម្លៃលំនាំដើមគឺ `8080`។ | | `LLMLINGUA_PORT` | `20135` | `src/lib/services/bootstrap.ts` | ច្រកដែលសេវាកម្មបង្ហាប់ LLMLingua ក្រោមការត្រួតពិនិត្យត្រូវភ្ជាប់ (`127.0.0.1:`)។ តម្លៃលំនាំដើមគឺ `20135`។ | | `LLMLINGUA_BASE_URL` | `http://127.0.0.1:20135` | `open-sse/services/compression/engines/llmlingua/index.ts` | URL មូលដ្ឋានសម្រាប់ daemon មីក្រូសេវាបង្ហាប់ HTTP របស់ LLMLingua ក្នុងម៉ាស៊ីនមូលដ្ឋាន។ តម្លៃលំនាំដើមគឺ `http://127.0.0.1:20135`។ | | `LLMLINGUA_MODEL` | `atjsh/llmlingua-2-js-tinybert-meetingbank` | `src/lib/services/installers/llmlingua.ts` | លេខសម្គាល់ម៉ូដែល Hugging Face ដែល LLMLingua sidecar ក្រោមការត្រួតពិនិត្យផ្ទុក (បញ្ជូនទៅ env របស់ដំណើរការរង)។ | | `BIFROST_API_KEY` | _(មិនបានកំណត់)_ | `src/app/api/v1/relay/chat/completions/bifrost/route.ts` | សោ API សម្រាប់ gateway របស់ Bifrost (ផ្ញើជា `Authorization: Bearer ...`)។ ប្រសិនបើមិនបានកំណត់ route នឹងរំពឹងថាសំណើមានសោ API របស់ OmniRoute ដែលមានសុពលភាព; សោនេះគឺសម្រាប់តែការផ្ទៀងផ្ទាត់នៅខាង gateway ប៉ុណ្ណោះ។ | | `BIFROST_STREAMING_ENABLED` | `true` | `src/app/api/v1/relay/chat/completions/bifrost/route.ts` | នៅពេលមានតម្លៃ true ផ្លូវ sidecar របស់ Bifrost នឹងស្ទ្រីមការឆ្លើយតបត្រឡប់មកវិញតាម SSE ឆ្លងកាត់ gateway ជំនួសឱ្យ TS streaming executor។ កំណត់ជា `0` ដើម្បីបង្ខំឱ្យការឆ្លើយតប JSON ដែលមិនស្ទ្រីមឆ្លងកាត់ gateway។ | | `BIFROST_TIMEOUT_MS` | `30000` | `src/app/api/v1/relay/chat/completions/bifrost/route.ts` | រយៈពេលអស់ពេលសម្រាប់សំណើនីមួយៗ នៅពេលធ្វើប្រូកស៊ីទៅកាន់ Bifrost gateway (ms)។ នៅពេលអស់ពេល ផ្លូវនេះត្រឡប់ទៅផ្លូវ TS relay តាមរយៈ header `X-Bifrost-Fallback`។ | | `OMNIROUTE_BIFROST_KEY` | _(មិនបានកំណត់)_ | `src/app/api/v1/relay/chat/completions/bifrost/route.ts` | ឈ្មោះក្លែងក្លាយសម្រាប់ `BIFROST_API_KEY` (ប្រើដោយស្គ្រីបដែលអាន env តាមរយៈ `OMNIROUTE_*`)។ `BIFROST_API_KEY` មានអាទិភាពនៅពេលទាំងពីរត្រូវបានកំណត់។ | | `OMNIROUTE_RELAY_BACKEND` | `ts` / `auto` | `src/app/api/v1/relay/chat/completions/routingBackend.ts` | backend របស់ relay សម្រាប់ `/api/v1/relay/chat/completions`៖ `ts \| bifrost \| auto`។ `ts` = TypeScript relay (លំនាំដើមនៅពេល Bifrost មិនបានកំណត់រចនាសម្ព័ន្ធ); `auto` ជ្រើសរើស Bifrost នៅពេល `BIFROST_BASE_URL` ត្រូវបានកំណត់ ហើយ `BIFROST_ENABLED` ≠ `0` ដោយមានការត្រឡប់ទៅ TS ដោយស្វ័យប្រវត្តិ ប្រសិនបើមិនអាចចូលដំណើរការ sidecar បាន; `bifrost` បង្ខំឱ្យប្រើ Bifrost (តឹងរ៉ឹង គ្មានការត្រឡប់ក្រោយ)។ ការផ្ទៀងផ្ទាត់អត្តសញ្ញាណ/ការកំណត់អត្រា/របាំងការចាក់បញ្ចូល/បញ្ជីអនុញ្ញាត តែងតែដំណើរការក្នុងផ្លូវ Next ជាមុន។ ការឆ្លើយតបមាន `X-Routing-Backend` / `X-Routing-Fallback` / `X-Routing-Fallback-Reason`។ | | `RELAY_ROUTING_BACKEND` | _(មិនបានកំណត់)_ | `src/app/api/v1/relay/chat/completions/routingBackend.ts` | ឈ្មោះក្លែងក្លាយដែលអាចទទួលយកបានសម្រាប់ `OMNIROUTE_RELAY_BACKEND` (តម្លៃ `ts \| bifrost \| auto` ដូចគ្នា)។ `OMNIROUTE_RELAY_BACKEND` មានអាទិភាពនៅពេលទាំងពីរត្រូវបានកំណត់។ | | `OMNIROUTE_BIFROST_FAILURE_COOLDOWN_MS` | `5000` | `src/app/api/v1/relay/chat/completions/bifrostCooldown.ts` | រយៈពេលរង់ចាំ (ms) បន្ទាប់ពីការឆ្លងទៅ Bifrost sidecar បរាជ័យក្នុងរបៀប `auto` មុនពេល relay ព្យាយាម sidecar ម្តងទៀត; វាបញ្ជូនដោយផ្ទាល់ទៅផ្លូវ TS ខណៈពេលរយៈពេលរង់ចាំនៅមានសុពលភាព បន្ទាប់មកសាកល្បងម្តងទៀត។ `0` បិទមុខងារនេះ។ អនុវត្តតែនៅពេល `OMNIROUTE_RELAY_BACKEND=auto` ប៉ុណ្ណោះ។ | | `OMNIROUTE_TLS_CERT` | _(មិនបានកំណត់)_ | `bin/cli/commands/serve.mjs` | ផ្លូវទៅកាន់វិញ្ញាបនបត្រ TLS ទម្រង់ PEM ដើម្បីដំណើរការ `omniroute serve` តាម HTTPS (ស្មើនឹង `--tls-cert`)។ ត្រូវតែប្រើជាគូជាមួយ `OMNIROUTE_TLS_KEY`; បន្ទាប់មក standalone server នឹងបញ្ចប់ TLS នៅលើ listener ដដែល (`wss://` ដំណើរការដដែលដោយគ្មានការផ្លាស់ប្តូរ)។ មិនកំណត់ → HTTP ធម្មតា។ ការផ្តល់តែ cert ឬ key មួយប៉ុណ្ណោះ ឬផ្លូវដែលមិនអាចអានបាន នឹងកត់ត្រាការព្រមាន ហើយបន្តប្រើ HTTP។ | | `OMNIROUTE_TLS_KEY` | _(មិនបានកំណត់)_ | `bin/cli/commands/serve.mjs` | ផ្លូវទៅកាន់ private key របស់ TLS ទម្រង់ PEM សម្រាប់ HTTPS របស់ `omniroute serve` (ស្មើនឹង `--tls-key`)។ ត្រូវតែប្រើជាគូជាមួយ `OMNIROUTE_TLS_CERT`។ សូមមើល `OMNIROUTE_TLS_CERT`។ | | `OMNIROUTE_LOCAL_ENDPOINTS_ENABLED` | `0` | `src/lib/security/localEndpoints.ts` | កុងតាក់មេសម្រាប់ផ្លូវ `/api/local/*`។ នៅពេលមិនបានកំណត់ ឬកំណត់ជា `0` ផ្លូវ `/api/local/*` ទាំងអស់ត្រឡប់លេខស្ថានភាព 503 ក្នុងបរិស្ថាន production។ ត្រូវតែជា `1` ក្នុងការដាក់ឱ្យដំណើរការដែលមិនមែនជា loopback ដើម្បីបើកដំណើរការ Redis launcher និងកម្មវិធីចាប់ផ្តើមសេវាកម្មមូលដ្ឋានដោយចុចម្តងស្រដៀងគ្នា។ ការការពារពីរជាន់ជាមួយនឹងចំណាត់ថ្នាក់ route-guard របស់ `isLocalOnlyPath()` (`LOCAL_ONLY_API_PREFIXES` ក្នុង `src/server/authz/routeGuard.ts`)។ | | `OMNIROUTE_LOCAL_ENDPOINTS_TOKEN` | _(មិនបានកំណត់)_ | `src/lib/security/localEndpoints.ts` | Bearer token សម្រាប់អ្នកហៅ `/api/local/*` ដែលមិនស្ថិតនៅលើ loopback (ឧ. កម្មវិធី desktop)។ នៅពេលកំណត់ សំណើពី IP ដែលមិនមែនជា loopback ត្រូវតែមាន `Authorization: Bearer `។ តម្រូវឱ្យមាននៅពេល `OMNIROUTE_LOCAL_ENDPOINTS_ENABLED=1` ក្នុងការដាក់ឱ្យដំណើរការដែលមិនមែនជា loopback។ | | `OMNIROUTE_REDIS_CONTAINER_NAME` | `omniroute-redis` | `bin/cli/commands/redis.mjs` | ឈ្មោះ container សម្រាប់កម្មវិធីបើកដំណើរការ Redis ដោយចុចតែម្តង (`omniroute redis up`)។ ប្រើដោយទាំង CLI និង GUI `RedisLauncherPanel`។ | | `OMNIROUTE_REDIS_HOST_PORT` | `6379` | `bin/cli/commands/redis.mjs` | port របស់ host សម្រាប់កម្មវិធីបើកដំណើរការ Redis ដោយចុចតែម្តង។ បង្កើនតម្លៃនេះ ប្រសិនបើ host បានភ្ជាប់ទៅនឹង 6379 រួចហើយ។ port ខាងក្នុងរបស់ container នៅតែជា 6379។ | | `OMNIROUTE_REDIS_BIND_HOST` | `127.0.0.1` | `bin/cli/commands/redis.mjs` | interface របស់ host ដែលកម្មវិធីបើកដំណើរការ Redis ដោយចុចតែម្តងផ្សព្វផ្សាយនៅលើ។ កម្មវិធីបើកដំណើរការនេះចាប់ផ្តើម Redis ដោយគ្មានពាក្យសម្ងាត់ ដូច្នេះការភ្ជាប់ទៅ `0.0.0.0` នឹងផ្តល់ឱ្យរាល់ host នៅលើ LAN របស់អ្នកនូវ Redis ដែលមិនទាមទារការផ្ទៀងផ្ទាត់អត្តសញ្ញាណ — ពង្រីកការចូលប្រើនេះ លុះត្រាតែអ្នកកំណត់ពាក្យសម្ងាត់លើ instance នេះដោយខ្លួនឯងផងដែរ។ | | `REDIS_BIND_HOST` | `127.0.0.1` | `docker-compose.yml` | interface របស់ host ដែល docker-compose ផ្សព្វផ្សាយ Redis sidecar នៅលើ (#9286)។ Redis ក្នុង compose ដំណើរការដោយគ្មាន `requirepass`; app container ចូលប្រើវាតាមបណ្តាញ compose (`redis:6379`) — port ដែលបានផ្សព្វផ្សាយមានសម្រាប់តែឧបករណ៍ប្រើប្រាស់ខាង host ប៉ុណ្ណោះ។ `0.0.0.0` បើកបង្ហាញ Redis ដែលមិនទាមទារការផ្ទៀងផ្ទាត់អត្តសញ្ញាណទៅកាន់ LAN ទាំងមូល។ | | `REDIS_PORT` | `6379` | `docker-compose.yml` | port របស់ host សម្រាប់ Redis sidecar ក្នុង compose។ | | `APP_BIND_HOST` | `127.0.0.1` | `docker-compose.yml`, `docker-compose.prod.yml` | interface របស់ host ដែល docker-compose ផ្សព្វផ្សាយ port dashboard/API/live-WS ផ្ទាល់របស់ app នៅលើ (#12568)។ ដោយ `REQUIRE_API_KEY=false` ត្រូវបានផ្តល់ជាតម្លៃលំនាំដើមក្នុង `.env.example` នោះ `0.0.0.0` នឹងបើកបង្ហាញ LLM proxy `/v1` ដែលអាចចូលប្រើដោយអនាមិកទៅកាន់ LAN/WAN ទាំងមូល — ពង្រីកការចូលប្រើតែនៅពេល `REQUIRE_API_KEY=true` ឬមាន reverse proxy នៅខាងមុខដែលអនុវត្តការផ្ទៀងផ្ទាត់អត្តសញ្ញាណផ្ទាល់ខ្លួន។ | | `QDRANT_BIND_HOST` | `127.0.0.1` | `docker-compose.yml` | interface របស់ host ដែល docker-compose ផ្សព្វផ្សាយ Qdrant memory sidecar នៅលើ (#12578)។ ការពិចារណាអំពីការបើកបង្ហាញទៅកាន់ LAN ដូចគ្នានឹង `REDIS_BIND_HOST`។ | | `BIFROST_BIND_HOST` | `127.0.0.1` | `docker-compose.yml` | interface របស់ host ដែល docker-compose ផ្សព្វផ្សាយ Bifrost router sidecar នៅលើ (#12578)។ ការពិចារណាអំពីការបើកបង្ហាញទៅកាន់ LAN ដូចគ្នានឹង `REDIS_BIND_HOST`។ | | `REDIS_KEY_PREFIX` | `omniroute:` | `src/shared/utils/rateLimiter.ts` | បុព្វបទ namespace ដែលអនុវត្តចំពោះ key របស់ OmniRoute Redis ទាំងអស់ (rate limiter, auth cache, quota store, warmup circuit breaker)។ វាការពារការប៉ះទង្គិចគ្នារវាង key នៅពេល Redis instance ត្រូវបានចែករំលែកជាមួយ app ផ្សេងទៀត (#11042)។ | | `OMNIROUTE_INTERNAL_SERVICE_TOKEN` | _(មិនបានកំណត់ — យន្តការត្រូវបានបិទ)_ | `src/lib/api/internalServiceAuth.ts` | secret រួមសម្រាប់ការហៅ REST ខាងក្នុងដែលរក្សាអត្តសញ្ញាណ (#9260)៖ component របស់ OmniRoute ដែលហៅ route មូលដ្ឋានផ្សេងទៀតរបស់ OmniRoute ផ្ញើវាជា `x-omniroute-internal-service-token` ដើម្បីរក្សាអត្តសញ្ញាណរបស់អ្នកហៅដើម។ ត្រូវបានប្រៀបធៀបដោយប្រើ `timingSafeEqual`។ | | `OMNIROUTE_INTERNAL_SERVICE_TOKEN_FILE` | _(មិនបានកំណត់)_ | `src/lib/api/internalServiceAuth.ts` | វ៉ារ្យ៉ង់ឯកសារសម្ងាត់នៃថូខឹនសេវាខាងក្នុង៖ ផ្លូវទៅកាន់ឯកសារដែលមាតិកាដែលបានកាត់ចន្លោះទទេរបស់វាគឺជាថូខឹន។ វាត្រូវបានប្រើតែនៅពេលអថេរក្នុងបន្ទាត់មិនត្រូវបានកំណត់ប៉ុណ្ណោះ។ | | `OPENROUTER_PROVIDER_STATS_ENABLED` | `true` | `src/lib/catalog/openrouterProviderStats.ts` | បន្ថែមទិន្នន័យស្ថិតិចំណាត់ថ្នាក់ប្រចាំសប្ដាហ៍ពី OpenRouter ទៅក្នុងបញ្ជីអ្នកផ្ដល់សេវានៅលើផ្ទាំងគ្រប់គ្រង (#9324)។ បើកជាលំនាំដើម; កំណត់ជា `false` ដើម្បីរំលងការទាញយកនៅផ្ទៃខាងក្រោយទាំងស្រុង (មិនរារាំងដំណើរការ និងមិនបង្កឱ្យមានកំហុសធ្ងន់ធ្ងរឡើយ)។ | | `OPENROUTER_PROVIDER_STATS_TTL_MS` | `86400000` (24 ម៉ោង) | `src/lib/catalog/openrouterProviderStats.ts` | រយៈពេល TTL របស់ឃ្លាំងសម្ងាត់សម្រាប់រូបថតស្ថិតិអ្នកផ្ដល់សេវា OpenRouter គិតជាមិល្លីវិនាទី។ | | `OMNIROUTE_REDIS_IMAGE` | `redis:7-alpine` | `bin/cli/commands/redis.mjs` | អ៊ីមេក Redis ដែលប្រើដោយកម្មវិធីបើកដំណើរការ Redis ដោយចុចតែមួយដង។ កំណត់ជំនួសជា `redis:8-alpine` ឬអ៊ីមេកឆ្លុះនៃបញ្ជីផ្ទុកឯកជនតាមតម្រូវការ។ | | `QDRANT_HOST` | `qdrant` | _(ទម្រង់ក្លាស្ទ័រដែលត្រូវបើកប្រើដោយជម្រើស)_ | ឈ្មោះម៉ាស៊ីនរបស់ sidecar Qdrant នៅពេល `--profile memory` សកម្ម។ តម្លៃលំនាំដើមចង្អុលទៅឈ្មោះសេវា qdrant នៅក្នុងបណ្ដាញ; កំណត់ជំនួសសម្រាប់ការដាក់ឱ្យដំណើរការខាងក្រៅ។ វាត្រូវបានប្រើតែនៅពេល `qdrantEnabled` មានតម្លៃជា `true` ក្នុងកូដ (`src/lib/memory/vectorStore.ts:108`)។ | | `QDRANT_PORT` | `6333` | _(ទម្រង់ក្លាស្ទ័រដែលត្រូវបើកប្រើដោយជម្រើស)_ | ច្រក REST របស់ sidecar Qdrant។ | | `QDRANT_GRPC_PORT` | `6334` | _(ទម្រង់ក្លាស្ទ័រដែលត្រូវបើកប្រើដោយជម្រើស)_ | ច្រក gRPC របស់ sidecar Qdrant។ ប្រើដោយបណ្ណាល័យម៉ាស៊ីនភ្ញៀវដែលចូលចិត្តប្រើ gRPC ជាង REST សម្រាប់ប្រតិបត្តិការស្ទ្រីម។ | | `QDRANT_API_KEY` | _(មិនបានកំណត់)_ | _(ទម្រង់ក្លាស្ទ័រដែលត្រូវបើកប្រើដោយជម្រើស)_ | សោ API ជាជម្រើសសម្រាប់ Qdrant Cloud ឬ instance នៅក្នុងបរិវេណផ្ទាល់ខ្លួនដែលតម្រូវឱ្យមានការផ្ទៀងផ្ទាត់។ ទទេ → មិនផ្ញើបឋមកថា `api-key` ទេ។ | | `QDRANT_COLLECTION` | `omniroute-memory` | _(ទម្រង់ក្លាស្ទ័រដែលត្រូវបើកប្រើដោយជម្រើស)_ | ឈ្មោះ collection សម្រាប់ embedding នៃអង្គចងចាំការសន្ទនារបស់ OmniRoute។ ត្រូវបានបង្កើតនៅពេលដំណើរការលើកដំបូងដោយមានវិមាត្រ `QDRANT_VECTOR_SIZE`។ | | `QDRANT_EMBEDDING_MODEL` | `text-embedding-3-small` | _(ទម្រង់ក្លាស្ទ័រដែលត្រូវបើកប្រើដោយជម្រើស)_ | ឈ្មោះម៉ូដែល embedding លំនាំដើមដែលត្រូវបានកត់ត្រាក្នុង metadata របស់ collection Qdrant។ Embedding ជាក់ស្ដែងត្រូវបានបង្កើតដោយអ្នកផ្ដល់សេវាណាមួយដែលវាល `embeddingModel` ក្នុងការកំណត់របស់ OmniRoute ចង្អុលទៅ។ | | `QDRANT_VECTOR_SIZE` | `1536` | _(ទម្រង់ក្លាស្ទ័រដែលត្រូវបើកប្រើជាមុន)_ | វិមាត្រវ៉ិចទ័រ embedding។ ត្រូវតែផ្គូផ្គងនឹងម៉ូដែលដែលអ្នកប្រើសម្រាប់ embedding (text-embedding-3-small → 1536; ada-002 → 1536; nomic-embed-text → 768)។ | | `QDRANT_HNSW_EF_CONSTRUCT` | `128` | _(ទម្រង់ក្លាស្ទ័រដែលត្រូវបើកប្រើជាមុន)_ | ភាពត្រឹមត្រូវរបស់ការបង្កើតលិបិក្រម HNSW។ តម្លៃកាន់តែខ្ពស់ = ការបង្កើតកាន់តែយឺត ការស្វែងរកកាន់តែលឿន។ | | `OMNIROUTE_ROTATION_ENABLED` | `true` | `open-sse/services/rotationConfig.ts` | កុងតាក់មេសម្រាប់ការប្ដូរគណនីដែលអាចកំណត់រចនាសម្ព័ន្ធដោយប្រតិបត្តិករ។ នៅពេលកំណត់ជា `false` គ្មានថ្នាក់ `OMNIROUTE_ROTATE_*` ណាមួយខាងក្រោមបង្កឱ្យមានការប្រើគណនីបម្រុងទេ (ស្ថានភាពបិទមេក៏រារាំងថ្នាក់ 429/500/502 ដែលត្រូវបានបើកតាមលំនាំដើមផងដែរ)។ វាអនុញ្ញាតឱ្យ front-end ត្រួតពិនិត្យ (ឧ. កម្មវិធី VibeProxy សម្រាប់ desktop) ឆ្លុះបញ្ចាំងច្បាប់ប្ដូរគណនីផ្ទាល់ខ្លួនរបស់វាទៅកាន់ម៉ាស៊ីនប្រើគណនីបម្រុងរបស់ backend។ | | `OMNIROUTE_ROTATION_RATE_LIMIT_RESET_SECONDS` | `0` | `open-sse/services/rotationConfig.ts` | រយៈពេលរង់ចាំ (វិនាទី) ដែលអនុវត្តចំពោះគណនីដែលត្រូវបានកំណត់អត្រា នៅពេល upstream មិនផ្ដល់ព័ត៌មានជាក់លាក់អំពីការកំណត់ឡើងវិញ។ `0` = ប្រើរយៈពេលរង់ចាំលំនាំដើមរបស់ម៉ាស៊ីន ជំនួសឱ្យការកំណត់ជំនួសថេរ។ | | `OMNIROUTE_ROTATION_DISABLE_TAG_WITHOUT_RESET` | `true` | `open-sse/services/rotationConfig.ts` | ឆ្លុះបញ្ចាំងចំណូលចិត្តរបស់ front-end ដែលថា "កុំដាក់ស្លាកថាត្រូវបានកំណត់អត្រា ប្រសិនបើគ្មានពេលវេលាកំណត់ឡើងវិញ"។ | | `OMNIROUTE_ROTATE_ON_429` | `true` | `open-sse/services/rotationConfig.ts` | បើកការប្រើគណនីបម្រុងតាមស្ថានភាពសម្រាប់កំហុស `429`។ នៅពេលកំណត់ជា `false` (ហើយ `OMNIROUTE_ROTATION_ENABLED=true`) កំហុស `429` នឹងលែងបង្កឱ្យមានការប្ដូរគណនី ហើយត្រូវបានត្រឡប់ទៅម៉ាស៊ីនភ្ញៀវជំនួសវិញ។ | | `OMNIROUTE_ROTATE_429_THRESHOLD` | `1` | `open-sse/services/rotationConfig.ts` | ចំនួនកំហុស `429` ក្នុងរយៈពេល `OMNIROUTE_ROTATE_429_WINDOW_SECONDS` ដែលតម្រូវឱ្យកើតមាន មុនពេលប្ដូរគណនី។ `1` (លំនាំដើម) ប្ដូរភ្លាមៗ ដោយរក្សាឥរិយាបថពីមុន។ | | `OMNIROUTE_ROTATE_429_WINDOW_SECONDS` | `120` | `open-sse/services/rotationConfig.ts` | ចន្លោះពេលរំកិល (វិនាទី) ដែលកំហុស `429` ត្រូវបានរាប់បញ្ចូលទៅក្នុង `OMNIROUTE_ROTATE_429_THRESHOLD`។ | | `OMNIROUTE_ROTATE_ON_500` | `true` | `open-sse/services/rotationConfig.ts` | បើកការប្រើគណនីបម្រុងតាមស្ថានភាពសម្រាប់កំហុសម៉ាស៊ីនមេ `5xx` (មិនរាប់បញ្ចូល `502` ដែលមានថ្នាក់ផ្ទាល់ខ្លួន)។ នៅពេលកំណត់ជា `false` កំហុសទាំងនេះនឹងលែងបង្កឱ្យមានការប្ដូរគណនី។ | | `OMNIROUTE_ROTATE_500_THRESHOLD` | `1` | `open-sse/services/rotationConfig.ts` | ចំនួនកំហុស `5xx` ក្នុងរយៈពេល `OMNIROUTE_ROTATE_500_WINDOW_SECONDS` ដែលតម្រូវឱ្យកើតមាន មុនពេលប្ដូរគណនី។ `1` (លំនាំដើម) ប្ដូរភ្លាមៗ។ | | `OMNIROUTE_ROTATE_500_WINDOW_SECONDS` | `120` | `open-sse/services/rotationConfig.ts` | ចន្លោះពេលរំកិល (វិនាទី) ដែលក្នុងអំឡុងពេលនោះ កំហុស `5xx` ត្រូវបានរាប់សម្រាប់ `OMNIROUTE_ROTATE_500_THRESHOLD`។ | | `OMNIROUTE_ROTATE_ON_502` | `true` | `open-sse/services/rotationConfig.ts` | បើកមុខងារបម្រុងទុកតាមស្ថានភាពសម្រាប់កំហុស `502` (ច្រកផ្លូវមិនល្អ)។ នៅពេល `false` កំហុស `502` នឹងលែងបង្កឱ្យមានការប្ដូរគណនី។ | | `OMNIROUTE_ROTATE_502_THRESHOLD` | `1` | `open-sse/services/rotationConfig.ts` | ចំនួនកំហុស `502` ក្នុងរយៈពេល `OMNIROUTE_ROTATE_502_WINDOW_SECONDS` ដែលត្រូវមាន មុនពេលគណនីត្រូវបានប្ដូរ។ `1` (លំនាំដើម) ប្ដូរភ្លាមៗ។ | | `OMNIROUTE_ROTATE_502_WINDOW_SECONDS` | `120` | `open-sse/services/rotationConfig.ts` | ចន្លោះពេលរំកិល (វិនាទី) ដែលក្នុងអំឡុងពេលនោះ កំហុស `502` ត្រូវបានរាប់សម្រាប់ `OMNIROUTE_ROTATE_502_THRESHOLD`។ | | `OMNIROUTE_ROTATE_ON_400` | `false` | `open-sse/services/rotationConfig.ts` | មុខងារជ្រើសរើសបើក (លំនាំដើម បិទ)៖ នៅពេល `true` កំហុស `400` ធម្មតា (សំណើមិនត្រឹមត្រូវ) ក៏បង្កឱ្យមានការប្ដូរគណនីដែរ។ វាគ្រាន់តែជាការបន្ថែមប៉ុណ្ណោះ — វាមិនដែលរារាំងឥរិយាបថដែលមានស្រាប់របស់ម៉ាស៊ីន ដែល `400` មានអត្ថបទអំពីដែនកំណត់អត្រា/កូតា នៅតែប្ដូរទៅជម្រើសបម្រុងដោយមិនគិតពីទង់នេះឡើយ។ | | `OMNIROUTE_ROTATE_400_THRESHOLD` | `1` | `open-sse/services/rotationConfig.ts` | ចំនួនកំហុស `400` ក្នុងរយៈពេល `OMNIROUTE_ROTATE_400_WINDOW_SECONDS` ដែលត្រូវមាន មុនពេលគណនីត្រូវបានប្ដូរ (ពិនិត្យតែនៅពេល `OMNIROUTE_ROTATE_ON_400=true` ប៉ុណ្ណោះ)។ | | `OMNIROUTE_ROTATE_400_WINDOW_SECONDS` | `120` | `open-sse/services/rotationConfig.ts` | ចន្លោះពេលរំកិល (វិនាទី) ដែលក្នុងអំឡុងពេលនោះ កំហុស `400` ត្រូវបានរាប់សម្រាប់ `OMNIROUTE_ROTATE_400_THRESHOLD`។ | ### កម្មវិធីកំណត់ពេលកម្ដៅ Claude ការកម្ដៅដែលដំណើរការដោយ Cron សម្រាប់ការតភ្ជាប់ Anthropic OAuth ដែលបានជ្រើសរើសចូល ដើម្បីឱ្យចន្លោះកំណត់អត្រារយៈពេល 5 ម៉ោងត្រូវបានបើកដោយសំណើតូចតាចដែលបានកំណត់ពេល ជំនួសឱ្យសំណើពិតប្រាកដដំបូង (#8848)។ កម្មវិធីកំណត់ពេលនេះត្រូវបានបិទ លុះត្រាតែ `OMNIROUTE_WARMUP_ENABLED` មានតម្លៃដែលចាត់ទុកថាពិត **និង** ការតភ្ជាប់ត្រូវបានសម្គាល់នៅក្នុង `settings.claudeWarmup.connections`; បញ្ជីការតភ្ជាប់ទទេមានន័យថា គ្មានអ្វីត្រូវបានកម្ដៅឡើយ ទោះបីអថេរបរិស្ថានត្រូវបានបើកក៏ដោយ។ | អថេរ | លំនាំដើម | ឯកសារប្រភព | សេចក្តីពិពណ៌នា | | ------------------------------ | --------------------------- | ---------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `OMNIROUTE_WARMUP_ENABLED` | _(មិនបានកំណត់ → បិទ)_ | `src/lib/warmupScheduler.ts` | កុងតាក់មេសម្រាប់កម្មវិធីកំណត់ពេល warmup។ ទទួលយក `1`/`true`/`yes`/`on` (មិនប្រកាន់អក្សរធំតូច និងបានកាត់ចន្លោះ)។ តម្លៃផ្សេងទៀត ឬបើមិនបានកំណត់ នឹងទុកឱ្យកម្មវិធីកំណត់ពេលបិទ។ | | `OMNIROUTE_WARMUP_CRON` | `0 7 * * *` | `src/lib/warmupScheduler.ts` | កន្សោម cron ប្រាំវាលសម្រាប់វដ្ត warmup ដែលត្រូវបានវាយតម្លៃក្នុង `America/Los_Angeles` (តំបន់ពេលវេលាកំណត់ឡើងវិញរបស់ Anthropic) ដោយមិនគិតពីនាឡិការបស់ម៉ាស៊ីនមេ។ | | `OMNIROUTE_WARMUP_CONCURRENCY` | `3` | `src/lib/warmupScheduler.ts` | ចំនួនការតភ្ជាប់ដែលត្រូវបាន warmup ស្របគ្នាក្នុងមួយវដ្ត។ ត្រូវបានកម្រិតនៅចន្លោះ `1`-`10`; តម្លៃដែលមិនមែនជាលេខនឹងត្រឡប់ទៅប្រើ `3`។ | | `OMNIROUTE_WARMUP_MODEL` | `claude-3-5-haiku-20241022` | `src/lib/warmupScheduler.ts` | ម៉ូដែលដែលប្រើសម្រាប់សំណើ warmup។ កំណត់ជំនួសតែក្នុងករណីដែលលំនាំដើមមិនមានក្នុងគម្រោងរបស់អ្នកប៉ុណ្ណោះ; ជ្រើសរើសម៉ូដែលដែលថោកបំផុត ប៉ុន្តែនៅតែអាចបើកចន្លោះពេលបាន។ | ### សម័យ VNC សម្រាប់ការចូលតាមកម្មវិធីរុករក និងឈ្មោះក្លែងក្លាយ Data-Dir Chromium+VNC ដែលដំណើរការក្នុងកុងតឺន័រ ប្រើសម្រាប់ចាប់យកព័ត៌មានសម្ងាត់នៃការចូលតាមកម្មវិធីរុករកបែបអន្តរកម្ម (`/api/vnc-session`) រួមជាមួយឈ្មោះក្លែងក្លាយ `DATA_DIR` ចាស់។ ទាំងអស់សុទ្ធតែជាជម្រើស — តម្លៃលំនាំដើមរបស់ VNC សំដៅទៅរូបភាព `omniroute-vnc-chromium:local` ដែលបានភ្ជាប់មកជាមួយ ហើយត្រូវបានកំណត់ជំនួសតែសម្រាប់រូបភាពកុងតឺន័រផ្ទាល់ខ្លួន ច្រក ឬការកែសម្រួលវដ្តជីវិតប៉ុណ្ណោះ។ | អថេរ | លំនាំដើម | ឯកសារប្រភព | សេចក្តីពិពណ៌នា | | ------------------------------------- | ------------------------------------------------------------------------ | ------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `OMNIROUTE_VNC_IMAGE` | `omniroute-vnc-chromium:local` | `src/lib/vncSession/manifest.ts` | ស្លាករូបភាព Docker សម្រាប់កុងតឺន័រចូល Chromium+VNC។ ស្ថាបនា `docker/vnc-browser/chromium` ឬកំណត់វាឱ្យសំដៅទៅរូបភាពផ្ទាល់ខ្លួន។ | | `OMNIROUTE_DOCKER_BIN` | `docker` | `src/lib/vncSession/manifest.ts` | ឯកសារប្រតិបត្តិបរិស្ថានដំណើរការកុងតឺន័រ ដែលប្រើសម្រាប់បើកដំណើរការកុងតឺន័រ VNC (ឧ. កំណត់ជា `podman`)។ | | `OMNIROUTE_VNC_CONTAINER_VNC_PORT` | `3000` | `src/lib/vncSession/manifest.ts` | ច្រក VNC/noVNC ដែលបង្ហាញនៅខាងក្នុងកុងតឺន័រ។ | | `OMNIROUTE_VNC_CONTAINER_CDP_PORT` | `9223` | `src/lib/vncSession/manifest.ts` | ច្រក Chrome DevTools Protocol នៅខាងក្នុងកុងតឺន័រ។ | | `OMNIROUTE_VNC_CONTAINER_PROFILE_DIR` | `/config` | `src/lib/vncSession/manifest.ts` | ផ្លូវថតប្រវត្តិរូប Chromium នៅខាងក្នុងកុងតឺន័រ។ | | `OMNIROUTE_VNC_PROFILE_DIR` | `$HOME/.omniroute/browser-login-profiles` | `src/lib/vncSession/manifest.ts` | ថតលើម៉ាស៊ីនមេដែលរក្សាទុកប្រវត្តិរូបចូលតាមកម្មវិធីរុករកជាអចិន្ត្រៃយ៍។ | | `OMNIROUTE_VNC_IDLE_MS` | `600000` (10 នាទី) | `src/lib/vncSession/manifest.ts` | រយៈពេលអស់សុពលភាពពេលទំនេរ (ms) មុនពេលសម័យ VNC ដែលអសកម្មត្រូវបានសម្អាត។ | | `OMNIROUTE_VNC_MAX_MS` | `1800000` (30 នាទី) | `src/lib/vncSession/manifest.ts` | កម្រិតអតិបរមាដាច់ខាត (ms) សម្រាប់រយៈពេលដំណើរការរបស់សម័យ VNC មួយ។ | | `OMNIROUTE_VNC_MAX_SESSIONS` | `4` | `src/lib/vncSession/manifest.ts` | ចំនួនអតិបរមានៃសម័យ VNC ដែលដំណើរការក្នុងពេលតែមួយ។ | | `OMNIROUTE_VNC_READY_MS` | `45000` | `src/lib/vncSession/manifest.ts` | រយៈពេលអស់សុពលភាព (ms) សម្រាប់រង់ចាំឱ្យកម្មវិធីរុករកក្នុងកុងតឺន័ររួចរាល់សម្រាប់ CDP។ | | `OMNIROUTE_VNC_HARVEST_MS` | `20000` | `src/lib/vncSession/manifest.ts` | រយៈពេលអស់សុពលភាព (ms) សម្រាប់ប្រមូលសម័យ/cookie ដែលបានចាប់យក បន្ទាប់ពីការចូលបានបញ្ចប់។ | | `OMNIROUTE_VNC_CHROMIUM_ARGS` | `--remote-debugging-port=9222 --no-first-run --no-default-browser-check` | `src/lib/vncSession/manifest.ts` | សញ្ញាជម្រើសបន្ទាត់ពាក្យបញ្ជាបន្ថែម ដែលបញ្ជូនទៅ Chromium ក្នុងកុងតឺន័រ។ | | `OMNIROUTE_VNC_NETWORK` | `omniroute-vnc-browser-login` | `src/lib/vncSession/manifest.ts` | បណ្តាញ Docker ដាច់ដោយឡែកដែលកុងតឺន័រចូល VNC ភ្ជាប់ទៅ (#12571) ជំនួសឱ្យ bridge លំនាំដើម ដើម្បីកុំឱ្យកុងតឺន័រដទៃទៀតអាចចូលដល់ច្រក bridge របស់ CDP បាន។ | | `VIBEPROXY_DATA_DIR` | _(មិនបានកំណត់)_ | `open-sse/services/notionThreadSessions.ts` | **ឈ្មោះក្លែងក្លាយចាស់** សម្រាប់ `DATA_DIR` ដែលត្រូវបានពិនិត្យតែបន្ទាប់ពីទាំង `DATA_DIR` និង `OMNIROUTE_DATA_DIR` មិនបានកំណត់។ កំណត់ទីតាំងឃ្លាំងសម្ងាត់សម័យខ្សែសន្ទនា Notion លើបណ្ដាញ (`/notion-web-thread-sessions.json`)។ | --- ## 26. ឧបករណ៍សម្រាប់ការធ្វើតេស្ត និង E2E ត្រូវបានប្រើដោយ `scripts/dev/run-next-playwright.mjs`, `scripts/dev/smoke-electron-packaged.mjs`, `scripts/dev/run-ecosystem-tests.mjs` និង `scripts/build/uninstall.mjs`។ សូមទុកតម្លៃទាំងអស់ ខាងក្រោមឱ្យមិនត្រូវបានកំណត់នៅក្នុងការដាក់ឱ្យប្រើប្រាស់ក្នុងផលិតកម្ម។ | អថេរ | លំនាំដើម | ឯកសារប្រភព | ការពិពណ៌នា | | -------------------------------------- | -------------------------------- | ----------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `OMNIROUTE_E2E_BOOTSTRAP_MODE` | `auth` | `scripts/dev/run-next-playwright.mjs` | របៀបចាប់ផ្ដើម E2E (`auth`, `fresh`, `reuse`) សម្រាប់កម្មវិធីដំណើរការ Playwright។ | | `OMNIROUTE_E2E_PASSWORD` | ប្រើ `INITIAL_PASSWORD` ជំនួសវិញ | `scripts/dev/run-next-playwright.mjs` | ពាក្យសម្ងាត់អ្នកគ្រប់គ្រងដែលត្រូវបានបញ្ចូលទៅក្នុងបរិស្ថាន Playwright។ | | `OMNIROUTE_DISABLE_LOCAL_HEALTHCHECK` | `true` | `scripts/dev/run-next-playwright.mjs` | បិទការពិនិត្យសុខភាពមូលដ្ឋានជាបន្តបន្ទាប់ អំឡុងពេលដំណើរការ Playwright។ | | `OMNIROUTE_DISABLE_TOKEN_HEALTHCHECK` | `true` | `scripts/dev/run-next-playwright.mjs` | បិទរង្វិលជុំពិនិត្យសុខភាពថូខឹន OAuth អំឡុងពេលធ្វើតេស្ត។ | | `OMNIROUTE_HEALTHCHECK_SKIP_PROVIDERS` | _(មិនបានកំណត់)_ | `src/lib/tokenHealthCheck.ts` | អ្នកផ្ដល់សេវាដែលបំបែកដោយសញ្ញាក្បៀស និងត្រូវបានដកចេញពីការស្កេនបន្តសុពលភាពថូខឹនជាមុន (ឧ. `codex,openai`)។ ជម្រើសជាក់លាក់ជំនួសឱ្យការបិទការពិនិត្យសុខភាពទាំងស្រុង — អ្នកផ្ដល់សេវាដែលមាន TTL ខ្លីបន្តធ្វើឱ្យស្រស់ ខណៈអ្នកផ្ដល់សេវាបែប cascade នៅតែឆ្លើយតបតែពេលចាំបាច់។ | | `OMNIROUTE_HIDE_HEALTHCHECK_LOGS` | `true` | `scripts/dev/run-next-playwright.mjs` | បិទសំឡេងកំណត់ហេតុរំខានពីការពិនិត្យសុខភាពនៅក្នុង stdout របស់ Playwright។ | | `OMNIROUTE_PLAYWRIGHT_SKIP_BUILD` | `0` | `scripts/dev/run-next-playwright.mjs` | រំលងការបង្កើតកំណែផលិតកម្ម Next.js មុនពេល Playwright ចាប់ផ្ដើម (ការបង្កើនប្រសិទ្ធភាព CI)។ | | `OMNIROUTE_SKIP_UNINSTALL_HOOK` | `0` | `scripts/build/uninstall.mjs` | រំលង hook លុបការដំឡើងរបស់ OmniRoute (ប្រើដោយ CI ដើម្បីរក្សា `node_modules` ឱ្យនៅដដែល)។ | | `ECOSYSTEM_SERVER_WAIT_MS` | `180000` | `scripts/dev/run-ecosystem-tests.mjs` | រយៈពេលរង់ចាំ (ms) ឱ្យម៉ាស៊ីនមេមានស្ថានភាពល្អ មុនពេលដំណើរការការធ្វើតេស្តប្រព័ន្ធអេកូឡូស៊ី/ពិធីការ។ | | `ELECTRON_SMOKE_URL` | `http://127.0.0.1:20128/login` | `scripts/dev/smoke-electron-packaged.mjs` | URL ដែលឧបករណ៍តេស្ត smoke របស់ Electron រំពឹងថាកម្មវិធីដែលបានវេចខ្ចប់នឹងបម្រើ។ | | `ELECTRON_SMOKE_TIMEOUT_MS` | `45000` | `scripts/dev/smoke-electron-packaged.mjs` | រយៈពេលអស់កំណត់សរុប (ms) មុនពេលឧបករណ៍តេស្ត smoke បោះបង់។ | | `ELECTRON_SMOKE_SETTLE_MS` | `2000` | `scripts/dev/smoke-electron-packaged.mjs` | រយៈពេលរង់ចាំឱ្យមានស្ថិរភាព (ms) បន្ទាប់ពីទំព័រផ្ទុករួច។ | | `ELECTRON_SMOKE_APP_EXECUTABLE` | _(ស្វ័យប្រវត្តិ)_ | `scripts/dev/smoke-electron-packaged.mjs` | ផ្លូវជាក់លាក់ទៅកាន់ឯកសារប្រតិបត្តិ Electron ដែលបានវេចខ្ចប់។ | | `ELECTRON_SMOKE_DATA_DIR` | _(tmpdir)_ | `scripts/dev/smoke-electron-packaged.mjs` | ថតទិន្នន័យសម្រាប់ការដំណើរការតេស្ត smoke របស់ Electron។ | | `ELECTRON_SMOKE_KEEP_DATA` | `0` | `scripts/dev/smoke-electron-packaged.mjs` | កំណត់ជា `1` ដើម្បីរក្សាទុកថតទិន្នន័យ smoke បន្ទាប់ពីការដំណើរការ។ | | `ELECTRON_SMOKE_STREAM_LOGS` | `0` | `scripts/dev/smoke-electron-packaged.mjs` | កំណត់ជា `1` ដើម្បីបញ្ជូន Electron logs ជាបន្តបន្ទាប់ទៅ stdout ក្នុងអំឡុងពេលដំណើរការ។ | | `ELECTRON_SMOKE_COLD_RESTART` | `0` | `scripts/dev/smoke-electron-packaged.mjs` | #7592៖ ចាប់ផ្ដើមឡើងវិញដោយប្រើថតទិន្នន័យដដែល ហើយផ្ទៀងផ្ទាត់ថាការបើកដំណើរការលើកទីពីរជ្រើសរើសកម្មវិធីបញ្ជា SQLite ដើមរបស់ប្រព័ន្ធ។ | | `CLI_DEVIN_BIN` | _(ការស្វែងរក PATH)_ | `open-sse/executors/devin-cli.ts` | កំណត់ជាន់លើផ្លូវរបស់ឯកសារប្រតិបត្តិ Devin CLI។ | ### បំពង់ដំណើរការបកប្រែឯកសារ ប្រើដោយ `scripts/i18n/run-translation.mjs` (ពាក្យបញ្ជា `npm run i18n:run`)។ អថេរទាំងប្រាំមិនត្រូវបានកំណត់តាមលំនាំដើមទេ — កំណត់ពួកវាក្នុង `.env` តែលើម៉ាស៊ីន ដែលគួរតែអាចដំណើរការកម្មវិធីបកប្រែឯកសារបានប៉ុណ្ណោះ។ | អថេរ | លំនាំដើម | ឯកសារប្រភព | ការពិពណ៌នា | | ----------------------------------- | --------------- | ---------------------------------- | ---------------------------------------------------------------------- | | `OMNIROUTE_TRANSLATION_API_URL` | _(មិនបានកំណត់)_ | `scripts/i18n/run-translation.mjs` | URL មូលដ្ឋានដែលឆបគ្នាជាមួយ OpenAI សម្រាប់ backend បកប្រែ។ | | `OMNIROUTE_TRANSLATION_API_KEY` | _(មិនបានកំណត់)_ | `scripts/i18n/run-translation.mjs` | Bearer token សម្រាប់ backend បកប្រែ (មិនត្រូវបានកត់ត្រាក្នុង log ឡើយ)។ | | `OMNIROUTE_TRANSLATION_MODEL` | _(មិនបានកំណត់)_ | `scripts/i18n/run-translation.mjs` | លេខសម្គាល់ម៉ូដែល ឧ. `gpt-4o-mini` ឬ `cx/gpt-5.4-mini`។ | | `OMNIROUTE_TRANSLATION_TIMEOUT_MS` | `60000` | `scripts/i18n/run-translation.mjs` | រយៈពេលអតិបរមាសម្រាប់សំណើនីមួយៗ គិតជាមិល្លីវិនាទី។ | | `OMNIROUTE_TRANSLATION_CONCURRENCY` | `4` | `scripts/i18n/run-translation.mjs` | សំណើបកប្រែស្របគ្នា នៅពេលដំណើរការលើឯកសារ / ភាសាតំបន់ច្រើន។ | --- ## 27. មតិព័ត៌មាន Radar (ការបង្ហោះដោយខ្លួនឯង) កម្មវិធីបន្ថែមជាជម្រើសដែលគ្រប់គ្រងដោយទង់មុខងារ RADAR_ENABLED (បិទតាមលំនាំដើម — ជាទង់មុខងារ ដែលបិទ/បើកតាមរយៈ Settings/DB មិនមែនជាអថេរបរិស្ថានទេ; សូមមើល [docs/frameworks/RADAR.md](../frameworks/RADAR.md#flag-radar_enabled-default-off))។ អថេរបួនដំបូងខាងក្រោមគឺជាការកំណត់ជំនួសតាមជម្រើស សម្រាប់មតិព័ត៌មានដែលបង្ហោះដោយខ្លួនឯង ឬបានបំបែកជាសាខា និង លំហូរសោអ្នកគាំទ្រ។ អថេរទីប្រាំ `RADAR_ADMIN_URL` គឺជាតំណដាច់ដោយឡែកដែលគ្មានតម្លៃលំនាំដើម ទៅកាន់ ផ្ទាំងប្រតិបត្តិការឯកជនរបស់ម្ចាស់។ សូមមើល [docs/frameworks/RADAR.md](../frameworks/RADAR.md) សម្រាប់ឯកសារ ម៉ូឌុលពេញលេញ និង [លំដាប់នៃការធ្វើឱ្យសកម្មពីដើមដល់ចប់ និងការរៀបចំដែលមានការណែនាំ](../frameworks/RADAR.md#end-to-end-activation-and-guided-setup)។ កម្មវិធីអានសេចក្តីប្រកាស Home/Changelog ទូទៅ មិនត្រូវបានកំណត់រចនាសម្ព័ន្ធដោយអថេរ បរិស្ថានទេ ហើយក៏មិនពឹងផ្អែកលើទង់មុខងារ RADAR_ENABLED ដែរ។ វាអាន URL `news.json` របស់ឃ្លាំងសាធារណៈ ដែលបានប្រកាសនៅក្នុង `src/shared/utils/releaseNotes.ts` តាមរយៈ GET តែប៉ុណ្ណោះ; ID នៃការបិទចោលនៅតែរក្សាទុកក្នុងឃ្លាំងមូលដ្ឋានរបស់កម្មវិធីរុករក។ | អថេរ | លំនាំដើម | ឯកសារប្រភព | សេចក្តីពិពណ៌នា | | ----------------------------- | -------------------------------------------- | ------------------------------------------------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `RADAR_FEED_URL` | `https://radar.omniroute.online` | `src/lib/radar/{sync,referralsSync,offersSync,intelSync}.ts` | URL មូលដ្ឋានដែលប្រើរួមគ្នាដោយមតិព័ត៌មានកាតាឡុក ការណែនាំ អត្ថប្រយោជន៍សម្រាប់អ្នកគាំទ្រ និង Intel ដែលត្រូវបានចុះហត្ថលេខាដាច់ដោយឡែក។ កំណត់ជំនួសដើម្បីចង្អុលទៅសេវាដែលបង្ហោះដោយខ្លួនឯង ឬបានបំបែកជាសាខា។ | | `RADAR_FEED_PUBKEY` | _(សោលំនាំដើមដែលបានភ្ជាប់ថេរ)_ | `src/lib/radar/pinnedKeys.ts` | សោសាធារណៈ Ed25519 (base64-DER SPKI ឬ PEM) ដែលប្រើដើម្បីផ្ទៀងផ្ទាត់ហត្ថលេខាមតិព័ត៌មានពីមតិព័ត៌មានផ្ទាល់ខ្លួន។ | | `RADAR_CONTRIBUTOR_CLAIM_URL` | `https://radar.omniroute.online/auth/github` | `src/lib/radar/links.ts` | URL ដែលប៊ូតុង "ខ្ញុំជាអ្នករួមចំណែក" នៅលើផ្ទាំងគ្រប់គ្រងបើក (លំហូរទាមទារសោអ្នកគាំទ្រតាម GitHub OAuth)។ | | `RADAR_SUPPORTER_PLANS_URL` | `https://radar.omniroute.online/planos` | `src/lib/radar/links.ts` | URL ដែលប៊ូតុង "គាំទ្រគម្រោង" នៅលើផ្ទាំងគ្រប់គ្រងបើក (ទំព័រទូទាត់ប្រាក់/គម្រោងតម្លៃ)។ | | `RADAR_ADMIN_URL` | _(មិនបានកំណត់)_ | `src/lib/radar/links.ts` | តំណទៅកាន់ផ្ទាំងប្រតិបត្តិការឯកជនសម្រាប់តែម្ចាស់ប៉ុណ្ណោះ។ តម្រូវឱ្យប្រើ HTTPS លើកលែងតែសម្រាប់ HTTP loopback SSH forward; តម្លៃដែលមិនបានកំណត់ ឬមិនត្រឹមត្រូវ នឹងមិនបង្កើតធាតុរុករកទេ។ | --- ## សវនកម្ម៖ អថេរដែលបានលុបចេញ / លែងប្រើ អថេរខាងក្រោមធ្លាប់មាននៅក្នុងកំណែមុនៗនៃ `.env.example` ប៉ុន្តែ **មិនមានសេចក្តីយោងពេលដំណើរការ** នៅក្នុងមូលដ្ឋានកូដបច្ចុប្បន្នទេ។ អថេរទាំងនេះត្រូវបានលុបចេញ៖ | អថេរ | មូលហេតុ | | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `STORAGE_DRIVER=sqlite` | មិនត្រូវបានអានដោយឯកសារកូដប្រភពណាមួយទេ។ SQLite គឺជាដ្រាយវឺរតែមួយគត់ដែលត្រូវបានគាំទ្រ — មិនចាំបាច់ជ្រើសរើសទេ។ | | `INSTANCE_NAME=omniroute` | មាននៅក្នុងឯកសារ និងគំរូបរិស្ថានចាស់ៗ ប៉ុន្តែមិនត្រូវបានប្រើនៅពេលដំណើរការទេ។ វាអាចត្រឡប់មកវិញនៅក្នុងមុខងារពហុអ៊ីនស្តង់នាពេលអនាគត។ | | `SQLITE_MAX_SIZE_MB=2048` | មិនត្រូវបានយោងនៅក្នុងកូដប្រភពទេ។ ទំហំមូលដ្ឋានទិន្នន័យមិនត្រូវបានកំណត់ដោយសិប្បនិម្មិតទេ។ | | `SQLITE_CLEAN_LEGACY_FILES=true` | មិនត្រូវបានយោងនៅក្នុងកូដប្រភពទេ។ ការសម្អាតឯកសារចាស់ៗទំនងជាត្រូវបានដកចេញហើយ។ | | `CLI_ROO_BIN` | មិនត្រូវបានចុះឈ្មោះក្នុង `src/shared/services/cliRuntime.ts` ទេ។ | | `CLI_KIMI_CODING_BIN` | មិនត្រូវបានចុះឈ្មោះក្នុង `src/shared/services/cliRuntime.ts` ទេ (Kimi Coding ប្រើ OAuth មិនមែនឯកសារប្រតិបត្តិ CLI ទេ)។ | | `IFLOW_OAUTH_CLIENT_ID` / `IFLOW_OAUTH_CLIENT_SECRET` | មិនត្រូវបានយោងនៅកន្លែងណាមួយក្នុងកូដប្រភពទេ។ | | `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` | ត្រូវបានដកចេញក្នុង v3.8.0។ ពេលដំណើរការលែងអានអថេរបរិស្ថានទាំងនេះហើយ — ព័ត៌មានសម្គាល់អត្តសញ្ញាណមកពី Dashboard / `data/provider-credentials.json` / DB ដែលបានអ៊ិនគ្រីប។ | | `CURSOR_PROTOBUF_DEBUG` | ត្រូវបានដកចេញក្នុង v3.8.0។ កម្មវិធីប្រតិបត្តិ Cursor ប្រើ `CURSOR_DEBUG` / `CURSOR_STREAM_DEBUG` (សូមមើល §22)។ | | `CLI_COMPAT_KIRO` | ត្រូវបានដកចេញក្នុង v3.8.0។ Kiro ស្ថិតក្នុង `CLI_COMPAT_OMITTED_PROVIDER_IDS` — ប៊ូតុងបិទបើករបស់វាមិនមានឥទ្ធិពលទេ។ | | `QIANFAN_API_KEY` | ត្រូវបានដកចេញរួមជាមួយគំរូទទេនៃ API key របស់អ្នកផ្តល់សេវាផ្សេងទៀតដែលមិនបានប្រើក្នុង v3.8.0។ | ### ការកែតម្រូវតម្លៃលំនាំដើម | អថេរ | តម្លៃ `.env.example` ចាស់ | តម្លៃលំនាំដើមជាក់ស្តែងក្នុងកូដ | បានកែតម្រូវ | | ------------------------- | ------------------------- | ------------------------------ | --------------------------------------------------------------- | | `APP_LOG_RETENTION_DAYS` | `90` | `7` | ✅ បានដកតម្លៃដែលនាំឱ្យយល់ច្រឡំចេញ ហើយចងក្រង `7` ជាតម្លៃលំនាំដើម | | `CALL_LOG_RETENTION_DAYS` | `90` | `7` | ✅ បានដកតម្លៃដែលនាំឱ្យយល់ច្រឡំចេញ ហើយចងក្រង `7` ជាតម្លៃលំនាំដើម | ### ការបង្កើតការកំណត់រចនាសម្ព័ន្ធ OpenCode ឡើងវិញ (ឧបករណ៍ប្រើតាមករណី) ត្រូវបានប្រើដោយ `scripts/ad-hoc/regen-opencode-config.ts` ដើម្បីបង្កើត `opencode.json` ឡើងវិញជាមួយតម្លៃ `limit.context` និង `limit.output` ដែលត្រឹមត្រូវ ដោយទាញយកពីអ៊ីនស្តង់ OmniRoute ដែលកំពុងដំណើរការ។ មិនត្រូវការអថេរទាំងនេះសម្រាប់ប្រតិបត្តិការធម្មតាទេ — ស្គ្រីបនេះ គ្រាន់តែជាឧបករណ៍សម្រាប់អ្នកអភិវឌ្ឍន៍ប៉ុណ្ណោះ។ | អថេរ | លំនាំដើម | ឯកសារប្រភព | ការពិពណ៌នា | | ------------------ | ------------------------ | ----------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------- | | `OMNIROUTE_URL` | `http://localhost:20128` | `scripts/ad-hoc/regen-opencode-config.ts` | URL មូលដ្ឋានរបស់ instance OmniRoute ដែលត្រូវសួររក `/v1/models`។ | | `OMNIROUTE_KEY` | _(មិនបានកំណត់)_ | `scripts/ad-hoc/regen-opencode-config.ts` | API key សម្រាប់ផ្ទៀងផ្ទាត់អត្តសញ្ញាណជាមួយ endpoint `/v1/models` របស់ OmniRoute។ ប្រើ `OPENCODE_API_KEY` ជំនួសវិញ នៅពេលមិនបានកំណត់។ | | `OPENCODE_API_KEY` | _(មិនបានកំណត់)_ | `scripts/ad-hoc/regen-opencode-config.ts` | API key បែប OpenCode (`sk-...`) ដែលត្រូវបានសរសេរទៅក្នុង `opencode.json` ដែលបានបង្កើតឡើងវិញ។ ប្រើ `OMNIROUTE_KEY` ជំនួសវិញ នៅពេលមិនបានកំណត់។ | ### ឧបករណ៍វាយតម្លៃការបង្ហាប់ក្រៅបណ្ដាញ (ឧបករណ៍ ad-hoc) ប្រើដោយ `scripts/compression-eval/index.ts` ដែលជា CLI សម្រាប់វាយតម្លៃការបង្ហាប់ក្រៅបណ្ដាញ។ មិនតម្រូវសម្រាប់ប្រតិបត្តិការធម្មតាទេ — សម្រាប់តែឧបករណ៍អ្នកអភិវឌ្ឍន៍ប៉ុណ្ណោះ។ | អថេរ | លំនាំដើម | ឯកសារប្រភព | ការពិពណ៌នា | | ---------------------------- | ---------- | ----------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `OMNIROUTE_EVAL_CREDENTIALS` | `{}` (ទទេ) | `scripts/compression-eval/index.ts` | ព័ត៌មានសម្ងាត់ JSON ដែលផ្ដល់ដោយប្រតិបត្តិករ សម្រាប់ provider ដែលត្រូវបានប្រើដោយ CLI វាយតម្លៃការបង្ហាប់ក្រៅបណ្ដាញ (ញែកដោយ `JSON.parse`)។ ទុកឱ្យមិនបានកំណត់សម្រាប់ការសាកល្បង dry run។ | ### Session កម្មវិធីរុករក VNC ប្រើដោយ `src/lib/vncSession/manifest.ts` ដើម្បីកំណត់រចនាសម្ព័ន្ធ session Chromium គ្មាន UI ដែលផ្អែកលើ Docker សម្រាប់ provider ស្វ័យប្រវត្តិកម្មកម្មវិធីរុករក។ ទាំងអស់សុទ្ធតែជាជម្រើស — តម្លៃលំនាំដើមត្រូវបានបង្ហាញខាងក្រោម។ | អថេរ | លំនាំដើម | ឯកសារប្រភព | ការពិពណ៌នា | | ------------------------------------- | ------------------------------ | ------------------------------------------- | --------------------------------------------------------------------------------- | | `OMNIROUTE_DOCKER_BIN` | `docker` | `src/lib/vncSession/manifest.ts` | ផ្លូវទៅកាន់ binary របស់ Docker ដែលប្រើដើម្បីបង្កើត container VNC។ | | `OMNIROUTE_VNC_IMAGE` | `omniroute-vnc-chromium:local` | `src/lib/vncSession/manifest.ts` | Docker image សម្រាប់ container VNC Chromium។ | | `OMNIROUTE_VNC_CHROMIUM_ARGS` | _(flag ភ្ជាប់មកជាមួយ)_ | `src/lib/vncSession/manifest.ts` | អាគុយម៉ង់ CLI បន្ថែមរបស់ Chromium ដែលបញ្ជូនទៅកម្មវិធីរុករកនៅក្នុង container។ | | `OMNIROUTE_VNC_CONTAINER_VNC_PORT` | `3000` | `src/lib/vncSession/manifest.ts` | Port VNC នៅក្នុង container។ | | `OMNIROUTE_VNC_CONTAINER_CDP_PORT` | `9223` | `src/lib/vncSession/manifest.ts` | Port Chrome DevTools Protocol នៅក្នុង container។ | | `OMNIROUTE_VNC_CONTAINER_PROFILE_DIR` | `/config` | `src/lib/vncSession/manifest.ts` | ថត profile នៅក្នុង container។ | | `OMNIROUTE_VNC_PROFILE_DIR` | _(មិនបានកំណត់)_ | `src/lib/vncSession/manifest.ts` | ថតនៅខាង host សម្រាប់ profile កម្មវិធីរុករកដែលរក្សាទុកជាអចិន្ត្រៃយ៍។ | | `OMNIROUTE_VNC_IDLE_MS` | `600000` | `src/lib/vncSession/manifest.ts` | រយៈពេលអសកម្មអតិបរមា (ms) មុនពេល session VNC ត្រូវបានប្រមូលយក។ | | `OMNIROUTE_VNC_MAX_MS` | `1800000` | `src/lib/vncSession/manifest.ts` | រយៈពេល session អតិបរមា (ms)។ | | `OMNIROUTE_VNC_MAX_SESSIONS` | `4` | `src/lib/vncSession/manifest.ts` | ចំនួន session VNC ដែលដំណើរការដំណាលគ្នាអតិបរមា។ | | `OMNIROUTE_VNC_READY_MS` | `45000` | `src/lib/vncSession/manifest.ts` | រយៈពេលអតិបរមាសម្រាប់រង់ចាំកម្មវិធីរុករកឱ្យរួចរាល់ (ms)។ | | `OMNIROUTE_VNC_HARVEST_MS` | `20000` | `src/lib/vncSession/manifest.ts` | រយៈពេលអតិបរមាសម្រាប់ការប្រមូលយក/សម្អាត (ms)។ | | `OMNIROUTE_VNC_NETWORK` | `omniroute-vnc-browser-login` | `src/lib/vncSession/manifest.ts` | បណ្ដាញ Docker ដាច់ដោយឡែកដែល container ចូលរួម (#12571) ដោយមិនប្រើ bridge លំនាំដើម។ | | `VIBEPROXY_DATA_DIR` | _(មិនបានកំណត់)_ | `open-sse/services/notionThreadSessions.ts` | ថតសម្រាប់រក្សាទុក session thread របស់ Notion។ | ### ការផ្ទៀងផ្ទាត់អត្តសញ្ញាណសេវាផ្ទៃក្នុង | អថេរ | លំនាំដើម | ការពិពណ៌នា | | --------------------------------------- | -------- | ---------------------------------------------------------------------------------------------------------- | | `OMNIROUTE_INTERNAL_SERVICE_TOKEN` | – | Token ផ្ទាល់សម្រាប់ការផ្ទៀងផ្ទាត់អត្តសញ្ញាណពីសេវាមួយទៅសេវាមួយក្នុង management plane។ | | `OMNIROUTE_INTERNAL_SERVICE_TOKEN_FILE` | – | ផ្លូវទៅកាន់ឯកសារដែលមាន token សេវាផ្ទៃក្នុង (ត្រូវបានណែនាំឱ្យប្រើក្នុង container និងកំណត់ជាន់លើអថេរផ្ទាល់)។ | ### ស្ថិតិ provider របស់ OpenRouter | អថេរ | លំនាំដើម | ការពិពណ៌នា | | ----------------------------------- | --------- | ------------------------------------------------------------------------------------------------------ | | `OPENROUTER_PROVIDER_STATS_ENABLED` | `true` | កំណត់ជា `false` ដើម្បីរំលងការទាញយកស្ថិតិតាម provider របស់ OpenRouter សម្រាប់ការបន្ថែមព័ត៌មានទៅកាតាឡុក។ | | `OPENROUTER_PROVIDER_STATS_TTL_MS` | `3600000` | TTL របស់ cache (ms) សម្រាប់ស្ថិតិ provider របស់ OpenRouter ដែលបានទាញយក។ | ### ការភ្ជាប់ Redis ដែលបានបង្កប់ | អថេរ | តម្លៃលំនាំដើម | សេចក្តីពិពណ៌នា | | --------------------------- | ------------- | ----------------------------------------------------------------------------------- | | `REDIS_BIND_HOST` | `127.0.0.1` | អាសយដ្ឋាន bind សម្រាប់សេវា Redis ដែលបានបង្កប់។ | | `REDIS_PORT` | `6379` | ច្រកសម្រាប់សេវា Redis ដែលបានបង្កប់។ | | `OMNIROUTE_REDIS_BIND_HOST` | – | ការកំណត់ជំនួសក្នុងវិសាលភាព OmniRoute សម្រាប់អាសយដ្ឋាន bind របស់ Redis ដែលបានបង្កប់។ | --- ## 24. ការបន្ថែមក្នុងការចេញផ្សាយ v3.8.50 ការកំណត់ទាំងនេះត្រូវបានបន្ថែមបន្ទាប់ពី snapshot នៃ environment contract មុន។ | អថេរ | លំនាំដើម | ឯកសារប្រភព | សេចក្ដីពិពណ៌នា | | ------------------------------------------- | -------------------------- | ---------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `OMNIROUTE_CHAT_ADMISSION_QUEUE_MS` | `2000` | `src/shared/middleware/chatBodyAdmission.ts` | រយៈពេលរង់ចាំអតិបរមាសម្រាប់ស្លុតអនុញ្ញាត chat ដែលប្រើធនធានច្រើន មុនពេលទទួលបាន `503` ដែលអាចសាកល្បងម្ដងទៀតបាន។ ការរង់ចាំខ្លីដែលមានដែនកំណត់នឹងដំណើរការសំណើច្រើនភ្លាមៗរបស់ agent ជាលំដាប់ ជំនួសឱ្យការផ្ដល់ `503` ភ្លាមៗ។ `0` ស្ដារការបដិសេធភ្លាមៗ។ | | `OMNIROUTE_CHAT_ADMISSION_MAX_QUEUED_BYTES` | `4194304` (4 MB) | `src/shared/middleware/chatBodyAdmission.ts` | កញ្ចប់ថវិកាបៃដែលបានដាក់ជាជួរសម្រាប់ការរង់ចាំការអនុញ្ញាត៖ កំណត់ចំនួនសរុបនៃបៃ body ដែលបានផ្ទុកបណ្ដោះអាសន្នទូទាំង process ដើម្បីកុំឱ្យការរង់ចាំបង្កើនការប្រើប្រាស់ heap (#4380)។ ការរង់ចាំដែលលើសកញ្ចប់ថវិកានឹងទទួលបាន `503` ដែលអាចសាកល្បងម្ដងទៀតបានភ្លាមៗ។ | | `OMNIROUTE_CHAT_VIRTUAL_TTL_MS` | `60000` (60 វិ.) | `src/shared/middleware/chatBodyAdmission.ts` | មិនត្រូវបានណែនាំឱ្យប្រើ និងគ្មានប្រសិទ្ធភាពចាប់តាំងពី #10110៖ lane អនុញ្ញាតតាម session ត្រូវបានលុបចេញ ដោយជំនួសជាមួយកញ្ចប់ថវិកាមួយសម្រាប់ process ទាំងមូល។ ត្រូវបានទទួលយកសម្រាប់ភាពត្រូវគ្នានៃការកំណត់រចនាសម្ព័ន្ធ ប៉ុន្តែមិនត្រូវបានប្រើទេ។ | | `OMNIROUTE_CHAT_VIRTUAL_MAX_SESSIONS` | `64` | `src/shared/middleware/chatBodyAdmission.ts` | មិនត្រូវបានណែនាំឱ្យប្រើ និងគ្មានប្រសិទ្ធភាពចាប់តាំងពី #10110៖ lane អនុញ្ញាតតាម session ត្រូវបានលុបចេញ ដោយជំនួសជាមួយកញ្ចប់ថវិកាមួយសម្រាប់ process ទាំងមូល។ ត្រូវបានទទួលយកសម្រាប់ភាពត្រូវគ្នានៃការកំណត់រចនាសម្ព័ន្ធ ប៉ុន្តែមិនត្រូវបានប្រើទេ។ | | `OMNIROUTE_CHAT_VIRTUAL_LANES` | `0` (បិទ) | `open-sse/services/admission/runtime.ts` | lane អនុញ្ញាតនិម្មិតបែបសម្របខ្លួននៅពេលដំណើរការ (#9654)៖ កុងតាក់មេសម្រាប់របាំងសម្របខ្លួនតាម tenant (ប្រព័ន្ធ 2)។ ខុសពីអថេរ lane តាម connection ដែលលែងត្រូវបានណែនាំឱ្យប្រើនៅខាងលើ (TTL_MS / MAX_SESSIONS ដែលគ្មានប្រសិទ្ធភាពចាប់តាំងពី #10110)។ feature flag នៅក្នុង dashboard ដែលមានឈ្មោះដូចគ្នា។ អថេរ env មានអាទិភាពលើការកំណត់ជាន់គ្នាពី dashboard ហើយតម្រូវឱ្យចាប់ផ្ដើមឡើងវិញ។ | | `OMNIROUTE_RUNNOW_TIMEOUT_MS` | `30000` | `src/app/api/jobs/[id]/run-now/route.ts` | កំណត់រយៈពេលដែលការហៅ run-now រង់ចាំ job ដែលកំពុងដំណើរការ មុនពេលចាប់ផ្ដើមការដំណើរការដែលបានដាក់ជាជួរ។ | | `ADOBE_FIREFLY_BROWSER_REFRESH` | បានបើក | `open-sse/services/adobeFireflySession.ts` | រក្សាស្ថានភាព IMS និងហានិភ័យ browser ឱ្យនៅថ្មីតាមរយៈ session Chrome CDP ដែលមានវិសាលភាពតាម account។ កំណត់ជា `0` ដើម្បីបិទ។ | | `ADOBE_FIREFLY_SESSION_DISK` | បានបើក | `open-sse/services/adobeFireflySession.ts` | រក្សាទុក session Adobe ដែលបានជួសជុលនៅក្រោម `DATA_DIR`។ កំណត់ជា `0` ដើម្បីរក្សាទុកស្ថានភាពតែក្នុង memory។ | | `ADOBE_FIREFLY_MIN_SUBMIT_GAP_MS` | `12000` | `open-sse/services/adobeFireflySession.ts` | ចន្លោះពេលអប្បបរមារវាងការដាក់សំណើ generate របស់ Adobe Firefly។ | | `ADOBE_FIREFLY_BATCH_EXTRA_GAP_MS` | `15000` | `open-sse/services/adobeFireflySession.ts` | រយៈពេលស្ងាត់បន្ថែមបន្ទាប់ពីការដាក់សំណើ Adobe ដោយជោគជ័យរៀងរាល់លើកទីបី។ | | `ADOBE_FIREFLY_CHROME_HEADLESS` | `0` | `open-sse/services/adobeFireflyBrowserLogin.ts` | មុខងារ true-headless សម្រាប់តែការបំបាត់កំហុស។ ជាធម្មតា Adobe colligo បដិសេធ session ហានិភ័យដែលកើតចេញពីវា។ | | `CHROME_PATH` | រកឃើញដោយស្វ័យប្រវត្តិ | `open-sse/executors/cloudflare-playground.ts`, `open-sse/executors/chatgpt-web-codex.ts` | ទីតាំង absolute ជាជម្រើសសម្រាប់ executable របស់ Chrome ដែល executor ដំណើរការតាម browser ប្រើ នៅពេលការរកឃើញ platform ដោយស្វ័យប្រវត្តិមិនគ្រប់គ្រាន់។ | | `TELEGRAM_BOT_TOKEN` | _(មិនបានកំណត់)_ | `src/lib/telegram/config.ts` | token ពី BotFather ដែលបើក inbound webhook និងចុះហត្ថលេខាលើ `initData` របស់ Mini App។ | | `TELEGRAM_WEBHOOK_SECRET` | _(មិនបានកំណត់)_ | `src/lib/telegram/config.ts` | secret រួមដែលបានចុះឈ្មោះតាមរយៈ `setWebhook` និងត្រូវបានផ្ទៀងផ្ទាត់ជាមួយ header `X-Telegram-Bot-Api-Secret-Token` រាល់ពេលបញ្ជូន webhook។ ចាំបាច់សម្រាប់ path របស់ webhook។ បើមិនបានកំណត់ ការបញ្ជូន webhook នឹងត្រូវបានបដិសេធដោយ 503។ | | `TELEGRAM_DEFAULT_MODEL` | `auto/chat` | `src/lib/telegram/chatProxy.ts` | model ដែលប្រើសម្រាប់ការឆ្លើយតបក្នុង Telegram chat។ | | `TELEGRAM_BOT_API_BASE` | `https://api.telegram.org` | `src/lib/telegram/config.ts` | ការកំណត់ជាន់លើ URL មូលដ្ឋានរបស់ Bot API សម្រាប់ proxy ឬ server Bot API ដែលបង្ហោះដោយខ្លួនឯង។ | | `TELEGRAM_WEBHOOK_TIMEOUT_MS` | `60000` | `src/lib/telegram/config.ts` | timeout គិតជាមិល្លីវិនាទីសម្រាប់ការហៅ Bot API ចេញទៅក្រៅ។ | | `OMNIROUTE_OPTIONAL_PACK_TAR` | `1` (បានបើក) | `scripts/build/optionalPackStaging.mjs` | កំណត់ជា `0` ដើម្បីរំលងការបង្កើត tarball `.tar.gz` ខណៈពេលរៀបចំ pack ML/browser ជាជម្រើសសម្រាប់ tree Electron standalone (ថត pack និង `optional-packs.index.json` នៅតែត្រូវបានបង្កើត)។ ត្រូវបានប្រើដោយ workflow ចេញផ្សាយសម្រាប់ desktop ដើម្បីកាត់បន្ថយទំហំ artifact ដែលត្រូវ upload។ | | `GROK_SUBSCRIPTION_IMAGES_ENABLED` | `false` | `open-sse/config/imageRegistry.ts` | បើកការចុះឈ្មោះ route រូបភាពសម្រាប់ការជាវ xAI។ បានបិទតាមលំនាំដើម ដើម្បីឱ្យ path រូបភាពដែលប្រើ API key នៅដដែល។ | | `OMNIROUTE_API_KEY_COOLDOWN_MS` | `60000` | `open-sse/services/apiKeyRotator.ts` | រយៈពេល cooldown គិតជាមិល្លីវិនាទីសម្រាប់ key នីមួយៗ នៅពេល response `429` មិនមានតម្រុយ `Retry-After` ដែលអាចប្រើបាន។ | | `OMNIROUTE_ESTIMATOR_CALIBRATION` | បានបើក | `open-sse/services/estimatorCalibration.ts` | កំណត់ជា `off`, `0` ឬ `false` ដើម្បីបិទការកត់ត្រា និងការអនុវត្ត calibration របស់ estimator ក្នុង memory។ | | `NEXT_MANUAL_SIG_HANDLE` | _(ខាងក្នុង)_ | `scripts/dev/standalone-server-ws.mjs` | ការកំណត់ជាន់លើ signal handler ខាងក្នុងរបស់ standalone server។ ជាធម្មតា ត្រូវបានកំណត់ និងសម្អាតដោយ launcher ជំនួសឱ្យការកំណត់ដោយ operator។ | ### ChatGPT Web (Codex) លំនាំដើមសកលសម្រាប់ browser headless និង tunnel ឧបករណ៍ចេញទៅក្រៅ។ តម្លៃ connection ដែលបានកំណត់នៅក្នុង dashboard មានអាទិភាព។ | អថេរ | តម្លៃលំនាំដើម | ឯកសារប្រភព | សេចក្ដីពិពណ៌នា | | --------------------------------------- | ------------------------------ | -------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `CHATGPT_WEB_CODEX_CHROME_PATH` | _(រកឃើញដោយស្វ័យប្រវត្តិ)_ | `open-sse/executors/chatgpt-web-codex.ts` | ផ្លូវ Chrome/Chromium ដែលបានបញ្ជាក់យ៉ាងច្បាស់សម្រាប់ប្រតិបត្តិការតាម npm, systemd និង PM2។ | | `CHROME_PATH` | _(រកឃើញដោយស្វ័យប្រវត្តិ)_ | `open-sse/executors/chatgpt-web-codex.ts` | តម្លៃបម្រុងរួមសម្រាប់ផ្លូវ Chrome/Chromium ដែលបានបញ្ជាក់យ៉ាងច្បាស់។ | | `CHATGPT_WEB_CODEX_CDP_URL` | _(មិនបានកំណត់)_ | `open-sse/executors/chatgpt-web-codex.ts` | ចំណុចចុង CDP ខាងក្នុង; Docker ប្រើ Sidecar នៅលើច្រក `9223`។ | | `CDP_PROXY_TOKEN` | _(មិនបានកំណត់)_ | `docker/chatgpt-web-codex-browser/cdp-proxy.mjs` | ប្រសិនបើបានកំណត់ រាល់សំណើទៅកាន់ CDP Proxy Sidecar ត្រូវតែភ្ជាប់តម្លៃនេះក្នុង Header `X-Omni-Cdp-Token` (#13679)។ បើគ្មានតម្លៃ Proxy នឹងបញ្ជូនបន្តដោយគ្មានការផ្ទៀងផ្ទាត់អត្តសញ្ញាណ — ក្នុងករណីនេះ មានតែការញែកបណ្ដាញរបស់ Compose Network `chatgpt-web-codex-net` ប៉ុណ្ណោះដែលផ្ដល់ការការពារ។ បង្កើតដោយប្រើ `openssl rand -hex 32`។ | | `CHATGPT_WEB_CODEX_TUNNEL_ID` | _(មិនបានកំណត់)_ | `open-sse/executors/chatgpt-web-codex.ts` | OpenAI Tunnel ID សកលសម្រាប់វគ្គដំណើរការ Codex Tool មូលដ្ឋាន។ | | `CHATGPT_WEB_CODEX_RUNTIME_KEY` | _(មិនបានកំណត់)_ | `open-sse/executors/chatgpt-web-codex.ts` | Tunnel Runtime Key សកល; កុំបង្ហាញក្នុង Log ឱ្យសោះ។ | | `CHATGPT_WEB_CODEX_CONNECTOR_NAME` | `OmniRoute Codex v2` | `open-sse/executors/chatgpt-web-codex.ts` | ឈ្មោះពិតប្រាកដរបស់ ChatGPT Custom Connector ដែលបានបង្កើតថ្មីសម្រាប់ MCP Bridge។ | | `CODEX_CHATGPT_WEB_HOME` | `/chatgpt-web-codex` | `open-sse/vendor/codex-chatgpt-web/config.ts` | ថតឯកសារដាច់ដោយឡែកសម្រាប់ស្ថានភាព Browser, Broker និង Tunnel។ | | `CODEX_CHATGPT_WEB_BROWSER_DIAGNOSTICS` | `0` | `open-sse/vendor/codex-chatgpt-web/adapters/chatgpt-web/browser-worker.ts` | នៅពេលកំណត់ជា `1` រូបភាពវិនិច្ឆ័យ Browser នឹងត្រូវបានថតនៅគ្រប់ Checkpoint។ | | `CODEX_CHATGPT_WEB_LAUNCHER` | _(មិនបានកំណត់)_ | `open-sse/vendor/codex-chatgpt-web/config.ts` | ផ្លូវដាច់ខាតជាជម្រើសទៅកាន់ Launcher Binary អចិន្ត្រៃយ៍។ | | `CODEX_CHATGPT_WEB_BUN` | _(រកឃើញដោយស្វ័យប្រវត្តិ)_ | `open-sse/vendor/codex-chatgpt-web/config.ts` | ផ្លូវដាច់ខាតជាជម្រើសទៅកាន់ Bun Runtime Binary។ | | `CODEX_WEB_GPT_BUN` | _(មិនបានកំណត់)_ | `open-sse/vendor/codex-chatgpt-web/config.ts` | តម្លៃបម្រុងចាស់សម្រាប់ `CODEX_CHATGPT_WEB_BUN`; ការដំឡើងថ្មីប្រើឈ្មោះស្តង់ដារ។ | --- ## ស្ពាន OmniConductor កម្មវិធីប្រើប្រាស់ SSE ដែលដំណើរការរយៈពេលវែង និងចម្លង task របស់ OmniConductor hub ទៅកាន់ A2A TaskManager មូលដ្ឋាន (`src/lib/conductor/`)។ ជាជម្រើសបើកប្រើ — ស្ពានចាប់ផ្ដើមតែនៅពេលកំណត់ `CONDUCTOR_HUB_URL` ប៉ុណ្ណោះ។ សម្រាប់តែផ្នែក server៖ token របស់ hub មិនត្រូវទៅដល់ browser ជាដាច់ខាត។ | អថេរ | លំនាំដើម | ឯកសារប្រភព | សេចក្ដីពិពណ៌នា | | ------------------------------ | ----------------------- | -------------------------------- | -------------------------------------------------------------------------------------------------------------------------------- | | `CONDUCTOR_HUB_URL` | _(ទទេ)_ | `src/lib/conductor/boot.ts` | URL មូលដ្ឋានរបស់ OmniConductor hub (ឧ. `http://127.0.0.1:7910`)។ មិនបានកំណត់ = បិទស្ពាន។ | | `CONDUCTOR_HUB_TOKEN` | _(ទទេ)_ | `src/lib/conductor/boot.ts` | ព័ត៌មានសម្គាល់អត្តសញ្ញាណ hub សម្រាប់ SSE feed — បង្កើត peer ប្រភេទ `spokesperson` នៅលើ hub (`POST /v1/peers`, admin)។ | | `CONDUCTOR_ORCHESTRATOR_TOKEN` | _(ទទេ)_ | `src/lib/conductor/hubProxy.ts` | ព័ត៌មានសម្គាល់អត្តសញ្ញាណសម្រាប់ការផ្ទេរ task ចូលពី A2A→hub (`POST /v1/tasks`); ប្រើ `CONDUCTOR_HUB_TOKEN` ជំនួសនៅពេលមិនបានកំណត់។ | | `CONDUCTOR_SPOKESPERSON_URL` | `http://127.0.0.1:7920` | `src/lib/conductor/faroProxy.ts` | URL មូលដ្ឋានរបស់សេវា spokesperson (Faro) ដែលនៅពីក្រោយ dashboard chat proxy (`/api/conductor/ask`)។ | ### ការកំណត់កាលវិភាគដោយគិតគូរអំពីកូតា ប្រើដោយ `open-sse/services/combo.ts` និង `src/lib/quota/quotaScheduler.ts` សម្រាប់ការត្រួតពិនិត្យថវិកា token មុនពេលបញ្ជូនសំណើ។ ជាជម្រើសបើកប្រើ — ឥរិយាបថ routing លំនាំដើមមិនផ្លាស់ប្ដូរទេនៅពេលមិនបានកំណត់។ | អថេរ | លំនាំដើម | ឯកសារប្រភព | សេចក្ដីពិពណ៌នា | | ---------------------------------- | -------- | ------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | `OMNIROUTE_QUOTA_AWARE_ROUTING` | `0` | `open-sse/services/combo.ts` | នៅពេលជា `1` រំលង connection ដែលថវិកា token ក្នុងមួយ window របស់វា (`rateLimitOverrides.tpm`, តារាង `provider_quota_state`) មិនអាចរ៉ាប់រងថ្លៃដើមសំណើដែលបានប៉ាន់ស្មានមុនពេលបញ្ជូន។ អនុញ្ញាតឱ្យដំណើរការបន្តនៅពេលគ្មានថវិកាត្រូវបានកំណត់។ | | `OMNIROUTE_ESTIMATOR_CALIBRATION` | _(បើក)_ | `open-sse/services/estimatorCalibration.ts` | ការក្រិតតម្រូវតាមមតិត្រឡប់របស់កម្មវិធីប៉ាន់ស្មាន token ការពារ context (#14931)៖ EMA តាម (provider, model, វត្តមាន tools) នៃ `usage.prompt_tokens` / ការប៉ាន់ស្មាន ដោយកំណត់ចន្លោះពី 0.15–2.0 និងរក្សាទុកតែក្នុង memory។ `off`, `0` ឬ `false` បិទការកត់ត្រា និងការអនុវត្ត។ | | `GROK_SUBSCRIPTION_IMAGES_ENABLED` | `false` | `open-sse/config/imageRegistry.ts` | ចុះបញ្ជី image route របស់ `xai-oauth` (`xao`) និង `grok-cli`។ feature flag របស់ dashboard ដែលមានឈ្មោះដូចគ្នា; DB override មានអាទិភាពលើតម្លៃនេះ។ |