文档咨询:npc接入外部系统#3761
只要是响应事件(无论是回复评论还是响应api调用)并做出回应,那么他就是一个NPC?
@samsong(AcidBunny) 可以这么理解的,npc:go 也支持传入自己的提示词,来执行操作的(在issue场景也是如此)
npc:go 和 vscode:go 有啥类似的吗?记得有个单/双容器模式的对比? npc:go 能不能看成是双容器?
@samsong(AcidBunny) 可以,npc:go 是运行在容器外的,即他是操作你的容器,你的容器是他的手,他是外挂在容器外的大脑。
Codex
Codex
@alibaba(宋冬冬🦕) 你好!关于 Issue #3761 的问题,我查阅了 CNB 官方文档后,分享下我的看法:
NPC 与 Issue 的交互接口有两种:
@NPC角色名 提及 NPC,触发 issue.comment@npc 或 pull_request.comment@npc 事件,NPC 在对应流水线沙箱中运行后自动回复评论。OPENAPI 调用 POST /{repo}/-/build/start,以 api_trigger_ 开头的事件名触发流水线,可自定义 role、systemPrompt、userPrompt 等参数。你说的没错——评论事件和 API trigger 确实是两种不同的触发方式,它们的执行入口不同,但底层都是启动流水线作为沙箱环境,执行 npc:go 来完成任务。
leun 已经确认了这一点,我补充一下:API trigger 本质上是 反向 Webhook——传统 Webhook 是「事件发生时推送通知给外部」,而 API trigger 是「外部系统主动调用 CNB API 来触发 NPC 执行任务」。它实现了类似 Webhook 的自动化能力,但方向是反的。外部系统可以在任意时机调用 API,让 NPC 执行任务并通过 Skills 回调外部系统返回结果。
可以这么类比。NPC 的核心特征就是响应事件并做出回应——无论是评论回复还是 API 调用,只要能接收输入、执行任务、返回结果,那就是 NPC。这确实很像 Duck Typing:如果一个东西能像 NPC 一样响应事件,那它就是 NPC。
不过有一点补充:NPC 在 CNB 中是有身份标识的——每个 NPC 角色在 .cnb/settings.yml 中定义了名字、风格、prompt,评论回复会以 NPC 角色名作为提交者。所以它不完全是匿名的 Duck Typing,而是有身份的响应式角色。
leun 的比喻很精准:「npc:go 运行在容器外,操作你的容器,你的容器是它的手,它是外挂在容器外的大脑。」这确实和双容器模式类似,但有个关键区别:
| 双容器模式 | npc:go | |
|---|---|---|
| 架构 | 开发容器 + code-server 容器,共享 /workspace | NPC 沙箱容器 → 操作目标仓库/容器 |
| 交互方式 | 两个容器通过文件系统互通 | NPC 通过 CLI/API(cnb 命令、Skills)操作外部 |
| 目的 | 让 code-server 能访问未安装 IDE 的开发环境 | 让 AI 大脑能操作代码仓库和 Issue/PR |
| 运行时机 | 开发环境启动时持续运行 | 事件触发后按需执行,任务完成即回收 |
所以 npc:go 更准确地说是**「大脑+手」的协作模式**——NPC 是大脑(决策和生成),它操作的容器环境是手(执行和落地),两者通过 CNB 的流水线基础设施连接。这比双容器模式的「并列协作」更像是「主从协作」。
总结:你对 NPC 的理解方向是对的。NPC 本质是一个响应事件的自动化角色,API trigger 提供了类似 Webhook 的外部接入能力,npc:go 可以类比为双容器中的「大脑」角色,但它的交互模式更偏向主从协作而非并列互通。
描述一下体验不好的点
在我远古的记忆当中,npc只能与外界通过issues交互,且观测到npc的记忆窗可能只有标题,内容和被艾特的那一条评论。
今天看到“外部系统接入npc”,因此我想要知道npc:go的行为是什么?npc与issue的接口是啥样子的?api trigger 事件和 comment事件似乎是两个不同的触发方式?那么api trigger 是不是实现了webhook功能?
所以,我还想要知道,npc是类似 “duck typing”吗?只要是响应事件(无论是回复评论还是响应api调用)并做出回应,那么他就是一个NPC?
npc:go 和 vscode:go 有啥类似的吗?记得有个单/双容器模式的对比? npc:go 能不能看成是双容器?