fix: voice dictation broken in profiles created via profiles.create (missing stt/tts config) - #85755
Merged
Merged
Conversation
…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.
Contributor
૮ >ﻌ< ა ci reviewran on d551f86 — 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.
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.
1 task
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.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Desktop dictation is profile-scoped:
/api/audio/transcriberunstranscribe_recordingunder_config_profile_scope(profile), resolving thesttsection from the TARGET profile's config.yaml. Profiles created viaprofiles.create(#85093) get only amodelsection — 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/voiceconfig sections into the new profile, key-wise (sections a clone already carries are never overwritten), gated on the samemirror_credentialsflag as .env/auth mirroring, reported asmirrored.voice.Verified live: profiles.create → new profile's config.yaml carries stt+tts+model → cleanup. Same pattern as the #85111 credential mirroring.