Skip to content

fix: voice dictation broken in profiles created via profiles.create (missing stt/tts config) - #85755

Merged
teknium1 merged 2 commits into
mainfrom
fix/profile-voice-config-mirror
Aug 14, 2026
Merged

teknium1 merged 2 commits into
mainfrom
fix/profile-voice-config-mirror

Conversation

@teknium1

Copy link
Copy Markdown
Collaborator

Desktop dictation is profile-scoped: /api/audio/transcribe runs transcribe_recording under _config_profile_scope(profile), resolving the stt section from the TARGET profile's config.yaml. Profiles created via profiles.create (#85093) get only a model section — so STT falls back to defaults and dictation breaks in every created-profile chat while working fine on the primary ('voice dictation doesn't work in bot mode but is fine in regular mode' — Bot Mode user report).

Fix: mirror the launch profile's stt/tts/voice config sections into the new profile, key-wise (sections a clone already carries are never overwritten), gated on the same mirror_credentials flag as .env/auth mirroring, reported as mirrored.voice.

Verified live: profiles.create → new profile's config.yaml carries stt+tts+model → cleanup. Same pattern as the #85111 credential mirroring.

…ofiles.create

Desktop dictation is profile-scoped: /api/audio/transcribe resolves the
stt section inside the TARGET profile's home. Profiles created through
profiles.create got only a model section, so dictation and TTS silently
fell back to defaults (local whisper, often not installed) — 'voice
dictation doesn't work in bot mode but is fine in regular mode'.

Mirror the launch profile's stt/tts/voice sections (key-wise, never
overwriting sections the clone already has) under the same
mirror_credentials flag that gates .env/auth mirroring, and report it
as mirrored.voice in the receipt.
@github-actions

github-actions Bot commented Aug 14, 2026

Copy link
Copy Markdown
Contributor

૮ >ﻌ< ა ci review

ran on d551f86 — guard: route voice-config mirror through canonical loaders

⚠️ Warnings

OSV vulnerability scan · View job

5 known vulnerabilities found in pinned dependencies.

How to fix:

Review the findings in the Security tab. Update the affected dependencies if a patched version is available.


debug info

CI timings

CI timings · View report · View job

Wall time 2m52s vs 8m5s (-64.5%). 7 job(s) slower, 15 faster, 2 unchanged.

  • OSV scan / Scan lockfiles / osv-scan: -41.0s
  • Check no committed infographics / check-no-committed-infographics: -40.0s
  • Python lints / ruff enforcement (blocking): -39.0s
  • Python tests / Generate slices: -38.0s
  • Python lints / Windows footguns (blocking): -38.0s

@alt-glitch alt-glitch added type/bug Something isn't working P2 Medium — degraded but workaround exists comp/tui Terminal UI (ui-tui/ + tui_gateway/) tool/tts Text-to-speech and transcription area/profiles Multi-profile isolation, HERMES_HOME scoping area/config Config system, migrations, profiles sweeper:risk-compatibility Sweeper risk: may break existing users, config, migrations, defaults, or upgrades labels Aug 14, 2026
read_user_config_raw (write-back round-trip; load_config would merge
DEFAULT_CONFIG and no-op the mirror) + save_config under the target
profile's HERMES_HOME override — same mechanism as _write_profile_model.
Satisfies test_config_read_guard.
@teknium1
teknium1 merged commit 486f4ac into main Aug 14, 2026
45 checks passed
@teknium1
teknium1 deleted the fix/profile-voice-config-mirror branch August 14, 2026 02:01
teknium1 added a commit that referenced this pull request Aug 14, 2026
…g.yaml existence (#86212)

profiles.create inherits the launch profile's provider+model when the
caller doesn't pin one — but the gate was 'config.yaml doesn't exist
yet'. Voice-section mirroring (#85755) runs FIRST and legitimately
creates config.yaml (tts/stt), so inheritance silently skipped for
every non-clone profile since: the bot's editor showed 'Inherit
(launch profile)' while the profile actually had NO model section,
and the first message failed with 'No inference provider configured'
even though the main agent was authenticated and working (Bot Mode
tester report, screenshots).

Gate on what we actually care about: the profile's own raw config
lacking a complete model section (provider+default). Clones bring
their own section and stay untouched; explicit pins unchanged.

E2E: create receipt now model_inherited=true and the fresh profile's
config.yaml carries the launch profile's provider/model.
skappafrost pushed a commit to skappafrost/hermes-agent that referenced this pull request Aug 15, 2026
…missing stt/tts config) (NousResearch#85755)

* fix: mirror voice config (stt/tts/voice) into profiles created via profiles.create

Desktop dictation is profile-scoped: /api/audio/transcribe resolves the
stt section inside the TARGET profile's home. Profiles created through
profiles.create got only a model section, so dictation and TTS silently
fell back to defaults (local whisper, often not installed) — 'voice
dictation doesn't work in bot mode but is fine in regular mode'.

Mirror the launch profile's stt/tts/voice sections (key-wise, never
overwriting sections the clone already has) under the same
mirror_credentials flag that gates .env/auth mirroring, and report it
as mirrored.voice in the receipt.

* guard: route voice-config mirror through canonical loaders

read_user_config_raw (write-back round-trip; load_config would merge
DEFAULT_CONFIG and no-op the mirror) + save_config under the target
profile's HERMES_HOME override — same mechanism as _write_profile_model.
Satisfies test_config_read_guard.
skappafrost pushed a commit to skappafrost/hermes-agent that referenced this pull request Aug 15, 2026
…g.yaml existence (NousResearch#86212)

profiles.create inherits the launch profile's provider+model when the
caller doesn't pin one — but the gate was 'config.yaml doesn't exist
yet'. Voice-section mirroring (NousResearch#85755) runs FIRST and legitimately
creates config.yaml (tts/stt), so inheritance silently skipped for
every non-clone profile since: the bot's editor showed 'Inherit
(launch profile)' while the profile actually had NO model section,
and the first message failed with 'No inference provider configured'
even though the main agent was authenticated and working (Bot Mode
tester report, screenshots).

Gate on what we actually care about: the profile's own raw config
lacking a complete model section (provider+default). Clones bring
their own section and stay untouched; explicit pins unchanged.

E2E: create receipt now model_inherited=true and the fresh profile's
config.yaml carries the launch profile's provider/model.
bobaba76 pushed a commit to bobaba76/hermes-agent that referenced this pull request Aug 27, 2026
…missing stt/tts config) (NousResearch#85755)

* fix: mirror voice config (stt/tts/voice) into profiles created via profiles.create

Desktop dictation is profile-scoped: /api/audio/transcribe resolves the
stt section inside the TARGET profile's home. Profiles created through
profiles.create got only a model section, so dictation and TTS silently
fell back to defaults (local whisper, often not installed) — 'voice
dictation doesn't work in bot mode but is fine in regular mode'.

Mirror the launch profile's stt/tts/voice sections (key-wise, never
overwriting sections the clone already has) under the same
mirror_credentials flag that gates .env/auth mirroring, and report it
as mirrored.voice in the receipt.

* guard: route voice-config mirror through canonical loaders

read_user_config_raw (write-back round-trip; load_config would merge
DEFAULT_CONFIG and no-op the mirror) + save_config under the target
profile's HERMES_HOME override — same mechanism as _write_profile_model.
Satisfies test_config_read_guard.
bobaba76 pushed a commit to bobaba76/hermes-agent that referenced this pull request Aug 27, 2026
…g.yaml existence (NousResearch#86212)

profiles.create inherits the launch profile's provider+model when the
caller doesn't pin one — but the gate was 'config.yaml doesn't exist
yet'. Voice-section mirroring (NousResearch#85755) runs FIRST and legitimately
creates config.yaml (tts/stt), so inheritance silently skipped for
every non-clone profile since: the bot's editor showed 'Inherit
(launch profile)' while the profile actually had NO model section,
and the first message failed with 'No inference provider configured'
even though the main agent was authenticated and working (Bot Mode
tester report, screenshots).

Gate on what we actually care about: the profile's own raw config
lacking a complete model section (provider+default). Clones bring
their own section and stay untouched; explicit pins unchanged.

E2E: create receipt now model_inherited=true and the fresh profile's
config.yaml carries the launch profile's provider/model.
melon-xf added a commit to melon-xf/hermes-agent that referenced this pull request Sep 3, 2026
…missing stt/tts config) (NousResearch#85755)

* fix: mirror voice config (stt/tts/voice) into profiles created via profiles.create

Desktop dictation is profile-scoped: /api/audio/transcribe resolves the
stt section inside the TARGET profile's home. Profiles created through
profiles.create got only a model section, so dictation and TTS silently
fell back to defaults (local whisper, often not installed) — 'voice
dictation doesn't work in bot mode but is fine in regular mode'.

Mirror the launch profile's stt/tts/voice sections (key-wise, never
overwriting sections the clone already has) under the same
mirror_credentials flag that gates .env/auth mirroring, and report it
as mirrored.voice in the receipt.

* guard: route voice-config mirror through canonical loaders

read_user_config_raw (write-back round-trip; load_config would merge
DEFAULT_CONFIG and no-op the mirror) + save_config under the target
profile's HERMES_HOME override — same mechanism as _write_profile_model.
Satisfies test_config_read_guard.
melon-xf added a commit to melon-xf/hermes-agent that referenced this pull request Sep 3, 2026
…g.yaml existence (NousResearch#86212)

profiles.create inherits the launch profile's provider+model when the
caller doesn't pin one — but the gate was 'config.yaml doesn't exist
yet'. Voice-section mirroring (NousResearch#85755) runs FIRST and legitimately
creates config.yaml (tts/stt), so inheritance silently skipped for
every non-clone profile since: the bot's editor showed 'Inherit
(launch profile)' while the profile actually had NO model section,
and the first message failed with 'No inference provider configured'
even though the main agent was authenticated and working (Bot Mode
tester report, screenshots).

Gate on what we actually care about: the profile's own raw config
lacking a complete model section (provider+default). Clones bring
their own section and stay untouched; explicit pins unchanged.

E2E: create receipt now model_inherited=true and the fresh profile's
config.yaml carries the launch profile's provider/model.
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 area/profiles Multi-profile isolation, HERMES_HOME scoping comp/tui Terminal UI (ui-tui/ + tui_gateway/) P2 Medium — degraded but workaround exists sweeper:risk-compatibility Sweeper risk: may break existing users, config, migrations, defaults, or upgrades tool/tts Text-to-speech and transcription type/bug Something isn't working

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants