会进化的 AI 助手 —— 用得越多,越懂你;省 token,自己学。
EvoMoss 是一个用 Rust 写的本地 AI Agent。它把每次对话都当作"经验"沉淀下来,重复出现的工具调用模式会被自动总结成"技能",下次遇到类似任务时直接复用 —— 既省 token,也省脑力。
支持任何 OpenAI 兼容 API(DeepSeek、Kimi、通义、本地 Ollama 等)和 Anthropic 原生格式。
- CLI 聊天:终端里直接说话,流式输出
- Web UI:本地浏览器界面,多会话切换、模型设置面板
- 多模型 / 多 Provider:OpenAI / Anthropic / DeepSeek / Kimi / 通义 / 任何 OpenAI 兼容端点��支持热切换
- 会进化的记忆:
- Materialize:重复 ≥3 次且成功率 >60% 的工具序列自动学成技能
- Merge:相似技能合并
- Split:技能太杂时按工具类别拆分
- Refine:表现下滑的技能用 LLM 重写指令
- Dormant:长期不用的技能自动休眠
- 12 个内置工具:terminal / file_read / file_write / file_edit / glob / grep / web_search / web_fetch / ask_user / invoke_skill / schedule / config
- 定时提醒:自然语言「每天早上 9 点提醒我看新闻」自动转成 cron
- 省 token:技能匹配时只暴露相关工具子集;超长上下文用轻量模型摘要压缩
- 会话持久化:SQLite + jsonl 双写,重启后接着聊
- 沙盒:URL 校验防 SSRF;文件操作限制在 cwd 和
~/.evomoss;shell 工具默认禁用
需要 Rust 1.75+:
git clone https://github.com/<你的用户名>/evomoss-agent.git
cd evomoss-agent
cargo build --release二进制在 ./target/release/evomoss,可以拷到 ~/bin 或加进 PATH。
./target/release/evomoss第一次启动会有 3 步引导:
- 选 AI Provider:OpenAI / Anthropic / DeepSeek / 其他
- 粘贴 API 密钥
- 完成 —— 直接开聊
配置文件在 ~/.evomoss/config.toml,权限自动设为 600。
evomoss🌿 EvoMoss — 会进化的 AI 助手
你:帮我把 Desktop/notes 下的所有 .md 文件改成 .txt
🌿 ...
输入 exit 或 Ctrl+C 退出。
evomoss "今天天气怎么样"非交互模式,输出后退出。可以拼到 shell 脚本里。
evomoss server # 默认端口 7070
evomoss server -p 8080 # 自定义端口浏览器打开 http://localhost:7070。
特性:
- 左侧会话列表,点击切换;
+ 新对话开新 session - 左下
⚙ 模型设置:换 provider、改 API key、调max_tokens,不需要重启 - 后台跑提醒调度器(每分钟检查一次到期任务)
127.0.0.1,仅本机可访问。要给局域网用:EVOMOSS_BIND=0.0.0.0 evomoss server。
evomoss # 交互式 REPL
evomoss "<message>" # 一次性问答
evomoss server [-p N] # 启动 Web UI
evomoss skills # 查看已学会的技能
evomoss reminders # 查看定时提醒
evomoss config # 看当前配置
evomoss config <key> # 看某项
evomoss config <key> <v> # 改某项可改的 <key>:model、base_url、api_key、light_model、port、max_tokens、evolution(on/off)。
| 命令 | 作用 |
|---|---|
/help |
查看命令列表 |
/skills |
查看已学会的技能 |
/cost |
查看本次对话的 token 和费用 |
/sessions |
列出所有对话 |
/new [名称] |
新建对话 |
/pin |
置顶当前对话 |
/rename <新名> |
重命名当前对话 |
短句(≤20 字)含以下关键词时直接返回,不调 LLM:
你都会什么/你会什么/你的技能→ 列出所有技能花了多少/总共花了/用了多少 token→ 显示费用统计
~/.evomoss/config.toml:
[model]
api_key = "sk-..."
base_url = "https://api.deepseek.com"
model = "deepseek-chat"
anthropic_format = false # 用 Anthropic 原生格式时设 true
max_tokens = 8192
light_model = "deepseek-chat" # 可选:用于摘要/路由的轻量模型
[memory]
evolution_enabled = true
materialize_threshold = 3 # 重复 N 次工具序列后总结成技能
refine_consecutive_failures = 5
dormant_days = 60 # 多少天不用就休眠
[server]
port = 7070
[display]
show_tokens = true
show_cost = true
lang = "zh"| 变量 | 作用 |
|---|---|
EVOMOSS_BIND |
Web UI 绑定地址,默认 127.0.0.1 |
EVOMOSS_CORS_ORIGIN |
允许的 CORS Origin,默认 http://localhost:<port> |
EVOMOSS_ALLOW_TERMINAL |
设为 1 才允许 terminal 工具执行 shell 命令 |
~/.evomoss/
├── config.toml # 主配置(权限 600)
├── data/
│ └── evomoss.db # SQLite:sessions / skills / traces / patterns
├── sessions/
│ └── <session-id>/
│ ├── meta.toml # 会话元信息(用户可读)
│ └── messages.jsonl
├── skills/ # 你也可以手写 SKILL.md 放这里
│ └── <skill-name>/
│ └── SKILL.md
└── crons/ # 定时提醒
└── <reminder-id>/
├── cron.toml
└── prompt.md
sessions/ 和 skills/ 都是给人读的格式,文件夹里直接编辑也认。
EvoMoss 不靠 embedding,也不调外部记忆库。它干两件事:
- 每次对话记 trace:记下用户输入、调了哪些工具(按顺序)、成功失败、用了多少 token
- 每 5 个 turn 跑一次 evolve:扫描 traces,把高频高成功率的工具序列总结成
Skill,下次遇到类似输入直接调用
下次你说类似的话,retrieve() 用关键词模糊匹配触发模式(trigger_patterns)+ 描述相似度,挑出 confidence > 0.4 的技能。命中就:
- 把技能的 instructions 注入 system prompt
- 工具列表只给技能声明的相关工具子集(省 token)
技能也会自我修正:成功率持续低于 30% 自动休眠,30%-60% 之间用 LLM 重写 instructions。
- 单进程单 Agent 实例:Web 模式下一把 Mutex 锁全局,多用户并发会排队。本地用足够。
- Terminal 工具默认禁用:
EVOMOSS_ALLOW_TERMINAL=1才开。开了之后只过滤了几个最危险的命令,仍要小心。 - 路径沙盒:file_* 工具只能写 cwd 和
~/.evomoss子树。从/启动时整个文件系统就在 cwd 下,等于失效 —— 不要从/启动。 - 会话不会自动 GC:
/new多了 sidebar 会越来越长。
cargo check # 快速校验
cargo build # debug 构建
cargo build --release
cargo run -- server源码地图:
src/
├── main.rs # CLI 入口、子命令分发、REPL
├── config.rs # 配置读写、首次引导
├── types.rs # 所有共用类型
├── llm.rs # OpenAI + Anthropic 客户端,流式
├── agent.rs # Agent 主循环 + 自然语言命令
├── memory.rs # 路由、检索、技能 CRUD
├── memory/evolution.rs # 5 个进化算子
├── tools.rs # 12 个工具 + 沙盒校验
├── store.rs # 会话存储(SQLite + jsonl)
├── remind.rs # 自然语言定时 → cron
└── server.rs # Web 服务 + 提醒调度器
MIT