01
核心业务
云平台同时服务个人开发者与企业:开发者通过门户创建 API Key、充值和查看消费,企业通过独立控制台管理成员、项目、合同权益和设备授权。两类用户共用语音识别、合成、鉴伪等模型能力,但账号归属、授权方式和结算规则不能混成一个后台。
平台的复杂度来自三种运行节奏。实时语音要求长连接持续返回结果;文件任务需要排队、重试和恢复;权益、路由与价格配置则由管理端低频修改。架构按业务所有权划分 Web、Portal、APIHub、Enterprise 和 audiollm-go 五个服务,再将 CPU 接入、GPU 推理、异步 Worker 与签名 Worker 分开部署。
- 01开发者商业化
- Portal 保存个人账号、Key、余额、订单、价格上下文和预算预占,负责最终结算与消费统计。
- 02企业授权与交付
- Enterprise 分为平台管理台和企业控制台,管理组织、成员、合同权益、设备与许可证;授权集中审批,签名由独立 Worker 执行。
- 03请求准入与模型路由
- APIHub 校验调用身份、能力、预算和限流,根据版本化策略选择自研模型或第三方 Provider。
- 04模型执行与用量事实
- audiollm-go 编排 ASR、TTS、情感、SED、鉴伪与音频向量能力,保存任务终态和实际处理量。
02
调用形态
实时识别、流式合成和目标对话,结果沿原连接返回。
- 实现
- APIHub 在建连和首帧固定本次会话的 Provider,之后发布的路由只影响新会话;合成以 NDJSON 分块返回 PCM。
- 输出
- 流式结果与会话用量,按会话或处理量结算。
- 边界
- 一段会话内不切换模型;连接断开不抹掉已产生的有效结果。
文件识别、鉴伪等长任务,用户关闭页面后仍会完成。
- 实现
- 稳定 task_id 贯穿准入、预占、执行、通知和结算;Worker 幂等消费输入引用,终态、用量和 Outbox 同事务提交。
- 输出
- task.done 通知,Portal 回查终态和实际用量后结算。
- 边界
- 消息至少一次传递,重复通知命中同一结算记录。
企业为终端设备申请离线授权和在线激活。
- 实现
- 企业提交设备清单,平台在飞书卡片审批,独立 Worker 签名并自验签;下载复查设备状态、generation 与短期票据。
- 输出
- 带内容摘要的授权文件与设备记录。
- 边界
- 撤销、解绑后下一次请求即被拒绝,旧票据不能绕过新的授权状态。
03
技术栈
- 前端
- 开发者静态站企业控制台 Vue 3飞书扫码登录
- 服务端
- GoChiWebSocketProvider AdapterMCP
- 数据与消息
- PostgreSQLRedisRocketMQ 5.xOutbox
- 基础设施
- AWS EKS / 腾讯云 TKE对象存储GitLab CIKMS / K8s SecretOpenTelemetry
04
系统架构与部署
五个服务按商业、授权、准入与执行职责协作。实线表示业务调用,虚线表示配置同步或异步消息;实时结果沿原连接返回。 Web 与企业控制台
Vue 3 / CDN / 静态资源发布开发者界面和企业管理界面独立,不在前端保存余额或授权事实。
APIHub / Portal / Enterprise
Go / Kubernetes Deployment按服务职责管理路由、结算和权益,可分别发布;请求路径不逐次查询控制台。
Gateway 与模型 Worker
CPU Gateway / 共享 GPU / 远程 Worker网关承担协议和编排,GPU Worker 承担模型推理;支持内部服务及远程执行端。
签名 Worker
独立 Deployment / AWS KMS · 国内 K8s Secret管理 API 没有签名权限;海外使用 KMS,国内私钥只挂载给 Worker。签名、自验签后保存许可证制品及摘要。
消息与持久数据
PostgreSQL / Redis / RocketMQ 5.x数据库保存业务事实,Redis 保存快照和查询投影,消息承担任务提交与完成通知。
区域运行
AWS EKS、ECR、S3 / 腾讯云 TKE、TCR、COS海外与国内使用各自的集群、对象存储、镜像仓库和发布身份;国内测试与生产分环境,同一制品晋级。
05
企业交付:从申请到设备授权
企业侧的能力围绕「谁能申请、谁来批准、谁持有签名权限、文件怎么下发」拆开,每一步都有独立的权限和审计。
- 2 个工作台
- 平台管理台 / 企业控制台
按租户隔离,跨企业访问返回 403;企业控制台支持飞书扫码登录,可登录人员由名单维护。
- 飞书卡片
- 授权集中审批
审批、签名和验签各只发生一次;单次实测从批准到签发验证完成约 0.6 秒。
- 10 分钟
- SDK 下载链接
8 个平台的接入指南与 11 个在线 API 示例;安装包经私有对象存储签名链接下载并审计。
- 22 个工具
- 企业 MCP
默认关闭,开启后沿用企业身份、角色、审计和幂等约束。
企业项目可以关联已有开发者账号,使用其预付余额与标准 Key;撤销或解绑后下一次请求返回 403。
06
发布效率:国内流水线优化前后
国内流水线按服务拆分 Runner、调整缓存后的单次对照,指标为流水线总耗时。首次运行仍是冷编译,不作为稳定承诺。
优化前优化后单位:秒静态页发布的主要收益来自排队时间:Runner 隔离后排队从 332 秒降到 0.43 秒;企业服务的镜像构建本身没有变快。
07
核心业务链路
实时语音:路由变更与长连接如何共存
- 1Client
- 2APIHub
- 3Gateway / Provider
- 4流式结果
HTTP 与 WebSocket 直接进入执行链。APIHub 在建连及首帧阶段固定本次会话的 Provider,随后发布的路由配置作用于新会话,避免一段语音中途切换模型。模型结果与实际用量分别处理,连接断开不能抹掉已经产生的有效结果。
文件任务:用户关闭页面后仍然可以完成
- 1task-submit
- 2Worker
- 3终态 + usage + Outbox
- 4task.done
- 5Portal
APIHub 复用稳定 task_id,Worker 幂等消费输入引用。任务状态、用量和 Outbox 在 PostgreSQL 同一事务中提交;完成通知只带 task_id,Portal 回查终态和实际用量再结算。通知重投不会创建新的业务调用,也不依赖用户回来查询触发扣款。
设备交付:管理权限与密码学权限分开
- 1企业提交设备清单
- 2飞书卡片审批
- 3独立 Worker 签名
- 4自验签与制品摘要
- 5企业下载授权文件
企业控制台负责设备清单和申请,平台审批人在飞书卡片上批准;重复点击幂等,审批、签名和验签各只发生一次。独立 Worker 认领签发任务,签名私钥不进入 Web、API 或业务数据库。制品下载同时检查设备状态和授权 generation,旧票据不会绕过更新后的授权状态。
08
关键机制与取舍
01路由控制面:通知加对账,而不是每次请求查库
- 约束
- 路由策略要能动态发布,但管理服务或 Redis 的瞬时故障不能把每个语音请求拖入跨服务查询。只依赖 Pub/Sub 又会在重启、断线或漏消息后保留旧配置。
- 做法
- Enterprise 在事务中写入策略版本、审计和 Outbox。Publisher 发布 Redis 不可变快照、latest 指针和 Pub/Sub 通知;APIHub 订阅通知,并周期性对账 latest,验证后原子替换内存快照。缺失、吊销或过期授权按拒绝规则处理。
- 效果
- 请求热路径只读取已经装载的配置;配置生效与请求执行解耦,同时保留版本号用于排障和回溯。
02任务与账务:避免重复扣费,也避免过早释放预占
- 约束
- 消息系统提供至少一次传递,模型可能已经执行而发送确认丢失;如果把发送超时当失败释放预算,后续任务完成就无法可靠结算。
- 做法
- 预占、任务和消费记录围绕稳定 task_id 关联。执行端先持久化终态与用量,再发送完成通知;Portal 以任务标识幂等回查、结算后 Ack。状态不确定的请求保留记录并进入对账,技术重试不创建第二次客户调用。
- 效果
- 数据库记录可以解释“执行了多少、产生了多少有效结果、结算了哪次调用”,消息只是推进处理的通知。
03计量与定价:失败不等于零处理量
- 约束
- ASR、TTS 和鉴伪有不同计量维度,部分成功、取消和中断也可能消耗计算资源。执行层按商业优惠改写用量,会让成本分析和账务对账失去依据。
- 做法
- 模型层记录实际处理量、有效结果关联量和终态;Portal 根据产品规则与价格上下文决定应收。音频能力保留处理时长,TTS 与鉴伪记录各自的请求及结果计数,不强制所有模型使用一个计量单位。
- 效果
- 运行成本、调用统计与客户账务可分别解释;同一执行事实能够支持不同商业规则。
04许可证 Worker:租约恢复与旧 Worker 写入保护
- 约束
- 签名任务可能在认领后进程退出;简单重试容易让新旧 Worker 同时发布制品,或让 API 服务获得不必要的签名权限。
- 做法
- Worker 使用数据库行锁认领任务,签发过程设置有界租约和 worker-id fence。租约过期后任务可被恢复,旧 Worker 不能覆盖恢复 Worker 的结果。签名后使用公钥自验签,再写入带内容摘要的加密对象。
- 效果
- 操作审计、任务恢复与密码学权限分别受约束。海外私钥保持在 KMS 内;国内私钥以 Secret 只挂载给 Worker,集群管理员仍在信任边界内。
05SDK 接入中心:大文件不经过 API
- 约束
- 企业客户需要按平台拿到 SDK、Demo 和接入示例;数百 MB 的安装包如果经由 API 转发,会占用服务带宽,也难以审计谁下载了什么。
- 做法
- 接入中心按企业范围展示平台指南和在线 API 示例;下载时签发 10 分钟有效的私有对象存储链接并写审计,文件由对象存储直接提供。没有正式包的平台在目录里如实标注状态。
- 效果
- 下载权限、审计与传输分离;当前只有 Android 提供真实 SDK 与 Demo 包,其他平台标为待提供。
09
发布与验证
五个服务各有测试与生产分支。合并后自动发布到测试环境,生产由人工触发,晋级的是测试环境验证过的同一份制品。国内生产目前只覆盖部分服务,正式域名切换和全量生产回归仍在进行;发布过程中探测到过少量 502,不按零中断表述。
- 1合并测试分支自动构建并发布测试环境
- 2公网探针失败自动回到原版本
- 3回滚演练部署 → 回滚 → 同镜像再发布
- 4迁移演练隔离 schema 先跑数据库迁移
- 5人工晋级同一制品进入生产
- 6生产回读健康、接口与关键流程复查
31.4 / 31.6 秒网关生产部署 / 回滚
同制品晋级;测试环境完整的发布、回滚、再发布 180 秒。
0.81–0.96 秒合成流式首块
测试环境后端首个音频块;浏览器端首次出声约 1.93 秒。
11 分 10 秒生产合成模型更换
含首次部署 237.7 秒;同权重快速切换约 310 秒,比旧流程少约 45%。
没有采用的做法
- 每次请求查询控制面管理服务瞬时故障会拖住语音请求,改为版本化快照加周期对账。
- 只依赖 Pub/Sub 推送配置重启、断线或漏消息后会保留旧配置。
- 发送超时即释放预算执行可能已经完成,改为保留预占并按 task_id 对账。
- AI 代码评审作为门禁已停用,保留静态检查、回归、密钥扫描和人工审查。
10
AI 协作开发
五个仓库在海外 test 与国内 cn-test 之间的同步、测试与生产发布、发布后回归,主要由 Codex 会话推进,部分工作线交给 Claude Code 接手,双方用交接笔记写明结论、位置与待办。
- Agent 负责
分支同步与发布回归
同步五个服务的区域分支,驱动 GitLab 测试到生产的发布,发布后执行生产回归并按日期写入验证报告。
- 仓库规则
生产改动三步走
先只读核对确切目标,再取得针对这一项改动的明确批准,改完独立回读;不确定结果的写请求不自动重试,充值走技能而不是直接改库。
- 验证口径
绿灯不等于整体通过
发布期间约 1800 秒探测记录到 11 次 5xx,因此不写零中断;生产整体回归未通过时照实记录,体验页可用也不替代 API 验收。
海外区域只允许“功能分支 → 测试环境验收 → 同一提交晋级主干”,生产部署、回滚和重新部署都是手动任务,不从本机直接部署。
12
阶段成果
- 贯穿开发者接入、企业权益、模型推理、设备交付和消费结算,覆盖产品、服务端与云基础设施。
- 路由版本、任务标识、用量事实和制品摘要成为跨服务排障依据,减少依靠页面状态判断系统是否完成。
- 国内区域已有 Portal、APIHub、Enterprise 等服务进入生产,测试到生产使用同一制品;AWS 海外部署保留各自的运行和发布边界。