Day 08 / 共 20 天 · 第 2 周 · 核心引擎

Agent Turn 主循环

UserInput → run_turn → 流式模型 → 工具调用 → 回填,核心引擎纵切。

📍 你在整门课的位置 · 第 2 周 · 核心引擎
D06 启动链D07 Op 协议与 app-serverD08 Agent Turn 主循环D09 配置分层与 config.tomlD10 认证与模型 Provider
L01

从回车到 run_turn

Composer 提交
  → app-server turn/start
  → CodexThread::submit(Op::UserInput)
  → session/handlers 派发
  → tasks/regular → run_turn()
文件角色
core/src/codex_thread.rs线程公开 API
core/src/session/handlers.rsOp 分发
core/src/tasks/regular.rs发起常规任务
core/src/session/turn.rsrun_turn(约 2500+ 行)
core/src/client.rsModelClient 流式请求
L02

run_turn 开头在干什么(对照源码)

core/src/session/turn.rs 文件头注释概括了契约:工具结果要回填;只有 assistant 消息则 turn 结束。函数签名约在 L144

pub(crate) async fn run_turn(
    sess: Arc<Session>,
    turn_context: Arc<TurnContext>,
    // ...
    input: Vec<TurnInput>,
    cancellation_token: CancellationToken,
) -> CodexResult<Option<String>>

开头几步(约 L152–L210)建议按注释跳读:

  1. run_pre_sampling_compact — 采样前先压缩,避免撑爆窗口
  2. capture_step_context + record_context_updates… — 固定本 turn 模型可见状态
  3. build_skills_and_plugins — 注入 Skills / Plugins 相关 items
  4. run_hooks_and_record_inputs — 生命周期 hooks + 记录用户输入
  5. 之后进入「采样 ↔ 工具」大循环(同文件后半)
拼 prompt历史+工具定义
流式读文本/reasoning
遇 tool_call路由执行
写回上下文
直到结束/打断
精读建议不要一次读完 2500 行。今天只求:能指着函数签名 + 开头五步讲清楚;采样循环放到你自己用 rg "tool" 在同文件里追。
L03

工具回合

core/src/tools/spec_plan.rs 决定本回合暴露哪些工具;tools/router.rs 把 call 分到 tools/handlers/

注意AGENTS.md 提醒:避免再往已经臃肿的 codex-core 无塞无关功能——读代码时也会感到 core 很「胖」。
L04

今日小结

rg -n "pub(crate) async fn run_turn" codex-rs/core/src/session/turn.rs
rg -n "enum Op" -n codex-rs/protocol/src/protocol.rs | head
✅ 能默写回车后的 5 步文件链。
← Day 07 Day 09 · 配置分层与 config.toml →