From 23d1b1274f47346a2df59fbf33461869a7f5d951 Mon Sep 17 00:00:00 2001 From: Rogee Date: Fri, 11 Sep 2026 17:47:03 +0800 Subject: [PATCH] chore: initial project snapshot --- .env.example | 22 + .gitignore | 15 + AGENTS.md | 89 +++ compose.asterisk.yaml | 22 + compose.yaml | 35 ++ deploy/__init__.py | 1 + deploy/aliyun.example.json | 15 + deploy/aliyun_host.py | 410 ++++++++++++++ deploy/asterisk.example.json | 8 + deploy/asterisk.sh | 26 + deploy/render_asterisk.py | 150 ++++++ docs/SaaS交互_OpenAPI与MQ契约规划_v0.1.md | 510 ++++++++++++++++++ .../AI智能体外呼SaaS平台_三期实施评估.xlsx | Bin 0 -> 104757 bytes ...外呼SaaS平台_三期实施评估_团队配置版.xlsx | Bin 0 -> 119533 bytes ...呼SaaS平台_三期实施评估_团队配置版_v2.xlsx | Bin 0 -> 126399 bytes ...呼SaaS平台_企业级需求规格说明书_v1.0.docx | Bin 0 -> 62956 bytes docs/archived/一期呼出应用开发计划_v1.0.docx | Bin 0 -> 24466 bytes docs/一期呼出应用开发计划_v1.0.md | 278 ++++++++++ docs/交互流程图_规划态.md | 134 +++++ .../一期中间调度件与Asterisk_v1.0.zip | Bin 0 -> 67392 bytes .../01_中间调度件与MQ回传设计.md | 276 ++++++++++ .../02_Asterisk部署与SIP对接步骤.md | 257 +++++++++ .../03_联调步骤与验收标准.md | 140 +++++ .../一期中间调度件与Asterisk_v1.0/README.md | 18 + ...期中间调度件_Asterisk部署及验收_v1.0.docx | Bin 0 -> 42205 bytes docs/系统架构图_规划态.md | 126 +++++ docs/部署接入_运行说明.md | 213 ++++++++ pyproject.toml | 4 + services/asr-web/.dockerignore | 5 + services/asr-web/Dockerfile | 14 + services/asr-web/asr.go | 30 ++ services/asr-web/asr_bailian.go | 188 +++++++ services/asr-web/asr_volc.go | 245 +++++++++ services/asr-web/config.go | 77 +++ services/asr-web/go.mod | 5 + services/asr-web/go.sum | 2 + services/asr-web/main.go | 338 ++++++++++++ services/asr-web/main_test.go | 219 ++++++++ services/asr-web/volc_frame.go | 60 +++ services/asr-web/web/app.js | 176 ++++++ services/asr-web/web/index.html | 16 + services/asr-web/web/pcm-worklet.js | 28 + services/asr-web/web/style.css | 1 + tests/test_deployment.py | 275 ++++++++++ tests/test_pcm.cjs | 40 ++ 45 files changed, 4468 insertions(+) create mode 100644 .env.example create mode 100644 .gitignore create mode 100644 AGENTS.md create mode 100644 compose.asterisk.yaml create mode 100644 compose.yaml create mode 100644 deploy/__init__.py create mode 100644 deploy/aliyun.example.json create mode 100644 deploy/aliyun_host.py create mode 100644 deploy/asterisk.example.json create mode 100644 deploy/asterisk.sh create mode 100644 deploy/render_asterisk.py create mode 100644 docs/SaaS交互_OpenAPI与MQ契约规划_v0.1.md create mode 100644 docs/archived/AI智能体外呼SaaS平台_三期实施评估.xlsx create mode 100644 docs/archived/AI智能体外呼SaaS平台_三期实施评估_团队配置版.xlsx create mode 100644 docs/archived/AI智能体外呼SaaS平台_三期实施评估_团队配置版_v2.xlsx create mode 100644 docs/archived/AI智能体外呼SaaS平台_企业级需求规格说明书_v1.0.docx create mode 100644 docs/archived/一期呼出应用开发计划_v1.0.docx create mode 100644 docs/一期呼出应用开发计划_v1.0.md create mode 100644 docs/交互流程图_规划态.md create mode 100644 docs/交付文档/一期中间调度件与Asterisk_v1.0.zip create mode 100644 docs/交付文档/一期中间调度件与Asterisk_v1.0/01_中间调度件与MQ回传设计.md create mode 100644 docs/交付文档/一期中间调度件与Asterisk_v1.0/02_Asterisk部署与SIP对接步骤.md create mode 100644 docs/交付文档/一期中间调度件与Asterisk_v1.0/03_联调步骤与验收标准.md create mode 100644 docs/交付文档/一期中间调度件与Asterisk_v1.0/README.md create mode 100644 docs/交付文档/一期中间调度件与Asterisk_v1.0/一期中间调度件_Asterisk部署及验收_v1.0.docx create mode 100644 docs/系统架构图_规划态.md create mode 100644 docs/部署接入_运行说明.md create mode 100644 pyproject.toml create mode 100644 services/asr-web/.dockerignore create mode 100644 services/asr-web/Dockerfile create mode 100644 services/asr-web/asr.go create mode 100644 services/asr-web/asr_bailian.go create mode 100644 services/asr-web/asr_volc.go create mode 100644 services/asr-web/config.go create mode 100644 services/asr-web/go.mod create mode 100644 services/asr-web/go.sum create mode 100644 services/asr-web/main.go create mode 100644 services/asr-web/main_test.go create mode 100644 services/asr-web/volc_frame.go create mode 100644 services/asr-web/web/app.js create mode 100644 services/asr-web/web/index.html create mode 100644 services/asr-web/web/pcm-worklet.js create mode 100644 services/asr-web/web/style.css create mode 100644 tests/test_deployment.py create mode 100644 tests/test_pcm.cjs diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..23fba90 --- /dev/null +++ b/.env.example @@ -0,0 +1,22 @@ +# Copy to .env and chmod 600 .env. Never commit real credentials. +# Generate: python3 -c 'import secrets; print(secrets.token_urlsafe(32))' +ASR_WEB_TOKEN= +ASR_WEB_PORT=18088 +# Empty means exact same-origin browser access. For a TLS reverse proxy set https://your-approved-domain. +PUBLIC_ORIGIN= + +BAILIAN_API_KEY= +FUNASR_API_KEY= +BAILIAN_ASR_MODELS=fun-asr-realtime +BAILIAN_WS=wss://dashscope.aliyuncs.com/api-ws/v1/inference/ +FUNASR_WS=wss://dashscope.aliyuncs.com/api-ws/v1/inference/ +VOLC_APP_KEY= +VOLC_APP_ID= +VOLC_ACCESS_TOKEN= +VOLC_RESOURCE_ID=volc.bigasr.sauc.duration +VOLC_WS=wss://openspeech.bytedance.com/api/v3/sauc/bigmodel + +# Optional Asterisk deployment: fill after verifying the approved image/version. +ASTERISK_IMAGE= +# ARI_PASSWORD and SIP_PRIMARY_PASSWORD/SIP_BACKUP_PASSWORD go to the renderer +# through the process environment/secret manager, not this committed example. diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..19405f6 --- /dev/null +++ b/.gitignore @@ -0,0 +1,15 @@ +.env +.env.* +!.env.example +.venv/ +__pycache__/ +.pytest_cache/ +.ruff_cache/ +*.pyc +.codegraph/ +.local/ +deploy/state/ +deploy/asterisk/generated/ +services/asr-web/asr-web +*.test +coverage.out diff --git a/AGENTS.md b/AGENTS.md new file mode 100644 index 0000000..5c1a6d9 --- /dev/null +++ b/AGENTS.md @@ -0,0 +1,89 @@ +# ai-call:部署与开发约束 + +## 目录与实施范围 + +- 项目根目录用于部署,`docs/` 保存需求、计划与验收资料,不挪回根目录。 +- 当前先实现 ASR Web 验证服务、Asterisk 配置和阿里云主机准备工具;不把这些当成完整外呼平台已上线。 +- 用户已决定**仅复用 voice_test 的 ASR**。禁止复制或启用该仓库的 LLM/TTS;新规范确认前,界面必须明确显示未启用。 +- SaaS 指令与所有业务结果均走 RabbitMQ;录音先上传 OSS,再通过 MQ 回传 OSS ID。接口/消息规范由用户制定,不能擅自改成 HTTP 业务回调。 + +## 固定资源与云部署规则 + +1. 区域为阿里云北京 `cn-beijing`。 +2. 我方对 SIP 服务商登记的公网出口白名单 IP 是 **123.56.71.98**。它不是 SIP 服务端地址,不得填入 trunk contact。 +3. 目标计算资源为阿里云竞价 ECS。必须先使用阿里云 CLI 查询 IP/EIP 与现有实例;确认没有可复用主机后,才允许按明确的实例规格、价格上限、磁盘/VSwitch/安全组/SSH KeyPair 创建。 +4. 固定 IP 是否为本账号可操作的 EIP 必须查询。找不到该 EIP/现有公网 IP 时停止,**禁止新分配任意公网 IP 冒充白名单地址**。若属于非 EIP 的实例公网 IP,只能复用经明确指定的原实例;回收后的地址保留不能保证。 +5. 不解绑或覆盖其他实例上的 EIP,不删除、停机或修改无关实例;多个候选实例、未知归属或未授权绑定一律停止。 +6. 工具默认只读计划;`--apply` 才执行创建/绑定。用户未确认预算、云凭据未配置、现有绑定不明时,不能实际消费或改绑。竞价价格上限不包含系统盘/EIP/流量费用。 +7. 创建使用持久化 ClientToken;创建后绑定失败保留实例ID供恢复,不自动再创建一台、不自动删除实例。竞价回收不等于自动迁移活动通话。 +8. 使用 `aliyun` CLI 创建竞价 ECS 进行测试时,测试结束必须确认测试实例已停止并回收/删除;只删除本次测试创建的机器,不删除、释放或解绑指定 IP/EIP。 +9. 不把 AK/Secret、ASR Key、ARI 密码、SSH 私钥放入代码、文档、日志或聊天。优先配置 CLI RAM Role/STS,运行时通过环境或受控文件注入。 + +## SIP 接入信息 + +以下为用户提供的首组 SIP 参数,供应商名称待补充;已记录不代表已完成真实线路验证。 + +| 项目 | 参数 | +| --- | --- | +| SIP 服务端 | `61.132.228.221:5060` | +| 主叫号码/标识 | `BD93205882` | +| 被叫前缀 | `7089` | +| 我方出口白名单 IP | `123.56.71.98` | + +- 主叫标识保留原值(包括 `BD`),不能按纯数字手机号清洗,也不能直接当成 Digest 认证用户名;具体 From/PAI 等字段映射仍需确认。 +- 业务原始被叫号码保持不变;使用该线路时按其规则构造 `7089<被叫号码>`,避免重复添加或把该前缀带到其他供应商线路。 +- 传输协议、IP/Digest 鉴权、是否注册、编解码及并发限制仍需供应商确认;当前生成器的 UDP/ulaw 基线不代表这些参数已经确认。 +- 目前只提供一组服务端地址,未提供独立备用地址。不能把同一地址重复填写成主备并宣称具备容灾;现有生成器要求 primary/backup,单线路启动支持尚待调整。 + +## 多 SIP 供应商方案(用户已确认,运行代码待实现) + +- 采用**供应商按需预接入 + 每次外呼动态选路**。先验证当前供应商,后续逐家新增,不等待所有供应商一次性接入完毕。 +- 供应商/线路层预先维护独立 trunk:服务端、协议、鉴权、注册、允许的主叫、被叫改写规则和并发额度。不同供应商不能共用并逐呼覆盖同一份线路配置。 +- 呼叫层只从服务端已配置且获授权的线路中选择,按该线路规则设置本次主叫与被叫;**不为每个号码重写 pjsip.conf、重载 Asterisk 或重建注册**。 +- MQ 指令不能让调用方任意注入 SIP 地址、认证凭据或越权主叫;线路选择对应的具体消息字段仍由用户制定,不擅自定接口。 +- 切换线路时从原始被叫重新应用目标线路规则,不能沿用上一家的前缀或主叫。重试/切换条件需按业务契约另行实现,不能默认重复拨打已接通的电话。 +- 现有生成器仅支持固定 primary/backup,尚非完整多供应商路由;后续支持单线路启动、可扩展线路列表及逐呼选路,不为凑齐主备而虚构供应商。 + +## 生产容量与网络架构基线(用户已确认,运行代码待实现) + +- 目标口径是**至少 1000 路同时已接通的完整 AI 通话**,包括 ASR/LLM/TTS;拨号、振铃、CPS 和故障冗余必须另行计入,不能把 1000 路在途呼叫当作验收结果。 +- 生产主方案为**多机器 + 多 EIP 直连**:每个语音 Cell(Asterisk、媒体适配和本地执行器)绑定固定出口 IP;调度器选择 `trunk_id + egress_pool_id + cell_id`,一通电话从建立到结束固定在同一 Cell/出口,不逐呼重写共享 SIP 配置。 +- 每个 Cell/出口要维护独立的供应商白名单、RTP 端口范围、并发上限、CPS 令牌、编解码和健康状态。供应商限制优先于本地理论容量;不能用随机轮询突破供应商配额。 +- 采用 N+1 或更高冗余:按压测得到的单 Cell **安全容量**计算 `(Cell数量 - 1) × 单Cell安全容量 >= 1000`,并额外预留发布、线路降级和突发拨号余量。未完成真实 ASR/LLM/TTS、SIP/RTP 和供应商压测前,不承诺固定机器数或规格。 +- 单 EIP+NAT 不再作为备选方案;当前及后续生产计划不设计、不实现、不验收该架构,不得以通用 SNAT 替代多 EIP 直连。 +- 调度器只分配有完整资源租约的 Cell:供应商并发/CPS、Cell媒体端口、ASR/LLM/TTS配额、出口健康和节点容量必须同时满足;租约过期或心跳失效时停止新任务,活动通话不自动接管。 +- RabbitMQ 只负责可靠传输,不作为活动通话唯一状态源;命令/结果采用持久化、发布确认、手动确认和幂等事件。业务状态、调度租约和 outbox 需要可靠持久化;重复投递不能造成重复拨号或重复业务结果。 +- 1000 路容量必须同时验证 RTP 包率/带宽、RTP 端口对数量、连接数/文件描述符、NAT/conntrack、AI 首包及持续延迟、MQ 堆积、OSS 上传速度和供应商错误率。当前 RTP `10000–10800` 仅为基线,绝不是 1000 路容量保证。 + +## 多租户队列与公平调度(用户已确认,运行代码待实现) + +- SaaS 按可信 `tenant_id` 映射向**租户独立 RabbitMQ 命令队列** PUSH,呼出应用调度器负责租户间公平调度;不再用所有租户共享的执行 FIFO,不增加 HTTP 拨号入口。业务任务/重试决策仍属于 SaaS。 +- 默认建议活跃且可调度租户等权轮询,差异化权重需按业务规则确认;每轮有界取数,租户额度耗尽或线路不可用时跳过。按租户及全局限制预取、未 ACK 和已持久化待发起窗口,不能先消费到无界内存 FIFO;重启恢复也必须公平。 +- 租户并发/CPS 配额跨所有 Cell、调度实例汇总;并发覆盖预留、拨号、振铃、接通及待对账占用,CPS 包括 FALLBACK。实际发起同时满足租户额度、供应商、Cell/出口和 AI 完整资源租约。多实例须协调调度所有权和原子额度,不能各自发放一份;未知活动通话不能仅因租约到期直接释放占用。 +- 平台负责队列创建、精确绑定、权限和安全停用/清理;路由标识由 tenant_id 受控唯一映射,必须校验正文租户与队列一致。最终用户不直接连接 broker,不允许任意指定其他租户路由。命令重试/死信恢复回原租户调度域,不绕过配额。 +- 每租户设置发布速率、队列消息数/字节和待执行窗口上限,并有全局 broker 水位保护。队列满明确拒绝发布,不丢弃队头旧命令;SaaS 持久保留未确认发布记录,使用原执行标识有限重试。独立队列不代表独享 broker 资源或无限积压。 +- 公平调度分配新执行机会,不为公平挂断已接通电话;资源满需等待释放。固定开始时限必须另确认覆盖线路/AI/Cell 的保底容量或受限借用策略,不能仅用轮询宣称保证。 +- 本轮不改变事件结果队列为一租户一队列。队列命名、轮转/预取、配额、保留与等待指标待 G0 冻结;须验收大租户积压下小租户公平、多实例配额不超额、背压不丢消息及租户路由安全。 + +## 其它环境前置 + +- 本地:Go 1.26、Python 3.11+、Node、Docker Engine/Compose;云操作另需 `aliyun` CLI 和北京区域权限。 +- 云创建权限至少涉及 ECS Describe/RunInstances、VPC DescribeEipAddresses/AssociateEipAddress;已有 VSwitch、安全组、镜像和 SSH KeyPair。不得自动开放全部端口。 +- Asterisk:镜像固定 digest;已提供的 SIP 参数见上节,其余供应商/备用地址及接入规则仍待补充。ARI 默认仅回环访问;跨机器使用管理网和受控 TLS。RTP、防火墙、NAT、编解码必须真机验证。 +- ASR Web:服务访问令牌、百炼/火山凭据;默认仅宿主机回环暴露。远程麦克风需要 HTTPS,或通过 SSH 隧道访问 localhost;不要求用户关闭浏览器安全机制。 +- 业务对接仍需 RabbitMQ VHost/队列/ACL、用户发布的消息契约、OSS 上传与 OSS ID 规范。测试台音频/识别输出不是已接入 SaaS 的 MQ 结果。 +- LLM/TTS:供应商、协议、模型、参数、取消/打断与音频契约均待用户新规范;不得静默调用旧实现或宣称完整对话已验证。 + +## 参考资源 + +- :Asterisk 调研和 Mock 底座;不能把历史测试结果当成本环境验收。 +- :仅借用 ASR 协议代码;本项目访问控制、Web页面和生命周期独立实现。 +- `docs/一期呼出应用开发计划_v1.0.md` 为阶段计划;SaaS 对接草案见 `docs/SaaS交互_OpenAPI与MQ契约规划_v0.1.md`(文件路径保留,版本见正文)。本轮运行步骤见 `docs/部署接入_运行说明.md`,旧文档只读保留。 + +## 验证与交付 + +- Python:`python3 -m unittest discover -s tests -v`。 +- Go:`cd services/asr-web && go test -race ./...`;改动后执行格式化与静态检查。 +- PCM:`node --test tests/test_pcm.cjs`;Shell:`bash -n deploy/asterisk.sh`。 +- 不用真实云账号运行自动创建测试;使用可注入的 CLI runner 测试请求/恢复逻辑。 +- 实际部署、真实 ASR、SIP、MQ/OSS、LLM/TTS测试必须分别报告,模拟测试通过不代表生产验收通过。 diff --git a/compose.asterisk.yaml b/compose.asterisk.yaml new file mode 100644 index 0000000..8d8f679 --- /dev/null +++ b/compose.asterisk.yaml @@ -0,0 +1,22 @@ +--- +name: ai-call-sip +services: + asterisk: + image: "${ASTERISK_IMAGE:?Set an approved image digest}" + network_mode: host + restart: unless-stopped + stop_grace_period: 60s + volumes: + - ./deploy/asterisk/generated/http.conf:/etc/asterisk/http.conf:ro + - ./deploy/asterisk/generated/ari.conf:/etc/asterisk/ari.conf:ro + - ./deploy/asterisk/generated/pjsip.conf:/etc/asterisk/pjsip.conf:ro + - ./deploy/asterisk/generated/rtp.conf:/etc/asterisk/rtp.conf:ro + - ./deploy/asterisk/generated/extensions.conf:/etc/asterisk/extensions.conf:ro + - recordings:/var/spool/asterisk/recording + logging: + driver: json-file + options: + max-size: "10m" + max-file: "3" +volumes: + recordings: {} diff --git a/compose.yaml b/compose.yaml new file mode 100644 index 0000000..cdf8618 --- /dev/null +++ b/compose.yaml @@ -0,0 +1,35 @@ +--- +name: ai-call +services: + asr-web: + build: + context: ./services/asr-web + restart: unless-stopped + init: true + read_only: true + cap_drop: [ALL] + security_opt: [no-new-privileges:true] + pids_limit: 128 + mem_limit: 256m + cpus: 1 + ports: + - "127.0.0.1:${ASR_WEB_PORT:-18088}:8080" + environment: + ASR_LISTEN: "0.0.0.0:8080" + ASR_WEB_TOKEN: "${ASR_WEB_TOKEN:?Set ASR_WEB_TOKEN}" + PUBLIC_ORIGIN: "${PUBLIC_ORIGIN:-}" + BAILIAN_API_KEY: "${BAILIAN_API_KEY:-}" + BAILIAN_WS: "${BAILIAN_WS:-}" + FUNASR_API_KEY: "${FUNASR_API_KEY:-}" + FUNASR_WS: "${FUNASR_WS:-}" + BAILIAN_ASR_MODELS: "${BAILIAN_ASR_MODELS:-fun-asr-realtime}" + VOLC_APP_KEY: "${VOLC_APP_KEY:-}" + VOLC_APP_ID: "${VOLC_APP_ID:-}" + VOLC_ACCESS_TOKEN: "${VOLC_ACCESS_TOKEN:-}" + VOLC_RESOURCE_ID: "${VOLC_RESOURCE_ID:-volc.bigasr.sauc.duration}" + VOLC_WS: "${VOLC_WS:-wss://openspeech.bytedance.com/api/v3/sauc/bigmodel}" + logging: + driver: json-file + options: + max-size: "10m" + max-file: "3" diff --git a/deploy/__init__.py b/deploy/__init__.py new file mode 100644 index 0000000..f29a0c1 --- /dev/null +++ b/deploy/__init__.py @@ -0,0 +1 @@ +"""CLI deployment helpers; importing this package never changes cloud resources.""" diff --git a/deploy/aliyun.example.json b/deploy/aliyun.example.json new file mode 100644 index 0000000..41f5517 --- /dev/null +++ b/deploy/aliyun.example.json @@ -0,0 +1,15 @@ +{ + "region": "cn-beijing", + "public_ip": "123.56.71.98", + "project_tag": "ai-call", + "profile": null, + "adopt_instance_id": null, + "image_id": "", + "instance_type": "", + "vswitch_id": "", + "security_group_id": "", + "key_pair_name": "", + "spot_price_limit": null, + "system_disk_category": "cloud_essd", + "system_disk_gib": 40 +} diff --git a/deploy/aliyun_host.py b/deploy/aliyun_host.py new file mode 100644 index 0000000..18a893f --- /dev/null +++ b/deploy/aliyun_host.py @@ -0,0 +1,410 @@ +#!/usr/bin/env python3 +"""Read-only by default. Reuse/prepare the fixed Beijing host via the aliyun CLI.""" + +import argparse +import fcntl +import hashlib +import json +import math +import os +import shutil +import subprocess +import sys +import time +import uuid +from pathlib import Path + +REGION = "cn-beijing" +PUBLIC_IP = "123.56.71.98" + + +class CloudError(RuntimeError): + pass + + +class AliyunCLI: + def __init__(self, profile=None): + self.binary = shutil.which("aliyun") + if not self.binary: + raise CloudError( + "aliyun CLI is not installed; configure CLI credentials locally, never paste secrets into chat" + ) + self.profile = profile + + def __call__(self, product, action, **params): + cmd = [self.binary, product, action, "--RegionId", REGION] + if self.profile: + cmd += ["--profile", self.profile] + for key, value in params.items(): + cmd += [ + "--" + key, + json.dumps(value, separators=(",", ":")) + if isinstance(value, (list, dict, bool)) + else str(value), + ] + try: + result = subprocess.run( + cmd, capture_output=True, text=True, timeout=60, check=True + ) + data = json.loads(result.stdout) + if not isinstance(data, dict): + raise CloudError( + f"{product} {action} returned an invalid response shape" + ) + return data + except ( + subprocess.CalledProcessError, + subprocess.TimeoutExpired, + json.JSONDecodeError, + ) as exc: + # CLI diagnostics can contain request details; don't log raw stdout/stderr or credentials. + raise CloudError( + f"{product} {action} failed; inspect the authenticated CLI locally (no mutation retry here)" + ) from exc + + +def identity(cfg): + if cfg.get("region") != REGION or cfg.get("public_ip") != PUBLIC_IP: + raise CloudError("region/IP must remain cn-beijing / 123.56.71.98") + if ( + not isinstance(cfg.get("project_tag"), str) + or not cfg["project_tag"] + or len(cfg["project_tag"]) > 64 + ): + raise CloudError("a dedicated project_tag is required") + + +def parse_count(value): + try: + count = int(value) + except (TypeError, ValueError) as exc: + raise CloudError("invalid inventory count; no mutations allowed") from exc + if isinstance(value, bool) or count < 0: + raise CloudError("invalid inventory count; no mutations allowed") + return count + + +def instances(api, **filters): + found = [] + seen = set() + for page in range(1, 21): + data = api("ecs", "DescribeInstances", PageSize=100, PageNumber=page, **filters) + rows = data.get("Instances", {}).get("Instance") + if not isinstance(rows, list): + raise CloudError("malformed instance inventory; no mutations allowed") + for row in rows: + key = row.get("InstanceId") if isinstance(row, dict) else None + if not isinstance(key, str) or not key or key in seen: + raise CloudError( + "invalid or changing instance inventory; no mutations allowed" + ) + seen.add(key) + found.extend(rows) + total = data.get("TotalCount") + if total is not None: + expected = parse_count(total) + if len(found) == expected: + return found + if len(found) > expected or not rows: + raise CloudError( + "incomplete or changing instance inventory; no mutations allowed" + ) + elif len(rows) < 100: + return found + raise CloudError( + "instance inventory exceeded the safety bound; no mutations allowed" + ) + + +def eip(api): + data = api( + "vpc", "DescribeEipAddresses", EipAddress=PUBLIC_IP, PageSize=100, PageNumber=1 + ) + rows = data.get("EipAddresses", {}).get("EipAddress") + if not isinstance(rows, list): + raise CloudError("malformed EIP inventory") + if parse_count(data.get("TotalCount", len(rows))) != len(rows): + raise CloudError("incomplete EIP inventory") + matches = [row for row in rows if row.get("IpAddress") == PUBLIC_IP] + if len(matches) > 1: + raise CloudError("ambiguous EIP ownership") + if matches and not matches[0].get("AllocationId"): + raise CloudError("EIP allocation ID missing; no creation allowed") + return matches[0] if matches else None + + +def owned(row, cfg): + tags = row.get("Tags", {}).get("Tag", []) + return row.get("InstanceId") == cfg.get("adopt_instance_id") or any( + t.get("TagKey") == "project" and t.get("TagValue") == cfg["project_tag"] + for t in tags + ) + + +def plan(cfg, api): + identity(cfg) + address = eip(api) + if address and address.get("InstanceId"): + if address.get("InstanceType") != "EcsInstance": + raise CloudError( + "fixed EIP is attached to a non-ECS resource; refusing to rebind" + ) + rows = instances(api, InstanceIds=[address["InstanceId"]]) + elif address: + if address.get("Status") != "Available": + raise CloudError( + "EIP is not available; wait/reconcile instead of creating a host" + ) + rows = instances( + api, **{"Tag.1.Key": "project", "Tag.1.Value": cfg["project_tag"]} + ) + else: + rows = instances(api, PublicIpAddresses=[PUBLIC_IP]) + rows = [ + r + for r in rows + if PUBLIC_IP in r.get("PublicIpAddress", {}).get("IpAddress", []) + ] + if not rows: + raise CloudError( + "fixed IP is neither an owned EIP nor an existing ECS public IP; cannot recreate this address" + ) + if len(rows) > 1: + raise CloudError( + "multiple candidate instances; explicit reconciliation required" + ) + if address and address.get("InstanceId") and not rows: + raise CloudError( + "EIP attachment has no visible instance; do not create or detach" + ) + row = rows[0] if rows else None + if row and not owned(row, cfg): + raise CloudError( + "existing instance is not project-owned; set adopt_instance_id only after owner approval" + ) + return { + "region": REGION, + "public_ip": PUBLIC_IP, + "action": "reuse" + if row and (not address or address.get("InstanceId")) + else ("bind" if row else "create_and_bind"), + "instance_id": row.get("InstanceId") if row else None, + "instance_status": row.get("Status") if row else None, + "instance_charge_type": row.get("InstanceChargeType") if row else None, + "spot_strategy": row.get("SpotStrategy") if row else None, + "allocation_id": address.get("AllocationId") if address else None, + "ip_kind": "eip" if address else "instance_public_ip", + "warning": "spot interruption can terminate calls; fixed instance public IP is not recoverable like an EIP", + } + + +def create_params(cfg): + required = ( + "image_id", + "instance_type", + "vswitch_id", + "security_group_id", + "key_pair_name", + ) + if any( + not isinstance(cfg.get(k), str) + or not cfg[k].strip() + or cfg[k].startswith(("CHANGE_ME", "--")) + for k in required + ): + raise CloudError( + "creation requires approved image/type/VSwitch/security group/SSH KeyPair" + ) + price = cfg.get("spot_price_limit") + if ( + isinstance(price, bool) + or not isinstance(price, (int, float)) + or not math.isfinite(price) + or price <= 0 + ): + raise CloudError( + "a positive, finite spot_price_limit approved by the owner is required" + ) + disk = cfg.get("system_disk_gib", 40) + if isinstance(disk, bool) or not isinstance(disk, int) or not 40 <= disk <= 200: + raise CloudError( + "system_disk_gib must be within the approved 40–200 GiB safety bound" + ) + return { + "ImageId": cfg["image_id"], + "InstanceType": cfg["instance_type"], + "VSwitchId": cfg["vswitch_id"], + "SecurityGroupId": cfg["security_group_id"], + "KeyPairName": cfg["key_pair_name"], + "Amount": 1, + "InstanceName": cfg["project_tag"], + "InstanceChargeType": "PostPaid", + "InternetMaxBandwidthOut": 0, + "SpotStrategy": "SpotWithPriceLimit", + "SpotPriceLimit": price, + "SystemDisk.Category": cfg.get("system_disk_category", "cloud_essd"), + "SystemDisk.Size": disk, + "Tag.1.Key": "project", + "Tag.1.Value": cfg["project_tag"], + } + + +def save_state(path, data): + temporary = path.with_suffix(".tmp") + fd = os.open( + temporary, os.O_WRONLY | os.O_CREAT | os.O_TRUNC | os.O_NOFOLLOW, 0o600 + ) + with os.fdopen(fd, "w") as file: + json.dump(data, file) + file.flush() + os.fsync(file.fileno()) + temporary.replace(path) + directory_fd = os.open(path.parent, os.O_RDONLY | os.O_DIRECTORY) + try: + os.fsync(directory_fd) + finally: + os.close(directory_fd) + + +def wait_running(api, instance_id, sleep=time.sleep): + for _ in range(60): + rows = instances(api, InstanceIds=[instance_id]) + if len(rows) == 1 and rows[0].get("Status") == "Running": + return + if rows and rows[0].get("Status") in ("Stopped", "Stopping"): + raise CloudError( + f"instance {instance_id} is stopped; refusing to start or replace it automatically" + ) + sleep(5) + raise CloudError( + f"instance {instance_id} is not Running; preserve state and retry/reconcile, do not create manually" + ) + + +def apply(cfg, api, state_path, sleep=time.sleep): + state_path = Path(state_path) + state_path.parent.mkdir(parents=True, exist_ok=True) + if state_path.is_symlink(): + raise CloudError("state file must not be a symlink") + lock_fd = os.open( + str(state_path) + ".lock", os.O_WRONLY | os.O_CREAT | os.O_NOFOLLOW, 0o600 + ) + with os.fdopen(lock_fd, "w") as lock: + try: + fcntl.flock(lock, fcntl.LOCK_EX | fcntl.LOCK_NB) + except BlockingIOError as exc: + raise CloudError( + "another provisioning process owns this state file" + ) from exc + current = plan(cfg, api) # Re-read immediately before mutations. + instance_id = current["instance_id"] + if current["action"] == "reuse": + if current["instance_status"] != "Running": + raise CloudError( + "existing host is not Running; no automatic start/replace" + ) + return current + if current["action"] == "create_and_bind": + params = create_params(cfg) + fingerprint = hashlib.sha256( + json.dumps([REGION, PUBLIC_IP, params], sort_keys=True).encode() + ).hexdigest() + try: + state = ( + json.loads(state_path.read_text()) if state_path.exists() else {} + ) + except (OSError, ValueError) as exc: + raise CloudError( + "state file cannot be read; no creation allowed" + ) from exc + if not isinstance(state, dict): + raise CloudError("invalid state; no creation allowed") + if state and state.get("fingerprint") != fingerprint: + raise CloudError( + "creation configuration changed; reconcile old resources/state before proceeding" + ) + if not state: + state = {"fingerprint": fingerprint, "client_token": str(uuid.uuid4())} + save_state(state_path, state) # Persist BEFORE the billable request. + try: + uuid.UUID(state.get("client_token", "")) + except (ValueError, TypeError, AttributeError) as exc: + raise CloudError( + "invalid persisted ClientToken; reconcile state before creation" + ) from exc + result = api( + "ecs", "RunInstances", ClientToken=state["client_token"], **params + ) + ids = result.get("InstanceIdSets", {}).get("InstanceIdSet", []) + if len(ids) != 1: + raise CloudError( + "unexpected creation result; preserve ClientToken and reconcile" + ) + instance_id = ids[0] + state["instance_id"] = instance_id + save_state(state_path, state) + wait_running(api, instance_id, sleep) + latest = eip(api) + if not latest or latest.get("AllocationId") != current["allocation_id"]: + raise CloudError( + "fixed EIP changed/disappeared; created host preserved, no substitute IP" + ) + if latest.get("InstanceId") and latest["InstanceId"] != instance_id: + raise CloudError( + "EIP became attached to another instance; refusing to detach it" + ) + if not latest.get("InstanceId"): + if latest.get("Status") != "Available": + raise CloudError( + "EIP is not safely bindable; preserve instance and retry later" + ) + api( + "vpc", + "AssociateEipAddress", + AllocationId=latest["AllocationId"], + InstanceId=instance_id, + InstanceType="EcsInstance", + ) + for _ in range(30): + bound = eip(api) + if ( + bound + and bound.get("InstanceId") == instance_id + and bound.get("Status") == "InUse" + ): + return dict( + current, + action="ready", + instance_id=instance_id, + instance_status="Running", + ) + sleep(2) + raise CloudError( + "EIP binding not confirmed; preserve host/state and reconcile, do not allocate another address" + ) + + +def main(): + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument("--config", required=True) + parser.add_argument("--state", default=".local/aliyun-host.json") + parser.add_argument( + "--apply", + action="store_true", + help="owner-approved billable creation/EIP association", + ) + args = parser.parse_args() + try: + cfg = json.loads(Path(args.config).read_text()) + identity(cfg) + api = AliyunCLI(cfg.get("profile")) + result = apply(cfg, api, args.state) if args.apply else plan(cfg, api) + print(json.dumps(result, ensure_ascii=False, indent=2)) + except (CloudError, OSError, ValueError) as exc: + print(f"ERROR: {exc}", file=sys.stderr) + return 1 + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/deploy/asterisk.example.json b/deploy/asterisk.example.json new file mode 100644 index 0000000..e7302f6 --- /dev/null +++ b/deploy/asterisk.example.json @@ -0,0 +1,8 @@ +{ + "public_ip": "123.56.71.98", + "transport": "udp", + "local_net": "", + "ari_bind": "127.0.0.1", + "primary": {"host": "", "port": 5060, "auth_mode": "ip", "username": "", "register": false}, + "backup": {"host": "", "port": 5060, "auth_mode": "ip", "username": "", "register": false} +} diff --git a/deploy/asterisk.sh b/deploy/asterisk.sh new file mode 100644 index 0000000..f0c3c68 --- /dev/null +++ b/deploy/asterisk.sh @@ -0,0 +1,26 @@ +#!/usr/bin/env bash +# Check-only by default. Run with 'up' explicitly after host/IP/config approval. +set -euo pipefail +cd "$(dirname "$0")/.." +action="${1:-check}" +case "$action" in check | up) ;; *) + echo 'usage: bash deploy/asterisk.sh [check|up]' >&2 + exit 2 + ;; +esac +for file in http.conf ari.conf pjsip.conf rtp.conf extensions.conf; do + test -f "deploy/asterisk/generated/$file" || { + echo "Missing generated $file" >&2 + exit 1 + } +done +image="$(docker compose -f compose.asterisk.yaml config --format json | + python3 -c 'import json,sys; print(json.load(sys.stdin)["services"]["asterisk"]["image"])')" +if [[ ! "$image" =~ @sha256:[a-f0-9]{64}$ ]]; then + echo 'Asterisk image must be pinned to an approved SHA-256 digest' >&2 + exit 1 +fi +echo 'Compose, config files and image digest checked; verify container UID, network and fixed egress IP separately.' +if [[ "$action" == up ]]; then + docker compose -f compose.asterisk.yaml up -d +fi diff --git a/deploy/render_asterisk.py b/deploy/render_asterisk.py new file mode 100644 index 0000000..af17fcb --- /dev/null +++ b/deploy/render_asterisk.py @@ -0,0 +1,150 @@ +#!/usr/bin/env python3 +"""Render an explicit, outbound-only UDP baseline. Does not start services.""" + +import argparse +import ipaddress +import json +import os +import re +import shutil +import sys +import tempfile +from pathlib import Path + +PUBLIC_IP = "123.56.71.98" + + +def scalar(value, name, secret=False): + if ( + not isinstance(value, str) + or not value + or len(value) > 256 + or any(c in value for c in "\r\n;[]\\") + ): + raise ValueError(f"{name} is missing or contains unsupported INI characters") + if value.startswith("CHANGE_ME"): + raise ValueError(f"{name} is still a placeholder") + if secret and len(value) < 12: + raise ValueError(f"{name} must have at least 12 characters") + return value + + +def endpoint(name, data, env): + host = scalar(data.get("host"), name + ".host") + if ( + not re.fullmatch(r"[A-Za-z0-9.-]+", host) + or host == PUBLIC_IP + or host.endswith((".invalid", ".example")) + ): + raise ValueError( + f"{name}.host must be the SIP provider IPv4/DNS address, not our whitelisted IP or a placeholder" + ) + port = data.get("port", 5060) + if isinstance(port, bool) or not isinstance(port, int) or not 1 <= port <= 65535: + raise ValueError(f"{name}.port is invalid") + mode = data.get("auth_mode") + if mode not in ("ip", "digest"): + raise ValueError(f"{name}.auth_mode must be explicitly ip or digest") + registration = data.get("register", False) + if not isinstance(registration, bool) or registration and mode != "digest": + raise ValueError("registration requires explicit digest authentication") + text = f"[{name}]\ntype=endpoint\ntransport=transport-udp\ncontext=deny-inbound\ndisallow=all\nallow=ulaw\ndirect_media=no\nrtp_symmetric=yes\nforce_rport=yes\nrewrite_contact=yes\naors={name}-aor\n" + auth = "" + if mode == "digest": + user = scalar(data.get("username"), name + ".username") + if not re.fullmatch(r"[A-Za-z0-9_.+-]+", user): + raise ValueError("SIP username must be a plain user identifier") + password_key = "SIP_" + name.removeprefix("provider-").upper() + "_PASSWORD" + password = scalar(env.get(password_key), password_key, secret=True) + text += f"outbound_auth={name}-auth\nfrom_user={user}\n" + auth = f"\n[{name}-auth]\ntype=auth\nauth_type=userpass\nusername={user}\npassword={password}\n" + if registration: + auth += f"\n[{name}-registration]\ntype=registration\ntransport=transport-udp\noutbound_auth={name}-auth\nserver_uri=sip:{host}:{port}\nclient_uri=sip:{user}@{host}:{port}\nretry_interval=60\n" + text += ( + f"\n[{name}-aor]\ntype=aor\ncontact=sip:{host}:{port}\nqualify_frequency=10\n" + ) + return text + auth + + +def render(cfg, env): + if cfg.get("public_ip") != PUBLIC_IP or cfg.get("transport") != "udp": + raise ValueError( + "fixed public IP and UDP baseline required; TCP/TLS need a reviewed configuration" + ) + try: + network = ipaddress.ip_network(cfg["local_net"], strict=True) + bind = ipaddress.ip_address(cfg.get("ari_bind", "127.0.0.1")) + except (KeyError, ValueError) as exc: + raise ValueError( + "local_net and ARI bind address must be explicit valid IP configuration" + ) from exc + if network.version != 4 or not network.is_private or network.prefixlen < 8: + raise ValueError( + "local_net must be the actual private IPv4 VPC network, not a default route" + ) + if bind.version != 4 or bind.is_unspecified or not bind.is_private: + raise ValueError( + "ARI must bind to loopback or an approved private IPv4 management address" + ) + password = scalar(env.get("ARI_PASSWORD"), "ARI_PASSWORD", secret=True) + if len(password) < 32: + raise ValueError("ARI_PASSWORD must have at least 32 characters") + primary = endpoint("provider-primary", cfg.get("primary", {}), env) + backup = endpoint("provider-backup", cfg.get("backup", {}), env) + if (cfg["primary"]["host"], cfg["primary"].get("port", 5060)) == ( + cfg["backup"]["host"], + cfg["backup"].get("port", 5060), + ): + raise ValueError( + "primary and backup targets must be distinct; shared failure domains still require validation" + ) + transport = f"[global]\ntype=global\nuser_agent=ai-call\n\n[transport-udp]\ntype=transport\nprotocol=udp\nbind=0.0.0.0:5060\nlocal_net={network}\nexternal_signaling_address={PUBLIC_IP}\nexternal_media_address={PUBLIC_IP}\n\n" + return { + "http.conf": f"[general]\nenabled=yes\nbindaddr={bind}\nbindport=8088\n", + "ari.conf": f"[general]\nenabled=yes\npretty=no\n\n[outbound]\ntype=user\nread_only=no\npassword={password}\n", + "pjsip.conf": transport + primary + "\n" + backup, + "rtp.conf": "[general]\nrtpstart=10000\nrtpend=10800\nstrictrtp=yes\n", + "extensions.conf": "[deny-inbound]\nexten => s,1,Hangup()\nexten => _.,1,Hangup()\n", + } + + +def write_config(files, output): + output = Path(output) + if output.exists() or output.is_symlink(): + raise ValueError( + "output already exists; use a new version directory and review the change before switching" + ) + output.parent.mkdir(parents=True, exist_ok=True) + temporary = Path(tempfile.mkdtemp(prefix=".asterisk-render-", dir=output.parent)) + try: + for name, content in files.items(): + path = temporary / name + path.write_text(content) + path.chmod(0o600) + temporary.chmod(0o750) + temporary.rename(output) + except Exception: + shutil.rmtree(temporary) + raise + + +def main(): + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument("--config", required=True) + parser.add_argument("--output", default="deploy/asterisk/generated") + args = parser.parse_args() + try: + cfg = json.loads(Path(args.config).read_text()) + files = render(cfg, os.environ) + write_config(files, args.output) + print( + f"Rendered {len(files)} configuration files to {args.output}; services NOT started. Check container UID permissions before deployment." + ) + except (ValueError, OSError, KeyError) as exc: + print(f"ERROR: {exc}", file=sys.stderr) + return 1 + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/docs/SaaS交互_OpenAPI与MQ契约规划_v0.1.md b/docs/SaaS交互_OpenAPI与MQ契约规划_v0.1.md new file mode 100644 index 0000000..fa79a69 --- /dev/null +++ b/docs/SaaS交互_OpenAPI与MQ契约规划_v0.1.md @@ -0,0 +1,510 @@ +# SaaS 交互:OpenAPI 与 MQ 契约规划 + +**版本:** v0.3(沿用原文件路径) +**状态:** 租户独立命令队列+公平调度方案已确认;详细接口、配额数值及调度参数仍待评审,非已发布接口规范。仅更新规划,不实现服务、不部署、不拨号。 +**依据:** [一期呼出应用开发计划](一期呼出应用开发计划_v1.0.md)、项目根目录 `AGENTS.md`。 +**范围:** 现有 SaaS 与呼出应用的双向 HTTP 接口、RabbitMQ 命令/事件、OSS 录音交接及联调验收。本文细化已有六类 HTTP 接口,不建设通用开放平台。 + +> 阅读约定:第 1 节为已确认边界;其余路径、字段、状态、数值和安全方案均为建议草案,须由用户评审后冻结。出现 MUST/必须等约束,是拟发布契约应具备的要求,不表示现有运行代码已经支持。 + +**本次修订:** 补齐拨号前等待/查询、准入期限、资源原因码、发布背压和控制竞争样例;与一期计划统一 execution_id 及单线路启动。六类 HTTP 路径不变,不新增配额管理或租户队列管理接口;本版仍为待冻结草案,不升级 HTTP `/v1`。 + +## 1. 已确认的系统边界 + +1. **RabbitMQ 是唯一外呼执行指令入口**,不提供 HTTP 创建通话或重新拨号接口。 +2. **全部业务结果通过 MQ 回传**:受理/拒绝、控制生效、呼叫状态、文字、最终结果、录音就绪/失败等。HTTP 查询用于对账,不替代 MQ 事件。 +3. HTTP 仅承担任务控制、命令/通话查询、OSS 上传授权与完成确认、触发历史事件 MQ 补传。HTTP 上传完成确认是存储握手,不是业务结果回调。 +4. 录音先上传 OSS,校验成功并取得 OSS ID 后发布 `recording.ready`;MQ 不传录音二进制、Base64 或公开播放 URL。 +5. SaaS 负责客户/任务主数据、业务调度、业务重试决策、授权和长期存储;呼出应用只保存必要执行事实、控制屏障、幂等、资源租约和投递记录。 +6. 生产采用多机器、多 EIP 直连;每通电话固定 Cell/出口。SaaS 不逐呼改写共享 SIP 配置,也不能任意指定 SIP 地址、凭证或越权主叫。 +7. 目前只实现 ASR 验证基础,LLM/TTS 协议尚待新规范;本文对完整 AI 链路的描述是目标契约,不代表已启用或验收。 +8. **按租户 ID 映射到独立 RabbitMQ 命令队列,由呼出应用调度器负责租户间公平调度**。不再采用所有租户共用一个执行 FIFO;同时限制租户发布/积压、预取窗口及跨 Cell 并发/CPS。该架构已确认,命名和限值仍为草案。 + +## 2. 交付拆分与双方职责 + +| 交付物/能力 | 提供方 | 消费方 | +| --- | --- | --- | +| 呼出应用 HTTP:控制、查询、补传 | 呼出应用 | SaaS 后端 | +| SaaS HTTP:录音上传授权、完成确认 | SaaS/存储服务 | 呼出应用资产处理器 | +| `call.execute` 命令 | SaaS 业务调度器按可信租户归属发布、处理背压 | 呼出应用公平调度器按租户队列有界接收并准入 | +| 执行及资产事件 | 呼出应用 outbox 投递器 | SaaS 事件消费者 | +| MQ VHost、账号、ACL、持久队列和告警 | 运维按冻结契约配置 | 双方服务 | +| 对外发布规范、样例、错误码和验收用例 | 用户主导制定 | 双方评审实施 | + +建议冻结后交付两个 OpenAPI 3.1 文件,分别描述两个 HTTP 服务;MQ 使用 AsyncAPI 文档及 JSON Schema,不把 AMQP 消费者伪装成 HTTP Webhook。首版先有契约及样例,不引入 SDK 生成器或开发者门户。 + +## 3. 公共约定 + +### 3.1 标识与时间 + +| 字段 | 定义 | +| --- | --- | +| `tenant_id` | SaaS 租户 ID;请求中的值必须与服务身份获授权范围匹配,不能仅相信报文自报租户 | +| `task_id` / `task_item_id` | SaaS 任务/号码明细 ID;不因重试改变原明细归属 | +| `execution_id` | 建议新增:SaaS 为一次**获授权的业务外呼**分配的 ID;网络重试、消息重投和内部线路切换不变,业务重新外呼才新建 | +| `command_id` | 单条执行、控制或补传命令 ID;同一命令重试保持不变 | +| `call_id` | 呼出应用为一次业务执行分配的逻辑通话 ID;一个 `execution_id` 最多关联一个 `call_id` | +| `attempt_id` | 一次线路拨号尝试 ID;合法 FALLBACK 创建新的 attempt,但不创建第二个业务执行 | +| `event_id` | 事件身份;重试/历史补传保留原值及原内容 | +| `recording_id` / `upload_id` | 逻辑录音 ID / 上传会话 ID;授权续期不产生第二份逻辑录音 | +| `oss_id` | SaaS 存储服务确认的、不透明且稳定的资产 ID;不默认等同于 Object Key、ETag、文件名或 URL | +| `trace_id` | 链路关联信息,不用于授权或幂等 | + +- ID 均为不透明字符串,不按手机号、数字或 UUID 强制改写已有 SaaS ID;建议长度 1–128,拒绝控制字符、路径分隔符和空白首尾。最终字符集在 Schema 冻结。 +- 时间使用 RFC 3339 UTC,例如 `2026-09-11T08:00:00.000Z`;持续时间字段以 `_ms` 结尾,大小为字节,采样率为 Hz。 +- 未接通时 `answered_at` 为 `null`,不填写虚假接通时间;未完成的结果用明确状态,不用空字符串冒充成功。 +- 所有唯一键和检索均包含租户作用域。不同租户碰巧使用相同 ID,不能互相查询或命中幂等记录。 + +### 3.2 HTTP 共性 + +- 使用 HTTPS,仅服务到服务调用,不向浏览器或公网客户直接暴露内部接口。 +- 公共请求头:`Authorization: Bearer `、`X-Tenant-ID`、`X-Request-ID`;有 JSON 请求体时使用 `Content-Type: application/json`。可传播 `traceparent`。 +- Bearer 凭证优先接入双方已有服务身份体系,不另建账号平台;建议短期且限定 audience/scope/租户的令牌。跨管理网场景可增加 mTLS,具体签发/轮换方式列入 G0。 +- POST 必须提供 `Idempotency-Key`。控制/补传接口要求它等于 `command_id`;存储接口为一次逻辑操作生成稳定键。 +- 同租户、服务调用方、操作及幂等键下,相同语义请求返回原操作标识;请求内容不同返回 `409 IDEMPOTENCY_CONFLICT`。服务端对校验后的语义字段比较,不因 JSON 字段顺序产生冲突。 +- `202 Accepted` 仅代表命令与 outbox 已可靠持久化,返回查询位置;不是控制已生效或补传已完成。普通查询返回 `200`,首次创建上传会话返回 `201`,完成存储确认返回 `200`。 +- 同步校验/鉴权失败返回 HTTP 错误,不代表接受了命令;未通过鉴权的请求不产生租户业务事件。持久化受理后的业务结果必须走 MQ。 +- 成功响应直接返回资源对象;错误使用 `application/problem+json`,含 `type`、`title`、`status`、`code`、`detail`、`request_id`、`retryable`,不暴露堆栈和凭证。 + +### 3.3 重试及数据期限 + +- HTTP 超时或连接断开:先按原命令/幂等键查询或重试,不换 ID。只对网络错误、429 和约定可恢复 5xx 做有上限退避;遵守 `Retry-After`,不得无限重试业务拒绝。 +- 命令去重、控制屏障和事件保留期必须覆盖最大合法重投/恢复窗口;数据过期后不能把旧执行当作新执行。 +- 执行 ID 去重记录的清理需依赖“该授权已永久失效”的可靠依据;控制停止墓碑同理。未建立安全清理机制前,不能仅凭普通 TTL 删除防重拨屏障。 +- 已知但超出事件补传保留期返回 `410 REPLAY_EXPIRED`;不存在或无权访问资源统一返回 `404`,避免跨租户枚举。 + +## 4. HTTP OpenAPI 规划 + +两个服务分别使用自己的 Base URL,不共享服务实现;下表路径均为相对各自服务根路径。 + +| 提供方 | 方法与路径 | 最小权限 | 结果 | +| --- | --- | --- | --- | +| 呼出应用 | `POST /internal/v1/outbound/tasks/{task_id}/controls` | `outbound.control` | 202;持久化控制命令 | +| 呼出应用 | `GET /internal/v1/outbound/commands/{command_id}` | `outbound.read` | 200;命令与生效状态 | +| 呼出应用 | `GET /internal/v1/outbound/calls/{call_id}` | `outbound.read` | 200;执行事实与资产/投递快照 | +| 呼出应用 | `POST /internal/v1/outbound/calls/{call_id}/replays` | `outbound.replay` | 202;受控历史事件补传 | +| SaaS | `POST /internal/v1/outbound/recording-uploads` | `recording.upload` | 201/200;创建或取得原上传会话 | +| SaaS | `POST /internal/v1/outbound/recording-uploads/{upload_id}/complete` | `recording.complete` | 200;存储验证成功,确认 OSS ID | + +### 4.1 任务控制 + +请求字段: + +| 字段 | 必填 | 规则 | +| --- | --- | --- | +| `command_id` | 是 | 与 `Idempotency-Key` 一致 | +| `action` | 是 | `pause` / `resume` / `stop` | +| `expected_task_revision` | 是 | SaaS 认为当前应有的控制版本 | +| `task_revision` | 是 | 本次目标版本,必须等于 expected + 1 | +| `active_call_policy` | stop 时是 | `drain` / `hangup`;不设隐藏的强制挂断默认值 | +| `reason` | 是 | 有界审计原因,不放敏感客户资料 | + +响应字段:`command_id`、`task_id`、`status=accepted`、`requested_task_revision`、`accepted_at`;`Location` 指向命令查询接口。 + +建议状态与竞争规则: + +- `task_revision` 仅表示任务控制栅栏版本,不表示智能体配置版本。首版建议初始版本为 1,任务初始运行;尚未收到 execute 时的控制,也必须能为获授权任务建立持久屏障。 +- 基于服务身份及双方可信任务绑定验证归属;不能因第一次见到任意 task_id 就将其认领给请求租户。任务绑定来源在 G0 确认,可来自获授权 SaaS 主数据或其受信发布边界,不额外开放拨号入口。 +- 同任务控制串行化,提交时 CAS 校验 expected;版本冲突或另一个控制尚在生效中返回 409。重复 command_id 先走幂等,不重复推进版本。 +- 暂停/停止受理后,先禁止发放新的拨号许可,再等待所有相关 Cell 上的在途许可完成或失效;确认后才能回传 `applied`。存在状态不明节点时保持 `applying/reconciling`,不能虚报全局生效。 +- 每次真实发起和 FALLBACK 都检查当前控制版本、状态、授权期限及有效资源租约;节点失联或租约过期停止新发起。仅把数据库改为 paused 不足以形成屏障。 +- `pause`:已拨出和已接通电话继续原生命周期;未发起执行不再启动,报告阻止原因。`resume`:允许新版本指令,不自动重放旧积压。 +- 旧版本命令拒绝;未来版本命令也不自动缓存为可执行。SaaS 如需重新调度被阻止且确认未拨号的执行,先完成对账及业务授权,再生成新的执行命令,不能由消费者静默换 ID 重试。 +- `stop + drain`:停止新发起,已有电话自然结束;`stop + hangup`:额外需要 `outbound.hangup` 权限,审计后终止该任务已有通道。挂断未确认前不能宣称 hangup 控制已完全生效。 +- stopped 不允许 resume;重新开展业务使用新任务,避免迟到指令复活。控制失败后不能自行放开已经建立的暂停/停止屏障。 +- HTTP 查询和 MQ `command.result` 均区分 requested revision 与 applied revision;这项多 Cell 屏障能力为待实现项。 + +### 4.2 命令查询 + +通用返回:`command_id`、`command_type`、`task_id/call_id`(适用时)、`status`、`reason_code`、`accepted_at`、`updated_at`。 + +- execute:`accepted` / `waiting` / `rejected` / `executing` / `completed` / `reconciling`;accepted 仅表示可靠受理,waiting 表示已进入有界准入等待,executing 表示已提交拨号意图、不等于 SIP 已实际发出或接通;completed 指执行生命周期结束,不等于客户接通或业务成功。 +- control:`accepted` / `applying` / `applied` / `rejected` / `failed` / `reconciling`,另含 requested/applied revision 和当前任务状态。 +- replay:`accepted` / `running` / `completed` / `failed`,另含快照截止点、已选/已确认发布数量;completed 不代表 SaaS 已入库。 +- HTTP 校验阶段就被拒绝、未持久化的命令允许查询不到;MQ 收到的合法业务拒绝应持久化并可查询。 + +execute 查询及对应 `command.result` 建议共用以下字段,MQ 的等待/状态变化仍按 command 聚合版本合并: + +| 字段 | 规则 | +| --- | --- | +| `execution_id` | 原业务授权执行 ID,受理后始终可关联 | +| `call_id` | 首次资源准入成功并提交拨号意图时创建;此前为 `null`,不伪造通话记录 | +| `wait_reason_code` | waiting 时必填:`SCHEDULER_WAIT`、`TENANT_CONCURRENCY_EXHAUSTED`、`TENANT_CPS_EXHAUSTED`、`ROUTE_CAPACITY_EXHAUSTED`、`CAPACITY_EXHAUSTED`;非 waiting 为 `null` | +| `waiting_since` | 首次进入 waiting 的服务端时间;原因变化不重置,离开等待后保留;未等待为 `null` | +| `admission_deadline` | 受理时固定的首次发起准入截止时间;拒绝于受理前时为 `null`,重投/重启不延长 | +| `updated_at`、`aggregate_version` | 当前命令快照的更新时间和版本;HTTP 与 MQ 使用同一版本域。HTTP 为响应字段,MQ 的 aggregate_version 只在事件外壳中,不重复放入 payload | + +- waiting 的原因表示当前主要阻塞项,不是完整资源诊断或预计开始时间;多个条件同时不足时按 G0 冻结的优先级选择。原因改变可发布新版本快照,不按轮询周期重复发事件。 +- 首次发起前以 `(tenant_id, command_id)` 查询;尚在 broker 队列、未被呼出侧持久化的命令允许返回 404。404 不证明消息未发布或电话一定未发生,不能据此换 execution_id 重拨;SaaS 保留原发布记录并用原 ID 对账/有限重试。 +- 状态路径为 `accepted → waiting → executing → completed`,有资源时可跳过 waiting。尚未提交拨号意图的 accepted/waiting 可因过期、控制或准入超时进入 rejected;提交意图后出现不确定性进入 reconciling,不回退 waiting 或以“未拨号拒绝”释放未知占用。 + +### 4.3 通话查询 + +返回 `call_id`、`execution_id`、任务关联、`call_state`、`call_version`、起止时间、结果原因及以下独立信息: + +- `attempts`:每次 attempt 的状态、原因、`trunk_id`、`egress_pool_id`、`cell_id`、时间;不暴露 SIP 密码或内部管理地址。 +- `transcript`:处理状态、最终稿数量及是否仍有待完成段落;首版查询不返回整段文字,文字正文通过 MQ 到 SaaS。 +- `recordings`:录音标识、处理状态、确认后的 `oss_id` 和失败原因;不返回上传凭证或播放链接。 +- `delivery`:待投递/失败数量、最后确认发布时间。RabbitMQ confirm 仅表示 broker 接收,`saas_applied` 未有应用层证据时必须为 unknown,不能猜测为已入库。 +- 附 `snapshot_at`;查询是某一时点的执行快照,SaaS 根据版本合并,不用旧快照覆盖较新事件。 + +### 4.4 历史事件补传 + +请求:`command_id`、`event_types`(允许列表)、可选 `event_ids`、`reason`。范围始终限定到路径中的 call_id 和当前租户;event_ids 提供时与 event_types 取交集,不得跨通话。 + +- 在受理时记录固定事件截止点与选择条件;重复请求使用同一个补传任务和截止点,不把后续新事件悄悄纳入。 +- 所有被选事件必须来自原持久化事件记录;保留 event_id、原时间和原 payload,可仅在传输头标记 replay。禁止重新合成历史业务事实。 +- 只重发结果/文字/录音元数据;不执行拨号、不重放 `call.execute`、不重传录音文件、不重新调用 LLM/TTS。 +- 对补传限速并独立计量,避免挤占实时结果队列;部分成功允许重试未确认部分,重复投递由 SaaS 去重。 +- 补传命令自身结果也走 MQ `command.result`;不把本次补传生成的结果循环纳入本次选择集。 + +### 4.5 录音上传授权 + +请求:`recording_id`、`call_id`、`content_type`、`size_bytes`、`checksum_algorithm`、`checksum`、`channels`、`sample_rate_hz`、`duration_ms`。上传前须封口文件,确保大小和校验值稳定。 + +返回:`upload_id`、`recording_id`、`expires_at`、`upload_method`、`upload_url`、`required_headers`、约束及已完成会话的 `oss_id`(如有)。 + +- 首版建议单文件签名 PUT;最长录音推导的文件上限不满足单 PUT 或恢复窗口时,再增加分片协议,不在本版虚构分片接口。 +- SaaS 按 tenant/call/recording 绑定会话并分配存储位置,不接受调用方任意 bucket/object key。因 MQ 延迟尚无通话记录时,不绕过归属检查;返回可重试 `CALL_NOT_REGISTERED`,呼出侧保留本地文件。 +- 同一逻辑录音禁止因重复申请产生第二份资产;授权失效后重新请求原会话,可返回新的临时签名,但会话、对象和内容约束保持不变。更换内容必须使用明确的新录音版本。 +- URL 为受控 OSS HTTPS 目标,服务端限制可访问域名/存储端点、不跟随任意重定向,防止上传器成为 SSRF 或外传通道。 +- 凭证只允许指定对象写入,不授予列桶/删桶/任意对象权限;完成对象应不可被原授权继续覆盖,使用 OSS 禁止覆盖约束或可靠对象版本固定机制。 +- 授权响应 `Cache-Control: no-store`;签名 URL、token、required_headers 中的秘密不得进入日志或 MQ。 + +### 4.6 上传完成确认 + +请求:`recording_id`、`size_bytes`、`checksum_algorithm`、`checksum`,可带 OSS 返回的 `etag`(仅作辅助,不当作文件内容摘要)。 + +- SaaS 根据 upload_id 找到受控目标,核验调用方、对象实际存在、大小、实际内容校验及录音绑定;不能只相信客户端提交的 checksum 或对象自报元数据。 +- 校验算法需选择 OSS/存储服务能够独立验证的机制并冻结;无法独立验证时不能声称校验成功。ETag 尤其在分片/加密情况下不等于文件 MD5。 +- 对象未就绪返回可重试错误;内容冲突进入隔离/人工处置,不创建就绪资产。 +- 验证成功,幂等返回 `upload_id`、`recording_id`、`status=verified`、`oss_id`、`verified_at`。确认超时后用原幂等键重试,不能新建第二份录音。 +- 呼出侧把 verified 事实与 `recording.ready` outbox 同事务持久化,再由 MQ 投递。SaaS 只有消费 ready 后才将资产作为业务录音关联展示。 +- 任一步失败通过 `recording.failed` 回传可恢复性与原因;未取得有效 oss_id 不发布 ready。本地文件清理受恢复期限和已可靠持久化交接证据约束,不能仅收到 HTTP 200 就无条件删除。 + +## 5. RabbitMQ 拓扑与传输 + +### 5.1 最小拓扑草案 + +| 对象 | 名称建议 | 用途 | +| --- | --- | --- | +| 环境 VHost | `/ai-call-` | 测试/生产隔离,具体路径由运维配置 | +| 命令 Topic Exchange | `ai-call.commands.v1` | Routing Key 为 `tenant.{tenant_key}.call.execute`;消息类型仍为 `call.execute` | +| 租户独立命令队列 | `ai-call.executor.{tenant_key}.v1` | 一租户一队列,精确绑定该租户 Routing Key;公平调度器有界读取,共享持久去重存储 | +| 事件 Topic Exchange | `ai-call.events.v1` | 发布第 7 节允许的事件 | +| SaaS 事件队列 | `ai-call.saas.events.v1` | SaaS 消费落库 | +| 死信 Exchange | `ai-call.dead.v1` | 隔离无效消息与耗尽重试 | +| 死信队列 | `ai-call.commands.dead.v1`、`ai-call.events.dead.v1` | 分方向审计与受控恢复 | + +- `tenant_key` 是平台将 tenant_id 唯一映射为安全单段路由标识的结果,禁止点号、通配符、碰撞和调用方任意指定;原始 tenant_id 仍保留在正文。发布与消费均校验队列绑定、租户归属和正文一致,发现错配隔离告警,不向错误租户执行。 +- 本轮仅改变执行命令的租户隔离拓扑,事件队列不自动扩展为一租户一队列;事件消费和补传仍需限速及租户校验,不能由此宣称结果链路已有同等等待时延保证。 +- Exchange/Queue durable,业务消息 persistent;生产建议 quorum queue,最终以现有 RabbitMQ 版本及 HA 部署确认,不把 durable 单节点当高可用。 +- 命令/事件分别使用最小权限账号,TLS 连接;SaaS 不能消费执行器队列,呼出应用不能消费 SaaS 事件队列,也不能发布 execute 指令。 +- 所有生产者使用 publisher confirm + mandatory/不可路由检查;消费者手动 ACK,只在本地必要数据持久化成功后 ACK。 +- 队列不替代业务状态库;多消费者不承诺全局顺序。业务版本负责乱序合并,数据库约束和执行租约负责去重/准入。 +- 可信 SaaS 生产者可被授权发布多个租户;发布者身份来自 broker 账号及受控发布边界,不信任可伪造的 message header。若开放非受信租户直连 MQ,必须另做租户隔离设计,本期不开放。 +- 命令业务过期以 `not_after` 校验为准,队列 TTL 仅用于积压治理。过期命令应有可追踪的拒绝/隔离记录,不静默消失;DLQ 恢复不能绕过有效期和停止屏障。命令重试/恢复必须回到原租户调度域并受相同配额约束,不经全局重试 FIFO 直接抢占执行。共享死信队列只用于隔离审计,不是执行入口。 +- 消费瞬时故障不得无限 `nack(requeue=true)` 热循环;采用有上限的延迟重试/持久重试记录。若发布到重试队列,必须等新发布确认后再 ACK 原消息,并依靠幂等承受重复。 +- 死信路径也要验证不丢失;quorum 至少一次 dead-letter 或应用确认后转存二选一落实,不能默认普通 DLX 搬运具有端到端保证。 +- 非法 Schema/未知主版本进入隔离队列,不凭不可信字段向任意租户发送错误事件;可安全识别的合法业务拒绝发布 `command.result` 后完成处理。 + +### 5.2 传输属性 + +`content_type=application/json`、UTF-8、`delivery_mode=2`、`message_id=command_id/event_id`、`type=command_type/event_type`;`correlation_id` 可使用 command_id,正文 trace_id 负责跨环节跟踪。 + +建议消息上限 256 KiB、HTTP JSON 请求体上限 64 KiB,均待容量/样例验证;超限拒绝或按已定义的文字分段规则发送,禁止静默截断最终文字。MQ 不传文件或服务凭证。 + +### 5.3 租户公平调度(架构已确认,参数待冻结) + +```text +SaaS 持久任务/发布记录 + → 命令 Exchange:按可信 tenant_id 映射路由 + → 租户 A 命令队列 ┐ + → 租户 B 命令队列 ├→ 公平调度器 → 租户额度+完整资源租约 → 固定 Cell/出口 + → 租户 C 命令队列 ┘ +``` + +1. **责任分离:** SaaS 决定业务任务、号码和重新外呼授权,并按租户发布;呼出应用决定租户间执行机会和物理资源分配。不要求 SaaS 等待上一租户批次执行完才发布下一租户,也不复制其任务编排系统。 +2. **轮转而非排空:** 默认建议活跃且可调度租户等权轮询,差异化服务获确认后采用加权轮询。每轮每租户最多取有限条命令;租户没额度、线路不可用时跳过,不能阻塞全局循环。新活跃租户应及时加入轮转,不能等待 A 队列排空。权重由平台配置,不接受每条消息自报高优先级。 +3. **有界预取与持久待执行窗口:** 按租户及全局限制 prefetch/未 ACK 和已 ACK 未发起数量;队列不等于进程,一租户一队列不要求一套服务。禁止先把全部租户消费到同一个无界内存 FIFO;已持久化的待执行命令及重启恢复也按租户公平选取。prefetch 本身不是公平算法。 +4. **配额双重检查:** 读取前检查租户可接收窗口/资源可用性,持久化命令及去重/outbox 后 ACK;这不是提前保证拨号容量。实际发起必须原子取得租户额度并同时满足供应商并发/CPS、Cell 端口、出口健康、AI 配额和控制屏障,失败释放未使用预留。已受理命令的有限等待/拒绝按第 6.2 节处理;尚未取出的命令受队列积压上限及有效期约束。 +5. **多实例与恢复:** 多个调度器需通过租户调度所有权/租约及隔离令牌协调同一租户的轮次、窗口和额度,不能每个实例独立再分一份。公平性覆盖整个调度域,不只覆盖每个进程自己的队列。失去所有权的旧实例停止分配;已拨通但状态不明的占用不能仅因租约到期就释放,需对账,防止超额与重复拨号。具体协调实现待设计评审。 +6. **公平的边界:** 保证有可用资源和租户额度时不被另一租户积压饿死,不保证相同接通数或相同通话时长。资源已被活动通话占满时等待释放,不为公平挂断电话。若要明确开始时限,另确认不可借用保底容量或受限借用策略,覆盖线路/AI/Cell 全链路;不能把空闲份额借出后又承诺立即收回。 + +| 租户限制 | 统计范围/约束 | +| --- | --- | +| 并发占用上限 | 跨所有 Cell 汇总,包含发起预留、拨号、振铃、接通及待对账占用;从发起前占用到确认资源结束后释放 | +| CPS 上限 | 跨所有调度实例和 Cell 统计真实拨号尝试,包括 FALLBACK;切线路不重置租户额度 | +| 接收/待发起窗口 | 每租户和全局的未 ACK、已持久化未发起数量均有界;拒绝/过期处理不得绕成新的无界工作队列 | +| 发布速率、队列容量 | 每租户限制消息数/字节、发布速率并辅以全局 broker 水位保护;独立队列仍共享磁盘、内存及网络 | +| 调度权重 | 默认建议等权;只改变有竞争时新增许可份额,不绕过硬上限,不保证通话时长比例 | + +### 5.4 队列生命周期与背压 + +- 平台依据可信租户注册关系幂等创建队列、精确绑定和权限,再允许 SaaS 发布;启动/故障恢复能重新发现活跃队列,不依赖仅存在于内存的清单。租户停用先拒绝新发布并建立控制屏障,完成积压/活动通话/重试及去重保留处置后才能删除队列,不以自动过期直接删积压。 +- 本期仅可信 SaaS 发布服务连接 broker,最终用户不直连。发布服务强制执行每租户路由、速率和容量策略;AMQP 普通资源 ACL 不能替代可信发布服务的逐租户授权校验。 +- 队列满采用明确拒绝发布的溢出策略(建议验证 `reject-publish` 与 quorum 的组合),不能丢弃队头旧命令来给新命令让路。SaaS 任务/发布记录持久保留;nack、不可路由或 confirm 不确定时,有限退避后使用原 command_id/execution_id 重试,不换 ID、不转投其他租户队列。broker blocked/全局水位达到阈值时也要背压。 +- 消费端的公平轮转不能隔离发布洪峰的全部成本;大任务可长期保留在 SaaS 数据库,向本租户 MQ 分批有界推送。允许积压但不允许无限灌入;不能以独立队列为由承诺任意租户数、无限 quorum 副本或无限 broker 吞吐。 +- HTTP 暂停/停止控制保持原路径,不排在 A 的大批 execute 后;实际发起前的屏障校验仍强制执行。补传/失败重试不能绕过租户配额占满执行资源。 + +发布结果必须与呼出应用的业务受理区分: + +| AMQP 结果 | SaaS 处理 | +| --- | --- | +| confirm ACK 且未收到 mandatory return | broker 已接收并路由,不代表呼出应用已受理、已准入或已拨号 | +| mandatory return(不可路由) | 持久保留原发布记录,修复租户队列/绑定后在有效期内原 ID 有限重试;不得转投其他租户 | +| confirm NACK(含队列满时拒绝发布) | 记录发布未成功并退避;原因依 broker 诊断,不能把所有 NACK 都当成队列满 | +| confirm 超时、连接中断或 broker blocked | 状态不确定/发布受阻,实施背压;原 ID 有限重试并接受可能重复,不能假定消息未入队 | + +以上不是 HTTP 429,也不是 MQ `command.result` 业务拒绝;队列创建/绑定/配额通过受控平台配置落实,首版不新增管理 API。正文租户、路由键、队列绑定的正反例和 broker 版本相关的满队列行为必须纳入契约测试。 + +## 6. 执行命令 `call.execute` + +### 6.1 字段 + +通用外壳:`schema_version`、`command_type=call.execute`、`command_id`、`tenant_id`、`trace_id`、`issued_at`、`not_after`、`payload`。 + +payload 必需: + +| 字段 | 说明 | +| --- | --- | +| `execution_id`、`task_id`、`task_item_id` | 业务授权执行及任务归属 | +| `task_revision` | 必须等于当前生效且允许运行的控制版本 | +| `callee` | 原始业务被叫字符串,不提前拼供应商前缀 | +| `route_policy_id` | 已配置且获租户授权的线路策略引用,可只包含一个供应商 | +| `caller_profile_id` | 已授权主叫引用,不允许 arbitrary From/PAI | +| `agent_version_id` | 服务端已可解析的不可变智能体配置版本 | +| `variables` | 经字段白名单、类型/长度校验的运行变量,不是任意代码或任意 URL | +| `ring_timeout_ms`、`max_call_duration_ms` | 不超过服务端和供应商上限 | + +agent_version_id 必须对应呼出侧可用且可信的快照;配置如何同步、LLM/TTS 参数和取消/音频契约留待新规范。缺失配置明确拒绝,不私自读取旧 voice_test LLM/TTS 或任意远程 URL。 + +线路策略由呼出侧解析为授权 `trunk_id + egress_pool_id + cell_id`,实际选择写入事件。呼叫固定 Cell/出口;允许的 FALLBACK 也必须兼容同一 Cell/出口及供应商白名单,无适合备用就失败,不迁移活动通话。当前只有一家线路,不虚构 backup。 + +### 6.2 幂等与发起 + +1. 验证身份边界、Schema 和 tenant/task 关联;对已记录的 command_id/execution_id 先检查语义冲突并返回/关联原结果,不因重投时已过期或控制已变而改写原事实。新执行再检查有效期、控制版本和配置/线路授权;防重查重不绕过当前调用方的租户访问校验。 +2. 事务记录命令,使用 `(tenant_id, command_id)` 唯一键;另以 `(tenant_id, execution_id)` 保护业务执行,换 command_id 也不能绕过同一次执行去重。 +3. 同 execution_id 的语义冲突拒绝;相同执行重复只关联原结果,不能再次拨号。接受/拒绝事实及其 outbox 同事务提交,随后 ACK。 +4. 在租户公平调度下,实际拨号前原子取得跨 Cell 的租户并发/CPS 额度及供应商并发/CPS、Cell 端口/出口健康和 AI 配额等完整租约,重新检查有效期与控制屏障。已受理不等于已获得资源,FALLBACK 不绕过租户额度。 +5. 受理时固定 `admission_deadline = min(not_after, accepted_at + 服务端准入窗口)`,窗口值在 G0 冻结,不允许消息自报延长。broker 中未消费的等待不计入该窗口,但始终消耗 issued_at→not_after 的授权期限;取出时已过期直接拒绝。等待进入/原因变化及退出通过第 4.2 节查询和 MQ 事件表达。 + - 首次发起在持久化意图前检查:`now >= not_after` 优先拒绝为 `COMMAND_EXPIRED`;否则 `now >= admission_deadline` 按当前资源瓶颈拒绝,返回对应租户/线路/系统资源原因码;纯调度等待或截止时资源刚释放但尚未发起,均返回 `ADMISSION_TIMEOUT`。拒绝原因写入 `reason_code`,非 waiting 的 wait_reason_code 清空,保留 waiting_since 和 admission_deadline。到期处理不依赖资源释放或该租户再次获调度,必须有界扫描/唤醒并终结待发起命令;允许的处理延迟在 G0 冻结。 + - 已受理后拒绝需持久化并经 MQ 发布,不因原消息已 ACK 而丢失终结结果;准入失败释放已确认未使用的预留,不释放状态不明占用。是否新建获授权业务执行由 SaaS 对账后决定,不无限排队或私自重拨。 + - admission_deadline 只约束首次发起,不挂断已拨出/已接通电话;`not_after` 是每次新拨号尝试(包括 FALLBACK)的发起截止时间,不是活动通话的强制结束时间。FALLBACK 仍受总尝试/执行限制、控制屏障、租户 CPS 和完整资源准入约束,不能借其延长首次等待。 +6. ARI 发起前持久化意图、call_id/attempt_id 和固定通道关联;执行器真实发起前再次检查有效期、控制/租约及首次准入截止,不能仅凭早先提交意图越过截止。已提交意图但确认尚未发出且授权失效时,以 completed 和对应失败/取消的 call.finished 收尾,不回退为无 call_id 的 rejected;是否已发出不明时进入 reconciling。网络超时/重启先对账,已接通或旧通道未确认结束时禁止创建备用尝试。 + +## 7. MQ 事件契约 + +### 7.1 通用外壳与合并 + +必需:`schema_version`、`event_id`、`event_type`、`tenant_id`、`trace_id`、`occurred_at`、`aggregate_type`、`aggregate_id`、`aggregate_version`、`payload`。 + +- 聚合标识按 command/call/transcript_segment/recording 分域;版本由对应事实持久化事务单调递增,不依赖消息到达时间。 +- command/task/call/attempt 关联按事件类型必填;尚未生成 call_id 的拒绝不伪造 call_id。 +- SaaS 以 `(tenant_id, event_id)` 建 inbox 唯一键,并将业务更新和 inbox 同事务提交,成功后 ACK。 +- 版本比较限定同一实体及同一状态域。较旧事件不回退状态,但仍可补充尚未落库的独立 attempt/录音记录;不能用一个全局“最大版本”丢弃其他资产或文字。 +- 事件 payload 是该事件声明的状态域快照;call.finished 的终态与资产处理状态分别合并,不能覆盖后到或先到但更新的 recording.ready。 +- 不承诺端到端 exactly-once;采用至少一次传输、持久去重及外部拨号副作用对账。 + +### 7.2 事件列表 + +| Routing Key / event_type | 必需业务数据 | 合并规则 | +| --- | --- | --- | +| `command.result` | command_id、command_type、status、reason_code;适用的任务/执行/通话关联及版本;execute 增加第 4.2 节等待/准入字段 | 以 command 聚合版本更新;区分 accepted、waiting、executing、applied、completed;不把等待当成已拨号 | +| `call.status` | call_id、execution_id、任务关联、call_state、call_version、attempt_id、attempt 状态、实际线路/Cell/出口、时间/原因 | 保持 call/attempt 各自状态,不让迟到 ringing 回退 answered/ended | +| `transcript.updated` | call_id、turn_id、segment_id、role、revision、text、is_final、start_ms、end_ms、playback_state | 同 segment 较高 revision 替换;最终稿不能被迟到中间稿覆盖 | +| `call.finished` | call_id、execution_id、任务关联、call_version、outcome、起止时间、时长、原因、attempt 汇总及资产处理快照 | 固定通话终态;后处理未完成时标为 pending,不阻塞终态 | +| `recording.ready` | call_id、recording_id、oss_id、格式、声道、采样率、时长、大小及校验 | 只接收已验证资产;不包含上传凭证或公开 URL | +| `recording.failed` | call_id、recording_id、stage、reason_code、retryable、next_retry_at(若有) | 标记资产故障,不改变通话终态;后续合法 ready 可完成恢复 | +| `transcript.failed` | call_id、原因、retryable、受影响 segment(适用时) | 明确文字不完整,不能把部分文本假装最终完整记录 | +| `contact.opt_out` | call_id、task_id、task_item_id、请求时间、关联 turn/segment(若有) | SaaS 及时持久化拒绝再联系并阻止后续业务调度;不等待挂断 | + +后两类事件补齐文字失败及拒绝再联系的可追踪闭环;opt_out 的触发判定需由业务及新 AI 规范确认,不能默认靠未经验证的关键词误判。 + +文字 role 建议为 `customer` / `agent` / `system`;playback_state 使用 `not_applicable` / `generated` / `sent` / `playback_confirmed` / `cancelled` / `unknown`。只能报告实际具备的播放证据,不能将“已生成/已发送”写成“客户已听见”。超长 turn 拆成稳定 segment;最终稿是否允许修订及保留要求由 G0 冻结。 + +### 7.3 通话与资产状态 + +- call_state:`queued → dialing → ringing → answered → ended`,允许省略未发生的阶段。queued 仅表示已创建 call_id 并持久化意图但尚无实际发起证据;资源准入前的 waiting 属于命令状态,不提前创建通话。dialing/振铃/接通须有对应执行证据。失败可从任一未接通阶段进入 ended;FALLBACK 保持逻辑通话未结束并新增 attempt,不能回退成新业务通话。 +- outcome:`completed` / `busy` / `no_answer` / `rejected` / `failed` / `cancelled` 等标准值;completed 仅表示正常结束,不是营销成交。最终值及 SIP/Asterisk 映射待供应商确认。 +- 对账状态单独为 `reconciling`,不要凭本地连接断开生成虚假通话终态。 +- recording:`pending → uploading → verifying → ready`,失败另记 retryable/原因;transcript:`pending/streaming/finalized/failed`;delivery:`pending/broker_confirmed/failed`。三类后处理不改写 ended。 + +## 8. 最小交互样例 + +以下 ID 为示例,不是现网资源、真实号码或可调用配置。 + +### 8.1 暂停任务 + +```http +POST /internal/v1/outbound/tasks/task-demo/controls +Authorization: Bearer +X-Tenant-ID: tenant-demo +X-Request-ID: req-demo-01 +Idempotency-Key: cmd-pause-demo +Content-Type: application/json + +{"command_id":"cmd-pause-demo","action":"pause","expected_task_revision":1,"task_revision":2,"reason":"operator_pause"} +``` + +```json +{"command_id":"cmd-pause-demo","task_id":"task-demo","status":"accepted","requested_task_revision":2,"accepted_at":"2026-09-11T08:00:00.000Z"} +``` + +HTTP 返回 202 后,直到收到 MQ applied 或查询到 applied,SaaS 才能显示“暂停已生效”。即使收到 applied,已有通话也可能继续。 + +### 8.2 控制生效事件 + +```json +{ + "schema_version": "1.0", + "event_id": "evt-pause-demo", + "event_type": "command.result", + "tenant_id": "tenant-demo", + "trace_id": "trace-demo", + "occurred_at": "2026-09-11T08:00:01.000Z", + "aggregate_type": "command", + "aggregate_id": "cmd-pause-demo", + "aggregate_version": 2, + "payload": { + "command_id": "cmd-pause-demo", + "command_type": "task.control", + "task_id": "task-demo", + "status": "applied", + "reason_code": "CONTROL_APPLIED", + "requested_task_revision": 2, + "applied_task_revision": 2, + "task_state": "paused" + } +} +``` + +### 8.3 录音交接顺序 + +```text +呼出应用 → SaaS HTTP:申请 recording_id 绑定的上传授权 +呼出应用 → OSS:按签名授权上传封口文件 +呼出应用 → SaaS HTTP:complete;SaaS 实际校验,返回稳定 oss_id +呼出应用 → 本地数据库:verified 事实 + recording.ready outbox 同事务 +呼出应用 → RabbitMQ → SaaS:recording.ready,去重落库后 ACK +SaaS → 已授权用户:按 oss_id 提供短期鉴权播放 +``` + +### 8.4 拨号前等待及超时 + +以下是 `GET /internal/v1/outbound/commands/cmd-execute-demo` 的 execute 等待快照示例;同一事实的 `command.result` 使用第 7.1 节外壳,外壳 aggregate_version=2,payload 不重复携带该版本字段。 + +```json +{ + "command_id": "cmd-execute-demo", + "command_type": "call.execute", + "task_id": "task-demo", + "execution_id": "exec-demo", + "call_id": null, + "status": "waiting", + "reason_code": null, + "wait_reason_code": "TENANT_CONCURRENCY_EXHAUSTED", + "accepted_at": "2026-09-11T08:00:00.000Z", + "waiting_since": "2026-09-11T08:00:00.000Z", + "admission_deadline": "2026-09-11T08:00:30.000Z", + "updated_at": "2026-09-11T08:00:01.000Z", + "aggregate_version": 2 +} +``` + +示例假设服务端窗口为 30 秒、not_after 为 08:01:00Z;30 秒仅为演示,不是已冻结限值。08:00:30Z 仍无租户并发额度时,命令变为 rejected,reason_code=`TENANT_CONCURRENCY_EXHAUSTED`,wait_reason_code=`null`,版本递增并经 MQ 回传;不创建 call_id。若 not_after 更早,则以它作为 admission_deadline,到期报 `COMMAND_EXPIRED`。拒绝后原 ID 重投返回原拒绝,不重新排队。 + +### 8.5 暂停/停止与积压竞争 + +| 场景 | 契约预期 | +| --- | --- | +| execute 尚在租户队列,随后暂停/停止 | 控制不排在 execute 后;消费旧命令时检查持久屏障并拒绝。applied 表示不再允许新发起,不表示全部积压已处理完或拒绝事件已投递完 | +| execute 已 waiting,随后暂停/停止 | 未提交拨号意图的等待命令终结为 rejected,经 MQ 报 TASK_PAUSED/TASK_STOPPED;任务已恢复运行但命令仍为旧版本时用 STALE_REVISION。拒绝优先级为过期、停止、暂停、版本,再检查资源;不得被 resume 静默复活 | +| Cell 已持有在途许可,控制受理 | 先禁止新许可,等待旧许可完成或失效并确认无法再发起;状态不明维持 applying/reconciling,不提前发 applied | +| pause 已 applied,随后 resume | resume 只允许当前生效版本的新授权指令;旧版本仍拒绝,原 command_id/execution_id 重投仍命中原结果 | +| stop + drain / hangup | drain 不挂断活动电话;hangup 需额外权限并等通道结束确认,未确认不能称完全生效;停止任务不可 resume | + +## 9. 错误码与责任 + +| HTTP / MQ | code 建议 | 调用方处理 | +| --- | --- | --- | +| 400 / 拒绝 | `INVALID_ARGUMENT` | 修正字段,不原样无限重试 | +| 401 / MQ 连接鉴权失败 | `UNAUTHENTICATED` | 受控刷新/修复服务凭证,告警 | +| 403 / 拒绝 | `FORBIDDEN`、`ROUTE_NOT_AUTHORIZED` | 修复授权,不切其他租户或私自换线路 | +| 404 | `RESOURCE_NOT_FOUND` | 检查关联;含不可见资源,防枚举 | +| 409 | `IDEMPOTENCY_CONFLICT`、`REVISION_CONFLICT`、`CONTROL_IN_PROGRESS` | 查询原操作/当前版本后处理 | +| 409 | `TASK_STOPPED`、`UPLOAD_CONTENT_MISMATCH` | 停止非法操作或隔离资产,不自动覆盖 | +| 409,可重试 | `CALL_NOT_REGISTERED`、`UPLOAD_NOT_READY` | 有限等待并用原键重试,不绕过关联校验 | +| 410 | `REPLAY_EXPIRED` | 超出已保留事件范围,走人工恢复流程 | +| 413 | `PAYLOAD_TOO_LARGE` | 按合法分段/限制调整,不截断核心数据 | +| 429(仅 HTTP) | `RATE_LIMITED` | 接口限流,遵守 Retry-After 并用原幂等键有限重试;不是 AMQP 背压应答 | +| MQ 等待/准入拒绝 | `TENANT_CONCURRENCY_EXHAUSTED`、`TENANT_CPS_EXHAUSTED` | 当前租户跨 Cell 并发/CPS 不足;waiting 是暂时等待,rejected 才终结本次命令,不自动重拨 | +| MQ 等待/准入拒绝 | `ROUTE_CAPACITY_EXHAUSTED` | 授权线路无可用并发/CPS 或兼容健康出口;线路未授权仍报 ROUTE_NOT_AUTHORIZED,不混为容量不足 | +| MQ 等待/准入拒绝 | `CAPACITY_EXHAUSTED` | 系统 Cell/媒体或 AI 资源不足;已终结后由 SaaS 决定是否重新授权 | +| MQ 等待 / 准入拒绝 | `SCHEDULER_WAIT` / `ADMISSION_TIMEOUT` | 前者仅表示等待调度;纯调度等待超过准入期限用后者终结,不承诺固定开始时限 | +| 503 | `DEPENDENCY_UNAVAILABLE` | 有限退避、告警及停止接新任务保护 | +| MQ 业务拒绝 | `COMMAND_EXPIRED`、`TASK_STOPPED`、`TASK_PAUSED`、`STALE_REVISION`、`CONFIG_NOT_READY` | SaaS 决定是否重新授权调度 | +| MQ 执行状态 | `EXECUTION_UNCERTAIN` | 进入对账,不盲目重新拨号 | + +HTTP 错误码与 MQ reason_code 共用词汇但不是一一映射;MQ 没有 HTTP 状态码。完整枚举、SIP 原因映射和错误描述脱敏在冻结阶段补齐。 + +## 10. 安全、容量与可观测性 + +- 服务权限细分为读、控制、强制挂断、补传、上传和完成确认;租户/任务/通话/资产逐层校验,不凭 URL 中的 ID 直接放行。 +- 上传完成确认与事件消费均校验同租户关联,防止将其他租户 oss_id 挂到本通话。播放授权由 SaaS 按最终用户权限执行。 +- 被叫、转写和录音按敏感业务数据处理,日志脱敏;密钥、签名地址、ARI 密码、SSH 私钥不进入代码/文档/事件。DLQ 和审计也受访问与保留控制。 +- 记录 command_id/execution_id/call_id/attempt_id/event_id 关联及控制、重放、挂断操作审计;真实身份从认证上下文取得,不仅依赖 reason 文本。 +- RabbitMQ 不放在实时音频循环上;最终文字与重要状态持久化,临时中间稿可在形成事件前合并,但不能丢最终稿。积压/磁盘水位达到上限时停止新接单。 +- 容量目标仍是至少 1000 路同时已接通的完整 AI 通话,不是 HTTP QPS。MQ/OSS 负载应按每秒文字事件、每通话状态事件和录音产生速率单独估算、压测。 +- 监控 HTTP 延迟/429/5xx、命令准入时延、控制屏障耗时、outbox 最老年龄、MQ redelivery/DLQ、SaaS 消费落库延迟、OSS 校验/上传失败、暂存磁盘和资源租约耗尽。 +- 按租户统计队列深度/字节、最老命令年龄、可调度等待时间、实际新增拨号份额、并发/CPS 占用、未 ACK/待发起窗口及背压次数;分别标注配额不足、无线路资源和纯调度等待。压测 broker 队列/副本数量和全局水位,不能只看全局平均延迟掩盖 B 饥饿。 +- broker confirm 与 SaaS 应用成功分开观测;本版不新增应用收讫回调接口,端到端验收结合 SaaS inbox/入库证据。若需要运行时逐事件应用确认,另评审 MQ receipt 契约。 + +## 11. G0 冻结清单 + +| 决策 | 本文建议/待补信息 | 确认方 | +| --- | --- | --- | +| 接口归属及域名 | 两份 OpenAPI;SaaS 是否已有可复用资产服务、测试 Base URL | 用户、SaaS | +| 服务身份 | 现有服务令牌体系优先;issuer/audience/scope、租户映射、轮换和 mTLS | 双方、运维 | +| 任务绑定与版本 | 初始版本 1、CAS 控制、停止不可恢复、可信任务归属来源 | 用户、SaaS | +| 执行幂等 | 新增 execution_id,与 command_id 分离;业务重新外呼许可及去重保留 | 用户、SaaS | +| 停止语义 | drain/hangup 显式选择;挂断权限与多 Cell 生效判据 | 用户、SaaS | +| 线路/AI 配置 | route/caller/agent 引用及同步来源;LLM/TTS 新规范、失败兜底 | 用户、供应方 | +| MQ 环境 | 租户独立命令队列已确认;冻结 tenant_key 映射、精确绑定、生命周期、队列数上限、quorum/HA、ACL、重试/DLQ 与死信可靠性 | 运维、双方 | +| 租户公平与背压 | 公平调度架构已确认;冻结轮转批量/周期、活跃队列发现、权重、prefetch、接收窗口、并发/CPS、发布速率/积压上限、拒绝发布策略、多实例协调及等待指标 | 用户、双方、运维 | +| 保底与借用 | 默认不承诺固定开始时限;如需 SLA,确认保底资源、借用/归还边界及可满足的租户总承诺 | 用户、业务/运维 | +| OSS ID 和校验 | 资产 ID 权威来源、校验算法、禁止覆盖/对象版本、文件大小和格式 | 用户、SaaS/存储 | +| 保留与恢复 | 幂等/屏障/事件/inbox/临时录音保留,最长中断和人工恢复范围 | 双方、业务/运维 | +| 限制与 SLO | 256 KiB MQ、64 KiB HTTP 为候选;首次准入窗口、到期处理延迟、not_after 边界、等待原因优先级、超时/重试/退避、CPS、事件时延和上传授权有效期需填实值;准入截止不是开始 SLA | 双方、运维 | +| 文字/拒绝再联系 | 最终稿修订、分段、播放证据、opt_out 触发和生效时限 | 用户、SaaS | +| 版本演进 | HTTP 主版本 `/v1`、MQ schema_version `1.x`;兼容矩阵和旧版退役窗口 | 双方 | + +兼容建议:响应/事件允许增加可选字段;新增必填、字段语义变化或不兼容枚举按破坏性变更处理。对未知命令版本 fail closed;未知事件主版本隔离告警,不直接 ACK 丢弃。事件 payload 按 schema_version 校验,不能一边 strict 拒绝扩展一边声称任意可选字段都兼容。 + +## 12. 实施与验收顺序 + +1. **契约评审**:用户逐项确认第 11 节,发布冻结字段/状态/限值、双方负责人和变更记录。 +2. **机器可读规范**:编写双方 OpenAPI 3.1、MQ AsyncAPI/JSON Schema、完整请求/响应及正反例;验证引用、样例、权限和错误响应。 +3. **契约测试/Mock**:先验证 HTTP 控制与查询、MQ 去重和 OSS 存储握手;Mock 通过不表示真实 SIP/AI 可用。 +4. **真实单通话联调**:授权测试号码,打通 execute → 状态/终态 → OSS → ready → SaaS 页面;分别记录 ASR、LLM/TTS、SIP、MQ、OSS 证据。 +5. **恢复和容量**:重复、乱序、跨租户、重启、多 Cell 屏障、上传失败、断网与补传;新增大租户洪峰下小租户公平、背压及多调度实例配额验收,完成真实完整 AI 的容量/延迟测试后再发布生产结论。 + +| 验收项 | 必须得到的证据 | +| --- | --- | +| 唯一拨号入口 | HTTP 规范无创建/重拨接口;补传不会调用 ARI originate | +| 双层幂等 | 重复 command_id、换 command_id 但相同 execution_id、ACK 丢失/进程重启均不重复拨号 | +| 不确定发起 | ARI 超时后先对账,未确认原通道结束不再发起 | +| 等待与准入截止 | call_id 尚无时按 command_id 查询 waiting;等待事件/查询版本一致;窗口与 not_after 取较早值,重投/重启不延长;租户/线路/系统瓶颈及纯调度超时原因可区分;拒绝后不再拨号,已发起通话不因首次准入截止被挂断 | +| 控制屏障 | 多 Cell 在途竞争、节点失联、旧版本迟到和恢复后都不能越过暂停/停止;202 不等于 applied | +| 租户隔离 | 跨租户查询、控制、录音授权/确认/关联和补传均失败;伪造 tenant_key、正文租户或错误绑定不能越权执行 | +| 公平调度 | A 大量积压后 B/C 新入队,在 B/C 有额度且资源可用时,无需等 A 排空即可获调度;测量到达→入轮转→发起的分段延迟和实际份额,达到 G0 冻结指标;有界预取、已 ACK 积压及重启恢复不破坏公平 | +| 多实例配额 | 多调度器/多 Cell 同时争抢、FALLBACK、所有权切换/失联重启均不重复分配租户额度;待对账活动通话不因租约过期被误释放,不超并发/CPS | +| 背压与队列生命周期 | A 队列满/发布洪峰时明确拒绝且 SaaS 持久保留,confirm 丢失原 ID 重试不双拨、不丢旧消息;B 在约定 broker 负载范围仍可发布调度;租户创建/停用/恢复不丢积压、不误删队列 | +| 非抢占边界 | A 已占满可用资源时不为 B 强制挂断;按释放资源继续公平分配。若签订开始时限 SLA,另验证不可借用保底或明确借用约束,不用普通轮询冒充保证 | +| 乱序终态 | 迟到 ringing 不回退 ended;call.finished 不覆盖更新的 ready;旧文字不覆盖最终稿 | +| OSS 完整性 | 缺对象、错误大小/摘要、授权过期、完成后覆盖、complete 超时重试均不产生无效或重复 ready | +| MQ 可靠性 | 不可路由、confirm 丢失、SaaS 事务失败、重试队列/DLQ 故障均可追踪恢复,ACK 不早于持久化 | +| 补传边界 | 固定截止点、原 event_id/内容、无拨号、保留期过期明确报错;不得以 HTTP 结果替代 MQ | +| 完整交付 | SaaS inbox/业务落库、文字时间线和 oss_id 授权播放有证据;1000 路完整 AI 另有真实压测报告 | + +**本版完成定义:** 完整规划草案可供评审;不意味着详细规范已冻结、服务已实现、云资源已部署或生产验收已通过。 diff --git a/docs/archived/AI智能体外呼SaaS平台_三期实施评估.xlsx b/docs/archived/AI智能体外呼SaaS平台_三期实施评估.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..012ef788ee6e707e7a3dbae947cbd253af63892d GIT binary patch literal 104757 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 z z6sv&HLe0Pn6I_7plE%rYsD!e8 zs?h|gJ9LdJb}MDx<2-S%Z=0?ZR`uAk;&VME z?S4!#qY@9@TGW%^h#z-?79r8#>@^Fz%v`m+s3njvn5VLtA@yKdPocROr z>J5bA<(=)VZn*8kc~6PzsCj9=vrhG_qP{eD&TPPV}mC$diNn3*9m%Z)$ zS{nPIx*zY)x~j)lLIMg8)5o#%=23BF$VCK!r%Jh$e({()$Mvlak!jzp(?iXkE)eO= z`{YVvA}+;qku`*^&V{n6q(^(j z+%!2S4-H0mcjuo}AW>Bm2C6_7z)spx`zMn0H4Ri(%q(!h zK#p_L%-%R@ zK6dwumMXCZ9OV55rqX}1b)e6KWINCevjoW&>9LJn;-{gHN?^nwTxhnmNCiBlDtap) zZ#HYiIkp7bp}QZEzy#TBRxuwQ6qFWJGl5%+tkaHi8l`k>eb#SCjt6Jl`z%={2#gr3v!PtQ>cO_ zf>x@Ea3coA@(BZIjJ3ZI7JvUFL@EN<;NXXI2tJ z36pvdMv3uv(Kcj{cRcAQHIVwMZf8HWNeqV}=vL>mDks(=+zZPTs>O)dKmdLq0A^az zZV*7qpIm(q0IrUOwyWfEol7l=sh~C+<*~tTi(Bnvcbt1?S!|71euO_0QxM2pP3YLd zAaiMjMF^7qjLq~M8Cg^`2$BKD4ReZB&RSTBrvUjJnJ-c*#fEWwePsQar2bLWqmzTE zOf|#eh@b9%Inj?TD;tL{ZOvBAmDg%cV&m9PR_0AHAQxK5C*ee~lBf!nP1u&BFv5Pq z`RVBaVY1*ChsQuG9&zV>uFu5#XPFt`k7uf+hLIry64)rh|8acCe;wb4{PqHJ{PpU^9h%~^Zq zL(myj#hU+xVj_w5e?|ui9aL9mXn}|L@Kj}SRd)Ks($95AjYwlwl3&4zu|J@O&FBgw zzWH4;Cn=J_cURe&iqDGg9fjCg@ufm$c~IP+eQh>t!s)dXkvgO{QU}CMo=GwOfZ8;3 zF2MTcrw3}=z}_Adj$9t@kULVsOX~DEi#Xq`f~F|0hTQ~;?abdXJF0+AFJ1CC8i1E4 z&HC(>LwflN0)2>Cd2|d)0s7@vgn#_YEQKmfsEt(q!@q|5Km64(K>WoP6Z7s`yyi18 zTHSTa7)vPfb<3D2{tbaL^!R^6KqX94khI%RbP~EGQZFhgA~8MDND`k3bgEq%D}@*f z`}9Qbf1&|I`BKWn^pCO$Jw@n>bQA7PsMdX7`|Lk?^-ax4O;$jlKmoh$U#8Ft(;I zz4h}C(YoGq4!if$7E#GMWDwd$hW4U{ry8qAPK2+*59Jyt`zZ;Lpvsk)D9DV_#8OQ- zrRvTU-HsJT#=4BNM<*-JN{YFRDs675x6=kj@>|#~C%md1%8UcqNFJ-^NMF6)?x6Zv znP&TeqeA6mEK=>BGI@QaKg!#;MZr2+zZH@LyDAf)(Rm-MJc(!Q2j~ioCL;d6y6ba+L5M*>8FWtx{vSx8YR*pTpF5dG-d&-*!-2N zN~J${DE5R(ndBmfo?XJwDaEe9fxhJdSLpeM^i_W!Cg;Lrn?Lcq6iu{0D7&L~#9`Q1 zyay!|roMgp)W%?Gf@1wu8tl$>)HE8zd-XyT{5td z<}+lU$Mg_I^jwZg^$@iMSq4>$YM4lr$DGDYp$>bnGflItXndr@__^`{r#G60OVwJy zcmQ1bX-_!V+J99w2jr-*~V_aA2@Iy&6l~wPXlhxK{>9{RY zl_^=O4})tS6R9sqo#upCfh%yNV30cY#V1vd2k_WjWLl*C@l=W&)pCnZ!s1S^$;4Xz zhDlW4=de62$1blk$fZrOAk&Pk;@kl1(OTTm>g98fPgj>y%1!)gjtsH_w%H0P{(>+X3BMiC$W?P;XPO$o$k z-bd%Jpp8Px%Rudq>x+&J5wpkM%r56o<&ScYL!ka~`!m0{@OqWJ+O6F95KZVvJDOkq zfCD$9#1>>*)RYDaHC+y{AtDb-`}7Uahl z4c|BT;Y7>ZP(Z3PdgYFd^cyb-w#Sr}WfbfHam9$t~*xVnl%2C#QbmJMIDu`h<>L=d1Tz!L%`3t}KU_=RJfti-` zhQ95RdO8z(?Z6XSU3DrtyY2EUqNBx20c~gR@B+7$x7KYK%Zv=;K#~XaUed0~^o{i4 z3i%^yg=u(NtaXiBD1^j^Gcc}l( zrN*8JZyqa+rXW+ki#+SwQk1>(_=m^cm-nQR`v7xMNp2(6Y;u2XgWXW=*xxF2*v1ctzrU0}K~&ck6$F+y@5L0ixm&!FIT&#l6bF`CL0N{oD=6QNj|(`|NS4fq#dwf(DRyFaM_&~VV#f8;m|54{ zo?Wfi>5LDsK@K-j6j0!TrZ6^CxZzvksWyPF2@?THbu<5eS#4BYvs7c^8&TSP{#-eU zgd3qnY;8Kg3!Sk0%HI>Jdq3=AqzwIRE`}4mYP7h0{|9aJdts`uHTaFRtkf48zr9^{ zMMRYD=sk91FF+T#eMSc*b*%Sq(Xo5G_cvRdW zTjDo(0RDhOux25oKTd!4%^HRl#K$^-Qj45QxVD=mg%6rOdlK=A^r1x0Pf<>z$RGr6 z5W=S5fXSVa1({L!fW|R&p%_`b<6Sg}NE*#{vcxo9(+A5lUNI#El+Wby_BbUVsKX8g zo``v1{$e1(hWsXZ;%$A@(}d&57mUs$j)hxDMARoR-LF10{JWTA?U|3wnr& zVtG|#5;s3IU~(lr^kX*Owz$&%%sZq^{7f%_Z8}uWTd5EbsMo-r2L&OIc$g*WQ!LM6 zL@uaHnfUL|ChwE;i?-3rirOJyflD}Jqm9iO_50x&LQ6+6&bI9r!@Thk06R!FQN;id z*q*2v`nH%ojUC<9>FfRue>)HVt8bE%*(S$I>h+=Z+_}y?mJ1CspN;CkUlcOJ%Q(X= zkl`-qv|Dm|_kN*#3FAg*CY?|Lz zeF~votMZu=nuO5DIq5h4j4!bm(i2^U;zcK{>38iMme@4$XA=nT0h=@jqRUTK3W3De zUX-p(2IY1My0Rf(D-I}byY$-DZFM7unjje0Oie@x1aE#iQjtV&i90v~_|wx!A-r|p zLv^fx38qTMY*u(?5zm1;)A=)Vk>N%CP#zrQE_s2`2Lnq!D2F4rg;-C;zG!$$kP z`GvacMQ(j6-L1^=*1OHQZM{A9hxr$wvGEaOaF8wsinU-MT@FCHu!{!;ZRXY1x|?qQ zeBSOH-Wis<{tg^Z$+I9nc>f=ot}-s_HrP@UBCvFKw{#=j-HpJ4goJd1sX^BliQ_(*j(O6Cbk+K5}B5qGCHL!ly(<$@?uMBIZ;b7M4rd;4kAR#x9O? zD;q^u%uEsyN5R*bS;lYKKiFBxrt*RFZ#oN7x0-u3Zzu-a?t`|Gg}9*LRt8NH=;xRf z7|{`aZb?Y2(KWm0=oNnA+QLoqdC#dPSVWWX3BNP@i~XR;+x(6sGoao0=4;kGfk^hL5#WKW+z!NPSHDeX{R;`j$UG%67A+ z>9%Mm5!#E97@edbC!UG$BB<$4AizeRPTJ1|3xbTH&kLc4jX%d4>-kx!L;fJQ0d`#6 zh*~w+_zdKmz1fZ%e{R3)mD|O1s~%;Kv~D)#zG9lYqwL)LVVf>?I=FY5=&ZC1u^HZO zca^b_oZ!cY&?=L!k2Pj+*uu|z$bg_wJg}?Mgccg*fQgl-(@L+Yu*?_T(aF3uY7};G z=}*1j8WSU}K7Bw-nETd@?Bw0X%{{^c=+YopC1p$_OC-)xn1#h*m4B?29EdYIiucg! zey$Tguc`l-{f)iN*0~xD+-HqPVq~P!x*30$mW+xH8`-m2R9XS(G{<}SiITvwJ4#HP z?h!fN`8OL&UAs_YXo(TW?7<&XM2D^0Afv#@9)uk+ze^}^78GTMP~=v68sSr}%@t!W zR-({2x6M`*4#QL#OCk14Bgq6_^7y?%v5I*`Zk6oE6j5nDW%r;Ap|nj`_X*Xm$GR5# znz9ZrT-#rxnKOUaXZjp8e3|zr&El~mig!r_Y_jvI^Yo0ri+p2mw#{illN+>2B}$yT zGPZ@uYcN28Ltx=?w0d}NuDiy4wJbyR>04B5iziV^g3ukKI=zBtx^pO{zGrI9 z=&B0iICC2QHvetUG>5?-2yXLYq&8&3`!2C!H)J)iDc4GV&^QkrRx5&25J2%+-m7s* zHxF~G6>Z<>&^!04J+*=yR25nNP7I8za(WpRcgG8YY{C@P1>QR&UvdE z&(AeP8f+d#x>HUUwb^7vL>Rc#Xg+HHcSM*udzbp0Fjm?YrU?sas^>%ED=Tl{$QL}V z$zW6IaqU==0`^hu;AkbUc`YPxr>%s$mXC}E&r-Kjh5j)wMRmD8|2Orl9SUu7F1reM%K}i!x<+#rn4PIEjU$1&cHW zy_MNV##`~xo8Y$S?r$#9Nv>?~7fo+kV*@(Z$I3FkJ4$k%k46b0CyK&v&{=L``hMmR z(>cU~TVy#-dR9y!+lh7(`aA6AqrjuP5w>%fg6{^+VpS8IZ=hK$V|)rACupaKi@6HS zA^QsPl*f@}u=i!Cb|8up;CxB^$;Owbj+|X8o#rubTt&COJURWM=oN|-G$W*kTeEEz zAG*(mn1OQ3@il}_Mp3mPg%MvpEZ~BEtXlQhSxCM%EysQtGaU0)7YOZE>TNITc}pSc z+*gKs9Wo3JP+RyWfv1SIFOD=rdIqJr2Zt@`dc zIVF7Gv~I9+&@9Q+L?c1D(oXu&N5-{|!y_;gjVlHg2FOV-zQ$0$(K{3jM;(!xMDO^e z@TF5Qd}2?n(U!miu!oI@T$scBC?;h_H{a+`sf)rC#$`mSdbNAC_aj4(zOLvPsBuxI5aipOmUSWsrV8d3jwnC^k>`@37CH&(FesiHzSMcFP?vSik7*1G0uCIAPP;sU*}p@jvbM4 zwjNy-03>e!75SJcQ8DQZ6@tVOnH3N&#K?{R9HxuHTTgQH36&6nezh_=_K2zZ&$6tu zgs@2cuwwiMPuSEPv#rQ|F}X!QU$FeFTB8Bp##UcVbxeLhD$rnjtJiQyeCvG}5_sFW zOA{K{SnC;lYppy|eEoT>VKPtfHVxGujqEbl&;ns2FD^}#@6A4AxT9qkF$^Wor5QYI zP#2L?P8QgGV-cj`C>$pgSM!fj>3Blc2i5IUTwl&!ZvQE7(<8j@n|eq;6vo#iyR&s` z!v{n;YVT@LFub_6FlF_3!=PfWp-K#|p?=g}A)&Lgv&EN?G4TyDnr| z{@Pp+vx#@_r#ZN-tF*P3Cy3{=4|a76Vh6rzHuaMhQV|h%6w>!gQ(@$SO9R3X9RG{Y z`%~NEO4{z79mSg13@*a2bQmvNR;FinpM8dRrv$AnC9So4)}d^jrlov zCL5hd%4-BEn)40$znKn)08$qFDTy{_0};O9e1W5oI8Eb&5DQ zfdbZ)Om*B`?z`QIcKhDR!+{BHa78y8)B3k6)Gm>n;w`zIdDvyb^%>ApBy~txmnU=z zK#vF@*uo8?NrhQrOa!yNw|;j<|2nmLXRJ!z>EIKEOVZjO)-_`a;q1Dd2(64?zf6;9 zmz*C|*NhS#>rXhUguhhofWV5qW5Iw?_lkHg5m_fp;ri7Jreq*Vdt_`8YlRjr@6Y3- z)#dJ96=&XQ1hvI=`7VkZ__LQizmKLdxt@zKYJUQLHT;ZAM=0hUL;_jeOZ(qvK0-fZ z22&#SUaphDyuF%Wi?ysWUfxGv>v4NY^?S?(%X?Y8cJvV{J3Q&NMWp(na{R&c-CPdW zuj()*$AXz1(%+Q~AIixG{Y2LPO6XE5LTW+I_!V}P=ETB^zY=DvC80{Mw17KlF=X{( z$U$H{70dUlF+}PT@VC()FGa?1Fa?LpR1MErWR}hBn+s$)hIddHo=06 zgK2Iud2o0zfqJEh0&Zezm^!~6Xsa+apLyr0p^&OOCPgbde#^)~P#e|fs>UJ%h+Ed7 zj{y8CO@Lf0%}@p%4k~>cyMPb`tT#8uG%5J4X!t1py6y6n3IRg>TAt+aQ35Z6jmGma z`RnqdrHODvvEl*T#|`{Be|BvWQTEmBz0cqiw3}F8N0G!c?G0Y3Jl`h4n@fAi0k|Es z#1rQDlNp6k&%1qtaOVX~G0v8u)0R(BtJ5K+aQ#MY>JYq~{|Jdk~we%^;8~hs6 zVxNP1A_tY0im;xDj1|F*p{RhUB4Z7`)A;roe7k7sds7*OukCjbaz6S_a1lI?lD^EN zqxFmH<5P|bmA|M9_dAPDi_qlTL*#YYRxY^)akR@DT11yb zr>L8xpGsdaSjHUB%Jb~b*d`grk8qM2H+09lwJRy60aeX!^hTB34tAveD=anA zEh7%t2Dv1wveEmxLeQJS4N1Mjyrm}dwicFdJ|GtukcLy3tuf7i5BrK*t8-I~-Pc&@ zbkP}KoIf(NTajT1Yfaip^(X!Xm;=nl=j{J8v__2EJ(I{nwX%74`Oabc?Rj_WEgMj{ z|18BoKS2L{(BWl4t1Y}zqQdHsW^02-m=jDXgN};yUxS9pR(EQP19cKCm!ti86`WYk z)6i98X&@!NZMEY4ZdUMxDbU6u-5d=v#BFLaQ*E{+(scwFo1-=-L^~T|OBDyqZz~|6 z{539T;0GGsw^gub19I-Y*;ywt*tJi3-hV$Nz_%ga5Kj(Im(`H|mKZTT(4T{}jzRW% z@n=26`e&*kCh7DAwT0vAcy30gQqeQyt=}S0(KTV&plLRLMy6NqSt^!m@b8Vrp?rIc z#bDt#3xBDxO0YSBm-LYP$UxVH+1lvD^q?bz0j1h7yp#7QY6t9T<$!$L1hbDRB{9Xyra)3OL+cO zhl=ze^ee1Pl;scDFx};m`bPaL^rI0UFqY}%1a}^?oww-FjNz;hI)1t7#LYBN%;5T; zD3D0nD|S7WrJe!I(lgJ9)_vrMjXED{evf&)_Scl~<#Hs)E}Mn-^{b+*8;Vfb&Yo)? z7w{sevxbGmQ}`z`hf%bIZj?XHplmJ2-n;%H$xx{Ij!{xJg-A3<2 z#VV(K3H@=m^lej9Jnh-;cy-skky3K%bi8OgVYU1>!5Yu-%(=sPaWD~`!i0}#;VDGK z`dpY~f9m4`HK#Zl(ol_=6ktBm0~%_v_AGRBL(hu;LVW^pPYyFC)tIG#sa`Fo43h5o zFv?@yhBe40t@$6(Dnj^s>M6jh6!h}Nd1oi0{-RHAG77F)2|#VThCHtbDYNRzEwoGZ zhD%qOy`ftvrj-SjkPs$ZX4e|&dlzm=0n662ma4X;!dnrJZzNQ+cD0BXS-_bC=fMYC za^c`+GR*dhBNS>i(UoHFb|*~p{0E6(5hjCpGftU!L(-c(RabsI7!-#=7ul=DNF5Gu!}VbpN- z-!EtE5GtgJ4*D+yp4q@v%$p96lfQno@3A^lcTmEKyFIS{eUT;5X~%{ZIm&e$_+un} z?CChW@W!tpgF{1TaJGu$Nxd^bT0#CoS5D4~r8hDm={SU=b@KSPZBVuGkCe;Xd3PQU zjUfmdtPSDUUGAr)jMCoD?=c@U98A7Cl~of1nwvB5F&P3(pn-d&L|~+0=LL^`9msIf zX*Nghb-~FVg?8?93!IQU!pJZgo_zJtlM_<9E?9=OXdHQ~XBnAWhwa8hcytyACR0ZB zu7w###|W7j8=5V$fiZl??<3tl0$E6`$EHkci&N4Gov(i=sU{>TQ;SS+ekc^0^BFm? zbFr3{O_}Q3l%gEf!BJJwm$5htZBMv~I&?P^ahbL3&S1+n!TFW(MKIr=W9HX#Lc{7b z;&OihdZ-V4fzx80_3?WT1odh}iTJ*TvML+dDim^^qX0mc?d$`7Q^qGu@lL^y?|BkR zNvlTGUG9=~6)d9iG&G^O^WcegVOj*u&mW6GCix@SzOj!S(75DD< z@0&@4lXb&R7ux;!=q@4%Jv448VdLeeTygpp0$=zmR0*wRVu>=Dt0R9x4m z3V1L%OKT^30mr*(Rq2+v^vb6d+_dWxn?6J|(eW91H`we>b z-MvOr4UFCblX0v@k?gZhsZ>ObeADm^SmnmlBC5LCDSpgz!v?le2*=k>V8;X6E`%%B#GNn8{6U0dU#*CbBGUEWnI|U;n77oyEUF`6u$#iP>yy^5J_|VqZ}Ace z;?#0f3ValW6@=3k8L)INNV%o7eHt(#!m*ROrW~otD?Sz04zpnO6k;V79)(aoRrouV z%{b;mck<^5;UKbCm$GSM08htb_BVu4S({~wpJS1F*6r~CNcdnYvQMJ%*F0?hEIPZ< z$r1NG0fI}k#BHv>8Erv$e6wXXGc_N}_L z1Sv-8RLBZ((NvY??xcMF@}`ZkfUr+Wuw5+y&Mxp&Lu$4>TX&L>XB4w#4Walhl~a>=;Y zW+FsK%e?d^^A#P%Tn~sAqKwmGDQvIPV6cX~8x%`t@D?Z?q7C=hpCZ zwMf4==q|k7lVf!JJbTD};}XY@Z5%Q1msFatj24GJ45Q;w?7lsRK303_GiHz)oWnuZ z`cV%a2ljNX(oiBF(szk;c?mfL1r`kTh74X^oE%I;IObuhJD_#w z&K~&E#U<{DL*)<7m6vmyeU$?aD$&H4+t*(tlG>C(Ge?8w{-d6$ti`DVGq)lRe}1J7 z{8pr^%E>9nBsVi%L!9O`W6f|{om`VA9?_N19xbz6;SM2mLoec1S<1gYFOzfHv9&ADlfvc!ThTi;bm;oa1+S6i%>`0D*|(eFGM-xyn;+|UDl`Z@ zqit(Lrfn(pb_b}wM|`oYS~6$7*slGVq$^BfOPpy#Ip?xddhQ+J`T3V5+1tYNVl|$n z-wp;mr6>C?JH<;*k|$fb;U!&|)5(=&O<%+Fd>j78m{hwXEi9o%i~>0#yWH9}m7^QD zpO44ga?o17WROZM$%q*)mI$i0N~($4oW0Mo$iSR;Sh7jIsR9XXDDlDV=N`xaUbxmh zOZ_<4)rR{mJMwQ4Ej#SeA6!OV`2>@*VgiMgT0s`N&Qzd7CB7gW?}srBm4USwcY6oo z@0EXKt|CA~^t)1dODHN@PCL!^OsuT7Wg_$ z?BACc;gG7b@vpy}{AtGPEpejqNKk5}MzA+19FOouBC-m^y>pd_O9~$+X&9FgLnxze zT#7=V1|1^s2H|9k1JUTsW1sQ`En|Mwk69A4%bouCU=x%jC;k~NiSh)yd^(dC>shnJM`cd99IEZT=5>u7dNH)YW*~_UCm*L4#{+ z`4)HZs?vQ2xfUFu%9)dcP^uQq=RNIl10>N9NnVF!@R+ki(UO zap~xZw$V$cNS%a}rrmwV*yIAwbxtL{%GN|*KoaA2J*v0Pdzo?P+(E(RVC6zz4;jH2 zcBI_xz57ONqgMRUETsM-K2_3o9l4Cptq8Ysj!1ltrV>-yOK&D|ejX%n>XUKJ4I^uq z31BOrW0umdrev0~?rJc^Gd!+OOUIi%KCL>p7Tq<-khq?u*BpFKt`pZ)xUin_{K?GA zRQz3&lUqN-&kEwa!#|l+PV^|zmAR-zk>2{%uKqs4K?qs~A8~B3(h@e;$!hXQ=|t5S z@FzuqE6_2;KAY{z6lTTpPelp^{qpnzPvn<5AZTR@I!76+$57aEPJo<*S=vXaYzIj0 zWR)EV0~<5hvVs?R)RRc4@)zPsINz3AkE@eHtKuD(CMNthiwnX}?h?Ho7=N-(xPe;; zaBr>mvrnJymXq>byA9yIy(JNTcYR@TZ{o3GW4Dc{!aHelBGHzb;CO%yK^zaZvMV9i zl2<19$m=j;>nvB22}5X=$>g+-F8)yDnAx@c7rm+;AFJR4(yG>%|ECnD&pk@CctNV{ z-E;C`C#!^{3Y7zQs+6U*PXNiPysab5KaYPA5!)HuzJnX=uk%YvcRVBpQ+wig2W&f2o|HdabY2W8)OD{_kMO(D<4yN z7Ql<@8zX4BOulo>Ez2?xUjK;b{OpBIXJ+wKqTI4LLYjnWPXXYtjgBQ|_7W`K&bJg= zWr&;@pKcC;g<=qWd`R81wU6;?or0?AxAAaxJ3800~gLD~G%&pWwwuMW5LOMD~ zY)ZHnb@R;9u(~m2Cj0%-U+l39e$LmCSN)uCAP+24xszCr9`JAQ#jj^H(#pP;KEIc= z6w>FH-{jh569%>ViiyOS)_=l z^)Vs)5`6AViHmFE%pi_utvjId-S=<&Yo z@cs8%ypT*>p7u}zbH-8R*yQkelAs+rsrV|h=B0Nd(6Ew!fQGelqyjil;w0;)L(q#& zn)k=z)KBAzs6c+<_yC~Xz+m-B@OMqarB1`n9K;SqC&TNju5S^9rzq&GImABv6FNH< zjFS7e#Ntw}#DH>IUZvQtr>tojg*zi53>CGIIs+|m%PfORSwZC%84hw5JX%yJfm-M# zo3)W}G(?S*kFvr7&0?@dPzEqBZ&H?-K%kgPM$H>~Rj%2MoYQFDnNbfosSm4~6v{pamCMnh$5&(iePMffwX&nP%nfS72`kGbwahu;-qp%DrFdpp z|K*#V7Q~5%E;TL(5^BQHi5ghCrFs_{T9NWjHIi-{kGt=1Q7Ra5wBH7u@f$W3?ShlR zv4%N<`U@BZx~8(|jv}CIig;c%o5IsQFX$;!MLBx&5dDV}_J~&Rvuw^ITtMh$2oPgG zT%NPHVA9oI4?FJRaI}%0wsdyrNr1Xp6aCN{8C@Ngy^7eyrc;{vE93H+d$bDCU-p>m z%27!vg9b^dUWv+~>V_`~DrqNQ5@KVcFO2OU3sAXs=|s;8>DfF`1Va`?T?B6wLu}$z zDiUO8`(x23oUse^b)>^qC>cJ5M(e&`gVitVl#_R`%NZw$!o+j*obGPS*a5y==o6m^ zE28E^cyS zYSk3MLJx(nvUv*S>K4!BIjt+q7y~J(;mdB-&*g4EnDIZ5<_!xNaz9@L0qr9nBiCPRjG$3EDn13>)OroJuV>hSZLs>R)uN^Jz*2j= zt7eYZ0hTJ;k@{4uhL$)+aQ!wt?6clevQ6Ze6kz}(BEXD5BxHX|myf#70*!L0rWU&R zJBSe&sVGO`>;}r9?TB;4-o`@XC`~JI);bw6x33_E7?*S?%WzuZLO8z7lrA;>!b;MJ z0sE5km1dg%MNK$fz7@0h-2^rDV*UcZsWso1jR>sc9F@$zqK`u?{BFI)lE$m zqrh@S@0)7pMnbgT@U;N&WD;N1q@~*r@}k{IG)vkqN&KE^3Ej)gt^oy-Ve8TRNjxD0 zogawBwG`a}MW7IdqdLsOKK=O&QtQCRYo%+c`-%*}-&r$iHTUlA#lOHykqu3jh~e)s z5txr$q&|sW#-hG9AdG3cT2cHo5(I9aCTcDVKYnOO`F)Z>iDb#9)1ux|3w_Y1v)#8q zm^n(m<#vdW3OVxKsbAZ{l-BHfjuwqkp<{p-XdHSc%M=X}QT=x(|LZMiNKqxx&O<{A zvSq{wqK9MOUgzLRpe(ROOMq2#9}jCy1mb~*?`W=g8BcX-rMVgPQ3N8y;?o0cs%mV! z&j;*G5m8|z2uRIMfI9Rff%Q>k(8|IWNjy>x*bqs?!9=27y&--s`qN8jOV$Du zX27~Gp11UlpRejFkU@WuHqjEpkEQ*Z@_>JW|A+LjEM>F zAhA8PlCrAGuUVR(LpG1f=zu8#&C!mPL*oUnoxLA&E~VDL*DZ*kC2Iou;bqQ!G4J^1 z`B1qUaKEk7@Z!<>=5txe-t*e;=(v9W7r)ivnXILZ7z~OkN+t%Q;@=m6i#PgJ#G{{aWqLhaD{1}FQ{uF9h0_K*+Zsl zExRgG$CV*+9emdYve?TP4d3q|RHwEpV|SnC2`cmEs)d(`l=Evig!)fdYd%5+Sryo= zm*w_3>8o(#92?v%Zvme9bC!>ln9-J&vHQgz&Tlq#Pd8 zbZ)t<;&W_LHuHKUPjEbm>q3I)sP-W@fI=ox4N0`v@Gg=&n2f)jNP%MS;_-`~bQ>4b zO)0HYYXKB8?HEi#)6iD9@}2sNX{eJMl6KLrhBn$s@(Gm&{HC#(;$Z;CrV<)Y!7|t= z{A(oD;k74l(Kl0wM`vODf)D7N9UAHxXryQkD!lTK&*#JG@C4>oGLg&1S0oH>R`N>IfuV`oA^|GoeqnHxQb7&TT+(B(2^jUPwl6b63UrHHJF2>Ekg z!%^W!kLBFoZ_F_$|ERf*@oy6Tnl_TYl*LgOJ#v`zy3)U?Xj}w{SlfmF9t))RAY=9 zXnW|u+bK$Nb}h&{gC|PRU70JWY#EMPj)4?>Xf^P>m)6S zl^8RhR~EFr34@OZ*J_eg!RCRo8>|%XzNxJ9CJ{wM-wR<3B$prObo8R@LWQ12BKx z_V{@GJdnTdstw6IBmk)Ey6oXEE6 zsXy7Xcc&PeC0eTKE`qPMY=GlG=H~``zPq`Y8PkY@|6=T%s7s71Ub_5zvBU?CD0-h7 z_OJyYW9><05Gjvyt??^*cow3ig&&eU9^pv^ROfdr-7F#(JaV!JA!ue-4akhIo|gA4 zM#0=Z$F#hN-@UN=oc=k|(KPlguEt~#{q^Zj_hRP$vH#N5;%P3Ht66(a)P#YT1xf(z_ZlF<66+dFH0j08#DTkc6+DL-%4<$0}<6?f*= zm6a``EwY$O`&91Cu6RkdgPLI3-;#mogKnr)whMsI$B}jj>VAv_;z1~C3ntXN_Nv+& z7-2&hoyFv^L-ai|d0!!?QZ?7t-z-t;GcOE36A2c4iE9sAyX%}}bzZ0z(WUS#_!ERwa?^YQpPEU%$t zf56(4ZGeGUrGXN0OwtA2-W|1IVqwbYc;ze9rteUjY*g@Upf>GkZP3cV9C$F?h=0nE zq*)=#2&P>b>`UfoR(|TLT_z`sBPZm&Lm*F1%!S;fN7&<0}K&K zr*jVI;*qzr$o!D?sQvpVY&z#|n1Uknb~jJQS$%1w;q6$0tJ%xtdES$G{j743)GEis zk6ls4&2vScU*N)hN||umPF!{S%3B8LAsc7gsjXvAjdys+UN@{Re=CqJ2nEUDid8@9 zhYRqOj~JXZ@~(KL;t6A)OEN)+JzCyi8>g$tU7FD#EKuFU3M++Lfd`^F!wrv4@^z zIV4%QTlpU}MIy{Bf{ zN_A+5_A*%01Kp2@cF+v}WhBFHfZqkY5zM1PDQ@_%SN=5Mci>ozToh z@je?m6D{u@QWPG#BBkio45|txZZC`NkN|W`=i;KJOB0w!EKo%!hcA#+9O_7ESLZh` zY0pC;ChZss=^`F|#TWv}YnhG)wbM2EwQE4Y8T7UJu~x@&6gE*>9ynT=G@zA2Ijo`a z?ZvMjD<%HFBV}2S>7~IVqi9LjN0)zvi4yw{fobqBBjKNJQN&5&-t6?zzPZRA$y-I= zws~?J3TLp8y;QLZEWFcq#?Ca9IdKllJEC6dvSyooKx@#FpkLARDx1hJaFEuTBeIP$ zmWFa#wCA8XzHL(TEJ*z{!4|>|w>W=eS+G5AYa6915F_;^7=3Bg`b9#v&@<@)yXx@3`yCLHf#^z@%6Hj(5=LsKk<6isvP{SU=rW z?;1Kf`*bp}Xu7eGsLz^Vvn9yJ>7pDk<qDP|fryqZ$WlAavs)bE**-?9QpAW&&wsA!%K!47`ssW5a2x#PF_!(rV&V_CaD1jFyBC_A&sR_lm;yjAL5hL{8SzJZ2LNXziHMp=16VPH}Wy)D+)r z+G%23NDO!JCoc6Bu+{7tNB>biP%KSIO6PK@ktD!UGQhM5HPZ&a*(*mbv5Nv{#0i|JO%mGMkaPsp&rBXv7xu z3qm)jl*lzQLmzJLZ>xd2i)r%Sf=p@7oy&_)X+9oaHm$OA4` zg_y=5k~!DS8bonehGCOsA+p>mJA1Vqo3z9Q`ht=4A6~U|U_+aBU8@wxUFhp>-YWi* z+buOUNDE&txpnpqGDsY602RXBEa1N*mdC{ai8)Nu_n$>zPJ$~O%|Zw$Fd_uF@9i&a z&N0hiuq3(f4#N{E%B)%F#_li+$1!-$XegbiKH4cotEH)96T(zba}K~t<;OrrZ1VPq zJL2~P^e;~*?;an?>Bv?Dcv|WP=+~>7Fkg0}ph|(lh)ohKvjfmEw2@4Eb>XD)F!knO+PVo_(a!h;19)eQ|F%lzwTP$sN; z<@fIJlqaz0+ebaEob8_YRVPT->XcV3qKL^hz`K?5{eD!1v8_-D#09r?f;s#2mw{nY zCiv362(5?D1yk%TvmLqMZNjK)R+P^rKQ_EG9krQn-^$_N?aAk|N+JP$X#uv%aHXC( zJAa|PwFg;4xrhQaH-UHUal7TVf-Pw8I4%Qk8(UQJ^_QUz$iyB5<(thl*m_5+>cxoRs_KsXG2fPb90qy>ymh~ZLkV+qPyb=- zetrCM#P9-_K#3~OBPkb9Pi*@(*yqwc464~?O24Gc!n^SdS2-1?m3j+VZN&=cxyv(r z0+DcY2=9Jb{Aj$&t2-2m*lskc&>z(-S7X27EGtX;im7G$=~BzawvOs=4SISQnJ5OO z;J}hSNI_o~R9{(-DRon9T9(U$S-|pJW`!b4#}9>|w-MFwKf1ZCM6_ytOl#bFub_$Q z^X=`)&Pmu#+8vqE6Kg$E#hv9tdaju zkxmQpO%mH@HYGN)38Kn4eJ{v(5Jz*NWsd>Qatk(NMMGr$2MrdPAJ{y5q2!-&r$dS8 zF$M*IQ2RvnWxv%!dvsDakbm~6XR(Yy?d#I?BP8gxn1s%^i^=~zk9U_=b^$RNCQ$}4 zt4G}?j1$bBmdG%pEjkl_j!+@<5)}I*Qh*xCW@YwEb;}Q))YamZT5``asamyDM}-=6 z4DCXJ$NgZJgdq7?pF|65eXeF48Rm;if@B7y4R7!(gY0fyjGEq=JRV6nIXb^DZ-Ri1y(HwT_dBYNu$c<8<^3-KHn0qwP~f_tK%&OW7JI?8Ht z&4?~4jF@onA&FENL!_G&UaK<^l$(A(_^6MaATMEChSo=!f*(jJyk+6q==i(*(p8sI zjWmJsB$I&0V?nRI<)2bZlQDN{j=G zZ(a`wdKc634*bOktD41}_II&SQ$jxC-KYe~b~dl+L{+S~)83&vqI)3kwpeo&ZV9}Z zr6%)%t-bbZ{)l_TN9sfVoB&cyf;B@Gb>vZP?5WcLMCEWVeP->sy&uwZ@}n(J{)xxf z)+FxC>;XHjj!!&&^Lw{YL1LQeuh!vp*AkgfrapfB0#y%1gaYNP|05Cdl&&c}<>R59 z?S7MqX|S7cau1@NV_;87N%|*pKjoJ}nc+y89iI+dw9oIpS|u!$^ED!4^}S1^!RGXP zs2mg2M+^D#Wx-Q*?kh}S#Vid^lPb*zsFa(4qKESA^F5y&-R>Ay-f}zKZPw!Iz_j|B zhDBUCsd6eFD)4W6qw>l+3l-CDH_DASDQ_wicXFZ%b&}zx+^_!aQ*}B-7X5|15(c-3(3K)e5{6o6u@Er1l z*A|X9dF61cw_4h?rvU{Tkf0mvEnfK#Xz6$+o|A_jp)DVL zz}3Tlz`l=ZBj+JgWFDj~pigcR8+z*wOp0YUj)20JeR_7v|U zQ;4S~1RhGw^&SPFJ3q8gZeD9&pFgn`l)9gv z*>H$k{)cF9uy!-rA$}fzG-znF-^m_5EVyWpC@jj*-~**?5v$xM%&;V!LFk(LK_rb@ zlyA8a544-n`=pUXQa}dj}3a`8PS zM5`noFeVCGrR6~-r&M*S=HgQqVJvQktSpm(d@Q#Ck6)tyEhiI~O1&&LfS5hz7s)~% zbdIJ&2K_1I_T{SI`TRA(IKvg^%FwI3(5U>%)?KJ>f!A10>y#~NJiq-n8C^*L_m>Su z6nUuFhcHy^qaHI3mA@&&EnY{{t-?OM&KH5%&7|1^X<-G-Mp4Ov+1X=@i!fzc9Ypb1 zseP{URHmI58?IR?c7mo+ImdamSEN(!VvTu3!CGJ?Fl>B=YnSaD@Sakd4o<%hv~<#O zJCAQr{T|NqX+^n{+Llg?si)$q9XXj{I_GoDbH~{*(gy8B65-(nkkzrO>q4>IBz!z! z?PInaXNyVzgQ)^(9x=m}+ixOYS&WnpR>nC#(L>ib*%BAv=TQ4e(P+C$a}RM|rp}p$ zjkb;G%5gt2M7}j{Yvv22*zzWPG$C%XOJ~rRBZ`Zvu&!;kzwaq4-Z83uqE1SyYL`A< zQ7KC;qzG)u1^xrWp>Ccyo->uLK|9b7Ll=}5yVihHKpJK<}ksLZw zcfnv`vk5;^GMH!m@P7J1C1zGzPdK9qJxn39gNb>G-^+TGmFL@UXE8Qv>t8(5+Si5j zgU@h?y^?b1Cyt~=FY^G6;}uhAPl4+DBVl?xaEl!}C(73xh5(C`{Sh_TmRAD!lZZD6 z*rqsGsGC9u1vW0Aj=-%_4LA*+-es%G%mo>~~s zX65Y4LG1E$%($8^Z9DGY8O|r&^{1M)#$fKJrK$!1|HKu>E;Nfkxr+Uof%y`D8fi?@ z2_40Wlm>PIV04W28Ontx{b$xD@a3Obip@?4M8H45Z|&+6-#{>W{omxCR2p;~l4zrK z$kSx#n7x_npO^LyY}~QuUJJvH0g#J6LBb`v2T6{JV`K8yu2?l7Z46YDLi%J7(U)#% z@bMyG$awD7jC5UqFRT zejp&H=uoHqO^oU+2meZQNGpTQ^4o@}evU6%doLHI&R4O7U^Z}I+VYwpP8^howNWr0 zaoQZ`1b=MV;`DbXpC^2+6+Q9E)|%D5ojs^5HBam%TFI_q0l(hPr^p~M2qyAOiO$Ag z_IP<4`-w_z_cEHJ*`jNMwjW#GUHOaqqTC71U~7i}Pa+LDhMX0hS7RZy*MrMRH>-wtBptMYPC#8ax;5hwm@#cEa5}Y{hy`4~D1$8zc??lz+ zHnA~d957NBHV%M2`3Fp1yBu zyc%*zfyR&aBYotCM$0%#1!O$L_f7EZ)Ggue+pY}m_7n)oGt-d=XB^vdX zlPq6hY?0Ixh3oLvmqcmitw5D?uN8Cmd*=!z#s;E`U*k`0W#3{>iIZZ`=LN42)8tkD zBgTs9o=x>HNP6o{ILCIoGtLP@!f+%al@J;d@#=kUJfO^2mnniY;*%t7aVH*pVE}`L zxt1{4vYX`NK=t)v)V3gOR9D=De!Kc>(8)*npDl4-K7|Xv6}?Ai?KOMzIZIlW{SYo# zB&}A~MrZqh7oOe8-hCz@ej>hIS=UT$FwI#AgUC2~s%T^{8(7Tpr|naUkofj(%%-A! zvr>}G3YPacBnZwd?6;&p`i+xF5!ph#>G7c%bZ7kvhVHCq;LS&KUH)=|fbh+Tg-i=1 z8C$UlUy!d}zpvbrj(hvHSzwkZ7a#o+d@wuecGC7mG)JBQfoXU&E~;c7*=)5HSv}F( zb6GirONwheJOh~9xVCrM!%^G*y!tNR2RweYlx|T2|AS?`?r4Bzg(I1}uUB%5l0ICp zjZ6c{4$SE8_A#go@2@y?wWu@*64WzisZF&@#0rx~>tf3~YP`&MX%YS19`5WKn3vgRr z28~l{gssFs;M(86-0Fy0lrQ94hYd*TphKYUAX$jlJ|6w&j;ep|r~*R%xg*y=_n$jv zW$;yXe7)yfRgRc<4Sv*@fwTT8iDY^4XAjx#X>!iq$g}apY{4}e>f~Y%l0&# zH+IwJp~`igeTkAsg0gfid>8#QO>{G#1%a#n)I*=x+~7}imVM}=h81Z%zQ!z_2_=o7 zS=8ngHyHr?T2Q@$Ka=qxM+QshVj7QpK08-YcxsYG`5Y#PGj4)ZJUj4 z+qP}nw%M?0+%xa@KhL?Eo0+xN-h1{ka)WkeS=bL9LBlc|36zvuD|JEClq+@nt7NbH zwQx5eOk~N7*7$v+p#Oa=wSgE3ykY!q)_=pe@ECuhTioq`vV~{y*SpXT%dIC^M72tF zzV;F-cfFLQ4n)gyD|MJ?FKAYtxKz-BMfc~EbZ05Nc!cf2fmhTQ9H+iAyly8kOT@*^(}lX!yozQ90~+R&Q$PM z#3cox>qZPbkwjKXO%nX1s9DvDBG;Sr6%#WgLDSp?pOJk)g(@jz!f23GeJOKYMHCXS zN@9_2Uy@St+<&OHrtaHtnV4;L!l~n0z3F)*O`M(15+4`4zHicd9}Q;=y#H6F2mbmZ zp`CLHx!RN<*~q3j9ft`AH8L2_^cIN2zH6~W9S@H<)A2Ys3xw>6(OKa$x9ko^m#2&h z!bXMl5K*^VJv z>?iGvtR{4pbZmMM1k*5~DJV%FBA(%61rQDaSOa*bky?=d%el)-h>%nRA$7A& zQ#SWR?swXvtO@$dr>O_7B`zOsrzWBdRDW)oNg7`uV{0`0Q{dS#5KNy@9n=rIrzvv5 zcOG6cy$l&C;(g~mAHmD;v&3+l9@Jy35sa0OIk}M%=czo=$AN7)Aa9_6h~VrYDL)5c z7R-D!Xa(~9p6 z`#rkqN;_Yy5QJ}x$ys+J)znCqKd`GYgHxLEk=O`ZJ|NSJrXGTfBr)ked6#Q zL>sTWr4LUYI>k!#_vE5|w-7R%{9gCy*LWWO-H(n~L=0WU(TCpk!}y7W#U{zluh*86 zw$aGeT}q?46?{zsR2+R|oHZ0(y2|55<&KD10xN$uCmZMDi24v*2T|G7e8% z*qiK+Wg|sQ^3E5}L)$B8Y<+q|9`Pq<*Sg^UOh677H)NSP$6EQeqler-jtRoa8OmBZ z>mobCm?V<%jKG@hCnt-3;PVy1M~2noQ6ED}glv~mRC}n7!#BcWTiITPfOE=WH|2>$ zFmNHBz6WY*(9j{`S^`F?(D5VFj_0!*Pw##_DF+eQ9@ol|F2GUa@HzxjNrh`feFW9W zNK1XuCjk9|1RE&4Av*#JZ^(p!!W)TDpzucGzsw5BgzbF=G7cgs-JQr--GuKgay|H> z@ksRXq7&g4d%GWpG&NM%pvB^a!$7v|vJ6rl0roGH0>?x>iV&Z}ha7GozTR9ivBm5D z=0!je{lv4gj|LZJVlp=gZ{c1NV7LWVg)|rwwMH2IitGp&){0Kwn8&3E`|ude-9;>K~%Jd-z|iK-VTz%-3N*e&1%HLPV4cMSAuNNhopfVUQ`*~(<#-9--qy0))|32*KySyiCua+veK zEbIJ|dFV&ib^BkA{STF@W_*`qmt=_7zZbNce!1;SzW=@mZ+BJ}&;zeaXxez%x%PfB zu!Z7#!7IMT7NMa(5h5VUbCM0jgsZ5HDK|(50zoP=tV_y4VY+8b6{gt^x3F-HM(09N=AT&{z`lFBN&w|XRLsVE&g+kM3d?G!=)ErrA@|DSy$ zYQ7AbnjZO&-)icEy=b#>^0eVit>)F$DTq=y)WV&e^>+BtinwY(L2-V~LWF=f%rqT> z+nd0A&QkbN!G>!HzP6|@)gJM~U4}61cDRIzs}DvO8bFTpFMu2$imG1#IsBC?{m}b_ zUSChP_P6d<)KT)#(E`}YT_wu`g}1<9k@J7#U4&2nTFUCq>>lKR9vIuVo)Z3V&VPH} zpZq%sUH1M}{L}Lf42gP`6`^YYohcXbI5!-dbc`7q4rlt?nk=;-jP!n_SKv_@vrS5I zW8|EXJwKIdEQ#Y+C5oZ*Oo`dI!G|nj%O)FFd#JnKkQ(?}5IQ~Nj^OJ+T9~zRuY3Il z7^O9cp>Gj)Ikd>YpY&Cc3N3u}@yz56V{e$1O%q^MQ@t z;K;bPu{$6|hXr)tu%F{%uA?Ih)ZjQ}9^J>;&^BN$A8>z))6x=V?S$J{JT=;PUPo#U zo8NxWKP!f+$6@{I6dH~kNFICzH9jvqAuUQlB9X|ElB!!YGxT5nh- z6E2mL6t~MW6ASHS4H`c!idRi$4jqI*%jfF5d`)io>V>=wJ}dDczi&e3XY!pIES!LF zm*AQ1IZ={wE-Hp=JZL{7hPmjbN0w4lf4@F&?29Z&HHtM9pBDB&$Z#MfLtRDEyJr4R zkFE`RgF(ryMiZ-cMpUi3Li%}7D;OLG9jcm;VU48Hz&I)w>%-LG%F;4Zi7p#+r}`(i zI+l?#kK0w`9_r%?+c*Y`S#3A`U~v&QfChucnMed%{T4N4bF@NBGK3$k}8`?6MjTNIy3`=mi{3hNnkd$&6sq8qFdKHVGbvy-&&6 z1sI$km^~o1;`SE4*Kccz2NjKd_Q5hD>#aJ=Q^N@Yi#_ zB=7RD!{`4R+>(J8PM>TVD?74O4 z>F^B)X6$W7b4SpEjXj&EBHAGW1O^agA-I%?9h}KyvhfcZ!gdWbaRB#=1t^iQYkUC+ z`Bb7i7Ty;j8jb@z7lfn=F1GdP51vq;w==P^lc561QdPk&5^sd3*Yx@ZIPAhI<3;VE7&oEvo zHQZbm2?5;P2BPpUY7F4!Qe*sgb7}v(xwQYgxf+>xULzC|b>*514QV7Hz`czIlR&~8 zXBHoRsi)U*{GonES*QQaghJ? ztt3MRTvEX!FUrY7w^7hsM+zrS*Ha%C`o&wcK#w=A)t|C@u3n`>5&Vv9F~(S3&tU8_ zG{bCO4#oP3WyHJR(hU^=vVu8QI3qmmPMK%?WwA8jwB}yGhU<)1-0T>U&)<+y@ z+~NW8%g8QA7X^J$q=a}ujV=i&994AYoHDI4n&>4*t&SyoxA)?Efoa6mm{ZGBhwWQH zSg?(tnkYVL(rO+t?Q^V(!gnSl(!9@rl&vM5OsB5g4#CAi^yd^AmW>bB7}9Tu3P%=+ zk%34cCH)|$2?w@^&`O0mJlNG{b~1)S`p4TzIsHUn{w2GG1pe+d#nLf@Tn4VDVnf1P z-yf%dTDsGepTY-W{NN&60cJe&tNdY3LFpO8nc%ibo@xWi=s?eZa)XYl`ta z%wD3R(cGv#`XWtQ)3YD7e)o_ro`3lCD?bLC9Uo^P$IPZg#%}$8qFZ(wydr`P5Z##o zd!tg0-yDI?n@}eNCy!26?_o zo|~HK*D~jZQnV_@tfFde7lxA_{Nj8ul(sNS+l<-+ z8|20=VXa!?za+G6_zIHuAKz>-A#V=&=Z=~Y{9#P^vcRz35tVk`yISI77JwT zLX#&deI@^ki^N(!Q~Pie!ToUsiW=*aGj zj#QZ3|NA7w@_CXN_ypNpZ`FWA%vY5WupwX}0UKgqAFv??1OOW%@E2f11XlcKLqIHD z&;Mi>#u1;)gsV7D&`yFOo88dACS9jIB-dr)}=b6?iespjaxgmM9k> zr^-F}eLFE^3)5=DR=Tp%fLFV+(u7w$tJH)Sj2yLU9K>Xz{!pX~`~{i5_JNE@U9Jfa zveJM9;#&3ja0WxuWW+DT%cSL%Xv%+g#Z$PU#r16(MkG;_HTCa>;iAS*M)S33&YD_8 z94Ec@oSv;5&w*yEUWR;PNS@;pwa%ZEJOSNz_>;eq(di9GhlUgpJ{?(#`BxoO zuHOJJMUA;&Jc(0sHIG;{Y@0HiCeSbgouv=U*yq6*eA4lNSMnKSg0vJydi(n7bE>C{ z*B55NfliUwn08l;-1y4nT>u!ChpB!+Ver^eBQ$j^RbhqO{5@0!`gCnzyq|r75QlKo zQ_vmWccoCE^>bV|YUBnO1mP_#8+H5MlrXB{>pbgT&NF?gK*Av`Wdh$cQY!)&=TewJ zI%U%Yj>&NOokYtp!~jj-+TU=$vPw%jJ{V>&(NMREuH<>Qdl7WZpUG7~R@P|b*p(6a zi%Qbq_ofvp$Wo8Y5^>7T+D{a84kDJ6{GL7fI=CRWrgUKNXZBwrRq5d$^F6{>9J!l1 zp=KIDvEn=ihcFNU1&S5v0Q6cI0D9wzN+SS0UrRW|K+_TQn>jm@0=_XZLjMWuX%pBd zgErx_>Yrbe=w#*>)`RBT&l+6lt~MFj;~k2%D=)F zgu&obpO{IMR2vSit4=}}ihTx_Cl@glRLcV=CciSS7mqTwZ7G@RRn*A}2Uck;)a~1y zt7z#KV3J`K$kmo&%&G7Pjx(Gj>*w8FL znmY5x*ZK@%g4RJXCG^q?nQ9B+cz2vLn@D0Ra3)NyABC}fk(1RUnn&kUfr>*I)^ue{ z4>0-jghptdZvtqS*ObMyat(!K=;KWmr&X#TbzrAE z^B}M5OtbcW-~XLX8HQtJ6U+2K8Eo!TNZ5Z$GQ9(7!NrGAOqLo-kUgeP#x^_ zvntq~VBld~p~9t9cvT4FW5+XX!E3zSJQNn}Jf|R#$jiKZKk0c~;TJ`&ekd&KZW6PK zob%Znm2gSo6iapR!*}vtojZi``SW0ICGd$e>it;-k!Zax`Z)!`I}P%Vu`W(9>Wu^v z1sjv=9+`;XiN4)y3(Bng@J;mVNR7Op9ryLJRs-|0SIKVj5J-bm*?JYjTV+OMmsUjO zYDb!hb^D55%SLHweqQE1{Sj@YVH9_&QX=jU;{i#^&p?jhD-D^k74#m3_jZZcmFTIQ znqVh$@+!>%?R=8(!)Y|=i9M^+*-p`DX8K4LWh5Rq3An6K4>lT|D`oIWzPeGqKpI}& zw9SHFl~0f4bZ;_?P(5{}+=ZdsowrnJc2HfN%W@;a+`s6ve{d=(KGfoL)I7UD)$S;F zX|2emeBk*Jar`AUvolQ3kuao(Dk?1@$DkrmJ9d z=J|?8LzL#I17nIOt=1oCjz=1P*o_Hn8tnP(PqAp`)W}CYBpw>;ebu_&W_mr)glOXl zSZD!V&-sTkibL`lD{pa*GrH^R0UM=YbSrZhEE}c8KL{N%MUHe_<-sck+^>Ir{}wPG z^G)%KuXU0ryq^~E@+1E9Laga^PGEM~!J54lMrZR%v{NeYBGKHE>m07- z(5Rz1(O7GzJ&~f4)@-ar=aI%1L^B@+CNr(Exu-H4B_k_kV+ZXw=<*cETA43g)wDQ7 zOhTh=2*hK?EZ@U5#rs9UuT91EjA@$N~<=wF|}%h1~pNIX3ieC z&!B5U7*bQSKh$=1Pa~h5f~y%ukL0;{Q-0Fx8Es#TnH#hfjEmu+?Ju&?B)H5dDdt>> zLQh43&3=q&jR*R}8i+}u`Er)x^OL;eH{v1_tzp7<6kv@b%sN;)rbuY%RGdq?ArC%C z#X6OZ5Mz8eL$V|yn%A>jl!yrKYaq|8vNTn=Eo($weWL0kgpPFKd33wY&Pk>^WoV9+ z+^7;;dZU<;XzXg+TDT0>um>JzE#)Wh{EQ)L+Wt;lhTI~KC{;HZ&W8DUc24#Mt_(YGh`(K>otkVz z=9CaZK13L4WP%ha(f(h5^zjiPh!f&#ABw_Y0dRrqbbBc8(LpxlqTcjiT3bTAI!X4j z+Ct~fSURB7sZ>Qzv?6~@4J^|l4nGw620qc(W+3)(j{(Bz zA)Uf21Hzi?iS|-zabkA`6L!(Jqdv5QUqD~cMf5{+T32T4)eD+OF09WXf>Tw(D0W&O zHa9(pD3aU;0Mqv$7)+3ig^|MGb$bI9DRH=0?-RYBE`Rlo&D_=R^#0x;X|~*=M7nMA zOZPxdQD-N08FGbv9#n|wts zpAhLEJud-%yOFM4b zwzma!u(k#Ct)N!k0)Fk3?gX^TgDyZdzOU_y9H&hfhvS0_I*I&Lcg6k#YakVMe{D$o zhc~Jj8KFH`ylv^ub$Ge^2t7oMvf%aYRsSS46S!lIbmW-!_GR7#-N9t{@yi z4?DOdpIq4!*@b1|=r+p;`iI~v)FKKguSx@30>t5ktjSu?6MYPZz^0OeY>;Vb*usTu zjl>2UDM@W^Pxl%tfQYF-NL#JH@$c}vZmYt`-tJzV?rsF}?o=*!#bZciyEjOBcc>+t z9o%uq_0$F~TSxSvcW)pCQc2a810=s|FSyu)XIxvHr&3}SWDyJ|+X?+>I3nI>H}oE~ zksbjX8K&CsNI2_fxU7k-4cJ_NLi&?PuH@SIyOY0;SP z{t>rrz5o3e+_TSv6S_fohn><)35E(LV++W@gBz-a%i%T{_+(pFfY^frD)@$pOg+u| zYkpUe_Bl0U$&2gvN*1eBgyAGn@^wT!`49}Aj z=6wZxyCG9N0P+#Y0M~$R{zAmgDXkKM0O@Nxe8BdO<1NLfD0#ozYujK!uD8+OUrh*L z1$}M_zKb`p-cL6HA9CWsqV2uvc2xtjvO-N(Ddpe33h%u%et{5TVMF$ zR=Z?MyKdcQIrp)=w1P}b3%}cvXyL`RlC+2sFR1bRglUh5^tdcLaA>AII`k6EjFm`( zvK^b5%TekZ*vZ~ZWa?r7(LdGC6E`ZCFvb`+S7?5ucMOneWR@xM2O~d*Wxxqm?F7$`i1 z6Z-Lw5754>Bn~idi2i#KonmE{`r|*&`T$&aGDMJBq!AZE`i^S;-=@&9&lNv^v#_Ip z4UZ~MtG}vFxRs-CIm~A!ZB`Li=n7p0O5e<%4|hd0#cv9ddUAn-_*Hb&mbS=kZ{Z9q z@%<|m)whWFN%P%o$n0d;hy&E-<3emFrcwr&XV;W0c%3B6u?2z@Zm4tKJPqhIypzkA!8W-FIK5Jr`G3Y)9&2Vf;_#XHB=oY@O z3+3li!g>zKd}b9L{~B8sF72r9!-3PxN+|ByNGwEpJ>FC&UbeC0^ zs@GeGLM()#Cl^LA6>ZV4_zx}&D>8<$zj)xu z3g~sG(rNN>PnibJ_2x;~P>)2^#>MgQoBS@t64pu^SsmBHhD9LBn#aLS7({ z8G3GVD->!2L3JH<@V%^QBiyv2JEt{<{*)FgOI!jas%BECW?;P54PkuAf*g$(I=*u*K8wviKNFH6BfC^5a zSQ~i1d;G`>8Bz02o?u!c_ZYOlPOobs`45=O=ue2L^DgeK!0~?AXX#6VHu55s=6rA>y_esz@V`_xizO1vmIm zC>xQ*ZeAc5DE3ec53=j=r!2E{bTdocUZ*47Gy9xH(G4vtU1+4`Fdwz-AVmNt_s)k5 z(EQ{|?6`75P@r%olH@>MRytSn>e&8yG}U&z;`Gdo9waAdK;M;>MM}D2wBjuvs#K$h zj8LQIc7YpuDo%M)`_KVPY5|s{1jotT`?@I~)8abw{8?-H9qV?N+<55iy0@3HlvmHN z%r6SY%?$&e^++Wf0PzDAgHc#RkCn!K>6*3~YhEIk^;^F-Zr!qO*Md}@qM4LQ0C@qH z_E3fVx3?yFBRBM&_#l<+NX5W&aMQs>J%DbN+DjRLtttTmpA4NublbwR$1S9qEMqy^ z)7D!x&d-c;Bl3r;2@8UdW5Fj1nTH+)!VRg0Ua%7Zr#2jLdQ`ya1%vfl<6PFZn%Ot` zUN<(dSx;9tsSq;N%nqjq>F8W{fk*hJMHufvr($+&H`osc`a7YsJjVn8WqE5lOI|VB zV$nC~)Hrgyh!#;vS~gSGJ6tS52#JnN4=7|}dK9q<06sG3v2kR$FG;m&EKV@LhKke0 zIN2Dw8d~3?j^FYem$iCtk29sCG^~%te4kc2gnRSidRGe^Muj;QiclNv8eT9c(hR6$ zi^#MLjUC1p;US9;&Qf0Y7HH^JCD8xWBAf^w?OMWyPBtu--oOTLL`>4)7p zDg8zHIHf%I#D<3DOYPOnpi?{9>&tId(*|#zLfW3Mb9yif2~K!P=a}oFg`{&Q?;-Y% zod|75%YjPeS0%$YuzL4FM6g@21`@BGIm)Z$VbhlHdCd_&8n%eJrl;iJru^vmYUFRv zi+oujetSr0lP_ti(L-=^r{oDAa9h3P_4u;!-ry6L5MwF+!|@UDpJhdq;PtcM*+2~&h%d*#$%^1FZTpn8mF~xqxp|Sqg{xFKlpUjslhEYL zlH}5kRhF47R2eZm0;~59(1x2RAmQ1SuDn|T(1yxw;z};vwmucFm3C2L;uC}%l8;(T zwX$+n`7drT7;($M>Yb{kM<|1hJt?}U!2`RU0Ac6WLVXBUSz>%rj^JBG0k5xF+y{ms zndbII8hFQlwsg`P2D8gl8<02AzP6T|GgR?2rW|cCoJ>4p?EXpLr zOmp1E!Hs3(XS~tqgw@V@TCg7^JvNVX18QDLqMx0i8G9AN3*k(!z0AE!LL5)T(U}x$hozp zWpwvj&YIyMa2&YIDM|cIZkH_R$`=Yhgd~Gj+O<1Gv$!I5Znm*LD)@2~xugiM<=L)c z_}(;w@EXqvel#^;ars#KFt-0`kWY-ZkDapVD}u52v_#qzea(pOP5KA6n4#hZ{aHs; zG1Mq}^8h@XUK{qJ5rvY<1xguOahn!gaB>SK8_bE%yywux?hoOAC+#>;4iXNOAAT5fB|R!C-iWa3B;zEl`AdIkOpB}QFiuN&pRs{iLw z`l&}HYkPsf9^#uX`Ewk@doloca;Z1a?C<(brRC_Ay3g`M_Ey zQV=`Yh={&fxSmHTesVj+4dAJf&XKLW)$le_P288;t(Q@zRRz%fv0GD;8>aEebo4&L z_1$)LU3c&e@q0I}RSWYr)9wVVh-CI3pq+El1O!QKI3+C=A)y&F96nXO<}T}4dkboW zCEj6w68dP|C+euYTvGXP;?y-pu^rFc_A_Ro^R zD|LH|t}*mA6S~!Jd{`C_Q^u878tN-~+e^B=*lcmmhabs^7ysKI6}RY|w3(!6>rLL$ zLvnK7H*A2%ri78Bs|oC!V!vrT$7K1p zmWl|+&#DS)+1dKh&YqswQ;PHcr4ryQmBo#JlDaGYqnfz3dMOP(&PSshNFhei>1a1V z9C#>9?lM4Zh$k%Brp7U%!S>GP(V#%gFgZ->?N0P#kLZw4sm`LLv_X}F3iJ^cc3D(A<*12`4RwoUMvP}>8J zR15stj7b^tx1cf;{i2U@K8NcVi?hfgzZ(ytp2T@EsOE__)}MwHW;lkPnONReL0DTEroV zr=+p;R^B=W+J+{Bryv;L+Y-JHwY>CvMP(KrDHcu*wYrSC1UVkc<#`G{a#U+2c0Xz3 zNpe+A%93PKBhd~GDZzRk3Dw`VJR-Eoxs=7s-0Ta|Z9Vo+_@4Dsrp>+QVz`l(1CD1M z{eGM%>kODs&&afKnM+RY280d!kF#B*AK{8-3fkdU&fJGtF*-D!8yA*i5^){;864S0 z3b9m>%)4maFYq`y3f`jeKFqUpTtHi}L^{!}_bviVeEdxi!L716jh_9pcTHGduaRwJ z_?U~Pu8p8_{(q^DQ%kp+kbFCPw>@TCKT=)gw>rCZ;wxw6&{9rTel&2~_9=3K-O z7!JweoFpFNJroD7wva>|VSWT3&qZxl!WglZEiWv^0cJ6w+IO>)!7K(4l@y?}jB(Xw ze;`KL*jzE+^VPki7&R}ufeeDw4mh%k2M6-Z&nqej{Kg@~pC`q5N^)d=Ab?DU0x4{t z1qP2^K-t|xFkMpJo2G;Uy3sl&(twGZdKT9_#ctyyGF|5svqm~^>!lfLSlZt|4Ys!L zre1dam7MHVB!9%eZSIS^?M5#P1`M2Vg&!+9$R`!fjT~@huPY-&@S@E9@bJYBq@q6+ ziTCk})n*WiX0N)z--&E!E}7$hI>(3-*h+A3qN}bT`8}HW{%vBtvh_LluKKw!kw-^j z^sssWqDFn&uY#dADTK3wKQa1`A7FW&44PF(*}06*ig6PVrG?nKug{8IN=vNZ-%9_E z8sfF;-Mq%z9l6juiT_Q0UmKW~3%E)zWx*%P+&fBGhR;)===`mex<6nmtXP`JHU?+G z;$#*I>maI?r}wkj1?G$!FH$&}HmT*!3Nw~%)+ea8=P;}qOG^Y+HeHzJ)>bNlog!q5PUDO$6G|iMf3@{7y_zE}s0Iw6 zzm^ZW0GrIW6t9Sf$E%cIyVT#LRcUdTr+`l9Xl(Q}e3>o&vNL-p;|lD~{&gh#*O2tj zk_J2_9CAISI}%m^VZ?t3QQ9;jus${a=Q0vE+|iKp$Pkp;na(wiw%GilY@AGVO~XG- z^Xn}Z%}dCEnMq*F7;SVYM);L6#}#Z+yKP(q66ETTmqa;5?5Q;P8Msyo><^d>_ypzO z9au`EWK+_{?}Qfv>F`LbbUHfg@MOl`&4*Ld+Y$r}I4sT?#>o?Mq=pc(Gvic-q+2u6 z8*wu6=6&9+A4mBHLo+A-5M{+`0#cRf|DaPj{vnGv+EN4_$NfXMgU4X9LMM%PACPQ7 z2@BBTrDB1&%?P2HkS=O9Ca0iL>u=J2-`LptwB}8W4_{4CPrw<@T_sB#MH2Z;;cx= zjt0N$IK=7M4u)(%Gu*-hohq&+7}Ayhyvtq(#6w*N`jo_R`EX>yzgk(wzg_nToU|S%%h^(0aNKEEuN|2GRguoTKI3o#)&}K z8;W!xdS0ezFgnrXi}XgO#$f@DCF!Yxugg>&X~EtsY&@rc&UW)%o-Xcl)$vyRO zRH`mPgE=aQnLl%*)abA9W_IRqJ5i@G>+Ss01RSNF6HdT!_w!)ibc%B|Rkoh)uk)2g z^pbrqwm_=ct$=u+YAU-1oCb*(%>oV0`Ygic8_$c#K#KvBs_s8h-0AaSah8Nb8G<-E z9N5%)(nz=qf^^T}>juo|(uLh>9CqOBYU1@})~N4mbWq2r`z>$L!=LH3 zAz*8JfcRrII{3sK^*+Wfauk0`Vp;MCRTFQk3%Y=c&EtLPGAlKI2-l`c$!Y2)x}sL# z0LDE@K(kqisbY}Uhh=_8=`X%IzGv(#($RrxzOP`EweIw4#cwB7o)*|AFT15*lh+N+ zU$i~!74o-asB^MHOUTwxJ_A%J!l!m+~yE-wOmA zl)L_X8R6Pel|qc=oUz`+ilEjZrELLrxBIT{bfm_e=NS_m`Q#r$wA8kK8Hp&$%P9N8 zf^rHxox|iKSP{-zq_qv;WkVMC7;2*d$}~o}-uB?-sLcEe^abIj1GMnBLn&tB$^CYp zPDAQGYNu}q>`q#C5QQg`>lzMpm^e8e{!tbkUmnq#cO%Bdb!FJ0l5_I7b*M(vq+ZpY z%-YPYsnI=#kj)Weo5$tsoTIx>U~bi6Qne8x%&XRHkRGko{^^ELia$7TEEyU>s;cB{ z3Cr?qtx@Zm`mD{urAAl`wp-hD_8H)8Jq9{vL+ZG?bkuq0CT7o&H#83`p;OzcfPi-Z zTJZ6dsvw-74m#5Sp^L>cNJ)ZX!5qo?_cY`e!XSCt#4PsnI5QT-2f;l5@;`L*h@~Df z|025OL@6sGdFm~DGBO-hQ;n#dMB~vS5C?hLJJz{3f25*}d>FXMzbka_oRQE7<-PafIH@ ziZ6(kCIU>e#z$=0pSlM@Ws8BW>Dkpp^Tt>DX~##2^=*PBzqBOdqpjis_SN3nI_gy= zzb{|5cd4+8mHhIhBw@Xg$$fH;B+yL4f2-K9kXG&dvHZ$Y+g*xwIPXd=l!iYM2G%lW$Is!{wdrLRT@ z!}++TwZ;>9v-srnGIFsWKQnl6BI<~Z8+~V(tjm_rZSN4okI+6J;|m!an*(Xy0F&4W z4$v+v(joL?L-E%tMWOzrB^hA~AOF4}=jFN>XJ%;)wG4ZuEHWdO>|^JeqL#AI7^s#q zJh?FIj2v!?{{rFM5_Qh3pD@ z4@yNb43-S36NFOu@SF|o@6bo|f!0eNZqAPF#A!JW1e0>{?S=z1&wv!;#Q}B;J}Pf5 zAl*PIVP{eBIs&A2CA@?~@Vkbma&XwGdFJm=k01TH@W(WrL8Rca-*b`vK#2|Xq@T<# zUD!b2)edE}KSe)6$jk}U%Q;Y(xE!KFAyeh;s(ef%41?1^8mPh;sS9!S&DkcoV;g%d zsr}L{!gvHlCLg^neRd-#`Xj=K_^*g^EM0b@B-S-^J09*MdB-u1Bxd`-SZ8so6+a)2jcq=s=hkFfx;5d##%0-k!k+TB zftMO3$U-+e%)Qe0#zJs&y7-o&@D}ir4Fx_GmGe8%b2w1m%?Lxljb!oV1DqFZ)@pJ! zE4oL~NlQUKcB=<7dN?#;eQ}IKd5l43!yv=HyWfhkB>EFF?9_m%Y(!m1tNXl~+H_OA;a%3+;qRWc<0A;;D#>K@x5W`#PkHTZ18v7Tx!>^mzW))! z>_$#z9F_HlNJH=1CGTgH#@&S6G}ySDNEzEj|0Gw^J@P|jqP=iVXj9YKK5p5Onh;lQ zJ3K<*$w-?M$6jRZXds3_FX-s{6s>i)6hUl70mtT%tna0#mtD+nFiiHF*~;r_Xs`Uc z{?6oI`u5-ma!!fn)rhc&IU4~cD5YYC z?ToYm8-WLG1YW2~uZ=y|`wi(*PR|?{)i3;tq}N2(0v2uErFlMXpD>;8tBrzENA^w* z2o%mvy5uBlIhdHJ0A(_6zym|7YVODALo+*5N!<5E3c`m`B>Jd7BQ5I+tR7?VXJjQ( zBF&r(smVyRb-2H4UqoqNIu5XWB7~06jgwfHoJ>{TyK@1@8~<~HYn4ucZM1%MX&!@Q zS{+N5XfHHI31)g(d zK{@{H!Mecy(PL2xagpdS@VCT)7B@RoJ;cJJ(X?ovydU6h)PzD04K@aMW!mf@S(q?6 zEICr&vim9YxIn(K&BP>Mn%xci{q4s3ZP8bfh>Gr6iM>=<~I)b&EldCtkSfW<=PnWdu$Flzs>1 zYSfZG+!*Ene3@EAAcc+?g27A-X+#$siHu(w8q&X$9Gr6`E3uO)-kGY-;}xVoOS=xL zR=-oo;#FCeE~cZEHR&Ha+k(9Y;YrlM9o-*(u1=~))I6mz>9_OvYDpeuu%*6ajFzr0 z(&Z5`gS_1ley5Qs2&Hvf2FyYl8a?X$DVIU8U$VOmtPYp1=!JSysiA?GhJYH!2L+v& zR{|Quzq1IkUQG`ERUr;KTF8N@oYvkX2=1HO2-GkwSwMK?q1<*aty)Khor zzC(*8*XPqMcWz)mn{?k|@)6;&0TOCzyFIbgLW6?Px&U>RqOgTezC=+~SKBO?U>3+B z#NI>`HWq@(KorswNm)&O*WyS^tCJ~&o>=OjmyH!=;5l4u+is(S)Ua>v*}pH19-6`9 zQ4259BB(zfo9ih*B!go0d|F9Pm3NCWTzE_V_zqXEP##+Rjf zgbH6dT5{ta?3TQ0wgiK}_*Y5)WewKP32ts@^+Gft{#{|*0bOt>?u@pbqx>6Y`gX&? zP7USVffh_n1tFMy9%gML+KyECl@@*FWp!7CCk z12gqF*9fjZ-lkqnWSoMnhuWAhpp-k%f~cuR1hSt1Fia~sM*o3P0l>&W(4LZA$>UR? zS~uU8WW-g*$i_QLRCrK~;^`bU;#THgL;l}d*xcQ|0c%+U*5UwPpN>kTmh44_Y967HB*ghTNA4DZViiT4{(2#vqNVNdz~=gj*@teK&N`>Ew3C)L|je`0`B z=A%YBX;)Q_JtRX7XX)FYXgfcR|Gx~W|kq0KLLAe@cXFozuBAV5}}X3SK88Wb=4s0??& zFFtsRwi20(Pk`)yz>q3ffC*6ohbhTY4yy>Ob~Zl|nIR=I#eRftXZqCZ0Kz6c;_er; zj&Y%@seHwu{zVM28A0SXHHrTV?=9J-NBHq_Ne=a+a#tT9^HwCPHkPpGru#G4jezTd zKUV4^=|(X?F<`AQWM7!z)ec9nu7pdFI+p};jEf?TV8=kCTuS{uvPZsRn<=!}hx|Sz zRi$h}U%j|4>h}isita@=_GHG)S36Q>DbL74BiAvkv~}&m^){LHwq7?zF6&M&EZmqK zJk5NCI)YOg^p!oS98=E2{D#?GK?m53qe1ZkZ(WFyqSa?64w3kv0xj63HwcaGMPCWI z+QM$?B8M#lu?4pEv`)VP33W#ys+d z;zp`PWXzEvow`(p8yz&6jiDN2p~y^)+3iUaNX6F#DJWENy*z(Oe6_})i>!>@G5I;P zxo;0xgALnho4zKcH*txdwW2sI=M^JHHj2xTQ0F+Dy~VcC_5ZJpGmnRA{p0w-wT|6f zOqOu7#AwXe*D{G>EM3)Dhm46VjV)^^+YKd3Mk1yViA1Kd8?qGH!i=SxlBH}7jk5ku zx8HreZeDZ#IL~=~U(e_Le4p?0Jg;-U&+DAyCKqUBL_Q%Urj~sF1DNwzn?NUgtSga?kpt&!~dTnxTSFrjz#F>%HUy zk)KErCfSXof}VKX*H3#b3ZWKHFy?_M68wd&Znm^4X(xTCb#?}Q97bgnq7qb$$ed_u zNv<}*9#(}L9Dv_NB@K!3P6(JAjAmvwPF% z!BPwMLY<~_qG_W;E= z6`?uY^M2|2MLJQMNMqh>BBhyMvM~y;@BvUkMpn>N;t2!Z2#9Mwk33(m#HDmQM(wI` zXC#=(WY_a#tv|gyu%}A=;JV3~I}fuAE|BzVuxMwqFv1hX*4}~Pr_tP}U+GcBZA=p? zZRFr6gGrdIF!ZGZ=^Kw@Z|2FAvyiT9^8w?=qmLKp%Api5CcL*C`y{qFqFBzlY55Ea zj>UCiQiTF@V_XE2NWuJw+;QI1dCdWyA?OCNI5cc=z)=1(slsa5^EWjbonG#OZMB5Z zQ$uS8PX>BXY2oO)=A6IE2j5+yFCWUMTMKpF-IE@eI_hcScq%{Ukf04VAooD-A`gf> z3nC{);?VjFqO#y@@lBNH=U00pbKJ);F3+-j^w{SWiyO&-?K0-lqlU}^?3iS~Mc9Dt zUd~xwyMEW`(+>H`Reu+FsW;`5Q#z_`bKunslvXW99q>tWK9UXvoPef|N6 z!>2S)r&~#n*&;=`Q`PjvC2a6uK;4lj19B&iDH$G`d?o$7CYN|kWS_IKO#-izWF&UY zZD=|6Nr}wPpxCLKXI?7Ro|SY{##HI@vH6D~Yc%mY7+Ogz?ahX=cP!z+`{MK#RWR=l zTn_UONPC|>0Udxe%&(q^{OFn3P9lFAZK*eaW{y zmJBsrwR}@nOqwGXhO9i?4p*XI4%xN2Je!kM)F~E7bCk;LLi%Gu1@%2&F(9bThZ5f? zOYVN!9W-j`EifQg5_42jVNqv-&J0649GVRlv6{li&(VdDe!BB_vwC!#B8dt$BHCm8gHu|}yMIi#I?{tR;%`h@${n+zrEpOh9!X^Z zf>nSxuS~<&^Ca0zp0HiSkJcak3t_5Q}8$%u6)}xpCTdwFBGG{#Lav z+CwK=U`((*VDtoUp*61*^^gPZN}#1t4d^%WoIfwJTc@B6zLEZQJC9?2|t*&}-3Y+M;Yy za06Mh;uNcOXlbs^3;+C@`EAko)ubHdFU6FwF6p)l>rC@$cd7d&nQ}QtZdOk4C479L zgOxhi$=wEsRlx2z=wt8GB#OH zHuq#hzBEajg$1d>+iiY6OWJe+WucjYvL`|$9gTvovVD9L6AiIv1g{qT{pg_8BkPno z#?9^-Msa4U2}z-UMm2C1*1~vaU23>~#bLQuiZmGse)-Z@X1llFg-;WDbi;eA#H8Rh zgwYlAef#I${a;7?y<<66y#3{)8W-iHrQdsu6dj$fwUn+iudLUbN^|`~91whtAGv(` z0|!0fK!3CK^fMzyriSR@RgUM@)4I1R5Yb)tB%Cfd-G*to-FcYwV0{o7*`5$_cy7)9 zn!WR*K@NO7dAWOv7@a979t7@p?6bisrriLOL3l_RET*zO^CaECoxa8E>y$ z&!;PfJrvEoemq45cG5$UqlMw5IBv=1!G=>DkL2= zZ`anysT+^X#={M-8_im^Phb6Jj%p+uFIdSeNNL{NnU5|JxKLcLIriPD1z&a3f%fL< zunNPHh+^uU-&BBo9(p=la~NHB%sD|BgYn;6M8VRmC^}zM2MLYW^14lY`!yFJ+yXPjXdZJ~^OkTBHLhuh!OWQouuFS=@9uxcnA$SJ1S*-AWrAF|{f z>$?@xwe%=!YEx%p+hY#A8d&0R%s#j|((q2b=E&96aeMTnV2zqbaj)AqSFg&lhC20d z+pRnXDeb85>`WT7a{u~Bi`nn(2kIu6&pL00}22D55RL- z*|k$uY~fEf0GQ?m05Q<|?{N{d0f6&i;<*sQxe&J#5dnl?*8}1He!Bs}5TnB%!K#+* z008+{4VD+#;z5L45Wz1Pap1>!x6l^a-x3E_L4ZP$UxXQ;#gmA)3nB&tBk;r^0;_h5 z`Hi@LIQamqEc}Zc{o8-!rvn05sRh|a^qN66h64bEeo-%T0zkMQB8(X1>p>*?vJ!U? zCSHF7MZ#PFu;&-?1Qf3P=!5E6{|r$Dlzq!o>1^@2@(l-W&jl3+3Og770D#LXyD8qeEGgQo zC`hqF_eOAy@ZQ=T7ujZ(6dhI+X(Ub>4i4=xlid{2A(j+fR+NwYIdv}Jm`3UDri4tg tr0B7t2;#6WDEGm+p2@i@x?Bq^Df&MtoZuAyvA%=>b#PTNGQlMS{0~QZ&glRE literal 0 HcmV?d00001 diff --git a/docs/archived/AI智能体外呼SaaS平台_三期实施评估_团队配置版.xlsx b/docs/archived/AI智能体外呼SaaS平台_三期实施评估_团队配置版.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..62e8a4ef35f03d034fe774ca95195ccf8d6f5fcc GIT binary patch literal 119533 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 z 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

w|Y#d(s+WPJI$!eN>X$lpcriCxqeJx@KvR#b^Ig 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

Wbv|*#%7~m305(i;}lilwG<=egIi@4 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 z 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 JIO+bp`wvoL=dl0) literal 0 HcmV?d00001 diff --git a/docs/一期呼出应用开发计划_v1.0.md b/docs/一期呼出应用开发计划_v1.0.md new file mode 100644 index 0000000..11d8579 --- /dev/null +++ b/docs/一期呼出应用开发计划_v1.0.md @@ -0,0 +1,278 @@ +# 一期呼出应用开发计划 + +**版本:** v1.3(沿用原文件路径) +**文档状态:** 3.1 交互方案已确认:所有业务结果经 MQ 回传,录音先上传 OSS 后回传 OSS ID;接口与消息规范由本人制定。生产网络架构已确认采用多机器+多 EIP 直连,不纳入单 EIP+NAT 方案;新增确认租户独立命令队列+公平调度。具体配额、等待指标、环境和新增工作量经 G0 评审后执行,运行代码待实现。 +**适用范围:** 本人负责的一期外呼应用,以及与现有 SaaS、RabbitMQ、指定 SIP 系统的对接。 +**编制依据:** 用户最新确认的工作范围。既有 Excel 仅作背景参考,本文件独立交付,不修改 Excel,也不沿用其三期工时汇总。 + +**本次修订:** 对齐交互规划 v0.3 的 execution_id、拨号前等待/查询、准入截止与 MQ 背压语义;明确单线路可启动、无备用不虚构。六类 HTTP 路径不变,详细字段、状态和数值仍待 G0 冻结,本次不改运行代码。 + +## 1. 目标与范围 + +### 1.1 本人负责的交付 + +1. 外呼任务与基础调度的**数据契约、指令接收、受理/执行应答及状态对账**。 +2. **Asterisk 呼叫控制、指定 SIP 系统接入和 FALLBACK**。 +3. **实时语音 AI 链路的呼出应用**:衔接媒体、ASR、LLM、TTS,处理通话生命周期和打断。 +4. 将**通话状态、文字及录音数据回传 SaaS**,供 SaaS 存储和展示;负责投递失败重试、补传与可追踪性。 + +“本人负责”指上述模块的设计、开发、联调和交付,不再把核心实现默认分配给 BgB。本人是否同时为原团队 ArchA,在 G0 登记;同一人不得被当成两个并行开发资源。 + +### 1.2 系统边界 + +| 系统 | 本期职责 | 不承担的职责 | +| --- | --- | --- | +| 现有 SaaS | 租户/权限、客户与任务管理、号码选择、基础业务调度、业务重试决策;按可信租户归属分队列发布,背压时持久保留待发布任务;接收回传数据、长期存储、页面展示 | 不直接操纵 Asterisk 通道,不与呼出应用各自重复发起同一通话 | +| 本人开发的呼出应用 | 按租户队列公平接收与调度执行指令;跨 Cell 租户配额及资源准入;维护执行事实;控制 Asterisk/AI;主备尝试;应答、回传和补偿 | 不复制 SaaS 的客户库、任务编排系统、账本和管理后台 | +| RabbitMQ | 沿用 SaaS 的消息基础设施,按租户隔离执行命令队列,承载所有业务结果事件及其重试/死信 | 队列隔离不等于调度公平或资源独占;不把消息 ACK 当成接通或业务成功;录音先上传 OSS,MQ 仅回传 OSS ID 和元数据,不运输录音二进制 | +| 指定 SIP 供应商线路 | 提供各 trunk 的接入参数、呼叫能力、原因码、并发/CPS 和线路规则 | 不假定线路天然跨故障域;供应商白名单与线路能力由线路方确认 | + +呼出应用可以保存必要的执行、去重、控制屏障和投递记录,但不建立第二套 SaaS 主数据体系。 + +### 1.3 明确不做 + +- 计费、余额、支付、套餐、发票;保留基础用量指标,不实施扣费。 +- 通用开放平台、第三方开发者门户、多种回调通道同时建设。 +- RAG、流程编排、人工坐席及未经审核的开放式多线路编排;已审核的供应商 trunk 按约定策略动态选路属于本期外呼能力。 +- 自研 ASR/LLM/TTS 模型、自研完整媒体引擎、集群自动扩容。 +- SaaS 全部页面和业务模块重建。SaaS 配合改造由其对应负责人交付。 + +### 1.4 生产网络与容量基线(已确认) + +- 生产唯一网络方案为**多机器+多 EIP 直连**。每个语音 Cell 包含 Asterisk、媒体适配和本地执行器,并绑定固定出口 IP;调度器按 `trunk_id + egress_pool_id + cell_id` 分配任务。 +- 一通电话从建立到结束固定使用同一 Cell 和出口;供应商 trunk 预先配置,逐呼只选择已授权线路并应用其号码规则,不逐呼重写共享 SIP 配置、重载 Asterisk 或重建注册。 +- 每个 Cell/出口独立维护供应商白名单、RTP 端口范围、并发上限、CPS、编解码和健康状态。供应商限制优先于本地理论容量。 +- **单 EIP+NAT 不作为备选方案**,本计划不设计、不实现、不验收该架构;不得以通用 SNAT 代替多 EIP 直连。 +- 容量口径为至少 **1000 路同时已接通的完整 ASR/LLM/TTS 通话**。拨号、振铃、CPS、AI 配额、RTP/UDP 端口、带宽、文件描述符、MQ、OSS 和故障冗余必须单独计入。 +- 采用 N+1 或更高冗余。按真实压测得到的单 Cell 安全容量计算:`(Cell 数量 - 1) × 单 Cell 安全容量 >= 1000`,并额外预留发布、线路故障和突发拨号余量。该冗余保证故障后的承接能力,不保证故障 Cell 中的活动通话无损迁移。 +- 当前 RTP `10000–10800` 仅是配置基线,不是 1000 路容量保证;G4 前必须完成真实 SIP/RTP、ASR/LLM/TTS 和供应商配额压测,未压测不得承诺机器数量或规格。 + +### 1.5 多租户队列与公平调度(已确认,运行代码待实现) + +- 采用**按租户 ID 映射到独立 RabbitMQ 命令队列+呼出应用调度器公平调度**。A 的大量积压不应使 B 必须等待 A 排空后才能进入执行调度;不再采用所有租户共用一个执行 FIFO。 +- SaaS 依据可信租户归属发布;平台负责队列创建、精确路由绑定和停用/清理,不接受调用方任意指定其他租户队列。任务创建、业务重试仍由 SaaS 决定;执行公平与资源许可由呼出应用负责。 +- 活跃且可调度租户间默认建议等权轮询;有明确差异化需求后按平台权重调度。每轮有限取数、按租户及全局限制预取和已持久化待发起窗口;额度耗尽或线路不可用时跳过该租户,不阻塞其他租户。不能消费到无界内存 FIFO 后再宣称公平。 +- 租户并发/CPS 额度跨所有 Cell 和调度实例汇总;并发包括发起预留、拨号、振铃、接通和待对账占用,CPS 包括 FALLBACK。拨号前同时满足租户、供应商、Cell/出口和 AI 配额;多实例采用原子额度及调度所有权/租约协调,失效实例不能重复分配。 +- 每租户限制发布速率、队列消息数/字节及待执行窗口,辅以全局 broker 水位保护。满队列明确拒绝发布,不丢弃队头旧命令;SaaS 保留发布记录,confirm 不确定或失败时使用原执行标识有限重试。重试/死信恢复回到原租户调度域,不能绕过配额。 +- 有资源时保障公平分配新许可,不为公平强制挂断已接通电话;资源已满时需等释放。若要求固定开始时限,必须另外确认线路/AI/Cell 全链路保底或受限借用策略,不把轮询等同于 SLA 保证。 +- 队列数量、轮转参数、配额与时延数值在 G0 冻结;详情见 [SaaS 交互规划第 5 节](SaaS交互_OpenAPI与MQ契约规划_v0.1.md)。本轮不改变事件回传队列为租户独立队列,不增加 HTTP 拨号入口。 + +## 2. 分工与双方交付物 + +| 负责人 | 交付内容 | 对接对象 | +| --- | --- | --- | +| 本人:呼出应用负责人 | 制定并发布 OpenAPI、MQ 拓扑、消息/事件字段、鉴权、错误码、幂等/重试及 OSS ID 回传规范;交付执行服务、ARI/SIP/FALLBACK、AI 呼出应用、MQ 结果回传和专项测试 | SaaS 后端、部署负责人、SIP/AI 供应方 | +| BgA:建议负责 SaaS 业务接口 | 任务/号码/配置快照,租户授权校验,控制接口调用,执行状态映射及查询接入 | 本人、FeA | +| BgB:建议负责 SaaS 消息与资产接入 | RabbitMQ 按租户路由发布、发布限流/背压持久重试,回传接收与去重,文字/录音元数据落库,上传授权与补传联调 | 本人、BgA、存储负责人 | +| FeA:SaaS 展示 | 任务/通话状态、文字时间线、录音鉴权播放、失败/处理中状态、联调验收页面 | BgA、BgB | +| 原团队部署负责人/ArchA | 环境、网络、证书、密钥、租户队列生命周期/绑定/ACL/容量策略、监控、发布和回滚支持 | 本人及各服务负责人 | + +BgA/BgB 为建议配合分工,G0 由 SaaS 团队认领。不把部署负责人视为新增第五名成员;若与本人重合,需合并其工作日历。 + +## 3. 最小交互方案与执行顺序 + +### 3.1 已确认的最小方案 + +**已确认:RabbitMQ 下发呼叫执行指令,所有业务结果必须经 MQ 回传;录音先上传 OSS,上传成功并取得 OSS ID 后,通过 MQ 回传 OSS ID 及必要元数据。接口与消息规范由本人制定。** + +- 不增加第二条能够独立拨号的 HTTP 入口。OpenAPI 仅承担任务控制、查询、OSS 上传授权及完成确认;同步接口应答不替代业务结果事件,不保留 HTTP 业务回调链路。 +- 受理/拒绝、执行状态、文字、最终结果和录音就绪等事件统一走 MQ。录音文件不进入 MQ,上传失败不得发送录音就绪事件,失败状态仍经 MQ 回传。SaaS 根据 OSS ID 关联录音并提供租户授权播放。 +- 由本人制定并发布 Exchange/Queue、Routing Key、消息/事件字段、API 路径、鉴权、错误码、版本、幂等/重试以及 OSS ID 命名和取值规范;SaaS 与运维按该规范对接、验证和落地。本文具体接口/字段仍为草案,本次确认不代表详细规范已经发布。 + +### 3.2 一次外呼的交互步骤 + +1. SaaS 创建任务及号码明细,固定智能体配置版本;执行租户授权、允许时段、基础频控及拒绝再联系检查。 +2. SaaS 业务调度器为一次授权外呼生成 `execution_id`,为执行命令生成 `command_id`,按可信租户 ID 映射路由向该租户独立队列发布 `call.execute`,携带任务项、有效期及执行所需快照;受发布限流/队列背压时持久保留,两个 ID 均保持不变重试。 +3. 呼出应用在活跃租户间公平轮转、有界取数,校验队列绑定与正文租户一致、授权归属、有效期和任务控制版本;持久化命令及去重结果后 ACK。此时仅表示“已接收”,不是“已拨号”。 +4. 呼出应用通过 MQ 回传受理/拒绝应答。尚未取出的命令受租户队列容量和有效期约束;已受理但未准入时以 waiting 状态、等待原因和截止时间表达,通过 command_id 查询。准入截止取 not_after 与 accepted_at+服务端窗口的较早值,重投/重启不延长;超限区分过期、租户/线路/系统瓶颈或纯调度超时,经 MQ 终结,由 SaaS 对账后决定是否重新授权,不无限堆积。 +5. 呼出应用公平分配执行机会,原子取得跨 Cell 租户并发/CPS 额度及供应商/Cell/出口/AI 完整资源许可;首次准入成功并提交拨号意图时分配 `call_id`、`attempt_id`,此前 call_id 为 null。拨号前再次检查暂停/停止屏障与有效期;提交意图不等于已发出 SIP 或接通,状态不明先对账。 +6. 通过 Asterisk 向指定主 SIP 接入发起呼叫,通过 MQ 回传拨号、振铃、接通或失败状态。 +7. 主尝试明确未接通且符合允许的线路故障条件时,确认旧通道结束后才选择已配置、获授权且兼容同一 Cell/出口的备用线路;无适合备用则结束失败,不虚构备用。状态不明时先对账,不盲目重拨。 +8. 接通后建立媒体会话,衔接 ASR→LLM→TTS,处理客户插话、静音、超时及主动结束。 +9. 文字按中间稿/最终稿通过 MQ 回传 SaaS。回传或 SaaS 页面故障不得阻塞实时音频链路。 +10. 挂断后关闭媒体会话并清理通道,写入独立的通话终态并通过 MQ 回传;文字最终稿、录音上传等后处理继续异步执行。 +11. 获取 OSS 上传授权,将录音上传 OSS,完成校验并取得 OSS ID 后,通过 MQ 发布含 OSS ID 的录音就绪事件;SaaS 消费后关联录音并展示。上传失败通过 MQ 回传失败状态,不发送无效的录音就绪事件。 +12. 对未确认发布或未被 SaaS 应用的事件进行有限重试、MQ 补传和对账。SaaS 可查询通话及资产处理状态,查询不代替所有业务结果必须经 MQ 回传的要求。 + +## 4. G0:开发前确认清单 + +下列内容先在测试环境确认,不要求全部生产资源提前到位;未确认的关键外部依赖不能计为已经解决。 + +| 确认项 | 需要得到的结论 | 提供方 | +| --- | --- | --- | +| 工作边界 | 本人实际可投入时间;现有呼出应用、媒体组件和 SDK 可复用程度;SaaS 调度由谁实现 | 本人、SaaS 团队 | +| OpenAPI | 本人制定控制、查询、OSS 上传授权/完成确认的路径、字段、鉴权、错误码、超时、幂等和版本规则;业务结果走 MQ 已确认,不再作为待选项 | 本人制定;SaaS 后端对接 | +| RabbitMQ | 租户独立命令队列已确认;制定 tenant_id 路由映射、队列/绑定生命周期、ACL、消息/队列容量、拒绝发布背压、Confirm/ACK、按租户重试/DLQ 恢复;验证队列数量与 broker 全局资源上限 | 本人制定;SaaS/运维落地 | +| 公平调度 | 冻结轮转/权重、取数批量、活跃租户发现、未 ACK/待发起窗口、跨 Cell 租户并发/CPS、发布速率、多实例额度/所有权协调;明确等待指标及是否需要保底/借用 | 本人、SaaS、部署方 | +| 任务控制 | 暂停/恢复/停止语义;停止是否挂断已接通电话;业务重试与主备切换的边界 | SaaS、本人 | +| 指定 SIP 供应商线路 | 各 trunk 的测试账户、接入、注册或 IP 鉴权、主叫限制、拨号格式、并发/CPS、失败码、出口白名单和线路选择政策 | SIP/线路方 | +| Asterisk 与媒体 | Asterisk 版本、ARI 能力、多 Cell/EIP 网络、SIP/RTP 防火墙、编解码及采样率;测试电话双向可听 | 部署方、本人 | +| AI 接入 | 可用流式 ASR/LLM/TTS 接口、凭证、音频格式、取消能力、并发配额和超时限制 | AI 供应方、本人 | +| 文字与录音 | 中间稿展示要求;单/双声道;OSS 上传协议、校验、OSS ID 字段及取值、长期保留与播放授权;“先上传 OSS、再经 MQ 回传 OSS ID”已确认 | 本人制定回传规范;SaaS、存储/业务负责人配合 | +| 容量与验收 | 目标并发、CPS、最长通话、响应/打断延迟、回传时延、最长可恢复中断、临时磁盘上限 | 双方、部署方 | + +**G0 输出:** 本人制定并发布的接口/消息契约 v1(含 OSS ID 回传规范)、对接验证记录、测试账号与样例、参数基线、风险清单及确认后的排期。不以“CRUD 开发速度”替代实时语音接入验证。 + +## 5. 接口、消息和应答契约 + +### 5.1 OpenAPI 清单草案 + +| 方向 | 接口草案 | 职责与应答 | +| --- | --- | --- | +| SaaS→呼出应用 | `POST /internal/v1/outbound/tasks/{task_id}/controls` | 提交暂停/恢复/停止;含 `command_id`、`task_revision`、动作。返回受理结果,执行生效另有确认 | +| SaaS→呼出应用 | `GET /internal/v1/outbound/commands/{command_id}` | 查询受理、等待/原因/准入截止、执行中、已生效、拒绝或失败;call_id 尚无时也可对账;重复请求不改变状态 | +| SaaS→呼出应用 | `GET /internal/v1/outbound/calls/{call_id}` | 查询通话终态、尝试记录、文字/录音处理状态和回传进度 | +| 呼出应用→SaaS | `POST /internal/v1/outbound/recording-uploads` | 获取绑定租户/通话、格式/大小约束和有效期的 OSS 上传授权;按本人制定的存储协议返回上传地址/会话 | +| 呼出应用→SaaS | `POST /internal/v1/outbound/recording-uploads/{upload_id}/complete` | 确认 OSS 上传完成及校验结果,返回或确认 OSS ID;随后通过 MQ 发布录音就绪事件,此接口不承担业务结果回调、不传 Base64 | +| SaaS→呼出应用 | `POST /internal/v1/outbound/calls/{call_id}/replays` | 授权触发结果/文字/录音元数据经 MQ 补传;只重传数据,绝不重新拨号 | + +不提供 HTTP 业务事件接收接口;事件按类型定义 MQ Schema。接口路径及 OSS ID 字段的最终规范由本人制定并发布,SaaS 按规范对接。现有上传/资产能力可复用,但不改变“先上传 OSS,再通过 MQ 回传 OSS ID”的顺序。 + +### 5.2 RabbitMQ 执行指令 + +按租户 ID 映射独立队列,命令类型仍为 `call.execute`。具体 Exchange、带租户路由键及队列命名草案见 [SaaS 交互规划](SaaS交互_OpenAPI与MQ契约规划_v0.1.md);路由与正文 tenant_id 必须一致,重投不能改投其他租户以绕过限流。 + +`call.execute` 最小字段: + +- 通用:`schema_version`、`command_id`、`tenant_id`、`trace_id`、`issued_at`、`not_after`。 +- 业务:`execution_id`、`task_id`、`task_item_id`、`task_revision`、原始被叫 `callee`、已授权的 `caller_profile_id` / `route_policy_id`;不预拼供应商前缀,不让调用方任意指定 SIP 地址、凭据或 Cell/出口。 +- 配置:`agent_version_id`、变量及不可变配置快照,或双方确认的快照读取引用。 +- 约束:最大通话时长、振铃超时、允许的 FALLBACK 策略引用。 + +执行指令不要求尚未生成的 `call_id/attempt_id`。同一命令的网络重试保持 command_id/execution_id 不变;同时以 `(tenant_id, command_id)` 和 `(tenant_id, execution_id)` 去重,换 command_id 也不能让同一次业务执行再次拨号。内部合法 FALLBACK 仅新建 attempt_id,保持 execution_id/call_id;业务重新外呼须先确认原执行事实并取得新授权,再生成新的 execution_id/command_id,受 SaaS 重试政策限制。不得把凭证直接塞进可广泛访问的消息或日志。 + +准入字段、状态/原因、时限和查询样例以 [SaaS 交互规划第 4.2、6.2、8.4 节](SaaS交互_OpenAPI与MQ契约规划_v0.1.md) 为详细草案:未消费持久化的命令允许查不到,404 不能当成未发布/未拨号证据;等待查询及 MQ 快照使用同一命令版本域。首次准入截止只限制首次发起;not_after 限制每次新尝试(含 FALLBACK),均不作为已发起通话的强制挂断时间。 + +### 5.3 MQ 回传事件 + +所有业务结果事件统一经 MQ 回传,规范由本人制定。录音回传使用 OSS ID,字段示例为 `oss_id`,最终命名及取值由本人规范确定;不默认将其等同于文件名、Object Key、ETag 或播放 URL。 + +通用外壳:`event_id`、`event_type`、`schema_version`、`tenant_id`、`trace_id`、`occurred_at`、`payload`;按事件类型要求 `command_id/task_id/task_item_id/call_id/attempt_id`,不统一强制全填。 + +| 事件类型 | 核心数据 | SaaS 的处理 | +| --- | --- | --- | +| `command.result` | 原命令、execution_id、受理/等待/执行/生效/拒绝/失败、原因、控制版本;execute 的 wait_reason_code、waiting_since、admission_deadline 和可空 call_id | 分清受理、资源等待、提交拨号意图和实际通话状态;按命令聚合版本更新 | +| `call.status` | 通话与尝试、状态版本、实际 trunk_id/egress_pool_id/cell_id、时间、标准原因和原始 SIP/Asterisk 原因 | 幂等更新,不被迟到事件回退终态;实际选路也进入通话查询 | +| `transcript.updated` | `turn_id`、角色、文本版本/序号、文本、中间/最终标记、起止时间、播放/取消标记 | 更新同一轮文字,不把中间稿累加成重复句子 | +| `recording.ready` | `call_id`、`oss_id`(OSS ID)、格式、声道、采样率、时长、大小、校验;`recording_id`可作业务关联标识 | 仅在 OSS 上传成功并确认 OSS ID 后发布;SaaS 根据 OSS ID 关联录音并提供租户授权播放 | +| `call.finished` | 通话终态、开始/接通/结束时间、时长、原因、FALLBACK 使用情况、各资产处理状态 | 电话结束即可落业务终态;后处理允许随后补齐 | + +时间戳采用带时区的统一格式,时长单位由本人在 Schema 中明确。文本序号和状态版本分别定义作用域,不依赖 MQ 全局顺序;重试和补传保留原 `event_id`,避免重复应用。 + +### 5.4 可靠性与控制语义 + +- 命令 MQ ACK:仅在执行指令及幂等信息已持久化后确认。网络重投使用同一执行标识。 +- 发布背压:confirm ACK 且无 mandatory return 只证明 broker 接收并路由;NACK、不可路由、confirm 不确定及 broker blocked 按交互规划第 5.4 节持久保留、原 ID 有限退避/修复。满队列明确拒绝、不丢旧消息,不能将 AMQP 背压映射成虚构的 HTTP 429 或已受理业务拒绝。 +- 结果 MQ 发布:启用 Publisher Confirm 和不可路由检查;确认只代表消息进入有效队列,不代表 SaaS 已完成业务入库。 +- SaaS 消费 ACK:按 `event_id` 去重,业务数据与接收记录持久化成功后 ACK;消费失败可重试/补传,不能静默丢失。 +- 事件产生:执行事实与待投递记录同事务提交;独立投递任务负责重试。SaaS 接收侧同样去重,不依赖“恰好一次”假设。 +- 拨号副作用:调用 ARI 前持久化发起意图及固定通道关联标识;超时/进程重启后先核实 Asterisk 的实际通道,不因本地缺少成功记录就再次拨号。无法核实的执行进入待对账。 +- 重试分类:MQ 网络故障、发布未确认、不可路由或消费失败按本人制定的退避/DLQ规则处理;非法 Schema 隔离,鉴权异常告警。HTTP 的429/可恢复5xx重试仅用于控制、查询和 OSS 上传相关接口,不作为 HTTP 业务回调的备用链路。 +- 过期/停止任务:死信重放仍检查有效期、控制版本和业务许可;数据补传不得触发重新外呼。 +- 暂停:SaaS 停止发新指令;呼出应用建立覆盖 broker 积压、已持久化 waiting 和多 Cell 在途许可的控制屏障。未发起的等待执行按当前屏障/版本拒绝并经 MQ 回传;尚在队列的旧命令消费时拒绝,resume 不静默复活。待在途发起许可处理完或确认失效后才回传“已生效”;状态不明维持 applying/reconciling,applied 不代表积压全部清理或已有电话全部结束。竞争样例见交互规划第 8.5 节。 +- 停止:旧版本和迟到指令不能重新开启任务;是否终止已接通电话按 G0 确认的策略执行,强制挂断必须鉴权和审计。 +- 终态:呼叫、文字/录音后处理、回传投递分别记录状态。录音失败不改写电话已经结束的事实。 + +## 6. 开发任务步骤与工时 + +下表保留**原本人负责范围的基准工时**,包含设计、编码、自测和正常联调,不包含 SaaS 团队实现工时。已将租户队列、公平调度和专项测试并入对应工作包,但其增量工时尚未重估;原合计不能视为已覆盖新增范围的交付承诺,G0 完成增量评估后更新总工时和排期。每项先有可验证产出,再进入下一依赖阶段。 + +| WBS | 任务包 | 开发步骤及交付物 | 本人工时 | +| --- | --- | --- | --- | +| D01 | 对接契约与技术验证 | 盘点已有组件→确认双方职责→冻结 OpenAPI/消息/状态→完成样例与 Mock→验证一通测试电话和 AI 流式能力 | 24–32h | +| D02 | 环境与应用骨架 | 打通 SaaS/MQ/ARI/AI/存储及多 Cell/EIP 网络→接入服务鉴权与密钥→建立最小执行/投递存储→健康检查与日志 | 16–24h | +| D03 | 指令、公平调度、应答与控制 | 租户队列有界接收/轮转→路由/租户/时效校验→持久去重→跨 Cell 租户额度与多调度实例协调→Cell/trunk/EIP/AI 资源准入→受理应答→暂停/停止屏障→重启恢复测试 | 原 32–48h,增量待评估 | +| D04 | Asterisk 主线路呼叫 | SIP参数与号码格式→ARI发起→通道/桥/媒体关联→振铃/接通/挂断→时间和原因归一→资源清理 | 32–48h | +| D05 | FALLBACK 与状态对账 | 确认可切换失败码→旧通道结束确认→备用尝试→迟到接通/ARI断线对账→次数/期限限制→防双拨演练 | 32–48h | +| D06 | 实时 AI 呼出应用 | 对接现有媒体能力→编解码/采样率适配→ASR/LLM/TTS流式联动→打断与取消旧生成→静音/超时/退出→异步隔离 | 48–72h | +| D07 | 文字生成与回传 | 定义轮次/版本→中间稿与最终稿→角色及播放/取消标记→持久事件→断网补传→SaaS时间线核对 | 16–24h | +| D08 | 录音上传与回传 | 录音生成→封装/元数据→OSS上传授权→上传/校验→确认OSS ID→经MQ回传OSS ID及元数据→重试/临时文件清理 | 24–32h | +| D09 | 查询、投递与补偿 | 命令/通话查询→受理与终态一致性→回传重试/隔离→授权重放→资产处理独立状态→恢复对账 | 32–40h | +| D10 | 可观测与运行保障 | 按租户等待/配额/积压指标→租户队列生命周期及 broker 上限→拒绝发布/背压→临时存储保护→密钥脱敏→部署、重启和优雅停机 | 原 24–32h,增量待评估 | +| D11 | 端到端专项验收 | SaaS真实联调→多 Cell/EIP 与供应商线路故障注入→重复/乱序/过期→多租户安全/公平/背压→多调度实例配额恢复→1000 路完整 AI 容量/延迟→回传与录音恢复 | 原 36–48h,增量待评估 | +| D12 | 灰度、交接与发布 | 固定版本→小流量试运行→问题收敛→回滚演练→交付配置/操作/排障说明与验收记录 | 12–16h | +| **原基准合计** | **本人范围** | **不含未认领的 SaaS 配合开发、供应商等待及本轮增量;新合计待 G0 评估** | **328–464h(历史基准)** | + +### 6.1 关键开发约束 + +**线路与 FALLBACK:** 支持单线路启动,供应商按需预接入、逐呼从已配置且获授权的线路策略选路;不等待所有供应商接齐,也不要求凑齐主备。仅对确认的线路接入故障切换,且备用必须兼容本通话固定的 Cell/出口及白名单;当前仅一家线路,无适合备用则失败,不虚构备用或迁移活动通话。忙线、拒接、无效号码、黑名单默认不切,无人接听是否重试由 SaaS 业务策略决定。接通后不新建备用呼叫。本地媒体或 AI 故障不能直接当作 SIP 线路故障处理。状态不明进入待对账,禁止盲目重新拨号。 + +**实时 AI:** 中间结果可合并,最终文字必须可恢复;TTS 文本区分已生成、已发送/播放确认和已取消,不将“生成完成”描述成“客户已听到”。音频线程不等待 SaaS 回调或录音上传。AI 失败使用有限重试及经确认的结束/兜底策略。 + +**录音:** 文件先上传 OSS,确认成功并取得 OSS ID 后,才通过 RabbitMQ 回传 OSS ID 及必要元数据;不发送二进制/Base64,也不以公开 URL 替代 OSS ID。SaaS 管理长期存储与播放权限,呼出侧仅按确认的恢复期限暂存。SaaS 不可用时有磁盘水位、积压告警和停止接单策略,不允许无限缓存。访问录音必须按租户和用户授权,签名地址短期有效且不写入公开日志。 + +**业务安全:** SaaS 在调度入口实施授权、允许时段、基础频控及拒绝再联系拦截;呼出应用实施租户/任务关联、有效期、资源上限和停机屏障。拒绝再联系事件及时回传,不能等二期才避免重复骚扰。 + +## 7. 里程碑与排期 + +| 门禁 | 本人产出 | SaaS/外部配合 | 通过条件 | +| --- | --- | --- | --- | +| G0:对接确认 | 本人制定并发布 D01 契约、样例、技术验证和参数基线 | SaaS/运维按规范认领接口及MQ、SIP、AI、OSS测试权限 | 已确认的双向MQ和OSS ID回传方案落实为可验证契约;关键测试依赖可用 | +| G1:指令闭环 | D02–D03;D09查询/应答基础 | SaaS能按租户发布、处理背压、接收应答和调用控制接口 | 重复指令不重复执行,过期/停止指令被拒绝,暂停生效可查询;大租户积压不阻塞有额度/资源的小租户,多实例不超租户配额 | +| G2:电话闭环 | D04–D05 | 当前主线路与授权测试号码;有备用时提供独立接入及白名单 | 单线路可双向通话;无备用明确失败不虚构容灾;有适合备用时验证合法切换,迟到接通不导致双拨。备用尚缺时记录其真实验证为待验,不把单线路通过称为完整 FALLBACK 验收 | +| G3:AI与资产闭环 | D06–D08;D09补偿完善 | SaaS MQ结果消费、OSS上传授权/确认及FeA展示页面 | 多轮/打断可用;文字经MQ正确入库;OSS ID可关联录音并鉴权播放;断网可经MQ补回 | +| G4:上线验收 | D10–D11 | 监控告警、多 Cell/EIP 故障演练环境、验收参与者 | 关键验收全部通过;至少1000路已接通完整ASR/LLM/TTS,且拨号/CPS/故障冗余达到G0基线;无阻断缺陷 | +| G5:一期交付 | D12 | 发布窗口、业务试用和运维交接 | 灰度通过;回滚可执行;遗留风险有明确负责人 | + +执行顺序:D01→D02→D03/D04→D05/D06→D07/D08→D09完善→D10/D11→D12。D09/D10 的基础能力从早期开始,不到项目末尾才补幂等和日志。 + +SaaS 可在 G0 后按 Mock 并行开发;本人为单人时,上述模块不能被当成多个独立人力并行压缩工期。 + +### 7.1 工时与周期口径 + +以下为本轮调整前的历史口径;租户队列生命周期、公平调度、多实例额度协调及新增验收的增量尚未评估,不能沿用为更新后的固定交期。G0 同时复核 D01/D02 契约与环境配合影响,不擅自假定已有20%预留足以覆盖。 + +- 基准:**328–464 小时**,即 **41–58 人日**(8小时/人日)。 +- 加20%计划预留:**393.6–556.8 小时**,即 **49.2–69.6 人日**。 +- 若本人每周有40小时可投入该范围,约 **10–14个工作周**;若每周只有24小时,约 **17–24个工作周**。均不含供应商或 SaaS 外部等待。 +- 以上以可用 SIP/AI 服务及可复用媒体组件为前提,不包含自研媒体引擎。G0 验证不成立、新增供应商或接口发生破坏性变化时单独重估,不能靠20%预留覆盖全部新增范围。 +- 这不是一期全团队总工时。BgA/BgB/FeA配合量及本人兼任部署/值守的占用,由对接负责人确认后再排入日历;不虚构额外人力,也不直接套用旧 Excel 的三期周期。 + +## 8. 验收用例与记录 + +每个用例记录:版本、环境、参数、操作、预期、实际、日志/事件证据和结论。使用授权测试号码,不以随机真实客户做故障实验。 + +| 编号 | 场景 | 验收条件 | +| --- | --- | --- | +| AT-01 | 命令重复、重启和ACK丢失 | 同一授权执行不因消息重复或更换 command_id 生成第二次拨号;已接收指令重启后可查询、可恢复;call_id 尚无时通过 command_id 观察 waiting,窗口不因重投/重启延长,截止后拒绝且不拨号,原因与 MQ 事件一致 | +| AT-02 | 暂停/停止与积压竞争 | 生效确认后不再新发起;迟到旧指令和死信重放不能重新开启已停止任务 | +| AT-03 | 主线路基本通话 | 发起、振铃、接通、双向语音、挂断及原因正确;通道/桥/媒体最终清理 | +| AT-04 | 单线路及合法FALLBACK | 无备用时可启动、遇故障明确失败;有适合备用时,仅主尝试明确结束、未接通且属于允许故障才切换,保持同一 Cell/出口,记录完整 attempt 和线路信息;无独立备用时真实切换验收标待验 | +| AT-05 | 不应FALLBACK | 已接通、状态不明、忙线/拒接/无效号码、本地AI故障不会引发未经授权的备用重拨 | +| AT-06 | 迟到接通/ARI断连 | 主备竞态通过对账收敛,不形成双通;不把“未收到事件”当成“未接通” | +| AT-07 | 多轮对话与打断 | 识别、生成、播音连续可用;打断停止旧播音/生成;延迟达到G0确认指标 | +| AT-08 | 文字重复、乱序和最终稿 | 同轮不重复堆叠;最终稿覆盖中间稿;取消内容标记正确;SaaS最终内容可核对 | +| AT-09 | 录音与OSS上传失败 | 先确认OSS上传成功,再经MQ回传OSS ID;SaaS可按OSS ID鉴权播放;失败不发ready并经MQ回传失败状态;临时文件受控清理 | +| AT-10 | SaaS/MQ中断与回传重放 | 所有业务结果经MQ回传,无HTTP回调旁路;音频不被回传阻塞;恢复后幂等补齐且无重复资产;积压达到上限有告警和保护 | +| AT-11 | 租户与凭证安全 | 非授权租户无法查询/补传/播放;凭证不出现在日志;失效上传授权被拒绝 | +| AT-12 | 多 Cell/EIP 容量、时段、退出与回滚 | 至少1000路已接通完整ASR/LLM/TTS;不超供应商并发/CPS、Cell媒体端口和最长通话;单 Cell/出口故障后仍满足N+1承接能力;发布回滚不丢待投递事件、不重新拨历史通话 | +| AT-13 | 大租户积压与公平调度 | A 大量积压后 B/C 新入队;B/C 有额度和可用资源时无需等 A 排空,按约定轮次/时延获得执行机会;记录到达、加入轮转和真实发起时间。预取、已 ACK 待发起及重启恢复仍公平;A 无可用线路时不阻塞 B | +| AT-14 | 跨 Cell/多调度实例租户配额 | 竞争发起、FALLBACK、所有权切换和进程重启均不重复占额/拨号、不超租户总并发/CPS;状态不明占用不因租约过期直接释放;资源满时不强制挂断,若有保底 SLA 则独立验收 | +| AT-15 | 租户队列背压、路由与生命周期 | A 发布洪峰/满队列被明确背压、SaaS 保留待发布记录;confirm 不确定用原 ID 重试不丢旧消息/不双拨;约定负载范围内 B 仍可发布调度;租户路由错配拒绝、创建/停用/恢复不误删积压,重试/DLQ 不绕过原租户配额 | + +G4 前必须将“约定指标”填写为明确数值,包括目标并发/CPS、响应和打断延迟的测量起止点及分位值、回传完成时限、最长可恢复中断、磁盘水位和失败重试边界。多租户专项还须在 G0 冻结租户/队列数量、发布洪峰、轮转份额、等待时间起止点/分位值、资源可用前提、配额和背压阈值;区分资源耗尽等待与调度饥饿,不无条件承诺固定开始时限。未经测试,不宣称达到生产高可用或特定并发能力。 + +## 9. 发布、交付与运行责任 + +### 9.1 交付清单 + +1. 本人制定并发布的 OpenAPI v1、MQ 拓扑/消息/事件 Schema、OSS ID 回传规范、示例、错误码和对接验证记录。 +2. 呼出应用代码/构建产物、配置模板及版本说明;不随交付包提供明文生产密钥。 +3. Asterisk/SIP接入参数说明、主备切换策略及失败码映射。 +4. 测试/回放工具、AT-01~AT-15验收记录、容量与延迟测试结果(含多租户公平、背压及配额恢复)。 +5. 部署、数据库变更、升级、回滚、故障排查、死信重放和资产补传操作说明。 +6. 监控清单:活动通话、发起速率、失败/FALLBACK、AI延迟、按租户命令积压/等待/额度/背压、broker 队列及水位、回传积压、录音失败、磁盘和资源残留。 + +### 9.2 发布步骤 + +- 部署测试环境,验证配置/权限/网络及数据备份;数据库改动与旧版本兼容。 +- 先小流量、低并发灰度,观察主备尝试、对话体验、文字/录音和回传积压。 +- 异常时先停止接新指令,对在途通话按确认策略排空或处置,保留执行/投递记录后回滚。 +- 只有验收和恢复演练通过后才扩大流量,不把生产流量当作媒体链路的首次验证。 +- 上线后明确SaaS、呼出应用、SIP、AI和运维各自的故障联系人;业务页面问题与媒体线路问题分别定位。 + +## 10. 范围变更规则 + +一期以“指令有应答、真实外呼可控、单线路可启动且合法切换不重复拨号、AI可对话、文字录音能回SaaS并恢复”为交付闭环。独立备用未提供时记录真实 FALLBACK 验证为待验,不宣称已具备线路容灾。 + +新增计费、RAG、复杂路由、第二种回传通道、多供应商通用适配或集群容灾时,另建变更项,写明工作量与对本期门禁的影响,不默认混入本计划。SaaS API、SIP参数、媒体组件或本人可投入时间变化时,更新本开发计划的版本并重新确认受影响的排期。 diff --git a/docs/交互流程图_规划态.md b/docs/交互流程图_规划态.md new file mode 100644 index 0000000..46b0b9d --- /dev/null +++ b/docs/交互流程图_规划态.md @@ -0,0 +1,134 @@ +# 交互流程图(规划态) + +**版本:** v0.1 +**依据:** [一期计划 v1.3](一期呼出应用开发计划_v1.0.md)、[OpenAPI 与 MQ 契约规划 v0.3](SaaS交互_OpenAPI与MQ契约规划_v0.1.md)。 +**状态:** 目标交互,尚未完整实现;具体字段、配额、等待窗口及 AI 协议待 G0 冻结。当前仅有 ASR 验证基础,LLM/TTS 未启用。本图不新增接口或变更契约。 + +```mermaid +flowchart TB + subgraph SaaS["SaaS:业务授权与发布"] + START["任务、号码、租户授权与业务检查"] + PUB["持久化发布记录
command_id + execution_id"] + BACK["满队列拒绝/不可路由/confirm 不确定
保留原 ID,有限退避与对账"] + START --> PUB + end + + subgraph COMMANDS["RabbitMQ:唯一外呼执行入口"] + EX["call.execute
按可信 tenant_id 映射路由"] + Q["各租户独立命令队列
有界积压,不丢队头旧命令"] + EX --> Q + end + PUB --> EX + EX -. "发布受阻或结果不确定" .-> BACK + BACK -. "原租户、原 ID 重试" .-> PUB + + subgraph OUTBOUND["呼出应用:接收、控制与公平准入"] + READ["按租户有界轮转
校验 Schema、身份及正文/队列租户一致"] + VALID{"可信且合法?"} + DEAD["非法/不可信消息隔离告警
不得按伪造租户执行或回传"] + IDEM{"command_id / execution_id
是否已有记录?"} + ORIGINAL["同语义关联原结果;冲突拒绝
不重新拨号"] + CHECK{"新执行授权、时效、版本
及配置是否有效?"} + REJECT["持久化 rejected + outbox
首次意图前拒绝:call_id 为空"] + ACCEPT["事务持久化命令、去重及 accepted outbox
完成后 ACK;此时尚未拨号"] + ADMIT{"控制/期限仍有效
且完整资源准入成功?"} + WAIT["waiting + 原因 + 准入截止
call_id 为空;按 command_id 查询"] + WAKE{"到期或被控制阻止?
到期有界唤醒,不等待资源释放"} + INTENT["固定 trunk + Cell + 出口,持久化拨号意图
首次建 call_id;每次尝试建 attempt_id"] + FENCE{"执行器真实发起前
再次检查控制、期限及租约"} + READ --> VALID + VALID -- "否" --> DEAD + VALID -- "是" --> IDEM + IDEM -- "是" --> ORIGINAL + IDEM -- "否" --> CHECK + CHECK -- "否" --> REJECT + CHECK -- "是" --> ACCEPT + ACCEPT --> ADMIT + ADMIT -- "是" --> INTENT + ADMIT -- "否" --> WAIT + WAIT --> WAKE + WAKE -- "是" --> REJECT + WAKE -- "否:继续公平轮转" --> ADMIT + INTENT --> FENCE + end + Q --> READ + + subgraph VOICE["固定语音 Cell:电话与实时 AI"] + DIAL["本地执行器 → ARI / Asterisk
经本 Cell 固定 EIP 向授权 SIP 线路发起"] + OBS{"通道事实/呼叫结果"} + RECON["reconciling:先对账
不盲目重拨,不释放未知占用"] + FALL{"明确未接通且旧通道已结束
允许故障、有同 Cell/出口的授权备用?"} + LEASE{"FALLBACK:重新检查控制、期限
租户 CPS 与完整资源许可"} + AI["接通后的目标链路
媒体 ↔ ASR → LLM → TTS → 媒体
流式对话、打断与取消;LLM/TTS 待新规范"] + END["确认通道结束,清理资源
持久化 call.finished;资产可仍为 pending"] + DIAL --> OBS + OBS -- "状态不明" --> RECON + RECON -- "取得可靠证据后收敛" --> OBS + OBS -- "已接通" --> AI + OBS -- "明确未接通" --> FALL + FALL -- "是" --> LEASE + LEASE -- "许可有效;同 call_id,新 attempt_id" --> INTENT + LEASE -- "否:不盲目重试" --> END + FALL -- "否:无备用不虚构" --> END + AI -- "挂断并确认" --> END + end + FENCE -- "通过" --> DIAL + FENCE -- "未通过且确认尚未发出:失败/取消收尾" --> END + FENCE -- "是否已发出不明" --> RECON + + subgraph ASSET["异步录音交接:不阻塞实时音频或通话终态"] + FILE["封口录音文件,计算元数据与校验值"] + AUTH["呼出资产处理器 → SaaS HTTP
申请绑定租户/通话的上传授权"] + OSS["呼出资产处理器 → OSS
使用受控签名上传文件"] + COMPLETE["呼出资产处理器 → SaaS HTTP complete
SaaS 实际校验 OSS 对象"] + VERIFIED{"校验成功并取得稳定 oss_id?"} + READY["verified + recording.ready outbox
同事务持久化,事件含 oss_id"] + FAILED["recording.failed + outbox
按契约有限恢复;未验证不发 ready"] + FILE --> AUTH --> OSS --> COMPLETE --> VERIFIED + VERIFIED -- "是" --> READY + VERIFIED -- "否" --> FAILED + end + END -. "存在待交接录音时" .-> FILE + + subgraph RESULTS["所有业务结果:持久化事件 → MQ → SaaS"] + OUTBOX["执行事实与 outbox 同事务
投递器:confirm + mandatory,有限重试"] + EVENTS["RabbitMQ 事件 Exchange → SaaS 事件队列
本轮不按租户拆分事件队列"] + INBOX["SaaS:tenant_id + event_id 去重
业务更新与 inbox 同事务后 ACK
按版本合并,关联 oss_id 并授权展示"] + OUTBOX --> EVENTS --> INBOX + end + REJECT --> OUTBOX + ACCEPT -. "command.result" .-> OUTBOX + WAIT -. "状态/原因变化" .-> OUTBOX + INTENT -. "executing 不等于实际拨号" .-> OUTBOX + OBS -. "call.status" .-> OUTBOX + RECON -. "待对账状态" .-> OUTBOX + AI -. "transcript.updated 等文字事件" .-> OUTBOX + END --> OUTBOX + READY --> OUTBOX + FAILED --> OUTBOX + + CONTROL["SaaS → 呼出 HTTP:暂停/恢复/停止
202 仅受理;跨 Cell 屏障确认后才 applied"] + QUERY["SaaS → 呼出 HTTP:命令/通话查询
仅对账,不替代 MQ 业务结果"] + REPLAY["SaaS → 呼出 HTTP:历史事件补传
固定范围、原 event_id;不拨号/不调用 AI"] + CONTROL -. "禁止新许可,处理在途许可" .-> ADMIT + CONTROL -. "真实发起前校验" .-> FENCE + CONTROL -. "生效结果经 MQ" .-> OUTBOX + QUERY -. "读取持久事实与版本快照" .-> OUTBOUND + REPLAY -. "重发原持久事件" .-> OUTBOX + + classDef planned fill:#eef4ff,stroke:#4263a6,color:#172a46; + classDef pending fill:#fff4dc,stroke:#b7791f,color:#573b13; + classDef risk fill:#fff0ef,stroke:#b44c45,color:#632822; + classDef data fill:#eaf7f1,stroke:#2d8063,color:#164b39; + class START,PUB,READ,ACCEPT,INTENT,DIAL,CONTROL,QUERY,REPLAY planned; + class WAIT,AI pending; + class DEAD,REJECT,RECON,FAILED,BACK risk; + class OUTBOX,EVENTS,INBOX,OSS,READY data; +``` + +## 阅读边界 + +- 完整资源许可同时覆盖跨 Cell 的租户并发/CPS、供应商配额、Cell 媒体端口/节点容量、出口健康与 ASR/LLM/TTS 配额;每次 FALLBACK 也消耗 CPS。初次准入截止为 `min(not_after, accepted_at + 服务端窗口)`,重投/重启不延长;它不强制挂断已发起电话。 +- `accepted`、broker confirm、消费者 ACK、`executing`、实际拨号、接通及 SaaS 入库是不同事实。可信业务拒绝可回传;非法消息先隔离。重复命令关联既有事实,不创建第二通电话。 +- 暂停/停止覆盖队列积压、持久等待和多 Cell 在途许可;状态不明不宣称 applied。resume 不复活旧版本。公平不挂断已接通电话;stop 的 drain/hangup 按明确授权处理。 +- 数据补传只重发原事件;录音恢复独立处理。文字/录音失败不改写通话终态。新业务外呼由 SaaS 完成对账及授权后决定,不由消费者自动换 ID。 diff --git a/docs/交付文档/一期中间调度件与Asterisk_v1.0.zip b/docs/交付文档/一期中间调度件与Asterisk_v1.0.zip new file mode 100644 index 0000000000000000000000000000000000000000..9bd706998e1c96f2848e2ad31a3617d340f14997 GIT binary patch literal 67392 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

|-(}0l}@eNz`Hr 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�>P&rn$4GdeEAGwDG zAaS4GyfCnG_Qh<-Pp=T8)eOtPehpAyoF%nGre| zTnfKHcFq3elp>9f9`XPbB!xoDO4_ZN9k?tzLCYAT$}zTqw9_PFbl119u!%!mZ%ptp z3=&X%oWW=5qrSF4awH#i*5ruXXzh-As1?0nd^iqoak%I_r3*`JP}0eNh5zTj@mi7Q zOM4D!JK+AvEZDiI8-r~AB7-L%fJ#9u7@=p^^wJ7#&KRKyUl%r|+zvt}yT`P(P*msX zv>Rbo>vvC@D19j6y!#`IjJMZ~jae(Wjn%H%p2_V_d!o#+=TRU}$$~V24ukT#^kSD+ zMHfB9)np!Ty~idt-)Lpd7lS9C#N8wBWquSfEqGn)0juXv$fX4|>$V#}9 z;H;;&+Ii0+zgDiQpUpmVvpU^cSJu?Nc)p!?VspWZX)(UJC$(d?>`GHv&*ceR?6~CY zaYr@hhZ|ScNOy1K5wcjo`+Dl`h|R~^?4qV#x#H!vV28x{jKh0ZYn@y4`dh^PgHfWH zE;7Dy1_$r#;%Z)hJn=-+%DTx7*VfHpFI)0L@>ow=QM=w&tQLeGfE`YvY=!C+z;^wd&FNG}Fz+h9Tbz42s$QZF=j?*!%8hdiD9eGoNqfsOMNwE%vdz z@b~(vZ{7?3Oj-GJEx*K#Nc$)8-XHT53@3v>eY?o?)_1{`mgtx@1O8T ze?NWG_k5Pm=qCS9f6C{l5^=}G_Pb75`qz8O$08Pe^UnJPo6gkVH;VJB*lF;8+6Udw z_orp1T4v0Mzs`6*{>bypE3^Kt{%#-O&B!FeEW*IR!NFj#QzKUK`Yz_jDhv#7{23U0 z7!Y7fBZ&QEN5iu@^PlWk`*Ql07aN+N?ppR__qHcH`W%Z(Qj0Q+v*XJQ^$he44C67C z_y#_mJ@3h$1uxd^d$DezUTzAq&C)=dleT3%tCDA6uysVY*;kcln~maOPI=k9;`!c9 zK(_^Z20UHA^I6~0XKR)tRTpe9}UC|8R z4K#e?UzJa<7cel~UBbW+i(+_jGO>nZjcc^vecImz@g_Lp^-}VaD+0V(*+4e30%0H% L1H(-gMj#IWuy7tr literal 0 HcmV?d00001 diff --git a/docs/交付文档/一期中间调度件与Asterisk_v1.0/01_中间调度件与MQ回传设计.md b/docs/交付文档/一期中间调度件与Asterisk_v1.0/01_中间调度件与MQ回传设计.md new file mode 100644 index 0000000..66c6fe2 --- /dev/null +++ b/docs/交付文档/一期中间调度件与Asterisk_v1.0/01_中间调度件与MQ回传设计.md @@ -0,0 +1,276 @@ +# 第一部分:中间调度件与 MQ 回传设计 + +**版本:** v1.0;双向MQ交互方式已确认,详细契约及真实环境参数待 G0 对接评审。 +**用户确认:** RabbitMQ 下发执行指令、RabbitMQ 回传业务事件;HTTP 仅用于控制、查询、录音上传授权及完成确认。 +**范围:** 一期纯外呼、不计费、复用现有 SaaS。本文替代旧计划中的“HTTP 业务回调”草案,不修改原 Excel。 +**交付性质:** 本次交付设计和操作/验收文档,不代表中间件代码已实现,也不代表已部署到任何服务器。 + +## 1. 组件边界与最小拓扑 + +```text +SaaS:任务/号码/配置/业务调度/权限/展示/长期存储 + │ 发布 call.execute ▲ 接收 command.result / call.* / transcript.* / recording.ready + ▼ │ +RabbitMQ:command exchange event exchange → SaaS消费队列 + │ ▲ + ▼ │ +中间调度件:指令持久化 → 准入/控制 → 呼叫执行 → 数据落地/outbox → 事件投递 + │ REST + 每节点一个长期ARI WebSocket │ HTTP上传授权/上传完成/接收结果查询 + ├── Asterisk A ── 主/备用 SIP接入 └── SaaS API及授权对象存储 + └── Asterisk B ── 主/备用 SIP接入 + │ externalMedia RTP(不经过RabbitMQ) + └── 媒体/AI组件:VAD → ASR → LLM → TTS,支持取消与打断 +``` + +- SaaS 决定何时、向谁发起,以及业务层“再次拨打”的政策;中间件不复制客户管理和任务编排。 +- 中间件负责执行级准入、并发/CPS、暂停屏障、Asterisk 节点选择、SIP 尝试、执行事实、文字/录音回传及补偿。 +- Asterisk 节点无共享通道状态;双节点不是存量通话无损接管。故障节点上的已接通通话不得自动在另一节点重拨。 +- 一期采用一个活动中间件实例管理多个 Asterisk 节点,持久化后支持重启恢复。一个节点的 ARI 应用只允许一个控制者;不承诺活动中间件自动高可用。未来多实例必须按节点明确归属,不能竞争控制同一通道。 +- 每个节点维持长期 ARI 事件连接;REST 请求和事件统一进入执行状态机。不可照搬 Mock 的“每通电话各建相同 app 的连接并丢弃事件”方式。 +- 不新增 Redis、工作流引擎或独立服务拆分作为前置依赖。复用可用关系数据库存放执行与投递状态;媒体组件可以独立运行,但数据回传不能进入其音频实时线程。 + +## 2. 数据归属与最小持久化模型 + +| 数据 | 所有者与关键字段 | 约束 | +| --- | --- | --- | +| 任务、号码、智能体快照 | SaaS;task_id、task_item_id、agent_version_id、variables、task_revision | SaaS 保持业务事实;快照不可在执行中悄悄替换 | +| command_inbox | 中间件;tenant_id、command_id、execution_id、request_hash、payload、accepted_at、status | 同租户 command_id 唯一;同键不同内容拒绝,不覆盖原命令 | +| task_control | 中间件;tenant_id、task_id、revision、desired_state、effective_state | 控制版本单调递增;停止屏障不能被迟到的旧指令解除 | +| call_execution | 中间件;tenant_id、call_id、execution_id、task_item_id、状态版本、时间、终态、原因 | 同租户execution_id唯一代表一次授权执行;同租户同一任务项不得同时存在两次活动业务执行 | +| call_attempt | 中间件;attempt_id、call_id、node_id、trunk_id、channel_id、bridge_id、external_channel_id、发起意图和清理状态 | 调用 ARI 前落地关联标识;同一 execution 只允许一个活动尝试 | +| call_artifact | 中间件;call_id、文字轮次/版本、录音位置/校验/状态、保留期限 | 电话结束与资产处理分离;本地暂存不替代 SaaS 长期存储 | +| event_outbox | 中间件;event_id、payload、聚合版本、发布次数、下次重试、published/applied状态 | 业务事实与事件同事务提交;broker confirm 不等于 SaaS 已落库 | +| event_inbox | SaaS;tenant_id、event_id、payload_hash、applied_at、处理结果 | 去重与业务落库同事务;业务提交后才 ACK;优先复用 SaaS 现有机制 | + +一期单实例可以在同一进程内实现接收、执行、投递、对账和清理任务,但各自失败不能阻塞媒体。状态更新仍需事务及版本条件,不能仅靠内存字典防重复。 + +## 3. RabbitMQ 拓扑与可靠性 + +以下名称为规范草案,部署时按 SaaS 命名规则映射;业务 Schema 和语义保持一致。 + +| 对象 | 建议命名/绑定 | 用途 | +| --- | --- | --- | +| 命令交换机 | ai.outbound.command.v1,topic、durable | SaaS 发布执行命令 | +| 命令队列 | ai.outbound.execute.v1,绑定 call.execute | 中间件消费;队列满时拒绝发布/暂停生产,不静默丢弃 | +| 事件交换机 | ai.outbound.event.v1,topic、durable | 中间件回传业务事件 | +| SaaS事件队列 | saas.ai.outbound.event.v1,绑定本节规定的事件类型 | SaaS 幂等入库及触发展示 | +| 死信交换机/队列 | 复用 SaaS 标准 DLX,命令与事件分别隔离 | 超出重试预算、非法消息和不可恢复异常 | + +必须落实: + +1. 两侧生产者均启用 persistent 消息、Publisher Confirm 和 mandatory/不可路由检查;收到 confirm 但发生 basic.return 仍视为投递失败。 +2. durable 队列不等于集群高可用。若现有 RabbitMQ 支持经验证的 quorum 队列可复用;不得在未知版本/策略下直接强制变更现有队列类型。 +3. 中间件在命令及去重记录持久化后 ACK,不把整个电话挂在未 ACK 消息上;SaaS 在业务应用事件成功后 ACK。 +4. 中间件已受理命令由持久化执行记录恢复。ACK 后进程崩溃不依赖重新收到同一条消息才能继续。 +5. 基础 prefetch 从小值开始,配合数据库待执行数量上限。执行容量不足时降低/暂停拉取或给出明确拒绝结果,不能无界吸收任务。 +6. 执行准入同时受租户、节点、线路的并发/CPS和任务控制状态限制。号码/DNC/时段等业务风控由 SaaS 统一决策,延迟执行和补投前重新校验有效性。 +7. 基础设施暂时失败走有限退避;业务忙线、拒接不是 MQ 异常,不通过 nack/requeue 反复重拨。已有 SaaS 重试/DLQ 机制优先复用,不同时叠加两套无限重试。 +8. 关键最终事件不能靠短 TTL 自动淘汰。published 事件保留至 SaaS 应用确认或经授权的保留期处理;删除策略和最长可恢复中断在 G0 明确。 +9. 人工重放分为“命令恢复”和“数据补传”。命令恢复仍检查 execution_id、有效期、已接通事实和停止屏障;数据补传永不发起电话。 + +## 4. 命令、事件与应答契约 + +### 4.1 标识与公共规则 + +- command_id:一次指令;消息重投必须相同。execution_id:一次授权业务外呼;SaaS 决定再次外呼时才新建。 +- call_id:一次业务外呼的聚合标识。attempt_id:一次 Asterisk/SIP 尝试;FALLBACK 新建 attempt,但不新建业务 execution。 +- event_id:事件唯一标识;重发保持原值和内容。task_revision:任务控制版本。state_version:通话状态版本。 +- 所有时间戳为 RFC3339 UTC;字段名含 `_ms` 的持续时间以毫秒计。号码、原始错误、录音引用均视为租户敏感数据。 +- 每类消息单独定义必填字段。尚未产生通话时,不要求 command 带 call_id/attempt_id。 +- tenant_id 必须与凭证、消息来源及任务归属校验,不仅相信 payload。只接受号码/允许的线路引用,不接受任意 ARI URL、原始 dial string、任意 externalMedia 地址或凭证。 +- 下列 JSON 使用测试占位符;时间、号码和配置需由测试生成器替换,不得原样发送至生产。 + +### 4.2 call.execute + +```json +{ + "schema_version": "1.0", + "command_id": "cmd_demo_001", + "execution_id": "exec_demo_001", + "tenant_id": "tenant_test", + "trace_id": "trace_demo_001", + "issued_at": "2026-09-08T01:00:00Z", + "not_after": "2026-09-08T01:05:00Z", + "task_id": "task_demo", + "task_item_id": "item_demo", + "task_revision": 7, + "payload": { + "destination": "${AUTHORIZED_TEST_NUMBER}", + "agent_version_id": "agent_v1", + "agent_snapshot": {"prompt_version": "prompt_v1", "variables": {}}, + "line_group_id": "line_group_test", + "ring_timeout_ms": 30000, + "max_call_duration_ms": 180000, + "fallback_policy_id": "primary_backup_v1" + } +} +``` + +快照须包含执行所需数据;若采用引用,SaaS 必须提供鉴权读取接口及一致的版本校验,不默认“只有ID就能运行”。同幂等键不同 request_hash 返回 IDEMPOTENCY_CONFLICT。过期/停止/越权/无可用线路返回明确拒绝结果,MQ ACK 不应被展示为“已呼叫”。 + +### 4.3 事件模型 + +公共外壳包括 event_id、event_type、schema_version、tenant_id、trace_id、occurred_at 和 payload;业务关联ID按事件类型携带。 + +| Routing key / event_type | 必需业务字段 | SaaS 更新规则 | +| --- | --- | --- | +| command.result | command_id、execution_id或控制对象、result、reason、effective_revision | result=ACCEPTED/REJECTED/APPLIED/FAILED;ACCEPTED不等于执行完成 | +| call.status | call_id、attempt_id、state_version、state、node_id、trunk_id、时间与原因 | 版本不回退;attempt结果不直接覆盖已接通的业务终态 | +| transcript.partial | call_id、turn_id、role、revision、text、is_final=false | 可合并/限流;中间稿不是最终业务事实 | +| transcript.final | call_id、turn_id、role、revision、text、起止时间、播放/取消标记 | 同轮按版本幂等更新;必须持久和可补传 | +| recording.ready | call_id、recording_id、object_ref、格式/声道/采样率/时长/大小/checksum | 只传上传确认后的受控引用,不传二进制和长期公开URL | +| call.finished | call_id、state_version、final_state、cause、时长、attempt_count、资产处理状态 | 通话终态立即可见;录音/分析可随后完成 | + +```json +{ + "schema_version": "1.0", + "event_id": "evt_demo_status_2", + "event_type": "call.status", + "tenant_id": "tenant_test", + "trace_id": "trace_demo_001", + "occurred_at": "2026-09-08T01:00:06Z", + "command_id": "cmd_demo_001", + "execution_id": "exec_demo_001", + "task_id": "task_demo", + "task_item_id": "item_demo", + "call_id": "call_demo", + "attempt_id": "attempt_demo_1", + "payload": { + "state": "ANSWERED", + "state_version": 2, + "node_id": "ast-a", + "trunk_id": "sip-primary", + "answered_at": "2026-09-08T01:00:06Z" + } +} +``` + +```json +{ + "schema_version": "1.0", + "event_id": "evt_demo_text_1", + "event_type": "transcript.final", + "tenant_id": "tenant_test", + "trace_id": "trace_demo_001", + "occurred_at": "2026-09-08T01:00:10Z", + "call_id": "call_demo", + "payload": { + "turn_id": "turn_1", + "role": "customer", + "revision": 2, + "text": "这是授权测试。", + "is_final": true, + "start_offset_ms": 500, + "end_offset_ms": 1800, + "playback_status": "not_applicable" + } +} +``` + +AI 文字另标记 generated/sent/playback_confirmed/cancelled。播放器确认不等于能证明客户实际听到了声音;被打断而未播出的内容不能全部作为“已说出”展示。 + +### 4.4 错误与恢复语义 + +统一原因至少包含:INVALID_COMMAND、IDEMPOTENCY_CONFLICT、TENANT_FORBIDDEN、TASK_STOPPED、COMMAND_EXPIRED、CAPACITY_EXCEEDED、NO_ROUTE、SIP_UNAVAILABLE、BUSY、REJECTED、NO_ANSWER、INVALID_NUMBER、AI_ERROR、MEDIA_ERROR、CONTROL_UNCERTAIN、UPLOAD_FAILED。保留原始 SIP 状态/Q.850/Asterisk 原因用于排障,映射由真实线路验证。 + +明确拒绝的执行不进入拨号;容量等待/拒绝政策由 SaaS 与中间件统一,不能两边各自重试。CONTROL_UNCERTAIN 表示需对账,不等价于可重拨失败。 + +## 5. HTTP 边界与接口清单 + +| 方向/方法 | 接口草案 | 请求/响应要点 | +| --- | --- | --- | +| SaaS→中间件 POST | /internal/v1/tasks/{task_id}/controls | command_id、expected_revision、action=PAUSE/RESUME/STOP;force_hangup默认false且另行授权;202返回已受理 | +| SaaS→中间件 GET | /internal/v1/commands/{command_id} | 查询ACCEPTED/APPLIED/REJECTED/FAILED与实际控制版本 | +| SaaS→中间件 GET | /internal/v1/calls/{call_id} | 通话/尝试、state_version、资产和投递状态;不改状态 | +| SaaS→中间件 POST | /internal/v1/calls/{call_id}/events/replay | 仅补传已有事件,保持event_id;鉴权、审计、限流 | +| 中间件→SaaS GET | /internal/v1/outbound/executions/{execution_id}/eligibility | 返回allowed、reason、current_task_revision、valid_until;每次发起前查询当前时段/退订/授权许可,不返回凭证 | +| 中间件→SaaS POST | /internal/v1/recording-uploads | call_id、格式、大小、checksum;返回upload_id、授权上传地址、过期时间及允许参数 | +| 中间件→SaaS POST | /internal/v1/recording-uploads/{upload_id}/complete | 幂等确认文件/校验;返回recording_id和object_ref | +| 中间件→SaaS POST | /internal/v1/outbound/receipts/query | 查询最多100个event_id的APPLIED/NOT_FOUND/FAILED结果;仅用于低频对账,不是业务回调 | + +控制请求经过与命令相同的持久化/幂等机制。200/202不代表暂停已经生效;必须查询或消费 command.result(APPLIED)。非法参数400、无权限401/403、状态/版本冲突409、限流429;重复同内容请求返回原结果。 + +首次发起、延迟执行及FALLBACK之前查询当前业务许可,结合本地控制屏障再次校验;不得把命令发布时的授权永久缓存。许可查询不可用时不新拨号,进入有期限的等待/拒绝并告警;不会因此中断正在进行的媒体。授权变化与暂停生效的时间边界在G0确认。 + +鉴权沿用已批准的 SaaS 服务认证并限定租户权限;跨主机HTTPS,敏感操作审计。API路径及认证细节需对接签字后生成正式OpenAPI文件,不将示例路径当成双方已部署接口。 + +## 6. 状态机、控制与FALLBACK + +### 6.1 执行状态 + +- ACCEPTED → QUEUED → DIALING → ANSWERED → TALKING → ENDED。 +- DIALING允许直接ANSWERED;RINGING是可选观测状态,不要求每次都有振铃事件。 +- 接通前可结束为FAILED、CANCELLED、EXPIRED;已接通后以ENDED及原因结束,不退回QUEUED。 +- 控制连接断开且事实无法确定时进入RECONCILING。恢复时查询原node/channel,不能因本地没有成功回执就重拨。 +- 文字/录音状态独立使用PENDING/PROCESSING/READY/FAILED;事件状态独立使用PENDING/PUBLISHED/APPLIED。资产失败不阻止电话终态落地。 + +### 6.2 控制屏障 + +PAUSE先阻止SaaS新调度,中间件再建立版本屏障,处理完在途发起许可后确认APPLIED。STOP为终止性控制,旧revision或死信不得恢复任务。已接通通话默认排空;强制挂断需要独立授权和审计。许可检查、发起意图与控制版本关联,避免“先检查暂停再被停止但仍拨出”的竞态。 + +### 6.3 两种故障不得混淆 + +1. **节点选择失败:** 尚未提交originate时,健康/容量不合格的Asterisk节点可以换选。 +2. **已提交拨号:** 超时不代表失败。先用持久化的channel_id核实原尝试;事实不明不得换节点重拨。 +3. **SIP主备切换:** 仅在明确未接通、旧通道已结束、失败码属于允许线路故障、尚在有效期且预算允许时执行。默认最多主/备两次尝试,节点与线路切换共用总预算,不能组合放大。 +4. BUSY、REJECTED、INVALID_NUMBER、DNC拦截不切备用;NO_ANSWER由SaaS业务重试政策处理。已接通后禁止FALLBACK新拨号。 +5. AI/本地媒体故障不通过换SIP解决。两条SIP接入同属一个故障域时,主备不构成独立容灾。 +6. 故障节点已接通电话可能中断,记录原因并通知SaaS;一期不提供通话热迁移。新增呼叫转向健康节点需重新校验容量。 + +## 7. ARI、媒体、文字和录音生命周期 + +1. 建立节点长期ARI事件连接并确认应用注册;创建call/attempt、确定固定的PJSIP通道、桥和externalMedia通道标识并持久化发起意图。 +2. 创建桥和externalMedia会话,为每通电话分配独立媒体端口/关联;发起PJSIP呼叫并消费StasisStart、ChannelStateChange、ChannelDestroyed等事件,按实际状态推进。 +3. 接通后将目标通道加入桥;音频格式按SIP协商、RTP payload、采样率和AI接口要求转换,验证ASR不会把TTS回声当作客户输入。 +4. RTP音频直接进入媒体组件。VAD/ASR/LLM/TTS及打断需要独立实现或可靠组件,Mock音调发送/包统计不是AI链路。 +5. 关键文字最终稿异步持久化、写outbox并发布;中间稿可限流合并,最终稿和状态事件不可被慢消费者无限阻塞。 +6. 接通后可通过ARI的桥录音能力启动混音录音,名称包含受控call/attempt标识;本期默认单轨混音,双声道需另行验证,不把桥录音直接称为双声道。 +7. 挂断时停止/确认录音完成,等待录音文件封装完成后读取/上传。优先通过ARI stored recording接口获取,或由同节点受控进程读取持久卷,不把同一路径误当成跨主机共享文件。 +8. SaaS上传授权→文件上传→完成确认/校验→写recording.ready到outbox→MQ发布→SaaS消费入库和页面播放。 +9. 清理通道、桥、媒体会话;清理失败由补偿任务按记录核实处理。不得使用“清空所有通道”替代按call_id清理。 + +录音元数据:recording_id、call_id、attempt_id、format、channels、sample_rate_hz、duration_ms、size_bytes、checksum_sha256、object_ref、created_at。上传确认前不发ready。临时文件设置容量、水位和保留期限;未确认入库的文件不能在普通成功清理中删除,超期处置须告警和授权。 + +### 7.1 recording.ready 示例 + +```json +{ + "schema_version": "1.0", + "event_id": "evt_demo_recording_1", + "event_type": "recording.ready", + "tenant_id": "tenant_test", + "trace_id": "trace_demo_001", + "occurred_at": "2026-09-08T01:03:10Z", + "call_id": "call_demo", + "attempt_id": "attempt_demo_1", + "payload": { + "recording_id": "recording_demo_1", + "object_ref": "tenant_test/call_demo/recording_demo_1.wav", + "format": "wav", + "channels": 1, + "sample_rate_hz": 8000, + "duration_ms": 15000, + "size_bytes": 240044, + "checksum_sha256": "${SHA256_OF_UPLOADED_FILE}", + "created_at": "2026-09-08T01:03:01Z" + } +} +``` + +上传授权/完成确认是HTTP;recording.ready业务通知是MQ。例中校验值和尺寸为占位/演示,必须以实际文件计算结果为准。 + +## 8. 恢复、可观测与开发顺序 + +恢复顺序:暂停新执行→读取未完成attempt→核实节点/通道→修正执行事实→恢复未投递/未应用关键事件→清理孤儿资源→健康检查通过后恢复接单。锁或租约过期不能证明Asterisk通道已结束。 + +监控至少包括命令积压/最老年龄、拒绝原因、活动通话/线路CPS、ARI连接、未决attempt、FALLBACK、音频丢包与AI延迟、outbox积压、SaaS落库延迟、录音失败、临时磁盘和清理失败。call_id贯通日志;手机号、密钥、签名URL脱敏。 + +开发顺序与门禁: + +1. G0:真实参数、Schema/控制语义、MQ拓扑和存储协议确认;本人主责,SaaS与运维认领。 +2. G1:inbox/outbox、命令接收/应答、控制和查询;重复消息与重启恢复通过。 +3. G2:长期ARI连接、主线路通话、节点选择和安全FALLBACK;迟到接通不产生双拨。 +4. G3:AI、最终文字、录音及MQ回传;SaaS入库展示和补传可验证。 +5. G4:第三部分全部阻断用例通过;部署与回滚演练完成。 + +本人负责中间件/ARI/回传核心实现;BgA对接SaaS任务快照和控制;BgB对接SaaS MQ生产消费、事件入库与资产接口;FeA负责展示和播放;部署负责人支持环境与监控。若本人兼任ArchA,合并人力日历,不重复计算。 diff --git a/docs/交付文档/一期中间调度件与Asterisk_v1.0/02_Asterisk部署与SIP对接步骤.md b/docs/交付文档/一期中间调度件与Asterisk_v1.0/02_Asterisk部署与SIP对接步骤.md new file mode 100644 index 0000000..285a86d --- /dev/null +++ b/docs/交付文档/一期中间调度件与Asterisk_v1.0/02_Asterisk部署与SIP对接步骤.md @@ -0,0 +1,257 @@ +# 第二部分:Asterisk 部署与指定 SIP 对接步骤 + +## 1. 参考基线与使用边界 + +参考仓库:`git@git.ipao.vip:rogee/sip-research.git`。 +已审阅提交:`6a8064e53bb7eadd73f03373524953e68330976c`。 +主要依据:`asterisk/README.md`、`asterisk/deployment.md`、`asterisk/deploy/docker-compose.yml`、`conf/{ari,http,pjsip,rtp}.conf`、`scripts/{call,health}.sh`、`mock/{mock-agent,mock-provider}.py`。 + +本次只静态检查参考实现,未连接仓库文档中的历史服务器,未停用其他语音系统,未执行任何远程部署。仓库历史测试记录不能作为本次环境的验收结果。 + +| 仓库已有内容 | 可以参考的部分 | 本期仍需补齐/纠正 | +| --- | --- | --- | +| 双Asterisk节点+Mock Provider | ARI与externalMedia的最小通话路径;节点由发起方选择 | 没有中间调度件、RabbitMQ、SaaS事件回传和执行持久化 | +| Asterisk镜像latest;历史记录22.10.1 | 容器部署结构 | latest不可复现;核实实际版本及安全状态后固定镜像digest | +| 8088/8089 HTTP映射 | 宿主机访问两节点ARI | 不能对公网无保护开放;Mock Compose没有真实SIP/RTP外网接入配置 | +| mock-agent | 创建桥、externalMedia、PJSIP通道、双向RTP和资源清理示例 | 不是生产事件状态机/AI组件;会话身份、并发、取消和恢复需重新实现 | +| mock-provider | SIP UAS应答及模拟音频 | 单RTP端口、按来源地址处理媒体等简化,不能证明真实多呼叫音频隔离 | +| health.sh | ARI、OPTIONS、通道查询思路 | 会跳过未启动节点;即使缺少必需节点也可能未增加fail,必须增加预期服务集合检查 | +| rtp.conf | 10000–10800端口段 | 约200路只是历史估算,不是实测容量保证;strictrtp=no须安全复核 | +| 无录音持久卷 | 无 | 补齐录音落盘、读取、上传、失败保留和清理 | + +不得复用示例ARI密码为生产凭据。不要复制仓库的历史root登录目标、停机命令或系统调优作为当前部署授权。特别是其大额UDP内存参数必须按实际主机重新评估,初次部署先保留操作系统默认值。 + +## 2. D0:环境与参数准备 + +### 2.1 环境要求 + +- 隔离的Mock测试主机;Linux、Docker Engine、Docker Compose插件、Git、Bash、curl、Python3可用。 +- 生产建议两个独立Linux主机分别部署Asterisk A/B,同一主机只运行一个host-network Asterisk实例。 +- 可用SaaS测试租户、RabbitMQ权限、主/备SIP接入、授权测试号码、AI接口、对象存储和中间件构建产物。 +- 未完成中间件开发时,只能执行Mock部署及底座验证,不得标记完成MQ回传或一期上线。 + +### 2.2 上线前必须填写的参数 + +| 参数组 | 必填内容 | +| --- | --- | +| 版本 | Git提交、Asterisk镜像digest/实际版本、Python测试镜像digest、中间件版本、配置版本 | +| 节点 | node_id、管理网IP、SIP监听地址/端口、RTP地址/端口段、故障域、并发/CPS限额 | +| SIP | 主/备用endpoint名称、地址/端口、注册或IP鉴权、主叫/被叫格式、编解码、源IP清单、失败码 | +| 媒体 | externalMedia可达地址、每通电话端口分配方式、RTP回程、采样率、AI流式接口与配额 | +| MQ/API | VHost/队列、账号ACL/TLS、控制/查询地址、SaaS上传和接收状态查询协议 | +| 存储 | 本地录音路径/权限/配额、上传允许域名、保留期限、磁盘水位、播放授权 | +| 运行 | 允许呼叫时段、紧急停止方式、告警联系人、验收指标和发布窗口 | + +全部凭据通过密钥管理或受控文件注入,不进入Git、MQ明文业务payload或工单日志。目录/文件权限需与容器实际UID核对,不能以chmod 777解决写入问题。 + +## 3. D1:复现仓库的隔离Mock环境 + +以下命令仅供操作人员在明确指定的测试主机执行;本次编写文档没有执行它们。所有步骤失败即停止,不自动清理现有容器。 + +### 3.1 固定源代码版本并复制部署目录 + +```bash +set -euo pipefail +export SRC_DIR="$HOME/sip-research-reference" +export MOCK_DIR="$HOME/asterisk-mock-validation" + +test ! -e "$SRC_DIR" +test ! -e "$MOCK_DIR" +git clone --no-checkout git@git.ipao.vip:rogee/sip-research.git "$SRC_DIR" +git -C "$SRC_DIR" checkout --detach 6a8064e53bb7eadd73f03373524953e68330976c +mkdir -p "$MOCK_DIR" +cp -a "$SRC_DIR/asterisk/deploy/." "$MOCK_DIR/" +git -C "$SRC_DIR" rev-parse HEAD +``` + +在副本中完成以下修改并保存差异: + +1. 将asterisk1/asterisk2的image固定到批准的同一digest;Compose和scripts/call.sh中使用的Python测试镜像也固定到同一批准digest。镜像实际Asterisk版本必须记录,不把历史22.10.1等同于当前镜像版本。 +2. 把ARI端口映射分别限制为`127.0.0.1:8088:8088`和`127.0.0.1:8089:8088`;SIP/媒体保持隔离Docker网络内。 +3. 保留Compose项目名`asterisk-ari`和网络名,仓库call.sh引用了`asterisk-ari_astari`。若改名必须同步脚本,不能只改Compose。 +4. `ast1`、`ast2`、`ast-mock-provider`名称冲突时改用另一测试环境;禁止删除不属于本次实验的同名容器。 +5. 测试凭据仅能用于这一隔离Mock环境;进入共享或生产环境前替换,并同步健康检查/客户端读取方式。 + +### 3.2 启动并核查必须存在的服务 + +```bash +set -euo pipefail +cd "${MOCK_DIR:?先执行3.1并设置MOCK_DIR}" +docker version +docker compose version +docker compose --profile scale config --services +# 完成上述镜像/端口检查后才执行: +docker compose --profile scale up -d +for name in ast1 ast2 ast-mock-provider; do + test "$(docker inspect -f '{{.State.Running}}' "$name")" = "true" +done +docker exec ast1 asterisk -rx 'core show version' +docker exec ast2 asterisk -rx 'core show version' +docker exec ast1 asterisk -rx 'pjsip show contacts' +docker exec ast2 asterisk -rx 'pjsip show contacts' +bash scripts/health.sh +``` + +通过条件:三容器均运行、两节点实际版本已登记、ARI鉴权查询成功、Mock contact可用。health.sh的`fail=0`只能作为辅助证据,不能替代上述必需服务检查。若实际SIP不支持OPTIONS,生产探活需改为经验证的方式,不据此误摘除线路。 + +### 3.3 顺序验证两节点通话 + +```bash +set -euo pipefail +cd "${MOCK_DIR:?先设置MOCK_DIR}" +mkdir -p evidence +# 1001只用于仓库mock-trunk,不得将此脚本直接指向真实线路。 +bash scripts/call.sh 1001 15 1 | tee evidence/mock-node1.log +bash scripts/call.sh 1001 15 2 | tee evidence/mock-node2.log +docker logs --since 10m ast-mock-provider > evidence/mock-provider.log 2>&1 +docker exec ast1 asterisk -rx 'core show channels concise' +docker exec ast2 asterisk -rx 'core show channels concise' +``` + +通过条件:两次均出现通话应答及`bidirectional=YES`,有双向RTP计数,挂断后本次通话资源清理。脚本即使打印`bidirectional=NO`也不一定返回非零,验收必须检查结果内容,不能仅看退出码。 + +Mock多实例、固定端口和媒体关联方式存在简化,顺序成功不证明并发隔离;并发、迟到应答、真实编解码和FALLBACK在后续专项验证。 + +## 4. D2:真实SIP部署差异 + +### 4.1 生产网络拓扑 + +推荐初版:A/B分别运行在独立Linux主机,Asterisk使用host network;中间件通过管理网访问ARI,媒体组件与节点双向可达。这样避免将仓库同一Docker私网中的音频可达性误认为真实外网可达性。 + +同机运行两个host-network节点会争用5060、8088和RTP端口,不允许直接照搬。若必须同机双节点,需另行设计完整端口/地址及NAT映射,不能只改变ARI端口。 + +| 流向 | 放通与限制 | +| --- | --- | +| 中间件→ARI | 管理网HTTPS/受控代理或批准的私网链路;仅允许控制者,禁止公开8088 | +| Asterisk↔指定SIP | 供应商约定SIP协议/端口及源IP;不能只假设UDP5060 | +| Asterisk↔供应商媒体 | 协商的RTP/RTCP范围及来源;NAT需正确宣告外部地址 | +| Asterisk↔媒体组件 | 为并发会话分配独立端口/关联,双向路由和防火墙明确 | +| 中间件↔MQ/数据库/SaaS/存储 | 按最小权限开放;MQ管理端不向业务公网暴露 | + +不要清空防火墙或覆盖所有sysctl。RTP端口预算需计入PJSIP、externalMedia和实际RTCP使用;不能仅根据端口数量承诺业务并发。 + +### 4.2 单节点Compose模板 + +这是**本期新增模板,不是参考仓库原有文件**。在当前节点的DEPLOY_DIR保存为docker-compose.yml,并准备conf目录中列出的配置文件、批准镜像及权限后再启动;不包含Mock Provider。 + +```yaml +name: ai-outbound-node +services: + asterisk: + image: ${ASTERISK_IMAGE:?必须提供批准的镜像digest} + network_mode: host + restart: unless-stopped + stop_grace_period: 60s + volumes: + - ./conf/http.conf:/etc/asterisk/http.conf:ro + - ./conf/ari.conf:/etc/asterisk/ari.conf:ro + - ./conf/pjsip.conf:/etc/asterisk/pjsip.conf:ro + - ./conf/rtp.conf:/etc/asterisk/rtp.conf:ro + - ./conf/extensions.conf:/etc/asterisk/extensions.conf:ro + - recordings:/var/spool/asterisk/recording + logging: + driver: json-file + options: + max-size: "10m" + max-file: "3" +volumes: + recordings: {} +``` + +启动前通过`core show settings`和镜像说明核对实际录音目录/运行UID;若路径不同,同步修改挂载和读取方式。A/B各有本地录音卷,不是共享存储。宿主机永久损坏可能导致尚未上传的录音丢失;若业务要求该场景零丢失,必须另配可恢复存储并验收,不能由双Asterisk节点自动保证。 + +### 4.3 必改配置清单 + +| 文件/配置 | 必须处理的内容 | +| --- | --- | +| http.conf | 启用ARI所需HTTP;同机访问可绑定回环,异机绑定管理网/受控代理;不复制0.0.0.0公网暴露 | +| ari.conf | 新建独立服务账户、强密钥、限制CORS及访问来源;运行凭据不复用仓库样例 | +| pjsip.conf transport | 按供应商UDP/TCP/TLS要求、监听地址/端口、local_net和外部信令/媒体地址配置 | +| pjsip.conf endpoint/AOR | 主、备用endpoint分别配置;endpoint_id与中间件trunk_id一一对应;明确主叫/号码格式、编解码、媒体路由 | +| SIP鉴权 | IP鉴权与注册/Digest鉴权分别配置;需要注册时补auth/registration,不能只修改contact | +| 线路探活 | OPTIONS或供应商认可的探活;容量、CPS、失败码和冷却策略不能仅靠Avail决定 | +| rtp.conf | 显式端口段、来源限制;strictrtp是否开启需真实线路/媒体验证,不默认长期关闭 | +| extensions.conf | 本期新增只拒绝非预期呼入的上下文;出站endpoint引用该受限context,不开放公共拨号入口 | +| 录音卷 | 节点独立持久卷、实际UID权限、配额/清理/上传期限;不能只写容器可写层 | + +本期只做外呼,无需为了该方案提前引入Kamailio、呼入路由或共享SIP注册体系。指定SIP的名称、注册信息和号码策略未提供前,不能生成已经可用于真实拨号的生产pjsip.conf。 + +## 5. D3:部署节点并核实ARI能力 + +以下在各自节点的部署目录执行,镜像变量应为`andrius/asterisk@sha256:...`或已批准的等价镜像,不接受latest。 + +```bash +set -euo pipefail +: "${DEPLOY_DIR:?设置当前节点的独立部署目录}" +: "${ASTERISK_IMAGE:?设置已批准的镜像digest}" +cd "$DEPLOY_DIR" +case "$ASTERISK_IMAGE" in *@sha256:*) ;; *) echo '必须固定镜像digest' >&2; exit 1;; esac +for f in http.conf ari.conf pjsip.conf rtp.conf extensions.conf; do + test -f "conf/$f" +done +docker compose config --services +docker compose pull asterisk +docker compose up -d asterisk +docker compose exec -T asterisk asterisk -rx 'core show version' +docker compose exec -T asterisk asterisk -rx 'core show settings' +docker compose exec -T asterisk asterisk -rx 'module show like res_ari' +docker compose exec -T asterisk asterisk -rx 'module show like chan_rtp' +docker compose exec -T asterisk asterisk -rx 'pjsip show endpoints' +docker compose exec -T asterisk asterisk -rx 'pjsip show contacts' +docker compose exec -T asterisk asterisk -rx 'pjsip show registrations' +``` + +`pjsip show registrations`仅对注册型接入要求成功;IP鉴权没有注册条目不算失败。核对bridges/channels/recordings等ARI资源、RTP通道及WAV格式支持,缺失时停止联调,不假定仓库挂载了modules.conf或自定义Dockerfile——它们在参考路径中不存在。 + +管理网接口检查使用权限为600的netrc/受控凭据文件,禁止把密码放在URL、命令历史或截图中: + +```bash +set -euo pipefail +: "${ARI_BASE:?例如批准的管理网HTTPS地址,不含/ari}" +: "${ARI_NETRC:?设置受控netrc文件路径}" +test -f "$ARI_NETRC" +curl --fail --silent --show-error --netrc-file "$ARI_NETRC" \ + "$ARI_BASE/ari/asterisk/info" +curl --fail --silent --show-error --netrc-file "$ARI_NETRC" \ + "$ARI_BASE/ari/channels" +curl --fail --silent --show-error --netrc-file "$ARI_NETRC" \ + "$ARI_BASE/ari/bridges" +``` + +中间件启动ARI事件连接后再核对应用注册。只有REST返回200而没有有效Stasis事件连接,不能认为应用可用。禁止用忽略证书验证的方式掩盖HTTPS配置错误。 + +## 6. D4:中间件与MQ部署顺序 + +参考仓库没有中间件镜像、启动命令、数据库迁移和RabbitMQ工具脚本,因此本节是**待开发服务的发布步骤**,不虚构仓库中不存在的可执行文件。 + +1. 发布第一部分约定的数据库结构/唯一约束和向后兼容迁移;备份执行/投递数据。 +2. SaaS负责人创建/确认命令、事件、重试/DLQ及ACL;核对发布confirm、不可路由检测、持久化和消费ACK。 +3. 配置节点表、ARI凭据引用、主备线路组、媒体地址池、租户授权、并发/CPS、有效期及磁盘阈值。 +4. 配置SaaS当前业务许可查询、上传授权/完成确认、接收状态查询接口及允许的存储域名;不配置HTTP业务回调地址。 +5. 先启动SaaS事件消费者,再启动中间件的查询/恢复/投递能力;消费执行命令暂不开启。 +6. 中间件核对未决attempt、存量通道和未投递事件,建立每节点唯一ARI控制连接;健康通过后开放低并发执行。 +7. 使用授权测试租户发布一条call.execute;核对command.result、call.status、transcript.final、call.finished、recording.ready到SaaS入库和页面的完整关联。 +8. 执行第三部分故障/恢复用例,全部阻断项通过后才进入灰度。客户端SDK/框架选择不改变这条契约和门禁。 + +## 7. D5:录音专项对接 + +按已部署镜像的ARI接口核验以下能力,不直接将接口存在视为录音可用: + +| 顺序 | ARI/存储动作 | 检查点 | +| --- | --- | --- | +| 1 | POST /ari/bridges/{bridgeId}/record | 受控name、format=wav;模块/目录有权限;返回成功并收到开始事件 | +| 2 | POST /ari/recordings/live/{recordingName}/stop | 通话结束时幂等处理;等待录音完成/文件封装,不读取仍在写的文件 | +| 3 | GET /ari/recordings/stored/{recordingName}/file | 获取可播放文件;名称URL编码;跨节点按原node_id读取 | +| 4 | SaaS上传授权→上传→complete | SHA-256、大小、通话归属通过;授权过期可重新申请 | +| 5 | MQ recording.ready→SaaS消费 | 可查询应用结果、租户鉴权播放;重复事件不产生重复资产 | +| 6 | 清理暂存 | SaaS已应用且达到批准保留策略后清理;未确认的失败文件告警,不静默删除 | + +需要双声道、全程振铃录音、严格无录音损失或特殊合规策略时,单独确认;本模板仅以接通后单轨混音作为一期基线。 + +## 8. 灰度、回滚与运维交接 + +- 顺序:单节点单路→两节点顺序→真实多路隔离→已确认目标负载→小流量灰度。Mock成功不能跳过真实SIP/AI阶段。 +- 回滚前停止新指令/建立屏障,排空或经授权处置在途电话,记录未决attempt、录音和outbox状态,再回滚中间件或节点镜像。 +- 不使用`docker compose down -v`删除录音卷;不把删除数据库/队列当作恢复手段。配置和镜像回滚必须保留事件/执行事实,避免重复拨号。 +- 若发现双拨、越权、录音静默丢失或终态回退,立即停止放量;按call_id对账后再恢复。 +- 交付记录包括镜像digest、Git/配置版本、网络矩阵、密钥引用、部署命令记录、验收证据目录、故障联系人和批准的容量/恢复边界。 diff --git a/docs/交付文档/一期中间调度件与Asterisk_v1.0/03_联调步骤与验收标准.md b/docs/交付文档/一期中间调度件与Asterisk_v1.0/03_联调步骤与验收标准.md new file mode 100644 index 0000000..3c55952 --- /dev/null +++ b/docs/交付文档/一期中间调度件与Asterisk_v1.0/03_联调步骤与验收标准.md @@ -0,0 +1,140 @@ +# 第三部分:联调步骤与验收标准 + +**当前状态:全部运行用例待执行。** 本次只完成参考代码审查和文档静态校验,没有实际部署、拨打电话或连接生产MQ。不得把参考仓库的历史成功记录填写为本次通过。 + +## 1. 验收分层与准入 + +| 层级 | 验证内容 | 不能替代的验证 | +| --- | --- | --- | +| L0 静态检查 | 文档、样例、配置语法、镜像/提交/参数登记、接口评审 | 不证明容器能启动、线路可用或业务可靠 | +| L1 Mock底座 | 两节点运行、ARI、Mock SIP、顺序双向RTP、清理 | 不证明真实AI、录音、MQ回传、并发隔离或生产主备 | +| L2 真实SIP/AI | 授权号码、指定主备接入、媒体、AI、多轮/打断及录音 | 不证明SaaS业务数据一致性和异常恢复 | +| L3 SaaS闭环 | MQ下发/回传、控制应答、最终文字、录音入库/播放、补偿 | 不替代容量、故障注入和安全检查 | +| L4 发布门禁 | 阻断用例、确认后的容量/时延、恢复、回滚、交接 | 全部有证据才能签字发布 | + +开始L2前必须取得真实SIP/AI权限及测试号码授权;故障注入仅在隔离环境或批准窗口执行。不得为了验收中断无关服务、清空队列/数据库/录音卷或调整全局防火墙。 + +## 2. 建议指标与G0确认表 + +以下是**小规模一期试运行建议值,不是已测结论或合同承诺**。可根据真实供应商及需求在G0修改;正式验收单不得保留“待定”。 + +| 指标 | 建议初始目标 | 测量边界/样本 | +| --- | --- | --- | +| 真实并发/CPS | 目标10路、全局1 CPS;先1路再3路再10路,且不超过供应商限额 | 在确认后的目标负载下持续30分钟,覆盖两节点;SIP重传不算新增呼叫 | +| 控制/状态查询 | 查询P95≤500ms;控制APPLIED P95≤2s | 从SaaS请求到结果;控制时间包含发起屏障处理,不能只量HTTP202 | +| MQ命令受理 | P95≤2s | SaaS持久发布到中间件持久接收;等待拨号另计 | +| AI首音频响应 | P95≤1500ms | 客户语音结束被VAD确认到首个有效TTS音频包发往通话桥;不少于100个有效轮次 | +| 打断 | P95≤500ms | VAD确认插话到旧TTS停止向桥发送;另抽样核查客户侧体验 | +| 最终文字回传 | P95≤3s | 最终稿产生到SaaS业务库应用并可查询;UI刷新延迟另记 | +| 录音就绪 | 测试通话≤180s时,挂断后120s内SaaS可鉴权播放 | 包含录音封装、上传、校验、MQ消费;超大文件单独测 | +| 中断恢复 | SaaS消费/上传中断5分钟,恢复后10分钟内补齐本轮关键数据 | 固定目标负载、明确数据量和可用带宽;不允许通过删除积压通过 | +| 资源清理 | 正常结束后30s内释放本次通道/桥/媒体会话 | 录音可保留;异常节点须恢复后完成核对和清理 | +| 正确性底线 | 重复业务拨号0、跨租户访问0、终态非法回退0、静默丢失最终文字/录音0 | 对本轮全部execution/call/event核对;未决事实必须明确暴露 | + +并发、CPS、阈值、事件/文件保留期限、磁盘水位、最长可恢复中断由本人、SaaS和运维共同签字。若本地录音尚未上传时宿主机永久丢失,必须如实记录无法恢复的边界,不虚称双节点能够保证录音零丢失。 + +## 3. 联调步骤与双方产出 + +| 步骤 | 操作与主责 | 本步产出 | +| --- | --- | --- | +| T0 契约冻结 | 本人提供消息/状态/错误码;BgA/BgB确认SaaS接口和MQ映射;运维确认网络/密钥 | 版本化契约、示例、环境参数和G0签字 | +| T1 SaaS-MQ空链路 | SaaS发送测试指令;中间件暂不拨真实电话,只校验/受理并MQ应答;SaaS消费 | command_id全链路记录,ACK与业务结果区分正确 | +| T2 Mock底座 | 运维按第二部分部署;本人分别在A/B执行顺序Mock通话 | 容器/ARI/PJSIP、双向RTP和清理证据;标记为L1 | +| T3 真实单路 | 本人驱动指定SIP和AI链路;SaaS下发授权号码/快照 | 正常通话、多轮/打断、状态和原因映射 | +| T4 数据回传 | BgB接收MQ事件及资产;FeA展示文字/录音/状态 | event_id→入库→页面可追溯,重复消费无重复内容 | +| T5 故障与对账 | 本人与运维注入MQ/ARI/SIP/上传故障;SaaS参与恢复 | 每项预期、实际、时间、原因、attempt/event/文件证据 | +| T6 容量与灰度 | 按G0目标压测,完成发布/回滚演练 | 指标报告、遗留问题及L4签字结论 | + +“空链路”是专用测试模式,必须不能触发真实SIP;不能靠使用假号码来证明不拨号。正常SaaS调度与授权检查在L2/L3必须启用。 + +## 4. 阻断验收用例 + +下列所有用例初始状态均为“待执行”。本轮环境中任一项失败或缺证据,不得签署一期生产验收。 + +### 4.1 部署与接入 + +| 编号/场景 | 操作步骤 | 通过标准/证据 | +| --- | --- | --- | +| DEP-01 必需服务 | Mock层检查A/B及Mock服务,真实层检查批准的运行服务集合(不含Mock);停止一个必需服务后重做检查 | 缺少必需服务必须判失败,不能因health.sh输出SKIP而整体通过;保存服务清单 | +| DEP-02 ARI与Stasis | 检查鉴权REST和节点应用事件连接;断开WebSocket但保留REST | 控制者发现断连并停止不安全的新执行;REST200不能掩盖应用不可用 | +| DEP-03 网络/鉴权 | 用授权与未授权来源访问ARI/MQ;验证真实SIP/媒体双向路由 | 未授权访问被拒绝;无公网裸ARI;没有以关闭防火墙/证书校验取巧 | +| DEP-04 录音持久化 | 生成录音后重启/重建当前测试节点容器,保留卷 | 已完成本地录音仍可读取和校验;容器可写层不能成为唯一存储 | + +### 4.2 命令与MQ可靠性 + +| 编号/场景 | 操作步骤 | 通过标准/证据 | +| --- | --- | --- | +| MQ-01 正常闭环 | 发布一条合法执行;完成电话及SaaS事件入库 | command、execution、call、attempt、event关联一致;ACCEPTED不被显示为已接通 | +| MQ-02 重复命令 | 同一command_id/execution_id重发10次;关闭FALLBACK以隔离变量 | 只产生一次业务拨号;SIP同一INVITE的协议重传不计为额外执行 | +| MQ-03 同键异内容 | 同租户同command_id改变号码/快照;另保持原凭证篡改tenant_id后发布 | 冲突/越权被拒绝,原命令不被覆盖;不产生第二次拨号;合法不同租户的命令空间不冲突 | +| MQ-04 持久化/ACK竞态 | 在命令提交前、提交后ACK前、ACK后分别终止中间件并恢复 | 未提交可重投,已提交能恢复;无丢失受理事实和重复业务拨号 | +| MQ-05 发布确认竞态 | 断开网络或让交换机无有效绑定;在事件提交与confirm之间停止进程 | 事件保留并重试;不可路由不能标记APPLIED;恢复后SaaS只有一次业务应用 | +| MQ-06 SaaS提交/ACK竞态 | 在event_inbox业务事务提交前后分别中断消费者 | 失败事务不ACK;重投事件幂等;最终文字/状态不重复、不缺失 | +| MQ-07 数据库失败 | 中间件接收时或SaaS应用事件时使数据库暂时不可用 | 不提前ACK/返回成功;不继续发起缺少持久执行意图的电话;恢复可对账 | +| MQ-08 容量与停止 | 积压多条指令,执行PAUSE/STOP;等APPLIED后重放旧指令及过期指令 | 生效后不再新发起,旧revision/过期执行被拒绝;无无限requeue热循环 | +| MQ-09 业务有效性 | 已排队号码被加入拒绝再联系/禁止时段,或授权被撤销后再执行 | SaaS业务许可重新校验不通过则不拨号;不得因早先发布成功绕过当前策略 | + +### 4.3 Asterisk、SIP与FALLBACK + +| 编号/场景 | 操作步骤 | 通过标准/证据 | +| --- | --- | --- | +| SIP-01 正常/无振铃事件 | 正常通话;让有效ANSWERED到达而无RINGING观测 | 可以直接从DIALING收敛到ANSWERED;最终时间和原因正确 | +| SIP-02 合法主备 | 主线路在明确未接通时发生已批准线路故障;确认旧尝试结束后切备用 | 同一call/execution下新attempt,最多达到配置总预算;不同时保留两条活动呼叫 | +| SIP-03 禁止误切 | 分别返回busy、reject、invalid;另在已接通后制造AI/媒体故障 | 这些场景不触发未经授权的SIP备用重拨;原因分类准确 | +| SIP-04 迟到接通/ARI超时 | 原尝试已提交,阻断控制事件,再让接通迟到;同时触发超时处理 | 进入对账,不因“未收到接通”立即备用拨号;没有双通;完整记录时序 | +| SIP-05 节点故障 | 分别在提交originate前、提交后事实不明、已接通后中断节点 | 前者可选健康节点;不明状态不盲重拨;已接通中断如实结束而非声称无损迁移 | +| SIP-06 并发隔离 | 多通话播放不同标识音/不同测试词并分布两节点;抓取允许范围内的媒体关联 | 每call的通道、端口、文字、录音不串线;不能只比较总RTP包数 | +| SIP-07 清理与重启 | 正常结束、客户挂断、振铃超时及中间件重启后检查资源 | 按call_id清理且不伤其他通话;残留有补偿和告警,达到清理时限 | + +### 4.4 AI、文字、录音与安全 + +| 编号/场景 | 操作步骤 | 通过标准/证据 | +| --- | --- | --- | +| DATA-01 AI多轮/打断 | 至少100个有效轮次,覆盖播音时插话、静音和AI超时 | 达到确认的延迟基线;取消旧生成/播音;AI故障不无限阻塞电话 | +| DATA-02 文字版本 | 按乱序/重复方式回传中间稿和最终稿,再重放最终事件 | 同轮按版本收敛;最终文字完整;未播出的AI文本有正确标记 | +| DATA-03 录音闭环 | 完成电话→录音封装→上传校验→MQ ready→SaaS播放 | checksum/大小/时长可核对,事件在上传确认后产生;页面不先显示假成功 | +| DATA-04 上传故障 | 模拟上传中断、授权过期、checksum不符、完成确认丢失 | 授权/上传可重试且不产生重复资产;不提前ready;通话终态仍可展示 | +| DATA-05 SaaS中断 | 暂停SaaS消费及上传5分钟再恢复;模拟接近磁盘上限 | 音频不等待回传;有积压/磁盘保护;恢复后在目标时限补齐,不以删数据通过 | +| DATA-06 数据补传 | 按call_id触发事件重放;核对原command/attempt数量 | 仅补数据,不重新拨号;SaaS幂等消费,APPLIED状态能查询 | +| SEC-01 租户隔离 | 两租户相同业务ID或交叉引用call/recording,尝试查询、补传、播放 | 跨租户被拒绝;事件不能覆盖别的租户;播放权限独立验证 | +| SEC-02 输入/凭据 | 提交恶意dial string/媒体地址/超大消息,检查日志与签名URL | 不支持任意ARI调用/多目标注入;大小受限;密码、敏感号码和有效签名不泄露 | +| OPS-01 压测/回滚 | 按目标并发/CPS持续30分钟;停止接单并回滚版本,再恢复 | 不超限、无双拨/串线/终态回退;数据与录音卷保留;待投递事件可恢复 | + +## 5. 证据、结果与签字模板 + +每个用例至少关联一组可定位证据;业务统计不能仅依赖截图。 + +- 版本:参考提交、实际镜像digest/Asterisk版本、中间件版本、SaaS版本、配置版本。 +- 环境:node_id、网络路径、MQ策略、租户、测试号码授权、目标并发/CPS、时间同步情况。 +- 执行:command_id、execution_id、call_id、attempt_id、event_id、状态版本、时间点与失败原因。 +- 呼叫:ARI事件/查询、受控SIP信令证据、媒体会话关联、清理结果;SIP重传与真正新dialog区分。 +- 数据:SaaS event_inbox应用记录、任务/通话结果、最终文字、录音checksum和受控播放结果。 +- 恢复:注入故障、恢复动作、积压清空时间、残留/未决记录、异常告警及处置。 +- 文件:按脱敏证据目录归档,凭据和客户数据不直接打包公开。 + +单项记录模板: + +| 字段 | 填写内容 | +| --- | --- | +| 用例ID/环境/日期/执行人 | 待执行 | +| 前置条件与版本 | 待填写 | +| 输入与关联ID | 待填写 | +| 故障注入/执行动作 | 待填写 | +| 预期结果 | 引用本节对应标准 | +| 实际结果与指标 | 待填写,不能填参考仓库历史结果 | +| 证据路径与缺陷号 | 待填写 | +| 结论与复核人 | 待执行 / 通过 / 失败 / 阻塞;不得以空白代表通过 | + +发布签字由本人(中间件/ARI)、SaaS后端(指令与事件)、FeA(展示/播放)、运维(部署/恢复)及业务验收人完成。角色重合时注明,不增加隐含人力。 + +## 6. 一期最终完成定义 + +只有以下条件全部满足,才能把“设计完成”升级为“实施验收完成”: + +1. 文档契约、实际Schema/API和实现版本一致,G0参数无未确认阻断项。 +2. 必需节点、真实SIP、AI、中间件、MQ及SaaS资产链路均通过相应层级,不以Mock替代。 +3. 本文全部阻断用例有通过证据,确认后的指标达标;双拨、串线、越权、静默数据丢失为零。 +4. 配置/凭据/卷/监控/告警/补偿/保留与回滚操作已交接;已知单实例及本地录音失效边界被接受或另行修复。 +5. 一期没有计费入口或扣费行为,现有SaaS业务数据未被重复建设或破坏。 + +本次文档交付只完成L0中的参考审查与文档校验;L1–L4均待实际环境执行和签字。 diff --git a/docs/交付文档/一期中间调度件与Asterisk_v1.0/README.md b/docs/交付文档/一期中间调度件与Asterisk_v1.0/README.md new file mode 100644 index 0000000..acd77e3 --- /dev/null +++ b/docs/交付文档/一期中间调度件与Asterisk_v1.0/README.md @@ -0,0 +1,18 @@ +# 一期中间调度件、Asterisk部署与验收文档 + +## 文档入口 + +- [合并版 Word 文档](一期中间调度件_Asterisk部署及验收_v1.0.docx) +- [01 中间调度件与MQ回传设计](01_中间调度件与MQ回传设计.md):职责、数据模型、消息和接口、幂等、控制屏障、FALLBACK、文字/录音回传。 +- [02 Asterisk部署与SIP对接步骤](02_Asterisk部署与SIP对接步骤.md):固定参考版本、隔离Mock步骤、真实部署差异、节点模板、配置清单、录音及回滚。 +- [03 联调步骤与验收标准](03_联调步骤与验收标准.md):L0–L4分层、量化指标建议、29项阻断用例、证据和签字模板。 + +## 已确认与待执行 + +用户确认采用**MQ下发指令、MQ回传事件**;HTTP只用于控制、查询和录音上传相关交互。本套文档优先于旧开发计划中的HTTP业务回调草案。 + +参考仓库:`git@git.ipao.vip:rogee/sip-research.git`;固定审阅提交:`6a8064e53bb7eadd73f03373524953e68330976c`。 + +本次只审查参考代码并生成文档,没有远程部署、停用其他服务、拨打电话或修改现有Excel。仓库只有Mock通话底座,不能据此认定中间件、真实AI、MQ回传或录音链路已实现。 + +执行前补齐指定SIP主备参数、SaaS/MQ契约、镜像digest、部署地址、AI/存储凭据和验收基线。所有运行用例目前为**待执行**,文档语法校验不等于业务验收通过。 diff --git a/docs/交付文档/一期中间调度件与Asterisk_v1.0/一期中间调度件_Asterisk部署及验收_v1.0.docx b/docs/交付文档/一期中间调度件与Asterisk_v1.0/一期中间调度件_Asterisk部署及验收_v1.0.docx new file mode 100644 index 0000000000000000000000000000000000000000..b4dee9eee0468f24d10c197607beef283a3eb593 GIT binary patch literal 42205 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基础频控/拒绝再联系/重新外呼决策"] + SDB[("SaaS 持久存储
业务主数据、发布记录、inbox、资产关联")] + PUBLISH["可信发布服务
tenant_id 受控映射/限速/原 ID 重试"] + CONSUME["事件消费者
租户校验/event_id 去重/版本合并
业务与 inbox 同事务后 ACK"] + STORAGE["SaaS 存储接口
上传授权、实际校验、确认 oss_id
按租户/用户提供鉴权播放"] + UI --> BUSINESS + BUSINESS --> SDB + SDB --> PUBLISH + CONSUME --> SDB + STORAGE --> SDB + SDB --> UI + end + + subgraph BROKER["RabbitMQ:可靠传输,不是活动通话唯一状态源"] + CMDX["命令 Exchange
call.execute"] + QA["租户 A 命令队列"] + QB["租户 B 命令队列"] + QN["租户 N 命令队列"] + EVX["事件 Exchange"] + EVQ["SaaS 事件队列
本轮不按租户拆分"] + DLQ["重试/死信与隔离
受控恢复、不得绕过租户域或配额"] + CMDX --> QA & QB & QN + EVX --> EVQ + QA & QB & QN -. "异常隔离" .-> DLQ + end + PUBLISH -- "AMQP:持久消息、confirm + mandatory" --> CMDX + EVQ --> CONSUME + + subgraph APP["呼出应用:逻辑组件,部署粒度待实施"] + API["HTTP 控制/查询/历史事件补传
不提供创建通话或重新拨号接口"] + FAIR["租户公平调度器,可多实例
有界轮转、预取和持久待发起窗口"] + ADMIT["原子资源准入与路由
租户并发/CPS + 供应商并发/CPS
Cell/端口/出口健康 + AI 配额"] + STATE[("可靠持久存储/协调
命令与执行去重、控制屏障、发起意图
调度所有权、额度与租约、事件与 outbox")] + OUTBOX["outbox 投递器
所有业务结果经 MQ
有限重试/原事件补传"] + ASSET["资产处理逻辑
录音封口/有界暂存/上传与恢复
可与 Cell 共置,不假设额外文件传输服务"] + FAIR --> ADMIT + FAIR <-->|"先持久化后 ACK"| STATE + ADMIT <-->|"所有权、原子额度与隔离令牌"| STATE + API <-->|"控制屏障/查询快照/原事件"| STATE + STATE --> OUTBOX + ASSET <-->|"资产状态 + outbox 同事务"| STATE + end + QA & QB & QN --> FAIR + DLQ -. "合法命令恢复回原租户调度域" .-> FAIR + BUSINESS -. "HTTPS:控制/查询/补传" .-> API + OUTBOX -- "AMQP:状态、文字、终态、录音元数据" --> EVX + + subgraph CELLS["语音 Cell 池:多机器 + 多 EIP 直连"] + subgraph CELL1["Cell 1 · 固定出口"] + EXEC1["本地执行器
真实发起前复核屏障/期限/租约"] + AST1["Asterisk
预配置授权 trunk/通道/桥"] + MEDIA1["媒体与会话适配
流式音频、打断取消、录音暂存"] + IP1["固定 EIP 1
独立白名单/RTP 端口/健康"] + EXEC1 <-->|"ARI 控制/事件"| AST1 + AST1 <-->|"实时媒体"| MEDIA1 + AST1 <-->|"SIP / RTP"| IP1 + end + subgraph CELLN["Cell N · 同构示意,非确定机器数"] + STACKN["本地执行器 + Asterisk + 媒体适配
独立端口、容量、租约与健康"] + IPN["固定 EIP N
独立供应商白名单"] + STACKN <-->|"SIP / RTP"| IPN + end + end + ADMIT -- "trunk_id + egress_pool_id + cell_id" --> EXEC1 + ADMIT -- "同规则选择其他 Cell" --> STACKN + EXEC1 <-->|"执行事实/心跳/对账"| STATE + STACKN <-->|"执行事实/心跳/对账"| STATE + API -. "跨 Cell 控制屏障/在途许可收敛" .-> EXEC1 + API -. "跨 Cell 控制屏障/在途许可收敛" .-> STACKN + MEDIA1 -. "本 Cell 已封口录音" .-> ASSET + STACKN -. "本 Cell 已封口录音" .-> ASSET + + subgraph TELEPHONY["外部电话网络"] + SIP["已预接入并授权的 SIP 供应商
逐呼应用本线路主叫/被叫规则
支持单线路;无备用不虚构"] + CALLEE["被叫电话"] + SIP <-->|"电话接续/语音"| CALLEE + end + IP1 <-->|"SIP / RTP 直连"| SIP + IPN <-->|"SIP / RTP 直连"| SIP + + subgraph AI["外部 AI 服务:目标链路,协议与配额待冻结"] + ASR["ASR
仅有独立验证基础"] + LLM["LLM
未启用,待新规范"] + TTS["TTS
未启用,待新规范"] + ASR -->|"识别文本,经会话逻辑编排"| LLM + LLM -->|"回复文本,经会话逻辑编排"| TTS + end + MEDIA1 -- "客户流式音频" --> ASR + TTS -- "生成语音" --> MEDIA1 + STACKN <-->|"同构实时 AI 会话,非 MQ 音频传输"| AI + MEDIA1 -. "文字/播放证据等执行事实" .-> STATE + + OSS[("OSS
持久录音对象,不经 MQ 传文件")] + ASSET -. "① HTTPS 申请授权;③ complete 并取得 oss_id" .-> STORAGE + ASSET -- "② 签名 HTTPS 上传文件" --> OSS + STORAGE <-->|"独立验证对象、大小与校验值"| OSS + + classDef planned fill:#eef4ff,stroke:#4263a6,color:#172a46; + classDef pending fill:#fff4dc,stroke:#b7791f,color:#573b13; + classDef data fill:#eaf7f1,stroke:#2d8063,color:#164b39; + classDef endpoint fill:#f0edff,stroke:#7560a0,color:#3c2f5c; + class API,FAIR,ADMIT,EXEC1,AST1,MEDIA1,STACKN,OUTBOX,ASSET planned; + class ASR,LLM,TTS pending; + class SDB,STATE,OSS,EVX,EVQ,QA,QB,QN data; + class IP1,IPN,SIP,CALLEE endpoint; +``` + +## 架构约束 + +1. **业务与媒体分离:** RabbitMQ 是唯一拨号指令入口、全部业务结果回传通道;不承载实时音频。HTTP 仅控制、查询、补传及存储握手,不做业务结果回调。AI 箭头表达经 Cell 会话逻辑编排的数据顺序,不要求供应商服务互相直连。 +2. **可靠性与公平:** 多调度实例共享持久去重、额度及所有权协调。租约失效停止新任务;未知活动通话须对账,不直接释放占用。队列满明确背压,SaaS 保留原 ID;恢复仍回原租户调度域。独立队列不等于独享 broker,也不保证固定开始时限。 +3. **固定路由:** 一通电话及合法 FALLBACK 始终固定 Cell/出口;trunk 预接入,不逐呼改写共享 SIP 配置。不建设单 EIP + NAT,不自动迁移故障节点的活动通话。当前登记出口 `123.56.71.98` 不等于已确认可操作的 EIP,图中其他出口均为规划资源。 +4. **容量是目标而非结论:** 至少 1000 路同时已接通的完整 ASR/LLM/TTS 通话;N+1 或更高冗余,`(Cell 数量 - 1) × 实测单 Cell 安全容量 >= 1000`。拨号、振铃、CPS、AI 配额、媒体端口、带宽与 MQ/OSS 另行计入;未压测不承诺数量或规格。 +5. **资产闭环:** ①授权 → ②上传 OSS → ③SaaS 实际校验并确认 oss_id → ④verified 与 outbox 同事务 → ⑤MQ recording.ready → ⑥SaaS 去重关联。未验证不发 ready;失败经 MQ 回传。资产处理框是逻辑能力,不强制把录音跨节点搬到新服务。 + +服务鉴权、TLS、租户 ACL、密钥注入、监控与积压/磁盘水位保护横跨上述组件;为避免遮挡主链路,不额外画成一套管理平台。各外部依赖和真实测试状态仍以依据文档为准。 diff --git a/docs/部署接入_运行说明.md b/docs/部署接入_运行说明.md new file mode 100644 index 0000000..d7bcc72 --- /dev/null +++ b/docs/部署接入_运行说明.md @@ -0,0 +1,213 @@ +# 部署接入:本轮实现与运行说明 + +## 1. 实施边界 + +本轮依据用户选择,**仅复用 voice_test 的 ASR**,没有复制或启用其 LLM/TTS,也没有把原调研页面直接作为生产服务暴露。 + +| 内容 | 本轮状态 | +| --- | --- | +| ASR Web 服务 | 已实现:访问令牌、Origin校验、服务端模型/凭据选择、16k单声道PCM、识别结果展示 | +| ASR 连接与协议 | 已加固:断开清理、取消、写入/启动时限、最终结果背压、火山帧长度及gzip解压上限 | +| 部署底座 | 已实现:非root/read-only ASR容器、回环端口、Asterisk配置生成和显式启动检查 | +| 阿里云主机准备 | 已实现CLI驱动的只读计划、受控创建竞价实例、复用主机和绑定既有EIP;默认不修改云资源 | +| 云端实际操作 | 未执行;当前本机无aliyun CLI/云凭据,未核实固定IP归属,未创建实例或改绑IP | +| Asterisk真实接入 | 未执行;指定SIP地址/鉴权、VPC网络、镜像digest等仍需填写 | +| LLM/TTS | 未实现、未启用,等待用户新的供应商/协议/参数规范 | +| ARI业务调度、自动FALLBACK、MQ/OSS回传 | 尚未实现;仍按开发计划推进,不能把两个trunk配置当成自动切换代码 | + +当前目标是一台北京竞价ECS上的部署底座。ASR测试台与SIP媒体尚未连通;浏览器识别不是电话外呼,也不是已完成SaaS业务验收。 + +参考:`sip-research@6a8064e53bb7eadd73f03373524953e68330976c`;ASR协议源自`voice_test@6772bf4`,仅导入`asr.go/asr_bailian.go/asr_volc.go`后进行加固,不导入原main、配置页、LLM或TTS代码。 + +## 2. 目录与环境 + +```text +AGENTS.md 资源约束、安全规则、参考来源 +compose.yaml ASR Web容器 +compose.asterisk.yaml 独立Asterisk节点容器 +.env.example 服务配置占位,不含真实凭据 +services/asr-web/ ASR-only Go服务及Web页面 + deploy/aliyun_host.py 阿里云CLI只读计划/显式apply + deploy/aliyun.example.json 实例/预算/网络参数占位 + deploy/render_asterisk.py 受控配置生成 + deploy/asterisk.example.json SIP接入参数占位 + deploy/asterisk.sh 默认检查;显式up才启动 + tests/ 离线部署逻辑及PCM测试 + docs/ 需求、计划和运行文档 + .local/ 本机临时状态/验证产物,不提交 +``` + +开发检查使用Go 1.26、Python 3.11+、Node和Docker Engine/Compose。云操作另需阿里云官方CLI及已授权的本地Profile/RAM Role/STS。源码根目录是部署目录,旧Word/Excel/压缩包不随本次代码改动重新生成。 + +## 3. 固定出口IP与云资源 + +### 3.1 已知约束 + +- 区域固定为`cn-beijing`,我方SIP出口白名单公网IP为`123.56.71.98`。 +- 此IP不是SIP服务商服务器地址,不得用作trunk contact。 +- 必须先核实是本账号EIP,还是既有实例的普通公网IP。没有可操作的该IP时停止,不能新分配随机IP替代。 +- 创建只使用竞价`SpotWithPriceLimit`、单台实例和明确价格上限,新实例`InternetMaxBandwidthOut=0`,随后绑定已经确认的EIP。 +- 已有主机必须有专用project标签,或由用户明确填写`adopt_instance_id`授权复用。未知绑定、非ECS资源、多个候选、库存不完整均停止。 +- 既有主机的计费/竞价策略会在plan中展示。非竞价实例不自动转换;若不满足目标,由用户评审迁移,不能擅自停机或创建替代机。 + +### 3.2 先准备CLI与权限 + +从阿里云官方CLI发布渠道安装并验证版本,按团队密钥流程配置Profile/RAM Role/STS,不使用未经审计的`curl | bash`。不要把AK/Secret、SSH私钥或会话Token发到聊天中。 + +最少需要读取EIP和ECS的权限;实际apply还需要RunInstances和AssociateEipAddress权限。VSwitch、安全组、镜像和SSH KeyPair预先存在,脚本不会自动创建全开放安全组。 + +```bash +# 在项目根目录;已有配置文件不覆盖。 +mkdir -p .local +if [ ! -e .local/aliyun.json ]; then + install -m 600 deploy/aliyun.example.json .local/aliyun.json +fi +aliyun --help +python3 deploy/aliyun_host.py --config .local/aliyun.json +``` + +默认只读查询。第一次必须核对返回的实例ID、IP类型、状态和计费策略。若提示实例不属于项目,先由用户核实实际资源归属,再决定是否填写adopt_instance_id,不能为了绕过校验随便填写。 + +### 3.3 缺主机时按需创建 + +创建前填写:`image_id`、`instance_type`、`vswitch_id`、`security_group_id`、`key_pair_name`、正数`spot_price_limit`、系统盘类型/大小。镜像架构、实例规格与VSwitch所在可用区必须兼容。 + +价格上限是每小时竞价计算资源上限,币种以账号计费为准;不包括系统盘、EIP、流量等费用。实际费用与创建授权必须由用户确认。 + +```bash +# 只有确认只读plan、规格、网络和预算后才执行。 +python3 deploy/aliyun_host.py --config .local/aliyun.json --apply +``` + +- 没有可复用实例且固定EIP可用时才创建;RunInstances之前保存ClientToken。 +- 创建请求超时后保留同一ClientToken;绑定失败保留已创建实例ID,重试时优先复用,不另造一台。 +- 绑定前再次核对EIP;若已经被其他实例占用,停止,不解绑对方。 +- 已有Stopped实例不自动启动或替换。实例/EIP未达到确认状态会报错,不宣称部署成功。 +- `.local/aliyun-host.json`和锁文件是恢复依据,不能在出错后直接删除来强行重试。多个控制机必须共用明确的操作责任,不能各自用独立状态并行创建。 +- 该脚本只准备ECS/EIP,不安装Docker、不上传SSH私钥、不配置DNS/HTTPS、不迁移活动通话。竞价回收后的监控/自动恢复尚未实现。 + +## 4. ASR Web启动与浏览器验证 + +### 4.1 配置 + +```bash +if [ ! -e .env ]; then + install -m 600 .env.example .env +fi +# 在本机生成访问令牌,填入.env;不要贴到聊天或工单。 +python3 -c 'import secrets; print(secrets.token_urlsafe(32))' +``` + +- `ASR_WEB_TOKEN`至少32位URL-safe字符,是本测试台访问令牌,不是供应商API Key。 +- `BAILIAN_API_KEY/BAILIAN_WS`用于非fun-*百炼ASR模型;`FUNASR_API_KEY/FUNASR_WS`用于fun-*模型,未配置Fun Key时可回退到百炼Key。 +- `BAILIAN_ASR_MODELS`是服务端允许选择的ASR模型列表,默认`fun-asr-realtime`。模型是否支持当前协议需要真实供应商验证,不能把任意LLM模型放入列表。 +- 火山使用`VOLC_APP_KEY`或`VOLC_APP_ID + VOLC_ACCESS_TOKEN`,并配置对应`VOLC_RESOURCE_ID/VOLC_WS`。 +- 供应商地址只接受WSS,不从浏览器接收任意上游地址或API Key。页面只展示凭据是否配置,不展示密钥。 +- 无供应商凭据时服务可以启动,但模型禁用;`/healthz`只说明进程存活,不说明供应商、SIP或MQ可用。 + +### 4.2 启动 + +```bash +docker compose config --quiet +docker compose up -d --build +docker compose ps +curl --fail http://127.0.0.1:18088/healthz +``` + +默认仅在宿主机`127.0.0.1:18088`暴露。容器非root、只读文件系统、去除capabilities,并设置进程/内存上限。不要把测试台直接作为SaaS用户入口;目前是单一运维访问令牌,不是SaaS租户鉴权。 + +开发者也可从`services/asr-web`运行`go run .`,需提前通过环境设置ASR_WEB_TOKEN和必要上游配置;本地进程默认监听127.0.0.1:8080,不自动读取.env。 + +### 4.3 远程Web麦克风 + +优先在批准域名的TLS反向代理后访问,代理保留Host并支持WebSocket,`PUBLIC_ORIGIN=https://批准域名`用于精确Origin校验。域名和证书尚未提供,因此本轮没有部署公共HTTPS入口。 + +临时验证可用SSH隧道: + +```bash +: "${DEPLOY_SSH_USER:?设置经批准的部署账户}" +ssh -N -L 18088:127.0.0.1:18088 "${DEPLOY_SSH_USER}@123.56.71.98" +``` + +浏览器打开`http://localhost:18088`,使用本机安全上下文获取麦克风;如设置PUBLIC_ORIGIN,需要与实际访问的origin一致。不要要求用户禁用Chrome安全设置。 + +页面流程:填写服务令牌→读取模型→选择有凭据的模型→开始识别→查看中间/最终文字→结束或取消。音频为16k、单声道、PCM16LE、每包100ms;会话最长5分钟、同时最多4个连接。背压过大停止采集,不能无限缓存音频。 + +LLM/TTS固定显示“未启用/等待新规范”。用户未提供新规范前,不调用旧仓库实现,不提供隐式供应商回退。 + +## 5. Asterisk配置与启动 + +### 5.1 配置生成 + +```bash +mkdir -p .local +if [ ! -e .local/asterisk.json ]; then + install -m 600 deploy/asterisk.example.json .local/asterisk.json +fi +``` + +填写实际`local_net`、主/备SIP服务器、端口、IP或Digest鉴权方式、用户名及是否注册。当前生成器只提供经过明确限制的UDP/ulaw外呼基线,TCP/TLS及特殊号码/主叫策略需要另行确认。 + +通过受控进程环境注入: + +- `ARI_PASSWORD`:至少32位,不能使用样例密码。 +- Digest接入另需`SIP_PRIMARY_PASSWORD`、`SIP_BACKUP_PASSWORD`;仅在相应接入启用Digest时要求。 +- 为防INI注入,换行、分号、方括号等字符会被拒绝;供应商固定密码不满足时需评审正确转义方案,不能删除校验绕过。 + +```bash +python3 deploy/render_asterisk.py --config .local/asterisk.json +``` + +生成到`deploy/asterisk/generated/`,文件权限600,目录750;已有目录不会被覆盖。更新时先生成新的版本目录,核对差异、备份旧版本,再由操作人员批准切换。 + +必须核对镜像中Asterisk的实际UID/GID及配置读取权限,只向必要进程授权,不用chmod 777。ARI默认回环8088;对外信令/媒体地址固定为123.56.71.98。RTP端口段10000–10800、strictrtp=yes均需真实线路验证。 + +### 5.2 镜像与安全组 + +`.env`中的ASTERISK_IMAGE必须为批准镜像的`@sha256:`引用。参考仓库使用latest、历史记录22.10.1,不代表该镜像当前版本已经被本项目验证;本轮没有拉取或启动真实Asterisk镜像。 + +确认:SIP服务端IP/协议/端口、RTP回程、EIP/NAT、实际VPC网段、管理来源、录音卷目录和权限。安全组只按来源和用途开放;不公开裸ARI,不清空既有防火墙。 + +```bash +# 默认为检查,不启动容器。 +bash deploy/asterisk.sh +# 参数、权限、源IP和发布窗口确认后,才显式启动。 +bash deploy/asterisk.sh up +docker compose -f compose.asterisk.yaml exec -T asterisk \ + asterisk -rx 'core show version' +docker compose -f compose.asterisk.yaml exec -T asterisk \ + asterisk -rx 'pjsip show contacts' +``` + +只有一个节点采用host network;不要在同一宿主机直接启动第二套争用5060/8088/RTP的配置。主备trunk只是接入配置,自动FALLBACK、长期ARI事件连接、业务状态机和录音上传程序仍需开发。 + +开始真实外呼前,必须通过SIP供应商侧日志核对我方实际出口确为123.56.71.98;仅EIP绑定成功不能证明没有其他NAT/路由改变出口。 + +## 6. 测试与验收边界 + +```bash +python3 -m unittest discover -s tests -v +(cd services/asr-web && go test -race ./... && go vet ./...) +node --test tests/test_pcm.cjs +node --check services/asr-web/web/app.js +bash -n deploy/asterisk.sh +``` + +本轮验证分开记账: + +- 自动测试:云只读/归属/固定IP、创建幂等、失败恢复、EIP绑定竞态、库存完整性;Asterisk配置验证;ASR鉴权、取消、模拟WebSocket结果、帧边界及PCM编码。 +- 本地容器:ASR镜像构建、非root/read-only运行、回环HTTP与healthcheck;测试容器已清理。 +- 浏览器:无效令牌拒绝、正常令牌读取未配置模型、模型禁用、LLM/TTS未启用。没有采集真实麦克风,也没有发送真实供应商请求。 +- 未执行:真实阿里云查询/创建/绑定、SIP通话、真实ASR、LLM/TTS、MQ/OSS、完整外呼和竞价回收恢复。 + +本地模拟通过不等于生产可用。只有填齐资源和契约、执行既有验收文档相应场景并留存证据后,才可把阶段状态更新为真实环境验收通过。 + +## 7. 下一步需要用户提供/确认 + +1. 在本机通过安全方式配置阿里云CLI与Profile/RAM Role/STS,并确认123.56.71.98的实际归属及是否可迁移EIP。 +2. 北京实例规格、镜像、VSwitch、安全组、SSH KeyPair、竞价上限及磁盘/EIP/流量预算;现有主机是否允许复用。 +3. SIP主备真实地址、协议、鉴权、号码/主叫要求和接入限制。 +4. ASR测试凭据、批准的模型/资源ID;Web HTTPS域名/证书或SSH访问方案。 +5. 用户制定的MQ/OSS ID接口规范,以及新的LLM/TTS协议、参数与取消/打断规则。 + +以上未确认前,不创建计费资源、不改绑白名单IP、不自动拨真实号码,也不声称完成整个平台。 diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 0000000..28db299 --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,4 @@ +[tool.pyright] +include = ["deploy", "tests"] +extraPaths = ["."] +pythonVersion = "3.11" diff --git a/services/asr-web/.dockerignore b/services/asr-web/.dockerignore new file mode 100644 index 0000000..82fa71b --- /dev/null +++ b/services/asr-web/.dockerignore @@ -0,0 +1,5 @@ +.env +.env.* +asr-web +*.test +coverage.out diff --git a/services/asr-web/Dockerfile b/services/asr-web/Dockerfile new file mode 100644 index 0000000..8b298f2 --- /dev/null +++ b/services/asr-web/Dockerfile @@ -0,0 +1,14 @@ +FROM golang:1.26.4-alpine AS build +WORKDIR /src +COPY go.mod go.sum ./ +RUN go mod download +COPY . . +RUN CGO_ENABLED=0 go build -trimpath -ldflags='-s -w' -o /out/asr-web . + +FROM scratch +COPY --from=build /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/ca-certificates.crt +COPY --from=build /out/asr-web /asr-web +USER 65532:65532 +EXPOSE 8080 +HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 CMD ["/asr-web", "-healthcheck"] +ENTRYPOINT ["/asr-web"] diff --git a/services/asr-web/asr.go b/services/asr-web/asr.go new file mode 100644 index 0000000..1f51817 --- /dev/null +++ b/services/asr-web/asr.go @@ -0,0 +1,30 @@ +package main + +import ( + "context" +) + +// ASR provider 接口 + 工厂:把浏览器麦克风 PCM 转成实时文本流。 +// 事件语义(与前端约定): +// +// type=partial text=中间结果 +// type=final text=最终句 +type asrEvent struct { + Typ string // partial | final | error + Text string + Code string + Error string +} + +type asrProvider interface { + // start 建连并启动任务,返回后即可 sendAudio。 + start(ctx context.Context) error + // sendAudio 发送一块 PCM16/16k/mono 音频。 + sendAudio(b []byte) error + // finish 发送结束指令,upstream 关闭时 events 关闭。 + finish() error + // events 返回识别结果通道。 + events() <-chan asrEvent + // close 释放资源。 + close() +} diff --git a/services/asr-web/asr_bailian.go b/services/asr-web/asr_bailian.go new file mode 100644 index 0000000..e9b5e10 --- /dev/null +++ b/services/asr-web/asr_bailian.go @@ -0,0 +1,188 @@ +package main + +import ( + "context" + "fmt" + "sync" + "sync/atomic" + "time" + + "github.com/gorilla/websocket" +) + +// bailianASR: 阿里云百炼实时语音识别(Qwen-Audio-3.0-ASR-Flash-Streaming / Fun-ASR)。 +// 文本事件 run-task/continue-task/finish-task,音频为裸二进制帧。 +type bailianASR struct { + model string + api agentCfg + + conn *websocket.Conn + taskID string + out chan asrEvent + wmu sync.Mutex // Audio and control messages share one writer. + done chan struct{} + doneOnce sync.Once + connOnce sync.Once + outOnce sync.Once + stopping atomic.Bool +} + +func newBailianASR(model string, api agentCfg) *bailianASR { + return &bailianASR{model: model, api: api, out: make(chan asrEvent, 64), done: make(chan struct{})} +} + +func (a *bailianASR) start(ctx context.Context) error { + dialer := websocket.Dialer{HandshakeTimeout: 10 * time.Second, Proxy: websocket.DefaultDialer.Proxy} + conn, _, err := dialer.DialContext(ctx, a.api.BailianWssBaseURL, + map[string][]string{"Authorization": {"Bearer " + a.api.BailianKey}}) + if err != nil { + return fmt.Errorf("连接百炼 ASR: %w", err) + } + a.conn = conn + conn.SetReadLimit(1 << 20) + _ = conn.SetReadDeadline(time.Now().Add(10 * time.Second)) + context.AfterFunc(ctx, a.close) + started := false + defer func() { + if !started { + a.closeUpstream() + } + }() + a.taskID, err = uuid() + if err != nil { + return err + } + err = a.writeJSON(map[string]any{ + "header": map[string]string{"action": "run-task", "task_id": a.taskID, "streaming": "duplex"}, + "payload": map[string]any{ + "task_group": "audio", "task": "asr", "function": "recognition", + "model": a.model, + "parameters": map[string]any{"format": "pcm", "sample_rate": 16000}, + "input": map[string]any{}, + }, + }) + if err != nil { + return fmt.Errorf("发送 run-task: %w", err) + } + var ev struct { + Header struct { + Event string `json:"event"` + ErrorCode string `json:"error_code"` + ErrorMessage string `json:"error_message"` + } `json:"header"` + } + if err := conn.ReadJSON(&ev); err != nil { + return fmt.Errorf("读取 task-started: %w", err) + } + if ev.Header.Event != "task-started" { + return fmt.Errorf("启动任务失败: %s %s", ev.Header.ErrorCode, ev.Header.ErrorMessage) + } + _ = conn.SetReadDeadline(time.Time{}) + started = true + go a.readLoop() + return nil +} + +func (a *bailianASR) readLoop() { + defer a.closeUpstream() + for { + var ev struct { + Header struct { + Event string `json:"event"` + ErrorCode string `json:"error_code"` + ErrorMessage string `json:"error_message"` + } `json:"header"` + Payload struct { + Output struct { + Sentence struct { + Text string `json:"text"` + SentenceEnd bool `json:"sentence_end"` + } `json:"sentence"` + } `json:"output"` + } `json:"payload"` + } + if err := a.conn.ReadJSON(&ev); err != nil { + if !a.stopping.Load() { + a.emit(asrEvent{Typ: "error", Error: fmt.Sprintf("连接关闭: %v", err)}) + } + return + } + switch ev.Header.Event { + case "result-generated": + s := ev.Payload.Output.Sentence + if s.Text == "" { + continue + } + typ := "partial" + if s.SentenceEnd { + typ = "final" + } + a.emit(asrEvent{Typ: typ, Text: s.Text}) + case "task-failed": + a.emit(asrEvent{Typ: "error", Code: ev.Header.ErrorCode, Error: ev.Header.ErrorMessage}) + return + case "task-finished": + return + } + } +} + +func (a *bailianASR) emit(e asrEvent) { + if e.Typ == "partial" { + select { + case a.out <- e: + default: + } // Intermediate hypotheses can be replaced. + return + } + select { + case a.out <- e: + case <-a.done: + } +} + +func (a *bailianASR) writeJSON(v any) error { + a.wmu.Lock() + defer a.wmu.Unlock() + _ = a.conn.SetWriteDeadline(time.Now().Add(5 * time.Second)) + return a.conn.WriteJSON(v) +} + +func (a *bailianASR) sendAudio(b []byte) error { + a.wmu.Lock() + defer a.wmu.Unlock() + _ = a.conn.SetWriteDeadline(time.Now().Add(5 * time.Second)) + return a.conn.WriteMessage(websocket.BinaryMessage, b) +} + +func (a *bailianASR) finish() error { + return a.writeJSON(map[string]any{ + "header": map[string]string{"action": "finish-task", "task_id": a.taskID, "streaming": "duplex"}, + "payload": map[string]any{"input": map[string]any{}}, + }) +} + +func (a *bailianASR) events() <-chan asrEvent { return a.out } +func (a *bailianASR) close() { + a.stopping.Store(true) + a.closeConn() +} + +func (a *bailianASR) closeConn() { + a.doneOnce.Do(func() { + if a.done != nil { + close(a.done) + } + }) + a.connOnce.Do(func() { + if a.conn != nil { + a.conn.Close() + } + }) +} + +// 只有 readLoop 退出后才能关闭事件通道,避免 close() 与 emit() 并发导致 panic。 +func (a *bailianASR) closeUpstream() { + a.closeConn() + a.outOnce.Do(func() { close(a.out) }) +} diff --git a/services/asr-web/asr_volc.go b/services/asr-web/asr_volc.go new file mode 100644 index 0000000..db20583 --- /dev/null +++ b/services/asr-web/asr_volc.go @@ -0,0 +1,245 @@ +package main + +import ( + "bytes" + "context" + "encoding/binary" + "encoding/json" + "fmt" + "net/http" + "sync" + "sync/atomic" + "time" + + "github.com/gorilla/websocket" +) + +// volcASR: 火山引擎大模型流式语音识别(Doubao-Seed-ASR-Streaming / sauc bigmodel)。 +// 二进制帧: [4B header][可选4B sequence][4B payload size][payload] +// header: ver<<4|hdrUnits, msgType<<4|flags, ser<<4|comp, 0x00 +const ( + volcURL = "wss://openspeech.bytedance.com/api/v3/sauc/bigmodel" + + msgFullClient = 0x1 + msgAudioOnly = 0x2 + msgFullServer = 0x9 + msgError = 0xF + + flagNoSeq = 0x0 // full client request 用 + flagLast = 0x2 // 客户端最后一包音频(负包,无序号) + flagNegWithSeq = 0x3 // 服务端最终帧(负包+序号) + serJSON = 0x1 + compNone = 0x0 + compGzip = 0x1 +) + +type volcASR struct { + cfg agentCfg + conn *websocket.Conn + out chan asrEvent + wmu sync.Mutex + connOnce sync.Once + outOnce sync.Once + done chan struct{} + doneOnce sync.Once + stopping atomic.Bool + emitted map[int]bool // 已作为 final 发出的 utterance 下标 +} + +func newVolcASR(cfg agentCfg) *volcASR { + return &volcASR{cfg: cfg, out: make(chan asrEvent, 64), done: make(chan struct{}), emitted: map[int]bool{}} +} + +func (v *volcASR) start(ctx context.Context) error { + hdr := http.Header{} + if v.cfg.VolcAppKey != "" { // 新版控制台:单一 APP Key + hdr.Set("X-Api-Key", v.cfg.VolcAppKey) + } else if v.cfg.VolcAppID != "" && v.cfg.VolcAccessToken != "" { // 旧版控制台:APP ID + Access Token + hdr.Set("X-Api-App-Key", v.cfg.VolcAppID) + hdr.Set("X-Api-Access-Key", v.cfg.VolcAccessToken) + } else { + return fmt.Errorf("未配置火山凭证:新版控制台设 VOLC_APP_KEY,旧版设 VOLC_APP_ID + VOLC_ACCESS_TOKEN(均需在语音技术控制台获取,非 VOLCENGINE_ACCESS_KEY)") + } + requestID, err := uuid() + if err != nil { + return err + } + connectID, err := uuid() + if err != nil { + return err + } + hdr.Set("X-Api-Resource-Id", v.cfg.VolcResourceID) + hdr.Set("X-Api-Request-Id", requestID) + hdr.Set("X-Api-Connect-Id", connectID) + hdr.Set("X-Api-Sequence", "-1") + + endpoint := v.cfg.VolcWS + if endpoint == "" { + endpoint = volcURL + } + dialer := websocket.Dialer{HandshakeTimeout: 10 * time.Second, Proxy: websocket.DefaultDialer.Proxy} + conn, resp, err := dialer.DialContext(ctx, endpoint, hdr) + if err != nil { + logid := "" + if resp != nil { + logid = resp.Header.Get("X-Tt-Logid") + } + return fmt.Errorf("连接火山 ASR (401/403 多为凭证或资源未开通, logid=%s): %w", logid, err) + } + v.conn = conn + conn.SetReadLimit(1 << 20) + _ = conn.SetWriteDeadline(time.Now().Add(5 * time.Second)) + context.AfterFunc(ctx, v.close) + started := false + defer func() { + if !started { + v.closeUpstream() + } + }() + + req := map[string]any{ + "user": map[string]any{"uid": "voice-test-agent"}, + "audio": map[string]any{"format": "pcm", "rate": 16000, "bits": 16, "channel": 1}, + "request": map[string]any{ + "model_name": "bigmodel", + "enable_itn": true, + "enable_punc": true, + "result_type": "full", + "show_utterances": true, + }, + } + body, _ := json.Marshal(req) + if err := v.conn.WriteMessage(websocket.BinaryMessage, volcFrame(msgFullClient, flagNoSeq, serJSON, compNone, body)); err != nil { + return fmt.Errorf("发送 full client request: %w", err) + } + started = true + go v.readLoop() + return nil +} + +// volcFrame 构造一帧二进制协议。 +func volcFrame(msgType, flags, ser, comp byte, payload []byte) []byte { + buf := bytes.NewBuffer(make([]byte, 0, 12+len(payload))) + buf.WriteByte(0x11) // ver=1, header=1*4B + buf.WriteByte(msgType<<4 | flags) + buf.WriteByte(ser<<4 | comp) + buf.WriteByte(0x00) + binary.Write(buf, binary.BigEndian, uint32(len(payload))) + buf.Write(payload) + return buf.Bytes() +} + +func (v *volcASR) readLoop() { + defer v.closeUpstream() + for { + mt, data, err := v.conn.ReadMessage() + if err != nil { + if !v.stopping.Load() { + v.emit(asrEvent{Typ: "error", Error: fmt.Sprintf("连接关闭: %v", err)}) + } + return + } + if mt != websocket.BinaryMessage { + continue + } + msgType, flags, code, payload, err := decodeVolc(data) + if err != nil { + v.emit(asrEvent{Typ: "error", Error: "invalid upstream ASR frame"}) + return + } + + switch msgType { + case msgFullServer: + var resp struct { + Code int `json:"code"` + Message string `json:"message"` + Result struct { + Text string `json:"text"` + Utterances []struct { + Text string `json:"text"` + Definite bool `json:"definite"` + } `json:"utterances"` + } `json:"result"` + } + if json.Unmarshal(payload, &resp) != nil { + continue + } + if resp.Code != 0 && resp.Code != 20000000 { + v.emit(asrEvent{Typ: "error", Code: fmt.Sprint(resp.Code), Error: resp.Message}) + return + } + // 句级 final:utterance 固化即发出(连续对话不依赖结束帧) + for i, u := range resp.Result.Utterances { + if u.Definite && !v.emitted[i] { + v.emitted[i] = true + v.emit(asrEvent{Typ: "final", Text: u.Text}) + } + } + // partial:最后一个未固化 utterance + if n := len(resp.Result.Utterances); n > 0 && !resp.Result.Utterances[n-1].Definite { + v.emit(asrEvent{Typ: "partial", Text: resp.Result.Utterances[n-1].Text}) + } + // 服务端最终帧(负包):流结束 + if flags == flagLast || flags == flagNegWithSeq { + return + } + case msgError: + v.emit(asrEvent{Typ: "error", Code: fmt.Sprint(code), Error: string(payload)}) + return + } + } +} + +func (v *volcASR) emit(e asrEvent) { + if e.Typ == "partial" { + select { + case v.out <- e: + default: + } + return + } + select { + case v.out <- e: + case <-v.done: + } +} + +func (v *volcASR) sendAudio(b []byte) error { + v.wmu.Lock() + defer v.wmu.Unlock() + _ = v.conn.SetWriteDeadline(time.Now().Add(5 * time.Second)) + return v.conn.WriteMessage(websocket.BinaryMessage, volcFrame(msgAudioOnly, 0, 0, compNone, b)) +} + +func (v *volcASR) finish() error { + // 负包:flags=2,空 payload + v.wmu.Lock() + defer v.wmu.Unlock() + _ = v.conn.SetWriteDeadline(time.Now().Add(5 * time.Second)) + return v.conn.WriteMessage(websocket.BinaryMessage, volcFrame(msgAudioOnly, flagLast, 0, compNone, nil)) +} + +func (v *volcASR) events() <-chan asrEvent { return v.out } +func (v *volcASR) close() { + v.stopping.Store(true) + v.closeConn() +} + +func (v *volcASR) closeConn() { + v.doneOnce.Do(func() { + if v.done != nil { + close(v.done) + } + }) + v.connOnce.Do(func() { + if v.conn != nil { + v.conn.Close() + } + }) +} + +// 只有 readLoop 退出后才能关闭事件通道,避免 close() 与 emit() 并发导致 panic。 +func (v *volcASR) closeUpstream() { + v.closeConn() + v.outOnce.Do(func() { close(v.out) }) +} diff --git a/services/asr-web/config.go b/services/asr-web/config.go new file mode 100644 index 0000000..f6b13f8 --- /dev/null +++ b/services/asr-web/config.go @@ -0,0 +1,77 @@ +package main + +import ( + cryptorand "crypto/rand" + "errors" + "fmt" + "net/url" + "os" + "strings" +) + +// ASR-only subset of the reference configuration. No LLM/TTS fields are imported. +type agentCfg struct { + BailianKey, BailianWssBaseURL string + VolcAppKey, VolcAppID, VolcAccessToken, VolcResourceID, VolcWS string +} + +type config struct { + bailianKey, bailianBase, funASRKey, funASRBase string + volcAppKey, volcAppID, volcToken, volcResourceID, volcWS string +} + +func env(key, fallback string) string { + if v := os.Getenv(key); v != "" { + return v + } + return fallback +} + +func loadConfig() config { + key := os.Getenv("BAILIAN_API_KEY") + return config{ + bailianKey: key, + bailianBase: env("BAILIAN_WS", "wss://dashscope.aliyuncs.com/api-ws/v1/inference/"), + funASRKey: env("FUNASR_API_KEY", key), + funASRBase: env("FUNASR_WS", "wss://dashscope.aliyuncs.com/api-ws/v1/inference/"), + volcAppKey: os.Getenv("VOLC_APP_KEY"), volcAppID: os.Getenv("VOLC_APP_ID"), + volcToken: os.Getenv("VOLC_ACCESS_TOKEN"), + volcResourceID: env("VOLC_RESOURCE_ID", "volc.bigasr.sauc.duration"), + volcWS: env("VOLC_WS", "wss://openspeech.bytedance.com/api/v3/sauc/bigmodel"), + } +} + +func validateConfig(token, origin string, cfg config) error { + if len(token) < 32 || strings.HasPrefix(token, "CHANGE_ME") { + return errors.New("ASR_WEB_TOKEN must be at least 32 characters and not a placeholder") + } + for _, r := range token { + if !(r >= 'a' && r <= 'z' || r >= 'A' && r <= 'Z' || r >= '0' && r <= '9' || r == '-' || r == '_') { + return errors.New("ASR_WEB_TOKEN must use URL-safe alphanumeric characters") + } + } + if origin != "" { + u, err := url.Parse(origin) + if err != nil || (u.Scheme != "https" && u.Scheme != "http") || u.Host == "" || u.User != nil || u.Path != "" || u.RawQuery != "" || u.Fragment != "" { + return errors.New("PUBLIC_ORIGIN must be an exact http(s) origin without a path") + } + } + for _, endpoint := range []string{cfg.bailianBase, cfg.funASRBase, cfg.volcWS} { + u, err := url.Parse(endpoint) + if err != nil || u.Scheme != "wss" || u.Host == "" || u.User != nil { + return errors.New("provider endpoints must use wss without embedded credentials") + } + } + return nil +} + +func uuid() (string, error) { + b := make([]byte, 16) + count, err := cryptorand.Read(b) + if err != nil || count != len(b) { + return "", errors.New("secure random unavailable") + } + b[6] = b[6]&15 | 64 + b[8] = b[8]&63 | 128 + return fmt.Sprintf("%x-%x-%x-%x-%x", b[:4], b[4:6], b[6:8], b[8:10], b[10:]), nil +} diff --git a/services/asr-web/go.mod b/services/asr-web/go.mod new file mode 100644 index 0000000..b7501b6 --- /dev/null +++ b/services/asr-web/go.mod @@ -0,0 +1,5 @@ +module ai-call/asr-web + +go 1.26.2 + +require github.com/gorilla/websocket v1.5.3 diff --git a/services/asr-web/go.sum b/services/asr-web/go.sum new file mode 100644 index 0000000..25a9fc4 --- /dev/null +++ b/services/asr-web/go.sum @@ -0,0 +1,2 @@ +github.com/gorilla/websocket v1.5.3 h1:saDtZ6Pbx/0u+bgYQ3q96pZgCzfhKXGPqt7kZ72aNNg= +github.com/gorilla/websocket v1.5.3/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= diff --git a/services/asr-web/main.go b/services/asr-web/main.go new file mode 100644 index 0000000..6cece85 --- /dev/null +++ b/services/asr-web/main.go @@ -0,0 +1,338 @@ +package main + +import ( + "context" + "crypto/subtle" + "embed" + "encoding/json" + "errors" + "flag" + "io/fs" + "log" + "net/http" + "net/url" + "os" + "os/signal" + "strings" + "sync" + "syscall" + "time" + + "github.com/gorilla/websocket" +) + +//go:embed web/* +var assets embed.FS + +type server struct { + cfg config + token, origin string + slots chan struct{} + newProvider func(string) (asrProvider, error) + sessionLimit time.Duration +} + +type modelOption struct { + ID string `json:"id"` + Enabled bool `json:"enabled"` +} + +func (s *server) bailianCredentials(model string) (string, string) { + if strings.HasPrefix(model, "fun-") { + return s.cfg.funASRKey, s.cfg.funASRBase + } + return s.cfg.bailianKey, s.cfg.bailianBase +} + +func (s *server) models() []modelOption { + out := []modelOption{} + for _, id := range strings.Split(env("BAILIAN_ASR_MODELS", "fun-asr-realtime"), ",") { + id = strings.TrimSpace(id) + if id != "" && id != "volc-bigmodel" { + key, _ := s.bailianCredentials(id) + out = append(out, modelOption{id, key != ""}) + } + } + return append(out, modelOption{"volc-bigmodel", s.cfg.volcAppKey != "" || s.cfg.volcAppID != "" && s.cfg.volcToken != ""}) +} + +func (s *server) provider(id string) (asrProvider, error) { + for _, model := range s.models() { + if model.ID != id { + continue + } + if !model.Enabled { + return nil, errors.New("provider credentials are not configured") + } + if id == "volc-bigmodel" { + return newVolcASR(agentCfg{VolcAppKey: s.cfg.volcAppKey, VolcAppID: s.cfg.volcAppID, VolcAccessToken: s.cfg.volcToken, VolcResourceID: s.cfg.volcResourceID, VolcWS: s.cfg.volcWS}), nil + } + key, endpoint := s.bailianCredentials(id) + return newBailianASR(id, agentCfg{BailianKey: key, BailianWssBaseURL: endpoint}), nil + } + return nil, errors.New("unknown ASR model") +} + +func (s *server) authorized(r *http.Request) bool { + token := strings.TrimPrefix(r.Header.Get("Authorization"), "Bearer ") + for _, protocol := range websocket.Subprotocols(r) { + if strings.HasPrefix(protocol, "auth.") { + token = strings.TrimPrefix(protocol, "auth.") + } + } + return len(token) == len(s.token) && subtle.ConstantTimeCompare([]byte(token), []byte(s.token)) == 1 +} + +func (s *server) sameOrigin(r *http.Request) bool { + origin := r.Header.Get("Origin") + if origin == "" { + return true + } // CLI clients still need the access token. + if s.origin != "" { + return origin == s.origin + } + u, err := url.Parse(origin) + return err == nil && u.User == nil && u.Path == "" && u.RawQuery == "" && u.Fragment == "" && (u.Scheme == "http" || u.Scheme == "https") && u.Host == r.Host +} + +func (s *server) handler(ctx context.Context) http.Handler { + mux := http.NewServeMux() + mux.HandleFunc("GET /healthz", func(w http.ResponseWriter, r *http.Request) { + w.Header().Set("Content-Type", "application/json") + _, _ = w.Write([]byte(`{"status":"ok","scope":"asr-only","llm":false,"tts":false}`)) + }) + mux.HandleFunc("GET /api/models", func(w http.ResponseWriter, r *http.Request) { + if !s.authorized(r) { + http.Error(w, "unauthorized", http.StatusUnauthorized) + return + } + w.Header().Set("Content-Type", "application/json") + _ = json.NewEncoder(w).Encode(s.models()) + }) + mux.HandleFunc("GET /ws", func(w http.ResponseWriter, r *http.Request) { s.serveWS(ctx, w, r) }) + web, _ := fs.Sub(assets, "web") + mux.Handle("GET /", http.FileServerFS(web)) + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + w.Header().Set("X-Content-Type-Options", "nosniff") + w.Header().Set("Referrer-Policy", "no-referrer") + w.Header().Set("Cache-Control", "no-store") + w.Header().Set("Content-Security-Policy", "default-src 'self'; script-src 'self'; style-src 'self'; connect-src 'self'; frame-ancestors 'none'; base-uri 'none'; form-action 'self'") + mux.ServeHTTP(w, r) + }) +} + +func (s *server) serveWS(parent context.Context, w http.ResponseWriter, r *http.Request) { + if !s.authorized(r) { + http.Error(w, "unauthorized", http.StatusUnauthorized) + return + } + if !s.sameOrigin(r) { + http.Error(w, "origin rejected", http.StatusForbidden) + return + } + select { + case s.slots <- struct{}{}: + defer func() { <-s.slots }() + default: + http.Error(w, "session limit reached", http.StatusTooManyRequests) + return + } + up := websocket.Upgrader{Subprotocols: []string{"asr.v1"}, CheckOrigin: s.sameOrigin, HandshakeTimeout: 5 * time.Second} + conn, err := up.Upgrade(w, r, nil) + if err != nil { + return + } + limit := s.sessionLimit + if limit == 0 { + limit = 5 * time.Minute + } + ctx, cancel := context.WithTimeout(parent, limit) + defer cancel() + defer conn.Close() + conn.SetReadLimit(64 << 10) + stopClose := context.AfterFunc(ctx, func() { _ = conn.Close() }) + defer stopClose() + var writeMu sync.Mutex + var stateMu sync.Mutex + var active *asrRun + send := func(expected *asrRun, value any) { + writeMu.Lock() + defer writeMu.Unlock() + stateMu.Lock() + valid := expected == nil || active == expected + stateMu.Unlock() + if !valid || ctx.Err() != nil { + return + } + _ = conn.SetWriteDeadline(time.Now().Add(5 * time.Second)) + if err := conn.WriteJSON(value); err != nil { + cancel() + } + } + stop := func() { + stateMu.Lock() + old := active + active = nil + stateMu.Unlock() + if old != nil { + old.cancel() + old.provider.close() + } + } + defer stop() + send(nil, map[string]any{"type": "ready", "sample_rate": 16000, "channels": 1, "format": "pcm_s16le", "max_session_seconds": int(limit.Seconds()), "llm": false, "tts": false}) + for { + kind, data, err := conn.ReadMessage() + if err != nil { + return + } + if kind == websocket.BinaryMessage { + stateMu.Lock() + run := active + stateMu.Unlock() + if run == nil { + send(nil, map[string]string{"type": "error", "error": "start ASR before sending audio"}) + continue + } + if len(data)%2 != 0 { + send(run, map[string]string{"type": "error", "error": "PCM16 must have an even byte length"}) + continue + } + if err := run.provider.sendAudio(data); err != nil { + send(run, map[string]string{"type": "error", "error": "upstream audio write failed"}) + stop() + } + continue + } + var msg struct { + Type string `json:"type"` + Model string `json:"model"` + } + if kind != websocket.TextMessage || json.Unmarshal(data, &msg) != nil { + send(nil, map[string]string{"type": "error", "error": "invalid control message"}) + continue + } + switch msg.Type { + case "start": + stop() + factory := s.newProvider + if factory == nil { + factory = s.provider + } + p, err := factory(msg.Model) + if err != nil { + send(nil, map[string]string{"type": "error", "error": err.Error()}) + continue + } + runCtx, runCancel := context.WithCancel(ctx) + run := &asrRun{provider: p, cancel: runCancel, ctx: runCtx} + if err := p.start(runCtx); err != nil { + runCancel() + p.close() + send(nil, map[string]string{"type": "error", "error": "ASR start failed; check provider credentials, model and endpoint"}) + continue + } + stateMu.Lock() + active = run + stateMu.Unlock() + send(run, map[string]string{"type": "asr-started", "model": msg.Model}) + go func() { + defer runCancel() + defer p.close() + for { + select { + case <-runCtx.Done(): + return + case ev, ok := <-p.events(): + if !ok { + send(run, map[string]string{"type": "asr-stopped"}) + stateMu.Lock() + if active == run { + active = nil + } + stateMu.Unlock() + return + } + send(run, map[string]string{"type": ev.Typ, "text": ev.Text, "code": ev.Code, "error": ev.Error}) + } + } + }() + case "finish": + stateMu.Lock() + run := active + stateMu.Unlock() + if run != nil { + run.finishOnce.Do(func() { + if err := run.provider.finish(); err != nil { + send(run, map[string]string{"type": "error", "error": "upstream finish failed"}) + stop() + return + } + go func() { + select { + case <-run.ctx.Done(): + case <-time.After(10 * time.Second): + stateMu.Lock() + same := active == run + stateMu.Unlock() + if same { + run.cancel() + run.provider.close() + send(run, map[string]string{"type": "asr-stopped"}) + } + } + }() + }) + } + case "cancel": + stop() + send(nil, map[string]string{"type": "asr-stopped"}) + default: + send(nil, map[string]string{"type": "error", "error": "unsupported command; LLM/TTS are disabled"}) + } + } +} + +type asrRun struct { + provider asrProvider + cancel context.CancelFunc + ctx context.Context + finishOnce sync.Once +} + +func main() { + health := flag.Bool("healthcheck", false, "check local process liveness") + flag.Parse() + if *health { + client := http.Client{Timeout: 2 * time.Second} + resp, err := client.Get("http://127.0.0.1:8080/healthz") + if err != nil { + os.Exit(1) + } + defer resp.Body.Close() + if resp.StatusCode != 200 { + os.Exit(1) + } + return + } + cfg := loadConfig() + token := os.Getenv("ASR_WEB_TOKEN") + origin := os.Getenv("PUBLIC_ORIGIN") + if err := validateConfig(token, origin, cfg); err != nil { + log.Fatal(err) + } + s := &server{cfg: cfg, token: token, origin: origin, slots: make(chan struct{}, 4)} + ctx, stop := signal.NotifyContext(context.Background(), os.Interrupt, syscall.SIGTERM) + defer stop() + srv := &http.Server{Addr: env("ASR_LISTEN", "127.0.0.1:8080"), Handler: s.handler(ctx), ReadHeaderTimeout: 5 * time.Second, IdleTimeout: 60 * time.Second, MaxHeaderBytes: 16 << 10} + go func() { + <-ctx.Done() + deadline, cancel := context.WithTimeout(context.Background(), 10*time.Second) + defer cancel() + _ = srv.Shutdown(deadline) + }() + log.Printf("ASR-only service listening on %s; LLM/TTS disabled", srv.Addr) + if err := srv.ListenAndServe(); err != nil && !errors.Is(err, http.ErrServerClosed) { + log.Fatal(err) + } +} diff --git a/services/asr-web/main_test.go b/services/asr-web/main_test.go new file mode 100644 index 0000000..7530c1d --- /dev/null +++ b/services/asr-web/main_test.go @@ -0,0 +1,219 @@ +package main + +import ( + "bytes" + "compress/gzip" + "context" + "encoding/binary" + "net/http" + "net/http/httptest" + "strings" + "testing" + "time" + + "github.com/gorilla/websocket" +) + +const testToken = "0123456789abcdef0123456789abcdef" + +func TestModelCredentialRouting(t *testing.T) { + t.Setenv("BAILIAN_ASR_MODELS", "fun-asr-realtime,qwen-audio-asr-realtime,volc-bigmodel") + s := &server{cfg: config{funASRKey: "test-fun-key", funASRBase: "wss://fun.test", bailianBase: "wss://bailian.test"}} + models := s.models() + if len(models) != 3 || !models[0].Enabled || models[1].Enabled || models[2].Enabled { + t.Fatalf("credential availability: %+v", models) + } + if _, err := s.provider("qwen-audio-asr-realtime"); err == nil { + t.Fatal("missing Bailian credentials accepted") + } + key, endpoint := s.bailianCredentials("fun-asr-realtime") + if key != "test-fun-key" || endpoint != "wss://fun.test" { + t.Fatal("Fun-ASR routing ignored explicit configuration") + } +} + +func TestHTTPAuthenticationAndCapabilities(t *testing.T) { + s := &server{token: testToken, slots: make(chan struct{}, 1)} + h := s.handler(context.Background()) + for _, path := range []string{"/", "/healthz", "/api/models"} { + r := httptest.NewRequest("GET", path, nil) + w := httptest.NewRecorder() + h.ServeHTTP(w, r) + want := 200 + if path == "/api/models" { + want = 401 + } + if w.Code != want { + t.Fatalf("%s: %d", path, w.Code) + } + } + r := httptest.NewRequest("GET", "/api/models", nil) + r.Header.Set("Authorization", "Bearer "+testToken) + w := httptest.NewRecorder() + h.ServeHTTP(w, r) + if w.Code != 200 { + t.Fatal(w.Code) + } + r.Header.Set("Origin", "https://evil.invalid") + if s.sameOrigin(r) { + t.Fatal("cross origin accepted") + } + if err := validateConfig("short", "", loadConfig()); err == nil { + t.Fatal("short token accepted") + } + if err := validateConfig(testToken, "https://host.invalid/path", loadConfig()); err == nil { + t.Fatal("invalid origin accepted") + } +} + +func TestWebASRPipelineAndDisconnect(t *testing.T) { + upstreamClosed := make(chan struct{}) + upstream := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + up := websocket.Upgrader{} + c, err := up.Upgrade(w, r, nil) + if err != nil { + return + } + defer c.Close() + defer close(upstreamClosed) + var req map[string]any + if c.ReadJSON(&req) != nil { + return + } + if c.WriteJSON(map[string]any{"header": map[string]string{"event": "task-started"}}) != nil { + return + } + for { + kind, _, err := c.ReadMessage() + if err != nil { + return + } + if kind == websocket.BinaryMessage { + _ = c.WriteJSON(map[string]any{"header": map[string]string{"event": "result-generated"}, "payload": map[string]any{"output": map[string]any{"sentence": map[string]any{"text": "离线模拟识别", "sentence_end": true}}}}) + } + } + })) + defer upstream.Close() + s := &server{token: testToken, slots: make(chan struct{}, 1), newProvider: func(id string) (asrProvider, error) { + return newBailianASR(id, agentCfg{BailianKey: "fake", BailianWssBaseURL: "ws" + strings.TrimPrefix(upstream.URL, "http")}), nil + }} + httpServer := httptest.NewServer(s.handler(context.Background())) + defer httpServer.Close() + dialer := websocket.Dialer{Subprotocols: []string{"asr.v1", "auth." + testToken}} + url := "ws" + strings.TrimPrefix(httpServer.URL, "http") + "/ws" + _, response, err := dialer.Dial(url, http.Header{"Origin": []string{"https://evil.invalid"}}) + if err == nil || response.StatusCode != 403 { + t.Fatal("cross-origin websocket not rejected") + } + c, _, err := dialer.Dial(url, nil) + if err != nil { + t.Fatal(err) + } + defer c.Close() + _ = c.SetReadDeadline(time.Now().Add(3 * time.Second)) + var event map[string]any + if err = c.ReadJSON(&event); err != nil || event["type"] != "ready" { + t.Fatalf("ready: %v %v", event, err) + } + if err = c.WriteJSON(map[string]string{"type": "start", "model": "test"}); err != nil { + t.Fatal(err) + } + if err = c.ReadJSON(&event); err != nil || event["type"] != "asr-started" { + t.Fatalf("start: %v %v", event, err) + } + if err = c.WriteMessage(websocket.BinaryMessage, make([]byte, 3200)); err != nil { + t.Fatal(err) + } + if err = c.ReadJSON(&event); err != nil || event["type"] != "final" || event["text"] != "离线模拟识别" { + t.Fatalf("final: %v %v", event, err) + } + _ = c.Close() + select { + case <-upstreamClosed: + case <-time.After(2 * time.Second): + t.Fatal("disconnect leaked upstream socket") + } +} + +func TestStartCancellation(t *testing.T) { + ready := make(chan struct{}) + upstream := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + up := websocket.Upgrader{} + c, err := up.Upgrade(w, r, nil) + if err != nil { + return + } + defer c.Close() + _, _, _ = c.ReadMessage() + close(ready) + _, _, _ = c.ReadMessage() + })) + defer upstream.Close() + a := newBailianASR("test", agentCfg{BailianWssBaseURL: "ws" + strings.TrimPrefix(upstream.URL, "http")}) + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + result := make(chan error, 1) + go func() { result <- a.start(ctx) }() + <-ready + cancel() + select { + case err := <-result: + if err == nil { + t.Fatal("canceled start succeeded") + } + case <-time.After(2 * time.Second): + t.Fatal("start ignored cancellation") + } +} + +func TestFinalEventBackpressureAndClose(t *testing.T) { + a := newBailianASR("test", agentCfg{}) + for i := 0; i < cap(a.out); i++ { + a.out <- asrEvent{Typ: "partial"} + } + done := make(chan struct{}) + go func() { a.emit(asrEvent{Typ: "final", Text: "must keep"}); close(done) }() + <-a.out + select { + case <-done: + case <-time.After(time.Second): + t.Fatal("final delivery blocked") + } + found := false + for len(a.out) > 0 { + if (<-a.out).Typ == "final" { + found = true + } + } + if !found { + t.Fatal("final event silently dropped") + } + a.close() + a.close() + a.closeUpstream() +} + +func TestVolcFrameBounds(t *testing.T) { + frame := volcFrame(msgFullServer, flagLast, serJSON, compNone, []byte(`{"result":{}}`)) + typ, flags, _, payload, err := decodeVolc(frame) + if err != nil || typ != msgFullServer || flags != flagLast || string(payload) != `{"result":{}}` { + t.Fatal("last frame without sequence rejected", err) + } + for n := 0; n < len(frame); n++ { + if _, _, _, _, err := decodeVolc(frame[:n]); err == nil { + t.Fatalf("truncated length %d accepted", n) + } + } + bad := append([]byte(nil), frame...) + binary.BigEndian.PutUint32(bad[4:8], 0xffffffff) + if _, _, _, _, err := decodeVolc(bad); err == nil { + t.Fatal("oversized length accepted") + } + var b bytes.Buffer + w := gzip.NewWriter(&b) + _, _ = w.Write(make([]byte, (1<<20)+1)) + _ = w.Close() + if _, _, _, _, err := decodeVolc(volcFrame(msgFullServer, 0, serJSON, compGzip, b.Bytes())); err == nil { + t.Fatal("gzip expansion not bounded") + } +} diff --git a/services/asr-web/volc_frame.go b/services/asr-web/volc_frame.go new file mode 100644 index 0000000..125e5ae --- /dev/null +++ b/services/asr-web/volc_frame.go @@ -0,0 +1,60 @@ +package main + +import ( + "bytes" + "compress/gzip" + "encoding/binary" + "errors" + "io" +) + +// Reject truncated, oversized or compressed-bomb frames before slicing payloads. +func decodeVolc(data []byte) (typ, flags byte, code uint32, payload []byte, err error) { + invalid := errors.New("invalid ASR frame") + if len(data) < 8 || data[0]>>4 != 1 { + return 0, 0, 0, nil, invalid + } + typ, flags = data[1]>>4, data[1]&15 + off := int(data[0]&15) * 4 + if off < 4 || off > len(data) || (typ != msgFullServer && typ != msgError) { + return 0, 0, 0, nil, invalid + } + if flags&1 != 0 { + off += 4 + } // Bit 1 means last packet; it does not imply a sequence field. + if off > len(data) { + return 0, 0, 0, nil, invalid + } + if typ == msgError { + if off+4 > len(data) { + return 0, 0, 0, nil, invalid + } + code = binary.BigEndian.Uint32(data[off : off+4]) + off += 4 + } + if off+4 > len(data) { + return 0, 0, 0, nil, invalid + } + size := uint64(binary.BigEndian.Uint32(data[off : off+4])) + off += 4 + if size > 1<<20 || size != uint64(len(data)-off) { + return 0, 0, 0, nil, invalid + } + payload = data[off:] + switch data[2] & 15 { + case compNone: + case compGzip: + reader, e := gzip.NewReader(bytes.NewReader(payload)) + if e != nil { + return 0, 0, 0, nil, invalid + } + payload, e = io.ReadAll(io.LimitReader(reader, (1<<20)+1)) + closeErr := reader.Close() + if e != nil || closeErr != nil || len(payload) > 1<<20 { + return 0, 0, 0, nil, invalid + } + default: + return 0, 0, 0, nil, invalid + } + return typ, flags, code, payload, nil +} diff --git a/services/asr-web/web/app.js b/services/asr-web/web/app.js new file mode 100644 index 0000000..9c3f8cc --- /dev/null +++ b/services/asr-web/web/app.js @@ -0,0 +1,176 @@ +const $ = (id) => document.getElementById(id); +let current = null; +function status(text) { + $("status").textContent = text; +} +function controls(busy) { + $("start").disabled = busy || !$("model").value; + $("load").disabled = busy; + $("model").disabled = busy; + $("finish").disabled = !busy; + $("cancel").disabled = !busy; +} +async function stopMic(s) { + s.stream?.getTracks().forEach((track) => track.stop()); + s.stream = null; + s.node?.disconnect(); + s.node = null; + if (s.context && s.context.state !== "closed") + await s.context.close().catch(() => {}); +} +async function cleanup(s, message) { + if (s.closed) return; + s.closed = true; + await stopMic(s); + if (s.ws && s.ws.readyState < WebSocket.CLOSING) s.ws.close(); + if (current === s) { + current = null; + controls(false); + if (message) status(message); + } +} +$("load").addEventListener("click", async () => { + try { + const token = $("token").value.trim(); + const response = await fetch("/api/models", { + headers: { Authorization: `Bearer ${token}` }, + }); + if (!response.ok) + throw new Error( + response.status === 401 ? "访问令牌无效" : "读取模型失败", + ); + const models = await response.json(); + $("model").replaceChildren(); + let available = 0; + for (const model of models) { + const option = document.createElement("option"); + option.value = model.id; + option.textContent = `${model.id}${model.enabled ? "" : "(服务端未配置凭据)"}`; + option.disabled = !model.enabled; + $("model").append(option); + if (model.enabled) available++; + } + const enabled = [...$("model").options].find((o) => !o.disabled); + $("model").value = enabled?.value || ""; + controls(false); + status( + available ? "配置已读取,可开始测试" : "没有可用凭据;LLM/TTS 未启用", + ); + } catch (error) { + status(error.message); + } +}); +$("model").addEventListener("change", () => controls(false)); +$("start").addEventListener("click", async () => { + if (current) return; + if (!window.isSecureContext || !navigator.mediaDevices?.getUserMedia) { + status( + "麦克风需要 HTTPS 或 localhost。可使用 SSH 隧道,不要关闭浏览器安全设置。", + ); + return; + } + const token = $("token").value.trim(); + if (!/^[A-Za-z0-9_-]{32,}$/.test(token)) { + status("请输入有效的服务访问令牌"); + return; + } + const s = { closed: false }; + current = s; + controls(true); + status("正在请求麦克风…"); + try { + const stream = await navigator.mediaDevices.getUserMedia({ + audio: { + channelCount: 1, + echoCancellation: true, + noiseSuppression: true, + }, + video: false, + }); + if (s.closed) { + stream.getTracks().forEach((track) => track.stop()); + return; + } + s.stream = stream; + s.context = new AudioContext({ sampleRate: 16000 }); + if (s.context.sampleRate !== 16000) + throw new Error("浏览器无法提供 16 kHz 音频,已停止,避免发送错误采样率"); + await s.context.audioWorklet.addModule("/pcm-worklet.js"); + if (s.closed) return; + const ws = new WebSocket( + `${location.protocol === "https:" ? "wss:" : "ws:"}//${location.host}/ws`, + ["asr.v1", `auth.${token}`], + ); + s.ws = ws; + ws.binaryType = "arraybuffer"; + ws.onclose = () => { + void cleanup(s, "连接已结束"); + }; + ws.onerror = () => { + void cleanup(s, "WebSocket 连接失败,请检查访问令牌、Origin 和服务状态"); + }; + ws.onopen = () => { + if (!s.closed) + ws.send(JSON.stringify({ type: "start", model: $("model").value })); + }; + ws.onmessage = async (event) => { + if (s.closed || typeof event.data !== "string") return; + try { + const data = JSON.parse(event.data); + if (data.type === "asr-started") { + s.node = new AudioWorkletNode(s.context, "pcm16"); + s.node.port.onmessage = ({ data: pcm }) => { + if (s.closed || ws.readyState !== WebSocket.OPEN) return; + if (ws.bufferedAmount > 256 * 1024) { + void cleanup(s, "网络积压过多,已停止采集"); + return; + } + ws.send(pcm); + }; + s.context.createMediaStreamSource(stream).connect(s.node); + s.node.connect(s.context.destination); + await s.context.resume(); + $("audio").textContent = + `音频:${s.context.sampleRate} Hz / 单声道 / PCM16 / 每包 100ms`; + status("正在识别(最长5分钟)"); + } else if (data.type === "partial") { + $("partial").textContent = data.text; + } else if (data.type === "final") { + const line = document.createElement("p"); + line.textContent = data.text; + $("finals").append(line); + if ($("finals").children.length > 100) + $("finals").firstElementChild.remove(); + $("partial").textContent = "等待下一句…"; + } else if (data.type === "error") { + await cleanup(s, data.error || "上游识别错误"); + } else if (data.type === "asr-stopped") { + await cleanup(s, "本轮识别结束"); + } + } catch { + await cleanup(s, "音频初始化或服务消息处理失败"); + } + }; + } catch (error) { + await cleanup(s, error.message); + } +}); +$("finish").addEventListener("click", async () => { + const s = current; + if (!s) return; + await stopMic(s); + $("finish").disabled = true; + if (s.ws?.readyState === WebSocket.OPEN) { + s.ws.send(JSON.stringify({ type: "finish" })); + status("已停止麦克风,等待最终结果…"); + } else await cleanup(s, "已取消尚未就绪的连接"); +}); +$("cancel").addEventListener("click", () => { + if (current) void cleanup(current, "已取消"); +}); +window.addEventListener("pagehide", () => { + if (current) { + current.stream?.getTracks().forEach((track) => track.stop()); + current.ws?.close(); + } +}); diff --git a/services/asr-web/web/index.html b/services/asr-web/web/index.html new file mode 100644 index 0000000..afa6733 --- /dev/null +++ b/services/asr-web/web/index.html @@ -0,0 +1,16 @@ + + +AI Call · ASR 接入验证 +

+

AI CALL / 参数验证

ASR 语音接入测试

麦克风 → 16 kHz 单声道 PCM → ASR。此页面不是电话外呼,也不代表 MQ/OSS 已对接。

+

连接参数

+ + + +

供应商密钥与上游地址只在服务端配置。使用 HTTPS 或 localhost;不要关闭浏览器安全机制。

+
+

未连接

音频:未采集

+
+

识别结果

等待语音…

+

尚未启用

LLM / TTS:等待用户新规范,未沿用调研仓库实现,也不会自动发起相关请求。

+
diff --git a/services/asr-web/web/pcm-worklet.js b/services/asr-web/web/pcm-worklet.js new file mode 100644 index 0000000..e8d4f4c --- /dev/null +++ b/services/asr-web/web/pcm-worklet.js @@ -0,0 +1,28 @@ +class PCM16Processor extends AudioWorkletProcessor { + constructor() { + super(); + this.buffer = new ArrayBuffer(3200); + this.view = new DataView(this.buffer); + this.offset = 0; + } + process(inputs) { + const samples = inputs[0]?.[0]; + if (!samples) return true; + for (const sample of samples) { + const value = Math.max(-1, Math.min(1, sample)); + this.view.setInt16( + this.offset * 2, + value < 0 ? value * 32768 : value * 32767, + true, + ); + if (++this.offset === 1600) { + this.port.postMessage(this.buffer, [this.buffer]); + this.buffer = new ArrayBuffer(3200); + this.view = new DataView(this.buffer); + this.offset = 0; + } + } + return true; // Output stays silent; no microphone feedback to the speakers. + } +} +registerProcessor("pcm16", PCM16Processor); diff --git a/services/asr-web/web/style.css b/services/asr-web/web/style.css new file mode 100644 index 0000000..baffcfd --- /dev/null +++ b/services/asr-web/web/style.css @@ -0,0 +1 @@ +:root{font:16px/1.6 system-ui,sans-serif;color:#16263c;background:#f3f6fa}*{box-sizing:border-box}body{margin:0}main{max-width:840px;margin:40px auto;padding:0 20px}header{margin-bottom:28px}.eyebrow{font-size:12px;letter-spacing:.18em;color:#376791}h1{font-size:32px;margin:8px 0}h2{font-size:19px;margin:0 0 16px}section{background:white;border:1px solid #dce4ed;border-radius:12px;padding:24px;margin:18px 0}label{display:block;margin:16px 0 6px}input,select{width:100%;padding:11px;border:1px solid #aebdce;border-radius:6px;font:inherit}button{background:#245c96;color:white;border:0;border-radius:6px;padding:10px 16px;margin:12px 8px 0 0;cursor:pointer;font:inherit}button:disabled{opacity:.45;cursor:not-allowed}button:focus-visible,input:focus-visible,select:focus-visible{outline:3px solid #e59a26;outline-offset:3px}.note,#audio{font-size:13px;color:#586b82}#status{font-weight:600}#partial{color:#45698c;min-height:28px}#finals p{padding:10px 0;border-top:1px solid #e5ebf2;overflow-wrap:anywhere}@media(max-width:520px){main{margin:20px auto}section{padding:18px}h1{font-size:26px}} diff --git a/tests/test_deployment.py b/tests/test_deployment.py new file mode 100644 index 0000000..fdc30fa --- /dev/null +++ b/tests/test_deployment.py @@ -0,0 +1,275 @@ +import copy +import json +import tempfile +import unittest +from pathlib import Path + +from deploy import aliyun_host as cloud +from deploy import render_asterisk as ast + + +def config(): + return { + "region": cloud.REGION, + "public_ip": cloud.PUBLIC_IP, + "project_tag": "ai-call", + "image_id": "m-test", + "instance_type": "ecs.test", + "vswitch_id": "vsw-test", + "security_group_id": "sg-test", + "key_pair_name": "test-key", + "spot_price_limit": 0.1, + } + + +def instance(id="i-test", tagged=True): + return { + "InstanceId": id, + "Status": "Running", + "Tags": { + "Tag": [{"TagKey": "project", "TagValue": "ai-call"}] if tagged else [] + }, + } + + +class FakeCloud: + def __init__(self): + self.address = { + "IpAddress": cloud.PUBLIC_IP, + "AllocationId": "eip-test", + "Status": "Available", + "InstanceId": "", + "InstanceType": "EcsInstance", + } + self.rows = [] + self.calls = [] + self.fail_bind = False + self.timeout_create = False + + def __call__(self, product, action, **params): + self.calls.append((action, params)) + if action == "DescribeEipAddresses": + rows = [copy.deepcopy(self.address)] if self.address else [] + return {"TotalCount": len(rows), "EipAddresses": {"EipAddress": rows}} + if action == "DescribeInstances": + rows = copy.deepcopy(self.rows) + if "InstanceIds" in params: + rows = [r for r in rows if r["InstanceId"] in params["InstanceIds"]] + return {"TotalCount": len(rows), "Instances": {"Instance": rows}} + if action == "RunInstances": + if self.timeout_create: + raise cloud.CloudError("simulated transport timeout") + self.rows = [instance("i-created")] + return {"InstanceIdSets": {"InstanceIdSet": ["i-created"]}} + if action == "AssociateEipAddress": + if self.fail_bind: + raise cloud.CloudError("simulated association failure") + self.address.update(InstanceId=params["InstanceId"], Status="InUse") + return {} + raise AssertionError("Unexpected cloud mutation: " + action) + + def mutations(self): + return [name for name, _ in self.calls if not name.startswith("Describe")] + + +class CloudTests(unittest.TestCase): + def test_plan_is_read_only(self): + api = FakeCloud() + self.assertEqual(cloud.plan(config(), api)["action"], "create_and_bind") + self.assertEqual(api.mutations(), []) + + def test_reuse_owned_bound_instance(self): + api = FakeCloud() + api.rows = [instance()] + api.address.update(InstanceId="i-test", Status="InUse") + with tempfile.TemporaryDirectory() as d: + result = cloud.apply(config(), api, Path(d) / "state.json") + self.assertEqual(result["action"], "reuse") + self.assertEqual(api.mutations(), []) + + def test_foreign_attachment_is_never_stolen(self): + api = FakeCloud() + api.rows = [instance(tagged=False)] + api.address.update(InstanceId="i-test", Status="InUse") + with self.assertRaises(cloud.CloudError): + cloud.plan(config(), api) + self.assertEqual(api.mutations(), []) + + def test_no_fixed_ip_means_no_creation(self): + api = FakeCloud() + api.address = {} + with self.assertRaises(cloud.CloudError): + cloud.plan(config(), api) + self.assertEqual(api.mutations(), []) + + def test_existing_non_eip_needs_explicit_adoption(self): + api = FakeCloud() + api.address = {} + row = instance(tagged=False) + row["PublicIpAddress"] = {"IpAddress": [cloud.PUBLIC_IP]} + api.rows = [row] + cfg = config() + with self.assertRaises(cloud.CloudError): + cloud.plan(cfg, api) + cfg["adopt_instance_id"] = "i-test" + self.assertEqual(cloud.plan(cfg, api)["ip_kind"], "instance_public_ip") + + def test_duplicate_candidates_stop(self): + api = FakeCloud() + api.rows = [instance("i-one"), instance("i-two")] + with self.assertRaises(cloud.CloudError): + cloud.plan(config(), api) + + def test_create_spot_without_new_public_ip_then_bind(self): + api = FakeCloud() + with tempfile.TemporaryDirectory() as d: + path = Path(d) / "state.json" + result = cloud.apply(config(), api, path, sleep=lambda _: None) + state = json.loads(path.read_text()) + self.assertEqual(state["instance_id"], "i-created") + self.assertEqual(path.stat().st_mode & 0o777, 0o600) + self.assertEqual(result["action"], "ready") + params = next(params for name, params in api.calls if name == "RunInstances") + self.assertEqual(params["Amount"], 1) + self.assertEqual(params["InternetMaxBandwidthOut"], 0) + self.assertEqual(params["SpotStrategy"], "SpotWithPriceLimit") + self.assertEqual(params["SpotPriceLimit"], 0.1) + self.assertEqual(api.mutations(), ["RunInstances", "AssociateEipAddress"]) + + def test_create_timeout_reuses_client_token(self): + api = FakeCloud() + api.timeout_create = True + with tempfile.TemporaryDirectory() as d: + path = Path(d) / "state.json" + for _ in range(2): + with self.assertRaises(cloud.CloudError): + cloud.apply(config(), api, path, sleep=lambda _: None) + tokens = [p["ClientToken"] for name, p in api.calls if name == "RunInstances"] + self.assertEqual(len(tokens), 2) + self.assertEqual(tokens[0], tokens[1]) + + def test_bind_failure_reuses_created_host(self): + api = FakeCloud() + api.fail_bind = True + with tempfile.TemporaryDirectory() as d: + path = Path(d) / "state.json" + with self.assertRaises(cloud.CloudError): + cloud.apply(config(), api, path, sleep=lambda _: None) + api.fail_bind = False + result = cloud.apply(config(), api, path, sleep=lambda _: None) + self.assertEqual(result["action"], "ready") + self.assertEqual(api.mutations().count("RunInstances"), 1) + + def test_stopped_host_and_bad_budget_do_not_create(self): + api = FakeCloud() + cfg = config() + cfg["spot_price_limit"] = None + with tempfile.TemporaryDirectory() as d, self.assertRaises(cloud.CloudError): + cloud.apply(cfg, api, Path(d) / "state.json", sleep=lambda _: None) + self.assertEqual(api.mutations(), []) + api.rows = [instance()] + api.rows[0]["Status"] = "Stopped" + with tempfile.TemporaryDirectory() as d, self.assertRaises(cloud.CloudError): + cloud.apply(config(), api, Path(d) / "state.json", sleep=lambda _: None) + self.assertEqual(api.mutations(), []) + + def test_incomplete_inventory_does_not_create(self): + api = FakeCloud() + + def incomplete(product, action, **params): + if action == "DescribeInstances": + return {"TotalCount": 2, "Instances": {"Instance": []}} + return api(product, action, **params) + + with self.assertRaises(cloud.CloudError): + cloud.plan(config(), incomplete) + self.assertEqual(api.mutations(), []) + + def test_missing_allocation_id_stops_before_creation(self): + api = FakeCloud() + api.address.pop("AllocationId") + with self.assertRaises(cloud.CloudError): + cloud.plan(config(), api) + self.assertEqual(api.mutations(), []) + + def test_binding_race_does_not_detach_foreign_host(self): + api = FakeCloud() + reads = 0 + + def raced(product, action, **params): + nonlocal reads + if action == "DescribeEipAddresses": + reads += 1 + if reads == 2: + api.address.update(InstanceId="i-foreign", Status="InUse") + return api(product, action, **params) + + with tempfile.TemporaryDirectory() as d: + path = Path(d) / "state.json" + with self.assertRaises(cloud.CloudError): + cloud.apply(config(), raced, path, sleep=lambda _: None) + self.assertEqual(json.loads(path.read_text())["instance_id"], "i-created") + self.assertEqual(api.mutations(), ["RunInstances"]) + + def test_region_mismatch(self): + cfg = config() + cfg["region"] = "cn-hangzhou" + with self.assertRaises(cloud.CloudError): + cloud.plan(cfg, FakeCloud()) + + +class AsteriskTests(unittest.TestCase): + def cfg(self): + return { + "public_ip": cloud.PUBLIC_IP, + "transport": "udp", + "local_net": "10.1.0.0/16", + "primary": {"host": "sip-a.test", "auth_mode": "ip"}, + "backup": {"host": "sip-b.test", "auth_mode": "ip"}, + } + + def test_private_ari_fixed_nat_and_recording_config(self): + files = ast.render(self.cfg(), {"ARI_PASSWORD": "x" * 32}) + self.assertEqual(len(files), 5) + self.assertIn("bindaddr=127.0.0.1", files["http.conf"]) + self.assertIn("external_media_address=123.56.71.98", files["pjsip.conf"]) + self.assertIn("context=deny-inbound", files["pjsip.conf"]) + self.assertIn("strictrtp=yes", files["rtp.conf"]) + with tempfile.TemporaryDirectory() as d: + path = Path(d) / "generated" + ast.write_config(files, path) + self.assertEqual((path / "ari.conf").stat().st_mode & 0o777, 0o600) + with self.assertRaises(ValueError): + ast.write_config(files, path) + + def test_reject_injection_public_ari_and_our_ip_as_provider(self): + for update in ( + {"ari_bind": "0.0.0.0"}, + {"ari_bind": "8.8.8.8"}, + {"local_net": "0.0.0.0/0"}, + ): # noqa: S104 — negative fixtures; renderer must reject them. + cfg = self.cfg() + cfg.update(update) + with self.assertRaises(ValueError): + ast.render(cfg, {"ARI_PASSWORD": "x" * 32}) + for host in ("123.56.71.98", "host\n[evil]", ""): + cfg = self.cfg() + cfg["primary"]["host"] = host + with self.assertRaises(ValueError): + ast.render(cfg, {"ARI_PASSWORD": "x" * 32}) + + def test_digest_registration(self): + cfg = self.cfg() + cfg["primary"].update( + auth_mode="digest", username="approved-user", register=True + ) + files = ast.render( + cfg, + {"ARI_PASSWORD": "x" * 32, "SIP_PRIMARY_PASSWORD": "vendor-pass-123456"}, + ) + self.assertIn("outbound_auth=provider-primary-auth", files["pjsip.conf"]) + self.assertIn("type=registration", files["pjsip.conf"]) + + +if __name__ == "__main__": + unittest.main() diff --git a/tests/test_pcm.cjs b/tests/test_pcm.cjs new file mode 100644 index 0000000..68cabb1 --- /dev/null +++ b/tests/test_pcm.cjs @@ -0,0 +1,40 @@ +const test = require("node:test"); +const assert = require("node:assert/strict"); +const fs = require("node:fs"); +const vm = require("node:vm"); +const path = require("node:path"); + +test("AudioWorklet emits independent 100ms little-endian PCM16 packets", () => { + const packets = []; + let Processor; + vm.runInNewContext( + fs.readFileSync( + path.join(__dirname, "../services/asr-web/web/pcm-worklet.js"), + "utf8", + ), + { + AudioWorkletProcessor: class { + constructor() { + this.port = { postMessage: (buffer) => packets.push(buffer) }; + } + }, + registerProcessor: (_name, implementation) => { + Processor = implementation; + }, + }, + ); + const processor = new Processor(); + assert.equal(processor.process([]), true); + const samples = new Float32Array(3200); + samples[0] = -1; + samples[1] = 1; + samples[2] = 0.5; + processor.process([[samples]]); + assert.equal(packets.length, 2); + assert.notEqual(packets[0], packets[1]); + assert.equal(packets[0].byteLength, 3200); + const view = new DataView(packets[0]); + assert.equal(view.getInt16(0, true), -32768); + assert.equal(view.getInt16(2, true), 32767); + assert.equal(view.getInt16(4, true), 16383); +});