跳转到内容

Codex 的多模型适配方案

Codex 的多模型适配方案

学习目标

  • 理解 Codex 的 ModelProvider trait 抽象和具体实现
  • 掌握 Codex 的多种认证策略和自动刷新机制
  • 分析 Codex 的传输层重试和故障转移策略

前置知识

本章涉及多模型适配的通用原理,建议先阅读:

下文假设你已理解上述概念,直接聚焦 Codex 的具体实现。


项目实践

ModelProvider 抽象层

model-provider/src/provider.rs 定义核心 trait:

pub trait ModelProvider: fmt::Debug + Send + Sync {
fn info(&self) -> &ModelProviderInfo;
fn capabilities(&self) -> ProviderCapabilities;
fn auth_manager(&self) -> Option<Arc<AuthManager>>;
async fn auth(&self) -> Option<CodexAuth>;
async fn api_provider(&self) -> Result<Provider>;
async fn runtime_base_url(&self) -> Result<Option<String>>;
async fn api_auth(&self) -> Result<SharedAuthProvider>;
}

工厂路由create_model_provider()):

  • AmazonBedrockModelProvider:AWS SigV4 签名
  • ConfiguredModelProvider:通用 OpenAI 兼容端点(含 ollama/lmstudio)

认证系统

login/src/auth/manager.rsCodexAuth 枚举:

pub enum CodexAuth {
ApiKey(ApiKeyAuth),
Chatgpt(ChatgptAuth), // OAuth + refresh_token
ChatgptAuthTokens(ChatgptAuthTokens), // 外部传入的 bearer token
AgentIdentity(AgentIdentityAuth), // JWT + Ed25519 签名
}

认证恢复状态机UnauthorizedRecovery):

  • 遇到 401/403 时触发
  • 步骤:CheckRefreshToken → RefreshToken → Reauth → Fail
  • expected_account_id 防止账户切换

传输层实现

codex-api/src/endpoint/ 目录包含三种传输:

传输文件用途
HTTP/SSEresponses.rs标准流式请求
WebSocketresponses_websocket.rs低延迟场景
WebRTCrealtime_call.rs实时语音/视频

统一抽象codex-api/src/transport.rs):

#[async_trait]
pub trait HttpTransport: Send + Sync {
async fn execute(&self, req: Request) -> Result<Response, TransportError>;
async fn stream(
&self, req: Request
) -> Result<StreamResponse, TransportError>;
}

重试策略

codex-client/src/retry.rs

pub fn backoff(base: Duration, attempt: u64) -> Duration {
let exp = 2u64.saturating_pow(attempt as u32 - 1);
let raw = base.as_millis() as u64 * exp;
let jitter = rand::rng().random_range(0.9..1.1);
Duration::from_millis((raw as f64 * jitter) as u64)
}
  • 指数退避 + 0.9-1.1x 随机抖动
  • 可重试状态码:429、5xx
  • 集成 OpenTelemetry 追踪

本地模型支持

Ollamaollama/src/lib.rs):

  • 健康探测:probe_server
  • 模型拉取:pull_model_stream
  • 版本检查:fetch_version

LM Studiolmstudio/src/lib.rs):

  • 类似 Ollama 的本地模型管理
  • OpenAI 兼容 API 端点

问题与规避

认证过期

Codex 的双路径刷新:

  • 预刷新:token 过期前主动刷新
  • 后刷新:请求失败后自动刷新并重试
  • 持久化:刷新后立即写回磁盘

流式响应超时

Codex 的配置:

  • 连接超时:建立连接的最大等待
  • 读取超时:两次数据包之间的最大间隔
  • 流式请求不设总超时,避免长回复被中断

设计取舍

为什么统一走 Responses API 协议?

Codex 移除了 Chat API 支持,所有提供商统一走 OpenAI Responses API。优势是:

  • 代码简洁,无需维护两套协议逻辑
  • 新功能(如工具调用、图像生成)在 Responses API 中更完整

代价是限制了与仅支持 Chat API 的提供商的兼容性。

为什么支持 WebRTC?

Codex 除了 HTTP/SSE 和 WebSocket,还支持 WebRTC 实时 API。这是为了:

  • 支持语音/视频交互场景
  • 降低实时通信的延迟
  • 与 OpenAI 的 Realtime API 对齐

代价是增加了传输层的复杂度,WebRTC 的 NAT 穿透和信号交换需要额外处理。


参考来源