· Jeff · 教程 · 4 分钟阅读
Hermes 从 0.17.0 升级到 0.19.1,context_length 配置不生效问题解决
从 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_length 被 should_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/modelsAPI 不返回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.py | agent 初始化时的 context_length 解析 |
hermes_cli/runtime_provider.py | _resolve_named_custom_runtime() — 返回 "custom" 的根源 |
hermes_cli/route_identity.py | should_clear_context_pin() — 路由匹配清 pin |
agent/model_metadata.py | CONTEXT_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 喝杯咖啡,支持我持续分享更多软件技巧~
打赏功能即将上线,先点个赞也是支持 ❤️