Repository navigation
fix(gateway): Deepgram defaults (unset language, Nova-only detection, Aura default voice); default fillers - #17
Merged
Merged
Conversation
…ova-3/Nova-2 A voice agent with no language on a Deepgram `base` deployment failed every session: "Failed to start voice manager: STT error: Connection failed: Connection channel closed", after Deepgram answered the handshake with 400 for `model=base&language=multi`. - An empty language resolved to auto, and a vendor that can detect got its auto token. Nothing chosen is not a choice of detection: where the vendor can detect, an unset language is now left out and the vendor's own default applies. - Deepgram's auto token `multi` is refused by every model but Nova-3 and Nova-2. An explicit auto on another model is left out with a warning instead of failing the handshake. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…amily's default voice Retesting the bud-dev agent with the language fix, every sentence then failed: "deepgram rejected the request (400 Bad Request): Invalid 'model' value of 'aura-2'". The deployment is published under the family `aura-2` and the agent keeps the vendor-default voice, so nothing named a voice and the family went out as Deepgram's model, which it never accepts. A bare family (`aura-2`, `aura`) with no voice now resolves to Deepgram's default voice for it (`aura-2-thalia-en`, `aura-asteria-en`). A chosen voice and a deployment published under a full voice id are unchanged. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…nt.", "Still checking..." Matches budapp's new DEFAULT_FILLER_MESSAGES (bud-runtime#3126). budapp always publishes the full fillers block, so this default applies only to a projection without one; the shared fixture is budapp's regenerated copy. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…s flags Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ead, not the process The coverage run failed TC-WS-13 with "invalid app state config: Invalid WAAV_EAGER_WARMUP environment variable": a #[serial] test had set WAAV_EAGER_WARMUP=sometimes in the shared environment, and #[serial] only orders it against other #[serial] tests, so a parallel test's AppState read it. Three tests did this (WAAV_EAGER_WARMUP, WAAV_MAX_CONCURRENT_RECONNECTS). Runtime settings are now read through runtime_env(), which in test builds looks at a per-thread override first; those tests set the malformed value for their own thread only. A new test shows another thread does not see it. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
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.
Problem
On bud-dev (WaaV 0.1.7), every session of a voice agent with no language set failed with:
The log shows Deepgram refused the handshake:
Failed to connect to Deepgram: HTTP error: 400 Bad RequestforThe agent had no language and neither did its STT deployment (
deepgram, modelbase). Yet WaaV sentlanguage=multi, Deepgram's code-switching token, which only Nova-3 and Nova-2 accept.Cause
map_language("")resolves an empty string toCanonicalLanguage::Auto, and a vendor that can detect the language gets its auto token. For Deepgram that token ismulti, regardless of the model. So "nothing chosen" became "detect", and any Deepgram deployment whose model isn't Nova-3 or Nova-2 failed the handshake.Fix
core/lang::map_language), and the vendor's own default applies. This matches the rule the Deepgram URL builder already states: send only what the caller chose. Vendors that can't detect behave as before.nova-3,nova-3-general,nova-2andnova-2-general. An explicit auto on any other model is left out with a warning (which/wssurfaces as aconfig_warning) instead of a 400.Named languages are unchanged.
Second fix, found on retest: Aura family deployment with no voice
With the language fix live on bud-dev, the same agent got past STT, and then every sentence failed:
The TTS deployment is published under the family name
aura-2, and the agent keeps the vendor-default voice. With nothing naming a voice, the family went out as Deepgram'smodel, which Deepgram never accepts for a family. A bare family (aura-2,aura) with no voice now resolves to Deepgram's default voice for that family:aura-2-thalia-enoraura-asteria-en. A chosen voice, and a deployment published under a full voice id, are unchanged.Default filler script
AgentFillers::default()is now"Hmm...","One moment.","Still checking...", matching budapp's newDEFAULT_FILLER_MESSAGES(BudEcosystem/bud-runtime#3126). budapp always publishes the full fillers block, so this default only applies to a projection that lacks one.bud-auth/tests/fixtures/voice_agent_entry.jsonis budapp's regenerated copy, byte for byte.Testing
New tests:
an_unset_language_is_left_out_not_sent_as_detectiondeepgram_detects_only_on_the_models_that_candeepgram+base+ empty language, inp2_stt_auto_becomes_provider_default_or_native_token.a_family_with_no_voice_speaks_in_its_default_voice.cd bud-auth && cargo test: 202 passed).Mutation checks: removing either part of the language fix, or the family default, fails its tests.
🤖 Generated with Claude Code