我如何用一个周末用 Rust 重写 Kimi CLI
钱宇超 / RC
编程语言不存在了?!
- 显然是 PHP(bushi
到底谁是最好的编程语言?
- Claude Code - TypeScript
- Codex CLI - Rust
- Gemini CLI - TypeScript
- Pi - TypeScript
- OpenCode - TypeScript
- Amp - TypeScript
- Kimi CLI - Python
谁是最好的写 Agent 的语言?
- 最开始基于 Python Agent 框架
- 开发速度快
- RL 框架整合
- CLI 体验
- Agent SDK 直接透传
Kimi CLI 为什么选择 Python?
然而,编程语言不重要了……
- 在 Kimi 半年,1.5 人之力从零打造 Kimi CLI
- 写过 OS 内核(SJTU IPADS)、DB 内核(RisingWave)
- 在 MCP hype 的时候预言过 CLI + README 是正解
- 大学写了 CQHTTP、NoneBot 等知名开源 Chatbot 项目
- 小学五年级写了第一行代码
我是谁
x.com/istdrc
github.com/stdrc
Kimi CLI
架构大揭秘
github.com/
MoonshotAI/kimi-cli

Kosong
LLM 抽象层
async def agent_loop(chat_provider: ChatProvider, toolset: Toolset):
system_prompt = "You are a helpful assistant."
history: list[Message] = []
while True:
user_input = input("You: ").strip()
if not user_input:
continue
if user_input.lower() in {"exit", "quit"}:
break
history.append(Message(role="user", content=user_input))
while True:
result = await kosong.step(
chat_provider=chat_provider,
system_prompt=system_prompt,
toolset=toolset,
history=history,
)
tool_results = await result.tool_results()
assistant_message = result.message
tool_messages = [tool_result_to_message(tr) for tr in tool_results]
history.append(assistant_message)
history.extend(tool_messages)
# ... print something
if not result.tool_calls:
breakgithub.com/
MoonshotAI/kimi-cli/
packages/kosong
KAOS
OS 抽象层
async def main() -> None:
api_key = os.getenv("E2B_API_KEY")
if not api_key:
raise RuntimeError("E2B_API_KEY is required to use E2B sandboxes")
work_dir_path: str = os.getenv("KIMI_WORK_DIR", DEFAULT_WORK_DIR)
sandbox: AsyncSandbox = await _get_sandbox()
e2b_kaos: E2BKaos = E2BKaos(
sandbox,
cwd=work_dir_path,
)
token = set_current_kaos(e2b_kaos)
try:
work_dir: KaosPath = KaosPath(work_dir_path)
await work_dir.mkdir(parents=True, exist_ok=True)
async for msg in prompt(
"You are in a E2B sandbox. Explore the environment. \
Try all your tools!",
work_dir=work_dir,
agent_file=AGENT_FILE,
yolo=True,
):
print("─" * 60)
print(msg)
print("─" * 60)
finally:
reset_current_kaos(token)
github.com/
MoonshotAI/kimi-cli/
packages/kaos
Wire
消息总线
type Event = (
TurnBegin
| SteerInput
| TurnEnd
| StepBegin
| StepInterrupted
| CompactionBegin
| CompactionEnd
| MCPLoadingBegin
| MCPLoadingEnd
| StatusUpdate
| Notification
| ContentPart
| ToolCall
| ToolCallPart
| ToolResult
| ApprovalResponse
| SubagentEvent
)
"""Any event, including control flow and content/tooling events."""
type Request = ApprovalRequest | ToolCallRequest | QuestionRequest
"""Any request. Request is a message that expects a response."""
type WireMessage = Event | Request
"""Any message sent over the `Wire`."""github.com/
MoonshotAI/kimi-cli/
src/kimi_cli/wire
- 重写除了 UI 的部分,对外仅保留 Wire API
- 功能、配置、元数据、与客户端的交互、与模型的交互,与现有实现完全等价
Rust 重写目标
- 原始代码质量
- 模块划分清晰,职责边界明确
- 单元测试、端到端测试完备
- Agent 与模型
- Codex CLI + gpt-5.2-codex xhigh
- ChatGPT Pro 订阅(重写消耗了 60% 的周限额)
前置条件
- 迭代形成最终 prompt
- 若干次测试运行,大约 10~30 分钟观察一下 Agent 行为
- 发现跑偏时,分析原因并调整 prompt
- 放弃当前生成的代码,在新 session 重新开始
- 反复迭代,最终形成一个相对全面的大 prompt
Prompt Engineering
- Prompt 核心要点
- 强调完全等价
- 同步单元测试
- Context, not control
- 计划先行
- 关键上下文保持
Prompt Engineering
- 迭代模式
- Codex 会无视 prompt 中“完全做完再停”的要求,而停下来建议 next step
- 不需要理会它的建议,直接重新发送完整 prompt +“继续实现知道完全做完”
- 时间投入
- 经过两天、十几到二十轮这样的迭代
- 不占用主要精力,仅偶尔看一下
- Ralph Loop
执行过程
- 端到端测试
- 使用独立 session 根据项目文档生成循序渐进的端到端 snapshot 测试
- 测试应模拟真实使用场景
- 先针对 Python 旧版产生 snapshot 基准
- 在新的 session 中,让 Codex 根据 prompt、plan 和已有实现进行修改,直到通过所有端到端测试
验证阶段
- 适当的人工 review,主要关注:
- 模块划分是否完全等价
- 重要模块的函数划分是否完全等价
- 重要函数的实现是否等价
验证阶段
- Agent 代码审计
- 在验证阶段,多次(约 10 次)在新的 session 中让 Codex 进行彻底的代码审计
- 确保 Rust 和 Python 版本行为一致
- 如果发现原版的 bug,先不处理,让 bug 也被复刻(保持行为一致优先)
- 从纵向模块切分(tool、agent loop、chat provider)和横向的关注点切分(logging、serialization)角度,进行多维度的审计
验证阶段
- Vibe Testing,用 Rust 版本进行实际场景测试
- 运行 Kimi Agent SDK 的 example
- 接入 Kimi Code VS Code 扩展
- 通过真实场景验证兼容性
验证阶段
- https://github.com/MoonshotAI/kimi-cli/pull/717
- PROMPT.md:经过多次迭代形成的完整任务描述
- PLAN.md:详尽的重写计划,包含进度记录、模块映射、测试清单等
- Rust 代码:三个 crate(kagent、kosong、kaos)的完整实现
- 原始 Python 代码约 4 万 4 千行
- Rust 重写版(不包括 UI 和第三方 chat provider),花了 2 万 7 千行
- 测试套件:单元测试、集成测试、端到端测试
关键产出物
- 重写任务的成功依赖于:
- 良好的原始代码质量和端到端测试
- 充分的前期 prompt 调试
- 详尽的计划文档作为上下文锚点
- 耐心的迭代执行
- 饱和式 AI 代码审计
- 最重要的:
- 信仰之跃
总结

- 谁是最好的 Coding Agent 和模型?
编程语言不重要了,那么……
- CoachAgent
- Agent-driven Agent Loop
- 全自动文档同步
- 文档代码饱和式对齐
- 边拜年边 KTV 不到一周上线 Slock
- 纯 vibe,不看一行代码
- 感受复杂性
其他花活
- Slock:https://slock.ai
- 多 Agent 多人协作平台
- 初版 demo 早于 OpenClaw hype
- Slack-like 的 UX 和 AX 只是开始
- Building Slock on Slock
小广告

- 谢谢观看!
- 欢迎关注~
- https://x.com/istdrc
- https://github.com/stdrc
Q&A
我如何用一个周末用 Rust 重写 Kimi CLI
By stdrc
我如何用一个周末用 Rust 重写 Kimi CLI
- 579