44 lines
4.1 KiB
Markdown
44 lines
4.1 KiB
Markdown
# 挂断关键词结束语:本地验证
|
||
|
||
## 范围与规则
|
||
|
||
使用者确认将 `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、录音、恢复文件。音频发送顺序的本地验证不证明真实线路的远端播放或生产签收。
|