Files
go-sip/docs/evidence/hangup-keyword-closing.md
T

44 lines
4.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.
# 挂断关键词结束语:本地验证
## 范围与规则
使用者确认将 `agent.conversation.hangup_keywords` 改为对象数组。唯一字段规范和正例仍在 `contracts/local/`;业务说明在 `docs/thirds/saas-dispatcher.md`,不另维护平行字段定义。
- 仅用户最终 ASR 文本的字面包含匹配有效;同时命中多组时按配置顺序取第一组。
- 使用获批 TTS 合成对应结束语,完整发送音频后主动挂断,不调用 LLM 生成结束语。
- 命中后禁止新一轮对话;重复识别、合成失败及未知挂断均不触发重播或重试。
- 合成或播放失败保留关键词命中事实,明确返回错误并尝试结束通话;多个错误同时返回。未成功发送的音频不报告为完整播放。
- 旧字符串数组、缺字段、空字段及未知字段直接拒绝;ASR-only 不合成结束语。
## 可执行证据
| 检查 | 当前测试 |
| --- | --- |
| 新结构接纳、旧结构/空字段/错误大小写拒绝 | `TestBindHangupGroups`、`TestBindRejectsInvalidHangupGroups`、`TestCurrentContractExamples` 及新增旧结构反例 |
| 用户最终文本、字面匹配、组顺序、快照复制、并发单次预留 | `TestKeywordHangupOnlyFinalUserLiteralAndOrderedGroups`、`TestKeywordHangupConcurrentReservations` |
| 播完结束语后才挂断,且不再开始下一轮 | `TestApprovedKeywordPlaysClosingBeforeHangup`、`TestKeywordHangupWaitsForPlaybackReturn` |
| 合成/播放/挂断失败、多个错误并存、禁止重播 | `TestKeywordClosingFailuresRemainVisibleAndHangupOnce`、`TestKeywordHangupFailureVisibleWithoutRetry`、`TestKeywordHangupUsesFinalUserTextOnly` |
| 官方 TTS SDK、批准配置、结束语正文与发送/挂断顺序 | `TestApprovedFullAIUsesBoundProviderSDKsAndOnlyFinalUserKeyword`:真实 SDK 对接本机模拟 HTTP 服务;最终 ASR 文本为显式测试输入,不代表真实 ASR 识别成功 |
| 隔离 Mock 不捏造结束语音频 | `TestApprovedMockFullAIFreezesScriptAndReturnsKeywordClosing` |
P08 表保留当时的历史结果;其中旧 `TestKeywordHangupOnlyFinalUserLiteralAndOnlyOnce` 和 `TestKeywordHangupConcurrentDuplicateFinalTriggersOnce` 的现行替代分别为上表的顺序组匹配与并发预留测试。本变更涉及 A01/A04/A05/A08/A11 和 K09;其他业务边界不变,由完整回归及隔离 MQ/HTTPS/双向 TLS 测试核验。
## SaaS Mock HTTP 与 MQ 补充验证
使用者确认新结束语配置继续通过 HTTP 任务快照读取,不修改 `call.execute` 的两字段 payload;授权提交并 push 全部变更,不部署、不投递实际呼叫。SaaS Mock 的测试快照直接引用现行任务正例,没有另一份手写字段定义。
- `TestSaaSMockServesApprovedHangupGroupsOverHTTP`:正式 HTTP 读取并绑定后,组名、触发词与结束语完整保留。
- `TestSaaSMockRejectsLegacyAndIncompleteHangupSnapshots`:旧数组、缺结束语、空触发词、空白结束语拒绝加载。
- `TestSaaSMockMQRejectsInlineHangupConfiguration`:MQ payload 内增加 `agent`、`hangup_keywords` 或 `closingRemark` 直接违反现行合同。
- `TestBuildExecuteOnlyUsesApprovedTaskAndTarget` 及隔离 RabbitMQ 的单次投递、派发回执测试:投递前和实际队列收到的消息均核对 payload 只有 `task_id` 和原始 `callee`;配置不随消息重复携带。
- Mock 使用说明同步更新,未修改测试机私有快照、未连接真实呼叫 MQ。
## 本轮结果
- TDD:新配置和播放顺序测试先失败,完成实现后通过。
- `PATH=/tmp/sip-go-agent-tools/bin:$PATH make check`:通过;包括格式、现行合同和 Proto 来源/hash、`go vet ./...`、`go test -race ./...`、构建,以及实际启动临时 RabbitMQ 的隔离端到端测试。
- `bash scripts/coverage.sh`:手写业务语句覆盖率 **70.1%**,仅排除生成目录,超过 65%。
- `git diff --check`:通过。
仅修改并验证本地代码,没有部署、真实拨号、真实 AI/OSS 服务调用,也没有读取私有凭据或处置旧 SQLite、录音、恢复文件。音频发送顺序的本地验证不证明真实线路的远端播放或生产签收。