最近翻到GitHub 上 Kimi CLI 的仓库里一个很有意思的 PR,标题写着:
"kimicli用python是彻底的失败 立刻重构为ts"。
原始 PR 我也截图在这儿了。
月之暗面的 Kimi CLI,是一个命令行AI编程助手。整个项目推倒重来,从 Python 换成 Bun + TypeScript + React Ink。提交该 PR 的开发者叫 Yuandiaodiaodiao,名字挺萌,下手挺狠。
说实话,第一反应是"打脸来得太快"。但细想一下,这个决定还是挺务实的。
以我的实际使用经验,Python 做 AI 训练、数据分析是没毛病的,非常得心应手,看 PyTorch、Hugging Face 哪个不是 Python 生态的。但拿来写 CLI 工具,那它可能有几个绕不过去的坎。
启动慢是最直接的。你敲个kimi命令,等两秒才出提示符(同样用 Python 写的 Hermes 也有这个问题),用户第一反应就是"这玩意儿卡"。而 TypeScript 配 Bun 运行时,冷启动是毫秒级的,体感完全不一样。CLI 这种东西,用户对"响应速度"的敏感度远超你的想象。
分发是另一个噩梦。Python 用户装个 CLI,得先确认 Python 版本对不对(Python 的版本问题真的是一言难尽),再折腾 pip、venv,搞不好还得解决依赖冲突。而 JS/TS 生态的 npm 虽然也有坑,但至少npm install -g kimi-cli一行搞定。对普通开发者来说,安装体验直接决定了他会不会继续用。
还有个隐性问题:类型安全。100 多个文件的规模,Python 的动态类型就成了定时炸弹。没有TypeScript 的类型系统,重构、加功能、多人协作都会越来越痛苦。项目一大,维护成本指数级上升,这是很多 Python 项目后期崩盘的常见原因。
这些问题在 AI 模型开发场景下不明显,因为研究者愿意为强大的生态忍受这些代价。但 CLI 是直接面向终端用户的,用户对"卡"和"难装"的容忍度低得多。
有意思的是,Kimi CLI 这次重写,技术栈直接对标 Claude Code。Claude Code 本身就是 TypeScript + React Ink + Bun 写的,Kimi 等于是"照着答案抄了一遍"。这不是贬义——既然行业标杆已经验证了这条路线,没必要自己再踩一遍坑。
月之暗面一开始选 Python,大概率是图快。AI工具链现成,出活快,这思路没问题,很多创业团队都这么干。问题是上线之后社区不买账,反馈很直接:慢、难装、体验差。GitHub 上早就有人吐槽"用Python 写 CLI 纯属失败",这话传了一阵子。
这时候有两种选择:解释为什么慢,或者直接重写。他们选了后者,而且PR描述里直接写"彻底的失败",连遮羞布都不要了。
我觉得这态度比技术选型本身更值得说。发现问题及时止损,比死扛"沉没成本"健康得多。技术债务最贵的从来不是代码本身,是用户的耐心。用户不会等你优化,他们会直接换工具。
还有个有意思的花絮。Kimi CLI 现在跑在 Bun 上,但 Bun 自己最近也被 Anthropic 收购后从 Zig 重写成 Rust 了—— 6755个 commit、100万行代码、13000多个 unsafe block,社区争议很大。所以 Kimi CLI 某种意义上跑在一个"正在自我革命"的运行时上面。
技术圈就是这样,没有永远的正确答案。今天的最优解明天可能就得推倒重来。微软用 Go 重写TypeScript 编译器拿了 10 倍性能提升,Bun 从 Zig 换 Rust,Kimi 从 Python 换 TypeScript ——本质上都是同一个逻辑:需求变了,工具就得跟着变。
关键不是选对一次,是发现问题之后敢不敢承认、敢不敢改。很多团队死在"我们都用 Python 写了这么多了,换掉成本太高"这种思维上。但换个角度想:现在换,损失的是几个月代码;不换,损失的是用户和市场。哪个更贵?
用 Python 写 CLI 不是失败,在错误的场景用 Python 才是。技术选型没有"政治正确",只有"适不适合"。