Files
airz-uniapp/docs/上下文AI助手开发契约.md
T

54 lines
6.8 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.
# 原型08上下文AI助手
版本1.0,2026-09-28。CHAT-001—003完成本地接口和页面联调,待验收;CHAT-004异常与额度本地检查通过,真实DeepSeek多轮语义、移动端真机与商业额度仍待验收。
## 1. 会话与事实边界
- 复用`fa_ai_chat`/`fa_ai_chat_log`,不新增业务表。助手始终`scene=assistant`、`assessment_id=NULL`、`analysis_context=NULL`。
- `context_assessment_id`可空,仅引用本人成功评估;复合外键`(context_assessment_id,user_id)`防跨账户绑定。`context_data`保存版本、创建幂等键、最多3个产品ID和冻结事实摘要,不接收客户端报告正文。
- 普通、报告、单产品、2—3项对比均可进入。服务端读取冻结报告、匹配理由和证据,白名单排除姓名、手机、证件、附件、职业及自由用途说明;产品名称/数字/判定采用评估时版本,不读取当前产品替换历史事实。
- 会话固定上下文。URL指定的评估及产品须与chatId一致;上下文删除、失效或摘要变化则拒绝。后续单产品AI解释和当前上下架状态不参与摘要,不影响会话恢复。
- 模型仅解释,不改变规则结论,不生成匹配率、获批概率或授信承诺。系统约束和输出格式校验不等同于语义完全正确,正式上线仍需真实多轮人工验收。
## 2. 已实现接口
均为会员Bearer、`Cache-Control: no-store`、FastAdmin响应格式。业务成功HTTP200不表示异步模型完成。
| 方法与路径(前缀/api/v1) | 参数 | 返回data |
| --- | --- | --- |
| GET /assistant/context | contextAssessmentId可空字符串、contextProductIds逗号列表 | 上下文标题、产品名/实际状态、快捷问题和说明;不创建会话、不调用模型 |
| GET /assistant/chats | limit字符串1—30,默认20;cursor可空 | 本人普通会话items、hasMore、nextCursor;按创建ID倒序 |
| POST /assistant/chats | requestId;contextAssessmentId字符串或null;contextProductIds字符串数组 | chatId、title、context;只创建会话,不调用模型 |
| GET /assistant/chats/:id | 可选contextAssessmentId/contextProductIds,同preview格式 | chatId、title、context;传入上下文时严格核对一致 |
| GET /assistant/chats/:id/messages | limit字符串1—30,默认20;cursor可空 | chatId、items、hasMore、nextCursor;首屏最新20轮,页内按时间正序 |
| POST /assistant/chats/:id/messages | requestId、message、retryAttempt整数0—2 | chatId、item;queued/running/completed/failed |
requestId为8—64位字母、数字、下划线、短横线。message为1—800字纯文本。拒绝额外参数、无评估产品列表、重复产品或超过3项产品。创建同键不同绑定、发送同键不同正文均409;越权或不存在404,未完成报告409,未配置模型503,超额度429,非法参数422。
每轮DTO为`{id,requestId,message,reply,status,attempt,canRetry,createdAt}`,reply仅成功时非空。消息内部调用行、错误码、凭据、用量不透传页面。加密游标绑定用户及会话,不能跨会话使用。
## 3. 异步、重试与额度
- 用户明确发送后,在用户行锁及会话行锁中保存用户消息并预留assistant调用行。`ast:`前缀调用日志是持久待办,既有`analysis:work`在报告和产品解释队列空闲时消费。
- 每会话最多100轮、同一时间只有一条回复在排队/执行。每用户每天最多新建30个会话。模型调用与报告和产品解释共享`deepseek.daily_calls_per_user`(本地默认20),失败也占预留次数,防止故障重试无限计费。
- 第一次retryAttempt=0。HTTP回执丢失必须原requestId/正文/重试序号重放,不增加调用。已确认失败后,用户手动重试保持requestId、retryAttempt递增,最多3次;只能重试最近一轮,成功和运行中均不能重跑。
- 每次尝试独立assistant日志,reply_id指向同一用户消息。保留所有尝试用量;tokens未知保持null,不把失败当零消耗。MySQL可重复读下关键幂等、序号和额度查询使用锁定当前读,避免旧快照绕过串行用户锁。
- 运行租约`max(180秒,供应商timeout+60秒)`。超时由worker恢复扫描标失败,不自动收费重试;迟到响应只能补原调用用量,不能改成成功或覆盖新尝试。
- 默认Flash,复用既有DeepSeekClient。上下文保留最近6轮成功问答(失败不发送),回复最长1200字,总请求序列化最多96KB;用户主动输入的手机号、身份证及长银行卡号脱敏后才发送模型。不声称自由文本已完全去除所有个人信息。
## 4. 页面与返回
机器人、问候气泡、浅蓝快捷问题及底部输入栏参考原型08,复用现有素材;上下文卡为必要增补。普通模式不假定已有报告。快捷问题按实际判定生成,点击仅填入问题,点击发送才请求模型。
首次发送创建会话并在H5地址中保存chatId,刷新重新鉴权恢复;历史对话入口可恢复普通或上下文会话。消息3秒轮询,最多60次,超限/查询失败提供继续查询。失败明确提示并支持原键重试。消息、报告不落本机持久缓存;离页清理渲染和轮询,Token变化拒绝迟到回包并清除内容。
04/05咨询入口保留产品ID,07保留产品选择,09带本次评估;navigateBack优先保持原页面状态。冷启动的返回产品/对比/报告仅由白名单来源与编号重建;普通模式回首页。登录页只支持白名单助手返回,拒绝任意returnUrl;登录后再次校验归属。
## 5. 迁移与验证
本轮用户明确授权本机迁移后,执行后端`database/migrate_assistant_context.py --apply --worker-stopped`。新增2列、索引、归属外键与场景检查约束共5项;复跑预检0项。备份位于`D:/AAdesk/202609/airz-backups/assistant-context-20260928-154651-271907/`。恢复优先回退助手代码并保留可空列,不整表覆盖后续业务数据,详见后端`database/assistant-context-migration.md`。
后端70项助手检查、51项产品解释、31项任务、36项评估HTTP、70项匹配HTTP/快照检查通过。HBuilderX5.26 Android与微信编译通过。H5 Chromium390×844、1280×900验证普通/上下文、三入口、发送/刷新/失败重试、回执丢失、23轮历史分页、上下文冲突、跨账号及真实密码登录返回;模型输出使用假模型,未新发收费DeepSeek调用。最终正常流程无业务console.error/warn。
临时截图/脚本:`C:/Users/JUN/AppData/Local/Temp/airz-assistant-20260928/`。合成账号/评估/会话/日志/令牌/队列已清理,隔离服务和浏览器已关闭。原有2份评估会话及2条调用记录逐条对照迁移前备份未改写。未验收:真实多轮模型语义、真实产品人工金标准、微信内H5/Safari、真机键盘/安全区以及生产守护/容量。