← 返回目录

第 2 卷

第 2 / 4 卷日期:

agent 的身份,与它的会话共用同一个 SessionId(不一致会个 idid

以上是 agent 身上带的数据。再看 agent 能干什么。Agent 接口本身很小,值得整个记住,后面几讲都是靠这几个方法去驱动 agent 的:

方法作用

agent.followup(message)排下一轮,等当前轮次跑完再开;会唤醒 agent

本轮内插一步,下次请求前生效;只在闲着时唤醒 agent.steer(message)

(已经在跑就直接插到下一步)

agent.inject(message)往上下文补一条;不唤醒 agent

followup / steer / inject 的统一形式;target 指定 agent.send(message, target, wakeup)

进哪条队,wakeup 决定是否唤醒

agent.cancel(cause, options?)中止 agent 的运行;方法名是 cancel,不是 abort

返回 Promise,等 agent 把手里的活干完、真正闲 agent.whenIdle()

来才 resolve;判断"跑完"要用这个方法,不能靠猜

借 agent 的驱动上下文执行一个维护任务;第 10 讲 agent.runMaintenance(task)

的 compactNow 就走这条路

上面七个方法里,前三个最容易记混——followup 排下一轮,steer 插下一步,inject 只补上下文、不唤醒。

Agent 的生灭:announce 时诞生,disposed 时退场

第二个问题:组装好之后,从哪一刻算一个 Agent?

做完,返回 AgentHandle;agent 就在 announce(agent) 发出 agent/created 的那一刻诞生。

手上已经有一个 agent 对象时,用 register(agent):它拆开是两下:enter(agent, owner) 只把它登记进注册表,外界还不知情;announce(agent) 发出

agent/created,对外宣告它诞生。

两条路殊途同归,都是 enter(agent, owner) 之后 announce(agent),区别只在谁去调:create 由 factory 在内部调,register 是你自己调。而让它诞生的始终是后一步

——announce() 那一声 agent/created。

诞生只是第一环:整条生命线,示例一次打全。

复制代码

1---注册表:agent不止一条,得知道自己在问谁---
2ctx.agents.list():1个agent
3ctx.agents.roots():1个(没有父级的那些)
4ctx.agents.get('sess-loop')就是它本人:true

5 6...

7

8---收尾:只拆循环这一个fiber,看agent怎么退场---
9生命周期事件:created(sess-loop) → session-start(source=startup) → disposed(sess-
10ctx.agents.list():1→0

后半段那串 created → session-start → disposed,就是它的生命周期:三个一次性的里程碑(注意,没有配对的 session-end:收尾就发 disposed)。agent/status 则

在 idle 与 running 之间来回切换,前面每轮日志末尾的 running → idle 就是它。四个事件分别在什么时候发、意味着什么,看这张表:

agent/createdannounce(agent)时它正式诞生
agent/session-start第一次真要跑之前它要开始干活了

disposed 的次序:让循环停下来 → 撤销这个 agent 注册的东⻄(工具、提示词、监听器,就是前面 agent.ctx 里那些)→ 把它从注册表里移除,随后发出

agent/disposed。示例收尾那两行正是证据:disposed(sess-loop)、 ctx.agents.list():1 → 0。

上面是它的生与死,而这两件事都挂在注册表(ctx.agents)上:enter 登记、 announce 发布,是生;注销时发 agent/disposed、把它移除,是灭。

一个 turn:请求、工具、再请求

第三个问题:一个轮次是怎么跑的?

要看清一轮是怎么跑的,先看一个 turn(轮次)长什么样。一个 turn 是“一条提示词对应的一整趟处理”,从 turn/start 开始、到 turn/end 结束。

turn 里的每一次模型请求叫一个 step(步骤)。示例里第 1 轮,模型先请求工具(第一个 step),拿到结果后又答了一次(第二个 step),所以是两个 step;第 2 轮它直接给出答

案,没有工具,就只有一个 step。

第 1 轮是怎么开始的?示例里就这两行:followup() 把提示词排进队列,whenIdle() 等它跑完。问的是“帮我把「你好」回显一遍”,正好用上 echo 工具,先要一次工具、拿到回

显结果、再给答案,第 1 轮的两个 step 就是这么来的:

复制代码 1agent.followup(createUserMessage({ content: [{ type: 'text', text: '帮我把「你好」回

2await agent.whenIdle()

全站分卷索引 · 4 卷
  1. 1第 1 卷
  2. 2第 2 卷
  3. 3第 3 卷
  4. 4第 4 卷