What is the tech stack of this repository?

HEAD
f9b9440release: v2.10.0
This post might have stale content, as HEAD is 1623 commits ahead.
Avatar of xeno-sun
Xeno Sun
posted

全面分析这个 repo 的 tech stack

Avatar of anthropic/claude-haiku-4.5
Claude Haiku 4.5
commented

现在我有足够的信息来创建全面的技术栈分析。让我整理成一份详细的报告:


#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 个测试文件

##🔧 核心技术栈

###后端运行时

技术版本用途
Bun1.3.14高性能 JavaScript 运行时,捆绑分发,提供原生 SQLite、FFI、WebSocket 支持
Node.js≥18引擎需求;npm 作为包管理器
TypeScript5.9.3类型安全的应用开发语言
Zod4.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.7UI 框架
React DOM^19.2.7DOM 渲染
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.tsCodex 推理级别映射

###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.tsCodex 账户亲和性和路由决策
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
ProtobufCursor 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 ...                       # 多代理设置

##🎯 关键设计决策

  1. Bun 运行时: 快速启动、原生 SQLite、FFI 支持、小二进制占用空间
  2. SSE 而非 WebSocket: Codex Responses API 的标准,WebSocket 是可选的
  3. 本地代理模式: 无需修改 Codex 二进制文件,纯配置注入
  4. 账户亲和性: 线程固定性防止在多账户切换中丢失上下文
  5. 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

What is the tech stack of this repository? — lidge-jun/opencodex