AI-Relay-Kit/docs/architecture.md
2026-06-21 14:30:57 +08:00

79 lines
5.1 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 统一 AI 代理与配置注入器 (Unified AI Relay & Config Injector) 架构规划
该项目旨在完全解耦“API 聚合路由”与“客户端配置”,通过统一的 Node.js 轻量级代理服务同时解决特定客户端Codex、Claude Code的私有协议壁垒并通过自动化脚本一键注入跨工具配置。
> [!NOTE]
> 该工具定位于“无状态(或纯内存轻量状态)、无 DB、可插拔”的中间件核心网关能力完全委托给后端的 LiteLLM。
> 本项目核心框架选用 **Hono**,使用 **TypeScript** 开发。
## 核心架构设计
### 1. 目录结构与职责 (工程模式)
采用插件化Adapter架构模式使核心框架与具体的终端协议隔离便于未来添加新的端点。项目代号确定为 **AI-Relay-Kit**
```text
AI-Relay-Kit/
├── package.json
├── docs/ # 项目文档
│ └── architecture.md # 统一 AI 代理与配置注入器架构规划记录
├── src/
│ ├── index.ts # 服务入口 (Hono app)
│ ├── config.ts # 统一配置加载 (LiteLLM 地址、端口等)
│ ├── core/ # 核心中继控制器
│ │ ├── request_handler.ts # 代理发送请求至 LiteLLM 核心模块
│ │ └── cache_manager.ts # 轻量内存状态管理 (为 Codex 等提供会话持久)
│ ├── adapters/ # 特化客户端插件层 (Plugins)
│ │ ├── codex/ # 替代 codex-relay
│ │ │ ├── parser.ts # Responses API -> Chat Completions 转换
│ │ │ └── routes.ts # 暴露 /codex/v1/responses 路由
│ │ ├── claude/ # 替代 moon-bridge
│ │ │ ├── parser.ts # Anthropic API -> Chat Completions 转换
│ │ │ └── routes.ts # 暴露 /claude/v1/messages 路由
│ │ └── standard/ # 标准 OpenAI 直通 (预留给无特化需求的端)
│ └── injector/ # Auto Config Injector 模块
│ ├── fetch_models.ts # 从 LiteLLM 拉取 /v1/models
│ ├── codex_injector.ts # 读写 ~/.codex/config.toml 和 catalog.json
│ ├── claude_injector.ts # 设置 Claude Code Base URL / env vars
│ └── anti_injector.ts # 配置 Antigravity 环境变量
└── scripts/
└── setup-ai-workspace.sh # 统一入口脚本,启动服务 + 触发配置注入
```
### 2. 核心模块规划
#### 2.1 特殊客户端适配器 (Adapters)
* **Codex 适配器 (`adapters/codex`)**:
* **拦截**:接收来自 Codex APP 的 POST 请求,符合专有的 `responses` 对象格式。
* **翻译**:由于 Responses API 是 Stateful有状态的我们需要借助 `cache_manager` 在内存中维护历史 Session类似 codex-relay Rust 版的逻辑)。将传入的对话状态还原为标准 `messages` 数组。
* **转发**:请求下游 LiteLLM。
* **响应映射**:将 LiteLLM 返回的 Chat Completions 标准 SSE 流实时映射回 Codex 期望的响应切片。
* **Claude Code 适配器 (`adapters/claude`)**:
* **拦截**:拦截来自 Claude Code 的 `x-api-key``anthropic-version` 等头信息。
* **翻译**:将 Anthropic 的 `system`、`messages` (role: user/assistant) 转换为通用的 Chat Completions注意处理复杂的 Function Calling / Tool Use 差异。
* **转发 & 响应映射**:接收 LiteLLM 响应并翻译回 Claude Code 期望的流事件(`message_start`, `content_block_delta` 等)。*(注:如果后续 LiteLLM 的 Anthropic proxy 完善,该模块可随时配置为透传模式)*。
#### 2.2 自动配置注入器 (Auto Config Injector)
作为一个独立的 CLI 命令或启动脚本(例如 `npm run inject`),其执行流如下:
1. **探测后端**:轮询/探测 LiteLLM`http://localhost:4000`)是否就绪。
2. **拉取模型**:调用 LiteLLM 的 `/v1/models`
3. **分发配置**
* **Codex**:生成 `custom_model_catalog.json`,遍历 LiteLLM 返回的模型列表注入 `model_properties`,并修改 `~/.codex/config.toml``model_provider` 设为 `unified-relay`,基地址指向 `http://127.0.0.1:<RelayPort>/codex/v1`
* **Claude Code**:将其默认 API 端点覆写为 `http://127.0.0.1:<RelayPort>/claude/v1`,避免其强制访问远端 API。
* **Antigravity**:可选择生成 `.env.local` 供直接读取,指向 LiteLLM `http://127.0.0.1:<LiteLLMPort>/v1`
## Verification Plan
### 自动化与脚本测试
* 运行 `npm run inject` 后,验证 `~/.codex/config.toml` 及相关的模型目录 JSON 文件是否按照预期生成,并包含了来自 LiteLLM 的最新动态模型。
### 手动验证流
1. 启动 LiteLLM配置好 DeepSeek、OpenAI 等上游)。
2. 启动 Unified Relay (当前项目)。
3. 运行 Injector 注入配置。
4. 在 Codex APP 中,检查是否能选择出并使用刚才配置的聚合模型。
5. 在 Claude Code 中,运行测试 Prompt 检查是否成功完成通信。