Hermes hardcodes response_format=json_schema on its title call. No local
back-end implements constrained decoding — frank-small and frank-large both
answer 400 'response_format json_object/json_schema is not supported' — so
every session logged a title failure and fell back to a message-derived
title. The NPU endpoint that used to absorb this call was retired on
2026-09-11.
The call now goes out over the Responses transport (the only one that does
not forward response_format) with thinking off. A 64-token cap cannot hold a
thinking pass plus a title: with the default reasoning effort the model spent
all 64 tokens thinking and returned empty content, which is why disabling
reasoning is part of the fix and not decoration.
Verified against the live endpoint with the real prompt and the real
extraction path: raw {"title": "Friendly greeting"} -> title
'Friendly greeting' in 3.4s, where the previous configuration returned 400.
101 lines
3.4 KiB
Plaintext
101 lines
3.4 KiB
Plaintext
# Hermes configuration backup / non-secret baseline.
|
|
#
|
|
# Source on Dankclaw: /home/dank/Containers/hermes/data/config.yaml
|
|
# This file is a sanitized Git backup, not a complete replacement for the
|
|
# live Hermes state. Do not add dashboard password hashes, phone numbers,
|
|
# OAuth credentials, API keys, sessions, memories, or generated state here.
|
|
# The live directory is bind-mounted into the containers as /data.
|
|
|
|
model:
|
|
provider: dankclaw-large
|
|
base_url: http://192.168.0.143:7770/v1
|
|
api_key: not-needed
|
|
default: frank-large
|
|
|
|
providers:
|
|
dankclaw-large:
|
|
api: http://192.168.0.143:7770/v1
|
|
discover_models: false
|
|
models:
|
|
frank-large:
|
|
context_length: 262144
|
|
dankserver-small:
|
|
api: http://192.168.0.235:7770/v1
|
|
discover_models: false
|
|
models:
|
|
frank-small:
|
|
context_length: 163840
|
|
|
|
# Auxiliary routing from the live configuration. Named providers route via
|
|
# their `api:` URL; `custom` entries route by their explicit `base_url`.
|
|
auxiliary:
|
|
vision: {provider: dankclaw-large, model: frank-large}
|
|
web_extract: {provider: dankserver-small, model: frank-small}
|
|
compression: {provider: dankserver-small, model: frank-small}
|
|
skills_hub: {provider: dankserver-small, model: frank-small}
|
|
approval: {provider: dankserver-small, model: frank-small}
|
|
mcp: {provider: dankserver-small, model: frank-small}
|
|
# Title generation goes out over the Responses transport on purpose: Hermes
|
|
# hardcodes response_format=json_schema on this one call, no local back-end
|
|
# implements constrained decoding (it is a 400), and this transport is the
|
|
# only one that drops the field. reasoning.effort=none is required with it —
|
|
# the call caps output at 64 tokens, which a thinking pass would consume
|
|
# entirely, leaving an empty title.
|
|
title_generation:
|
|
provider: dankserver-small
|
|
model: frank-small
|
|
api_mode: codex_responses
|
|
extra_body:
|
|
reasoning:
|
|
effort: none
|
|
memory_query_rewrite: {provider: custom, model: frank-small, base_url: http://192.168.0.235:7770/v1}
|
|
tts_audio_tags: {provider: custom, model: frank-small, base_url: http://192.168.0.235:7770/v1}
|
|
triage_specifier: {provider: dankclaw-large, model: frank-large}
|
|
kanban_decomposer: {provider: dankclaw-large, model: frank-large}
|
|
profile_describer: {provider: dankserver-small, model: frank-small}
|
|
curator: {provider: dankserver-small, model: frank-small}
|
|
|
|
dashboard:
|
|
# basic_auth intentionally omitted; its password_hash remains live-only.
|
|
font: atkinson-hyperlegible
|
|
moa:
|
|
presets:
|
|
default:
|
|
reference_models:
|
|
- provider: openrouter
|
|
model: deepseek/deepseek-v4-pro
|
|
enabled: false
|
|
degraded_reference_policy: loud
|
|
fanout: user_turn
|
|
reference_models:
|
|
- provider: openrouter
|
|
model: deepseek/deepseek-v4-pro
|
|
enabled: false
|
|
aggregator:
|
|
provider: openrouter
|
|
model: anthropic/claude-opus-4.8
|
|
degraded_reference_policy: loud
|
|
max_tokens: 4096
|
|
fanout: user_turn
|
|
enabled: true
|
|
skills:
|
|
disabled: []
|
|
onboarding:
|
|
seen:
|
|
busy_input_prompt: true
|
|
_config_version: 34
|
|
platforms:
|
|
signal:
|
|
# Live config has the Signal adapter disabled; http_url points at the
|
|
# host signal-cli daemon. The account phone number stays live-only.
|
|
enabled: false
|
|
extra:
|
|
http_url: http://192.168.0.143:8080
|
|
mcp_servers:
|
|
chrome-devtools:
|
|
command: /usr/local/bin/npx
|
|
args:
|
|
- -y
|
|
- chrome-devtools-mcp@latest
|
|
- --browserUrl=http://127.0.0.1:9222
|