返回博客

我为何构建 AIdaemon:一个可从手机控制的自托管 AI 代理

2026-02-179 min read

我使用 AI 代理进行编码已经有一段时间了。Claude CodeCodexCursorWindsurfOpen Code。它们改变了我编写软件的方式。但仅此而已。AI 仍然局限在编辑器内。

然后 OpenClaw 出现了。这是一个开源的 AI 代理,可以真正控制你的应用程序、发送消息、管理收件箱。不只是编码,而是你电脑上的一切。这让我开始思考 AI 代理还能做些什么。

但我想要一些不同的东西。我不需要一个控制 Spotify 或管理智能灯的代理。我需要一个驻留在我的服务器上、可以运行终端命令、部署代码并能记住我上周在做什么的代理。一个我可以在离开办公桌时从手机上发消息给它,让它在我的机器上完成真正的开发工作。

这就是我构建 AIdaemon 的原因。

什么是 AIdaemon?

AIdaemon 是一个自托管的 AI 代理,作为 后台守护进程 运行在你的机器上。你通过 Telegram、Slack 或 Discord 与它交谈,它可以执行终端命令、浏览网页、管理文件、运行计划任务,并在会话中记住事情。它是一个单一的 Rust 二进制文件。无需 Docker,无需 Node.js 依赖。只需将其复制到任何机器上即可运行。

把它想象成一个永久运行在你的服务器或笔记本电脑上的得力助手,你可以从任何地方给它发消息。

为什么不直接使用 OpenClaw?

我实际上是从 OpenClaw 开始的。这个想法很棒,但当我深入研究时,我不断遇到尚未实现的功能。我希望在命令运行前直接从手机批准命令。我希望实时看到 AI 正在采取的步骤,而不仅仅是最终结果。对于一个在你的机器上运行命令的工具来说,这些都是基本需求。

然后我遇到了一个 Bug,OpenClaw 与 Gemini 不兼容。我修复了它并提交了一个拉取请求(PR),但 PR 队列非常庞大。我知道我的修复可能需要几天甚至更长时间才能进入主分支。就在那时我明白了。如果我需要不断修补别人的项目才能得到我想要的东西,也许我应该自己构建一个,并将其作为学习经验,以了解个人 AI 代理需要如何架构、它们的边缘情况、限制以及介于两者之间的一切。

除此之外,OpenClaw 在我的其中一台 Mac 上明显很慢。对于一个应该作为后台守护进程运行的工具来说,性能很重要。这让我想要一个更轻量的东西。

但最大的差距在于内存。OpenClaw 还没有这个功能。每次对话都是从头开始。没有昨天的上下文,没有关于你在做什么项目的记忆,也没有从过去的错误中学习。我无法接受这一点。

所以问题从“我如何让 OpenClaw 为我工作”转变为“我理想中的 AI 守护进程会是什么样子?”我不断遇到同样的挫败感。我不在电脑旁,需要检查一些事情、重启服务或运行一个快速命令。虽然从手机上 SSH 可以在紧急情况下使用,但对于任何超过 ls 的操作来说都很痛苦。

如果我能只发送一条 Telegram 消息,比如“检查 nginx 服务是否在运行”,然后得到答复呢?或者“将最新更改部署到暂存环境”呢?这就是受 OpenClaw 启发的最初想法。

内存是我首先设计的东西

从第一天起,我就知道 AIdaemon 必须记住事情。不仅仅是聊天记录,而是实际的知识。我处理哪些项目。我偏爱哪些工具。我以前遇到过哪些错误以及我是如何修复它们的。

每六个小时,一个后台进程会审查最近的对话并提取持久性事实。比如“David 使用 Cloudflare 进行部署”或“暂存服务器运行在端口 3002 上”。当新信息出现时,旧的事实会被取代,从而保持知识的最新性。

它还会从错误中学习。当 AIdaemon 遇到错误并成功解决后,它会存储模式和修复方法。下次出现类似错误时,它已经知道该怎么做了。

工作流程也会被学习。如果我以相同的方式构建、测试和部署 Rust 应用多次,AIdaemon 就会注意到这个模式。在足够多的成功运行后,该过程会自动提升为可重用的技能。无需手动设置。

所有这些都由向量嵌入(vector embeddings)支持,用于语义召回,并根据新鲜度和有用性加权。30 天未被调用的事实会逐渐衰减。内存保持相关性,无需手动清理。

内存也具有隐私感知能力。事实会根据可见性级别进行标记,因此在私人 DM 中共享的信息永远不会泄露到团队频道中。

工作原理

架构很简单。AIdaemon 作为系统服务启动(macOS 上的 launchd,Linux 上的 systemd),并连接到你的消息通道。收到消息后,它会经过一个代理循环。

  1. 意图分类 - 一个快速的模型来确定你的需求。是快速回答、要执行的任务,还是需要设置的自动化。
  2. 工具选择 - 代理根据你的请求从 40 多个内置工具中进行选择
  3. 安全执行 - 命令在运行前会经过风险评估和批准流程
  4. 内存更新 - 重要上下文会被存储以供将来对话使用

工具

AIdaemon 开箱即用,提供了 40 多种工具。

  • 终端 - 执行 shell 命令,具有基于允许列表的安全性和内联批准(仅允许一次 / 始终允许 / 拒绝)
  • 文件操作 - 读取、写入、编辑和搜索文件
  • Git - 提交、分支、检查状态
  • 网页浏览 - 用于需要 JavaScript 渲染的页面的无头 Chrome
  • HTTP 请求 - 完整的头部控制、身份验证配置文件、OAuth 支持
  • MCP 集成 - 连接外部 MCP 服务器以扩展功能
  • CLI 代理 - 将工作委托给 Claude Code、Gemini CLI、Codex 或 Aider
  • 调度 - 具有自然语言时间解析的类 Cron 任务自动化
  • 内存管理 - 在不同通道之间查询、更新和共享知识

你还可以在运行时添加通道。需要在现有 Telegram 通道旁边连接一个 Discord 机器人?只需使用 /connect 命令即可。无需重启。

智能模型路由

并非所有消息都需要最昂贵的模型。AIdaemon 将请求分为三个级别。

  • 快速 - 简单问题、快速查找(最便宜的模型)
  • 主要 - 标准任务、大多数交互(默认模型)
  • 智能 - 复杂的推理、多步骤任务(功能最强的模型)

它开箱即用地支持多个 LLM 提供商。OpenAI 兼容的 API(包括 OpenRouter)、Google GeminiAnthropic ClaudeOllama,以及任何你想运行的本地模型。你可以在不重新构建的情况下在运行时更换提供商。

安全第一

授予 AI 代理终端访问权限是一件需要正确处理的事情。AIdaemon 采取谨慎的方法。

  • 基于允许列表的执行 - 只有预先批准的命令前缀才能在不询问的情况下运行
  • 内联批准流程 - 对于不在允许列表中的任何内容,你会在聊天中收到“仅允许一次 / 始终允许 / 拒绝”的提示
  • 风险评估 - 命令会根据破坏性潜力、路径敏感性和复杂性进行评分
  • SSRF 防护 - HTTP 工具会阻止对内部 IP 的请求
  • 加密状态 - 使用 SQLCipher 进行数据库加密,密钥存储在你的操作系统钥匙串中
  • 停滞检测 - 如果代理重复相同的工具调用三次或陷入交替模式,它会自行停止

入门

尝试它的最快方法。

# 通过 Homebrew 安装
brew tap davo20019/tap
brew install aidaemon

# 或从 crates.io 安装
cargo install aidaemon

# 或直接下载二进制文件
curl -sSfL https://get.aidaemon.ai | bash

然后创建一个 config.toml 文件,其中包含你的 LLM 提供商和 Telegram 机器人令牌,然后启动守护进程。

# 安装为系统服务
aidaemon install-service

# 或在前台运行
aidaemon

就是这样。向你的 Telegram 机器人发送消息,你就开始与你的机器对话了。请查看完整文档了解配置选项和高级功能。

为什么选择 Rust?

在此项目之前,我从未写过一行 Rust 代码。在体验了 OpenClaw 在我的 Mac 上运行缓慢之后,我想要一些快速的东西。我还想看看我是否可以通过依赖 AI 编码工具来处理繁重的工作,从而用一种不熟悉的语言构建一个生产级的系统。Claude Code、Codex 和 Antigravity 处理了样板代码和所有权检查器的斗争。我专注于架构和设计。

结果是一个单一的二进制文件,我可以将其复制到树莓派或每月 5 美元的 VPS 上,它就能正常工作。没有 Docker,没有 Node.js,没有运行时依赖。对于一个应该 24/7 运行的守护进程来说,Rust 的编译时安全性和低内存占用量被证明是正确的选择。

下一步

AIdaemon 目前是 0.9.2 版本,我仍在不断添加新功能。最近的添加包括一个两阶段顾问系统,用于更智能的意图分类、LLM 输出的结构化 JSON 模式强制执行,以及带有令牌预算的目标跟踪。

该项目在 GitHub 上开源,并发布在 crates.io 上。如果你有兴趣拥有一个完全由你控制的个人 AI 代理,请试用一下并告诉我你的想法。

保持更新

将最新文章和见解发送到您的收件箱。

Unsubscribe anytime. No spam, ever.