18. 密钥
**密钥(secret)**是智能体或某个 adapter 需要、但你不希望以明文留在配置文件里的凭证。GitHub token、Slack bot token、模型 provider API key、内部 API 凭证 —— 都是密钥。OpenHermit 把它们存在独立存储中,运行时再代入配置。
18.1 什么放在哪儿
| 凭证 | 谁在用 | 怎么存 |
|---|---|---|
| Anthropic / OpenAI 等 API key | 模型调用 | 网关级密钥 |
| Telegram / Discord / Slack bot token | 通道 adapter | 按智能体或网关级密钥 |
| MCP 用的 GitHub / Slack 等 token | MCP 服务 | 按智能体密钥 |
| 内部 API key | 自定义 MCP 服务 | 按智能体密钥 |
模式是:绝不把凭证粘到智能体的指令或消息里。放进密钥存储,然后引用它。
18.2 hermit config --agent ... secrets 命令
# 列出密钥名(不显示值)。
hermit config --agent main secrets list
# 设一个密钥。
hermit config --agent main secrets set GITHUB_TOKEN <value>
# 设一个要透传到 MCP / 通道 adapter env 的密钥。
hermit config --agent main secrets set GITHUB_TOKEN <value> --pass-through
# 设一个**不**希望暴露给子进程 env 的密钥。
hermit config --agent main secrets set INTERNAL_KEY <value> --no-pass-through
# 删除。
hermit config --agent main secrets remove GITHUB_TOKEN
网关级密钥(跨所有智能体共享)通常以环境变量放在网关宿主机上,不在 hermit config --agent ... secrets 里。这是运维侧的事。
18.3 密钥怎么被代入
配置里用 ${{NAME}} 按名引用密钥:
mcp_servers:
github:
env:
GITHUB_TOKEN: ${{GITHUB_TOKEN}}
启动时,网关把真实值代入。智能体的 prompt 永远见不到原始密钥 —— 它只看到使用这些密钥的工具。
18.4 透传(Pass-Through)
很多密钥要传到子进程(MCP 服务的环境、通道 adapter 的运行时)。--pass-through(默认)代表要;--no-pass-through 代表密钥只留在网关内,只能由配置代入读取。对绝不该泄漏到子进程 env 表的凭证,用严格模式。
18.5 Web 管理界面
Manage → Secrets 显示密钥名(值隐藏),并允许设置 / 删除。底层存储与 CLI 一致。
18.6 角色差异
| Owner | User | Guest | |
|---|---|---|---|
| 读密钥名 | ✓ | — | — |
| 读密钥值 | ✓(只通过直接访问网关) | — | — |
| 设置 / 删除 | ✓ | — | — |
即使是 owner,设置之后也无法在 UI 中再看到密钥值 —— 只能写。要轮换,直接用新值重设。
18.7 How-to 配方
18.7.1 轮换 GitHub token
hermit config --agent main secrets set GITHUB_TOKEN <new-token>
hermit mcp disable mcp_github --agent main
hermit mcp enable mcp_github --agent main
disable/enable 一轮重启 MCP 服务,让它拿到新值。有些 adapter 支持热更新 —— 看你那个 MCP 服务的具体行为。
验证 —— 让智能体做一个需要新权限的 GitHub 动作。
18.7.2 把指令里的凭证迁到密钥
你发现某个旧的 instructions 分区里有明文 API key。处理:
hermit config --agent main secrets set MY_API_KEY <value>
hermit instructions get tools --agent main # 复制正文
# 本地编辑 —— 把明文 key 换成 ${{MY_API_KEY}}
hermit instructions set tools --file ./tools.md --agent main
验证 —— hermit instructions get tools 显示占位符,不是真值。
18.7.3 审计一个智能体上有哪些密钥
hermit config --agent main secrets list
如果看到不再对应任何已启用 MCP 或通道的名字,删掉。
18.8 FAQ
密钥实际存在哪里? 网关的数据库里,落盘加密(用网关的 key)。这份数据库的备份属于运维范畴 —— 确保备份也是加密的。
智能体能看到原始密钥值吗? 不能。智能体收到的是代入之后的配置(在相关 env / 工具定义里)。它的 prompt 上下文里永远没有值。
密钥能进版本控制吗? 不能。把密钥值当作易失的。版本控制密钥的名字和引用形式;值只属于密钥存储。
有按用户的密钥吗? 不支持。密钥按智能体划分。要按用户隔离凭证,一人一智能体。
18.9 指引
- MCP 凭证设置 → 第 9 章 · MCP 服务。
- 通道 token → 第 17 章 · 通道。
- 模型 provider 凭证 → 第 16 章 · 模型。