能找到入口
- 知道
bin.pi指向构建后的 CLI。 - 知道源码入口是
packages/coding-agent/src/cli.ts。 - 知道
main.ts负责模式分发。
01 · 使用入口
这一章不试图读完整个项目,而是只追一条干净主线:一次用户输入如何从 CLI 进入
AgentSession,再进入 Agent,最后由 runLoop()
驱动模型输出、工具调用和事件流。
这一章的验收标准不是会改功能,而是能解释 pi 为什么不是普通的一问一答程序。
bin.pi 指向构建后的 CLI。packages/coding-agent/src/cli.ts。main.ts 负责模式分发。AgentSession 是会话和产品逻辑。Agent 是执行层状态机。agent-loop 是模型和工具循环。message_update 来自模型 stream。agent_end 是一次 run 的结束。第一次不要急着评价回答质量,先确认一次 prompt 是否真的进入了 agent 核心链路。
session。agent_start 表示进入一次 agent run。turn_start 表示开始一轮模型/工具循环。message_update 可能包含 text、thinking 或 tool call 增量。tool_execution_start/end 才是本地工具执行。toolResult 回填后模型才知道工具结果。pi --mode json -p "Read README.md and summarize it"。JSON mode 最适合第一遍观察,因为它把 session、agent、message 和 tool 事件按顺序打印出来。
第一条主线只看一次 prompt 如何进入 agent,不展开所有配置、扩展和 UI 分支。
print mode,更容易看到 agent 的骨架。
print、json、interactive、RPC、SDK 的入口不同,但它们不是五套 agent 核心。
pi --mode json -p "Read README.md and summarize it"
print 适合只要最终文本。json 适合观察事件流。interactive 适合真实终端交互。RPC 把事件给外部客户端。SDK 把 agent 能力给程序调用。AgentSession -> Agent -> runLoop。这一节最重要的能力是判断某段逻辑应该属于哪一层。
AgentSession.prompt() 不是请求模型;它把用户输入预处理成 agent 可执行消息。
Agent.prompt() 也不是请求模型;它启动一次 agent run。
真正的执行引擎是 runAgentLoop() 和 runLoop()。
这就是 pi agent 不是一问一答的核心原因。
streamAssistantResponse()。agent_end。runLoop 里反复执行“模型生成、工具调用、工具结果回填、继续生成”,直到没有工具、steering 或 follow-up 才结束。
真实输出可以直接对应到源码里的 emit 时机。
pi --mode json -p "Read README.md and summarize it"
{"type":"session", ...}
{"type":"agent_start"}
{"type":"turn_start"}
{"type":"message_start","message":{"role":"user", ...}}
{"type":"message_end","message":{"role":"user", ...}}
{"type":"message_start","message":{"role":"assistant", ...}}
{"type":"message_update","assistantMessageEvent":{"type":"thinking_start", ...}}
{"type":"message_update","assistantMessageEvent":{"type":"thinking_end", ...}}
session 是 session header,不是 agent loop 事件。agent_start 表示一次 agent run 开始。turn_start 表示一轮模型/工具循环开始。AgentSession.prompt() 构造出来的。toolcall_start、tool_execution_start、
tool_execution_end、toolResult、turn_end、
agent_end。工具细节留到第 04 章。
sessionagent_startturn_startmessage_startAgentSession.prompt(),assistant message 来自 provider stream。message_updatetool_execution_starttool_execution_endturn_endagent_end本章已经完成概念导读和事件观察,工具实现细节留给后续章节。
pi 命令入口。main.ts 的 mode 分发。AgentSession.prompt() 的会话层职责。Agent.prompt() 的执行层职责。runLoop() 的内外循环。packages/ai。Context、toolCall 和 toolResult。