Magent: 让 Emacs 成为 LLM Coding Agent 的 Runtime(Emacs-Native LLM Coding Agent)

对于长期使用 Emacs 的人来说,编辑器里已经存在很多有价值的活状态:尚未保存的 buffer、major mode、point 和 region、project、Magit、Org、xref、LSP、process buffer……如果 agent 只能看到磁盘文件,它其实丢掉了 Emacs 工作流里相当重要的一部分上下文

基于这个想法写了 Magent,一个使用 Emacs Lisp 实现的、Emacs-native 的 LLM coding agent

项目目前已经可以用于一些简单的项目开发(复杂任务未经过长期测试),欢迎大家一起参与讨论

文档在这里:https://jamie-cui.github.io/magent/zh/index.html

Quick Start

;; 前置条件:配置好 gptel 的默认模型
(setq gptel-model 'claude-sonnet-4-20250514)
(setq gptel-api-key "sk-ant-...")  ; or use ANTHROPIC_API_KEY env var

;; 配置 magent,会直接使用已配置好的 gptel 默认模型
(use-package magent
  :vc (:url "https://github.com/Jamie-Cui/magent" :rev "master")
  :ensure t
  :after (agent-shell gptel)
  :demand t
  :config
  ;; 可选: append an additional personal skill directory.  Later entries
  ;; have higher precedence and become the skill manager's install target.
  (add-to-list 'magent-skill-directories
               (expand-file-name "skills" user-emacs-directory)
               t)
  (magent-agent-shell-ensure-config))

之后 M-x agent-shell 就会有 Magent 可以选择了

See gptel documentation for full provider setup (Anthropic, OpenAI, Ollama, etc.).

Magent 是啥?

Magent 更接近“gptel + stateful agent runtime”,而不是 gptel 的替代品,也不是外部 CLI agent 的简单包装。

各部分的职责是:

Magent 架构的好处是:已经配置好的 gptel provider 可以直接复用,同时 agent 又能真正进入 Emacs 的运行时环境

为什么还要在 Emacs 里实现 Agent Runtime?

先说明一点:Magent 并不独占访问 Emacs 状态的能力。

给 Claude Code、Codex 或其他外部 agent 接入一个 emacs_eval skill、MCP server 或类似桥接层,同样可以让它查看 buffer、major mode … 单从最终能完成的任务来看,两种方案没太大区别

Magent 选择的区别在于 runtime 边界

方案 Agent Runtime Emacs 的角色 Provider Transport
外部 Agent + Emacs Bridge 运行在外部进程中 UI 和工具 Endpoint 由外部 Agent 负责
Magent Agent Runtime 和工作流状态保留在 Emacs 中 Runtime、UI 和工具执行环境 交给 gptel

Magent 通过 gptel-request 调用模型,但以下部分都在 Emacs Lisp 中运行:

  • agent loop 和工具调用;
  • permission、approval 和 audit;
  • project-scoped session;
  • turn、tool call、取消和失败状态;
  • skills、capabilities 和 custom agents;

Magent 想探索的不是“怎样让外部 agent 多一个 Emacs 工具”,而是另一个问题:

如果把 Emacs 本身当作 agent runtime,而不只是 agent 的客户端,会形成怎样的工作流?

目前有哪些功能

1. Coding Agent 工具链

目前内置了 15 个工具,包括:

  • 文件读取、创建和精确编辑;
  • grep、glob 和 shell;
  • emacs_eval;
  • websearch;
  • Org 格式的 repository summary;
  • skill 调用;
  • child-agent 的创建、通信、等待、查看和关闭

2. 项目级 Session

Magent 的 session 默认按 project 隔离

在一个 Git 项目中打开 Magent,后续对话、agent 选择、skills 和 child-agent jobs 都属于这个项目。退出或重启 Emacs 后,可以从持久化的 session 中恢复

3. 权限与审计

不同 agent 可以有不同的工具权限:

  • allow:直接允许;
  • deny:拒绝;
  • ask:执行前询问;
  • 文件操作还可以按 glob pattern 设置规则

4. Skills 和 Slash Commands

Magent 的 skill 是文件化的,可以来自:

  • 包内置的 skills/;
  • 用户目录;
  • 项目本地 .magent/skills/

当前内置的 agent-shell slash commands 包括:

/explain
/fix
/init
/review
/summarize
/test
/compact
/clear

FYI 这些 commands 和 emacs 工作流相关,目前还没太想好后面应该怎么做,所以请 expect breaking change

12 个赞

感觉这个说法有点矛盾:

  • 0.1.0 在我看来是处于初级开发阶段,相当于软件的 alpha 阶段,功能严重不足,仅限高级用户尝鲜
  • 可用于实际开发,基本上已经处于 beta 后期了,接近或者已经 RC

所以,要么版本号提升到让人信服的程度,或者这只是早期开发的阶段

:rofl: 好的,那我改下表述

只要是和AI相关的文章,我总是自动点赞.

1 个赞

活状态 第一次听到这个概念,涨见识了

1 个赞

哈哈哈哈哈 胡编乱造的

child agent 和 subagent 有什么区别?

这两个是正交的关系

  • child agent(子代理):强调运行时的 父子关系
  • subagent:强调 agent 定义中的 使用模式(和 primary agent 是并列的,表示该 agent 只能作为内部子代理被其他 agent 拉起来)

基本上运行中的 subagent 实例都是 child agent,但是 child agents 不一定都是 subagent

顶一下,如果想要使用的话,可以直接这么用

;; 前置条件:配置好 gptel 的默认模型
(setq gptel-model 'claude-sonnet-4-20250514)
(setq gptel-api-key "sk-ant-...")  ; or use ANTHROPIC_API_KEY env var

;; 配置 magent,会直接使用已配置好的 gptel 默认模型
(use-package magent
  :vc (:url "https://github.com/Jamie-Cui/magent" :rev "master")
  :ensure t
  :after (agent-shell gptel)
  :demand t
  :config
  ;; 可选: append an additional personal skill directory.  Later entries
  ;; have higher precedence and become the skill manager's install target.
  (add-to-list 'magent-skill-directories
               (expand-file-name "skills" user-emacs-directory)
               t)
  (magent-agent-shell-ensure-config))

之后 M-x agent-shell 就会有 Magent 可以选择了

是不是意味着这个 agent 是以 buffer 而非 fs 为基础的,基本的 tool 都是读写 buffer 和操作 eshell 的?

1 个赞

很遗憾,目前还不是。Magent 现在的核心文件工具仍然主要基于 filesystem,只是在此基础上扩展了一些 Emacs-native tools,不过,这确实是 Magent 未来计划推进的方向

1 个赞

嗯,刚在另一个thread 里回复,我想搞一个基于 emacs/elisp 基础设施的 agent ,学习 pi 的哲学,先不做高级功能,就是 4-5 个基础 tool ,以 buffer 和 eshell 为基础。不过在 emacs 里 tool 可以随时创建随时生效,应该潜力很高

1 个赞

hhh 可以用 magent 实验来试一试,现在是可以跑比对的 SWE-bench 了,我之前跑了一个小批的 benchmark,和 opencode 比对,使用 deepseek-v4-flash,会在某些问题上比 opencode 强一点,但是 token 花费要多大概 50% 左右,我现在正在想办法优化一下这一点

1 个赞

不过认真的讲,我现在更倾向于 magent 做这样一件事情:

背景:目前很多 coding agent 的 Skill 机制,本质上是通过 Markdown 向模型提供可复用的指令和资源。一些 Skill 还会附带脚本,Skill 是否激活,如何解释,是否调用工具,通常仍由模型决定,执行路径具有概率性

我更倾向于 workflow-first 的设计:由用户或受信任扩展使用 Elisp 定义确定性的控制流,把顺序、分支、校验和副作用交给程序。只在确实需要语义理解或生成能力的少数节点调用 Agent,并为每个节点限制输入、输出和工具范围。这样不是消灭 harness,而是把 Agent 从工作流的控制者变成工作流中的一个受约束组件。(本段话经过 llm 润色 hhh)FYI, 现在的 magent-action 就是在做这个尝试

我理解一下,这是不是算是把 skill 变成 elisp 写的 tool 了?

是的

我去年年初就想把emigo写成这样,后面放弃了,一是那时候的模型写elisp还是容易有括号问题,其次最重要的就是,我觉得这玩意本质是agent时代的无马马车(不好意思,Emacs)

2 个赞

其实我感觉是习惯问题,习惯用 emacs 了所以就希望 agent 和我已有的工作流耦合hhh

我倒是觉得 coding agent 并不是那么有必要,只要有足够强的大模型都不需要打开 Emacs 了。

但是我还是在用 Emacs,主要是因为我所有其他的 Workflow 都和 Emacs 深度嵌套了。 如果有一个像 Hermes 那样 agent 能和 org-mode 互动就最好了。

2 个赞