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, 可视化界面, 开发工具, 本地大模型, 网络流量审计, 网络调试, 自动化, 通知系统