# Environment Variables Reference (Português (Brasil)) 🌐 **Languages:** 🇺🇸 [English](../../../../reference/ENVIRONMENT.md) · 🇪🇹 [am](../../../am/docs/reference/ENVIRONMENT.md) · 🇸🇦 [ar](../../../ar/docs/reference/ENVIRONMENT.md) · 🇦🇿 [az](../../../az/docs/reference/ENVIRONMENT.md) · 🇧🇬 [bg](../../../bg/docs/reference/ENVIRONMENT.md) · 🇧🇩 [bn](../../../bn/docs/reference/ENVIRONMENT.md) · 🇧🇦 [bs](../../../bs/docs/reference/ENVIRONMENT.md) · 🇨🇿 [cs](../../../cs/docs/reference/ENVIRONMENT.md) · 🇩🇰 [da](../../../da/docs/reference/ENVIRONMENT.md) · 🇩🇪 [de](../../../de/docs/reference/ENVIRONMENT.md) · 🇬🇷 [el](../../../el/docs/reference/ENVIRONMENT.md) · 🇪🇸 [es](../../../es/docs/reference/ENVIRONMENT.md) · 🇪🇪 [et](../../../et/docs/reference/ENVIRONMENT.md) · 🇮🇷 [fa](../../../fa/docs/reference/ENVIRONMENT.md) · 🇫🇮 [fi](../../../fi/docs/reference/ENVIRONMENT.md) · 🇫🇷 [fr](../../../fr/docs/reference/ENVIRONMENT.md) · 🇮🇪 [ga](../../../ga/docs/reference/ENVIRONMENT.md) · 🇮🇳 [gu](../../../gu/docs/reference/ENVIRONMENT.md) · 🇳🇬 [ha](../../../ha/docs/reference/ENVIRONMENT.md) · 🇮🇱 [he](../../../he/docs/reference/ENVIRONMENT.md) · 🇮🇳 [hi](../../../hi/docs/reference/ENVIRONMENT.md) · 🇭🇷 [hr](../../../hr/docs/reference/ENVIRONMENT.md) · 🇭🇺 [hu](../../../hu/docs/reference/ENVIRONMENT.md) · 🇦🇲 [hy](../../../hy/docs/reference/ENVIRONMENT.md) · 🇮🇩 [id](../../../id/docs/reference/ENVIRONMENT.md) · 🇳🇬 [ig](../../../ig/docs/reference/ENVIRONMENT.md) · 🇮🇹 [it](../../../it/docs/reference/ENVIRONMENT.md) · 🇯🇵 [ja](../../../ja/docs/reference/ENVIRONMENT.md) · 🇬🇪 [ka](../../../ka/docs/reference/ENVIRONMENT.md) · 🇰🇭 [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) · 🇷🇴 [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) --- > Referência completa para cada variável de ambiente reconhecida por OmniRoute. Para obter um modelo de início rápido, consulte [`.env.example`](../../.env.example). > [!IMPORTANT] > Cada variável documentada aqui também deve aparecer em `.env.example` e cada variável em `.env.example` deve aparecer aqui. `npm run check:env-doc-sync` impõe isso no commit e no CI. Para omitir uma variável propositalmente, adicione-a à lista de permissões dentro `scripts/check/check-env-doc-sync.mjs`. --- ## Índice - [1. Segredos necessários](#1-required-secrets) - [2. Armazenamento e banco de dados](#2-storage--database) - [3. Rede e portas](#3-network--ports) - [4. Segurança e autenticação](#4-security--authentication) - [5. Sanitização de entrada e proteção PII](#5-input-sanitization--pii-protection) - [6. Políticas de ferramentas e roteamento](#6-tool--routing-policies) - [7. URLs e sincronização em nuvem](#7-urls--cloud-sync) - [8. Proxy de saída](#8-outbound-proxy) - [9. Integração da ferramenta CLI](#9-cli-tool-integration) - [10. Agente interno e integrações MCP](#10-internal-agent--mcp-integrations) - [11. Credenciais do provedor OAuth](#11-oauth-provider-credentials) - [12. Substituições de usuário-agente do provedor](#12-provider-user-agent-overrides) - [13. Compatibilidade de impressão digital CLI](#13-cli-fingerprint-compatibility) - [14. Provedores-chave API](#14-api-key-providers) - [15. Configurações de tempo limite](#15-timeout-settings) - [16. Registro](#16-logging) - [17. Otimização de memória](#17-memory-optimization) - [18. Sincronização de preços](#18-pricing-sync) - [19. Sincronização de modelo (desenvolvimento)](#19-model-sync-dev) - [20. Configurações específicas do provedor](#20-provider-specific-settings) - [21. Saúde proxy](#21-proxy-health) - [22. Depuração](#22-debugging) - [23. Integração GitHub](#23-github-integration) - [24. Sandbox de habilidades (v3.8.0 +)](#24-skills-sandbox-v380) - [27. Feed de radar (auto-hospedagem)](#27-radar-feed-self-hosting) - [Cenários de implantação](#deployment-scenarios) - [Auditoria: variáveis removidas/mortas](#audit-removed--dead-variables) --- ## 1. Segredos necessários Segredos não definidos marcados** Sim** são gerados automaticamente na primeira execução (`JWT_SECRET`, `API_KEY_SECRET`) e persistidos em `server.env` no diretório de dados — os define explicitamente quando esse diretório é efêmero. A exceção é `OMNIROUTE_WS_BRIDGE_SECRET`: não é persistido para `server.env` — os pontos de entrada do servidor criarem um valor efêmero por inicialização que somente a ponte em processo pode usar, portanto, os clientes da ponte externa precisam defini-lo explicitamente. | Variável | Obrigatório | Padrão | Arquivo de origem | Descrição | | ---------------------------- | ------------------ | -------------------------------- | --------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `JWT_SECRET` | **Sim** | _(nenhum)_ | `src/lib/auth` | Signs/verifies todos os cookies de sessão do painel (JWT). Gere com `openssl rand -base64 48`. | | `API_KEY_SECRET` | **Sim** | _(nenhum)_ | `src/lib/db/apiKeys.ts` | Chave de criptografia AES para valores de chave API em repouso em SQLite. Gere com `openssl rand -hex 32`. | | `INITIAL_PASSWORD` | Não | _(desativado)_ | `src/lib/auth/managementPassword.ts` | Define a senha do painel na inicialização enquanto nenhuma foi salva ainda; ignorado quando uma senha é salva. As instalações npm e source copiam `.env.example` para `.env`, então elas começam com seu espaço reservado publicamente conhecido `CHANGEME`: substitua-o antes da primeira inicialização ou defina `INITIAL_PASSWORD=` (vazio) nesse `.env` para criar a senha no assistente de integração na primeira visita, como faz um valor não definido (o padrão da imagem Docker ). Altere uma senha salva no Dashboard → Settings → Security ou execute `omniroute reset-password` (`node bin/reset-password.mjs` em uma verificação de origem) com `DATA_DIR` definido para o diretório de dados do servidor. | | `OMNIROUTE_WS_BRIDGE_SECRET` | **Sim** (produção) | _(desativado)_ | `src/app/api/internal/codex-responses-ws/route.ts` | Segredo compartilhado para a ponte interna Codex Responses WebSocket. Autentica solicitações de ponte entre o relé Electron/browser WS e OmniRoute. ⚠️**REQUIRED em produção — quando não definido, todas as solicitações de ponte WS são rejeitadas.** Gere com `openssl rand -base64 32`. | | `OMNIROUTE_SW_BUILD_ID` | Não | _(git SHA)_ | `next.config.mjs`, `scripts/build/assembleStandalone.mjs` | ID explícito de bloqueio de cache do trabalhador de serviço para o shell PWA (#11779); primeiro na cadeia de resolução. | | `SOURCE_VERSION` | Não | _(desativado)_ | `next.config.mjs`, `scripts/build/assembleStandalone.mjs` | O segundo na cadeia — definido pelos construtores PaaS (por exemplo, estilo Heroku) como o commit implantado. | | `NEXT_PUBLIC_SW_BUILD_ID` | Não | _(derivado)_ | `src/shared/components/PwaRegister.tsx` | Valor público em tempo de construção que o cliente usa para registrar `/sw.js?v=…`; derivado dos dois acima, então o git SHA. | | `OMNIROUTE_PEER_STAMP_TOKEN` | Não (automático) | _(automático por inicialização)_ | `src/server/authz/policies/management.ts` | O segredo por processo que prova que o carimbo de IP de ponto confiável veio do próprio servidor HTTP do OmniRoute(`scripts/dev/peer-stamp.mjs`). O middleware authz confia na localidade da solicitação (loopback/LAN gating de rotas LOCAL_ONLY ) somente quando o carimbo carrega esse token. Gerado automaticamente cada inicialização — não é definido; fixe-o apenas para configurações de vários processos que devem compartilhar o carimbo. | | `OMNIROUTE_TRUSTED_PROXIES` | Não | _(desativado)_ | `scripts/dev/peer-stamp.mjs` | Intervalos IPs ou CIDR separados por vírgula de proxies reversos cujo `X-Forwarded-For` / `X-Real-IP` a lista IP allow/deny pode acreditar, além do loopback, endereços de rede privada e bordas Cloudflare, que são sempre confiáveis. Necessário apenas para um proxy em qualquer outro endereço público; caso contrário, o próprio endereço desse proxy é o que o filtro julga. As chaves de aceleração por cliente (`/api/v1/relay/chat/completions`) do relé no mesmo endereço de cliente resolvido, nunca apenas no encaminhamento de cabeçalhos. | ### Comandos de geração ```bash # Generate all four secrets at once: echo "JWT_SECRET=$(openssl rand -base64 48)" echo "API_KEY_SECRET=$(openssl rand -hex 32)" echo "INITIAL_PASSWORD=$(openssl rand -base64 16)" echo "OMNIROUTE_WS_BRIDGE_SECRET=$(openssl rand -base64 32)" ``` > [!CAUTION] > Nunca envie arquivos `.env` com segredos reais para controle de versão. O `.gitignore` já exclui `.env`, mas verifique antes de enviar. --- ## 2. Armazenamento e banco de dados OmniRoute usa**SQLite** (via `better-sqlite3`) para todas as persistências. Essas variáveis controlam a localização, a criptografia e o ciclo de vida dos dados. | Variável | Padrão | Arquivo de origem | Descrição | | ------------------------------------------ | ----------------------------- | ----------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `DATA_DIR` | `~/.omniroute/` | `src/lib/db/core.ts` | Diretório raiz para SQLite DB, backups e arquivos de dados. Substituição de volumes Docker ou caminhos personalizados. | | `OMNIROUTE_ALLOW_DEFAULT_DATA_DIR` | _(desativado)_ | `src/lib/dataPaths.ts` | Escotilha de fuga para o guarda DATA_DIR test/eval #10428). Testes e sondagens Node eval/print (`-e`/`--eval`/`-p`/`--print`, incluindo formulários `--eval=`/`--print=` ) sem `DATA_DIR` são redirecionados para um diretório temporário descartável para que não possam abrir o banco de dados real do operador; defina como `1` para voltar ao diretório real. | | `OMNIROUTE_BUILD_SHA` | _(desativado)_ | `src/lib/monitoring/buildSha.ts` | Git SHA do artefato em execução. Carimbado por `npm run build:release`; injetável em contêineres enviados sem o sentinela `dist/BUILD_SHA`. Apareceu como `system.buildSha` em `/api/monitoring/health`. | | `OMNIROUTE_RELEASE_REF` | `origin/main` | `scripts/build/buildProvenance.ts` | Ref o portão de proveniência do pack-artefato verifica o build SHA (#10427). | | `OMNIROUTE_ALLOW_CANARY_BUILD` | _(desativado)_ | `scripts/build/buildProvenance.ts` | Defina como `1` para permitir empacotar uma compilação cujo SHA não esteja na linha de lançamento, registrando-a como um canário deliberado em vez de falhar no portão (#10427). | | `OMNIROUTE_SMOKE_API_KEY` | _(desativado)_ | `scripts/ops/deploy-canary.mjs` | Chave API para o probe smoke canary-deploy, enviada como `Authorization: Bearer` em `/v1/chat/completions`. Usado apenas pelo script de implantação (#10429), nunca pelo servidor. Não relacionado às variáveis `OMNIROUTE_SMOKE_*` do chicote de fumaça CLI opcional (`RUN_CLI_SMOKE=1`, `OMNIROUTE_SMOKE_BASE_URL/MODEL/API_KEY_ENV/TARGETS/TIMEOUT_MS` em `tests/integration/upstream-cli-smoke.int.test.ts`) — consulte [CLI Integrações → Varredura de fumaça real](../guides/CLI-INTEGRATIONS.md). | | `OMNIROUTE_BUILDING` | _(desativado)_ | `src/lib/buildPhase.ts` | Sinal de fase de construção (#10060): definido como `1` por `scripts/build/build-next-isolated.mjs` e herdado por cada trabalhador de construção gerado para que a camada DB retorne um stub não operacional em vez de carregar o complemento better-sqlite3 nativo (que aborta o trabalhador na saída). Nunca configure para o servidor em execução. | | `OMNIROUTE_SKIP_NATIVE_DEP_CHECK` | `0` | `scripts/check/check-native-deps.mjs` | Defina como `1` para ignorar a verificação opcional de pré-construção de dependência nativa para árvores exóticas vendidas. Isso não torna uma dependência ausente edificável; use somente quando as dependências nativas forem fornecidas fora da banda. | | `OMNIROUTE_DATA_DIR` | _(desativado)_ | `open-sse/executors/promptql/threadSticky.ts` | **Alias alternativa** para `DATA_DIR`, verificado somente quando `DATA_DIR` não está definido. Usado para localizar o cache de sessão fixa de thread no disco do executor PromptQL (`/promptql-thread-sessions.json`); se nenhuma var estiver definida, o cache permanecerá apenas na memória (não persistirá nas reinicializações). | | `OMNIROUTE_PLUGINS_DIR` | _(desativado)_ | `src/lib/plugins/scanner.ts` | Diretório o** scanner de plug-in de tempo de execução** lê — e a raiz que o gerenciador de plugins instala no — substituindo o padrão derivado de casa (#11827). Aponte-o para a árvore de plug-ins montada em bind no Docker/K8s em vez de mover HOME apenas para realocar o caminho de varredura (HOME também rege todos os outros comportamentos relativos à casa). Desmarque = `~/.omniroute/plugins` ou `/tmp/.omniroute/plugins` quando o processo não exporta nenhum home — a não descoberta silenciosa que esta variável remove. O diretório resolvido é registrado uma vez na inicialização como `scanner.dir_resolved` com a entrada que venceu. Apenas no lado do servidor: os plug-ins de comando CLI mantêm seu próprio `OMNIROUTE_PLUGIN_PATH` (seção 9). | | `STORAGE_ENCRYPTION_KEY` | _( = vazio desativado)_ | `src/lib/db/encryption.ts` | Chave AES para criptografia completa do banco de dados SQLite em repouso. Gere com `openssl rand -hex 32`. | | `STORAGE_ENCRYPTION_KEY_VERSION` | `v1` | `scripts/build/bootstrap-env.mjs`, `electron/main.js` | Rótulo da versão da chave de criptografia. Aumente ao executar a rotação de chaves para suportar a descriptografia de backups antigos. | | `DISABLE_SQLITE_AUTO_BACKUP` | `false` | `src/lib/db/backup.ts` | Quando `true`, ignora os backups de arquivos routine/pre-write SQLite (models.dev preços save/clear, gravações de configurações). Os backups manuais e de pré-restauração ainda são executados. Isso acontece** não** desativar o instantâneo de segurança durável obrigatório do executor de migração ou o protetor de migração em massa para um DB persistente existente. Os backups não manuais são limitados para no máximo uma vez a cada 60 minutos. Painel** Configurações de armazenamento →** pode desativar o backup automático de rotina de forma independente. | | `OMNIROUTE_SQLITE_SLOW_MS` | _(unset/off)_ | `src/lib/db/adapters/slowDiagnostics.ts` | Milissegundos; valores abaixo de 1 ou não numéricos ficam desligados; avisa no máximo uma vez a cada 10s; A linha de log possui apenas driver, operação e elapsedMs. | | `OMNIROUTE_SQLITE_OPTIMIZE_ENABLED` | `true` | `src/lib/db/sqlitePlannerStats.ts` | Manutenção de estatísticas do planejador em segundo plano, independente da limpeza de retenção: a primeira passagem de limpeza habilitada (normalmente 30s após a inicialização, após as migrações) executa `PRAGMA optimize=0x10002`; passagens subsequentes a cada 6h executam `PRAGMA optimize` (ou `PRAGMA optimize=0x00002` para análise ilimitada). `false` ou `0` desativa toda a manutenção (sem distinção entre maiúsculas e minúsculas, espaços em branco cortados). Os bancos de dados de memória e os caminhos de backup somente leitura não são afetados. As falhas são registradas, não lançadas. | | `OMNIROUTE_SQLITE_ANALYSIS_LIMIT` | `400` | `src/lib/db/sqlitePlannerStats.ts` | Define `PRAGMA analysis_limit` antes da otimização. Inteiros decimais são fixados em [0, 100000]; Os valores malformed/empty são padronizados como 400. `0` solicita análise exata e ilimitada de tabelas selecionadas pela otimização; a passagem periódica limpa o bit de otimização de amostragem de SQLite para honrar isso. Nenhuma instrução de análise SQL independente é executada. | | `OMNIROUTE_CRYPT_KEY` | _(desativado)_ | `src/lib/db/encryption.ts` | **Alias herdada** para `STORAGE_ENCRYPTION_KEY`. Aceito como substituto quando a variável primária está ausente. | | `OMNIROUTE_API_KEY_BASE64` | _(desativado)_ | `src/lib/db/encryption.ts` | **Alias herdada** (formulário Base64-encoded ) aceito como substituto. Decodificado automaticamente antes do uso. | | `OMNIROUTE_DB_HEALTHCHECK_INTERVAL_MS` | _(desativado)_ | `src/lib/db/core.ts` | Substitua o intervalo periódico de verificação de integridade SQLite (ms). Quando não definidos, os padrões são derivados de `NODE_ENV`. | | `OMNIROUTE_WAL_TRUNCATE_INTERVAL_MS` | _(removido)_ | `src/lib/db/walMaintenance.ts` | **Removido.** Um `wal_checkpoint(TRUNCATE)` periódico ao vivo pode invalidar o mapeamento do índice wal compartilhado e travar o processo com SIGBUS (#13973), de forma que o agendador não exista mais. A variável é inerte: um valor positivo registra um aviso de descontinuação único, enquanto `0` ou unset permanece silencioso. O WAL é mantido pelos pontos de verificação PASSIVE (abaixo) e truncado pelo ponto de verificação de desligamento. | | `OMNIROUTE_WAL_PASSIVE_INTERVAL_MS` | `300000` (5m) | `src/lib/db/walMaintenance.ts` | Substitua o intervalo `wal_checkpoint(PASSIVE)` frequente (ms). Mantém os quadros WAL pendentes pequenos para que os pontos de verificação permaneçam rápidos e o arquivo WAL permaneça limitado entre truncamentos de desligamento. `0` desabilita. | | `OMNIROUTE_WAL_GUARD_MAX_MB` | `256` | `src/lib/db/walMaintenance.ts` | Quando um tick PASSIVE encontrar o arquivo WAL acima desse tamanho, execute `wal_checkpoint(RESTART)` para que o WAL reinicie sem reescrever o índice wal mapeado. Os pontos de verificação do modo truncado ao vivo foram removidos (veja a linha `OMNIROUTE_WAL_TRUNCATE_INTERVAL_MS` ). | | `OMNIROUTE_PRESSURE_SELF_RESTART` | `false` | `open-sse/utils/resourcePressure.ts` | Defina como `1`/`true`/`yes`/`on` para sair do processo após a pressão crítica de recursos ser sustentada para `OMNIROUTE_PRESSURE_SELF_RESTART_AFTER_MS`, permitindo que um supervisor (systemd `Restart=always`, política de reinicialização Docker ) traga de volta um processo limpo em vez de servir 503s indefinidamente. | | `OMNIROUTE_PRESSURE_SELF_RESTART_AFTER_MS` | `120000` (2m) | `open-sse/utils/resourcePressure.ts` | Quanto tempo a pressão crítica deve persistir antes que a saída de reinicialização automática seja acionada. | | `OMNIROUTE_PRESSURE_PSI_DISABLED` | `false` | `open-sse/utils/resourcePressurePolicy.ts` | Defina como `1`/`true`/`yes`/`on` para ignorar `/proc/pressure/memory` em todo o host (`psi_some` / `psi_full`) quando um vizinho barulhento dispara 503s enquanto este processo está correto (#13124). Os protetores de heap Cgroup e V8 permanecem ativados. PSI também para de contar como prova de aceleração do kernel para `cgroup_high`: um total de cgroup acima de `memory.high` torna-se crítico apenas em um aumento de `memory.events` `high`/`max`. Sem `memory.events` a proporção bruta é mantida. | | `OMNIROUTE_SQLJS_WASM_PATH` | _(detecção automática)_ | `src/lib/db/adapters/sqljsAdapter.ts` | Caminho explícito (absoluto ou relativo ao cwd) para `sql-wasm.wasm` ao usar o adaptador substituto `sql.js` WASM. Detectado automaticamente por meio de dependências de pacotes e layouts candidatos quando não definidos. | | `OMNIROUTE_BATCH_RETENTION_DAYS` | `30` | `src/lib/db/cleanup.ts` | Dias em que um terminal (completed/failed/cancelled/expired) Os pontos de verificação do trabalho API em lote, os arquivos input/output/error referenciados e a linha são mantidos pela varredura de limpeza automática antes da exclusão. Só entra em vigor quando `BATCH_AND_FILE_AUTO_CLEANUP_ENABLED` está ativado; corresponde à janela de retenção de saída do próprio lote API do OpenAI. Não afeta a rota `DELETE /api/v1/batches/delete-completed` acionada pelo operador, que permanece incondicional (sem filtro de idade) por design. | | `BATCH_AND_FILE_AUTO_CLEANUP_ENABLED` | `false` | `src/lib/db/cleanup.ts` | Quando `true`, deixe a limpeza automática excluir tarefas do terminal Batch API (e seus pontos de verificação) após `OMNIROUTE_BATCH_RETENTION_DAYS` e limpe o conteúdo BLOB dos arquivos carregados além de seus próprios `expires_at`. Desativado por padrão: cada instalação existente mantém esses dados exatamente como antes até que um operador aceite. Além disso, um sinalizador de recurso editável no painel — consulte `docs/reference/FEATURE_FLAGS.md` → Runtime. | | `OMNIROUTE_SKIP_DB_HEALTHCHECK` | `0` | `src/lib/db/core.ts`, `src/lib/db/healthCheck.ts` | Defina como `1` para ignorar totalmente a verificação de integridade DB na inicialização. Útil para tarefas de curta duração e testes de integração. | | `OMNIROUTE_FORCE_DB_HEALTHCHECK` | `0` | `src/lib/db/core.ts` | Defina como `1` para forçar a ativação do loop DB healthcheck, mesmo quando normalmente seria ignorado (por exemplo, tarefas de curta duração). | | `OMNIROUTE_SKIP_POSTINSTALL` | `0` | `scripts/postinstall.mjs` | Defina como `1` para ignorar o aquecimento do tempo de execução nativo durante `npm install`. Útil em instalações CI/headless onde o sqlite já está compilado. | | `OMNIROUTE_MIGRATIONS_DIR` | _(detecção automática)_ | `src/lib/db/migrationRunner.ts` | Substitua o diretório que o executor de migração verifica. Útil ao enviar migrações agrupadas em compilações personalizadas. | | `OMNIROUTE_EXTRA_MIGRATIONS_DIRS` | _(desativado)_ | `src/lib/db/migrationRunner/extraDirs.ts` | Diretórios de migração adicionais como entradas `namespace=dir` separadas pelo delimitador de caminho da plataforma (por exemplo, `ee=/opt/app/enterprise/db/migrations`). Os arquivos encontrados lá são registrados como `-`, portanto, uma distribuição que envia suas próprias migrações nunca colide com os slots numéricos upstream. Uma entrada malformada, um namespace inválido ou um diretório ausente é lançado na inicialização, em vez de ignorar silenciosamente o esquema. | | `OMNIROUTE_MAX_PENDING_MIGRATIONS` | `50` | `src/lib/db/migrationRunner.ts` | Limite de segurança para migrações pendentes em massa (#3416). A inicialização é interrompida se mais do que esse número de migrações estiverem pendentes em um DB existente (protege contra uma tabela de rastreamento apagada). Aumente-o para restaurar um backup mais antigo; defina como `0` para desativar a verificação. | | `OMNIROUTE_INSTALL_UPGRADE_WORKDIR` | _(`/.install-upgrade`)_ | `scripts/check/check-install-upgrade.mjs` | Diretório de trabalho para o release gate `check:install-upgrade`. Ele precisa de aproximadamente 12 GB (duas árvores de instalação ~ 3 GB mais o tarball), portanto não deve ser executado em um tmpfs pequeno — no executor auto-hospedado `/tmp` é um tmpfs com suporte de RAM de 12 GB e o portão o esgotou, truncando o pacote. | | `OMNIROUTE_SPEND_FLUSH_INTERVAL_MS` | _(padrão no código)_ | `src/lib/spend/batchWriter.ts` | Intervalo de liberação (ms) para o gravador spend/cost em lote. Valores mais baixos reduzem a coalescência de gravação; valores mais altos reduzem a contenção DB. | | `OMNIROUTE_SPEND_MAX_BUFFER_SIZE` | _(padrão no código)_ | `src/lib/spend/batchWriter.ts` | Máximo de entradas de gastos armazenados em buffer antes de uma liberação forçada. Aumente as implantações de alto QPS; menor quando a memória limitada é mais importante. | | `OMNIROUTE_PROXY_FETCH_DEBUG` | _(desativado)_ | `open-sse/utils/proxyFetch.ts` | Defina como `"true"` para emitir logs de depuração `[ProxyFetch]` no caminho de retransmissão Vercel. Desativado por padrão para evitar vazamento de dicas de roteamento. | | `OMNIROUTE_PROXY_CORE_BINARY_PATH` | _(desativado)_ | `src/lib/proxySubscription/coreConfig/sync.ts` | Caminho absoluto do binário principal do proxy local (um arquivo chamado `sing-box` / `mihomo`) que verifica uma configuração principal gerada antes de substituir o arquivo adotado. Unset grava `.generated` apenas ao lado do arquivo adotado. Apenas ambiente host: nunca armazenado no banco de dados nem aceito pelo gerenciamento API, pois o binário é executado. | | `OMNIROUTE_PROXY_CORE_RELOAD_COMMAND` | _(desativado)_ | `src/lib/proxySubscription/coreConfig/reload.ts` | Como o núcleo do proxy local é recarregado após uma substituição de configuração verificada: uma matriz de argumentos JSON executada sem um shell ou exatamente `external` quando um observador externo aplica o arquivo. Nunca armazenado no banco de dados nem exposto por meio do API. | | `PROXY_LOG_INCLUDE_IPS` | `false` | `src/lib/proxyLogger.ts` | Configure como `"true"` ou `"1"` para incluir client/egress IPs e o prefixo da conta na linha detalhada do log do processo `[ProxyEgress]`. Mantido OFF por padrão para que o log do processo não vaze IPs ou o prefixo da conta. | | `OMNIROUTE_DEBUG` | _(desativado)_ | `bin/cli/commands/quota.mjs` | Defina como `1` para imprimir diagnósticos de tempo por solicitação (`[omniroute] GET completed in Nms`) dos comandos CLI quota para stderr. | | `OMNIROUTE_HEALTHCHECK_PATH` | _(auto)_ | `scripts/dev/healthcheck.mjs` | Caminho explícito investigado pela verificação de integridade do contêiner. Não definido, o probe o deriva de `OMNIROUTE_BASE_PATH`; configurá-lo opta novamente pelo endpoint de monitoramento profundo. | | `OMNIROUTE_DEBUG_COMPLETION` | _(desativado)_ | `bin/cli/commands/completion.mjs` | Defina como qualquer valor não vazio para emitir diagnósticos `[omniroute completion]` dos caminhos de cache de conclusão do shell CLI (read/refresh/write). Desativado por padrão — esses caches falham silenciosamente para que um cache missing/corrupt nunca interrompa o preenchimento da guia. | | `BATCH_RETRY_DURATION_MS` | `86400000` (24h) | `open-sse/services/batchProcessor.ts` | Janela máxima de novas tentativas para itens de lote individuais (ms). Os itens que excedem esta duração são marcados como falhados. | | `BATCH_BACKOFF_BASE_MS` | `5000` | `open-sse/services/batchProcessor.ts` | Atraso base (ms) para espera exponencial em novas tentativas de itens em lote. | | `BATCH_BACKOFF_MAX_MS` | `3600000` (1h) | `open-sse/services/batchProcessor.ts` | Limite (ms) para espera exponencial entre novas tentativas de itens em lote. | | `BATCH_MAX_CONCURRENT` | `1` | `open-sse/services/batchProcessor.ts` | Número máximo de lotes processados simultaneamente. Aumente para aumentar o rendimento; mantenha-se baixo para evitar tempestades de limite de taxa. | > [!IMPORTANT] > Antes de alterar um banco de dados persistente existente, o executor de migração publica um instantâneo completo com conteúdo endereçado em `DATA_DIR/db_backups/`. A publicação requer um sistema de arquivos que suporte o mesmo sistema de arquivos, links físicos sem substituição, além de sincronização de arquivos durável. Os hosts POSIX também exigem sincronização de diretório; em Windows, o Node pode rejeitar identificadores de diretório, então OmniRoute libera o arquivo publicado e trata a sincronização de entrada de diretório como o melhor esforço. Se o `DATA_DIR` montado não puder fornecer essas garantias, a inicialização falhará antes de aplicar uma migração. Mova `DATA_DIR` para um volume com essas primitivas; não use `DISABLE_SQLITE_AUTO_BACKUP` para ignorar a segurança da migração. ### Cenários | Cenário | Configuração | | ---------------------------- | ---------------------------------------------------------------------------------------- | | **Desenvolvimento local** | Deixe todos os padrões. DB mora em `~/.omniroute/omniroute.db`. | | **Docker** | `DATA_DIR=/data` + monte um volume em `/data`. | | **Criptografado em repouso** | Defina `STORAGE_ENCRYPTION_KEY` + para manter backups da chave! Perdê-lo = perder dados. | | **CI/Testing** | `DATA_DIR=/tmp/omniroute-test` — efêmero, sem necessidade de criptografia. | --- ## 3. Rede e portas | Variável | Padrão | Arquivo de origem | Descrição | | ------------------------------------------- | -------------------------------------------------- | ------------------------------------------------------------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `PORT` | `20128` | `src/lib/runtime/ports.ts` | Porta primária para endpoints UI e API do Dashboard (modo de porta única). | | `OMNIROUTE_BASE_PATH` | _(raiz = vazia)_ | `next.config.mjs`, `scripts/docker/ensure-docker-base-path.mjs` | Subcaminho URL para servir OmniRoute atrás de um proxy reverso (define Next.js `basePath`; os redirecionamentos de autenticação reconhecem basePath). Por exemplo, `/omniroute`. Em Docker o valor é gerado durante `docker build` (`ARG OMNIROUTE_BASE_PATH`); imagens raiz pré-construídas podem aplicar um valor de tempo de execução diferente uma vez no início do contêiner, antes da inicialização Next.js. Defina `NEXT_PUBLIC_BASE_URL` para a origem pública incluindo o mesmo subcaminho. | | `NEXT_PUBLIC_OMNIROUTE_BASE_PATH` | _(raiz = vazia)_ | `src/shared/hooks/useDisplayBaseUrl.ts` | Espelho de `OMNIROUTE_BASE_PATH` visível no navegador, embutido no tempo de construção para que a exibição do endpoint do painel mostre `https://host/omniroute/v1` em vez de `https://host/v1`. Volta para `OMNIROUTE_BASE_PATH` quando não definido. Reconstrua após a alteração (o próximo `basePath` é o tempo de construção). | | `DASHBOARD_ALLOW_EMBED` | _(não definido = nunca emoldurável)_ | `next.config.mjs`, `scripts/build/dashboardEmbed.mjs` | Incorporação de iframe opcional das páginas HTML. Não definido, todas as rotas são enviadas `frame-ancestors 'none'` + `X-Frame-Options: DENY`. Defina como `vscode` para servir as páginas (painel, login, documentos, landing) com `frame-ancestors 'self' vscode-webview:` e sem `X-Frame-Options`, para que o VS Code Simple Browser possa renderizá-las (modo `dashboardOpen: "editor"` do OmniCopilot). A superfície API (`/api`, `/v1`, `/v1beta`, `/a2a`, `/healthz`, aliases de nível raiz) mantém os cabeçalhos estritos de qualquer maneira. Apenas `vscode` é reconhecido — `1`/`true` não o habilite. Tempo de construção: reconstruir após a alteração (`docker build --build-arg DASHBOARD_ALLOW_EMBED=vscode` para imagens; configurá-lo em uma instalação pré-construída não tem efeito). | | `API_PORT` | _(desativado)_ | `src/lib/runtime/ports.ts` | Quando definido, atende o proxy `/v1/*` API (mais `/v1beta/*` nativo do Gemini) nesta porta separada. | | `API_HOST` | `0.0.0.0` | `src/lib/runtime/ports.ts` | Endereço de ligação para a porta API. | | `DASHBOARD_PORT` | _(desativado)_ | `src/lib/runtime/ports.ts` | Quando definido, atende o Dashboard UI nesta porta separada. | | `OMNI_MAX_CONCURRENT_CONNECTIONS` | `0` _(desativado)_ | `src/sse/utils/backpressure.ts` | Limita conexões de bate-papo simultâneas durante o voo; solicitações acima do limite obtêm `503` com `Retry-After`. Inteiro positivo habilita a guarda; unset/`0` desativa-o. | | `OMNIROUTE_INSTANCE_ID` | _(desativado)_ | `src/shared/resilience/peerRouting.ts` | ID estável e exclusivo para este gateway ao encadear instâncias OmniRoute. Ativa verificações de loop de pares de entrada. Caracteres permitidos: letras, dígitos, `.`, `_`, `:` e `-`; máximo de 64 caracteres. | | `OMNIROUTE_PEER_URLS` | _(desativado)_ | `src/shared/resilience/peerRouting.ts`, `open-sse/executors/base.ts` | URLs OmniRoute por vírgula que pode receber `X-OmniRoute-Peer-Trace`. Somente URLs upstream explicitamente permitidos recebem metadados de pares; todos os outros provedores permanecem intocados. | | `OMNIROUTE_PEER_MAX_HOPS` | `4` | `src/shared/resilience/peerRouting.ts` | Número máximo de instâncias OmniRoute visitadas anteriormente aceitas em uma solicitação encadeada (`1`-`32`). Instâncias repetidas ou um orçamento esgotado retornam HTTP `508 Loop Detected`. | | `PROD_DASHBOARD_PORT` | `20130` | `docker-compose.prod.yml` | Porta publicada no host para o Dashboard no modo de produção Docker. | | `PROD_API_PORT` | `20131` | `docker-compose.prod.yml` | Porta publicada no lado do host para o API no modo de produção Docker. | | `OMNIROUTE_PORT` | _(desativado)_ | `src/lib/runtime/ports.ts` | Tem precedência sobre `PORT` ao executar dentro Electron ou outros wrappers. | | `LIVE_WS_PORT` | `20129` | `src/server/ws/liveServer.ts` | Porta para o servidor de monitoramento WebSocket live em tempo real. | | `LIVE_WS_HOST` | `127.0.0.1` | `src/server/ws/liveServer.ts` | Endereço de ligação para o servidor WebSocket ativo. Defina como `0.0.0.0` para expor no LAN (configure também `LIVE_WS_ALLOWED_ORIGINS`). As conexões são autenticadas com o cookie de sessão do painel ou com uma chave Bearer API que contém um escopo de gerenciamento (`manage`/`admin`). | | `LIVE_WS_ALLOWED_ORIGINS` | _(desativado)_ | `src/server/ws/liveServer.ts` | Origens extras separadas por vírgula permitiam abrir um WebSocket ativo. As origens do painel de loopback já são permitidas por padrão. | | `LIVE_WS_ALLOWED_HOSTS` | _(desativado)_ | `src/server/ws/liveServerAllowList.ts` | Nomes de host extras separados por vírgula permitidos para origens WebSocket ao vivo. Ao contrário de `LIVE_WS_ALLOWED_ORIGINS` (origem completa URLs), corresponde apenas à parte do host — útil para configurações LAN/Tailscale. | | `NEXT_PUBLIC_LIVE_WS_PUBLIC_URL` | _(desativado)_ | `src/hooks/useLiveDashboard.ts` | URL público para o painel ao vivo WebSocket (lado do navegador). Definido ao acessar o servidor WS com um proxy reverso ou túnel Cloudflare (por exemplo, `wss://ws.my-ai.com/live-ws`); o navegador se conecta lá em vez de `ws://hostname:20132`. A parte do nome do caminho também é usada como caminho de atualização WebSocket (padrão: `/live-ws`). | | `OMNIROUTE_ENABLE_LIVE_WS` | `true` | `src/server/ws/liveServer.ts` e `scripts/start-ws-server.mjs` | Defina como `0` ou `false` para desabilitar o servidor WebSocket em tempo real (habilitado por padrão, vinculado a loopback). alternância CI/harness que desativa o script auxiliar WebSocket ao vivo independente. | | `RELAY_IP_PER_MINUTE` | `30` | `src/app/api/v1/relay/chat/completions/route.ts` | Limite de taxa de retransmissão por (token, IP), requests/minute. na memória, por instância. `0` ou negativo desativa a porta de dimensão IP (o limite DB por token ainda se aplica). | | `NODE_ENV` | `production` | núcleo Next.js | Controla o detalhamento do registro, armazenamento em cache, exposição de detalhes de erros e otimizações Next.js. | | `OMNIROUTE_USE_TURBOPACK` | _(desdefinido)_ (seleção automática de compilação) | `scripts/build/build-next-isolated.mjs` | Para `npm run build`, unset ou empty seleciona webpack quando o limite de memória efetivo ( RAM físico ou cota cgroup/process inferior) é no máximo** 16 GiB** ou não pode ser determinado com segurança; acima de 16 GiB, Turbopack é selecionado. `0` explícito força o webpack; `1` explícito e outros valores não vazios diferentes de zero forçam Turbopack. Um valor de ambiente vazio encaminhado pelo Compose não** não** força Turbopack. Esse limite vem de uma regressão de memória de compilação de 15,6 GiB (#18184); compilações de host com 24/32 GiB não foram avaliadas. O webpack de produção ignora automaticamente seu cache persistente por padrão (veja `OMNIROUTE_WEBPACK_BUILD_CACHE` abaixo; #18141) e constrói com RSS de pico substancialmente menor do que o caminho Turbopack atual. O desenvolvimento mantém seu comportamento de empacotador existente.** As compilações Docker já são padronizadas para `0` (webpack)** ; use `--build-arg OMNIROUTE_USE_TURBOPACK=1` para aceitar. Consulte `docs/guides/DOCKER_GUIDE.md`. | | `OMNIROUTE_WEBPACK_BUILD_CACHE` | _(desativado)_ | `next.config.mjs` | As compilações de produção do Webpack (`OMNIROUTE_USE_TURBOPACK=0`) ignoram o cache persistente do sistema de arquivos do webpack, a menos que seja `1`. Escrever esse cache adiciona cerca de 2,5 GB de memória de compilação de pico em um limite de heap de 6144 MB, e compilações limpas nunca o leem de volta. Defina como `1` para manter `.build/next/cache/webpack` para repetições mais rápidas em uma máquina com RAM de sobra; As compilações Docker consideram-no `--build-arg OMNIROUTE_WEBPACK_BUILD_CACHE=1` (estágios do construtor `Dockerfile` e `Dockerfile.bun` ). | | `OMNIROUTE_SKIP_DB_HEALTHCHECK` | _(desativado)_ | `src/lib/db/core.ts` / `src/lib/db/healthCheck.ts` | Defina como `1` para ignorar a verificação de integridade da integridade SQLite na inicialização. Útil para inicialização mais rápida em grandes bancos de dados. | | `NOTIFY_SOCKET` | _(desativado)_ | systemd (protocolo sd_notify) | Definido pelo systemd quando o processo é executado em uma unidade de serviço com integração sd_notify; OmniRoute lê (veja `OMNIROUTE_DISABLE_SD_NOTIFY`) para enviar notificações READY/WATCHDOG. Nunca definido pelo usuário. | | `OMNIROUTE_DISABLE_SD_NOTIFY` | _(desativado)_ | `scripts/dev/systemd-notify.mjs` | Defina como `1` para desativar o systemd sd_notify (digite = notify / WatchdogSec=) mesmo quando estiver executando em uma unidade systemd. O notificador é um sistema externo autônomo, independentemente. | | `CREDENTIAL_HEALTH_CHECK_INTERVAL` | `3600000` | `open-sse/config/constants.ts` / `src/lib/credentialHealth/scheduler.ts` | Intervalo (ms) para o agendador de verificação de integridade de credenciais em segundo plano. Mínimo: 10.000 (10s). | | `CREDENTIAL_HEALTH_CACHE_TTL` | `300000` | `open-sse/config/constants.ts` / `src/lib/credentialHealth/cache.ts` | TTL (ms) para status de integridade da credencial armazenada em cache. | | `OMNIROUTE_DISABLE_CREDENTIAL_HEALTH_CHECK` | `false` | `src/lib/credentialHealth/scheduler.ts` | Defina como `1` ou `true` para desativar testes periódicos em segundo plano de conexões do provedor. Provedores de pesquisa (SEARCH_VALIDATOR_CONFIGS em `src/lib/providers/validation/searchProviders.ts`, por exemplo, `tavily-search`) são sempre excluídos da varredura — sua "validação" é uma consulta upstream faturada real, portanto, a integridade deles nunca é verificada em um cronômetro (#9970). | | `DEEP_HEALTH_CHECK_ENABLED` | `0` | `src/app/api/monitoring/health/route.ts` | Defina como `1` para permitir que um chamador autenticado solicite `/api/monitoring/health?deep=1`, que amostra a superfície de conclusões uma vez por TTL. Chamadores anônimos nunca acionam a investigação. | | `OMNIROUTE_EVENT_LOOP_STALL_THRESHOLD_MS` | `5000` | `src/lib/healthzLag.ts` | Limite de paralisação (ms) para o gravador de loop de eventos de inicialização: um congelamento mais longo que isso registra uma linha `event loop stalled` na retomada com memória e contagens em andamento e ultrapassa o `eventLoopStall` counter/maximum em `/api/monitoring/health`. Defina como `0` para desativar; um valor ilegível ou negativo volta para `5000`. | | `HOST` | `0.0.0.0` | `scripts/dev/run-next.mjs` | Endereço de ligação para o servidor Next.js dev/start. Substitui o `0.0.0.0` padrão quando definido. | | `HOSTNAME` | `127.0.0.1` | `scripts/dev/run-next-playwright.mjs` | Endereço de ligação usado pelo executor Playwright ao iniciar Next.js. O padrão é `127.0.0.1` para testes herméticos.** Não use para `omniroute serve`** — use `OMNIROUTE_SERVER_HOST` em vez disso (POSIX shells definem automaticamente `HOSTNAME` para o nome da máquina; `.env` não pode substituí-lo). | | `OMNIROUTE_SERVER_HOST` | `0.0.0.0` | `bin/cli/commands/serve.mjs` | Endereço de ligação para `omniroute serve`. Evita colisão com a variável POSIX shell `HOSTNAME` (sempre definida como o nome da máquina por bash/zsh). Volta para `0.0.0.0` quando não definido. (#6194) | ### Modos de porta ``` ┌─────────────────────────── Single Port (default) ──────────────────────────┐ │ PORT=20128 │ │ → Dashboard: http://localhost:20128 │ │ → API: http://localhost:20128/v1/chat/completions │ └─────────────────────────────────────────────────────────────────────────────┘ ┌─────────────────────────── Split Ports ─────────────────────────────────────┐ │ DASHBOARD_PORT=20128 │ │ API_PORT=20129 │ │ API_HOST=0.0.0.0 │ │ → Dashboard: http://localhost:20128 │ │ → API: http://0.0.0.0:20129/v1/chat/completions │ │ Use case: Expose API to LAN while restricting Dashboard to localhost. │ └─────────────────────────────────────────────────────────────────────────────┘ ┌─────────────────────────── Docker Production ──────────────────────────────┐ │ PROD_DASHBOARD_PORT=443 PROD_API_PORT=8443 │ │ → Maps container ports to host ports in docker-compose.prod.yml. │ └─────────────────────────────────────────────────────────────────────────────┘ ``` --- ## 4. Segurança e autenticação | Variável | Padrão | Arquivo de origem | Descrição | | ------------------------------------------- | -------------------------------------------------------------------------------------------- | -------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `MACHINE_ID_SALT` | `endpoint-proxy-salt` | `src/lib/auth` | Sal combinado com identificadores de hardware para impressão digital de máquina. Altere por implantação para isolamento. | | `OMNIROUTE_CLI_SALT` | _(desdefinir = sal aleatório por instalação persistido em `/cli-token-salt.json`)_ | `src/lib/machineToken.ts` | HMAC salt para derivar o token de autenticação CLI local. Definir esse valor rotaciona todos os tokens CLI na máquina e sempre tem prioridade sobre o salt persistente. Veja `docs/security/CLI_TOKEN.md`. | | `AUTH_COOKIE_SECURE` | `false` | `src/lib/auth` | Define o sinalizador `Secure` nos cookies de sessão.** Deve ser `true`** ao correr atrás de HTTPS. | | `REQUIRE_API_KEY` | `false` | middleware API | Quando `true`, todas as solicitações de proxy `/v1/*` devem incluir uma chave API válida.** Este sinalizador não bloqueia `GET /v1/models`** , que segue a postura de login do painel (`requireAuthForModels`) em vez de —, portanto, um `401` de `/v1/models` NOT significa que a inferência está protegida. Veja `docs/security/INFERENCE_AUTH_POSTURE.md` (#13695). Aceita `true`, `1` ou `yes`, ignorando maiúsculas e minúsculas e espaços adjacentes; qualquer outro valor (incluindo `on`) está desativado. | | `ALLOW_API_KEY_REVEAL` | `false` | `src/shared/constants/featureFlagDefinitions.ts` | Permite revelar valores completos da chave API no Dashboard UI. Configurável a partir de sinalizadores de recursos do painel; risco de segurança em instâncias compartilhadas. | | `NO_LOG_API_KEY_IDS` | _(vazio)_ | `src/lib/compliance/index.ts` | Chave API separada por vírgula IDs que ignora o registro de solicitações (compatibilidade GDPR ). | | `DEFAULT_RATE_LIMIT_PER_DAY` | _(desativar = ilimitado)_ | `src/shared/utils/apiKeyPolicy.ts` | Orçamento de solicitação diário substituto aplicado a chaves API cuja coluna `rate_limits` é nula. Não definido ou vazio: sem limite implícito (#2289, #11017). `0` é o mesmo (ilimitado). O número inteiro positivo N permite que N/day, 5N/week, 20N/month. Valores não vazios malformados retornem às janelas herdadas 1000/day, 5000/week, 20000/month. | | `MAX_BODY_SIZE_BYTES` | `10485760` (10 MB) | `src/shared/middleware/bodySizeGuard.ts` | Padrão para a configuração `maxBodySizeMb` visível; uma configuração salva tem precedência. `/api/v1/chat/completions` e `/api/v1/responses` mantêm um padrão de 50 MB até que um limite seja salvo; um limite salvo o substitui, para cima ou para baixo, tanto para a proteção do cabeçalho quanto para a admissão de bate-papo em bytes reais. | | `OMNIROUTE_CHAT_LARGE_BODY_BYTES` | `262144` (256 KB) | `src/shared/middleware/chatBodyAdmission.ts` | Os corpos de solicitação reais nesse limite ou acima dele aceitam a concessão de admissão pesada local do processo atômico antes da análise JSON ( caminho BYTE, incluindo `POST /v1/responses`). O mesmo escape de espaço saudável [#10437](https://github.com/diegosouzapw/OmniRoute/pull/10437) que a estrutura pesada; ainda limitado por `OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES` / [#10110](https://github.com/diegosouzapw/OmniRoute/issues/10110) então [#7849](https://github.com/diegosouzapw/OmniRoute/issues/7849) não retorna. | | `OMNIROUTE_CHAT_HARD_MAX_BODY_BYTES` | `52428800` (50 MB) | `src/shared/middleware/chatBodyAdmission.ts` | Limite rígido da rota de bate-papo aplicado contra bytes lidos durante a ingestão limitada, incluindo solicitações com `Content-Length` ausentes, inválidas ou desonestas; o excesso recebe `413`. Um `maxBodySizeMb` salvo substitui o padrão de 50 MB ; quando esta variável é definida, ela também limita o valor salvo. | | `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT` | _(desdefinir — sem limite de contagem de solicitações)_ | `src/shared/middleware/chatBodyAdmission.ts` | **#503-fanout:** esse limite legado de request-COUNT agora é vinculado apenas quando definido explicitamente. Se não for definido (o padrão), a admissão de bate-papo pesado é, em vez disso, bloqueada por `OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES` — um orçamento BYTE derivado automaticamente dimensionado a partir do limite de memória real do processo em** um processo** (uma pilha V8). Dois sobrepostos ~ 750k-token `/v1/responses` abortam ~ 12 Gi heaps (#7849) — a** orçamento de memória** aviso, não é um produto difícil no máximo 2. Um processo saudável (pilha abaixo da taxa de eliminação) MAY admite mais `/v1/responses` longos simultâneos via `OMNIROUTE_CHAT_ADMISSION_HEALTHY_HEADROOM`. Dezenas de clientes SSE longos (40–50) são heap + `OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES` / #10110, não “max 2”. Aumentar cegamente isso para “usar o host” reintroduz #7849. Multiplicar** montes** com** N `DATA_DIR` s independente** (#11024); nunca `replicas>1` em um arquivo SQLite. | | `OMNIROUTE_CHAT_MAX_INFLIGHT_BYTES` | _(derivado automaticamente)_ | `src/shared/middleware/admissionBudget.ts` | **#503-fanout:** substituição para o orçamento de bytes de ingestão derivados automaticamente (25% do teto de memória V8/cgroup mais restrito dividido por amplificação transitória de 8x). Os valores derivados e explícitos são fixados em 8 MiB–2 GiB. Um órgão maior que o orçamento efetivo falha imediatamente com `413 body_exceeds_budget`; a contenção entre órgãos individualmente atendíveis permanece passível de nova tentativa `503`. 40–50 clientes SSE longos simultâneos é esse heap + de orçamento, não um “máximo 2” rígido. Leia `chatAdmission.maxInflightBytes` / `budgetSource` / `pressureSeverity` em `/api/monitoring/health` antes de ajustar. | | `OMNIROUTE_CHAT_ADMISSION_HEAP_SHED_RATIO` | `0.75` | `src/shared/middleware/chatBodyAdmission.ts` | Razão de perda de pressão de pilha (`heapUsed / heap_size_limit`) para admissão de peso pesado BYTE e STRUCTURE (#10183, #10268, #10437). Uma solicitação pesada simultânea após `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT` só é eliminada com o `503` retentável quando o heap é ALSO igual ou superior a essa proporção; em uma pilha saudável, ele é admitido por meio de headroom saudável. | | `OMNIROUTE_CHAT_ADMISSION_HEALTHY_HEADROOM` | `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT` (padrão `1`) | `src/shared/middleware/chatBodyAdmission.ts` | Capacidade extra limitada para o caminho rápido de heap íntegro (#10437) em** ambos** STRUCTURE e BYTE (`admitChatRequest`, incluindo corpos ≥ `OMNIROUTE_CHAT_LARGE_BODY_BYTES`). Sem esse limite, todas as solicitações de heap ocupado, mas íntegro, ignoraram a admissão sem teto. Depois que essas muitas concessões simultâneas estiverem ativas por meio do caminho de heap íntegro, outras solicitações ocupadas passarão para o caminho SAME bounded-wait/shed usado sob pressão de heap real. `0` desativa totalmente o bypass. | | `OMNIROUTE_CHAT_HEAVY_MESSAGE_COUNT` | `200` | `src/shared/middleware/chatBodyAdmission.ts` | Contagem de mensagens que classifica uma solicitação de chat como pesada mesmo quando seu corpo está abaixo do limite de bytes. | | `OMNIROUTE_CHAT_HEAVY_TOOL_COUNT` | `64` | `src/shared/middleware/chatBodyAdmission.ts` | Contagem de ferramentas que classifica uma solicitação de chat como pesada mesmo quando seu corpo está abaixo do limite de bytes. | | `OMNIROUTE_CHAT_HEAVY_ESTIMATED_TOKENS` | `32000` | `src/shared/middleware/chatBodyAdmission.ts` | Estimativa conservadora de token de tamanho de string que classifica uma solicitação como pesada; este é um proxy de custo de admissão, não uma tokenização de faturamento do provedor. | | `OMNIROUTE_CHAT_HARD_MAX_MESSAGES` | `0` (desativado) | `src/shared/middleware/chatBodyAdmission.ts` | Limite opcional de histórico de bate-papo opcional. Desativado por padrão: uma contagem de mensagens é uma política de implantação, não uma propriedade universal de uma solicitação, e o limite aqui rejeita conversas com um terminal `413` antes que o pipeline de compactação possa torná-las utilizáveis. O crescimento do heap é limitado por `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT` e pela redução da pressão do heap. Defina um valor positivo em implantações com restrição de memória que precisam de um limite máximo; o excesso então recebe `413` necessário para compactação estruturada. | | `OMNIROUTE_MAX_NONSTREAMING_RESPONSE_BYTES` | `67108864` (64 MB) | `open-sse/handlers/chatCore/nonStreamingResponseBody.ts` | Hard cap para uma resposta upstream sem streaming armazenada totalmente na memória. Depois disso, o leitor upstream é cancelado e a solicitação falha rapidamente, em vez de aumentar uma sequência ilimitada até que o heap se esgote. | | `OMNIROUTE_FORWARDING_HEADER_BUDGET_BYTES` | `768` | `open-sse/handlers/chatCore/responseHeaders.ts` | Máximo de bytes de ligação encaminhados de cabeçalhos de resposta upstream. Quando o orçamento é excedido, os cabeçalhos de prioridade mais baixa (por exemplo, `x-codex-*` personalizado, `x-oai-request-id`) são descartados para permanecer dentro dos limites comuns de cabeçalho de proxy reverso. Defina um valor mais alto para encaminhar mais metadados upstream ao custo de um tamanho de cabeçalho de resposta maior. | | `OMNIROUTE_QUOTA_RECOVERY_MAX_PER_KEY` | `64` | `src/lib/quota/quotaSessionRecovery.ts` | A maioria dos tickets de recuperação de cota (pendentes, em execução ou aguardando confirmação) pode conter uma chave API. Quando uma chave atinge o limite, um novo turno obtém o erro de cota original em vez de um ticket `202` ; tentar novamente uma curva já estacionada ainda retornará seu tíquete. Valores inválidos ou não positivos usam o padrão. | | `CORS_ORIGIN` | _(desativado)_ | `src/server/cors/origins.ts` | Lista de permissões CORS legada de origem única. Prefira `CORS_ALLOWED_ORIGINS` para novas implantações. CORS é apenas para clientes API de navegador de origem cruzada; gravações de painel autenticadas usam solicitações de mesma origem mais proteção CSRF vinculada à sessão. | | `CORS_ALLOWED_ORIGINS` | _(desativado)_ | `src/server/cors/origins.ts` | Lista de permissões CORS separada por vírgula. Nenhum curinga é enviado, a menos que `CORS_ALLOW_ALL=true` seja configurado explicitamente. | | `CORS_ALLOW_ALL` | `false` | `src/server/cors/origins.ts` | Saída de escape somente para desenvolvimento para ecoar qualquer navegador `Origin`. Não habilite em implantações compartilhadas ou de produção. | | `OUTBOUND_SSRF_GUARD_ENABLED` | `true` | `src/shared/network/outboundUrlGuardPolicy.ts` | Alias herdada. A alternância do painel (uma substituição DB ) é lida antes desse valor de ambiente; `false`, `0`, `no` ou `off` desativa as verificações do host da maneira que o `OMNIROUTE_ALLOW_PRIVATE_PROVIDER_URLS=true` faz, mesmo quando a alternância do painel do sinalizador está desativada; outros valores deixam a guarda para as duas flags abaixo. | | `OMNIROUTE_ALLOW_PRIVATE_PROVIDER_URLS` | `false` | `src/shared/network/outboundUrlGuardPolicy.ts` | Desativa as verificações de host do URL guard de saída, bloco de metadados de nuvem incluído (todos 169.254.0.0/16, metadata.google.internal), nos caminhos do provedor que seguem o modo de proteção: validação URL, descoberta de modelo, URLs base do nó do provedor (incluindo nós de reclassificação remota) e o teste de fallback de proxy, entre outros caminhos de saída adjacentes ao provedor, como busca remota image/media. Ele também permite destinos de webhook privados, exceto endpoints cloud-metadata/link-local, que permanecem bloqueados mesmo com esse sinalizador ativado. As solicitações de bate-papo enviadas por meio do `BaseExecutor.execute()` mantêm a verificação dos metadados da nuvem. Os provedores locais trabalham com os padrões: `OMNIROUTE_ALLOW_LOCAL_PROVIDER_URLS` (padrão `true`) já permite local e LAN URLs nos caminhos de validação, descoberta e nó do provedor; o teste de proxy-fallback e os destinos de webhook privados consultam apenas esse sinalizador e bloqueiam hosts local/LAN enquanto ele está desativado. Substitui `OMNIROUTE_ALLOW_LOCAL_PROVIDER_URLS=false`. Um valor salvo na alternância do painel tem precedência sobre esta variável. | | `OMNIROUTE_ALLOW_LOCAL_PROVIDER_URLS` | `true` | `src/shared/network/outboundUrlGuardPolicy.ts` | Permita o provedor URLs em endereços local/private (127.0.0.1, localhost, LAN, intervalos privados) para validação do provedor, descoberta de modelo, bate-papo e outros caminhos de saída adjacentes ao provedor que o modo de proteção governa.** `true` padrão** (local-first): o guarda então bloqueia os endpoints de metadados da nuvem — todos os 169.254.0.0/16 mais os nomes de host de metadados conhecidos (metadata.google.internal, metadata.goog, Alibaba/Azure/Oracle IMDS, fd00:ec2::254). Defina `false` para o modo somente público, que também bloqueia hosts privados e de loopback. O guarda verifica o nome do host ou o literal IP conforme escrito, antes de qualquer pesquisa DNS ; no modo somente público, o wrapper de busca segura resolve adicionalmente o nome do host e recusa qualquer resposta privada. `OMNIROUTE_ALLOW_PRIVATE_PROVIDER_URLS=true` desativa essas verificações nos caminhos de suas listas de linhas. Provedores locais integrados, como LM Studio, Ollama, vLLM, Llamafile e Triton, ignoram todas as verificações de host para validação de chave e bate-papo. Um valor salvo na alternância do painel tem precedência sobre esta variável. (#5066) | | `AUDIO_REMOTE_PROVIDER_NODES` | `false` | `src/app/api/v1/_shared/audioProviderNodes.ts` | Deixe as rotas `/v1/audio/*` (transcrições, fala, traduções) usarem um nó de provedor compatível com OpenAI hospedado fora do localhost. Desativado por padrão, o roteamento — de áudio para um host remoto altera a identidade de saída e deve ser uma decisão explícita do operador. Os nós Loopback/private (localhost, 127.0.0.1, 172.16-31.x) são sempre permitidos e não são afetados. (#3963) | | `RERANK_REMOTE_PROVIDER_NODES` | `false` | `src/app/api/v1/_shared/rerankProviderNodes.ts` | Deixe `POST /v1/rerank` (e a etapa de reclassificação de loopback do mecanismo de memória) usar um nó de provedor compatível com OpenAI hospedado fora do localhost — uma caixa LAN ou Tailscale peer executando TEI, Infinity, vLLM, etc. Desativado por padrão, o roteamento — para um host remoto altera a identidade de saída e deve ser uma decisão explícita do operador. Nós de loopback (localhost, 127.0.0.1, 172.16-31.x) são sempre permitidos e não são afetados. O URL base de um nó remoto também deve passar pela política URL de saída do provedor (`OMNIROUTE_ALLOW_LOCAL_PROVIDER_URLS` / `OMNIROUTE_ALLOW_PRIVATE_PROVIDER_URLS`). | | `OMNIROUTE_LOCAL_PROVIDER_NODE_HOSTS` | _(vazio)_ | `src/shared/network/localNodeHosts.ts` | Nomes de host (separados por vírgula ou espaço em branco) que o roteamento do nó do provedor trata como — local, normalmente o nome do serviço Docker/Compose de um reclassificador, TEI ou arquivo secundário de áudio na própria rede Docker do OmniRoute(`http://reranker:8080/v1`), portanto, o nó não precisa de um contêiner codificado IP. Os hosts listados são elegíveis para `/v1/rerank`, `/v1/audio/*` e verificação de integridade local sem ativar `RERANK_REMOTE_PROVIDER_NODES` / `AUDIO_REMOTE_PROVIDER_NODES` para cada nó remoto e são chamados diretamente — nunca por meio `HTTP(S)_PROXY` ou de um proxy fixado de conexão. Eles ainda enviam a chave API da conexão. Somente nomes de rótulo único e nomes `.internal`/`.local` são aceitos; Public FQDNs, literais IP e nomes de metadados de nuvem são ignorados com um aviso. (#14635) | | `OMNIROUTE_OIDC_DISABLE_PASSWORD_LOGIN` | `false` | `src/app/api/auth/login/route.ts` | Quando OIDC estiver ativado, desative o login com senha para que os usuários possam autenticar somente por meio do logon único OIDC. O alias `OIDC_DISABLE_PASSWORD_LOGIN` também é aceito; o sinalizador de recurso do painel da mesma chave tem precedência. (#10889) | | `OIDC_DISABLE_PASSWORD_LOGIN` | `false` | `src/app/api/auth/login/route.ts` | Alias simples de `OMNIROUTE_OIDC_DISABLE_PASSWORD_LOGIN` (#10889). | | `OMNIROUTE_DISABLE_MFA` | `false` | `src/server/auth/dashboardMfa.ts` | Recuperação de dispositivo perdido para o painel opcional TOTP login de dois fatores. Quando `true`, o segundo fator é ignorado apenas para uma entrada do próprio host (loopback peer e loopback `Host`); logins remotos e `POST /api/cli/connect` de outras origens ainda exigem o código. Faça login localmente, desative os dois fatores em Configurações → Security (o código pode ser deixado em branco enquanto estiver definido, para que um fator que não seja mais verificado possa ser removido; a senha ainda é necessária) e, em seguida, desmarque-o. TOTP cobre login por senha e `omniroute connect` apenas — OIDC/SSO login depende do segundo fator do próprio provedor de identidade. Veja [AUTHZ_GUIDE](../architecture/AUTHZ_GUIDE.md#optional-totp-two-factor-login-16619). | ### Lista de verificação de endurecimento ```bash # Production security minimum: AUTH_COOKIE_SECURE=true # Requires HTTPS REQUIRE_API_KEY=true # Authenticate all proxy calls ALLOW_API_KEY_REVEAL=false # Never expose keys in UI CORS_ALLOWED_ORIGINS=https://your.domain.com MAX_BODY_SIZE_BYTES=5242880 # 5 MB limit ``` --- ## 5. Sanitização de entrada e proteção PII OmniRoute fornece uma defesa de duas camadas: varredura de injeção no lado da solicitação e remoção PII no lado da resposta. > **Limitações ⚠️ :** Essas proteções são detecções heurísticas de _melhor esforço_, não um firewall completo de injeção de prompt ou sistema PII DLP. Eles podem produzir falsos positivos (prompts persona/RPG benignos sinalizados) e falsos negativos (leetspeak, espaçamento, padrões que não sejam do inglês). Eles não são suficientes por si só para a conformidade. Ajuste os modos e teste seu tráfego antes de confiar neles. ### Lado da solicitação: proteção de injeção imediata | Variável | Padrão | Arquivo de origem | Descrição | | --------------------------------- | -------------- | ---------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `INPUT_SANITIZER_ENABLED` | `true` | `src/middleware/promptInjectionGuard.ts` | Habilite a verificação de mensagens recebidas em busca de padrões de injeção de prompt. | | `INPUT_SANITIZER_MODE` | `warn` | `src/middleware/promptInjectionGuard.ts` | Política de injeção: `warn` = log apenas, `block` = rejeita solicitação com 400. O legado `redact` faz** não** texto de injeção de tira; use `PII_REDACTION_ENABLED` para solicitar reescrita PII. | | `INJECTION_GUARD_MODE` | _(desativado)_ | `src/middleware/promptInjectionGuard.ts` | Alias legado para `INPUT_SANITIZER_MODE` — mesmo comportamento. | | `INPUT_SANITIZER_BLOCK_THRESHOLD` | `high` | `src/shared/utils/injectionSeverity.ts` | Gravidade mínima que `MODE=block` rejeita: `high` (padrão), `medium` ou `low`. Os padrões médios são apenas de observação, a menos que sejam reduzidos. | | `INJECTION_GUARD_BLOCK_THRESHOLD` | _(desativado)_ | `src/shared/utils/injectionSeverity.ts` | Alias legado para `INPUT_SANITIZER_BLOCK_THRESHOLD` — mesmo comportamento. | | `PII_REDACTION_ENABLED` | `false` | `src/lib/guardrails/piiMasker.ts` | Quando `true`, edite PII nas solicitações recebidas (independentemente do modo de injeção). | | `CREDENTIAL_REDACTION_ENABLED` | `false` | `src/lib/guardrails/credentialMasker.ts` | Edite padrões conhecidos de chave de API/token secreto de cargas request/response. Aceitar; espelhos `PII_REDACTION_ENABLED`. | ### Lado da resposta: PII Sanitizer | Variável | Padrão | Arquivo de origem | Descrição | | -------------------------------- | -------- | ------------------------- | ----------------------------------------------------------------------------------- | | `PII_RESPONSE_SANITIZATION` | `false` | `src/lib/piiSanitizer.ts` | Verifique as respostas LLM em busca de PII vazado antes de retornar ao cliente. | | `PII_RESPONSE_SANITIZATION_MODE` | `redact` | `src/lib/piiSanitizer.ts` | `redact` = máscara PII, `warn` = somente log, `block` = elimina a resposta inteira. | ### Sanitizador de contexto de rota tokenizada de código VS | Variável | Padrão | Arquivo de origem | Descrição | | ----------------------------------- | ------ | ------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `OMNIROUTE_VSCODE_SANITIZE_CONTEXT` | `1` | `src/app/api/v1/vscode/contextSanitizer.ts` | Retira o contexto implícito do editor ativo (`editorContext`, `activeEditor`, `currentFile`, `selection`, `openTabs`…) das solicitações `/v1/vscode/[token]/*` e edita o conteúdo de arquivos confidenciais anexados explicitamente. Seguro por padrão; defina como `0` para desativar. | ### Cenários | Cenário | Configuração | | ---------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | **Conformidade empresarial** | `INPUT_SANITIZER_ENABLED=true`, `INPUT_SANITIZER_MODE=block`, `PII_REDACTION_ENABLED=true`, `PII_RESPONSE_SANITIZATION=true` (blocos de injeção + request/response PII redação; os modos são independentes) | | **Somente monitoramento** | `INPUT_SANITIZER_ENABLED=true`, `INPUT_SANITIZER_MODE=warn` — registra mas nunca bloqueia | | **Uso pessoal** | Deixe todos — desativados com sobrecarga zero | --- ## 6. Políticas de ferramentas e roteamento | Variável | Padrão | Arquivo de origem | Descrição | | ----------------------------------------------------------- | ---------------------------- | ----------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `TOOL_POLICY_MODE` | `disabled` | `src/lib/toolPolicy.ts` | Controla o acesso LLM tool/function-calling. `allowlist` = apenas ferramentas listadas, `denylist` = todas exceto as listadas, `disabled` = sem restrições. | | `OMNIROUTE_PAYLOAD_RULES_PATH` | `./config/payloadRules.json` | `open-sse/services/payloadRules.ts` | Caminho para o arquivo JSON das regras de manipulação de carga útil (ajustes upstream per-model/protocol ). | | `OMNIROUTE_PAYLOAD_RULES_RELOAD_MS` | `5000` | `open-sse/services/payloadRules.ts` | Intervalo de recarga (ms) para recarregar a quente o arquivo de regras de carga útil. `1000` mínimo. | | `OMNIROUTE_PREFER_CLAUDE_CODE_FOR_UNPREFIXED_CLAUDE_MODELS` | `false` | `open-sse/services/model.ts` | Aceitação: encaminhe o modelo `claude-*` simples IDs dos clientes Claude Code por meio da conta Claude Code OAuth em vez de exigir um prefixo de provedor. Os prefixos de provedor explícitos ainda vencem. Também configurável por meio de um painel de alternância na página do provedor Claude. | | `OMNIROUTE_REDACT_THINKING` | `true` | `open-sse/executors/base/redactThinkingBeta.ts` | Defina `false` para impedir que OmniRoute adicione o próprio `redact-thinking-2026-02-12` Anthropic beta (blocos de pensamento vazios apenas com assinatura). Solicitações com `thinking.display: "summarized"` ignoram independentemente; uma edição beta negociada pelo cliente ou uma opção `requestDefaults.redactThinking` compatível com CC o mantém. As solicitações Claude OAuth mantêm o beta (faz parte da impressão digital OAuth do código Claude ), a menos que o sinalizador de recurso `CLAUDE_OAUTH_SUMMARIZED_THINKING_UNREDACTED` desativado por padrão esteja ativado. | | `BARE_MODEL_DEFAULT_OVERRIDE_LEGACY` | `false` | `open-sse/services/model.ts` | Comportamento herdado `resolveBareModelToConnectionDefault` (#4825): substitua qualquer nome de modelo simples pelo `defaultModel` da conexão selecionada. Desativado por padrão, apenas `auto` ou um modelo vazio é substituído; registra um aviso por par quando ativado. | | `COMBO_CONCURRENCY_PER_MODEL` | `3` | `open-sse/services/comboConfig.ts` | Limite de simultaneidade por modelo para combos round-robin (#9100). O semáforo combinado round-robin foi limitado a 3 solicitações simultâneas por modelo, sem substituição, serializando o tráfego de maior simultaneidade por trás desse limite. Validado para `>= 1`, fixado em `<= 32`. | | `OMNIROUTE_AGENTIC_STALL_FAILOVER` | `false` | `open-sse/services/combo/agenticStallFailover.ts` | Opt-in: definido como `1` (ou `true`) para que um membro do combo respondendo a uma curva de resultado de ferramenta com narração `finish: stop` + + zero chamadas de ferramenta faça failover para o próximo alvo (estratégias de loop de prioridade, round-robin e sessões fixadas). Se nenhum alvo tiver melhor desempenho, a resposta paralisada será retornada em vez de um erro, e nem o disjuntor do provedor nem o bloqueio do modelo serão cobrados. Os turnos transmitidos são retidos do cliente até que o veredicto seja definido. As solicitações que usam a forma Respostas API `input` não são classificadas. Padrão OFF. | | `DISABLE_CONTEXT_WINDOW_CHECKS` | `false` | `open-sse/handlers/chatCore.ts` | Opção perigosa que ignora a verificação da janela de contexto local / token de entrada máxima de OmniRoute para solicitações diretas de modelo único. Os provedores upstream ainda impõem seus limites reais; a compactação imediata e o próprio limite de token de saída do modelo permanecem ativos. A precedência efetiva é Sinalizadores de Recurso DB override variável de ambiente > > default; nenhuma reinicialização é necessária. | | `OMNIROUTE_SELF_HOSTED_PROVIDERS` | _(desativado)_ | `open-sse/services/selfHostedEntry.ts` | Documento YAML `providers:` embutido (RIC-738, D4). Quando definido (com ou sem um bloco `strategy:` ), `/v1/chat/completions` desvia para a entrada compatível com OpenAI unificada auto-hospedada em vez do pipeline de nuvem. Não definido (o padrão): a rota passa direto para o pipeline de nuvem existente. Veja `docs/routing/SELF_HOSTED_OPENAI_ENTRY.md`. | | `OMNIROUTE_SELF_HOSTED_PROVIDERS_FILE` | _(desativado)_ | `open-sse/services/selfHostedEntry.ts` | Caminho para um arquivo YAML contendo o mesmo documento `providers:` que `OMNIROUTE_SELF_HOSTED_PROVIDERS`, para implantações que preferem um arquivo em vez de um ambiente inline var. Qualquer um deles ativa a entrada auto-hospedada. | | `OMNIROUTE_SELF_HOSTED_API_KEY` | _(desativar rota aberta — )_ | `open-sse/services/selfHostedEntry.ts` | Chave API compartilhada opcional para a entrada auto-hospedada unificada (andaime D5, reservada para o sistema de cotas por chave). Quando definidas, as solicitações devem incluir `Authorization: Bearer `. Não definido: a rota está aberta, correspondendo ao padrão de provedor local auto-hospedado existente (implantação loopback/trusted-network ). | | `OMNIROUTE_SELF_HOSTED_STRATEGY` | _(desativado)_ | `open-sse/services/routingStrategies.ts` | Documento YAML `strategy:` embutido para o mecanismo de roteamento determinístico (M2/RIC-740, D3) — blacklist/whitelist, disjuntor de resfriamento, prioridade de custo, reconhecimento de latência, cadeia de fallback. Substitui um bloco `strategy:` embutido aninhado dentro de `OMNIROUTE_SELF_HOSTED_PROVIDERS`, por chave. Veja `docs/routing/DETERMINISTIC_ROUTING.md`. | | `OMNIROUTE_SELF_HOSTED_STRATEGY_FILE` | _(desativado)_ | `open-sse/services/routingStrategies.ts` | Caminho para um arquivo YAML contendo o mesmo documento `strategy:` que `OMNIROUTE_SELF_HOSTED_STRATEGY`, para implantações que preferem um arquivo em vez de um ambiente inline var. | | `OMNIROUTE_DISABLE_CONVERSATION_TRACKING` | _(desativado)_ | `open-sse/services/conversationTracker.ts` | Configure `1` para parar de coletar o histórico de conversas. `resolveConversationId()` retorna um resultado não rastreado antes de ler SQLite ou analisar o histórico de mensagens, e a sessão IDs fornecida pelo cliente também é abordada. O tratamento da sessão de roteamento permanece inalterado e os registros existentes não são excluídos. Para implantações que não usam a visualização de conversa do painel e desejam que a mesa giratória pare de crescer. | | `OMNIROUTE_NADIR_API_KEY` | _(desativado)_ | `open-sse/services/autoCombo/nadirStrategy.ts` | Chave API para a estratégia de roteador de combinação automática `nadir` opcional, usada quando o próprio `config.nadir.apiKey` do combo não está definido. Opcional: chamadas sem chave chegam ao nível anônimo do Nadir, que tem taxa limitada por IP e, portanto, não pode ser usado atrás de um gateway compartilhado. Confidencial; prefira o campo por combo quando os combos usam contas diferentes. | | `OMNIROUTE_NADIR_BASE_URL` | `https://api.getnadir.com` | `open-sse/services/autoCombo/nadirStrategy.ts` | Origem base da decisão Nadir API, usada quando o próprio `config.nadir.baseUrl` do combo não está definido. Necessário apenas para um Nadir auto-hospedado, que mantém alertas dentro de sua própria rede. Um `/v1` final é tolerado e eliminado. | | `OMNIROUTE_API_KEY_WEEKLY_WINDOW` | `provider` | `src/lib/usage/apiKeyUsageLimits.ts` | Janela semanal para limites de uso USD por chave de API (aplicação de solicitação, `GET /api/keys/{id}/usage-limits`, `@@om-usage`). `provider`: a semana termina na primeira redefinição semanal entre as conexões upstream que a chave pode alcançar ou dura 7 dias consecutivos quando nenhuma é conhecida. `calendar`: a semana local de segunda-feira às 00h00 até a próxima segunda-feira às 00h00, idêntica para cada chave. `calendar` é recomendado quando um conjunto de contas upstream é compartilhado por muitas chaves orçadas individualmente. Valores inválidos voltam para `provider`. | | `OMNIROUTE_API_KEY_WEEKLY_WINDOW_TIMEZONE` | _(fuso horário do processo)_ | `src/lib/usage/apiKeyUsageLimits.ts` | fuso horário IANA (por exemplo `Asia/Shanghai`) que define segunda-feira 00:00 para a janela semanal `calendar`. Não definido ou inválido: o fuso horário do processo OmniRoute (o `TZ` do host ou contêiner, que geralmente não está definido, ou seja, Tempo Universal Coordenado, em imagens de contêiner). Ignorado no modo `provider`. | | `OMNIROUTE_MAX_TOOLS_LIMIT` | `128` | `open-sse/config/constants.ts` | Número máximo padrão de ferramentas permitidas em uma solicitação (OpenAI default). Apenas números inteiros positivos; valores não definidos ou inválidos mantêm `128`. Um provedor com limite known/proactive (`grok-cli` 200, `nvidia` 1536) ainda aplica seu próprio limite — isso apenas move o teto padrão. Os destinos no formato Claude não têm limite padrão (o API de Mensagens não tem nenhum); um limite aprendido ainda se aplica. | | `OMNIROUTE_TOOL_OUTPUT_IMAGE_MAX_COUNT` | `16` | `open-sse/translator/request/openai-responses.ts` | Respostas à tradução do Chat: quantas imagens de saída da ferramenta (`function_call_output`, `custom_tool_call_output`, role `tool`) são reenviadas como partes de imagem do usuário por solicitação. Os mais novos são mantidos e cada um dos mais antigos se torna um espaço reservado para texto com seu `tool_call_id`. Apenas números inteiros positivos; valores não definidos ou inválidos mantêm `16`. | | `OMNIROUTE_TOOL_OUTPUT_IMAGE_MAX_BYTES` | `20971520` (20 MB) | `open-sse/translator/request/openai-responses.ts` | Tamanho total da imagem de saída da ferramenta URLs reenviada por solicitação na mesma tradução. As imagens que ultrapassarem o orçamento serão descartadas primeiro, com um aviso por solicitação. Apenas números inteiros positivos; valores não definidos ou inválidos mantêm `20971520`. | | `OMNIROUTE_RESPONSES_STRICT_TOOL_HISTORY` | `false` | `open-sse/translator/helpers/responsesToolHistory.ts` | Como o histórico inconsistente da ferramenta Respostas é tratado: uma saída sem chamada, uma chamada sem saída, um `call_id` ausente, longo ou inválido ou argumentos históricos malformados. Desligado, OmniRoute repara o histórico e o despacha (saídas órfãs são descartadas, chamadas não atendidas obtêm uma saída vazia, ids são cunhados ou fixados, argumentos malformados tornam-se `{}`). Ativado, a solicitação recebe um `400` antes do envio; um histórico válido é encaminhado com seus IDs de chamada e argumentos JSON conforme enviado. Aceita `true` ou `1`; qualquer outro valor mantém o padrão. | | `OMNIROUTE_PROMPT_EMULATE_TOOLS` | _(sobre)_ | `open-sse/executors/syntxChat.ts` | chamada de ferramenta emulada por prompt SYNTX.ai: unset ou `1`/`true`/`on`/`yes` injeta o catálogo de ferramentas local no prompt; qualquer outro valor (por exemplo, `0`) ignora essa injeção. | --- ## 7. URLs e sincronização em nuvem | Variável | Padrão | Arquivo de origem | Descrição | | ------------------------------------------- | --------------------------------------------------------- | --------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `BASE_URL` | `http://localhost:20128` | `src/lib/cloudSync.ts` | URL do lado do servidor para trabalhos de sincronização interna chamarem `/api/sync/cloud`. Mantenha isso como um loopback/container URL mesmo quando o aplicativo estiver com proxy público. As habilidades A2A também o utilizam (consulte `OMNIROUTE_BASE_URL`) e falham em vez de enviar uma chave API para um http simples público URL. | | `CLOUD_URL` | _(vazio)_ | `src/lib/cloudSync.ts` | Endpoint de retransmissão em nuvem URL (recurso premium). | | `CLOUD_SYNC_TIMEOUT_MS` | `12000` | `src/lib/cloudSync.ts` | Tempo limite HTTP para solicitações de sincronização na nuvem. | | `OMNIROUTE_BUILD_PROFILE` | `full` | Configuração de compilação do Webpack | Perfil em tempo de construção (definido como `minimal` para excluir fisicamente módulos privilegiados do pacote). | | `OMNIROUTE_STANDALONE_DIR` | _.construir/saída autônoma_ | `scripts/build/colocate-standalone.mjs` | Substituição em tempo de compilação para o diretório de saída independente consumido pela etapa de colocation pós-construção. Não é uma configuração de tempo de execução. | | `OMNIROUTE_DIST_DIR` | `dist/` (raiz do repositório) | `scripts/build/prepublish.ts` | Substituição em tempo de construção para o diretório em que a etapa de publicação (`prepublish.ts`) grava o pacote CLI, em vez de `dist/` na raiz do repositório. O diretório é apagado antes da construção. Não é uma configuração de tempo de execução. | | `OMNIROUTE_CLOUD_SYNC_SECRET` | _(vazio)_ | `src/lib/cloudSync.ts` | Segredo compartilhado usado para verificar a assinatura HMAC-SHA256 das respostas do Cloud Sync. | | `OMNIROUTE_CLOUD_SYNC_SECRETS` | `false` | `src/lib/cloudSync.ts` | Defina como `true` para permitir que o endpoint do Cloud Sync substitua as credenciais locais. O padrão é `false`. | | `OMNIROUTE_CLOUD_SYNC_ENFORCE_SIGNATURE` | `false` | `src/lib/cloudSync.ts` | Defina como `true` para rejeitar uma resposta não assinada do Cloud Sync quando nenhum segredo local estiver configurado (#13679). Uma assinatura presente é sempre verificada — e sempre rejeitada quando `OMNIROUTE_CLOUD_SYNC_SECRET` não é definido como — independentemente deste sinalizador. O padrão muda para aplicado na v3.9. | | `OMNIROUTE_ZED_IMPORT_LEGACY_ONE_STEP` | `false` | `src/app/api/providers/zed/import/route.ts` | Defina como `true` para voltar ao comportamento de "importar tudo" de uma etapa da v3.8.5 sem confirmação do usuário. | | `NEXT_PUBLIC_BASE_URL` | `http://localhost:20128` | OAuth, Painel, sincronização | URL voltado ao público para OAuth redirect_uri, links do painel e URLs público gerado. Defina isso como URL público estável quando retornos de chamada OAuth ou links de navegador gerados devem usar um host de proxy reverso canônico. | | `NEXT_PUBLIC_CLOUD_URL` | _(vazio)_ | Lado do cliente | Espelho do lado do cliente de `CLOUD_URL`. | | `NEXT_PUBLIC_APP_URL` | _(desativado)_ | `src/shared/services/cloudSyncScheduler.ts` | Fallback legado para `NEXT_PUBLIC_BASE_URL`. | | `NEXT_PUBLIC_PORT` | _(desativar — volta para `PORT`)_ | `src/shared/hooks/useDisplayBaseUrl.ts` | Porta substituta do lado do cliente para exibição URLs quando nenhuma origem é conhecida (SSR/tests); leia antes de `PORT`. | | `OMNIROUTE_PUBLIC_BASE_URL` | _(desativado)_ | Resolvedor de origem pública, imagem URLs | Origem OmniRoute voltada para o navegador de mais alta prioridade usada para geração pública URL e validação de origem do navegador sem painel. Defina isso quando OpenWebUI ou outro relé atingir OmniRoute por um URL interno, mas o navegador do usuário deve buscar a mídia gerada de um LAN, túnel ou origem pública. Fazer** não** inclui `/v1`. | | `OMNIROUTE_PROVIDER_MANIFEST_URL` | _(desativado)_ | `open-sse/config/providerPluginManifestUrl.ts` | Manifesto do plugin do provedor absoluto URL anunciado para clientes secundários. Quando não definido, OmniRoute deriva `/api/v1/provider-plugin-manifest` da origem da solicitação ou HOST/PORT. | | `OMNIROUTE_PUBLIC_PROTOCOL` | `http` | `open-sse/config/providerPluginManifestUrl.ts` | Protocolo usado ao derivar o manifesto do plug-in do provedor URL do HOST/PORT sem uma origem de solicitação. Defina como `https` atrás de um proxy público com terminação TLS quando nenhum `OMNIROUTE_PROVIDER_MANIFEST_URL` explícito estiver definido. | | `OMNIROUTE_TRUST_PROXY` | _(desativado)_ | `src/server/origin/publicOrigin.ts` | Modo de confiança opcional para cabeçalhos de origem pública encaminhados. Unset = não confia em `Forwarded` / `X-Forwarded-*` para decisões de segurança. `true` / `loopback` confia no host/proto encaminhado apenas de um proxy de loopback com carimbo de token. `private` / `lan` também confia em pares de proxy de LAN privada, permite que a ponte `API_PORT` mantenha o `X-Forwarded-For` de tal par e permite que as rotas LOCAL_ONLY aceitem um cliente de rede privada que tal proxy reporta (nunca uma solicitação de túnel Cloudflare, uma cadeia somente de loopback ou o portão de token CLI somente de loopback). Prefira `NEXT_PUBLIC_BASE_URL` explícito na produção. | | `KIE_CALLBACK_URL` | _(desativado)_ | `open-sse/utils/kieTask.ts` | Retorno de chamada público URL para trabalhos assíncronos kie.ai. Substituição de prioridade mais alta antes `OMNIROUTE_KIE_CALLBACK_URL` e `OMNIROUTE_PUBLIC_URL`. | | `OMNIROUTE_KIE_CALLBACK_URL` | _(desativado)_ | `open-sse/utils/kieTask.ts` | Ortografia alternativa de `KIE_CALLBACK_URL`. Retorna quando a variável primária não está definida. | | `OMNIROUTE_PUBLIC_URL` | _(desativado)_ | `open-sse/utils/kieTask.ts` | Origem pública usada para compor o retorno de chamada assíncrono URLs. Fallback de menor prioridade para retornos de chamada kie.ai; também usado como URL público genérico para outros relés. | | `OMNIROUTE_CROF_USAGE_URL` | `https://crof.ai/usage_api/` | `open-sse/services/usage.ts` | Endpoint de pesquisa de cota CrofAI usado pela página Uso. Substituição para relés/dispositivos de teste. | | `OMNIROUTE_CLINEPASS_USAGE_URL` | `https://api.cline.bot/api/v1/users/me/plan/usage-limits` | `open-sse/services/usage/clinepass.ts` | Endpoint de cota ClinePass de 5 horas/semanal/mensal usado pela página Uso. Substituição para relés/dispositivos de teste. | | `OMNIROUTE_OPENCODE_QUOTA_URL` | `https://opencode.ai/zen/go/v1/usage` | `open-sse/services/opencodeQuotaFetcher.ts` | Endpoint oficial de uso OpenCode Go autenticado por chave de API usado pela página Uso. Substituição para relés/dispositivos de teste. | | `OPENCODE_SYNTHESIZE_CLI_HEADERS` | `true` | `open-sse/executors/opencode.ts` | Sintetize os cabeçalhos de identidade OpenCode CLI (User-Agent, x-opencode-client/project, request/session UUIDs) nas solicitações upstream opencode-go/zen que o cliente não enviou, portanto, Cloudflare na saída VPS os aceita (#6210/#5997). Ativado por padrão desde #10571; desative com `false`/`0`/`no`/`off`. | | `OPENCODE_USER_AGENT` | `opencode/1.18.31` | `open-sse/utils/opencodeHeaders.ts` | User-Agent padrão usado quando `OPENCODE_SYNTHESIZE_CLI_HEADERS` está ativado e nenhuma substituição `_USER_AGENT` por provedor está definida. Aplicado apenas a executores de código aberto. Em uma solicitação sem chave nas portas upstream, um valor configurado que não carrega `opencode/= 1.17>` é substituído por esse padrão em vez de ser recusado. | | `OMNIROUTE_FORWARD_ATTRIBUTION` | `1` (ligado) | `open-sse/utils/opencodeHeaders.ts` | Encaminhe cabeçalhos de atribuição de aplicativo cliente (`x-session-id`, `x-title`, `http-referer`) para provedores upstream, de modo que uma solicitação que comece dentro de um chicote listado mantenha sua identidade por meio do roteador (OpenRouter publisher gates key neles). `0`/`false`/`no`/`off` mantém a identidade registry/operator e elimina os valores fornecidos pelo cliente. Os cabeçalhos personalizados configurados pelo operador sempre superam os valores do cliente. | | `OPENCODE_CLIENT` | `desktop` | `open-sse/executors/opencode.ts` | Valor para o cabeçalho `x-opencode-client` sintetizado quando `OPENCODE_SYNTHESIZE_CLI_HEADERS` está ativado. | | `OPENCODE_PROJECT` | `global` | `open-sse/executors/opencode.ts` | Valor para o cabeçalho `x-opencode-project` sintetizado quando `OPENCODE_SYNTHESIZE_CLI_HEADERS` está ativado. | | `OMNIROUTE_EGRESS_IP_LOCK_PROVIDERS` | _(desativado)_ | `open-sse/config/providerErrorRules.ts` | Conjunto eficaz de provedores cujas falhas upstream são agrupadas pela saída IP (um 429 estaciona cada conexão irmã compartilhando esse IP). Unset usa o padrão de nível gratuito `opencode,opencode-go,opencode-cli`; `none`/`off`/`false`/`0` desativa totalmente a cascata; uma lista separada por vírgula substitui o conjunto. Os planos pagos são upstream agrupados em contas e podem desativá-los com segurança (#9611). | | `OMNIROUTE_EGRESS_QUOTA_ROTATION_PROVIDERS` | _(desativado)_ | `open-sse/config/providerErrorRules.ts` | Escopo de rotação de saída de recusa de cota. Unset separa um membro do pool em um 429 apenas para a família com intervalo de IP acima; `all` estende essa gravação a todos os provedores, de modo que um limite de taxa recebido por meio de um membro faz com que a próxima escolha saia em outro lugar. Qualquer valor diferente de `all` será ignorado. Precisa de `PROXY_SKIP_RECENTLY_FAILED` (ativado por padrão). A loja é codificada por endereço de saída, não por (provedor, endereço), portanto, são 429 parques ampliados para cada provedor até que o período decorra (5 min, dobrando para 15). Leia o resultado por resposta, para que uma alteração seja aplicada sem reinicialização. | | `OPENCODE_FREE_TIER_REQUEST_CONTRACT` | _(desativado)_ | `open-sse/executors/opencodeFreeTierContract.ts` | Defina como `off` para parar de ajustar o corpo das solicitações OpenCode sem chave (sinalizador de streaming e lista de ferramentas). Os cabeçalhos ainda são aplicados. Leia por solicitação, para que uma alteração entre em vigor imediatamente. | | `OPENCODE_FREE_TIER_PLACEHOLDER_TOOLS` | _(desativado)_ | `open-sse/executors/opencodeFreeTierContract.ts` | Nomes de ferramentas separados por vírgula para declarar em uma solicitação OpenCode sem chave que não carrega nenhuma, quando nada foi observado ainda para esse modelo. Vazio volta para um único espaço reservado que o modelo é instruído a não chamar. No máximo 32 entradas, `[A-Za-z_][A-Za-z0-9_-]{0,63}`; entradas inválidas são ignoradas. | | `OPENCODE_FREE_TIER_CREDENTIAL` | `public` | `open-sse/executors/opencodeFreeTierContract.ts` | Credencial enviada na via de nível livre fechada (`https://opencode.ai/inference/v1`). Desde 21/10/2026, essa pista responde 403 `Model access is disabled` a uma chave API real e, em vez disso, serve o literal anônimo. `key` mantém a chave API do operador, `none`/`off` não envia nenhum cabeçalho de credencial, qualquer outro literal é enviado como token de portador. Leia por solicitação. | | `OPENCODE_FREE_TIER_RELAY_URL` | desarmar | `src/lib/opencodeFreeRelay.ts` | Base URL do relé Bun para solicitações OpenCode de nível livre fechadas. Quando definidas, essas solicitações carregam o prompt do sistema OpenCode CLI e o conjunto de ferramentas e são enviadas por meio do relé (`scripts/ops/opencode-free-relay.ts`), porque o upstream responde 429 para clientes não-Bun HTTP. O loopback URLs é iniciado com o servidor quando `bun` está ligado PATH; um caminho no URL é ignorado. `http://` simples é aceito apenas para hosts de loopback (`localhost`, `127.0.0.0/8`, `::1`); qualquer outro host deve usar `https://`, caso contrário, as solicitações falharão com um erro explícito. Somente conclusões de bate-papo. Leia por solicitação. | | `OPENCODE_FREE_RELAY_BUN` | `bun` em PATH | `src/lib/opencodeFreeRelay.ts` | binário Bun usado para iniciar o relé. | | `OPENCODE_FREE_RELAY_SCRIPT` | `scripts/ops/opencode-free-relay.ts` na raiz do pacote | `src/lib/opencodeFreeRelay.ts` | Caminho do script de retransmissão. O padrão é resolvido a partir da raiz do pacote instalado e, em seguida, do diretório de trabalho. | | `OPENCODE_FREE_RELAY_HOST` | `127.0.0.1` | `scripts/ops/opencode-free-relay.ts` | Host de escuta de retransmissão. | | `OPENCODE_FREE_RELAY_PORT` | `20199` | `scripts/ops/opencode-free-relay.ts` | Porta de escuta de retransmissão. | | `OPENCODE_FREE_RELAY_UPSTREAM` | `https://opencode.ai` | `scripts/ops/opencode-free-relay.ts` | Origem para a qual o relé encaminha. Deve ser `https://` (`http://` apenas para origem de teste de loopback); o relé se recusa a iniciar de outra forma. | | `OPENCODE_FREE_RELAY_TOKEN` | desarmar | `scripts/ops/opencode-free-relay.ts`, `open-sse/executors/opencodeRelay.ts` | Segredo compartilhado. OmniRoute envia em `x-opencode-relay-auth`; o relé responde 401 sem ele. Obrigatório: um relé com `OPENCODE_FREE_RELAY_HOST` sem loopback se recusa a iniciar sem ele. | | `OPENCODE_FREE_RELAY_PROXY_ALLOWLIST` | desarmar | `scripts/ops/opencode-free-relay.ts` | Proxies de saída `host` ou `host:port` separados por vírgula que uma retransmissão sem loopback aceita dos chamadores (`x-opencode-relay-proxy`); qualquer outro proxy responde 403. Ignorado em uma ligação de loopback. | | `OMNIROUTE_OLLAMA_CLOUD_USAGE_URL` | `https://ollama.com/settings` | `open-sse/services/usage.ts` | Ollama Configurações de nuvem URL usadas para extração de cota. Substituição para relés/dispositivos de teste. | | `OMNIROUTE_OLLAMA_CLOUD_BALANCE_URL` | `https://ollama.com/api/balance` | `open-sse/services/ollamaCloudBalance.ts` | Ollama Endpoint de equilíbrio upstream documentado na nuvem (`GET https://ollama.com/api/balance`, `Authorization: Bearer `). Leia uma vez no carregamento do módulo. Usado primeiro para cota Ollama Cloud quando a conexão tem uma chave API ; o raspador de cookies da página de configurações permanece como substituto. Substituição para relés/dispositivos de teste. | | `OLLAMA_USAGE_COOKIE` | _(desativado)_ | `open-sse/services/usage.ts` | Cookie Ollama Cloud `__Secure-session` usado para extração de cota da página de configurações. Confidencial; prefira o campo Painel por conexão quando várias contas estiverem configuradas. | | `OLLAMA_CLOUD_USAGE_COOKIE` | _(desativado)_ | `open-sse/services/usage.ts` | Alternativo Ollama Cloud `__Secure-session` cookie env var. Confidencial; prefira o campo Painel por conexão quando várias contas estiverem configuradas. | | `OMNIROUTE_OLLAMA_USAGE_COOKIE` | _(desativado)_ | `open-sse/services/usage.ts` | Alternativa Ollama Cloud `__Secure-session` cookie env var usada antes dos aliases mais curtos. Confidencial; prefira o campo Painel por conexão quando várias contas estiverem configuradas. | | `OMNIROUTE_CODEWHISPERER_BASE_URL` | `https://codewhisperer.us-east-1.amazonaws.com` | `open-sse/services/usage.ts` | CodeWhisperer (AWS Kiro) limite de uso do endpoint. Substituição para relés/dispositivos de teste. | > [!IMPORTANT] > Ao implantar atrás de um proxy reverso (nginx, Caddy), defina `NEXT_PUBLIC_BASE_URL` como seu URL público estável (por exemplo, `https://omniroute.example.com`) quando retornos de chamada OAuth ou links públicos gerados precisarem usar esse nome de host. Sem isso, os retornos de chamada OAuth podem falhar porque o redirect_uri não corresponderá e os links públicos gerados podem apontar para a origem interna do contêiner. > > Mantenha `BASE_URL` como um loopback/container URL interno para trabalhos de servidor para servidor. Não use um navegador `Origin` ou nome de host público para buscas internas com credenciais. > > As gravações autenticadas do painel não exigem uma base pública estática URL: o painel envia solicitações inseguras de mesma origem com um token CSRF vinculado à sessão. OmniRoute ainda centraliza a validação de origem pública para integrações de navegador sem painel: vars URL env públicos explícitos são confiáveis primeiro; Os cabeçalhos `Forwarded` / `X-Forwarded-*` brutos são ignorados, a menos que `OMNIROUTE_TRUST_PROXY` esteja habilitado e o par proxy imediato seja carimbado como confiável. Não use configurações CORS para corrigir solicitações de painel de mesma origem; CORS é apenas para clientes de navegador de origem cruzada. --- ## 8. Proxy de saída Roteie chamadas upstream do provedor LLM por meio de um proxy HTTP ou SOCKS5 para controle de saída, roteamento geográfico ou mascaramento IP. `OMNIROUTE_UPSTREAM_HTTP2_ENABLED` é padronizado como `true`. Defina-o como `false`, `0`, `no` ou `off` para forçar HTTP/1.1 nos despachantes Undici em `open-sse/utils/proxyDispatcher.ts` e `open-sse/utils/proxyFetch.ts`: saída direta, proxies HTTP(S)/SOCKS, relés e suas novas tentativas de soquete. Isso preserva a verificação do certificado TLS, a autenticação de proxy, os limites de conexão e as configurações de keep-alive. Reinicie OmniRoute após alterá-lo porque os despachantes são armazenados em cache e os agentes de retransmissão são criados na inicialização. O switch não controla impressões digitais wreq TLS ou transportes específicos do provedor. | Variável | Padrão | Arquivo de origem | Descrição | | ---------------------------------------- | -------------- | ---------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `ENABLE_SOCKS5_PROXY` | `true` | `open-sse/executors` | Habilite o agente proxy SOCKS5 para chamadas upstream. Desative com `false`. | | `OMNIROUTE_GZIP_REQUEST_BODIES` | `true` | `open-sse/executors/base/gzipRequestBody.ts` | Gzip o corpo da solicitação enviado ao `api.anthropic.com` oficial (4096 caracteres +, somente conexões diretas; ignorado por trás de um proxy, representação TLS ou `NODE_EXTRA_CA_CERTS`). Anthropic aceita apenas gzip. Uma codificação recusada (415, um 400/403 não antrópico ou uma análise JSON de origem 400) é reenviada descompactada uma vez e a origem permanece descompactada por uma hora. Desative com `0`, `false`, `off` ou `no`. | | `NEXT_PUBLIC_ENABLE_SOCKS5_PROXY` | `true` | Lado do cliente | Conscientização do lado do cliente sobre a disponibilidade SOCKS5. | | `PROXY_SKIP_RECENTLY_FAILED` | `true` | `src/shared/utils/featureFlags.ts` | Sinalizador de recurso ativado por padrão (consulte [FEATURE_FLAGS.md](./FEATURE_FLAGS.md) ; uma substituição DB do painel vence). Os pools de proxy e a rotação por conta param de servir novamente um membro que acabou de falhar (recusou a sonda TCP ou um 429 por meio dela) por um período que dobra a cada repetição, até um limite. `false` restaura a seleção simples. | | `SELECTOR_CONTROL_ALLOWLIST` | _(desativado)_ | `src/lib/proxySubscription/selectorGuard.ts` | Lista de permissões para alvos de controle de seletor de núcleo local além do loopback (comma/space hosts separados ou IPs, `*` abre LAN/private mas nunca metadata/link-local). Loopback sobre http/https é permitido por padrão. Um valor DB do painel vence essa variável quando definido e não vazio. | | `PROXY_QUOTA_429_BASE_MS` | `300000` | `open-sse/utils/proxyRefusalMemory.ts` | Período base (ms) da retirada de 429, duplicado a cada repetição. Leia uma vez na inicialização. Limitado a `1000..3600000`; fora do intervalo ou ilegível volta ao padrão com um aviso. | | `PROXY_QUOTA_429_MAX_MS` | `900000` | `open-sse/utils/proxyRefusalMemory.ts` | Limite (ms) da retirada de 429. Leia uma vez na inicialização. Limitado a `1000..3600000`; fora do intervalo ou ilegível volta ao padrão com um aviso. Quando o limite está abaixo da base, ele volta ao padrão. A redução do limite também reduz o esquecimento contínuo: as entradas eliminam `2 x max` após o vencimento. | | `PROXY_POOL_SHARED_EGRESS_ORDER` | `false` | `src/shared/utils/featureFlags.ts` | Sinalizador de recurso de aceitação (consulte [FEATURE_FLAGS.md](./FEATURE_FLAGS.md) ; uma substituição DB do painel vence). Para provedores cuja cota é dividida por endereço de saída, classifique um membro do pool que compartilhe o endereço de saída observado de um membro recentemente recusado logo abaixo dos membros saudáveis. Somente pedido, nunca excluído. Precisa de `PROXY_SKIP_RECENTLY_FAILED`, que produz o sinal de recusa que lê. | | `PROXY_WEBHOOK_REBOUND_MS` | `300000` | `src/lib/proxyEvents/proxyTransitionBridge.ts` | Janela de recuperação (ms) limitando alertas repetidos de webhook `proxy.set_aside` por membro do pool para que uma explosão de recusas envie um evento. Leia sobre cada emissão. Limitado a `1000..3600000`; fora do intervalo ou ilegível volta ao padrão silenciosamente. | | `HTTP_PROXY` | _(desativado)_ | padrão Node.js | proxy HTTP para chamadas upstream. | | `HTTPS_PROXY` | _(desativado)_ | padrão Node.js | proxy HTTPS para chamadas upstream. | | `ALL_PROXY` | _(desativado)_ | padrão Node.js | Proxy universal (suporta `socks5://`). | | `OMNIROUTE_PROXY_ECHO_URL` | _(desativado)_ | `src/lib/proxyEchoTarget.ts` | Fixa o destino echo-IP usado pelas sondagens de saída do proxy em um único URL. Não definido, o probe tenta `api64.ipify.org` e depois `api4.ipify.org` para que os túneis IPv4-only não sejam relatados como mortos (#9694). | | `NO_PROXY` | _(desativado)_ | padrão Node.js | hostnames/IPs separado por vírgula para ignorar o proxy. | | `OMNIROUTE_PROXY_DISPATCHER_CONNECTIONS` | `32` | `open-sse/utils/proxyDispatcher.ts` | Máximo de soquetes simultâneos por despachante de proxy HTTP/SOCKS em cache. Fluxos SSE de longa duração, como Codex `/v1/responses` precisam de mais de uma conexão quando várias solicitações compartilham o mesmo proxy em nível de conta. Valores acima de `256` são limitados. | | `SOCKS_HANDSHAKE_TIMEOUT_MS` | `10000` | `open-sse/utils/socksConnectorWithFamily.ts` | Tempo limite de handshake (conexão)SOCKS5 em ms. Aumente-o quando um único host de gateway residencial for atingido por alta simultaneidade (por exemplo, 100 solicitações simultâneas). — o handshake real pode exceder 10s em um pool saturado, mesmo que o proxy esteja acessível, o que de outra forma aparece como um `[Proxy Fast-Fail] Proxy unreachable` falso. Limitado a `120000`. | | `PROXY_FAIL_OPEN` | `false` | `src/sse/handlers/chatHelpers.ts` | Quando `false` (padrão), uma solicitação cujo proxy atribuído não consegue resolver é** recusado (fechado com falha)** em vez de recorrer a uma conexão direta, — evita vazamentos de IP real. Configure `true` para restaurar o substituto herdado DIRECT. | | `ENABLE_TLS_FINGERPRINT` | `false` | `open-sse/executors` | Falsificação de impressão digital TLS usando wreq-js (imita Chrome 124). Contraria o bloqueio JA3/JA4. | | `TLS_FINGERPRINT_PROVIDERS` | _(desativado)_ | `open-sse/utils/proxyFetch.ts` | Lista de permissões de provedores separados por vírgula para o novo roteamento TLS com proxy (`open-sse/utils/proxyFetch.ts`). TLS direto mantém seu comportamento legado quando não definido; apenas esses provedores passam pela ponte de impressão digital Chrome-124. Groq (`api.groq.com`) é excluído mesmo quando a lista de permissões não está definida, porque o Chrome JA3 aciona Cloudflare 1010 enquanto o undici nativo atinge o API. | | `OMNIROUTE_TURNSTILE_IGNORE_TLS_ERRORS` | `false` | `open-sse/services/claudeTurnstileSolver.ts` | Permitir que o contexto do navegador Claude Turnstile Playwright ignore erros de certificado HTTPS. | ### Cenários | Cenário | Configuração | | ---------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------- | | **SOCKS5 através do túnel SSH** | `ALL_PROXY=socks5://127.0.0.1:7890`, `ENABLE_SOCKS5_PROXY=true` | | **Procuração HTTP corporativa** | `HTTP_PROXY=http://proxy.corp.com:3128`, `HTTPS_PROXY=http://proxy.corp.com:3128`, `NO_PROXY=localhost,internal.corp.com` | | **Anti-impressão digital** | `ENABLE_TLS_FINGERPRINT=true` — requer `wreq-js` (incluído) | | **Saída controlada/sem acesso direto** | Deixe `PROXY_FAIL_OPEN=false` (padrão). As solicitações falham muito quando o proxy está indisponível em vez de vazar via direto. | | **Legacy/dev — permite fallback direto** | `PROXY_FAIL_OPEN=true`. Restaura o comportamento de pré-proteção: conexão direta usada quando a resolução do proxy falha. | > **Nota ( ignorar validação NVIDIA — #3226):** O endpoint de validação da chave de API do NVIDIA para quando roteado por meio da busca global proxy/TLS-patched (undici dispatcher → 504). `src/lib/providers/validation.ts::directHttpsRequest()` ignora intencionalmente o patch de proxy para aquela chamada de validação usando `safeOutboundFetch({ bypassProxyPatch: true })`. Esta é uma exceção documentada e com escopo definido — faz** não** afeta a saída chat/usage. O desvio é fixado no escopo por `tests/unit/proxy-bypass-scope-guard-3226.test.ts`. --- ## 9. Integração da ferramenta CLI Controla como OmniRoute descobre e inicia sidecars CLI (Claude Code, Codex, etc.). | Variável | Padrão | Arquivo de origem | Descrição | | --------------------------------- | ------------------------------------------------------- | ----------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | `CLI_MODE` | `auto` | `src/shared/services/cliRuntime.ts` | sistema de pesquisa `auto` = PATH; `manual` = usa apenas caminhos explícitos. | | `CLI_EXTRA_PATHS` | _(desativado)_ | `src/shared/services/cliRuntime.ts` | Entradas PATH adicionais para descoberta binária CLI (separadas por dois pontos). | | `CLI_CONFIG_HOME` | _(desativado)_ | `src/shared/services/cliRuntime.ts` | Substitua o diretório inicial para ler as configurações CLI (`~/.claude`, `~/.codex`). Deve ser absoluto e dentro do processo home —** ou** , em um contêiner, um caminho montado em ligação (é assim que `/host-home` funciona). Qualquer outra coisa volta para o diretório inicial. | | `CLI_ALLOW_CONFIG_WRITES` | `true` | `src/shared/services/cliRuntime.ts` | Permitir OmniRoute grave arquivos de configuração CLI (atualização de token, dados de sessão). Defina como `false` para fazer com que cada gravação de configuração CLI falhe com um erro explícito de "gravação desabilitada". | | `CLI_CLAUDE_BIN` | `claude` | `src/shared/services/cliRuntime.ts` | Caminho personalizado para o binário Claude CLI. | | `CLI_CODEX_BIN` | `codex` | `src/shared/services/cliRuntime.ts` | Caminho personalizado para o binário Codex CLI. | | `CLI_DROID_BIN` | `droid` | `src/shared/services/cliRuntime.ts` | Caminho personalizado para o binário Droid CLI. | | `CLI_OPENCLAW_BIN` | `openclaw` | `src/shared/services/cliRuntime.ts` | Caminho personalizado para o binário OpenClaw CLI. | | `CLI_CURSOR_BIN` | `agent`, então `cursor` | `src/shared/services/cliRuntime.ts` | Caminho personalizado para o binário do agente Cursor. Sem ele, a detecção tenta `agent` primeiro e volta para `cursor`. | | `CLI_CLINE_BIN` | `cline` | `src/shared/services/cliRuntime.ts` | Caminho personalizado para o binário Cline CLI. | | `CLI_5DIVE_BIN` | `5dive` | `src/shared/services/cliRuntime.ts` | Caminho personalizado para o binário 5dive CLI. | | `CLI_5DIVE_STATE_DIR` | `/var/lib/5dive` | `src/shared/services/cliRuntime.ts` | Diretório de estado do sistema 5dive (perfis de autenticação de propriedade do root); espelha o próprio padrão STATE_DIR do 5dive. | | `CLI_CONTINUE_BIN` | `cn` | `src/shared/services/cliRuntime.ts` | Caminho personalizado para continuar o binário CLI. | | `CLI_QODER_BIN` | `qodercli` | `src/shared/services/cliRuntime.ts` | Caminho personalizado para o binário Qoder CLI. | | `CLI_QWEN_BIN` | `qwen` | `src/shared/services/cliRuntime.ts` | Caminho personalizado para o binário Qwen Code CLI. | | `CLI_AIDER_BIN` | `aider` | `src/shared/services/cliRuntime.ts` | Caminho personalizado para o binário Aider CLI. | | `CLI_GOOSE_BIN` | `goose` | `src/shared/services/cliRuntime.ts` | Caminho personalizado para o binário Goose CLI. | | `CLI_WHYCODES_BIN` | `whycodes` | `src/shared/services/cliRuntime.ts` | Caminho personalizado para o binário WhyCodes CLI. | | `CLI_GEMINI_BIN` | `gemini` | `src/shared/services/cliRuntime.ts` | Caminho personalizado para Google Gemini CLI binário — somente verificações detection/health do lado do servidor; `omniroute run gemini` resolve o binário `gemini` do sistema PATH. | | `CLI_KILO_BIN` | `kilocode` | `src/shared/services/cliRuntime.ts` | Caminho personalizado para o binário Kilo Code CLI. | | `CLI_OPENCODE_BIN` | `opencode` | `src/shared/services/cliRuntime.ts` | Caminho personalizado para o binário OpenCode CLI. | | `CLI_HERMES_BIN` | `hermes` | `src/shared/services/cliRuntime.ts` | Caminho personalizado para o binário Hermes. Compartilhado por ambas as entradas do catálogo (`hermes` e `hermes-agent`). | | `CLI_FORGE_BIN` | `forge` | `src/shared/services/cliRuntime.ts` | Caminho personalizado para o binário ForgeCode CLI. | | `CLI_JCODE_BIN` | `jcode` | `src/shared/services/cliRuntime.ts` | Caminho personalizado para o binário jcode CLI. | | `CLI_DEEPSEEK_TUI_BIN` | `deepseek-tui` | `src/shared/services/cliRuntime.ts` | Caminho personalizado para o binário DeepSeek TUI. | | `CLI_CODEWHALE_BIN` | `codewhale` | `src/shared/services/cliRuntime.ts` | Caminho personalizado para o binário CodeWhale CLI. | | `CLI_SMELT_BIN` | `smelt` | `src/shared/services/cliRuntime.ts` | Caminho personalizado para o binário Smelt CLI. | | `CLI_PI_BIN` | `pi` | `src/shared/services/cliRuntime.ts` | Caminho personalizado para o binário Pi (pi-coding-agent). | | `CLI_CRUSH_BIN` | `crush` | `src/shared/services/cliRuntime.ts` | Caminho personalizado para o binário Crush CLI. | | `CLI_OMP_BIN` | `omp` | `src/shared/services/cliRuntime.ts` | Caminho personalizado para o binário do agente Oh My Pi (`omp`). | | `CLI_LETTA_BIN` | `letta` | `src/shared/services/cliRuntime.ts` | Caminho personalizado para o binário Letta CLI. | | `CLI_PRIME_AGENT_BIN` | `prime-agent` | `src/shared/services/cliRuntime.ts` | Caminho personalizado para o binário Prime Agent (Prime Intellect). | | `CLI_WINDSURF_BIN` | _(nenhum)_ | `src/shared/services/cliRuntime.ts` | Caminho personalizado para o binário Windsurf. navios Windsurf** nenhum comando padrão** A detecção binária — permanece desabilitada até que seja definida. | | `CLI_DEVIN_BIN` | `devin` | `open-sse/executors/devin-cli.ts` | Caminho personalizado para o binário Devin CLI (v3.8.0). Usado pelo executor Windsurf/Devin. | | `DEVIN_DESKTOP_VERSION` | `3.6.27` | `open-sse/executors/devin-desktop.ts` | Devin Desktop `ide_version`. As substituições devem usar o formato `x.y.z` ; valores inválidos retornam ao padrão verificado. | | `DEVIN_DESKTOP_EXTENSION_VERSION` | `1.48.2` | `open-sse/executors/devin-desktop.ts` | Pacote Codeium/language-server `extension_version`, distinto do Desktop `ide_version`. As substituições devem usar `x.y.z`; valores inválidos usam o padrão empacotado. | | `CLI_DEVIN_AGENTIC_BIN` | `devin` | `open-sse/executors/devin-cli-agentic.ts` | Substituição Devin CLI somente de ponte agente. O executor aceita apenas o upstream ACP stdio local. | | `DEVIN_AGENTIC_HOME` | _(obrigatório)_ | `open-sse/executors/devin-cli-agentic.ts` | Início isolado absoluto para o subprocesso agente Devin ; os caminhos de ponte aceitos são `/home/bridge` e caminhos `.sandbox` locais de tarefa (em Windows, `C:\...\.sandbox\...`). | | `DEVIN_AGENTIC_ACP_TIMEOUT_MS` | `120000` | `open-sse/executors/devin-cli-agentic.ts` | Duração máxima de um turno Devin ACP antes que a ponte termine o filho e retorne um tempo limite explícito. | | `DEVIN_BRIDGE_MODEL` | `devin-cli-agentic/swe-1-7` | `docker/devin-bridge/compose.yml` | Alias principal do modelo de código Claude para a ponte isolada. O chicote ativo substitui o exemplo por um modelo retornado pela conta Devin atual. | | `DEVIN_BRIDGE_SONNET_MODEL` | `DEVIN_BRIDGE_MODEL` | `docker/devin-bridge/compose.yml` | Alias de ponte isolada usada quando o código Claude solicita seu Sonnet padrão. | | `DEVIN_BRIDGE_OPUS_MODEL` | `DEVIN_BRIDGE_MODEL` | `docker/devin-bridge/compose.yml` | Alias de ponte isolada usada quando o código Claude solicita seu padrão Opus. | | `DEVIN_BRIDGE_HAIKU_MODEL` | `DEVIN_BRIDGE_MODEL` | `docker/devin-bridge/compose.yml` | Alias de ponte isolada usada quando Claude Code solicita seu padrão do Haiku. | | `DEVIN_BRIDGE_SUBAGENT_MODEL` | `DEVIN_BRIDGE_MODEL` | `docker/devin-bridge/compose.yml` | Alias de ponte isolada usada para subagentes do código Claude. | | `DEVIN_SEAT_API_URL` | `https://server.codeium.com` | `open-sse/services/usage/devinCli.ts` | Substituição opcional para o API de gerenciamento de assentos Codeium usado por Devin CLI quota (`GetUserStatus`). | | `AUGGIE_BIN` | `auggie` | `open-sse/executors/auggie.ts` | Substituição de caminho absoluto para o binário Augment (Auggie) CLI usado pelo provedor `auggie` local. Volta para `CLI_AUGGIE_BIN`, em seguida, uma pesquisa PATH. | | `CLI_AUGGIE_BIN` | `auggie` | `open-sse/executors/auggie.ts` | Substituição de alias para o caminho binário Augment (Auggie) CLI (verificado após `AUGGIE_BIN`). | | `ZCODE_BIN` | `zcode` | `open-sse/executors/zcode.ts` | Binário usado para o cliente stdio do provedor `zcode` local. Volta para `zcode` em PATH. | | `ZCODE_ARGS` | — | `open-sse/executors/zcode.ts` | Matriz JSON (≤ 16 strings) de argumentos extras passados para o binário `zcode` quando iniciado via `cliTools`. | | `ZCODE_CWD` | `process.cwd()` | `open-sse/executors/zcode.ts` | Diretório de trabalho para o subprocesso ZCode app-server. | | `ZCODE_TRANSPORT` | `app-server` | `open-sse/executors/zcode.ts` | `app-server` (padrão) ou `gateway`.** Experimental/sem suporte:** `gateway` envia solicitações diretas do Z.AI Coding Plan HTTP reproduzindo o protocolo do cliente ZCode (assinatura de handshake e cabeçalho de prova de trabalho do cliente 0.16.9) e pode falhar quando ZCode for atualizado. Aceita apenas o perfil Plano de Codificação Individual. | | `ZCODE_PROVIDER_ID` | `account:zai-individual-coding-plan` | `open-sse/executors/zcode.ts` | Perfil de provedor nativo exato para seleção de modelo. Quando não definido, o perfil da conta do Plano Individual é usado, voltando para `builtin:zai-coding-plan` (a entrada de configuração que contém a chave do Plano de Codificação Individual). Defina um ID exato como `account:zai-start-plan` para fixar esse perfil; um perfil fixado nunca volta. | | `ZCODE_SERVER_RUNTIME_ROOT` | `~/.zcode/server` | `open-sse/executors/zcode.ts` | Raiz do tempo de execução do servidor de aplicativos ZCode (onde o `node` e `zcode-server.cjs` incluídos residem). | | `ZCODE_SERVER_NODE` | `/node` | `open-sse/executors/zcode.ts` | Executável do nó usado para hospedar o servidor de aplicativos ZCode. | | `ZCODE_SERVER_ENTRY` | `/zcode-server.cjs` | `open-sse/executors/zcode.ts` | Script de entrada do servidor de aplicativos usado para hospedar o servidor ZCode. | | `ZCODE_STARTUP_TIMEOUT_MS` | `10000` | `open-sse/executors/zcode.ts` | Tempo limite de inicialização (ms) antes que a inicialização do servidor de aplicativos ZCode seja considerada com falha. | | `ZCODE_RPC_TIMEOUT_MS` | `30000` | `open-sse/executors/zcode.ts` | Tempo limite RPC por solicitação (ms) para uma chamada ZCode app-server. | | `ZCODE_TURN_TIMEOUT_MS` | `120000` | `open-sse/executors/zcode.ts` | Duração máxima (ms) de um turno ZCode antes que o supervisor expire. | | `ZCODE_POLL_INTERVAL_MS` | `250` | `open-sse/executors/zcode.ts` | Intervalo de pesquisa (ms) para conclusão do turno ZCode. | | `MINIMAX_CODE_GATEWAY_URL` | `https://agent.minimax.io/mavis/api/v1/llm/v1/messages` | `open-sse/executors/minimaxCodeGateway.ts` | Endpoint do gateway MiniMax gerenciado que responde com chamadas de ferramentas nativas. É um endpoint interno do aplicativo MiniMax Code, não um API público documentado: ele pode mudar sem aviso prévio e a solicitação falha com um 502 que nomeia o transporte. | | `MINIMAX_CODE_GATEWAY_TIMEOUT_MS` | `60000` | `open-sse/executors/minimax-code.ts` | Duração máxima (ms) de uma tentativa de gateway gerenciado. A chamada inteira (tentativa, espera, uma nova tentativa) dura cerca de dois minutos, portanto, um gateway inacessível não pode manter um slot de modelo por muito tempo. | | `MINIMAX_CODE_GATEWAY_RETRIES` | `1` | `open-sse/executors/minimaxCodeGateway.ts` | Novas tentativas de uma chamada de gateway gerenciada que falha com um erro transitório (429, 5xx, conexão interrompida). | | `MINIMAX_CODE_CONTEXT_WINDOW` | `1000000` | `open-sse/executors/minimaxCodeGateway.ts` | A janela de contexto solicitada pelo gateway MiniMax gerenciado. O catálogo de modelos do produto MiniMax Code declara 512000 como a janela padrão do MiniMax-M3 e MiniMax-M3.1-Flash e oferece 1000000 como a segunda; o gateway responde na janela maior (uma solicitação de 1.024.056 tokens de entrada foi respondida com 200 em 23/10/2026). Defina como 512000 para restringir a solicitação — o plano conta menos. Todos os outros valores são ignorados, portanto, um erro de digitação não pode solicitar uma janela que o modelo não possui. | | `MINIMAX_CODE_MAX_INPUT_TOKENS` | `1000000` | `open-sse/executors/minimaxCodeGateway.ts` | Limite máximo (em tokens de entrada) de uma solicitação enviada ao gateway MiniMax gerenciado. Uma solicitação maior é recusada localmente com um 413 em vez de ser encaminhada, porque uma recusa do gateway bloqueia o modelo dos substitutos. O padrão é a janela de contexto do gateway (1000000); este valor pode diminuir esse teto, nunca elevá-lo acima da janela. | | `MINIMAX_CODE_MAX_TOKENS` | `8192` | `open-sse/executors/minimaxCodeGateway.ts` | Número máximo de tokens com os quais o gateway gerenciado pode responder. | | `MINIMAX_CODE_AUTH_FILE` | `~/.minimax/auth/prod//mcode-public/auth.json` | `open-sse/executors/minimaxCodeGateway.ts` | Caminho do perfil de autenticação do MiniMax Code que contém o token de acesso e atualização. | | `MINIMAX_CODE_PROFILE_DIR` | `~/.minimax` | `open-sse/executors/minimaxCodeGateway.ts` | Diretório do perfil do MiniMax Code que contém o perfil de autenticação. | | `MINIMAX_CODE_AUTH_RECORD` | _(nova geração)_ | `open-sse/executors/minimaxCodeGateway.ts` | Registo do perfil a utilizar quando possui várias contas. Vazio escolhe a geração mais nova, que é aquela que o próprio CLI atualiza. | | `MINIMAX_CODE_REGION` | `en` | `open-sse/executors/minimaxCodeGateway.ts` | Região da conta MiniMax. Ele decide o endpoint da conta que atualiza o token e o diretório do perfil do qual a credencial é lida. | | `HERMES_HOME` | `~/.hermes` | `src/lib/cli-helper/config-generator/hermesHome.ts` | Diretório inicial do Agente Hermes onde OmniRoute reads/writes a configuração do Hermes CLI. Corresponde ao env var que o instalador Hermes PowerShell define em Windows (`%LOCALAPPDATA%\hermes`). | | `WHYCODES_HOME` | `~/.whycodes` | `src/lib/cli-helper/config-generator/whycodesHome.ts` | raiz da instância WhyCodes onde OmniRoute reads/writes `config.toml`. O mesmo env var WhyCodes lê; o padrão é `~/.whycodes` (`%USERPROFILE%\.whycodes` em Windows). | ### Sincronização automática de perfil CLI Esses sinalizadores de recursos são ativados e desativados por padrão. Eles também podem ser alternados no painel CLI Code. | Variável | Padrão | Arquivo de origem | Descrição | | ------------------------------------- | ------- | ------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `OMNIROUTE_AUTO_SYNC_CODEX_PROFILES` | `false` | `src/shared/constants/featureFlagDefinitions.ts` | Após a sincronização do modelo de provedor, ele reescreve automaticamente os arquivos de perfil `~/.codex/*.config.toml` do catálogo ativo. Requer `CLI_ALLOW_CONFIG_WRITES`; nunca altera a configuração active/default Codex, autenticação, configurações do Codex-lb ou escolha do provedor. | | `OMNIROUTE_AUTO_SYNC_CLAUDE_PROFILES` | `false` | `src/shared/constants/featureFlagDefinitions.ts` | Após a sincronização do modelo de provedor, ele reescreve automaticamente os arquivos de perfil do código `~/.claude/profiles//settings.json` Claude do catálogo ativo. Requer `CLI_ALLOW_CONFIG_WRITES`; nunca altera a configuração, autenticação ou escolha do provedor active/default Claude. | ### Exemplo Docker ```bash # Mount host binaries into the container and tell OmniRoute where they are: CLI_EXTRA_PATHS=/host-cli/bin CLI_CONFIG_HOME=/host-home CLI_ALLOW_CONFIG_WRITES=true CLI_CLAUDE_BIN=/host-cli/bin/claude ``` `CLI_CONFIG_HOME` só entra em vigor quando o caminho é realmente montado por ligação a partir do host — emparelhe-o com montagens como `~/.codex:/host-home/.codex:rw` (consulte o perfil `host` em `docker-compose.yml`). Um caminho que não esteja dentro da casa do usuário do contêiner nem de uma montagem de ligação será ignorado, porque a gravação nele seria descartada quando o contêiner fosse recriado. A imagem é executada como `USER node`, portanto, um `/root` desmontado é** não** uma substituição válida. | Variável | Padrão | Arquivo de origem | Descrição | | ---------------------------------------- | -------- | ----------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `OMNIROUTE_CONTAINER` | _(auto)_ | `src/shared/utils/containerEnv.ts` | Forçar a detecção de contêiner ativada (`1`/`true`) ou desativada (`0`/`false`). Necessário apenas em tempos de execução em que a detecção automática falha. | | `OMNIROUTE_ALLOW_CONTAINER_CONFIG_WRITE` | `false` | `src/shared/services/cliRuntime.ts` | Permitir gravações de configuração da ferramenta CLI em um caminho de contêiner desmontado de qualquer maneira. O equivalente CLI é `--allow-container-write`. | | `DOCKER_UPDATE_TRIGGER_FILE` | desarmar | `src/lib/system/autoUpdate.ts` | Somente imagem Docker : painel** Atualizar agora** grava uma solicitação JSON neste arquivo (deve estar dentro de `DATA_DIR`) para que um observador do lado do host extraia e recrie o contêiner. Consulte o [Guia Docker](../guides/DOCKER_GUIDE.md#dashboard-updates-in-docker). | ### Ajudantes binários CLI (`omniroute`) Essas variáveis ajustam o próprio comportamento do binário `omniroute` CLI (não a detecção de sidecar acima). | Variável | Padrão | Arquivo de origem | Descrição | | ------------------------------------- | --------------------------------- | --------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `OMNIROUTE_LANG` | _(sistema)_ | `bin/cli/i18n.mjs` | Forçar o idioma de saída CLI. localidade BCP-47 (por exemplo, `en`, `pt-BR`). Substitui vars env de localidade do sistema (LC_ALL, LC_MESSAGES). | | `OMNIROUTE_SHOW_LOG` | _(desativado)_ | `bin/cli/runtime/processSupervisor.mjs` | Defina como `1` para encaminhar o servidor stdout/stderr para o terminal no modo supervisionado. Equivalente ao sinalizador `--log` em `omniroute serve`. | | `OMNIROUTE_CLI_TOKEN` | _(desativado)_ | `bin/cli/api.mjs` | Token de autenticação de máquina injetado como cabeçalho `x-omniroute-cli-token`. Gerado automaticamente na tarefa 8.12. | | `GEMINI_CLI_HOME` | _(desativado)_ | `bin/cli/commands/setup-gemini.mjs` | Raiz inicial Gemini persistente; A corrida única usa uma casa isolada temporária. | | `OMNIROUTE_CHILD_SIGNAL_TIMEOUT_MS` | `5000` | `bin/cli/commands/run.mjs` | Período de carência em milissegundos antes de matar à força uma criança CLI sinalizada. | | `OMNIROUTE_CLI_SKIP_DEFAULT_DATA_ENV` | _(desativado)_ | `bin/omniroute.mjs` | Defina como 1 com um DATA_DIR explícito para ignorar o arquivo de ambiente do diretório de dados do usuário padrão. | | `OMNIROUTE_SYNC_TOKEN` | _(desativado)_ | `bin/cli/commands/sync.mjs` | Token de sincronização para `omniroute sync bundle` (`GET /api/sync/bundle` aceita apenas um token de sincronização, não uma chave API ). Equivalente a `--token`. | | `OMNIROUTE_HTTP_TIMEOUT_MS` | `30000` | `bin/cli/api.mjs` | Tempo limite HTTP por tentativa (ms) para solicitações do servidor CLI →. | | `OMNIROUTE_READY_TIMEOUT_MS` | `60000` | `bin/cli/utils/pid.mjs` | Tempo máximo (ms) que o CLI aguarda pelo endpoint de integridade do servidor antes de imprimir um aviso de tempo limite. Útil para partidas lentas a frio (por exemplo, Windows). Também configurável via `--ready-timeout`. | | `OMNIROUTE_VERBOSE` | `0` | `bin/cli/api.mjs` | Defina como `1` para imprimir diagnósticos retry/backoff em stderr durante comandos CLI. | | `OMNIROUTE_PLUGIN_PATH` | _(desativado)_ | `bin/cli/plugins.mjs` | Diretório personalizado para descoberta de plugin CLI (pacotes `omniroute-cmd-*` ). O padrão é `~/.omniroute/plugins/` quando não definido. — somente CLI nunca atinge o scanner de plug-in do lado do servidor, que é apontado por `OMNIROUTE_PLUGINS_DIR` (seção 2). | | `OMNIROUTE_NO_UPDATE_NOTIFIER` | _(desativado)_ | `bin/omniroute.mjs` | Suprime verificações de atualização quando definido para qualquer valor não vazio: o aviso CLI na saída do processo e o banner "atualização disponível" do painel (`GET /api/system/version` então ignora as pesquisas de npm, GitHub e notícias). O aviso CLI também permanece desativado em CI, modo silencioso e saída sem texto. | | `OMNIROUTE_DOCTOR_LIVENESS_URL` | _(derivado)_ | `bin/cli/commands/doctor.mjs` | Liveness URL sondado por `omniroute doctor`. Uma opção `livenessUrl` programática tem precedência; caso contrário, esse valor será usado literalmente. Não definido, o CLI deriva o endpoint `/api/health/degradation` do painel local. | | `OMNIROUTE_PROVIDER_CATALOG_PATH` | `src/shared/constants/providers/` | `bin/cli/provider-catalog.mjs` | Caminho do catálogo do provedor usado pelos comandos do provedor CLI. Uma opção `catalogPath` programática tem precedência. Caminhos absolutos são usados como estão; caminhos relativos são resolvidos a partir da raiz do projeto. Não definido, o CLI usa o diretório de constantes do provedor, com o arquivo `providers.ts` herdado como substituto. | | `OMNIROUTE_PROVIDER_TEST_MODEL` | _(padrão do provedor)_ | `bin/cli/provider-test.mjs` | Modelo de fallback global para testes de conexão do provedor CLI. A precedência é o modelo de conexão configurado, a substituição do modelo específico do provedor, esse valor e, em seguida, o modelo de teste integrado do provedor. | --- ## 10. Agente interno e integrações MCP | Variável | Padrão | Arquivo de origem | Descrição | | ----------------------------------------------- | --------------------------------------------------- | ----------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `OMNIROUTE_BASE_URL` | detecção automática | `open-sse/mcp-server/server.ts` | URL explícito para ferramentas MCP/A2A alcançarem OmniRoute. Substitui a detecção automática de localhost. As habilidades A2A falham em vez de enviar uma chave API para este URL (ou o `BASE_URL` para o qual ele recorre) quando é http simples para um endereço público, um nome de host público pontilhado ou um host de metadados de nuvem, ou contém credenciais: use https ou http para loopback, um contêiner ou nome de serviço ou um endereço privado. | | `OMNIROUTE_API_KEY` | _(desativado)_ | módulos MCP/A2A | Chave API para chamadas internas da ferramenta MCP. habilidades A2A enviam apenas para um chamador sem uma chave API (sessão de painel); um chamador com uma tecla atua por conta própria. | | `OMNIROUTE_API_KEY_ID` | _(desativado)_ | `open-sse/mcp-server/audit.ts` | Chave ID para atribuição de log de auditoria MCP. | | `ROUTER_API_KEY` | _(desativado)_ | Legado | Alias legado para `OMNIROUTE_API_KEY`. | | `OMNIROUTE_A2A_HISTORY_RETENTION_DAYS` | `30` | `src/lib/a2a/taskManager.ts` | Dias de histórico de tarefas A2A mantidos no banco de dados local antes que a limpeza diária exclua uma linha. Não definido, não numérico ou `<= 0` retorna para `30`. | | `OMNIROUTE_A2A_MEMORY_HITS` | `1` | `src/lib/a2a/taskExecution.ts` | Kill-switch para o recurso de observabilidade de acessos de memória A2A. Defina como `0` para ignorar totalmente a pesquisa de recuperação de memória para uma tarefa; qualquer outro valor (incluindo não definido) o mantém ativado. | | `OMNIROUTE_ISSUE_AGENT_ENABLED` | `false` | `src/app/api/issue-agent/runs/route.ts` | Ativa o endpoint de triagem registrada offline/local Issue Agent. Deixe desativado, a menos que execute explicitamente fluxos de trabalho de triagem registrados locais. | | `OMNIROUTE_ISSUE_AGENT_TIMEOUT_MS` | _(desativado)_ | `src/lib/issueAgent/execution.ts` | Tempo limite (ms) para uma única execução de triagem registrada do Agente de Problemas. Fixado ao máximo interno; volta ao padrão integrado quando não definido ou inválido. | | `OMNIROUTE_CONTEXT` | _(contexto ativo)_ | `bin/cli/program.mjs`, `bin/cli/api.mjs` | CLI context/profile de modo remoto para comandos `omniroute` ; substitui o contexto ativo no armazenamento de contextos locais. Equivalente a `--context `. | | `OMNIROUTE_CONTEXT_KEYCHAIN_DISABLED` | `0` | `bin/cli/contexts.mjs` | Desative o backend opcional `keytar` OS-keychain para credenciais de contexto CLI. Quando ativadas, as credenciais permanecem no modo `config.json` `0600` e o CLI emite um aviso de fallback único; destinado à operação deliberada headless/container. | | `OMNIROUTE_MCP_ENFORCE_SCOPES` | `false` | `open-sse/mcp-server/server.ts` | Aplique controle de acesso baseado em escopo em chamadas de ferramenta MCP. | | `OMNIROUTE_MCP_SCOPES` | _(todos)_ | `open-sse/mcp-server/server.ts` | Escopos separados por vírgula: `admin`, `combos`, `health`, `models`, `routing`, `budget`, `metrics`, `pricing`, `memory`, `skills`. | | `OMNIROUTE_PPLX_RESEARCH_ENABLED` | `0` | `open-sse/mcp-server/tools/perplexityResearch.ts` | Registre a ferramenta Perplexity Deep Research MCP. Apenas `1` registra; qualquer outra coisa deixa de fora. | | `OMNIROUTE_MCP_COMPRESS_DESCRIPTIONS` | `false` | `open-sse/mcp-server/descriptionCompressor.ts` | Compacte as descrições da ferramenta MCP antes de serializar o manifesto. Habilite valores: `1`, `true`, `on`. | | `OMNIROUTE_MCP_DESCRIPTION_COMPRESSION` | `rtk` | `open-sse/mcp-server/descriptionCompressor.ts` | Compressão algorithm/profile. Desabilitar valores: `0`, `false`, `off`. | | `OMNIROUTE_MCP_FETCH_TIMEOUT_MS` | `10000` | `open-sse/mcp-server/fetchTimeout.ts` | Abortar orçamento (ms) para leituras de gerenciamento interno do servidor MCP (saúde, resiliência, combos, cota, uso). | | `OMNIROUTE_MCP_UPSTREAM_TIMEOUT_MS` | `60000` | `open-sse/mcp-server/fetchTimeout.ts` | Abortar o orçamento (ms) para saltos MCP que aguardam um provedor (`route_request`, `web_search`, `web_fetch`). | | `OMNIROUTE_MCP_SESSION_IDLE_MS` | `300000` | `open-sse/mcp-server/httpTransport.ts` | TTL ocioso (ms) antes que a varredura obtenha uma sessão de fluxo MCP ociosa. Uma sessão com um fluxo aberto ou uma solicitação em andamento nunca é colhida. Valores não definidos, não inteiros ou não positivos voltam ao padrão. | | `OMNIROUTE_CORPUS_CACHE_SIZE` | `5` | `src/lib/localCorpus/configured.ts` | Número máximo de instâncias de índice de corpus local armazenadas em cache na memória (LRU, uma por diretório raiz indexado). Fixado a um mínimo de `1`. | | `MODEL_SYNC_INTERVAL_HOURS` | `6` | `src/shared/services/modelSyncScheduler.ts` | Intervalo de sincronização do catálogo de modelos em horas. | | `PROVIDER_LIMITS_SYNC_INTERVAL_MINUTES` | `70` | `src/lib/usage/providerLimits.ts` | Limite de taxa do provedor e intervalo de pesquisa de cota. | | `PROVIDER_LIMITS_SYNC_SPACING_MS` | `1500` | `src/lib/usage/providerLimits.ts` | Intervalo (ms) entre buscas consecutivas de cota OAuth em uma sincronização em massa; As conexões OAuth são buscadas uma de cada vez para evitar o estouro de um upstream. `0` desativa (simultâneo). | | `OMNIROUTE_QUOTA_FETCH_MIN_INTERVAL_MS` | `250` | `open-sse/services/quotaFetchThrottle.ts` | Intervalo mínimo (ms) entre buscas consecutivas de cota upstream no caminho preflight/monitor por solicitação; espaça chamadas de rede simultâneas para que muitas contas em um IP não interrompam o upstream. Conectado aos buscadores de cota Codex (`/wham/usage`), DeepSeek, Bailian (ambos sites de busca), OpenCode e Crof (#6009, #6911). O caminho genérico de despacho `usage.ts::getUsageForProvider` (github/glm/minimax/nanogpt/xai/etc.) ainda não é coberto — rastreado separadamente. O cache não é afetado. `0` desabilita; fixado `0..60000`. | | `OMNIROUTE_QUOTA_FETCH_JITTER_MS` | `120` | `open-sse/services/quotaFetchThrottle.ts` | Espaçamento aleatório adicional por solicitação (ms), amostrado em cada busca de cota upstream reservada. O padrão é 120; preso `0..60000`; `0` remove apenas o jitter. Defina `OMNIROUTE_QUOTA_FETCH_MIN_INTERVAL_MS=0` para desativar todo o acelerador. O jitter não garante a prevenção de banimentos upstream. | | `CODEX_QUOTA_FETCH_TIMEOUT_MS` | `8000` | `open-sse/services/codexQuotaFetcher.ts` | Tempo limite (ms) para uma única busca de cota Codex (`chatgpt.com/backend-api/wham/usage`). A simulação aguarda essa busca antes de enviar a solicitação. Após um tempo limite ou erro de transporte, o último instantâneo dos últimos 15 minutos é reutilizado, a menos que sua janela se esgote ou tenha sido redefinida; sem nenhuma, a cota é desconhecida, portanto, uma conta de crédito pago é ignorada para essa solicitação e nenhum resfriamento persiste. Aceita um número inteiro positivo até `2147483647`; qualquer outro valor volta ao padrão. | | `PROVIDER_LIMITS_POST_USAGE_REFRESH_DELAY_MS` | `5000` | `src/lib/usage/providerLimits.ts` | Atraso (ms) antes de atualizar os limites do provedor após um evento de uso real, dando à cota upstream API tempo para registrar o consumo. | | `OMNIROUTE_LOGIN_BROWSER_PATH` | detecção automática | `open-sse/services/adobeFireflyBrowserLogin.ts` | Caminho absoluto para um executável do sistema Chrome ou Edge usado para login interativo do Adobe Firefly e renovação fora da tela. | | `ADOBE_FIREFLY_BROWSER_REFRESH` | habilitado | `open-sse/services/adobeFireflySession.ts` | Mantém IMS e o estado de risco do navegador atualizados com sessões CDP do Chrome no escopo da conta. Defina como `0` para desativar a renovação do navegador. | | `ADOBE_FIREFLY_SESSION_DISK` | habilitado | `open-sse/services/adobeFireflySession.ts` | Persiste sessões reparadas da Adobe sob `DATA_DIR` durante as reinicializações do processo. Defina como `0` para manter as sessões apenas na memória. | | `ADOBE_FIREFLY_MIN_SUBMIT_GAP_MS` | `12000` | `open-sse/services/adobeFireflySession.ts` | Espaçamento mínimo em milissegundos entre os envios gerados pelo Adobe Firefly; `0` desativa o espaçamento. | | `ADOBE_FIREFLY_BATCH_EXTRA_GAP_MS` | `15000` | `open-sse/services/adobeFireflySession.ts` | Período extra silencioso em milissegundos após cada terceiro envio bem-sucedido da Adobe. | | `ADOBE_FIREFLY_SUBMIT_BASE_DELAY_MS` | `8000` | `open-sse/services/adobeFireflyClient.ts` | Retirada básica em milissegundos após respostas transitórias do Adobe 408; combinado com espaçamento de envio em no máximo cinco tentativas. | | `OMNIROUTE_DISABLE_BACKGROUND_SERVICES` | `false` | `src/instrumentation-node.ts` | Desative todos os serviços em segundo plano: atualização de cota, sincronização de limites de provedor, recuperação de conexão, integridade de credenciais, sincronização cloud/model/free-proxy/proxy-health, limpeza de retenção, VACUUM agendado e pesquisa de recarga a quente das configurações. Útil para CI/test; em uma instalação de longa duração, as conexões não são recuperadas automaticamente e o banco de dados continua crescendo. | | `OMNIROUTE_HEADLESS` | _(desativado)_ | `src/lib/system/headless.ts` | Inicialização somente do mecanismo proxy: ignora subsistemas opcionais, `/dashboard` → 404. O mesmo que `omniroute serve --headless`. Veja [HEADLESS.md](../guides/HEADLESS.md). | | `OMNIROUTE_ENABLE_RUNTIME_BACKGROUND_TASKS` | _(desativado)_ | `src/lib/config/runtimeSettings.ts` | Force tarefas em segundo plano sob detecção automatizada de testes. Defina `1` para substituir a heurística de teste. | | `OMNIROUTE_BUDGET_RESET_JOB_INTERVAL_MS` | `600000` | `src/lib/jobs/budgetResetJob.ts` | Cadência de verificação de redefinição de orçamento (ms). Chão `10000`. | | `OMNIROUTE_CONNECTION_RECOVERY_INTERVAL_MS` | `60000` | `src/lib/quota/connectionRecovery.ts` | Cadência proativa de recuperação de resfriamento de conexão (ms): revalida conexões cujo `rate_limited_until` transitório decorreu, fora do caminho ativo da solicitação. Piso `5000`. | | `OMNIROUTE_DISABLE_CONNECTION_RECOVERY` | `false` | `src/lib/quota/connectionRecovery.ts` | Desative o agendador proativo de recuperação de resfriamento de conexão (a recuperação lenta no `getProviderCredentials` ainda se aplica). | | `OMNIROUTE_REASONING_CACHE_CLEANUP_INTERVAL_MS` | `1800000` | `src/lib/jobs/reasoningCacheCleanupJob.ts` | Cadência de limpeza do cache de raciocínio (ms). Chão `60000`. | | `OMNIROUTE_REASONING_MIN_BUDGET` | _desativado_ (desativado) | `open-sse/services/reasoningTokenBuffer.ts` | Piso opcional para orçamentos de produção do modelo de pensamento: o chamador `max_tokens` em `[256, floor)` é elevado ao piso (limitado pelo limite de produção do modelo). Orçamentos de clientes = não definidos nunca ampliados (#9507). | | `OMNIROUTE_REASONING_EFFORT_PROBE_PROVIDERS` | _desativado_ (desativado) | `open-sse/services/learnedReasoningEffortCaps.ts` | IDs de provedor separados por vírgula (ou `*`): quando um `reasoning_effort` 400/422 nomeia nenhum conjunto aceito, tente novamente uma vez um nível abaixo (nunca abaixo `low`) e aprenda esse nível somente se a investigação for respondida (#14895). | | `OMNIROUTE_LOG_EXPORT_CRON` | `0 * * * *` | `src/lib/jobs/logExportJob.ts` | Expressão Cron (UTC) para o trabalho de exportação de log de chamadas que drena todos os destinos de exportação de log habilitados. Prefira `*/5 * * * *` ao exportar corpos. | | `OMNIROUTE_LOG_EXPORT_RUN_TIMEOUT_MS` | `900000` | `src/lib/logExport/childRunner.ts` | Tempo limite do relógio filho por destino em milissegundos. O tempo limite registra a falha e encerra o processo sem avançar o lote não confirmado. Os valores Invalid/non-positive/non-integer usam o padrão. | | `OMNIROUTE_LOG_EXPORT_CHILD_MAX_OLD_SPACE_MB` | `1024` | `src/lib/logExport/childRunner.ts` | Limite de espaço antigo filho V8 de exportação de nó em MB (não total RSS). O padrão deixa espaço para 500 linhas de artefatos limitados com corpos; lotes grandes ainda podem esgotar o heap filho. A falha aconselha diminuir o tamanho do lote ou aumentar esse limite. Os valores Invalid/non-positive/non-integer usam o padrão. As exportações Bun retrocedem no processo sem esse limite. | | `OMNIROUTE_CONFIG_HOT_RELOAD_MS` | `5000` | `src/lib/config/hotReload.ts` | Intervalo de pesquisa (ms) para recarregamento a quente de configuração. Menor que `1000` é rejeitado. | | `OMNIROUTE_DISABLE_REDIS_AUTH_CACHE` | _(habilitado)_ | `src/lib/db/apiKeys.ts` | Defina `1` para ignorar o cache de autenticação de chave de API apoiado por Redis (força leituras DB ). | | `OMNIROUTE_RTK_TRUST_PROJECT_FILTERS` | `0` | `open-sse/services/compression/engines/rtk/filterLoader.ts` | Confie nas regras de filtro do projeto RTK gerenciadas pelo usuário sem verificações rigorosas de assinatura. | | `OMNIROUTE_LITE_MAX_TOOL_LENGTH` | `2000` | `open-sse/services/compression/lite.ts` | Limite de caracteres para truncamento proativo do resultado da ferramenta Lite quando `lite.maxToolLength` não está definido. Faixa 256–1000000. A configuração do painel vence esse ambiente. | | `OMNI_COMPRESSION_WORKERS` | `2` | `open-sse/services/compression/compressionWorkerPool.ts` | Máximo de trabalhadores RTK/Caveman síncronos simultâneos; excesso de trabalhos espere FIFO. | | `OMNI_COMPRESSION_WORKER_TIMEOUT_MS` | `120000` | `open-sse/services/compression/compressionWorkerPool.ts` | Tempo limite por trabalho em milissegundos. Os trabalhadores expirados são encerrados e a solicitação falha ao abrir inalterada. | | `OMNI_COMPRESSION_WORKER_IDLE_MS` | `60000` | `open-sse/services/compression/compressionWorkerPool.ts` | Vida útil ociosa em milissegundos antes que um trabalhador de compactação não utilizado seja encerrado. | | `OMNI_COMPRESSION_WORKER_MAX_OLD_MB` | `1024` | `open-sse/services/compression/compressionWorkerPool.ts` | Limite de heap da geração antiga V8 em MB para cada trabalhador de compactação, todos os modos (floor `128`). Uma tarefa que excede esse limite falha ao abrir (descompactar) em vez de aumentar o heap do gateway. | | `COMPRESSION_PIPELINE_BREAKER_ENABLED` | `false` | `open-sse/services/compression/pipelineEngineBreaker.ts` | Chave mestre do disjuntor T02 de tubulação empilhada por motor.** Ativar (padrão desativado)** — quando ativado, um mecanismo que lança repetidamente solicitações é ignorado (falha ao abrir) para um resfriamento; comportamento herdado de byte idêntico ao =. | | `COMPRESSION_PIPELINE_BREAKER_THRESHOLD` | `3` | `open-sse/services/compression/pipelineEngineBreaker.ts` | Falhas consecutivas de solicitação cruzada antes da abertura do disjuntor do motor. | | `COMPRESSION_PIPELINE_BREAKER_COOLDOWN_MS` | `30000` | `open-sse/services/compression/pipelineEngineBreaker.ts` | Milissegundos que um motor aberto permanece ignorado antes de uma sonda entreaberta. | | `COMPRESSION_CCR_RETRIEVAL_RAMP_FACTOR` | `2` | `open-sse/services/compression/engines/ccr/index.ts` | T08/H8 CCR rampa de recuperação-feedback: cada recuperação anterior de um bloco armazenado aumenta seu `minChars` efetivo linearmente (o conteúdo recuperado com frequência é compactado menos; `>=3` recupera = nunca compactado). `1` desativa a rampa (salto binário apenas no limite). | | `COMPRESSION_CCR_DURABLE_STORE` | `true` | `open-sse/services/compression/engines/ccr/index.ts` | armazenamento de bloco durável CCR (#9061). Faz backup do armazenamento na memória com SQLite para que um bloco sobreviva à remoção LRU, ao TTL, a uma reinicialização ou a uma recuperação em outra instância. Defina `false` para manter os blocos apenas na memória. Blocos acima de 512 KB e tempos de execução em nuvem permanecem apenas na memória, independentemente. | | `COMPRESSION_PREFIX_FREEZE_ENABLED` | `false` | `open-sse/services/compression/prefixFreeze.ts` | interruptor mestre de congelamento de prefixo observado pelo uso T08/H5.** Ativar (padrão desativado)** — quando ativado, um prompt do sistema observou `>=` o limite é tratado como um prefixo estável em cache e preservado da compactação, mesmo para provedores que a heurística do cache estático falha (apenas congelamento _preserva_, nunca sofre mutação). | | `COMPRESSION_PREFIX_FREEZE_THRESHOLD` | `3` | `open-sse/services/compression/prefixFreeze.ts` | Observações de um prompt do sistema antes de ser tratado como um prefixo estável congelado. | | `OMNIROUTE_BOOTSTRAPPED` | `false` | `src/app/(dashboard)/dashboard/page.tsx` | Defina `true` pelo script de inicialização após a configuração inicial. Controla a visibilidade do assistente de configuração. | | `OMNIROUTE_ALLOW_BODY_PROJECT_OVERRIDE` | `0` | `open-sse/executors/antigravity.ts` | Escotilha de escape: permite que o corpo da solicitação substitua o campo do projeto Antigravity. | | `ANTIGRAVITY_CREDITS` | `off` | `open-sse/services/antigravityCredits.ts` | Google Uma política de créditos AI : `off` nunca injeta créditos, `retry` injeta uma vez após uma cota elegível 429 e `always` injeta na primeira solicitação. | | `OMNIROUTE_ANTIGRAVITY_TIMING_TELEMETRY` | `false` | `open-sse/executors/antigravity/executeAttempt.ts` | Tempo de ativação higienizado por envio físico: conta inativa, solicitações em andamento, tempo para cabeçalhos e primeiro conteúdo SSE significativo. Nenhum prompt, credencial ou URLs upstream nos logs. | | `ANTIGRAVITY_MAX_429_ATTEMPTS` | `2` | `open-sse/services/antigravity429Guard.ts` | 429 upstream tolerados por solicitação Antigravity (`agy`/`antigravity`) em todos os hosts (1–12) antes que o 429 retorne ao chamador. Um corpo que o gastou é respondido localmente no reenvio (2 minutos, dobrando para 30 minutos ou a dica de nova tentativa upstream) e o manipulador de bate-papo não reinicia a solicitação após esse 429. | | `ANTIGRAVITY_ALLOW_SIGNATURE_BYPASS` | `0` | `open-sse/translator/request/openai-to-gemini.ts` | Permitir que o tradutor de solicitação Antigravity ignore sua validação estrita de assinatura de solicitação CLI quando o upstream recusar assinaturas reais (modo debug/antiquated-CLI ). Diferente de zero habilita o bypass. | | `AGY_TOKEN_FILE` | `~/.gemini/antigravity-cli/antigravity-oauth-token` | `src/app/api/providers/agy-auth/apply-local/route.ts` | Substitua o caminho do arquivo de token Antigravity CLI (agy) para a importação de login local com detecção automática. | ### Ponte OAuth CLI (interna) | Variável | Padrão | Arquivo de origem | Descrição | | ------------------- | ------------------- | ------------------------------- | ------------------------------------------------------ | | `OMNIROUTE_SERVER` | detecção automática | `src/lib/oauth/config/index.ts` | Servidor URL para ponte de autenticação CLI↔OmniRoute. | | `OMNIROUTE_TOKEN` | _(desativado)_ | `src/lib/oauth/config/index.ts` | Token de autenticação para ponte CLI. | | `OMNIROUTE_USER_ID` | `cli` | `src/lib/oauth/config/index.ts` | Usuário ID para sessões de ponte CLI. | | `SERVER_URL` | _(desativado)_ | `src/lib/oauth/config/index.ts` | Alias legado para `OMNIROUTE_SERVER`. | | `CLI_TOKEN` | _(desativado)_ | `src/lib/oauth/config/index.ts` | Alias legado para `OMNIROUTE_TOKEN`. | | `CLI_USER_ID` | _(desativado)_ | `src/lib/oauth/config/index.ts` | Alias legado para `OMNIROUTE_USER_ID`. | --- ## 11. Credenciais do provedor OAuth ### Atualização passiva do token Codex `OMNIROUTE_TOKEN_REFRESH_PASSIVE_PROVIDERS` definido como `codex` torna esta instância um consumidor de credenciais Codex sincronizadas, e não um proprietário de rotação de token de atualização. O padrão vazio ou não definido preserva o comportamento normal de atualização. Os valores separados por vírgula são cortados e não diferenciam maiúsculas de minúsculas; `cx` é um apelido para `codex`. Provedores não suportados falham na validação de inicialização. Outros provedores permanecem inalterados. Nos pontos de atualização existentes, a instância ignora o cache de leitura de conexão e adota apenas um token de acesso diferente e não expirado. Os tokens rejeitados no upstream durante a solicitação não podem se qualificar novamente após a reversão da sincronização: as credenciais da solicitação contêm no máximo quatro impressões digitais SHA-256, descartadas com essa solicitação. Somente campos de token são adotados, portanto, os metadados do provedor local de solicitação sobrevivem. Nenhuma credencial adotada é persistida. Se não existir nenhuma substituição, `refresh_disabled` não será terminal e não contará para o disjuntor de atualização de token. As respostas reais 401/403 upstream retêm a contabilidade normal de falhas, o resfriamento exponencial e os erros do cliente; os sinais de desativação de conta ainda são bloqueados permanentemente. A atualização manual dashboard/API retorna `409` com o código `refresh_disabled` e uma instrução para atualizar na instância ativa e sincronizar. Atualizações implícitas (bate-papo, uso, verificações de integridade e validação de importação) não revelam esse erro; uso sob demanda 401 tentativas de recuperação uma vez com um token sincronizado adotado. As importações Codex auth armazenam os tokens fornecidos sem uma troca de token de atualização; novos logins OAuth permanecem inalterados. Nenhuma sincronização pré-despacho é adicionada fora do caminho de atualização proativa existente. Mantenha exatamente um proprietário de rotação e organize a sincronização de tokens separadamente, antes que os tokens de acesso expirem (lead proativo padrão: cinco minutos). Esta opção não é um bloqueio distribuído, replicação de banco de dados ou implantação SQLite compartilhada. Fonte: `open-sse/services/tokenRefresh/passiveCodex.ts`. Credenciais integradas para** desenvolvimento localhost** . Para implantações remotas, registre-se no console do desenvolvedor de cada provedor. | Variável | Provedor | Notas | | ------------------------------------------- | ------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | `CLAUDE_OAUTH_CLIENT_ID` | Código Claude (Anthropic) | Cliente público — nenhum segredo necessário. | | `CLAUDE_CODE_REDIRECT_URI` | Código Claude | Substituir o redirecionamento URI. Padrão: `https://platform.claude.com/oauth/code/callback` | | `CODEX_OAUTH_CLIENT_ID` | Codex / OpenAI | Cliente público. | | `GEMINI_OAUTH_CLIENT_ID` | Gemini (Google) | Requer correspondência `_SECRET`. | | `GEMINI_OAUTH_CLIENT_SECRET` | Gemini (Google) | — | | `KIMI_CODING_OAUTH_CLIENT_ID` | Codificação Kimi (Moonshot) | Cliente público. | | `MUSE_CODE_OAUTH_CLIENT_ID` | Código da Musa (Meta) | Substituição opcional para o ID público do cliente de fluxo de dispositivo do Muse CLI. Deixe indefinido para usar o cliente público integrado. | | `ANTIGRAVITY_OAUTH_CLIENT_ID` | Antigravity (Google) | Requer correspondência `_SECRET`. | | `ANTIGRAVITY_OAUTH_CLIENT_SECRET` | Antigravity (Google) | — | | `GITHUB_OAUTH_CLIENT_ID` | GitHub Copilot | Cliente público. | | `GHE_COPILOT_OAUTH_CLIENT_ID` | GHE Copilot | Substituição opcional do ID do cliente OAuth do GitHub Enterprise Copilot. Volta ao padrão público de `GITHUB_OAUTH_CLIENT_ID` quando não definido. | | `COPILOT_INTEGRATION_ID` | GitHub Copilot | Substituição opcional para a integração do cliente GitHub Copilot ID enviada nos cabeçalhos `Copilot-Integration-Id` e `Editor-Plugin-Version`. O padrão é `copilot-developer-cli`. | | `WINDSURF_API_KEY` | Windsurf / Devin (v3.8) | Fallback de chave API usado por `open-sse/executors/devin-cli.ts` quando nenhuma credencial por conexão está disponível. Opcional. | | `CLI_DEVIN_BIN` | Devin CLI (v3.8) | Caminho personalizado para o binário CLI Devin (`devin`). Resolvido por `open-sse/executors/devin-cli.ts`. | | `GITLAB_DUO_OAUTH_CLIENT_ID` | GitLab Duo (v3.8) | Cliente OAuth ID para GitLab Duo. Registre um aplicativo no `https://gitlab.com/-/profile/applications` com redirecionamento URI `/callback` e escopos `api, read_user, openid, profile, email`. Volta para `GITLAB_OAUTH_CLIENT_ID`. | | `GITLAB_DUO_OAUTH_CLIENT_SECRET` | GitLab Duo (v3.8) | Segredo do cliente OAuth para GitLab Duo. O fluxo — PKCE opcional não requer segredo. Volta para `GITLAB_OAUTH_CLIENT_SECRET`. | | `GITLAB_DUO_BASE_URL` | GitLab Duo (v3.8) | Substitua GitLab base URL ( GitLab auto-hospedado). O padrão é `https://gitlab.com`. Volta para `GITLAB_BASE_URL`. | | `GITLAB_BASE_URL` | GitLab Duo (v3.8) | Fallback legado para `GITLAB_DUO_BASE_URL`. Usado quando a variante `_DUO_` não está definida. | | `GITLAB_OAUTH_CLIENT_ID` | GitLab Duo (v3.8) | Fallback legado para `GITLAB_DUO_OAUTH_CLIENT_ID` consumido por `src/lib/oauth/constants/oauth.ts`. | | `GITLAB_OAUTH_CLIENT_SECRET` | GitLab Duo (v3.8) | Fallback legado para `GITLAB_DUO_OAUTH_CLIENT_SECRET` consumido por `src/lib/oauth/constants/oauth.ts`. | | `QODER_OAUTH_CLIENT_SECRET` | Qoder | — | | `QODER_OAUTH_AUTHORIZE_URL` | Qoder | Defina para ativar Qoder OAuth. | | `QODER_OAUTH_TOKEN_URL` | Qoder | — | | `QODER_OAUTH_USERINFO_URL` | Qoder | — | | `QODER_OAUTH_CLIENT_ID` | Qoder | — | | `QODER_PERSONAL_ACCESS_TOKEN` | Qoder | Fallback direto da chave API (ignora OAuth). | | `QODER_CLI_WORKSPACE` | Qoder | Espaço de trabalho ID para Qoder CLI. | | `OMNIROUTE_QODER_WORKSPACE` | Qoder | Alias para `QODER_CLI_WORKSPACE`. | | `QODER_CLI_CONFIG_DIR` | Qoder | Substitua o diretório de configuração Qoder CLI (sessão PAT isolada, evita atrapalhar o login do navegador). | | `QODER_CLI_MAX_CONCURRENCY` | Qoder | Máximo de execuções simultâneas de qodercli (impressão spawns ou prompts ACP ); fila de solicitações extras FIFO. Não definido (padrão) = sem limite. | | `QODER_CLI_QUEUE_TIMEOUT_MS` | Qoder | Quanto tempo uma solicitação Qoder aguarda um slot qodercli (somente com um limite definido) antes de falhar com 429 `qodercli_busy` + `Retry-After`. Padrão `120000`. | | `QODER_CLI_TRANSPORT` | Qoder | `print` (padrão) gera `qodercli --print` por solicitação; `acp` mantém um processo `qodercli --acp` persistente por PAT. | | `QODER_CLI_ACP_IDLE_TIMEOUT_MS` | Qoder | Transporte ACP : elimine o processo qodercli persistente após tanto tempo ocioso. Padrão `600000`. | | `QODER_CLI_ACP_STARTUP_TIMEOUT_MS` | Qoder | transporte ACP : prazo para qodercli responder ao ACP `initialize`. `60000` padrão. | | `QODER_CLI_ACP_MAX_SESSIONS_PER_PROCESS` | Qoder | Transporte ACP : recicle o processo qodercli persistente após tantas sessões. Padrão `500`. | | `BLACKBOX_WEB_VALIDATED_TOKEN` | Web caixa preta | Token `tk` de front-end para enviar como `validated` em `/api/chat`. Obrigatório quando o Blackbox impõe correspondência de token; caso contrário, OmniRoute volta para um UUID aleatório. Veja o problema #2252. | | `VISION_BRIDGE_BASE_URL` | Guarda-corpo da Ponte Vision | Base URL compatível com OpenAI para chamadas de ponte de visão não antrópicas. O padrão é o OpenAI URL env legado ou api.openai.com. Aponte para o auto-loop `/v1` de OmniRoute ou qualquer endpoint compatível com OpenAI (Gemini OpenAI-compat, OpenRouter). Emitir #2232. Quando o URL é o próprio `/v1` de OmniRoute, a subsolicitação de descrição envia `x-omniroute-admission-bypass: internal` e autentica com a credencial de auto-loop resolvida (`sk_omniroute` sentinela no modo local ou `OMNIROUTE_API_KEY` / `ROUTER_API_KEY` — #1350) para que as implantações `REQUIRE_API_KEY=true` funcionem. | | `VISION_BRIDGE_API_KEY` | Guarda-corpo da Ponte Vision | Chave API para o URL acima. Substitui vars OpenAI / Google env por provedor para chamadas de ponte de visão não antrópicas. Os modelos Anthropic mantêm seu caminho de chave Anthropic dedicado. Emitir #2232. | | `OMNIROUTE_VISION_BRIDGE_NEGATIVE_CACHE_MS` | Guarda-corpo da Ponte Vision | Por quanto tempo um resultado de roteamento "nenhum candidato utilizável" é armazenado em cache, em ms (padrão `30000`). Valores inválidos ou negativos retornam ao padrão; `0` desativa o cache negativo. Fonte: `src/lib/guardrails/visionBridgeRouter.ts`. | | `OMNIROUTE_IMAGE_NORMALIZATION` | Normalização de imagem de visão | Aceitar (desativar =, zero alteração de comportamento; `1`/`true`/`on` ativado). Normaliza cada imagem embutida (dados base64 URI / Claude `source.data`) nos corpos da solicitação de bate-papo antes do envio: orientação EXIF aplicada, RGB (alfa achatado em branco), borda longa `<= 4096` px, total de pixels `<= ~4M`; imagens que precisam de alteração são recodificadas como linha de base JPEG (alpha-free PNGs permanece sem perdas PNG), RGB JPEG/PNG já compatível passa intacto. Os orçamentos são fixos. Tem como alvo pipelines de visão Qwen2-VL-style que rejeitam imagens oversized/exotic com 400 erros de análise ou travamentos de saída zero. URLs http(s) remotos não são baixados; um binário `sharp` ausente ou uma imagem não decodificável passa intacta (falha ao abrir). Redimensionar uma imagem grande adiciona latência de solicitação. Fonte: `open-sse/utils/visionImageNormalization.ts`. | > [!WARNING] > > 1. Vá para [Google Cloud Console → Credentials](https://console.cloud.google.com/apis/credentials) 2. Crie um cliente OAuth 2.0 ID (digite: "aplicativo da Web") 3. Adicione seu servidor URL como Redirecionamento autorizado URI 4. Substitua os valores de credenciais em `.env`. --- ## 12. Substituições de usuário-agente do provedor Substitua o cabeçalho `User-Agent` enviado para cada provedor upstream. Isso é resolvido dinamicamente em tempo de execução pela classe base do executor: ``` process.env[`${PROVIDER_ID}_USER_AGENT`] ``` > **Fonte:** `open-sse/executors/base.ts` → `buildHeaders()` | Variável | Valor padrão | Quando atualizar | | -------------------------------- | --------------------------------------------- | ------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | `CLAUDE_USER_AGENT` | `claude-cli/2.1.280 (external, cli)` | Quando Anthropic lança uma nova versão CLI | | `CLAUDE_DISABLE_TOOL_NAME_CLOAK` | `false` | `executors/base.ts` + `executors/cliproxyapi.ts` | Defina como `1`/`true` para encaminhar nomes de ferramentas de aproveitamento de terceiros literalmente para Anthropic em ambos os caminhos com ligação antrópica ( OAuth e CLIProxyAPI nativos). Por padrão, o executor cria apelidos determinísticos para nomes de ferramentas que não são do Código Claude (mapeamento canônico do código Claude onde existe, caso contrário PascalCase) e os reverte na resposta via `_toolNameMap`, para que os aproveitamentos com ferramentas snake_case não sejam recusados como clientes de terceiros com impressão digital. Apenas depuração. | | `CODEX_USER_AGENT` | `codex-cli/0.155.0 (Windows 10.0.26200; x64)` | Quando OpenAI atualiza o Codex CLI | | `CODEX_CLIENT_VERSION` | `0.155.0` | Substituir a versão do cliente Codex independentemente da string UA completa | | `GROK_CLI_CLIENT_VERSION` | `1.0.41` | Substitua `x-grok-client-version` para inferência, sincronização de modelo e código de dispositivo OAuth, além do Grok CLI User-Agent padrão para inferência e sincronização de modelo. Aceita SemVer com metadados prerelease/build opcionais, até 128 caracteres após cortar os espaços em branco ao redor. Valores não definidos, vazios, inválidos ou que contêm quebra de linha usam o PIN enviado. A substituição de agente de usuário de inferência completa existente mantém a precedência. | | `CLAUDE_CODE_CLIENT_VERSION` | `2.1.280` | Substitua a versão anunciada do código Claude independentemente de `CLAUDE_USER_AGENT`. Anthropic bloqueia alguns modelos neste valor (#12417). | | `CLAUDE_CODE_CLIENT_BUILD_REVISION` | `1e2` | Substitua o sufixo de três caracteres OmniRoute acrescenta a `cc_version=` no bloco de cobrança Claude. Bata ao lado de `CLAUDE_CODE_CLIENT_VERSION` — fixando apenas a versão que anuncia um par `version.revision` sem emissões binárias reais. | | `GITHUB_COPILOT_CLI_VERSION` | `1.0.91` | Substituir a versão anunciada Copilot CLI independentemente do `GITHUB_USER_AGENT` | | `GITHUB_USER_AGENT` | `GitHubCopilotChat/0.54.0` | Quando GitHub Copilot Chat é atualizado | | `ANTIGRAVITY_CLI_CL` | _(desativado)_ | Substitua a lista de alterações do Piper Antigravity CLI `agy`) relatada como `cl=` no CLI User-Agent. Não derivável da versão nem exposta pelos manifestos públicos; propagado por versão de uma captura ao vivo (1.4.4 → `1003595037`). Unset em uma versão desconhecida omite `cl=` em vez de anunciar a lista de alterações de outra compilação. | | `KIRO_USER_AGENT` | `AWS-SDK-JS/3.0.0 kiro-ide/1.0.0` | Quando Kiro IDE é atualizado | | `KIRO_OAUTH_CLIENT_ID` | `kiro-cli` | Substitua o código do dispositivo social Kiro `clientId` (id público) | | `KIRO_VERIFY_FULL_CRC` | `false` | Aceitação: validação CRC de mensagem completa por quadro no fluxo de eventos Kiro (depuração de fluxos corrompidos) | | `KIRO_CREDIT_PRICE_USD` | `0.02` | USD por crédito Kiro ; converte créditos `meteringEvent` no custo exato por solicitação | | `KIRO_REQUIRE_CREDITS` | `false` | Falha em uma resposta Kiro que não informa nenhuma medição de crédito em vez de registrá-la como não faturada | | `QODER_USER_AGENT` | `Qoder-Cli` | Quando Qoder CLI é atualizado | | `CURSOR_USER_AGENT` | `Cursor/3.3` | Quando Cursor atualiza | > [!TIP] > Você pode adicionar substituições de User-Agent para** qualquer** provedor usando o padrão `{PROVIDER_ID}_USER_AGENT`. O executor constrói dinamicamente o nome da variável env. --- ## 13. Compatibilidade de impressão digital CLI Quando ativado, OmniRoute reordena os cabeçalhos HTTP e os campos do corpo JSON para corresponder à assinatura exata das ferramentas CLI oficiais. Isso reduz o risco de sinalização de conta, preservando seu proxy IP. **Fonte:** `open-sse/config/cliFingerprints.ts`, `open-sse/executors/base.ts` ### Por provedor | Variável | Ativação | Efeito | | ------------------------ | -------- | ----------------------------------------------------- | | `CLI_COMPAT_CODEX` | `=1` | Imita a assinatura da solicitação Codex CLI | | `CLI_COMPAT_CLAUDE` | `=1` | Imita assinatura de solicitação de código Claude | | `CLI_COMPAT_GITHUB` | `=1` | Imita a assinatura da solicitação GitHub Copilot | | `CLI_COMPAT_ANTIGRAVITY` | `=1` | Imita assinatura de solicitação Antigravity | | `CLI_COMPAT_CURSOR` | `=1` | Imita assinatura de solicitação Cursor | | `CLI_COMPAT_KIMI_CODING` | `=1` | Imita a assinatura da solicitação de codificação Kimi | | `CLI_COMPAT_KILOCODE` | `=1` | Imita assinatura de solicitação de Kilo Code | | `CLI_COMPAT_CLINE` | `=1` | Imita assinatura de solicitação Cline | ### Global | Variável | Ativação | Efeito | | ---------------- | -------- | -------------------------------------------------------------------------------------- | | `CLI_COMPAT_ALL` | `=1` | Ativar compatibilidade de impressão digital para** todos** fornecedores de uma só vez. | ### Kimi Codificação substituições de identidade CLI | Variável | Padrão | Arquivo de origem | Descrição | | ----------------------- | -------------------- | ---------------------------------------- | -------------------------------------------------------------------------- | | `KIMI_CLI_VERSION` | `1.36.0` | `src/lib/oauth/providers/kimi-coding.ts` | Substitua a versão Kimi CLI enviada durante chamadas OAuth/API. | | `KIMI_CODING_DEVICE_ID` | _(padrão capturado)_ | `src/lib/oauth/providers/kimi-coding.ts` | Substitua o dispositivo Kimi capturado ID usado nos cabeçalhos do cliente. | > [!NOTE] > Este recurso funciona junto com as substituições do User-Agent (§12). O sistema de impressão digital lida com a ordenação do cabeçalho e dos campos do corpo, enquanto as substituições do User-Agent lidam com a string UA específica. Ambos podem ser habilitados de forma independente. --- ## 14. Provedores-chave API Chaves API para provedores que usam autenticação direta.** Configuração preferida:** Provedores → do painel → Adicionar chave API. A configuração por meio de variáveis de ambiente é uma alternativa para implantações Docker ou headless. Padrão reconhecido: `{PROVIDER_ID}_API_KEY` | Variável | Provedor | | ------------------ | ------------------------------------------------------ | | `DEEPSEEK_API_KEY` | DeepSeek | | `NVIDIA_API_KEY` | NVIDIA NIM | | `JINA_AI_API_KEY` | Jina AI (substituição do leitor da Fundação API + ) | | `JINA_API_KEY` | Jina AI (apelido de `JINA_AI_API_KEY`) | | `GEMINI_API_KEY` | Gemini (Google AI Studio) embeddings + chat substituto | | `GOOGLE_API_KEY` | Gemini (alias para `GEMINI_API_KEY`) | > [!NOTE] > Entradas `${PROVIDER}_API_KEY` estáticas para Groq, xAI, Mistral, Perplexity, Together AI, Fireworks, Cerebras, Cohere, Nebius e Qianfan foram removidas na v3.8.0 porque o tempo de execução não as lê mais — esses provedores dependem exclusivamente do Dashboard / `data/provider-credentials.json` / o DB criptografado. Consulte a seção _Auditoria: variáveis removidas/mortas_ na parte inferior deste documento para obter o caminho de migração. > [!TIP] > As chaves definidas por meio do Dashboard são armazenadas criptografadas em SQLite e têm precedência sobre as variáveis de ambiente. > > **Jina:** embeddings `jina-ai/…`, reclassificar, classificar, segmentar e `jina-search` fazer** não** faturar uma chave env de cluster quando existir uma conexão `jina-ai` do painel (ou `jina-reader` compartilhada) — `getProviderCredentials` é preenchido primeiro. `JINA_AI_API_KEY` / `JINA_API_KEY` são usados somente quando não existe nenhuma chave de painel utilizável. Os registros de chamadas atribuem o substituto env como `connection_id=env:JINA_AI_API_KEY`. O cartão Reader (`jina-reader`, `r.jina.ai`) nunca atende `/v1/embeddings` ou `/v1/rerank`. > > **Gemini:** `gemini/gemini-embedding-2` (também conhecido como `google/gemini-embedding-2`) usa primeiro a conexão `gemini` do painel. `GEMINI_API_KEY` / `GOOGLE_API_KEY` são usados somente quando não existe nenhuma chave de painel utilizável. Os registros de chamadas atribuem o substituto do env como `connection_id=env:GEMINI_API_KEY`. O tráfego multimodal nativo usa `x-goog-api-key` contra `:embedContent` / `:batchEmbedContents` — N OpenAI `input` itens tornam-se N vetores. --- ## 15. Configurações de tempo limite Todos os valores estão em** milissegundos** . Resolução centralizada em `src/shared/utils/runtimeTimeouts.ts`. ### Hierarquia de tempo limite ``` REQUEST_TIMEOUT_MS (global override) ├─→ FETCH_TIMEOUT_MS (upstream provider calls, default: 600000) │ ├─→ FETCH_HEADERS_TIMEOUT_MS (inherits from FETCH_TIMEOUT_MS) │ ├─→ FETCH_BODY_TIMEOUT_MS (inherits from FETCH_TIMEOUT_MS) │ ├─→ TLS_CLIENT_TIMEOUT_MS (inherits from FETCH_TIMEOUT_MS) │ │ └── TLS_FIRST_BYTE_WATCHDOG_MS (independent, default: 10000) │ ├── RESPONSES_FIRST_BYTE_TIMEOUT_MS (independent, default: 15000) │ ├── OPENCODE_RESPONSES_HEADERS_WAIT_MS (independent, default: 0 = off, suggested: 30000) │ ├── OPENCODE_RESPONSES_HEADERS_WAIT_MAX_ROTATIONS (independent, default: 2) │ ├── FETCH_CONNECT_TIMEOUT_MS (independent, default: 30000) │ └── FETCH_KEEPALIVE_TIMEOUT_MS (independent, default: 4000) ├─→ STREAM_IDLE_TIMEOUT_MS (inherits from REQUEST_TIMEOUT_MS, default: 600000) ├─→ STREAM_ACTIVE_TIMEOUT_MS (independent; unset: 1260000, raised by declared budgets; set: hard cap; 0 disables) ├─→ STREAM_READINESS_TIMEOUT_MS (inherits from REQUEST_TIMEOUT_MS, default: 80000) ├─→ STREAM_READINESS_MAX_TIMEOUT_MS (caps adaptive readiness extensions, default: 180000) └─→ API_BRIDGE_PROXY_TIMEOUT_MS (inherits from REQUEST_TIMEOUT_MS, default: 30000) ├─→ API_BRIDGE_SERVER_REQUEST_TIMEOUT_MS (derived, default: 300000) ├── API_BRIDGE_SERVER_HEADERS_TIMEOUT_MS (default: 60000) ├── API_BRIDGE_SERVER_KEEPALIVE_TIMEOUT_MS (default: 5000) └── API_BRIDGE_SERVER_SOCKET_TIMEOUT_MS (default: 0 = disabled) ``` | Variável | Padrão | Descrição | | ------------------------------------------------- | ----------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | `REQUEST_TIMEOUT_MS` | _(desativado)_ | O atalho global — substitui os padrões `FETCH_TIMEOUT_MS` e `STREAM_IDLE_TIMEOUT_MS`. | | `FETCH_TIMEOUT_MS` | `600000` | Tempo limite total de solicitação HTTP para chamadas de provedor upstream. | | `STREAM_IDLE_TIMEOUT_MS` | `600000` | Silêncio máximo entre bytes upstream brutos antes de abortar. Modelos de pensamento estendido raramente pausam > anos 90. | | `STREAM_ACTIVE_TIMEOUT_MS` | `1260000` | Vida útil total máxima do fluxo SSE ativo; nunca é redefinido em bytes upstream e é independente de `REQUEST_TIMEOUT_MS`. Quando não definido, o padrão é o maior `timeoutMs` por modelo no registro (1200000, Codex) mais uma margem de 60.000, e uma meta que declara um orçamento mais longo (conexão `timeoutMs`, depois por modelo, depois em nível de provedor, por exemplo, 3000000 de GLM) obtém esse orçamento mais 60.000. Um valor positivo é um limite máximo para cada meta que os orçamentos declarados não podem aumentar. Defina como `0` para desabilitar para cada alvo. | | `OMNIROUTE_SSE_COMMENTS` | _(desabilitado)_ | Se OmniRoute pode emitir linhas de comentários SSE `:` (por exemplo, os trailers `: keepalive` heartbeat e `x-omniroute-*` metadata). Desativado por padrão (#10524), pois clientes estritamente compatíveis com OpenAI JSON.parse cada linha SSE e trava nos comentários `:` ; os batimentos cardíacos `data:` não são afetados. Defina `on`/`true`/`1`/`yes` para ativar novamente. Usado por `open-sse/utils/sseHeartbeat.ts`. | | `SSE_COALESCE_MS` | `0` (desligado) | Aceitação: mescla eventos Claude `content_block_delta` consecutivos (mesmo índice de bloco e tipo delta) enviados para clientes Claude, liberando pelo menos a cada N ms. Sem perdas; Os eventos `signature_delta` e border nunca são mesclados. Aplica-se a todos os tipos delta, a menos que uma variável por tipo abaixo seja definida. Usado por `open-sse/utils/sseDeltaCoalesce.ts`. | | `SSE_COALESCE_THINKING_MS` | `0` (desligado) | Substituição por tipo de `SSE_COALESCE_MS` para `thinking_delta`. | | `SSE_COALESCE_TEXT_MS` | `0` (desligado) | Substituição por tipo de `SSE_COALESCE_MS` para `text_delta`. | | `SSE_COALESCE_INPUT_JSON_MS` | `0` (desligado) | Substituição por tipo de `SSE_COALESCE_MS` para `input_json_delta`. | | `SSE_FRAME_COALESCE_MS` | `0` (desligado) | Opt-in: quadros SSE em lote encaminhados em N ms em uma gravação para o cliente. O primeiro quadro e os quadros terminais (`[DONE]`, `message_stop`, `error`, `response.completed`/`failed`/`incomplete`) nunca são atrasados; com lote ativado, ITL mede lacunas entre lotes. Usado por `open-sse/utils/sseOutputSink.ts`. | | `SSE_STALL_WATCHDOG` | `timer` | Implementação de watchdog de byte-stall para respostas transmitidas. `timer` rearma um temporizador por bloco upstream (dispara exatamente no orçamento de stall); `interval` mantém uma verificação por fluxo com período `clamp(budget/4, 1s, 5s)`, portanto, uma parada é acionada dentro do período + do orçamento. Usado por `open-sse/utils/streamStallWatchdog.ts`. | | `STREAM_READINESS_TIMEOUT_MS` | `80000` | É hora de receber o primeiro evento SSE sem ping. Herda `REQUEST_TIMEOUT_MS` quando definido. | | `STREAM_READINESS_MAX_TIMEOUT_MS` | `180000` | Janela máxima adaptável de prontidão do primeiro evento para solicitações de streaming grandes, com muitas ferramentas ou com alto raciocínio. | | `OMNIROUTE_AGENT_GOAL_POLICY_ENABLED` | `true` | Kill-switch para a heurística `/goal`. Defina `false`/`0`/`off` para desabilitar totalmente a detecção. Os tempos limite de prontidão — e a recuperação de fluxo nunca são elevados pela solicitação body/headers, mitigando a amplificação de tempo limite controlada pelo cliente. | | `OMNIROUTE_AGENT_GOAL_READINESS_MAX_TIMEOUT_MS` | `600000` | Janela máxima de preparação para o primeiro evento para execuções ou solicitações forçadas do agente `/goal` detectadas com `x-omniroute-agent-goal`. | | `OMNIROUTE_AGENT_GOAL_STREAM_RECOVERY` | `true` | Habilite a recuperação antecipada de fluxo automaticamente para execuções detectadas do agente `/goal`. Defina `false`/`0`/`off` para desativar a aceitação específica da meta. Isso só pode recuperar ADD além do — padrão do operador, ele nunca substitui uma desativação explícita das configurações `STREAM_RECOVERY_ENABLED`/DB. | | `OMNIROUTE_CODEX_DROP_NONSTANDARD_EVENTS` | `true` | Remova eventos `codex.*` SSE não padrão (por exemplo, `codex.rate_limits`) que quebram o `responses.stream()` do OpenAI SDK com um 502. ON padrão (#11014). Defina `0`/`false`/`no`/`off` para encaminhá-los. | | `OMNIROUTE_CODEX_APPSERVER_WS` | _(desativado)_ | Transporte de servidor de aplicativo Codex opcional. Endpoint WebSocket (`ws://`/`wss://`) de um sidecar `codex app-server` local. Quando definidas junto com um token, as solicitações Codex são roteadas por JSON-RPC para o arquivo secundário em vez das respostas HTTP API. Também configurável por conexão via `providerSpecificData.codexAppServerUrl`. Usado por `open-sse/executors/codex/appServerConfig.ts`. | | `OMNIROUTE_CODEX_APPSERVER_WS_TOKEN` | _(desativado)_ | Token capability/bearer embutido apresentado ao servidor de aplicativos. Substituição por conexão: `providerSpecificData.codexAppServerToken`. | | `OMNIROUTE_CODEX_APPSERVER_WS_TOKEN_FILE` | _(desativado)_ | Caminho para um arquivo que contém o token de capacidade do servidor de aplicativos (de `codex app-server --ws-token-file`). Usado quando `OMNIROUTE_CODEX_APPSERVER_WS_TOKEN` não está definido. Substituição por conexão: `providerSpecificData.codexAppServerTokenFile`. | | `OMNIROUTE_CODEX_APPSERVER_CWD` | `/tmp` | Diretório de trabalho no qual o servidor de aplicativos é executado. Substituição por conexão: `providerSpecificData.codexAppServerCwd`. | | `OMNIROUTE_CODEX_APPSERVER_APPROVAL` | _(desativado)_ | Política de aprovação passada para o turno do servidor de aplicativos (por exemplo, `never`, `on-request`). Substituição por conexão: `providerSpecificData.codexAppServerApprovalPolicy`. | | `OMNIROUTE_CODEX_APPSERVER_SANDBOX` | _(desativado)_ | Política de sandbox passada para o turno do servidor de aplicativos (por exemplo, `read-only`, `workspace-write`, `danger-full-access`). Quando não definido, o executor assume como padrão `workspace-write` (endurecido; anteriormente `danger-full-access`). Substituição por conexão: `providerSpecificData.codexAppServerSandbox`. | | `OMNIROUTE_CODEX_APPSERVER_AUTO_APPROVE` | `false` | Aprovar automaticamente os próprios prompts de aprovação do servidor de aplicativos (execução command/file/permission no host). Desativado por padrão, os prompts — são negados automaticamente; as chamadas da ferramenta de chicote não são afetadas (elas percorrem a passagem `item/tool/call` separada). Aceita `true`/`1`/`yes`. Substituição por conexão: `providerSpecificData.codexAppServerAutoApprove`. | | `FETCH_HEADERS_TIMEOUT_MS` | = `FETCH_TIMEOUT_MS` | Hora de receber cabeçalhos de resposta. | | `OMNIROUTE_FETCH_START_TIMEOUT_CAP_MS` | `110000` | Espera máxima por cabeçalhos de resposta em solicitações de streaming (ms). `0` desativa esse limite; um provedor explícito `fetchStartTimeoutCapMs` tem precedência. | | `OMNIROUTE_CODEX_IMAGE_RESPONSE_START_TIMEOUT_MS` | `600000` (10 min) | Prazo de início da primeira resposta (ms) para Codex image-generation/edit POSTs pago, tanto direto quanto por meio de um proxy HTTP(S)/SOCKS. Essas solicitações nunca são reproduzidas após um tempo limite ambíguo ou falha de rede. Os relés de borda (`vercel`/`deno`/`cloudflare`) também fazem uma tentativa, mas mantêm seu próprio prazo `OMNIROUTE_RELAY_FETCH_TIMEOUT_MS`. | | `OMNIROUTE_DIRECT_HEADERS_TIMEOUT_MS` | `30000` (30 anos) | Espera máxima de início de resposta (ms) para cada tentativa direta sem proxy. Um tempo limite é repetido uma vez em um soquete novo; configure `0` para desabilitar o limite e manter o comportamento anterior. | | `OMNIROUTE_LOCAL_DIRECT_HEADERS_TIMEOUT_MS` | `300000` (5 min) | Piso de início de resposta (ms) para tentativas diretas sem proxy cujo host de destino é private/LAN/loopback (por exemplo `localhost`, `host.docker.internal`, `192.168.x.x`), portanto, uma inicialização a frio Ollama nativa não é interrompida pelo padrão 30s acima. Atua como piso: a espera efetiva é maior entre esse valor e `OMNIROUTE_DIRECT_HEADERS_TIMEOUT_MS`; `0` ou um valor inválido remove o piso local. Hosts remotos não são afetados. | | `OMNIROUTE_DIRECT_HEADERS_VOLUME_ADAPTIVE` | `1` | Aumente a janela de início de resposta direta por nível de carga útil de solicitação: corpos acima de 512 KB recebem × 2, acima de 2 MB × 3, limitado a 180 s e nunca abaixando um piso já superior (a substituição do operador ou o piso local/LAN acima). Contextos grandes são pré-preenchidos proporcionalmente ao tamanho da entrada, sem seletor de raciocínio para o limite de raciocínio ser ativado, de modo que a janela plana corta fluxos de pré-preenchimento lento e saudável exatamente no chão. Defina `0`/`false`/`off` para fixar o comportamento plano. | | `OMNIROUTE_DIRECT_RESPONSE_RETRY_TIMEOUT_MS` | `600000` (10 min) | Teto (ms) para a tentativa RETRY soquete novo após um tempo limite de início de resposta de tentativa em pool acima (#13703). Aplica-se somente quando o chamador já anexou seu próprio sinal de prazo (a conexão/modelo/provedor/cascata `FETCH_TIMEOUT_MS` resolvida); esse sinal é o limite real e dispara primeiro no caminho pretendido, portanto, este é um backstop generoso em vez de um — de tampa plana sem ele, a nova tentativa reutilizou a janela `OMNIROUTE_DIRECT_HEADERS_TIMEOUT_MS` curta idêntica à tentativa agrupada e 504 modelos de raciocínio TTFB lentos e saudáveis. Nunca permitido abaixo do piso plano acima; quando o chamador não fornece nenhum sinal de prazo, a nova tentativa mantém o piso plano inalterado. | | `FETCH_BODY_TIMEOUT_MS` | = `FETCH_TIMEOUT_MS` | É hora de receber o corpo da resposta completo. | | `FETCH_CONNECT_TIMEOUT_MS` | `30000` | Tempo limite de estabelecimento da conexão TCP. | | `FETCH_KEEPALIVE_TIMEOUT_MS` | `4000` | Tempo limite de inatividade do soquete keep-alive. | | `TLS_CLIENT_TIMEOUT_MS` | = `FETCH_TIMEOUT_MS` | Tempo limite do proxy de impressão digital TLS (wreq-js). | | `TLS_FIRST_BYTE_WATCHDOG_MS` | `10000` | Limita o tempo até o primeiro byte especificamente no corpo do transporte de impressão digital TLS wreq-js; `TLS_CLIENT_TIMEOUT_MS` sozinho não pode capturar um corpo paralisado, pois é resolvido assim que os cabeçalhos chegam (#12656). Um tempo limite cancela o leitor wreq e retorna ao despachante direct/proxy ; `0` desativa o watchdog. | | `RESPONSES_FIRST_BYTE_TIMEOUT_MS` | `15000` | Somente executor OpenCode e somente enquanto o sinalizador de recurso `OPENCODE_RESPONSES_STALL_ROTATION` estiver ativado (padrão desativado): limita a espera pelo primeiro byte do corpo de uma resposta de Respostas transmitida após seus cabeçalhos (#13484). Um fluxo de respostas é aberto com `response.created`, portanto, o silêncio após esta janela é uma paralisação: a conta é resfriada e a solicitação passa para a próxima conta uma vez; uma segunda parada falha rapidamente. `0` desativa a proteção mesmo com o sinalizador ativado. | | `OPENCODE_RESPONSES_HEADERS_WAIT_MS` | `0` (= desligado) | Apenas executor OpenCode : limita a espera por cabeçalhos de resposta upstream em uma chamada de Respostas transmitida quando outra conta ainda está disponível — uma solicitação na fila para de esperar e segue em frente em vez de manter a janela de cabeçalhos completa. Somente chamadas de Respostas transmitidas são afetadas (o fluxo de Respostas abre com `response.created`, portanto, há uma fila de silêncio, não uma geração); as conclusões do bate-papo e as chamadas não transmitidas permanecem intactas, e a janela apenas reduz o limite efetivo de início de busca, nunca o estende. Valor sugerido ao ativar: `30000`. `0` desabilita. | | `OPENCODE_RESPONSES_HEADERS_WAIT_MAX_ROTATIONS` | `2` | Somente executor OpenCode : quantas vezes por solicitação o limite de espera de cabeçalho acima pode ser movido para a próxima conta. A última conta restante sempre mantém a janela completa dos cabeçalhos. | | `OPENCODE_PARK_AND_RESUME` | `false` | Somente executor OpenCode : estacione a solicitação com uma pulsação após repetidos 429s transitórios (ou um novo marcador de tensão de pool) e, em seguida, reproduza uma perna limitada de até 3 contas sequenciais em vez de espalhar toda a frota (#13924). Desativado por padrão: cada 429 rotações para a próxima conta exatamente como antes. | | `OPENCODE_PARK_REPLAY_SERVE_SETASIDE` | `false` | Somente executor OpenCode : quando todas as contas prontas para resfriamento na perna de repetição estacionar e retomar forem reservadas pela memória de recusa de proxy, sirva-as de qualquer maneira, em vez de reproduzir nada (#14851, acompanhamento de #14750). Desativado por padrão: o trecho de reprodução está vazio nesse caso, como antes #14750. | | `STREAM_READINESS_STALL_RETRY` | `false` | Apenas chat de streaming: quando o primeiro corpo upstream para antes de produzir um evento utilizável, emita uma segunda tentativa limitada através do mesmo caminho de roteamento com o mesmo orçamento de prontidão e sem penalidade de conta. Desativado por padrão: um primeiro corpo parado falha na solicitação sem tentar novamente. | | `OPENCODE_POOL_RESELECT` | `false` | Somente executor OpenCode : após um 429 de um provedor com bucket de saída em uma conta sem proxy em um contexto de pool de ambiente, solicite ao pool de conexões outro membro para a próxima tentativa, em vez de tentar novamente o mesmo endereço de saída. Ordena, nunca exclui: um pool esgotado mantém o comportamento atual. Desativado por padrão: cada 429 rotações para a próxima conta exatamente como antes. | | `OPENCODE_POOL_STRAIN_MARKER_PATH` | _(desativado)_ | Somente executor OpenCode : substitui o caminho do marcador de tensão do pool lido antes de estacionar (`{since, reason, ttl_s}`, padrão `/tmp/opencode-pool-strain.json`, #13924). Um novo marcador estaciona sem recontar; ausente ou obsoleto volta para o contador de burst. | | `API_BRIDGE_PROXY_TIMEOUT_MS` | `30000` | Tempo limite de salto do proxy para solicitações de ponte `/v1`. | | `FIRECRAWL_BASE_URL` | `https://api.firecrawl.dev` | Aponte o executor de busca na web do Firecrawl para uma instância auto-hospedada ( chave API opcional fora da nuvem). | | `FIRECRAWL_TIMEOUT_MS` | `30000` | Tempo limite por solicitação para o executor de busca na Web do Firecrawl. | | `TAVILY_BASE_URL` | _(desativado)_ | Base URL para o buscador de cotas Tavily `/usage` (Limites do Provedor); ignorado quando aponta para `api.tavily.com`. Unset retorna à base da conexão URL. | | `API_BRIDGE_SERVER_REQUEST_TIMEOUT_MS` | `300000` | Tempo limite geral de solicitação do servidor para a ponte. | | `API_BRIDGE_SERVER_HEADERS_TIMEOUT_MS` | `60000` | É hora de enviar cabeçalhos de resposta pela ponte. | | `API_BRIDGE_SERVER_KEEPALIVE_TIMEOUT_MS` | `5000` | Tempo limite de inatividade do keep-alive da ponte. | | `API_BRIDGE_SERVER_SOCKET_TIMEOUT_MS` | `0` | Tempo limite do soquete bruto (0 = desabilitado). | | `SHUTDOWN_TIMEOUT_MS` | `30000` | Período de carência em SIGTERM/SIGINT antes da saída forçada. | | `OMNIROUTE_DEFAULT_FETCH_TIMEOUT_MS` | `120000` | Fallback usado por `src/shared/utils/fetchTimeout.ts` quando `FETCH_TIMEOUT_MS` não está definido. | | `OMNIROUTE_PROVIDER_PROBE_TIMEOUT_MS` | `8000` | Tempo limite (ms) para as predefinições `validationRead` e `modelsProbe` em `src/shared/network/safeOutboundFetch.ts`. Aumente para endpoints lentos (Cerebras, Cloudflare AI, Groq) para evitar oscilações entre active/error no painel. Volta para 8.000 ms para valores inválidos (< 1.000) ou não numéricos. | | `OMNIROUTE_RELAY_FETCH_TIMEOUT_MS` | `25000` | Tempo limite de busca específico do relé em `open-sse/utils/proxyFetch.ts` (#9158). Um relé interrompido deve falhar antes do tempo limite client/agent (~ 30s) para que os chamadores vejam uma falha específica do relé em vez de um tempo limite upstream genérico. Limitado em `29000` para que sempre dispare primeiro. | | `OMNIROUTE_RETRY_BACKOFF_MS` | `10` | Espera de repetição compartilhada para os caminhos de repetição única direct/relay/proxy em `open-sse/utils/proxyFetch.ts` (#9158). `0` = tente novamente imediatamente. | | `OMNIROUTE_CLAUDE_TLS_TIMEOUT_MS` | `60000` | Tempo limite de solicitação wreq-js nativo (`claudeTlsClient.ts`). | | `OMNIROUTE_CLAUDE_TLS_GRACE_MS` | `10000` | Graça absoluta de prazo máximo JS adicionada ao tempo limite nativo. | | `OMNIROUTE_PPLX_TLS_TIMEOUT_MS` | `30000` | Tempo limite de solicitação wreq-js nativo (`perplexityTlsClient.ts`). | | `OMNIROUTE_PPLX_TLS_GRACE_MS` | `10000` | Graça absoluta de prazo máximo JS adicionada ao tempo limite nativo. | | `OMNIROUTE_PPLX_SEARCH_HINT` | `0` (desligado) | Acrescenta "Você tem pesquisa na web integrada. Responda às perguntas diretamente usando os resultados da pesquisa." à mensagem do sistema do chamador (`perplexity-web/protocol.ts`). Desativado por padrão, — Perplexity pesquisa de qualquer maneira, e a frase vaza nas respostas como meta-comentário para clientes de codificação. Defina `1`/`true`/`yes`/`on` para restaurar. | | `OMNIROUTE_GROK_TLS_TIMEOUT_MS` | `60000` | Tempo limite de solicitação wreq-js nativo (`grokTlsClient.ts`). | | `OMNIROUTE_GROK_TLS_GRACE_MS` | `10000` | Graça absoluta de prazo máximo JS adicionada ao tempo limite nativo. | | `OMNIROUTE_NOTION_TLS_TIMEOUT_MS` | `30000` | Tempo limite de solicitação wreq-js nativo (`notionTlsClient.ts`); `notion-web` aumenta por solicitação para `180000` por longas gerações. | | `OMNIROUTE_NOTION_TLS_GRACE_MS` | `10000` | Graça absoluta de prazo máximo JS adicionada ao tempo limite nativo. | | `OMNIROUTE_BROWSER_POOL` | `on` | Pool de navegadores Playwright compartilhado para bate-papo com cookies da web apoiados por navegador (`browserPool.ts`); defina `off` para desabilitar. | | `OBSCURA_BIN` | `auto-detect` | Caminho para o binário `obscura` usado como mecanismo principal pelo pool de navegadores e pelo executor Cloudflare Playground (`open-sse/services/obscura.ts`); detectado automaticamente no sistema PATH quando não definido. | | `OBSCURA_CDP_ENDPOINT` | _(desativado)_ | Aponte para um Obscura (`http://host:port`) já em execução em vez de gerar um; o módulo não possui esse processo (`open-sse/services/obscura.ts`). | | `OBSCURA_PORT` | `random free port` | Porta explícita para o `obscura serve` gerado; uma porta livre é escolhida automaticamente quando não definida (`open-sse/services/obscura.ts`). | | `WEB_COOKIE_USE_BROWSER` | `0` | Opte por uma solicitação de chat de cookie da web no caminho do navegador (`browserBackedChat.ts`); `1` para ativar. | | `KIMI_WEB_BASE_URL` | `https://www.kimi.ai` | Base URL para o executor Kimi Web (internacional kimi.ai Connect-RPC) (`kimi-web.ts`); substituir apenas para terminais mirror/proxy. | | `KIMI_WEB_CHAT_URL` | `/apiv2/kimi.gateway.chat.v1.ChatService/Chat` | Endpoint de chat completo para o executor da Web Kimi (`kimi-web.ts`). | | `OMNIROUTE_LOGIN_BROWSER_PATH` | _(detectado automaticamente)_ | Caminho para um executável Chrome/Edge do sistema para login do navegador interativo Adobe Firefly (`adobeFireflyBrowserLogin.ts`); substitui a detecção automática por sistema operacional. | | `OMNIROUTE_STANDALONE_DIR` | _.construir/saída autônoma_ | Substituição em tempo de construção para o diretório de saída independente consumido pela etapa de colocation pós-construção (`scripts/build/colocate-standalone.mjs`); ferramentas de construção, não tempo de execução. | As tentativas de destino combinado herdam o tempo limite de solicitação upstream resolvido (`FETCH_TIMEOUT_MS` ou `REQUEST_TIMEOUT_MS` quando fornece o padrão de busca). Defina `targetTimeoutMs` em um combo, padrões de combo ou substituição de provedor apenas para tornar o fallback do combo mais rápido; valores acima do tempo limite de upstream atual são limitados ao tempo limite de upstream. `comboTimeoutMs` é um orçamento combinado completo separado para alvos de failover. Deixe-o não definido ou `0` para manter a iteração ilimitada (uma parada codificada de 10 minutos em `comboPredicates.ts` ainda se aplica). Um valor positivo substitui a rede de segurança do combo. Mantenha `comboTimeoutMs` por mais tempo que `targetTimeoutMs` para que o failover ainda tenha tempo após um primeiro destino lento. ### Limites do disjuntor Ajuste do disjuntor no nível do provedor. Os padrões refletem os valores escalonados usados desde a v3.6 para conexões de 500 +. | Variável | Padrão | Arquivo de origem | Descrição | | ------------------------------------------------------------- | --------- | ---------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `OMNIROUTE_CIRCUIT_BREAKER_OAUTH_THRESHOLD` | `8` | `open-sse/config/constants.ts` | Limite de falha consecutiva para provedores OAuth antes do disparo do disjuntor. | | `OMNIROUTE_CIRCUIT_BREAKER_OAUTH_RESET_MS` | `60000` | `open-sse/config/constants.ts` | Janela de redefinição (ms) para o disjuntor do provedor OAuth. | | `OMNIROUTE_CIRCUIT_BREAKER_API_KEY_THRESHOLD` | `12` | `open-sse/config/constants.ts` | Limite de falha consecutiva para provedores de chaves de API. | | `OMNIROUTE_CIRCUIT_BREAKER_API_KEY_RESET_MS` | `30000` | `open-sse/config/constants.ts` | Janela de redefinição (ms) para o disjuntor do provedor de chave de API. | | `OMNIROUTE_CIRCUIT_BREAKER_LOCAL_THRESHOLD` | `2` | `open-sse/config/constants.ts` | Limite de falha consecutiva para provedores locais (Ollama, LM Studio, ...). | | `OMNIROUTE_CIRCUIT_BREAKER_LOCAL_RESET_MS` | `15000` | `open-sse/config/constants.ts` | Janela de reset (ms) para disjuntor do provedor local. | | `OMNIROUTE_PROVIDER_BREAKER_OAUTH_FAILURE_THRESHOLD` | `10` | `open-sse/config/constants.ts` | Disjuntor no nível do provedor: falhas na janela antes que todo o provedor OAuth entre em resfriamento. | | `OMNIROUTE_PROVIDER_BREAKER_OAUTH_FAILURE_WINDOW_MS` | `900000` | `open-sse/config/constants.ts` | Disjuntor em nível de provedor: janela contínua de contagem de falhas (ms) para provedores OAuth. | | `OMNIROUTE_PROVIDER_BREAKER_OAUTH_COOLDOWN_MS` | `300000` | `open-sse/config/constants.ts` | Disjuntor no nível do provedor: resfriamento (ms) quando o limite do provedor OAuth é atingido. | | `OMNIROUTE_PROVIDER_BREAKER_OAUTH_DEGRADATION_THRESHOLD` | `5` | `open-sse/config/constants.ts` | O provedor OAuth entra DEGRADED com tantas falhas. | | `OMNIROUTE_PROVIDER_BREAKER_OAUTH_MAX_BACKOFF_MULTIPLIER` | `8` | `open-sse/config/constants.ts` | multiplicador de escalonamento máximo resetTimeout do provedor OAuth. | | `OMNIROUTE_PROVIDER_BREAKER_OAUTH_BACKOFF_ESCALATION_COUNT` | `2` | `open-sse/config/constants.ts` | O provedor OAuth aumenta após tantos ciclos abertos. | | `OMNIROUTE_PROVIDER_BREAKER_API_KEY_FAILURE_THRESHOLD` | `15` | `open-sse/config/constants.ts` | Disjuntor no nível do provedor: falhas na janela antes que todo o provedor de chave de API entre em resfriamento. | | `OMNIROUTE_PROVIDER_BREAKER_API_KEY_FAILURE_WINDOW_MS` | `1800000` | `open-sse/config/constants.ts` | Disjuntor em nível de provedor: janela contínua de contagem de falhas (ms) para provedores de chave de API. | | `OMNIROUTE_PROVIDER_BREAKER_API_KEY_COOLDOWN_MS` | `600000` | `open-sse/config/constants.ts` | Disjuntor no nível do provedor: resfriamento (ms) quando o limite do provedor da chave de API é atingido. | | `OMNIROUTE_PROVIDER_BREAKER_API_KEY_DEGRADATION_THRESHOLD` | `7` | `open-sse/config/constants.ts` | O provedor de chave de API entra no DEGRADED com tantas falhas. | | `OMNIROUTE_PROVIDER_BREAKER_API_KEY_MAX_BACKOFF_MULTIPLIER` | `4` | `open-sse/config/constants.ts` | Multiplicador de escalação max resetTimeout do provedor de chave de API. | | `OMNIROUTE_PROVIDER_BREAKER_API_KEY_BACKOFF_ESCALATION_COUNT` | `3` | `open-sse/config/constants.ts` | O provedor de chave de API aumenta após tantos ciclos abertos. | | `OMNIROUTE_PROVIDER_BREAKER_LOCAL_FAILURE_THRESHOLD` | `2` | `open-sse/config/constants.ts` | Disjuntor no nível do provedor: falhas antes que todo o provedor local entre em resfriamento. | | `OMNIROUTE_PROVIDER_BREAKER_LOCAL_FAILURE_WINDOW_MS` | `300000` | `open-sse/config/constants.ts` | Disjuntor em nível de provedor: janela contínua de contagem de falhas (ms) para provedores locais. | | `OMNIROUTE_PROVIDER_BREAKER_LOCAL_COOLDOWN_MS` | `60000` | `open-sse/config/constants.ts` | Disjuntor no nível do provedor: resfriamento (ms) quando o limite do provedor local é atingido. | | `OMNIROUTE_API_KEY_COOLDOWN_MS` | `60000` | `open-sse/services/apiKeyRotator.ts` | Resfriamento por chave (ms) aplicado pela rotação de chave de API multichave quando um upstream 429 não carrega `Retry-After` (#14573). Valores não positivos ou não numéricos voltam ao padrão. | | `OMNIROUTE_AVALANCHE_PROTECTION_ENABLED` | `false` | `open-sse/services/accountFallback/antiAvalanche.ts` | Proteção anti-avalanche opcional: apenas um `true` explícito a habilita. Quando ativado, um 429 que nomeia um limite de tokens por minuto (e um estouro de contexto 400) interrompe o failover em cascata nas chaves restantes do provedor. Um 429 com cota esgotada continua fazendo failover, por maior que seja o prompt, e HTTP 413 não é afetado (ele mantém o comportamento de nova tentativa #13350 em outra conta). | | `OMNIROUTE_AVALANCHE_BURST_COOLDOWN_MS` | `60000` | `open-sse/services/accountFallback/antiAvalanche.ts` | Recarga de bloqueio de modelo (ms) aplicada quando o guarda dispara, em vez do bloqueio crescente. Uma redefinição upstream mais longa sempre vence. Valores não positivos ou não numéricos voltam ao padrão. | | `PIN_DROP_BACKOFF_LEVEL` | `2` | `open-sse/services/combo.ts` | Profundidade de backoff na qual o provedor de um pino de cache de contexto é considerado permanentemente insalubre e o pino é descartado para failover. | | `PIN_DROP_GRACE_MS` | `20000` | `open-sse/services/combo.ts` | Janela anti-flap (ms) que tolera breves resfriamentos transitórios antes de descartar um pino de cache de contexto. | ### Cenários | Cenário | Configuração | | -------------------------------------- | ----------------------------------------------------- | | **Geração de código de longa duração** | `REQUEST_TIMEOUT_MS=900000` (15 min) | | **Duração total do stream vinculada** | `STREAM_ACTIVE_TIMEOUT_MS=1260000` (21 min) | | **Falha rápida para produção API** | `API_BRIDGE_PROXY_TIMEOUT_MS=10000` | | **Modelos de pensamento estendido** | `STREAM_IDLE_TIMEOUT_MS=300000` (5 min entre pedaços) | --- ## 16. Registro O sistema de registro grava em arquivos de log stdout e girados. Toda a configuração é lida por `src/lib/logEnv.ts`. | Variável | Padrão | Descrição | | ----------------------------------------- | -------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `APP_LOG_LEVEL` | `info` | Nível mínimo de log: `debug`, `info`, `warn`, `error`. | | `APP_LOG_FORMAT` | `text` | Formato de saída: `text` (legível por humanos) ou `json` (estruturado). | | `APP_LOG_TO_FILE` | `true` | Grave logs em arquivo junto com stdout. | | `APP_LOG_FILE_PATH` | `logs/application/app.log` | Caminho do arquivo de log (relativo à raiz do projeto ou `DATA_DIR`). | | `APP_LOG_MAX_FILE_SIZE` | `50M` | Tamanho máximo do arquivo antes da rotação. Aceita: `50M`, `1G`, `512K` ou bytes simples. | | `APP_LOG_RETENTION_DAYS` | `7` | Dias para manter os arquivos de log do aplicativo alternados. | | `APP_LOG_MAX_FILES` | `20` | Máximo de backups de arquivos de log girados. | | `CALL_LOG_RETENTION_DAYS` | `7` | Dias para manter as entradas de log request/call no banco de dados. | | `CALL_LOG_MAX_ENTRIES` | `10000` | Máximo de entradas de log de chamadas no buffer da memória. | | `CALL_LOGS_TABLE_MAX_ROWS` | `100000` | Máximo de linhas na tabela `call_logs` SQLite antes da remoção. | | `ENABLE_REQUEST_LOGS` | _(desativado)_ | Forçar a ativação ou desativação do logon de solicitação detalhada, substituindo a configuração do painel. | | `MAX_PENDING_REQUEST_AGE_MS` | `3600000` (1 hora) | Idade máxima para entradas de log de solicitações ativas órfãs antes da limpeza na memória. | | `MAX_PENDING_DETAILS` | `5000` | Máximo de detalhes pendentes (número inteiro positivo); limite de contagem: varredura; tampas byte/map : inserir. | | `CALL_LOG_PIPELINE_CAPTURE_STREAM_CHUNKS` | `false` | Armazene pedaços de fluxo em artefatos de pipeline quando `call_log_pipeline_enabled=true`. Ative (`true`) — desativado por padrão para salvar o disco. | | `CALL_LOG_PIPELINE_MAX_SIZE_KB` | `512` | Tamanho máximo do artefato do log de chamadas do pipeline em KB quando `call_log_pipeline_enabled=true`. | | `PROXY_LOGS_TABLE_MAX_ROWS` | `100000` | Máximo de linhas na tabela `proxy_logs` SQLite antes da remoção. | | `PROXY_LOG_INCLUDE_IPS` | `false` | Inclua client/egress IPs e prefixos de conta nos logs do console `[ProxyEgress]`. Os registros de proxy-log dashboard/database retêm detalhes completos. | | `PROXY_LOG_FIRST_CHUNK_TIMING` | `false` | Defina como `"true"` ou `"1"` para registrar `first_chunk_ms` (enviar início para o primeiro byte útil do corpo) nas linhas de log do proxy. Envolve cada corpo upstream em um fluxo de passagem lento e corrige a linha assim que o byte chega; desativado por padrão para que as respostas passem intactas. | | `APP_LOG_ROTATION_CHECK_INTERVAL_MS` | `60000` (1 min) | Com que frequência `src/lib/logRotation.ts` verifica novamente o tamanho do arquivo de log ativo. | | `CHAT_LOG_TEXT_LIMIT` | `65536` | Comprimento máximo da string retido nos artefatos de log de bate-papo (padrão 64 KB). | | `CHAT_LOG_ARRAY_TAIL_ITEMS` | `128` | Número de itens da matriz retidos da parte final ao truncar cargas de log de bate-papo. | | `CHAT_LOG_MAX_DEPTH` | `6` | Profundidade máxima de aninhamento antes que as cargas do log de bate-papo sejam truncadas. | | `CHAT_LOG_MAX_OBJECT_KEYS` | `80` | Máximo de chaves de objeto retidas em cargas úteis de log de bate-papo (0 = ilimitado). | | `CHAT_LOG_MAX_BODY_KB` | `1024` | Tamanho inteiro do corpo request/response (KB) antes de ser substituído por um resumo simples em vez do clone completo. Aumente isso se longas conversas de agente mostrarem um espaço reservado em vez das mensagens reais no painel. | | `CHAT_DEBUG_FILE` | `false` | Quando verdadeiro, `serializeArtifactForStorage` ignora o truncamento baseado em tamanho. Somente depuração. | --- ## 17. Otimização de memória | Variável | Padrão | Descrição | | -------------------------------------------- | -------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `OMNIROUTE_HEAP_DIAGNOSTICS_ENABLED` | `0` (desligado) | Configure `1` para registrar métricas de pressão de heap V8 de `src/lib/healthzLag.ts`. Tamanhos de log e contagem em andamento, nunca solicite conteúdo, rastreamentos ou instantâneos de heap. É executado dentro do gravador de loop de eventos, então `OMNIROUTE_EVENT_LOOP_STALL_THRESHOLD_MS=0` também o desativa. | | `OMNIROUTE_HEAP_DIAGNOSTICS_THRESHOLD_MB` | `900` | Limite positivo para heapUsed (MiB) que aciona um log de diagnóstico opcional. Valores inválidos usam 900 MiB; mensagens de alto heap são limitadas a uma vez a cada 60 segundos. | | `OMNIROUTE_MEMORY_MB` | _auto_ (metal puro);**`1024` na imagem Docker** | **Recomendado** limite de heap Docker/standalone V8 (MB). Quando não definido, calibrado dinamicamente (~ 35% do sistema RAM, fixado em `[512, 4096]`); `512` é apenas o piso quando a memória total não pode ser lida. Em `run-standalone.mjs` (Docker CMD), um** explícito** o valor é anexado como `--max-old-space-size` e** vence** sobre um sinalizador de heap NODE_OPTIONS conflitante (último sinalizador V8). `omniroute serve` ainda prefere um heap NODE_OPTIONS existente (#5238). Não defina ambos com números diferentes — o processo registra um aviso nomeando os valores e o vencedor.** A imagem oficial Docker sempre define `1024`, então a calibração nunca é executada lá.** O agente de codificação `/v1/responses` precisa `8192`–`12288` mais cgroup headroom — consulte [Docker Guide — runtime RAM](../guides/DOCKER_GUIDE.md#runtime-ram-for-coding-agents). | | `OMNIROUTE_RSS_PRESSURE_MB` | _auto_ (`max(3072, 2 × OMNIROUTE_MEMORY_MB)`; desativado quando `OMNIROUTE_MEMORY_MB` não está definido) | `open-sse/utils/resourcePressure.ts` | Fusível RSS de processo absoluto (MB) para memória native/external que o V8 `heapUsed` não pode ver; acima dele, novas solicitações recebem 503 `resource_pressure`. RSS raramente cai após um pico, então combine-o com `OMNIROUTE_PRESSURE_SELF_RESTART`. | | `PROMPT_CACHE_MAX_SIZE` | `50` | Máximo de entradas de prompt do sistema em cache. | | `PROMPT_CACHE_MAX_BYTES` | `2097152` (2 MB) | Tamanho total máximo do cache de prompt. | | `PROMPT_CACHE_TTL_MS` | `300000` (5 min) | Solicita entrada de cache TTL. | | `SEMANTIC_CACHE_MAX_SIZE` | `100` | Temperatura máxima em cache = 0 respostas. | | `SEMANTIC_CACHE_MAX_BYTES` | `4194304` (4 MB) | Tamanho máximo total do cache semântico. | | `SEMANTIC_CACHE_TTL_MS` | `1800000` (30 min) | Entrada de cache semântico TTL. | | `OMNIROUTE_SEMANTIC_CACHE_PRUNE_INTERVAL_MS` | `1800000` (30 min) | intervalo de poda SQLite. `0` desativa inicialização e execuções periódicas; outros valores abaixo de `60000` voltam ao padrão. Valores acima de `2147483647` ms limitam o atraso máximo do temporizador do Node, evitando overflow para polling de 1ms. Primeira corrida após 1s; os temporizadores não são controlados e as execuções nunca se sobrepõem. | | `OMNIROUTE_SEMANTIC_CACHE_PRUNE_BATCH_SIZE` | `2000` | Linhas por SQLite podam DELETE, fixadas em `[100, 50000]`; produz o loop de eventos entre lotes. | | `OMNIROUTE_SEMANTIC_CACHE_PRUNE_MAX_BATCHES` | `50` | Orçamento em lote DELETE compartilhado por execução durante a expiração e passes de limite de linha opcionais, fixados em `[1, 10000]`. Os backlogs continuam em execuções posteriores. | | `OMNIROUTE_SEMANTIC_CACHE_MAX_ROWS` | `0` | Limite de linha SQLite opcional (`0` = none). Depois de excluir `expires_at <=` o carimbo de data/hora ISO de início de execução, remova `created_at` mais antigo e, em seguida, `rowid`, incluindo linhas ativas, sujeito ao orçamento de lote compartilhado. As contagens são truncadas para números inteiros (até o limite de números inteiros seguros). Valores vazios, não numéricos, não finitos ou negativos para todas as quatro variáveis de remoção retornam aos seus padrões; frações arredondadas para baixo. A remoção não altera o comportamento de TTL, memória LRU ou cache vetorial. | | `OMNIROUTE_CORPUS_CACHE_SIZE` | `5` | Raízes de corpus local que mantêm um índice ativo na memória de uma só vez (`src/lib/localCorpus/configured.ts`). LRU: no limite, o índice da raiz usado menos recentemente é removido e reconstruído em sua próxima consulta. Fixado a um mínimo de `1`; um valor não numérico retorna ao padrão. | | `STREAM_HISTORY_MAX` | `50` | Máximo de eventos de transmissão recentes no buffer de visualização ao vivo do Dashboard. | | `CONTEXT_LENGTH_DEFAULT` | _(desativado)_ | Substituição global do comprimento do contexto (tokens) para cada provedor que não possui variável `CONTEXT_LENGTH_`. Quando definido,** substitui** o catálogo, a substituição do painel e os valores de registro desses provedores; quando não definido, OmniRoute usa sua cadeia integrada, cujo último recurso é `128000`. Consulte [Comprimento do contexto por provedor](#per-provider-context-length-context_length_provider). | | `USAGE_TOKEN_BUFFER` | `100` | Espaço extra de token reservado ao rastrear cotas de uso. | ### Comprimento do contexto por provedor (`CONTEXT_LENGTH_`) `open-sse/services/contextManager.ts` (`getEnvOverride()` / `resolveTokenLimit()`) também lê um** por provedor** formulário cujo nome é construído a partir do provedor ID em tempo de execução, portanto, não pode ser listado linha por linha na tabela acima ou em `.env.example`. **Nome.** `CONTEXT_LENGTH_`, onde `` é o provedor ID maiúsculo, com todos os caracteres fora de `A-Z` / `0-9` substituídos por `_`. O provedor ID é o canônico após a resolução do alias (a parte `provider` de uma string `provider/model` depois que um alias curto foi resolvido). Nós personalizados compatíveis com OpenAI ou Anthropic usam seu nó gerado ID, portanto, UUID faz parte do nome da variável. O valor é um número inteiro positivo de tokens; qualquer outra coisa (vazia, `0`, negativa, não numérica) é ignorada e a resolução passa para a próxima etapa. | Provedor ID | Nome da variável | | ----------------------------------------------------------- | -------------------------------------------------------------------------- | | agente roteador | CONTEXT_LENGTH_AGENTROUTER | | roteador aberto | CONTEXT_LENGTH_OPENROUTER | | openai-compatible-chat-0f8e2c1a-5b7d-4e3f-9a6c-2d1b8e4f7a90 | CONTEXT_LENGTH_OPENAI_COMPATIBLE_CHAT_0F8E2C1A_5B7D_4E3F_9A6C_2D1B8E4F7A90 | **Precedência.** Para um par `provider/model`, a primeira etapa que produz um valor vence: 1. `CONTEXT_LENGTH_` para esse provedor. 2. `CONTEXT_LENGTH_DEFAULT` (substituição do ambiente global). 3. A janela por modelo: uma substituição de contexto persistente (definida no painel ou fixada automaticamente pelo reconciliador de descoberta, consulte `CONTEXT_WINDOW_RECONCILE_INTERVAL`), caso contrário, o valor sincronizado catalog / models.dev. 4. O registro do provedor `defaultContextLength`. 5. Heurística de nome de modelo (`claude` 200000, `gemini` 1000000, `gpt` / `o1` / `o3` / `o4` / `codex` 400000). 6. Padrões integrados por provedor e, em seguida, `128000`. Ambas as etapas ambientais se aplicam ao** provedor inteiro** : cada modelo desse provedor obtém o mesmo limite e vence substituições de painel por modelo. Quando apenas um modelo de um provedor precisar de uma janela diferente, use uma substituição por modelo no painel. **Escopo.** Essa cadeia impulsiona a verificação da janela de contexto no momento da solicitação (a rejeição `context_length_exceeded` / "A entrada excede a janela de contexto" em `open-sse/handlers/chatCore.ts`), orçamentos de compactação imediata e limites de contexto combinados. O `context_length` anunciado pelo `GET /v1/models` ainda pode vir de metadados de catálogo ou registro e não há garantia de que reflita a substituição do ambiente. **Exemplo.** Um provedor cujo modelo aceita uma janela de 1.050.000 tokens enquanto o catálogo informa 128.000: ```dotenv CONTEXT_LENGTH_AGENTROUTER=1050000 ``` Reinicie o servidor após alterá-lo: o valor é lido no ambiente de processo do servidor. No** aplicativo de desktop** o servidor é executado como um processo filho e não vê uma variável de sistema definida após o lançamento do aplicativo; coloque a linha no arquivo `.env` que o aplicativo carrega (ordem de pesquisa em [Electron Guide: Environment file lookup](../guides/ELECTRON_GUIDE.md#environment-file-lookup) ), feche completamente e reinicie o aplicativo. ### Compressão | Variável | Padrão | Descrição | | ------------------------------------- | -------- | -------------------------------------------------------------------------------------------------------------------- | | `OMNIROUTE_RTK_TRUST_PROJECT_FILTERS` | desarmar | Confie no projeto `.rtk/filters.json` sem um hash `.rtk/trust.json`. Use apenas em desenvolvimento local controlado. | ### Mecanismo de Memória (plano 21) ### Custo do loop de eventos de memória, habilidades e atualização de token (#10349) OmniRoute é um** processo de nó único** . Memória extraction/retrieval, injeção de habilidades e atualização de token do provedor são executadas nesse** mesmo loop de eventos** como `GET /healthz` e o painel. Eles não são um thread de trabalho. | Trabalhar | Código | Padrão | Controle do operador | | ------------------------------- | ---------------------------------- | -------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------- | | Extração/recuperação de memória | `src/lib/memory/` | Painel**memoryEnabled** (padrão ativado) | Desligar** Configurações → Memória** . Não há nenhum interruptor de eliminação de ambiente separado além de desabilitar o recurso nas configurações. | | Injeção de habilidades | `src/lib/skills/injection.ts` | Painel**skillsEnabled** (padrão ativado) | Desligar** Configurações → Memory/Skills** (`skillsEnabled`). Os botões sandbox abaixo apenas da execução vinculada após a injeção já estar ativada. | | Atualização de token | `src/sse/services/tokenRefresh.ts` | Ativado para provedores OAuth/web conectados | Desconecte o provedor ou deixe os tokens permanecerem válidos; não há ambiente `TOKEN_REFRESH=0` hoje. | Se `/healthz` estiver lento em uma caixa silenciosa, primeiro desative as habilidades de memória + e, em seguida, verifique a carga catalog/compression (#10303, #9685). Esses recursos rendem pontos `await`, mas ainda competem por um thread. Incorporação de camada, armazenamento de vetor e botões de reclassificação para o subsistema de memória persistente (`src/lib/memory/`). | Variável | Padrão | Descrição | | ------------------------------------ | --------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `MEMORY_EMBEDDING_CACHE_TTL_MS` | `300000` (5 min) | TTL para o cache de incorporação na memória (por assinatura source/model/dim ). | | `MEMORY_EMBEDDING_CACHE_MAX` | `1000` | Máximo de entradas LRU mantidas no cache de incorporação. | | `MEMORY_TRANSFORMERS_MODEL` | `Xenova/all-MiniLM-L6-v2` | ID do repositório HF para o pipeline MiniLM local `@huggingface/transformers` opcional (~ 23 MB int8, ~ 400 MB RAM). | | `MEMORY_STATIC_MODEL` | `minishlab/potion-base-8M` | ID do repositório HF para o incorporador da tabela de pesquisa potion/Model2Vec estática. Baixado lentamente no diretório de cache. | | `MEMORY_STATIC_CACHE_DIR` | `/embeddings` | Diretório usado para armazenar em cache os arquivos do modelo de poção estática. O padrão é `DATA_DIR` quando não definido. | | `HF_HUB_ENDPOINT` | `https://huggingface.co` | Substituir URL base do Hugging Face Hub usado pelo `staticPotion.ts` (por exemplo, ponto final do espelho para configurações com espaço aéreo). | | `MEMORY_VEC_TOP_K` | `20` | Top-K padrão usado pela pesquisa de vetor de força bruta `sqlite-vec` dentro de `src/lib/memory/vectorStore.ts`. | | `MEMORY_RRF_K` | `60` | Constante de fusão de classificação recíproca `k` para recuperação de vetor híbrido FTS5 + (receita sqlite-vec). | | `VECTOR_STORE_DISABLE_VEC` | `false` | costura Test/diagnostic em `getVectorStore()` (`src/lib/memory/vectorStore.ts`): quando `true`, força o armazenamento de vetores para `null` (simula um ambiente cloud/WASM sem `sqlite-vec`), degradando a recuperação de memória para pesquisa de palavra-chave FTS5. Deixe sem definição na produção. | | `NOTION_API_KEY` | _(desativado)_ | Chave API para back-end Notion (usada pela predefinição de back-end conhecida `genericBackend.ts` ). | | `NOTION_API_URL` | `https://api.notion.com/v1` | Base URL para Notion API (pode substituir alternativas Notion auto-hospedadas). | | `OBSIDIAN_API_KEY` | _(desativado)_ | Chave API para back-end Obsidian Vault (usada pela predefinição de back-end conhecida `genericBackend.ts` ). | | `OBSIDIAN_API_URL` | `http://localhost:27123` | Base URL para Obsidian Vault API (pode substituir para vault remoto). | | `MEMORY_TYPED_DECAY_ENABLED` | `false` | Chave mestre de decaimento de memória digitada TV6.** Ativar (padrão desativado)** — a varredura** exclui** memórias deterioradas. Com ele desligado, `access_count`/`last_accessed_at` são pura telemetria e nada é excluído. | | `MEMORY_TYPED_DECAY_EPISODIC_DAYS` | `30` | TTL (dias) após o qual uma memória `episodic` não utilizada decai. `0` também torna imune episódico. Tipos duráveis (`factual`/`procedural`/`semantic`) são sempre imunes. O relógio de decaimento é baseado novamente em `last_accessed_at`. | | `MEMORY_TYPED_DECAY_ACCESS_IMMUNITY` | `3` | Uma memória injetada `>=` muitas vezes torna-se imune à deterioração, independentemente do tipo. `0` desativa a imunidade de acesso. | | `MEMORY_TYPED_DECAY_SWEEP_INTERVAL` | `0` (desativado) | Intervalo (segundos) para a varredura de decaimento periódica opcional em `src/lib/memory/typedDecay.ts`. `0`/unset = sem varredura periódica. Aceitação dupla: também requer `MEMORY_TYPED_DECAY_ENABLED=true`. | | `OMNIROUTE_STRICT_SYSTEM_PROVIDERS` | _(desativado)_ | IDs de provedores separados por vírgula (sem distinção entre maiúsculas e minúsculas) que aceitam uma mensagem `system`** somente no índice 0** (`src/lib/memory/injection.ts`). Para estes, a emenda de memória intermediária segura em cache não é segura em conversas multivoltas, portanto, a memória é merged/prepended como a principal mensagem do sistema. O padrão é apenas `xiaomi-mimo`/`mimo`; estender para endpoints auto-hospedados compatíveis com OpenAI (por exemplo, Qwen3.5 +/3.6) cujo modelo de bate-papo impõe a mesma restrição de mensagem de sistema líder único. | ### Exemplo Docker com pouca RAM `128` é apenas para painel. Agentes de codificação neste heap `FATAL ERROR` durante longo `/v1/responses`. Não use este exemplo como gateway Claude/Codex/Grok. ```bash OMNIROUTE_MEMORY_MB=128 PROMPT_CACHE_MAX_SIZE=20 PROMPT_CACHE_MAX_BYTES=524288 # 512 KB SEMANTIC_CACHE_MAX_SIZE=25 SEMANTIC_CACHE_MAX_BYTES=1048576 # 1 MB STREAM_HISTORY_MAX=10 ``` --- ## 18. Sincronização de preços Sincronização automática de dados de preços de modelos de fontes externas. | Variável | Padrão | Arquivo de origem | Descrição | | ----------------------- | ------------- | ------------------------ | ------------------------------------------ | | `PRICING_SYNC_ENABLED` | `false` | `src/lib/pricingSync.ts` | Ative a sincronização periódica de preços. | | `PRICING_SYNC_INTERVAL` | `86400` (24h) | `src/lib/pricingSync.ts` | Intervalo de sincronização em segundos. | | `PRICING_SYNC_SOURCES` | `litellm` | `src/lib/pricingSync.ts` | Fontes de dados separadas por vírgula. | --- ## Arena ELO Sincronização | Variável | Padrão | Arquivo de origem | Descrição | | ---------------------------- | ------------- | ------------------------------------------------------------------------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `ARENA_ELO_SYNC_ENABLED` | `true` | `src/shared/constants/featureFlagDefinitions.ts` | Sincronização periódica ELO do placar de líderes do Arena AI, configurável nos sinalizadores de recurso do painel ou com `false` para cancelar. | | `MODELS_CATALOG_PREFIX_MODE` | `dual` | `src/shared/constants/featureFlagDefinitions.ts`, `src/app/api/v1/models/catalog.ts` | Formulário de prefixo usado para IDs de modelo em `GET /v1/models`. `dual` anuncia o prefixo de alias curto e o prefixo de provedor canônico para cada modelo (a compatibilidade com versões anteriores — praticamente dobra o catálogo); `alias` emite um ID por modelo; `canonical` emite apenas o prefixo completo do ID do provedor (provedores cujo alias já é o ID canônico mantêm sua entrada única). Os clientes podem substituir por solicitação com `?prefix=alias`. Veja [API_REFERENCE](API_REFERENCE.md#model-id-prefixes-prefix). | | `ARENA_ELO_SYNC_INTERVAL` | `86400` (24h) | `src/lib/arenaEloSync.ts` | Intervalo de sincronização em segundos. | --- ## Provedor de playground PromptQL (Unofficial/Experimental) Ponte de sessão GraphQL com engenharia reversa para prompt.ql.app (`src/shared/constants/providers/web-cookie.ts`). Todos os padrões opcionais — apontam para os endpoints do playground público; substituir apenas para uma implantação self-hosted/alternate PromptQL. | Variável | Padrão | Arquivo de origem | Descrição | | ---------------------------- | ------------------------------------------------------------------ | ----------------------------------------------------------------------- | ----------------------------------------------------------------------- | | `PROMPTQL_GRAPHQL_ENDPOINT` | `https://data.prompt.ql.app/promptql/playground-v2-hge/v1/graphql` | `open-sse/executors/promptql.ts` | Endpoint GraphQL usado para operações chat/session. | | `PROMPTQL_CREDITS_ENDPOINT` | `https://data.pro.ql.app/v1/graphql` | `open-sse/executors/promptql.ts`, `open-sse/services/usage/promptql.ts` | Endpoint GraphQL usado para consultar crédito balance/usage. | | `PROMPTQL_TOKEN_REFRESH_URL` | `https://auth.pro.ql.app/ddn/project/token` | `open-sse/executors/promptql.ts` | Endpoint usado para atualização de token de melhor esforço. | | `PROMPTQL_POLL_TIMEOUT_MS` | `180000` | `open-sse/executors/promptql.ts` | Tempo máximo (ms) para pesquisar `thread_events` antes do tempo limite. | --- ## Provedor da Web HyperAgent (Unofficial/Experimental) Ponte de sessão com engenharia reversa para hyperagent.com (`src/shared/constants/providers/web-cookie.ts`). Opcional — os pontos padrão no terminal billing/usage público; substituir apenas para uma implantação self-hosted/alternate HyperAgent. | Variável | Padrão | Arquivo de origem | Descrição | | ---------------------- | --------------------------------------------------- | --------------------------------------- | ----------------------------------------------------------- | | `HYPERAGENT_USAGE_URL` | `https://hyperagent.com/api/settings/billing/usage` | `open-sse/services/usage/hyperagent.ts` | Endpoint usado para buscar blocos de crédito billing/usage. | --- ## Política de orçamento de uso sem preço | Variável | Padrão | Arquivo de origem | Descrição | | ------------------------------ | ----------------------------------------------------------------------------------------- | ---------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `UNPRICED_USAGE_BUDGET_POLICY` | _(desativado; falha no fechamento, a menos que a desativação booleana esteja habilitada)_ | `src/shared/utils/featureFlags.ts` | Limites daily/weekly USD por chave: `fail_closed` bloqueia uso genuinamente sem preço; `count_as_zero` conta como $ 0 enquanto impõe gastos com preço. Um enum explícito (DB antes de env) substitui a desativação booleana. Valores inválidos e falhas na pesquisa de preços falham no fechamento. | | `USAGE_LIMIT_IGNORE_UNPRICED` | `false` | `src/shared/utils/featureFlags.ts` | Desativação de compatibilidade booleana upstream: conta o uso genuinamente sem preço como US$ 0 somente quando nenhuma política de enumeração explícita for configurada. Os gastos precificados e as pesquisas com falha permanecem aplicados. | ## Cotas de uso de código Kilo Saldo USD pessoal e pesquisa de uso do Kilo Pass para o provedor Kilo Code. Opcional — o padrão aponta para o Kilo API público; substituir apenas para um acessório relay/test. A autenticação usa o token de acesso OAuth existente da conexão. | Variável | Padrão | Arquivo de origem | Descrição | | -------------- | --------------------- | ------------------------------------- | ------------------------------------------------------------------------- | | `KILO_API_URL` | `https://api.kilo.ai` | `open-sse/services/usage/kilocode.ts` | Base URL usada para buscar saldo pessoal do Kilo Code e uso do Kilo Pass. | --- ## Provedor Web Adobe Firefly (Unofficial/Experimental) Atualização de sessão orientada por navegador para o provedor da Web Adobe Firefly (`open-sse/services/adobeFireflyBrowserLogin.ts`, `open-sse/services/adobeFireflySession.ts`, `open-sse/services/adobeFireflyClient.ts`). Opcional — todos os padrões são ajustados para uma instalação normal em desktop. > **Removido em #9255.** O antigo tempo de execução do Chrome anexado ao CDP (adobeFireflyChromeRuntime.ts) foi substituído por um serviço de login do navegador Playwright e seus botões não existem mais. As variáveis ADOBE_FIREFLY_CHROME_ CDP_PORT / VISIBLE / HEADED / PING / FORCE_RESTART, mais ADOBE_FIREFLY_LOGIN_WAIT_MS e ADOBE_FIREFLY_FORTER_WAIT_MS, não são lidas em nenhum lugar da base de código — defini-las não tem efeito. | Variável | Padrão | Arquivo de origem | Descrição | | ------------------------------------ | -------------- | ----------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------- | | `ADOBE_FIREFLY_CHROME_HEADLESS` | `0` | `open-sse/services/adobeFireflyBrowserLogin.ts` | Defina como `1` para Chrome sem cabeça verdadeiro (quebrado para geração; somente depuração). | | `ADOBE_FIREFLY_BROWSER_REFRESH` | `1` | `open-sse/services/adobeFireflySession.ts` | Aquecimento proativo do navegador opt-in/out. `0` desativa o aquecimento proativo (a recuperação 408 no meio do lote ainda se aplica). | | `ADOBE_FIREFLY_SESSION_DISK` | `1` | `open-sse/services/adobeFireflySession.ts` | Defina como `0` para desativar a persistência da sessão do Adobe Firefly no disco. | | `ADOBE_FIREFLY_MIN_SUBMIT_GAP_MS` | _(desativado)_ | `open-sse/services/adobeFireflySession.ts` | Intervalo mínimo (ms) aplicado entre envios sucessivos, substituindo o padrão integrado. | | `ADOBE_FIREFLY_BATCH_EXTRA_GAP_MS` | _(desativado)_ | `open-sse/services/adobeFireflySession.ts` | Lacuna extra (ms) adicionada após um lote bem-sucedido, substituindo o padrão integrado. | | `ADOBE_FIREFLY_SUBMIT_BASE_DELAY_MS` | _(desativado)_ | `open-sse/services/adobeFireflyClient.ts` | Atraso base (ms) antes de enviar uma solicitação de geração, substituindo o padrão integrado. | --- ## 19. Sincronização de modelo (desenvolvimento) | Variável | Padrão | Arquivo de origem | Descrição | | ----------------------------------- | -------------- | ---------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `MODELS_DEV_SYNC_ENABLED` | _(desativado)_ | `src/lib/modelsDevSync.ts` | Substituição forçada para sincronização de preços models.dev. Desdefinir = honor Configurações > AI (`modelsDevSyncEnabled`). `0`/`false`/`off`/`no`** vence o DB** e ignora a sincronização periódica e as varreduras `getModelsDevPricing()` SQL/JSON (recuperação quando o painel está preso no mesmo loop de eventos). `1`/`true`/`on`/`yes` força a sincronização. O preço save/clear ainda chama `backupDbFile("pre-write")`, que não funciona sob o acelerador de 60 minutos ou `DISABLE_SQLITE_AUTO_BACKUP`. | | `MODELS_DEV_SYNC_INTERVAL` | `86400` (24h) | `src/lib/modelsDevSync.ts` | Intervalo de sincronização do catálogo do modelo em tempo de desenvolvimento em segundos. | | `CONTEXT_WINDOW_RECONCILE_INTERVAL` | `86400` (24h) | `src/lib/contextWindowResolver.ts` | Intervalo (segundos) para o reconciliador de janela de contexto autocorretivo (5004): fixa janelas declaradas pelo provedor da descoberta `/models` como substituições `auto:discovery` quando elas divergem do catálogo. Defina como `0` para desativar. Reutiliza dados já sincronizados (sem nova busca); nunca substitui substituições `manual`. | --- ## 20. Configurações específicas do provedor | Variável | Padrão | Arquivo de origem | Descrição | | ---------------------------------------------- | -------------------------------------- | ---------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | `OPENROUTER_CATALOG_TTL_MS` | `86400000` (24h) | `src/lib/catalog/openrouterCatalog.ts` | cache de catálogo de modelos OpenRouter TTL. | | `MODEL_CATALOG_INCLUDE_NAMES` | `true` | `src/shared/constants/featureFlagDefinitions.ts` | Inclua campos `name` de fácil exibição nas respostas `/v1/models`. Desative para clientes que esperam apenas IDs. | | `OMNIROUTE_GEMINI_WEB_ARGON_ENABLED` | `0` (desligado) | `open-sse/config/providers/registry/gemini/web/index.ts` | Aceitar (#16573). Configure `1` (ou `true`/`yes`) para anunciar `gweb/gemini-4-argon` no provedor da Web Gemini e deixe seu executor selecionar esse modo. Desativado por padrão porque os seletores de menu do modo Argon não foram verificados em uma conta da Web Gemini ativa; enquanto desativado, o modelo não é listado e uma solicitação é rejeitada como um modelo desconhecido, como antes. Leia na inicialização, portanto, uma alteração precisa ser reiniciada. | | `CATALOG_BUILD_TIMEOUT_MS` | `8000` (8s) | `src/app/api/v1/models/catalogCache.ts` | Limite de espera de caminho frio para uma reconstrução de catálogo `GET /v1/models` unida (#12627). No tempo limite, um último 200 válido é servido quando existe. | | `OMNIROUTE_SYNCED_CATALOG_STALE_AFTER_MS` | `2592000000` (30 dias) | `src/lib/db/models/activeSyncedCatalog.ts` | Período após o qual a lista de modelos sincronizados de uma conexão deixa de ser autoritativa para roteamento e falha na abertura do registro (#12849). Linhas sem carimbo de data e hora contam como obsoletas. | | `OMNIROUTE_ANALYTICS_CACHE_TTL_MS` | `60000` (anos 60) | `src/lib/usage/analyticsResponseCache.ts` | Por quanto tempo uma resposta `GET /api/usage/analytics` lenta é reutilizada para a mesma string de consulta (#15629). `0` desativa o cache. | | `OMNIROUTE_ANALYTICS_CACHE_MIN_COMPUTE_MS` | `1000` (1s) | `src/lib/usage/analyticsResponseCache.ts` | Somente as respostas analíticas que demoraram pelo menos esse tempo para serem criadas são armazenadas em cache, portanto, instâncias pequenas sempre veem dados atualizados. | | `OMNIROUTE_CACHE_METRICS_MIN_COMPUTE_MS` | desarmar (desligar) | `src/app/api/cache/route.ts` via `src/lib/usage/analyticsResponseCache.ts` | Aceitar (#16361). Quando definido como um número inteiro não negativo N, a parte do histórico de uso de `GET /api/cache` (tendência + dos totais do cache de prompt) é servida a partir do cache de resposta analítica compartilhada quando levou pelo menos N ms para construir, por janela `trendHours` fixada, para `OMNIROUTE_ANALYTICS_CACHE_TTL_MS` (o histórico pode atrasar até esse TTL; `DELETE /api/cache` o invalida). Histórico = não definido ou inválido lido ao vivo em cada solicitação. | | `NANOBANANA_POLL_TIMEOUT_MS` | `120000` | `open-sse/handlers/imageGeneration.ts` | Máximo de espera pelos trabalhos de geração de imagem NanoBanana. | | `NANOBANANA_POLL_INTERVAL_MS` | `2500` | `open-sse/handlers/imageGeneration.ts` | frequência de pesquisa de trabalho NanoBanana. | | `ADOBE_FIREFLY_SUBMIT_BASE_DELAY_MS` | `8000` | `open-sse/services/adobeFireflyUpscale.ts` | Atraso base para a espera exponencial de envio e nova tentativa de upscale do Adobe Firefly. | | `AWS_REGION` | _(desativado)_ | `src/lib/providers/validation.ts`, `open-sse/handlers/audioSpeech.ts` | Região usada para construir endpoints AWS Bedrock (Kiro, audio). | | `AWS_DEFAULT_REGION` | _(desativado)_ | `src/lib/providers/validation.ts`, `open-sse/handlers/audioSpeech.ts` | Fallback quando `AWS_REGION` não está definido. | | `CLOUDFLARE_ACCOUNT_ID` | _(desativado)_ | `open-sse/executors/cloudflare-ai.ts` | Conta ID para Cloudflare Trabalhadores AI. | | `CLOUDFLARE_PLAYGROUND_CHROME_PATH` | _(desativado)_ | `open-sse/executors/cloudflare-playground.ts` | Caminho binário completo do Chrome para desktop para o executor Cloudflare AI Playground, usado quando a verificação de impressão digital sem cabeça bloqueia o Chromium incluído no Playwright. | | `CODEBUDDY_SYSTEM_PROMPT_MAX_LEN` | ∅ (∞) — _unset = sem comprimento cap_ | `open-sse/executors/codebuddy/shared.ts` | Limite de comprimento opcional para prompts do sistema chamador enviados para CodeBuddy (CN e internacional). Por padrão, apenas um prompt que contém um marcador de identidade do agente de codificação é substituído por um neutro (o filtro de conteúdo do Tencent os rejeita); prompts longos são mantidos. Um número inteiro > 0 também substitui qualquer prompt do sistema com mais de tantos caracteres; unset, `0` ou um valor não inteiro desativa o limite. Cada substituição registra qual regra foi acionada (marcador de identidade ou comprimento). | | `CLOUDFLARE_API_BASE` | `https://api.cloudflare.com/client/v4` | `src/app/api/settings/proxy/cloudflare-deploy/route.ts` | Substitua a base Cloudflare REST API usada pelo implementador de retransmissão do proxy-pool Workers (#4640 / 9router#1360). | | `NEXT_PUBLIC_CLOUDFLARE_RELAY_DEFAULT_PROJECT` | `omniroute-relay` | `src/app/(dashboard)/dashboard/settings/components/proxy/CloudflareRelayModal.tsx` | Nome do projeto de trabalho padrão sugerido no modal "Deploy Relay" do pool de proxy. | | `NEXT_PUBLIC_CLOUDFLARE_RELAY_ENABLED` | `true` | `src/app/(dashboard)/dashboard/settings/components/proxy/ProxyPoolTab.tsx` | Defina como `false` para ocultar a opção de retransmissão de trabalhadores Cloudflare na guia Pool de proxy. | | `CLOUDFLARED_BIN` | detecção automática | `src/lib/cloudflaredTunnel.ts` | Caminho personalizado para o binário `cloudflared`. | | `CLOUDFLARED_PROTOCOL` | `http2` | `src/lib/cloudflaredTunnel.ts` | Protocolo de transporte de túnel: `http2` (padrão), `quic` ou `auto`. | | `CLOUDFLARED_CONFIG` | _(desativado)_ | `src/lib/cloudflaredTunnel.ts` | Caminho para um `config.yml` cloudflared gerenciado localmente (com `tunnel:`, `credentials-file:`, `ingress:`). Quando definido, OmniRoute executa `tunnel --config run` (túnel denominado) em vez de um túnel rápido efêmero. | | `CLOUDFLARED_HOSTNAME` | _(da entrada de configuração)_ | `src/lib/cloudflaredTunnel.ts` | Substituição do nome de host público do túnel nomeado (por exemplo, `ai.example.com`), relatado como `publicUrl`/`apiUrl`. Quando não definido, ele é lido no primeiro nome de host `ingress` da configuração. | | `DENO_DEPLOY_API_BASE` | `https://api.deno.com/v2` | `src/app/api/settings/proxy/deno-deploy/route.ts` | Substitua a base Deno Deploy REST API usada pelo implantador de retransmissão do pool de proxy (#4643 / 9router#1437). | | `NEXT_PUBLIC_DENO_RELAY_DEFAULT_PROJECT` | `omniroute-deno-relay` | `src/app/(dashboard)/dashboard/settings/components/proxy/DenoRelayModal.tsx` | Nome padrão do aplicativo Deno Deploy sugerido no modal "Deploy Relay" do pool de proxy. | | `NEXT_PUBLIC_DENO_RELAY_ENABLED` | `true` | `src/app/(dashboard)/dashboard/settings/components/proxy/ProxyPoolTab.tsx` | Defina como `false` para ocultar a opção de retransmissão Deno Deploy da guia Proxy Pool. | | `SEARCH_CACHE_TTL_MS` | `300000` (5 min) | `open-sse/services/searchCache.ts` | TTL para cache de resposta de pesquisa API (Perplexity, Brave, etc.). | | `ENABLE_CC_COMPATIBLE_PROVIDER` | `false` | `src/shared/utils/featureFlags.ts` | Revele o provedor experimental UI compatível com CC para relés somente de código Claude. | | `NINEROUTER_HOST` | `127.0.0.1` | `open-sse/executors/ninerouter.ts` | Substitua o host onde a instância do 9router integrada escuta. | | `NINEROUTER_PORT` | `20130` | `open-sse/executors/ninerouter.ts` | Substitua a porta onde a instância do 9router integrada escuta. | | `EMBED_WS_PROXY_HOST` | `127.0.0.1` | `src/lib/services/embedWsProxy.ts` | Vincule o host para o proxy WebSocket de serviço integrado (loopback apenas por padrão). | | `EMBED_WS_PROXY_PORT` | `20131` | `src/lib/services/embedWsProxy.ts` | Porta para o servidor proxy WebSocket de serviço integrado. | | `CLIPROXYAPI_HOST` | `127.0.0.1` | `open-sse/executors/cliproxyapi.ts` | host ponte CLIProxyAPI (integração legada). | | `CLIPROXYAPI_PORT` | `5544` | `open-sse/executors/cliproxyapi.ts` | porta da ponte CLIProxyAPI. | | `CLIPROXYAPI_API_KEY` | _(vazio)_ | `open-sse/handlers/chatCore/cliproxyapiCredentials.ts` | Fallback de chave do plano de dados quando a configuração `cliproxyapi_api_key` está ausente. | | `CLIPROXYAPI_MANAGEMENT_KEY` | _(vazio)_ | `src/lib/services/cliproxyAccountHealth.ts` | Chave de gerenciamento para leituras de integridade da conta de uma instância CLIProxyAPI gerenciada externamente. | | `CLIPROXYAPI_CONFIG_DIR` | `~/.cli-proxy-api` | `src/lib/versionManager/processManager.ts` | diretório de configuração CLIProxyAPI. | | `CLIPROXY_BIND_HOST` | `127.0.0.1` | `docker-compose.yml` | A interface do host docker-compose publica o sidecar `cliproxyapi` em (#12578). Seu volume de dados contém credenciais do provedor OAuth/API e a imagem fixada não tem nenhuma substituição `api-keys` do plano de dados baseado em env (apenas um `config.yaml` montado), então `0.0.0.0` expõe um serviço com credencial para todo o LAN. | | `MUX_SERVICE_PORT` | `8322` | `src/lib/services/bootstrap.ts` | Substitua a porta onde o daemon de orquestração do agente Mux (coder/mux) integrado atende (sempre 127.0.0.1). | | `OPENWA_SERVICE_PORT` | `8323` | `src/lib/services/bootstrap.ts` | Substitua a porta onde o daemon open-wa integrado (WhatsApp Web Automation) escuta (sempre 127.0.0.1). | | `DARIO_HOST` | `127.0.0.1` | `open-sse/executors/dario.ts` | Host bind/connect de serviço integrado Dario (loopback apenas por padrão). | | `DARIO_PORT` | `3456` | `open-sse/executors/dario.ts` | Porta de serviço integrado Dario. | | `DARIO_HOST` | `127.0.0.1` | `open-sse/executors/dario.ts` | Host bind/connect de serviço integrado Dario (loopback apenas por padrão). | | `DARIO_PORT` | `3456` | `open-sse/executors/dario.ts` | Porta de serviço integrado Dario. | | `LOCAL_HOSTNAMES` | _(vazio)_ | `open-sse/config/providerRegistry.ts` | Nomes de host adicionais separados por vírgula tratados como "locais" (nomes de serviço Docker, etc.). | `ENABLE_CC_COMPATIBLE_PROVIDER` é apenas para retransmissões de terceiros que aceitam exclusivamente clientes Claude Code. OmniRoute reescreve as solicitações para que esses relés as aceitem. Se você quiser usar apenas o código Claude CLI ou não tiver certeza de quais são esses relés, mantenha-o desativado e adicione um provedor regular compatível com o Anthropic. --- ## 21. Saúde proxy | Variável | Padrão | Arquivo de origem | Descrição | | ------------------------------------------------- | ------------------------ | ------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | `PROXY_FAST_FAIL_TIMEOUT_MS` | `2000` | `src/lib/proxyHealth.ts` | Tempo limite de verificação de integridade de falha rápida. | | `PROXY_LATENCY_WINDOW_HOURS` | `3` | `src/lib/db/proxies.ts` | Janela de tempo (horas) para calcular a latência média dos proxies candidatos na estratégia de pool com otimização de latência. | | `PROXY_HEALTH_CACHE_TTL_MS` | `30000` | `src/lib/proxyHealth.ts` | Cache de resultados da verificação de integridade TTL. | | `NONE_HONORED_WINDOW_HOURS` | `24` | `src/lib/db/reasoningEffortCompliance.ts` | Janela final em horas para o leitor de conformidade reasoning_effort = none em GET /v1/models/health. | | `NONE_HONORED_CACHE_TTL_MS` | `20000` | `src/lib/db/reasoningEffortCompliance.ts` | Armazene TTL em cache em ms para o instantâneo de não conformidade (15-30s). | | `NONE_HONORED_MIN_SAMPLE` | `3` | `src/lib/db/reasoningEffortCompliance.ts` | Mínimo de nenhuma solicitação antes que um modelo seja honrado ou não honrado; abaixo disso, o modelo indica desconhecido. | | `PROXY_HEALTH_UNHEALTHY_CACHE_TTL_MS` | `2000` | `src/lib/proxyHealth.ts` | Cache TTL para sondagens de integridade do proxy com falha. Mantenha isso mais curto que `PROXY_HEALTH_CACHE_TTL_MS` para que os tempos limite de proxy transitórios sob alta simultaneidade tentem novamente rapidamente, sem desabilitar a falha rápida para proxies realmente inativos. | | `PROXY_HEALTH_ENABLED` | `true` | `src/lib/proxyHealth/scheduler.ts` | Configure `false` para desabilitar o agendador de integridade do proxy em segundo plano que sonda periodicamente os proxies registrados. | | `PROXY_HEALTH_INTERVAL_MS` | `600000` | `src/lib/proxyHealth/scheduler.ts` | Intervalo de varredura do agendador de integridade em segundo plano em ms (mínimo `60000`). | | `PROXY_HEALTH_RELAY_INTERVAL_MS` | `21600000` | `src/lib/proxyHealth/relayCadence.ts` | Intervalo de sondagem em ms para proxies de retransmissão de borda (`deno`/`vercel`/`cloudflare`), cujas sondagens ativam um isolado sem servidor cobrado (mínimo `60000`). | | `PROXY_HEALTH_RECOVERY_INTERVAL_MS` | `600000` | `src/lib/proxyHealth/scheduler.ts` | Intervalo de passagem de recuperação em segundo plano em ms: com que frequência os proxies anteriormente não íntegros são testados novamente para que um proxy recuperado retorne à rotação sem reinicialização. Valores abaixo de `60000` voltam ao padrão. | | `PROXY_HEALTH_TEST_URL` | `https://httpbin.org/ip` | `src/lib/proxyHealth/probeTarget.ts` | Destino da sonda de acessibilidade usado pelo planejador e pelo endpoint `/api/settings/proxies/auto-test`. Aponte para um internal/self-hosted URL para evitar o padrão público. | | `PROXY_HEALTH_TEST_CONCURRENCY` | `10` | `src/lib/proxyHealth/probeTarget.ts` | As análises são iniciadas uma vez por lote, compartilhadas pelo agendador e pelo endpoint `/api/settings/proxies/auto-test`. Piso em 1 e limite em 50. | | `PROXY_HEALTH_TEST_STAGGER_MS` | `100` | `src/lib/proxyHealth/probeTarget.ts` | Atraso em ms entre duas partidas de sonda dentro de um lote. Sem ele, todo o lote sai no mesmo momento e uma saída compartilhada IP pode disparar um alvo com taxa limitada. Defina como `0` para desativar o espaçamento; limitado a 5.000. | | `PROXY_HEALTH_USE_PROVIDER_TARGET` | `true` | `src/lib/proxyHealth/providerProbeTarget.ts` | Defina "false" para parar de sondar o host real do provedor atribuído a um proxy (`GET /models`, sem chave API ) e sempre use `PROXY_HEALTH_TEST_URL`. | | `PROXY_HEALTH_AUTO_DEACTIVATE` | `false` | `src/lib/proxyHealth/statusPolicy.ts` | Quando `false` (padrão), testes automatizados de acessibilidade (o agendador + o botão `/api/settings/proxies/auto-test` "Testar tudo") são** somente leitura** e nunca escreva o status de um proxy — apenas o operador define active/inactive, portanto, uma sonda instável não pode prender um proxy atribuído (#6246). Defina `true` para restaurar o comportamento legado de teste e configuração. | | `FLUSH_EMPTY_RETRY_ENABLED` | `false` | `src/shared/utils/featureFlags.ts` | Sinalizador de recurso de aceitação (consulte [FEATURE_FLAGS.md](./FEATURE_FLAGS.md) ; uma substituição DB do painel vence). `true` (ou `1`, `yes`) tenta novamente o streaming traduzido vazio através do caminho de credencial normal (até `STREAM_RECOVERY.EMPTY_TURN_RETRY_MAX` novas tentativas) em vez de expor um 200 vazio ou um 502 de conteúdo vazio. | | `EMPTY_STREAM_SIBLING_RECOVERY_ENABLED` | `false` | `src/shared/utils/featureFlags.ts` | Sinalizador de recurso de aceitação (consulte [FEATURE_FLAGS.md](./FEATURE_FLAGS.md) ; uma substituição DB do painel vence). `true` (ou `1`, `yes`) arma a sonda de conteúdo de fluxo vazio Claude/Codex e gasta a nova tentativa limitada existente em outra conexão elegível após um turno `empty_content`, sem resfriamento ou bloqueio de modelo. | | `STREAM_LATE_OUTPUT_PROBE_ENABLED` | `false` | `src/shared/utils/featureFlags.ts` | Sinalizador de recurso de aceitação (consulte [FEATURE_FLAGS.md](./FEATURE_FLAGS.md) ; uma substituição DB do painel vence). `true` (ou `1`, `yes`) continua amostrando um pedaço encaminhado em 16 após os primeiros 64, de modo que a saída visível tardia ainda marca o fluxo como tendo emitido saída (um único 5xx pós-saída permanece no escopo da solicitação em vez de um bloqueio somente de modelo). | | `PROXY_POOL_EGRESS_OBSERVATION` | `false` | `src/shared/utils/featureFlags.ts` | Sinalizador de recurso de aceitação (consulte [FEATURE_FLAGS.md](./FEATURE_FLAGS.md) ; uma substituição DB do painel vence). `true` (ou `1`, `yes`) mostra a observação de saída do pool somente leitura em um pool de proxy no painel (saída distinta IPs, conexões e o mais visto atrás de um IP nas últimas 24 horas, do log do proxy). Nunca usado para roteamento. | | `PROXY_OPERATOR_EGRESS_ENABLED` | `false` | `src/shared/utils/featureFlags.ts` | Sinalizador de recurso de aceitação (consulte [FEATURE_FLAGS.md](./FEATURE_FLAGS.md) ; uma substituição DB do painel vence). `true` (ou `1`, `yes`) aceita endereços observados datados enviados pelo operador por membro do pool e os mescla com o diário lido para exibição e ordem do pool. | | `PROXY_OPERATOR_EGRESS_WINDOW_HOURS` | `24` | `src/lib/db/proxyOperatorEgress.ts` | Janela de observação em horas para linhas de saída enviadas pelo operador (leitura em cada leitura; não é necessário reiniciar). Limitado a 1..168; fora do intervalo, não numérico ou vazio volta para 24 com um único aviso em todo o processo, nunca um lançamento. | | `PROXY_AUTO_REMOVE` | `false` | `src/lib/proxyHealth/scheduler.ts` | Defina `true` para permitir que o agendador remova automaticamente os proxies após repetidas falhas consecutivas. | | `PROXY_AUTO_REMOVE_AFTER` | `3` | `src/lib/proxyHealth/scheduler.ts` | Falhas consecutivas antes que o agendador remova automaticamente um proxy (quando `PROXY_AUTO_REMOVE=true`). | | `PROXY_AUTO_DISABLE` | `false` | `src/lib/proxyHealth/scheduler.ts` | Defina `true` para permitir que o agendador desabilite suavemente (status `dead`, nunca excluído) um proxy após repetidas falhas consecutivas, em vez de removê-lo. Alternativa não destrutiva para `PROXY_AUTO_REMOVE`: o proxy sai da resolução pool/rotation imediatamente (o filtro de status ativo usado pela resolução do conjunto de escopo já o exclui) e é automaticamente reativado assim que começa a passar pelos testes novamente. Compartilha o limite `PROXY_AUTO_REMOVE_AFTER`. Se ambos os sinalizadores forem `true`, `PROXY_AUTO_REMOVE` vence. | | `PROXY_HEALTH_PASSIVE_SKIP` | `false` | `src/lib/proxyHealth/scheduler.ts` | Opt-in skip passivo: quando `true`, o agendador ignora a investigação ao vivo para um endpoint cujo tráfego de produção recente já comprova isso (pelo menos um sucesso e nenhuma falha de proxy atribuída na janela, exatamente um provedor observado). Desativado por padrão: todo proxy é investigado. | | `PROXY_PASSIVE_WINDOW_MS` | `300000` | `src/lib/proxyHealth/passiveVerdict.ts` | Janela em ms de tráfego de produção que o salto passivo analisa (limitado `60000..599999`). Menor que o intervalo de varredura de 10 minutos, portanto, uma falha recente domina em vez de ser diluída. | | `OMNIROUTE_CONTROL_PLANE_PROXY_DIRECT_FALLBACK` | `false` | `src/shared/constants/featureFlagDefinitions.ts` | Permita que os fluxos de validação OAuth e do provedor ignorem um proxy fixado e se conectem diretamente quando as pré-verificações de acessibilidade do proxy falharem. A precedência efetiva é Feature Flags DB override > env var > default. | | `RATE_LIMIT_MAX_WAIT_MS` | `30000` (30 anos) | `src/lib/resilience/settings.ts` | Padrão** fila-espera** orçamento: quanto tempo uma solicitação pode esperar por um slot do provedor e ficar na fila antes de ser rejeitada, nunca alcançando o upstream. O cronômetro é limpo quando o trabalho começa a ser executado — execução é limitada separadamente por `RATE_LIMIT_EXECUTION_MAX_WAIT_MS`. Env define apenas o padrão: um `resilienceSettings.requestQueue.maxWaitMs` persistente e, em seguida, um `rateLimitOverrides.maxWaitMs` por conexão, cada um vencendo-o. | | `RATE_LIMIT_EXECUTION_MAX_WAIT_MS` | `600000` (10 min) | `open-sse/services/rateLimitManager.ts` | Limite de quanto tempo uma solicitação admitida pode permanecer em execução antes que sua reserva de limite de taxa expire — desacoplada do orçamento de espera de fila para que o início lento da busca em gateways não incrementais não expire (#12027). | | `RATE_LIMIT_MAX_QUEUE_DEPTH` | `0` (desativado) | `open-sse/services/rateLimitManager.ts` | Limite de admissão na fila: rejeitar com 429 `queue_full` quando esse número de solicitações já estiver na fila. `0` = ilimitado (padrão). | | `RATE_LIMIT_AUTO_ENABLE` | _(desativado)_ | `open-sse/services/rateLimitManager.ts` | Força a rede de segurança de limite de taxa de ativação automática on/off independentemente da configuração persistente do Dashboard (`resilienceSettings.requestQueue.autoEnableApiKeyProviders`). Aceita `true`/`1`/`on` para forçar, `false`/`0`/`off` para forçar o desligamento. Quando ativas (padrão), as conexões de chave de API ativas são automaticamente protegidas pelo limite de taxa. Definir `rateLimitProtection: false` por conexão desativa a proteção explícita, mas não exclui essa rede de segurança; definir este env var como `false` é o mecanismo global para executar conexões de chave de API sem filas de limite de taxa. | | `PROVIDER_COOLDOWN_ENABLED` | _(desativar → )_ | `open-sse/services/providerCooldownTracker.ts` | Acompanhamento de resfriamento provider/connection de solicitação cruzada global opcional. OFF por padrão (sobrepõe o resfriamento da conexão/disjuntor do provedor). Aceita `true`/`1`/`on` para habilitar. | | `PROVIDER_COOLDOWN_MIN_MS` | `5000` | `open-sse/services/providerCooldownTracker.ts` | Tempo de espera mínimo (ms) antes que um provider/connection com falha seja tentado novamente. Dimensionado exponencialmente com falhas consecutivas. Usado apenas quando `PROVIDER_COOLDOWN_ENABLED`. | | `PROVIDER_COOLDOWN_MAX_MS` | `300000` (5 min) | `open-sse/services/providerCooldownTracker.ts` | Limite máximo de resfriamento (ms) antes que um provider/connection com falha seja repetido independentemente. Usado apenas quando `PROVIDER_COOLDOWN_ENABLED`. | | `STREAM_RECOVERY_ENABLED` | _(desativar → )_ | `src/lib/resilience/settings.ts` (semente) → `open-sse/services/streamRecovery.ts` (lógica) | **O que:** recuperação transparente de fluxos upstream truncados (porta de código de claude livre). Mantém a janela SSE de abertura até `STREAM_RECOVERY.HOLDBACK_MS` (750 ms) para que um corte — _pré-commit_ que ocorre antes de qualquer byte atingir o cliente — seja reaberto e tentado novamente de forma invisível.** Quando ativar:** flaky/upstreams que frequentemente trunca 0 byte no início do fluxo; deixe OFF se você não puder pagar até 750 ms de tempo adicional para o primeiro token em cada fluxo. Aceita `true`/`1`/`on`. Semeia a configuração de resiliência persistente; a configuração do painel vence depois de definida. | | `STREAM_RECOVERY_MIDSTREAM_ENABLED` | _(desativar → )_ | `src/lib/resilience/settings.ts` (semente) → `open-sse/services/streamRecovery.ts` (lógica) | **O que:** continuação do mid-stream (Fase 4.4) — após um truncamento _pós-commit_ (bytes já chegaram ao cliente), solicite novamente com o texto parcial como um pré-preenchimento do assistente e costure o sufixo ausente. Apenas fluxos de texto simples compatíveis com OpenAI; nunca dispara com uma chamada de ferramenta em vôo.** Quando ativar:** longas gerações que são cortadas no meio da resposta e você aceita que a cauda recuperada chegue como uma explosão, em vez de ficha por ficha. Independente do `STREAM_RECOVERY_ENABLED` (perfil de risco diferente). Aceita `true`/`1`/`on`. | | `STREAM_THROUGHPUT_WATCHDOG_ENABLED` | _(desativar → )_ | `src/lib/resilience/settings.ts` → `open-sse/services/throughputWatchdog.ts` | Watchdog de saída útil de fluxo ativo opcional. Detecta fluxos que continuam enviando pedaços, mas permanecem abaixo da taxa de saída do assistente configurada; pulsações, eventos de uso, deltas vazios e fases tool/reasoning não se disfarçam como progresso. Separado de tempos limite de inatividade e prazos rígidos. Propaga apenas o padrão: um booleano salvo em `resilienceSettings` (Dashboard → Settings → Resilience) tem precedência. | | `STREAM_THROUGHPUT_WATCHDOG_WARMUP_MS` | `30000` | `src/lib/resilience/settings/normalize.ts` | Período de carência antes da avaliação do rendimento, limitado a 0–600.000 ms. | | `STREAM_THROUGHPUT_WATCHDOG_WINDOW_MS` | `30000` | `src/lib/resilience/settings/normalize.ts` | Janela contínua de saída útil, limitada a 1.000–600.000 ms; uma janela completa é necessária antes de abortar. | | `STREAM_THROUGHPUT_WATCHDOG_MIN_BYTES_PER_SECOND` | `4` | `src/lib/resilience/settings/normalize.ts` | Taxa mínima de bytes de saída do assistente UTF-8 (proxy de token conservador), limitada a 1–1000000. | | `STREAM_THROUGHPUT_WATCHDOG_MIN_USEFUL_BYTES` | `1` | `src/lib/resilience/settings/normalize.ts` | Amostra mínima de saída útil diferente de zero considerada mensurável, limitada a 1–1.000.000 bytes. | | `HEALTHCHECK_STAGGER_MS` | `3000` | `src/lib/tokenHealthCheck.ts` | Intervalo escalonado (ms) entre verificações de integridade do token do provedor na inicialização. | | `HEALTHCHECK_JITTER_MIN_MS` | `500` | `src/lib/tokenHealthCheck.ts` | Jitter aleatório mínimo (ms) adicionado ao `HEALTHCHECK_STAGGER_MS` entre as verificações de integridade do token do provedor, para evitar estouros (problema nº #1220). | | `HEALTHCHECK_JITTER_MAX_MS` | `5000` | `src/lib/tokenHealthCheck.ts` | Tremulação aleatória máxima (ms) adicionada sobre `HEALTHCHECK_STAGGER_MS` entre verificações de integridade do token do provedor, para evitar intermitências (problema nº #1220). | | `HEALTHCHECK_BATCH_SIZE` | `20` | `src/lib/tokenHealthCheck.ts` | Tamanho do lote de verificação simultânea para a varredura de verificação de integridade do token de inicialização; valores maiores verificam mais conexões em paralelo, valores menores reduzem a carga intermitente (Problema nº #7875, regressão de nº #7719). | | `REQUEST_RETRY` | `2` | `src/sse/services/cooldownAwareRetry.ts` | Número de novas tentativas automáticas em respostas de resfriamento no escopo do modelo antes de retornar o erro ao cliente. | | `MAX_RETRY_INTERVAL_SEC` | `30` | `src/sse/services/cooldownAwareRetry.ts` | Intervalo máximo de espera (segundos) entre novas tentativas de resfriamento. Limitada por este valor, independentemente do `Retry-After` upstream. | | `HEADROOM_URL` | `http://localhost:8787` | `src/lib/headroom/detect.ts` | Proxy de proteção de token de headroom URL. O ciclo de vida do painel (`api/headroom/*`) gera um `headroom-ai` CLI local em loopback por padrão; substitua apenas para apontar para um proxy secundário Docker externo. | ### Constantes de ajuste de recuperação de fluxo O comportamento de retenção de recuperação é ajustado por constantes codificadas em `open-sse/config/constants.ts` (`STREAM_RECOVERY`), mostradas aqui para referência — alterá-las requer uma edição de código, não uma var env: - `STREAM_RECOVERY.HOLDBACK_MS = 750` — quanto tempo a janela SSE de abertura é mantida para que um truncamento antecipado possa ser repetido antes que qualquer byte seja confirmado no cliente. - tampa rígida `STREAM_RECOVERY.BUFFER_MAX_BYTES = 65536` — na janela retida; commit (liberar passagem + ) assim que tantos bytes se acumularem, independentemente do timer. - `STREAM_RECOVERY.EARLY_RETRY_MAX = 4` — max reabre transparente do fluxo upstream enquanto o holdback ainda não foi confirmado. > **Limite de taxa de janela deslizante por provedor (sem env var):** o _fallback_ de limite de taxa de janela deslizante por provedor portado pela FCC existe no código (`open-sse/services/providerDefaultRateLimit.ts`, conectado por meio `open-sse/services/rateLimitManager.ts`), mas é fornecido com um** mapa padrão vazio** e tem** nenhum operador env var** hoje — ele é habilitado apenas por meio de um gancho de teste/edição de código. Não está intencionalmente listado na tabela acima. O limitador de relé `(token, IP)` que _tem_ um botão é `RELAY_IP_PER_MINUTE` (§3 Rede e Portas). --- ## 22. Depuração > [!CAUTION] > Essas variáveis produzem** saída detalhada** e pode vazar dados confidenciais.** Nunca habilite na produção.** | Variável | Padrão | Arquivo de origem | Descrição | | ------------------------------------- | -------------------------------- | ----------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | `CURSOR_DEBUG` | _(desativado)_ | `open-sse/executors/cursor.ts` | Defina `1` para ativar logs detalhados do executor Cursor (pedaços SSE decodificados, etc.). | | `CURSOR_STREAM_DEBUG` | _(desativado)_ | `open-sse/executors/cursor.ts` | Alias compatível com versões anteriores de `CURSOR_DEBUG`. | | `CURSOR_DUMP_FILE` | _(desativado)_ | `open-sse/executors/cursor.ts` | Caminho de arquivo opcional que recebe pedaços Cursor decodificados brutos quando `CURSOR_DEBUG=1`. | | `CURSOR_STREAM_TIMEOUT_MS` | `300000` | `open-sse/executors/cursor.ts` | Tempo limite de inatividade do fluxo (ms) para o executor Cursor. | | `CURSOR_KV_GRACE_MS` | `2000` | `open-sse/executors/cursor.ts` | Janela de tolerância (ms) após um terminador suave do compositor kv_after_text quando os bytes permanecem em buffer — fornece um tempo de chamada da ferramenta exec_mcp final para completar seu quadro. | | `CURSOR_TOOL_DIRECTIVE` | habilitado (`!== "0"`) | `open-sse/executors/cursor.ts` | Diretiva de confirmação de ferramenta que faz com que composer-2.5 emita chamadas de ferramenta de maneira confiável. Defina `0` para desabilitar. | | `OMNIROUTE_SYSTEM_INSTRUCTION_APPEND` | _(desativado)_ | `open-sse/translator/request/claude-to-openai.ts`, `open-sse/translator/response/openai-to-claude.ts` | Texto de prompt do sistema definido pelo operador anexado à mensagem do sistema tradução AFTER (injeção pós-tradução), alcançando os caminhos codex/Responses e `/v1/messages`. Também usado como prefixo de diretiva retirado dos blocos de preâmbulo do sistema ecoados. Deixe sem definir para desativar. | | `OMNIROUTE_STRIP_SYSTEM_PREAMBLE` | `0` (desligado) | `open-sse/translator/response/openai-to-claude.ts`, `open-sse/utils/directivePreambleStripper.ts` | Defina como `1` para remover blocos de preâmbulo do prompt do sistema ecoados desde o início de um fluxo openai → claude. Desativada por padrão — a heurística tem o formato da prosa inglesa e altera a carga útil da resposta, portanto, uma resposta que abre legitimamente com tal seção a perderia. | | `CURSOR_IMAGE_FETCH_TIMEOUT_MS` | `15000` | `open-sse/utils/cursorImages.ts` | Tempo limite de busca por imagem (ms) para entrada remota `image_url` vision. | | `CURSOR_STATE_DB_PATH` | _(sondado)_ | `open-sse/utils/cursorVersionDetector.ts` | Substitua a pesquisa Cursor IDE state DB usada para detecção de versão IDE. | | `CURSOR_AGENT_CLI_VERSION` | _(detectar/fixar)_ | `open-sse/utils/cursorAgentCliVersion.ts` | ID de compilação do agente CLI (`YYYY.MM.DD-`) para `x-cursor-client-version: cli-…` no Agent Run. | | `CURSOR_AGENT_BIN` | _(desativado)_ | `open-sse/handlers/imageGeneration/providers/cursorAgentImage.ts` | Caminho para o binário do agente Cursor usado para geração de imagem. Não definido, o manipulador usa `providerSpecificData.agentBin` e depois PATH. | | `CURSOR_IMG_TIMEOUT_MS` | `210000` | `open-sse/handlers/imageGeneration/providers/cursorAgentImage.ts` | Relógio de parede por imagem (ms) para trabalhos de imagem Cursor Agent. | | `CURSOR_IMG_MAX_CONCURRENT` | `2` | `open-sse/handlers/imageGeneration/providers/cursorAgentImage.ts` | Porta de simultaneidade de assento compartilhado para trabalhos de imagem Cursor. | | `CURSOR_IMG_MODEL` | solicitação / `auto` | `open-sse/handlers/imageGeneration/providers/cursorAgentImage.ts` | Substitua Cursor CLI `--model` para trabalhos de imagem. | | `UC_IMAGE_POLL_INTERVAL_MS` | `2000` | `open-sse/handlers/imageGeneration/providers/ucImage.ts` | UC (uncensored.com) cadência de pesquisa de resultados de geração de imagem (ms). | | `UC_IMAGE_POLL_TIMEOUT_MS` | `60000` | `open-sse/handlers/imageGeneration/providers/ucImage.ts` | relógio de parede de pesquisa de resultados de geração de imagem UC (ms). | | `UC_VIDEO_POLL_INTERVAL_MS` | `3000` | `open-sse/handlers/videoGeneration/providers/ucVideo.ts` | UC (uncensored.com) cadência de pesquisa de resultados de geração de vídeo (ms). | | `UC_VIDEO_POLL_TIMEOUT_MS` | `300000` | `open-sse/handlers/videoGeneration/providers/ucVideo.ts` | relógio de parede UC video-gen result-poll (ms). | | `CURSOR_DATA_DIR` | _(sondado)_ | `open-sse/utils/cursorAgentCliVersion.ts` | Substituir o diretório de dados CLI do agente Cursor (`…/versions/`); mesma var que o agente oficial usa. | | `CURSOR_TOKEN` | _(desativado)_ | `scripts/ad-hoc/cursor-tap.cjs` | Token de portador Cursor direto usado pelas ferramentas do desenvolvedor. | | `OMNIROUTE_LOG_REQUEST_SHAPE` | desabilitado (aceitar via `"1"`) | `src/app/api/v1/chat/completions/route.ts` | Registre marcadores content-type/length para grandes cargas de bate-papo quando `"1"` estiver definido. Desativado por padrão para reduzir o ruído do registro. | | `DEBUG_RESPONSES_SSE_TO_JSON` | _(desativado)_ | `open-sse/handlers/responseTranslator.ts` | Configure `true` para registrar respostas API SSE→JSON detalhes de tradução. | | `DEBUG_CLAUDE_NONSTREAM` | _(desativado)_ | `open-sse/handlers/responseTranslator.ts` | Configure `true` para exibir pedaços textContent vazios no caminho de tradução da resposta Claude (somente depuração). | | `NEXT_PUBLIC_OMNIROUTE_E2E_MODE` | _(desativado)_ | equipamento de teste E2E | Defina `true` para ativar o modo de teste E2E (autenticação relaxada, ganchos de teste). | --- ## 23. Integração GitHub Permita que os usuários relatem problemas diretamente no Painel. | Variável | Padrão | Arquivo de origem | Descrição | | --------------------- | -------------- | --------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------- | | `GITHUB_ISSUES_REPO` | _(desativado)_ | `src/app/api/v1/issues/report/route.ts` | Repositório em formato `owner/repo`. | | `GITHUB_ISSUES_TOKEN` | _(desativado)_ | `src/app/api/v1/issues/report/route.ts` | Token de acesso pessoal GitHub com escopo `issues:write`. | | `GITHUB_TOKEN` | _(desativado)_ | auxiliares de triagem de problemas/agentes de nuvem | Token de acesso GitHub genérico usado como substituto para `GITHUB_ISSUES_TOKEN` e consumido por auxiliares de agente de nuvem em `src/lib/cloudAgent/*`. | --- ## Renderizar Keep-Alive de nível gratuito O Render desativa um serviço da Web gratuito após cerca de 15 minutos sem tráfego de entrada. O iniciador independente (`scripts/dev/run-standalone.mjs`, que a imagem Docker executa) pode executar ping no URL público do próprio serviço para evitar isso. Ele não faz nada, a menos que um URL público esteja disponível e registra somente quando o status muda. | Variável | Padrão | Descrição | | ---------------------------- | -------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------- | | `SELF_PING_ENABLED` | ativado quando um URL é definido | `0`, `false`, `off` ou `no` desliga o pinger. Use-o em planos de renderização pagos, onde nada falha. | | `SELF_PING_URL` | `RENDER_EXTERNAL_URL` | Base URL para fazer ping. A renderização define o próprio `RENDER_EXTERNAL_URL` em todos os planos, então o pinger está lá por padrão. | | `SELF_PING_PATH` | `/api/monitoring/health` | Caminho nesse URL. Deve começar com `/`; qualquer outra coisa desativa o pinger com um aviso. | | `SELF_PING_INTERVAL_SECONDS` | `180` | Segundos entre pings, após um primeiro ping 60 segundos depois. Valores abaixo `30` voltam para `180`. | Um serviço mantido ativo por um mês inteiro usa cerca de 744 horas de instância, portanto, compare-o com o limite atual de nível gratuito do Render. ## Cenários de implantação Para orientação de backend de retransmissão SRE (comportamento ts/bifrost/auto, posicionamento 9router vs CLIProxyAPI e estratégia de fallback de alto rendimento), consulte [Estratégia de backend de retransmissão](/docs/reference/RELAY_BACKEND_STRATEGY.md). ### Desenvolvimento Local Mínimo ```bash JWT_SECRET=$(openssl rand -base64 48) API_KEY_SECRET=$(openssl rand -hex 32) INITIAL_PASSWORD=dev123 PORT=20128 NODE_ENV=development ``` ### Produção 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 ``` ### Air Gapped / 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 com proxy reverso (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. Sandbox de habilidades (v3.8.0 +) Limites e botões de segurança aplicados quando a estrutura Skills (`src/lib/skills/`) executa automações definidas pelo usuário em um ambiente de área restrita. | Variável | Padrão | Arquivo de origem | Descrição | | -------------------------------------- | ------------------------------------------ | ------------------------------------------------------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `SKILLS_SANDBOX_TIMEOUT_MS` | `10000` (10 s) | `src/lib/skills/builtins.ts` | Tempo limite do relógio de parede por execução para código de habilidade em área restrita. Tampa rígida; qualquer coisa a mais é morta. | | `SKILLS_EXECUTION_TIMEOUT_MS` | _(volta para `SKILLS_SANDBOX_TIMEOUT_MS`)_ | `src/lib/skills/` | Tempo limite de orquestração de habilidades de alto nível. Defina um valor superior a `SKILLS_SANDBOX_TIMEOUT_MS` para permitir fluxos de trabalho de várias etapas. | | `SKILLS_MAX_FILE_BYTES` | `1048576` (1 MB) | `src/lib/skills/builtins.ts` | Máximo de bytes que uma habilidade pode ler de qualquer arquivo em área restrita. | | `SKILLS_MAX_HTTP_RESPONSE_BYTES` | `256000` (250 KB) | `src/lib/skills/builtins.ts` | Máximo de bytes capturados de qualquer resposta HTTP única dentro de uma habilidade. | | `SKILLS_MAX_SANDBOX_OUTPUT_CHARS` | `100000` | `src/lib/skills/builtins.ts` | Limite máximo para caracteres stdout/stderr retornados de uma invocação de sandbox. | | `SKILLS_SANDBOX_NETWORK_ENABLED` | `false` | `src/lib/skills/builtins.ts` | Defina `1`/`true` para permitir rede de saída de dentro da sandbox. O padrão é** isolado** para segurança. Ignorado pelo tempo de execução `agent-sandbox` : isolamento de rede, o sistema de arquivos raiz somente leitura e os limites CPU/memory vêm do `SandboxTemplate` do operador. | | `SKILLS_ALLOWED_SANDBOX_IMAGES` | _(vazio)_ | `src/lib/skills/builtins.ts` | Lista de permissões separadas por vírgula de imagens de contêiner permitidas para execução de sandbox. Vazio significa apenas padrão integrado. | | `SKILLS_SANDBOX_DOCKER_IMAGE` | _(padrão integrado)_ | `src/lib/skills/` | Imagem de contêiner usada ao gerar uma sandbox baseada em Docker. Substitua para fixar uma imagem de base reforçada personalizada. | | `SKILLS_SANDBOX_RUNTIME` | `auto` | `src/lib/skills/sandbox.ts`, `src/lib/skills/containerProvider.ts` | Tempo de execução do contêiner para sandbox de habilidades: `auto` \| `docker` \| `apple` \| `wsl` \| `orbstack` \| `podman` \| `agent-sandbox`. `auto` escolhe o melhor tempo de execução instalado por host OS (Apple Container/OrbStack em macOS, WSL Container em Windows, Podman em Linux), voltando para Docker. `agent-sandbox` (pools quentes remotos do Kubernetes) é apenas opcional e nunca é detectado automaticamente. | | `SKILLS_AGENT_SANDBOX_POOLS` | _(vazio)_ | `src/lib/skills/agentSandboxProvider.ts` | Pares `image=pool`, separados por vírgula: quais `SandboxWarmPool` veiculam cada imagem de sandbox quando `SKILLS_SANDBOX_RUNTIME=agent-sandbox`. | | `SKILLS_AGENT_SANDBOX_POOL` | _(vazio)_ | `src/lib/skills/agentSandboxProvider.ts` | Pool quente substituto para imagens não listadas em `SKILLS_AGENT_SANDBOX_POOLS`. Uma execução falha (sem fallback para contêineres locais) quando nenhuma delas é resolvida. | | `SKILLS_AGENT_SANDBOX_NAMESPACE` | `default` | `src/lib/skills/agentSandboxProvider.ts` | Namespace que contém os pools quentes; um `SandboxClaim` por execução é criado e excluído aqui. | | `SKILLS_AGENT_SANDBOX_KUBECONFIG` | _(padrão kubectl)_ | `src/lib/skills/agentSandboxProvider.ts` | Kubeconfig para o tempo de execução do agente-sandbox. Precisa apenas de sandboxclaims create/get/list/watch/delete, pods get, pods/exec create no namespace. | | `SKILLS_AGENT_SANDBOX_KUBECTL` | `kubectl` | `src/lib/skills/agentSandboxProvider.ts` | Binário kubectl usado pelo tempo de execução do agente-sandbox. | | `SKILLS_AGENT_SANDBOX_CONTAINER` | `main` | `src/lib/skills/agentSandboxProvider.ts` | Nome do contêiner dentro do pod sandbox em que os comandos são executados. | | `SKILLS_AGENT_SANDBOX_CLAIM_TIMEOUT_S` | `60` | `src/lib/skills/agentSandboxProvider.ts` | Segundos de espera para que uma reivindicação fique pronta (máximo de 600). A reivindicação será excluída se isso nunca acontecer. | > [!CAUTION] > A ativação `SKILLS_SANDBOX_NETWORK_ENABLED=true` abre um caminho de saída do código de habilidade arbitrário. Combine com `OUTBOUND_SSRF_GUARD_ENABLED=true` e uma política estrita `CORS_ORIGIN`/proxy em implantações compartilhadas. --- ## 25. Cotas de Provedores, Túneis, Backups e Diversos Itens de Runtime Invalidação alternativa da afinidade de sessão do Redis (somente com habilitação explícita; o padrão do SQLite permanece inalterado): Cada armazenamento de afinidade do Redis admite no máximo 8 operações pendentes; quando a capacidade é atingida, as chamadas usam imediatamente o SQLite, e os slots permanecem ocupados até que o trabalho subjacente do Redis seja concluído, mesmo após o prazo de 100 ms do chamador. - R1. Qualquer resposta do Redis entregue a tempo para uma operação de sessão é autoritativa: mutações aceitas, CAS rejeitados/perdidos, chaves ausentes, exclusões de chaves inexistentes e acertos ou falhas de remoção limpam de forma síncrona a linha de fallback local dessa sessão, sem nenhum await entre a resposta e a limpeza. A limpeza é segura (no pior caso, haverá uma nova seleção durante uma indisponibilidade posterior); uma linha obsoleta, não. - R2. Uma operação que expira ou falha e grava um fallback local registra exatamente o que gravou como bytes serializados. Se o comando do Redis for concluído posteriormente, a comparação e exclusão síncronas no SQLite limpam somente essa linha idêntica em bytes, nunca com base em uma correspondência de conta ou conexão. Uma gravação mais recente durante a indisponibilidade é preservada. - R3. A remoção sempre elimina o vínculo local da conta que falhou, inclusive durante uma indisponibilidade; o tratamento da resposta segue então R1/R2. Um Redis íntegro nunca grava vínculos locais: não há espelho nem registro de ordenação, e as instâncias podem divergir durante uma indisponibilidade. Endpoints de cota de provedores, túneis de rede (Tailscale, Ngrok, proxy de depuração MITM), o pool de saída do 1Proxy, backups de banco de dados e pequenas substituições por recurso referenciadas pela camada do executor ou pelos scripts. | Variável | Padrão | Arquivo de origem | Descrição | | ---------------------------------------------- | --------------------------------------------------------------------------- | ------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `OMNIROUTE_SESSION_AFFINITY_STORE` | `sqlite` | `src/lib/db/sessionAffinity/storeFactory.ts` | Backend de afinidade entre sessão e conta. Somente `redis` com `REDIS_URL` configurada habilita o compartilhamento; valores não definidos ou desconhecidos, ou uma configuração ausente do Redis, usam SQLite. Requer `sessionAffinityTtlMs` positivo. O roteamento Redis armazena a identidade da conta de uso com hash e o ID da conexão; o roteamento SQLite padrão mantém o formato JSON legado de quatro campos. Corresponde à identidade dentro do pool local elegível antes do ID. Usa o `REDIS_KEY_PREFIX` do cliente compartilhado, valores JSON e TTL `PX`; as mutações comparam o valor observado exato. Respostas saudáveis do Redis invalidam o fallback local de indisponibilidade, e uma resposta tardia pode limpar apenas a linha de fallback serializada exata gravada por aquela operação que atingiu o tempo limite. Afinidades pré-buscadas são revalidadas no momento do uso. Erros, tempos limite ou saturação de admissão do Redis fazem fallback para SQLite com avisos limitados (limite de 100 ms por chamada ao armazenamento); falhas de cache do Redis bem-sucedidas não leem o shadow. Não compartilha a afinidade de combinações, os pins de turnos nativos do Codex, a concorrência de contas, os bloqueios nem os limites de gastos. | | `REDIS_URL` | `redis://localhost:6379` | `src/shared/utils/rateLimiter.ts` | String de conexão do Redis para o backend do limitador de taxa. | | `ALIBABA_CODING_PLAN_HOST` | _(host de produção)_ | `open-sse/services/bailianQuotaFetcher.ts` | Substitui o host usado para buscar as cotas do plano de programação Alibaba Bailian. | | `ALIBABA_CODING_PLAN_QUOTA_URL` | derivado do host | `open-sse/services/bailianQuotaFetcher.ts` | Substituição completa da URL de cotas do Alibaba Bailian. | | `QWEN_CLOUD_COOKIE` | _(não definido)_ | `open-sse/services/qwenTokenPlanQuotaFetcher.ts` | Cookie de sessão do console para o gateway de cotas do Token Plan pessoal do Qwen Cloud / Model Studio (a chave de API de inferência não pode lê-lo). Copie todo o cabeçalho de solicitação `Cookie` — ele contém `login_qwencloud_ticket` — de qualquer chamada `api.json` para `cs-data.qwencloud.com` em home.qwencloud.com › Faturamento › Assinatura (F12 › Rede). Sensível e com escopo de sessão; prefira o campo `qwenCloudCookie` por conexão no Painel. | | `QWEN_CLOUD_SEC_TOKEN` | _(não definido)_ | `open-sse/services/qwenTokenPlanQuotaFetcher.ts` | Substituição manual de `sec_token` para o gateway do console do Token Plan. Sensível; quando não definido, o fetcher o resolve a partir do HTML do painel usando o cookie. | | `QWEN_TOKEN_PLAN_HOST` | `https://cs-data.qwencloud.com` | `open-sse/services/qwenTokenPlanQuotaFetcher.ts` | Substituição do host do gateway para o buscador de cota do Token Plan pessoal (por exemplo, `bailian-singapore-cs.alibabacloud.com` para o console do Model Studio). | | `QWEN_TOKEN_PLAN_DASHBOARD_URL` | `https://home.qwencloud.com/` | `open-sse/services/qwenTokenPlanQuotaFetcher.ts` | URL do dashboard usada para resolver `sec_token` a partir do HTML da sessão autenticada. | | `XIAOMI_MIMO_CONSOLE_COOKIE` | _(não definido)_ | `open-sse/services/usage/xiaomi-mimo.ts` | Cookie da sessão do console para a API de cota do Token Plan do Xiaomi MiMo (`platform.xiaomimimo.com/api/v1/tokenPlan/usage` + `tokenPlan/detail` — a chave da API de inferência não pode lê-lo). Copie todo o cabeçalho de solicitação `Cookie` — ele contém `api-platform_serviceToken` e `userId` — de qualquer solicitação para `platform.xiaomimimo.com` na página do Token Plan (F12 › Rede). Sensível e restrito à sessão; prefira o campo `xiaomiMimoConsoleCookie` por conexão no dashboard. | | `XIAOMI_MIMO_MONTHLY_TOKEN_LIMIT` | `4100000000` | `open-sse/services/usage/xiaomi-mimo.ts` | Orçamento mensal (créditos) para o fallback do Xiaomi MiMo rastreado pelo OmniRoute, usado quando nenhum cookie do console está configurado. O padrão é o valor de 4,1 bilhões do nível Lite; defina-o como os créditos do plano (Standard 11 bilhões / Pro 38 bilhões / Max 82 bilhões). Uma substituição `providerSpecificData.monthlyTokenLimit` por conexão tem precedência sobre esta variável de ambiente. | | `ALIBABA_FREE_TIER_VISION_FE_PATH` | `/costing-balance/free-quota-image-video` | `open-sse/services/alibabaFreeTierQuotaFetcher.ts` | Substituição do caminho do front-end do console para buscar a cota gratuita de visão/mídia do Alibaba Model Studio. | | `ALIBABA_FREE_TIER_MULTIMODAL_FE_PATH` | `/costing-balance/free-quota-multimodal` | `open-sse/services/alibabaFreeTierQuotaFetcher.ts` | Substituição do caminho do front-end do console para buscar a cota multimodal gratuita do Alibaba Model Studio. | | `ALIBABA_FREE_TIER_AUDIO_FE_PATH` | `/costing-balance/free-quota-audio` | `open-sse/services/alibabaFreeTierQuotaFetcher.ts` | Substituição do caminho do front-end do console para buscar a cota de áudio gratuita do Alibaba Model Studio. | | `ALIBABA_FREE_TIER_ALLOWLIST_PATH` | _(não definido)_ | `open-sse/services/alibabaFreeTierAllowlist.ts` | Caminho opcional para uma substituição local em JSON da lista de permissões integrada de modelos de texto do nível gratuito da Alibaba. Usa `$DATA_DIR/alibaba-free-tier-allowlist.json` como fallback e, depois, `config/alibaba-free-tier-allowlist.json`. | | `CONTEXT_RESERVE_TOKENS` | `1024` | `open-sse/services/contextManager.ts` | Tokens reservados para a saída da conclusão ao calcular os orçamentos do prompt. | | `CONTEXT_KEEP_LATEST_IMAGES` | `2` | `open-sse/services/contextManager.ts` | Quantas das imagens inline mais recentes devem ser mantidas ao remover imagens mais antigas para caber na janela de contexto (#8560). | | `MODEL_ALIAS_COMPAT_ENABLED` | enabled | `open-sse/services/model.ts` | Alterna a camada de compatibilidade de aliases de modelo legados usada por clientes mais antigos. | | `OMNIROUTE_EMERGENCY_FALLBACK` | enabled | `open-sse/services/emergencyFallback.ts` | Defina como `false` (ou `0`) para desativar o fallback de emergência por esgotamento do orçamento, que redireciona solicitações com falha para o modelo gratuito `nvidia`/`nvidia/nemotron-3.5-super-vl-120b-a12b`. A precedência efetiva é substituição no banco de dados de Feature Flags > variável de ambiente > padrão; se indisponível, o serviço recorre ao valor bruto da variável de ambiente. | | `COMMAND_CODE_CALLBACK_PORT` | _(unset)_ | `src/app/api/providers/command-code/auth/shared.ts` | Porta local usada para callbacks no estilo OAuth do auxiliar de CLI do Command Code. | | `COMMAND_CODE_VERSION` | `0.33.2` | `open-sse/executors/commandCode.ts` | Valor enviado no cabeçalho `x-command-code-version` para o upstream do Command Code. Substitua para atualizar a versão da CLI. | | `COMMANDCODE_API_URL` | `https://api.commandcode.ai` | `open-sse/services/usage/command-code.ts` | URL base do upstream de uso/cota do Command Code, usada pela telemetria de busca de cotas do smartphone. Substitua para usar uma API do Command Code auto-hospedada ou alternativa. | | `MITM_LOCAL_PORT` | `443` | `src/mitm/server.cjs` | Porta de vinculação local do proxy de depuração MITM. | | `MITM_DISABLE_TLS_VERIFY` | `0` | `src/mitm/server.cjs` | Defina como `1` para desabilitar a verificação de TLS upstream (somente para desenvolvimento). | | `MITM_IDLE_TIMEOUT_MS` | `60000` | `src/mitm/socketTimeouts.ts`, `src/mitm/server.cjs` | Tempo limite de inatividade do socket (ms) para conexões proxy; sockets inativos além desse período são encerrados para evitar o vazamento de túneis semiabertos. | | `BRIDGE_PORT` | `20129` | `bin/antigravity-bridge.mjs` | Porta na qual a ponte MITM do Antigravity escuta. | | `ROUTER_URL` | `http://127.0.0.1:20128/v1/antigravity` | `bin/antigravity-bridge.mjs` | Endpoint do roteador para o qual a ponte encaminha o tráfego do Antigravity. | | `CERT_DIR` | `/mitm` | `bin/antigravity-bridge.mjs` | Substitui o diretório do qual a ponte lê seu material TLS. O modelo de certificado é selecionado da mesma forma que no servidor AgentBridge: `server.crt`/`server.key` para uma instalação legada com certificado leaf; caso contrário, `ca.crt`/`ca.key` (CA raiz, um certificado leaf por host interceptado; forçado por `MITM_ROOT_CA_ENABLED=true`). A ponte é encerrada na inicialização se os arquivos do modelo ativo estiverem ausentes. | | `MITM_VERBOSE` | `1` | `src/mitm/server.cjs`, `src/mitm/_internal/bypass.cjs` | Verbosidade do log de decisões de roteamento: `0` silencia os logs; valores maiores registram mais decisões de bypass/rota. | | `MITM_ROOT_CA_ENABLED` | `false` | `src/mitm/manager.ts` | Defina como `true` para optar pelo modelo de certificado com CA raiz + certificado leaf por host (#6684). Novas instalações recebem essa configuração automaticamente; instalações com um certificado leaf legado confiável preexistente mantêm o certificado legado com SAN fixo, a menos que optem pelo novo modelo. | | `MITM_CERT_MODE` | `legacy` | `src/mitm/manager.ts`, `src/mitm/server.cjs` | Definido pelo gerenciador MITM para o processo de proxy iniciado (`root-ca` \| `legacy`) — reflete a decisão de migração do certificado; não deve ser definido manualmente. | | `OMNIROUTE_NO_SUDO` | `0` | `src/mitm/systemCommands.ts` | Defina como `1` (truthy) para remover o `sudo` inicial dos comandos de confiança de certificados MITM — para implantações sem root / com namespaces de usuário, nas quais o operador confia manualmente na CA (por exemplo, por meio do mecanismo extra-CA-certs do Node). | | `SKIP_ANTIGRAVITY_DNS` | _(não definido)_ | `src/mitm/dns/provision.ts` | Defina como `true` para ignorar completamente o provisionamento de entradas DNS em `/etc/hosts` para os nomes de host do proxy Antigravity — para contêineres sem acesso a sudo/root. | | `OMNIROUTE_SKIP_DNS_WRITE` | _(não definido)_ | `src/mitm/dns/dnsConfig.ts` | Defina como `1` para ignorar a gravação no arquivo hosts ao adicionar/remover entradas DNS — para ambientes de teste isolados ou somente leitura. | | `OMNIROUTE_SKIP_SYSTEM_TRUST` | `0` | `src/mitm/cert/install.ts`, `src/mitm/tproxy/caTrust.ts` | Proteção exclusiva para testes/CI: defina como `1` para tornar a instalação/desinstalação de confiança de certificados uma operação sem efeito, para que a suíte nunca modifique o armazenamento de confiança do sistema operacional. Definida automaticamente pela configuração de testes e pelos workflows de CI. | | `CHANGELOG_BASE_REF` | _(automático)_ | `scripts/check/check-changelog-integrity.mjs` | Referência base explícita para a verificação contra o consumo indevido do CHANGELOG (por padrão, a ramificação base do PR no CI ou a versão `release/v*` mais alta). | | `FREE_PROXY_AUTO_SYNC_ENABLED` | `false` | `src/lib/freeProxyProviders/scheduler.ts` | Defina como `true` para ativar o agendador de sincronização automática em segundo plano do pool de proxies gratuitos. Opt-in, desativado por padrão. | | `FREE_PROXY_AUTO_SYNC_INTERVAL_MS` | `1800000` | `src/lib/freeProxyProviders/scheduler.ts` | Intervalo da sincronização automática em milissegundos (padrão: 30 min). | | `FREE_PROXY_1PROXY_ENABLED` | `true` | `src/lib/freeProxyProviders/oneproxy.ts` | Ativa a fonte de proxy gratuito 1proxy. Defina como `false` para desativá-la. | | `FREE_PROXY_1PROXY_API_URL` | _(see oneproxy.ts)_ | `src/lib/freeProxyProviders/oneproxy.ts` | Substituição da URL da API do 1proxy. | | `FREE_PROXY_1PROXY_MAX` | `500` | `src/lib/freeProxyProviders/oneproxy.ts` | Máximo de proxies obtidos por sincronização do 1proxy. | | `FREE_PROXY_1PROXY_MIN_QUALITY` | `50` | `src/lib/freeProxyProviders/oneproxy.ts` | Limite mínimo de pontuação de qualidade para importações do 1proxy. | | `FREE_PROXY_PROXIFLY_ENABLED` | `true` | `src/lib/freeProxyProviders/proxifly.ts` | Habilita a fonte gratuita de proxies Proxifly. Defina como `false` para desabilitar. | | `FREE_PROXY_PROXIFLY_QUANTITY` | `100` | `src/lib/freeProxyProviders/proxifly.ts` | Número de proxies obtidos por sincronização do Proxifly. | | `FREE_PROXY_PROXIFLY_ANONYMITY` | `elite` | `src/lib/freeProxyProviders/proxifly.ts` | Filtro de nível de anonimato do Proxifly (`elite`, `anonymous`, `transparent`). | | `FREE_PROXY_IPLOCATE_ENABLED` | `false` | `src/lib/freeProxyProviders/iplocate.ts` | Habilita a fonte gratuita de proxies do IPLocate. Somente com ativação explícita. | | `FREE_PROXY_IPLOCATE_BASE_URL` | `https://raw.githubusercontent.com/iplocate/free-proxy-list/main/protocols` | `src/lib/freeProxyProviders/iplocate.ts` | Substituição da URL base da lista de proxies do IPLocate. | | `FREE_PROXY_WEBSHARE_ENABLED` | `true` | `src/lib/freeProxyProviders/webshare.ts` | Habilita a fonte do pool de proxies do Webshare. Defina como `false` para desabilitar; também requer que `FREE_PROXY_WEBSHARE_API_KEY` esteja definido. | | `FREE_PROXY_WEBSHARE_API_KEY` | _(none)_ | `src/lib/freeProxyProviders/webshare.ts` | Token de API da conta do Webshare (`Authorization: Token `). Obrigatório — o provedor permanece desabilitado sem ele. | | `FREE_PROXY_WEBSHARE_API_URL` | `https://proxy.webshare.io/api/v2/proxy/list/` | `src/lib/freeProxyProviders/webshare.ts` | Substituição da URL da API de lista de proxies do Webshare. | | `FREE_PROXY_WEBSHARE_MAX` | `500` | `src/lib/freeProxyProviders/webshare.ts` | Número máximo de proxies importados por sincronização do Webshare. | | `NEXT_PUBLIC_VERCEL_RELAY_ENABLED` | `true` | `src/app/(dashboard)/…/ProxyPoolTab.tsx` | Exibe/oculta o botão Implantar Vercel Relay na aba Proxy Pool. | | `VERCEL_API_BASE` | `https://api.vercel.com` | `src/app/api/settings/proxy/vercel-deploy/route.ts` | Substituição da URL base da API da Vercel (para testes). | | `NEXT_PUBLIC_VERCEL_RELAY_DEFAULT_PROJECT` | `omniroute-relay` | `src/app/(dashboard)/…/VercelRelayModal.tsx` | Nome do projeto padrão pré-preenchido no modal de implantação do Vercel Relay. | | `TAILSCALE_BIN` | _(auto-detect)_ | `src/lib/tailscaleTunnel.ts` | Caminho explícito para o binário `tailscale`. | | `TAILSCALED_BIN` | _(detecção automática)_ | `src/lib/tailscaleTunnel.ts` | Caminho explícito para o binário do daemon `tailscaled`. | | `TAILSCALE_AUTHKEY` | _(não definido)_ | `src/lib/tailscaleTunnel.ts` | Chave de autenticação Tailscale pré-compartilhada para `tailscale up` não interativo/sem interface (passada via `--auth-key=`). Quando não definida, o login recorre à URL de autenticação no navegador. | | `NGROK_AUTHTOKEN` | _(não definido)_ | `src/lib/ngrokTunnel.ts` | Autentica túneis de saída do ngrok. | | `DB_BACKUP_MAX_FILES` | `20` | `src/lib/db/backup.ts` | Número máximo de arquivos de backup do SQLite mantidos pela limpeza manual/agendada de backups. Os snapshots de migração são endereçados por conteúdo e reutilizados para um estado idêntico do banco de dados; eles não são removidos dentro da janela de migração simultânea. Substitui o valor salvo em Configurações → Retenção de backup do banco de dados. | | `DB_BACKUP_RETENTION_DAYS` | `0` | `src/lib/db/backup.ts` | Idade máxima (em dias) mantida pela limpeza manual/agendada de backups. `0` desativa a remoção baseada em idade. Os snapshots de migração não são removidos dentro da janela de migração simultânea. Substitui o valor salvo em Configurações → Retenção de backup do banco de dados. | | `OMNIROUTE_BACKUP_SCHEDULE_JOB_INTERVAL_MS` | `30000` | `src/lib/jobs/backupScheduleJob.ts` | Intervalo de execução (ms) do job no lado do servidor que executa `backup-schedule.json`. Deve permanecer bem abaixo da granularidade de 1 minuto do cron; valores abaixo de `5000` ou que não possam ser analisados retornam a `30000`. | | `CONTAINER_HOST` | `docker` | `scripts/check-permissions.sh` | Indicação do runtime de contêiner para a verificação de permissões do entrypoint. Defina como `podman` para qualquer topologia do Podman. Como o contêiner não pode determinar se o mecanismo é local ou acessado por meio do Podman Machine, o aviso permanece neutro em relação à topologia e aponta para `contrib/podman/README.md`. | | `QUOTA_STORE_DRIVER` | `sqlite` | `src/lib/quota/storeFactory.ts` | Backend do armazenamento de consumo de quota compartilhada: `sqlite` (padrão) ou `redis`. | | `QUOTA_STORE_REDIS_URL` | _(não definido)_ | `src/lib/quota/storeFactory.ts` | String de conexão do Redis usada quando `QUOTA_STORE_DRIVER=redis` (por exemplo, `redis://localhost:6379`). | | `QUOTA_SATURATION_THRESHOLD` | `0.5` | `src/lib/quota/enforce.ts` | Proporção de saturação do pool (0..1); nesse valor ou acima dele, o pool entra no modo estrito (sem empréstimos). | | `QUOTA_SOFT_DEPRIORITIZE_FACTOR` | `0.7` | `open-sse/services/combo.ts` | Multiplicador de pontuação (0..1) aplicado a um destino quando a política de cota flexível reduz sua prioridade. | | `STATUS_SOFT_DEPRIORITIZE_FACTOR` | `0.5` | `open-sse/services/combo/autoStrategy.ts` | Multiplicador de pontuação (0..1) aplicado a um provedor esgotado (`credits_exhausted`/`rate_limited`) na pontuação do auto-combo quando o corte de cota de pré-verificação está DESATIVADO (#4540). | | `QUOTA_CONSUMPTION_RETENTION_DAYS` | `14` | `src/lib/db/quotaConsumption.ts` | Janela de retenção (em dias) para os buckets de `quota_consumption` antes da coleta de lixo (`gcQuotaConsumption`). | | `QUOTA_PREFLIGHT_CUTOFF_ENABLED` | `false` | `src/lib/resilience/settings.ts` | Ativação opcional (DESATIVADA por padrão): habilita o corte rígido de cota do roteamento automático, que remove candidatos com cota baixa antes da pontuação. Define apenas o valor padrão: um booleano salvo em `resilienceSettings` (Painel → Configurações → Resiliência) tem precedência. | | `OMNIROUTE_AUTO_FREE_FALLBACK_TO_FULL_POOL` | `false` | `open-sse/services/autoCombo/virtualFactory.ts` | Ativação opcional (DESATIVADA por padrão): quando um filtro `auto/:` não corresponde a nenhum candidato conectado, restaura o comportamento legado de usar como fallback o pool completo (sem filtros), em vez de retornar um pool vazio. DESATIVADA por padrão faz com que `:free` signifique "somente o nível gratuito". | | `OMNIROUTE_CHAOS_MAX_PANEL` | `5` | `open-sse/services/autoCombo/virtualFactory.ts` | Limite de tamanho do painel (restringido a 1–10) para a variante de transmissão `auto/*:chaos` — uma solicitação é distribuída para no máximo essa quantidade de modelos de provedores distintos. | | `OMNIROUTE_CHAOS_MIN_PANEL` | _(padrão do mecanismo)_ | `open-sse/services/autoCombo/virtualFactory.ts` | Ajuste do tamanho mínimo do painel encaminhado ao manipulador de transmissão de caos; não definido mantém o padrão do mecanismo. | | `OMNIROUTE_CHAOS_PANEL_TIMEOUT_MS` | _(padrão do mecanismo)_ | `open-sse/services/autoCombo/virtualFactory.ts` | Tempo limite rígido (ms) para toda a distribuição do painel de caos; não definido mantém o padrão do mecanismo. | | `GROK_AUTH_PATH` | `~/.grok/auth.json` | `open-sse/services/grokQuotaFetcher.ts` | Caminho do `auth.json` da CLI do Grok usado para buscar a cota semanal do grok-web; substitua para testes ou para uma instalação não padrão da CLI. | | `AGENTBRIDGE_UPSTREAM_CA_CERT` | _(não definido)_ | `src/mitm/manager.ts` | Certificado de CA adicional (PEM) confiável para conexões TLS upstream do AgentBridge. | | `INSPECTOR_BUFFER_SIZE` | `1000` | `src/mitm/inspector/buffer.ts` | Máximo de solicitações capturadas mantidas no buffer circular do Inspetor de Tráfego. | | `INSPECTOR_MAX_BODY_KB` | `1024` | `src/mitm/inspector/buffer.ts` | Tamanho máximo do corpo da solicitação/resposta capturada (KB) antes do truncamento. | | `INSPECTOR_HTTP_PROXY_PORT` | `8080` | `src/mitm/inspector/httpProxyServer.ts` | Porta local do proxy HTTP do Inspetor de Tráfego. | | `INSPECTOR_HTTP_PROXY_AUTOSTART` | `false` | `src/mitm/inspector/httpProxyServer.ts` | Inicia automaticamente o proxy HTTP do inspetor durante a inicialização. | | `INSPECTOR_LLM_HOSTS_EXTRA` | _(não definido)_ | `src/lib/inspector/captureState.ts` | Nomes de host adicionais (separados por vírgula) tratados como endpoints de LLM para captura. | | `INSPECTOR_MASK_SECRETS` | `true` | `src/mitm/inspector/buffer.ts` | Mascarar segredos (cabeçalhos de autenticação / chaves de API) no tráfego capturado. | | `INSPECTOR_SYSTEM_PROXY_GUARD_MINUTES` | `30` | `src/app/api/tools/traffic-inspector/capture-modes/system-proxy/route.ts` | Minutos até que a proteção do proxy do sistema reverta automaticamente as configurações de proxy do sistema operacional. | | `INSPECTOR_INTERNAL_INGEST_TOKEN` | _(automático)_ | `src/app/api/tools/traffic-inspector/internal/ingest/route.ts` | Token que autentica a ingestão interna de capturas no inspector. | | `PLAYGROUND_COMPARE_MAX_COLUMNS` | `4` | `src/app/(dashboard)/dashboard/playground/` | Número máximo de colunas lado a lado no modo de comparação do Playground. | | `PLAYGROUND_IMPROVE_PROMPT_DEFAULT_MODEL` | _(não definido)_ | `src/app/(dashboard)/dashboard/playground/` | Modelo padrão para a ação “melhorar prompt” do Playground (usa o modelo ativo como alternativa quando não definido). | | `BIFROST_ENABLED` | `1` | `src/app/api/v1/relay/chat/completions/bifrost/route.ts` | Chave mestre de desativação do proxy sidecar do bifrost. Quando definido como `0`, a rota retorna 503 com o cabeçalho `X-Bifrost-Killswitch` e o operador é redirecionado para o caminho TS. Use para desativar o sidecar sem fazer um novo deploy (incidente no roteador de nível 1, rotação de chaves). | | `BIFROST_BASE_URL` | _(não definido)_ | `src/app/api/v1/relay/chat/completions/bifrost/route.ts` | Quando definido, a rota do proxy sidecar Bifrost encaminha o tráfego de `/v1/chat/completions` para este gateway Go em vez do manipulador de relay TS. Não definido → 503 com fallback. A barra final é removida. | | `BIFROST_PORT` | `8080` | `src/lib/services/bootstrap.ts` | Porta à qual o serviço Bifrost incorporado supervisionado se vincula (`127.0.0.1:`) quando o OmniRoute gerencia o ciclo de vida do sidecar do Bifrost. O padrão é `8080`. | | `SINGBOX_PORT` | `20140` | `src/lib/services/bootstrap.ts` | Porta à qual o serviço sing-box incorporado supervisionado se vincula (`127.0.0.1:`) quando o OmniRoute gerencia o ciclo de vida do sidecar do sing-box. O padrão é `20140`. | | `LLMLINGUA_PORT` | `20135` | `src/lib/services/bootstrap.ts` | Porta à qual o serviço de compressão LLMLingua supervisionado se vincula (`127.0.0.1:`). O padrão é `20135`. | | `LLMLINGUA_BASE_URL` | `http://127.0.0.1:20135` | `open-sse/services/compression/engines/llmlingua/index.ts` | URL base do daemon de microsserviço HTTP local de compressão LLMLingua. O padrão é `http://127.0.0.1:20135`. | | `LLMLINGUA_MODEL` | `atjsh/llmlingua-2-js-tinybert-meetingbank` | `src/lib/services/installers/llmlingua.ts` | ID do modelo do Hugging Face que o sidecar LLMLingua supervisionado carrega (passado para o ambiente do processo filho). | | `BIFROST_API_KEY` | _(unset)_ | `src/app/api/v1/relay/chat/completions/bifrost/route.ts` | Chave de API para o gateway Bifrost (enviada como `Authorization: Bearer ...`). Se não definida, a rota espera que a solicitação contenha uma chave de API válida do OmniRoute; essa chave é usada apenas para autenticação no lado do gateway. | | `BIFROST_STREAMING_ENABLED` | `true` | `src/app/api/v1/relay/chat/completions/bifrost/route.ts` | Quando true, a rota do sidecar Bifrost transmite as respostas de volta via SSE pelo gateway, em vez de usar o executor de streaming em TS. Defina como `0` para forçar respostas JSON sem streaming pelo gateway. | | `BIFROST_TIMEOUT_MS` | `30000` | `src/app/api/v1/relay/chat/completions/bifrost/route.ts` | Tempo limite por solicitação ao fazer proxy para o gateway Bifrost (ms). Quando o tempo limite é atingido, a rota retorna o caminho de retransmissão em TS por meio do cabeçalho `X-Bifrost-Fallback`. | | `OMNIROUTE_BIFROST_KEY` | _(unset)_ | `src/app/api/v1/relay/chat/completions/bifrost/route.ts` | Alias para `BIFROST_API_KEY` (usado por scripts que leem o ambiente via `OMNIROUTE_*`). `BIFROST_API_KEY` tem precedência quando ambos estão definidos. | | `OMNIROUTE_RELAY_BACKEND` | `ts` / `auto` | `src/app/api/v1/relay/chat/completions/routingBackend.ts` | Backend de relay para `/api/v1/relay/chat/completions`: `ts \| bifrost \| auto`. `ts` = relay em TypeScript (padrão quando o Bifrost não está configurado); `auto` seleciona o Bifrost quando `BIFROST_BASE_URL` está definido e `BIFROST_ENABLED` ≠ `0`, com fallback automático para TS se o sidecar estiver inacessível; `bifrost` força o Bifrost (estrito, sem fallback). Autenticação/limitação de taxa/proteção contra injeção/lista de permissões sempre são executadas primeiro na rota do Next. As respostas incluem `X-Routing-Backend` / `X-Routing-Fallback` / `X-Routing-Fallback-Reason`. | | `RELAY_ROUTING_BACKEND` | _(unset)_ | `src/app/api/v1/relay/chat/completions/routingBackend.ts` | Alias aceito para `OMNIROUTE_RELAY_BACKEND` (os mesmos valores `ts \| bifrost \| auto`). `OMNIROUTE_RELAY_BACKEND` tem precedência quando ambos estão definidos. | | `OMNIROUTE_BIFROST_FAILURE_COOLDOWN_MS` | `5000` | `src/app/api/v1/relay/chat/completions/bifrostCooldown.ts` | Período de espera (em ms) após uma falha de salto para o sidecar do Bifrost no modo `auto`, antes que o relay tente novamente acessar o sidecar; ele roteia diretamente para o caminho TS enquanto o período de espera durar e, em seguida, testa novamente. `0` desabilita. Aplica-se somente quando `OMNIROUTE_RELAY_BACKEND=auto`. | | `OMNIROUTE_TLS_CERT` | _(unset)_ | `bin/cli/commands/serve.mjs` | Caminho para um certificado TLS PEM para executar `omniroute serve` via HTTPS (equivalente a `--tls-cert`). Deve ser combinado com `OMNIROUTE_TLS_KEY`; o servidor autônomo encerra o TLS no mesmo listener (`wss://` funciona sem alterações). Não definido → HTTP simples. Se apenas um dos arquivos cert/chave for fornecido ou o caminho não puder ser lido, um aviso será registrado e o servidor permanecerá em HTTP. | | `OMNIROUTE_TLS_KEY` | _(unset)_ | `bin/cli/commands/serve.mjs` | Caminho para a chave privada TLS PEM do HTTPS de `omniroute serve` (equivalente a `--tls-key`). Deve ser combinada com `OMNIROUTE_TLS_CERT`. Consulte `OMNIROUTE_TLS_CERT`. | | `OMNIROUTE_LOCAL_ENDPOINTS_ENABLED` | `0` | `src/lib/security/localEndpoints.ts` | Interruptor mestre para as rotas `/api/local/*`. Quando não definido ou definido como `0`, todas as rotas `/api/local/*` retornam 503 em produção. Deve ser `1` em implantações que não usam loopback para habilitar o inicializador do Redis e outros iniciadores de serviços locais com um clique. É uma medida de segurança adicional à classificação de proteção de rotas `isLocalOnlyPath()` (`LOCAL_ONLY_API_PREFIXES` em `src/server/authz/routeGuard.ts`). | | `OMNIROUTE_LOCAL_ENDPOINTS_TOKEN` | _(unset)_ | `src/lib/security/localEndpoints.ts` | Token Bearer para clientes de `/api/local/*` que não estão em loopback (por exemplo, o aplicativo para desktop). Quando definido, as solicitações de IPs que não estão em loopback devem conter `Authorization: Bearer `. Obrigatório quando `OMNIROUTE_LOCAL_ENDPOINTS_ENABLED=1` em implantações que não usam loopback. | | `OMNIROUTE_REDIS_CONTAINER_NAME` | `omniroute-redis` | `bin/cli/commands/redis.mjs` | Nome do contêiner para o iniciador do Redis com 1 clique (`omniroute redis up`). Usado pela CLI e pela interface gráfica `RedisLauncherPanel`. | | `OMNIROUTE_REDIS_HOST_PORT` | `6379` | `bin/cli/commands/redis.mjs` | Porta do host para o iniciador do Redis com 1 clique. Altere se o host já estiver usando a porta 6379. A porta interna do contêiner permanece 6379. | | `OMNIROUTE_REDIS_BIND_HOST` | `127.0.0.1` | `bin/cli/commands/redis.mjs` | Interface do host na qual o iniciador do Redis com 1 clique publica o serviço. O iniciador inicia o Redis SEM uma senha; portanto, vincular a `0.0.0.0` disponibiliza um Redis sem autenticação para todos os hosts da sua LAN — amplie esse vínculo somente se você também definir uma senha na instância por conta própria. | | `REDIS_BIND_HOST` | `127.0.0.1` | `docker-compose.yml` | Interface do host na qual o docker-compose publica o Redis secundário (#9286). O Redis do compose é executado sem `requirepass`; os contêineres da aplicação o acessam pela rede do compose (`redis:6379`) — a porta publicada existe somente para ferramentas no host. `0.0.0.0` expõe um Redis sem autenticação para toda a LAN. | | `REDIS_PORT` | `6379` | `docker-compose.yml` | Porta do host para o Redis secundário do compose. | | `APP_BIND_HOST` | `127.0.0.1` | `docker-compose.yml`, `docker-compose.prod.yml` | Interface do host na qual o docker-compose publica as próprias portas do dashboard, da API e do WS em tempo real da aplicação (#12568). Com `REQUIRE_API_KEY=false` definido como padrão no `.env.example`, `0.0.0.0` expõe o proxy LLM anônimo `/v1` para toda a LAN/WAN — amplie esse vínculo somente depois que `REQUIRE_API_KEY=true` estiver definido ou que um proxy reverso à frente imponha sua própria autenticação. | | `QDRANT_BIND_HOST` | `127.0.0.1` | `docker-compose.yml` | Interface do host na qual o docker-compose publica o serviço secundário de memória do Qdrant (#12578). O mesmo raciocínio de exposição à LAN de `REDIS_BIND_HOST` se aplica. | | `BIFROST_BIND_HOST` | `127.0.0.1` | `docker-compose.yml` | Interface do host na qual o docker-compose publica o serviço secundário do roteador Bifrost (#12578). O mesmo raciocínio de exposição à LAN de `REDIS_BIND_HOST` se aplica. | | `REDIS_KEY_PREFIX` | `omniroute:` | `src/shared/utils/rateLimiter.ts` | Prefixo de namespace aplicado a todas as chaves do OmniRoute no Redis (limitador de taxa, cache de autenticação, armazenamento de cotas, disjuntor de aquecimento). Evita colisões de chaves quando a instância do Redis é compartilhada com outros aplicativos (#11042). | | `OMNIROUTE_INTERNAL_SERVICE_TOKEN` | _(não definido — mecanismo desabilitado)_ | `src/lib/api/internalServiceAuth.ts` | Segredo compartilhado para saltos REST internos que preservam a identidade (#9260): os componentes do OmniRoute que chamam outras rotas locais do OmniRoute o enviam como `x-omniroute-internal-service-token`, para que a identidade do chamador original seja preservada. Comparado com `timingSafeEqual`. | | `OMNIROUTE_INTERNAL_SERVICE_TOKEN_FILE` | _(não definido)_ | `src/lib/api/internalServiceAuth.ts` | Variante baseada em arquivo do segredo do serviço interno: caminho para um arquivo cujo conteúdo, sem espaços em branco nas extremidades, é o token. Consultado somente quando a variável embutida não está definida. | | `OPENROUTER_PROVIDER_STATS_ENABLED` | `true` | `src/lib/catalog/openrouterProviderStats.ts` | Enriquece a lista de provedores do painel com estatísticas semanais de classificação do OpenRouter (#9324). Ativado por padrão; defina como `false` para ignorar completamente a busca em segundo plano (não bloqueante, nunca fatal). | | `OPENROUTER_PROVIDER_STATS_TTL_MS` | `86400000` (24h) | `src/lib/catalog/openrouterProviderStats.ts` | TTL do cache para o snapshot das estatísticas dos provedores do OpenRouter, em milissegundos. | | `OMNIROUTE_REDIS_IMAGE` | `redis:7-alpine` | `bin/cli/commands/redis.mjs` | Imagem do Redis usada pelo iniciador do Redis com um clique. Substitua por `redis:8-alpine` ou por um espelho de registro privado conforme necessário. | | `QDRANT_HOST` | `qdrant` | _(perfil de cluster opcional)_ | Nome do host do sidecar do Qdrant quando `--profile memory` está ativo. O padrão aponta para o nome do serviço qdrant na rede; substitua-o para uma implantação externa. Consumido somente quando `qdrantEnabled` é `true` no código (`src/lib/memory/vectorStore.ts:108`). | | `QDRANT_PORT` | `6333` | _(perfil de cluster opcional)_ | Porta REST do sidecar do Qdrant. | | `QDRANT_GRPC_PORT` | `6334` | _(perfil de cluster opcional)_ | Porta gRPC do sidecar do Qdrant. Usada por bibliotecas de cliente que preferem gRPC em vez de REST para operações de streaming. | | `QDRANT_API_KEY` | _(não definida)_ | _(perfil de cluster opcional)_ | Chave de API opcional para o Qdrant Cloud ou uma instância on-premises autenticada. Vazia → nenhum cabeçalho `api-key` é enviado. | | `QDRANT_COLLECTION` | `omniroute-memory` | _(perfil de cluster opcional)_ | Nome da coleção para os embeddings de memória de conversas do OmniRoute. Criada na primeira execução com dimensões `QDRANT_VECTOR_SIZE`. | | `QDRANT_EMBEDDING_MODEL` | `text-embedding-3-small` | _(perfil de cluster opcional)_ | Nome do modelo de embedding padrão registrado nos metadados da coleção do Qdrant. Os embeddings reais são gerados pelo provedor indicado pelo campo `embeddingModel` nas configurações do OmniRoute. | | `QDRANT_VECTOR_SIZE` | `1536` | _(perfil de cluster opcional)_ | Dimensão do vetor de embedding. Deve corresponder ao modelo usado para gerar o embedding (text-embedding-3-small → 1536; ada-002 → 1536; nomic-embed-text → 768). | | `QDRANT_HNSW_EF_CONSTRUCT` | `128` | _(perfil de cluster opcional)_ | Precisão da construção do índice HNSW. Valor mais alto = criação mais lenta, pesquisa mais rápida. | | `OMNIROUTE_ROTATION_ENABLED` | `true` | `open-sse/services/rotationConfig.ts` | Chave mestra para a rotação de contas configurável pelo operador. Quando `false`, nenhuma das classes `OMNIROUTE_ROTATE_*` abaixo aciona o fallback de conta (o estado de desativação da chave mestra também bloqueia as classes 429/500/502 habilitadas por padrão). Permite que um front-end supervisor (por exemplo, o aplicativo para desktop VibeProxy) replique suas próprias regras de rotação no mecanismo de fallback de contas do back-end. | | `OMNIROUTE_ROTATION_RATE_LIMIT_RESET_SECONDS` | `0` | `open-sse/services/rotationConfig.ts` | Período de espera (em segundos) aplicado a uma conta limitada por taxa quando o upstream não fornece uma indicação explícita de redefinição. `0` = usar o período de espera padrão do mecanismo em vez de uma substituição fixa. | | `OMNIROUTE_ROTATION_DISABLE_TAG_WITHOUT_RESET` | `true` | `open-sse/services/rotationConfig.ts` | Espelho da preferência do front-end “não marcar como limitado por taxa sem um horário de redefinição”. | | `OMNIROUTE_ROTATE_ON_429` | `true` | `open-sse/services/rotationConfig.ts` | Ativação de fallback por status para erros `429`. Quando `false` (e `OMNIROUTE_ROTATION_ENABLED=true`), um `429` não aciona mais a rotação da conta e é retornado ao cliente. | | `OMNIROUTE_ROTATE_429_THRESHOLD` | `1` | `open-sse/services/rotationConfig.ts` | Número de erros `429` dentro de `OMNIROUTE_ROTATE_429_WINDOW_SECONDS` necessário antes que a conta seja alternada. `1` (padrão) alterna imediatamente, preservando o comportamento histórico. | | `OMNIROUTE_ROTATE_429_WINDOW_SECONDS` | `120` | `open-sse/services/rotationConfig.ts` | Janela deslizante (em segundos) durante a qual os erros `429` são contabilizados para `OMNIROUTE_ROTATE_429_THRESHOLD`. | | `OMNIROUTE_ROTATE_ON_500` | `true` | `open-sse/services/rotationConfig.ts` | Ativação de fallback por status para erros de servidor `5xx` (exceto `502`, que possui sua própria classe). Quando `false`, esses erros não acionam mais a rotação da conta. | | `OMNIROUTE_ROTATE_500_THRESHOLD` | `1` | `open-sse/services/rotationConfig.ts` | Número de erros `5xx` dentro de `OMNIROUTE_ROTATE_500_WINDOW_SECONDS` necessário antes que a conta seja alternada. `1` (padrão) alterna imediatamente. | | `OMNIROUTE_ROTATE_500_WINDOW_SECONDS` | `120` | `open-sse/services/rotationConfig.ts` | Janela deslizante (em segundos) durante a qual os erros `5xx` são contabilizados para `OMNIROUTE_ROTATE_500_THRESHOLD`. | | `OMNIROUTE_ROTATE_ON_502` | `true` | `open-sse/services/rotationConfig.ts` | Ativação de fallback por status para erros `502` (gateway inválido). Quando `false`, os erros `502` não acionam mais a rotação da conta. | | `OMNIROUTE_ROTATE_502_THRESHOLD` | `1` | `open-sse/services/rotationConfig.ts` | Número de erros `502` dentro de `OMNIROUTE_ROTATE_502_WINDOW_SECONDS` necessário antes que a conta seja alternada. `1` (padrão) alterna imediatamente. | | `OMNIROUTE_ROTATE_502_WINDOW_SECONDS` | `120` | `open-sse/services/rotationConfig.ts` | Janela deslizante (em segundos) durante a qual os erros `502` são contabilizados para `OMNIROUTE_ROTATE_502_THRESHOLD`. | | `OMNIROUTE_ROTATE_ON_400` | `false` | `open-sse/services/rotationConfig.ts` | Ativação opcional (desativada por padrão): quando `true`, um `400` simples (solicitação inválida) também aciona a alternância da conta. Isso é apenas aditivo — nunca bloqueia o comportamento existente do mecanismo, no qual um `400` contendo texto de limite de taxa/cota ainda causa a alternância independentemente deste sinalizador. | | `OMNIROUTE_ROTATE_400_THRESHOLD` | `1` | `open-sse/services/rotationConfig.ts` | Número de erros `400` dentro de `OMNIROUTE_ROTATE_400_WINDOW_SECONDS` necessário antes que a conta seja alternada (consultado somente quando `OMNIROUTE_ROTATE_ON_400=true`). | | `OMNIROUTE_ROTATE_400_WINDOW_SECONDS` | `120` | `open-sse/services/rotationConfig.ts` | Janela deslizante (em segundos) durante a qual os erros `400` são contabilizados para `OMNIROUTE_ROTATE_400_THRESHOLD`. | ### Agendador de aquecimento do Claude Aquecimento orientado por cron para conexões OAuth da Anthropic que tenham optado pelo recurso, para que a janela de limite de taxa de 5 horas seja aberta por uma solicitação agendada trivial, em vez da primeira solicitação real (#8848). O agendador fica desativado, a menos que `OMNIROUTE_WARMUP_ENABLED` seja avaliada como verdadeira **e** a conexão esteja sinalizada em `settings.claudeWarmup.connections`; uma lista de conexões vazia significa que nada será aquecido, mesmo com a variável de ambiente ativada. | Variável | Padrão | Arquivo de origem | Descrição | | ------------------------------ | ----------------------------- | ---------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `OMNIROUTE_WARMUP_ENABLED` | _(não definido → desativado)_ | `src/lib/warmupScheduler.ts` | Chave mestre do agendador de aquecimento. Aceita `1`/`true`/`yes`/`on` (sem distinção entre maiúsculas e minúsculas, com espaços removidos). Qualquer outro valor, ou a ausência da variável, mantém o agendador desativado. | | `OMNIROUTE_WARMUP_CRON` | `0 7 * * *` | `src/lib/warmupScheduler.ts` | Expressão cron de cinco campos para o ciclo de aquecimento, avaliada em `America/Los_Angeles` (fuso horário de redefinição da Anthropic), independentemente do relógio do host. | | `OMNIROUTE_WARMUP_CONCURRENCY` | `3` | `src/lib/warmupScheduler.ts` | Quantidade de conexões aquecidas em paralelo por ciclo. Limitada a `1`-`10`; um valor não numérico volta para `3`. | | `OMNIROUTE_WARMUP_MODEL` | `claude-3-5-haiku-20241022` | `src/lib/warmupScheduler.ts` | Modelo usado para a solicitação de aquecimento. Substitua somente se o padrão não estiver disponível no seu plano; escolha o modelo mais barato que ainda abra a janela. | ### Sessões VNC de login no navegador e alias de diretório de dados Chromium+VNC em contêiner usado para a captura interativa de credenciais de login no navegador (`/api/vnc-session`), além de um alias legado `DATA_DIR`. Tudo é opcional — os padrões do VNC apontam para a imagem incluída `omniroute-vnc-chromium:local` e só são substituídos para usar uma imagem de contêiner personalizada, portas personalizadas ou ajustar o ciclo de vida. | Variável | Padrão | Arquivo de origem | Descrição | | ------------------------------------- | ------------------------------------------------------------------------ | ------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `OMNIROUTE_VNC_IMAGE` | `omniroute-vnc-chromium:local` | `src/lib/vncSession/manifest.ts` | Tag da imagem Docker para o contêiner de login Chromium+VNC. Compile `docker/vnc-browser/chromium` ou aponte isto para uma imagem personalizada. | | `OMNIROUTE_DOCKER_BIN` | `docker` | `src/lib/vncSession/manifest.ts` | Binário do runtime de contêiner usado para iniciar o contêiner VNC (por exemplo, defina como `podman`). | | `OMNIROUTE_VNC_CONTAINER_VNC_PORT` | `3000` | `src/lib/vncSession/manifest.ts` | Porta VNC/noVNC exposta dentro do contêiner. | | `OMNIROUTE_VNC_CONTAINER_CDP_PORT` | `9223` | `src/lib/vncSession/manifest.ts` | Porta do Chrome DevTools Protocol dentro do contêiner. | | `OMNIROUTE_VNC_CONTAINER_PROFILE_DIR` | `/config` | `src/lib/vncSession/manifest.ts` | Caminho do diretório de perfil do Chromium dentro do contêiner. | | `OMNIROUTE_VNC_PROFILE_DIR` | `$HOME/.omniroute/browser-login-profiles` | `src/lib/vncSession/manifest.ts` | Diretório do host que contém os perfis de login do navegador persistidos. | | `OMNIROUTE_VNC_IDLE_MS` | `600000` (10 min) | `src/lib/vncSession/manifest.ts` | Tempo limite de inatividade (ms) antes que uma sessão VNC inativa seja encerrada. | | `OMNIROUTE_VNC_MAX_MS` | `1800000` (30 min) | `src/lib/vncSession/manifest.ts` | Limite máximo (ms) para a duração de uma única sessão VNC. | | `OMNIROUTE_VNC_MAX_SESSIONS` | `4` | `src/lib/vncSession/manifest.ts` | Número máximo de sessões VNC simultâneas. | | `OMNIROUTE_VNC_READY_MS` | `45000` | `src/lib/vncSession/manifest.ts` | Tempo limite (ms) de espera para que o navegador em contêiner fique pronto para CDP. | | `OMNIROUTE_VNC_HARVEST_MS` | `20000` | `src/lib/vncSession/manifest.ts` | Tempo limite (ms) para coletar a sessão/os cookies capturados após a conclusão do login. | | `OMNIROUTE_VNC_CHROMIUM_ARGS` | `--remote-debugging-port=9222 --no-first-run --no-default-browser-check` | `src/lib/vncSession/manifest.ts` | Flags adicionais de linha de comando passadas ao Chromium em contêiner. | | `OMNIROUTE_VNC_NETWORK` | `omniroute-vnc-browser-login` | `src/lib/vncSession/manifest.ts` | Rede Docker dedicada à qual o contêiner de login VNC se conecta (#12571), em vez da bridge padrão, para que contêineres irmãos não possam alcançar sua porta de bridge CDP. | | `VIBEPROXY_DATA_DIR` | _(não definido)_ | `open-sse/services/notionThreadSessions.ts` | **Alias legado** para `DATA_DIR`, verificado somente depois que `DATA_DIR` e `OMNIROUTE_DATA_DIR` não estiverem definidos. Localiza o cache de sessões de threads web do Notion (`/notion-web-thread-sessions.json`). | --- ## 26. Teste e chicote de fios E2E Usado por `scripts/dev/run-next-playwright.mjs`, `scripts/dev/smoke-electron-packaged.mjs`, `scripts/dev/run-ecosystem-tests.mjs` e `scripts/build/uninstall.mjs`. Deixe todos os valores abaixo não definidos nas implantações de produção. | Variável | Padrão | Arquivo de origem | Descrição | | -------------------------------------- | ------------------------------ | ----------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `OMNIROUTE_E2E_BOOTSTRAP_MODE` | `auth` | `scripts/dev/run-next-playwright.mjs` | modo de inicialização E2E (`auth`, `fresh`, `reuse`) para o executor Playwright. | | `OMNIROUTE_E2E_PASSWORD` | volta para `INITIAL_PASSWORD` | `scripts/dev/run-next-playwright.mjs` | Senha de administrador injetada no ambiente Playwright. | | `OMNIROUTE_DISABLE_LOCAL_HEALTHCHECK` | `true` | `scripts/dev/run-next-playwright.mjs` | Desative a pesquisa de verificação de integridade local durante as execuções Playwright. | | `OMNIROUTE_DISABLE_TOKEN_HEALTHCHECK` | `true` | `scripts/dev/run-next-playwright.mjs` | Desative o loop de verificação de integridade do token OAuth durante os testes. | | `OMNIROUTE_HEALTHCHECK_SKIP_PROVIDERS` | _(desativado)_ | `src/lib/tokenHealthCheck.ts` | Provedores separados por vírgula excluídos da varredura proativa de atualização de token (por exemplo, `codex,openai`). Alternativa direcionada para desabilitar totalmente os provedores de verificação de saúde — short-TTL continuam atualizando enquanto os provedores em cascata permanecem apenas reativos. | | `OMNIROUTE_HIDE_HEALTHCHECK_LOGS` | `true` | `scripts/dev/run-next-playwright.mjs` | Silencie o ruído da verificação de integridade no Playwright stdout. | | `OMNIROUTE_PLAYWRIGHT_SKIP_BUILD` | `0` | `scripts/dev/run-next-playwright.mjs` | Ignore a construção de produção Next.js antes do início Playwright (otimização CI ). | | `OMNIROUTE_SKIP_UNINSTALL_HOOK` | `0` | `scripts/build/uninstall.mjs` | Ignore o gancho de desinstalação OmniRoute (usado pelo CI para manter `node_modules` intacto). | | `ECOSYSTEM_SERVER_WAIT_MS` | `180000` | `scripts/dev/run-ecosystem-tests.mjs` | Tempo de espera (ms) para que o servidor fique íntegro antes de executar testes ecosystem/protocol. | | `ELECTRON_SMOKE_URL` | `http://127.0.0.1:20128/login` | `scripts/dev/smoke-electron-packaged.mjs` | URL o equipamento de fumaça Electron espera que o aplicativo empacotado seja veiculado. | | `ELECTRON_SMOKE_TIMEOUT_MS` | `45000` | `scripts/dev/smoke-electron-packaged.mjs` | Tempo limite total (ms) antes que o chicote de fumaça ceda. | | `ELECTRON_SMOKE_SETTLE_MS` | `2000` | `scripts/dev/smoke-electron-packaged.mjs` | Janela de liquidação (ms) após o carregamento da página. | | `ELECTRON_SMOKE_APP_EXECUTABLE` | _(auto)_ | `scripts/dev/smoke-electron-packaged.mjs` | Caminho explícito para o executável Electron empacotado. | | `ELECTRON_SMOKE_DATA_DIR` | _(tmpdir)_ | `scripts/dev/smoke-electron-packaged.mjs` | Diretório de dados para a execução do Electron smoke. | | `ELECTRON_SMOKE_KEEP_DATA` | `0` | `scripts/dev/smoke-electron-packaged.mjs` | Defina `1` para preservar o diretório de dados do smoke após a execução. | | `ELECTRON_SMOKE_STREAM_LOGS` | `0` | `scripts/dev/smoke-electron-packaged.mjs` | Configure `1` para transmitir logs Electron para stdout durante a execução. | | `ELECTRON_SMOKE_COLD_RESTART` | `0` | `scripts/dev/smoke-electron-packaged.mjs` | #7592: reinicie no mesmo diretório de dados e afirme que a segunda inicialização seleciona o driver SQLite nativo. | | `CLI_DEVIN_BIN` | _(pesquisa PATH )_ | `open-sse/executors/devin-cli.ts` | Substitua o caminho binário Devin CLI. | ### Pipeline de tradução de documentos Usado por `scripts/i18n/run-translation.mjs` (o comando `npm run i18n:run` ). Todas as seis variáveis não são definidas por padrão. — configure-as em `.env` apenas em máquinas que devem ser capazes de executar o tradutor de documentos. | Variável | Padrão | Arquivo de origem | Descrição | | ------------------------------------------ | -------------- | ----------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `OMNIROUTE_TRANSLATION_API_URL` | _(desativado)_ | `scripts/i18n/run-translation.mjs` | Base URL compatível com OpenAI para o back-end de tradução. | | `OMNIROUTE_TRANSLATION_API_KEY` | _(desativado)_ | `scripts/i18n/run-translation.mjs` | Token de portador para o back-end de tradução (nunca registrado). | | `OMNIROUTE_TRANSLATION_MODEL` | _(desativado)_ | `scripts/i18n/run-translation.mjs` | ID do modelo, por exemplo, `gpt-4o-mini` ou `cx/gpt-5.4-mini`. | | `OMNIROUTE_TRANSLATION_FALLBACK_MODELS` | _(desativado)_ | `scripts/i18n/lib/translate-backend.mjs` | Cadeia de modelos separada por vírgula opcional tentada em ordem quando o modelo primário falha (cota 429, 401/402, 5xx, tempo limite, rede); uma solicitação malformada (400/413/422) não é repetida em outro lugar. | | `OMNIROUTE_TRANSLATION_TIMEOUT_MS` | `60000` | `scripts/i18n/run-translation.mjs` | Tempo limite por solicitação em milissegundos. | | `OMNIROUTE_TRANSLATION_REASONING_EFFORT` | _(desativado)_ | `scripts/i18n/lib/translate-backend.mjs` | Controle de raciocínio opcional, enviado como está para o back-end quando definido. | | `OMNIROUTE_TRANSLATION_CONCURRENCY` | `4` | `scripts/i18n/run-translation.mjs` | Solicitações de tradução paralela ao executar vários arquivos/localidades. | | `OMNIROUTE_TRANSLATION_ENGINE` | `llm` | `scripts/i18n/run-translation.mjs` | `llm` usa o backend acima; `google` é traduzido por meio do mecanismo Google com estrutura segura e não precisa de nenhuma das variáveis LLM. | | `OMNIROUTE_TRANSLATION_GOOGLE_FALLBACK` | `1` | `scripts/i18n/run-translation.mjs` | Com o mecanismo `llm`, um pedaço que o modelo não conseguiu produzir (a proteção de saída falhou em todas as tentativas ou um erro do modelo) é traduzido por Google em vez de falhar no código do idioma. `0` o desativa. | | `OMNIROUTE_TRANSLATION_GOOGLE_API_KEY` | _(desativado)_ | `scripts/i18n/lib/google-translate.mjs` | Chave opcional do Cloud Translation v2. Unset usa o endpoint web sem chave (taxa limitada, adequado para ondas ocasionais). | | `OMNIROUTE_TRANSLATION_GOOGLE_CONCURRENCY` | `6` | `scripts/i18n/lib/google-translate.mjs` | Solicitações Google paralelas compartilhadas por cada localidade de uma execução. | | `OMNIROUTE_TRANSLATION_GOOGLE_TIMEOUT_MS` | `30000` | `scripts/i18n/lib/google-translate.mjs` | Tempo limite por solicitação para o mecanismo Google, em milissegundos. | | `UI_KIT_READ_TOKEN` | _(desativado)_ | `scripts/check/check-ui-kit-upstream.mjs` | Token somente leitura para o repositório upstream privado UI kit, usado pelo `npm run check:ui-kit-upstream` e pelo fluxo de trabalho semanal "UI Kit upstream watch". Localmente, a verificação usa suas credenciais do git. | --- ## 27. Feed de radar (auto-hospedagem) Complemento opcional controlado pelo sinalizador de recurso RADAR_ENABLED (o padrão é — um sinalizador de recurso alternado via Settings/DB, não um env var; consulte [docs/frameworks/RADAR.md](../frameworks/RADAR.md#flag-radar_enabled-default-off) ). As primeiras quatro variáveis abaixo são substituições opcionais para um feed auto-hospedado ou bifurcado e fluxos de chave de apoiador. O quinto, `RADAR_ADMIN_URL`, é um link separado e livre de padrões para o painel de operações privado do proprietário. Consulte [docs/frameworks/RADAR.md](../frameworks/RADAR.md) para obter o documento completo do módulo e sua [ativação ponta a ponta e sequência de configuração guiada](../frameworks/RADAR.md#end-to-end-activation-and-guided-setup). O leitor de anúncio Home/Changelog genérico não é configurado por uma variável de ambiente e não depende do sinalizador de recurso RADAR_ENABLED. Ele lê o repositório público `news.json` URL declarado em `src/shared/utils/releaseNotes.ts` apenas pelo GET ; dispensa IDs permanece no armazenamento local do navegador. | Variável | Padrão | Arquivo de origem | Descrição | | ----------------------------- | -------------------------------------------- | ------------------------------------------------------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `RADAR_FEED_URL` | `https://radar.omniroute.online` | `src/lib/radar/{sync,referralsSync,offersSync,intelSync}.ts` | Base URL compartilhada pelo catálogo assinado separadamente, referências, ofertas de apoiadores e feeds da Intel. Substitua para apontar para um serviço auto-hospedado ou bifurcado. | | `RADAR_FEED_PUBKEY` | _(chave padrão fixada)_ | `src/lib/radar/pinnedKeys.ts` | Chave pública Ed25519 (base64-DER SPKI ou PEM) usada para verificar assinaturas de feed de um feed personalizado. | | `RADAR_CONTRIBUTOR_CLAIM_URL` | `https://radar.omniroute.online/auth/github` | `src/lib/radar/links.ts` | URL o botão do painel "Sou um contribuidor" é aberto (GitHub OAuth fluxo de reivindicação da chave de suporte). | | `RADAR_SUPPORTER_PLANS_URL` | `https://radar.omniroute.online/planos` | `src/lib/radar/links.ts` | URL o botão do painel "Apoiar o projeto" é aberto (página payment/plans ). | | `RADAR_ADMIN_URL` | _(desativado)_ | `src/lib/radar/links.ts` | Link do painel de operações privado exclusivo do proprietário. HTTPS é necessário, exceto para um loopback HTTP SSH forward; valores não definidos ou inválidos não criam nenhum item de navegação. | --- ## Auditoria: variáveis removidas/mortas As seguintes variáveis apareceram em versões anteriores do `.env.example`, mas foram** sem referências de tempo de execução** na base de código atual. Eles foram removidos: | Variável | Razão | | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------- | | `STORAGE_DRIVER=sqlite` | Nunca leia nenhum arquivo de origem. SQLite é o único driver suportado. — nenhuma seleção é necessária. | | `INSTANCE_NAME=omniroute` | Presente em modelos docs/env antigos, mas não utilizado em tempo de execução. Pode retornar em um futuro recurso de múltiplas instâncias. | | `SQLITE_MAX_SIZE_MB=2048` | Não referenciado no código-fonte. O tamanho do banco de dados não é limitado artificialmente. | | `SQLITE_CLEAN_LEGACY_FILES=true` | Não referenciado no código-fonte. A limpeza legada provavelmente foi removida. | | `CLI_ROO_BIN` | Não registrado em `src/shared/services/cliRuntime.ts`. | | `CLI_KIMI_CODING_BIN` | Não registrado em `src/shared/services/cliRuntime.ts` (a codificação Kimi usa OAuth, não um binário CLI ). | | `IFLOW_OAUTH_CLIENT_ID` / `IFLOW_OAUTH_CLIENT_SECRET` | Não referenciado em nenhum lugar do código-fonte. | | `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` | Removido na v3.8.0. O tempo de execução não lê mais essas credenciais env vars — provenientes do Dashboard / `data/provider-credentials.json` /crypto DB. | | `CURSOR_PROTOBUF_DEBUG` | Removido na v3.8.0. O executor Cursor usa `CURSOR_DEBUG` / `CURSOR_STREAM_DEBUG` (ver §22). | | `CLI_COMPAT_KIRO` | Removido na v3.8.0. Kiro está em `CLI_COMPAT_OMITTED_PROVIDER_IDS` — sua alternância não tem efeito. | | `QIANFAN_API_KEY` | Removido junto com outros stubs de chave API do provedor não utilizados na v3.8.0. | ### Correções de valor padrão | Variável | Valor `.env.example` antigo | Padrão de código real | Fixo | | ------------------------- | --------------------------- | --------------------- | ------------------------------------------------------- | | `APP_LOG_RETENTION_DAYS` | `90` | `7` | ✅ Removido valor enganoso; `7` documentado como padrão | | `CALL_LOG_RETENTION_DAYS` | `90` | `7` | ✅ Removido valor enganoso; `7` documentado como padrão | ### regeneração de configuração OpenCode (ferramentas ad-hoc) Usado por `scripts/ad-hoc/regen-opencode-config.ts` para regenerar um `opencode.json` com valores `limit.context` e `limit.output` precisos extraídos da instância OmniRoute em execução. Nenhum deles é necessário para a operação normal — o script é apenas uma ferramenta de desenvolvedor. | Variável | Padrão | Arquivo de origem | Descrição | | ------------------ | ------------------------ | ----------------------------------------- | --------------------------------------------------------------------------------------------------------------------------- | | `OMNIROUTE_URL` | `http://localhost:20128` | `scripts/ad-hoc/regen-opencode-config.ts` | Base URL da instância OmniRoute para consultar `/v1/models`. | | `OMNIROUTE_KEY` | _(desativado)_ | `scripts/ad-hoc/regen-opencode-config.ts` | Chave API para autenticação no endpoint OmniRoute `/v1/models`. Volta para `OPENCODE_API_KEY` quando não definido. | | `OPENCODE_API_KEY` | _(desativado)_ | `scripts/ad-hoc/regen-opencode-config.ts` | Chave API estilo OpenCode (`sk-...`) escrita no `opencode.json` regenerado. Volta para `OMNIROUTE_KEY` quando não definido. | ### Chicote de avaliação offline de compressão (ferramentas ad-hoc) Usado por `scripts/compression-eval/index.ts`, a avaliação de compactação offline CLI. Não é necessário apenas para operação normal, apenas ferramentas de desenvolvedor —. | Variável | Padrão | Arquivo de origem | Descrição | | ---------------------------- | ------------ | ----------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `OMNIROUTE_EVAL_CREDENTIALS` | `{}` (vazio) | `scripts/compression-eval/index.ts` | Credenciais JSON fornecidas pelo operador para o provedor exercido pelo CLI de avaliação de compactação offline (analisado com `JSON.parse`). Deixe desativado para uma simulação. | ### Sessões do navegador VNC Usado por `src/lib/vncSession/manifest.ts` para configurar sessões headless do Chromium baseadas em Docker para provedores de automação de navegador. Todos os padrões — opcionais mostrados abaixo. | Variável | Padrão | Arquivo de origem | Descrição | | ------------------------------------- | ------------------------------ | ------------------------------------------- | -------------------------------------------------------------------------------- | | `OMNIROUTE_DOCKER_BIN` | `docker` | `src/lib/vncSession/manifest.ts` | Caminho para o binário Docker usado para gerar contêineres VNC. | | `OMNIROUTE_VNC_IMAGE` | `omniroute-vnc-chromium:local` | `src/lib/vncSession/manifest.ts` | Imagem Docker para o contêiner VNC Chromium. | | `OMNIROUTE_VNC_CHROMIUM_ARGS` | _(sinalizadores integrados)_ | `src/lib/vncSession/manifest.ts` | Argumentos extras do Chromium CLI passados para o navegador dentro do contêiner. | | `OMNIROUTE_VNC_CONTAINER_VNC_PORT` | `3000` | `src/lib/vncSession/manifest.ts` | porta VNC dentro do contêiner. | | `OMNIROUTE_VNC_CONTAINER_CDP_PORT` | `9223` | `src/lib/vncSession/manifest.ts` | Porta do protocolo Chrome DevTools dentro do contêiner. | | `OMNIROUTE_VNC_CONTAINER_PROFILE_DIR` | `/config` | `src/lib/vncSession/manifest.ts` | Diretório de perfil dentro do contêiner. | | `OMNIROUTE_VNC_PROFILE_DIR` | _(desativado)_ | `src/lib/vncSession/manifest.ts` | Diretório do lado do host para perfis de navegador persistentes. | | `OMNIROUTE_VNC_IDLE_MS` | `600000` | `src/lib/vncSession/manifest.ts` | Tempo limite de inatividade (ms) antes que uma sessão VNC seja coletada. | | `OMNIROUTE_VNC_MAX_MS` | `1800000` | `src/lib/vncSession/manifest.ts` | Duração máxima da sessão (ms). | | `OMNIROUTE_VNC_MAX_SESSIONS` | `4` | `src/lib/vncSession/manifest.ts` | Máximo de sessões VNC simultâneas. | | `OMNIROUTE_VNC_READY_MS` | `45000` | `src/lib/vncSession/manifest.ts` | Tempo limite de prontidão do navegador (ms). | | `OMNIROUTE_VNC_HARVEST_MS` | `20000` | `src/lib/vncSession/manifest.ts` | tempo limite Harvest/cleanup (ms). | | `OMNIROUTE_VNC_NETWORK` | `omniroute-vnc-browser-login` | `src/lib/vncSession/manifest.ts` | Rede Docker dedicada à qual o contêiner se junta (#12571), fora da ponte padrão. | | `VIBEPROXY_DATA_DIR` | _(desativado)_ | `open-sse/services/notionThreadSessions.ts` | Diretório para persistência de sessão de thread Notion. | ### Autenticação de serviço interno | Variável | Padrão | Descrição | | --------------------------------------- | ------ | --------------------------------------------------------------------------------------------------------------------------- | | `OMNIROUTE_INTERNAL_SERVICE_TOKEN` | – | Token embutido para autenticação de serviço a serviço no plano de gerenciamento. | | `OMNIROUTE_INTERNAL_SERVICE_TOKEN_FILE` | – | Caminho para um arquivo que contém o token de serviço interno (preferencial em contêineres; substitui a variável embutida). | ### estatísticas do provedor OpenRouter | Variável | Padrão | Descrição | | ----------------------------------- | --------- | ----------------------------------------------------------------------------------------------------------------- | | `OPENROUTER_PROVIDER_STATS_ENABLED` | `true` | Defina como `false` para ignorar a busca de estatísticas OpenRouter por provedor para enriquecimento de catálogo. | | `OPENROUTER_PROVIDER_STATS_TTL_MS` | `3600000` | Cache TTL (ms) para as estatísticas do provedor OpenRouter buscadas. | ### Ligação Redis incorporada | Variável | Padrão | Descrição | | --------------------------- | ----------- | ------------------------------------------------------------------------------- | | `REDIS_BIND_HOST` | `127.0.0.1` | Endereço de ligação para o serviço Redis integrado. | | `REDIS_PORT` | `6379` | Porta para o serviço Redis integrado. | | `OMNIROUTE_REDIS_BIND_HOST` | – | Substituição no escopo do OmniRoute para o endereço de ligação Redis integrado. | --- ## 24. Lançamento de adições v3.8.50 Essas configurações foram introduzidas após o instantâneo anterior do contrato ambiental. | Variável | Padrão | Arquivo de origem | Descrição | | ------------------------------------------- | -------------------------------------- | ---------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `OMNIROUTE_CHAT_ADMISSION_QUEUE_MS` | `2000` | `src/shared/middleware/chatBodyAdmission.ts` | Espera máxima por um slot de admissão de bate-papo pesado antes de uma nova tentativa `503`; uma espera curta e limitada serializa rajadas de agente em vez de um `503` instantâneo. `0` restaura a rejeição imediata. | | `OMNIROUTE_CHAT_ADMISSION_MAX_QUEUED_BYTES` | `4194304` (4 MB) | `src/shared/middleware/chatBodyAdmission.ts` | Orçamento de bytes em fila para a espera de admissão: limita o total de bytes do corpo em buffer estacionados em todo o processo para que a espera não possa amplificar o heap (#4380). As esperas acima do orçamento recebem um `503` repetível imediatamente. | | `OMNIROUTE_CHAT_VIRTUAL_TTL_MS` | `60000` (60s) | `src/shared/middleware/chatBodyAdmission.ts` | Modo autônomo obsoleto desde #10110: as faixas de admissão por sessão foram removidas em favor de um orçamento para todo o processo. Aceito para compatibilidade de configuração; ignorado. | | `OMNIROUTE_CHAT_VIRTUAL_MAX_SESSIONS` | `64` | `src/shared/middleware/chatBodyAdmission.ts` | Modo autônomo obsoleto desde #10110: as faixas de admissão por sessão foram removidas em favor de um orçamento para todo o processo. Aceito para compatibilidade de configuração; ignorado. | | `OMNIROUTE_CHAT_VIRTUAL_LANES` | `0` (desligado) | `open-sse/services/admission/runtime.ts` | Faixas de admissão virtual de tempo de execução adaptativo (#9654): switch mestre para o portão adaptativo por locatário (sistema 2). Distinto dos vars de pista por conexão obsoletos acima (TTL_MS / MAX_SESSIONS, sem operação desde # 10110). Sinalizador de recurso do painel com o mesmo nome; o env var vence a substituição do painel; requer reinicialização. | | `OMNIROUTE_RUNNOW_TIMEOUT_MS` | `30000` | `src/app/api/jobs/[id]/run-now/route.ts` | Limita quanto tempo uma chamada run-now aguarda por um trabalho em andamento antes de iniciar a execução na fila. | | `ADOBE_FIREFLY_BROWSER_REFRESH` | habilitado | `open-sse/services/adobeFireflySession.ts` | Mantém o estado IMS e de risco do navegador atualizado por meio de sessões CDP do Chrome no escopo da conta; defina `0` para desabilitar. | | `ADOBE_FIREFLY_SESSION_DISK` | habilitado | `open-sse/services/adobeFireflySession.ts` | Persiste sessões reparadas da Adobe em `DATA_DIR`; defina `0` para estado somente de memória. | | `ADOBE_FIREFLY_MIN_SUBMIT_GAP_MS` | `12000` | `open-sse/services/adobeFireflySession.ts` | Espaçamento mínimo entre os envios gerados pelo Adobe Firefly. | | `ADOBE_FIREFLY_BATCH_EXTRA_GAP_MS` | `15000` | `open-sse/services/adobeFireflySession.ts` | Período extra silencioso após cada terceiro envio bem-sucedido da Adobe. | | `ADOBE_FIREFLY_CHROME_HEADLESS` | `0` | `open-sse/services/adobeFireflyBrowserLogin.ts` | Modo true-headless somente de depuração; O Adobe Colligo normalmente rejeita a sessão de risco resultante. | | `CHROME_PATH` | detecção automática | `open-sse/executors/cloudflare-playground.ts`, `open-sse/executors/chatgpt-web-codex.ts` | Executável absoluto opcional do Chrome usado pelos executores acionados pelo navegador quando a detecção automática da plataforma é insuficiente. | | `TELEGRAM_BOT_TOKEN` | _(desativado)_ | `src/lib/telegram/config.ts` | Token BotFather que ativa o webhook de entrada e assina o Mini App `initData`. | | `TELEGRAM_WEBHOOK_SECRET` | _(desativado)_ | `src/lib/telegram/config.ts` | Segredo compartilhado registrado via `setWebhook` e verificado no cabeçalho `X-Telegram-Bot-Api-Secret-Token` em cada entrega de webhook. Obrigatório para o caminho do webhook; unset significa que as entregas do webhook foram recusadas com 503. | | `TELEGRAM_DEFAULT_MODEL` | `auto/chat` | `src/lib/telegram/chatProxy.ts` | Modelo usado para respostas de chat Telegram. | | `TELEGRAM_BOT_API_BASE` | `https://api.telegram.org` | `src/lib/telegram/config.ts` | Substituição do Bot API base URL para proxies ou servidores Bot API auto-hospedados. | | `TELEGRAM_WEBHOOK_TIMEOUT_MS` | `60000` | `src/lib/telegram/config.ts` | Tempo limite em milissegundos para chamadas de saída do Bot API. | | `TELEGRAM_USER_ALLOWLIST_ENABLED` | `false` | `src/lib/telegram/config.ts` | Defina como `true` para atender apenas os usuários Telegram listados em `TELEGRAM_ALLOWED_USER_IDS` (outros: Mini App 403, mensagem de webhook descartada). Desativado por padrão: cada usuário Telegram é atendido e recebe uma chave API cunhada que gasta a cota upstream. | | `TELEGRAM_ALLOWED_USER_IDS` | _(desativado)_ | `src/lib/telegram/config.ts` | IDs de usuário Telegram numéricos separados por vírgula exibidos quando `TELEGRAM_USER_ALLOWLIST_ENABLED=true`. As entradas que não são números inteiros positivos simples são ignoradas com um aviso único. Ignorado enquanto a lista de permissões está desativada; vazio com a lista de permissões ativada não serve a ninguém. | | `OMNIROUTE_OPTIONAL_PACK_TAR` | `1` (habilitado) | `scripts/build/optionalPackStaging.mjs` | Configure `0` para ignorar a emissão de tarballs `.tar.gz` enquanto prepara pacotes ML/browser opcionais para a árvore autônoma Electron (diretórios de pacotes e `optional-packs.index.json` ainda são produzidos). Usado pelo fluxo de trabalho de versão para desktop para reduzir o tamanho do upload do artefato. | | `GROK_SUBSCRIPTION_IMAGES_ENABLED` | `false` | `open-sse/config/imageRegistry.ts` | Permite o registro das rotas de imagem de assinatura xAI ; desabilitado por padrão para que o caminho da imagem da chave de API permaneça inalterado. | | `OMNIROUTE_API_KEY_COOLDOWN_MS` | `60000` | `open-sse/services/apiKeyRotator.ts` | Tempo de espera por chave em milissegundos quando uma resposta `429` não tem nenhuma dica `Retry-After` utilizável. | | `OMNIROUTE_ESTIMATOR_CALIBRATION` | habilitado | `open-sse/services/estimatorCalibration.ts` | Defina como `off`, `0` ou `false` para desativar a gravação e aplicação de calibração do estimador na memória. | | `NEXT_MANUAL_SIG_HANDLE` | _(interno)_ | `scripts/dev/standalone-server-ws.mjs` | Substituição interna do manipulador de sinal do servidor autônomo; normalmente definido e limpo pelo lançador em vez de configurado pelos operadores. | | `CHATGPT_WEB_TURN_TIMEOUT_MS` | `180000` | `open-sse/utils/chatgptWebExecutorAdapter.ts` | Teto por turno para um turno de texto ChatGPT Web (Sala Limpa); valores abaixo de `1000` são ignorados. | | `CHATGPT_WEB_TOOL_TURN_TIMEOUT_MS` | `180000` | `open-sse/utils/chatgptWebExecutorAdapter.ts` | Teto por turno para um turno ChatGPT Web (Sala Limpa) que carrega ferramentas de cliente (envelope `` emulado); abaixe-o para devolver o controle ao cliente mais cedo. Valores abaixo de `1000` são ignorados. | | `CHATGPT_WEB_HEADLESS` | `1` (sem cabeça) | `open-sse/utils/chatgptWebExecutorAdapter.ts` | Execute o navegador ChatGPT Web (Sala Limpa) sem cabeça. Defina `0` apenas para contas cujo desafio primário rejeita o modo headless (o padrão mudou de headless para headless em #14948). | | `CHATGPT_WEB_BROWSER_ACQUIRE_TIMEOUT_MS` | `45000` | `open-sse/utils/chatgptWebExecutorAdapter.ts` | Limite máximo para iniciar o navegador ChatGPT Web (Sala Limpa) e aquecer chatgpt.com, para que um navegador ou sessão inoperante não possa consumir o prazo da fila de solicitações. | | `UI_KIT_CLONE` | `_references/cheaper-inference-ui-kit` | `scripts/check/check-ui-kit-snapshot.mjs` | Caminho do kit CI UI privado para clonar o portão de snapshot do fornecedor comparando `packages/ui-kit/src` com (KEA-7886); o portão salta com um aviso quando o clone está ausente. | ### ChatGPT Web (Codex) Padrões globais para o navegador headless e o túnel de ferramentas expandido. Im Dashboard gesetzte Connection-Werte haben Vorrang. | Variável | Padrão | Arquivo de origem | Descrição | | --------------------------------------- | ------------------------------ | -------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `CHATGPT_WEB_CODEX_CHROME_PATH` | _(detecção automática)_ | `open-sse/executors/chatgpt-web-codex.ts` | Explique Chrome-/Chromium-Pfad para npm-, systemd- e PM2-Betrieb. | | `CHROME_PATH` | _(detecção automática)_ | `open-sse/executors/chatgpt-web-codex.ts` | Gemeinsamer Fallback para um Chrome-/Chromium-Pfad. explícito | | `CHATGPT_WEB_CODEX_CDP_URL` | _(desativado)_ | `open-sse/executors/chatgpt-web-codex.ts` | Interno CDP-Endpunkt; Docker usa o Sidecar no Porto `9223`. | | `CHATGPT_WEB_CODEX_USE_CDP_PROFILE` | _(desativar — )_ | `open-sse/vendor/codex-chatgpt-web/persistent-cdp-context.ts` | Defina como `1` (com um endpoint CDP configurado) para reutilizar a página ChatGPT existente do perfil do navegador conectado e gerenciado externamente em vez de um contexto isolado por turno; também limita as guias ChatGPT simultâneas em 1. Desativado por padrão. Consulte [perfil CDP persistente](../guides/CHATGPT-WEB-PERSISTENT-CDP.md). | | `CDP_PROXY_TOKEN` | _(desativado)_ | `docker/chatgpt-web-codex-browser/cdp-proxy.mjs` | Se for obtido, você deve fazer a transferência e o CDP-Proxy-Sidecar neste lugar no cabeçalho `X-Omni-Cdp-Token` mitschicken (#13679). Ohne Wert deut der Proxy unauthentifiziert weiter — dann schützt nur die Netzisolierung des Compose-Netzes `chatgpt-web-codex-net`. Erzeugen com `openssl rand -hex 32`. | | `CHATGPT_WEB_CODEX_TUNNEL_ID` | _(desativado)_ | `open-sse/executors/chatgpt-web-codex.ts` | ID de túnel OpenAI global para execução de ferramenta Codex local. | | `CHATGPT_WEB_CODEX_RUNTIME_KEY` | _(desativado)_ | `open-sse/executors/chatgpt-web-codex.ts` | Chave de tempo de execução do túnel Globaler; niemals em Logs ausgeben. | | `CHATGPT_WEB_CODEX_CONNECTOR_NAME` | `OmniRoute Codex v2` | `open-sse/executors/chatgpt-web-codex.ts` | Nome exato dos novos conectores ChatGPT personalizados para a porta MCP. | | `CODEX_CHATGPT_WEB_HOME` | `/chatgpt-web-codex` | `open-sse/vendor/codex-chatgpt-web/config.ts` | Dediziertes Verzeichnis für Browser, Broker e Tunnelzustand. | | `CODEX_CHATGPT_WEB_BROWSER_DIAGNOSTICS` | `0` | `open-sse/vendor/codex-chatgpt-web/adapters/chatgpt-web/browser-worker.ts` | Bei `1` werden Browser-Diagnosebilder e jedem Checkpoint erfasst. | | `CODEX_CHATGPT_WEB_LAUNCHER` | _(desativado)_ | `open-sse/vendor/codex-chatgpt-web/config.ts` | Opcionalmente absoluto Pfad zu einem dauerhaften Launcher-Binary. | | `CODEX_CHATGPT_WEB_BUN` | _(detecção automática)_ | `open-sse/vendor/codex-chatgpt-web/config.ts` | Opcionalmente absoluto Pfad zum Bun-Runtime-Binary. | | `CODEX_WEB_GPT_BUN` | _(desativado)_ | `open-sse/vendor/codex-chatgpt-web/config.ts` | Legacy-Fallback para `CODEX_CHATGPT_WEB_BUN`; Novas configurações usam o nome canônico. | --- ## Ponte OmniConductor Consumidor SSE de longa duração que espelha as tarefas do hub OmniConductor no TaskManager A2A (`src/lib/conductor/`). Opte por — a ponte só inicia quando `CONDUCTOR_HUB_URL` está definido. Apenas no lado do servidor: o token do hub nunca deve chegar ao navegador. | Variável | Padrão | Arquivo de origem | Descrição | | ------------------------------ | ----------------------- | -------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------- | | `CONDUCTOR_HUB_URL` | _(vazio)_ | `src/lib/conductor/boot.ts` | Base URL do hub OmniConductor (por exemplo, `http://127.0.0.1:7910`). Desativar ponte = desativada. | | `CONDUCTOR_HUB_TOKEN` | _(vazio)_ | `src/lib/conductor/boot.ts` | A credencial do hub para o feed SSE — emite um peer `spokesperson` -kind no hub (`POST /v1/peers`, admin). | | `CONDUCTOR_ORCHESTRATOR_TOKEN` | _(vazio)_ | `src/lib/conductor/hubProxy.ts` | Credencial para delegação de tarefas do hub A2A→ de entrada (`POST /v1/tasks`); volta para `CONDUCTOR_HUB_TOKEN` quando não definido. | | `CONDUCTOR_SPOKESPERSON_URL` | `http://127.0.0.1:7920` | `src/lib/conductor/faroProxy.ts` | Base URL do serviço porta-voz (Faro) por trás do proxy de chat do dashboard (`/api/conductor/ask`). | ### Agendamento com reconhecimento de cota Usado por `open-sse/services/combo.ts` e `src/lib/quota/quotaScheduler.ts` para verificações de orçamento de token pré-solicitação. O comportamento de roteamento padrão — opt-in permanece inalterado quando não definido. | Variável | Padrão | Arquivo de origem | Descrição | | ---------------------------------- | --------- | ------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `OMNIROUTE_QUOTA_AWARE_ROUTING` | `0` | `open-sse/services/combo.ts` | Quando `1`, ignore conexões cujo orçamento de token por janela (`rateLimitOverrides.tpm`, tabela `provider_quota_state`) não possa arcar com o custo estimado da solicitação antes do envio. Fail-open quando nenhum orçamento configurado. | | `OMNIROUTE_ESTIMATOR_CALIBRATION` | _(sobre)_ | `open-sse/services/estimatorCalibration.ts` | Calibração de feedback do estimador de token de proteção de contexto (#14931): por (provedor, modelo, ferramentas presentes) EMA de `usage.prompt_tokens` / estimativa, fixado em 0,15–2,0, apenas na memória. `off`, `0` ou `false` desativa a gravação e a aplicação. | | `GROK_SUBSCRIPTION_IMAGES_ENABLED` | `false` | `open-sse/config/imageRegistry.ts` | Registra as rotas de imagem `xai-oauth` (`xao`) e `grok-cli`. Sinalizador de recurso do painel com o mesmo nome; uma substituição DB vence esse valor. | ## Diagnóstico de sincronização de modelo | Variável | Padrão | Arquivo de origem | Descrição | | ------------------------------ | ------ | -------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | `OMNIROUTE_MODEL_SYNC_TIMINGS` | `0` | `src/lib/providerModels/modelSyncTimings.ts` | Defina como `1` para registrar o tempo de fase, uma solicitação ID gerada e resultados de fase success/error durante a sincronização do modelo. Desativado para todos os outros valores. Os logs omitem cargas úteis de solicitação, conta, catálogo e erro. | ## Ferramenta local de análise de mídia do OpenCode Usada por `scripts/cli/omniroute-media-mcp.mjs`. Defina estas variáveis no ambiente do processo da ferramenta local. | Variável | Padrão | Descrição | | -------------------------- | --------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------- | | `OMNIROUTE_MEDIA_CONFIG` | `$XDG_CONFIG_HOME/opencode/opencode.json` (ou `~/.config/opencode/opencode.json`) | Configuração do OpenCode lida pela ferramenta de mídia e pelo instalador. | | `OMNIROUTE_MEDIA_PROVIDER` | `omniroute` | Entrada do provedor lida pela ferramenta de mídia na configuração do OpenCode. | | `OMNIROUTE_MEDIA_MODEL` | `auto` | Modelo enviado pela ferramenta de mídia. O provedor correspondente deve ser compatível com os tipos de mídia solicitados. | | `OMNIROUTE_MEDIA_API_KEY` | Chave de API do provedor configurado ou sua referência de ambiente | Substituição opcional da credencial. Mantenha-a no ambiente do processo local; nunca a versione. |