adolfousier/opencrabs
GitHub: adolfousier/opencrabs
单文件Rust二进制AI代理,支持多渠道、多LLM提供商、本地部署的自主学习和任务自动化。
Stars: 625 | Forks: 57
# 🦀 OpenCrabs
**自主的、自我改进的 AI 代理。单文件 Rust 二进制程序。覆盖所有渠道。**
```
___ ___ _
/ _ \ _ __ ___ _ _ / __|_ _ __ _| |__ ___
| (_) | '_ \/ -_) ' \ | (__| '_/ _` | '_ \(_-<
\___/| .__/\___|_||_| \___|_| \__,_|_.__//__/
|_|
🦀 The autonomous, self-improving AI agent. Single Rust binary. Every channel.
```
**作者:** [Adolfo Usier](https://github.com/adolfousier)
## 为什么选择 OpenCrabs?
OpenCrabs 以**单文件二进制程序**运行在您的终端上——无需服务器、无需网关、无需基础设施。它直接从您的机器向 LLM 提供商发起直接的 HTTPS 调用。除了您自己的计算机,没有任何其他数据离开。
### OpenCrabs 与 Node.js 代理框架对比
| | **OpenCrabs** (Rust) | **Node.js 框架**(例如 Open Claw) |
|---|---|---|
| **二进制大小** | **17–22 MB** 单文件,无依赖 | **1 GB+** `node_modules`,包含数百个传递依赖 |
| **运行时** | 无——原生运行 | 需要 Node.js 运行时 + npm install |
| **攻击面** | 零网络监听。仅允许出站 HTTPS | 服务器基础设施:开放端口、认证层、中间件 |
| **API 密钥安全** | 密钥仅在您的机器上。`zeroize` 在 drop 时从 RAM 中清除,调试输出中显示 `[REDACTED]` | 密钥在环境变量或配置中。GC 无法保证内存清除。堆转储可能泄露密钥 |
| **数据驻留** | 100% 本地——SQLite 数据库、embeddings、brain 文件,全部在 `~/.opencrabs/` 中 | 服务器端存储、潜在的多租户数据、网络传输 |
| **供应链** | 单一编译后的二进制文件。Rust 的类型系统在编译时防止缓冲区溢出、use-after-free、数据竞争 | npm 生态:typosquatting、依赖混淆、原型污染 |
| **内存安全** | 编译时保证——无 GC、无空指针、无数据竞争 | GC 管理、原型污染、类型强制转换 bug |
| **并发** | tokio async + Rust 所有权 = 保证零数据竞争 | 单线程事件循环,工作线程共享内存不安全 |
| **原生 TTS/STT** | 内置本地语音转文字(whisper.cpp)和文字转语音——约 130 MB 总栈,完全离线 | 无原生语音。需要外部 API(Google、AWS、Azure)或重型 Python 依赖(PyTorch,约 5 GB+) |
| **遥测** | 零。无分析、无追踪、无远程日志 | 服务器基础设施通常包含监控、日志管道、APM |
### 保留在本地(永不离开您的机器)
- 所有聊天会话和消息(SQLite)
- 工具执行(bash、文件读写、git)
- 记忆和 embeddings(本地向量搜索)
- 本地 STT 模式下的语音转录(whisper.cpp,设备端)
- Brain 文件、配置、API 密钥
### 外出内容(仅在使用时)
- 您发送给 LLM 提供商 API 的消息(Anthropic、OpenAI、GitHub Copilot 等)
- 网络搜索查询(可选工具)
- 通过 `gh` CLI 进行的 GitHub API 调用(可选工具)
- 浏览器自动化(可选,`browser` 功能——通过 CDP 自动检测基于 Chromium 的浏览器,非 Firefox)
- 动态工具 HTTP 请求(仅在 `tools.toml` 中定义 HTTP 工具时)
## 目录
- [截图](#-screenshots)
- [为什么选择 OpenCrabs?](#why-opencrabs)
- [核心功能](#-core-features)
- [CLI 命令](#cli)
- [支持的 AI 提供商](#-supported-ai-providers)
- [代理到代理(A2A)协议](#-agent-to-agent-a2a-protocol)
- [快速开始](#-quick-start)
- [入门向导](#-onboarding-wizard)
- [API 密钥(keys.toml)](#-api-keys-keystoml)
- [配置(config.toml)](#-configuration-configtoml)
- [命令(commands.toml)](#-commands-commandstoml)
- [动态工具(tools.toml)](#-dynamic-tools-toolstoml)
- [使用本地 LLM](#-using-local-llms)
- [配置](#-configuration)
- [工具系统](#-tool-system)
- [键盘快捷键](#-keyboard-shortcuts)
- [调试和日志](#-debug-and-logging)
- [定时任务与心跳](#-cron-jobs--heartbeats)
- [架构](#-architecture)
- [项目结构](#-project-structure)
- [开发](#-development)
- [平台说明](#-platform-notes)
- [故障排除](#-troubleshooting)
- [配套工具](#-companion-tools)
- [免责声明](#-disclaimers)
- [贡献](#-contributing)
- [许可证](#-license)
- [致谢](#-acknowledgments)
## 📸 截图
https://github.com/user-attachments/assets/7f45c5f8-acdf-48d5-b6a4-0e4811a9ee23
## 🎯 核心功能
### AI 与提供商
| 功能 | 描述 |
|---------|-------------|
| **多提供商** | Anthropic Claude、OpenAI、GitHub Copilot(使用您的 Copilot 订阅)、OpenRouter(400+ 模型)、MiniMax、Google Gemini、z.ai GLM(通用 API + 编码 API)、Claude CLI、OpenCode CLI、Qwen Code CLI(每天 1000 次免费请求),以及任何 OpenAI 兼容 API(Ollama、LM Studio、LocalAI)。模型列表从提供商 API 实时获取——新模型立即可用。每个会话记住其提供商和模型,切换时自动恢复 |
| **备用提供商** | 配置备用提供商链——如果主提供商失败,每个备用提供商按顺序自动尝试。任何已配置密钥的提供商都可以作为备用。配置:`[providers.fallback] providers = ["openrouter", "anthropic"]` |
| **按提供商设置视觉模型** | 为每个提供商设置 `vision_model`——LLM 将 `analyze_image` 作为工具调用,使用同一提供商 API 上的视觉模型来描述图像。聊天模型保持不变,通过工具调用获得视觉能力。配置后 Gemini 视觉优先。首次运行时为已知提供商(例如 MiniMax)自动配置 |
| **实时流式传输** | 逐字符响应流式传输,带有动画旋转器显示模型名称和实时文本 |
| **本地 LLM 支持** | 使用 LM Studio、Ollama 或任何 OpenAI 兼容端点运行——100% 私有、零成本 |
| **成本追踪** | 标题中显示每条消息的令牌计数和成本;`/usage` 显示按模型分组的全时间成本分解,包含历史会话的实际成本和估算成本 |
| **上下文感知** | 实时上下文使用指示器,显示实际令牌计数(例如 `ctx: 45K/200K (23%)`);70% 时自动压缩,包含工具开销预算;基于 tiktoken 的准确计数,与 API 实际数据校准 |
| **三级记忆** | (1) **Brain MEMORY.md**——用户管理的持久记忆,每轮加载,(2) **每日日志**——位于 `~/.opencrabs/memory/YYYY-MM-DD.md` 的自动压缩摘要,(3) **混合记忆搜索**——FTS5 关键词搜索 + 本地向量 embeddings(embeddinggemma-300M,768 维)通过 Reciprocal Rank Fusion 组合。完全本地运行——无需 API 密钥、无成本、离线工作 |
| **动态 Brain 系统** | 系统 brain 由工作区 MD 文件(SOUL、IDENTITY、USER、AGENTS、TOOLS、MEMORY)组装——所有文件可在回合之间实时编辑 |
| **多代理编排** | 生成类型化子代理(General、Explore、Plan、Code、Research)并行执行任务。五个工具:`spawn_agent`、`wait_agent`、`send_input`、`close_agent`、`resume_agent`。每种类型获得特定角色的系统提示和过滤的工具注册表。可配置子代理提供商/模型。子代理在隔离会话中运行,带自动批准——无递归生成 |
### 多模态输入
| 功能 | 描述 |
|---------|-------------|
| **图片附件** | 将图片路径或 URL 粘贴到输入中——自动检测并作为视觉内容块附加,供多模态模型使用 |
| **PDF 支持** | 按路径附加 PDF 文件——原生 Anthropic PDF 支持;对于其他提供商,通过 `pdf-extract` 本地提取文本 |
| **文档解析** | 内置 `parse_document` 工具从 PDF、DOCX、、TXT、MD、JSON、XML 中提取文本 |
| **语音(STT)** | 语音笔记通过 **API**(Groq Whisper `whisper-large-v3-turbo`)或 **本地**(whisper.cpp 通过 `whisper-rs`,设备端运行)转录。在 `/onboard:voice` 中选择模式。本地模式:选择模型大小(Tiny 75 MB / Base 142 MB / Small 466 MB / Medium 1.5 GB),从 HuggingFace 下载,零 API 成本。默认包含 |
| **语音(TTS)** | 代理通过 **API**(OpenAI TTS `gpt-4o-mini-tts`)或 **本地**(Piper TTS,通过 Python venv 设备端运行)用音频回复语音笔记。在 `/onboard:voice` 中选择模式。本地模式:选择语音(Ryan / Amy / Lessac / Kristin / Joe / Cori),从 HuggingFace 自动下载,零 API 成本。如果禁用则回退到文本 |
| **附件指示器** | 附加的图片在输入标题栏中显示为 `[IMG1:filename.png]` |
| **图片生成** | 代理通过 Google Gemini(`gemini-3.1-flash-image-preview` "Nano Banana")使用 `generate_image` 工具生成图片——通过 `/onboard:image` 启用。在所有渠道中作为原生图片/附件返回 |
### 消息集成
| 功能 | 描述 |
|---------|-------------|
| **Telegram 机器人** | 功能完整的 Telegram 机器人——所有者 DM 共享 TUI 会话,群组获得按群组隔离的会话(按聊天 ID 键控)。支持照片/语音、允许的用户 ID、允许的聊天/群组 ID、`respond_to` 过滤器(`all`/`dm_only`/`mention`)。被动群组消息捕获——即使机器人未被提及,所有消息也会存储以提供上下文 |
| **WhatsApp** | 运行时通过 QR 码配对或从入门向导连接。文本 + 图片,与 TUI 共享会话,手机白名单(`allowed_phones`),会话在重启后保持 |
| **Discord** | 功能完整的 Discord 机器人——文本 + 图片 + 语音。所有者 DM 共享 TUI 会话,公会频道获得按频道隔离的会话。允许的用户 ID、允许的频道 ID、`respond_to` 过滤器。通过 `discord_send`(17 个操作)完全主动控制:`send`、`reply`、`react`、`unreact`、`edit`、`delete`、`pin`、`unpin`、`create_thread`、`send_embed`、`get_messages`、`list_channels`、`add_role`、`remove_role`、`kick`、`ban`、`send_file`。生成的图片作为原生 Discord 文件附件发送 |
| **Slack** | 通过 Socket Mode 的功能完整的 Slack 机器人——所有者 DM 共享 TUI 会话,频道获得按频道隔离的会话。允许的用户 ID、允许的频道 ID、`respond_to` 过滤器。通过 `slack_send`(17 个操作)完全主动控制:`send`、`reply`、`react`、`unreact`、`edit`、`delete`、`pin`、`unpin`、`get_messages`、`get_channel`、`list_channels`、`get_user`、`list_members`、`kick_user`、`set_topic`、`send_blocks`、`send_file`。生成的图片作为原生 Slack 文件上传发送。机器人令牌 + 应用令牌来自 `api.slack.com/apps`(需要 Socket Mode)。**所需机器人令牌权限:** `chat:write`、`channels:history`、`groups:history`、`im:history`、`mpim:history`、`users:read`、`files:read`、`files:write`、`reactions:write`、`app_mentions:read` |
| **Trello** | 默认仅工具——AI 仅在通过 `trello_send` 明确调用时对 Trello 进行操作。通过配置中的 `poll_interval_secs` 选择加入轮询;启用后,仅允许用户的 `@bot_username` 提及触发响应。通过 `trello_send`(22 个操作)完全管理卡片:`add_comment`、`create_card`、`move_card`、`find_cards`、`list_boards`、`get_card`、`get_card_comments`、`update_card`、`archive_card`、`add_member_to_card`、`remove_member_from_card`、`add_label_to_card`、`remove_label_from_card`、`add_checklist`、`add_checklist_item`、`complete_checklist_item`、`list_lists`、`get_board_members`、`search`、`get_notifications`、`mark_notifications_read`、`add_attachment`。API 密钥 + 令牌来自 `trello.com/power-ups/admin`,可配置看板 ID 和成员 ID 白名单 |
#### 文件和媒体输入支持
当用户在任何渠道发送文件、图片或文档时,代理自动接收内容——无需手动转发。例如:用户上传仪表板截图到 Trello 卡片并评论 *"我看到这个错误"* ——代理获取附件,通过视觉管道处理,然后提供完整上下文进行回复。
| 渠道 | 图片(入) | 文本文件(入) | 文档(入) | 音频(入) | 图片生成(出) |
|---------|-------------|-----------------|----------------|------------|-----------------|
| **Telegram** | ✅ 视觉管道 | ✅ 内联提取 | ✅ / PDF 注意 | ✅ STT | ✅ 原生照片 |
| **WhatsApp** | ✅ 视觉管道 | ✅ 内联提取 | ✅ / PDF 注意 | ✅ STT | ✅ 原生图片 |
| **Discord** | ✅ 视觉管道 | ✅ 内联提取 | ✅ / PDF 注意 | ✅ STT | ✅ 文件附件 |
| **Slack** | ✅ 视觉管道 | ✅ 内联提取 | ✅ / PDF 注意 | ✅ STT | ✅ 文件上传 |
| **Trello** | ✅ 卡片附件 → 视觉 | ✅ 内联提取 | — | — | ✅ 卡片附件 + 嵌入 |
| **TUI** | ✅ 粘贴路径 → 视觉 | ✅ 粘贴路径 → 内联 | — | ✅ STT | ✅ `[IMG: name]` 显示 |
图片如果支持多模态输入则传递给活动模型的视觉管道,否则路由到 `analyze_image` 工具(Google Gemini 视觉)。文本文件(`.txt`、`.md`、`.json`、`.csv`、源代码等)作为 UTF-8 提取并内联包含最多 8000 字符——在 TUI 中只需粘贴或输入文件路径。
### 终端 UI
| 功能 | 描述 |
|---------|-------------|
| **光标导航** | 完整光标移动:左/右箭头、Ctrl+左/右跳转单词、Home/End、Delete、Backspace |
| **输入历史** | 持久命令历史(`~/.opencrabs/history.txt`),启动时加载,最多 500 条 |
| **内联工具批准** | Claude Code 风格 `❯ Yes / Always / No` 选择器,带箭头键导航 |
| **内联计划批准** | 交互式计划审查选择器(批准 / 拒绝 / 请求更改 / 查看计划) |
| **会话管理** | 创建、重命名、删除会话,持久化 SQLite 存储;每个会话记住其提供商和模型——切换会话自动恢复提供商(无需手动 `/models`);每个会话的令牌计数和上下文百分比 |
| **分屏** | 水平(会话中的 `|`)和垂直(会话中的 `_`)分屏——tmux 风格。每个分屏运行自己的会话,具有独立的提供商、模型和上下文。并排运行 10 个会话,全部并行处理。`Tab` 循环焦点,`Ctrl+X` 关闭分屏 |
| **并行会话** | 多个会话可以同时向不同提供商发送进行中的请求。在一个会话中发送消息,切换到另一个,再发送一个——两者并行处理。后台会话自动批准工具调用;切换回来时会看到结果 |
| **流式传输时滚动** | 在流式传输时向上滚动,不会被拖回底部;滚动回底部或发送消息时自动滚动重新启用 |
| **压缩摘要** | 自动压缩在聊天中显示完整摘要作为系统消息——准确看到代理记住的内容 |
| **语法高亮** | 100+ 语言,带行号,通过 syntect |
| **Markdown 渲染** | 富文本格式,包含代码块、标题、列表和内联样式 |
| **工具上下文持久化** | 工具调用组保存到数据库,会话重新加载时重建——不会丢失工具历史 |
| **多行输入** | Alt+Enter / Shift+Enter 换行;Enter 发送 |
| **中止处理** | 3 秒内按两次 Escape 取消任何进行中的请求 |
| **Bang 操作符(`!cmd`)** | 直接从输入运行任何 shell 命令——无需 LLM 往返。输出目录上下文中显示为系统消息 |
| **自动更新** | 启动时和后台每 24 小时检查 GitHub 是否有新版本。发现新版本时静默安装并热重启。通过 `[agent] auto_update = false` 在 `config.toml` 中禁用以改为提示 |
### 代理能力
| 功能 | 描述 |
|---------|-------------|
| **完整终端访问** | 30+ 内置工具(文件 I/O、glob、grep、网络搜索、代码执行、图片生成/分析、记忆搜索、定时任务),加上**系统上的任何 CLI 工具**通过 `bash`——GitHub CLI、Docker、SSH、Python、Node、ffmpeg、curl 以及其他一切都可以直接使用 |
| **按会话隔离** | 每个会话是独立的代理,有自己的提供商、模型、上下文和工具状态。会话可以并行运行不同提供商的任务——在一个会话中向 Claude 提问,同时让 Kimi 在另一个会话中编写代码 |
| **自维持** | 代理可以修改自己的源代码、构建、测试,并通过 Unix `exec()` 热重启 |
| **自我改进** | 从经验中学习——将可重用工作流保存为自定义命令,将经验教训写入记忆,更新自己的 brain 文件。全部本地化,没有数据离开您的机器 |
| **动态工具** | 通过 `~/.opencrabs/tools.toml` 在运行时定义自定义工具——代理可以像内置工具一样自主调用它们。HTTP 和 shell 执行器、模板参数(`{{param}}`),无需重启即可启用/禁用。`tool_manage` 元工具允许代理动态创建、删除和重新加载工具 |
| **浏览器自动化** | 通过 CDP(Chrome DevTools 协议)原生控制浏览器。自动检测您的默认基于 Chromium 的浏览器(Chrome、Brave、Edge、Arc、Vivaldi、Opera、Chromium)并使用其配置文件——您的登录、cookie 和扩展继承。7 个浏览器工具:导航、点击、输入、截图、eval JS、提取内容、等待元素。有头或无头模式,自动检测显示。**注意:** 不支持 Firefox(无 CDP)——如果 Firefox 是您的默认浏览器,OpenCrabs 回退到第一个可用的 Chromium 浏览器。功能在 `browser` 下(默认包含) |
| **自然语言命令** | 告诉 OpenCrabs 创建斜杠命令——它通过 `config_manager` 工具自动写入 `commands.toml` |
| **实时设置** | 代理可以在运行时读写 `config.toml`;设置 TUI 屏幕(按 `S`)显示当前配置;批准策略在重启后保持。默认:自动批准(使用 `/approve` 更改) |
| **网络搜索** | 默认 DuckDuckGo(内置,无需密钥)+ EXA AI(神经,通过 MCP 免费);Brave Search 可选(密钥在 `keys.toml` 中) |
| **调试日志** | `--debug` 标志启用文件日志;`DEBUG_LOGS_LOCATION` 环境变量用于自定义日志目录 |
| **代理到代理(A2A)** | 实现 A2A 协议 RC v1.0 的 HTTP 网关——通过 JSON-RPC 2.0 的点对点代理通信。支持 `message/send`、`message/stream`(SSE)、`tasks/get`、`tasks/cancel`。内置 `a2a_send` 工具允许代理主动调用远程 A2A 代理。可选 Bearer 令牌认证。包含多代理辩论(蜂群),具有置信度加权共识。任务在重启后持久化 |
| **配置文件** | 从同一安装运行多个隔离实例。每个配置文件有自己的配置、密钥、记忆、会话和数据库。使用 `opencrabs profile create ` 创建,使用 `-p ` 切换。使用 `profile migrate` 在配置文件之间迁移配置。导出/导入共享。令牌锁隔离防止两个配置文件使用相同的机器人凭证 |
### CLI
| 命令 | 描述 |
|---------|-------------|
| `opencrabs` | 启动交互式 TUI(默认) |
| `opencrabs chat` | 启动 TUI,可选 `--session ` 恢复,`--onboard` 强制向导 |
| `opencrabs run ` | 非交互式执行单个提示。`--auto-approve` / `--yolo` 无人值守。`--format text\|json\|markdown` |
| `opencrabs agent` | 交互式 CLI 代理——终端中的多轮对话,无需 TUI。`-m ` 单消息模式 |
| `opencrabs status` | 系统概览:版本、提供商、渠道、数据库、brain、动态工具 |
| `opencrabs doctor` | 完整诊断:配置、提供商连接、数据库、brain、渠道、PATH 中的 CLI 工具 |
| `opencrabs init` | 初始化配置(`--force` 覆盖) |
| `opencrabs config` | 显示当前配置(`--show-secrets` 显示密钥) |
| `opencrabs onboard` | 运行入门设置向导 |
| `opencrabs channel list` | 列出所有配置的渠道及启用/禁用状态 |
| `opencrabs channel doctor` | 对所有启用的渠道运行健康检查 |
| `opencrabs memory list` | 列出 brain 文件和记忆条目 |
| `opencrabs memory get ` | 显示特定记忆或 brain 文件的内容 |
| `opencrabs memory stats` | 记忆统计:文件数、总大小、条目数 |
| `opencrabs session list` | 列出所有会话,包含提供商、模型、令牌计数(`--all` 包含已归档) |
| `opencrabs session get ` | 显示会话详情和最近消息 |
| `opencrabs db init` | 初始化数据库 |
| `opencrabs db stats` | 显示数据库统计 |
| `opencrabs db clear` | 清除所有会话和消息(`--force` 跳过确认) |
| `opencrabs cron add\|list\|remove\|enable\|disable\|test` | 管理计划的定时任务 |
| `opencrabs logs status\|view\|clean\|open` | 日志管理 |
| `opencrabs service install\|start\|stop\|restart\|status\|uninstall` | OS 服务管理(macOS 上为 launchd,Linux 上为 systemd) |
| `opencrabs daemon` | 以无头守护进程模式运行——仅渠道,无 TUI |
| `opencrabs completions ` | 生成 shell 补全(bash、zsh、fish、powershell) |
| `opencrabs version` | 打印版本并退出 |
全局标志:`--debug`(启用文件日志)、`--config `(自定义配置文件)、`--profile ` / `-p `(以命名配置文件运行)。
### 配置文件——多实例螃蟹代理
从同一安装运行多个隔离的 OpenCrabs 实例。每个配置文件有自己的配置、brain 文件、记忆、会话、数据库和网关服务。
| 命令 | 描述 |
|---------|-------------|
| `opencrabs profile create ` | 创建带有新配置和 brain 文件的新配置文件 |
| `opencrabs profile list` | 列出所有配置文件及上次使用时间戳 |
| `opencrabs profile delete ` | 删除配置文件及其所有数据 |
| `opencrabs profile export -o profile.tar.gz` | 将配置文件导出为可移植存档 |
| `opencrabs profile import profile.tar.gz` | 从存档导入配置文件 |
| `opencrabs profile migrate --from --to ` | 在配置文件之间复制配置和 brain 文件(无数据库或会话) |
| `opencrabs -p ` | 以指定配置文件启动 OpenCrabs |
**默认配置文件:** `~/.opencrabs/`——与以前完全一样。无需迁移。从不接触配置文件的用户看不到任何差异。
**命名配置文件**位于 `~/.opencrabs/profiles//`,完全隔离:
```
~/.opencrabs/
├── config.toml # default profile
├── opencrabs.db
├── profiles.toml # profile registry
├── locks/ # token-lock files
└── profiles/
├── hermes/ # named profile
│ ├── config.toml
│ ├── keys.toml
│ ├── opencrabs.db
│ ├── SOUL.md
│ └── memory/
└── scout/
└── ...
```
**令牌锁隔离:** 两个配置文件不能使用相同的机器人凭证(Telegram 令牌、Discord 令牌等)。启动时,每个配置文件获取其渠道令牌的锁。如果另一个配置文件已持有该锁,渠道拒绝启动——防止两个实例争用同一个机器人。
**配置文件迁移:** 使用 `opencrabs profile migrate --from default --to hermes` 将所有 `.md` brain 文件、`.toml` 配置文件和 `memory/` 条目复制到新配置文件。会话和数据库不复制——配置文件全新开始。添加 `--force` 覆盖目标配置文件中的现有文件。迁移后,自定义新配置文件的 `SOUL.md`、`IDENTITY.md` 和 `config.toml` 以赋予其不同的个性和提供商设置。
### 守护进程和服务
将配置文件作为后台服务运行:
```
# Install as system service (macOS launchd / Linux systemd)
opencrabs -p hermes service install
opencrabs -p hermes service start
# Each profile gets its own service
# macOS: com.opencrabs.daemon.hermes
# Linux: opencrabs-hermes.service
# Manage independently
opencrabs -p hermes service status
opencrabs -p hermes service stop
opencrabs -p hermes service uninstall
```
多个配置文件可以作为同时运行的守护进程服务运行,完全隔离。
**环境变量:** 设置 `OPENCRABS_PROFILE=hermes` 以选择配置文件,无需 `-p` 标志。适用于 systemd 服务、定时任务和守护进程模式。
## 🌐 支持的 AI 提供商
| 提供商 | 认证 | 模型 | 流式传输 | 工具 | 备注 |
|----------|------|--------|-----------|-------|-------|
| [Anthropic Claude](#anthropic-claude) | API 密钥 | Claude Opus 4.6、Sonnet 4.5、Haiku 4.5+ | ✅ | ✅ | 成本追踪、自动重试 |
| [OpenAI](#openai) | API 密钥 | GPT-5 Turbo、GPT-5 | ✅ | ✅ | |
| [GitHub Copilot](#github-copilot) | OAuth | GPT-4o、Claude Sonnet 4+ | ✅ | ✅ | 使用您的 Copilot 订阅——无 API 费用 |
| [OpenRouter](#openrouter--400-models-one-key) | API 密钥 | 400+ 模型 | ✅ | ✅ | 免费模型可用(DeepSeek-R1、Llama 3.3 等) |
| [Google Gemini](#google-gemini) | API 密钥 | Gemini 2.5 Flash、2.0、1.5 Pro | ✅ | ✅ | 1M+ 上下文、视觉、图片生成 |
| [MiniMax](#minimax) | API 密钥 | M2.7、M2.5、M2.1、Text-01 | ✅ | ✅ | 有竞争力的定价、自动配置视觉 |
| [z.ai GLM](#zai-glm) | API 密钥 | GLM-4.5 到 GLM-5 Turbo | ✅ | ✅ | 通用 API + 编码 API 端点 |
| [Claude CLI](#claude-code-cli) | CLI 认证 | 通过 `claude` 二进制 | ✅ | ✅ | 使用您的 Claude Code 订阅 |
| [OpenCode CLI](#opencode-cli) | 无 | 免费模型(Mimo 等) | ✅ | ✅ | 免费——无需 API 密钥或订阅 |
| [Qwen Code CLI](#qwen-code-cli) | OAuth / API 密钥 | Qwen3-Coder-Plus、Qwen3.5-Plus、Qwen3.6-Plus | ✅ | ✅ | 每天 1000 次免费请求,通过 Qwen OAuth——无需 API 密钥 |
| [自定义](#custom-openai-compatible) | 可选 | 任意 | ✅ | ✅ | Ollama、LM Studio、Groq、NVIDIA、任何 OpenAI 兼容 API |
### Anthropic Claude
**模型:** `claude-opus-4-6`、`claude-sonnet-4-5-20250929`、`claude-haiku-4-5-20251001`,以及遗留 Claude 3.x 模型
在 `keys.toml` 中**设置**:
```
[providers.anthropic]
api_key = "sk-ant-api03-YOUR_KEY"
```
**功能:** 流式传输、工具、成本追踪、带退避的自动重试
#### Claude Code CLI
使用您的 Claude Code CLI。OpenCrabs 为完成生成启动本地 `claude` CLI。
**设置:**
1. 安装 [Claude Code CLI](https://github.com/anthropics/claude-code) 并认证(`claude login`)
2. 在 `config.toml` 中启用:
```
[providers.claude_cli]
enabled = true
```
OpenCrabs 在本地处理所有工具、记忆和上下文——CLI 仅仅是 LLM 后端。
### OpenAI
**模型:** GPT-5 Turbo、GPT-5
在 `keys.toml` 中**设置**:
```
[providers.openai]
api_key = "sk-YOUR_KEY"
```
### GitHub Copilot
**使用您的 GitHub Copilot 订阅**——无 API 费用,无需管理令牌。OpenCrabs 通过与 VS Code 和其他 Copilot 工具相同的 OAuth 设备流进行认证。
**设置**——在入门向导中选择 GitHub Copilot 并按 Enter。您将看到一个一次性代码,在 [github.com/login/device](https://github.com/login/device) 输入。授权后,模型从 Copilot API 自动获取。
**要求:** 有效的 [GitHub Copilot](https://github.com/features/copilot) 订阅(个人、企业或企业)。
**功能:** 流式传输、工具、`api.githubcopilot.com` 上的 OpenAI 兼容 API。Copilot 特定头(`copilot-integration-id`、`editor-version`)自动注入。短期 API 令牌每约 25 分钟在后台刷新。
### OpenRouter — 400+ 模型,一个密钥
在 `keys.toml` 中**设置**——在 [openrouter.ai/keys](https://openrouter.ai/keys) 获取密钥:
```
[providers.openrouter]
api_key = "sk-or-YOUR_KEY"
```
通过单个 API 密钥访问来自每个主要提供商的 400+ 模型——Anthropic、OpenAI、Google、Meta、Mistral、DeepSeek、Qwen 等等。包含**免费模型**(DeepSeek-R1、Llama 3.3、Gemma 2、Mistral 7B)以及发布时的 stealth/preview 模型。
模型列表在入门期间和通过 `/models` 从 OpenRouter API **实时获取**——添加新模型时无需更新二进制。
### Google Gemini
**模型:** `gemini-2.5-flash`、`gemini-2.0-flash`、`gemini-1.5-pro`——从 Gemini API 实时获取
在 `keys.toml` 中**设置**——在 [aistudio.google.com](https://aistudio.google.com) 获取密钥:
```
[providers.gemini]
api_key = "AIza..."
```
在 `config.toml` 中启用并设置默认模型:
```
[providers.gemini]
enabled = true
default_model = "gemini-2.5-flash"
```
**功能:** 流式传输、工具使用、视觉、1M+ 令牌上下文窗口、`/models` 端点的实时模型列表
### MiniMax
**模型:** `MiniMax-M2.7`、`MiniMax-M2.5`、`MiniMax-M2.1`、`MiniMax-Text-01`
**设置**——从 [platform.minimax.io](https://platform.minimax.io) 获取您的 API 密钥。添加到 `keys.toml`:
```
[providers.minimax]
api_key = "your-api-key"
```
MiniMax 是具有竞争力的定价的 OpenAI 兼容提供商。它不公开 `/models` 端点,因此模型列表来自 `config.toml`(预配置了可用模型)。
### z.ai GLM
**模型:** `glm-4.5`、`glm-4.5-air`、`glm-4.6`、`glm-4.7`、`glm-5`、`glm-5-turbo`——从 z.ai API 实时获取
**设置**——从 [open.bigmodel.cn](https://open.bigmodel.cn) 获取您的 API 密钥。添加到 `keys.toml`:
```
[providers.zhipu]
api_key = "your-api-key"
```
在 `config.toml` 中启用并选择端点类型:
```
[providers.zhipu]
enabled = true
default_model = "glm-4.7"
endpoint_type = "api" # "api" (General API) or "coding" (Coding API)
```
z.ai GLM(智谱 AI)提供两种可在入门或 `/models` 中选择的端点类型:
- **通用 API**(`api`)——标准聊天完成,位于 `open.bigmodel.cn/api/paas/v4`
- **编码 API**(`coding`)——代码优化端点,位于 `codeapi.bigmodel.cn/api/paas/v4`
两者使用相同的 API 密钥和模型名称。端点类型可在入门向导或 `/models` 对话框中切换。
**功能:** 流式传输、工具、OpenAI 兼容 API、`/models` 端点的实时模型列表
### OpenCode CLI
使用 [OpenCode](https://github.com/opencode-ai/opencode) CLI 作为免费 LLM 后端——无需 API 密钥或订阅。OpenCrabs 为完成生成启动本地 `opencode` 二进制。
**设置:**
1. 安装 [OpenCode CLI](https://github.com/opencode-ai/opencode)(`go install github.com/opencode-ai/opencode@latest` 或从 releases 下载)
2. 在 `config.toml` 中启用:
```
[providers.opencode_cli]
enabled = true
default_model = "opencode/mimo-v2-pro-free"
```
模型从 `opencode models` 实时获取。免费模型如 `mimo-v2-pro-free` 无需任何认证即可使用。
**功能:** 流式传输、工具、扩展思考支持、NDJSON 事件
### Qwen Code CLI
使用 [Qwen Code](https://github.com/qwen-code/qwen-code) CLI 作为免费 LLM 后端——**每天 1000 次免费请求**,通过 Qwen OAuth。OpenCrabs 为完成生成启动本地 `qwen` 二进制。
**设置:**
1. 安装 Qwen Code CLI(`npm install -g @qwen-code/qwen-code` 或 `brew install qwen-code`)
2. 认证:运行 `qwen` 并按照 OAuth 流程(或设置 `DASHSCOPE_API_KEY` 进行 API 密钥认证)
3. 在 `config.toml` 中启用:
```
[providers.qwen_code_cli]
enabled = true
default_model = "qwen3-coder-plus"
```
**可用模型:** `qwen3-coder-plus`、`qwen3.5-plus`、`qwen3.6-plus`、`qwen3-coder-480a35`、`qwen3-coder-30ba3b`、`qwen3-max-2026-01-23`
**功能:** 流式传输、工具、256K 上下文窗口、NDJSON 事件协议(Gemini CLI 分支)
### 自定义(OpenAI 兼容)
**用于:** Ollama、LM Studio、LocalAI、Groq 或任何 OpenAI 兼容 API。
在 `config.toml` 中**设置**——每个自定义提供商需要一个名称(`custom.` 后的标签):
```
[providers.custom.lm_studio]
enabled = true
base_url = "http://localhost:1234/v1" # or your endpoint
default_model = "qwen2.5-coder-7b-instruct"
# Optional: list your available models — shows up in /models and /onboard
# so you can switch between them without editing config
models = ["qwen2.5-coder-7b-instruct", "llama-3-8B", "mistral-7B-instruct"]
```
**多个自定义提供商**共存——定义任意多个,使用不同名称,通过 `/models` 切换:
```
[providers.custom.lm_studio]
enabled = true
base_url = "http://localhost:1234/v1"
default_model = "qwen2.5-coder-7b-instruct"
[providers.custom.ollama]
enabled = false
base_url = "http://localhost:11434/v1"
default_model = "mistral"
```
`custom.` 后的名称是您选择的标签(例如 `lm_studio`、`nvidia`、`groq`)。`enabled = true` 的那个是活动的。密钥使用相同标签放在 `keys.toml` 中。所有配置的自定义提供商持久化——通过 `/models` 切换只是切换 `enabled`。
#### 使用 NVIDIA API + Kimi K2.5 免费原型设计
[Kimi K2.5](https://build.nvidia.com/moonshotai/kimi-k2.5) 是前沿规模的多模态混合专家(MoE)模型,在 **NVIDIA API 目录**上**免费**提供——无需设置计费或信用卡。它处理复杂推理和图像/视频理解,是付费模型(如 Claude 或 Gemini)的强大免费替代品,适用于实验和代理工作流。
**使用 OpenCrabs 自定义提供商设置测试和验证。**
**快速开始:**
1. 在 [NVIDIA API 目录](https://build.nvidia.com/) 注册并验证您的账户
2. 转到 [Kimi K2.5 模型页面](https://build.nvidia.com/moonshotai/kimi-k2.5) 并点击 **获取 API 密钥**(或"查看代码"查看自动生成的密钥)
3. 通过 `/models` 或 `config.toml` 在 OpenCrabs 中配置:
```
[providers.custom.nvidia]
enabled = true
base_url = "https://integrate.api.nvidia.com/v1"
default_model = "moonshotai/kimi-k2.5"
```
```
# keys.toml
[providers.custom.nvidia]
api_key = "nvapi-..."
```
**提供商优先级:** MiniMax > OpenRouter > Anthropic > OpenAI > GitHub Copilot > Gemini > z.ai GLM > Claude CLI > OpenCode CLI > 自定义。第一个 `enabled = true` 的提供商用于新会话。每个提供商在 `keys.toml` 中有自己的 API 密钥——不共享或混淆。
**按会话提供商:** 每个会话记住它使用的提供商和模型。在一个会话切换到 Claude,在另一个切换到 Kimi——当您 `/sessions` 切换时,提供商自动恢复。无需每次都 `/models`。新会话继承当前提供商。
### 备用提供商
如果您的首选提供商宕机,备用提供商按顺序自动尝试。任何已配置 API 密钥的提供商都可以作为备用:
```
[providers.fallback]
enabled = true
providers = ["openrouter", "anthropic"] # tried in order on failure
```
在运行时,如果对主提供商的请求失败,每个备用都会被尝试直到成功
当 AI 请求需要权限的工具时,聊天中会显示内联审批提示。审批是会话感知的:后台会话会自动批准工具调用以免阻塞,切换会话不会丢失待处理的审批。
| 快捷键 | 操作 |
|--------|------|
| `↑` / `↓` | 导航审批选项 |
| `Enter` | 确认所选选项 |
| `D` / `Esc` | 拒绝工具请求 |
| `V` | 切换参数详情 |
**审批选项(TUI 和所有渠道):**
| 选项 | 效果 |
|------|------|
| **是** | 批准此次工具调用 |
| **始终(会话)** | 自动批准此会话的所有工具(重启时重置) |
| **YOLO(永久)** | 永久自动批准所有工具,持久化到 `config.toml` |
| **否** | 拒绝此次工具调用 |
使用 `/approve` 随时更改审批策略(持久化到 `config.toml`):
| 策略 | 描述 |
|------|------|
| **仅批准** | 每次工具执行前都提示。如果你想审查代理的每个操作,请使用此选项。设置方式:`/approve` → "仅批准(始终询问)" |
| **允许全部(会话)** | 仅对当前会话自动批准所有工具,重启时重置 |
| **YOLO 模式** | 无需审批执行所有操作(新用户的默认选项)。设置方式:`/approve` → "YOLO 模式" |
## 🔍 调试和日志
OpenCrabs 使用**条件日志系统**——默认不生成日志文件。
```
# Stack traces on crash
RUST_BACKTRACE=1 opencrabs
# Verbose console output (no file logging)
RUST_LOG=debug opencrabs
# Debug mode: rolling file logs to ~/.opencrabs/logs/, auto-cleanup after 7 days
opencrabs -d
# Both: file logs + verbose console output
RUST_LOG=debug opencrabs -d
```
无论通过 `cargo install opencrabs` 安装还是从源码构建,这四种方式都相同。
```
# Log management
opencrabs logs status # Check logging status
opencrabs logs view # View recent entries
opencrabs logs clean # Clean old logs
opencrabs logs clean -d 3 # Clean logs older than 3 days
```
**启用调试模式(`-d`)时:**
- 日志文件创建在 `~/.opencrabs/logs/`
- DEBUG 级别包含线程 ID、文件名、行号
- 每日滚动轮转,嘈杂的 crate(hyper、h2、reqwest)抑制到 warn 级别
**禁用时(默认):**
- 不创建日志文件
- 仅 stderr 输出警告和错误
- 干净的工作区
## 🧠 大脑系统和三层记忆
OpenCrabs 的大脑是**动态且自我维持的**。代理不从硬编码的系统提示中组装其个性、知识和行为,而是从工作区的文件中获取,这些文件可以在回合之间编辑。
### 大脑工作区
大脑从 `~/.opencrabs/` 读取 markdown 文件:
```
~/.opencrabs/ # Home — everything lives here
├── SOUL.md # Personality, tone, hard behavioral rules
├── IDENTITY.md # Agent name, vibe, style, workspace path
├── USER.md # Who the human is, how to work with them
├── AGENTS.md # Workspace rules, memory system, safety policies
├── TOOLS.md # Environment-specific notes (SSH hosts, API accounts)
├── MEMORY.md # Long-term curated context (never touched by auto-compaction)
├── SECURITY.md # Security policies and access controls
├── BOOT.md # Startup checklist (optional, runs on launch)
├── HEARTBEAT.md # Periodic task definitions (optional)
├── BOOTSTRAP.md # First-run onboarding wizard (deleted after setup)
├── config.toml # App configuration (provider, model, approval policy)
├── keys.toml # API keys (provider, channel, STT/TTS)
├── commands.toml # User-defined slash commands
├── tools.toml # Runtime-defined agent tools (HTTP, shell)
├── opencrabs.db # SQLite — sessions, messages, plans
└── memory/ # Daily memory logs (auto-compaction summaries)
└── YYYY-MM-DD.md # One per day, multiple compactions stack
```
大脑文件每个回合都会重新读取——在消息之间编辑它们,代理会立即反映这些变化。缺失的文件会被静默跳过;始终存在一个硬编码的大脑前言。
### 三层记忆架构
| 层级 | 位置 | 用途 | 管理方 |
|------|------|------|--------|
| **1. 大脑 MEMORY.md** | `~/.opencrabs/MEMORY.md` | 持久的、精选的知识,每回合加载到系统大脑中 | 你(用户) |
| **2. 每日记忆日志** | `~/.opencrabs/memory/YYYY-MM-DD.md` | 自动压缩摘要,包含每个会话的结构化分解 | 自动(压缩时) |
| **3. 混合记忆搜索** | `memory_search` 工具(FTS5 + 向量) | 混合语义搜索——BM25 关键词 + 向量嵌入(768 维,本地 GGUF)通过倒数排名融合。无 API 密钥,零成本,离线运行 | 代理(通过工具调用) |
**工作原理:**
1. 当上下文达到 70% 时,自动压缩将对话总结为结构化分解(当前任务、决策、修改的文件、错误、下一步)
2. 摘要保存到每日日志 `~/.opencrabs/memory/2026-02-15.md`(一天内的多次压缩堆叠在同一文件中)
3. 摘要会在聊天中显示给你,让你看到被记住的内容
4. 文件在后台被索引到 FTS5 数据库,以便代理可以使用 `memory_search` 搜索过去的日志
5. 大脑 `MEMORY.md` 永远不会被自动压缩触及——它保持为你精选的、始终加载的上下文
#### 混合记忆搜索(FTS5 + 向量嵌入)
记忆搜索通过**倒数排名融合(RRF)**结合两种策略以获得两全其美的召回:
1. **FTS5 关键词搜索**——BM25 排名的全文匹配,带 porter 词干提取
2. **向量语义搜索**——通过本地 GGUF 模型(embeddinggemma-300M,约 300 MB)生成 768 维嵌入
嵌入模型在首次 TUI 启动时自动下载(约 300 MB,一次性),完全在 CPU 上运行。**无 API 密钥,无云服务,无按查询费用,离线工作。** 如果模型尚未可用(首次启动,仍在下载),搜索会优雅地降级到仅 FTS。
**为什么选择本地嵌入而非 OpenAI/云?**
| | 本地(embeddinggemma-300M) | 云 API(如 OpenAI) |
|---|---|---|
| **成本** | 永久免费 | 约 $0.0001/查询,累积起来 |
| **隐私** | 100% 本地,什么都不离开你的机器 | 数据发送到第三方 |
| **延迟** | ~2ms(进程内,无网络) | 100-500ms(HTTP 往返) |
| **离线** | 无需互联网即可工作 | 需要互联网 |
| **设置** | 自动,无需 API 密钥 | 需要 API 密钥 + 计费 |
| **质量** | 代码/会话召回优秀(768 维) | 通用场景略好 |
| **大小** | 约 300 MB 一次性下载 | 不适用 |
### 用户定义的斜杠命令
用自然语言告诉 OpenCrabs:*"创建一个运行 deploy.sh 的 /deploy 命令"*——它会通过 `config_manager` 工具将命令写入 `~/.opencrabs/commands.toml`:
```
[[commands]]
name = "/deploy"
description = "Deploy to staging server"
action = "prompt"
prompt = "Run the deployment script at ./src/scripts/deploy.sh for the staging environment."
```
命令与内置命令一起出现在自动补全中。每次代理响应后,`commands.toml` 会自动重新加载——无需重启。旧的 `commands.json` 文件会在首次加载时自动迁移。
### 自我维持架构
OpenCrabs 可以修改自己的源代码、构建、测试和热重启——由代理通过 `rebuild` 工具或用户通过 `/rebuild` 触发:
```
/rebuild # User-triggered: build → restart prompt
rebuild tool # Agent-triggered: build → ProgressEvent::RestartReady → restart prompt
```
**工作原理:**
1. 代理使用其内置工具(read、write、edit、bash)编辑源文件
2. `SelfUpdater::build()` 异步运行 `cargo build --release`
3. 成功时,发出 `ProgressEvent::RestartReady` → 桥接到 `TuiEvent::RestartReady`
4. TUI 切换到 **RestartPending** 模式——用户按 Enter 确认
5. `SelfUpdater::restart(session_id)` 通过 Unix `exec()` 替换进程
6. 新二进制文件以 `opencrabs chat --session ` 启动——恢复相同的对话
7. 发送一条隐藏的唤醒消息给代理,以便它问候用户并从中断处继续
**两条触发路径:**
| 路径 | 入口点 | 信号 |
|------|--------|------|
| **代理触发** | `rebuild` 工具(代理编辑源文件后调用) | `ProgressCallback` → `RestartReady` |
| **用户触发** | `/rebuild` 斜杠命令 | 直接 `TuiEvent::RestartReady` |
**关键细节:**
- 运行中的二进制文件在内存中——磁盘上的源文件更改在重启前不会影响它
- 如果构建失败,代理保持运行,可以读取编译器错误来修复它们
- 通过 SQLite 的会话持久化意味着重启不会丢失对话上下文
- 重启后,代理会自动唤醒并带会话上下文——无需用户输入
- 大脑文件(`SOUL.md`、`MEMORY.md` 等)每个回合都会重新读取,因此编辑会立即生效,无需重建
- 用户定义的斜杠命令(`commands.toml`)也在每次代理响应后自动重新加载
- 热重启仅限 Unix(`exec()` 系统调用);在 Windows 上构建/测试步骤可以工作,但重启需要手动重新启动
**模块:**
- `src/brain/self_update.rs` — `SelfUpdater` 结构体,包含 `auto_detect()`、`build()`、`test()`、`restart()`
- `src/brain/tools/rebuild.rs` — `RebuildTool`(代理可调用,发出 `ProgressEvent::RestartReady`)
### 自我改进代理OpenCrabs 通过三种本地机制从经验中学习——数据永远不会离开你的机器:
**1. 程序记忆——来自经验的自定义命令**
当代理完成复杂工作流、克服错误或遵循用户纠正时,它可以通过 `config_manager add_command` 将该工作流保存为可重用的斜杠命令。下次会话时,命令会出现在自动补全中,代理知道它的存在。
**2. 情景记忆——经验教训**
代理在工作时将重要知识写入 `~/.opencrabs/` 大脑文件:
- `MEMORY.md` — 基础设施细节、故障排除模式、架构决策
- `USER.md` — 你的偏好、沟通风格、项目上下文
- `memory/YYYY-MM-DD.md` — 集成、修复和决策的每日日志
- 自定义文件(如 `DEPLOY.md`)——领域特定知识
**3. 跨会话召回——混合搜索**
`memory_search` 和 `session_search` 工具使用混合 FTS5 + 向量语义搜索(倒数排名融合)从过去的会话和记忆文件中找到相关上下文。通过 `embeddinggemma-300M` 的本地嵌入——无需 API 调用。
**与云端"自我改进"代理的关键区别:** 你的记忆文件、命令和大脑文件 100% 本地且属于你。使用本地模型(LM Studio、Ollama),一切都保留在你的机器上。使用云提供商(Anthropic、MiniMax、OpenRouter),对话会通过他们的 API——但这些提供商默认按其服务条款注重隐私,你可以在设置中选择退出日志记录和训练数据。无论哪种方式,你的自我改进数据(技能、记忆、命令)永远不会离开你的机器。
## ⏰ 定时任务和心跳
OpenCrabs 在你的机器上作为守护进程运行——一个始终在线的持久终端代理。这使得计划任务和后台任务变得原生且简单。
### 定时任务——计划隔离会话
定时任务在后台作为隔离会话运行。每个任务有自己的会话、提供商、模型和上下文——与你的主聊天完全独立。
```
# Add a cron job via CLI
opencrabs cron add \
--name "morning-briefing" \
--cron "0 9 * * *" \
--tz "America/New_York" \
--prompt "Check my email, calendar, and weather. Send a morning briefing." \
--deliver telegram:123456789
# List all jobs
opencrabs cron list
# Enable/disable
opencrabs cron enable morning-briefing
opencrabs cron disable morning-briefing
# Remove
opencrabs cron remove morning-briefing
```
代理还可以通过 `cron_manage` 工具从任何渠道自主创建、列出和管理定时任务:
| 选项 | 默认值 | 描述 |
|--------|---------|-------------|
| `--cron` | 必填 | 标准 cron 表达式(如 `"0 9 * * *"`) |
| `--tz` | `UTC` | 计划时区 |
| `--prompt` | 必填 | 要执行的指令 |
| `--provider` | `[cron]` 默认或当前 | 覆盖提供商(如 `anthropic`、`gemini`、`minimax`) |
| `--model` | `[cron]` 默认或当前 | 覆盖模型 |
| `--thinking` | `off` | 思考模式:`off`、`on`、`budget` |
| `--auto-approve` | `true` | 自动批准工具调用(隔离会话) |
| `--deliver` | 无 | 传递结果的渠道(如 `telegram:123456`、`discord:789`、`slack:C0123`) |
**提供商优先级:** 每任务 `--provider` > config.toml 中的 `[cron] default_provider` > 会话的活动提供商。为定时任务设置全局默认路由到更便宜的提供商,同时将交互会话保持在高级提供商:
```
[cron]
default_provider = "minimax"
default_model = "MiniMax-M2.7"
```
### 心跳——主动后台检查
作为守护进程运行时,OpenCrabs 可以执行定期心跳检查。在工作区配置 `HEARTBEAT.md`(`~/.opencrabs/HEARTBEAT.md`),包含要监控的事项清单:
```
# Heartbeat Checklist
- Check for urgent unread emails
- Check calendar for events in the next 2 hours
- If anything needs attention, message me on Telegram
- Otherwise, reply HEARTBEAT_OK
```
心跳提示每个回合都会加载到代理的大脑。当心跳触发时,代理读取 `HEARTBEAT.md` 并执行操作——检查邮件、日历、通知或你配置的任何内容。
### 心跳 vs 定时任务
| | 心跳 | 定时任务 |
|---|-----------|----------|
| **时机** | 周期性(每 N 分钟) | 精确计划(cron 表达式) |
| **会话** | 主会话(共享上下文) | 隔离会话(独立) |
| **上下文** | 有对话历史 | 每次运行都是全新上下文 |
| **用例** | 批量定期检查 | 独立计划任务 |
| **模型** | 当前会话模型 | 每个任务可配置 |
| **成本** | 每个周期单轮 | 每次运行完整会话 |
**经验法则:** 使用心跳进行受益于对话上下文的轻量级监控。使用定时任务进行需要精确时间、不同模型或隔离的独立任务。
### 开机自启动
要保持 OpenCrabs 始终运行,将其设置为随系统自动启动。
以下示例显示**默认配置文件**的手动设置。对于命名配置文件,在命令参数中将 `daemon` 替换为 `-p daemon`。
#### Linux(systemd)
```
mkdir -p ~/.config/systemd/user
cat > ~/.config/systemd/user/opencrabs.service << 'EOF'
[Unit]
Description=OpenCrabs AI Agent
After=network.target
[Service]
ExecStart=%h/.cargo/bin/opencrabs daemon
Restart=on-failure
RestartSec=5
Environment=OPENCRABS_HOME=%h/.opencrabs
[Install]
WantedBy=default.target
EOF
systemctl --user daemon-reload
systemctl --user enable opencrabs
systemctl --user start opencrabs
# Check status
systemctl --user status opencrabs
# View logs
journalctl --user -u opencrabs -f
```
#### macOS(launchd)
```
cat > ~/Library/LaunchAgents/com.opencrabs.agent.plist << 'EOF'
Label
com.opencrabs.agent
ProgramArguments
/usr/local/bin/opencrabs
daemon
RunAtLoad
KeepAlive
StandardOutPath
/tmp/opencrabs.log
StandardErrorPath
/tmp/opencrabs.err
EOF
launchctl load ~/Library/LaunchAgents/com.opencrabs.agent.plist
# Check status
launchctl list | grep opencrabs
# Stop and unload
launchctl unload ~/Library/LaunchAgents/com.opencrabs.agent.plist
```
#### Windows(任务计划程序)
1. 按 `Win + R`,输入 `taskschd.msc`,按 Enter
2. 点击右侧面板中的**创建基本任务**
3. 名称:`OpenCrabs`,描述:`OpenCrabs AI Agent`
4. 触发器:**当我登录时**
5. 操作:**启动程序**
6. 程序:`C:\Users\\.cargo\bin\opencrabs.exe`(或你的二进制文件所在位置)
7. 参数:`daemon`
8. 勾选**在完成前打开属性对话框**
9. 在属性 > 设置中,勾选**如果任务失败,每 1 分钟重启一次**
或通过 PowerShell:
```
$action = New-ScheduledTaskAction -Execute "$env:USERPROFILE\.cargo\bin\opencrabs.exe" -Argument "daemon"
$trigger = New-ScheduledTaskTrigger -AtLogon
$settings = New-ScheduledTaskSettingsSet -RestartCount 3 -RestartInterval (New-TimeSpan -Minutes 1)
Register-ScheduledTask -TaskName "OpenCrabs" -Action $action -Trigger $trigger -Settings $settings -Description "OpenCrabs AI Agent"
```
## 🏗️ 架构
```
Presentation Layer
↓
CLI (Clap) + TUI (Ratatui + Crossterm)
↓
Brain Layer (Dynamic system brain, user commands, config management, self-update)
↓
Application Layer
↓
Service Layer (Session, Message, Agent, Plan)
↓
Data Access Layer (SQLx + SQLite)
↓
Integration Layer (LLM Providers, LSP)
```
**关键技术:**
| 组件 | Crate |
|-----------|-------|
| 异步运行时 | Tokio |
| 终端 UI | Ratatui + Crossterm |
| CLI 解析 | Clap(derive) |
| 数据库 | SQLx(SQLite) |
| 序列化 | Serde + TOML |
| HTTP 客户端 | Reqwest |
| 语法高亮 | Syntect |
| Markdown | pulldown-cmark |
| LSP 客户端 | Tower-LSP |
| 提供商注册 | Crabrace |
| 记忆搜索 | qmd(FTS5 + 向量嵌入) |
| 错误处理 | anyhow + thiserror |
| 日志 | tracing + tracing-subscriber |
| 安全 | zeroize |
## 📁 项目结构
```
opencrabs/
├── src/
│ ├── main.rs # Entry point
│ ├── lib.rs # Library root (crate root — required by Rust)
│ ├── error/ # Error types (OpenCrabsError, ErrorCode)
│ ├── logging/ # Conditional logging system
│ ├── app/ # Application lifecycle
│ ├── brain/ # Intelligence layer — LLM providers, agent, tools, brain system
│ │ ├── agent/ # Agent service + context management
│ │ ├── provider/ # Provider implementations (Anthropic, GitHub Copilot, OpenAI-Compatible: OpenRouter, Minimax, z.ai GLM, Custom)
│ │ ├── tools/ # Tool system (read, write, bash, glob, grep, memory_search, etc.)
│ │ ├── tokenizer.rs # Token counting (tiktoken-based)
│ │ ├── prompt_builder.rs # BrainLoader — assembles system brain from workspace files
│ │ ├── commands.rs # CommandLoader — user-defined slash commands (TOML)
│ │ └── self_update.rs # SelfUpdater — build, test, hot-restart via exec()
│ ├── channels/ # Messaging integrations + voice (feature-gated)
│ │ ├── factory.rs # ChannelFactory — shared factory for channel agent services
│ │ ├── telegram/ # Telegram bot (agent, handler)
│ │ ├── whatsapp/ # WhatsApp Web client (agent, handler, store)
│ │ ├── discord/ # Discord bot (agent, handler)
│ │ ├── slack/ # Slack bot via Socket Mode (agent, handler)
│ │ ├── trello/ # Trello board poller (agent, client, handler, models)
│ │ └── voice/ # STT (Groq Whisper / whisper.cpp) + TTS (OpenAI / Piper)
│ ├── cli/ # Command-line interface (Clap)
│ ├── config/ # Configuration (config.toml + keys.toml)
│ ├── db/ # Database layer (SQLx + SQLite)
│ ├── services/ # Business logic (Session, Message, File, Plan)
│ ├── memory/ # Memory search (FTS5 + vector embeddings via qmd)
│ ├── tui/ # Terminal UI (Ratatui)
│ │ ├── onboarding.rs # 8-step onboarding wizard (state + logic)
│ │ ├── onboarding_render.rs # Wizard rendering
│ │ ├── splash.rs # Splash screen
│ │ ├── app.rs # App state + event handling
│ │ ├── render.rs # Main render dispatch
│ │ └── runner.rs # TUI event loop
│ ├── utils/ # Utilities (retry, etc.)
│ ├── migrations/ # SQLite migrations
│ ├── tests/ # 1,827 tests (see TESTING.md)
│ ├── benches/ # Criterion benchmarks
│ ├── assets/ # Icons, screenshots, visual assets
│ ├── scripts/ # Build and setup scripts
│ └── docs/ # Documentation templates
├── Cargo.toml
├── config.toml.example
├── keys.toml.example
└── LICENSE.md
```
## 🛠️ 开发
### 从源码构建
```
# Development build
cargo build
# Release build (optimized, LTO, stripped)
cargo build --release
# Small release build
cargo build --profile release-small
# Run tests (1,827 tests across 60+ modules)
cargo test --all-features
# See TESTING.md for full test coverage documentation
# Run benchmarks
cargo bench
# Format + lint
cargo fmt
cargo clippy -- -D warnings
```
### 功能标志
| 功能 | 描述 |
|-----------|-------------|
| `telegram` | Telegram 机器人集成(默认:启用) |
| `whatsapp` | WhatsApp Web 集成(默认:启用) |
| `discord` | Discord 机器人集成(默认:启用) |
| `slack` | Slack 机器人集成(默认:启用) |
| `trello` | Trello 看板轮询 + 卡片管理(默认:启用) |
| `local-stt` | 通过 rwhisper 的本地语音转文本(基于 candle,纯 Rust) |
| `local-tts` | 通过 Piper 的本地文本转语音(需要 python3) |
| `profiling` | 启用 pprof 火焰图分析(仅 Unix) |
### 性能
| 指标 | 值 |
|--------|-------|
| 二进制大小 | 34 MB(release,stripped,LTO) |
| 空闲 RAM(RSS) | 57 MB |
| 活跃 RAM(100 条消息) | ~20 MB |
| 启动时间 | < 50 ms |
| 数据库操作 | < 10 ms(会话),< 5 ms(消息) |
| 嵌入引擎 | embeddinggemma-300M(约 300 MB,本地 GGUF,自动下载) |
#### 记忆搜索(qmd — FTS5 + 向量嵌入)
混合语义搜索:FTS5 BM25 关键词匹配 + 768 维向量嵌入通过倒数排名融合。嵌入模型在本地运行——**无 API 密钥,零成本,离线工作**。
使用 release 构建通过 `cargo bench --bench memory` 基准测试:
| 操作 | 时间 | 备注 |
|--------|------|-------|
| 打开存储 | 1.81 ms | 冷启动(创建 DB + schema) |
| 索引文件 | 214 µs | 插入内容和文档 |
| 哈希跳过 | 19.5 µs | 已索引,未更改——快速路径 |
| FTS 搜索(10 文档) | 397 µs | 2 词 BM25 查询 |
| FTS 搜索(50 文档) | 2.57 ms | 典型用户语料库 |
| F 搜索(100 文档) | 9.22 ms | |
| FTS 搜索(500 文档) | 88.1 ms | 大语料库 |
| 向量搜索(10 文档) | 247 µs | 768 维余弦相似度 |
| 向量搜索(50 文档) | 1.02 ms | 768 维余弦相似度 |
| 向量搜索(100 文档) | 2.04 ms | 768 维余弦相似度 |
| 混合 RRF(50 文档) | 3.49 ms | FTS + 向量 → 倒数排名融合 |
| 插入嵌入 | 301 µs | 单个 768 维向量 |
| 批量重索引(50 文件) | 11.4 ms | 从冷启动,包括存储打开 |
| 停用文档 | 267 µs | 剪枝单个条目 |
**基准测试**(release 构建,内存 SQLite,criterion):
| 操作 | 时间 |
|---|---|
| 索引 50 文件(首次运行) | 11.4 ms |
| 每文件索引 | 214 µs |
| 哈希跳过(未更改文件) | 19.5 µs |
| FTS 搜索(10 文档) | 397 µs |
| FTS 搜索(50 文档) | 2.57 ms |
| FTS 搜索(100 文档) | 9.2 ms |
| 向量搜索(10 文档,768 维) | 247 µs |
| 向量搜索(50 文档,768 维) | 1.02 ms |
| 向量搜索(100 文档,768 维) | 2.04 ms |
| 混合 RRF(FTS + 向量,50 文档) | 3.49 ms |
| 插入嵌入 | 301 µs |
| 停用文档 | 267 µs |
## 🐛 平台说明
### Linux
```
# Debian/Ubuntu
sudo apt-get install build-essential pkg-config libssl-dev cmake
# Fedora/RHEL
sudo dnf install gcc gcc-c++ make pkg-config openssl-devel cmake
# Arch
sudo pacman -S base-devel pkg-config openssl cmake
```
#### 旧 CPU(Sandy Bridge / 仅 AVX)
默认 release 二进制需要 AVX2(Haswell 2013+)。如果你有仅支持 AVX 的旧 CPU(Sandy Bridge/Ivy Bridge,2011-2012),从源码构建:
```
RUSTFLAGS="-C target-cpu=native" cargo build --release
```
在[发布页面](https://github.com/adolfousier/opencrabs/releases)也提供了仅 AVX CPU 的预构建 `*-compat` 二进制。如果你的 CPU 完全没有 AVX(2011 年之前),向量嵌入被禁用,搜索降级到仅 FTS 关键词匹配。
### macOS
需要 **macOS 15(Sequoia)** 或更高版本。
```
# Install build dependencies
brew install cmake pkg-config
```
#### macOS 14(Sonoma)或更早版本的 Metal GPU 崩溃
运行 OpenCrabs 时如果看到此错误:
```
dyld: Symbol not found: _OBJC_CLASS_$_MTLResidencySetDescriptor
```
这是因为 `llama.cpp`(用于本地嵌入)编译时包含 Metal GPU 支持,并无条件链接需要 macOS 15+ 的 Metal 框架。目前无法通过 Rust `llama-cpp-sys-2` crate 在构建时禁用 Metal。
**修复:** 更新到 macOS 15(Sequoia)或更高版本。
### Windows
需要 CMake、NASM 和 Visual Studio Build Tools 来处理原生加密依赖:
```
# Option 1: Install build tools
# - CMake (add to PATH)
# - NASM (add to PATH)
# - Visual Studio Build Tools ("Desktop development with C++")
# Option 2: Use WSL2 (recommended)
sudo apt-get install build-essential pkg-config libssl-dev
```
详细故障排除请参阅 [BUILD_NOTES.md]( # Read a specific tweet
node dist/cli.js x tweet "Hello world" # Post a tweet
node dist/cli.js x reply "text" # Reply to tweet
node dist/cli.js x like # Like a tweet
node dist/cli.js x follow # Follow a user
```
**Instagram 命令:**
```
node dist/cli.js ig like
node dist/cli.js ig comment "text"
node dist/cli.js ig dm "message"
node dist/cli.js ig follow
node dist/cli.js ig followers -n 10
node dist/cli.js ig posts -n 3
```
**LinkedIn 命令:**
```
node dist/cli.js linkedin like
node dist/cli.js linkedin comment "text"
node dist/cli.js linkedin connect
node dist/cli.js linkedin search "query" -n 10
node dist/cli.js linkedin engage --query="query" # Full engagement session
```
**功能:** 人类行为(随机延迟、自然打字)、跨重启的会话持久化、内置速率限制、防检测、研究优先工作流(首先抓取目标,随着时间分散参与度)。
## ⚠️ 免责声明
### 开发状态
OpenCrabs 正在积极开发中。虽然功能正常,但可能包含错误或不完整的功能。
### 代币费用责任
**你有责任监控和管理自己的 API 使用量和费用。**
- 云提供商(Anthropic、OpenAI 等)的 API 费用由你负责
- 在你的提供商处设置计费提醒
- 考虑使用本地 LLM 以实现零成本运营
- 使用内置成本跟踪器监控支出
### 支持
云 API 问题、计费问题和账户问题应直接联系各自的提供商。OpenCrabs 提供工具;你管理你的 API 关系。
## 🤝 贡献
欢迎贡献!请阅读 [CONTRIBUTING.md](CONTRIBUTING.md) 了解指南。
```
# Setup
git clone https://github.com/adolfousier/opencrabs.git
cd opencrabs
cargo build
cargo test
# Make changes, then submit a PR
```
## 📄 许可证
**MIT 许可证**——详见 [LICENSE.md](LICENSE.md)。
## 🙏 致谢
- **[Claude Code](https://github.com/anthropics/claude-code)** — 灵感来源
- **[Crabrace](https://crates.io/crates/crabrace)** — 提供商注册
- **[Ratatui](https://ratatui.rs/)** — 终端 UI 框架
- **[Anthropic](https://anthropic.com/)** — Claude API
## 📞 支持
- **问题:** [GitHub Issues](https://github.com/adolfousier/opencrabs/issues)
- **讨论:** [GitHub Discussions](https://github.com/adolfousier/opencrabs/discussions)
- **文档:** [Documentation](https://github.com/adolfousier/opencrabs/tree/main/src/docs)
## Star 历史图表
[](https://www.star-history.com/#adolfousier/opencrabs)
## ✨ 敬请期待
**由 Rust 🦀 构建 by [Adolfo Usier](https://github.com/adolfousier)**
[最新发布](https://github.com/adolfousier/opencrabs/releases/tag/v0.2.81)
手动配置(无向导)
OAuth 令牌在入门期间自动保存。如果需要重新认证,运行 `/onboard:provider` 并选择 GitHub Copilot。 在 `config.toml` 中启用: ``` [providers.github] enabled = true default_model = "gpt-4o" base_url = "https://api.githubcopilot.com/chat/completions" ```标签:DLL 劫持, Docker, LLM, Ratatui, Rust, TUI, Unmanaged PE, 单二进制, 可视化界面, 大语言模型, 安全防御评估, 开源, 开源框架, 持续集成, 无服务器, 本地运行, 终端工具, 网络流量审计, 网络调试, 自主Agent, 自动化, 自我修复, 通知系统