公众号文章系列 · 09 · 深度版
一个产品的三天
从 CLI,长成 Developer Platform
Author
姚光华 Colin
Role
声网 ConvoAI 产品负责人
区间
v1.2.1 → v1.6.0 · 累计 33 工作小时
Date
2026.04.02 – 04.04
上一篇发出去之后
01
很多人问我同一个问题:
「17 小时做出来的东西,能用吗?」
我的回答
能用,但不够好。
于是
4 月 2 日下午到 4 月 4 日晚上,跨三天、累计 16 个工作小时。
结果
v1.2.1 → v1.6.0。不是修 bug。
是把一个 CLI 工具,推进成了一个 Developer Platform。
33
个工作小时,跨 3 天。
前 17 小时是「从零到一」,后 16 小时是「从能用到好用」。
这 16 小时里:对话轮数从 ~150 涨到 ~330,源代码从 8,790 行涨到 ~13,000 行,
测试从 448 个涨到 507 个,npm 发布从 25 次涨到 50+ 次。
平均每 40 分钟发一个版本。
先说数据变化
04
v1.2.1(上篇终点) → v1.6.0(现在)
六个口径,同一个方向
01
工作时间
17 小时 →
33 小时
(+16h)
02
对话轮数
~150 轮 →
~330 轮
(+180)
03
源代码
8,790 行 →
~13,000 行
(+4,210)
04
npm 发布
25 次 →
50+ 次
(+25)
05
测试通过
448 →
507
(+59)
06
Starter
0 →
20 文件 / 1,629 行
(新增)
每个版本发布前都跑全量测试。
从 448 到 487 到 507,没有跳过。也不是因为改动小 —— v1.3.0 重写了整个 quickstart 引导流程。
全景
05
33 个工作小时的四级台阶
从工具,到 Developer Platform
PREV · 17H
v1.0 → v1.2.1
CLI 核心 + OpenClaw 集成
工具
STAGE 1 · ~3H
v1.3.x
渐变 UI + i18n + 步骤重排
品牌化工具
STAGE 2 · ~5H
v1.4.x
convoai go + 控制面板 + 反馈修复
产品
STAGE 3 · ~8H
v1.5.0 → v1.6.0
init/dev + Starter + 三层架构
Developer Platform
从「一个 API wrapper」,
走到「一个有品牌、有体验、有开发者路径的平台」。
MONEY QUOTE · 01
不是修 bug
是把工具
推进成平台
如果说前 17 小时是「从零到一」,后 16 小时是「从能用到好用,从工具到平台」。
ACT I / V
TOKENS
先回应被问最多的
「8790 行代码 + 448 个测试,4M Tokens 真能做出来?」
先说结论:4M 是我基于主对话窗口的估算,实际消耗大概在 5-6M。
I Token 账
II 发版速度
III 阶段一
IV 阶段二
V 阶段三
ACT I · Token 账
08
1-2M 的估算误差,从哪来
4M,还是 5-6M
终端里看得到的
主对话 ~1.5M
coordinator 模式下,主对话窗口的消耗是可见的。这就是「4M」这个估算的来源。
终端里看不到的
子 Agent ~2-2.5M
并行构建的 4 个模块、Code Review Agent,各自有独立的上下文。这部分消耗在主终端里不显示。
5-6M 和 4M 的区别,是
估算精度
的问题,不是「能不能做出来」的问题。
(上一篇标注的是 ~4M;本篇为作者自己的修正口径。)
v1.2.1 确实是一天之内做出来的。
更值得拆解的是这些 Token 花在了什么地方。
ACT I · Token 账
09
重点不是总量,是分布
Token 都花在哪了
学习阶段 15%
读 API 文档、源码、OpenClaw
产品设计 20%
架构设计、命令体系、brainstorming
代码生成 30%
4 个子 Agent 并行构建核心模块
测试生成 10%
448 个测试用例
Review + 调试 20%
Code Review、五连坑、错误体系
文档 + 品牌 5%
README、Release Notes、品牌图腾
只有 30% 用在写代码上。
剩下 70% 花在「先理解问题、想清楚方案、写完再审、审完再修」。
MONEY QUOTE · 02
只有 30%
用在写代码上
如果 100% 的 Token 都用来「直接写代码」,5M 确实不够。
但如果你的流程是先想后写、先测后发,Token 的利用效率会高得多。
ACT II / V
SPEED
五十次发版意味着什么
33 个工作小时,50+ 次 npm 发布。平均每 40 分钟发一个版本。
这个数字看起来非常反直觉。但它是真实的。
I Token 账
II 发版速度
III 阶段一
IV 阶段二
V 阶段三
ACT II · 发版速度
12
一次不可逆的范式转移
版本间隔,一级一级塌下来
VERSION INTERVAL
传统软件
2-4 周一个版本
SaaS 时代
1-2 周一个版本
AI Native
1 天一个版本(复杂产品)
AI + CLI
1 小时内一个版本(轻量产品)
「能力到交付」的鸿沟正在被系统性地消除。
不是说所有产品都应该 40 分钟发一版。
复杂的 B2B 产品有灰度、有客户验证、有合规 —— 快不起来,也不应该快。
ACT II · 发版速度
13
速度不是因为不做测试,也不是因为改动小
三个结构性变化
01
等待消失
AI 消灭了「实现等待时间」。spec 写完,
10 分钟后就能看到第一个可运行版本
。
02
发布归零
npm publish 的成本趋近于零。不需要审核、不需要灰度、不需要发布窗口。
03
闭环压缩
真实用户反馈的闭环缩短到分钟级。「小步快跑」不再是口号,而是自然发生的事。
去年 12 月我在人人都是产品经理大会上讲过一个判断:
「2 周一个版本迭代,已经是 AI Native 组织的新常态。」
当时举的例子是 HeyGen 和自己带的 ConvoAI 产品线。
后来那张图刷屏了 ——
Claude 团队在 52 天里几乎每天都有发布。
当我认为「一天一迭代」已经是天花板的时候,我自己的项目打破了这个判断。
ACT II · 发版速度
14
v1.4.2 → v1.4.3 · 一个真实的闭环
20 分钟,从抱怨到修好
v1.4.2 发布
用户 5 分钟内反馈「Enter 键不好使」
15 分钟后 v1.4.3 修复上线
不是技术上不可能,是流程上不可能
20 分钟闭环
当「发现问题 → 修复 → 发布 → 用户验证」被压缩到 20 分钟,
迭代频率自然就到了这个量级。
MONEY QUOTE · 03
以前的瓶颈
是做不出来
现在是想不清楚
做不出来可以靠加人加时间。想不清楚,加多少人都没用。
ACT III / V
SKIN
先让它看起来像产品
v1.2.1 功能完整,但视觉上……就是一坨纯文本。
跟 Claude Code、OpenClaw 的终端体验比,差了一个档次。阶段一,约 3 小时。
I Token 账
II 发版速度
III 阶段一
IV 阶段二
V 阶段三
ACT III · 阶段一 v1.3.x
17
三件事,都不是「加个颜色」
品牌化,是一层层做出来的
01
渐变 UI
让 Claude Code 在终端里用 ANSI escape code
直接渲染 5 种视觉方案
,不是截图,我当场选。最终选了蓝→粉渐变框线 + 渐变标题 + 增长式进度条。
02
中英分流
选声网走中文,选 Agora 走英文。中文版通义千问排第一、凭证 4 步详细指引;英文版 OpenAI 排第一、3 行精简提示。
03
步骤重排
凭证 → LLM → TTS → ASR,改成
凭证 → ASR → LLM → TTS
。ASR 最简单,推荐 ARES,免费不用填 key。
把最简单的一步放前面,让用户先拿到成就感。
而不是一上来就被 LLM 的 API key 卡死。
ACT III · 阶段一 v1.3.x
18
一个经典的终端 UI 坑
中文字符占 2 列
BEFORE · 右边框全部错位
对
话
l
o
g
.length = 5
实际 7 列
AFTER · displayWidth()
对
话
l
o
g
按 Unicode 范围判断:CJK 和 emoji 占 2 列
所有
.length
算出来的宽度都是错的,右边框全部错位。写了一个
displayWidth()
才对齐。
终端 UI 的坑,不在渲染,
在你以为字符宽度是 1。
ACT IV / V
JOURNEY
从用户旅程重构命令
30+ 个命令摆在那里:quickstart?agent start?agent join?chat?
阶段二,约 5 小时。这一段的起点不是一个功能,是一个问题。
I Token 账
II 发版速度
III 阶段一
IV 阶段二
V 阶段三
阶段二的起点是一个问题
02
用户第二次打开 ConvoAI CLI,
该输入什么命令?
摆在那里的
30+ 个命令。quickstart?agent start?agent join?chat?
我的答案
用户不应该需要想这个问题。
做法
用 Superpowers 的 brainstorming,从用户旅程出发重构整套命令体系。
于是有了 convoai go。
ACT IV · 阶段二 v1.4.x
21
convoai go 的诞生
按「第几次用」来设计命令
第 1 次用
convoai quickstart
全量配置 + 对话
第 2 次用
convoai go
零参数,用上次配置直接对话
第 3 次用
convoai go --setup
想换个模型时才用
go 和 join 的区别 —— go 是产品,join 是 API。
然后我废弃了 chat、repl、watch 三个命令。
Help 页面从一堆平铺命令,重构成分组 + 智能提示:已配置提示 convoai go,未配置提示 convoai quickstart。
ACT IV · 阶段二 v1.4.x
22
go 处理了所有 corner case
「零参数」背后是五个兜底
01
没配置过
提示你先跑
convoai quickstart
。
02
配置不全
告诉你到底缺什么,而不是抛一个异常。
03
Agent 没关
上次的 Agent 还在跑?自动 stop。
04
端口被占
自动 kill 占用进程。
05
Chrome 缺失
找不到 Chrome?fallback 到其他浏览器。
五个兜底,换来一个「零参数」。
用户看到的是一个词;这个词底下藏着五次「如果出错了怎么办」的产品决定。
ACT IV · 阶段二 v1.4.x
23
Agent 启动后,用户原来只能「等着」
运行时控制面板
[l]
切 LLM 模型
换模型 / 调 temperature,改完立即生效,不用重启 Agent。
热更新
[a]
换 ASR
换语音识别供应商,保存到配置。
下次生效
[t]
换 TTS
换语音合成供应商,保存到配置。
下次生效
[v]
调 VAD
调静音检测参数,保存到配置。
下次生效
对话内容
实时滚动显示
,不用按任何键就能看到。全键盘操作,全程不退出 raw mode。
把「等着」变成「可以动手」。
这是从工具变成产品的一小步。
ACT IV · 阶段二 v1.4.x
24
一个血泪教训
raw mode 和 inquirer 不兼容
第一版 · 怎么按都没反应
用 inquirer 做子菜单
Enter 键被 raw mode 的 data listener 抢走。修了 listener 之后还是不行 —— raw mode 和 readline 有
根本性的兼容问题
。
最终方案 · 能用
纯 raw mode 数字键
全面废弃 inquirer 子菜单。[1] [2] [3] 选择,[0] 返回。全程不退出 raw mode。
这一类问题 AI 帮不上太多忙:它会顺着你的第一版方案不断打补丁,
直到你自己决定推翻这个方案。
有时候正确的修法不是修,
是换掉那一层。
ACT IV · 阶段二 v1.4.x
25
每个版本发布后都有用户立刻测试
三条反馈,改变了产品
反馈 01
「RESTful API 密钥在哪找?上面写了一大段,但我
只看当前输入行
」
→ 每个输入前加行内提示
反馈 02
「模型那步没有 key 就卡死了,没有后退」
→ 留空 = 跳过,之后补全
反馈 03
「大段提示被忽略」
→ 渐变框与输入行同时给
修法很具体:把提示写进输入行本身 ——
App ID (console.shengwang.cn → 总览 → 项目信息):
你精心排版的大段说明,
他不看。
MONEY QUOTE · 04
用户只看
当前输入行
三条反馈的共同规律只有这一句。
关键信息不在你排版最漂亮的地方,在光标闪的那一行。
ACT V / V
PLATFORM
这是方向性的跳跃
CLI 解决了「体验」,但没解决「开发」。开发者用 convoai go 试完觉得不错,然后呢?
他需要的是:一个自己的项目,有前端、有后端、能改、能部署。阶段三,约 8 小时。
I Token 账
II 发版速度
III 阶段一
IV 阶段二
V 阶段三
ACT V · 阶段三 v1.5–v1.6
28
在写任何代码之前,先定五件事
五个关键设计决策
01
前端栈
纯 HTML + Vanilla JS ——
8 小时约束,零依赖,开发者拿到就能改
。
02
后端栈
Node 主 + Python stub —— 同生态,一个 npm run dev 跑起来。
03
凭证流转
.env + .env.example —— 业界标准,安全,不泄露到 git。
04
API 调用
直接 REST API —— 透明,有教育价值,
不藏在 SDK 后面
。
05
dev 机制
CLI 检测 + delegate npm —— starter 独立运行,CLI 只是入口。
五个决策都不是技术偏好,是
对「开发者拿到之后要干什么」的判断。
ACT V · 阶段三 v1.5–v1.6
29
四条命令,一条完整旅程
开发者路径
DEVELOPER PATH · FOUR COMMANDS
convoai quickstart
配置凭证(首次)
convoai go
一键体验(试用 / 售前)
convoai init
创建 starter 项目(正式开发)
convoai dev
启动开发环境(日常)
从「听说声网有个语音 AI」到「我有一个自己的项目在本地跑着」。
实现阶段把 12 个 Task 拆给 Subagent 并行执行,一个 subagent 一口气创建了全部 22 个 starter 模板文件。
CLI 不再只是一个入口,
它成了通往「自己的项目」的那条路。
ACT V · 阶段三 v1.5–v1.6
30
这个项目实际上用了四个模型交叉审查代码
不同模型有不同的盲区
Claude
代码生成最强
Codex
对 npm 生态边缘 case 更敏感
Gemini
对架构简化有直觉 · DataStream 简化路径
GPT
对竞态条件有嗅觉 · 初始化竞态
ConvoAI CLI 代码
四个模型交叉审查
跨模型 Review 不是噱头,
是正在成型的工程实践。
ACT V · 阶段三 v1.5–v1.6
31
三轮跨模型 Codex Review
不是 Claude 审自己的代码
01
第 1 轮
agora-rtc-sdk-ng 的 exports 字段拦截子路径 resolve。
02
第 2 轮
非 TTY 环境进 inquirer 阻塞、Gemini URL 模板未替换、Python 缺 interrupt。
03
第 3 轮
Windows spawn 需要 shell:true、端口检查硬编码、RTM 失败无 fallback。
加上 v1.5.0 阶段用 Gemini 和 GPT 做的架构 Review,一共四个模型。
(Starter 规模:原文数据表记「20 文件 / 1,629 行」,正文记「22 个模板文件」,此处照原文并列。)
三轮,12 个问题,
全部修完。
MONEY QUOTE · 05
不同的模型
有不同的盲区
Claude 的代码生成最强,但 Codex 对 npm 生态的边缘 case 更敏感,
Gemini 对架构简化有直觉,GPT 对竞态条件有嗅觉。
ACT V · 阶段三 v1.5–v1.6
33
字幕战争
完美方案被环境挡住了
DataStream
用户语音转文字
Agent 回复字幕
DataStream 不发
切到 RTM?
需要在声网 Console 额外开通 RTM 服务
新用户大概率没开
最终方案:DataStream 拿用户字幕 + history API fallback 拿 Agent 回复
不完美,但能用。
这就是做产品的现实。
MONEY QUOTE · 06
你想要的完美方案
被环境约束挡住了
你得在约束里找到
能 ship 的方案
DataStream 不发 Agent 字幕,RTM 又要用户额外开通服务。
能 ship 的那一版,长得不好看,但它上线了。
全景回看
35
33 个工作小时,跨 3 天
四个阶段,四种产品性质
17h
v1.0→v1.2.1
CLI 核心 + OpenClaw 集成 ——
工具
3h
v1.3.x
渐变 UI + i18n + 步骤重排 ——
品牌化工具
5h
v1.4.x
convoai go + 控制面板 + 用户反馈修复 ——
产品
8h
v1.5→v1.6
init/dev + Starter + 三层架构 ——
Developer Platform
中间没有一次「重写」。每一层都是在上一层还能跑的前提下,
把它往前推了一格。
现在这个版本,已经可以用「平台」
而不是「工具」来称呼了。
现在的状态
36
三条命令,覆盖完整旅程
试用、体验、开发
# 试用(3 分钟)
curl
-fsSL https://convobench.org/install.sh | bash
# 体验(10 秒)
convoai
go
# 开发(2 分钟)
convoai
init
my-voice-app && cd my-voice-app && convoai
dev
01
ROADMAP
ConvoBench
语音 Agent 自动化评测。
02
ROADMAP
Telephony connector
接上电话网络。
03
ROADMAP
React 模板
Starter 的第二个技术栈。
还没结束。
但这个版本已经站得住「平台」这两个字。
带走
37
如果只带走三件事
这三天里最可复用的三条
01
给流程
只让 30% 的 Token 去写代码
学习、设计、Review、调试占掉 70%。先想后写、先测后发,Token 的利用效率会高得多。
02
给命令
按「第几次用」来设计入口
不要让用户在 30 个命令里挑。第一次给 quickstart,第二次给 go,想换配置给 go --setup。
03
给审查
换一个模型再审一遍
Claude 生成、Codex 抓 npm 边缘 case、Gemini 简化架构、GPT 嗅竞态。四个模型,12 个问题。
那些阻碍你把想法变成可用版本的中间环节 ——
排期、等待、联调、发布窗口 —— 正在一个一个被碾平。
MONEY QUOTE · 07
「能力到交付」的鸿沟
正在被系统性地消除
以前的瓶颈是「做不出来」。现在的瓶颈是「想不清楚」。
做不出来可以靠加人加时间。想不清楚,加多少人都没用。
谢谢
一个产品的三天
从工具,到品牌化工具,到产品,到平台。
Author
姚光华 Colin · 声网 ConvoAI
一手源
本人 2026-04-02 – 04-04 开发记录
数据口径
Token 实际 5–6M(上篇标注 ~4M)
立场提示
作者即项目作者,非第三方评测
EDIT
浅底