全部文档

插件应用 SDK(platform-plugin)

把人力资源、仓管、合规管理等专业系统接到应用桌面,用户在工作台里打开完整界面。

来源 sdk/platform-plugin/README.md

目录名sdk/platform-plugin 用途应用型平台插件(应用桌面 iframe)——注册 platform_plugins[]launch_token、知识同步、内嵌助手、plugin_invoke

代码包go/(Go)、js/(TypeScript)、contracts/templates/starter/

对话型能力(消息里调 API、不注册 platform_plugins)见 agent-capability,不在本目录注册流程内。


关联


1. 选型(与 agent-capability 的分工)

只有应用桌面 iframe 型插件才用 platform_plugins[] + 本目录代码包。勿把「识脸、画图、调业务 API」一律注册成应用桌面插件——那类需求见 agent-capability

| | 插件工具(agent-capability) | 插件应用(本目录) | |--|-----------------------------------|------------------------| | 用户场景 | 在 消息 里对工作智能体说话 | 在 应用 桌面打开完整 Web | | 注册 platform_plugins | | | | 文档 | agent-capability | 本文 + sdk/README.md |

1.2 应用型平台插件(示例:组织架构)

  1. mindlink.json 注册 platform_plugins[]entry_base_urlupstream_url 等)。
  2. 用户从 应用桌面 打开;Cadau 签发 launch_token,iframe 加载你的 Web。
  3. 可选:同步 知识文档 供工作区智能体检索;在插件页 内嵌助手(embed widget)。

范例:plugins/hr/(官方人力资源 + 知识同步 + plugin_invoke)。用户说明见 help/product-features/platform-hr.md;插件侧说明见 plugins/hr/README.mdplugins/hr/knowledge/。打开插件时,Cadau 壳上的操作助手使用工作区 默认应用助手(工作智能体);产品界面其它模块仍用帮助智能体。

1.3 既要界面,又要在消息里用上插件能力

可同时组合(当前实现),不是一条 platform_plugins 注册自动搞定全部:

能力路径
界面与人工操作应用型平台插件(本 SDK)
智能体了解插件背景材料插件 知识同步 → 工作区知识 plugin-{module_id}/(§7)
消息里按步骤做插件领域操作插件仓库随发 技能包 → 安装进 工作区技能中心(§7.5);区内智能体默认可召回
消息里智能体调插件外 HTTP APIagent-capability(技能 + 联网能力包)

插件同步的知识会被 对话检索 注入;不会自动把插件 REST 注册为 agent tool,也 不会skills/ 目录自动变成技能中心条目——须按 §7.5 安装。若要在消息里「执行识脸接口」,仍须技能 + http_request(或未来 MCP)。

1.4 决策树

需要应用桌面里的完整 Web 界面?
  ├─ 否 → agent-capability:能力服务 + 技能 + 联网能力包
  └─ 是 → 应用型平台插件:platform_plugins + sdk/platform-plugin/go*
        ├─ 还要背景说明进对话?→ knowledge/ 同步(§7)
        ├─ 还要程序性操作手册?→ skills/ 随发 → 安装到技能中心(§7.5)
        └─ 还要消息里调外部 HTTP API?→ 再加技能 + 联网能力包

2. 分工(应用型平台插件)

做什么
Cadau登录、工作区、应用桌面 iframe 壳、launch_token、会话校验、工作区知识检索、嵌入助手脚本
插件自有 UI、业务 API、数据库;Markdown 真源在插件仓库;按需同步到 Cadau
SDKsdk/README.md — Go/TS 包、API 契约、starter 骨架

Cadau 不提供完整业务 SDK(如组织架构 CRUD);插件自建业务 API,数据键使用 workspace_id无独立登录


3. 接入流程

sequenceDiagram
  participant U as 用户
  participant ML as Cadau
  participant P as 平台插件

  U->>ML: 应用桌面打开插件
  ML->>ML: POST launch → launch_token
  ML->>P: iframe entry_url?launch_token=…
  P->>ML: GET /platform-plugins/session
  P->>P: 可选 SyncKnowledgeFromDir
  P->>ML: POST /platform-plugins/embed-token
  P->>ML: 加载 /embed/mindlink-widget.min.js
  U->>ML: 在插件内与助手对话(含已同步知识)
  1. mindlink.json 注册 platform_plugins[]module_identry_base_urlupstream_url 等)。
  2. 插件入口读取 launch_token,调用 GET /api/v1/platform-plugins/session 验身。
  3. 插件将 knowledge/*.md 同步到 Cadau(见 §5)。
  4. 可选:签发 embed-token,在插件页嵌入 Cadau 助手。

4. SDK 包

第三方开发入口../../../sdk/README.md

路径用途
总览 + 契约 + 骨架sdk/开发者拿到即可开干
Gosdk/platform-plugin/go插件后端:会话、知识同步、中间件、CSP
TypeScriptsdk/platform-plugin/js@mindlink/plugin-sdk插件前端:API 客户端、iframe 会话、挂载嵌入助手
骨架sdk/platform-plugin/templates/starter/复制即用的最小插件
API 契约sdk/platform-plugin/contracts/API.mdREST 明细

范例:plugins/hr/(官方人力资源插件 + 知识同步 + plugin_invoke)。旧组织架构范例已并入该插件。用户说明:help/product-features/platform-hr.md;知识:plugins/hr/knowledge/


5. 工作区数据命名空间(共用 Cadau 库)

官方推荐插件业务数据落在 Cadau 同一数据库,按工作区隔离:

后端隔离方式session 字段
PostgreSQLCREATE SCHEMA ws_<workspace_id>data_namespace.schema
SQLite{RUNTIME_DIR}/workspaces/{id}/plugin_ns.dbdata_namespace.path / dsn
  • Cadau 在 创建工作区launch/session 时幂等 Ensure
  • 插件在 GET /platform-plugins/session 响应中读取 data_namespace,自行迁移业务表。
  • 插件进程需能访问同一 DATABASE_URL(Postgres)或同一主机上的 SQLite 路径(Docker 开发请挂载 RUNTIME_DIR 或改用 Postgres)。

第三方仍可自建独立库(仅 workspace_id 行隔离);与命名空间方案可并存。


6. 智能体操作插件(plugin_invoke

所有平台插件应提供:

  1. operations.json(或配置 operations_url):操作名、描述、mutatesmin_roledangerous、参数 schema。
  2. POST /api/agent/invoke:校验 Cadau 签发的 plugin_invoke 短时 JWT(非 launch_token),执行业务并返回 JSON。

帮助智能体与工作智能体均可调用工具 plugin_invoke(帮助侧仅此工具)。写操作默认 min_role=admindangerous=true 须用户确认后 confirm=true。调用写入 plugin_invoke_audit

6.1 扩展工作流节点(workflow_steps

插件可在同一份 operations.json 中声明 workflow_steps,把领域自动节点挂进流程设计器(仅当该插件已启用时出现在目录中):

{
  "module_id": "compliance",
  "operations": [{ "name": "workflow_load_check_items", "mutates": false, "min_role": "member" }],
  "workflow_steps": [
    {
      "type": "compliance.load_check_items",
      "label": "加载检查标准",
      "description": "从合规检查项读取评分依据",
      "color": "#0891b2",
      "kind": "auto",
      "operation": "workflow_load_check_items",
      "config_hint": "可选 phases;检查项来自流程设置绑定的调查问卷"
    }
  ]
}
字段说明
type步骤 type(建议 {module_id}.{动作}
kind当前仅支持 auto:到达后 InvokeOperation,成功后按 always 前进
operation对应 operations 中的操作名
label / description / color设计器展示

自动节点约定返回:

{ "ok": true, "rubric": [ /* RubricItem[] */ ], "variables": { } }
  • rubric:写入实例评分/上传依据;元素必须符合平台 RubricItem 契约
  • variables:合并进实例变量(扁平键)。
  • ok: false 时可带 error 文案;勿返回形状不合规的清单条目。

实现真值(插件 SDK):字段表与响应约定见 sdk/platform-plugin/contracts/API.md §3.3;Go/TS 类型 RubricItem / WorkflowLoadRubricResult。产品/引擎侧摘要见 workflow.json-v1.md §检查项清单契约

参考实现:plugins/compliance/lib/workflowOps.tstoRubric。其它领域加载节点应输出同一形状,即可直接接核心「上传证据」「自动评分」。

Cadau:GET /workspaces/{id}/workflows/step-catalog 合并核心目录与已启用插件的 workflow_steps


7. 知识文档:真源在插件,检索走 Cadau

与规范库:政府/行业法规、跨插件共用的管理制度与理论真源见产品 §3.2.2规范库.md。本节 API 仅覆盖各插件自己的 操作说明plugin-{module_id}/),不要把法规全文只 sync 进某一插件主题当作全工作区真源。

读规范库(已实现)GET /platform-plugins/standards…/{id}…/{id}/content(Bearer launch_token,仅已发布且生效中);Go Client.ListStandards / JS listStandards

与资料库:共用表格/表单模板见产品 §3.2.3资料库.md

读资料库(已实现)GET /platform-plugins/assets…/{id}…/{id}/file(Bearer launch_token,仅已发布);Go Client.ListAssets / JS listAssets;文件为二进制流。

调用工作区大模型(已实现)POST /platform-plugins/ai/json(Bearer launch_token)→ 用工作区配置的模型返回结构化 JSON 文本;Go Client.AIJSON / JS client.aiJSON;契约见 sdk/platform-plugin/contracts/API.md §2.2.3。

7.1 原则

  • Markdown 文件保存在插件项目(如 knowledge/guide.md),随插件发版。
  • 对话检索仍用 Cadau 工作区知识机制(两层 index.json + 按问题匹配),不改为插件自建向量库。
  • 同步后写入运行时目录 plugin-{module_id}/,并在工作区根 index.json 注册主题;工作区智能体(含插件内嵌助手)对话时自动注入。
  • 插件 sync API 仅同步 Markdown 正文;工作区知识中的图片/短视频等富媒体由 Cadau 产品侧管理,不经 knowledge/sync 上传。

7.2 API(Bearer launch_token

方法路径说明
GET/platform-plugins/knowledge/items列出已同步文档
GET/platform-plugins/knowledge/content?path=读取正文
PUT/platform-plugins/knowledge/content写入正文并更新索引(需 owner/admin)
DELETE/platform-plugins/knowledge/content?path=删除(需 owner/admin)
POST/platform-plugins/knowledge/sync批量同步 { documents: [...] }

Go 便捷方法:

synced, err := mindlinkplugin.SyncKnowledgeFromDir(ctx, client, "./knowledge")

7.3 本地开发可选:卷挂载

同机 Docker 可将插件 knowledge/ 挂载到 Cadau 运行时对应路径,免同步;生产与多机部署仍推荐 API 同步


7.4 工作区大模型(结构化 JSON,非对话)

应用型插件若要在自己的业务 UI里做短时智能(例如根据规范正文生成问卷、按部门职能推荐编制),应调用 Cadau:

POST /api/v1/platform-plugins/ai/json
Authorization: Bearer <launch_token>
  • 模型与密钥:使用当前工作区已配置的大模型;插件直连厂商、不持有 API Key。
  • 入参system + user(提示词);出参:{ "text": "<JSON 字符串>" }
  • 与内嵌助手的区别:§8 的 embed 是用户在插件页里对话;本接口是插件后端一次性结构化生成,无聊天会话。
  • 未配置模型:返回不可用错误;插件应有规则/模板兜底(见 HR / 合规插件)。
  • SDK
const text = await client.aiJSON(
  "你是……只输出 JSON:{\"items\":[...]}",
  JSON.stringify({ context: "…" }),
);
const data = JSON.parse(text);
text, err := client.AIJSON(ctx, system, user)

明细与长度限制(Unicode 字符:system≤3.2 万、user≤40 万)见 sdk/platform-plugin/contracts/API.md §2.2.3。业务侧(如合规问卷)可再设更严的正文合计上限并提示分批。


7.5 插件随发技能(工作区技能中心)

应用型插件除了 knowledge/(背景材料)外,还可在仓库内携带 技能包:教智能体 怎么做 一类插件领域操作(步骤、映射、调用 plugin_invoke / 规范库 / 资料库等)。技能正文契约见 技能组成规范.md

7.5.1 与知识、联网技能的分工

| | 插件知识(§7) | 插件随发技能(本节) | §1.1 联网技能 | |--|-------------------|-------------------------|-------------------| | 用户说法 | 操作说明、领域背景 | 可复现的操作手册 | 调外部 HTTP API 的手册 | | 仓库位置 | knowledge/*.md | skills/{slug}/SKILL.md(+ references/ 等) | 任意;常只在技能中心维护 | | 进入工作区 | knowledge/syncplugin-{module_id}/ | 安装进技能中心(按 slug 幂等) | 手工创建 / 导入 / 目录安装 | | 对话用法 | 检索注入背景 | 触发说明召回 / @技能 | 同左 + http_request |

7.5.2 仓库目录约定

plugins/{module_id}/
  knowledge/                 # §7 同步
  skills/
    {slug}/
      SKILL.md               # 必填:frontmatter name/description + 操作正文
      references/            # 可选:长说明、列映射、样例指针
        seed-fingerprint.txt # 推荐:内容指纹,供升级比对
  samples/                   # 可选:与技能对照的样板文件(不必进技能 zip)
  • slug:稳定标识(小写连字符),安装与升级均按此幂等,勿随意改名。
  • 作者镜像:插件仓内 skills/ 便于发版与评审;运行时真源可以是 Cadau 后端嵌入包(官方插件常用),或与仓内目录保持字节级同步。
  • 不要把技能正文只放进 knowledge/ 指望同步——知识检索 不会替代技能中心召回。

7.5.3 安装与升级(必守产品口径)

  1. 作用域:安装目标是 工作区技能中心;区内智能体 默认可召回
  2. 禁止:静默把技能写进某一只智能体的「可用技能」收窄列表;勿在文案里引导「绑定到某某智能体」作为安装步骤。
  3. 首次安装:建议在用户 打开该插件(应用桌面进入模块)时,由 可管理成员 确认后再 seed;「暂不」只跳过提示,不妨碍日后再次提示或升级。
  4. 内容升级:用内容指纹(如 references/seed-fingerprint.txt)比对;已安装且指纹落后时,再次打开插件可 静默升级 技能正文与附属文件(无需清浏览器、无需重装)。
  5. 权限:seed / 升级须工作区 可管理成员;普通成员可打开插件,但不替全区装技能。

7.5.4 宿主侧接口(通用)

用户登录鉴权(与 launch 同属 §1 用户态;不是 launch_token):

方法路径说明
GET/workspaces/{id}/platform-plugins/{moduleId}/skills该模块已注册随发技能列表 + 安装/升级状态、can_manage_members
POST/workspaces/{id}/platform-plugins/{moduleId}/skills/seed安装或按指纹升级;body 可选 { "slug" },省略则处理该模块全部

后端注册:官方插件在 initskillfromchat.RegisterPluginSkillBundle(...),将 skills/{slug}/ 嵌入 backend/internal/skillfromchat/bundled/。首期范例:module_id=compliancepractice-checklist-to-pack

响应与字段见 sdk/platform-plugin/contracts/API.md §1.3;机制稿 合规实践检查表转机读包.md

第三方插件在未把包嵌入 Cadau 前,可:

  • 提供可下载的技能 zip,引导管理员用技能中心 导入;或
  • 向 Cadau 发版侧贡献 embed 注册(与合规相同路径)。

7.5.5 检查清单

  • [ ] skills/{slug}/SKILL.md 含清晰 适用 / 不适用 触发说明
  • [ ] 稳定 slug;升级靠内容指纹,不靠改 slug
  • [ ] 打开插件时:未装 → 确认安装;已装落后 → 静默升级
  • [ ] 成功文案写「技能中心 / 区内智能体可召回」,不写「已绑定某智能体」
  • [ ] 与 knowledge/plugin_invoke、规范库/资料库只读 API 的职责不混用

8. 插件内智能体问答

  1. 在工作区创建或选择 「我的智能体」,记下 user_agent_id
  2. 插件调用 POST /platform-plugins/embed-token(body:user_agent_id)。
  3. 前端加载 {Cadau 站点}/embed/mindlink-widget.min.js,传入 auth.tokenworkspace_iduser_agent_id(见 host-embed/SDK契约.md)。

助手会使用 工作区知识(含已同步的插件知识),无需插件自行实现 RAG。


9. 安全与 CSP

  • 插件响应需设置 frame-ancestors,允许 Cadau Web 源 iframe 嵌入(如 http://localhost:8080)。
  • launch_token 有效期约 15 分钟;Cadau 壳在过期前约 2 分钟会静默重新签发,并向 iframe postMessage { type: "mindlink:launch_token", launch_token, expires_at }(同时刷新网关 Cookie)。插件须写入 sessionStorage(见 JS SDK listenHostLaunchToken),用户无需退回应用桌面。
  • 若宿主登录已失效或续签失败,插件 API 会 401,此时再从应用桌面重新打开。
  • 知识写入限 工作区 owner/admin(与插件业务「可管理」角色一致)。
  • 智能体写操作走 plugin_invoke JWT + min_role / dangerous 确认,并记入审计表。

9.1 跟随宿主主题

Cadau Web 打开平台插件时:

  1. 在入口 URL 附加 ?theme=light|dark(已解析「系统」模式后的生效主题)。
  2. 宿主主题变化时向 iframe postMessage
{ "source": "mindlink", "type": "mindlink:theme", "theme": "dark" }

插件应设置 document.documentElement.dataset.theme,并用与宿主一致的 CSS 变量(见 client/web--bg / --card / --primary 等)。官方范例:plugins/hr/app/HostThemeSync.tsx

宿主还会在启动令牌即将过期时推送:

{ "source": "mindlink", "type": "mindlink:launch_token", "launch_token": "…", "expires_at": "…" }

插件须更新本地存的启动令牌(listenHostLaunchToken / sessionStorage),否则带旧 Bearer 的请求会先于新 Cookie 被拒。

热重载或 API 401 时,插件可主动请求续签(source 必须为 mindlink-plugin):

{ "source": "mindlink-plugin", "type": "mindlink:request_launch_token" }

JS SDK:requestHostLaunchToken()。宿主还会推送:

type说明
mindlink:plugin_tab{ tab } — 帮助深链等切换插件内页签(listenHostPluginTab
mindlink:plugin_data_changed{ module_id?, operation? } — 建议刷新列表(listenHostPluginDataChanged

Cookie / 存储勿混用:网关 Cookie ml_plugin_gw、插件 origin Cookie ml_plugin_launch、前端 sessionStorageml_plugin_launch_token(见 sdk/platform-plugin/contracts/API.md §3.2)。


10. 本地联调

deploy/plugin-dev-platform/README.md(Cadau Docker 8080/8082)与 plugins/hr/README.md

典型步骤:

  1. 启动 Cadau Docker 栈。
  2. plugins/hr 配置 .env(含可选 MINDLINK_USER_AGENT_IDMINDLINK_DATABASE_URL / MINDLINK_JWT_SECRET)。
  3. run.cmd 启动插件(本机 3011,经 Cadau /p/hr/ 反代)。
  4. 8080 登录 → 工作区 → 应用 → 打开 人力资源 → 同步知识 → 使用内嵌助手或对话中 plugin_invoke

插件网关(推荐)

配置项说明
entry_base_url浏览器 iframe 入口,推荐 /p/{module_id}/
upstream_url插件内网地址(如 http://127.0.0.1:3011);把插件端口直接暴露公网
operations_url可选;缺省为 {upstream}/operations.json
实现backend/internal/platformplugin/proxy.go;Web Nginx location /p/ → 后端

公网鉴权(C+D)

路径网关要求
静态资源 / 入口页有效 launch_token:URL query(仅首屏)、网关 Cookie ml_plugin_gw,或 Authorization: Bearer
/p/{module_id}/api/*必须 Cookie 或 Bearer;禁止仅靠 query(防日志泄露)
LaunchPOST …/launch 响应写入 Path=/p/{module_id}/ 的 HttpOnly Cookie

插件前端调用自有 API 须用 相对路径 或 JS SDK 的 resolvePluginAPI() + createAuthorizedFetch()(自动带 Bearer 与 credentials: "include")。


11. 实现对照

用户说法实现
启动令牌JWT plugin_launchauthx/plugin_launch.go
智能体调用令牌JWT plugin_invokeauthx/plugin_invoke.go;工具 plugin_invoke
工作区数据命名空间workspacens.Ensure;表 workspace_data_namespaces
插件入口网关/p/{module_id}/upstream_url;网关 Cookie ml_plugin_gw + API 须 Bearer/Cookie(platformplugin/proxy.gogateway_auth.go
插件知识目录{RuntimeDir}/workspaces/{id}/knowledge/plugin-{module_id}/
索引维护platformplugin/knowledge.goUpsertPluginKnowledgeDocument
嵌入令牌POST /user-agents/{id}/embed-token 相同登记逻辑,经 platform-plugins/embed-token 签发
官方 HR 插件plugins/hr/(README + knowledge/;用户帮助 help/product-features/platform-hr*.md
插件随发技能plugins/{module}/skills/{slug}/ → 工作区技能中心;范例 plugins/compliance/skills/practice-checklist-to-pack/(§7.5)