# 量产版综合解决方案:媒体直连、任务网关、账本结算与代理兜底 ## 1. 文档定位 这份文档是基于前面讨论进一步收敛出来的一版“量产优先”的综合方案。 目标不是追求理论上最轻,而是在下面几个维度同时拿到更好的平衡: - 开发更便捷 - 安全性更高 - 更适合商业化和量产 - 不明显影响用户体感 - 服务器压力尽量小 这份方案相对于“设备直接调用方舟文本 API + 业务 token 切片”的版本,做了一个关键收敛: `不让设备长期持有可直接消费方舟文本推理能力的真实主能力。` 也就是说: - 媒体面尽量直连云侧 - AI 任务面由你的服务端托管 - 配额、续权、计量、结算由你的服务端统一掌控 - 长任务保留代理通道做兜底 --- ## 2. 最终推荐结论 如果你要做量产交付,我建议采用这一版架构: `媒体直连 + 任务网关 + 配额账本 + 长任务代理兜底` 一句话解释: 1. 设备可以直连低延迟媒体链路 2. 设备不直接持有长期方舟文本 API 能力 3. 所有高价值 AI 任务由你的服务端创建、放行、续权、停止和结算 4. 用户侧卖套餐能力,不直接卖 token 5. 用量以云侧回流为最终结算依据 这是我认为更适合商业化量产的原因: - 对设备端更友好,开发边界更清晰 - 对服务端更可控,后续改套餐和风控不用动设备协议 - 对用户体感更稳,可以做自然边界续写和无感续权 - 对财务和运营更友好,能做账本、对账、客服排障和渠道分账 --- ## 3. 为什么不直接沿用网页最后那套方案 网页最后那套方案的核心优点是: - 链路短 - 服务器流量小 - 设备直连,用户体感好 但量产时它有四个硬伤: ### 3.1 设备端不可信 只要设备能直接消费方舟文本能力,理论上就总会面临: - 固件被逆向 - 协议被重放 - 授权被抽取 - 请求被伪造 - 套餐控制被绕过 ### 3.2 开发复杂度其实不低 看起来是“直连更轻”,但如果真的要补齐: - 细粒度计量 - 低水位续权 - 中断恢复 - 长故事续写 - 用量回补 - 审计和客服排障 设备端和服务端两边都会变复杂。 ### 3.3 商业化边界不够清晰 一旦你要支持: - 不同套餐 - 多设备共享 - 家庭账户 - 渠道/OEM - 试用版与正式版 - 企业版和标准版 “设备直连 + 业务 token 切片”会越来越难维护。 ### 3.4 结算闭环不够硬 真正能拿来做最终扣费和纠纷处理的,不能是设备估算,必须是云侧真实用量。 如果设备可以绕开你的任务控制面,后续审计很容易出灰区。 --- ## 4. 设计目标与非目标 ### 4.1 设计目标 1. 用户说话和收听时延保持低 2. 套餐额度、续权和停用由你自己掌控 3. 设备端协议尽量稳定,后续套餐和规则升级尽量不改设备逻辑 4. 结算必须可追溯、可回放、可纠偏 5. 支持 1000 台到 1 万台设备平滑扩展 6. 支持后续做渠道版和企业版 ### 4.2 非目标 1. 不追求所有能力都完全绕开服务端 2. 不追求把所有 token 精确暴露给最终用户 3. 不追求第一版就做极致复杂的租户隔离 --- ## 5. 方案全貌 ```text 设备 │ ├─ 1. 设备认证 / 会话启动 / 续权 / 心跳 │ 走你的任务网关 │ ├─ 2. RTC / 音频 / 媒体 │ 尽量直连云侧 │ └─ 3. 文本生成 / 故事生成 / 高价值任务 走你的任务网关或代理通道 你的服务端 │ ├─ 设备身份中心 ├─ 用户与套餐中心 ├─ 任务网关 ├─ 续权中心 ├─ 配额账本 ├─ 风控中心 ├─ 用量归因与结算中心 └─ 运营与报表后台 云侧 │ ├─ RTC / 媒体服务 ├─ 方舟模型服务 └─ usage / task / bill 回流能力 ``` --- ## 6. 核心设计原则 ### 6.1 媒体和任务分离 不要把“低延迟媒体链路”和“高价值 AI 计费链路”混成一个面。 建议划分: - 媒体链路:尽量直连,追求低延迟 - 任务链路:服务端托管,追求控制权 ### 6.2 设备侧只保存短期能力 设备最多保存: - 设备身份凭证 - 当前会话的短期租约 - 当前任务的临时句柄 设备侧不应该保存: - 长期主 API Key - 可跨任务复用的高价值主能力 ### 6.3 套餐卖能力,不卖底层计费单位 对用户展示: - 月度陪伴时长 - 月度故事次数 - 高级模型次数 - 家庭共享设备数 内部映射: - 预算单位 - 账本流水 - 云侧真实成本 ### 6.4 真正的结算只认云侧回流 设备侧心跳和事件上报只能辅助判断: - 在线状态 - 故障定位 - 体验追踪 不能拿来做最终结算真相。 --- ## 7. 核心对象模型 ### 7.1 设备身份 用于唯一识别一台量产设备。 建议字段: - `device_id` - `product_id` - `firmware_version` - `device_public_key` - `activation_status` - `risk_level` ### 7.2 用户订阅 用于控制套餐和可用能力。 建议字段: - `user_id` - `plan_id` - `plan_start_at` - `plan_end_at` - `monthly_budget_units` - `daily_budget_units` - `max_active_devices` - `max_active_sessions` ### 7.3 会话 一段连续的用户使用周期。 建议字段: - `session_id` - `device_id` - `user_id` - `session_type` - `status` - `started_at` - `last_seen_at` - `closed_at` - `close_reason` ### 7.4 任务租约 这是这套方案的核心对象。 它不是云厂商 token,而是你自己的业务租约。 建议字段: - `lease_id` - `session_id` - `user_id` - `device_id` - `task_type` - `granted_units` - `consumed_units_estimate` - `soft_threshold` - `hard_threshold` - `grace_units` - `expires_at` - `state` ### 7.5 账本流水 所有额度变化必须流水化,而不是只存一份余额。 流水类型建议: - `reserve` - `consume` - `release` - `grace_consume` - `refund` - `manual_adjust` - `settlement_delta` --- ## 8. 架构分层 ## 8.1 设备侧模块 设备端建议只保留下面这些稳定模块: 1. 设备身份模块 - 保存设备身份和短期租约 2. 会话管理模块 - 开始、续权、结束、重连 3. 媒体模块 - 处理音频输入输出 4. 本地缓存与播放模块 - 缓冲流式文本、缓冲 TTS 播放 5. 状态上报模块 - 心跳、弱网状态、任务阶段 设备端不要自己做: - 复杂套餐计算 - 最终结算 - 风控决策 - 多租户逻辑 ## 8.2 服务端模块 ### A. 设备身份中心 负责: - 设备注册 - 激活 - 黑名单 - 固件版本治理 ### B. 用户与套餐中心 负责: - 订阅档位 - 套餐预算 - 设备绑定 - 家庭共享 - 试用和正式套餐切换 ### C. 任务网关 负责: - 会话启动 - AI 任务创建 - 模型路由 - 文本流式输出代理 - 任务停止与取消 ### D. 续权中心 负责: - 低水位续租 - 授权回收 - 租约失效 - 自然边界停机 ### E. 配额账本 负责: - 预算预占 - 实时估算扣减 - 最终结算 - 退款和纠偏 ### F. 风控中心 负责: - 单设备单活会话 - 请求速率限制 - 异常续权检测 - 风险分级处理 ### G. 用量归因中心 负责: - 接收云侧 usage 回流 - 归因到用户、设备、会话、任务 - 和账本做差异修正 --- ## 9. 核心流程设计 ## 9.1 设备激活 1. 设备首次启动,调用 `/device/activate` 2. 服务端下发设备身份和初始化配置 3. 设备绑定用户 4. 建立设备和用户关系 结果: - 后续所有会话都可以挂到 `device_id + user_id` 上 ## 9.2 开始一次会话 1. 设备调用 `/sessions/open` 2. 服务端校验: - 设备有效 - 用户有效 - 套餐有效 - 当前并发不超限 - 风控未触发 3. 服务端创建 `session` 4. 服务端预占一笔预算 5. 服务端签发第一段 `lease` 6. 设备拿到可用会话句柄开始交互 ## 9.3 正常生成 短任务流程: 1. 设备把请求发到你的任务网关 2. 任务网关决定模型、上下文、预算和任务类型 3. 任务网关调用云侧模型 4. 服务端把流式文本回给设备 5. 设备边播边显示 为什么这里不直接让设备调用云侧文本 API: - 服务端才能稳定插入套餐控制 - 服务端才能统一做日志和风控 - 文本流量很小,代理成本远低于媒体流代理 ## 9.4 低水位续租 设备本地不做最终计费,但可以做“估算预警”。 建议策略: 1. 当前租约只发一小段预算 2. 设备端收到服务端回传的预算阈值 3. 消费逼近低水位时,后台调用 `/leases/renew` 4. 服务端再次检查套餐余额和风险状态 5. 若可续,则下发下一段租约 6. 当前任务不阻塞 ## 9.5 长故事续写 长故事和长文本不要按“耗尽就停”处理,而要按自然边界处理。 建议流程: 1. 服务端把故事拆成片段目标 2. 每一片都有独立租约预算 3. 到片尾或句尾时判断是否续租 4. 续租成功则继续下一片 5. 续租失败则在当前片自然结束时收口 这样用户的感知会明显更好。 ## 9.6 grace quota 机制 为了避免“生成到一半突然断”,建议每个高价值任务都预留一小段 `grace_units`。 含义: - 正常额度用完后,不立刻砍掉 - 允许把当前句、当前段或当前故事片收完 - 收完后再提示继续购买或等待下周期恢复 这部分一定要小,避免被长期滥用。 ## 9.7 异常中断与重连 设备断网时: 1. 设备缓存最近的 `session_id` 和 `lease_id` 2. 恢复后调用 `/sessions/resume` 3. 服务端判断: - 会话是否仍有效 - 租约是否仍有效 - 是否需要补发一段租约 ## 9.8 结束与结算 1. 任务完成或用户主动结束 2. 设备调用 `/sessions/close` 3. 服务端标记会话结束 4. 云侧 usage 回流到服务端 5. 用量归因中心做最终结算 6. 账本释放未用完预占 7. 记录最终账单明细 --- ## 10. 用户体验设计原则 ## 10.1 不把续权做成显式动作 不要让用户看到: - “正在续费中” - “额度同步中” - “请等待 token 刷新” 用户侧应该只感知: - 正常继续 - 自然结束 - 结束后再提示套餐不足 ## 10.2 所有中断都尽量在自然边界发生 自然边界包括: - 一句话结束 - 一段故事结束 - 一轮语音回复结束 - 一个章节结束 ## 10.3 设备侧必须有最小缓冲 为了避免轻微抖动造成体感卡顿,设备侧要有: - 流式文本缓冲 - TTS 音频缓冲 - 最近一次租约状态缓存 ## 10.4 续权失败的用户提示 不要提示“token 不足”。 建议提示业务语言: - “本月故事额度已用完” - “当前套餐已达上限” - “请升级套餐继续使用” --- ## 11. 安全设计 ## 11.1 基线原则 1. 设备不保存长期方舟主密钥 2. 所有租约都短期有效 3. 每次请求都有唯一 `request_id` 4. 设备请求必须带签名和时间戳 5. 所有可重放请求都要有去重机制 ## 11.2 强制做的风控规则 - 单设备单活会话 - 单用户并发设备数限制 - 单 IP / 单设备 / 单账号速率限制 - 短时间异常高频续租熔断 - 固件版本黑名单 - 风险设备强制切代理通道 ## 11.3 审计能力 至少保留以下审计链: - 设备请求日志 - 会话启动日志 - 租约签发日志 - 云侧任务日志 - usage 回流日志 - 最终结算流水 这样客服和财务才能查账。 --- ## 12. 商业化设计 ## 12.1 用户侧套餐表达 建议对用户卖下面这些能力包: - 基础版:短问答 + 基础陪伴 - 标准版:更多陪伴时长 + 更多故事次数 - 高级版:长故事、优先模型、更高并发家庭设备数 - 企业版:独立策略、独立配额池、独立报表 ## 12.2 内部结算单位 内部不要只用一个 token 概念,建议统一成 `budget_units`。 映射规则举例: - 1 次短问答 = X units - 1 分钟语音陪伴 = Y units - 1 次长故事片段 = Z units 真实云侧成本回来后,再做误差校准。 ## 12.3 渠道/OEM 预留 从第一版就建议预留: - `tenant_id` - `channel_id` - `plan_catalog` - `billing_group` 这样以后做渠道版不用重构核心账本。 --- ## 13. 数据模型建议 建议至少落下面这些表: 1. `device_registry` 2. `device_binding` 3. `user_subscription` 4. `plan_catalog` 5. `session` 6. `lease` 7. `quota_ledger` 8. `vendor_task` 9. `vendor_usage_raw` 10. `usage_settlement` 11. `risk_event` 12. `ops_adjustment` ### 核心关系 - 一个用户可以绑定多台设备 - 一台设备同一时刻只允许一个活跃主会话 - 一个会话可以有多段租约 - 多段租约统一归并到一次最终结算 --- ## 14. 接口建议 第一版建议只做下面这组接口。 ### 设备侧接口 - `POST /device/activate` - `POST /device/login` - `POST /sessions/open` - `POST /sessions/heartbeat` - `POST /leases/renew` - `POST /sessions/close` - `POST /sessions/resume` ### 云侧回调接口 - `POST /vendor/callback/task` - `POST /vendor/callback/usage` - `POST /vendor/callback/bill` ### 运营后台接口 - `POST /ops/device/blacklist` - `POST /ops/session/terminate` - `POST /ops/quota/adjust` - `GET /ops/user/usage` - `GET /ops/device/history` --- ## 15. 服务器压力控制思路 这套方案比全量代理轻,原因在于: 1. 媒体流不走你的服务端 2. 文本流量远小于音频/视频流量 3. 账本、续权、风控都是轻量 JSON 请求 4. usage 回流是异步的,不阻塞主链路 推荐压测关注点: - `sessions/open` - `leases/renew` - 流式文本转发连接数 - usage 回调写库速度 - Redis 热键和并发锁 推荐基础组件: - API 网关 - 应用服务 - Redis - MySQL 或 PostgreSQL - MQ - 对象存储 - 可观测系统 --- ## 16. 分阶段落地建议 ## 第一阶段:可上线 MVP 先做: - 设备激活 - 用户绑定 - 套餐档位 - 会话启动 - 低水位续租 - 单设备单活会话 - usage 回流 - 账本结算 ## 第二阶段:量产增强 再补: - 渠道/OEM - 家庭账户 - 黑名单和熔断 - 运营后台 - 套餐促销和试用 ## 第三阶段:企业化 最后补: - 租户隔离 - SLA 分层 - 独立报表 - 分账能力 --- ## 17. 这套方案最适合什么业务阶段 最适合: - 正准备量产 - 需要卖套餐 - 设备长期在线 - 既有实时语音,也有高价值文本任务 - 后面可能要做渠道和企业客户 不那么适合: - 纯内部测试 Demo - 完全不考虑商业化 - 完全不在意设备破解风险 --- ## 18. 最终建议 如果你要我给一个量产优先的单一结论,我的建议就是: `不要做设备长期直连方舟文本 API。` 而要做: `媒体直连 + 任务网关 + 配额账本 + 长任务代理兜底` 这是当前最平衡的一版: - 比全量代理轻 - 比纯直连稳 - 比“设备直连 + 业务 token 切片”更适合量产和商业化 --- ## 19. 后续建议继续补的文档 如果继续往下推进,下一批建议补: 1. 接口字段定义文档 2. 会话与租约状态机 3. 数据库表结构草案 4. 用户套餐与账本扣费规则 5. 异常流程和兜底时序图 6. 风控规则清单 这六样补齐后,就可以直接拆给开发排期了。