# 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) · 🇧🇦 [bs](../../../bs/docs/reference/ENVIRONMENT.md) · 🇨🇿 [cs](../../../cs/docs/reference/ENVIRONMENT.md) · 🇩🇰 [da](../../../da/docs/reference/ENVIRONMENT.md) · 🇩🇪 [de](../../../de/docs/reference/ENVIRONMENT.md) · 🇬🇷 [el](../../../el/docs/reference/ENVIRONMENT.md) · 🇪🇸 [es](../../../es/docs/reference/ENVIRONMENT.md) · 🇪🇪 [et](../../../et/docs/reference/ENVIRONMENT.md) · 🇮🇷 [fa](../../../fa/docs/reference/ENVIRONMENT.md) · 🇫🇮 [fi](../../../fi/docs/reference/ENVIRONMENT.md) · 🇫🇷 [fr](../../../fr/docs/reference/ENVIRONMENT.md) · 🇮🇪 [ga](../../../ga/docs/reference/ENVIRONMENT.md) · 🇮🇳 [gu](../../../gu/docs/reference/ENVIRONMENT.md) · 🇳🇬 [ha](../../../ha/docs/reference/ENVIRONMENT.md) · 🇮🇱 [he](../../../he/docs/reference/ENVIRONMENT.md) · 🇮🇳 [hi](../../../hi/docs/reference/ENVIRONMENT.md) · 🇭🇷 [hr](../../../hr/docs/reference/ENVIRONMENT.md) · 🇭🇺 [hu](../../../hu/docs/reference/ENVIRONMENT.md) · 🇦🇲 [hy](../../../hy/docs/reference/ENVIRONMENT.md) · 🇮🇩 [id](../../../id/docs/reference/ENVIRONMENT.md) · 🇳🇬 [ig](../../../ig/docs/reference/ENVIRONMENT.md) · 🇮🇹 [it](../../../it/docs/reference/ENVIRONMENT.md) · 🇯🇵 [ja](../../../ja/docs/reference/ENVIRONMENT.md) · 🇬🇪 [ka](../../../ka/docs/reference/ENVIRONMENT.md) · 🇰🇭 [km](../../../km/docs/reference/ENVIRONMENT.md) · 🇮🇳 [kn](../../../kn/docs/reference/ENVIRONMENT.md) · 🇰🇷 [ko](../../../ko/docs/reference/ENVIRONMENT.md) · 🇱🇹 [lt](../../../lt/docs/reference/ENVIRONMENT.md) · 🇱🇻 [lv](../../../lv/docs/reference/ENVIRONMENT.md) · 🇮🇳 [ml](../../../ml/docs/reference/ENVIRONMENT.md) · 🇮🇳 [mr](../../../mr/docs/reference/ENVIRONMENT.md) · 🇲🇾 [ms](../../../ms/docs/reference/ENVIRONMENT.md) · 🇲🇹 [mt](../../../mt/docs/reference/ENVIRONMENT.md) · 🇲🇲 [my](../../../my/docs/reference/ENVIRONMENT.md) · 🇳🇵 [ne](../../../ne/docs/reference/ENVIRONMENT.md) · 🇳🇱 [nl](../../../nl/docs/reference/ENVIRONMENT.md) · 🇳🇴 [no](../../../no/docs/reference/ENVIRONMENT.md) · 🇮🇳 [or](../../../or/docs/reference/ENVIRONMENT.md) · 🇮🇳 [pa](../../../pa/docs/reference/ENVIRONMENT.md) · 🇵🇭 [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 দ্বারা স্বীকৃত প্রতিটি environment variable-এর সম্পূর্ণ রেফারেন্স।
> দ্রুত শুরু করার template-এর জন্য [`.env.example`](../../.env.example) দেখুন।
> [!IMPORTANT]
> এখানে নথিভুক্ত প্রতিটি variable অবশ্যই `.env.example`-এ থাকতে হবে, এবং
> `.env.example`-এর প্রতিটি variable অবশ্যই এখানে থাকতে হবে। commit করার সময় এবং CI-তে `npm run check:env-doc-sync`
> এটি প্রয়োগ করে। ইচ্ছাকৃতভাবে কোনো variable বাদ দিতে হলে, সেটিকে
> `scripts/check/check-env-doc-sync.mjs`-এর allowlist-এ যোগ করুন।
---
## সূচিপত্র
- [1. আবশ্যিক Secret](#1-required-secrets)
- [2. Storage ও Database](#2-storage--database)
- [3. Network ও Port](#3-network--ports)
- [4. Security ও Authentication](#4-security--authentication)
- [5. Input Sanitization ও PII সুরক্ষা](#5-input-sanitization--pii-protection)
- [6. Tool ও Routing নীতি](#6-tool--routing-policies)
- [7. URL ও Cloud Sync](#7-urls--cloud-sync)
- [8. Outbound Proxy](#8-outbound-proxy)
- [9. CLI Tool Integration](#9-cli-tool-integration)
- [10. Internal Agent ও MCP Integration](#10-internal-agent--mcp-integrations)
- [11. OAuth Provider Credential](#11-oauth-provider-credentials)
- [12. Provider User-Agent Override](#12-provider-user-agent-overrides)
- [13. CLI Fingerprint Compatibility](#13-cli-fingerprint-compatibility)
- [14. API Key Provider](#14-api-key-providers)
- [15. Timeout সেটিংস](#15-timeout-settings)
- [16. Logging](#16-logging)
- [17. Memory Optimization](#17-memory-optimization)
- [18. Pricing Sync](#18-pricing-sync)
- [19. Model Sync (Dev)](#19-model-sync-dev)
- [20. Provider-নির্দিষ্ট সেটিংস](#20-provider-specific-settings)
- [21. Proxy Health](#21-proxy-health)
- [22. Debugging](#22-debugging)
- [23. GitHub Integration](#23-github-integration)
- [24. Skills Sandbox (v3.8.0+)](#24-skills-sandbox-v380)
- [27. Radar Feed (Self-Hosting)](#27-radar-feed-self-hosting)
- [Deployment পরিস্থিতি](#deployment-scenarios)
- [Audit: অপসারিত / অব্যবহৃত Variable](#audit-removed--dead-variables)
---
## 1. আবশ্যিক Secret
প্রথমবার চালানোর আগে এগুলো **অবশ্যই** সেট করতে হবে। এগুলো ছাড়া application হয় চালু হতে অস্বীকৃতি জানাবে, নয়তো অনিরাপদ default দিয়ে কাজ করবে।
| ভেরিয়েবল | আবশ্যক | ডিফল্ট | সোর্স ফাইল | বিবরণ |
| ---------------------------- | --------------------- | --------------------------- | --------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `JWT_SECRET` | **হ্যাঁ** | _(কোনোটিই নয়)_ | `src/lib/auth` | সব ড্যাশবোর্ড সেশন কুকি (JWT) স্বাক্ষর/যাচাই করে। `openssl rand -base64 48` দিয়ে তৈরি করুন। |
| `API_KEY_SECRET` | **হ্যাঁ** | _(কোনোটিই নয়)_ | `src/lib/db/apiKeys.ts` | SQLite-এ সংরক্ষিত API কী-এর মানগুলোর জন্য AES এনক্রিপশন কী। `openssl rand -hex 32` দিয়ে তৈরি করুন। |
| `INITIAL_PASSWORD` | **হ্যাঁ** | `CHANGEME` | বুটস্ট্র্যাপ স্ক্রিপ্ট | প্রাথমিক অ্যাডমিন ড্যাশবোর্ড পাসওয়ার্ড নির্ধারণ করে (`.env.example`-এর ডিফল্টের সঙ্গে মেলে—পরিবর্তন করতে বাধ্য করার জন্য ইচ্ছাকৃতভাবে স্পষ্টতই অনিরাপদ রাখা হয়েছে)। **প্রথমবার ব্যবহারের আগে পরিবর্তন করুন।** লগইন করার পর Dashboard → Settings → Security থেকে পরিবর্তন করুন। |
| `OMNIROUTE_WS_BRIDGE_SECRET` | **হ্যাঁ** (প্রোডাকশন) | _(সেট করা নেই)_ | `src/app/api/internal/codex-responses-ws/route.ts` | অভ্যন্তরীণ Codex Responses WebSocket ব্রিজের জন্য শেয়ার্ড সিক্রেট। Electron/ব্রাউজার WS রিলে ও OmniRoute-এর মধ্যকার ব্রিজ অনুরোধগুলো প্রমাণীকরণ করে। ⚠️ **প্রোডাকশনে আবশ্যক—এটি সেট করা না থাকলে সব WS ব্রিজ অনুরোধ প্রত্যাখ্যাত হয়।** `openssl rand -base64 32` দিয়ে তৈরি করুন। |
| `OMNIROUTE_SW_BUILD_ID` | না | _(git SHA)_ | `next.config.mjs`, `scripts/build/assembleStandalone.mjs` | PWA শেলের (#11779) জন্য সুস্পষ্ট সার্ভিস-ওয়ার্কার ক্যাশ-বস্টিং আইডি; রেজোলিউশন চেইনে প্রথম। |
| `SOURCE_VERSION` | না | _(সেট করা নেই)_ | `next.config.mjs`, `scripts/build/assembleStandalone.mjs` | চেইনে দ্বিতীয়—ডিপ্লয় করা কমিট হিসেবে PaaS বিল্ডারগুলো (যেমন Heroku-ধাঁচের) এটি সেট করে। |
| `NEXT_PUBLIC_SW_BUILD_ID` | না | _(উদ্ভূত)_ | `src/shared/components/PwaRegister.tsx` | বিল্ড-টাইমের পাবলিক মান, যা ক্লায়েন্ট `/sw.js?v=…` নিবন্ধনের জন্য ব্যবহার করে; উপরের দুটি থেকে এবং এরপর git SHA থেকে উদ্ভূত। |
| `OMNIROUTE_PEER_STAMP_TOKEN` | না (স্বয়ংক্রিয়) | _(প্রতি বুটে স্বয়ংক্রিয়)_ | `src/server/authz/policies/management.ts` | প্রতি-প্রসেস সিক্রেট, যা প্রমাণ করে যে বিশ্বস্ত পিয়ার-IP স্ট্যাম্পটি OmniRoute-এর নিজস্ব HTTP সার্ভার (`scripts/dev/peer-stamp.mjs`) থেকে এসেছে। স্ট্যাম্পে এই টোকেন থাকলেই শুধু authz মিডলওয়্যার অনুরোধের স্থানীয়তা (LOCAL_ONLY রুটের লুপব্যাক/LAN গেটিং) বিশ্বাস করে। প্রতি বুটে স্বয়ংক্রিয়ভাবে তৈরি হয়—সেট না করাই শ্রেয়; কেবল সেই মাল্টি-প্রসেস সেটআপগুলোর জন্য এটি নির্দিষ্ট করে দিন, যেগুলোকে স্ট্যাম্পটি শেয়ার করতে হবে। |
### তৈরির কমান্ডসমূহ
```bash
# চারটি সিক্রেটই একসঙ্গে তৈরি করুন:
echo "JWT_SECRET=$(openssl rand -base64 48)"
echo "API_KEY_SECRET=$(openssl rand -hex 32)"
echo "INITIAL_PASSWORD=$(openssl rand -base64 16)"
echo "OMNIROUTE_WS_BRIDGE_SECRET=$(openssl rand -base64 32)"
```
> [!CAUTION]
> প্রকৃত সিক্রেটসহ `.env` ফাইল কখনোই ভার্সন কন্ট্রোলে কমিট করবেন না। `.gitignore` ইতিমধ্যেই `.env` বাদ দেয়, তবে পুশ করার আগে যাচাই করুন।
---
## 2. স্টোরেজ ও ডেটাবেস
OmniRoute সব ধরনের স্থায়ী ডেটা সংরক্ষণের জন্য **SQLite** (`better-sqlite3`-এর মাধ্যমে) ব্যবহার করে। এই ভেরিয়েবলগুলো ডেটার অবস্থান, এনক্রিপশন এবং জীবনচক্র নিয়ন্ত্রণ করে।
| ভেরিয়েবল | ডিফল্ট | সোর্স ফাইল | বিবরণ |
| ------------------------------------------ | ----------------------------- | ----------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `DATA_DIR` | `~/.omniroute/` | `src/lib/db/core.ts` | SQLite DB, ব্যাকআপ এবং ডেটা ফাইলের রুট ডিরেক্টরি। Docker ভলিউম বা কাস্টম পাথের জন্য এটি ওভাররাইড করুন। |
| `OMNIROUTE_ALLOW_DEFAULT_DATA_DIR` | _(সেট করা নেই)_ | `src/lib/dataPaths.ts` | টেস্ট/eval DATA_DIR গার্ডের (#10428) জন্য একটি বিকল্প ব্যবস্থা। `DATA_DIR` ছাড়া চালানো টেস্ট এবং Node eval/print প্রোবগুলোকে (`-e`/`--eval`/`-p`/`--print`, `--eval=`/`--print=` ফর্মসহ) একটি অস্থায়ী পরিত্যাজ্য ডিরেক্টরিতে পুনর্নির্দেশ করা হয়, যাতে সেগুলো অপারেটরের প্রকৃত ডেটাবেস খুলতে না পারে; প্রকৃত ডিরেক্টরি আবার ব্যবহার করতে চাইলে এটিকে `1`-এ সেট করুন। |
| `OMNIROUTE_BUILD_SHA` | _(সেট করা নেই)_ | `src/lib/monitoring/buildSha.ts` | চলমান আর্টিফ্যাক্টের Git SHA। `npm run build:release` দ্বারা স্ট্যাম্প করা হয়; যেসব কনটেইনারে `dist/BUILD_SHA` সেন্টিনেল থাকে না, সেগুলোতে ইনজেক্ট করা যায়। `/api/monitoring/health`-এ `system.buildSha` হিসেবে প্রকাশ করা হয়। |
| `OMNIROUTE_RELEASE_REF` | `origin/main` | `scripts/build/buildProvenance.ts` | প্যাক-আর্টিফ্যাক্ট প্রোভেন্যান্স গেট যে ref-এর বিপরীতে বিল্ড SHA যাচাই করে (#10427)। |
| `OMNIROUTE_ALLOW_CANARY_BUILD` | _(সেট করা নেই)_ | `scripts/build/buildProvenance.ts` | যে বিল্ডের SHA রিলিজ লাইনে নেই, সেটিকে প্যাক করার অনুমতি দিতে `1`-এ সেট করুন; এতে গেট ব্যর্থ হওয়ার পরিবর্তে বিল্ডটি ইচ্ছাকৃত canary হিসেবে রেকর্ড করা হবে (#10427)। |
| `OMNIROUTE_SMOKE_API_KEY` | _(সেট করা নেই)_ | `scripts/ops/deploy-canary.mjs` | canary-deploy স্মোক প্রোবের API কী, যা `/v1/chat/completions`-এ `Authorization: Bearer` হিসেবে পাঠানো হয়। এটি শুধু ডিপ্লয় স্ক্রিপ্ট দ্বারা ব্যবহৃত হয় (#10429), সার্ভার কখনো এটি ব্যবহার করে না। অপ্ট-ইন CLI স্মোক হারনেসের `OMNIROUTE_SMOKE_*` ভেরিয়েবলগুলোর (`RUN_CLI_SMOKE=1`, `OMNIROUTE_SMOKE_BASE_URL/MODEL/API_KEY_ENV/TARGETS/TIMEOUT_MS`, যা `tests/integration/upstream-cli-smoke.int.test.ts`-এ রয়েছে) সঙ্গে এটি সম্পর্কিত নয় — দেখুন [CLI ইন্টিগ্রেশন → প্রকৃত স্মোক সুইপ](../guides/CLI-INTEGRATIONS.md)। |
| `OMNIROUTE_BUILDING` | _(সেট করা নেই)_ | `src/lib/buildPhase.ts` | বিল্ড-ফেজ সংকেত (#10060): `scripts/build/build-next-isolated.mjs` এটিকে `1`-এ সেট করে এবং প্রতিটি তৈরি করা বিল্ড ওয়ার্কার এটি উত্তরাধিকারসূত্রে পায়, যাতে DB স্তর নেটিভ better-sqlite3 অ্যাডঅন লোড করার পরিবর্তে কোনো কাজ না করা একটি স্টাব ফেরত দেয় (অ্যাডঅনটি প্রস্থানকালে ওয়ার্কারকে বন্ধ করে দেয়)। চলমান সার্ভারের জন্য এটি কখনো সেট করা হয় না। |
| `OMNIROUTE_SKIP_NATIVE_DEP_CHECK` | `0` | `scripts/check/check-native-deps.mjs` | অস্বাভাবিক ভেন্ডরড ট্রির ক্ষেত্রে ঐচ্ছিক নেটিভ-ডিপেন্ডেন্সি প্রিবিল্ড যাচাই এড়াতে এটিকে `1`-এ সেট করুন। এটি কোনো অনুপস্থিত ডিপেন্ডেন্সিকে বিল্ডযোগ্য করে না; কেবল তখনই ব্যবহার করুন, যখন নেটিভ ডিপেন্ডেন্সিগুলো অন্য কোনো উপায়ে সরবরাহ করা হয়। |
| `OMNIROUTE_DATA_DIR` | _(সেট করা নেই)_ | `open-sse/executors/promptql/threadSticky.ts` | `DATA_DIR`-এর **ফলব্যাক উপনাম**, যা কেবল `DATA_DIR` সেট করা না থাকলেই পরীক্ষা করা হয়। PromptQL এক্সিকিউটরের ডিস্কে থাকা থ্রেড-স্টিকি সেশন ক্যাশ (`
/promptql-thread-sessions.json`) খুঁজে পেতে এটি ব্যবহৃত হয়; কোনো ভেরিয়েবলই সেট করা না থাকলে ক্যাশটি শুধু মেমরিতে থাকে (রিস্টার্টের পর সংরক্ষিত থাকে না)। |
| `OMNIROUTE_PLUGINS_DIR` | _(সেট করা নেই)_ | `src/lib/plugins/scanner.ts` | **রানটাইম প্লাগইন স্ক্যানার** যে ডিরেক্টরি পড়ে—এবং প্লাগইন ম্যানেজার যে রুটে ইনস্টল করে—এটি সেই ডিরেক্টরি নির্ধারণ করে এবং হোম থেকে উদ্ভূত ডিফল্টকে ওভাররাইড করে (#11827)। শুধু স্ক্যান পাথ স্থানান্তরের জন্য HOME সরানোর পরিবর্তে Docker/K8s-এ এটিকে bind-mounted প্লাগইন ট্রির দিকে নির্দেশ করুন (HOME অন্য সব হোম-আপেক্ষিক আচরণও নিয়ন্ত্রণ করে)। সেট করা না থাকলে = `~/.omniroute/plugins`; অথবা প্রসেস কোনো হোম এক্সপোর্ট না করলে `/tmp/.omniroute/plugins`—এই ভেরিয়েবলটি সেই নীরবভাবে প্লাগইন খুঁজে না পাওয়ার সমস্যাটি দূর করে। কার্যকর ডিরেক্টরিটি স্টার্টআপে একবার `scanner.dir_resolved` হিসেবে লগ করা হয়, সঙ্গে কোন ইনপুটটি প্রাধান্য পেয়েছে তাও উল্লেখ থাকে। শুধু সার্ভার-সাইডের জন্য: CLI কমান্ড প্লাগইনগুলো তাদের নিজস্ব `OMNIROUTE_PLUGIN_PATH` ব্যবহার করে (অনুচ্ছেদ 9)। |
| `STORAGE_ENCRYPTION_KEY` | _(খালি = নিষ্ক্রিয়)_ | `src/lib/db/encryption.ts` | সংরক্ষিত অবস্থায় সম্পূর্ণ SQLite ডেটাবেস এনক্রিপশনের জন্য AES কী। `openssl rand -hex 32` দিয়ে তৈরি করুন। |
| `STORAGE_ENCRYPTION_KEY_VERSION` | `v1` | `scripts/build/bootstrap-env.mjs`, `electron/main.js` | এনক্রিপশন কীর সংস্করণ লেবেল। পুরোনো ব্যাকআপ ডিক্রিপ্ট করার সুবিধার্থে কী রোটেশনের সময় এটি বৃদ্ধি করুন। |
| `DISABLE_SQLITE_AUTO_BACKUP` | `false` | `src/lib/db/backup.ts` | `true` হলে নিয়মিত/লেখার-পূর্ববর্তী SQLite ফাইল ব্যাকআপ (models.dev-এর মূল্য সংরক্ষণ/মুছে ফেলা, সেটিংস লেখা) এড়িয়ে যায়। ম্যানুয়াল এবং পুনরুদ্ধারের-পূর্ববর্তী ব্যাকআপ তখনও চলে। এটি মাইগ্রেশন রানারের বাধ্যতামূলক টেকসই সুরক্ষা স্ন্যাপশট বা বিদ্যমান স্থায়ী DB-এর জন্য গণ-মাইগ্রেশন সুরক্ষা **নিষ্ক্রিয় করে না**। অ-ম্যানুয়াল ব্যাকআপ সর্বোচ্চ প্রতি 60 মিনিটে একবারে সীমিত থাকে। ড্যাশবোর্ডের **Settings → Storage** থেকে নিয়মিত স্বয়ংক্রিয় ব্যাকআপ আলাদাভাবে নিষ্ক্রিয় করা যায়। |
| `OMNIROUTE_CRYPT_KEY` | _(সেট করা নেই)_ | `src/lib/db/encryption.ts` | `STORAGE_ENCRYPTION_KEY`-এর **পুরোনো উপনাম**। প্রাথমিক ভেরিয়েবলটি অনুপস্থিত থাকলে ফলব্যাক হিসেবে গৃহীত হয়। |
| `OMNIROUTE_API_KEY_BASE64` | _(সেট করা নেই)_ | `src/lib/db/encryption.ts` | **পুরোনো উপনাম** (Base64-এনকোড করা রূপ), যা ফলব্যাক হিসেবে গৃহীত হয়। ব্যবহারের আগে স্বয়ংক্রিয়ভাবে ডিকোড করা হয়। |
| `OMNIROUTE_DB_HEALTHCHECK_INTERVAL_MS` | _(সেট করা নেই)_ | `src/lib/db/core.ts` | পর্যায়ক্রমিক SQLite স্বাস্থ্য পরীক্ষার ব্যবধান (ms) ওভাররাইড করুন। সেট করা না থাকলে, ডিফল্ট মানগুলো `NODE_ENV` থেকে নির্ধারিত হয়। |
| `OMNIROUTE_WAL_TRUNCATE_INTERVAL_MS` | _(অপসারিত)_ | `src/lib/db/walMaintenance.ts` | **অপসারিত।** পর্যায়ক্রমিক লাইভ `wal_checkpoint(TRUNCATE)` শেয়ার করা wal-index ম্যাপিংকে অবৈধ করে SIGBUS (#13973) সহ প্রসেস ক্র্যাশ করাতে পারে, তাই শিডিউলারটি আর নেই। ভেরিয়েবলটি নিষ্ক্রিয়: ধনাত্মক মান দিলে একবারের একটি অবচয় সতর্কতা লগ হয়, আর `0` বা সেট না থাকলে নীরব থাকে। WAL নিচের PASSIVE চেকপয়েন্ট দ্বারা রক্ষণাবেক্ষিত এবং শাটডাউন চেকপয়েন্ট দ্বারা ট্রাঙ্কেট করা হয়। |
| `OMNIROUTE_WAL_PASSIVE_INTERVAL_MS` | `300000` (5m) | `src/lib/db/walMaintenance.ts` | ঘন ঘন `wal_checkpoint(PASSIVE)` চালানোর ব্যবধান (ms) ওভাররাইড করুন। মুলতুবি WAL ফ্রেমগুলো ছোট রাখে, ফলে চেকপয়েন্ট দ্রুত থাকে এবং শাটডাউনের সময় ট্রাঙ্কেশনের মধ্যবর্তী সময়ে WAL ফাইলের আকার সীমাবদ্ধ থাকে। `0` এটি নিষ্ক্রিয় করে। |
| `OMNIROUTE_WAL_GUARD_MAX_MB` | `256` | `src/lib/db/walMaintenance.ts` | কোনো PASSIVE টিক WAL ফাইলকে এই আকারের চেয়ে বড় পেলে `wal_checkpoint(RESTART)` চালায়, যাতে ম্যাপ করা wal-index পুনরায় না লিখেই WAL নতুন করে শুরু হয়। লাইভ ট্রাঙ্কেট-মোড চেকপয়েন্টগুলো অপসারণ করা হয়েছে (`OMNIROUTE_WAL_TRUNCATE_INTERVAL_MS` সারিটি দেখুন)। |
| `OMNIROUTE_PRESSURE_SELF_RESTART` | `false` | `open-sse/utils/resourcePressure.ts` | গুরুতর রিসোর্স চাপ `OMNIROUTE_PRESSURE_SELF_RESTART_AFTER_MS` সময় ধরে বজায় থাকলে প্রসেস থেকে বেরিয়ে যেতে এটি `1`/`true`/`yes`/`on`-এ সেট করুন; এতে অনির্দিষ্টকাল 503 পরিবেশন করার পরিবর্তে কোনো সুপারভাইজার (systemd `Restart=always`, Docker রিস্টার্ট নীতি) একটি পরিচ্ছন্ন প্রসেস পুনরায় চালু করতে পারবে। |
| `OMNIROUTE_PRESSURE_SELF_RESTART_AFTER_MS` | `120000` (2m) | `open-sse/utils/resourcePressure.ts` | স্ব-পুনরারম্ভের জন্য প্রসেস থেকে বেরিয়ে যাওয়ার আগে গুরুতর চাপ যতক্ষণ বজায় থাকতে হবে। |
| `OMNIROUTE_SQLJS_WASM_PATH` | _(স্বয়ংক্রিয়ভাবে শনাক্ত)_ | `src/lib/db/adapters/sqljsAdapter.ts` | `sql.js` WASM ফলব্যাক অ্যাডাপ্টার ব্যবহারের সময় `sql-wasm.wasm`-এর সুস্পষ্ট পাথ (অ্যাবসোলিউট বা cwd-এর সাপেক্ষে)। সেট করা না থাকলে প্যাকেজ নির্ভরতা এবং সম্ভাব্য লেআউটের মাধ্যমে স্বয়ংক্রিয়ভাবে শনাক্ত করা হয়। |
| `OMNIROUTE_BATCH_RETENTION_DAYS` | `30` | `src/lib/db/cleanup.ts` | কোনো চূড়ান্ত (সম্পন্ন/ব্যর্থ/বাতিল/মেয়াদোত্তীর্ণ) Batch API জবের চেকপয়েন্ট, উল্লেখিত ইনপুট/আউটপুট/ত্রুটি ফাইল এবং সারি মুছে ফেলার আগে স্বয়ংক্রিয় ক্লিনআপ সুইপে যত দিন রাখা হয়। কেবল `BATCH_AND_FILE_AUTO_CLEANUP_ENABLED` চালু করার পর কার্যকর হয়; OpenAI-এর নিজস্ব Batch API আউটপুট সংরক্ষণ সময়সীমার সঙ্গে মেলে। অপারেটর-চালিত `DELETE /api/v1/batches/delete-completed` রুটকে প্রভাবিত করে না; নকশা অনুযায়ী এটি শর্তহীন (কোনো বয়স ফিল্টার নেই) থাকে। |
| `BATCH_AND_FILE_AUTO_CLEANUP_ENABLED` | `false` | `src/lib/db/cleanup.ts` | `true` হলে স্বয়ংক্রিয় ক্লিনআপ সুইপকে `OMNIROUTE_BATCH_RETENTION_DAYS` অতিক্রম করা চূড়ান্ত Batch API জব (এবং সেগুলোর চেকপয়েন্ট) মুছে ফেলতে এবং নিজস্ব `expires_at` অতিক্রম করা আপলোড করা ফাইলগুলোর BLOB বিষয়বস্তু পরিষ্কার করতে দেয়। ডিফল্টভাবে বন্ধ: কোনো অপারেটর সম্মতি না দেওয়া পর্যন্ত প্রতিটি বিদ্যমান ইনস্টলেশন এই ডেটা ঠিক আগের মতোই রাখে। এটি ড্যাশবোর্ডে সম্পাদনাযোগ্য একটি ফিচার ফ্ল্যাগও—`docs/reference/FEATURE_FLAGS.md` → Runtime দেখুন। |
| `OMNIROUTE_SKIP_DB_HEALTHCHECK` | `0` | `src/lib/db/core.ts`, `src/lib/db/healthCheck.ts` | স্টার্টআপের সময় DB healthcheck সম্পূর্ণভাবে এড়িয়ে যেতে `1` সেট করুন। স্বল্পস্থায়ী task এবং integration test-এর জন্য উপযোগী। |
| `OMNIROUTE_FORCE_DB_HEALTHCHECK` | `0` | `src/lib/db/core.ts` | সাধারণত এড়িয়ে যাওয়া হলেও (যেমন, স্বল্পস্থায়ী task) DB healthcheck loop জোরপূর্বক চালু করতে `1` সেট করুন। |
| `OMNIROUTE_SKIP_POSTINSTALL` | `0` | `scripts/postinstall.mjs` | `npm install` চলাকালে native-runtime warm-up এড়িয়ে যেতে `1` সেট করুন। যেখানে sqlite ইতিমধ্যেই build করা আছে, এমন CI/headless install-এর জন্য উপযোগী। |
| `OMNIROUTE_MIGRATIONS_DIR` | _(স্বয়ংক্রিয়ভাবে শনাক্ত)_ | `src/lib/db/migrationRunner.ts` | migration runner যে directory scan করে, সেটি override করুন। custom build-এ bundled migration সরবরাহের সময় উপযোগী। |
| `OMNIROUTE_EXTRA_MIGRATIONS_DIRS` | _(সেট করা নেই)_ | `src/lib/db/migrationRunner/extraDirs.ts` | platform path delimiter দিয়ে পৃথক করা `namespace=dir` entry হিসেবে অতিরিক্ত migration directory (যেমন `ee=/opt/app/enterprise/db/migrations`)। সেখানে পাওয়া file-গুলো `-` হিসেবে record করা হয়, ফলে নিজস্ব migration সরবরাহকারী কোনো distribution কখনো upstream numeric slot-এর সঙ্গে সংঘর্ষে পড়ে না। কোনো malformed entry, invalid namespace বা অনুপস্থিত directory থাকলে schema নীরবে এড়িয়ে যাওয়ার পরিবর্তে startup-এর সময় error throw হয়। |
| `OMNIROUTE_MAX_PENDING_MIGRATIONS` | `50` | `src/lib/db/migrationRunner.ts` | ব্যাপক সংখ্যক pending migration-এর safety threshold (#3416)। বিদ্যমান DB-তে এর চেয়ে বেশি migration pending থাকলে startup abort হয় (মুছে যাওয়া tracking table থেকে সুরক্ষার জন্য)। পুরোনো backup restore করতে এটি বাড়ান; check নিষ্ক্রিয় করতে `0` সেট করুন। |
| `OMNIROUTE_INSTALL_UPGRADE_WORKDIR` | _(`/.install-upgrade`)_ | `scripts/check/check-install-upgrade.mjs` | `check:install-upgrade` release gate-এর working directory। এর জন্য প্রায় 12 GB প্রয়োজন (দুটি ~3 GB install tree এবং tarball), তাই এটি ছোট tmpfs-এ চালানো যাবে না — self-hosted runner-এ `/tmp` হলো 12 GB RAM-backed tmpfs এবং gate সেটি নিঃশেষ করে package truncate করেছিল। |
| `OMNIROUTE_SPEND_FLUSH_INTERVAL_MS` | _(code-এ default)_ | `src/lib/spend/batchWriter.ts` | batched spend/cost writer-এর flush interval (ms)। কম value write coalescing কমায়; বেশি value DB contention কমায়। |
| `OMNIROUTE_SPEND_MAX_BUFFER_SIZE` | _(code-এ default)_ | `src/lib/spend/batchWriter.ts` | forced flush-এর আগে buffered spend entry-এর সর্বোচ্চ সংখ্যা। high-QPS deployment-এ বাড়ান; bounded memory বেশি গুরুত্বপূর্ণ হলে কমান। |
| `OMNIROUTE_PROXY_FETCH_DEBUG` | _(সেট করা নেই)_ | `open-sse/utils/proxyFetch.ts` | Vercel relay path-এ `[ProxyFetch]` debug log নির্গত করতে `"true"` সেট করুন। routing hint ফাঁস এড়াতে default হিসেবে বন্ধ থাকে। |
| `PROXY_LOG_INCLUDE_IPS` | `false` | `src/lib/proxyLogger.ts` | verbose `[ProxyEgress]` process-log line-এ client/egress IP এবং account prefix অন্তর্ভুক্ত করতে `"true"` বা `"1"` সেট করুন। default হিসেবে এটি বন্ধ রাখা হয়, যাতে process log IP বা account prefix ফাঁস না করে। |
| `OMNIROUTE_DEBUG` | _(সেট করা নেই)_ | `bin/cli/commands/quota.mjs` | CLI quota command থেকে stderr-এ প্রতি request-এর timing diagnostic (`[omniroute] GET completed in Nms`) print করতে `1` সেট করুন। |
| `OMNIROUTE_HEALTHCHECK_PATH` | _(স্বয়ংক্রিয়)_ | `scripts/dev/healthcheck.mjs` | container health check যে নির্দিষ্ট path probe করে। সেট করা না থাকলে probe `OMNIROUTE_BASE_PATH` থেকে path নির্ধারণ করে; এটি সেট করলে আবার deep monitoring endpoint ব্যবহার করা হয়। |
| `OMNIROUTE_DEBUG_COMPLETION` | _(সেট করা নেই)_ | `bin/cli/commands/completion.mjs` | CLI shell-completion cache path (read/refresh/write) থেকে `[omniroute completion]` diagnostic নির্গত করতে যেকোনো non-empty value সেট করুন। default হিসেবে বন্ধ থাকে — ওই cache-গুলো নীরবে fail করে, তাই কোনো cache অনুপস্থিত বা corrupt হলেও tab-completion কখনো নষ্ট হয় না। |
| `BATCH_RETRY_DURATION_MS` | `86400000` (24h) | `open-sse/services/batchProcessor.ts` | পৃথক batch item-এর সর্বোচ্চ retry window (ms)। এই duration অতিক্রম করা item-গুলো failed হিসেবে চিহ্নিত হয়। |
| `BATCH_BACKOFF_BASE_MS` | `5000` | `open-sse/services/batchProcessor.ts` | ব্যাচ আইটেম পুনঃচেষ্টায় এক্সপোনেনশিয়াল ব্যাকঅফের প্রাথমিক বিলম্ব (ms)। |
| `BATCH_BACKOFF_MAX_MS` | `3600000` (1h) | `open-sse/services/batchProcessor.ts` | ব্যাচ আইটেম পুনঃচেষ্টার মধ্যবর্তী এক্সপোনেনশিয়াল ব্যাকঅফের সর্বোচ্চ সীমা (ms)। |
| `BATCH_MAX_CONCURRENT` | `1` | `open-sse/services/batchProcessor.ts` | একই সময়ে প্রক্রিয়াকৃত ব্যাচের সর্বোচ্চ সংখ্যা। থ্রুপুট বাড়াতে এটি বৃদ্ধি করুন; রেট-লিমিটের আকস্মিক চাপ এড়াতে কম রাখুন। |
> [!IMPORTANT]
> বিদ্যমান কোনো স্থায়ী ডেটাবেস পরিবর্তনের আগে, মাইগ্রেশন রানার `DATA_DIR/db_backups/`-এর অধীনে একটি সম্পূর্ণ,
> কনটেন্ট-অ্যাড্রেসড স্ন্যাপশট প্রকাশ করে। প্রকাশের জন্য এমন একটি ফাইলসিস্টেম প্রয়োজন, যা একই ফাইলসিস্টেমের মধ্যে
> ওভাররাইট-বিহীন হার্ড লিংক এবং টেকসই ফাইল সিঙ্ক সমর্থন করে। POSIX হোস্টে ডিরেক্টরি সিঙ্কও
> প্রয়োজন; Windows-এ Node ডিরেক্টরি হ্যান্ডেল প্রত্যাখ্যান করতে পারে, তাই OmniRoute প্রকাশিত
> ফাইলটি ফ্লাশ করে এবং ডিরেক্টরি-এন্ট্রি সিঙ্ককে সর্বোত্তম প্রচেষ্টা হিসেবে বিবেচনা করে।
> মাউন্ট করা `DATA_DIR` যদি এসব নিশ্চয়তা দিতে না পারে, তাহলে কোনো মাইগ্রেশন প্রয়োগের আগেই
> স্টার্টআপ নিরাপদভাবে ব্যর্থ হয়। `DATA_DIR`-কে এসব প্রিমিটিভ-সমর্থিত কোনো ভলিউমে স্থানান্তর করুন;
> মাইগ্রেশন নিরাপত্তা এড়িয়ে যেতে `DISABLE_SQLITE_AUTO_BACKUP` ব্যবহার করবেন না।
### পরিস্থিতি
| পরিস্থিতি | কনফিগারেশন |
| --------------------------------- | ---------------------------------------------------------------------------------- |
| **লোকাল ডেভেলপমেন্ট** | সব ডিফল্ট অপরিবর্তিত রাখুন। DB `~/.omniroute/omniroute.db`-এ থাকে। |
| **Docker** | `DATA_DIR=/data` + `/data`-এ একটি ভলিউম মাউন্ট করুন। |
| **সংরক্ষিত অবস্থায় এনক্রিপ্টেড** | `STORAGE_ENCRYPTION_KEY` সেট করুন + কীটির ব্যাকআপ রাখুন! এটি হারানো = ডেটা হারানো। |
| **CI/টেস্টিং** | `DATA_DIR=/tmp/omniroute-test` — ক্ষণস্থায়ী, এনক্রিপশনের প্রয়োজন নেই। |
---
## 3. নেটওয়ার্ক ও পোর্টসমূহ
| ভেরিয়েবল | ডিফল্ট | সোর্স ফাইল | বিবরণ |
| ------------------------------------------- | -------------------------------------------- | ------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `PORT` | `20128` | `src/lib/runtime/ports.ts` | Dashboard UI এবং API এন্ডপয়েন্ট—উভয়ের জন্য প্রধান পোর্ট (একক-পোর্ট মোড)। |
| `OMNIROUTE_BASE_PATH` | _(খালি = রুট)_ | `next.config.mjs`, `scripts/docker/ensure-docker-base-path.mjs` | রিভার্স প্রক্সির পেছনে OmniRoute পরিবেশনের জন্য URL সাবপাথ (Next.js-এর `basePath` সেট করে; auth রিডাইরেক্টগুলো basePath-সচেতন)। যেমন `/omniroute`। Docker-এ মানটি `docker build`-এর সময় অন্তর্ভুক্ত করা হয় (`ARG OMNIROUTE_BASE_PATH`); আগে থেকে তৈরি রুট ইমেজগুলো Next.js চালু হওয়ার আগে কনটেইনার শুরুর সময় একবার ভিন্ন রানটাইম মান প্রয়োগ করতে পারে। একই সাবপাথসহ পাবলিক origin-এ `NEXT_PUBLIC_BASE_URL` সেট করুন। |
| `NEXT_PUBLIC_OMNIROUTE_BASE_PATH` | _(খালি = রুট)_ | `src/shared/hooks/useDisplayBaseUrl.ts` | `OMNIROUTE_BASE_PATH`-এর ব্রাউজারে দৃশ্যমান প্রতিরূপ, যা বিল্ডের সময় ইনলাইন করা হয়, যাতে ড্যাশবোর্ডের এন্ডপয়েন্ট প্রদর্শনে `https://host/v1`-এর পরিবর্তে `https://host/omniroute/v1` দেখা যায়। সেট না থাকলে `OMNIROUTE_BASE_PATH` ব্যবহার করে। পরিবর্তনের পর পুনরায় বিল্ড করুন (Next-এর `basePath` বিল্ড-টাইমে নির্ধারিত)। |
| `DASHBOARD_ALLOW_EMBED` | _(সেট না করা = কখনোই ফ্রেমে দেখানো যাবে না)_ | `next.config.mjs`, `scripts/build/dashboardEmbed.mjs` | HTML পেজগুলো iframe-এ এম্বেড করার জন্য অপ্ট-ইন। সেট না থাকলে প্রতিটি রুট `frame-ancestors 'none'` + `X-Frame-Options: DENY` সহ পরিবেশিত হয়। `vscode` সেট করলে পেজগুলো (ড্যাশবোর্ড, লগইন, ডকস, ল্যান্ডিং) `frame-ancestors 'self' vscode-webview:` সহ এবং `X-Frame-Options` ছাড়াই পরিবেশিত হয়, ফলে VS Code Simple Browser সেগুলো রেন্ডার করতে পারে (OmniCopilot-এর `dashboardOpen: "editor"` মোড)। API সারফেস (`/api`, `/v1`, `/v1beta`, `/a2a`, `/healthz`, রুট-স্তরের alias) উভয় ক্ষেত্রেই কঠোর হেডার বজায় রাখে। শুধু `vscode` স্বীকৃত—`1`/`true` এটি সক্রিয় করে না। বিল্ড-টাইম: পরিবর্তনের পর পুনরায় বিল্ড করুন (ইমেজের জন্য `docker build --build-arg DASHBOARD_ALLOW_EMBED=vscode`; আগে থেকে তৈরি ইনস্টলে এটি সেট করলে কোনো প্রভাব পড়ে না)। |
| `API_PORT` | _(সেট না করা)_ | `src/lib/runtime/ports.ts` | সেট করা হলে এই পৃথক পোর্টে `/v1/*` প্রক্সি API পরিবেশন করে। |
| `API_HOST` | `0.0.0.0` | `src/lib/runtime/ports.ts` | API পোর্টের bind address। |
| `DASHBOARD_PORT` | _(সেট না করা)_ | `src/lib/runtime/ports.ts` | সেট করা হলে এই পৃথক পোর্টে Dashboard UI পরিবেশন করে। |
| `OMNI_MAX_CONCURRENT_CONNECTIONS` | `0` _(নিষ্ক্রিয়)_ | `src/sse/utils/backpressure.ts` | একই সময়ে চলমান in-flight chat সংযোগের সর্বোচ্চ সীমা নির্ধারণ করে; সীমার অতিরিক্ত অনুরোধ `Retry-After` সহ `503` পায়। ধনাত্মক পূর্ণসংখ্যা গার্ডটি সক্রিয় করে; সেট না থাকলে/`0` হলে এটি নিষ্ক্রিয় থাকে। |
| `OMNIROUTE_INSTANCE_ID` | _(সেট না করা)_ | `src/shared/resilience/peerRouting.ts` | OmniRoute instance চেইন করার সময় এই gateway-এর স্থিতিশীল, অনন্য ID। আগত peer-loop যাচাই সক্রিয় করে। অনুমোদিত অক্ষর: বর্ণ, সংখ্যা, `.`, `_`, `:`, এবং `-`; সর্বোচ্চ 64টি অক্ষর। |
| `OMNIROUTE_PEER_URLS` | _(সেট না করা)_ | `src/shared/resilience/peerRouting.ts`, `open-sse/executors/base.ts` | কমা দিয়ে পৃথক করা OmniRoute base URL, যেগুলো `X-OmniRoute-Peer-Trace` পেতে পারে। শুধু স্পষ্টভাবে allowlist-এ থাকা upstream URL-গুলো peer metadata পায়; অন্য সব provider অপরিবর্তিত থাকে। |
| `OMNIROUTE_PEER_MAX_HOPS` | `4` | `src/shared/resilience/peerRouting.ts` | চেইন করা অনুরোধে আগে পরিদর্শিত OmniRoute instance-এর সর্বাধিক গ্রহণযোগ্য সংখ্যা (`1`-`32`)। পুনরাবৃত্ত instance বা বাজেট শেষ হয়ে গেলে HTTP `508 Loop Detected` ফেরত আসে। |
| `PROD_DASHBOARD_PORT` | `20130` | `docker-compose.prod.yml` | Docker production মোডে Dashboard-এর জন্য host-side প্রকাশিত পোর্ট। |
| `PROD_API_PORT` | `20131` | `docker-compose.prod.yml` | Docker production মোডে API-এর জন্য host-side প্রকাশিত পোর্ট। |
| `OMNIROUTE_PORT` | _(সেট না করা)_ | `src/lib/runtime/ports.ts` | Electron বা অন্য wrapper-এর ভেতরে চালানোর সময় `PORT`-এর চেয়ে অগ্রাধিকার পায়। |
| `LIVE_WS_PORT` | `20129` | `src/server/ws/liveServer.ts` | রিয়েল-টাইম WebSocket live monitoring server-এর পোর্ট। |
| `LIVE_WS_HOST` | `127.0.0.1` | `src/server/ws/liveServer.ts` | live WebSocket server-এর bind address। LAN-এ প্রকাশ করতে `0.0.0.0` সেট করুন (`LIVE_WS_ALLOWED_ORIGINS`-ও কনফিগার করুন)। |
| `LIVE_WS_ALLOWED_ORIGINS` | _(সেট না করা)_ | `src/server/ws/liveServer.ts` | live WebSocket খোলার অনুমতিপ্রাপ্ত অতিরিক্ত origin-এর কমা দিয়ে পৃথক করা তালিকা। Loopback dashboard origin-গুলো ডিফল্টভাবেই অনুমোদিত। |
| `LIVE_WS_ALLOWED_HOSTS` | _(সেট না করা)_ | `src/server/ws/liveServerAllowList.ts` | live WebSocket origin-এর জন্য অনুমোদিত অতিরিক্ত hostname-এর কমা দিয়ে পৃথক করা তালিকা। `LIVE_WS_ALLOWED_ORIGINS` (সম্পূর্ণ origin URL)-এর বিপরীতে, এটি শুধু host অংশের সঙ্গে মেলে—LAN/Tailscale সেটআপের জন্য উপযোগী। |
| `NEXT_PUBLIC_LIVE_WS_PUBLIC_URL` | _(সেট না করা)_ | `src/hooks/useLiveDashboard.ts` | live dashboard WebSocket-এর পাবলিক URL (ব্রাউজার-সাইড)। WS server-এর সামনে reverse proxy বা Cloudflare Tunnel থাকলে সেট করুন (যেমন `wss://ws.my-ai.com/live-ws`); ব্রাউজার তখন `ws://hostname:20132`-এর বদলে সেখানে সংযুক্ত হয়। pathname অংশটি WebSocket upgrade path হিসেবেও ব্যবহৃত হয় (ডিফল্ট: `/live-ws`)। |
| `OMNIROUTE_ENABLE_LIVE_WS` | `true` | `src/server/ws/liveServer.ts` এবং `scripts/start-ws-server.mjs` | রিয়েল-টাইম WebSocket server নিষ্ক্রিয় করতে `0` বা `false` সেট করুন (ডিফল্টভাবে সক্রিয়, loopback-এ bound)। এটি একটি CI/harness toggle, যা স্বতন্ত্র live WebSocket helper script নিষ্ক্রিয় করে। |
| `RELAY_IP_PER_MINUTE` | `30` | `src/app/api/v1/relay/chat/completions/route.ts` | প্রতি-(token, IP) relay rate limit, অনুরোধ/মিনিট। In-memory, প্রতি instance-এ। `0` বা ঋণাত্মক মান IP-dimension gate নিষ্ক্রিয় করে (প্রতি-token DB সীমা তবুও প্রযোজ্য থাকে)। |
| `NODE_ENV` | `production` | Next.js core | logging verbosity, caching, error detail exposure এবং Next.js optimization নিয়ন্ত্রণ করে। |
| `OMNIROUTE_USE_TURBOPACK` | `1` (Turbopack — কোডের ডিফল্ট) | `package.json` / Next.js 16 | `npm run dev` এবং `npm run build`-এর ডিফল্ট bundler হলো Turbopack (benchmark অনুযায়ী build 2-3× দ্রুত)। Windows-এ native binding / bundler-compat অসামঞ্জস্য দেখা দিলে webpack-এ ফিরে যেতে `0` সেট করুন, **অথবা RAM-সীমিত মেশিনে**—এই Next.js version line-এ (16.2.x) Turbopack production build বড় module graph-এ webpack-এর তুলনায় অনেক বেশি memory peak করে বলে upstream-এ জানা আছে (Next 16.3-এর Turbopack memory-eviction fix এখনও stable নয়); webpack fallback-এর peak অনেক কম। #6409 দেখুন। |
| `OMNIROUTE_SKIP_DB_HEALTHCHECK` | _(সেট না করা)_ | `src/lib/db/core.ts` / `src/lib/db/healthCheck.ts` | startup-এর সময় SQLite integrity health check এড়িয়ে যেতে `1` সেট করুন। বড় database-এ দ্রুত boot-এর জন্য উপযোগী। |
| `NOTIFY_SOCKET` | _(সেট না করা)_ | systemd (sd_notify protocol) | process যখন sd_notify integration-সহ কোনো service unit-এর অধীনে চলে, তখন systemd এটি সেট করে; READY/WATCHDOG notification পাঠাতে OmniRoute এটি পড়ে (`OMNIROUTE_DISABLE_SD_NOTIFY` দেখুন)। ব্যবহারকারী কখনো এটি সেট করবেন না। |
| `OMNIROUTE_DISABLE_SD_NOTIFY` | _(সেট না করা)_ | `scripts/dev/systemd-notify.mjs` | systemd unit-এর অধীনে চললেও systemd sd_notify (Type=notify / WatchdogSec=) নিষ্ক্রিয় করতে `1` সেট করুন। systemd-এর বাইরে notifier যেকোনো অবস্থাতেই no-op। |
| `CREDENTIAL_HEALTH_CHECK_INTERVAL` | `300000` | `open-sse/config/constants.ts` / `src/lib/credentialHealth/scheduler.ts` | background credential health check scheduler-এর interval (ms)। সর্বনিম্ন: 10000 (10s)। |
| `CREDENTIAL_HEALTH_CACHE_TTL` | `300000` | `open-sse/config/constants.ts` / `src/lib/credentialHealth/cache.ts` | cached credential health status-এর TTL (ms)। |
| `OMNIROUTE_DISABLE_CREDENTIAL_HEALTH_CHECK` | `false` | `src/lib/credentialHealth/scheduler.ts` | provider connection-এর background periodic testing নিষ্ক্রিয় করতে `1` বা `true` সেট করুন। Search provider-গুলো (`src/lib/providers/validation/searchProviders.ts`-এর SEARCH_VALIDATOR_CONFIGS, যেমন `tavily-search`) sweep থেকে সবসময় বাদ থাকে—তাদের "validation" একটি বাস্তব billable upstream query, তাই timer অনুযায়ী কখনোই তাদের health-check করা হয় না (#9970)। |
| `HOST` | `0.0.0.0` | `scripts/dev/run-next.mjs` | Next.js dev/start server-এর bind address। সেট করা হলে ডিফল্ট `0.0.0.0` override করে। |
| `HOSTNAME` | `127.0.0.1` | `scripts/dev/run-next-playwright.mjs` | Next.js চালু করার সময় Playwright runner-এর ব্যবহৃত bind address। hermetic test-এর জন্য ডিফল্ট `127.0.0.1`। **`omniroute serve`-এর জন্য ব্যবহার করবেন না**—এর বদলে `OMNIROUTE_SERVER_HOST` ব্যবহার করুন (POSIX shell স্বয়ংক্রিয়ভাবে `HOSTNAME`-কে machine name-এ সেট করে; `.env` এটি override করতে পারে না)। |
| `OMNIROUTE_SERVER_HOST` | `0.0.0.0` | `bin/cli/commands/serve.mjs` | `omniroute serve`-এর bind address। POSIX shell-এর `HOSTNAME` variable-এর সঙ্গে সংঘর্ষ এড়ায় (bash/zsh সর্বদা এটিকে machine name-এ সেট করে)। সেট না থাকলে `0.0.0.0` ব্যবহার করে। (#6194) |
### পোর্ট মোডসমূহ
```
┌─────────────────────────── একক পোর্ট (ডিফল্ট) ─────────────────────────────┐
│ PORT=20128 │
│ → ড্যাশবোর্ড: http://localhost:20128 │
│ → API: http://localhost:20128/v1/chat/completions │
└─────────────────────────────────────────────────────────────────────────────┘
┌─────────────────────────── পৃথক পোর্টসমূহ ─────────────────────────────────┐
│ DASHBOARD_PORT=20128 │
│ API_PORT=20129 │
│ API_HOST=0.0.0.0 │
│ → ড্যাশবোর্ড: http://localhost:20128 │
│ → API: http://0.0.0.0:20129/v1/chat/completions │
│ ব্যবহারের ক্ষেত্র: ড্যাশবোর্ড localhost-এ সীমাবদ্ধ রেখে API-কে LAN-এ উন্মুক্ত করুন। │
└─────────────────────────────────────────────────────────────────────────────┘
┌─────────────────────────── Docker প্রোডাকশন ───────────────────────────────┐
│ PROD_DASHBOARD_PORT=443 PROD_API_PORT=8443 │
│ → docker-compose.prod.yml-এ কনটেইনার পোর্টগুলোকে হোস্ট পোর্টে ম্যাপ করে। │
└─────────────────────────────────────────────────────────────────────────────┘
```
---
## 4. নিরাপত্তা ও প্রমাণীকরণ
| ভেরিয়েবল | ডিফল্ট | সোর্স ফাইল | বিবরণ |
| ------------------------------------------- | --------------------------------------------------------------------------------------------------- | -------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| `MACHINE_ID_SALT` | `endpoint-proxy-salt` | `src/lib/auth` | মেশিন ফিঙ্গারপ্রিন্টিংয়ের জন্য হার্ডওয়্যার শনাক্তকারীর সঙ্গে সমন্বিত সল্ট। বিচ্ছিন্নতা নিশ্চিত করতে প্রতিটি ডিপ্লয়মেন্টে এটি পরিবর্তন করুন। |
| `OMNIROUTE_CLI_SALT` | _(সেট করা নেই = প্রতিটি ইনস্টলে এলোমেলো সল্ট, যা `/cli-token-salt.json`-এ সংরক্ষিত থাকে)_ | `src/lib/machineToken.ts` | স্থানীয় CLI প্রমাণীকরণ টোকেন নির্ণয়ের জন্য HMAC সল্ট। এই মান সেট করলে মেশিনের সব CLI টোকেন রোটেট হয় এবং এটি সবসময় সংরক্ষিত সল্টের চেয়ে অগ্রাধিকার পায়। `docs/security/CLI_TOKEN.md` দেখুন। |
| `AUTH_COOKIE_SECURE` | `false` | `src/lib/auth` | সেশন কুকিতে `Secure` ফ্ল্যাগ সেট করে। HTTPS-এর পেছনে চালানোর সময় এটি **অবশ্যই `true` হতে হবে**। |
| `REQUIRE_API_KEY` | `false` | API মিডলওয়্যার | `true` হলে, সব `/v1/*` প্রক্সি অনুরোধে একটি বৈধ API কী অন্তর্ভুক্ত থাকতে হবে। **এই ফ্ল্যাগটি `GET /v1/models`-এর প্রবেশাধিকার নিয়ন্ত্রণ করে না**; বরং এটি ড্যাশবোর্ড লগইন নীতি (`requireAuthForModels`) অনুসরণ করে—তাই `/v1/models` থেকে একটি `401` পাওয়ার অর্থ এই নয় যে ইনফারেন্স সুরক্ষিত। `docs/security/INFERENCE_AUTH_POSTURE.md` (#13695) দেখুন। |
| `ALLOW_API_KEY_REVEAL` | `false` | `src/shared/constants/featureFlagDefinitions.ts` | ড্যাশবোর্ড UI-তে সম্পূর্ণ API কী-এর মান প্রকাশের অনুমতি দেয়। ড্যাশবোর্ডের ফিচার ফ্ল্যাগ থেকে কনফিগার করা যায়; শেয়ার্ড ইনস্ট্যান্সে এটি একটি নিরাপত্তা ঝুঁকি। |
| `NO_LOG_API_KEY_IDS` | _(খালি)_ | `src/lib/compliance/index.ts` | কমা দিয়ে পৃথক করা API কী ID, যেগুলোর অনুরোধ লগ করা হয় না (GDPR সম্মতি)। |
| `DEFAULT_RATE_LIMIT_PER_DAY` | _(সেট করা নেই = সীমাহীন)_ | `src/shared/utils/apiKeyPolicy.ts` | যেসব API কী-এর `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` | অনুরোধের বডির সর্বাধিক অনুমোদিত আকার। এই সীমা অতিক্রমকারী পেলোড প্রত্যাখ্যান করে। |
| `OMNIROUTE_CHAT_LARGE_BODY_BYTES` | `262144` (256 KB) | `src/shared/middleware/chatBodyAdmission.ts` | এই থ্রেশহোল্ডের সমান বা বেশি আকারের প্রকৃত অনুরোধ বডি JSON পার্সিংয়ের আগে অ্যাটমিক, প্রসেস-লোকাল হেভিওয়েট অ্যাডমিশন লিজ গ্রহণ করে (BYTE পাথ, `POST /v1/responses`-সহ)। স্ট্রাকচার-হেভি পাথের মতো একই [#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` | সীমাবদ্ধ ইনজেশনের সময় পড়া বাইটের ওপর প্রয়োগ করা চ্যাট-রুটের হার্ড সীমা; এর মধ্যে অনুপস্থিত, অবৈধ বা অসত্য `Content-Length`-সহ অনুরোধও অন্তর্ভুক্ত; সীমা অতিক্রম করলে `413` পাওয়া যায়। |
| `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT` | _(সেট করা নেই — অনুরোধ-সংখ্যার কোনো সীমা নেই)_ | `src/shared/middleware/chatBodyAdmission.ts` | **#503-fanout:** এই লিগ্যাসি অনুরোধ-সংখ্যা সীমা এখন কেবল স্পষ্টভাবে সেট করা হলেই কার্যকর হয়। এটি সেট না থাকলে (ডিফল্ট), হেভিওয়েট চ্যাট অ্যাডমিশন পরিবর্তে `OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES` দ্বারা নিয়ন্ত্রিত হয় — **একটি প্রসেসে** (একটি V8 হিপ) প্রসেসের প্রকৃত মেমরি সীমা থেকে স্বয়ংক্রিয়ভাবে নির্ধারিত একটি বাইট বাজেট। পরস্পর ওভারল্যাপ করা প্রায় 750k-টোকেনের দুটি `/v1/responses` প্রায় 12 GiB হিপকে অ্যাবোর্ট করায় (#7849) — এটি একটি **মেমরি-বাজেট** সতর্কতা, 2-এর কোনো কঠোর পণ্যসীমা নয়। একটি সুস্থ প্রসেস (শেড অনুপাতের নিচে হিপ) `OMNIROUTE_CHAT_ADMISSION_HEALTHY_HEADROOM`-এর মাধ্যমে আরও বেশি সমবর্তী দীর্ঘ `/v1/responses` গ্রহণ করতে পারে। দশের ঘরে দীর্ঘ SSE ক্লায়েন্ট (40–50) হিপ + `OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES` / #10110-এর বিষয়, “সর্বোচ্চ 2” নয়। “হোস্ট ব্যবহার করার” জন্য না বুঝে এটি বাড়ালে #7849 আবার দেখা দেবে। **Nটি স্বাধীন `DATA_DIR`** দিয়ে **হিপের** সংখ্যা বাড়ান (#11024); একটি SQLite ফাইলে কখনোই `replicas>1` ব্যবহার করবেন না। |
| `OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES` | _(স্বয়ংক্রিয়ভাবে নির্ধারিত)_ | `src/shared/middleware/admissionBudget.ts` | **#503-fanout:** স্বয়ংক্রিয়ভাবে নির্ধারিত ইনজেস্ট বাইট বাজেটের ওভাররাইড (আরও সীমিত V8/cgroup মেমরি সীমার 25%, 8x ক্ষণস্থায়ী অ্যামপ্লিফিকেশন দিয়ে ভাগ করা)। নির্ধারিত এবং স্পষ্ট উভয় মানই 8 MiB–2 GiB-এর মধ্যে সীমাবদ্ধ থাকে। কার্যকর বাজেটের চেয়ে বড় বডি অবিলম্বে `413 body_exceeds_budget` দিয়ে ব্যর্থ হয়; পৃথকভাবে পরিবেশনযোগ্য বডিগুলোর মধ্যকার কনটেনশনে পুনরায় চেষ্টা-যোগ্য `503` পাওয়া যায়। 40–50টি সমবর্তী দীর্ঘ SSE ক্লায়েন্ট এই বাজেট + হিপের বিষয়, কোনো কঠোর “সর্বোচ্চ 2” নয়। টিউন করার আগে `/api/monitoring/health`-এ `chatAdmission.maxInflightBytes` / `budgetSource` / `pressureSeverity` দেখুন। |
| `OMNIROUTE_CHAT_ADMISSION_HEAP_SHED_RATIO` | `0.75` | `src/shared/middleware/chatBodyAdmission.ts` | বাইট ও স্ট্রাকচার হেভিওয়েট অ্যাডমিশনের জন্য হিপ-প্রেশার শেড অনুপাত (`heapUsed / heap_size_limit`) (#10183, #10268, #10437)। `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT` অতিক্রম করা কোনো সমবর্তী হেভিওয়েট অনুরোধকে কেবল তখনই পুনরায় চেষ্টা-যোগ্য `503` দিয়ে শেড করা হয়, যখন হিপও এই অনুপাতের সমান বা বেশি থাকে; সুস্থ হিপে এটি পরিবর্তে হেলদি-হেডরুমের মাধ্যমে গ্রহণ করা হয়। |
| `OMNIROUTE_CHAT_ADMISSION_HEALTHY_HEADROOM` | `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT` (ডিফল্ট `1`) | `src/shared/middleware/chatBodyAdmission.ts` | **STRUCTURE** এবং **BYTE** উভয়ের (`admitChatRequest`, `OMNIROUTE_CHAT_LARGE_BODY_BYTES`-এর সমান বা বড় বডিসহ) সুস্থ-হিপ ফাস্ট পাথের জন্য সীমাবদ্ধ অতিরিক্ত সক্ষমতা (#10437)। এই সীমা ছাড়া, প্রতিটি ব্যস্ত-কিন্তু-সুস্থ-হিপ অনুরোধ কোনো ঊর্ধ্বসীমা ছাড়াই অ্যাডমিশন বাইপাস করত। সুস্থ-হিপ পাথ দিয়ে এতগুলো সমবর্তী লিজ সক্রিয় হয়ে গেলে, পরবর্তী ব্যস্ত অনুরোধগুলো প্রকৃত হিপ চাপের সময় ব্যবহৃত একই সীমাবদ্ধ-অপেক্ষা/শেড পাথে চলে যায়। `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` (নিষ্ক্রিয়) | `src/shared/middleware/chatBodyAdmission.ts` | ঐচ্ছিক অপ্ট-ইন চ্যাট ইতিহাস সীমা। ডিফল্টভাবে নিষ্ক্রিয়: বার্তার সংখ্যা একটি ডিপ্লয়মেন্ট নীতি, কোনো অনুরোধের সার্বজনীন বৈশিষ্ট্য নয়; এখানে সীমা আরোপ করলে কম্প্রেশন পাইপলাইন কথোপকথনগুলোকে পরিবেশনযোগ্য করে তোলার আগেই টার্মিনাল `413` দিয়ে সেগুলো প্রত্যাখ্যান করা হয়। হিপের বৃদ্ধি `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT` এবং হিপ-প্রেশার শেড দ্বারা সীমাবদ্ধ থাকে। যেসব মেমরি-সীমাবদ্ধ ডিপ্লয়মেন্টে কঠোর ঊর্ধ্বসীমা দরকার, সেখানে একটি ধনাত্মক মান সেট করুন; সীমা অতিক্রম করলে তখন কাঠামোবদ্ধ কম্প্যাক্ট-প্রয়োজনীয় `413` পাওয়া যায়। |
| `OMNIROUTE_MAX_NONSTREAMING_RESPONSE_BYTES` | `67108864` (64 MB) | `open-sse/handlers/chatCore/nonStreamingResponseBody.ts` | সম্পূর্ণভাবে মেমরিতে বাফার করা একটি নন-স্ট্রিমিং আপস্ট্রিম রেসপন্সের হার্ড সীমা। এটি অতিক্রম করলে আপস্ট্রিম রিডার বাতিল করা হয় এবং হিপ নিঃশেষ না হওয়া পর্যন্ত সীমাহীন স্ট্রিং বাড়তে দেওয়ার পরিবর্তে অনুরোধটি দ্রুত ব্যর্থ হয়। |
| `OMNIROUTE_FORWARDING_HEADER_BUDGET_BYTES` | `768` | `open-sse/handlers/chatCore/responseHeaders.ts` | আপস্ট্রিম রেসপন্স হেডার থেকে ফরওয়ার্ড করা সর্বোচ্চ ওয়্যার বাইট। বাজেট অতিক্রম করলে, সাধারণ রিভার্স-প্রক্সি হেডার সীমার মধ্যে থাকতে নিম্ন-অগ্রাধিকারের হেডারগুলো (যেমন, কাস্টম `x-codex-*`, `x-oai-request-id`) বাদ দেওয়া হয়। রেসপন্স হেডারের আকার বৃদ্ধির বিনিময়ে আরও বেশি আপস্ট্রিম মেটাডেটা ফরওয়ার্ড করতে এটিকে উচ্চতর মানে সেট করুন। |
| `CORS_ORIGIN` | _(সেট করা নেই)_ | `src/server/cors/origins.ts` | পুরোনো একক-অরিজিন CORS অনুমোদন-তালিকা। নতুন ডিপ্লয়মেন্টের জন্য `CORS_ALLOWED_ORIGINS` ব্যবহার করুন। CORS কেবল ক্রস-অরিজিন ব্রাউজার API ক্লায়েন্টের জন্য; এর পরিবর্তে প্রমাণীকৃত ড্যাশবোর্ড রাইট অপারেশনগুলো একই-অরিজিন রিকোয়েস্ট এবং সেশন-সংযুক্ত CSRF সুরক্ষা ব্যবহার করে। |
| `CORS_ALLOWED_ORIGINS` | _(সেট করা নেই)_ | `src/server/cors/origins.ts` | কমা দিয়ে পৃথক করা CORS অনুমোদন-তালিকা। `CORS_ALLOW_ALL=true` স্পষ্টভাবে কনফিগার করা না হলে কোনো ওয়াইল্ডকার্ড পাঠানো হয় না। |
| `CORS_ALLOW_ALL` | `false` | `src/server/cors/origins.ts` | যেকোনো ব্রাউজার `Origin` প্রতিধ্বনিত করার জন্য কেবল ডেভেলপমেন্টে ব্যবহারের জরুরি বিকল্প। শেয়ার্ড বা প্রোডাকশন ডিপ্লয়মেন্টে এটি সক্রিয় করবেন না। |
| `OUTBOUND_SSRF_GUARD_ENABLED` | `true` | `src/shared/network/outboundUrlGuard.ts` | প্রাইভেট/লুপব্যাক/লিংক-লোকাল IP রেঞ্জ লক্ষ্য করে করা প্রোভাইডার কল ব্লক করুন। কেবল বিচ্ছিন্ন টেস্ট এনভায়রনমেন্টে এটি নিষ্ক্রিয় করুন। |
| `OMNIROUTE_ALLOW_PRIVATE_PROVIDER_URLS` | `false` | `src/shared/network/outboundUrlGuard.ts` | প্রাইভেট/লোকাল নেটওয়ার্কের দিকে নির্দেশ করা প্রোভাইডার URL অনুমোদন করুন (localhost, 192.168.x.x, 10.x.x.x, ইত্যাদি)। **স্ব-হোস্টেড প্রোভাইডারের জন্য আবশ্যক** (LM Studio, Ollama, vLLM, Llamafile, Triton, SearXNG)। `false` হলে, ড্যাশবোর্ড লোকাল URL-এর ভ্যালিডেশন প্রত্যাখ্যান করে। |
| `OMNIROUTE_ALLOW_LOCAL_PROVIDER_URLS` | `true` | `src/shared/network/outboundUrlGuard.ts` | লোকাল/প্রাইভেট ঠিকানায় (127.0.0.1, localhost, LAN, প্রাইভেট রেঞ্জ) প্রোভাইডার যোগ/ভ্যালিডেট করার অনুমতি দিন — এটি প্রোভাইডার ভ্যালিডেশন পাথের মধ্যে সীমাবদ্ধ। **ডিফল্ট `true`** (লোকাল-ফার্স্ট); কঠোরভাবে শুধু পাবলিক ঠিকানা অনুমোদন করতে `false` সেট করুন। ক্লাউড-মেটাডেটা এন্ডপয়েন্টগুলো (169.254.169.254, metadata.google.internal) যেকোনো অবস্থায় ব্লকই থাকে। (#5066) |
| `AUDIO_REMOTE_PROVIDER_NODES` | `false` | `src/app/api/v1/_shared/audioProviderNodes.ts` | `/v1/audio/*` রুটগুলোকে (ট্রান্সক্রিপশন, স্পিচ, অনুবাদ) localhost-এর বাইরে হোস্ট করা OpenAI-সামঞ্জস্যপূর্ণ প্রোভাইডার নোড ব্যবহার করতে দিন। ডিফল্টভাবে বন্ধ — অডিওকে রিমোট হোস্টে রাউট করলে ইগ্রেস পরিচয় বদলে যায় এবং এটি অপারেটরের স্পষ্ট সিদ্ধান্ত হতে হবে। লুপব্যাক/প্রাইভেট নোডগুলো (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`-কে (এবং মেমরি ইঞ্জিনের লুপব্যাক রির্যাঙ্ক ধাপকে) localhost-এর বাইরে হোস্ট করা OpenAI-সামঞ্জস্যপূর্ণ প্রোভাইডার নোড ব্যবহার করতে দিন — যেমন TEI, Infinity, vLLM ইত্যাদি চালানো কোনো LAN বক্স বা Tailscale পিয়ার। ডিফল্টভাবে বন্ধ — রিমোট হোস্টে রাউট করলে ইগ্রেস পরিচয় বদলে যায় এবং এটি অপারেটরের স্পষ্ট সিদ্ধান্ত হতে হবে। লুপব্যাক নোডগুলো (localhost, 127.0.0.1, 172.16-31.x) সর্বদা অনুমোদিত এবং প্রভাবিত হয় না। রিমোট নোডগুলোকে প্রোভাইডারের আউটবাউন্ড URL নীতিও (`OMNIROUTE_ALLOW_LOCAL_PROVIDER_URLS` / `OMNIROUTE_ALLOW_PRIVATE_PROVIDER_URLS`) পাস করতে হবে; ক্লাউড-মেটাডেটা হোস্টে কখনোই রাউট করা হয় না। |
| `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 অগ্রাধিকার পায়। (#10889) |
| `OIDC_DISABLE_PASSWORD_LOGIN` | `false` | `src/app/api/auth/login/route.ts` | `OMNIROUTE_OIDC_DISABLE_PASSWORD_LOGIN`-এর সংক্ষিপ্ত অ্যালিয়াস (#10889)। |
### নিরাপত্তা জোরদারকরণ চেকলিস্ট
```bash
# প্রোডাকশন নিরাপত্তার ন্যূনতম শর্ত:
AUTH_COOKIE_SECURE=true # HTTPS আবশ্যক
REQUIRE_API_KEY=true # সব প্রক্সি কল প্রমাণীকরণ করুন
ALLOW_API_KEY_REVEAL=false # UI-তে কখনোই কী প্রকাশ করবেন না
CORS_ALLOWED_ORIGINS=https://your.domain.com
MAX_BODY_SIZE_BYTES=5242880 # 5 MB সীমা
```
---
## 5. ইনপুট স্যানিটাইজেশন ও PII সুরক্ষা
OmniRoute দুই-স্তরবিশিষ্ট প্রতিরক্ষা প্রদান করে: রিকোয়েস্ট-পার্শ্বের ইনজেকশন স্ক্যানিং এবং রেসপন্স-পার্শ্বের PII অপসারণ।
> **⚠️ সীমাবদ্ধতা:** এই গার্ডরেলগুলো _সর্বোচ্চ-প্রচেষ্টাভিত্তিক হিউরিস্টিক_ শনাক্তকরণ, সম্পূর্ণ প্রম্পট-ইনজেকশন ফায়ারওয়াল বা PII DLP সিস্টেম নয়। এগুলো ফলস পজিটিভ (ক্ষতিকর নয় এমন পারসোনা/RPG প্রম্পট ফ্ল্যাগ হওয়া) এবং ফলস নেগেটিভ (লিটস্পিক, স্পেসিং, অ-ইংরেজি প্যাটার্ন) তৈরি করতে পারে। কমপ্লায়েন্সের জন্য এগুলো একা যথেষ্ট নয়। এগুলোর ওপর নির্ভর করার আগে মোডগুলো সমন্বয় করুন এবং আপনার ট্র্যাফিকের বিপরীতে পরীক্ষা করুন।
### রিকোয়েস্ট-পার্শ্ব: প্রম্পট ইনজেকশন গার্ড
| ভেরিয়েবল | ডিফল্ট | সোর্স ফাইল | বিবরণ |
| --------------------------------- | --------------- | ---------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `INPUT_SANITIZER_ENABLED` | `true` | `src/middleware/promptInjectionGuard.ts` | প্রম্পট ইনজেকশন প্যাটার্নের জন্য ইনকামিং মেসেজ স্ক্যান করা সক্রিয় করে। |
| `INPUT_SANITIZER_MODE` | `warn` | `src/middleware/promptInjectionGuard.ts` | ইনজেকশন নীতি: `warn` = শুধু লগ করে, `block` = 400 সহ রিকোয়েস্ট প্রত্যাখ্যান করে। লিগ্যাসি `redact` ইনজেকশন টেক্সট অপসারণ করে **না**; রিকোয়েস্টের PII পুনর্লিখনের জন্য `PII_REDACTION_ENABLED` ব্যবহার করুন। |
| `INJECTION_GUARD_MODE` | _(সেট করা নেই)_ | `src/middleware/promptInjectionGuard.ts` | `INPUT_SANITIZER_MODE`-এর লিগ্যাসি উপনাম—একই আচরণ। |
| `INPUT_SANITIZER_BLOCK_THRESHOLD` | `high` | `src/shared/utils/injectionSeverity.ts` | `MODE=block` যে ন্যূনতম তীব্রতা প্রত্যাখ্যান করে: `high` (ডিফল্ট), `medium`, অথবা `low`। থ্রেশহোল্ড কমানো না হলে মাঝারি প্যাটার্নগুলো শুধু পর্যবেক্ষণ করা হয়। |
| `INJECTION_GUARD_BLOCK_THRESHOLD` | _(সেট করা নেই)_ | `src/shared/utils/injectionSeverity.ts` | `INPUT_SANITIZER_BLOCK_THRESHOLD`-এর লিগ্যাসি উপনাম—একই আচরণ। |
| `PII_REDACTION_ENABLED` | `false` | `src/lib/guardrails/piiMasker.ts` | `true` হলে, ইনকামিং রিকোয়েস্টে PII অপসারণ করে (ইনজেকশন মোড থেকে স্বাধীন)। |
| `CREDENTIAL_REDACTION_ENABLED` | `false` | `src/lib/guardrails/credentialMasker.ts` | রিকোয়েস্ট/রেসপন্স পেলোড থেকে সুপরিচিত API-কী / সিক্রেট-টোকেন প্যাটার্ন অপসারণ করে। অপ্ট-ইন; `PII_REDACTION_ENABLED`-এর আচরণ অনুসরণ করে। |
### রেসপন্স-পার্শ্ব: PII স্যানিটাইজার
| ভেরিয়েবল | ডিফল্ট | সোর্স ফাইল | বিবরণ |
| -------------------------------- | -------- | ------------------------- | ------------------------------------------------------------------------------------ |
| `PII_RESPONSE_SANITIZATION` | `false` | `src/lib/piiSanitizer.ts` | ক্লায়েন্টের কাছে ফেরত দেওয়ার আগে ফাঁস হওয়া PII-এর জন্য LLM রেসপন্স স্ক্যান করে। |
| `PII_RESPONSE_SANITIZATION_MODE` | `redact` | `src/lib/piiSanitizer.ts` | `redact` = PII মাস্ক করে, `warn` = শুধু লগ করে, `block` = সম্পূর্ণ রেসপন্স বাদ দেয়। |
### VS Code টোকেনাইজড-রুট কনটেক্সট স্যানিটাইজার
| ভেরিয়েবল | ডিফল্ট | সোর্স ফাইল | বিবরণ |
| ----------------------------------- | ------ | ------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `OMNIROUTE_VSCODE_SANITIZE_CONTEXT` | `1` | `src/app/api/v1/vscode/contextSanitizer.ts` | `/v1/vscode/[token]/*` রিকোয়েস্ট থেকে অন্তর্নিহিত সক্রিয়-এডিটর কনটেক্সট (`editorContext`, `activeEditor`, `currentFile`, `selection`, `openTabs`…) সরিয়ে দেয় এবং স্পষ্টভাবে সংযুক্ত সংবেদনশীল ফাইলগুলোর কনটেন্ট অপসারণ করে। ডিফল্টভাবে সুরক্ষিত; নিষ্ক্রিয় করতে `0` সেট করুন। |
### পরিস্থিতি
| পরিস্থিতি | কনফিগারেশন |
| ----------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **এন্টারপ্রাইজ কমপ্লায়েন্স** | `INPUT_SANITIZER_ENABLED=true`, `INPUT_SANITIZER_MODE=block`, `PII_REDACTION_ENABLED=true`, `PII_RESPONSE_SANITIZATION=true` (ইনজেকশন ব্লকিং + রিকোয়েস্ট/রেসপন্সের PII অপসারণ; মোডগুলো পরস্পর স্বাধীন) |
| **শুধু মনিটরিং** | `INPUT_SANITIZER_ENABLED=true`, `INPUT_SANITIZER_MODE=warn`—লগ করে, কিন্তু কখনো ব্লক করে না |
| **ব্যক্তিগত ব্যবহার** | সবগুলো নিষ্ক্রিয় রাখুন—কোনো অতিরিক্ত ওভারহেড নেই |
---
## 6. টুল ও রাউটিং নীতিমালা
| ভেরিয়েবল | ডিফল্ট | সোর্স ফাইল | বিবরণ |
| ----------------------------------------------------------- | ------------------------------ | ------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `TOOL_POLICY_MODE` | `disabled` | `src/lib/toolPolicy.ts` | LLM-এর টুল/ফাংশন কলিং অ্যাক্সেস নিয়ন্ত্রণ করে। `allowlist` = কেবল তালিকাভুক্ত টুল, `denylist` = তালিকাভুক্তগুলো ছাড়া সব, `disabled` = কোনো বিধিনিষেধ নেই। |
| `OMNIROUTE_PAYLOAD_RULES_PATH` | `./config/payloadRules.json` | `open-sse/services/payloadRules.ts` | পেলোড পরিবর্তনের নিয়মসংবলিত JSON ফাইলের পাথ (প্রতি-মডেল/প্রোটোকলভিত্তিক আপস্ট্রিম সমন্বয়)। |
| `OMNIROUTE_PAYLOAD_RULES_RELOAD_MS` | `5000` | `open-sse/services/payloadRules.ts` | পেলোড নিয়মের ফাইল হট-রিলোড করার বিরতি (ms)। সর্বনিম্ন `1000`। |
| `OMNIROUTE_PREFER_CLAUDE_CODE_FOR_UNPREFIXED_CLAUDE_MODELS` | `false` | `open-sse/services/model.ts` | অপ্ট-ইন: প্রোভাইডার প্রিফিক্স আবশ্যক করার পরিবর্তে Claude Code ক্লায়েন্টের প্রিফিক্সবিহীন `claude-*` মডেল ID-গুলো Claude Code OAuth অ্যাকাউন্টের মাধ্যমে রাউট করে। স্পষ্ট প্রোভাইডার প্রিফিক্স এখনও অগ্রাধিকার পায়। Claude প্রোভাইডার পৃষ্ঠার একটি ড্যাশবোর্ড টগলের মাধ্যমেও এটি কনফিগার করা যায়। |
| `COMBO_CONCURRENCY_PER_MODEL` | `3` | `open-sse/services/comboConfig.ts` | রাউন্ড-রবিন কম্বোর জন্য প্রতি-মডেল কনকারেন্সি সীমা (#9100)। রাউন্ড-রবিন কম্বো সেমাফোরে কোনো ওভাররাইড ছাড়াই প্রতি মডেলে 3টি সমসাময়িক অনুরোধের হার্ড-ক্যাপ ছিল, ফলে বেশি কনকারেন্সির ট্র্যাফিক ওই সীমার পেছনে সিরিয়ালাইজ হতো। `>= 1` হিসেবে যাচাই করা হয় এবং `<= 32`-এ সীমাবদ্ধ রাখা হয়। |
| `DISABLE_CONTEXT_WINDOW_CHECKS` | `false` | `open-sse/handlers/chatCore.ts` | বিপজ্জনক অপ্ট-ইন, যা সরাসরি একক-মডেল অনুরোধের ক্ষেত্রে OmniRoute-এর স্থানীয় কনটেক্সট-উইন্ডো / সর্বোচ্চ-ইনপুট-টোকেন যাচাই এড়িয়ে যায়। আপস্ট্রিম প্রোভাইডারগুলো এখনও তাদের প্রকৃত সীমা প্রয়োগ করে; প্রম্পট কম্প্রেশন এবং মডেলের নিজস্ব আউটপুট-টোকেন সীমা সক্রিয় থাকে। কার্যকর অগ্রাধিকার হলো Feature Flags DB ওভাররাইড > এনভায়রনমেন্ট ভেরিয়েবল > ডিফল্ট; রিস্টার্টের প্রয়োজন নেই। |
| `OMNIROUTE_SELF_HOSTED_PROVIDERS` | _(সেট করা নেই)_ | `open-sse/services/selfHostedEntry.ts` | ইনলাইন YAML `providers:` ডকুমেন্ট (RIC-738, D4)। এটি সেট করা হলে (`strategy:` ব্লকসহ বা ছাড়া), `/v1/chat/completions` ক্লাউড পাইপলাইনের পরিবর্তে সেলফ-হোস্টেড সমন্বিত OpenAI-সামঞ্জস্যপূর্ণ এন্ট্রিতে পাঠানো হয়। সেট করা না থাকলে (ডিফল্ট), রুটটি সরাসরি বিদ্যমান ক্লাউড পাইপলাইনে চলে যায়। `docs/routing/SELF_HOSTED_OPENAI_ENTRY.md` দেখুন। |
| `OMNIROUTE_SELF_HOSTED_PROVIDERS_FILE` | _(সেট করা নেই)_ | `open-sse/services/selfHostedEntry.ts` | যেসব ডিপ্লয়মেন্ট ইনলাইন env var-এর পরিবর্তে ফাইল পছন্দ করে, তাদের জন্য `OMNIROUTE_SELF_HOSTED_PROVIDERS`-এর একই `providers:` ডকুমেন্ট ধারণকারী YAML ফাইলের পাথ। যেকোনো একটি সেলফ-হোস্টেড এন্ট্রি সক্রিয় করে। |
| `OMNIROUTE_SELF_HOSTED_API_KEY` | _(সেট করা নেই — উন্মুক্ত রুট)_ | `open-sse/services/selfHostedEntry.ts` | সমন্বিত সেলফ-হোস্টেড এন্ট্রির জন্য ঐচ্ছিক শেয়ার্ড API কী (D5 স্ক্যাফোল্ড, প্রতি-কী কোটা সিস্টেমের জন্য সংরক্ষিত)। এটি সেট করা থাকলে অনুরোধে অবশ্যই `Authorization: Bearer ` অন্তর্ভুক্ত থাকতে হবে। সেট করা না থাকলে: বিদ্যমান সেলফ-হোস্টেড লোকাল-প্রোভাইডার প্যাটার্নের সঙ্গে সামঞ্জস্য রেখে রুটটি উন্মুক্ত থাকে (লুপব্যাক/বিশ্বস্ত-নেটওয়ার্ক ডিপ্লয়মেন্ট)। |
| `OMNIROUTE_SELF_HOSTED_STRATEGY` | _(সেট করা নেই)_ | `open-sse/services/routingStrategies.ts` | ডিটারমিনিস্টিক রাউটিং ইঞ্জিনের জন্য ইনলাইন YAML `strategy:` ডকুমেন্ট (M2/RIC-740, D3) — ব্ল্যাকলিস্ট/হোয়াইটলিস্ট, কুলডাউন ব্রেকার, খরচ-অগ্রাধিকার, লেটেন্সি-সচেতনতা, ফলব্যাক চেইন। প্রতি-কী ভিত্তিতে `OMNIROUTE_SELF_HOSTED_PROVIDERS`-এর ভেতরে নেস্ট করা ইনলাইন `strategy:` ব্লককে ওভাররাইড করে। `docs/routing/DETERMINISTIC_ROUTING.md` দেখুন। |
| `OMNIROUTE_SELF_HOSTED_STRATEGY_FILE` | _(সেট করা নেই)_ | `open-sse/services/routingStrategies.ts` | যেসব ডিপ্লয়মেন্ট ইনলাইন env var-এর পরিবর্তে ফাইল পছন্দ করে, তাদের জন্য `OMNIROUTE_SELF_HOSTED_STRATEGY`-এর একই `strategy:` ডকুমেন্ট ধারণকারী YAML ফাইলের পাথ। |
| `OMNIROUTE_DISABLE_CONVERSATION_TRACKING` | _(সেট করা নেই)_ | `open-sse/services/conversationTracker.ts` | কথোপকথনের ইতিহাস সংগ্রহ বন্ধ করতে `1` সেট করুন। SQLite পড়া বা বার্তার ইতিহাস পার্স করার আগেই `resolveConversationId()` একটি ট্র্যাক না করা ফলাফল ফেরত দেয় এবং ক্লায়েন্ট-প্রদত্ত session ID-ও এর আওতায় পড়ে। routing-session পরিচালনা অপরিবর্তিত থাকে এবং বিদ্যমান রেকর্ড মুছে ফেলা হয় না। যেসব ডিপ্লয়মেন্ট dashboard-এর কথোপকথন ভিউ ব্যবহার করে না এবং turn table-এর বৃদ্ধি বন্ধ করতে চায়, তাদের জন্য। |
---
## 7. URL ও ক্লাউড সিঙ্ক
| ভেরিয়েবল | ডিফল্ট | সোর্স ফাইল | বিবরণ |
| ---------------------------------------- | ----------------------------------------------- | ------------------------------------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `BASE_URL` | `http://localhost:20128` | `src/lib/cloudSync.ts` | অভ্যন্তরীণ সিঙ্ক জব থেকে `/api/sync/cloud` কল করার জন্য সার্ভার-সাইড URL। অ্যাপটি সর্বজনীনভাবে প্রক্সি করা হলেও এটিকে লুপব্যাক/কনটেইনার URL হিসেবে রাখুন। |
| `CLOUD_URL` | _(খালি)_ | `src/lib/cloudSync.ts` | ক্লাউড রিলে এন্ডপয়েন্টের URL (প্রিমিয়াম ফিচার)। |
| `CLOUD_SYNC_TIMEOUT_MS` | `12000` | `src/lib/cloudSync.ts` | ক্লাউড সিঙ্ক অনুরোধের জন্য HTTP টাইমআউট। |
| `OMNIROUTE_BUILD_PROFILE` | `full` | Webpack বিল্ড কনফিগারেশন | বিল্ড-টাইম প্রোফাইল (বান্ডল থেকে বিশেষাধিকারপ্রাপ্ত মডিউলগুলোকে বাস্তবিকভাবে বাদ দিতে `minimal`-এ সেট করুন)। |
| `OMNIROUTE_STANDALONE_DIR` | _.build/ স্বতন্ত্র আউটপুট_ | `scripts/build/colocate-standalone.mjs` | বিল্ড-পরবর্তী কো-লোকেশন ধাপে ব্যবহৃত স্বতন্ত্র আউটপুট ডিরেক্টরির জন্য বিল্ড-টাইম ওভাররাইড। এটি কোনো রানটাইম সেটিং নয়। |
| `OMNIROUTE_CLOUD_SYNC_SECRET` | _(খালি)_ | `src/lib/cloudSync.ts` | ক্লাউড সিঙ্ক প্রতিক্রিয়ার HMAC-SHA256 স্বাক্ষর যাচাই করতে ব্যবহৃত শেয়ার করা সিক্রেট। |
| `OMNIROUTE_CLOUD_SYNC_SECRETS` | `false` | `src/lib/cloudSync.ts` | ক্লাউড সিঙ্ক এন্ডপয়েন্টকে স্থানীয় ক্রেডেনশিয়াল ওভাররাইট করার অনুমতি দিতে `true`-তে সেট করুন। ডিফল্ট হলো `false`। |
| `OMNIROUTE_CLOUD_SYNC_ENFORCE_SIGNATURE` | `false` | `src/lib/cloudSync.ts` | কোনো স্থানীয় সিক্রেট কনফিগার করা না থাকলে স্বাক্ষরবিহীন ক্লাউড সিঙ্ক প্রতিক্রিয়া প্রত্যাখ্যান করতে `true`-তে সেট করুন (#13679)। উপস্থিত কোনো স্বাক্ষর সর্বদা যাচাই করা হয়—এবং `OMNIROUTE_CLOUD_SYNC_SECRET` সেট করা না থাকলে সর্বদা প্রত্যাখ্যান করা হয়—এই ফ্ল্যাগের মান নির্বিশেষে। v3.9-এ ডিফল্টটি বাধ্যতামূলক যাচাইকরণে পরিবর্তিত হবে। |
| `OMNIROUTE_ZED_IMPORT_LEGACY_ONE_STEP` | `false` | `src/app/api/providers/zed/import/route.ts` | ব্যবহারকারীর নিশ্চিতকরণ ছাড়াই v3.8.5-এর এক-ধাপের "সবকিছু ইমপোর্ট করুন" আচরণে ফিরে যেতে `true`-তে সেট করুন। |
| `NEXT_PUBLIC_BASE_URL` | `http://localhost:20128` | OAuth, ড্যাশবোর্ড, সিঙ্ক | OAuth redirect_uri, ড্যাশবোর্ড লিংক এবং জেনারেট করা সর্বজনীন URL-এর জন্য সর্বসাধারণের জন্য উন্মুক্ত URL। OAuth কলব্যাক বা জেনারেট করা ব্রাউজার লিংকে একটি ক্যানোনিক্যাল রিভার্স-প্রক্সি হোস্ট ব্যবহার করতে হলে এটিকে স্থিতিশীল সর্বজনীন URL-এ সেট করুন। |
| `NEXT_PUBLIC_CLOUD_URL` | _(খালি)_ | ক্লায়েন্ট-সাইড | `CLOUD_URL`-এর ক্লায়েন্ট-সাইড মিরর। |
| `NEXT_PUBLIC_APP_URL` | _(সেট করা নেই)_ | `src/shared/services/cloudSyncScheduler.ts` | `NEXT_PUBLIC_BASE_URL`-এর জন্য লিগ্যাসি ফলব্যাক। |
| `NEXT_PUBLIC_PORT` | _(সেট করা নেই — `PORT`-এ ফলব্যাক করে)_ | `src/shared/hooks/useDisplayBaseUrl.ts` | কোনো অরিজিন জানা না থাকলে (SSR/টেস্ট) প্রদর্শন URL-এর জন্য ক্লায়েন্ট-সাইড ফলব্যাক পোর্ট; `PORT`-এর আগে পড়া হয়। |
| `OMNIROUTE_PUBLIC_BASE_URL` | _(সেট করা নেই)_ | পাবলিক-অরিজিন রিজলভার, ইমেজ URL | পাবলিক URL তৈরি এবং ড্যাশবোর্ড-বহির্ভূত ব্রাউজার-অরিজিন যাচাইয়ের জন্য ব্যবহৃত সর্বোচ্চ-অগ্রাধিকারের ব্রাউজারমুখী OmniRoute অরিজিন। OpenWebUI বা অন্য কোনো রিলে একটি অভ্যন্তরীণ URL দিয়ে OmniRoute-এ পৌঁছালেও ব্যবহারকারীর ব্রাউজারকে LAN, টানেল বা পাবলিক অরিজিন থেকে তৈরি করা মিডিয়া আনতে হলে এটি সেট করুন। `/v1` অন্তর্ভুক্ত করবেন **না**। |
| `OMNIROUTE_PROVIDER_MANIFEST_URL` | _(সেট করা নেই)_ | `open-sse/config/providerPluginManifestUrl.ts` | সাইডকার ক্লায়েন্টগুলোর কাছে ঘোষিত অ্যাবসলিউট প্রোভাইডার প্লাগইন ম্যানিফেস্ট URL। সেট করা না থাকলে OmniRoute রিকোয়েস্ট অরিজিন বা HOST/PORT থেকে `/api/v1/provider-plugin-manifest` নির্ণয় করে। |
| `OMNIROUTE_PUBLIC_PROTOCOL` | `http` | `open-sse/config/providerPluginManifestUrl.ts` | রিকোয়েস্ট অরিজিন ছাড়া HOST/PORT থেকে প্রোভাইডার প্লাগইন ম্যানিফেস্ট URL নির্ণয় করার সময় ব্যবহৃত প্রোটোকল। কোনো সুস্পষ্ট `OMNIROUTE_PROVIDER_MANIFEST_URL` সেট করা না থাকলে, TLS-টার্মিনেটিং পাবলিক প্রক্সির পেছনে এটি `https`-এ সেট করুন। |
| `OMNIROUTE_TRUST_PROXY` | _(সেট করা নেই)_ | `src/server/origin/publicOrigin.ts` | ফরোয়ার্ড করা পাবলিক-অরিজিন হেডারের জন্য ঐচ্ছিক ট্রাস্ট মোড। সেট করা নেই = নিরাপত্তা-সংক্রান্ত সিদ্ধান্তের জন্য `Forwarded` / `X-Forwarded-*` বিশ্বাস করবেন না। `true` / `loopback` শুধু টোকেন-স্ট্যাম্পযুক্ত লুপব্যাক প্রক্সি থেকে ফরোয়ার্ড করা হোস্ট/প্রোটো বিশ্বাস করে। `private` / `lan` ব্যক্তিগত-LAN প্রক্সি পিয়ারগুলোকেও বিশ্বাস করে। প্রোডাকশনে সুস্পষ্ট `NEXT_PUBLIC_BASE_URL` ব্যবহার করাই শ্রেয়। |
| `KIE_CALLBACK_URL` | _(সেট করা নেই)_ | `open-sse/utils/kieTask.ts` | অ্যাসিঙ্ক্রোনাস kie.ai জবের জন্য পাবলিক কলব্যাক URL। `OMNIROUTE_KIE_CALLBACK_URL` এবং `OMNIROUTE_PUBLIC_URL`-এর আগে সর্বোচ্চ-অগ্রাধিকারের ওভাররাইড। |
| `OMNIROUTE_KIE_CALLBACK_URL` | _(সেট করা নেই)_ | `open-sse/utils/kieTask.ts` | `KIE_CALLBACK_URL`-এর বিকল্প বানান। প্রাথমিক ভেরিয়েবলটি সেট করা না থাকলে এটিতে ফলব্যাক করে। |
| `OMNIROUTE_PUBLIC_URL` | _(সেট করা নেই)_ | `open-sse/utils/kieTask.ts` | অ্যাসিঙ্ক কলব্যাক URL তৈরি করতে ব্যবহৃত পাবলিক অরিজিন। kie.ai কলব্যাকের জন্য সর্বনিম্ন-অগ্রাধিকারের ফলব্যাক; অন্যান্য রিলের জন্যও জেনেরিক পাবলিক URL হিসেবে ব্যবহৃত হয়। |
| `OMNIROUTE_CROF_USAGE_URL` | `https://crof.ai/usage_api/` | `open-sse/services/usage.ts` | Usage পেজে ব্যবহৃত CrofAI কোটা লুকআপ এন্ডপয়েন্ট। রিলে / টেস্ট ফিক্সচারের জন্য ওভাররাইড করুন। |
| `OMNIROUTE_OPENCODE_QUOTA_URL` | `https://opencode.ai/zen/go/v1/usage` | `open-sse/services/opencodeQuotaFetcher.ts` | Usage পেজে ব্যবহৃত অফিসিয়াল API-কী-প্রমাণীকৃত OpenCode Go ব্যবহার-বিবরণী এন্ডপয়েন্ট। রিলে / টেস্ট ফিক্সচারের জন্য ওভাররাইড করুন। |
| `OPENCODE_SYNTHESIZE_CLI_HEADERS` | `true` | `open-sse/executors/opencode.ts` | ক্লায়েন্ট পাঠায়নি এমন OpenCode CLI পরিচয় হেডার (User-Agent, x-opencode-client/project, রিকোয়েস্ট/সেশন UUID) opencode-go/zen আপস্ট্রিম রিকোয়েস্টে তৈরি করে, যাতে VPS ইগ্রেসে Cloudflare সেগুলো গ্রহণ করে (#6210/#5997)। #10571 থেকে ডিফল্টভাবে চালু; `false`/`0`/`no`/`off` দিয়ে অপ্ট আউট করুন। |
| `OPENCODE_USER_AGENT` | `opencode/1.18.31` | `open-sse/utils/opencodeHeaders.ts` | `OPENCODE_SYNTHESIZE_CLI_HEADERS` চালু থাকা অবস্থায় এবং প্রতি-প্রোভাইডার `_USER_AGENT` ওভাররাইড সেট করা না থাকলে ব্যবহৃত ডিফল্ট User-Agent। কেবল opencode এক্সিকিউটরে প্রয়োগ করা হয়। আপস্ট্রিম দ্বারা গেট করা কী-বিহীন রিকোয়েস্টে, কনফিগার করা মানে `opencode/= 1.17>` না থাকলে রিকোয়েস্ট প্রত্যাখ্যানের পরিবর্তে এই ডিফল্ট দিয়ে প্রতিস্থাপন করা হয়। |
| `OPENCODE_CLIENT` | `desktop` | `open-sse/executors/opencode.ts` | `OPENCODE_SYNTHESIZE_CLI_HEADERS` চালু থাকলে সংশ্লেষিত `x-opencode-client` হেডারের মান। |
| `OPENCODE_PROJECT` | `global` | `open-sse/executors/opencode.ts` | `OPENCODE_SYNTHESIZE_CLI_HEADERS` চালু থাকলে সংশ্লেষিত `x-opencode-project` হেডারের মান। |
| `OPENCODE_FREE_TIER_REQUEST_CONTRACT` | _(সেট করা নেই)_ | `open-sse/executors/opencodeFreeTierContract.ts` | কী-বিহীন OpenCode অনুরোধগুলোর বডি (স্ট্রিমিং ফ্ল্যাগ ও টুলের তালিকা) সমন্বয় করা বন্ধ করতে `off`-এ সেট করুন। হেডারগুলো তবুও প্রয়োগ করা হয়। প্রতি অনুরোধে এটি পড়া হয়, তাই কোনো পরিবর্তন সঙ্গে সঙ্গেই কার্যকর হয়। |
| `OPENCODE_FREE_TIER_PLACEHOLDER_TOOLS` | _(সেট করা নেই)_ | `open-sse/executors/opencodeFreeTierContract.ts` | কোনো কী-বিহীন OpenCode অনুরোধে কোনো টুল না থাকলে এবং সেই মডেলের জন্য এখনও কিছু পর্যবেক্ষণ করা না হয়ে থাকলে, অনুরোধটিতে ঘোষণা করার জন্য কমা দিয়ে পৃথক করা টুলের নাম। খালি থাকলে একটি একক প্লেসহোল্ডার ব্যবহৃত হয়, যা মডেলকে কল না করতে বলা হয়। সর্বাধিক 32টি এন্ট্রি, `[A-Za-z_][A-Za-z0-9_-]{0,63}`; অবৈধ এন্ট্রি উপেক্ষা করা হয়। |
| `OMNIROUTE_OLLAMA_CLOUD_USAGE_URL` | `https://ollama.com/settings` | `open-sse/services/usage.ts` | কোটা স্ক্র্যাপিংয়ের জন্য ব্যবহৃত Ollama Cloud সেটিংস URL। রিলে/টেস্ট ফিক্সচারের জন্য ওভাররাইড করুন। |
| `OLLAMA_USAGE_COOKIE` | _(সেট করা নেই)_ | `open-sse/services/usage.ts` | সেটিংস পৃষ্ঠা থেকে কোটা স্ক্র্যাপিংয়ের জন্য ব্যবহৃত Ollama Cloud `__Secure-session` কুকি। সংবেদনশীল; একাধিক অ্যাকাউন্ট কনফিগার করা থাকলে প্রতি-সংযোগ Dashboard ফিল্ড ব্যবহার করাই শ্রেয়। |
| `OLLAMA_CLOUD_USAGE_COOKIE` | _(সেট করা নেই)_ | `open-sse/services/usage.ts` | বিকল্প Ollama Cloud `__Secure-session` কুকি এনভায়রনমেন্ট ভেরিয়েবল। সংবেদনশীল; একাধিক অ্যাকাউন্ট কনফিগার করা থাকলে প্রতি-সংযোগ Dashboard ফিল্ড ব্যবহার করাই শ্রেয়। |
| `OMNIROUTE_OLLAMA_USAGE_COOKIE` | _(সেট করা নেই)_ | `open-sse/services/usage.ts` | সংক্ষিপ্ত অ্যালিয়াসগুলোর আগে ব্যবহৃত বিকল্প Ollama Cloud `__Secure-session` কুকি এনভায়রনমেন্ট ভেরিয়েবল। সংবেদনশীল; একাধিক অ্যাকাউন্ট কনফিগার করা থাকলে প্রতি-সংযোগ Dashboard ফিল্ড ব্যবহার করাই শ্রেয়। |
| `OMNIROUTE_CODEWHISPERER_BASE_URL` | `https://codewhisperer.us-east-1.amazonaws.com` | `open-sse/services/usage.ts` | CodeWhisperer (AWS Kiro) ব্যবহারসীমার এন্ডপয়েন্ট। রিলে/টেস্ট ফিক্সচারের জন্য ওভাররাইড করুন। |
> [!IMPORTANT]
> একটি রিভার্স প্রক্সির (nginx, Caddy) পেছনে ডিপ্লয় করার সময়, OAuth কলব্যাক বা জেনারেট করা পাবলিক লিঙ্কগুলোতে ওই হোস্টনাম ব্যবহার করা আবশ্যক হলে `NEXT_PUBLIC_BASE_URL`-কে আপনার স্থিতিশীল পাবলিক URL-এ (যেমন, `https://omniroute.example.com`) সেট করুন। এটি না করলে OAuth কলব্যাক ব্যর্থ হতে পারে, কারণ `redirect_uri` মিলবে না এবং জেনারেট করা পাবলিক লিঙ্কগুলো অভ্যন্তরীণ কনটেইনার অরিজিনের দিকে নির্দেশ করতে পারে।
>
> সার্ভার-টু-সার্ভার কাজের জন্য `BASE_URL`-কে একটি অভ্যন্তরীণ লুপব্যাক/কনটেইনার URL হিসেবেই রাখুন। ক্রেডেনশিয়াল বহনকারী অভ্যন্তরীণ সেলফ-ফেচের জন্য ব্রাউজারের `Origin` বা পাবলিক হোস্টনাম ব্যবহার করবেন না।
>
> প্রমাণীকৃত ড্যাশবোর্ড রাইটের জন্য একটি স্থির পাবলিক বেস URL প্রয়োজন হয় না: ড্যাশবোর্ড একটি সেশন-বাউন্ড CSRF টোকেনসহ সেম-অরিজিন অনিরাপদ অনুরোধ পাঠায়। নন-ড্যাশবোর্ড ব্রাউজার ইন্টিগ্রেশনের জন্য OmniRoute তবুও পাবলিক-অরিজিন যাচাইকরণকে কেন্দ্রীভূত করে: সুস্পষ্ট পাবলিক URL এনভায়রনমেন্ট ভেরিয়েবলগুলোকে প্রথমে বিশ্বাস করা হয়; `OMNIROUTE_TRUST_PROXY` সক্রিয় না থাকলে এবং তাৎক্ষণিক প্রক্সি পিয়ারকে টোকেন দিয়ে বিশ্বস্ত হিসেবে চিহ্নিত না করা হলে অপরিবর্তিত `Forwarded` / `X-Forwarded-*` হেডারগুলো উপেক্ষা করা হয়। সেম-অরিজিন ড্যাশবোর্ড অনুরোধ ঠিক করতে CORS সেটিংস ব্যবহার করবেন না; CORS কেবল ক্রস-অরিজিন ব্রাউজার ক্লায়েন্টের জন্য।
---
## 8. আউটবাউন্ড প্রক্সি
এগ্রেস নিয়ন্ত্রণ, জিও-রাউটিং বা IP মাস্কিংয়ের জন্য আপস্ট্রিম LLM প্রদানকারীর কলগুলো একটি HTTP বা SOCKS5 প্রক্সির মাধ্যমে রাউট করুন।
| ভেরিয়েবল | ডিফল্ট | সোর্স ফাইল | বিবরণ |
| ---------------------------------------- | --------------- | -------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `ENABLE_SOCKS5_PROXY` | `true` | `open-sse/executors` | আপস্ট্রিম কলের জন্য SOCKS5 প্রক্সি এজেন্ট সক্রিয় করে। `false` দিয়ে অপ্ট-আউট করুন। |
| `NEXT_PUBLIC_ENABLE_SOCKS5_PROXY` | `true` | ক্লায়েন্ট-সাইড | SOCKS5-এর উপলভ্যতা সম্পর্কে ক্লায়েন্ট-সাইড সচেতনতা। |
| `PROXY_SKIP_RECENTLY_FAILED` | `false` | `src/shared/utils/featureFlags.ts` | অপ্ট-ইন ফিচার ফ্ল্যাগ ([FEATURE_FLAGS.md](./FEATURE_FLAGS.md) দেখুন; ড্যাশবোর্ড DB ওভাররাইড অগ্রাধিকার পায়)। সদ্য ব্যর্থ হওয়া কোনো সদস্যকে (TCP প্রোব প্রত্যাখ্যাত হলে, অথবা সেটির মাধ্যমে 429 এলে) প্রক্সি পুল এবং প্রতি-অ্যাকাউন্ট রোটেশন পুনরায় পরিবেশন করা কিছু সময়ের জন্য বন্ধ রাখে; প্রতিবার পুনরাবৃত্তিতে সময়টি দ্বিগুণ হয়, সর্বোচ্চ সীমা পর্যন্ত। `true` (অথবা `1`, `yes`) এটি সক্রিয় করে। |
| `HTTP_PROXY` | _(সেট করা নেই)_ | Node.js স্ট্যান্ডার্ড | আপস্ট্রিম কলের জন্য HTTP প্রক্সি। |
| `HTTPS_PROXY` | _(সেট করা নেই)_ | Node.js স্ট্যান্ডার্ড | আপস্ট্রিম কলের জন্য HTTPS প্রক্সি। |
| `ALL_PROXY` | _(সেট করা নেই)_ | Node.js স্ট্যান্ডার্ড | সার্বজনীন প্রক্সি (`socks5://` সমর্থন করে)। |
| `OMNIROUTE_PROXY_ECHO_URL` | _(সেট করা নেই)_ | `src/lib/proxyEchoTarget.ts` | প্রক্সি ইগ্রেস প্রোবে ব্যবহৃত echo-IP টার্গেটকে একটি URL-এ স্থির করে। সেট না থাকলে, প্রোব প্রথমে `api64.ipify.org`, এরপর `api4.ipify.org` চেষ্টা করে, যাতে শুধুমাত্র IPv4-সমর্থিত টানেলকে অকার্যকর হিসেবে রিপোর্ট করা না হয় (#9694)। |
| `NO_PROXY` | _(সেট করা নেই)_ | Node.js স্ট্যান্ডার্ড | প্রক্সি বাইপাস করার জন্য কমা দিয়ে পৃথক করা হোস্টনেম/IP। |
| `OMNIROUTE_PROXY_DISPATCHER_CONNECTIONS` | `32` | `open-sse/utils/proxyDispatcher.ts` | প্রতিটি ক্যাশ করা HTTP/SOCKS প্রক্সি ডিসপ্যাচারের জন্য একযোগে সক্রিয় সকেটের সর্বোচ্চ সংখ্যা। একাধিক অনুরোধ একই অ্যাকাউন্ট-স্তরের প্রক্সি শেয়ার করলে Codex `/v1/responses`-এর মতো দীর্ঘস্থায়ী SSE স্ট্রিমের জন্য একটির বেশি সংযোগ প্রয়োজন। `256`-এর বেশি মান সীমাবদ্ধ করা হয়। |
| `SOCKS_HANDSHAKE_TIMEOUT_MS` | `10000` | `open-sse/utils/socksConnectorWithFamily.ts` | SOCKS5 হ্যান্ডশেকের (সংযোগ) টাইমআউট, ms-এ। একটি আবাসিক গেটওয়ে হোস্টে উচ্চ সমবর্তী চাপ পড়লে (যেমন 100টি একযোগে অনুরোধ) এটি বাড়ান—প্রক্সি অ্যাক্সেসযোগ্য হলেও পরিপূর্ণ পুলে প্রকৃত হ্যান্ডশেক 10s অতিক্রম করতে পারে, যা অন্যথায় ভুল `[Proxy Fast-Fail] Proxy unreachable` হিসেবে প্রকাশ পায়। সর্বোচ্চ `120000`-এ সীমাবদ্ধ। |
| `PROXY_FAIL_OPEN` | `false` | `src/sse/handlers/chatHelpers.ts` | `false` (ডিফল্ট) হলে, নির্ধারিত প্রক্সি রিজলভ করতে ব্যর্থ হওয়া অনুরোধকে সরাসরি সংযোগে ফলব্যাক না করে **প্রত্যাখ্যান করা হয় (fail-closed)**—এটি প্রকৃত IP ফাঁস প্রতিরোধ করে। পুরোনো DIRECT ফলব্যাক পুনরুদ্ধার করতে `true` সেট করুন। |
| `ENABLE_TLS_FINGERPRINT` | `false` | `open-sse/executors` | wreq-js ব্যবহার করে TLS ফিঙ্গারপ্রিন্ট স্পুফ করে (Chrome 124 অনুকরণ করে)। JA3/JA4 ব্লকিং প্রতিহত করে। |
| `TLS_FINGERPRINT_PROVIDERS` | _(সেট করা নেই)_ | `open-sse/utils/proxyFetch.ts` | নতুন প্রক্সিযুক্ত TLS রাউটিংয়ের (`open-sse/utils/proxyFetch.ts`) জন্য কমা দিয়ে পৃথক করা প্রোভাইডার অ্যালাওলিস্ট। সেট না থাকলে সরাসরি TLS তার পুরোনো আচরণ বজায় রাখে; শুধুমাত্র এই প্রোভাইডারগুলো Chrome-124 ফিঙ্গারপ্রিন্ট ব্রিজের মাধ্যমে রাউট হয়। |
| `OMNIROUTE_TURNSTILE_IGNORE_TLS_ERRORS` | `false` | `open-sse/services/claudeTurnstileSolver.ts` | Claude Turnstile Playwright ব্রাউজার কনটেক্সটকে HTTPS সার্টিফিকেট ত্রুটি উপেক্ষা করার অনুমতি দেয়। |
### পরিস্থিতিসমূহ
| পরিস্থিতি | কনফিগারেশন |
| ------------------------------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **SSH টানেলের মাধ্যমে SOCKS5** | `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` |
| **অ্যান্টি-ফিঙ্গারপ্রিন্ট** | `ENABLE_TLS_FINGERPRINT=true` — `wreq-js` প্রয়োজন (অন্তর্ভুক্ত) |
| **নির্গমন-নিয়ন্ত্রিত / সরাসরি অ্যাক্সেস নেই** | `PROXY_FAIL_OPEN=false` অপরিবর্তিত রাখুন (ডিফল্ট)। প্রক্সি অনুপলভ্য হলে সরাসরি সংযোগের মাধ্যমে তথ্য ফাঁস করার পরিবর্তে অনুরোধগুলো সম্পূর্ণরূপে ব্যর্থ হয়। |
| **লিগ্যাসি / ডেভ — সরাসরি ফলব্যাক অনুমোদন করুন** | `PROXY_FAIL_OPEN=true`। হার্ডেনিং-পূর্ববর্তী আচরণ পুনরুদ্ধার করে: প্রক্সি রেজোলিউশন ব্যর্থ হলে সরাসরি সংযোগ ব্যবহার করা হয়। |
> **দ্রষ্টব্য (NVIDIA যাচাইকরণ বাইপাস — #3226):** NVIDIA-এর API-কী যাচাইকরণ এন্ডপয়েন্ট
> গ্লোবাল প্রক্সি/TLS-প্যাচড fetch-এর মাধ্যমে রাউট করা হলে আটকে যায় (undici dispatcher → 504)।
> `src/lib/providers/validation.ts::directHttpsRequest()` ইচ্ছাকৃতভাবে ওই একটি
> যাচাইকরণ কলের জন্য `safeOutboundFetch({ bypassProxyPatch: true })` ব্যবহার করে প্রক্সি প্যাচ বাইপাস করে।
> এটি একটি নথিভুক্ত, সীমিত-পরিসরের ব্যতিক্রম — এটি চ্যাট/ব্যবহার-সংক্রান্ত নির্গমনকে **প্রভাবিত করে না**।
> বাইপাসটির পরিসর `tests/unit/proxy-bypass-scope-guard-3226.test.ts` দ্বারা নির্দিষ্টভাবে সীমাবদ্ধ রাখা হয়েছে।
---
## ৯. CLI টুল ইন্টিগ্রেশন
OmniRoute কীভাবে CLI সাইডকার (Claude Code, Codex ইত্যাদি) শনাক্ত ও চালু করে, তা নিয়ন্ত্রণ করে।
| ভেরিয়েবল | ডিফল্ট | সোর্স ফাইল | বিবরণ |
| --------------------------------- | -------------------------------- | --------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `CLI_MODE` | `auto` | `src/shared/services/cliRuntime.ts` | `auto` = সিস্টেম PATH-এ অনুসন্ধান করে; `manual` = শুধু স্পষ্টভাবে নির্ধারিত পাথ ব্যবহার করে। |
| `CLI_EXTRA_PATHS` | _(সেট করা নেই)_ | `src/shared/services/cliRuntime.ts` | CLI বাইনারি শনাক্তকরণের জন্য অতিরিক্ত PATH এন্ট্রি (কোলন দিয়ে পৃথক করা)। |
| `CLI_CONFIG_HOME` | _(সেট করা নেই)_ | `src/shared/services/cliRuntime.ts` | CLI কনফিগ (`~/.claude`, `~/.codex`) পড়ার জন্য হোম ডিরেক্টরি ওভাররাইড করে। এটি অবশ্যই অ্যাবসলিউট এবং প্রসেস হোমের ভেতরে হতে হবে — **অথবা**, কোনো কন্টেইনারে, একটি bind-mounted পাথ হতে হবে (`/host-home` এভাবেই কাজ করে)। অন্য যেকোনো মানের ক্ষেত্রে হোম ডিরেক্টরি ব্যবহার করা হয়। |
| `CLI_ALLOW_CONFIG_WRITES` | `true` | `src/shared/services/cliRuntime.ts` | OmniRoute-কে CLI কনফিগ ফাইল লিখতে দেয় (টোকেন রিফ্রেশ, সেশন ডেটা)। প্রতিটি CLI কনফিগ লেখার প্রচেষ্টাকে স্পষ্ট "লেখা নিষ্ক্রিয়" ত্রুটিসহ ব্যর্থ করতে এটিকে `false`-এ সেট করুন। |
| `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`, তারপর `cursor` | `src/shared/services/cliRuntime.ts` | Cursor agent বাইনারির কাস্টম পাথ। এটি না থাকলে শনাক্তকরণ প্রথমে `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-মালিকানাধীন auth প্রোফাইল); এটি 5dive-এর নিজস্ব STATE_DIR ডিফল্টকে প্রতিফলিত করে। |
| `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` | Qwen Code CLI বাইনারির কাস্টম পাথ। |
| `CLI_AIDER_BIN` | `aider` | `src/shared/services/cliRuntime.ts` | Aider CLI বাইনারির কাস্টম পাথ। |
| `CLI_GOOSE_BIN` | `goose` | `src/shared/services/cliRuntime.ts` | Goose CLI বাইনারির কাস্টম পাথ। |
| `CLI_GEMINI_BIN` | `gemini` | `src/shared/services/cliRuntime.ts` | Google Gemini CLI বাইনারির কাস্টম পাথ — শুধু সার্ভার-পার্শ্বের শনাক্তকরণ/স্বাস্থ্য পরীক্ষার জন্য; `omniroute run gemini` সিস্টেম PATH থেকে `gemini` বাইনারি নির্ধারণ করে। |
| `CLI_KILO_BIN` | `kilocode` | `src/shared/services/cliRuntime.ts` | Kilo Code CLI বাইনারির কাস্টম পাথ। |
| `CLI_OPENCODE_BIN` | `opencode` | `src/shared/services/cliRuntime.ts` | OpenCode CLI বাইনারির কাস্টম পাথ। |
| `CLI_HERMES_BIN` | `hermes` | `src/shared/services/cliRuntime.ts` | Hermes বাইনারির কাস্টম পাথ। উভয় ক্যাটালগ এন্ট্রি (`hermes` এবং `hermes-agent`) এটি শেয়ার করে। |
| `CLI_FORGE_BIN` | `forge` | `src/shared/services/cliRuntime.ts` | ForgeCode CLI বাইনারির কাস্টম পাথ। |
| `CLI_JCODE_BIN` | `jcode` | `src/shared/services/cliRuntime.ts` | jcode CLI বাইনারির কাস্টম পাথ। |
| `CLI_DEEPSEEK_TUI_BIN` | `deepseek-tui` | `src/shared/services/cliRuntime.ts` | DeepSeek TUI বাইনারির কাস্টম পাথ। |
| `CLI_CODEWHALE_BIN` | `codewhale` | `src/shared/services/cliRuntime.ts` | CodeWhale CLI বাইনারির কাস্টম পাথ। |
| `CLI_SMELT_BIN` | `smelt` | `src/shared/services/cliRuntime.ts` | Smelt CLI বাইনারির কাস্টম পাথ। |
| `CLI_PI_BIN` | `pi` | `src/shared/services/cliRuntime.ts` | Pi (pi-coding-agent) বাইনারির কাস্টম পাথ। |
| `CLI_CRUSH_BIN` | `crush` | `src/shared/services/cliRuntime.ts` | Crush CLI বাইনারির কাস্টম পাথ। |
| `CLI_OMP_BIN` | `omp` | `src/shared/services/cliRuntime.ts` | Oh My Pi (`omp`) agent বাইনারির কাস্টম পাথ। |
| `CLI_LETTA_BIN` | `letta` | `src/shared/services/cliRuntime.ts` | Letta CLI বাইনারির কাস্টম পাথ। |
| `CLI_PRIME_AGENT_BIN` | `prime-agent` | `src/shared/services/cliRuntime.ts` | Prime Agent (Prime Intellect) বাইনারির কাস্টম পাথ। |
| `CLI_WINDSURF_BIN` | _(কোনোটিই নয়)_ | `src/shared/services/cliRuntime.ts` | Windsurf বাইনারির কাস্টম পাথ। Windsurf-এর সঙ্গে **কোনো ডিফল্ট কমান্ড নেই** — এটি সেট না করা পর্যন্ত বাইনারি শনাক্তকরণ নিষ্ক্রিয় থাকে। |
| `CLI_DEVIN_BIN` | `devin` | `open-sse/executors/devin-cli.ts` | Devin CLI বাইনারির কাস্টম পাথ (v3.8.0)। Windsurf/Devin executor এটি ব্যবহার করে। |
| `DEVIN_DESKTOP_VERSION` | `3.6.27` | `open-sse/executors/devin-desktop.ts` | Devin Desktop `ide_version`। ওভাররাইডে অবশ্যই `x.y.z` ফরম্যাট ব্যবহার করতে হবে; অবৈধ মানের ক্ষেত্রে যাচাইকৃত ডিফল্ট ব্যবহার করা হয়। |
| `DEVIN_DESKTOP_EXTENSION_VERSION` | `1.48.2` | `open-sse/executors/devin-desktop.ts` | বান্ডল করা Codeium/language-server `extension_version`, যা Desktop `ide_version` থেকে আলাদা। ওভাররাইডে অবশ্যই `x.y.z` ব্যবহার করতে হবে; অবৈধ মানের ক্ষেত্রে বান্ডল করা ডিফল্ট ব্যবহৃত হয়। |
| `CLI_DEVIN_AGENTIC_BIN` | `devin` | `open-sse/executors/devin-cli-agentic.ts` | শুধু agentic bridge-এর জন্য Devin CLI ওভাররাইড। executor শুধু লোকাল ACP stdio upstream গ্রহণ করে। |
| `DEVIN_AGENTIC_HOME` | _(আবশ্যক)_ | `open-sse/executors/devin-cli-agentic.ts` | agentic Devin সাবপ্রসেসের জন্য অ্যাবসলিউট বিচ্ছিন্ন হোম; গ্রহণযোগ্য bridge পাথ হলো `/home/bridge` এবং টাস্ক-লোকাল `.sandbox` পাথ (Windows-এ, `C:\...\.sandbox\...`)। |
| `DEVIN_AGENTIC_ACP_TIMEOUT_MS` | `120000` | `open-sse/executors/devin-cli-agentic.ts` | bridge চাইল্ড প্রসেস সমাপ্ত করে স্পষ্ট timeout ফেরত দেওয়ার আগে একটি Devin ACP turn-এর সর্বোচ্চ সময়কাল। |
| `DEVIN_BRIDGE_MODEL` | `devin-cli-agentic/swe-1-7` | `docker/devin-bridge/compose.yml` | বিচ্ছিন্ন bridge-এর জন্য প্রধান Claude Code মডেল alias। লাইভ harness উদাহরণটিকে বর্তমান Devin অ্যাকাউন্ট থেকে ফেরত পাওয়া একটি মডেল দিয়ে প্রতিস্থাপন করে। |
| `DEVIN_BRIDGE_SONNET_MODEL` | `DEVIN_BRIDGE_MODEL` | `docker/devin-bridge/compose.yml` | Claude Code তার Sonnet ডিফল্ট চাইলে ব্যবহৃত বিচ্ছিন্ন bridge alias। |
| `DEVIN_BRIDGE_OPUS_MODEL` | `DEVIN_BRIDGE_MODEL` | `docker/devin-bridge/compose.yml` | Claude Code তার Opus ডিফল্ট চাইলে ব্যবহৃত বিচ্ছিন্ন bridge alias। |
| `DEVIN_BRIDGE_HAIKU_MODEL` | `DEVIN_BRIDGE_MODEL` | `docker/devin-bridge/compose.yml` | Claude Code তার Haiku ডিফল্ট চাইলে ব্যবহৃত বিচ্ছিন্ন bridge alias। |
| `DEVIN_BRIDGE_SUBAGENT_MODEL` | `DEVIN_BRIDGE_MODEL` | `docker/devin-bridge/compose.yml` | Claude Code subagent-এর জন্য ব্যবহৃত বিচ্ছিন্ন bridge alias। |
| `DEVIN_SEAT_API_URL` | `https://server.codeium.com` | `open-sse/services/usage/devinCli.ts` | Devin CLI quota (`GetUserStatus`) যে Codeium seat-management API ব্যবহার করে, তার ঐচ্ছিক ওভাররাইড। |
| `AUGGIE_BIN` | `auggie` | `open-sse/executors/auggie.ts` | লোকাল `auggie` provider-এর ব্যবহৃত Augment (Auggie) CLI বাইনারির জন্য অ্যাবসলিউট-পাথ ওভাররাইড। এটি না পাওয়া গেলে প্রথমে `CLI_AUGGIE_BIN`, তারপর PATH lookup ব্যবহার করা হয়। |
| `CLI_AUGGIE_BIN` | `auggie` | `open-sse/executors/auggie.ts` | Augment (Auggie) CLI বাইনারি পাথের alias ওভাররাইড (`AUGGIE_BIN`-এর পরে পরীক্ষা করা হয়)। |
| `ZCODE_BIN` | `zcode` | `open-sse/executors/zcode.ts` | লোকাল `zcode` provider-এর stdio client-এর জন্য ব্যবহৃত বাইনারি। এটি না পাওয়া গেলে PATH-এর `zcode` ব্যবহার করা হয়। |
| `ZCODE_ARGS` | — | `open-sse/executors/zcode.ts` | `cliTools`-এর মাধ্যমে চালু করার সময় `zcode` বাইনারিতে পাঠানো অতিরিক্ত আর্গুমেন্টের JSON array (≤16টি string)। |
| `ZCODE_CWD` | `process.cwd()` | `open-sse/executors/zcode.ts` | ZCode app-server সাবপ্রসেসের কার্যকরী ডিরেক্টরি। |
| `ZCODE_PROVIDER_ID` | `builtin:zai-coding-plan` | `open-sse/executors/zcode.ts` | app-server-এ পাঠানো provider id-এর ওভাররাইড। |
| `ZCODE_SERVER_RUNTIME_ROOT` | `~/.zcode/server` | `open-sse/executors/zcode.ts` | ZCode app-server runtime-এর root (যেখানে বান্ডল করা `node` এবং `zcode-server.cjs` থাকে)। |
| `ZCODE_SERVER_NODE` | `/node` | `open-sse/executors/zcode.ts` | ZCode app-server হোস্ট করতে ব্যবহৃত Node executable। |
| `ZCODE_SERVER_ENTRY` | `/zcode-server.cjs` | `open-sse/executors/zcode.ts` | ZCode server হোস্ট করতে ব্যবহৃত app-server entry script। |
| `ZCODE_STARTUP_TIMEOUT_MS` | `10000` | `open-sse/executors/zcode.ts` | একটি ZCode app-server চালু করার প্রচেষ্টা ব্যর্থ বলে বিবেচিত হওয়ার আগের startup timeout (ms)। |
| `ZCODE_RPC_TIMEOUT_MS` | `30000` | `open-sse/executors/zcode.ts` | একটি ZCode app-server call-এর জন্য প্রতি-request RPC timeout (ms)। |
| `ZCODE_TURN_TIMEOUT_MS` | `120000` | `open-sse/executors/zcode.ts` | supervisor একটি ZCode turn-কে timeout করার আগের সর্বোচ্চ সময়কাল (ms)। |
| `ZCODE_POLL_INTERVAL_MS` | `250` | `open-sse/executors/zcode.ts` | ZCode turn সম্পন্ন হয়েছে কি না যাচাইয়ের polling interval (ms)। |
| `HERMES_HOME` | `~/.hermes` | `src/lib/cli-helper/config-generator/hermesHome.ts` | Hermes Agent-এর হোম ডিরেক্টরি, যেখানে OmniRoute Hermes CLI কনফিগ পড়ে/লেখে। এটি Windows-এ Hermes PowerShell installer যে env var সেট করে (`%LOCALAPPDATA%\hermes`), তার সঙ্গে মেলে। |
### CLI প্রোফাইল স্বয়ংক্রিয় সিঙ্ক
এই ফিচার ফ্ল্যাগগুলো অপ্ট-ইন এবং ডিফল্টভাবে বন্ধ থাকে। এগুলো
CLI Code ড্যাশবোর্ড থেকেও চালু বা বন্ধ করা যায়।
| ভেরিয়েবল | ডিফল্ট | সোর্স ফাইল | বিবরণ |
| ------------------------------------- | ------- | ------------------------------------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `OMNIROUTE_AUTO_SYNC_CODEX_PROFILES` | `false` | `src/shared/constants/featureFlagDefinitions.ts` | কোনো প্রোভাইডার মডেল সিঙ্কের পর, লাইভ ক্যাটালগ থেকে `~/.codex/*.config.toml` প্রোফাইল ফাইলগুলো স্বয়ংক্রিয়ভাবে পুনরায় লেখে। `CLI_ALLOW_CONFIG_WRITES` প্রয়োজন; সক্রিয়/ডিফল্ট Codex কনফিগ, auth, Codex-lb সেটিংস বা প্রোভাইডার নির্বাচন কখনো পরিবর্তন করে না। |
| `OMNIROUTE_AUTO_SYNC_CLAUDE_PROFILES` | `false` | `src/shared/constants/featureFlagDefinitions.ts` | কোনো প্রোভাইডার মডেল সিঙ্কের পর, লাইভ ক্যাটালগ থেকে `~/.claude/profiles//settings.json` Claude Code প্রোফাইল ফাইলগুলো স্বয়ংক্রিয়ভাবে পুনরায় লেখে। `CLI_ALLOW_CONFIG_WRITES` প্রয়োজন; সক্রিয়/ডিফল্ট Claude কনফিগ, auth বা প্রোভাইডার নির্বাচন কখনো পরিবর্তন করে না। |
### Docker উদাহরণ
```bash
# হোস্ট বাইনারিগুলো কনটেইনারে মাউন্ট করুন এবং 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-mounted
থাকে—এটিকে `~/.codex:/host-home/.codex:rw`-এর মতো মাউন্টের সঙ্গে ব্যবহার করুন (`docker-compose.yml`-এর
`host` প্রোফাইল দেখুন)। যে পাথ কনটেইনার ব্যবহারকারীর home-এর ভেতরে নয় এবং bind mount-ও নয়,
সেটি উপেক্ষা করা হয়, কারণ সেখানে লেখা ডেটা কনটেইনার পুনরায় তৈরি হলে
হারিয়ে যাবে।
ইমেজটি `USER node` হিসেবে চলে, তাই মাউন্ট না করা `/root` কোনো বৈধ
ওভাররাইড **নয়**।
| ভেরিয়েবল | ডিফল্ট | সোর্স ফাইল | বিবরণ |
| ---------------------------------------- | ---------------- | ----------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `OMNIROUTE_CONTAINER` | _(স্বয়ংক্রিয়)_ | `src/shared/utils/containerEnv.ts` | কনটেইনার শনাক্তকরণ জোরপূর্বক চালু (`1`/`true`) বা বন্ধ (`0`/`false`) করুন। কেবল সেই রানটাইমগুলোতে প্রয়োজন, যেগুলো স্বয়ংক্রিয় শনাক্তকরণে ধরা পড়ে না। |
| `OMNIROUTE_ALLOW_CONTAINER_CONFIG_WRITE` | `false` | `src/shared/services/cliRuntime.ts` | মাউন্ট না করা কনটেইনার পাথে CLI টুলের কনফিগ লেখা তবুও অনুমোদন করুন। এর CLI সমতুল্য হলো `--allow-container-write`। |
### CLI বাইনারি (`omniroute`) সহায়কসমূহ
এই ভেরিয়েবলগুলো `omniroute` CLI বাইনারির নিজস্ব আচরণ নিয়ন্ত্রণ করে (উপরের sidecar
শনাক্তকরণ নয়)।
| ভেরিয়েবল | ডিফল্ট | সোর্স ফাইল | বিবরণ |
| ---------------------------- | --------------- | --------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `OMNIROUTE_LANG` | _(সিস্টেম)_ | `bin/cli/i18n.mjs` | CLI আউটপুটের ভাষা নির্ধারণ করুন। BCP-47 লোকেল (যেমন `en`, `pt-BR`)। সিস্টেম লোকেল env var-গুলোকে (LC_ALL, LC_MESSAGES) ওভাররাইড করে। |
| `OMNIROUTE_SHOW_LOG` | _(সেট করা নেই)_ | `bin/cli/runtime/processSupervisor.mjs` | supervised মোডে সার্ভারের stdout/stderr টার্মিনালে ফরওয়ার্ড করতে `1` সেট করুন। এটি `omniroute serve`-এর `--log` ফ্ল্যাগের সমতুল্য। |
| `OMNIROUTE_CLI_TOKEN` | _(সেট করা নেই)_ | `bin/cli/api.mjs` | `x-omniroute-cli-token` হেডার হিসেবে প্রবেশ করানো machine-auth টোকেন। টাস্ক 8.12-এ স্বয়ংক্রিয়ভাবে তৈরি হয়। |
| `OMNIROUTE_HTTP_TIMEOUT_MS` | `30000` | `bin/cli/api.mjs` | CLI → সার্ভার অনুরোধের জন্য প্রতিটি প্রচেষ্টার HTTP টাইমআউট (ms)। |
| `OMNIROUTE_READY_TIMEOUT_MS` | `60000` | `bin/cli/utils/pid.mjs` | টাইমআউট সতর্কতা দেখানোর আগে CLI সার্ভারের health endpoint-এর জন্য সর্বোচ্চ যতক্ষণ (ms) অপেক্ষা করে। ধীর cold start-এর ক্ষেত্রে উপযোগী (যেমন Windows)। `--ready-timeout` দিয়েও সেট করা যায়। |
| `OMNIROUTE_VERBOSE` | `0` | `bin/cli/api.mjs` | CLI কমান্ড চলাকালে retry/backoff ডায়াগনস্টিকস stderr-এ দেখাতে `1` সেট করুন। |
| `OMNIROUTE_PLUGIN_PATH` | _(সেট করা নেই)_ | `bin/cli/plugins.mjs` | CLI প্লাগইন আবিষ্কারের জন্য কাস্টম ডিরেক্টরি (`omniroute-cmd-*` প্যাকেজ)। সেট করা না থাকলে ডিফল্ট হলো `~/.omniroute/plugins/`। শুধু CLI-এর জন্য—এটি কখনো সার্ভার-পক্ষের প্লাগইন স্ক্যানারে পৌঁছায় না, যা `OMNIROUTE_PLUGINS_DIR` (অনুচ্ছেদ 2) দ্বারা নির্দেশিত হয়। |
---
## 10. অভ্যন্তরীণ এজেন্ট ও MCP ইন্টিগ্রেশনসমূহ
| ভেরিয়েবল | ডিফল্ট | সোর্স ফাইল | বিবরণ |
| ----------------------------------------------- | --------------------------------------------------- | ----------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| `OMNIROUTE_BASE_URL` | স্বয়ংক্রিয় শনাক্তকরণ | `open-sse/mcp-server/server.ts` | MCP/A2A টুলগুলো থেকে OmniRoute-এ পৌঁছানোর জন্য সুস্পষ্ট URL। localhost-এর স্বয়ংক্রিয় শনাক্তকরণকে ওভাররাইড করে। |
| `OMNIROUTE_API_KEY` | _(সেট করা নেই)_ | MCP/A2A মডিউলসমূহ | অভ্যন্তরীণ MCP টুল ও A2A স্কিল কলের জন্য API কী। |
| `OMNIROUTE_API_KEY_ID` | _(সেট করা নেই)_ | `open-sse/mcp-server/audit.ts` | MCP অডিট লগ অ্যাট্রিবিউশনের জন্য কী ID। |
| `ROUTER_API_KEY` | _(সেট করা নেই)_ | লিগ্যাসি | `OMNIROUTE_API_KEY`-এর লিগ্যাসি উপনাম। |
| `OMNIROUTE_A2A_HISTORY_RETENTION_DAYS` | `30` | `src/lib/a2a/taskManager.ts` | দৈনিক পরিশোধন প্রক্রিয়া কোনো সারি মুছে ফেলার আগে স্থানীয় ডেটাবেসে A2A টাস্কের ইতিহাস যত দিন রাখা হবে। সেট করা না থাকলে, সংখ্যাসূচক না হলে বা `<= 0` হলে `30` ব্যবহৃত হয়। |
| `OMNIROUTE_A2A_MEMORY_HITS` | `1` | `src/lib/a2a/taskExecution.ts` | A2A memory-hits পর্যবেক্ষণযোগ্যতা ফিচারের কিল-সুইচ। কোনো টাস্কের জন্য মেমরি রিকল লুকআপ সম্পূর্ণভাবে এড়িয়ে যেতে এটি `0`-এ সেট করুন; অন্য যেকোনো মানে (সেট করা না থাকলেও) এটি সক্রিয় থাকে। |
| `OMNIROUTE_ISSUE_AGENT_ENABLED` | `false` | `src/app/api/issue-agent/runs/route.ts` | অফলাইন/স্থানীয় Issue Agent-এর রেকর্ডকৃত-ট্রায়াজ এন্ডপয়েন্ট সক্রিয় করে। স্থানীয় রেকর্ডকৃত-ট্রায়াজ ওয়ার্কফ্লো স্পষ্টভাবে চালানো না হলে এটি নিষ্ক্রিয় রাখুন। |
| `OMNIROUTE_ISSUE_AGENT_TIMEOUT_MS` | _(সেট করা নেই)_ | `src/lib/issueAgent/execution.ts` | একটি Issue Agent রেকর্ডকৃত-ট্রায়াজ রান-এর টাইমআউট (ms)। এটি একটি অভ্যন্তরীণ সর্বোচ্চ সীমায় আবদ্ধ থাকে; সেট করা না থাকলে বা অবৈধ হলে বিল্ট-ইন ডিফল্ট ব্যবহৃত হয়। |
| `OMNIROUTE_CONTEXT` | _(সক্রিয় কনটেক্সট)_ | `bin/cli/program.mjs`, `bin/cli/api.mjs` | `omniroute` কমান্ডগুলোর জন্য CLI রিমোট-মোড কনটেক্সট/প্রোফাইল; স্থানীয় কনটেক্সট স্টোরের সক্রিয় কনটেক্সটকে ওভাররাইড করে। `--context `-এর সমতুল্য। |
| `OMNIROUTE_CONTEXT_KEYCHAIN_DISABLED` | `0` | `bin/cli/contexts.mjs` | CLI কনটেক্সট ক্রেডেনশিয়ালের জন্য ঐচ্ছিক `keytar` OS-keychain ব্যাকএন্ড নিষ্ক্রিয় করে। সক্রিয় করা হলে ক্রেডেনশিয়ালগুলো `config.json`-এ `0600` মোডে থাকে এবং CLI একবারের একটি ফলব্যাক সতর্কতা দেখায়; এটি ইচ্ছাকৃত হেডলেস/কনটেইনার পরিচালনার জন্য নির্ধারিত। |
| `OMNIROUTE_MCP_ENFORCE_SCOPES` | `false` | `open-sse/mcp-server/server.ts` | MCP টুল কলে স্কোপ-ভিত্তিক অ্যাক্সেস নিয়ন্ত্রণ প্রয়োগ করে। |
| `OMNIROUTE_MCP_SCOPES` | _(সব)_ | `open-sse/mcp-server/server.ts` | কমা দিয়ে পৃথক করা স্কোপসমূহ: `admin`, `combos`, `health`, `models`, `routing`, `budget`, `metrics`, `pricing`, `memory`, `skills`। |
| `OMNIROUTE_MCP_COMPRESS_DESCRIPTIONS` | `false` | `open-sse/mcp-server/descriptionCompressor.ts` | ম্যানিফেস্ট সিরিয়ালাইজ করার আগে MCP টুলের বিবরণ কম্প্রেস করে। সক্রিয় করার মান: `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-এর অভ্যন্তরীণ ব্যবস্থাপনা রিডের (health, resilience, combos, quota, usage) জন্য বাতিলকরণ সময়সীমা (ms)। |
| `OMNIROUTE_MCP_UPSTREAM_TIMEOUT_MS` | `60000` | `open-sse/mcp-server/fetchTimeout.ts` | কোনো প্রদানকারীর জন্য অপেক্ষমাণ MCP হপগুলোর (`route_request`, `web_search`, `web_fetch`) বাতিলকরণ সময়সীমা (ms)। |
| `OMNIROUTE_CORPUS_CACHE_SIZE` | `5` | `src/lib/localCorpus/configured.ts` | মেমরিতে ক্যাশ করা স্থানীয়-কর্পাস ইনডেক্স ইনস্ট্যান্সের সর্বাধিক সংখ্যা (LRU, প্রতি ইনডেক্সকৃত রুট ডিরেক্টরিতে একটি)। সর্বনিম্ন `1`-এ সীমাবদ্ধ। |
| `MODEL_SYNC_INTERVAL_HOURS` | `24` | `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 কোটা ফেচগুলোর মধ্যবর্তী বিরতি (ms); আপস্ট্রিমে একসঙ্গে অতিরিক্ত অনুরোধ পাঠানো এড়াতে OAuth সংযোগগুলো একবারে একটি করে ফেচ করা হয়। `0` দিলে এটি নিষ্ক্রিয় হয় (সমসাময়িক)। |
| `OMNIROUTE_QUOTA_FETCH_MIN_INTERVAL_MS` | `250` | `open-sse/services/quotaFetchThrottle.ts` | প্রতি-অনুরোধ প্রিফ্লাইট/মনিটর পাথে ধারাবাহিক আপস্ট্রিম কোটা ফেচগুলোর মধ্যবর্তী সর্বনিম্ন ব্যবধান (ms); সমসাময়িক নেটওয়ার্ক কলগুলোকে ব্যবধান দিয়ে পাঠায়, যাতে একই IP-তে থাকা বহু অ্যাকাউন্ট একসঙ্গে আপস্ট্রিমে অতিরিক্ত অনুরোধ না পাঠায়। Codex (`/wham/usage`), DeepSeek, Bailian (উভয় ফেচ সাইট), OpenCode এবং Crof কোটা ফেচারে সংযুক্ত (#6009, #6911)। সাধারণ `usage.ts::getUsageForProvider` ডিসপ্যাচ পাথ (github/glm/minimax/nanogpt/xai/ইত্যাদি) এখনো এর আওতাভুক্ত নয়—আলাদাভাবে ট্র্যাক করা হচ্ছে। ক্যাশ হিট এতে প্রভাবিত হয় না। `0` দিলে নিষ্ক্রিয় হয়; `0..5000`-এর মধ্যে সীমাবদ্ধ। |
| `PROVIDER_LIMITS_POST_USAGE_REFRESH_DELAY_MS` | `5000` | `src/lib/usage/providerLimits.ts` | প্রকৃত ব্যবহার ইভেন্টের পর প্রদানকারীর সীমা রিফ্রেশ করার আগের বিলম্ব (ms), যাতে আপস্ট্রিম কোটা API-কে ব্যবহার নিবন্ধনের সময় দেওয়া যায়। |
| `OMNIROUTE_LOGIN_BROWSER_PATH` | স্বয়ংক্রিয় শনাক্তকরণ | `open-sse/services/adobeFireflyBrowserLogin.ts` | ইন্টার্যাক্টিভ Adobe Firefly সাইন-ইন এবং অফ-স্ক্রিন নবায়নের জন্য ব্যবহৃত সিস্টেম Chrome বা Edge এক্সিকিউটেবলের পরম পাথ। |
| `ADOBE_FIREFLY_BROWSER_REFRESH` | সক্রিয় | `open-sse/services/adobeFireflySession.ts` | অ্যাকাউন্ট-স্কোপড Chrome CDP সেশনের মাধ্যমে IMS এবং ব্রাউজার-ঝুঁকি অবস্থা হালনাগাদ রাখে। ব্রাউজার নবায়ন নিষ্ক্রিয় করতে `0` সেট করুন। |
| `ADOBE_FIREFLY_SESSION_DISK` | সক্রিয় | `open-sse/services/adobeFireflySession.ts` | প্রক্রিয়া পুনরারম্ভের পরও ব্যবহারের জন্য মেরামত করা Adobe সেশনগুলো `DATA_DIR`-এর অধীনে সংরক্ষণ করে। সেশনগুলো শুধু মেমরিতে রাখতে `0` সেট করুন। |
| `ADOBE_FIREFLY_MIN_SUBMIT_GAP_MS` | `12000` | `open-sse/services/adobeFireflySession.ts` | Adobe Firefly জেনারেট সাবমিশনগুলোর মধ্যবর্তী সর্বনিম্ন ব্যবধান, মিলিসেকেন্ডে; `0` দিলে ব্যবধান নিষ্ক্রিয় হয়। |
| `ADOBE_FIREFLY_BATCH_EXTRA_GAP_MS` | `15000` | `open-sse/services/adobeFireflySession.ts` | প্রতি তৃতীয় সফল Adobe সাবমিশনের পর মিলিসেকেন্ডে অতিরিক্ত নীরব সময়কাল। |
| `ADOBE_FIREFLY_SUBMIT_BASE_DELAY_MS` | `8000` | `open-sse/services/adobeFireflyClient.ts` | Adobe-এর ক্ষণস্থায়ী 408 প্রতিক্রিয়ার পর মিলিসেকেন্ডে বেস ব্যাকঅফ; সর্বাধিক পাঁচটি প্রচেষ্টা পর্যন্ত সাবমিশন ব্যবধানের সঙ্গে সমন্বিত। |
| `OMNIROUTE_DISABLE_BACKGROUND_SERVICES` | `false` | `src/instrumentation-node.ts` | সব ব্যাকগ্রাউন্ড সার্ভিস (সিঙ্ক, প্রাইসিং, মডেল রিফ্রেশ) নিষ্ক্রিয় করুন। CI/টেস্টের জন্য উপযোগী। |
| `OMNIROUTE_ENABLE_RUNTIME_BACKGROUND_TASKS` | _(সেট করা নেই)_ | `src/lib/config/runtimeSettings.ts` | স্বয়ংক্রিয় টেস্ট শনাক্তকরণের মধ্যেও ব্যাকগ্রাউন্ড টাস্ক চালু করতে বাধ্য করুন। টেস্ট হিউরিস্টিক ওভাররাইড করতে `1` সেট করুন। |
| `OMNIROUTE_BUDGET_RESET_JOB_INTERVAL_MS` | `600000` | `src/lib/jobs/budgetResetJob.ts` | বাজেট রিসেট পরীক্ষার বিরতি (ms)। সর্বনিম্ন `10000`। |
| `OMNIROUTE_CONNECTION_RECOVERY_INTERVAL_MS` | `60000` | `src/lib/quota/connectionRecovery.ts` | সক্রিয় সংযোগ-কুলডাউন পুনরুদ্ধারের বিরতি (ms): যেসব সংযোগের সাময়িক `rate_limited_until` অতিক্রান্ত হয়েছে, সেগুলোকে অনুরোধের হট পাথের বাইরে পুনরায় যাচাই করে। সর্বনিম্ন `5000`। |
| `OMNIROUTE_DISABLE_CONNECTION_RECOVERY` | `false` | `src/lib/quota/connectionRecovery.ts` | সক্রিয় সংযোগ-কুলডাউন পুনরুদ্ধার শিডিউলার নিষ্ক্রিয় করুন (`getProviderCredentials`-এ অলস পুনরুদ্ধার তবুও প্রযোজ্য থাকবে)। |
| `OMNIROUTE_REASONING_CACHE_CLEANUP_INTERVAL_MS` | `1800000` | `src/lib/jobs/reasoningCacheCleanupJob.ts` | রিজনিং ক্যাশ পরিষ্কারের বিরতি (ms)। সর্বনিম্ন `60000`। |
| `OMNIROUTE_REASONING_MIN_BUDGET` | _অনির্ধারিত_ (নিষ্ক্রিয়) | `open-sse/services/reasoningTokenBuffer.ts` | থিংকিং-মডেলের আউটপুট বাজেটের জন্য ঐচ্ছিক সর্বনিম্ন সীমা: কলারের `max_tokens` যদি `[256, floor)` সীমার মধ্যে থাকে, তবে সেটি সর্বনিম্ন সীমায় উন্নীত হয় (মডেলের আউটপুট সীমা দ্বারা সীমাবদ্ধ)। অনির্ধারিত = ক্লায়েন্টের বাজেট কখনো বাড়ানো হয় না (#9507)। |
| `OMNIROUTE_LOG_EXPORT_CRON` | `0 * * * *` | `src/lib/jobs/logExportJob.ts` | প্রতিটি সক্রিয় লগ-এক্সপোর্ট গন্তব্য খালি করে এমন কল-লগ এক্সপোর্ট কাজের Cron এক্সপ্রেশন (UTC)। |
| `OMNIROUTE_CONFIG_HOT_RELOAD_MS` | `5000` | `src/lib/config/hotReload.ts` | কনফিগ হট-রিলোডের পোলিং বিরতি (ms)। `1000`-এর কম মান প্রত্যাখ্যান করা হয়। |
| `OMNIROUTE_DISABLE_REDIS_AUTH_CACHE` | _(সক্রিয়)_ | `src/lib/db/apiKeys.ts` | Redis-সমর্থিত API-key প্রমাণীকরণ ক্যাশ এড়িয়ে যেতে `1` সেট করুন (DB রিড বাধ্যতামূলক করে)। |
| `OMNIROUTE_RTK_TRUST_PROJECT_FILTERS` | `0` | `open-sse/services/compression/engines/rtk/filterLoader.ts` | কঠোর স্বাক্ষর যাচাই ছাড়াই ব্যবহারকারী-পরিচালিত RTK প্রকল্প ফিল্টারের নিয়মগুলোকে বিশ্বাস করুন। |
| `OMNIROUTE_LITE_MAX_TOOL_LENGTH` | `2000` | `open-sse/services/compression/lite.ts` | `lite.maxToolLength` অনির্ধারিত থাকলে Lite-এর সক্রিয় টুল-ফলাফল ছাঁটাইয়ের অক্ষরসীমা। পরিসর 256–1000000। এই env-এর চেয়ে ড্যাশবোর্ড সেটিং অগ্রাধিকার পায়। |
| `OMNI_COMPRESSION_WORKERS` | `2` | `open-sse/services/compression/compressionWorkerPool.ts` | একই সময়ে চলা সমকালীন RTK/Caveman ওয়ার্কারের সর্বোচ্চ সংখ্যা; অতিরিক্ত কাজগুলো FIFO ক্রমে অপেক্ষা করে। |
| `OMNI_COMPRESSION_WORKER_TIMEOUT_MS` | `120000` | `open-sse/services/compression/compressionWorkerPool.ts` | প্রতিটি কাজের সময়সীমা মিলিসেকেন্ডে। সময়সীমা অতিক্রম করা ওয়ার্কার বন্ধ করে দেওয়া হয় এবং অনুরোধটি অপরিবর্তিত অবস্থায় ফেইল-ওপেন করে। |
| `OMNI_COMPRESSION_WORKER_IDLE_MS` | `60000` | `open-sse/services/compression/compressionWorkerPool.ts` | অব্যবহৃত কম্প্রেশন ওয়ার্কার বন্ধ করার আগের নিষ্ক্রিয় জীবনকাল, মিলিসেকেন্ডে। |
| `COMPRESSION_PIPELINE_BREAKER_ENABLED` | `false` | `open-sse/services/compression/pipelineEngineBreaker.ts` | T02 স্ট্যাকড-পাইপলাইনের প্রতি-ইঞ্জিন সার্কিট-ব্রেকারের প্রধান সুইচ। **ঐচ্ছিক (ডিফল্টভাবে বন্ধ)** — চালু থাকলে, বিভিন্ন অনুরোধে বারবার ব্যতিক্রম ঘটানো ইঞ্জিনকে কুলডাউনের জন্য এড়িয়ে যাওয়া হয় (ফেইল-ওপেন); বন্ধ = বাইট-অভিন্ন পুরোনো আচরণ। |
| `COMPRESSION_PIPELINE_BREAKER_THRESHOLD` | `3` | `open-sse/services/compression/pipelineEngineBreaker.ts` | কোনো ইঞ্জিনের ব্রেকার খোলার আগে বিভিন্ন অনুরোধে পরপর ব্যর্থতার সংখ্যা। |
| `COMPRESSION_PIPELINE_BREAKER_COOLDOWN_MS` | `30000` | `open-sse/services/compression/pipelineEngineBreaker.ts` | হাফ-ওপেন পরীক্ষার আগে খোলা কোনো ইঞ্জিনকে যত মিলিসেকেন্ড এড়িয়ে যাওয়া হবে। |
| `COMPRESSION_CCR_RETRIEVAL_RAMP_FACTOR` | `2` | `open-sse/services/compression/engines/ccr/index.ts` | T08/H8 CCR পুনরুদ্ধার-প্রতিক্রিয়া র্যাম্প: সংরক্ষিত কোনো ব্লকের প্রতিটি পূর্ববর্তী পুনরুদ্ধার তার কার্যকর `minChars` সরলরৈখিকভাবে বাড়ায় (ঘন ঘন পুনরুদ্ধার করা কনটেন্ট কম সংকুচিত হয়; `>=3`টি পুনরুদ্ধার = কখনো সংকুচিত হয় না)। `1` র্যাম্প নিষ্ক্রিয় করে (শুধু থ্রেশহোল্ডে বাইনারি স্কিপ)। |
| `COMPRESSION_CCR_DURABLE_STORE` | `true` | `open-sse/services/compression/engines/ccr/index.ts` | CCR টেকসই ব্লক স্টোর (#9061)। ইন-মেমরি স্টোরটিকে SQLite দিয়ে ব্যাক করে, যাতে কোনো ব্লক LRU উচ্ছেদ, TTL, রিস্টার্ট অথবা অন্য ইনস্ট্যান্সে পৌঁছানো কোনো রিট্রিভের পরেও টিকে থাকে। ব্লকগুলোকে শুধু মেমরিতে রাখতে `false` সেট করুন। 512KB-এর বেশি আকারের ব্লক এবং ক্লাউড রানটাইম নির্বিশেষে শুধু মেমরিতেই থাকে। |
| `COMPRESSION_PREFIX_FREEZE_ENABLED` | `false` | `open-sse/services/compression/prefixFreeze.ts` | T08/H5 ব্যবহার-পর্যবেক্ষিত প্রিফিক্স ফ্রিজের মাস্টার সুইচ। **অপ্ট-ইন (ডিফল্টভাবে বন্ধ)** — চালু থাকলে, থ্রেশহোল্ডের `>=` বার পর্যবেক্ষিত কোনো সিস্টেম প্রম্পটকে স্থিতিশীল ক্যাশযোগ্য প্রিফিক্স হিসেবে বিবেচনা করা হয় এবং স্ট্যাটিক ক্যাশ হিউরিস্টিক যেসব প্রোভাইডারকে শনাক্ত করতে পারে না, তাদের ক্ষেত্রেও কম্প্রেশন থেকে সংরক্ষণ করা হয় (ফ্রিজ কেবল _সংরক্ষণ_ করে, কখনো পরিবর্তন করে না)। |
| `COMPRESSION_PREFIX_FREEZE_THRESHOLD` | `3` | `open-sse/services/compression/prefixFreeze.ts` | কোনো সিস্টেম প্রম্পটকে ফ্রোজেন স্থিতিশীল প্রিফিক্স হিসেবে বিবেচনা করার আগে সেটির প্রয়োজনীয় পর্যবেক্ষণসংখ্যা। |
| `OMNIROUTE_BOOTSTRAPPED` | `false` | `src/app/(dashboard)/dashboard/page.tsx` | প্রাথমিক সেটআপের পরে bootstrap স্ক্রিপ্ট দ্বারা `true` সেট করা হয়। সেটআপ উইজার্ডের দৃশ্যমানতা নিয়ন্ত্রণ করে। |
| `OMNIROUTE_ALLOW_BODY_PROJECT_OVERRIDE` | `0` | `open-sse/executors/antigravity.ts` | বিকল্প ব্যবস্থা: রিকোয়েস্ট বডিকে Antigravity প্রজেক্ট ফিল্ড ওভাররাইড করার অনুমতি দেয়। |
| `ANTIGRAVITY_CREDITS` | `off` | `open-sse/services/antigravityCredits.ts` | Google One AI ক্রেডিট নীতি: `off` কখনো ক্রেডিট ইনজেক্ট করে না, `retry` উপযুক্ত কোটা 429-এর পরে একবার ইনজেক্ট করে এবং `always` প্রথম রিকোয়েস্টেই ইনজেক্ট করে। |
| `ANTIGRAVITY_ALLOW_SIGNATURE_BYPASS` | `0` | `open-sse/translator/request/openai-to-gemini.ts` | আপস্ট্রিম প্রকৃত সিগনেচার প্রত্যাখ্যান করলে Antigravity রিকোয়েস্ট ট্রান্সলেটরকে তার কঠোর CLI রিকোয়েস্ট-সিগনেচার যাচাইকরণ এড়িয়ে যাওয়ার অনুমতি দেয় (ডিবাগ/পুরোনো-CLI মোড)। শূন্য ছাড়া অন্য মান বাইপাসটি সক্রিয় করে। |
| `AGY_TOKEN_FILE` | `~/.gemini/antigravity-cli/antigravity-oauth-token` | `src/app/api/providers/agy-auth/apply-local/route.ts` | স্বয়ংক্রিয়ভাবে শনাক্ত করা লোকাল লগইন ইমপোর্টের জন্য Antigravity CLI (agy) token-file পাথ ওভাররাইড করে। |
### OAuth CLI ব্রিজ (অভ্যন্তরীণ)
| ভেরিয়েবল | ডিফল্ট | সোর্স ফাইল | বিবরণ |
| ------------------- | ---------------------- | ------------------------------- | -------------------------------------- |
| `OMNIROUTE_SERVER` | স্বয়ংক্রিয় শনাক্তকরণ | `src/lib/oauth/config/index.ts` | CLI↔OmniRoute অথ ব্রিজের সার্ভার URL। |
| `OMNIROUTE_TOKEN` | _(সেট করা নেই)_ | `src/lib/oauth/config/index.ts` | CLI ব্রিজের অথ টোকেন। |
| `OMNIROUTE_USER_ID` | `cli` | `src/lib/oauth/config/index.ts` | CLI ব্রিজ সেশনের ইউজার ID। |
| `SERVER_URL` | _(সেট করা নেই)_ | `src/lib/oauth/config/index.ts` | `OMNIROUTE_SERVER`-এর লিগ্যাসি উপনাম। |
| `CLI_TOKEN` | _(সেট করা নেই)_ | `src/lib/oauth/config/index.ts` | `OMNIROUTE_TOKEN`-এর লিগ্যাসি উপনাম। |
| `CLI_USER_ID` | _(সেট করা নেই)_ | `src/lib/oauth/config/index.ts` | `OMNIROUTE_USER_ID`-এর লিগ্যাসি উপনাম। |
---
## 11. OAuth প্রদানকারীর শংসাপত্র
**localhost ডেভেলপমেন্টের** জন্য বিল্ট-ইন শংসাপত্র। রিমোট ডিপ্লয়মেন্টের জন্য, প্রতিটি প্রদানকারীর ডেভেলপার কনসোলে আপনার নিজস্ব শংসাপত্র নিবন্ধন করুন।
| ভেরিয়েবল | প্রদানকারী | নোট |
| ------------------------------------------- | ----------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `CLAUDE_OAUTH_CLIENT_ID` | Claude Code (Anthropic) | পাবলিক ক্লায়েন্ট — কোনো সিক্রেটের প্রয়োজন নেই। |
| `CLAUDE_CODE_REDIRECT_URI` | Claude Code | রিডাইরেক্ট URI ওভাররাইড করে। ডিফল্ট: `https://platform.claude.com/oauth/code/callback` |
| `CODEX_OAUTH_CLIENT_ID` | Codex / OpenAI | পাবলিক ক্লায়েন্ট। |
| `GEMINI_OAUTH_CLIENT_ID` | Gemini (Google) | সামঞ্জস্যপূর্ণ `_SECRET` প্রয়োজন। |
| `GEMINI_OAUTH_CLIENT_SECRET` | Gemini (Google) | — |
| `KIMI_CODING_OAUTH_CLIENT_ID` | Kimi Coding (Moonshot) | পাবলিক ক্লায়েন্ট। |
| `MUSE_CODE_OAUTH_CLIENT_ID` | Muse Code (Meta) | পাবলিক Muse CLI ডিভাইস-ফ্লো ক্লায়েন্ট ID-এর জন্য ঐচ্ছিক ওভাররাইড। বিল্ট-ইন পাবলিক ক্লায়েন্ট ব্যবহার করতে এটি সেট না করে রাখুন। |
| `ANTIGRAVITY_OAUTH_CLIENT_ID` | Antigravity (Google) | সামঞ্জস্যপূর্ণ `_SECRET` প্রয়োজন। |
| `ANTIGRAVITY_OAUTH_CLIENT_SECRET` | Antigravity (Google) | — |
| `GITHUB_OAUTH_CLIENT_ID` | GitHub Copilot | পাবলিক ক্লায়েন্ট। |
| `GHE_COPILOT_OAUTH_CLIENT_ID` | GHE Copilot | GitHub Enterprise Copilot-এর OAuth ক্লায়েন্ট ID-এর জন্য ঐচ্ছিক ওভাররাইড। সেট করা না থাকলে `GITHUB_OAUTH_CLIENT_ID`-এর পাবলিক ডিফল্ট ব্যবহার করা হয়। |
| `COPILOT_INTEGRATION_ID` | GitHub Copilot | `Copilot-Integration-Id` এবং `Editor-Plugin-Version` হেডারে পাঠানো GitHub Copilot ক্লায়েন্ট ইন্টিগ্রেশন ID-এর জন্য ঐচ্ছিক ওভাররাইড। ডিফল্ট হলো `copilot-developer-cli`। |
| `WINDSURF_API_KEY` | Windsurf / Devin (v3.8) | প্রতি-সংযোগের শংসাপত্র উপলভ্য না থাকলে `open-sse/executors/devin-cli.ts` দ্বারা ব্যবহৃত API কী ফলব্যাক। ঐচ্ছিক। |
| `CLI_DEVIN_BIN` | Devin CLI (v3.8) | Devin CLI বাইনারির (`devin`) কাস্টম পাথ। `open-sse/executors/devin-cli.ts` দ্বারা নির্ধারিত হয়। |
| `GITLAB_DUO_OAUTH_CLIENT_ID` | GitLab Duo (v3.8) | GitLab Duo-এর জন্য OAuth ক্লায়েন্ট ID। `https://gitlab.com/-/profile/applications`-এ রিডাইরেক্ট URI `/callback` এবং `api, read_user, openid, profile, email` স্কোপসহ একটি অ্যাপ নিবন্ধন করুন। ফলব্যাক হিসেবে `GITLAB_OAUTH_CLIENT_ID` ব্যবহৃত হয়। |
| `GITLAB_DUO_OAUTH_CLIENT_SECRET` | GitLab Duo (v3.8) | GitLab Duo-এর জন্য OAuth ক্লায়েন্ট সিক্রেট। ঐচ্ছিক — PKCE ফ্লোতে কোনো সিক্রেটের প্রয়োজন হয় না। ফলব্যাক হিসেবে `GITLAB_OAUTH_CLIENT_SECRET` ব্যবহৃত হয়। |
| `GITLAB_DUO_BASE_URL` | GitLab Duo (v3.8) | GitLab বেস URL (স্ব-হোস্টেড 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) | `src/lib/oauth/constants/oauth.ts` দ্বারা ব্যবহৃত `GITLAB_DUO_OAUTH_CLIENT_ID`-এর জন্য লিগ্যাসি ফলব্যাক। |
| `GITLAB_OAUTH_CLIENT_SECRET` | GitLab Duo (v3.8) | `src/lib/oauth/constants/oauth.ts` দ্বারা ব্যবহৃত `GITLAB_DUO_OAUTH_CLIENT_SECRET`-এর জন্য লিগ্যাসি ফলব্যাক। |
| `QODER_OAUTH_CLIENT_SECRET` | Qoder | — |
| `QODER_OAUTH_AUTHORIZE_URL` | Qoder | Qoder OAuth সক্রিয় করতে সেট করুন। |
| `QODER_OAUTH_TOKEN_URL` | Qoder | — |
| `QODER_OAUTH_USERINFO_URL` | Qoder | — |
| `QODER_OAUTH_CLIENT_ID` | Qoder | — |
| `QODER_PERSONAL_ACCESS_TOKEN` | Qoder | সরাসরি API কী ফলব্যাক (OAuth বাইপাস করে)। |
| `QODER_CLI_WORKSPACE` | Qoder | Qoder CLI-এর ওয়ার্কস্পেস ID। |
| `OMNIROUTE_QODER_WORKSPACE` | Qoder | `QODER_CLI_WORKSPACE`-এর উপনাম। |
| `QODER_CLI_CONFIG_DIR` | Qoder | Qoder CLI কনফিগারেশন ডিরেক্টরি ওভাররাইড করে (বিচ্ছিন্ন PAT সেশন, ব্রাউজার লগইন ওভাররাইট হওয়া এড়ায়)। |
| `BLACKBOX_WEB_VALIDATED_TOKEN` | Blackbox Web | `/api/chat`-এ `validated` হিসেবে পাঠানোর জন্য ফ্রন্টএন্ড `tk` টোকেন। Blackbox টোকেন মেলানো বাধ্যতামূলক করলে এটি প্রয়োজন; অন্যথায় OmniRoute একটি র্যান্ডম UUID ফলব্যাক হিসেবে ব্যবহার করে। ইস্যু #2252 দেখুন। |
| `VISION_BRIDGE_BASE_URL` | Vision Bridge গার্ডরেল | নন-Anthropic vision-bridge কলের জন্য OpenAI-সামঞ্জস্যপূর্ণ বেস URL। ডিফল্ট হিসেবে লিগ্যাসি OpenAI URL env বা api.openai.com ব্যবহৃত হয়। এটিকে OmniRoute-এর `/v1` সেলফ-লুপ বা যেকোনো OpenAI-সামঞ্জস্যপূর্ণ এন্ডপয়েন্টের (Gemini OpenAI-compat, OpenRouter) দিকে নির্দেশ করুন। ইস্যু #2232। URL-টি OmniRoute-এর নিজস্ব `/v1` হলে, describe সাব-রিকোয়েস্টটি `x-omniroute-admission-bypass: internal` পাঠায় এবং সমাধান করা সেলফ-লুপ ক্রেডেনশিয়াল দিয়ে প্রমাণীকরণ করে (লোকাল মোডে `sk_omniroute` সেন্টিনেল, অথবা `OMNIROUTE_API_KEY` / `ROUTER_API_KEY` — #1350), যাতে `REQUIRE_API_KEY=true` ডিপ্লয়মেন্ট কাজ করে। |
| `VISION_BRIDGE_API_KEY` | Vision Bridge গার্ডরেল | ওপরের URL-এর জন্য API কী। নন-Anthropic vision-bridge কলের ক্ষেত্রে প্রতি-প্রোভাইডার OpenAI / Google env ভ্যারিয়েবল ওভাররাইড করে। Anthropic মডেলগুলো তাদের নিবেদিত Anthropic কী পাথ ব্যবহার করে। ইস্যু #2232। |
| `OMNIROUTE_VISION_BRIDGE_NEGATIVE_CACHE_MS` | Vision Bridge গার্ডরেল | একটি "কোনো ব্যবহারযোগ্য প্রার্থী নেই" রাউটিং ফলাফল কতক্ষণ ক্যাশে রাখা হবে, মিলিসেকেন্ডে (ডিফল্ট `30000`)। অবৈধ বা ঋণাত্মক মানের ক্ষেত্রে ডিফল্ট মান ব্যবহৃত হয়; `0` নেগেটিভ ক্যাশ নিষ্ক্রিয় করে। উৎস: `src/lib/guardrails/visionBridgeRouter.ts`। |
> [!WARNING]
>
> 1. [Google Cloud Console → Credentials](https://console.cloud.google.com/apis/credentials)-এ যান
> 2. একটি OAuth 2.0 Client ID তৈরি করুন (ধরন: "Web application")
> 3. Authorized redirect URI হিসেবে আপনার সার্ভারের URL যোগ করুন
> 4. `.env`-এ ক্রেডেনশিয়ালের মানগুলো প্রতিস্থাপন করুন।
---
## 12. প্রোভাইডার User-Agent ওভাররাইড
প্রতিটি আপস্ট্রিম প্রোভাইডারে পাঠানো `User-Agent` হেডার ওভাররাইড করুন। এটি executor base class দ্বারা রানটাইমে ডায়নামিকভাবে নির্ধারিত হয়:
```
process.env[`${PROVIDER_ID}_USER_AGENT`]
```
> **উৎস:** `open-sse/executors/base.ts` → `buildHeaders()`
| ভেরিয়েবল | ডিফল্ট মান | কখন আপডেট করবেন |
| -------------------------------- | --------------------------------------------- | ------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| `CLAUDE_USER_AGENT` | `claude-cli/2.1.258 (external, cli)` | Anthropic যখন নতুন CLI সংস্করণ প্রকাশ করে |
| `CLAUDE_DISABLE_TOOL_NAME_CLOAK` | `false` | `executors/base.ts` + `executors/cliproxyapi.ts` | Anthropic-গামী উভয় পথে (নেটিভ OAuth এবং CLIProxyAPI) তৃতীয়-পক্ষের harness-এর টুলের নাম অপরিবর্তিতভাবে Anthropic-এ ফরওয়ার্ড করতে `1`/`true` সেট করুন। ডিফল্টভাবে executor নন-Claude-Code টুলের নাম নির্ধারিত নিয়মে alias করে (যেখানে Claude Code-এর canonical mapping রয়েছে সেখানে সেটি, অন্যথায় PascalCase) এবং `_toolNameMap`-এর মাধ্যমে response-এ সেগুলোকে আগের অবস্থায় ফিরিয়ে আনে, যাতে snake_case টুলসহ harness-গুলো fingerprint করা তৃতীয়-পক্ষের client হিসেবে প্রত্যাখ্যাত না হয়। শুধুমাত্র debugging-এর জন্য। |
| `CODEX_USER_AGENT` | `codex-cli/0.155.0 (Windows 10.0.26200; x64)` | OpenAI যখন Codex CLI আপডেট করে |
| `CODEX_CLIENT_VERSION` | `0.155.0` | সম্পূর্ণ UA string থেকে আলাদাভাবে Codex client version ওভাররাইড করুন |
| `CLAUDE_CODE_CLIENT_VERSION` | `2.1.258` | `CLAUDE_USER_AGENT` থেকে আলাদাভাবে প্রকাশিত Claude Code version ওভাররাইড করুন। Anthropic এই মানের ভিত্তিতে কিছু model-এর ব্যবহার নিয়ন্ত্রণ করে (#12417)। |
| `GITHUB_COPILOT_CLI_VERSION` | `1.0.81-6` | `GITHUB_USER_AGENT` থেকে আলাদাভাবে প্রকাশিত Copilot CLI version ওভাররাইড করুন |
| `GITHUB_USER_AGENT` | `GitHubCopilotChat/0.54.0` | GitHub Copilot Chat আপডেট হলে |
| `ANTIGRAVITY_USER_AGENT` | `antigravity/2.0.1 darwin/arm64` | Antigravity IDE আপডেট হলে |
| `KIRO_USER_AGENT` | `AWS-SDK-JS/3.0.0 kiro-ide/1.0.0` | Kiro IDE আপডেট হলে |
| `KIRO_OAUTH_CLIENT_ID` | `kiro-cli` | Kiro social device-code-এর `clientId` (public id) ওভাররাইড করুন |
| `KIRO_VERIFY_FULL_CRC` | `false` | ঐচ্ছিকভাবে সক্রিয় করুন: Kiro event stream-এ প্রতিটি frame-এর সম্পূর্ণ message CRC validation (corrupted stream debug করতে) |
| `QODER_USER_AGENT` | `Qoder-Cli` | Qoder CLI আপডেট হলে |
| `CURSOR_USER_AGENT` | `Cursor/3.3` | Cursor আপডেট হলে |
> [!TIP]
> `{PROVIDER_ID}_USER_AGENT` প্যাটার্ন ব্যবহার করে আপনি **যেকোনো** প্রোভাইডারের জন্য User-Agent ওভাররাইড যোগ করতে পারেন। executor ডায়নামিকভাবে env var-এর নাম তৈরি করে।
---
## 13. CLI ফিঙ্গারপ্রিন্ট সামঞ্জস্যতা
সক্রিয় করা হলে, OmniRoute অফিসিয়াল CLI টুলগুলোর নির্ভুল স্বাক্ষরের সঙ্গে মিল রাখতে HTTP হেডার এবং JSON বডির ফিল্ডগুলো পুনর্বিন্যাস করে। এটি আপনার প্রক্সি IP অপরিবর্তিত রেখে অ্যাকাউন্ট ফ্ল্যাগ হওয়ার ঝুঁকি কমায়।
**উৎস:** `open-sse/config/cliFingerprints.ts`, `open-sse/executors/base.ts`
### প্রদানকারীবিশেষ
| ভেরিয়েবল | সক্রিয়করণ | প্রভাব |
| ------------------------ | ---------- | ------------------------------------------- |
| `CLI_COMPAT_CODEX` | `=1` | Codex CLI অনুরোধের স্বাক্ষর অনুকরণ করে |
| `CLI_COMPAT_CLAUDE` | `=1` | Claude Code অনুরোধের স্বাক্ষর অনুকরণ করে |
| `CLI_COMPAT_GITHUB` | `=1` | GitHub Copilot অনুরোধের স্বাক্ষর অনুকরণ করে |
| `CLI_COMPAT_ANTIGRAVITY` | `=1` | Antigravity অনুরোধের স্বাক্ষর অনুকরণ করে |
| `CLI_COMPAT_CURSOR` | `=1` | Cursor অনুরোধের স্বাক্ষর অনুকরণ করে |
| `CLI_COMPAT_KIMI_CODING` | `=1` | Kimi Coding অনুরোধের স্বাক্ষর অনুকরণ করে |
| `CLI_COMPAT_KILOCODE` | `=1` | Kilo Code অনুরোধের স্বাক্ষর অনুকরণ করে |
| `CLI_COMPAT_CLINE` | `=1` | Cline অনুরোধের স্বাক্ষর অনুকরণ করে |
### বৈশ্বিক
| ভেরিয়েবল | সক্রিয়করণ | প্রভাব |
| ---------------- | ---------- | ------------------------------------------------------------------------- |
| `CLI_COMPAT_ALL` | `=1` | একই সঙ্গে **সব** প্রদানকারীর জন্য ফিঙ্গারপ্রিন্ট সামঞ্জস্যতা সক্রিয় করে। |
### Kimi Coding CLI পরিচয় ওভাররাইড
| ভেরিয়েবল | ডিফল্ট | উৎস ফাইল | বিবরণ |
| ----------------------- | ------------------ | ---------------------------------------- | -------------------------------------------------------------- |
| `KIMI_CLI_VERSION` | `1.36.0` | `src/lib/oauth/providers/kimi-coding.ts` | OAuth/API কলের সময় পাঠানো Kimi CLI সংস্করণ ওভাররাইড করে। |
| `KIMI_CODING_DEVICE_ID` | _(ধারণকৃত ডিফল্ট)_ | `src/lib/oauth/providers/kimi-coding.ts` | ক্লায়েন্ট হেডারে ব্যবহৃত ধারণকৃত Kimi ডিভাইস ID ওভাররাইড করে। |
> [!NOTE]
> এই সুবিধাটি User-Agent ওভাররাইডের (§12) পাশাপাশি কাজ করে। ফিঙ্গারপ্রিন্ট সিস্টেম হেডার ও বডি ফিল্ডের ক্রম নিয়ন্ত্রণ করে, আর User-Agent ওভাররাইড নির্দিষ্ট UA স্ট্রিং নিয়ন্ত্রণ করে। দুটিই স্বাধীনভাবে সক্রিয় করা যায়।
---
## 14. API কী প্রদানকারী
সরাসরি প্রমাণীকরণ ব্যবহারকারী প্রদানকারীদের API কী। **পছন্দের সেটআপ:** ড্যাশবোর্ড → প্রদানকারী → API কী যোগ করুন।
Docker বা হেডলেস ডিপ্লয়মেন্টের বিকল্প হিসেবে এনভায়রনমেন্ট ভেরিয়েবলের মাধ্যমে সেট করা যায়।
স্বীকৃত প্যাটার্ন: `{PROVIDER_ID}_API_KEY`
| ভেরিয়েবল | প্রদানকারী |
| ------------------ | ------------------------------------------------- |
| `DEEPSEEK_API_KEY` | DeepSeek |
| `NVIDIA_API_KEY` | NVIDIA NIM |
| `JINA_AI_API_KEY` | Jina AI (Foundation API + Reader ফলব্যাক) |
| `JINA_API_KEY` | Jina AI (`JINA_AI_API_KEY`-এর উপনাম) |
| `GEMINI_API_KEY` | Gemini (Google AI Studio) এমবেডিং + চ্যাট ফলব্যাক |
| `GOOGLE_API_KEY` | Gemini (`GEMINI_API_KEY`-এর উপনাম) |
> [!NOTE]
> Groq, xAI, Mistral, Perplexity, Together AI, Fireworks, Cerebras, Cohere, Nebius এবং Qianfan-এর স্ট্যাটিক `${PROVIDER}_API_KEY` এন্ট্রিগুলো v3.8.0-এ সরিয়ে ফেলা হয়েছে, কারণ রানটাইম আর সেগুলো পড়ে না—এই প্রদানকারীরা একচেটিয়াভাবে ড্যাশবোর্ড / `data/provider-credentials.json` / এনক্রিপ্ট করা DB-এর ওপর নির্ভর করে। মাইগ্রেশন পাথের জন্য এই নথির নিচের _অডিট: অপসারিত / অব্যবহৃত ভেরিয়েবল_ বিভাগটি দেখুন।
> [!TIP]
> ড্যাশবোর্ডের মাধ্যমে সেট করা কীগুলো SQLite-এ এনক্রিপ্ট করা অবস্থায় সংরক্ষিত হয় এবং এনভায়রনমেন্ট ভেরিয়েবলের চেয়ে অগ্রাধিকার পায়।
>
> **Jina:** কোনো ড্যাশবোর্ড `jina-ai` (অথবা শেয়ার করা `jina-reader`) সংযোগ থাকলে `jina-ai/…` এমবেডিং, রির্যাঙ্ক, শ্রেণিবিন্যাস, সেগমেন্ট এবং `jina-search` কোনো ক্লাস্টার env কী-তে বিল করে না—`getProviderCredentials` হলো fill-first। কোনো ব্যবহারযোগ্য ড্যাশবোর্ড কী না থাকলেই কেবল `JINA_AI_API_KEY` / `JINA_API_KEY` ব্যবহার করা হয়। কল লগে env ফলব্যাককে `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` উপনাম) প্রথমে ড্যাশবোর্ডের `gemini` সংযোগ ব্যবহার করে। কোনো ব্যবহারযোগ্য ড্যাশবোর্ড কী না থাকলেই কেবল `GEMINI_API_KEY` / `GOOGLE_API_KEY` ব্যবহার করা হয়। কল লগে env ফলব্যাককে `connection_id=env:GEMINI_API_KEY` হিসেবে চিহ্নিত করা হয়। নেটিভ মাল্টিমোডাল ট্রাফিক `:embedContent` / `:batchEmbedContents`-এর বিপরীতে `x-goog-api-key` ব্যবহার করে—Nটি OpenAI `input` আইটেম থেকে 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)
│ ├── FETCH_CONNECT_TIMEOUT_MS (স্বতন্ত্র, ডিফল্ট: 30000)
│ └── FETCH_KEEPALIVE_TIMEOUT_MS (স্বতন্ত্র, ডিফল্ট: 4000)
├─→ STREAM_IDLE_TIMEOUT_MS (REQUEST_TIMEOUT_MS থেকে উত্তরাধিকারসূত্রে প্রাপ্ত, ডিফল্ট: 600000)
├─→ STREAM_ACTIVE_TIMEOUT_MS (স্বতন্ত্র, ডিফল্ট: 1260000; 0 নিষ্ক্রিয় করে)
├─→ STREAM_READINESS_TIMEOUT_MS (REQUEST_TIMEOUT_MS থেকে উত্তরাধিকারসূত্রে প্রাপ্ত, ডিফল্ট: 80000)
├─→ STREAM_READINESS_MAX_TIMEOUT_MS (অভিযোজিত প্রস্তুতি এক্সটেনশনের সীমা নির্ধারণ করে, ডিফল্ট: 180000)
└─→ API_BRIDGE_PROXY_TIMEOUT_MS (REQUEST_TIMEOUT_MS থেকে উত্তরাধিকারসূত্রে প্রাপ্ত, ডিফল্ট: 30000)
├─→ API_BRIDGE_SERVER_REQUEST_TIMEOUT_MS (উদ্ভূত, ডিফল্ট: 300000)
├── API_BRIDGE_SERVER_HEADERS_TIMEOUT_MS (ডিফল্ট: 60000)
├── API_BRIDGE_SERVER_KEEPALIVE_TIMEOUT_MS (ডিফল্ট: 5000)
└── API_BRIDGE_SERVER_SOCKET_TIMEOUT_MS (ডিফল্ট: 0 = নিষ্ক্রিয়)
```
| ভেরিয়েবল | ডিফল্ট | বিবরণ |
| ----------------------------------------------- | ----------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `REQUEST_TIMEOUT_MS` | _(সেট করা নেই)_ | গ্লোবাল শর্টকাট — `FETCH_TIMEOUT_MS` এবং `STREAM_IDLE_TIMEOUT_MS` উভয়ের ডিফল্ট মান ওভাররাইড করে। |
| `FETCH_TIMEOUT_MS` | `600000` | আপস্ট্রিম প্রোভাইডার কলে মোট HTTP রিকোয়েস্ট টাইমআউট। |
| `STREAM_IDLE_TIMEOUT_MS` | `600000` | বাতিল করার আগে আপস্ট্রিমের অপরিশোধিত বাইটগুলোর মধ্যবর্তী সর্বোচ্চ নীরবতার সময়। এক্সটেন্ডেড-থিংকিং মডেলগুলো খুব কমই >90s বিরতি দেয়। |
| `STREAM_ACTIVE_TIMEOUT_MS` | `1260000` | সক্রিয় SSE স্ট্রিমের সর্বোচ্চ মোট আয়ুষ্কাল; আপস্ট্রিম বাইট এলে এটি কখনো রিসেট হয় না এবং `REQUEST_TIMEOUT_MS` থেকে স্বাধীন। রেজিস্ট্রিতে প্রতি-মডেলের বৃহত্তম `timeoutMs` (1200000, Codex)-এর সঙ্গে 60000 মার্জিন যোগ করে এটি নির্ধারিত, যাতে পূর্ণ বরাদ্দ সময় ধরে চলার অনুমতি পাওয়া কোনো মডেলকে উত্তরের মাঝপথে কখনো বন্ধ করা না হয়। নিষ্ক্রিয় করতে `0` সেট করুন। |
| `OMNIROUTE_SSE_COMMENTS` | _(নিষ্ক্রিয়)_ | OmniRoute SSE `:` মন্তব্যের লাইন (যেমন `: keepalive` হার্টবিট এবং `x-omniroute-*` মেটাডেটা ট্রেলার) নির্গত করতে পারবে কি না। ডিফল্টরূপে নিষ্ক্রিয় (#10524), কারণ কঠোর OpenAI-সামঞ্জস্যপূর্ণ ক্লায়েন্ট প্রতিটি SSE লাইনে JSON.parse চালায় এবং `:` মন্তব্যে ক্র্যাশ করে; `data:` হার্টবিট এতে প্রভাবিত হয় না। পুনরায় সক্রিয় করতে `on`/`true`/`1`/`yes` সেট করুন। `open-sse/utils/sseHeartbeat.ts` দ্বারা ব্যবহৃত। |
| `STREAM_READINESS_TIMEOUT_MS` | `80000` | প্রথম নন-পিং SSE ইভেন্ট পাওয়ার সময়সীমা। `REQUEST_TIMEOUT_MS` সেট করা থাকলে এর মান উত্তরাধিকারসূত্রে পায়। |
| `STREAM_READINESS_MAX_TIMEOUT_MS` | `180000` | বড়, টুল-নির্ভর বা উচ্চ-রিজনিং স্ট্রিমিং রিকোয়েস্টের জন্য সর্বোচ্চ অভিযোজিত প্রথম-ইভেন্ট প্রস্তুতি উইন্ডো। |
| `OMNIROUTE_AGENT_GOAL_POLICY_ENABLED` | `true` | `/goal` হিউরিস্টিকের জন্য কিল-সুইচ। শনাক্তকরণ সম্পূর্ণ নিষ্ক্রিয় করতে `false`/`0`/`off` সেট করুন — রিকোয়েস্ট বডি/হেডারের কারণে প্রস্তুতি টাইমআউট ও স্ট্রিম পুনরুদ্ধার কখনো বাড়ানো হয় না, ফলে ক্লায়েন্ট-নিয়ন্ত্রিত টাইমআউট বৃদ্ধির ঝুঁকি কমে। |
| `OMNIROUTE_AGENT_GOAL_READINESS_MAX_TIMEOUT_MS` | `600000` | শনাক্ত করা `/goal` এজেন্ট রান অথবা `x-omniroute-agent-goal` দিয়ে বাধ্য করা রিকোয়েস্টের জন্য সর্বোচ্চ প্রথম-ইভেন্ট প্রস্তুতি উইন্ডো। |
| `OMNIROUTE_AGENT_GOAL_STREAM_RECOVERY` | `true` | শনাক্ত করা `/goal` এজেন্ট রানের জন্য স্বয়ংক্রিয়ভাবে প্রারম্ভিক স্ট্রিম পুনরুদ্ধার সক্রিয় করুন। লক্ষ্য-নির্দিষ্ট অপ্ট-ইন নিষ্ক্রিয় করতে `false`/`0`/`off` সেট করুন। এটি অপারেটরের ডিফল্টের ওপর শুধু পুনরুদ্ধার যোগ করতে পারে — এটি কখনোই সুস্পষ্ট `STREAM_RECOVERY_ENABLED`/DB সেটিংসের অপ্ট-আউট ওভাররাইড করে না। |
| `OMNIROUTE_CODEX_DROP_NONSTANDARD_EVENTS` | `true` | অ-মানক `codex.*` SSE ইভেন্ট (যেমন `codex.rate_limits`) বাদ দিন, যেগুলো 502 সহ OpenAI SDK-এর `responses.stream()` নষ্ট করে। ডিফল্টরূপে চালু (#11014)। এগুলো ফরোয়ার্ড করতে `0`/`false`/`no`/`off` সেট করুন। |
| `OMNIROUTE_CODEX_APPSERVER_WS` | _(সেট করা নেই)_ | অপ্ট-ইন Codex app-server ট্রান্সপোর্ট। স্থানীয় `codex app-server` সাইডকারের WebSocket এন্ডপয়েন্ট (`ws://`/`wss://`)। টোকেনের সঙ্গে এটি সেট করা হলে Codex রিকোয়েস্টগুলো HTTP Responses API-এর পরিবর্তে JSON-RPC-এর মাধ্যমে সাইডকারে রাউট করা হয়। প্রতি সংযোগে `providerSpecificData.codexAppServerUrl`-এর মাধ্যমেও সেট করা যায়। `open-sse/executors/codex/appServerConfig.ts` দ্বারা ব্যবহৃত। |
| `OMNIROUTE_CODEX_APPSERVER_WS_TOKEN` | _(সেট করা নেই)_ | app-server-এ উপস্থাপিত ইনলাইন সক্ষমতা/বেয়ারার টোকেন। প্রতি-সংযোগ ওভাররাইড: `providerSpecificData.codexAppServerToken`। |
| `OMNIROUTE_CODEX_APPSERVER_WS_TOKEN_FILE` | _(সেট করা নেই)_ | app-server সক্ষমতা টোকেন ধারণকারী ফাইলের পাথ (`codex app-server --ws-token-file` থেকে)। `OMNIROUTE_CODEX_APPSERVER_WS_TOKEN` সেট করা না থাকলে ব্যবহৃত হয়। প্রতি-সংযোগ ওভাররাইড: `providerSpecificData.codexAppServerTokenFile`। |
| `OMNIROUTE_CODEX_APPSERVER_CWD` | `/tmp` | app-server টার্ন যে ওয়ার্কিং ডিরেক্টরিতে চলে। প্রতি-সংযোগ ওভাররাইড: `providerSpecificData.codexAppServerCwd`। |
| `OMNIROUTE_CODEX_APPSERVER_APPROVAL` | _(সেট করা নেই)_ | app-server টার্নে পাঠানো অনুমোদন নীতি (যেমন `never`, `on-request`)। প্রতি-সংযোগ ওভাররাইড: `providerSpecificData.codexAppServerApprovalPolicy`। |
| `OMNIROUTE_CODEX_APPSERVER_SANDBOX` | _(সেট করা নেই)_ | app-server টার্নে পাঠানো স্যান্ডবক্স নীতি (যেমন `read-only`, `workspace-write`, `danger-full-access`)। সেট করা না থাকলে এক্সিকিউটর ডিফল্টরূপে `workspace-write` ব্যবহার করে (সুরক্ষিত; আগে `danger-full-access` ছিল)। প্রতি-সংযোগ ওভাররাইড: `providerSpecificData.codexAppServerSandbox`। |
| `OMNIROUTE_CODEX_APPSERVER_AUTO_APPROVE` | `false` | app-server-এর নিজস্ব অনুমোদন প্রম্পটগুলো স্বয়ংক্রিয়ভাবে অনুমোদন করুন (হোস্টে কমান্ড/ফাইল/অনুমতি কার্যকর করা)। ডিফল্টরূপে বন্ধ — প্রম্পটগুলো স্বয়ংক্রিয়ভাবে প্রত্যাখ্যাত হয়; হারনেস টুল কলগুলো প্রভাবিত হয় না (সেগুলো পৃথক `item/tool/call` পাসথ্রু দিয়ে যায়)। `true`/`1`/`yes` গ্রহণ করে। প্রতি-সংযোগ ওভাররাইড: `providerSpecificData.codexAppServerAutoApprove`। |
| `FETCH_HEADERS_TIMEOUT_MS` | = `FETCH_TIMEOUT_MS` | রেসপন্স হেডার পাওয়ার সময়সীমা। |
| `OMNIROUTE_DIRECT_HEADERS_TIMEOUT_MS` | `30000` (30s) | প্রতিটি সরাসরি no-proxy প্রচেষ্টায় প্রতিক্রিয়া শুরু হওয়ার জন্য সর্বোচ্চ অপেক্ষার সময় (ms)। টাইমআউট হলে একটি নতুন socket-এ একবার পুনরায় চেষ্টা করা হয়; সীমাটি নিষ্ক্রিয় করে পূর্ববর্তী আচরণ বজায় রাখতে `0` সেট করুন। |
| `OMNIROUTE_DIRECT_RESPONSE_RETRY_TIMEOUT_MS` | `600000` (10 min) | উপরের pooled-attempt প্রতিক্রিয়া-শুরুর টাইমআউটের পর নতুন socket-এ RETRY প্রচেষ্টার সর্বোচ্চ সীমা (ms) (#13703)। এটি কেবল তখনই প্রযোজ্য, যখন caller ইতিমধ্যে নিজস্ব deadline signal সংযুক্ত করেছে (resolved connection/model/provider/`FETCH_TIMEOUT_MS` cascade); সেই signal-ই প্রকৃত সীমা এবং অভিপ্রেত পথে প্রথমে সক্রিয় হয়, তাই এটি একটি নির্দিষ্ট সর্বোচ্চ সীমার বদলে উদার backstop—এটি না থাকলে retry-টি pooled প্রচেষ্টার মতো একই সংক্ষিপ্ত `OMNIROUTE_DIRECT_HEADERS_TIMEOUT_MS` সময়সীমা পুনরায় ব্যবহার করত এবং সুস্থ কিন্তু ধীর-TTFB reasoning model-গুলোর জন্য 504 ফেরাত। উপরের নির্দিষ্ট ন্যূনতম সীমার নিচে কখনোই অনুমোদিত নয়; caller কোনো deadline signal না দিলে retry নির্দিষ্ট ন্যূনতম সীমাটি অপরিবর্তিত রাখে। |
| `FETCH_BODY_TIMEOUT_MS` | = `FETCH_TIMEOUT_MS` | সম্পূর্ণ response body গ্রহণের সময়। |
| `FETCH_CONNECT_TIMEOUT_MS` | `30000` | TCP connection স্থাপনের timeout। |
| `FETCH_KEEPALIVE_TIMEOUT_MS` | `4000` | Keep-alive socket-এর নিষ্ক্রিয়তার timeout। |
| `TLS_CLIENT_TIMEOUT_MS` | = `FETCH_TIMEOUT_MS` | TLS fingerprint proxy (wreq-js)-এর timeout। |
| `TLS_FIRST_BYTE_WATCHDOG_MS` | `10000` | বিশেষভাবে wreq-js TLS-fingerprint transport-এর body-তে time-to-first-byte সীমাবদ্ধ করে; শুধু `TLS_CLIENT_TIMEOUT_MS` স্থবির body শনাক্ত করতে পারে না, কারণ header আসামাত্রই এটি resolve হয়ে যায় (#12656)। Timeout হলে wreq reader বাতিল করা হয় এবং direct/proxy dispatcher-এ fallback করা হয়; `0` watchdog নিষ্ক্রিয় করে। |
| `RESPONSES_FIRST_BYTE_TIMEOUT_MS` | `15000` | শুধু OpenCode executor-এর জন্য এবং কেবল `OPENCODE_RESPONSES_STALL_ROTATION` feature flag চালু থাকলে (ডিফল্টভাবে বন্ধ): header আসার পর streamed Responses reply-এর প্রথম body byte-এর জন্য অপেক্ষার সীমা নির্ধারণ করে (#13484)। একটি Responses stream `response.created` দিয়ে শুরু হয়, তাই এই সময়সীমার পরও নীরবতা থাকলে সেটি stall: account-টিকে cooldown-এ রাখা হয় এবং request একবার পরবর্তী account-এ rotate করে; দ্বিতীয়বার stall হলে দ্রুত ব্যর্থ হয়। Flag চালু থাকলেও `0` guard নিষ্ক্রিয় করে। |
| `OPENCODE_PARK_AND_RESUME` | `false` | শুধু OpenCode executor-এর জন্য: বারবার transient 429 এলে (অথবা একটি নতুন pool-strain marker থাকলে) heartbeat সহ request-টি park করে, তারপর পুরো fleet-এ fan out করার বদলে ধারাবাহিকভাবে সর্বোচ্চ 3টি account নিয়ে একটি সীমাবদ্ধ leg replay করে (#13924)। ডিফল্টভাবে বন্ধ: আগের মতোই প্রতিটি 429 পরবর্তী account-এ rotate করে। |
| `OPENCODE_POOL_STRAIN_MARKER_PATH` | _(সেট করা নেই)_ | শুধু OpenCode executor-এর জন্য: park করার আগে পড়া pool-strain marker-এর path override করে (`{since, reason, ttl_s}`, ডিফল্ট `/tmp/opencode-pool-strain.json`, #13924)। নতুন marker পুনরায় গণনা না করেই park করে; marker অনুপস্থিত বা পুরোনো হলে burst counter-এ fallback করে। |
| `API_BRIDGE_PROXY_TIMEOUT_MS` | `30000` | `/v1` bridge request-এর proxy hop timeout। |
| `FIRECRAWL_BASE_URL` | `https://api.firecrawl.dev` | Firecrawl web-fetch executor-কে self-hosted instance-এ নির্দেশ করুন (off-cloud হলে API key ঐচ্ছিক)। |
| `FIRECRAWL_TIMEOUT_MS` | `30000` | Firecrawl web-fetch executor-এর প্রতিটি request-এর timeout। |
| `API_BRIDGE_SERVER_REQUEST_TIMEOUT_MS` | `300000` | Bridge-এর সামগ্রিক server request timeout। |
| `API_BRIDGE_SERVER_HEADERS_TIMEOUT_MS` | `60000` | Bridge-এর মাধ্যমে response header পাঠানোর সময়সীমা। |
| `API_BRIDGE_SERVER_KEEPALIVE_TIMEOUT_MS` | `5000` | Bridge keep-alive-এর নিষ্ক্রিয়তার timeout। |
| `API_BRIDGE_SERVER_SOCKET_TIMEOUT_MS` | `0` | Raw socket timeout (0 = নিষ্ক্রিয়)। |
| `SHUTDOWN_TIMEOUT_MS` | `30000` | জোরপূর্বক exit করার আগে SIGTERM/SIGINT-এ grace period। |
| `OMNIROUTE_DEFAULT_FETCH_TIMEOUT_MS` | `120000` | `FETCH_TIMEOUT_MS` সেট করা না থাকলে `src/shared/utils/fetchTimeout.ts`-এ ব্যবহৃত fallback। |
| `OMNIROUTE_PROVIDER_PROBE_TIMEOUT_MS` | `8000` | `src/shared/network/safeOutboundFetch.ts`-এর `validationRead` এবং `modelsProbe` preset-এর timeout (ms)। Dashboard-এ active/error অবস্থার মধ্যে বারবার পরিবর্তন ঠেকাতে ধীর endpoint-এর (Cerebras, Cloudflare AI, Groq) জন্য এটি বাড়ান। অবৈধ (<1000) বা non-numeric value-এর ক্ষেত্রে 8000ms-এ fallback করে। |
| `OMNIROUTE_RELAY_FETCH_TIMEOUT_MS` | `25000` | `open-sse/utils/proxyFetch.ts`-এ Relay-নির্দিষ্ট fetch timeout (#9158)। আটকে থাকা কোনো Relay-কে client/agent timeout-এর (~30s) আগেই ব্যর্থ হতে হবে, যাতে কলকারীরা সাধারণ upstream timeout-এর পরিবর্তে Relay-নির্দিষ্ট ব্যর্থতা দেখতে পান। এটি সর্বদা আগে কার্যকর হওয়া নিশ্চিত করতে সর্বোচ্চ `29000`-এ সীমাবদ্ধ। |
| `OMNIROUTE_RETRY_BACKOFF_MS` | `10` | `open-sse/utils/proxyFetch.ts`-এর direct/relay/proxy একবার-পুনঃচেষ্টা পথগুলোর জন্য অভিন্ন retry backoff (#9158)। `0` = অবিলম্বে পুনঃচেষ্টা। |
| `OMNIROUTE_CLAUDE_TLS_TIMEOUT_MS` | `60000` | নেটিভ wreq-js request timeout (`claudeTlsClient.ts`)। |
| `OMNIROUTE_CLAUDE_TLS_GRACE_MS` | `10000` | নেটিভ timeout-এর সঙ্গে যোগ করা চূড়ান্ত JS hard-deadline grace। |
| `OMNIROUTE_PPLX_TLS_TIMEOUT_MS` | `30000` | নেটিভ wreq-js request timeout (`perplexityTlsClient.ts`)। |
| `OMNIROUTE_PPLX_TLS_GRACE_MS` | `10000` | নেটিভ timeout-এর সঙ্গে যোগ করা চূড়ান্ত JS hard-deadline grace। |
| `OMNIROUTE_PPLX_SEARCH_HINT` | `0` (বন্ধ) | কলকারীর system message-এ "আপনার বিল্ট-ইন ওয়েব অনুসন্ধান রয়েছে। অনুসন্ধানের ফলাফল ব্যবহার করে সরাসরি প্রশ্নের উত্তর দিন।" যোগ করে (`perplexity-web/protocol.ts`)। ডিফল্টরূপে বন্ধ—Perplexity এমনিতেই অনুসন্ধান করে এবং বাক্যটি coding client-এর উত্তরে meta-commentary হিসেবে প্রকাশ হয়ে যায়। পুনরুদ্ধার করতে `1`/`true`/`yes`/`on` সেট করুন। |
| `OMNIROUTE_GROK_TLS_TIMEOUT_MS` | `60000` | নেটিভ wreq-js request timeout (`grokTlsClient.ts`)। |
| `OMNIROUTE_GROK_TLS_GRACE_MS` | `10000` | নেটিভ timeout-এর সঙ্গে যোগ করা চূড়ান্ত JS hard-deadline grace। |
| `OMNIROUTE_NOTION_TLS_TIMEOUT_MS` | `30000` | নেটিভ wreq-js request timeout (`notionTlsClient.ts`); দীর্ঘ generation-এর জন্য `notion-web` প্রতি request-এ এটিকে `180000`-এ উন্নীত করে। |
| `OMNIROUTE_NOTION_TLS_GRACE_MS` | `10000` | নেটিভ timeout-এর সঙ্গে যোগ করা চূড়ান্ত JS hard-deadline grace। |
| `OMNIROUTE_BROWSER_POOL` | `on` | browser-সমর্থিত web-cookie chat-এর জন্য অভিন্ন Playwright browser pool (`browserPool.ts`); নিষ্ক্রিয় করতে `off` সেট করুন। |
| `OBSCURA_BIN` | `auto-detect` | browser pool এবং Cloudflare Playground executor-এর প্রাথমিক engine হিসেবে ব্যবহৃত `obscura` binary-এর path (`open-sse/services/obscura.ts`); সেট করা না থাকলে system PATH থেকে স্বয়ংক্রিয়ভাবে শনাক্ত হয়। |
| `OBSCURA_CDP_ENDPOINT` | _(সেট করা নেই)_ | নতুন instance চালু করার পরিবর্তে ইতিমধ্যে চলমান Obscura (`http://host:port`)-এর দিকে নির্দেশ করুন; module-টি ওই process-এর মালিকানা নেয় না (`open-sse/services/obscura.ts`)। |
| `OBSCURA_PORT` | `এলোমেলো ফাঁকা port` | চালু করা `obscura serve`-এর জন্য সুস্পষ্ট port; সেট করা না থাকলে স্বয়ংক্রিয়ভাবে একটি ফাঁকা port বেছে নেওয়া হয় (`open-sse/services/obscura.ts`)। |
| `WEB_COOKIE_USE_BROWSER` | `0` | কোনো web-cookie chat request-কে browser-সমর্থিত পথে অন্তর্ভুক্ত করে (`browserBackedChat.ts`); সক্রিয় করতে `1`। |
| `KIMI_WEB_BASE_URL` | `https://www.kimi.ai` | Kimi Web (আন্তর্জাতিক kimi.ai Connect-RPC) executor-এর base URL (`kimi-web.ts`); শুধু mirror/proxy endpoint-এর জন্য override করুন। |
| `KIMI_WEB_CHAT_URL` | `/apiv2/kimi.gateway.chat.v1.ChatService/Chat` | Kimi Web executor-এর পূর্ণ chat endpoint (`kimi-web.ts`)। |
| `OMNIROUTE_LOGIN_BROWSER_PATH` | _(স্বয়ংক্রিয়ভাবে শনাক্ত)_ | Adobe Firefly interactive browser sign-in-এর জন্য system Chrome/Edge executable-এর path (`adobeFireflyBrowserLogin.ts`); প্রতি-OS auto-detection-কে override করে। |
| `OMNIROUTE_STANDALONE_DIR` | _.build/ standalone output_ | post-build colocation ধাপে ব্যবহৃত standalone output directory-এর জন্য build-time override (`scripts/build/colocate-standalone.mjs`); এটি build tooling-এর জন্য, runtime-এর জন্য নয়। |
Combo target-এর প্রচেষ্টাগুলো সমাধানকৃত upstream request timeout (`FETCH_TIMEOUT_MS`, অথবা
fetch-এর default সরবরাহ করলে `REQUEST_TIMEOUT_MS`) উত্তরাধিকারসূত্রে পায়। Combo,
combo default, অথবা provider override-এ `targetTimeoutMs` শুধু combo fallback দ্রুত করতে সেট করুন; বর্তমান
upstream timeout-এর চেয়ে বেশি মান upstream timeout-এ সীমাবদ্ধ হয়।
`comboTimeoutMs` হলো failover target-গুলোজুড়ে সম্পূর্ণ combo-র জন্য আলাদা wall-clock budget।
সীমাহীন iteration বজায় রাখতে এটিকে সেট না করে রাখুন অথবা `0` সেট করুন (`comboPredicates.ts`-এ
hardcoded ১০-মিনিটের hang-stop তখনও প্রযোজ্য)। একটি ধনাত্মক মান combo-র জন্য ওই
safety net প্রতিস্থাপন করে। `comboTimeoutMs`-কে `targetTimeoutMs`-এর চেয়ে দীর্ঘ রাখুন, যাতে ধীরগতির
প্রথম target-এর পরেও failover-এর জন্য সময় থাকে।
### Circuit Breaker-এর Threshold
Provider-স্তরের circuit breaker tuning। Default-গুলো v3.6 থেকে 500+ connection-এর জন্য ব্যবহৃত scaled মান প্রতিফলিত করে।
| ভেরিয়েবল | ডিফল্ট | সোর্স ফাইল | বিবরণ |
| ------------------------------------------------------------- | --------- | ------------------------------ | ----------------------------------------------------------------------------------------------------------------------------------------- |
| `OMNIROUTE_CIRCUIT_BREAKER_OAUTH_THRESHOLD` | `8` | `open-sse/config/constants.ts` | ব্রেকার ট্রিপ করার আগে OAuth প্রদানকারীদের ধারাবাহিক ব্যর্থতার সীমা। |
| `OMNIROUTE_CIRCUIT_BREAKER_OAUTH_RESET_MS` | `60000` | `open-sse/config/constants.ts` | OAuth প্রদানকারী ব্রেকারের রিসেট উইন্ডো (ms)। |
| `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` | API-key প্রদানকারী ব্রেকারের রিসেট উইন্ডো (ms)। |
| `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)। |
| `OMNIROUTE_PROVIDER_BREAKER_OAUTH_FAILURE_THRESHOLD` | `10` | `open-sse/config/constants.ts` | প্রদানকারী-স্তরের ব্রেকার: সম্পূর্ণ OAuth প্রদানকারী কুলডাউনে প্রবেশ করার আগে উইন্ডোর মধ্যে ব্যর্থতার সংখ্যা। |
| `OMNIROUTE_PROVIDER_BREAKER_OAUTH_FAILURE_WINDOW_MS` | `900000` | `open-sse/config/constants.ts` | প্রদানকারী-স্তরের ব্রেকার: OAuth প্রদানকারীদের জন্য রোলিং ব্যর্থতা-গণনা উইন্ডো (ms)। |
| `OMNIROUTE_PROVIDER_BREAKER_OAUTH_COOLDOWN_MS` | `300000` | `open-sse/config/constants.ts` | প্রদানকারী-স্তরের ব্রেকার: OAuth প্রদানকারীর সীমায় পৌঁছানোর পর কুলডাউন (ms)। |
| `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` | OAuth প্রদানকারীর সর্বোচ্চ resetTimeout বৃদ্ধির গুণক। |
| `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` | প্রদানকারী-স্তরের ব্রেকার: সম্পূর্ণ API-key প্রদানকারী কুলডাউনে প্রবেশ করার আগে উইন্ডোর মধ্যে ব্যর্থতার সংখ্যা। |
| `OMNIROUTE_PROVIDER_BREAKER_API_KEY_FAILURE_WINDOW_MS` | `1800000` | `open-sse/config/constants.ts` | প্রদানকারী-স্তরের ব্রেকার: API-key প্রদানকারীদের জন্য রোলিং ব্যর্থতা-গণনা উইন্ডো (ms)। |
| `OMNIROUTE_PROVIDER_BREAKER_API_KEY_COOLDOWN_MS` | `600000` | `open-sse/config/constants.ts` | প্রদানকারী-স্তরের ব্রেকার: API-key প্রদানকারীর সীমায় পৌঁছানোর পর কুলডাউন (ms)। |
| `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` | API-key প্রদানকারীর সর্বোচ্চ resetTimeout বৃদ্ধির গুণক। |
| `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` | প্রদানকারী-স্তরের ব্রেকার: সম্পূর্ণ লোকাল প্রদানকারী কুলডাউনে প্রবেশ করার আগের ব্যর্থতার সংখ্যা। |
| `OMNIROUTE_PROVIDER_BREAKER_LOCAL_FAILURE_WINDOW_MS` | `300000` | `open-sse/config/constants.ts` | প্রদানকারী-স্তরের ব্রেকার: লোকাল প্রদানকারীদের জন্য রোলিং ব্যর্থতা-গণনা উইন্ডো (ms)। |
| `OMNIROUTE_PROVIDER_BREAKER_LOCAL_COOLDOWN_MS` | `60000` | `open-sse/config/constants.ts` | প্রদানকারী-স্তরের ব্রেকার: লোকাল প্রদানকারীর সীমায় পৌঁছানোর পর কুলডাউন (ms)। |
| `PIN_DROP_BACKOFF_LEVEL` | `2` | `open-sse/services/combo.ts` | যে ব্যাকঅফ গভীরতায় কোনো context-cache পিনের প্রদানকারীকে স্থায়ীভাবে অস্বাস্থ্যকর গণ্য করা হয় এবং ফেইলওভারের জন্য পিনটি বাদ দেওয়া হয়। |
| `PIN_DROP_GRACE_MS` | `20000` | `open-sse/services/combo.ts` | context-cache পিন বাদ দেওয়ার আগে স্বল্পস্থায়ী ক্ষণস্থায়ী কুলডাউন সহ্য করার অ্যান্টি-ফ্ল্যাপ উইন্ডো (ms)। |
### পরিস্থিতি
| পরিস্থিতি | কনফিগারেশন |
| ---------------------------------------- | ---------------------------------------------------------- |
| **দীর্ঘমেয়াদি কোড জেনারেশন** | `REQUEST_TIMEOUT_MS=900000` (15 মিনিট) |
| **মোট স্ট্রিমের আয়ুষ্কাল সীমাবদ্ধ করা** | `STREAM_ACTIVE_TIMEOUT_MS=1260000` (21 মিনিট) |
| **প্রোডাকশন API-এর জন্য দ্রুত ব্যর্থতা** | `API_BRIDGE_PROXY_TIMEOUT_MS=10000` |
| **বর্ধিত চিন্তন মডেল** | `STREAM_IDLE_TIMEOUT_MS=300000` (চাঙ্কগুলোর মধ্যে 5 মিনিট) |
---
## 16. লগিং
লগিং সিস্টেম stdout এবং রোটেট করা লগ ফাইল—উভয় স্থানেই লেখে। সমস্ত কনফিগারেশন `src/lib/logEnv.ts` দ্বারা পড়া হয়।
| ভেরিয়েবল | ডিফল্ট | বিবরণ |
| ----------------------------------------- | -------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `APP_LOG_LEVEL` | `info` | সর্বনিম্ন লগ স্তর: `debug`, `info`, `warn`, `error`। |
| `APP_LOG_FORMAT` | `text` | আউটপুট ফরম্যাট: `text` (মানুষের পাঠযোগ্য) অথবা `json` (কাঠামোবদ্ধ)। |
| `APP_LOG_TO_FILE` | `true` | stdout-এর পাশাপাশি ফাইলেও লগ লিখুন। |
| `APP_LOG_FILE_PATH` | `logs/application/app.log` | লগ ফাইলের পাথ (প্রকল্পের রুট অথবা `DATA_DIR`-এর সাপেক্ষে)। |
| `APP_LOG_MAX_FILE_SIZE` | `50M` | রোটেশনের আগে ফাইলের সর্বোচ্চ আকার। গ্রহণযোগ্য: `50M`, `1G`, `512K`, অথবা সরাসরি বাইটের সংখ্যা। |
| `APP_LOG_RETENTION_DAYS` | `7` | রোটেট করা অ্যাপ্লিকেশন লগ ফাইল যত দিন রাখা হবে। |
| `APP_LOG_MAX_FILES` | `20` | রোটেট করা লগ ফাইলের ব্যাকআপের সর্বোচ্চ সংখ্যা। |
| `CALL_LOG_RETENTION_DAYS` | `7` | ডেটাবেসে অনুরোধ/কল লগ এন্ট্রি যত দিন রাখা হবে। |
| `CALL_LOG_MAX_ENTRIES` | `10000` | ইন-মেমরি বাফারে কল লগ এন্ট্রির সর্বোচ্চ সংখ্যা। |
| `CALL_LOGS_TABLE_MAX_ROWS` | `100000` | ছাঁটাইয়ের আগে `call_logs` SQLite টেবিলে সারির সর্বোচ্চ সংখ্যা। |
| `ENABLE_REQUEST_LOGS` | _(সেট করা নেই)_ | ড্যাশবোর্ডের সেটিং ওভাররাইড করে বিস্তারিত অনুরোধ লগিং চালু বা বন্ধ করতে বাধ্য করুন। |
| `MAX_PENDING_REQUEST_AGE_MS` | `3600000` (1 ঘণ্টা) | ইন-মেমরি পরিষ্কারকরণের আগে অনাথ সক্রিয় অনুরোধ লগ এন্ট্রির সর্বোচ্চ বয়স। |
| `CALL_LOG_PIPELINE_CAPTURE_STREAM_CHUNKS` | `false` | `call_log_pipeline_enabled=true` হলে পাইপলাইন আর্টিফ্যাক্টে স্ট্রিম চাঙ্ক সংরক্ষণ করুন। অপ্ট-ইন (`true`) — ডিস্কের স্থান বাঁচাতে ডিফল্টভাবে বন্ধ। |
| `CALL_LOG_PIPELINE_MAX_SIZE_KB` | `512` | `call_log_pipeline_enabled=true` হলে পাইপলাইন কল লগ আর্টিফ্যাক্টের সর্বোচ্চ আকার, KB-তে। |
| `PROXY_LOGS_TABLE_MAX_ROWS` | `100000` | ছাঁটাইয়ের আগে `proxy_logs` SQLite টেবিলে সারির সর্বোচ্চ সংখ্যা। |
| `PROXY_LOG_INCLUDE_IPS` | `false` | `[ProxyEgress]` কনসোল লগে ক্লায়েন্ট/এগ্রেস IP এবং অ্যাকাউন্ট প্রিফিক্স অন্তর্ভুক্ত করুন। ড্যাশবোর্ড/ডেটাবেসের প্রক্সি-লগ রেকর্ডে সম্পূর্ণ বিবরণ বজায় থাকে। |
| `APP_LOG_ROTATION_CHECK_INTERVAL_MS` | `60000` (1 মিনিট) | `src/lib/logRotation.ts` কত ঘন ঘন সক্রিয় লগ ফাইলের আকার পুনরায় পরীক্ষা করে। |
| `CHAT_LOG_TEXT_LIMIT` | `65536` | চ্যাট লগ আর্টিফ্যাক্টে সংরক্ষিত স্ট্রিংয়ের সর্বোচ্চ দৈর্ঘ্য (ডিফল্ট 64 KB)। |
| `CHAT_LOG_ARRAY_TAIL_ITEMS` | `128` | চ্যাট লগ পেলোড ছাঁটাই করার সময় শেষাংশ থেকে সংরক্ষিত অ্যারে আইটেমের সংখ্যা। |
| `CHAT_LOG_MAX_DEPTH` | `6` | চ্যাট লগ পেলোড ছাঁটাই হওয়ার আগের সর্বোচ্চ নেস্টিং গভীরতা। |
| `CHAT_LOG_MAX_OBJECT_KEYS` | `80` | চ্যাট লগ পেলোডে সংরক্ষিত অবজেক্ট কী-এর সর্বোচ্চ সংখ্যা (0 = সীমাহীন)। |
| `CHAT_LOG_MAX_BODY_KB` | `1024` | সম্পূর্ণ ক্লোনের পরিবর্তে শুধু একটি সারাংশ দিয়ে প্রতিস্থাপিত হওয়ার আগে পুরো অনুরোধ/প্রতিক্রিয়া বডির আকার (KB)। দীর্ঘ এজেন্টিক কথোপকথনের ক্ষেত্রে ড্যাশবোর্ডে আসল বার্তার পরিবর্তে প্লেসহোল্ডার দেখা গেলে এই মান বাড়ান। |
| `CHAT_DEBUG_FILE` | `false` | true হলে, `serializeArtifactForStorage` আকারভিত্তিক ছাঁটাই এড়িয়ে যায়। শুধু ডিবাগের জন্য। |
---
## 17. মেমরি অপ্টিমাইজেশন
| ভেরিয়েবল | ডিফল্ট | বিবরণ |
| ----------------------------- | ------------------------------------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `OMNIROUTE_MEMORY_MB` | _স্বয়ংক্রিয়_ (বেয়ার মেটাল); **Docker ইমেজে `1024`** | **প্রস্তাবিত** Docker/স্বতন্ত্র V8 হিপ সীমা (MB)। সেট করা না থাকলে, গতিশীলভাবে ক্যালিব্রেট করা হয় (সিস্টেম RAM-এর ~35%, `[512, 4096]` সীমার মধ্যে); মোট মেমরি পড়া না গেলেই কেবল `512` সর্বনিম্ন সীমা হিসেবে ব্যবহৃত হয়। `run-standalone.mjs`-এ (Docker CMD), একটি **সুস্পষ্ট** মান `--max-old-space-size` হিসেবে যোগ করা হয় এবং বিরোধপূর্ণ NODE_OPTIONS হিপ ফ্ল্যাগের ওপর **অগ্রাধিকার পায়** (V8-এর শেষ ফ্ল্যাগ)। `omniroute serve` এখনও বিদ্যমান NODE_OPTIONS হিপকে অগ্রাধিকার দেয় (#5238)। দুটিতে ভিন্ন সংখ্যা সেট করবেন না — প্রক্রিয়াটি উভয় মান ও কোনটি কার্যকর হয়েছে তা উল্লেখ করে একটি সতর্কবার্তা লগ করে। **অফিশিয়াল Docker ইমেজ সর্বদা `1024` সেট করে, তাই সেখানে ক্যালিব্রেশন কখনো চলে না।** Coding-agent `/v1/responses`-এর জন্য cgroup-এর অতিরিক্ত ধারণক্ষমতাসহ `8192`–`12288` প্রয়োজন — [Docker নির্দেশিকা — রানটাইম RAM](../guides/DOCKER_GUIDE.md#runtime-ram-for-coding-agents) দেখুন। |
| `PROMPT_CACHE_MAX_SIZE` | `50` | ক্যাশে রাখা সিস্টেম প্রম্পট এন্ট্রির সর্বোচ্চ সংখ্যা। |
| `PROMPT_CACHE_MAX_BYTES` | `2097152` (2 MB) | মোট প্রম্পট ক্যাশের সর্বোচ্চ আকার। |
| `PROMPT_CACHE_TTL_MS` | `300000` (5 মিনিট) | প্রম্পট ক্যাশ এন্ট্রির TTL। |
| `SEMANTIC_CACHE_MAX_SIZE` | `100` | ক্যাশে রাখা temperature=0 রেসপন্সের সর্বোচ্চ সংখ্যা। |
| `SEMANTIC_CACHE_MAX_BYTES` | `4194304` (4 MB) | মোট সেম্যান্টিক ক্যাশের সর্বোচ্চ আকার। |
| `SEMANTIC_CACHE_TTL_MS` | `1800000` (30 মিনিট) | সেম্যান্টিক ক্যাশ এন্ট্রির TTL। |
| `OMNIROUTE_CORPUS_CACHE_SIZE` | `5` | যেসব লোকাল-কর্পাস রুট একই সময়ে একটি সক্রিয় ইন-মেমরি ইনডেক্স ধরে রাখে (`src/lib/localCorpus/configured.ts`)। LRU: সীমায় পৌঁছালে সবচেয়ে কম সম্প্রতি ব্যবহৃত রুটের ইনডেক্স অপসারণ করা হয় এবং পরবর্তী কোয়েরিতে পুনর্নির্মাণ করা হয়। সর্বনিম্ন `1`-এ সীমাবদ্ধ; অ-সাংখ্যিক মান হলে ডিফল্ট ব্যবহৃত হয়। |
| `STREAM_HISTORY_MAX` | `50` | Dashboard-এর লাইভ ভিউ বাফারে সাম্প্রতিক স্ট্রিম ইভেন্টের সর্বোচ্চ সংখ্যা। |
| `CONTEXT_LENGTH_DEFAULT` | `128000` | সুস্পষ্ট কনফিগ ছাড়া মডেলগুলোর জন্য সর্বোচ্চ কনটেক্সট দৈর্ঘ্যের গ্লোবাল ফলব্যাক। |
| `USAGE_TOKEN_BUFFER` | `100` | ব্যবহার কোটা ট্র্যাক করার সময় সংরক্ষিত অতিরিক্ত টোকেন ধারণক্ষমতা। |
### কম্প্রেশন
| ভেরিয়েবল | ডিফল্ট | বিবরণ |
| ------------------------------------- | ----------- | -------------------------------------------------------------------------------------------------------------------------------- |
| `OMNIROUTE_RTK_TRUST_PROJECT_FILTERS` | সেট করা নেই | `.rtk/trust.json` হ্যাশ ছাড়াই প্রজেক্টের `.rtk/filters.json`-কে বিশ্বাস করুন। শুধু নিয়ন্ত্রিত লোকাল ডেভেলপমেন্টে ব্যবহার করুন। |
### মেমরি ইঞ্জিন (পরিকল্পনা 21)
### মেমরি, স্কিল ও টোকেন রিফ্রেশের ইভেন্ট-লুপ ব্যয় (#10349)
OmniRoute একটি **একক Node প্রক্রিয়া**। মেমরি এক্সট্র্যাকশন/রিট্রিভাল, স্কিল ইনজেকশন এবং প্রোভাইডার টোকেন রিফ্রেশ `GET /healthz` ও dashboard-এর মতো **একই ইভেন্ট লুপে** চলে। এগুলো কোনো ওয়ার্কার থ্রেড নয়।
| কাজ | কোড | ডিফল্ট | অপারেটর নিয়ন্ত্রণ |
| --------------------------- | ---------------------------------- | ------------------------------------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------- |
| মেমরি নিষ্কাশন / পুনরুদ্ধার | `src/lib/memory/` | ড্যাশবোর্ডের **memoryEnabled** (ডিফল্টভাবে চালু) | **Settings → Memory** বন্ধ করুন। সেটিংসে ফিচারটি নিষ্ক্রিয় করা ছাড়া আলাদা কোনো env kill switch নেই। |
| স্কিল ইনজেকশন | `src/lib/skills/injection.ts` | ড্যাশবোর্ডের **skillsEnabled** (ডিফল্টভাবে চালু) | **Settings → Memory/Skills** (`skillsEnabled`) বন্ধ করুন। ইনজেকশন ইতিমধ্যে চালু হওয়ার পর নিচের sandbox নিয়ন্ত্রণগুলো শুধু এক্সিকিউশনের সীমা নির্ধারণ করে। |
| টোকেন রিফ্রেশ | `src/sse/services/tokenRefresh.ts` | সংযুক্ত OAuth/web provider-গুলোর জন্য চালু | provider-টি সংযোগ বিচ্ছিন্ন করুন অথবা টোকেনগুলো বৈধ থাকতে দিন; বর্তমানে কোনো `TOKEN_REFRESH=0` env নেই। |
নিষ্ক্রিয় অবস্থায় থাকা কোনো মেশিনে `/healthz` ধীর হলে প্রথমে memory + skills নিষ্ক্রিয় করুন, তারপর catalog/compression-এর লোড পরীক্ষা করুন (#10303, #9685)। এই ফিচারগুলো `await` পয়েন্টে নিয়ন্ত্রণ ছেড়ে দেয়, কিন্তু তারপরও একই থ্রেডের জন্য প্রতিযোগিতা করে।
স্থায়ী মেমরি সাবসিস্টেমের (`src/lib/memory/`) embedding layer, vector store এবং reranking নিয়ন্ত্রণসমূহ।
| ভ্যারিয়েবল | ডিফল্ট | বিবরণ |
| ------------------------------------ | --------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `MEMORY_EMBEDDING_CACHE_TTL_MS` | `300000` (5 মিনিট) | ইন-মেমরি embedding cache-এর TTL (প্রতি source/model/dim signature অনুযায়ী)। |
| `MEMORY_EMBEDDING_CACHE_MAX` | `1000` | embedding cache-এ রাখা সর্বোচ্চ LRU entry সংখ্যা। |
| `MEMORY_TRANSFORMERS_MODEL` | `Xenova/all-MiniLM-L6-v2` | ঐচ্ছিক `@huggingface/transformers` স্থানীয় MiniLM pipeline-এর জন্য HF repo id (~23 MB int8, ~400 MB RAM)। |
| `MEMORY_STATIC_MODEL` | `minishlab/potion-base-8M` | static potion/Model2Vec lookup-table embedder-এর জন্য HF repo id। প্রয়োজন হলে cache dir-এ ডাউনলোড করা হয়। |
| `MEMORY_STATIC_CACHE_DIR` | `/embeddings` | static potion model file cache করার directory। সেট করা না থাকলে ডিফল্টভাবে `DATA_DIR`-এর অধীনে থাকে। |
| `HF_HUB_ENDPOINT` | `https://huggingface.co` | `staticPotion.ts`-এর ব্যবহৃত Hugging Face Hub base URL ওভাররাইড করে (যেমন air-gapped setup-এর জন্য mirror endpoint)। |
| `MEMORY_VEC_TOP_K` | `20` | `src/lib/memory/vectorStore.ts`-এর ভেতরে `sqlite-vec` brute-force vector search-এ ব্যবহৃত ডিফল্ট top-K। |
| `MEMORY_RRF_K` | `60` | hybrid FTS5 + vector retrieval-এর জন্য Reciprocal Rank Fusion constant `k` (sqlite-vec recipe)। |
| `VECTOR_STORE_DISABLE_VEC` | `false` | `getVectorStore()`-এর (`src/lib/memory/vectorStore.ts`) test/diagnostic seam: `true` হলে vector store-কে জোরপূর্বক `null` করে (`sqlite-vec`-বিহীন cloud/WASM environment অনুকরণ করে), ফলে memory retrieval-এর কার্যকারিতা কমে FTS5 keyword search-এ নেমে আসে। production-এ এটি সেট না করাই উচিত। |
| `NOTION_API_KEY` | _(সেট করা নেই)_ | Notion backend-এর API key (`genericBackend.ts`-এর পরিচিত backend preset-এ ব্যবহৃত)। |
| `NOTION_API_URL` | `https://api.notion.com/v1` | Notion API-এর base URL (self-hosted Notion বিকল্পের জন্য ওভাররাইড করা যায়)। |
| `OBSIDIAN_API_KEY` | _(সেট করা নেই)_ | Obsidian Vault backend-এর API key (`genericBackend.ts`-এর পরিচিত backend preset-এ ব্যবহৃত)। |
| `OBSIDIAN_API_URL` | `http://localhost:27123` | Obsidian Vault API-এর base URL (remote vault-এর জন্য ওভাররাইড করা যায়)। |
| `MEMORY_TYPED_DECAY_ENABLED` | `false` | TV6 typed memory decay-এর master switch। **ঐচ্ছিক (ডিফল্টভাবে বন্ধ)** — sweep ক্ষয়প্রাপ্ত memory **মুছে দেয়**। এটি বন্ধ থাকলে `access_count`/`last_accessed_at` শুধুই telemetry এবং কখনো কিছু মুছে ফেলা হয় না। |
| `MEMORY_TYPED_DECAY_EPISODIC_DAYS` | `30` | যে TTL (দিন) পার হওয়ার পর অব্যবহৃত `episodic` memory ক্ষয়প্রাপ্ত হয়। `0` দিলে episodic-ও ক্ষয় থেকে সুরক্ষিত থাকে। দীর্ঘস্থায়ী type-গুলো (`factual`/`procedural`/`semantic`) সবসময় সুরক্ষিত। decay clock `last_accessed_at` অনুযায়ী নতুন ভিত্তি পায়। |
| `MEMORY_TYPED_DECAY_ACCESS_IMMUNITY` | `3` | কোনো memory এতবার বা তার বেশি (`>=`) inject করা হলে type নির্বিশেষে সেটি decay থেকে সুরক্ষিত হয়ে যায়। `0` access immunity নিষ্ক্রিয় করে। |
| `MEMORY_TYPED_DECAY_SWEEP_INTERVAL` | `0` (নিষ্ক্রিয়) | `src/lib/memory/typedDecay.ts`-এর ঐচ্ছিক periodic decay sweep-এর interval (সেকেন্ড)। `0`/সেট করা নেই = কোনো periodic sweep নেই। এটি দ্বিগুণভাবে ঐচ্ছিক: `MEMORY_TYPED_DECAY_ENABLED=true`-ও প্রয়োজন। |
| `OMNIROUTE_STRICT_SYSTEM_PROVIDERS` | _(সেট করা নেই)_ | কমা দিয়ে পৃথক করা provider id-সমূহ (case-insensitive), যেগুলো **শুধু index 0-এ** একটি `system` message গ্রহণ করে (`src/lib/memory/injection.ts`)। এগুলোর ক্ষেত্রে multi-turn conversation-এ cache-safe mid-array memory splice নিরাপদ নয়, তাই memory-কে একত্রিত করে/আগে যুক্ত করে শুরুর system message হিসেবে রাখা হয়। ডিফল্টভাবে শুধু `xiaomi-mimo`/`mimo`; একই single-leading-system-message সীমা প্রয়োগকারী self-hosted OpenAI-compatible endpoint-গুলোর (যেমন Qwen3.5+/3.6) জন্য তালিকাটি বাড়ান। |
### কম-RAM Docker উদাহরণ
`128` শুধু dashboard-এর জন্য উপযুক্ত। এই heap-এ coding agent দীর্ঘ `/v1/responses` চলাকালে `FATAL ERROR` দেয়। Claude/Codex/Grok gateway হিসেবে এই উদাহরণ ব্যবহার করবেন না।
```bash
OMNIROUTE_MEMORY_MB=128
PROMPT_CACHE_MAX_SIZE=20
PROMPT_CACHE_MAX_BYTES=524288 # 512 KB
SEMANTIC_CACHE_MAX_SIZE=25
SEMANTIC_CACHE_MAX_BYTES=1048576 # 1 MB
STREAM_HISTORY_MAX=10
```
---
## 18. মূল্য সমন্বয়
বাহ্যিক উৎস থেকে মডেলের মূল্য-সংক্রান্ত ডেটার স্বয়ংক্রিয় সমন্বয়।
| ভেরিয়েবল | ডিফল্ট | সোর্স ফাইল | বিবরণ |
| ----------------------- | ------------- | ------------------------ | ----------------------------------------- |
| `PRICING_SYNC_ENABLED` | `false` | `src/lib/pricingSync.ts` | পর্যায়ক্রমিক মূল্য সমন্বয় অপ্ট-ইন করুন। |
| `PRICING_SYNC_INTERVAL` | `86400` (24h) | `src/lib/pricingSync.ts` | সেকেন্ডে সমন্বয়ের ব্যবধান। |
| `PRICING_SYNC_SOURCES` | `litellm` | `src/lib/pricingSync.ts` | কমা দিয়ে পৃথক করা ডেটা উৎসসমূহ। |
---
## Arena ELO সমন্বয়
| ভেরিয়েবল | ডিফল্ট | সোর্স ফাইল | বিবরণ |
| ---------------------------- | ------------- | ------------------------------------------------------------------------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `ARENA_ELO_SYNC_ENABLED` | `true` | `src/shared/constants/featureFlagDefinitions.ts` | পর্যায়ক্রমিক Arena AI লিডারবোর্ড ELO সমন্বয়, যা Dashboard Feature Flags থেকে কনফিগার করা যায় অথবা অপ্ট-আউট করতে `false` ব্যবহার করা যায়। |
| `MODELS_CATALOG_PREFIX_MODE` | `dual` | `src/shared/constants/featureFlagDefinitions.ts`, `src/app/api/v1/models/catalog.ts` | `GET /v1/models`-এ মডেল আইডিগুলোর জন্য ব্যবহৃত প্রিফিক্সের ধরন। `dual` প্রতিটি মডেলের জন্য সংক্ষিপ্ত উপনাম প্রিফিক্স এবং ক্যানোনিক্যাল প্রোভাইডার প্রিফিক্স—উভয়ই প্রকাশ করে (পশ্চাৎ-সামঞ্জস্য—ক্যাটালগের আকার প্রায় দ্বিগুণ করে); `alias` প্রতিটি মডেলের জন্য একটি আইডি নির্গত করে; `canonical` শুধু সম্পূর্ণ প্রোভাইডার-আইডি প্রিফিক্স নির্গত করে (যেসব প্রোভাইডারের উপনাম ইতোমধ্যেই ক্যানোনিক্যাল আইডি, সেগুলোর একক এন্ট্রি বজায় থাকে)। ক্লায়েন্টরা `?prefix=alias` ব্যবহার করে প্রতিটি অনুরোধে এটি ওভাররাইড করতে পারে। [API_REFERENCE](API_REFERENCE.md#model-id-prefixes-prefix) দেখুন। |
| `ARENA_ELO_SYNC_INTERVAL` | `86400` (24h) | `src/lib/arenaEloSync.ts` | সেকেন্ডে সমন্বয়ের ব্যবধান। |
---
## PromptQL Playground প্রোভাইডার (অনানুষ্ঠানিক/পরীক্ষামূলক)
prompt.ql.app-এর জন্য রিভার্স-ইঞ্জিনিয়ার করা GraphQL সেশন ব্রিজ (`src/shared/constants/providers/web-cookie.ts`)। সবগুলোই ঐচ্ছিক—ডিফল্ট মানগুলো সর্বজনীন playground এন্ডপয়েন্ট নির্দেশ করে; শুধু স্ব-হোস্টেড/বিকল্প PromptQL ডিপ্লয়মেন্টের জন্য ওভাররাইড করুন।
| ভেরিয়েবল | ডিফল্ট | সোর্স ফাইল | বিবরণ |
| ---------------------------- | ------------------------------------------------------------------ | ----------------------------------------------------------------------- | ---------------------------------------------------------------- |
| `PROMPTQL_GRAPHQL_ENDPOINT` | `https://data.prompt.ql.app/promptql/playground-v2-hge/v1/graphql` | `open-sse/executors/promptql.ts` | চ্যাট/সেশন অপারেশনের জন্য ব্যবহৃত GraphQL এন্ডপয়েন্ট। |
| `PROMPTQL_CREDITS_ENDPOINT` | `https://data.pro.ql.app/v1/graphql` | `open-sse/executors/promptql.ts`, `open-sse/services/usage/promptql.ts` | ক্রেডিট ব্যালেন্স/ব্যবহার查询 করতে ব্যবহৃত GraphQL এন্ডপয়েন্ট। |
| `PROMPTQL_TOKEN_REFRESH_URL` | `https://auth.pro.ql.app/ddn/project/token` | `open-sse/executors/promptql.ts` | সর্বোত্তম-প্রচেষ্টায় টোকেন রিফ্রেশের জন্য ব্যবহৃত এন্ডপয়েন্ট। |
| `PROMPTQL_POLL_TIMEOUT_MS` | `180000` | `open-sse/executors/promptql.ts` | টাইম-আউট হওয়ার আগে `thread_events` পোল করার সর্বোচ্চ সময় (ms)। |
---
## HyperAgent ওয়েব প্রোভাইডার (অনানুষ্ঠানিক/পরীক্ষামূলক)
hyperagent.com-এর জন্য রিভার্স-ইঞ্জিনিয়ার করা সেশন ব্রিজ (`src/shared/constants/providers/web-cookie.ts`)। ঐচ্ছিক — ডিফল্টভাবে সর্বজনীন বিলিং/ব্যবহার এন্ডপয়েন্ট নির্দেশ করা হয়; শুধুমাত্র স্ব-হোস্টেড/বিকল্প HyperAgent ডিপ্লয়মেন্টের জন্য এটি ওভাররাইড করুন।
| ভেরিয়েবল | ডিফল্ট | সোর্স ফাইল | বিবরণ |
| ---------------------- | --------------------------------------------------- | --------------------------------------- | ------------------------------------------------------ |
| `HYPERAGENT_USAGE_URL` | `https://hyperagent.com/api/settings/billing/usage` | `open-sse/services/usage/hyperagent.ts` | বিলিং/ব্যবহারের ক্রেডিট ব্লক আনতে ব্যবহৃত এন্ডপয়েন্ট। |
---
## Kilo Code ব্যবহারের কোটা
Kilo Code প্রোভাইডারের জন্য ব্যক্তিগত USD ব্যালেন্স এবং Kilo Pass ব্যবহার অনুসন্ধান। ঐচ্ছিক — ডিফল্টভাবে সর্বজনীন Kilo API নির্দেশ করা হয়; শুধুমাত্র রিলে/টেস্ট ফিক্সচারের জন্য এটি ওভাররাইড করুন। প্রমাণীকরণে সংযোগটির বিদ্যমান OAuth অ্যাক্সেস টোকেন ব্যবহৃত হয়।
| ভেরিয়েবল | ডিফল্ট | সোর্স ফাইল | বিবরণ |
| -------------- | --------------------- | ------------------------------------- | ------------------------------------------------------------------------- |
| `KILO_API_URL` | `https://api.kilo.ai` | `open-sse/services/usage/kilocode.ts` | ব্যক্তিগত Kilo Code ব্যালেন্স এবং Kilo Pass ব্যবহার আনতে ব্যবহৃত বেস URL। |
---
## Adobe Firefly ওয়েব প্রোভাইডার (অনানুষ্ঠানিক/পরীক্ষামূলক)
Adobe Firefly ওয়েব প্রোভাইডারের জন্য ব্রাউজার-চালিত সেশন রিফ্রেশ
(`open-sse/services/adobeFireflyBrowserLogin.ts`, `open-sse/services/adobeFireflySession.ts`,
`open-sse/services/adobeFireflyClient.ts`)। ঐচ্ছিক — সব ডিফল্ট একটি স্বাভাবিক
ডেস্কটপ ইনস্টলের জন্য সমন্বয় করা হয়েছে।
> **#9255-এ সরানো হয়েছে।** পুরোনো CDP-সংযুক্ত Chrome রানটাইম (adobeFireflyChromeRuntime.ts)
> একটি Playwright ব্রাউজার-লগইন সার্ভিস দিয়ে প্রতিস্থাপিত হয়েছে, এবং এর নিয়ন্ত্রণগুলো আর বিদ্যমান নেই।
> ADOBE_FIREFLY_CHROME_ CDP_PORT / VISIBLE / HEADED / PING / FORCE_RESTART ভেরিয়েবলগুলো, সেই সঙ্গে
> ADOBE_FIREFLY_LOGIN_WAIT_MS এবং ADOBE_FIREFLY_FORTER_WAIT_MS, কোডবেসের কোথাও পড়া হয় না —
> এগুলো সেট করলে কোনো প্রভাব পড়ে না।
| ভেরিয়েবল | ডিফল্ট | সোর্স ফাইল | বিবরণ |
| ------------------------------------ | --------------- | ----------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------- |
| `ADOBE_FIREFLY_CHROME_HEADLESS` | `0` | `open-sse/services/adobeFireflyBrowserLogin.ts` | প্রকৃত হেডলেস Chrome-এর জন্য `1`-এ সেট করুন (জেনারেশনের ক্ষেত্রে এটি কাজ করে না বলে জানা গেছে; শুধুমাত্র ডিবাগের জন্য)। |
| `ADOBE_FIREFLY_BROWSER_REFRESH` | `1` | `open-sse/services/adobeFireflySession.ts` | আগাম ব্রাউজার ওয়ার্ম করার অপ্ট-ইন/অপ্ট-আউট। `0` আগাম ওয়ার্ম করা নিষ্ক্রিয় করে (ব্যাচের মাঝখানে 408 পুনরুদ্ধার তবুও প্রযোজ্য থাকে)। |
| `ADOBE_FIREFLY_SESSION_DISK` | `1` | `open-sse/services/adobeFireflySession.ts` | Adobe Firefly সেশন ডিস্কে সংরক্ষণ করা নিষ্ক্রিয় করতে `0`-এ সেট করুন। |
| `ADOBE_FIREFLY_MIN_SUBMIT_GAP_MS` | _(সেট করা নেই)_ | `open-sse/services/adobeFireflySession.ts` | পরপর সাবমিটের মধ্যে কার্যকর করা ন্যূনতম ব্যবধান (ms), যা বিল্ট-ইন ডিফল্টকে ওভাররাইড করে। |
| `ADOBE_FIREFLY_BATCH_EXTRA_GAP_MS` | _(সেট করা নেই)_ | `open-sse/services/adobeFireflySession.ts` | সফল ব্যাচের পরে যোগ করা অতিরিক্ত ব্যবধান (ms), যা বিল্ট-ইন ডিফল্টকে ওভাররাইড করে। |
| `ADOBE_FIREFLY_SUBMIT_BASE_DELAY_MS` | _(সেট করা নেই)_ | `open-sse/services/adobeFireflyClient.ts` | জেনারেশন অনুরোধ সাবমিট করার আগের বেস বিলম্ব (ms), যা বিল্ট-ইন ডিফল্টকে ওভাররাইড করে। |
---
## 19. মডেল সিঙ্ক (ডেভ)
| ভেরিয়েবল | ডিফল্ট | সোর্স ফাইল | বিবরণ |
| ----------------------------------- | ------------------ | ---------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| `MODELS_DEV_SYNC_ENABLED` | _(সেট করা নেই)_ | `src/lib/modelsDevSync.ts` | models.dev প্রাইসিং সিঙ্কের জন্য বাধ্যতামূলক ওভাররাইড। সেট করা না থাকলে = Settings > AI (`modelsDevSyncEnabled`) অনুসরণ করে। `0`/`false`/`off`/`no` **DB-এর ওপর অগ্রাধিকার পায়** এবং পর্যায়ক্রমিক সিঙ্ক ও `getModelsDevPricing()` SQL/JSON স্ক্যান—উভয়ই এড়িয়ে যায় (ড্যাশবোর্ড একই ইভেন্ট লুপে আটকে গেলে পুনরুদ্ধারের জন্য)। `1`/`true`/`on`/`yes` সিঙ্ক চালু করতে বাধ্য করে। প্রাইসিং সংরক্ষণ/মুছে ফেলার সময়ও `backupDbFile("pre-write")` কল করা হয়, যা 60-মিনিটের থ্রটল বা `DISABLE_SQLITE_AUTO_BACKUP`-এর অধীনে কোনো কাজ করে না। |
| `MODELS_DEV_SYNC_INTERVAL` | `86400` (24 ঘণ্টা) | `src/lib/modelsDevSync.ts` | ডেভেলপমেন্টকালীন মডেল ক্যাটালগ সিঙ্কের ব্যবধান, সেকেন্ডে। |
| `CONTEXT_WINDOW_RECONCILE_INTERVAL` | `86400` (24 ঘণ্টা) | `src/lib/contextWindowResolver.ts` | স্ব-সংশোধনকারী কনটেক্সট-উইন্ডো রিকনসাইলার (5004)-এর ব্যবধান (সেকেন্ডে): `/models` ডিসকভারি থেকে প্রোভাইডার-ঘোষিত উইন্ডোগুলো ক্যাটালগের সঙ্গে ভিন্ন হলে সেগুলোকে `auto:discovery` ওভাররাইড হিসেবে পিন করে। নিষ্ক্রিয় করতে `0` সেট করুন। ইতিমধ্যে সিঙ্ক করা ডেটা পুনরায় ব্যবহার করে (নতুন করে ফেচ করে না); `manual` ওভাররাইড কখনো প্রতিস্থাপন করে না। |
---
## 20. প্রোভাইডার-নির্দিষ্ট সেটিংস
| ভেরিয়েবল | ডিফল্ট | সোর্স ফাইল | বিবরণ |
| ---------------------------------------------- | -------------------------------------- | ---------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `OPENROUTER_CATALOG_TTL_MS` | `86400000` (24 ঘণ্টা) | `src/lib/catalog/openrouterCatalog.ts` | OpenRouter মডেল ক্যাটালগ ক্যাশের TTL। |
| `MODEL_CATALOG_INCLUDE_NAMES` | `true` | `src/shared/constants/featureFlagDefinitions.ts` | `/v1/models` রেসপন্সে প্রদর্শনবান্ধব `name` ফিল্ড অন্তর্ভুক্ত করুন। যেসব ক্লায়েন্ট শুধু ID প্রত্যাশা করে, তাদের জন্য এটি নিষ্ক্রিয় করুন। |
| `CATALOG_BUILD_TIMEOUT_MS` | `8000` (8 সেকেন্ড) | `src/app/api/v1/models/catalogCache.ts` | সমন্বিত `GET /v1/models` ক্যাটালগ পুনর্নির্মাণের জন্য কোল্ড-পাথ অপেক্ষার সীমা (#12627)। টাইমআউট হলে, আগে থেকে একটি সর্বশেষ-সফল 200 থাকলে সেটি পরিবেশন করা হয়। |
| `OMNIROUTE_SYNCED_CATALOG_STALE_AFTER_MS` | `2592000000` (30 দিন) | `src/lib/db/models/activeSyncedCatalog.ts` | যে সময় অতিক্রান্ত হলে কোনো সংযোগের সিঙ্ক করা মডেল তালিকা রাউটিংয়ের জন্য কর্তৃত্বপূর্ণ হিসেবে গণ্য হওয়া বন্ধ করে এবং উন্মুক্তভাবে রেজিস্ট্রিতে ফিরে যায় (#12849)। যেসব সারিতে কখনও টাইমস্ট্যাম্প দেওয়া হয়নি, সেগুলোকে স্টেল হিসেবে গণ্য করা হয়। |
| `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 আপস্কেল সাবমিট-রিট্রাইয়ের এক্সপোনেনশিয়াল ব্যাকঅফের বেস বিলম্ব। |
| `AWS_REGION` | _(সেট করা নেই)_ | `src/lib/providers/validation.ts`, `open-sse/handlers/audioSpeech.ts` | AWS Bedrock এন্ডপয়েন্ট (Kiro, অডিও) নির্মাণে ব্যবহৃত অঞ্চল। |
| `AWS_DEFAULT_REGION` | _(সেট করা নেই)_ | `src/lib/providers/validation.ts`, `open-sse/handlers/audioSpeech.ts` | `AWS_REGION` সেট করা না থাকলে ফলব্যাক। |
| `CLOUDFLARE_ACCOUNT_ID` | _(সেট করা নেই)_ | `open-sse/executors/cloudflare-ai.ts` | Cloudflare Workers AI-এর অ্যাকাউন্ট ID। |
| `CLOUDFLARE_PLAYGROUND_CHROME_PATH` | _(সেট করা নেই)_ | `open-sse/executors/cloudflare-playground.ts` | Cloudflare AI Playground এক্সিকিউটরের জন্য সম্পূর্ণ ডেস্কটপ Chrome বাইনারি পাথ; হেডলেস ফিঙ্গারপ্রিন্ট যাচাই Playwright-এর বান্ডেল করা Chromium ব্লক করলে এটি ব্যবহৃত হয়। |
| `CLOUDFLARE_API_BASE` | `https://api.cloudflare.com/client/v4` | `src/app/api/settings/proxy/cloudflare-deploy/route.ts` | প্রক্সি-পুল Workers রিলে ডিপ্লয়ার দ্বারা ব্যবহৃত Cloudflare REST API বেস ওভাররাইড করুন (#4640 / 9router#1360)। |
| `NEXT_PUBLIC_CLOUDFLARE_RELAY_DEFAULT_PROJECT` | `omniroute-relay` | `src/app/(dashboard)/dashboard/settings/components/proxy/CloudflareRelayModal.tsx` | প্রক্সি-পুলের "Deploy Relay" মোডালে প্রস্তাবিত ডিফল্ট ওয়ার্কার প্রজেক্টের নাম। |
| `NEXT_PUBLIC_CLOUDFLARE_RELAY_ENABLED` | `true` | `src/app/(dashboard)/dashboard/settings/components/proxy/ProxyPoolTab.tsx` | Proxy Pool ট্যাব থেকে Cloudflare Workers রিলে অপশনটি লুকাতে `false` সেট করুন। |
| `CLOUDFLARED_BIN` | স্বয়ংক্রিয়ভাবে শনাক্তকরণ | `src/lib/cloudflaredTunnel.ts` | `cloudflared` বাইনারির কাস্টম পাথ। |
| `CLOUDFLARED_PROTOCOL` | `http2` | `src/lib/cloudflaredTunnel.ts` | টানেল ট্রান্সপোর্ট প্রোটোকল: `http2` (ডিফল্ট), `quic`, অথবা `auto`। |
| `CLOUDFLARED_CONFIG` | _(সেট করা নেই)_ | `src/lib/cloudflaredTunnel.ts` | স্থানীয়ভাবে পরিচালিত cloudflared `config.yml`-এর পাথ (`tunnel:`, `credentials-file:`, `ingress:`-সহ)। এটি সেট করা থাকলে OmniRoute একটি অস্থায়ী কুইক টানেলের পরিবর্তে `tunnel --config run` (নামযুক্ত টানেল) চালায়। |
| `CLOUDFLARED_HOSTNAME` | _(কনফিগের ingress থেকে)_ | `src/lib/cloudflaredTunnel.ts` | নামযুক্ত টানেলের পাবলিক হোস্টনেমের জন্য ওভাররাইড (যেমন `ai.example.com`), যা `publicUrl`/`apiUrl` হিসেবে রিপোর্ট করা হয়। সেট করা না থাকলে এটি কনফিগের প্রথম `ingress` হোস্টনেম থেকে পড়া হয়। |
| `DENO_DEPLOY_API_BASE` | `https://api.deno.com/v2` | `src/app/api/settings/proxy/deno-deploy/route.ts` | proxy-pool রিলে ডিপ্লয়ার দ্বারা ব্যবহৃত Deno Deploy REST API বেস ওভাররাইড করে (#4643 / 9router#1437)। |
| `NEXT_PUBLIC_DENO_RELAY_DEFAULT_PROJECT` | `omniroute-deno-relay` | `src/app/(dashboard)/dashboard/settings/components/proxy/DenoRelayModal.tsx` | proxy-pool-এর "Deploy Relay" মোডালে প্রস্তাবিত ডিফল্ট Deno Deploy অ্যাপের নাম। |
| `NEXT_PUBLIC_DENO_RELAY_ENABLED` | `true` | `src/app/(dashboard)/dashboard/settings/components/proxy/ProxyPoolTab.tsx` | Proxy Pool ট্যাব থেকে Deno Deploy রিলে অপশনটি লুকাতে `false`-এ সেট করুন। |
| `SEARCH_CACHE_TTL_MS` | `300000` (৫ মিনিট) | `open-sse/services/searchCache.ts` | সার্চ API (Perplexity, Brave ইত্যাদি) রেসপন্স ক্যাশিংয়ের TTL। |
| `ENABLE_CC_COMPATIBLE_PROVIDER` | `false` | `src/shared/utils/featureFlags.ts` | শুধুমাত্র Claude Code-এর রিলেগুলোর জন্য পরীক্ষামূলক CC-সামঞ্জস্যপূর্ণ প্রোভাইডার UI প্রদর্শন করে। |
| `NINEROUTER_HOST` | `127.0.0.1` | `open-sse/executors/ninerouter.ts` | এম্বেডেড 9router ইনস্ট্যান্স যে হোস্টে শোনে, সেটি ওভাররাইড করে। |
| `NINEROUTER_PORT` | `20130` | `open-sse/executors/ninerouter.ts` | এম্বেডেড 9router ইনস্ট্যান্স যে পোর্টে শোনে, সেটি ওভাররাইড করে। |
| `EMBED_WS_PROXY_HOST` | `127.0.0.1` | `src/lib/services/embedWsProxy.ts` | এম্বেডেড-সার্ভিস WebSocket প্রক্সির বাইন্ড হোস্ট (ডিফল্টভাবে শুধু লুপব্যাক)। |
| `EMBED_WS_PROXY_PORT` | `20131` | `src/lib/services/embedWsProxy.ts` | এম্বেডেড-সার্ভিস WebSocket প্রক্সি সার্ভারের পোর্ট। |
| `CLIPROXYAPI_HOST` | `127.0.0.1` | `open-sse/executors/cliproxyapi.ts` | CLIProxyAPI ব্রিজ হোস্ট (লিগ্যাসি ইন্টিগ্রেশন)। |
| `CLIPROXYAPI_PORT` | `5544` | `open-sse/executors/cliproxyapi.ts` | 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 যে হোস্ট ইন্টারফেসে `cliproxyapi` সাইডকার প্রকাশ করে (#12578)। এর ডেটা ভলিউমে প্রোভাইডারের OAuth/API ক্রেডেনশিয়াল থাকে এবং পিন করা ইমেজে পরিবেশ-ভিত্তিক ডেটা-প্লেন `api-keys` ওভাররাইড নেই (শুধু একটি মাউন্ট করা `config.yaml` আছে), তাই `0.0.0.0` পুরো LAN-এর কাছে ক্রেডেনশিয়াল-ধারণকারী একটি সার্ভিস উন্মুক্ত করে। |
| `MUX_SERVICE_PORT` | `8322` | `src/lib/services/bootstrap.ts` | এম্বেডেড Mux (coder/mux) এজেন্ট-অর্কেস্ট্রেশন ডেমন যে পোর্টে শোনে, সেটি ওভাররাইড করে (সর্বদা 127.0.0.1)। |
| `OPENWA_SERVICE_PORT` | `8323` | `src/lib/services/bootstrap.ts` | এম্বেডেড open-wa (WhatsApp Web অটোমেশন) ডেমন যে পোর্টে শোনে, সেটি ওভাররাইড করে (সর্বদা 127.0.0.1)। |
| `DARIO_HOST` | `127.0.0.1` | `open-sse/executors/dario.ts` | Dario এম্বেডেড-সার্ভিসের বাইন্ড/কানেক্ট হোস্ট (ডিফল্টভাবে শুধু লুপব্যাক)। |
| `DARIO_PORT` | `3456` | `open-sse/executors/dario.ts` | Dario এম্বেডেড-সার্ভিস পোর্ট। |
| `DARIO_HOST` | `127.0.0.1` | `open-sse/executors/dario.ts` | Dario এম্বেডেড-সার্ভিসের বাইন্ড/কানেক্ট হোস্ট (ডিফল্টভাবে শুধু লুপব্যাক)। |
| `DARIO_PORT` | `3456` | `open-sse/executors/dario.ts` | Dario এম্বেডেড-সার্ভিসের পোর্ট। |
| `LOCAL_HOSTNAMES` | _(খালি)_ | `open-sse/config/providerRegistry.ts` | "লোকাল" হিসেবে বিবেচিত কমা দিয়ে পৃথক করা অতিরিক্ত হোস্টনেম (Docker সার্ভিসের নাম ইত্যাদি)। |
`ENABLE_CC_COMPATIBLE_PROVIDER` কেবল সেইসব তৃতীয়-পক্ষের রিলের জন্য, যেগুলো একচেটিয়াভাবে Claude Code ক্লায়েন্ট গ্রহণ করে।
OmniRoute অনুরোধগুলো পুনর্লিখন করে, যাতে ওই রিলেগুলো সেগুলো গ্রহণ করে। আপনি যদি শুধু
Claude Code CLI ব্যবহার করতে চান, অথবা এই রিলেগুলো কী তা নিশ্চিত না হন, তাহলে এটি নিষ্ক্রিয় রাখুন এবং এর পরিবর্তে একটি নিয়মিত
Anthropic-সামঞ্জস্যপূর্ণ প্রোভাইডার যোগ করুন।
---
## 21. প্রক্সি স্বাস্থ্য
| ভেরিয়েবল | ডিফল্ট | সোর্স ফাইল | বিবরণ |
| ------------------------------------------------- | ------------------------ | ------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `PROXY_FAST_FAIL_TIMEOUT_MS` | `2000` | `src/lib/proxyHealth.ts` | ফাস্ট-ফেইল স্বাস্থ্য পরীক্ষার টাইমআউট। |
| `PROXY_LATENCY_WINDOW_HOURS` | `3` | `src/lib/db/proxies.ts` | লেটেন্সি-অপ্টিমাইজড পুল কৌশলে প্রার্থী প্রক্সিগুলোর গড় লেটেন্সি গণনার সময়সীমা (ঘণ্টায়)। |
| `PROXY_HEALTH_CACHE_TTL_MS` | `30000` | `src/lib/proxyHealth.ts` | স্বাস্থ্য পরীক্ষার ফলাফলের ক্যাশ TTL। |
| `PROXY_HEALTH_UNHEALTHY_CACHE_TTL_MS` | `2000` | `src/lib/proxyHealth.ts` | ব্যর্থ প্রক্সি স্বাস্থ্য প্রোবের ক্যাশ TTL। এটিকে `PROXY_HEALTH_CACHE_TTL_MS`-এর চেয়ে কম রাখুন, যাতে উচ্চ সমকালীনতার সময় সাময়িক প্রক্সি টাইমআউট হলে দ্রুত পুনরায় চেষ্টা করা যায় এবং প্রকৃতপক্ষে অচল প্রক্সিগুলোর জন্য ফাস্ট-ফেইল নিষ্ক্রিয় না হয়। |
| `PROXY_HEALTH_ENABLED` | `true` | `src/lib/proxyHealth/scheduler.ts` | নিবন্ধিত প্রক্সিগুলোকে পর্যায়ক্রমে পরীক্ষা করা ব্যাকগ্রাউন্ড প্রক্সি স্বাস্থ্য শিডিউলার নিষ্ক্রিয় করতে `false` সেট করুন। |
| `PROXY_HEALTH_INTERVAL_MS` | `600000` | `src/lib/proxyHealth/scheduler.ts` | ব্যাকগ্রাউন্ড স্বাস্থ্য শিডিউলারের সুইপ ব্যবধান মিলিসেকেন্ডে (সর্বনিম্ন `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` | শিডিউলার এবং `/api/settings/proxies/auto-test` এন্ডপয়েন্টের ব্যবহৃত সংযোগযোগ্যতা পরীক্ষার লক্ষ্য। সর্বজনীন ডিফল্ট এড়াতে এটিকে কোনো অভ্যন্তরীণ/স্ব-হোস্টেড URL-এ নির্দেশ করুন। |
| `PROXY_HEALTH_TEST_CONCURRENCY` | `10` | `src/lib/proxyHealth/probeTarget.ts` | প্রতি ব্যাচে একসঙ্গে শুরু হওয়া পরীক্ষার সংখ্যা, যা শিডিউলার এবং `/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` | প্রক্সির জন্য নির্ধারিত প্রোভাইডারের প্রকৃত হোস্টে পরীক্ষা (`GET /models`, কোনো API কী নয়) বন্ধ করতে "false" নির্ধারণ করুন এবং পরিবর্তে সবসময় `PROXY_HEALTH_TEST_URL` ব্যবহার করুন। |
| `PROXY_HEALTH_AUTO_DEACTIVATE` | `false` | `src/lib/proxyHealth/statusPolicy.ts` | `false` (ডিফল্ট) হলে, স্বয়ংক্রিয় সংযোগযোগ্যতা পরীক্ষাগুলো (শিডিউলার + `/api/settings/proxies/auto-test`-এর "সব পরীক্ষা করুন" বোতাম) **শুধু-পঠনযোগ্য** থাকে এবং কখনোই কোনো প্রক্সির স্ট্যাটাস পরিবর্তন করে না—শুধু অপারেটরই সক্রিয়/নিষ্ক্রিয় অবস্থা নির্ধারণ করেন, ফলে কোনো অস্থিতিশীল পরীক্ষা নির্ধারিত প্রক্সিকে আটকে দিতে পারে না (#6246)। আগের পরীক্ষা-ও-নির্ধারণ আচরণ পুনরুদ্ধার করতে `true` নির্ধারণ করুন। |
| `FLUSH_EMPTY_RETRY_ENABLED` | `false` | `src/shared/utils/featureFlags.ts` | ঐচ্ছিকভাবে সক্রিয় করার ফিচার ফ্ল্যাগ ([FEATURE_FLAGS.md](./FEATURE_FLAGS.md) দেখুন; ড্যাশবোর্ড DB ওভাররাইড অগ্রাধিকার পায়)। `true` (অথবা `1`, `yes`) হলে, খালি 200 বা খালি-কনটেন্ট 502 প্রকাশ করার পরিবর্তে স্বাভাবিক ক্রেডেনশিয়াল পাথের মাধ্যমে খালি অনূদিত স্ট্রিমিং টার্নগুলো পুনরায় চেষ্টা করা হয় (`STREAM_RECOVERY.EMPTY_TURN_RETRY_MAX` সংখ্যক পুনঃচেষ্টা পর্যন্ত)। |
| `PROXY_POOL_EGRESS_OBSERVATION` | `false` | `src/shared/utils/featureFlags.ts` | ঐচ্ছিকভাবে সক্রিয় করার ফিচার ফ্ল্যাগ ([FEATURE_FLAGS.md](./FEATURE_FLAGS.md) দেখুন; ড্যাশবোর্ড DB ওভাররাইড অগ্রাধিকার পায়)। `true` (অথবা `1`, `yes`) হলে, ড্যাশবোর্ডে কোনো প্রক্সি পুলের অধীনে শুধু-পঠনযোগ্য পুল বহির্গমন পর্যবেক্ষণ দেখানো হয় (প্রক্সি লগ থেকে গত 24 h-এর স্বতন্ত্র বহির্গামী IP, সংযোগ এবং একটি IP-এর পেছনে সর্বাধিকবার দেখা সংখ্যা)। রাউটিংয়ের জন্য কখনোই ব্যবহৃত হয় না। |
| `PROXY_AUTO_REMOVE` | `false` | `src/lib/proxyHealth/scheduler.ts` | বারবার ধারাবাহিক ব্যর্থতার পর শিডিউলারকে স্বয়ংক্রিয়ভাবে প্রক্সি অপসারণ করতে দিতে `true` সেট করুন। |
| `PROXY_AUTO_REMOVE_AFTER` | `3` | `src/lib/proxyHealth/scheduler.ts` | শিডিউলার কোনো প্রক্সি স্বয়ংক্রিয়ভাবে অপসারণ করার আগের ধারাবাহিক ব্যর্থতার সংখ্যা (যখন `PROXY_AUTO_REMOVE=true`)। |
| `PROXY_AUTO_DISABLE` | `false` | `src/lib/proxyHealth/scheduler.ts` | বারবার ধারাবাহিক ব্যর্থতার পর কোনো প্রক্সি অপসারণের পরিবর্তে সেটিকে সফট-ডিসেবল (স্ট্যাটাস `dead`, কখনো মুছে ফেলা হয় না) করতে শিডিউলারকে অনুমতি দিতে `true` সেট করুন। এটি `PROXY_AUTO_REMOVE`-এর একটি অ-ধ্বংসাত্মক বিকল্প: প্রক্সিটি অবিলম্বে পুল/রোটেশন রেজোলিউশন থেকে বাদ পড়ে (স্কোপ-পুল রেজোলিউশনে ব্যবহৃত অ্যালাইভ-স্ট্যাটাস ফিল্টার আগে থেকেই এটিকে বাদ দেয়) এবং আবার প্রোব পাস করতে শুরু করলে স্বয়ংক্রিয়ভাবে পুনরায় সক্রিয় হয়। এটি `PROXY_AUTO_REMOVE_AFTER` থ্রেশহোল্ড ব্যবহার করে। উভয় ফ্ল্যাগ `true` হলে, `PROXY_AUTO_REMOVE` অগ্রাধিকার পায়। |
| `OMNIROUTE_CONTROL_PLANE_PROXY_DIRECT_FALLBACK` | `false` | `src/shared/constants/featureFlagDefinitions.ts` | প্রক্সির নাগালযোগ্যতার প্রাক-পরীক্ষা ব্যর্থ হলে OAuth এবং প্রোভাইডার যাচাইকরণ ফ্লোকে পিন করা প্রক্সি বাইপাস করে সরাসরি সংযোগ করার অনুমতি দিন। কার্যকর অগ্রাধিকারের ক্রম হলো Feature Flags DB ওভাররাইড > env var > ডিফল্ট। |
| `RATE_LIMIT_MAX_WAIT_MS` | `30000` (৩০ সে.) | `src/lib/resilience/settings.ts` | ডিফল্ট **কিউ-অপেক্ষা** বাজেট: কোনো রিকোয়েস্ট প্রত্যাখ্যাত হওয়ার আগে প্রোভাইডার স্লটের জন্য কতক্ষণ অপেক্ষা করতে এবং কিউতে থাকতে পারে, যেখানে তা কখনোই আপস্ট্রিমে পৌঁছায় না। জবটি কার্যকর হওয়া শুরু করলেই টাইমারটি পরিষ্কার করা হয়—এক্সিকিউশন আলাদাভাবে `RATE_LIMIT_EXECUTION_MAX_WAIT_MS` দ্বারা সীমাবদ্ধ। Env কেবল ডিফল্ট নির্ধারণ করে: সংরক্ষিত `resilienceSettings.requestQueue.maxWaitMs`, এবং তারপর প্রতি-সংযোগের `rateLimitOverrides.maxWaitMs`, উভয়ই পর্যায়ক্রমে এর ওপর অগ্রাধিকার পায়। |
| `RATE_LIMIT_EXECUTION_MAX_WAIT_MS` | `600000` (১০ মিনিট) | `open-sse/services/rateLimitManager.ts` | অনুমোদিত কোনো রিকোয়েস্টের রেট-লিমিট রিজার্ভেশনের মেয়াদ শেষ হওয়ার আগে সেটি সর্বোচ্চ কতক্ষণ এক্সিকিউশনে থাকতে পারে—এটি কিউ-অপেক্ষা বাজেট থেকে স্বতন্ত্র, যাতে নন-ইনক্রিমেন্টাল গেটওয়েতে ধীর fetch-start টাইম আউট না হয় (#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` | সংরক্ষিত Dashboard সেটিং নির্বিশেষে স্বয়ংক্রিয়ভাবে চালু হওয়া রেট-লিমিট সুরক্ষা ব্যবস্থা জোর করে চালু/বন্ধ করুন। জোর করে চালু করতে `true`/`1`/`on` এবং জোর করে বন্ধ করতে `false`/`0`/`off` গ্রহণ করে। |
| `PROVIDER_COOLDOWN_ENABLED` | _(সেট করা নেই → বন্ধ)_ | `open-sse/services/providerCooldownTracker.ts` | অপ্ট-ইন বৈশ্বিক ক্রস-রিকোয়েস্ট প্রদানকারী/সংযোগ কুলডাউন ট্র্যাকিং। ডিফল্টভাবে বন্ধ (Connection Cooldown / Provider Circuit Breaker-এর সঙ্গে ওভারল্যাপ করে)। সক্রিয় করতে `true`/`1`/`on` গ্রহণ করে। |
| `PROVIDER_COOLDOWN_MIN_MS` | `5000` | `open-sse/services/providerCooldownTracker.ts` | ব্যর্থ প্রদানকারী/সংযোগ পুনরায় চেষ্টা করার আগে সর্বনিম্ন কুলডাউন (ms)। ধারাবাহিক ব্যর্থতার সঙ্গে সূচকীয়ভাবে বৃদ্ধি পায়। শুধু `PROVIDER_COOLDOWN_ENABLED` সক্রিয় থাকলেই ব্যবহৃত হয়। |
| `PROVIDER_COOLDOWN_MAX_MS` | `300000` (5 মিনিট) | `open-sse/services/providerCooldownTracker.ts` | ব্যর্থ প্রদানকারী/সংযোগ যেকোনো অবস্থায় পুনরায় চেষ্টা করার আগে সর্বোচ্চ কুলডাউন (ms)-এর সীমা। শুধু `PROVIDER_COOLDOWN_ENABLED` সক্রিয় থাকলেই ব্যবহৃত হয়। |
| `STREAM_RECOVERY_ENABLED` | _(সেট করা নেই → বন্ধ)_ | `src/lib/resilience/settings.ts` (সিড) → `open-sse/services/streamRecovery.ts` (লজিক) | **কী:** ছেঁটে যাওয়া আপস্ট্রিম স্ট্রিমের স্বচ্ছ পুনরুদ্ধার (free-claude-code পোর্ট)। প্রারম্ভিক SSE উইন্ডোটি `STREAM_RECOVERY.HOLDBACK_MS` (750 ms) পর্যন্ত ধরে রাখে, যাতে কোনো _প্রি-কমিট_ বিচ্ছিন্নতা—ক্লায়েন্টের কাছে কোনো বাইট পৌঁছানোর আগেই যা ঘটে—পুনরায় খুলে অদৃশ্যভাবে আবার চেষ্টা করা যায়। **কখন সক্রিয় করবেন:** অস্থিতিশীল আপস্ট্রিমে, যেখানে স্ট্রিম শুরুর সময় ঘন ঘন 0-বাইট ট্রাঙ্কেশন ঘটে; প্রতিটি স্ট্রিমে প্রথম টোকেন পেতে সর্বোচ্চ 750 ms অতিরিক্ত সময় গ্রহণযোগ্য না হলে বন্ধ রাখুন। `true`/`1`/`on` গ্রহণ করে। সংরক্ষিত Resilience সেটিংয়ের প্রাথমিক মান নির্ধারণ করে; Dashboard সেটিং একবার নির্ধারিত হলে সেটিই অগ্রাধিকার পায়। |
| `STREAM_RECOVERY_MIDSTREAM_ENABLED` | _(সেট করা নেই → বন্ধ)_ | `src/lib/resilience/settings.ts` (সিড) → `open-sse/services/streamRecovery.ts` (লজিক) | **কী:** স্ট্রিমের মাঝপথে ধারাবাহিকতা (Fase 4.4)—কোনো _পোস্ট-কমিট_ ট্রাঙ্কেশনের পর (বাইট ইতিমধ্যে ক্লায়েন্টের কাছে পৌঁছেছে), আংশিক টেক্সটকে assistant প্রিফিল হিসেবে দিয়ে পুনরায় অনুরোধ করে এবং অনুপস্থিত সাফিক্স জোড়া দেয়। শুধু প্লেইন-টেক্সট OpenAI-সামঞ্জস্যপূর্ণ স্ট্রিমের জন্য; কোনো টুল কল চলমান থাকলে কখনোই সক্রিয় হয় না। **কখন সক্রিয় করবেন:** দীর্ঘ জেনারেশন উত্তরের মাঝপথে কেটে গেলে এবং পুনরুদ্ধার করা শেষাংশ টোকেন-বাই-টোকেনের বদলে একসঙ্গে পৌঁছানো গ্রহণযোগ্য হলে। `STREAM_RECOVERY_ENABLED` থেকে স্বাধীন (ঝুঁকির ধরন আলাদা)। `true`/`1`/`on` গ্রহণ করে। |
| `STREAM_THROUGHPUT_WATCHDOG_ENABLED` | _(সেট করা নেই → বন্ধ)_ | `src/lib/resilience/settings.ts` → `open-sse/services/throughputWatchdog.ts` | অপ্ট-ইন সক্রিয়-স্ট্রিম উপযোগী-আউটপুট ওয়াচডগ। যেসব স্ট্রিম চাঙ্ক পাঠাতে থাকে কিন্তু কনফিগার করা assistant-আউটপুট হারের নিচে থাকে, সেগুলো শনাক্ত করে; হার্টবিট, ব্যবহার ইভেন্ট, খালি ডেল্টা এবং টুল/রিজনিং পর্যায়কে অগ্রগতি হিসেবে ভুলভাবে গণ্য করা হয় না। নিষ্ক্রিয়তা ও হার্ড-ডেডলাইন টাইমআউট থেকে পৃথক। |
| `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 assistant-আউটপুট বাইট হার (রক্ষণশীল টোকেন প্রক্সি), 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` | বার্স্টিং প্রতিরোধ করতে প্রোভাইডার টোকেন হেলথচেকগুলোর মধ্যে `HEALTHCHECK_STAGGER_MS`-এর সঙ্গে যোগ করা সর্বনিম্ন র্যান্ডমাইজড জিটার (ms) (Issue #1220)। |
| `HEALTHCHECK_JITTER_MAX_MS` | `5000` | `src/lib/tokenHealthCheck.ts` | বার্স্টিং প্রতিরোধ করতে প্রোভাইডার টোকেন হেলথচেকগুলোর মধ্যে `HEALTHCHECK_STAGGER_MS`-এর সঙ্গে যোগ করা সর্বোচ্চ র্যান্ডমাইজড জিটার (ms) (Issue #1220)। |
| `HEALTHCHECK_BATCH_SIZE` | `20` | `src/lib/tokenHealthCheck.ts` | স্টার্টআপ টোকেন-হেলথচেক সুইপের জন্য সমবর্তী-চেক ব্যাচের আকার; বড় মান সমান্তরালে আরও বেশি সংযোগ পরীক্ষা করে, ছোট মান বার্স্ট লোড কমায় (Issue #7875, #7719-এর রিগ্রেশন)। |
| `REQUEST_RETRY` | `2` | `src/sse/services/cooldownAwareRetry.ts` | ক্লায়েন্টের কাছে ত্রুটি ফেরত দেওয়ার আগে মডেল-স্কোপড কুলডাউন রেসপন্সে স্বয়ংক্রিয় পুনঃচেষ্টার সংখ্যা। |
| `MAX_RETRY_INTERVAL_SEC` | `30` | `src/sse/services/cooldownAwareRetry.ts` | কুলডাউন পুনঃচেষ্টাগুলোর মধ্যবর্তী সর্বোচ্চ ব্যাকঅফ ব্যবধান (সেকেন্ড)। আপস্ট্রিম `Retry-After` যা-ই হোক, এই মান দ্বারা সীমাবদ্ধ। |
| `HEADROOM_URL` | `http://localhost:8787` | `src/lib/headroom/detect.ts` | Headroom টোকেন-সেভার প্রক্সি URL। ড্যাশবোর্ড লাইফসাইকেল (`api/headroom/*`) ডিফল্টভাবে লুপব্যাকে একটি স্থানীয় `headroom-ai` CLI চালু করে; শুধু কোনো বহিরাগত Docker সাইডকার প্রক্সির দিকে নির্দেশ করতে হলে ওভাররাইড করুন। |
### স্ট্রিম-রিকভারি টিউনিং ধ্রুবকসমূহ
রিকভারি হোল্ডব্যাক আচরণটি
`open-sse/config/constants.ts` (`STREAM_RECOVERY`)-এর হার্ডকোড করা ধ্রুবক দিয়ে টিউন করা হয়, রেফারেন্সের জন্য এখানে দেখানো হলো —
এগুলো পরিবর্তন করতে কোড সম্পাদনা করতে হবে, env var নয়:
- `STREAM_RECOVERY.HOLDBACK_MS = 750` — প্রারম্ভিক SSE উইন্ডোটি কতক্ষণ ধরে রাখা হয়,
যাতে ক্লায়েন্টের কাছে কোনো বাইট কমিট করার আগেই প্রাথমিক ট্রাঙ্কেশনের ক্ষেত্রে পুনঃচেষ্টা করা যায়।
- `STREAM_RECOVERY.BUFFER_MAX_BYTES = 65536` — ধরে রাখা উইন্ডোর কঠোর সীমা; টাইমার নির্বিশেষে,
এতগুলো বাইট জমা হওয়ার সঙ্গে সঙ্গেই কমিট (ফ্লাশ + পাসথ্রু) করা হয়।
- `STREAM_RECOVERY.EARLY_RETRY_MAX = 4` — হোল্ডব্যাকটি এখনও আনকমিটেড থাকা অবস্থায় আপস্ট্রিম
স্ট্রিম সর্বোচ্চ যতবার স্বচ্ছভাবে পুনরায় খোলা যায়।
> **প্রতি-প্রোভাইডার স্লাইডিং-উইন্ডো রেট লিমিট (কোনো env var নেই):** FCC থেকে পোর্ট করা
> প্রতি-প্রোভাইডার স্লাইডিং-উইন্ডো রেট-লিমিট _ফলব্যাক_ কোডে বিদ্যমান
> (`open-sse/services/providerDefaultRateLimit.ts`, যা
> `open-sse/services/rateLimitManager.ts`-এর মাধ্যমে সংযুক্ত), কিন্তু এটি একটি **খালি ডিফল্ট ম্যাপ**সহ
> সরবরাহ করা হয় এবং বর্তমানে এর **কোনো অপারেটর env var নেই** — এটি কেবল একটি টেস্ট হুক /
> কোড সম্পাদনার মাধ্যমে সক্রিয় করা যায়। ইচ্ছাকৃতভাবেই এটি উপরের টেবিলে তালিকাভুক্ত করা হয়নি। প্রতি-`(token, IP)`
> রিলে লিমিটারে _বাস্তবেই_ একটি নিয়ন্ত্রণযোগ্য সেটিং রয়েছে, সেটি হলো `RELAY_IP_PER_MINUTE` (§3 নেটওয়ার্ক ও পোর্টসমূহ)।
---
## 22. ডিবাগিং
> [!CAUTION]
> এই ভেরিয়েবলগুলো **বিস্তারিত আউটপুট** তৈরি করে এবং সংবেদনশীল ডেটা ফাঁস করতে পারে। **প্রোডাকশনে কখনোই সক্রিয় করবেন না।**
| ভেরিয়েবল | ডিফল্ট | সোর্স ফাইল | বিবরণ |
| ------------------------------------- | ------------------------------- | ----------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| `CURSOR_DEBUG` | _(সেট করা নেই)_ | `open-sse/executors/cursor.ts` | বিস্তারিত Cursor executor লগ (ডিকোড করা SSE chunk ইত্যাদি) সক্রিয় করতে `1` সেট করুন। |
| `CURSOR_STREAM_DEBUG` | _(সেট করা নেই)_ | `open-sse/executors/cursor.ts` | `CURSOR_DEBUG`-এর পশ্চাৎ-সামঞ্জস্যপূর্ণ alias। |
| `CURSOR_DUMP_FILE` | _(সেট করা নেই)_ | `open-sse/executors/cursor.ts` | `CURSOR_DEBUG=1` হলে raw ডিকোড করা Cursor chunk গ্রহণ করে এমন ঐচ্ছিক ফাইল path। |
| `CURSOR_STREAM_TIMEOUT_MS` | `300000` | `open-sse/executors/cursor.ts` | Cursor executor-এর জন্য stream নিষ্ক্রিয়তার timeout (ms)। |
| `CURSOR_KV_GRACE_MS` | `2000` | `open-sse/executors/cursor.ts` | byte buffer-এ অবশিষ্ট থাকলে composer kv_after_text soft terminator-এর পর grace window (ms)—এটি পরবর্তী exec_mcp tool call-কে তার frame সম্পূর্ণ করার সময় দেয়। |
| `CURSOR_TOOL_DIRECTIVE` | সক্রিয় (`!== "0"`) | `open-sse/executors/cursor.ts` | tool-commit directive, যা composer-2.5-কে নির্ভরযোগ্যভাবে tool call ইস্যু করায়। নিষ্ক্রিয় করতে `0` সেট করুন। |
| `OMNIROUTE_SYSTEM_INSTRUCTION_APPEND` | _(সেট করা নেই)_ | `open-sse/translator/request/claude-to-openai.ts`, `open-sse/translator/response/openai-to-claude.ts` | অপারেটর-নির্ধারিত system prompt-এর text, যা অনুবাদের পরে system message-এ যোগ করা হয় (post-translation injection) এবং codex/Responses ও `/v1/messages` path-এ পৌঁছায়। প্রতিধ্বনিত system preamble block থেকে বাদ দেওয়া directive prefix হিসেবেও এটি ব্যবহৃত হয়। নিষ্ক্রিয় রাখতে সেট না করে রাখুন। |
| `OMNIROUTE_STRIP_SYSTEM_PREAMBLE` | `0` (বন্ধ) | `open-sse/translator/response/openai-to-claude.ts`, `open-sse/utils/directivePreambleStripper.ts` | একটি openai→claude stream-এর শুরু থেকে প্রতিধ্বনিত system-prompt preamble block বাদ দিতে `1` সেট করুন। ডিফল্টভাবে বন্ধ—heuristic-গুলো ইংরেজি গদ্য-কেন্দ্রিক এবং response payload পরিবর্তন করে, তাই বৈধভাবে এমন section দিয়ে শুরু হওয়া reply-এর সেই অংশ হারিয়ে যাবে। |
| `CURSOR_IMAGE_FETCH_TIMEOUT_MS` | `15000` | `open-sse/utils/cursorImages.ts` | remote `image_url` vision input-এর জন্য প্রতি-image fetch timeout (ms)। |
| `CURSOR_STATE_DB_PATH` | _(অনুসন্ধান করা হয়)_ | `open-sse/utils/cursorVersionDetector.ts` | IDE version শনাক্তকরণের জন্য ব্যবহৃত Cursor IDE state DB lookup override করে। |
| `CURSOR_AGENT_CLI_VERSION` | _(শনাক্ত / pin)_ | `open-sse/utils/cursorAgentCliVersion.ts` | Agent Run-এ `x-cursor-client-version: cli-…`-এর জন্য Agent CLI build id (`YYYY.MM.DD-`)। |
| `CURSOR_AGENT_BIN` | _(সেট করা নেই)_ | `open-sse/handlers/imageGeneration/providers/cursorAgentImage.ts` | image generation-এর জন্য ব্যবহৃত Cursor Agent binary-এর path। সেট করা না থাকলে handler প্রথমে `providerSpecificData.agentBin`, তারপর PATH ব্যবহার করে। |
| `CURSOR_IMG_TIMEOUT_MS` | `210000` | `open-sse/handlers/imageGeneration/providers/cursorAgentImage.ts` | Cursor Agent image job-এর জন্য প্রতি-image wall-clock সময়সীমা (ms)। |
| `CURSOR_IMG_MAX_CONCURRENT` | `2` | `open-sse/handlers/imageGeneration/providers/cursorAgentImage.ts` | Cursor image job-এর জন্য shared-seat concurrency gate। |
| `CURSOR_IMG_MODEL` | request / `auto` | `open-sse/handlers/imageGeneration/providers/cursorAgentImage.ts` | image job-এর জন্য Cursor CLI `--model` override করে। |
| `UC_IMAGE_POLL_INTERVAL_MS` | `2000` | `open-sse/handlers/imageGeneration/providers/ucImage.ts` | UC (uncensored.com) image-gen ফলাফল poll করার বিরতি (ms)। |
| `UC_IMAGE_POLL_TIMEOUT_MS` | `60000` | `open-sse/handlers/imageGeneration/providers/ucImage.ts` | UC image-gen ফলাফল poll করার wall-clock সময়সীমা (ms)। |
| `UC_VIDEO_POLL_INTERVAL_MS` | `3000` | `open-sse/handlers/videoGeneration/providers/ucVideo.ts` | UC (uncensored.com) video-gen ফলাফল poll করার বিরতি (ms)। |
| `UC_VIDEO_POLL_TIMEOUT_MS` | `300000` | `open-sse/handlers/videoGeneration/providers/ucVideo.ts` | UC video-gen ফলাফল poll করার wall-clock সময়সীমা (ms)। |
| `CURSOR_DATA_DIR` | _(অনুসন্ধান করা হয়)_ | `open-sse/utils/cursorAgentCliVersion.ts` | Cursor Agent CLI data dir (`…/versions/`) override করে; official agent-ও একই var ব্যবহার করে। |
| `CURSOR_TOKEN` | _(সেট করা নেই)_ | `scripts/ad-hoc/cursor-tap.cjs` | developer tooling দ্বারা ব্যবহৃত সরাসরি Cursor bearer token। |
| `OMNIROUTE_LOG_REQUEST_SHAPE` | নিষ্ক্রিয় (`"1"` দিয়ে opt-in) | `src/app/api/v1/chat/completions/route.ts` | `"1"` সেট করা হলে বড় chat payload-এর content-type/length marker log করে। log-এর অতিরিক্ত তথ্য কমাতে ডিফল্টভাবে বন্ধ। |
| `DEBUG_RESPONSES_SSE_TO_JSON` | _(সেট করা নেই)_ | `open-sse/handlers/responseTranslator.ts` | Responses API SSE→JSON অনুবাদের বিস্তারিত log করতে `true` সেট করুন। |
| `DEBUG_CLAUDE_NONSTREAM` | _(সেট করা নেই)_ | `open-sse/handlers/responseTranslator.ts` | Claude response অনুবাদ path-এ খালি textContent chunk প্রকাশ করতে `true` সেট করুন (শুধু ডিবাগের জন্য)। |
| `NEXT_PUBLIC_OMNIROUTE_E2E_MODE` | _(সেট করা নেই)_ | E2E test harness | E2E test mode (শিথিল auth, test hook) সক্রিয় করতে `true` সেট করুন। |
---
## 23. GitHub ইন্টিগ্রেশন
ব্যবহারকারীদের সরাসরি ড্যাশবোর্ড থেকে সমস্যা রিপোর্ট করার সুযোগ দিন।
| ভেরিয়েবল | ডিফল্ট | সোর্স ফাইল | বিবরণ |
| --------------------- | --------------- | --------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------- |
| `GITHUB_ISSUES_REPO` | _(সেট করা নেই)_ | `src/app/api/v1/issues/report/route.ts` | `owner/repo` ফরম্যাটে রিপোজিটরি। |
| `GITHUB_ISSUES_TOKEN` | _(সেট করা নেই)_ | `src/app/api/v1/issues/report/route.ts` | `issues:write` স্কোপসহ GitHub Personal Access Token। |
| `GITHUB_TOKEN` | _(সেট করা নেই)_ | ইস্যু ট্রায়াজ / ক্লাউড এজেন্ট হেল্পার | `GITHUB_ISSUES_TOKEN`-এর ফলব্যাক হিসেবে ব্যবহৃত এবং `src/lib/cloudAgent/*`-এর ক্লাউড এজেন্ট হেল্পারগুলো দ্বারা ব্যবহৃত সাধারণ GitHub অ্যাক্সেস টোকেন। |
---
## ডিপ্লয়মেন্ট পরিস্থিতি
রিলে ব্যাকএন্ড SRE নির্দেশনার জন্য (ts/bifrost/auto আচরণ, 9router বনাম CLIProxyAPI স্থাপন এবং উচ্চ-থ্রুপুট ফলব্যাক কৌশল), [রিলে ব্যাকএন্ড কৌশল](/docs/reference/RELAY_BACKEND_STRATEGY.md) দেখুন।
### ন্যূনতম লোকাল ডেভেলপমেন্ট
```bash
JWT_SECRET=$(openssl rand -base64 48)
API_KEY_SECRET=$(openssl rand -hex 32)
INITIAL_PASSWORD=dev123
PORT=20128
NODE_ENV=development
```
### Docker প্রোডাকশন
```bash
JWT_SECRET=
API_KEY_SECRET=
INITIAL_PASSWORD=
STORAGE_ENCRYPTION_KEY=
DATA_DIR=/data
PORT=20128
API_PORT=20129
NODE_ENV=production
AUTH_COOKIE_SECURE=true
REQUIRE_API_KEY=true
NEXT_PUBLIC_BASE_URL=https://omniroute.example.com
BASE_URL=http://localhost:20128
OMNIROUTE_MEMORY_MB=8192
CORS_ORIGIN=https://your-frontend.example.com
```
### এয়ার-গ্যাপড / CI
```bash
JWT_SECRET=test-jwt-secret-for-ci
API_KEY_SECRET=test-api-key-secret-for-ci
INITIAL_PASSWORD=testpass
NODE_ENV=production
OMNIROUTE_DISABLE_BACKGROUND_SERVICES=true
APP_LOG_TO_FILE=false
```
### রিভার্স প্রক্সিসহ VPS (nginx + Cloudflare)
```bash
JWT_SECRET=
API_KEY_SECRET=
STORAGE_ENCRYPTION_KEY=
PORT=20128
AUTH_COOKIE_SECURE=true
REQUIRE_API_KEY=true
NEXT_PUBLIC_BASE_URL=https://omniroute.example.com
BASE_URL=http://127.0.0.1:20128
CORS_ORIGIN=https://omniroute.example.com
ENABLE_TLS_FINGERPRINT=true
CLI_COMPAT_ALL=1
```
---
## 24. Skills স্যান্ডবক্স (v3.8.0+)
Skills ফ্রেমওয়ার্ক (`src/lib/skills/`) যখন স্যান্ডবক্স পরিবেশে ব্যবহারকারী-নির্ধারিত অটোমেশন চালায়, তখন প্রয়োগ করা সীমা ও নিরাপত্তা নিয়ন্ত্রণসমূহ।
| ভেরিয়েবল | ডিফল্ট | সোর্স ফাইল | বিবরণ |
| --------------------------------- | --------------------------------------------- | ------------------------------------------------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `SKILLS_SANDBOX_TIMEOUT_MS` | `10000` (10 সেকেন্ড) | `src/lib/skills/builtins.ts` | স্যান্ডবক্সকৃত স্কিল কোডের প্রতিটি এক্সিকিউশনের জন্য বাস্তব সময়ের টাইমআউট। এটি একটি কঠোর সীমা; এর চেয়ে বেশি সময় চললে প্রক্রিয়াটি বন্ধ করে দেওয়া হয়। |
| `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` | একটি স্কিল যেকোনো একক স্যান্ডবক্সকৃত ফাইল থেকে সর্বোচ্চ যত বাইট পড়তে পারবে। |
| `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 অক্ষরের কঠোর সর্বোচ্চ সীমা। |
| `SKILLS_SANDBOX_NETWORK_ENABLED` | `false` | `src/lib/skills/builtins.ts` | স্যান্ডবক্সের ভেতর থেকে আউটবাউন্ড নেটওয়ার্ক ব্যবহারের অনুমতি দিতে `1`/`true` নির্ধারণ করুন। নিরাপত্তার জন্য ডিফল্টভাবে **বিচ্ছিন্ন** থাকে। |
| `SKILLS_ALLOWED_SANDBOX_IMAGES` | _(খালি)_ | `src/lib/skills/builtins.ts` | স্যান্ডবক্স এক্সিকিউশনের জন্য অনুমোদিত কনটেইনার ইমেজগুলোর কমা দিয়ে পৃথক করা অ্যালাউলিস্ট। খালি থাকলে শুধুমাত্র বিল্ট-ইন ডিফল্ট ব্যবহৃত হবে। |
| `SKILLS_SANDBOX_DOCKER_IMAGE` | _(বিল্ট-ইন ডিফল্ট)_ | `src/lib/skills/` | Docker-সমর্থিত স্যান্ডবক্স চালু করার সময় ব্যবহৃত কনটেইনার ইমেজ। একটি কাস্টম হার্ডেনড বেস ইমেজ পিন করতে এটি ওভাররাইড করুন। |
| `SKILLS_SANDBOX_RUNTIME` | `auto` | `src/lib/skills/sandbox.ts`, `src/lib/skills/containerProvider.ts` | স্কিল স্যান্ডবক্সিংয়ের জন্য কনটেইনার রানটাইম: `auto` \| `docker` \| `apple` \| `wsl` \| `orbstack` \| `podman`। `auto` হোস্ট OS অনুযায়ী ইনস্টল করা সেরা রানটাইমটি বেছে নেয় (macOS-এ Apple Container/OrbStack, Windows-এ WSL Container, Linux-এ Podman), এবং প্রয়োজনে Docker-এ ফলব্যাক করে। |
> [!CAUTION]
> `SKILLS_SANDBOX_NETWORK_ENABLED=true` সক্রিয় করলে যেকোনো স্কিল কোডের জন্য একটি ইগ্রেস পথ খুলে যায়। শেয়ার্ড ডিপ্লয়মেন্টে এটি `OUTBOUND_SSRF_GUARD_ENABLED=true` এবং কঠোর `CORS_ORIGIN`/প্রক্সি নীতির সঙ্গে ব্যবহার করুন।
---
## 25. প্রদানকারীর কোটা, টানেল, ব্যাকআপ ও বিবিধ রানটাইম
প্রদানকারীর কোটা এন্ডপয়েন্ট, নেটওয়ার্ক টানেল (Tailscale, Ngrok, MITM ডিবাগ প্রক্সি), 1Proxy এগ্রেস পুল, ডেটাবেস ব্যাকআপ এবং এক্সিকিউটর স্তর বা স্ক্রিপ্টগুলোতে উল্লেখ করা ছোট ছোট ফিচারভিত্তিক ওভাররাইড।
| ভেরিয়েবল | ডিফল্ট | সোর্স ফাইল | বিবরণ |
| ---------------------------------------------- | --------------------------------------------------------------------------- | ------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `REDIS_URL` | `redis://localhost:6379` | `src/shared/utils/rateLimiter.ts` | রেট লিমিটার ব্যাকএন্ডের জন্য Redis সংযোগ স্ট্রিং। |
| `ALIBABA_CODING_PLAN_HOST` | _(প্রোডাকশন হোস্ট)_ | `open-sse/services/bailianQuotaFetcher.ts` | Alibaba Bailian coding-plan কোটা সংগ্রহে ব্যবহৃত হোস্ট ওভাররাইড করে। |
| `ALIBABA_CODING_PLAN_QUOTA_URL` | হোস্ট থেকে নির্ণীত | `open-sse/services/bailianQuotaFetcher.ts` | Alibaba Bailian-এর জন্য সম্পূর্ণ কোটা URL ওভাররাইড। |
| `QWEN_CLOUD_COOKIE` | _(সেট করা নেই)_ | `open-sse/services/qwenTokenPlanQuotaFetcher.ts` | Qwen Cloud / Model Studio-এর ব্যক্তিগত Token Plan কোটা গেটওয়ের জন্য কনসোল সেশন কুকি (ইনফারেন্স API কী এটি পড়তে পারে না)। home.qwencloud.com › Billing › Subscription (F12 › Network)-এ `cs-data.qwencloud.com`-এর যেকোনো `api.json` কল থেকে সম্পূর্ণ `Cookie` অনুরোধ হেডারটি কপি করুন—এতে `login_qwencloud_ticket` থাকে। এটি সংবেদনশীল এবং সেশন-সীমাবদ্ধ; প্রতি-সংযোগের `qwenCloudCookie` Dashboard ফিল্ড ব্যবহার করাই শ্রেয়। |
| `QWEN_CLOUD_SEC_TOKEN` | _(সেট করা নেই)_ | `open-sse/services/qwenTokenPlanQuotaFetcher.ts` | Token Plan কনসোল গেটওয়ের জন্য ম্যানুয়াল `sec_token` ওভাররাইড। সংবেদনশীল; সেট করা না থাকলে ফেচার কুকি ব্যবহার করে ড্যাশবোর্ড HTML থেকে এটি নির্ণয় করে। |
| `QWEN_TOKEN_PLAN_HOST` | `https://cs-data.qwencloud.com` | `open-sse/services/qwenTokenPlanQuotaFetcher.ts` | ব্যক্তিগত Token Plan কোটা ফেচারের জন্য গেটওয়ে হোস্ট ওভাররাইড (যেমন Model Studio কনসোলের জন্য `bailian-singapore-cs.alibabacloud.com`)। |
| `QWEN_TOKEN_PLAN_DASHBOARD_URL` | `https://home.qwencloud.com/` | `open-sse/services/qwenTokenPlanQuotaFetcher.ts` | লগইন করা HTML থেকে `sec_token` নির্ণয়ের জন্য ব্যবহৃত Dashboard URL। |
| `ALIBABA_FREE_TIER_VISION_FE_PATH` | `/costing-balance/free-quota-image-video` | `open-sse/services/alibabaFreeTierQuotaFetcher.ts` | Alibaba Model Studio-এর ফ্রি-টিয়ার ভিশন/মিডিয়া কোটা সংগ্রহের জন্য কনসোল ফ্রন্ট-এন্ড পাথ ওভাররাইড। |
| `ALIBABA_FREE_TIER_MULTIMODAL_FE_PATH` | `/costing-balance/free-quota-multimodal` | `open-sse/services/alibabaFreeTierQuotaFetcher.ts` | Alibaba Model Studio-এর ফ্রি-টিয়ার মাল্টিমোডাল কোটা আনার জন্য কনসোল ফ্রন্ট-এন্ড পাথ ওভাররাইড। |
| `ALIBABA_FREE_TIER_AUDIO_FE_PATH` | `/costing-balance/free-quota-audio` | `open-sse/services/alibabaFreeTierQuotaFetcher.ts` | Alibaba Model Studio-এর ফ্রি-টিয়ার অডিও কোটা আনার জন্য কনসোল ফ্রন্ট-এন্ড পাথ ওভাররাইড। |
| `ALIBABA_FREE_TIER_ALLOWLIST_PATH` | _(সেট করা নেই)_ | `open-sse/services/alibabaFreeTierAllowlist.ts` | বিল্ট-ইন Alibaba ফ্রি-টিয়ার টেক্সট-মডেল অ্যালাউলিস্টের জন্য স্থানীয় JSON ওভাররাইডের ঐচ্ছিক পাথ। প্রথমে `$DATA_DIR/alibaba-free-tier-allowlist.json`, তারপর `config/alibaba-free-tier-allowlist.json`-এ ফলব্যাক করে। |
| `CONTEXT_RESERVE_TOKENS` | `1024` | `open-sse/services/contextManager.ts` | প্রম্পট বাজেট গণনার সময় কমপ্লিশন আউটপুটের জন্য সংরক্ষিত টোকেন। |
| `CONTEXT_KEEP_LATEST_IMAGES` | `2` | `open-sse/services/contextManager.ts` | কনটেক্সট উইন্ডোতে স্থান সংকুলানের জন্য পুরোনো ইনলাইন ছবি বাদ দেওয়ার সময় সাম্প্রতিকতম কতটি ছবি রাখা হবে (#8560)। |
| `MODEL_ALIAS_COMPAT_ENABLED` | সক্রিয় | `open-sse/services/model.ts` | পুরোনো ক্লায়েন্টগুলোতে ব্যবহৃত লিগ্যাসি মডেল-অ্যালিয়াস সামঞ্জস্যতা স্তর টগল করে। |
| `OMNIROUTE_EMERGENCY_FALLBACK` | সক্রিয় | `open-sse/services/emergencyFallback.ts` | ব্যর্থ অনুরোধগুলোকে বিনামূল্যের `nvidia`/`openai/gpt-oss-120b` মডেলে পুনঃরাউট করা জরুরি বাজেট-নিঃশেষজনিত ফলব্যাক নিষ্ক্রিয় করতে `false` (বা `0`) সেট করুন। কার্যকর অগ্রাধিকারের ক্রম হলো Feature Flags DB ওভাররাইড > env var > ডিফল্ট; এটি অনুপলভ্য হলে সার্ভিসটি অপরিবর্তিত env মানে ফলব্যাক করে। |
| `COMMAND_CODE_CALLBACK_PORT` | _(সেট করা নেই)_ | `src/app/api/providers/command-code/auth/shared.ts` | Command Code CLI সহায়ক থেকে OAuth-ধাঁচের কলব্যাকের জন্য ব্যবহৃত স্থানীয় পোর্ট। |
| `COMMAND_CODE_VERSION` | `0.33.2` | `open-sse/executors/commandCode.ts` | Command Code আপস্ট্রিমে `x-command-code-version` হেডার হিসেবে পাঠানো মান। CLI সংস্করণ বাড়াতে ওভাররাইড করুন। |
| `COMMANDCODE_API_URL` | `https://api.commandcode.ai` | `open-sse/services/usage/command-code.ts` | স্মার্টফোন কোটা-ফেচার টেলিমেট্রিতে ব্যবহৃত Command Code ব্যবহার/কোটা আপস্ট্রিমের বেস URL। স্ব-হোস্টেড/বিকল্প Command Code API-এর জন্য ওভাররাইড করুন। |
| `MITM_LOCAL_PORT` | `443` | `src/mitm/server.cjs` | MITM ডিবাগ প্রক্সির জন্য লোকাল বাইন্ড পোর্ট। |
| `MITM_DISABLE_TLS_VERIFY` | `0` | `src/mitm/server.cjs` | আপস্ট্রিম TLS যাচাইকরণ নিষ্ক্রিয় করতে `1` সেট করুন (শুধু ডেভেলপমেন্টের জন্য)। |
| `MITM_IDLE_TIMEOUT_MS` | `60000` | `src/mitm/socketTimeouts.ts`, `src/mitm/server.cjs` | প্রক্সি করা সংযোগগুলোর নিষ্ক্রিয় সকেট টাইমআউট (ms); অর্ধ-খোলা টানেল থেকে রিসোর্স লিক এড়াতে এই সময়ের বেশি নিষ্ক্রিয় থাকা সকেটগুলো বন্ধ করে দেওয়া হয়। |
| `BRIDGE_PORT` | `20129` | `bin/antigravity-bridge.mjs` | Antigravity MITM ব্রিজ যে পোর্টে সংযোগের জন্য অপেক্ষা করে। |
| `ROUTER_URL` | `http://127.0.0.1:20128/v1/antigravity` | `bin/antigravity-bridge.mjs` | যে রাউটার এন্ডপয়েন্টে ব্রিজটি Antigravity ট্রাফিক ফরোয়ার্ড করে। |
| `CERT_DIR` | `~/.omniroute/mitm` | `bin/antigravity-bridge.mjs` | ব্রিজের TLS লিসেনারের জন্য `server.key`/`server.crt` ধারণকারী ডিরেক্টরি; যেকোনো একটি অনুপস্থিত থাকলে ব্রিজটি বন্ধ হয়ে যায়। |
| `MITM_VERBOSE` | `1` | `src/mitm/server.cjs`, `src/mitm/_internal/bypass.cjs` | রাউটিং-সিদ্ধান্ত লগের বিস্তারিততার মাত্রা: `0` লগিং বন্ধ করে, উচ্চতর মান আরও বেশি বাইপাস/রুট সিদ্ধান্ত লগ করে। |
| `MITM_ROOT_CA_ENABLED` | `false` | `src/mitm/manager.ts` | রুট-CA + প্রতি-হোস্ট-লিফ সার্টিফিকেট মডেল (#6684) বেছে নিতে `true` সেট করুন। নতুন ইনস্টলেশনগুলো এটি স্বয়ংক্রিয়ভাবে পায়; আগে থেকেই বিশ্বস্ত লিগ্যাসি লিফ থাকা ইনস্টলেশনগুলো বেছে না নেওয়া পর্যন্ত লিগ্যাসি ফিক্সড-SAN সার্টিফিকেটই রাখে। |
| `MITM_CERT_MODE` | `legacy` | `src/mitm/manager.ts`, `src/mitm/server.cjs` | চালু করা প্রক্সি প্রক্রিয়ার জন্য MITM ম্যানেজার এটি সেট করে (`root-ca` \| `legacy`) — এটি সার্টিফিকেট মাইগ্রেশন-সংক্রান্ত সিদ্ধান্ত প্রতিফলিত করে; ম্যানুয়ালি সেট করার জন্য নয়। |
| `OMNIROUTE_NO_SUDO` | `0` | `src/mitm/systemCommands.ts` | MITM সার্টিফিকেট-ট্রাস্ট কমান্ডগুলোর শুরু থেকে `sudo` বাদ দিতে `1` (truthy) সেট করুন — রুটবিহীন / ইউজার-নেমস্পেসড ডিপ্লয়মেন্টের জন্য, যেখানে অপারেটর ম্যানুয়ালি CA-কে বিশ্বাসযোগ্য হিসেবে সেট করেন (যেমন Node-এর অতিরিক্ত-CA-সার্টিফিকেট প্রক্রিয়ার মাধ্যমে)। |
| `SKIP_ANTIGRAVITY_DNS` | _(সেট করা নেই)_ | `src/mitm/dns/provision.ts` | Antigravity প্রক্সি হোস্টনামগুলোর জন্য `/etc/hosts` DNS এন্ট্রি প্রভিশনিং সম্পূর্ণভাবে এড়াতে `true` সেট করুন — যেসব কনটেইনারে sudo/root উপলভ্য নেই সেগুলোর জন্য। |
| `OMNIROUTE_SKIP_DNS_WRITE` | _(সেট করা নেই)_ | `src/mitm/dns/dnsConfig.ts` | DNS এন্ট্রি যোগ/অপসারণের সময় hosts ফাইলে লেখা এড়াতে `1` সেট করুন — স্যান্ডবক্সড বা রিড-অনলি পরীক্ষার পরিবেশের জন্য। |
| `OMNIROUTE_SKIP_SYSTEM_TRUST` | `0` | `src/mitm/cert/install.ts`, `src/mitm/tproxy/caTrust.ts` | শুধু টেস্ট/CI-এর জন্য সুরক্ষাব্যবস্থা: `1` সেট করলে সার্টিফিকেট ট্রাস্ট ইনস্টল/আনইনস্টল একটি no-op হবে, ফলে টেস্ট স্যুট কখনোই OS-এর ট্রাস্ট স্টোর পরিবর্তন করবে না। টেস্ট সেটআপ এবং CI ওয়ার্কফ্লো দ্বারা এটি স্বয়ংক্রিয়ভাবে সেট করা হয়। |
| `CHANGELOG_BASE_REF` | _(স্বয়ংক্রিয়)_ | `scripts/check/check-changelog-integrity.mjs` | anti CHANGELOG-eat গেটের জন্য সুস্পষ্ট বেস রেফ (ডিফল্টভাবে CI-তে PR-এর বেস ব্রাঞ্চ, অথবা সর্বোচ্চ `release/v*`)। |
| `FREE_PROXY_AUTO_SYNC_ENABLED` | `false` | `src/lib/freeProxyProviders/scheduler.ts` | ব্যাকগ্রাউন্ড ফ্রি-প্রক্সি পুলের অটো-সিঙ্ক শিডিউলার সক্রিয় করতে `true` সেট করুন। এটি অপ্ট-ইন এবং ডিফল্টভাবে বন্ধ। |
| `FREE_PROXY_AUTO_SYNC_INTERVAL_MS` | `1800000` | `src/lib/freeProxyProviders/scheduler.ts` | মিলিসেকেন্ডে অটো-সিঙ্কের বিরতি (ডিফল্ট 30 মিনিট)। |
| `FREE_PROXY_1PROXY_ENABLED` | `true` | `src/lib/freeProxyProviders/oneproxy.ts` | 1proxy ফ্রি প্রক্সি সোর্স সক্রিয় করুন। নিষ্ক্রিয় করতে `false` সেট করুন। |
| `FREE_PROXY_1PROXY_API_URL` | _(oneproxy.ts দেখুন)_ | `src/lib/freeProxyProviders/oneproxy.ts` | 1proxy API URL ওভাররাইড। |
| `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` | IPLocate প্রক্সি তালিকার বেস URL ওভাররাইড। |
| `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` | Webshare অ্যাকাউন্ট API টোকেন (`Authorization: Token `)। আবশ্যক—এটি ছাড়া প্রোভাইডার নিষ্ক্রিয় থাকে। |
| `FREE_PROXY_WEBSHARE_API_URL` | `https://proxy.webshare.io/api/v2/proxy/list/` | `src/lib/freeProxyProviders/webshare.ts` | Webshare প্রক্সি তালিকার API URL ওভাররাইড। |
| `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 বোতামটি দেখান/লুকান। |
| `VERCEL_API_BASE` | `https://api.vercel.com` | `src/app/api/settings/proxy/vercel-deploy/route.ts` | Vercel API বেস URL ওভাররাইড (পরীক্ষার জন্য)। |
| `NEXT_PUBLIC_VERCEL_RELAY_DEFAULT_PROJECT` | `omniroute-relay` | `src/app/(dashboard)/…/VercelRelayModal.tsx` | Vercel Relay ডিপ্লয় মডালে আগে থেকে পূরণ করা ডিফল্ট প্রজেক্টের নাম। |
| `TAILSCALE_BIN` | _(স্বয়ংক্রিয়ভাবে শনাক্ত)_ | `src/lib/tailscaleTunnel.ts` | `tailscale` বাইনারির সুস্পষ্ট পাথ। |
| `TAILSCALED_BIN` | _(স্বয়ংক্রিয়ভাবে শনাক্ত)_ | `src/lib/tailscaleTunnel.ts` | `tailscaled` ডেমন বাইনারির সুস্পষ্ট পাথ। |
| `TAILSCALE_AUTHKEY` | _(সেট করা নেই)_ | `src/lib/tailscaleTunnel.ts` | নন-ইন্টার্যাক্টিভ / হেডলেস `tailscale up`-এর জন্য আগে থেকে শেয়ার করা Tailscale অথ কী (`--auth-key=`-এর মাধ্যমে পাস করা হয়)। সেট করা না থাকলে, লগইন ইন্টার্যাক্টিভ ব্রাউজার অথ URL ব্যবহার করে। |
| `NGROK_AUTHTOKEN` | _(সেট করা নেই)_ | `src/lib/ngrokTunnel.ts` | আউটবাউন্ড ngrok টানেলগুলোকে প্রমাণীকরণ করে। |
| `DB_BACKUP_MAX_FILES` | `20` | `src/lib/db/backup.ts` | ম্যানুয়াল/নির্ধারিত ব্যাকআপ পরিষ্কারের সময় সর্বাধিক যতগুলো SQLite ব্যাকআপ ফাইল রাখা হবে। মাইগ্রেশন স্ন্যাপশটগুলো কনটেন্ট-অ্যাড্রেসড এবং অভিন্ন DB অবস্থার জন্য পুনরায় ব্যবহার করা হয়; সমকালীন মাইগ্রেশন উইন্ডোর মধ্যে এগুলো ছাঁটাই করা হয় না। Settings → Database backup retention-এ সংরক্ষিত মানকে ওভাররাইড করে। |
| `DB_BACKUP_RETENTION_DAYS` | `0` | `src/lib/db/backup.ts` | ম্যানুয়াল/নির্ধারিত ব্যাকআপ পরিষ্কারের সময় সর্বাধিক যত দিন পুরোনো ব্যাকআপ রাখা হবে। `0` বয়সভিত্তিক ছাঁটাই নিষ্ক্রিয় করে। সমকালীন মাইগ্রেশন উইন্ডোর মধ্যে মাইগ্রেশন স্ন্যাপশটগুলো ছাঁটাই করা হয় না। Settings → Database backup retention-এ সংরক্ষিত মানকে ওভাররাইড করে। |
| `OMNIROUTE_BACKUP_SCHEDULE_JOB_INTERVAL_MS` | `30000` | `src/lib/jobs/backupScheduleJob.ts` | `backup-schedule.json` কার্যকরকারী সার্ভার-সাইড জবের টিক ব্যবধান (ms)। এটি অবশ্যই ১-মিনিটের cron গ্র্যানুলারিটির তুলনায় যথেষ্ট কম রাখতে হবে; `5000`-এর কম বা পার্স করা যায় না এমন মানের ক্ষেত্রে `30000` ব্যবহৃত হয়। |
| `CONTAINER_HOST` | `docker` | `scripts/check-permissions.sh` | এন্ট্রিপয়েন্ট অনুমতি যাচাইয়ের জন্য কনটেইনার রানটাইমের ইঙ্গিত। যেকোনো Podman টপোলজির জন্য `podman` সেট করুন। ইঞ্জিনটি স্থানীয় নাকি Podman Machine-এর মাধ্যমে অ্যাক্সেস করা হচ্ছে তা কনটেইনার নির্ধারণ করতে পারে না বলে সতর্কবার্তাটি টপোলজি-নিরপেক্ষ থাকে এবং `contrib/podman/README.md`-এর দিকে নির্দেশ করে। |
| `QUOTA_STORE_DRIVER` | `sqlite` | `src/lib/quota/storeFactory.ts` | কোটা-শেয়ার ব্যবহারের স্টোর ব্যাকএন্ড: `sqlite` (ডিফল্ট) অথবা `redis`। |
| `QUOTA_STORE_REDIS_URL` | _(সেট করা নেই)_ | `src/lib/quota/storeFactory.ts` | `QUOTA_STORE_DRIVER=redis` হলে ব্যবহৃত Redis সংযোগ স্ট্রিং (যেমন `redis://localhost:6379`)। |
| `QUOTA_SATURATION_THRESHOLD` | `0.5` | `src/lib/quota/enforce.ts` | পুল স্যাচুরেশন অনুপাত (0..1); এই মানে/এর বেশি হলে পুলটি কঠোর মোডে প্রবেশ করে (ধার নেওয়া যায় না)। |
| `QUOTA_SOFT_DEPRIORITIZE_FACTOR` | `0.7` | `open-sse/services/combo.ts` | সফট কোটা নীতি কোনো টার্গেটকে নিম্ন অগ্রাধিকার দিলে তার ওপর প্রয়োগ করা স্কোর গুণক (0..1)। |
| `STATUS_SOFT_DEPRIORITIZE_FACTOR` | `0.5` | `open-sse/services/combo/autoStrategy.ts` | প্রিফ্লাইট কোটা কাটঅফ বন্ধ থাকলে (#4540), অটো-কম্বো স্কোরিংয়ে কোটা নিঃশেষিত কোনো প্রদানকারীর (`credits_exhausted`/`rate_limited`) ওপর প্রয়োগ করা স্কোর গুণক (0..1)। |
| `QUOTA_CONSUMPTION_RETENTION_DAYS` | `14` | `src/lib/db/quotaConsumption.ts` | GC (`gcQuotaConsumption`)-এর আগে `quota_consumption` বাকেটগুলোর সংরক্ষণ সময়সীমা (দিনে)। |
| `QUOTA_PREFLIGHT_CUTOFF_ENABLED` | `false` | `src/lib/resilience/settings.ts` | অপ্ট-ইন (ডিফল্টভাবে বন্ধ): অটো-রাউটিংয়ের কঠোর কোটা কাটঅফ সক্রিয় করে, যা স্কোরিংয়ের আগে কম-কোটার প্রার্থীদের বাদ দেয়। |
| `OMNIROUTE_AUTO_FREE_FALLBACK_TO_FULL_POOL` | `false` | `open-sse/services/autoCombo/virtualFactory.ts` | অপ্ট-ইন (ডিফল্টভাবে বন্ধ): কোনো `auto/:` ফিল্টারের সঙ্গে সংযুক্ত কোনো প্রার্থী না মিললে, খালি পুল ফেরত দেওয়ার পরিবর্তে সম্পূর্ণ (অফিল্টার করা) পুলে ফলব্যাক করার পুরোনো আচরণ পুনরুদ্ধার করে। ডিফল্টভাবে বন্ধ থাকার অর্থ `:free` হলো "শুধু ফ্রি টিয়ার"। |
| `OMNIROUTE_CHAOS_MAX_PANEL` | `5` | `open-sse/services/autoCombo/virtualFactory.ts` | `auto/*:chaos` ব্রডকাস্ট ভ্যারিয়েন্টের জন্য প্যানেল-আকারের সীমা (1–10-এর মধ্যে সীমাবদ্ধ) — একটি অনুরোধ সর্বাধিক এতগুলো ভিন্ন-প্রদানকারীর মডেলে ছড়িয়ে পড়ে। |
| `OMNIROUTE_CHAOS_MIN_PANEL` | _(ইঞ্জিনের ডিফল্ট)_ | `open-sse/services/autoCombo/virtualFactory.ts` | chaos ব্রডকাস্ট হ্যান্ডলারে পাঠানো সর্বনিম্ন প্যানেল-আকারের টিউনিং; সেট না করলে ইঞ্জিনের ডিফল্ট বজায় থাকে। |
| `OMNIROUTE_CHAOS_PANEL_TIMEOUT_MS` | _(ইঞ্জিনের ডিফল্ট)_ | `open-sse/services/autoCombo/virtualFactory.ts` | সম্পূর্ণ chaos প্যানেল ফ্যান-আউটের জন্য হার্ড টাইমআউট (ms); সেট না করলে ইঞ্জিনের ডিফল্ট বজায় থাকে। |
| `GROK_AUTH_PATH` | `~/.grok/auth.json` | `open-sse/services/grokQuotaFetcher.ts` | grok-web-এর সাপ্তাহিক কোটা আনতে ব্যবহৃত Grok CLI-এর `auth.json`-এর পাথ; পরীক্ষা বা অ-মানক CLI ইনস্টলেশনের জন্য ওভাররাইড করুন। |
| `AGENTBRIDGE_UPSTREAM_CA_CERT` | _(সেট করা নেই)_ | `src/mitm/manager.ts` | AgentBridge-এর আপস্ট্রিম TLS সংযোগের জন্য বিশ্বস্ত অতিরিক্ত CA সার্টিফিকেট (PEM)। |
| `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` | Traffic Inspector HTTP প্রক্সির জন্য লোকাল পোর্ট। |
| `INSPECTOR_HTTP_PROXY_AUTOSTART` | `false` | `src/mitm/inspector/httpProxyServer.ts` | বুটের সময় Inspector HTTP প্রক্সি স্বয়ংক্রিয়ভাবে চালু করুন। |
| `INSPECTOR_TLS_INTERCEPT` | `false` | `src/lib/inspector/captureState.ts` | ক্যাপচার করা HTTPS ট্র্যাফিকের জন্য TLS ইন্টারসেপশন (MITM) সক্রিয় করুন। |
| `INSPECTOR_LLM_HOSTS_EXTRA` | _(সেট করা নেই)_ | `src/lib/inspector/captureState.ts` | ক্যাপচারের জন্য LLM এন্ডপয়েন্ট হিসেবে বিবেচিত অতিরিক্ত হোস্টনেমসমূহ (কমা দিয়ে পৃথক করা)। |
| `INSPECTOR_MASK_SECRETS` | `true` | `src/mitm/inspector/buffer.ts` | ক্যাপচার করা ট্র্যাফিকে গোপন তথ্য (auth হেডার / API কী) মাস্ক করুন। |
| `INSPECTOR_SYSTEM_PROXY_GUARD_MINUTES` | `30` | `src/app/api/tools/traffic-inspector/capture-modes/system-proxy/route.ts` | সিস্টেম-প্রক্সি গার্ড OS-এর প্রক্সি সেটিংস স্বয়ংক্রিয়ভাবে পূর্বাবস্থায় ফিরিয়ে দেওয়ার আগের সময়, মিনিটে। |
| `INSPECTOR_INTERNAL_INGEST_TOKEN` | _(স্বয়ংক্রিয়)_ | `src/app/api/tools/traffic-inspector/internal/ingest/route.ts` | Inspector-এ অভ্যন্তরীণ ক্যাপচার ইনজেস্ট প্রমাণীকরণের টোকেন। |
| `PLAYGROUND_COMPARE_MAX_COLUMNS` | `4` | `src/app/(dashboard)/dashboard/playground/` | Playground তুলনা মোডে পাশাপাশি কলামের সর্বোচ্চ সংখ্যা। |
| `PLAYGROUND_IMPROVE_PROMPT_DEFAULT_MODEL` | _(সেট করা নেই)_ | `src/app/(dashboard)/dashboard/playground/` | Playground-এর 'প্রম্পট উন্নত করুন' অ্যাকশনের ডিফল্ট মডেল (সেট করা না থাকলে সক্রিয় মডেল ব্যবহৃত হয়)। |
| `BIFROST_ENABLED` | `1` | `src/app/api/v1/relay/chat/completions/bifrost/route.ts` | Bifrost সাইডকার প্রক্সির প্রধান কিল সুইচ। `0`-এ সেট করা হলে, রুটটি `X-Bifrost-Killswitch` হেডারসহ 503 রিটার্ন করে এবং অপারেটরকে TS পাথে পাঠানো হয়। পুনরায় ডিপ্লয় না করেই সাইডকার নিষ্ক্রিয় করতে এটি ব্যবহার করুন (টিয়ার-1 রাউটার ঘটনা, কী রোটেশন)। |
| `BIFROST_BASE_URL` | _(সেট করা নেই)_ | `src/app/api/v1/relay/chat/completions/bifrost/route.ts` | সেট করা থাকলে, Bifrost সাইডকার প্রক্সি রুটটি `/v1/chat/completions` ট্রাফিক TS রিলে হ্যান্ডলারের পরিবর্তে এই Go গেটওয়েতে ফরোয়ার্ড করে। সেট করা নেই → ফলব্যাকসহ-503। শেষের স্ল্যাশ সরিয়ে দেওয়া হয়। |
| `BIFROST_PORT` | `8080` | `src/lib/services/bootstrap.ts` | OmniRoute যখন Bifrost সাইডকারের লাইফসাইকেল পরিচালনা করে, তখন তত্ত্বাবধানে থাকা এম্বেডেড Bifrost সার্ভিসটি যে পোর্টে (`127.0.0.1:`) বাইন্ড করে। ডিফল্ট হলো `8080`। |
| `BIFROST_API_KEY` | _(সেট করা নেই)_ | `src/app/api/v1/relay/chat/completions/bifrost/route.ts` | Bifrost গেটওয়ের API কী (`Authorization: Bearer ...` হিসেবে পাঠানো হয়)। সেট করা না থাকলে, রুটটি ধরে নেয় যে অনুরোধে একটি বৈধ OmniRoute API কী রয়েছে; এই কীটি কেবল গেটওয়ে-পার্শ্বের অথেনটিকেশনের জন্য। |
| `BIFROST_STREAMING_ENABLED` | `true` | `src/app/api/v1/relay/chat/completions/bifrost/route.ts` | true হলে, Bifrost সাইডকার রুটটি TS স্ট্রিমিং এক্সিকিউটরের পরিবর্তে গেটওয়ের মাধ্যমে SSE ব্যবহার করে প্রতিক্রিয়া স্ট্রিম করে ফেরত পাঠায়। গেটওয়ের মাধ্যমে নন-স্ট্রিমিং JSON প্রতিক্রিয়া বাধ্যতামূলক করতে `0`-এ সেট করুন। |
| `BIFROST_TIMEOUT_MS` | `30000` | `src/app/api/v1/relay/chat/completions/bifrost/route.ts` | Bifrost গেটওয়েতে প্রক্সি করার সময় প্রতি-অনুরোধের টাইমআউট (ms)। টাইমআউট হলে রুটটি `X-Bifrost-Fallback` হেডারের মাধ্যমে TS রিলে পাথ রিটার্ন করে। |
| `OMNIROUTE_BIFROST_KEY` | _(সেট করা নেই)_ | `src/app/api/v1/relay/chat/completions/bifrost/route.ts` | `BIFROST_API_KEY`-এর উপনাম (`OMNIROUTE_*`-এর মাধ্যমে env পড়ে এমন স্ক্রিপ্টে ব্যবহৃত)। উভয়টি সেট করা থাকলে `BIFROST_API_KEY` অগ্রাধিকার পায়। |
| `OMNIROUTE_RELAY_BACKEND` | `ts` / `auto` | `src/app/api/v1/relay/chat/completions/routingBackend.ts` | `/api/v1/relay/chat/completions`-এর রিলে ব্যাকএন্ড: `ts \| bifrost \| auto`। `ts` = TypeScript রিলে (Bifrost কনফিগার করা না থাকলে ডিফল্ট); `BIFROST_BASE_URL` সেট করা থাকলে এবং `BIFROST_ENABLED` ≠ `0` হলে `auto` Bifrost নির্বাচন করে, আর সাইডকারে পৌঁছানো না গেলে স্বয়ংক্রিয়ভাবে TS ফলব্যাক ব্যবহার করে; `bifrost` Bifrost ব্যবহার বাধ্যতামূলক করে (কঠোর, কোনো ফলব্যাক নেই)। অথ/রেট-লিমিট/ইনজেকশন-গার্ড/অ্যালাউলিস্ট সর্বদা প্রথমে Next রুটে চলে। প্রতিক্রিয়ায় `X-Routing-Backend` / `X-Routing-Fallback` / `X-Routing-Fallback-Reason` থাকে। |
| `RELAY_ROUTING_BACKEND` | _(সেট করা নেই)_ | `src/app/api/v1/relay/chat/completions/routingBackend.ts` | `OMNIROUTE_RELAY_BACKEND`-এর জন্য গৃহীত উপনাম (একই `ts \| bifrost \| auto` মান)। উভয়টি সেট করা থাকলে `OMNIROUTE_RELAY_BACKEND` অগ্রাধিকার পায়। |
| `OMNIROUTE_BIFROST_FAILURE_COOLDOWN_MS` | `5000` | `src/app/api/v1/relay/chat/completions/bifrostCooldown.ts` | `auto` মোডে একটি Bifrost sidecar হপ ব্যর্থ হওয়ার পর relay পুনরায় sidecar ব্যবহারের চেষ্টা করার আগের cooldown (ms); cooldown চলাকালে এটি সরাসরি TS পথে রুট করে, তারপর আবার পরীক্ষা করে। `0` এটি নিষ্ক্রিয় করে। কেবল `OMNIROUTE_RELAY_BACKEND=auto` হলে প্রযোজ্য। |
| `OMNIROUTE_TLS_CERT` | _(সেট করা নেই)_ | `bin/cli/commands/serve.mjs` | HTTPS-এর মাধ্যমে `omniroute serve` পরিবেশনের জন্য একটি PEM TLS সার্টিফিকেটের পাথ (`--tls-cert`-এর সমতুল্য)। এটি অবশ্যই `OMNIROUTE_TLS_KEY`-এর সঙ্গে দিতে হবে; এরপর স্বতন্ত্র সার্ভারটি একই listener-এ TLS সমাপ্ত করে (`wss://` অপরিবর্তিতভাবে কাজ করে)। সেট করা না থাকলে → সাধারণ HTTP। cert/key-এর মধ্যে কেবল একটি দেওয়া হলে, অথবা পাথটি পাঠযোগ্য না হলে, একটি সতর্কতা লগ করা হয় এবং HTTP-তেই থাকে। |
| `OMNIROUTE_TLS_KEY` | _(সেট করা নেই)_ | `bin/cli/commands/serve.mjs` | `omniroute serve` HTTPS-এর জন্য PEM TLS private key-এর পাথ (`--tls-key`-এর সমতুল্য)। এটি অবশ্যই `OMNIROUTE_TLS_CERT`-এর সঙ্গে দিতে হবে। `OMNIROUTE_TLS_CERT` দেখুন। |
| `OMNIROUTE_LOCAL_ENDPOINTS_ENABLED` | `0` | `src/lib/security/localEndpoints.ts` | `/api/local/*` রুটগুলোর master switch। সেট করা না থাকলে বা `0` হলে, production-এ সব `/api/local/*` রুট 503 ফেরত দেয়। Redis launcher এবং অনুরূপ 1-click local service starter সক্রিয় করতে non-loopback deployment-এ এটি অবশ্যই `1` হতে হবে। `isLocalOnlyPath()` route-guard classification-এর সঙ্গে অতিরিক্ত সুরক্ষা হিসেবে কাজ করে (`src/server/authz/routeGuard.ts`-এ `LOCAL_ONLY_API_PREFIXES`)। |
| `OMNIROUTE_LOCAL_ENDPOINTS_TOKEN` | _(সেট করা নেই)_ | `src/lib/security/localEndpoints.ts` | loopback-এ নেই এমন `/api/local/*` caller-দের জন্য Bearer token (যেমন desktop app)। এটি সেট করা থাকলে, non-loopback IP থেকে আসা request-এ অবশ্যই `Authorization: Bearer ` থাকতে হবে। non-loopback deployment-এ `OMNIROUTE_LOCAL_ENDPOINTS_ENABLED=1` হলে এটি আবশ্যক। |
| `OMNIROUTE_REDIS_CONTAINER_NAME` | `omniroute-redis` | `bin/cli/commands/redis.mjs` | 1-click Redis launcher-এর container name (`omniroute redis up`)। CLI এবং `RedisLauncherPanel` GUI—উভয়েই এটি ব্যবহার করে। |
| `OMNIROUTE_REDIS_HOST_PORT` | `6379` | `bin/cli/commands/redis.mjs` | 1-click Redis launcher-এর host port। host-এ ইতিমধ্যে 6379 bind করা থাকলে এটি বাড়ান। container-এর internal port 6379-ই থাকে। |
| `OMNIROUTE_REDIS_BIND_HOST` | `127.0.0.1` | `bin/cli/commands/redis.mjs` | 1-click Redis launcher যে host interface-এ প্রকাশিত হয়। launcher-টি কোনো password ছাড়াই Redis চালু করে, তাই `0.0.0.0`-এ bind করলে আপনার LAN-এর প্রতিটি host একটি unauthenticated Redis-এ প্রবেশাধিকার পাবে—শুধু তখনই এটি বিস্তৃত করুন, যখন instance-এ নিজে একটি password-ও সেট করেছেন। |
| `REDIS_BIND_HOST` | `127.0.0.1` | `docker-compose.yml` | docker-compose যে host interface-এ Redis sidecar প্রকাশ করে (#9286)। compose Redis `requirepass` ছাড়াই চলে; app container-গুলো compose network-এর মাধ্যমে এতে পৌঁছায় (`redis:6379`)—প্রকাশিত port কেবল host-side tooling-এর জন্য বিদ্যমান। `0.0.0.0` পুরো LAN-এর কাছে একটি unauthenticated Redis উন্মুক্ত করে। |
| `REDIS_PORT` | `6379` | `docker-compose.yml` | compose Redis সাইডকারের হোস্ট পোর্ট। |
| `APP_BIND_HOST` | `127.0.0.1` | `docker-compose.yml`, `docker-compose.prod.yml` | যে হোস্ট ইন্টারফেসে docker-compose অ্যাপটির নিজস্ব ড্যাশবোর্ড/API/live-WS পোর্ট প্রকাশ করে (#12568)। `.env.example`-এর ডিফল্ট হিসেবে `REQUIRE_API_KEY=false` সরবরাহ করা হলে, `0.0.0.0` সম্পূর্ণ LAN/WAN-এ বেনামী `/v1` LLM প্রক্সি উন্মুক্ত করে — কেবল `REQUIRE_API_KEY=true` করার পরে অথবা সামনের কোনো রিভার্স প্রক্সি নিজস্ব প্রমাণীকরণ প্রয়োগ করলে এটি বিস্তৃত করুন। |
| `QDRANT_BIND_HOST` | `127.0.0.1` | `docker-compose.yml` | যে হোস্ট ইন্টারফেসে docker-compose Qdrant মেমরি সাইডকার প্রকাশ করে (#12578)। LAN-এ উন্মুক্তকরণ সম্পর্কে `REDIS_BIND_HOST`-এর মতো একই যুক্তি প্রযোজ্য। |
| `BIFROST_BIND_HOST` | `127.0.0.1` | `docker-compose.yml` | যে হোস্ট ইন্টারফেসে docker-compose Bifrost রাউটার সাইডকার প্রকাশ করে (#12578)। LAN-এ উন্মুক্তকরণ সম্পর্কে `REDIS_BIND_HOST`-এর মতো একই যুক্তি প্রযোজ্য। |
| `REDIS_KEY_PREFIX` | `omniroute:` | `src/shared/utils/rateLimiter.ts` | প্রতিটি OmniRoute Redis কী-তে প্রয়োগ করা নেমস্পেস প্রিফিক্স (রেট লিমিটার, প্রমাণীকরণ ক্যাশ, কোটা স্টোর, ওয়ার্মআপ সার্কিট ব্রেকার)। Redis ইনস্ট্যান্সটি অন্যান্য অ্যাপের সঙ্গে শেয়ার করা হলে কী-এর সংঘর্ষ প্রতিরোধ করে (#11042)। |
| `OMNIROUTE_INTERNAL_SERVICE_TOKEN` | _(সেট করা নেই — প্রক্রিয়া নিষ্ক্রিয়)_ | `src/lib/api/internalServiceAuth.ts` | পরিচয়-সংরক্ষণকারী অভ্যন্তরীণ REST হপের জন্য শেয়ার্ড সিক্রেট (#9260): অন্যান্য স্থানীয় OmniRoute রুটে কল করা OmniRoute কম্পোনেন্টগুলো এটিকে `x-omniroute-internal-service-token` হিসেবে পাঠায়, যাতে মূল কলারের পরিচয় সংরক্ষিত থাকে। `timingSafeEqual`-এর সঙ্গে তুলনা করা হয়। |
| `OMNIROUTE_INTERNAL_SERVICE_TOKEN_FILE` | _(সেট করা নেই)_ | `src/lib/api/internalServiceAuth.ts` | অভ্যন্তরীণ সার্ভিস টোকেনের সিক্রেট-ফাইল সংস্করণ: এমন একটি ফাইলের পাথ, যার ট্রিম করা কনটেন্টই টোকেন। ইনলাইন ভ্যারিয়েবলটি সেট করা না থাকলেই কেবল এটি ব্যবহার করা হয়। |
| `OPENROUTER_PROVIDER_STATS_ENABLED` | `true` | `src/lib/catalog/openrouterProviderStats.ts` | OpenRouter-এর সাপ্তাহিক র্যাঙ্কিং পরিসংখ্যান দিয়ে ড্যাশবোর্ডের প্রোভাইডার তালিকা সমৃদ্ধ করুন (#9324)। ডিফল্টভাবে চালু থাকে; ব্যাকগ্রাউন্ড ফেচ সম্পূর্ণভাবে এড়াতে `false` সেট করুন (নন-ব্লকিং, কখনোই মারাত্মক নয়)। |
| `OPENROUTER_PROVIDER_STATS_TTL_MS` | `86400000` (24 ঘণ্টা) | `src/lib/catalog/openrouterProviderStats.ts` | OpenRouter প্রোভাইডার-পরিসংখ্যান স্ন্যাপশটের ক্যাশ TTL, মিলিসেকেন্ডে। |
| `OMNIROUTE_REDIS_IMAGE` | `redis:7-alpine` | `bin/cli/commands/redis.mjs` | ১-ক্লিক Redis লঞ্চার দ্বারা ব্যবহৃত Redis ইমেজ। প্রয়োজন অনুযায়ী `redis:8-alpine` অথবা কোনো ব্যক্তিগত রেজিস্ট্রি মিরর দিয়ে ওভাররাইড করুন। |
| `QDRANT_HOST` | `qdrant` | _(ঐচ্ছিক ক্লাস্টার প্রোফাইল)_ | `--profile memory` সক্রিয় থাকলে Qdrant সাইডকারের হোস্টনেম। ডিফল্টভাবে ইন-নেটওয়ার্ক qdrant সার্ভিসের নাম নির্দেশ করে; বাহ্যিক ডিপ্লয়মেন্টের জন্য ওভাররাইড করুন। কোডে (`src/lib/memory/vectorStore.ts:108`) `qdrantEnabled`-এর মান `true` হলেই কেবল এটি ব্যবহৃত হয়। |
| `QDRANT_PORT` | `6333` | _(ঐচ্ছিক ক্লাস্টার প্রোফাইল)_ | Qdrant সাইডকারের REST পোর্ট। |
| `QDRANT_GRPC_PORT` | `6334` | _(ঐচ্ছিক ক্লাস্টার প্রোফাইল)_ | Qdrant সাইডকারের gRPC পোর্ট। স্ট্রিমিং অপারেশনের জন্য REST-এর পরিবর্তে gRPC পছন্দ করে এমন ক্লায়েন্ট লাইব্রেরিগুলো এটি ব্যবহার করে। |
| `QDRANT_API_KEY` | _(সেট করা নেই)_ | _(ঐচ্ছিক ক্লাস্টার প্রোফাইল)_ | Qdrant Cloud বা প্রমাণীকৃত অন-প্রিম ইনস্ট্যান্সের জন্য ঐচ্ছিক API কী। খালি থাকলে → কোনো `api-key` হেডার পাঠানো হয় না। |
| `QDRANT_COLLECTION` | `omniroute-memory` | _(ঐচ্ছিক ক্লাস্টার প্রোফাইল)_ | OmniRoute-এর কথোপকথন মেমরি এম্বেডিংয়ের জন্য কালেকশনের নাম। প্রথমবার চালানোর সময় `QDRANT_VECTOR_SIZE` ডাইমেনশনসহ এটি তৈরি করা হয়। |
| `QDRANT_EMBEDDING_MODEL` | `text-embedding-3-small` | _(ঐচ্ছিক ক্লাস্টার প্রোফাইল)_ | Qdrant কালেকশনের মেটাডেটায় রেকর্ড করা ডিফল্ট এম্বেডিং মডেলের নাম। প্রকৃত এম্বেডিং সেই প্রোভাইডার দ্বারা তৈরি হয়, যেটিকে OmniRoute-এর সেটিংসের `embeddingModel` ফিল্ড নির্দেশ করে। |
| `QDRANT_VECTOR_SIZE` | `1536` | _(ঐচ্ছিক ক্লাস্টার প্রোফাইল)_ | এম্বেডিং ভেক্টরের ডাইমেনশন। আপনি যে মডেল দিয়ে এম্বেড করেন, সেটির সঙ্গে এটি অবশ্যই মিলতে হবে (text-embedding-3-small → 1536; ada-002 → 1536; nomic-embed-text → 768)। |
| `QDRANT_HNSW_EF_CONSTRUCT` | `128` | _(ঐচ্ছিক ক্লাস্টার প্রোফাইল)_ | HNSW ইনডেক্স নির্মাণকালীন নির্ভুলতা। বেশি মান = ধীরগতির বিল্ড, দ্রুততর সার্চ। |
| `OMNIROUTE_ROTATION_ENABLED` | `true` | `open-sse/services/rotationConfig.ts` | অপারেটর-কনফিগারযোগ্য অ্যাকাউন্ট রোটেশনের প্রধান সুইচ। এর মান `false` হলে, নিচের `OMNIROUTE_ROTATE_*` ক্লাসগুলোর কোনোটিই অ্যাকাউন্ট ফলব্যাক ট্রিগার করে না (মাস্টার-অফ অবস্থা ডিফল্টভাবে সক্রিয় 429/500/502 ক্লাসগুলোকেও ব্লক করে)। এটি কোনো তত্ত্বাবধায়ক ফ্রন্ট-এন্ডকে (যেমন VibeProxy ডেস্কটপ অ্যাপ) নিজস্ব রোটেশন নিয়মগুলো ব্যাকএন্ডের অ্যাকাউন্ট-ফলব্যাক ইঞ্জিনে প্রতিফলিত করতে দেয়। |
| `OMNIROUTE_ROTATION_RATE_LIMIT_RESET_SECONDS` | `0` | `open-sse/services/rotationConfig.ts` | আপস্ট্রিম থেকে সুস্পষ্ট রিসেট নির্দেশনা না পাওয়া গেলে রেট-লিমিটেড অ্যাকাউন্টে প্রয়োগ করা কুলডাউন (সেকেন্ডে)। `0` = নির্দিষ্ট ওভাররাইডের পরিবর্তে ইঞ্জিনের ডিফল্ট কুলডাউন ব্যবহার করুন। |
| `OMNIROUTE_ROTATION_DISABLE_TAG_WITHOUT_RESET` | `true` | `open-sse/services/rotationConfig.ts` | ফ্রন্ট-এন্ডের "রিসেট সময় ছাড়া রেট-লিমিটেড হিসেবে ট্যাগ করবেন না" পছন্দটির প্রতিরূপ। |
| `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` | অ্যাকাউন্ট রোটেট করার আগে `OMNIROUTE_ROTATE_429_WINDOW_SECONDS`-এর মধ্যে প্রয়োজনীয় `429` ত্রুটির সংখ্যা। `1` (ডিফল্ট) অবিলম্বে রোটেট করে, যা পূর্ববর্তী আচরণ বজায় রাখে। |
| `OMNIROUTE_ROTATE_429_WINDOW_SECONDS` | `120` | `open-sse/services/rotationConfig.ts` | যে স্লাইডিং উইন্ডোতে (সেকেন্ডে) `OMNIROUTE_ROTATE_429_THRESHOLD`-এর জন্য `429` ত্রুটিগুলি গণনা করা হয়। |
| `OMNIROUTE_ROTATE_ON_500` | `true` | `open-sse/services/rotationConfig.ts` | `5xx` সার্ভার ত্রুটির জন্য প্রতি-স্ট্যাটাস ফলব্যাক সক্রিয়করণ (`502` ব্যতীত, যার নিজস্ব শ্রেণি রয়েছে)। এটি `false` হলে, এই ত্রুটিগুলি আর অ্যাকাউন্ট রোটেশন ট্রিগার করে না। |
| `OMNIROUTE_ROTATE_500_THRESHOLD` | `1` | `open-sse/services/rotationConfig.ts` | অ্যাকাউন্ট রোটেট করার আগে `OMNIROUTE_ROTATE_500_WINDOW_SECONDS`-এর মধ্যে প্রয়োজনীয় `5xx` ত্রুটির সংখ্যা। `1` (ডিফল্ট) অবিলম্বে রোটেট করে। |
| `OMNIROUTE_ROTATE_500_WINDOW_SECONDS` | `120` | `open-sse/services/rotationConfig.ts` | যে স্লাইডিং উইন্ডোতে (সেকেন্ডে) `OMNIROUTE_ROTATE_500_THRESHOLD`-এর জন্য `5xx` ত্রুটিগুলি গণনা করা হয়। |
| `OMNIROUTE_ROTATE_ON_502` | `true` | `open-sse/services/rotationConfig.ts` | `502` (ব্যাড গেটওয়ে) ত্রুটির জন্য প্রতি-স্ট্যাটাস ফলব্যাক সক্রিয়করণ। এটি `false` হলে, `502` ত্রুটিগুলি আর অ্যাকাউন্ট রোটেশন ট্রিগার করে না। |
| `OMNIROUTE_ROTATE_502_THRESHOLD` | `1` | `open-sse/services/rotationConfig.ts` | অ্যাকাউন্ট রোটেট করার আগে `OMNIROUTE_ROTATE_502_WINDOW_SECONDS`-এর মধ্যে প্রয়োজনীয় `502` ত্রুটির সংখ্যা। `1` (ডিফল্ট) অবিলম্বে রোটেট করে। |
| `OMNIROUTE_ROTATE_502_WINDOW_SECONDS` | `120` | `open-sse/services/rotationConfig.ts` | যে স্লাইডিং উইন্ডোতে (সেকেন্ডে) `OMNIROUTE_ROTATE_502_THRESHOLD`-এর জন্য `502` ত্রুটিগুলি গণনা করা হয়। |
| `OMNIROUTE_ROTATE_ON_400` | `false` | `open-sse/services/rotationConfig.ts` | অপ্ট-ইন (ডিফল্টরূপে বন্ধ): `true` হলে, একটি সাধারণ `400` (ত্রুটিপূর্ণ অনুরোধ) অ্যাকাউন্ট রোটেশনও ট্রিগার করে। এটি শুধু অতিরিক্ত আচরণ যোগ করে—এটি ইঞ্জিনের বিদ্যমান আচরণ কখনোই বাধাগ্রস্ত করে না, যেখানে রেট-লিমিট/কোটা-সংক্রান্ত টেক্সট বহনকারী একটি `400` এই ফ্ল্যাগ নির্বিশেষে অন্য অ্যাকাউন্টে স্থানান্তরিত হয়। |
| `OMNIROUTE_ROTATE_400_THRESHOLD` | `1` | `open-sse/services/rotationConfig.ts` | অ্যাকাউন্ট রোটেট করার আগে `OMNIROUTE_ROTATE_400_WINDOW_SECONDS`-এর মধ্যে প্রয়োজনীয় `400` ত্রুটির সংখ্যা (শুধু `OMNIROUTE_ROTATE_ON_400=true` হলে বিবেচনা করা হয়)। |
| `OMNIROUTE_ROTATE_400_WINDOW_SECONDS` | `120` | `open-sse/services/rotationConfig.ts` | যে স্লাইডিং উইন্ডোর (সেকেন্ডে) মধ্যে `400` ত্রুটিগুলো `OMNIROUTE_ROTATE_400_THRESHOLD`-এর জন্য গণনা করা হয়। |
### Claude ওয়ার্মআপ শিডিউলার
অপ্ট-ইন করা Anthropic OAuth সংযোগগুলোর জন্য cron-চালিত ওয়ার্মআপ, যাতে ৫ ঘণ্টার রেট-লিমিট উইন্ডোটি প্রথম প্রকৃত অনুরোধের বদলে একটি সাধারণ নির্ধারিত অনুরোধের মাধ্যমে খোলা হয় (#8848)। `OMNIROUTE_WARMUP_ENABLED` সত্য-মানযুক্ত **এবং** সংযোগটি `settings.claudeWarmup.connections`-এ চিহ্নিত না হলে শিডিউলার বন্ধ থাকে; সংযোগের তালিকা খালি থাকলে env var চালু থাকলেও কোনো কিছু ওয়ার্মআপ করা হয় না।
| ভেরিয়েবল | ডিফল্ট | সোর্স ফাইল | বিবরণ |
| ------------------------------ | --------------------------- | ---------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `OMNIROUTE_WARMUP_ENABLED` | _(সেট করা নেই → বন্ধ)_ | `src/lib/warmupScheduler.ts` | ওয়ার্মআপ শিডিউলারের প্রধান সুইচ। `1`/`true`/`yes`/`on` গ্রহণ করে (বড়-ছোট অক্ষর নির্বিশেষে, অতিরিক্ত ফাঁকা স্থান বাদ দিয়ে)। অন্য যেকোনো মান বা সেট না করা থাকলে শিডিউলার বন্ধ থাকে। |
| `OMNIROUTE_WARMUP_CRON` | `0 7 * * *` | `src/lib/warmupScheduler.ts` | ওয়ার্মআপ টিকের জন্য পাঁচ-ফিল্ডের cron এক্সপ্রেশন, যা হোস্টের ঘড়ি নির্বিশেষে `America/Los_Angeles`-এ (Anthropic-এর রিসেট টাইমজোন) মূল্যায়িত হয়। |
| `OMNIROUTE_WARMUP_CONCURRENCY` | `3` | `src/lib/warmupScheduler.ts` | প্রতি টিকে সমান্তরালভাবে যতগুলো সংযোগ ওয়ার্মআপ করা হয়। `1`-`10`-এর মধ্যে সীমাবদ্ধ; অ-সাংখ্যিক মান হলে `3` ব্যবহৃত হয়। |
| `OMNIROUTE_WARMUP_MODEL` | `claude-3-5-haiku-20241022` | `src/lib/warmupScheduler.ts` | ওয়ার্মআপ অনুরোধের জন্য ব্যবহৃত মডেল। ডিফল্টটি আপনার প্ল্যানে অনুপলভ্য হলেই কেবল পরিবর্তন করুন; এমন সবচেয়ে সস্তা মডেল বেছে নিন, যা তবুও উইন্ডোটি খুলতে পারে। |
### ব্রাউজার-লগইন VNC সেশন ও ডেটা-ডিরেক্টরি উপনাম
ইন্টার্যাক্টিভ ব্রাউজার-লগইন ক্রেডেনশিয়াল সংগ্রহের জন্য কন্টেইনারভিত্তিক Chromium+VNC (`/api/vnc-session`), সঙ্গে একটি লিগ্যাসি `DATA_DIR` উপনাম। সবই ঐচ্ছিক—VNC-এর ডিফল্টগুলো বান্ডেল করা `omniroute-vnc-chromium:local` ইমেজকে লক্ষ্য করে এবং শুধু কাস্টম কন্টেইনার ইমেজ, পোর্ট বা লাইফসাইকেল টিউনিংয়ের জন্যই ওভাররাইড করা হয়।
| ভেরিয়েবল | ডিফল্ট | সোর্স ফাইল | বিবরণ |
| ------------------------------------- | ------------------------------------------------------------------------ | ------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `OMNIROUTE_VNC_IMAGE` | `omniroute-vnc-chromium:local` | `src/lib/vncSession/manifest.ts` | Chromium+VNC লগইন কনটেইনারের জন্য Docker ইমেজ ট্যাগ। `docker/vnc-browser/chromium` বিল্ড করুন অথবা এটিকে একটি কাস্টম ইমেজে নির্দেশ করুন। |
| `OMNIROUTE_DOCKER_BIN` | `docker` | `src/lib/vncSession/manifest.ts` | VNC কনটেইনার চালু করতে ব্যবহৃত কনটেইনার রানটাইম বাইনারি (যেমন, `podman`-এ সেট করুন)। |
| `OMNIROUTE_VNC_CONTAINER_VNC_PORT` | `3000` | `src/lib/vncSession/manifest.ts` | কনটেইনারের অভ্যন্তরে উন্মুক্ত VNC/noVNC পোর্ট। |
| `OMNIROUTE_VNC_CONTAINER_CDP_PORT` | `9223` | `src/lib/vncSession/manifest.ts` | কনটেইনারের অভ্যন্তরে Chrome DevTools Protocol পোর্ট। |
| `OMNIROUTE_VNC_CONTAINER_PROFILE_DIR` | `/config` | `src/lib/vncSession/manifest.ts` | কনটেইনারের অভ্যন্তরে Chromium প্রোফাইল ডিরেক্টরির পাথ। |
| `OMNIROUTE_VNC_PROFILE_DIR` | `$HOME/.omniroute/browser-login-profiles` | `src/lib/vncSession/manifest.ts` | সংরক্ষিত ব্রাউজার-লগইন প্রোফাইল ধারণকারী হোস্ট ডিরেক্টরি। |
| `OMNIROUTE_VNC_IDLE_MS` | `600000` (10 মিনিট) | `src/lib/vncSession/manifest.ts` | নিষ্ক্রিয় VNC সেশন অপসারণের আগের নিষ্ক্রিয়তার সময়সীমা (ms)। |
| `OMNIROUTE_VNC_MAX_MS` | `1800000` (30 মিনিট) | `src/lib/vncSession/manifest.ts` | একটি VNC সেশনের আয়ুষ্কালের সর্বোচ্চ সীমা (ms)। |
| `OMNIROUTE_VNC_MAX_SESSIONS` | `4` | `src/lib/vncSession/manifest.ts` | একযোগে চলতে পারা VNC সেশনের সর্বোচ্চ সংখ্যা। |
| `OMNIROUTE_VNC_READY_MS` | `45000` | `src/lib/vncSession/manifest.ts` | কনটেইনারে চলমান ব্রাউজারটি CDP-প্রস্তুত হওয়ার অপেক্ষার সময়সীমা (ms)। |
| `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` | ডিফল্ট ব্রিজের পরিবর্তে VNC লগইন কনটেইনার যে নিবেদিত Docker নেটওয়ার্কে যুক্ত হয় (#12571), যাতে একই স্তরের কনটেইনারগুলো এর CDP ব্রিজ পোর্টে পৌঁছাতে না পারে। |
| `VIBEPROXY_DATA_DIR` | _(সেট করা নেই)_ | `open-sse/services/notionThreadSessions.ts` | `DATA_DIR`-এর **লিগ্যাসি উপনাম**, যা কেবল `DATA_DIR` এবং `OMNIROUTE_DATA_DIR`—উভয়ই সেট করা না থাকলে পরীক্ষা করা হয়। Notion ওয়েব-থ্রেড সেশন ক্যাশের অবস্থান নির্ধারণ করে (`/notion-web-thread-sessions.json`)। |
---
## 26. টেস্ট ও E2E হার্নেস
`scripts/dev/run-next-playwright.mjs`, `scripts/dev/smoke-electron-packaged.mjs`,
`scripts/dev/run-ecosystem-tests.mjs` এবং `scripts/build/uninstall.mjs` দ্বারা ব্যবহৃত। প্রোডাকশন ডিপ্লয়মেন্টে
নিচের প্রতিটি মান আনসেট রাখুন।
| ভেরিয়েবল | ডিফল্ট | সোর্স ফাইল | বিবরণ |
| -------------------------------------- | --------------------------------- | ----------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `OMNIROUTE_E2E_BOOTSTRAP_MODE` | `auth` | `scripts/dev/run-next-playwright.mjs` | Playwright রানারের জন্য E2E bootstrap মোড (`auth`, `fresh`, `reuse`)। |
| `OMNIROUTE_E2E_PASSWORD` | `INITIAL_PASSWORD`-এ fallback করে | `scripts/dev/run-next-playwright.mjs` | Playwright environment-এ inject করা admin password। |
| `OMNIROUTE_DISABLE_LOCAL_HEALTHCHECK` | `true` | `scripts/dev/run-next-playwright.mjs` | Playwright চালানোর সময় local healthcheck poll নিষ্ক্রিয় করে। |
| `OMNIROUTE_DISABLE_TOKEN_HEALTHCHECK` | `true` | `scripts/dev/run-next-playwright.mjs` | test চলাকালীন OAuth token healthcheck loop নিষ্ক্রিয় করে। |
| `OMNIROUTE_HEALTHCHECK_SKIP_PROVIDERS` | _(সেট করা নেই)_ | `src/lib/tokenHealthCheck.ts` | proactive token-refresh sweep থেকে বাদ দেওয়া comma-separated provider-গুলোর তালিকা (যেমন `codex,openai`)। healthcheck সম্পূর্ণ নিষ্ক্রিয় করার পরিবর্তে লক্ষ্যভিত্তিক বিকল্প—short-TTL provider-গুলো refresh হতে থাকে, আর cascade provider-গুলো কেবল reactive থাকে। |
| `OMNIROUTE_HIDE_HEALTHCHECK_LOGS` | `true` | `scripts/dev/run-next-playwright.mjs` | Playwright stdout-এ healthcheck-এর অপ্রয়োজনীয় output নীরব করে। |
| `OMNIROUTE_PLAYWRIGHT_SKIP_BUILD` | `0` | `scripts/dev/run-next-playwright.mjs` | Playwright শুরু হওয়ার আগে Next.js production build এড়িয়ে যায় (CI optimization)। |
| `OMNIROUTE_SKIP_UNINSTALL_HOOK` | `0` | `scripts/build/uninstall.mjs` | OmniRoute uninstall hook এড়িয়ে যায় (`node_modules` অক্ষত রাখতে CI-তে ব্যবহৃত)। |
| `ECOSYSTEM_SERVER_WAIT_MS` | `180000` | `scripts/dev/run-ecosystem-tests.mjs` | ecosystem/protocol test চালানোর আগে server সুস্থ হওয়ার জন্য অপেক্ষার সময় (ms)। |
| `ELECTRON_SMOKE_URL` | `http://127.0.0.1:20128/login` | `scripts/dev/smoke-electron-packaged.mjs` | packaged app যে URL serve করবে বলে Electron smoke harness প্রত্যাশা করে। |
| `ELECTRON_SMOKE_TIMEOUT_MS` | `45000` | `scripts/dev/smoke-electron-packaged.mjs` | smoke harness হাল ছেড়ে দেওয়ার আগের মোট timeout (ms)। |
| `ELECTRON_SMOKE_SETTLE_MS` | `2000` | `scripts/dev/smoke-electron-packaged.mjs` | page load হওয়ার পর settle window (ms)। |
| `ELECTRON_SMOKE_APP_EXECUTABLE` | _(স্বয়ংক্রিয়)_ | `scripts/dev/smoke-electron-packaged.mjs` | packaged Electron executable-এর স্পষ্ট path। |
| `ELECTRON_SMOKE_DATA_DIR` | _(tmpdir)_ | `scripts/dev/smoke-electron-packaged.mjs` | Electron smoke run-এর data directory। |
| `ELECTRON_SMOKE_KEEP_DATA` | `0` | `scripts/dev/smoke-electron-packaged.mjs` | run-এর পরে smoke data directory সংরক্ষণ করতে `1` সেট করুন। |
| `ELECTRON_SMOKE_STREAM_LOGS` | `0` | `scripts/dev/smoke-electron-packaged.mjs` | run চলাকালীন Electron log stdout-এ stream করতে `1` সেট করুন। |
| `ELECTRON_SMOKE_COLD_RESTART` | `0` | `scripts/dev/smoke-electron-packaged.mjs` | #7592: একই data dir ব্যবহার করে পুনরায় চালু করে এবং নিশ্চিত করে যে দ্বিতীয় launch-এ native SQLite driver নির্বাচন করা হয়েছে। |
| `CLI_DEVIN_BIN` | _(PATH lookup)_ | `open-sse/executors/devin-cli.ts` | Devin CLI binary path override করে। |
### ডকুমেন্টেশন অনুবাদ পাইপলাইন
`scripts/i18n/run-translation.mjs` দ্বারা ব্যবহৃত (`npm run i18n:run` কমান্ড)।
পাঁচটি ভেরিয়েবলই ডিফল্টভাবে সেট করা থাকে না — কেবল সেইসব মেশিনের `.env`-এ এগুলো সেট করুন,
যেগুলোতে ডকুমেন্টেশন অনুবাদক চালানোর অনুমতি থাকা উচিত।
| ভেরিয়েবল | ডিফল্ট | সোর্স ফাইল | বিবরণ |
| ----------------------------------- | --------------- | ---------------------------------- | ----------------------------------------------------------------------------- |
| `OMNIROUTE_TRANSLATION_API_URL` | _(সেট করা নেই)_ | `scripts/i18n/run-translation.mjs` | অনুবাদ ব্যাকএন্ডের জন্য OpenAI-সামঞ্জস্যপূর্ণ বেস URL। |
| `OMNIROUTE_TRANSLATION_API_KEY` | _(সেট করা নেই)_ | `scripts/i18n/run-translation.mjs` | অনুবাদ ব্যাকএন্ডের জন্য Bearer টোকেন (কখনো লগ করা হয় না)। |
| `OMNIROUTE_TRANSLATION_MODEL` | _(সেট করা নেই)_ | `scripts/i18n/run-translation.mjs` | মডেল আইডি, যেমন `gpt-4o-mini` বা `cx/gpt-5.4-mini`। |
| `OMNIROUTE_TRANSLATION_TIMEOUT_MS` | `60000` | `scripts/i18n/run-translation.mjs` | প্রতি অনুরোধের সময়সীমা, মিলিসেকেন্ডে। |
| `OMNIROUTE_TRANSLATION_CONCURRENCY` | `4` | `scripts/i18n/run-translation.mjs` | একাধিক ফাইল / লোকেলের ক্ষেত্রে চালানোর সময় সমান্তরাল অনুবাদ অনুরোধের সংখ্যা। |
---
## 27. Radar Feed (স্ব-হোস্টিং)
ঐচ্ছিক অ্যাড-অন, যা RADAR_ENABLED ফিচার ফ্ল্যাগ দ্বারা নিয়ন্ত্রিত (ডিফল্টভাবে বন্ধ — এটি Settings/DB-এর মাধ্যমে টগল করা একটি ফিচার
ফ্ল্যাগ, কোনো env var নয়; দেখুন
[docs/frameworks/RADAR.md](../frameworks/RADAR.md#flag-radar_enabled-default-off))।
নিচের প্রথম চারটি ভেরিয়েবল স্ব-হোস্ট করা বা ফর্ক করা ফিড এবং
supporter-key প্রবাহের জন্য ঐচ্ছিক ওভাররাইড। পঞ্চমটি, `RADAR_ADMIN_URL`, মালিকের
ব্যক্তিগত অপারেশন প্যানেলের জন্য পৃথক, ডিফল্টবিহীন একটি লিংক। সম্পূর্ণ
মডিউল ডকুমেন্টেশন এবং এর
[শুরু থেকে শেষ পর্যন্ত সক্রিয়করণ ও নির্দেশিত সেটআপের ধাপসমূহ](../frameworks/RADAR.md#end-to-end-activation-and-guided-setup) দেখতে [docs/frameworks/RADAR.md](../frameworks/RADAR.md) দেখুন।
সাধারণ Home/Changelog ঘোষণা রিডার কোনো environment
variable দ্বারা কনফিগার করা হয় না এবং RADAR_ENABLED ফিচার ফ্ল্যাগের ওপর নির্ভর করে না। এটি কেবল
GET-এর মাধ্যমে `src/shared/utils/releaseNotes.ts`-এ ঘোষিত পাবলিক রিপোজিটরির
`news.json` URL পড়ে; বাতিল করার ID-গুলো ব্রাউজারের লোকাল স্টোরেজে থেকে যায়।
| ভেরিয়েবল | ডিফল্ট | সোর্স ফাইল | বিবরণ |
| ----------------------------- | -------------------------------------------- | ------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| `RADAR_FEED_URL` | `https://radar.omniroute.online` | `src/lib/radar/{sync,referralsSync,offersSync,intelSync}.ts` | পৃথকভাবে স্বাক্ষরিত catalog, referrals, supporter-offers এবং Intel ফিডগুলোর অভিন্ন বেস URL। স্ব-হোস্ট করা বা ফর্ক করা কোনো সার্ভিস নির্দেশ করতে এটি ওভাররাইড করুন। |
| `RADAR_FEED_PUBKEY` | _(পিন করা ডিফল্ট কী)_ | `src/lib/radar/pinnedKeys.ts` | কাস্টম ফিড থেকে আসা ফিড স্বাক্ষর যাচাই করতে ব্যবহৃত Ed25519 পাবলিক কী (base64-DER SPKI বা PEM)। |
| `RADAR_CONTRIBUTOR_CLAIM_URL` | `https://radar.omniroute.online/auth/github` | `src/lib/radar/links.ts` | ড্যাশবোর্ডের "আমি একজন অবদানকারী" বোতামটি যে URL খোলে (GitHub OAuth supporter-key দাবি করার প্রবাহ)। |
| `RADAR_SUPPORTER_PLANS_URL` | `https://radar.omniroute.online/planos` | `src/lib/radar/links.ts` | ড্যাশবোর্ডের "প্রকল্পটিকে সহায়তা করুন" বোতামটি যে URL খোলে (পেমেন্ট/প্ল্যান পৃষ্ঠা)। |
| `RADAR_ADMIN_URL` | _(সেট করা নেই)_ | `src/lib/radar/links.ts` | কেবল মালিকের জন্য ব্যক্তিগত অপারেশন-প্যানেলের লিংক। HTTP লুপব্যাক SSH ফরওয়ার্ড ছাড়া HTTPS আবশ্যক; সেট না করা বা অবৈধ মান কোনো নেভিগেশন আইটেম তৈরি করে না। |
---
## অডিট: অপসারিত / অব্যবহৃত ভেরিয়েবল
নিচের ভেরিয়েবলগুলো `.env.example`-এর পূর্ববর্তী সংস্করণগুলোতে ছিল, কিন্তু বর্তমান কোডবেসে এগুলোর **কোনো রানটাইম রেফারেন্স নেই**। এগুলো অপসারণ করা হয়েছে:
| ভেরিয়েবল | কারণ |
| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| `STORAGE_DRIVER=sqlite` | কোনো সোর্স ফাইলেই এটি পড়া হয় না। SQLite-ই একমাত্র সমর্থিত ড্রাইভার — নির্বাচন করার প্রয়োজন নেই। |
| `INSTANCE_NAME=omniroute` | পুরোনো ডকুমেন্টেশন/env টেমপ্লেটে উপস্থিত থাকলেও রানটাইমে অব্যবহৃত। ভবিষ্যতের কোনো মাল্টি-ইনস্ট্যান্স ফিচারে ফিরে আসতে পারে। |
| `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 একটি CLI বাইনারি নয়, OAuth ব্যবহার করে)। |
| `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-এ সরিয়ে ফেলা হয়েছে। রানটাইম আর এই env ভেরিয়েবলগুলো পড়ে না — ক্রেডেনশিয়াল Dashboard / `data/provider-credentials.json` / এনক্রিপ্টেড DB থেকে আসে। |
| `CURSOR_PROTOBUF_DEBUG` | v3.8.0-এ সরিয়ে ফেলা হয়েছে। Cursor এক্সিকিউটর `CURSOR_DEBUG` / `CURSOR_STREAM_DEBUG` ব্যবহার করে (§22 দেখুন)। |
| `CLI_COMPAT_KIRO` | v3.8.0-এ সরিয়ে ফেলা হয়েছে। Kiro `CLI_COMPAT_OMITTED_PROVIDER_IDS`-এ রয়েছে — এর টগলের কোনো প্রভাব নেই। |
| `QIANFAN_API_KEY` | v3.8.0-এ অন্যান্য অব্যবহৃত প্রোভাইডার API কী স্টাবের সঙ্গে সরিয়ে ফেলা হয়েছে। |
### ডিফল্ট মানের সংশোধন
| ভেরিয়েবল | পুরোনো `.env.example` মান | কোডের প্রকৃত ডিফল্ট | সংশোধন |
| ------------------------- | ------------------------- | ------------------- | -------------------------------------------------------------------------- |
| `APP_LOG_RETENTION_DAYS` | `90` | `7` | ✅ বিভ্রান্তিকর মান সরানো হয়েছে; `7`-কে ডিফল্ট হিসেবে নথিভুক্ত করা হয়েছে |
| `CALL_LOG_RETENTION_DAYS` | `90` | `7` | ✅ বিভ্রান্তিকর মান সরানো হয়েছে; `7`-কে ডিফল্ট হিসেবে নথিভুক্ত করা হয়েছে |
### OpenCode কনফিগ পুনর্জেনারেশন (অ্যাড-হক টুলিং)
চলমান OmniRoute ইনস্ট্যান্স থেকে নির্ভুল `limit.context` এবং `limit.output` মান নিয়ে একটি `opencode.json`
পুনর্জেনারেট করতে `scripts/ad-hoc/regen-opencode-config.ts` এটি ব্যবহার করে।
স্বাভাবিক কার্যক্রমের জন্য এগুলোর কোনোটিই প্রয়োজনীয় নয় — স্ক্রিপ্টটি
শুধু ডেভেলপার টুলিং।
| ভেরিয়েবল | ডিফল্ট | সোর্স ফাইল | বিবরণ |
| ------------------ | ------------------------ | ----------------------------------------- | ------------------------------------------------------------------------------------------------------------------------ |
| `OMNIROUTE_URL` | `http://localhost:20128` | `scripts/ad-hoc/regen-opencode-config.ts` | `/v1/models` কোয়েরি করার জন্য OmniRoute ইনস্ট্যান্সের বেস URL। |
| `OMNIROUTE_KEY` | _(সেট করা নেই)_ | `scripts/ad-hoc/regen-opencode-config.ts` | OmniRoute `/v1/models` এন্ডপয়েন্টে প্রমাণীকরণের জন্য API কী। সেট করা না থাকলে `OPENCODE_API_KEY` ব্যবহার করে। |
| `OPENCODE_API_KEY` | _(সেট করা নেই)_ | `scripts/ad-hoc/regen-opencode-config.ts` | পুনরায় তৈরি করা `opencode.json`-এ লেখা OpenCode-ধাঁচের API কী (`sk-...`)। সেট করা না থাকলে `OMNIROUTE_KEY` ব্যবহার করে। |
### কম্প্রেশন অফলাইন-ইভ্যাল হারনেস (অ্যাড-হক টুলিং)
অফলাইন কম্প্রেশন মূল্যায়ন CLI দ্বারা `scripts/compression-eval/index.ts` ব্যবহৃত হয়।
স্বাভাবিক পরিচালনার জন্য প্রয়োজনীয় নয় — শুধুমাত্র ডেভেলপার টুলিং।
| ভেরিয়েবল | ডিফল্ট | সোর্স ফাইল | বিবরণ |
| ---------------------------- | ----------- | ----------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| `OMNIROUTE_EVAL_CREDENTIALS` | `{}` (খালি) | `scripts/compression-eval/index.ts` | অফলাইন compression-eval CLI দ্বারা ব্যবহৃত প্রোভাইডারের জন্য অপারেটর-সরবরাহকৃত JSON ক্রেডেনশিয়াল (`JSON.parse` দিয়ে পার্স করা হয়)। ড্রাই রানের জন্য সেট না করে রাখুন। |
### VNC ব্রাউজার সেশন
ব্রাউজার-অটোমেশন প্রোভাইডারগুলোর জন্য Docker-ভিত্তিক হেডলেস Chromium সেশন কনফিগার করতে `src/lib/vncSession/manifest.ts` দ্বারা ব্যবহৃত হয়। সবগুলোই ঐচ্ছিক — ডিফল্টগুলো নিচে দেখানো হয়েছে।
| ভেরিয়েবল | ডিফল্ট | সোর্স ফাইল | বিবরণ |
| ------------------------------------- | ------------------------------ | ------------------------------------------- | ------------------------------------------------------------------------------------- |
| `OMNIROUTE_DOCKER_BIN` | `docker` | `src/lib/vncSession/manifest.ts` | VNC কনটেইনার চালু করতে ব্যবহৃত Docker বাইনারির পাথ। |
| `OMNIROUTE_VNC_IMAGE` | `omniroute-vnc-chromium:local` | `src/lib/vncSession/manifest.ts` | VNC Chromium কনটেইনারের Docker ইমেজ। |
| `OMNIROUTE_VNC_CHROMIUM_ARGS` | _(বিল্ট-ইন ফ্ল্যাগ)_ | `src/lib/vncSession/manifest.ts` | কনটেইনারের ভেতরে ব্রাউজারে পাঠানো অতিরিক্ত Chromium CLI আর্গুমেন্ট। |
| `OMNIROUTE_VNC_CONTAINER_VNC_PORT` | `3000` | `src/lib/vncSession/manifest.ts` | কনটেইনারের ভেতরের VNC পোর্ট। |
| `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` | কনটেইনারের ভেতরের প্রোফাইল ডিরেক্টরি। |
| `OMNIROUTE_VNC_PROFILE_DIR` | _(সেট করা নেই)_ | `src/lib/vncSession/manifest.ts` | স্থায়ী ব্রাউজার প্রোফাইলের জন্য হোস্ট-সাইড ডিরেক্টরি। |
| `OMNIROUTE_VNC_IDLE_MS` | `600000` | `src/lib/vncSession/manifest.ts` | একটি VNC সেশন সংগ্রহ করার আগে নিষ্ক্রিয়তার টাইমআউট (ms)। |
| `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` | ব্রাউজার প্রস্তুতির টাইমআউট (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 নেটওয়ার্কে যুক্ত হয় (#12571), যা ডিফল্ট ব্রিজের বাইরে। |
| `VIBEPROXY_DATA_DIR` | _(সেট করা নেই)_ | `open-sse/services/notionThreadSessions.ts` | Notion থ্রেড সেশন স্থায়ীকরণের জন্য ডিরেক্টরি। |
### অভ্যন্তরীণ সার্ভিস প্রমাণীকরণ
| ভেরিয়েবল | ডিফল্ট | বিবরণ |
| --------------------------------------- | ------ | -------------------------------------------------------------------------------------------------------- |
| `OMNIROUTE_INTERNAL_SERVICE_TOKEN` | – | ম্যানেজমেন্ট-প্লেনের সার্ভিস-টু-সার্ভিস প্রমাণীকরণের জন্য ইনলাইন টোকেন। |
| `OMNIROUTE_INTERNAL_SERVICE_TOKEN_FILE` | – | অভ্যন্তরীণ সার্ভিস টোকেন-সংবলিত ফাইলের পাথ (কনটেইনারে অগ্রাধিকারযোগ্য; ইনলাইন ভেরিয়েবলকে ওভাররাইড করে)। |
### OpenRouter প্রোভাইডার পরিসংখ্যান
| ভেরিয়েবল | ডিফল্ট | বিবরণ |
| ----------------------------------- | --------- | ------------------------------------------------------------------------------------------------ |
| `OPENROUTER_PROVIDER_STATS_ENABLED` | `true` | ক্যাটালগ সমৃদ্ধকরণের জন্য OpenRouter-এর প্রতি-প্রোভাইডার পরিসংখ্যান আনা এড়াতে `false` সেট করুন। |
| `OPENROUTER_PROVIDER_STATS_TTL_MS` | `3600000` | আনা OpenRouter প্রোভাইডার পরিসংখ্যানের ক্যাশ TTL (ms)। |
### এমবেডেড Redis বাইন্ডিং
| ভেরিয়েবল | ডিফল্ট | বিবরণ |
| --------------------------- | ----------- | ------------------------------------------------------------- |
| `REDIS_BIND_HOST` | `127.0.0.1` | এম্বেডেড Redis পরিষেবার বাইন্ড ঠিকানা। |
| `REDIS_PORT` | `6379` | এম্বেডেড Redis পরিষেবার পোর্ট। |
| `OMNIROUTE_REDIS_BIND_HOST` | – | এম্বেডেড Redis বাইন্ড ঠিকানার জন্য OmniRoute-স্কোপড ওভাররাইড। |
---
## 24. রিলিজ v3.8.50-এর সংযোজনসমূহ
পূর্ববর্তী এনভায়রনমেন্ট-কন্ট্রাক্ট স্ন্যাপশটের পরে এই সেটিংসগুলো চালু করা হয়েছে।
| ভেরিয়েবল | ডিফল্ট | সোর্স ফাইল | বিবরণ |
| ------------------------------------------- | -------------------------- | ---------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `OMNIROUTE_CHAT_ADMISSION_QUEUE_MS` | `2000` | `src/shared/middleware/chatBodyAdmission.ts` | পুনরায় চেষ্টা করা যায় এমন `503` ফেরত দেওয়ার আগে একটি হেভিওয়েট চ্যাট অ্যাডমিশন স্লটের জন্য অপেক্ষার সর্বোচ্চ সময়; তাৎক্ষণিক `503` দেওয়ার পরিবর্তে স্বল্প ও সীমাবদ্ধ অপেক্ষা এজেন্টের আকস্মিক অনুরোধগুলোকে ধারাবাহিকভাবে প্রক্রিয়া করে। `0` তাৎক্ষণিক প্রত্যাখ্যান পুনরুদ্ধার করে। |
| `OMNIROUTE_CHAT_ADMISSION_MAX_QUEUED_BYTES` | `4194304` (4 MB) | `src/shared/middleware/chatBodyAdmission.ts` | অ্যাডমিশন অপেক্ষার জন্য সারিবদ্ধ-বাইট বাজেট: পুরো প্রসেসজুড়ে অপেক্ষমাণ মোট বাফার করা বডি বাইট সীমাবদ্ধ করে, যাতে অপেক্ষা হিপের ব্যবহার বাড়িয়ে না দেয় (#4380)। বাজেট অতিক্রম করা অপেক্ষাগুলো অবিলম্বে পুনরায় চেষ্টা করা যায় এমন `503` পায়। |
| `OMNIROUTE_CHAT_VIRTUAL_TTL_MS` | `60000` (60 s) | `src/shared/middleware/chatBodyAdmission.ts` | #10110 থেকে অবচিত নো-অপ: একটি প্রসেস-ব্যাপী বাজেটের পক্ষে প্রতি-সেশন অ্যাডমিশন লেন সরিয়ে দেওয়া হয়েছে। কনফিগারেশন সামঞ্জস্যের জন্য গৃহীত হয়; উপেক্ষা করা হয়। |
| `OMNIROUTE_CHAT_VIRTUAL_MAX_SESSIONS` | `64` | `src/shared/middleware/chatBodyAdmission.ts` | #10110 থেকে অবচিত নো-অপ: একটি প্রসেস-ব্যাপী বাজেটের পক্ষে প্রতি-সেশন অ্যাডমিশন লেন সরিয়ে দেওয়া হয়েছে। কনফিগারেশন সামঞ্জস্যের জন্য গৃহীত হয়; উপেক্ষা করা হয়। |
| `OMNIROUTE_CHAT_VIRTUAL_LANES` | `0` (বন্ধ) | `open-sse/services/admission/runtime.ts` | অভিযোজিত রানটাইম ভার্চুয়াল অ্যাডমিশন লেন (#9654): প্রতি-টেন্যান্ট অভিযোজিত গেটের (সিস্টেম 2) প্রধান সুইচ। উপরের অবচিত প্রতি-কানেকশন লেন ভেরিয়েবলগুলো থেকে আলাদা (TTL_MS / MAX_SESSIONS, #10110 থেকে নো-অপ)। একই নামের ড্যাশবোর্ড ফিচার ফ্ল্যাগ; এনভায়রনমেন্ট ভেরিয়েবলটি ড্যাশবোর্ড ওভাররাইডের ওপর অগ্রাধিকার পায়; পুনরায় চালু করা আবশ্যক। |
| `OMNIROUTE_RUNNOW_TIMEOUT_MS` | `30000` | `src/app/api/jobs/[id]/run-now/route.ts` | সারিবদ্ধ রান শুরু করার আগে চলমান কোনো জবের জন্য একটি run-now কল কতক্ষণ অপেক্ষা করবে, তা সীমাবদ্ধ করে। |
| `ADOBE_FIREFLY_BROWSER_REFRESH` | সক্রিয় | `open-sse/services/adobeFireflySession.ts` | অ্যাকাউন্ট-স্কোপড Chrome CDP সেশনের মাধ্যমে IMS এবং ব্রাউজার-ঝুঁকি অবস্থা হালনাগাদ রাখে; নিষ্ক্রিয় করতে `0` সেট করুন। |
| `ADOBE_FIREFLY_SESSION_DISK` | সক্রিয় | `open-sse/services/adobeFireflySession.ts` | মেরামত করা Adobe সেশনগুলো `DATA_DIR`-এর অধীনে সংরক্ষণ করে; শুধু মেমরিতে অবস্থা রাখতে `0` সেট করুন। |
| `ADOBE_FIREFLY_MIN_SUBMIT_GAP_MS` | `12000` | `open-sse/services/adobeFireflySession.ts` | Adobe Firefly জেনারেট সাবমিশনগুলোর মধ্যবর্তী ন্যূনতম বিরতি। |
| `ADOBE_FIREFLY_BATCH_EXTRA_GAP_MS` | `15000` | `open-sse/services/adobeFireflySession.ts` | প্রতি তৃতীয় সফল Adobe সাবমিশনের পর অতিরিক্ত নিষ্ক্রিয় সময়কাল। |
| `ADOBE_FIREFLY_CHROME_HEADLESS` | `0` | `open-sse/services/adobeFireflyBrowserLogin.ts` | শুধু ডিবাগের জন্য প্রকৃত হেডলেস মোড; Adobe colligo সাধারণত এর ফলে তৈরি হওয়া ঝুঁকিপূর্ণ সেশন প্রত্যাখ্যান করে। |
| `CHROME_PATH` | স্বয়ংক্রিয় শনাক্তকরণ | `open-sse/executors/cloudflare-playground.ts`, `open-sse/executors/chatgpt-web-codex.ts` | প্ল্যাটফর্মের স্বয়ংক্রিয় শনাক্তকরণ যথেষ্ট না হলে ব্রাউজার-চালিত এক্সিকিউটরগুলো যে ঐচ্ছিক পরম Chrome এক্সিকিউটেবল পাথ ব্যবহার করবে। |
| `TELEGRAM_BOT_TOKEN` | _(সেট করা নেই)_ | `src/lib/telegram/config.ts` | BotFather টোকেন, যা ইনবাউন্ড ওয়েবহুক সক্রিয় করে এবং Mini App `initData` স্বাক্ষর করে। |
| `TELEGRAM_WEBHOOK_SECRET` | _(সেট করা নেই)_ | `src/lib/telegram/config.ts` | `setWebhook`-এর মাধ্যমে নিবন্ধিত শেয়ার্ড সিক্রেট, যা প্রতিটি ওয়েবহুক ডেলিভারিতে `X-Telegram-Bot-Api-Secret-Token` হেডারের বিপরীতে যাচাই করা হয়। ওয়েবহুক পাথের জন্য আবশ্যক; সেট করা না থাকলে ওয়েবহুক ডেলিভারি 503 সহ প্রত্যাখ্যান করা হয়। |
| `TELEGRAM_DEFAULT_MODEL` | `auto/chat` | `src/lib/telegram/chatProxy.ts` | Telegram চ্যাটের উত্তরগুলোর জন্য ব্যবহৃত মডেল। |
| `TELEGRAM_BOT_API_BASE` | `https://api.telegram.org` | `src/lib/telegram/config.ts` | প্রক্সি বা স্ব-হোস্টেড Bot API সার্ভারের জন্য Bot API বেস URL ওভাররাইড। |
| `TELEGRAM_WEBHOOK_TIMEOUT_MS` | `60000` | `src/lib/telegram/config.ts` | আউটবাউন্ড Bot API কলের টাইমআউট, মিলিসেকেন্ডে। |
| `OMNIROUTE_OPTIONAL_PACK_TAR` | `1` (সক্রিয়) | `scripts/build/optionalPackStaging.mjs` | Electron স্বতন্ত্র ট্রির জন্য ঐচ্ছিক ML/ব্রাউজার প্যাক স্টেজ করার সময় `.tar.gz` টারবল তৈরি করা এড়াতে `0` সেট করুন (প্যাক ডিরেক্টরি এবং `optional-packs.index.json` তবুও তৈরি করা হয়)। আর্টিফ্যাক্ট আপলোডের আকার কমাতে ডেস্কটপ রিলিজ ওয়ার্কফ্লো এটি ব্যবহার করে। |
### ChatGPT Web (Codex)
হেডলেস ব্রাউজার এবং আউটবাউন্ড টুল টানেলের জন্য গ্লোবাল ডিফল্ট। ড্যাশবোর্ডে সেট করা কানেকশন মানগুলো অগ্রাধিকার পায়।
| ভেরিয়েবল | ডিফল্ট | সোর্স ফাইল | বিবরণ |
| --------------------------------------- | ------------------------------ | -------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| `CHATGPT_WEB_CODEX_CHROME_PATH` | _(স্বয়ংক্রিয়ভাবে শনাক্ত)_ | `open-sse/executors/chatgpt-web-codex.ts` | npm, systemd এবং PM2 পরিচালনার জন্য নির্দিষ্ট Chrome/Chromium পাথ। |
| `CHROME_PATH` | _(স্বয়ংক্রিয়ভাবে শনাক্ত)_ | `open-sse/executors/chatgpt-web-codex.ts` | নির্দিষ্ট Chrome/Chromium পাথের জন্য সাধারণ ফলব্যাক। |
| `CHATGPT_WEB_CODEX_CDP_URL` | _(সেট করা নেই)_ | `open-sse/executors/chatgpt-web-codex.ts` | অভ্যন্তরীণ CDP এন্ডপয়েন্ট; Docker পোর্ট `9223`-এর সাইডকার ব্যবহার করে। |
| `CDP_PROXY_TOKEN` | _(সেট করা নেই)_ | `docker/chatgpt-web-codex-browser/cdp-proxy.mjs` | সেট করা থাকলে, CDP প্রক্সি সাইডকারে পাঠানো প্রতিটি অনুরোধের `X-Omni-Cdp-Token` হেডারে এই মানটি অন্তর্ভুক্ত করতে হবে (#13679)। কোনো মান না থাকলে প্রক্সি প্রমাণীকরণ ছাড়াই অনুরোধ ফরওয়ার্ড করে—সেক্ষেত্রে কেবল Compose নেটওয়ার্ক `chatgpt-web-codex-net`-এর নেটওয়ার্ক বিচ্ছিন্নতাই সুরক্ষা দেয়। `openssl rand -hex 32` দিয়ে তৈরি করুন। |
| `CHATGPT_WEB_CODEX_TUNNEL_ID` | _(সেট করা নেই)_ | `open-sse/executors/chatgpt-web-codex.ts` | স্থানীয় Codex টুল রাউন্ডের জন্য গ্লোবাল OpenAI টানেল আইডি। |
| `CHATGPT_WEB_CODEX_RUNTIME_KEY` | _(সেট করা নেই)_ | `open-sse/executors/chatgpt-web-codex.ts` | গ্লোবাল টানেল রানটাইম কী; কখনোই লগে আউটপুট করবেন না। |
| `CHATGPT_WEB_CODEX_CONNECTOR_NAME` | `OmniRoute Codex v2` | `open-sse/executors/chatgpt-web-codex.ts` | MCP ব্রিজের জন্য সদ্য তৈরি ChatGPT কাস্টম কানেক্টরের সঠিক নাম। |
| `CODEX_CHATGPT_WEB_HOME` | `/chatgpt-web-codex` | `open-sse/vendor/codex-chatgpt-web/config.ts` | ব্রাউজার, ব্রোকার এবং টানেলের অবস্থার জন্য নিবেদিত ডিরেক্টরি। |
| `CODEX_CHATGPT_WEB_BROWSER_DIAGNOSTICS` | `0` | `open-sse/vendor/codex-chatgpt-web/adapters/chatgpt-web/browser-worker.ts` | `1` হলে প্রতিটি চেকপয়েন্টে ব্রাউজার ডায়াগনস্টিক চিত্র ধারণ করা হয়। |
| `CODEX_CHATGPT_WEB_LAUNCHER` | _(সেট করা নেই)_ | `open-sse/vendor/codex-chatgpt-web/config.ts` | একটি স্থায়ী লঞ্চার বাইনারির ঐচ্ছিক পরম পাথ। |
| `CODEX_CHATGPT_WEB_BUN` | _(স্বয়ংক্রিয়ভাবে শনাক্ত)_ | `open-sse/vendor/codex-chatgpt-web/config.ts` | 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` সেট করা থাকলেই কেবল ব্রিজটি চালু হয়। শুধুমাত্র সার্ভার-সাইড: হাব টোকেন কখনোই ব্রাউজারে পৌঁছানো যাবে না।
| ভেরিয়েবল | ডিফল্ট | সোর্স ফাইল | বিবরণ |
| ------------------------------ | ----------------------- | -------------------------------- | ------------------------------------------------------------------------------------------------------------------------ |
| `CONDUCTOR_HUB_URL` | _(খালি)_ | `src/lib/conductor/boot.ts` | OmniConductor হাবের বেস URL (যেমন `http://127.0.0.1:7910`)। সেট না করা = ব্রিজ নিষ্ক্রিয়। |
| `CONDUCTOR_HUB_TOKEN` | _(খালি)_ | `src/lib/conductor/boot.ts` | SSE ফিডের জন্য হাব ক্রেডেনশিয়াল — হাবে একটি `spokesperson`-ধরনের পিয়ার তৈরি করুন (`POST /v1/peers`, অ্যাডমিন)। |
| `CONDUCTOR_ORCHESTRATOR_TOKEN` | _(খালি)_ | `src/lib/conductor/hubProxy.ts` | ইনবাউন্ড A2A→হাব টাস্ক ডেলিগেশনের জন্য ক্রেডেনশিয়াল (`POST /v1/tasks`); সেট না থাকলে `CONDUCTOR_HUB_TOKEN` ব্যবহার করে। |
| `CONDUCTOR_SPOKESPERSON_URL` | `http://127.0.0.1:7920` | `src/lib/conductor/faroProxy.ts` | ড্যাশবোর্ড চ্যাট প্রক্সির (`/api/conductor/ask`) পেছনে থাকা spokesperson (Faro) সার্ভিসের বেস URL। |
### কোটা-সচেতন শিডিউলিং
রিকোয়েস্ট-পূর্ব টোকেন-বাজেট যাচাইয়ের জন্য `open-sse/services/combo.ts` এবং `src/lib/quota/quotaScheduler.ts` এটি ব্যবহার করে। অপ্ট-ইন — সেট না থাকলে ডিফল্ট রাউটিং আচরণ অপরিবর্তিত থাকে।
| ভেরিয়েবল | ডিফল্ট | সোর্স ফাইল | বিবরণ |
| ------------------------------- | ------ | ---------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| `OMNIROUTE_QUOTA_AWARE_ROUTING` | `0` | `open-sse/services/combo.ts` | `1` হলে, ডিসপ্যাচের আগে যেসব সংযোগের প্রতি-উইন্ডো টোকেন বাজেট (`rateLimitOverrides.tpm`, টেবিল `provider_quota_state`) আনুমানিক রিকোয়েস্ট খরচ বহন করতে পারে না, সেগুলো এড়িয়ে যায়। কোনো বাজেট কনফিগার করা না থাকলে fail-open হয়। |