Commit Graph

3476 Commits

Author SHA1 Message Date
justcarlosm
a4a0447b04 feat(telegram): drop_pending_on_cold_boot knob to preserve offline queue 2026-09-20 00:19:28 +05:30
Teknium
f0d8efe4e7 Merge pull request #115905 from NousResearch/fix/boa-res-R2-app-server-customprov
feat(codex): named custom providers work with the codex_app_server runtime (#75186, salvage #75191)
2026-09-19 11:35:36 -07:00
Teknium
4fda3bbdca Merge pull request #115846 from NousResearch/fix/boa-tts-stt-voice-tts-config-minlen
feat(tts): streaming TTS speaks a short first sentence sooner via tts.streaming.min_len on every surface (#96927, salvage #96933)
2026-09-19 11:33:15 -07:00
Teknium
e9f9a8d40f Merge pull request #115901 from NousResearch/fix/boa-res-R1-codex-auth-cli-adopt-guard
fix(auth): Codex CLI recovery no longer replaces a Hermes credential from another workspace (#73667, salvage #73677)
2026-09-19 11:28:31 -07:00
Teknium
0d2cb2cacc Merge pull request #115890 from NousResearch/fix/boa-res-R6-streaming-compaction-astra-oauth-gate
fix(compression): gpt-6-astra on Codex OAuth gets native server-side compaction when opted in (#103720, salvage #103718)
2026-09-19 11:28:10 -07:00
teknium1
049a62ab3d Merge remote-tracking branch 'origin/main' into HEAD
# Conflicts:
#	website/docs/user-guide/features/codex-app-server-runtime.md
2026-09-19 11:23:47 -07:00
teknium1
a169438178 Merge remote-tracking branch 'origin/main' into HEAD
# Conflicts:
#	hermes_cli/config_defaults.py
2026-09-19 11:22:01 -07:00
Teknium
ea94d88e25 Merge pull request #115851 from NousResearch/fix/boa-desktop-openai-custom-api-mode
fix(desktop): Custom Endpoints pick an API mode and keep /v1/models alias metadata (#93622, salvage #69824)
2026-09-19 11:16:54 -07:00
Teknium
271cf9e2d5 Merge pull request #115938 from NousResearch/fix/boa-res-R8-openai-native-search
feat(web): openai-native backend lets Codex Responses turns use the server-side web_search built-in (#19320, salvage #107377)
2026-09-19 11:15:31 -07:00
Teknium
8ea37a35d9 Merge pull request #115924 from NousResearch/fix/boa-res-R8-reset429-card
feat(desktop): usage-limit 429 error card shows when the limit resets (#98852)
2026-09-19 11:15:09 -07:00
Teknium
d6d9fac694 Merge pull request #115904 from NousResearch/fix/boa-res-R3-responses-reasoning-session-header
feat(providers): custom providers can carry the Hermes session id as an opt-in header (#86241, salvage #104566, supersedes #114496)
2026-09-19 11:14:31 -07:00
Teknium
3df8ad0d7f Merge pull request #115903 from NousResearch/fix/boa-res-R2-app-server-interim
fix(api-server): codex commentary reaches streaming clients on session SSE, /v1/runs and /v1/responses (#67580, salvage #67593 #67613)
2026-09-19 11:14:10 -07:00
Teknium
7612dc7ccb Merge pull request #115886 from NousResearch/fix/boa-res-R5-custom-endpoints-errors-local-ttfb
fix(streaming): local Responses endpoints get the local first-token grace instead of the 120 s hosted cutoff (#92302, salvage #92395)
2026-09-19 11:13:12 -07:00
Teknium
1285de7bbc Merge pull request #115880 from NousResearch/fix/boa-res-R4-routing-catalog-azure-text-verbosity
feat(openai): agent.text_verbosity controls Responses answer length (#20203, salvage #20258)
2026-09-19 11:12:52 -07:00
Teknium
7feb1af028 Merge pull request #115872 from NousResearch/fix/boa-res-R4-routing-catalog-azure-codex-900k-cap
fix(codex): opted-in -900k aliases cap at the live catalog max_context_window (#105443, salvage #105445)
2026-09-19 11:12:31 -07:00
Teknium
c99d016388 Merge pull request #115857 from NousResearch/fix/boa-response-store-api-server
fix(api-server): chained /v1/responses turns store each message once instead of doubling history every turn (#95137, #101644, salvage #85678)
2026-09-19 11:11:48 -07:00
Teknium
d6ff3bcfee Merge pull request #115840 from NousResearch/fix/boa-tts-stt-voice-sample-rate
fix(tts): OpenAI-compatible streaming TTS plays at the endpoint's reported sample rate (#76466, salvage #76501)
2026-09-19 11:10:21 -07:00
Teknium
61db846f19 Merge pull request #115831 from NousResearch/fix/boa-desktop-openai-codex-fallback
fix(desktop): open chats switch to a fallback provider added after they were opened (#95066, salvage #95139)
2026-09-19 11:09:59 -07:00
Teknium
699d46baea Merge pull request #115827 from NousResearch/fix/boa-vision-image-openai-opencodevision
fix(providers): opencode-go vision models attach images natively and resumed sessions stay on the Go endpoint (#96066, salvage #96116)
2026-09-19 11:09:37 -07:00
Teknium
656eb28309 Merge pull request #115822 from NousResearch/fix/boa-streaming-stalls-timeouts-reasoning-streak
fix(agent): Codex reasoning-only stalls switch to the fallback provider instead of ending incomplete (#67321, salvage #67336)
2026-09-19 11:09:15 -07:00
Teknium
709e7adcc4 Merge pull request #115791 from NousResearch/fix/boa-custom-provider-key-resolution
fix(providers): bare custom provider sends the key named by model.key_env; unset key_env is warned about (#67453, salvage #67554)
2026-09-19 11:08:09 -07:00
Teknium
438d2f061a Merge pull request #115763 from NousResearch/fix/boa-codex-oauth-refresh-401-soft-failure
fix(codex): usage-limit soft failures rotate the credential pool before provider fallback (#24159, salvage #24173)
2026-09-19 11:07:49 -07:00
teknium1
7f9e1453a3 chore: merge origin/main (resolve agent/opencode_affinity.py, tests/hermes_cli/test_web_server_idle_proof.py) 2026-09-19 10:56:19 -07:00
teknium1
7c2b81d320 chore: merge origin/main (resolve apps/desktop/src/components/assistant-ui/thread/assistant-message.tsx, website/docs/user-guide/desktop.md) 2026-09-19 10:54:43 -07:00
teknium1
4ff5d91ac7 chore: merge origin/main (resolve apps/desktop/src/app/settings/custom-endpoints-settings.tsx, apps/desktop/src/types/hermes.ts, hermes_cli/web_routers/config_env.py, tests/hermes_cli/test_web_server.py) 2026-09-19 10:54:40 -07:00
teknium1
ec2c4eeb80 chore: merge origin/main (resolve apps/desktop/src/lib/voice-client-direct.ts, hermes_cli/config_defaults.py, tools/voice_client_config.py, website/docs/user-guide/features/tts.md) 2026-09-19 10:54:38 -07:00
teknium1
12cc17fd76 chore: merge origin/main (resolve gateway/platforms/api_server.py, gateway/platforms/api_server_openai_routes.py) 2026-09-19 10:54:05 -07:00
teknium1
484ec8d07d chore: merge origin/main (resolve tests/agent/transports/test_codex_transport.py) 2026-09-19 10:52:11 -07:00
teknium1
7aff381943 chore: merge origin/main (resolve tests/agent/test_output_cap_parsing.py, tests/hermes_cli/test_runtime_provider_resolution.py) 2026-09-19 10:52:01 -07:00
teknium1
349f67778f chore: merge origin/main (resolve agent/transports/codex.py) 2026-09-19 10:51:50 -07:00
teknium1
c5490df54b chore: merge origin/main (resolve hermes_cli/config_defaults.py) 2026-09-19 10:51:43 -07:00
teknium1
e85cb94da1 chore: merge origin/main (resolve agent/error_classifier.py,tests/agent/test_error_classifier.py) 2026-09-19 10:51:40 -07:00
teknium1
6b415f8754 chore: merge origin/main (resolve gateway/platforms/api_server_openai_routes.py) 2026-09-19 10:51:28 -07:00
teknium1
54c01bc19a chore: merge origin/main (resolve hermes_cli/runtime_provider.py, website/docs/user-guide/features/codex-app-server-runtime.md) 2026-09-19 10:51:04 -07:00
teknium1
5857a6fb38 chore: merge origin/main (resolve hermes_cli/auth_codex.py) 2026-09-19 10:51:00 -07:00
teknium1
8e3a833365 chore: merge origin/main (resolve website/docs/developer-guide/context-compression-and-caching.md) 2026-09-19 10:47:48 -07:00
teknium1
4171ad5967 chore: merge origin/main (resolve website/docs/user-guide/features/fallback-providers.md) 2026-09-19 10:47:48 -07:00
teknium1
e03af55edd chore: merge origin/main (resolve website/docs/integrations/providers.md) 2026-09-19 10:47:48 -07:00
teknium1
68f3ff788a chore: merge origin/main (resolve website/docs/user-guide/features/credential-pools.md) 2026-09-19 10:47:48 -07:00
teknium1
bf6977fe16 chore: merge origin/main (resolve website/docs/user-guide/features/codex-app-server-runtime.md) 2026-09-19 10:47:48 -07:00
teknium1
a59944d118 Merge remote-tracking branch 'origin/main' into HEAD 2026-09-19 10:47:00 -07:00
teknium1
a516db44e7 Merge remote-tracking branch 'origin/main' into HEAD 2026-09-19 10:46:59 -07:00
teknium1
ece388eca8 fix: test-runner scratch root is /var/tmp/hermes-pytest; two tests follow TMPDIR
~/.cache/hermes-pytest failed seven files: a dot-dir ancestor made the hidden-dir search tests
see every fixture as hidden, and the longer root pushed the PulseAudio/voice AF_UNIX test
sockets past sun_path. /var/tmp is the FHS disk-backed temp root (never tmpfs), non-hidden,
and shorter than the old /tmp root. test_tool_result_storage asserts STORAGE_DIR instead of a
literal, and the zh-Hans bot-mode mirror follows the English code block it must copy.
2026-09-19 10:44:26 -07:00
teknium1
6c3ff1d732 docs(site): docs and generated skill pages stop suggesting /tmp
Hand-written docs and the generated per-skill mirror pages now show the same
scratch locations the skills and prompts do (~/.hermes/cache/scratch,
$TMPDIR, $HOME/.hermes/cache/scratch/<throwaway-home>) instead of /tmp, and
examples that only needed a placeholder use /path/to/... The mirror pages were
updated in place rather than regenerated: regenerating from the current sources
produces a 200-file unrelated diff (Windows backslash paths, removed skills).

Literals that describe /tmp itself stay and carry a no-tmp marker: the
sandbox tmpfs configuration, the disk-cleanup plugin's scope, the WSL feature
list, the terminal.temp_dir rationale, the Nix container's writable layer and
the Docker Compose in-container pulse-cookie path. One tree-listing line in
nix-setup.md stays unmarked (a marker would render inside the code block).
2026-09-19 10:44:26 -07:00
teknium1
2dcebe6471 feat: Hermes-owned scratch dir replaces the system temp dir for every process and child
Hermes and everything it launches (browser profiles, PTY probes, skill scripts,
tempfile defaults in delegated code) wrote to the system temp dir, which is a
RAM-backed tmpfs on most Linux hosts and containers and fills under agent load.

- hermes_constants.get_scratch_dir(): HERMES_HOME/cache/scratch (0700), entries
  older than 72h pruned once per process / once per hour across processes.
- apply_scratch_tmp_env(env) / export_scratch_tmp_env(): TMPDIR/TMP/TEMP point at
  the scratch dir when the user or OS has not set them; a value Hermes itself
  exported (== HERMES_SCRATCH_DIR) is re-derived for a re-homed process or a
  child served under another profile, so profiles never share scratch.
- hermes_bootstrap runs the export on import (every entry point); hermes_cli.main
  re-runs it after --profile resolution; the subprocess HOME contract
  (apply_subprocess_home_env) and the routed-home rewrites in code_execution_env
  and served_profile_child_env apply it to child envs.
- The runtime-environment prompt block names the scratch dir so the model stops
  reaching for the system temp dir by reflex; hermes doctor reports the dir, its
  size and whether a user TMPDIR overrides it.
2026-09-19 10:44:26 -07:00
teknium1
471ef5f4c3 fix(desktop): direct dictation requests time out per stt.openai.timeout instead of hanging
The client-direct STT path in the Desktop (voice-client-direct.ts) issued a
bare fetch to the provider with no AbortSignal, so a slow or wedged
transcription endpoint left the microphone stuck on "transcribing" forever;
the gateway's own transcription client already has a deadline.

- tools/voice_client_config.py::_resolve_stt_client_config adds `timeout_s`
  (from `stt.openai.timeout`, default 60; groq/deepinfra riders inherit) to
  the direct STT config the gateway hands the Desktop.
- voice-client-direct.ts routes all three direct STT fetches
  (openai-multipart, xai-stt, elevenlabs-stt) through sttFetch, which aborts
  at that deadline and surfaces "Transcription timed out after Ns".
- Docs: desktop.md dictation paragraph notes the shared budget.

Part of #112939
2026-09-19 10:40:04 -07:00
teknium1
0a1bc07f15 docs(honcho): say that initOnSessionStart blocks tools-mode startup until Honcho answers
What: the `initOnSessionStart` setup-schema description and the Honcho docs page
now state that in `recallMode: tools` the eager init runs synchronously during
agent construction, that it should stay false for Desktop or a local Honcho that
may be down, and that `timeout` in honcho.json caps each SDK call (both keys
added to the Full Config Reference table).

Why: #51492 reports Desktop `session.resume` / `prompt.submit` timeouts when a
local Honcho is down with `initOnSessionStart: true`. The synchronous eager path
is intentional design (#51562 was closed for that reason:
"ready-before-first-tool-call semantics"), so the fix for users is knowing the
trade-off and the two knobs that bound it.
2026-09-19 10:39:32 -07:00
teknium1
005c746d2c docs(config): document the gateway/proxy path to a fast tier via custom-provider extra_body
What: a "Fast tiers behind a gateway or proxy" subsection under Fast Mode in the
configuration guide plus a commented example in cli-config.yaml.example showing
`providers.<name>.extra_body: {service_tier: priority}`.

Why: agent.service_tier / `/fast` deliberately reach only first-party billing
endpoints (hermes_cli/models.py::_fast_mode_route_supported, c7e2e0b779), so
gateway and proxy users asked how to get a priority tier (#78097). The
per-provider extra_body is merged into every chat-completions request for that
endpoint (agent/agent_init.py::_merge_custom_provider_extra_body →
agent/fast_mode.py::effective_request_overrides), which already gives them a
supported path; it was just undocumented next to Fast Mode.
2026-09-19 10:39:01 -07:00
teknium1
bafb778edc feat(gateway): opt-in served_model footer field shows the model that really answered
What: a new opt-in gateway runtime-footer field `served_model` rendered as
`alias → served`. It is populated from the `x-litellm-model-id` response header
(fallback `x-litellm-model-api-base`) that routing proxies send on every chat
completion, captured through an httpx response hook installed on the agent's
OpenAI client (agent/served_model.py, wired in create_openai_client), and from
Hermes' own provider fallback (primary runtime model → active model) when no
header is present. The turn result carries `requested_model` / `served_model`;
gateway/run_turn.py passes them to the footer. Off unless listed in
`display.runtime_footer.fields`; the default field set renders exactly as before.

Why: behind a routing proxy (or during a silent Hermes fallback) every reply
shows the configured alias, so operators cannot see which deployment actually
served a request (#54864). The SDK's parsed objects drop response headers, so
the capture has to sit on the transport.
2026-09-19 10:38:30 -07:00
teknium1
74c2439af2 fix(desktop): error card 'Switch provider' opens the live session model menu
The provider error card's "Switch provider" button navigated to
Settings → Models, which only changes the default provider/model for NEW
sessions — the failed chat kept its broken provider, so the user had to
find the composer pill on their own to actually recover the turn.

The button now calls requestModelMenuToggle(), the same bus request the
`composer.modelPicker` hotkey uses: it opens the composer pill's live
model menu (pane under the pointer, else the active composer), whose
picks go through model.switch on THIS session. When no chat surface is
on screen (requestModelMenuToggle returns false) it falls back to the
Settings → Models deep link as before. No new RPC.

Also refreshes the ErrorRecoveryPlan.switchProvider doc comment and the
Desktop user-guide bullet describing the button.

Tests: two invariant vitests on the error card (menu opened, no
navigation / menu unavailable → Settings deep link); both fail on base
where the click always navigates.

Part of #95066
2026-09-19 10:36:50 -07:00