# 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. ប្រូកស៊ីចេញក្រៅ](#8-outbound-proxy) - [9. ការរួមបញ្ចូលឧបករណ៍ CLI](#9-cli-tool-integration) - [10. ភ្នាក់ងារខាងក្នុង និងការរួមបញ្ចូល MCP](#10-internal-agent--mcp-integrations) - [11. ព័ត៌មានសម្គាល់អ្នកផ្ដល់ OAuth](#11-oauth-provider-credentials) - [12. ការកំណត់ជំនួស User-Agent តាមអ្នកផ្ដល់](#12-provider-user-agent-overrides) - [13. ភាពឆបគ្នានៃស្នាមម្រាមដៃ 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. សុខភាពប្រូកស៊ី](#21-proxy-health) - [22. ការកែស្វែងរកបញ្ហា](#22-debugging) - [23. ការរួមបញ្ចូល GitHub](#23-github-integration) - [24. ប្រអប់ខ្សាច់ជំនាញ (v3.8.0+)](#24-skills-sandbox-v380) - [27. មតិព័ត៌មាន Radar (ការបង្ហោះដោយខ្លួនឯង)](#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` ទេ — ចំណុចចាប់ផ្ដើមម៉ាស៊ីនមេនឹងបង្កើតតម្លៃបណ្ដោះអាសន្នសម្រាប់ការចាប់ផ្ដើមនីមួយៗ ដែលមានតែ bridge ក្នុងដំណើរការតែមួយប៉ុណ្ណោះអាចប្រើបាន ដូច្នេះកម្មវិធី bridge ខាងក្រៅត្រូវតែកំណត់វាយ៉ាងច្បាស់លាស់។ | អថេរ | ចាំបាច់ | លំនាំដើម | ឯកសារប្រភព | ពិពណ៌នា | | ---------------------------- | ------------------ | ----------------- | --------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `JWT_SECRET` | **បាទ** | _(គ្មាន)_ | `src/lib/auth` | ចុះហត្ថលេខា/ផ្ទៀងផ្ទាត់ខូគីសម័យរបស់ផ្ទាំងគ្រប់គ្រងទាំងអស់ (JWT)។ បង្កើតដោយប្រើ `openssl rand -base64 48`។ | | `API_KEY_SECRET` | **បាទ** | _(គ្មាន)_ | `src/lib/db/apiKeys.ts` | សោអ៊ិនគ្រីប AES សម្រាប់តម្លៃសោ API ដែលរក្សាទុកក្នុង SQLite។ បង្កើតដោយប្រើ `openssl rand -hex 32`។ | | `INITIAL_PASSWORD` | ទេ | _(មិនបានកំណត់)_ | `src/lib/auth/managementPassword.ts` | កំណត់ពាក្យសម្ងាត់ផ្ទាំងគ្រប់គ្រងនៅពេលចាប់ផ្ដើម ខណៈពេលមិនទាន់មានពាក្យសម្ងាត់ត្រូវបានរក្សាទុក។ វាត្រូវបានមិនអើពើ បន្ទាប់ពីមានពាក្យសម្ងាត់ត្រូវបានរក្សាទុក។ ការដំឡើងតាម npm និង source នឹងចម្លង `.env.example` ទៅ `.env` ដូច្នេះវាចាប់ផ្ដើមជាមួយតម្លៃកន្លែងដាក់ដែលគេស្គាល់ជាសាធារណៈរបស់វា `CHANGEME`៖ ជំនួសវាមុនពេលចាប់ផ្ដើមលើកដំបូង ឬកំណត់ `INITIAL_PASSWORD=` (ទទេ) ក្នុង `.env` នោះ ដើម្បីបង្កើតពាក្យសម្ងាត់នៅក្នុងអ្នកជំនួយការចាប់ផ្ដើម នៅពេលចូលមើលលើកដំបូង ដូចដែលតម្លៃដែលមិនបានកំណត់ (លំនាំដើមរបស់ Docker image) ធ្វើដែរ។ ប្ដូរពាក្យសម្ងាត់ដែលបានរក្សាទុកនៅក្នុង ផ្ទាំងគ្រប់គ្រង → ការកំណត់ → សុវត្ថិភាព ឬដំណើរការ `omniroute reset-password` (`node bin/reset-password.mjs` នៅក្នុង source checkout) ដោយកំណត់ `DATA_DIR` ទៅកាន់ថតទិន្នន័យរបស់ម៉ាស៊ីនមេ។ | | `OMNIROUTE_WS_BRIDGE_SECRET` | **បាទ** (ផលិតកម្ម) | _(មិនបានកំណត់)_ | `src/app/api/internal/codex-responses-ws/route.ts` | សោសម្ងាត់រួមសម្រាប់ស្ពាន WebSocket ឆ្លើយតប Codex ខាងក្នុង។ ផ្ទៀងផ្ទាត់សំណើស្ពានរវាង Electron/browser WS relay និង OmniRoute។ ⚠️ **ចាំបាច់ក្នុងផលិតកម្ម — នៅពេលមិនបានកំណត់ សំណើស្ពាន WS ទាំងអស់នឹងត្រូវបានបដិសេធ។** បង្កើតដោយប្រើ `openssl rand -base64 32`។ | | `OMNIROUTE_SW_BUILD_ID` | ទេ | _(git SHA)_ | `next.config.mjs`, `scripts/build/assembleStandalone.mjs` | លេខសម្គាល់សម្រាប់បំបាត់ឃ្លាំងសម្ងាត់របស់ service worker របស់សែល PWA យ៉ាងជាក់លាក់ (#11779)។ វាស្ថិតនៅដំបូងក្នុងខ្សែសង្វាក់ដោះស្រាយ។ | | `SOURCE_VERSION` | ទេ | _(មិនបានកំណត់)_ | `next.config.mjs`, `scripts/build/assembleStandalone.mjs` | ទីពីរក្នុងខ្សែសង្វាក់ — កំណត់ដោយ PaaS builders (ឧ. រចនាប័ទ្ម Heroku) ជា commit ដែលបានដាក់ឱ្យប្រើប្រាស់។ | | `NEXT_PUBLIC_SW_BUILD_ID` | ទេ | _(derived)_ | `src/shared/components/PwaRegister.tsx` | តម្លៃសាធារណៈពេល build ដែល client ប្រើដើម្បីចុះឈ្មោះ `/sw.js?v=…`; បានមកពីពីរតម្លៃខាងលើ បន្ទាប់មកពី git SHA។ | | `OMNIROUTE_PEER_STAMP_TOKEN` | ទេ (ស្វ័យប្រវត្តិ) | _(auto per boot)_ | `src/server/authz/policies/management.ts` | សម្ងាត់តាម process សម្រាប់បញ្ជាក់ថា peer-IP stamp ដែលទុកចិត្តបាន មកពី HTTP server ផ្ទាល់របស់ OmniRoute (`scripts/dev/peer-stamp.mjs`)។ authz middleware ទុកចិត្តលើទីតាំងក្នុងតំបន់នៃសំណើ (ការអនុញ្ញាត loopback/LAN សម្រាប់ routes LOCAL_ONLY) តែនៅពេល stamp មាន token នេះប៉ុណ្ណោះ។ វាត្រូវបានបង្កើតដោយស្វ័យប្រវត្តិនៅរាល់ការចាប់ផ្ដើម — ទុកឱ្យមិនកំណត់តម្លៃ; កំណត់វាថេរតែសម្រាប់ការរៀបចំដែលមានច្រើន process និងត្រូវចែករំលែក stamp ប៉ុណ្ណោះ។ | | `OMNIROUTE_TRUSTED_PROXIES` | ទេ | _(unset)_ | `scripts/dev/peer-stamp.mjs` | IP ឬជួរ CIDR របស់ reverse proxies ដែលបញ្ជីអនុញ្ញាត/បដិសេធ IP អាចជឿទុកចិត្តលើ `X-Forwarded-For` / `X-Real-IP` របស់ពួកវា បន្ថែមលើអាសយដ្ឋាន loopback បណ្ដាញឯកជន និង Cloudflare edges ដែលតែងតែទុកចិត្ត។ ត្រូវការតែសម្រាប់ proxy ដែលស្ថិតនៅអាសយដ្ឋានសាធារណៈផ្សេងទៀតប៉ុណ្ណោះ; បើមិនដូច្នោះទេ អាសយដ្ឋានផ្ទាល់របស់ proxy នោះជាអ្វីដែល filter ប្រើវិនិច្ឆ័យ។ ការកំណត់ល្បឿនតាម client របស់ relay (`/api/v1/relay/chat/completions`) ប្រើអាសយដ្ឋាន client ដែលបានដោះស្រាយដូចគ្នា មិនដែលប្រើតែ forwarding headers ឡើយ។ | ### ពាក្យបញ្ជាបង្កើត ```bash # បង្កើត secrets ទាំងបួនក្នុងពេលតែមួយ៖ 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` ដែលមាន secrets ពិតទៅក្នុង version control ជាដាច់ខាត។ `.gitignore` បានមិនរាប់បញ្ចូល `.env` រួចហើយ ប៉ុន្តែត្រូវផ្ទៀងផ្ទាត់មុនពេល push។ --- ## 2. ឃ្លាំងផ្ទុកទិន្នន័យ និងមូលដ្ឋានទិន្នន័យ OmniRoute ប្រើ **SQLite** (តាមរយៈ `better-sqlite3`) សម្រាប់ការរក្សាទុកទិន្នន័យទាំងអស់។ អថេរទាំងនេះគ្រប់គ្រងទីតាំងទិន្នន័យ ការអ៊ិនគ្រីប និងវដ្តជីវិត។ | Variable | Default | Source File | Description | | ------------------------------------------ | ----------------------------- | ----------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `DATA_DIR` | `~/.omniroute/` | `src/lib/db/core.ts` | ថតឫសសម្រាប់ SQLite DB ឯកសារបម្រុងទុក និងឯកសារទិន្នន័យ។ ប្តូរតម្លៃនេះសម្រាប់ Docker volumes ឬផ្លូវផ្ទាល់ខ្លួន។ | | `OMNIROUTE_ALLOW_DEFAULT_DATA_DIR` | _(មិនបានកំណត់)_ | `src/lib/dataPaths.ts` | ច្រកសម្រាប់រំលងការការពារ DATA_DIR សម្រាប់ការធ្វើតេស្ត/វាយតម្លៃ (#10428)។ ការធ្វើតេស្ត និងការស្ទង់មតិ Node eval/print (`-e`/`--eval`/`-p`/`--print` រួមទាំងទម្រង់ `--eval=`/`--print=`) ដែលគ្មាន `DATA_DIR` នឹងត្រូវបញ្ជូនទៅថត temp បោះចោល ដើម្បីការពារមិនឱ្យវាបើកមូលដ្ឋានទិន្នន័យពិតរបស់ប្រតិបត្តិករ។ កំណត់តម្លៃជា `1` ដើម្បីជ្រើសរើសប្រើថតពិតវិញ។ | | `OMNIROUTE_BUILD_SHA` | _(មិនបានកំណត់)_ | `src/lib/monitoring/buildSha.ts` | Git SHA របស់ artifact ដែលកំពុងដំណើរការ។ ត្រូវបានបញ្ចូលដោយ `npm run build:release`។ អាចបញ្ចូលក្នុង containers ដែលដាក់ជាមួយដោយគ្មាន sentinel `dist/BUILD_SHA`។ ត្រូវបានបង្ហាញជា `system.buildSha` នៅលើ `/api/monitoring/health`។ | | `OMNIROUTE_RELEASE_REF` | `origin/main` | `scripts/build/buildProvenance.ts` | Ref ដែល provenance gate របស់ pack-artifact ពិនិត្យ SHA របស់ build ទល់នឹង (#10427)។ | | `OMNIROUTE_ALLOW_CANARY_BUILD` | _(មិនបានកំណត់)_ | `scripts/build/buildProvenance.ts` | កំណត់តម្លៃជា `1` ដើម្បីអនុញ្ញាតឱ្យវេចខ្ចប់ build ដែល SHA របស់វាមិនស្ថិតនៅលើ release line ដោយកត់ត្រាវាជា canary ដែលបានជ្រើសរើសដោយចេតនា ជំនួសឱ្យបរាជ័យនៅ gate (#10427)។ | | `OMNIROUTE_SMOKE_API_KEY` | _(unset)_ | `scripts/ops/deploy-canary.mjs` | គន្លឹះ API សម្រាប់ smoke probe នៃ canary-deploy ដែលផ្ញើជា `Authorization: Bearer` ទៅកាន់ `/v1/chat/completions`។ ប្រើតែដោយស្គ្រីប deploy ប៉ុណ្ណោះ (#10429) មិនដែលប្រើដោយ server ទេ។ មិនពាក់ព័ន្ធនឹងអថេរ `OMNIROUTE_SMOKE_*` របស់ opt-in 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 Integrations → Real smoke sweep](../guides/CLI-INTEGRATIONS.md)។ | | `OMNIROUTE_BUILDING` | _(unset)_ | `src/lib/buildPhase.ts` | សញ្ញាសម្គាល់ដំណាក់កាល build (#10060): កំណត់ជា `1` ដោយ `scripts/build/build-next-isolated.mjs` ហើយទទួលបន្តដោយ build worker ទាំងអស់ដែលបានបង្កើត ដើម្បីឱ្យស្រទាប់ DB ត្រឡប់ stub ដែលមិនធ្វើអ្វី ជំនួសឱ្យការផ្ទុក native better-sqlite3 addon (ដែលធ្វើឱ្យ worker បញ្ចប់ដោយបង្ខំនៅពេលចេញ)។ មិនដែលកំណត់សម្រាប់ server ដែលកំពុងដំណើរការទេ។ | | `OMNIROUTE_SKIP_NATIVE_DEP_CHECK` | `0` | `scripts/check/check-native-deps.mjs` | កំណត់ជា `1` ដើម្បីរំលងការត្រួតពិនិត្យ prebuild នៃ native dependency ជាជម្រើស សម្រាប់ vendor tree ពិសេសៗ។ វាមិនធ្វើឱ្យ dependency ដែលបាត់អាច build បានទេ; ប្រើតែនៅពេល native dependencies ត្រូវបានផ្គត់ផ្គង់ពីក្រៅប៉ុណ្ណោះ។ | | `OMNIROUTE_DATA_DIR` | _(unset)_ | `open-sse/executors/promptql/threadSticky.ts` | **Alias ជំនួស** សម្រាប់ `DATA_DIR` ដែលត្រូវបានពិនិត្យតែនៅពេល `DATA_DIR` មិនត្រូវបានកំណត់។ ប្រើសម្រាប់កំណត់ទីតាំង on-disk thread-sticky session cache របស់ PromptQL executor (`/promptql-thread-sessions.json`); ប្រសិនបើគ្មានអថេរណាមួយត្រូវបានកំណត់ cache នឹងស្ថិតតែក្នុង memory ប៉ុណ្ណោះ (មិនត្រូវបានរក្សាទុកបន្តក្រោយការចាប់ផ្តើមឡើងវិញទេ)។ | | `OMNIROUTE_PLUGINS_DIR` | _(unset)_ | `src/lib/plugins/scanner.ts` | ថតដែល **runtime plugin scanner** អាន — និងជា root ដែល plugin manager ដំឡើងចូល — ដោយបដិសេធតម្លៃ default ដែលបានមកពី home (#11827)។ កំណត់វាទៅកាន់ plugin tree ដែលបាន bind-mount ក្នុង Docker/K8s ជំនួសឱ្យការផ្លាស់ទី HOME គ្រាន់តែដើម្បីផ្លាស់ទី scan path (HOME គ្រប់គ្រងឥរិយាបថផ្សេងទៀតទាំងអស់ដែលពាក់ព័ន្ធនឹង home ផងដែរ)។ មិនកំណត់ = `~/.omniroute/plugins` ឬ `/tmp/.omniroute/plugins` នៅពេល process មិន export home ណាមួយទាល់តែសោះ — នេះជាការមិនរកឃើញដោយស្ងាត់ដែលអថេរនេះលុបបំបាត់។ ថតដែលបានដោះស្រាយនឹងត្រូវបានកត់ត្រាម្តងនៅពេល startup ជា `scanner.dir_resolved` ជាមួយ input ដែលបានឈ្នះ។ សម្រាប់ server ប៉ុណ្ណោះ៖ CLI command plugins រក្សា `OMNIROUTE_PLUGIN_PATH` ផ្ទាល់ខ្លួនរបស់វា (ផ្នែក 9)។ | | `STORAGE_ENCRYPTION_KEY` | _(empty = disabled)_ | `src/lib/db/encryption.ts` | គន្លឹះ AES សម្រាប់ការអ៊ិនគ្រីបពេញលេញនៃ SQLite database នៅពេលទិន្នន័យស្ថិតនៅស្ងៀម។ បង្កើតដោយប្រើ `openssl rand -hex 32`។ | | `STORAGE_ENCRYPTION_KEY_VERSION` | `v1` | `scripts/build/bootstrap-env.mjs`, `electron/main.js` | ស្លាកកំណែសម្រាប់ encryption key។ បង្កើនកំណែនៅពេលធ្វើ key rotation ដើម្បីគាំទ្រការឌិគ្រីប backup ចាស់ៗ។ | | `DISABLE_SQLITE_AUTO_BACKUP` | `false` | `src/lib/db/backup.ts` | នៅពេល `true` វារំលងការបម្រុងទុកឯកសារ SQLite ជាប្រចាំ/មុនសរសេរ (ការរក្សាទុក/សម្អាតតម្លៃ models.dev និងការសរសេរការកំណត់)។ ការបម្រុងទុកដោយដៃ និងមុនការស្តារឡើងវិញនៅតែដំណើរការ។ វា **មិន** បិទ snapshot សុវត្ថិភាពជាប់លាប់ដែល migration runner តម្រូវឱ្យមាន ឬការការពារការធ្វើ mass-migration សម្រាប់ DB ជាប់លាប់ដែលមានស្រាប់ទេ។ ការបម្រុងទុកដែលមិនធ្វើដោយដៃ ត្រូវបានកំណត់ឱ្យធ្វើបានយ៉ាងច្រើនម្តងក្នុងរយៈពេល 60 នាទី។ Dashboard **ការកំណត់ → ឃ្លាំងផ្ទុក** អាចបិទការបម្រុងទុកស្វ័យប្រវត្តិជាប្រចាំដោយឡែកបាន។ | | `OMNIROUTE_SQLITE_SLOW_MS` | _(unset/off)_ | `src/lib/db/adapters/slowDiagnostics.ts` | មីលីវិនាទី; តម្លៃតូចជាង 1 ឬមិនមែនជាលេខ នឹងនៅតែបិទ; បង្ហាញការព្រមានយ៉ាងច្រើនម្តងក្នុងរយៈពេល 10 វិនាទី; បន្ទាត់កំណត់ហេតុមានតែ driver, operation និង elapsedMs ប៉ុណ្ណោះ។ | | `OMNIROUTE_SQLITE_OPTIMIZE_ENABLED` | `true` | `src/lib/db/sqlitePlannerStats.ts` | ការថែទាំស្ថិតិ planner នៅផ្ទៃខាងក្រោយ ដោយឯករាជ្យពីការសម្អាតទិន្នន័យតាមអាយុកាល: ជុំសម្អាតដំបូងដែលបានបើក (ជាធម្មតា 30 វិនាទីបន្ទាប់ពីចាប់ផ្តើម និងបន្ទាប់ពី migrations) ដំណើរការ `PRAGMA optimize=0x10002`; ជុំបន្ទាប់រៀងរាល់ 6 ម៉ោង ដំណើរការ `PRAGMA optimize` (ឬ `PRAGMA optimize=0x00002` សម្រាប់ការវិភាគគ្មានដែនកំណត់)។ `false` ឬ `0` នឹងបិទការថែទាំទាំងអស់ (មិនប្រកាន់អក្សរតូចធំ និងដកចន្លោះទទេជុំវិញ)។ មូលដ្ឋានទិន្នន័យក្នុងអង្គចងចាំ និងផ្លូវបម្រុងទុកសម្រាប់តែអាន មិនរងផលប៉ះពាល់ទេ។ កំហុសត្រូវបានកត់ត្រា ប៉ុន្តែមិនបោះចោលទេ។ | | `OMNIROUTE_SQLITE_ANALYSIS_LIMIT` | `400` | `src/lib/db/sqlitePlannerStats.ts` | កំណត់ `PRAGMA analysis_limit` មុនពេលធ្វើការបង្កើនប្រសិទ្ធភាព។ ចំនួនគត់ទសភាគត្រូវបានកម្រិតក្នុងចន្លោះ [0, 100000]; តម្លៃមិនត្រឹមត្រូវ/ទទេ នឹងកំណត់លំនាំដើមជា 400។ `0` ស្នើសុំការវិភាគគ្មានដែនកំណត់ និងច្បាស់លាស់លើតារាងដែលបានជ្រើសដោយការបង្កើនប្រសិទ្ធភាព; ជុំដំណើរការតាមកាលកំណត់ នឹងសម្អាតប៊ីតកំណត់គំរូរបស់ SQLite ក្នុងការបង្កើនប្រសិទ្ធភាព ដើម្បីអនុវត្តតាមនេះ។ មិនមានការដំណើរការសេចក្តីថ្លែងការណ៍វិភាគ SQL ដាច់ដោយឡែកទេ។ | | `OMNIROUTE_CRYPT_KEY` | _(unset)_ | `src/lib/db/encryption.ts` | **ឈ្មោះក្លែងកេរ្តិ៍ដំណែល** សម្រាប់ `STORAGE_ENCRYPTION_KEY`។ ទទួលយកជាតម្លៃជំនួស នៅពេលអថេរចម្បងមិនមាន។ | | `OMNIROUTE_API_KEY_BASE64` | _(unset)_ | `src/lib/db/encryption.ts` | **ឈ្មោះក្លែងកេរ្តិ៍ដំណែល** (ទម្រង់ដែលបានអ៊ិនកូដជា Base64) ដែលទទួលយកជាតម្លៃជំនួស។ ត្រូវបានឌិកូដដោយស្វ័យប្រវត្តិមុនពេលប្រើ។ | | `OMNIROUTE_DB_HEALTHCHECK_INTERVAL_MS` | _(unset)_ | `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)` ដែលដំណើរការញឹកញាប់ (មិល្លីវិនាទី)។ វារក្សាចំនួនស៊ុម WAL ដែលកំពុងរង់ចាំឱ្យតូច ដើម្បីឱ្យ checkpoint ដំណើរការលឿន ហើយឯកសារ WAL រក្សាទំហំមានកំណត់រវាងការកាត់បន្ថយពេលបិទកម្មវិធី។ `0` បិទមុខងារ។ | | `OMNIROUTE_WAL_GUARD_MAX_MB` | `256` | `src/lib/db/walMaintenance.ts` | នៅពេល tick ប្រភេទ 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` ទូទាំងម៉ាស៊ីន (`psi_some` / `psi_full`) នៅពេលអ្នកជិតខាងដែលមានសំឡេងរំខានបង្កឱ្យមាន 503 ខណៈដំណើរការនេះនៅតែដំណើរការធម្មតា (#13124)។ ឧបករណ៍ការពារ Cgroup និង heap របស់ V8 នៅតែបើកដំណើរការ។ 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` នៅពេលប្រើអាដាប់ទ័រ fallback WASM របស់ `sql.js`។ ប្រសិនបើមិនបានកំណត់តម្លៃ វានឹងរកឃើញដោយស្វ័យប្រវត្តិតាមរយៈ dependency របស់ package និងប្លង់បេក្ខជន។ | | `OMNIROUTE_BATCH_RETENTION_DAYS` | `30` | `src/lib/db/cleanup.ts` | ចំនួនថ្ងៃដែល checkpoints ឯកសារបញ្ចូល/លទ្ធផល/កំហុសដែលបានយោង និងជួរដេករបស់ការងារ Batch API ដែលស្ថិតក្នុងស្ថានភាពបញ្ចប់ (completed/failed/cancelled/expired) ត្រូវបានរក្សាទុកដោយដំណើរការសម្អាតស្វ័យប្រវត្តិ មុនពេលលុបចេញ។ មានប្រសិទ្ធភាពតែបន្ទាប់ពីបើក `BATCH_AND_FILE_AUTO_CLEANUP_ENABLED` ប៉ុណ្ណោះ ហើយត្រូវគ្នានឹងរយៈពេលរក្សាទុកលទ្ធផល Batch API របស់ OpenAI ផ្ទាល់។ មិនប៉ះពាល់ដល់ route `DELETE /api/v1/batches/delete-completed` ដែល operator កេះឱ្យដំណើរការទេ។ Route នេះនៅតែដំណើរការដោយគ្មានលក្ខខណ្ឌ (គ្មានតម្រងអាយុ) តាមការរចនា។ | | `BATCH_AND_FILE_AUTO_CLEANUP_ENABLED` | `false` | `src/lib/db/cleanup.ts` | នៅពេល `true` អនុញ្ញាតឱ្យដំណើរការសម្អាតស្វ័យប្រវត្តិលុបការងារ Batch API ដែលស្ថិតក្នុងស្ថានភាពបញ្ចប់ (និង checkpoints របស់វា) និងហួសពី `OMNIROUTE_BATCH_RETENTION_DAYS` ព្រមទាំងសម្អាតមាតិកា BLOB របស់ឯកសារដែលបានផ្ទុកឡើង ហើយហួស `expires_at` របស់ឯកសារនីមួយៗ។ ត្រូវបានបិទតាមលំនាំដើម៖ ការដំឡើងដែលមានស្រាប់ទាំងអស់រក្សាទុកទិន្នន័យនេះដូចមុនយ៉ាងពិតប្រាកដ រហូតដល់ operator ជ្រើសបើក។ ក៏ជាទង់មុខងារដែលអាចកែសម្រួលតាម dashboard បានផងដែរ — សូមមើល `docs/reference/FEATURE_FLAGS.md` → Runtime។ | | `OMNIROUTE_SKIP_DB_HEALTHCHECK` | `0` | `src/lib/db/core.ts`, `src/lib/db/healthCheck.ts` | កំណត់ជា `1` ដើម្បីរំលងការពិនិត្យសុខភាព DB ទាំងស្រុងនៅពេលចាប់ផ្ដើម។ មានប្រយោជន៍សម្រាប់កិច្ចការដែលមានអាយុខ្លី និងតេស្ត integration។ | | `OMNIROUTE_FORCE_DB_HEALTHCHECK` | `0` | `src/lib/db/core.ts` | កំណត់ជា `1` ដើម្បីបង្ខំឱ្យរង្វិលជុំពិនិត្យសុខភាព DB ដំណើរការ ទោះបីជាជាធម្មតាវាត្រូវបានរំលងក៏ដោយ (ឧ. កិច្ចការដែលមានអាយុខ្លី)។ | | `OMNIROUTE_SKIP_POSTINSTALL` | `0` | `scripts/postinstall.mjs` | កំណត់ជា `1` ដើម្បីរំលងការរៀបចំ native runtime អំឡុងពេល `npm install`។ មានប្រយោជន៍សម្រាប់ការដំឡើងក្នុង CI/headless ដែល sqlite ត្រូវបាន build រួចហើយ។ | | `OMNIROUTE_MIGRATIONS_DIR` | _(auto-detect)_ | `src/lib/db/migrationRunner.ts` | បដិសេធថតដែល migration runner ស្កេន។ មានប្រយោជន៍នៅពេលដាក់បញ្ចូល migrations ដែលបាន bundle ក្នុង custom builds។ | | `OMNIROUTE_EXTRA_MIGRATIONS_DIRS` | _(unset)_ | `src/lib/db/migrationRunner/extraDirs.ts` | ថត migrations បន្ថែមដែលបញ្ជាក់ជា entries `namespace=dir` ហើយបំបែកដោយ platform path delimiter (ឧ. `ee=/opt/app/enterprise/db/migrations`)។ ឯកសារដែលរកឃើញនៅទីនោះត្រូវបានកត់ត្រាជា `-` ដូច្នេះ distribution ដែលដាក់បញ្ចូល migrations ផ្ទាល់ខ្លួន នឹងមិនប៉ះទង្គិចជាមួយ numeric slots របស់ 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 gate `check:install-upgrade`។ វាត្រូវការទំហំប្រហែល 12 GB (ដើមឈើដំឡើងប្រហែល 3 GB ចំនួនពីរ បូកនឹង tarball) ដូច្នេះមិនត្រូវដំណើរការលើ tmpfs តូចទេ — នៅលើ self-hosted runner `/tmp` គឺជា tmpfs ដែលរក្សាទុកក្នុង RAM ទំហំ 12 GB ហើយ gate បានប្រើអស់ទំហំវា បណ្ដាលឱ្យ package ត្រូវបានកាត់ខ្លី។ | | `OMNIROUTE_SPEND_FLUSH_INTERVAL_MS` | _(default in code)_ | `src/lib/spend/batchWriter.ts` | ចន្លោះពេល flush (ms) សម្រាប់កម្មវិធីសរសេរ spend/cost ជាបាច់។ តម្លៃទាបជួយកាត់បន្ថយការរួមបញ្ចូលការសរសេរ; តម្លៃខ្ពស់ជួយកាត់បន្ថយការប្រជែងលើ DB។ | | `OMNIROUTE_SPEND_MAX_BUFFER_SIZE` | _(default in code)_ | `src/lib/spend/batchWriter.ts` | ចំនួនអតិបរមានៃធាតុ spend ដែលរក្សាទុកក្នុង buffer មុនពេលបង្ខំឱ្យ flush។ បង្កើនតម្លៃនេះសម្រាប់ deployment ដែលមាន QPS ខ្ពស់; បន្ថយវា នៅពេលការកំណត់ការប្រើប្រាស់អង្គចងចាំមានសារៈសំខាន់ជាង។ | | `OMNIROUTE_PROXY_FETCH_DEBUG` | _(unset)_ | `open-sse/utils/proxyFetch.ts` | កំណត់ជា `"true"` ដើម្បីបញ្ចេញកំណត់ហេតុ debug `[ProxyFetch]` នៅលើផ្លូវបញ្ជូនបន្តរបស់ Vercel។ ត្រូវបានបិទតាមលំនាំដើម ដើម្បីជៀសវាងការលេចធ្លាយព័ត៌មានណែនាំអំពីការបញ្ជូន។ | | `OMNIROUTE_PROXY_CORE_BINARY_PATH` | _(unset)_ | `src/lib/proxySubscription/coreConfig/sync.ts` | ផ្លូវ absolute ទៅកាន់ឯកសារ binary របស់ proxy core មូលដ្ឋាន (ឯកសារដែលមានឈ្មោះ `sing-box` / `mihomo`) ដែលត្រួតពិនិត្យ core configuration ដែលបានបង្កើត មុនពេលវាជំនួសឯកសារដែលបានយកមកប្រើ។ ប្រសិនបើមិនកំណត់ នឹងសរសេរ `.generated` នៅក្បែរឯកសារដែលបានយកមកប្រើប៉ុណ្ណោះ។ សម្រាប់បរិស្ថាន host ប៉ុណ្ណោះ៖ មិនត្រូវរក្សាទុកក្នុង database ឬទទួលយកតាម management API ឡើយ ព្រោះ binary នឹងត្រូវបានប្រតិបត្តិ។ | | `OMNIROUTE_PROXY_CORE_RELOAD_COMMAND` | _(unset)_ | `src/lib/proxySubscription/coreConfig/reload.ts` | របៀបដែល proxy core មូលដ្ឋាន reload បន្ទាប់ពីការជំនួស configuration ដែលបានផ្ទៀងផ្ទាត់៖ អារេអាគុយម៉ង់ JSON ដែលដំណើរការដោយគ្មាន shell ឬពាក្យ `external` តែប៉ុណ្ណោះ នៅពេលអ្នកសង្កេតការណ៍ខាងក្រៅជាអ្នកអនុវត្តឯកសារ។ មិនត្រូវរក្សាទុកក្នុង database ឬបង្ហាញតាម API ឡើយ។ | | `PROXY_LOG_INCLUDE_IPS` | `false` | `src/lib/proxyLogger.ts` | កំណត់ជា `"true"` ឬ `"1"` ដើម្បីរួមបញ្ចូល IP ម៉ាស៊ីនភ្ញៀវ/ច្រកចេញ និងបុព្វបទគណនីក្នុងបន្ទាត់កំណត់ហេតុដំណើរការ verbose `[ProxyEgress]`។ ត្រូវបានបិទតាមលំនាំដើម ដើម្បីកុំឱ្យកំណត់ហេតុដំណើរការលេចធ្លាយ IP ឬបុព្វបទគណនី។ | | `OMNIROUTE_DEBUG` | _(unset)_ | `bin/cli/commands/quota.mjs` | កំណត់ជា `1` ដើម្បីបោះពុម្ពរោគវិនិច្ឆ័យពេលវេលាតាមសំណើ (`[omniroute] GET completed in Nms`) ពីពាក្យបញ្ជា CLI quota ទៅ stderr។ | | `OMNIROUTE_HEALTHCHECK_PATH` | _(auto)_ | `scripts/dev/healthcheck.mjs` | ផ្លូវជាក់លាក់ដែលការត្រួតពិនិត្យសុខភាពរបស់ container ស្ទង់មើល។ ប្រសិនបើមិនបានកំណត់ probe នឹងទាញយកផ្លូវពី `OMNIROUTE_BASE_PATH`; ការកំណត់វានឹងបើកប្រើ endpoint ត្រួតពិនិត្យស៊ីជម្រៅឡើងវិញ។ | | `OMNIROUTE_DEBUG_COMPLETION` | _(unset)_ | `bin/cli/commands/completion.mjs` | កំណត់ជាតម្លៃមិនទទេណាមួយ ដើម្បីបញ្ចេញរោគវិនិច្ឆ័យ `[omniroute completion]` ពីផ្លូវ cache សម្រាប់ការបំពេញពាក្យបញ្ជា shell របស់ CLI (អាន/ធ្វើឱ្យថ្មី/សរសេរ)។ ត្រូវបានបិទតាមលំនាំដើម — cache ទាំងនេះបរាជ័យដោយស្ងាត់ ដូច្នេះ cache ដែលបាត់ ឬខូច នឹងមិនធ្វើឱ្យការបំពេញដោយចុច Tab ខូចឡើយ។ | | `BATCH_RETRY_DURATION_MS` | `86400000` (24h) | `open-sse/services/batchProcessor.ts` | រយៈពេលសាកល្បងឡើងវិញអតិបរមាសម្រាប់ធាតុនីមួយៗក្នុង batch (មិល្លីវិនាទី)។ ធាតុដែលលើសរយៈពេលនេះ នឹងត្រូវបានសម្គាល់ថាបរាជ័យ។ | | `BATCH_BACKOFF_BASE_MS` | `5000` | `open-sse/services/batchProcessor.ts` | រយៈពេលពន្យារមូលដ្ឋាន (មិល្លីវិនាទី) សម្រាប់ exponential backoff ក្នុងការសាកល្បងធាតុក្នុង batch ឡើងវិញ។ | | `BATCH_BACKOFF_MAX_MS` | `3600000` (1h) | `open-sse/services/batchProcessor.ts` | កម្រិតអតិបរមា (មិល្លីវិនាទី) សម្រាប់ exponential backoff រវាងការសាកល្បងធាតុក្នុង batch ឡើងវិញ។ | | `BATCH_MAX_CONCURRENT` | `1` | `open-sse/services/batchProcessor.ts` | ចំនួនបាច់អតិបរមាដែលអាចដំណើរការដំណាលគ្នា។ បង្កើនតម្លៃនេះដើម្បីបង្កើនល្បឿនដំណើរការ។ រក្សាតម្លៃឱ្យទាប ដើម្បីជៀសវាងការកើតឡើងជាបន្តបន្ទាប់នៃការកំណត់អត្រា។ | > [!IMPORTANT] > មុនពេលផ្លាស់ប្តូរមូលដ្ឋានទិន្នន័យដែលមានទិន្នន័យអចិន្ត្រៃយ៍រួច អ្នកដំណើរការមីក្រេសិននឹងបោះផ្សាយស្នាប់សត់ពេញលេញដែលកំណត់អត្តសញ្ញាណតាមមាតិកា > នៅក្រោម `DATA_DIR/db_backups/`។ ការបោះផ្សាយតម្រូវឱ្យប្រព័ន្ធឯកសារគាំទ្រតំណរឹងដែលស្ថិតក្នុងប្រព័ន្ធឯកសារដូចគ្នា និងមិនសរសេរជាន់លើ ព្រមទាំងការធ្វើសមកាលកម្មឯកសារដែលមានភាពធន់។ ម៉ាស៊ីន POSIX ក៏ > តម្រូវឱ្យធ្វើសមកាលកម្មថតផងដែរ។ នៅលើ Windows, Node អាចបដិសេធ handle របស់ថត ដូច្នេះ OmniRoute នឹងបញ្ចេញឯកសារដែលបានបោះផ្សាយ និងចាត់ទុកការធ្វើសមកាលកម្មធាតុថតជាការខិតខំប្រឹងប្រែងតាមលទ្ធភាព។ > ប្រសិនបើ `DATA_DIR` ដែលបានភ្ជាប់មិនអាចផ្តល់ការធានាទាំងនោះបានទេ ការចាប់ផ្តើមនឹងបរាជ័យដោយសុវត្ថិភាព មុនពេលអនុវត្តមីក្រេសិន។ > ផ្លាស់ទី `DATA_DIR` ទៅ volume ដែលមាន primitive ទាំងនោះ។ កុំប្រើ > `DISABLE_SQLITE_AUTO_BACKUP` ដើម្បីរំលងសុវត្ថិភាពមីក្រេសិន។ ### សេណារីយ៉ូ | សេណារីយ៉ូ | ការកំណត់រចនាសម្ព័ន្ធ | | --------------------------- | ------------------------------------------------------------------------------------------------ | | **ការអភិវឌ្ឍមូលដ្ឋាន** | ទុកតម្លៃលំនាំដើមទាំងអស់។ DB ស្ថិតនៅ `~/.omniroute/omniroute.db`។ | | **Docker** | `DATA_DIR=/data` + ភ្ជាប់ volume នៅ `/data`។ | | **ការអ៊ិនគ្រីបនៅពេលសម្រាក** | កំណត់ `STORAGE_ENCRYPTION_KEY` + រក្សាទុកការបម្រុងទុកនៃសោនេះ! ការបាត់បង់វា = ការបាត់បង់ទិន្នន័យ។ | | **CI/ការធ្វើតេស្ត** | `DATA_DIR=/tmp/omniroute-test` — បណ្តោះអាសន្ន មិនចាំបាច់មានការអ៊ិនគ្រីបទេ។ | --- ## 3. បណ្តាញ និងច្រក | អថេរ | តម្លៃលំនាំដើម | ឯកសារប្រភព | សេចក្ដីពិពណ៌នា | | ------------------------------------------- | ---------------------------------------------------- | ------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | `PORT` | `20128` | `src/lib/runtime/ports.ts` | ច្រកចម្បងសម្រាប់ទាំង UI ផ្ទាំងគ្រប់គ្រង និងចំណុចបញ្ចប់ API (របៀបច្រកតែមួយ)។ | | `OMNIROUTE_BASE_PATH` | _(ទទេ = root)_ | `next.config.mjs`, `scripts/docker/ensure-docker-base-path.mjs` | ផ្លូវរង URL សម្រាប់បម្រើ OmniRoute នៅពីក្រោយ reverse proxy (កំណត់ Next.js `basePath`; ការបញ្ជូនបន្តការផ្ទៀងផ្ទាត់គាំទ្រ basePath)។ ឧ. `/omniroute`។ នៅក្នុង Docker តម្លៃនេះត្រូវបានបញ្ចូលក្នុងអំឡុងពេល `docker build` (`ARG OMNIROUTE_BASE_PATH`); root images ដែលបាន build ជាមុន អាចអនុវត្តតម្លៃ runtime ផ្សេងទៀត នៅពេលចាប់ផ្ដើម container មុនពេល Next.js ចាប់ផ្ដើម។ កំណត់ `NEXT_PUBLIC_BASE_URL` ទៅកាន់ប្រភពសាធារណៈ ដែលរួមបញ្ចូលផ្លូវរងដូចគ្នា។ | | `NEXT_PUBLIC_OMNIROUTE_BASE_PATH` | _(ទទេ = root)_ | `src/shared/hooks/useDisplayBaseUrl.ts` | ច្បាប់ចម្លងដែលអាចមើលឃើញក្នុង browser របស់ `OMNIROUTE_BASE_PATH` ដែលត្រូវបានបញ្ចូលនៅពេល build ដើម្បីឱ្យការបង្ហាញចំណុចបញ្ចប់របស់ផ្ទាំងគ្រប់គ្រងបង្ហាញ `https://host/omniroute/v1` ជំនួសឱ្យ `https://host/v1`។ ប្រើ `OMNIROUTE_BASE_PATH` ជាតម្លៃជំនួស នៅពេលមិនបានកំណត់។ ត្រូវ build ម្ដងទៀតបន្ទាប់ពីផ្លាស់ប្ដូរ (Next `basePath` ត្រូវបានកំណត់នៅពេល build)។ | | `DASHBOARD_ALLOW_EMBED` | _(unset = never framable)_ | `next.config.mjs`, `scripts/build/dashboardEmbed.mjs` | ការបង្កប់ iframe នៃទំព័រ HTML ដោយជ្រើសរើសចូលរួម។ ប្រសិនបើមិនកំណត់ នោះគ្រប់ route នឹងផ្ញើ `frame-ancestors 'none'` + `X-Frame-Options: DENY`។ កំណត់ជា `vscode` ដើម្បីបម្រើទំព័រ (ផ្ទាំងគ្រប់គ្រង ការចូល ឯកសារ ទំព័រចុះចត) ជាមួយ `frame-ancestors 'self' vscode-webview:` និងគ្មាន `X-Frame-Options` ដើម្បីឱ្យ VS Code Simple Browser អាចបង្ហាញទំព័រទាំងនោះបាន (របៀប `dashboardOpen: "editor"` របស់ OmniCopilot)។ ផ្ទៃ API (`/api`, `/v1`, `/v1beta`, `/a2a`, `/healthz`, aliases កម្រិត root) នៅតែរក្សា headers តឹងរឹងដដែលក្នុងគ្រប់ករណី។ ទទួលស្គាល់តែ `vscode` ប៉ុណ្ណោះ — `1`/`true` មិនបើកដំណើរការវាទេ។ ពេល build៖ ត្រូវ build ឡើងវិញបន្ទាប់ពីផ្លាស់ប្តូរ (`docker build --build-arg DASHBOARD_ALLOW_EMBED=vscode` សម្រាប់ images; ការកំណត់វានៅលើការដំឡើងដែលបាន build រួច មិនមានប្រសិទ្ធភាពទេ)។ | | `API_PORT` | _(unset)_ | `src/lib/runtime/ports.ts` | នៅពេលកំណត់ នឹងបម្រើ proxy API `/v1/*` (រួមទាំង `/v1beta/*` របស់ Gemini) នៅលើ port ដាច់ដោយឡែកនេះ។ | | `API_HOST` | `0.0.0.0` | `src/lib/runtime/ports.ts` | អាសយដ្ឋាន bind សម្រាប់ API port។ | | `DASHBOARD_PORT` | _(unset)_ | `src/lib/runtime/ports.ts` | នៅពេលកំណត់ នឹងបម្រើ UI របស់ផ្ទាំងគ្រប់គ្រងនៅលើ port ដាច់ដោយឡែកនេះ។ | | `OMNI_MAX_CONCURRENT_CONNECTIONS` | `0` _(disabled)_ | `src/sse/utils/backpressure.ts` | កំណត់ចំនួនការតភ្ជាប់ chat ដែលកំពុងដំណើរការដំណាលគ្នា; សំណើដែលលើសកម្រិតនឹងទទួលបាន `503` ជាមួយ `Retry-After`។ ចំនួនគត់វិជ្ជមាននឹងបើក guard នេះ; ប្រសិនបើមិនកំណត់/`0` នោះនឹងបិទវា។ | | `OMNIROUTE_INSTANCE_ID` | _(unset)_ | `src/shared/resilience/peerRouting.ts` | លេខសម្គាល់មានស្ថិរភាព និងមានតែមួយគត់សម្រាប់ gateway នេះ នៅពេលភ្ជាប់ខ្សែ OmniRoute instances។ អនុញ្ញាតឱ្យពិនិត្យ loop របស់ peer ចូល។ តួអក្សរដែលអនុញ្ញាត៖ អក្សរ លេខ `.` `_` `:` និង `-`; ប្រវែងអតិបរមា 64 តួអក្សរ។ | | `OMNIROUTE_PEER_URLS` | _(unset)_ | `src/shared/resilience/peerRouting.ts`, `open-sse/executors/base.ts` | URL មូលដ្ឋានរបស់ OmniRoute ដែលបំបែកដោយសញ្ញាក្បៀស និងអាចទទួល `X-OmniRoute-Peer-Trace`។ មានតែ URL upstream ដែលបានអនុញ្ញាតយ៉ាងច្បាស់ប៉ុណ្ណោះ ដែលទទួលទិន្នន័យមេតារបស់ peer។ អ្នកផ្តល់សេវាផ្សេងទៀតទាំងអស់មិនត្រូវបានប៉ះពាល់ឡើយ។ | | `OMNIROUTE_PEER_MAX_HOPS` | `4` | `src/shared/resilience/peerRouting.ts` | ចំនួនអតិបរមានៃ OmniRoute instances ដែលបានចូលទស្សនាពីមុន និងត្រូវបានទទួលយកលើសំណើដែលបានភ្ជាប់ខ្សែ (`1`-`32`)។ ប្រសិនបើមាន instance ដដែលៗ ឬថវិកាត្រូវបានប្រើអស់ នឹងត្រឡប់ HTTP `508 Loop Detected`។ | | `PROD_DASHBOARD_PORT` | `20130` | `docker-compose.prod.yml` | ច្រកដែលបានបោះពុម្ពផ្សាយនៅផ្នែក host សម្រាប់ផ្ទាំងគ្រប់គ្រង ក្នុងរបៀបផលិតកម្ម Docker។ | | `PROD_API_PORT` | `20131` | `docker-compose.prod.yml` | ច្រកដែលបានបោះពុម្ពផ្សាយនៅផ្នែក host សម្រាប់ API ក្នុងរបៀបផលិតកម្ម Docker។ | | `OMNIROUTE_PORT` | _(unset)_ | `src/lib/runtime/ports.ts` | មានអាទិភាពលើ `PORT` នៅពេលដំណើរការនៅក្នុង Electron ឬ wrapper ផ្សេងទៀត។ | | `LIVE_WS_PORT` | `20129` | `src/server/ws/liveServer.ts` | ច្រកសម្រាប់ម៉ាស៊ីនមេត្រួតពិនិត្យផ្ទាល់ WebSocket តាមពេលវេលាជាក់ស្តែង។ | | `LIVE_WS_HOST` | `127.0.0.1` | `src/server/ws/liveServer.ts` | អាសយដ្ឋាន bind សម្រាប់ម៉ាស៊ីនមេ WebSocket ផ្ទាល់។ កំណត់ជា `0.0.0.0` ដើម្បីបង្ហាញនៅលើ LAN (កំណត់រចនាសម្ព័ន្ធ `LIVE_WS_ALLOWED_ORIGINS` ផងដែរ)។ ការតភ្ជាប់ធ្វើការផ្ទៀងផ្ទាត់ដោយប្រើ session cookie របស់ dashboard ឬ Bearer API key ដែលមាន management scope (`manage`/`admin`)។ | | `LIVE_WS_ALLOWED_ORIGINS` | _(unset)_ | `src/server/ws/liveServer.ts` | origins បន្ថែមដែលបំបែកដោយសញ្ញាក្បៀស និងត្រូវបានអនុញ្ញាតឱ្យបើក WebSocket ផ្ទាល់។ origins របស់ dashboard ដែលប្រើ loopback ត្រូវបានអនុញ្ញាតជាស្រេចតាមលំនាំដើម។ | | `LIVE_WS_ALLOWED_HOSTS` | _(unset)_ | `src/server/ws/liveServerAllowList.ts` | ឈ្មោះ host បន្ថែមដែលបំបែកដោយសញ្ញាក្បៀស និងត្រូវបានអនុញ្ញាតសម្រាប់ origins របស់ WebSocket ផ្ទាល់។ ខុសពី `LIVE_WS_ALLOWED_ORIGINS` (URL origin ពេញលេញ) វាផ្គូផ្គងតែផ្នែក host ប៉ុណ្ណោះ — មានប្រយោជន៍សម្រាប់ការរៀបចំ LAN/Tailscale។ | | `NEXT_PUBLIC_LIVE_WS_PUBLIC_URL` | _(មិនបានកំណត់)_ | `src/hooks/useLiveDashboard.ts` | URL សាធារណៈសម្រាប់ WebSocket របស់ផ្ទាំងគ្រប់គ្រងបន្តផ្ទាល់ (នៅផ្នែក browser)។ កំណត់វានៅពេលដាក់ម៉ាស៊ីនមេ WS នៅពីក្រោយ reverse proxy ឬ Cloudflare Tunnel (ឧ. `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 ពេលវេលាជាក់ស្តែង (បើកតាមលំនាំដើម និងចងភ្ជាប់ទៅ loopback)។ ជម្រើសបិទ/បើកសម្រាប់ CI/harness ដែលបិទស្គ្រីបជំនួយ WebSocket បន្តផ្ទាល់ឯករាជ្យ។ | | `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` | _(មិនបានកំណត់)_ (ការជ្រើសរើស build ដោយស្វ័យប្រវត្តិ) | `scripts/build/build-next-isolated.mjs` | សម្រាប់ `npm run build` ប្រសិនបើមិនបានកំណត់ ឬទទេ នឹងជ្រើស webpack នៅពេលដែនកំណត់អង្គចងចាំដែលមានប្រសិទ្ធភាព (RAM រូបវន្ត ឬ quota របស់ cgroup/process ដែលទាបជាង) មិនលើស **16 GiB** ឬមិនអាចកំណត់បានដោយសុវត្ថិភាព។ ប្រសិនបើលើស 16 GiB នឹងជ្រើស Turbopack។ តម្លៃ `0` ដែលកំណត់ជាក់លាក់ នឹងបង្ខំឱ្យប្រើ webpack។ តម្លៃ `1` និងតម្លៃមិនទទេផ្សេងទៀតដែលមិនមែនសូន្យ នឹងបង្ខំឱ្យប្រើ Turbopack។ តម្លៃ environment ទទេដែលបានបញ្ជូនតាម Compose មិនបង្ខំឱ្យប្រើ Turbopack ទេ។ កម្រិតនេះបានមកពីបញ្ហាថយចុះនៃអង្គចងចាំ build 15.6 GiB (#18184)។ ការធ្វើ build នៅលើ host ដែលមាន 24/32 GiB មិនទាន់ត្រូវបានវាស់វែងសម្រាប់ប្រៀបធៀបទេ។ webpack សម្រាប់ production នឹងរំលង persistent cache របស់វាដោយស្វ័យប្រវត្តិតាមលំនាំដើម (សូមមើល `OMNIROUTE_WEBPACK_BUILD_CACHE` ខាងក្រោម; #18141) ហើយធ្វើ build ដោយប្រើ peak RSS តិចជាងផ្លូវ Turbopack បច្ចុប្បន្នយ៉ាងច្រើន។ Development នៅតែរក្សាឥរិយាបថ bundler ដើមរបស់វា។ **Docker builds កំណត់លំនាំដើមរួចហើយជា `0` (webpack)**; ប្រើ `--build-arg OMNIROUTE_USE_TURBOPACK=1` ដើម្បីជ្រើសប្រើវា។ សូមមើល `docs/guides/DOCKER_GUIDE.md`។ | | `OMNIROUTE_WEBPACK_BUILD_CACHE` | _(មិនបានកំណត់)_ | `next.config.mjs` | webpack production builds (`OMNIROUTE_USE_TURBOPACK=0`) នឹងរំលង persistent filesystem cache របស់ webpack លុះត្រាតែតម្លៃនេះជា `1`។ ការសរសេរ cache នោះបន្ថែម peak build memory ប្រហែល 2.5 GB នៅពេលកំណត់ heap cap ត្រឹម 6144 MB ហើយ clean builds មិនដែលអានវាត្រឡប់មកវិញទេ។ កំណត់ជា `1` ដើម្បីរក្សាទុក `.build/next/cache/webpack` សម្រាប់ build ដដែលៗដែលលឿនជាងមុន នៅលើម៉ាស៊ីនដែលមាន RAM នៅសល់គ្រប់គ្រាន់។ Docker builds ទទួលវាជា `--build-arg OMNIROUTE_WEBPACK_BUILD_CACHE=1` (ដំណាក់កាល builder របស់ `Dockerfile` និង `Dockerfile.bun`)។ | | `OMNIROUTE_SKIP_DB_HEALTHCHECK` | _(មិនបានកំណត់)_ | `src/lib/db/core.ts` / `src/lib/db/healthCheck.ts` | កំណត់ជា `1` ដើម្បីរំលងការត្រួតពិនិត្យសុចរិតភាព SQLite នៅពេលចាប់ផ្ដើម។ មានប្រយោជន៍សម្រាប់ការចាប់ផ្ដើមលឿនជាងមុនលើមូលដ្ឋានទិន្នន័យធំៗ។ | | `NOTIFY_SOCKET` | _(មិនបានកំណត់)_ | systemd (sd_notify protocol) | កំណត់ដោយ 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) សម្រាប់កម្មវិធីកំណត់ពេលត្រួតពិនិត្យសុខភាព 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` ដើម្បីបិទការធ្វើតេស្តជាប្រចាំនៅផ្ទៃខាងក្រោយលើការតភ្ជាប់ទៅកាន់អ្នកផ្តល់សេវា។ អ្នកផ្តល់សេវាស្វែងរក (SEARCH_VALIDATOR_CONFIGS ក្នុង `src/lib/providers/validation/searchProviders.ts` ឧ. `tavily-search`) តែងតែត្រូវបានដកចេញពីការត្រួតពិនិត្យ — “ការផ្ទៀងផ្ទាត់” របស់ពួកវាគឺជាសំណួរពិតដែលត្រូវគិតថ្លៃពី upstream ដូច្នេះវាមិនដែលត្រូវបានពិនិត្យសុខភាពតាមកម្មវិធីកំណត់ពេលវេលាទេ (#9970)។ | | `DEEP_HEALTH_CHECK_ENABLED` | `0` | `src/app/api/monitoring/health/route.ts` | កំណត់ជា `1` ដើម្បីអនុញ្ញាតឱ្យអ្នកហៅដែលបានផ្ទៀងផ្ទាត់អត្តសញ្ញាណ ស្នើសុំ `/api/monitoring/health?deep=1` ដែលធ្វើសំណាកលើផ្ទៃ completions ម្តងក្នុងមួយ TTL។ អ្នកហៅអនាមិកមិនដែលធ្វើឱ្យការស្ទង់នេះដំណើរការទេ។ | | `OMNIROUTE_EVENT_LOOP_STALL_THRESHOLD_MS` | `5000` | `src/lib/healthzLag.ts` | កម្រិតកំណត់ការជាប់គាំង (មិល្លីវិនាទី) សម្រាប់កម្មវិធីកត់ត្រារង្វិលជុំ event ពេលចាប់ផ្ដើម៖ ការកកស្ទះដែលយូរជាងតម្លៃនេះ នឹងកត់ត្រាបន្ទាត់ `event loop stalled` មួយនៅពេលដំណើរការបន្តឡើងវិញ ជាមួយចំនួនអង្គចងចាំ និងចំនួនប្រតិបត្តិការដែលកំពុងដំណើរការ ហើយបង្កើនចំនួនរាប់/តម្លៃអតិបរមា `eventLoopStall` នៅលើ `/api/monitoring/health`។ កំណត់ជា `0` ដើម្បីបិទ; តម្លៃដែលមិនអាចអានបាន ឬអវិជ្ជមាន នឹងត្រឡប់ទៅ `5000`។ | | `HOST` | `0.0.0.0` | `scripts/dev/run-next.mjs` | អាសយដ្ឋាន bind សម្រាប់ម៉ាស៊ីនមេអភិវឌ្ឍន៍/ចាប់ផ្ដើម Next.js។ នៅពេលកំណត់ វានឹងបដិសេធតម្លៃលំនាំដើម `0.0.0.0`។ | | `HOSTNAME` | `127.0.0.1` | `scripts/dev/run-next-playwright.mjs` | អាសយដ្ឋាន bind ដែល runner របស់ Playwright ប្រើនៅពេលបើកដំណើរការ 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` | អាសយដ្ឋាន Bind សម្រាប់ `omniroute serve`។ ជៀសវាងការប៉ះទង្គិចជាមួយអថេរ POSIX shell `HOSTNAME` (ដែល bash/zsh កំណត់ជានិច្ចទៅឈ្មោះម៉ាស៊ីន)។ ប្រើ `0.0.0.0` ជំនួស នៅពេលមិនបានកំណត់។ (#6194) | ### របៀបច្រក ``` ┌─────────────────────────── ច្រកតែមួយ (លំនាំដើម) ──────────────────────────┐ │ PORT=20128 │ │ → Dashboard: http://localhost:20128 │ │ → API: http://localhost:20128/v1/chat/completions │ └─────────────────────────────────────────────────────────────────────────────┘ ┌─────────────────────────── ច្រកបំបែក ─────────────────────────────────────┐ │ DASHBOARD_PORT=20128 │ │ API_PORT=20129 │ │ API_HOST=0.0.0.0 │ │ → Dashboard: http://localhost:20128 │ │ → API: http://0.0.0.0:20129/v1/chat/completions │ │ ករណីប្រើប្រាស់៖ បង្ហាញ API ទៅកាន់ LAN ខណៈពេលដាក់កម្រិត Dashboard ឱ្យប្រើតែ localhost។ │ └─────────────────────────────────────────────────────────────────────────────┘ ┌─────────────────────────── Docker សម្រាប់ Production ─────────────────────┐ │ PROD_DASHBOARD_PORT=443 PROD_API_PORT=8443 │ │ → ផ្គូផ្គងច្រករបស់ container ទៅច្រករបស់ host ក្នុង docker-compose.prod.yml។ │ └─────────────────────────────────────────────────────────────────────────────┘ ``` --- ## 4. សុវត្ថិភាព និងការផ្ទៀងផ្ទាត់អត្តសញ្ញាណ | អថេរ | តម្លៃលំនាំដើម | ឯកសារប្រភព | សេចក្ដីពិពណ៌នា | | ------------------------------------------- | ---------------------------------------------------------------------------------------------------- | -------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `MACHINE_ID_SALT` | `endpoint-proxy-salt` | `src/lib/auth` | Salt ដែលផ្សំជាមួយឧបករណ៍សម្គាល់ផ្នែករឹង សម្រាប់កំណត់អត្តសញ្ញាណម៉ាស៊ីនតាម fingerprint។ សូមប្ដូរតម្លៃតាមការដាក់ពង្រាយនីមួយៗ ដើម្បីញែកចេញពីគ្នា។ | | `OMNIROUTE_CLI_SALT` | _(មិនបានកំណត់ = salt ចៃដន្យសម្រាប់ការដំឡើងនីមួយៗ ដែលបានរក្សាទុកនៅ `/cli-token-salt.json`)_ | `src/lib/machineToken.ts` | Salt របស់ HMAC សម្រាប់បង្កើត local CLI auth token។ ការកំណត់តម្លៃនេះនឹងបង្វិល CLI tokens ទាំងអស់នៅលើម៉ាស៊ីន ហើយតែងតែមានអាទិភាពជាង 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` ទេ** ដែលអនុវត្តតាមស្ថានភាពចូល Dashboard (`requireAuthForModels`) ជំនួសវិញ — ដូច្នេះ `401` ពី `/v1/models` **មិនមានន័យថា** inference ត្រូវបានការពារទេ។ សូមមើល `docs/security/INFERENCE_AUTH_POSTURE.md` (#13695)។ ទទួលយក `true`, `1` ឬ `yes` ដោយមិនគិតពីអក្សរធំតូច និងមិនគិតពីចន្លោះជុំវិញ។ តម្លៃផ្សេងទៀត (រួមទាំង `on`) ត្រូវបានចាត់ទុកថាបិទ។ | | `ALLOW_API_KEY_REVEAL` | `false` | `src/shared/constants/featureFlagDefinitions.ts` | អនុញ្ញាតឱ្យបង្ហាញតម្លៃ API key ពេញលេញនៅក្នុង UI របស់ Dashboard។ អាចកំណត់រចនាសម្ព័ន្ធបានពី Dashboard Feature Flags; ជាហានិភ័យសុវត្ថិភាពនៅលើ instance ដែលប្រើរួមគ្នា។ | | `NO_LOG_API_KEY_IDS` | _(empty)_ | `src/lib/compliance/index.ts` | បញ្ជី ID របស់ API key ដែលបំបែកដោយសញ្ញាក្បៀស ហើយរំលងការកត់ត្រាសំណើ (សម្រាប់ការអនុលោមតាម GDPR)។ | | `DEFAULT_RATE_LIMIT_PER_DAY` | _(មិនបានកំណត់ = គ្មានកំណត់)_ | `src/shared/utils/apiKeyPolicy.ts` | ថវិកាសំណើប្រចាំថ្ងៃលំនាំដើម ដែលអនុវត្តចំពោះ API keys ដែលជួរឈរ `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` | តម្លៃលំនាំដើមសម្រាប់ការកំណត់ `maxBodySizeMb` ដែលអាចមើលឃើញបាន។ ការកំណត់ដែលបានរក្សាទុកមានអាទិភាព។ `/api/v1/chat/completions` និង `/api/v1/responses` រក្សាតម្លៃលំនាំដើម 50 MB រហូតដល់មានការរក្សាទុកដែនកំណត់មួយ។ បន្ទាប់មក ដែនកំណត់ដែលបានរក្សាទុកនឹងជំនួសវា ទាំងការបង្កើន និងបន្ថយ សម្រាប់ការពារតាម header និងសម្រាប់ការទទួលសំណើ chat តាមចំនួនបៃពិតប្រាកដដូចគ្នា។ | | `OMNIROUTE_CHAT_LARGE_BODY_BYTES` | `262144` (256 KB) | `src/shared/middleware/chatBodyAdmission.ts` | តួសំណើពិតប្រាកដដែលមានទំហំស្មើ ឬលើសកម្រិតនេះ នឹងទទួលយកសិទ្ធិចូលប្រើធនធានធ្ងន់ធ្ងរបែប atomic ក្នុងមូលដ្ឋានដំណើរការ មុនពេលញែក JSON (ផ្លូវ BYTE រួមទាំង `POST /v1/responses`)។ មានការគេចវាងសម្រាប់ headroom ដែលមានសុខភាពល្អដូចគ្នានឹង structure-heavy [#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` | ដែនកំណត់រឹងសម្រាប់ផ្លូវ chat ដែលអនុវត្តទៅលើចំនួនបៃដែលបានអានអំឡុងពេលទទួលទិន្នន័យដែលមានដែនកំណត់ រួមទាំងសំណើដែលខ្វះ `Content-Length` មានតម្លៃមិនត្រឹមត្រូវ ឬមិនស្មោះត្រង់។ ទិន្នន័យលើសនឹងទទួល `413`។ `maxBodySizeMb` ដែលបានរក្សាទុក នឹងជំនួសតម្លៃលំនាំដើម 50 MB។ នៅពេលអថេរនេះត្រូវបានកំណត់ វាក៏កំណត់អតិបរមាសម្រាប់តម្លៃដែលបានរក្សាទុកនោះផងដែរ។ | | `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT` | _(មិនបានកំណត់ — គ្មានកម្រិតចំនួនសំណើ)_ | `src/shared/middleware/chatBodyAdmission.ts` | **#503-fanout:** កម្រិតចំនួនសំណើចាស់នេះ នឹងអនុវត្តតែនៅពេលកំណត់តម្លៃយ៉ាងច្បាស់លាស់ប៉ុណ្ណោះ។ ប្រសិនបើទុកមិនកំណត់ (លំនាំដើម) ការអនុញ្ញាត chat ទម្ងន់ធ្ងន់ នឹងត្រូវគ្រប់គ្រងជំនួសដោយ `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`។ ម៉ាស៊ីនភ្ញៀវ SSE វែងៗរាប់សិប (40–50) គឺពាក់ព័ន្ធនឹង heap + `OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES` / #10110 មិនមែន “អតិបរមា 2” ទេ។ ការបង្កើនតម្លៃនេះដោយមិនពិនិត្យ ដើម្បី “ប្រើ host” នឹងនាំ #7849 ត្រឡប់មកវិញ។ គុណចំនួន **heaps** ជាមួយ **N `DATA_DIR`s ឯករាជ្យ** (#11024); មិនត្រូវប្រើ `replicas>1` លើ SQLite file តែមួយឡើយ។ | | `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`។ ម៉ាស៊ីនភ្ញៀវ 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`) សម្រាប់ការអនុញ្ញាតទម្ងន់ធ្ងន់ប្រភេទ BYTE និង STRUCTURE (#10183, #10268, #10437)។ សំណើទម្ងន់ធ្ងន់ដែលដំណើរការត្រួតគ្នា ហួស `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`)។ ប្រសិនបើគ្មានដែនកំណត់នេះ សំណើគ្រប់អស់ដែលរវល់ ប៉ុន្តែ heap មានសុខភាពល្អ នឹងឆ្លងកាត់ការអនុញ្ញាតដោយគ្មានពិដាន។ នៅពេលមាន lease ដំណើរការត្រួតគ្នាចំនួនស្មើនេះ តាមរយៈផ្លូវ heap ដែលមានសុខភាពល្អ សំណើរវល់បន្ថែមទៀត នឹងធ្លាក់ទៅកាន់ផ្លូវរង់ចាំ/កាត់បន្ថយដែលមានដែនកំណត់ដូចគ្នា ដែលប្រើនៅពេលមានសម្ពាធ heap ពិតប្រាកដ។ `0` នឹងបិទការឆ្លងកាត់នេះទាំងស្រុង។ | | `OMNIROUTE_CHAT_HEAVY_MESSAGE_COUNT` | `200` | `src/shared/middleware/chatBodyAdmission.ts` | ចំនួនសារ ដែលចាត់ថ្នាក់សំណើជជែកថាមានទម្ងន់ធ្ងន់ ទោះបីតួសំណើរបស់វាតូចជាងកម្រិតបៃក៏ដោយ។ | | `OMNIROUTE_CHAT_HEAVY_TOOL_COUNT` | `64` | `src/shared/middleware/chatBodyAdmission.ts` | ចំនួនឧបករណ៍ ដែលចាត់ថ្នាក់សំណើជជែកថាមានទម្ងន់ធ្ងន់ ទោះបីតួសំណើរបស់វាតូចជាងកម្រិតបៃក៏ដោយ។ | | `OMNIROUTE_CHAT_HEAVY_ESTIMATED_TOKENS` | `32000` | `src/shared/middleware/chatBodyAdmission.ts` | ការប៉ាន់ស្មានចំនួនថូខឹនដោយផ្អែកលើទំហំខ្សែអក្សរបែបប្រុងប្រយ័ត្ន ដែលចាត់ថ្នាក់សំណើថាមានទម្ងន់ធ្ងន់។ វាជាប្រូកស៊ីសម្រាប់ថ្លៃដើមនៃការទទួលសំណើ មិនមែនជាការបែងចែកថូខឹនសម្រាប់គិតថ្លៃរបស់អ្នកផ្តល់សេវាទេ។ | | `OMNIROUTE_CHAT_HARD_MAX_MESSAGES` | `0` (disabled) | `src/shared/middleware/chatBodyAdmission.ts` | កម្រិតជម្រើសសម្រាប់ប្រវត្តិជជែក។ ត្រូវបានបិទតាមលំនាំដើម៖ ចំនួនសារគឺជាគោលការណ៍របស់ការដាក់ឱ្យប្រើប្រាស់ មិនមែនជាលក្ខណៈសកលរបស់សំណើទេ ហើយការកំណត់កម្រិតនៅទីនេះនឹងបដិសេធការសន្ទនាដោយមាន `413` បញ្ចប់ មុនពេលបំពង់បង្ហាប់អាចធ្វើឱ្យវាអាចបម្រើបាន។ ការកើនឡើងនៃ heap ត្រូវបានកំណត់ដោយ `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT` និងការបញ្ចេញសំណើនៅពេលមានសម្ពាធលើ heap។ កំណត់តម្លៃវិជ្ជមាននៅលើការដាក់ឱ្យប្រើប្រាស់ដែលមានអង្គចងចាំកំណត់ និងត្រូវការពិដានរឹងមួយ។ បន្ទាប់មក សំណើដែលលើសនឹងទទួលបាន `413` ដែលមានទម្រង់មានរចនាសម្ព័ន្ធ និងតម្រូវឱ្យបង្រួម។ | | `OMNIROUTE_MAX_NONSTREAMING_RESPONSE_BYTES` | `67108864` (64 MB) | `open-sse/handlers/chatCore/nonStreamingResponseBody.ts` | កម្រិតអតិបរមាសម្រាប់ response ពី upstream ដែលមិនមែនជា streaming និងត្រូវបាន buffer ពេញលេញក្នុង memory។ បន្ទាប់ពីលើសកម្រិតនេះ អ្នកអាន upstream នឹងត្រូវបានបោះបង់ ហើយ request នឹងបរាជ័យយ៉ាងឆាប់រហ័ស ជំនួសឱ្យការបង្កើន string ដោយគ្មានកម្រិតរហូតដល់ heap អស់។ | | `OMNIROUTE_FORWARDING_HEADER_BUDGET_BYTES` | `768` | `open-sse/handlers/chatCore/responseHeaders.ts` | ចំនួន wire bytes អតិបរមាដែលត្រូវបញ្ជូនបន្តពី response headers របស់ upstream។ នៅពេលលើសកម្រិតនេះ headers ដែលមានអាទិភាពទាបជាង (ឧ. custom `x-codex-*`, `x-oai-request-id`) នឹងត្រូវបានដកចេញ ដើម្បីស្ថិតក្នុងកម្រិតទូទៅរបស់ reverse-proxy headers។ កំណត់ឱ្យខ្ពស់ជាងនេះ ដើម្បីបញ្ជូនបន្ត metadata ពី upstream បានច្រើនជាងមុន ប៉ុន្តែវានឹងធ្វើឱ្យទំហំ response header កាន់តែធំ។ | | `OMNIROUTE_QUOTA_RECOVERY_MAX_PER_KEY` | `64` | `src/lib/quota/quotaSessionRecovery.ts` | ចំនួនសំបុត្រ quota-recovery អតិបរមាភាគច្រើន (កំពុងរង់ចាំ កំពុងដំណើរការ ឬកំពុងរង់ចាំការបញ្ជាក់) ដែល API key មួយអាចកាន់កាប់បាន។ នៅពេល key មួយឈានដល់កម្រិត នោះ turn ថ្មីនឹងទទួលបាន quota error ដើម ជំនួសឱ្យសំបុត្រ `202`; ការព្យាយាមម្តងទៀតលើ turn ដែលបានរក្សាទុករួច នឹងនៅតែបញ្ជូនសំបុត្ររបស់វាត្រឡប់មកវិញ។ តម្លៃមិនត្រឹមត្រូវ ឬមិនវិជ្ជមាន នឹងប្រើតម្លៃលំនាំដើម។ | | `CORS_ORIGIN` | _(unset)_ | `src/server/cors/origins.ts` | បញ្ជីអនុញ្ញាត CORS សម្រាប់ origin តែមួយបែប legacy។ សម្រាប់ការដាក់ឱ្យប្រើប្រាស់ថ្មី សូមប្រើ `CORS_ALLOWED_ORIGINS` ជំនួស។ CORS គឺសម្រាប់តែ client API របស់ browser ដែលឆ្លងកាត់ origin ប៉ុណ្ណោះ; ការសរសេររបស់ dashboard ដែលបាន authenticate ប្រើ request ដែលមាន 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` ណាមួយពីកម្មវិធីរុករក។ កុំបើកជម្រើសនេះនៅលើការដាក់ឱ្យប្រើប្រាស់ដែលមានអ្នកចែករំលែក ឬនៅ production។ | | `OUTBOUND_SSRF_GUARD_ENABLED` | `true` | `src/shared/network/outboundUrlGuardPolicy.ts` | ឈ្មោះក្លែងក្លាយចាស់។ ប៊ូតុងបិទបើករបស់វានៅលើផ្ទាំងគ្រប់គ្រង (ការបដិសេធពី DB) ត្រូវបានអានមុនតម្លៃបរិស្ថាននេះ។ ប្រសិនបើ `false`, `0`, `no`, ឬ `off` មាននៅក្នុងជម្រើសណាមួយ នោះការត្រួតពិនិត្យ host នឹងត្រូវបិទ ដូចដែល `OMNIROUTE_ALLOW_PRIVATE_PROVIDER_URLS=true` ធ្វើដែរ ទោះបីជាជម្រើសបិទបើករបស់ flag នោះត្រូវបានរក្សាទុកជាបិទក៏ដោយ។ តម្លៃផ្សេងទៀតនឹងទុកឱ្យ guard អនុវត្តតាម flag ពីរខាងក្រោម។ | | `OMNIROUTE_ALLOW_PRIVATE_PROVIDER_URLS` | `false` | `src/shared/network/outboundUrlGuardPolicy.ts` | បិទការត្រួតពិនិត្យ host របស់ outbound URL guard រួមទាំងការទប់ស្កាត់ cloud metadata (ទាំងអស់នៃ 169.254.0.0/16 និង metadata.google.internal) នៅលើ provider paths ដែលអនុវត្តតាម guard mode៖ ការផ្ទៀងផ្ទាត់ URL ការស្វែងរក model URLs មូលដ្ឋានរបស់ provider-node (រួមទាំង remote rerank nodes) និងការធ្វើតេស្ត proxy-fallback ព្រមទាំង outbound paths ផ្សេងទៀតដែលនៅជិត provider ដូចជា remote image/media fetch។ វាក៏អនុញ្ញាតគោលដៅ private webhook ផងដែរ លើកលែងតែ cloud-metadata/link-local endpoints ដែលនៅតែត្រូវបានទប់ស្កាត់ ទោះបីបើក flag នេះក៏ដោយ។ Chat requests ដែលត្រូវបានបញ្ជូនតាម `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`។ តម្លៃដែលបានរក្សាទុកពីប៊ូតុងបិទបើកនៅលើផ្ទាំងគ្រប់គ្រង មានអាទិភាពលើអថេរនេះ។ | | `OMNIROUTE_ALLOW_LOCAL_PROVIDER_URLS` | `true` | `src/shared/network/outboundUrlGuardPolicy.ts` | អនុញ្ញាតឱ្យ URL របស់អ្នកផ្តល់សេវា ប្រើអាសយដ្ឋានមូលដ្ឋាន/ឯកជន (127.0.0.1, localhost, LAN និងជួរអាសយដ្ឋានឯកជន) សម្រាប់ការផ្ទៀងផ្ទាត់អ្នកផ្តល់សេវា ការស្វែងរកម៉ូដែល ការជជែក និងផ្លូវចេញផ្សេងទៀតដែលពាក់ព័ន្ធនឹងអ្នកផ្តល់សេវា និងស្ថិតក្រោមការគ្រប់គ្រងរបស់ guard mode។ **លំនាំដើម `true`** (ផ្តោតលើមូលដ្ឋានជាមុន): បន្ទាប់មក guard នឹងទប់ស្កាត់ endpoint ទិន្នន័យមេតារបស់ cloud — 169.254.0.0/16 ទាំងមូល រួមទាំង hostname ទិន្នន័យមេតាដែលបានស្គាល់ (metadata.google.internal, metadata.goog, Alibaba/Azure/Oracle IMDS, fd00:ec2::254)។ កំណត់ជា `false` សម្រាប់ public-only mode ដែលនឹងទប់ស្កាត់ host ឯកជន និង loopback ផងដែរ។ Guard ពិនិត្យ hostname ឬ IP literal តាមទម្រង់ដែលបានសរសេរ មុនពេលស្វែងរក DNS; ក្នុង public-only mode safe-fetch wrapper ក៏ដោះស្រាយ hostname ហើយបដិសេធចម្លើយឯកជនណាមួយផងដែរ។ `OMNIROUTE_ALLOW_PRIVATE_PROVIDER_URLS=true` នឹងបិទការត្រួតពិនិត្យទាំងនេះនៅលើផ្លូវដែលមានរាយក្នុងជួររបស់វា។ អ្នកផ្តល់សេវាមូលដ្ឋានដែលមានស្រាប់ ដូចជា LM Studio, Ollama, vLLM, Llamafile និង Triton នឹងរំលងការត្រួតពិនិត្យ host ទាំងអស់ សម្រាប់ការផ្ទៀងផ្ទាត់ key និងការជជែក។ តម្លៃដែលបានរក្សាទុកពី toggle នៅលើ dashboard មានអាទិភាពលើអថេរនេះ។ (#5066) | | `AUDIO_REMOTE_PROVIDER_NODES` | `false` | `src/app/api/v1/_shared/audioProviderNodes.ts` | អនុញ្ញាតឱ្យផ្លូវ `/v1/audio/*` (ការបម្លែងសំឡេងទៅជាអក្សរ ការបង្កើតសំឡេង និងការបកប្រែ) ប្រើ node អ្នកផ្តល់សេវាដែលឆបគ្នាជាមួយ OpenAI និងបង្ហោះនៅក្រៅ localhost។ បិទជាលំនាំដើម — ការបញ្ជូនសំឡេងទៅ host ពីចម្ងាយនឹងផ្លាស់ប្តូរអត្តសញ្ញាណ egress ហើយត្រូវតែជាការសម្រេចចិត្តដោយចេតនារបស់ប្រតិបត្តិករ។ Node loopback/ឯកជន (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` (និងជំហាន rerank loopback របស់ម៉ាស៊ីនអង្គចងចាំ) ប្រើ node អ្នកផ្តល់សេវាដែលឆបគ្នាជាមួយ OpenAI និងបង្ហោះនៅក្រៅ localhost — ប្រអប់ LAN ឬ peer Tailscale ដែលដំណើរការ TEI, Infinity, vLLM ជាដើម។ បិទជាលំនាំដើម — ការបញ្ជូនទៅ host ពីចម្ងាយនឹងផ្លាស់ប្តូរអត្តសញ្ញាណ egress ហើយត្រូវតែជាការសម្រេចចិត្តដោយចេតនារបស់ប្រតិបត្តិករ។ Node loopback (localhost, 127.0.0.1, 172.16-31.x) តែងតែត្រូវបានអនុញ្ញាត និងមិនរងផលប៉ះពាល់ឡើយ។ Base URL របស់ node ពីចម្ងាយក៏ត្រូវតែឆ្លងកាត់គោលការណ៍ URL ចេញរបស់អ្នកផ្តល់សេវា (`OMNIROUTE_ALLOW_LOCAL_PROVIDER_URLS` / `OMNIROUTE_ALLOW_PRIVATE_PROVIDER_URLS`) ផងដែរ។ | | `OMNIROUTE_LOCAL_PROVIDER_NODE_HOSTS` | _(ទទេ)_ | `src/shared/network/localNodeHosts.ts` | Hostname (បំបែកដោយសញ្ញាក្បៀស ឬចន្លោះទទេ) ដែលការបញ្ជូន node អ្នកផ្តល់សេវាចាត់ទុកថាជាមូលដ្ឋាន — ជាទូទៅគឺឈ្មោះសេវា Docker/Compose របស់ reranker, TEI ឬ audio sidecar នៅលើបណ្តាញ Docker ផ្ទាល់របស់ OmniRoute (`http://reranker:8080/v1`) ដូច្នេះ node មិនចាំបាច់ត្រូវការលេខ IP របស់ container ដែលបាន hard-code ទេ។ Host ដែលបានរាយបញ្ជីមានសិទ្ធិសម្រាប់ `/v1/rerank`, `/v1/audio/*` និងការត្រួតពិនិត្យសុខភាពមូលដ្ឋាន ដោយមិនចាំបាច់បើក `RERANK_REMOTE_PROVIDER_NODES` / `AUDIO_REMOTE_PROVIDER_NODES` សម្រាប់ node ពីចម្ងាយគ្រប់ node ឡើយ ហើយត្រូវបានហៅដោយផ្ទាល់ — មិនដែលឆ្លងកាត់ `HTTP(S)_PROXY` ឬ proxy ដែលបានកំណត់ជាប់នឹង connection ឡើយ។ ពួកវានៅតែផ្ញើ API key របស់ connection។ ទទួលយកតែឈ្មោះ single-label និងឈ្មោះ `.internal`/`.local` ប៉ុណ្ណោះ; FQDN សាធារណៈ, IP literal និងឈ្មោះទិន្នន័យមេតារបស់ cloud នឹងត្រូវបានមិនអើពើ ដោយមានការព្រមាន។ (#14635) | | `OMNIROUTE_OIDC_DISABLE_PASSWORD_LOGIN` | `false` | `src/app/api/auth/login/route.ts` | នៅពេល OIDC ត្រូវបានបើក បិទការចូលដោយពាក្យសម្ងាត់ ដើម្បីឱ្យអ្នកប្រើប្រាស់អាចផ្ទៀងផ្ទាត់អត្តសញ្ញាណបានតែតាមរយៈ OIDC Single Sign-On ប៉ុណ្ណោះ។ ឈ្មោះកាត់ `OIDC_DISABLE_PASSWORD_LOGIN` ក៏ត្រូវបានទទួលយកផងដែរ; Dashboard Feature Flag ដែលមាន key ដូចគ្នា មានអាទិភាពជាង។ (#10889) | | `OIDC_DISABLE_PASSWORD_LOGIN` | `false` | `src/app/api/auth/login/route.ts` | ឈ្មោះកាត់របស់ `OMNIROUTE_OIDC_DISABLE_PASSWORD_LOGIN` (#10889)។ | | `OMNIROUTE_DISABLE_MFA` | `false` | `src/server/auth/dashboardMfa.ts` | ការសង្គ្រោះក្នុងករណីបាត់ឧបករណ៍ សម្រាប់ការចូល Dashboard ដោយ two-factor TOTP ដែលអាចជ្រើសបើកបាន។ នៅពេល `true` កត្តាទីពីរត្រូវបានរំលងតែសម្រាប់ការចូលពី host ខ្លួនឯងប៉ុណ្ណោះ (peer loopback និង `Host` loopback); ការចូលពីចម្ងាយ និង `POST /api/cli/connect` ពីប្រភពផ្សេងទៀត នៅតែត្រូវការលេខកូដ។ ចូលក្នុងប្រព័ន្ធតាមមូលដ្ឋាន បិទ two-factor នៅក្រោម Settings → Security (អាចទុកកូដឱ្យទទេបាន ខណៈពេលនេះត្រូវបានកំណត់ ដូច្នេះកត្តាដែលលែងអាចផ្ទៀងផ្ទាត់បាន អាចត្រូវបានលុបចេញ; ពាក្យសម្ងាត់នៅតែត្រូវការ) បន្ទាប់មកលុបការកំណត់នេះចេញ។ TOTP គ្របដណ្តប់តែការចូលដោយពាក្យសម្ងាត់ និង `omniroute connect` ប៉ុណ្ណោះ — ការចូល OIDC/SSO ពឹងផ្អែកលើកត្តាទីពីររបស់អ្នកផ្តល់សេវាអត្តសញ្ញាណផ្ទាល់ខ្លួន។ សូមមើល [AUTHZ_GUIDE](../architecture/AUTHZ_GUIDE.md#optional-totp-two-factor-login-16619)។ | ### បញ្ជីត្រួតពិនិត្យការពង្រឹងសុវត្ថិភាព ```bash # កម្រិតអប្បបរមានៃសុវត្ថិភាពសម្រាប់ផលិតកម្ម៖ 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 នៅខាងការឆ្លើយតប។ > **⚠️ ដែនកំណត់៖** យន្តការការពារទាំងនេះគឺជាការរកឃើញតាមហេយូរីស្ទិកដែល _ខិតខំប្រឹងប្រែងអស់ពីសមត្ថភាព_ មិនមែនជាប្រព័ន្ធការពារការបញ្ចូល prompt ពេញលេញ ឬប្រព័ន្ធ DLP សម្រាប់ PII ទេ។ វាអាចបង្កើតលទ្ធផលវិជ្ជមានក្លែងក្លាយ (prompt persona/RPG ដែលគ្មានគ្រោះថ្នាក់ត្រូវបានសម្គាល់) និងលទ្ធផលអវិជ្ជមានក្លែងក្លាយ (leetspeak ការដាក់ចន្លោះ និងលំនាំភាសាដែលមិនមែនជាភាសាអង់គ្លេស)។ វាមិនគ្រប់គ្រាន់សម្រាប់ការអនុលោមតាមបទប្បញ្ញត្តិតែមួយមុខទេ។ កែសម្រួល modes និងសាកល្បងជាមួយចរាចរណ៍របស់អ្នក មុនពេលពឹងផ្អែកលើវា។ ### ខាងសំណើ៖ ឧបករណ៍ការពារ Prompt Injection | Variable | Default | Source File | Description | | --------------------------------- | --------- | ---------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `INPUT_SANITIZER_ENABLED` | `true` | `src/middleware/promptInjectionGuard.ts` | បើកការស្កេនសារចូល សម្រាប់រកលំនាំ prompt injection។ | | `INPUT_SANITIZER_MODE` | `warn` | `src/middleware/promptInjectionGuard.ts` | គោលការណ៍ injection៖ `warn` = កត់ត្រាតែប៉ុណ្ណោះ, `block` = បដិសេធសំណើដោយ 400។ `redact` ចាស់ **មិន** ដកអត្ថបទ injection ទេ; ប្រើ `PII_REDACTION_ENABLED` សម្រាប់ការកែសរសេរ PII នៅខាងសំណើ។ | | `INJECTION_GUARD_MODE` | _(unset)_ | `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` | _(unset)_ | `src/shared/utils/injectionSeverity.ts` | ឈ្មោះជំនួសចាស់សម្រាប់ `INPUT_SANITIZER_BLOCK_THRESHOLD` — ឥរិយាបថដូចគ្នា។ | | `PII_REDACTION_ENABLED` | `false` | `src/lib/guardrails/piiMasker.ts` | នៅពេល `true` កែសរសេរ PII នៅក្នុងសំណើចូល (ឯករាជ្យពី injection mode)។ | | `CREDENTIAL_REDACTION_ENABLED` | `false` | `src/lib/guardrails/credentialMasker.ts` | កែសរសេរលំនាំ API key / secret token ដែលគេស្គាល់ទូទៅ ចេញពី payload របស់សំណើ/ការឆ្លើយតប។ ត្រូវបើកដោយចេតនា; ឥរិយាបថស្រដៀង `PII_REDACTION_ENABLED`។ | ### ខាងការឆ្លើយតប៖ ឧបករណ៍សម្អាត PII | Variable | Default | Source File | Description | | -------------------------------- | -------- | ------------------------- | ----------------------------------------------------------------------------------- | | `PII_RESPONSE_SANITIZATION` | `false` | `src/lib/piiSanitizer.ts` | ស្កេនការឆ្លើយតបពី LLM ដើម្បីរក PII ដែលលេចធ្លាយ មុនពេលបញ្ជូនទៅ client។ | | `PII_RESPONSE_SANITIZATION_MODE` | `redact` | `src/lib/piiSanitizer.ts` | `redact` = លាក់ PII, `warn` = កត់ត្រាតែប៉ុណ្ណោះ, `block` = បោះចោលការឆ្លើយតបទាំងមូល។ | ### ឧបករណ៍សម្អាតបរិបទសម្រាប់ផ្លូវដែលមាន Token របស់ VS Code | Variable | Default | Source File | Description | | ----------------------------------- | ------- | ------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `OMNIROUTE_VSCODE_SANITIZE_CONTEXT` | `1` | `src/app/api/v1/vscode/contextSanitizer.ts` | ដកបរិបទ implicit របស់កម្មវិធីកែសម្រួលសកម្ម (`editorContext`, `activeEditor`, `currentFile`, `selection`, `openTabs`…) ចេញពីសំណើ `/v1/vscode/[token]/*` និងកែសរសេរមាតិកានៃឯកសាររសើបដែលភ្ជាប់ដោយច្បាស់លាស់។ មានសុវត្ថិភាពជាលំនាំដើម; កំណត់ទៅ `0` ដើម្បីបិទ។ | ### សេណារីយ៉ូ | Scenario | Configuration | | ------------------------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | **ការអនុលោមតាមបទប្បញ្ញត្តិសម្រាប់សហគ្រាស** | `INPUT_SANITIZER_ENABLED=true`, `INPUT_SANITIZER_MODE=block`, `PII_REDACTION_ENABLED=true`, `PII_RESPONSE_SANITIZATION=true` (ការទប់ស្កាត់ injection + ការកែសរសេរ PII នៅខាងសំណើ/ការឆ្លើយតប; modes ឯករាជ្យពីគ្នា) | | **ការត្រួតពិនិត្យតែប៉ុណ្ណោះ** | `INPUT_SANITIZER_ENABLED=true`, `INPUT_SANITIZER_MODE=warn` — កត់ត្រា ប៉ុន្តែមិនដែលទប់ស្កាត់ទេ | | **ការប្រើប្រាស់ផ្ទាល់ខ្លួន** | ទុកអ្វីៗទាំងអស់ឱ្យបិទ — គ្មាន overhead | --- ## 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` | ជម្រើសបើកប្រើ៖ បញ្ជូន model ID `claude-*` ដែលគ្មានបុព្វបទ ពី client របស់ Claude Code តាមរយៈគណនី Claude Code OAuth ជំនួសឱ្យការទាមទារបុព្វបទ provider។ បុព្វបទ provider ដែលបានបញ្ជាក់នៅតែមានអាទិភាព។ ក៏អាចកំណត់រចនាសម្ព័ន្ធបានតាមរយៈប៊ូតុងបិទ/បើកនៅលើទំព័រ provider របស់ Claude ក្នុង dashboard។ | | `OMNIROUTE_REDACT_THINKING` | `true` | `open-sse/executors/base/redactThinkingBeta.ts` | កំណត់ជា `false` ដើម្បីបញ្ឈប់ OmniRoute ពីការបន្ថែម Anthropic beta `redact-thinking-2026-02-12` ដោយខ្លួនឯង (ប្លុក thinking ដែលមានតែ signature ទទេ)។ សំណើដែលមាន `thinking.display: "summarized"` នឹងរំលងវា ទោះជាយ៉ាងណាក៏ដោយ; redact beta ដែល client បានចរចា ឬជម្រើស `requestDefaults.redactThinking` ដែលត្រូវគ្នាជាមួយ CC នឹងរក្សាវាទុក។ សំណើ Claude OAuth នឹងរក្សា beta នេះ (វាជាផ្នែកមួយនៃ Claude Code OAuth fingerprint) លុះត្រាតែ feature flag `CLAUDE_OAUTH_SUMMARIZED_THINKING_UNREDACTED` ដែលបិទតាមលំនាំដើម ត្រូវបានបើក។ | | `BARE_MODEL_DEFAULT_OVERRIDE_LEGACY` | `false` | `open-sse/services/model.ts` | ឥរិយាបថ `resolveBareModelToConnectionDefault` ចាស់ (#4825)៖ ជំនួសឈ្មោះ model ដែលគ្មានបុព្វបទណាមួយដោយ `defaultModel` របស់ connection ដែលបានជ្រើស។ បិទតាមលំនាំដើម; មានតែ model `auto` ឬ model ទទេប៉ុណ្ណោះដែលត្រូវបានជំនួស ហើយនឹងកត់ត្រាការព្រមានមួយក្នុងមួយគូ នៅពេលបើក។ | | `COMBO_CONCURRENCY_PER_MODEL` | `3` | `open-sse/services/comboConfig.ts` | កម្រិតកំណត់ concurrency តាម model សម្រាប់ combo round-robin (#9100)។ semaphore របស់ combo round-robin ត្រូវបានកំណត់រឹងត្រឹម 3 សំណើក្នុងពេលដំណាលគ្នា ក្នុងមួយ model ដោយគ្មានជម្រើសបដិសេធ ដែលធ្វើឱ្យចរាចរដែលមាន concurrency ខ្ពស់ត្រូវរង់ចាំជាស៊េរីនៅពីក្រោយកម្រិតនេះ។ ត្រូវបានផ្ទៀងផ្ទាត់ឱ្យមានតម្លៃ `>= 1` និងកាត់បន្ថយត្រឹម `<= 32`។ | | `OMNIROUTE_AGENTIC_STALL_FAILOVER` | `false` | `open-sse/services/combo/agenticStallFailover.ts` | ជម្រើសបើកដោយចេតនា៖ កំណត់ជា `1` (ឬ `true`) ដើម្បីឱ្យសមាជិក combo ដែលឆ្លើយតបចំពោះជំហានលទ្ធផលឧបករណ៍ដោយ `finish: stop` + ការពណ៌នា + គ្មានការហៅឧបករណ៍ ប្តូរទៅ target បន្ទាប់ (យុទ្ធសាស្ត្រ priority-loop, round-robin និង pinned sessions)។ ប្រសិនបើគ្មាន target ណាមួយដំណើរការល្អជាងនេះទេ ចម្លើយដែលជាប់គាំងនឹងត្រូវបានបញ្ជូនត្រឡប់ជំនួសឱ្យកំហុស ហើយទាំង provider breaker និង model lockout នឹងមិនត្រូវបានរាប់បញ្ចូលទេ។ ជំហានដែលបានបញ្ជូនជាស្ទ្រីម នឹងត្រូវពន្យារទុកពី client រហូតដល់ការសម្រេចត្រូវបានបញ្ចប់។ សំណើដែលប្រើទម្រង់ `input` របស់ Responses API នឹងមិនត្រូវបានចាត់ថ្នាក់ទេ។ លំនាំដើមបិទ។ | | `DISABLE_CONTEXT_WINDOW_CHECKS` | `false` | `open-sse/handlers/chatCore.ts` | ជម្រើសបើកដោយចេតនាដែលមានហានិភ័យ ដោយរំលងការត្រួតពិនិត្យ context-window / max-input-token ក្នុងមូលដ្ឋានរបស់ OmniRoute សម្រាប់សំណើដែលប្រើម៉ូដែលតែមួយដោយផ្ទាល់។ អ្នកផ្តល់សេវាខាងលើនៅតែអនុវត្តដែនកំណត់ពិតប្រាកដរបស់ពួកគេ។ ការបង្រួម prompt និងដែនកំណត់ output-token របស់ម៉ូដែលផ្ទាល់នៅតែសកម្ម។ អាទិភាពមានប្រសិទ្ធភាពគឺការបដិសេធពី Feature Flags DB > អថេរបរិស្ថាន > លំនាំដើម; មិនចាំបាច់ចាប់ផ្តើមឡើងវិញទេ។ | | `OMNIROUTE_SELF_HOSTED_PROVIDERS` | _(unset)_ | `open-sse/services/selfHostedEntry.ts` | ឯកសារ YAML `providers:` បញ្ចូលក្នុងបន្ទាត់ (RIC-738, D4)។ នៅពេលកំណត់ (មាន ឬគ្មានប្លុក `strategy:`) `/v1/chat/completions` នឹងប្តូរទិសទៅច្រក unified self-hosted ដែលឆបគ្នាជាមួយ OpenAI ជំនួសឱ្យដំណើរការ cloud។ មិនកំណត់ (លំនាំដើម)៖ route នឹងឆ្លងកាត់ទៅដំណើរការ cloud ដែលមានស្រាប់ដោយផ្ទាល់។ សូមមើល `docs/routing/SELF_HOSTED_OPENAI_ENTRY.md`។ | | `OMNIROUTE_SELF_HOSTED_PROVIDERS_FILE` | _(unset)_ | `open-sse/services/selfHostedEntry.ts` | ផ្លូវទៅកាន់ឯកសារ YAML ដែលផ្ទុកឯកសារ `providers:` ដូចគ្នានឹង `OMNIROUTE_SELF_HOSTED_PROVIDERS` សម្រាប់ deployment ដែលចូលចិត្តប្រើឯកសារជំនួសឱ្យ env var ដែលបញ្ចូលក្នុងបន្ទាត់។ ការកំណត់មួយក្នុងចំណោមទាំងពីរ នឹងធ្វើឱ្យ self-hosted entry សកម្ម។ | | `OMNIROUTE_SELF_HOSTED_API_KEY` | _(unset — open route)_ | `open-sse/services/selfHostedEntry.ts` | API key រួមដែលជាជម្រើសសម្រាប់ unified self-hosted entry (ស៊ុម D5 ដែលរក្សាទុកសម្រាប់ប្រព័ន្ធកូតាតាម key)។ នៅពេលកំណត់ សំណើត្រូវតែរួមបញ្ចូល `Authorization: Bearer `។ មិនកំណត់៖ route បើកចំហ ស្របតាមលំនាំអ្នកផ្តល់សេវាក្នុងស្រុក self-hosted ដែលមានស្រាប់ (ការដាក់ឱ្យដំណើរការតាម loopback/បណ្តាញដែលទុកចិត្ត)។ | | `OMNIROUTE_SELF_HOSTED_STRATEGY` | _(unset)_ | `open-sse/services/routingStrategies.ts` | ឯកសារ YAML `strategy:` បញ្ចូលក្នុងបន្ទាត់សម្រាប់ម៉ាស៊ីន routing ដែលអាចកំណត់បានជាក់លាក់ (M2/RIC-740, D3) — blacklist/whitelist, cooldown breaker, cost-priority, latency-aware, fallback chain។ បដិសេធប្លុក `strategy:` ដែលបញ្ចូលក្នុង `OMNIROUTE_SELF_HOSTED_PROVIDERS` តាម key នីមួយៗ។ សូមមើល `docs/routing/DETERMINISTIC_ROUTING.md`។ | | `OMNIROUTE_SELF_HOSTED_STRATEGY_FILE` | _(unset)_ | `open-sse/services/routingStrategies.ts` | ផ្លូវទៅកាន់ឯកសារ YAML ដែលផ្ទុកឯកសារ `strategy:` ដូចគ្នានឹង `OMNIROUTE_SELF_HOSTED_STRATEGY` សម្រាប់ deployment ដែលចូលចិត្តប្រើឯកសារជំនួសឱ្យ env var ដែលបញ្ចូលក្នុងបន្ទាត់។ | | `OMNIROUTE_DISABLE_CONVERSATION_TRACKING` | _(unset)_ | `open-sse/services/conversationTracker.ts` | កំណត់ជា `1` ដើម្បីបញ្ឈប់ការប្រមូលប្រវត្តិសន្ទនា។ `resolveConversationId()` នឹងបញ្ជូនលទ្ធផលដែលមិនត្រូវបានតាមដាន មុនពេលអាន SQLite ឬវិភាគប្រវត្តិសារ ហើយ session IDs ដែលផ្តល់ដោយ client ក៏ត្រូវបានគ្របដណ្តប់ដែរ។ ការគ្រប់គ្រង routing-session នៅដដែល ហើយកំណត់ត្រាដែលមានស្រាប់មិនត្រូវបានលុបទេ។ សម្រាប់ deployment ដែលមិនប្រើទិដ្ឋភាពសន្ទនារបស់ dashboard ហើយចង់ឱ្យតារាងជំហានឈប់កើនឡើង។ | | `OMNIROUTE_NADIR_API_KEY` | _(មិនបានកំណត់)_ | `open-sse/services/autoCombo/nadirStrategy.ts` | សោ API សម្រាប់យុទ្ធសាស្ត្ររ៉ោតទ័រ auto-combo `nadir` ដែលត្រូវបានជ្រើសរើសប្រើ ហើយប្រើនៅពេល `config.nadir.apiKey` របស់ combo ខ្លួនឯងមិនបានកំណត់។ ជាជម្រើស៖ ការហៅដោយគ្មានសោនឹងចូលទៅក្នុងកម្រិតអនាមិករបស់ Nadir ដែលកំណត់អត្រាតាម IP ដូច្នេះមិនអាចប្រើនៅពីក្រោយ gateway ដែលចែករំលែកបានទេ។ ជាទិន្នន័យរសើប; គួរប្រើវាលតាម combo នៅពេល combo ប្រើគណនីផ្សេងៗគ្នា។ | | `OMNIROUTE_NADIR_BASE_URL` | `https://api.getnadir.com` | `open-sse/services/autoCombo/nadirStrategy.ts` | ប្រភពមូលដ្ឋាននៃ decision API របស់ Nadir ដែលប្រើនៅពេល `config.nadir.baseUrl` របស់ combo ខ្លួនឯងមិនបានកំណត់។ ត្រូវការតែសម្រាប់ Nadir ដែល self-hosted ប៉ុណ្ណោះ ដែលរក្សាទុក prompt heads នៅក្នុងបណ្តាញរបស់អ្នកផ្ទាល់។ ប្រសិនបើមាន `/v1` នៅខាងចុង វាត្រូវបានទទួលស្គាល់ និងដកចេញ។ | | `OMNIROUTE_API_KEY_WEEKLY_WINDOW` | `provider` | `src/lib/usage/apiKeyUsageLimits.ts` | បង្អួចប្រចាំសប្តាហ៍សម្រាប់ដែនកំណត់ការប្រើប្រាស់ជាដុល្លារតាម API key (ការអនុវត្តតាមសំណើ, `GET /api/keys/{id}/usage-limits`, `@@om-usage`)។ `provider`: សប្តាហ៍បញ្ចប់នៅពេលកំណត់ឡើងវិញប្រចាំសប្តាហ៍ដែលលឿនបំផុត ក្នុងចំណោមការតភ្ជាប់ upstream ដែល key អាចចូលប្រើបាន ឬជាបង្អួចរំកិល 7 ថ្ងៃ ប្រសិនបើមិនស្គាល់ការកំណត់ណាមួយ។ `calendar`: សប្តាហ៍មូលដ្ឋានចាប់ពីថ្ងៃចន្ទ ម៉ោង 00:00 ដល់ថ្ងៃចន្ទបន្ទាប់ ម៉ោង 00:00 ដែលដូចគ្នាសម្រាប់គ្រប់ key ទាំងអស់។ គួរណែនាំឱ្យប្រើ `calendar` នៅពេល pool មួយនៃគណនី upstream ត្រូវបានចែករំលែកដោយ key ជាច្រើនដែលមានថវិកាផ្ទាល់ខ្លួន។ តម្លៃមិនត្រឹមត្រូវនឹងត្រឡប់ទៅ `provider`។ | | `OMNIROUTE_API_KEY_WEEKLY_WINDOW_TIMEZONE` | _(តំបន់ពេលវេលារបស់ process)_ | `src/lib/usage/apiKeyUsageLimits.ts` | តំបន់ពេលវេលា IANA (ឧទាហរណ៍ `Asia/Shanghai`) ដែលកំណត់ថ្ងៃចន្ទ ម៉ោង 00:00 សម្រាប់បង្អួចប្រចាំសប្តាហ៍ `calendar`។ មិនបានកំណត់ ឬមិនត្រឹមត្រូវ៖ ប្រើតំបន់ពេលវេលារបស់ process របស់ OmniRoute (តម្លៃ `TZ` របស់ host ឬ container ដែលជាញឹកញាប់មិនបានកំណត់ ពោលគឺ Coordinated Universal Time នៅក្នុង container images)។ មិនអើពើក្នុងរបៀប `provider`។ | | `OMNIROUTE_MAX_TOOLS_LIMIT` | `128` | `open-sse/config/constants.ts` | ចំនួនអតិបរមាលំនាំដើមនៃ tools ដែលអនុញ្ញាតក្នុងសំណើ (លំនាំដើមរបស់ OpenAI)។ អនុញ្ញាតតែចំនួនគត់វិជ្ជមានប៉ុណ្ណោះ; តម្លៃដែលមិនបានកំណត់ ឬមិនត្រឹមត្រូវ នឹងរក្សា `128`។ provider ដែលមានដែនកំណត់ស្គាល់ ឬកំណត់ជាមុន (`grok-cli` 200, `nvidia` 1536) នៅតែអនុវត្តដែនកំណត់ផ្ទាល់ខ្លួន — វាគ្រាន់តែផ្លាស់ប្តូរពិដានលំនាំដើមប៉ុណ្ណោះ។ គោលដៅទម្រង់ Claude មិនមានដែនកំណត់លំនាំដើមទេ (Messages API មិនមានដែនកំណត់នេះ); ដែនកំណត់ដែលបានរៀននៅតែអនុវត្ត។ | | `OMNIROUTE_TOOL_OUTPUT_IMAGE_MAX_COUNT` | `16` | `open-sse/translator/request/openai-responses.ts` | ចម្លើយសម្រាប់ការបកប្រែ Chat៖ ចំនួនរូបភាពលទ្ធផលរបស់ tool (`function_call_output`, `custom_tool_call_output`, role `tool`) ដែលត្រូវផ្ញើឡើងវិញជាផ្នែករូបភាពរបស់ user ក្នុងមួយសំណើ។ រូបភាពថ្មីបំផុតត្រូវបានរក្សាទុក ហើយរូបភាពចាស់ជាងនីមួយៗត្រូវបានបម្លែងជាអក្សរជំនួសដែលមាន `tool_call_id` របស់វា។ អនុញ្ញាតតែចំនួនគត់វិជ្ជមានប៉ុណ្ណោះ; តម្លៃដែលមិនបានកំណត់ ឬមិនត្រឹមត្រូវ នឹងរក្សា `16`។ | | `OMNIROUTE_TOOL_OUTPUT_IMAGE_MAX_BYTES` | `20971520` (20 MB) | `open-sse/translator/request/openai-responses.ts` | ទំហំសរុបនៃ URL រូបភាពលទ្ធផលរបស់ tool ដែលត្រូវផ្ញើឡើងវិញក្នុងមួយសំណើ ក្នុងការបកប្រែដូចគ្នា។ រូបភាពដែលលើសថវិកាត្រូវបានលុបចេញពីចាស់បំផុតជាមុន ដោយមានការព្រមានមួយក្នុងមួយសំណើ។ អនុញ្ញាតតែចំនួនគត់វិជ្ជមានប៉ុណ្ណោះ; តម្លៃដែលមិនបានកំណត់ ឬមិនត្រឹមត្រូវ នឹងរក្សា `20971520`។ | | `OMNIROUTE_RESPONSES_STRICT_TOOL_HISTORY` | `false` | `open-sse/translator/helpers/responsesToolHistory.ts` | របៀបដោះស្រាយប្រវត្តិ tool របស់ Responses ដែលមិនស្របគ្នា៖ output ដែលគ្មាន call, call ដែលគ្មាន output, `call_id` ដែលបាត់ វែងពេក ឬមិនត្រឹមត្រូវ ឬ arguments ប្រវត្តិសាស្ត្រដែលមានទម្រង់មិនត្រឹមត្រូវ។ បិទ៖ OmniRoute ជួសជុលប្រវត្តិ ហើយបញ្ជូនវាទៅដំណើរការ (orphan outputs ត្រូវបានលុប, calls ដែលមិនទាន់មានចម្លើយទទួល output ទទេ, ids ត្រូវបានបង្កើត ឬកាត់ឱ្យសមរម្យ, arguments ដែលមានទម្រង់មិនត្រឹមត្រូវក្លាយជា `{}`). បើក៖ សំណើនឹងទទួល `400` មុនពេលបញ្ជូនទៅដំណើរការ; ប្រវត្តិត្រឹមត្រូវត្រូវបានបញ្ជូនបន្តដោយរក្សា call ids និង JSON arguments ដូចដែលបានផ្ញើ។ ទទួល `true` ឬ `1`; តម្លៃផ្សេងទៀតទាំងអស់នឹងរក្សាលំនាំដើម។ | | `OMNIROUTE_PROMPT_EMULATE_TOOLS` | _(បើក)_ | `open-sse/executors/syntxChat.ts` | ការហៅ tool ដែល emulated តាម prompt របស់ SYNTX.ai៖ មិនបានកំណត់ ឬ `1`/`true`/`on`/`yes` នឹងបញ្ចូលកាតាឡុក tool មូលដ្ឋានទៅក្នុង prompt; តម្លៃផ្សេងទៀត (ឧ. `0`) នឹងរំលងការបញ្ចូលនោះ។ | --- ## ៧. URLs និងការធ្វើសមកាលកម្ម Cloud | អថេរ | លំនាំដើម | ឯកសារប្រភព | ការពិពណ៌នា | | ------------------------------------------- | ----------------------------------------------------------- | --------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `BASE_URL` | `http://localhost:20128` | `src/lib/cloudSync.ts` | URL ខាងម៉ាស៊ីនមេសម្រាប់ការងារធ្វើសមកាលកម្មខាងក្នុង ហៅទៅ `/api/sync/cloud`។ រក្សាវាជា URL loopback/container ទោះបីជាកម្មវិធីត្រូវបាន proxy ជាសាធារណៈក៏ដោយ។ ជំនាញ A2A ក៏ប្រើវាផងដែរ (សូមមើល `OMNIROUTE_BASE_URL`) ហើយនឹងបរាជ័យ ជំនួសឱ្យការផ្ញើ API key ទៅកាន់ URL plain-http សាធារណៈ។ | | `CLOUD_URL` | _(ទទេ)_ | `src/lib/cloudSync.ts` | URL endpoint សម្រាប់ cloud relay (មុខងារពិសេសបង់ប្រាក់)។ | | `CLOUD_SYNC_TIMEOUT_MS` | `12000` | `src/lib/cloudSync.ts` | រយៈពេលអស់កំណត់ HTTP សម្រាប់សំណើធ្វើសមកាលកម្ម cloud។ | | `OMNIROUTE_BUILD_PROFILE` | `full` | ការកំណត់រចនា Webpack | ប្រវត្តិរូបនៅពេល build (កំណត់ជា `minimal` ដើម្បីដកម៉ូឌុលដែលមានសិទ្ធិចេញពី bundle ជាក់ស្តែង)។ | | `OMNIROUTE_STANDALONE_DIR` | _.build/ លទ្ធផល standalone_ | `scripts/build/colocate-standalone.mjs` | ការបដិសេធនៅពេល build សម្រាប់ថតលទ្ធផល standalone ដែលជំហាន colocate បន្ទាប់ពី build ប្រើប្រាស់។ មិនមែនជាការកំណត់ពេល runtime ទេ។ | | `OMNIROUTE_DIST_DIR` | `dist/` (root របស់ repo) | `scripts/build/prepublish.ts` | ការបដិសេធនៅពេល build សម្រាប់ថតដែលជំហាន publish (`prepublish.ts`) សរសេរ CLI bundle ទៅ ជំនួសឱ្យ `dist/` ក្រោម root របស់ repo។ ថតនេះត្រូវបានលុបសម្អាតមុនពេល build។ មិនមែនជាការកំណត់ពេល runtime ទេ។ | | `OMNIROUTE_CLOUD_SYNC_SECRET` | _(empty)_ | `src/lib/cloudSync.ts` | សម្ងាត់រួមដែលប្រើសម្រាប់ផ្ទៀងផ្ទាត់ហត្ថលេខា HMAC-SHA256 នៃការឆ្លើយតបពី Cloud Sync។ | | `OMNIROUTE_CLOUD_SYNC_SECRETS` | `false` | `src/lib/cloudSync.ts` | កំណត់ជា `true` ដើម្បីអនុញ្ញាតឱ្យ endpoint របស់ Cloud Sync សរសេរជាន់លើព័ត៌មានសម្គាល់ក្នុងមូលដ្ឋាន។ តម្លៃលំនាំដើមគឺ `false`។ | | `OMNIROUTE_CLOUD_SYNC_ENFORCE_SIGNATURE` | `false` | `src/lib/cloudSync.ts` | កំណត់ជា `true` ដើម្បីបដិសេធការឆ្លើយតបពី Cloud Sync ដែលគ្មានហត្ថលេខា នៅពេលមិនមានសម្ងាត់ក្នុងមូលដ្ឋាន (#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, Dashboard, sync | URL សាធារណៈសម្រាប់ OAuth redirect_uri តំណភ្ជាប់ Dashboard និង URL សាធារណៈដែលបានបង្កើត។ កំណត់វាទៅជា URL សាធារណៈដែលមានស្ថិរភាព នៅពេល callback របស់ OAuth ឬតំណភ្ជាប់ browser ដែលបានបង្កើត ត្រូវប្រើ host canonical របស់ reverse-proxy។ | | `NEXT_PUBLIC_CLOUD_URL` | _(empty)_ | Client-side | ច្បាប់ចម្លងរបស់ `CLOUD_URL` សម្រាប់ផ្នែក client។ | | `NEXT_PUBLIC_APP_URL` | _(unset)_ | `src/shared/services/cloudSyncScheduler.ts` | ជម្រើសបម្រុងចាស់សម្រាប់ `NEXT_PUBLIC_BASE_URL`។ | | `NEXT_PUBLIC_PORT` | _(unset — falls back to `PORT`)_ | `src/shared/hooks/useDisplayBaseUrl.ts` | ច្រកជម្រើសបម្រុងសម្រាប់ផ្នែក client សម្រាប់ URL បង្ហាញ នៅពេលមិនស្គាល់ប្រភពដើម (SSR/tests)។ អានមុន `PORT`។ | | `OMNIROUTE_PUBLIC_BASE_URL` | _(unset)_ | Public-origin resolver, image URLs | ប្រភពដើមសម្រាប់សាធារណៈដែលមានអាទិភាពខ្ពស់បំផុតសម្រាប់ OmniRoute ដែលប្រើសម្រាប់បង្កើត URL សាធារណៈ និងការផ្ទៀងផ្ទាត់ប្រភពដើមរបស់ browser ដែលមិនមែនជា dashboard។ កំណត់វានៅពេល OpenWebUI ឬ relay ផ្សេងទៀតចូលទៅកាន់ OmniRoute តាម URL ខាងក្នុង ប៉ុន្តែ browser របស់អ្នកប្រើត្រូវទាញយកមេឌៀដែលបានបង្កើតពី LAN, tunnel ឬប្រភពដើមសាធារណៈ។ **កុំ** រួមបញ្ចូល `/v1`។ | | `OMNIROUTE_PROVIDER_MANIFEST_URL` | _(unset)_ | `open-sse/config/providerPluginManifestUrl.ts` | URL ពេញលេញរបស់ provider plugin manifest ដែលត្រូវបានផ្សព្វផ្សាយទៅកាន់ sidecar clients។ នៅពេលមិនបានកំណត់ OmniRoute នឹងកំណត់ `/api/v1/provider-plugin-manifest` ពីប្រភពដើមនៃ request ឬ HOST/PORT។ | | `OMNIROUTE_PUBLIC_PROTOCOL` | `http` | `open-sse/config/providerPluginManifestUrl.ts` | Protocol ដែលប្រើនៅពេលកំណត់ URL របស់ provider plugin manifest ពី HOST/PORT ដោយគ្មានប្រភពដើមនៃ request។ កំណត់ជា `https` នៅពីក្រោយ public proxy ដែលបញ្ចប់ TLS នៅពេលមិនបានកំណត់ `OMNIROUTE_PROVIDER_MANIFEST_URL` ជាក់លាក់។ | | `OMNIROUTE_TRUST_PROXY` | _(unset)_ | `src/server/origin/publicOrigin.ts` | របៀបជឿទុកចិត្តជាជម្រើសសម្រាប់ headers របស់ប្រភពដើមសាធារណៈដែលត្រូវបានបញ្ជូនបន្ត។ មិនកំណត់ = កុំជឿទុកចិត្ត `Forwarded` / `X-Forwarded-*` សម្រាប់ការសម្រេចចិត្តផ្នែកសុវត្ថិភាព។ `true` / `loopback` ជឿទុកចិត្ត host/proto ដែលត្រូវបានបញ្ជូនបន្ត តែពី loopback proxy ដែលមាន token បោះត្រាប៉ុណ្ណោះ។ `private` / `lan` ក៏ជឿទុកចិត្ត private-LAN proxy peers ផងដែរ អនុញ្ញាតឱ្យ `API_PORT` bridge រក្សាទុក `X-Forwarded-For` របស់ peer នោះ ហើយអនុញ្ញាតឱ្យ routes របស់ LOCAL_ONLY ទទួលយក client ពី private network ដែល proxy បែបនេះរាយការណ៍ (មិនដែលអនុញ្ញាតសំណើ Cloudflare-tunnel, ខ្សែសង្វាក់ដែលមានតែ loopback ឬ loopback-only CLI-token gate ឡើយ)។ គួរប្រើ `NEXT_PUBLIC_BASE_URL` ជាក់លាក់នៅក្នុង production។ | | `KIE_CALLBACK_URL` | _(unset)_ | `open-sse/utils/kieTask.ts` | URL callback សាធារណៈសម្រាប់ការងារ kie.ai អសមកាល។ ការកំណត់ជំនួសដែលមានអាទិភាពខ្ពស់បំផុត មុន `OMNIROUTE_KIE_CALLBACK_URL` និង `OMNIROUTE_PUBLIC_URL`។ | | `OMNIROUTE_KIE_CALLBACK_URL` | _(unset)_ | `open-sse/utils/kieTask.ts` | ឈ្មោះជំនួសរបស់ `KIE_CALLBACK_URL`។ ប្រើជាតម្លៃបម្រុងនៅពេលអថេរចម្បងមិនត្រូវបានកំណត់។ | | `OMNIROUTE_PUBLIC_URL` | _(unset)_ | `open-sse/utils/kieTask.ts` | ប្រភពដើមសាធារណៈដែលប្រើសម្រាប់ផ្សំ URL callback អសមកាល។ ជាតម្លៃបម្រុងដែលមានអាទិភាពទាបបំផុតសម្រាប់ callback របស់ kie.ai ហើយក៏ប្រើជាក URL សាធារណៈទូទៅសម្រាប់ relay ផ្សេងទៀតផងដែរ។ | | `OMNIROUTE_CROF_USAGE_URL` | `https://crof.ai/usage_api/` | `open-sse/services/usage.ts` | endpoint សម្រាប់ស្វែងរក quota របស់ CrofAI ដែលទំព័រ Usage ប្រើប្រាស់។ អាចប្តូរជំនួសសម្រាប់ relay / test fixtures។ | | `OMNIROUTE_CLINEPASS_USAGE_URL` | `https://api.cline.bot/api/v1/users/me/plan/usage-limits` | `open-sse/services/usage/clinepass.ts` | ចំណុចបញ្ចប់កូតា ClinePass រយៈពេល 5 ម៉ោង / ប្រចាំសប្តាហ៍ / ប្រចាំខែ ដែលទំព័រ Usage ប្រើប្រាស់។ អាចបដិសេធបានសម្រាប់ relay / test fixture។ | | `OMNIROUTE_OPENCODE_QUOTA_URL` | `https://opencode.ai/zen/go/v1/usage` | `open-sse/services/opencodeQuotaFetcher.ts` | ចំណុចបញ្ចប់ការប្រើប្រាស់ OpenCode Go ផ្លូវការ ដែលផ្ទៀងផ្ទាត់ដោយ API key និងត្រូវបានទំព័រ Usage ប្រើប្រាស់។ អាចបដិសេធបានសម្រាប់ relay / test fixture។ | | `OPENCODE_SYNTHESIZE_CLI_HEADERS` | `true` | `open-sse/executors/opencode.ts` | បង្កើត headers អត្តសញ្ញាណ OpenCode CLI (User-Agent, x-opencode-client/project, request/session UUIDs) សម្រាប់សំណើទៅ upstream opencode-go/zen ដែល client មិនបានផ្ញើ ដើម្បីឱ្យ Cloudflare នៅលើ VPS egress ទទួលយកពួកវា (#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` តាម provider ទេ។ អនុវត្តតែចំពោះ opencode executors ប៉ុណ្ណោះ។ នៅពេល keyless request ត្រូវបាន upstream gates តម្លៃដែលបានកំណត់ ប៉ុន្តែមិនមាន `opencode/= 1.17>` នឹងត្រូវជំនួសដោយតម្លៃលំនាំដើមនេះ ជំនួសឱ្យការបដិសេធ។ | | `OMNIROUTE_FORWARD_ATTRIBUTION` | `1` (on) | `open-sse/utils/opencodeHeaders.ts` | បញ្ជូន headers បញ្ជាក់ប្រភពកម្មវិធីរបស់ client (`x-session-id`, `x-title`, `http-referer`) ទៅកាន់ upstream providers ដើម្បីឱ្យសំណើដែលចាប់ផ្តើមនៅក្នុង harness ដែលមានរាយឈ្មោះ រក្សាអត្តសញ្ញាណរបស់វាតាមរយៈ router (OpenRouter publisher gates ប្រើតម្លៃទាំងនេះជាគន្លឹះ)។ `0`/`false`/`no`/`off` រក្សាអត្តសញ្ញាណ registry/operator ហើយលុបតម្លៃដែលផ្គត់ផ្គង់ដោយ client។ Headers ផ្ទាល់ខ្លួនដែលកំណត់ដោយ 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` | _(unset)_ | `open-sse/config/providerErrorRules.ts` | សំណុំ provider ដែលមានប្រសិទ្ធភាព ហើយការបរាជ័យ upstream របស់ពួកវាត្រូវបានបែងចែកតាម egress IP (429 មួយនឹងផ្អាកការតភ្ជាប់ sibling ទាំងអស់ដែលចែករំលែក IP នោះ)។ ប្រសិនបើមិនកំណត់ នឹងប្រើលំនាំដើម free-tier `opencode,opencode-go,opencode-cli`; `none`/`off`/`false`/`0` បិទ cascade ទាំងស្រុង; បញ្ជីដែលបំបែកដោយសញ្ញាក្បៀស នឹងជំនួសសំណុំនេះ។ ផែនការបង់ប្រាក់ត្រូវបាន upstream ដាក់ជាក្រុមតាម account ហើយអាចបិទវាបានដោយសុវត្ថិភាព (#9611)។ | | `OMNIROUTE_EGRESS_QUOTA_ROTATION_PROVIDERS` | _(unset)_ | `open-sse/config/providerErrorRules.ts` | វិសាលភាពនៃការបង្វិល egress នៅពេលបដិសេធ quota។ នៅពេលមិនបានកំណត់ វានឹងដាក់សមាជិក pool មួយឡែកនៅពេលទទួលបាន 429 តែសម្រាប់គ្រួសារ IP-bucketed ខាងលើប៉ុណ្ណោះ; `all` នឹងពង្រីកការកត់ត្រានេះទៅគ្រប់ provider ដូច្នេះ rate limit ដែលទទួលបានតាមរយៈសមាជិកមួយ នឹងធ្វើឱ្យការជ្រើសរើសបន្ទាប់ប្រើ egress ផ្សេងទៀត។ តម្លៃណាមួយក្រៅពី `all` នឹងត្រូវបានមិនអើពើ។ ត្រូវការឱ្យ `PROXY_SKIP_RECENTLY_FAILED` ដំណើរការ (តាមលំនាំដើមបើក)។ ឃ្លាំងត្រូវបានកំណត់សោតាមអាសយដ្ឋាន egress មិនមែនតាម (provider, address) ទេ ដូច្នេះ 429 ដែលបានពង្រីក នឹងដាក់សមាជិកនោះឱ្យនៅក្រៅសម្រាប់គ្រប់ provider រហូតដល់រយៈពេលផុតកំណត់ (5 នាទី ហើយកើនទ្វេដងដល់ 15)។ អានតាមលទ្ធផល response នីមួយៗ ដូច្នេះការផ្លាស់ប្តូរនឹងមានប្រសិទ្ធភាពដោយមិនចាំបាច់ចាប់ផ្តើមឡើងវិញ។ | | `OPENCODE_FREE_TIER_REQUEST_CONTRACT` | _(unset)_ | `open-sse/executors/opencodeFreeTierContract.ts` | កំណត់ជា `off` ដើម្បីបញ្ឈប់ការកែតម្រូវ body នៃសំណើ OpenCode ដែលគ្មាន key (ទង់ streaming និងបញ្ជី tool)។ Headers នៅតែត្រូវបានអនុវត្ត។ អានតាមសំណើនីមួយៗ ដូច្នេះការផ្លាស់ប្តូរមានប្រសិទ្ធភាពភ្លាមៗ។ | | `OPENCODE_FREE_TIER_PLACEHOLDER_TOOLS` | _(unset)_ | `open-sse/executors/opencodeFreeTierContract.ts` | ឈ្មោះ tool ដែលបំបែកដោយសញ្ញាក្បៀស ដើម្បីប្រកាសលើសំណើ OpenCode ដែលគ្មាន key និងគ្មាន tool នៅពេលមិនទាន់មានអ្វីត្រូវបានសង្កេតឃើញសម្រាប់ model នោះ។ ប្រសិនបើទទេ នឹងត្រឡប់ទៅប្រើ placeholder តែមួយ ដែល model ត្រូវបានប្រាប់មិនឱ្យហៅប្រើ។ អតិបរមា 32 ធាតុ, `[A-Za-z_][A-Za-z0-9_-]{0,63}`; ធាតុដែលមិនត្រឹមត្រូវនឹងត្រូវបានមិនអើពើ។ | | `OPENCODE_FREE_TIER_CREDENTIAL` | `public` | `open-sse/executors/opencodeFreeTierContract.ts` | Credential ដែលផ្ញើតាម free-tier lane ដែលមានការកំណត់ (`https://opencode.ai/inference/v1`)។ ចាប់ពី 2026-10-21 lane នោះឆ្លើយតប 403 `Model access is disabled` ចំពោះ API key ពិតប្រាកដ ហើយបម្រើ literal អនាមិកជំនួសវិញ។ `key` នឹងរក្សា API key របស់ operator, `none`/`off` នឹងមិនផ្ញើ credential header ទេ, ហើយ literal ផ្សេងទៀតនឹងត្រូវបានផ្ញើជ bearer token។ អានតាមសំណើនីមួយៗ។ | | `OPENCODE_FREE_TIER_RELAY_URL` | unset | `src/lib/opencodeFreeRelay.ts` | Base URL របស់ Bun relay សម្រាប់សំណើ OpenCode free-tier ដែលមានការកំណត់។ នៅពេលកំណត់ សំណើទាំងនោះនឹងមាន system prompt និង tool set របស់ OpenCode CLI ហើយត្រូវបានផ្ញើតាម relay (`scripts/ops/opencode-free-relay.ts`) ព្រោះ upstream ឆ្លើយតប 429 ចំពោះ HTTP client ដែលមិនមែនជា Bun។ URL loopback នឹងត្រូវបានចាប់ផ្តើមជាមួយ server នៅពេល `bun` មាននៅក្នុង PATH; path នៅលើ URL នឹងត្រូវបានមិនអើពើ។ `http://` ធម្មតាត្រូវបានទទួលយកតែសម្រាប់ host loopback (`localhost`, `127.0.0.0/8`, `::1`) ប៉ុណ្ណោះ; host ផ្សេងទៀតត្រូវតែប្រើ `https://` បើមិនដូច្នោះទេ សំណើនឹងបរាជ័យដោយមានកំហុសច្បាស់លាស់។ Chat Completions ប៉ុណ្ណោះ។ អានតាមសំណើនីមួយៗ។ | | `OPENCODE_FREE_RELAY_BUN` | `bun` on PATH | `src/lib/opencodeFreeRelay.ts` | Binary របស់ Bun ដែលប្រើសម្រាប់ចាប់ផ្តើម relay។ | | `OPENCODE_FREE_RELAY_SCRIPT` | `scripts/ops/opencode-free-relay.ts` under the package root | `src/lib/opencodeFreeRelay.ts` | Path របស់ relay script។ តម្លៃលំនាំដើមត្រូវបានដោះស្រាយពី package root ដែលបានដំឡើង បន្ទាប់មកពី working directory។ | | `OPENCODE_FREE_RELAY_HOST` | `127.0.0.1` | `scripts/ops/opencode-free-relay.ts` | Host ដែល relay ស្តាប់។ | | `OPENCODE_FREE_RELAY_PORT` | `20199` | `scripts/ops/opencode-free-relay.ts` | Port ដែល relay ស្តាប់។ | | `OPENCODE_FREE_RELAY_UPSTREAM` | `https://opencode.ai` | `scripts/ops/opencode-free-relay.ts` | Origin ដែល relay បញ្ជូនបន្តទៅ។ ត្រូវតែជា `https://` (`http://` ត្រូវបានអនុញ្ញាតសម្រាប់ loopback test origin ប៉ុណ្ណោះ); relay នឹងបដិសេធមិនចាប់ផ្តើម ប្រសិនបើមិនដូច្នោះទេ។ | | `OPENCODE_FREE_RELAY_TOKEN` | unset | `scripts/ops/opencode-free-relay.ts`, `open-sse/executors/opencodeRelay.ts` | Shared secret។ OmniRoute ផ្ញើវានៅក្នុង `x-opencode-relay-auth`; relay នឹងឆ្លើយតប 401 ប្រសិនបើគ្មានវា។ ត្រូវការ៖ relay ដែលមាន `OPENCODE_FREE_RELAY_HOST` មិនមែនជា loopback នឹងបដិសេធមិនចាប់ផ្តើម ប្រសិនបើគ្មានវា។ | | `OPENCODE_FREE_RELAY_PROXY_ALLOWLIST` | unset | `scripts/ops/opencode-free-relay.ts` | Proxy egress ដែលបំបែកដោយសញ្ញាក្បៀសជា `host` ឬ `host:port` ដែល relay មិនមែនជា loopback ទទួលយកពី caller (`x-opencode-relay-proxy`); proxy ផ្សេងទៀតនឹងឆ្លើយតប 403។ មិនអើពើនៅពេល bind ទៅ loopback។ | | `OMNIROUTE_OLLAMA_CLOUD_USAGE_URL` | `https://ollama.com/settings` | `open-sse/services/usage.ts` | URL ការកំណត់របស់ Ollama Cloud ដែលប្រើសម្រាប់ទាញយក quota។ អាចប្តូរជំនួសសម្រាប់ relay / test fixture។ | | `OMNIROUTE_OLLAMA_CLOUD_BALANCE_URL` | `https://ollama.com/api/balance` | `open-sse/services/ollamaCloudBalance.ts` | ចំណុចបញ្ចប់ balance ដែលបានចងក្រងជាឯកសាររបស់ Ollama Cloud ខាង upstream (`GET https://ollama.com/api/balance`, `Authorization: Bearer `)។ អានតែម្តងនៅពេលផ្ទុកម៉ូឌុល។ ប្រើជាជម្រើសដំបូងសម្រាប់កូតា Ollama Cloud នៅពេល connection មាន API key; កម្មវិធីអាន cookie ពី settings-page នៅតែជាជម្រើស fallback។ អាចប្តូរតម្លៃនេះសម្រាប់ relay / test fixture។ | | `OLLAMA_USAGE_COOKIE` | _(មិនបានកំណត់)_ | `open-sse/services/usage.ts` | Cookie `__Secure-session` របស់ Ollama Cloud ដែលប្រើសម្រាប់អានកូតាពី settings-page។ មានព័ត៌មានរសើប; ប្រសិនបើបានកំណត់គណនីច្រើន សូមប្រើវាល Dashboard តាម connection ជំនួស។ | | `OLLAMA_CLOUD_USAGE_COOKIE` | _(មិនបានកំណត់)_ | `open-sse/services/usage.ts` | អថេរបរិស្ថាន cookie `__Secure-session` ជំនួសរបស់ Ollama Cloud។ មានព័ត៌មានរសើប; ប្រសិនបើបានកំណត់គណនីច្រើន សូមប្រើវាល Dashboard តាម connection ជំនួស។ | | `OMNIROUTE_OLLAMA_USAGE_COOKIE` | _(មិនបានកំណត់)_ | `open-sse/services/usage.ts` | អថេរបរិស្ថាន cookie `__Secure-session` ជំនួសរបស់ Ollama Cloud ដែលប្រើមុន aliases ដែលខ្លីជាងនេះ។ មានព័ត៌មានរសើប; ប្រសិនបើបានកំណត់គណនីច្រើន សូមប្រើវាល Dashboard តាម connection ជំនួស។ | | `OMNIROUTE_CODEWHISPERER_BASE_URL` | `https://codewhisperer.us-east-1.amazonaws.com` | `open-sse/services/usage.ts` | ចំណុចបញ្ចប់ដែនកំណត់ការប្រើប្រាស់របស់ 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 មិនត្រូវគ្នា ហើយតំណសាធារណៈដែលបានបង្កើត អាចចង្អុលទៅកាន់ប្រភពដើមរបស់ container ខាងក្នុង។ > > រក្សា `BASE_URL` ជា URL loopback/container ខាងក្នុង សម្រាប់ server-to-server jobs។ កុំប្រើ browser `Origin` ឬ hostname សាធារណៈ សម្រាប់ការហៅខ្លួនឯងខាងក្នុងដែលមានព័ត៌មានសម្ងាត់។ > > ការសរសេរទៅកាន់ dashboard ដែលបានផ្ទៀងផ្ទាត់អត្តសញ្ញាណ មិនតម្រូវឱ្យមាន public base URL ថេរទេ៖ dashboard ផ្ញើសំណើ unsafe ដែលមាន same-origin ជាមួយ CSRF token ភ្ជាប់នឹង session។ OmniRoute នៅតែប្រមូលផ្តុំការផ្ទៀងផ្ទាត់ public-origin សម្រាប់ការរួមបញ្ចូល browser ដែលមិនមែនជា dashboard៖ explicit public URL env vars ត្រូវបានទុកចិត្តជាមុន; headers `Forwarded` / `X-Forwarded-*` ដើម ត្រូវបានមិនអើពើ លុះត្រាតែ `OMNIROUTE_TRUST_PROXY` ត្រូវបានបើក ហើយ immediate proxy peer ត្រូវបានបញ្ជាក់ថាជា trusted ដោយ token។ កុំប្រើការកំណត់ CORS ដើម្បីជួសជុលសំណើ same-origin របស់ dashboard; CORS ប្រើសម្រាប់ browser clients ដែលជា cross-origin ប៉ុណ្ណោះ។ --- ## 8. ប្រូកស៊ីចេញក្រៅ បញ្ជូនការហៅទៅកាន់អ្នកផ្តល់សេវា LLM ខាងលើ តាមរយៈប្រូកស៊ី HTTP ឬ SOCKS5 សម្រាប់ការគ្រប់គ្រងចរាចរណ៍ចេញក្រៅ ការកំណត់ទីតាំងភូមិសាស្ត្រ ឬការលាក់អាសយដ្ឋាន IP។ `OMNIROUTE_UPSTREAM_HTTP2_ENABLED` មានតម្លៃលំនាំដើមជា `true`។ កំណត់វាទៅជា `false`, `0`, `no` ឬ `off` ដើម្បីបង្ខំឱ្យប្រើ HTTP/1.1 នៅលើ dispatchers របស់ Undici ក្នុង `open-sse/utils/proxyDispatcher.ts` និង `open-sse/utils/proxyFetch.ts`៖ ការបញ្ជូនចេញក្រៅដោយផ្ទាល់ ប្រូកស៊ី HTTP(S)/SOCKS បញ្ជូនបន្ត និងការសាកល្បងឡើងវិញតាម socket ថ្មីរបស់ពួកវា។ វារក្សាទុកការផ្ទៀងផ្ទាត់វិញ្ញាបនបត្រ TLS ការផ្ទៀងផ្ទាត់ប្រូកស៊ី ដែនកំណត់ការតភ្ជាប់ និង ការកំណត់ keep-alive។ ចាប់ផ្ដើម OmniRoute ឡើងវិញ បន្ទាប់ពីផ្លាស់ប្ដូរវា ពីព្រោះ dispatchers ត្រូវបានរក្សាទុកក្នុងឃ្លាំងសម្ងាត់ ហើយ relay agents ត្រូវបានបង្កើតនៅពេលចាប់ផ្ដើម។ កុងតាក់នេះមិនគ្រប់គ្រងការកំណត់ស្នាមម្រាមដៃ TLS របស់ wreq ឬការបញ្ជូនជាក់លាក់តាមអ្នកផ្តល់សេវាទេ។ | អថេរ | លំនាំដើម | ឯកសារប្រភព | ការពិពណ៌នា | | ---------------------------------------- | --------------- | ---------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `ENABLE_SOCKS5_PROXY` | `true` | `open-sse/executors` | បើកភ្នាក់ងារ SOCKS5 proxy សម្រាប់ការហៅ upstream។ ជ្រើសមិនប្រើដោយកំណត់ជា `false`។ | | `OMNIROUTE_GZIP_REQUEST_BODIES` | `true` | `open-sse/executors/base/gzipRequestBody.ts` | បង្ហាប់តួសំណើដោយ Gzip ដែលផ្ញើទៅកាន់ `api.anthropic.com` ផ្លូវការ (4096+ តួអក្សរ សម្រាប់តែការតភ្ជាប់ដោយផ្ទាល់ប៉ុណ្ណោះ; រំលងនៅពេលឆ្លងកាត់ proxy, ការក្លែងធ្វើ TLS ឬ `NODE_EXTRA_CA_CERTS`)។ Anthropic ទទួលយកតែ gzip ប៉ុណ្ណោះ។ ប្រសិនបើការអ៊ិនកូដត្រូវបានបដិសេធ (415, 400/403 ដែលមិនមែនជារបស់ Anthropic ឬ 400 ពីការញែក JSON នៅ origin) នោះនឹងផ្ញើឡើងវិញដោយមិនបានបង្ហាប់ម្តង ហើយ origin នឹងបន្តមិនបានបង្ហាប់រយៈពេលមួយម៉ោង។ ជ្រើសមិនប្រើដោយកំណត់ជា `0`, `false`, `off` ឬ `no`។ | | `NEXT_PUBLIC_ENABLE_SOCKS5_PROXY` | `true` | ផ្នែកម៉ាស៊ីនភ្ញៀវ | ការយល់ដឹងរបស់ផ្នែកម៉ាស៊ីនភ្ញៀវអំពីភាពអាចប្រើបានរបស់ SOCKS5។ | | `PROXY_SKIP_RECENTLY_FAILED` | `true` | `src/shared/utils/featureFlags.ts` | ទង់មុខងារដែលបើកជាលំនាំដើម (សូមមើល [FEATURE_FLAGS.md](./FEATURE_FLAGS.md); ការកំណត់ជំនួសពីមូលដ្ឋានទិន្នន័យ dashboard មានអាទិភាព)។ បណ្តុំ proxy និងការបង្វិលតាមគណនីនីមួយៗ នឹងឈប់ផ្តល់សមាជិកដែលទើបបរាជ័យឡើងវិញ (ការស្ទង់ TCP ត្រូវបានបដិសេធ ឬទទួលបាន 429 តាមរយៈវា) ក្នុងរយៈពេលដែលកើនទ្វេដងរាល់ការកើតឡើងម្តងទៀត រហូតដល់ដល់កម្រិតអតិបរមា។ `false` នឹងស្តារការជ្រើសរើសធម្មតាវិញ។ | | `SELECTOR_CONTROL_ALLOWLIST` | _(មិនបានកំណត់)_ | `src/lib/proxySubscription/selectorGuard.ts` | បញ្ជីអនុញ្ញាតសម្រាប់គោលដៅ selector-control របស់ local-core លើសពី loopback (ម៉ាស៊ីន ឬអាសយដ្ឋាន IP ដែលបំបែកដោយសញ្ញាក្បៀស/ដកឃ្លា, `*` បើក LAN/private ប៉ុន្តែមិនដែលបើក metadata/link-local ទេ)។ Loopback តាម http/https ត្រូវបានអនុញ្ញាតជាលំនាំដើម។ តម្លៃពីមូលដ្ឋានទិន្នន័យ 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_FLAGS.md](./FEATURE_FLAGS.md); ការកំណត់ជំនួសពីមូលដ្ឋានទិន្នន័យ dashboard មានអាទិភាព)។ សម្រាប់អ្នកផ្តល់សេវាដែលកូតារបស់ពួកគេត្រូវបានបែងចែកតាមអាសយដ្ឋាន egress សូមដាក់សមាជិកបណ្តុំដែលចែករំលែកអាសយដ្ឋាន egress ដែលបានសង្កេតឃើញពីសមាជិកដែលទើបតែត្រូវបានបដិសេធ នៅខាងក្រោមសមាជិកដែលមានសុខភាពល្អបន្តិច។ កំណត់តែលំដាប់ប៉ុណ្ណោះ មិនដែលដកចេញទេ។ ត្រូវការការកំណត់ `PROXY_SKIP_RECENTLY_FAILED` ដែលបង្កើតសញ្ញានៃការបដិសេធដែលវាអាន។ | | `PROXY_WEBHOOK_REBOUND_MS` | `300000` | `src/lib/proxyEvents/proxyTransitionBridge.ts` | បង្អួច rebound (ms) ដែលកំណត់ការជូនដំណឹង webhook `proxy.set_aside` ដែលកើតឡើងម្តងទៀតសម្រាប់សមាជិកបណ្តុំម្នាក់ៗ ដើម្បីឱ្យការបដិសេធជាបណ្តុំផ្ញើព្រឹត្តិការណ៍តែមួយ។ អានរាល់ពេលបញ្ចេញ។ ត្រូវបានកំណត់ក្នុងចន្លោះ `1000..3600000`; តម្លៃក្រៅចន្លោះ ឬមិនអាចអានបាន នឹងត្រឡប់ទៅលំនាំដើមវិញដោយស្ងាត់។ | | `HTTP_PROXY` | _(មិនបានកំណត់)_ | ស្តង់ដារ Node.js | HTTP proxy សម្រាប់ការហៅ upstream។ | | `HTTPS_PROXY` | _(unset)_ | ស្តង់ដារ Node.js | ប្រូកស៊ី HTTPS សម្រាប់ការហៅទៅ upstream។ | | `ALL_PROXY` | _(unset)_ | ស្តង់ដារ Node.js | ប្រូកស៊ីសកល (គាំទ្រ `socks5://`)។ | | `OMNIROUTE_PROXY_ECHO_URL` | _(unset)_ | `src/lib/proxyEchoTarget.ts` | កំណត់ echo-IP target ដែលប្រើដោយការត្រួតពិនិត្យ proxy egress ឱ្យនៅ URL តែមួយ។ ប្រសិនបើមិនកំណត់ ការត្រួតពិនិត្យនឹងសាកល្បង `api64.ipify.org` បន្ទាប់មក `api4.ipify.org` ដើម្បីកុំឱ្យ tunnel ដែលប្រើតែ IPv4 ត្រូវបានរាយការណ៍ថាដំណើរការមិនបាន (#9694)។ | | `NO_PROXY` | _(unset)_ | ស្តង់ដារ Node.js | ឈ្មោះ host/IP ដែលបំបែកដោយសញ្ញាក្បៀស សម្រាប់រំលងប្រូកស៊ី។ | | `OMNIROUTE_PROXY_DISPATCHER_CONNECTIONS` | `32` | `open-sse/utils/proxyDispatcher.ts` | ចំនួន socket ដែលអាចដំណើរការស្របគ្នាអតិបរមា ក្នុងមួយ HTTP/SOCKS proxy dispatcher ដែលបានរក្សាទុកក្នុង cache។ ស្ទ្រីម SSE ដែលមានអាយុកាលយូរ ដូចជា Codex `/v1/responses` ត្រូវការការតភ្ជាប់លើសពីមួយ នៅពេលសំណើជាច្រើនប្រើ proxy កម្រិតគណនីដូចគ្នា។ តម្លៃលើសពី `256` នឹងត្រូវកំណត់ត្រឹម `256`។ | | `SOCKS_HANDSHAKE_TIMEOUT_MS` | `10000` | `open-sse/utils/socksConnectorWithFamily.ts` | អស់ពេលសម្រាប់ SOCKS5 handshake (connect) គិតជាមិល្លីវិនាទី។ បង្កើនតម្លៃនេះ នៅពេល gateway host សម្រាប់ residential តែមួយត្រូវបានប្រើក្នុងកម្រិត concurrency ខ្ពស់ (ឧ. សំណើ 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)** ជំនួសឱ្យការប្តូរទៅការតភ្ជាប់ដោយផ្ទាល់ — ការពារការលេចធ្លាយ real-IP។ កំណត់ជា `true` ដើម្បីស្តារការប្តូរទៅ DIRECT តាមលំនាំចាស់។ | | `ENABLE_TLS_FINGERPRINT` | `false` | `open-sse/executors` | ក្លែងធ្វើ TLS fingerprint ដោយប្រើ wreq-js (ធ្វើត្រាប់តាម Chrome 124)។ ប្រឆាំងនឹងការទប់ស្កាត់ JA3/JA4។ | | `TLS_FINGERPRINT_PROVIDERS` | _(unset)_ | `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 របស់ស្ថាប័ន** | `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 — អនុញ្ញាតការប្តូរទៅការតភ្ជាប់ដោយផ្ទាល់** | `PROXY_FAIL_OPEN=true`។ ស្តារឥរិយាបថមុនពេលរឹតបន្តឹង៖ ប្រើការតភ្ជាប់ដោយផ្ទាល់ នៅពេលការដោះស្រាយ proxy បរាជ័យ។ | > **ចំណាំ (ការរំលងការផ្ទៀងផ្ទាត់របស់ NVIDIA — #3226):** ចំណុចបញ្ចប់ការផ្ទៀងផ្ទាត់ API key របស់ NVIDIA > ជាប់គាំង នៅពេលបញ្ជូនតាមរយៈ fetch សកលដែលប្រើប្រូកស៊ី/TLS ដែលបានកែប្រែ (undici dispatcher → 504)។ > `src/lib/providers/validation.ts::directHttpsRequest()` រំលង patch ប្រូកស៊ីដោយចេតនា > សម្រាប់ការហៅផ្ទៀងផ្ទាត់តែមួយនោះ ដោយប្រើ `safeOutboundFetch({ bypassProxyPatch: true })`។ > នេះគឺជាករណីលើកលែងដែលមានឯកសារកត់ត្រា និងកំណត់វិសាលភាព — វា **មិន** ប៉ះពាល់ដល់ > ចរាចរចេញសម្រាប់ការជជែក/ការប្រើប្រាស់ទេ។ > ការរំលងនេះត្រូវបានកំណត់វិសាលភាពដោយ `tests/unit/proxy-bypass-scope-guard-3226.test.ts`។ --- ## 9. ការរួមបញ្ចូលឧបករណ៍ CLI គ្រប់គ្រងរបៀបដែល OmniRoute ស្វែងរក និងបើកដំណើរការ sidecar របស់ CLI (Claude Code, Codex និងផ្សេងៗទៀត)។ | អថេរ | លំនាំដើម | ឯកសារប្រភព | សេចក្ដីពិពណ៌នា | | --------------------------------- | ------------------------------------------------------- | ----------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `CLI_MODE` | `auto` | `src/shared/services/cliRuntime.ts` | `auto` = ស្វែងរកក្នុង PATH របស់ប្រព័ន្ធ; `manual` = ប្រើតែផ្លូវដែលបានកំណត់ជាក់លាក់។ | | `CLI_EXTRA_PATHS` | _(unset)_ | `src/shared/services/cliRuntime.ts` | ធាតុ PATH បន្ថែមសម្រាប់ស្វែងរកឯកសារប្រតិបត្តិ CLI (បំបែកដោយសញ្ញា colon)។ | | `CLI_CONFIG_HOME` | _(unset)_ | `src/shared/services/cliRuntime.ts` | បដិសេធថត home សម្រាប់អានការកំណត់រចនាសម្ព័ន្ធ CLI (`~/.claude`, `~/.codex`)។ ត្រូវតែជាផ្លូវ absolute និងស្ថិតនៅក្នុង home របស់ process — **ឬ**, នៅក្នុង container ជាផ្លូវដែលបាន bind-mount (នោះជារបៀបដែល `/host-home` ដំណើរការ)។ ករណីផ្សេងទៀតនឹងត្រឡប់ទៅប្រើថត home។ | | `CLI_ALLOW_CONFIG_WRITES` | `true` | `src/shared/services/cliRuntime.ts` | អនុញ្ញាតឱ្យ OmniRoute សរសេរឯកសារកំណត់រចនាសម្ព័ន្ធ CLI (ការធ្វើឱ្យ token ស្រស់ និងទិន្នន័យ session)។ កំណត់ជា `false` ដើម្បីឱ្យការសរសេរការកំណត់រចនាសម្ព័ន្ធ CLI ទាំងអស់បរាជ័យដោយមានកំហុសជាក់លាក់ "writes disabled"។ | | `CLI_CLAUDE_BIN` | `claude` | `src/shared/services/cliRuntime.ts` | ផ្លូវផ្ទាល់ខ្លួនទៅឯកសារប្រតិបត្តិ Claude CLI។ | | `CLI_CODEX_BIN` | `codex` | `src/shared/services/cliRuntime.ts` | ផ្លូវផ្ទាល់ខ្លួនទៅឯកសារប្រតិបត្តិ Codex CLI។ | | `CLI_DROID_BIN` | `droid` | `src/shared/services/cliRuntime.ts` | ផ្លូវផ្ទាល់ខ្លួនទៅឯកសារប្រតិបត្តិ Droid CLI។ | | `CLI_OPENCLAW_BIN` | `openclaw` | `src/shared/services/cliRuntime.ts` | ផ្លូវផ្ទាល់ខ្លួនទៅឯកសារប្រតិបត្តិ OpenClaw CLI។ | | `CLI_CURSOR_BIN` | `agent`, then `cursor` | `src/shared/services/cliRuntime.ts` | ផ្លូវផ្ទាល់ខ្លួនទៅឯកសារប្រតិបត្តិ agent របស់ Cursor។ ប្រសិនបើមិនបានកំណត់ទេ ការរកឃើញនឹងសាកល្បង `agent` ជាមុន ហើយបន្ទាប់មកប្រើ `cursor` ប្រសិនបើបរាជ័យ។ | | `CLI_CLINE_BIN` | `cline` | `src/shared/services/cliRuntime.ts` | ផ្លូវផ្ទាល់ខ្លួនទៅឯកសារប្រតិបត្តិ Cline CLI។ | | `CLI_5DIVE_BIN` | `5dive` | `src/shared/services/cliRuntime.ts` | ផ្លូវផ្ទាល់ខ្លួនទៅឯកសារប្រតិបត្តិ 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` | ផ្លូវផ្ទាល់ខ្លួនទៅឯកសារប្រតិបត្តិ Continue CLI។ | | `CLI_QODER_BIN` | `qodercli` | `src/shared/services/cliRuntime.ts` | ផ្លូវផ្ទាល់ខ្លួនទៅឯកសារប្រតិបត្តិ Qoder CLI។ | | `CLI_QWEN_BIN` | `qwen` | `src/shared/services/cliRuntime.ts` | ផ្លូវផ្ទាល់ខ្លួនទៅកាន់ binary របស់ Qwen Code CLI។ | | `CLI_AIDER_BIN` | `aider` | `src/shared/services/cliRuntime.ts` | ផ្លូវផ្ទាល់ខ្លួនទៅកាន់ binary របស់ Aider CLI។ | | `CLI_GOOSE_BIN` | `goose` | `src/shared/services/cliRuntime.ts` | ផ្លូវផ្ទាល់ខ្លួនទៅកាន់ binary របស់ Goose CLI។ | | `CLI_WHYCODES_BIN` | `whycodes` | `src/shared/services/cliRuntime.ts` | ផ្លូវផ្ទាល់ខ្លួនទៅកាន់ binary របស់ WhyCodes CLI។ | | `CLI_GEMINI_BIN` | `gemini` | `src/shared/services/cliRuntime.ts` | ផ្លូវផ្ទាល់ខ្លួនទៅកាន់ binary របស់ Google Gemini CLI — ប្រើសម្រាប់ការរកឃើញ/ការត្រួតពិនិត្យសុខភាពនៅផ្នែក server ប៉ុណ្ណោះ; `omniroute run gemini` នឹងដោះស្រាយ binary `gemini` ពី system PATH។ | | `CLI_KILO_BIN` | `kilocode` | `src/shared/services/cliRuntime.ts` | ផ្លូវផ្ទាល់ខ្លួនទៅកាន់ binary របស់ Kilo Code CLI។ | | `CLI_OPENCODE_BIN` | `opencode` | `src/shared/services/cliRuntime.ts` | ផ្លូវផ្ទាល់ខ្លួនទៅកាន់ 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` | _(none)_ | `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` | _(required)_ | `open-sse/executors/devin-cli-agentic.ts` | home ដាច់ដោយឡែកជាផ្លូវ absolute សម្រាប់ 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 ហើយត្រឡប់ 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 ដាច់ដោយឡែកដែលប្រើសម្រាប់ subagents របស់ 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 សម្រាប់ binary របស់ Augment (Auggie) CLI ដែលប្រើដោយ provider `auggie` មូលដ្ឋាន។ ប្រសិនបើមិនមាន នឹងប្រើ `CLI_AUGGIE_BIN` បន្ទាប់មកស្វែងរកក្នុង PATH។ | | `CLI_AUGGIE_BIN` | `auggie` | `open-sse/executors/auggie.ts` | ការបដិសេធឈ្មោះកាត់សម្រាប់ផ្លូវប្រព័ន្ធគោល CLI របស់ Augment (Auggie) (ពិនិត្យបន្ទាប់ពី `AUGGIE_BIN`)។ | | `ZCODE_BIN` | `zcode` | `open-sse/executors/zcode.ts` | ប្រព័ន្ធគោលដែលប្រើសម្រាប់ម៉ាស៊ីនភ្ញៀវ stdio របស់អ្នកផ្តល់សេវា `zcode` ក្នុងមូលដ្ឋាន។ ប្រសិនបើរកមិនឃើញ នឹងប្រើ `zcode` នៅលើ PATH។ | | `ZCODE_ARGS` | — | `open-sse/executors/zcode.ts` | អារេ JSON (ខ្សែអក្សរមិនលើសពី 16) នៃអាគុយម៉ង់បន្ថែមដែលបញ្ជូនទៅប្រព័ន្ធគោល `zcode` នៅពេលបើកដំណើរការតាមរយៈ `cliTools`។ | | `ZCODE_CWD` | `process.cwd()` | `open-sse/executors/zcode.ts` | ថតការងារសម្រាប់ subprocess របស់ម៉ាស៊ីនមេកម្មវិធី ZCode។ | | `ZCODE_TRANSPORT` | `app-server` | `open-sse/executors/zcode.ts` | `app-server` (លំនាំដើម) ឬ `gateway`។ **សាកល្បង / មិនមានការគាំទ្រ៖** `gateway` ផ្ញើសំណើ HTTP ដោយផ្ទាល់ទៅ Z.AI Coding Plan ដោយចម្លងពិធីការម៉ាស៊ីនភ្ញៀវ ZCode (ការចាប់ដៃសម្រាប់ការចុះហត្ថលេខា និងបឋមកថា proof-of-work របស់ម៉ាស៊ីនភ្ញៀវ 0.16.9) ហើយអាចឈប់ដំណើរការនៅពេល ZCode ធ្វើបច្ចុប្បន្នភាព។ វាទទួលយកតែប្រវត្តិរូប Individual Coding Plan ប៉ុណ្ណោះ។ | | `ZCODE_PROVIDER_ID` | `account:zai-individual-coding-plan` | `open-sse/executors/zcode.ts` | ប្រវត្តិរូបអ្នកផ្តល់សេវាដើមជាក់លាក់សម្រាប់ជ្រើសរើសម៉ូដែល។ នៅពេលមិនបានកំណត់ នឹងប្រើប្រវត្តិរូបគណនី Individual Plan ហើយបើមិនមាន នឹងត្រឡប់ទៅ `builtin:zai-coding-plan` (ធាតុកំណត់រចនាសម្ព័ន្ធដែលផ្ទុកសោ Individual Coding Plan)។ កំណត់ ID ជាក់លាក់ ដូចជា `account:zai-start-plan` ដើម្បីចាក់សោប្រវត្តិរូបនោះ; ប្រវត្តិរូបដែលបានចាក់សោនឹងមិនត្រឡប់ទៅជម្រើសផ្សេងទេ។ | | `ZCODE_SERVER_RUNTIME_ROOT` | `~/.zcode/server` | `open-sse/executors/zcode.ts` | ថតឫសនៃ runtime របស់ម៉ាស៊ីនមេកម្មវិធី ZCode (កន្លែងដែល `node` និង `zcode-server.cjs` ដែលបានបញ្ចូលមកជាមួយស្ថិតនៅ)។ | | `ZCODE_SERVER_NODE` | `/node` | `open-sse/executors/zcode.ts` | ឯកសារប្រតិបត្តិ Node ដែលប្រើសម្រាប់បង្ហោះម៉ាស៊ីនមេកម្មវិធី ZCode។ | | `ZCODE_SERVER_ENTRY` | `/zcode-server.cjs` | `open-sse/executors/zcode.ts` | ស្គ្រីបចាប់ផ្តើមម៉ាស៊ីនមេកម្មវិធី ដែលប្រើសម្រាប់បង្ហោះម៉ាស៊ីនមេ ZCode។ | | `ZCODE_STARTUP_TIMEOUT_MS` | `10000` | `open-sse/executors/zcode.ts` | អស់ពេលចាប់ផ្តើម (ms) មុនពេលការបើកដំណើរការម៉ាស៊ីនមេកម្មវិធី ZCode ត្រូវបានចាត់ទុកថាបរាជ័យ។ | | `ZCODE_RPC_TIMEOUT_MS` | `30000` | `open-sse/executors/zcode.ts` | អស់ពេល RPC ក្នុងមួយសំណើ (ms) សម្រាប់ការហៅទៅម៉ាស៊ីនមេកម្មវិធី ZCode។ | | `ZCODE_TURN_TIMEOUT_MS` | `120000` | `open-sse/executors/zcode.ts` | រយៈពេលអតិបរមា (ms) នៃវគ្គ ZCode មួយ មុនពេល supervisor បញ្ចប់វាដោយសារអស់ពេល។ | | `ZCODE_POLL_INTERVAL_MS` | `250` | `open-sse/executors/zcode.ts` | ចន្លោះពេលស្ទង់មើល (ms) សម្រាប់ការបញ្ចប់វគ្គ ZCode។ | | `MINIMAX_CODE_GATEWAY_URL` | `https://agent.minimax.io/mavis/api/v1/llm/v1/messages` | `open-sse/executors/minimaxCodeGateway.ts` | ចំណុចបញ្ចប់របស់ gateway គ្រប់គ្រង MiniMax ដែលឆ្លើយតបដោយការហៅឧបករណ៍ដើម។ វាជាចំណុចបញ្ចប់ខាងក្នុងរបស់កម្មវិធី MiniMax Code មិនមែនជា API សាធារណៈដែលមានឯកសារបញ្ជាក់ទេ៖ វាអាចផ្លាស់ប្តូរដោយគ្មានការជូនដំណឹង ហើយសំណើនឹងបរាជ័យដោយ 502 ដែលបញ្ជាក់ឈ្មោះមធ្យោបាយដឹកជញ្ជូន។ | | `MINIMAX_CODE_GATEWAY_TIMEOUT_MS` | `60000` | `open-sse/executors/minimax-code.ts` | រយៈពេលអតិបរមា (ms) នៃការព្យាយាមមួយទៅ gateway ដែលគ្រប់គ្រង។ ការហៅទាំងមូល (ការព្យាយាម ការពន្យារពេល និងការព្យាយាមម្តងទៀត) ចំណាយពេលប្រហែលពីរនាទី ដូច្នេះ gateway ដែលមិនអាចចូលប្រើបាន មិនអាចកាន់កាប់រន្ធម៉ូដែលបានយូរទេ។ | | `MINIMAX_CODE_GATEWAY_RETRIES` | `1` | `open-sse/executors/minimaxCodeGateway.ts` | ចំនួនដងព្យាយាមម្តងទៀតសម្រាប់ការហៅ gateway ដែលគ្រប់គ្រង ហើយបរាជ័យដោយកំហុសបណ្តោះអាសន្ន (429, 5xx, ការតភ្ជាប់ត្រូវបានផ្តាច់)។ | | `MINIMAX_CODE_CONTEXT_WINDOW` | `1000000` | `open-sse/executors/minimaxCodeGateway.ts` | បង្អួចបរិបទដែល gateway MiniMax ដែលគ្រប់គ្រង ត្រូវបានស្នើសុំ។ កាតាឡុកម៉ូដែលនៃផលិតផល MiniMax Code ប្រកាសថា 512000 ជាបង្អួចលំនាំដើមរបស់ MiniMax-M3 និង MiniMax-M3.1-Flash ហើយផ្តល់ 1000000 ជាជម្រើសទីពីរ។ gateway ឆ្លើយតបក្នុងបង្អួចធំជាងនេះ (សំណើដែលមាន input tokens ចំនួន 1024056 ត្រូវបានឆ្លើយតបដោយ 200 នៅថ្ងៃទី 2026-10-23)។ កំណត់តម្លៃនេះទៅជា 512000 ដើម្បីបង្រួមសំណើ — ផែនការនឹងរាប់ចំនួនតិចជាងនេះ។ តម្លៃផ្សេងទៀតទាំងអស់ត្រូវបានមិនអើពើ ដូច្នេះការវាយខុសមិនអាចស្នើសុំបង្អួចដែលម៉ូដែលមិនមានបានទេ។ | | `MINIMAX_CODE_MAX_INPUT_TOKENS` | `1000000` | `open-sse/executors/minimaxCodeGateway.ts` | កម្រិតអតិបរមា (គិតជា input tokens) នៃសំណើមួយដែលត្រូវបានផ្ញើទៅ gateway MiniMax ដែលគ្រប់គ្រង។ សំណើដែលធំជាងនេះត្រូវបានបដិសេធក្នុងមូលដ្ឋានដោយ 413 ជំនួសឱ្យការបញ្ជូនបន្ត ព្រោះការបដិសេធពី gateway នឹងធ្វើឱ្យម៉ូដែលមិនអាចប្រើជាជម្រើសបម្រុងបាន។ លំនាំដើមគឺបង្អួចបរិបទរបស់ gateway (1000000)។ តម្លៃនេះអាចបន្ថយកម្រិតនោះបាន ប៉ុន្តែមិនអាចបង្កើនឱ្យលើសបង្អួចបានទេ។ | | `MINIMAX_CODE_MAX_TOKENS` | `8192` | `open-sse/executors/minimaxCodeGateway.ts` | ចំនួន tokens អតិបរមាដែល gateway ដែលគ្រប់គ្រង អាចឆ្លើយតបមកវិញបាន។ | | `MINIMAX_CODE_AUTH_FILE` | `~/.minimax/auth/prod//mcode-public/auth.json` | `open-sse/executors/minimaxCodeGateway.ts` | ផ្លូវទៅកាន់ទម្រង់ការផ្ទៀងផ្ទាត់ MiniMax Code ដែលផ្ទុក access token និង refresh token។ | | `MINIMAX_CODE_PROFILE_DIR` | `~/.minimax` | `open-sse/executors/minimaxCodeGateway.ts` | ថតរបស់ទម្រង់ MiniMax Code ដែលផ្ទុកទម្រង់ការផ្ទៀងផ្ទាត់។ | | `MINIMAX_CODE_AUTH_RECORD` | _(newest generation)_ | `open-sse/executors/minimaxCodeGateway.ts` | កំណត់ត្រារបស់ទម្រង់ដែលត្រូវប្រើ នៅពេលវាផ្ទុកគណនីជាច្រើន។ តម្លៃទទេនឹងជ្រើសរើសជំនាន់ថ្មីបំផុត ដែលជាជំនាន់ដែល CLI ខ្លួនវាធ្វើ refresh។ | | `MINIMAX_CODE_REGION` | `en` | `open-sse/executors/minimaxCodeGateway.ts` | តំបន់របស់គណនី MiniMax។ វាកំណត់ endpoint របស់គណនីដែលធ្វើ refresh token និងថតទម្រង់ដែល credential ត្រូវបានអានពីទីនោះ។ | | `HERMES_HOME` | `~/.hermes` | `src/lib/cli-helper/config-generator/hermesHome.ts` | ថត home របស់ Hermes Agent ដែល OmniRoute អាន/សរសេរការកំណត់រចនាសម្ព័ន្ធ Hermes CLI។ ត្រូវគ្នានឹង env var ដែលកម្មវិធីដំឡើង Hermes PowerShell កំណត់នៅលើ Windows (`%LOCALAPPDATA%\hermes`)។ | | `WHYCODES_HOME` | `~/.whycodes` | `src/lib/cli-helper/config-generator/whycodesHome.ts` | root របស់ instance WhyCodes ដែល OmniRoute អាន/សរសេរ `config.toml`។ ជា env var ដូចគ្នាដែល WhyCodes អាន; លំនាំដើមគឺ `~/.whycodes` (`%USERPROFILE%\.whycodes` នៅលើ Windows)។ | ### ការធ្វើសមកាលកម្មស្វ័យប្រវត្តិរបស់ CLI Profile ទង់មុខងារទាំងនេះជាជម្រើសបើកប្រើ ហើយលំនាំដើមគឺបិទ។ វាក៏អាចបិទ/បើក ពីផ្ទាំងគ្រប់គ្រង CLI Code បានផងដែរ។ | Variable | Default | Source File | Description | | ------------------------------------- | ------- | ------------------------------------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `OMNIROUTE_AUTO_SYNC_CODEX_PROFILES` | `false` | `src/shared/constants/featureFlagDefinitions.ts` | បន្ទាប់ពីធ្វើសមកាលកម្មម៉ូដែលរបស់ provider រួច នឹងសរសេរឡើងវិញដោយស្វ័យប្រវត្តិនូវឯកសារទម្រង់ `~/.codex/*.config.toml` ពីកាតាឡុកបន្តផ្ទាល់។ តម្រូវឱ្យមាន `CLI_ALLOW_CONFIG_WRITES`; មិនដែលផ្លាស់ប្តូរការកំណត់ Codex សកម្ម/លំនាំដើម, auth, ការកំណត់ Codex-lb ឬជម្រើស provider ឡើយ។ | | `OMNIROUTE_AUTO_SYNC_CLAUDE_PROFILES` | `false` | `src/shared/constants/featureFlagDefinitions.ts` | បន្ទាប់ពីធ្វើសមកាលកម្មម៉ូដែលរបស់ provider រួច នឹងសរសេរឡើងវិញដោយស្វ័យប្រវត្តិនូវឯកសារទម្រង់ Claude Code `~/.claude/profiles//settings.json` ពីកាតាឡុកបន្តផ្ទាល់។ តម្រូវឱ្យមាន `CLI_ALLOW_CONFIG_WRITES`; មិនដែលផ្លាស់ប្តូរការកំណត់ Claude សកម្ម/លំនាំដើម, auth ឬជម្រើស provider ឡើយ។ | ### ឧទាហរណ៍ Docker ```bash # ភ្ជាប់ binaries ពីម៉ាស៊ីន 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` មានប្រសិទ្ធភាពតែនៅពេលផ្លូវនោះត្រូវបាន bind-mount ពី host ជាក់ស្តែងប៉ុណ្ណោះ — ភ្ជាប់វាជាមួយ mounts ដូចជា `~/.codex:/host-home/.codex:rw` (មើល profile `host` នៅក្នុង `docker-compose.yml`)។ ផ្លូវដែលមិនស្ថិតនៅខាងក្នុង home របស់អ្នកប្រើ container ហើយក៏មិនមែនជា bind mount ត្រូវបានមិនអើពើ ព្រោះការសរសេរទៅទីនោះ នឹងបាត់បង់នៅពេលបង្កើត container ឡើងវិញ។ Image ដំណើរការជា `USER node` ដូច្នេះ `/root` ដែលមិនបាន mount គឺ **មិនមែនជា** override ត្រឹមត្រូវទេ។ | Variable | Default | Source File | Description | | ---------------------------------------- | -------- | ----------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `OMNIROUTE_CONTAINER` | _(auto)_ | `src/shared/utils/containerEnv.ts` | បង្ខំឱ្យការរកឃើញ container បើក (`1`/`true`) ឬបិទ (`0`/`false`)។ ត្រូវការតែនៅលើ runtime ដែលការរកឃើញស្វ័យប្រវត្តិមិនអាចរកឃើញបានប៉ុណ្ណោះ។ | | `OMNIROUTE_ALLOW_CONTAINER_CONFIG_WRITE` | `false` | `src/shared/services/cliRuntime.ts` | អនុញ្ញាតឱ្យការសរសេរការកំណត់រចនាសម្ព័ន្ធរបស់ឧបករណ៍ CLI ចូលទៅក្នុងផ្លូវ container ដែលមិនបាន mount ទោះយ៉ាងណាក៏ដោយ។ សមមូល CLI គឺ `--allow-container-write`។ | | `DOCKER_UPDATE_TRIGGER_FILE` | unset | `src/lib/system/autoUpdate.ts` | សម្រាប់ Docker image ប៉ុណ្ណោះ៖ ផ្ទាំងគ្រប់គ្រង **ធ្វើបច្ចុប្បន្នភាពឥឡូវនេះ** នឹងសរសេរសំណើ JSON ទៅកាន់ឯកសារនេះ (ត្រូវតែនៅខាងក្នុង `DATA_DIR`) ដើម្បីឱ្យ watcher នៅផ្នែក host ទាញយក និងបង្កើត container ឡើងវិញ។ សូមមើល [មគ្គុទ្ទេសក៍ Docker](../guides/DOCKER_GUIDE.md#dashboard-updates-in-docker)។ | ### ឧបករណ៍ជំនួយរបស់ CLI Binary (`omniroute`) អថេរទាំងនេះកែសម្រួលឥរិយាបថរបស់ CLI binary `omniroute` ផ្ទាល់ (មិនមែន ការរកឃើញ sidecar ខាងលើទេ)។ | អថេរ | លំនាំដើម | ឯកសារប្រភព | ការពិពណ៌នា | | ------------------------------------- | --------------------------------- | --------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `OMNIROUTE_LANG` | _(system)_ | `bin/cli/i18n.mjs` | បង្ខំភាសាលទ្ធផលរបស់ CLI។ Locale តាម BCP-47 (ឧ. `en`, `pt-BR`)។ បដិសេធអថេរបរិស្ថាន locale របស់ប្រព័ន្ធ (LC_ALL, LC_MESSAGES)។ | | `OMNIROUTE_SHOW_LOG` | _(unset)_ | `bin/cli/runtime/processSupervisor.mjs` | កំណត់ជា `1` ដើម្បីបញ្ជូន stdout/stderr របស់ server ទៅកាន់ terminal ក្នុងរបៀបគ្រប់គ្រង។ ស្មើនឹង flag `--log` លើ `omniroute serve`។ | | `OMNIROUTE_CLI_TOKEN` | _(unset)_ | `bin/cli/api.mjs` | ថូខឹនផ្ទៀងផ្ទាត់ម៉ាស៊ីនដែលបានបញ្ចូលជា header `x-omniroute-cli-token`។ បង្កើតដោយស្វ័យប្រវត្តិក្នុង task 8.12។ | | `GEMINI_CLI_HOME` | _(unset)_ | `bin/cli/commands/setup-gemini.mjs` | Root home របស់ Gemini ដែលរក្សាទុកជាប់លាប់; ការដំណើរការមួយដងប្រើ home បណ្តោះអាសន្នដែលបំបែកដោយឡែក។ | | `OMNIROUTE_CHILD_SIGNAL_TIMEOUT_MS` | `5000` | `bin/cli/commands/run.mjs` | រយៈពេលអនុគ្រោះជាមីលីវិនាទី មុនពេលបញ្ចប់ CLI child ដែលបានទទួល signal ដោយបង្ខំ។ | | `OMNIROUTE_CLI_SKIP_DEFAULT_DATA_ENV` | _(unset)_ | `bin/omniroute.mjs` | កំណត់ជា 1 ជាមួយ DATA_DIR ដែលបានបញ្ជាក់យ៉ាងច្បាស់ ដើម្បីរំលងឯកសារបរិស្ថានថតទិន្នន័យលំនាំដើមរបស់អ្នកប្រើ។ | | `OMNIROUTE_SYNC_TOKEN` | _(unset)_ | `bin/cli/commands/sync.mjs` | ថូខឹនសមកាលកម្មសម្រាប់ `omniroute sync bundle` (`GET /api/sync/bundle` ទទួលយកតែថូខឹនសមកាលកម្មប៉ុណ្ណោះ មិនមែន API key ទេ)។ ស្មើនឹង `--token`។ | | `OMNIROUTE_HTTP_TIMEOUT_MS` | `30000` | `bin/cli/api.mjs` | អស់ពេល HTTP ក្នុងមួយការព្យាយាម (ms) សម្រាប់សំណើ CLI → server។ | | `OMNIROUTE_READY_TIMEOUT_MS` | `60000` | `bin/cli/utils/pid.mjs` | រយៈពេលអតិបរមា (ms) ដែល CLI រង់ចាំ endpoint សុខភាពរបស់ server មុនពេលបោះពុម្ពការព្រមានអំពីការអស់ពេល។ មានប្រយោជន៍សម្រាប់ការចាប់ផ្តើមត្រជាក់ដែលយឺត (ឧ. Windows)។ អាចកំណត់តាម `--ready-timeout` បានផងដែរ។ | | `OMNIROUTE_VERBOSE` | `0` | `bin/cli/api.mjs` | កំណត់ជា `1` ដើម្បីបោះពុម្ពព័ត៌មានវិនិច្ឆ័យអំពីការព្យាយាមឡើងវិញ/ការពន្យារពេលទៅ stderr អំឡុងពេលពាក្យបញ្ជា CLI។ | | `OMNIROUTE_PLUGIN_PATH` | _(unset)_ | `bin/cli/plugins.mjs` | ថតផ្ទាល់ខ្លួនសម្រាប់ស្វែងរក plugin របស់ CLI (កញ្ចប់ `omniroute-cmd-*`)។ នៅពេលមិនបានកំណត់ វាលំនាំដើមជា `~/.omniroute/plugins/`។ សម្រាប់ CLI ប៉ុណ្ណោះ — វាមិនដែលទៅដល់ plugin scanner ខាង server ទេ ដែលត្រូវបានចង្អុលបង្ហាញដោយ `OMNIROUTE_PLUGINS_DIR` (ផ្នែក 2)។ | | `OMNIROUTE_NO_UPDATE_NOTIFIER` | _(unset)_ | `bin/omniroute.mjs` | ទប់ស្កាត់ការត្រួតពិនិត្យបច្ចុប្បន្នភាព នៅពេលកំណត់ជាតម្លៃមិនទទេណាមួយ៖ ការជូនដំណឹងរបស់ CLI នៅពេលដំណើរការចប់ និងបដា “មានបច្ចុប្បន្នភាព” របស់ dashboard (`GET /api/system/version` បន្ទាប់មករំលងការស្វែងរក npm, GitHub និងព័ត៌មាន)។ ការជូនដំណឹងរបស់ CLI ក៏នៅតែបិទក្នុង CI, របៀបស្ងាត់ និងលទ្ធផលមិនមែនជាអត្ថបទផងដែរ។ | | `OMNIROUTE_DOCTOR_LIVENESS_URL` | _(បានមកពី)_ | `bin/cli/commands/doctor.mjs` | URL សម្រាប់ពិនិត្យភាពរស់រវើកដែលត្រូវបានពិនិត្យដោយ `omniroute doctor`។ ជម្រើស `livenessUrl` ដែលកំណត់តាមកម្មវិធីមានអាទិភាព; បើមិនដូច្នោះទេ តម្លៃនេះត្រូវបានប្រើតាមតួអក្សរដើម។ ប្រសិនបើមិនបានកំណត់ CLI នឹងកំណត់ endpoint `/api/health/degradation` របស់ផ្ទាំងគ្រប់គ្រងមូលដ្ឋានដោយស្វ័យប្រវត្តិ។ | | `OMNIROUTE_PROVIDER_CATALOG_PATH` | `src/shared/constants/providers/` | `bin/cli/provider-catalog.mjs` | ផ្លូវកាតាឡុកអ្នកផ្តល់សេវា ដែលប្រើដោយពាក្យបញ្ជាអ្នកផ្តល់សេវារបស់ CLI។ ជម្រើស `catalogPath` ដែលកំណត់តាមកម្មវិធីមានអាទិភាព។ ផ្លូវដាច់ខាតត្រូវបានប្រើតាមដែលមាន; ផ្លូវទាក់ទងត្រូវបានដោះស្រាយចាប់ពីឫសគម្រោង។ ប្រសិនបើមិនបានកំណត់ CLI នឹងប្រើថតថេររបស់អ្នកផ្តល់សេវា ដោយប្រើឯកសារ `providers.ts` ចាស់ជាជម្រើសបម្រុង។ | | `OMNIROUTE_PROVIDER_TEST_MODEL` | _(លំនាំដើមរបស់អ្នកផ្តល់សេវា)_ | `bin/cli/provider-test.mjs` | ម៉ូដែលបម្រុងសកលសម្រាប់ការធ្វើតេស្តការតភ្ជាប់អ្នកផ្តល់សេវារបស់ CLI។ អាទិភាពគឺម៉ូដែលនៃការតភ្ជាប់ដែលបានកំណត់, ការបដិសេធម៉ូដែលជាក់លាក់របស់អ្នកផ្តល់សេវា, តម្លៃនេះ, បន្ទាប់មកម៉ូដែលសម្រាប់ធ្វើតេស្តដែលមានស្រាប់របស់អ្នកផ្តល់សេវា។ | --- ## 10. ការរួមបញ្ចូល Agent ខាងក្នុង និង MCP | អថេរ | លំនាំដើម | ឯកសារប្រភព | សេចក្ដីពិពណ៌នា | | ----------------------------------------------- | --------------------------------------------------- | ----------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `OMNIROUTE_BASE_URL` | auto-detect | `open-sse/mcp-server/server.ts` | URL ជាក់លាក់សម្រាប់ឧបករណ៍ MCP/A2A ដើម្បីចូលទៅកាន់ OmniRoute។ វានឹងជំនួសការរកឃើញ localhost ដោយស្វ័យប្រវត្តិ។ ជំនាញ A2A នឹងបរាជ័យ ជំនួសឱ្យការផ្ញើ API key ទៅកាន់ URL នេះ (ឬ `BASE_URL` ដែលវាត្រឡប់ទៅប្រើ) នៅពេលវាជា http ធម្មតាទៅកាន់អាសយដ្ឋានសាធារណៈ ឈ្មោះម៉ាស៊ីនសាធារណៈដែលមានចំណុច ឬម៉ាស៊ីនទិន្នន័យមេឃ ឬនៅពេលវាមានព័ត៌មានសម្ងាត់៖ ប្រើ https ឬ http ទៅកាន់ loopback ឈ្មោះ container ឬ service ឬអាសយដ្ឋានឯកជន។ | | `OMNIROUTE_API_KEY` | _(unset)_ | ម៉ូឌុល MCP/A2A | API key សម្រាប់ការហៅឧបករណ៍ MCP ខាងក្នុង។ ជំនាញ A2A នឹងផ្ញើវាតែក្នុងករណីអ្នកហៅមិនមាន API key (សម័យ dashboard) ប៉ុណ្ណោះ។ អ្នកហៅដែលមាន key នឹងប្រើសិទ្ធិរបស់ខ្លួន។ | | `OMNIROUTE_API_KEY_ID` | _(unset)_ | `open-sse/mcp-server/audit.ts` | លេខសម្គាល់ key សម្រាប់កំណត់ប្រភពក្នុងកំណត់ហេតុសវនកម្ម MCP។ | | `ROUTER_API_KEY` | _(unset)_ | ចាស់ | ឈ្មោះកាត់សម័យសម្រាប់ `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` ដើម្បីរំលងការស្វែងរក memory recall សម្រាប់កិច្ចការមួយទាំងស្រុង។ តម្លៃផ្សេងទៀត (រួមទាំងមិនបានកំណត់) នឹងរក្សាមុខងារនេះឱ្យបើកដំណើរការ។ | | `OMNIROUTE_ISSUE_AGENT_ENABLED` | `false` | `src/app/api/issue-agent/runs/route.ts` | បើកដំណើរការ endpoint សម្រាប់ការតម្រៀបបញ្ហាដែលបានកត់ត្រាទុករបស់ Issue Agent ដោយគ្មានអ៊ីនធឺណិត/ក្នុងមូលដ្ឋាន។ ទុកឱ្យបិទ លុះត្រាតែដំណើរការលំហូរការងារតម្រៀបបញ្ហាដែលបានកត់ត្រាទុកក្នុងមូលដ្ឋានដោយចេតនា។ | | `OMNIROUTE_ISSUE_AGENT_TIMEOUT_MS` | _(unset)_ | `src/lib/issueAgent/execution.ts` | រយៈពេលអស់កំណត់ (ms) សម្រាប់ការដំណើរការតម្រៀបបញ្ហាដែលបានកត់ត្រាទុកមួយលើករបស់ Issue Agent។ តម្លៃត្រូវបានកំណត់មិនឱ្យលើសអតិបរមាផ្ទៃក្នុង ហើយប្រើតម្លៃលំនាំដើមដែលមានស្រាប់វិញ នៅពេលមិនបានកំណត់ ឬមិនត្រឹមត្រូវ។ | | `OMNIROUTE_CONTEXT` | _(បរិបទសកម្ម)_ | `bin/cli/program.mjs`, `bin/cli/api.mjs` | បរិបទ/ប្រវត្តិរូបរបៀប remote របស់ CLI សម្រាប់ពាក្យបញ្ជា `omniroute`។ វានឹងជំនួសបរិបទសកម្មនៅក្នុងឃ្លាំងបរិបទមូលដ្ឋាន។ ស្មើនឹង `--context `។ | | `OMNIROUTE_CONTEXT_KEYCHAIN_DISABLED` | `0` | `bin/cli/contexts.mjs` | បិទ backend keychain របស់ប្រព័ន្ធប្រតិបត្តិការ `keytar` ដែលជាជម្រើសសម្រាប់ព័ត៌មានសម្ងាត់បរិបទរបស់ CLI។ នៅពេលបើកដំណើរការ ព័ត៌មានសម្ងាត់នឹងនៅសល់ក្នុងរបៀប `0600` របស់ `config.json` ហើយ CLI នឹងបង្ហាញការព្រមានអំពីការប្រើជម្រើសបម្រុងតែម្តង។ មានបំណងសម្រាប់ប្រតិបត្តិការបែប headless/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_PPLX_RESEARCH_ENABLED` | `0` | `open-sse/mcp-server/tools/perplexityResearch.ts` | ចុះបញ្ជីឧបករណ៍ MCP សម្រាប់ Perplexity Deep Research។ មានតែ `1` ប៉ុណ្ណោះដែលចុះបញ្ជីវា; តម្លៃផ្សេងទៀតទាំងអស់នឹងទុកឱ្យវាបិទ។ | | `OMNIROUTE_MCP_COMPRESS_DESCRIPTIONS` | `false` | `open-sse/mcp-server/descriptionCompressor.ts` | បង្រួមការពិពណ៌នាឧបករណ៍ MCP មុនពេល serialize 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` | ថវិកាពេលវេលាមុនបោះបង់ (មិល្លីវិនាទី) សម្រាប់ការអានគ្រប់គ្រងខាងក្នុងរបស់ MCP server (សុខភាព ភាពធន់ ការបញ្ចូលគ្នា កូតា ការប្រើប្រាស់)។ | | `OMNIROUTE_MCP_UPSTREAM_TIMEOUT_MS` | `60000` | `open-sse/mcp-server/fetchTimeout.ts` | ថវិកាពេលវេលាមុនបោះបង់ (មិល្លីវិនាទី) សម្រាប់ដំណើរ MCP ដែលរង់ចាំអ្នកផ្តល់សេវា (`route_request`, `web_search`, `web_fetch`)។ | | `OMNIROUTE_MCP_SESSION_IDLE_MS` | `300000` | `open-sse/mcp-server/httpTransport.ts` | TTL ពេលទំនេរ (មិល្លីវិនាទី) មុនពេលការស្កេនសម្អាតសម័យ MCP ដែលអាចបញ្ជូនបាន និងទំនេរ។ សម័យដែលមានស្ទ្រីមកំពុងបើក ឬសំណើកំពុងដំណើរការ នឹងមិនត្រូវបានសម្អាតឡើយ។ តម្លៃដែលមិនបានកំណត់ មិនមែនជាចំនួនគត់ ឬមិនវិជ្ជមាន នឹងប្រើតម្លៃលំនាំដើមជំនួស។ | | `OMNIROUTE_CORPUS_CACHE_SIZE` | `5` | `src/lib/localCorpus/configured.ts` | ចំនួនអតិបរមានៃធាតុលិបិក្រម local-corpus ដែលរក្សាទុកក្នុងអង្គចងចាំ (LRU មួយសម្រាប់ថត root ដែលបានធ្វើលិបិក្រមនីមួយៗ)។ តម្លៃត្រូវបានកំណត់មិនឱ្យទាបជាង `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` | ចន្លោះពេល (មិល្លីវិនាទី) រវាងការទាញយកកូតា OAuth ជាប់គ្នា ក្នុងការធ្វើសមកាលកម្មជាក្រុម។ ការតភ្ជាប់ OAuth ត្រូវបានទាញយកម្តងមួយ ដើម្បីជៀសវាងការផ្ញើសំណើផ្ទុះទៅកាន់ upstream។ `0` ជ្រើសរើសមិនចូលរួម (ដំណើរការដំណាលគ្នា)។ | | `OMNIROUTE_QUOTA_FETCH_MIN_INTERVAL_MS` | `250` | `open-sse/services/quotaFetchThrottle.ts` | ចន្លោះពេលអប្បបរមា (មិល្លីវិនាទី) រវាងការទាញយកកូតាពី upstream ជាប់ៗគ្នា នៅលើផ្លូវ preflight/monitor ក្នុងមួយសំណើ; បែងចែកការហៅបណ្តាញស្របគ្នា ដើម្បីកុំឱ្យគណនីជាច្រើននៅលើ IP តែមួយ បង្កើតការផ្ទុះសំណើទៅ upstream។ បានភ្ជាប់ជាមួយកម្មវិធីទាញយកកូតារបស់ Codex (`/wham/usage`), DeepSeek, Bailian (ទីតាំងទាញយកទាំងពីរ), OpenCode និង Crof (#6009, #6911)។ ផ្លូវបញ្ជូនទូទៅ `usage.ts::getUsageForProvider` (github/glm/minimax/nanogpt/xai/ល.) មិនទាន់ត្រូវបានគ្របដណ្តប់ទេ — កំពុងតាមដានដោយឡែក។ ការទទួលបានពីឃ្លាំងសម្ងាត់មិនរងផលប៉ះពាល់ទេ។ `0` បិទមុខងារ; កំណត់ក្នុងចន្លោះ `0..60000`។ | | `OMNIROUTE_QUOTA_FETCH_JITTER_MS` | `120` | `open-sse/services/quotaFetchThrottle.ts` | ចន្លោះពេលចៃដន្យបន្ថែមក្នុងមួយសំណើ (មិល្លីវិនាទី) ដែលត្រូវបានកំណត់នៅពេលកក់ការទាញយកកូតាពី upstream នីមួយៗ។ លំនាំដើមគឺ 120; កំណត់ក្នុងចន្លោះ `0..60000`; `0` លុបតែភាពប្រែប្រួលចៃដន្យប៉ុណ្ណោះ។ កំណត់ `OMNIROUTE_QUOTA_FETCH_MIN_INTERVAL_MS=0` ដើម្បីបិទការគ្រប់គ្រងចន្លោះពេលទាំងមូល។ ភាពប្រែប្រួលចៃដន្យមិនធានាការការពារពីការហាមឃាត់របស់ upstream ទេ។ | | `CODEX_QUOTA_FETCH_TIMEOUT_MS` | `8000` | `open-sse/services/codexQuotaFetcher.ts` | អស់ពេល (មិល្លីវិនាទី) សម្រាប់ការទាញយកកូតា Codex មួយលើក (`chatgpt.com/backend-api/wham/usage`)។ preflight រង់ចាំការទាញយកនេះ មុនពេលផ្ញើសំណើ។ បន្ទាប់ពីអស់ពេល ឬមានកំហុសផ្នែកដឹកជញ្ជូន ប្រព័ន្ធប្រើ snapshot ចុងក្រោយពីក្នុងរយៈពេល 15 នាទីឡើងវិញ លុះត្រាតែ window របស់វាត្រូវបានប្រើអស់ ឬបានកំណត់ឡើងវិញ; ប្រសិនបើគ្មានទេ កូតាមិនត្រូវបានដឹង ដូច្នេះគណនីដែលមានឥណទានបង់ប្រាក់ត្រូវបានរំលងសម្រាប់សំណើនោះ ហើយមិនរក្សាទុក cooldown ទេ។ ទទួលយកចំនួនគត់វិជ្ជមានរហូតដល់ `2147483647`; តម្លៃផ្សេងទៀតទាំងអស់នឹងត្រឡប់ទៅលំនាំដើមវិញ។ | | `PROVIDER_LIMITS_POST_USAGE_REFRESH_DELAY_MS` | `5000` | `src/lib/usage/providerLimits.ts` | ពន្យារពេល (មិល្លីវិនាទី) មុនពេលធ្វើឱ្យដែនកំណត់របស់ provider ស្រស់ឡើងវិញ បន្ទាប់ពីមានព្រឹត្តិការណ៍ប្រើប្រាស់ពិតប្រាកដ ដើម្បីផ្តល់ពេលឱ្យ API កូតារបស់ upstream កត់ត្រាការប្រើប្រាស់។ | | `OMNIROUTE_LOGIN_BROWSER_PATH` | auto-detect | `open-sse/services/adobeFireflyBrowserLogin.ts` | ផ្លូវ absolute ទៅកាន់ executable របស់ Chrome ឬ Edge នៅលើប្រព័ន្ធ ដែលប្រើសម្រាប់ការចូល Adobe Firefly អន្តរកម្ម និងការបន្តសុពលភាពនៅផ្ទៃខាងក្រោយ។ | | `ADOBE_FIREFLY_BROWSER_REFRESH` | enabled | `open-sse/services/adobeFireflySession.ts` | រក្សាស្ថានភាព IMS និងហានិភ័យកម្មវិធីរុករកឱ្យស្រស់ ដោយប្រើសម័យ Chrome CDP ដែលកំណត់តាមគណនី។ កំណត់ជា `0` ដើម្បីបិទការបន្តសុពលភាពតាមកម្មវិធីរុករក។ | | `ADOBE_FIREFLY_SESSION_DISK` | enabled | `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` | ការពន្យារពេល backoff មូលដ្ឋានជាមិលីវិនាទី បន្ទាប់ពីការឆ្លើយតប Adobe 408 បណ្តោះអាសន្ន; រួមបញ្ចូលជាមួយចន្លោះពេលបញ្ជូន ក្នុងចំណោមការព្យាយាមយ៉ាងច្រើនប្រាំដង។ | | `OMNIROUTE_DISABLE_BACKGROUND_SERVICES` | `false` | `src/instrumentation-node.ts` | បិទសេវាផ្ទៃខាងក្រោយទាំងអស់៖ ការធ្វើឱ្យកូតាថ្មី, ការធ្វើសមកាលកម្ម provider-limits, ការស្តារការតភ្ជាប់, សុខភាពព័ត៌មានសម្គាល់, ការធ្វើសមកាលកម្ម cloud/model/free-proxy/proxy-health, ការសម្អាតទិន្នន័យរក្សាទុក, VACUUM តាមកាលវិភាគ និងការស្ទង់មតិផ្ទុកការកំណត់ឡើងវិញដោយស្វ័យប្រវត្តិ។ មានប្រយោជន៍សម្រាប់ CI/test; នៅលើការដំឡើងដែលដំណើរការរយៈពេលយូរ ការតភ្ជាប់នឹងមិនស្តារឡើងវិញដោយស្វ័យប្រវត្តិទេ ហើយមូលដ្ឋានទិន្នន័យនឹងបន្តកើនឡើង។ | | `OMNIROUTE_HEADLESS` | _(unset)_ | `src/lib/system/headless.ts` | ការចាប់ផ្ដើមសម្រាប់តែម៉ាស៊ីនប្រូកស៊ី៖ រំលងប្រព័ន្ធរងជាជម្រើស, `/dashboard` → 404។ ដូចគ្នានឹង `omniroute serve --headless`។ សូមមើល [HEADLESS.md](../guides/HEADLESS.md)។ | | `OMNIROUTE_ENABLE_RUNTIME_BACKGROUND_TASKS` | _(unset)_ | `src/lib/config/runtimeSettings.ts` | បង្ខំឱ្យបើកកិច្ចការផ្ទៃខាងក្រោយ នៅពេលរកឃើញថាកំពុងធ្វើតេស្តស្វ័យប្រវត្តិ។ កំណត់ជា `1` ដើម្បីបដិសេធ heuristic សម្រាប់ការធ្វើតេស្ត។ | | `OMNIROUTE_BUDGET_RESET_JOB_INTERVAL_MS` | `600000` | `src/lib/jobs/budgetResetJob.ts` | ចន្លោះពេលពិនិត្យការកំណត់ថវិកាឡើងវិញ (មិលីវិនាទី)។ អប្បបរមា `10000`។ | | `OMNIROUTE_CONNECTION_RECOVERY_INTERVAL_MS` | `60000` | `src/lib/quota/connectionRecovery.ts` | ចន្លោះពេលស្តារការតភ្ជាប់-រយៈពេលរង់ចាំជាមុន (មិលីវិនាទី)៖ ផ្ទៀងផ្ទាត់ការតភ្ជាប់ឡើងវិញ ដែល `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` | ចន្លោះពេលសម្អាតឃ្លាំងសម្ងាត់ការវិភាគហេតុផល (មិល្លីវិនាទី)។ តម្លៃអប្បបរមា `60000`។ | | `OMNIROUTE_REASONING_MIN_BUDGET` | _unset_ (disabled) | `open-sse/services/reasoningTokenBuffer.ts` | តម្លៃអប្បបរមាសម្រាប់ថវិកាលទ្ធផលរបស់ម៉ូដែលគិតដែលត្រូវជ្រើសរើសប្រើ៖ `max_tokens` របស់អ្នកហៅក្នុងចន្លោះ `[256, floor)` ត្រូវបានបង្កើនទៅតម្លៃអប្បបរមា (ដោយកំណត់មិនឱ្យលើសកម្រិតលទ្ធផលរបស់ម៉ូដែល)។ ប្រសិនបើមិនបានកំណត់ = ថវិការបស់ម៉ាស៊ីនភ្ញៀវមិនត្រូវបានបង្កើនឡើយ (#9507)។ | | `OMNIROUTE_REASONING_EFFORT_PROBE_PROVIDERS` | _unset_ (disabled) | `open-sse/services/learnedReasoningEffortCaps.ts` | លេខសម្គាល់អ្នកផ្តល់សេវាដែលបំបែកដោយសញ្ញាក្បៀស (ឬ `*`) ដែលត្រូវជ្រើសរើសប្រើ៖ នៅពេលកំហុស 400/422 របស់ `reasoning_effort` មិនបញ្ជាក់សំណុំតម្លៃដែលបានទទួលយកទេ សាកល្បងម្តងទៀតនៅកម្រិតទាបជាងមួយ (មិនដែលទាបជាង `low`) ហើយរៀនកម្រិតនោះតែប្រសិនបើការសាកល្បងត្រូវបានឆ្លើយតប (#14895)។ | | `OMNIROUTE_LOG_EXPORT_CRON` | `0 * * * *` | `src/lib/jobs/logExportJob.ts` | កន្សោម Cron (UTC) សម្រាប់ការងារនាំចេញកំណត់ហេតុការហៅ ដែលបញ្ចេញទិន្នន័យពីគោលដៅនាំចេញកំណត់ហេតុដែលបានបើកទាំងអស់។ គួរប្រើ `*/5 * * * *` នៅពេលនាំចេញតួទិន្នន័យ។ | | `OMNIROUTE_LOG_EXPORT_RUN_TIMEOUT_MS` | `900000` | `src/lib/logExport/childRunner.ts` | អស់ពេលតាមនាឡិកាពិតរបស់ដំណើរការកូន ក្នុងមួយគោលដៅ គិតជាមិល្លីវិនាទី។ ការអស់ពេលកត់ត្រាការបរាជ័យ និងបញ្ឈប់ដំណើរការ ដោយមិនបន្តបាច់ដែលមិនទាន់ទទួលស្គាល់។ តម្លៃមិនត្រឹមត្រូវ/មិនវិជ្ជមាន/មិនមែនជាចំនួនគត់ នឹងប្រើតម្លៃលំនាំដើម។ | | `OMNIROUTE_LOG_EXPORT_CHILD_MAX_OLD_SPACE_MB` | `1024` | `src/lib/logExport/childRunner.ts` | ដែន old-space របស់ V8 ក្នុង Node សម្រាប់ដំណើរការកូននាំចេញ គិតជាមេកាបៃ (មិនមែន RSS សរុបទេ)។ តម្លៃលំនាំដើមទុកចន្លោះទំនេរសម្រាប់អត្ថបទបុរាណដែលមានដែនកំណត់ចំនួន 500 ជួរ ជាមួយតួទិន្នន័យ។ បាច់ដែលមានទំហំធំជាងនេះនៅតែអាចធ្វើឱ្យ heap របស់ដំណើរការកូនអស់បាន។ ការបរាជ័យនឹងណែនាំឱ្យបន្ថយទំហំបាច់ ឬបង្កើនកម្រិតនេះ។ តម្លៃមិនត្រឹមត្រូវ/មិនវិជ្ជមាន/មិនមែនជាចំនួនគត់ នឹងប្រើតម្លៃលំនាំដើម។ ការនាំចេញដោយ Bun នឹងត្រឡប់ទៅដំណើរការក្នុងដំណើរការដើមវិញ ដោយមិនប្រើកម្រិតនេះ។ | | `OMNIROUTE_CONFIG_HOT_RELOAD_MS` | `5000` | `src/lib/config/hotReload.ts` | ចន្លោះពេលស្ទង់មើល (មិល្លីវិនាទី) សម្រាប់ការផ្ទុកកំណត់រចនាសម្ព័ន្ធឡើងវិញភ្លាមៗ។ តម្លៃទាបជាង `1000` នឹងត្រូវបានបដិសេធ។ | | `OMNIROUTE_DISABLE_REDIS_AUTH_CACHE` | _(enabled)_ | `src/lib/db/apiKeys.ts` | កំណត់តម្លៃ `1` ដើម្បីរំលងឃ្លាំងសម្ងាត់ការផ្ទៀងផ្ទាត់ API key ដែលគាំទ្រដោយ Redis (បង្ខំឱ្យអានពីមូលដ្ឋានទិន្នន័យ)។ | | `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 សម្រាប់ pipeline ដែលជង់គ្នា T02។ **ត្រូវជ្រើសរើសបើក (បិទជាលំនាំដើម)** — នៅពេលបើក engine ដែលបោះកំហុសជាបន្តបន្ទាប់ឆ្លងកាត់សំណើជាច្រើន នឹងត្រូវរំលង (បរាជ័យដោយបើកចំហ) ក្នុងអំឡុងពេល cooldown; បិទ = ឥរិយាបថចាស់ដែលមាន 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` | ចំនួនមិល្លីវិនាទីដែល engine ដែលបានបើក ត្រូវបានរំលង មុនពេលធ្វើការសាកល្បងស្ថានភាពពាក់កណ្តាលបើក។ | | `COMPRESSION_CCR_RETRIEVAL_RAMP_FACTOR` | `2` | `open-sse/services/compression/engines/ccr/index.ts` | ការបង្កើន feedback ពីការទាញយក CCR T08/H8៖ ការទាញយកមុនៗនីមួយៗនៃប្លុកដែលបានរក្សាទុក នឹងបង្កើន `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` | កុងតាក់មេនៃការបង្កក prefix ដែលសង្កេតឃើញពីការប្រើប្រាស់ T08/H5។ **ត្រូវជ្រើសរើសបើក (បិទតាមលំនាំដើម)** — នៅពេលបើក ប្រសិនបើ system prompt ត្រូវបានសង្កេតឃើញ `>=` កម្រិតកំណត់ វានឹងត្រូវបានចាត់ទុកជា prefix ថេរដែលអាចរក្សាទុកក្នុង cache បាន ហើយត្រូវបានការពារពីការបង្រួម ទោះបីជាសម្រាប់ providers ដែល static cache heuristic មិនអាចរកឃើញក៏ដោយ (ការបង្កកនេះ _ការពារតែប៉ុណ្ណោះ_ មិនដែលកែប្រែទេ)។ | | `COMPRESSION_PREFIX_FREEZE_THRESHOLD` | `3` | `open-sse/services/compression/prefixFreeze.ts` | ចំនួនដងដែលត្រូវសង្កេតឃើញ system prompt មុនពេលវាត្រូវបានចាត់ទុកជា prefix ថេរដែលបានបង្កក។ | | `OMNIROUTE_BOOTSTRAPPED` | `false` | `src/app/(dashboard)/dashboard/page.tsx` | កំណត់ជា `true` ដោយ bootstrap script បន្ទាប់ពីការរៀបចំដំបូង។ គ្រប់គ្រងភាពមើលឃើញរបស់ setup wizard។ | | `OMNIROUTE_ALLOW_BODY_PROJECT_OVERRIDE` | `0` | `open-sse/executors/antigravity.ts` | ផ្លូវជំនួសសម្រាប់ករណីពិសេស៖ អនុញ្ញាតឱ្យ request body បដិសេធតម្លៃ project របស់ Antigravity។ | | `ANTIGRAVITY_CREDITS` | `off` | `open-sse/services/antigravityCredits.ts` | គោលការណ៍ credits របស់ Google One AI៖ `off` មិនដែលបញ្ចូល credits ទេ, `retry` បញ្ចូលម្តង បន្ទាប់ពី quota 429 ដែលមានសិទ្ធិ ហើយ `always` បញ្ចូលនៅ request ដំបូង។ | | `OMNIROUTE_ANTIGRAVITY_TIMING_TELEMETRY` | `false` | `open-sse/executors/antigravity/executeAttempt.ts` | ជម្រើសចូលរួមសម្រាប់ពេលវេលាដែលបានសម្អាតតាមការផ្ញើជាក់ស្តែងនីមួយៗ៖ ភាពទំនេររបស់គណនី សំណើដែលកំពុងដំណើរការ ពេលវេលារហូតដល់ទទួល headers និងមាតិកា SSE ដំបូងដែលមានន័យ។ មិនមាន prompts, credentials ឬ URL របស់ upstream នៅក្នុង logs ទេ។ | | `ANTIGRAVITY_MAX_429_ATTEMPTS` | `2` | `open-sse/services/antigravity429Guard.ts` | ចំនួនកំហុស 429 របស់ upstream ដែលអនុញ្ញាតសម្រាប់សំណើ Antigravity (`agy`/`antigravity`) នីមួយៗនៅទូទាំង hosts ទាំងអស់ (1–12) មុនពេលបញ្ជូន 429 ត្រឡប់ទៅអ្នកហៅ។ សំណើដែលបានប្រើចំនួនកំណត់នេះ នឹងត្រូវឆ្លើយតបនៅមូលដ្ឋាននៅពេលផ្ញើឡើងវិញ (2 នាទី បង្កើនទ្វេដងរហូតដល់ 30 នាទី ឬតាមការណែនាំ retry របស់ upstream) ហើយ chat handler នឹងមិនចាប់ផ្តើមសំណើឡើងវិញបន្ទាប់ពី 429 នោះទេ។ | | `ANTIGRAVITY_ALLOW_SIGNATURE_BYPASS` | `0` | `open-sse/translator/request/openai-to-gemini.ts` | អនុញ្ញាតឱ្យ Antigravity request translator រំលងការផ្ទៀងផ្ទាត់ហត្ថលេខាសំណើ CLI ដ៏តឹងរឹងរបស់វា នៅពេល upstream បដិសេធហត្ថលេខាពិតប្រាកដ (របៀប debug/antiquated-CLI)។ តម្លៃមិនមែនសូន្យនឹងបើកការរំលងនេះ។ | | `AGY_TOKEN_FILE` | `~/.gemini/antigravity-cli/antigravity-oauth-token` | `src/app/api/providers/agy-auth/apply-local/route.ts` | ប្តូរទីតាំងឯកសារ token របស់ Antigravity CLI (agy) សម្រាប់ការនាំចូលការចូលប្រើក្នុងមូលដ្ឋានដោយស្វ័យប្រវត្តិ។ | ### ស្ពាន OAuth CLI (ផ្ទៃក្នុង) | Variable | Default | Source File | Description | | ------------------- | ----------- | ------------------------------- | --------------------------------------------------- | | `OMNIROUTE_SERVER` | auto-detect | `src/lib/oauth/config/index.ts` | URL ម៉ាស៊ីនមេសម្រាប់ស្ពានផ្ទៀងផ្ទាត់ CLI↔OmniRoute។ | | `OMNIROUTE_TOKEN` | _(unset)_ | `src/lib/oauth/config/index.ts` | token ផ្ទៀងផ្ទាត់សម្រាប់ស្ពាន CLI។ | | `OMNIROUTE_USER_ID` | `cli` | `src/lib/oauth/config/index.ts` | លេខសម្គាល់អ្នកប្រើសម្រាប់សម័យស្ពាន CLI។ | | `SERVER_URL` | _(unset)_ | `src/lib/oauth/config/index.ts` | ឈ្មោះក្លែងក្លាយចាស់សម្រាប់ `OMNIROUTE_SERVER`។ | | `CLI_TOKEN` | _(unset)_ | `src/lib/oauth/config/index.ts` | ឈ្មោះក្លែងក្លាយចាស់សម្រាប់ `OMNIROUTE_TOKEN`។ | | `CLI_USER_ID` | _(unset)_ | `src/lib/oauth/config/index.ts` | ឈ្មោះក្លែងក្លាយចាស់សម្រាប់ `OMNIROUTE_USER_ID`។ | --- ## 11. អត្តសញ្ញាណសម្គាល់អ្នកផ្តល់សេវា OAuth ### ការធ្វើឱ្យថូខិន Codex ស្រស់ឡើងវិញដោយអសកម្ម ការកំណត់ `OMNIROUTE_TOKEN_REFRESH_PASSIVE_PROVIDERS` ទៅជា `codex` ធ្វើឱ្យអ៊ីនស្តង់នេះក្លាយជាអ្នកប្រើប្រាស់អត្តសញ្ញាណសម្គាល់ Codex ដែលបានធ្វើសមកាលកម្ម មិនមែនជាអ្នកគ្រប់គ្រងការប្តូរថូខិនធ្វើឱ្យស្រស់ឡើងវិញទេ។ តម្លៃលំនាំដើមទទេ ឬមិនបានកំណត់ នឹងរក្សាឥរិយាបថធ្វើឱ្យស្រស់ឡើងវិញធម្មតា។ តម្លៃដែលបំបែកដោយសញ្ញាក្បៀសត្រូវបានកាត់ចន្លោះ និងមិនប្រកាន់អក្សរតូចធំទេ។ `cx` គឺជាឈ្មោះកាត់សម្រាប់ `codex`។ អ្នកផ្តល់សេវាដែលមិនគាំទ្រ នឹងបណ្តាលឱ្យការផ្ទៀងផ្ទាត់ពេលចាប់ផ្តើមបរាជ័យ។ អ្នកផ្តល់សេវាផ្សេងទៀតមិនត្រូវបានប៉ះពាល់ទេ។ នៅចំណុចធ្វើឱ្យស្រស់ឡើងវិញដែលមានស្រាប់ អ៊ីនស្តង់នេះរំលងឃ្លាំងសម្ងាត់អានការតភ្ជាប់ ហើយយកតែថូខិនចូលប្រើផ្សេងទៀតដែលមិនទាន់ផុតកំណត់។ ថូខិនដែលត្រូវបានបដិសេធដោយប្រព័ន្ធខាងលើក្នុងអំឡុងពេលសំណើ មិនអាចមានលក្ខណៈសម្បត្តិឡើងវិញបន្ទាប់ពីការធ្វើសមកាលកម្មត្រឡប់ក្រោយទេ៖ អត្តសញ្ញាណសម្គាល់សំណើរកាន់ទុកស្នាមម្រាមដៃ SHA-256 បានច្រើនបំផុតបួន ហើយស្នាមម្រាមដៃទាំងនោះត្រូវបានបោះចោលជាមួយសំណើនោះ។ មានតែវាលថូខិនប៉ុណ្ណោះដែលត្រូវបានយកមកប្រើ ដូច្នេះមេតាទិន្នន័យអ្នកផ្តល់សេវាដែលមានតែក្នុងសំណើនៅតែរក្សាទុក។ អត្តសញ្ញាណសម្គាល់ដែលបានយកមកប្រើមិនត្រូវបានរក្សាទុកឡើយ។ ប្រសិនបើគ្មានការជំនួសទេ `refresh_disabled` មិនមែនជាស្ថានភាពបញ្ចប់ ហើយមិនរាប់បញ្ចូលក្នុងឧបករណ៍បំបែកសៀគ្វីការធ្វើឱ្យថូខិនស្រស់ឡើងវិញទេ។ ចម្លើយ 401/403 ពិតប្រាកដពីប្រព័ន្ធខាងលើនៅតែរក្សាការរាប់បញ្ចូលបរាជ័យធម្មតា រយៈពេលរង់ចាំកើនឡើងតាមអិចស្ប៉ូណង់ស្យែល និងកំហុសអតិថិជន។ សញ្ញានៃការបិទដំណើរការគណនីនៅតែធ្វើឱ្យគណនីត្រូវបានចាក់សោជាអចិន្ត្រៃយ៍។ ការធ្វើឱ្យស្រស់ឡើងវិញដោយដៃតាមផ្ទាំងគ្រប់គ្រង/API នឹងត្រឡប់ `409` ជាមួយកូដ `refresh_disabled` និងសេចក្តីណែនាំឱ្យធ្វើឱ្យស្រស់ឡើងវិញនៅលើអ៊ីនស្តង់សកម្ម រួចធ្វើសមកាលកម្ម។ ការធ្វើឱ្យស្រស់ឡើងវិញដោយប្រយោល (ការជជែក ការប្រើប្រាស់ ការត្រួតពិនិត្យសុខភាព និងការផ្ទៀងផ្ទាត់ការនាំចូល) មិនបង្ហាញកំហុសនោះទេ។ ការសង្គ្រោះ 401 នៃការប្រើប្រាស់តាមតម្រូវការនឹងព្យាយាមម្តងទៀតជាមួយថូខិនដែលបានធ្វើសមកាលកម្ម និងយកមកប្រើ។ ការនាំចូលការផ្ទៀងផ្ទាត់ Codex រក្សាទុកថូខិនដែលបានផ្តល់ ដោយមិនធ្វើការផ្លាស់ប្តូរថូខិនធ្វើឱ្យស្រស់ឡើងវិញទេ។ ការចូល OAuth ថ្មីមិនត្រូវបានផ្លាស់ប្តូរឡើយ។ មិនមានការបន្ថែមការធ្វើសមកាលកម្មមុនការបញ្ជូនក្រៅពីផ្លូវធ្វើឱ្យស្រស់ឡើងវិញសកម្មដែលមានស្រាប់ទេ។ រក្សាអ្នកគ្រប់គ្រងការប្តូរថូខិនតែម្នាក់គត់ ហើយរៀបចំការធ្វើសមកាលកម្មថូខិនដោយឡែក មុនពេលថូខិនចូលប្រើផុតកំណត់ (រយៈពេលនាំមុខសកម្មតាមលំនាំដើម៖ ប្រាំនាទី)។ ជម្រើសនេះមិនមែនជាសោចែកចាយ ការចម្លងមូលដ្ឋានទិន្នន័យ ឬការដាក់ឱ្យប្រើ SQLite ដែលបានចែករំលែកទេ។ ប្រភព៖ `open-sse/services/tokenRefresh/passiveCodex.ts`។ អត្តសញ្ញាណសម្គាល់ដែលមានស្រាប់សម្រាប់ **ការអភិវឌ្ឍនៅលើ 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) | ការបដិសេធជាជម្រើសសម្រាប់ client id នៃ device-flow សាធារណៈរបស់ Muse CLI។ ទុកឱ្យមិនកំណត់ ដើម្បីប្រើ client សាធារណៈដែលបានបង្កប់មកជាមួយ។ | | `ANTIGRAVITY_OAUTH_CLIENT_ID` | Antigravity (Google) | តម្រូវឱ្យមាន `_SECRET` ដែលត្រូវគ្នា។ | | `ANTIGRAVITY_OAUTH_CLIENT_SECRET` | Antigravity (Google) | — | | `GITHUB_OAUTH_CLIENT_ID` | GitHub Copilot | Client សាធារណៈ។ | | `GHE_COPILOT_OAUTH_CLIENT_ID` | GHE Copilot | ការកំណត់ជំនួសជាជម្រើសសម្រាប់ OAuth client id របស់ GitHub Enterprise Copilot។ ប្រសិនបើមិនបានកំណត់ នឹងប្រើតម្លៃលំនាំដើមសាធារណៈរបស់ `GITHUB_OAUTH_CLIENT_ID`។ | | `COPILOT_INTEGRATION_ID` | GitHub Copilot | ការកំណត់ជំនួសជាជម្រើសសម្រាប់ GitHub Copilot client integration ID ដែលត្រូវបានផ្ញើក្នុង headers `Copilot-Integration-Id` និង `Editor-Plugin-Version`។ តម្លៃលំនាំដើមគឺ `copilot-developer-cli`។ | | `WINDSURF_API_KEY` | Windsurf / Devin (v3.8) | API key ជាជម្រើសបម្រុង ដែលប្រើដោយ `open-sse/executors/devin-cli.ts` នៅពេលមិនមាន credential សម្រាប់ការតភ្ជាប់នីមួយៗ។ ជាជម្រើស។ | | `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 client ID សម្រាប់ GitLab Duo។ ចុះឈ្មោះកម្មវិធីនៅ `https://gitlab.com/-/profile/applications` ជាមួយ redirect URI `/callback` និង scopes `api, read_user, openid, profile, email`។ ប្រសិនបើមិនបានកំណត់ នឹងប្រើ `GITLAB_OAUTH_CLIENT_ID`។ | | `GITLAB_DUO_OAUTH_CLIENT_SECRET` | GitLab Duo (v3.8) | OAuth client secret សម្រាប់ GitLab Duo។ ជាជម្រើស — លំហូរ PKCE មិនតម្រូវឱ្យមាន secret ទេ។ ប្រសិនបើមិនបានកំណត់ នឹងប្រើ `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 | កំណត់ដើម្បីបើក OAuth របស់ Qoder។ | | `QODER_OAUTH_TOKEN_URL` | Qoder | — | | `QODER_OAUTH_USERINFO_URL` | Qoder | — | | `QODER_OAUTH_CLIENT_ID` | Qoder | — | | `QODER_PERSONAL_ACCESS_TOKEN` | Qoder | ជម្រើសបម្រុងសម្រាប់ API key ដោយផ្ទាល់ (រំលង OAuth)។ | | `QODER_CLI_WORKSPACE` | Qoder | លេខសម្គាល់ Workspace សម្រាប់ Qoder CLI។ | | `OMNIROUTE_QODER_WORKSPACE` | Qoder | ឈ្មោះក្លែងក្លាយសម្រាប់ `QODER_CLI_WORKSPACE`។ | | `QODER_CLI_CONFIG_DIR` | Qoder | ប្តូរជំនួសថតកំណត់រចនាសម្ព័ន្ធ Qoder CLI (សម័យ PAT ដាច់ដោយឡែក ដែលជៀសវាងការជាន់លើការចូលតាមកម្មវិធីរុករក)។ | | `QODER_CLI_MAX_CONCURRENCY` | Qoder | ចំនួនអតិបរមានៃការដំណើរការ qodercli ស្របគ្នា (ការបង្កើត `print` ឬសំណើ ACP); សំណើបន្ថែមនឹងត្រូវដាក់ជាជួរ FIFO។ មិនកំណត់ (លំនាំដើម) = គ្មានដែនកំណត់។ | | `QODER_CLI_QUEUE_TIMEOUT_MS` | Qoder | រយៈពេលដែលសំណើ Qoder រង់ចាំចន្លោះ qodercli (មានប្រសិទ្ធភាពតែពេលបានកំណត់ដែនកំណត់) មុនពេលបរាជ័យដោយ 429 `qodercli_busy` + `Retry-After`។ លំនាំដើម `120000`។ | | `QODER_CLI_TRANSPORT` | Qoder | `print` (លំនាំដើម) បង្កើត `qodercli --print` សម្រាប់សំណើនីមួយៗ; `acp` រក្សាទុកដំណើរការ `qodercli --acp` ជាប់រហូតមួយសម្រាប់ PAT នីមួយៗ។ | | `QODER_CLI_ACP_IDLE_TIMEOUT_MS` | Qoder | ការដឹកជញ្ជូន ACP៖ បញ្ឈប់ដំណើរការ qodercli ដែលរក្សាទុកជាប់រហូត បន្ទាប់ពីគ្មានសកម្មភាពអស់រយៈពេលនេះ។ លំនាំដើម `600000`។ | | `QODER_CLI_ACP_STARTUP_TIMEOUT_MS` | Qoder | ការដឹកជញ្ជូន ACP៖ ពេលកំណត់សម្រាប់ qodercli ឆ្លើយតបនឹង `initialize` របស់ ACP។ លំនាំដើម `60000`។ | | `QODER_CLI_ACP_MAX_SESSIONS_PER_PROCESS` | Qoder | ការដឹកជញ្ជូន ACP៖ បញ្ចប់ដំណើរការ qodercli ដែលបន្តដំណើរការ បន្ទាប់ពីមានចំនួនសម័យនេះ។ លំនាំដើម `500`។ | | `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 របស់ OpenAI ចាស់ ឬ api.openai.com។ ចង្អុលទៅ `/v1` self-loop របស់ OmniRoute ឬ endpoint ណាមួយដែលឆបគ្នាជាមួយ OpenAI (Gemini OpenAI-compat, OpenRouter)។ បញ្ហា #2232។ នៅពេល URL គឺជា `/v1` របស់ OmniRoute ផ្ទាល់ សំណើររង describe នឹងផ្ញើ `x-omniroute-admission-bypass: internal` ហើយធ្វើការផ្ទៀងផ្ទាត់ដោយប្រើព័ត៌មានសម្ងាត់ self-loop ដែលបានដោះស្រាយ (`sk_omniroute` sentinel ក្នុង local mode ឬ `OMNIROUTE_API_KEY` / `ROUTER_API_KEY` — #1350) ដើម្បីឱ្យ deployment ដែលមាន `REQUIRE_API_KEY=true` ដំណើរការបាន។ | | `VISION_BRIDGE_API_KEY` | Vision Bridge guardrail | គន្លឹះ API សម្រាប់ URL ខាងលើ។ បដិសេធ env របស់ OpenAI / Google តាម provider សម្រាប់ការហៅ vision-bridge ដែលមិនមែនជា Anthropic។ ម៉ូដែល Anthropic នៅតែប្រើផ្លូវគន្លឹះ Anthropic ដែលបានកំណត់ជាក់លាក់។ បញ្ហា #2232។ | | `OMNIROUTE_VISION_BRIDGE_NEGATIVE_CACHE_MS` | Vision Bridge guardrail | រយៈពេលដែលលទ្ធផល routing "គ្មាន candidate ដែលអាចប្រើបាន" ត្រូវបានរក្សាទុកក្នុង cache គិតជា ms (លំនាំដើម `30000`)។ តម្លៃមិនត្រឹមត្រូវ ឬអវិជ្ជមាន នឹងត្រឡប់ទៅប្រើតម្លៃលំនាំដើម។ `0` បិទ negative cache។ ប្រភព៖ `src/lib/guardrails/visionBridgeRouter.ts`។ | | `OMNIROUTE_IMAGE_NORMALIZATION` | Vision image normalization | ជម្រើសដែលត្រូវបើកដោយចេតនា (មិនកំណត់ = បិទ មិនមានការផ្លាស់ប្តូរឥរិយាបថ, `1`/`true`/`on` = បើក)។ ធ្វើ normalization លើរូបភាព inline គ្រប់រូប (base64 data URI / Claude `source.data`) ក្នុងតួសំណើជជែក មុនពេលបញ្ជូន៖ អនុវត្តទិស EXIF, បម្លែងទៅជា RGB (alpha ត្រូវបានបញ្ចូលលើពណ៌ស), ជ្រុងវែងបំផុត `<= 4096` px, ភីកសែលសរុប `<= ~4M`។ រូបភាពដែលត្រូវការការផ្លាស់ប្តូរ នឹងត្រូវ encode ឡើងវិញជា baseline JPEG (ឯកសារ PNG ដែលគ្មាន alpha នឹងរក្សាទុកជា PNG ដែលគ្មានការបាត់បង់)។ រូបភាព RGB JPEG/PNG ដែលស្របតាមលក្ខខណ្ឌរួចហើយ នឹងឆ្លងកាត់ដោយមិនប៉ះពាល់។ ថវិកាត្រូវបានកំណត់ថេរ។ កំណត់គោលដៅលើបំពង់បញ្ជូនចក្ខុវិស័យបែប Qwen2-VL ដែលបដិសេធរូបភាពធំពេក/មិនសូវទូទៅ ដោយមានកំហុស parse 400 ឬជាប់គាំងដោយគ្មានលទ្ធផល។ URL http(s) ពីចម្ងាយមិនត្រូវបានទាញយកទេ។ ប្រព័ន្ធដែលបាត់ binary `sharp` ឬរូបភាពដែលមិនអាច decode បាន នឹងបញ្ជូនឆ្លងកាត់ដោយមិនផ្លាស់ប្តូរ (fail-open)។ ការបង្រួមរូបភាពធំ បន្ថែម latency ដល់សំណើ។ ប្រភព៖ `open-sse/utils/visionImageNormalization.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. ជំនួសតម្លៃព័ត៌មានសម្ងាត់នៅក្នុង `.env`។ --- ## 12. ការបដិសេធ User-Agent របស់ Provider បដិសេធ header `User-Agent` ដែលបានផ្ញើទៅកាន់ provider ខាងលើនីមួយៗ។ វាត្រូវបានដោះស្រាយយ៉ាងឌីណាមិកនៅពេលដំណើរការ ដោយ base class របស់ executor៖ ``` process.env[`${PROVIDER_ID}_USER_AGENT`] ``` > **ប្រភព៖** `open-sse/executors/base.ts` → `buildHeaders()` | Variable | Default Value | When to Update | | -------------------------------- | --------------------------------------------- | ------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | `CLAUDE_USER_AGENT` | `claude-cli/2.1.280 (external, cli)` | នៅពេល Anthropic ចេញផ្សាយ CLI version ថ្មី | | `CLAUDE_DISABLE_TOOL_NAME_CLOAK` | `false` | `executors/base.ts` + `executors/cliproxyapi.ts` | កំណត់ទៅជា `1`/`true` ដើម្បីបញ្ជូនឈ្មោះឧបករណ៍របស់ third-party harness តាមតម្លៃដើមទៅ Anthropic នៅលើផ្លូវដែលភ្ជាប់ទៅ Anthropic ទាំងពីរ (native OAuth និង CLIProxyAPI)។ តាមលំនាំដើម executor នឹងកំណត់ឈ្មោះជំនួសយ៉ាងមានលទ្ធផលដូចគ្នា សម្រាប់ឈ្មោះឧបករណ៍ដែលមិនមែនជា Claude-Code (ការផ្គូផ្គងតាម canonical របស់ Claude Code នៅពេលមាន បើមិនដូច្នោះទេប្រើ PascalCase) ហើយបម្លែងវាត្រឡប់វិញនៅក្នុង response តាមរយៈ `_toolNameMap` ដើម្បីកុំឱ្យ harness ដែលមានឧបករណ៍ snake_case ត្រូវបានបដិសេធថាជា client ភាគីទីបីដែលត្រូវបានសម្គាល់តាម fingerprint។ ប្រើសម្រាប់ការបំបាត់កំហុសប៉ុណ្ណោះ។ | | `CODEX_USER_AGENT` | `codex-cli/0.155.0 (Windows 10.0.26200; x64)` | នៅពេល OpenAI ធ្វើបច្ចុប្បន្នភាព Codex CLI | | `CODEX_CLIENT_VERSION` | `0.155.0` | បដិសេធ Codex client version ដោយឯករាជ្យពី full UA string | | `GROK_CLI_CLIENT_VERSION` | `1.0.41` | បដិសេធ `x-grok-client-version` សម្រាប់ inference, model sync និង device-code OAuth ព្រមទាំង User-Agent លំនាំដើមរបស់ Grok CLI សម្រាប់ inference និង model sync។ ទទួលយក SemVer ដែលអាចមាន prerelease/build metadata ជាជម្រើស មានប្រវែងអតិបរមា 128 តួអក្សរ បន្ទាប់ពីដកចន្លោះនៅខាងក្រៅ។ តម្លៃដែលមិនបានកំណត់ ទទេ មិនត្រឹមត្រូវ ឬមាន line break នឹងប្រើតម្លៃដែលបានកំណត់ជាមុននៅក្នុងកម្មវិធី។ ការបដិសេធ full inference User-Agent ដែលមានស្រាប់ នៅតែមានអាទិភាព។ | | `CLAUDE_CODE_CLIENT_VERSION` | `2.1.280` | បដិសេធ Claude Code version ដែលបានប្រកាស ដោយឯករាជ្យពី `CLAUDE_USER_AGENT`។ Anthropic ប្រើតម្លៃនេះជាលក្ខខណ្ឌសម្រាប់ model មួយចំនួន (#12417)។ | | `CLAUDE_CODE_CLIENT_BUILD_REVISION` | `1e2` | បដិសេធបច្ច័យប្រវែង 3 តួអក្សរ ដែល OmniRoute បន្ថែមទៅ `cc_version=` នៅក្នុង Claude billing block។ បង្កើនតម្លៃនេះរួមជាមួយ `CLAUDE_CODE_CLIENT_VERSION` — ការកំណត់តែ version នឹងប្រកាសជា `version.revision` pair ដែលគ្មាន binary ពិតណាមួយបញ្ចេញឡើយ។ | | `GITHUB_COPILOT_CLI_VERSION` | `1.0.91` | បដិសេធ Copilot CLI version ដែលបានប្រកាស ដោយឯករាជ្យពី `GITHUB_USER_AGENT` | | `GITHUB_USER_AGENT` | `GitHubCopilotChat/0.54.0` | នៅពេល GitHub Copilot Chat ធ្វើបច្ចុប្បន្នភាព | | `ANTIGRAVITY_CLI_CL` | _(មិនបានកំណត់)_ | បដិសេធ changelist របស់ Antigravity CLI (`agy`) Piper ដែលរាយការណ៍ជា `cl=` នៅក្នុង CLI User-Agent។ វាមិនអាចទាញសន្និដ្ឋានពី version ឬទទួលបានតាម public manifests បានទេ។ វាត្រូវបានបញ្ចូលតម្លៃតាម version ពីការចាប់យកទិន្នន័យផ្ទាល់ (1.4.4 → `1003595037`)។ ប្រសិនបើ version មិនស្គាល់ និងមិនបានកំណត់ តម្លៃ `cl=` នឹងត្រូវលុបចេញ ជំនួសឱ្យការប្រកាស changelist របស់ build ផ្សេងទៀត។ | | `KIRO_USER_AGENT` | `AWS-SDK-JS/3.0.0 kiro-ide/1.0.0` | នៅពេល Kiro IDE ធ្វើបច្ចុប្បន្នភាព | | `KIRO_OAUTH_CLIENT_ID` | `kiro-cli` | បដិសេធ `clientId` របស់ Kiro social device-code (public id) | | `KIRO_VERIFY_FULL_CRC` | `false` | ជាជម្រើសបើកប្រើ៖ ធ្វើសុពលកម្ម CRC ពេញលេញតាម message នីមួយៗក្នុង event stream របស់ Kiro (សម្រាប់បំបាត់កំហុស stream ដែលខូច) | | `KIRO_CREDIT_PRICE_USD` | `0.02` | USD ក្នុងមួយ Kiro credit; បម្លែង credits របស់ `meteringEvent` ទៅជាតម្លៃពិតប្រាកដក្នុងមួយ request | | `KIRO_REQUIRE_CREDITS` | `false` | បរាជ័យចំពោះ Kiro response ដែលរាយការណ៍ថាគ្មាន credit metering ជំនួសឱ្យការកត់ត្រាវាថាមិនបានចេញវិក្កយបត្រ | | `QODER_USER_AGENT` | `Qoder-Cli` | នៅពេល Qoder CLI ធ្វើបច្ចុប្បន្នភាព | | `CURSOR_USER_AGENT` | `Cursor/3.3` | នៅពេល Cursor ធ្វើបច្ចុប្បន្នភាព | > [!TIP] > អ្នកអាចបន្ថែមការបដិសេធ User-Agent សម្រាប់ provider **ណាមួយ** ដោយប្រើលំនាំ `{PROVIDER_ID}_USER_AGENT`។ executor នឹងបង្កើតឈ្មោះ env var យ៉ាងឌីណាមិក។ --- ## 13. ភាពឆបគ្នានៃ CLI Fingerprint នៅពេលបើកដំណើរការ OmniRoute នឹងរៀបចំលំដាប់បឋមកថា HTTP និងវាលតួ JSON ឡើងវិញ ដើម្បីឲ្យត្រូវគ្នាយ៉ាងពិតប្រាកដជាមួយ signature របស់ឧបករណ៍ CLI ផ្លូវការ។ វាជួយកាត់បន្ថយហានិភ័យនៃការសម្គាល់គណនី ខណៈពេលដែលរក្សា IP របស់ប្រូកស៊ីរបស់អ្នក។ **ប្រភព៖** `open-sse/config/cliFingerprints.ts`, `open-sse/executors/base.ts` ### តាមអ្នកផ្តល់សេវា | អថេរ | ការធ្វើឲ្យសកម្ម | ប្រសិទ្ធផល | | ------------------------ | --------------- | ------------------------------------------- | | `CLI_COMPAT_CODEX` | `=1` | ក្លែងធ្វើ signature សំណើរបស់ Codex CLI | | `CLI_COMPAT_CLAUDE` | `=1` | ក្លែងធ្វើ signature សំណើរបស់ Claude Code | | `CLI_COMPAT_GITHUB` | `=1` | ក្លែងធ្វើ signature សំណើរបស់ GitHub Copilot | | `CLI_COMPAT_ANTIGRAVITY` | `=1` | ក្លែងធ្វើ signature សំណើរបស់ Antigravity | | `CLI_COMPAT_CURSOR` | `=1` | ក្លែងធ្វើ signature សំណើរបស់ Cursor | | `CLI_COMPAT_KIMI_CODING` | `=1` | ក្លែងធ្វើ signature សំណើរបស់ Kimi Coding | | `CLI_COMPAT_KILOCODE` | `=1` | ក្លែងធ្វើ signature សំណើរបស់ Kilo Code | | `CLI_COMPAT_CLINE` | `=1` | ក្លែងធ្វើ signature សំណើរបស់ Cline | ### សកល | អថេរ | ការធ្វើឲ្យសកម្ម | ប្រសិទ្ធផល | | ---------------- | --------------- | -------------------------------------------------------------------------- | | `CLI_COMPAT_ALL` | `=1` | បើកភាពឆបគ្នានៃ fingerprint សម្រាប់អ្នកផ្តល់សេវា **ទាំងអស់** ក្នុងពេលតែមួយ។ | ### ការបដិសេធអត្តសញ្ញាណ Kimi Coding CLI | អថេរ | លំនាំដើម | ឯកសារប្រភព | សេចក្ដីពិពណ៌នា | | ----------------------- | -------------------- | ---------------------------------------- | ------------------------------------------------------------------------ | | `KIMI_CLI_VERSION` | `1.36.0` | `src/lib/oauth/providers/kimi-coding.ts` | បដិសេធកំណែ Kimi CLI ដែលត្រូវបានផ្ញើអំឡុងពេលហៅ OAuth/API។ | | `KIMI_CODING_DEVICE_ID` | _(captured default)_ | `src/lib/oauth/providers/kimi-coding.ts` | បដិសេធលេខសម្គាល់ឧបករណ៍ Kimi ដែលបានចាប់យក និងប្រើក្នុងបឋមកថាម៉ាស៊ីនភ្ញៀវ។ | > [!NOTE] > មុខងារនេះដំណើរការរួមជាមួយការបដិសេធ User-Agent (§12)។ ប្រព័ន្ធ fingerprint គ្រប់គ្រងលំដាប់បឋមកថា និងលំដាប់វាលតួ ខណៈពេលដែលការបដិសេធ User-Agent គ្រប់គ្រងខ្សែអក្សរ UA ជាក់លាក់។ មុខងារទាំងពីរអាចបើកដំណើរការដោយឡែកពីគ្នា។ --- ## 14. អ្នកផ្តល់សេវាគន្លឹះ API គន្លឹះ API សម្រាប់អ្នកផ្តល់សេវាដែលប្រើការផ្ទៀងផ្ទាត់ដោយផ្ទាល់។ **ការរៀបចំដែលណែនាំ៖** ផ្ទាំងគ្រប់គ្រង → អ្នកផ្តល់សេវា → បន្ថែមគន្លឹះ API។ ការកំណត់តាមអថេរបរិស្ថានគឺជាជម្រើសមួយទៀតសម្រាប់ការដាក់ពង្រាយ Docker ឬការដាក់ពង្រាយដោយគ្មាន GUI។ លំនាំដែលទទួលស្គាល់៖ `{PROVIDER_ID}_API_KEY` | អថេរ | អ្នកផ្តល់សេវា | | ------------------ | ---------------------------------------------------- | | `DEEPSEEK_API_KEY` | DeepSeek | | `NVIDIA_API_KEY` | NVIDIA NIM | | `JINA_AI_API_KEY` | Jina AI (Foundation API + Reader fallback) | | `JINA_API_KEY` | Jina AI (ឈ្មោះក្លែងក្លាយសម្រាប់ `JINA_AI_API_KEY`) | | `GEMINI_API_KEY` | Gemini (Google AI Studio) embeddings + chat fallback | | `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 លែងអានវាទៀតហើយ — អ្នកផ្តល់សេវាទាំងនោះពឹងផ្អែកទាំងស្រុងលើផ្ទាំងគ្រប់គ្រង / `data/provider-credentials.json` / មូលដ្ឋានទិន្នន័យដែលបានអ៊ិនគ្រីប។ សូមមើលផ្នែក _Audit: Removed / Dead Variables_ នៅខាងក្រោមឯកសារនេះ សម្រាប់វិធីផ្លាស់ប្ដូរ។ > [!TIP] > គន្លឹះដែលបានកំណត់តាមផ្ទាំងគ្រប់គ្រង ត្រូវបានរក្សាទុកដោយអ៊ិនគ្រីបក្នុង SQLite ហើយមានអាទិភាពជាងអថេរបរិស្ថាន។ > > **Jina៖** embeddings, rerank, classify, segment របស់ `jina-ai/…` និង `jina-search` នឹងមិនគិតថ្លៃលើ cluster env key នៅពេលមាន connection `jina-ai` (ឬ `jina-reader` ដែលបានចែករំលែក) ក្នុងផ្ទាំងគ្រប់គ្រងទេ — `getProviderCredentials` ប្រើលំដាប់បំពេញជាមុន។ `JINA_AI_API_KEY` / `JINA_API_KEY` ត្រូវបានប្រើតែនៅពេលគ្មានគន្លឹះក្នុងផ្ទាំងគ្រប់គ្រងដែលអាចប្រើបានប៉ុណ្ណោះ។ កំណត់ហេតុការហៅនឹងកំណត់ env fallback ជា `connection_id=env:JINA_AI_API_KEY`។ កាត Reader (`jina-reader`, `r.jina.ai`) មិនដែលផ្តល់សេវា `/v1/embeddings` ឬ `/v1/rerank` ទេ។ > > **Gemini៖** `gemini/gemini-embedding-2` (ឈ្មោះក្លែងក្លាយ `google/gemini-embedding-2`) ប្រើ connection `gemini` ក្នុងផ្ទាំងគ្រប់គ្រងជាមុន។ `GEMINI_API_KEY` / `GOOGLE_API_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 = បានបិទ) ``` | Variable | Default | Description | | ------------------------------------------------- | ----------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `REQUEST_TIMEOUT_MS` | _(unset)_ | ផ្លូវកាត់សកល — បដិសេធតម្លៃលំនាំដើមរបស់ទាំង `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 ហើយគោលដៅដែលប្រកាសថវិកាយូរជាងនេះ (តាមលំដាប់ `timeoutMs` របស់ការតភ្ជាប់ បន្ទាប់មកតាមម៉ូដែល បន្ទាប់មកតាមកម្រិតអ្នកផ្តល់សេវា ឧ. 3000000 របស់ GLM) នឹងទទួលបានថវិកានោះបូកនឹង 60000 ជំនួសវិញ។ តម្លៃវិជ្ជមានគឺជាដែនកំណត់រឹងសម្រាប់គ្រប់គោលដៅ ដែលថវិកាដែលបានប្រកាសមិនអាចបង្កើនបានទេ។ កំណត់ជា `0` ដើម្បីបិទសម្រាប់គ្រប់គោលដៅ។ | | `OMNIROUTE_SSE_COMMENTS` | _(disabled)_ | កំណត់ថាតើ 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` ជាប់គ្នា (ដែលមាន block index និង delta type ដូចគ្នា) ទៅជាមួយ សម្រាប់ផ្ញើទៅកាន់អតិថិជន Claude ដោយបញ្ចេញយ៉ាងហោចណាស់រៀងរាល់ N ms។ មិនបាត់បង់ទិន្នន័យឡើយ; `signature_delta` និងព្រឹត្តិការណ៍ព្រំដែនមិនត្រូវបានបញ្ចូលជាមួយគ្នាទេ។ អនុវត្តចំពោះ delta type ទាំងអស់ លុះត្រាតែបានកំណត់អថេរតាមប្រភេទខាងក្រោម។ ប្រើដោយ `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 frames ដែលត្រូវបានបញ្ជូនបន្តក្នុងរយៈពេល N ms ទៅជាការសរសេរតែមួយទៅកាន់ម៉ាស៊ីនភ្ញៀវ។ frame ដំបូង និង frame បញ្ចប់ (`[DONE]`, `message_stop`, `error`, `response.completed`/`failed`/`incomplete`) មិនត្រូវបានពន្យារពេលឡើយ; នៅពេលបើកការប្រមូលជាបាច់ ITL វាស់ចន្លោះរវាង batch។ ប្រើដោយ `open-sse/utils/sseOutputSink.ts`។ | | `SSE_STALL_WATCHDOG` | `timer` | ការអនុវត្តកម្មវិធីត្រួតពិនិត្យការជាប់គាំងជាបៃ សម្រាប់ការឆ្លើយតបដែលបញ្ជូនជាបន្តបន្ទាប់។ `timer` ចាប់ផ្តើម timer មួយឡើងវិញសម្រាប់ upstream chunk នីមួយៗ (ដំណើរការយ៉ាងពិតប្រាកដនៅពេលដល់កម្រិតពេលវេលាជាប់គាំង); `interval` រក្សាការត្រួតពិនិត្យមួយក្នុងមួយ stream ដោយមានចន្លោះពេល `clamp(budget/4, 1s, 5s)` ដូច្នេះការជាប់គាំងនឹងត្រូវបានរកឃើញក្នុងរយៈពេល budget + period។ ប្រើដោយ `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` | ឧបករណ៍បិទបើកបន្ទាន់សម្រាប់ heuristic `/goal`។ កំណត់ជា `false`/`0`/`off` ដើម្បីបិទការរកឃើញទាំងស្រុង — ពេលវេលាអស់សម្រាប់ភាពត្រៀមខ្លួន និងការស្តារស្ទ្រីម នឹងមិនត្រូវបានបង្កើនដោយ body/headers របស់សំណើឡើយ ដោយកាត់បន្ថយការពង្រីកពេលវេលាអស់ដែលគ្រប់គ្រងដោយ client។ | | `OMNIROUTE_AGENT_GOAL_READINESS_MAX_TIMEOUT_MS` | `600000` | រយៈពេលអតិបរមានៃបង្អួចត្រៀមខ្លួនសម្រាប់ព្រឹត្តិការណ៍ដំបូង សម្រាប់ការដំណើរការ agent `/goal` ដែលបានរកឃើញ ឬសំណើដែលបង្ខំដោយ `x-omniroute-agent-goal`។ | | `OMNIROUTE_AGENT_GOAL_STREAM_RECOVERY` | `true` | បើកការស្តារស្ទ្រីមមុនពេលកំណត់ដោយស្វ័យប្រវត្តិ សម្រាប់ការដំណើរការ agent `/goal` ដែលបានរកឃើញ។ កំណត់ជា `false`/`0`/`off` ដើម្បីបិទជម្រើសចូលរួមជាក់លាក់សម្រាប់ goal។ វាអាចបន្ថែមការស្តារបានតែពីលើលំនាំដើមរបស់ operator ប៉ុណ្ណោះ — វាមិនដែលបដិសេធជម្រើសបិទដែលបានកំណត់ជាក់លាក់នៅក្នុង `STREAM_RECOVERY_ENABLED`/DB settings ឡើយ។ | | `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` | _(unset)_ | ការដឹកជញ្ជូន Codex ទៅកាន់ app-server ដែលត្រូវជ្រើសរើសចូលប្រើ។ ចំណុចបញ្ចប់ 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` | _(unset)_ | token សមត្ថភាព/អ្នកកាន់សិទ្ធិដែលបញ្ចូលផ្ទាល់ និងបញ្ជូនទៅកាន់ app-server។ ការបដិសេធតាមការតភ្ជាប់នីមួយៗ៖ `providerSpecificData.codexAppServerToken`។ | | `OMNIROUTE_CODEX_APPSERVER_WS_TOKEN_FILE` | _(unset)_ | ផ្លូវទៅកាន់ឯកសារដែលផ្ទុក capability token របស់ app-server (ពី `codex app-server --ws-token-file`)។ កំណត់នេះត្រូវបានប្រើ នៅពេល `OMNIROUTE_CODEX_APPSERVER_WS_TOKEN` មិនត្រូវបានកំណត់។ ការបដិសេធតាមការតភ្ជាប់៖ `providerSpecificData.codexAppServerTokenFile`។ | | `OMNIROUTE_CODEX_APPSERVER_CWD` | `/tmp` | ថតការងារដែល app-server turn ដំណើរការ។ ការបដិសេធតាមការតភ្ជាប់៖ `providerSpecificData.codexAppServerCwd`។ | | `OMNIROUTE_CODEX_APPSERVER_APPROVAL` | _(unset)_ | គោលការណ៍អនុម័តដែលបញ្ជូនទៅ app-server turn (ឧ. `never`, `on-request`)។ ការបដិសេធតាមការតភ្ជាប់៖ `providerSpecificData.codexAppServerApprovalPolicy`។ | | `OMNIROUTE_CODEX_APPSERVER_SANDBOX` | _(unset)_ | គោលការណ៍ sandbox ដែលបញ្ជូនទៅ app-server turn (ឧ. `read-only`, `workspace-write`, `danger-full-access`)។ នៅពេលមិនបានកំណត់ executor នឹងកំណត់លំនាំដើមទៅជា `workspace-write` (មានការពង្រឹងសុវត្ថិភាព; ពីមុនជា `danger-full-access`)។ ការបដិសេធតាមការតភ្ជាប់៖ `providerSpecificData.codexAppServerSandbox`។ | | `OMNIROUTE_CODEX_APPSERVER_AUTO_APPROVE` | `false` | អនុម័តដោយស្វ័យប្រវត្តិនូវសំណើអនុម័តផ្ទាល់របស់ app-server (ការប្រតិបត្តិពាក្យបញ្ជា/ឯកសារ/សិទ្ធិលើម៉ាស៊ីន host)។ បិទជាលំនាំដើម — សំណើត្រូវបានបដិសេធដោយស្វ័យប្រវត្តិ; ការហៅឧបករណ៍របស់ harness មិនរងផលប៉ះពាល់ទេ (វាឆ្លងកាត់ `item/tool/call` passthrough ដាច់ដោយឡែក)។ ទទួលយក `true`/`1`/`yes`។ ការបដិសេធតាមការតភ្ជាប់៖ `providerSpecificData.codexAppServerAutoApprove`។ | | `FETCH_HEADERS_TIMEOUT_MS` | = `FETCH_TIMEOUT_MS` | រយៈពេលដែលត្រូវការដើម្បីទទួលបឋមកថាចម្លើយ។ | | `OMNIROUTE_FETCH_START_TIMEOUT_CAP_MS` | `110000` | រយៈពេលរង់ចាំអតិបរមាសម្រាប់បឋមកថាចម្លើយលើសំណើ streaming (មិល្លីវិនាទី)។ `0` បិទកម្រិតនេះ; `fetchStartTimeoutCapMs` របស់ provider ដែលបានកំណត់ជាក់លាក់ នឹងមានអាទិភាព។ | | `OMNIROUTE_CODEX_IMAGE_RESPONSE_START_TIMEOUT_MS` | `600000` (10 នាទី) | ពេលកំណត់ចាប់ផ្ដើមការឆ្លើយតបដំបូង (មិល្លីវិនាទី) សម្រាប់សំណើ POST បង្កើត/កែសម្រួលរូបភាព Codex ដែលបានបង់ប្រាក់ ទាំងតភ្ជាប់ដោយផ្ទាល់ និងតាមប្រូកស៊ី HTTP(S)/SOCKS។ សំណើទាំងនេះមិនត្រូវបានផ្ញើឡើងវិញទេ បន្ទាប់ពីអស់ពេលកំណត់ដែលមិនអាចបញ្ជាក់បាន ឬមានបញ្ហាបណ្ដាញ។ Edge relay (`vercel`/`deno`/`cloudflare`) ក៏ព្យាយាមមួយដងដែរ ប៉ុន្តែប្រើពេលកំណត់ `OMNIROUTE_RELAY_FETCH_TIMEOUT_MS` ផ្ទាល់ខ្លួន។ | | `OMNIROUTE_DIRECT_HEADERS_TIMEOUT_MS` | `30000` (30 វិនាទី) | រយៈពេលរង់ចាំអតិបរមា (មិល្លីវិនាទី) រហូតដល់ការឆ្លើយតបចាប់ផ្ដើម សម្រាប់ការព្យាយាមតភ្ជាប់ដោយផ្ទាល់នីមួយៗដែលគ្មានប្រូកស៊ី។ ការអស់ពេលកំណត់នឹងព្យាយាមម្ដងទៀតតាម socket ថ្មី; កំណត់ជា `0` ដើម្បីបិទដែនកំណត់នេះ និងរក្សាឥរិយាបថមុន។ | | `OMNIROUTE_LOCAL_DIRECT_HEADERS_TIMEOUT_MS` | `300000` (5 នាទី) | តម្លៃអប្បបរមានៃពេលចាប់ផ្ដើមការឆ្លើយតប (មិល្លីវិនាទី) សម្រាប់ការព្យាយាមតភ្ជាប់ដោយផ្ទាល់ដែលគ្មានប្រូកស៊ី និងមានម៉ាស៊ីនគោលដៅជាឯកជន/LAN/loopback (ឧទាហរណ៍ `localhost`, `host.docker.internal`, `192.168.x.x`) ដើម្បីកុំឱ្យការចាប់ផ្ដើមត្រជាក់របស់ Ollama ដើមត្រូវបានកាត់ផ្ដាច់ដោយតម្លៃលំនាំដើម 30 វិនាទីខាងលើ។ វាដើរតួជាតម្លៃអប្បបរមា៖ ពេលរង់ចាំមានប្រសិទ្ធភាពគឺតម្លៃធំជាងរវាងតម្លៃនេះ និង `OMNIROUTE_DIRECT_HEADERS_TIMEOUT_MS`; `0` ឬតម្លៃមិនត្រឹមត្រូវនឹងលុបតម្លៃអប្បបរមាសម្រាប់ local។ ម៉ាស៊ីនពីចម្ងាយមិនរងផលប៉ះពាល់ទេ។ | | `OMNIROUTE_DIRECT_HEADERS_VOLUME_ADAPTIVE` | `1` | បង្កើនបង្អួចចាប់ផ្ដើមការឆ្លើយតបដោយផ្ទាល់តាមកម្រិតទំហំ payload នៃសំណើ៖ body លើស 512 KB ទទួលបាន ×2, លើស 2 MB ទទួលបាន ×3 ដោយកំណត់អតិបរមាត្រឹម 180 វិនាទី ហើយមិនបន្ថយតម្លៃអប្បបរមាដែលខ្ពស់ជាងនេះរួចហើយទេ (ការកំណត់ជំនួសរបស់ operator ឬតម្លៃអប្បបរមា local/LAN ខាងលើ)។ បរិបទធំៗត្រូវបាន prefill តាមសមាមាត្រទំហំ input ដោយគ្មាន reasoning selector សម្រាប់ឱ្យពិដាន reasoning ចាប់យក ដូច្នេះបង្អួចថេរបានកាត់ផ្ដាច់ upstream ដែលមាន slow-prefill ប៉ុន្តែដំណើរការល្អ នៅត្រឹមតម្លៃអប្បបរមាយ៉ាងជាក់លាក់។ កំណត់ជា `0`/`false`/`off` ដើម្បីរក្សាឥរិយាបថបង្អួចថេរ។ | | `OMNIROUTE_DIRECT_RESPONSE_RETRY_TIMEOUT_MS` | `600000` (10 នាទី) | ពិដាន (មិល្លីវិនាទី) សម្រាប់ការព្យាយាម RETRY តាម socket ថ្មី បន្ទាប់ពីការអស់ពេលកំណត់ចាប់ផ្ដើមការឆ្លើយតបរបស់ការព្យាយាមតាម pooled ខាងលើ (#13703)។ អនុវត្តតែពេល caller បានភ្ជាប់សញ្ញាកំណត់ពេលផ្ទាល់ខ្លួនរួចហើយ (លំដាប់បន្ត `FETCH_TIMEOUT_MS` របស់ connection/model/provider ដែលបានដោះស្រាយ); សញ្ញានោះជាដែនកំណត់ពិត ហើយនឹងដំណើរការមុនគេនៅក្នុងផ្លូវដែលបានរំពឹងទុក ដូច្នេះតម្លៃនេះគ្រាន់តែជាការការពារបន្ថែមដ៏ទូលំទូលាយ មិនមែនជាពិដានថេរទេ — បើគ្មានវា ការព្យាយាមឡើងវិញនឹងប្រើបង្អួច `OMNIROUTE_DIRECT_HEADERS_TIMEOUT_MS` ខ្លីដដែលជាមួយការព្យាយាមតាម pooled ហើយបង្កើត 504 សម្រាប់ reasoning model ដែលមាន TTFB យឺត ប៉ុន្តែដំណើរការល្អ។ មិនអនុញ្ញាតឱ្យទាបជាងតម្លៃអប្បបរមាថេរខាងលើទេ; នៅពេល caller មិនផ្ដល់សញ្ញាកំណត់ពេលណាមួយ ការព្យាយាមឡើងវិញនឹងរក្សាតម្លៃអប្បបរមាថេរដដែល។ | | `FETCH_BODY_TIMEOUT_MS` | = `FETCH_TIMEOUT_MS` | ពេលវេលាសម្រាប់ទទួល body ពេញលេញនៃការឆ្លើយតប។ | | `FETCH_CONNECT_TIMEOUT_MS` | `30000` | ពេលកំណត់សម្រាប់បង្កើតការតភ្ជាប់ TCP។ | | `FETCH_KEEPALIVE_TIMEOUT_MS` | `4000` | អស់ពេលទំនេររបស់ socket Keep-alive។ | | `TLS_CLIENT_TIMEOUT_MS` | = `FETCH_TIMEOUT_MS` | អស់ពេលរបស់ប្រូកស៊ីស្នាមម្រាមដៃ TLS (wreq-js)។ | | `TLS_FIRST_BYTE_WATCHDOG_MS` | `10000` | កំណត់ពេលរហូតដល់បៃដំបូងសម្រាប់ផ្នែក body ជាក់លាក់នៃការដឹកជញ្ជូន TLS ដែលមានស្នាមម្រាមដៃរបស់ wreq-js; `TLS_CLIENT_TIMEOUT_MS` តែមួយមុខមិនអាចចាប់បាន body ដែលជាប់គាំងទេ ព្រោះវាបញ្ចប់ភ្លាមៗនៅពេល headers មកដល់ (#12656)។ ការអស់ពេលនឹងបោះបង់ wreq reader ហើយប្តូរទៅ direct/proxy dispatcher; `0` បិទ watchdog។ | | `RESPONSES_FIRST_BYTE_TIMEOUT_MS` | `15000` | សម្រាប់ OpenCode executor ប៉ុណ្ណោះ ហើយមានប្រសិទ្ធភាពតែនៅពេល feature flag `OPENCODE_RESPONSES_STALL_ROTATION` បើក (បិទតាមលំនាំដើម)៖ កំណត់ពេលរង់ចាំបៃដំបូងនៃ body ពី Responses reply ដែលកំពុង stream បន្ទាប់ពី headers របស់វា (#13484)។ Responses stream ចាប់ផ្តើមដោយ `response.created` ដូច្នេះភាពស្ងាត់លើសពីចន្លោះពេលនេះគឺជាការជាប់គាំង៖ គណនីនឹងត្រូវបានដាក់ឱ្យសម្រាក ហើយសំណើនឹងប្តូរទៅគណនីបន្ទាប់ម្តង; ប្រសិនបើជាប់គាំងជាលើកទីពីរ វានឹងបរាជ័យភ្លាមៗ។ `0` បិទ guard ទោះបី flag បើកក៏ដោយ។ | | `OPENCODE_RESPONSES_HEADERS_WAIT_MS` | `0` (= off) | សម្រាប់ OpenCode executor ប៉ុណ្ណោះ៖ កំណត់ពេលរង់ចាំ headers នៃ upstream response សម្រាប់ការហៅ Responses ដែលកំពុង stream នៅពេលនៅមានគណនីផ្សេងទៀតអាចប្រើបាន — សំណើដែលកំពុងជួររង់ចាំនឹងឈប់រង់ចាំ ហើយបន្តទៅមុខ ជំនួសឱ្យកាន់កាប់ចន្លោះពេល headers ទាំងមូល។ មានឥទ្ធិពលតែទៅលើការហៅ Responses ដែលកំពុង stream ប៉ុណ្ណោះ (Responses stream ចាប់ផ្តើមដោយ `response.created` ដូច្នេះភាពស្ងាត់នៅទីនោះគឺជាជួររង់ចាំ មិនមែនការបង្កើតទេ)។ chat completions និងការហៅដែលមិនមែនជា stream មិនរងផលប៉ះពាល់ទេ ហើយចន្លោះពេលនេះគ្រាន់តែបន្ថយកម្រិតពេលចាប់ផ្តើម fetch ដែលមានប្រសិទ្ធភាពប៉ុណ្ណោះ មិនដែលបន្ថែមវាឡើយ។ តម្លៃដែលបានណែនាំនៅពេលបើក៖ `30000`។ `0` បិទ។ | | `OPENCODE_RESPONSES_HEADERS_WAIT_MAX_ROTATIONS` | `2` | សម្រាប់ OpenCode executor ប៉ុណ្ណោះ៖ ចំនួនដងក្នុងមួយសំណើ ដែលការកំណត់ពេលរង់ចាំ headers ខាងលើអាចប្តូរទៅគណនីបន្ទាប់។ គណនីចុងក្រោយដែលនៅសល់នឹងរក្សាចន្លោះពេល headers ពេញលេញជានិច្ច។ | | `OPENCODE_PARK_AND_RESUME` | `false` | សម្រាប់ OpenCode executor ប៉ុណ្ណោះ៖ ដាក់សំណើឱ្យរង់ចាំជាមួយ heartbeat បន្ទាប់ពីទទួលបាន 429 បណ្តោះអាសន្នជាបន្តបន្ទាប់ (ឬសញ្ញាបង្ហាញភាពតានតឹងរបស់ pool ថ្មីៗ) បន្ទាប់មកចាក់ដំណើរការឡើងវិញតាមជំហានដែលកំណត់ចំនួនអតិបរមា ដោយប្រើគណនីបន្តបន្ទាប់រហូតដល់ 3 ជំនួសឱ្យការបញ្ជូនទៅ fleet ទាំងមូល (#13924)។ បិទតាមលំនាំដើម៖ រាល់ 429 នឹងប្តូរទៅគណនីបន្ទាប់ដូចពីមុន។ | | `OPENCODE_PARK_REPLAY_SERVE_SETASIDE` | `false` | សម្រាប់ OpenCode executor ប៉ុណ្ណោះ៖ នៅពេលគណនីទាំងអស់ដែលត្រៀមរួចរាល់បន្ទាប់ពី cooldown ក្នុង replay leg របស់ park-and-resume ត្រូវបានដាក់ដោយឡែកដោយអង្គចងចាំការបដិសេធពីប្រូកស៊ី សូមបម្រើពួកវាទោះជាយ៉ាងណាក៏ដោយ ជំនួសឱ្យការមិន replay អ្វីទាំងអស់ (#14851, ការបន្តពី #14750)។ បិទតាមលំនាំដើម៖ replay leg នឹងទទេក្នុងករណីនោះ ដូចមុន #14750។ | | `STREAM_READINESS_STALL_RETRY` | `false` | សម្រាប់ការជជែកតាម streaming ប៉ុណ្ណោះ៖ នៅពេល body ពី upstream ដំបូងជាប់គាំង មុនពេលបង្កើត event ដែលអាចប្រើបាន សូមធ្វើការព្យាយាមលើកទីពីរដែលមានព្រំដែនតាម routing path ដដែល ជាមួយ readiness budget ដដែល និងមិនដាក់ទណ្ឌកម្មលើគណនី។ បិទតាមលំនាំដើម៖ body ដំបូងដែលជាប់គាំងនឹងធ្វើឱ្យ request បរាជ័យដោយគ្មានការព្យាយាមឡើងវិញ។ | | `OPENCODE_POOL_RESELECT` | `false` | សម្រាប់ OpenCode executor ប៉ុណ្ណោះ៖ បន្ទាប់ពីទទួលបាន 429 ពី provider ដែលបែងចែកតាម egress-bucket លើគណនីដែលគ្មានប្រូកស៊ី ក្រោមបរិបទ ambient pool សូមស្នើឱ្យ connection pool ជ្រើសសមាជិកផ្សេងសម្រាប់ការព្យាយាមបន្ទាប់ ជំនួសឱ្យការព្យាយាមអាសយដ្ឋាន egress ដដែលឡើងវិញ។ វារៀបលំដាប់ មិនមែនដកចេញទេ៖ pool ដែលអស់សមត្ថភាពនៅតែរក្សាឥរិយាបថបច្ចុប្បន្ន។ បិទតាមលំនាំដើម៖ រាល់ 429 នឹងប្តូរទៅគណនីបន្ទាប់ ដូចមុនគ្រប់យ៉ាង។ | | `OPENCODE_POOL_STRAIN_MARKER_PATH` | _(មិនបានកំណត់)_ | សម្រាប់ OpenCode executor ប៉ុណ្ណោះ៖ បដិសេធផ្លូវរបស់ pool-strain marker ដែលអានមុនពេល parking (`{since, reason, ttl_s}`, លំនាំដើម `/tmp/opencode-pool-strain.json`, #13924)។ marker ថ្មីនឹងធ្វើឱ្យ park ដោយមិនរាប់ឡើងវិញ។ ប្រសិនបើបាត់ ឬចាស់ពេក នឹងត្រឡប់ទៅប្រើ burst counter។ | | `API_BRIDGE_PROXY_TIMEOUT_MS` | `30000` | ពេលអស់កំណត់សម្រាប់ proxy hop នៃ bridge requests `/v1`។ | | `FIRECRAWL_BASE_URL` | `https://api.firecrawl.dev` | កំណត់ Firecrawl web-fetch executor ឱ្យចង្អុលទៅ instance ដែលបង្ហោះដោយខ្លួនឯង (API key ជាជម្រើសនៅក្រៅ cloud)។ | | `FIRECRAWL_TIMEOUT_MS` | `30000` | ពេលអស់កំណត់ក្នុងមួយ request សម្រាប់ Firecrawl web-fetch executor។ | | `TAVILY_BASE_URL` | _(unset)_ | URL មូលដ្ឋានសម្រាប់កម្មវិធីទាញយកកូតា `/usage` របស់ Tavily (ដែនកំណត់របស់អ្នកផ្តល់សេវា)។ មិនអើពើ ប្រសិនបើវាចង្អុលទៅ `api.tavily.com`។ ប្រសិនបើមិនកំណត់ នឹងប្រើ URL មូលដ្ឋានរបស់ការតភ្ជាប់ជំនួស។ | | `API_BRIDGE_SERVER_REQUEST_TIMEOUT_MS` | `300000` | ពេលអស់កំណត់សរុបសម្រាប់សំណើទៅម៉ាស៊ីនមេរបស់ bridge។ | | `API_BRIDGE_SERVER_HEADERS_TIMEOUT_MS` | `60000` | រយៈពេលសម្រាប់ផ្ញើបឋមកថាចម្លើយតាមរយៈ bridge។ | | `API_BRIDGE_SERVER_KEEPALIVE_TIMEOUT_MS` | `5000` | ពេលអស់កំណត់សម្រាប់ភាពទំនេរនៃការរក្សាការតភ្ជាប់របស់ bridge។ | | `API_BRIDGE_SERVER_SOCKET_TIMEOUT_MS` | `0` | ពេលអស់កំណត់សម្រាប់ 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) ដើម្បីការពារការប្រែប្រួលទៅមករវាងស្ថានភាពសកម្ម/មានកំហុសនៅក្នុងផ្ទាំងគ្រប់គ្រង។ ប្រើតម្លៃ 8000ms ជំនួស ប្រសិនបើតម្លៃមិនត្រឹមត្រូវ (<1000) ឬមិនមែនជាលេខ។ | | `OMNIROUTE_RELAY_FETCH_TIMEOUT_MS` | `25000` | អស់ពេលសម្រាប់ការទាញយកជាក់លាក់របស់ 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` | អស់ពេលសំណើ native wreq-js (`claudeTlsClient.ts`)។ | | `OMNIROUTE_CLAUDE_TLS_GRACE_MS` | `10000` | រយៈពេលអនុគ្រោះសម្រាប់ hard-deadline ដាច់ខាតរបស់ JS ដែលបន្ថែមលើអស់ពេល native។ | | `OMNIROUTE_PPLX_TLS_TIMEOUT_MS` | `30000` | អស់ពេលសំណើ native wreq-js (`perplexityTlsClient.ts`)។ | | `OMNIROUTE_PPLX_TLS_GRACE_MS` | `10000` | រយៈពេលអនុគ្រោះសម្រាប់ hard-deadline ដាច់ខាតរបស់ JS ដែលបន្ថែមលើអស់ពេល native។ | | `OMNIROUTE_PPLX_SEARCH_HINT` | `0` (off) | បន្ថែម "You have built-in web search. Answer questions directly using search results." ទៅក្នុងសារប្រព័ន្ធរបស់អ្នកហៅ (`perplexity-web/protocol.ts`)។ បិទតាមលំនាំដើម — Perplexity នៅតែស្វែងរក ហើយប្រយោគនេះលេចចូលក្នុងចម្លើយជាការអធិប្បាយមេតា សម្រាប់កម្មវិធីអតិថិជនសរសេរកូដ។ កំណត់ជា `1`/`true`/`yes`/`on` ដើម្បីបើកដំណើរការវិញ។ | | `OMNIROUTE_GROK_TLS_TIMEOUT_MS` | `60000` | រយៈពេលអស់សុពលភាពសំណើរ native wreq-js (`grokTlsClient.ts`)។ | | `OMNIROUTE_GROK_TLS_GRACE_MS` | `10000` | រយៈពេលអនុគ្រោះសម្រាប់កាលកំណត់រឹងរបស់ JS ដែលបន្ថែមពីលើរយៈពេលអស់សុពលភាព native។ | | `OMNIROUTE_NOTION_TLS_TIMEOUT_MS` | `30000` | រយៈពេលអស់សុពលភាពសំណើរ native wreq-js (`notionTlsClient.ts`)។ `notion-web` បង្កើនវាតាមសំណើនីមួយៗដល់ `180000` សម្រាប់ការបង្កើតមាតិកាយូរ។ | | `OMNIROUTE_NOTION_TLS_GRACE_MS` | `10000` | រយៈពេលអនុគ្រោះសម្រាប់កាលកំណត់រឹងរបស់ JS ដែលបន្ថែមពីលើរយៈពេលអស់សុពលភាព native។ | | `OMNIROUTE_BROWSER_POOL` | `on` | សំណុំកម្មវិធីរុករក Playwright ដែលប្រើរួមគ្នា សម្រាប់ការជជែកតាមគេហទំព័រដែលពឹងផ្អែកលើកម្មវិធីរុករក និងខូគី (`browserPool.ts`)។ កំណត់ជា `off` ដើម្បីបិទ។ | | `OBSCURA_BIN` | `auto-detect` | ផ្លូវទៅកាន់ឯកសារប្រតិបត្តិ `obscura` ដែលប្រើជាម៉ាស៊ីនចម្បងដោយសំណុំកម្មវិធីរុករក និងអ្នកប្រតិបត្តិ Cloudflare Playground (`open-sse/services/obscura.ts`)។ នៅពេលមិនបានកំណត់ វានឹងរកឃើញដោយស្វ័យប្រវត្តិពី PATH របស់ប្រព័ន្ធ។ | | `OBSCURA_CDP_ENDPOINT` | _(unset)_ | ចង្អុលទៅ Obscura ដែលកំពុងដំណើរការរួច (`http://host:port`) ជំនួសឱ្យការបង្កើតថ្មីមួយ; ម៉ូឌុលមិនគ្រប់គ្រងដំណើរការនោះទេ (`open-sse/services/obscura.ts`)។ | | `OBSCURA_PORT` | `random free port` | ច្រកជាក់លាក់សម្រាប់ `obscura serve` ដែលបានបង្កើត; ប្រសិនបើមិនបានកំណត់ នោះច្រកទំនេរមួយនឹងត្រូវបានជ្រើសរើសដោយស្វ័យប្រវត្តិ (`open-sse/services/obscura.ts`)។ | | `WEB_COOKIE_USE_BROWSER` | `0` | ជ្រើសសំណើជជែកតាម web-cookie ឱ្យប្រើផ្លូវដែលផ្អែកលើកម្មវិធីរុករក (`browserBackedChat.ts`); កំណត់ជា `1` ដើម្បីបើកប្រើ។ | | `KIMI_WEB_BASE_URL` | `https://www.kimi.ai` | URL មូលដ្ឋានសម្រាប់ executor របស់ Kimi Web (Connect-RPC របស់ kimi.ai អន្តរជាតិ) (`kimi-web.ts`); ប្តូរតម្លៃនេះតែសម្រាប់ endpoint របស់ mirror/proxy ប៉ុណ្ណោះ។ | | `KIMI_WEB_CHAT_URL` | `/apiv2/kimi.gateway.chat.v1.ChatService/Chat` | Endpoint ជជែកពេញលេញសម្រាប់ executor របស់ Kimi Web (`kimi-web.ts`)។ | | `OMNIROUTE_LOGIN_BROWSER_PATH` | _(auto-detected)_ | ផ្លូវទៅកាន់ executable របស់ Chrome/Edge ប្រព័ន្ធ សម្រាប់ការចូលប្រើ Adobe Firefly តាមកម្មវិធីរុករកអន្តរកម្ម (`adobeFireflyBrowserLogin.ts`); បដិសេធការរកឃើញដោយស្វ័យប្រវត្តិតាមប្រព័ន្ធប្រតិបត្តិការ។ | | `OMNIROUTE_STANDALONE_DIR` | _.build/ standalone output_ | ការបដិសេធនៅពេល build សម្រាប់ថតលទ្ធផល standalone ដែលជំហាន colocation បន្ទាប់ពី build ប្រើប្រាស់ (`scripts/build/colocate-standalone.mjs`); ជាឧបករណ៍ build មិនមែន runtime ទេ។ | ការព្យាយាមប្រើគោលដៅ Combo ទទួលមរតក timeout សំណើ upstream ដែលបានដោះស្រាយ (`FETCH_TIMEOUT_MS` ឬ `REQUEST_TIMEOUT_MS` នៅពេលវាផ្តល់តម្លៃលំនាំដើមសម្រាប់ fetch)។ កំណត់ `targetTimeoutMs` នៅក្នុង combo, លំនាំដើមរបស់ combo ឬការបដិសេធរបស់ provider តែដើម្បីធ្វើឱ្យ fallback របស់ combo លឿនជាងមុនប៉ុណ្ណោះ; តម្លៃដែលលើសពី timeout upstream បច្ចុប្បន្ន នឹងត្រូវកំណត់អតិបរមាត្រឹម timeout upstream។ `comboTimeoutMs` គឺជាថវិកាពេលវេលានាឡិកាជញ្ជាំងសរុបដាច់ដោយឡែក សម្រាប់ combo ទាំងមូលនៅទូទាំងគោលដៅ failover។ ទុកវាមិនកំណត់ ឬកំណត់ជា `0` ដើម្បីបន្តការធ្វើអ迭ិគ្មានដែនកំណត់ (ការបញ្ឈប់ការជាប់គាំងរយៈពេល 10 នាទី ដែលបានកំណត់រឹងនៅក្នុង `comboPredicates.ts` នៅតែអនុវត្ត)។ តម្លៃវិជ្ជមាននឹងជំនួសបណ្តាញសុវត្ថិភាពនោះ សម្រាប់ combo។ រក្សា `comboTimeoutMs` ឱ្យវែងជាង `targetTimeoutMs` ដើម្បីឱ្យ failover នៅតែមានពេលវេលាគ្រប់គ្រាន់ បន្ទាប់ពីគោលដៅដំបូងដំណើរការយឺត។ ### កម្រិត 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` | ឧបករណ៍បំបែកកម្រិត Provider៖ ចំនួនបរាជ័យមុនពេល Provider មូលដ្ឋានទាំងមូលចូលទៅក្នុងរយៈពេលផ្អាក។ | | `OMNIROUTE_PROVIDER_BREAKER_LOCAL_FAILURE_WINDOW_MS` | `300000` | `open-sse/config/constants.ts` | ឧបករណ៍បំបែកកម្រិត Provider៖ បង្អួចរាប់ចំនួនបរាជ័យដែលរំកិល (ms) សម្រាប់ Provider មូលដ្ឋាន។ | | `OMNIROUTE_PROVIDER_BREAKER_LOCAL_COOLDOWN_MS` | `60000` | `open-sse/config/constants.ts` | ឧបករណ៍បំបែកកម្រិត Provider៖ រយៈពេលផ្អាក (ms) នៅពេលឈានដល់កម្រិតកំណត់របស់ Provider មូលដ្ឋាន។ | | `OMNIROUTE_API_KEY_COOLDOWN_MS` | `60000` | `open-sse/services/apiKeyRotator.ts` | រយៈពេលផ្អាក (ms) សម្រាប់ API key នីមួយៗ ដែលអនុវត្តដោយការប្ដូរ API key ច្រើន នៅពេល upstream 429 មិនមាន `Retry-After` (#14573)។ តម្លៃដែលមិនវិជ្ជមាន ឬមិនមែនជាលេខ នឹងត្រឡប់ទៅប្រើតម្លៃលំនាំដើម។ | | `OMNIROUTE_AVALANCHE_PROTECTION_ENABLED` | `false` | `open-sse/services/accountFallback/antiAvalanche.ts` | ឧបករណ៍ការពារប្រឆាំង avalanche ដែលត្រូវបើកដោយជ្រើសរើស៖ មានតែ `true` ដែលបានបញ្ជាក់ច្បាស់លាស់ប៉ុណ្ណោះ ទើបបើកវា។ នៅពេលបើក 429 ដែលបញ្ជាក់ដែនកំណត់ tokens ក្នុងមួយនាទី (និង 400 ដោយសារបរិបទលើសកំណត់) នឹងបញ្ឈប់ការបរាជ័យបន្តជាបន្តបន្ទាប់ឆ្លងកាត់ key ដែលនៅសល់របស់ Provider។ 429 ដែលកូតាត្រូវបានប្រើអស់ នឹងបន្តការបរាជ័យឆ្លងកាត់ ទោះបី prompt មានទំហំធំប៉ុណ្ណាក៏ដោយ ហើយ HTTP 413 មិនត្រូវបានប៉ះពាល់ទេ (វានៅតែរក្សាឥរិយាបថ #13350 ក្នុងការសាកល្បងម្ដងទៀតជាមួយគណនីផ្សេង)។ | | `OMNIROUTE_AVALANCHE_BURST_COOLDOWN_MS` | `60000` | `open-sse/services/accountFallback/antiAvalanche.ts` | រយៈពេលផ្អាកការចាក់សោម៉ូដែល (ms) ដែលអនុវត្តនៅពេលឧបករណ៍ការពារដំណើរការ ជំនួសឱ្យការចាក់សោដែលកើនឡើងតាមលំដាប់។ ការកំណត់ឡើងវិញពី upstream ដែលយូរជាងនេះ នឹងមានអាទិភាពជានិច្ច។ តម្លៃដែលមិនវិជ្ជមាន ឬមិនមែនជាលេខ នឹងត្រឡប់ទៅប្រើតម្លៃលំនាំដើម។ | | `PIN_DROP_BACKOFF_LEVEL` | `2` | `open-sse/services/combo.ts` | ជម្រៅ backoff ដែល Provider របស់ context-cache pin ត្រូវបានចាត់ទុកថាមិនមានសុខភាពល្អយូរអង្វែង ហើយ pin ត្រូវបានដកចេញសម្រាប់ការបរាជ័យឆ្លងកាត់។ | | `PIN_DROP_GRACE_MS` | `20000` | `open-sse/services/combo.ts` | បង្អួចការពារការប្រែប្រួលញឹកញាប់ (ms) ដែលអនុញ្ញាតឱ្យមានរយៈពេលផ្អាកបណ្តោះអាសន្នខ្លីៗ មុនពេលដក context-cache pin ចេញ។ | ### សេណារីយ៉ូ | សេណារីយ៉ូ | ការកំណត់រចនាសម្ព័ន្ធ | | ------------------------------------ | ------------------------------------------------------ | | **ការបង្កើតកូដដែលដំណើរការយូរ** | `REQUEST_TIMEOUT_MS=900000` (15 min) | | **កំណត់រយៈពេលជីវិតសរុបរបស់ stream** | `STREAM_ACTIVE_TIMEOUT_MS=1260000` (21 min) | | **បរាជ័យរហ័សសម្រាប់ production API** | `API_BRIDGE_PROXY_TIMEOUT_MS=10000` | | **ម៉ូដែលដែលគិតពិចារណាយូរ** | `STREAM_IDLE_TIMEOUT_MS=300000` (5 min between chunks) | --- ## 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` | ផ្លូវឯកសារកំណត់ហេតុ (ទាក់ទងនឹងថត root របស់គម្រោង ឬ `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 ម៉ោង) | អាយុអតិបរមាសម្រាប់កំណត់ត្រាកំណត់ហេតុសំណើសកម្មដែលគ្មានម្ចាស់ មុនពេលសម្អាតក្នុងអង្គចងចាំ។ | | `MAX_PENDING_DETAILS` | `5000` | ចំនួនព័ត៌មានលម្អិតដែលកំពុងរង់ចាំអតិបរមា (ចំនួនគត់វិជ្ជមាន)៖ កម្រិតចំនួនសម្រាប់ការស្កេនសម្អាត; កម្រិតបៃ/ផែនទីសម្រាប់ការបញ្ចូល។ | | `CALL_LOG_PIPELINE_CAPTURE_STREAM_CHUNKS` | `false` | រក្សាទុកផ្នែកលំហូរទិន្នន័យនៅក្នុងវត្ថុបុរាណរបស់ pipeline នៅពេល `call_log_pipeline_enabled=true`។ ជាជម្រើសចូលរួម (`true`) — បិទតាមលំនាំដើម ដើម្បីសន្សំទំហំថាស។ | | `CALL_LOG_PIPELINE_MAX_SIZE_KB` | `512` | ទំហំអតិបរមារបស់វត្ថុបុរាណកំណត់ហេតុការហៅរបស់ pipeline គិតជា KB នៅពេល `call_log_pipeline_enabled=true`។ | | `PROXY_LOGS_TABLE_MAX_ROWS` | `100000` | ចំនួនជួរដេកអតិបរមាក្នុងតារាង SQLite `proxy_logs` មុនពេលសម្អាតចេញ។ | | `PROXY_LOG_INCLUDE_IPS` | `false` | រួមបញ្ចូលអាសយដ្ឋាន IP របស់ម៉ាស៊ីនភ្ញៀវ/ច្រកចេញ និងបុព្វបទគណនីក្នុងកំណត់ហេតុកុងសូល `[ProxyEgress]`។ កំណត់ត្រាកំណត់ហេតុប្រូកស៊ីក្នុងផ្ទាំងគ្រប់គ្រង/មូលដ្ឋានទិន្នន័យ នៅតែរក្សាទុកព័ត៌មានលម្អិតពេញលេញ។ | | `PROXY_LOG_FIRST_CHUNK_TIMING` | `false` | កំណត់ជា `"true"` ឬ `"1"` ដើម្បីកត់ត្រា `first_chunk_ms` (ចាប់ពីការចាប់ផ្ដើមផ្ញើ រហូតដល់បៃដំបូងដែលមានប្រយោជន៍របស់តួទិន្នន័យ) នៅលើជួរដេកកំណត់ហេតុប្រូកស៊ី។ វារុំតួទិន្នន័យ upstream នីមួយៗក្នុងស្ទ្រីម passthrough ដែលពន្យារពេល ហើយធ្វើបច្ចុប្បន្នភាពជួរដេក នៅពេលបៃមកដល់។ ត្រូវបានបិទតាមលំនាំដើម ដើម្បីឱ្យការឆ្លើយតបឆ្លងកាត់ដោយមិនមានការកែប្រែ។ | | `APP_LOG_ROTATION_CHECK_INTERVAL_MS` | `60000` (1 min) | ភាពញឹកញាប់ដែល `src/lib/logRotation.ts` ពិនិត្យទំហំឯកសារកំណត់ហេតុសកម្មឡើងវិញ។ | | `CHAT_LOG_TEXT_LIMIT` | `65536` | ប្រវែងខ្សែអក្សរអតិបរមាដែលរក្សាទុកក្នុងវត្ថុបុរាណកំណត់ហេតុជជែក (លំនាំដើម 64 KB)។ | | `CHAT_LOG_ARRAY_TAIL_ITEMS` | `128` | ចំនួនធាតុអារេដែលរក្សាទុកពីផ្នែកចុងក្រោយ នៅពេលកាត់ត payload កំណត់ហេតុជជែក។ | | `CHAT_LOG_MAX_DEPTH` | `6` | ជម្រៅនៃការដាក់ជាន់គ្នាអតិបរមា មុនពេល payload កំណត់ហេតុជជែកត្រូវបានកាត់ត។ | | `CHAT_LOG_MAX_OBJECT_KEYS` | `80` | ចំនួនសោវត្ថុអតិបរមាដែលរក្សាទុកក្នុង payload កំណត់ហេតុជជែក (0 = គ្មានកំណត់)។ | | `CHAT_LOG_MAX_BODY_KB` | `1024` | ទំហំតួទិន្នន័យសំណើ/ការឆ្លើយតបទាំងមូល (KB) មុនពេលវាត្រូវបានជំនួសដោយសេចក្ដីសង្ខេបខ្លី ជំនួសឱ្យច្បាប់ចម្លងពេញលេញ។ បង្កើនតម្លៃនេះ ប្រសិនបើការសន្ទនារបស់ភ្នាក់ងារដែលមានប្រវែងវែង បង្ហាញកន្លែងដាក់ជំនួសជាសារពិតក្នុងផ្ទាំងគ្រប់គ្រង។ | | `CHAT_DEBUG_FILE` | `false` | នៅពេលជា true, `serializeArtifactForStorage` រំលងការកាត់តផ្អែកលើទំហំ។ សម្រាប់ការបំបាត់កំហុសតែប៉ុណ្ណោះ។ | --- ## 17. ការបង្កើនប្រសិទ្ធភាពអង្គចងចាំ | Variable | Default | Description | | -------------------------------------------- | ----------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `OMNIROUTE_HEAP_DIAGNOSTICS_ENABLED` | `0` (បិទ) | កំណត់ជា `1` ដើម្បីកត់ត្រាម៉ែត្រសម្ពាធ heap របស់ V8 ពី `src/lib/healthzLag.ts`។ កំណត់ត្រាទំហំ និងចំនួនកំពុងដំណើរការ ប៉ុន្តែមិនដែលកត់ត្រាមាតិកាសំណើ ដានតាមដាន ឬ snapshot របស់ heap ទេ។ វាដំណើរការនៅក្នុងកម្មវិធីកត់ត្រាការជាប់គាំង event loop ដូច្នេះ `OMNIROUTE_EVENT_LOOP_STALL_THRESHOLD_MS=0` ក៏បិទវាផងដែរ។ | | `OMNIROUTE_HEAP_DIAGNOSTICS_THRESHOLD_MB` | `900` | កម្រិតវិជ្ជមានសម្រាប់ heapUsed (MiB) ដែលបង្កឱ្យមានកំណត់ត្រាវិនិច្ឆ័យដែលបានជ្រើសរើសបើក។ តម្លៃមិនត្រឹមត្រូវនឹងប្រើ 900 MiB; សារអំពី heap ខ្ពស់ត្រូវបានកំណត់ត្រឹមម្តងរៀងរាល់ 60 វិនាទី។ | | `OMNIROUTE_MEMORY_MB` | _auto_ (ម៉ាស៊ីនផ្ទាល់); **`1024` ក្នុង Docker image** | កម្រិត heap របស់ V8 (MB) ដែល **ណែនាំ** សម្រាប់ Docker/standalone។ នៅពេលមិនបានកំណត់ វាត្រូវបានកំណត់តម្លៃតាមប្រព័ន្ធដោយស្វ័យប្រវត្តិ (~35% នៃ RAM ប្រព័ន្ធ ដោយកំណត់ក្នុងចន្លោះ `[512, 4096]`); `512` គឺជាតម្លៃអប្បបរមាតែពេលមិនអាចអានអង្គចងចាំសរុបបានប៉ុណ្ណោះ។ នៅលើ `run-standalone.mjs` (Docker CMD) តម្លៃដែលបានកំណត់យ៉ាងច្បាស់នឹងត្រូវបន្ថែមជា `--max-old-space-size` ហើយ **មានអាទិភាព** លើ heap flag ដែលផ្ទុយគ្នានៅក្នុង NODE_OPTIONS (V8 ប្រើ flag ចុងក្រោយ)។ `omniroute serve` នៅតែផ្តល់អាទិភាពដល់ heap NODE_OPTIONS ដែលមានស្រាប់ (#5238)។ កុំកំណត់ទាំងពីរជាលេខផ្សេងគ្នា — ដំណើរការនឹងកត់ត្រាការព្រមានដែលបញ្ជាក់តម្លៃទាំងពីរ និងតម្លៃដែលឈ្នះ។ **Docker image ផ្លូវការតែងតែកំណត់ជា `1024` ដូច្នេះការកំណត់តម្លៃតាមប្រព័ន្ធនឹងមិនដំណើរការនៅទីនោះទេ។** Coding-agent `/v1/responses` ត្រូវការ `8192`–`12288` បូកនឹងទំហំទំនេរសម្រាប់ cgroup — សូមមើល [Docker Guide — RAM ពេលដំណើរការ](../guides/DOCKER_GUIDE.md#runtime-ram-for-coding-agents)។ | | `OMNIROUTE_RSS_PRESSURE_MB` | _auto_ (`max(3072, 2 × OMNIROUTE_MEMORY_MB)`; បិទនៅពេល `OMNIROUTE_MEMORY_MB` មិនបានកំណត់) | `open-sse/utils/resourcePressure.ts` | ហ្វុយស៍ RSS របស់ដំណើរការដាច់ខាត (MB) សម្រាប់អង្គចងចាំ native/external ដែល V8 `heapUsed` មិនអាចមើលឃើញបាន; នៅពេលលើសពីនេះ សំណើថ្មីនឹងទទួលបាន 503 `resource_pressure`។ RSS កម្រនឹងធ្លាក់ចុះបន្ទាប់ពីមានការកើនឡើងភ្លាមៗ ដូច្នេះគួរប្រើវារួមជាមួយ `OMNIROUTE_PRESSURE_SELF_RESTART`។ | | `PROMPT_CACHE_MAX_SIZE` | `50` | ចំនួនធាតុ system prompt ដែលអាចរក្សាទុកក្នុងឃ្លាំងសម្ងាត់បានអតិបរមា។ | | `PROMPT_CACHE_MAX_BYTES` | `2097152` (2 MB) | ទំហំអតិបរមាសរុបរបស់ឃ្លាំងសម្ងាត់ prompt។ | | `PROMPT_CACHE_TTL_MS` | `300000` (5 min) | TTL របស់ធាតុក្នុងឃ្លាំងសម្ងាត់ prompt។ | | `SEMANTIC_CACHE_MAX_SIZE` | `100` | ចំនួនអតិបរមានៃចម្លើយ temperature=0 ដែលបានរក្សាទុកក្នុងឃ្លាំងសម្ងាត់។ | | `SEMANTIC_CACHE_MAX_BYTES` | `4194304` (4 MB) | ទំហំអតិបរមាសរុបរបស់ឃ្លាំងសម្ងាត់ semantic។ | | `SEMANTIC_CACHE_TTL_MS` | `1800000` (30 min) | TTL របស់ធាតុក្នុងឃ្លាំងសម្ងាត់ semantic។ | | `OMNIROUTE_SEMANTIC_CACHE_PRUNE_INTERVAL_MS` | `1800000` (30 min) | ចន្លោះពេលសម្អាត SQLite។ `0` បិទការដំណើរការនៅពេលចាប់ផ្ដើម និងតាមកាលកំណត់។ តម្លៃផ្សេងទៀតដែលតូចជាង `60000` នឹងត្រឡប់ទៅប្រើតម្លៃលំនាំដើម។ តម្លៃធំជាង `2147483647` ms នឹងត្រូវកំណត់ត្រឹមរយៈពេលពន្យារអតិបរមារបស់កម្មវិធីកំណត់ពេលក្នុង Node ដើម្បីជៀសវាងការលើសកម្រិត និងការស្ទង់រៀងរាល់ 1ms។ ការដំណើរការដំបូងកើតឡើងបន្ទាប់ពី 1 វិនាទី។ កម្មវិធីកំណត់ពេលមិនរារាំងដំណើរការត្រូវបានកំណត់ ហើយការដំណើរការមិនដែលជាន់គ្នាឡើយ។ | | `OMNIROUTE_SEMANTIC_CACHE_PRUNE_BATCH_SIZE` | `2000` | ចំនួនជួរដេកក្នុង SQLite prune DELETE នីមួយៗ កំណត់ក្នុងចន្លោះ `[100, 50000]`; ផ្តល់ឱកាសឱ្យ event loop ដំណើរការរវាង batch នីមួយៗ។ | | `OMNIROUTE_SEMANTIC_CACHE_PRUNE_MAX_BATCHES` | `50` | ថវិកា DELETE batch រួមក្នុងមួយដំណើរការ សម្រាប់ការឆ្លងកាត់ expiry និង row-cap ជាជម្រើស កំណត់ក្នុងចន្លោះ `[1, 10000]`។ បញ្ជីការងារដែលនៅសល់នឹងបន្តនៅក្នុងការដំណើរការលើកក្រោយ។ | | `OMNIROUTE_SEMANTIC_CACHE_MAX_ROWS` | `0` | កម្រិតជួរដេក SQLite ជាជម្រើស (`0` = គ្មាន)។ បន្ទាប់ពីលុប `expires_at <=` ត្រាពេលវេលា ISO នៅពេលចាប់ផ្តើមដំណើរការ នឹងដកជួរដេកចាស់បំផុតតាម `created_at` បន្ទាប់មក `rowid` រួមទាំងជួរដេកដែលនៅសកម្ម ដោយអនុវត្តតាមថវិកា batch រួម។ ចំនួនត្រូវបានកាត់ឱ្យទៅជាចំនួនគត់ (រហូតដល់កម្រិតចំនួនគត់ដែលមានសុវត្ថិភាព)។ តម្លៃទទេ មិនមែនជាលេខ មិនកំណត់ ឬអវិជ្ជមាន សម្រាប់អថេរ prune ទាំងបួន នឹងត្រឡប់ទៅប្រើតម្លៃលំនាំដើមរបស់វា; ប្រភាគត្រូវបានបង្គត់ចុះ។ ការធ្វើ prune មិនផ្លាស់ប្តូរ TTL, memory LRU ឬឥរិយាបថ vector-cache ទេ។ | | `OMNIROUTE_CORPUS_CACHE_SIZE` | `5` | ឫស local-corpus ដែលរក្សាទុកលិបិក្រមក្នុងអង្គចងចាំដែលកំពុងដំណើរការក្នុងពេលតែមួយ (`src/lib/localCorpus/configured.ts`)។ LRU៖ នៅពេលដល់កម្រិត លិបិក្រមរបស់ឫសដែលត្រូវបានប្រើប្រាស់យូរបំផុតនឹងត្រូវដកចេញ ហើយបង្កើតឡើងវិញនៅពេលសំណួរបន្ទាប់របស់វា។ កំណត់អប្បបរមាត្រឹម `1`; តម្លៃដែលមិនមែនជាលេខនឹងត្រឡប់ទៅប្រើតម្លៃលំនាំដើម។ | | `STREAM_HISTORY_MAX` | `50` | ចំនួនអតិបរមានៃព្រឹត្តិការណ៍ stream ថ្មីៗនៅក្នុង buffer ទិដ្ឋភាព live របស់ 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` | ទំហំថូខឹនបន្ថែមដែលបានរក្សាទុក នៅពេលតាមដានកូតាប្រើប្រាស់។ | ### ប្រវែងបរិបទតាមអ្នកផ្តល់សេវា (`CONTEXT_LENGTH_`) `open-sse/services/contextManager.ts` (`getEnvOverride()` / `resolveTokenLimit()`) ក៏អានទម្រង់ **តាមអ្នកផ្តល់សេវា** ដែលឈ្មោះរបស់វាត្រូវបានបង្កើតពីលេខសម្គាល់អ្នកផ្តល់សេវានៅពេលដំណើរការ ដូច្នេះវាមិនអាច រាយជាជួរមួយៗនៅក្នុងតារាងខាងលើ ឬក្នុង `.env.example` បានទេ។ **ឈ្មោះ។** `CONTEXT_LENGTH_` ដែល `` គឺជាលេខសម្គាល់អ្នកផ្តល់សេវាដែលបម្លែងជាអក្សរធំ ហើយ តួអក្សរទាំងអស់ដែលមិនមែនជា `A-Z` / `0-9` ត្រូវបានជំនួសដោយ `_`។ លេខសម្គាល់អ្នកផ្តល់សេវាគឺជាលេខសម្គាល់ស្តង់ដារ បន្ទាប់ពីដោះស្រាយឈ្មោះក្លែងក្លាយ (ផ្នែក `provider` នៃខ្សែអក្សរ `provider/model` បន្ទាប់ពីដោះស្រាយឈ្មោះក្លែងក្លាយខ្លី)។ ថ្នាំងដែលត្រូវគ្នាជាមួយ OpenAI ឬ Anthropic ផ្ទាល់ខ្លួនប្រើលេខសម្គាល់ថ្នាំងដែលបានបង្កើត ដូច្នេះ UUID គឺជាផ្នែកមួយនៃឈ្មោះអថេរ។ តម្លៃត្រូវតែជាចំនួនគត់វិជ្ជមាននៃចំនួនថូខឹន; អ្វីផ្សេងទៀត (ទទេ, `0`, អវិជ្ជមាន, មិនមែនជាលេខ) នឹងត្រូវបានមិនអើពើ ហើយការដោះស្រាយនឹងបន្តទៅជំហានបន្ទាប់។ | លេខសម្គាល់អ្នកផ្តល់សេវា | ឈ្មោះអថេរ | | ----------------------------------------------------------- | -------------------------------------------------------------------------- | | 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` (ការបដិសេធបរិស្ថានសកល)។ 3. បង្អួចតាមម៉ូដែល៖ ការបដិសេធបរិបទដែលបានរក្សាទុក (កំណត់នៅក្នុងផ្ទាំងគ្រប់គ្រង ឬបិទជាប់ដោយស្វ័យប្រវត្តិដោយ អ្នកសម្របសម្រួលការស្វែងរក សូមមើល `CONTEXT_WINDOW_RECONCILE_INTERVAL`) បើមិនដូច្នោះទេ ប្រើតម្លៃកាតាឡុកដែលបានធ្វើសមកាលកម្ម / models.dev។ 4. `defaultContextLength` របស់បញ្ជីចុះបញ្ជីអ្នកផ្តល់សេវា។ 5. ហេយូរីស្ទិកតាមឈ្មោះម៉ូដែល (`claude` 200000, `gemini` 1000000, `gpt` / `o1` / `o3` / `o4` / `codex` 400000)។ 6. តម្លៃលំនាំដើមដែលមានស្រាប់តាមអ្នកផ្តល់សេវា បន្ទាប់មក `128000`។ ជំហានបរិស្ថានទាំងពីរអនុវត្តចំពោះ **អ្នកផ្តល់សេវាទាំងមូល**៖ គ្រប់ម៉ូដែលរបស់អ្នកផ្តល់សេវានោះទទួលបានដែនកំណត់ដូចគ្នា ហើយវាមានអាទិភាពលើការបដិសេធតាមម៉ូដែលនៅក្នុងផ្ទាំងគ្រប់គ្រង។ នៅពេលមានតែម៉ូដែលមួយរបស់អ្នកផ្តល់សេវាប៉ុណ្ណោះដែល ត្រូវការបង្អួចខុសគេ សូមប្រើការបដិសេធតាមម៉ូដែលនៅក្នុងផ្ទាំងគ្រប់គ្រងជំនួស។ **វិសាលភាព។** ខ្សែសង្វាក់នេះគ្រប់គ្រងការត្រួតពិនិត្យបង្អួចបរិបទនៅពេលស្នើសុំ (ការបដិសេធ `context_length_exceeded` / "Input exceeds context window" នៅក្នុង `open-sse/handlers/chatCore.ts`) ថវិកាបង្រួមប្រូមត៍ និងដែនកំណត់បរិបទរបស់បន្សំ។ តម្លៃ `context_length` ដែលផ្សព្វផ្សាយដោយ `GET /v1/models` អាចនៅតែមកពីទិន្នន័យមេតាកាតាឡុក ឬបញ្ជីចុះឈ្មោះ ហើយមិនមានការធានាថានឹងឆ្លុះបញ្ចាំងពីការបដិសេធបរិស្ថានទេ។ **ឧទាហរណ៍។** អ្នកផ្តល់សេវាមួយដែលម៉ូដែលរបស់វាទទួលយកបង្អួច 1,050,000 ថូខឹន ខណៈកាតាឡុករាយការណ៍ 128,000៖ ```dotenv CONTEXT_LENGTH_AGENTROUTER=1050000 ``` ចាប់ផ្តើមម៉ាស៊ីនមេឡើងវិញបន្ទាប់ពីផ្លាស់ប្តូរ៖ តម្លៃនេះត្រូវបានអានពីបរិស្ថានរបស់ដំណើរការម៉ាស៊ីនមេ។ នៅលើ **កម្មវិធីលើកុំព្យូទ័រ** ម៉ាស៊ីនមេដំណើរការជាដំណើរការកូន ហើយមិនអាចមើលឃើញអថេរប្រព័ន្ធដែលបានកំណត់ បន្ទាប់ពីកម្មវិធីត្រូវបានបើកទេ; ដាក់បន្ទាត់នេះនៅក្នុងឯកសារ `.env` ដែលកម្មវិធីផ្ទុក (លំដាប់ស្វែងរកនៅក្នុង [មគ្គុទ្ទេសក៍ Electron៖ ការស្វែងរកឯកសារបរិស្ថាន](../guides/ELECTRON_GUIDE.md#environment-file-lookup)) បន្ទាប់មកបិទកម្មវិធីទាំងស្រុង ហើយបើកដំណើរការវាឡើងវិញ។ ### ការបង្រួម | អថេរ | លំនាំដើម | ការពិពណ៌នា | | ------------------------------------- | -------- | ------------------------------------------------------------------------------------------------------------------------------------------- | | `OMNIROUTE_RTK_TRUST_PROJECT_FILTERS` | unset | ជឿទុកចិត្តលើ `.rtk/filters.json` របស់គម្រោង ដោយមិនចាំបាច់មានហាស `.rtk/trust.json`។ ប្រើតែក្នុងការអភិវឌ្ឍមូលដ្ឋានដែលមានការគ្រប់គ្រងប៉ុណ្ណោះ។ | ### ម៉ាស៊ីនអង្គចងចាំ (ផែនការ 21) ### តម្លៃ event-loop នៃអង្គចងចាំ ជំនាញ និងការធ្វើឱ្យថូខឹនស្រស់ឡើងវិញ (#10349) OmniRoute គឺជា **ដំណើរការ Node តែមួយ**។ ការដកស្រង់/ទាញយកអង្គចងចាំ ការបញ្ចូលជំនាញ និងការធ្វើឱ្យថូខឹនរបស់អ្នកផ្តល់សេវាស្រស់ឡើងវិញ ដំណើរការនៅលើ **event loop** ដូចគ្នានោះ ជាមួយ `GET /healthz` និងផ្ទាំងគ្រប់គ្រង។ ពួកវាមិនមែនជាខ្សែស្រឡាយ worker ទេ។ | ការងារ | កូដ | លំនាំដើម | ការគ្រប់គ្រងដោយប្រតិបត្តិករ | | --------------------------- | ---------------------------------- | ---------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------- | | ការទាញយក / ទទួលយកអង្គចងចាំ | `src/lib/memory/` | Dashboard **memoryEnabled** (បើកតាមលំនាំដើម) | បិទនៅ **ការកំណត់ → អង្គចងចាំ**។ មិនមាន environment kill switch ដាច់ដោយឡែកទេ ក្រៅពីការបិទមុខងារនៅក្នុងការកំណត់។ | | ការបញ្ចូលជំនាញ | `src/lib/skills/injection.ts` | Dashboard **skillsEnabled** (បើកតាមលំនាំដើម) | បិទនៅ **ការកំណត់ → អង្គចងចាំ/ជំនាញ** (`skillsEnabled`)។ ប៊ូតុងកំណត់ Sandbox ខាងក្រោម គ្រាន់តែកំណត់ការប្រតិបត្តិបន្ទាប់ពីការបញ្ចូលត្រូវបានបើករួចប៉ុណ្ណោះ។ | | ការធ្វើឱ្យសញ្ញាសម្ងាត់ស្រស់ | `src/sse/services/tokenRefresh.ts` | បើកសម្រាប់អ្នកផ្តល់សេវា OAuth/web ដែលបានភ្ជាប់ | ផ្តាច់អ្នកផ្តល់សេវា ឬទុកឱ្យសញ្ញាសម្ងាត់នៅមានសុពលភាព; បច្ចុប្បន្នមិនមាន `TOKEN_REFRESH=0` env ទេ។ | ប្រសិនបើ `/healthz` យឺតនៅលើម៉ាស៊ីនដែលមិនសូវមានសកម្មភាព សូមបិទ memory + skills ជាមុនសិន បន្ទាប់មកពិនិត្យមើលការផ្ទុក catalog/compression (#10303, #9685)។ មុខងារទាំងនេះបញ្ចេញការគ្រប់គ្រងនៅចំណុច `await` ប៉ុន្តែនៅតែប្រកួតប្រជែងគ្នាប្រើ thread តែមួយ។ ប៊ូតុងកំណត់សម្រាប់ស្រទាប់ embedding, vector store និង reranking របស់ប្រព័ន្ធអង្គចងចាំអចិន្ត្រៃយ៍ (`src/lib/memory/`)។ | Variable | លំនាំដើម | សេចក្តីពិពណ៌នា | | ------------------------------------ | --------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `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` | លេខសម្គាល់ឃ្លាំង HF សម្រាប់បំពង់ MiniLM មូលដ្ឋាន `@huggingface/transformers` ដែលត្រូវជ្រើសប្រើ (~23 MB int8, ~400 MB RAM)។ | | `MEMORY_STATIC_MODEL` | `minishlab/potion-base-8M` | លេខសម្គាល់ឃ្លាំង HF សម្រាប់កម្មវិធីបង្កប់តារាងស្វែងរក potion/Model2Vec ឋិតិវន្ត។ ទាញយកដោយពន្យារពេលទៅក្នុងថតឃ្លាំងសម្ងាត់។ | | `MEMORY_STATIC_CACHE_DIR` | `/embeddings` | ថតដែលប្រើសម្រាប់រក្សាទុកឯកសារម៉ូដែល 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 សម្រាប់ការទាញយកបែប hybrid FTS5 + vector (រូបមន្ត `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` | _(unset)_ | API key សម្រាប់ backend របស់ Notion (ប្រើដោយ known backend preset របស់ `genericBackend.ts`)។ | | `NOTION_API_URL` | `https://api.notion.com/v1` | URL មូលដ្ឋានសម្រាប់ Notion API (អាចបដិសេធបានសម្រាប់ជម្រើស Notion ដែល self-hosted)។ | | `OBSIDIAN_API_KEY` | _(unset)_ | API key សម្រាប់ backend របស់ Obsidian Vault (ប្រើដោយ known backend preset របស់ `genericBackend.ts`)។ | | `OBSIDIAN_API_URL` | `http://localhost:27123` | URL មូលដ្ឋានសម្រាប់ Obsidian Vault API (អាចបដិសេធបានសម្រាប់ vault ពីចម្ងាយ)។ | | `MEMORY_TYPED_DECAY_ENABLED` | `false` | master switch សម្រាប់ការថយចុះនៃ typed memory របស់ TV6។ **ត្រូវជ្រើសបើក (បិទតាមលំនាំដើម)** — sweep នឹង **លុប** អង្គចងចាំដែលបានថយចុះ។ នៅពេលបិទ `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` (disabled) | ចន្លោះពេល (វិនាទី) សម្រាប់ sweep តាមកាលកំណត់ដែលជាជម្រើស ក្នុង `src/lib/memory/typedDecay.ts`។ `0`/មិនកំណត់ = គ្មាន sweep តាមកាលកំណត់។ ត្រូវជ្រើសបើកពីរជាន់៖ ត្រូវការផងដែរ `MEMORY_TYPED_DECAY_ENABLED=true`។ | | `OMNIROUTE_STRICT_SYSTEM_PROVIDERS` | _(unset)_ | provider ids ដែលបំបែកដោយសញ្ញាក្បៀស (មិនប្រកាន់អក្សរធំតូច) ដែលទទួលយកសារ `system` **តែនៅ index 0 ប៉ុណ្ណោះ** (`src/lib/memory/injection.ts`)។ សម្រាប់ provider ទាំងនេះ ការបញ្ចូល memory នៅកណ្ដាល array ដែលមានសុវត្ថិភាពសម្រាប់ cache មិនមានសុវត្ថិភាពក្នុងការសន្ទនាច្រើនជុំទេ ដូច្នេះ memory នឹងត្រូវបានបញ្ចូលរួម/ដាក់នៅខាងមុខ ជាសារ system នាំមុខ។ តាមលំនាំដើម មានតែ `xiaomi-mimo`/`mimo` ប៉ុណ្ណោះ; អាចបន្ថែមសម្រាប់ endpoint ដែល self-hosted និងឆបគ្នាជាមួយ OpenAI (ឧ. Qwen3.5+/3.6) ដែល chat template របស់វាតម្រូវឱ្យមានលក្ខខណ្ឌសារ system តែមួយនៅខាងមុខដូចគ្នា។ | ### ឧទាហរណ៍ Docker សម្រាប់ RAM ទាប `128` គឺសម្រាប់ dashboard ប៉ុណ្ណោះ។ Coding agents នៅលើ 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. សមកាលកម្មតម្លៃ ការធ្វើសមកាលកម្មទិន្នន័យតម្លៃម៉ូដែលដោយស្វ័យប្រវត្តិពីប្រភពខាងក្រៅ។ | Variable | Default | Source File | Description | | ----------------------- | ------------- | ------------------------ | ------------------------------------------------ | | `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 | Variable | Default | Source File | Description | | ---------------------------- | ------------- | ------------------------------------------------------------------------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `ARENA_ELO_SYNC_ENABLED` | `true` | `src/shared/constants/featureFlagDefinitions.ts` | សមកាលកម្ម ELO តារាងចំណាត់ថ្នាក់ Arena AI តាមកាលកំណត់ ដែលអាចកំណត់រចនាសម្ព័ន្ធពីទង់មុខងាររបស់ផ្ទាំងគ្រប់គ្រង ឬប្រើ `false` ដើម្បីជ្រើសរើសមិនចូលរួម។ | | `MODELS_CATALOG_PREFIX_MODE` | `dual` | `src/shared/constants/featureFlagDefinitions.ts`, `src/app/api/v1/models/catalog.ts` | ទម្រង់បុព្វបទដែលប្រើសម្រាប់ model ids នៅក្នុង `GET /v1/models`។ `dual` ផ្សព្វផ្សាយទាំងបុព្វបទឈ្មោះកាត់ និងបុព្វបទ provider-id ពេញលេញសម្រាប់គ្រប់ម៉ូដែល (ភាពឆបគ្នាថយក្រោយ — ធ្វើឱ្យកាតាឡុកកើនប្រហែលពីរដង)។ `alias` បញ្ចេញ id មួយក្នុងមួយម៉ូដែល។ `canonical` បញ្ចេញតែបុព្វបទ provider-id ពេញលេញប៉ុណ្ណោះ (អ្នកផ្តល់សេវាដែល alias របស់ពួកគេជាអត្តសញ្ញាណ canonical រួចហើយ នឹងរក្សាទុកធាតុតែមួយរបស់ពួកគេ)។ Client អាចបដិសេធការកំណត់នេះសម្រាប់សំណើនីមួយៗដោយប្រើ `?prefix=alias`។ សូមមើល [API_REFERENCE](API_REFERENCE.md#model-id-prefixes-prefix)។ | | `ARENA_ELO_SYNC_INTERVAL` | `86400` (24h) | `src/lib/arenaEloSync.ts` | ចន្លោះពេលសមកាលកម្ម គិតជាវិនាទី។ | --- ## អ្នកផ្តល់សេវា PromptQL Playground (មិនផ្លូវការ/សម្រាប់ពិសោធន៍) ស្ពានសម័យ GraphQL ដែលបានវិស្វកម្មបញ្ច្រាសសម្រាប់ hyperagent.com (`src/shared/constants/providers/web-cookie.ts`)។ ជម្រើសទាំងអស់ — តម្លៃលំនាំដើមចង្អុលទៅ endpoint សាធារណៈរបស់ playground; ប្តូរតែសម្រាប់ការដាក់ឱ្យប្រើ PromptQL ផ្ទាល់ខ្លួន/ជំនួសប៉ុណ្ណោះ។ | Variable | Default | Source File | Description | | ---------------------------- | ------------------------------------------------------------------ | ----------------------------------------------------------------------- | ------------------------------------------------------------------- | | `PROMPTQL_GRAPHQL_ENDPOINT` | `https://data.prompt.ql.app/promptql/playground-v2-hge/v1/graphql` | `open-sse/executors/promptql.ts` | Endpoint GraphQL ដែលប្រើសម្រាប់ប្រតិបត្តិការជជែក/សម័យ។ | | `PROMPTQL_CREDITS_ENDPOINT` | `https://data.pro.ql.app/v1/graphql` | `open-sse/executors/promptql.ts`, `open-sse/services/usage/promptql.ts` | Endpoint GraphQL ដែលប្រើសម្រាប់សួរអំពីសមតុល្យ/ការប្រើប្រាស់ credit។ | | `PROMPTQL_TOKEN_REFRESH_URL` | `https://auth.pro.ql.app/ddn/project/token` | `open-sse/executors/promptql.ts` | Endpoint ដែលប្រើសម្រាប់ការធ្វើឱ្យ token ស្រស់ឡើងវិញតាមលទ្ធភាព។ | | `PROMPTQL_POLL_TIMEOUT_MS` | `180000` | `open-sse/executors/promptql.ts` | រយៈពេលអតិបរមា (ms) សម្រាប់ poll `thread_events` មុនពេលអស់ពេល។ | --- ## អ្នកផ្តល់សេវា HyperAgent Web (មិនផ្លូវការ/សម្រាប់ពិសោធន៍) ស្ពានសម័យដែលបានវិស្វកម្មបញ្ច្រាសសម្រាប់ hyperagent.com (`src/shared/constants/providers/web-cookie.ts`)។ ជាជម្រើស — តម្លៃលំនាំដើមចង្អុលទៅ endpoint សាធារណៈសម្រាប់ការចេញវិក្កយបត្រ/ការប្រើប្រាស់; ប្តូរតែសម្រាប់ការដាក់ឱ្យប្រើ HyperAgent ផ្ទាល់ខ្លួន/ជំនួសប៉ុណ្ណោះ។ | Variable | Default | Source File | Description | | ---------------------- | --------------------------------------------------- | --------------------------------------- | ------------------------------------------------------------------------------- | | `HYPERAGENT_USAGE_URL` | `https://hyperagent.com/api/settings/billing/usage` | `open-sse/services/usage/hyperagent.ts` | Endpoint ដែលប្រើសម្រាប់ទាញយកប្លុក credit សម្រាប់ការចេញវិក្កយបត្រ/ការប្រើប្រាស់។ | --- ## គោលការណ៍ថវិកាសម្រាប់ការប្រើប្រាស់ដែលមិនមានតម្លៃ | Variable | Default | Source File | Description | | ------------------------------ | ------------------------------------------------------------ | ---------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `UNPRICED_USAGE_BUDGET_POLICY` | _(unset; fail closed unless the boolean opt-out is enabled)_ | `src/shared/utils/featureFlags.ts` | ដែនកំណត់ USD ប្រចាំថ្ងៃ/សប្តាហ៍តាម key៖ `fail_closed` រារាំងការប្រើប្រាស់ដែលពិតជាមិនមានតម្លៃ; `count_as_zero` រាប់វាជា $0 ខណៈពេលអនុវត្តការចំណាយដែលមានតម្លៃ។ enum ជាក់លាក់ (DB មុន env) នឹងបដិសេធ boolean opt-out។ តម្លៃមិនត្រឹមត្រូវ និងការបរាជ័យក្នុងការស្វែងរកតម្លៃ នឹងបរាជ័យដោយបិទជាមុន។ | | `USAGE_LIMIT_IGNORE_UNPRICED` | `false` | `src/shared/utils/featureFlags.ts` | ជម្រើសបិទសម្រាប់ភាពឆបគ្នាជាមួយ boolean របស់ upstream៖ រាប់ការប្រើប្រាស់ដែលពិតជាមិនមានតម្លៃជាដុល្លារ $0 តែនៅពេលមិនមានគោលការណ៍ enum ជាក់លាក់ដែលបានកំណត់។ ការចំណាយដែលមានតម្លៃ និងការស្វែងរកដែលបរាជ័យ នៅតែត្រូវបានអនុវត្ត។ | ## កូតាប្រើប្រាស់ Kilo Code ការស្វែងរកសមតុល្យជាដុល្លារ USD ផ្ទាល់ខ្លួន និងការប្រើប្រាស់ Kilo Pass សម្រាប់អ្នកផ្តល់សេវា Kilo Code។ ជាជម្រើស — តាមលំនាំដើម វាចង្អុលទៅកាន់ Kilo API សាធារណៈ; ត្រូវប្តូរតែសម្រាប់ relay/test fixture ប៉ុណ្ណោះ។ ការផ្ទៀងផ្ទាត់ប្រើ OAuth access token ដែលមានស្រាប់របស់ connection។ | Variable | Default | Source File | Description | | -------------- | --------------------- | ------------------------------------- | ---------------------------------------------------------------------------------------- | | `KILO_API_URL` | `https://api.kilo.ai` | `open-sse/services/usage/kilocode.ts` | URL មូលដ្ឋានដែលប្រើសម្រាប់ទាញយកសមតុល្យ Kilo Code ផ្ទាល់ខ្លួន និងការប្រើប្រាស់ Kilo Pass។ | --- ## អ្នកផ្តល់សេវា Adobe Firefly Web (មិនផ្លូវការ/សាកល្បង) ការផ្ទុកសម័យឡើងវិញដែលដំណើរការតាមកម្មវិធីរុករកសម្រាប់អ្នកផ្តល់សេវា Adobe Firefly Web (`open-sse/services/adobeFireflyBrowserLogin.ts`, `open-sse/services/adobeFireflySession.ts`, `open-sse/services/adobeFireflyClient.ts`)។ ជាជម្រើស — តម្លៃលំនាំដើមទាំងអស់ត្រូវបានកំណត់សម្រាប់ការដំឡើងលើកុំព្យូទ័រធម្មតា។ > **បានដកចេញក្នុង #9255។** Chrome runtime ចាស់ដែលភ្ជាប់តាម CDP (adobeFireflyChromeRuntime.ts) ត្រូវបាន > ជំនួសដោយសេវា Playwright browser-login ហើយ knobs របស់វាលែងមានទៀត។ អថេរ > ADOBE_FIREFLY_CHROME_ CDP_PORT / VISIBLE / HEADED / PING / FORCE_RESTART រួមទាំង > ADOBE_FIREFLY_LOGIN_WAIT_MS និង ADOBE_FIREFLY_FORTER_WAIT_MS មិនត្រូវបានអាននៅកន្លែងណាមួយក្នុង > codebase ទេ — ការកំណត់ពួកវាមិនមានប្រសិទ្ធភាពអ្វីឡើយ។ | Variable | Default | Source File | Description | | ------------------------------------ | --------- | ----------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------- | | `ADOBE_FIREFLY_CHROME_HEADLESS` | `0` | `open-sse/services/adobeFireflyBrowserLogin.ts` | កំណត់ជា `1` ដើម្បីប្រើ Chrome headless ពេញលេញ (មានបញ្ហាដែលគេដឹងសម្រាប់ generate; សម្រាប់បំបាត់កំហុសប៉ុណ្ណោះ)។ | | `ADOBE_FIREFLY_BROWSER_REFRESH` | `1` | `open-sse/services/adobeFireflySession.ts` | បើក/បិទការធ្វើឱ្យ browser ក្តៅជាមុន។ `0` បិទការធ្វើឱ្យក្តៅជាមុន (ការស្តារឡើងវិញពី 408 នៅពាក់កណ្តាល batch នៅតែអនុវត្ត)។ | | `ADOBE_FIREFLY_SESSION_DISK` | `1` | `open-sse/services/adobeFireflySession.ts` | កំណត់ជា `0` ដើម្បីបិទការរក្សាទុកសម័យ Adobe Firefly ទៅក្នុងថាស។ | | `ADOBE_FIREFLY_MIN_SUBMIT_GAP_MS` | _(unset)_ | `open-sse/services/adobeFireflySession.ts` | ចន្លោះអប្បបរមា (ms) ដែលត្រូវអនុវត្តរវាងការបញ្ជូនជាបន្តបន្ទាប់ ដោយជំនួសតម្លៃលំនាំដើមដែលមានស្រាប់។ | | `ADOBE_FIREFLY_BATCH_EXTRA_GAP_MS` | _(unset)_ | `open-sse/services/adobeFireflySession.ts` | ចន្លោះបន្ថែម (ms) ដែលបន្ថែមបន្ទាប់ពី batch ជោគជ័យ ដោយជំនួសតម្លៃលំនាំដើមដែលមានស្រាប់។ | | `ADOBE_FIREFLY_SUBMIT_BASE_DELAY_MS` | _(unset)_ | `open-sse/services/adobeFireflyClient.ts` | ការពន្យារពេលមូលដ្ឋាន (ms) មុនពេលបញ្ជូនសំណើបង្កើត ដោយជំនួសតម្លៃលំនាំដើមដែលមានស្រាប់។ | --- ## 19. ការធ្វើសមកាលកម្មម៉ូដែល (Dev) | Variable | Default | Source File | Description | | ----------------------------------- | --------------- | ---------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `MODELS_DEV_SYNC_ENABLED` | _(មិនបានកំណត់)_ | `src/lib/modelsDevSync.ts` | ការបដិសេធកំណត់តម្លៃដោយបង្ខំសម្រាប់ការធ្វើសមកាលកម្មតម្លៃ models.dev។ មិនបានកំណត់ = គោរពតាម Settings > AI (`modelsDevSyncEnabled`)។ `0`/`false`/`off`/`no` **មានអាទិភាពលើ DB** ហើយរំលងទាំងការធ្វើសមកាលកម្មតាមកាលកំណត់ និងការស្កេន SQL/JSON របស់ `getModelsDevPricing()` (ប្រើសម្រាប់ស្តារឡើងវិញ នៅពេល dashboard ជាប់គាំងលើ event loop ដូចគ្នា)។ `1`/`true`/`on`/`yes` បង្ខំឱ្យបើកការធ្វើសមកាលកម្ម។ ការរក្សាទុក/សម្អាតតម្លៃនៅតែហៅ `backupDbFile("pre-write")` ដែលមិនធ្វើអ្វីឡើយ នៅពេលស្ថិតក្រោមការកំណត់ 60 នាទី ឬ `DISABLE_SQLITE_AUTO_BACKUP`។ | | `MODELS_DEV_SYNC_INTERVAL` | `86400` (24h) | `src/lib/modelsDevSync.ts` | ចន្លោះពេលធ្វើសមកាលកម្មកាតាឡុកម៉ូដែលនៅពេលអភិវឌ្ឍ ជាវិនាទី។ | | `CONTEXT_WINDOW_RECONCILE_INTERVAL` | `86400` (24h) | `src/lib/contextWindowResolver.ts` | ចន្លោះពេល (វិនាទី) សម្រាប់អ្នកសម្របសម្រួល context-window ដែលកែតម្រូវដោយខ្លួនឯង (5004)៖ វាភ្ជាប់ context windows ដែល provider ប្រកាសពីការស្វែងរក `/models` ជាការបដិសេធ `auto:discovery` នៅពេលវាខុសគ្នាពីកាតាឡុក។ កំណត់ជា `0` ដើម្បីបិទ។ ប្រើទិន្នន័យដែលបានធ្វើសមកាលកម្មរួចហើយ (មិនមានការទាញយកថ្មីទេ) ហើយមិនដែលសរសេរជាន់លើការបដិសេធ `manual` ឡើយ។ | --- ## 20. ការកំណត់ជាក់លាក់សម្រាប់ Provider | Variable | Default | Source File | Description | | ---------------------------------------------- | ------------------------------------------- | ---------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `OPENROUTER_CATALOG_TTL_MS` | `86400000` (24h) | `src/lib/catalog/openrouterCatalog.ts` | រយៈពេល TTL នៃ cache កាតាឡុកម៉ូដែល OpenRouter។ | | `MODEL_CATALOG_INCLUDE_NAMES` | `true` | `src/shared/constants/featureFlagDefinitions.ts` | រួមបញ្ចូលវាល `name` ដែលងាយស្រួលបង្ហាញក្នុងការឆ្លើយតប `/v1/models`។ បិទសម្រាប់ client ដែលរំពឹងទុកតែ ID ប៉ុណ្ណោះ។ | | `OMNIROUTE_GEMINI_WEB_ARGON_ENABLED` | `0` (off) | `open-sse/config/providers/registry/gemini/web/index.ts` | ជម្រើសចូលរួម (#16573)។ កំណត់ជា `1` (ឬ `true`/`yes`) ដើម្បីប្រកាស `gweb/gemini-4-argon` នៅលើ Gemini Web provider និងអនុញ្ញាតឱ្យ executor របស់វាជ្រើសរើស mode នោះ។ តាមលំនាំដើម វាត្រូវបានបិទ ពីព្រោះ selectors នៃម៉ឺនុយ mode របស់ Argon មិនទាន់ត្រូវបានពិនិត្យជាមួយគណនី Gemini Web ដែលកំពុងដំណើរការពិតប្រាកដ។ នៅពេលបិទ ម៉ូដែលនេះមិនត្រូវបានរាយបញ្ជីទេ ហើយសំណើសុំវាត្រូវបានបដិសេធថាជាម៉ូដែលមិនស្គាល់ ដូចកាលពីមុន។ តម្លៃត្រូវបានអាននៅពេលចាប់ផ្ដើម ដូច្នេះការផ្លាស់ប្ដូរត្រូវការចាប់ផ្ដើមឡើងវិញ។ | | `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 days) | `src/lib/db/models/activeSyncedCatalog.ts` | អាយុដែលបន្ទាប់ពីនោះ បញ្ជីម៉ូដែលដែលបានធ្វើសមកាលកម្មរបស់ connection លែងមានសុពលភាពសម្រាប់ការបញ្ជូន routing ហើយបរាជ័យបើកទៅកាន់ registry (#12849)។ ជួរដេកដែលមិនធ្លាប់មាន timestamp ក៏ត្រូវបានរាប់ថាចាស់ផងដែរ។ | | `OMNIROUTE_ANALYTICS_CACHE_TTL_MS` | `60000` (60s) | `src/lib/usage/analyticsResponseCache.ts` | រយៈពេលដែលការឆ្លើយតបយឺតរបស់ `GET /api/usage/analytics` ត្រូវបានប្រើឡើងវិញសម្រាប់ query string ដូចគ្នា (#15629)។ `0` បិទ cache។ | | `OMNIROUTE_ANALYTICS_CACHE_MIN_COMPUTE_MS` | `1000` (1s) | `src/lib/usage/analyticsResponseCache.ts` | មានតែការឆ្លើយតប analytics ដែលត្រូវការពេលយ៉ាងហោចណាស់តាមតម្លៃនេះក្នុងការបង្កើតប៉ុណ្ណោះ ដែលត្រូវបាន cache ដើម្បីឱ្យ instance តូចៗតែងតែទទួលបានទិន្នន័យថ្មី។ | | `OMNIROUTE_CACHE_METRICS_MIN_COMPUTE_MS` | unset (off) | `src/app/api/cache/route.ts` via `src/lib/usage/analyticsResponseCache.ts` | ជាជម្រើសចូលរួម (#16361)។ នៅពេលកំណត់ជាចំនួនគត់មិនអវិជ្ជមាន N ផ្នែកប្រវត្តិការប្រើប្រាស់របស់ `GET /api/cache` (សរុប prompt-cache + និន្នាការ) នឹងត្រូវផ្តល់ពីឃ្លាំងសម្ងាត់ការឆ្លើយតបវិភាគដែលបានចែករំលែក នៅពេលការបង្កើតវាត្រូវការពេលយ៉ាងហោចណាស់ N ms ក្នុងមួយបង្អួច `trendHours` ដែលបានកំណត់ព្រំដែន សម្រាប់ `OMNIROUTE_ANALYTICS_CACHE_TTL_MS` (ប្រវត្តិអាចយឺតរហូតដល់ TTL នោះ; `DELETE /api/cache` នឹងលុបឃ្លាំងសម្ងាត់នោះ)។ ប្រសិនបើមិនបានកំណត់ ឬតម្លៃមិនត្រឹមត្រូវ = អានប្រវត្តិផ្ទាល់នៅរាល់សំណើ។ | | `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` | រយៈពេលពន្យារមូលដ្ឋានសម្រាប់ការពន្យារកើនតាមអិចស្ប៉ូណង់ស្យែល ក្នុងការព្យាយាមបញ្ជូនសំណើ Adobe Firefly upscale ម្តងទៀត។ | | `AWS_REGION` | _(unset)_ | `src/lib/providers/validation.ts`, `open-sse/handlers/audioSpeech.ts` | តំបន់ដែលប្រើសម្រាប់បង្កើតចំណុចបញ្ចប់ AWS Bedrock (Kiro, សំឡេង)។ | | `AWS_DEFAULT_REGION` | _(unset)_ | `src/lib/providers/validation.ts`, `open-sse/handlers/audioSpeech.ts` | តម្លៃជំនួស នៅពេល `AWS_REGION` មិនត្រូវបានកំណត់។ | | `CLOUDFLARE_ACCOUNT_ID` | _(unset)_ | `open-sse/executors/cloudflare-ai.ts` | លេខសម្គាល់គណនីសម្រាប់ Cloudflare Workers AI។ | | `CLOUDFLARE_PLAYGROUND_CHROME_PATH` | _(unset)_ | `open-sse/executors/cloudflare-playground.ts` | ផ្លូវពេញលេញទៅកាន់ binary របស់ Chrome លើ desktop សម្រាប់កម្មវិធីប្រតិបត្តិ Cloudflare AI Playground ដែលប្រើនៅពេលការត្រួតពិនិត្យ fingerprint ក្នុងរបៀប headless រារាំង Chromium ដែលភ្ជាប់មកជាមួយ Playwright។ | | `CODEBUDDY_SYSTEM_PROMPT_MAX_LEN` | ∅ (∞) — _មិនបានកំណត់ = គ្មានដែនកំណត់ប្រវែង_ | `open-sse/executors/codebuddy/shared.ts` | ដែនកំណត់ប្រវែងជាជម្រើសសម្រាប់ system prompt របស់អ្នកហៅ ដែលផ្ញើទៅ CodeBuddy (ចិន និងអន្តរជាតិ)។ តាមលំនាំដើម មានតែ prompt ដែលមានសញ្ញាសម្គាល់អត្តសញ្ញាណ coding-agent ប៉ុណ្ណោះដែលត្រូវបានជំនួសដោយសញ្ញាអព្យាក្រឹត (តម្រងមាតិការបស់ Tencent បដិសេធសញ្ញាទាំងនោះ); 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 ដែលប្រើដោយអ្នកដាក់ឱ្យដំណើរការ Workers relay របស់ proxy-pool (#4640 / 9router#1360)។ | | `NEXT_PUBLIC_CLOUDFLARE_RELAY_DEFAULT_PROJECT` | `omniroute-relay` | `src/app/(dashboard)/dashboard/settings/components/proxy/CloudflareRelayModal.tsx` | ឈ្មោះគម្រោង worker លំនាំដើមដែលបានស្នើនៅក្នុងប្រអប់ "Deploy Relay" របស់ proxy-pool។ | | `NEXT_PUBLIC_CLOUDFLARE_RELAY_ENABLED` | `true` | `src/app/(dashboard)/dashboard/settings/components/proxy/ProxyPoolTab.tsx` | កំណត់ជា `false` ដើម្បីលាក់ជម្រើស Cloudflare Workers relay ពីផ្ទាំង Proxy Pool។ | | `CLOUDFLARED_BIN` | auto-detect | `src/lib/cloudflaredTunnel.ts` | ផ្លូវផ្ទាល់ខ្លួនទៅកាន់ binary `cloudflared`។ | | `CLOUDFLARED_PROTOCOL` | `http2` | `src/lib/cloudflaredTunnel.ts` | ពិធីការដឹកជញ្ជូនរបស់ tunnel៖ `http2` (លំនាំដើម), `quic` ឬ `auto`។ | | `CLOUDFLARED_CONFIG` | _(unset)_ | `src/lib/cloudflaredTunnel.ts` | ផ្លូវទៅកាន់ `config.yml` របស់ cloudflared ដែលគ្រប់គ្រងក្នុងមូលដ្ឋាន (មាន `tunnel:`, `credentials-file:`, `ingress:`)។ នៅពេលកំណត់ OmniRoute នឹងដំណើរការ `tunnel --config run` (named tunnel) ជំនួសឱ្យ quick tunnel បណ្តោះអាសន្ន។ | | `CLOUDFLARED_HOSTNAME` | _(from config ingress)_ | `src/lib/cloudflaredTunnel.ts` | ការបដិសេធ hostname សាធារណៈរបស់ named tunnel (ឧ. `ai.example.com`) ដែលរាយការណ៍ជា `publicUrl`/`apiUrl`។ នៅពេលមិនកំណត់ វានឹងអានពី hostname `ingress` ដំបូងក្នុង config។ | | `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 លំនាំដើមដែលបានស្នើនៅក្នុងប្រអប់ "Deploy Relay" របស់ proxy-pool។ | | `NEXT_PUBLIC_DENO_RELAY_ENABLED` | `true` | `src/app/(dashboard)/dashboard/settings/components/proxy/ProxyPoolTab.tsx` | កំណត់ជា `false` ដើម្បីលាក់ជម្រើសរ៉ីឡេ Deno Deploy ពីផ្ទាំង Proxy Pool។ | | `SEARCH_CACHE_TTL_MS` | `300000` (5 min) | `open-sse/services/searchCache.ts` | TTL សម្រាប់ការរក្សាទុកក្នុងឃ្លាំងនូវការឆ្លើយតបពី API ស្វែងរក (Perplexity, Brave ជាដើម)។ | | `ENABLE_CC_COMPATIBLE_PROVIDER` | `false` | `src/shared/utils/featureFlags.ts` | បង្ហាញ UI របស់អ្នកផ្តល់សេវាដែលត្រូវគ្នាជាមួយ CC សម្រាប់រ៉ីឡេដែលប្រើបានតែជាមួយ 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 សម្រាប់ភ្ជាប់របស់ប្រូកស៊ី WebSocket សម្រាប់សេវាដែលបានបង្កប់ (តាមលំនាំដើម ភ្ជាប់តែ loopback ប៉ុណ្ណោះ)។ | | `EMBED_WS_PROXY_PORT` | `20131` | `src/lib/services/embedWsProxy.ts` | Port សម្រាប់ម៉ាស៊ីនមេប្រូកស៊ី WebSocket សម្រាប់សេវាដែលបានបង្កប់។ | | `CLIPROXYAPI_HOST` | `127.0.0.1` | `open-sse/executors/cliproxyapi.ts` | Host របស់ស្ពាន CLIProxyAPI (ការរួមបញ្ចូលបែបចាស់)។ | | `CLIPROXYAPI_PORT` | `5544` | `open-sse/executors/cliproxyapi.ts` | Port របស់ស្ពាន CLIProxyAPI។ | | `CLIPROXYAPI_API_KEY` | _(ទទេ)_ | `open-sse/handlers/chatCore/cliproxyapiCredentials.ts` | គន្លឹះសម្រាប់ស្រទាប់ទិន្នន័យ ដែលប្រើជាតម្លៃជំនួស នៅពេលការកំណត់ `cliproxyapi_api_key` អវត្តមាន។ | | `CLIPROXYAPI_MANAGEMENT_KEY` | _(ទទេ)_ | `src/lib/services/cliproxyAccountHealth.ts` | គន្លឹះគ្រប់គ្រងសម្រាប់អានស្ថានភាពសុខភាពគណនីពីអង្គភាព CLIProxyAPI ដែលគ្រប់គ្រងខាងក្រៅ។ | | `CLIPROXYAPI_CONFIG_DIR` | `~/.cli-proxy-api` | `src/lib/versionManager/processManager.ts` | ថតកំណត់រចនាសម្ព័ន្ធ CLIProxyAPI។ | | `CLIPROXY_BIND_HOST` | `127.0.0.1` | `docker-compose.yml` | ចំណុចប្រទាក់ម៉ាស៊ីនដែល docker-compose បោះផ្សាយ sidecar `cliproxyapi` នៅលើ (#12578)។ បរិមាណទិន្នន័យរបស់វារក្សាទុកព័ត៌មានសម្គាល់ OAuth/API របស់អ្នកផ្គត់ផ្គង់ ហើយ image ដែលបានចាក់សោមិនមានការបដិសេធ `api-keys` សម្រាប់ស្រទាប់ទិន្នន័យតាម env ទេ (មានតែ `config.yaml` ដែលបានម៉ោនប៉ុណ្ណោះ) ដូច្នេះ `0.0.0.0` នឹងបង្ហាញសេវាកម្មដែលមានព័ត៌មានសម្គាល់ទៅកាន់បណ្តាញ LAN ទាំងមូល។ | | `MUX_SERVICE_PORT` | `8322` | `src/lib/services/bootstrap.ts` | បដិសេធច្រកដែល daemon រៀបចំភ្នាក់ងារ Mux (coder/mux) ដែលបានបង្កប់ស្តាប់ (តែងតែជា 127.0.0.1)។ | | `OPENWA_SERVICE_PORT` | `8323` | `src/lib/services/bootstrap.ts` | បដិសេធច្រកដែល daemon open-wa (ស្វ័យប្រវត្តិកម្ម WhatsApp Web) ដែលបានបង្កប់ស្តាប់ (តែងតែជា 127.0.0.1)។ | | `DARIO_HOST` | `127.0.0.1` | `open-sse/executors/dario.ts` | ម៉ាស៊ីនសម្រាប់ភ្ជាប់/ចងសេវាកម្ម Dario ដែលបានបង្កប់ (តាមលំនាំដើម ប្រើតែ loopback)។ | | `DARIO_PORT` | `3456` | `open-sse/executors/dario.ts` | ច្រកសេវាកម្ម Dario ដែលបានបង្កប់។ | | `DARIO_HOST` | `127.0.0.1` | `open-sse/executors/dario.ts` | ម៉ាស៊ីនសម្រាប់ភ្ជាប់/ចងសេវាកម្ម Dario ដែលបានបង្កប់ (តាមលំនាំដើម ប្រើតែ loopback)។ | | `DARIO_PORT` | `3456` | `open-sse/executors/dario.ts` | ច្រកសេវាកម្មបង្កប់របស់ Dario។ | | `LOCAL_HOSTNAMES` | _(empty)_ | `open-sse/config/providerRegistry.ts` | ឈ្មោះម៉ាស៊ីនបន្ថែមដែលបំបែកដោយសញ្ញាក្បៀស ហើយត្រូវបានចាត់ទុកថាជា "មូលដ្ឋាន" (ឈ្មោះសេវាកម្ម Docker ជាដើម)។ | `ENABLE_CC_COMPATIBLE_PROVIDER` គឺសម្រាប់តែ relay ភាគីទីបីដែលទទួលយក client របស់ Claude Code ផ្តាច់មុខប៉ុណ្ណោះ។ OmniRoute សរសេរសំណើឡើងវិញ ដើម្បីឱ្យ relay ទាំងនោះអាចទទួលយកវាបាន។ ប្រសិនបើអ្នកចង់ប្រើតែ Claude Code CLI ឬមិនប្រាកដថា relay ទាំងនេះជាអ្វីទេ សូមរក្សាវាឱ្យបិទ ហើយបន្ថែម provider ដែលត្រូវគ្នាជាមួយ Anthropic ធម្មតាវិញ។ --- ## 21. សុខភាពប្រូកស៊ី | Variable | Default | Source File | Description | | ------------------------------------------------- | ------------------------ | --------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `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 នៃឃ្លាំងសម្ងាត់លទ្ធផលត្រួតពិនិត្យសុខភាព។ | | `NONE_HONORED_WINDOW_HOURS` | `24` | `src/lib/db/reasoningEffortCompliance.ts` | ចន្លោះពេលបន្តថយក្រោយជាម៉ោង សម្រាប់កម្មវិធីអានការអនុលោម `reasoning_effort=none` នៅលើ GET /v1/models/health។ | | `NONE_HONORED_CACHE_TTL_MS` | `20000` | `src/lib/db/reasoningEffortCompliance.ts` | TTL ឃ្លាំងសម្ងាត់គិតជាមិលីវិនាទី សម្រាប់ snapshot នៃការអនុលោម none (15-30 វិនាទី)។ | | `NONE_HONORED_MIN_SAMPLE` | `3` | `src/lib/db/reasoningEffortCompliance.ts` | ចំនួនសំណើ none អប្បបរមា មុនពេលម៉ូដែលអានថាត្រូវបានគោរព ឬមិនត្រូវបានគោរព។ ប្រសិនបើទាបជាងនេះ ម៉ូដែលនឹងអានថាមិនស្គាល់។ | | `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` | ចន្លោះពេលស្ទង់ គិតជា ms សម្រាប់ប្រូកស៊ី edge-relay (`deno`/`vercel`/`cloudflare`) ដែលការស្ទង់របស់វានឹងដាស់ serverless isolate ដែលមានការគិតថ្លៃ (អប្បបរមា `60000`)។ | | `PROXY_HEALTH_RECOVERY_INTERVAL_MS` | `600000` | `src/lib/proxyHealth/scheduler.ts` | ចន្លោះពេលដំណើរការស្ដារឡើងវិញផ្ទៃខាងក្រោយ គិតជា ms៖ ប្រេកង់ដែលប្រូកស៊ីដែលមិនមានសុខភាពល្អពីមុន ត្រូវបានស្ទង់ម្ដងទៀត ដើម្បីឱ្យប្រូកស៊ីដែលបានស្ដារឡើងវិញ ត្រឡប់ទៅក្នុងការបង្វិលប្រើប្រាស់វិញដោយមិនចាំបាច់ចាប់ផ្ដើមឡើងវិញ។ តម្លៃក្រោម `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` | ការពន្យារពេលជាគិតជា ms រវាងការចាកចេញរបស់ការស្ទង់ពីរ នៅខាងក្នុងបាច់មួយ។ ប្រសិនបើគ្មានការពន្យារពេលនេះ បាច់ទាំងមូលនឹងចាកចេញក្នុងពេលតែមួយ ហើយ IP ចេញចូលដែលប្រើរួមគ្នា អាចបង្កឱ្យគោលដៅដែលកំណត់អត្រា ដំណើរការលើសកម្រិត។ កំណត់ជា `0` ដើម្បីបិទការដាក់ចន្លោះពេលនេះ។ តម្លៃអតិបរមា 5000។ | | `PROXY_HEALTH_USE_PROVIDER_TARGET` | `true` | `src/lib/proxyHealth/providerProbeTarget.ts` | កំណត់ជា "false" ដើម្បីបញ្ឈប់ការស្ទង់ host ពិតប្រាកដរបស់ provider ដែលបានកំណត់ឱ្យ proxy (`GET /models` ដោយគ្មាន API key) ហើយប្រើ `PROXY_HEALTH_TEST_URL` ជំនួសជានិច្ច។ | | `PROXY_HEALTH_AUTO_DEACTIVATE` | `false` | `src/lib/proxyHealth/statusPolicy.ts` | នៅពេល `false` (លំនាំដើម) ការស្ទង់លទ្ធភាពចូលប្រើដោយស្វ័យប្រវត្តិ (កម្មវិធីកំណត់ពេល + ប៊ូតុង "Test All" របស់ `/api/settings/proxies/auto-test`) គឺ **សម្រាប់តែអាន** ហើយមិនដែលសរសេរស្ថានភាពរបស់ proxy ឡើយ — មានតែប្រតិបត្តិករប៉ុណ្ណោះដែលកំណត់ active/inactive ដូច្នេះការស្ទង់ដែលមានបញ្ហាម្តងម្កាល មិនអាចធ្វើឱ្យ proxy ដែលបានកំណត់ជាប់គាំងបានទេ (#6246)។ កំណត់ជា `true` ដើម្បីស្តារឥរិយាបថសាកល្បង និងកំណត់ស្ថានភាពតាមបែបចាស់។ | | `FLUSH_EMPTY_RETRY_ENABLED` | `false` | `src/shared/utils/featureFlags.ts` | ទង់មុខងារដែលត្រូវជ្រើសរើសបើក (មើល [FEATURE_FLAGS.md](./FEATURE_FLAGS.md); ការកំណត់ជំនួសពីមូលដ្ឋានទិន្នន័យ dashboard មានអាទិភាព)។ `true` (ឬ `1`, `yes`) នឹងសាកល្បងវេន streaming ដែលបានបកប្រែហើយទទេឡើងវិញ តាមផ្លូវព័ត៌មានសម្គាល់ធម្មតា (រហូតដល់ `STREAM_RECOVERY.EMPTY_TURN_RETRY_MAX` ដង) ជំនួសឱ្យបង្ហាញ 200 ទទេ ឬ 502 ដែលមានខ្លឹមសារទទេ។ | | `EMPTY_STREAM_SIBLING_RECOVERY_ENABLED` | `false` | `src/shared/utils/featureFlags.ts` | ទង់មុខងារដែលត្រូវជ្រើសរើសបើក (មើល [FEATURE_FLAGS.md](./FEATURE_FLAGS.md); ការកំណត់ជំនួសពីមូលដ្ឋានទិន្នន័យ dashboard មានអាទិភាព)។ `true` (ឬ `1`, `yes`) នឹងបើកការស្ទង់ខ្លឹមសារនៃ stream ទទេរបស់ Claude/Codex ហើយប្រើការសាកល្បងឡើងវិញដែលមានដែនកំណត់ដែលមានស្រាប់ លើការតភ្ជាប់ដែលមានសិទ្ធិប្រើប្រាស់ផ្សេងទៀត បន្ទាប់ពីវេន `empty_content` ដោយគ្មានរយៈពេលបន្ថយសមត្ថភាព ឬការចាក់សោ model។ | | `STREAM_LATE_OUTPUT_PROBE_ENABLED` | `false` | `src/shared/utils/featureFlags.ts` | ទង់មុខងារដែលត្រូវជ្រើសរើសបើក (មើល [FEATURE_FLAGS.md](./FEATURE_FLAGS.md); ការកំណត់ជំនួសពីមូលដ្ឋានទិន្នន័យ dashboard មានអាទិភាព)។ `true` (ឬ `1`, `yes`) នឹងបន្តយក chunk មួយក្នុងចំណោម 16 មកសំណាក បន្ទាប់ពី 64 ដំបូង ដើម្បីឱ្យ output ដែលបង្ហាញយឺត នៅតែសម្គាល់ថា stream បានបញ្ចេញ output (5xx តែមួយក្រោយពេលមាន output នឹងនៅតែមានវិសាលភាពត្រឹមសំណើ ជំនួសឱ្យការចាក់សោតែ model)។ | | `PROXY_POOL_EGRESS_OBSERVATION` | `false` | `src/shared/utils/featureFlags.ts` | ទង់មុខងារដែលត្រូវជ្រើសរើសបើក (មើល [FEATURE_FLAGS.md](./FEATURE_FLAGS.md); ការកំណត់ជំនួសពីមូលដ្ឋានទិន្នន័យ dashboard មានអាទិភាព)។ `true` (ឬ `1`, `yes`) នឹងបង្ហាញការសង្កេត egress របស់ pool ដែលមានសិទ្ធិតែអាន នៅក្រោម proxy pool ក្នុង dashboard (IP egress ផ្សេងៗ ការតភ្ជាប់ និង egress ដែលឃើញញឹកញាប់បំផុតនៅពីក្រោយ IP មួយ ក្នុងរយៈពេល 24 ម៉ោងចុងក្រោយ ពីកំណត់ហេតុ proxy)។ មិនដែលប្រើសម្រាប់ការបញ្ជូនទិសឡើយ។ | | `PROXY_OPERATOR_EGRESS_ENABLED` | `false` | `src/shared/utils/featureFlags.ts` | ទង់មុខងារដែលត្រូវជ្រើសរើសបើក (មើល [FEATURE_FLAGS.md](./FEATURE_FLAGS.md); ការកំណត់ជំនួសពីមូលដ្ឋានទិន្នន័យ dashboard មានអាទិភាព)។ `true` (ឬ `1`, `yes`) នឹងទទួលយកអាសយដ្ឋានដែលបានសង្កេត និងមានកាលបរិច្ឆេទ ដែលប្រតិបត្តិករជំរុញសម្រាប់សមាជិកនីមួយៗនៃ pool ហើយបញ្ចូលវាជាមួយការអានពី journal ដើម្បីបង្ហាញ និងរៀបលំដាប់ pool។ | | `PROXY_OPERATOR_EGRESS_WINDOW_HOURS` | `24` | `src/lib/db/proxyOperatorEgress.ts` | បង្អួចសង្កេតជាម៉ោងសម្រាប់ជួរ egress ដែលប្រតិបត្តិករជំរុញ (អានរាល់ពេលអាន; មិនចាំបាច់ចាប់ផ្តើមឡើងវិញទេ)។ ត្រូវបានកំណត់ក្នុងចន្លោះ 1..168; តម្លៃក្រៅចន្លោះ មិនមែនជាលេខ ឬទទេ នឹងត្រឡប់ទៅ 24 ដោយមានការព្រមានតែមួយក្នុងកម្រិតដំណើរការទាំងមូល ហើយមិនដែលបោះកំហុសឡើយ។ | | `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 ភ្លាមៗ (តម្រងស្ថានភាពរស់រានដែលប្រើសម្រាប់ការដោះស្រាយ scope-pool បានដកវាចេញរួចហើយ) ហើយនឹងត្រូវបានធ្វើឱ្យសកម្មឡើងវិញដោយស្វ័យប្រវត្តិ នៅពេលវាចាប់ផ្តើមឆ្លងកាត់ការត្រួតពិនិត្យម្តងទៀត។ ប្រើកម្រិតកំណត់ `PROXY_AUTO_REMOVE_AFTER` ដូចគ្នា។ ប្រសិនបើ flag ទាំងពីរត្រូវបានកំណត់ជា `true` នោះ `PROXY_AUTO_REMOVE` មានអាទិភាព។ | | `PROXY_HEALTH_PASSIVE_SKIP` | `false` | `src/lib/proxyHealth/scheduler.ts` | ការរំលងបែប passive ដែលត្រូវជ្រើសរើសបើក៖ នៅពេល `true` scheduler នឹងរំលងការត្រួតពិនិត្យផ្ទាល់ សម្រាប់ endpoint ដែលចរាចរណ៍ផលិតកម្មថ្មីៗរបស់វាបានបញ្ជាក់រួចហើយ (យ៉ាងហោចណាស់មានជោគជ័យមួយ និងគ្មានបរាជ័យរបស់ proxy ដែលអាចកំណត់ប្រភពបានក្នុងរយៈពេលនោះ ហើយបានសង្កេតឃើញ provider តែមួយគត់)។ តាមលំនាំដើម វាត្រូវបានបិទ៖ proxy គ្រប់ตัวត្រូវបានត្រួតពិនិត្យ។ | | `PROXY_PASSIVE_WINDOW_MS` | `300000` | `src/lib/proxyHealth/passiveVerdict.ts` | រយៈពេលជាមីលីវិនាទីនៃចរាចរណ៍ផលិតកម្ម ដែលការរំលងបែប passive ពិនិត្យមើល (កំណត់ក្នុងចន្លោះ `60000..599999`)។ ខ្លីជាងចន្លោះពេលស្កេន 10 នាទី ដូច្នេះបរាជ័យថ្មីៗមានឥទ្ធិពលលើស ជំនួសឱ្យត្រូវបានបន្ថយឥទ្ធិពល។ | | `OMNIROUTE_CONTROL_PLANE_PROXY_DIRECT_FALLBACK` | `false` | `src/shared/constants/featureFlagDefinitions.ts` | អនុញ្ញាតឱ្យលំហូរ OAuth និងការផ្ទៀងផ្ទាត់ provider រំលង proxy ដែលបានកំណត់ជាក់លាក់ ហើយភ្ជាប់ដោយផ្ទាល់ នៅពេលការត្រួតពិនិត្យលទ្ធភាពចូលដំណើរការរបស់ proxy ជាមុនបរាជ័យ។ លំដាប់អាទិភាពដែលមានប្រសិទ្ធភាពគឺ ការបដិសេធពីមូលដ្ឋានទិន្នន័យ Feature Flags > អថេរបរិស្ថាន > តម្លៃលំនាំដើម។ | | `RATE_LIMIT_MAX_WAIT_MS` | `30000` (30s) | `src/lib/resilience/settings.ts` | ថវិកា **រង់ចាំក្នុងជួរ** លំនាំដើម៖ រយៈពេលដែលសំណើអាចរង់ចាំ slot របស់ provider និងស្ថិតក្នុងជួរ មុនពេលត្រូវបានបដិសេធ ដោយមិនឈានដល់ upstream ឡើយ។ ឧបករណ៍កំណត់ពេលវេលាត្រូវបានលុបចោល នៅពេល job ចាប់ផ្តើមដំណើរការ — ការដំណើរការត្រូវបានកំណត់ដាច់ដោយឡែកដោយ `RATE_LIMIT_EXECUTION_MAX_WAIT_MS`។ Env កំណត់តែតម្លៃលំនាំដើមប៉ុណ្ណោះ៖ `resilienceSettings.requestQueue.maxWaitMs` ដែលបានរក្សាទុក ហើយបន្ទាប់មក `rateLimitOverrides.maxWaitMs` សម្រាប់ connection នីមួយៗ នឹងមានអាទិភាពជាងវា។ | | `RATE_LIMIT_EXECUTION_MAX_WAIT_MS` | `600000` (10 min) | `open-sse/services/rateLimitManager.ts` | កម្រិតអតិបរមាសម្រាប់រយៈពេលដែលសំណើដែលបានអនុម័តអាចស្ថិតក្នុងការដំណើរការ មុនពេលការកក់ទុកសម្រាប់ rate limit របស់វាផុតកំណត់ — ផ្តាច់ចេញពីថវិការង់ចាំក្នុងជួរ ដើម្បីកុំឱ្យការចាប់ផ្តើម fetch យឺតនៅលើ gateway ដែលមិនបន្ថែមជាបន្តបន្ទាប់ បណ្តាលឱ្យអស់ពេល (#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` | បង្ខំឱ្យប្រព័ន្ធការពារកម្រិតសំណើដោយស្វ័យប្រវត្តិបើក/បិទ ដោយមិនគិតពីការកំណត់ដែលបានរក្សាទុកក្នុងផ្ទាំងគ្រប់គ្រង (`resilienceSettings.requestQueue.autoEnableApiKeyProviders`)។ ទទួលយក `true`/`1`/`on` ដើម្បីបង្ខំបើក និង `false`/`0`/`off` ដើម្បីបង្ខំបិទ។ នៅពេលសកម្ម (លំនាំដើម) ការតភ្ជាប់ API-key សកម្មត្រូវបានការពារដោយកម្រិតសំណើដោយស្វ័យប្រវត្តិ។ ការកំណត់តាមការតភ្ជាប់ `rateLimitProtection: false` បិទការការពារដែលបានបញ្ជាក់យ៉ាងច្បាស់ ប៉ុន្តែមិនដកចេញពីប្រព័ន្ធការពារនេះទេ។ ការកំណត់ env var នេះទៅ `false` គឺជាវិធីសាស្ត្រសកលដើម្បីដំណើរការការតភ្ជាប់ API-key ដោយគ្មានជួរកំណត់កម្រិតសំណើ។ | | `PROVIDER_COOLDOWN_ENABLED` | _(មិនបានកំណត់ → បិទ)_ | `open-sse/services/providerCooldownTracker.ts` | ការតាមដានរយៈពេលផ្អាករបស់ provider/ការតភ្ជាប់ឆ្លងកាត់សំណើជាសកល ដែលត្រូវជ្រើសរើសបើក។ បិទតាមលំនាំដើម (មានមុខងារត្រួតស៊ីគ្នាជាមួយ Connection Cooldown / Provider Circuit Breaker)។ ទទួលយក `true`/`1`/`on` ដើម្បីបើក។ | | `PROVIDER_COOLDOWN_MIN_MS` | `5000` | `open-sse/services/providerCooldownTracker.ts` | រយៈពេលផ្អាកអប្បបរមា (ms) មុនពេលព្យាយាមស្នើសុំទៅ provider/ការតភ្ជាប់ដែលបរាជ័យម្ដងទៀត។ ត្រូវបានពង្រីកតាមអនុគមន៍អិចស្ប៉ូណង់ស្យែលដោយផ្អែកលើការបរាជ័យជាប់គ្នា។ ប្រើតែនៅពេល `PROVIDER_COOLDOWN_ENABLED` ប៉ុណ្ណោះ។ | | `PROVIDER_COOLDOWN_MAX_MS` | `300000` (5 នាទី) | `open-sse/services/providerCooldownTracker.ts` | កម្រិតអតិបរមានៃរយៈពេលផ្អាក (ms) មុនពេលព្យាយាមស្នើសុំទៅ provider/ការតភ្ជាប់ដែលបរាជ័យម្ដងទៀត ដោយមិនគិតពីករណីណាក៏ដោយ។ ប្រើតែនៅពេល `PROVIDER_COOLDOWN_ENABLED` ប៉ុណ្ណោះ។ | | `STREAM_RECOVERY_ENABLED` | _(មិនបានកំណត់ → បិទ)_ | `src/lib/resilience/settings.ts` (seed) → `open-sse/services/streamRecovery.ts` (logic) | **អ្វីទៅ៖** ការស្ដារស្ទ្រីម upstream ដែលត្រូវបានកាត់ផ្តាច់ឱ្យមានតម្លាភាព (port របស់ free-claude-code)។ រក្សាបង្អួច SSE ដំបូងទុករហូតដល់ `STREAM_RECOVERY.HOLDBACK_MS` (750 ms) ដូច្នេះការកាត់ផ្តាច់ _មុន commit_ — ដែលកើតឡើងមុនពេល byte ណាមួយទៅដល់ client — ត្រូវបានបើកឡើងវិញ និងព្យាយាមម្ដងទៀតដោយមើលមិនឃើញ។ **ពេលណាត្រូវបើក៖** upstream ដែលមិនស្ថិតស្ថេរ ឬជាញឹកញាប់កាត់ផ្តាច់ទិន្នន័យ 0-byte នៅពេលចាប់ផ្ដើមស្ទ្រីម។ ទុកឱ្យបិទ ប្រសិនបើអ្នកមិនអាចទទួលយកការបន្ថែមពេលវេលារហូតដល់ 750 ms មុនទទួលបាន token ដំបូងលើគ្រប់ស្ទ្រីម។ ទទួលយក `true`/`1`/`on`។ កំណត់តម្លៃដំបូងសម្រាប់ការកំណត់ Resilience ដែលបានរក្សាទុក។ ការកំណត់ក្នុងផ្ទាំងគ្រប់គ្រងមានអាទិភាព បន្ទាប់ពីបានកំណត់។ | | `STREAM_RECOVERY_MIDSTREAM_ENABLED` | _(មិនបានកំណត់ → បិទ)_ | `src/lib/resilience/settings.ts` (seed) → `open-sse/services/streamRecovery.ts` (logic) | **អ្វីទៅ៖** ការបន្តស្ទ្រីមកណ្ដាល (ដំណាក់កាល 4.4) — បន្ទាប់ពីការកាត់ផ្តាច់ _ក្រោយ commit_ (ទិន្នន័យបានទៅដល់ client រួចហើយ) ប្រើសំណើម្តងទៀតដោយមានអត្ថបទផ្នែកខ្លះជា assistant prefill ហើយភ្ជាប់បន្ថែមផ្នែកខាងចុងដែលបាត់។ សម្រាប់តែស្ទ្រីម plain-text ដែលត្រូវគ្នាជាមួយ OpenAI ប៉ុណ្ណោះ។ មិនដំណើរការឡើយ នៅពេលមាន tool call កំពុងដំណើរការ។ **ពេលណាត្រូវបើក៖** ការបង្កើតអត្ថបទវែងៗដែលត្រូវបានកាត់ផ្តាច់នៅកណ្ដាលចម្លើយ ហើយអ្នកយល់ព្រមឱ្យផ្នែកចម្លើយដែលបានស្ដារមកវិញមកដល់ជាបាច់តែមួយ ជំនួសឱ្យមកតាម token នីមួយៗ។ ឯករាជ្យពី `STREAM_RECOVERY_ENABLED` (មានកម្រិតហានិភ័យខុសគ្នា)។ ទទួលយក `true`/`1`/`on`។ | | `STREAM_THROUGHPUT_WATCHDOG_ENABLED` | _(មិនបានកំណត់ → បិទ)_ | `src/lib/resilience/settings.ts` → `open-sse/services/throughputWatchdog.ts` | ប្រព័ន្ធត្រួតពិនិត្យលទ្ធផលដែលមានប្រយោជន៍ក្នុងស្ទ្រីមសកម្ម ដែលត្រូវជ្រើសរើសបើក។ រកឃើញស្ទ្រីមដែលបន្តផ្ញើ chunk ប៉ុន្តែអត្រាលទ្ធផលរបស់ assistant នៅតែទាបជាងអត្រាដែលបានកំណត់។ heartbeat, ព្រឹត្តិការណ៍ usage, delta ទទេ និងដំណាក់កាល tool/reasoning មិនត្រូវបានចាត់ទុកខុសថាជាវឌ្ឍនភាពឡើយ។ ដាច់ដោយឡែកពីការផុតពេលដោយសារអសកម្មភាព និងការផុតពេលតាមកាលកំណត់រឹង។ កំណត់តម្លៃលំនាំដើមតែប៉ុណ្ណោះ៖ តម្លៃ boolean ដែលបានរក្សាទុកក្នុង `resilienceSettings` (ផ្ទាំងគ្រប់គ្រង → Settings → Resilience) មានអាទិភាព។ | | `STREAM_THROUGHPUT_WATCHDOG_WARMUP_MS` | `30000` | `src/lib/resilience/settings/normalize.ts` | រយៈពេលអនុគ្រោះមុនពេលវាយតម្លៃល្បឿនបញ្ជូន ដែលកំណត់ក្នុងចន្លោះ 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 អប្បបរមារបស់ជំនួយការ (ប្រូកស៊ីថូខឹនបែបប្រុងប្រយ័ត្ន) កំណត់ក្នុងចន្លោះ 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) រវាងការត្រួតពិនិត្យសុខភាពថូខឹនរបស់អ្នកផ្តល់សេវា នៅពេលចាប់ផ្តើម។ | | `HEALTHCHECK_JITTER_MIN_MS` | `500` | `src/lib/tokenHealthCheck.ts` | ការប្រែប្រួលចៃដន្យអប្បបរមា (ms) ដែលបន្ថែមលើ `HEALTHCHECK_STAGGER_MS` រវាងការត្រួតពិនិត្យសុខភាពថូខឹនរបស់អ្នកផ្តល់សេវា ដើម្បីការពារការផ្ទុះសំណើ (បញ្ហា #1220)។ | | `HEALTHCHECK_JITTER_MAX_MS` | `5000` | `src/lib/tokenHealthCheck.ts` | ការប្រែប្រួលចៃដន្យអតិបរមា (ms) ដែលបន្ថែមលើ `HEALTHCHECK_STAGGER_MS` រវាងការត្រួតពិនិត្យសុខភាពថូខឹនរបស់អ្នកផ្តល់សេវា ដើម្បីការពារការផ្ទុះសំណើ (បញ្ហា #1220)។ | | `HEALTHCHECK_BATCH_SIZE` | `20` | `src/lib/tokenHealthCheck.ts` | ទំហំបាច់នៃការត្រួតពិនិត្យដំណាលគ្នា សម្រាប់ការស្កេនត្រួតពិនិត្យសុខភាពថូខឹនពេលចាប់ផ្តើម; តម្លៃធំជាងនឹងត្រួតពិនិត្យការតភ្ជាប់ច្រើនក្នុងពេលតែមួយ ខណៈតម្លៃតូចជាងនឹងកាត់បន្ថយបន្ទុកការផ្ទុះសំណើ (បញ្ហា #7875, ការថយក្រោយនៃ #7719)។ | | `REQUEST_RETRY` | `2` | `src/sse/services/cooldownAwareRetry.ts` | ចំនួននៃការសាកល្បងឡើងវិញដោយស្វ័យប្រវត្តិលើការឆ្លើយតប cooldown កម្រិតម៉ូដែល មុនពេលបញ្ជូនកំហុសត្រឡប់ទៅ client។ | | `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 តាមលំនាំដើម។ ប្តូរតម្លៃនេះតែពេលចង់ចង្អុលទៅប្រូកស៊ី sidecar Docker ខាងក្រៅប៉ុណ្ណោះ។ | ### ថេរលៃតម្រូវការស្តារស្ទ្រីម ឥរិយាបថ holdback សម្រាប់ការស្តារឡើងវិញ ត្រូវបានលៃតម្រូវដោយថេរដែលបាន hardcode នៅក្នុង `open-sse/config/constants.ts` (`STREAM_RECOVERY`) ដែលបង្ហាញនៅទីនេះសម្រាប់ជាឯកសារយោង — ការផ្លាស់ប្តូរវាតម្រូវឱ្យកែសម្រួលកូដ មិនមែន env var ទេ៖ - `STREAM_RECOVERY.HOLDBACK_MS = 750` — រយៈពេលដែល window ដំបូងរបស់ SSE ត្រូវបាន hold ដើម្បីឱ្យការកាត់ផ្តាច់ដំណាក់កាលដំបូងអាចសាកល្បងឡើងវិញបាន មុនពេល byte ណាមួយត្រូវបាន commit ទៅ client។ - `STREAM_RECOVERY.BUFFER_MAX_BYTES = 65536` — កម្រិតរឹងអតិបរមារបស់ window ដែលបាន hold; commit (flush + passthrough) ភ្លាមៗនៅពេលមាន byte ប្រមូលបានដល់ចំនួននេះ ដោយមិនគិតពី timer ឡើយ។ - `STREAM_RECOVERY.EARLY_RETRY_MAX = 4` — ចំនួនអតិបរមានៃការបើកស្ទ្រីម upstream ឡើងវិញដោយមិនបង្ហាញឱ្យដឹង ខណៈដែល holdback នៅមិនទាន់បាន commit។ > **កម្រិតអត្រា sliding-window តាម provider (គ្មាន env var):** fallback កម្រិតអត្រា > sliding-window តាម provider ដែលបាន port ពី FCC មាននៅក្នុងកូដ > (`open-sse/services/providerDefaultRateLimit.ts` តភ្ជាប់តាមរយៈ > `open-sse/services/rateLimitManager.ts`) ប៉ុន្តែត្រូវបានដាក់ឱ្យដំណើរការជាមួយ **ផែនទីលំនាំដើមទទេ** > ហើយបច្ចុប្បន្ន **គ្មាន env var សម្រាប់ operator** ទេ — វាត្រូវបានបើកដំណើរការតែតាមរយៈ test hook / > ការកែសម្រួលកូដប៉ុណ្ណោះ។ ដោយចេតនា វាមិនត្រូវបានរាយក្នុងតារាងខាងលើទេ។ ឧបករណ៍កំណត់ relay តាម `(token, IP)` > ដែល **មាន** knob គឺ `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` | រយៈពេលអស់កំណត់ពេលដែល stream នៅទំនេរ (មិល្លីវិនាទី) សម្រាប់ Cursor executor។ | | `CURSOR_KV_GRACE_MS` | `2000` | `open-sse/executors/cursor.ts` | រយៈពេលអនុគ្រោះ (មិល្លីវិនាទី) បន្ទាប់ពី soft terminator `kv_after_text` របស់ composer នៅពេលមានបៃនៅសល់ក្នុង buffer — ផ្តល់ពេលឱ្យ tool call `exec_mcp` ដែលបន្តមក បញ្ចប់ frame របស់វា។ | | `CURSOR_TOOL_DIRECTIVE` | បានបើក (`!== "0"`) | `open-sse/executors/cursor.ts` | សេចក្តីណែនាំសម្រាប់ commit ឧបករណ៍ ដែលធ្វើឱ្យ composer-2.5 ចេញ tool calls បានយ៉ាងទៀងទាត់។ កំណត់ជា `0` ដើម្បីបិទ។ | | `OMNIROUTE_SYSTEM_INSTRUCTION_APPEND` | _(មិនបានកំណត់)_ | `open-sse/translator/request/claude-to-openai.ts`, `open-sse/translator/response/openai-to-claude.ts` | អត្ថបទ system prompt ដែលកំណត់ដោយប្រតិបត្តិករ ហើយត្រូវបានបន្ថែមទៅ system message បន្ទាប់ពីការបកប្រែ (post-translation injection) ដោយទៅដល់ codex/Responses និងផ្លូវ `/v1/messages`។ ក៏ត្រូវបានប្រើជាបុព្វបទសេចក្តីណែនាំដែលត្រូវដកចេញពីប្លុក system preamble ដែលត្រូវបាន echo ត្រឡប់មកវិញផងដែរ។ ទុកឱ្យមិនបានកំណត់ ដើម្បីបិទ។ | | `OMNIROUTE_STRIP_SYSTEM_PREAMBLE` | `0` (បិទ) | `open-sse/translator/response/openai-to-claude.ts`, `open-sse/utils/directivePreambleStripper.ts` | កំណត់ជា `1` ដើម្បីដកប្លុក system-prompt preamble ដែលត្រូវបាន echo ត្រឡប់មកវិញ ពីដើមនៃ stream openai→claude។ តាមលំនាំដើមគឺបិទ — heuristic ត្រូវបានរៀបចំឡើងតាមរចនាប័ទ្ម prose ភាសាអង់គ្លេស ហើយកែប្រែ response payload ដូច្នេះ ប្រសិនបើការឆ្លើយតបចាប់ផ្តើមដោយផ្នែកបែបនេះដោយស្របច្បាប់ ផ្នែកនោះនឹងត្រូវបាត់។ | | `CURSOR_IMAGE_FETCH_TIMEOUT_MS` | `15000` | `open-sse/utils/cursorImages.ts` | រយៈពេលអស់កំណត់ពេលសម្រាប់ការទាញយករូបភាពនីមួយៗ (មិល្លីវិនាទី) សម្រាប់ vision input `image_url` ពីចម្ងាយ។ | | `CURSOR_STATE_DB_PATH` | _(បានស្ទង់រក)_ | `open-sse/utils/cursorVersionDetector.ts` | បដិសេធការរកទីតាំង Cursor IDE state DB ដែលប្រើសម្រាប់រកឃើញកំណែ IDE។ | | `CURSOR_AGENT_CLI_VERSION` | _(រកឃើញ / កំណត់ជាក់លាក់)_ | `open-sse/utils/cursorAgentCliVersion.ts` | build id របស់ Agent CLI (`YYYY.MM.DD-`) សម្រាប់ `x-cursor-client-version: cli-…` នៅពេលដំណើរការ Agent។ | | `CURSOR_AGENT_BIN` | _(unset)_ | `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` | ច្រកកំណត់ចំនួនការងារដំណាលគ្នា ដែលប្រើកៅអីរួម សម្រាប់ការងារបង្កើតរូបភាពរបស់ Cursor។ | | `CURSOR_IMG_MODEL` | request / `auto` | `open-sse/handlers/imageGeneration/providers/cursorAgentImage.ts` | បដិសេធតម្លៃ `--model` របស់ Cursor CLI សម្រាប់ការងាររូបភាព។ | | `UC_IMAGE_POLL_INTERVAL_MS` | `2000` | `open-sse/handlers/imageGeneration/providers/ucImage.ts` | ចន្លោះពេលត្រួតពិនិត្យលទ្ធផលការបង្កើតរូបភាពរបស់ UC (uncensored.com) (ms)។ | | `UC_IMAGE_POLL_TIMEOUT_MS` | `60000` | `open-sse/handlers/imageGeneration/providers/ucImage.ts` | ពេលវេលានាឡិកាជាក់ស្តែងសម្រាប់ការត្រួតពិនិត្យលទ្ធផលការបង្កើតរូបភាពរបស់ UC (ms)។ | | `UC_VIDEO_POLL_INTERVAL_MS` | `3000` | `open-sse/handlers/videoGeneration/providers/ucVideo.ts` | ចន្លោះពេលត្រួតពិនិត្យលទ្ធផលការបង្កើតវីដេអូរបស់ UC (uncensored.com) (ms)។ | | `UC_VIDEO_POLL_TIMEOUT_MS` | `300000` | `open-sse/handlers/videoGeneration/providers/ucVideo.ts` | ពេលវេលានាឡិកាជាក់ស្តែងសម្រាប់ការត្រួតពិនិត្យលទ្ធផលការបង្កើតវីដេអូរបស់ UC (ms)។ | | `CURSOR_DATA_DIR` | _(probed)_ | `open-sse/utils/cursorAgentCliVersion.ts` | បដិសេធថតទិន្នន័យរបស់ Cursor Agent CLI (`…/versions/`); ជាអថេរដូចគ្នាដែល agent ផ្លូវការប្រើ។ | | `CURSOR_TOKEN` | _(unset)_ | `scripts/ad-hoc/cursor-tap.cjs` | bearer token របស់ Cursor ដោយផ្ទាល់ ដែលប្រើដោយឧបករណ៍សម្រាប់អ្នកអភិវឌ្ឍន៍។ | | `OMNIROUTE_LOG_REQUEST_SHAPE` | disabled (opt-in via `"1"`) | `src/app/api/v1/chat/completions/route.ts` | កត់ត្រាសញ្ញាសម្គាល់ប្រភេទមាតិកា/ប្រវែង សម្រាប់ payload ជជែកដែលមានទំហំធំ នៅពេលកំណត់ជា `"1"`។ បិទតាមលំនាំដើម ដើម្បីកាត់បន្ថយភាពរំខានក្នុងកំណត់ហេតុ។ | | `DEBUG_RESPONSES_SSE_TO_JSON` | _(unset)_ | `open-sse/handlers/responseTranslator.ts` | កំណត់ជា `true` ដើម្បីកត់ត្រាព័ត៌មានលម្អិតនៃការបកប្រែ Responses API SSE→JSON។ | | `DEBUG_CLAUDE_NONSTREAM` | _(unset)_ | `open-sse/handlers/responseTranslator.ts` | កំណត់ជា `true` ដើម្បីបង្ហាញ chunks ដែលមាន textContent ទទេ នៅក្នុងផ្លូវបកប្រែការឆ្លើយតបរបស់ Claude (សម្រាប់បំបាត់កំហុសប៉ុណ្ណោះ)។ | | `NEXT_PUBLIC_OMNIROUTE_E2E_MODE` | _(មិនបានកំណត់)_ | ប្រព័ន្ធសាកល្បង E2E | កំណត់ `true` ដើម្បីបើករបៀបសាកល្បង E2E (ការផ្ទៀងផ្ទាត់អត្តសញ្ញាណដែលបន្ធូរបន្ថយ, hooks សម្រាប់សាកល្បង)។ | --- ## ២៣. ការរួមបញ្ចូលជាមួយ GitHub អនុញ្ញាតឱ្យអ្នកប្រើរាយការណ៍បញ្ហាដោយផ្ទាល់ពីផ្ទាំងគ្រប់គ្រង។ | Variable | Default | Source File | Description | | --------------------- | --------- | --------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------- | | `GITHUB_ISSUES_REPO` | _(unset)_ | `src/app/api/v1/issues/report/route.ts` | ឃ្លាំងក្នុងទម្រង់ `owner/repo`។ | | `GITHUB_ISSUES_TOKEN` | _(unset)_ | `src/app/api/v1/issues/report/route.ts` | GitHub Personal Access Token ដែលមាន scope `issues:write`។ | | `GITHUB_TOKEN` | _(unset)_ | issue triage / cloud agent helpers | Generic GitHub access token ដែលប្រើជាតម្លៃបម្រុងសម្រាប់ `GITHUB_ISSUES_TOKEN` និងប្រើដោយ cloud agent helpers នៅក្នុង `src/lib/cloudAgent/*`។ | --- ## ការរក្សា Free-Tier របស់ Render ឱ្យដំណើរការ Render នឹងបិទសេវាកម្មបណ្ដាញឥតគិតថ្លៃ បន្ទាប់ពីប្រហែល ១៥ នាទីដែលគ្មានចរាចរណ៍ចូល។ កម្មវិធីបើកដំណើរការឯករាជ្យ (`scripts/dev/run-standalone.mjs` ដែល Docker image ដំណើរការ) អាចផ្ញើ ping ទៅកាន់ public URL របស់សេវាកម្មផ្ទាល់ ដើម្បី ទប់ស្កាត់ការបិទនោះ។ វាមិនធ្វើអ្វីឡើយ លុះត្រាតែមាន public URL ហើយវាកត់ត្រាតែនៅពេលស្ថានភាព មានការផ្លាស់ប្តូរ។ | Variable | Default | Description | | ---------------------------- | ------------------------ | ------------------------------------------------------------------------------------------------------------------------------ | | `SELF_PING_ENABLED` | បើកនៅពេលមាន URL | `0`, `false`, `off` ឬ `no` នឹងបិទ pinger។ ប្រើវានៅលើគម្រោង Render ដែលបង់ប្រាក់ ព្រោះវាមិនមានការបិទសេវាកម្មទេ។ | | `SELF_PING_URL` | `RENDER_EXTERNAL_URL` | Base URL សម្រាប់ផ្ញើ ping។ Render កំណត់ `RENDER_EXTERNAL_URL` ដោយខ្លួនឯងនៅគ្រប់គម្រោង ដូច្នេះ pinger នឹងបើកតាមលំនាំដើមនៅទីនោះ។ | | `SELF_PING_PATH` | `/api/monitoring/health` | Path នៅលើ URL នោះ។ ត្រូវតែចាប់ផ្តើមដោយ `/`; អ្វីផ្សេងទៀតនឹងបិទ pinger ដោយមានការព្រមាន។ | | `SELF_PING_INTERVAL_SECONDS` | `180` | ចំនួនវិនាទីរវាងការផ្ញើ ping បន្ទាប់ពីការផ្ញើ ping លើកដំបូងក្នុងរយៈពេល ៦០ វិនាទី។ តម្លៃក្រោម `30` នឹងត្រឡប់ទៅ `180`។ | សេវាកម្មដែលត្រូវបានរក្សាឱ្យដំណើរការពេញមួយខែ នឹងប្រើ instance hours ប្រហែល ៧៤៤ ដូច្នេះសូមពិនិត្យវាធៀបនឹង កូតា free-tier បច្ចុប្បន្នរបស់ Render។ ## សេណារីយ៉ូនៃការដាក់ឱ្យប្រើប្រាស់ សម្រាប់ការណែនាំ SRE អំពី backend របស់ relay (ឥរិយាបថ ts/bifrost/auto, ទីតាំង 9router និង CLIProxyAPI និងយុទ្ធសាស្ត្រ fallback សម្រាប់ចរាចរណ៍កម្រិតខ្ពស់) សូមមើល [យុទ្ធសាស្ត្រ Backend របស់ Relay](/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 ជាមួយ Reverse Proxy (nginx + Cloudflare) ```bash JWT_SECRET= API_KEY_SECRET= STORAGE_ENCRYPTION_KEY= PORT=20128 AUTH_COOKIE_SECURE=true REQUIRE_API_KEY=true NEXT_PUBLIC_BASE_URL=https://omniroute.example.com BASE_URL=http://127.0.0.1:20128 CORS_ORIGIN=https://omniroute.example.com ENABLE_TLS_FINGERPRINT=true CLI_COMPAT_ALL=1 ``` --- ## 24. បរិស្ថានសាកល្បង Skills (v3.8.0+) ដែនកំណត់ និងប៊ូតុងកំណត់សុវត្ថិភាពដែលបានអនុវត្ត នៅពេល Skills framework (`src/lib/skills/`) ដំណើរការអូតូម៉ាទិកដែលកំណត់ដោយអ្នកប្រើប្រាស់ ក្នុងបរិស្ថាន sandbox។ | Variable | Default | Source File | Description | | -------------------------------------- | -------------------------------------------- | ------------------------------------------------------------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `SKILLS_SANDBOX_TIMEOUT_MS` | `10000` (10 s) | `src/lib/skills/builtins.ts` | អស់ពេលអតិបរមាតាមនាឡិកាជញ្ជាំងសម្រាប់ការប្រតិបត្តិកូដជំនាញក្នុង sandbox នីមួយៗ។ ជាដែនកំណត់រឹង; អ្វីដែលយូរជាងនេះនឹងត្រូវបញ្ឈប់។ | | `SKILLS_EXECUTION_TIMEOUT_MS` | _(ត្រឡប់ទៅប្រើ `SKILLS_SANDBOX_TIMEOUT_MS`)_ | `src/lib/skills/` | អស់ពេលសម្រាប់ការរៀបចំដំណើរការជំនាញកម្រិតខ្ពស់។ កំណត់ឱ្យខ្ពស់ជាង `SKILLS_SANDBOX_TIMEOUT_MS` ដើម្បីអនុញ្ញាតឱ្យដំណើរការការងារច្រើនជំហាន។ | | `SKILLS_MAX_FILE_BYTES` | `1048576` (1 MB) | `src/lib/skills/builtins.ts` | ចំនួនបៃអតិបរមាដែលជំនាញអាចអានពីឯកសារ sandbox នីមួយៗ។ | | `SKILLS_MAX_HTTP_RESPONSE_BYTES` | `256000` (250 KB) | `src/lib/skills/builtins.ts` | ចំនួនបៃអតិបរមាដែលប្រមូលពីការឆ្លើយតប HTTP នីមួយៗនៅក្នុងជំនាញ។ | | `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។ តាមលំនាំដើមគឺ **ដាច់ដោយឡែក** ដើម្បីសុវត្ថិភាព។ មិនមានប្រសិទ្ធភាពជាមួយ runtime `agent-sandbox` ទេ៖ ការដាច់បណ្តាញ ប្រព័ន្ធឯកសារ root សម្រាប់អានតែប៉ុណ្ណោះ និងដែនកំណត់ CPU/អង្គចងចាំ ត្រូវបានផ្តល់ដោយ `SandboxTemplate` របស់ប្រតិបត្តិករ។ | | `SKILLS_ALLOWED_SANDBOX_IMAGES` | _(ទទេ)_ | `src/lib/skills/builtins.ts` | បញ្ជីអនុញ្ញាតដែលបំបែកដោយសញ្ញាក្បៀស សម្រាប់ image របស់ container ដែលអនុញ្ញាតឱ្យប្រតិបត្តិការ sandbox។ ទទេមានន័យថាប្រើតែលំនាំដើមដែលភ្ជាប់មកជាមួយ។ | | `SKILLS_SANDBOX_DOCKER_IMAGE` | _(លំនាំដើមដែលភ្ជាប់មកជាមួយ)_ | `src/lib/skills/` | image របស់ container ដែលប្រើនៅពេលបង្កើត sandbox ដែលដំណើរការដោយ Docker។ ប្តូរតម្លៃនេះដើម្បីកំណត់ image មូលដ្ឋានដែលបានពង្រឹងតាមតម្រូវការ។ | | `SKILLS_SANDBOX_RUNTIME` | `auto` | `src/lib/skills/sandbox.ts`, `src/lib/skills/containerProvider.ts` | runtime របស់ container សម្រាប់ sandbox ជំនាញ៖ `auto` \| `docker` \| `apple` \| `wsl` \| `orbstack` \| `podman` \| `agent-sandbox`។ `auto` ជ្រើស runtime ដែលបានដំឡើងល្អបំផុតតាមប្រព័ន្ធប្រតិបត្តិការរបស់ម៉ាស៊ីននីមួយៗ (Apple Container/OrbStack នៅលើ macOS, WSL Container នៅលើ Windows, Podman នៅលើ Linux) ហើយប្រើ Docker ជាជម្រើសបម្រុង។ `agent-sandbox` (ក្រុម warm pool របស់ Kubernetes ពីចម្ងាយ) ត្រូវជ្រើសរើសដោយបើកដោយចេតនាតែប៉ុណ្ណោះ ហើយមិនត្រូវបានរកឃើញដោយស្វ័យប្រវត្តិឡើយ។ | | `SKILLS_AGENT_SANDBOX_POOLS` | _(ទទេ)_ | `src/lib/skills/agentSandboxProvider.ts` | គូ `image=pool` ដែលបំបែកដោយសញ្ញាក្បៀស៖ `SandboxWarmPool` មួយណាបម្រើ image របស់ sandbox នីមួយៗ នៅពេល `SKILLS_SANDBOX_RUNTIME=agent-sandbox`។ | | `SKILLS_AGENT_SANDBOX_POOL` | _(ទទេ)_ | `src/lib/skills/agentSandboxProvider.ts` | warm pool ជាជម្រើសបម្រុងសម្រាប់ image ដែលមិនមានក្នុង `SKILLS_AGENT_SANDBOX_POOLS`។ ការដំណើរការនឹងបរាជ័យ (មិនត្រឡប់ទៅប្រើ container មូលដ្ឋានទេ) នៅពេលគ្មានជម្រើសណាមួយត្រូវបានដោះស្រាយ។ | | `SKILLS_AGENT_SANDBOX_NAMESPACE` | `default` | `src/lib/skills/agentSandboxProvider.ts` | Namespace ដែលផ្ទុក warm pool; `SandboxClaim` មួយសម្រាប់ការដំណើរការនីមួយៗនឹងត្រូវបានបង្កើត និងលុបនៅទីនេះ។ | | `SKILLS_AGENT_SANDBOX_KUBECONFIG` | _(លំនាំដើមរបស់ `kubectl`)_ | `src/lib/skills/agentSandboxProvider.ts` | Kubeconfig សម្រាប់ runtime `agent-sandbox`។ ត្រូវការតែសិទ្ធិ sandboxclaims create/get/list/watch/delete, pods get និង pods/exec create នៅក្នុង namespace ប៉ុណ្ណោះ។ | | `SKILLS_AGENT_SANDBOX_KUBECTL` | `kubectl` | `src/lib/skills/agentSandboxProvider.ts` | binary `kubectl` ដែលប្រើដោយ runtime `agent-sandbox`។ | | `SKILLS_AGENT_SANDBOX_CONTAINER` | `main` | `src/lib/skills/agentSandboxProvider.ts` | ឈ្មោះ Container នៅក្នុង sandbox pod ដែល commands ត្រូវបានប្រតិបត្តិ។ | | `SKILLS_AGENT_SANDBOX_CLAIM_TIMEOUT_S` | `60` | `src/lib/skills/agentSandboxProvider.ts` | ចំនួនវិនាទីដែលត្រូវរង់ចាំឱ្យ claim ក្លាយជា Ready (អតិបរមា 600)។ Claim នឹងត្រូវបានលុប ប្រសិនបើវាមិនដែលក្លាយជាស្ថានភាពនេះ។ | > [!CAUTION] > ការបើក `SKILLS_SANDBOX_NETWORK_ENABLED=true` នឹងបើកផ្លូវ egress ពី skill code ដែលមិនកំណត់ប្រភព។ ប្រើជាមួយ `OUTBOUND_SSRF_GUARD_ENABLED=true` និងគោលការណ៍ `CORS_ORIGIN`/proxy ដ៏តឹងរ៉ឹង នៅក្នុងការដាក់ឱ្យប្រើប្រាស់រួមគ្នា។ --- ## 25. កូតាអ្នកផ្តល់សេវា, Tunnels, ការបម្រុងទុក និង Runtime ផ្សេងៗ ការលុបចោល fallback នៃ session-affinity របស់ Redis (ជ្រើសបើកប្រើប៉ុណ្ណោះ; លំនាំដើមរបស់ SQLite មិនត្រូវបានផ្លាស់ប្តូរ)៖ affinity store នីមួយៗរបស់ Redis អនុញ្ញាតឱ្យមានប្រតិបត្តិការដែលកំពុងរង់ចាំបានយ៉ាងច្រើន 8; នៅពេលពេញសមត្ថភាព ការហៅប្រើ SQLite ភ្លាមៗ ហើយ slot នៅតែត្រូវបានកាន់កាប់ រហូតដល់ការងារមូលដ្ឋានរបស់ Redis បញ្ចប់ ទោះបីផុតកំណត់ពេល 100 ms របស់អ្នកហៅរួចក៏ដោយ។ - R1. រាល់ការឆ្លើយតបពី Redis ដែលមកដល់ទាន់ពេលសម្រាប់ប្រតិបត្តិការ session គឺជាប្រភពអធិបតេយ្យ៖ ការកែប្រែដែលត្រូវបានទទួលយក, CAS ដែលត្រូវបានបដិសេធ/បាត់បង់, keys ដែលមិនមាន, ការលុប keys ដែលអវត្តមាន និងការរកឃើញឬមិនរកឃើញក្នុងការបណ្តេញចេញ នឹងសម្អាតជួរ fallback មូលដ្ឋានរបស់ session នោះដោយសមកាលកម្ម ដោយគ្មាន await នៅចន្លោះការឆ្លើយតប និងការសម្អាត។ ការសម្អាតនេះមានសុវត្ថិភាព (អតិបរមាគឺមានការជ្រើសរើសឡើងវិញម្តងក្នុងពេលមានការដាច់សេវានៅពេលក្រោយ); ជួរដែលចាស់ទើបមិនមានសុវត្ថិភាព។ - R2. ប្រតិបត្តិការដែលអស់ពេល ឬមានកំហុស ហើយសរសេរ fallback មូលដ្ឋាន នឹងកត់ត្រាអ្វីដែលវាបានសរសេរ ជាបៃដែលបាន serialize ពិតប្រាកដ។ ប្រសិនបើពាក្យបញ្ជា Redis របស់វាបញ្ចប់យឺត ការប្រៀបធៀប-ហើយលុបរបស់ SQLite ដោយសមកាលកម្ម នឹងសម្អាតតែជួរដែលមានបៃដូចគ្នាបេះបិទនោះប៉ុណ្ណោះ មិនដែលលុបតាមគណនី ឬការផ្គូផ្គងការតភ្ជាប់ឡើយ។ ការសរសេរថ្មីជាងនេះក្នុងពេលមានការដាច់សេវា នឹងនៅរក្សាទុក។ - R3. ការបណ្តេញចេញតែងតែលុប local pin របស់គណនីដែលបរាជ័យ រួមទាំងក្នុងពេលមានការដាច់សេវា; បន្ទាប់មក ការដោះស្រាយការឆ្លើយតបរបស់វាអនុវត្តតាម R1/R2។ Redis ដែលមានសុខភាពល្អ មិនដែលសរសេរ local pins ឡើយ៖ មិនមាន mirror ឬបញ្ជីកំណត់លំដាប់ទេ ហើយ instance នានាអាចមានស្ថានភាពខុសគ្នាក្នុងពេលមានការដាច់សេវា។ endpoint កូតារបស់អ្នកផ្តល់សេវា, network tunnels (Tailscale, Ngrok, MITM debug proxy), egress pool របស់ 1Proxy, ការបម្រុងទុកមូលដ្ឋានទិន្នន័យ និងការកំណត់ជំនួសតូចៗតាម feature ដែលត្រូវបានយោងដោយស្រទាប់ executor ឬស្គ្រីប។ | អថេរ | តម្លៃលំនាំដើម | ឯកសារប្រភព | សេចក្ដីពិពណ៌នា | | ---------------------------------------------- | --------------------------------------------------------------------------- | ------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | `OMNIROUTE_SESSION_AFFINITY_STORE` | `sqlite` | `src/lib/db/sessionAffinity/storeFactory.ts` | Backend សម្រាប់ភាពស្អិតរមួតរវាង session និង account។ មានតែ `redis` រួមជាមួយ `REDIS_URL` ដែលបានកំណត់ប៉ុណ្ណោះ ទើបអាចបើកការចែករំលែកបាន។ តម្លៃដែលមិនបានកំណត់ ឬមិនស្គាល់ ឬការកំណត់ Redis ដែលបាត់ នឹងប្រើ SQLite។ ត្រូវការតម្លៃ `sessionAffinityTtlMs` ដែលវិជ្ជមាន។ ការកំណត់ផ្លូវតាម Redis រក្សាទុកអត្តសញ្ញាណ usage-account ដែលបាន hash រួមជាមួយ connection ID។ ការកំណត់ផ្លូវតាម SQLite លំនាំដើម រក្សាទម្រង់ JSON ចាស់ដែលមានបួន field។ ផ្គូផ្គងអត្តសញ្ញាណនៅក្នុង local pool ដែលមានសិទ្ធិប្រើប្រាស់ មុនពេលផ្គូផ្គងតាម ID។ ប្រើ `REDIS_KEY_PREFIX` របស់ client ដែលបានចែករំលែក តម្លៃ JSON និង TTL `PX`។ ការកែប្រែប្រៀបធៀបជាមួយតម្លៃដែលបានសង្កេតឃើញពិតប្រាកដ។ ការឆ្លើយតបពី Redis ដែលមានសុខភាពល្អ នឹងធ្វើឱ្យ local outage fallback អសកម្ម ហើយការឆ្លើយតបដែលមកដល់យឺត អាចសម្អាតបានតែ row fallback ដែលបាន serialize ពិតប្រាកដ ដែលត្រូវបានសរសេរដោយប្រតិបត្តិការដែលអស់ពេលនោះប៉ុណ្ណោះ។ pins ដែលបាន prefetch នឹងត្រូវបានផ្ទៀងផ្ទាត់ឡើងវិញនៅពេលប្រើ។ កំហុស Redis ការអស់ពេល ឬការកកស្ទះនៅពេលទទួលយក នឹង fallback ទៅ SQLite ជាមួយការព្រមានដែលកំណត់អត្រា (កំណត់ 100 ms ក្នុងមួយការហៅ store)។ ករណី Redis មិនរកឃើញដោយជោគជ័យ នឹងមិនអាន shadow ទេ។ វាមិនចែករំលែក combo stickiness, native Codex turn pins, account concurrency, lockouts ឬ spend limits ទេ។ | | `REDIS_URL` | `redis://localhost:6379` | `src/shared/utils/rateLimiter.ts` | ខ្សែអក្សរតភ្ជាប់ Redis សម្រាប់ backend កំណត់អត្រា។ | | `ALIBABA_CODING_PLAN_HOST` | _(host ផលិតកម្ម)_ | `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 សម្រាប់ session កុងសូលរបស់ gateway កូតា Token Plan ផ្ទាល់ខ្លួនរបស់ Qwen Cloud / Model Studio (inference API key មិនអាចអានវាបានទេ)។ ចម្លង header សំណើ `Cookie` ទាំងមូល — វាមាន `login_qwencloud_ticket` — ពីការហៅ `api.json` ណាមួយទៅ `cs-data.qwencloud.com` នៅលើ home.qwencloud.com › Billing › Subscription (F12 › Network)។ មានព័ត៌មានរសើប និងស្ថិតតាម session; គួរប្រើ field `qwenCloudCookie` តាម connection នៅក្នុង Dashboard ជាចម្បង។ | | `QWEN_CLOUD_SEC_TOKEN` | _(មិនបានកំណត់)_ | `open-sse/services/qwenTokenPlanQuotaFetcher.ts` | បដិសេធ `sec_token` ដោយដៃសម្រាប់ gateway កុងសូល Token Plan។ មានព័ត៌មានរសើប; នៅពេលមិនបានកំណត់ fetcher នឹងដោះស្រាយវាពី 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` សម្រាប់កុងសូល 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` | ខូគីសម័យរបស់កុងសូលសម្រាប់ API កូតា Token Plan របស់ Xiaomi MiMo (`platform.xiaomimimo.com/api/v1/tokenPlan/usage` + `tokenPlan/detail` — inference API key មិនអាចអានវាបានទេ)។ ចម្លង header សំណើ `Cookie` ទាំងមូល — វាមាន `api-platform_serviceToken` និង `userId` — ពីសំណើណាមួយទៅកាន់ `platform.xiaomimimo.com` នៅលើទំព័រ Token Plan (F12 › បណ្តាញ)។ មានព័ត៌មានរសើប និងកំណត់តាមសម័យ។ គួរប្រើវាល Dashboard `xiaomiMimoConsoleCookie` តាមការតភ្ជាប់នីមួយៗ។ | | `XIAOMI_MIMO_MONTHLY_TOKEN_LIMIT` | `4100000000` | `open-sse/services/usage/xiaomi-mimo.ts` | ថវិកាប្រចាំខែ (ឥណទាន) សម្រាប់ Xiaomi MiMo fallback ដែល OmniRoute តាមដាន ប្រើនៅពេលមិនបានកំណត់ខូគីកុងសូល។ តម្លៃលំនាំដើមគឺ 4.1B របស់កម្រិត Lite; កំណត់វាទៅជាចំនួនឥណទានរបស់គម្រោង (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` | ការបដិសេធផ្លូវផ្នែកខាងមុខរបស់កុងសូល សម្រាប់ទាញកូតា vision/media កម្រិតឥតគិតថ្លៃរបស់ Alibaba Model Studio។ | | `ALIBABA_FREE_TIER_MULTIMODAL_FE_PATH` | `/costing-balance/free-quota-multimodal` | `open-sse/services/alibabaFreeTierQuotaFetcher.ts` | ការបដិសេធផ្លូវផ្នែកខាងមុខរបស់កុងសូល សម្រាប់ទាញកូតា multimodal កម្រិតឥតគិតថ្លៃរបស់ Alibaba Model Studio។ | | `ALIBABA_FREE_TIER_AUDIO_FE_PATH` | `/costing-balance/free-quota-audio` | `open-sse/services/alibabaFreeTierQuotaFetcher.ts` | ការបដិសេធផ្លូវផ្នែកខាងមុខរបស់កុងសូល សម្រាប់ទាញកូតា audio កម្រិតឥតគិតថ្លៃរបស់ Alibaba Model Studio។ | | `ALIBABA_FREE_TIER_ALLOWLIST_PATH` | _(មិនបានកំណត់)_ | `open-sse/services/alibabaFreeTierAllowlist.ts` | ផ្លូវជាជម្រើសទៅកាន់ការបដិសេធក្នុង JSON មូលដ្ឋាន សម្រាប់បញ្ជីអនុញ្ញាតម៉ូដែលអត្ថបទកម្រិតឥតគិតថ្លៃរបស់ Alibaba ដែលមានស្រាប់។ ប្រសិនបើមិនមាន នឹងប្រើ `$DATA_DIR/alibaba-free-tier-allowlist.json` បន្ទាប់មក `config/alibaba-free-tier-allowlist.json`។ | | `CONTEXT_RESERVE_TOKENS` | `1024` | `open-sse/services/contextManager.ts` | ថូខឹនដែលបានបម្រុងទុកសម្រាប់លទ្ធផលបញ្ចប់ នៅពេលគណនាថវិកា prompt។ | | `CONTEXT_KEEP_LATEST_IMAGES` | `2` | `open-sse/services/contextManager.ts` | ចំនួនរូបភាព inline ថ្មីបំផុតដែលត្រូវរក្សាទុក នៅពេលលុបរូបភាពចាស់ៗ ដើម្បីឱ្យសមនឹងបង្អួចបរិបទ (#8560)។ | | `MODEL_ALIAS_COMPAT_ENABLED` | enabled | `open-sse/services/model.ts` | បិទ/បើកស្រទាប់ភាពឆបគ្នាជាមួយឈ្មោះកាត់ model ចាស់ ដែលប្រើដោយ client ចាស់ៗ។ | | `OMNIROUTE_EMERGENCY_FALLBACK` | enabled | `open-sse/services/emergencyFallback.ts` | កំណត់ជា `false` (ឬ `0`) ដើម្បីបិទ fallback ពេលថវិកាអស់ជាបន្ទាន់ ដែលបញ្ជូនសំណើដែលបរាជ័យឡើងវិញទៅកាន់ model `nvidia`/`nvidia/nemotron-3.5-super-vl-120b-a12b` ឥតគិតថ្លៃ។ លំដាប់អាទិភាពមាន Feature Flags DB override > env var > default; ប្រសិនបើមិនអាចប្រើបាន សេវានឹង fallback ទៅតម្លៃ env ដើម។ | | `COMMAND_CODE_CALLBACK_PORT` | _(unset)_ | `src/app/api/providers/command-code/auth/shared.ts` | ច្រក local ដែលប្រើសម្រាប់ callback រចនាប័ទ្ម 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 របស់ឧបករណ៍ទាញយកកូតាតាម smartphone។ ប្តូរតម្លៃនេះសម្រាប់ Command Code API ដែលរៀបចំដោយខ្លួនឯង/ជម្រើសផ្សេង។ | | `MITM_LOCAL_PORT` | `443` | `src/mitm/server.cjs` | ច្រក bind local សម្រាប់ MITM debug proxy។ | | `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 ដែលទំនេរ (មិល្លីវិនាទី) នៃការតភ្ជាប់ដែលបានប្រូកស៊ី; socket ដែលទំនេរលើសរយៈពេលនេះ នឹងត្រូវបិទ ដើម្បីជៀសវាងការលេចធ្លាយ tunnel ដែលបើកតែម្ខាង។ | | `BRIDGE_PORT` | `20129` | `bin/antigravity-bridge.mjs` | ច្រកដែលស្ពាន Antigravity MITM ទទួលការតភ្ជាប់។ | | `ROUTER_URL` | `http://127.0.0.1:20128/v1/antigravity` | `bin/antigravity-bridge.mjs` | ចំណុចបញ្ចប់របស់ Router ដែលស្ពានបញ្ជូនចរាចរណ៍ Antigravity ទៅ។ | | `CERT_DIR` | `/mitm` | `bin/antigravity-bridge.mjs` | បដិសេធថតដែលស្ពានអានសម្ភារៈ TLS របស់វាពីទីនោះ។ ម៉ូដែលវិញ្ញាបនបត្រត្រូវបានជ្រើសដូចដែលម៉ាស៊ីនមេ AgentBridge ធ្វើ៖ `server.crt`/`server.key` សម្រាប់ការដំឡើង leaf ចាស់ ឬ `ca.crt`/`ca.key` (root CA, leaf មួយសម្រាប់ host នីមួយៗដែលត្រូវបានស្ទាក់ចាប់; បង្ខំដោយ `MITM_ROOT_CA_ENABLED=true`)។ ស្ពាននឹងបិទនៅពេលចាប់ផ្ដើម ប្រសិនបើឯកសារសម្រាប់ម៉ូដែលសកម្មបាត់។ | | `MITM_VERBOSE` | `1` | `src/mitm/server.cjs`, `src/mitm/_internal/bypass.cjs` | កម្រិតលម្អិតនៃកំណត់ហេតុសេចក្ដីសម្រេច routing៖ `0` បិទកំណត់ហេតុ ខណៈតម្លៃខ្ពស់ជាងនេះកត់ហេតុសេចក្ដីសម្រេច 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 សម្រាប់ដំណើរការ proxy ដែលបានបង្កើត (`root-ca` \| `legacy`) — ឆ្លុះបញ្ចាំងពីសេចក្ដីសម្រេចនៃការផ្លាស់ប្ដូរវិញ្ញាបនបត្រ; មិនមានបំណងឱ្យកំណត់ដោយដៃទេ។ | | `OMNIROUTE_NO_SUDO` | `0` | `src/mitm/systemCommands.ts` | កំណត់ `1` (មានតម្លៃពិត) ដើម្បីដក `sudo` ដែលនៅខាងមុខចេញពីពាក្យបញ្ជាទុកចិត្តវិញ្ញាបនបត្រ MITM — សម្រាប់ការដាក់ពង្រាយដែលគ្មាន root / ប្រើ user namespace ដែលប្រតិបត្តិករទុកចិត្ត CA ដោយដៃ (ឧ. តាមរយៈយន្តការ extra-CA-certs របស់ Node)។ | | `SKIP_ANTIGRAVITY_DNS` | _(unset)_ | `src/mitm/dns/provision.ts` | កំណត់ `true` ដើម្បីរំលងការផ្ដល់ធាតុ DNS ក្នុង `/etc/hosts` សម្រាប់ឈ្មោះម៉ាស៊ីន Antigravity proxy ទាំងស្រុង — សម្រាប់ container ដែលមិនមាន sudo/root។ | | `OMNIROUTE_SKIP_DNS_WRITE` | _(unset)_ | `src/mitm/dns/dnsConfig.ts` | កំណត់ `1` ដើម្បីរំលងការសរសេរទៅ hosts file នៅពេលបន្ថែម/លុបធាតុ DNS — សម្រាប់បរិស្ថានសាកល្បងដែលមាន sandbox ឬអានបានតែប៉ុណ្ណោះ។ | | `OMNIROUTE_SKIP_SYSTEM_TRUST` | `0` | `src/mitm/cert/install.ts`, `src/mitm/tproxy/caTrust.ts` | ការការពារសម្រាប់តែ Test/CI៖ កំណត់ `1` ដើម្បីឱ្យការដំឡើង/លុបការទុកចិត្តវិញ្ញាបនបត្រ មិនធ្វើអ្វីឡើយ ដូច្នេះ suite មិនដែលកែប្រែឃ្លាំងទុកចិត្តរបស់ OS ទេ។ ត្រូវបានកំណត់ដោយស្វ័យប្រវត្តិដោយការរៀបចំ test និង CI workflows។ | | `CHANGELOG_BASE_REF` | _(auto)_ | `scripts/check/check-changelog-integrity.mjs` | ឯកសារយោងមូលដ្ឋានជាក់លាក់សម្រាប់ anti CHANGELOG-eat gate (តាមលំនាំដើមគឺ PR base branch ក្នុង CI ឬ `release/v*` ដែលមានលេខខ្ពស់បំផុត)។ | | `FREE_PROXY_AUTO_SYNC_ENABLED` | `false` | `src/lib/freeProxyProviders/scheduler.ts` | កំណត់ `true` ដើម្បីបើកកម្មវិធីកំណត់ពេលធ្វើសមកាលកម្មស្វ័យប្រវត្តិនៃបណ្តុំ free-proxy នៅផ្ទៃខាងក្រោយ។ ត្រូវជ្រើសបើកដោយខ្លួនឯង និងបិទតាមលំនាំដើម។ | | `FREE_PROXY_AUTO_SYNC_INTERVAL_MS` | `1800000` | `src/lib/freeProxyProviders/scheduler.ts` | ចន្លោះពេលធ្វើសមកាលកម្មស្វ័យប្រវត្តិ គិតជាមិល្លីវិនាទី (តាមលំនាំដើម 30 នាទី)។ | | `FREE_PROXY_1PROXY_ENABLED` | `true` | `src/lib/freeProxyProviders/oneproxy.ts` | បើកប្រភព free proxy 1proxy។ កំណត់ជា `false` ដើម្បីបិទ។ | | `FREE_PROXY_1PROXY_API_URL` | _(see 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 មូលដ្ឋាន API របស់ Vercel (សម្រាប់ការធ្វើតេស្ត)។ | | `NEXT_PUBLIC_VERCEL_RELAY_DEFAULT_PROJECT` | `omniroute-relay` | `src/app/(dashboard)/…/VercelRelayModal.tsx` | ឈ្មោះគម្រោងលំនាំដើមដែលបានបំពេញជាមុននៅក្នុងប្រអប់ម៉ូឌុលដាក់ឱ្យដំណើរការ Vercel Relay។ | | `TAILSCALE_BIN` | _(រកឃើញដោយស្វ័យប្រវត្តិ)_ | `src/lib/tailscaleTunnel.ts` | ផ្លូវជាក់លាក់ទៅកាន់ឯកសារប្រតិបត្តិ `tailscale`។ | | `TAILSCALED_BIN` | _(auto-detect)_ | `src/lib/tailscaleTunnel.ts` | ផ្លូវជាក់លាក់ទៅកាន់ binary daemon `tailscaled`។ | | `TAILSCALE_AUTHKEY` | _(unset)_ | `src/lib/tailscaleTunnel.ts` | សោផ្ទៀងផ្ទាត់ Tailscale ដែលបានចែករំលែកជាមុន សម្រាប់ `tailscale up` ដែលមិនត្រូវការអន្តរកម្ម / headless (បញ្ជូនតាម `--auth-key=`)។ នៅពេលមិនបានកំណត់ ការចូលប្រើនឹងប្តូរទៅ URL ផ្ទៀងផ្ទាត់តាម browser ដែលត្រូវការអន្តរកម្ម។ | | `NGROK_AUTHTOKEN` | _(unset)_ | `src/lib/ngrokTunnel.ts` | ផ្ទៀងផ្ទាត់ tunnel ngrok សម្រាប់ការតភ្ជាប់ចេញ។ | | `DB_BACKUP_MAX_FILES` | `20` | `src/lib/db/backup.ts` | ចំនួនអតិបរមានៃឯកសារបម្រុងទុក SQLite ដែលត្រូវរក្សាទុកដោយការសម្អាតការបម្រុងទុកដោយដៃ/តាមកាលវិភាគ។ Snapshot នៃការធ្វើ migration ត្រូវបានកំណត់អត្តសញ្ញាណតាមមាតិកា និងប្រើឡើងវិញសម្រាប់ស្ថានភាព DB ដូចគ្នា ដូច្នេះវាមិនត្រូវបានលុបចេញនៅក្នុងបង្អួច migration ដែលដំណើរការស្របគ្នានោះទេ។ បដិសេធតម្លៃដែលបានរក្សាទុកពី ការកំណត់ → ការរក្សាទុកការបម្រុងទុកមូលដ្ឋានទិន្នន័យ។ | | `DB_BACKUP_RETENTION_DAYS` | `0` | `src/lib/db/backup.ts` | អាយុកាលអតិបរមា (ថ្ងៃ) ដែលត្រូវរក្សាទុកដោយការសម្អាតការបម្រុងទុកដោយដៃ/តាមកាលវិភាគ។ `0` បិទការលុបចេញតាមអាយុកាល។ Snapshot នៃការធ្វើ migration មិនត្រូវបានលុបចេញនៅក្នុងបង្អួច migration ដែលដំណើរការស្របគ្នានោះទេ។ បដិសេធតម្លៃដែលបានរក្សាទុកពី ការកំណត់ → ការរក្សាទុកការបម្រុងទុកមូលដ្ឋានទិន្នន័យ។ | | `OMNIROUTE_BACKUP_SCHEDULE_JOB_INTERVAL_MS` | `30000` | `src/lib/jobs/backupScheduleJob.ts` | ចន្លោះពេល tick (ms) នៃ job ខាង server ដែលប្រតិបត្តិ `backup-schedule.json`។ ត្រូវរក្សាឱ្យទាបជាង granularity 1 នាទីរបស់ cron យ៉ាងច្រើន; តម្លៃក្រោម `5000` ឬតម្លៃដែលមិនអាច parse បាន នឹងត្រឡប់ទៅ `30000`។ | | `CONTAINER_HOST` | `docker` | `scripts/check-permissions.sh` | ព័ត៌មានជំនួយអំពី runtime របស់ container សម្រាប់ការត្រួតពិនិត្យសិទ្ធិរបស់ entrypoint។ កំណត់ជា `podman` សម្រាប់ topology ណាមួយដែលប្រើ Podman។ ដោយសារ container មិនអាចកំណត់ថា engine ដំណើរការក្នុងមូលដ្ឋាន ឬចូលប្រើតាម Podman Machine បាន ការព្រមាននឹងនៅតែអព្យាក្រឹតចំពោះ topology ហើយចង្អុលទៅ `contrib/podman/README.md`។ | | `QUOTA_STORE_DRIVER` | `sqlite` | `src/lib/quota/storeFactory.ts` | backend សម្រាប់ផ្ទុកការប្រើប្រាស់ quota-share៖ `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 នឹងចូលទៅក្នុង strict mode (មិនអនុញ្ញាតឱ្យខ្ចី)។ | | `QUOTA_SOFT_DEPRIORITIZE_FACTOR` | `0.7` | `open-sse/services/combo.ts` | មេគុណពិន្ទុ (0..1) ដែលអនុវត្តចំពោះគោលដៅ នៅពេលគោលការណ៍ soft quota បន្ថយអាទិភាពរបស់វា។ | | `STATUS_SOFT_DEPRIORITIZE_FACTOR` | `0.5` | `open-sse/services/combo/autoStrategy.ts` | មេគុណពិន្ទុ (0..1) ដែលអនុវត្តចំពោះ provider ដែលប្រើអស់ (`credits_exhausted`/`rate_limited`) ក្នុងការផ្តល់ពិន្ទុ auto-combo នៅពេល preflight quota cutoff ត្រូវបានបិទ (#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` | ជម្រើសបើកដោយស្ម័គ្រចិត្ត (តម្លៃលំនាំដើម OFF)៖ បើក hard quota cutoff សម្រាប់ auto-routing ដែលដកបេក្ខជនដែលមាន quota ទាបចេញ មុនពេលផ្តល់ពិន្ទុ។ វាកំណត់តម្លៃលំនាំដើមប៉ុណ្ណោះ៖ តម្លៃ boolean ដែលបានរក្សាទុកក្នុង `resilienceSettings` (ផ្ទាំងគ្រប់គ្រង → ការកំណត់ → ភាពធន់) មានអាទិភាពជាង។ | | `OMNIROUTE_AUTO_FREE_FALLBACK_TO_FULL_POOL` | `false` | `open-sse/services/autoCombo/virtualFactory.ts` | ជម្រើសបើកដោយស្ម័គ្រចិត្ត (តម្លៃលំនាំដើម OFF)៖ នៅពេលតម្រង `auto/:` មិនផ្គូផ្គងនឹងបេក្ខជនដែលបានភ្ជាប់ណាមួយទេ នឹងស្ដារឥរិយាបថចាស់ដែលប្តូរទៅប្រើ pool ពេញលេញ (មិនបានច្រោះ) ជំនួសឱ្យការបញ្ជូន pool ទទេ។ តម្លៃលំនាំដើម OFF ធ្វើឱ្យ `:free` មានន័យថា "តែកម្រិតឥតគិតថ្លៃប៉ុណ្ណោះ"។ | | `OMNIROUTE_CHAOS_MAX_PANEL` | `5` | `open-sse/services/autoCombo/virtualFactory.ts` | កម្រិតអតិបរមានៃទំហំ panel (កំណត់ក្នុងចន្លោះ 1–10) សម្រាប់ broadcast 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` | អស់ពេលកំណត់ (មិល្លីវិនាទី) សម្រាប់ការផ្សាយទៅកាន់អ្នកទទួលទាំងអស់នៃបន្ទះ 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 ទៅកាន់ upstream របស់ 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` | _(unset)_ | `src/lib/inspector/captureState.ts` | ឈ្មោះម៉ាស៊ីនបន្ថែម (បំបែកដោយសញ្ញាក្បៀស) ដែលត្រូវបានចាត់ទុកជា endpoint របស់ LLM សម្រាប់ការចាប់យក។ | | `INSPECTOR_MASK_SECRETS` | `true` | `src/mitm/inspector/buffer.ts` | លាក់អាថ៌កំបាំង (បឋមកថាផ្ទៀងផ្ទាត់ / API keys) នៅក្នុងចរាចរណ៍ដែលបានចាប់យក។ | | `INSPECTOR_SYSTEM_PROXY_GUARD_MINUTES` | `30` | `src/app/api/tools/traffic-inspector/capture-modes/system-proxy/route.ts` | ចំនួននាទីមុនពេលអ្នកការពារ system-proxy ប្តូរការកំណត់ប្រូកស៊ីរបស់ OS ត្រឡប់ដោយស្វ័យប្រវត្តិ។ | | `INSPECTOR_INTERNAL_INGEST_TOKEN` | _(auto)_ | `src/app/api/tools/traffic-inspector/internal/ingest/route.ts` | Token សម្រាប់ផ្ទៀងផ្ទាត់ការបញ្ចូលទិន្នន័យចាប់យកខាងក្នុងទៅកាន់ inspector។ | | `PLAYGROUND_COMPARE_MAX_COLUMNS` | `4` | `src/app/(dashboard)/dashboard/playground/` | ចំនួនអតិបរមានៃជួរឈរដាក់បង្ហាញទន្ទឹមគ្នា ក្នុងរបៀបប្រៀបធៀបរបស់ Playground។ | | `PLAYGROUND_IMPROVE_PROMPT_DEFAULT_MODEL` | _(unset)_ | `src/app/(dashboard)/dashboard/playground/` | ម៉ូដែលលំនាំដើមសម្រាប់សកម្មភាព 'កែលម្អប្រអប់បញ្ចូល' របស់ Playground (ប្រើម៉ូដែលសកម្ម ប្រសិនបើមិនបានកំណត់)។ | | `BIFROST_ENABLED` | `1` | `src/app/api/v1/relay/chat/completions/bifrost/route.ts` | កុងតាក់បិទជាសកលសម្រាប់ប្រូកស៊ី sidecar របស់ bifrost។ នៅពេលកំណត់ជា `0` route នឹងត្រឡប់ 503 ជាមួយបឋមកថា `X-Bifrost-Killswitch` ហើយបញ្ជូន operator ទៅកាន់ផ្លូវ TS។ ប្រើសម្រាប់បិទ sidecar ដោយមិនចាំបាច់ដាក់ពង្រាយឡើងវិញ (ឧបទ្ទវហេតុ tier-1 router ឬការប្តូរ key)។ | | `BIFROST_BASE_URL` | _(unset)_ | `src/app/api/v1/relay/chat/completions/bifrost/route.ts` | នៅពេលកំណត់ route ប្រូកស៊ី sidecar របស់ Bifrost នឹងបញ្ជូនចរាចរណ៍ `/v1/chat/completions` ទៅកាន់ gateway របស់ Go នេះ ជំនួសឱ្យ relay handler របស់ TS។ មិនបានកំណត់ → 503-with-fallback។ សញ្ញា slash នៅខាងចុងត្រូវបានដកចេញ។ | | `BIFROST_PORT` | `8080` | `src/lib/services/bootstrap.ts` | ច្រកដែលសេវា Bifrost ដែលបានត្រួតពិនិត្យភ្ជាប់ទៅ (`127.0.0.1:`) នៅពេល OmniRoute គ្រប់គ្រងវដ្តជីវិតរបស់ sidecar Bifrost។ លំនាំដើមគឺ `8080`។ | | `SINGBOX_PORT` | `20140` | `src/lib/services/bootstrap.ts` | ច្រកដែលសេវា sing-box ដែលបានត្រួតពិនិត្យភ្ជាប់ទៅ (`127.0.0.1:`) នៅពេល OmniRoute គ្រប់គ្រងវដ្តជីវិតរបស់ sidecar sing-box។ លំនាំដើមគឺ `20140`។ | | `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 មូលដ្ឋានសម្រាប់ដេមិន microservice HTTP បង្រួម LLMLingua ក្នុងមូលដ្ឋាន។ លំនាំដើមគឺ `http://127.0.0.1:20135`។ | | `LLMLINGUA_MODEL` | `atjsh/llmlingua-2-js-tinybert-meetingbank` | `src/lib/services/installers/llmlingua.ts` | លេខសម្គាល់ម៉ូដែល Hugging Face ដែល sidecar LLMLingua ដែលបានត្រួតពិនិត្យផ្ទុក (បញ្ជូនទៅ child process env)។ | | `BIFROST_API_KEY` | _(unset)_ | `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 route sidecar Bifrost នឹងបញ្ជូនចម្លើយត្រឡប់តាម SSE តាមរយៈ gateway ជំនួសឱ្យកម្មវិធីប្រតិបត្តិការស្ទ្រីម TS។ កំណត់ទៅ `0` ដើម្បីបង្ខំឱ្យចម្លើយ JSON ដែលមិនមែនជាស្ទ្រីមឆ្លងកាត់ gateway។ | | `BIFROST_TIMEOUT_MS` | `30000` | `src/app/api/v1/relay/chat/completions/bifrost/route.ts` | អស់ពេលកំណត់ក្នុងមួយសំណើ នៅពេលធ្វើ proxy ទៅ gateway Bifrost (ms)។ នៅពេលអស់ពេល route នឹងត្រឡប់ទៅផ្លូវ relay TS តាមរយៈ header `X-Bifrost-Fallback`។ | | `OMNIROUTE_BIFROST_KEY` | _(unset)_ | `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` = relay របស់ TypeScript (លំនាំដើម នៅពេល Bifrost មិនទាន់បានកំណត់រចនាសម្ព័ន្ធ);`auto` ជ្រើសរើស Bifrost នៅពេល `BIFROST_BASE_URL` ត្រូវបានកំណត់ និង `BIFROST_ENABLED` ≠ `0` ហើយប្តូរត្រឡប់ទៅ TS ដោយស្វ័យប្រវត្តិ ប្រសិនបើ sidecar មិនអាចចូលប្រើបាន;`bifrost` បង្ខំឱ្យប្រើ Bifrost (តឹងរ៉ឹង មិនមានការប្តូរត្រឡប់)។ Auth/rate-limit/injection-guard/allowlist តែងតែដំណើរការជាមុននៅក្នុង Next route។ ការឆ្លើយតបមាន `X-Routing-Backend` / `X-Routing-Fallback` / `X-Routing-Fallback-Reason`។ | | `RELAY_ROUTING_BACKEND` | _(unset)_ | `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` | _(unset)_ | `bin/cli/commands/serve.mjs` | ផ្លូវទៅកាន់វិញ្ញាបនបត្រ PEM TLS សម្រាប់បម្រើ `omniroute serve` តាម HTTPS (ស្មើនឹង `--tls-cert`)។ ត្រូវប្រើជាមួយ `OMNIROUTE_TLS_KEY`;បន្ទាប់មក standalone server នឹងបញ្ចប់ TLS នៅលើ listener ដដែល (`wss://` ដំណើរការដោយមិនមានការផ្លាស់ប្តូរ)។ មិនកំណត់ → HTTP ធម្មតា។ ប្រសិនបើផ្តល់តែ cert ឬ key មួយ ឬផ្លូវមិនអាចអានបាន នឹងកត់ត្រាការព្រមាន ហើយបន្តប្រើ HTTP។ | | `OMNIROUTE_TLS_KEY` | _(unset)_ | `bin/cli/commands/serve.mjs` | ផ្លូវទៅកាន់ private key PEM TLS សម្រាប់ HTTPS របស់ `omniroute serve` (ស្មើនឹង `--tls-key`)។ ត្រូវប្រើជាមួយ `OMNIROUTE_TLS_CERT`។ សូមមើល `OMNIROUTE_TLS_CERT`។ | | `OMNIROUTE_LOCAL_ENDPOINTS_ENABLED` | `0` | `src/lib/security/localEndpoints.ts` | កុងតាក់មេ សម្រាប់ route `/api/local/*`។ នៅពេលមិនកំណត់ ឬមានតម្លៃ `0` route `/api/local/*` ទាំងអស់នឹងបញ្ជូនត្រឡប់ 503 ក្នុង production។ ត្រូវកំណត់ជា `1` ក្នុង deployment ដែលមិនមែនជា loopback ដើម្បីបើក Redis launcher និងកម្មវិធីចាប់ផ្តើមសេវាមូលដ្ឋានដោយចុចតែម្តងដែលស្រដៀងគ្នា។ ជាវិធានការការពារបន្ថែមជាមួយការចាត់ថ្នាក់ route-guard របស់ `isLocalOnlyPath()` (`LOCAL_ONLY_API_PREFIXES` ក្នុង `src/server/authz/routeGuard.ts`)។ | | `OMNIROUTE_LOCAL_ENDPOINTS_TOKEN` | _(unset)_ | `src/lib/security/localEndpoints.ts` | Bearer token សម្រាប់អ្នកហៅ `/api/local/*` ដែលមិនមែនមកពី loopback (ឧ. កម្មវិធី desktop)។ នៅពេលកំណត់ សំណើពី IP ដែលមិនមែនជា loopback ត្រូវតែមាន `Authorization: Bearer `។ តម្រូវឱ្យមាន នៅពេល `OMNIROUTE_LOCAL_ENDPOINTS_ENABLED=1` ក្នុង deployment ដែលមិនមែនជា 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` | ច្រក Host សម្រាប់កម្មវិធីបើកដំណើរការ Redis ដោយចុចតែម្តង។ បង្កើនតម្លៃ ប្រសិនបើ Host កំពុងភ្ជាប់ជាមួយ 6379 រួចហើយ។ ច្រកខាងក្នុងរបស់ Container នៅតែជា 6379។ | | `OMNIROUTE_REDIS_BIND_HOST` | `127.0.0.1` | `bin/cli/commands/redis.mjs` | ចំណុចប្រទាក់ Host ដែលកម្មវិធីបើកដំណើរការ Redis ដោយចុចតែម្តង ប្រើសម្រាប់បោះផ្សាយ។ កម្មវិធីបើកដំណើរការនេះចាប់ផ្តើម Redis ដោយគ្មានពាក្យសម្ងាត់ ដូច្នេះការភ្ជាប់ទៅ `0.0.0.0` នឹងផ្តល់ Redis ដែលគ្មានការផ្ទៀងផ្ទាត់ទៅគ្រប់ Host នៅលើ LAN របស់អ្នក — ពង្រីកតម្លៃនេះតែប្រសិនបើអ្នកកំណត់ពាក្យសម្ងាត់លើ Instance ដោយខ្លួនឯងផងដែរ។ | | `REDIS_BIND_HOST` | `127.0.0.1` | `docker-compose.yml` | ចំណុចប្រទាក់ Host ដែល docker-compose ប្រើសម្រាប់បោះផ្សាយ Redis sidecar (#9286)។ Redis របស់ compose ដំណើរការដោយគ្មាន `requirepass`។ Container របស់កម្មវិធីចូលប្រើវាតាមបណ្តាញ compose (`redis:6379`) — ច្រកដែលបានបោះផ្សាយមានសម្រាប់តែឧបករណ៍នៅខាង Host ប៉ុណ្ណោះ។ `0.0.0.0` នឹងបង្ហាញ Redis ដែលគ្មានការផ្ទៀងផ្ទាត់ទៅកាន់ LAN ទាំងមូល។ | | `REDIS_PORT` | `6379` | `docker-compose.yml` | ច្រក Host សម្រាប់ Redis sidecar របស់ compose។ | | `APP_BIND_HOST` | `127.0.0.1` | `docker-compose.yml`, `docker-compose.prod.yml` | ចំណុចប្រទាក់ Host ដែល docker-compose ប្រើសម្រាប់បោះផ្សាយច្រក dashboard/API/live-WS របស់កម្មវិធី (#12568)។ ដោយ `REQUIRE_API_KEY=false` ត្រូវបានប្រើជាតម្លៃលំនាំដើមនៅក្នុង `.env.example` នោះ `0.0.0.0` នឹងបង្ហាញប្រូកស៊ី LLM `/v1` ដែលគ្មានការកំណត់អត្តសញ្ញាណទៅកាន់ LAN/WAN ទាំងមូល — ពង្រីកតម្លៃនេះតែបន្ទាប់ពី `REQUIRE_API_KEY=true` ឬ reverse proxy នៅខាងមុខបានបង្ខំឱ្យមានការផ្ទៀងផ្ទាត់ផ្ទាល់ខ្លួនរបស់វា។ | | `QDRANT_BIND_HOST` | `127.0.0.1` | `docker-compose.yml` | ចំណុចប្រទាក់ Host ដែល docker-compose ប្រើសម្រាប់បោះផ្សាយ Qdrant memory sidecar (#12578)។ ហេតុផលអំពីការបង្ហាញទៅ LAN ដូចគ្នានឹង `REDIS_BIND_HOST`។ | | `BIFROST_BIND_HOST` | `127.0.0.1` | `docker-compose.yml` | ចំណុចប្រទាក់ Host ដែល docker-compose ប្រើសម្រាប់បោះផ្សាយ Bifrost router sidecar (#12578)។ ហេតុផលអំពីការបង្ហាញទៅ LAN ដូចគ្នានឹង `REDIS_BIND_HOST`។ | | `REDIS_KEY_PREFIX` | `omniroute:` | `src/shared/utils/rateLimiter.ts` | បុព្វបទ namespace ដែលអនុវត្តចំពោះ Redis key របស់ OmniRoute ទាំងអស់ (ឧបករណ៍កំណត់អត្រា, ឃ្លាំងសម្ងាត់ការផ្ទៀងផ្ទាត់អត្តសញ្ញាណ, ឃ្លាំងកូតា, ឧបករណ៍បំបែកសៀគ្វី warmup)។ ការពារការប៉ះទង្គិច key នៅពេល Redis instance ត្រូវបានចែករំលែកជាមួយកម្មវិធីផ្សេងទៀត (#11042)។ | | `OMNIROUTE_INTERNAL_SERVICE_TOKEN` | _(មិនបានកំណត់ — យន្តការត្រូវបានបិទ)_ | `src/lib/api/internalServiceAuth.ts` | សម្ងាត់រួមសម្រាប់ការបញ្ជូន REST ខាងក្នុងដែលរក្សាអត្តសញ្ញាណ (#9260): សមាសភាគ OmniRoute ដែលហៅ route OmniRoute មូលដ្ឋានផ្សេងទៀត ផ្ញើវាជា `x-omniroute-internal-service-token` ដើម្បីរក្សាអត្តសញ្ញាណអ្នកហៅដើម។ ប្រៀបធៀបដោយប្រើ `timingSafeEqual`។ | | `OMNIROUTE_INTERNAL_SERVICE_TOKEN_FILE` | _(មិនបានកំណត់)_ | `src/lib/api/internalServiceAuth.ts` | ជម្រើសឯកសារសម្ងាត់សម្រាប់ internal service token៖ ផ្លូវទៅកាន់ឯកសារដែលមាតិកាដែលបានដកចន្លោះទទេនៅចុងក្រោយ គឺជា token។ ត្រូវបានពិនិត្យតែពេល inline var មិនត្រូវបានកំណត់ប៉ុណ្ណោះ។ | | `OPENROUTER_PROVIDER_STATS_ENABLED` | `true` | `src/lib/catalog/openrouterProviderStats.ts` | បន្ថែមទិន្នន័យស្ថិតិចំណាត់ថ្នាក់ប្រចាំសប្តាហ៍របស់ OpenRouter ទៅក្នុងបញ្ជី providers នៅលើផ្ទាំងគ្រប់គ្រង (#9324)។ បើកជាលំនាំដើម; កំណត់ជា `false` ដើម្បីរំលងការទាញយកនៅផ្ទៃខាងក្រោយទាំងស្រុង (មិនរារាំង និងមិនដែលបរាជ័យធ្ងន់ធ្ងរ)។ | | `OPENROUTER_PROVIDER_STATS_TTL_MS` | `86400000` (24h) | `src/lib/catalog/openrouterProviderStats.ts` | TTL ឃ្លាំងសម្ងាត់សម្រាប់ snapshot ស្ថិតិ provider របស់ OpenRouter គិតជាមីលីវិនាទី។ | | `OMNIROUTE_REDIS_IMAGE` | `redis:7-alpine` | `bin/cli/commands/redis.mjs` | រូបភាព Redis ដែលប្រើដោយកម្មវិធីបើក Redis ដោយចុចតែមួយដង។ ប្ដូរទៅ `redis:8-alpine` ឬ mirror របស់ private registry តាមតម្រូវការ។ | | `QDRANT_HOST` | `qdrant` | _(opt-in cluster profile)_ | ឈ្មោះម៉ាស៊ីនរបស់ sidecar Qdrant នៅពេល `--profile memory` សកម្ម។ លំនាំដើមចង្អុលទៅឈ្មោះសេវា qdrant នៅក្នុងបណ្តាញ; ប្ដូរជំនួសសម្រាប់ការដាក់ឱ្យដំណើរការខាងក្រៅ។ ប្រើប្រាស់តែនៅពេល `qdrantEnabled` មានតម្លៃ `true` ក្នុងកូដ (`src/lib/memory/vectorStore.ts:108`) ប៉ុណ្ណោះ។ | | `QDRANT_PORT` | `6333` | _(opt-in cluster profile)_ | ច្រក REST របស់ sidecar Qdrant។ | | `QDRANT_GRPC_PORT` | `6334` | _(ប្រវត្តិរូប cluster ដែលជ្រើសបើក)_ | ច្រក gRPC របស់ sidecar Qdrant។ ប្រើដោយបណ្ណាល័យ client ដែលចូលចិត្ត gRPC ជាង REST សម្រាប់ប្រតិបត្តិការ streaming។ | | `QDRANT_API_KEY` | _(មិនបានកំណត់)_ | _(ប្រវត្តិរូប cluster ដែលជ្រើសបើក)_ | API key ជាជម្រើសសម្រាប់ Qdrant Cloud ឬ instance on-prem ដែលមានការផ្ទៀងផ្ទាត់។ ទទេ → មិនផ្ញើ header `api-key` ទេ។ | | `QDRANT_COLLECTION` | `omniroute-memory` | _(ប្រវត្តិរូប cluster ដែលជ្រើសបើក)_ | ឈ្មោះ collection សម្រាប់ embeddings នៃអង្គចងចាំការសន្ទនារបស់ OmniRoute។ វាត្រូវបានបង្កើតនៅពេលដំណើរការលើកដំបូង ជាមួយវិមាត្រ `QDRANT_VECTOR_SIZE`។ | | `QDRANT_EMBEDDING_MODEL` | `text-embedding-3-small` | _(ប្រវត្តិរូប cluster ដែលជ្រើសបើក)_ | ឈ្មោះ embedding model លំនាំដើមដែលបានកត់ត្រានៅក្នុង metadata របស់ Qdrant collection។ Embeddings ជាក់ស្តែងត្រូវបានបង្កើតដោយ provider ណាក៏ដោយដែលវាល `embeddingModel` នៅក្នុងការកំណត់របស់ OmniRoute ចង្អុលទៅ។ | | `QDRANT_VECTOR_SIZE` | `1536` | _(ប្រវត្តិរូប cluster ដែលជ្រើសបើក)_ | វិមាត្ររបស់ embedding vector។ ត្រូវតែផ្គូផ្គងនឹង model ដែលអ្នកប្រើសម្រាប់បង្កើត embedding (text-embedding-3-small → 1536; ada-002 → 1536; nomic-embed-text → 768)។ | | `QDRANT_HNSW_EF_CONSTRUCT` | `128` | _(ប្រវត្តិរូប cluster ដែលជ្រើសបើក)_ | ភាពត្រឹមត្រូវនៅពេលសាងសង់ HNSW index។ តម្លៃខ្ពស់ជាង = សាងសង់យឺតជាង ប៉ុន្តែស្វែងរកលឿនជាង។ | | `OMNIROUTE_ROTATION_ENABLED` | `true` | `open-sse/services/rotationConfig.ts` | កុងតាក់មេ សម្រាប់ការបង្វិល account ដែលអាចកំណត់រចនាសម្ព័ន្ធដោយ operator។ នៅពេល `false` គ្មាន class ណាមួយក្នុងចំណោម `OMNIROUTE_ROTATE_*` ខាងក្រោម នឹងកេះការប្ដូរ account fallback ទេ (ស្ថានភាពបិទកុងតាក់មេ ក៏រារាំង class 429/500/502 ដែលបើកជាលំនាំដើមផងដែរ)។ អនុញ្ញាតឱ្យ front-end ដែលគ្រប់គ្រង (ឧ. កម្មវិធី desktop VibeProxy) ឆ្លុះបញ្ចាំងច្បាប់ការបង្វិលរបស់ខ្លួនទៅលើម៉ាស៊ីន account-fallback របស់ backend។ | | `OMNIROUTE_ROTATION_RATE_LIMIT_RESET_SECONDS` | `0` | `open-sse/services/rotationConfig.ts` | រយៈពេលរង់ចាំ (វិនាទី) ដែលអនុវត្តចំពោះ account ដែលត្រូវបានកំណត់ល្បឿន នៅពេល upstream មិនផ្តល់ព័ត៌មានជាក់លាក់អំពីការកំណត់ឡើងវិញ។ `0` = ប្រើរយៈពេលរង់ចាំលំនាំដើមរបស់ engine ជំនួសឱ្យការបង្ខំតម្លៃថេរ។ | | `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` (gateway មិនត្រឹមត្រូវ)។ នៅពេល `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` ធម្មតា (សំណើមិនត្រឹមត្រូវ) ក៏នឹងបង្កឱ្យមានការប្តូរគណនីផងដែរ។ វាគ្រាន់តែបន្ថែមមុខងារប៉ុណ្ណោះ — វាមិនដែលរារាំងឥរិយាបថដែលមានស្រាប់របស់ engine ដែលករណី `400` មានអត្ថបទកំណត់អត្រា/កូតា នៅតែធ្លាក់ចុះដោយមិនគិតពី flag នេះទេ។ | | `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`។ | ### កម្មវិធីកំណត់ពេល Warmup របស់ Claude Warmup ដែលដំណើរការតាម Cron សម្រាប់ការតភ្ជាប់ Anthropic OAuth ដែលបានជ្រើសរើស ដើម្បីឱ្យបង្អួចកំណត់អត្រា ៥ ម៉ោង ត្រូវបានបើកដោយសំណើកំណត់ពេលដ៏សាមញ្ញ ជំនួសឱ្យសំណើពិតដំបូង (#8848)។ កម្មវិធីកំណត់ពេលនេះបិទ លុះត្រាតែ `OMNIROUTE_WARMUP_ENABLED` មានតម្លៃ truthy **ហើយ** ការតភ្ជាប់ត្រូវបានសម្គាល់ក្នុង `settings.claudeWarmup.connections`។ បញ្ជីការតភ្ជាប់ទទេមានន័យថា គ្មានការតភ្ជាប់ណាមួយត្រូវបាន Warmup ទេ ទោះបីជា env var ត្រូវបានបើកក៏ដោយ។ | Variable | Default | Source File | Description | | ------------------------------ | --------------------------- | ---------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `OMNIROUTE_WARMUP_ENABLED` | _(unset → off)_ | `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` | Model ដែលប្រើសម្រាប់សំណើ Warmup។ ប្តូរតែប្រសិនបើលំនាំដើមមិនមាននៅក្នុងគម្រោងរបស់អ្នក។ ជ្រើសរើស model ដែលមានតម្លៃថោកបំផុត ហើយនៅតែអាចបើកបង្អួចបាន។ | ### សម័យ VNC សម្រាប់ការចូលតាម Browser និងឈ្មោះក្លែងក្លាយ Data-Dir Chromium+VNC ក្នុង container ដែលប្រើសម្រាប់ការចាប់យកព័ត៌មានសម្ងាត់នៃការចូលតាម browser អន្តរកម្ម (`/api/vnc-session`) រួមទាំងឈ្មោះក្លែងក្លាយ `DATA_DIR` ចាស់។ ទាំងអស់នេះជាជម្រើស — លំនាំដើមរបស់ VNC កំណត់គោលដៅទៅកាន់ image `omniroute-vnc-chromium:local` ដែលបានភ្ជាប់មកជាមួយ ហើយនឹងត្រូវបដិសេធតែសម្រាប់ image container ផ្ទាល់ខ្លួន, ports ឬការកែសម្រួល lifecycle ប៉ុណ្ណោះ។ | Variable | Default | Source File | Description | | ------------------------------------- | ------------------------------------------------------------------------ | ------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `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` | ប៊ីណារី runtime របស់កុងតឺន័រ ដែលប្រើសម្រាប់បើកដំណើរការកុងតឺន័រ 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 min) | `src/lib/vncSession/manifest.ts` | រយៈពេលអសកម្ម (ms) មុនពេលសម័យ VNC ដែលមិនសកម្មត្រូវបានលុបចេញ។ | | `OMNIROUTE_VNC_MAX_MS` | `1800000` (30 min) | `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) សម្រាប់ប្រមូលសម័យ/ខូគីដែលបានចាប់យក បន្ទាប់ពីការចូលប្រើបានបញ្ចប់។ | | `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 លំនាំដើម ដើម្បីកុំឱ្យកុងតឺន័របងប្អូនអាចចូលដំណើរការច្រក CDP bridge របស់វា។ | | `VIBEPROXY_DATA_DIR` | _(unset)_ | `open-sse/services/notionThreadSessions.ts` | **ឈ្មោះក្លែងក្លាយចាស់** សម្រាប់ `DATA_DIR` ដែលត្រូវបានពិនិត្យតែបន្ទាប់ពី `DATA_DIR` និង `OMNIROUTE_DATA_DIR` មិនត្រូវបានកំណត់ទាំងពីរ។ វាកំណត់ទីតាំងឃ្លាំងសម័យ web-thread របស់ 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` | falls back to `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 token អំឡុងពេលធ្វើតេស្ត។ | | `OMNIROUTE_HEALTHCHECK_SKIP_PROVIDERS` | _(មិនបានកំណត់)_ | `src/lib/tokenHealthCheck.ts` | បញ្ជី providers បំបែកដោយសញ្ញាក្បៀស ដែលត្រូវដកចេញពីការស្វែងរក និងធ្វើឱ្យ token ស្រស់ជាមុន (ឧ. `codex,openai`)។ ជាជម្រើសកំណត់គោលដៅជំនួសឱ្យការបិទការត្រួតពិនិត្យសុខភាពទាំងស្រុង — providers ដែលមាន TTL ខ្លីនៅតែបន្តធ្វើឱ្យស្រស់ ខណៈ providers ប្រភេទ 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` | រំលងការបង្កើត production build របស់ Next.js មុនពេល Playwright ចាប់ផ្ដើម (ការបង្កើនប្រសិទ្ធភាពសម្រាប់ CI)។ | | `OMNIROUTE_SKIP_UNINSTALL_HOOK` | `0` | `scripts/build/uninstall.mjs` | រំលង uninstall hook របស់ OmniRoute (ប្រើដោយ CI ដើម្បីរក្សា `node_modules` ឱ្យនៅដដែល)។ | | `ECOSYSTEM_SERVER_WAIT_MS` | `180000` | `scripts/dev/run-ecosystem-tests.mjs` | រយៈពេលរង់ចាំ (ms) ឱ្យ server មានសុខភាពល្អ មុនពេលដំណើរការតេស្ត ecosystem/protocol។ | | `ELECTRON_SMOKE_URL` | `http://127.0.0.1:20128/login` | `scripts/dev/smoke-electron-packaged.mjs` | URL ដែល smoke harness របស់ Electron រំពឹងថាកម្មវិធីដែលបានវេចខ្ចប់នឹងផ្ដល់សេវា។ | | `ELECTRON_SMOKE_TIMEOUT_MS` | `45000` | `scripts/dev/smoke-electron-packaged.mjs` | រយៈពេលអតិបរមា (ms) មុនពេល smoke harness បោះបង់។ | | `ELECTRON_SMOKE_SETTLE_MS` | `2000` | `scripts/dev/smoke-electron-packaged.mjs` | រយៈពេលរង់ចាំឱ្យស្ថិរភាព (ms) បន្ទាប់ពីទំព័រផ្ទុករួច។ | | `ELECTRON_SMOKE_APP_EXECUTABLE` | _(ស្វ័យប្រវត្តិ)_ | `scripts/dev/smoke-electron-packaged.mjs` | ផ្លូវជាក់លាក់ទៅកាន់ executable របស់ Electron ដែលបានវេចខ្ចប់។ | | `ELECTRON_SMOKE_DATA_DIR` | _(ថតបណ្ដោះអាសន្ន)_ | `scripts/dev/smoke-electron-packaged.mjs` | ថតទិន្នន័យសម្រាប់ការដំណើរការ Electron smoke។ | | `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 ទៅ stdout ខណៈពេលដំណើរការ។ | | `ELECTRON_SMOKE_COLD_RESTART` | `0` | `scripts/dev/smoke-electron-packaged.mjs` | #7592៖ បើកដំណើរការឡើងវិញដោយប្រើថតទិន្នន័យដដែល ហើយបញ្ជាក់ថា ការបើកដំណើរការលើកទីពីរជ្រើសរើសកម្មវិធីបញ្ជា SQLite ដើម។ | | `CLI_DEVIN_BIN` | _(PATH lookup)_ | `open-sse/executors/devin-cli.ts` | បដិសេធផ្លូវទៅកាន់ binary របស់ Devin CLI។ | ### បំពង់បកប្រែឯកសារ ប្រើដោយ `scripts/i18n/run-translation.mjs` (ពាក្យបញ្ជា `npm run i18n:run`)។ អថេរទាំងប្រាំមួយមិនត្រូវបានកំណត់តាមលំនាំដើមទេ — កំណត់វានៅក្នុង `.env` តែលើម៉ាស៊ីន ដែលគួរតែអាចដំណើរការកម្មវិធីបកប្រែឯកសារបានប៉ុណ្ណោះ។ | អថេរ | លំនាំដើម | ឯកសារប្រភព | ការពិពណ៌នា | | ------------------------------------------ | --------- | ----------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `OMNIROUTE_TRANSLATION_API_URL` | _(unset)_ | `scripts/i18n/run-translation.mjs` | URL មូលដ្ឋានដែលឆបគ្នាជាមួយ OpenAI សម្រាប់ backend បកប្រែ។ | | `OMNIROUTE_TRANSLATION_API_KEY` | _(unset)_ | `scripts/i18n/run-translation.mjs` | Bearer token សម្រាប់ backend បកប្រែ (មិនដែលកត់ត្រាក្នុង log ទេ)។ | | `OMNIROUTE_TRANSLATION_MODEL` | _(unset)_ | `scripts/i18n/run-translation.mjs` | លេខសម្គាល់ម៉ូដែល ឧ. `gpt-4o-mini` ឬ `cx/gpt-5.4-mini`។ | | `OMNIROUTE_TRANSLATION_FALLBACK_MODELS` | _(unset)_ | `scripts/i18n/lib/translate-backend.mjs` | ខ្សែសង្វាក់ម៉ូដែលស្រេចចិត្តដែលបំបែកដោយសញ្ញាក្បៀស ហើយសាកល្បងតាមលំដាប់ នៅពេលម៉ូដែលចម្បងបរាជ័យ (កូតា 429, 401/402, 5xx, អស់ពេល, បណ្តាញ)។ សំណើដែលមានទម្រង់មិនត្រឹមត្រូវ (400/413/422) មិនត្រូវបានសាកល្បងឡើងវិញនៅកន្លែងផ្សេងទេ។ | | `OMNIROUTE_TRANSLATION_TIMEOUT_MS` | `60000` | `scripts/i18n/run-translation.mjs` | រយៈពេលអស់ពេលក្នុងមួយសំណើ គិតជាមិល្លីវិនាទី។ | | `OMNIROUTE_TRANSLATION_REASONING_EFFORT` | _(unset)_ | `scripts/i18n/lib/translate-backend.mjs` | ការគ្រប់គ្រងការវែកញែកស្រេចចិត្ត ដែលត្រូវបានផ្ញើទៅ backend តាមតម្លៃដើម នៅពេលកំណត់។ | | `OMNIROUTE_TRANSLATION_CONCURRENCY` | `4` | `scripts/i18n/run-translation.mjs` | សំណើបកប្រែស្របគ្នា នៅពេលដំណើរការលើឯកសារ / មូលដ្ឋានភាសាច្រើន។ | | `OMNIROUTE_TRANSLATION_ENGINE` | `llm` | `scripts/i18n/run-translation.mjs` | `llm` ប្រើ backend ខាងលើ។ `google` បកប្រែតាមរយៈម៉ាស៊ីន Google ដែលរក្សាសុវត្ថិភាពរចនាសម្ព័ន្ធ ហើយមិនត្រូវការអថេរ LLM ណាមួយទេ។ | | `OMNIROUTE_TRANSLATION_GOOGLE_FALLBACK` | `1` | `scripts/i18n/run-translation.mjs` | ជាមួយម៉ាស៊ីន `llm` ប្រសិនបើម៉ូដែលមិនអាចបង្កើតផ្នែកមួយបាន (ការត្រួតពិនិត្យលទ្ធផលបរាជ័យគ្រប់ការព្យាយាម ឬមានកំហុសម៉ូដែល) នោះផ្នែកនោះនឹងត្រូវបកប្រែដោយ Google ជំនួសឱ្យធ្វើឱ្យមូលដ្ឋានភាសាបរាជ័យ។ `0` បិទមុខងារនេះ។ | | `OMNIROUTE_TRANSLATION_GOOGLE_API_KEY` | _(unset)_ | `scripts/i18n/lib/google-translate.mjs` | សោ Cloud Translation v2 ស្រេចចិត្ត។ ប្រសិនបើមិនកំណត់ នឹងប្រើ endpoint លើបណ្ដាញដែលមិនទាមទារសោ (មានកម្រិតអត្រា សមស្របសម្រាប់ការដំណើរការម្តងម្កាល)។ | | `OMNIROUTE_TRANSLATION_GOOGLE_CONCURRENCY` | `6` | `scripts/i18n/lib/google-translate.mjs` | សំណើ Google ស្របគ្នា ដែលចែករំលែកដោយគ្រប់មូលដ្ឋានភាសានៃការដំណើរការមួយ។ | | `OMNIROUTE_TRANSLATION_GOOGLE_TIMEOUT_MS` | `30000` | `scripts/i18n/lib/google-translate.mjs` | រយៈពេលអស់ពេលក្នុងមួយសំណើសម្រាប់ម៉ាស៊ីន Google គិតជាមិល្លីវិនាទី។ | | `UI_KIT_READ_TOKEN` | _(unset)_ | `scripts/check/check-ui-kit-upstream.mjs` | token សម្រាប់អានតែប៉ុណ្ណោះទៅកាន់ឃ្លាំង UI kit upstream ឯកជន ដែលប្រើដោយ `npm run check:ui-kit-upstream` និង workflow ប្រចាំសប្តាហ៍ “UI Kit upstream watch”។ ក្នុងមូលដ្ឋាន ការត្រួតពិនិត្យប្រើព័ត៌មានសម្គាល់ git របស់អ្នក។ | --- ## 27. Radar Feed (ការបង្ហោះដោយខ្លួនឯង) កម្មវិធីបន្ថែមជាជម្រើស ដែលត្រូវបានគ្រប់គ្រងដោយ feature flag `RADAR_ENABLED` (បិទជាលំនាំដើម — ជា feature flag ដែលបិទ/បើកតាម Settings/DB មិនមែនជា env var ទេ; សូមមើល [docs/frameworks/RADAR.md](../frameworks/RADAR.md#flag-radar_enabled-default-off))។ អថេរបួនដំបូងខាងក្រោម គឺជាការកំណត់ជំនួសជាជម្រើស សម្រាប់ feed ដែលបង្ហោះដោយខ្លួនឯង ឬ fork និង លំហូរ supporter-key។ អថេរទីប្រាំ `RADAR_ADMIN_URL` គឺជាតំណភ្ជាប់ដាច់ដោយឡែក ដែលមិនមានតម្លៃលំនាំដើម ទៅកាន់ផ្ទាំង ប្រតិបត្តិការឯកជនរបស់ម្ចាស់។ សូមមើល [docs/frameworks/RADAR.md](../frameworks/RADAR.md) សម្រាប់ឯកសារម៉ូឌុលពេញលេញ និង [លំដាប់ការធ្វើឱ្យសកម្មពីដើមដល់ចប់ និងការរៀបចំដែលមានការណែនាំ](../frameworks/RADAR.md#end-to-end-activation-and-guided-setup) របស់វា។ កម្មវិធីអានសេចក្តីប្រកាសទូទៅរបស់ Home/Changelog មិនត្រូវបានកំណត់តាម environment variable ទេ ហើយក៏មិនពឹងផ្អែកលើ feature flag `RADAR_ENABLED` ដែរ។ វាអាន URL របស់ `news.json` ពីឃ្លាំងសាធារណៈ ដែលបានប្រកាសនៅក្នុង `src/shared/utils/releaseNotes.ts` ដោយប្រើ GET ប៉ុណ្ណោះ; លេខសម្គាល់ការបិទការជូនដំណឹងនៅតែរក្សាទុកក្នុង local storage របស់កម្មវិធីរុករក។ | អថេរ | តម្លៃលំនាំដើម | ឯកសារប្រភព | ការពិពណ៌នា | | ----------------------------- | -------------------------------------------- | ------------------------------------------------------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `RADAR_FEED_URL` | `https://radar.omniroute.online` | `src/lib/radar/{sync,referralsSync,offersSync,intelSync}.ts` | URL មូលដ្ឋានដែលប្រើរួមគ្នាដោយ catalog, referrals, supporter-offers និង Intel feeds ដែលចុះហត្ថលេខាដោយឡែកពីគ្នា។ ជំនួសដើម្បីចង្អុលទៅសេវាដែលបង្ហោះដោយខ្លួនឯង ឬសេវាដែលបាន fork។ | | `RADAR_FEED_PUBKEY` | _(សោលំនាំដើមដែលបានបង្កប់)_ | `src/lib/radar/pinnedKeys.ts` | សោសាធារណៈ Ed25519 (base64-DER SPKI ឬ PEM) ដែលប្រើសម្រាប់ផ្ទៀងផ្ទាត់ហត្ថលេខារបស់ feed ពី feed ផ្ទាល់ខ្លួន។ | | `RADAR_CONTRIBUTOR_CLAIM_URL` | `https://radar.omniroute.online/auth/github` | `src/lib/radar/links.ts` | URL ដែលប៊ូតុង dashboard "ខ្ញុំជាអ្នករួមចំណែក" បើក (លំហូរទាមទារ supporter-key តាម GitHub OAuth)។ | | `RADAR_SUPPORTER_PLANS_URL` | `https://radar.omniroute.online/planos` | `src/lib/radar/links.ts` | URL ដែលប៊ូតុង dashboard "គាំទ្រគម្រោង" បើក (ទំព័របង់ប្រាក់/គម្រោង)។ | | `RADAR_ADMIN_URL` | _(មិនបានកំណត់)_ | `src/lib/radar/links.ts` | តំណភ្ជាប់ទៅផ្ទាំងប្រតិបត្តិការឯកជនសម្រាប់ម្ចាស់ប៉ុណ្ណោះ។ តម្រូវឱ្យប្រើ HTTPS លើកលែងតែការបញ្ជូន SSH តាម HTTP loopback; តម្លៃដែលមិនបានកំណត់ ឬមិនត្រឹមត្រូវ នឹងមិនបង្កើតធាតុរុករកទេ។ | --- ## សវនកម្ម៖ អថេរដែលបានដកចេញ / អថេរដែលមិនប្រើ អថេរខាងក្រោមនេះបានបង្ហាញនៅក្នុងកំណែមុនៗរបស់ `.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 មិនមែន binary 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` / មូលដ្ឋានទិន្នន័យដែលបានអ៊ិនគ្រីប។ | | `CURSOR_PROTOBUF_DEBUG` | បានដកចេញនៅក្នុង v3.8.0។ Cursor executor ប្រើ `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 ឡើងវិញ (ឧបករណ៍ ad-hoc) ប្រើដោយ `scripts/ad-hoc/regen-opencode-config.ts` ដើម្បីបង្កើត `opencode.json` ឡើងវិញ ជាមួយតម្លៃ `limit.context` និង `limit.output` ដែលត្រឹមត្រូវ និងទាញយកពីអាំងស្តង់ OmniRoute ដែលកំពុងដំណើរការ។ មិនមានអ្វីក្នុងចំណោមនេះដែលត្រូវការសម្រាប់ប្រតិបត្តិការធម្មតាទេ — ស្គ្រីបនេះគឺសម្រាប់ឧបករណ៍អ្នកអភិវឌ្ឍន៍ប៉ុណ្ណោះ។ | Variable | Default | Source File | Description | | ------------------ | ------------------------ | ----------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------ | | `OMNIROUTE_URL` | `http://localhost:20128` | `scripts/ad-hoc/regen-opencode-config.ts` | URL មូលដ្ឋានរបស់ instance OmniRoute ដែលត្រូវសួររក `/v1/models`។ | | `OMNIROUTE_KEY` | _(unset)_ | `scripts/ad-hoc/regen-opencode-config.ts` | សោ API សម្រាប់ផ្ទៀងផ្ទាត់ទៅកាន់ endpoint `/v1/models` របស់ OmniRoute។ ប្រើ `OPENCODE_API_KEY` ជំនួស ប្រសិនបើមិនបានកំណត់។ | | `OPENCODE_API_KEY` | _(unset)_ | `scripts/ad-hoc/regen-opencode-config.ts` | សោ API តាមរចនាប័ទ្ម OpenCode (`sk-...`) ដែលត្រូវសរសេរទៅក្នុង `opencode.json` ដែលបានបង្កើតឡើងវិញ។ ប្រើ `OMNIROUTE_KEY` ជំនួស ប្រសិនបើមិនបានកំណត់។ | ### ឧបករណ៍វាយតម្លៃ compression ក្រៅបណ្តាញ (ឧបករណ៍ ad-hoc) ប្រើដោយ `scripts/compression-eval/index.ts` ដែលជា CLI សម្រាប់វាយតម្លៃ compression ក្រៅបណ្តាញ។ មិនចាំបាច់សម្រាប់ប្រតិបត្តិការធម្មតាទេ — ប្រើសម្រាប់ឧបករណ៍អ្នកអភិវឌ្ឍន៍ប៉ុណ្ណោះ។ | Variable | Default | Source File | Description | | ---------------------------- | ------------ | ----------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `OMNIROUTE_EVAL_CREDENTIALS` | `{}` (empty) | `scripts/compression-eval/index.ts` | លិខិតសម្គាល់ JSON ដែលផ្គត់ផ្គង់ដោយប្រតិបត្តិករ សម្រាប់ provider ដែលត្រូវបានប្រើដោយ CLI វាយតម្លៃ compression ក្រៅបណ្តាញ (ញែកដោយ `JSON.parse`)។ ទុកឱ្យមិនកំណត់ ដើម្បីដំណើរការសាកល្បងដោយមិនអនុវត្តសកម្មភាព។ | ### សម័យ Browser VNC ប្រើដោយ `src/lib/vncSession/manifest.ts` ដើម្បីកំណត់រចនាសម្ព័ន្ធសម័យ Chromium គ្មានចំណុចប្រទាក់ ដែលដំណើរការដោយ Docker សម្រាប់ provider ស្វ័យប្រវត្តិកម្ម browser។ ទាំងអស់ជាជម្រើស — លំនាំដើមមានបង្ហាញខាងក្រោម។ | Variable | Default | Source File | Description | | ------------------------------------- | ------------------------------ | ------------------------------------------- | ----------------------------------------------------------------------------- | | `OMNIROUTE_DOCKER_BIN` | `docker` | `src/lib/vncSession/manifest.ts` | ផ្លូវទៅកាន់ binary របស់ Docker ដែលប្រើសម្រាប់បង្កើត VNC containers។ | | `OMNIROUTE_VNC_IMAGE` | `omniroute-vnc-chromium:local` | `src/lib/vncSession/manifest.ts` | Docker image សម្រាប់ VNC Chromium container។ | | `OMNIROUTE_VNC_CHROMIUM_ARGS` | _(built-in flags)_ | `src/lib/vncSession/manifest.ts` | អាគុយម៉ង់ CLI បន្ថែមរបស់ Chromium ដែលបញ្ជូនទៅកាន់ browser ខាងក្នុង container។ | | `OMNIROUTE_VNC_CONTAINER_VNC_PORT` | `3000` | `src/lib/vncSession/manifest.ts` | ច្រក VNC ខាងក្នុង container។ | | `OMNIROUTE_VNC_CONTAINER_CDP_PORT` | `9223` | `src/lib/vncSession/manifest.ts` | ច្រក Chrome DevTools Protocol ខាងក្នុង container។ | | `OMNIROUTE_VNC_CONTAINER_PROFILE_DIR` | `/config` | `src/lib/vncSession/manifest.ts` | ថត profile ខាងក្នុង container។ | | `OMNIROUTE_VNC_PROFILE_DIR` | _(unset)_ | `src/lib/vncSession/manifest.ts` | ថតនៅខាង host សម្រាប់រក្សាទុក profile របស់ browser ជាបន្តបន្ទាប់។ | | `OMNIROUTE_VNC_IDLE_MS` | `600000` | `src/lib/vncSession/manifest.ts` | រយៈពេលអសកម្ម (ms) មុនពេលសម័យ VNC ត្រូវបានប្រមូលបិទ។ | | `OMNIROUTE_VNC_MAX_MS` | `1800000` | `src/lib/vncSession/manifest.ts` | រយៈពេលអតិបរមារបស់សម័យ (ms)។ | | `OMNIROUTE_VNC_MAX_SESSIONS` | `4` | `src/lib/vncSession/manifest.ts` | ចំនួនសម័យ VNC ដែលអាចដំណើរការស្របគ្នាអតិបរមា។ | | `OMNIROUTE_VNC_READY_MS` | `45000` | `src/lib/vncSession/manifest.ts` | អស់ពេលរង់ចាំឱ្យ browser ត្រៀមរួច (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` | _(unset)_ | `open-sse/services/notionThreadSessions.ts` | ថតសម្រាប់រក្សាទុកសម័យ thread របស់ Notion។ | ### ការផ្ទៀងផ្ទាត់សិទ្ធិសេវាខាងក្នុង | Variable | Default | Description | | --------------------------------------- | ------- | ----------------------------------------------------------------------------------------------------------- | | `OMNIROUTE_INTERNAL_SERVICE_TOKEN` | – | ថូខឹន inline សម្រាប់ការផ្ទៀងផ្ទាត់ភាពត្រឹមត្រូវរវាងសេវាកម្មនៅក្នុងផ្ទៃគ្រប់គ្រង។ | | `OMNIROUTE_INTERNAL_SERVICE_TOKEN_FILE` | – | ផ្លូវទៅកាន់ឯកសារដែលមានថូខឹនសេវាកម្មខាងក្នុង (ពេញចិត្តសម្រាប់ប្រើក្នុង container; បដិសេធតម្លៃពីអថេរ inline)។ | ### ស្ថិតិអ្នកផ្តល់សេវា OpenRouter | Variable | Default | Description | | ----------------------------------- | --------- | ---------------------------------------------------------------------------------------------------------------- | | `OPENROUTER_PROVIDER_STATS_ENABLED` | `true` | កំណត់ទៅជា `false` ដើម្បីរំលងការទាញយកស្ថិតិរបស់អ្នកផ្តល់សេវានីមួយៗពី OpenRouter សម្រាប់ការបន្ថែមព័ត៌មានទៅកាតាឡុក។ | | `OPENROUTER_PROVIDER_STATS_TTL_MS` | `3600000` | រយៈពេលរក្សាទុកក្នុងឃ្លាំងសម្ងាត់ (ms) សម្រាប់ស្ថិតិអ្នកផ្តល់សេវារបស់ OpenRouter ដែលបានទាញយក។ | ### ការភ្ជាប់ Redis ដែលបានបង្កប់ | Variable | Default | Description | | --------------------------- | ----------- | -------------------------------------------------------------------------------- | | `REDIS_BIND_HOST` | `127.0.0.1` | អាសយដ្ឋានចងភ្ជាប់សម្រាប់សេវាកម្ម Redis ដែលបានបង្កប់។ | | `REDIS_PORT` | `6379` | ច្រកសម្រាប់សេវាកម្ម Redis ដែលបានបង្កប់។ | | `OMNIROUTE_REDIS_BIND_HOST` | – | ការបដិសេធតម្លៃតាមវិសាលភាព OmniRoute សម្រាប់អាសយដ្ឋានចងភ្ជាប់ Redis ដែលបានបង្កប់។ | --- ## 24. ការបន្ថែមក្នុង Release v3.8.50 ការកំណត់ទាំងនេះត្រូវបានណែនាំបន្ទាប់ពី environment-contract snapshot មុន។ | អថេរ | តម្លៃលំនាំដើម | ឯកសារប្រភព | សេចក្ដីពិពណ៌នា | | ------------------------------------------- | -------------------------------------- | ---------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `OMNIROUTE_CHAT_ADMISSION_QUEUE_MS` | `2000` | `src/shared/middleware/chatBodyAdmission.ts` | រយៈពេលរង់ចាំអតិបរមាសម្រាប់ slot ទទួល chat ដែលមានទម្ងន់ធ្ងន់ មុននឹងផ្ញើ `503` ដែលអាច retry បាន។ ការរង់ចាំខ្លីដែលមានព្រំដែន នឹងធ្វើឱ្យការផ្ញើសំណើ agent ជាបន្ទុកៗដំណើរការតាមលំដាប់ ជំនួសឱ្យការផ្ញើ `503` ភ្លាមៗ។ `0` នឹងស្ដារការបដិសេធភ្លាមៗវិញ។ | | `OMNIROUTE_CHAT_ADMISSION_MAX_QUEUED_BYTES` | `4194304` (4 MB) | `src/shared/middleware/chatBodyAdmission.ts` | ថវិកា bytes ដែលដាក់ក្នុងជួរសម្រាប់ការរង់ចាំទទួល៖ កំណត់ចំនួន bytes នៃ body ដែលត្រូវបានបណ្ដោះអាសន្នទុកក្នុងកម្រិត process ទាំងមូល ដើម្បីកុំឱ្យការរង់ចាំធ្វើឱ្យ heap កើនឡើងខ្លាំង (#4380)។ ការរង់ចាំដែលលើសថវិកា នឹងទទួល `503` ដែលអាច retry បានភ្លាមៗ។ | | `OMNIROUTE_CHAT_VIRTUAL_TTL_MS` | `60000` (60 s) | `src/shared/middleware/chatBodyAdmission.ts` | no-op ដែលបានលែងប្រើចាប់តាំងពី #10110៖ lane ទទួលតាម session ត្រូវបានដកចេញ ដោយជំនួសដោយថវិកាតែមួយក្នុងកម្រិត process ទាំងមូល។ ទទួលយកសម្រាប់ភាពត្រូវគ្នានៃការកំណត់ ប៉ុន្តែមិនត្រូវបានប្រើប្រាស់ទេ។ | | `OMNIROUTE_CHAT_VIRTUAL_MAX_SESSIONS` | `64` | `src/shared/middleware/chatBodyAdmission.ts` | no-op ដែលបានលែងប្រើចាប់តាំងពី #10110៖ lane ទទួលតាម session ត្រូវបានដកចេញ ដោយជំនួសដោយថវិកាតែមួយក្នុងកម្រិត process ទាំងមូល។ ទទួលយកសម្រាប់ភាពត្រូវគ្នានៃការកំណត់ ប៉ុន្តែមិនត្រូវបានប្រើប្រាស់ទេ។ | | `OMNIROUTE_CHAT_VIRTUAL_LANES` | `0` (off) | `open-sse/services/admission/runtime.ts` | lane ទទួល virtual ដែលសម្របតាម runtime (#9654)៖ master switch សម្រាប់ adaptive gate តាម tenant (system 2)។ ខុសពីអថេរ lane តាម connection ដែលបានលែងប្រើខាងលើ (TTL_MS / MAX_SESSIONS, no-op ចាប់តាំងពី #10110)។ ជា dashboard feature flag ដែលមានឈ្មោះដូចគ្នា។ env var មានអាទិភាពលើ dashboard override ហើយតម្រូវឱ្យចាប់ផ្ដើមឡើងវិញ។ | | `OMNIROUTE_RUNNOW_TIMEOUT_MS` | `30000` | `src/app/api/jobs/[id]/run-now/route.ts` | កំណត់រយៈពេលដែលការហៅ run-now អាចរង់ចាំ job ដែលកំពុងដំណើរការ មុនពេលចាប់ផ្ដើម run ដែលបានដាក់ក្នុងជួរ។ | | `ADOBE_FIREFLY_BROWSER_REFRESH` | enabled | `open-sse/services/adobeFireflySession.ts` | រក្សាស្ថានភាព IMS និង browser-risk ឱ្យថ្មី តាមរយៈ Chrome CDP sessions ដែលកំណត់តាម account។ កំណត់ `0` ដើម្បីបិទ។ | | `ADOBE_FIREFLY_SESSION_DISK` | enabled | `open-sse/services/adobeFireflySession.ts` | រក្សាទុក Adobe sessions ដែលបានជួសជុលនៅក្រោម `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 ជាទូទៅបដិសេធ risk session ដែលបានបង្កើតឡើង។ | | `CHROME_PATH` | auto-detect | `open-sse/executors/cloudflare-playground.ts`, `open-sse/executors/chatgpt-web-codex.ts` | ផ្លូវពេញលេញជាជម្រើសទៅកាន់កម្មវិធីប្រតិបត្តិ Chrome ដែល executor ដំណើរការតាម browser ប្រើ នៅពេលការរកឃើញដោយស្វ័យប្រវត្តិតាម platform មិនគ្រប់គ្រាន់។ | | `TELEGRAM_BOT_TOKEN` | _(unset)_ | `src/lib/telegram/config.ts` | token របស់ BotFather ដែលបើកដំណើរការ inbound webhook និងចុះហត្ថលេខាលើ `initData` របស់ Mini App។ | | `TELEGRAM_WEBHOOK_SECRET` | _(unset)_ | `src/lib/telegram/config.ts` | secret រួមដែលបានចុះឈ្មោះតាមរយៈ `setWebhook` ហើយផ្ទៀងផ្ទាត់ជាមួយ header `X-Telegram-Bot-Api-Secret-Token` រាល់ពេល webhook ត្រូវបានបញ្ជូន។ ត្រូវការសម្រាប់ផ្លូវ webhook; ប្រសិនបើមិនបានកំណត់ ការបញ្ជូន webhook នឹងត្រូវបដិសេធដោយ 503។ | | `TELEGRAM_DEFAULT_MODEL` | `auto/chat` | `src/lib/telegram/chatProxy.ts` | model ដែលប្រើសម្រាប់ការឆ្លើយតប chat របស់ Telegram។ | | `TELEGRAM_BOT_API_BASE` | `https://api.telegram.org` | `src/lib/telegram/config.ts` | ការកំណត់ជំនួស base URL របស់ Bot API សម្រាប់ proxy ឬ server Bot API ដែល host ដោយខ្លួនឯង។ | | `TELEGRAM_WEBHOOK_TIMEOUT_MS` | `60000` | `src/lib/telegram/config.ts` | រយៈពេលអស់សុពលភាពគិតជាមិលីវិនាទី សម្រាប់ការហៅ Bot API ខាងក្រៅ។ | | `TELEGRAM_USER_ALLOWLIST_ENABLED` | `false` | `src/lib/telegram/config.ts` | កំណត់ជា `true` ដើម្បីបម្រើតែអ្នកប្រើ Telegram ដែលមានរាយក្នុង `TELEGRAM_ALLOWED_USER_IDS` (អ្នកផ្សេងទៀត៖ Mini App ទទួល 403 ហើយសាររបស់ webhook ត្រូវបានបោះចោល)។ តាមលំនាំដើមវាត្រូវបានបិទ៖ អ្នកប្រើ Telegram គ្រប់រូបត្រូវបានបម្រើ និងទទួល API key ដែលបានបង្កើតថ្មី ហើយប្រើកូតាខាងលើ។ | | `TELEGRAM_ALLOWED_USER_IDS` | _(unset)_ | `src/lib/telegram/config.ts` | លេខសម្គាល់អ្នកប្រើ Telegram ជាលេខ ដែលបំបែកដោយក្បៀស ហើយត្រូវបានបម្រើនៅពេល `TELEGRAM_USER_ALLOWLIST_ENABLED=true`។ ធាតុដែលមិនមែនជាចំនួនគត់វិជ្ជមានធម្មតា នឹងត្រូវមិនអើពើជាមួយការព្រមានម្តងតែប៉ុណ្ណោះ។ វាត្រូវបានមិនអើពើនៅពេល allowlist បិទ; ប្រសិនបើទទេនៅពេល allowlist បើក នឹងមិនបម្រើអ្នកណាម្នាក់ទេ។ | | `OMNIROUTE_OPTIONAL_PACK_TAR` | `1` (enabled) | `scripts/build/optionalPackStaging.mjs` | កំណត់ជា `0` ដើម្បីរំលងការបង្កើត tarball `.tar.gz` ខណៈពេលរៀបចំ ML/browser pack ជាជម្រើសសម្រាប់ Electron standalone tree (ថត pack និង `optional-packs.index.json` នៅតែត្រូវបានបង្កើត)។ ប្រើដោយលំហូរការងារចេញផ្សាយ desktop ដើម្បីកាត់បន្ថយទំហំផ្ទុក artifact សម្រាប់ការបង្ហោះ។ | | `GROK_SUBSCRIPTION_IMAGES_ENABLED` | `false` | `open-sse/config/imageRegistry.ts` | បើកការចុះឈ្មោះផ្លូវរូបភាពសម្រាប់ការជាវ xAI; តាមលំនាំដើមត្រូវបានបិទ ដើម្បីរក្សាផ្លូវរូបភាព API-key ឱ្យនៅដដែល។ | | `OMNIROUTE_API_KEY_COOLDOWN_MS` | `60000` | `open-sse/services/apiKeyRotator.ts` | រយៈពេលរង់ចាំជាមិលីវិនាទីសម្រាប់ key នីមួយៗ នៅពេលការឆ្លើយតប `429` មិនមានព័ត៌មាន `Retry-After` ដែលអាចប្រើបាន។ | | `OMNIROUTE_ESTIMATOR_CALIBRATION` | enabled | `open-sse/services/estimatorCalibration.ts` | កំណត់ទៅជា `off`, `0`, ឬ `false` ដើម្បីបិទការកត់ត្រា និងការអនុវត្តការកាលីប្រេសិនរបស់ estimator ក្នុងអង្គចងចាំ។ | | `NEXT_MANUAL_SIG_HANDLE` | _(ផ្ទៃក្នុង)_ | `scripts/dev/standalone-server-ws.mjs` | ការបដិសេធ signal-handler របស់ standalone-server ផ្ទៃក្នុង; ជាទូទៅ launcher ជាអ្នកកំណត់ និងលុបតម្លៃនេះ ជំនួសឱ្យការកំណត់ដោយប្រតិបត្តិករ។ | | `CHATGPT_WEB_TURN_TIMEOUT_MS` | `180000` | `open-sse/utils/chatgptWebExecutorAdapter.ts` | រយៈពេលអតិបរមាសម្រាប់ text turn នីមួយៗរបស់ ChatGPT Web (Clean Room); តម្លៃក្រោម `1000` នឹងត្រូវបានមិនអើពើ។ | | `CHATGPT_WEB_TOOL_TURN_TIMEOUT_MS` | `180000` | `open-sse/utils/chatgptWebExecutorAdapter.ts` | រយៈពេលអតិបរមាសម្រាប់ turn នីមួយៗរបស់ ChatGPT Web (Clean Room) ដែលភ្ជាប់ client tools (ស្រោម `` ដែលត្រូវបានធ្វើត្រាប់តាម); បន្ថយតម្លៃនេះ ដើម្បីប្រគល់ការគ្រប់គ្រងទៅ client បានលឿនជាងមុន។ តម្លៃក្រោម `1000` នឹងត្រូវបានមិនអើពើ។ | | `CHATGPT_WEB_HEADLESS` | `1` (គ្មានផ្ទាំងបង្ហាញ) | `open-sse/utils/chatgptWebExecutorAdapter.ts` | ដំណើរការកម្មវិធីរុករក ChatGPT Web (Clean Room) ក្នុងរបៀប headless។ កំណត់ជា `0` សម្រាប់តែគណនីដែល first-party challenge របស់ពួកវាបដិសេធរបៀប headless ប៉ុណ្ណោះ (លំនាំដើមបានប្តូរពី headed ទៅ headless ក្នុង #14948)។ | | `CHATGPT_WEB_BROWSER_ACQUIRE_TIMEOUT_MS` | `45000` | `open-sse/utils/chatgptWebExecutorAdapter.ts` | រយៈពេលអតិបរមាសម្រាប់បើកកម្មវិធីរុករក ChatGPT Web (Clean Room) និងរៀបចំ chatgpt.com ឱ្យរួចរាល់ ដើម្បីកុំឱ្យកម្មវិធីរុករក ឬ session ដែលមិនដំណើរការ ប្រើអស់រយៈពេលកំណត់នៃជួរសំណើ។ | | `UI_KIT_CLONE` | `_references/cheaper-inference-ui-kit` | `scripts/check/check-ui-kit-snapshot.mjs` | ផ្លូវទៅកាន់ UI Kit clone ឯកជនរបស់ CI ដែល vendored-snapshot gate ប្រើប្រៀបធៀប `packages/ui-kit/src` (KEA-7886); gate នឹងរំលងជាមួយការព្រមាន នៅពេល clone មិនមាន។ | ### ChatGPT Web (Codex) លំនាំដើមសកលសម្រាប់កម្មវិធីរុករក headless និង tool-tunnel ដែលចេញក្រៅ។ តម្លៃ Connection ដែលបានកំណត់ក្នុង Dashboard មានអាទិភាពជាង។ | Variable | Default | Source File | Description | | --------------------------------------- | ------------------------------ | -------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `CHATGPT_WEB_CODEX_CHROME_PATH` | _(auto-detect)_ | `open-sse/executors/chatgpt-web-codex.ts` | ផ្លូវ Chrome/Chromium ជាក់លាក់ សម្រាប់ប្រតិបត្តិការ npm-, systemd- និង PM2។ | | `CHROME_PATH` | _(auto-detect)_ | `open-sse/executors/chatgpt-web-codex.ts` | ជម្រើសបម្រុងរួម សម្រាប់ផ្លូវ Chrome/Chromium ជាក់លាក់។ | | `CHATGPT_WEB_CODEX_CDP_URL` | _(unset)_ | `open-sse/executors/chatgpt-web-codex.ts` | ចំណុចបញ្ចប់ CDP ខាងក្នុង; Docker ប្រើ sidecar នៅលើ port `9223`។ | | `CHATGPT_WEB_CODEX_USE_CDP_PROFILE` | _(unset — off)_ | `open-sse/vendor/codex-chatgpt-web/persistent-cdp-context.ts` | កំណត់ជា `1` (ដោយបានកំណត់ចំណុចបញ្ចប់ CDP) ដើម្បីប្រើទំព័រ ChatGPT ដែលមានស្រាប់របស់ប្រវត្តិរូបកម្មវិធីរុករកដែលគ្រប់គ្រងពីខាងក្រៅ និងបានចូលប្រើរួច ជំនួសឱ្យបរិបទដាច់ដោយឡែកសម្រាប់មួយជុំ; វាក៏កំណត់ចំនួនផ្ទាំង ChatGPT ដែលដំណើរការស្របគ្នាឱ្យនៅត្រឹម 1 ផងដែរ។ ត្រូវបានបិទតាមលំនាំដើម។ សូមមើល [ប្រវត្តិរូប CDP ដែលបន្តរក្សាទុក](../guides/CHATGPT-WEB-PERSISTENT-CDP.md)។ | | `CDP_PROXY_TOKEN` | _(unset)_ | `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` | _(unset)_ | `open-sse/executors/chatgpt-web-codex.ts` | Tunnel ID សកលរបស់ OpenAI សម្រាប់ជុំឧបករណ៍ Codex ក្នុងមូលដ្ឋាន។ | | `CHATGPT_WEB_CODEX_RUNTIME_KEY` | _(unset)_ | `open-sse/executors/chatgpt-web-codex.ts` | Runtime-Key សកលរបស់ Tunnel; មិនត្រូវបញ្ចេញក្នុង logs ឡើយ។ | | `CHATGPT_WEB_CODEX_CONNECTOR_NAME` | `OmniRoute Codex v2` | `open-sse/executors/chatgpt-web-codex.ts` | ឈ្មោះពិតប្រាកដរបស់ ChatGPT-Custom-Connector ដែលបានបង្កើតថ្មី សម្រាប់ស្ពាន MCP។ | | `CODEX_CHATGPT_WEB_HOME` | `/chatgpt-web-codex` | `open-sse/vendor/codex-chatgpt-web/config.ts` | ថតជាក់លាក់សម្រាប់ស្ថានភាពរបស់កម្មវិធីរុករក, Broker និង Tunnel។ | | `CODEX_CHATGPT_WEB_BROWSER_DIAGNOSTICS` | `0` | `open-sse/vendor/codex-chatgpt-web/adapters/chatgpt-web/browser-worker.ts` | នៅពេលជា `1` នឹងចាប់យករូបភាពវិភាគរបស់កម្មវិធីរុករកនៅគ្រប់ចំណុចត្រួតពិនិត្យ។ | | `CODEX_CHATGPT_WEB_LAUNCHER` | _(unset)_ | `open-sse/vendor/codex-chatgpt-web/config.ts` | ផ្លូវពេញលេញជាជម្រើស ទៅកាន់ឯកសារប្រព័ន្ធ Launcher ដែលអាចរក្សាឱ្យដំណើរការជាប់ជានិច្ច។ | | `CODEX_CHATGPT_WEB_BUN` | _(រកឃើញដោយស្វ័យប្រវត្តិ)_ | `open-sse/vendor/codex-chatgpt-web/config.ts` | ផ្លូវពេញលេញជាជម្រើសទៅកាន់ឯកសារ binary runtime របស់ Bun។ | | `CODEX_WEB_GPT_BUN` | _(មិនបានកំណត់)_ | `open-sse/vendor/codex-chatgpt-web/config.ts` | ជាជម្រើសត្រឡប់ក្រោយសម្រាប់ `CODEX_CHATGPT_WEB_BUN` ដែលមានស្រាប់; ការរៀបចំថ្មីៗប្រើឈ្មោះស្តង់ដារ។ | --- ## ស្ពាន OmniConductor អ្នកប្រើប្រាស់ SSE ដែលមានអាយុកាលយូរ សម្រាប់ឆ្លុះបញ្ចាំងភារកិច្ចរបស់មជ្ឈមណ្ឌល OmniConductor ទៅក្នុង A2A TaskManager មូលដ្ឋាន (`src/lib/conductor/`)។ ជាជម្រើសបើកប្រើ — ស្ពាននេះចាប់ផ្តើមតែពេលកំណត់ `CONDUCTOR_HUB_URL` ប៉ុណ្ណោះ។ ដំណើរការតែខាងម៉ាស៊ីនមេ៖ token របស់ hub មិនត្រូវទៅដល់កម្មវិធីរុករកឡើយ។ | Variable | Default | Source File | Description | | ------------------------------ | ----------------------- | -------------------------------- | ----------------------------------------------------------------------------------------------------------------------- | | `CONDUCTOR_HUB_URL` | _(ទទេ)_ | `src/lib/conductor/boot.ts` | URL មូលដ្ឋានរបស់ hub OmniConductor (ឧ. `http://127.0.0.1:7910`)។ មិនកំណត់ = បិទស្ពាន។ | | `CONDUCTOR_HUB_TOKEN` | _(ទទេ)_ | `src/lib/conductor/boot.ts` | លិខិតសម្គាល់របស់ hub សម្រាប់ feed SSE — បញ្ចេញ peer ប្រភេទ `spokesperson` នៅលើ hub (`POST /v1/peers`, អ្នកគ្រប់គ្រង)។ | | `CONDUCTOR_ORCHESTRATOR_TOKEN` | _(ទទេ)_ | `src/lib/conductor/hubProxy.ts` | លិខិតសម្គាល់សម្រាប់ការបញ្ជូនភារកិច្ច 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) ដែលនៅពីក្រោយប្រូកស៊ីជជែករបស់ផ្ទាំងគ្រប់គ្រង (`/api/conductor/ask`)។ | ### ការរៀបចំកាលវិភាគដែលយល់ដឹងអំពីកូតា ប្រើដោយ `open-sse/services/combo.ts` និង `src/lib/quota/quotaScheduler.ts` សម្រាប់ការត្រួតពិនិត្យថវិកា token មុនពេលស្នើសុំ។ ជាជម្រើសបើកប្រើ — ឥរិយាបថបញ្ជូនតាមលំនាំដើមនៅតែមិនផ្លាស់ប្តូរ នៅពេលមិនបានកំណត់។ | Variable | Default | Source File | Description | | ---------------------------------- | ------- | ------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | `OMNIROUTE_QUOTA_AWARE_ROUTING` | `0` | `open-sse/services/combo.ts` | នៅពេល `1` រំលងការតភ្ជាប់ដែលថវិកា token ក្នុងមួយបង្អួច (`rateLimitOverrides.tpm`, តារាង `provider_quota_state`) មិនអាចគ្រប់គ្រាន់សម្រាប់ថ្លៃស្នើសុំដែលបានប៉ាន់ស្មាន មុនពេលបញ្ជូន។ អនុញ្ញាតឱ្យបរាជ័យបើក នៅពេលមិនបានកំណត់ថវិកា។ | | `OMNIROUTE_ESTIMATOR_CALIBRATION` | _(បើក)_ | `open-sse/services/estimatorCalibration.ts` | ការក្រិតតាមមតិត្រឡប់របស់ឧបករណ៍ប៉ាន់ស្មាន token សម្រាប់ការការពារបរិបទ (#14931)៖ EMA ក្នុងអង្គចងចាំប៉ុណ្ណោះ សម្រាប់មួយ (អ្នកផ្តល់សេវា, ម៉ូដែល, វត្តមាន tools) នៃ `usage.prompt_tokens` / ការប៉ាន់ស្មាន ដែលកំណត់ក្នុងចន្លោះ 0.15–2.0។ `off`, `0` ឬ `false` បិទការកត់ត្រា និងការអនុវត្ត។ | | `GROK_SUBSCRIPTION_IMAGES_ENABLED` | `false` | `open-sse/config/imageRegistry.ts` | ចុះបញ្ជីផ្លូវរូបភាព `xai-oauth` (`xao`) និង `grok-cli`។ ជាទង់មុខងាររបស់ផ្ទាំងគ្រប់គ្រងដែលមានឈ្មោះដូចគ្នា; ការកំណត់ជំនួសពី DB មានអាទិភាពលើតម្លៃនេះ។ | ## ការវិនិច្ឆ័យការធ្វើសមកាលកម្មម៉ូដែល | អថេរ | តម្លៃលំនាំដើម | ឯកសារប្រភព | ការពិពណ៌នា | | ------------------------------ | ------------- | -------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `OMNIROUTE_MODEL_SYNC_TIMINGS` | `0` | `src/lib/providerModels/modelSyncTimings.ts` | កំណត់ជា `1` ដើម្បីកត់ត្រាពេលវេលានៃដំណាក់កាល, ID សំណើដែលបានបង្កើត និងលទ្ធផលជោគជ័យ/កំហុសរបស់ដំណាក់កាលក្នុងអំឡុងពេលធ្វើសមកាលកម្មម៉ូដែល។ បិទសម្រាប់តម្លៃផ្សេងទៀតទាំងអស់។ កំណត់ត្រាមិនរួមបញ្ចូល payload របស់សំណើ, គណនី, កាតាឡុក និងកំហុសទេ។ | ## ឧបករណ៍វិភាគមេឌៀ OpenCode ក្នុងមូលដ្ឋាន ប្រើដោយ `scripts/cli/omniroute-media-mcp.mjs`។ កំណត់តម្លៃទាំងនេះនៅក្នុងបរិស្ថានដំណើរការឧបករណ៍ក្នុងមូលដ្ឋាន។ | អថេរ | តម្លៃលំនាំដើម | សេចក្តីពិពណ៌នា | | -------------------------- | -------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------- | | `OMNIROUTE_MEDIA_CONFIG` | `$XDG_CONFIG_HOME/opencode/opencode.json` (ឬ `~/.config/opencode/opencode.json`) | ការកំណត់រចនាសម្ព័ន្ធ OpenCode ដែលឧបករណ៍មេឌៀ និងកម្មវិធីដំឡើងអាន។ | | `OMNIROUTE_MEDIA_PROVIDER` | `omniroute` | ធាតុអ្នកផ្តល់សេវាដែលឧបករណ៍មេឌៀអានពីការកំណត់រចនាសម្ព័ន្ធ OpenCode។ | | `OMNIROUTE_MEDIA_MODEL` | `auto` | ម៉ូដែលដែលឧបករណ៍មេឌៀដាក់ស្នើ។ អ្នកផ្តល់សេវារបស់វាត្រូវតែគាំទ្រប្រភេទមេឌៀដែលបានស្នើសុំ។ | | `OMNIROUTE_MEDIA_API_KEY` | Configured provider API key or its environment reference | ព័ត៌មានសម្ងាត់ជំនួសជាជម្រើស។ រក្សាទុកវានៅក្នុងបរិស្ថានដំណើរការក្នុងមូលដ្ឋាន។ កុំធ្វើ commit វា។ |