全部文档

平台插件 REST API 契约

插件应用与 Cadau 之间的接口约定,给对接团队查阅。

来源 sdk/platform-plugin/contracts/API.md

Base URL{Cadau 站点}/api/v1 版本:0.1(与 Cadau 后端 platform_plugin_*.go 一致)

适用范围:下文 REST 与 platform_plugins[] 注册仅用于 应用桌面 iframe 型插件。对话里让工作智能体调业务 API(识脸、画图等)请用 技能 + 联网能力包,见 ../../agent-capability/README.md../README.md


0. 注册与插件网关

在 Cadau mindlink.jsonplatform_plugins[] 注册(示例 registration.example.json):

{
  "module_id": "my-plugin",
  "display_name": "我的插件",
  "entry_base_url": "/p/my-plugin/",
  "upstream_url": "http://127.0.0.1:3010",
  "enabled": true
}
字段说明
module_id唯一标识;网关路径为 /p/{module_id}/
entry_base_urlLaunch 拼 launch_token 后给 iframe;推荐同源 /p/{module_id}/
upstream_url可选;Cadau 将 /p/{module_id}/* 反代到此内网地址
enabledfalse 时桌面不展示

网关请求路径(浏览器 → Cadau Web → 后端 → upstream):

GET /p/my-plugin/api/health

→ 反代到 {upstream_url}/api/health(路径前缀 /p/my-plugin 会被剥掉)。

无 upstream 时:仅 entry_base_url 指向你的公网/独立 URL,Cadau 不代理静态页与插件 API。

实现对照:backend/internal/platformplugin/proxy.go;Web Nginx location /p/ → 后端。


1. Cadau 侧(用户已登录)

1.1 列出已注册插件

GET /platform-plugins
Authorization: Bearer {用户 access_token}

响应 items[]module_id, display_name, suite, icon, entry_base_url, enabled(内网 upstream_url 不返回给客户端)

1.2 启动插件

POST /workspaces/{workspace_id}/platform-plugins/{module_id}/launch
Authorization: Bearer {用户 access_token}

响应:

字段说明
module_id插件标识
display_name展示名
launch_token插件用 JWT,约 15 分钟有效;Cadau 壳在过期前静默续签并向 iframe 推送
entry_urliframe 入口,已附带 launch_tokenworkspace_id 查询参数
expires_atISO 8601
api_base_url相对站点的 API 前缀,通常为 /api/v1
workspace_id当前工作区
member_roleowner / admin / member
data_namespace工作区插件数据隔离(与 session 同结构)

1.3 插件随发技能(安装到工作区技能中心)

应用型插件可在仓库携带 skills/{slug}/(见 platform-plugin §7.5)。安装进 工作区技能中心 使用 用户登录 鉴权,不是 launch_token

产品口径:按 slug 幂等写入技能中心;区内智能体默认可召回;不要在 seed 时改写各智能体的可用技能收窄配置。

GET /workspaces/{workspace_id}/platform-plugins/{module_id}/skills
Authorization: Bearer {用户 access_token}

响应:

字段说明
module_id插件标识
skills[]sluginstalledup_to_dateneeds_updateskill_idnamebundle_fingerprintinstalled_fingerprint
any_missing是否存在未安装项
any_needs_update是否存在已装但指纹落后项
can_manage_members当前用户是否可 seed

无已注册随发技能时返回 skills: [](仍 200)。

POST /workspaces/{workspace_id}/platform-plugins/{module_id}/skills/seed
Authorization: Bearer {用户 access_token}
Content-Type: application/json

{ "slug": "practice-checklist-to-pack" }
  • 可管理成员
  • slug 可选;省略则安装/升级该模块全部已注册随发技能。
  • 响应:{ "ok": true, "module_id", "results": [ { slug, created, upgraded, skipped, skill_id, name, fingerprint } ] }
  • 未知 module_id/slug(无注册包)→ 404

实现:backend/internal/skillfromchat/plugin_skill_seed.goRegisterPluginSkillBundle);合规注册见同包 compliance_practice_seed.go;作者镜像:plugins/compliance/skills/


2. 插件侧(Bearer launch_token

以下接口 无需 Cadau 用户 Cookie,仅需:

Authorization: Bearer {launch_token}

2.1 校验会话

GET /platform-plugins/session

响应:

{
  "module_id": "my-plugin",
  "module_display_name": "我的插件",
  "user_id": "uuid",
  "user_display_name": "张三",
  "workspace_id": "uuid",
  "workspace_name": "研发团队",
  "member_role": "admin",
  "expires_at": "2026-07-02T10:00:00Z",
  "data_namespace": {
    "kind": "postgres_schema",
    "location": "ws_…",
    "schema": "ws_…"
  }
}

data_namespace:工作区插件数据隔离(Postgres schema 或 SQLite 文件路径/DSN)。Launch 响应同样包含该字段。

智能体调用插件:工具 plugin_invoke → Cadau 签发短时 JWT(knd=plugin_invoke)→ 插件 POST /api/agent/invoke。操作清单见插件 operations.json(或配置 operations_url)。

错误码:plugin_launch_invalid(过期或无效)、plugin_disabledforbidden

2.1.1 工作区成员(绑定账号用)

GET /platform-plugins/workspace-members

Bearer launch_token。返回当前工作区成员简表(user_iddisplay_nameemailmember_role),供插件绑定员工档案、任命插件内角色。任意工作区成员可读。

2.2 知识文档

路径均相对于插件主题目录 plugin-{module_id}/(Cadau 自动维护索引)。

列出

GET /platform-plugins/knowledge/items

读取

GET /platform-plugins/knowledge/content?path=guide.md

写入(需 member_role 为 owner/admin)

PUT /platform-plugins/knowledge/content
Content-Type: application/json

{
  "path": "guide.md",
  "content": "# 标题\n\n正文…",
  "title": "入门指南",
  "summary": "一句话摘要,供检索匹配",
  "tags": ["标签1", "标签2"]
}

删除(需 owner/admin)

DELETE /platform-plugins/knowledge/content?path=guide.md

批量同步(需 owner/admin)

POST /platform-plugins/knowledge/sync
Content-Type: application/json

{
  "documents": [
    { "path": "a.md", "content": "…", "title": "A" },
    { "path": "b.md", "content": "…", "title": "B" }
  ]
}

响应:{ "ok": true, "synced": ["a.md","b.md"], "count": 2, "theme_dir": "plugin-my-plugin" }

范围:插件知识同步为 Markdown 正文path + content)。工作区知识里的图片/短视频等富媒体由 Cadau 产品侧管理,经本 sync API 上传。

2.2.1 规范库只读(工作区法规与管理标准)

真源与发布流见产品 §3.2.2 / docs/core-mechanisms/规范库.md。插件仅可读 已发布且生效中 的条目。

GET /platform-plugins/standards
GET /platform-plugins/standards?tag=hr
GET /platform-plugins/standards/{standardId}
GET /platform-plugins/standards/{standardId}/content

鉴权:Authorization: Bearer <launch_token>(与知识 API 相同)。

2.2.2 资料库只读(工作区模板与表格)

真源与发布流见产品 §3.2.3 / docs/core-mechanisms/资料库.md。插件仅可读 已发布 条目;/file 返回二进制文件流。

GET /platform-plugins/assets
GET /platform-plugins/assets?tag=hr
GET /platform-plugins/assets/{assetId}
GET /platform-plugins/assets/{assetId}/file

鉴权:Authorization: Bearer <launch_token>(与知识 API 相同)。

2.2.3 工作区大模型(结构化 JSON)

插件不要自带模型 API Key。需要「根据正文生成问卷 / 推荐编制」等短时结构化结果时,经本接口使用当前工作区已配置的大模型。

与「插件内嵌助手对话」(§2.3 embed)不同:本接口是服务端一次性 system+user → JSON 文本,无会话态。

POST /platform-plugins/ai/json
Authorization: Bearer <launch_token>
Content-Type: application/json

{
  "system": "你是……只输出一个 JSON 对象:{...}",
  "user": "{ \"context\": \"…\" }"
}

响应:

{ "text": "{ \"…\": \"模型返回的 JSON 字符串(可能仍带说明文字,调用方应解析/清洗)\" }" }
约束说明
鉴权launch_token(与知识 / 规范库相同)
system / user均必填;长度按 Unicode 字符计:system≤32000、user≤400000(适配大上下文模型;业务侧仍建议按任务拆分)
未配置模型HTTP 503,codellm_disabled,文案提示工作区尚未配置大模型
调用失败HTTP 502,codellm_error
SDKGo Client.AIJSON · JS client.aiJSON(system, user)

官方用法参考:plugins/hr 编制智能推荐、plugins/compliance 按规范生成调查问卷。

2.3 内嵌助手令牌

POST /platform-plugins/embed-token
Content-Type: application/json

{
  "user_agent_id": "uuid",
  "app_id": "my-plugin",
  "ttl_seconds": 3600
}

响应与 POST /user-agents/{id}/embed-token 类似:access_tokentoken_typeexpires_inexpires_atworkspace_iduser_agent_idapp_idpermanentrecord_id

随后前端加载 {Cadau}/embed/mindlink-widget.min.jsinit(见嵌入 SDK 契约)。


3. 插件自有 HTTP 约定(推荐)

路径说明
POST /api/bootstrapbody { "launch_token" } → 验会话、可选同步知识、返回用户上下文(含 data_namespace
GET /api/session用 Bearer 或 Cookie 中的启动令牌刷新会话
GET /api/health健康检查
GET /operations.json(可选)智能体可调用操作清单;可同文件声明 workflow_steps;或在注册里配 operations_url
POST /api/agent/invoke(可选)智能体 plugin_invoke 与工作流自动节点;校验 JWT(knd=plugin_invoke),非 launch_token

iframe 会话:前端将 launch_token 存入 sessionStorage,后续请求带 Authorization: Bearer …。插件自有 API 路径请用相对路径或 resolvePluginAPI(),以兼容 Cadau 同源网关 /p/{module_id}/

3.3 扩展工作流节点与清单契约(workflow_steps / rubric

插件可在同一份 operations.json 中声明 workflow_steps,把领域自动节点挂进流程设计器(仅当该插件已启用时出现在目录中)。引擎到达该步时调用 POST /api/agent/invoke(与 plugin_invoke 同一入口)。

{
  "module_id": "my-plugin",
  "operations": [
    { "name": "workflow_load_checklist", "mutates": false, "min_role": "member" }
  ],
  "workflow_steps": [
    {
      "type": "my-plugin.load_checklist",
      "label": "加载材料清单",
      "description": "写入实例 rubric,供上传证据 / 自动评分使用",
      "color": "#0891b2",
      "kind": "auto",
      "operation": "workflow_load_checklist",
      "config_hint": "可选 phases"
    }
  ]
}
workflow_steps[] 字段说明
type步骤 type(建议 {module_id}.{动作}
kind当前仅支持 auto:到达后 Invoke,成功后按 always 前进
operation对应 operations 中的操作名
label / description / color设计器展示

成功响应(加载类节点):

{ "ok": true, "rubric": [ /* RubricItem[] */ ], "variables": { } }
  • rubric:写入实例,供核心节点 上传证据human.upload)与 自动评分llm.score)消费;必须符合下表 RubricItem
  • variables:合并进实例变量(扁平键)。
  • 失败:{ "ok": false, "error": "用户可见说明", "rubric": [] }

#### RubricItem(清单条目 · 实现真值)

与后端 backend/internal/standards.RubricItem、SDK 类型 RubricItem(Go / TS)对齐。其它领域(入职材料、培训确认等)加载节点须输出同一形状,勿另起字段名。

字段类型必需说明
idstring稳定主键;上传 item_photos、评价、评分结果均按此 id 挂接
requirement_textstring办理页展示的要求说明
scoring_textstring上传可不严;接自动评分时建议有合格/打分依据
codestring展示用编号
phasestring阶段键(小写比较);供上传节点 config.phases 过滤
tierstringred \baseline \excellence
photo_standard_textstring拍照/取证提示
must_passbool红线项;默认 false
iway_refstring领域引用;非通用必需可省略

参考实现:plugins/complianceworkflow_load_check_itemstoRubric。产品侧说明见 docs/core-mechanisms/workflow.json-v1.md §检查项清单契约;机制指南见 ../README.md §6.1。

3.1 宿主 ↔ 插件 postMessage

方向type说明
宿主 → 插件mindlink:launch_token静默续签;须写入 sessionStorage(JS:listenHostLaunchToken
宿主 → 插件mindlink:themetheme: light \dark(JS:listenHostTheme
宿主 → 插件mindlink:plugin_tab帮助深链等切换插件内 tab(JS:listenHostPluginTab
宿主 → 插件mindlink:plugin_data_changed业务数据已变,建议刷新(JS:listenHostPluginDataChanged
插件 → 宿主mindlink:request_launch_tokensource 须为 mindlink-plugin;热重载/401 时主动要令牌(JS:requestHostLaunchToken

3.2 Cookie / 存储命名(勿混用)

名称谁写用途
ml_plugin_gwCadau 网关Path=/p/{module_id}/,浏览器访问反代路径时的网关鉴权
ml_plugin_launch插件进程(Go bootstrap)插件 origin 上的辅助 Cookie(可选)
ml_plugin_launch_token插件前端 sessionStorageBearer 真源;续签后必须更新

4. 安全响应头(插件服务)

Content-Security-Policy: frame-ancestors 'self' http://localhost:8080 http://127.0.0.1:8080

生产环境替换为客户 Cadau Web 源。Go SDK:mindlinkplugin.FrameAncestorsCSP(...)


5. 错误体

{
  "error": "用户可见说明",
  "code": "machine_code",
  "request_id": "…"
}

常见 codeunauthorized, plugin_launch_invalid, forbidden, validation_error, not_found