7.2 Agent Loop(代理循环)端到端解析
7.2.1 循环入口:Gateway 的 agent RPC 方法
agent RPC 方法{
"type": "req",
"id": "req-001",
"method": "agent",
"params": {
"message": "帮我分析这段代码的性能问题",
"sessionKey": "agent:main:telegram:default:dm:12345",
"channel": "telegram",
"deliver": true,
"idempotencyKey": "550e8400-e29b-41d4-a716-446655440000"
}
}// src/gateway/server-methods/agent.ts(简化版)
agent: async ({ params, respond, context, client }) => {
// 1. 参数校验
if (!validateAgentParams(params)) {
respond(false, undefined, errorShape(...));
return;
}
// 2. 幂等性去重
const cached = context.dedupe.get(`agent:${idem}`);
if (cached) {
respond(cached.ok, cached.payload, cached.error, { cached: true });
return;
}
// 3. 会话解析与投递计划
const deliveryPlan = resolveAgentDeliveryPlan({ ... });
// 4. 立即响应"已接受"(第一个 res 帧)
const accepted = { runId, status: "accepted", acceptedAt: Date.now() };
context.dedupe.set(`agent:${idem}`, { ts: Date.now(), ok: true, payload: accepted });
respond(true, accepted, undefined, { runId });
// 5. 异步执行 Agent 循环(不阻塞 WebSocket)
void agentCommand({ message, sessionKey, ... })
.then((result) => {
// 第二个 res 帧:完成
respond(true, { runId, status: "ok", result }, undefined, { runId });
})
.catch((err) => {
// 第二个 res 帧:错误
respond(false, { runId, status: "error", summary: String(err) }, ...);
});
};7.2.2 步骤 1:参数校验与会话解析
7.2.3 步骤 2:agentCommand — 模型解析、技能快照加载
agentCommand — 模型解析、技能快照加载模型解析
技能快照加载
7.2.4 步骤 3:runEmbeddedPiAgent — 队列序列化、auth profile 解析、Pi 会话构建
runEmbeddedPiAgent — 队列序列化、auth profile 解析、Pi 会话构建队列序列化
Auth Profile 解析
上下文窗口保护
核心循环:尝试 → 错误恢复 → 重试
顺序
错误类型
恢复策略
7.2.5 步骤 4:subscribeEmbeddedPiSession — 事件桥接
subscribeEmbeddedPiSession — 事件桥接7.2.6 步骤 5:结果汇总、用量统计、会话持久化
生命周期事件发射
会话存储更新
结果投递
模型回退的封装
本节小结
Last updated