kimi cli采用ts重构,python真的是ai时代的宠儿吗?
Python训练模型,TS编织工具:为什么AI编码工具集体倒向TypeScript
月之暗面(Moonshot AI)前段时间做了一个决定:将 Kimi Code CLI 从 Python 完整重写为 TypeScript,此言一出,不少人又讨论起来了,ai时代,python真的是ai的母语吗?
这个决定之所以值得关注,不是因为"某个团队换了个语言"这种事有多稀奇,而是因为它刚好碰到了一个很多人已经默认结论成立的领域。过去很长一段时间里,行业里几乎没人怀疑一件事:谈到 AI,Python 就是默认答案。PyTorch、TensorFlow、Hugging Face Transformers、LangChain,这些名字把这种印象撑得很牢。
但如果你观察过去一年涌现出来的AI编码工具(AI Coding Tools),会发现一个有意思的反差:
- Anthropic 的 Claude Code 使用 TypeScript 构建
- 开源社区的 Open Code 使用 TypeScript
- Kimi Code CLI 在2026年6月从Python重写为TypeScript
- VS Code 生态中最流行的AI编程助手 Continue、Cline 都是 TypeScript 项目
- 代码编辑器 Cursor、Windsurf 基于 Electron + TypeScript 构建
Python 在模型训练和数据科学领域依然是绝对王者,但到了“用 AI 做开发者工具”这一层,TypeScript 的存在感就明显强了很多。它不是单纯“更顺手”那么简单,背后其实是一串工程约束和生态选择在起作用。
这篇文章想顺着这个现象往下聊两件事:为什么会这样,以及它说明了 AI 时代的软件开发正在往什么方向分层。
Python是AI时代最好的语言"这个共识从何而来
在讨论为什么 TS 会在工具层里冒头之前,先把 Python 为什么会被推上神坛这件事说清楚。这个共识当然不是凭空来的。
Python 的地位,主要靠三层东西撑起来:
第一层:科学计算生态的积累。 NumPy(2005年)、SciPy(2001年)、Pandas(2008年)——这些库在深度学习浪潮到来之前,就已经在科学计算和数据分析领域建立了十多年的生态。当2012年AlexNet引爆深度学习革命时,Python不是被"选中"的,它是唯一一个拥有成熟数值计算生态的高级语言。研究者用它做实验、写论文、复现结果,自然就把它带到了深度学习的世界。
第二层:框架的路径锁定。 TensorFlow(2015年)和PyTorch(2016年)都选择Python作为一等公民接口。这不是巧合——Python的C扩展机制让框架可以把计算密集的部分丢给C++/CUDA,同时保留Python的灵活性作为"胶水层"。研究者和工程师围绕这两个框架构建了整个生态:Hugging Face、Fastai、Ray、LangChain、LlamaIndex……生态一旦形成,迁移成本是指数级的。
第三层:"低门槛+高表达力"的心智占领。 Python的语法简洁,缩进即语法块,没有花括号和类型声明的负担,研究者可以快速把数学公式翻译成可运行的代码。在Jupyter Notebook这种交互式环境中,Python几乎是"思考的延伸"。
这三层叠在一起,确实形成了一个很难撼动的堡垒。放在“训练模型、做实验、处理数据”这个场景里,Python 基本就是最优解。但问题也出在这里:很多人顺手把“Python 在 AI 研究和训练中最好”扩大成了“Python 在所有 AI 开发里都最好”。这其实是两件完全不同的事。
语言的优势从来不是绝对的,它更像是场景的函数。Python 统治的是模型层和数据层,但 AI 应用层,尤其是开发者工具层,面对的是另一套工程问题。
反直觉的信号:TS正在接管AI工具层
先看一组很直观的事实。下面这些工具,技术栈已经说明了很多问题:
| 工具 | 类型 | 构建语言 | 运行时 |
|---|---|---|---|
| Claude Code | 终端AI编程Agent | TypeScript | Node.js |
| Kimi Code CLI | 终端AI编程Agent | TypeScript(2026年6月从Python重写) | Node.js |
| Open Code | 开源终端AI编程Agent | TypeScript | Node.js |
| Cursor | AI代码编辑器 | TypeScript | Electron/Node.js |
| Windsurf (Codeium) | AI代码编辑器 | TypeScript | Electron/Node.js |
| Continue | VS Code AI编程插件 | TypeScript | VS Code Extension Host |
| Cline | VS Code AI编程Agent | TypeScript | VS Code Extension Host |
| Aider | 终端AI编程助手 | Python | Python |
这个列表里,Aider 算是 Python 阵营里最有代表性的工具,但数量上已经不占优势了。Kimi Code CLI 从 Python 迁到 TS 这件事之所以更值得被拿出来说,是因为它不是“从一开始就选了 TS”,而是确实比较过、用过之后才换的。
自然就会冒出一个问题:为什么?这些团队不可能不知道 Python 在 AI 生态里的优势。他们最后还是选了 TS,通常不是出于偏好,而是因为工程实践里确实撞到了 Python 不太好处理的地方。
工程真相:为什么TS在工具层更胜一筹
AI 编码工具本质上是什么?它们不是训练框架,也不是模型服务,更像是一种编排型应用(Orchestration Application)。它们的工作流大致就是这些:
- 从LLM API流式接收token
- 解析模型输出中的工具调用
- 在文件系统中读写文件
- 启动子进程(终端命令、测试、构建)
- 管理终端会话(PTY)
- 与IDE/编辑器通信(LSP、DAP、扩展API)
- 维护多轮对话状态
- 打包分发到用户机器
拆开来看,这 8 项工作里,几乎没有哪一项是 Python 的传统强项;反过来,有好几项正好踩在 Node.js/TypeScript 的舒适区里。
分发模型:“用户装好就能用” vs “请先配置环境”
这大概是最要命的一点。
AI 编码工具是给终端用户直接装在自己电脑上的产品,不是放在服务器上跑的服务。它得兼容 Mac、Windows、Linux,还得尽量做到“一键装好,打开就能用”。
在这个场景里,Python 的分发体验会把很多原本不复杂的事情变得很麻烦:
- 版本问题:用户可能有Python 3.9、3.10、3.11、3.12,不同版本行为不同
- 虚拟环境:venv、conda、poetry、uv……光是工具选择就足以让非Python开发者困惑
- 原生依赖:很多包需要编译C扩展,Windows用户会遇到"缺少Visual C++ Build Tools"的问题
- PATH问题:pip install之后命令找不到,或者pip指向错误的Python版本
- 权限问题:全局安装需要sudo,用户级安装可能不在PATH中
Kimi Code CLI 最初用 Python 时,安装流程要先装 uv,再用 uv 装 kimi-cli,还得确认 Python 版本在 3.12 到 3.14 之间。对熟悉 Python 的人来说,这还不算离谱;但对面向所有开发者的工具来说,每多一步,都会让一部分人直接放弃。
而TypeScript/Node.js的分发方案是什么?
- npx一键运行:
npx claude-code不需要预先安装,自动下载执行 - 单二进制打包:用esbuild、pkg、bun build --compile可以打包成单个可执行文件,用户不需要装Node.js
- npm全局安装:
npm install -g @anthropic-ai/claude-code,一行命令,PATH自动配置 - Bun的分发能力:Bun可以直接把TS项目编译成单个可执行文件,无需用户安装任何运行时
Kimi Code CLI 迁到 TS 以后,安装路径就简单多了,国内 OAuth 登录也更顺了些。用户感受到的变化是直接的,不是抽象意义上的“更优雅”。
异步I/O模型:流式场景的原生优势
AI工具的核心交互模式是流式输出(Streaming)——模型一个token一个token地生成,工具需要实时接收、解析、展示,同时并行处理文件I/O、子进程输出、用户键盘输入。
这就是典型的高并发 I/O 场景。Node.js 从一开始就很适合干这个:
// TypeScript: 流式处理LLM响应——自然且直观
const stream = await anthropic.messages.create({
model: "claude-sonnet-4",
messages: conversation,
stream: true,
});
for await (const event of stream) {
if (event.type === 'content_block_delta') {
process.stdout.write(event.delta.text);
// 同时检测工具调用
if (detectToolCall(event.delta.text)) {
// 触发工具执行
}
}
}
Python 当然也有 asyncio 和异步生成器,但它的异步生态一直有几个绕不开的问题:
- 异步/同步的分裂:Python标准库中大量模块是同步的(requests、subprocess等),异步版本需要用不同的库(aiohttp、asyncio.subprocess),两套API不兼容。很多第三方库不支持异步,一旦在异步函数中调用了同步阻塞调用,整个事件循环就卡死了。
- 终端交互生态:Python的异步终端处理库(如prompt_toolkit的async模式)比Node.js生态成熟度低,彩色输出、PTY管理、实时键盘输入处理等方面Node.js的方案更成熟。
- 心智负担:Python开发者经常纠结一个函数该不该async、什么时候用await、哪些库支持异步。Node.js的异步模型是统一的——几乎所有I/O都是非阻塞的,async/await是默认写法。
对于一个要同时处理 API 流、文件系统事件、子进程输出和用户键盘输入的工具来说,Node.js 的事件循环模型确实更自然。
JSON原生性:AI通信协议的零摩擦
整个 AI 生态的通信协议,几乎都绕不开 JSON:
- OpenAI/Anthropic API的请求和响应都是JSON
- Function Calling / Tool Use的schema是JSON Schema
- MCP(Model Context Protocol)的消息格式是JSON-RPC
- VS Code扩展API的消息传递是JSON
- LSP(Language Server Protocol)的消息格式是JSON
JavaScript/TypeScript 对 JSON 的处理,天然就比较顺手。对象序列化和反序列化是语言内置能力,不需要额外引入什么东西:
const toolCall = {
name: "read_file",
input: { path: "/src/main.ts" }
};
// 直接使用,无需json.dumps/json.loads
Python 当然也能处理 JSON,但它总得先 import json,再 json.dumps() / json.loads(),而且 Python 里的某些类型和 JSON 并不是一一对应的,比如 tuple、set、datetime 这些东西经常要额外处理。真正麻烦的是,当你要在 JSON 和类型系统之间来回转换时,TypeScript 至少能在编译期先帮你挡掉一部分 schema 不匹配的问题。
IDE生态绑定:编辑器是AI工具的主战场
AI 编码工具越来越多地以 IDE 插件的形式出现。VS Code 是目前最常用的代码编辑器之一,而它的扩展 API 本身就是给 JavaScript/TypeScript 准备的。
- VS Code扩展只能用JavaScript/TypeScript编写
- Language Server Protocol(LSP)虽然语言无关,但官方参考实现vscode-languageserver-node是TS写的,生态最成熟
- Debug Adapter Protocol(DAP)同样在JS/TS生态中支持最好
- VS Code的终端API、文件系统API、编辑器操作API全部是JS/TS接口
如果你用 Python 写 VS Code 扩展,通常就得先绕一层 Node.js,复杂度会立刻上来;不然就只能退到 LSP 服务器这一层,能做的事情又会受限。Cursor 和 Windsurf 这类基于 Electron 的编辑器,从前到后都用 TS/JS,其实也就顺理成章了。
类型系统:编排代码的安全网
AI 编码工具的核心逻辑,说到底还是状态机 + 编排:管理对话轮次、追踪工具调用链、处理文件编辑冲突、维护上下文窗口。这类代码有几个很明显的特点:
- 数据结构复杂(嵌套的消息历史、工具调用栈、文件补丁)
- 状态转换多(idle → streaming → tool_use → executing → streaming …)
- 边界情况多(API超时、token截断、文件不存在、进程被kill)
TypeScript 的静态类型系统,在这里确实能帮上忙:
// 消息类型被精确描述,编译器会帮你检查每个分支
type Message =
| { role: 'user'; content: string }
| { role: 'assistant'; content: ContentBlock[] }
| { role: 'tool_result'; tool_use_id: string; content: string };
type ContentBlock =
| { type: 'text'; text: string }
| { type: 'tool_use'; name: string; input: Record<string, unknown> };
用联合类型去描述消息格式时,编译器会逼着你把各个分支都处理到,漏了就过不了编译。Python 3.10 以后也有 match/case 和类型提示,但它的类型系统毕竟是可选的,不会在运行时强制检查,大量第三方库也没把类型标注补齐。在快速迭代的工具开发里,编译期发现问题和运行时才发现问题,差别真的很大。
全栈统一:从CLI到TUI到Web的一套语言
AI 工具往往会同时长出好几种界面:CLI 命令行、TUI、Web Dashboard、IDE 插件。TypeScript 的好处是,这几块可以尽量放在同一套语言里做:
- CLI/TUI:Node.js + Ink(React for CLI)、Commander.js、Chalk
- Web Dashboard:React/Next.js
- IDE插件:VS Code Extension API
- 后端逻辑:Node.js/Fastify/Express
- 桌面端:Electron
Python 也能做 CLI,Click、Typer、Rich 都很好用,但一旦要往 Web 前端或 VS Code 插件扩展,就还是得切回 JS/TS 或者加桥接层。对小团队来说,尽量用一套语言把前后端和工具链连起来,往往意味着更少的认知切换和更快的迭代。
更深层的分野:AI的两层架构
把视角拉远一点,Python 和 TS 之间的这种分工,其实反映的是 AI 产业正在慢慢分层:
┌─────────────────────────────────────────────┐
│ 应用层(Application Layer) │
│ AI工具、AI Agent、AI编辑器、AI工作流自动化 │
│ 编排逻辑、用户交互、状态管理、工具调用 │
│ 语言主力:TypeScript / JavaScript │
├─────────────────────────────────────────────┤
│ 模型层(Model Layer) │
│ 模型训练、推理优化、数据处理、科学计算 │
│ 张量计算、GPU编程、分布式训练、实验管理 │
│ 语言主力:Python(+ C++/CUDA/Rust底层) │
└─────────────────────────────────────────────┘
这两层面对的,本来就是两类不一样的工程问题:
模型层的核心矛盾是算力和数学。 你要在数百张GPU上并行训练千亿参数的模型,要处理张量运算的数值稳定性,要管理PB级的训练数据,要实现复杂的优化器和并行策略。这是Python(作为C++/CUDA的"胶水")的绝对优势地带。
应用层的核心矛盾是分发和交互。 你要把AI能力包装成用户能直接用的产品,要处理流式I/O、终端交互、文件系统操作、进程管理、网络通信、跨平台分发。这是Node.js/TypeScript的优势地带。
这不是谁取代谁的问题,更像是各自回到自己擅长的位置。就像 Web 开发里,我们很少认真争论“前端为什么不用 Java、后端为什么不用 JS”一样,AI 领域也在经历类似的分层。
值得注意的是,这个分层还在被新的运行时继续推一把。Bun 和 Deno 的出现,让 TS 在 CLI 和工具场景里的体验更完整了:Bun 把打包器、测试运行器、包管理器都揉在了一起,能直接把 TS 项目编成单个可执行文件;Deno 默认更谨慎,文件系统和网络访问都需要显式授权,拿来做不可信代码的执行沙箱也比较合适。这对需要执行 AI 生成代码的工具来说,意义不小。
Python 阵营这边,uv 确实把包管理体验改善了不少,但它解决的是“Python 包管理很烦”这个问题,不是“Python 作为工具分发层不够省事”这个问题。GIL、同步/异步分裂、分发复杂度,这些更像是语言和生态层面留下来的老问题,不是换个包管理器就能抹平的。
但Python不会消失——它只是回到了它的位置
说了这么多 TS 的优势,有必要先把话说稳一点:这不是一篇“TypeScript 将取代 Python”的文章。
Python 在下面这些领域里,依然很难被替掉:
- 模型训练和研究:PyTorch、JAX、DeepSpeed、Megatron-LM——这些框架的Python绑定是研究者的日常工具,TS在这个领域几乎没有存在感
- 数据处理和ML管道:Pandas、Polars、Apache Arrow、Airflow、MLflow——数据工程的基础设施依然是Python为主
- 科学计算和数值分析:NumPy、SciPy、Matplotlib、SymPy——这些领域有几十年的积累
- 快速原型验证:如果你只是想快速验证一个AI idea,写个脚本调API,Python依然是最高效的选择
- 服务端AI部署:FastAPI + vLLM/TGI的组合依然是模型服务部署的主流方案
一个挺实际的现象是,很多用 TS 构建的 AI 工具,在真的要做复杂数据处理或者接 ML 管道时,最后还是会转身去调用 Python 脚本。TS 负责编排和交互,Python 负责计算和数据,这其实是很多团队已经在用的折中方案。
真正好的技术选型,往往不是“选最好的语言”,而是“让每一层用最合适的语言”。
写在最后
前面绕了一圈,其实想说明的事情并不复杂:如果讨论的是模型训练、数据处理和科学计算,Python 仍然是 AI 世界里最稳妥、也最成熟的选择;但如果讨论的是 AI 应用层,尤其是 CLI、IDE 插件、Agent 编排、MCP 工具这一类偏工程实现的东西,TypeScript 往往会更顺手。
Kimi Code CLI 从 Python 改写到 TS 这件事之所以值得拿出来说,不是因为它证明了“TS 比 Python 更先进”,而是因为它把工程约束摆得很明白。一个项目在原型阶段能跑起来,不代表它在分发、异步交互、类型约束和前后端协同这些问题上也同样合适。等系统真的做大以后,语言选择往往就不只是个人偏好,而是被场景一点点推着走。
再往后看,AI 工具链大概率会继续分层。Python 还是会留在模型和数据那一侧,TypeScript 继续负责应用层的编排和交互,Rust 则更多出现在性能敏感的底层组件里。与其继续争论“AI 时代到底哪门语言最好”,不如先把问题说清楚:你面对的究竟是训练问题、工程问题,还是基础设施问题。
更多推荐


所有评论(0)