第 2 节 · 本站原创中文课程 · 建议 25 分钟
读懂一轮 Agent 与继续执行
学完能做:复现继续检查,并追踪模型响应和工具结果回写。
新提示与继续不同
agentLoop 接受 prompts 并加到上下文;agentLoopContinue 不增加新消息。后者的 77–83 行只检查两件事:列表为空时抛错,最后一条消息 role 为 assistant 时抛错。注释还要求 convertToLlm 后末尾为 user 或 toolResult,这个条件没有在入口完整验证。因此练习里的 assertCanContinue 只是复现局部检查,不能被当成所有供应商的消息合法性验证器。
export function assertCanContinue(messages: { role: string }[]): void {
// 实现原函数中的两项前置检查
} 循环为何会再次请求模型
runLoop 的外层处理任务结束后到来的 follow-up,内层处理工具调用和 steering 消息。prepareNextTurn 可在后续回合安装新的快照。响应包含工具调用时,运行时执行工具,将每个 toolResult 同时写入 currentContext.messages 和 newMessages,再判断继续或停止。若输出因为 length 截断,源码走失败工具结果路径,避免执行参数可能不完整的调用。
用确定性轨迹验证理解
源码只读不意味着你不用动手。先给自己的最小循环一个假模型:第一次输出工具调用,第二次输出最终答案;假工具返回固定观察。检查第二次请求确实看到工具结果,且停止后不再调用模型。再用空消息、末尾 assistant、末尾 user、末尾 toolResult 验证局部检查。四项测试通过只证明这四个分支,不证明完整 Agent、外部权限或供应商兼容。
这是本站独立编写的讲解与示例,并非官方课程逐字翻译。理解之后,请完成下面的练习、自测和笔记。