URI 采用增强 RESTful 形式:URL 前缀做安全认证区分,版本号做 API 版本控制(统一放入 URL,如 /v{n}/——整数版本号对应大功能发布 v1 / v2,浮点版本号只补充 API,如 v1.1 / v1.2)。
| 前缀 | 作用 | 示例 |
|---|---|---|
open | 互联网公开接口,无需认证 | /open/v1.2/user/接口方法名 |
auth | 互联网认证接口,需要认证 | /auth/v1.2/user/接口方法名 |
lan | 局域网内部接口,仅局域网内调用 | /lan/v1.2/user/接口方法名 |
self | 局域网私有接口,仅私有领域服务调用 | /self/v1.2/user/接口方法名 |
paas | 平台业务接口,为外部业务提供集成对接 | /paas/v1.2/user/接口方法名 |
paasCallback | 平台回调接口,由外部服务实现、平台回调 | /paasCallback/v1.2/user/接口方法名 |
URL 方法名前缀与 Java 方法命名一致(get/list/page/count/insert/delete/update,动作类无前缀);HTTP 方法映射:POST=增、DELETE=删、PUT=改、GET=查、POST=动作。
| 接口前缀 | /open/v1/(公开接口)——接入认证体系后升级 /auth/v1/,前缀即安全等级,网关按前缀统一管控,接口路径零改动 |
|---|---|
| 请求格式 | Content-Type: application/json(文件流端点除外) |
| 响应格式 | 统一包装 JSON(流式接口为 SSE 逐块透传) |
| 鉴权分级 | 终端用户通道免验(IP 限流保护);查看 / 操作类接口凭查看密钥白名单;截图文件流凭 HMAC 签名 URL(30 分钟限时) |
| 链路追踪 | 全部同步响应携带 traceId——用户报障凭一个 traceId 回查全链路日志 |
{
"code": 200, // HTTP 状态码语义(同步接口)
"msg": "成功", // 可直接展示的提示
"flag": true, // 成功判定:失败为 false(code=600 业务异常)
"traceId": "a1bde0ba625de731", // 链路追踪码——报障回查的唯一凭据
"data": { ... } // 业务数据
}| 字段 | 类型 | 说明 |
|---|---|---|
code | int | HTTP 状态码语义(同步接口) |
msg | String | 响应提示;flag=false 时为用户友好提示(如「该反馈已被 张三 认领」) |
flag | boolean | 成功判定,前端以本字段做成功 / 失败分支 |
traceId | String | 链路追踪码 |
data | Object | 业务数据 |
| 业务码 | HTTP | 语义 |
|---|---|---|
YAOSHU_CODE_UNAVAILABLE | 503 | 核心服务不可用 |
LLM_PROXY_ERROR | 502 | 模型调用失败(上游语义已归一) |
INTERNAL_ERROR | 500 | 服务器内部错误 |
参数与业务规则类拒绝不走异常堆栈,直接以 flag=false + msg 返回,提示语面向用户可读。反馈模块的典型提示(节选):
| 提示 | 触发场景 |
|---|---|
反馈材料超过1MB限制 / 会话转写超过15MB限制 | 提交材料超出容量边界(源头拒绝,不落库) |
截图附件不能超过9张 / 单张截图不能超过500KB(压缩后) | 截图附件越限 |
缺少查看权限:未携带访问密钥 / 缺少查看权限:密钥无效 | 白名单拒绝(fail-closed:未配置密钥时同样拒绝) |
该反馈已被 {claimedBy} 认领 / 任务不存在 | 状态机冲突(冲突明细见 03 节认领端点) |
反馈提交过于频繁 | IP 限流触发 |
四个对外模块共 12 个端点。鉴权三档:免验 · IP 限流 终端用户通道、查看密钥 团队操作通道、签名 URL 限时文件流。
| 模块 | 方法 | 路径 | 说明 | 鉴权 |
|---|---|---|---|---|
| 系统 | GET | /open/v1/system/health | 健康检查 | 免验 · IP 限流 |
| 版本更新 | GET | /open/v1/app/update/manifest | 版本更新清单 | 免验 · IP 限流 |
| 模型代理 | POST | /open/v1/llm/chat/completions | 对话补全(OpenAI 兼容 · SSE 流式) | 免验 · IP 限流 |
| 反馈与认领工单 | POST | /open/v1/diagnostic/task/insert | 提交反馈(落库入池 + 异步自动分类) | 免验 · IP 限流 |
| POST | /open/v1/diagnostic/task/claim | 认领(条件更新防抢) | 查看密钥 | |
| POST | /open/v1/diagnostic/task/release | 释放回池(仅认领人) | 查看密钥 | |
| POST | /open/v1/diagnostic/task/resolve | 标记完成(仅认领人) | 查看密钥 | |
| POST | /open/v1/diagnostic/task/discard | 删除(仅待认领态,附件级联清理) | 查看密钥 | |
| GET | /open/v1/diagnostic/task/list | 任务列表(按状态过滤) | 查看密钥 | |
| GET | /open/v1/diagnostic/task/get | 任务详情(材料全文 + 签名图片地址) | 查看密钥 | |
| GET | /open/v1/diagnostic/task/mine | 我的反馈回执(按设备标识) | 免验 · IP 限流 | |
| GET | /open/v1/diagnostic/task/image | 截图附件文件流 | 签名 URL |
pending_claim 待认领 → claimed 已认领 → resolved 已解决;claimed 可释放回 pending_claim,pending_claim 可删除为 discarded(终态留档)。全部流转由服务端按状态机裁决,非法流转直接拒绝。关键端点的请求 / 响应与错误语义(其余端点按 02 节清单语义直连):
验证后端工程启动成功——部署后第一个探活的端点。
{
"code": 200,
"msg": "成功",
"flag": true,
"traceId": null,
"data": "爻枢 Code 后端运行中"
}客户端启动时拉取版本更新清单(最新版本号、下载地址、更新策略)。更新策略支持外部配置覆盖、坏配置自动回退内置默认——策略文件解析失败的兜底行为有专门测试覆盖。
OpenAI 兼容的流式对话端点:请求在服务端完成规则与角色注入后转发上游模型,响应 SSE 逐块透传——调用方零改造接入。请求体为标准 OpenAI Chat Completions 格式;请求体含多模态内容而模型未显式声明多模态时返回 400。
{
"error": { "message": "…用户可读提示…", "type": "invalid_request_error | proxy_error" }
}
// invalid_request_error → 不可重试(请求/配置类问题,重试无意义)
// proxy_error → 可重试(上游瞬时故障,退避自愈)上游 2xx 响应的限流响应头(x-ratelimit-limit/remaining/reset)白名单透传,供调用方做精确退避。
提交反馈,落库即入待认领池(pending_claim),异步触发自动分类(分类失败仅降级为未分类,提交本身不受影响)。
{
"sourceSessionId": "session-uuid", // 源会话 ID(全局入口不传)
"sourceSessionMessages": [ // 必填:反馈材料,JSON 数组 ≤1MB
{ "role": "user", "content": "点击导出按钮没有反应" }
],
"sourceSessionTranscript": "…全量转写(可选,≤15MB)…",
"feedbackImages": [ // 截图附件 ≤9 张,单张解码后 ≤500KB
{ "name": "截图1.png", "data": "data:image/png;base64,iVBORw0KGgo..." }
],
"feedbackType": "defect", // defect / requirement,不传由自动分类判定
"note": "可选补充说明",
"reporterId": "device-uuid", // 设备标识,mine 回执查询凭据
"channel": "user_feedback" // user_feedback / tool_defect / performance / global_feedback
}{
"code": 200, "msg": "成功", "flag": true, "traceId": "...",
"data": {
"taskId": "fb-a1b2c3d4",
"status": "pending_claim",
"feedbackType": null, // 分类异步补全中
"classifySummary": null,
"claimedBy": null, "claimedTime": null, "resolveNote": null,
"createdAt": 1723420800000, "updatedAt": 1723420800000
}
}认领走条件更新(WHERE status='pending_claim'),并发多人同抢时恰好一个成功、其余按实际状态收到明确提示。请求体:{ "taskId", "claimer", "feedbackType"(可选,认领时人工补选类型,人工判断优先于自动分类) }。
{
"code": 600, "flag": false,
"msg": "该反馈已被 张三 认领" // 其余分支:已解决 / 已删除 / 状态刚变化请刷新 / 任务不存在
}查询参数 taskId。返回材料全文、分类产出、认领信息与截图地址——imageUrls 为 HMAC 签名的绝对 URL(默认 30 分钟过期),可直接作为 <img src> 使用(无需鉴权头),过期后重调 get 刷新。已删除任务的图片清单已清空。
查询参数 reporterId(必填,与提交时一致)。按创建时间倒序最多 100 条,返回状态摘要与本人自述 / 处理回执(note / resolveNote)——查询列即收敛:不含材料全文、联系方式与工作目录。
get 返回的 imageUrls 即指向本端点。签名 URL 即限时凭证(img 标签无法携带鉴权头)。
taskId 形态 fb-[0-9a-f]{8} // 非白名单形态直接拒绝(路径穿越免疫) file 形态 [0-9a-f]{32}.(jpg|png) // 服务端落盘重命名产物 expires 过期时刻(毫秒时间戳) sig HMAC-SHA256(taskId|file|expires) 十六进制小写
业务错误:链接过期 → 刷新详情重试;签名不符 / 形态非法 → 拒绝;文件缺失 → 不存在或已被清理。
「反馈与认领工单」一次重构迭代的端点变更账目——契约即设计文档、控制器即实现、测试即验证,三者同轮更新,漂移在提交时被拦住:
| 变更 | 数量 | 明细 |
|---|---|---|
| 新增 | 6 | 认领 / 释放 / 完成 / 删除 / 回执(mine)/ 截图文件流(image) |
| 改造 | 3 | 提交(insert)/ 列表(list)/ 详情(get)——对齐四态状态机与分类字段 |
| 下线 | 4 | 旧接口直接移除、不留兼容层(/retry / /cancel / /report / /getStatus),前端同步适配 |