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

5.4 KiB
Raw Blame History

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,字段与正反例以 contracts/local/ 为准。本记录不另建字段合同;此前真实 SaaS 剩余缺口见 前轮证据,本轮没有宣称已修复或签收。

提供方需调整的字段

在任务详情 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 证据。本轮不代签真实供应商、模型、Asterisk 媒体、通话或生产门禁。

依赖与数据边界

语言解析使用项目已有 golang.org/x/text v0.41.0,仅从间接声明改为直接声明,没有升级版本或新增库;HTTP、WebSocket、音频转换继续复用现有依赖。没有新数据库表、自动迁移或历史路径兼容;未动任何现存数据库、恢复文件、spool/outbox 或外部资源。