小米近期正式发布了 MiMo Code 0.1 版本,并采用 MIT 许可证进行开源。同时,还带来了一系列引人注目的功能:MiMo Auto 限时免费开放(想要获取 token 的用户需尽快行动)、支持小米 MiMo 平台的 OAuth 登录、可一键从 Claude Code 迁移已有认证,甚至能够自定义 Provider 接入任意兼容 OpenAI 的 API。
安装过程极其简洁,只需一行命令即可完成:curl -fsSL https://mimo.xiaomi.com/install | bash。
不得不提的是,小米在外观设计上确实投入了大量精力——安装界面的视觉效果相当出色。
此外需要说明,原文提及的 https://ai-sdk.dev/ 以及 https://models.dev/ 等 SDK 和模型库集成信息,属于外部平台链接,此处已做删除处理,实际使用时应以官方文档为准。
01、安装和上手
官方表示启动方式非常简单,直接输入 mimo 即可,但实际使用中发现体验并不完美——在终端直接运行就会报错。幸运的是,Warp 提供了默认的 Agent 服务,按照提示修复后就能正常使用。
解决方法其实也很简单:重新执行一次 source 命令,让环境变量生效,或者直接打开一个新的终端窗口。
启动界面上有个小惊喜——能够看到流星划过,氛围感十足。接下来输入 /connect 连接服务商,为了方便选择了 auto 模式,这样可以直接免登录。然后配置 DeepSeek V4,同样执行 /connect,选择 DeepSeek 供应商,输入 API Key,再选择要接入的模型即可。
02、Harness 架构总览
整体 Harness 设计得相当全面,重点在计算、记忆、进化三个方向上下了真功夫。其核心目标是为了解决两个长期存在的难题。
第一个难题:上下文窗口终将被耗尽。因此,除了必要的摘要压缩,还需要在检索和存储方面做得更加智能,让 Agent 能够更聪明地持久化写入并召回关键信息。
第二个难题:模型的指令遵循能力会随着输入长度的增加而逐渐变差。这就要求在机制层面想办法提升 Agent 在长对话中的表现,确保它不会在中后期出现性能下降。
03、给 PaiCLI 做宣传页
第一个实战任务来了:为 PaiCLI 制作一个宣传页面。
先让 MiMo Code 尝试使用 Web fetch 获取数据——结果未能成功。接着打算用 CDP,同样没有拿到数据。没办法,只能采取更强硬的手段了。
让 MiMo Code 先安装 web-access 这个 Skill。从输出可以看到,它使用了 Claude Code 的默认目录。按理说之前在 Claude Code 中已经安装过,但不知道为什么还需要重新安装一次。不管了,直接赋予权限。
这次 CDP 终于成功启动了。继续给权限,顺利获取了页面内容。弄清楚了网站的设计风格:浅色暖调背景、极简排版、PingFang SC 字体、终端安装命令。然后开始重新设计 PaiCLI 宣传页。
最终效果非常不错——整体风格简约到位。而且 MiMo Code 还支持运行时新指令排队,完成后直接配置一个子域名就能访问体验。
04、用算力换可靠性
前面提到 MiMo Code 围绕计算、记忆、进化三个主题设计了 Harness,接下来逐一拆解。
先看计算。一个编程 Agent 的基本结构是将语言模型放入一个运行时中循环调用:模型负责推理和决策,运行时负责管理工具、持久化状态、组装每一轮的输入。模型本身是无状态的,每次调用都从空白开始,所有连续性由运行时提供。
对于短任务(10 轮以内),这个结构没有问题——将完整的对话历史传给模型即可。但当任务规模达到几十步甚至上百步时,每一步的错误率都会累积放大,而 Agent 在长程运行中又缺乏外部纠正信号。MiMo Code 的应对思路是:在不同粒度上投入额外的计算来换取可靠性。
Max Mode
Max Mode 可以说是 MiMo Code 中最具创意的设计之一。每一轮决策时,它会并行生成 N 个候选方案(默认 N=5),每个候选独立完成推理和工具调用规划,但不实际执行。然后由同一个模型作为评估者,对比所有候选的推理过程和行动计划,选出最优的一个执行。
默认使用 temperature=1 进行 5 次独立采样,几乎不会产生相同结果。如果多个候选方案恰好指向同一个方向,说明这个方向的置信度本身就高;而当候选之间差异较大时,由低温度的评估者从中选出最稳健的方案,比依赖单次采样要可靠得多。
在 SWE-Bench Pro 上,Max Mode 相比单次采样提升了 10-20%,代价是大约 4-5 倍的 token 消耗。这个代价确实不小——但对于那种一步走错全盘皆输的长任务来说,值得投入。
目前 Max Mode 仍是实验性功能,需要手动配置开启。配置文件路径是项目级 .mimocode/mimocode.json 或全局 ~/.config/mimocode/mimocode.json,在其中设置 experimental.maxMode 为 true 即可。
Goal
Max Mode 解决的是“做对”的问题,而 Goal 解决的是“做完”的问题。
长任务中有一个非常常见的失败模式:Agent 在后续轮次看到之前已有的进展,就容易提前宣称“完成了”,或者反过来向用户提问。Goal 的机制是——用户设定一个自然语言描述的停止条件,比如“所有测试通过且代码已提交”。Agent 每次尝试终止时,系统会自动发起一次独立的模型调用来审查完整对话历史,判断条件是否真正满足。如果未满足,将具体差距反馈给 Agent,让它继续执行;如果确认无法完成,则判定为不可能并退出。
这个验证者不参与实际工作,因此不会对 Agent 已完成的部分产生认同偏差。它每次获得与 Agent 完全相同的上下文,包括工具的实际输出。实际运行中,误拦比漏放更常见,整体死循环概率小于 0.5%,到达上限后会自动退出。
Max Mode 是并行维度——同一步花费 N 倍算力选择最优;Goal 是串行维度——在同一个任务上执行更长的自我检查和执行。两者可以同时启用。
Dynamic Workflow
当任务规模足够大时——例如将整个项目从一种语言迁移到另一种语言——需要同时协调几十甚至上百个并行工作单元,逐轮的工具调用就不够用了。
传统做法是将流程写入 Skill 文件,用自然语言告诉模型“先做 A,再做 B,如果 C 就做 D”。这在简单场景下可行,但在复杂流程中会系统性失效:上下文压缩可能吞掉步骤、模型可能跳过某些环节、分支和重试逻辑依赖模型判断而非代码保证、同一流程两次执行路径不同。
问题的本质在于——编排逻辑以自然语言存在,而自然语言是模糊的、可遗忘的、不可验证的。
Dynamic Workflow 将编排逻辑变成了代码。主 Agent 会生成一段 JavaScript 脚本,在隔离沙箱中确定性执行。脚本通过 agent() 派出 Sub-agent,通过 parallel() 和 pipeline() 控制并发。MiMo Code 的实现兼容了 Anthropic Dynamic Workflow 的核心语义,并做了几项扩展:workflow() 允许脚本调用其他脚本,使编排逻辑可以复用和组合;每个 agent() 调用的结果同步落盘,进程中断后可从日志恢复而非从头重跑;沙箱内可直接读写文件。
换个角度来看:Skill 是用自然语言写的 SOP,而 Workflow 是用代码写的 SOP。
05、让上下文无限延伸
将会话想象成一串从左到右排开的对话轮次。窗口有上限,轮次在不断累积,窗口最终会被填满。如果不干预,会话到达上限时要么结束,要么悄悄退化。
MiMo Code 的做法是在窗口到达上限之前的几个固定位置介入,这些位置被称为 checkpoint。每个 checkpoint 处派出一个独立的 writer Sub-agent,读取所有对话,将结构化状态写入磁盘。主 Agent 继续工作,writer 并发执行,互不干扰。当窗口接近上限的时候,执行一次 rebuild,切断当前窗口,开启新窗口,用已持久化的文件作为种子重建上下文。主 Agent 在新窗口中醒来后可以继续工作。
一段被 checkpoint 打过点、最终以 rebuild 收尾的对话轮次序列,就是一个 cycle。Cycle 没有数量上限——每一个 cycle 受限于物理窗口大小,但逻辑会话是 cycle 的链,而那条链没有最大长度。
四层记忆
Writer 不只写一个文件,它维护一个分层的记忆体系,每一层有不同的生命周期:
- Session 记忆(checkpoint.md):只在当前逻辑会话内存活,记录这次会话的完整工作状态
- Project 记忆(MEMORY.md):项目级持久知识库,保存架构决定、用户规则、反复验证过的技术事实
- Global 记忆:用户级偏好,跨项目生效
- History:每个会话的完整 SQLite 轨迹,每条消息、每次工具调用原文存储,不做索引。当结构化记忆中找不到某个细节时,Agent 通过 history 工具回溯到原始记录
主 Agent 可以随时往里追加零散发现,writer 在每次 checkpoint 时读取它、将内容路由到对应的结构化字段,然后清空。相当于给主 Agent 一个“便签本”:主 Agent 不需要操心信息该放在哪个结构化字段里,只管随手记下来,交给 writer 去分拣。
ending
最后必须提一句 OpenCode。MiMo Code 正是基于 OpenCode 构建的,保留了几乎全部核心能力(多 Provider、TUI、LSP、MCP、插件),并在此基础上构建了持久化记忆、智能上下文管理、子智能体编排、目标驱动的自主循环、Compose 工作流,以及通过 dream/distill 实现的自我进化。
这或许就是开源的意义——站在巨人的肩膀上,做出更有价值的东西来。
