我如何用一个周末用 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:
                break

github.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