Files
go-sip/docs/evidence/ai-protocol-model-config-20261008.md
T

44 lines
5.4 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-08)
## 范围与结论
用户批准取消精确型号/音色限制,并明确选择由任务增加 TTS `protocol` 来区分已有 HTTP 与 task-based WebSocket 调用。provider 仍仅提供连接信息,不恢复 role/adapter。
本轮基线为 `98b3fd4`;全部修改在独立工作区 `/home/rogee/Workspace/sip-go-agent-protocol-models`、分支 `change/ai-protocol-model-config-20261008`,不写入原工作区的未提交修改。没有部署、拨号、真实 AI/OSS 请求或 SaaS 业务数据修改;没有再次读取实际 SaaS 配置,也未复制任何私有 env。
**同协议新增模型/音色不再要求修改本方代码。** 模型 ID 原样进入请求;这不代表任意模型都支持该协议,实际服务端拒绝时如实失败,不换模型或协议重试。
当前规范见 [SaaS↔Dispatcher](../thirds/saas-dispatcher.md),字段与正反例以 `contracts/local/` 为准。本记录不另建字段合同;此前真实 SaaS 剩余缺口见 [前轮证据](saas-config-model-adjustments-20261008.md),本轮没有宣称已修复或签收。
## 提供方需调整的字段
在任务详情 `agent.tts` 增加必填 `protocol`:
| 值 | 本方选择 |
| --- | --- |
| `dashscope_tts_http` | 已有 HTTP 生成接口、音频引用下载及格式转换;连接必须提供正确的 HTTP 生成 endpoint |
| `dashscope_task_websocket` | 已有 task-based WebSocket TTS;连接必须提供 ws_endpoint |
字段缺失、未知值或选定 endpoint 缺失直接拒绝,不依据 model 名或备用地址猜测。其它由提供方修正的 SIP、任务详情和额度字段要求不变。
模型、音色、语言、速度等来自任务,可表达的参数不被本地型号列表替换。协议本身仍有约束:HTTP 调用目前不表达倍速,须明确 speed=1;task TTS 支持 speed=0.5–2。电话播放目标仍为单声道 16 kHz PCM16。语言名称或 BCP 47 标签转为任务协议需要的显式语言提示;指定 Auto 则按协议省略提示,未指定语言不自动推测。
百炼 task ASR 接受任务指定的模型及 8/16 kHz 输入目标:16 kHz 发送原始 Agent PCM,8 kHz 才转换。当前适配不能表达 interim 开关,显式提供即报错,不忽略。火山 ASR 保留其 SDK 能表达的参数约束;没有新增供应商或协议。
## 本地验证
- TDD:新增同协议任意模型/音色及明确协议用例,初始校验失败;实现后通过。新增 interim 不可表达用例先失败,再改为显式拒绝。
- HTTP 和 WebSocket 实际本地模拟请求验证 model/voice/language/rate 原值;16 kHz ASR 字节完全保持、8 kHz 仅显式转换。使用未出现在任何型号列表中的模型与音色,未访问真实供应商。
- 熟悉型号名称搭配相反协议时仍按任务明确选择请求;服务端 400 只失败一次,不访问另一协议地址。
- 缺协议、缺选定 endpoint、未知参数、不支持的倍速/采样率/语言、未明确 ASR 模型和 interim 选择均明确拒绝;不插入 SDK/环境默认值。
- 新增完整开场→ASR→LLM→TTS 回合,三个未列入任何型号白名单的模型 ID 均原样进入各自本地协议请求;一次 ASR、一次 LLM、两次 TTS(开场/回复),没有额外请求。原关键词不调用 LLM/结束语播放后挂断、完整音频/最终文本、错身份、超时、错误、无隐式重试等用例仍通过。
- `make check` 全部通过:格式、当前合同及来源/hash、Proto、`go test -race ./...`、vet、构建、实际隔离 RabbitMQ、既有 HTTPS 与双向 TLS 端到端测试。
- 42 个合同 JSON 正反例/hash 通过。新增缺 protocol 反例已单独确认只有这一项结构错误。
- `make coverage` 业务语句覆盖率 **70.7%**(门槛 65%)。本地日志 `.local/protocol-make-check-final.log`、`.local/protocol-coverage-final.log`。
- 隔离 MQ 验收曾一次出现 ready backlog 数为 2 的检查失败;该次缺少 pending 身份诊断,不能据此推断消息丢失。检查发现测试把 socket 写完当作消息已入队,并把准入探测消息当成必然留在队列的 backlog;生产发布者已有 mandatory/confirm,业务代码不需要改变。本轮修正测试发布者确认边界,并在消费者确已停止后单独投递三条已确认 backlog,保留原 purge、零消费者、回执与不执行检查;异常时记录队列状态及 pending event IDs。修正后该用例实际 RabbitMQ、race 连续 **50 次通过**,随后完整验收再次通过。重复验证中的一次容器启动未就绪单独失败,未跳过 gate 或延长 readiness timeout;只读资源诊断未证明资源不足,重新独立启动后完成 50 次验证,不声称修复了 broker 本身。
- A01–A12/K01–K16 既有归属、冻结快照、额度、控制、幂等、录音恢复、未知占用等测试未放宽;范围与外部缺口继续遵循 [P08 证据](saas-dispatcher-p08-acceptance.md)。本轮不代签真实供应商、模型、Asterisk 媒体、通话或生产门禁。
## 依赖与数据边界
语言解析使用项目已有 `golang.org/x/text v0.41.0`,仅从间接声明改为直接声明,没有升级版本或新增库;HTTP、WebSocket、音频转换继续复用现有依赖。没有新数据库表、自动迁移或历史路径兼容;未动任何现存数据库、恢复文件、spool/outbox 或外部资源。