# 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 ` | | `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.4.6 AI 推送结果类型 | 枚举 | 说明 | | --- | --- | | `text` | 文本结果,适用于 AI 美文、日报/月报润色、较短的智能文档草稿 | | `file` | 文件结果,适用于导出 docx、pdf 等文件;推送中返回文件服务下载地址 | | `record` | 记录结果,适用于智能表格、智能文档等已生成记录的能力 | | `summary` | 会议总结类结果,挂在会议下展示 | ### 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` 状态任务 | | 记录保存 | 智能文档生成成功后,必须显式保存才进入文档记录;智能表格解读成功后默认生成记录 | | 在线推送 | AI 任务完成后仅推送当前在线用户;离线用户不补推,上线后通过任务或记录接口重新拉取 | | 推送兜底 | 前端接入推送后仍需保留轮询和页面恢复拉取,推送只作为实时体验优化 | ## 1. 工作台 AI 入口与应用搜索 本章对应工作台首页、搜索默认页、搜索结果页和无结果页。工作台原有应用仍走既有接口;本文补充 AI 能力开关、限制和搜索字段。 ### 1.1 获取工作台 AI 能力 #### 需求图片 工作台 | 项 | 内容 | | --- | --- | | 状态 | `新增` | | 方法 | `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 X-MeetingIM-APIKey: 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 获取工作台应用搜索默认页 #### 需求图片 工作台搜索页面 | 项 | 内容 | | --- | --- | | 状态 | `需改造` | | 方法 | `GET /v1/workbench/apps` | | 用途 | 获取搜索页默认展示的常用应用和全部应用,包含 AI 应用 | | 鉴权 | 需要 IM 登录态 | | 幂等 | 读接口无需幂等 | #### 入参说明 | 字段 | 类型 | 必填 | 说明 | | --- | --- | --- | --- | | `include_ai` | boolean | 否 | 是否包含 AI 应用,默认 `true` | #### 入参示例 ```http GET /v1/workbench/apps?include_ai=true HTTP/1.1 Authorization: Bearer X-MeetingIM-APIKey: 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 搜索工作台应用 #### 需求图片 工作台搜索结果 工作台搜索无结果 | 项 | 内容 | | --- | --- | | 状态 | `需改造` | | 方法 | `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 X-MeetingIM-APIKey: 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 创建智能文档生成任务 #### 需求图片 智能文档输入 智能文档生成结果 | 项 | 内容 | | --- | --- | | 状态 | `新增` | | 方法 | `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 X-MeetingIM-APIKey: 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 X-MeetingIM-APIKey: 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 保存智能文档 #### 需求图片 智能文档编辑保存 | 项 | 内容 | | --- | --- | | 状态 | `新增` | | 方法 | `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 X-MeetingIM-APIKey: 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 文档记录列表 #### 需求图片 文档记录 | 项 | 内容 | | --- | --- | | 状态 | `新增` | | 方法 | `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 X-MeetingIM-APIKey: 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 X-MeetingIM-APIKey: 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 上传智能表格源文件 #### 需求图片 智能表格 选择文件 文件上传成功 xlsx 文件上传成功 xls 文件上传成功 csv | 项 | 内容 | | --- | --- | | 状态 | `复用` | | 方法 | `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: X-MeetingIM-Auth: 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 X-MeetingIM-APIKey: 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 查询表格解读进度 #### 需求图片 智能解读报告处理中 | 项 | 内容 | | --- | --- | | 状态 | `新增` | | 方法 | `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 X-MeetingIM-APIKey: 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 获取报告解读详情 #### 需求图片 报告解读 | 项 | 内容 | | --- | --- | | 状态 | `新增` | | 方法 | `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 解读记录列表 #### 需求图片 解读记录 | 项 | 内容 | | --- | --- | | 状态 | `新增` | | 方法 | `GET /v1/workbench/ai/table-analyses` | | 用途 | 查询当前用户的表格解读记录 | | 鉴权 | 需要 IM 登录态 | | 幂等 | 读接口无需幂等 | #### 入参说明 | 字段 | 类型 | 必填 | 说明 | | --- | --- | --- | --- | | `query` | string | 否 | 按标题或文件名搜索 | | `cursor` | string | 否 | 分页游标 | | `limit` | number | 否 | 默认 20,最大 50 | #### 出参说明 | 字段 | 类型 | 说明 | | --- | --- | --- | | `items[].record_id` | string | 解读记录 ID | | `items[].title` | string | 解读报告标题 | | `items[].summary` | string | 解读摘要,列表页可展示前几行 | | `items[].format` | string | 展示用文件格式,取值为小写文件后缀,例如 `xlsx`、`xls`、`csv` | | `items[].file_type` | string | 原始文件类型,当前与 `format` 一致,保留给前端逻辑判断 | | `items[].file_name` | string | 原始文件名 | | `items[].file_size` | number | 原始文件大小,单位 byte | | `items[].status` | string | 解读状态,见 0.4.2 | | `items[].created_at` | string | 创建时间,UTC RFC3339 | | `items[].updated_at` | string | 更新时间,UTC RFC3339 | | `next_cursor` | string | 下一页游标,为空表示无下一页 | | `has_more` | boolean | 是否还有下一页 | #### 出参示例 ```json { "code": 0, "data": { "items": [ { "record_id": "airec_tbl_6LP0nM9s3B", "title": "8月销售数据", "summary": "本次报表展示 8 月销售数据的核心指标、异常波动和区域表现。", "format": "xlsx", "file_name": "sales_august.xlsx", "file_type": "xlsx", "file_size": 18146135, "status": "succeeded", "created_at": "2026-09-25T08:42:00.000Z", "updated_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 X-MeetingIM-APIKey: 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 美文 #### 需求图片 AI美文 | 项 | 内容 | | --- | --- | | 状态 | `新增` | | 方法 | `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 X-MeetingIM-APIKey: 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 接入 #### 需求图片 日报 AI 接入 | 项 | 内容 | | --- | --- | | 状态 | `复用 + 需改造` | | 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 接入 #### 需求图片 月报 AI 接入 | 项 | 内容 | | --- | --- | | 状态 | `复用 + 需改造` | | 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 总结任务 #### 需求图片 会议笔记 AI 总结 | 项 | 内容 | | --- | --- | | 状态 | `新增 + 需改造` | | 方法 | `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 X-MeetingIM-APIKey: 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 X-MeetingIM-APIKey: 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 X-MeetingIM-APIKey: 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 登录态 | #### 推送边界 1. 仅推送在线用户。用户离线时服务端不保存离线 AI 推送、不补发历史推送。 2. 用户重新上线、重新进入工作台 AI 页面时,前端通过任务详情、记录列表或业务详情接口恢复状态。 3. 推送内容只放任务状态、结果索引和轻量结果;完整长文本、大对象和权限敏感内容仍以 HTTP 详情接口为准。 4. 文件结果不推裸 OSS 签名地址,统一推 IM 文件服务稳定地址:`/v0/file/s/{file_id}` 或其绝对 URL。 5. 推送丢失、WebSocket 断线、App 切后台等场景下,前端必须保留轮询兜底。 #### 通用事件结构 ```json { "topic": "workbench.ai.task.updated", "data": { "task_id": "aitask_tbl_2Fh9aQx73K", "feature": "smart_table", "status": "succeeded", "progress": 100, "result_type": "record", "record_id": "airec_tbl_6LP0nM9s3B", "result": { "title": "8月销售数据解读", "summary": "销售额整体平稳,建议重点关注渠道结构和异常订单。" }, "updated_at": "2026-09-25T08:42:00.000Z" } } ``` #### 字段说明 | 字段 | 类型 | 必填 | 说明 | | --- | --- | --- | --- | | `task_id` | string | 是 | AI 任务 ID | | `feature` | string | 是 | AI 能力类型,见 0.4.1 | | `status` | string | 是 | `succeeded`、`failed`、`canceled` 为主要推送状态 | | `progress` | number | 否 | 进度,完成态一般为 `100` | | `result_type` | string | 否 | `text`、`file`、`record`、`summary` | | `record_id` | string | 否 | 记录类结果 ID | | `meeting_id` | string | 否 | 会议总结所属会议 ID | | `summary_id` | string | 否 | 会议总结 ID | | `result` | object | 否 | 轻量结果体,按 result_type 区分 | | `error` | object | 否 | 失败信息,包含 `reason`、`message` | | `updated_at` | string | 是 | 更新时间,UTC RFC3339 | #### result 示例 文本结果: ```json { "result_type": "text", "result": { "text": "润色后的文本内容", "scene": "daily_report_polish" } } ``` 文件结果: ```json { "result_type": "file", "result": { "file_id": "IHC4k7rlpo0.docx", "file_name": "阿德勒-解读报告.docx", "mime_type": "application/vnd.openxmlformats-officedocument.wordprocessingml.document", "file_size": 2870, "download_url": "https://api.118im.com/v0/file/s/IHC4k7rlpo0.docx" } } ``` 记录结果: ```json { "result_type": "record", "record_id": "airec_tbl_6LP0nM9s3B", "result": { "title": "8月销售数据解读", "summary": "销售额整体平稳,建议关注渠道结构。" } } ``` 会议总结结果: ```json { "result_type": "summary", "meeting_id": "mtg_7YUHoLTqrl4ZO_G6", "summary_id": "aisum_3Rn8qU2b6X", "result": { "conclusion_count": 3, "action_item_count": 2 } } ``` 失败结果: ```json { "task_id": "aitask_tbl_2Fh9aQx73K", "feature": "smart_table", "status": "failed", "progress": 100, "error": { "reason": "AI_TASK_FAILED", "message": "生成失败,请重试" }, "updated_at": "2026-09-25T08:42:00.000Z" } ``` #### 各接口推送建议 | 接口/能力 | 是否异步 | 是否推送 | result_type | 推送内容建议 | | --- | --- | --- | --- | --- | | `POST /v1/workbench/ai/documents/generate` 智能文档生成 | 是 | 是 | `text` 或 `record` | 内容较短可直接推 `title`、`content_plain`、`content_markdown`;内容较长只推 `task_id` 和摘要,前端拉任务详情 | | `POST /v1/workbench/ai/documents` 保存文档 | 否 | 否 | - | 用户主动保存,HTTP 返回即可 | | `POST /v1/workbench/ai/table-analyses` 智能表格解读 | 是 | 是 | `record` | 推 `record_id`、标题、摘要;前端可直接展示完成卡片,点开时拉详情 | | `POST /v1/workbench/ai/table-analyses/{record_id}/export` 导出报告 | 可异步 | 是 | `file` | 推 `file_id`、`file_name`、`mime_type`、`file_size`、`download_url` | | `POST /v1/workbench/ai/text/polish` AI 美文 | 可同步;超过 2 秒建议异步 | 异步时推 | `text` | 推润色后的 `text`,内容过长时只推摘要并拉任务详情 | | 日报 AI 润色 | 可同步;超过 2 秒建议异步 | 异步时推 | `text` | 推润色后的日报内容或草稿 ID | | 月报 AI 润色 | 可同步;超过 2 秒建议异步 | 异步时推 | `text` | 推 `work_summary`、`next_plan` 或草稿 ID | | `POST /v1/workbench/meetings/{meeting_id}/ai-summary` 会议 AI 总结 | 是 | 是 | `summary` | 推 `meeting_id`、`summary_id`、结论数、待办数;完整内容拉详情 | | `GET /v1/workbench/ai/tasks/{task_id}` 查询任务 | 否 | 否 | - | 前端主动拉取,作为推送兜底 | | `POST /v1/workbench/ai/tasks/{task_id}/cancel` 取消任务 | 否 | 可选 | - | 多端在线时可推 `status=canceled`;单端场景可只依赖 HTTP 返回 | #### 对接重点 1. 推送用于“在线即时更新”,不是最终数据源;最终状态以 HTTP 查询为准。 2. 前端收到 `succeeded` 后,可优先使用推送中的轻量结果更新 UI;需要完整内容时再拉详情。 3. 前端收到 `file` 类型结果后,可直接展示下载按钮,下载地址使用 `download_url`。 4. 前端收到 `failed` 后展示失败并允许重试,不展示供应商原始错误。 5. App 启动、WebSocket 重连、进入 AI 页面时,前端重新拉任务或记录列表恢复离线期间完成的任务。 ## 7. 对接重难点 ### 7.1 IM 登录与 workbench AI 边界 AI 接口只接受 IM 登录态,不单独做 AI 登录。租户、用户、部门权限全部由 IM Token 和工作台权限体系派生。前端不要在请求体中传用户身份字段。 ### 7.2 异步任务与用户体验 智能文档、智能表格、会议 AI 总结都可能耗时。前端必须处理 `queued`、`processing`、`succeeded`、`failed`、`canceled`,并在用户离开页面后可通过任务、记录或业务详情恢复结果。 推荐交互流程: 1. 创建任务接口立即返回 `task_id`、`status=queued`、`polling_interval_ms`,前端进入 loading 或后台任务状态。 2. 用户在线时,服务端通过 IM WebSocket 推送 `workbench.ai.task.updated`,前端收到完成事件后直接刷新 UI。 3. 用户离线、App 切后台、WebSocket 断线时,服务端不补发离线 AI 推送;前端重新上线后主动拉任务详情、AI 记录列表或业务详情。 4. 推送结果为 `text` 时,短文本可直接展示;长文本以 HTTP 任务详情为准。 5. 推送结果为 `file` 时,前端直接使用 `download_url` 展示下载入口;该地址应为 IM 文件服务稳定地址,不是裸 OSS 签名地址。 6. 推送结果为 `record` 或 `summary` 时,前端可先展示标题和摘要,点开详情时再请求对应详情接口。 7. 同一账号多端在线时,所有在线端都可以收到任务完成推送;各端仍需按页面状态决定是否自动展示或只更新角标。 8. 失败、取消也应更新本地任务状态;失败文案按 `error.reason` 做本地化,不展示供应商原始报错。 ### 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 过期、跨租户访问、无权限访问。