ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

【hermes-agent】Hermes Agent 模块化微内核拆解:从 settings.json 到 config.toml 的配置骨架与验证

【hermes-agent】Hermes Agent 模块化微内核拆解:从 settings.json 到 config.toml 的配置骨架与验证 1. 从 settings.json 到 config.tomlHermes Agent 微内核配置链路拆解Hermes Agent 的 agent 模块是一套模块化微内核它把多模型接入、凭证管理、上下文压缩、记忆检索、速率限制这些能力拆成独立单元再由配置骨架决定运行时装配哪些模块。很多人第一次接触它时会卡在 settings.json 和 config.toml 这两个文件上前者管凭证与端点后者管模块开关与运行参数两者职责不同却经常被混着改。这篇就按 Python 源码的加载顺序把这条链路走一遍并给出可直接复制的骨架示例最后用统一 Key/API 通道完成一次配置加载与模块调用验证。适合正在读 agent 源码、准备二次开发或想搞清微内核装配逻辑的读者。Hermes Agent 的配置加载不是一次性读文件而是分阶段合并先读全局 settings.json 拿到凭证池和默认端点再读项目级 config.toml 覆盖模块级参数最后在 AIAgent 初始化时按 config 里的 engine、provider、memory 字段决定实例化哪些类。理解这个顺序你改配置时就不会出现「改了没生效」的情况。2. 前置准备统一 Key/API 通道与目录结构在动配置之前先把凭证通道准备好。Hermes Agent 的 credential_pool 支持多来源凭证其中通过统一 Key/API 通道接入是最省事的一种你只需要一个 base_url 和一个 key就能让 agent 模块里的 auxiliary_client 和 provider adapter 走同一条出口。访问 https://taotoken.net/api 获取 API 端点再到 https://taotoken.net/api-keys 生成 Key。这两个地址分别对应端点和凭证别搞混。目录结构建议这样放Hermes Agent 默认会按这个顺序查找~/.hermes/ ├── settings.json # 全局凭证与端点 ├── config.toml # 模块级配置 ├── auth.json # credential_pool 持久化 └── skills/ # 技能目录 project/ └── config.toml # 项目级覆盖settings.json 负责「连哪里、用什么身份」config.toml 负责「装配哪些模块、参数多少」。两者分离是微内核设计的关键凭证可以跨项目复用模块配置可以按项目切换。3. 可复制配置settings.json 与 config.toml 骨架3.1 settings.json 骨架这个文件对应源码里 credential_pool.py 的 CredentialEntry 结构字段名要和 dataclass 对齐否则加载时会静默跳过。{ active_provider: taotoken, providers: { taotoken: { base_url: https://taotoken.net/api, api_key: sk-你的Key, label: taotoken-main, source: config, models: { default: claude-sonnet-4-20250514, cheap: claude-haiku-4-20250514 } } }, credential_pool: { rotation: true, refresh_before_expiry_seconds: 300 } }active_provider 决定 auxiliary_client 的解析优先级里哪一项命中。source 字段会影响 resolve_client 的排序cli config env oauth写 config 表示这是配置文件来源。3.2 config.toml 骨架config.toml 对应的是模块装配层源码里 context.engine、memory.provider、routing.enabled 这些键都在这里读。[agent] name hermes-local max_turns 40 [context] engine compressor compress_threshold 0.75 keep_head_turns 2 keep_tail_turns 4 [memory] provider builtin memory_file ~/.hermes/MEMORY.md user_file ~/.hermes/USER.md [routing] enabled true max_simple_chars 160 max_simple_words 28 cheap_model claude-haiku-4-20250514 [rate_limit] track_headers true warn_at_percent 80 [provider] adapter anthropic base_url https://taotoken.net/apicontext.engine 的值会去匹配 ContextEngine 的注册名默认 compressor 对应 context_compressor.py 里的 ContextCompressor。memory.provider 同理builtin 对应 BuiltinMemoryProvider写别的名字会尝试加载外部 provider但源码里限制最多一个外部 provider。3.3 加载顺序验证在 Python 里手动触发一次加载确认两个文件都被读到from hermes.agent.credential_pool import CredentialPool from hermes.agent.context_engine import load_engine from hermes.agent.memory_manager import MemoryManager pool CredentialPool.from_settings(~/.hermes/settings.json) client pool.resolve_client(providertaotoken) print(base_url:, client.base_url) engine load_engine(compressor) print(engine:, engine.__class__.__name__) mem MemoryManager.from_config(config.toml) print(memory provider:, mem.provider_name)跑通后你会看到 base_url 指向 taotoken.net/apiengine 是 ContextCompressormemory provider 是 builtin。这三个输出说明 settings.json 和 config.toml 都进了加载链路。4. 验证请求一次完整的模块调用配置加载只是第一步真正要验证的是微内核能不能按配置装配出可用的 agent 能力。下面这段代码模拟一次请求走 prompt_builder 组装、provider adapter 翻译、usage_pricing 计费的完整路径。import os from hermes.agent.prompt_builder import build_system_prompt from hermes.agent.auxiliary_client import call_llm from hermes.agent.usage_pricing import normalize_usage, estimate_usage_cost os.environ[HERMES_CONFIG] config.toml system_prompt build_system_prompt( identity你是一个配置验证助手, platformcli, memory_file~/.hermes/MEMORY.md ) print(system prompt length:, len(system_prompt)) resp call_llm( messages[ {role: system, content: system_prompt}, {role: user, content: 用一句话说明当前装配了哪些模块} ], providertaotoken, modelclaude-sonnet-4-20250514 ) print(reply:, resp.choices[0].message.content) usage normalize_usage(resp.usage, providertaotoken, api_modechat) cost estimate_usage_cost(claude-sonnet-4-20250514, usage) print(input tokens:, usage.input_tokens) print(cost usd:, cost.amount_usd)预期结果reply 会返回一句描述usage.input_tokens 是一个正整数cost.amount_usd 是估算成本。如果 input_tokens 明显偏大检查 normalize_usage 有没有把 cache_read 减掉源码里 OpenAI 格式的 prompt_tokens 是含缓存的。想直接看模型对话效果可以到 https://taotoken.net/models 用同一个 Key 试一轮确认端点通不通。5. 本篇常见错排查5.1 settings.json 改了但 resolve_client 还是旧端点credential_pool 有客户端缓存key 是 (provider, model, api_key, base_url) 四元组签名。你只改了 base_url 但没改 api_key签名变了应该会重建。如果没重建检查是不是有进程级缓存没清。重启 Python 进程最稳。5.2 config.toml 里 engine 写了自定义名但加载失败load_engine 会先查内置注册表再查 plugins/context_engine// 目录。自定义 engine 必须实现 ContextEngine 的两个抽象方法 should_compress 和 compress少一个就抛 TypeError。先用内置 compressor 跑通再换自定义。5.3 报 context_limit 错误但消息并不长error_classifier 会把含 context window 字样的错误归到 context_limit。有时候是 provider 返回的报错文案里带了这个词实际是别的错。打开 debug 日志看原始 status_code401 和 429 不会误判只有 400 系列需要留意。5.4 memory 写入不生效BuiltinMemoryProvider 写的是 MEMORY.md路径来自 config.toml 的 memory.memory_file。如果路径用了 ~ 但没展开会写到当前目录下一个叫 ~ 的文件夹里。用 os.path.expanduser 确认一下实际路径。5.5 速率限制显示 80% 警告但请求没被拦rate_limit_tracker 只做展示和记录不主动拦截。真正拦截在 nous_rate_guard它读的是共享文件 ~/.hermes/rate_limits/nous.json。两个模块职责不同别指望 tracker 帮你挡请求。6. 继续往下走配置链路跑通后下一步通常是接长期编码或 Agent 场景。这时候建议用 Coding Plan它把模型路由、上下文压缩、凭证轮换这些模块预设好了你只需要填 Key。到 https://taotoken.net/coding-plan 看具体接入方式。如果你要自己写 provider adapter接入文档在 https://taotoken.net/doc里面有 adapter 的翻译层接口约定。凭证管理相关的细节在 https://taotoken.net/api-keys 页面下方有说明。我自己的习惯是先把 settings.json 和 config.toml 各留一份最小骨架跑通一次 call_llm 再往上加模块。微内核的好处就是你可以一次只装配一个模块出问题也好定位。
返回列表