当你对一个 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_extrasbuild_extra_body 方法被调用,注入 provider 特定的 extra_body。其他 provider 不受影响。

新增 provider 只需在 plugins/model-providers/ 下创建一个目录——不需要修改任何核心代码。


五、Transport 层:内部字段绝不外泄

Hermes 在消息上附加了内部标记——codex_reasoning_itemstool_nametimestamp——用于 SQLite 索引和会话回溯。但这些字段不在 OpenAI Chat Completions 规范里。

agent/transports/chat_completions.pyconvert_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.pyget_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 源码分析。

全文完。

更多推荐