自进化 AI Agent · 动态工具管理 · 可扩展运行时
Tea Agent 是一个 自进化的 AI Agent 框架。核心能力:
- 动态工具管理:Agent 可通过
toolkit_save运行时创建新工具,调用toolkit_reload立即生效 - 多会话模式:轻量级 (LiteSession)、完整 (OnlineToolSession)、子 Agent (Sub-agent)
- 多层自进化:工具使用分析 → 技能固化 → 系统提示词进化 → 后台线程自动优化;改动是否保留由进化闸门(EvolutionBench)裁决
- 按需上下文:上下文片段 (
context_fragments) + 分层 AGENTS.md 指令 + skill 按需加载;动态内容一律注入消息尾部,保护 LLM 前缀缓存 - 可收缩工具面:使用统计(
tool_usage)驱动的tool_shield自动屏蔽长期闲置工具 - 多样交互界面:Web/API 服务器、ACP/Telegram/微信 适配器
# ── 安装 ──
pip install -e . # 可编辑安装
# ── 构建 ──
python -m build # 构建分发包
python build_mini.py # 构建 Mini 版(输出 tea_agent_mini / build_mini_dist)
python build_nuitka.py # 编译单文件可执行(无需 Python 环境)
# ── 运行 ──
tea_agent # 启动 Web/API 服务器(默认入口,等价 tea-agent-api)
tea_agent_api # 启动 API 服务器(下划线别名,等价 tea-agent-api)
tea-agent-api # 启动 API 服务器
tea-agent-mini # 启动 Mini 版
tea-agent-acp # 启动 ACP 协议
tea-agent-telegram # Telegram 适配器
tea-agent-wechat # 微信适配器
# ── 测试 ──
pytest # 运行全部测试(125 个测试文件,截至 2026-09-28)
pytest tea_agent/tests/test_xxx.py # 运行单文件测试
pytest -k "test_name" -xvs # 按名匹配+详细输出
pytest --collect-only -q # 只收集用例(确认总数与新增文件已被发现)
# ── 静态检查 ──
ruff check . # Lint 检查
ruff format . --check # 格式检查
ruff format . # 自动格式化
black . # 备选格式化
# ── 类型检查 ──
python -m mypy tea_agent --ignore-missing-imports
# ── 口径核查(文档同步用,勿凭记忆填数)──
python -c "from tea_agent.tlk import Toolkit, llm_tool_names; t=Toolkit(); print(len(t.func_map), len(llm_tool_names(t.func_map)))"
python -c "import pathlib; print(len(list(pathlib.Path('tea_agent/toolkit').glob('toolkit_*.py'))))"
python scripts/gen_tools_doc.py --check # 校验 docs/TOOLS.md 与工具注册态一致(不一致退出码 1)tea_agent/ # 40 个顶层模块 + 14 个子包(截至 2026-09-23 实测)
├── agent.py # 统一 Agent 类(三种模式入口)+ 后台线程投递
├── agent_pipeline.py / session_pipeline.py # 后处理流水线(摘要/记忆提取/任务评估)
├── agent_background.py # 后台线程:定时任务调度 + 打断模式分析(M3/M4)
├── agent_evolution.py # 自进化闭环(触发 → 分析 → 执行)
├── onlinesession.py # OnlineToolSession — 完整在线会话
├── litesession.py # LiteSession — 轻量会话(子 Agent 用)
├── basesession.py # 会话基类 + 容错 JSON 解析
├── config.py # 配置加载与管理
├── context_fragments.py # ★ 上下文片段系统(Codex 风格:时间/预算/模式按需组装)
├── agents_md_loader.py # ★ AGENTS.md 分层指令加载(用户级+项目级+字节预算)
├── skill_loader.py # ★ Skill 按需加载评估器(必要性/充分性双维,取代知识结晶)
├── tool_shield.py # ★ 长期未使用工具自动屏蔽(读 tool_usage 统计)
├── tool_profiles.py # 工具窗口档位(按上下文窗口裁剪暴露面)
├── tool_approval.py # ★ 风险分级 + 审批闸门 + 审计接线(A2/A3 安全底座)
├── tool_hooks.py # pre/post 工具 hook(approval/audit 以此挂载)
├── evolution_gate.py # ★ 进化闸门(EvolutionBench keep-or-rollback)
├── storage_scope.py # 存储作用域:项目级 .tea_agent_run/chat_history.db → 临时目录回退
├── session_fork.py # ★ 会话分叉共享实现(Web `#分叉` 与 toolkit_fork_session 同一事实源)
├── path_filters.py # ★ 项目树遍历排除集(唯一事实源:PRUNE_DIRS/prune_dirs/iter_files)
├── audit_log.py # 审计日志(hash 链防篡改)
├── memory.py / project_memory.py / cross_topic_summarizer.py # 记忆与跨主题汇总
├── prompt_manager.py # 系统提示词管理
├── reflection.py # 元认知反思
├── providers.py / provider_store.py / model_config.py / model_manager.py # LLM 提供方与模型属性
├── api_headers.py / api_retry.py # 供应商 header 注入 / 重试
├── permission.py # 工具权限管理(已禁用,恒放行;真实闸门见 tool_approval)
├── tlk.py # ★ 工具加载/注册/执行引擎(call_tool 为唯一汇聚点)
│
├── toolkit/ # ★ 工具注册中心:toolkit_*.py 共 57 个 → 注册 60 个工具(58 个对模型可见)
│ ├── __init__.py # 空文件(无手工注册;工具由 tlk.py 扫描加载)
│ ├── toolkit_exec.py / toolkit_file.py / toolkit_edit.py / toolkit_diff.py
│ ├── _git_snapshot.py # 下划线前缀 → 不注册为工具(快照基础设施)
│ └── ... (57 个 toolkit_*.py)
│
├── session/ # 会话组装(历史压缩 / L1·L2·L3 / JSON 校验 / os 信息注入 / 解码速率)
├── store/ # 存储层(13 个功能子模块 + migration)
├── server/ # REST API + Web V2(Starlette + SSE,含 turn_snapshot)
├── multi_agent/ # 多 Agent 协作
├── workflow/ # 工作流引擎(DAG)
├── protocol/ # ACP 协议实现
├── channel/ # Telegram / 微信适配器
├── lsp/ # 代码智能(Jedi + Ruff)
├── skills/ # 技能系统
├── evaluation/ # 评测(EvolutionBench 等)
├── sdk/ # 对外 SDK
├── demo/ # 演示应用(辩论赛 / 钢琴 / DAG)
│
└── tests/ # 125 个测试文件(大模块必须有对应 test_ 文件)
注:
tea_agent_mini/是仓库根下的独立顶层子包(见「Mini 构建」),不在tea_agent/目录内。
┌─────────────────────────────────────────┐
│ Agent (统一入口) │
│ ├─ mode='full' → OnlineToolSession │ ← 完整能力:存储、后台、摘要
│ ├─ mode='lite' → LiteSession │ ← 轻量:单轮、廉价模型、无状态
│ └─ mode='lightweight' → OnlineToolSession │ ← 极简:仅关闭存储/后台,无独立会话类
├─────────────────────────────────────────┤
│ Sub-agent 系统 │
│ ├─ spawn/spawn_sync → 独立 LiteSession │ ← 隔离上下文、独立迭代
│ ├─ subagent_msg → 消息传递 │ ← Agent 间通信
│ └─ collect/cancel → 结果收集 │
└─────────────────────────────────────────┘
- 不得循环导入:
agent.py不反向导入任何子模块;子模块只导入agent.py或同级模块 - 工具注册:新工具必须放在
tea_agent/toolkit/目录,以toolkit_前缀命名,通过toolkit_save注册(实际由tlk.py按toolkit_*.py扫描+exec 加载;__init__.py为空文件,无需手工导入) - 下划线前缀不注册:
toolkit/_xxx.py形式的模块不会被扫描注册(如_git_snapshot.py),适合放共享基础设施 - 自进化边界:后台自进化线程可优化工具代码、整理技能、调整提示词,但不得修改用户对话历史
- 工具列表顺序稳定:工具列表顺序是 DeepSeek 前缀缓存的一部分 —— 任何收缩/筛选(
tool_shield/tool_profiles)必须产出确定性排序,集合抖动会让每轮缓存 100% 失效 - 存储作用域:默认 db 为启动目录
$pwd/.tea_agent_run/chat_history.db(TEA_STORAGE_SCOPE=auto/project); 启动目录不可写(无权限 / 无磁盘空间)→ 回退系统临时目录并在每轮会话结束提示用户手动备份; 启动目录 == 用户主目录 →~/.tea_agent/chat_history.db;显式user→ 用户级(durable)。 db 名固定chat_history.db,不做改名迁移(旧库本就叫这名,原地沿用)。 新增持久化数据时须走storage_scope.resolve_db_path,不要硬编码路径 (临时回退是唯一会丢数据的情形,故storage_notice()必须保持接线,且提示只能经callback送达 UI —— 并入full_reply会被持久化进对话历史,见_finalize_turn_reply)
toolkit_<动作描述>.py # 文件命名
内部函数: toolkit_<动作>() # 注册工具名
示例:toolkit_exec.py → toolkit_exec(), toolkit_save.py → toolkit_save()
# 方式一:直接导入注册(推荐)
from tea_agent.toolkit.toolkit_xxx import toolkit_xxx
# 方式二:运行时动态创建
toolkit_save(name="toolkit_new_tool", meta={...}, pycode="...")
toolkit_reload()文档/统计口径中写「工具数」时必须区分三个数:模块数(
toolkit_*.py文件数)、 注册数(Toolkit().func_map长度)、可见数(llm_tool_names()长度,扣除LLM_TOOL_EXCLUDES里的内部工具)。三者不同,混用即错。
Toolkit.call_tool 是唯一执行汇聚点,两条硬规则:
- 入参绑定预检:意外关键字导致的
TypeError降级为可自纠的结构化错误,而不是抛崩 toolkit_exec归一化层:接受command/cmd/executable/整行命令/arguments包装等 多种写法;新增归一化分支时必须补测试,历史上有 3 处真实回归由位置漂移引入
工具调用统计落在项目 db($pwd/.tea_agent_run/ 的会话库)tool_usage 表,
记录点在 Toolkit.call_tool(唯一汇聚点,覆盖缓存/非缓存两条路径),且位于缓存判定之前 ——
命中缓存同样是真实调用,记在缓存之后就少算,长期会把常用工具误判成「没用过」而屏蔽。
tool_shield 据此在构建工具列表时屏蔽长期未使用者,与 tool_profiles 的窗口
档位是两层独立收缩。
三条不可妥协的不变式(屏蔽会让 Agent 失去能力):
- 无数据 = 不屏蔽 —— 空表只代表"尚未观测",否则新装机首次启动即屏蔽全部工具
- 观测期未满不屏蔽零使用工具 —— 判"长期不用"必须先有"长期"
- 自愈通路永不屏蔽 ——
toolkit_config/save/reload/exec/file/edit/diff/ approve/tool_usage/rollback/list_versions屏蔽后 Agent 将无法解除屏蔽
应急:TEA_TOOL_SHIELD=0 关闭自动屏蔽;TEA_TOOL_SHIELD_IDLE_DAYS=N 调阈值;
单个工具用 toolkit_tool_usage(action='pin'|'unpin'|'auto', tool=...) 覆盖。
判定函数 evaluate() 必须是纯函数(时间分支可在秒级单测覆盖,不靠等 30 天)。
- 纯 Python:不依赖外部非标准可执行文件
- 明确输入输出:参数使用 JSON Schema 定义,返回结构化结果
- 通用可复用:不写死路径/Key,通过参数注入
- 失败隔离:
batch_process等并行工具需单个失败不影响整体 - 幂等性优先:重复调用不产生副作用
- 读路径无写副作用:只读查询(如工具屏蔽判定)用
peek_storage(),不要用会在裸进程里隐式建库的get_storage() - 辅助能力不绑架主流程:统计/审计/快照一类旁路写入失败一律静默降级(fail-open),绝不把主调用带崩
- 旁路代码不得改写控制流:若观测调用点落在「异常=重试/降级」的
try内,则连属性查找 都不能在该try里发生(self._new_hook()对鸭子类型替身即抛AttributeError→ 被误判为 业务异常触发重试)。取时/取名一律放try外,或包成不可能抛错的局部闭包
当用户明确要求创建文档(接口文档、README、Markdown、设计文档等)时:
- 用
toolkit_file(action='write')保存文档到项目内合适路径(如docs/) - 调用
toolkit_publish_doc(source_path=..., title=...)发布 - final msg 必须包含 Markdown 下载链接(toolkit_publish_doc 返回的 url):
📄 文档已生成: [下载接口文档](/v1/download/接口文档.md)
规则:链接必须是可点击的 Markdown 格式;若无 server 则给出本地路径。
图片生成物(.png/.jpg/.gif/.webp/.svg 等)额外支持预览:
toolkit_publish_doc对图片返回preview_url(/v1/preview/{filename})- 下载端点
/v1/download恒为attachment+octet-stream,不能当<img src>(只会触发下载);预览端点用inline+ 正确image/*MIME,可直接内联 - final msg 可用 Markdown 图片语法内联:
 - 前端
formatMarkdown也会自动为图片下载链接补缩略图(点击放大),故裸写下载链接亦可
- Python 3.10+(
requires-python >= 3.10):使用dict | None联合类型、match/case、dataclass - 命名:
snake_case函数/变量,PascalCase类,UPPER_CASE常量 - 类型注解:所有函数签名必须含类型注解
- 文档字符串:公共函数/类须有 docstring(Google 风格),内部函数可选
- 行宽:120 字符(ruff 配置)
- 导入顺序:标准库 → 第三方 → 本地,每组空行分隔
- 避免:全局可变状态、循环导入、
except: pass
- 测试文件:
tea_agent/tests/test_*.py(125 个,截至 2026-09-28) - 使用
pytest,fixture 集中在conftest.py - 测试函数名:
test_<功能>_<场景> - 重要模块须有
test_文件覆盖;修复缺陷必须带回归测试,且回归测试要能真的失败(必要时做元验证:把实现还原成旧版,确认测试确实变红) - 覆盖「静默失效」类缺陷时,断言要钉住行为契约而非当前实现细节 —— 历史上曾有测试把「事件被永久丢弃」固化成契约,导致缺陷长期未被发现
- 时间/随机/环境相关逻辑抽成纯函数或可注入参数,保证判定确定性
- 不要在新代码里写死用例总数(会随提交过期);需要数字时用
pytest --collect-only -q实测,并标注「截至」时点
| 层级 | 保护 | 描述 |
|---|---|---|
| L0 | git 快照 | 仅在工作区干净时自动创建;落点 refs/tea/snapshots(side ref),不污染分支历史 |
| L1 | 时间戳 .bak | 每次修改备份,不覆盖历史 |
| L1.5 | 语法严格检查 | ast.parse 严格语法校验 |
| L2 | 编译验证 | 修改后 compile() 检查语法 |
| L2.5 | LSP 检查 | 影响分析 + lint + 签名对比 |
| L3 | 测试回滚 | 测试失败按快照恢复目标文件(不再 git reset --hard 波及整个工作区) |
快照相关环境变量:
TEA_GIT_SNAPSHOT_MODE=side|branch|off(默认 side)、TEA_SNAPSHOT_REF(默认refs/tea/snapshots)。查看/恢复:git log refs/tea/snapshots --oneline/git checkout refs/tea/snapshots -- <file>。 所有文件修改工具(edit/diff/file 等)成功后都会自动留快照,工作区与暂存区不受影响。
「编译过 + 测试过」回答不了「这版是否真的更好」。evolution_gate.py 在自进化
成功后跑确定性基准(纯代码 check,无 LLM)并写入进化曲线,与上一数据点比较给出
keep / rollback:
| 模式 | 行为 |
|---|---|
off |
完全关闭(零开销) |
advisory |
跑基准 + 记录曲线 + 附加建议(默认,不改变任何文件) |
enforce |
决策为 rollback 时,自动从 .bak.<ts> 恢复该文件 |
开关:TEA_EVOLVE_GATE / TEA_EVOLVE_GATE_THRESHOLD(默认 0.0,即必须严格提升才算 keep)
或 config.yaml 的 evolution.gate / evolution.gate_threshold;
Agent 侧可调用 toolkit_evo_bench(action='run'|'history'|'compare')。
| ✅ 可修改 | ❌ 不可修改 |
|---|---|
toolkit/*.py — 工具代码 |
.chat_history_protected — 对话历史 |
config.yaml — 配置 |
chat_history.db — 数据库(启动目录 .tea_agent_run/) |
prompt_manager.py — 提示词 |
用户 ~/.tea_agent/ 个人配置 |
自进化生成的 skills/ |
版本发布后的 CHANGELOG 只追加不修改 |
所有 git commit 通过 toolkit_exec 执行,并用 -c 注入固定 author(不受全局/本地 git 配置影响):
git add <files>
git -c user.name=tea_agent -c user.email=sunkwei@gmail.com commit -m "类型: 简短描述"--amend/--no-verify/--allow-empty按需追加- 只 add 相关文件,避免把无关改动带进提交
- 提交前先
git status --short确认暂存范围;提交后用git show --stat复核
<类型>: <简短描述>
<可选:详细说明>
类型:feat / fix / refactor / docs / test / chore / release
正文建议写「为什么」而非「改了什么」:根因、取舍、被否决的替代方案、已知限制。
master 与开发分支同步时优先 fast-forward,保持线性历史(避免无意义 merge commit):
git add <files> && git commit -m "..." # 在开发分支(如 sunkw_dev)提交
git checkout master && git merge --ff-only <dev-branch> # 仅在可 FF 时合并
git checkout <dev-branch> # 回到原工作分支- 非 FF(出现分叉)先停下确认,不要盲目
--no-ff或制造Merge branch提交 - 推送是远端副作用:
git push只在用户明确要求时执行;本地合并完成后必须提示 「本地已合并、远端未推送」及对应命令 - 当前远端配置以
git remote -v实测为准(AGENTS.md 里的「双远程」是历史描述, 仓库实际可能只有origin)
# 使用发布工具
toolkit_release_version(
version="x.y.z",
changes=["说明列表"],
build=True,
git_commit=True
)
# 或手动
# 1. 更新 pyproject.toml version
# 2. 更新 CHANGELOG.md
# 3. 固定 author 提交: git -c user.name=tea_agent -c user.email=sunkwei@gmail.com commit -m "release: vx.y.z"
# 4. git pushmaster— 主分支,保持稳定sunkw_dev— 当前开发分支(日常提交落此)feature/*— 功能开发分支(可选)- 推送至 GitHub(
origin)+ NAS 双远程(若配置)
tea_agent_mini/ 是独立子包,精简依赖构建。规则:
- 只包含核心会话能力(无 LSP、无重型工具)
- 通过
build_mini.py脚本构建;依赖仅 7 个核心包 - 剔除范围由脚本内
EXCLUDED_PKGS/EXCLUDED_TOP/HEAVY_TOOLS三个白/黑名单决定 (HEAVY_TOOLS当前 11 项:JS 渲染、截图、输入模拟、浏览器标签、剪贴板、LSP、explr、pkg等),增删工具后须同步该名单 - 入口:
tea-agent-mini命令行脚本
| 变量 | 作用 | 取值 / 默认 |
|---|---|---|
TEA_CONFIG |
指定 config.yaml 路径 | 默认 ~/.tea_agent/config.yaml |
TEA_MODEL_CONFIG |
模型配置覆盖文件 | 绝对/相对路径 |
TEA_PROVIDER_FILE |
provider.yaml 路径(模型属性唯一来源) | 默认 ~/.tea_agent/provider.yaml |
TEA_AGENT_HOME |
用户级数据根目录 | 默认 ~/.tea_agent |
TEA_STORAGE_SCOPE |
存储作用域 | auto(默认)/project/user;auto 不可写时回退系统临时目录并提示备份 |
TEA_SERVER_STATE_DB |
server 状态库(回合快照/队列)路径 | 默认项目 run 目录 |
TEA_TOOL_SHIELD |
关闭长期闲置工具自动屏蔽 | 0/false/no 关闭 |
TEA_TOOL_SHIELD_IDLE_DAYS |
闲置屏蔽阈值 | 默认 30,须为正数 |
TEA_APPROVAL_MODE |
审批闸门 | off(默认)/advisory/enforce |
TEA_APPROVAL_TOKEN |
enforce 模式一次性授权令牌 | 非空即授权 |
TEA_EVOLVE_GATE |
进化闸门模式 | off/advisory(默认)/enforce |
TEA_EVOLVE_GATE_THRESHOLD |
保留阈值 | 默认 0.0 |
TEA_GIT_SNAPSHOT_MODE |
快照落点模式 | side(默认)/branch/off |
TEA_SNAPSHOT_REF |
自定义快照 ref | 默认 refs/tea/snapshots |
TEA_FILE_ALLOW_OUTSIDE |
放宽文件工具「禁止越出项目目录」限制 | 1/true/yes 放宽 |
TEA_AUDIT_DISABLED |
关闭审计写入 | 1/true/yes 关闭 |
TEA_AUDIT_DIR |
审计日志目录 | 默认项目 run 目录 |
TEA_HEADLESS |
无人值守(toolkit_question 不阻塞) |
1/true/yes |
TEA_AGENT_INTERFACE |
声明运行界面(影响注入的环境描述) | web(默认)/mcp |
TEA_BENCH_HISTORY |
EvolutionBench 曲线文件覆盖 | 路径 |
TEA_AGENT_EVOLUTION_LOG |
自进化日志路径 | 默认项目 run 目录 |
TEA_API_KEY |
ACP/Server 侧 API 鉴权 Key | 非空启用 |
规则:非法值一律出声告警(logger.warning),不静默回退;解析失败必须给出可读诊断。
捕获 ValueError 时别忘了 OverflowError(TEA_TOOL_SHIELD_IDLE_DAYS=1e999 会让
int(float(...)) 直接抛,且发生在每次构建工具列表的热路径上)。
- 工具沙箱:
permission.py已禁用(恒放行),真实执行闸门是tool_approval.py(风险分级 + 审批 + 审计),通过tool_hooks以 pre/post hook 挂载,覆盖 lite 与 online 两条路径 - 审批闸门:
TEA_APPROVAL_MODE=enforce时高风险工具缺失审批即拒绝;授权来源为 环境变量 /.tea_agent_run/approval_token/approval_allow.json/toolkit_approve(action='grant');toolkit_approve与toolkit_audit_log自身豁免(否则无法完成授权) - 提权操作:Agent 不允许获取管理员/root 权限——
sudo/su/pkexec/runas等一律硬拒绝 (toolkit_exec与toolkit_scheduler两条执行路径都拦截,且识别 shell 包装与-Verb RunAs); 需要提权的操作必须提示用户手动执行 - SQL 注入:所有数据库操作使用参数化查询,禁止 f-string 拼接未校验的插值;
标识符/片段必须走
store/_sql_safety.py的校验助手(字面量、全大写常量、或校验助手调用);test_no_unsafe_sql_interpolation_in_store是硬门禁 —— 动态拼NOT IN (?,?)这类 占位符也会被拦,改为 Python 侧算差集后逐条参数化 - 路径遍历:文件操作工具校验路径,禁止
../逃逸(应急放宽见TEA_FILE_ALLOW_OUTSIDE) - 审计不可静默失效:审计为 hash 链,历史损坏须显式标记(不删数据、不静默放行); 并发写入下链断裂是必须修的真缺陷
- Sub-agent 隔离:每个子 Agent 拥有独立 LiteSession,上下文隔离
口径类事实(版本号、工具数、测试数、模块数、目录清单)每次改动后必须实测同步,
不得凭记忆或沿用旧值。同步范围:README.md + README.en.md(逐条对等)+ AGENTS.md + CHANGELOG.md。
- 数字口径命令见「快速命令」末尾;工具数务必区分模块数/注册数/可见数
- 已删除的能力必须从所有文档中清除(例:
toolkit_ocr删除后,README/AGENTS/docs/TOOLS.md均不得再引用) docs/TOOLS.md是工具清单快照(标题含「注册工具总数 / LLM 可见」)。工具增删后必须重跑python scripts/gen_tools_doc.py重新生成(口径与「快速命令 · 口径核查」同源),不要手编;--check模式仅校验一致性(CI 可用),别直接引用快照里的数字而不核对生成时间README.en.md与README.md结构必须保持一致(章节、表格、代码块数量);改完做一次平衡校验 (<details>与</details>数量、代码围栏成对)- 变更需在
CHANGELOG.md的[Unreleased]下按Features/Bug Fixes/Documentation等小节追加,只追加不修改已发布章节
Q: 如何添加新工具?
A: 在 tea_agent/toolkit/ 创建 toolkit_xxx.py,实现 toolkit_xxx() 与 meta_toolkit_xxx() 后即可(tlk.py 自动按 toolkit_*.py 扫描+exec 加载,__init__.py 为空无需手工导入);或用 toolkit_save 运行时注册,调用 toolkit_reload() 生效。新增后记得同步文档口径、build_mini.py 重型名单(若适用)、docs/TOOLS.md。
Q: 自进化线程做了什么? A: 每小时自动:工具使用率分析 & 优化建议 → skill 模式整理 → 跨主题记忆提取;另有打断模式后台分析(M3/M4,同一工具打断 ≥2 次沉淀记忆 / ≥3 次生成行为指导 skill,事件保留 30 天)。改动经进化闸门评分决定 keep 或 rollback。
Q: 三种 Agent 模式怎么选?
A: lightweight 用于孤立任务;full 用于完整交互会话;lite 用于子 Agent 内部调用。
Q: 用户要求「同步 README」时怎么做?
A: 先 git log --oneline -25 找近期改动 → 逐条实测口径(工具数/测试数/版本/目录)→ 中英文 README 逐条成对替换(不要整篇重写,保留原结构与语气)→ CHANGELOG 追加 Documentation 条目 → 残留扫描(旧版本号、已删工具名、旧数字)→ 报告 diff 统计。
Q: 工具调用统计表会无限增长吗?
A: 不会。tool_usage 一行一工具(tool 为主键),体量与工具数同阶;first_used 用 COALESCE 保护不被改写(它是观测期基准)。遭遇 database is locked 要退避重试而非只记日志 —— 少记一条的后果是误屏蔽真在用的工具。