← 返回目录

第 2 卷

第 2 / 3 卷日期:

tools)会把这个工具记在该 preset 名下,只有加入对应 preset 的 Agent 才看得到。

另一行是人设行(示例里的 id: persona):这一行的作用就是定一份人设, config.text 里那段话就是内容;dsh-persona 会拿它替掉原本共用的那份默认人设。于

是挂了不同 preset 的 Agent,看到的人设就不一样。

补充一句,preset 的一行不局限于工具或人设,提示词段落、投影单元(把插件能力投影到模型可见上下文的单元,本讲不展开)、监听器都在官方列举里,但装法都一样:一个插件一

行,都记在该 preset 名下。所以“工具、人设、提示词段落”谈不上三种行,区别只在装的东 ⻄不同。边界由官方一句话定死:preset 的能力等于它命名的那些插件(本讲不展开)。本

讲用工具与人设演示,只是因为它们最常用。

复制整个目录:copy()

第二个问题:怎么造一份新的 preset?

造法有两条,看你要哪种:从零定义一份,就建目录、写一份 agent.cordis.yml,上文示例那两份就是现写的;想在现成 preset 上改一份,就走包的 copy(from, id, name?):

复制整个目录(组装、元数据、附带资产全带上,总之目录里有什么就带什么),落在配置中第一个 trust: 'user' 的根目录下。

调用方只给“来源 id、新 id、可选显示名”:只传名字,不传内容,副本能做什么就跟它的来源一模一样,不会更多。

复制出的 preset.yml 会被重写:description 保留来源的,之后可以自己改;name 不保留。副本默认用 id 当显示名,不会和来源重名。

示例最后演示的正是 copy(),从 coder 复制出一份 coder2:

setup 里 mount

第三个问题:怎么按名字把 preset 装到 Agent 上?

答案是 ctx.agentPresets.mount(agentCtx, id),但它只能放在 setup(agentCtx) 钩子里(就是下面 ctx.agents.create(...) 里的 setup):

复制代码

1conston=async(id: string, presetId?: string): Promise<agent> =>
2(awaitctx.agents.create({
3sessionId: SessionId(id),
4setup:async(agentCtx: Context) =>void(awaitctx.agentPresets.mount(agentC
5})).agent</agent>

必须在这里,是因为 setup 是 Agent 还没发布的时候,这时挂载失败,整次创建就回滚,不会留下一个装到一半的 Agent。哪些情况会被拒?一行没装成的插件(模块坏了,或等不到它

要的服务),或传入的 agentCtx 本身不在任何 scope 层级里。示例用它各挂载一个 agent:

复制代码 1--- 用不同 preset 各挂载一个 agent ---

2sess-coder: 工具 [run_command],人设 "你是个严谨的程序员,写代码一丝不苟。"

3sess-writer: 工具 [write_poem],人设 "你是个文艺的作家,出口成章。"

各挂各的 scope

第四个问题:preset 怎么既隔离、又共享?

一个 agent 把它的 scope key 认父到其中一份(认父:把 agent 的 scope key 挂到 preset 的 scope 下面),就只看得到它认的那份:coder Agent 找不到 write_poem,writer

Agent 也找不到 run_command。

认父之后怎么取,靠的是 dsh-scope 的父链(dsh-scope 是 dsh-agent-presets 的 peer 依赖,本讲不展开)。scope 一层套一层,取的时候从里到外找:agent → preset →

global,越靠里的越优先。这条链只属于这一个 Agent,只连它认的那份 preset,够不到别的。

至于同一份 preset 下的多个 Agent,它们共享的是同一份实例:每份 preset 只挂载一次,挂在一个常驻 scope 里,preset 里的插件只实例化一次,所有加入它的 agent 都能访问到这

些插件。它们之间互不串扰,靠的是共享同一批插件,但各自的状态分开存(每个 agent 的状态挂在自己的 scope 下,互不影响),而不是每个 Agent 单独装一份。

这个常驻 scope 是进程级的,比任何 agent 都活得久。一个 Agent 退出,不影响其他加入者。还有一层:你改了 preset 文件,正在跑的 Agent 也不受影响。文件每改一次,就算新一

代;已经挂上的 Agent 留在改动前那一代,改动只送达后来创建的 Agent。

最后用两个例子收个尾:没加入任何 preset 的宿主,一个工具都看不到;再来一个也用 coder preset 的 agent,看到的还是同一套工具:

复制代码 1--- 宿主 ctx(没挂任何 preset)---

2host: 工具 [无],人设 "部署默认人设"

3 4--- 再来一个也用 coder 的 agent ---

5sess-coder-2: 工具 [run_command],人设 "你是个严谨的程序员,写代码一丝不苟。"

6两个 coder 会话看到同一套工具:true

本讲小结

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