Files
olons_server/docs/IM工作台AI前后端对接文档.md
T

1626 lines
49 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# IM 工作台 AI 前后端对接文档
> 版本:v1.0
> 日期:2026-09-25
> 需求依据:[IM 工作台 AI 接入需求文档](./IM工作台AI接入需求文档.md)
> IM 依据:[IM 前后端对接文档](./IM-前后端对接文档.md)
> 参考格式:[禾圃集后院养成与物友动态前后端对接文档](./禾圃集-后院养成与物友动态前后端对接文档.md)
> 说明:本文补充 IM 工作台 AI 能力的前后端对接契约,包括工作台 AI 入口、应用搜索、智能文档、智能表格、AI 美文、日报/月报 AI 接入、会议笔记 AI 总结、AI 任务与记录。IM 登录、租户、用户体系、文件服务、工作台原有日报/月报/会议接口沿用现有 IM 与 workbench 协议。
## 0. 公共对接约定
### 0.1 实现状态
| 状态 | 含义 |
| --- | --- |
| `新增` | 当前工作台接口未覆盖,需要新增服务端模型和接口 |
| `复用` | 沿用 IM 或 workbench 既有能力,例如登录、租户、文件上传、日报/月报提交 |
| `需改造` | 已有基础能力,但需要补充 AI 字段、记录、状态或权限判断 |
| `纯客户端` | 只影响本地 UI、动效、输入缓存或前端路由,不新增服务端接口 |
本文所有接口均为目标契约。接口完成前,前端可按相同字段结构使用 Mock;联调时以本文字段名、枚举值、错误码和幂等规则为准。所有 ID、游标、用户 ID、会议 ID、文件 ID 统一按字符串处理。
### 0.2 鉴权、租户与路径
工作台 AI 接口复用 IM 登录态:
1. 客户端必须先按 IM 登录流程拿到用户 Token,再访问本文接口。
2. 服务端从 Token 与 Header 解析当前租户和用户,客户端不得在请求体中传 `tenant_id`、`user_id` 来覆盖身份。
3. 工作台 AI 数据必须按租户、用户隔离;用户只能访问本人创建的 AI 任务和记录,会议 AI 总结按会议笔记权限判断。
4. 写接口必须支持幂等,客户端传 `Idempotency-Key`;同一幂等键请求体不同,返回 `IDEMPOTENCY_CONFLICT`。
5. AI 内容、原始输入、上传文件解析结果、模型响应和错误日志均需脱敏后入库或打印。
建议路径前缀:
```text
https://{host}/v1/workbench/ai/*
```
公共 Header:
| Header | 必填 | 说明 |
| --- | --- | --- |
| `Authorization` | 是 | `Bearer <IM 登录 token>` |
| `X-MeetingIM-APIKey` | 是 | 沿用 IM 客户端预置 API Key |
| `X-IM-Schema` | 是 | 固定传 `1` |
| `X-Tenant-Code` | 是 | 当前租户编码,例如 `system` |
| `X-Request-ID` | 是 | 客户端生成的请求追踪 ID |
| `Idempotency-Key` | 写接口必填 | 幂等键,避免弱网重复提交 |
文件上传沿用 IM 文件服务。智能表格原始文件建议上传为 `purpose=ai_table_source`,会议笔记附件仍沿用会议笔记既有 `purpose`。
### 0.3 成功与失败响应
成功响应统一为:
```json
{
"code": 0,
"data": {},
"request_id": "01K8ZC3FZ6BTX9Z1SK8HV7QYWB",
"server_time": "2026-09-25T08:30:15.123Z"
}
```
失败响应统一为:
```json
{
"code": 30000,
"reason": "MALFORMED_REQUEST",
"message": "malformed request",
"details": {
"field": "source_text",
"limit": 1000
},
"request_id": "01K8ZC3FZ6BTX9Z1SK8HV7QYWB",
"server_time": "2026-09-25T08:30:15.123Z"
}
```
前端只使用稳定 `reason` 分支和本地化文案,不解析 `message`。分页统一使用 `limit` 与不透明 `cursor`,返回 `items`、`next_cursor`、`has_more`。时间统一为 UTC RFC3339。
### 0.4 枚举约定
#### 0.4.1 AI 能力类型
| 枚举 | 说明 |
| --- | --- |
| `smart_document` | 智能文档 |
| `smart_table` | 智能表格/报告解读 |
| `text_polish` | AI 美文 |
| `daily_report_polish` | 日报 AI 美化 |
| `monthly_report_polish` | 月报 AI 美化 |
| `meeting_summary` | 会议笔记 AI 总结 |
#### 0.4.2 AI 任务状态
| 枚举 | 说明 |
| --- | --- |
| `queued` | 已入队,等待执行 |
| `processing` | 处理中 |
| `succeeded` | 处理成功 |
| `failed` | 处理失败 |
| `canceled` | 已取消 |
| `expired` | 结果已过期 |
#### 0.4.3 AI 记录类型
| 枚举 | 说明 |
| --- | --- |
| `smart_document` | 智能文档记录 |
| `smart_table` | 智能表格解读记录 |
| `text_polish` | AI 美文记录,首版可不展示到记录中心 |
| `meeting_summary` | 会议总结记录,挂在会议下 |
#### 0.4.4 文件类型
| 枚举 | 说明 |
| --- | --- |
| `xlsx` | Excel 工作簿 |
| `xls` | 旧版 Excel 工作簿 |
| `csv` | CSV 数据文件 |
| `docx` | Word 文档,导出场景使用 |
| `pdf` | PDF 文档,导出场景使用 |
#### 0.4.5 表格解读步骤
| 枚举 | 说明 |
| --- | --- |
| `read_file` | 读取表格数据 |
| `detect_metrics` | 识别核心指标 |
| `analyze_trends` | 分析趋势变化 |
| `generate_report` | 生成解读报告 |
### 0.5 通用错误码
| reason | HTTP | 说明 | 前端处理 |
| --- | --- | --- | --- |
| `UNAUTHORIZED` | 401 | Token 缺失、过期或无效 | 回到登录 |
| `FORBIDDEN` | 403 | 无权限访问 AI 能力、记录或会议 | 展示无权限 |
| `MALFORMED_REQUEST` | 400 | 请求体格式错误 | 按接口提示修正 |
| `VALIDATION_FAILED` | 400 | 字段校验失败 | 按字段提示 |
| `RESOURCE_NOT_FOUND` | 404 | 对象不存在或无权感知 | 展示不存在或已失效 |
| `IDEMPOTENCY_CONFLICT` | 409 | 同一幂等键请求体不一致 | 停止重试并上报 |
| `AI_QUOTA_EXCEEDED` | 429 | AI 用量超限 | 提示今日次数已用完 |
| `RATE_LIMITED` | 429 | 触发频控 | 提示稍后再试 |
| `AI_PROVIDER_FAILED` | 502 | AI 供应商调用失败 | 可重试 |
| `AI_TIMEOUT` | 504 | AI 处理超时 | 展示超时并允许重试 |
| `AI_CONTENT_REJECTED` | 422 | 输入或输出命中内容安全 | 提示内容不适合生成 |
| `AI_TASK_FAILED` | 500 | AI 任务执行失败 | 展示失败并允许重试 |
| `FILE_TOO_LARGE` | 413 | 文件超过限制 | 提示压缩或更换文件 |
| `FILE_TYPE_UNSUPPORTED` | 415 | 文件类型不支持 | 提示仅支持 xls/xlsx/csv |
| `FILE_UNAVAILABLE` | 404 | 文件不存在、已过期或无权限 | 重新上传 |
### 0.6 分页、轮询与幂等
| 场景 | 约定 |
| --- | --- |
| 列表分页 | `limit` 默认 20,最大 50;`cursor` 为服务端不透明字符串 |
| 任务轮询 | 前端创建任务后每 1.5 秒轮询一次,连续 30 秒后改为每 3 秒,最长 2 分钟 |
| 弱网重试 | 写接口使用同一个 `Idempotency-Key` 重试 |
| 取消任务 | 只允许取消 `queued`、`processing` 状态任务 |
| 记录保存 | 智能文档生成成功后,必须显式保存才进入文档记录;智能表格解读成功后默认生成记录 |
## 1. 工作台 AI 入口与应用搜索
本章对应工作台首页、搜索默认页、搜索结果页和无结果页。工作台原有应用仍走既有接口;本文补充 AI 能力开关、限制和搜索字段。
### 1.1 获取工作台 AI 能力
#### 需求图片
<img src="ai/工作台.png" alt="工作台" width="360">
| 项 | 内容 |
| --- | --- |
| 状态 | `新增` |
| 方法 | `GET /v1/workbench/ai/capabilities` |
| 用途 | 获取当前租户、当前用户可用的 AI 能力、用量限制和入口展示状态 |
| 鉴权 | 需要 IM 登录态 |
| 幂等 | 读接口无需幂等 |
#### 入参说明
| 字段 | 类型 | 必填 | 说明 |
| --- | --- | --- | --- |
| `scene` | string | 否 | 调用场景,默认 `workbench_home` |
#### 入参示例
```http
GET /v1/workbench/ai/capabilities?scene=workbench_home HTTP/1.1
Authorization: Bearer <token>
X-MeetingIM-APIKey: <api_key>
X-IM-Schema: 1
X-Tenant-Code: system
X-Request-ID: 01K8ZC3FZ6BTX9Z1SK8HV7QYWB
```
#### 出参说明
| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `enabled` | boolean | 工作台 AI 总开关 |
| `features[]` | array | 当前用户可用能力 |
| `features[].feature` | string | 能力类型,见 0.4.1 |
| `features[].enabled` | boolean | 是否可用 |
| `features[].entry_title` | string | 前端入口名称 |
| `features[].daily_limit` | number | 单用户每日可用次数,`0` 表示不限制 |
| `features[].remaining_today` | number | 今日剩余次数 |
| `features[].max_input_chars` | number | 输入最大字符数 |
| `features[].max_file_size_mb` | number | 文件大小限制,非文件能力为 `0` |
#### 出参示例
```json
{
"code": 0,
"data": {
"enabled": true,
"features": [
{
"feature": "smart_document",
"enabled": true,
"entry_title": "智能文档",
"daily_limit": 20,
"remaining_today": 18,
"max_input_chars": 1000,
"max_file_size_mb": 0
},
{
"feature": "smart_table",
"enabled": true,
"entry_title": "智能表格",
"daily_limit": 10,
"remaining_today": 9,
"max_input_chars": 100,
"max_file_size_mb": 20
}
]
},
"request_id": "01K8ZC3FZ6BTX9Z1SK8HV7QYWB",
"server_time": "2026-09-25T08:30:15.123Z"
}
```
#### 对接重点
1. 首页“智能文档”“智能表格”是否展示,以 `features[].enabled` 为准。
2. `remaining_today=0` 时入口可展示,但生成按钮置灰并提示次数已用完。
3. 前端不要写死 AI 能力开关,方便后续按租户灰度。
### 1.2 获取工作台应用搜索默认页
#### 需求图片
<img src="ai/工作台-搜索页面.png" alt="工作台搜索页面" width="360">
| 项 | 内容 |
| --- | --- |
| 状态 | `需改造` |
| 方法 | `GET /v1/workbench/apps` |
| 用途 | 获取搜索页默认展示的常用应用和全部应用,包含 AI 应用 |
| 鉴权 | 需要 IM 登录态 |
| 幂等 | 读接口无需幂等 |
#### 入参说明
| 字段 | 类型 | 必填 | 说明 |
| --- | --- | --- | --- |
| `include_ai` | boolean | 否 | 是否包含 AI 应用,默认 `true` |
#### 入参示例
```http
GET /v1/workbench/apps?include_ai=true HTTP/1.1
Authorization: Bearer <token>
X-MeetingIM-APIKey: <api_key>
X-IM-Schema: 1
X-Tenant-Code: system
X-Request-ID: 01K8ZC3FZ6BTX9Z1SK8HV7QYWC
```
#### 出参说明
| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `common_apps[]` | array | 常用应用列表 |
| `all_apps[]` | array | 全部应用列表 |
| `app_id` | string | 应用 ID |
| `name` | string | 应用名称 |
| `icon` | string | 图标标识或图片 URL |
| `route` | string | 前端路由 |
| `type` | string | `builtin`、`ai` |
| `enabled` | boolean | 是否可点击 |
#### 出参示例
```json
{
"code": 0,
"data": {
"common_apps": [
{"app_id": "daily_report", "name": "日报", "icon": "daily", "route": "/workbench/daily", "type": "builtin", "enabled": true},
{"app_id": "smart_document", "name": "智能文档", "icon": "ai_document", "route": "/workbench/ai/document", "type": "ai", "enabled": true},
{"app_id": "smart_table", "name": "智能表格", "icon": "ai_table", "route": "/workbench/ai/table", "type": "ai", "enabled": true}
],
"all_apps": [
{"app_id": "organization", "name": "组织框架", "icon": "org", "route": "/workbench/org", "type": "builtin", "enabled": true},
{"app_id": "meeting_notes", "name": "会议笔记", "icon": "meeting_note", "route": "/workbench/meeting-notes", "type": "builtin", "enabled": true}
]
},
"request_id": "01K8ZC3FZ6BTX9Z1SK8HV7QYWC"
}
```
#### 对接重点
1. `route` 由前端路由解释,后端只返回稳定应用 ID 和显示名称。
2. AI 应用是否出现在常用应用中,可由服务端按租户配置控制。
### 1.3 搜索工作台应用
#### 需求图片
<img src="ai/工作台-搜索页面-明确展示.png" alt="工作台搜索结果" width="360">
<img src="ai/工作台-搜索页面-无结果.png" alt="工作台搜索无结果" width="360">
| 项 | 内容 |
| --- | --- |
| 状态 | `需改造` |
| 方法 | `GET /v1/workbench/apps/search` |
| 用途 | 按关键字搜索工作台应用,返回可跳转应用结果 |
| 鉴权 | 需要 IM 登录态 |
| 幂等 | 读接口无需幂等 |
#### 入参说明
| 字段 | 类型 | 必填 | 说明 |
| --- | --- | --- | --- |
| `q` | string | 是 | 搜索关键词,最长 50 字符 |
| `include_ai` | boolean | 否 | 是否搜索 AI 应用,默认 `true` |
#### 入参示例
```http
GET /v1/workbench/apps/search?q=%E7%BB%84%E7%BB%87&include_ai=true HTTP/1.1
Authorization: Bearer <token>
X-MeetingIM-APIKey: <api_key>
X-IM-Schema: 1
X-Tenant-Code: system
X-Request-ID: 01K8ZC3FZ6BTX9Z1SK8HV7QYWD
```
#### 出参说明
| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `items[]` | array | 匹配的应用 |
| `matched_text` | string | 命中的展示文本 |
| `highlight_ranges[]` | array | 高亮范围,可选 |
| `has_more` | boolean | 是否还有更多结果 |
#### 出参示例
```json
{
"code": 0,
"data": {
"items": [
{
"app_id": "organization",
"name": "组织框架",
"matched_text": "组织框架",
"icon": "org",
"route": "/workbench/org",
"type": "builtin",
"enabled": true,
"highlight_ranges": [{"start": 0, "end": 2}]
}
],
"has_more": false
},
"request_id": "01K8ZC3FZ6BTX9Z1SK8HV7QYWD"
}
```
#### 对接重点
1. 无结果时返回 `items: []`,前端展示“暂无匹配结果”。
2. 搜索只返回当前用户有权限访问的应用。
3. 前端不要基于本地固定列表搜索,否则 AI 应用灰度会不一致。
## 2. 智能文档接口
本章对应智能文档输入页、生成结果页和文档记录页。智能文档是异步任务,生成成功后前端展示结果;用户点击“保存文档”后才进入文档记录。
### 2.1 创建智能文档生成任务
#### 需求图片
<img src="ai/智能文档(2).png" alt="智能文档输入" width="360">
<img src="ai/智能文档(1).png" alt="智能文档生成结果" width="360">
| 项 | 内容 |
| --- | --- |
| 状态 | `新增` |
| 方法 | `POST /v1/workbench/ai/documents/generate` |
| 用途 | 根据用户输入生成结构化文档 |
| 鉴权 | 需要 IM 登录态 |
| 幂等 | 必须携带 `Idempotency-Key` |
#### 入参说明
| 字段 | 类型 | 必填 | 说明 |
| --- | --- | --- | --- |
| `source_text` | string | 是 | 用户输入的核心内容,最长 1000 字 |
| `title_hint` | string | 否 | 标题提示,最长 80 字 |
| `document_type` | string | 否 | 文档类型,默认 `meeting_minutes`;可选 `meeting_minutes`、`plan`、`summary`、`general` |
| `language` | string | 否 | 语言,默认 `zh-CN` |
#### 入参示例
```http
POST /v1/workbench/ai/documents/generate HTTP/1.1
Authorization: Bearer <token>
X-MeetingIM-APIKey: <api_key>
X-IM-Schema: 1
X-Tenant-Code: system
X-Request-ID: 01K8ZC3FZ6BTX9Z1SK8HV7QYWE
Idempotency-Key: ai_doc_01K8ZC3FZ6BTX9Z1SK8HV7QYWE
Content-Type: application/json
{
"source_text": "今天讨论新项目排期,确认本周完成需求评审,下周启动开发,风险是接口字段还未冻结。",
"title_hint": "新项目沟通纪要",
"document_type": "meeting_minutes",
"language": "zh-CN"
}
```
#### 出参说明
| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `task_id` | string | AI 任务 ID |
| `status` | string | 任务状态 |
| `polling_interval_ms` | number | 建议轮询间隔 |
| `expires_at` | string | 未保存结果过期时间 |
#### 出参示例
```json
{
"code": 0,
"data": {
"task_id": "aitask_7R8mX5Nf4D2a",
"status": "queued",
"polling_interval_ms": 1500,
"expires_at": "2026-09-25T10:30:15.123Z"
},
"request_id": "01K8ZC3FZ6BTX9Z1SK8HV7QYWE"
}
```
#### 对接重点
1. 前端创建任务后跳转或停留在结果页 loading 状态,通过 2.2 查询任务。
2. 输入为空、超过 1000 字或命中内容安全,必须返回明确错误码。
3. 重新生成可再次调用本接口,并传新的幂等键。
### 2.2 查询 AI 任务详情
| 项 | 内容 |
| --- | --- |
| 状态 | `新增` |
| 方法 | `GET /v1/workbench/ai/tasks/{task_id}` |
| 用途 | 查询智能文档、智能表格等异步任务进度和结果 |
| 鉴权 | 需要 IM 登录态 |
| 幂等 | 读接口无需幂等 |
#### 入参说明
| 字段 | 类型 | 必填 | 说明 |
| --- | --- | --- | --- |
| `task_id` | string | 是 | 路径参数 |
#### 入参示例
```http
GET /v1/workbench/ai/tasks/aitask_7R8mX5Nf4D2a HTTP/1.1
Authorization: Bearer <token>
X-MeetingIM-APIKey: <api_key>
X-IM-Schema: 1
X-Tenant-Code: system
X-Request-ID: 01K8ZC3FZ6BTX9Z1SK8HV7QYWF
```
#### 出参说明
| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `task_id` | string | AI 任务 ID |
| `feature` | string | AI 能力类型 |
| `status` | string | 任务状态 |
| `progress` | number | 进度,0~100 |
| `steps[]` | array | 表格类任务步骤,智能文档可为空 |
| `result` | object | 任务结果,成功后返回 |
| `error` | object | 失败原因,失败后返回 |
#### 出参示例
```json
{
"code": 0,
"data": {
"task_id": "aitask_7R8mX5Nf4D2a",
"feature": "smart_document",
"status": "succeeded",
"progress": 100,
"steps": [],
"result": {
"title": "新项目沟通纪要",
"content_markdown": "## 一、会议背景\n今天讨论新项目排期...\n\n## 二、关键结论\n- 本周完成需求评审\n- 下周启动开发",
"sections": [
{"heading": "会议背景", "content": "今天讨论新项目排期。"},
{"heading": "关键结论", "content": "本周完成需求评审,下周启动开发。"}
],
"source_excerpt": "今天讨论新项目排期...",
"can_save": true
},
"error": null
},
"request_id": "01K8ZC3FZ6BTX9Z1SK8HV7QYWF"
}
```
#### 对接重点
1. `status=succeeded` 且 `result.can_save=true` 时前端展示“保存文档”。
2. `content_markdown` 是主展示字段;`sections` 用于后续结构化编辑或导出。
3. `status=failed` 时返回 `error.reason` 和 `error.message`,前端展示重试。
### 2.3 保存智能文档
#### 需求图片
<img src="ai/智能文档.png" alt="智能文档编辑保存" width="360">
| 项 | 内容 |
| --- | --- |
| 状态 | `新增` |
| 方法 | `POST /v1/workbench/ai/documents` |
| 用途 | 将生成结果保存为文档记录 |
| 鉴权 | 需要 IM 登录态 |
| 幂等 | 必须携带 `Idempotency-Key` |
#### 入参说明
| 字段 | 类型 | 必填 | 说明 |
| --- | --- | --- | --- |
| `task_id` | string | 是 | 生成任务 ID |
| `title` | string | 是 | 保存标题,最长 100 字 |
| `content_markdown` | string | 是 | 保存内容 |
| `content_plain` | string | 否 | 纯文本内容,用于搜索 |
#### 入参示例
```http
POST /v1/workbench/ai/documents HTTP/1.1
Authorization: Bearer <token>
X-MeetingIM-APIKey: <api_key>
X-IM-Schema: 1
X-Tenant-Code: system
X-Request-ID: 01K8ZC3FZ6BTX9Z1SK8HV7QYWG
Idempotency-Key: ai_doc_save_01K8ZC3FZ6BTX9Z1SK8HV7QYWG
Content-Type: application/json
{
"task_id": "aitask_7R8mX5Nf4D2a",
"title": "新项目沟通纪要",
"content_markdown": "## 一、会议背景\n今天讨论新项目排期...",
"content_plain": "今天讨论新项目排期,本周完成需求评审。"
}
```
#### 出参说明
| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `record_id` | string | 文档记录 ID |
| `title` | string | 文档标题 |
| `created_at` | string | 保存时间 |
| `updated_at` | string | 更新时间 |
#### 出参示例
```json
{
"code": 0,
"data": {
"record_id": "airec_doc_5Jv8mVb21Q",
"title": "新项目沟通纪要",
"created_at": "2026-09-25T08:35:00.000Z",
"updated_at": "2026-09-25T08:35:00.000Z"
},
"request_id": "01K8ZC3FZ6BTX9Z1SK8HV7QYWG"
}
```
#### 对接重点
1. 同一个 `task_id` 可以保存一次;重复保存同一幂等键返回同一 `record_id`。
2. 前端编辑后的内容以保存接口入参为准,后端不再重新调用 AI。
3. 未保存结果过期后保存返回 `RESOURCE_NOT_FOUND` 或 `AI_TASK_FAILED`。
### 2.4 文档记录列表
#### 需求图片
<img src="ai/总结记录(1).png" alt="文档记录" width="360">
| 项 | 内容 |
| --- | --- |
| 状态 | `新增` |
| 方法 | `GET /v1/workbench/ai/documents` |
| 用途 | 查询当前用户保存的智能文档记录 |
| 鉴权 | 需要 IM 登录态 |
| 幂等 | 读接口无需幂等 |
#### 入参说明
| 字段 | 类型 | 必填 | 说明 |
| --- | --- | --- | --- |
| `query` | string | 否 | 标题或内容搜索 |
| `cursor` | string | 否 | 分页游标 |
| `limit` | number | 否 | 默认 20,最大 50 |
#### 入参示例
```http
GET /v1/workbench/ai/documents?query=%E9%A1%B9%E7%9B%AE&cursor=&limit=20 HTTP/1.1
Authorization: Bearer <token>
X-MeetingIM-APIKey: <api_key>
X-IM-Schema: 1
X-Tenant-Code: system
X-Request-ID: 01K8ZC3FZ6BTX9Z1SK8HV7QYWH
```
#### 出参说明
| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `items[]` | array | 文档记录 |
| `record_id` | string | 记录 ID |
| `title` | string | 标题 |
| `summary` | string | 摘要 |
| `document_type` | string | 文档类型 |
| `status` | string | 固定 `succeeded` |
| `created_at` | string | 创建时间 |
| `updated_at` | string | 更新时间 |
| `next_cursor` | string | 下一页游标 |
| `has_more` | boolean | 是否还有更多 |
#### 出参示例
```json
{
"code": 0,
"data": {
"items": [
{
"record_id": "airec_doc_5Jv8mVb21Q",
"title": "新项目沟通纪要",
"summary": "确认本周完成需求评审,下周启动开发。",
"document_type": "meeting_minutes",
"status": "succeeded",
"created_at": "2026-09-25T08:35:00.000Z",
"updated_at": "2026-09-25T08:35:00.000Z"
}
],
"next_cursor": "",
"has_more": false
},
"request_id": "01K8ZC3FZ6BTX9Z1SK8HV7QYWH"
}
```
#### 对接重点
1. 文档记录只返回当前用户保存的数据。
2. 搜索建议同时匹配标题和 `content_plain`。
### 2.5 文档记录详情
| 项 | 内容 |
| --- | --- |
| 状态 | `新增` |
| 方法 | `GET /v1/workbench/ai/documents/{record_id}` |
| 用途 | 获取智能文档保存内容 |
| 鉴权 | 需要 IM 登录态 |
| 幂等 | 读接口无需幂等 |
#### 入参示例
```http
GET /v1/workbench/ai/documents/airec_doc_5Jv8mVb21Q HTTP/1.1
Authorization: Bearer <token>
X-MeetingIM-APIKey: <api_key>
X-IM-Schema: 1
X-Tenant-Code: system
X-Request-ID: 01K8ZC3FZ6BTX9Z1SK8HV7QYWI
```
#### 出参示例
```json
{
"code": 0,
"data": {
"record_id": "airec_doc_5Jv8mVb21Q",
"title": "新项目沟通纪要",
"document_type": "meeting_minutes",
"content_markdown": "## 一、会议背景\n今天讨论新项目排期...",
"source_excerpt": "今天讨论新项目排期...",
"created_at": "2026-09-25T08:35:00.000Z",
"updated_at": "2026-09-25T08:35:00.000Z"
},
"request_id": "01K8ZC3FZ6BTX9Z1SK8HV7QYWI"
}
```
## 3. 智能表格与报告解读接口
本章对应智能表格首页、选择文件、上传成功、分析进度、报告解读和解读记录。文件上传先走 IM 文件服务,再创建表格解读任务。
### 3.1 上传智能表格源文件
#### 需求图片
<img src="ai/智能表格.png" alt="智能表格" width="360">
<img src="ai/选择文件.png" alt="选择文件" width="360">
<img src="ai/智能表格-文件上传成功.png" alt="文件上传成功 xlsx" width="360">
<img src="ai/智能表格-文件上传成功(1).png" alt="文件上传成功 xls" width="360">
<img src="ai/智能表格-文件上传成功(2).png" alt="文件上传成功 csv" width="360">
| 项 | 内容 |
| --- | --- |
| 状态 | `复用` |
| 方法 | `POST /v0/file/u/` |
| 用途 | 上传智能表格待分析文件,返回 `file_id` |
| 鉴权 | 沿用 IM 文件服务鉴权 |
| 幂等 | 文件服务按既有规则处理 |
#### 入参说明
| 字段 | 类型 | 必填 | 说明 |
| --- | --- | --- | --- |
| `id` | string | 是 | 客户端文件上传 ID |
| `purpose` | string | 是 | 固定 `ai_table_source` |
| `file` | file | 是 | 支持 `.xlsx`、`.xls`、`.csv` |
#### 入参示例
```http
POST /v0/file/u/ HTTP/1.1
X-MeetingIM-APIKey: <api_key>
X-MeetingIM-Auth: token <im_token>
X-IM-Schema: 1
X-Tenant-Code: system
Content-Type: multipart/form-data
id=file_01K8ZC3FZ6BTX9Z1SK8HV7QYWJ
purpose=ai_table_source
file=@sales_august.xlsx
```
#### 出参示例
```json
{
"ctrl": {
"id": "file_01K8ZC3FZ6BTX9Z1SK8HV7QYWJ",
"code": 200,
"text": "ok",
"params": {
"file_id": "fil_8xMb92qK7L",
"name": "sales_august.xlsx",
"size": 2726297,
"mime": "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"
}
}
}
```
#### 对接重点
1. 文件服务响应结构沿用 IM `ctrl`,不是 workbench 统一 `code/data` 包装。
2. 前端需在本地先校验扩展名和大小,后端仍必须二次校验。
3. `file_id` 只作为后续创建 AI 表格任务的输入,不直接暴露给其他用户。
### 3.2 创建表格解读任务
| 项 | 内容 |
| --- | --- |
| 状态 | `新增` |
| 方法 | `POST /v1/workbench/ai/table-analyses` |
| 用途 | 根据上传文件和报表主题创建智能表格解读任务 |
| 鉴权 | 需要 IM 登录态 |
| 幂等 | 必须携带 `Idempotency-Key` |
#### 入参说明
| 字段 | 类型 | 必填 | 说明 |
| --- | --- | --- | --- |
| `file_id` | string | 是 | 文件服务返回的文件 ID |
| `file_name` | string | 是 | 原始文件名 |
| `file_type` | string | 是 | `xlsx`、`xls`、`csv` |
| `file_size` | number | 是 | 文件大小,单位 byte |
| `topic` | string | 是 | 报表主题,最长 100 字 |
| `sheet_name` | string | 否 | 指定分析工作表;为空时服务端自动选择 |
| `language` | string | 否 | 默认 `zh-CN` |
#### 入参示例
```http
POST /v1/workbench/ai/table-analyses HTTP/1.1
Authorization: Bearer <token>
X-MeetingIM-APIKey: <api_key>
X-IM-Schema: 1
X-Tenant-Code: system
X-Request-ID: 01K8ZC3FZ6BTX9Z1SK8HV7QYWK
Idempotency-Key: ai_table_01K8ZC3FZ6BTX9Z1SK8HV7QYWK
Content-Type: application/json
{
"file_id": "fil_8xMb92qK7L",
"file_name": "sales_august.xlsx",
"file_type": "xlsx",
"file_size": 2726297,
"topic": "8月销售数据",
"sheet_name": "",
"language": "zh-CN"
}
```
#### 出参说明
| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `task_id` | string | AI 任务 ID |
| `record_id` | string | 预生成记录 ID;任务成功后可打开详情 |
| `status` | string | 任务状态 |
| `polling_interval_ms` | number | 建议轮询间隔 |
#### 出参示例
```json
{
"code": 0,
"data": {
"task_id": "aitask_tbl_2Fh9aQx73K",
"record_id": "airec_tbl_6LP0nM9s3B",
"status": "queued",
"polling_interval_ms": 1500
},
"request_id": "01K8ZC3FZ6BTX9Z1SK8HV7QYWK"
}
```
#### 对接重点
1. 表格解读成功后默认生成记录,无需用户另点保存。
2. 文件不存在、类型不支持、超过大小限制必须在创建任务时拦截。
3. 同一用户可同时运行的表格任务建议限制为 1~3 个,超过返回 `RATE_LIMITED`。
### 3.3 查询表格解读进度
#### 需求图片
<img src="ai/会议总结-识别中.png" alt="智能解读报告处理中" width="360">
| 项 | 内容 |
| --- | --- |
| 状态 | `新增` |
| 方法 | `GET /v1/workbench/ai/tasks/{task_id}` |
| 用途 | 查询表格解读任务进度 |
| 鉴权 | 需要 IM 登录态 |
| 幂等 | 读接口无需幂等 |
#### 出参示例
```json
{
"code": 0,
"data": {
"task_id": "aitask_tbl_2Fh9aQx73K",
"feature": "smart_table",
"status": "processing",
"progress": 68,
"steps": [
{"step": "read_file", "title": "读取表格数据", "status": "succeeded"},
{"step": "detect_metrics", "title": "识别核心指标", "status": "succeeded"},
{"step": "analyze_trends", "title": "分析趋势变化", "status": "processing"},
{"step": "generate_report", "title": "生成解读报告", "status": "pending"}
],
"result": null,
"error": null
},
"request_id": "01K8ZC3FZ6BTX9Z1SK8HV7QYWL"
}
```
#### 对接重点
1. 前端进度条使用 `progress`,步骤列表使用 `steps`。
2. 服务端不保证每次轮询都有进度变化,但状态必须单向推进。
3. 任务成功后 `result.record_id` 指向报告详情。
### 3.4 取消表格解读任务
| 项 | 内容 |
| --- | --- |
| 状态 | `新增` |
| 方法 | `POST /v1/workbench/ai/tasks/{task_id}/cancel` |
| 用途 | 取消正在排队或处理中的 AI 任务 |
| 鉴权 | 需要 IM 登录态 |
| 幂等 | 必须携带 `Idempotency-Key` |
#### 入参示例
```http
POST /v1/workbench/ai/tasks/aitask_tbl_2Fh9aQx73K/cancel HTTP/1.1
Authorization: Bearer <token>
X-MeetingIM-APIKey: <api_key>
X-IM-Schema: 1
X-Tenant-Code: system
X-Request-ID: 01K8ZC3FZ6BTX9Z1SK8HV7QYWM
Idempotency-Key: ai_cancel_01K8ZC3FZ6BTX9Z1SK8HV7QYWM
```
#### 出参示例
```json
{
"code": 0,
"data": {
"task_id": "aitask_tbl_2Fh9aQx73K",
"status": "canceled",
"canceled_at": "2026-09-25T08:40:00.000Z"
},
"request_id": "01K8ZC3FZ6BTX9Z1SK8HV7QYWM"
}
```
### 3.5 获取报告解读详情
#### 需求图片
<img src="ai/报告解读.png" alt="报告解读" width="360">
| 项 | 内容 |
| --- | --- |
| 状态 | `新增` |
| 方法 | `GET /v1/workbench/ai/table-analyses/{record_id}` |
| 用途 | 获取智能表格解读报告详情 |
| 鉴权 | 需要 IM 登录态 |
| 幂等 | 读接口无需幂等 |
#### 出参说明
| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `record_id` | string | 报告记录 ID |
| `title` | string | 报告标题 |
| `file` | object | 源文件信息 |
| `metrics[]` | array | 核心指标 |
| `preview` | object | 数据预览 |
| `alerts[]` | array | 异常提醒 |
| `interpretation` | string | 核心解读 |
| `export_options[]` | array | 可导出格式 |
#### 出参示例
```json
{
"code": 0,
"data": {
"record_id": "airec_tbl_6LP0nM9s3B",
"title": "8月销售数据",
"file": {
"file_id": "fil_8xMb92qK7L",
"file_name": "sales_august.xlsx",
"file_type": "xlsx",
"file_size": 2726297
},
"metrics": [
{"name": "销售额", "value": "128.6万", "change_text": "+12.3%", "trend": "up"},
{"name": "订单量", "value": "3,842", "change_text": "+8.7%", "trend": "up"},
{"name": "退款率", "value": "2.1%", "change_text": "-0.4%", "trend": "down"}
],
"preview": {
"columns": ["日期", "销售额", "订单量", "退款率"],
"rows": [
["8/1", "42,300", "126", "2.3%"],
["8/2", "48,120", "139", "2.0%"]
],
"total_rows": 31
},
"alerts": [
{"level": "warning", "title": "8月15日订单量异常下降", "description": "订单量较前一日下降 18%,建议核对促销和渠道数据。"}
],
"interpretation": "8月整体销售额较上月增长,订单量同步提升,退款率下降,说明转化质量改善。",
"export_options": ["docx", "pdf"],
"created_at": "2026-09-25T08:42:00.000Z"
},
"request_id": "01K8ZC3FZ6BTX9Z1SK8HV7QYWN"
}
```
#### 对接重点
1. 核心指标、异常提醒、核心解读都由后端生成并持久化,前端只负责展示。
2. `preview.rows` 只返回前 N 行用于展示,不返回完整表格数据。
3. 前端展示“由 AI 生成,请核对后使用”的风险提示。
### 3.6 解读记录列表
#### 需求图片
<img src="ai/总结记录.png" alt="解读记录" width="360">
| 项 | 内容 |
| --- | --- |
| 状态 | `新增` |
| 方法 | `GET /v1/workbench/ai/table-analyses` |
| 用途 | 查询当前用户的表格解读记录 |
| 鉴权 | 需要 IM 登录态 |
| 幂等 | 读接口无需幂等 |
#### 入参说明
| 字段 | 类型 | 必填 | 说明 |
| --- | --- | --- | --- |
| `query` | string | 否 | 按标题或文件名搜索 |
| `cursor` | string | 否 | 分页游标 |
| `limit` | number | 否 | 默认 20,最大 50 |
#### 出参示例
```json
{
"code": 0,
"data": {
"items": [
{
"record_id": "airec_tbl_6LP0nM9s3B",
"title": "8月销售数据",
"file_name": "sales_august.xlsx",
"file_type": "xlsx",
"status": "succeeded",
"created_at": "2026-09-25T08:42:00.000Z"
}
],
"next_cursor": "",
"has_more": false
},
"request_id": "01K8ZC3FZ6BTX9Z1SK8HV7QYWO"
}
```
### 3.7 导出解读报告
| 项 | 内容 |
| --- | --- |
| 状态 | `新增` |
| 方法 | `POST /v1/workbench/ai/table-analyses/{record_id}/export` |
| 用途 | 将解读报告导出为文件 |
| 鉴权 | 需要 IM 登录态 |
| 幂等 | 必须携带 `Idempotency-Key` |
#### 入参说明
| 字段 | 类型 | 必填 | 说明 |
| --- | --- | --- | --- |
| `format` | string | 是 | `docx` 或 `pdf` |
#### 入参示例
```http
POST /v1/workbench/ai/table-analyses/airec_tbl_6LP0nM9s3B/export HTTP/1.1
Authorization: Bearer <token>
X-MeetingIM-APIKey: <api_key>
X-IM-Schema: 1
X-Tenant-Code: system
X-Request-ID: 01K8ZC3FZ6BTX9Z1SK8HV7QYWP
Idempotency-Key: ai_export_01K8ZC3FZ6BTX9Z1SK8HV7QYWP
Content-Type: application/json
{"format": "docx"}
```
#### 出参示例
```json
{
"code": 0,
"data": {
"file_id": "fil_export_9pLm2Q",
"file_name": "8月销售数据-解读报告.docx",
"download_url": "https://api.118im.com/v0/file/s/fil_export_9pLm2Q",
"expires_at": "2026-09-26T08:42:00.000Z"
},
"request_id": "01K8ZC3FZ6BTX9Z1SK8HV7QYWP"
}
```
## 4. AI 美文与日报/月报接入
AI 美文是同步接口,用于优化短文案。日报、月报仍使用原提交接口,AI 只负责生成或优化输入框内容。
### 4.1 AI 美文
#### 需求图片
<img src="ai/AI美文.png" alt="AI美文" width="360">
| 项 | 内容 |
| --- | --- |
| 状态 | `新增` |
| 方法 | `POST /v1/workbench/ai/text/polish` |
| 用途 | 对原文进行润色,返回可直接使用的优化文案 |
| 鉴权 | 需要 IM 登录态 |
| 幂等 | 必须携带 `Idempotency-Key` |
#### 入参说明
| 字段 | 类型 | 必填 | 说明 |
| --- | --- | --- | --- |
| `source_text` | string | 是 | 原文,最长 300 字 |
| `scene` | string | 是 | `general`、`daily_report`、`monthly_report` |
| `tone` | string | 否 | 语气,默认 `professional` |
| `max_output_chars` | number | 否 | 输出最大长度,默认 300 |
#### 入参示例
```http
POST /v1/workbench/ai/text/polish HTTP/1.1
Authorization: Bearer <token>
X-MeetingIM-APIKey: <api_key>
X-IM-Schema: 1
X-Tenant-Code: system
X-Request-ID: 01K8ZC3FZ6BTX9Z1SK8HV7QYWQ
Idempotency-Key: ai_polish_01K8ZC3FZ6BTX9Z1SK8HV7QYWQ
Content-Type: application/json
{
"source_text": "今天完成接口联调,处理了几个bug,明天继续测试。",
"scene": "daily_report",
"tone": "professional",
"max_output_chars": 300
}
```
#### 出参说明
| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `polished_text` | string | 润色后的文案 |
| `source_text` | string | 原文回显 |
| `usage` | object | 本次用量信息 |
#### 出参示例
```json
{
"code": 0,
"data": {
"source_text": "今天完成接口联调,处理了几个bug,明天继续测试。",
"polished_text": "今日已完成接口联调,并修复联调过程中发现的多个问题。明日将继续推进测试验证,确保相关功能稳定可用。",
"usage": {
"remaining_today": 17
}
},
"request_id": "01K8ZC3FZ6BTX9Z1SK8HV7QYWQ"
}
```
#### 对接重点
1. 前端“重新生成”再次调用本接口,使用新的幂等键。
2. 前端“使用文案”只把 `polished_text` 回填到原业务输入框,不自动提交日报或月报。
3. 输出仍允许用户编辑,业务提交以用户最终输入为准。
### 4.2 日报 AI 接入
#### 需求图片
<img src="ai/日报.png" alt="日报 AI 接入" width="360">
| 项 | 内容 |
| --- | --- |
| 状态 | `复用 + 需改造` |
| AI 接口 | `POST /v1/workbench/ai/text/polish` |
| 业务接口 | 沿用日报新增/编辑接口 |
| 用途 | 在日报“今日工作总结”等输入框中接入 AI 美文 |
| 鉴权 | 需要 IM 登录态 |
#### 对接流程
1. 用户在日报输入框填写原文。
2. 前端点击“AI 美文”,调用 4.1,`scene=daily_report`。
3. 前端展示 AI 美文弹层,用户可重新生成或使用文案。
4. 用户点击“使用文案”后,前端把 `polished_text` 回填到日报字段。
5. 用户点击“提交”后,仍调用原日报提交接口。
#### 入参示例
```json
{
"source_text": "完成工作台接口联调,修复会议笔记字段问题。",
"scene": "daily_report",
"tone": "professional",
"max_output_chars": 300
}
```
#### 对接重点
1. AI 不改变日报是否可提交、是否冲突、是否重复的业务规则。
2. 日报保存成功后不需要额外保存 AI 记录;如后端需要审计,可写入用量日志。
### 4.3 月报 AI 接入
#### 需求图片
<img src="ai/月报-发布中.png" alt="月报 AI 接入" width="360">
| 项 | 内容 |
| --- | --- |
| 状态 | `复用 + 需改造` |
| AI 接口 | `POST /v1/workbench/ai/text/polish` |
| 业务接口 | 沿用月报新增/编辑接口 |
| 用途 | 在月报“本月工作总结”“其他事项”等输入框中接入 AI 美文 |
| 鉴权 | 需要 IM 登录态 |
#### 对接流程
1. 用户在月报输入框填写原文。
2. 前端点击对应输入框附近的“AI 美文”。
3. 前端调用 4.1,`scene=monthly_report`。
4. 用户确认使用后,前端只回填当前字段。
5. 月报发布仍调用原月报接口。
#### 对接重点
1. 月报字段上限以月报业务接口为准;AI 输入建议最长 1000 字,输出不超过原字段限制。
2. “发布中”状态由原月报接口控制,AI 美文接口不返回发布状态。
## 5. 会议笔记 AI 总结接口
会议 AI 总结挂在会议笔记详情下,使用会议附件、会议标题、参与人等已有会议上下文生成摘要。会议列表、会议笔记列表和文件上传仍沿用既有工作台会议接口。
### 5.1 创建会议 AI 总结任务
#### 需求图片
<img src="ai/会议笔记- AI总结.png" alt="会议笔记 AI 总结" width="360">
| 项 | 内容 |
| --- | --- |
| 状态 | `新增 + 需改造` |
| 方法 | `POST /v1/workbench/meetings/{meeting_id}/ai-summary` |
| 用途 | 对会议笔记附件或会议内容生成 AI 总结 |
| 鉴权 | 需要 IM 登录态和会议笔记查看权限 |
| 幂等 | 必须携带 `Idempotency-Key` |
#### 入参说明
| 字段 | 类型 | 必填 | 说明 |
| --- | --- | --- | --- |
| `meeting_id` | string | 是 | 路径参数 |
| `file_ids[]` | array | 否 | 指定参与总结的会议附件;为空时使用会议下可读附件 |
| `summary_type` | string | 否 | 默认 `standard` |
| `force_regenerate` | boolean | 否 | 已存在总结时是否重新生成,默认 `false` |
#### 入参示例
```http
POST /v1/workbench/meetings/mtg_7YUHoLTqrl4ZO_G6/ai-summary HTTP/1.1
Authorization: Bearer <token>
X-MeetingIM-APIKey: <api_key>
X-IM-Schema: 1
X-Tenant-Code: system
X-Request-ID: 01K8ZC3FZ6BTX9Z1SK8HV7QYWR
Idempotency-Key: ai_meeting_01K8ZC3FZ6BTX9Z1SK8HV7QYWR
Content-Type: application/json
{
"file_ids": ["fil_note_1", "fil_note_2"],
"summary_type": "standard",
"force_regenerate": false
}
```
#### 出参示例
```json
{
"code": 0,
"data": {
"task_id": "aitask_mtg_3Rn8qU2b6X",
"meeting_id": "mtg_7YUHoLTqrl4ZO_G6",
"status": "queued",
"polling_interval_ms": 1500
},
"request_id": "01K8ZC3FZ6BTX9Z1SK8HV7QYWR"
}
```
#### 对接重点
1. 无会议查看权限返回 `FORBIDDEN`。
2. 会议没有可分析内容时返回 `VALIDATION_FAILED`,details 中标明 `missing_source=true`。
3. 已有总结且 `force_regenerate=false` 时可直接返回现有总结或返回 `CONFLICT`,建议返回现有总结以减少前端分支。
### 5.2 查询会议 AI 总结
| 项 | 内容 |
| --- | --- |
| 状态 | `新增` |
| 方法 | `GET /v1/workbench/meetings/{meeting_id}/ai-summary` |
| 用途 | 获取会议 AI 总结内容 |
| 鉴权 | 需要 IM 登录态和会议笔记查看权限 |
| 幂等 | 读接口无需幂等 |
#### 出参说明
| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `meeting_id` | string | 会议 ID |
| `summary_id` | string | 总结 ID |
| `status` | string | `empty`、`processing`、`succeeded`、`failed` |
| `conclusions[]` | array | 会议结论 |
| `decisions[]` | array | 关键决策 |
| `action_items[]` | array | 后续安排 |
| `editable` | boolean | 当前用户是否可编辑 |
| `updated_at` | string | 更新时间 |
#### 出参示例
```json
{
"code": 0,
"data": {
"meeting_id": "mtg_7YUHoLTqrl4ZO_G6",
"summary_id": "aisum_7Kp2N8aV",
"status": "succeeded",
"conclusions": [
"工作台 AI 首版接入智能文档、智能表格和 AI 美文。",
"日报、月报沿用原业务提交接口。"
],
"decisions": [
"表格解读采用异步任务,成功后默认生成记录。",
"会议 AI 总结挂载在会议笔记详情页。"
],
"action_items": [
{
"owner_user_id": "usrABAAnqj42BU",
"owner_display_name": "张三",
"content": "补充 AI 任务表结构设计",
"due_at": "2026-09-26T10:00:00.000Z",
"status": "pending"
}
],
"editable": true,
"updated_at": "2026-09-25T08:50:00.000Z"
},
"request_id": "01K8ZC3FZ6BTX9Z1SK8HV7QYWS"
}
```
#### 对接重点
1. `status=empty` 时前端展示空态和“生成 AI 总结”入口。
2. `status=processing` 时前端可复用任务轮询,也可定时刷新本接口。
3. `action_items.owner_user_id` 必须是字符串,不允许返回数字。
### 5.3 编辑会议 AI 总结
| 项 | 内容 |
| --- | --- |
| 状态 | `新增` |
| 方法 | `PUT /v1/workbench/meetings/{meeting_id}/ai-summary` |
| 用途 | 保存用户手动编辑后的 AI 总结 |
| 鉴权 | 需要会议笔记编辑权限 |
| 幂等 | 必须携带 `Idempotency-Key` |
#### 入参示例
```http
PUT /v1/workbench/meetings/mtg_7YUHoLTqrl4ZO_G6/ai-summary HTTP/1.1
Authorization: Bearer <token>
X-MeetingIM-APIKey: <api_key>
X-IM-Schema: 1
X-Tenant-Code: system
X-Request-ID: 01K8ZC3FZ6BTX9Z1SK8HV7QYWT
Idempotency-Key: ai_meeting_save_01K8ZC3FZ6BTX9Z1SK8HV7QYWT
Content-Type: application/json
{
"summary_id": "aisum_7Kp2N8aV",
"conclusions": ["工作台 AI 首版接入三类能力。"],
"decisions": ["会议 AI 总结挂载在会议笔记详情页。"],
"action_items": [
{
"owner_user_id": "usrABAAnqj42BU",
"content": "补充 AI 任务表结构设计",
"due_at": "2026-09-26T10:00:00.000Z",
"status": "pending"
}
]
}
```
#### 出参示例
```json
{
"code": 0,
"data": {
"meeting_id": "mtg_7YUHoLTqrl4ZO_G6",
"summary_id": "aisum_7Kp2N8aV",
"updated_at": "2026-09-25T09:00:00.000Z"
},
"request_id": "01K8ZC3FZ6BTX9Z1SK8HV7QYWT"
}
```
#### 对接重点
1. 编辑保存后内容不再标记为纯 AI 原文,前端仍可展示“由 AI 自动生成,如有不准确可手动编辑”。
2. 会议总结编辑权限建议复用会议笔记 `can_replace` 或 `can_upload` 权限,最终以后端权限判断为准。
## 6. AI 记录与任务通用接口
### 6.1 通用 AI 记录列表
| 项 | 内容 |
| --- | --- |
| 状态 | `新增` |
| 方法 | `GET /v1/workbench/ai/records` |
| 用途 | 按类型查询 AI 记录,供后续统一记录中心使用 |
| 鉴权 | 需要 IM 登录态 |
| 幂等 | 读接口无需幂等 |
#### 入参说明
| 字段 | 类型 | 必填 | 说明 |
| --- | --- | --- | --- |
| `type` | string | 否 | `smart_document`、`smart_table` |
| `query` | string | 否 | 搜索词 |
| `cursor` | string | 否 | 分页游标 |
| `limit` | number | 否 | 默认 20,最大 50 |
#### 出参示例
```json
{
"code": 0,
"data": {
"items": [
{
"record_id": "airec_doc_5Jv8mVb21Q",
"type": "smart_document",
"title": "新项目沟通纪要",
"summary": "确认本周完成需求评审,下周启动开发。",
"status": "succeeded",
"created_at": "2026-09-25T08:35:00.000Z",
"route": "/workbench/ai/document/airec_doc_5Jv8mVb21Q"
},
{
"record_id": "airec_tbl_6LP0nM9s3B",
"type": "smart_table",
"title": "8月销售数据",
"summary": "销售额增长 12.3%,退款率下降。",
"status": "succeeded",
"created_at": "2026-09-25T08:42:00.000Z",
"route": "/workbench/ai/table/airec_tbl_6LP0nM9s3B"
}
],
"next_cursor": "",
"has_more": false
},
"request_id": "01K8ZC3FZ6BTX9Z1SK8HV7QYWU"
}
```
### 6.2 删除 AI 记录
| 项 | 内容 |
| --- | --- |
| 状态 | `新增` |
| 方法 | `DELETE /v1/workbench/ai/records/{record_id}` |
| 用途 | 删除当前用户自己的 AI 记录 |
| 鉴权 | 需要 IM 登录态 |
| 幂等 | 删除接口幂等,同一记录重复删除返回成功 |
#### 入参示例
```http
DELETE /v1/workbench/ai/records/airec_doc_5Jv8mVb21Q HTTP/1.1
Authorization: Bearer <token>
X-MeetingIM-APIKey: <api_key>
X-IM-Schema: 1
X-Tenant-Code: system
X-Request-ID: 01K8ZC3FZ6BTX9Z1SK8HV7QYWV
```
#### 出参示例
```json
{
"code": 0,
"data": {
"record_id": "airec_doc_5Jv8mVb21Q",
"deleted": true
},
"request_id": "01K8ZC3FZ6BTX9Z1SK8HV7QYWV"
}
```
### 6.3 AI 任务事件
| 项 | 内容 |
| --- | --- |
| 状态 | `可后续扩展` |
| 事件 | `workbench.ai.task_updated` |
| 用途 | 服务端主动推送 AI 任务状态变化,减少轮询 |
| 鉴权 | 复用 IM WebSocket 登录态 |
#### 事件示例
```json
{
"topic": "workbench.ai.task_updated",
"data": {
"task_id": "aitask_tbl_2Fh9aQx73K",
"feature": "smart_table",
"status": "succeeded",
"progress": 100,
"record_id": "airec_tbl_6LP0nM9s3B",
"updated_at": "2026-09-25T08:42:00.000Z"
}
}
```
#### 对接重点
1. 首版建议优先使用 HTTP 轮询,WebSocket 事件作为后续优化。
2. 即使接入事件,前端仍需保留轮询兜底。
## 7. 对接重难点
### 7.1 IM 登录与 workbench AI 边界
AI 接口只接受 IM 登录态,不单独做 AI 登录。租户、用户、部门权限全部由 IM Token 和工作台权限体系派生。前端不要在请求体中传用户身份字段。
### 7.2 异步任务与用户体验
智能文档、智能表格、会议 AI 总结都可能耗时。前端必须处理 `queued`、`processing`、`succeeded`、`failed`、`canceled`,并在用户离开页面后可通过记录或详情恢复结果。
### 7.3 文件服务与 AI 服务衔接
智能表格先上传文件,再创建解读任务。后端创建任务时必须校验 `file_id` 属于当前租户和当前用户,并检查文件类型、大小、有效期。AI 服务不得直接信任前端传入的 `file_name`、`file_type`。
### 7.4 字段类型一致性
所有用户 ID、会议 ID、记录 ID、任务 ID、文件 ID 都是字符串。尤其是 `owner_user_id`、`attendee_user_ids`、`recorder_user_id`、`participant.user_id` 不允许使用 number。
### 7.5 内容安全与合规
AI 输入和输出都需要内容安全检查。命中安全规则时返回 `AI_CONTENT_REJECTED`;前端展示温和提示,不展示供应商原始错误。日志中不得打印完整用户输入、完整模型输出、Token、文件下载地址和内部密钥。
### 7.6 用量限制与灰度开关
AI 能力需要按租户和用户配置开关、每日次数、并发数和文件大小。前端展示入口前先读取 1.1;后端接口仍必须强校验,不能只依赖前端隐藏入口。
### 7.7 会议 AI 总结权限
会议 AI 总结不能只判断会议 ID 存在。生成、查看、编辑必须分别判断会议笔记权限;附件参与总结前也要校验附件属于该会议且当前用户可读。
## 8. 接口清单
| 模块 | 接口 | 方法 | 状态 | 说明 |
| --- | --- | --- | --- | --- |
| AI 能力 | `/v1/workbench/ai/capabilities` | GET | 新增 | 获取 AI 能力开关和用量 |
| 工作台应用 | `/v1/workbench/apps` | GET | 需改造 | 默认应用列表包含 AI 应用 |
| 工作台搜索 | `/v1/workbench/apps/search` | GET | 需改造 | 搜索工作台应用 |
| 智能文档 | `/v1/workbench/ai/documents/generate` | POST | 新增 | 创建文档生成任务 |
| AI 任务 | `/v1/workbench/ai/tasks/{task_id}` | GET | 新增 | 查询任务进度与结果 |
| 智能文档 | `/v1/workbench/ai/documents` | POST | 新增 | 保存生成文档 |
| 智能文档 | `/v1/workbench/ai/documents` | GET | 新增 | 文档记录列表 |
| 智能文档 | `/v1/workbench/ai/documents/{record_id}` | GET | 新增 | 文档记录详情 |
| 文件上传 | `/v0/file/u/` | POST | 复用 | 上传表格源文件 |
| 智能表格 | `/v1/workbench/ai/table-analyses` | POST | 新增 | 创建表格解读任务 |
| AI 任务 | `/v1/workbench/ai/tasks/{task_id}/cancel` | POST | 新增 | 取消 AI 任务 |
| 智能表格 | `/v1/workbench/ai/table-analyses/{record_id}` | GET | 新增 | 报告解读详情 |
| 智能表格 | `/v1/workbench/ai/table-analyses` | GET | 新增 | 解读记录列表 |
| 智能表格 | `/v1/workbench/ai/table-analyses/{record_id}/export` | POST | 新增 | 导出解读报告 |
| AI 美文 | `/v1/workbench/ai/text/polish` | POST | 新增 | 文案润色 |
| 会议总结 | `/v1/workbench/meetings/{meeting_id}/ai-summary` | POST | 新增 | 创建会议 AI 总结 |
| 会议总结 | `/v1/workbench/meetings/{meeting_id}/ai-summary` | GET | 新增 | 查询会议 AI 总结 |
| 会议总结 | `/v1/workbench/meetings/{meeting_id}/ai-summary` | PUT | 新增 | 编辑会议 AI 总结 |
| AI 记录 | `/v1/workbench/ai/records` | GET | 新增 | 通用记录列表 |
| AI 记录 | `/v1/workbench/ai/records/{record_id}` | DELETE | 新增 | 删除 AI 记录 |
## 9. 前后端联调建议
1. 先联调 `capabilities`、应用列表和搜索,确保入口展示一致。
2. 再联调 AI 美文,因为它是同步接口,最适合验证鉴权、租户、用量和错误包。
3. 智能文档联调重点是任务轮询、保存文档、文档记录。
4. 智能表格联调重点是文件上传、文件归属校验、任务步骤、报告详情和导出。
5. 会议 AI 总结最后联调,重点验证会议权限、附件权限和编辑保存。
6. 每个写接口都要测试同一 `Idempotency-Key` 重试、不同请求体冲突、Token 过期、跨租户访问、无权限访问。