# MIS-Paw 开放 API 使用文档 > 面向外部接入系统的开发者。当前提供文件上传和 Agent 对话两个接口。 > > API 根地址示例:`https://misagent.lcfuturecenter.com` ## 1. 快速开始 外部系统只需要使用 MIS-Paw 管理页面创建的完整 API Key。API Key 会唯一定位一个 Agent,因此请求中不需要传 `agentId`。 对外接口不要求登录态,也不要求 `Authorization`、`Clientid` 或 `Subsystem`。两个接口都必须携带: ```http X-Paw-Api-Key: <完整 API Key> ``` API Key 必须通过 HTTPS 传输,不要写入日志、前端源码、URL 查询参数或错误信息。管理页面列表中的 Key 可能被掩码显示,调用时请复制完整值。 ## 2. 接口总览 | 方法 | 路径 | 用途 | 请求类型 | 成功响应 | |---|---|---|---|---| | `POST` | `/api/files/upload` | 上传 Agent 对话附件 | `multipart/form-data` | JSON | | `POST` | `/api/shareChat` | 调用 Agent 对话 | `application/json` | SSE | 网关和服务部署在带有统一前缀的环境时,将前缀拼接到上述路径前。例如实际地址可能是 `/paw/api/shareChat`;请以部署环境提供的 API 根地址为准。 ## 3. 文件上传:`POST /api/files/upload` ### 3.1 请求 请求头: | Header | 必填 | 值 | |---|---:|---| | `X-Paw-Api-Key` | 是 | 当前 Agent 的完整 API Key | | `Content-Type` | 自动 | `multipart/form-data`,由 HTTP 客户端自动生成 boundary | 表单字段: | 字段 | 必填 | 类型 | 说明 | |---|---:|---|---| | `file` | 是 | Binary | 要上传的文件 | 示例: ```bash curl --fail-with-body -X POST "https://misagent.lcfuturecenter.com/api/files/upload" \ -H "X-Paw-Api-Key: <完整 API Key>" \ -F "file=@./demo.txt" ``` 不要手动设置 `Content-Type: multipart/form-data`,否则可能缺少 boundary;让 curl、浏览器或 SDK 自动设置。 ### 3.2 成功响应 ```http HTTP/1.1 200 OK Content-Type: application/json ``` ```json { "code": 200, "msg": "操作成功", "data": { "url": "/root/output/paw15004/.qwenpaw/workspaces/9U5Y2t5/media/1b3e01157eb74bb39c0329dc47d6235c_demo.txt", "fileName": "demo.txt", "fileSize": 84757 } } ``` `data.url` 是 QwenPaw 当前 Agent Workspace `media` 目录中的文件引用。它是不透明值,调用方必须完整保存并在对话请求中原样传回,不要拼接、截断、URL 解码后重组或自行构造本地路径。 文件上传调用不依赖缓存头完成业务处理;部署环境如配置了响应缓存策略,应将该响应设置为 `Cache-Control: no-store`。 上传接口不创建 Session,也不返回 `X-Paw-Session-Id`。文件真正被对话使用后,才会按 QwenPaw 原生机制进入聊天文件记录。 ## 4. Agent 对话:`POST /api/shareChat` ### 4.1 请求头 | Header | 必填 | 说明 | |---|---:|---| | `X-Paw-Api-Key` | 是 | 定位 Agent 并完成 API Key 鉴权 | | `X-Paw-Session-Id` | 否 | 续聊时传上一次响应中的值;首次请求可省略 | | `Accept` | 否 | 推荐 `text/event-stream`;缺少时默认为 SSE。当前仅支持流式,不支持 `application/json` | | `Content-Type` | 是 | `application/json` | 本接口不要求 `Authorization`、`Clientid`、`Subsystem`。不要把 API Key 或 Session ID 放在 URL 查询参数中。 ### 4.2 请求体 ```json { "message": "这个文件内容是什么", "files": [ { "url": "/root/output/paw15004/.qwenpaw/workspaces/9U5Y2t5/media/1b3e01157eb74bb39c0329dc47d6235c_demo.txt", "fileName": "demo.txt", "fileSize": 84757 } ] } ``` 字段说明: | 字段 | 必填 | 类型 | 说明 | |---|---:|---|---| | `message` | 是 | String | 用户消息;去除首尾空白后不能为空,即使只提问文件也必须填写 | | `files` | 否 | Array | 文件引用列表;不传等同于空数组 | | `files[].url` | 是(每个文件) | String | `/api/files/upload` 成功响应中的 `data.url`,必须原样传回 | | `files[].fileName` | 是(每个文件) | String | 上传响应中的 `data.fileName` | | `files[].fileSize` | 是(每个文件) | Long | 上传响应中的 `data.fileSize`,单位为字节 | 对外 DTO 不接收 `agentId`、`userId`、`sessionId`、`channel`、`stream` 或 QwenPaw Runtime 私有字段。 ## 5. 流式对话(SSE) ### 5.1 首次请求 省略 `X-Paw-Session-Id`,服务端会按 QwenPaw Console 规则生成 Session ID,并在响应头返回: ```bash curl -N --fail-with-body -X POST "https://misagent.lcfuturecenter.com/api/shareChat" \ -H "X-Paw-Api-Key: <完整 API Key>" \ -H "Accept: text/event-stream" \ -H "Content-Type: application/json" \ -d '{"message":"你好","files":[]}' ``` 成功响应头: ```http Content-Type: text/event-stream;charset=UTF-8 Cache-Control: no-cache, no-transform X-Paw-Session-Id: 1788156264286 ``` 响应体是现有 QwenPaw Console Chat 的 SSE 事件流,事件顺序和结束语义保持一致。客户端应按标准 SSE 读取 `data:` 事件,不要假设每一帧都是完整的最终答案。 ### 5.2 续聊 保存首次响应的 `X-Paw-Session-Id`,后续请求用同一个 API Key 和同一个 Session ID: ```bash curl -N --fail-with-body -X POST "https://misagent.lcfuturecenter.com/api/shareChat" \ -H "X-Paw-Api-Key: <完整 API Key>" \ -H "X-Paw-Session-Id: 1788156264286" \ -H "Accept: text/event-stream" \ -H "Content-Type: application/json" \ -d '{"message":"继续说明","files":[]}' ``` Session ID 是会话上下文标识,不是 API Key,也不是登录凭证。接入系统应按自己的用户或业务会话保存它;不同 API Key 不要主动共享同一个 Session ID。同一个 Session 同时只能有一个进行中的对话请求,否则可能返回 `409 SESSION_BUSY`。 ## 6. 错误处理 建连前的错误通常返回 MIS 统一 JSON 错误结构: ```json { "code": 401, "msg": "API Key 无效或已过期", "data": null, "errorCode": "API_KEY_INVALID" } ``` 常见状态码: | HTTP | 场景 | |---:|---| | `400` | `message` 为空、文件元数据缺失或 Session 格式不合法 | | `401` | 缺少、无效或已过期的 `X-Paw-Api-Key` | | `403` | API Key 已停用,或文件不属于该 Key 定位的 Agent Workspace | | `406` | `Accept` 不支持 | | `409` | 同一个 Agent/Session 已有进行中的 Chat | | `413` | 文件超过配置的大小限制 | | `422` | Agent 创建人的模型 Key 不可用 | | `503` | Agent 或 QwenPaw 实例不可用 | 如果 SSE 已经开始,之后发生的 Agent 错误仍以 SSE 事件返回,不会中途切换成 JSON。客户端需要同时处理 HTTP 建连错误和 SSE 错误事件。 ## 7. 文件+对话完整流程 1. 使用 `X-Paw-Api-Key` 调用 `/api/files/upload`。 2. 保存响应中的 `data.url`、`data.fileName`、`data.fileSize`。 3. 调用 `/api/shareChat`,将这三个值放入 `files`,并填写 `message`。 4. 保存响应头 `X-Paw-Session-Id`。 5. 后续续聊时使用同一个 API Key,并回传保存的 Session ID。 ```bash # 1. 上传文件 curl -sS -X POST "https://misagent.lcfuturecenter.com/api/files/upload" \ -H "X-Paw-Api-Key: <完整 API Key>" \ -F "file=@./demo.txt" # 2. 使用上传返回的 url 对话 curl -N -X POST "https://misagent.lcfuturecenter.com/api/shareChat" \ -H "X-Paw-Api-Key: <完整 API Key>" \ -H "Accept: text/event-stream" \ -H "Content-Type: application/json" \ -d '{ "message": "这个文件内容是什么", "files": [{ "url": "<上一步 data.url>", "fileName": "demo.txt", "fileSize": 84757 }] }' ``` ## 8. 浏览器跨域调用 如果由浏览器直接调用,预检请求不需要 API Key,但实际 `POST` 必须携带。前端需要能够读取 `X-Paw-Session-Id`,服务端跨域配置应允许以下请求头并暴露 Session 响应头: ```text Allowed-Headers: Content-Type, Accept, X-Paw-Api-Key, X-Paw-Session-Id Exposed-Headers: X-Paw-Session-Id, Content-Type, Cache-Control ``` 不要在浏览器端把完整 API Key 固化到公开前端代码中;更适合由受控的后端接入系统代理调用。 ## 9. 重试与费用提示 一期没有 HTTP 请求级幂等键。客户端在未收到完整响应时重试,可能重新启动一次 Agent 对话并产生新的模型费用;只有同一 Session 尚未结束时,才可能收到 `409 SESSION_BUSY`。请由调用方控制超时、重试次数和同一 Session 的并发请求。