OmniRoute/docs/i18n/vi/CODEBASE_DOCUMENTATION.md
diegosouzapw 952b0b22c7 docs(i18n): add Swedish locale translations and i18n QA tooling
Add complete Swedish (sv) translation for all documentation files
including API Reference, README, and guides. Introduce automated
i18n QA infrastructure with visual regression testing across
multiple viewports and locales to validate translations.
2026-02-26 16:28:29 -03:00

42 KiB

omniroute — Tài liệu cơ sở mã

🌐 Languages: 🇺🇸 English | 🇧🇷 Português (Brasil) | 🇪🇸 Español | 🇫🇷 Français | 🇮🇹 Italiano | 🇷🇺 Русский | 🇨🇳 中文 (简体) | 🇩🇪 Deutsch | 🇮🇳 हिन्दी | 🇹🇭 ไทย | 🇺🇦 Українська | 🇸🇦 العربية | 🇯🇵 日本語 | 🇻🇳 Tiếng Việt | 🇧🇬 Български | 🇩🇰 Dansk | 🇫🇮 Suomi | 🇮🇱 עברית | 🇭🇺 Magyar | 🇮🇩 Bahasa Indonesia | 🇰🇷 한국어 | 🇲🇾 Bahasa Melayu | 🇳🇱 Nederlands | 🇳🇴 Norsk | 🇵🇹 Português (Portugal) | 🇷🇴 Română | 🇵🇱 Polski | 🇸🇰 Slovenčina | 🇸🇪 Svenska | 🇵🇭 Filipino

Hướng dẫn toàn diện, thân thiện với người mới bắt đầu về bộ định tuyến proxy AI đa nhà cung cấp omnroute.


1. Omniroute là gì?

omniroute là bộ định tuyến proxy nằm giữa các máy khách AI (Claude CLI, Codex, Cursor IDE, v.v.) và các nhà cung cấp AI (Anthropic, Google, OpenAI, AWS, GitHub, v.v.). Nó giải quyết một vấn đề lớn:

Các ứng dụng khách AI khác nhau nói những "ngôn ngữ" (định dạng API) khác nhau và các nhà cung cấp AI khác nhau cũng mong đợi những "ngôn ngữ" khác nhau. omniroute dịch tự động giữa chúng.

Hãy nghĩ về nó giống như một dịch giả phổ quát tại Liên hợp quốc - bất kỳ đại biểu nào cũng có thể nói bất kỳ ngôn ngữ nào và người phiên dịch sẽ chuyển đổi ngôn ngữ đó cho bất kỳ đại biểu nào khác.


2. Tổng quan về kiến trúc

graph LR
    subgraph Clients
        A[Claude CLI]
        B[Codex]
        C[Cursor IDE]
        D[OpenAI-compatible]
    end

    subgraph omniroute
        E[Handler Layer]
        F[Translator Layer]
        G[Executor Layer]
        H[Services Layer]
    end

    subgraph Providers
        I[Anthropic Claude]
        J[Google Gemini]
        K[OpenAI / Codex]
        L[GitHub Copilot]
        M[AWS Kiro]
        N[Antigravity]
        O[Cursor API]
    end

    A --> E
    B --> E
    C --> E
    D --> E
    E --> F
    F --> G
    G --> I
    G --> J
    G --> K
    G --> L
    G --> M
    G --> N
    G --> O
    H -.-> E
    H -.-> G

Nguyên tắc cốt lõi: Dịch Hub-and-Spoke

Tất cả các bản dịch định dạng đều đi qua định dạng OpenAI làm trung tâm:

Client Format → [OpenAI Hub] → Provider Format    (request)
Provider Format → [OpenAI Hub] → Client Format    (response)

Điều này có nghĩa là bạn chỉ cần N người dịch (một người cho mỗi định dạng) thay vì (mỗi cặp).


3. Cấu trúc dự án

omniroute/
├── open-sse/                  ← Core proxy library (portable, framework-agnostic)
│   ├── index.js               ← Main entry point, exports everything
│   ├── config/                ← Configuration & constants
│   ├── executors/             ← Provider-specific request execution
│   ├── handlers/              ← Request handling orchestration
│   ├── services/              ← Business logic (auth, models, fallback, usage)
│   ├── translator/            ← Format translation engine
│   │   ├── request/           ← Request translators (8 files)
│   │   ├── response/          ← Response translators (7 files)
│   │   └── helpers/           ← Shared translation utilities (6 files)
│   └── utils/                 ← Utility functions
├── src/                       ← Application layer (Express/Worker runtime)
│   ├── app/                   ← Web UI, API routes, middleware
│   ├── lib/                   ← Database, auth, and shared library code
│   ├── mitm/                  ← Man-in-the-middle proxy utilities
│   ├── models/                ← Database models
│   ├── shared/                ← Shared utilities (wrappers around open-sse)
│   ├── sse/                   ← SSE endpoint handlers
│   └── store/                 ← State management
├── data/                      ← Runtime data (credentials, logs)
│   └── provider-credentials.json   (external credentials override, gitignored)
└── tester/                    ← Test utilities

4. Phân tích theo từng mô-đun

Cấu hình 4.1 (open-sse/config/)

nguồn tin cậy duy nhất cho tất cả cấu hình của nhà cung cấp.

Tập tin Mục đích
constants.ts PROVIDERS có URL cơ sở, thông tin xác thực OAuth (mặc định), tiêu đề và lời nhắc hệ thống mặc định cho mọi nhà cung cấp. Đồng thời xác định HTTP_STATUS, ERROR_TYPES, COOLDOWN_MS, BACKOFF_CONFIGSKIP_PATTERNS.
credentialLoader.ts Tải thông tin xác thực bên ngoài từ data/provider-credentials.json và hợp nhất chúng theo giá trị mặc định được mã hóa cứng trong PROVIDERS. Giữ bí mật ngoài tầm kiểm soát nguồn trong khi vẫn duy trì khả năng tương thích ngược.
providerModels.ts Cơ quan đăng ký mô hình trung tâm: bí danh của nhà cung cấp bản đồ → ID mô hình. Các chức năng như getModels(), getProviderByAlias().
codexInstructions.ts Hướng dẫn hệ thống được đưa vào các yêu cầu Codex (chỉnh sửa các ràng buộc, quy tắc hộp cát, chính sách phê duyệt).
defaultThinkingSignature.ts Chữ ký "suy nghĩ" mặc định cho mô hình Claude và Gemini.
ollamaModels.ts Định nghĩa lược đồ cho các mô hình Ollama cục bộ (tên, kích thước, họ, lượng tử hóa).

Luồng tải thông tin xác thực

flowchart TD
    A["App starts"] --> B["constants.ts defines PROVIDERS\nwith hardcoded defaults"]
    B --> C{"data/provider-credentials.json\nexists?"}
    C -->|Yes| D["credentialLoader reads JSON"]
    C -->|No| E["Use hardcoded defaults"]
    D --> F{"For each provider in JSON"}
    F --> G{"Provider exists\nin PROVIDERS?"}
    G -->|No| H["Log warning, skip"]
    G -->|Yes| I{"Value is object?"}
    I -->|No| J["Log warning, skip"]
    I -->|Yes| K["Merge clientId, clientSecret,\ntokenUrl, authUrl, refreshUrl"]
    K --> F
    H --> F
    J --> F
    F -->|Done| L["PROVIDERS ready with\nmerged credentials"]
    E --> L

4.2 Người thực thi (open-sse/executors/)

Người thực thi gói gọn logic dành riêng cho nhà cung cấp bằng cách sử dụng Mẫu chiến lược. Mỗi người thi hành ghi đè các phương thức cơ bản nếu cần.

classDiagram
    class BaseExecutor {
        +buildUrl(model, stream, options)
        +buildHeaders(credentials, stream, body)
        +transformRequest(body, model, stream, credentials)
        +execute(url, options)
        +shouldRetry(status, error)
        +refreshCredentials(credentials, log)
    }

    class DefaultExecutor {
        +refreshCredentials()
    }

    class AntigravityExecutor {
        +buildUrl()
        +buildHeaders()
        +transformRequest()
        +shouldRetry()
        +refreshCredentials()
    }

    class CursorExecutor {
        +buildUrl()
        +buildHeaders()
        +transformRequest()
        +parseResponse()
        +generateChecksum()
    }

    class KiroExecutor {
        +buildUrl()
        +buildHeaders()
        +transformRequest()
        +parseEventStream()
        +refreshCredentials()
    }

    BaseExecutor <|-- DefaultExecutor
    BaseExecutor <|-- AntigravityExecutor
    BaseExecutor <|-- CursorExecutor
    BaseExecutor <|-- KiroExecutor
    BaseExecutor <|-- CodexExecutor
    BaseExecutor <|-- GeminiCLIExecutor
    BaseExecutor <|-- GithubExecutor
Người thi hành Nhà cung cấp Chuyên ngành chính
base.ts Cơ sở trừu tượng: Xây dựng URL, tiêu đề, logic thử lại, làm mới thông tin xác thực
default.ts Claude, Song Tử, OpenAI, GLM, Kimi, MiniMax Làm mới mã thông báo OAuth chung cho các nhà cung cấp tiêu chuẩn
antigravity.ts Mã đám mây của Google Tạo ID dự án/phiên, dự phòng nhiều URL, phân tích cú pháp thử lại tùy chỉnh từ thông báo lỗi ("đặt lại sau 2h7m23 giây")
cursor.ts IDE con trỏ Phức tạp nhất: Xác thực tổng kiểm tra SHA-256, mã hóa yêu cầu Protobuf, EventStream nhị phân → phân tích cú pháp phản hồi SSE
codex.ts OpenAI Codex Đưa vào các hướng dẫn hệ thống, quản lý các cấp độ tư duy, loại bỏ các tham số không được hỗ trợ
gemini-cli.ts Google Song Tử CLI Xây dựng URL tùy chỉnh (streamGenerateContent), làm mới mã thông báo Google OAuth
github.ts Phi công phụ GitHub Hệ thống mã thông báo kép (GitHub OAuth + mã thông báo Copilot), bắt chước tiêu đề VSCode
kiro.ts AWS CodeWhisperer Phân tích cú pháp nhị phân AWS EventStream, khung sự kiện AMZN, ước tính mã thông báo
index.ts Nhà máy: tên nhà cung cấp bản đồ → lớp người thực thi, với dự phòng mặc định

Trình xử lý 4.3 (open-sse/handlers/)

Lớp điều phối — điều phối việc dịch, thực thi, phát trực tuyến và xử lý lỗi.

Tập tin Mục đích
chatCore.ts Dàn nhạc trung tâm (~600 dòng). Xử lý vòng đời yêu cầu hoàn chỉnh: phát hiện định dạng → dịch → gửi người thực thi → phản hồi truyền trực tuyến/không truyền phát → làm mới mã thông báo → xử lý lỗi → ghi nhật ký sử dụng.
responsesHandler.ts Bộ điều hợp cho API phản hồi của OpenAI: chuyển đổi định dạng Phản hồi → Hoàn thành cuộc trò chuyện → gửi tới chatCore → chuyển đổi SSE trở lại định dạng Phản hồi.
embeddings.ts Trình xử lý tạo nhúng: giải quyết mô hình nhúng → nhà cung cấp, gửi tới API của nhà cung cấp, trả về phản hồi nhúng tương thích với OpenAI. Hỗ trợ hơn 6 nhà cung cấp.
imageGeneration.ts Trình xử lý tạo hình ảnh: phân giải mô hình hình ảnh → nhà cung cấp, hỗ trợ các chế độ tương thích với OpenAI, hình ảnh Gemini (Chống trọng lực) và dự phòng (Nebius). Trả về hình ảnh base64 hoặc URL.

Vòng đời yêu cầu (chatCore.ts)

sequenceDiagram
    participant Client
    participant chatCore
    participant Translator
    participant Executor
    participant Provider

    Client->>chatCore: Request (any format)
    chatCore->>chatCore: Detect source format
    chatCore->>chatCore: Check bypass patterns
    chatCore->>chatCore: Resolve model & provider
    chatCore->>Translator: Translate request (source → OpenAI → target)
    chatCore->>Executor: Get executor for provider
    Executor->>Executor: Build URL, headers, transform request
    Executor->>Executor: Refresh credentials if needed
    Executor->>Provider: HTTP fetch (streaming or non-streaming)

    alt Streaming
        Provider-->>chatCore: SSE stream
        chatCore->>chatCore: Pipe through SSE transform stream
        Note over chatCore: Transform stream translates<br/>each chunk: target → OpenAI → source
        chatCore-->>Client: Translated SSE stream
    else Non-streaming
        Provider-->>chatCore: JSON response
        chatCore->>Translator: Translate response
        chatCore-->>Client: Translated JSON
    end

    alt Error (401, 429, 500...)
        chatCore->>Executor: Retry with credential refresh
        chatCore->>chatCore: Account fallback logic
    end

Dịch vụ 4.4 (open-sse/services/)

Logic nghiệp vụ hỗ trợ các trình xử lý và thực thi.

Tập tin Mục đích
provider.ts Phát hiện định dạng (detectFormat): phân tích cấu trúc nội dung yêu cầu để xác định các định dạng Claude/OpenAI/Gemini/AntiGravity/Responses (bao gồm max_tokens heuristic cho Claude). Ngoài ra: xây dựng URL, xây dựng tiêu đề, chuẩn hóa cấu hình tư duy. Hỗ trợ các nhà cung cấp động openai-compatible-*anthropic-compatible-*.
model.ts Phân tích cú pháp chuỗi mô hình (claude/model-name{provider: "claude", model: "model-name"}), phân giải bí danh với khả năng phát hiện xung đột, dọn dẹp đầu vào (từ chối ký tự điều khiển/truyền tải đường dẫn) và phân giải thông tin mô hình với hỗ trợ getter bí danh không đồng bộ.
accountFallback.ts Xử lý giới hạn tốc độ: thời gian chờ theo cấp số nhân (1 giây → 2 giây → 4 giây → tối đa 2 phút), quản lý thời gian hồi chiêu của tài khoản, phân loại lỗi (lỗi nào kích hoạt dự phòng so với không).
tokenRefresh.ts Làm mới mã thông báo OAuth cho mọi nhà cung cấp: Google (Gemini, AntiGravity), Claude, Codex, Qwen, iFlow, GitHub (Mã thông báo kép OAuth + Copilot), Kiro (AWS SSO OIDC + Social Auth). Bao gồm bộ nhớ đệm chống trùng lặp lời hứa trong quá trình thực hiện và thử lại với thời gian chờ theo cấp số nhân.
combo.ts Mô hình kết hợp: chuỗi mô hình dự phòng. Nếu mô hình A không thành công với lỗi đủ điều kiện dự phòng, hãy thử mô hình B, sau đó là C, v.v. Trả về mã trạng thái ngược dòng thực tế.
usage.ts Tìm nạp hạn ngạch/dữ liệu sử dụng từ API của nhà cung cấp (hạn ngạch GitHub Copilot, hạn ngạch mô hình AntiGravity, giới hạn tốc độ Codex, phân tích sử dụng Kiro, cài đặt Claude).
accountSelector.ts Lựa chọn tài khoản thông minh với thuật toán tính điểm: xem xét mức độ ưu tiên, trạng thái sức khỏe, vị trí luân chuyển và trạng thái thời gian hồi chiêu để chọn tài khoản tối ưu cho từng yêu cầu.
contextManager.ts Quản lý vòng đời ngữ cảnh yêu cầu: tạo và theo dõi các đối tượng ngữ cảnh theo yêu cầu bằng siêu dữ liệu (ID yêu cầu, dấu thời gian, thông tin nhà cung cấp) để gỡ lỗi và ghi nhật ký.
ipFilter.ts Kiểm soát truy cập dựa trên IP: hỗ trợ chế độ danh sách cho phép và danh sách chặn. Xác thực IP của khách hàng dựa trên các quy tắc đã định cấu hình trước khi xử lý các yêu cầu API.
sessionManager.ts Theo dõi phiên bằng dấu vân tay của khách hàng: theo dõi các phiên hoạt động bằng cách sử dụng mã định danh khách hàng được băm, theo dõi số lượng yêu cầu và cung cấp số liệu phiên.
signatureCache.ts Bộ đệm chống trùng lặp dựa trên chữ ký yêu cầu: ngăn chặn các yêu cầu trùng lặp bằng cách lưu vào bộ đệm các chữ ký yêu cầu gần đây và trả về các phản hồi được lưu trong bộ nhớ đệm cho các yêu cầu giống hệt nhau trong một khoảng thời gian.
systemPrompt.ts Chèn lời nhắc hệ thống toàn cầu: thêm vào trước hoặc thêm lời nhắc hệ thống có thể định cấu hình cho tất cả các yêu cầu, với khả năng xử lý khả năng tương thích của mỗi nhà cung cấp.
thinkingBudget.ts Quản lý ngân sách mã thông báo lý luận: hỗ trợ các chế độ chuyển tiếp, tự động (cấu hình tư duy dải), tùy chỉnh (ngân sách cố định) và chế độ thích ứng (theo tỷ lệ phức tạp) để kiểm soát mã thông báo suy nghĩ/lý luận.
wildcardRouter.ts Định tuyến mẫu mô hình ký tự đại diện: phân giải các mẫu ký tự đại diện (ví dụ: */claude-*) thành các cặp nhà cung cấp/mô hình cụ thể dựa trên tính khả dụng và mức độ ưu tiên.

Chống trùng lặp làm mới mã thông báo

sequenceDiagram
    participant R1 as Request 1
    participant R2 as Request 2
    participant Cache as refreshPromiseCache
    participant OAuth as OAuth Provider

    R1->>Cache: getAccessToken("gemini", token)
    Cache->>Cache: No in-flight promise
    Cache->>OAuth: Start refresh
    R2->>Cache: getAccessToken("gemini", token)
    Cache->>Cache: Found in-flight promise
    Cache-->>R2: Return existing promise
    OAuth-->>Cache: New access token
    Cache-->>R1: New access token
    Cache-->>R2: Same access token (shared)
    Cache->>Cache: Delete cache entry

Máy trạng thái dự phòng tài khoản

stateDiagram-v2
    [*] --> Active
    Active --> Error: Request fails (401/429/500)
    Error --> Cooldown: Apply backoff
    Cooldown --> Active: Cooldown expires
    Active --> Active: Request succeeds (reset backoff)

    state Error {
        [*] --> ClassifyError
        ClassifyError --> ShouldFallback: Rate limit / Auth / Transient
        ClassifyError --> NoFallback: 400 Bad Request
    }

    state Cooldown {
        [*] --> ExponentialBackoff
        ExponentialBackoff: Level 0 = 1s
        ExponentialBackoff: Level 1 = 2s
        ExponentialBackoff: Level 2 = 4s
        ExponentialBackoff: Max = 2min
    }

Chuỗi Model Combo

flowchart LR
    A["Request with\ncombo model"] --> B["Model A"]
    B -->|"2xx Success"| C["Return response"]
    B -->|"429/401/500"| D{"Fallback\neligible?"}
    D -->|Yes| E["Model B"]
    D -->|No| F["Return error"]
    E -->|"2xx Success"| C
    E -->|"429/401/500"| G{"Fallback\neligible?"}
    G -->|Yes| H["Model C"]
    G -->|No| F
    H -->|"2xx Success"| C
    H -->|"Fail"| I["All failed →\nReturn last status"]

Trình dịch 4.5 (open-sse/translator/)

Công cụ dịch định dạng sử dụng hệ thống plugin tự đăng ký.

Kiến trúc

graph TD
    subgraph "Request Translation"
        A["Claude → OpenAI"]
        B["Gemini → OpenAI"]
        C["Antigravity → OpenAI"]
        D["OpenAI Responses → OpenAI"]
        E["OpenAI → Claude"]
        F["OpenAI → Gemini"]
        G["OpenAI → Kiro"]
        H["OpenAI → Cursor"]
    end

    subgraph "Response Translation"
        I["Claude → OpenAI"]
        J["Gemini → OpenAI"]
        K["Kiro → OpenAI"]
        L["Cursor → OpenAI"]
        M["OpenAI → Claude"]
        N["OpenAI → Antigravity"]
        O["OpenAI → Responses"]
    end
Thư mục Tập tin Mô tả
request/ 8 dịch giả Chuyển đổi nội dung yêu cầu giữa các định dạng. Mỗi tệp tự đăng ký thông qua register(from, to, fn) khi nhập.
response/ 7 dịch giả Chuyển đổi các đoạn phản hồi phát trực tuyến giữa các định dạng. Xử lý các loại sự kiện SSE, khối suy nghĩ, lệnh gọi công cụ.
helpers/ 6 người giúp việc Các tiện ích được chia sẻ: claudeHelper (trích xuất lời nhắc hệ thống, cấu hình tư duy), geminiHelper (ánh xạ các bộ phận/nội dung), openaiHelper (lọc định dạng), toolCallHelper (tạo ID, chèn phản hồi bị thiếu), maxTokensHelper, responsesApiHelper.
index.ts Công cụ dịch thuật: translateRequest(), translateResponse(), quản lý nhà nước, đăng ký.
formats.ts Hằng số định dạng: OPENAI, CLAUDE, GEMINI, ANTIGRAVITY, KIRO, CURSOR, OPENAI_RESPONSES.

Thiết kế Key: Plugin tự đăng ký

// Each translator file calls register() on import:
import { register } from "../index.js";
register("claude", "openai", translateClaudeToOpenAI);

// The index.js imports all translator files, triggering registration:
import "./request/claude-to-openai.js"; // ← self-registers

4.6 Tiện ích (open-sse/utils/)

| Tập tin | Mục đích | | ------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | | error.ts | Xây dựng phản hồi lỗi (định dạng tương thích với OpenAI), phân tích lỗi ngược dòng, trích xuất thời gian thử lại AntiGravity từ các thông báo lỗi, phát trực tuyến lỗi SSE. | | stream.ts | SSE Transform Stream — đường truyền phát trực tuyến cốt lõi. Hai chế độ: TRANSLATE (dịch định dạng đầy đủ) và PASSTHROUGH (chuẩn hóa + trích xuất cách sử dụng). Xử lý việc lưu vào bộ đệm, ước tính mức sử dụng, theo dõi độ dài nội dung. Các phiên bản bộ mã hóa/giải mã mỗi luồng tránh trạng thái chia sẻ. | | streamHelpers.ts | Các tiện ích SSE cấp thấp: parseSSELine (không chịu khoảng trắng), hasValuableContent (lọc các đoạn trống cho OpenAI/Claude/Gemini), fixInvalidId, formatSSE (tuần tự hóa SSE nhận biết định dạng với tính năng dọn dẹp perf_metrics). | | usageTracking.ts | Trích xuất mức sử dụng mã thông báo từ bất kỳ định dạng nào (Claude/OpenAI/Gemini/Responses), ước tính với tỷ lệ ký tự trên mỗi mã thông báo của công cụ/thông báo riêng biệt, bổ sung bộ đệm (giới hạn an toàn 2000 mã thông báo), lọc trường theo định dạng cụ thể, ghi nhật ký bảng điều khiển với màu ANSI. | | requestLogger.ts | Ghi nhật ký yêu cầu dựa trên tệp (chọn tham gia qua ENABLE_REQUEST_LOGS=true). Tạo thư mục phiên với các tệp được đánh số: 1_req_client.json7_res_client.txt. Tất cả I/O đều không đồng bộ (bắn và quên). Mặt nạ tiêu đề nhạy cảm. | | bypassHandler.ts | Chặn các mẫu cụ thể từ Claude CLI (trích xuất tiêu đề, khởi động, đếm) và trả về các phản hồi giả mạo mà không cần gọi cho bất kỳ nhà cung cấp nào. Hỗ trợ cả phát trực tuyến và không phát trực tuyến. Cố ý giới hạn trong phạm vi Claude CLI. | | networkProxy.ts | Phân giải URL proxy gửi đi cho một nhà cung cấp nhất định với mức độ ưu tiên: cấu hình dành riêng cho nhà cung cấp → cấu hình chung → biến môi trường (HTTPS_PROXY/HTTP_PROXY/ALL_PROXY). Hỗ trợ loại trừ NO_PROXY. Cấu hình bộ nhớ đệm trong 30 giây. |

Đường ống truyền phát SSE

flowchart TD
    A["Provider SSE stream"] --> B["TextDecoder\n(per-stream instance)"]
    B --> C["Buffer lines\n(split on newline)"]
    C --> D["parseSSELine()\n(trim whitespace, parse JSON)"]
    D --> E{"Mode?"}
    E -->|TRANSLATE| F["translateResponse()\ntarget → OpenAI → source"]
    E -->|PASSTHROUGH| G["fixInvalidId()\nnormalize chunk"]
    F --> H["hasValuableContent()\nfilter empty chunks"]
    G --> H
    H -->|"Has content"| I["extractUsage()\ntrack token counts"]
    H -->|"Empty"| J["Skip chunk"]
    I --> K["formatSSE()\nserialize + clean perf_metrics"]
    K --> L["TextEncoder\n(per-stream instance)"]
    L --> M["Enqueue to\nclient stream"]

    style A fill:#f9f,stroke:#333
    style M fill:#9f9,stroke:#333

Cấu trúc phiên ghi nhật ký yêu cầu

logs/
└── claude_gemini_claude-sonnet_20260208_143045/
    ├── 1_req_client.json      ← Raw client request
    ├── 2_req_source.json      ← After initial conversion
    ├── 3_req_openai.json      ← OpenAI intermediate format
    ├── 4_req_target.json      ← Final target format
    ├── 5_res_provider.txt     ← Provider SSE chunks (streaming)
    ├── 5_res_provider.json    ← Provider response (non-streaming)
    ├── 6_res_openai.txt       ← OpenAI intermediate chunks
    ├── 7_res_client.txt       ← Client-facing SSE chunks
    └── 6_error.json           ← Error details (if any)

4.7 Lớp ứng dụng (src/)

Thư mục Mục đích
src/app/ Giao diện người dùng web, tuyến API, phần mềm trung gian Express, trình xử lý gọi lại OAuth
src/lib/ Truy cập cơ sở dữ liệu (localDb.ts, usageDb.ts), xác thực, chia sẻ
src/mitm/ Tiện ích proxy trung gian để chặn lưu lượng truy cập của nhà cung cấp
src/models/ Định nghĩa mô hình cơ sở dữ liệu
src/shared/ Trình bao bọc xung quanh các hàm open-sse (nhà cung cấp, luồng, lỗi, v.v.)
src/sse/ Trình xử lý điểm cuối SSE kết nối thư viện open-sse với các tuyến Express
src/store/ Quản lý trạng thái ứng dụng

Các tuyến API đáng chú ý

Tuyến đường Phương pháp Mục đích
/api/provider-models NHẬN/ĐĂNG/XÓA CRUD cho các mô hình tùy chỉnh cho mỗi nhà cung cấp
/api/models/catalog NHẬN Danh mục tổng hợp của tất cả các mô hình (trò chuyện, nhúng, hình ảnh, tùy chỉnh) được nhóm theo nhà cung cấp
/api/settings/proxy NHẬN/ĐẶT/XÓA Cấu hình proxy gửi đi theo cấp bậc (global/providers/combos/keys)
/api/settings/proxy/test ĐĂNG Xác thực kết nối proxy và trả về IP công cộng/độ trễ
/v1/providers/[provider]/chat/completions ĐĂNG Hoàn thành trò chuyện dành riêng cho mỗi nhà cung cấp với xác thực mô hình
/v1/providers/[provider]/embeddings ĐĂNG Phần nhúng dành riêng cho mỗi nhà cung cấp với xác thực mô hình
/v1/providers/[provider]/images/generations ĐĂNG Tạo hình ảnh chuyên dụng cho mỗi nhà cung cấp với xác thực mô hình
/api/settings/ip-filter NHẬN/ĐẶT Quản lý danh sách chặn/danh sách IP cho phép
/api/settings/thinking-budget NHẬN/ĐẶT Cấu hình ngân sách mã thông báo hợp lý (chuyển qua/tự động/tùy chỉnh/thích ứng)
/api/settings/system-prompt NHẬN/ĐẶT Hệ thống nhắc nhở toàn cầu cho tất cả các yêu cầu
/api/sessions NHẬN Theo dõi và đo lường phiên hoạt động
/api/rate-limits NHẬN Trạng thái giới hạn tỷ lệ cho mỗi tài khoản

5. Các mẫu thiết kế chính

5.1 Dịch Hub-and-Spoke

Tất cả các định dạng đều dịch qua định dạng OpenAI làm trung tâm. Việc thêm nhà cung cấp mới chỉ yêu cầu viết một cặp người dịch (đến/từ OpenAI), chứ không phải N cặp.

5.2 Mẫu chiến lược thực thi

Mỗi nhà cung cấp có một lớp người thực thi chuyên dụng kế thừa từ BaseExecutor. Nhà máy ở executors/index.ts chọn đúng nhà máy khi chạy.

5.3 Hệ thống Plugin tự đăng ký

Mô-đun dịch tự đăng ký khi nhập qua register(). Việc thêm người dịch mới chỉ là tạo một tệp và nhập tệp đó.

5.4 Dự phòng tài khoản với thời gian chờ theo cấp số nhân

Khi nhà cung cấp trả về 429/401/500, hệ thống có thể chuyển sang tài khoản tiếp theo, áp dụng thời gian hồi chiêu theo cấp số nhân (1 giây → 2 giây → 4 giây → tối đa 2 phút).

5.5 Chuỗi mô hình kết hợp

Một "combo" nhóm nhiều chuỗi provider/model. Nếu lần đầu tiên không thành công, hãy tự động chuyển sang lần tiếp theo.

5.6 Bản dịch phát trực tuyến có trạng thái

Bản dịch phản hồi duy trì trạng thái trên các khối SSE (theo dõi khối suy nghĩ, tích lũy lệnh gọi công cụ, lập chỉ mục khối nội dung) thông qua cơ chế initState().

5.7 Bộ đệm an toàn sử dụng

Bộ đệm 2000 mã thông báo được thêm vào mức sử dụng được báo cáo để ngăn khách hàng đạt đến giới hạn cửa sổ ngữ cảnh do quá tải từ lời nhắc hệ thống và dịch định dạng.


6. Các định dạng được hỗ trợ

Định dạng Hướng Mã định danh
Hoàn thành trò chuyện OpenAI nguồn + đích openai
API phản hồi OpenAI nguồn + đích openai-responses
Claude nhân loại nguồn + đích claude
Google Song Tử nguồn + đích gemini
Google Song Tử CLI chỉ mục tiêu gemini-cli
Phản lực hấp dẫn nguồn + đích antigravity
AWS Kiro chỉ mục tiêu kiro
Con trỏ chỉ mục tiêu cursor

7. Nhà cung cấp được hỗ trợ

Nhà cung cấp Phương thức xác thực Người thi hành Ghi chú chính
Claude nhân loại Khóa API hoặc OAuth Mặc định Sử dụng tiêu đề x-api-key
Google Song Tử Khóa API hoặc OAuth Mặc định Sử dụng tiêu đề x-goog-api-key
Google Song Tử CLI OAuth Song TửCLI Sử dụng điểm cuối streamGenerateContent
Phản lực hấp dẫn OAuth Phản lực hấp dẫn Dự phòng nhiều URL, phân tích cú pháp thử lại tùy chỉnh
OpenAI Khóa API Mặc định Xác thực Bearer tiêu chuẩn
Codex OAuth Codex Đưa ra hướng dẫn hệ thống, quản lý tư duy
Phi công phụ GitHub Mã thông báo OAuth + Copilot Github Mã thông báo kép, bắt chước tiêu đề VSCode
Kiro (AWS) AWS SSO OIDC hoặc Xã hội Kiro Phân tích cú pháp luồng sự kiện nhị phân
IDE con trỏ Xác thực tổng kiểm tra Con trỏ Mã hóa Protobuf, tổng kiểm tra SHA-256
Qwen OAuth Mặc định Xác thực chuẩn
iFlow OAuth (Cơ bản + Mang) Mặc định Tiêu đề xác thực kép
OpenRouter Khóa API Mặc định Xác thực Bearer tiêu chuẩn
GLM, Kimi, MiniMax Khóa API Mặc định Tương thích với Claude, sử dụng x-api-key
openai-compatible-* Khóa API Mặc định Động: mọi điểm cuối tương thích với OpenAI
anthropic-compatible-* Khóa API Mặc định Động: mọi điểm cuối tương thích với Claude

8. Tóm tắt luồng dữ liệu

Yêu cầu phát trực tuyến

flowchart LR
    A["Client"] --> B["detectFormat()"]
    B --> C["translateRequest()\nsource → OpenAI → target"]
    C --> D["Executor\nbuildUrl + buildHeaders"]
    D --> E["fetch(providerURL)"]
    E --> F["createSSEStream()\nTRANSLATE mode"]
    F --> G["parseSSELine()"]
    G --> H["translateResponse()\ntarget → OpenAI → source"]
    H --> I["extractUsage()\n+ addBuffer"]
    I --> J["formatSSE()"]
    J --> K["Client receives\ntranslated SSE"]
    K --> L["logUsage()\nsaveRequestUsage()"]

Yêu cầu không phát trực tuyến

flowchart LR
    A["Client"] --> B["detectFormat()"]
    B --> C["translateRequest()\nsource → OpenAI → target"]
    C --> D["Executor.execute()"]
    D --> E["translateResponse()\ntarget → OpenAI → source"]
    E --> F["Return JSON\nresponse"]

Luồng bỏ qua (Claude CLI)

flowchart LR
    A["Claude CLI request"] --> B{"Match bypass\npattern?"}
    B -->|"Title/Warmup/Count"| C["Generate fake\nOpenAI response"]
    B -->|"No match"| D["Normal flow"]
    C --> E["Translate to\nsource format"]
    E --> F["Return without\ncalling provider"]