Day 25:MiMo Code深入学习 - 精读源码、深入分析

🤖 系列:Java工程师转AI Agent 3个月学习计划

👤 作者:宸丶一 | 28岁Java程序员

🎯 今日目标: 深入分析MiMo Code源码,学习多Agent调度、记忆系统、任务追踪

💬 个人格言: 代码改不改变世界我不知道,但先让我准时下班。


前言

Day 21只是浅尝辄止,今天要深入MiMo Code源码!

这次直接把源码复制到项目目录,加上中文注释,这样阅读起来更有逻辑性。这种"先看注释,再看代码"的学习方法,比光看英文源码有效多了。


学习目标

  1. 深入分析MiMo Code核心模块
  2. 学习MiMo Code架构设计
  3. 理解Agent模式、Prompt系统、记忆系统

一、Agent模块

核心文件:agent.ts

#mermaid-svg-h9PJkLAM46YEcyTM{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-h9PJkLAM46YEcyTM .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-h9PJkLAM46YEcyTM .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-h9PJkLAM46YEcyTM .error-icon{fill:#552222;}#mermaid-svg-h9PJkLAM46YEcyTM .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-h9PJkLAM46YEcyTM .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-h9PJkLAM46YEcyTM .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-h9PJkLAM46YEcyTM .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-h9PJkLAM46YEcyTM .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-h9PJkLAM46YEcyTM .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-h9PJkLAM46YEcyTM .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-h9PJkLAM46YEcyTM .marker{fill:#333333;stroke:#333333;}#mermaid-svg-h9PJkLAM46YEcyTM .marker.cross{stroke:#333333;}#mermaid-svg-h9PJkLAM46YEcyTM svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-h9PJkLAM46YEcyTM p{margin:0;}#mermaid-svg-h9PJkLAM46YEcyTM .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-h9PJkLAM46YEcyTM .cluster-label text{fill:#333;}#mermaid-svg-h9PJkLAM46YEcyTM .cluster-label span{color:#333;}#mermaid-svg-h9PJkLAM46YEcyTM .cluster-label span p{background-color:transparent;}#mermaid-svg-h9PJkLAM46YEcyTM .label text,#mermaid-svg-h9PJkLAM46YEcyTM span{fill:#333;color:#333;}#mermaid-svg-h9PJkLAM46YEcyTM .node rect,#mermaid-svg-h9PJkLAM46YEcyTM .node circle,#mermaid-svg-h9PJkLAM46YEcyTM .node ellipse,#mermaid-svg-h9PJkLAM46YEcyTM .node polygon,#mermaid-svg-h9PJkLAM46YEcyTM .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-h9PJkLAM46YEcyTM .rough-node .label text,#mermaid-svg-h9PJkLAM46YEcyTM .node .label text,#mermaid-svg-h9PJkLAM46YEcyTM .image-shape .label,#mermaid-svg-h9PJkLAM46YEcyTM .icon-shape .label{text-anchor:middle;}#mermaid-svg-h9PJkLAM46YEcyTM .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-h9PJkLAM46YEcyTM .rough-node .label,#mermaid-svg-h9PJkLAM46YEcyTM .node .label,#mermaid-svg-h9PJkLAM46YEcyTM .image-shape .label,#mermaid-svg-h9PJkLAM46YEcyTM .icon-shape .label{text-align:center;}#mermaid-svg-h9PJkLAM46YEcyTM .node.clickable{cursor:pointer;}#mermaid-svg-h9PJkLAM46YEcyTM .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-h9PJkLAM46YEcyTM .arrowheadPath{fill:#333333;}#mermaid-svg-h9PJkLAM46YEcyTM .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-h9PJkLAM46YEcyTM .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-h9PJkLAM46YEcyTM .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-h9PJkLAM46YEcyTM .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-h9PJkLAM46YEcyTM .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-h9PJkLAM46YEcyTM .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-h9PJkLAM46YEcyTM .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-h9PJkLAM46YEcyTM .cluster text{fill:#333;}#mermaid-svg-h9PJkLAM46YEcyTM .cluster span{color:#333;}#mermaid-svg-h9PJkLAM46YEcyTM div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-h9PJkLAM46YEcyTM .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-h9PJkLAM46YEcyTM rect.text{fill:none;stroke-width:0;}#mermaid-svg-h9PJkLAM46YEcyTM .icon-shape,#mermaid-svg-h9PJkLAM46YEcyTM .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-h9PJkLAM46YEcyTM .icon-shape p,#mermaid-svg-h9PJkLAM46YEcyTM .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-h9PJkLAM46YEcyTM .icon-shape .label rect,#mermaid-svg-h9PJkLAM46YEcyTM .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-h9PJkLAM46YEcyTM .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-h9PJkLAM46YEcyTM .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-h9PJkLAM46YEcyTM :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 权限控制
permission
用户可覆盖
hardPermission
不可覆盖
模型配置
model
直接绑定 modelID + providerID
modelRef
字符串引用
Agent模式
primary
可以作为默认Agent
subagent
不能作为默认Agent
all
自适应模式
Agent模块
Info Schema
Agent模式
模型配置
权限控制

Agent模式详解

模式 说明 示例Agent
primary 可以作为默认Agent build、plan、compose
subagent 不能作为默认Agent general、explore、dream、distill
all 自适应模式 根据配置

模型配置

typescript 复制代码
// 直接绑定模型
model: z.object({
  modelID: ModelID.zod,
  providerID: ProviderID.zod,
}).optional()

// 字符串引用
modelRef: z.string().optional()

优先级:model > modelRef

权限控制

typescript 复制代码
// 用户可覆盖的权限
permission: Permission.Ruleset.zod

// 不可覆盖的权限(用于plan模式)
hardPermission: Permission.Ruleset.zod.optional()

类比Java

复制代码
Agent ≈ Spring Bean(可配置、可注入)
permission ≈ Spring Security(权限控制)
hardPermission ≈ @PreAuthorize(不可覆盖)

二、Prompt系统

核心设计:分离Prompt和代码

#mermaid-svg-c96PFZcx1xhFOVok{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-c96PFZcx1xhFOVok .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-c96PFZcx1xhFOVok .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-c96PFZcx1xhFOVok .error-icon{fill:#552222;}#mermaid-svg-c96PFZcx1xhFOVok .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-c96PFZcx1xhFOVok .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-c96PFZcx1xhFOVok .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-c96PFZcx1xhFOVok .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-c96PFZcx1xhFOVok .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-c96PFZcx1xhFOVok .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-c96PFZcx1xhFOVok .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-c96PFZcx1xhFOVok .marker{fill:#333333;stroke:#333333;}#mermaid-svg-c96PFZcx1xhFOVok .marker.cross{stroke:#333333;}#mermaid-svg-c96PFZcx1xhFOVok svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-c96PFZcx1xhFOVok p{margin:0;}#mermaid-svg-c96PFZcx1xhFOVok .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-c96PFZcx1xhFOVok .cluster-label text{fill:#333;}#mermaid-svg-c96PFZcx1xhFOVok .cluster-label span{color:#333;}#mermaid-svg-c96PFZcx1xhFOVok .cluster-label span p{background-color:transparent;}#mermaid-svg-c96PFZcx1xhFOVok .label text,#mermaid-svg-c96PFZcx1xhFOVok span{fill:#333;color:#333;}#mermaid-svg-c96PFZcx1xhFOVok .node rect,#mermaid-svg-c96PFZcx1xhFOVok .node circle,#mermaid-svg-c96PFZcx1xhFOVok .node ellipse,#mermaid-svg-c96PFZcx1xhFOVok .node polygon,#mermaid-svg-c96PFZcx1xhFOVok .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-c96PFZcx1xhFOVok .rough-node .label text,#mermaid-svg-c96PFZcx1xhFOVok .node .label text,#mermaid-svg-c96PFZcx1xhFOVok .image-shape .label,#mermaid-svg-c96PFZcx1xhFOVok .icon-shape .label{text-anchor:middle;}#mermaid-svg-c96PFZcx1xhFOVok .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-c96PFZcx1xhFOVok .rough-node .label,#mermaid-svg-c96PFZcx1xhFOVok .node .label,#mermaid-svg-c96PFZcx1xhFOVok .image-shape .label,#mermaid-svg-c96PFZcx1xhFOVok .icon-shape .label{text-align:center;}#mermaid-svg-c96PFZcx1xhFOVok .node.clickable{cursor:pointer;}#mermaid-svg-c96PFZcx1xhFOVok .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-c96PFZcx1xhFOVok .arrowheadPath{fill:#333333;}#mermaid-svg-c96PFZcx1xhFOVok .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-c96PFZcx1xhFOVok .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-c96PFZcx1xhFOVok .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-c96PFZcx1xhFOVok .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-c96PFZcx1xhFOVok .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-c96PFZcx1xhFOVok .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-c96PFZcx1xhFOVok .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-c96PFZcx1xhFOVok .cluster text{fill:#333;}#mermaid-svg-c96PFZcx1xhFOVok .cluster span{color:#333;}#mermaid-svg-c96PFZcx1xhFOVok div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-c96PFZcx1xhFOVok .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-c96PFZcx1xhFOVok rect.text{fill:none;stroke-width:0;}#mermaid-svg-c96PFZcx1xhFOVok .icon-shape,#mermaid-svg-c96PFZcx1xhFOVok .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-c96PFZcx1xhFOVok .icon-shape p,#mermaid-svg-c96PFZcx1xhFOVok .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-c96PFZcx1xhFOVok .icon-shape .label rect,#mermaid-svg-c96PFZcx1xhFOVok .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-c96PFZcx1xhFOVok .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-c96PFZcx1xhFOVok .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-c96PFZcx1xhFOVok :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 优势
高可维护性
极强可配置性
解耦分层
Prompt分离设计
代码层
执行逻辑
配置层
Prompt模板
模型请求

四个核心Prompt

Prompt 作用 触发方式
generate.txt 默认通用执行底座 常态永久生效
dream.txt 记忆整合(ETL) 手动触发
distill.txt 工作流打包(重构) 手动触发
explore.txt 文件搜索专家 被其他Agent调用
summary.txt 对话总结(commit message) 自动/手动

关键纠正:explore的真实作用

错误理解

explore: 多方案发散推理,针对需求穷举多种实现思路

正确理解

explore: 文件搜索专家,快速搜索和导航代码库

证据(从explore.txt):

"You are a file search specialist. You excel at thoroughly navigating and exploring codebases."


三、记忆模块

核心文件:service.ts

#mermaid-svg-MMWddoJOzo46PUxF{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-MMWddoJOzo46PUxF .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-MMWddoJOzo46PUxF .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-MMWddoJOzo46PUxF .error-icon{fill:#552222;}#mermaid-svg-MMWddoJOzo46PUxF .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-MMWddoJOzo46PUxF .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-MMWddoJOzo46PUxF .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-MMWddoJOzo46PUxF .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-MMWddoJOzo46PUxF .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-MMWddoJOzo46PUxF .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-MMWddoJOzo46PUxF .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-MMWddoJOzo46PUxF .marker{fill:#333333;stroke:#333333;}#mermaid-svg-MMWddoJOzo46PUxF .marker.cross{stroke:#333333;}#mermaid-svg-MMWddoJOzo46PUxF svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-MMWddoJOzo46PUxF p{margin:0;}#mermaid-svg-MMWddoJOzo46PUxF .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-MMWddoJOzo46PUxF .cluster-label text{fill:#333;}#mermaid-svg-MMWddoJOzo46PUxF .cluster-label span{color:#333;}#mermaid-svg-MMWddoJOzo46PUxF .cluster-label span p{background-color:transparent;}#mermaid-svg-MMWddoJOzo46PUxF .label text,#mermaid-svg-MMWddoJOzo46PUxF span{fill:#333;color:#333;}#mermaid-svg-MMWddoJOzo46PUxF .node rect,#mermaid-svg-MMWddoJOzo46PUxF .node circle,#mermaid-svg-MMWddoJOzo46PUxF .node ellipse,#mermaid-svg-MMWddoJOzo46PUxF .node polygon,#mermaid-svg-MMWddoJOzo46PUxF .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-MMWddoJOzo46PUxF .rough-node .label text,#mermaid-svg-MMWddoJOzo46PUxF .node .label text,#mermaid-svg-MMWddoJOzo46PUxF .image-shape .label,#mermaid-svg-MMWddoJOzo46PUxF .icon-shape .label{text-anchor:middle;}#mermaid-svg-MMWddoJOzo46PUxF .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-MMWddoJOzo46PUxF .rough-node .label,#mermaid-svg-MMWddoJOzo46PUxF .node .label,#mermaid-svg-MMWddoJOzo46PUxF .image-shape .label,#mermaid-svg-MMWddoJOzo46PUxF .icon-shape .label{text-align:center;}#mermaid-svg-MMWddoJOzo46PUxF .node.clickable{cursor:pointer;}#mermaid-svg-MMWddoJOzo46PUxF .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-MMWddoJOzo46PUxF .arrowheadPath{fill:#333333;}#mermaid-svg-MMWddoJOzo46PUxF .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-MMWddoJOzo46PUxF .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-MMWddoJOzo46PUxF .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-MMWddoJOzo46PUxF .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-MMWddoJOzo46PUxF .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-MMWddoJOzo46PUxF .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-MMWddoJOzo46PUxF .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-MMWddoJOzo46PUxF .cluster text{fill:#333;}#mermaid-svg-MMWddoJOzo46PUxF .cluster span{color:#333;}#mermaid-svg-MMWddoJOzo46PUxF div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-MMWddoJOzo46PUxF .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-MMWddoJOzo46PUxF rect.text{fill:none;stroke-width:0;}#mermaid-svg-MMWddoJOzo46PUxF .icon-shape,#mermaid-svg-MMWddoJOzo46PUxF .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-MMWddoJOzo46PUxF .icon-shape p,#mermaid-svg-MMWddoJOzo46PUxF .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-MMWddoJOzo46PUxF .icon-shape .label rect,#mermaid-svg-MMWddoJOzo46PUxF .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-MMWddoJOzo46PUxF .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-MMWddoJOzo46PUxF .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-MMWddoJOzo46PUxF :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 协调机制
记忆模块
存储方式
SQLite
持久化存储
FTS5
全文搜索
Interface
root - 记忆根目录
reconcile - 记忆协调
search - 记忆搜索
同步
去重
冲突解决

记忆存储

复制代码
记忆根目录:<DATA>/memory/
├── MEMORY.md          # 项目记忆
├── sessions/          # 会话记忆
│   └── <session_id>/
│       └── checkpoint.md
└── tasks/             # 任务记忆
    └── <task_id>/
        └── progress.md

记忆检索

typescript 复制代码
// FTS5全文搜索
const search = Effect.fn("Memory.search")(function* (input: {
  query: string
  scope?: string
  scope_id?: string
  type?: string
  limit?: number
}) {
  const rootPath = yield* root()
  const limit = input.limit ?? 20
  
  // 构建FTS查询
  const ftsQuery = buildFtsQuery(input.query, input.scope, input.scope_id, input.type)
  
  // 执行搜索
  const results = yield* database.all(ftsQuery.sql, ftsQuery.params)
  
  return results.map((row: SearchRow) => ({
    path: row.path,
    snippet: row.snippet,
    score: row.score,
    scope: row.scope,
    scope_id: row.scope_id,
    type: row.type,
  }))
})

类比Java

复制代码
Memory ≈ Spring Data JPA
root ≈ @Repository
reconcile ≈ 数据同步
search ≈ findAll + Criteria API

四、今日收获

知识层面

知识点 收获
Agent模式 理解了primary/subagent/all的区别
模型配置 理解了model和modelRef的区别
Prompt分离 理解了为什么要分离Prompt和代码
explore作用 纠正了"多方案发散推理"的错误理解
记忆系统 理解了SQLite + FTS5的存储方式

技能层面

技能 收获
源码阅读 学会了"先看注释,再看代码"
中文注释 理解了添加中文注释的重要性
问题驱动 学会了"带着问题学习"

思维层面

思维 收获
不要贪多 理解了"没必要一天吃成胖子"
数据一致性 理解了思考题和源码要一致
结构化学习 理解了源码要复制并添加中文注释

五、思考题答案

1. MiMo Code的Agent有哪些模式?有什么区别?

答案

  • Primary: 单一顶层主智能体,不启用任何子Agent
  • SubAgent: 主Agent仅做任务拆解、调度、汇总
  • All: 完整双轨协同模式

源码验证:✅ 正确

2. Agent的mode字段有什么作用?

答案

  • mode控制智能体任务执行与分工协作规则
  • 定义任务由主Agent独立完成、强制下发子Agent,还是自适应混合执行

源码验证:✅ 正确

3. Agent如何配置模型?

答案

  • model字段:直接绑定模型(modelID + providerID)
  • modelRef字段:模型引用(复用全局预定义模型)
  • 优先级:model > modelRef

源码验证:✅ 正确

4. MiMo Code有哪些Prompt?各自的作用是什么?

答案

  • Dream: 面向项目持久记忆的知识清洗、压缩、去重、持久化
  • Distill: 流程级知识蒸馏,从历史操作中挖掘高频重复工作流
  • Explore: 多方案发散推理

源码验证:⚠️ 部分正确(Explore理解有误)

5. 为什么要分离Prompt和代码?

答案

  • 高可维护性,不用修改源码即可迭代提示词
  • 极强可配置性,支持多场景、多Agent差异化定制
  • 解耦分层,降低系统耦合度

源码验证:✅ 完美

6. generate.txt的作用是什么?

答案

  • generate.txt = 默认通用执行底座Prompt,常态永久生效
  • dream/distill/explore等 = 临时专项增强Prompt,手动指令触发

源码验证:✅ 正确

7. MiMo Code的模块划分有什么特点?

答案

  • 记忆模块用于项目长期上下文沉淀、检索、持久化
  • 分为业务服务文件、检索索引文件、落地存储文档两大类

源码验证:✅ 基本正确


六、明日计划

明天继续深入分析OpenCode源码!


📝 小小腾老师的评分

维度 得分 评价
源码理解 ⭐⭐⭐⭐ 能读懂核心模块
架构设计 ⭐⭐⭐⭐ 理解模块划分
思考题 ⭐⭐⭐⭐ 77分,良好
学习方法 ⭐⭐⭐⭐⭐ 学会了"先看注释,再看代码"

总分:77分(良好)

老师说:今天表现不错!学会了带中文注释看源码,这是个好习惯!明天继续加油!