# Environment Variables Reference (فارسی)
🌐 **Languages:** 🇺🇸 [English](../../../../reference/ENVIRONMENT.md) · 🇪🇹 [am](../../../am/docs/reference/ENVIRONMENT.md) · 🇸🇦 [ar](../../../ar/docs/reference/ENVIRONMENT.md) · 🇦🇿 [az](../../../az/docs/reference/ENVIRONMENT.md) · 🇧🇬 [bg](../../../bg/docs/reference/ENVIRONMENT.md) · 🇧🇩 [bn](../../../bn/docs/reference/ENVIRONMENT.md) · 🇧🇦 [bs](../../../bs/docs/reference/ENVIRONMENT.md) · 🇨🇿 [cs](../../../cs/docs/reference/ENVIRONMENT.md) · 🇩🇰 [da](../../../da/docs/reference/ENVIRONMENT.md) · 🇩🇪 [de](../../../de/docs/reference/ENVIRONMENT.md) · 🇬🇷 [el](../../../el/docs/reference/ENVIRONMENT.md) · 🇪🇸 [es](../../../es/docs/reference/ENVIRONMENT.md) · 🇪🇪 [et](../../../et/docs/reference/ENVIRONMENT.md) · 🇫🇮 [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 شناسایی میکند.
> برای یک الگوی شروع سریع، به [`.env.example`](../../.env.example) مراجعه کنید.
> [!IMPORTANT]
> هر متغیری که در اینجا مستند شده است باید در `.env.example` نیز وجود داشته باشد و
> هر متغیر موجود در `.env.example` نیز باید در اینجا ذکر شود. `npm run check:env-doc-sync`
> این هماهنگی را هنگام commit و در CI اعمال میکند. برای حذف عمدی یک متغیر، آن را به
> فهرست مجاز درون `scripts/check/check-env-doc-sync.mjs` اضافه کنید.
---
## فهرست مطالب
- [1. اسرار الزامی](#1-required-secrets)
- [2. فضای ذخیرهسازی و پایگاه داده](#2-storage--database)
- [3. شبکه و پورتها](#3-network--ports)
- [4. امنیت و احراز هویت](#4-security--authentication)
- [5. پاکسازی ورودی و محافظت از اطلاعات شناسایی شخصی](#5-input-sanitization--pii-protection)
- [6. سیاستهای ابزار و مسیریابی](#6-tool--routing-policies)
- [7. نشانیهای اینترنتی و همگامسازی ابری](#7-urls--cloud-sync)
- [8. پراکسی خروجی](#8-outbound-proxy)
- [9. یکپارچهسازی ابزار CLI](#9-cli-tool-integration)
- [10. یکپارچهسازیهای عامل داخلی و MCP](#10-internal-agent--mcp-integrations)
- [11. اطلاعات احراز هویت ارائهدهندگان OAuth](#11-oauth-provider-credentials)
- [12. بازنویسیهای User-Agent ارائهدهندگان](#12-provider-user-agent-overrides)
- [13. سازگاری اثر انگشت CLI](#13-cli-fingerprint-compatibility)
- [14. ارائهدهندگان کلید API](#14-api-key-providers)
- [15. تنظیمات مهلت زمانی](#15-timeout-settings)
- [16. ثبت گزارش](#16-logging)
- [17. بهینهسازی حافظه](#17-memory-optimization)
- [18. همگامسازی قیمتگذاری](#18-pricing-sync)
- [19. همگامسازی مدل (توسعه)](#19-model-sync-dev)
- [20. تنظیمات مختص ارائهدهنده](#20-provider-specific-settings)
- [21. سلامت پراکسی](#21-proxy-health)
- [22. اشکالزدایی](#22-debugging)
- [23. یکپارچهسازی GitHub](#23-github-integration)
- [24. محیط ایزولهٔ مهارتها (v3.8.0+)](#24-skills-sandbox-v380)
- [27. خوراک رادار (میزبانی شخصی)](#27-radar-feed-self-hosting)
- [سناریوهای استقرار](#deployment-scenarios)
- [ممیزی: متغیرهای حذفشده / بدون استفاده](#audit-removed--dead-variables)
---
## 1. اسرار الزامی
رمزهای تنظیمنشده که با **بله** علامت خوردهاند، در نخستین اجرا بهطور خودکار ساخته میشوند (`JWT_SECRET`, `API_KEY_SECRET`) و در `server.env` در پوشه داده ذخیره میشوند — اگر آن پوشه موقتی است، آنها را صریحاً تنظیم کنید. استثنا `OMNIROUTE_WS_BRIDGE_SECRET` است: در `server.env` ذخیره نمیشود — نقاط ورودی سرور در هر بوت مقداری موقت میسازند که فقط پل درون فرآیند میتواند از آن استفاده کند؛ بنابراین کلاینتهای بیرونی پل باید آن را صریحاً تنظیم کنند.
| متغیر | الزامی | پیشفرض | فایل منبع | توضیحات |
| ---------------------------- | ---------------------- | -------------------------- | --------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `JWT_SECRET` | **بله** | _(هیچکدام)_ | `src/lib/auth` | برای امضا/اعتبارسنجی تمام کوکیهای نشست داشبورد (JWT) استفاده میشود. با `openssl rand -base64 48` تولید کنید. |
| `API_KEY_SECRET` | **بله** | _(هیچکدام)_ | `src/lib/db/apiKeys.ts` | کلید رمزنگاری AES برای مقادیر کلید API ذخیرهشده در SQLite. با `openssl rand -hex 32` تولید کنید. |
| `INITIAL_PASSWORD` | خیر | _(تنظیمنشده)_ | `src/lib/auth/managementPassword.ts` | در صورت اینکه هنوز گذرواژهای ذخیره نشده باشد، گذرواژه داشبورد را هنگام راهاندازی تعیین میکند؛ پس از ذخیرهشدن گذرواژه نادیده گرفته میشود. نصبهای npm و سورس، `.env.example` را در `.env` کپی میکنند و بنابراین با جایگزین شناختهشده عمومی آن یعنی `CHANGEME` شروع میشوند: پیش از نخستین بوت آن را جایگزین کنید، یا در همان `.env` مقدار `INITIAL_PASSWORD=` (خالی) تنظیم کنید تا گذرواژه در نخستین بازدید در راهنمای راهاندازی ساخته شود، همانطور که مقدار تنظیمنشده (پیشفرض ایمیج Docker) این کار را میکند. گذرواژه ذخیرهشده را در داشبورد ← تنظیمات ← امنیت تغییر دهید، یا دستور `omniroute reset-password` را (`node bin/reset-password.mjs` در نسخه سورس) با `DATA_DIR` برابر پوشه داده سرور اجرا کنید. |
| `OMNIROUTE_WS_BRIDGE_SECRET` | **بله** (محیط عملیاتی) | _(تنظیمنشده)_ | `src/app/api/internal/codex-responses-ws/route.ts` | راز مشترک برای پل داخلی WebSocket مربوط به Codex Responses. درخواستهای پل میان رله WS در Electron/مرورگر و OmniRoute را احراز هویت میکند. ⚠️ **در محیط عملیاتی الزامی است — اگر تنظیم نشده باشد، تمام درخواستهای پل WS رد میشوند.** با `openssl rand -base64 32` تولید کنید. |
| `OMNIROUTE_SW_BUILD_ID` | خیر | _(git SHA)_ | `next.config.mjs`, `scripts/build/assembleStandalone.mjs` | شناسه صریح ابطال کش service worker برای پوسته PWA (#11779)؛ نخستین گزینه در زنجیره تعیین مقدار. |
| `SOURCE_VERSION` | خیر | _(تنظیمنشده)_ | `next.config.mjs`, `scripts/build/assembleStandalone.mjs` | دومین گزینه در زنجیره — توسط سازندگان PaaS (برای مثال، به سبک Heroku) روی commit استقراریافته تنظیم میشود. |
| `NEXT_PUBLIC_SW_BUILD_ID` | خیر | _(مشتقشده)_ | `src/shared/components/PwaRegister.tsx` | مقدار عمومی زمان build که کلاینت برای ثبت `/sw.js?v=…` استفاده میکند؛ ابتدا از دو مقدار بالا و سپس از git SHA مشتق میشود. |
| `OMNIROUTE_PEER_STAMP_TOKEN` | خیر (خودکار) | _(خودکار در هر راهاندازی)_ | `src/server/authz/policies/management.ts` | راز مختص هر فرایند که ثابت میکند مُهر IP همتای مورداعتماد از سرور HTTP خود OmniRoute (`scripts/dev/peer-stamp.mjs`) آمده است. میانافزار authz تنها زمانی به محلیبودن درخواست اعتماد میکند (محدودسازی مسیرهای LOCAL_ONLY به loopback/LAN) که مُهر حاوی این توکن باشد. در هر راهاندازی بهطور خودکار تولید میشود — آن را تنظیمنشده باقی بگذارید؛ فقط برای پیکربندیهای چندفرایندی که باید مُهر مشترکی داشته باشند، مقدار آن را ثابت کنید. |
| `OMNIROUTE_TRUSTED_PROXIES` | خیر | _(تنظیمنشده)_ | `scripts/dev/peer-stamp.mjs` | فهرستی با جداکننده ویرگول از IPها یا محدودههای CIDR مربوط به reverse proxyهایی که فهرست مجاز/مسدود IP میتواند به `X-Forwarded-For` / `X-Real-IP` آنها اعتماد کند؛ علاوه بر آدرسهای loopback، شبکه خصوصی و لبههای Cloudflare که همیشه مورداعتماد هستند. این مقدار فقط برای proxy روی هر آدرس عمومی دیگری لازم است؛ در غیر این صورت، فیلتر آدرس خود آن proxy را ارزیابی میکند. |
### فرمانهای تولید
```bash
# تولید هر چهار راز بهصورت همزمان:
echo "JWT_SECRET=$(openssl rand -base64 48)"
echo "API_KEY_SECRET=$(openssl rand -hex 32)"
echo "INITIAL_PASSWORD=$(openssl rand -base64 16)"
echo "OMNIROUTE_WS_BRIDGE_SECRET=$(openssl rand -base64 32)"
```
> [!CAUTION]
> هرگز فایلهای `.env` حاوی اسرار واقعی را در سامانه کنترل نسخه commit نکنید. `.gitignore` از قبل `.env` را مستثنا میکند، اما پیش از push کردن این موضوع را بررسی کنید.
---
## 2. فضای ذخیرهسازی و پایگاه داده
OmniRoute برای تمام دادههای پایدار از **SQLite** (از طریق `better-sqlite3`) استفاده میکند. این متغیرها محل دادهها، رمزگذاری و چرخهٔ عمر آنها را کنترل میکنند.
| متغیر | پیشفرض | فایل منبع | توضیحات |
| ------------------------------------------ | ----------------------------- | ----------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `DATA_DIR` | `~/.omniroute/` | `src/lib/db/core.ts` | دایرکتوری ریشه برای پایگاه دادهٔ SQLite، نسخههای پشتیبان و فایلهای داده. برای volumeهای Docker یا مسیرهای سفارشی، آن را بازنویسی کنید. |
| `OMNIROUTE_ALLOW_DEFAULT_DATA_DIR` | _(تنظیمنشده)_ | `src/lib/dataPaths.ts` | راه گریز برای محافظ `DATA_DIR` در آزمون/eval (#10428). آزمونها و کاوشهای eval/print در Node (`-e`/`--eval`/`-p`/`--print`، از جمله شکلهای `--eval=`/`--print=`) که `DATA_DIR` ندارند، به یک دایرکتوری موقت و دورریختنی هدایت میشوند تا نتوانند پایگاه دادهٔ واقعی اپراتور را باز کنند؛ برای استفادهٔ مجدد از دایرکتوری واقعی، آن را روی `1` تنظیم کنید. |
| `OMNIROUTE_BUILD_SHA` | _(تنظیمنشده)_ | `src/lib/monitoring/buildSha.ts` | SHA مربوط به Git برای آرتیفکت در حال اجرا. توسط `npm run build:release` ثبت میشود؛ در کانتینرهایی که بدون نشانگر `dist/BUILD_SHA` عرضه میشوند، قابل تزریق است. در `/api/monitoring/health` بهصورت `system.buildSha` نمایش داده میشود. |
| `OMNIROUTE_RELEASE_REF` | `origin/main` | `scripts/build/buildProvenance.ts` | ارجاعی که دروازهٔ منشأ آرتیفکت بستهبندیشده، SHA ساخت را با آن بررسی میکند (#10427). |
| `OMNIROUTE_ALLOW_CANARY_BUILD` | _(تنظیمنشده)_ | `scripts/build/buildProvenance.ts` | برای اجازهدادن به بستهبندی ساختی که SHA آن در خط انتشار نیست، روی `1` تنظیم کنید؛ در این حالت بهجای شکست دروازه، ساخت بهعنوان canary عمدی ثبت میشود (#10427). |
| `OMNIROUTE_SMOKE_API_KEY` | _(تنظیمنشده)_ | `scripts/ops/deploy-canary.mjs` | کلید API برای کاوش smoke استقرار canary که بهشکل `Authorization: Bearer` به `/v1/chat/completions` ارسال میشود. فقط توسط اسکریپت استقرار استفاده میشود (#10429) و هرگز توسط سرور استفاده نمیشود. این متغیر ارتباطی با متغیرهای `OMNIROUTE_SMOKE_*` متعلق به چارچوب smoke اختیاری CLI ندارد (`RUN_CLI_SMOKE=1`، `OMNIROUTE_SMOKE_BASE_URL/MODEL/API_KEY_ENV/TARGETS/TIMEOUT_MS` در `tests/integration/upstream-cli-smoke.int.test.ts`) — به [یکپارچهسازیهای CLI ← پیمایش smoke واقعی](../guides/CLI-INTEGRATIONS.md) مراجعه کنید. |
| `OMNIROUTE_BUILDING` | _(تنظیمنشده)_ | `src/lib/buildPhase.ts` | سیگنال مرحلهٔ ساخت (#10060): توسط `scripts/build/build-next-isolated.mjs` روی `1` تنظیم میشود و هر worker ساختِ ایجادشده آن را به ارث میبرد تا لایهٔ پایگاه داده بهجای بارگذاری افزونهٔ بومی better-sqlite3 (که هنگام خروج باعث خاتمهٔ worker میشود)، یک stub بدون عملیات برگرداند. هرگز برای سرور در حال اجرا تنظیم نمیشود. |
| `OMNIROUTE_SKIP_NATIVE_DEP_CHECK` | `0` | `scripts/check/check-native-deps.mjs` | برای ردکردن بررسی اختیاری پیش از ساختِ وابستگیهای بومی در درختهای vendored نامتعارف، روی `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). در Docker/K8s، بهجای جابهجاکردن HOME صرفاً برای تغییر محل مسیر اسکن، آن را به درخت افزونهٔ bind-mountشده اشاره دهید (HOME بر تمام رفتارهای دیگر وابسته به دایرکتوری خانگی نیز حاکم است). تنظیمنشده = `~/.omniroute/plugins`، یا هنگامی که فرایند هیچ دایرکتوری خانگیای export نمیکند، `/tmp/.omniroute/plugins` — این متغیر مانع عدم کشف خاموش میشود. دایرکتوری نهایی در زمان راهاندازی یکبار با نام `scanner.dir_resolved` و همراه با ورودی برگزیده در گزارش ثبت میشود. فقط سمت سرور: افزونههای فرمان CLI همچنان از `OMNIROUTE_PLUGIN_PATH` اختصاصی خود استفاده میکنند (بخش 9). |
| `STORAGE_ENCRYPTION_KEY` | _(خالی = غیرفعال)_ | `src/lib/db/encryption.ts` | کلید AES برای رمزگذاری کامل پایگاه داده SQLite در حالت ذخیرهشده. آن را با `openssl rand -hex 32` تولید کنید. |
| `STORAGE_ENCRYPTION_KEY_VERSION` | `v1` | `scripts/build/bootstrap-env.mjs`, `electron/main.js` | برچسب نسخه برای کلید رمزگذاری. هنگام چرخش کلید، آن را افزایش دهید تا رمزگشایی نسخههای پشتیبان قدیمی امکانپذیر باشد. |
| `DISABLE_SQLITE_AUTO_BACKUP` | `false` | `src/lib/db/backup.ts` | وقتی `true` باشد، از پشتیبانگیریهای معمول/پیش از نوشتن فایل SQLite (ذخیره/پاکسازی قیمتگذاری models.dev و نوشتن تنظیمات) صرفنظر میکند. پشتیبانگیریهای دستی و پیش از بازیابی همچنان اجرا میشوند. این گزینه تصویر ایمنی پایدار و اجباری اجراکننده مهاجرت یا محافظ مهاجرت انبوه برای یک پایگاه داده پایدار موجود را غیرفعال **نمیکند**. پشتیبانگیریهای غیردستی حداکثر به یکبار در هر ۶۰ دقیقه محدود میشوند. در داشبورد، **تنظیمات ← ذخیرهسازی** میتواند پشتیبانگیری خودکار معمول را بهطور مستقل غیرفعال کند. |
| `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 را (برحسب میلیثانیه) بازنویسی میکند. وقتی تنظیم نشده باشد، مقادیر پیشفرض از `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` (۵ دقیقه) | `src/lib/db/walMaintenance.ts` | بازه مکرر `wal_checkpoint(PASSIVE)` را (برحسب میلیثانیه) بازنویسی میکند. فریمهای معلق WAL را کم نگه میدارد تا نقاط وارسی سریع باقی بمانند و اندازه فایل WAL بین عملیات کوتاهسازی هنگام خاموششدن محدود بماند. `0` آن را غیرفعال میکند. |
| `OMNIROUTE_WAL_GUARD_MAX_MB` | `256` | `src/lib/db/walMaintenance.ts` | وقتی یک اجرای دورهای PASSIVE تشخیص دهد که فایل WAL از این اندازه بزرگتر است، `wal_checkpoint(RESTART)` را اجرا میکند تا WAL بدون بازنویسی wal-index نگاشتشده از نو آغاز شود. نقاط وارسی زنده با حالت کوتاهسازی حذف شدهاند (ردیف `OMNIROUTE_WAL_TRUNCATE_INTERVAL_MS` را ببینید). |
| `OMNIROUTE_PRESSURE_SELF_RESTART` | `false` | `open-sse/utils/resourcePressure.ts` | آن را روی `1`/`true`/`yes`/`on` تنظیم کنید تا پس از تداوم فشار بحرانی منابع بهمدت `OMNIROUTE_PRESSURE_SELF_RESTART_AFTER_MS`، فرایند خارج شود و یک ناظر (systemd با `Restart=always` یا سیاست راهاندازی مجدد Docker) بهجای ارائه نامحدود پاسخهای 503، یک فرایند پاک را دوباره راهاندازی کند. |
| `OMNIROUTE_PRESSURE_SELF_RESTART_AFTER_MS` | `120000` (۲ دقیقه) | `open-sse/utils/resourcePressure.ts` | مدتزمانی که فشار بحرانی باید ادامه یابد تا خروج برای راهاندازی مجدد خودکار فعال شود. |
| `OMNIROUTE_PRESSURE_PSI_DISABLED` | `false` | `open-sse/utils/resourcePressurePolicy.ts` | آن را روی `1`/`true`/`yes`/`on` تنظیم کنید تا وقتی یک همسایه پرسروصدا با وجود سالمبودن این فرایند باعث پاسخهای 503 میشود، `/proc/pressure/memory` در سطح میزبان (`psi_some` / `psi_full`) نادیده گرفته شود (#13124). محافظهای cgroup و هیپ V8 فعال باقی میمانند. همچنین PSI دیگر بهعنوان مدرک محدودسازی هسته برای `cgroup_high` محسوب نمیشود: در این حالت، مجموع cgroup بالاتر از `memory.high` تنها با افزایش `high`/`max` در `memory.events` بحرانی میشود. بدون `memory.events`، نسبت خام حفظ میشود. |
| `OMNIROUTE_SQLJS_WASM_PATH` | _(تشخیص خودکار)_ | `src/lib/db/adapters/sqljsAdapter.ts` | مسیر صریح (مطلق یا نسبی به cwd) به `sql-wasm.wasm` هنگام استفاده از آداپتور جایگزین WASM در `sql.js`. وقتی تنظیم نشده باشد، از طریق وابستگیهای بسته و چیدمانهای کاندید بهطور خودکار شناسایی میشود. |
| `OMNIROUTE_BATCH_RETENTION_DAYS` | `30` | `src/lib/db/cleanup.ts` | تعداد روزهایی که نقاط وارسی، فایلهای ورودی/خروجی/خطای ارجاعشده و ردیف یک کار نهاییشده Batch API (تکمیلشده/ناموفق/لغوشده/منقضیشده) پیش از حذف توسط پاکسازی خودکار نگهداری میشوند. تنها پس از فعالشدن `BATCH_AND_FILE_AUTO_CLEANUP_ENABLED` اثر میگذارد؛ با بازه نگهداری خروجی Batch API خود OpenAI مطابقت دارد. بر مسیر `DELETE /api/v1/batches/delete-completed` که توسط اپراتور فعال میشود، تأثیری ندارد؛ این مسیر طبق طراحی بدون شرط باقی میماند (بدون فیلتر سن). |
| `BATCH_AND_FILE_AUTO_CLEANUP_ENABLED` | `false` | `src/lib/db/cleanup.ts` | وقتی `true` باشد، پیمایش پاکسازی خودکار میتواند کارهای نهاییشده Batch API (و نقاط وارسی آنها) را که از `OMNIROUTE_BATCH_RETENTION_DAYS` گذشتهاند حذف کند و محتوای BLOB فایلهای بارگذاریشدهای را که از `expires_at` خود گذشتهاند پاک کند. بهطور پیشفرض غیرفعال است: تا زمانی که اپراتور آن را فعال نکند، هر نصب موجود این دادهها را دقیقاً مانند قبل نگه میدارد. همچنین یک پرچم قابلیت قابلویرایش از طریق داشبورد است — به `docs/reference/FEATURE_FLAGS.md` ← زمان اجرا مراجعه کنید. |
| `OMNIROUTE_SKIP_DB_HEALTHCHECK` | `0` | `src/lib/db/core.ts`, `src/lib/db/healthCheck.ts` | برای رد کردن کامل بررسی سلامت DB هنگام راهاندازی، روی `1` تنظیم کنید. برای وظایف کوتاهمدت و آزمونهای یکپارچهسازی مفید است. |
| `OMNIROUTE_FORCE_DB_HEALTHCHECK` | `0` | `src/lib/db/core.ts` | برای اجبار به فعالشدن حلقه بررسی سلامت DB، حتی زمانی که معمولاً نادیده گرفته میشود (برای مثال، در وظایف کوتاهمدت)، روی `1` تنظیم کنید. |
| `OMNIROUTE_SKIP_POSTINSTALL` | `0` | `scripts/postinstall.mjs` | برای رد کردن آمادهسازی اولیه زماناجرای بومی در طول `npm install`، روی `1` تنظیم کنید. در نصبهای CI/بدون رابط گرافیکی که sqlite از قبل ساخته شده است مفید است. |
| `OMNIROUTE_MIGRATIONS_DIR` | _(تشخیص خودکار)_ | `src/lib/db/migrationRunner.ts` | دایرکتوریای را که اجراکننده مهاجرت اسکن میکند بازنویسی کنید. هنگام ارائه مهاجرتهای بستهبندیشده در ساختهای سفارشی مفید است. |
| `OMNIROUTE_EXTRA_MIGRATIONS_DIRS` | _(تنظیمنشده)_ | `src/lib/db/migrationRunner/extraDirs.ts` | دایرکتوریهای مهاجرت اضافی بهصورت ورودیهای `namespace=dir` که با جداکننده مسیر پلتفرم از هم جدا شدهاند (برای مثال `ee=/opt/app/enterprise/db/migrations`). فایلهای یافتشده در آنجا بهشکل `-` ثبت میشوند؛ بنابراین توزیعی که مهاجرتهای خودش را ارائه میکند هرگز با جایگاههای عددی بالادستی تداخل پیدا نمیکند. یک ورودی بدقالب، فضای نام نامعتبر یا دایرکتوری مفقود، بهجای نادیده گرفتن بیسروصدای طرحواره، هنگام راهاندازی خطا ایجاد میکند. |
| `OMNIROUTE_MAX_PENDING_MIGRATIONS` | `50` | `src/lib/db/migrationRunner.ts` | آستانه ایمنی برای تعداد زیاد مهاجرتهای در انتظار (#3416). اگر در یک DB موجود بیش از این تعداد مهاجرت در انتظار باشد، راهاندازی متوقف میشود (برای محافظت در برابر پاکشدن جدول رهگیری). برای بازیابی یک نسخه پشتیبان قدیمی مقدار آن را افزایش دهید؛ برای غیرفعال کردن بررسی، روی `0` تنظیم کنید. |
| `OMNIROUTE_INSTALL_UPGRADE_WORKDIR` | _(`/.install-upgrade`)_ | `scripts/check/check-install-upgrade.mjs` | دایرکتوری کاری برای دروازه انتشار `check:install-upgrade`. این فرایند تقریباً به 12 GB فضا نیاز دارد (دو درخت نصب حدوداً 3 GB بهعلاوه فایل tarball)، بنابراین نباید روی یک tmpfs کوچک اجرا شود — در اجراکننده خودمیزبان، `/tmp` یک tmpfs مبتنی بر RAM با ظرفیت 12 GB است و دروازه انتشار آن را پر کرد و باعث ناقصشدن بسته شد. |
| `OMNIROUTE_SPEND_FLUSH_INTERVAL_MS` | _(پیشفرض در کد)_ | `src/lib/spend/batchWriter.ts` | بازه تخلیه (ms) برای نویسنده دستهای هزینه/مخارج. مقادیر کمتر تجمیع نوشتن را کاهش میدهند؛ مقادیر بیشتر تداخل DB را کاهش میدهند. |
| `OMNIROUTE_SPEND_MAX_BUFFER_SIZE` | _(پیشفرض در کد)_ | `src/lib/spend/batchWriter.ts` | حداکثر تعداد ورودیهای هزینه بافرشده پیش از تخلیه اجباری. در استقرارهای با QPS بالا آن را افزایش دهید؛ وقتی حافظه محدود اهمیت بیشتری دارد، آن را کاهش دهید. |
| `OMNIROUTE_PROXY_FETCH_DEBUG` | _(تنظیمنشده)_ | `open-sse/utils/proxyFetch.ts` | برای انتشار گزارشهای اشکالزدایی `[ProxyFetch]` در مسیر رله Vercel، روی `"true"` تنظیم کنید. برای جلوگیری از افشای سرنخهای مسیریابی، بهطور پیشفرض غیرفعال است. |
| `OMNIROUTE_PROXY_CORE_BINARY_PATH` | _(تنظیمنشده)_ | `src/lib/proxySubscription/coreConfig/sync.ts` | مسیر مطلق فایل اجرایی محلی هسته پروکسی (فایلی با نام `sing-box`) که پیش از جایگزینی فایل پذیرفتهشده، پیکربندی هسته تولیدشده را بررسی میکند. در حالت تنظیمنشده، فقط `.generated` در کنار فایل پذیرفتهشده نوشته میشود. فقط برای محیط میزبان: هرگز در پایگاه داده ذخیره نمیشود و از طریق API مدیریتی نیز پذیرفته نمیشود، زیرا فایل اجرایی اجرا خواهد شد. |
| `OMNIROUTE_PROXY_CORE_RELOAD_COMMAND` | _(تنظیمنشده)_ | `src/lib/proxySubscription/coreConfig/reload.ts` | نحوه بارگذاری مجدد هسته پروکسی محلی پس از جایگزینی پیکربندی تأییدشده: یک آرایه آرگومان JSON که بدون پوسته اجرا میشود، یا دقیقاً `external` هنگامی که یک ناظر بیرونی فایل را اعمال میکند. هرگز در پایگاه داده ذخیره نمیشود و از طریق API نیز در دسترس قرار نمیگیرد. |
| `PROXY_LOG_INCLUDE_IPS` | `false` | `src/lib/proxyLogger.ts` | برای گنجاندن IPهای کلاینت/خروجی و پیشوند حساب در خط گزارش مفصل فرایند `[ProxyEgress]`، روی `"true"` یا `"1"` تنظیم کنید. بهطور پیشفرض خاموش نگه داشته میشود تا گزارش فرایند، IPها یا پیشوند حساب را افشا نکند. |
| `OMNIROUTE_DEBUG` | _(تنظیمنشده)_ | `bin/cli/commands/quota.mjs` | برای چاپ اطلاعات تشخیصی زمانبندی هر درخواست (`[omniroute] GET completed in Nms`) از فرمانهای سهمیه CLI در stderr، روی `1` تنظیم کنید. |
| `OMNIROUTE_HEALTHCHECK_PATH` | _(خودکار)_ | `scripts/dev/healthcheck.mjs` | مسیر صریحی که توسط بررسی سلامت کانتینر آزموده میشود. اگر تنظیم نشده باشد، مسیر بررسی از `OMNIROUTE_BASE_PATH` استخراج میشود؛ تنظیم آن باعث استفاده مجدد از نقطه پایانی پایش عمیق میشود. |
| `OMNIROUTE_DEBUG_COMPLETION` | _(تنظیمنشده)_ | `bin/cli/commands/completion.mjs` | برای انتشار اطلاعات تشخیصی `[omniroute completion]` از مسیرهای کش تکمیل خودکار پوسته در CLI (خواندن/تازهسازی/نوشتن)، آن را روی هر مقدار غیرخالی تنظیم کنید. بهطور پیشفرض غیرفعال است — این کشها بدون نمایش خطا از کار میافتند تا کش مفقود یا خراب هرگز تکمیل خودکار با کلید Tab را مختل نکند. |
| `BATCH_RETRY_DURATION_MS` | `86400000` (24 ساعت) | `open-sse/services/batchProcessor.ts` | حداکثر بازه تلاش مجدد برای هر مورد دستهای (میلیثانیه). مواردی که از این مدت فراتر روند، ناموفق علامتگذاری میشوند. |
| `BATCH_BACKOFF_BASE_MS` | `5000` | `open-sse/services/batchProcessor.ts` | تأخیر پایه (میلیثانیه) برای عقبنشینی نمایی در تلاشهای مجدد موارد دستهای. |
| `BATCH_BACKOFF_MAX_MS` | `3600000` (1 ساعت) | `open-sse/services/batchProcessor.ts` | سقف (میلیثانیه) عقبنشینی نمایی بین تلاشهای مجدد موارد دستهای. |
| `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` برای دور زدن ایمنی مهاجرت استفاده نکنید.
### سناریوها
| سناریو | پیکربندی |
| -------------------------------- | ------------------------------------------------------------------------------------------------------------- |
| **توسعه محلی** | همه مقادیر پیشفرض را بدون تغییر بگذارید. پایگاه داده در `~/.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` | پورت اصلی برای رابط کاربری داشبورد و نقاط پایانی API (حالت تکپورتی). |
| `OMNIROUTE_BASE_PATH` | _(خالی = ریشه)_ | `next.config.mjs`, `scripts/docker/ensure-docker-base-path.mjs` | زیرمسیر URL برای ارائه OmniRoute پشت یک پراکسی معکوس (`basePath` در Next.js را تنظیم میکند؛ تغییرمسیرهای احراز هویت از basePath آگاه هستند). برای مثال، `/omniroute`. در Docker، مقدار هنگام `docker build` تعبیه میشود (`ARG OMNIROUTE_BASE_PATH`)؛ تصاویر ازپیشساختهشده با مسیر ریشه میتوانند پیش از راهاندازی Next.js، یک مقدار متفاوت را هنگام شروع کانتینر اعمال کنند. `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` استفاده میکند. پس از تغییر، دوباره بسازید (`basePath` در Next هنگام ساخت تعیین میشود). |
| `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 میتواند آنها را رندر کند (حالت `dashboardOpen: "editor"` در OmniCopilot). سطح API (`/api`، `/v1`، `/v1beta`، `/a2a`، `/healthz` و نامهای مستعار سطح ریشه) در هر دو حالت هدرهای سختگیرانه را حفظ میکند. فقط `vscode` شناخته میشود — مقادیر `1`/`true` این قابلیت را فعال نمیکنند. هنگام ساخت: پس از تغییر، دوباره بسازید (برای تصاویر از `docker build --build-arg DASHBOARD_ALLOW_EMBED=vscode` استفاده کنید؛ تنظیم آن روی یک نصب ازپیشساختهشده اثری ندارد). |
| `API_PORT` | _(تنظیمنشده)_ | `src/lib/runtime/ports.ts` | در صورت تنظیم، API پراکسی `/v1/*` را روی این پورت مجزا ارائه میکند. |
| `API_HOST` | `0.0.0.0` | `src/lib/runtime/ports.ts` | نشانی اتصال برای پورت API. |
| `DASHBOARD_PORT` | _(تنظیمنشده)_ | `src/lib/runtime/ports.ts` | در صورت تنظیم، رابط کاربری داشبورد را روی این پورت مجزا ارائه میکند. |
| `OMNI_MAX_CONCURRENT_CONNECTIONS` | `0` _(غیرفعال)_ | `src/sse/utils/backpressure.ts` | تعداد اتصالهای همزمان و در حال پردازش چت را محدود میکند؛ درخواستهای بیشتر از حد مجاز، پاسخ `503` را همراه با `Retry-After` دریافت میکنند. یک عدد صحیح مثبت این محافظ را فعال میکند؛ تنظیمنشدن یا مقدار `0` آن را غیرفعال میکند. |
| `OMNIROUTE_INSTANCE_ID` | _(تنظیمنشده)_ | `src/shared/resilience/peerRouting.ts` | شناسهای پایدار و یکتا برای این دروازه هنگام زنجیرهکردن نمونههای OmniRoute. بررسی حلقههای ورودی میان همتاها را فعال میکند. نویسههای مجاز: حروف، ارقام، `.`، `_`، `:` و `-`؛ حداکثر 64 نویسه. |
| `OMNIROUTE_PEER_URLS` | _(تنظیمنشده)_ | `src/shared/resilience/peerRouting.ts`, `open-sse/executors/base.ts` | URLهای پایه OmniRoute با جداکننده ویرگول که ممکن است `X-OmniRoute-Peer-Trace` را دریافت کنند. فقط URLهای بالادستی که صراحتاً در فهرست مجاز قرار گرفتهاند، فراداده همتا را دریافت میکنند؛ سایر ارائهدهندگان بدون تغییر باقی میمانند. |
| `OMNIROUTE_PEER_MAX_HOPS` | `4` | `src/shared/resilience/peerRouting.ts` | حداکثر تعداد نمونههای OmniRoute که قبلاً بازدید شدهاند و در یک درخواست زنجیرهای پذیرفته میشوند (`1`-`32`). نمونههای تکراری یا اتمام بودجه، HTTP `508 Loop Detected` را برمیگردانند. |
| `PROD_DASHBOARD_PORT` | `20130` | `docker-compose.prod.yml` | پورت منتشرشده در سمت میزبان برای داشبورد در حالت تولید Docker. |
| `PROD_API_PORT` | `20131` | `docker-compose.prod.yml` | پورت منتشرشده در سمت میزبان برای API در حالت تولید Docker. |
| `OMNIROUTE_PORT` | _(تنظیمنشده)_ | `src/lib/runtime/ports.ts` | هنگام اجرا در Electron یا سایر پوششدهندهها، بر `PORT` اولویت دارد. |
| `LIVE_WS_PORT` | `20129` | `src/server/ws/liveServer.ts` | پورت سرور نظارت زنده و بلادرنگ WebSocket. |
| `LIVE_WS_HOST` | `127.0.0.1` | `src/server/ws/liveServer.ts` | آدرس اتصال برای سرور زنده WebSocket. برای در دسترس قرار دادن آن در LAN، روی `0.0.0.0` تنظیم کنید (`LIVE_WS_ALLOWED_ORIGINS` را نیز پیکربندی کنید). |
| `LIVE_WS_ALLOWED_ORIGINS` | _(تنظیمنشده)_ | `src/server/ws/liveServer.ts` | مبدأهای اضافی با جداکننده ویرگول که مجاز به باز کردن WebSocket زنده هستند. مبدأهای داشبورد روی loopback بهطور پیشفرض مجازند. |
| `LIVE_WS_ALLOWED_HOSTS` | _(تنظیمنشده)_ | `src/server/ws/liveServerAllowList.ts` | نامهای میزبان اضافی با جداکننده ویرگول که برای مبدأهای WebSocket زنده مجازند. برخلاف `LIVE_WS_ALLOWED_ORIGINS` (URLهای کامل مبدأ)، فقط بخش میزبان مطابقت داده میشود — مناسب برای پیکربندیهای LAN/Tailscale. |
| `NEXT_PUBLIC_LIVE_WS_PUBLIC_URL` | _(تنظیمنشده)_ | `src/hooks/useLiveDashboard.ts` | URL عمومی WebSocket داشبورد زنده (سمت مرورگر). هنگام قرار دادن سرور WS پشت یک پروکسی معکوس یا Cloudflare Tunnel آن را تنظیم کنید (برای مثال `wss://ws.my-ai.com/live-ws`)؛ در این صورت مرورگر بهجای `ws://hostname:20132` به آنجا متصل میشود. بخش pathname نیز بهعنوان مسیر ارتقای WebSocket استفاده میشود (پیشفرض: `/live-ws`). |
| `OMNIROUTE_ENABLE_LIVE_WS` | `true` | `src/server/ws/liveServer.ts` و `scripts/start-ws-server.mjs` | برای غیرفعال کردن سرور بلادرنگ WebSocket، روی `0` یا `false` تنظیم کنید (بهطور پیشفرض فعال و متصل به loopback است). کلید CI/harness که اسکریپت کمکی مستقل WebSocket زنده را غیرفعال میکند. |
| `RELAY_IP_PER_MINUTE` | `30` | `src/app/api/v1/relay/chat/completions/route.ts` | محدودیت نرخ relay بهازای هر (توکن، IP)، بر حسب درخواست در دقیقه. درونحافظهای و بهازای هر نمونه است. مقدار `0` یا منفی، دروازه بُعد IP را غیرفعال میکند (محدودیت پایگاه داده بهازای توکن همچنان اعمال میشود). |
| `NODE_ENV` | `production` | هستهٔ Next.js | میزان جزئیات گزارشها، کشکردن، نمایش جزئیات خطا و بهینهسازیهای Next.js را کنترل میکند. |
| `OMNIROUTE_USE_TURBOPACK` | `1` (Turbopack — مقدار پیشفرض کد) | `package.json` / Next.js 16 | Turbopack بستهساز پیشفرض برای `npm run dev` و `npm run build` است (ساختها طبق بنچمارک ۲ تا ۳ برابر سریعترند). برای بازگشت به webpack در Windows، هنگام مواجهه با ناسازگاریهای بایندینگ بومی / سازگاری بستهساز، **یا روی دستگاههای دارای محدودیت RAM**، آن را روی `0` تنظیم کنید — مشخص شده است که ساختهای production با Turbopack در این شاخهٔ نسخهٔ Next.js (16.2.x)، روی گرافهای ماژول بزرگ به اوج مصرف حافظهای بسیار بیشتر از webpack میرسند (اصلاح تخلیهٔ حافظهٔ Turbopack در Next 16.3 هنوز پایدار نشده است)؛ اوج مصرف در حالت بازگشت به webpack بسیار کمتر است. #6409 را ببینید. **ساخت imageهای Docker بهطور پیشفرض از `0` (webpack) استفاده میکند**: فایل `Dockerfile` مقدار `ARG OMNIROUTE_USE_TURBOPACK=0` را تعریف میکند تا اجرای سادهٔ `docker build .` (در Railway و دیگر میزبانهای تککلیکی و نیز استقرارهای شخصی موردی) روی سازندهای با محدودیت حافظه بهدلیل OOM خاتمه نیابد؛ برای ساخت image با Turbopack، گزینهٔ `--build-arg OMNIROUTE_USE_TURBOPACK=1` را ارسال کنید. بخش منابع زمان ساخت در `docs/guides/DOCKER_GUIDE.md` را ببینید. |
| `OMNIROUTE_SKIP_DB_HEALTHCHECK` | _(تنظیمنشده)_ | `src/lib/db/core.ts` / `src/lib/db/healthCheck.ts` | برای ردکردن بررسی سلامت یکپارچگی SQLite هنگام راهاندازی، آن را روی `1` تنظیم کنید. این گزینه برای راهاندازی سریعتر با پایگاههای دادهٔ بزرگ مفید است. |
| `NOTIFY_SOCKET` | _(تنظیمنشده)_ | systemd (پروتکل sd_notify) | هنگامی که فرایند تحت یک واحد سرویس با یکپارچهسازی sd_notify اجرا میشود، توسط systemd تنظیم میگردد؛ OmniRoute آن را میخواند (به `OMNIROUTE_DISABLE_SD_NOTIFY` مراجعه کنید) تا اعلانهای READY/WATCHDOG را ارسال کند. کاربر هرگز نباید آن را تنظیم کند. |
| `OMNIROUTE_DISABLE_SD_NOTIFY` | _(تنظیمنشده)_ | `scripts/dev/systemd-notify.mjs` | برای غیرفعالکردن sd_notify مربوط به systemd (Type=notify / WatchdogSec=)، حتی هنگام اجرا تحت یک واحد systemd، آن را روی `1` تنظیم کنید. در خارج از systemd، اعلانگر در هر صورت هیچ عملی انجام نمیدهد. |
| `CREDENTIAL_HEALTH_CHECK_INTERVAL` | `3600000` | `open-sse/config/constants.ts` / `src/lib/credentialHealth/scheduler.ts` | فاصلهٔ زمانی (ms) زمانبند بررسی سلامت اعتبارنامه در پسزمینه. حداقل: 10000 (10s). |
| `CREDENTIAL_HEALTH_CACHE_TTL` | `300000` | `open-sse/config/constants.ts` / `src/lib/credentialHealth/cache.ts` | TTL (ms) برای وضعیت سلامت اعتبارنامهٔ کششده. |
| `OMNIROUTE_DISABLE_CREDENTIAL_HEALTH_CHECK` | `false` | `src/lib/credentialHealth/scheduler.ts` | برای غیرفعالکردن آزمایش دورهای اتصالهای ارائهدهندگان در پسزمینه، آن را روی `1` یا `true` تنظیم کنید. ارائهدهندگان جستوجو (SEARCH_VALIDATOR_CONFIGS در `src/lib/providers/validation/searchProviders.ts`، برای نمونه `tavily-search`) همیشه از پیمایش مستثنا هستند — «اعتبارسنجی» آنها یک پرسوجوی واقعی و هزینهدار از سرویس بالادستی است، بنابراین هرگز طبق زمانبندی بررسی سلامت نمیشوند (#9970). |
| `DEEP_HEALTH_CHECK_ENABLED` | `0` | `src/app/api/monitoring/health/route.ts` | برای اینکه یک فراخوان احراز هویتشده بتواند `/api/monitoring/health?deep=1` را درخواست کند، آن را روی `1` تنظیم کنید؛ این درخواست در هر TTL یکبار از سطح completions نمونهبرداری میکند. فراخوانهای ناشناس هرگز این کاوش را فعال نمیکنند. |
| `HOST` | `0.0.0.0` | `scripts/dev/run-next.mjs` | نشانی bind برای سرور dev/start مربوط به Next.js. در صورت تنظیم، مقدار پیشفرض `0.0.0.0` را بازنویسی میکند. |
| `HOSTNAME` | `127.0.0.1` | `scripts/dev/run-next-playwright.mjs` | نشانی bind مورد استفادهٔ اجراکنندهٔ Playwright هنگام راهاندازی Next.js. برای تستهای ایزوله، مقدار پیشفرض آن `127.0.0.1` است. **برای `omniroute serve` از آن استفاده نکنید** — در عوض از `OMNIROUTE_SERVER_HOST` استفاده کنید (پوستههای POSIX متغیر `HOSTNAME` را بهطور خودکار روی نام دستگاه تنظیم میکنند؛ `.env` نمیتواند آن را بازنویسی کند). |
| `OMNIROUTE_SERVER_HOST` | `0.0.0.0` | `bin/cli/commands/serve.mjs` | نشانی اتصال برای `omniroute serve`. از تداخل با متغیر `HOSTNAME` در پوستهٔ POSIX جلوگیری میکند (که همواره توسط bash/zsh روی نام دستگاه تنظیم میشود). اگر تنظیم نشده باشد، از `0.0.0.0` استفاده میکند. (#6194) |
### حالتهای پورت
```
┌─────────────────────────── پورت واحد (پیشفرض) ────────────────────────────┐
│ PORT=20128 │
│ → داشبورد: http://localhost:20128 │
│ → API: http://localhost:20128/v1/chat/completions │
└─────────────────────────────────────────────────────────────────────────────┘
┌─────────────────────────── پورتهای مجزا ──────────────────────────────────┐
│ DASHBOARD_PORT=20128 │
│ API_PORT=20129 │
│ API_HOST=0.0.0.0 │
│ → داشبورد: http://localhost:20128 │
│ → API: http://0.0.0.0:20129/v1/chat/completions │
│ کاربرد: ارائهٔ API به شبکهٔ محلی، درحالیکه داشبورد به localhost محدود است. │
└─────────────────────────────────────────────────────────────────────────────┘
┌─────────────────────────── محیط عملیاتی 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` | نمک HMAC برای استخراج توکن احراز هویت محلی CLI. تنظیم این مقدار باعث چرخش همه توکنهای 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`) پیروی میکند — بنابراین، دریافت `401` از `/v1/models` به این معنا نیست که استنتاج محافظت شده است. به `docs/security/INFERENCE_AUTH_POSTURE.md` مراجعه کنید (#13695). |
| `ALLOW_API_KEY_REVEAL` | `false` | `src/shared/constants/featureFlagDefinitions.ts` | امکان نمایش مقادیر کامل کلید API در رابط کاربری داشبورد را فراهم میکند. از بخش پرچمهای ویژگی داشبورد قابل پیکربندی است؛ در نمونههای اشتراکی، خطر امنیتی دارد. |
| `NO_LOG_API_KEY_IDS` | _(خالی)_ | `src/lib/compliance/index.ts` | شناسههای کلید API جداشده با ویرگول که از ثبت درخواست صرفنظر میکنند (برای انطباق با GDPR). |
| `DEFAULT_RATE_LIMIT_PER_DAY` | _(تنظیمنشده = نامحدود)_ | `src/shared/utils/apiKeyPolicy.ts` | بودجه جایگزین درخواست روزانه که برای کلیدهای API با ستون `rate_limits` تهی اعمال میشود. تنظیمنشده یا خالی: بدون سقف ضمنی (#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 مگابایت) | `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` کنترل میشود — بودجهای بر حسب بایت که بهطور خودکار از سقف واقعی حافظهٔ فرایند در **یک فرایند** (یک heap از V8) محاسبه میشود. دو درخواست همپوشان `/v1/responses` با حدود 750k توکن باعث توقف heapهای حدود 12 گیگابایتی میشوند (#7849) — این یک هشدار **بودجهٔ حافظه** است، نه حداکثر سخت محصول برابر با 2. یک فرایند سالم (با heap پایینتر از نسبت دفع بار) میتواند از طریق `OMNIROUTE_CHAT_ADMISSION_HEALTHY_HEADROOM` درخواستهای طولانی همزمان بیشتری را برای `/v1/responses` بپذیرد. دهها کلاینت طولانی SSE (40–50) به heap بهعلاوهٔ `OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES` / #10110 مربوط است، نه «حداکثر 2». افزایش کورکورانهٔ این مقدار برای «استفاده از میزبان»، مشکل #7849 را دوباره ایجاد میکند. تعداد **heapها** را با **N عدد `DATA_DIR` مستقل** افزایش دهید (#11024)؛ هرگز از `replicas>1` روی یک فایل SQLite استفاده نکنید. |
| `OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES` | _(محاسبهشده بهصورت خودکار)_ | `src/shared/middleware/admissionBudget.ts` | **#503-fanout:** مقدار جایگزین برای بودجهٔ بایتی دریافت که بهطور خودکار محاسبه میشود (25٪ از محدودکنندهترِ سقف حافظهٔ V8/cgroup، تقسیم بر ضریب تقویت گذرای 8x). مقادیر محاسبهشده و صریح به بازهٔ 8 مبیبایت تا 2 گیبیبایت محدود میشوند. بدنهای بزرگتر از بودجهٔ مؤثر، بلافاصله با `413 body_exceeds_budget` رد میشود؛ رقابت میان بدنههایی که هرکدام بهتنهایی قابل سرویسدهی هستند، همچنان با `503` قابل تلاش مجدد باقی میماند. وجود 40–50 کلاینت طولانی SSE به این بودجه بهعلاوهٔ heap مربوط است، نه یک «حداکثر 2» سخت. پیش از تنظیم، مقادیر `chatAdmission.maxInflightBytes` / `budgetSource` / `pressureSeverity` را در `/api/monitoring/health` بررسی کنید. |
| `OMNIROUTE_CHAT_ADMISSION_HEAP_SHED_RATIO` | `0.75` | `src/shared/middleware/chatBodyAdmission.ts` | نسبت دفع بار تحت فشار heap (`heapUsed / heap_size_limit`) برای پذیرش سنگین بر اساس BYTE و STRUCTURE (#10183، #10268، #10437). یک درخواست سنگین همزمان که از `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT` فراتر رفته باشد، تنها زمانی با `503` قابل تلاش مجدد دفع میشود که heap نیز در این نسبت یا بالاتر از آن باشد؛ در یک heap سالم، درخواست از طریق فضای اضافهٔ حالت سالم پذیرفته میشود. |
| `OMNIROUTE_CHAT_ADMISSION_HEALTHY_HEADROOM` | `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT` (پیشفرض `1`) | `src/shared/middleware/chatBodyAdmission.ts` | ظرفیت اضافی محدود برای مسیر سریع heap سالم (#10437)، هم برای STRUCTURE و هم BYTE (`admitChatRequest`، شامل بدنههای ≥ `OMNIROUTE_CHAT_LARGE_BODY_BYTES`). بدون این محدودیت، هر درخواست در وضعیت شلوغ اما با heap سالم، پذیرش را بدون هیچ سقفی دور میزد. هنگامی که این تعداد اجارهٔ همزمان از طریق مسیر heap سالم فعال باشد، درخواستهای شلوغ بعدی وارد همان مسیر انتظار محدود/دفع بار میشوند که در شرایط فشار واقعی heap استفاده میشود. `0` این مسیر میانبر را کاملاً غیرفعال میکند. |
| `OMNIROUTE_CHAT_HEAVY_MESSAGE_COUNT` | `200` | `src/shared/middleware/chatBodyAdmission.ts` | تعداد پیامهایی که باعث میشود یک درخواست چت، حتی اگر بدنهٔ آن کوچکتر از آستانهٔ بایتی باشد، سنگین طبقهبندی شود. |
| `OMNIROUTE_CHAT_HEAVY_TOOL_COUNT` | `64` | `src/shared/middleware/chatBodyAdmission.ts` | تعداد ابزارهایی که باعث میشود یک درخواست چت، حتی اگر بدنهٔ آن کوچکتر از آستانهٔ بایتی باشد، سنگین طبقهبندی شود. |
| `OMNIROUTE_CHAT_HEAVY_ESTIMATED_TOKENS` | `32000` | `src/shared/middleware/chatBodyAdmission.ts` | برآورد محافظهکارانهٔ توکن بر اساس اندازهٔ رشته که درخواست را در دستهٔ سنگین قرار میدهد؛ این یک شاخص تقریبی هزینه برای پذیرش است، نه توکنسازی صورتحساب ارائهدهنده. |
| `OMNIROUTE_CHAT_HARD_MAX_MESSAGES` | `0` (غیرفعال) | `src/shared/middleware/chatBodyAdmission.ts` | سقف اختیاری و نیازمند فعالسازی برای تاریخچهٔ چت. بهطور پیشفرض غیرفعال است: تعداد پیام یک سیاست استقرار است، نه ویژگی عمومی یک درخواست، و اعمال سقف در اینجا مکالمهها را پیش از آنکه خط لولهٔ فشردهسازی بتواند آنها را قابل سرویسدهی کند، با `413` نهایی رد میکند. رشد heap توسط `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT` و دفع بار تحت فشار heap محدود میشود. در استقرارهای دارای محدودیت حافظه که به سقفی سخت نیاز دارند، مقداری مثبت تعیین کنید؛ در این صورت، موارد مازاد پاسخ ساختیافتهٔ `413` با الزام فشردهسازی دریافت میکنند. |
| `OMNIROUTE_MAX_NONSTREAMING_RESPONSE_BYTES` | `67108864` (64 مگابایت) | `open-sse/handlers/chatCore/nonStreamingResponseBody.ts` | سقف سخت برای پاسخ بالادستی غیراستریم که بهطور کامل در حافظه بافر میشود. پس از عبور از این حد، خوانشگر بالادستی لغو میشود و درخواست بهسرعت شکست میخورد، بهجای آنکه یک رشتهٔ نامحدود تا زمان اتمام heap رشد کند. |
| `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/outboundUrlGuardPolicy.ts` | نام مستعار قدیمی. کلید تغییر وضعیت آن در داشبورد (یک بازنویسی DB) پیش از این مقدار محیطی خوانده میشود؛ مقدار `false`، `0`، `no` یا `off` در هرکدام، بررسیهای میزبان را همانند `OMNIROUTE_ALLOW_PRIVATE_PROVIDER_URLS=true` غیرفعال میکند، حتی زمانی که کلید تغییر وضعیت آن پرچم در داشبورد بهصورت خاموش ذخیره شده باشد؛ سایر مقادیر کنترل محافظ را به دو پرچم زیر واگذار میکنند. |
| `OMNIROUTE_ALLOW_PRIVATE_PROVIDER_URLS` | `false` | `src/shared/network/outboundUrlGuardPolicy.ts` | بررسیهای میزبانِ محافظ URL خروجی، شامل مسدودسازی فراداده ابری (تمام 169.254.0.0/16 و metadata.google.internal)، را در مسیرهای ارائهدهندهای که از حالت محافظ پیروی میکنند غیرفعال میکند: اعتبارسنجی URL، کشف مدل، URLهای پایه گره ارائهدهنده (شامل گرههای رتبهبندی مجدد راهدور) و آزمون بازگشت به پراکسی، در کنار دیگر مسیرهای خروجی مرتبط با ارائهدهنده مانند واکشی تصویر/رسانه راهدور. همچنین اهداف خصوصی webhook را مجاز میکند، بهجز نقاط پایانی فراداده ابری/پیوند-محلی که حتی با فعال بودن این پرچم نیز مسدود میمانند. درخواستهای چتی که از طریق `BaseExecutor.execute()` ارسال میشوند، بررسی فراداده ابری خود را حفظ میکنند. ارائهدهندگان محلی با تنظیمات پیشفرض کار میکنند: `OMNIROUTE_ALLOW_LOCAL_PROVIDER_URLS` (با مقدار پیشفرض `true`) از قبل URLهای محلی و LAN را در مسیرهای اعتبارسنجی، کشف و گره ارائهدهنده مجاز میکند؛ آزمون بازگشت به پراکسی و اهداف خصوصی webhook فقط این پرچم را بررسی میکنند و تا زمانی که خاموش باشد، میزبانهای محلی/LAN را مسدود میکنند. بر `OMNIROUTE_ALLOW_LOCAL_PROVIDER_URLS=false` اولویت دارد. مقداری که از کلید تغییر وضعیت داشبورد ذخیره شده باشد، بر این متغیر اولویت دارد. |
| `OMNIROUTE_ALLOW_LOCAL_PROVIDER_URLS` | `true` | `src/shared/network/outboundUrlGuardPolicy.ts` | URLهای ارائهدهنده روی نشانیهای محلی/خصوصی (127.0.0.1، localhost، LAN و محدودههای خصوصی) را برای اعتبارسنجی ارائهدهنده، کشف مدل، چت و دیگر مسیرهای خروجی مرتبط با ارائهدهنده که تحت کنترل حالت محافظ هستند، مجاز میکند. **مقدار پیشفرض `true`** (اولویت با محیط محلی): در این حالت، محافظ نقاط پایانی فراداده ابری را مسدود میکند — تمام 169.254.0.0/16 بهعلاوه نامهای میزبان شناختهشده فراداده (metadata.google.internal، metadata.goog، Alibaba/Azure/Oracle IMDS و fd00:ec2::254). برای حالت فقط عمومی که میزبانهای خصوصی و loopback را نیز مسدود میکند، مقدار `false` را تنظیم کنید. محافظ، نام میزبان یا IP نوشتهشده را پیش از هرگونه جستوجوی DNS بررسی میکند؛ در حالت فقط عمومی، پوشش safe-fetch علاوه بر این نام میزبان را resolve میکند و هر پاسخ خصوصی را نمیپذیرد. `OMNIROUTE_ALLOW_PRIVATE_PROVIDER_URLS=true` این بررسیها را در مسیرهای فهرستشده در ردیف مربوط به خود غیرفعال میکند. ارائهدهندگان محلی داخلی، مانند LM Studio، Ollama، vLLM، Llamafile و Triton، همه بررسیهای میزبان را برای اعتبارسنجی کلید و چت نادیده میگیرند. مقداری که از کلید تغییر وضعیت داشبورد ذخیره شده باشد، بر این متغیر اولویت دارد. (#5066) |
| `AUDIO_REMOTE_PROVIDER_NODES` | `false` | `src/app/api/v1/_shared/audioProviderNodes.ts` | به مسیرهای `/v1/audio/*` (رونویسی، گفتار و ترجمه) اجازه میدهد از یک گره ارائهدهنده سازگار با OpenAI که خارج از localhost میزبانی میشود استفاده کنند. بهطور پیشفرض خاموش است — مسیریابی صدا به یک میزبان راهدور، هویت خروجی را تغییر میدهد و باید تصمیمی صریح از سوی اپراتور باشد. گرههای loopback/خصوصی (localhost، 127.0.0.1 و 172.16-31.x) همیشه مجاز و بدون تأثیرپذیری هستند. (#3963) |
| `RERANK_REMOTE_PROVIDER_NODES` | `false` | `src/app/api/v1/_shared/rerankProviderNodes.ts` | به `POST /v1/rerank` (و مرحله رتبهبندی مجدد loopback در موتور حافظه) اجازه میدهد از یک گره ارائهدهنده سازگار با OpenAI که خارج از localhost میزبانی میشود استفاده کند — یک دستگاه LAN یا همتای Tailscale که TEI، Infinity، vLLM و موارد مشابه را اجرا میکند. بهطور پیشفرض خاموش است — مسیریابی به یک میزبان راهدور، هویت خروجی را تغییر میدهد و باید تصمیمی صریح از سوی اپراتور باشد. گرههای loopback (localhost، 127.0.0.1 و 172.16-31.x) همیشه مجاز و بدون تأثیرپذیری هستند. URL پایه یک گره راهدور باید سیاست URL خروجی ارائهدهنده (`OMNIROUTE_ALLOW_LOCAL_PROVIDER_URLS` / `OMNIROUTE_ALLOW_PRIVATE_PROVIDER_URLS`) را نیز با موفقیت پشت سر بگذارد. |
| `OMNIROUTE_LOCAL_PROVIDER_NODE_HOSTS` | _(خالی)_ | `src/shared/network/localNodeHosts.ts` | نامهای میزبان (جداشده با ویرگول یا فاصله) که مسیریابی گره ارائهدهنده آنها را محلی در نظر میگیرد — معمولاً نام سرویس Docker/Compose مربوط به یک بازرتبهبند، TEI یا سرویس جانبی صوتی در شبکه Docker خود OmniRoute (`http://reranker:8080/v1`)؛ بنابراین گره به IP ثابت و ازپیشتعیینشده کانتینر نیاز ندارد. میزبانهای فهرستشده برای `/v1/rerank`، `/v1/audio/*` و بررسی سلامت محلی واجد شرایط هستند، بدون اینکه لازم باشد `RERANK_REMOTE_PROVIDER_NODES` / `AUDIO_REMOTE_PROVIDER_NODES` برای هر گره راهدور فعال شود؛ همچنین مستقیماً فراخوانی میشوند — و هرگز از طریق `HTTP(S)_PROXY` یا پراکسی ثابتشده یک اتصال عبور نمیکنند. آنها همچنان کلید API اتصال را ارسال میکنند. فقط نامهای تکبرچسبی و نامهای `.internal`/`.local` پذیرفته میشوند؛ FQDNهای عمومی، مقادیر تحتاللفظی IP و نامهای فراداده ابری نادیده گرفته میشوند و هشداری ثبت میشود. (#14635) |
| `OMNIROUTE_OIDC_DISABLE_PASSWORD_LOGIN` | `false` | `src/app/api/auth/login/route.ts` | هنگامی که OIDC فعال است، ورود با گذرواژه را غیرفعال میکند تا کاربران فقط از طریق ورود یکپارچه OIDC احراز هویت کنند. نام مستعار ساده `OIDC_DISABLE_PASSWORD_LOGIN` نیز پذیرفته میشود؛ پرچم قابلیت داشبورد با همین کلید اولویت دارد. (#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 # هرگز کلیدها را در رابط کاربری نمایش ندهید
CORS_ALLOWED_ORIGINS=https://your.domain.com
MAX_BODY_SIZE_BYTES=5242880 # محدودیت 5 MB
```
---
## ۵. پاکسازی ورودی و حفاظت از اطلاعات قابلشناسایی شخصی (PII)
OmniRoute یک دفاع دولایه ارائه میدهد: اسکن تزریق در سمت درخواست و حذف اطلاعات قابلشناسایی شخصی در سمت پاسخ.
> **⚠️ محدودیتها:** این سازوکارهای حفاظتی، تشخیصهای ابتکاریِ _مبتنی بر بهترین تلاش_ هستند، نه یک فایروال کامل برای تزریق پرامپت یا یک سامانه DLP برای اطلاعات قابلشناسایی شخصی. آنها ممکن است نتایج مثبت کاذب (علامتگذاری پرامپتهای بیخطرِ پرسونا/RPG) و نتایج منفی کاذب (الگوهای leetspeak، فاصلهگذاری یا الگوهای غیرانگلیسی) ایجاد کنند. این سازوکارها بهتنهایی برای انطباق کافی نیستند. پیش از اتکا به آنها، حالتها را تنظیم و با ترافیک خود آزمایش کنید.
### سمت درخواست: محافظ تزریق پرامپت
| متغیر | پیشفرض | فایل منبع | توضیحات |
| --------------------------------- | ------------- | ---------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `INPUT_SANITIZER_ENABLED` | `true` | `src/middleware/promptInjectionGuard.ts` | اسکن پیامهای ورودی برای یافتن الگوهای تزریق پرامپت را فعال میکند. |
| `INPUT_SANITIZER_MODE` | `warn` | `src/middleware/promptInjectionGuard.ts` | سیاست تزریق: `warn` = فقط ثبت در گزارش، `block` = رد درخواست با کد 400. حالت قدیمی `redact` متن تزریق را حذف **نمیکند**؛ برای بازنویسی اطلاعات قابلشناسایی شخصی در درخواست، از `PII_REDACTION_ENABLED` استفاده کنید. |
| `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` بودن، اطلاعات قابلشناسایی شخصی را در درخواستهای ورودی حذف میکند (مستقل از حالت تزریق). |
| `CREDENTIAL_REDACTION_ENABLED` | `false` | `src/lib/guardrails/credentialMasker.ts` | الگوهای شناختهشده کلید API / توکن محرمانه را از بارهای داده درخواست/پاسخ حذف میکند. اختیاری است و از `PII_REDACTION_ENABLED` پیروی میکند. |
### سمت پاسخ: پاکساز اطلاعات قابلشناسایی شخصی
| متغیر | پیشفرض | فایل منبع | توضیحات |
| -------------------------------- | -------- | ------------------------- | ---------------------------------------------------------------------------------------------------- |
| `PII_RESPONSE_SANITIZATION` | `false` | `src/lib/piiSanitizer.ts` | پاسخهای LLM را پیش از بازگرداندن به کلاینت، برای یافتن اطلاعات قابلشناسایی شخصیِ افشاشده اسکن میکند. |
| `PII_RESPONSE_SANITIZATION_MODE` | `redact` | `src/lib/piiSanitizer.ts` | `redact` = پوشاندن اطلاعات قابلشناسایی شخصی، `warn` = فقط ثبت در گزارش، `block` = حذف کامل پاسخ. |
### پاکساز زمینه مسیر توکندار VS Code
| متغیر | پیشفرض | فایل منبع | توضیحات |
| ----------------------------------- | ------ | ------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `OMNIROUTE_VSCODE_SANITIZE_CONTEXT` | `1` | `src/app/api/v1/vscode/contextSanitizer.ts` | زمینه ضمنی ویرایشگر فعال (`editorContext`، `activeEditor`، `currentFile`، `selection`، `openTabs` و غیره) را از درخواستهای `/v1/vscode/[token]/*` حذف میکند و محتوای فایلهای حساسِ صراحتاً پیوستشده را میپوشاند. بهطور پیشفرض امن است؛ برای غیرفعالسازی، آن را روی `0` قرار دهید. |
### سناریوها
| سناریو | پیکربندی |
| ------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **انطباق سازمانی** | `INPUT_SANITIZER_ENABLED=true`، `INPUT_SANITIZER_MODE=block`، `PII_REDACTION_ENABLED=true`، `PII_RESPONSE_SANITIZATION=true` (مسدودسازی تزریق + حذف اطلاعات قابلشناسایی شخصی در درخواست/پاسخ؛ حالتها مستقل هستند) |
| **فقط پایش** | `INPUT_SANITIZER_ENABLED=true`، `INPUT_SANITIZER_MODE=warn` — ثبت در گزارش بدون مسدودسازی |
| **استفاده شخصی** | همه را غیرفعال نگه دارید — بدون سربار |
---
## 6. سیاستهای ابزار و مسیریابی
| متغیر | پیشفرض | فایل منبع | توضیحات |
| ----------------------------------------------------------- | ---------------------------- | ---------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `TOOL_POLICY_MODE` | `disabled` | `src/lib/toolPolicy.ts` | دسترسی LLM به فراخوانی ابزار/تابع را کنترل میکند. `allowlist` = فقط ابزارهای فهرستشده، `denylist` = همه ابزارها بهجز موارد فهرستشده، `disabled` = بدون محدودیت. |
| `OMNIROUTE_PAYLOAD_RULES_PATH` | `./config/payloadRules.json` | `open-sse/services/payloadRules.ts` | مسیر فایل JSON حاوی قواعد دستکاری payload (تنظیمات upstream مختص هر مدل/پروتکل). |
| `OMNIROUTE_PAYLOAD_RULES_RELOAD_MS` | `5000` | `open-sse/services/payloadRules.ts` | فاصله زمانی بارگذاری مجدد (میلیثانیه) برای بازخوانی آنی فایل قواعد payload. حداقل مقدار `1000` است. |
| `OMNIROUTE_PREFER_CLAUDE_CODE_FOR_UNPREFIXED_CLAUDE_MODELS` | `false` | `open-sse/services/model.ts` | انتخاب اختیاری: شناسههای مدل ساده `claude-*` را از کلاینتهای Claude Code، بهجای الزام به استفاده از پیشوند ارائهدهنده، از طریق حساب OAuth مربوط به Claude Code مسیریابی میکند. پیشوندهای صریح ارائهدهنده همچنان اولویت دارند. همچنین از طریق یک کلید تغییر وضعیت در داشبوردِ صفحه ارائهدهنده Claude قابل پیکربندی است. |
| `BARE_MODEL_DEFAULT_OVERRIDE_LEGACY` | `false` | `open-sse/services/model.ts` | رفتار قدیمی `resolveBareModelToConnectionDefault` (#4825): هر نام مدل ساده را با `defaultModel` اتصال انتخابشده جایگزین میکند. بهطور پیشفرض غیرفعال است؛ تنها `auto` یا مدل خالی جایگزین میشود. هنگام فعال بودن، برای هر جفت یک هشدار ثبت میکند. |
| `COMBO_CONCURRENCY_PER_MODEL` | `3` | `open-sse/services/comboConfig.ts` | سقف همزمانی بهازای هر مدل برای ترکیبهای round-robin (#9100). سمافور ترکیب round-robin دارای سقف ثابت 3 درخواست همزمان بهازای هر مدل و بدون امکان بازنویسی بود و ترافیک با همزمانی بالاتر را پشت این سقف سریالی میکرد. اعتبارسنجی میشود که `>= 1` باشد و به `<= 32` محدود میشود. |
| `DISABLE_CONTEXT_WINDOW_CHECKS` | `false` | `open-sse/handlers/chatCore.ts` | گزینهای خطرناک که بررسی محلی پنجره زمینه / حداکثر توکن ورودی OmniRoute را برای درخواستهای مستقیم تکمدلی نادیده میگیرد. ارائهدهندگان upstream همچنان محدودیتهای واقعی خود را اعمال میکنند؛ فشردهسازی prompt و سقف توکن خروجی خود مدل نیز فعال باقی میمانند. ترتیب اولویت مؤثر عبارت است از: بازنویسی پایگاه داده Feature Flags > متغیر محیطی > مقدار پیشفرض؛ نیازی به راهاندازی مجدد نیست. |
| `OMNIROUTE_SELF_HOSTED_PROVIDERS` | _(تنظیمنشده)_ | `open-sse/services/selfHostedEntry.ts` | سند YAML درونخطی `providers:` (RIC-738، D4). وقتی تنظیم شود (با یا بدون بلوک `strategy:`)، مسیر `/v1/chat/completions` بهجای pipeline ابری، به ورودی یکپارچه و self-hosted سازگار با OpenAI هدایت میشود. در صورت تنظیمنبودن (حالت پیشفرض)، مسیر مستقیماً وارد pipeline ابری موجود میشود. به `docs/routing/SELF_HOSTED_OPENAI_ENTRY.md` مراجعه کنید. |
| `OMNIROUTE_SELF_HOSTED_PROVIDERS_FILE` | _(تنظیمنشده)_ | `open-sse/services/selfHostedEntry.ts` | مسیر یک فایل YAML که همان سند `providers:` موجود در `OMNIROUTE_SELF_HOSTED_PROVIDERS` را نگه میدارد؛ برای استقرارهایی که فایل را به متغیر محیطی درونخطی ترجیح میدهند. تنظیم هرکدام از این دو، ورودی self-hosted را فعال میکند. |
| `OMNIROUTE_SELF_HOSTED_API_KEY` | _(تنظیمنشده — مسیر باز)_ | `open-sse/services/selfHostedEntry.ts` | کلید API مشترک اختیاری برای ورودی یکپارچه self-hosted (چارچوب اولیه D5، رزروشده برای سامانه سهمیهبندی بهازای هر کلید). وقتی تنظیم شود، درخواستها باید شامل `Authorization: Bearer ` باشند. در صورت تنظیمنبودن، مسیر باز است و با الگوی موجود ارائهدهنده محلی self-hosted مطابقت دارد (استقرار روی loopback/شبکه مورد اعتماد). |
| `OMNIROUTE_SELF_HOSTED_STRATEGY` | _(تنظیمنشده)_ | `open-sse/services/routingStrategies.ts` | سند YAML درونخطی `strategy:` برای موتور مسیریابی قطعی (M2/RIC-740، D3) — فهرست سیاه/سفید، قطعکننده با دوره انتظار، اولویتبندی هزینه، آگاه از تأخیر و زنجیره fallback. بلوک درونخطی `strategy:` تودرتو در `OMNIROUTE_SELF_HOSTED_PROVIDERS` را بهازای هر کلید بازنویسی میکند. به `docs/routing/DETERMINISTIC_ROUTING.md` مراجعه کنید. |
| `OMNIROUTE_SELF_HOSTED_STRATEGY_FILE` | _(تنظیمنشده)_ | `open-sse/services/routingStrategies.ts` | مسیر یک فایل YAML که همان سند `strategy:` مربوط به `OMNIROUTE_SELF_HOSTED_STRATEGY` را نگه میدارد؛ برای استقرارهایی که استفاده از فایل را به متغیر محیطی درونخطی ترجیح میدهند. |
| `OMNIROUTE_DISABLE_CONVERSATION_TRACKING` | _(تنظیمنشده)_ | `open-sse/services/conversationTracker.ts` | برای توقف جمعآوری تاریخچهٔ مکالمه، مقدار را روی `1` تنظیم کنید. `resolveConversationId()` پیش از خواندن SQLite یا تجزیهٔ تاریخچهٔ پیامها، یک نتیجهٔ ردیابینشده برمیگرداند و شناسههای نشست ارائهشده توسط کلاینت را نیز پوشش میدهد. مدیریت نشست مسیریابی بدون تغییر باقی میماند و رکوردهای موجود حذف نمیشوند. مناسب برای استقرارهایی که از نمای مکالمهٔ داشبورد استفاده نمیکنند و میخواهند رشد جدول نوبتها متوقف شود. |
| `OMNIROUTE_NADIR_API_KEY` | _(تنظیمنشده)_ | `open-sse/services/autoCombo/nadirStrategy.ts` | کلید API برای راهبرد مسیریاب auto-combo اختیاری `nadir` که وقتی `config.nadir.apiKey` خود ترکیب تنظیم نشده باشد استفاده میشود. اختیاری: فراخوانیهای بدون کلید به سطح ناشناس Nadir هدایت میشوند که بر اساس IP محدودیت نرخ دارد و بنابراین پشت یک درگاه مشترک قابلاستفاده نیست. حساس است؛ وقتی ترکیبها از حسابهای متفاوتی استفاده میکنند، فیلد اختصاصی هر ترکیب را ترجیح دهید. |
| `OMNIROUTE_NADIR_BASE_URL` | `https://api.getnadir.com` | `open-sse/services/autoCombo/nadirStrategy.ts` | مبدأ پایهٔ API تصمیمگیری Nadir که وقتی `config.nadir.baseUrl` خود ترکیب تنظیم نشده باشد استفاده میشود. فقط برای Nadir خودمیزبان لازم است که بخشهای ابتدایی پرامپت را در شبکهٔ خودتان نگه میدارد. وجود `/v1` در انتهای آن پذیرفته میشود و حذف خواهد شد. |
| `OMNIROUTE_API_KEY_WEEKLY_WINDOW` | `provider` | `src/lib/usage/apiKeyUsageLimits.ts` | بازهٔ هفتگی برای محدودیتهای مصرف دلاری بهازای هر کلید API (اعمال محدودیت درخواست، `GET /api/keys/{id}/usage-limits`، `@@om-usage`). `provider`: هفته در زودترین زمان بازنشانی هفتگی میان اتصالهای بالادستی قابلدسترسی برای کلید پایان مییابد؛ یا اگر هیچ زمان بازنشانی شناختهشدهای وجود نداشته باشد، یک بازهٔ متحرک ۷روزه است. `calendar`: هفتهٔ محلی از دوشنبه ساعت 00:00 تا دوشنبهٔ بعد ساعت 00:00 که برای همهٔ کلیدها یکسان است. وقتی یک مجموعه حساب بالادستی میان چندین کلید با بودجهبندی مجزا به اشتراک گذاشته میشود، `calendar` توصیه میشود. مقادیر نامعتبر به `provider` بازمیگردند. |
| `OMNIROUTE_API_KEY_WEEKLY_WINDOW_TIMEZONE` | _(منطقهٔ زمانی فرایند)_ | `src/lib/usage/apiKeyUsageLimits.ts` | منطقهٔ زمانی IANA (برای مثال `Asia/Shanghai`) که دوشنبه ساعت 00:00 را برای بازهٔ هفتگی `calendar` تعریف میکند. در صورت تنظیمنشدن یا نامعتبر بودن: منطقهٔ زمانی فرایند OmniRoute (مقدار `TZ` میزبان یا کانتینر که در ایمیجهای کانتینر اغلب تنظیم نشده است، یعنی زمان هماهنگ جهانی). در حالت `provider` نادیده گرفته میشود. |
| `OMNIROUTE_MAX_TOOLS_LIMIT` | `128` | `open-sse/config/constants.ts` | حداکثر تعداد پیشفرض ابزارهای مجاز در یک درخواست (پیشفرض OpenAI). فقط اعداد صحیح مثبت؛ مقادیر تنظیمنشده یا نامعتبر مقدار `128` را حفظ میکنند. ارائهدهندهای با محدودیت شناختهشده/پیشگیرانه (`grok-cli` برابر با 200 و `nvidia` برابر با 1536) همچنان سقف خودش را اعمال میکند — این گزینه فقط سقف پیشفرض را تغییر میدهد. |
| `OMNIROUTE_PROMPT_EMULATE_TOOLS` | _(روشن)_ | `open-sse/executors/syntxChat.ts` | فراخوانی ابزار شبیهسازیشده با پرامپت در SYNTX.ai: در صورت تنظیمنشدن یا داشتن مقدار `1`/`true`/`on`/`yes`، کاتالوگ ابزار محلی را به پرامپت تزریق میکند؛ هر مقدار دیگری (برای مثال `0`) از این تزریق صرفنظر میکند. |
---
## 7. نشانیهای URL و همگامسازی ابری
| متغیر | پیشفرض | فایل منبع | توضیحات |
| ---------------------------------------- | --------------------------------------------------------- | ------------------------------------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `BASE_URL` | `http://localhost:20128` | `src/lib/cloudSync.ts` | نشانی URL سمت سرور برای فراخوانی `/api/sync/cloud` توسط وظایف همگامسازی داخلی. حتی زمانی که برنامه بهصورت عمومی از طریق پروکسی ارائه میشود، این مقدار را بهشکل یک نشانی 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` | _خروجی standalone در .build/_ | `scripts/build/colocate-standalone.mjs` | بازنویسی زمان ساخت برای دایرکتوری خروجی standalone که در مرحله هممکانی پس از ساخت استفاده میشود. این یک تنظیم زمان اجرا نیست. |
| `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، داشبورد، همگامسازی | نشانی URL عمومی برای redirect_uri مربوط به OAuth، پیوندهای داشبورد و نشانیهای 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` | پورت جایگزین سمت کلاینت برای URLهای نمایشی، هنگامی که هیچ مبدأیی مشخص نیست (SSR/آزمایشها)؛ پیش از `PORT` خوانده میشود. |
| `OMNIROUTE_PUBLIC_BASE_URL` | _(تنظیمنشده)_ | حلکننده مبدأ عمومی، URLهای تصویر | مبدأ OmniRoute قابلدسترسی برای مرورگر با بالاترین اولویت که برای تولید URL عمومی و اعتبارسنجی مبدأ مرورگر خارج از داشبورد استفاده میشود. این متغیر را زمانی تنظیم کنید که OpenWebUI یا یک رله دیگر از طریق یک URL داخلی به OmniRoute دسترسی دارد، اما مرورگر کاربر باید رسانه تولیدشده را از یک مبدأ LAN، تونل یا عمومی دریافت کند. `/v1` را **اضافه نکنید**. |
| `OMNIROUTE_PROVIDER_MANIFEST_URL` | _(تنظیمنشده)_ | `open-sse/config/providerPluginManifestUrl.ts` | URL مطلق مانیفست افزونه ارائهدهنده که به کلاینتهای sidecar اعلام میشود. در صورت تنظیمنبودن، OmniRoute مسیر `/api/v1/provider-plugin-manifest` را از مبدأ درخواست یا HOST/PORT استخراج میکند. |
| `OMNIROUTE_PUBLIC_PROTOCOL` | `http` | `open-sse/config/providerPluginManifestUrl.ts` | پروتکل مورد استفاده هنگام استخراج URL مانیفست افزونه ارائهدهنده از HOST/PORT، بدون وجود مبدأ درخواست. وقتی هیچ `OMNIROUTE_PROVIDER_MANIFEST_URL` صریحی تنظیم نشده است، پشت یک پروکسی عمومی خاتمهدهنده TLS آن را روی `https` تنظیم کنید. |
| `OMNIROUTE_TRUST_PROXY` | _(تنظیمنشده)_ | `src/server/origin/publicOrigin.ts` | حالت اعتماد اختیاری برای هدرهای مبدأ عمومی فورواردشده. تنظیمنشده = برای تصمیمهای امنیتی به `Forwarded` / `X-Forwarded-*` اعتماد نکنید. `true` / `loopback` تنها برای یک پروکسی loopback دارای توکن، به host/proto فورواردشده اعتماد میکند. `private` / `lan` همچنین به همتاهای پروکسی در LAN خصوصی اعتماد میکند و به پل `API_PORT` اجازه میدهد `X-Forwarded-For` چنین همتایی را حفظ کند. در محیط production، `NEXT_PUBLIC_BASE_URL` صریح را ترجیح دهید. |
| `KIE_CALLBACK_URL` | _(تنظیمنشده)_ | `open-sse/utils/kieTask.ts` | URL عمومی callback برای کارهای ناهمگام kie.ai. بازنویسی با بالاترین اولویت، پیش از `OMNIROUTE_KIE_CALLBACK_URL` و `OMNIROUTE_PUBLIC_URL`. |
| `OMNIROUTE_KIE_CALLBACK_URL` | _(تنظیمنشده)_ | `open-sse/utils/kieTask.ts` | املای جایگزین `KIE_CALLBACK_URL`. هنگامی که متغیر اصلی تنظیم نشده باشد، بهعنوان جایگزین استفاده میشود. |
| `OMNIROUTE_PUBLIC_URL` | _(تنظیمنشده)_ | `open-sse/utils/kieTask.ts` | مبدأ عمومی مورد استفاده برای ساخت URLهای callback ناهمگام. جایگزین با کمترین اولویت برای callbackهای kie.ai؛ همچنین بهعنوان یک URL عمومی کلی برای رلههای دیگر استفاده میشود. |
| `OMNIROUTE_CROF_USAGE_URL` | `https://crof.ai/usage_api/` | `open-sse/services/usage.ts` | نقطه پایانی بررسی سهمیه CrofAI که صفحه Usage از آن استفاده میکند. برای رلهها / دادههای آزمایشی بازنویسی کنید. |
| `OMNIROUTE_CLINEPASS_USAGE_URL` | `https://api.cline.bot/api/v1/users/me/plan/usage-limits` | `open-sse/services/usage/clinepass.ts` | نقطه پایانی سهمیه ۵ ساعته / هفتگی / ماهانه ClinePass که صفحه Usage از آن استفاده میکند. برای رلهها / دادههای آزمایشی بازنویسی کنید. |
| `OMNIROUTE_OPENCODE_QUOTA_URL` | `https://opencode.ai/zen/go/v1/usage` | `open-sse/services/opencodeQuotaFetcher.ts` | نقطه پایانی رسمی مصرف OpenCode Go با احراز هویت API key که صفحه Usage از آن استفاده میکند. برای رلهها / دادههای آزمایشی بازنویسی کنید. |
| `OPENCODE_SYNTHESIZE_CLI_HEADERS` | `true` | `open-sse/executors/opencode.ts` | هدرهای هویت OpenCode CLI (User-Agent، x-opencode-client/project و UUIDهای درخواست/نشست) را برای درخواستهای بالادستی opencode-go/zen که کلاینت ارسال نکرده است تولید میکند تا Cloudflare آنها را در ترافیک خروجی VPS بپذیرد (#6210/#5997). از #10571 بهطور پیشفرض فعال است؛ با `false`/`0`/`no`/`off` غیرفعال کنید. |
| `OPENCODE_USER_AGENT` | `opencode/1.18.31` | `open-sse/utils/opencodeHeaders.ts` | User-Agent پیشفرض که وقتی `OPENCODE_SYNTHESIZE_CLI_HEADERS` فعال است و بازنویسی `_USER_AGENT` برای ارائهدهنده تنظیم نشده باشد، استفاده میشود. فقط روی اجراکنندههای opencode اعمال میشود. در درخواست بدون کلیدی که بالادست آن را مشروط میکند، مقدار پیکربندیشدهای که شامل `opencode/= 1.17>` نباشد، بهجای رد شدن با این مقدار پیشفرض جایگزین میشود. |
| `OMNIROUTE_FORWARD_ATTRIBUTION` | `1` (فعال) | `open-sse/utils/opencodeHeaders.ts` | هدرهای انتساب برنامهٔ کلاینت (`x-session-id`، `x-title`، `http-referer`) را به ارائهدهندگان بالادست ارسال میکند تا درخواستی که از داخل یکی از ابزارهای فهرستشده آغاز میشود، هویت خود را در سراسر مسیریاب حفظ کند (دروازههای ناشر OpenRouter بر اساس این موارد عمل میکنند). `0`/`false`/`no`/`off` هویت رجیستری/اپراتور را حفظ و مقادیر ارائهشده توسط کلاینت را حذف میکند. هدرهای سفارشی پیکربندیشده توسط اپراتور همیشه بر مقادیر کلاینت اولویت دارند. |
| `OPENCODE_CLIENT` | `desktop` | `open-sse/executors/opencode.ts` | مقدار هدر تولیدشدهٔ `x-opencode-client` هنگامی که `OPENCODE_SYNTHESIZE_CLI_HEADERS` فعال است. |
| `OPENCODE_PROJECT` | `global` | `open-sse/executors/opencode.ts` | مقدار هدر تولیدشدهٔ `x-opencode-project` هنگامی که `OPENCODE_SYNTHESIZE_CLI_HEADERS` فعال است. |
| `OMNIROUTE_EGRESS_IP_LOCK_PROVIDERS` | _(تنظیمنشده)_ | `open-sse/config/providerErrorRules.ts` | مجموعهٔ مؤثر ارائهدهندگانی که خطاهای بالادست آنها بر اساس IP خروجی دستهبندی میشوند (یک خطای 429 تمام اتصالهای همخانوادهای را که آن IP را به اشتراک میگذارند، متوقف میکند). در صورت تنظیمنبودن، مقدار پیشفرض سطح رایگان یعنی `opencode,opencode-go,opencode-cli` استفاده میشود؛ `none`/`off`/`false`/`0` این آبشار را کاملاً غیرفعال میکند؛ یک فهرست جداشده با ویرگول جایگزین مجموعه میشود. طرحهای پولی در بالادست بر اساس حساب دستهبندی میشوند و میتوانند با خیال راحت آن را غیرفعال کنند (#9611). |
| `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` | URL تنظیمات Ollama Cloud که برای استخراج سهمیه استفاده میشود. برای رلهها / دادههای آزمایشی بازنویسی کنید. |
| `OLLAMA_USAGE_COOKIE` | _(تنظیمنشده)_ | `open-sse/services/usage.ts` | کوکی `__Secure-session` متعلق به Ollama Cloud که برای استخراج سهمیه از صفحهٔ تنظیمات استفاده میشود. حساس است؛ هنگامی که چند حساب پیکربندی شدهاند، فیلد مختص هر اتصال در Dashboard را ترجیح دهید. |
| `OLLAMA_CLOUD_USAGE_COOKIE` | _(تنظیمنشده)_ | `open-sse/services/usage.ts` | متغیر محیطی جایگزین برای کوکی `__Secure-session` متعلق به Ollama Cloud. حساس است؛ هنگامی که چند حساب پیکربندی شدهاند، فیلد مختص هر اتصال در Dashboard را ترجیح دهید. |
| `OMNIROUTE_OLLAMA_USAGE_COOKIE` | _(تنظیمنشده)_ | `open-sse/services/usage.ts` | متغیر محیطی جایگزین برای کوکی `__Secure-session` متعلق به Ollama Cloud که پیش از نامهای مستعار کوتاهتر استفاده میشود. حساس است؛ هنگامی که چند حساب پیکربندی شدهاند، فیلد مختص هر اتصال در Dashboard را ترجیح دهید. |
| `OMNIROUTE_CODEWHISPERER_BASE_URL` | `https://codewhisperer.us-east-1.amazonaws.com` | `open-sse/services/usage.ts` | نقطهٔ پایانی محدودیتهای استفادهٔ CodeWhisperer (AWS Kiro). برای رلهها / دادههای آزمایشی بازنویسی کنید. |
> [!IMPORTANT]
> هنگام استقرار پشت یک پروکسی معکوس (nginx، Caddy)، در مواردی که callbackهای OAuth یا لینکهای عمومی تولیدشده باید از آن نام میزبان استفاده کنند، `NEXT_PUBLIC_BASE_URL` را روی URL عمومی و پایدار خود تنظیم کنید (برای مثال، `https://omniroute.example.com`). بدون این تنظیم، callbackهای OAuth ممکن است با خطا مواجه شوند، زیرا redirect_uri مطابقت نخواهد داشت و لینکهای عمومی تولیدشده ممکن است به مبدأ داخلی کانتینر اشاره کنند.
>
> `BASE_URL` را برای jobهای server-to-server بهصورت یک URL داخلی loopback/کانتینر نگه دارید. برای self-fetchهای داخلیِ حاوی اطلاعات احراز هویت، از `Origin` مرورگر یا نام میزبان عمومی استفاده نکنید.
>
> عملیات نوشتن احرازشده در داشبورد به یک URL پایه عمومی ثابت نیاز ندارند: داشبورد درخواستهای ناامن same-origin را همراه با یک توکن CSRF متصل به session ارسال میکند. OmniRoute همچنان اعتبارسنجی مبدأ عمومی را برای یکپارچهسازیهای مرورگری خارج از داشبورد بهصورت متمرکز انجام میدهد: ابتدا به env varهای صریحِ URL عمومی اعتماد میشود؛ هدرهای خام `Forwarded` / `X-Forwarded-*` نادیده گرفته میشوند، مگر اینکه `OMNIROUTE_TRUST_PROXY` فعال باشد و peer مستقیم پروکسی با یک توکن بهعنوان مورد اعتماد علامتگذاری شده باشد. برای رفع مشکلات درخواستهای same-origin داشبورد از تنظیمات CORS استفاده نکنید؛ CORS فقط برای کلاینتهای مرورگری cross-origin است.
---
## 8. پراکسی خروجی
فراخوانیهای ارائهدهندگان بالادستی LLM را برای کنترل ترافیک خروجی، مسیریابی جغرافیایی یا پنهانسازی IP از طریق یک پراکسی HTTP یا SOCKS5 هدایت کنید.
مقدار پیشفرض `OMNIROUTE_UPSTREAM_HTTP2_ENABLED` برابر با `true` است. برای اجبار به استفاده از HTTP/1.1 در دیسپچرهای Undici در `open-sse/utils/proxyDispatcher.ts`
و `open-sse/utils/proxyFetch.ts`، آن را روی `false`، `0`، `no` یا
`off` تنظیم کنید: خروجی مستقیم، پراکسیهای HTTP(S)/SOCKS، رلهها و
تلاشهای مجدد آنها با سوکت جدید. این کار اعتبارسنجی گواهی TLS، احراز هویت
پراکسی، محدودیتهای اتصال و تنظیمات keep-alive را حفظ میکند. پس از
تغییر آن، OmniRoute را مجدداً راهاندازی کنید، زیرا دیسپچرها کش میشوند و عاملهای رله هنگام راهاندازی ایجاد میشوند.
این گزینه، انگشتنگاری TLS در wreq یا انتقالهای مختص ارائهدهنده را کنترل نمیکند.
| متغیر | پیشفرض | فایل منبع | توضیحات |
| ---------------------------------------- | ------------- | ---------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `ENABLE_SOCKS5_PROXY` | `true` | `open-sse/executors` | عامل پراکسی SOCKS5 را برای فراخوانیهای بالادستی فعال میکند. برای انصراف، مقدار `false` را تنظیم کنید. |
| `NEXT_PUBLIC_ENABLE_SOCKS5_PROXY` | `true` | سمت کلاینت | آگاهی سمت کلاینت از در دسترس بودن SOCKS5. |
| `PROXY_SKIP_RECENTLY_FAILED` | `true` | `src/shared/utils/featureFlags.ts` | پرچم قابلیتی که بهطور پیشفرض فعال است (به [FEATURE_FLAGS.md](./FEATURE_FLAGS.md) مراجعه کنید؛ مقدار بازنویسیشده در پایگاه داده داشبورد اولویت دارد). استخرهای پراکسی و چرخش بهازای هر حساب، عضوی را که بهتازگی ناموفق بوده است (کاوش TCP رد شده یا دریافت 429 از طریق آن)، برای مدتی که با هر تکرار دو برابر میشود و سقف مشخصی دارد، دوباره ارائه نمیکنند. مقدار `false` انتخاب عادی را بازیابی میکند. |
| `SELECTOR_CONTROL_ALLOWLIST` | _(تنظیمنشده)_ | `src/lib/proxySubscription/selectorGuard.ts` | فهرست مجاز برای مقصدهای کنترل انتخابگر هسته محلی در خارج از loopback (میزبانها یا IPهای جداشده با ویرگول/فاصله؛ `*` شبکه LAN/خصوصی را باز میکند، اما هرگز metadata/link-local را مجاز نمیکند). loopback از طریق http/https بهطور پیشفرض مجاز است. در صورت تنظیم و خالی نبودن، مقدار پایگاه داده داشبورد بر این متغیر اولویت دارد. |
| `PROXY_QUOTA_429_BASE_MS` | `300000` | `open-sse/utils/proxyRefusalMemory.ts` | دوره پایه (میلیثانیه) برای کنارگذاری ناشی از 429 که با هر تکرار دو برابر میشود. یک بار هنگام راهاندازی خوانده میشود. به بازه `1000..3600000` محدود است؛ مقدار خارج از بازه یا خواندهنشدنی با نمایش هشدار به مقدار پیشفرض بازمیگردد. |
| `PROXY_QUOTA_429_MAX_MS` | `900000` | `open-sse/utils/proxyRefusalMemory.ts` | سقف زمانی (میلیثانیه) کنارگذاری ناشی از 429. یک بار هنگام راهاندازی خوانده میشود. به بازه `1000..3600000` محدود است؛ مقدار خارج از بازه یا خواندهنشدنی با نمایش هشدار به مقدار پیشفرض بازمیگردد. وقتی سقف کمتر از مقدار پایه باشد، به مقدار پیشفرض بازمیگردد. کاهش سقف همچنین زمان فراموششدن دنباله را کوتاه میکند: ورودیها پس از انقضا در زمان `2 x max` پاک میشوند. |
| `PROXY_POOL_SHARED_EGRESS_ORDER` | `false` | `src/shared/utils/featureFlags.ts` | پرچم قابلیت اختیاری (به [FEATURE_FLAGS.md](./FEATURE_FLAGS.md) مراجعه کنید؛ مقدار بازنویسیشده در پایگاه داده داشبورد اولویت دارد). برای ارائهدهندگانی که سهمیه آنها بر اساس آدرس خروجی دستهبندی میشود، عضو استخری را که آدرس خروجی مشاهدهشدهاش با عضو اخیراً ردشده مشترک است، درست پایینتر از اعضای سالم رتبهبندی میکند. فقط ترتیب را تغییر میدهد و هرگز عضوی را حذف نمیکند. به `PROXY_SKIP_RECENTLY_FAILED` نیاز دارد که سیگنال ردشدن مورد استفاده آن را تولید میکند. |
| `PROXY_WEBHOOK_REBOUND_MS` | `300000` | `src/lib/proxyEvents/proxyTransitionBridge.ts` | پنجره بازگشت (میلیثانیه) که هشدارهای تکراری webhook با نام `proxy.set_aside` را برای هر عضو استخر محدود میکند تا مجموعهای ناگهانی از ردشدنها فقط یک رویداد ارسال کند. هنگام هر ارسال خوانده میشود. به بازه `1000..3600000` محدود است؛ مقدار خارج از بازه یا خواندهنشدنی بدون هشدار به مقدار پیشفرض بازمیگردد. |
| `HTTP_PROXY` | _(تنظیمنشده)_ | استاندارد Node.js | پراکسی HTTP برای فراخوانیهای بالادستی. |
| `HTTPS_PROXY` | _(تنظیمنشده)_ | استاندارد Node.js | پراکسی HTTPS برای فراخوانیهای بالادستی. |
| `ALL_PROXY` | _(تنظیمنشده)_ | استاندارد Node.js | پراکسی سراسری (از `socks5://` پشتیبانی میکند). |
| `OMNIROUTE_PROXY_ECHO_URL` | _(تنظیمنشده)_ | `src/lib/proxyEchoTarget.ts` | مقصد بازتاب 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 ذخیرهشده در حافظهٔ نهان. جریانهای SSE طولانیمدت، مانند Codex `/v1/responses`، هنگامی که چند درخواست از یک پروکسی مشترک در سطح حساب استفاده میکنند، به بیش از یک اتصال نیاز دارند. مقادیر بالاتر از `256` محدود میشوند. |
| `SOCKS_HANDSHAKE_TIMEOUT_MS` | `10000` | `open-sse/utils/socksConnectorWithFamily.ts` | مهلت زمانی دستدهی (اتصال) SOCKS5 برحسب میلیثانیه. هنگامی که یک میزبان دروازهٔ مسکونی با همزمانی بالا مواجه است (برای مثال، 100 درخواست همزمان)، آن را افزایش دهید — در یک مجموعهٔ اشباعشده، دستدهی واقعی ممکن است با وجود در دسترس بودن پروکسی بیش از 10 ثانیه طول بکشد و در غیر این صورت بهاشتباه بهصورت `[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 مسیریابی میشوند. Groq (`api.groq.com`) حتی در صورت تنظیم نبودن فهرست مجاز مستثنا است، زیرا JA3 مربوط به Chrome خطای Cloudflare 1010 را فعال میکند، درحالیکه undici بومی به API دسترسی پیدا میکند. |
| `OMNIROUTE_TURNSTILE_IGNORE_TLS_ERRORS` | `false` | `open-sse/services/claudeTurnstileSolver.ts` | به زمینهٔ مرورگر Playwright مربوط به Claude Turnstile اجازه میدهد خطاهای گواهی HTTPS را نادیده بگیرد. |
### سناریوها
| سناریو | پیکربندی |
| ------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **SOCKS5 از طریق تونل SSH** | `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):** نقطهٔ پایانی اعتبارسنجی کلید API در NVIDIA
> هنگامی که از طریق واکشی سراسریِ پروکسیشده/وصلهشده برای TLS مسیریابی میشود، متوقف میماند (توزیعکنندهٔ undici → 504).
> `src/lib/providers/validation.ts::directHttpsRequest()` عمداً برای همان یک فراخوانی اعتبارسنجی با استفاده از `safeOutboundFetch({ bypassProxyPatch: true })`
> وصلهٔ پروکسی را دور میزند.
> این یک استثنای مستند و محدود به دامنهای مشخص است — و بر خروجی چت/مصرف **تأثیری ندارد**.
> دامنهٔ این دور زدن توسط `tests/unit/proxy-bypass-scope-guard-3226.test.ts` تثبیت شده است.
---
## 9. یکپارچهسازی ابزار CLI
نحوهٔ شناسایی و اجرای سرویسهای جانبی CLI (Claude Code، Codex و غیره) توسط OmniRoute را کنترل میکند.
| متغیر | پیشفرض | فایل منبع | توضیحات |
| --------------------------------- | -------------------------------- | --------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `CLI_MODE` | `auto` | `src/shared/services/cliRuntime.ts` | `auto` = جستوجو در PATH سیستم؛ `manual` = فقط از مسیرهای صریح استفاده میکند. |
| `CLI_EXTRA_PATHS` | _(تنظیمنشده)_ | `src/shared/services/cliRuntime.ts` | ورودیهای اضافی PATH برای یافتن فایلهای اجرایی CLI (جداشده با دونقطه). |
| `CLI_CONFIG_HOME` | _(تنظیمنشده)_ | `src/shared/services/cliRuntime.ts` | دایرکتوری خانه را برای خواندن پیکربندیهای CLI (`~/.claude`، `~/.codex`) بازنویسی میکند. مسیر باید مطلق و داخل دایرکتوری خانهٔ فرایند باشد — **یا** در یک کانتینر، مسیری باشد که با bind mount متصل شده است (`/host-home` به این شکل کار میکند). در غیر این صورت، از دایرکتوری خانه استفاده میشود. |
| `CLI_ALLOW_CONFIG_WRITES` | `true` | `src/shared/services/cliRuntime.ts` | به OmniRoute اجازه میدهد فایلهای پیکربندی CLI را بنویسد (نوسازی توکن، دادههای نشست). آن را روی `false` تنظیم کنید تا هرگونه نوشتن در پیکربندی CLI با خطای صریح «نوشتن غیرفعال است» ناموفق شود. |
| `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` را امتحان میکند و در صورت عدم موفقیت به `cursor` بازمیگردد. |
| `CLI_CLINE_BIN` | `cline` | `src/shared/services/cliRuntime.ts` | مسیر سفارشی فایل اجرایی Cline CLI. |
| `CLI_5DIVE_BIN` | `5dive` | `src/shared/services/cliRuntime.ts` | مسیر سفارشی فایل اجرایی 5dive CLI. |
| `CLI_5DIVE_STATE_DIR` | `/var/lib/5dive` | `src/shared/services/cliRuntime.ts` | دایرکتوری وضعیت سیستمی 5dive (پروفایلهای احراز هویت متعلق به root)؛ با مقدار پیشفرض STATE_DIR خود 5dive مطابقت دارد. |
| `CLI_CONTINUE_BIN` | `cn` | `src/shared/services/cliRuntime.ts` | مسیر سفارشی فایل اجرایی Continue CLI. |
| `CLI_QODER_BIN` | `qodercli` | `src/shared/services/cliRuntime.ts` | مسیر سفارشی فایل اجرایی Qoder CLI. |
| `CLI_QWEN_BIN` | `qwen` | `src/shared/services/cliRuntime.ts` | مسیر سفارشی فایل اجرایی 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` فایل اجرایی `gemini` را از PATH سیستم پیدا میکند. |
| `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` | مسیر سفارشی فایل اجرایی CLI مربوط به ForgeCode. |
| `CLI_JCODE_BIN` | `jcode` | `src/shared/services/cliRuntime.ts` | مسیر سفارشی فایل اجرایی CLI مربوط به jcode. |
| `CLI_DEEPSEEK_TUI_BIN` | `deepseek-tui` | `src/shared/services/cliRuntime.ts` | مسیر سفارشی فایل اجرایی TUI مربوط به DeepSeek. |
| `CLI_CODEWHALE_BIN` | `codewhale` | `src/shared/services/cliRuntime.ts` | مسیر سفارشی فایل اجرایی CLI مربوط به CodeWhale. |
| `CLI_SMELT_BIN` | `smelt` | `src/shared/services/cliRuntime.ts` | مسیر سفارشی فایل اجرایی CLI مربوط به Smelt. |
| `CLI_PI_BIN` | `pi` | `src/shared/services/cliRuntime.ts` | مسیر سفارشی فایل اجرایی Pi (pi-coding-agent). |
| `CLI_CRUSH_BIN` | `crush` | `src/shared/services/cliRuntime.ts` | مسیر سفارشی فایل اجرایی CLI مربوط به Crush. |
| `CLI_OMP_BIN` | `omp` | `src/shared/services/cliRuntime.ts` | مسیر سفارشی فایل اجرایی عامل Oh My Pi (`omp`). |
| `CLI_LETTA_BIN` | `letta` | `src/shared/services/cliRuntime.ts` | مسیر سفارشی فایل اجرایی CLI مربوط به Letta. |
| `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` | مسیر سفارشی فایل اجرایی CLI مربوط به Devin (v3.8.0). توسط اجراکننده Windsurf/Devin استفاده میشود. |
| `DEVIN_DESKTOP_VERSION` | `3.6.27` | `open-sse/executors/devin-desktop.ts` | مقدار `ide_version` مربوط به Devin Desktop. مقادیر بازنویسی باید از قالب `x.y.z` استفاده کنند؛ در صورت نامعتبر بودن، مقدار پیشفرض تأییدشده استفاده میشود. |
| `DEVIN_DESKTOP_EXTENSION_VERSION` | `1.48.2` | `open-sse/executors/devin-desktop.ts` | مقدار `extension_version` مربوط به Codeium/language-server همراه برنامه که از `ide_version` مربوط به Desktop متمایز است. مقادیر بازنویسی باید از قالب `x.y.z` استفاده کنند؛ برای مقادیر نامعتبر، مقدار پیشفرض همراه برنامه استفاده میشود. |
| `CLI_DEVIN_AGENTIC_BIN` | `devin` | `open-sse/executors/devin-cli-agentic.ts` | بازنویسی CLI مربوط به Devin فقط برای پل عاملمحور. اجراکننده تنها بالادست محلی ACP stdio را میپذیرد. |
| `DEVIN_AGENTIC_HOME` | _(الزامی)_ | `open-sse/executors/devin-cli-agentic.ts` | مسیر خانهٔ ایزوله و مطلق برای زیرپردازهٔ عاملمحور Devin؛ مسیرهای پذیرفتهشدهٔ پل عبارتاند از `/home/bridge` و مسیرهای `.sandbox` محلیِ وظیفه (در Windows، مسیرهای `C:\...\.sandbox\...`). |
| `DEVIN_AGENTIC_ACP_TIMEOUT_MS` | `120000` | `open-sse/executors/devin-cli-agentic.ts` | حداکثر مدتزمان یک نوبت ACP مربوط به Devin، پیش از آنکه پل فرایند فرزند را خاتمه دهد و یک خطای صریح پایان مهلت بازگرداند. |
| `DEVIN_BRIDGE_MODEL` | `devin-cli-agentic/swe-1-7` | `docker/devin-bridge/compose.yml` | نام مستعار مدل اصلی Claude Code برای پل ایزوله. هارنس زنده، مقدار نمونه را با مدلی که حساب فعلی Devin بازمیگرداند جایگزین میکند. |
| `DEVIN_BRIDGE_SONNET_MODEL` | `DEVIN_BRIDGE_MODEL` | `docker/devin-bridge/compose.yml` | نام مستعار پل ایزوله که وقتی Claude Code مدل پیشفرض Sonnet خود را درخواست میکند، استفاده میشود. |
| `DEVIN_BRIDGE_OPUS_MODEL` | `DEVIN_BRIDGE_MODEL` | `docker/devin-bridge/compose.yml` | نام مستعار پل ایزوله که وقتی Claude Code مدل پیشفرض Opus خود را درخواست میکند، استفاده میشود. |
| `DEVIN_BRIDGE_HAIKU_MODEL` | `DEVIN_BRIDGE_MODEL` | `docker/devin-bridge/compose.yml` | نام مستعار پل ایزوله که وقتی Claude Code مدل پیشفرض Haiku خود را درخواست میکند، استفاده میشود. |
| `DEVIN_BRIDGE_SUBAGENT_MODEL` | `DEVIN_BRIDGE_MODEL` | `docker/devin-bridge/compose.yml` | نام مستعار پل ایزوله که برای زیرعاملهای Claude Code استفاده میشود. |
| `DEVIN_SEAT_API_URL` | `https://server.codeium.com` | `open-sse/services/usage/devinCli.ts` | بازنویسی اختیاری برای API مدیریت جایگاه Codeium که سهمیه Devin CLI از آن استفاده میکند (`GetUserStatus`). |
| `AUGGIE_BIN` | `auggie` | `open-sse/executors/auggie.ts` | بازنویسی مسیر مطلق فایل اجرایی CLI مربوط به Augment (Auggie) که ارائهدهنده محلی `auggie` از آن استفاده میکند. در صورت نبود، ابتدا از `CLI_AUGGIE_BIN` و سپس از جستوجو در PATH استفاده میشود. |
| `CLI_AUGGIE_BIN` | `auggie` | `open-sse/executors/auggie.ts` | نام مستعار برای بازنویسی مسیر فایل اجرایی CLI مربوط به Augment (Auggie) که پس از `AUGGIE_BIN` بررسی میشود. |
| `ZCODE_BIN` | `zcode` | `open-sse/executors/zcode.ts` | فایل اجرایی مورد استفاده برای کلاینت stdio ارائهدهنده محلی `zcode`. در صورت نبود، از `zcode` موجود در PATH استفاده میشود. |
| `ZCODE_ARGS` | — | `open-sse/executors/zcode.ts` | آرایه JSON شامل آرگومانهای اضافی (حداکثر ۱۶ رشته) که هنگام اجرا از طریق `cliTools` به فایل اجرایی `zcode` ارسال میشوند. |
| `ZCODE_CWD` | `process.cwd()` | `open-sse/executors/zcode.ts` | دایرکتوری کاری برای زیرفرایند app-server مربوط به ZCode. |
| `ZCODE_PROVIDER_ID` | `builtin:zai-coding-plan` | `open-sse/executors/zcode.ts` | بازنویسی شناسه ارائهدهندهای که به app-server ارسال میشود. |
| `ZCODE_SERVER_RUNTIME_ROOT` | `~/.zcode/server` | `open-sse/executors/zcode.ts` | ریشه محیط زمان اجرای app-server مربوط به ZCode (محل قرارگیری `node` همراه برنامه و `zcode-server.cjs`). |
| `ZCODE_SERVER_NODE` | `/node` | `open-sse/executors/zcode.ts` | فایل اجرایی Node که برای میزبانی app-server مربوط به ZCode استفاده میشود. |
| `ZCODE_SERVER_ENTRY` | `/zcode-server.cjs` | `open-sse/executors/zcode.ts` | اسکریپت ورودی app-server که برای میزبانی سرور ZCode استفاده میشود. |
| `ZCODE_STARTUP_TIMEOUT_MS` | `10000` | `open-sse/executors/zcode.ts` | مهلت زمانی راهاندازی (میلیثانیه) که پس از آن اجرای app-server مربوط به ZCode ناموفق در نظر گرفته میشود. |
| `ZCODE_RPC_TIMEOUT_MS` | `30000` | `open-sse/executors/zcode.ts` | مهلت زمانی RPC برای هر درخواست (میلیثانیه) در فراخوانی app-server مربوط به ZCode. |
| `ZCODE_TURN_TIMEOUT_MS` | `120000` | `open-sse/executors/zcode.ts` | حداکثر مدتزمان (میلیثانیه) یک نوبت ZCode پیش از آنکه سرپرست اجرای آن را بهدلیل پایان مهلت متوقف کند. |
| `ZCODE_POLL_INTERVAL_MS` | `250` | `open-sse/executors/zcode.ts` | فاصله زمانی نظرسنجی (میلیثانیه) برای بررسی تکمیل نوبت ZCode. |
| `HERMES_HOME` | `~/.hermes` | `src/lib/cli-helper/config-generator/hermesHome.ts` | دایرکتوری خانگی Hermes Agent که OmniRoute پیکربندی Hermes CLI را در آن میخواند/مینویسد. این مقدار با متغیر محیطی تنظیمشده توسط نصبکننده PowerShell مربوط به Hermes در Windows (`%LOCALAPPDATA%\hermes`) مطابقت دارد. |
### همگامسازی خودکار پروفایل CLI
این پرچمهای قابلیت اختیاری هستند و بهصورت پیشفرض غیرفعالاند. همچنین میتوان آنها را از
داشبورد CLI Code فعال یا غیرفعال کرد.
| متغیر | پیشفرض | فایل منبع | توضیحات |
| ------------------------------------- | ------- | ------------------------------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `OMNIROUTE_AUTO_SYNC_CODEX_PROFILES` | `false` | `src/shared/constants/featureFlagDefinitions.ts` | پس از همگامسازی مدلهای یک ارائهدهنده، فایلهای پروفایل `~/.codex/*.config.toml` را بهطور خودکار بر اساس کاتالوگ زنده بازنویسی میکند. به `CLI_ALLOW_CONFIG_WRITES` نیاز دارد؛ هرگز پیکربندی فعال/پیشفرض Codex، احراز هویت، تنظیمات Codex-lb یا انتخاب ارائهدهنده را تغییر نمیدهد. |
| `OMNIROUTE_AUTO_SYNC_CLAUDE_PROFILES` | `false` | `src/shared/constants/featureFlagDefinitions.ts` | پس از همگامسازی مدلهای یک ارائهدهنده، فایلهای پروفایل Claude Code در `~/.claude/profiles//settings.json` را بهطور خودکار بر اساس کاتالوگ زنده بازنویسی میکند. به `CLI_ALLOW_CONFIG_WRITES` نیاز دارد؛ هرگز پیکربندی فعال/پیشفرض Claude، احراز هویت یا انتخاب ارائهدهنده را تغییر نمیدهد. |
### نمونه 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 mount
متصل شده باشد — آن را با mountهایی مانند `~/.codex:/host-home/.codex:rw` همراه کنید (به
پروفایل `host` در `docker-compose.yml` مراجعه کنید). مسیری که نه داخل پوشهٔ خانگی
کاربر کانتینر باشد و نه یک bind mount، نادیده گرفته میشود؛ زیرا هر چیزی که در آن
نوشته شود، هنگام ایجاد مجدد کانتینر از بین خواهد رفت.
ایمیج با `USER node` اجرا میشود، بنابراین `/root` بدون mount، یک جایگزین **معتبر**
نیست.
| متغیر | پیشفرض | فایل منبع | توضیحات |
| ---------------------------------------- | ---------- | ----------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------- |
| `OMNIROUTE_CONTAINER` | _(خودکار)_ | `src/shared/utils/containerEnv.ts` | شناسایی کانتینر را بهاجبار فعال (`1`/`true`) یا غیرفعال (`0`/`false`) میکند. فقط برای runtimeهایی لازم است که شناسایی خودکار آنها را تشخیص نمیدهد. |
| `OMNIROUTE_ALLOW_CONTAINER_CONFIG_WRITE` | `false` | `src/shared/services/cliRuntime.ts` | بااینحال اجازه میدهد پیکربندی ابزار CLI در یک مسیر mountنشدهٔ کانتینر نوشته شود. معادل آن در CLI گزینهٔ `--allow-container-write` است. |
### ابزارهای کمکی فایل اجرایی CLI (`omniroute`)
این متغیرها رفتار خود فایل اجرایی CLI یعنی `omniroute` را تنظیم میکنند (نه شناسایی
sidecar در بالا).
| متغیر | پیشفرض | فایل منبع | توضیحات |
| ------------------------------------- | --------------------------------- | --------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `OMNIROUTE_LANG` | _(سیستم)_ | `bin/cli/i18n.mjs` | زبان خروجی CLI را بهاجبار تعیین میکند. locale از نوع BCP-47 (برای مثال `en` و `pt-BR`). متغیرهای محیطی locale سیستم (LC_ALL، LC_MESSAGES) را بازنویسی میکند. |
| `OMNIROUTE_SHOW_LOG` | _(تنظیمنشده)_ | `bin/cli/runtime/processSupervisor.mjs` | برای هدایت stdout/stderr سرور به ترمینال در حالت نظارتشده، روی `1` تنظیم کنید. معادل فلگ `--log` در `omniroute serve` است. |
| `OMNIROUTE_CLI_TOKEN` | _(تنظیمنشده)_ | `bin/cli/api.mjs` | توکن احراز هویت ماشین که بهعنوان هدر `x-omniroute-cli-token` تزریق میشود. در وظیفهٔ 8.12 بهصورت خودکار تولید میشود. |
| `GEMINI_CLI_HOME` | _(تنظیمنشده)_ | `bin/cli/commands/setup-gemini.mjs` | ریشهٔ خانگی پایدار Gemini؛ اجرای یکباره از یک پوشهٔ خانگی موقت و ایزوله استفاده میکند. |
| `OMNIROUTE_CHILD_SIGNAL_TIMEOUT_MS` | `5000` | `bin/cli/commands/run.mjs` | مهلت زمانی برحسب میلیثانیه پیش از خاتمهٔ اجباری فرایند فرزند CLI که سیگنال دریافت کرده است. |
| `OMNIROUTE_CLI_SKIP_DEFAULT_DATA_ENV` | _(تنظیمنشده)_ | `bin/omniroute.mjs` | با یک DATA_DIR صریح، آن را روی 1 تنظیم کنید تا فایل محیطی پیشفرض پوشهٔ دادهٔ کاربر نادیده گرفته شود. |
| `OMNIROUTE_SYNC_TOKEN` | _(تنظیمنشده)_ | `bin/cli/commands/sync.mjs` | توکن همگامسازی برای `omniroute sync bundle` (`GET /api/sync/bundle` فقط توکن همگامسازی را میپذیرد، نه کلید API). معادل `--token` است. |
| `OMNIROUTE_HTTP_TIMEOUT_MS` | `30000` | `bin/cli/api.mjs` | مهلت زمانی HTTP برای هر تلاش (میلیثانیه) در درخواستهای CLI ← سرور. |
| `OMNIROUTE_READY_TIMEOUT_MS` | `60000` | `bin/cli/utils/pid.mjs` | حداکثر زمانی (میلیثانیه) که CLI پیش از نمایش هشدار پایان مهلت، برای endpoint سلامت سرور منتظر میماند. برای راهاندازیهای اولیهٔ کُند مفید است (برای مثال Windows). از طریق `--ready-timeout` نیز قابل تنظیم است. |
| `OMNIROUTE_VERBOSE` | `0` | `bin/cli/api.mjs` | برای چاپ جزئیات عیبیابی تلاش مجدد/backoff در stderr هنگام اجرای فرمانهای CLI، روی `1` تنظیم کنید. |
| `OMNIROUTE_PLUGIN_PATH` | _(تنظیمنشده)_ | `bin/cli/plugins.mjs` | پوشهٔ سفارشی برای کشف پلاگینهای CLI (بستههای `omniroute-cmd-*`). در صورت تنظیمنشدن، مقدار پیشفرض `~/.omniroute/plugins/` است. فقط مختص CLI است — هرگز به اسکنر پلاگین سمت سرور نمیرسد؛ مسیر آن اسکنر با `OMNIROUTE_PLUGINS_DIR` تعیین میشود (بخش 2). |
| `OMNIROUTE_NO_UPDATE_NOTIFIER` | _(تنظیمنشده)_ | `bin/omniroute.mjs` | اگر روی هر مقدار غیرخالی تنظیم شود، اعلان بهروزرسانی CLI هنگام خروج فرایند را نمایش نمیدهد. این اعلان بهطور مستقل در CI، حالت بیصدا و حالتهای خروجی غیرمتنی نیز غیرفعال باقی میماند. |
| `OMNIROUTE_DOCTOR_LIVENESS_URL` | _(مشتقشده)_ | `bin/cli/commands/doctor.mjs` | URL زندهبودن که توسط `omniroute doctor` بررسی میشود. گزینهٔ برنامهنویسیشدهٔ `livenessUrl` اولویت دارد؛ در غیر این صورت، این مقدار عیناً استفاده میشود. اگر تنظیم نشده باشد، CLI، endpoint محلی `/api/health/degradation` داشبورد را استخراج میکند. |
| `OMNIROUTE_PROVIDER_CATALOG_PATH` | `src/shared/constants/providers/` | `bin/cli/provider-catalog.mjs` | مسیر کاتالوگ ارائهدهنده که توسط فرمانهای ارائهدهندهٔ CLI استفاده میشود. گزینهٔ برنامهنویسیشدهٔ `catalogPath` اولویت دارد. مسیرهای مطلق همانطور که هستند استفاده میشوند؛ مسیرهای نسبی از ریشهٔ پروژه resolve میشوند. اگر تنظیم نشده باشد، CLI از پوشهٔ ثابتهای ارائهدهنده استفاده میکند و فایل قدیمی `providers.ts` را بهعنوان fallback به کار میگیرد. |
| `OMNIROUTE_PROVIDER_TEST_MODEL` | _(پیشفرض ارائهدهنده)_ | `bin/cli/provider-test.mjs` | مدل fallback سراسری برای آزمونهای اتصال ارائهدهنده در CLI. ترتیب اولویت عبارت است از مدل اتصال پیکربندیشده، بازنویسی مدل مخصوص ارائهدهنده، این مقدار، و سپس مدل آزمایشی داخلی ارائهدهنده. |
---
## 10. یکپارچهسازیهای عامل داخلی و MCP
| متغیر | پیشفرض | فایل منبع | توضیحات |
| ----------------------------------------------- | --------------------------------------------------- | ----------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `OMNIROUTE_BASE_URL` | تشخیص خودکار | `open-sse/mcp-server/server.ts` | نشانی URL صریح برای دسترسی ابزارهای MCP/A2A به OmniRoute. تشخیص خودکار localhost را لغو میکند. |
| `OMNIROUTE_API_KEY` | _(تنظیمنشده)_ | ماژولهای MCP/A2A | کلید API برای فراخوانیهای ابزار داخلی MCP و مهارت A2A. |
| `OMNIROUTE_API_KEY_ID` | _(تنظیمنشده)_ | `open-sse/mcp-server/audit.ts` | شناسهٔ کلید برای انتساب گزارش ممیزی MCP. |
| `ROUTER_API_KEY` | _(تنظیمنشده)_ | قدیمی | نام مستعار قدیمی برای `OMNIROUTE_API_KEY`. |
| `OMNIROUTE_A2A_HISTORY_RETENTION_DAYS` | `30` | `src/lib/a2a/taskManager.ts` | تعداد روزهایی که تاریخچهٔ وظایف A2A پیش از حذف یک ردیف توسط پاکسازی روزانه در پایگاه دادهٔ محلی نگهداری میشود. در صورت تنظیمنبودن، غیرعددیبودن یا `<= 0` بودن، مقدار `30` استفاده میشود. |
| `OMNIROUTE_A2A_MEMORY_HITS` | `1` | `src/lib/a2a/taskExecution.ts` | کلید توقف اضطراری برای قابلیت مشاهدهپذیری اصابتهای حافظهٔ A2A. برای ردکردن کامل جستوجوی بازیابی حافظه برای یک وظیفه، آن را روی `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. به یک بیشینهٔ داخلی محدود میشود؛ در صورت تنظیمنبودن یا نامعتبر بودن، مقدار پیشفرض داخلی استفاده میشود. |
| `OMNIROUTE_CONTEXT` | _(زمینهٔ فعال)_ | `bin/cli/program.mjs`، `bin/cli/api.mjs` | زمینه/نمایهٔ حالت راهدور CLI برای فرمانهای `omniroute`؛ زمینهٔ فعال در مخزن محلی زمینهها را لغو میکند. معادل `--context ` است. |
| `OMNIROUTE_CONTEXT_KEYCHAIN_DISABLED` | `0` | `bin/cli/contexts.mjs` | پشتیبان اختیاری زنجیرهکلید سیستمعامل `keytar` را برای اعتبارنامههای زمینهٔ CLI غیرفعال میکند. وقتی فعال باشد، اعتبارنامهها در `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 (سلامت، تابآوری، ترکیبها، سهمیه، میزان استفاده). |
| `OMNIROUTE_MCP_UPSTREAM_TIMEOUT_MS` | `60000` | `open-sse/mcp-server/fetchTimeout.ts` | مهلت لغو (میلیثانیه) برای پرشهای MCP که منتظر یک ارائهدهنده میمانند (`route_request`، `web_search`، `web_fetch`). |
| `OMNIROUTE_CORPUS_CACHE_SIZE` | `5` | `src/lib/localCorpus/configured.ts` | حداکثر تعداد نمونههای ایندکس پیکرهٔ محلی که در حافظه نهان ذخیره میشوند (LRU، یکی برای هر دایرکتوری ریشهٔ ایندکسشده). حداقل مقدار آن به `1` محدود میشود. |
| `MODEL_SYNC_INTERVAL_HOURS` | `6` | `src/shared/services/modelSyncScheduler.ts` | فاصلهٔ همگامسازی کاتالوگ مدلها بر حسب ساعت. |
| `PROVIDER_LIMITS_SYNC_INTERVAL_MINUTES` | `70` | `src/lib/usage/providerLimits.ts` | فاصلهٔ زمانی نظرسنجی محدودیت نرخ و سهمیهٔ ارائهدهنده. |
| `PROVIDER_LIMITS_SYNC_SPACING_MS` | `1500` | `src/lib/usage/providerLimits.ts` | فاصله (میلیثانیه) بین دریافتهای متوالی سهمیهٔ OAuth در یک همگامسازی انبوه؛ اتصالهای OAuth یکییکی دریافت میشوند تا از ارسال ناگهانی درخواستهای زیاد به سرویس بالادستی جلوگیری شود. مقدار `0` این رفتار را غیرفعال میکند (همزمان). |
| `OMNIROUTE_QUOTA_FETCH_MIN_INTERVAL_MS` | `250` | `open-sse/services/quotaFetchThrottle.ts` | حداقل فاصله (میلیثانیه) بین دریافتهای متوالی سهمیه از سرویس بالادستی در مسیر پیشبررسی/نظارت هر درخواست؛ فراخوانیهای همزمان شبکه را با فاصله انجام میدهد تا حسابهای متعدد روی یک IP بهطور ناگهانی درخواستهای زیادی به سرویس بالادستی ارسال نکنند. به دریافتکنندههای سهمیهٔ Codex (`/wham/usage`)، DeepSeek، Bailian (هر دو محل دریافت)، OpenCode و Crof متصل شده است (#6009، #6911). مسیر عمومی توزیع `usage.ts::getUsageForProvider` (github/glm/minimax/nanogpt/xai/etc.) هنوز پوشش داده نشده است — بهصورت جداگانه پیگیری میشود. اصابتهای حافظه نهان تحت تأثیر قرار نمیگیرند. `0` آن را غیرفعال میکند؛ به بازهٔ `0..5000` محدود میشود. |
| `PROVIDER_LIMITS_POST_USAGE_REFRESH_DELAY_MS` | `5000` | `src/lib/usage/providerLimits.ts` | تأخیر (میلیثانیه) پیش از تازهسازی محدودیتهای ارائهدهنده پس از یک رویداد مصرف واقعی، تا API سهمیهٔ بالادستی فرصت ثبت مصرف را داشته باشد. |
| `OMNIROUTE_LOGIN_BROWSER_PATH` | تشخیص خودکار | `open-sse/services/adobeFireflyBrowserLogin.ts` | مسیر مطلق فایل اجرایی Chrome یا Edge سیستم که برای ورود تعاملی به Adobe Firefly و تمدید خارج از صفحه استفاده میشود. |
| `ADOBE_FIREFLY_BROWSER_REFRESH` | فعال | `open-sse/services/adobeFireflySession.ts` | وضعیت IMS و ریسک مرورگر را با نشستهای Chrome CDP مختص هر حساب تازه نگه میدارد. برای غیرفعالکردن تمدید مرورگر، آن را روی `0` تنظیم کنید. |
| `ADOBE_FIREFLY_SESSION_DISK` | فعال | `open-sse/services/adobeFireflySession.ts` | نشستهای ترمیمشدهٔ Adobe را در `DATA_DIR` ذخیره میکند تا پس از راهاندازی مجدد فرایند نیز باقی بمانند. برای نگهداشتن نشستها فقط در حافظه، آن را روی `0` تنظیم کنید. |
| `ADOBE_FIREFLY_MIN_SUBMIT_GAP_MS` | `12000` | `open-sse/services/adobeFireflySession.ts` | حداقل فاصله بر حسب میلیثانیه بین ارسالهای تولید Adobe Firefly؛ مقدار `0` این فاصلهگذاری را غیرفعال میکند. |
| `ADOBE_FIREFLY_BATCH_EXTRA_GAP_MS` | `15000` | `open-sse/services/adobeFireflySession.ts` | دورهٔ سکون اضافی بر حسب میلیثانیه پس از هر سومین ارسال موفق به Adobe. |
| `ADOBE_FIREFLY_SUBMIT_BASE_DELAY_MS` | `8000` | `open-sse/services/adobeFireflyClient.ts` | زمان پایهٔ عقبنشینی بر حسب میلیثانیه پس از پاسخهای موقتی 408 از Adobe؛ در حداکثر پنج تلاش با فاصلهگذاری ارسال ترکیب میشود. |
| `OMNIROUTE_DISABLE_BACKGROUND_SERVICES` | `false` | `src/instrumentation-node.ts` | همهٔ سرویسهای پسزمینه (همگامسازی، قیمتگذاری، تازهسازی مدل) را غیرفعال میکند. برای CI/آزمون مفید است. |
| `OMNIROUTE_HEADLESS` | _(تنظیمنشده)_ | `src/lib/system/headless.ts` | راهاندازی فقط با موتور پراکسی: زیرسامانههای اختیاری را نادیده میگیرد، `/dashboard` ← 404. معادل `omniroute serve --headless` است. [HEADLESS.md](../guides/HEADLESS.md) را ببینید. |
| `OMNIROUTE_ENABLE_RUNTIME_BACKGROUND_TASKS` | _(تنظیمنشده)_ | `src/lib/config/runtimeSettings.ts` | وظایف پسزمینه را هنگام تشخیص آزمون خودکار بهاجبار فعال میکند. برای نادیدهگرفتن روش اکتشافی آزمون، مقدار `1` را تنظیم کنید. |
| `OMNIROUTE_BUDGET_RESET_JOB_INTERVAL_MS` | `600000` | `src/lib/jobs/budgetResetJob.ts` | تناوب بررسی بازنشانی بودجه (میلیثانیه). حداقل `10000`. |
| `OMNIROUTE_CONNECTION_RECOVERY_INTERVAL_MS` | `60000` | `src/lib/quota/connectionRecovery.ts` | تناوب بازیابی پیشدستانه پس از وقفهٔ اتصال (میلیثانیه): اتصالهایی را که زمان `rate_limited_until` موقت آنها سپری شده است، خارج از مسیر پرترافیک درخواست دوباره اعتبارسنجی میکند. حداقل `5000`. |
| `OMNIROUTE_DISABLE_CONNECTION_RECOVERY` | `false` | `src/lib/quota/connectionRecovery.ts` | زمانبند بازیابی پیشدستانه پس از وقفهٔ اتصال را غیرفعال میکند (بازیابی تنبل در `getProviderCredentials` همچنان اعمال میشود). |
| `OMNIROUTE_REASONING_CACHE_CLEANUP_INTERVAL_MS` | `1800000` | `src/lib/jobs/reasoningCacheCleanupJob.ts` | تناوب پاکسازی حافظهٔ نهان استدلال (میلیثانیه). حداقل `60000`. |
| `OMNIROUTE_REASONING_MIN_BUDGET` | _تنظیمنشده_ (غیرفعال) | `open-sse/services/reasoningTokenBuffer.ts` | حداقل اختیاری برای بودجهٔ خروجی مدلهای متفکر: مقدار `max_tokens` فراخوان در بازهٔ `[256, floor)` تا حداقل افزایش مییابد (با رعایت سقف خروجی مدل). تنظیمنشده = بودجههای کلاینت هرگز افزایش نمییابند (#9507). |
| `OMNIROUTE_REASONING_EFFORT_PROBE_PROVIDERS` | _تنظیمنشده_ (غیرفعال) | `open-sse/services/learnedReasoningEffortCaps.ts` | شناسههای ارائهدهندهٔ اختیاری و جداشده با ویرگول (یا `*`): هنگامی که خطای 400/422 مربوط به `reasoning_effort` هیچ مجموعهٔ پذیرفتهشدهای را مشخص نمیکند، یک بار با سطحی پایینتر دوباره تلاش میکند (هرگز پایینتر از `low` نمیرود) و تنها در صورتی آن سطح را یاد میگیرد که کاوش پاسخ دریافت کند (#14895). |
| `OMNIROUTE_LOG_EXPORT_CRON` | `0 * * * *` | `src/lib/jobs/logExportJob.ts` | عبارت Cron (برحسب UTC) برای کار صدور گزارش تماس که همهٔ مقصدهای فعال صدور گزارش را تخلیه میکند. |
| `OMNIROUTE_CONFIG_HOT_RELOAD_MS` | `5000` | `src/lib/config/hotReload.ts` | فاصلهٔ نظرسنجی (میلیثانیه) برای بارگذاری مجدد پویای پیکربندی. مقادیر کمتر از `1000` رد میشوند. |
| `OMNIROUTE_DISABLE_REDIS_AUTH_CACHE` | _(فعال)_ | `src/lib/db/apiKeys.ts` | برای دور زدن حافظهٔ نهان احراز هویت کلید API مبتنی بر Redis، مقدار را روی `1` تنظیم کنید (خواندن از پایگاه داده را اجباری میکند). |
| `OMNIROUTE_RTK_TRUST_PROJECT_FILTERS` | `0` | `open-sse/services/compression/engines/rtk/filterLoader.ts` | اعتماد به قوانین فیلتر پروژهٔ RTK که توسط کاربر مدیریت میشوند، بدون بررسیهای سختگیرانهٔ امضا. |
| `OMNIROUTE_LITE_MAX_TOOL_LENGTH` | `2000` | `open-sse/services/compression/lite.ts` | سقف تعداد نویسه برای کوتاهسازی پیشدستانهٔ نتیجهٔ ابزار Lite، هنگامی که `lite.maxToolLength` تنظیم نشده است. بازهٔ 256–1000000. تنظیم داشبورد بر این متغیر محیطی اولویت دارد. |
| `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` | مهلت زمانی هر کار برحسب میلیثانیه. کارگرهایی که مهلتشان به پایان برسد خاتمه مییابند و درخواست بدون تغییر بهصورت fail-open ادامه مییابد. |
| `OMNI_COMPRESSION_WORKER_IDLE_MS` | `60000` | `open-sse/services/compression/compressionWorkerPool.ts` | مدت بیکاری برحسب میلیثانیه، پیش از خاتمهٔ یک کارگر فشردهسازی بلااستفاده. |
| `OMNI_COMPRESSION_WORKER_MAX_OLD_MB` | `1024` | `open-sse/services/compression/compressionWorkerPool.ts` | سقف heap نسل قدیمی V8 برحسب MB برای هر کارگر فشردهسازی، در همهٔ حالتها (حداقل `128`). کاری که از این مقدار فراتر رود، بهجای افزایش heap درگاه، بهصورت fail-open (فشردهنشده) ادامه مییابد. |
| `COMPRESSION_PIPELINE_BREAKER_ENABLED` | `false` | `open-sse/services/compression/pipelineEngineBreaker.ts` | کلید اصلی قطعکنندهٔ مدارِ هر موتور برای خط لولهٔ پشتهای T02. **اختیاری (بهطور پیشفرض خاموش)** — هنگام روشن بودن، موتوری که در درخواستهای مختلف مکرراً خطا ایجاد کند، برای یک دورهٔ خنکشدن نادیده گرفته میشود (fail-open)؛ خاموش = رفتار قدیمی کاملاً یکسان در سطح بایت. |
| `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` | افزایش تدریجی بازخورد بازیابی CCR در T08/H8: هر بازیابی پیشین یک بلوک ذخیرهشده، `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` | مسیر فایل توکن CLI مربوط به Antigravity (agy) را برای وارد کردن خودکار ورود محلیِ شناساییشده بازنویسی میکند. |
### پل OAuth برای CLI (داخلی)
| متغیر | پیشفرض | فایل منبع | توضیحات |
| ------------------- | -------------- | ------------------------------- | ------------------------------------------ |
| `OMNIROUTE_SERVER` | شناسایی خودکار | `src/lib/oauth/config/index.ts` | URL سرور برای پل احراز هویت CLI↔OmniRoute. |
| `OMNIROUTE_TOKEN` | _(تنظیمنشده)_ | `src/lib/oauth/config/index.ts` | توکن احراز هویت برای پل CLI. |
| `OMNIROUTE_USER_ID` | `cli` | `src/lib/oauth/config/index.ts` | شناسهٔ کاربر برای نشستهای پل CLI. |
| `SERVER_URL` | _(تنظیمنشده)_ | `src/lib/oauth/config/index.ts` | نام مستعار قدیمی برای `OMNIROUTE_SERVER`. |
| `CLI_TOKEN` | _(تنظیمنشده)_ | `src/lib/oauth/config/index.ts` | نام مستعار قدیمی برای `OMNIROUTE_TOKEN`. |
| `CLI_USER_ID` | _(تنظیمنشده)_ | `src/lib/oauth/config/index.ts` | نام مستعار قدیمی برای `OMNIROUTE_USER_ID`. |
---
## 11. OAuth Provider Credentials
اعتبارنامههای داخلی برای **توسعه لوکالهاست**. برای استقرارهای راه دور، اعتبارنامههای خود را در کنسول توسعهدهنده هر ارائهدهنده ثبت کنید.
| متغیر | ارائهدهنده | توضیحات |
| :------------------------------------------ | :---------------------- | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `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) | بازنویسی اختیاری برای شناسه کلاینت جریان دستگاه (device-flow) عمومی Muse CLI. برای استفاده از کلاینت عمومی داخلی، آن را تنظیم نشده بگذارید. |
| `ANTIGRAVITY_OAUTH_CLIENT_ID` | Antigravity (Google) | نیاز به `_SECRET` متناظر دارد. |
| `ANTIGRAVITY_OAUTH_CLIENT_SECRET` | Antigravity (Google) | — |
| `GITHUB_OAUTH_CLIENT_ID` | GitHub Copilot | کلاینت عمومی. |
| `GHE_COPILOT_OAUTH_CLIENT_ID` | GHE Copilot | بازنویسی اختیاری برای شناسه کلاینت OAuth گیتهاب انترپرایز کوپایلوت. در صورت تنظیم نشدن، به پیشفرض عمومی `GITHUB_OAUTH_CLIENT_ID` بازمیگردد. |
| `COPILOT_INTEGRATION_ID` | GitHub Copilot | بازنویسی اختیاری برای شناسه یکپارچهسازی کلاینت گیتهاب کوپایلوت که در هدرهای `Copilot-Integration-Id` و `Editor-Plugin-Version` ارسال میشود. پیشفرض آن `copilot-developer-cli` است. |
| `WINDSURF_API_KEY` | Windsurf / Devin (v3.8) | کلید API جایگزین که توسط `open-sse/executors/devin-cli.ts` در صورت عدم وجود اعتبارنامه به ازای هر اتصال استفاده میشود. اختیاری. |
| `CLI_DEVIN_BIN` | Devin CLI (v3.8) | مسیر سفارشی به باینری Devin CLI (`devin`). توسط `open-sse/executors/devin-cli.ts` حل میشود. |
| `GITLAB_DUO_OAUTH_CLIENT_ID` | GitLab Duo (v3.8) | شناسه کلاینت OAuth برای GitLab Duo. یک برنامه را در `https://gitlab.com/-/profile/applications` با URI تغییر مسیر `/callback` و اسکوپهای `api, read_user, openid, profile, email` ثبت کنید. در صورت عدم تنظیم، به `GITLAB_OAUTH_CLIENT_ID` بازمیگردد. |
| `GITLAB_DUO_OAUTH_CLIENT_SECRET` | GitLab Duo (v3.8) | رمز کلاینت OAuth برای GitLab Duo. اختیاری — جریان PKCE نیازی به رمز ندارد. در صورت عدم تنظیم، به `GITLAB_OAUTH_CLIENT_SECRET` بازمیگردد. |
| `GITLAB_DUO_BASE_URL` | GitLab Duo (v3.8) | بازنویسی URL پایه GitLab (GitLab خودمیزبان). پیشفرض آن `https://gitlab.com` است. در صورت عدم تنظیم، به `GITLAB_BASE_URL` بازمیگردد. |
| `GITLAB_BASE_URL` | GitLab Duo (v3.8) | جایگزین قدیمی برای `GITLAB_DUO_BASE_URL`. زمانی استفاده میشود که نوع `_DUO_` تنظیم نشده باشد. |
| `GITLAB_OAUTH_CLIENT_ID` | GitLab Duo (v3.8) | جایگزین قدیمی برای `GITLAB_DUO_OAUTH_CLIENT_ID` که توسط `src/lib/oauth/constants/oauth.ts` مصرف میشود. |
| `GITLAB_OAUTH_CLIENT_SECRET` | GitLab Duo (v3.8) | جایگزین قدیمی برای `GITLAB_DUO_OAUTH_CLIENT_SECRET` که توسط `src/lib/oauth/constants/oauth.ts` مصرف میشود. |
| `QODER_OAUTH_CLIENT_SECRET` | Qoder | — |
| `QODER_OAUTH_AUTHORIZE_URL` | Qoder | برای فعال کردن `Qoder OAuth` تنظیم شود. |
| `QODER_OAUTH_TOKEN_URL` | Qoder | — |
| `QODER_OAUTH_USERINFO_URL` | Qoder | — |
| `QODER_OAUTH_CLIENT_ID` | Qoder | — |
| `QODER_PERSONAL_ACCESS_TOKEN` | Qoder | جایگزین مستقیم کلید `API` (از `OAuth` عبور میکند). |
| `QODER_CLI_WORKSPACE` | Qoder | شناسه فضای کاری برای `Qoder CLI`. |
| `OMNIROUTE_QODER_WORKSPACE` | Qoder | نام مستعار برای `QODER_CLI_WORKSPACE`. |
| `QODER_CLI_CONFIG_DIR` | Qoder | دایرکتوری پیکربندی `Qoder CLI` را بازنویسی میکند (نشست `PAT` ایزوله، از تداخل با ورود به مرورگر جلوگیری میکند). |
| `BLACKBOX_WEB_VALIDATED_TOKEN` | Blackbox Web | توکن `tk` فرانتاند برای ارسال به عنوان `validated` در `/api/chat`. زمانی که `Blackbox` تطابق توکن را اجباری میکند، مورد نیاز است؛ در غیر این صورت `OmniRoute` به یک `UUID` تصادفی بازمیگردد. به `issue #2252` مراجعه کنید. |
| `VISION_BRIDGE_BASE_URL` | Vision Bridge guardrail | `URL` پایه سازگار با `OpenAI` برای فراخوانیهای `vision-bridge` غیر `Anthropic`. به طور پیشفرض از `URL` قدیمی `OpenAI` یا `api.openai.com` استفاده میکند. به `self-loop /v1` مربوط به `OmniRoute` یا هر نقطه پایانی سازگار با `OpenAI` (مانند `Gemini OpenAI-compat`, `OpenRouter`) اشاره کنید. `Issue #2232`. هنگامی که `URL`، `v1/` خود `OmniRoute` باشد، درخواست فرعی `describe`، `x-omniroute-admission-bypass: internal` را ارسال میکند و با اعتبارنامه `self-loop` حل شده (نشانگر `sk_omniroute` در حالت محلی، یا `OMNIROUTE_API_KEY` / `ROUTER_API_KEY` — ` #1350`) احراز هویت میکند تا استقرارهای `REQUIRE_API_KEY=true` کار کنند. |
| `VISION_BRIDGE_API_KEY` | Vision Bridge guardrail | کلید `API` برای `URL` بالا. متغیرهای محیطی `OpenAI` / `Google` را برای هر ارائهدهنده در فراخوانیهای `vision-bridge` غیر `Anthropic` بازنویسی میکند. مدلهای `Anthropic` مسیر کلید اختصاصی `Anthropic` خود را حفظ میکنند. `Issue #2232`. |
| `OMNIROUTE_VISION_BRIDGE_NEGATIVE_CACHE_MS` | Vision Bridge guardrail | مدت زمانی که نتیجه مسیریابی "نامزد قابل استفادهای وجود ندارد" در حافظه پنهان نگهداری میشود، بر حسب میلیثانیه (`ms`) (پیشفرض `30000`). مقادیر نامعتبر یا منفی به پیشفرض بازمیگردند؛ `0` حافظه پنهان منفی را غیرفعال میکند. منبع: `src/lib/guardrails/visionBridgeRouter.ts`. |
> [!هشدار]
>
> 1. به [Google Cloud Console → Credentials](https://console.cloud.google.com/apis/credentials) بروید.
> 2. یک `OAuth 2.0 Client ID` (نوع: "برنامه وب") ایجاد کنید.
> 3. `URL` سرور خود را به عنوان `Authorized redirect URI` اضافه کنید.
> 4. مقادیر اعتبارنامه را در `.env` جایگزین کنید.
---
## 12. بازنویسیهای User-Agent ارائهدهنده
هدر `User-Agent` ارسالشده به هر ارائهدهنده بالادستی را بازنویسی کنید. این مقدار در زمان اجرا بهصورت پویا توسط کلاس پایه executor تعیین میشود:
```
process.env[`${PROVIDER_ID}_USER_AGENT`]
```
> **منبع:** `open-sse/executors/base.ts` → `buildHeaders()`
| متغیر | مقدار پیشفرض | زمان بهروزرسانی |
| -------------------------------- | --------------------------------------------- | ------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| `CLAUDE_USER_AGENT` | `claude-cli/2.1.280 (external, cli)` | هنگامی که Anthropic نسخه جدیدی از CLI منتشر میکند |
| `CLAUDE_DISABLE_TOOL_NAME_CLOAK` | `false` | `executors/base.ts` + `executors/cliproxyapi.ts` | برای ارسال بدون تغییر نام ابزارهای harness شخص ثالث به Anthropic در هر دو مسیر منتهی به Anthropic (OAuth بومی و CLIProxyAPI)، آن را روی `1`/`true` تنظیم کنید. بهطور پیشفرض، executor بهصورت قطعی برای نام ابزارهایی که متعلق به Claude Code نیستند نام مستعار تعیین میکند (در صورت وجود، نگاشت استاندارد Claude Code؛ در غیر این صورت PascalCase) و در پاسخ با استفاده از `_toolNameMap` آنها را به حالت اصلی بازمیگرداند؛ بنابراین harnessهایی با ابزارهای snake_case بهدلیل شناسایی بهعنوان کلاینتهای شخص ثالث رد نمیشوند. فقط برای اشکالزدایی. |
| `CODEX_USER_AGENT` | `codex-cli/0.155.0 (Windows 10.0.26200; x64)` | هنگامی که OpenAI، Codex CLI را بهروزرسانی میکند |
| `CODEX_CLIENT_VERSION` | `0.155.0` | بازنویسی نسخه کلاینت Codex مستقل از رشته کامل UA |
| `CLAUDE_CODE_CLIENT_VERSION` | `2.1.280` | بازنویسی نسخه اعلامشده Claude Code مستقل از `CLAUDE_USER_AGENT`. دسترسی به برخی مدلها در Anthropic بر اساس این مقدار کنترل میشود (#12417). |
| `CLAUDE_CODE_CLIENT_BUILD_REVISION` | `1e2` | بازنویسی پسوند ۳ نویسهای که OmniRoute در بلوک صورتحساب Claude به `cc_version=` اضافه میکند. این مقدار را همراه با `CLAUDE_CODE_CLIENT_VERSION` افزایش دهید — ثابت نگهداشتن صرفاً نسخه باعث اعلام جفت `version.revision`ای میشود که هیچ باینری واقعی تولید نمیکند. |
| `GITHUB_COPILOT_CLI_VERSION` | `1.0.91` | بازنویسی نسخه اعلامشده Copilot CLI مستقل از `GITHUB_USER_AGENT` |
| `GITHUB_USER_AGENT` | `GitHubCopilotChat/0.54.0` | هنگامی که GitHub Copilot Chat بهروزرسانی میشود |
| `ANTIGRAVITY_USER_AGENT` | `antigravity/2.0.1 darwin/arm64` | هنگامی که Antigravity IDE بهروزرسانی میشود |
| `KIRO_USER_AGENT` | `AWS-SDK-JS/3.0.0 kiro-ide/1.0.0` | هنگامی که Kiro IDE بهروزرسانی میشود |
| `KIRO_OAUTH_CLIENT_ID` | `kiro-cli` | بازنویسی `clientId` (شناسه عمومی) کد دستگاه اجتماعی Kiro |
| `KIRO_VERIFY_FULL_CRC` | `false` | انتخاب اختیاری: اعتبارسنجی کامل CRC برای هر فریم در جریان رویداد Kiro (برای اشکالزدایی جریانهای خراب) |
| `QODER_USER_AGENT` | `Qoder-Cli` | هنگامی که Qoder CLI بهروزرسانی میشود |
| `CURSOR_USER_AGENT` | `Cursor/3.3` | هنگامی که Cursor بهروزرسانی میشود |
> [!TIP]
> میتوانید با استفاده از الگوی `{PROVIDER_ID}_USER_AGENT`، بازنویسیهای User-Agent را برای **هر** ارائهدهندهای اضافه کنید. executor نام متغیر محیطی را بهصورت پویا میسازد.
---
## ۱۳. سازگاری اثر انگشت CLI
در صورت فعالسازی، OmniRoute ترتیب هدرهای HTTP و فیلدهای بدنه JSON را تغییر میدهد تا دقیقاً با امضای ابزارهای رسمی CLI مطابقت داشته باشد. این کار ضمن حفظ IP پروکسی شما، خطر علامتگذاری حساب را کاهش میدهد.
**منبع:** `open-sse/config/cliFingerprints.ts`، `open-sse/executors/base.ts`
### بهازای هر ارائهدهنده
| متغیر | فعالسازی | تأثیر |
| ------------------------ | -------- | ------------------------------------------- |
| `CLI_COMPAT_CODEX` | `=1` | امضای درخواست Codex CLI را تقلید میکند |
| `CLI_COMPAT_CLAUDE` | `=1` | امضای درخواست Claude Code را تقلید میکند |
| `CLI_COMPAT_GITHUB` | `=1` | امضای درخواست GitHub Copilot را تقلید میکند |
| `CLI_COMPAT_ANTIGRAVITY` | `=1` | امضای درخواست Antigravity را تقلید میکند |
| `CLI_COMPAT_CURSOR` | `=1` | امضای درخواست Cursor را تقلید میکند |
| `CLI_COMPAT_KIMI_CODING` | `=1` | امضای درخواست Kimi Coding را تقلید میکند |
| `CLI_COMPAT_KILOCODE` | `=1` | امضای درخواست Kilo Code را تقلید میکند |
| `CLI_COMPAT_CLINE` | `=1` | امضای درخواست Cline را تقلید میکند |
### سراسری
| متغیر | فعالسازی | تأثیر |
| ---------------- | -------- | ----------------------------------------------------------------------- |
| `CLI_COMPAT_ALL` | `=1` | سازگاری اثر انگشت را بهطور همزمان برای **همه** ارائهدهندگان فعال میکند. |
### بازنویسیهای هویت Kimi Coding CLI
| متغیر | مقدار پیشفرض | فایل منبع | توضیحات |
| ----------------------- | ----------------------- | ---------------------------------------- | -------------------------------------------------------------------------- |
| `KIMI_CLI_VERSION` | `1.36.0` | `src/lib/oauth/providers/kimi-coding.ts` | نسخه Kimi CLI ارسالشده هنگام فراخوانیهای OAuth/API را بازنویسی میکند. |
| `KIMI_CODING_DEVICE_ID` | _(مقدار پیشفرض ثبتشده)_ | `src/lib/oauth/providers/kimi-coding.ts` | شناسه دستگاه Kimi ثبتشده و مورداستفاده در هدرهای کلاینت را بازنویسی میکند. |
> [!NOTE]
> این قابلیت در کنار بازنویسیهای User-Agent (§۱۲) کار میکند. سامانه اثر انگشت ترتیب هدرها و فیلدهای بدنه را مدیریت میکند، درحالیکه بازنویسیهای User-Agent رشته مشخص UA را مدیریت میکنند. هر دو را میتوان بهطور مستقل فعال کرد.
---
## ۱۴. ارائهدهندگان کلید 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) برای embeddingها + روش جایگزین چت |
| `GOOGLE_API_KEY` | Gemini (نام مستعار `GEMINI_API_KEY`) |
> [!NOTE]
> ورودیهای ایستای `${PROVIDER}_API_KEY` برای Groq، xAI، Mistral، Perplexity، Together AI، Fireworks، Cerebras، Cohere، Nebius و Qianfan در v3.8.0 حذف شدند، زیرا محیط اجرا دیگر آنها را نمیخواند — این ارائهدهندگان منحصراً به داشبورد / `data/provider-credentials.json` / پایگاه داده رمزگذاریشده متکی هستند. برای مسیر مهاجرت، بخش _ممیزی: متغیرهای حذفشده / بلااستفاده_ را در انتهای این سند ببینید.
> [!TIP]
> کلیدهایی که از طریق داشبورد تنظیم میشوند، بهصورت رمزگذاریشده در SQLite ذخیره شده و بر متغیرهای محیطی اولویت دارند.
>
> **Jina:** embedding، rerank، classify، segment و `jina-search` متعلق به `jina-ai/…`، هنگامی که یک اتصال `jina-ai` (یا `jina-reader` مشترک) در داشبورد وجود داشته باشد، هزینهای به کلید محیطی کلاستر تحمیل **نمیکنند** — `getProviderCredentials` بر اساس اصل «ابتدا تکمیل» عمل میکند. `JINA_AI_API_KEY` / `JINA_API_KEY` فقط زمانی استفاده میشوند که هیچ کلید قابلاستفادهای در داشبورد وجود نداشته باشد. گزارشهای فراخوانی، روش جایگزین محیطی را با `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` فقط زمانی استفاده میشوند که هیچ کلید قابلاستفادهای در داشبورد وجود نداشته باشد. گزارشهای فراخوانی، روش جایگزین محیطی را با `connection_id=env:GEMINI_API_KEY` ثبت میکنند. ترافیک چندوجهی بومی از `x-goog-api-key` برای دسترسی به `:embedContent` / `:batchEmbedContents` استفاده میکند — N مورد OpenAI در `input` به N بردار تبدیل میشوند.
---
## ۱۵. تنظیمات مهلت زمانی
تمام مقادیر بر حسب **میلیثانیه** هستند. تفکیک متمرکز مقادیر در `src/shared/utils/runtimeTimeouts.ts` انجام میشود.
### سلسلهمراتب مهلتهای زمانی
```
REQUEST_TIMEOUT_MS (بازنویسی سراسری)
├─→ FETCH_TIMEOUT_MS (فراخوانیهای ارائهدهنده بالادستی، پیشفرض: 600000)
│ ├─→ FETCH_HEADERS_TIMEOUT_MS (از FETCH_TIMEOUT_MS به ارث میبرد)
│ ├─→ FETCH_BODY_TIMEOUT_MS (از FETCH_TIMEOUT_MS به ارث میبرد)
│ ├─→ TLS_CLIENT_TIMEOUT_MS (از FETCH_TIMEOUT_MS به ارث میبرد)
│ │ └── TLS_FIRST_BYTE_WATCHDOG_MS (مستقل، پیشفرض: 10000)
│ ├── RESPONSES_FIRST_BYTE_TIMEOUT_MS (مستقل، پیشفرض: 15000)
│ ├── OPENCODE_RESPONSES_HEADERS_WAIT_MS (مستقل، پیشفرض: 0 = غیرفعال، پیشنهادشده: 30000)
│ ├── OPENCODE_RESPONSES_HEADERS_WAIT_MAX_ROTATIONS (مستقل، پیشفرض: 2)
│ ├── FETCH_CONNECT_TIMEOUT_MS (مستقل، پیشفرض: 30000)
│ └── FETCH_KEEPALIVE_TIMEOUT_MS (مستقل، پیشفرض: 4000)
├─→ STREAM_IDLE_TIMEOUT_MS (از REQUEST_TIMEOUT_MS به ارث میبرد، پیشفرض: 600000)
├─→ STREAM_ACTIVE_TIMEOUT_MS (مستقل، پیشفرض: 1260000؛ مقدار 0 آن را غیرفعال میکند)
├─→ STREAM_READINESS_TIMEOUT_MS (از REQUEST_TIMEOUT_MS به ارث میبرد، پیشفرض: 80000)
├─→ STREAM_READINESS_MAX_TIMEOUT_MS (افزایشهای تطبیقی آمادگی را محدود میکند، پیشفرض: 180000)
└─→ API_BRIDGE_PROXY_TIMEOUT_MS (از REQUEST_TIMEOUT_MS به ارث میبرد، پیشفرض: 30000)
├─→ API_BRIDGE_SERVER_REQUEST_TIMEOUT_MS (مشتقشده، پیشفرض: 300000)
├── API_BRIDGE_SERVER_HEADERS_TIMEOUT_MS (پیشفرض: 60000)
├── API_BRIDGE_SERVER_KEEPALIVE_TIMEOUT_MS (پیشفرض: 5000)
└── API_BRIDGE_SERVER_SOCKET_TIMEOUT_MS (پیشفرض: 0 = غیرفعال)
```
| متغیر | پیشفرض | توضیحات |
| ----------------------------------------------- | ----------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `REQUEST_TIMEOUT_MS` | _(تنظیمنشده)_ | میانبُر سراسری — مقادیر پیشفرض `FETCH_TIMEOUT_MS` و `STREAM_IDLE_TIMEOUT_MS` را بازنویسی میکند. |
| `FETCH_TIMEOUT_MS` | `600000` | مهلت زمانی کل درخواست HTTP برای فراخوانیهای ارائهدهنده بالادستی. |
| `STREAM_IDLE_TIMEOUT_MS` | `600000` | حداکثر سکوت بین بایتهای خام بالادستی پیش از لغو. مدلهای دارای تفکر توسعهیافته بهندرت بیش از 90 ثانیه مکث میکنند. |
| `STREAM_ACTIVE_TIMEOUT_MS` | `1260000` | حداکثر طول عمر کلی جریان فعال SSE؛ با دریافت بایتهای بالادستی هرگز بازنشانی نمیشود و مستقل از `REQUEST_TIMEOUT_MS` است. این مقدار از بزرگترین `timeoutMs` مختص هر مدل در رجیستری (1200000، Codex) بهعلاوه حاشیه 60000 بهدست آمده است، تا مدلی که اجازه دارد از کل بودجه زمانی خود استفاده کند هرگز در میانه پاسخ متوقف نشود. برای غیرفعالسازی، آن را روی `0` تنظیم کنید. |
| `OMNIROUTE_SSE_COMMENTS` | _(غیرفعال)_ | مشخص میکند که آیا OmniRoute میتواند خطوط توضیحی `:` در SSE منتشر کند یا خیر (برای مثال، ضربان `: keepalive` و تریلرهای فراداده `x-omniroute-*`). بهطور پیشفرض غیرفعال است (#10524)، زیرا کلاینتهای کاملاً سازگار با OpenAI هر خط SSE را با JSON.parse پردازش میکنند و در مواجهه با توضیحات `:` از کار میافتند؛ ضربانهای `data:` تحت تأثیر قرار نمیگیرند. برای فعالسازی مجدد، آن را روی `on`/`true`/`1`/`yes` تنظیم کنید. در `open-sse/utils/sseHeartbeat.ts` استفاده میشود. |
| `SSE_COALESCE_MS` | `0` (خاموش) | انتخابی: رویدادهای متوالی `content_block_delta` از Claude (با شاخص بلوک و نوع دلتا یکسان) را که به کلاینتهای Claude ارسال میشوند ادغام میکند و دستکم هر N میلیثانیه تخلیه انجام میدهد. بدون اتلاف است؛ `signature_delta` و رویدادهای مرزی هرگز ادغام نمیشوند. برای همه انواع دلتا اعمال میشود، مگر اینکه یکی از متغیرهای مختص نوع در زیر تنظیم شده باشد. در `open-sse/utils/sseDeltaCoalesce.ts` استفاده میشود. |
| `SSE_COALESCE_THINKING_MS` | `0` (خاموش) | بازنویسی مختص نوعِ `SSE_COALESCE_MS` برای `thinking_delta`. |
| `SSE_COALESCE_TEXT_MS` | `0` (خاموش) | بازنویسی مختص نوعِ `SSE_COALESCE_MS` برای `text_delta`. |
| `SSE_COALESCE_INPUT_JSON_MS` | `0` (خاموش) | بازنویسی مختص نوعِ `SSE_COALESCE_MS` برای `input_json_delta`. |
| `SSE_FRAME_COALESCE_MS` | `0` (خاموش) | انتخابی: فریمهای SSE که طی N میلیثانیه ارسال میشوند را برای نوشتن یکباره در کلاینت دستهبندی میکند. نخستین فریم و فریمهای پایانی (`[DONE]`، `message_stop`، `error`، `response.completed`/`failed`/`incomplete`) هرگز به تأخیر نمیافتند؛ وقتی دستهبندی فعال باشد، ITL فاصله میان دستهها را اندازهگیری میکند. در `open-sse/utils/sseOutputSink.ts` استفاده میشود. |
| `SSE_STALL_WATCHDOG` | `timer` | پیادهسازی ناظر توقف بایت برای پاسخهای جریانی. `timer` برای هر قطعه بالادستی یک تایمر را دوباره فعال میکند (دقیقاً در پایان بودجه توقف اجرا میشود)؛ `interval` برای هر جریان یک بررسی را با دوره `clamp(budget/4, 1s, 5s)` حفظ میکند، بنابراین توقف حداکثر طی بودجه بهعلاوه دوره شناسایی میشود. در `open-sse/utils/streamStallWatchdog.ts` استفاده میشود. |
| `STREAM_READINESS_TIMEOUT_MS` | `80000` | زمان دریافت نخستین رویداد SSE غیرپینگ. در صورت تنظیم `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 در `responses.stream()` از OpenAI SDK میشوند حذف میکند. بهطور پیشفرض روشن است (#11014). برای ارسال آنها، مقدار را روی `0`/`false`/`no`/`off` تنظیم کنید. |
| `OMNIROUTE_CODEX_APPSERVER_WS` | _(تنظیمنشده)_ | انتقال انتخابی app-server برای Codex. نقطه پایانی WebSocket (`ws://`/`wss://`) متعلق به یک سرویس جانبی محلی `codex app-server`. وقتی همراه با یک توکن تنظیم شود، درخواستهای 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` | _(تنظیمنشده)_ | سیاست 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 را بهصورت خودکار تأیید میکند (اجرای فرمان/فایل/مجوز روی میزبان). بهصورت پیشفرض خاموش است — درخواستها بهطور خودکار رد میشوند؛ فراخوانیهای ابزار harness تحتتأثیر قرار نمیگیرند (آنها از مسیر عبوری جداگانه `item/tool/call` منتقل میشوند). مقادیر `true`/`1`/`yes` را میپذیرد. بازنویسی مختص هر اتصال: `providerSpecificData.codexAppServerAutoApprove`. |
| `FETCH_HEADERS_TIMEOUT_MS` | = `FETCH_TIMEOUT_MS` | زمان دریافت سرآیندهای پاسخ. |
| `OMNIROUTE_FETCH_START_TIMEOUT_CAP_MS` | `110000` | حداکثر زمان انتظار برای سرآیندهای پاسخ در درخواستهای جریانی (میلیثانیه). مقدار `0` این سقف را غیرفعال میکند؛ مقدار صریح `fetchStartTimeoutCapMs` ارائهدهنده اولویت دارد. |
| `OMNIROUTE_DIRECT_HEADERS_TIMEOUT_MS` | `30000` (30 ثانیه) | حداکثر زمان انتظار برای شروع پاسخ (میلیثانیه) در هر تلاش مستقیم و بدون پراکسی. در صورت timeout، یکبار دیگر روی یک socket جدید تلاش میشود؛ برای غیرفعالکردن این محدودیت و حفظ رفتار قبلی، مقدار `0` را تنظیم کنید. |
| `OMNIROUTE_LOCAL_DIRECT_HEADERS_TIMEOUT_MS` | `300000` (5 دقیقه) | کف زمان شروع پاسخ (میلیثانیه) برای تلاشهای مستقیم و بدون پراکسی که میزبان مقصدشان خصوصی/LAN/loopback است (برای مثال `localhost`، `host.docker.internal` و `192.168.x.x`) تا شروع سرد Ollama بومی با مقدار پیشفرض 30 ثانیهای بالا قطع نشود. بهعنوان کف عمل میکند: زمان انتظار مؤثر، مقدار بزرگتر بین این مقدار و `OMNIROUTE_DIRECT_HEADERS_TIMEOUT_MS` است؛ مقدار `0` یا یک مقدار نامعتبر، کف محلی را حذف میکند. میزبانهای راهدور تحتتأثیر قرار نمیگیرند. |
| `OMNIROUTE_DIRECT_RESPONSE_RETRY_TIMEOUT_MS` | `600000` (10 دقیقه) | سقف زمانی (میلیثانیه) برای تلاش RETRY روی socket جدید، پس از timeout شروع پاسخ در تلاش مبتنی بر pool بالا (#13703). این مورد فقط زمانی اعمال میشود که فراخواننده از قبل سیگنال مهلت خود را متصل کرده باشد (زنجیره حلشده اتصال/مدل/ارائهدهنده/`FETCH_TIMEOUT_MS`)؛ آن سیگنال محدودیت واقعی است و در مسیر موردنظر زودتر فعال میشود، بنابراین این مقدار بهجای یک سقف ثابت، یک حد پشتیبان سخاوتمندانه است — بدون آن، تلاش مجدد همان بازه کوتاه `OMNIROUTE_DIRECT_HEADERS_TIMEOUT_MS` مربوط به تلاش مبتنی بر pool را دوباره استفاده میکرد و مدلهای استدلالی سالم با TTFB کند با خطای 504 مواجه میشدند. هرگز اجازه ندارد از کف ثابت بالا کمتر باشد؛ وقتی فراخواننده هیچ سیگنال مهلتی ارائه نمیدهد، تلاش مجدد همان کف ثابت را بدون تغییر حفظ میکند. |
| `FETCH_BODY_TIMEOUT_MS` | = `FETCH_TIMEOUT_MS` | زمان دریافت کامل بدنه پاسخ. |
| `FETCH_CONNECT_TIMEOUT_MS` | `30000` | مهلت برقراری اتصال TCP. |
| `FETCH_KEEPALIVE_TIMEOUT_MS` | `4000` | مهلت بیکاری socket برای keep-alive. |
| `TLS_CLIENT_TIMEOUT_MS` | = `FETCH_TIMEOUT_MS` | مهلت پراکسی اثرانگشت TLS (wreq-js). |
| `TLS_FIRST_BYTE_WATCHDOG_MS` | `10000` | بهطور خاص زمان رسیدن اولین بایت بدنه را در انتقال اثرانگشت TLS مبتنی بر wreq-js محدود میکند؛ `TLS_CLIENT_TIMEOUT_MS` بهتنهایی نمیتواند بدنه متوقفشده را تشخیص دهد، زیرا بهمحض رسیدن سرآیندها resolve میشود (#12656). وقوع timeout، خوانشگر wreq را لغو میکند و به dispatcher مستقیم/پراکسی بازمیگردد؛ مقدار `0` این watchdog را غیرفعال میکند. |
| `RESPONSES_FIRST_BYTE_TIMEOUT_MS` | `15000` | فقط برای اجراکننده OpenCode و تنها هنگامی که feature flag `OPENCODE_RESPONSES_STALL_ROTATION` روشن باشد (بهصورت پیشفرض خاموش است): انتظار برای اولین بایت بدنه یک پاسخ جریانی Responses پس از دریافت سرآیندهای آن را محدود میکند (#13484). جریان Responses با `response.created` باز میشود، بنابراین سکوت فراتر از این بازه بهمعنای توقف است: حساب وارد دوره انتظار میشود و درخواست یکبار به حساب بعدی منتقل میشود؛ توقف دوم بلافاصله با شکست مواجه میشود. مقدار `0` حتی در صورت روشنبودن flag، این محافظ را غیرفعال میکند. |
| `OPENCODE_RESPONSES_HEADERS_WAIT_MS` | `0` (= خاموش) | فقط برای اجراکننده OpenCode: وقتی حساب دیگری همچنان در دسترس است، انتظار برای سرآیندهای پاسخ بالادستی در یک فراخوانی جریانی Responses را محدود میکند — یک درخواست در صف، بهجای اشغال کل بازه سرآیندها، انتظار را متوقف میکند و ادامه میدهد. فقط فراخوانیهای جریانی Responses تحتتأثیر قرار میگیرند (جریان Responses با `response.created` باز میشود، بنابراین سکوت در آنجا بهمعنای صف است، نه تولید)؛ تکمیلهای chat و فراخوانیهای غیرجریانی بدون تغییر میمانند و این بازه فقط سقف مؤثر شروع fetch را کوتاه میکند و هرگز آن را افزایش نمیدهد. مقدار پیشنهادی هنگام فعالسازی: `30000`. مقدار `0` آن را غیرفعال میکند. |
| `OPENCODE_RESPONSES_HEADERS_WAIT_MAX_ROTATIONS` | `2` | فقط اجراکننده OpenCode: تعداد دفعاتی که در هر درخواست، کران انتظار برای هدرهای بالا میتواند به حساب بعدی منتقل شود. آخرین حساب باقیمانده همیشه کل بازه زمانی هدرها را حفظ میکند. |
| `OPENCODE_PARK_AND_RESUME` | `false` | فقط اجراکننده OpenCode: پس از چندین خطای گذرای 429 (یا مشاهده یک نشانگر تازه فشار بر pool)، درخواست را همراه با heartbeat در حالت انتظار قرار میدهد، سپس بهجای ارسال همزمان به کل مجموعه، یک مرحله محدود شامل حداکثر 3 حساب متوالی را بازپخش میکند (#13924). بهطور پیشفرض غیرفعال است: هر خطای 429 دقیقاً مانند قبل باعث چرخش به حساب بعدی میشود. |
| `OPENCODE_PARK_REPLAY_SERVE_SETASIDE` | `false` | فقط اجراکننده OpenCode: وقتی تمام حسابهای آماده پس از cooldown در مرحله بازپخش park-and-resume توسط حافظه امتناع proxy کنار گذاشته شدهاند، بهجای آنکه چیزی بازپخش نشود، با این حال از آنها استفاده میکند (#14851، در ادامه #14750). بهطور پیشفرض غیرفعال است: در این حالت، مرحله بازپخش مانند قبل از #14750 خالی خواهد بود. |
| `STREAM_READINESS_STALL_RETRY` | `false` | فقط چت جریانی: وقتی نخستین بدنه upstream پیش از تولید یک رویداد قابل استفاده متوقف میشود، یک تلاش دوم محدود را از همان مسیر مسیریابی، با همان بودجه آمادگی و بدون جریمه حساب انجام میدهد. بهطور پیشفرض غیرفعال است: توقف نخستین بدنه، درخواست را بدون تلاش مجدد ناموفق میکند. |
| `OPENCODE_POOL_RESELECT` | `false` | فقط اجراکننده OpenCode: پس از دریافت خطای 429 از ارائهدهندهای که بر اساس egress دستهبندی شده است، روی یک حساب بدون proxy و در بستر یک pool محیطی، برای تلاش بعدی از connection pool عضو دیگری درخواست میکند، بهجای آنکه همان آدرس egress را دوباره امتحان کند. فقط ترتیب را تغییر میدهد و چیزی را مستثنا نمیکند: در صورت اتمام اعضای pool، رفتار فعلی حفظ میشود. بهطور پیشفرض غیرفعال است: هر خطای 429 دقیقاً مانند قبل باعث چرخش به حساب بعدی میشود. |
| `OPENCODE_POOL_STRAIN_MARKER_PATH` | _(تنظیمنشده)_ | فقط اجراکننده OpenCode: مسیر نشانگر فشار pool را که پیش از قرار دادن درخواست در حالت انتظار خوانده میشود، بازنویسی میکند (`{since, reason, ttl_s}`، پیشفرض `/tmp/opencode-pool-strain.json`، #13924). یک نشانگر تازه بدون شمارش مجدد باعث قرارگیری در حالت انتظار میشود؛ نبودن یا قدیمی بودن نشانگر باعث بازگشت به شمارنده burst خواهد شد. |
| `API_BRIDGE_PROXY_TIMEOUT_MS` | `30000` | مهلت زمانی hop مربوط به proxy برای درخواستهای bridge در `/v1`. |
| `FIRECRAWL_BASE_URL` | `https://api.firecrawl.dev` | اجراکننده واکشی وب Firecrawl را به یک نمونه self-hosted هدایت میکند (خارج از cloud، API key اختیاری است). |
| `FIRECRAWL_TIMEOUT_MS` | `30000` | مهلت زمانی هر درخواست برای اجراکننده واکشی وب Firecrawl. |
| `TAVILY_BASE_URL` | _(تنظیمنشده)_ | URL پایه برای واکشیکننده سهمیه `/usage` مربوط به Tavily (محدودیتهای ارائهدهنده)؛ وقتی به `api.tavily.com` اشاره کند، نادیده گرفته میشود. در صورت تنظیمنبودن، از URL پایه اتصال استفاده میشود. |
| `API_BRIDGE_SERVER_REQUEST_TIMEOUT_MS` | `300000` | مهلت زمانی کلی درخواست سرور برای bridge. |
| `API_BRIDGE_SERVER_HEADERS_TIMEOUT_MS` | `60000` | زمان مجاز برای ارسال هدرهای پاسخ از طریق bridge. |
| `API_BRIDGE_SERVER_KEEPALIVE_TIMEOUT_MS` | `5000` | مهلت زمانی بیکاری keep-alive در bridge. |
| `API_BRIDGE_SERVER_SOCKET_TIMEOUT_MS` | `0` | مهلت زمانی socket خام (0 = غیرفعال). |
| `SHUTDOWN_TIMEOUT_MS` | `30000` | دوره مهلت پس از SIGTERM/SIGINT پیش از خروج اجباری. |
| `OMNIROUTE_DEFAULT_FETCH_TIMEOUT_MS` | `120000` | مقدار جایگزین مورد استفاده توسط `src/shared/utils/fetchTimeout.ts` هنگامی که `FETCH_TIMEOUT_MS` تنظیم نشده است. |
| `OMNIROUTE_PROVIDER_PROBE_TIMEOUT_MS` | `8000` | مهلت زمانی (ms) برای presetهای `validationRead` و `modelsProbe` در `src/shared/network/safeOutboundFetch.ts`. برای endpointهای کند (Cerebras، Cloudflare AI، Groq) این مقدار را افزایش دهید تا از نوسان بین وضعیتهای فعال/خطا در dashboard جلوگیری شود. برای مقادیر نامعتبر (<1000) یا غیرعددی، مقدار جایگزین 8000ms است. |
| `OMNIROUTE_RELAY_FETCH_TIMEOUT_MS` | `25000` | مهلت زمانی واکشی مختص relay در `open-sse/utils/proxyFetch.ts` (#9158). یک relay متوقفشده باید پیش از مهلت زمانی client/agent (~30s) ناموفق شود تا فراخوانندهها بهجای خطای عمومی مهلت زمانی upstream، خطایی مختص relay مشاهده کنند. این مقدار به `29000` محدود شده است تا همیشه زودتر فعال شود. |
| `OMNIROUTE_RETRY_BACKOFF_MS` | `10` | تأخیر مشترک تلاش مجدد برای مسیرهای یکبار تلاش مجدد direct/relay/proxy در `open-sse/utils/proxyFetch.ts` (#9158). `0` = تلاش مجدد فوری. |
| `OMNIROUTE_CLAUDE_TLS_TIMEOUT_MS` | `60000` | مهلت زمانی درخواست بومی wreq-js (`claudeTlsClient.ts`). |
| `OMNIROUTE_CLAUDE_TLS_GRACE_MS` | `10000` | مهلت اضافی برای ضربالاجل سخت و مطلق JS که به مهلت زمانی بومی افزوده میشود. |
| `OMNIROUTE_PPLX_TLS_TIMEOUT_MS` | `30000` | مهلت زمانی درخواست بومی wreq-js (`perplexityTlsClient.ts`). |
| `OMNIROUTE_PPLX_TLS_GRACE_MS` | `10000` | مهلت اضافی برای ضربالاجل قطعی JS که به زمان انقضای بومی افزوده میشود. |
| `OMNIROUTE_PPLX_SEARCH_HINT` | `0` (خاموش) | عبارت «شما جستوجوی داخلی وب دارید. با استفاده از نتایج جستوجو مستقیماً به پرسشها پاسخ دهید.» را به پیام سیستمی فراخواننده اضافه میکند (`perplexity-web/protocol.ts`). بهطور پیشفرض خاموش است — Perplexity در هر صورت جستوجو میکند و این جمله در پاسخها بهصورت توضیحات متا برای کلاینتهای کدنویسی نشت میکند. برای بازیابی این رفتار، آن را روی `1`/`true`/`yes`/`on` تنظیم کنید. |
| `OMNIROUTE_GROK_TLS_TIMEOUT_MS` | `60000` | زمان انقضای بومی درخواست wreq-js (`grokTlsClient.ts`). |
| `OMNIROUTE_GROK_TLS_GRACE_MS` | `10000` | مهلت اضافی برای ضربالاجل قطعی JS که به زمان انقضای بومی افزوده میشود. |
| `OMNIROUTE_NOTION_TLS_TIMEOUT_MS` | `30000` | زمان انقضای بومی درخواست wreq-js (`notionTlsClient.ts`)؛ `notion-web` برای تولیدهای طولانی، آن را در هر درخواست به `180000` افزایش میدهد. |
| `OMNIROUTE_NOTION_TLS_GRACE_MS` | `10000` | مهلت اضافی برای ضربالاجل قطعی JS که به زمان انقضای بومی افزوده میشود. |
| `OMNIROUTE_BROWSER_POOL` | `on` | مخزن مشترک مرورگر Playwright برای گفتوگوی مبتنی بر کوکی وب که پشتوانه مرورگر دارد (`browserPool.ts`)؛ برای غیرفعالکردن، آن را روی `off` تنظیم کنید. |
| `OBSCURA_BIN` | `auto-detect` | مسیر فایل اجرایی `obscura` که مخزن مرورگر و اجراکننده Cloudflare Playground از آن بهعنوان موتور اصلی استفاده میکنند (`open-sse/services/obscura.ts`)؛ اگر تنظیم نشده باشد، بهطور خودکار از PATH سیستم شناسایی میشود. |
| `OBSCURA_CDP_ENDPOINT` | _(تنظیمنشده)_ | بهجای ایجاد یک نمونه جدید، به یک Obscura از پیش در حال اجرا (`http://host:port`) اشاره میکند؛ ماژول مالک آن فرایند نیست (`open-sse/services/obscura.ts`). |
| `OBSCURA_PORT` | `random free port` | پورت صریح برای `obscura serve` ایجادشده؛ اگر تنظیم نشده باشد، یک پورت آزاد بهطور خودکار انتخاب میشود (`open-sse/services/obscura.ts`). |
| `WEB_COOKIE_USE_BROWSER` | `0` | درخواست گفتوگوی مبتنی بر کوکی وب را برای استفاده از مسیر دارای پشتوانه مرورگر فعال میکند (`browserBackedChat.ts`)؛ برای فعالسازی از `1` استفاده کنید. |
| `KIMI_WEB_BASE_URL` | `https://www.kimi.ai` | نشانی URL پایه برای اجراکننده Kimi Web (رابط بینالمللی kimi.ai Connect-RPC) (`kimi-web.ts`)؛ فقط برای نقاط پایانی آینه/پروکسی بازنویسی کنید. |
| `KIMI_WEB_CHAT_URL` | `/apiv2/kimi.gateway.chat.v1.ChatService/Chat` | نقطه پایانی کامل گفتوگو برای اجراکننده Kimi Web (`kimi-web.ts`). |
| `OMNIROUTE_LOGIN_BROWSER_PATH` | _(شناسایی خودکار)_ | مسیر فایل اجرایی Chrome/Edge سیستم برای ورود تعاملی از طریق مرورگر به Adobe Firefly (`adobeFireflyBrowserLogin.ts`)؛ شناسایی خودکار مخصوص هر سیستمعامل را بازنویسی میکند. |
| `OMNIROUTE_STANDALONE_DIR` | _خروجی مستقل .build/_ | بازنویسی هنگام ساخت برای دایرکتوری خروجی مستقل که در مرحله هممکانی پس از ساخت استفاده میشود (`scripts/build/colocate-standalone.mjs`)؛ مربوط به ابزارهای ساخت است، نه زمان اجرا. |
تلاشهای مقصد ترکیبی، زمان انقضای حلشده درخواست بالادستی را به ارث میبرند (`FETCH_TIMEOUT_MS`، یا
`REQUEST_TIMEOUT_MS` هنگامی که مقدار پیشفرض fetch را فراهم میکند). `targetTimeoutMs` را در یک ترکیب،
پیشفرضهای ترکیب یا بازنویسی ارائهدهنده فقط زمانی تنظیم کنید که میخواهید بازگشت ترکیبی سریعتر انجام شود؛ مقادیر بالاتر از
زمان انقضای فعلی بالادستی به همان زمان انقضای بالادستی محدود میشوند.
`comboTimeoutMs` یک بودجه زمانی جداگانه بر اساس ساعت واقعی برای کل ترکیب و در میان مقصدهای جایگزین است.
برای حفظ تکرار نامحدود، آن را تنظیمنشده بگذارید یا روی `0` قرار دهید (توقف قطعی از پیش تعریفشده ۱۰ دقیقهای در
`comboPredicates.ts` همچنان اعمال میشود). یک مقدار مثبت، آن
سازوکار ایمنی را برای ترکیب جایگزین میکند. `comboTimeoutMs` را بیشتر از `targetTimeoutMs` نگه دارید تا پس از کندبودن
نخستین مقصد، همچنان برای جایگزینی فرصت باقی بماند.
### آستانههای قطعکننده مدار
تنظیم قطعکننده مدار در سطح ارائهدهنده. مقادیر پیشفرض بازتابدهنده مقادیر مقیاسبندیشدهای هستند که از v3.6 برای بیش از ۵۰۰ اتصال استفاده شدهاند.
| متغیر | پیشفرض | فایل منبع | توضیحات |
| ------------------------------------------------------------- | --------- | ------------------------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `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. |
| `OMNIROUTE_CIRCUIT_BREAKER_API_KEY_THRESHOLD` | `12` | `open-sse/config/constants.ts` | آستانهٔ شکستهای متوالی برای ارائهدهندگان مبتنی بر کلید API. |
| `OMNIROUTE_CIRCUIT_BREAKER_API_KEY_RESET_MS` | `30000` | `open-sse/config/constants.ts` | بازهٔ بازنشانی (میلیثانیه) برای مدارشکن ارائهدهندهٔ مبتنی بر کلید API. |
| `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` | بازهٔ بازنشانی (میلیثانیه) برای مدارشکن ارائهدهندهٔ محلی. |
| `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. |
| `OMNIROUTE_PROVIDER_BREAKER_OAUTH_COOLDOWN_MS` | `300000` | `open-sse/config/constants.ts` | مدارشکن در سطح ارائهدهنده: دورهٔ انتظار (میلیثانیه) پس از رسیدن ارائهدهندهٔ OAuth به آستانه. |
| `OMNIROUTE_PROVIDER_BREAKER_OAUTH_DEGRADATION_THRESHOLD` | `5` | `open-sse/config/constants.ts` | ارائهدهندهٔ OAuth پس از این تعداد شکست وارد وضعیت DEGRADED میشود. |
| `OMNIROUTE_PROVIDER_BREAKER_OAUTH_MAX_BACKOFF_MULTIPLIER` | `8` | `open-sse/config/constants.ts` | حداکثر ضریب افزایش resetTimeout برای ارائهدهندهٔ OAuth. |
| `OMNIROUTE_PROVIDER_BREAKER_OAUTH_BACKOFF_ESCALATION_COUNT` | `2` | `open-sse/config/constants.ts` | ارائهدهندهٔ OAuth پس از این تعداد چرخهٔ باز، سطح تأخیر را افزایش میدهد. |
| `OMNIROUTE_PROVIDER_BREAKER_API_KEY_FAILURE_THRESHOLD` | `15` | `open-sse/config/constants.ts` | مدارشکن در سطح ارائهدهنده: تعداد شکستها در بازهٔ زمانی پیش از آنکه کل ارائهدهندهٔ مبتنی بر کلید API وارد دورهٔ انتظار شود. |
| `OMNIROUTE_PROVIDER_BREAKER_API_KEY_FAILURE_WINDOW_MS` | `1800000` | `open-sse/config/constants.ts` | مدارشکن در سطح ارائهدهنده: بازهٔ لغزان شمارش شکستها (میلیثانیه) برای ارائهدهندگان مبتنی بر کلید API. |
| `OMNIROUTE_PROVIDER_BREAKER_API_KEY_COOLDOWN_MS` | `600000` | `open-sse/config/constants.ts` | مدارشکن در سطح ارائهدهنده: دورهٔ انتظار (میلیثانیه) پس از رسیدن ارائهدهندهٔ مبتنی بر کلید API به آستانه. |
| `OMNIROUTE_PROVIDER_BREAKER_API_KEY_DEGRADATION_THRESHOLD` | `7` | `open-sse/config/constants.ts` | ارائهدهندهٔ مبتنی بر کلید API پس از این تعداد شکست وارد وضعیت DEGRADED میشود. |
| `OMNIROUTE_PROVIDER_BREAKER_API_KEY_MAX_BACKOFF_MULTIPLIER` | `4` | `open-sse/config/constants.ts` | حداکثر ضریب افزایش resetTimeout برای ارائهدهندهٔ مبتنی بر کلید API. |
| `OMNIROUTE_PROVIDER_BREAKER_API_KEY_BACKOFF_ESCALATION_COUNT` | `3` | `open-sse/config/constants.ts` | ارائهدهندهٔ مبتنی بر کلید API پس از این تعداد چرخهٔ باز، سطح تأخیر را افزایش میدهد. |
| `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` | مدارشکن در سطح ارائهدهنده: بازهٔ لغزان شمارش شکستها (میلیثانیه) برای ارائهدهندگان محلی. |
| `OMNIROUTE_PROVIDER_BREAKER_LOCAL_COOLDOWN_MS` | `60000` | `open-sse/config/constants.ts` | مدارشکن در سطح ارائهدهنده: دورهٔ انتظار (میلیثانیه) پس از رسیدن ارائهدهندهٔ محلی به آستانه. |
| `OMNIROUTE_API_KEY_COOLDOWN_MS` | `60000` | `open-sse/services/apiKeyRotator.ts` | دورهٔ انتظار برای هر کلید (میلیثانیه) که هنگام چرخش چندکلیدیِ کلید API، وقتی پاسخ 429 بالادستی فاقد `Retry-After` باشد اعمال میشود (#14573). مقادیر غیرمثبت یا غیرعددی به مقدار پیشفرض بازمیگردند. |
| `PIN_DROP_BACKOFF_LEVEL` | `2` | `open-sse/services/combo.ts` | عمق عقبنشینیای که در آن ارائهدهندهٔ پینِ حافظهٔ نهان زمینه بهطور پایدار ناسالم تلقی میشود و پین برای جایگزینی در زمان شکست حذف میگردد. |
| `PIN_DROP_GRACE_MS` | `20000` | `open-sse/services/combo.ts` | بازهٔ ضدنوسان (میلیثانیه) برای تحمل دورههای انتظار کوتاه و گذرا پیش از حذف پینِ حافظهٔ نهان زمینه. |
### سناریوها
| سناریو | پیکربندی |
| ------------------------------ | ---------------------------------------------------- |
| **تولید کد طولانیمدت** | `REQUEST_TIMEOUT_MS=900000` (۱۵ دقیقه) |
| **محدودکردن طول عمر کل جریان** | `STREAM_ACTIVE_TIMEOUT_MS=1260000` (۲۱ دقیقه) |
| **شکست سریع برای API تولیدی** | `API_BRIDGE_PROXY_TIMEOUT_MS=10000` |
| **مدلهای دارای تفکر طولانی** | `STREAM_IDLE_TIMEOUT_MS=300000` (۵ دقیقه بین قطعهها) |
## 16. ثبت رویدادها
سیستم ثبت رویدادها هم در stdout و هم در فایلهای لاگ چرخشی مینویسد. تمام پیکربندیها توسط `src/lib/logEnv.ts` خوانده میشوند.
| متغیر | پیشفرض | توضیحات |
| ----------------------------------------- | -------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `APP_LOG_LEVEL` | `info` | حداقل سطح لاگ: `debug`، `info`، `warn`، `error`. |
| `APP_LOG_FORMAT` | `text` | قالب خروجی: `text` (خوانا برای انسان) یا `json` (ساختیافته). |
| `APP_LOG_TO_FILE` | `true` | لاگها را علاوه بر stdout در فایل نیز مینویسد. |
| `APP_LOG_FILE_PATH` | `logs/application/app.log` | مسیر فایل لاگ (نسبت به ریشهٔ پروژه یا `DATA_DIR`). |
| `APP_LOG_MAX_FILE_SIZE` | `50M` | حداکثر اندازهٔ فایل پیش از چرخش. مقادیر قابلقبول: `50M`، `1G`، `512K` یا تعداد بایت بهصورت عدد ساده. |
| `APP_LOG_RETENTION_DAYS` | `7` | تعداد روزهای نگهداری فایلهای چرخشی لاگ برنامه. |
| `APP_LOG_MAX_FILES` | `20` | حداکثر تعداد نسخههای پشتیبان فایل لاگ چرخشی. |
| `CALL_LOG_RETENTION_DAYS` | `7` | تعداد روزهای نگهداری ورودیهای لاگ درخواست/فراخوانی در پایگاه داده. |
| `CALL_LOG_MAX_ENTRIES` | `10000` | حداکثر تعداد ورودیهای لاگ فراخوانی در بافر حافظه. |
| `CALL_LOGS_TABLE_MAX_ROWS` | `100000` | حداکثر تعداد ردیفها در جدول SQLite با نام `call_logs` پیش از پاکسازی. |
| `ENABLE_REQUEST_LOGS` | _(تنظیمنشده)_ | ثبت جزئیات درخواست را با نادیدهگرفتن تنظیم داشبورد، اجباری فعال یا غیرفعال میکند. |
| `MAX_PENDING_REQUEST_AGE_MS` | `3600000` (1 ساعت) | حداکثر عمر ورودیهای لاگ درخواست فعالِ رهاشده پیش از پاکسازی از حافظه. |
| `CALL_LOG_PIPELINE_CAPTURE_STREAM_CHUNKS` | `false` | هنگامی که `call_log_pipeline_enabled=true` است، قطعههای جریان را در آرتیفکتهای خط لوله ذخیره میکند. نیازمند فعالسازی (`true`) است — برای صرفهجویی در فضای دیسک بهطور پیشفرض غیرفعال است. |
| `CALL_LOG_PIPELINE_MAX_SIZE_KB` | `512` | حداکثر اندازهٔ آرتیفکت لاگ فراخوانی خط لوله برحسب KB، هنگامی که `call_log_pipeline_enabled=true` است. |
| `PROXY_LOGS_TABLE_MAX_ROWS` | `100000` | حداکثر تعداد ردیفها در جدول SQLite با نام `proxy_logs` پیش از پاکسازی. |
| `PROXY_LOG_INCLUDE_IPS` | `false` | نشانیهای IP کلاینت/خروجی و پیشوندهای حساب را در لاگهای کنسول `[ProxyEgress]` درج میکند. رکوردهای لاگ پروکسی در داشبورد/پایگاه داده جزئیات کامل را حفظ میکنند. |
| `PROXY_LOG_FIRST_CHUNK_TIMING` | `false` | برای ثبت `first_chunk_ms` (از آغاز ارسال تا نخستین بایت مفید بدنه) در ردیفهای لاگ پروکسی، آن را روی `"true"` یا `"1"` تنظیم کنید. هر بدنهٔ بالادستی را در یک جریان عبوری تنبل میپیچد و پس از رسیدن بایت، ردیف را اصلاح میکند؛ بهطور پیشفرض غیرفعال است تا پاسخها بدون تغییر عبور کنند. |
| `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` | _خودکار_ (روی سختافزار مستقیم)؛ **`1024` در تصویر Docker** | محدودیت پیشنهادی heap در V8 برای Docker/حالت مستقل (MB). اگر تنظیم نشده باشد، بهصورت پویا کالیبره میشود (~35٪ از RAM سیستم، محدودشده به بازهٔ `[512, 4096]`)؛ `512` فقط زمانی حداقل مقدار است که حافظهٔ کل قابل خواندن نباشد. در `run-standalone.mjs` (Docker CMD)، یک مقدار **صریح** بهشکل `--max-old-space-size` افزوده میشود و بر یک پرچم heap متناقض در NODE_OPTIONS **اولویت دارد** (آخرین پرچم V8). دستور `omniroute serve` همچنان یک پرچم heap موجود در NODE_OPTIONS را ترجیح میدهد (#5238). هر دو را روی اعداد متفاوت تنظیم نکنید — فرایند هشداری ثبت میکند که هر دو مقدار و مقدار برنده را نام میبرد. **تصویر رسمی Docker همیشه `1024` را تنظیم میکند، بنابراین کالیبراسیون هرگز در آن اجرا نمیشود.** عامل کدنویسی `/v1/responses` به `8192` تا `12288` بههمراه فضای رزرو cgroup نیاز دارد — [راهنمای Docker — RAM زمان اجرا](../guides/DOCKER_GUIDE.md#runtime-ram-for-coding-agents) را ببینید. |
| `OMNIROUTE_RSS_PRESSURE_MB` | _خودکار_ (`max(3072, 2 × OMNIROUTE_MEMORY_MB)`؛ وقتی `OMNIROUTE_MEMORY_MB` تنظیم نشده باشد غیرفعال است) | `open-sse/utils/resourcePressure.ts` | فیوز مطلق RSS فرایند (MB) برای حافظهٔ بومی/خارجی که `heapUsed` در V8 قادر به مشاهدهٔ آن نیست؛ بالاتر از این مقدار، درخواستهای جدید پاسخ 503 با `resource_pressure` دریافت میکنند. RSS پس از یک جهش بهندرت کاهش مییابد، بنابراین آن را همراه با `OMNIROUTE_PRESSURE_SELF_RESTART` بهکار ببرید. |
| `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` | حداکثر تعداد رویدادهای اخیر جریان در بافر نمای زندهٔ داشبورد. |
| `CONTEXT_LENGTH_DEFAULT` | _(تنظیمنشده)_ | بازنویسی سراسری طول زمینه (برحسب توکن) برای هر ارائهدهندهای که متغیر `CONTEXT_LENGTH_` ندارد. در صورت تنظیم، مقادیر کاتالوگ، بازنویسی داشبورد و رجیستری را برای آن ارائهدهندگان **جایگزین میکند**؛ اگر تنظیم نشده باشد، OmniRoute از زنجیرهٔ داخلی خود استفاده میکند که آخرین مقدار جایگزین آن `128000` است. [طول زمینه برای هر ارائهدهنده](#per-provider-context-length-context_length_provider) را ببینید. |
| `USAGE_TOKEN_BUFFER` | `100` | فضای رزرو توکن اضافی هنگام ردیابی سهمیههای مصرف. |
### طول زمینه برای هر ارائهدهنده (`CONTEXT_LENGTH_`)
`open-sse/services/contextManager.ts` (`getEnvOverride()` / `resolveTokenLimit()`) همچنین یک فرم
**ویژهٔ هر ارائهدهنده** را میخواند که نام آن هنگام اجرا از شناسهٔ ارائهدهنده ساخته میشود؛ بنابراین نمیتوان
آن را سطربهسطر در جدول بالا یا در `.env.example` فهرست کرد.
**نام.** `CONTEXT_LENGTH_`، که در آن `` شناسهٔ ارائهدهنده با حروف بزرگ است و
هر نویسهٔ خارج از `A-Z` / `0-9` با `_` جایگزین میشود. شناسهٔ ارائهدهنده، شناسهٔ متعارف پس از
رفع نام مستعار است (بخش `provider` از رشتهٔ `provider/model` پس از رفع یک نام مستعار کوتاه).
گرههای سفارشی سازگار با OpenAI یا Anthropic از شناسهٔ گره تولیدشدهٔ خود استفاده میکنند؛ بنابراین
UUID بخشی از نام متغیر است. مقدار، تعداد صحیح و مثبت توکنها است؛ هر مقدار دیگری
(خالی، `0`، منفی یا غیرعددی) نادیده گرفته میشود و فرایند رفع مقدار به مرحلهٔ بعد میرود.
| شناسهٔ ارائهدهنده | نام متغیر |
| ----------------------------------------------------------- | -------------------------------------------------------------------------- |
| agentrouter | CONTEXT_LENGTH_AGENTROUTER |
| openrouter | CONTEXT_LENGTH_OPENROUTER |
| openai-compatible-chat-0f8e2c1a-5b7d-4e3f-9a6c-2d1b8e4f7a90 | CONTEXT_LENGTH_OPENAI_COMPATIBLE_CHAT_0F8E2C1A_5B7D_4E3F_9A6C_2D1B8E4F7A90 |
**تقدم.** برای یک جفت `provider/model`، اولین مرحلهای که مقداری برگرداند برنده است:
1. `CONTEXT_LENGTH_` برای آن ارائهدهنده.
2. `CONTEXT_LENGTH_DEFAULT` (بازنویسی سراسری از طریق محیط).
3. پنجرهٔ مختص مدل: یک بازنویسی پایدارشدهٔ زمینه (که در داشبورد تنظیم شده یا بهصورت خودکار توسط
هماهنگکنندهٔ کشف سنجاق شده است؛ به `CONTEXT_WINDOW_RECONCILE_INTERVAL` مراجعه کنید)، و در غیر این صورت مقدار
کاتالوگ همگامشده / models.dev.
4. مقدار `defaultContextLength` در رجیستری ارائهدهنده.
5. قواعد اکتشافی نام مدل (`claude` برابر با 200000، `gemini` برابر با 1000000، `gpt` / `o1` / `o3` / `o4` /
`codex` برابر با 400000).
6. مقادیر پیشفرض داخلی مختص هر ارائهدهنده، سپس `128000`.
هر دو مرحلهٔ محیطی بر **کل ارائهدهنده** اعمال میشوند: همهٔ مدلهای آن ارائهدهنده محدودیت
یکسانی دریافت میکنند و این مقادیر بر بازنویسیهای مختص مدل در داشبورد تقدم دارند. هنگامی که فقط یک مدل از یک ارائهدهنده
به پنجرهای متفاوت نیاز دارد، بهجای آن از بازنویسی مختص مدل در داشبورد استفاده کنید.
**دامنه.** این زنجیره بررسی پنجرهٔ زمینه در زمان درخواست (رد شدن با
`context_length_exceeded` / «ورودی از پنجرهٔ زمینه فراتر میرود» در
`open-sse/handlers/chatCore.ts`)، بودجههای فشردهسازی پرامپت و محدودیتهای زمینهٔ ترکیبی را کنترل میکند. مقدار
`context_length` که توسط `GET /v1/models` اعلام میشود همچنان ممکن است از فرادادهٔ کاتالوگ یا رجیستری
گرفته شود و تضمینی وجود ندارد که بازنویسی محیطی را منعکس کند.
**مثال.** ارائهدهندهای که مدل آن پنجرهای با ظرفیت 1,050,000 توکن را میپذیرد، در حالی که کاتالوگ مقدار
128,000 را گزارش میکند:
```dotenv
CONTEXT_LENGTH_AGENTROUTER=1050000
```
پس از تغییر آن، سرور را راهاندازی مجدد کنید: مقدار از محیط فرایند سرور خوانده میشود.
در **برنامهٔ دسکتاپ**، سرور بهعنوان یک فرایند فرزند اجرا میشود و متغیر سیستمیای را که
پس از اجرای برنامه تنظیم شده باشد نمیبیند؛ این خط را در فایل `.env` که برنامه بارگذاری میکند قرار دهید (ترتیب جستوجو در
[راهنمای Electron: جستوجوی فایل محیطی](../guides/ELECTRON_GUIDE.md#environment-file-lookup))،
سپس برنامه را بهطور کامل ببندید و دوباره اجرا کنید.
### فشردهسازی
| متغیر | پیشفرض | توضیحات |
| ------------------------------------- | --------- | ----------------------------------------------------------------------------------------------------------------- |
| `OMNIROUTE_RTK_TRUST_PROJECT_FILTERS` | تنظیمنشده | به فایل `.rtk/filters.json` پروژه بدون هش `.rtk/trust.json` اعتماد کنید. فقط در توسعهٔ محلی کنترلشده استفاده شود. |
### موتور حافظه (طرح 21)
### هزینهٔ حلقهٔ رویداد برای حافظه، مهارتها و نوسازی توکن (#10349)
OmniRoute یک **فرایند واحد Node** است. استخراج/بازیابی حافظه، تزریق مهارتها و نوسازی توکن ارائهدهنده روی **همان حلقهٔ رویداد** اجرا میشوند که `GET /healthz` و داشبورد روی آن اجرا میشوند. این عملیات در یک رشتهٔ کارگر اجرا نمیشوند.
| کار | کد | پیشفرض | کنترل اپراتور |
| ----------------------- | ---------------------------------- | ------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------- |
| استخراج / بازیابی حافظه | `src/lib/memory/` | گزینهٔ **memoryEnabled** در داشبورد (بهطور پیشفرض روشن) | **Settings → Memory** را خاموش کنید. بهجز غیرفعالکردن این قابلیت در تنظیمات، کلید توقف محیطی جداگانهای وجود ندارد. |
| تزریق مهارتها | `src/lib/skills/injection.ts` | گزینهٔ **skillsEnabled** در داشبورد (بهطور پیشفرض روشن) | **Settings → Memory/Skills** (`skillsEnabled`) را خاموش کنید. گزینههای sandbox در پایین فقط پس از فعال بودن تزریق، اجرای آن را محدود میکنند. |
| نوسازی توکن | `src/sse/services/tokenRefresh.ts` | برای ارائهدهندگان متصل OAuth/وب روشن است | اتصال ارائهدهنده را قطع کنید یا اجازه دهید توکنها معتبر بمانند؛ در حال حاضر متغیر محیطی `TOKEN_REFRESH=0` وجود ندارد. |
اگر `/healthz` روی سیستمی کمبار کند است، ابتدا حافظه و مهارتها را غیرفعال کنید، سپس بار کاتالوگ/فشردهسازی را بررسی کنید (#10303، #9685). این قابلیتها در نقاط `await` کنترل را واگذار میکنند، اما همچنان برای استفاده از همان یک رشته رقابت میکنند.
گزینههای لایهٔ embedding، مخزن برداری و رتبهبندی مجدد برای زیرسیستم حافظهٔ پایدار (`src/lib/memory/`).
| متغیر | مقدار پیشفرض | توضیحات |
| ------------------------------------ | --------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| `MEMORY_EMBEDDING_CACHE_TTL_MS` | `300000` (۵ دقیقه) | TTL کش embedding درونحافظهای (بهازای هر امضای منبع/مدل/بُعد). |
| `MEMORY_EMBEDDING_CACHE_MAX` | `1000` | حداکثر تعداد ورودیهای LRU نگهداریشده در کش embedding. |
| `MEMORY_TRANSFORMERS_MODEL` | `Xenova/all-MiniLM-L6-v2` | شناسه مخزن HF برای خط لوله محلی MiniLM مبتنی بر `@huggingface/transformers` که فعالسازی آن اختیاری است (حدود ۲۳ مگابایت int8 و حدود ۴۰۰ مگابایت RAM). |
| `MEMORY_STATIC_MODEL` | `minishlab/potion-base-8M` | شناسه مخزن HF برای embedder جدول جستوجوی ایستای potion/Model2Vec. بهصورت lazy در پوشه کش دانلود میشود. |
| `MEMORY_STATIC_CACHE_DIR` | `/embeddings` | پوشه مورد استفاده برای کشکردن فایلهای مدل ایستای potion. در صورت تنظیمنبودن، بهطور پیشفرض زیر `DATA_DIR` قرار میگیرد. |
| `HF_HUB_ENDPOINT` | `https://huggingface.co` | بازنویسی URL پایه Hugging Face Hub که توسط `staticPotion.ts` استفاده میشود (برای مثال، endpoint آینه در راهاندازیهای air-gapped). |
| `MEMORY_VEC_TOP_K` | `20` | مقدار پیشفرض top-K مورد استفاده در جستوجوی برداری brute-force مبتنی بر `sqlite-vec` در `src/lib/memory/vectorStore.ts`. |
| `MEMORY_RRF_K` | `60` | ثابت `k` در Reciprocal Rank Fusion برای بازیابی ترکیبی FTS5 و برداری (دستورالعمل sqlite-vec). |
| `VECTOR_STORE_DISABLE_VEC` | `false` | نقطه اتصال آزمایشی/تشخیصی در `getVectorStore()` (`src/lib/memory/vectorStore.ts`): وقتی `true` باشد، vector store را بهاجبار `null` میکند (محیط cloud/WASM بدون `sqlite-vec` را شبیهسازی میکند) و بازیابی حافظه را به جستوجوی کلیدواژهای FTS5 تقلیل میدهد. در محیط production تنظیمنشده باقی بماند. |
| `NOTION_API_KEY` | _(تنظیمنشده)_ | کلید API برای backend مربوط به Notion (مورد استفاده توسط preset شناختهشده backend در `genericBackend.ts`). |
| `NOTION_API_URL` | `https://api.notion.com/v1` | URL پایه برای API مربوط به Notion (برای جایگزینهای self-hosted نرمافزار Notion قابل بازنویسی است). |
| `OBSIDIAN_API_KEY` | _(تنظیمنشده)_ | کلید API برای backend مربوط به Obsidian Vault (مورد استفاده توسط preset شناختهشده backend در `genericBackend.ts`). |
| `OBSIDIAN_API_URL` | `http://localhost:27123` | URL پایه برای API مربوط به Obsidian Vault (برای vault راه دور قابل بازنویسی است). |
| `MEMORY_TYPED_DECAY_ENABLED` | `false` | کلید اصلی فرسایش حافظه نوعدار TV6. **فعالسازی اختیاری (پیشفرض: خاموش)** — sweep حافظههای فرسوده را **حذف میکند**. وقتی خاموش باشد، `access_count`/`last_accessed_at` صرفاً دادههای تلهمتری هستند و هیچچیز هرگز حذف نمیشود. |
| `MEMORY_TYPED_DECAY_EPISODIC_DAYS` | `30` | TTL (برحسب روز) که پس از آن حافظه `episodic` استفادهنشده فرسوده میشود. مقدار `0` حافظه episodic را نیز مصون میکند. انواع ماندگار (`factual`/`procedural`/`semantic`) همیشه مصون هستند. ساعت فرسایش بر اساس `last_accessed_at` مجدداً مبناگذاری میشود. |
| `MEMORY_TYPED_DECAY_ACCESS_IMMUNITY` | `3` | حافظهای که به این تعداد یا بیشتر (`>=`) تزریق شده باشد، صرفنظر از نوع، در برابر فرسایش مصون میشود. مقدار `0` مصونیت مبتنی بر دسترسی را غیرفعال میکند. |
| `MEMORY_TYPED_DECAY_SWEEP_INTERVAL` | `0` (غیرفعال) | فاصله زمانی (برحسب ثانیه) برای sweep دورهای و اختیاری فرسایش در `src/lib/memory/typedDecay.ts`. مقدار `0`/تنظیمنشده = بدون sweep دورهای. نیازمند فعالسازی دوگانه است: `MEMORY_TYPED_DECAY_ENABLED=true` نیز باید تنظیم شده باشد. |
| `OMNIROUTE_STRICT_SYSTEM_PROVIDERS` | _(تنظیمنشده)_ | شناسههای provider جداشده با ویرگول (غیرحساس به بزرگی و کوچکی حروف) که پیام `system` را **فقط در اندیس ۰** میپذیرند (`src/lib/memory/injection.ts`). برای این providerها، درج حافظه در میانه آرایه که برای کش ایمن است، در مکالمات چندنوبتی ناامن خواهد بود؛ بنابراین حافظه با پیام system ابتدایی ادغام میشود یا پیش از آن قرار میگیرد. مقدار پیشفرض فقط `xiaomi-mimo`/`mimo` است؛ آن را برای endpointهای self-hosted سازگار با OpenAI (برای مثال Qwen3.5+/3.6) که قالب chat آنها همان محدودیت تکپیام system ابتدایی را اعمال میکند، گسترش دهید. |
### نمونه Docker با RAM کم
`128` فقط برای داشبورد است. agentهای کدنویسی با این heap هنگام اجرای طولانیمدت `/v1/responses` با خطای `FATAL ERROR` مواجه میشوند. از این نمونه بهعنوان gateway برای Claude/Codex/Grok استفاده نکنید.
```bash
OMNIROUTE_MEMORY_MB=128
PROMPT_CACHE_MAX_SIZE=20
PROMPT_CACHE_MAX_BYTES=524288 # ۵۱۲ کیلوبایت
SEMANTIC_CACHE_MAX_SIZE=25
SEMANTIC_CACHE_MAX_BYTES=1048576 # ۱ مگابایت
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` | منابع داده با جداکنندهٔ ویرگول. |
---
## همگامسازی ELO در Arena
| متغیر | پیشفرض | فایل منبع | توضیحات |
| ---------------------------- | ------------- | ------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| `ARENA_ELO_SYNC_ENABLED` | `true` | `src/shared/constants/featureFlagDefinitions.ts` | همگامسازی دورهای ELO جدول رتبهبندی Arena AI که از طریق پرچمهای قابلیت داشبورد قابل پیکربندی است؛ برای انصراف، آن را روی `false` تنظیم کنید. |
| `MODELS_CATALOG_PREFIX_MODE` | `dual` | `src/shared/constants/featureFlagDefinitions.ts`, `src/app/api/v1/models/catalog.ts` | شکل پیشوند استفادهشده برای شناسههای مدل در `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 (غیررسمی/آزمایشی)
پل نشست GraphQL مهندسی معکوسشده برای prompt.ql.app (`src/shared/constants/providers/web-cookie.ts`). همهٔ گزینهها اختیاری هستند — مقادیر پیشفرض به نقاط پایانی عمومی محیط آزمایشی اشاره میکنند؛ فقط برای استقرار خودمیزبان/جایگزین 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` | حداکثر زمان (ms) برای نظرسنجی `thread_events` پیش از پایان مهلت. |
---
## ارائهدهنده وب 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
استعلام موجودی شخصی برحسب USD و میزان مصرف Kilo Pass برای ارائهدهنده Kilo Code. اختیاری است — مقدار پیشفرض به API عمومی Kilo اشاره میکند؛ فقط برای یک رله/فیکسچر آزمایشی آن را بازنویسی کنید. احراز هویت از توکن دسترسی OAuth موجود اتصال استفاده میکند.
| متغیر | پیشفرض | فایل منبع | توضیحات |
| -------------- | --------------------- | ------------------------------------- | ------------------------------------------------------------------------------ |
| `KILO_API_URL` | `https://api.kilo.ai` | `open-sse/services/usage/kilocode.ts` | URL پایه مورداستفاده برای دریافت موجودی شخصی Kilo Code و میزان مصرف Kilo Pass. |
---
## ارائهدهنده وب Adobe Firefly (غیررسمی/آزمایشی)
تازهسازی نشست مبتنی بر مرورگر برای ارائهدهنده وب Adobe Firefly
(`open-sse/services/adobeFireflyBrowserLogin.ts`، `open-sse/services/adobeFireflySession.ts`،
`open-sse/services/adobeFireflyClient.ts`). اختیاری است — همه مقادیر پیشفرض برای یک نصب معمولی
رومیزی تنظیم شدهاند.
> **در #9255 حذف شد.** زماناجرای قدیمی Chrome متصل به CDP (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. تنظیمنشده = پیروی از تنظیمات > هوش مصنوعی (`modelsDevSyncEnabled`). مقادیر `0`/`false`/`off`/`no` **بر پایگاه داده اولویت دارند** و هم همگامسازی دورهای و هم اسکنهای SQL/JSON تابع `getModelsDevPricing()` را رد میکنند (برای بازیابی زمانی که داشبورد در همان حلقه رویداد گیر کرده است). مقادیر `1`/`true`/`on`/`yes` همگامسازی را بهاجبار فعال میکنند. ذخیره/پاکسازی قیمتگذاری همچنان `backupDbFile("pre-write")` را فراخوانی میکند که تحت محدودسازی ۶۰ دقیقهای یا `DISABLE_SQLITE_AUTO_BACKUP` هیچ عملی انجام نمیدهد. |
| `MODELS_DEV_SYNC_INTERVAL` | `86400` (۲۴ ساعت) | `src/lib/modelsDevSync.ts` | فاصله زمانی همگامسازی کاتالوگ مدل در زمان توسعه، بر حسب ثانیه. |
| `CONTEXT_WINDOW_RECONCILE_INTERVAL` | `86400` (۲۴ ساعت) | `src/lib/contextWindowResolver.ts` | فاصله زمانی (بر حسب ثانیه) برای تطبیقدهنده خوداصلاحگر پنجره زمینه (5004): وقتی پنجرههای اعلامشده توسط ارائهدهنده از طریق کشف `/models` با کاتالوگ تفاوت داشته باشند، آنها را بهعنوان بازنویسیهای `auto:discovery` تثبیت میکند. برای غیرفعالسازی روی `0` تنظیم کنید. از دادههای ازپیشهمگامشده دوباره استفاده میکند (بدون واکشی جدید)؛ هرگز بازنویسیهای `manual` را جایگزین نمیکند. |
---
## 20. تنظیمات مختص ارائهدهنده
| متغیر | پیشفرض | فایل منبع | توضیحات |
| ---------------------------------------------- | -------------------------------------- | ---------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `OPENROUTER_CATALOG_TTL_MS` | `86400000` (24 ساعت) | `src/lib/catalog/openrouterCatalog.ts` | زمان ماندگاری کش فهرست مدلهای OpenRouter. |
| `MODEL_CATALOG_INCLUDE_NAMES` | `true` | `src/shared/constants/featureFlagDefinitions.ts` | فیلدهای نمایشی و خوانای `name` را در پاسخهای `/v1/models` بگنجانید. برای کلاینتهایی که فقط انتظار شناسه دارند، غیرفعال کنید. |
| `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). ردیفهایی که هرگز مهر زمانی نخوردهاند، کهنه محسوب میشوند. |
| `OMNIROUTE_ANALYTICS_CACHE_TTL_MS` | `60000` (60 ثانیه) | `src/lib/usage/analyticsResponseCache.ts` | مدتزمان استفادهٔ مجدد از یک پاسخ کند `GET /api/usage/analytics` برای همان رشتهٔ کوئری (#15629). مقدار `0` کش را غیرفعال میکند. |
| `OMNIROUTE_ANALYTICS_CACHE_MIN_COMPUTE_MS` | `1000` (1 ثانیه) | `src/lib/usage/analyticsResponseCache.ts` | فقط پاسخهای تحلیلی که ساخت آنها دستکم به این میزان زمان نیاز داشته باشد، کش میشوند تا نمونههای کوچک همیشه دادههای تازه ببینند. |
| `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. |
| `CLOUDFLARE_PLAYGROUND_CHROME_PATH` | _(تنظیمنشده)_ | `open-sse/executors/cloudflare-playground.ts` | مسیر کامل فایل اجرایی Chrome دسکتاپ برای اجراکنندهٔ Cloudflare AI Playground که وقتی بررسی اثرانگشت حالت headless، Chromium همراه Playwright را مسدود میکند، استفاده میشود. |
| `CODEBUDDY_SYSTEM_PROMPT_MAX_LEN` | ∅ (∞) | `open-sse/executors/codebuddy/shared.ts` | محدودیت طول اختیاری برای پرامپتهای سیستمی فراخواننده که به CodeBuddy (چین و بینالمللی) ارسال میشوند. بهطور پیشفرض، فقط پرامپتی که دارای نشانگر هویت عامل کدنویسی باشد با پرامپتی خنثی جایگزین میشود (فیلتر محتوای Tencent آنها را رد میکند)؛ پرامپتهای طولانی حفظ میشوند. یک عدد صحیح > 0 همچنین هر پرامپت سیستمی طولانیتر از آن تعداد نویسه را جایگزین میکند؛ تنظیمنبودن، `0` یا مقدار غیرصحیح این محدودیت را غیرفعال میکند. هر جایگزینی ثبت میکند که کدام قاعده فعال شده است (نشانگر هویت یا طول). |
| `CLOUDFLARE_API_BASE` | `https://api.cloudflare.com/client/v4` | `src/app/api/settings/proxy/cloudflare-deploy/route.ts` | مبنای Cloudflare REST API مورد استفادهٔ استقراردهندهٔ رلهٔ Workers برای مخزن پروکسی را بازنویسی میکند (#4640 / 9router#1360). |
| `NEXT_PUBLIC_CLOUDFLARE_RELAY_DEFAULT_PROJECT` | `omniroute-relay` | `src/app/(dashboard)/dashboard/settings/components/proxy/CloudflareRelayModal.tsx` | نام پیشفرض پروژهٔ worker که در پنجرهٔ «استقرار رله» مخزن پروکسی پیشنهاد میشود. |
| `NEXT_PUBLIC_CLOUDFLARE_RELAY_ENABLED` | `true` | `src/app/(dashboard)/dashboard/settings/components/proxy/ProxyPoolTab.tsx` | برای پنهانکردن گزینهٔ رلهٔ 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` | مسیر فایل `config.yml` مربوط به cloudflared که بهصورت محلی مدیریت میشود (شامل `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` | بازنویسی آدرس پایه REST API متعلق به Deno Deploy که توسط استقراردهنده رله مجموعه پروکسی استفاده میشود (#4643 / 9router#1437). |
| `NEXT_PUBLIC_DENO_RELAY_DEFAULT_PROJECT` | `omniroute-deno-relay` | `src/app/(dashboard)/dashboard/settings/components/proxy/DenoRelayModal.tsx` | نام پیشفرض برنامه Deno Deploy که در پنجره «استقرار رله» مجموعه پروکسی پیشنهاد میشود. |
| `NEXT_PUBLIC_DENO_RELAY_ENABLED` | `true` | `src/app/(dashboard)/dashboard/settings/components/proxy/ProxyPoolTab.tsx` | برای پنهانکردن گزینه رله Deno Deploy از زبانه مجموعه پروکسی، روی `false` تنظیم کنید. |
| `SEARCH_CACHE_TTL_MS` | `300000` (۵ دقیقه) | `open-sse/services/searchCache.ts` | TTL ذخیرهسازی پاسخهای API جستوجو (Perplexity، Brave و غیره) در حافظه نهان. |
| `ENABLE_CC_COMPATIBLE_PROVIDER` | `false` | `src/shared/utils/featureFlags.ts` | نمایش رابط کاربری آزمایشی ارائهدهنده سازگار با CC برای رلههای مختص Claude Code. |
| `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 سرویس تعبیهشده (بهطور پیشفرض فقط loopback). |
| `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` سرویسی حاوی اعتبارنامه را در معرض کل شبکه محلی قرار میدهد. |
| `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 (بهطور پیشفرض فقط loopback). |
| `DARIO_PORT` | `3456` | `open-sse/executors/dario.ts` | درگاه سرویس تعبیهشدهٔ Dario. |
| `DARIO_HOST` | `127.0.0.1` | `open-sse/executors/dario.ts` | میزبان اتصال/مقیدسازی سرویس تعبیهشدهٔ Dario (بهطور پیشفرض فقط loopback). |
| `DARIO_PORT` | `3456` | `open-sse/executors/dario.ts` | درگاه سرویس تعبیهشدهٔ Dario. |
| `LOCAL_HOSTNAMES` | _(خالی)_ | `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_RELAY_INTERVAL_MS` | `21600000` | `src/lib/proxyHealth/relayCadence.ts` | فاصلهٔ زمانی بررسی برحسب میلیثانیه برای پراکسیهای edge-relay (`deno`/`vercel`/`cloudflare`) که بررسی آنها یک نمونهٔ serverless مشمول هزینه را فعال میکند (حداقل `60000`). |
| `PROXY_HEALTH_RECOVERY_INTERVAL_MS` | `600000` | `src/lib/proxyHealth/scheduler.ts` | فاصلهٔ زمانی اجرای بازیابی پسزمینه برحسب میلیثانیه: مشخص میکند پراکسیهایی که قبلاً ناسالم بودهاند هر چند وقت یکبار دوباره بررسی شوند تا پراکسی بازیابیشده بدون نیاز به راهاندازی مجدد به چرخه بازگردد. مقادیر کمتر از `60000` به مقدار پیشفرض بازمیگردند. |
| `PROXY_HEALTH_TEST_URL` | `https://httpbin.org/ip` | `src/lib/proxyHealth/probeTarget.ts` | مقصد بررسی دسترسیپذیری که زمانبند و نقطهٔ پایانی `/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` | تأخیر برحسب میلیثانیه میان ارسال دو بررسی در یک دسته. بدون این تأخیر، کل دسته همزمان ارسال میشود و ممکن است یک IP خروجی مشترک باعث فعال شدن محدودیت نرخ مقصد شود. برای غیرفعال کردن این فاصلهگذاری، آن را روی `0` تنظیم کنید؛ حداکثر مقدار 5000 است. |
| `PROXY_HEALTH_USE_PROVIDER_TARGET` | `true` | `src/lib/proxyHealth/providerProbeTarget.ts` | برای متوقف کردن بررسی میزبان واقعی ارائهدهندهٔ تخصیصیافته به پراکسی (`GET /models`، بدون کلید API) و استفادهٔ همیشگی از `PROXY_HEALTH_TEST_URL` بهجای آن، مقدار را روی "false" تنظیم کنید. |
| `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`) باعث میشود نوبتهای خالی ترجمهشدهٔ جریانی از طریق مسیر عادی اعتبارنامه دوباره امتحان شوند (تا سقف `STREAM_RECOVERY.EMPTY_TURN_RETRY_MAX` تلاش مجدد)، بهجای آنکه پاسخ خالی 200 یا پاسخ 502 با محتوای خالی نمایش داده شود. |
| `PROXY_POOL_EGRESS_OBSERVATION` | `false` | `src/shared/utils/featureFlags.ts` | پرچم قابلیت اختیاری (به [FEATURE_FLAGS.md](./FEATURE_FLAGS.md) مراجعه کنید؛ بازنویسی DB در داشبورد اولویت دارد). مقدار `true` (یا `1`، `yes`) مشاهدهٔ فقطخواندنی خروجی استخر را زیر یک استخر پراکسی در داشبورد نمایش میدهد (IPهای خروجی متمایز، اتصالها و پرتکرارترین آنها در پشت یک IP طی 24 ساعت گذشته، بر اساس گزارش پراکسی). هرگز برای مسیریابی استفاده نمیشود. |
| `PROXY_OPERATOR_EGRESS_ENABLED` | `false` | `src/shared/utils/featureFlags.ts` | پرچم قابلیت اختیاری (به [FEATURE_FLAGS.md](./FEATURE_FLAGS.md) مراجعه کنید؛ مقدار بازنویسیشده در DB داشبورد اولویت دارد). مقدار `true` (یا `1`، `yes`) آدرسهای مشاهدهشده و تاریخدارِ ارسالشده توسط اپراتور را برای هر عضو مجموعه میپذیرد و آنها را برای نمایش و ترتیب مجموعه با دادههای خواندهشده از ژورنال ادغام میکند. |
| `PROXY_OPERATOR_EGRESS_WINDOW_HOURS` | `24` | `src/lib/db/proxyOperatorEgress.ts` | بازهٔ مشاهده برحسب ساعت برای ردیفهای خروجی ارسالشده توسط اپراتور (در هر بار خواندن بررسی میشود؛ نیازی به راهاندازی مجدد نیست). به محدودهٔ 1..168 محدود است؛ مقادیر خارج از محدوده، غیرعددی یا خالی با یک هشدار واحد در سطح فرایند به 24 بازمیگردند و هرگز خطایی پرتاب نمیشود. |
| `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` | روی `true` تنظیم کنید تا زمانبند پس از چندین شکست متوالی، بهجای حذف پروکسی، آن را بهصورت نرم غیرفعال کند (وضعیت `dead`؛ هرگز حذف نمیشود). جایگزینی غیرمخرب برای `PROXY_AUTO_REMOVE`: پروکسی بلافاصله از فرایند تعیین مجموعه/چرخش خارج میشود (فیلتر وضعیت فعال که در تعیین مجموعهٔ دامنه استفاده میشود، از قبل آن را مستثنا میکند) و بهمحض اینکه دوباره بررسیها را با موفقیت پشت سر بگذارد، بهطور خودکار فعال میشود. از آستانهٔ `PROXY_AUTO_REMOVE_AFTER` استفاده میکند. اگر هر دو پرچم `true` باشند، `PROXY_AUTO_REMOVE` اولویت دارد. |
| `PROXY_HEALTH_PASSIVE_SKIP` | `false` | `src/lib/proxyHealth/scheduler.ts` | ردکردن غیرفعالِ اختیاری: وقتی `true` باشد، زمانبند بررسی زندهٔ نقطهٔ پایانیای را رد میکند که ترافیک اخیر محیط عملیاتی از قبل سلامت آن را اثبات کرده باشد (حداقل یک موفقیت و هیچ شکست منتسب به پروکسی در بازه، و دقیقاً یک ارائهدهندهٔ مشاهدهشده). بهطور پیشفرض غیرفعال است: همهٔ پروکسیها بررسی میشوند. |
| `PROXY_PASSIVE_WINDOW_MS` | `300000` | `src/lib/proxyHealth/passiveVerdict.ts` | بازهٔ زمانی ترافیک محیط عملیاتی برحسب ms که ردکردن غیرفعال آن را بررسی میکند (محدود به `60000..599999`). این بازه کوتاهتر از فاصلهٔ پیمایش 10دقیقهای است تا یک شکست اخیر، بهجای کماثر شدن، غالب باشد. |
| `OMNIROUTE_CONTROL_PLANE_PROXY_DIRECT_FALLBACK` | `false` | `src/shared/constants/featureFlagDefinitions.ts` | به جریانهای اعتبارسنجی OAuth و ارائهدهنده اجازه میدهد هنگامی که پیشبررسیهای دسترسیپذیری پروکسی ناموفق هستند، پروکسی ثابتشده را دور بزنند و مستقیماً متصل شوند. ترتیب اولویت مؤثر عبارت است از: مقدار بازنویسیشده در DB پرچمهای قابلیت > متغیر محیطی > مقدار پیشفرض. |
| `RATE_LIMIT_MAX_WAIT_MS` | `30000` (30 ثانیه) | `src/lib/resilience/settings.ts` | بودجهٔ پیشفرض **انتظار در صف**: مدتزمانی که یک درخواست میتواند برای یک جایگاه ارائهدهنده منتظر بماند و در صف باقی بماند، پیش از آنکه رد شود و هرگز به سرویس بالادستی نرسد. بهمحض شروع اجرای کار، تایمر پاک میشود — اجرای آن بهطور جداگانه توسط `RATE_LIMIT_EXECUTION_MAX_WAIT_MS` محدود میشود. متغیر محیطی فقط مقدار پیشفرض را تعیین میکند: مقدار ذخیرهشدهٔ `resilienceSettings.requestQueue.maxWaitMs` و سپس مقدار مختص هر اتصالِ `rateLimitOverrides.maxWaitMs`، هرکدام بر آن اولویت دارند. |
| `RATE_LIMIT_EXECUTION_MAX_WAIT_MS` | `600000` (10 دقیقه) | `open-sse/services/rateLimitManager.ts` | سقف مدتزمانی که یک درخواست پذیرفتهشده میتواند در حال اجرا باقی بماند، پیش از آنکه رزرو محدودیت نرخ آن منقضی شود — این زمان از بودجهٔ انتظار در صف جدا شده است تا شروع کند واکشی در درگاههای غیرتدریجی باعث پایان مهلت نشود (#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` | فعال یا غیرفعالسازی اجباری شبکهٔ ایمنی فعالسازی خودکار محدودیت نرخ، مستقل از تنظیم ذخیرهشدهٔ داشبورد. برای فعالسازی اجباری مقادیر `true`/`1`/`on` و برای غیرفعالسازی اجباری مقادیر `false`/`0`/`off` را میپذیرد. |
| `PROVIDER_COOLDOWN_ENABLED` | _(تنظیمنشده ← غیرفعال)_ | `open-sse/services/providerCooldownTracker.ts` | ردیابی سراسری و اختیاری دورهٔ انتظار ارائهدهنده/اتصال در میان درخواستها. بهطور پیشفرض غیرفعال است (با دورهٔ انتظار اتصال / قطعکنندهٔ مدار ارائهدهنده همپوشانی دارد). برای فعالسازی مقادیر `true`/`1`/`on` را میپذیرد. |
| `PROVIDER_COOLDOWN_MIN_MS` | `5000` | `open-sse/services/providerCooldownTracker.ts` | حداقل دورهٔ انتظار (میلیثانیه) پیش از تلاش مجدد برای ارائهدهنده/اتصال ناموفق. این مقدار با شکستهای متوالی بهصورت نمایی افزایش مییابد. فقط هنگامی استفاده میشود که `PROVIDER_COOLDOWN_ENABLED` فعال باشد. |
| `PROVIDER_COOLDOWN_MAX_MS` | `300000` (5 دقیقه) | `open-sse/services/providerCooldownTracker.ts` | سقف حداکثر دورهٔ انتظار (میلیثانیه) پیش از تلاش مجدد برای ارائهدهنده/اتصال ناموفق، صرفنظر از شرایط دیگر. فقط هنگامی استفاده میشود که `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 میلیثانیه) نگه میدارد تا قطعی _پیش از commit_ — قطعیای که پیش از رسیدن هر بایت به کلاینت رخ میدهد — دوباره باز شده و بدون اطلاع کاربر مجدداً امتحان شود. **چه زمانی فعال شود:** برای سرویسهای بالادستی ناپایدار یا سرویسهایی که اغلب در آغاز جریان با صفر بایت قطع میشوند؛ اگر نمیتوانید افزایش حداکثر 750 میلیثانیهای زمان رسیدن نخستین توکن را در هر جریان تحمل کنید، آن را غیرفعال نگه دارید. مقادیر `true`/`1`/`on` را میپذیرد. تنظیم ذخیرهشدهٔ تابآوری را مقداردهی اولیه میکند؛ پس از تنظیم گزینهٔ داشبورد، آن گزینه اولویت دارد. |
| `STREAM_RECOVERY_MIDSTREAM_ENABLED` | _(تنظیمنشده → خاموش)_ | `src/lib/resilience/settings.ts` (مقدار اولیه) → `open-sse/services/streamRecovery.ts` (منطق) | **چیست:** ادامهدادن در میانهٔ استریم (فاز 4.4) — پس از یک قطعشدن _بعد از commit_ (بایتها قبلاً به کلاینت رسیدهاند)، با استفاده از متن ناقص بهعنوان پیشپرکنندهٔ assistant، درخواست را دوباره ارسال میکند و پسوند ازدسترفته را به آن متصل میکند. فقط برای استریمهای متن سادهٔ سازگار با OpenAI؛ اگر فراخوانی ابزاری در حال اجرا باشد، هرگز فعال نمیشود. **چه زمانی فعال شود:** برای تولیدهای طولانی که در میانهٔ پاسخ قطع میشوند و میپذیرید که بخش بازیابیشده بهجای رسیدن توکنبهتوکن، یکباره دریافت شود. مستقل از `STREAM_RECOVERY_ENABLED` است (پروفایل ریسک متفاوت). مقادیر `true`/`1`/`on` را میپذیرد. |
| `STREAM_THROUGHPUT_WATCHDOG_ENABLED` | _(تنظیمنشده → خاموش)_ | `src/lib/resilience/settings.ts` → `open-sse/services/throughputWatchdog.ts` | ناظر اختیاری خروجی مفید برای استریم فعال. استریمهایی را شناسایی میکند که همچنان قطعه ارسال میکنند، اما نرخ خروجی assistant آنها پایینتر از مقدار پیکربندیشده باقی میماند؛ heartbeatها، رویدادهای usage، دلتاهای خالی و مراحل ابزار/reasoning بهاشتباه بهعنوان پیشرفت در نظر گرفته نمیشوند. مستقل از مهلتهای زمانی بیکاری و ضربالاجل قطعی است. |
| `STREAM_THROUGHPUT_WATCHDOG_WARMUP_MS` | `30000` | `src/lib/resilience/settings/normalize.ts` | دورهٔ مهلت پیش از ارزیابی توان عملیاتی، محدود به 0 تا 600000 میلیثانیه. |
| `STREAM_THROUGHPUT_WATCHDOG_WINDOW_MS` | `30000` | `src/lib/resilience/settings/normalize.ts` | پنجرهٔ متحرک خروجی مفید، محدود به 1000 تا 600000 میلیثانیه؛ پیش از لغو، تکمیل یک پنجرهٔ کامل الزامی است. |
| `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` | فاصلهٔ پلکانی (میلیثانیه) میان بررسیهای سلامت توکن ارائهدهندگان هنگام راهاندازی. |
| `HEALTHCHECK_JITTER_MIN_MS` | `500` | `src/lib/tokenHealthCheck.ts` | حداقل تأخیر تصادفی (میلیثانیه) که برای جلوگیری از هجوم ناگهانی درخواستها، علاوه بر `HEALTHCHECK_STAGGER_MS` میان بررسیهای سلامت توکن ارائهدهندگان افزوده میشود (Issue #1220). |
| `HEALTHCHECK_JITTER_MAX_MS` | `5000` | `src/lib/tokenHealthCheck.ts` | حداکثر تأخیر تصادفی (میلیثانیه) که برای جلوگیری از هجوم ناگهانی درخواستها، علاوه بر `HEALTHCHECK_STAGGER_MS` میان بررسیهای سلامت توکن ارائهدهندگان افزوده میشود (Issue #1220). |
| `HEALTHCHECK_BATCH_SIZE` | `20` | `src/lib/tokenHealthCheck.ts` | اندازهٔ دستهٔ بررسیهای همزمان برای پیمایش بررسی سلامت توکن هنگام راهاندازی؛ مقادیر بزرگتر اتصالهای بیشتری را بهصورت موازی بررسی میکنند و مقادیر کوچکتر بار ناگهانی را کاهش میدهند (Issue #7875، پسرفت #7719). |
| `REQUEST_RETRY` | `2` | `src/sse/services/cooldownAwareRetry.ts` | تعداد تلاشهای مجدد خودکار در پاسخهای cooldown مختص مدل، پیش از بازگرداندن خطا به کلاینت. |
| `MAX_RETRY_INTERVAL_SEC` | `30` | `src/sse/services/cooldownAwareRetry.ts` | حداکثر فاصلهٔ پسنشینی (ثانیه) بین تلاشهای مجدد پس از دورهٔ انتظار. صرفنظر از مقدار بالادستی `Retry-After`، به این مقدار محدود میشود. |
| `HEADROOM_URL` | `http://localhost:8787` | `src/lib/headroom/detect.ts` | نشانی پراکسی صرفهجویی در توکن Headroom. چرخهٔ حیات داشبورد (`api/headroom/*`) بهطور پیشفرض یک CLI محلی `headroom-ai` را روی رابط loopback اجرا میکند؛ فقط برای اشاره به یک پراکسی sidecar خارجی Docker آن را بازنویسی کنید. |
### ثابتهای تنظیم بازیابی جریان
رفتار نگهداشت بازیابی با ثابتهای کدنویسیشده در
`open-sse/config/constants.ts` (`STREAM_RECOVERY`) تنظیم میشود که برای مرجع در اینجا آمدهاند —
تغییر آنها نیازمند ویرایش کد است، نه یک متغیر محیطی:
- `STREAM_RECOVERY.HOLDBACK_MS = 750` — مدتزمانی که پنجرهٔ آغازین SSE نگه داشته میشود
تا در صورت قطع زودهنگام، پیش از ثبت هر بایت برای کلاینت بتوان دوباره تلاش کرد.
- `STREAM_RECOVERY.BUFFER_MAX_BYTES = 65536` — سقف سخت پنجرهٔ نگهداشتهشده؛ بهمحض
انباشتهشدن این تعداد بایت، صرفنظر از زمانسنج، ثبت (تخلیه + عبور مستقیم) انجام میشود.
- `STREAM_RECOVERY.EARLY_RETRY_MAX = 4` — حداکثر تعداد بازگشاییهای شفاف جریان بالادستی
تا زمانی که دادهٔ نگهداشتهشده هنوز ثبت نشده است.
> **محدودیت نرخ پنجرهٔ لغزان بهازای هر ارائهدهنده (بدون متغیر محیطی):** _سازوکار جایگزین_
> محدودیت نرخ پنجرهٔ لغزان بهازای هر ارائهدهنده که از FCC منتقل شده، در کد وجود دارد
> (`open-sse/services/providerDefaultRateLimit.ts`، متصلشده از طریق
> `open-sse/services/rateLimitManager.ts`) اما با یک **نگاشت پیشفرض خالی** عرضه میشود
> و در حال حاضر **هیچ متغیر محیطی برای اپراتور ندارد** — این قابلیت فقط از طریق یک هوک آزمون /
> ویرایش کد فعال میشود. بهعمد در جدول بالا فهرست نشده است. محدودکنندهٔ رله بهازای هر
> `(token, IP)` که _دارای_ گزینهٔ تنظیم است، `RELAY_IP_PER_MINUTE` است (§3 شبکه و درگاهها).
---
## 22. اشکالزدایی
> [!CAUTION]
> این متغیرها خروجی **پرمفصل** تولید میکنند و ممکن است دادههای حساس را افشا کنند. **هرگز آنها را در محیط عملیاتی فعال نکنید.**
| متغیر | مقدار پیشفرض | فایل منبع | توضیحات |
| ------------------------------------- | ----------------------------------- | ----------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `CURSOR_DEBUG` | _(تنظیمنشده)_ | `open-sse/executors/cursor.ts` | برای فعالکردن گزارشهای پرجزئیات اجراکننده Cursor (قطعههای SSE رمزگشاییشده و غیره)، روی `1` تنظیم کنید. |
| `CURSOR_STREAM_DEBUG` | _(تنظیمنشده)_ | `open-sse/executors/cursor.ts` | نام مستعار سازگار با نسخههای قبلی برای `CURSOR_DEBUG`. |
| `CURSOR_DUMP_FILE` | _(تنظیمنشده)_ | `open-sse/executors/cursor.ts` | مسیر فایل اختیاری که هنگام `CURSOR_DEBUG=1` قطعههای خام و رمزگشاییشده Cursor را دریافت میکند. |
| `CURSOR_STREAM_TIMEOUT_MS` | `300000` | `open-sse/executors/cursor.ts` | مهلت بیکاری جریان (میلیثانیه) برای اجراکننده Cursor. |
| `CURSOR_KV_GRACE_MS` | `2000` | `open-sse/executors/cursor.ts` | بازه ارفاقی (میلیثانیه) پس از پایاندهنده نرم composer kv_after_text، هنگامی که هنوز بایتهایی در بافر باقی ماندهاند — به فراخوانی ابزار exec_mcp انتهایی فرصت میدهد تا فریم خود را کامل کند. |
| `CURSOR_TOOL_DIRECTIVE` | فعال (`!== "0"`) | `open-sse/executors/cursor.ts` | دستورالعمل ثبت ابزار که باعث میشود composer-2.5 فراخوانیهای ابزار را با اطمینان صادر کند. برای غیرفعالکردن، روی `0` تنظیم کنید. |
| `OMNIROUTE_SYSTEM_INSTRUCTION_APPEND` | _(تنظیمنشده)_ | `open-sse/translator/request/claude-to-openai.ts`, `open-sse/translator/response/openai-to-claude.ts` | متن اعلان سیستمی تعریفشده توسط اپراتور که پس از ترجمه به پیام سیستمی افزوده میشود (تزریق پس از ترجمه) و به مسیرهای codex/Responses و `/v1/messages` میرسد. همچنین بهعنوان پیشوند دستورالعملی استفاده میشود که از بلوکهای مقدمه سیستمی بازتابشده حذف میگردد. برای غیرفعالماندن، آن را تنظیم نکنید. |
| `OMNIROUTE_STRIP_SYSTEM_PREAMBLE` | `0` (خاموش) | `open-sse/translator/response/openai-to-claude.ts`, `open-sse/utils/directivePreambleStripper.ts` | برای حذف بلوکهای مقدمه اعلان سیستمی بازتابشده از ابتدای یک جریان openai→claude، روی `1` تنظیم کنید. بهطور پیشفرض خاموش است — روشهای اکتشافی بر اساس نثر انگلیسی طراحی شدهاند و محتوای پاسخ را تغییر میدهند؛ بنابراین پاسخی که بهطور مجاز با چنین بخشی آغاز شود، آن را از دست خواهد داد. |
| `CURSOR_IMAGE_FETCH_TIMEOUT_MS` | `15000` | `open-sse/utils/cursorImages.ts` | مهلت واکشی هر تصویر (میلیثانیه) برای ورودی بینایی راهدور `image_url`. |
| `CURSOR_STATE_DB_PATH` | _(کاوششده)_ | `open-sse/utils/cursorVersionDetector.ts` | جستوجوی پایگاه داده وضعیت Cursor IDE را که برای تشخیص نسخه IDE استفاده میشود، بازنویسی میکند. |
| `CURSOR_AGENT_CLI_VERSION` | _(تشخیص / تثبیت)_ | `open-sse/utils/cursorAgentCliVersion.ts` | شناسه ساخت Agent CLI با قالب (`YYYY.MM.DD-`) برای `x-cursor-client-version: cli-…` در Agent Run. |
| `CURSOR_AGENT_BIN` | _(تنظیمنشده)_ | `open-sse/handlers/imageGeneration/providers/cursorAgentImage.ts` | مسیر فایل اجرایی Cursor Agent که برای تولید تصویر استفاده میشود. اگر تنظیم نشده باشد، کنترلگر ابتدا از `providerSpecificData.agentBin` و سپس PATH استفاده میکند. |
| `CURSOR_IMG_TIMEOUT_MS` | `210000` | `open-sse/handlers/imageGeneration/providers/cursorAgentImage.ts` | زمان سپریشده مجاز برای هر تصویر (میلیثانیه) در کارهای تصویری Cursor Agent. |
| `CURSOR_IMG_MAX_CONCURRENT` | `2` | `open-sse/handlers/imageGeneration/providers/cursorAgentImage.ts` | محدودکننده همزمانی مجوز اشتراکی برای کارهای تصویری Cursor. |
| `CURSOR_IMG_MODEL` | درخواست / `auto` | `open-sse/handlers/imageGeneration/providers/cursorAgentImage.ts` | بازنویسی `--model` در Cursor CLI برای کارهای تصویری. |
| `UC_IMAGE_POLL_INTERVAL_MS` | `2000` | `open-sse/handlers/imageGeneration/providers/ucImage.ts` | تناوب نظرسنجی نتیجه تولید تصویر UC (uncensored.com) (میلیثانیه). |
| `UC_IMAGE_POLL_TIMEOUT_MS` | `60000` | `open-sse/handlers/imageGeneration/providers/ucImage.ts` | زمان سپریشده مجاز برای نظرسنجی نتیجه تولید تصویر UC (میلیثانیه). |
| `UC_VIDEO_POLL_INTERVAL_MS` | `3000` | `open-sse/handlers/videoGeneration/providers/ucVideo.ts` | تناوب نظرسنجی نتیجه تولید ویدئوی UC (uncensored.com) (میلیثانیه). |
| `UC_VIDEO_POLL_TIMEOUT_MS` | `300000` | `open-sse/handlers/videoGeneration/providers/ucVideo.ts` | زمان سپریشده مجاز برای نظرسنجی نتیجه تولید ویدئوی UC (میلیثانیه). |
| `CURSOR_DATA_DIR` | _(کاوششده)_ | `open-sse/utils/cursorAgentCliVersion.ts` | مسیر پوشه داده Cursor Agent CLI (`…/versions/`) را بازنویسی میکند؛ همان متغیری که عامل رسمی استفاده میکند. |
| `CURSOR_TOKEN` | _(تنظیمنشده)_ | `scripts/ad-hoc/cursor-tap.cjs` | توکن حامل مستقیم Cursor که ابزارهای توسعهدهنده از آن استفاده میکنند. |
| `OMNIROUTE_LOG_REQUEST_SHAPE` | غیرفعال (فعالسازی اختیاری با `"1"`) | `src/app/api/v1/chat/completions/route.ts` | هنگامی که روی `"1"` تنظیم شود، نشانگرهای نوع/طول محتوا را برای محمولههای بزرگ گفتوگو ثبت میکند. برای کاهش شلوغی گزارشها، بهطور پیشفرض خاموش است. |
| `DEBUG_RESPONSES_SSE_TO_JSON` | _(تنظیمنشده)_ | `open-sse/handlers/responseTranslator.ts` | برای ثبت جزئیات ترجمه SSE→JSON در Responses API، روی `true` تنظیم کنید. |
| `DEBUG_CLAUDE_NONSTREAM` | _(تنظیمنشده)_ | `open-sse/handlers/responseTranslator.ts` | برای آشکارکردن قطعههای خالی textContent در مسیر ترجمه پاسخ Claude، روی `true` تنظیم کنید (فقط برای اشکالزدایی). |
| `NEXT_PUBLIC_OMNIROUTE_E2E_MODE` | _(تنظیمنشده)_ | زیرساخت آزمون E2E | برای فعالکردن حالت آزمون E2E (احراز هویت آسانگیرانه، قلابهای آزمون)، روی `true` تنظیم کنید. |
---
## 23. یکپارچهسازی GitHub
به کاربران اجازه دهید مشکلات را مستقیماً از Dashboard گزارش کنند.
| متغیر | پیشفرض | فایل منبع | توضیحات |
| --------------------- | ------------- | --------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `GITHUB_ISSUES_REPO` | _(تنظیمنشده)_ | `src/app/api/v1/issues/report/route.ts` | مخزن با قالب `owner/repo`. |
| `GITHUB_ISSUES_TOKEN` | _(تنظیمنشده)_ | `src/app/api/v1/issues/report/route.ts` | GitHub Personal Access Token با حوزهٔ دسترسی `issues:write`. |
| `GITHUB_TOKEN` | _(تنظیمنشده)_ | ابزارهای اولویتبندی مشکلات / عامل ابری | توکن عمومی دسترسی GitHub که بهعنوان جایگزین `GITHUB_ISSUES_TOKEN` استفاده میشود و ابزارهای عامل ابری در `src/lib/cloudAgent/*` نیز از آن استفاده میکنند. |
---
## سناریوهای استقرار
برای راهنمای 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` بهترین زماناجرای نصبشده را متناسب با سیستمعامل میزبان انتخاب میکند (Apple Container/OrbStack در macOS، WSL Container در Windows و Podman در Linux) و در صورت نیاز به 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. |
| `ALIBABA_CODING_PLAN_QUOTA_URL` | مشتقشده از میزبان | `open-sse/services/bailianQuotaFetcher.ts` | بازنویسی URL کامل سهمیه برای Alibaba Bailian. |
| `QWEN_CLOUD_COOKIE` | _(تنظیمنشده)_ | `open-sse/services/qwenTokenPlanQuotaFetcher.ts` | کوکی نشست کنسول برای درگاه سهمیهٔ Token Plan شخصی Qwen Cloud / Model Studio (کلید API استنتاج نمیتواند آن را بخواند). کل هدر درخواست `Cookie` را — که شامل `login_qwencloud_ticket` است — از هر فراخوانی `api.json` به `cs-data.qwencloud.com` در home.qwencloud.com › Billing › Subscription (F12 › Network) کپی کنید. حساس و مختص نشست است؛ ترجیحاً از فیلد `qwenCloudCookie` در داشبورد برای هر اتصال استفاده کنید. |
| `QWEN_CLOUD_SEC_TOKEN` | _(تنظیمنشده)_ | `open-sse/services/qwenTokenPlanQuotaFetcher.ts` | بازنویسی دستی `sec_token` برای درگاه کنسول Token Plan. حساس است؛ در صورت تنظیمنبودن، دریافتکننده با استفاده از کوکی آن را از HTML داشبورد استخراج میکند. |
| `QWEN_TOKEN_PLAN_HOST` | `https://cs-data.qwencloud.com` | `open-sse/services/qwenTokenPlanQuotaFetcher.ts` | بازنویسی میزبان درگاه برای دریافتکنندهٔ سهمیهٔ Token Plan شخصی (برای مثال، `bailian-singapore-cs.alibabacloud.com` برای کنسول Model Studio). |
| `QWEN_TOKEN_PLAN_DASHBOARD_URL` | `https://home.qwencloud.com/` | `open-sse/services/qwenTokenPlanQuotaFetcher.ts` | URL داشبورد که برای استخراج `sec_token` از HTML واردشده به حساب استفاده میشود. |
| `XIAOMI_MIMO_CONSOLE_COOKIE` | _(تنظیمنشده)_ | `open-sse/services/usage/xiaomi-mimo.ts` | کوکی نشست کنسول برای API سهمیهٔ Xiaomi MiMo Token Plan (`platform.xiaomimimo.com/api/v1/tokenPlan/usage` + `tokenPlan/detail` — کلید API استنتاج نمیتواند آن را بخواند). کل هدر درخواست `Cookie` را — که شامل `api-platform_serviceToken` و `userId` است — از هر درخواستی به `platform.xiaomimimo.com` در صفحهٔ Token Plan (F12 › Network) کپی کنید. حساس و مختص نشست است؛ ترجیحاً از فیلد `xiaomiMimoConsoleCookie` در داشبورد برای هر اتصال استفاده کنید. |
| `XIAOMI_MIMO_MONTHLY_TOKEN_LIMIT` | `4100000000` | `open-sse/services/usage/xiaomi-mimo.ts` | بودجهٔ ماهانه (Credits) برای مسیر جایگزین Xiaomi MiMo که توسط OmniRoute ردیابی میشود و زمانی استفاده میشود که هیچ کوکی کنسولی پیکربندی نشده باشد. مقدار پیشفرض، 4.1B مربوط به سطح Lite است؛ آن را برابر Credits طرح تنظیم کنید (Standard 11B / Pro 38B / Max 82B). مقدار بازنویسی `providerSpecificData.monthlyTokenLimit` در سطح هر اتصال، بر این متغیر محیطی اولویت دارد. |
| `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` | مسیر اختیاری به یک فایل JSON محلی برای بازنویسی فهرست مجاز داخلی مدلهای متنی سطح رایگان Alibaba. در صورت عدم دسترسی، ابتدا از `$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 > متغیر محیطی > مقدار پیشفرض؛ اگر در دسترس نباشد، سرویس از مقدار خام متغیر محیطی استفاده میکند. |
| `COMMAND_CODE_CALLBACK_PORT` | _(تنظیمنشده)_ | `src/app/api/providers/command-code/auth/shared.ts` | پورت محلی مورد استفاده برای فراخوانیهای بازگشتی به سبک OAuth از ابزار کمکی Command Code CLI. |
| `COMMAND_CODE_VERSION` | `0.33.2` | `open-sse/executors/commandCode.ts` | مقداری که بهعنوان هدر `x-command-code-version` به سرویس بالادستی Command Code ارسال میشود. برای ارتقای نسخه CLI آن را بازنویسی کنید. |
| `COMMANDCODE_API_URL` | `https://api.commandcode.ai` | `open-sse/services/usage/command-code.ts` | نشانی URL پایه برای سرویس بالادستی مصرف/سهمیه Command Code که تلهمتری دریافت سهمیه گوشی هوشمند از آن استفاده میکند. برای استفاده از یک API خودمیزبان یا جایگزین Command Code آن را بازنویسی کنید. |
| `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` | مهلت زمانی بیکاری سوکت (میلیثانیه) برای اتصالهای پراکسیشده؛ سوکتهایی که بیش از این مدت بیکار بمانند، برای جلوگیری از نشت تونلهای نیمهباز قطع میشوند. |
| `BRIDGE_PORT` | `20129` | `bin/antigravity-bridge.mjs` | درگاهی که پل MITM مربوط به Antigravity روی آن گوش میدهد. |
| `ROUTER_URL` | `http://127.0.0.1:20128/v1/antigravity` | `bin/antigravity-bridge.mjs` | نقطه پایانی مسیریاب که پل، ترافیک Antigravity را به آن هدایت میکند. |
| `CERT_DIR` | `/mitm` | `bin/antigravity-bridge.mjs` | دایرکتوریای را که پل، دادههای TLS خود را از آن میخواند بازنویسی میکند. مدل گواهی همانند سرور AgentBridge انتخاب میشود: `server.crt`/`server.key` برای نصب قدیمی با گواهی برگ، و در غیر این صورت `ca.crt`/`ca.key` (CA ریشه و یک گواهی برگ برای هر میزبان رهگیریشده؛ با `MITM_ROOT_CA_ENABLED=true` اجباری میشود). اگر فایلهای مدل فعال موجود نباشند، پل هنگام راهاندازی خارج میشود. |
| `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` | برای حذف `sudo` ابتدایی از فرمانهای اعتماد به گواهی MITM، آن را روی `1` (مقدار truthy) تنظیم کنید — مناسب استقرارهای بدون root / دارای فضای نام کاربر که در آنها اپراتور بهصورت دستی به CA اعتماد میکند (برای مثال، از طریق سازوکار extra-CA-certs در Node). |
| `SKIP_ANTIGRAVITY_DNS` | _(تنظیمنشده)_ | `src/mitm/dns/provision.ts` | برای صرفنظر کامل از فراهمسازی ورودیهای DNS در `/etc/hosts` برای نامهای میزبان پراکسی Antigravity، آن را روی `true` تنظیم کنید — مناسب کانتینرهایی که به sudo/root دسترسی ندارند. |
| `OMNIROUTE_SKIP_DNS_WRITE` | _(تنظیمنشده)_ | `src/mitm/dns/dnsConfig.ts` | برای صرفنظر از نوشتن در فایل hosts هنگام افزودن/حذف ورودیهای DNS، آن را روی `1` تنظیم کنید — مناسب محیطهای آزمایشی sandbox یا فقطخواندنی. |
| `OMNIROUTE_SKIP_SYSTEM_TRUST` | `0` | `src/mitm/cert/install.ts`, `src/mitm/tproxy/caTrust.ts` | محافظ مخصوص تست/CI: آن را روی `1` تنظیم کنید تا نصب/حذف اعتماد به گواهی به عملیاتی بیاثر تبدیل شود و مجموعهٔ تست هرگز مخزن اعتماد سیستمعامل را تغییر ندهد. این مقدار بهطور خودکار توسط راهاندازی تست و گردشکارهای CI تنظیم میشود. |
| `CHANGELOG_BASE_REF` | _(خودکار)_ | `scripts/check/check-changelog-integrity.mjs` | مرجع پایهٔ صریح برای دروازهٔ جلوگیری از حذف محتوای CHANGELOG (مقدار پیشفرض، شاخهٔ پایهٔ PR در CI یا بالاترین `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` | فاصلهٔ زمانی همگامسازی خودکار بر حسب میلیثانیه (پیشفرض ۳۰ دقیقه). |
| `FREE_PROXY_1PROXY_ENABLED` | `true` | `src/lib/freeProxyProviders/oneproxy.ts` | منبع پراکسی رایگان 1proxy را فعال میکند. برای غیرفعالکردن، آن را روی `false` تنظیم کنید. |
| `FREE_PROXY_1PROXY_API_URL` | _(به oneproxy.ts مراجعه کنید)_ | `src/lib/freeProxyProviders/oneproxy.ts` | مقدار جایگزین URL مربوط به API سرویس 1proxy. |
| `FREE_PROXY_1PROXY_MAX` | `500` | `src/lib/freeProxyProviders/oneproxy.ts` | حداکثر تعداد پراکسیهای دریافتشده از 1proxy در هر همگامسازی. |
| `FREE_PROXY_1PROXY_MIN_QUALITY` | `50` | `src/lib/freeProxyProviders/oneproxy.ts` | حداقل آستانه امتیاز کیفیت برای وارد کردن از 1proxy. |
| `FREE_PROXY_PROXIFLY_ENABLED` | `true` | `src/lib/freeProxyProviders/proxifly.ts` | فعالسازی منبع پروکسی رایگان Proxifly. برای غیرفعال کردن روی `false` تنظیم کنید. |
| `FREE_PROXY_PROXIFLY_QUANTITY` | `100` | `src/lib/freeProxyProviders/proxifly.ts` | تعداد پروکسیهایی که در هر همگامسازی Proxifly دریافت میشوند. |
| `FREE_PROXY_PROXIFLY_ANONYMITY` | `elite` | `src/lib/freeProxyProviders/proxifly.ts` | فیلتر سطح ناشناسبودن برای Proxifly (`elite`، `anonymous`، `transparent`). |
| `FREE_PROXY_IPLOCATE_ENABLED` | `false` | `src/lib/freeProxyProviders/iplocate.ts` | فعالسازی منبع پروکسی رایگان IPLocate. فقط با انتخاب صریح فعال میشود. |
| `FREE_PROXY_IPLOCATE_BASE_URL` | `https://raw.githubusercontent.com/iplocate/free-proxy-list/main/protocols` | `src/lib/freeProxyProviders/iplocate.ts` | بازنویسی URL پایه فهرست پروکسی IPLocate. |
| `FREE_PROXY_WEBSHARE_ENABLED` | `true` | `src/lib/freeProxyProviders/webshare.ts` | فعالسازی منبع مجموعه پروکسی Webshare. برای غیرفعال کردن روی `false` تنظیم کنید؛ همچنین لازم است `FREE_PROXY_WEBSHARE_API_KEY` تنظیم شده باشد. |
| `FREE_PROXY_WEBSHARE_API_KEY` | _(هیچکدام)_ | `src/lib/freeProxyProviders/webshare.ts` | توکن API حساب Webshare (`Authorization: Token `). الزامی است — بدون آن، ارائهدهنده غیرفعال باقی میماند. |
| `FREE_PROXY_WEBSHARE_API_URL` | `https://proxy.webshare.io/api/v2/proxy/list/` | `src/lib/freeProxyProviders/webshare.ts` | بازنویسی URL مربوط به API فهرست پروکسی Webshare. |
| `FREE_PROXY_WEBSHARE_MAX` | `500` | `src/lib/freeProxyProviders/webshare.ts` | حداکثر تعداد پروکسیهای واردشده در هر همگامسازی Webshare. |
| `NEXT_PUBLIC_VERCEL_RELAY_ENABLED` | `true` | `src/app/(dashboard)/…/ProxyPoolTab.tsx` | نمایش/پنهانکردن دکمهٔ استقرار Vercel Relay در زبانهٔ Proxy Pool. |
| `VERCEL_API_BASE` | `https://api.vercel.com` | `src/app/api/settings/proxy/vercel-deploy/route.ts` | بازنویسی نشانی پایهٔ API مربوط به Vercel (برای آزمایش). |
| `NEXT_PUBLIC_VERCEL_RELAY_DEFAULT_PROJECT` | `omniroute-relay` | `src/app/(dashboard)/…/VercelRelayModal.tsx` | نام پیشفرض پروژه که از قبل در پنجرهٔ استقرار Vercel Relay وارد میشود. |
| `TAILSCALE_BIN` | _(تشخیص خودکار)_ | `src/lib/tailscaleTunnel.ts` | مسیر صریح فایل اجرایی `tailscale`. |
| `TAILSCALED_BIN` | _(تشخیص خودکار)_ | `src/lib/tailscaleTunnel.ts` | مسیر صریح فایل اجرایی سرویس پسزمینهٔ `tailscaled`. |
| `TAILSCALE_AUTHKEY` | _(تنظیمنشده)_ | `src/lib/tailscaleTunnel.ts` | کلید احراز هویت ازپیشاشتراکگذاشتهشدهٔ Tailscale برای اجرای غیرتعاملی / بدون رابط کاربری `tailscale up` (از طریق `--auth-key=` ارسال میشود). در صورت تنظیمنبودن، ورود از نشانی احراز هویت تعاملی مرورگر استفاده میکند. |
| `NGROK_AUTHTOKEN` | _(تنظیمنشده)_ | `src/lib/ngrokTunnel.ts` | تونلهای خروجی ngrok را احراز هویت میکند. |
| `DB_BACKUP_MAX_FILES` | `20` | `src/lib/db/backup.ts` | حداکثر تعداد فایلهای پشتیبان SQLite که هنگام پاکسازی پشتیبانهای دستی/زمانبندیشده نگهداری میشوند. اسنپشاتهای مهاجرت بر اساس محتوا آدرسدهی میشوند و برای وضعیت یکسان پایگاه داده مجدداً استفاده میشوند؛ این اسنپشاتها در بازهٔ مهاجرت همزمان حذف نمیشوند. مقدار ذخیرهشده در تنظیمات ← نگهداری نسخهٔ پشتیبان پایگاه داده را بازنویسی میکند. |
| `DB_BACKUP_RETENTION_DAYS` | `0` | `src/lib/db/backup.ts` | حداکثر سن (به روز) فایلهای نگهداریشده هنگام پاکسازی پشتیبانهای دستی/زمانبندیشده. `0` حذف بر اساس سن را غیرفعال میکند. اسنپشاتهای مهاجرت در بازهٔ مهاجرت همزمان حذف نمیشوند. مقدار ذخیرهشده در تنظیمات ← نگهداری نسخهٔ پشتیبان پایگاه داده را بازنویسی میکند. |
| `OMNIROUTE_BACKUP_SCHEDULE_JOB_INTERVAL_MS` | `30000` | `src/lib/jobs/backupScheduleJob.ts` | فاصلهٔ زمانی هر اجرای دورهای (میلیثانیه) برای کار سمت سرور که `backup-schedule.json` را اجرا میکند. این مقدار باید بسیار کمتر از دقت یکدقیقهای 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` | رشتهٔ اتصال Redis که هنگام `QUOTA_STORE_DRIVER=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` | ضریب امتیاز (0..1) که هنگام خاموش بودن قطع پیشبررسی سهمیه (#4540)، در امتیازدهی ترکیبی خودکار روی ارائهدهندهٔ فاقد ظرفیت (`credits_exhausted`/`rate_limited`) اعمال میشود. |
| `QUOTA_CONSUMPTION_RETENTION_DAYS` | `14` | `src/lib/db/quotaConsumption.ts` | بازهٔ نگهداری (به روز) برای باکتهای `quota_consumption` پیش از جمعآوری زباله (`gcQuotaConsumption`). |
| `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` | سقف اندازهٔ پنل (محدودشده به 1–10) برای گونهٔ پخش همگانی `auto/*:chaos` — یک درخواست حداکثر به این تعداد مدل از ارائهدهندگان مختلف ارسال میشود. |
| `OMNIROUTE_CHAOS_MIN_PANEL` | _(پیشفرض موتور)_ | `open-sse/services/autoCombo/virtualFactory.ts` | تنظیم حداقل اندازه پنل که به کنترلکننده پخش chaos ارسال میشود؛ تنظیمنکردن آن، مقدار پیشفرض موتور را حفظ میکند. |
| `OMNIROUTE_CHAOS_PANEL_TIMEOUT_MS` | _(پیشفرض موتور)_ | `open-sse/services/autoCombo/virtualFactory.ts` | مهلت زمانی قطعی (میلیثانیه) برای کل توزیع پنل chaos؛ تنظیمنکردن آن، مقدار پیشفرض موتور را حفظ میکند. |
| `GROK_AUTH_PATH` | `~/.grok/auth.json` | `open-sse/services/grokQuotaFetcher.ts` | مسیر فایل `auth.json` متعلق به Grok CLI که برای دریافت سهمیه هفتگی grok-web استفاده میشود؛ برای آزمایشها یا نصب غیراستاندارد CLI آن را بازنویسی کنید. |
| `AGENTBRIDGE_UPSTREAM_CA_CERT` | _(تنظیمنشده)_ | `src/mitm/manager.ts` | گواهی CA اضافی (PEM) که برای اتصالهای TLS بالادستی AgentBridge مورد اعتماد است. |
| `INSPECTOR_BUFFER_SIZE` | `1000` | `src/mitm/inspector/buffer.ts` | حداکثر تعداد درخواستهای ثبتشده که در بافر حلقوی Traffic Inspector نگهداری میشوند. |
| `INSPECTOR_MAX_BODY_KB` | `1024` | `src/mitm/inspector/buffer.ts` | حداکثر اندازه بدنه درخواست/پاسخ ثبتشده (KB) پیش از کوتاهسازی. |
| `INSPECTOR_HTTP_PROXY_PORT` | `8080` | `src/mitm/inspector/httpProxyServer.ts` | پورت محلی پراکسی HTTP مربوط به Traffic Inspector. |
| `INSPECTOR_HTTP_PROXY_AUTOSTART` | `false` | `src/mitm/inspector/httpProxyServer.ts` | راهاندازی خودکار پراکسی HTTP بازرس هنگام بوت. |
| `INSPECTOR_LLM_HOSTS_EXTRA` | _(تنظیمنشده)_ | `src/lib/inspector/captureState.ts` | نامهای میزبان اضافی (جداشده با ویرگول) که برای ثبت، بهعنوان نقاط پایانی LLM در نظر گرفته میشوند. |
| `INSPECTOR_MASK_SECRETS` | `true` | `src/mitm/inspector/buffer.ts` | پنهانسازی اطلاعات محرمانه (هدرهای احراز هویت / کلیدهای API) در ترافیک ثبتشده. |
| `INSPECTOR_SYSTEM_PROXY_GUARD_MINUTES` | `30` | `src/app/api/tools/traffic-inspector/capture-modes/system-proxy/route.ts` | تعداد دقیقهها پیش از آنکه محافظ system-proxy تنظیمات پراکسی سیستمعامل را بهطور خودکار بازگرداند. |
| `INSPECTOR_INTERNAL_INGEST_TOKEN` | _(خودکار)_ | `src/app/api/tools/traffic-inspector/internal/ingest/route.ts` | توکن احراز هویت برای ورود دادههای ضبطشده داخلی به 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` | کلید اصلی توقف اضطراری برای پراکسی sidecar مربوط به bifrost. وقتی روی `0` تنظیم شود، مسیر پاسخ 503 را با هدر `X-Bifrost-Killswitch` برمیگرداند و اپراتور به مسیر TS هدایت میشود. از این گزینه برای غیرفعالکردن sidecar بدون استقرار مجدد استفاده کنید (رخداد روتر سطح ۱، چرخش کلید). |
| `BIFROST_BASE_URL` | _(تنظیمنشده)_ | `src/app/api/v1/relay/chat/completions/bifrost/route.ts` | در صورت تنظیم، مسیر پراکسی sidecar مربوط به Bifrost، ترافیک `/v1/chat/completions` را بهجای کنترلگر relay در TS به این دروازه Go هدایت میکند. تنظیمنشده ← 503 همراه با fallback. اسلش انتهایی حذف میشود. |
| `BIFROST_PORT` | `8080` | `src/lib/services/bootstrap.ts` | پورتی که سرویس تعبیهشده و تحت نظارت Bifrost هنگام مدیریت چرخهٔ عمر sidecar مربوط به Bifrost توسط OmniRoute به آن متصل میشود (`127.0.0.1:`). مقدار پیشفرض `8080` است. |
| `LLMLINGUA_PORT` | `20135` | `src/lib/services/bootstrap.ts` | پورتی که سرویس فشردهسازی تحت نظارت LLMLingua به آن متصل میشود (`127.0.0.1:`). مقدار پیشفرض `20135` است. |
| `LLMLINGUA_BASE_URL` | `http://127.0.0.1:20135` | `open-sse/services/compression/engines/llmlingua/index.ts` | URL پایه برای daemon محلی میکروسرویس فشردهسازی HTTP مربوط به LLMLingua. مقدار پیشفرض `http://127.0.0.1:20135` است. |
| `LLMLINGUA_MODEL` | `atjsh/llmlingua-2-js-tinybert-meetingbank` | `src/lib/services/installers/llmlingua.ts` | شناسهٔ مدل Hugging Face که sidecar تحت نظارت LLMLingua بارگذاری میکند (به محیط پردازش فرزند ارسال میشود). |
| `BIFROST_API_KEY` | _(تنظیمنشده)_ | `src/app/api/v1/relay/chat/completions/bifrost/route.ts` | کلید API برای دروازه Bifrost (بهصورت `Authorization: Bearer ...` ارسال میشود). اگر تنظیم نشده باشد، مسیر انتظار دارد درخواست دارای یک کلید API معتبر OmniRoute باشد؛ این کلید فقط برای احراز هویت سمت دروازه است. |
| `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 (برحسب میلیثانیه). در صورت پایان مهلت، مسیر از طریق هدر `X-Bifrost-Fallback` مسیر رله TS را بازمیگرداند. |
| `OMNIROUTE_BIFROST_KEY` | _(تنظیمنشده)_ | `src/app/api/v1/relay/chat/completions/bifrost/route.ts` | نام مستعار `BIFROST_API_KEY` (مورد استفاده اسکریپتهایی که متغیرهای محیطی را از طریق `OMNIROUTE_*` میخوانند). اگر هر دو تنظیم شده باشند، `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)؛ `auto` در صورت تنظیمبودن `BIFROST_BASE_URL` و `BIFROST_ENABLED` ≠ `0`، 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` | دوره انتظار (برحسب میلیثانیه) پس از ناموفقبودن یک پرش به سایدکار Bifrost در حالت `auto`، پیش از آنکه رله دوباره سایدکار را امتحان کند؛ تا پایان دوره انتظار، درخواست مستقیماً به مسیر TS هدایت میشود و سپس دوباره سایدکار بررسی میشود. `0` آن را غیرفعال میکند. فقط وقتی `OMNIROUTE_RELAY_BACKEND=auto` باشد اعمال میشود. |
| `OMNIROUTE_TLS_CERT` | _(تنظیمنشده)_ | `bin/cli/commands/serve.mjs` | مسیر گواهی TLS با قالب PEM برای ارائه `omniroute serve` از طریق HTTPS (معادل `--tls-cert`). باید همراه با `OMNIROUTE_TLS_KEY` تنظیم شود؛ سپس سرور مستقل، TLS را روی همان شنونده خاتمه میدهد (`wss://` بدون تغییر کار میکند). تنظیمنشده ← HTTP ساده. ارائه تنها یکی از گواهی/کلید یا مسیری ناخوانا، هشداری ثبت میکند و سرور در حالت HTTP باقی میماند. |
| `OMNIROUTE_TLS_KEY` | _(تنظیمنشده)_ | `bin/cli/commands/serve.mjs` | مسیر کلید خصوصی TLS با قالب PEM برای HTTPS در `omniroute serve` (معادل `--tls-key`). باید همراه با `OMNIROUTE_TLS_CERT` تنظیم شود. به `OMNIROUTE_TLS_CERT` مراجعه کنید. |
| `OMNIROUTE_LOCAL_ENDPOINTS_ENABLED` | `0` | `src/lib/security/localEndpoints.ts` | کلید اصلی مسیرهای `/api/local/*`. وقتی تنظیم نشده یا مقدار آن `0` باشد، همه مسیرهای `/api/local/*` در محیط عملیاتی پاسخ 503 میدهند. برای فعالکردن راهانداز Redis و راهاندازهای مشابهِ تککلیکی سرویسهای محلی در استقرارهای غیرلوپبک، باید مقدار آن `1` باشد. این سازوکار در کنار طبقهبندی محافظ مسیر `isLocalOnlyPath()` بهعنوان حفاظت مضاعف عمل میکند (`LOCAL_ONLY_API_PREFIXES` در `src/server/authz/routeGuard.ts`). |
| `OMNIROUTE_LOCAL_ENDPOINTS_TOKEN` | _(تنظیمنشده)_ | `src/lib/security/localEndpoints.ts` | توکن Bearer برای فراخوانهای `/api/local/*` که روی لوپبک نیستند (برای مثال، برنامه دسکتاپ). در صورت تنظیم، درخواستهای IPهای غیرلوپبک باید دارای `Authorization: Bearer ` باشند. وقتی `OMNIROUTE_LOCAL_ENDPOINTS_ENABLED=1` در استقرارهای غیرلوپبک باشد، الزامی است. |
| `OMNIROUTE_REDIS_CONTAINER_NAME` | `omniroute-redis` | `bin/cli/commands/redis.mjs` | نام کانتینر برای راهانداز تککلیکی Redis (`omniroute redis up`). هم CLI و هم رابط گرافیکی `RedisLauncherPanel` از آن استفاده میکنند. |
| `OMNIROUTE_REDIS_HOST_PORT` | `6379` | `bin/cli/commands/redis.mjs` | پورت میزبان برای راهانداز تککلیکی Redis. اگر پورت 6379 از قبل روی میزبان در حال استفاده است، این مقدار را افزایش دهید. پورت داخلی کانتینر همچنان 6379 باقی میماند. |
| `OMNIROUTE_REDIS_BIND_HOST` | `127.0.0.1` | `bin/cli/commands/redis.mjs` | رابط میزبانی که راهانداز تککلیکی Redis روی آن منتشر میشود. راهانداز، Redis را بدون گذرواژه اجرا میکند؛ بنابراین، اتصال به `0.0.0.0` یک Redis بدون احراز هویت را در اختیار تمام میزبانهای LAN شما قرار میدهد — این محدوده را فقط زمانی گسترش دهید که خودتان برای نمونه نیز گذرواژهای تنظیم کرده باشید. |
| `REDIS_BIND_HOST` | `127.0.0.1` | `docker-compose.yml` | رابط میزبانی که docker-compose سایدکار Redis را روی آن منتشر میکند (#9286). Redis مربوط به compose بدون `requirepass` اجرا میشود؛ کانتینرهای برنامه از طریق شبکه compose (`redis:6379`) به آن دسترسی دارند — پورت منتشرشده فقط برای ابزارهای سمت میزبان وجود دارد. `0.0.0.0` یک Redis بدون احراز هویت را در معرض دسترسی کل LAN قرار میدهد. |
| `REDIS_PORT` | `6379` | `docker-compose.yml` | پورت میزبان برای سایدکار Redis مربوط به compose. |
| `APP_BIND_HOST` | `127.0.0.1` | `docker-compose.yml`, `docker-compose.prod.yml` | رابط میزبانی که docker-compose پورتهای داشبورد/API/live-WS خود برنامه را روی آن منتشر میکند (#12568). با توجه به اینکه `REQUIRE_API_KEY=false` بهعنوان مقدار پیشفرض `.env.example` ارائه میشود، `0.0.0.0` پراکسی ناشناس LLM در مسیر `/v1` را در معرض دسترسی کل LAN/WAN قرار میدهد — این محدوده را فقط زمانی گسترش دهید که `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` | پیشوند فضای نام که به تمام کلیدهای Redis مربوط به OmniRoute اعمال میشود (محدودکننده نرخ، کش احراز هویت، مخزن سهمیه، قطعکننده مدار گرمسازی). هنگامی که نمونه 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` | نوع فایل محرمانهٔ توکن سرویس داخلی: مسیر فایلی که محتوای trimشدهٔ آن، توکن است. فقط زمانی بررسی میشود که متغیر درونخطی تنظیم نشده باشد. |
| `OPENROUTER_PROVIDER_STATS_ENABLED` | `true` | `src/lib/catalog/openrouterProviderStats.ts` | فهرست ارائهدهندگان داشبورد را با آمار رتبهبندی هفتگی OpenRouter تکمیل میکند (#9324). بهطور پیشفرض فعال است؛ برای صرفنظر کامل از واکشی پسزمینه، آن را روی `false` تنظیم کنید (غیرمسدودکننده و هرگز بحرانی نیست). |
| `OPENROUTER_PROVIDER_STATS_TTL_MS` | `86400000` (24 ساعت) | `src/lib/catalog/openrouterProviderStats.ts` | TTL کش برای اسنپشات آمار ارائهدهندگان OpenRouter، بر حسب میلیثانیه. |
| `OMNIROUTE_REDIS_IMAGE` | `redis:7-alpine` | `bin/cli/commands/redis.mjs` | ایمیج Redis مورد استفادهٔ راهانداز یککلیکی Redis. در صورت نیاز، آن را با `redis:8-alpine` یا یک آینهٔ رجیستری خصوصی جایگزین کنید. |
| `QDRANT_HOST` | `qdrant` | _(پروفایل اختیاری کلاستر)_ | نام میزبان سایدکار Qdrant هنگامی که `--profile memory` فعال است. مقدار پیشفرض به نام سرویس qdrant درون شبکه اشاره میکند؛ برای استقرار خارجی آن را تغییر دهید. فقط زمانی استفاده میشود که `qdrantEnabled` در کد (`src/lib/memory/vectorStore.ts:108`) برابر با `true` باشد. |
| `QDRANT_PORT` | `6333` | _(پروفایل اختیاری کلاستر)_ | پورت REST سایدکار Qdrant. |
| `QDRANT_GRPC_PORT` | `6334` | _(پروفایل اختیاری کلاستر)_ | پورت gRPC سایدکار Qdrant. کتابخانههای کلاینتی که برای عملیات استریم، gRPC را به REST ترجیح میدهند از آن استفاده میکنند. |
| `QDRANT_API_KEY` | _(تنظیمنشده)_ | _(پروفایل اختیاری کلاستر)_ | کلید API اختیاری برای Qdrant Cloud یا یک نمونهٔ داخلی احرازهویتشده. خالی → هیچ هدر `api-key` ارسال نمیشود. |
| `QDRANT_COLLECTION` | `omniroute-memory` | _(پروفایل اختیاری کلاستر)_ | نام کالکشن برای embeddingهای حافظهٔ مکالمهٔ OmniRoute. در نخستین اجرا با ابعاد `QDRANT_VECTOR_SIZE` ایجاد میشود. |
| `QDRANT_EMBEDDING_MODEL` | `text-embedding-3-small` | _(پروفایل اختیاری کلاستر)_ | نام مدل embedding پیشفرض که در فرادادهٔ کالکشن Qdrant ثبت میشود. embeddingهای واقعی توسط هر ارائهدهندهای تولید میشوند که فیلد `embeddingModel` در تنظیمات OmniRoute به آن اشاره دارد. |
| `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` | تعداد خطاهای `429` در بازه `OMNIROUTE_ROTATE_429_WINDOW_SECONDS` که پیش از چرخش حساب لازم است. مقدار `1` (پیشفرض) حساب را بلافاصله میچرخاند و رفتار تاریخی را حفظ میکند. |
| `OMNIROUTE_ROTATE_429_WINDOW_SECONDS` | `120` | `open-sse/services/rotationConfig.ts` | پنجره لغزان (برحسب ثانیه) که طی آن خطاهای `429` برای رسیدن به `OMNIROUTE_ROTATE_429_THRESHOLD` شمارش میشوند. |
| `OMNIROUTE_ROTATE_ON_500` | `true` | `open-sse/services/rotationConfig.ts` | فعالسازی جایگزینی بهازای وضعیت برای خطاهای سرور `5xx` (بهاستثنای `502` که کلاس اختصاصی خود را دارد). وقتی `false` باشد، این خطاها دیگر باعث چرخش حساب نمیشوند. |
| `OMNIROUTE_ROTATE_500_THRESHOLD` | `1` | `open-sse/services/rotationConfig.ts` | تعداد خطاهای `5xx` در بازه `OMNIROUTE_ROTATE_500_WINDOW_SECONDS` که پیش از چرخش حساب لازم است. مقدار `1` (پیشفرض) حساب را بلافاصله میچرخاند. |
| `OMNIROUTE_ROTATE_500_WINDOW_SECONDS` | `120` | `open-sse/services/rotationConfig.ts` | پنجرهٔ لغزان (بر حسب ثانیه) که در آن خطاهای `5xx` برای رسیدن به `OMNIROUTE_ROTATE_500_THRESHOLD` شمارش میشوند. |
| `OMNIROUTE_ROTATE_ON_502` | `true` | `open-sse/services/rotationConfig.ts` | فعالسازی جایگزینی برای هر وضعیت در خطاهای `502` (درگاه نامعتبر). وقتی مقدار `false` باشد، خطاهای `502` دیگر باعث چرخش حساب نمیشوند. |
| `OMNIROUTE_ROTATE_502_THRESHOLD` | `1` | `open-sse/services/rotationConfig.ts` | تعداد خطاهای `502` در بازهٔ `OMNIROUTE_ROTATE_502_WINDOW_SECONDS` که پیش از چرخش حساب لازم است. مقدار `1` (پیشفرض) باعث چرخش فوری میشود. |
| `OMNIROUTE_ROTATE_502_WINDOW_SECONDS` | `120` | `open-sse/services/rotationConfig.ts` | پنجرهٔ لغزان (بر حسب ثانیه) که در آن خطاهای `502` برای رسیدن به `OMNIROUTE_ROTATE_502_THRESHOLD` شمارش میشوند. |
| `OMNIROUTE_ROTATE_ON_400` | `false` | `open-sse/services/rotationConfig.ts` | فعالسازی اختیاری (بهطور پیشفرض خاموش): وقتی مقدار `true` باشد، یک خطای سادهٔ `400` (درخواست نامعتبر) نیز باعث چرخش حساب میشود. این رفتار فقط افزایشی است — هرگز رفتار موجود موتور را مسدود نمیکند که طبق آن، یک خطای `400` حاوی متن مربوط به محدودیت نرخ/سهمیه، صرفنظر از این پرچم همچنان باعث تغییر مسیر میشود. |
| `OMNIROUTE_ROTATE_400_THRESHOLD` | `1` | `open-sse/services/rotationConfig.ts` | تعداد خطاهای `400` در بازهٔ `OMNIROUTE_ROTATE_400_WINDOW_SECONDS` که پیش از چرخش حساب لازم است (فقط زمانی بررسی میشود که `OMNIROUTE_ROTATE_ON_400=true` باشد). |
| `OMNIROUTE_ROTATE_400_WINDOW_SECONDS` | `120` | `open-sse/services/rotationConfig.ts` | پنجرهٔ لغزان (بر حسب ثانیه) که در آن خطاهای `400` برای رسیدن به `OMNIROUTE_ROTATE_400_THRESHOLD` شمارش میشوند. |
### زمانبند گرمسازی Claude
گرمسازی مبتنی بر Cron برای اتصالهای Anthropic OAuth که بهصورت اختیاری فعال شدهاند، تا پنجرهٔ محدودیت نرخ ۵ساعته بهجای نخستین درخواست واقعی، با یک درخواست زمانبندیشدهٔ ساده باز شود (#8848). زمانبند غیرفعال است، مگر اینکه `OMNIROUTE_WARMUP_ENABLED` دارای مقدار درستنما باشد **و** اتصال در `settings.claudeWarmup.connections` علامتگذاری شده باشد؛ فهرست خالی اتصالها به این معناست که حتی با فعال بودن متغیر محیطی نیز هیچ اتصالی گرم نمیشود.
| متغیر | پیشفرض | فایل منبع | توضیحات |
| ------------------------------ | --------------------------- | ---------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `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 ورود از طریق مرورگر و نام مستعار Data-Dir
Chromium+VNC کانتینریشده برای ثبت تعاملی اطلاعات احراز هویت ورود از طریق مرورگر (`/api/vnc-session`)، بههمراه نام مستعار قدیمی `DATA_DIR`. همه این تنظیمات اختیاری هستند — مقادیر پیشفرض VNC برای تصویر همراه `omniroute-vnc-chromium:local` در نظر گرفته شدهاند و فقط برای یک تصویر کانتینر سفارشی، پورتهای سفارشی یا تنظیم چرخه عمر بازنویسی میشوند.
| متغیر | پیشفرض | فایل منبع | توضیحات |
| ------------------------------------- | ------------------------------------------------------------------------ | ------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `OMNIROUTE_VNC_IMAGE` | `omniroute-vnc-chromium:local` | `src/lib/vncSession/manifest.ts` | برچسب تصویر Docker برای کانتینر ورود Chromium+VNC. `docker/vnc-browser/chromium` را بسازید یا این متغیر را به یک تصویر سفارشی ارجاع دهید. |
| `OMNIROUTE_DOCKER_BIN` | `docker` | `src/lib/vncSession/manifest.ts` | فایل اجرایی محیط اجرای کانتینر که برای راهاندازی کانتینر VNC استفاده میشود (برای مثال، آن را روی `podman` تنظیم کنید). |
| `OMNIROUTE_VNC_CONTAINER_VNC_PORT` | `3000` | `src/lib/vncSession/manifest.ts` | پورت VNC/noVNC که درون کانتینر در معرض دسترسی قرار میگیرد. |
| `OMNIROUTE_VNC_CONTAINER_CDP_PORT` | `9223` | `src/lib/vncSession/manifest.ts` | پورت Chrome DevTools Protocol درون کانتینر. |
| `OMNIROUTE_VNC_CONTAINER_PROFILE_DIR` | `/config` | `src/lib/vncSession/manifest.ts` | مسیر دایرکتوری پروفایل Chromium درون کانتینر. |
| `OMNIROUTE_VNC_PROFILE_DIR` | `$HOME/.omniroute/browser-login-profiles` | `src/lib/vncSession/manifest.ts` | دایرکتوری میزبان که پروفایلهای پایدار ورود از طریق مرورگر را نگه میدارد. |
| `OMNIROUTE_VNC_IDLE_MS` | `600000` (۱۰ دقیقه) | `src/lib/vncSession/manifest.ts` | مهلت عدم فعالیت (میلیثانیه) پیش از حذف یک نشست VNC غیرفعال. |
| `OMNIROUTE_VNC_MAX_MS` | `1800000` (۳۰ دقیقه) | `src/lib/vncSession/manifest.ts` | سقف قطعی (میلیثانیه) برای طول عمر یک نشست VNC. |
| `OMNIROUTE_VNC_MAX_SESSIONS` | `4` | `src/lib/vncSession/manifest.ts` | حداکثر تعداد نشستهای همزمان VNC. |
| `OMNIROUTE_VNC_READY_MS` | `45000` | `src/lib/vncSession/manifest.ts` | مهلت انتظار (میلیثانیه) برای آمادهشدن مرورگر کانتینریشده جهت استفاده از CDP. |
| `OMNIROUTE_VNC_HARVEST_MS` | `20000` | `src/lib/vncSession/manifest.ts` | مهلت (میلیثانیه) برای استخراج نشست/کوکیهای ثبتشده پس از تکمیل ورود. |
| `OMNIROUTE_VNC_CHROMIUM_ARGS` | `--remote-debugging-port=9222 --no-first-run --no-default-browser-check` | `src/lib/vncSession/manifest.ts` | پرچمهای خط فرمان اضافی که به Chromium کانتینریشده ارسال میشوند. |
| `OMNIROUTE_VNC_NETWORK` | `omniroute-vnc-browser-login` | `src/lib/vncSession/manifest.ts` | شبکه اختصاصی Docker که کانتینر ورود VNC بهجای پل پیشفرض به آن میپیوندد (#12571)، تا کانتینرهای همسطح نتوانند به پورت پل CDP آن دسترسی پیدا کنند. |
| `VIBEPROXY_DATA_DIR` | _(تنظیمنشده)_ | `open-sse/services/notionThreadSessions.ts` | **نام مستعار قدیمی** برای `DATA_DIR` که فقط پس از تنظیمنبودن هر دو متغیر `DATA_DIR` و `OMNIROUTE_DATA_DIR` بررسی میشود. محل حافظه نهان نشست رشتهگفتوگوی وب Notion را تعیین میکند (`/notion-web-thread-sessions.json`). |
---
## 26. چارچوب تست و E2E
توسط `scripts/dev/run-next-playwright.mjs`، `scripts/dev/smoke-electron-packaged.mjs`،
`scripts/dev/run-ecosystem-tests.mjs` و `scripts/build/uninstall.mjs` استفاده میشود. در استقرارهای
محیط عملیاتی، تمام مقادیر زیر را تنظیمنشده باقی بگذارید.
| متغیر | پیشفرض | فایل منبع | توضیحات |
| -------------------------------------- | ------------------------------------------------- | ----------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `OMNIROUTE_E2E_BOOTSTRAP_MODE` | `auth` | `scripts/dev/run-next-playwright.mjs` | حالت راهاندازی اولیه E2E (`auth`، `fresh`، `reuse`) برای اجراکننده Playwright. |
| `OMNIROUTE_E2E_PASSWORD` | در صورت نبود، از `INITIAL_PASSWORD` استفاده میکند | `scripts/dev/run-next-playwright.mjs` | گذرواژه مدیر که به محیط Playwright تزریق میشود. |
| `OMNIROUTE_DISABLE_LOCAL_HEALTHCHECK` | `true` | `scripts/dev/run-next-playwright.mjs` | غیرفعالکردن نظرسنجی بررسی سلامت محلی هنگام اجرای Playwright. |
| `OMNIROUTE_DISABLE_TOKEN_HEALTHCHECK` | `true` | `scripts/dev/run-next-playwright.mjs` | غیرفعالکردن حلقه بررسی سلامت توکن OAuth هنگام آزمایشها. |
| `OMNIROUTE_HEALTHCHECK_SKIP_PROVIDERS` | _(تنظیمنشده)_ | `src/lib/tokenHealthCheck.ts` | ارائهدهندگانی با جداکننده ویرگول که از پیمایش پیشگیرانه نوسازی توکن مستثنا میشوند (برای مثال `codex,openai`). جایگزینی هدفمند برای غیرفعالکردن کامل بررسی سلامت — ارائهدهندگان با TTL کوتاه همچنان نوسازی میشوند، درحالیکه ارائهدهندگان آبشاری فقط واکنشی باقی میمانند. |
| `OMNIROUTE_HIDE_HEALTHCHECK_LOGS` | `true` | `scripts/dev/run-next-playwright.mjs` | حذف پیامهای اضافی بررسی سلامت از stdout مربوط به Playwright. |
| `OMNIROUTE_PLAYWRIGHT_SKIP_BUILD` | `0` | `scripts/dev/run-next-playwright.mjs` | ردکردن ساخت تولیدی Next.js پیش از شروع Playwright (بهینهسازی CI). |
| `OMNIROUTE_SKIP_UNINSTALL_HOOK` | `0` | `scripts/build/uninstall.mjs` | ردکردن هوک حذف نصب OmniRoute (برای دستنخورده نگهداشتن `node_modules` در CI استفاده میشود). |
| `ECOSYSTEM_SERVER_WAIT_MS` | `180000` | `scripts/dev/run-ecosystem-tests.mjs` | زمان انتظار (میلیثانیه) برای سالمشدن سرور پیش از اجرای آزمایشهای اکوسیستم/پروتکل. |
| `ELECTRON_SMOKE_URL` | `http://127.0.0.1:20128/login` | `scripts/dev/smoke-electron-packaged.mjs` | نشانی URL که چارچوب آزمایش دود Electron انتظار دارد برنامه بستهبندیشده در آن ارائه شود. |
| `ELECTRON_SMOKE_TIMEOUT_MS` | `45000` | `scripts/dev/smoke-electron-packaged.mjs` | مهلت زمانی کل (میلیثانیه) پیش از آنکه چارچوب آزمایش دود منصرف شود. |
| `ELECTRON_SMOKE_SETTLE_MS` | `2000` | `scripts/dev/smoke-electron-packaged.mjs` | بازه تثبیت (میلیثانیه) پس از بارگذاری صفحه. |
| `ELECTRON_SMOKE_APP_EXECUTABLE` | _(خودکار)_ | `scripts/dev/smoke-electron-packaged.mjs` | مسیر صریح فایل اجرایی بستهبندیشده Electron. |
| `ELECTRON_SMOKE_DATA_DIR` | _(tmpdir)_ | `scripts/dev/smoke-electron-packaged.mjs` | پوشه داده برای اجرای آزمایش دود Electron. |
| `ELECTRON_SMOKE_KEEP_DATA` | `0` | `scripts/dev/smoke-electron-packaged.mjs` | برای حفظ پوشه داده آزمایش دود پس از اجرا، روی `1` تنظیم کنید. |
| `ELECTRON_SMOKE_STREAM_LOGS` | `0` | `scripts/dev/smoke-electron-packaged.mjs` | برای پخش جریانی گزارشهای Electron در stdout هنگام اجرا، روی `1` تنظیم کنید. |
| `ELECTRON_SMOKE_COLD_RESTART` | `0` | `scripts/dev/smoke-electron-packaged.mjs` | #7592: راهاندازی مجدد با همان پوشه داده و اطمینان از اینکه اجرای دوم درایور بومی SQLite را انتخاب میکند. |
| `CLI_DEVIN_BIN` | _(جستوجو در PATH)_ | `open-sse/executors/devin-cli.ts` | بازنویسی مسیر فایل باینری Devin CLI. |
### خط لوله ترجمه مستندات
توسط `scripts/i18n/run-translation.mjs` (فرمان `npm run i18n:run`) استفاده میشود.
هر پنج متغیر بهطور پیشفرض تنظیم نشدهاند — آنها را فقط روی دستگاههایی که باید قادر به اجرای مترجم مستندات باشند، در `.env` تنظیم کنید.
| متغیر | مقدار پیشفرض | فایل منبع | توضیحات |
| ----------------------------------- | ------------- | ---------------------------------- | ------------------------------------------------------------ |
| `OMNIROUTE_TRANSLATION_API_URL` | _(تنظیمنشده)_ | `scripts/i18n/run-translation.mjs` | نشانی URL پایه سازگار با OpenAI برای بکاند ترجمه. |
| `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 (میزبانی شخصی)
افزونهای اختیاری که توسط پرچم قابلیت RADAR_ENABLED کنترل میشود (بهطور پیشفرض غیرفعال است — این پرچم
از طریق Settings/DB تغییر میکند و متغیر محیطی نیست؛ مراجعه کنید به
[docs/frameworks/RADAR.md](../frameworks/RADAR.md#flag-radar_enabled-default-off)).
چهار متغیر نخست زیر، جایگزینهای اختیاری برای خوراکی با میزبانی شخصی یا فورکشده و
جریانهای کلید حامی هستند. متغیر پنجم، `RADAR_ADMIN_URL`، پیوندی جداگانه و بدون مقدار پیشفرض به پنل
عملیات خصوصی مالک است. برای مستندات کامل ماژول و
[توالی فعالسازی سرتاسری و راهاندازی هدایتشده آن](../frameworks/RADAR.md#end-to-end-activation-and-guided-setup)، به [docs/frameworks/RADAR.md](../frameworks/RADAR.md) مراجعه کنید.
خواننده عمومی اعلانهای Home/Changelog با یک متغیر محیطی
پیکربندی نمیشود و به پرچم قابلیت RADAR_ENABLED وابسته نیست. این خواننده URL عمومی
`news.json` مخزن را که در `src/shared/utils/releaseNotes.ts` تعریف شده است، فقط از طریق
GET میخواند؛ شناسههای اعلانهای ردشده در فضای ذخیرهسازی محلی مرورگر باقی میمانند.
| متغیر | مقدار پیشفرض | فایل منبع | توضیحات |
| ----------------------------- | -------------------------------------------- | ------------------------------------------------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `RADAR_FEED_URL` | `https://radar.omniroute.online` | `src/lib/radar/{sync,referralsSync,offersSync,intelSync}.ts` | URL پایه مشترک میان خوراکهای کاتالوگ، ارجاعها، پیشنهادهای حامیان و Intel که بهصورت جداگانه امضا شدهاند. برای اشاره به یک سرویس با میزبانی شخصی یا فورکشده، آن را بازنویسی کنید. |
| `RADAR_FEED_PUBKEY` | _(کلید پیشفرض سنجاقشده)_ | `src/lib/radar/pinnedKeys.ts` | کلید عمومی Ed25519 (با قالب base64-DER SPKI یا PEM) که برای تأیید امضاهای خوراک از یک خوراک سفارشی استفاده میشود. |
| `RADAR_CONTRIBUTOR_CLAIM_URL` | `https://radar.omniroute.online/auth/github` | `src/lib/radar/links.ts` | URLای که دکمه «من مشارکتکننده هستم» در داشبورد باز میکند (جریان دریافت کلید حامی از طریق GitHub OAuth). |
| `RADAR_SUPPORTER_PLANS_URL` | `https://radar.omniroute.online/planos` | `src/lib/radar/links.ts` | URLای که دکمه «حمایت از پروژه» در داشبورد باز میکند (صفحه پرداخت/طرحها). |
| `RADAR_ADMIN_URL` | _(تنظیمنشده)_ | `src/lib/radar/links.ts` | پیوند پنل عملیات خصوصی که فقط برای مالک است. استفاده از HTTPS الزامی است، مگر برای یک انتقال SSH حلقهبازگشتی HTTP؛ مقادیر تنظیمنشده یا نامعتبر هیچ موردی برای پیمایش ایجاد نمیکنند. |
---
## ممیزی: متغیرهای حذفشده / بلااستفاده
متغیرهای زیر در نسخههای پیشین `.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 از OAuth استفاده میکند، نه فایل اجرایی CLI). |
| `IFLOW_OAUTH_CLIENT_ID` / `IFLOW_OAUTH_CLIENT_SECRET` | در هیچجای کد منبع به آنها ارجاع نشده است. |
| `CEREBRAS_API_KEY` / `COHERE_API_KEY` / `FIREWORKS_API_KEY` / `GROQ_API_KEY` / `MISTRAL_API_KEY` / `NEBIUS_API_KEY` / `PERPLEXITY_API_KEY` / `TOGETHER_API_KEY` / `XAI_API_KEY` | در v3.8.0 حذف شدند. زمان اجرا دیگر این متغیرهای env را نمیخواند — اطلاعات احراز هویت از Dashboard / `data/provider-credentials.json` / پایگاه داده رمزگذاریشده دریافت میشوند. |
| `CURSOR_PROTOBUF_DEBUG` | در v3.8.0 حذف شد. اجراکننده Cursor از `CURSOR_DEBUG` / `CURSOR_STREAM_DEBUG` استفاده میکند (به §22 مراجعه کنید). |
| `CLI_COMPAT_KIRO` | در v3.8.0 حذف شد. Kiro در `CLI_COMPAT_OMITTED_PROVIDER_IDS` قرار دارد — کلید تغییر وضعیت آن هیچ اثری ندارد. |
| `QIANFAN_API_KEY` | همراه با سایر جایخالیهای بلااستفاده کلید API ارائهدهندگان در v3.8.0 حذف شد. |
### اصلاح مقادیر پیشفرض
| متغیر | مقدار قدیمی `.env.example` | پیشفرض واقعی کد | اصلاح |
| ------------------------- | -------------------------- | --------------- | ------------------------------------------------------- |
| `APP_LOG_RETENTION_DAYS` | `90` | `7` | ✅ مقدار گمراهکننده حذف شد؛ `7` بهعنوان پیشفرض مستند شد |
| `CALL_LOG_RETENTION_DAYS` | `90` | `7` | ✅ مقدار گمراهکننده حذف شد؛ `7` بهعنوان پیشفرض مستند شد |
### بازتولید پیکربندی OpenCode (ابزار موردی)
توسط `scripts/ad-hoc/regen-opencode-config.ts` برای بازتولید یک `opencode.json`
با مقادیر دقیق `limit.context` و `limit.output` که از نمونه در حال اجرای
OmniRoute دریافت میشوند، استفاده میشود. هیچیک از این موارد برای عملکرد عادی لازم نیستند — این اسکریپت
صرفاً ابزاری برای توسعهدهندگان است.
| متغیر | مقدار پیشفرض | فایل منبع | توضیحات |
| ------------------ | ------------------------ | ----------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------- |
| `OMNIROUTE_URL` | `http://localhost:20128` | `scripts/ad-hoc/regen-opencode-config.ts` | نشانی پایه نمونه OmniRoute برای درخواست از `/v1/models`. |
| `OMNIROUTE_KEY` | _(تنظیمنشده)_ | `scripts/ad-hoc/regen-opencode-config.ts` | کلید API برای احراز هویت در نقطه پایانی `/v1/models` متعلق به OmniRoute. در صورت تنظیمنبودن، از `OPENCODE_API_KEY` استفاده میشود. |
| `OPENCODE_API_KEY` | _(تنظیمنشده)_ | `scripts/ad-hoc/regen-opencode-config.ts` | کلید API به سبک OpenCode (`sk-...`) که در `opencode.json` بازتولیدشده نوشته میشود. در صورت تنظیمنبودن، از `OMNIROUTE_KEY` استفاده میشود. |
### ابزار ارزیابی آفلاین فشردهسازی (ابزار موقت)
مورد استفاده `scripts/compression-eval/index.ts`، رابط خط فرمان ارزیابی آفلاین فشردهسازی.
برای عملکرد عادی لازم نیست — فقط ابزار توسعهدهندگان است.
| متغیر | مقدار پیشفرض | فایل منبع | توضیحات |
| ---------------------------- | ------------ | ----------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `OMNIROUTE_EVAL_CREDENTIALS` | `{}` (خالی) | `scripts/compression-eval/index.ts` | اعتبارنامههای JSON ارائهشده توسط اپراتور برای ارائهدهندهای که رابط خط فرمان ارزیابی آفلاین فشردهسازی آزمایش میکند (با `JSON.parse` تجزیه میشود). برای اجرای آزمایشی تنظیم نشود. |
### نشستهای مرورگر VNC
مورد استفاده `src/lib/vncSession/manifest.ts` برای پیکربندی نشستهای بدون رابط گرافیکی Chromium مبتنی بر Docker جهت ارائهدهندگان خودکارسازی مرورگر. همه اختیاری هستند — مقادیر پیشفرض در زیر نشان داده شدهاند.
| متغیر | مقدار پیشفرض | فایل منبع | توضیحات |
| ------------------------------------- | ------------------------------ | ------------------------------------------- | ------------------------------------------------------------------------------------- |
| `OMNIROUTE_DOCKER_BIN` | `docker` | `src/lib/vncSession/manifest.ts` | مسیر فایل اجرایی Docker که برای ایجاد کانتینرهای VNC استفاده میشود. |
| `OMNIROUTE_VNC_IMAGE` | `omniroute-vnc-chromium:local` | `src/lib/vncSession/manifest.ts` | ایمیج Docker برای کانتینر VNC Chromium. |
| `OMNIROUTE_VNC_CHROMIUM_ARGS` | _(پرچمهای داخلی)_ | `src/lib/vncSession/manifest.ts` | آرگومانهای اضافی CLI مربوط به Chromium که به مرورگر داخل کانتینر ارسال میشوند. |
| `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. |
| `OMNIROUTE_VNC_MAX_MS` | `1800000` | `src/lib/vncSession/manifest.ts` | حداکثر مدت نشست (میلیثانیه). |
| `OMNIROUTE_VNC_MAX_SESSIONS` | `4` | `src/lib/vncSession/manifest.ts` | حداکثر تعداد نشستهای همزمان VNC. |
| `OMNIROUTE_VNC_READY_MS` | `45000` | `src/lib/vncSession/manifest.ts` | مهلت آمادهشدن مرورگر (میلیثانیه). |
| `OMNIROUTE_VNC_HARVEST_MS` | `20000` | `src/lib/vncSession/manifest.ts` | مهلت جمعآوری/پاکسازی (میلیثانیه). |
| `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. |
### اتصال Redis تعبیهشده
| متغیر | مقدار پیشفرض | توضیحات |
| --------------------------- | ------------ | ------------------------------------------------------- |
| `REDIS_BIND_HOST` | `127.0.0.1` | آدرس اتصال برای سرویس Redis تعبیهشده. |
| `REDIS_PORT` | `6379` | پورت سرویس Redis تعبیهشده. |
| `OMNIROUTE_REDIS_BIND_HOST` | – | بازنویسی مختص OmniRoute برای آدرس اتصال Redis تعبیهشده. |
---
## 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` | بودجه بایتهای صفشده برای انتظار پذیرش: مجموع بایتهای بافرشده بدنه را که در سطح کل فرایند نگه داشته میشوند محدود میکند تا انتظار باعث افزایش مصرف heap نشود (#4380). انتظارهایی که از بودجه فراتر روند، بلافاصله یک `503` قابلتلاشمجدد دریافت میکنند. |
| `OMNIROUTE_CHAT_VIRTUAL_TTL_MS` | `60000` (60 ثانیه) | `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` | مدتزمان انتظار یک فراخوانی اجرای فوری برای یک کار در حال اجرا را، پیش از شروع اجرای صفشده، محدود میکند. |
| `ADOBE_FIREFLY_BROWSER_REFRESH` | فعال | `open-sse/services/adobeFireflySession.ts` | وضعیت IMS و ریسک مرورگر را از طریق نشستهای Chrome CDP در سطح حساب تازه نگه میدارد؛ برای غیرفعالکردن، مقدار `0` را تنظیم کنید. |
| `ADOBE_FIREFLY_SESSION_DISK` | فعال | `open-sse/services/adobeFireflySession.ts` | نشستهای ترمیمشده Adobe را در `DATA_DIR` پایدار ذخیره میکند؛ برای نگهداری وضعیت فقط در حافظه، مقدار `0` را تنظیم کنید. |
| `ADOBE_FIREFLY_MIN_SUBMIT_GAP_MS` | `12000` | `open-sse/services/adobeFireflySession.ts` | حداقل فاصله زمانی بین ارسال درخواستهای تولید Adobe Firefly. |
| `ADOBE_FIREFLY_BATCH_EXTRA_GAP_MS` | `15000` | `open-sse/services/adobeFireflySession.ts` | یک دوره سکون اضافی پس از هر سومین ارسال موفق Adobe. |
| `ADOBE_FIREFLY_CHROME_HEADLESS` | `0` | `open-sse/services/adobeFireflyBrowserLogin.ts` | حالت headless واقعی، فقط برای اشکالزدایی؛ 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 که webhook ورودی را فعال کرده و `initData` مربوط به Mini App را امضا میکند. |
| `TELEGRAM_WEBHOOK_SECRET` | _(تنظیمنشده)_ | `src/lib/telegram/config.ts` | راز مشترکی که از طریق `setWebhook` ثبت شده و در هر تحویل webhook در برابر سرآیند `X-Telegram-Bot-Api-Secret-Token` اعتبارسنجی میشود. برای مسیر webhook الزامی است؛ تنظیمنبودن آن به این معناست که تحویلهای webhook با 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` | بازنویسی URL پایه Bot API برای پروکسیها یا سرورهای Bot API میزبانیشده توسط خودتان. |
| `TELEGRAM_WEBHOOK_TIMEOUT_MS` | `60000` | `src/lib/telegram/config.ts` | مهلت زمانی فراخوانیهای خروجی Bot API برحسب میلیثانیه. |
| `OMNIROUTE_OPTIONAL_PACK_TAR` | `1` (فعال) | `scripts/build/optionalPackStaging.mjs` | برای صرفنظرکردن از تولید فایلهای tarball با پسوند `.tar.gz` هنگام آمادهسازی بستههای اختیاری ML/مرورگر برای درخت مستقل Electron، مقدار `0` را تنظیم کنید (دایرکتوریهای بسته و `optional-packs.index.json` همچنان تولید میشوند). گردشکار انتشار دسکتاپ از این گزینه برای کاهش حجم بارگذاری مصنوعات استفاده میکند. |
| `GROK_SUBSCRIPTION_IMAGES_ENABLED` | `false` | `open-sse/config/imageRegistry.ts` | ثبت مسیرهای تصویر اشتراک xAI را فعال میکند؛ بهطور پیشفرض غیرفعال است تا مسیر تصویر مبتنی بر کلید API بدون تغییر باقی بماند. |
| `OMNIROUTE_API_KEY_COOLDOWN_MS` | `60000` | `open-sse/services/apiKeyRotator.ts` | دوره توقف مختص هر کلید برحسب میلیثانیه، هنگامی که پاسخ `429` فاقد راهنمای قابلاستفاده `Retry-After` است. |
| `OMNIROUTE_ESTIMATOR_CALIBRATION` | فعال | `open-sse/services/estimatorCalibration.ts` | برای غیرفعالکردن ثبت و اعمال کالیبراسیون درونحافظهای تخمینگر، مقدار را روی `off`، `0` یا `false` تنظیم کنید. |
| `NEXT_MANUAL_SIG_HANDLE` | _(داخلی)_ | `scripts/dev/standalone-server-ws.mjs` | بازنویسی داخلی کنترلکننده سیگنال سرور مستقل؛ معمولاً بهجای پیکربندی توسط اپراتورها، بهوسیله راهانداز تنظیم و پاک میشود. |
### ChatGPT Web (Codex)
مقادیر پیشفرض سراسری برای مرورگر headless و تونل ابزار خروجی. مقادیر اتصال تنظیمشده در داشبورد اولویت دارند.
| متغیر | پیشفرض | فایل منبع | توضیحات |
| --------------------------------------- | ------------------------------ | -------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `CHATGPT_WEB_CODEX_CHROME_PATH` | _(تشخیص خودکار)_ | `open-sse/executors/chatgpt-web-codex.ts` | مسیر صریح Chrome/Chromium برای اجرا با npm، systemd و PM2. |
| `CHROME_PATH` | _(تشخیص خودکار)_ | `open-sse/executors/chatgpt-web-codex.ts` | مسیر جایگزین مشترک برای تعیین صریح مسیر Chrome/Chromium. |
| `CHATGPT_WEB_CODEX_CDP_URL` | _(تنظیمنشده)_ | `open-sse/executors/chatgpt-web-codex.ts` | نقطه پایانی داخلی CDP؛ Docker از Sidecar روی پورت `9223` استفاده میکند. |
| `CDP_PROXY_TOKEN` | _(تنظیمنشده)_ | `docker/chatgpt-web-codex-browser/cdp-proxy.mjs` | اگر تنظیم شده باشد، هر درخواست به CDP Proxy Sidecar باید این مقدار را در هدر `X-Omni-Cdp-Token` ارسال کند (#13679). بدون مقدار، Proxy درخواستها را بدون احراز هویت هدایت میکند — در این حالت، فقط جداسازی شبکه در شبکه Compose با نام `chatgpt-web-codex-net` از آن محافظت میکند. برای تولید آن از `openssl rand -hex 32` استفاده کنید. |
| `CHATGPT_WEB_CODEX_TUNNEL_ID` | _(تنظیمنشده)_ | `open-sse/executors/chatgpt-web-codex.ts` | شناسه سراسری تونل OpenAI برای دورهای محلی ابزار Codex. |
| `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` | نام دقیق رابط سفارشی تازهایجادشده ChatGPT برای پل MCP. |
| `CODEX_CHATGPT_WEB_HOME` | `/chatgpt-web-codex` | `open-sse/vendor/codex-chatgpt-web/config.ts` | پوشه اختصاصی برای وضعیت مرورگر، Broker و تونل. |
| `CODEX_CHATGPT_WEB_BROWSER_DIAGNOSTICS` | `0` | `open-sse/vendor/codex-chatgpt-web/adapters/chatgpt-web/browser-worker.ts` | با مقدار `1`، تصاویر تشخیصی مرورگر در هر Checkpoint ثبت میشوند. |
| `CODEX_CHATGPT_WEB_LAUNCHER` | _(تنظیمنشده)_ | `open-sse/vendor/codex-chatgpt-web/config.ts` | مسیر مطلق اختیاری به یک فایل اجرایی پایدار Launcher. |
| `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 را در TaskManager محلی A2A (`src/lib/conductor/`) بازتاب میدهد. فعالسازی اختیاری است — پل فقط زمانی شروع به کار میکند که `CONDUCTOR_HUB_URL` تنظیم شده باشد. فقط سمت سرور: توکن هاب هرگز نباید به مرورگر برسد.
| متغیر | پیشفرض | فایل منبع | توضیحات |
| ------------------------------ | ----------------------- | -------------------------------- | ---------------------------------------------------------------------------------------------------------------------------- |
| `CONDUCTOR_HUB_URL` | _(خالی)_ | `src/lib/conductor/boot.ts` | نشانی URL پایهٔ هاب OmniConductor (برای مثال `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` | نشانی URL پایهٔ سرویس spokesperson (Faro) در پشت پراکسی چت داشبورد (`/api/conductor/ask`). |
### زمانبندی آگاه از سهمیه
توسط `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 ادامه میدهد. |
| `OMNIROUTE_ESTIMATOR_CALIBRATION` | _(روشن)_ | `open-sse/services/estimatorCalibration.ts` | کالیبراسیون بازخوردی تخمینزن توکن محافظ زمینه (#14931): میانگین متحرک نمایی (EMA) نسبت `usage.prompt_tokens` به تخمین برای هر ترکیب (ارائهدهنده، مدل، وجود ابزارها)، محدودشده به بازهٔ 0.15–2.0 و فقط در حافظه. `off`، `0` یا `false` ثبت و اعمال را غیرفعال میکند. |
| `GROK_SUBSCRIPTION_IMAGES_ENABLED` | `false` | `open-sse/config/imageRegistry.ts` | مسیرهای تصویر `xai-oauth` (`xao`) و `grok-cli` را ثبت میکند. پرچم قابلیت داشبورد با همین نام؛ مقدار بازنویسیشده در پایگاه داده بر این مقدار اولویت دارد. |