T learn.traeai
OPEN SOURCE LAB / PI

从项目地图走进真实源码。

按模块学习 Pi 的完整仓库:左边浏览文件,中间建立架构理解,右边写自己的实现。

Pi 全项目 · 3 个文件
固定版本 a13d35a

Pi 1.0 站内课程:讲解、练习、自测与项目 →

06

Agent 运行循环 · earendil-works/pi

Pi 1.0.0 · 固定提交 a13d35a · 3 个可读文件 · 11 个学习阶段

01 / 源码GitHub · 只读
packages/agent/src/agent-loop.ts25 行
02 / 项目讲解
PI 1.0.011 个阶段 · 固定提交 a13d35a
当前阶段 / 06

Agent 运行循环

理解消息上下文、继续执行与工具调用。

本章主线

先读 Agent 对外接口,再读 agent-loop。当前精选练习只覆盖继续执行前的两项检查,不代表完整 Agent 实现。

Pi 源码精读

基于固定提交 a13d35a

这一文件同时包含启动、继续、模型请求和工具结果回写;只看精选的几行会错过真正的循环。

  1. 01
    区分新提示和继续

    agentLoop 会接收新的 prompts;agentLoopContinue 不加新消息,并在进入循环前拒绝空上下文或末尾是 assistant 的上下文。

    读完确认:继续执行为什么不能只凭一个 assistant 输出开始?

  2. 02
    找出循环边界

    runLoop 有外层循环处理后续消息,内层循环处理工具调用和等待中的消息;一轮模型输出不一定就是整个任务结束。

    读完确认:哪个条件使内层循环继续?

  3. 03
    跟踪工具结果回写

    模型响应中的 toolCall 被执行后,结果会加入 currentContext.messages 和 newMessages,供下一轮模型请求使用。

    读完确认:工具执行结果进入后续上下文的具体语句在哪里?

从哪里追到哪里

  1. 01
    看对外状态与事件

    先读 Agent 接口,确认调用者如何提交消息、订阅事件和管理运行状态。

  2. 02
    拆开两种启动方式

    agentLoop 会加入新提示;agentLoopContinue 沿现有上下文继续。对照入口理解何时需要新消息。

  3. 03
    跟踪一轮执行

    继续往下读 runLoop:模型输出、工具调用、工具结果与下一轮请求在这里连接。

参考文件

边界与误区

继续执行的两项前置检查只防住空消息和末尾 assistant;源码注释还提醒,转换成模型消息后的角色合法性并未在这里完整验证。

这一段为什么值得停下来

继续 Agent 时,空消息列表与末尾是 assistant 的上下文都会抛错。源码注释也说明:转成模型消息后仍可能不符合要求;这两项检查不是完整验证。

检验理解

为什么末尾是 assistant 时不能直接继续?

继续执行需要能够转换成模型输入的当前上下文;源码对此角色直接抛错,避免把 assistant 输出当成新的用户或工具结果。

本页练习覆盖了整个 Agent 循环吗?

没有。它只复现两项前置检查;流式模型响应、工具执行、状态更新和错误处理仍在真实循环中。

packages/agent/src/agent-loop.ts · L77–L83
尚未连接学习 API;预写讲解仍可使用。
03 / 自己动手草稿仅保存在本机
YOUR TURN · 精选练习

写出继续前的检查

实现 assertCanContinue:空列表或末尾为 assistant 时抛错;其他输入不抛错。练习只复现原函数的两项前置检查,不验证 convertToLlm 的结果。

计划测试:空消息列表 · 末尾是 assistant · 末尾是 user · 末尾是 toolResult
当前语言:TypeScript · 每种语言的草稿分别保存。仅精选 TypeScript 练习可运行固定测试,其余语言可编辑并请求 Agent 建议。
solution.ts● 本机草稿
测试状态未运行

当前模式没有可运行的标准测试;不显示虚假的通过分数。

草稿默认只保存在这个浏览器;点击 Agent 评价时会将当前代码和目标发送到所配置的模型服务。分享链接不包含它们。

本站教学练习不是 Pi 原仓库的 API,也不代表原作者参与课程。

了解这个模块