Files
go-sip/docs/evidence/ai-params-task-precedence-20261009.md
T

65 lines
6.1 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.
# AI 参数重名优先级调整(2026-10-09)
## 使用者确认的规则与范围
此前契约和绑定检查拒绝 params 中的协议重名字段,真实 SaaS 任务 4 同时给出 `agent.tts.voice` 与 `agent.tts.params.voice`,导致 Dispatcher 退出。
使用者明确确认变更:**任务/会话生成字段优先,忽略 params 中重名键,其他参数按原值传递**。同值、不同值或 null 均使用该优先级;不修改获批任务原始快照,不要求 SaaS 删除原有重复字段。参数仍是必填、可空的平坦对象,本轮不改变其他结构和业务规则。
同步共享契约、实现、测试和说明,验证后提交并推送、重新部署 `server.sip`。保留固定配置、数据和既有 SaaS 任务授权,不清理或迁移数据、不操作真实 MQ 拓扑、不重启 Asterisk、不独立试拨或主动投递任务。
## 共享契约及 SaaS 通知
共享仓库 `sip-contracts` 提交 `f490afab764a702dda919c718dca1a05e5bceb0a` 已推送,本项目同步固定该提交。规范位置为 `contracts/schema/saas-dispatcher.md` 的 AI 参数段落。Schema 已接受这类平坦对象,无需改变数据结构。
提供给 SaaS 开发人员的变更通知:重名参数不再导致任务拒绝,任务/session 的 model、voice、消息及事务身份具有优先权。现有任务中重复 voice 不需要删除或更改任务内容,其他参数继续原值传递;其余现行契约不变。
## 实际改动
- 删除绑定阶段 ASR/LLM/TTS 重名参数拒绝和废弃的 `reservedParams` 路径,不保留旧拒绝兼容层。
- LLM 和百炼 TTS 已有“复制 params,再写入任务/会话字段”的组装逻辑,分别保证 model/messages、voice 优先;补完整任务绑定到实际请求的回归,不只是手工构造绑定对象。
- 火山 ASR 在对接 SDK 前复制 params,并移除与 SDK 生成字段重名的 `reqid`、`sequence`、`model_name`。请求使用任务 model 和真实 session 身份,其他参数保持原值,原快照及绑定中的 params 不改。
- SDK 自身保护生成身份的规则不变,本次是业务优先级调整,不是 SDK 缺陷,不改依赖版本或引入本地 replace。
- 更新现行 `AGENTS.md`,旧部署证据标明当时拒绝规则及要求 SaaS 删除 voice 的建议已被取代,历史事实仍保留。
## 验证
- 测试先加入重名键,旧代码在 ASR、LLM、TTS 绑定阶段明确失败;修复后通过。
- 同值、不同值、null 三组重名值均接受,任务字段不被改写,原始任务快照不变。
- ASR WebSocket 实际请求:model_name 采用任务值,reqid/sequence 由 session 生成,原绑定中重名值仍保留;其他字段以及 false、null、大整数保持原值。
- LLM HTTP 实际请求:model/messages 采用任务/会话值,其他字段原值传递。
- 百炼 TTS WebSocket 实际请求:voice 采用任务值,其他字段原值传递。
- Agent 正式快照与重放保护测试接受重名键、不改冻结绑定;缺失/null/非对象/嵌套参数等原先无效结构仍明确拒绝,拒绝不得持久接纳或拨号。更新旧的“重名即无效”测试为真正的结构错误测试,不削弱基础校验。
- `make proto-check acceptance-local`、`make release-check-local`、`go vet ./...`、`go test -race ./...`、构建及隔离 RabbitMQ/HTTPS/双向 TLS 端到端全部通过。
- 业务单元覆盖率 **70.8%**。
- 本地 mock 请求不代表供应商实际可用、真实通话、AI/录音/OSS 或生产验收。
## 部署验证与保留的验收边界
2026-10-09 17:16 安装,17:20–17:24(Asia/Shanghai)只读复核:
| 项目 | 现场事实 |
| --- | --- |
| 已推送、已安装源码 | `ddd4de20fac1d224ad5afb8d710bcc52e7fcd821` |
| 制品 SHA-256 | `3356f12e89927835d82e2a7c08f63d281ce5b48084bdb94949ea1c8095dcbf02` |
| 制品一致性 | 两角色固定 `current` 解析至该提交,运行制品与发布清单 hash 相同 |
| Agent | enabled、active/running;PID `2872989`,重启次数 `0` |
| Dispatcher | enabled、active/running;PID `2873001`,17:16:23 至 17:24:55 未变,重启次数 `0`、退出状态 `0` |
| Asterisk | enabled、active/running;PID `777461`、10 月 5 日启动时间未变,未重启 |
| SaaS 原任务 | 17:24:55 HTTP 200、归属正确;任务 4 revision `1`,原 voice 与 params.voice 均仍存在且同值,无需平台修改 |
| 任务与发现 | 四个真实任务的快照已接纳,均为 `paused`;持久 discovery_ready=true |
| 实际 SIP | 原启动代次 16 加载核对成功;随后处理真实 SaaS 队列中的既有 SIP 通知,完整读取并确认新本地加载代次 `17`,pending=0 |
| 数据保留 | 未 reset;SQLite inode `416829`、user_version `3` 不变;inbox 无占用 |
| 主配置保留 | `pjsip.conf` SHA-256 仍为 `29619dcad31c31adde63ae1fc74b95feb10943a601f120f34d54ec332f7b708c` |
| 活动通道 | 安装前后只读核对为 0,未独立拨号或主动投递任务 |
原参数冲突不再阻止启动,真实 SaaS 保留重复 voice 的任务已被接受,Dispatcher 已持续运行,没有用清数据、改 SaaS 任务或删除其他有效参数解决。
### 独立部署探测仍需区分
安装返回 `ok=true`,三服务 enabled/active、制品检查和监听通过;但状态工具仍显示 `dependency_state=saas_pending`、`business_ready=false`。其计算只引用启动前保存的 `dependency-status.json`:该独立 probe 的 tasks 阶段失败,只保存 `*fmt.wrapError`、http_status=0、transport_failure=unavailable,未提供具体原因。本次没有重写该文件、把失败改成成功或更改探测程序。
上述标签不能替代真实程序的持久发现就绪、四个任务快照已接纳、SIP 17 已核对和连续零重启事实;同时真实程序运行正常也不能代签这项独立探测。探测失败的具体原因尚未定位,完整外部依赖/部署验收仍保留未完成项,不把这轮参数修复扩大成所有检测都通过。
四个任务均处于暂停状态,本轮没有实际外呼、供应商 ASR/LLM/TTS、录音/OSS 或重启自启动验收;未提交或输出凭据、prompt、完整配置、通话内容或音频。