Files
story/docs/火山硬件对话智能体迁移设计.md
T
Codex Local 0c2151ace9
ci / verify (push) Canceled after 0s
chore: checkpoint 第一版
2026-09-06 17:04:11 +08:00

497 lines
25 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 火山硬件对话智能体迁移设计
> 状态:方案评审稿
> 适用基线:`v0.70.0-rc.1`
> 编制日期:2026-08-31
## 1. 结论
本次迁移建议采用“保留业务控制面,替换会话执行面”的方式,不对现有平台做推倒重建。
- 保留:设备身份与绑定、家庭和长者档案、授权、通话主记录、配置灰度、字幕存储、摘要/故事/事实候选、人工确认记忆、隐私导出删除、录音管理、费用额度、告警、诊断、固件和审计。
- 替换:设备领取 RTC Token、设备加入平台分配的 RTC 房间、平台 Worker 调用 `StartVoiceChat/StopVoiceChat`、Agent RTC 用户和 RTC Task 对账。
- 新增:火山产品/设备/Bot/License 映射、硬件智能体设备凭证生命周期、硬件会话适配器、动态会话配置、MCP/Function Calling 工具网关、硬件会话事件和用量归集。
- 兼容:旧 RTC VoiceChat 链路和新硬件智能体链路至少并行一个灰度周期,按设备能力位和灰度配置选择,不按固件版本猜测。
推荐终端优先采用火山硬件智能体“高质量方案”(UDP/RTC)。现有终端本身已有 RTC、弱网恢复和网络切换验收基础,和该方案的目标更一致。火山官方同时提供低负载 WebSocket 方案;只有在量产板的 RAM、CPU、功耗或网络实测不满足高质量 SDK 时,才切换到低负载方案。官方对比说明高质量方案弱网和实时互动更好,低负载方案资源消耗更低。[火山官方 SDK 集成指引](https://www.volcengine.com/docs/6348/1913817?lang=zh)
## 2. 当前链路与目标链路
### 2.1 当前链路
```text
设备 -> 平台创建通话 -> 平台签发 RTC Token -> 设备加入 RTC 房间
-> 设备确认入房 -> Worker 调用 StartVoiceChat -> 豆包 Agent 入房
-> 火山/设备回传字幕和状态 -> 平台存储与内容处理
-> 设备或平台发起停止 -> Worker 调用 StopVoiceChat -> 通话终态
```
当前关键实现:
- `/device/v2/conversations` 创建通话并返回 RTC Grant;
- `/activate` 在设备入房后可靠投递 `conversation.agent_start_requested`;
- `voiceprovider.VolcengineClient` 把平台稳定任务契约映射为 `StartVoiceChat/StopVoiceChat`;
- RTC 房间、设备 RTC 用户、Agent RTC 用户和供应商 Task 是诊断主关联键;
- 最终字幕进入 `conversation_turn`,继续触发摘要、故事、事实和记忆流水线。
### 2.2 目标链路
```text
设备 -> 平台准备硬件会话并冻结授权/配置/背景
-> 设备使用火山硬件智能体 SDK 直连 Bot
-> SDK 收发音频并提供字幕、状态、Function Calling 事件
-> 设备把最终字幕和状态回传平台
-> Bot 通过 MCP/Function Calling 访问平台受控记忆/业务工具
-> 用户、平台或授权撤回触发停止 -> 设备关闭 SDK 会话 -> 平台收敛终态
```
火山硬件智能体的标准协议使用 `product_key + device_name + device_secret` 建立设备身份,连接时指定与产品关联的 `bot`。设备首次可通过 `DynamicRegister` 获取设备独享密钥;WebSocket 标准协议支持字幕事件、端侧 Function Calling、主动播报和文本提问。[火山标准协议文档](https://www.volcengine.com/docs/6348/1904602?lang=zh)
## 3. 架构原则
### 3.1 平台数据库仍是业务事实唯一主库
火山侧负责实时对话执行,不成为家庭、长者、授权、记忆和费用策略的主数据源。平台必须保存每次会话实际使用的:
- 产品、设备、Bot 和 License 的脱敏引用;
- 平台路由版本、角色版本、声音版本、模型版本和提示词版本;
- 发送给火山的会话配置摘要及 SHA-256;
- 授权和背景资料冻结快照;
- 火山会话 ID、传输方案、状态时间线、字幕来源和用量来源。
### 3.2 设备必须先通过平台业务门禁,再连接智能体
设备拥有火山凭证不等于拥有业务授权。每次对话前仍必须先调用平台准备接口,由平台检查:
- 设备已登记、未隔离、未吊销并已绑定长者;
- 固件和硬件智能体 SDK 版本满足最低要求;
- `voice_chat` 授权有效;
- 客户组织、设备并发、时长和费用额度未超限;
- 角色、模型、音色和 Bot 路由已发布;
- 背景资料和记忆快照生成成功或按既定规则无记忆降级。
平台拒绝准备时,设备不得调用火山 SDK 建立对话。
### 3.3 不把长期记忆主库直接迁到火山
现有记忆包含人工确认、授权撤回、版本、来源、租户/长者隔离和隐私删除证明。迁移后继续使用平台 `pgvector` 和记忆工具:
- 会话启动时,把已授权的短背景摘要作为动态会话参数注入;
- 通话中通过平台 MCP/Function Calling 工具查询记忆;
- 工具令牌绑定 `conversation_id + provider_session_id + device_id + subject_id`,短期有效;
- 模型只能提交查询内容,不能自行指定租户或长者;
- 火山原生长期记忆只可作为可删除、可对账的派生缓存,不能成为主库。
火山硬件智能体产品能力包含 MCP、联网问答、长期记忆和设备管理,但这不改变本项目的业务数据权威边界。[火山硬件智能体产品页](https://www.volcengine.com/product/ConversationalAI-Embedded)
## 4. 功能迁移矩阵
| 现有功能 | 迁移方式 | 新责任边界 | 结论 |
|---|---|---|---|
| 设备 HMAC 身份、绑定、家庭归属 | 原样保留;新增火山设备映射 | 平台仍负责业务身份,火山凭证只负责智能体建连 | 保留并扩展 |
| `/bootstrap`、配置、命令、遥测 | 原样保留,增加硬件智能体能力位和 SDK 信息 | 平台 | 保留 |
| RTC 房间分配与 Token | 新运行时不再使用 | 火山硬件 SDK 自行建连 | 新链路废弃 |
| `StartVoiceChat/StopVoiceChat` | 新运行时不再调用;旧链路继续兼容 | 设备 SDK / 火山硬件智能体 | 新链路废弃 |
| `s2s_pure/s2s_hybrid/cascade` | 不再作为设备会话模式;改为平台内部服务档位或 Bot/模型配置 | 平台路由 + 火山 Bot | 重定义 |
| 角色、提示词、模型、音色灰度 | 平台继续版本化;基础配置同步 Bot,会话差异通过动态参数注入 | 平台为权威,火山为执行副本 | 保留并改造 |
| 欢迎语、主动播报 | 使用 Bot/会话配置;本地系统提示可用 `input_tts` | 火山 SDK + 设备应用 | 迁移 |
| 背景资料冻结 | 准备会话时生成;等待 `session.updated` 后才开放麦克风 | 平台生成,设备注入 | 保留并改造 |
| 实时打断、VAD、ASR、TTS | 使用火山硬件智能体原生能力 | 火山 | 下沉 |
| 最终字幕 | 设备监听最终事件,写入本地加密队列,批量调用现有 `turns:batch` | 设备可靠上传,平台去重存储 | 保留并改造 |
| 字幕服务端回调 | 若火山提供则作为第二来源,按供应商事件 ID 去重 | 火山回调 + 平台 | 待商务/技术确认 |
| 摘要、开放话题、故事、事实候选 | 输入仍为平台最终话轮 | 平台 Worker | 原样保留 |
| 人工确认记忆、向量检索 | 继续使用现有数据库和流程 | 平台 | 原样保留 |
| 通话中记忆工具 | 从 VoiceChat 模板 URL 改为 MCP/Function Calling 工具网关 | 平台工具网关 | 改造 |
| 设备音量、诊断等指令 | 云端命令链保留;安全的本地动作可同时暴露为端侧 FC | 平台命令 + 设备白名单执行器 | 扩展 |
| 授权撤回停止 | 心跳返回 stop,设备关闭 SDK;必须补充服务端强制终止或凭证吊销 | 平台发令,火山/设备执行 | 关键改造 |
| 双轨录音 | 需验证 SDK 是否提供近端采集和远端解码 PCM 回调 | 设备录制 + 对象存储 | 有条件迁移 |
| 用量与费用 | 增加 License、AI 对话时长和模型用量来源;区分估算与账单 | 平台费用域 | 改造 |
| 诊断工作台 | 房间/Task 改为产品、设备、Bot、License、会话、传输和事件 | 平台 | 改造 |
| 配置灰度与回滚 | 增加 `hardware_agent` 运行时;按设备稳定分桶 | 平台 | 扩展 |
| 固件发布 | SDK、License 兼容、产品信息和安全存储纳入固件门禁 | 平台 + 设备 | 扩展 |
| 隐私导出/删除 | 平台数据链路保留;新增火山会话历史/设备数据删除与凭证吊销对账 | 平台主导 | 扩展 |
| 发布候选验收 | 替换 RTC 三模式矩阵,新增硬件 SDK 真机矩阵 | 平台验收工具 | 改造 |
## 5. 终端改造
### 5.1 新增硬件智能体运行时模块
建议固件同时保留两个实现:
```text
VoiceRuntime
├── LegacyRTCRuntime 现有 RTC + 平台 StartVoiceChat
└── VolcHardwareAgentRuntime 新硬件智能体 SDK
```
平台配置返回显式 `voice_runtime`:
```json
{
"voice_runtime": "volc_hardware_agent",
"runtime_revision": 12,
"transport": "high_quality",
"minimum_sdk_version": "<现场冻结版本>"
}
```
设备只在完整校验配置后切换运行时;切换失败回退上一有效配置。不要根据 `engine_mode` 或固件版本自动推断。
### 5.2 凭证与激活
设备侧需要保存:
- 火山 `instance_id`、`product_key`、`device_name`;
- 动态注册换取的设备独享 `device_secret`;
- 当前凭证版本、注册时间和最后成功鉴权时间。
安全要求:
- `product_secret`只允许保存在平台KMS或Secret挂载中,不能进入设备固件、应用、安装包或设备日志;
- 设备使用平台设备身份调用`/device/v3/hardware-agent-credentials:provision`,由平台完成DynamicRegister并下发本设备的`device_secret`;
- `device_secret` 使用安全芯片、TEE 或设备密钥封装后持久化;
- 日志、遥测和崩溃转储不得输出任何 Secret 或完整签名;
- 必须验证设备 Secret 的轮换、吊销和售后换板流程。
### 5.3 会话状态机
建议复用现有通话状态:
```text
PREPARING -> SESSION_READY -> STARTING_AGENT -> ACTIVE
-> FAILED
ACTIVE -> STOPPING -> COMPLETED
-> FAILED
```
数据库可继续把 `SESSION_READY` 对外兼容映射为 `ROOM_ISSUED`,但新 `/device/v3` 契约应使用真实语义,不再暴露不存在的 RTC Room。
终端事件映射:
| 火山/SDK 事件 | 平台动作 |
|---|---|
| SDK 初始化成功 | 更新遥测,不代表会话成功 |
| `session.created` | 保存火山会话标识,等待会话配置 |
| `session.updated` | 调用平台 activate,允许采集和播放 |
| 用户最终 ASR | 写入本地可靠字幕队列 |
| Agent 最终字幕 | 写入本地可靠字幕队列 |
| Function Call | 白名单校验后端侧执行,或转发平台工具网关 |
| Agent 错误/断开 | 上报稳定错误码,按策略恢复或停止 |
| 正常关闭 | 调用平台 stop 并冲刷字幕、用量和录音队列 |
## 6. 平台接口设计
现有 `/device/v2` 的创建响应把 `rtc` 定义为必填对象。为了不破坏量产固件,建议新增 `/device/v3/agent-sessions`,不要修改 v2 字段语义。
### 6.1 准备会话
`POST /device/v3/agent-sessions`
请求沿用设备 HMAC 和幂等键,声明:
- `capabilities.hardware_agent=true`;
- SDK 版本、传输方案、音频格式;
- 是否支持字幕可靠队列、动态会话配置、凭证轮换、近/远端 PCM 录制;
- 网络和设备时间。
响应建议:
```json
{
"conversation_id": "...",
"status": "SESSION_READY",
"runtime": {
"provider": "volc_hardware_agent",
"bot_id": "<已关联 Bot>",
"transport": "high_quality",
"session_nonce": "<短期、单次>",
"config_digest": "sha256:...",
"wait_for_session_update": true
},
"session_config": {
"dialog_id": "<平台生成的非个人标识>",
"system_context": "<已授权且脱敏的本次背景>",
"tool_scope_token": "<短期令牌>"
},
"privacy": {},
"heartbeat_interval_sec": 10,
"expires_at": "..."
}
```
响应不得返回 `product_secret` 或 `device_secret`。
### 6.2 激活会话
`POST /device/v3/agent-sessions/{conversation_id}/activate`
请求包含 `provider_session_id`、`connected_at`、`transport`、`bot_id`、`config_digest` 和设备侧关联号。平台核对准备记录和配置摘要后进入 `ACTIVE`。
### 6.3 心跳
继续使用严格递增序号,但把 `rtc` 改为:
```json
{
"agent_link": {
"connected": true,
"input_active": true,
"output_active": true,
"provider_session_id": "...",
"reconnect_count": 0
}
}
```
平台继续返回 `continue`、`stop`、`stop_after_turn`;新增 `rotate_provider_credential` 和 `refresh_session_config` 前,必须有显式设备能力位。
### 6.4 字幕
复用 `/device/v2/conversations/{id}/turns:batch` 或在 v3 提供同构接口。只上传最终字幕,不把增量字幕写入长期存储。保持 `turn_key + sequence_no` 去重和冲突检测。
### 6.5 停止
设备先请求 SDK 停止并停止采集,再调用平台 stop。平台在以下任一条件满足后收敛 `COMPLETED`:
- 收到可信服务端结束事件;
- 设备报告关闭成功且心跳租约结束;
- 强制终止接口确认成功。
如果只能依赖设备报告,授权撤回和设备失控时无法做到服务端 fail-close,不能直接通过生产隐私门禁。
## 7. 后端模块与数据模型
### 7.1 运行时抽象
现有 `voiceprovider.Client` 的 `Start/Query/Stop` 契约只适合 RTC VoiceChat。建议新增:
```go
type ConversationRuntime interface {
Prepare(context.Context, PrepareRequest) (PrepareResult, error)
Terminate(context.Context, TerminateRequest) error
Reconcile(context.Context, SessionRef) (RuntimeState, error)
}
```
- `LegacyVoiceChatRuntime` 封装现有 `voiceprovider.Client`;
- `VolcHardwareAgentRuntime` 不负责创建音频会话,只负责设备/Bot 配置同步、服务端终止、事件对账和用量拉取;
- 通话状态机、幂等、Outbox、审计和租约留在 `orchestration`。
### 7.2 新表建议
`hardware_agent_device_binding`
- `device_id`、`provider`、`instance_ref`、`product_ref`;
- `provider_device_name`、`hardware_id_digest`;
- `bot_ref`、`license_ref`、`credential_version`;
- `status`、`registered_at`、`revoked_at`、`last_verified_at`。
`conversation_runtime_session`
- `conversation_id`、`runtime_type`、`transport`;
- `provider_session_ref`、`provider_device_ref`、`bot_ref`;
- `session_nonce_digest`、`config_digest`;
- `status`、`connected_at`、`last_event_at`、`ended_at`;
- 唯一约束:一个通话最多一个活动运行时会话;同一供应商会话只能映射一个通话。
`hardware_agent_config_sync`
- 平台版本 ID、Bot/产品引用、期望摘要、实际摘要;
- 同步状态、供应商请求引用、最后错误码和验证时间;
- 用于发现火山控制台手工修改造成的配置漂移。
### 7.3 事件归一化
扩展现有 `provider_event`,归一化为:
- `hardware_agent.session.started`;
- `hardware_agent.session.updated`;
- `hardware_agent.transcript.final`;
- `hardware_agent.function_call`;
- `hardware_agent.usage.final`;
- `hardware_agent.session.stopped`;
- `hardware_agent.session.failed`。
设备上传事件和服务端回调必须使用不同 `source_type`,最终以 `provider_event_key` 和话轮键双层去重。
## 8. 工具、记忆和业务动作
### 8.1 工具分类
| 类型 | 示例 | 执行位置 | 控制要求 |
|---|---|---|---|
| 设备本地无副作用 | 查询电量、读取音量 | 设备 | 白名单、参数校验 |
| 设备本地可逆动作 | 调整音量、切换灯效 | 设备 | 范围限制、结果回传 |
| 平台只读工具 | 检索已确认记忆、读取已授权日程 | 平台工具网关 | 会话短令牌、租户/长者反查 |
| 平台有副作用工具 | 创建提醒、联系家人、修改资料 | 平台业务 API | 用户确认、幂等键、权限和审计 |
| 高风险动作 | 删除数据、转账、医疗决策 | 不直接开放给模型 | 使用既有人工流程 |
### 8.2 工具网关安全
- 工具调用必须映射到活动通话,不能只信任模型传来的 `subject_id`;
- 参数使用固定 JSON Schema,拒绝未知字段;
- 每个调用有稳定 `call_id`,平台按 `conversation_id + call_id` 幂等;
- 返回内容限制长度并做提示词注入隔离;
- 工具超时返回结构化降级结果,不中断音频主链;
- 全量记录工具名、结果状态、耗时和资源版本,不记录不必要的敏感正文。
## 9. 隐私、录音和删除
### 9.1 授权撤回
当前系统在撤回字幕、原录音、故事整理或个性化记忆授权时,会把活动通话写入停止状态并投递可靠停止任务。迁移后必须实现等价闭环:
1. 平台事务内写入撤回、通话停止意图、Outbox 和审计;
2. 在线设备通过心跳/SSE 命令立即关闭 SDK 会话;
3. 平台调用火山服务端终止或吊销接口兜底;
4. 未确认停止前禁止新建会话和工具访问;
5. 超时进入阻断告警和人工处置,而不是静默标记完成。
### 9.2 双轨录音
这是迁移中最可能发生范围变化的功能。PoC 必须确认:
- 能否取得送入 SDK 前的近端 PCM;
- 能否取得 SDK 解码后、播放前的远端 PCM;
- 打断、重连、丢包隐藏和采样率变化后时间轴能否对齐;
- SDK 是否允许在本地进行受授权的录制;
- 若使用火山云端录制,能否满足近/远轨分离、短期访问、删除和审计要求。
如不能取得远端 PCM,不能把混音录音冒充现有双轨录音。第一阶段应明确限定为 `transcript_only`,待产品接受范围变更或供应商能力补齐后再开放录音。
### 9.3 删除和凭证吊销
主体隐私删除增加两个子任务:
- 删除或匿名化火山侧与该设备/会话相关的可识别数据;
- 吊销设备智能体凭证和 License 绑定,并保存最小删除证明。
供应商无删除/吊销 API 时,需要人工控制台证据和对账任务,但该方式不适合大规模量产。
## 10. 用量、费用与 License
现有七类用量可保留,但新增来源维度:
```text
source = provider_callback | device_session | provider_bill
runtime = legacy_voicechat | volc_hardware_agent
```
建议新增类别:
- `HARDWARE_AGENT_LICENSE`:设备 License 购买、激活、到期和转移;
- `HARDWARE_AGENT_VOICE`:AI 对话时长;
- `HARDWARE_AGENT_MODEL`:模型推理额度;
- 视频、声音复刻、联网问答等扩展资源按实际开通单独归类。
设备上报只用于实时额度预估,最终账单以火山账单/用量接口为准,并执行会话、设备、账期三级对账。火山产品页显示 License 按设备提供不同对话时长和模型额度,实际采购价格、超额规则、License 回收和换机政策必须在合同中冻结。[火山硬件智能体产品页](https://www.volcengine.com/product/ConversationalAI-Embedded)
## 11. 灰度迁移步骤
### 阶段 0:供应商能力封板
在编码前取得正式 SDK、API、License 和数据处理条款,完成第 13 节问题闭环。输出一份签字的能力矩阵,未确认项不能用口头承诺替代。
### 阶段 1:独立真机 PoC
- 1 个测试产品、1 个 Bot、3 台候选板;
- 跑通高质量 SDK 初始化、动态注册、建连、打断、重连、字幕和结束;
- 验证近/远端 PCM、强制停话、凭证吊销、License 更换;
- 暂不连接生产家庭/长者数据。
### 阶段 2:平台双运行时
- 新增运行时抽象、表和 `/device/v3`;
- 旧 v2/RTC 链路保持不变;
- 新设备只接固定 Bot,先打通授权、状态、字幕、内容处理和诊断;
- 火山配置先由人工控制台维护,平台保存摘要和漂移检查。
### 阶段 3:个性化与工具
- 接入动态会话参数和冻结背景;
- 接入平台记忆 MCP/Function Calling;
- 接入角色、模型、音色、Bot 的发布和回滚;
- 接入用量、License、隐私删除和供应商对账。
### 阶段 4:灰度试点
- 内部设备 -> 友好家庭 -> 小比例真实家庭;
- 每个设备的运行时由不可变灰度版本决定;
- 出现阻断问题时只切回 `legacy_rtc`,不修改历史通话运行时;
- 灰度期间两个运行时分别统计成功率、首响、打断、重连、字幕、费用和投诉。
### 阶段 5:主链切换与退役
只有新链路连续通过真机、隐私、费用和运行恢复门禁后,才把新出厂设备默认设为硬件智能体。旧 `StartVoiceChat` 代码、RTC Token 签发和模板不能立即删除,至少保留到全部在役设备完成升级或退出支持期。
## 12. 验收与回滚门禁
建议新的真机最小矩阵至少覆盖 3 台量产候选设备、6 通会话:
1. 正常完整通话;
2. 用户打断和 Agent 被打断;
3. Wi-Fi/蜂窝或批准网络切换恢复;
4. 平台受控停止;
5. 活动通话中授权撤回;
6. 设备断电重启后的字幕队列恢复和资源回收。
每通必须核对:
- 平台通话、火山会话、设备和 Bot 关联唯一;
- 音频上行、下行、首响、打断和恢复符合现场冻结标准;
- 最终字幕完整、顺序稳定、重放不重复;
- 背景和工具调用严格限制在当前租户、长者和通话;
- 结束后 SDK、License 占用、平台租约和工具令牌全部释放;
- 设备、平台、火山、字幕、用量和隐私证据引用完整。
建议上线 SLO 在试点前冻结,不在代码中写死。至少包含:建连成功率、首次回复时延、打断成功率、异常重连成功率、字幕完整率、停止收敛时延、重复计费率、供应商账单差异和凭证吊销生效时延。
回滚规则:
- 回滚只影响新会话;活动会话按原运行时完成或受控停止;
- 数据库中的 `runtime_type` 和配置摘要不可改写;
- 设备切回旧运行时前必须确认旧 RTC SDK 和配置仍在;
- 无法强制停话、出现跨租户工具访问、删除不收敛或凭证泄露时,立即停止硬件智能体新会话灰度。
## 13. 必须向火山确认的问题
以下问题未得到书面答案前,不建议承诺完整替换日期:
1. 是否提供按设备或会话的服务端强制终止接口?设备离线时多久生效?
2. `device_secret` 是否支持轮换、吊销、批量禁用和换板迁移?
3. 产品、设备、Bot 绑定和 License 是否都有 OpenAPI,而不是只能操作控制台?
4. 是否有服务端会话开始、结束、最终字幕、错误和用量回调?签名和重放保护是什么?
5. 是否允许传入平台生成的 `conversation_id/dialog_id` 并在回调和账单中原样返回?
6. 动态会话参数可以覆盖哪些 Bot 配置?何时生效?是否保证收到 `session.updated` 后再开始识别?
7. 高质量 SDK 是否同时提供近端输入 PCM 和远端播放 PCM 回调?采样率、声道和时间戳如何定义?
8. Function Calling/MCP 的服务端鉴权、超时、重试、幂等和最大正文限制是什么?
9. License 的激活、到期、换机、回收、离线宽限和超额计费规则是什么?
10. 能否按设备、Bot、会话、租户标签导出用量并与账单对账?
11. 会话音频、字幕、日志和模型上下文分别保留多久?如何导出和删除?数据地域在哪里?
12. SDK 支持的芯片、编译器、RTOS/Linux、RAM/Flash/CPU、AEC/AGC/ANS、网络端口和证书更新要求是什么?
13. 高质量和低负载方案能否在同一产品/设备上切换?切换是否会改变 Bot、License、回调和计费语义?
14. 量产并发、建连 QPS、设备数、Bot 数和回调吞吐的配额如何申请和压测?
## 14. 主要风险
| 风险 | 影响 | 控制措施 |
|---|---|---|
| 产品级 Secret 被固件提取 | 同产品设备可被仿冒或批量注册 | 一次性安全注册、设备独享 Secret、安全存储、吊销演练 |
| 火山控制台配置漂移 | 平台记录与实际 Bot 行为不一致 | 平台配置摘要、定时对账、变更工单、生产禁止无审计手改 |
| 只能由设备报告会话结束 | 授权撤回时不能服务端强制停止 | 以供应商强停/吊销能力作为上线硬门槛 |
| 字幕只有设备单路回传 | 断电或固件故障造成内容缺口 | 本地加密可靠队列、服务端回调双源、终稿补传和差异告警 |
| SDK 无远端 PCM | 双轨录音功能无法等价迁移 | PoC 提前验证;不满足时明确限定 `transcript_only` |
| License 与内部设备解绑不同步 | 换机失败、成本浪费或越权使用 | License 台账、绑定状态机、每日对账和售后流程 |
| Bot 数量或动态参数受限 | 现有多租户灰度模型无法直接复制 | 少量基础 Bot + 会话动态参数;配置版本与供应商摘要冻结 |
| 工具调用越权或重复 | 读取他人记忆或执行重复动作 | 会话范围令牌、服务端反查、Schema、幂等、确认和审计 |
## 15. 评审建议
甲方方案评审时可以把范围分成三层:
- 必须等价迁移:正常语音、打断、设备绑定、授权门禁、通话状态、最终字幕、摘要/故事、人工记忆、额度、诊断和受控停止;
- 需要供应商能力确认:服务端强停、设备凭证吊销、字幕/用量服务端回调、动态会话参数、MCP 鉴权;
- 可能需要范围调整:双轨录音、三种旧 `engine_mode`、RTC 房间级诊断和旧 VoiceChat 模板。
推荐先让甲方确认“硬件对话智能体只替换语音会话执行层,现有业务平台继续作为控制面和数据主库”。确认这条边界后,再进入 SDK PoC 和接口改造,能避免后续把火山控制台误当成整个业务平台替代品。