核心对话循环
对话由 async function* query() 驱动:每轮组装消息 → 流式 callModel → 解析 tool_use → 走工具管线 → 决定继续或 end_turn。
1. query() 职责
| 步骤 | 说明 |
|---|---|
| 收集上下文 | CLAUDE.md、git、环境、memory(见 07) |
| 组装 system | 规则、工具列表、输出风格 |
| 消息准备 | 紧凑化、折叠、token 预算 |
| API 调用 | yield 流式 chunk 给 UI |
| 工具回合 | 权限 + hooks + tool.call |
| 循环控制 | 仍有 tool_use 则继续 |
2. 单轮与多轮
- 用户消息进入 history。
- 模型返回 text + tool_use blocks。
- 工具结果以 tool_result 消息回灌,直至模型不再请求工具。
3. 工具执行编排
与 03 一致:validateInput → checkPermissions → PreToolUse → call → PostToolUse → yield 结果。
4. 消息类型
Human / Assistant(含 tool_use)/ Tool result;流式阶段用 chunk 聚合为完整 block。
5. Coordinator 模式
多 Agent/Task 时由 coordinator 分配子任务、汇总结果,仍汇入同一 query 事件流供 UI 展示。
6. 历史管理
- 超预算触发 压缩(四层策略,见 07、12)。
- 可选持久化到磁盘供跨会话恢复。
7. 总结
query = 产品心脏;所有 UX 与成本行为都挂在这条生成器链上。