Skip to content

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 里
CallbackExtension API

结论:Pi 的 agent loop 是真正的"最小循环",适合学习 agent 核心逻辑。它证明了 agent loop 可以非常纯粹,只要把非核心职责推到其他层。

Powered by VitePress