在 Emacs 中使用 org.freedesktop.Secrets 存取 API Key

大部分 AI 相关的 Emacs 包都推荐用 auth-source 来存取用到 API Key。不过除了 auth-source 外,Emacs 还内置了一个 secrets 包,可以和 org.freedesktop.Secrets 通信来管理 secret。

在 Linux 桌面环境上用得比较多的 Secrets API 实现应该是 KDE Wallet 和 GNOME Keyring,但我一直都没搞懂 KDE Wallet 是怎么工作的,所以我用的是 KeePassXC 的实现:

落实在 Emacs 中就是用 secrets-create-item 创建新的 API key 和用 secrets-get-secret 获取已经保存的 API key。

这里是一个给 gptel 接 API key 的例子:

(setq gptel-backend
			(gptel-make-openai "OpenRouter"
				:host "openrouter.ai"
				:endpoint "/api/v1/chat/completions"
				:stream t
				:key (lambda ()
							 (secrets-get-secret "Main" "emacs-openrouter-api-key"))
				:models '(google/gemini-2.5-pro-preview)))

至于具体怎么使用 KeePassXC 作为 Emacs 的钥匙圈,有兴趣的话可以看一下我博客上一篇文章

6 个赞

把 key 放到环境变量,Linux 一个 grep /proc/*/environ 就全出来了。

你应该是指 Aidermacs 设参数传 API key 的方式?Aider 似乎也可以用命令行参数的形式传进去,但感觉都是权宜之策,我打算给 Aider 提个 PR 什么的,但等做出来合并之前好像也只能这样凑合 :melting_face:

命令行参数更不靠谱,ps一下就全出来了

刚看了一下 Aider 的代码,似乎从命令行进去也只是 parse 完再设环境变量,估计是上游的 litellm 要用到这个环境变量来设 API key:

https://github.com/Aider-AI/aider/blob/836aaece4f251e522dc4b32629cdad1a3ee97eb1/aider/main.py#L600

感觉现在的方法都不怎么靠谱 :sweat_smile: