🤖 系列:Java工程师转AI Agent 3个月学习计划
👤 作者:宸丶一 | 28岁Java程序员
🎯 今日目标: 深入分析MiMo Code源码,学习多Agent调度、记忆系统、任务追踪
💬 个人格言: 代码改不改变世界我不知道,但先让我准时下班。
前言
Day 21只是浅尝辄止,今天要深入MiMo Code源码!
这次直接把源码复制到项目目录,加上中文注释,这样阅读起来更有逻辑性。这种"先看注释,再看代码"的学习方法,比光看英文源码有效多了。
学习目标
- 深入分析MiMo Code核心模块
- 学习MiMo Code架构设计
- 理解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分(良好)
老师说:今天表现不错!学会了带中文注释看源码,这是个好习惯!明天继续加油!