Conversation
Campaign contextThis is one of four PRs in a single voice + Photon improvement campaign:
Why this one matters for everyoneA model (or a leaked platform hint) could previously route speech through a different backend than the operator configured in See the campaign framing comment on #91215 for the full picture and the low-friction review path. |
|
Closing as duplicate of #90120. Same fix, narrower coverage. #90120 does the same schema/handler removal and Mine was correct but partial: it guarded the model-facing boundary cleanly Reopening note for anyone browsing: the model-facing invariant still held |
Summary
Closes #90109.
tts.providerinconfig.yamlis the operator's only backend selector, but thetext_to_speechtool schema advertised a per-callprovideroverride and the registered handler forwarded it. A model (or a leaked platform hint) could route speech through a different backend than the one the operator set — the inverse of what operators expect fromconfig.yaml.This PR enforces config-as-authority:
provideris removed from the model-facingTTS_SCHEMAparameters.provider=None; the configuredtts.provideris the only selector.This matches how STT, model, and most other Hermes knobs already work: config is authoritative, the schema does not invite override.
Scope clarification
This is the standalone fix for the
tts.providerauthority gap. It does not touchvoice.auto_tts(that is #90103 / PR #90121) — different leak, different surface.Verification
New regression suite
tests/tools/test_tts_provider_authority.py(74 lines, 4 cases):providerarg from model payloads;providerproperty.Contract-style assertions (invariants on what crosses the boundary), not change-detector snapshots.
Test plan
pytest tests/tools/test_tts_provider_authority.py -q(4 passed locally)python3 -m py_compile tools/tts_tool.py tests/tools/test_tts_provider_authority.pygit diff origin/main..HEAD --statconfirms only the schema/handler change + testThis is a fork PR, so workflows don't start until a maintainer clicks "Approve and run workflows" on the first run. @teknium1 @shannonsands — this closes the second voice/authority issue (#90109) independently of the A2A auto-TTS and Photon Spectrum 12 campaigns; happy to fold it into a combined voice PR if you prefer fewer drops.