← 全部文章

欢迎来到 Agent! 博客:一个应用,任意 AI,全面掌控你的 Mac

AgentiLoop Agent! 是什么、我为什么这样打造它,以及你能在这里读到什么——一切都直接来自源代码。

一台小小的 Mac 递给你一张地图 一台面带微笑的 Mac 站在桌上,手里拿着一张展开的地图。地图上有四个站点,由一条虚线小路连接:任意 AI、循环、AgentScript 和安全。 任意 AI 循环 AgentScript 安全 你的地图 Mac 版 Agent!
每个博客都需要第一篇文章。这一篇,就是地图。

你好,我是 Todd。我在开发 AgentiLoop Agent!,一款原生 macOS AI 智能体,而这里就是它的博客。

我一直想要一个地方,来聊聊 Agent! 里那些塞不进 README 或发布说明的部分:某条安全护栏为什么长成这个样子;智能体循环为什么要检查自己的工作;某个候选版本里出了什么问题,我们又是怎么修好的。你在这里读到的大部分内容都直接来自代码库,因为那是我最熟悉的东西。时不时地,我也会把目光投向更广阔的 AI 智能体世界,聊聊它对你的 Mac 意味着什么。

如果你是第一次来,就从这里开始吧。把这篇文章当作一张地图。

Agent! 是什么

Agent! 是 100% 原生的 Swift 和 SwiftUI 应用。你输入(或说出)想做的事,它就会直接在你的 Mac 上把活干完,而不只是告诉你该怎么做:

  • 它真的会写代码。 它会读取你的项目,用字符串替换式的 diff 编辑文件,在 Xcode 中构建,读取报错并修复,最后用 git 提交。
  • 它能驱动任意 Mac 应用。 靠的是辅助功能(Accessibility)API,外加 AppleScript、JXA 和 51 个 ScriptingBridge 应用桥接。
  • 它能以你的身份或 root 身份运行 shell 命令。 这通过一个 Launch Agent 和一个 Launch Daemon 实现,二者用 SMAppService 注册,经由 XPC 访问。
  • 它支持 23 家 LLM 提供商,外加设备端的 Apple Intelligence:Claude、Codex、OpenAI、Gemini、Grok、Mistral、DeepSeek、Qwen、Z.ai、OpenRouter、Ollama、vLLM、LM Studio 等等。
  • 它会倾听。 说一声 "Agent!" 再接上任务,或者在 iPhone 上通过 iMessage 给它发消息(仅限已批准的发送者)。

README 用一句话就概括了它:Siri 负责回答,Agent! 负责行动。

没有 NPM,没有 Electron

这一点总让人意外。没有 Electron 外壳,没有 Node 运行时,也没有 node_modules 文件夹悄悄吃掉你的磁盘。Agent! 依赖的每一个 Swift 包都是我亲手写的,而且各自放在 AgentiLoop 组织下的独立仓库里:

包职责
AgentTools工具 schema、系统提示词和提供商管理
AgentLLMLLM 提供商协议、类型和注册表
AgentMCPMCP 客户端(stdio 和 HTTP)
AgentAccess辅助功能自动化
AgentEventBridges面向 50 多款 Mac 应用的 ScriptingBridge 协议
AgentD1F多行 diff 引擎
AgentSwift基于 SwiftSyntax 的代码分析
AgentColorSyntax · AgentTerminalNeo语法高亮 · 复古终端风格 Markdown
AgentAuditos.log 审计日志

最终你得到的是一款内存占用极低的应用,却开箱即用地带着 Xcode 自动化、Swift 语法分析、辅助功能、AppleScript、Safari 自动化和 MCP。

核心:循环

Agent! 的一切都围绕一个理念:一个 自我验证的任务循环。模型思考、调用工具、查看真实结果,然后自我纠正。但这只有在你能信任它的前提下才行得通,所以我把几条规则直接写进了里面:

  • 工具调用无法伪造。 每次调用都经过同一个调度器,并返回真实输出。如果模型没真正调用工具就说 "我点过了",Agent! 会当场指出来,并发送一条纠正信息。
  • "完成"要拿出证据。 任务只有在 goal_state 标准都附上证据(比如构建通过或测试通过)逐一勾选后,才能宣布完成。
  • 先读再改。 如果模型还没读过某个文件,或者文件在读取之后已在磁盘上发生变化(用 SHA-256 校验),Agent! 会拒绝编辑。拒绝时会把最新的文件交给模型,这样下一次尝试就能用上正确的行。
  • 一切都能撤销。 每次编辑都会保留一周的快照。你可以回滚单个文件,也可以用 rewind_task 把整个任务倒带重来。

之后的文章里,我会把这些机制一个个拆开来讲。

AgentScript:拥有完整权限的 Swift

AgentScript 是我最喜欢的部分之一。脚本就是普通的 Swift 文件。Agent! 用 SwiftPM 把每个脚本编译成 .dylib,再通过 dlopen 在进程内加载,所以你的脚本能拿到 Agent! 已有的全部 macOS 权限:辅助功能、自动化、日历、通讯录、邮件、照片等等。你只需要一个入口点:

import Foundation
import CalendarBridge   // any `import XBridge` auto-wires, no Package.swift edits

@_cdecl("script_main")
public func scriptMain() -> Int32 {
    print("Hello from AgentScript! 👋")
    return 0
}

脚本打印的任何内容都会回传给模型,返回值则作为退出状态。应用自带大约 35 个示例,包括 TodayEvents、NowPlaying、CheckMail 和 CreateDmg。

看得见的安全

Agent! 可以以 root 身份运行命令。这需要你给予相当大的信任,所以安全不能只是演示文稿里的一页幻灯片。它是代码,你可以在 GitHub 上亲自阅读。硬编码的 ShellSafetyService 会在命令发出之前就拒绝灾难性命令,特权守护进程也会在自己这一端再做一遍同样的检查。另外还有一个可选的"第二意见",名叫 Jev,它会评估一条命令销毁数据的可能性有多大。第一篇深度剖析 会详细讲清楚它是怎么工作的。

家族不断壮大

同样的智能体循环现在也能在终端里运行了,支持 macOS、Windows 和 Linux。有两个功能相同的 CLI:用 Rust 写的 AgentiLoopCLI 和用 Go 写的 AgentiLoopGo。README 里我最喜欢的一个趣闻是:这两个小兄弟,正是 Mac 版 Agent! 自己写出来的。

你将在这里读到什么

  • 内部机制: 智能体循环、上下文压缩、工具调度、子智能体、记忆与计划。
  • 安全: 安全护栏、XPC 信任模型,以及近期的智能体事故能给我们其他人带来什么教训。
  • 讲清原因的发布说明: 每个版本改了什么,以及让这些改动变得必要的那个 bug。
  • 实用指南: AgentScript 实用配方、预算有限时如何挑选提供商、如何完全本地运行。
  • 更广阔的智能体世界: 新闻与评测,并且始终落脚到它对你的 Mac 意味着什么。

Agent! 支持 macOS 14.6 及更高版本,可在 Apple Silicon 和 Intel 上运行,个人使用免费。在下方下载吧,给它找点真正的活儿干,然后告诉我用得怎么样。