charlesericwilson-portfolio/Echo_Adapt_v5
GitHub: charlesericwilson-portfolio/Echo_Adapt_v5
一个使用 Rust 编写的轻量级本地大模型 Agent 框架,通过混合工具调用机制、原生 tool 角色支持和持久化会话管理,让未经特殊微调的 LLM 能够高效安全地执行实际命令和工具操作。
Stars: 8 | Forks: 4
```
flowchart TD
A[User sends prompt] --> B[LLM / Echo]
B --> C[LLM generates reply]
C --> D[Tool Extractor checks for session or command]
D -->|Session command found| E[Session Manager]
E --> F[Auto-create or reuse tmux session]
F --> G[Send command to tmux session]
G --> H[Session Manager starts polling tmux pane]
H --> I[Wait for new output + markers]
I --> J[Capture only new output between markers]
J --> K[Update Database with clean output]
K --> L[Send tool result back to LLM as 'tool' message]
D -->|No session command| M[Execute as normal command]
M --> O[Save command result to Database]
O --> N[Send tool result back to LLM as 'tool' message]
L --> B
N --> B
style A fill:#4ade80,stroke:#166534
style B fill:#60a5fa,stroke:#1e40af
style E fill:#facc15,stroke:#854d0e
style K fill:#c084fc,stroke:#6b21a8
style O fill:#c084fc,stroke:#6b21a8
```
## **如果您想将其与 Grok API 结合使用,请查看 Grok Adapt 分支,未来将致力于把所有功能整合在一起。**
# Adapt 工具代理系统
这是 Echo agent 项目的活跃开发版本——一个使用 Rust 编写的轻量级本地 LLM agent 工具系统。我使用了一个经过 [QLoRA](https://github.com/charlesericwilson-portfolio/Echo_training_project) 训练的 [Qwen 2.5 Coder 14B Instruct](https://huggingface.co/Qwen/Qwen2.5-Coder-14B-Instruct) 作为合并后的基座模型。
它是早期 [Echo Adapt_v3](https://github.com/charlesericwilson-portfolio/Echo_Adapt_v3) 的延续,并增加了对代理风格工具调用、可选择开启/关闭的输出摘要以及数据库日志记录的支持。
核心理念:如果您的基础模型已经能告诉您该输入什么命令,并且不使用 jinja 模板,那么它就可以通过这个框架使用工具。不需要进行特殊的微调。
原始文本方法开箱即用,可以直接运行。
JSON 工具支持也已可用,我们拥有使用 duck duck go 的可靠网络搜索功能,以及一个可以读取搜索结果中找到的网页的浏览页面功能。模型使用它们的方式已包含在仓库提供的示例 system prompt 中。
项目内置了一个基础的 system prompt 来教导模型工具的格式,但您可以用自己的 prompt 替换它。
当前版本:Rust v5(之前的 Python 代理版本为 v4)
该项目的目标是保持框架的灵活性,从而使模型的能力成为主要的限制因素——而不是代码中人为的限制。
### 快速开始
## 支持的后端
Echo 可以与**任何支持 OpenAI Chat Completions 格式的服务器或 API** 协同工作。您**不会**被绑定在 llama.cpp 上。
### 本地服务器(推荐)
| Backend | Notes | Recommendation |
|--------------------|------------------------------------|---------------------|
| **llama.cpp** | 使用 `--api` 标志 | 综合最佳 |
| **vLLM** | 高性能 | 速度极佳 |
| **Ollama** | 内置 OpenAI 兼容性 | 最易上手 |
| **LM Studio** | 内置 OpenAI 服务器 | 对初学者非常友好 |
| **TabbyAPI** | 搭配 exllama/exllamav2 效果出色 | 强有力的选择 |
| **Aphrodite** | 性能良好 | 可靠的替代方案 |
| **SGLang** | 现代推理引擎 | 性能良好 |
### Cloud APIs
- **OpenAI**
- **Groq**
- **Together.ai**
- **Fireworks.ai**
- **DeepInfra**
- **OpenRouter**
- **Mistral** (OpenAI compatible mode)
- Most other OpenAI-compatible providers
1. 确保您的 [llama.cpp](https://github.com/ggml-org/llama.cpp) 服务器正在运行
```
- git clone https://github.com/ggml-org/llama.cpp
- cd llama.cpp
- cmake -B build
- cmake --build build --config Release -j$(nproc)
```
```
- Main model: port 8080
- Summarizer (small model): port 8082
```
2. 安装依赖项
```
- sudo apt install tmux
- sudo apt install cargo
- sudo apt install rustup
```
3. 克隆仓库
```
git clone https://github.com/charlesericwilson-portfolio/Echo_Adapt_v5/tree/main
cd Echo_Adapt_v5/echo_rust_agent_proxy
```
4. 编辑配置文件以设置您的端点和 system prompt,初始的 system prompt 位于 echo_rust_agent_proxy/main_system.txt 和 echo_rust_agent_proxy/summarizer.txt
5. **构建或运行 Rust 版本**
```
cd [build directory]
cargo build --release
./target/release/echo_rust_wrapper
```
或者先进行测试
```
cd [build directory]
cargo run
```
6. 尽情享受,请提供反馈。
7. 如果您想要更受限制的环境,我提供了一个 bash 脚本来设置一个受限用户,该用户仅具有对工作区目录的写入权限。您可以根据需要自行调整权限,只需使用以下命令使其可执行:
```
chmod +x setup-restricted-model-user.sh
sudo ./setup-restricted-model-user.sh
```
然后在终端中运行
```
su - model-user
```
接着运行 cargo run 或执行该可执行文件即可
## 当前状态(2026年6月)
- **稳定**:` ` 原始文本工具执行
- **功能完备**:通过 tmux 实现持久的 ` ` 工具执行,具备智能输出捕获和工具输出清理功能
- **稳定** 的多行命令和文件写入支持,使用 xml 标签 command here 。目前您可以在编译前修改代码中的标志名称,但最终它会移入 config.toml
- **JSON function calling** 功能已可用,我包含了一个网络搜索工具和一个浏览页面工具来读取结果,您还可以根据自己的需求定义自己的工具。
- **跨线程语义搜索记忆**:记忆功能包含用于保存记忆和 embedding 的 append_memory,以及用于进行语义搜索、仅将相关数据提取到上下文中的 read_memory。
- 进行了重构,使用 config.toml 来设置端点,并在文本文件中为您的主模型和摘要模型设置 system prompt,无需重新编译。
- 上下文自动摘要
- 用于所有工具调用和摘要的 SQLite 数据库日志记录
- 通过配置驱动的工具摘要开启/关闭选择功能。
- 针对危险命令以及混淆处理和 token 级别的安全拒绝列表。您可以在 config.toml 中添加任何您想要阻止的内容。
- 用于生成训练数据的 ShareGPT 风格 JSONL 日志记录
agent 可以在原始文本命令、持久 tmux 会话和结构化 JSON 工具调用之间流畅切换,具体取决于模型决定使用哪种方式;或者您可以直接指示模型使用您所选择的一种或多种方式。
## 记忆系统
Echo 现在拥有存储在 memory.md 中的持久化跨线程记忆。
功能:
语义检索 —— 使用 embedding 和余弦相似度提取相关的过往上下文
选择性追加 —— 仅保存重要的事实、偏好和事件
人类可读 —— 易于打开和查看记忆文件
可配置 —— 记忆文件路径在 config.toml 中设置
可用工具:
append_memory(category, content) —— 保存新信息
read_memory(query, limit) —— 检索相关上下文
在相关情况下,agent 会自动使用记忆,并追加新的重要细节。
这使得 Echo 在长期记忆和跨会话一致性方面表现得更加出色。
## 特性
- **混合工具调用 (Hybrid Tool Calling)**: 同时支持简单的命令语法和现代的 JSON function calling
- **持久会话**: 完整的 tmux 集成,支持命名会话和清晰的输出捕获
- **灵活的架构**: 专为方便用户轻松添加自己的工具而设计
- **本地优先 (Local-First)**: 与本地模型协同工作(如 llama.cpp、Ollama 等)
- **可扩展**: 包含对端点、system prompt、安全拒绝列表和工具定义的全面 TOML 配置支持
## 路线图
- 用于配置端点、system prompt 和允许使用的工具的 TOML 配置文件,仍在不断向 TOML 中添加新功能。
- 更清晰的终端 UI
- 更好的多模型支持(在本地模型和云端模型之间轻松切换)
### 它的功能
- 支持**混合原始文本工具调用**和 Json:
- ` command here ` 用于简单的单次 shell 命令
- ` command here ` 用于持久的 tmux 会话(非常适合 msfconsole、长时间运行的 shell 等)
- ` `
- ``
- 自动创建/复用 tmux 会话
- 基于标记和时间的清晰输出捕获(仅返回新的命令输出,而不是完整的会话历史记录)
- 安全拒绝列表(在执行前阻止危险命令)
- ShareGPT 格式的 JSONL 日志记录(已经在捕获何时/为何使用 SESSION 与 COMMAND 的训练示例)
- 与您的本地 llama.cpp 服务器通信的快速阻塞型 HTTP 客户端
- 用于工具日志记录的 Sqlite 数据库支持。
- 在达到 50K token 时自动进行上下文摘要。
- 使用 ctl+\ 中断生成,使用 ctl+c 结束会话。
### 特殊注意事项
我更改了本地模型上的 tokenizer chat template,使其能够接受 user、assistant、system 和 tool 消息类型。
标准工具结果处理的问题
大多数 OpenAI 兼容的 chat template 只定义了三种消息角色:system、user 和 assistant。当 agent 框架需要将工具输出返回给模型时,唯一可用的位置就是 user——因此工具结果会被当作是人类输入的一样注入其中。
这产生了一种根本的语义不匹配。模型在训练时被设定为将 user 消息视为需要响应的新指令。因此,当它看到作为 user 消息注入的工具输出时,它会推理出:一个用户给了我新信息,我应该对此采取行动——然后调用另一个工具。这会产生更多的输出。这些输出又会被作为另一条 user 消息注入。进而触发另一次工具调用。这个循环永远无法解决,因为在 token 流中没有任何东西表明“此任务已完成”。
解决方案
通过扩展 tokenizer 配置以将原生的 tool 角色识别为第一类的消息类型,模型会在一个语义上截然不同的位置中接收工具输出,该位置在训练时就被设定为是它自身行动的反馈,而不是来自用户的新请求。它知道是代理程序代表它执行了命令。它知道该输出是它所发起的操作的结果。并且它知道任务何时完成,因为反馈确认了完成状态,而不是促使采取进一步的行动。
标签:LLM代理框架, Python安全, Rust, SOC Prime, 可视化界面, 开发工具, 本地大模型, 网络流量审计, 网络调试, 自动化, 通知系统