第 4 卷
到这里,Context、插件、Effect、Service、事件,这些 Cordis 的“核心概念”你都认识了。
但还差最后一步:一堆插件到底怎么拼成一个完整的真实可用的应用?一个真实的 Agent 有几十上百个插件,它们的配置、隔离、热更新,谁来管?下一讲,我们就来聊聊 Cordis 的插
件树——声明式配置、isolate 隔离与 HMR 热更新。
注:本讲 GitHub 链接
思考题
动手实操:在 waterfall 部分再添加一个监听器(比如给回复末尾加上一个表情符号 :)),观察它加在了哪一层,输出会变成什么样。
小改动:把 serial 的第二个监听器(时间意图)改成第一个(即把它的注册顺序提前),重新运行,看“帮我查一下天气”和“现在的时间是几点”的输出分别是什么,思考监听器的调用
顺序是否有变化。
欢迎把你的运行结果分享出来。如果你觉得这节课对你有帮助,也欢迎分享给其他朋友,我们下节课再见!
© 版权归极客邦科技所有,未经许可不得传播售卖。页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
全部留言 (1)
最新精选

谈理想
2026-09-01 来自浙江
// 练习,末尾加表情 ctx.on('demo/transform', (input, next) => {
const downstream = next() // 先拿到下游结果
ctx.on('demo/transform', (input, next) => { const downstream = next() // 先拿到下游结果
return `[Bot] ${downstream}` // 加上署名 })
// Listener 2: 遇到敏感词就短路 ctx.on('demo/transform', (input, next) => {
if(input.includes('脏话')) return '内容已拦截' // 直接返回,不调用next(),短路 return next() // 正常情况,继续往下走
})
实操1:结果:正常回复: [Bot] 你好,很高兴遇见你 :)
被拦截的回复: [Bot] 内容已拦截 :)
ctx.on('jike/serial', (text) => { console.log('天气接单')
if(text.includes('天气')) { return 'weather' // 我负责天气,返回非空值 = 我接单了
} // 返回undefine = 我不处理,继续问下一个
})
ctx.on('jike/serial', (text) => { console.log('时间接单')
if(text.includes('时间')) { return 'time' // 我负责时间,返回非空值
} }, {prepend: true})
const res = await ctx.serial('jike/serial', '帮我查一下天气')
console.log('返回的结果: ', res)
实操2,为了更好地看出顺序,我在判断前增加了log。结果:时间接单天气接单
返回的结果: weather