What is the tech stack of this repository?
This post might have stale content, as HEAD is 1623 commits ahead.
全面分析这个 repo 的 tech stack
现在我有足够的信息来创建全面的技术栈分析。让我整理成一份详细的报告:
#OpenCodex 完全技术栈分析报告
##📋 项目概述
OpenCodex 是一个本地 LLM 路由代理,可让任何大型语言模型与 OpenAI Codex、Claude Code、Claude Desktop 和 Grok Build 配合使用。它充当通用提供商代理,支持 40+ 个 LLM 提供商,通过协议转换和数据平面桥接统一不同 API 的接口。
- 版本: 2.10.0
- 类型: 模块化 TypeScript 应用
- 架构: 分层微服务风格 + CLI + Web GUI
- 代码量: ~379 个 TypeScript 源文件,总计 ~18.8M(src 5.9M + gui 2.9M + tests 6.0M)
- 测试: 931 个测试文件
##🔧 核心技术栈
###后端运行时
| 技术 | 版本 | 用途 |
|---|---|---|
| Bun | 1.3.14 | 高性能 JavaScript 运行时,捆绑分发,提供原生 SQLite、FFI、WebSocket 支持 |
| Node.js | ≥18 | 引擎需求;npm 作为包管理器 |
| TypeScript | 5.9.3 | 类型安全的应用开发语言 |
| Zod | 4.4.3 | 运行时数据验证和 schema 定义 |
###核心依赖
{
"@bufbuild/protobuf": "^2.12.0", // Protocol Buffer 序列化
"@modelcontextprotocol/sdk": "^1", // MCP (Model Context Protocol) 支持
"bun": "1.3.14", // 捆绑运行时
"zod": "4.4.3" // 数据验证
}
###前端技术栈
| 技术 | 版本 | 用途 |
|---|---|---|
| React | ^19.2.7 | UI 框架 |
| React DOM | ^19.2.7 | DOM 渲染 |
| Vite | ^8.1.0 | 构建工具和开发服务器 |
| TypeScript | ~6.0.2 | 类型安全 |
| ESLint | ^10.3.0 | 代码质量检查 |
| @tanstack/react-virtual | ^3.14.5 | 虚拟列表性能优化 |
###文档站点 (Astro)
| 技术 | 版本 | 用途 |
|---|---|---|
| Astro | ^7.0.3 | 静态站点生成 |
| @astrojs/starlight | ^0.41.1 | 文档主题 |
| ECharts | ^6.1.0 | 数据可视化 |
| Sharp | ^0.35.2 | 图像处理 |
##📁 架构分层
###1. 数据平面层 (src/adapters/, src/responses/, src/bridge.ts)
适配器生态系统 (34 个适配器文件):
- OpenAI:
openai-responses.ts(原生 Responses),openai-chat.ts(Chat Completions) - Anthropic:
anthropic.ts,含图像和思维链支持 - Google:
google.ts,google-http.ts,google-wire-compiler.ts,支持 Vertex AI - Cursor:
cursor.ts,含 MCP (Model Context Protocol) 支持 - Kiro:
kiro.ts,含 Kiro 特定工具处理、流媒体和重试 - 其他: Azure, Ollama, 兼容 OpenAI 的端点
核心数据处理:
// src/adapters/base.ts - 标准适配器接口
interface ProviderAdapter {
invoke(req: AdapterRequest): AsyncGenerator<AdapterEvent>
}
// src/types.ts - 统一数据模型
interface OcxParsedRequest {
modelId: string
context: OcxContext
messages: OcxMessage[]
tools?: OcxTool[]
// ... 提供商特定的继续状态
}
type OcxMessage =
| OcxUserMessage
| OcxAssistantMessage
| OcxDeveloperMessage
| OcxToolResultMessage
###2. 路由和编排层
| 文件 | 责任 |
|---|---|
src/router.ts | 提供商/模型选择,Combo 路由 (故障转移/轮询) |
src/combos/ | 虚拟模型组合逻辑 |
src/responses/ | Responses API 规范处理、压缩、工具组管理 |
src/reasoning-effort.ts | Codex 推理级别映射 |
###3. 提供商管理层
| 模块 | 功能 |
|---|---|
src/providers/registry.ts | 规范提供商预设 (40+ 内置) |
src/providers/derive.ts | 从预设到用户配置的充实 |
src/oauth/ | OAuth 流、令牌存储、刷新、多授权支持 |
src/providers/quota.ts | 账户池配额管理 |
src/providers/model-discovery.ts | 动态模型列表获取 |
支持的 OAuth 提供商:
- Anthropic (Claude)
- xAI (Grok)
- Kimi
- GitHub Copilot
- Google (Antigravity)
###4. Codex 集成层
| 模块 | 功能 |
|---|---|
src/codex/ | Codex 配置注入、目录管理、账户池 |
src/codex/shim.ts | 自动启动垫片 (透明启动代理) |
src/codex/routing.ts | Codex 账户亲和性和路由决策 |
src/codex/catalog/ | 共享原生+路由模型目录,effort 上限 |
本地状态:
~/.opencodex/
├── config.json # 主配置
├── auth.json # OAuth 令牌
├── codex-accounts.json # 账户池凭证
├── usage.jsonl # 仅元数据的请求日志
├── responses-state.json # 有界缓存
├── codex-runtime.json # 运行时选择
└── service-state.json # 服务工件
###5. 服务器和 API 层 (src/server/)
监听器和路由:
POST /v1/responses- Responses 数据平面 (HTTP + WebSocket)POST /v1/messages- Anthropic 兼容接口POST /v1/chat/completions- OpenAI 兼容接口POST /v1/images/generations- 图像生成中继/api/*- 管理 API (需要授权)/healthz- 健康检查和身份
管理 API 路由 (src/server/management/):
/api/config/* # 配置管理
/api/providers/* # 提供商 CRUD
/api/oauth/accounts/* # OAuth 账户管理
/api/models/* # 模型可见性
/api/usage/* # 使用日志和成本
/api/system/* # 系统指标和重启
/api/combos/* # Combo 管理
/api/storage/* # 存储策略
/api/logs/* # 请求日志
/api/agents/* # 子代理设置
###6. CLI 和生命周期 (src/cli/)
命令分组:
init # 交互式设置 (写配置, 接线 Codex, 提供垫片)
start/stop # 前台/后台
service # systemd/launchd/Task Scheduler 集成
codex-shim # 透明代理启动器
status/doctor # 诊断
provider # CRUD 提供商
account # 管理 ChatGPT 账户池
combo # 管理故障转移/轮询组合
v2 # 多代理表面控制
update # 自更新
###7. GUI (gui/src/)
组件架构:
pages/ # 工作空间级页面
├── Dashboard.tsx # 概览和实时日志
├── Providers.tsx # 提供商配置
├── Models.tsx # 模型列表和可见性
├── Claude.tsx / ClaudeCode.tsx # 特定于客户端的设置
├── Storage.tsx # 清理策略
├── Usage.tsx # 使用日志和成本
└── Subagents.tsx # 多代理配置
components/
├── provider-workspace/ # 提供商编辑 UI
├── codex-account-pool-*.tsx # 账户池管理
├── combo-workspace-*.tsx # Combo 配置
├── apikeys-workspace/ # API 密钥管理
└── ...其他控件
hooks/
├── useCodexAccountPool.ts
├── useProviderAccountPools.ts
└── useJsonConfigEditor.ts
i18n/ # 国际化 (8+ 语言)
├── en.ts, zh.ts, ko.ts, ja.ts, ru.ts, de.ts...
└── provider.tsx # 提供商特定翻译
##🔌 协议和集成
###数据平面协议
| 协议 | 用途 | 实现 |
|---|---|---|
| Responses SSE | 实时流式输出 | src/responses/parser.ts, src/bridge.ts |
| WebSocket | 可选实时表面 | src/codex/websocket-registry.ts |
| Protobuf | Cursor MCP 消息 | @bufbuild/protobuf |
| HTTP 中继 | 兼容端点 | src/server/responses.ts |
###OAuth 流
User → CLI/GUI → Callback Server (127.0.0.1:random)
↓
Provider OAuth Endpoint
↓
Token Storage (~/.opencodex/auth.json)
↓
Multiauth: { provider → { activeAccountId, accounts[] } }
###提供商适配器模式
每个提供商都实现了标准接口:
interface ProviderAdapter {
// 核心方法
invoke(req: AdapterRequest): AsyncGenerator<AdapterEvent>
// 特定的生命周期钩子
interrupt?(): void
cleanup?(): void
}
// 事件流出
type AdapterEvent =
| { type: "usage", usage: OcxUsage }
| { type: "text", text: string }
| { type: "toolCall", toolCall: OcxToolCall }
| { type: "thinking", thinking: OcxThinkingContent }
| { type: "error", error: ErrorData }
| { type: "done" }
##📊 关键特性实现
###1. 账户池管理 (src/oauth/, src/codex/)
- 多授权: 每个提供商可存储多个账户
- 线程亲和性: 新会话自动路由到最低使用量健康账户
- 现有会话固定: 已启动的线程保持原始账户
- 配额感知: 冷却和故障闭合处理
###2. Combo (虚拟模型)
// src/combos/ 实现
type ComboStrategy = "failover" | "round_robin" | "weighted"
// 用户配置
{
"combos": [{
"id": "my-combo",
"strategy": "weighted",
"providers": [
{ "provider": "openai", "model": "gpt-5-sol", "weight": 70 },
{ "provider": "anthropic", "model": "claude-opus", "weight": 30 }
]
}]
}
// 运行时路由: comboId → (strategy, weight distribution) → 选定提供商
###3. Web 搜索和视觉侧车
非 OpenAI 模型通过侧车获得真正的能力:
// src/web-search/, src/vision/
sidecarSettings: {
webSearch: true // 使用 ChatGPT 登录执行搜索
vision: true // 使用 ChatGPT 登录进行图像理解
}
###4. 响应流优化
// src/responses/compaction.ts - 上下文检查点
encodeCompactionSummary(summary)
decodeCompactionSummary(encoded)
// src/responses/state.ts - 有界缓存
previousResponseReplayPrefixLength()
###5. 推理工作量支持
// src/reasoning-effort.ts
CODEX_REASONING_LEVELS = [
{ effort: "low", description: "..." },
{ effort: "medium", description: "..." },
{ effort: "high", description: "..." },
{ effort: "xhigh", description: "..." }
]
// 每个模型的支持工作量映射
modelRecordValue(config, model, "reasoning_efforts")
###6. 用途跟踪
// src/usage/log.ts - 仅追加日志
{
timestamp: number
provider: string
model: string
tokens: { input: number, output: number, cache_read?: number }
cost?: number
status: "ok" | "error"
}
##🧪 测试基础设施
测试运行器: Bun 内置测试框架
测试文件: 931 个 .test.ts 文件
测试范围:
- 适配器行为 (upstream wire 格式、错误处理)
- OAuth 流和令牌刷新
- 路由决策和 Combo 故障转移
- 配置变更和状态同步
- CLI 命令和交互
- GUI 组件(React + happy-dom)
- 存储清理策略
- 更新机制
- 多进程场景 (Windows 计划程序、launchd、systemd)
测试隔离:
// bunfig.toml
[test]
root = "tests" # 限制发现
preload = ["./tests/preload.ts"] # 沙盒 HOME/OPENCODEX_HOME
##🔐 安全和硬化
###凭证管理
- ✅ 仅追加使用日志 (无提示存储,仅元数据)
- ✅ 令牌存储在
~/.opencodex/auth.json(0o600 权限) - ✅ Windows 上的 ACL 硬化 (
src/lib/windows-secret-acl.ts) - ✅ 刷新令牌的通用锁 (多进程安全)
###**隐私
- ✅ 可选隐私扫描脚本 (
npm run privacy:scan) - ✅ 配置和 OAuth 所有权跟踪 (
src/lib/config-ownership.ts) - ✅ 卸载清单绑定清理范围
###网络隔离
- ✅ 默认绑定 127.0.0.1(无远程访问)
- ✅ 远程访问需要
OPENCODEX_API_AUTH_TOKEN - ✅
x-opencodex-api-key请求头验证
##📦 构建和部署
###打包流程
# 源代码开发
bun install
bun run typecheck
bun run test
# GUI 构建
cd gui && bun run build
# 准备发布
bun run prepare:package
├── bin/package-main.mjs (Node 垫片)
├── dist/bin/ocx.mjs (可执行)
└── gui/dist/ (捆绑 React)
# 发布
npm publish
###分发
- npm 包:
@bitkyc08/opencodex - 捆绑的 Bun:
node_modules/@bitkyc08/opencodex/node_modules/bun/ - GUI 静态资源:
gui/dist/包含在包中
###平台支持
| OS | 服务管理 | 垫片 |
|---|---|---|
| macOS (arm64/x64) | launchd | 支持 |
| Linux (x64/arm64) | systemd (用户单元) | 支持 |
| Windows (x64) | Task Scheduler / WinSW | 本地或自动 |
##🔄 工作流和命令流
###初始设置
npm install -g @bitkyc08/opencodex
ocx init # 交互式: 提供商, 模型, OAuth
ocx start # 前台代理
ocx service install # 后台服务
ocx codex-shim install # 透明启动垫片
###运行时管理
ocx status # 检查是否运行
ocx doctor # 诊断和修复
ocx gui # 打开仪表板 (http://localhost:10100)
ocx stop # 停止 + 恢复原生 Codex
ocx update # 自更新
###配置
ocx provider add anthropic --api-key $CLAUDE_API_KEY
ocx account add # ChatGPT 池
ocx combo set my-combo failover... # 虚拟模型
ocx v2 set ... # 多代理设置
##🎯 关键设计决策
- Bun 运行时: 快速启动、原生 SQLite、FFI 支持、小二进制占用空间
- SSE 而非 WebSocket: Codex Responses API 的标准,WebSocket 是可选的
- 本地代理模式: 无需修改 Codex 二进制文件,纯配置注入
- 账户亲和性: 线程固定性防止在多账户切换中丢失上下文
- Combo 策略: 虚拟模型支持故障转移和负载均衡,无需外部编排器
##📚 文档和代码质量
- 公开文档:
docs-site/(Astro + Starlight) → https://opencodex.me - 维护者文档:
structure/(决策日志和架构) - 代码组织: 功能分组,清晰的所有权边界
- 测试覆盖: 931 个测试覆盖适配器、OAuth、路由、CLI
- 国际化: 8+ 语言 (en, zh, ko, ja, ru, de...)
- 类型安全: 严格的 TypeScript,Zod 运行时验证
##📈 代码指标
| 指标 | 值 |
|---|---|
| TypeScript 源文件 | 379 |
| 适配器/提供商 | 40+ |
| CLI 命令 | 20+ |
| API 端点 | 30+ |
| 导出的类型/接口 | 3,382+ |
| 测试文件 | 931 |
| 源代码大小 | 5.9 MB |
| GUI 代码大小 | 2.9 MB |
| 总体代码 | 18.8 MB |
##🏗️ 总体架构图
┌─────────────────────────────────────────────────────┐
│ CLI / GUI / SDK │
│ (ocx commands, Dashboard, npm package) │
└────────┬─────────────────────────────┬──────────────┘
│ │
┌────▼────┐ ┌────▼─────┐
│ CLI │ │ Web GUI │
│Handler │ │(React) │
└────┬────┘ └────┬─────┘
│ │
┌────▼─────────────────────────────▼─────┐
│ Config/OAuth/State Management │
│ (~/.opencodex/, Codex Home injection) │
└────┬────────────────────────────────────┘
│
┌────▼─────────────────────────────────────────┐
│ Server (Bun HTTP + WebSocket) │
│ /v1/responses, /v1/messages, /v1/chat/* │
│ /api/*, /healthz │
└────┬────────────┬────────────────────────────┘
│ │
┌────▼───────┐ ┌─▼──────────────────┐
│ Router │ │ Management API │
│(provider/ │ │ (/api/*) │
│model pick) │ └────────────────────┘
└────┬───────┘
│
┌────▼──────────────────────────────────┐
│ Adapter Bridge │
│ (request normalization, response │
│ transformation, streaming) │
└────┬──────────────────────────────────┘
│
┌────▼──────────────────────────────────────────────────┐
│ Provider Adapters (40+) │
│ │
│ OpenAI Anthropic Google Azure Cursor Kiro ... │
│ Ollama OpenRouter DeepSeek Qwen Groq xAI ... │
└────┬──────────────────────────────────────────────────┘
│
┌────▼──────────────────────────────────┐
│ Upstream LLM Providers │
│ (Responses HTTP endpoints) │
└────────────────────────────────────────┘
##🎓 总结
OpenCodex 是一个精心设计的本地代理,具有:
✅ 模块化架构: 清晰的分层,易于扩展新提供商
✅ 强大的 OAuth 支持: 多授权、令牌刷新、账户池管理
✅ 灵活的路由: Combo、故障转移、配配额感知决策
✅ 企业级功能: 使用跟踪、存储清理、Windows 服务集成
✅ 优秀的 UX: 直观的 CLI、富功能的 GUI 仪表板
✅ 高质量代码: 严格的 TypeScript、广泛的测试、国际化
这是一个现代、生产就绪的应用,展示了如何在 JavaScript/TypeScript 中构建复杂的系统代理。
END OF POST