已有 Node 服务要给业务系统加巡检助手时,先按运行位置拆开,而不是先选一个「多模态开关」。Tansr 里,用户照片、用户自己的转写按钮、助手自己调用的媒体工具,落在不同进程和不同记录上。
三层各留什么
设计示例:巡检后端用自托管 @tansr/serve 持有会话,终端只上传照片或音频。下表按资料站的边界拆开。
| 层 | 负责的事 | 不负责的事 |
|---|---|---|
| 终端 | 保留图文草稿和原始音频,决定转写要不要成为下一条输入 | 在手机上运行 Node 会话内核 |
| 令牌档进程内 SDK | sendBlocks 在空闲时启动新轮;platform.transcribe / speak 直打 /t1/asr、/t1/tts |
把直连语音写入历史或事件流 |
| 自托管会话服务 | 代打 POST /v2/sessions/:id/audio/transcriptions 与 audio/speech;从 0.10.0 起在历史工具结果里保留 artifact |
把这两条音频路由签进事件流;把旧纯文本历史自动补成媒体 |
| 平台 bundle | 下发能力位和 platformModels。空数组表示未配置 |
由服务在本地猜一个媒体模型名 |
| 业务库 | 工单、权限和最终贴进去的示意图 | 用会话卡片代替业务记录 |
sendBlocks 返回 started 才表示新轮已启动。rejected 为零消费,原因只包括 turn_running、operation_running、empty_input、invalid_blocks、invalid_image、image_too_large、context_budget_exceeded。原生音频、视频块在写入历史和调用模型之前就是 invalid_blocks。运行中向会话服务注入图文块,是 422 midturn_blocks_rejected。
托管档和注入档没有 session.platform 这面连接,调用会 invalid_options,并指向令牌档,不会静默改道。令牌档的能力位只来自 bundle,选项里再传 capabilities 会被拒绝。
媒体工具默认不在服务进程的工具全集里
imageGen、videoGen、speechToText、textToSpeech 必须写进 builtin。不传 tools 时,能力位允许的本地内置工具会装上,这四个名字仍然不在里面。能力位默认关闭;点名但位是关的,装配期 capability_disabled,不会悄悄少一个工具。它们的定义进入每次提示,并且计费。
0.19.0 起的 realtimeAudio 等六个平台位只授权非聊天 HTTP,不装配聊天工具,也不进入会话。不要用这个位代替转写路由。
ImageGenData 给界面的是图片地址。错误时地址为空。异步 taskId 用 GET /t1/imagegen/tasks/{taskId} 查看,页面写明 7 天可查;预算耗尽或中断时服务端照跑照扣。artifact 用来在恢复后重建卡片。存储升到版本 2 后,旧的 tansr serve、自托管服务和 SDK 宿主不能继续写该卷,升级前要一起换。
语音转文字原始音频超过错误页所举的 24 MiB 时,返回 payload_too_large,按 detail.maxRawBytes 切分或压缩,不要原样重试。这个数字不是 image_too_large 的图片上限。
一次纯文本接口不必装这四个工具。2026-10-21 的 npm 版本是 @tansr/sdk 0.19.0、@tansr/serve 0.15.1。本文没有在服务器上跑通这些调用。说明见 v2 协议与 webhook 和 平台装配与 bundle。