mirror of
https://github.com/diegosouzapw/OmniRoute.git
synced 2026-07-26 09:52:11 +03:00
fix(i18n): refresh translation state hash for architecture/ARCHITECTURE.md
The FASE 7 frontmatter sync touched docs/architecture/ARCHITECTURE.md but
.i18n-state.json was not refreshed, so npm run i18n:check reported
source-changed drift on every subsequent run.
Resolution: re-ran the hash-based translator end-to-end (npm run i18n:run
-- --locale=pt-BR --files=docs/architecture/ARCHITECTURE.md) which:
- retranslated the source through the production backend (14 chunks,
75 KB pt-BR output);
- persisted the new source/target SHA-256 pair in .i18n-state.json
(target_hash now matches the regenerated translation);
- left every other source/locale pair untouched.
After the run:
npm run i18n:check → PASS - all sources and targets match recorded hashes.
The pre-commit i18n drift advisory will no longer warn for this file.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -11,12 +11,12 @@
|
||||
}
|
||||
},
|
||||
"docs/architecture/ARCHITECTURE.md": {
|
||||
"source_hash": "573ccfe1a49d74999101460a3ee055bd07109c832d15dc9a4c6ef61ee8433302",
|
||||
"source_hash": "7e691870a4f6f25a535a023206cff5ef88aed619c9734851ebdacdd3a3bafcc8",
|
||||
"locales": {
|
||||
"pt-BR": {
|
||||
"source_hash": "573ccfe1a49d74999101460a3ee055bd07109c832d15dc9a4c6ef61ee8433302",
|
||||
"target_hash": "6daa8b7db866dd2781efd9ae02a576cf9f2cce2a8597b02a808c341e1d1335c3",
|
||||
"updated_at": "2026-05-13T20:09:25.192Z"
|
||||
"source_hash": "7e691870a4f6f25a535a023206cff5ef88aed619c9734851ebdacdd3a3bafcc8",
|
||||
"target_hash": "3e2a58f341f20b29cf245330b094bec40ffeede43526b4d416c660c37abca8db",
|
||||
"updated_at": "2026-05-13T22:58:05.984Z"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,26 +1,36 @@
|
||||
# OmniRoute Architecture (Português (Brasil))
|
||||
# ARCHITECTURE (Português (Brasil))
|
||||
|
||||
🌐 **Languages:** 🇺🇸 [English](../../../../architecture/ARCHITECTURE.md) · 🇸🇦 [ar](../../../ar/docs/architecture/ARCHITECTURE.md) · 🇧🇬 [bg](../../../bg/docs/architecture/ARCHITECTURE.md) · 🇧🇩 [bn](../../../bn/docs/architecture/ARCHITECTURE.md) · 🇨🇿 [cs](../../../cs/docs/architecture/ARCHITECTURE.md) · 🇩🇰 [da](../../../da/docs/architecture/ARCHITECTURE.md) · 🇩🇪 [de](../../../de/docs/architecture/ARCHITECTURE.md) · 🇪🇸 [es](../../../es/docs/architecture/ARCHITECTURE.md) · 🇮🇷 [fa](../../../fa/docs/architecture/ARCHITECTURE.md) · 🇫🇮 [fi](../../../fi/docs/architecture/ARCHITECTURE.md) · 🇫🇷 [fr](../../../fr/docs/architecture/ARCHITECTURE.md) · 🇮🇳 [gu](../../../gu/docs/architecture/ARCHITECTURE.md) · 🇮🇱 [he](../../../he/docs/architecture/ARCHITECTURE.md) · 🇮🇳 [hi](../../../hi/docs/architecture/ARCHITECTURE.md) · 🇭🇺 [hu](../../../hu/docs/architecture/ARCHITECTURE.md) · 🇮🇩 [id](../../../id/docs/architecture/ARCHITECTURE.md) · 🇮🇩 [in](../../../in/docs/architecture/ARCHITECTURE.md) · 🇮🇹 [it](../../../it/docs/architecture/ARCHITECTURE.md) · 🇯🇵 [ja](../../../ja/docs/architecture/ARCHITECTURE.md) · 🇰🇷 [ko](../../../ko/docs/architecture/ARCHITECTURE.md) · 🇮🇳 [mr](../../../mr/docs/architecture/ARCHITECTURE.md) · 🇲🇾 [ms](../../../ms/docs/architecture/ARCHITECTURE.md) · 🇳🇱 [nl](../../../nl/docs/architecture/ARCHITECTURE.md) · 🇳🇴 [no](../../../no/docs/architecture/ARCHITECTURE.md) · 🇵🇭 [phi](../../../phi/docs/architecture/ARCHITECTURE.md) · 🇵🇱 [pl](../../../pl/docs/architecture/ARCHITECTURE.md) · 🇵🇹 [pt](../../../pt/docs/architecture/ARCHITECTURE.md) · 🇷🇴 [ro](../../../ro/docs/architecture/ARCHITECTURE.md) · 🇷🇺 [ru](../../../ru/docs/architecture/ARCHITECTURE.md) · 🇸🇰 [sk](../../../sk/docs/architecture/ARCHITECTURE.md) · 🇸🇪 [sv](../../../sv/docs/architecture/ARCHITECTURE.md) · 🇰🇪 [sw](../../../sw/docs/architecture/ARCHITECTURE.md) · 🇮🇳 [ta](../../../ta/docs/architecture/ARCHITECTURE.md) · 🇮🇳 [te](../../../te/docs/architecture/ARCHITECTURE.md) · 🇹🇭 [th](../../../th/docs/architecture/ARCHITECTURE.md) · 🇹🇷 [tr](../../../tr/docs/architecture/ARCHITECTURE.md) · 🇺🇦 [uk-UA](../../../uk-UA/docs/architecture/ARCHITECTURE.md) · 🇵🇰 [ur](../../../ur/docs/architecture/ARCHITECTURE.md) · 🇻🇳 [vi](../../../vi/docs/architecture/ARCHITECTURE.md) · 🇨🇳 [zh-CN](../../../zh-CN/docs/architecture/ARCHITECTURE.md)
|
||||
|
||||
---
|
||||
|
||||
🌐 **Idiomas:** 🇺🇸 [English](./ARCHITECTURE.md) | 🇧🇷 [Português (Brasil)](i18n/pt-BR/ARCHITECTURE.md) | 🇪🇸 [Español](i18n/es/ARCHITECTURE.md) | 🇫🇷 [Français](i18n/fr/ARCHITECTURE.md) | 🇮🇹 [Italiano](i18n/it/ARCHITECTURE.md) | 🇷🇺 [Русский](i18n/ru/ARCHITECTURE.md) | 🇨🇳 [中文 (简体)](i18n/zh-CN/ARCHITECTURE.md) | 🇩🇪 [Deutsch](i18n/de/ARCHITECTURE.md) | 🇮🇳 [हिन्दी](i18n/in/ARCHITECTURE.md) | 🇹🇭 [ไทย](i18n/th/ARCHITECTURE.md) | 🇺🇦 [Українська](i18n/uk-UA/ARCHITECTURE.md) | 🇸🇦 [العربية](i18n/ar/ARCHITECTURE.md) | 🇯🇵 [日本語](i18n/ja/ARCHITECTURE.md) | 🇻🇳 [Tiếng Việt](i18n/vi/ARCHITECTURE.md) | 🇧🇬 [Български](i18n/bg/ARCHITECTURE.md) | 🇩🇰 [Dansk](i18n/da/ARCHITECTURE.md) | 🇫🇮 [Suomi](i18n/fi/ARCHITECTURE.md) | 🇮🇱 [עברית](i18n/he/ARCHITECTURE.md) | 🇭🇺 [Magyar](i18n/hu/ARCHITECTURE.md) | 🇮🇩 [Bahasa Indonesia](i18n/id/ARCHITECTURE.md) | 🇰🇷 [한국어](i18n/ko/ARCHITECTURE.md) | 🇲🇾 [Bahasa Melayu](i18n/ms/ARCHITECTURE.md) | 🇳🇱 [Nederlands](i18n/nl/ARCHITECTURE.md) | 🇳🇴 [Norsk](i18n/no/ARCHITECTURE.md) | 🇵🇹 [Português (Portugal)](i18n/pt/ARCHITECTURE.md) | 🇷🇴 [Română](i18n/ro/ARCHITECTURE.md) | 🇵🇱 [Polski](i18n/pl/ARCHITECTURE.md) | 🇸🇰 [Slovenčina](i18n/sk/ARCHITECTURE.md) | 🇸🇪 [Svenska](i18n/sv/ARCHITECTURE.md) | 🇵🇭 [Filipino](i18n/phi/ARCHITECTURE.md) | 🇨🇿 [Čeština](i18n/cs/ARCHITECTURE.md)
|
||||
---
|
||||
|
||||
title: "Arquitetura do OmniRoute"
|
||||
version: 3.8.0
|
||||
lastUpdated: 2026-05-13
|
||||
|
||||
---
|
||||
|
||||
# Arquitetura do OmniRoute
|
||||
|
||||
🌐 **Idiomas:** 🇺🇸 [English](./ARCHITECTURE.md) | 🇧🇷 [Português (Brasil)](../i18n/pt-BR/docs/architecture/ARCHITECTURE.md) | 🇪🇸 [Español](../i18n/es/docs/architecture/ARCHITECTURE.md) | 🇫🇷 [Français](../i18n/fr/docs/architecture/ARCHITECTURE.md) | 🇮🇹 [Italiano](../i18n/it/docs/architecture/ARCHITECTURE.md) | 🇷🇺 [Русский](../i18n/ru/docs/architecture/ARCHITECTURE.md) | 🇨🇳 [中文 (简体)](../i18n/zh-CN/docs/architecture/ARCHITECTURE.md) | 🇩🇪 [Deutsch](../i18n/de/docs/architecture/ARCHITECTURE.md) | 🇮🇳 [हिन्दी](../i18n/in/docs/architecture/ARCHITECTURE.md) | 🇹🇭 [ไทย](../i18n/th/docs/architecture/ARCHITECTURE.md) | 🇺🇦 [Українська](../i18n/uk-UA/docs/architecture/ARCHITECTURE.md) | 🇸🇦 [العربية](../i18n/ar/docs/architecture/ARCHITECTURE.md) | 🇯🇵 [日本語](../i18n/ja/docs/architecture/ARCHITECTURE.md) | 🇻🇳 [Tiếng Việt](../i18n/vi/docs/architecture/ARCHITECTURE.md) | 🇧🇬 [Български](../i18n/bg/docs/architecture/ARCHITECTURE.md) | 🇩🇰 [Dansk](../i18n/da/docs/architecture/ARCHITECTURE.md) | 🇫🇮 [Suomi](../i18n/fi/docs/architecture/ARCHITECTURE.md) | 🇮🇱 [עברית](../i18n/he/docs/architecture/ARCHITECTURE.md) | 🇭🇺 [Magyar](../i18n/hu/docs/architecture/ARCHITECTURE.md) | 🇮🇩 [Bahasa Indonesia](../i18n/id/docs/architecture/ARCHITECTURE.md) | 🇰🇷 [한국어](../i18n/ko/docs/architecture/ARCHITECTURE.md) | 🇲🇾 [Bahasa Melayu](../i18n/ms/docs/architecture/ARCHITECTURE.md) | 🇳🇱 [Nederlands](../i18n/nl/docs/architecture/ARCHITECTURE.md) | 🇳🇴 [Norsk](../i18n/no/docs/architecture/ARCHITECTURE.md) | 🇵🇹 [Português (Portugal)](../i18n/pt/docs/architecture/ARCHITECTURE.md) | 🇷🇴 [Română](../i18n/ro/docs/architecture/ARCHITECTURE.md) | 🇵🇱 [Polski](../i18n/pl/docs/architecture/ARCHITECTURE.md) | 🇸🇰 [Slovenčina](../i18n/sk/docs/architecture/ARCHITECTURE.md) | 🇸🇪 [Svenska](../i18n/sv/docs/architecture/ARCHITECTURE.md) | 🇵🇭 [Filipino](../i18n/phi/docs/architecture/ARCHITECTURE.md) | 🇨🇿 [Čeština](../i18n/cs/docs/architecture/ARCHITECTURE.md)
|
||||
|
||||
_Última atualização: 2026-05-13_
|
||||
|
||||
## Resumo Executivo
|
||||
|
||||
OmniRoute é um gateway de roteamento de IA local e um painel construído em Next.js.
|
||||
OmniRoute é um gateway de roteamento de IA local e um painel construído sobre Next.js.
|
||||
Ele fornece um único endpoint compatível com OpenAI (`/v1/*`) e roteia o tráfego entre vários provedores upstream com tradução, fallback, atualização de token e rastreamento de uso.
|
||||
|
||||
Capacidades principais:
|
||||
Principais capacidades:
|
||||
|
||||
- Superfície de API compatível com OpenAI para CLI/ferramentas (179 provedores, 31 executores)
|
||||
- Superfície de API compatível com OpenAI para CLI/ferramentas (177 provedores, 31 executores)
|
||||
- Tradução de solicitação/resposta entre formatos de provedores
|
||||
- Fallback de combinação de modelos (sequência de múltiplos modelos)
|
||||
- Etapas de combinação estruturadas (`provedor + modelo + conexão`) com ordenação em tempo de execução por `compositeTiers`
|
||||
- Fallback em nível de conta (múltiplas contas por provedor)
|
||||
- Pré-verificação de cota e seleção de conta P2C ciente da cota no caminho principal de chat
|
||||
- Pré-verificação de cota e seleção de conta P2C ciente da cota no caminho principal do chat
|
||||
- Gerenciamento de conexão de provedor OAuth + chave de API (14 módulos OAuth)
|
||||
- Geração de embeddings via `/v1/embeddings` (6 provedores, 9 modelos)
|
||||
- Geração de imagens via `/v1/images/generations` (10+ provedores, 20+ modelos)
|
||||
@@ -35,7 +45,7 @@ Capacidades principais:
|
||||
- Sanitização de resposta para compatibilidade estrita com o SDK da OpenAI
|
||||
- Normalização de papéis (desenvolvedor→sistema, sistema→usuário) para compatibilidade entre provedores
|
||||
- Conversão de saída estruturada (json_schema → Gemini responseSchema)
|
||||
- Persistência local para provedores, chaves, aliases, combos, configurações, preços (26 módulos de DB)
|
||||
- Persistência local para provedores, chaves, aliases, combinações, configurações, preços (26 módulos de DB)
|
||||
- Rastreamento de uso/custo e registro de solicitações
|
||||
- Sincronização em nuvem opcional para sincronização de múltiplos dispositivos/estados
|
||||
- Lista de permissão/bloqueio de IP para controle de acesso à API
|
||||
@@ -44,14 +54,14 @@ Capacidades principais:
|
||||
- Rastreamento de sessão e identificação
|
||||
- Limitação de taxa aprimorada por conta com perfis específicos de provedores
|
||||
- Padrão de disjuntor para resiliência do provedor
|
||||
- Proteção contra rebanho de trovão com bloqueio de mutex
|
||||
- Proteção contra rebanho de trovão com bloqueio mutex
|
||||
- Cache de deduplicação de solicitação baseado em assinatura
|
||||
- Camada de domínio: regras de custo, política de fallback, política de bloqueio
|
||||
- Context Relay: resumos de transferência de sessão para continuidade de rotação de conta
|
||||
- Persistência de estado de domínio (cache de gravação SQLite para fallbacks, orçamentos, bloqueios, disjuntores)
|
||||
- Motor de políticas para avaliação centralizada de solicitações (bloqueio → orçamento → fallback)
|
||||
- Telemetria de solicitação com agregação de latência p50/p95/p99
|
||||
- Telemetria de alvo de combo e saúde histórica do alvo de combo via `combo_execution_key` / `combo_step_id`
|
||||
- Telemetria de solicitações com agregação de latência p50/p95/p99
|
||||
- Telemetria de alvo de combinação e saúde histórica do alvo de combinação via `combo_execution_key` / `combo_step_id`
|
||||
- ID de correlação (X-Request-Id) para rastreamento de ponta a ponta
|
||||
- Registro de auditoria de conformidade com opção de exclusão por chave de API
|
||||
- Framework de avaliação para garantia de qualidade de LLM
|
||||
@@ -62,19 +72,19 @@ Capacidades principais:
|
||||
- Sistema de habilidades (registro, executor, sandbox, habilidades integradas)
|
||||
- Proxy MITM com gerenciamento de certificados e manipulação de DNS
|
||||
- Middleware de proteção contra injeção de prompt
|
||||
- Pipeline de compressão de prompt com Caveman, RTK, pipelines empilhados, combos de compressão, pacotes de idiomas e análises
|
||||
- Pipeline de compressão de prompt com Caveman, RTK, pipelines empilhados, combinações de compressão, pacotes de idiomas e análises
|
||||
- Registro de ACP (Agent Communication Protocol)
|
||||
- Provedores OAuth modulares (14 módulos individuais sob `src/lib/oauth/providers/`)
|
||||
- Scripts de desinstalação/desinstalação completa
|
||||
- Ação de reparo de ambiente OAuth
|
||||
- Ponte WebSocket para clientes WS compatíveis com OpenAI (`/v1/ws`)
|
||||
- Gerenciamento de token de sincronização (emissão/revogação, download de pacote de configuração versionado por ETag)
|
||||
- Pensamento GLM (`glmt`) como preset de provedor de primeira classe
|
||||
- Contagem de tokens híbrida (contagem de tokens do lado do provedor `/messages/count_tokens` com fallback de estimativa)
|
||||
- Gerenciamento de tokens de sincronização (emissão/revogação, download de pacote de configuração versionado por ETag)
|
||||
- GLM Thinking (`glmt`) preset de provedor de primeira classe
|
||||
- Contagem híbrida de tokens (contagem de tokens do lado do provedor `/messages/count_tokens` com fallback de estimativa)
|
||||
- Auto-semeadura de alias de modelo (30+ normalizações de dialeto cross-proxy na inicialização)
|
||||
- Busca segura de saída com proteção SSRF, bloqueio de URL privada e retry configurável
|
||||
- Repetições de chat cientes de cooldown com `requestRetry` e `maxRetryIntervalSec` configuráveis
|
||||
- Validação do ambiente de execução com Zod na inicialização
|
||||
- Validação do ambiente em tempo de execução com Zod na inicialização
|
||||
- Auditoria de conformidade v2 com paginação, eventos CRUD de provedores e registro de validação bloqueada por SSRF
|
||||
|
||||
Modelo de execução principal:
|
||||
@@ -84,7 +94,7 @@ Modelo de execução principal:
|
||||
|
||||
## Diagramas de Referência
|
||||
|
||||
Fontes canônicas e controladas por versão do Mermaid para a plataforma v3.8.0 estão disponíveis em
|
||||
Fontes Mermaid canônicas e controladas por versão para a plataforma v3.8.0 estão em
|
||||
[`docs/diagrams/`](../diagrams/README.md). Dois são reproduzidos abaixo para orientação;
|
||||
os demais estão vinculados a seus guias específicos de domínio.
|
||||
|
||||
@@ -106,13 +116,13 @@ os demais estão vinculados a seus guias específicos de domínio.
|
||||
- Autenticação de provedor e atualização de token
|
||||
- Tradução de requisições e streaming SSE
|
||||
- Persistência de estado local + uso
|
||||
- Orquestração opcional de sincronização em nuvem
|
||||
- Orquestração de sincronização em nuvem opcional
|
||||
|
||||
### Fora do Escopo
|
||||
|
||||
- Implementação de serviço em nuvem por trás de `NEXT_PUBLIC_CLOUD_URL`
|
||||
- SLA do provedor/plano de controle fora do processo local
|
||||
- Binaries de CLI externas (Claude CLI, Codex CLI, etc.)
|
||||
- Binaries CLI externas em si (Claude CLI, Codex CLI, etc.)
|
||||
|
||||
## Superfície do Painel (Atual)
|
||||
|
||||
@@ -124,20 +134,20 @@ Páginas principais em `src/app/(dashboard)/dashboard/`:
|
||||
- `/dashboard/combos` — estratégias de combo, templates, construtor baseado em etapas, regras de roteamento de modelo, ordenação persistida manual
|
||||
- `/dashboard/auto-combo` — Motor de Auto Combo: pesos de pontuação, pacotes de modo, predefinições de fábrica virtual, telemetria
|
||||
- `/dashboard/costs` — agregação de custos e visibilidade de preços
|
||||
- `/dashboard/analytics` — análises de uso, avaliações, saúde do alvo do combo
|
||||
- `/dashboard/analytics` — análises de uso, avaliações, saúde do alvo de combo
|
||||
- `/dashboard/limits` — controles de cota/taxa
|
||||
- `/dashboard/cli-tools` — integração de CLI, detecção de tempo de execução, geração de configuração
|
||||
- `/dashboard/cli-tools` — integração CLI, detecção de tempo de execução, geração de configuração
|
||||
- `/dashboard/agents` — agentes ACP detectados + registro de agente personalizado
|
||||
- `/dashboard/cloud-agents` — tarefas de agente hospedadas na nuvem (Codex Cloud, Devin, Jules) e ciclo de vida da tarefa
|
||||
- `/dashboard/skills` — registro de habilidades A2A, execução em sandbox, catálogo de habilidades embutido
|
||||
- `/dashboard/memory` — inspeção e recuperação de memória conversacional persistente
|
||||
- `/dashboard/webhooks` — assinaturas de webhook de saída, rotação de segredos, estatísticas de tentativas
|
||||
- `/dashboard/batch` — submissão de trabalhos em lote e progresso
|
||||
- `/dashboard/batch` — submissão de trabalho em lote e progresso
|
||||
- `/dashboard/cache` — estatísticas de cache de leitura e raciocínio, controles de expulsão
|
||||
- `/dashboard/playground` — playground de chat interativo contra qualquer combo/modelo configurado
|
||||
- `/dashboard/changelog` — visualizador de changelog no aplicativo (renderiza `CHANGELOG.md`)
|
||||
- `/dashboard/system` — diagnósticos de tempo de execução, informações de versão, superfície de validação de ambiente
|
||||
- `/dashboard/onboarding` — assistente de configuração de primeira execução para novas instalações
|
||||
- `/dashboard/system` — diagnósticos de tempo de execução, informações de versão, superfície de validação do ambiente
|
||||
- `/dashboard/onboarding` — assistente de configuração para primeira execução em novas instalações
|
||||
- `/dashboard/media` — playground de imagem/vídeo/música
|
||||
- `/dashboard/search-tools` — teste de provedor de busca e histórico
|
||||
- `/dashboard/health` — tempo de atividade, disjuntores, limites de taxa, sessões monitoradas por cota
|
||||
@@ -145,7 +155,7 @@ Páginas principais em `src/app/(dashboard)/dashboard/`:
|
||||
- `/dashboard/settings` — abas de configurações do sistema (geral, roteamento, padrões de combo, etc.)
|
||||
- `/dashboard/context/caveman` — regras de compressão Caveman, pacotes de idioma, visualização e modo de saída
|
||||
- `/dashboard/context/rtk` — filtros de saída de comando RTK, visualização e configurações de segurança em tempo de execução
|
||||
- `/dashboard/context/combos` — pipelines de compressão nomeados atribuídos a combos de roteamento
|
||||
- `/dashboard/context/combos` — pipelines de compressão nomeadas atribuídas a combos de roteamento
|
||||
- `/dashboard/translator` — inspeção de tradutor e visualização de conversão de formato de requisição
|
||||
- `/dashboard/audit` — navegador de log de auditoria de conformidade com paginação e metadados estruturados
|
||||
- `/dashboard/usage` — navegador de uso por requisição vinculado a `usage_history`
|
||||
@@ -178,8 +188,8 @@ flowchart LR
|
||||
P3[Nós Compatíveis\ncompatíveis com OpenAI / compatíveis com Anthropic]
|
||||
end
|
||||
|
||||
subgraph Cloud[Sincronização em Nuvem Opcional]
|
||||
CLOUD[Ponto de Sincronização em Nuvem\nNEXT_PUBLIC_CLOUD_URL]
|
||||
subgraph Cloud[Síncrono em Nuvem Opcional]
|
||||
CLOUD[Ponto de Síncrono em Nuvem\nNEXT_PUBLIC_CLOUD_URL]
|
||||
end
|
||||
|
||||
C1 --> API
|
||||
@@ -202,9 +212,9 @@ flowchart LR
|
||||
|
||||
## Componentes Centrais de Execução
|
||||
|
||||
## 1) Camada de API e Roteamento (Rotas do App Next.js)
|
||||
## 1) API e Camada de Roteamento (Rotas do App Next.js)
|
||||
|
||||
Diretórios principais:
|
||||
Principais diretórios:
|
||||
|
||||
- `src/app/api/v1/*` e `src/app/api/v1beta/*` para APIs de compatibilidade
|
||||
- `src/app/api/*` para APIs de gerenciamento/configuração
|
||||
@@ -236,8 +246,8 @@ Domínios de gerenciamento:
|
||||
- OAuth: `src/app/api/oauth/*`
|
||||
- Chaves/aliases/combos/preços: `src/app/api/keys*`, `src/app/api/models/alias`, `src/app/api/combos*`, `src/app/api/pricing`
|
||||
- Uso: `src/app/api/usage/*`
|
||||
- Sincronização/nuvem: `src/app/api/sync/*`, `src/app/api/cloud/*`
|
||||
- Ferramentas auxiliares de CLI: `src/app/api/cli-tools/*`
|
||||
- Síncrono/nuvem: `src/app/api/sync/*`, `src/app/api/cloud/*`
|
||||
- Ferramentas de CLI: `src/app/api/cli-tools/*`
|
||||
- Filtro de IP: `src/app/api/settings/ip-filter` (GET/PUT)
|
||||
- Orçamento de pensamento: `src/app/api/settings/thinking-budget` (GET/PUT)
|
||||
- Prompt do sistema: `src/app/api/settings/system-prompt` (GET/PUT)
|
||||
@@ -245,16 +255,16 @@ Domínios de gerenciamento:
|
||||
`src/app/api/context/*`
|
||||
- Sessões: `src/app/api/sessions` (GET)
|
||||
- Limites de taxa: `src/app/api/rate-limits` (GET)
|
||||
- Resiliência: `src/app/api/resilience` (GET/PATCH) — fila de requisições, cooldown de conexão, breaker de provedor, configuração de espera por cooldown
|
||||
- Reset de resiliência: `src/app/api/resilience/reset` (POST) — resetar breakers de provedores
|
||||
- Resiliência: `src/app/api/resilience` (GET/PATCH) — fila de requisições, cooldown de conexão, quebra de provedor, configuração de espera por cooldown
|
||||
- Redefinição de resiliência: `src/app/api/resilience/reset` (POST) — redefinir quebras de provedores
|
||||
- Estatísticas de cache: `src/app/api/cache/stats` (GET/DELETE)
|
||||
- Telemetria: `src/app/api/telemetry/summary` (GET)
|
||||
- Orçamento: `src/app/api/usage/budget` (GET/POST)
|
||||
- Cadeias de fallback: `src/app/api/fallback/chains` (GET/POST/DELETE)
|
||||
- Auditoria de conformidade: `src/app/api/compliance/audit-log` (GET, com paginação + metadados estruturados)
|
||||
- Evals: `src/app/api/evals` (GET/POST), `src/app/api/evals/[suiteId]` (GET)
|
||||
- Avaliações: `src/app/api/evals` (GET/POST), `src/app/api/evals/[suiteId]` (GET)
|
||||
- Políticas: `src/app/api/policies` (GET/POST)
|
||||
- Tokens de sincronização: `src/app/api/sync/tokens` (GET/POST), `src/app/api/sync/tokens/[id]` (GET/DELETE)
|
||||
- Tokens de síncrono: `src/app/api/sync/tokens` (GET/POST), `src/app/api/sync/tokens/[id]` (GET/DELETE)
|
||||
- Pacote de configuração: `src/app/api/sync/bundle` (GET, snapshot versionado por ETag de configurações/provedores/combos/chaves)
|
||||
- WebSocket: `src/app/api/v1/ws/route.ts` — manipulador de upgrade para clientes WS compatíveis com OpenAI
|
||||
|
||||
@@ -297,10 +307,10 @@ Serviços (lógica de negócios):
|
||||
- Recuperador de cota Codex: `open-sse/services/codexQuotaFetcher.ts` — recupera a cota Codex para decisões de transferência de contexto
|
||||
- Retry ciente de cooldown: `src/sse/services/cooldownAwareRetry.ts` — retries de cooldown por modelo com `requestRetry` / `maxRetryIntervalSec` configuráveis
|
||||
- Fetch seguro de saída: `src/shared/network/safeOutboundFetch.ts` — fetch protegido de provedor/modelo com proteção SSRF, bloqueio de URL privada, retry e timeout
|
||||
- Guarda de URL de saída: `src/shared/network/outboundUrlGuard.ts` — valida URLs de provedores contra intervalos CIDR privados/localhost
|
||||
- Guarda de URL de saída: `src/shared/network/outboundUrlGuard.ts` — valida URLs de provedores contra intervalos CIDR de privado/localhost
|
||||
- Padrões de requisição do provedor: `open-sse/services/providerRequestDefaults.ts` — padrões de `maxTokens`, `temperature`, `thinkingBudgetTokens` a nível de provedor
|
||||
- Constantes do provedor GLM: `open-sse/config/glmProvider.ts` — modelos GLM compartilhados, URLs de cota, timeout/padrões GLMT
|
||||
- Upstream de antigravidade: `open-sse/config/antigravityUpstream.ts` — constantes de URL base e caminho de descoberta
|
||||
- Upstream Antigravity: `open-sse/config/antigravityUpstream.ts` — constantes de URL base e caminho de descoberta
|
||||
- Constantes do cliente Codex: `open-sse/config/codexClient.ts` — valores de user-agent e versão do cliente versionados
|
||||
- Semente de alias de modelo: `src/lib/modelAliasSeed.ts` — semeia 30+ aliases de dialetos cross-proxy na inicialização
|
||||
|
||||
@@ -316,14 +326,14 @@ Módulos da camada de domínio:
|
||||
- Timeout de fetch: `src/lib/domain/fetchTimeout.ts`
|
||||
- Telemetria de requisição: `src/lib/domain/requestTelemetry.ts`
|
||||
- Conformidade/auditoria: `src/lib/domain/compliance/index.ts`
|
||||
- Executor de avaliação: `src/lib/domain/evalRunner.ts`
|
||||
- Executor de eval: `src/lib/domain/evalRunner.ts`
|
||||
- Persistência do estado do domínio: `src/lib/db/domainState.ts` — CRUD SQLite para cadeias de fallback, orçamentos, histórico de custos, estado de bloqueio, disjuntores
|
||||
|
||||
Módulos do provedor OAuth (14 arquivos individuais sob `src/lib/oauth/providers/`):
|
||||
|
||||
- Índice do registro: `src/lib/oauth/providers/index.ts`
|
||||
- Índice de registro: `src/lib/oauth/providers/index.ts`
|
||||
- Provedores individuais: `claude.ts`, `codex.ts`, `gemini.ts`, `antigravity.ts`, `qoder.ts`, `qwen.ts`, `kimi-coding.ts`, `github.ts`, `kiro.ts`, `cursor.ts`, `kilocode.ts`, `cline.ts`, `windsurf.ts`, `gitlab-duo.ts`
|
||||
- Wrapper fino: `src/lib/oauth/providers.ts` — re-exporta de módulos individuais
|
||||
- Wrapper fino: `src/lib/oauth/providers.ts` — re-exportações de módulos individuais
|
||||
|
||||
## Subsistemas Principais (v3.8.0)
|
||||
|
||||
@@ -339,15 +349,15 @@ O Motor de Combinação Automática pontua e escolhe dinamicamente os alvos de r
|
||||
|
||||
Principais capacidades:
|
||||
|
||||
- **14 estratégias de roteamento** (prioridade, ponderada, preenchimento primeiro, round-robin, P2C, aleatório,
|
||||
menos utilizado, otimizado por custo, estritamente aleatório, **auto**, lkgp, otimizado por contexto,
|
||||
retransmissão de contexto, além de um caminho de fallback) — auto é a adição principal na v3.8.0.
|
||||
- **14 estratégias de roteamento** (prioridade, ponderada, preenchimento primeiro, round-robin, P2C, aleatória,
|
||||
menos utilizada, otimizada por custo, estritamente aleatória, **automática**, lkgp, otimizada por contexto,
|
||||
relé de contexto, além de um caminho de fallback) — automática é a adição principal na v3.8.0.
|
||||
- **Pontuação de 9 fatores**: custo, latência p95, taxa de sucesso, margem de cota, proximidade de bloqueio,
|
||||
estado do disjuntor, falhas recentes, disponibilidade do modelo e afinidade de tags.
|
||||
- **Fábrica virtual** materializa combinações efêmeras quando nenhuma combinação nomeada correspondente
|
||||
existe, obtendo candidatos de conexões de provedores ativos e saudáveis.
|
||||
existe, buscando candidatos de conexões de provedores ativos e saudáveis.
|
||||
- **Prefixos automáticos**: `auto/coding`, `auto/cheap`, `auto/fast`, `auto/offline`,
|
||||
`auto/smart`, `auto/lkgp` — cada um apoiado por um perfil de peso ajustado.
|
||||
`auto/smart`, `auto/lkgp` — cada um respaldado por um perfil de peso ajustado.
|
||||
- **4 pacotes de modo**: coding, fast, cheap, smart — enviados como configurações de peso pré-definidas
|
||||
chamáveis a partir do painel.
|
||||
|
||||
@@ -356,8 +366,8 @@ Para detalhes algorítmicos completos (fórmulas de fatores, ajuste de peso), co
|
||||
|
||||
### B. Agentes de Nuvem
|
||||
|
||||
Agentes de Nuvem envolvem plataformas de código-agente hospedadas de terceiros (Codex Cloud, Devin,
|
||||
Jules) por trás de um ciclo de vida de tarefa uniforme baseado em DB. Todos os pontos de criação/inspeção
|
||||
Os Agentes de Nuvem envolvem plataformas de código-agente hospedadas de terceiros (Codex Cloud, Devin,
|
||||
Jules) por trás de um ciclo de vida de tarefa uniforme baseado em DB. Todos os pontos finais de criação/inspeção
|
||||
de tarefas requerem autenticação de gerenciamento.
|
||||
|
||||
- Raiz do módulo: `src/lib/cloudAgent/` (`baseAgent.ts`, `registry.ts`, `api.ts`,
|
||||
@@ -368,13 +378,13 @@ de tarefas requerem autenticação de gerenciamento.
|
||||
- Painel: `/dashboard/cloud-agents`
|
||||
- Armazenamento: tabela `cloud_agent_tasks`
|
||||
|
||||
Para detalhes de provisionamento por agente e especificidades de OAuth, consulte
|
||||
Para detalhes de provisionamento por agente e especificidades do OAuth, consulte
|
||||
[`docs/frameworks/CLOUD_AGENT.md`](../frameworks/CLOUD_AGENT.md).
|
||||
|
||||
### C. Guardrails
|
||||
|
||||
O módulo de guardrails é uma camada de middleware recarregável que inspeciona solicitações
|
||||
e respostas em busca de PII, injeção de prompt e conteúdo de visão inseguro. Violações
|
||||
e respostas em busca de PII, injeção de prompt e conteúdo visual inseguro. Violações
|
||||
interrompem a solicitação com HTTP **503** mais um código de erro estruturado, permitindo
|
||||
que chamadores subsequentes tentem novamente ou ramifiquem.
|
||||
|
||||
@@ -384,7 +394,7 @@ que chamadores subsequentes tentem novamente ou ramifiquem.
|
||||
- Pontos de conexão: entrada do manipulador de chat, manipulador de geração de imagem, sanitizador de resposta
|
||||
- Contrato HTTP: violações aparecem como `503` com `error.code = "GUARDRAIL_VIOLATION"`
|
||||
|
||||
Para autoria de regras e ajuste de limites, consulte
|
||||
Para autoria de regras e ajuste de limiares, consulte
|
||||
[`docs/security/GUARDRAILS.md`](../security/GUARDRAILS.md).
|
||||
|
||||
### D. Camada de Domínio
|
||||
@@ -392,7 +402,7 @@ Para autoria de regras e ajuste de limites, consulte
|
||||
O namespace `src/domain/` centraliza decisões de política para que os manipuladores de rota não
|
||||
precisem montar a lógica de bloqueio/orçamento/fallback por conta própria.
|
||||
|
||||
- Motor de políticas: `src/domain/policyEngine.ts` — ponto de entrada único para
|
||||
- Motor de política: `src/domain/policyEngine.ts` — ponto de entrada único para
|
||||
avaliação pré-execução (bloqueio → orçamento → ordem de fallback)
|
||||
- Regras de custo: `src/domain/costRules.ts`
|
||||
- Política de fallback: `src/domain/fallbackPolicy.ts`
|
||||
@@ -401,13 +411,13 @@ precisem montar a lógica de bloqueio/orçamento/fallback por conta própria.
|
||||
- Resolvedor de combinação: `src/domain/comboResolver.ts` — resolve nomes de combinação, prefixos auto/\*
|
||||
e alvos de modelo curinga para planos de execução concretos
|
||||
- Conector de regras de conexão/modelo: `src/domain/connectionModelRules.ts`
|
||||
- Capturas de disponibilidade do modelo: `src/domain/modelAvailability.ts`
|
||||
- Rastreamento de expiração do provedor: `src/domain/providerExpiration.ts`
|
||||
- Instantâneas de disponibilidade do modelo: `src/domain/modelAvailability.ts`
|
||||
- Rastreamento de expiração de provedores: `src/domain/providerExpiration.ts`
|
||||
- Cache de cota: `src/domain/quotaCache.ts`
|
||||
- Estado de degradação: `src/domain/degradation.ts`
|
||||
- Auditoria de configuração: `src/domain/configAudit.ts`
|
||||
- Construtor de metadados de resposta OmniRoute: `src/domain/omnirouteResponseMeta.ts`
|
||||
- Subsistema de avaliação: `src/domain/assessment/` — trabalhos de avaliação periódicos
|
||||
- Subsistema de avaliação: `src/domain/assessment/` — trabalhos de avaliação periódica
|
||||
|
||||
### E. Pipeline de Autorização
|
||||
|
||||
@@ -415,13 +425,13 @@ O pipeline de autorização classifica cada solicitação recebida e aplica a
|
||||
cadeia de políticas apropriada antes do despacho.
|
||||
|
||||
- Entrada do pipeline: `src/server/authz/pipeline.ts`
|
||||
- Classificador de solicitações: `src/server/authz/classify.ts` — distingue rotas de compatibilidade públicas
|
||||
- Classificador de solicitações: `src/server/authz/classify.ts` — distingue rotas de compatibilidade pública
|
||||
de rotas de gerenciamento
|
||||
- Inventário de rotas públicas: `src/shared/constants/publicApiRoutes.ts`
|
||||
- Políticas: `src/server/authz/policies/` — predicados compostáveis
|
||||
(`requireApiKey`, `requireManagement`, `requireFreshAuth`, etc.)
|
||||
- Utilitários de cabeçalho: `src/server/authz/headers.ts`
|
||||
- Helper de asserção: `src/server/authz/assertAuth.ts`
|
||||
- Auxiliar de asserção: `src/server/authz/assertAuth.ts`
|
||||
- Contexto da solicitação: `src/server/authz/context.ts`
|
||||
|
||||
Rotas públicas vs rotas de gerenciamento são uma fronteira rígida: APIs de agente/cooldown e
|
||||
@@ -432,7 +442,7 @@ Para as regras completas de classificação de rotas, consulte
|
||||
|
||||
### F. FSM de Workflow e Roteador Consciente de Tarefas
|
||||
|
||||
Um roteador acionado por máquina de estados finitos, posicionado acima da seleção de combinações para direcionar
|
||||
Um roteador impulsionado por máquina de estados finitos, posicionado acima da seleção de combinações para direcionar
|
||||
o tráfego com base na fase de workflow detectada (planejamento, execução,
|
||||
revisão) e afinidade de tarefas em segundo plano.
|
||||
|
||||
@@ -441,9 +451,8 @@ revisão) e afinidade de tarefas em segundo plano.
|
||||
- Detector de tarefas em segundo plano: `open-sse/services/backgroundTaskDetector.ts`
|
||||
- Classificador de intenção: `open-sse/services/intentClassifier.ts`
|
||||
|
||||
As transições da FSM alimentam a pontuação do Auto Combo, tendendo a modelos mais baratos
|
||||
para tarefas de automação/fundo e a modelos mais robustos para turnos interativos de
|
||||
planejamento/revisão.
|
||||
As transições da FSM alimentam a pontuação do Motor de Combinação Automática, tendendo a modelos mais baratos
|
||||
para tarefas de background/automação e a modelos mais fortes para turnos interativos de planejamento/revisão.
|
||||
|
||||
### G. Resiliência Específica do Provedor
|
||||
|
||||
@@ -455,11 +464,11 @@ camadas globais de disjuntor / cooldown de conexão / bloqueio de modelo:
|
||||
`antigravityCredits.ts`, `antigravityHeaderScrub.ts`, `antigravityHeaders.ts`,
|
||||
`antigravityIdentity.ts`, `antigravityObfuscation.ts`, `antigravityVersion.ts`)
|
||||
- Política de cota ModelScope: `open-sse/services/modelscopePolicy.ts`
|
||||
- Claude Code CCH (Handshake de Canal de Compatibilidade): `open-sse/services/claudeCodeCCH.ts`,
|
||||
- CCH de Código Claude (Handshake de Canal de Compatibilidade): `open-sse/services/claudeCodeCCH.ts`,
|
||||
além de `claudeCodeCompatible.ts`, `claudeCodeConstraints.ts`, `claudeCodeExtraRemap.ts`,
|
||||
`claudeCodeToolRemapper.ts`
|
||||
- Modelagem de impressão digital do Claude Code: `open-sse/services/claudeCodeFingerprint.ts`
|
||||
- Ofuscação do Claude Code: `open-sse/services/claudeCodeObfuscation.ts`
|
||||
- Modelagem de impressão digital de Código Claude: `open-sse/services/claudeCodeFingerprint.ts`
|
||||
- Ofuscação de Código Claude: `open-sse/services/claudeCodeObfuscation.ts`
|
||||
- Cliente TLS do ChatGPT: `open-sse/services/chatgptTlsClient.ts` (estilo curl-impersonate
|
||||
para sessões do ChatGPT-Web)
|
||||
- Cache de imagem do ChatGPT: `open-sse/services/chatgptImageCache.ts`
|
||||
@@ -470,15 +479,15 @@ Para o guia completo de furtividade e orientações operacionais, consulte
|
||||
### H. Webhooks, Cache de Raciocínio, Cache de Leitura
|
||||
|
||||
- **Webhooks** — despacho de saída para eventos de provedor/conta/tarefa.
|
||||
- Dispatcher: `src/lib/webhookDispatcher.ts`
|
||||
- Despachante: `src/lib/webhookDispatcher.ts`
|
||||
- Armazenamento: tabela SQLite `webhooks` (via `src/lib/db/webhooks.ts`)
|
||||
- Painel: `/dashboard/webhooks` (assinaturas, segredos, histórico de tentativas)
|
||||
- Para taxonomia de eventos e semântica de tentativas, consulte [`docs/frameworks/WEBHOOKS.md`](../frameworks/WEBHOOKS.md).
|
||||
- **Cache de Raciocínio** — blocos de raciocínio replays para provedores que emitem
|
||||
tokens de pensamento (Claude, GLMT, etc.) para que turnos consecutivos possam pular o re-pensar.
|
||||
- **Cache de Raciocínio** — blocos de raciocínio reproduzíveis para provedores que emitem
|
||||
tokens de pensamento (Claude, GLMT, etc.) para que turnos consecutivos possam pular o re-pensamento.
|
||||
- Camada de DB: `src/lib/db/reasoningCache.ts`
|
||||
- Camada de serviço: `open-sse/services/reasoningCache.ts`
|
||||
- Para semântica de replay, consulte [`docs/routing/REASONING_REPLAY.md`](../routing/REASONING_REPLAY.md).
|
||||
- Para semântica de reprodução, consulte [`docs/routing/REASONING_REPLAY.md`](../routing/REASONING_REPLAY.md).
|
||||
- **Cache de Leitura** — cache de resposta de curta duração indexado por assinatura e usado para
|
||||
colapsar tentativas idênticas de SDKs upstream quebrados.
|
||||
- Camada de DB: `src/lib/db/readCache.ts`
|
||||
@@ -513,7 +522,7 @@ Banco de dados de estado de domínio (SQLite):
|
||||
- Segredos do provedor persistidos nas entradas de `providerConnections`
|
||||
- Suporte a proxy de saída via `open-sse/utils/proxyFetch.ts` (variáveis de ambiente) e `open-sse/utils/networkProxy.ts` (configurável por provedor ou global)
|
||||
- Proteção SSRF / URL de saída: `src/shared/network/outboundUrlGuard.ts` — bloqueia intervalos privados/loopback/link-local para todas as chamadas de provedor
|
||||
- Validação do ambiente em tempo de execução: `src/lib/env/runtimeEnv.ts` — esquema Zod para todas as variáveis de ambiente, apresentado como erros/avisos de inicialização
|
||||
- Validação do ambiente em tempo de execução: `src/lib/env/runtimeEnv.ts` — esquema Zod para todas as variáveis de ambiente, exibido como erros/avisos de inicialização
|
||||
- Tokens de sincronização: `src/lib/db/syncTokens.ts` — tokens escopados para endpoints de download de pacotes de configuração; respaldados pela tabela SQLite `sync_tokens` (migração `024_create_sync_tokens.sql`)
|
||||
- Autenticação de handshake WebSocket: `src/lib/ws/handshake.ts` — valida solicitações de upgrade WS via chave de API ou cookie de sessão
|
||||
|
||||
@@ -620,8 +629,8 @@ sequenceDiagram
|
||||
ProvAuth-->>OAuth: URL de auth ou payload de código de dispositivo
|
||||
OAuth-->>UI: dados do fluxo
|
||||
|
||||
UI->>OAuth: POST trocar ou poll
|
||||
OAuth->>ProvAuth: troca/poll de token
|
||||
UI->>OAuth: POST trocar ou consultar
|
||||
OAuth->>ProvAuth: troca de token/consulta
|
||||
ProvAuth-->>OAuth: tokens de acesso/atualização
|
||||
OAuth->>DB: createProviderConnection(dados oauth)
|
||||
OAuth-->>UI: sucesso + id da conexão
|
||||
@@ -772,9 +781,9 @@ erDiagram
|
||||
|
||||
Arquivos de armazenamento físico:
|
||||
|
||||
- banco de dados de execução primário: `${DATA_DIR}/storage.sqlite`
|
||||
- linhas de log de requisição: `${DATA_DIR}/log.txt` (artefato de compatibilidade/debug)
|
||||
- arquivos de carga útil de chamadas estruturadas: `${DATA_DIR}/call_logs/`
|
||||
- banco de dados de runtime principal: `${DATA_DIR}/storage.sqlite`
|
||||
- linhas de log de requisições: `${DATA_DIR}/log.txt` (artefato de compatibilidade/debug)
|
||||
- arquivos de payload de chamadas estruturadas: `${DATA_DIR}/call_logs/`
|
||||
- sessões de depuração de tradutor/requisição opcionais: `<repo>/logs/...`
|
||||
|
||||
## Topologia de Implantação
|
||||
@@ -786,7 +795,7 @@ flowchart LR
|
||||
Browser[Navegador do Dashboard]
|
||||
end
|
||||
|
||||
subgraph ContainerOrProcess[Execução do OmniRoute]
|
||||
subgraph ContainerOrProcess[Runtime OmniRoute]
|
||||
Next[Servidor Next.js\nPORT=20128]
|
||||
Core[Núcleo SSE + Executores]
|
||||
MainDB[(storage.sqlite)]
|
||||
@@ -814,7 +823,7 @@ flowchart LR
|
||||
|
||||
- `src/app/api/v1/*`, `src/app/api/v1beta/*`: APIs de compatibilidade
|
||||
- `src/app/api/v1/providers/[provider]/*`: rotas dedicadas por provedor (chat, embeddings, imagens)
|
||||
- `src/app/api/providers*`: CRUD de provedores, validação, teste
|
||||
- `src/app/api/providers*`: CRUD de provedor, validação, teste
|
||||
- `src/app/api/provider-nodes*`: gerenciamento de nós compatíveis personalizados
|
||||
- `src/app/api/provider-models`: gerenciamento de modelos personalizados (CRUD)
|
||||
- `src/app/api/models/route.ts`: API de catálogo de modelos (aliases + modelos personalizados)
|
||||
@@ -822,18 +831,18 @@ flowchart LR
|
||||
- `src/app/api/keys*`: ciclo de vida da chave API local
|
||||
- `src/app/api/models/alias`: gerenciamento de alias
|
||||
- `src/app/api/combos*`: gerenciamento de combos de fallback
|
||||
- `src/app/api/pricing`: substituições de preços para cálculo de custos
|
||||
- `src/app/api/pricing`: substituições de preços para cálculo de custo
|
||||
- `src/app/api/settings/proxy`: configuração de proxy (GET/PUT/DELETE)
|
||||
- `src/app/api/settings/proxy/test`: teste de conectividade de proxy de saída (POST)
|
||||
- `src/app/api/usage/*`: APIs de uso e logs
|
||||
- `src/app/api/sync/*` + `src/app/api/cloud/*`: sincronização em nuvem e helpers voltados para a nuvem
|
||||
- `src/app/api/sync/*` + `src/app/api/cloud/*`: sincronização em nuvem e auxiliares voltados para a nuvem
|
||||
- `src/app/api/cli-tools/*`: escritores/verificadores de configuração CLI local
|
||||
- `src/app/api/settings/ip-filter`: lista de permissão/bloqueio de IP (GET/PUT)
|
||||
- `src/app/api/settings/thinking-budget`: configuração do orçamento de tokens de pensamento (GET/PUT)
|
||||
- `src/app/api/settings/system-prompt`: prompt do sistema global (GET/PUT)
|
||||
- `src/app/api/settings/compression`: configurações de compressão global (GET/PUT)
|
||||
- `src/app/api/compression/*`: visualização de compressão, metadados de regras e pacotes de idiomas
|
||||
- `src/app/api/context/caveman/config`: alias de configurações do Caveman (GET/PUT)
|
||||
- `src/app/api/compression/*`: visualização de compressão, metadados de regras e pacotes de idioma
|
||||
- `src/app/api/context/caveman/config`: alias de configurações Caveman (GET/PUT)
|
||||
- `src/app/api/context/rtk/*`: configuração RTK, catálogo de filtros, endpoint de teste e recuperação de saída bruta
|
||||
- `src/app/api/context/combos*`: CRUD de combos de compressão e atribuições de combos de roteamento
|
||||
- `src/app/api/context/analytics`: alias de análises de compressão
|
||||
@@ -846,7 +855,7 @@ flowchart LR
|
||||
|
||||
### Núcleo de Roteamento e Execução
|
||||
|
||||
- `src/sse/handlers/chat.ts`: análise de requisição, manipulação de combo, loop de seleção de conta
|
||||
- `src/sse/handlers/chat.ts`: análise de requisições, manipulação de combos, loop de seleção de conta
|
||||
- `open-sse/handlers/chatCore.ts`: tradução, despacho de executores, manipulação de retry/refresh, configuração de stream
|
||||
- `open-sse/executors/*`: comportamento de rede e formato específico do provedor
|
||||
|
||||
@@ -855,32 +864,32 @@ flowchart LR
|
||||
- `open-sse/translator/index.ts`: registro e orquestração de tradutores
|
||||
- Tradutores de requisição: `open-sse/translator/request/*` (9 módulos — `antigravity-to-openai`, `claude-to-gemini`, `claude-to-openai`, `gemini-to-openai`, `openai-responses`, `openai-to-claude`, `openai-to-cursor`, `openai-to-gemini`, `openai-to-kiro`)
|
||||
- Tradutores de resposta: `open-sse/translator/response/*` (8 módulos — `claude-to-openai`, `cursor-to-openai`, `gemini-to-claude`, `gemini-to-openai`, `kiro-to-openai`, `openai-responses`, `openai-to-antigravity`, `openai-to-claude`)
|
||||
- Helpers: `open-sse/translator/helpers/*` (8 módulos — `claudeHelper`, `geminiHelper`, `geminiToolsSanitizer`, `maxTokensHelper`, `openaiHelper`, `responsesApiHelper`, `schemaCoercion`, `toolCallHelper`)
|
||||
- Auxiliares: `open-sse/translator/helpers/*` (8 módulos — `claudeHelper`, `geminiHelper`, `geminiToolsSanitizer`, `maxTokensHelper`, `openaiHelper`, `responsesApiHelper`, `schemaCoercion`, `toolCallHelper`)
|
||||
- Constantes de formato: `open-sse/translator/formats.ts`
|
||||
- Bootstrap e registro: `open-sse/translator/bootstrap.ts`, `open-sse/translator/registry.ts`
|
||||
- Helpers de formato de imagem: `open-sse/translator/image/`
|
||||
- Auxiliares de formato de imagem: `open-sse/translator/image/`
|
||||
|
||||
### Persistência
|
||||
|
||||
- `src/lib/db/*`: configuração/persistência de estado e domínio persistente no SQLite
|
||||
- `src/lib/db/*`: configuração/persistência de estado persistente e persistência de domínio no SQLite
|
||||
- `src/lib/localDb.ts`: re-exportação de compatibilidade para módulos de DB
|
||||
- `src/lib/usageDb.ts`: fachada de histórico de uso/logs de chamadas sobre tabelas SQLite
|
||||
|
||||
## Cobertura do Executor do Provedor (Padrão de Estratégia)
|
||||
|
||||
Cada provedor possui um executor especializado que estende `BaseExecutor` (em `open-sse/executors/base.ts`), que fornece construção de URL, construção de cabeçalhos, tentativas com retrocesso exponencial, ganchos de atualização de credenciais e o método de orquestração `execute()`.
|
||||
Cada provedor tem um executor especializado que estende `BaseExecutor` (em `open-sse/executors/base.ts`), que fornece construção de URL, construção de cabeçalhos, tentativas com retrocesso exponencial, ganchos de atualização de credenciais e o método de orquestração `execute()`.
|
||||
|
||||
| Executor | Provedor(es) | Tratamento Especial |
|
||||
| ------------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------ |
|
||||
| `DefaultExecutor` | OpenAI, Claude, Gemini, Qwen, OpenRouter, GLM, Kimi, MiniMax, DeepSeek, Groq, xAI, Mistral, Perplexity, Together, Fireworks, Cerebras, Cohere, NVIDIA, etc. | Configuração dinâmica de URL/cabeçalho por provedor |
|
||||
| `AntigravityExecutor` | Google Antigravity | IDs de projeto/sessão personalizados, análise de Retry-After, ofuscação de 429 |
|
||||
| `AzureOpenAIExecutor` | Azure OpenAI | Roteamento baseado em implantação, aplicação de consulta de api-version |
|
||||
| `AzureOpenAIExecutor` | Azure OpenAI | Roteamento baseado em implantação, imposição de consulta de api-version |
|
||||
| `BlackboxWebExecutor` | Blackbox AI (modo web) | Reversão de sessão web com emulação de impressão digital TLS |
|
||||
| `ChatGPTWebExecutor` | ChatGPT web | Gerenciamento de cliente TLS + cookie de sessão (`chatgptTlsClient.ts`) |
|
||||
| `ClaudeIdentityExecutor` | Claude.ai (caminho CCH) | Pipelines de restrição + remapeamento de ferramentas, modelagem de impressão digital |
|
||||
| `CliProxyApiExecutor` | Provedores compatíveis com CLIProxyAPI | Tratamento personalizado de autenticação e protocolo |
|
||||
| `CliProxyApiExecutor` | Provedores compatíveis com CLIProxyAPI | Manipulação personalizada de autenticação e protocolo |
|
||||
| `CloudflareAiExecutor` | Cloudflare Workers AI | Injeção de ID de conta, rastreamento de uso baseado em Neurons |
|
||||
| `CodexExecutor` | OpenAI Codex | Injeções de instruções do sistema, força de esforço de raciocínio |
|
||||
| `CodexExecutor` | OpenAI Codex | Injeta instruções do sistema, força esforço de raciocínio |
|
||||
| `CommandCodeExecutor` | Código de Comando | Rotação de cabeçalho por sessão + OAuth |
|
||||
| `CursorExecutor` | Cursor IDE | Protocolo ConnectRPC, codificação Protobuf, assinatura de requisições via checksum |
|
||||
| `DevinCliExecutor` | Devin CLI | Conexão do ciclo de vida da tarefa Devin via módulo de agente em nuvem |
|
||||
@@ -906,72 +915,72 @@ Todos os outros provedores (incluindo nós compatíveis personalizados) usam o `
|
||||
|
||||
## Matriz de Compatibilidade de Provedores
|
||||
|
||||
> **Nota:** A matriz abaixo é uma amostra representativa dos 179 provedores registrados no
|
||||
> **Nota:** A matriz abaixo é uma amostra representativa dos 177 provedores registrados no
|
||||
> OmniRoute v3.8.0. Para a lista canônica e continuamente atualizada, consulte
|
||||
> [`docs/reference/PROVIDER_REFERENCE.md`](../reference/PROVIDER_REFERENCE.md) (gerada automaticamente) ou a fonte
|
||||
> de verdade em `src/shared/constants/providers.ts` (validada pelo Zod no carregamento).
|
||||
|
||||
| Provedor | Formato | Autenticação | Stream | Não-Stream | Atualização de Token | API de Uso |
|
||||
| ----------------- | ---------------- | -------------------------- | ---------------- | ---------- | -------------------- | -------------------- |
|
||||
| Claude | claude | Chave de API / OAuth | ✅ | ✅ | ✅ | ⚠️ Somente Admin |
|
||||
| Gemini | gemini | Chave de API / OAuth | ✅ | ✅ | ✅ | ⚠️ Console da Nuvem |
|
||||
| Gemini CLI | gemini-cli | OAuth | ✅ | ✅ | ✅ | ⚠️ Console da Nuvem |
|
||||
| Antigravity | antigravity | OAuth | ✅ | ✅ | ✅ | ✅ API de cota total |
|
||||
| OpenAI | openai | Chave de API | ✅ | ✅ | ❌ | ❌ |
|
||||
| Codex | openai-responses | OAuth | ✅ forçado | ❌ | ✅ | ✅ Limites de taxa |
|
||||
| GitHub Copilot | openai | OAuth + Token Copilot | ✅ | ✅ | ✅ | ✅ Capturas de cota |
|
||||
| Cursor | cursor | Checksum personalizado | ✅ | ✅ | ❌ | ❌ |
|
||||
| Kiro | kiro | AWS SSO OIDC | ✅ (EventStream) | ❌ | ✅ | ✅ Limites de uso |
|
||||
| Qwen | openai | OAuth | ✅ | ✅ | ✅ | ⚠️ Por solicitação |
|
||||
| Qoder | openai | OAuth / PAT | ✅ | ✅ | ✅ | ⚠️ Por solicitação |
|
||||
| Kilo Code | openai | OAuth | ✅ | ✅ | ✅ | ❌ |
|
||||
| Cline | openai | OAuth | ✅ | ✅ | ✅ | ❌ |
|
||||
| Kimi Coding | openai | OAuth | ✅ | ✅ | ✅ | ❌ |
|
||||
| OpenRouter | openai | Chave de API | ✅ | ✅ | ❌ | ❌ |
|
||||
| GLM/Kimi/MiniMax | claude | Chave de API | ✅ | ✅ | ❌ | ❌ |
|
||||
| DeepSeek | openai | Chave de API | ✅ | ✅ | ❌ | ❌ |
|
||||
| Groq | openai | Chave de API | ✅ | ✅ | ❌ | ❌ |
|
||||
| xAI (Grok) | openai | Chave de API | ✅ | ✅ | ❌ | ❌ |
|
||||
| Mistral | openai | Chave de API | ✅ | ✅ | ❌ | ❌ |
|
||||
| Perplexity | openai | Chave de API | ✅ | ✅ | ❌ | ❌ |
|
||||
| Together AI | openai | Chave de API | ✅ | ✅ | ❌ | ❌ |
|
||||
| Fireworks AI | openai | Chave de API | ✅ | ✅ | ❌ | ❌ |
|
||||
| Cerebras | openai | Chave de API | ✅ | ✅ | ❌ | ❌ |
|
||||
| Cohere | openai | Chave de API | ✅ | ✅ | ❌ | ❌ |
|
||||
| NVIDIA NIM | openai | Chave de API | ✅ | ✅ | ❌ | ❌ |
|
||||
| Cloudflare AI | openai | Token de API + ID da Conta | ✅ | ✅ | ❌ | ❌ |
|
||||
| Pollinations | openai | Nenhum (sem chave) | ✅ | ✅ | ❌ | ❌ |
|
||||
| Scaleway AI | openai | Chave de API | ✅ | ✅ | ❌ | ❌ |
|
||||
| LongCat | openai | Chave de API | ✅ | ✅ | ❌ | ❌ |
|
||||
| Ollama Cloud | openai | Chave de API (opcional) | ✅ | ✅ | ❌ | ❌ |
|
||||
| HuggingFace | openai | Chave de API | ✅ | ✅ | ❌ | ❌ |
|
||||
| Nebius | openai | Chave de API | ✅ | ✅ | ❌ | ❌ |
|
||||
| SiliconFlow | openai | Chave de API | ✅ | ✅ | ❌ | ❌ |
|
||||
| Hyperbolic | openai | Chave de API | ✅ | ✅ | ❌ | ❌ |
|
||||
| Vertex AI | gemini | Conta de Serviço | ✅ | ✅ | ✅ | ⚠️ Console da Nuvem |
|
||||
| Puter | openai | Chave de API | ✅ | ✅ | ❌ | ❌ |
|
||||
| Command Code | openai | OAuth | ✅ | ✅ | ✅ | ⚠️ Por solicitação |
|
||||
| Z.AI / GLM | openai | Chave de API / OAuth | ✅ | ✅ | ❌ | ❌ |
|
||||
| GLMT (preset) | claude | Chave de API | ✅ | ✅ | ❌ | ⚠️ Por solicitação |
|
||||
| Kimi Coding | openai | OAuth / Chave de API | ✅ | ✅ | ✅ | ❌ |
|
||||
| KIE | openai | Chave de API | ✅ | ✅ | ❌ | ❌ |
|
||||
| Windsurf | openai | OAuth (Codeium) | ✅ | ✅ | ✅ | ⚠️ Por solicitação |
|
||||
| GitLab Duo | openai | OAuth (GitLab) | ✅ | ✅ | ✅ | ❌ |
|
||||
| Devin CLI | openai | OAuth | ✅ | ✅ | ✅ | ✅ API de Tarefas |
|
||||
| Codex Cloud | openai-responses | OAuth | ✅ | ❌ | ✅ | ✅ Limites de taxa |
|
||||
| Jules | openai | OAuth | ✅ | ✅ | ✅ | ✅ API de Tarefas |
|
||||
| AgentRouter | openai | Chave de API | ✅ | ✅ | ❌ | ❌ |
|
||||
| ChatGPT-Web | openai | Cookie de sessão + TLS | ✅ | ✅ | ❌ | ❌ |
|
||||
| Grok-Web | openai | Cookie de sessão | ✅ | ✅ | ❌ | ❌ |
|
||||
| Perplexity-Web | openai | Cookie de sessão | ✅ | ✅ | ❌ | ❌ |
|
||||
| BlackBox-Web | openai | Cookie de sessão + TLS | ✅ | ✅ | ❌ | ❌ |
|
||||
| Muse-Spark-Web | openai | Cookie de sessão | ✅ | ✅ | ❌ | ❌ |
|
||||
| ModelScope | openai | Chave de API | ✅ | ✅ | ❌ | ⚠️ Política de cota |
|
||||
| BazaarLink | openai | Chave de API | ✅ | ✅ | ❌ | ❌ |
|
||||
| Petals | openai | Nenhum | ✅ | ✅ | ❌ | ❌ |
|
||||
| Qoder | openai | OAuth / PAT | ✅ | ✅ | ✅ | ⚠️ Por solicitação |
|
||||
| OpenCode (Go/Zen) | openai | OAuth | ✅ | ✅ | ✅ | ❌ |
|
||||
| CLIProxyAPI | openai | Personalizado | ✅ | ✅ | ❌ | ❌ |
|
||||
| Provedor | Formato | Autenticação | Stream | Não-Stream | Atualização de Token | API de Uso |
|
||||
| ----------------- | ---------------- | -------------------------- | ---------------- | ---------- | -------------------- | ----------------------- |
|
||||
| Claude | claude | Chave de API / OAuth | ✅ | ✅ | ✅ | ⚠️ Somente Admin |
|
||||
| Gemini | gemini | Chave de API / OAuth | ✅ | ✅ | ✅ | ⚠️ Console da Nuvem |
|
||||
| Gemini CLI | gemini-cli | OAuth | ✅ | ✅ | ✅ | ⚠️ Console da Nuvem |
|
||||
| Antigravity | antigravity | OAuth | ✅ | ✅ | ✅ | ✅ API de cota total |
|
||||
| OpenAI | openai | Chave de API | ✅ | ✅ | ❌ | ❌ |
|
||||
| Codex | openai-responses | OAuth | ✅ forçado | ❌ | ✅ | ✅ Limites de taxa |
|
||||
| GitHub Copilot | openai | OAuth + Token Copilot | ✅ | ✅ | ✅ | ✅ Instantâneas de cota |
|
||||
| Cursor | cursor | Checksum personalizado | ✅ | ✅ | ❌ | ❌ |
|
||||
| Kiro | kiro | AWS SSO OIDC | ✅ (EventStream) | ❌ | ✅ | ✅ Limites de uso |
|
||||
| Qwen | openai | OAuth | ✅ | ✅ | ✅ | ⚠️ Por solicitação |
|
||||
| Qoder | openai | OAuth / PAT | ✅ | ✅ | ✅ | ⚠️ Por solicitação |
|
||||
| Kilo Code | openai | OAuth | ✅ | ✅ | ✅ | ❌ |
|
||||
| Cline | openai | OAuth | ✅ | ✅ | ✅ | ❌ |
|
||||
| Kimi Coding | openai | OAuth | ✅ | ✅ | ✅ | ❌ |
|
||||
| OpenRouter | openai | Chave de API | ✅ | ✅ | ❌ | ❌ |
|
||||
| GLM/Kimi/MiniMax | claude | Chave de API | ✅ | ✅ | ❌ | ❌ |
|
||||
| DeepSeek | openai | Chave de API | ✅ | ✅ | ❌ | ❌ |
|
||||
| Groq | openai | Chave de API | ✅ | ✅ | ❌ | ❌ |
|
||||
| xAI (Grok) | openai | Chave de API | ✅ | ✅ | ❌ | ❌ |
|
||||
| Mistral | openai | Chave de API | ✅ | ✅ | ❌ | ❌ |
|
||||
| Perplexity | openai | Chave de API | ✅ | ✅ | ❌ | ❌ |
|
||||
| Together AI | openai | Chave de API | ✅ | ✅ | ❌ | ❌ |
|
||||
| Fireworks AI | openai | Chave de API | ✅ | ✅ | ❌ | ❌ |
|
||||
| Cerebras | openai | Chave de API | ✅ | ✅ | ❌ | ❌ |
|
||||
| Cohere | openai | Chave de API | ✅ | ✅ | ❌ | ❌ |
|
||||
| NVIDIA NIM | openai | Chave de API | ✅ | ✅ | ❌ | ❌ |
|
||||
| Cloudflare AI | openai | Token de API + ID da conta | ✅ | ✅ | ❌ | ❌ |
|
||||
| Pollinations | openai | Nenhum (sem chave) | ✅ | ✅ | ❌ | ❌ |
|
||||
| Scaleway AI | openai | Chave de API | ✅ | ✅ | ❌ | ❌ |
|
||||
| LongCat | openai | Chave de API | ✅ | ✅ | ❌ | ❌ |
|
||||
| Ollama Cloud | openai | Chave de API (opcional) | ✅ | ✅ | ❌ | ❌ |
|
||||
| HuggingFace | openai | Chave de API | ✅ | ✅ | ❌ | ❌ |
|
||||
| Nebius | openai | Chave de API | ✅ | ✅ | ❌ | ❌ |
|
||||
| SiliconFlow | openai | Chave de API | ✅ | ✅ | ❌ | ❌ |
|
||||
| Hyperbolic | openai | Chave de API | ✅ | ✅ | ❌ | ❌ |
|
||||
| Vertex AI | gemini | Conta de Serviço | ✅ | ✅ | ✅ | ⚠️ Console da Nuvem |
|
||||
| Puter | openai | Chave de API | ✅ | ✅ | ❌ | ❌ |
|
||||
| Command Code | openai | OAuth | ✅ | ✅ | ✅ | ⚠️ Por solicitação |
|
||||
| Z.AI / GLM | openai | Chave de API / OAuth | ✅ | ✅ | ❌ | ❌ |
|
||||
| GLMT (preset) | claude | Chave de API | ✅ | ✅ | ❌ | ⚠️ Por solicitação |
|
||||
| Kimi Coding | openai | OAuth / Chave de API | ✅ | ✅ | ✅ | ❌ |
|
||||
| KIE | openai | Chave de API | ✅ | ✅ | ❌ | ❌ |
|
||||
| Windsurf | openai | OAuth (Codeium) | ✅ | ✅ | ✅ | ⚠️ Por solicitação |
|
||||
| GitLab Duo | openai | OAuth (GitLab) | ✅ | ✅ | ✅ | ❌ |
|
||||
| Devin CLI | openai | OAuth | ✅ | ✅ | ✅ | ✅ API de Tarefas |
|
||||
| Codex Cloud | openai-responses | OAuth | ✅ | ❌ | ✅ | ✅ Limites de taxa |
|
||||
| Jules | openai | OAuth | ✅ | ✅ | ✅ | ✅ API de Tarefas |
|
||||
| AgentRouter | openai | Chave de API | ✅ | ✅ | ❌ | ❌ |
|
||||
| ChatGPT-Web | openai | Cookie de sessão + TLS | ✅ | ✅ | ❌ | ❌ |
|
||||
| Grok-Web | openai | Cookie de sessão | ✅ | ✅ | ❌ | ❌ |
|
||||
| Perplexity-Web | openai | Cookie de sessão | ✅ | ✅ | ❌ | ❌ |
|
||||
| BlackBox-Web | openai | Cookie de sessão + TLS | ✅ | ✅ | ❌ | ❌ |
|
||||
| Muse-Spark-Web | openai | Cookie de sessão | ✅ | ✅ | ❌ | ❌ |
|
||||
| ModelScope | openai | Chave de API | ✅ | ✅ | ❌ | ⚠️ Política de cota |
|
||||
| BazaarLink | openai | Chave de API | ✅ | ✅ | ❌ | ❌ |
|
||||
| Petals | openai | Nenhum | ✅ | ✅ | ❌ | ❌ |
|
||||
| Qoder | openai | OAuth / PAT | ✅ | ✅ | ✅ | ⚠️ Por solicitação |
|
||||
| OpenCode (Go/Zen) | openai | OAuth | ✅ | ✅ | ✅ | ❌ |
|
||||
| CLIProxyAPI | openai | Personalizado | ✅ | ✅ | ❌ | ❌ |
|
||||
|
||||
## Cobertura de Tradução de Formato
|
||||
|
||||
@@ -984,9 +993,9 @@ Os formatos de origem detectados incluem:
|
||||
|
||||
Os formatos de destino incluem:
|
||||
|
||||
- OpenAI chat/Respostas
|
||||
- OpenAI chat/Responses
|
||||
- Claude
|
||||
- Gemini/Gemini-CLI/envelope Antigravity
|
||||
- Gemini/Gemini-CLI/Antigravity envelope
|
||||
- Kiro
|
||||
- Cursor
|
||||
|
||||
@@ -996,12 +1005,12 @@ As traduções usam **OpenAI como o formato central** — todas as conversões p
|
||||
Formato de Origem → OpenAI (central) → Formato de Destino
|
||||
```
|
||||
|
||||
As traduções são selecionadas dinamicamente com base na forma do payload de origem e no formato de destino do provedor.
|
||||
As traduções são selecionadas dinamicamente com base na forma da carga útil de origem e no formato de destino do provedor.
|
||||
|
||||
Camadas de processamento adicionais no pipeline de tradução:
|
||||
|
||||
- **Sanitização de resposta** — Remove campos não padrão das respostas no formato OpenAI (tanto streaming quanto não streaming) para garantir conformidade estrita com o SDK
|
||||
- **Normalização de função** — Converte `developer` → `system` para alvos que não são OpenAI; mescla `system` → `user` para modelos que rejeitam a função de sistema (GLM, ERNIE)
|
||||
- **Normalização de função** — Converte `developer` → `system` para destinos que não são OpenAI; mescla `system` → `user` para modelos que rejeitam a função de sistema (GLM, ERNIE)
|
||||
- **Extração de tag de pensamento** — Analisa blocos ``do conteúdo para o campo`reasoning_content`
|
||||
- **Saída estruturada** — Converte `response_format.json_schema` do OpenAI para `responseMimeType` + `responseSchema` do Gemini
|
||||
|
||||
@@ -1011,16 +1020,16 @@ Camadas de processamento adicionais no pipeline de tradução:
|
||||
| -------------------------------------------------- | ------------------------- | --------------------------------------------------------------------------------------------- |
|
||||
| `POST /v1/chat/completions` | OpenAI Chat | `src/sse/handlers/chat.ts` |
|
||||
| `POST /v1/messages` | Claude Messages | Mesmo manipulador (detecção automática) |
|
||||
| `POST /v1/responses` | OpenAI Respostas | `open-sse/handlers/responsesHandler.ts` |
|
||||
| `POST /v1/responses` | OpenAI Responses | `open-sse/handlers/responsesHandler.ts` |
|
||||
| `POST /v1/embeddings` | OpenAI Embeddings | `open-sse/handlers/embeddings.ts` |
|
||||
| `GET /v1/embeddings` | Listagem de Modelos | Rota da API |
|
||||
| `POST /v1/images/generations` | OpenAI Imagens | `open-sse/handlers/imageGeneration.ts` |
|
||||
| `POST /v1/images/generations` | OpenAI Images | `open-sse/handlers/imageGeneration.ts` |
|
||||
| `GET /v1/images/generations` | Listagem de Modelos | Rota da API |
|
||||
| `POST /v1/providers/{provider}/chat/completions` | OpenAI Chat | Dedicado por provedor com validação de modelo |
|
||||
| `POST /v1/providers/{provider}/embeddings` | OpenAI Embeddings | Dedicado por provedor com validação de modelo |
|
||||
| `POST /v1/providers/{provider}/images/generations` | OpenAI Imagens | Dedicado por provedor com validação de modelo |
|
||||
| `POST /v1/providers/{provider}/images/generations` | OpenAI Images | Dedicado por provedor com validação de modelo |
|
||||
| `POST /v1/messages/count_tokens` | Contagem de Tokens Claude | Rota da API |
|
||||
| `GET /v1/models` | Lista de Modelos OpenAI | Rota da API (chat + embedding + imagem + modelos personalizados) |
|
||||
| `GET /v1/models` | Lista de Modelos OpenAI | Rota da API (chat + embedding + image + modelos personalizados) |
|
||||
| `GET /api/models/catalog` | Catálogo | Todos os modelos agrupados por provedor + tipo |
|
||||
| `POST /v1beta/models/*:streamGenerateContent` | Nativo do Gemini | Rota da API |
|
||||
| `GET/PUT/DELETE /api/settings/proxy` | Configuração de Proxy | Configuração de proxy de rede |
|
||||
@@ -1035,7 +1044,7 @@ O manipulador de bypass (`open-sse/utils/bypassHandler.ts`) intercepta solicita
|
||||
|
||||
O antigo registrador de solicitações baseado em arquivo (`open-sse/utils/requestLogger.ts`) é mantido apenas para compatibilidade com versões anteriores. O contrato de tempo de execução atual utiliza:
|
||||
|
||||
- `APP_LOG_TO_FILE=true` para logs de aplicação e auditoria gravados em `<repo>/logs/`
|
||||
- `APP_LOG_TO_FILE=true` para logs de aplicação e auditoria escritos em `<repo>/logs/`
|
||||
- Registros de log de chamadas com suporte a SQLite em `call_logs`
|
||||
- Artefatos em `${DATA_DIR}/call_logs/YYYY-MM-DD/...` quando o pipeline de log de chamadas está habilitado
|
||||
|
||||
@@ -1049,21 +1058,21 @@ O antigo registrador de solicitações baseado em arquivo (`open-sse/utils/reque
|
||||
|
||||
## 2) Expiração de Token
|
||||
|
||||
- pré-verificação e atualização com tentativa de repetição para provedores atualizáveis
|
||||
- tentativa de repetição 401/403 após tentativa de atualização no caminho principal
|
||||
- pré-verificação e atualização com nova tentativa para provedores atualizáveis
|
||||
- nova tentativa 401/403 após tentativa de atualização no caminho principal
|
||||
|
||||
## 3) Segurança do Stream
|
||||
## 3) Segurança de Stream
|
||||
|
||||
- controlador de stream ciente de desconexões
|
||||
- stream de tradução com descarte de fim de stream e tratamento de `[DONE]`
|
||||
- fallback de estimativa de uso quando os metadados de uso do provedor estão ausentes
|
||||
|
||||
## 4) Degradação da Sincronização na Nuvem
|
||||
## 4) Degradação de Sincronização em Nuvem
|
||||
|
||||
- erros de sincronização são exibidos, mas o tempo de execução local continua
|
||||
- o agendador possui lógica capaz de repetição, mas a execução periódica atualmente chama a sincronização de tentativa única por padrão
|
||||
- o agendador possui lógica capaz de nova tentativa, mas a execução periódica atualmente chama a sincronização de tentativa única por padrão
|
||||
|
||||
## 5) Integridade dos Dados
|
||||
## 5) Integridade de Dados
|
||||
|
||||
- migrações de esquema SQLite e ganchos de autoatualização na inicialização
|
||||
- caminho de compatibilidade de migração legado JSON → SQLite
|
||||
@@ -1091,7 +1100,7 @@ A captura detalhada do payload da solicitação armazena até quatro estágios d
|
||||
- solicitação bruta recebida do cliente
|
||||
- solicitação traduzida realmente enviada para upstream
|
||||
- resposta do provedor reconstruída como JSON; respostas transmitidas são compactadas para o resumo final mais metadados do stream
|
||||
- resposta final do cliente retornada pelo OmniRoute; respostas transmitidas são armazenadas na mesma forma de resumo compacto
|
||||
- resposta final do cliente retornada pelo OmniRoute; respostas transmitidas são armazenadas na mesma forma de resumo compactado
|
||||
|
||||
## Limites Sensíveis à Segurança
|
||||
|
||||
@@ -1108,7 +1117,7 @@ Variáveis de ambiente ativamente usadas pelo código:
|
||||
- App/auth: `JWT_SECRET`, `INITIAL_PASSWORD`
|
||||
- Armazenamento: `DATA_DIR`
|
||||
- Comportamento compatível do node: `ALLOW_MULTI_CONNECTIONS_PER_COMPAT_NODE`
|
||||
- Sobrescrita opcional da base de armazenamento (Linux/macOS quando `DATA_DIR` não estiver definido): `XDG_CONFIG_HOME`
|
||||
- Substituição opcional da base de armazenamento (Linux/macOS quando `DATA_DIR` não definido): `XDG_CONFIG_HOME`
|
||||
- Hashing de segurança: `API_KEY_SECRET`, `MACHINE_ID_SALT`
|
||||
- Registro: `APP_LOG_TO_FILE`, `APP_LOG_RETENTION_DAYS`, `CALL_LOG_RETENTION_DAYS`
|
||||
- URL de sincronização/nuvem: `NEXT_PUBLIC_BASE_URL`, `NEXT_PUBLIC_CLOUD_URL`
|
||||
@@ -1120,21 +1129,21 @@ Variáveis de ambiente ativamente usadas pelo código:
|
||||
|
||||
1. `usageDb` e `localDb` compartilham a mesma política de diretório base (`DATA_DIR` -> `XDG_CONFIG_HOME/omniroute` -> `~/.omniroute`) com migração de arquivos legados.
|
||||
2. `/api/v1/route.ts` delega para o mesmo construtor de catálogo unificado usado por `/api/v1/models` (`src/app/api/v1/models/catalog.ts`) para evitar desvios semânticos.
|
||||
3. O registrador de solicitações escreve cabeçalhos/corpo completos quando habilitado; trate o diretório de logs como sensível.
|
||||
3. O logger de requisições escreve cabeçalhos/corpo completos quando habilitado; trate o diretório de logs como sensível.
|
||||
4. O comportamento em nuvem depende do correto `NEXT_PUBLIC_BASE_URL` e da acessibilidade do endpoint em nuvem.
|
||||
5. O diretório `open-sse/` é publicado como o pacote de **workspace npm** `@omniroute/open-sse`. O código-fonte o importa via `@omniroute/open-sse/...` (resolvido pelo Next.js `transpilePackages`). Os caminhos de arquivos neste documento ainda usam o nome do diretório `open-sse/` para consistência.
|
||||
6. Gráficos no painel usam **Recharts** (baseado em SVG) para visualizações analíticas interativas e acessíveis (gráficos de barras de uso de modelo, tabelas de divisão de provedores com taxas de sucesso).
|
||||
5. O diretório `open-sse/` é publicado como o pacote **npm workspace** `@omniroute/open-sse`. O código-fonte o importa via `@omniroute/open-sse/...` (resolvido pelo Next.js `transpilePackages`). Os caminhos de arquivos neste documento ainda usam o nome do diretório `open-sse/` para consistência.
|
||||
6. Gráficos no painel usam **Recharts** (baseado em SVG) para visualizações analíticas interativas e acessíveis (gráficos de barras de uso de modelo, tabelas de quebra de provedor com taxas de sucesso).
|
||||
7. Testes E2E usam **Playwright** (`tests/e2e/`), executados via `npm run test:e2e`. Testes unitários usam **Node.js test runner** (`tests/unit/`), executados via `npm run test:unit`. O código-fonte sob `src/` é **TypeScript** (`.ts`/`.tsx`); o workspace `open-sse/` permanece em JavaScript (`.js`).
|
||||
8. A página de configurações é organizada em 7 abas: Geral, Aparência, IA, Segurança, Roteamento, Resiliência, Avançado. A página de Resiliência configura apenas a fila de solicitações, o tempo de espera de conexão, o disjuntor do provedor e o comportamento de espera pelo tempo de espera; o estado de tempo de execução do disjuntor ao vivo é mostrado na página de Saúde.
|
||||
9. A estratégia de **Context Relay** (`context-relay`) é dividida em duas camadas: `combo.ts` decide se uma transferência deve ser gerada, `chat.ts` injeta a transferência após a resolução da conta. Os dados da transferência vivem na tabela SQLite `context_handoffs`. Essa divisão é intencional porque apenas `chat.ts` sabe se a conta real mudou.
|
||||
10. A **aplicação de proxy** agora é abrangente: `tokenHealthCheck.ts` resolve o proxy por conexão, `/api/providers/validate` usa `runWithProxyContext`, e `proxyFetch.ts` usa `undici.fetch()` para manter a compatibilidade do despachante no Node 22.
|
||||
8. A página de configurações é organizada em 7 abas: Geral, Aparência, IA, Segurança, Roteamento, Resiliência, Avançado. A página de Resiliência configura apenas a fila de requisições, o tempo de espera de conexão, o quebra-provedor e o comportamento de espera; o estado de tempo de execução do quebra ao vivo é mostrado na página de Saúde.
|
||||
9. A estratégia **Context Relay** (`context-relay`) é dividida em duas camadas: `combo.ts` decide se uma transferência deve ser gerada, `chat.ts` injeta a transferência após a resolução da conta. Os dados da transferência vivem na tabela SQLite `context_handoffs`. Essa divisão é intencional porque apenas `chat.ts` sabe se a conta real mudou.
|
||||
10. A **imposição de proxy** agora é abrangente: `tokenHealthCheck.ts` resolve o proxy por conexão, `/api/providers/validate` usa `runWithProxyContext`, e `proxyFetch.ts` usa `undici.fetch()` para manter a compatibilidade do despachante no Node 22.
|
||||
11. **Detecção de política de tempo de execução do Node.js**: `/api/settings/require-login` retorna os campos `nodeVersion` e `nodeCompatible`. A página de login renderiza um banner de aviso quando o tempo de execução está fora das linhas seguras suportadas do Node.js.
|
||||
|
||||
## Lista de Verificação de Verificação Operacional
|
||||
|
||||
- Compilar a partir do código-fonte: `npm run build`
|
||||
- Construir a imagem Docker: `docker build -t omniroute .`
|
||||
- Iniciar o serviço e verificar:
|
||||
- Construir imagem Docker: `docker build -t omniroute .`
|
||||
- Iniciar serviço e verificar:
|
||||
- `GET /api/settings`
|
||||
- `GET /api/v1/models`
|
||||
- A URL base do alvo da CLI deve ser `http://<host>:20128/v1` quando `PORT=20128`
|
||||
|
||||
Reference in New Issue
Block a user