Hermes Agent 自进化架构深度解析(七):开放透明设计——从配置到 API 请求的全链路
当你对一个 AI 系统说"我不信"的时候,它怎么证明自己?Hermes 的回答是:看代码。源码就在你的硬盘上,配置只有几十行 YAML,API 请求的每一步都有文件可查。
一、信任来自可验证性
AI 产品建立信任的方式通常有两种。
第一种:承诺。"我们不会滥用你的数据""我们的模型是安全的""我们的系统是最先进的"。你需要相信。
第二种:可验证。"这是源码""这是配置文件""这是发给 API 的请求格式"。你不需要相信——你可以自己看。
Hermes 选择了第二种。不是因为它更道德——是因为自进化系统必须透明。如果一个系统会在用户不看的时候自己修改记忆、修复技能、归档文件——用户必须能验证它在做什么、为什么这样做。
二、源码就在硬盘上
Hermes 的安装目录在用户的 Python 虚拟环境中:
.venv\Lib\site-packages\ ├── tools/ ← 88 个工具实现文件 │ ├── memory_tool.py ← 记忆系统(1146 行) │ ├── skill_usage.py ← 技能生命周期管理(947 行) │ ├── skill_manager_tool.py ← 技能创建/编辑/删除(1542 行) │ ├── skills_tool.py ← 技能加载(1662 行) │ ├── skill_provenance.py ← 来源追溯(78 行) │ ├── session_search_tool.py ← 会话检索(921 行) │ └── ... ├── agent/ ← Agent 主循环 │ ├── system_prompt.py ← 系统提示词组装(536 行) │ ├── chat_completion_helpers.py ← API 请求构建(2964 行) │ ├── model_metadata.py ← 模型上下文解析(2313 行) │ └── transports/ ← Transport 层 │ ├── chat_completions.py ← OpenAI 兼容 transport(737 行) │ ├── anthropic.py │ └── codex.py ├── plugins/ ← 30 个 Provider Profile │ └── model-providers/ │ ├── deepseek/ ← DeepSeek profile(100 行) │ ├── openrouter/ │ ├── anthropic/ │ └── ... ├── providers/ ← Provider 注册中心 ├── hermes_cli/ ← CLI 界面 └── run_agent.py ← 主循环入口
没有混淆,没有加密,没有二进制 blob(除了一个 PyInstaller 打包的入口 exe)。所有业务逻辑都是纯 Python 源码。
这不是"开源"——开源是去 GitHub 下载。这是本地可检视——正在运行的 AI 的每一条逻辑就在用户的硬盘上。
三、配置文件:不改就能用
Hermes 的最小可用配置只需指定模型和 provider:
model: deepseek-v4-pro providers: deepseek: base_url: https://api.deepseek.com
不需要配 API key 的位置——每个 provider profile 知道自己的环境变量名(DEEPSEEK_API_KEY)。不需要配模型上下文长度——model_metadata.py 通过 10 级优先级链自动检测。不需要配工具集——默认 hermes-cli 全开。
用户可以配 50+ 个选项,但不需要。
可配置但非必需的包括:
agent: max_turns: 90 # 单次对话最大工具调用轮数 verify_on_stop: false # 停止时是否验证任务完成 memory: memory_char_limit: 2200 # MEMORY.md 最大字符数 user_char_limit: 1375 # USER.md 最大字符数 compression: enabled: true # 上下文自动压缩 browser: cdp_url: http://localhost:9222 # Chrome DevTools Protocol 地址 display: tool_progress: all # 终端显示工具调用进度 curator: stale_after_days: 30 # 未使用多少天后标记 stale archive_after_days: 90 # 未使用多少天后归档 prune_builtins: false # 是否也管理内置技能 plugins: enabled: [] # 额外加载的插件
每一个选项都有合理的默认值。Hermes 的设计原则是:用户不需要配置任何没有主动想改的东西。
四、Provider Profile:每个 API 的 quirks 被隔离
不同 AI 提供商的 API 有不同的 quirks。DeepSeek V4 需要显式传 extra_body.thinking 来控制思考模式。某系模型不支持 temperature 参数。OpenRouter 需要 provider preferences。Gemini 需要 thinkingConfig。
如果这些 quirks 散落在请求构建代码的各处,维护就是噩梦。
Hermes 的解决方案是 Provider Profile。每个 provider 有一个独立的 profile 文件。
plugins/model-providers/deepseek/__init__.py(100 行)完整示例:
class DeepSeekProfile(ProviderProfile):
def build_api_kwargs_extras(self, *, reasoning_config, model, **ctx):
extra_body = {}
top_level = {}
if not _model_supports_thinking(model):
return extra_body, top_level # V3 / unknown → 不干预
# V4+ → 必须显式设置 thinking,否则 HTTP 400
extra_body["thinking"] = {"type": "enabled"}
# 传递 reasoning effort
top_level["reasoning_effort"] = "max"
return extra_body, top_level
当前台 Agent 构建 API 请求时,chat_completion_helpers.py 查找当前 provider 的 profile(第 777-812 行):
_profile = get_provider_profile(agent.provider) if _profile: return _ct.build_kwargs( provider_profile=_profile, # ← 传递整个 profile ... )
Profile 的 build_api_kwargs_extras 和 build_extra_body 方法被调用,注入 provider 特定的 extra_body。其他 provider 不受影响。
新增 provider 只需在 plugins/model-providers/ 下创建一个目录——不需要修改任何核心代码。
五、Transport 层:内部字段绝不外泄
Hermes 在消息上附加了内部标记——codex_reasoning_items、tool_name、timestamp——用于 SQLite 索引和会话回溯。但这些字段不在 OpenAI Chat Completions 规范里。
agent/transports/chat_completions.py 的 convert_messages(第 128-200 行)在发送前剥离所有内部字段:
def convert_messages(self, messages, **kwargs): # 剥离 codex_reasoning_items, codex_message_items # 剥离 tool_name # 剥离 timestamp # 剥离以 '_' 开头的内部标记 # 剥离 Gemini extra_content(如果不是发给 Gemini) return sanitized_messages
这不是"能跑就行"。这是尊重协议边界。
六、上下文长度:10 级优先级链
用户不需要配模型上下文长度——不是 Hermes "猜"了,而是有一个完整的解析链。
agent/model_metadata.py 的 get_model_context_length()(第 1779 行)定义了 10 级优先级:
0. config.yaml 显式覆盖 → 用户知道的最好 1. 持久缓存 context_length_cache.yaml → 之前探测过的 2. API 端点 /v1/models 实时查询 → 权威来源 3. 本地服务器查询(Ollama 等) 4. Anthropic /v1/models API 5. Provider 专用查询(Copilot/Nous/Codex/GMI/Ollama) 6. OpenRouter 实时 API 元数据 7. 硬编码默认值 DEFAULT_CONTEXT_LENGTHS → 最长 key 优先子串匹配 8. 本地服务器查询(最后手段) 9. 默认回退 256K
对于 deepseek-v4-pro,命中第 7 步——DEFAULT_CONTEXT_LENGTHS 字典(第 244 行):
"deepseek-v4-pro": 1_000_000,
匹配算法(第 2156-2161 行)是最长 key 优先子串匹配——deepseek-v4-pro(17 字符)优先于 deepseek(8 字符)。
首次命中后缓存到 context_length_cache.yaml,下次秒读。缓存按 model@base_url 做 key——同一模型在不同 provider 下可有不同上下文长度。
七、与 Claude Code 的对比
Claude Code 是闭源的。用户可以查看 CLAUDE.md 和对话历史文件——但无法查看它的内部逻辑。当它生成一个封面时,你不知道它内部做了什么——用了什么 prompt、调了什么工具、生成 HTML 的具体流程。
Hermes 的选择是:把源码放在本地。用户不需要"相信"它在做什么——可以打开文件自己看。
这不是"谁更好"的问题。这是不同的信任模型。Claude Code 的信任模型是"相信 Anthropic"。Hermes 的信任模型是"你可以自己验证"。
八、核心哲学
Hermes 的开放透明不是营销策略。它是自进化系统的必要条件。
如果一个系统会自己修改记忆、修复技能、归档文件——用户必须能验证它做了什么、为什么这样做。没有透明度的自治系统不是"智能"——是"黑箱"。
所以 Hermes 把源码放在硬盘上,把配置做成几十行 YAML,把 API 请求的每一层都写成可追踪的代码,把安全机制做成默认开启不可关闭。
这不是"更开放"。这是更可信。
Hermes Agent 由 Nous Research 开发。本文基于 Hermes v0.18.0 源码分析。
全文完。
更多推荐

所有评论(0)