智能体「嵌入网站或用作 API」对话框:改版方案
本文定 P2 的界面:智能体的「嵌入网站或用作 API」对话框改用「智能体」资源 Key,「API 管理」页新增这种资源类型,老 Key 停止新建。用户确认方案之前不改代码。
截图是本机 2026-10-03 的整页截图(1440×900)。画布与单智能体编辑页是壳外页面,没有左侧导航;「API 管理」页含左侧约 220px 导航。
团队「数据库团队」(1111),智能体 rag_test(工作流)与 code_agent(单智能体)是真实数据,两个都已发布 v1、都绑着 DefaultKey。截图里的老 Key 原文已遮盖。
示意图只画对话框或对话框里的一块,各图下写明;示意图里的资源 Key 名称与 Key 值是示例数据。
1. 现状
- 两个入口打开同一个对话框:单智能体编辑页顶栏的
</>,工作流画布顶栏的「API Endpoint」。对话框有七个页签:嵌入代码、Python 代码、JavaScript 代码、cURL 代码、异步 API、A2A 协议、分享聊天机器人。 - 页签行右侧的下拉框列出当前团队的老 Key,外加「- Add New Key -」(跳到 API 管理)。选中即调
updateChatflow写智能体的apikeyid(APICodeDialog.jsx:165-176),不经过保存按钮。 下拉框没有「无需授权」选项,绑定解除不了;没有「流程·编辑」权限时置灰。 - 新建智能体时服务端自动绑定本团队的
DefaultKey(server/src/services/chatflows/index.ts:435-449)。本机 41 个智能体全部绑着它,图 5 老 Key 表「用量」一栏的 41 就是这个数。 - 工作流画布上:代码页签把老 Key 原文填进
x-chatv-apikey(图 1)。嵌入代码页签提示「请从顶部右侧的下拉菜单中选择无需授权」(APICodeDialog.jsx:1337-1343),下拉框里却没有这一项,绑了 Key 的工作流拿不到嵌入代码(图 2)。 分享页签的链接带老 Key 原文,旁边是「设为公开」开关(图 3)。 - 单智能体编辑页上,2026-10-03 实测三处异常:
- 下拉框为空,代码示例不带 Key(图 4)。编辑页取智能体信息的
getAgentApp(server/src/services/agent-apps/index.ts:189-202)不返回apikeyid,对话框以为没绑 Key。 照这些示例调/prediction会被拒,因为智能体实际绑着DefaultKey。 - 嵌入代码页签生成不带 Key 的嵌入代码。portal 没有 Key 时走
/internal-prediction(chat-portal/src/chat/api.ts:32),要求 AIMP 登录态,第三方网站的访客发不出消息。这一条按代码推断,未实测。 - 点「分享聊天机器人」后整页白屏,页面报错
Cannot read properties of null (reading 'id')。分享页签从画布的全局状态state.canvas.chatflow取智能体(ShareChatbot.jsx:63-64),编辑页上这个值为空。
rag_test画布,再从左侧导航进code_agent编辑页打开分享页签,由实施本方案的人在动手前复现。 - 下拉框为空,代码示例不带 Key(图 4)。编辑页取智能体信息的
- 「API 管理」页上半部分是资源 Key,现有五种类型(
views/apikey/resourceTypes.js:知识应用、知识源、代码应用、代码采集点、代码系统),图 5 里看得到其中两种;下半部分是老 Key 表,带「导入」「创建 Key」。

图 1 现状:工作流画布 rag_test 的对话框,cURL 页签(整页截图)。下拉框显示 DefaultKey,代码里 x-chatv-apikey 是它的原文(已遮盖)。

图 2 现状:同一对话框的嵌入代码页签(整页截图),要求选择下拉框里并不存在的「无需授权」。

图 3 现状:分享聊天机器人页签(整页截图)。链接末尾的 apikey= 是老 Key 原文(已遮盖),右侧是「设为公开」开关。

图 4 现状:单智能体编辑页 code_agent 的对话框(整页截图),cURL 页签、下拉框展开。下拉框当前值为空,代码里没有 Key。

图 5 现状:「API 管理」页滚到资源 Key 区末尾与老 Key 表(整页截图,含左侧导航)。老 Key 表只有 DefaultKey 一行,用量 41。
2. 改动一览
| 位置 | 改动 | 不变的 |
|---|---|---|
| 页签行右侧下拉框 | 改列我签发的 Key,分「已授权本智能体」与「我的其他 Key」两组,缺省不选;选中只取明文填代码;就地提供「加入」「移出」「签发新 Key」,写的是 Key 的资源列表,不写智能体(3.1) | 位置 |
| Python、JavaScript、cURL、异步 API、A2A 页签 | Key 写进 Authorization: Bearer;没选 Key 时用占位,并给出 SSO 令牌的写法(3.2) | 示例结构;暂停与续跑说明 |
| 嵌入代码页签 | 嵌入代码带选中的智能体 Key,并提示 Key 会出现在网页里;没选 Key 时提示先选;删掉「请选择无需授权」(3.3) | 全屏、弹泡、React 三种写法 |
| 分享聊天机器人页签 | 分两档:组织内成员(不带 Key)、第三方嵌入(带选中的智能体 Key),都跑已发布版本;删「设为公开」;未发布时提示先发布;智能体从对话框参数取,不读画布全局状态(3.4) | 链接参数(开场问题、自动发送);外观配置 |
| 「API 管理」页 | 见 api-keys-page/redesign.html | — |
3. 对话框
3.1 下拉框:挑 Key,也能就地关联
智能体与 Key 的关联存在 Key 上(资源 Key 的资源列表),不存在智能体上。对话框里的快捷操作与「API 管理」页改的是同一份数据、调的是同一组接口,任一处改动在另一处立即可见。
智能体上原来的 apikeyid 不显示、不修改,留到 P4 删除。
- 数据源是现有的
GET /api/v1/apikey/resources,只返回调用人自己签发的 Key。前端分两组:- 「已授权 rag_test」:资源列表含本智能体的 Key。
- 「我的其他 Key」:不含本智能体、对外用途、未吊销、未过期的 Key。代码采集点的 Key 不列,它只能单独绑采集点;已有 20 个资源的 Key 灰掉,提示已满。
- 选中「已授权」组里的 Key:调一次
POST /api/v1/apikey/resources/:id/reveal取明文,填进各页签的代码,不写任何数据。 同一次打开对话框,同一把 Key 只取一次明文,存在内存里供各页签共用,关掉对话框即丢弃。不能查看明文的 Key(存量无密文)灰掉,判据同ResourceKeyCell.jsx:11-16。 - 加入:把本智能体加进「我的其他 Key」里的某一把。调现有的
PUT /api/v1/apikey/resources/:id/resources,资源列表等于原列表加本智能体。 Key 本身不变,持有它的外部系统不用改配置。加入前弹确认,列出这把 Key 现有的资源;成功后自动选中这把 Key。 - 移出:同一个接口,资源列表去掉本智能体,弹确认。一把 Key 至少要有 1 个资源,所以只授权了本智能体的 Key 不能移出,提示到「API 管理」吊销。
- 签发新 Key:在对话框上叠一层现有的「创建资源 Key」对话框,预选本智能体,名称缺省「rag_test 调用」。签发后弹现有的明文对话框(只显示一次),关闭后自动选中新 Key。
两个对话框从
views/apikey/ResourceKeys.jsx抽成组件复用,不另写一套。 - 权限:服务端对三种写操作照常核验。签发人才能调整资源;新列表里每个资源都要有管理权限,新加的资源要可用(
resource-grants.ts:357-358)。 调用人在智能体所属团队没有「流程·编辑」时,只显示「已授权」组,三个写操作的入口隐藏。签发人对 Key 里某个旧资源已失去管理权限时,加入会被拒,错误原样提示。 - 同团队其他人签发的 Key 不出现在这里,看不到明文,填不进代码。团队里有编辑权限的人在「API 管理」页列出并吊销这些 Key(方案 2.4)。
- 智能体未发布时下拉框置灰。签发和加入都要求资源可用,未发布的智能体两样都做不了。
图 6 方案:下拉框展开、两个快捷操作、未发布时(只画下拉框与它弹出的对话框)。智能体 rag_test 是真实数据;Key 名、末四位、知识应用名是示例。
3.2 代码页签:Key 放在 Authorization
头字段按方案 2.4 第 12 条已定的纪律:资源 Key 与 SSO 令牌都放 Authorization: Bearer,x-chatv-apikey 只留给老 Key,示例里不再出现。
现有示例末尾「把用户令牌经 Origin-Auth 或 Authorization 透传给工具」的注释只保留 Origin-Auth 一行:Authorization 已经用来放调用凭据。
Python、JavaScript、异步 API、A2A 四个页签按同样的规则改,示意图只画 cURL。
图 7 方案:工作流画布 rag_test 的对话框,cURL 页签,已选中一把 Key(只画对话框)。没选 Key 时那一行写成 -H "Authorization: Bearer <API Key 或 SSO 令牌>"。
3.3 嵌入代码页签:带智能体 Key,写明后果
- 嵌入代码的
data-apikey取下拉框选中的 Key(EmbedChat.jsx:47已有这个属性)。portal 拿它调/prediction,跑已发布版本。 - 提示写明后果:Key 在网页源码里,访客都能拿到;能调用智能体就能用它挂载的全部工具与技能(方案 2.10)。
- 选中的 Key 还授权了智能体以外的资源时,多一条提示,列出资源数。允许这种 Key 用于嵌入,只做提示(第 8 节第 1 条,已定)。
- 没选 Key 时不出代码,只显示「嵌入到第三方网站需要智能体 Key」,以及「签发新 Key」「加入已有 Key」两个入口(同 3.1)。
图 8 方案:嵌入代码页签,选中的 Key 同时授权了一个知识应用(只画对话框)。外观仍在分享页签里配置,嵌入代码不变。
3.4 分享聊天机器人页签:组织内成员、第三方嵌入两档
按方案 2.10 的原写法,页签顶部切换两档,缺省「组织内成员」。下面的链接参数(开场问题、自动发送)与外观配置两档共用,不变。
- 组织内成员:链接不带 Key。打开的人用自己的账号登录,必须是智能体所属团队的成员,跑已发布版本。
portal 现在不带 Key 时跑草稿(
/internal-prediction),要新增一个「跑已发布版本」的链接参数。参数名在 P2 实施清单里与 portal 改动一起定(第 8 节第 3 条),图里的run=published是示例。 - 第三方嵌入:链接带右上角下拉框选中的智能体 Key(3.1),形如
/chatV2/portal?chatflowId=…&embed=chatbot&apikey=…&teamId=…,与embed.js建 iframe 用的地址同一格式(chat-portal/public/embed.js:52-57)。 portal 带 Key 调/prediction,跑已发布版本。这个链接可以直接在浏览器打开,也可以作为 iframe 地址;要弹泡、全屏或 React 写法时用「嵌入代码」页签。 - 第三方嵌入档的提示与 3.3 相同:Key 在链接里,拿到链接的人都能用它调用智能体与它挂载的工具;选中的 Key 还授权了其他资源时多一条提示。没选 Key 时不出链接,提示先选择或签发。
- 智能体未发布时两档都不生成链接,提示先发布。
- 删除「设为公开」开关(
wf_chat_flow.isPublic)与/api/v1/public-chatflows(方案 2.10)。 - 智能体 ID、团队、发布状态由对话框参数传入,不再读画布全局状态,第 1 节的白屏随之消失。
图 9 方案:分享聊天机器人页签的两档,以及没选 Key、未发布两种状态(只画对话框)。rag_test 的 ID 与团队是真实数据,Key 名与 Key 值是示例。「组织内成员」档不用右上角的下拉框。
4. 「API 管理」页
「API 管理」页的改动(新增「智能体」类型、老 Key 折叠为 Legacy、资源选择器、采集点 Key 挪到「代码采集」页、资源上限可配置)见 api-keys-page/redesign.html。 本对话框 3.1 的「签发新 Key」复用那里的「创建 API Key」对话框,跳过选资源一步,资源固定为当前智能体。
5. 被否决的方案
| # | 做法 | 否决原因 |
|---|---|---|
| 1 | 关联存在智能体上:下拉框选资源 Key 写进智能体(沿用 apikeyid 的做法) | 资源 Key 的授权范围存在 Key 上,一把 Key 可以授权多个资源;智能体上再存一份,两处会不一致。资源 Key 是个人凭证,绑到智能体上以后,同团队其他人打开对话框看不到明文,示例代码是坏的 |
| 2 | 分享页签只生成组织内链接,第三方只用嵌入代码页签 | 2026-10-03 用户选择保留方案 2.10 的两档。第三方嵌入档给的是链接本身,可直接打开或作 iframe 地址;嵌入代码页签给的是 embed.js 写法,两处并存,多一个分类不构成问题 |
| 3 | 下拉框列出团队里所有授权了本智能体的 Key | 别人签发的 Key 看不到明文,只能显示掩码,填不进代码。列出与吊销放在 API 管理页(方案 2.4) |
6. 关键取舍
- 关联写在 Key 上,不写在智能体上。 代价:P3 之前智能体调工具仍以绑定的老 Key 的创建人放行,界面上改不了这个身份。以前手动改绑过其他老 Key 的智能体保持原绑定,部署前可在各环境查
wf_chat_flow.apikeyid不是DefaultKey的行数。 - 「加入」扩大已有 Key 的授权范围。 一把已经交给外部系统、甚至写进网页的 Key,在对话框里点一下就多了一个能调的智能体。确认框列出这把 Key 现有的资源,并写明后果,不做额外拦截;只有签发人能操作,与在「API 管理」页「调整资源」相同。
- 组织内链接跑已发布版本。 原来不带 Key 的链接跑草稿,作者在画布上的未发布改动会立刻影响收到链接的人;改后要发布才影响。代价:未发布的智能体不能分享,本机 41 个里 28 个未发布。
- 嵌入接受 Key 进网页(方案 2.10 已定)。界面上用提示写明后果,不做额外拦截。
7. 影响面
| 对象 | 变化 |
|---|---|
views/chatflows/APICodeDialog.jsx | 下拉框分组、选中取明文、「加入」「移出」调 PUT /apikey/resources/:id/resources、「签发新 Key」叠加创建对话框;代码示例的头字段;删「无需授权」提示 |
views/apikey/ResourceKeys.jsx | 「创建资源 Key」对话框与明文对话框抽成组件,API 管理页与 API 对话框共用 |
views/chatflows/ShareChatbot.jsx | 智能体从对话框参数取;删 isPublic 开关与 apikey 参数;加未发布提示 |
views/chatflows/EmbedChat.jsx | data-apikey 取选中的智能体 Key;加两条提示 |
views/canvas/CanvasHeader.jsx、views/agentapps/index.jsx | 传给对话框的参数加发布状态与团队,去掉 chatflowApiKeyId |
views/apikey/(详见 api-keys-page 第 7 节) | 新类型「智能体」;老 Key 表去掉新建与导入。智能体选项用现有 GET /api/v1/chatflows?type=…(按当前团队列出,controllers/chatflows/index.ts:62)取工作流与单智能体,前端过滤已发布、已启用;
「流程·编辑」用现有的 useTeamResourcePermission('flow') 判,矩阵按团队给权限,不按单个智能体,所以不用服务端逐条返回。签发时服务端 canManage 再判一次 |
| 平台服务端 | resource-grants.ts 加类型 agent(agent:invoke),MATRIX_ROW 加 agent: 'flow';资源描述从 wf_chat_flow 读,可用的判据是 publishedVersionId 非空且 isEnabled 不为 0(方案 2.4)。删 /api/v1/public-chatflows |
| chat-portal | ?apikey= 接受 aimp_res_ Key;新增「跑已发布版本」的链接参数 |
8. 已定问题(2026-10-03 用户按推荐确认)
| # | 问题 | 影响 | 结论 | 落实时间 |
|---|---|---|---|---|
| 1 | 智能体能否与知识资源混在一把 Key 里 | 嵌入时整把 Key 暴露在网页里,混进去的知识源推送、代码系统写入权限一起暴露 | 允许混选,与多资源设计一致;嵌入代码页签与分享页签的第三方嵌入档选中这种 Key 时显示提醒(图 8、图 9 第二条提示)。未采用的做法:嵌入时只列只含智能体的 Key,代价是用户要为嵌入单独签一把 | P2 |
| 2 | 单智能体编辑页的三处异常(第 1 节)随 P2 一起修,还是先单独修 | 编辑页上分享页签白屏,代码示例与嵌入代码不能用 | 随 P2 一起修,这几处代码 P2 都要重写。依据:分享页签在每个单智能体的编辑页上都白屏,现在没有人能从这里生成链接,晚修不会打断谁在用的东西。P2 之前如果有人要在编辑页用分享,再单独补「分享页签从对话框参数取智能体」这一处 | P2 |
| 3 | 组织内链接「跑已发布版本」的参数名 | 链接发出去以后格式不好再改;portal 与对话框两边要一致 | 在 P2 实施清单里与 portal 改动一起定 | P2 实施清单 |
9. 下一步
界面部分并入 P2 实施清单,按第 7 节拆提交;「跑已发布版本」的参数名在清单里定。