全部文档

传软嵌入 SDK(host-embed)

- 出现右下角(或页面内嵌)的 对话助手,与 Cadau 里配置好的 我的智能体 对话;

来源 sdk/host-embed/README.md

目录名sdk/host-embed 用途:第三方在自有业务系统中接入 Cadau 嵌入助手的完整文档包(可整体交付)。

交付说明:本目录(sdk/host-embed/)为第三方接入的 主文档包(总览、契约、网站集成、知识撰写、HR 对照、传软增强)。将本目录交给集成方即可开始对接;可运行全栈范例与部分机制真值仍在仓库其他路径(见下文链接),单独拷贝本目录时那些链接会失效。

适用对象:在自有业务系统(ERP、OA、行业 SaaS 等)中接入 Cadau 对话助手的 第三方团队——包括业务管理员、后端与前端开发、运维。

读完本文你能:在宿主页面挂上助手、按用户分配不同智能体、让助手在回答中引导用户打开业务页面,并确认登录用户之间互看不到对方的历史会话、人工客服与工单。

技术契约(字段、SSE、错误码)见 SDK契约.md(V1.5.12);前端复制即用说明见 网站集成说明.mdA 路径静态范例 examples/cadau-embed-site/B 路径全栈范例 examples/hr-multi-tenant/参考范例-HR接入指南.md

并列 SDKappsdk · platform-plugin · agent-capability · 本目录。 · 总览 sdk/README.md

注意:浏览器加载的脚本路径仍是站点上的 /embed/mindlink-widget.min.js(HTTP 路由,与本文档目录名无关)。


本目录文档一览

文档说明
README.md(本文)第三方接入总览与实施路线
SDK契约.mdTypeScript 类型、SSE、错误码、已交付能力表
网站集成说明.md宿主页 init、环境变量、功能导航(可交给前端同事)
宿主知识文档撰写要求.md智能体知识文档与功能导航写法
参考范例-HR接入指南.mdHR 多租户范例的 API、表结构、配置详解
宿主LLM服务.md宿主服务端请指定智能体代答(替代直连大模型)
宿主增强-AgentRun与数据权限.md传软用户模型、工作区划分、数据连接行/字段策略

1. 你能得到什么

你的业务页面 中:

  • 出现右下角(或页面内嵌)的 对话助手,与 Cadau 里配置好的 我的智能体 对话;
  • 对话走 Cadau 服务端,便于 权限、审计与随时收回访问
  • 助手可在回答里给出 可点击的导航链接,用户一点即可打开你系统里的对应页面并带上筛选条件(如「待审批订单」「某员工档案」);
  • 用户说「帮我打开某某页」时,挂件可在回答完成后 自动执行 第一条已登记的导航(可关闭,见 §8.3)。
  • (可选)宿主 服务端 也可请指定智能体代答(审批摘要、按部门建议岗位等,用户不必看见挂件),见 宿主LLM服务.md

Cadau 不负责:你的登录用户体系、业务权限、业务数据库。用户是谁、能看哪些菜单,仍由 宿主系统 决定。


2. 谁做什么

flowchart LR
  subgraph ML["Cadau(智能体提供方)"]
    UA["配置智能体与知识"]
    ET["签发嵌入访问凭证"]
    CHAT["对话与检索"]
  end

  subgraph Host["第三方宿主(你的系统)"]
    ADM["登记智能体、分配用户"]
    BFF["服务端代签凭证"]
    UI["业务页 + 对话挂件"]
  end

  ADM --> BFF
  BFF -->|"集成账号"| ET
  UI -->|"短期凭证"| CHAT
  UA --> CHAT
角色负责不负责
Cadau 管理员创建智能体、挂载知识文档、确定应用标识、提供对外地址、(生产)准备集成专用账号宿主业务用户、宿主菜单权限
宿主管理员在宿主后台 登记 要接入的智能体 ID、按登录用户分配 助手与操作范围在 Cadau 里为每个终端用户点「生成令牌」
宿主开发嵌入会话接口、页面挂载挂件、功能导航白名单、网络代理在浏览器里写 Cadau 密码或长期凭证
终端用户在业务页里与助手对话登录 Cadau 主站(嵌入场景不需要)

3. 两种接入方式怎么选

A:网站公开客服B:宿主业务系统
典型场景官网 / 落地页客服助手ERP、OA、行业 SaaS 内嵌助手
宿主配置Cadau 站点 URL、智能体 ID、网站嵌入令牌登记/分配 + 服务端代签 + 须传当前登录用户身份host_actor
是否要宿主后端(至少「嵌入会话」一类接口)
每人不同智能体通常全站共用一条配置可以(按登录用户分配)
是否要在 Cadau 点「生成令牌」(令牌可短期或长期,可收回)生产由后端代签;界面生成多用于联调
转人工挂件内「人工客服」(须开启且有人上班)与「提交工单」同一套挂件,不必自建客服后台;Cadau 侧用本区席位或 客服小组 接单,见 参考范例-HR接入指南.md §10.4
谁能看见对话 / 客服 / 工单同一浏览器里的网站访客(未登录)当前登录用户本人(须传 host_actor);甲看不到乙的
Cadau 工作区由嵌入令牌决定(通常全站一条智能体)本期:整套宿主共用 一个 工作区。一租户一区见 宿主增强-AgentRun与数据权限.md §0.3,暂不实现

建议

代签(B):宿主服务端用 Cadau 集成账号 调用 POST /api/v1/user-agents/{智能体ID}/embed-token,拿到短期嵌入凭证后交给浏览器;终端用户 登录 Cadau 主站。


4. Cadau 侧准备(智能体负责人)

在改造宿主之前,在 Cadau 完成下表(可与宿主方对齐后执行):

步骤操作产出
1登录 Cadau,进入目标 工作区工作区 ID
2我的智能体 → 新建或选定助手,挂载 知识文档(业务说明、可跳转页面清单)智能体 ID(UUID)
3与宿主约定 应用标识 app_id(如 your-corp-hrmindlink-embed全局唯一字符串,区分不同接入方
4B 路径)准备 集成专用 Cadau 账号(邮箱或手机号 + 密码)仅服务端保存
5将集成账号 加入 智能体所在工作区(不必拥有该智能体)代签前可切换进该工作区
6确认对外地址:挂件脚本、API 前缀见下表
典型路径
挂件脚本https://<你的 Cadau 域名>/embed/mindlink-widget.min.js
接口前缀https://<你的 Cadau 域名>/api/v1

B 路径不需要在 Cadau 界面为每个宿主用户重复「生成令牌」;宿主后端代签与界面按钮调用的是 同一套 API

(A 路径必做) 在该助手 管理 → 网站嵌入 生成令牌;页面只需 站点 URL + 智能体 ID + 令牌(不必填工作区 ID)。若需挂件 「人工客服」「提交工单」,在同一智能体的 人工客服 中开启,并指定本区座席 授权客服小组(无人上班时只保留提交工单)。完整说明可在该页 复制网站集成说明


5. 宿主侧:管理人员要做什么

你的管理后台(或运维脚本)完成:

5.1 登记接入的智能体

为每条要接入的 Cadau 智能体建一条登记,只存智能体 ID,不存嵌入令牌

字段说明
显示名称管理员与用户看到的名字
Cadau 智能体 ID§4 步骤 2 的 UUID
应用标识与 Cadau、代签请求一致;可默认全局配置
工作区 ID本期与 MINDLINK_WORKSPACE_ID同一个 Cadau 工作区(整套宿主共用一区)。一租户一区见 宿主增强-AgentRun与数据权限.md §0.3,暂不实现

(可选)生成/分析用智能体:宿主服务端代跑「建议岗位」等任务时,指定 另一条 已在 Cadau 配好的智能体——写在 .envMINDLINK_GENERATE_USER_AGENT_ID,或管理页「嵌入助手登记」里选定(覆盖环境变量)。不是右下角对话助手。见 宿主LLM服务.md §5.1。

5.2 按登录用户分配

  • 分配主体是 宿主登录用户(手机号/工号对应的账号),不是业务档案里的员工 ID(除非二者合一)。
  • 为每个用户选择:使用哪条登记记录、具备哪些 操作范围(如仅查询、是否允许新增/编辑/删除——由宿主自定义枚举)。
  • 未分配的用户:业务页 不展示 助手,或嵌入会话接口返回「暂无助手」。

HR 多租户范例:侧栏 用户管理接入的智能体 / 配置智能体;详见 参考范例-HR接入指南.md §8。


6. 宿主侧:开发人员改造清单

6.1 数据层(B 路径)

至少两张表(表名可自定):

  1. 登记接入智能体(§5.1 字段)
  2. 用户智能体分配(租户 + 用户 → 登记记录 + 权限范围)

6.2 嵌入会话接口(B 路径核心)

提供类似接口(路径可自定,语义保持一致):

GET /api/v1/.../me/embed-session
Authorization: Bearer <宿主登录凭证>

服务端逻辑

  1. 校验宿主用户已登录;
  2. 查该用户是否有 有效分配
  3. 无分配 → 返回 200,body 含 available: false 与原因(勿用 404,避免浏览器误报);
  4. 有分配 → 用集成账号 登录 Cadau切换工作区 → 调用

POST /api/v1/user-agents/{智能体ID}/embed-token body 示例:{ "app_id": "your-app", "ttl_seconds": 3600 }

  1. 将下列字段返回给前端(字段名可与范例一致):
返回字段用途
access_token挂件 auth.token
expires_at挂件 auth.expires_at(ISO 8601)
user_agent_id智能体 ID
workspace_id工作区 ID
app_id应用标识
host_actor当前登录用户身份 → init.host_actor(B 路径历史会话 / 人工客服 / 工单按此人隔离;传软查数也用)
widget_script浏览器加载的脚本 URL
api_base_url浏览器调 Cadau 的 API 前缀(宜与页面 同源,见 §6.4)

集成账号密码、Cadau 对内地址 仅放服务端环境变量,不得提交前端仓库。

Cadau 代签顺序(服务端调用,非浏览器):

POST /api/v1/auth/login
POST /api/v1/workspaces/{workspaceId}/switch
POST /api/v1/user-agents/{userAgentId}/embed-token

6.3 前端挂载挂件

  1. 用户进入需要助手的业务页;
  2. (B)带宿主登录凭证请求嵌入会话;或(A)读静态配置;
  3. 动态加载 widget_script
  4. 初始化:
<script src="https://<Cadau 域名>/embed/mindlink-widget.min.js"></script>
<script>
  const widget = window.MindLinkWidget.init({
    app_id: "your-app-id",
    api_base_url: "https://<对外 API 前缀>/api/v1",
    user_agent_id: "<智能体 UUID>",
    workspace_id: "<工作区 UUID>",
    auth: {
      token: "<嵌入 access_token>",
      expires_at: "<ISO 8601>"
    },
    // B 路径必传:与 embed-session 下发的 host_actor 一致(历史/客服/工单隔离;传软查数)
    // 挂件会自动带 X-Host-External-User-Id,宿主页不必再设请求头
    host_actor: { external_user_id: "…", actor_kind: "employee" },
    theme: "auto",
    position: "bottom-right",
    locale: "zh-CN",
    entry: {
      auto_open: false,
      auto_execute_navigation: true
    }
  });

  widget.on("action", function (ev) {
    if (ev.type !== "action") return;
    handleHostNavigation(ev.action);
  });
</script>
  1. 凭证将过期时:由后端重新代签,再 widget.updateAuth({ token, expires_at });换登录用户时 widget.updateHostActor(hostActor)(或重新 init)。

行内嵌入position: "inline" + container: "#你的容器选择器"Web Component:见 网站集成说明.md §4.1。

参考代码(在 Cadau 仓库中,非本目录交付物):

  • HR 范例挂载:examples/hr-multi-tenant/web/src/mindlinkOrgEmbed.ts
  • HR 范例导航:examples/hr-multi-tenant/web/src/mindlinkHostActions.ts

6.4 网络与安全

要求说明
浏览器访问 Cadau生产建议 同域反向代理(如 https://你的域名/mindlink-api/v1),或配置 CORS
勿混用主机名开发时勿 localhost127.0.0.1 混用,易触发跨源失败
凭证不进仓库生产禁止长期令牌写在 .env 提交 Git;A 路径仅限 dev
收回访问该助手 管理 → 网站嵌入 可收回登记;收回后 API 返回 embed_token_revoked

服务端环境变量示例(B 路径):

MINDLINK_API_BASE=https://mindlink.internal/api/v1
MINDLINK_API_BASE_PUBLIC=https://your-host.com/mindlink-api/v1
MINDLINK_WIDGET_SCRIPT=https://mindlink.internal/embed/mindlink-widget.min.js
MINDLINK_INTEGRATION_EMAIL=integration@your-corp.com
MINDLINK_INTEGRATION_PHONE=
MINDLINK_INTEGRATION_PASSWORD=<仅服务端>
MINDLINK_APP_ID=your-corp-app
MINDLINK_WORKSPACE_ID=<整套宿主共用的工作区 UUID>
MINDLINK_GENERATE_USER_AGENT_ID=<可选:生成/分析用智能体 UUID>

嵌入令牌有效期、挂件是否行内等有代码默认值,不必写入 .env。集成账号可用 邮箱或手机号 二选一登录 Cadau(与 HR 范例 server/.env 一致)。


7. 功能导航:让助手带你打开业务页

7.1 机制

  1. 在智能体 知识文档 中约定:需要跳转时使用 Markdown 链接 + 协议 mindlink://action/
  2. 用户点击链接(或开启自动导航时由挂件触发)→ 宿主页收到 action 事件;
  3. 宿主页 白名单 解析动作名与参数,跳转路由或打开抽屉。

7.2 链接写法(写进知识文档)

`打开待审批订单`
`查看组织架构`
  • 动作名:你在宿主页注册的业务动作,建议 page.<模块>
  • 查询参数:原样传给宿主页(statusidlabel 等);label 可仅用于展示。

7.3 宿主页白名单(必做)

const HOST_ACTIONS = {
  "page.orders": (params) => {
    app.navigate("/orders", { status: params.status || "" });
  },
  "page.org": (params) => {
    app.navigate("/org", { tab: params.tab || "tree" });
  },
};

function executeHostAction(action, params) {
  const fn = HOST_ACTIONS[action];
  if (!fn) {
    app.toast("暂不支持该导航");
    return;
  }
  fn(params);
}

禁止执行 javascript: 等不安全协议;未知动作提示「暂不支持」。

7.4 自动导航

entry.auto_execute_navigation 默认为 true:用户明确说「帮我打开 / 跳转…」时,回答流式结束后自动执行正文中 首条宿主可执行的 mindlink://action/ 链接(与点击过滤一致)。若只希望手动点击,设为 false

知识文档须写清:用户要求打开页面时,回答末尾应给出 1~3 条登记链接,且第一条宿主可执行链接为最相关目标。

撰写规范:宿主知识文档撰写要求.md


8. 推荐实施顺序

阶段目标要点
一、验证挂件(1~2 天)任意页面能对话A 路径或 HR 范例 smoke:embed;确认脚本与 API 可达
二、BFF + 分配按用户挂不同助手建表、嵌入会话、管理界面、前端改拉会话再 init
三、传软增强(可选)服务端请智能体代答、业务库行字段隔离宿主LLM服务.md宿主增强-AgentRun与数据权限.md
四、生产可运维、可审计专用集成账号、短有效期、HTTPS、知识文档、§10 验收

8.1 自动化冒烟(HR 范例)

冒烟测试是用脚本按真实 API 顺序做的 最小联调检查:不打开浏览器,任一步失败即报错,用于改配置或发版后快速确认「能不能测」。

examples/hr-multi-tenant/web 目录(需 Cadau :8080 与 HR 后端 :18089 已启动,server/.env 已配 MINDLINK_*):

命令检查什么
npm run smoke:embed嵌入链路:Cadau 挂件脚本 → HR 登录 → embed-session → 用嵌入令牌访问 Cadau 会话/聊天
npm run smoke:host-agent传软增强:mindlink-access-policy 编译、embed-session 含正确 host_actor(管理员/主管/员工)、agent-run 会话隔离

不能替代完整验收:SQLite 数据连接、access policy 写入、界面体验等仍须手工核对(HR 范例见仓库 examples/hr-multi-tenant/docs/ACCEPTANCE_HOST_LEGACY.md)。

8.2 本地联调 HR 范例

# 见 examples/hr-multi-tenant/README.md
cd examples/hr-multi-tenant/web
npm run setup:mindlink    # 自动注册集成账号并写入 ../server/.env
cd ../server && go run ./cmd/hrms-server   # 另开终端
cd ../web && npm run dev
# 浏览器 http://localhost:5180 ;演示登录 13800138000 / Demo-HR-2026
npm run smoke:embed         # 可选:嵌入冒烟
npm run smoke:host-agent    # 可选:传软增强冒烟

将已有 Cadau 智能体接入 HR 范例登记:

cd examples/hr-multi-tenant/web
npm run link:mindlink-agent -- <MindLink智能体UUID>

注意link:mindlink-agent 默认读写本地 SQLite backend/mindlink.db。若 Cadau 主库为 Postgres(常见本地开发配置),请在 Cadau UI 将集成账号邀请进工作区,并核对登记表 mindlink_workspace_id;或重新运行 setup:mindlink


9. 运行观测:智能体主人如何看嵌入对话

嵌入对话记在 代签用的 Cadau 身份 下,不会出现在该身份个人「消息」列表里。

智能体归属人在 Cadau 主站:

  1. 我的智能体 → 运行记录
  2. 左侧选择对应助手;
  3. 来源选 嵌入(可按 应用标识 筛选);
  4. 点击会话 只读查看 对话内容。

从智能体 管理 → 概览 可点 查看运行记录 直达该助手嵌入记录。


10. 联调与验收清单

Cadau

  • [ ] 智能体已创建,知识文档已挂载(含可跳转页面清单)
  • [ ] app_id 与宿主一致
  • [ ] B:集成账号可登录、已加入智能体工作区,能成功代签
  • [ ] 登记表中的工作区 ID 与智能体实际工作区一致(本期整套宿主共用一个 Cadau 工作区)
  • [ ] (可选)该智能体已开启 人工客服(本区席位或授权客服小组);覆盖该区的客服已 上班;挂件出现「人工客服 / 提交工单」

宿主后端

  • [ ] 登记、分配接口可用
  • [ ] 已分配用户:嵌入会话返回 available: trueaccess_token
  • [ ] 未分配用户:返回 available: false(HTTP 200)
  • [ ] 集成密码未出现在前端或公开仓库

宿主前端

  • [ ] 登录后出现助手,能流式对话
  • [ ] 不同用户分配不同智能体时,对话身份正确(B)
  • [ ] (B)init 已传入 host_actor;两名登录用户互看不到对方的历史会话、人工客服与工单
  • [ ] (A)两名网站访客互看不到对方的历史会话、人工客服与工单(换浏览器或清站点数据即新访客)
  • [ ] 两名访客可同时提问并各自收到回复;过载时挂件提示「当前对话人数已达上限,请稍后再试」
  • [ ] 凭证过期前可 updateAuth 或重新进入页面续签
  • [ ] (可选)回答内导航链接可跳转;自动导航符合预期
  • [ ] 未知导航有友好提示

传软增强(若接入 Host Agent Run / 业务库查数)

  • [ ] 宿主 BFF 在 embed-session / agent-run 中携带完整 host_actor
  • [ ] 工作区数据连接已配置,access_policy_json 已写入
  • [ ] 员工自助仅本人行;主管/管理员范围符合预期;不同用户会话不串话
  • [ ] (可选)npm run smoke:host-agent 通过

安全与运维

  • [ ] 生产以 B 为主;A 仅 dev
  • [ ] Cadau API 经同域代理或合规 CORS
  • [ ] 集成账号轮换、令牌收回流程已文档化
  • [ ] 生产使用 自建 集成账号,非 HR 范例演示邮箱

11. 常见问题

现象排查
挂件不出现未分配、嵌入会话 503、网络/CORS、api_base_url 与页面不同源
嵌入会话 502集成账号未加入工作区;智能体 ID 错误;app_id 不一致;工作区 ID 配错
能打开助手但对话失败user_agent_id / app_id / 工作区与代签时不一致;凭证过期
embed_token_revokedCadau 侧已收回登记,需重新代签
unauthorized凭证无效或过期,调用 updateAuth 或重新拉嵌入会话
A/B 行为不一致对齐同一智能体 ID 与知识文档
换账号仍看到上一用户的历史 / 客服 / 工单B 路径须把当前登录用户身份传入 init.host_actor;换用户后 updateHostActor 或重新 init。同一浏览器里的未登录网站访客按浏览器隔离,不按账号
嵌入对话在 Cadau「消息」里看不到正常;归属人请到 运行记录 → 嵌入 查看
是否每个智能体要在 Cadau 各点一次「生成令牌」(B 路径);登记 ID,代签时现换
宿主服务端还要自己接大模型吗不必。请指定智能体代答,见 宿主LLM服务.md

12. 文档索引(本目录)

资源说明
网站集成说明.md宿主页 init、环境变量、导航示例(可交给前端同事)
SDK契约.mdTypeScript 类型、SSE、错误码、已交付能力表
宿主知识文档撰写要求.md知识文档与功能导航写法(含 mindlink://action/
参考范例-HR接入指南.mdHR 范例 API、表结构、配置项详解
宿主LLM服务.md宿主服务端请指定智能体代答
宿主增强-AgentRun与数据权限.md传软用户模型、新传软检查单、数据连接策略
Cadau UI该助手 管理 → 网站嵌入(生成说明、令牌登记与收回)

13. 维护信息

文档类型第三方宿主接入总览
对齐契约SDK契约.md V1.5.12
参考范例examples/hr-multi-tenant(仓库内,非本目录交付物)
更新2026-08-17(文档与实现对齐:契约版本、相对路径、同时回复上限语义、下一步芯片)