fix(types): admit None on settings fields that accept it as a default

Service-specific Settings subclasses declared fields as T | _NotGiven
(no None), but the services routinely pass None to those fields during
init to mean "don't override — use the vendor's default". The field
type just didn't reflect that a None value is valid, so pyright
flagged every None at the call sites.

Change the declarations to T | None | _NotGiven, matching the pattern
already used by ServiceSettings.model and TTSSettings.language. No
constructor-call changes; the default_factory stays NOT_GIVEN.

Fields touched across 11 files:

- services/settings.py: TTSSettings.voice (base class; covers
  asyncai, cartesia, elevenlabs, fish, hume, kokoro, lmnt, mistral,
  neuphonic, piper, resembleai, rime, xtts TTS services).
- services/aws/llm.py: latency.
- services/aws/tts.py: engine, pitch, rate, volume, lexicon_names.
- services/azure/tts.py: emphasis, pitch, rate, role, style,
  style_degree, volume.
- services/google/gemini_live/llm.py: vad.
- services/google/llm.py: thinking.
- services/google/stt.py: language_codes.
- services/inworld/tts.py: speaking_rate, temperature.
- services/openai/tts.py: instructions, speed.
- services/speechmatics/stt.py: 13 fields (domain, operating_point,
  max_delay, end_of_utterance_*, punctuation_overrides, *_partials,
  split_sentences, enable_diarization, speaker_*, max_speakers,
  prefer_current_speaker, extra_params).
- services/ultravox/llm.py: output_medium.

Clears 94 pyright errors (1035 -> 941).
This commit is contained in:
Paul Kompfner
2026-04-23 18:06:54 -04:00
parent 92610944af
commit b9ff333654
11 changed files with 39 additions and 35 deletions

View File

@@ -67,7 +67,7 @@ class AWSBedrockLLMSettings(LLMSettings):
"""
stop_sequences: list[str] | None | _NotGiven = field(default_factory=lambda: NOT_GIVEN)
latency: str | _NotGiven = field(default_factory=lambda: NOT_GIVEN)
latency: str | None | _NotGiven = field(default_factory=lambda: NOT_GIVEN)
enable_prompt_caching: bool | _NotGiven = field(default_factory=lambda: NOT_GIVEN)
additional_model_request_fields: dict[str, Any] | _NotGiven = field(
default_factory=lambda: NOT_GIVEN

View File

@@ -133,11 +133,11 @@ class AWSPollyTTSSettings(TTSSettings):
lexicon_names: List of pronunciation lexicons to apply.
"""
engine: str | _NotGiven = field(default_factory=lambda: NOT_GIVEN)
pitch: str | _NotGiven = field(default_factory=lambda: NOT_GIVEN)
rate: str | _NotGiven = field(default_factory=lambda: NOT_GIVEN)
volume: str | _NotGiven = field(default_factory=lambda: NOT_GIVEN)
lexicon_names: list[str] | _NotGiven = field(default_factory=lambda: NOT_GIVEN)
engine: str | None | _NotGiven = field(default_factory=lambda: NOT_GIVEN)
pitch: str | None | _NotGiven = field(default_factory=lambda: NOT_GIVEN)
rate: str | None | _NotGiven = field(default_factory=lambda: NOT_GIVEN)
volume: str | None | _NotGiven = field(default_factory=lambda: NOT_GIVEN)
lexicon_names: list[str] | None | _NotGiven = field(default_factory=lambda: NOT_GIVEN)
class AWSPollyTTSService(TTSService):

View File

@@ -80,13 +80,13 @@ class AzureTTSSettings(TTSSettings):
volume: Volume level (e.g., "+20%", "loud", "x-soft").
"""
emphasis: str | _NotGiven = field(default_factory=lambda: NOT_GIVEN)
pitch: str | _NotGiven = field(default_factory=lambda: NOT_GIVEN)
rate: str | _NotGiven = field(default_factory=lambda: NOT_GIVEN)
role: str | _NotGiven = field(default_factory=lambda: NOT_GIVEN)
style: str | _NotGiven = field(default_factory=lambda: NOT_GIVEN)
style_degree: str | _NotGiven = field(default_factory=lambda: NOT_GIVEN)
volume: str | _NotGiven = field(default_factory=lambda: NOT_GIVEN)
emphasis: str | None | _NotGiven = field(default_factory=lambda: NOT_GIVEN)
pitch: str | None | _NotGiven = field(default_factory=lambda: NOT_GIVEN)
rate: str | None | _NotGiven = field(default_factory=lambda: NOT_GIVEN)
role: str | None | _NotGiven = field(default_factory=lambda: NOT_GIVEN)
style: str | None | _NotGiven = field(default_factory=lambda: NOT_GIVEN)
style_degree: str | None | _NotGiven = field(default_factory=lambda: NOT_GIVEN)
volume: str | None | _NotGiven = field(default_factory=lambda: NOT_GIVEN)
class AzureBaseTTSService:

View File

@@ -342,7 +342,7 @@ class GeminiLiveLLMSettings(LLMSettings):
modalities: GeminiModalities | _NotGiven = field(default_factory=lambda: NOT_GIVEN)
language: Language | str | _NotGiven = field(default_factory=lambda: NOT_GIVEN)
media_resolution: GeminiMediaResolution | _NotGiven = field(default_factory=lambda: NOT_GIVEN)
vad: GeminiVADParams | _NotGiven = field(default_factory=lambda: NOT_GIVEN)
vad: GeminiVADParams | None | _NotGiven = field(default_factory=lambda: NOT_GIVEN)
context_window_compression: ContextWindowCompressionParams | dict | _NotGiven = field(
default_factory=lambda: NOT_GIVEN
)

View File

@@ -107,7 +107,7 @@ class GoogleLLMSettings(LLMSettings):
thinking: Thinking configuration.
"""
thinking: Union["GoogleLLMService.ThinkingConfig", _NotGiven] = field(
thinking: Union["GoogleLLMService.ThinkingConfig", None, _NotGiven] = field(
default_factory=lambda: NOT_GIVEN
)

View File

@@ -385,7 +385,7 @@ class GoogleSTTSettings(STTSettings):
"""
languages: list[Language] | _NotGiven = field(default_factory=lambda: NOT_GIVEN)
language_codes: list[str] | _NotGiven = field(default_factory=lambda: NOT_GIVEN)
language_codes: list[str] | None | _NotGiven = field(default_factory=lambda: NOT_GIVEN)
use_separate_recognition_per_channel: bool | _NotGiven = field(
default_factory=lambda: NOT_GIVEN
)

View File

@@ -72,8 +72,8 @@ class InworldTTSSettings(TTSSettings):
temperature: Temperature for speech synthesis.
"""
speaking_rate: float | _NotGiven = field(default_factory=lambda: NOT_GIVEN)
temperature: float | _NotGiven = field(default_factory=lambda: NOT_GIVEN)
speaking_rate: float | None | _NotGiven = field(default_factory=lambda: NOT_GIVEN)
temperature: float | None | _NotGiven = field(default_factory=lambda: NOT_GIVEN)
_aliases: ClassVar[dict[str, str]] = {
"voiceId": "voice",

View File

@@ -70,8 +70,8 @@ class OpenAITTSSettings(TTSSettings):
speed: Voice speed control (0.25 to 4.0, default 1.0).
"""
instructions: str | _NotGiven = field(default_factory=lambda: NOT_GIVEN)
speed: float | _NotGiven = field(default_factory=lambda: NOT_GIVEN)
instructions: str | None | _NotGiven = field(default_factory=lambda: NOT_GIVEN)
speed: float | None | _NotGiven = field(default_factory=lambda: NOT_GIVEN)
class OpenAITTSService(TTSService):

View File

@@ -440,7 +440,7 @@ class TTSSettings(ServiceSettings):
``__init__`` methods do the same at construction time.
"""
voice: str | _NotGiven = field(default_factory=lambda: NOT_GIVEN)
voice: str | None | _NotGiven = field(default_factory=lambda: NOT_GIVEN)
language: Language | str | None | _NotGiven = field(default_factory=lambda: NOT_GIVEN)
_aliases: ClassVar[dict[str, str]] = {"voice_id": "voice"}

View File

@@ -114,7 +114,7 @@ class SpeechmaticsSTTSettings(STTSettings):
extra_params: Extra parameters for the STT engine.
"""
domain: str | _NotGiven = field(default_factory=lambda: NOT_GIVEN)
domain: str | None | _NotGiven = field(default_factory=lambda: NOT_GIVEN)
turn_detection_mode: TurnDetectionMode | _NotGiven = field(default_factory=lambda: NOT_GIVEN)
speaker_active_format: str | _NotGiven = field(default_factory=lambda: NOT_GIVEN)
speaker_passive_format: str | _NotGiven = field(default_factory=lambda: NOT_GIVEN)
@@ -125,18 +125,22 @@ class SpeechmaticsSTTSettings(STTSettings):
additional_vocab: list[AdditionalVocabEntry] | _NotGiven = field(
default_factory=lambda: NOT_GIVEN
)
operating_point: OperatingPoint | _NotGiven = field(default_factory=lambda: NOT_GIVEN)
max_delay: float | _NotGiven = field(default_factory=lambda: NOT_GIVEN)
end_of_utterance_silence_trigger: float | _NotGiven = field(default_factory=lambda: NOT_GIVEN)
end_of_utterance_max_delay: float | _NotGiven = field(default_factory=lambda: NOT_GIVEN)
punctuation_overrides: dict[str, Any] | _NotGiven = field(default_factory=lambda: NOT_GIVEN)
include_partials: bool | _NotGiven = field(default_factory=lambda: NOT_GIVEN)
split_sentences: bool | _NotGiven = field(default_factory=lambda: NOT_GIVEN)
enable_diarization: bool | _NotGiven = field(default_factory=lambda: NOT_GIVEN)
speaker_sensitivity: float | _NotGiven = field(default_factory=lambda: NOT_GIVEN)
max_speakers: int | _NotGiven = field(default_factory=lambda: NOT_GIVEN)
prefer_current_speaker: bool | _NotGiven = field(default_factory=lambda: NOT_GIVEN)
extra_params: dict[str, Any] | _NotGiven = field(default_factory=lambda: NOT_GIVEN)
operating_point: OperatingPoint | None | _NotGiven = field(default_factory=lambda: NOT_GIVEN)
max_delay: float | None | _NotGiven = field(default_factory=lambda: NOT_GIVEN)
end_of_utterance_silence_trigger: float | None | _NotGiven = field(
default_factory=lambda: NOT_GIVEN
)
end_of_utterance_max_delay: float | None | _NotGiven = field(default_factory=lambda: NOT_GIVEN)
punctuation_overrides: dict[str, Any] | None | _NotGiven = field(
default_factory=lambda: NOT_GIVEN
)
include_partials: bool | None | _NotGiven = field(default_factory=lambda: NOT_GIVEN)
split_sentences: bool | None | _NotGiven = field(default_factory=lambda: NOT_GIVEN)
enable_diarization: bool | None | _NotGiven = field(default_factory=lambda: NOT_GIVEN)
speaker_sensitivity: float | None | _NotGiven = field(default_factory=lambda: NOT_GIVEN)
max_speakers: int | None | _NotGiven = field(default_factory=lambda: NOT_GIVEN)
prefer_current_speaker: bool | None | _NotGiven = field(default_factory=lambda: NOT_GIVEN)
extra_params: dict[str, Any] | None | _NotGiven = field(default_factory=lambda: NOT_GIVEN)
#: Fields that can be updated on a live connection via the Speechmatics
#: diarization-config API — no reconnect needed.

View File

@@ -67,7 +67,7 @@ class UltravoxRealtimeLLMSettings(LLMSettings):
output_medium: The output medium for the model ("voice" or "text").
"""
output_medium: str | _NotGiven = field(default=NOT_GIVEN)
output_medium: str | None | _NotGiven = field(default=NOT_GIVEN)
class AgentInputParams(BaseModel):