Pi Agent Loop
位置
packages/agent/src/agent-loop.ts
概述
Pi 的 agent loop 是三个项目中最清晰、最精简的。它不做持久化、不做 gateway、不做 cron——只做 agent 核心循环。
核心代码流程
typescript
async function loop(
agent: Agent,
messages: Message[],
tools: Tool[],
options: LoopOptions
): Promise<LoopResult> {
let currentMessages = [...messages];
for (let turn = 0; turn < maxTurns; turn++) {
// 1. 调用 LLM
const response = await agent.provider.generate({
messages: currentMessages,
tools: tools.map(toolToSchema),
stream: options.stream,
});
// 2. 解析响应
const lastMessage = response.messages[response.messages.length - 1];
// 3. 处理工具调用
if (lastMessage.type === 'tool-calls') {
const toolResults = await executeTools(lastMessage.toolCalls, tools);
// 4. 追加到消息历史
currentMessages.push(lastMessage);
for (const result of toolResults) {
currentMessages.push({
role: 'tool',
content: result.output,
toolCallId: result.id,
});
}
continue; // 下一轮
}
// 5. 最终响应
return {
finalMessage: lastMessage,
messages: currentMessages,
totalTurns: turn + 1,
};
}
throw new Error(`Exceeded max turns: ${maxTurns}`);
}少即是多
对比 Hermes 几百行的 conversation_loop.py,Pi 的 loop 不到 100 行。
Pi 没有的(因为在其他层解决):
| 功能 | Pi 的处理方式 |
|---|---|
| 持久化 | AgentSession(上层) |
| 压缩 | ContextCompressor(上层 resource) |
| 重试 | ai 层 provider |
| Cache | 不在 loop 里 |
| Callback | Extension API |
结论:Pi 的 agent loop 是真正的"最小循环",适合学习 agent 核心逻辑。它证明了 agent loop 可以非常纯粹,只要把非核心职责推到其他层。