· Jeff · 教程  · 4 分钟阅读

Hermes 从 0.17.0 升级到 0.19.1,context_length 配置不生效问题解决

从 config.yaml 配置到源码追踪,一步步定位 context_length 被清掉、Provider 显示 "custom" 的根因,并给出修复方案。

从 config.yaml 配置到源码追踪,一步步定位 context_length 被清掉、Provider 显示 "custom" 的根因,并给出修复方案。

问题现象

将 Hermes Agent 从 0.17.0 升级到 0.19.1 后,遇到了两个奇怪的问题:

  • /new 命令显示 Context: 256K tokens (default — set model.context_length in config to override)
  • /new 显示 Provider: custom(0.17.0 时代显示的是 Provider: 9router

config.yaml 中明明已经设置了 model.context_length: 1048576(1M),为什么没生效?

根因分析

整个问题涉及三条链路叠加,需要深入源码才能看清全貌。

链路一:context_lengthshould_clear_context_pin 清掉

gateway/run.py_format_session_info() 函数(负责 /new 的界面渲染)中:

# 1. 正确读到 config 里的 1048576
config_context_length = 1048576  # ✅

# 2. should_clear_context_pin 比较 route 匹配
runtime = _resolve_runtime_agent_kwargs()
provider = runtime.get("provider")  # → "custom"
should_clear_context_pin(
    configured_provider="9router",
    active_provider="custom",       # ← 不匹配!
) → True
config_context_length = None        # ❌ 被清掉

# 3. 补救路径只查 per-model,不查 provider 层
get_custom_provider_context_length(...)
# 只查 custom_providers[].models.<id>.context_length
# context_length 写在 provider 顶层 → 找不到

核心矛盾:should_clear_context_pin 检测到 runtime 的 provider("custom")与 config 里配置的("9router")不一致,于是认为”用户可能切换了 provider”,把 context_length 置为 None 以重新探测。但后续的补救路径 get_custom_provider_context_length 只查 per-model 层的 context_length,而我们的配置写在 provider 顶层,导致补救路径也读不到。

链路二:get_model_context_length 兜底到 256K

config_context_length=None 传入后,走全量探测链:

  • 9router /v1/models API 不返回 context_length 字段
  • 触发启发式兜底 → DEFAULT_FALLBACK_CONTEXT = 256_000

这就是为什么 /new 始终显示 256K 的原因。

链路三:Provider 显示 custom 而非 9router

runtime_provider.py_resolve_named_custom_runtime() 对所有 custom_providers 条目硬编码:

result = {
    "provider": "custom",  # ← 统一返回 "custom",不保留 name
    ...
}

0.17.0 版本没有 runtime.get("provider") or provider 这行覆盖逻辑,直接展示 config 里的 model.provider;0.19.x 引入 runtime 覆盖后,展示值被 "custom" 取代。

修复方案

custom_providers.9router 下新增 per-model 层context_length(这是补救路径能读到的位置):

- name: 9router
  base_url: https://xx.xx.xx.xx/v1
  api_key: ${9ROUTER_API_KEY}
  model: deep-cbcn
  context_length: 1048576        # provider 层(会被 should_clear_context_pin 清掉)
  models:                         # ← 新增:per-model 层,补救路径能读到
    deep-cbcn:
      context_length: 1048576

改完后重启 gateway,/new 即可正确显示 1M context 长度。

关键源码位置

文件作用
gateway/run.py_format_session_info()/new 渲染逻辑
agent/agent_init.pyagent 初始化时的 context_length 解析
hermes_cli/runtime_provider.py_resolve_named_custom_runtime() — 返回 "custom" 的根源
hermes_cli/route_identity.pyshould_clear_context_pin() — 路由匹配清 pin
agent/model_metadata.pyCONTEXT_PROBE_TIERS + DEFAULT_FALLBACK_CONTEXT = 256K

总结

这个问题的本质是 Hermes 0.19.x 在 runtime provider 解析和 context pin 清理两条路径之间存在配置传递的缝隙。per-model 层是新版本中补救路径的可靠落点,将 context_length 同时写在 provider 层和 per-model 层是最稳妥的做法。Provider 显示 custom 则是硬编码行为,不影响功能,但确实是一个展示层面的 bug。

☕ 如果这篇文章对你有帮助

欢迎请 Jeff 喝杯咖啡,支持我持续分享更多软件技巧~

打赏功能即将上线,先点个赞也是支持 ❤️

返回博客

相关文章

查看全部 »
Android 上跑 Hermes Agent:Termux 完整安装攻略

Android 上跑 Hermes Agent:Termux 完整安装攻略

想把 Hermes Agent 装进安卓手机?Termux 是唯一正解。本文实测覆盖从装 Termux、装系统依赖、三种安装方式(含 psutil 兼容坑)到飞书网关、防杀后台、SSH 远程管理的完整流程,手机直接变身随身 AI 助手。