Skip to content

fix(auxiliary): route direct-create aux callers through call_llm - #65029

Merged
teknium1 merged 2 commits into
mainfrom
fix/35566-aux-extra-body-direct-callers
Jul 15, 2026
Merged

fix(auxiliary): route direct-create aux callers through call_llm#65029
teknium1 merged 2 commits into
mainfrom
fix/35566-aux-extra-body-direct-callers

Conversation

@teknium1

Copy link
Copy Markdown
Contributor

Summary

The five auxiliary callers that built raw clients directly now route through call_llm(task=...) — closing the remaining half of #35566: auxiliary.<task>.extra_body from config.yaml was silently ignored by kanban_decompose, kanban_specify, profile_describer, and both LLM calls in goals.py (judge + draft-contract).

Fixes #35566.

Root cause

Those callers used get_text_auxiliary_client() + client.chat.completions.create(extra_body=get_auxiliary_extra_body()) — and get_auxiliary_extra_body() only returns Nous portal tags; it never reads auxiliary.<task>.extra_body. The call_llm path was fixed previously (#64597/#64942), leaving these five direct-create sites as the last gap.

Changes

  • hermes_cli/kanban_decompose.py, kanban_specify.py, profile_describer.py, goals.py (2 sites): replaced the direct client build with call_llm(task=...). Each caller gains the full auxiliary contract for free — task extra_body, reasoning_effort shorthand, transient retries, provider-profile wire projection, fallback chains. Net −97 lines.
  • hermes_cli/config.py: new auxiliary.goal_judge DEFAULT_CONFIG block (the task name was used but never existed as documented config; provider/model overrides for it silently had no schema).
  • Tests: 4 test files migrated from raw-client mocks to call_llm mocks; error-branch assertions updated (no-provider now surfaces via call_llm's RuntimeError → the same fail-open/failed-outcome behavior, one message string changed).
  • get_auxiliary_extra_body() retained (zero in-tree callers now) for plugin back-compat.

Validation

Check Result
Targeted suites (goals, kanban decompose/specify, describer, aux client, config) 616/616 pass
Socket-level E2E: real config file, real OpenAI SDK, all four tasks per-task extra_body marker on the wire for each; goal_judge also carries the reasoning_effort: low shorthand
Full judge_goal() path (not just call_llm) verdict returned, config extra_body on the wire

Infographic

Five rogue callers, one chokepoint

teknium1 added 2 commits July 15, 2026 06:53
)

Five callers (kanban_decompose, kanban_specify, profile_describer, and
goals.py's judge + draft-contract) built raw clients via
get_text_auxiliary_client() and passed extra_body=get_auxiliary_extra_body()
— which only returns Nous portal tags and ignores
auxiliary.<task>.extra_body from config.yaml entirely. That was the
remaining half of #35566 after the call_llm path was fixed.

Routing them through call_llm(task=...) gives each caller the full
auxiliary contract for free: task extra_body, the reasoning_effort
shorthand, transient retries, provider-profile projection, and fallback
chains. goal_judge gains a DEFAULT_CONFIG block (it had none — its
provider/model overrides silently didn't exist as documented keys).

get_auxiliary_extra_body() now has zero non-test callers; kept for
plugin back-compat.

Fixes #35566.
Two more consumers of specify_task mocked the old
get_text_auxiliary_client symbol (missed in the first sibling sweep —
they live outside tests/hermes_cli's kanban files): the dashboard
plugin's /specify endpoint tests and the /kanban slash-command E2E.
Same migration as the rest: mock call_llm at the source, no-provider
now surfaces via the LLM-error branch.
@alt-glitch alt-glitch added type/bug Something isn't working comp/cli CLI entry point, hermes_cli/, setup wizard comp/agent Core agent runtime: loop, agent_init, prompt builder, context-compression, responses endpoint area/config Config system, migrations, profiles P2 Medium — degraded but workaround exists labels Jul 15, 2026
@teknium1
teknium1 merged commit 7c95496 into main Jul 15, 2026
31 checks passed
@teknium1
teknium1 deleted the fix/35566-aux-extra-body-direct-callers branch July 15, 2026 14:39
Gravezzz pushed a commit to Gravezzz/hermes-agent that referenced this pull request Jul 21, 2026
…sResearch#65029)

* fix(auxiliary): route direct-create aux callers through call_llm (NousResearch#35566)

Five callers (kanban_decompose, kanban_specify, profile_describer, and
goals.py's judge + draft-contract) built raw clients via
get_text_auxiliary_client() and passed extra_body=get_auxiliary_extra_body()
— which only returns Nous portal tags and ignores
auxiliary.<task>.extra_body from config.yaml entirely. That was the
remaining half of NousResearch#35566 after the call_llm path was fixed.

Routing them through call_llm(task=...) gives each caller the full
auxiliary contract for free: task extra_body, the reasoning_effort
shorthand, transient retries, provider-profile projection, and fallback
chains. goal_judge gains a DEFAULT_CONFIG block (it had none — its
provider/model overrides silently didn't exist as documented keys).

get_auxiliary_extra_body() now has zero non-test callers; kept for
plugin back-compat.

Fixes NousResearch#35566.

* test: migrate kanban dashboard + CLI specify mocks to call_llm

Two more consumers of specify_task mocked the old
get_text_auxiliary_client symbol (missed in the first sibling sweep —
they live outside tests/hermes_cli's kanban files): the dashboard
plugin's /specify endpoint tests and the /kanban slash-command E2E.
Same migration as the rest: mock call_llm at the source, no-provider
now surfaces via the LLM-error branch.
randlee pushed a commit to randlee/hermes-agent that referenced this pull request Aug 11, 2026
…sResearch#65029)

* fix(auxiliary): route direct-create aux callers through call_llm (NousResearch#35566)

Five callers (kanban_decompose, kanban_specify, profile_describer, and
goals.py's judge + draft-contract) built raw clients via
get_text_auxiliary_client() and passed extra_body=get_auxiliary_extra_body()
— which only returns Nous portal tags and ignores
auxiliary.<task>.extra_body from config.yaml entirely. That was the
remaining half of NousResearch#35566 after the call_llm path was fixed.

Routing them through call_llm(task=...) gives each caller the full
auxiliary contract for free: task extra_body, the reasoning_effort
shorthand, transient retries, provider-profile projection, and fallback
chains. goal_judge gains a DEFAULT_CONFIG block (it had none — its
provider/model overrides silently didn't exist as documented keys).

get_auxiliary_extra_body() now has zero non-test callers; kept for
plugin back-compat.

Fixes NousResearch#35566.

* test: migrate kanban dashboard + CLI specify mocks to call_llm

Two more consumers of specify_task mocked the old
get_text_auxiliary_client symbol (missed in the first sibling sweep —
they live outside tests/hermes_cli's kanban files): the dashboard
plugin's /specify endpoint tests and the /kanban slash-command E2E.
Same migration as the rest: mock call_llm at the source, no-provider
now surfaces via the LLM-error branch.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area/config Config system, migrations, profiles comp/agent Core agent runtime: loop, agent_init, prompt builder, context-compression, responses endpoint comp/cli CLI entry point, hermes_cli/, setup wizard P2 Medium — degraded but workaround exists type/bug Something isn't working

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Bug: get_auxiliary_extra_body() ignores auxiliary.<task>.extra_body from config.yaml

2 participants