Day 08 / 共 20 天 · 第 2 周 · 核心引擎
Agent Turn 主循环
UserInput → run_turn → 流式模型 → 工具调用 → 回填,核心引擎纵切。
📍 你在整门课的位置 · 第 2 周 · 核心引擎
D06 启动链→D07 Op 协议与 app-server→D08 Agent Turn 主循环→D09 配置分层与 config.toml→D10 认证与模型 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.rs | Op 分发 |
| core/src/tasks/regular.rs | 发起常规任务 |
| core/src/session/turn.rs | ★ run_turn(约 2500+ 行) |
| core/src/client.rs | ModelClient 流式请求 |
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)建议按注释跳读:
run_pre_sampling_compact— 采样前先压缩,避免撑爆窗口capture_step_context+record_context_updates…— 固定本 turn 模型可见状态build_skills_and_plugins— 注入 Skills / Plugins 相关 itemsrun_hooks_and_record_inputs— 生命周期 hooks + 记录用户输入- 之后进入「采样 ↔ 工具」大循环(同文件后半)
拼 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 步文件链。