Skip to content

代理循环 — 代码走读

codex-rs/core/src/session/mod.rs — 会话状态机(3404 行)

Codex struct 是代理循环的核心,实现了事件驱动的队列对模式:

rust
pub struct Codex {
    tx_sub: Sender<Submission>,       // 操作提交通道
    rx_event: Receiver<Event>,         // 事件接收通道
    agent_status: watch::Receiver<AgentStatus>,
    session: Arc<Session>,             // 共享会话状态
    session_loop_termination: SessionLoopTermination,
}

核心方法调用链:

方法功能调用链
Codex::spawn(args)创建 Session→ 启动事件循环 task
submit(Op)提交操作tx_sub.send(Submission)
next_event()获取下一个事件rx_event.recv()
steer_input()运行时中断/引导→ 修改当前 turn 行为

Session struct(3404 行)是实际的状态管理器,关键方法包括:

rust
impl Session {
    fn build_initial_context()        // 组装完整上下文
    fn handle_submission()            // 处理提交的操作
    fn emit_turn_item_started()       // 发出 turn item 开始事件
    fn emit_turn_item_completed()     // 发出 turn item 完成事件
    fn request_command_approval()     // 请求命令审批
    fn request_patch_approval()       // 请求补丁审批
    fn record_conversation_items()    // 记录对话条目
    fn replace_compacted_history()    // 替换压缩历史
    fn update_token_usage_info()      // 更新 token 用量
    fn persist_execpolicy_amendment() // 持久化策略修改
    fn steer_input()                  // 运行时引导
    fn interrupt_task()               // 中断当前任务
}

codex-rs/core/src/codex_thread.rs — 线程封装

CodexThreadCodex 的高级封装,为外部消费者提供更友好的 API:

rust
pub struct CodexThread {
    codex: Codex,
    session_source: SessionSource,
    session_configured: SessionConfiguredEvent,
    rollout_path: Option<PathBuf>,
    out_of_band_elicitation_count: usize,
}

关键方法:

方法功能
submit(Op)提交操作到 Session
next_event() -> Event等待并返回下一个事件
agent_status()获取当前代理状态
steer_input()引导/中断当前 turn
token_usage_info()获取 token 用量信息
config_snapshot()获取配置快照(ThreadConfigSnapshot
load_history()加载对话历史
read_mcp_resource()读取 MCP 资源
call_mcp_tool()调用 MCP 工具
apply_thread_settings_overrides()应用线程级配置覆盖
inject_response_items()注入响应条目

CodexThreadSettingsOverrides 定义了 per-turn 可修改的设置:

rust
pub struct CodexThreadSettingsOverrides {
    pub cwd: Option<PathBuf>,
    pub workspace_roots: Option<Vec<PathBuf>>,
    pub approval_policy: Option<ApprovalPolicy>,
    pub sandbox_policy: Option<SandboxPolicy>,
    pub permission_profile: Option<PermissionProfileName>,
    pub model: Option<String>,
    pub effort: Option<ReasoningEffort>,
    pub summary: Option<ReasoningSummary>,
    pub service_tier: Option<ServiceTier>,
    pub collaboration_mode: Option<CollaborationMode>,
    pub personality: Option<Personality>,
}

codex-rs/core/src/client.rs — 模型客户端(2254 行)

ModelClient 管理 LLM API 的连接和调用:

rust
pub struct ModelClient {
    state: Arc<ModelClientState>,
    prompt_cache_key_override: Option<String>,
}

传输层级:优先 WebSocket,回退到 HTTP SSE。两者都使用 Responses API(/responses 端点):

rust
impl ModelClient {
    pub fn new_session(&self) -> ModelClientSession  // 创建 turn-scoped session
    pub fn compact_conversation_history()             // 压缩对话历史
    pub fn create_realtime_call_with_headers()         // 发起实时调用
}

impl ModelClientSession {
    pub async fn stream(&self) -> ResponseStream      // 获取流式响应
    pub async fn prewarm_websocket()                   // 预热 WebSocket
}

ModelClientState 内部字段:

字段功能
session_id会话唯一标识
thread_id线程标识
provider: SharedModelProvider模型提供商
session_source会话来源
cached_websocket_sessionWebSocket 连接缓存
disable_websockets禁用 WebSocket 标志

codex-rs/apply-patch/src/lib.rs — 补丁解析与应用

StreamingPatchParser 流式解析 *** Begin Patch 格式的补丁文本:

rust
pub fn parse_patch(patch: &str) -> Result<Vec<Hunk>, ParseError>

pub struct ApplyPatchArgs {
    pub patch: String,
    pub hunks: Vec<Hunk>,
    pub workdir: Option<String>,
    pub environment_id: Option<String>,
}

pub fn verify_apply_patch_args(args: &ApplyPatchArgs) -> Result<(), ApplyPatchError>

错误类型 ApplyPatchErrorParseError(解析失败)、IoError(IO 错误)、ComputeReplacements(替换计算失败)、ImplicitInvocation(隐式调用)。

codex-rs/core/src/rollout/ — Rollout 记录

Rollout 模块负责记录代理循环的完整执行轨迹:

rust
pub struct RolloutRecorder {
    // 记录每个 turn 的模型输入/输出、工具调用、执行结果
}

pub struct RolloutRecorderParams {
    pub cursor: Cursor,
    pub session_meta: SessionMeta,
}

pub struct Cursor { /* 会话位置标记 */ }
pub struct SessionMeta { /* 会话元数据 */ }

ThreadManager 管理多线程的生命周期:

rust
pub struct ThreadManager {
    // 线程创建、恢复、归档、分叉
}

pub struct NewThread { /* 新线程参数 */ }
pub struct StartThreadOptions { /* 启动选项 */ }
pub struct ForkSnapshot { /* 分叉快照 */ }

关键函数索引

函数/模块文件路径说明
Codex::spawn()core/src/session/mod.rs创建 Session,启动事件循环
Session::build_initial_context()core/src/session/mod.rs组装完整 LLM 输入上下文
Session::handle_submission()core/src/session/mod.rs处理提交的操作,驱动代理循环
ModelClient::new_session()core/src/client.rs创建 turn-scoped 模型会话
ModelClientSession::stream()core/src/client.rs发起流式 LLM 调用
CodexThread::submit()core/src/codex_thread.rs提交操作到线程
CodexThread::next_event()core/src/codex_thread.rs等待下一个事件
parse_patch()apply-patch/src/lib.rs解析补丁文本为 Hunk 列表
verify_apply_patch_args()apply-patch/src/lib.rs验证补丁参数
compact_conversation_history()core/src/client.rs压缩对话历史
RolloutRecordercore/src/rollout/执行轨迹记录
ThreadManagercore/src/thread_manager.rs多线程生命周期管理