Conversation
voice.auto_tts is a global default written by Desktop Read replies aloud. The runner applied it to every adapter with no /voice mode, including A2A, which has no send_voice and fails delivery with an audio-attachment error. Keep A2A text-only. Human platforms still honor the global default and per-chat /voice. Fixes NousResearch#90103
Local verification (official runner)Isolated worktree on That file includes the new Isolated smoke of
OverlapTriage on #90103 pointed at #80313, which disables auto-TTS inside Happy to close this as overlapping if maintainers prefer the adapter-only fix. CI on this fork did not start jobs ( |
mooserini
left a comment
There was a problem hiding this comment.
This has again been checked, tested and verified locally.
|
Sequencing heads-up: this is PR 1 of a 3-PR voice/Photon fix arc — #90121 (this: gateway shouldn't auto-TTS A2A replies) → #91129 (inbound CAF detection + ffmpeg-static dep) → #91215 (migrate sidecar to Spectrum 12.8.0, remove obsolete v8 patch). #91129 is the small, safe wedge ready to land next; #91215 is the larger migration that depends on it. Flagging so the three are reviewed as one campaign rather than three unrelated drops. |
Textbook scoped-default fix: the runner-level early return stops the synthesis at the decision point, the adapter-sync override stops a stale Points:
|
Field reproduction on latest upstream (2026-09-05) — still unfixed, with an extra angleConfirming the issue is still live on current main. This is the second independent repro alongside #90103, and it adds a resource-impact reason to merge this PR. Environment
Repro (2026-09-05, four hours ago) Exact Extra impact beyond text-delivery failure — TTS engine resource burn
Each inbound A2A message burns a full TTS generation against the shared engine ( Local patch we are running (adapter-layer, verified) # plugins/platforms/a2a/adapter.py
def _should_auto_tts_for_chat(self, chat_id: str) -> bool:
"""A2A is a text-only agent protocol — never auto-TTS agent-to-agent replies."""
return False
The PR's two changes (skip in cc maintainers: this is worth sweeping against any adapter without a native |
Summary
Desktop Read replies aloud persists
voice.auto_ttsas a global gateway default. The runner then treats that default as “speak every reply on every platform that has no/voicemode.”A2A inbound is
MessageType.TEXT. The A2A adapter has no nativesend_voice. Result: a completed text reply is synthesized totts_reply_*.mp3, then:The peer sees a failed audio attachment instead of the text. Observed on v0.20.4 after an update flipped
auto_ttstrue; earlier A2A text deliveries on the same hosts were clean.Change
_should_send_voice_replyreturnsFalsefor platforma2a._sync_voice_mode_state_to_adapternever copies the global default onto the A2A adapter.adapter_auto_tts=Truestays text; Telegram with the same default still voices./voice on//voice ttson Discord/Telegram are unchanged.Test plan
_should_send_voice_replyTrue; after → False; Telegram still True.test_should_send_voice_reply_a2a_ignores_global_auto_ttspasses.Field report + logs: #90103