Add settings as canonical init arg for all AIService descendants, deprecate redundant model/voice/params args

ServiceSettings types were introduced for runtime updates via ServiceUpdateSettingsFrame, but there was tension between init-time and runtime APIs: overlapping-but-different InputParams vs ServiceSettings classes, and runtime-updatable fields like `model` and `voice` scattered as direct init args rather than living in a settings object. This unifies them so developers use the same settings type at both init and runtime, improving ergonomics and consistency.

Every concrete AIService subclass (LLM, TTS, STT, ImageGen, Vision, Video) now accepts a `settings` parameter for runtime-updatable config. Old init args (`model`, `voice_id`, `params`/`InputParams`) still work but emit DeprecationWarnings pointing to the new API. When both are provided, `settings` takes precedence. Leaf classes emit warnings; base classes do not, avoiding double warnings in inheritance chains.
This commit is contained in:
Paul Kompfner
2026-02-27 21:46:03 -05:00
committed by Mark Backman
parent 691d1d309e
commit 398db55ec6
84 changed files with 3431 additions and 1182 deletions

View File

@@ -58,7 +58,7 @@ from pipecat.processors.aggregators.openai_llm_context import (
from pipecat.processors.frame_processor import FrameDirection
from pipecat.services.llm_service import FunctionCallFromLLM, LLMService
from pipecat.services.settings import NOT_GIVEN as _NOT_GIVEN
from pipecat.services.settings import LLMSettings, _NotGiven, is_given
from pipecat.services.settings import LLMSettings, _NotGiven, _warn_deprecated_param, is_given
from pipecat.utils.tracing.service_decorators import traced_llm
try:
@@ -170,6 +170,10 @@ class AnthropicLLMService(LLMService):
class InputParams(BaseModel):
"""Input parameters for Anthropic model inference.
.. deprecated::
Use ``AnthropicLLMSettings`` instead. Pass settings directly via the
``settings`` parameter of :class:`AnthropicLLMService`.
Parameters:
enable_prompt_caching: Whether to enable the prompt caching feature.
enable_prompt_caching_beta (deprecated): Whether to enable the beta prompt caching feature.
@@ -213,8 +217,9 @@ class AnthropicLLMService(LLMService):
self,
*,
api_key: str,
model: str = "claude-sonnet-4-6",
model: Optional[str] = None,
params: Optional[InputParams] = None,
settings: Optional[AnthropicLLMSettings] = None,
client=None,
retry_timeout_secs: Optional[float] = 5.0,
retry_on_timeout: Optional[bool] = False,
@@ -225,42 +230,66 @@ class AnthropicLLMService(LLMService):
Args:
api_key: Anthropic API key for authentication.
model: Model name to use. Defaults to "claude-sonnet-4-6".
model: Model name to use.
.. deprecated::
Use ``settings=AnthropicLLMSettings(model=...)`` instead.
params: Optional model parameters for inference.
.. deprecated::
Use ``settings=AnthropicLLMSettings(...)`` instead.
settings: Runtime-updatable settings for this service. When both
deprecated parameters and *settings* are provided, *settings*
values take precedence.
client: Optional custom Anthropic client instance.
retry_timeout_secs: Request timeout in seconds for retry logic.
retry_on_timeout: Whether to retry the request once if it times out.
system_instruction: Optional system instruction to use as the system prompt.
**kwargs: Additional arguments passed to parent LLMService.
"""
params = params or AnthropicLLMService.InputParams()
if model is not None:
_warn_deprecated_param("model", "AnthropicLLMSettings", "model")
if params is not None:
_warn_deprecated_param("params", "AnthropicLLMSettings")
super().__init__(
settings=AnthropicLLMSettings(
model=model,
max_tokens=params.max_tokens,
enable_prompt_caching=(
params.enable_prompt_caching
if params.enable_prompt_caching is not None
else (
params.enable_prompt_caching_beta
if params.enable_prompt_caching_beta is not None
else False
)
),
temperature=params.temperature,
top_k=params.top_k,
top_p=params.top_p,
frequency_penalty=None,
presence_penalty=None,
seed=None,
filter_incomplete_user_turns=False,
user_turn_completion_config=None,
thinking=params.thinking,
extra=params.extra if isinstance(params.extra, dict) else {},
),
**kwargs,
_params = params or AnthropicLLMService.InputParams()
# Handle existing enable_prompt_caching_beta deprecation
enable_prompt_caching = _params.enable_prompt_caching
if _params.enable_prompt_caching_beta is not None:
import warnings
with warnings.catch_warnings():
warnings.simplefilter("always")
warnings.warn(
"enable_prompt_caching_beta is deprecated. Use enable_prompt_caching instead.",
DeprecationWarning,
stacklevel=2,
)
if enable_prompt_caching is None:
enable_prompt_caching = _params.enable_prompt_caching_beta
default_settings = AnthropicLLMSettings(
model=model or "claude-sonnet-4-6",
max_tokens=_params.max_tokens,
enable_prompt_caching=enable_prompt_caching or False,
temperature=_params.temperature,
top_k=_params.top_k,
top_p=_params.top_p,
frequency_penalty=None,
presence_penalty=None,
seed=None,
filter_incomplete_user_turns=False,
user_turn_completion_config=None,
thinking=_params.thinking,
extra=_params.extra if isinstance(_params.extra, dict) else {},
)
if settings is not None:
default_settings.apply_update(settings)
super().__init__(settings=default_settings, **kwargs)
self._client = client or AsyncAnthropic(
api_key=api_key
) # if the client is provided, use it and remove it, otherwise create a new one

View File

@@ -114,6 +114,7 @@ class AssemblyAISTTService(WebsocketSTTService):
vad_force_turn_endpoint: bool = True,
should_interrupt: bool = True,
speaker_format: Optional[str] = None,
settings: Optional[AssemblyAISTTSettings] = None,
ttfs_p99_latency: Optional[float] = ASSEMBLYAI_TTFS_P99,
**kwargs,
):
@@ -144,6 +145,8 @@ class AssemblyAISTTService(WebsocketSTTService):
Use {speaker} for speaker label and {text} for transcript text.
Example: "<{speaker}>{text}</{speaker}>" or "{speaker}: {text}"
If None, transcript text is not modified. Defaults to None.
settings: Runtime-updatable settings. When provided alongside other
parameters, ``settings`` values take precedence.
ttfs_p99_latency: P99 latency from speech end to final transcript in seconds.
Override for your deployment. See https://github.com/pipecat-ai/stt-benchmark
**kwargs: Additional arguments passed to parent STTService class.
@@ -185,14 +188,18 @@ class AssemblyAISTTService(WebsocketSTTService):
if vad_force_turn_endpoint:
connection_params = self._configure_pipecat_turn_mode(connection_params, is_u3_pro)
default_settings = AssemblyAISTTSettings(
model=None,
language=language,
connection_params=connection_params,
)
if settings is not None:
default_settings.apply_update(settings)
super().__init__(
sample_rate=connection_params.sample_rate,
ttfs_p99_latency=ttfs_p99_latency,
settings=AssemblyAISTTSettings(
model=None,
language=language,
connection_params=connection_params,
),
settings=default_settings,
**kwargs,
)

View File

@@ -27,7 +27,7 @@ from pipecat.frames.frames import (
TTSStoppedFrame,
)
from pipecat.processors.frame_processor import FrameDirection
from pipecat.services.settings import NOT_GIVEN, TTSSettings, _NotGiven
from pipecat.services.settings import NOT_GIVEN, TTSSettings, _NotGiven, _warn_deprecated_param
from pipecat.services.tts_service import AudioContextTTSService, TextAggregationMode, TTSService
from pipecat.transcriptions.language import Language, resolve_language
from pipecat.utils.tracing.service_decorators import traced_tts
@@ -110,6 +110,9 @@ class AsyncAITTSService(AudioContextTTSService):
class InputParams(BaseModel):
"""Input parameters for Async TTS configuration.
.. deprecated:: 1.0
Use ``AsyncAITTSSettings`` directly via the ``settings`` parameter instead.
Parameters:
language: Language to use for synthesis.
"""
@@ -120,14 +123,15 @@ class AsyncAITTSService(AudioContextTTSService):
self,
*,
api_key: str,
voice_id: str,
voice_id: Optional[str] = None,
version: str = "v1",
url: str = "wss://api.async.com/text_to_speech/websocket/ws",
model: str = "async_flash_v1.0",
model: Optional[str] = None,
sample_rate: Optional[int] = None,
encoding: str = "pcm_s16le",
container: str = "raw",
params: Optional[InputParams] = None,
settings: Optional[AsyncAITTSSettings] = None,
aggregate_sentences: Optional[bool] = None,
text_aggregation_mode: Optional[TextAggregationMode] = None,
**kwargs,
@@ -138,13 +142,27 @@ class AsyncAITTSService(AudioContextTTSService):
api_key: Async API key.
voice_id: UUID of the voice to use for synthesis. See docs for a full list:
https://docs.async.com/list-voices-16699698e0
.. deprecated:: 1.0
Use ``settings=AsyncAITTSSettings(voice=...)`` instead.
version: Async API version.
url: WebSocket URL for Async TTS API.
model: TTS model to use (e.g., "async_flash_v1.0").
.. deprecated:: 1.0
Use ``settings=AsyncAITTSSettings(model=...)`` instead.
sample_rate: Audio sample rate.
encoding: Audio encoding format.
container: Audio container format.
params: Additional input parameters for voice customization.
.. deprecated:: 1.0
Use ``settings=AsyncAITTSSettings(...)`` instead.
settings: Runtime-updatable settings. When provided alongside deprecated
parameters, ``settings`` values take precedence.
aggregate_sentences: Deprecated. Use text_aggregation_mode instead.
.. deprecated:: 0.0.104
@@ -153,7 +171,27 @@ class AsyncAITTSService(AudioContextTTSService):
text_aggregation_mode: How to aggregate text before synthesis.
**kwargs: Additional arguments passed to the parent service.
"""
params = params or AsyncAITTSService.InputParams()
if voice_id is not None:
_warn_deprecated_param("voice_id", "AsyncAITTSSettings", "voice")
if model is not None:
_warn_deprecated_param("model", "AsyncAITTSSettings", "model")
if params is not None:
_warn_deprecated_param("params", "AsyncAITTSSettings")
_params = params or AsyncAITTSService.InputParams()
default_settings = AsyncAITTSSettings(
model=model or "async_flash_v1.0",
voice=voice_id,
output_container=container,
output_encoding=encoding,
output_sample_rate=0,
language=self.language_to_service_language(_params.language)
if _params.language
else None,
)
if settings is not None:
default_settings.apply_update(settings)
super().__init__(
aggregate_sentences=aggregate_sentences,
@@ -161,16 +199,7 @@ class AsyncAITTSService(AudioContextTTSService):
pause_frame_processing=True,
push_stop_frames=True,
sample_rate=sample_rate,
settings=AsyncAITTSSettings(
model=model,
voice=voice_id,
output_container=container,
output_encoding=encoding,
output_sample_rate=0,
language=self.language_to_service_language(params.language)
if params.language
else None,
),
settings=default_settings,
**kwargs,
)
@@ -471,6 +500,9 @@ class AsyncAIHttpTTSService(TTSService):
class InputParams(BaseModel):
"""Input parameters for Async API.
.. deprecated:: 1.0
Use ``AsyncAITTSSettings`` directly via the ``settings`` parameter instead.
Parameters:
language: Language to use for synthesis.
"""
@@ -481,15 +513,16 @@ class AsyncAIHttpTTSService(TTSService):
self,
*,
api_key: str,
voice_id: str,
voice_id: Optional[str] = None,
aiohttp_session: aiohttp.ClientSession,
model: str = "async_flash_v1.0",
model: Optional[str] = None,
url: str = "https://api.async.com",
version: str = "v1",
sample_rate: Optional[int] = None,
encoding: str = "pcm_s16le",
container: str = "raw",
params: Optional[InputParams] = None,
settings: Optional[AsyncAITTSSettings] = None,
**kwargs,
):
"""Initialize the Async TTS service.
@@ -497,30 +530,55 @@ class AsyncAIHttpTTSService(TTSService):
Args:
api_key: Async API key.
voice_id: ID of the voice to use for synthesis.
.. deprecated:: 1.0
Use ``settings=AsyncAITTSSettings(voice=...)`` instead.
aiohttp_session: An aiohttp session for making HTTP requests.
model: TTS model to use (e.g., "async_flash_v1.0").
.. deprecated:: 1.0
Use ``settings=AsyncAITTSSettings(model=...)`` instead.
url: Base URL for Async API.
version: API version string for Async API.
sample_rate: Audio sample rate.
encoding: Audio encoding format.
container: Audio container format.
params: Additional input parameters for voice customization.
.. deprecated:: 1.0
Use ``settings=AsyncAITTSSettings(...)`` instead.
settings: Runtime-updatable settings. When provided alongside deprecated
parameters, ``settings`` values take precedence.
**kwargs: Additional arguments passed to the parent TTSService.
"""
params = params or AsyncAIHttpTTSService.InputParams()
if voice_id is not None:
_warn_deprecated_param("voice_id", "AsyncAITTSSettings", "voice")
if model is not None:
_warn_deprecated_param("model", "AsyncAITTSSettings", "model")
if params is not None:
_warn_deprecated_param("params", "AsyncAITTSSettings")
_params = params or AsyncAIHttpTTSService.InputParams()
default_settings = AsyncAITTSSettings(
model=model or "async_flash_v1.0",
voice=voice_id,
output_container=container,
output_encoding=encoding,
output_sample_rate=0,
language=self.language_to_service_language(_params.language)
if _params.language
else None,
)
if settings is not None:
default_settings.apply_update(settings)
super().__init__(
sample_rate=sample_rate,
settings=AsyncAITTSSettings(
model=model,
voice=voice_id,
output_container=container,
output_encoding=encoding,
output_sample_rate=0,
language=self.language_to_service_language(params.language)
if params.language
else None,
),
settings=default_settings,
**kwargs,
)

View File

@@ -55,7 +55,7 @@ from pipecat.processors.aggregators.openai_llm_context import (
)
from pipecat.processors.frame_processor import FrameDirection
from pipecat.services.llm_service import LLMService
from pipecat.services.settings import NOT_GIVEN, LLMSettings, _NotGiven
from pipecat.services.settings import NOT_GIVEN, LLMSettings, _NotGiven, _warn_deprecated_param
from pipecat.utils.tracing.service_decorators import traced_llm
try:
@@ -752,6 +752,10 @@ class AWSBedrockLLMService(LLMService):
class InputParams(BaseModel):
"""Input parameters for AWS Bedrock LLM service.
.. deprecated::
Use ``AWSBedrockLLMSettings`` instead. Pass settings directly via the
``settings`` parameter of :class:`AWSBedrockLLMService`.
Parameters:
max_tokens: Maximum number of tokens to generate.
temperature: Sampling temperature between 0.0 and 1.0.
@@ -771,12 +775,14 @@ class AWSBedrockLLMService(LLMService):
def __init__(
self,
*,
model: str,
model: Optional[str] = None,
aws_access_key: Optional[str] = None,
aws_secret_key: Optional[str] = None,
aws_session_token: Optional[str] = None,
aws_region: Optional[str] = None,
params: Optional[InputParams] = None,
settings: Optional[AWSBedrockLLMSettings] = None,
stop_sequences: Optional[List[str]] = None,
client_config: Optional[Config] = None,
retry_timeout_secs: Optional[float] = 5.0,
retry_on_timeout: Optional[bool] = False,
@@ -787,37 +793,59 @@ class AWSBedrockLLMService(LLMService):
Args:
model: The AWS Bedrock model identifier to use.
.. deprecated::
Use ``settings=AWSBedrockLLMSettings(model=...)`` instead.
aws_access_key: AWS access key ID. If None, uses default credentials.
aws_secret_key: AWS secret access key. If None, uses default credentials.
aws_session_token: AWS session token for temporary credentials.
aws_region: AWS region for the Bedrock service.
params: Model parameters and configuration.
.. deprecated::
Use ``settings=AWSBedrockLLMSettings(...)`` instead.
settings: Runtime-updatable settings for this service. When both
deprecated parameters and *settings* are provided, *settings*
values take precedence.
stop_sequences: List of strings that stop generation.
client_config: Custom boto3 client configuration.
retry_timeout_secs: Request timeout in seconds for retry logic.
retry_on_timeout: Whether to retry the request once if it times out.
system_instruction: Optional system instruction to use as the system prompt.
**kwargs: Additional arguments passed to parent LLMService.
"""
params = params or AWSBedrockLLMService.InputParams()
if model is not None:
_warn_deprecated_param("model", "AWSBedrockLLMSettings", "model")
if params is not None:
_warn_deprecated_param("params", "AWSBedrockLLMSettings")
super().__init__(
settings=AWSBedrockLLMSettings(
model=model,
max_tokens=params.max_tokens,
temperature=params.temperature,
top_p=params.top_p,
top_k=None,
frequency_penalty=None,
presence_penalty=None,
seed=None,
filter_incomplete_user_turns=False,
user_turn_completion_config=None,
latency=params.latency,
additional_model_request_fields=params.additional_model_request_fields
if isinstance(params.additional_model_request_fields, dict)
else {},
),
**kwargs,
_params = params or AWSBedrockLLMService.InputParams()
default_settings = AWSBedrockLLMSettings(
model=model or "us.amazon.nova-lite-v1:0",
max_tokens=_params.max_tokens,
temperature=_params.temperature,
top_p=_params.top_p,
top_k=None,
frequency_penalty=None,
presence_penalty=None,
seed=None,
filter_incomplete_user_turns=False,
user_turn_completion_config=None,
latency=_params.latency,
additional_model_request_fields=_params.additional_model_request_fields
if isinstance(_params.additional_model_request_fields, dict)
else {},
)
if settings is not None:
default_settings.apply_update(settings)
super().__init__(settings=default_settings, **kwargs)
self._stop_sequences = (
stop_sequences if stop_sequences is not None else (_params.stop_sequences or [])
)
# Initialize the AWS Bedrock client
@@ -843,7 +871,7 @@ class AWSBedrockLLMService(LLMService):
self._retry_on_timeout = retry_on_timeout
self._system_instruction = system_instruction
logger.info(f"Using AWS Bedrock model: {model}")
logger.info(f"Using AWS Bedrock model: {self._settings.model}")
if self._system_instruction:
logger.debug(f"{self}: Using system instruction: {self._system_instruction}")

View File

@@ -60,7 +60,7 @@ from pipecat.processors.aggregators.openai_llm_context import (
)
from pipecat.processors.frame_processor import FrameDirection
from pipecat.services.llm_service import LLMService
from pipecat.services.settings import NOT_GIVEN, LLMSettings, _NotGiven
from pipecat.services.settings import NOT_GIVEN, LLMSettings, _NotGiven, _warn_deprecated_param
from pipecat.utils.time import time_now_iso8601
try:
@@ -222,6 +222,7 @@ class AWSNovaSonicLLMService(LLMService):
model: str = "amazon.nova-2-sonic-v1:0",
voice_id: str = "matthew",
params: Optional[Params] = None,
settings: Optional[AWSNovaSonicLLMSettings] = None,
system_instruction: Optional[str] = None,
tools: Optional[ToolsSchema] = None,
send_transcription_frames: bool = True,
@@ -238,12 +239,27 @@ class AWSNovaSonicLLMService(LLMService):
- Nova 2 Sonic (the default model): "us-east-1", "us-west-2", "ap-northeast-1"
- Nova Sonic (the older model): "us-east-1", "ap-northeast-1"
model: Model identifier. Defaults to "amazon.nova-2-sonic-v1:0".
.. deprecated::
Use ``settings=AWSNovaSonicLLMSettings(model=...)`` instead.
voice_id: Voice ID for speech synthesis.
Note that some voices are designed for use with a specific language.
Options:
- Nova 2 Sonic (the default model): see https://docs.aws.amazon.com/nova/latest/nova2-userguide/sonic-language-support.html
- Nova Sonic (the older model): see https://docs.aws.amazon.com/nova/latest/userguide/available-voices.html.
.. deprecated::
Use ``settings=AWSNovaSonicLLMSettings(voice_id=...)`` instead.
params: Model parameters for audio configuration and inference.
.. deprecated::
Use ``settings=AWSNovaSonicLLMSettings(...)`` instead.
settings: AWS Nova Sonic LLM settings. If provided together with
deprecated top-level parameters, the ``settings`` values take
precedence.
system_instruction: System-level instruction for the model.
tools: Available tools/functions for the model to use.
send_transcription_frames: Whether to emit transcription frames.
@@ -254,23 +270,35 @@ class AWSNovaSonicLLMService(LLMService):
**kwargs: Additional arguments passed to the parent LLMService.
"""
params = params or Params()
# Check for deprecated parameter usage
if model != "amazon.nova-2-sonic-v1:0":
_warn_deprecated_param("model", "AWSNovaSonicLLMSettings", "model")
if voice_id != "matthew":
_warn_deprecated_param("voice_id", "AWSNovaSonicLLMSettings", "voice_id")
if params is not None:
_warn_deprecated_param("params", "AWSNovaSonicLLMSettings")
_params = params or Params()
default_settings = AWSNovaSonicLLMSettings(
model=model,
voice_id=voice_id,
temperature=_params.temperature,
max_tokens=_params.max_tokens,
top_p=_params.top_p,
top_k=None,
frequency_penalty=None,
presence_penalty=None,
seed=None,
filter_incomplete_user_turns=False,
user_turn_completion_config=None,
endpointing_sensitivity=_params.endpointing_sensitivity,
)
if settings is not None:
default_settings.apply_update(settings)
super().__init__(
settings=AWSNovaSonicLLMSettings(
model=model,
voice_id=voice_id,
temperature=params.temperature,
max_tokens=params.max_tokens,
top_p=params.top_p,
top_k=None,
frequency_penalty=None,
presence_penalty=None,
seed=None,
filter_incomplete_user_turns=False,
user_turn_completion_config=None,
endpointing_sensitivity=params.endpointing_sensitivity,
),
settings=default_settings,
**kwargs,
)
self._secret_access_key = secret_access_key
@@ -280,12 +308,12 @@ class AWSNovaSonicLLMService(LLMService):
self._client: Optional[BedrockRuntimeClient] = None
# Audio I/O config (hardware settings, not runtime-tunable)
self._input_sample_rate = params.input_sample_rate
self._input_sample_size = params.input_sample_size
self._input_channel_count = params.input_channel_count
self._output_sample_rate = params.output_sample_rate
self._output_sample_size = params.output_sample_size
self._output_channel_count = params.output_channel_count
self._input_sample_rate = _params.input_sample_rate
self._input_sample_size = _params.input_sample_size
self._input_channel_count = _params.input_channel_count
self._output_sample_rate = _params.output_sample_rate
self._output_sample_size = _params.output_sample_size
self._output_channel_count = _params.output_channel_count
self._system_instruction = system_instruction
self._tools = tools
@@ -295,7 +323,7 @@ class AWSNovaSonicLLMService(LLMService):
and not self._is_endpointing_sensitivity_supported()
):
logger.warning(
f"endpointing_sensitivity is not supported for model '{model}' and will be ignored. "
f"endpointing_sensitivity is not supported for model '{self._settings.model}' and will be ignored. "
"This parameter is only supported starting with Nova 2 Sonic (amazon.nova-2-sonic-v1:0)."
)
self._settings.endpointing_sensitivity = None

View File

@@ -29,7 +29,7 @@ from pipecat.frames.frames import (
TranscriptionFrame,
)
from pipecat.services.aws.utils import build_event_message, decode_event, get_presigned_url
from pipecat.services.settings import NOT_GIVEN, STTSettings, _NotGiven
from pipecat.services.settings import NOT_GIVEN, STTSettings, _NotGiven, _warn_deprecated_param
from pipecat.services.stt_latency import AWS_TRANSCRIBE_TTFS_P99
from pipecat.services.stt_service import WebsocketSTTService
from pipecat.transcriptions.language import Language, resolve_language
@@ -81,8 +81,9 @@ class AWSTranscribeSTTService(WebsocketSTTService):
aws_access_key_id: Optional[str] = None,
aws_session_token: Optional[str] = None,
region: Optional[str] = None,
sample_rate: int = 16000,
language: Language = Language.EN,
sample_rate: Optional[int] = None,
language: Optional[Language] = None,
settings: Optional[AWSTranscribeSTTSettings] = None,
ttfs_p99_latency: Optional[float] = AWS_TRANSCRIBE_TTFS_P99,
**kwargs,
):
@@ -93,29 +94,51 @@ class AWSTranscribeSTTService(WebsocketSTTService):
aws_access_key_id: AWS access key ID. If None, uses AWS_ACCESS_KEY_ID environment variable.
aws_session_token: AWS session token for temporary credentials. If None, uses AWS_SESSION_TOKEN environment variable.
region: AWS region for the service.
sample_rate: Audio sample rate in Hz. Must be 8000 or 16000. Defaults to 16000.
language: Language for transcription. Defaults to English.
sample_rate: Audio sample rate in Hz. Must be 8000 or 16000.
.. deprecated:: 1.0
Use ``settings=AWSTranscribeSTTSettings(sample_rate=...)`` instead.
language: Language for transcription.
.. deprecated:: 1.0
Use ``settings=AWSTranscribeSTTSettings(language=...)`` instead.
settings: Runtime-updatable settings. When provided alongside deprecated
parameters, ``settings`` values take precedence.
ttfs_p99_latency: P99 latency from speech end to final transcript in seconds.
Override for your deployment. See https://github.com/pipecat-ai/stt-benchmark
**kwargs: Additional arguments passed to parent STTService class.
"""
if sample_rate is not None:
_warn_deprecated_param("sample_rate", "AWSTranscribeSTTSettings", "sample_rate")
if language is not None:
_warn_deprecated_param("language", "AWSTranscribeSTTSettings", "language")
_sample_rate = sample_rate or 16000
_language = language or Language.EN
default_settings = AWSTranscribeSTTSettings(
language=self.language_to_service_language(_language) or "en-US",
sample_rate=_sample_rate,
media_encoding="linear16",
number_of_channels=1,
show_speaker_label=False,
enable_channel_identification=False,
)
if settings is not None:
default_settings.apply_update(settings)
super().__init__(
ttfs_p99_latency=ttfs_p99_latency,
settings=AWSTranscribeSTTSettings(
language=self.language_to_service_language(language) or "en-US",
sample_rate=sample_rate,
media_encoding="linear16",
number_of_channels=1,
show_speaker_label=False,
enable_channel_identification=False,
),
settings=default_settings,
**kwargs,
)
# Validate sample rate - AWS Transcribe only supports 8000 Hz or 16000 Hz
if sample_rate not in [8000, 16000]:
if _sample_rate not in [8000, 16000]:
logger.warning(
f"AWS Transcribe only supports 8000 Hz or 16000 Hz sample rates. Converting from {sample_rate} Hz to 16000 Hz."
f"AWS Transcribe only supports 8000 Hz or 16000 Hz sample rates. Converting from {_sample_rate} Hz to 16000 Hz."
)
self._settings.sample_rate = 16000

View File

@@ -25,7 +25,7 @@ from pipecat.frames.frames import (
TTSStartedFrame,
TTSStoppedFrame,
)
from pipecat.services.settings import NOT_GIVEN, TTSSettings, _NotGiven
from pipecat.services.settings import NOT_GIVEN, TTSSettings, _NotGiven, _warn_deprecated_param
from pipecat.services.tts_service import TTSService
from pipecat.transcriptions.language import Language, resolve_language
from pipecat.utils.tracing.service_decorators import traced_tts
@@ -155,6 +155,9 @@ class AWSPollyTTSService(TTSService):
class InputParams(BaseModel):
"""Input parameters for AWS Polly TTS configuration.
.. deprecated:: 1.0
Use ``AWSPollyTTSSettings`` directly via the ``settings`` parameter instead.
Parameters:
engine: TTS engine to use ('standard', 'neural', etc.).
language: Language for synthesis. Defaults to English.
@@ -178,9 +181,10 @@ class AWSPollyTTSService(TTSService):
aws_access_key_id: Optional[str] = None,
aws_session_token: Optional[str] = None,
region: Optional[str] = None,
voice_id: str = "Joanna",
voice_id: Optional[str] = None,
sample_rate: Optional[int] = None,
params: Optional[InputParams] = None,
settings: Optional[AWSPollyTTSSettings] = None,
**kwargs,
):
"""Initializes the AWS Polly TTS service.
@@ -191,26 +195,45 @@ class AWSPollyTTSService(TTSService):
aws_session_token: AWS session token for temporary credentials.
region: AWS region for Polly service. Defaults to 'us-east-1'.
voice_id: Voice ID to use for synthesis. Defaults to 'Joanna'.
.. deprecated:: 1.0
Use ``settings=AWSPollyTTSSettings(voice=...)`` instead.
sample_rate: Audio sample rate. If None, uses service default.
params: Additional input parameters for voice customization.
.. deprecated:: 1.0
Use ``settings=AWSPollyTTSSettings(...)`` instead.
settings: Runtime-updatable settings. When provided alongside deprecated
parameters, ``settings`` values take precedence.
**kwargs: Additional arguments passed to parent TTSService class.
"""
params = params or AWSPollyTTSService.InputParams()
if voice_id is not None:
_warn_deprecated_param("voice_id", "AWSPollyTTSSettings", "voice")
if params is not None:
_warn_deprecated_param("params", "AWSPollyTTSSettings")
_params = params or AWSPollyTTSService.InputParams()
default_settings = AWSPollyTTSSettings(
model=None,
voice=voice_id or "Joanna",
engine=_params.engine,
language=self.language_to_service_language(_params.language)
if _params.language
else "en-US",
pitch=_params.pitch,
rate=_params.rate,
volume=_params.volume,
lexicon_names=_params.lexicon_names,
)
if settings is not None:
default_settings.apply_update(settings)
super().__init__(
sample_rate=sample_rate,
settings=AWSPollyTTSSettings(
model=None,
voice=voice_id,
engine=params.engine,
language=self.language_to_service_language(params.language)
if params.language
else "en-US",
pitch=params.pitch,
rate=params.rate,
volume=params.volume,
lexicon_names=params.lexicon_names,
),
settings=default_settings,
**kwargs,
)

View File

@@ -13,14 +13,14 @@ using REST endpoints for creating images from text prompts.
import asyncio
import io
from dataclasses import dataclass
from typing import AsyncGenerator
from typing import AsyncGenerator, Optional
import aiohttp
from PIL import Image
from pipecat.frames.frames import ErrorFrame, Frame, URLImageRawFrame
from pipecat.services.image_service import ImageGenService
from pipecat.services.settings import ImageGenSettings
from pipecat.services.settings import ImageGenSettings, _warn_deprecated_param
@dataclass
@@ -46,9 +46,10 @@ class AzureImageGenServiceREST(ImageGenService):
image_size: str,
api_key: str,
endpoint: str,
model: str,
model: Optional[str] = None,
aiohttp_session: aiohttp.ClientSession,
api_version="2023-06-01-preview",
settings: Optional[AzureImageGenSettings] = None,
):
"""Initialize the AzureImageGenServiceREST.
@@ -57,10 +58,23 @@ class AzureImageGenServiceREST(ImageGenService):
api_key: Azure OpenAI API key for authentication.
endpoint: Azure OpenAI endpoint URL.
model: The image generation model to use.
.. deprecated:: 1.0
Use ``settings=AzureImageGenSettings(model=...)`` instead.
aiohttp_session: Shared aiohttp session for HTTP requests.
api_version: Azure API version string. Defaults to "2023-06-01-preview".
settings: Runtime-updatable settings. When provided alongside deprecated
parameters, ``settings`` values take precedence.
"""
super().__init__(settings=AzureImageGenSettings(model=model))
if model is not None:
_warn_deprecated_param("model", "AzureImageGenSettings", "model")
default_settings = AzureImageGenSettings(model=model)
if settings is not None:
default_settings.apply_update(settings)
super().__init__(settings=default_settings)
self._api_key = api_key
self._azure_endpoint = endpoint

View File

@@ -6,10 +6,14 @@
"""Azure OpenAI service implementation for the Pipecat AI framework."""
from typing import Optional
from loguru import logger
from openai import AsyncAzureOpenAI
from pipecat.services.openai.base_llm import OpenAILLMSettings
from pipecat.services.openai.llm import OpenAILLMService
from pipecat.services.settings import _warn_deprecated_param
class AzureLLMService(OpenAILLMService):
@@ -24,8 +28,9 @@ class AzureLLMService(OpenAILLMService):
*,
api_key: str,
endpoint: str,
model: str,
model: Optional[str] = None,
api_version: str = "2024-09-01-preview",
settings: Optional[OpenAILLMSettings] = None,
**kwargs,
):
"""Initialize the Azure LLM service.
@@ -33,15 +38,28 @@ class AzureLLMService(OpenAILLMService):
Args:
api_key: The API key for accessing Azure OpenAI.
endpoint: The Azure endpoint URL.
model: The model identifier to use.
model: The model identifier to use. Defaults to "gpt-4o".
.. deprecated:: 1.0
Use ``settings=OpenAILLMSettings(model=...)`` instead.
api_version: Azure API version. Defaults to "2024-09-01-preview".
settings: Runtime-updatable settings. When provided alongside deprecated
parameters, ``settings`` values take precedence.
**kwargs: Additional keyword arguments passed to OpenAILLMService.
"""
if model is not None:
_warn_deprecated_param("model", "OpenAILLMSettings", "model")
default_settings = OpenAILLMSettings(model=model or "gpt-4o")
if settings is not None:
default_settings.apply_update(settings)
# Initialize variables before calling parent __init__() because that
# will call create_client() and we need those values there.
self._endpoint = endpoint
self._api_version = api_version
super().__init__(api_key=api_key, model=model, **kwargs)
super().__init__(api_key=api_key, settings=default_settings, **kwargs)
def create_client(self, api_key=None, base_url=None, **kwargs):
"""Create OpenAI-compatible client for Azure OpenAI endpoint.

View File

@@ -26,7 +26,7 @@ from pipecat.frames.frames import (
TranscriptionFrame,
)
from pipecat.services.azure.common import language_to_azure_language
from pipecat.services.settings import NOT_GIVEN, STTSettings, _NotGiven
from pipecat.services.settings import NOT_GIVEN, STTSettings, _NotGiven, _warn_deprecated_param
from pipecat.services.stt_latency import AZURE_TTFS_P99
from pipecat.services.stt_service import STTService
from pipecat.transcriptions.language import Language
@@ -79,10 +79,11 @@ class AzureSTTService(STTService):
*,
api_key: str,
region: str,
language: Language = Language.EN_US,
language: Optional[Language] = Language.EN_US,
sample_rate: Optional[int] = None,
private_endpoint: Optional[str] = None,
endpoint_id: Optional[str] = None,
settings: Optional[AzureSTTSettings] = None,
ttfs_p99_latency: Optional[float] = AZURE_TTFS_P99,
**kwargs,
):
@@ -92,30 +93,44 @@ class AzureSTTService(STTService):
api_key: Azure Cognitive Services subscription key.
region: Azure region for the Speech service (e.g., 'eastus').
language: Language for speech recognition. Defaults to English (US).
.. deprecated:: 1.0
Use ``settings=AzureSTTSettings(language=...)`` instead.
sample_rate: Audio sample rate in Hz. If None, uses service default.
private_endpoint: Private endpoint for STT behind firewall.
See https://docs.azure.cn/en-us/ai-services/speech-service/speech-services-private-link?tabs=portal
endpoint_id: Custom model endpoint id.
settings: Runtime-updatable settings. When provided alongside deprecated
parameters, ``settings`` values take precedence.
ttfs_p99_latency: P99 latency from speech end to final transcript in seconds.
Override for your deployment. See https://github.com/pipecat-ai/stt-benchmark
**kwargs: Additional arguments passed to parent STTService.
"""
if language != Language.EN_US:
_warn_deprecated_param("language", "AzureSTTSettings", "language")
default_settings = AzureSTTSettings(
model=None,
region=region,
language=language_to_azure_language(language) if language else None,
sample_rate=sample_rate,
)
if settings is not None:
default_settings.apply_update(settings)
super().__init__(
sample_rate=sample_rate,
ttfs_p99_latency=ttfs_p99_latency,
settings=AzureSTTSettings(
model=None,
region=region,
language=language_to_azure_language(language),
sample_rate=sample_rate,
),
settings=default_settings,
**kwargs,
)
self._speech_config = SpeechConfig(
subscription=api_key,
region=region,
speech_recognition_language=language_to_azure_language(language),
speech_recognition_language=default_settings.language
or language_to_azure_language(Language.EN_US),
endpoint=private_endpoint,
)

View File

@@ -26,7 +26,7 @@ from pipecat.frames.frames import (
)
from pipecat.processors.frame_processor import FrameDirection
from pipecat.services.azure.common import language_to_azure_language
from pipecat.services.settings import NOT_GIVEN, TTSSettings, _NotGiven
from pipecat.services.settings import NOT_GIVEN, TTSSettings, _NotGiven, _warn_deprecated_param
from pipecat.services.tts_service import TextAggregationMode, TTSService
from pipecat.transcriptions.language import Language
from pipecat.utils.tracing.service_decorators import traced_tts
@@ -115,6 +115,9 @@ class AzureBaseTTSService:
class InputParams(BaseModel):
"""Input parameters for Azure TTS voice configuration.
.. deprecated:: 1.0
Use ``settings=AzureTTSSettings(...)`` instead.
Parameters:
emphasis: Emphasis level for speech ("strong", "moderate", "reduced").
language: Language for synthesis. Defaults to English (US).
@@ -253,9 +256,10 @@ class AzureTTSService(TTSService, AzureBaseTTSService):
*,
api_key: str,
region: str,
voice: str = "en-US-SaraNeural",
voice: Optional[str] = None,
sample_rate: Optional[int] = None,
params: Optional[AzureBaseTTSService.InputParams] = None,
settings: Optional[AzureTTSSettings] = None,
aggregate_sentences: Optional[bool] = None,
text_aggregation_mode: Optional[TextAggregationMode] = None,
**kwargs,
@@ -265,9 +269,19 @@ class AzureTTSService(TTSService, AzureBaseTTSService):
Args:
api_key: Azure Cognitive Services subscription key.
region: Azure region identifier (e.g., "eastus", "westus2").
voice: Voice name to use for synthesis. Defaults to "en-US-SaraNeural".
voice: Voice name to use for synthesis.
.. deprecated:: 1.0
Use ``settings=AzureTTSSettings(voice=...)`` instead.
sample_rate: Audio sample rate in Hz. If None, uses service default.
params: Voice and synthesis parameters configuration.
.. deprecated:: 1.0
Use ``settings=AzureTTSSettings(...)`` instead.
settings: Runtime-updatable settings. When provided alongside deprecated
parameters, ``settings`` values take precedence.
aggregate_sentences: Deprecated. Use text_aggregation_mode instead.
.. deprecated:: 0.0.104
@@ -276,7 +290,29 @@ class AzureTTSService(TTSService, AzureBaseTTSService):
text_aggregation_mode: How to aggregate text before synthesis.
**kwargs: Additional arguments passed to parent WordTTSService.
"""
params = params or AzureBaseTTSService.InputParams()
if voice is not None:
_warn_deprecated_param("voice", "AzureTTSSettings", "voice")
if params is not None:
_warn_deprecated_param("params", "AzureTTSSettings")
_params = params or AzureBaseTTSService.InputParams()
default_settings = AzureTTSSettings(
model=None,
emphasis=_params.emphasis,
language=self.language_to_service_language(_params.language)
if _params.language
else "en-US",
pitch=_params.pitch,
rate=_params.rate,
role=_params.role,
style=_params.style,
style_degree=_params.style_degree,
voice=voice or "en-US-SaraNeural",
volume=_params.volume,
)
if settings is not None:
default_settings.apply_update(settings)
super().__init__(
aggregate_sentences=aggregate_sentences,
@@ -286,25 +322,12 @@ class AzureTTSService(TTSService, AzureBaseTTSService):
pause_frame_processing=True,
supports_word_timestamps=True,
sample_rate=sample_rate,
settings=AzureTTSSettings(
model=None,
emphasis=params.emphasis,
language=self.language_to_service_language(params.language)
if params.language
else "en-US",
pitch=params.pitch,
rate=params.rate,
role=params.role,
style=params.style,
style_degree=params.style_degree,
voice=voice,
volume=params.volume,
),
settings=default_settings,
**kwargs,
)
# Initialize Azure-specific functionality from mixin
self._init_azure_base(api_key=api_key, region=region, voice=voice)
self._init_azure_base(api_key=api_key, region=region, voice=default_settings.voice)
self._speech_config = None
self._speech_synthesizer = None
@@ -730,9 +753,10 @@ class AzureHttpTTSService(TTSService, AzureBaseTTSService):
*,
api_key: str,
region: str,
voice: str = "en-US-SaraNeural",
voice: Optional[str] = None,
sample_rate: Optional[int] = None,
params: Optional[AzureBaseTTSService.InputParams] = None,
settings: Optional[AzureTTSSettings] = None,
**kwargs,
):
"""Initialize the Azure HTTP TTS service.
@@ -740,34 +764,53 @@ class AzureHttpTTSService(TTSService, AzureBaseTTSService):
Args:
api_key: Azure Cognitive Services subscription key.
region: Azure region identifier (e.g., "eastus", "westus2").
voice: Voice name to use for synthesis. Defaults to "en-US-SaraNeural".
voice: Voice name to use for synthesis.
.. deprecated:: 1.0
Use ``settings=AzureTTSSettings(voice=...)`` instead.
sample_rate: Audio sample rate in Hz. If None, uses service default.
params: Voice and synthesis parameters configuration.
.. deprecated:: 1.0
Use ``settings=AzureTTSSettings(...)`` instead.
settings: Runtime-updatable settings. When provided alongside deprecated
parameters, ``settings`` values take precedence.
**kwargs: Additional arguments passed to parent TTSService.
"""
params = params or AzureBaseTTSService.InputParams()
if voice is not None:
_warn_deprecated_param("voice", "AzureTTSSettings", "voice")
if params is not None:
_warn_deprecated_param("params", "AzureTTSSettings")
_params = params or AzureBaseTTSService.InputParams()
default_settings = AzureTTSSettings(
model=None,
emphasis=_params.emphasis,
language=self.language_to_service_language(_params.language)
if _params.language
else "en-US",
pitch=_params.pitch,
rate=_params.rate,
role=_params.role,
style=_params.style,
style_degree=_params.style_degree,
voice=voice or "en-US-SaraNeural",
volume=_params.volume,
)
if settings is not None:
default_settings.apply_update(settings)
super().__init__(
sample_rate=sample_rate,
settings=AzureTTSSettings(
model=None,
emphasis=params.emphasis,
language=self.language_to_service_language(params.language)
if params.language
else "en-US",
pitch=params.pitch,
rate=params.rate,
role=params.role,
style=params.style,
style_degree=params.style_degree,
voice=voice,
volume=params.volume,
),
settings=default_settings,
**kwargs,
)
# Initialize Azure-specific functionality from mixin
self._init_azure_base(api_key=api_key, region=region, voice=voice)
self._init_azure_base(api_key=api_key, region=region, voice=default_settings.voice)
self._speech_config = None
self._speech_synthesizer = None

View File

@@ -32,7 +32,7 @@ from pipecat.frames.frames import (
TTSStartedFrame,
TTSStoppedFrame,
)
from pipecat.services.settings import NOT_GIVEN, TTSSettings, _NotGiven
from pipecat.services.settings import NOT_GIVEN, TTSSettings, _NotGiven, _warn_deprecated_param
from pipecat.services.tts_service import TTSService
from pipecat.transcriptions.language import Language, resolve_language
from pipecat.utils.tracing.service_decorators import traced_tts
@@ -175,6 +175,9 @@ class CambTTSService(TTSService):
class InputParams(BaseModel):
"""Input parameters for Camb.ai TTS configuration.
.. deprecated:: 1.0
Use ``settings=CambTTSSettings(...)`` instead.
Parameters:
language: Language for synthesis (BCP-47 format). Defaults to English.
user_instructions: Custom instructions for mars-instruct model only.
@@ -193,47 +196,71 @@ class CambTTSService(TTSService):
self,
*,
api_key: str,
voice_id: int = 147320,
model: str = "mars-flash",
voice_id: Optional[int] = None,
model: Optional[str] = None,
timeout: float = 60.0,
sample_rate: Optional[int] = None,
params: Optional[InputParams] = None,
settings: Optional[CambTTSSettings] = None,
**kwargs,
):
"""Initialize the Camb.ai TTS service.
Args:
api_key: Camb.ai API key for authentication.
voice_id: Voice ID to use. Defaults to 147320.
voice_id: Voice ID to use.
.. deprecated:: 1.0
Use ``settings=CambTTSSettings(voice=...)`` instead.
model: TTS model to use. Options: "mars-flash" (fast), "mars-pro" (high quality).
Defaults to "mars-flash".
.. deprecated:: 1.0
Use ``settings=CambTTSSettings(model=...)`` instead.
timeout: Request timeout in seconds. Defaults to 60.0 (minimum recommended
by Camb.ai).
sample_rate: Audio sample rate in Hz. If None, uses model-specific default.
params: Additional voice parameters. If None, uses defaults.
.. deprecated:: 1.0
Use ``settings=CambTTSSettings(...)`` instead.
settings: Runtime-updatable settings. When provided alongside deprecated
parameters, ``settings`` values take precedence.
**kwargs: Additional arguments passed to parent TTSService.
"""
params = params or CambTTSService.InputParams()
if voice_id is not None:
_warn_deprecated_param("voice_id", "CambTTSSettings", "voice")
if model is not None:
_warn_deprecated_param("model", "CambTTSSettings", "model")
if params is not None:
_warn_deprecated_param("params", "CambTTSSettings")
_params = params or CambTTSService.InputParams()
_model = model or "mars-flash"
# Warn if sample rate doesn't match model's supported rate
if sample_rate and sample_rate != MODEL_SAMPLE_RATES.get(model):
if sample_rate and sample_rate != MODEL_SAMPLE_RATES.get(_model):
logger.warning(
f"Camb.ai's {model} model only supports {MODEL_SAMPLE_RATES.get(model)}Hz "
f"Camb.ai's {_model} model only supports {MODEL_SAMPLE_RATES.get(_model)}Hz "
f"sample rate. Current rate of {sample_rate}Hz may cause issues."
)
default_settings = CambTTSSettings(
model=_model,
voice=voice_id or 147320,
language=(
self.language_to_service_language(_params.language) if _params.language else "en-us"
),
user_instructions=_params.user_instructions,
)
if settings is not None:
default_settings.apply_update(settings)
super().__init__(
sample_rate=sample_rate,
settings=CambTTSSettings(
model=model,
voice=voice_id,
language=(
self.language_to_service_language(params.language)
if params.language
else "en-us"
),
user_instructions=params.user_instructions,
),
settings=default_settings,
**kwargs,
)

View File

@@ -158,6 +158,7 @@ class CartesiaSTTService(WebsocketSTTService):
base_url: str = "",
sample_rate: int = 16000,
live_options: Optional[CartesiaLiveOptions] = None,
settings: Optional[CartesiaSTTSettings] = None,
ttfs_p99_latency: Optional[float] = CARTESIA_TTFS_P99,
**kwargs,
):
@@ -168,6 +169,8 @@ class CartesiaSTTService(WebsocketSTTService):
base_url: Custom API endpoint URL. If empty, uses default.
sample_rate: Audio sample rate in Hz. Defaults to 16000.
live_options: Configuration options for transcription service.
settings: Runtime-updatable settings. When provided alongside
``live_options``, ``settings`` values take precedence.
ttfs_p99_latency: P99 latency from speech end to final transcript in seconds.
Override for your deployment. See https://github.com/pipecat-ai/stt-benchmark
**kwargs: Additional arguments passed to parent STTService.
@@ -189,16 +192,20 @@ class CartesiaSTTService(WebsocketSTTService):
k: v for k, v in merged_options.items() if not isinstance(v, str) or v != "None"
}
default_settings = CartesiaSTTSettings(
model=merged_options["model"],
language=merged_options.get("language"),
encoding=merged_options.get("encoding", "pcm_s16le"),
)
if settings is not None:
default_settings.apply_update(settings)
super().__init__(
sample_rate=sample_rate,
ttfs_p99_latency=ttfs_p99_latency,
keepalive_timeout=120,
keepalive_interval=30,
settings=CartesiaSTTSettings(
model=merged_options["model"],
language=merged_options.get("language"),
encoding=merged_options.get("encoding", "pcm_s16le"),
),
settings=default_settings,
**kwargs,
)

View File

@@ -26,7 +26,7 @@ from pipecat.frames.frames import (
TTSStartedFrame,
TTSStoppedFrame,
)
from pipecat.services.settings import NOT_GIVEN, TTSSettings, _NotGiven
from pipecat.services.settings import NOT_GIVEN, TTSSettings, _NotGiven, _warn_deprecated_param
from pipecat.services.tts_service import AudioContextTTSService, TextAggregationMode, TTSService
from pipecat.transcriptions.language import Language, resolve_language
from pipecat.utils.text.base_text_aggregator import BaseTextAggregator
@@ -263,14 +263,15 @@ class CartesiaTTSService(AudioContextTTSService):
self,
*,
api_key: str,
voice_id: str,
voice_id: Optional[str] = None,
cartesia_version: str = "2025-04-16",
url: str = "wss://api.cartesia.ai/tts/websocket",
model: str = "sonic-3",
model: Optional[str] = None,
sample_rate: Optional[int] = None,
encoding: str = "pcm_s16le",
container: str = "raw",
params: Optional[InputParams] = None,
settings: Optional[CartesiaTTSSettings] = None,
text_aggregator: Optional[BaseTextAggregator] = None,
text_aggregation_mode: Optional[TextAggregationMode] = None,
aggregate_sentences: Optional[bool] = None,
@@ -281,13 +282,27 @@ class CartesiaTTSService(AudioContextTTSService):
Args:
api_key: Cartesia API key for authentication.
voice_id: ID of the voice to use for synthesis.
.. deprecated:: 1.0
Use ``settings=CartesiaTTSSettings(voice=...)`` instead.
cartesia_version: API version string for Cartesia service.
url: WebSocket URL for Cartesia TTS API.
model: TTS model to use (e.g., "sonic-3").
.. deprecated:: 1.0
Use ``settings=CartesiaTTSSettings(model=...)`` instead.
sample_rate: Audio sample rate. If None, uses default.
encoding: Audio encoding format.
container: Audio container format.
params: Additional input parameters for voice customization.
.. deprecated:: 1.0
Use ``settings=CartesiaTTSSettings(...)`` instead.
settings: Runtime-updatable settings. When provided alongside deprecated
parameters, ``settings`` values take precedence.
text_aggregator: Custom text aggregator for processing input text.
.. deprecated:: 0.0.95
@@ -301,6 +316,13 @@ class CartesiaTTSService(AudioContextTTSService):
**kwargs: Additional arguments passed to the parent service.
"""
if voice_id is not None:
_warn_deprecated_param("voice_id", "CartesiaTTSSettings", "voice")
if model is not None:
_warn_deprecated_param("model", "CartesiaTTSSettings", "model")
if params is not None:
_warn_deprecated_param("params", "CartesiaTTSSettings")
# By default, we aggregate sentences before sending to TTS. This adds
# ~200-300ms of latency per sentence (waiting for the sentence-ending
# punctuation token from the LLM). Setting
@@ -314,7 +336,24 @@ class CartesiaTTSService(AudioContextTTSService):
# if we're interrupted. Cartesia gives us word-by-word timestamps. We
# can use those to generate text frames ourselves aligned with the
# playout timing of the audio!
params = params or CartesiaTTSService.InputParams()
_params = params or CartesiaTTSService.InputParams()
default_settings = CartesiaTTSSettings(
model=model or "sonic-3",
voice=voice_id,
output_container=container,
output_encoding=encoding,
output_sample_rate=0,
language=(
self.language_to_service_language(_params.language) if _params.language else None
),
speed=_params.speed,
emotion=_params.emotion,
generation_config=_params.generation_config,
pronunciation_dict_id=_params.pronunciation_dict_id,
)
if settings is not None:
default_settings.apply_update(settings)
super().__init__(
text_aggregation_mode=text_aggregation_mode,
@@ -324,20 +363,7 @@ class CartesiaTTSService(AudioContextTTSService):
supports_word_timestamps=True,
sample_rate=sample_rate,
text_aggregator=text_aggregator,
settings=CartesiaTTSSettings(
model=model,
output_container=container,
output_encoding=encoding,
output_sample_rate=0,
language=self.language_to_service_language(params.language)
if params.language
else None,
speed=params.speed,
emotion=params.emotion,
generation_config=params.generation_config,
pronunciation_dict_id=params.pronunciation_dict_id,
voice=voice_id,
),
settings=default_settings,
**kwargs,
)
@@ -717,14 +743,15 @@ class CartesiaHttpTTSService(TTSService):
self,
*,
api_key: str,
voice_id: str,
model: str = "sonic-3",
voice_id: Optional[str] = None,
model: Optional[str] = None,
base_url: str = "https://api.cartesia.ai",
cartesia_version: str = "2024-11-13",
sample_rate: Optional[int] = None,
encoding: str = "pcm_s16le",
container: str = "raw",
params: Optional[InputParams] = None,
settings: Optional[CartesiaTTSSettings] = None,
**kwargs,
):
"""Initialize the Cartesia HTTP TTS service.
@@ -732,33 +759,58 @@ class CartesiaHttpTTSService(TTSService):
Args:
api_key: Cartesia API key for authentication.
voice_id: ID of the voice to use for synthesis.
.. deprecated:: 1.0
Use ``settings=CartesiaTTSSettings(voice=...)`` instead.
model: TTS model to use (e.g., "sonic-3").
.. deprecated:: 1.0
Use ``settings=CartesiaTTSSettings(model=...)`` instead.
base_url: Base URL for Cartesia HTTP API.
cartesia_version: API version string for Cartesia service.
sample_rate: Audio sample rate. If None, uses default.
encoding: Audio encoding format.
container: Audio container format.
params: Additional input parameters for voice customization.
.. deprecated:: 1.0
Use ``settings=CartesiaTTSSettings(...)`` instead.
settings: Runtime-updatable settings. When provided alongside deprecated
parameters, ``settings`` values take precedence.
**kwargs: Additional arguments passed to the parent TTSService.
"""
params = params or CartesiaHttpTTSService.InputParams()
if voice_id is not None:
_warn_deprecated_param("voice_id", "CartesiaTTSSettings", "voice")
if model is not None:
_warn_deprecated_param("model", "CartesiaTTSSettings", "model")
if params is not None:
_warn_deprecated_param("params", "CartesiaTTSSettings")
_params = params or CartesiaHttpTTSService.InputParams()
default_settings = CartesiaTTSSettings(
model=model or "sonic-3",
voice=voice_id,
output_container=container,
output_encoding=encoding,
output_sample_rate=0,
language=(
self.language_to_service_language(_params.language) if _params.language else None
),
speed=_params.speed,
emotion=_params.emotion,
generation_config=_params.generation_config,
pronunciation_dict_id=_params.pronunciation_dict_id,
)
if settings is not None:
default_settings.apply_update(settings)
super().__init__(
sample_rate=sample_rate,
settings=CartesiaTTSSettings(
model=model,
voice=voice_id,
output_container=container,
output_encoding=encoding,
output_sample_rate=0,
language=self.language_to_service_language(params.language)
if params.language
else None,
speed=params.speed,
emotion=params.emotion,
generation_config=params.generation_config,
pronunciation_dict_id=params.pronunciation_dict_id,
),
settings=default_settings,
**kwargs,
)

View File

@@ -6,10 +6,14 @@
"""Cerebras LLM service implementation using OpenAI-compatible interface."""
from typing import Optional
from loguru import logger
from pipecat.adapters.services.open_ai_adapter import OpenAILLMInvocationParams
from pipecat.services.openai.base_llm import OpenAILLMSettings
from pipecat.services.openai.llm import OpenAILLMService
from pipecat.services.settings import _warn_deprecated_param
class CerebrasLLMService(OpenAILLMService):
@@ -24,7 +28,8 @@ class CerebrasLLMService(OpenAILLMService):
*,
api_key: str,
base_url: str = "https://api.cerebras.ai/v1",
model: str = "gpt-oss-120b",
model: Optional[str] = None,
settings: Optional[OpenAILLMSettings] = None,
**kwargs,
):
"""Initialize the Cerebras LLM service.
@@ -33,9 +38,22 @@ class CerebrasLLMService(OpenAILLMService):
api_key: The API key for accessing Cerebras's API.
base_url: The base URL for Cerebras API. Defaults to "https://api.cerebras.ai/v1".
model: The model identifier to use. Defaults to "gpt-oss-120b".
.. deprecated:: 1.0
Use ``settings=OpenAILLMSettings(model=...)`` instead.
settings: Runtime-updatable settings. When provided alongside deprecated
parameters, ``settings`` values take precedence.
**kwargs: Additional keyword arguments passed to OpenAILLMService.
"""
super().__init__(api_key=api_key, base_url=base_url, model=model, **kwargs)
if model is not None:
_warn_deprecated_param("model", "OpenAILLMSettings", "model")
default_settings = OpenAILLMSettings(model=model or "gpt-oss-120b")
if settings is not None:
default_settings.apply_update(settings)
super().__init__(api_key=api_key, base_url=base_url, settings=default_settings, **kwargs)
def create_client(self, api_key=None, base_url=None, **kwargs):
"""Create OpenAI-compatible client for Cerebras API endpoint.

View File

@@ -28,7 +28,7 @@ from pipecat.frames.frames import (
UserStartedSpeakingFrame,
UserStoppedSpeakingFrame,
)
from pipecat.services.settings import NOT_GIVEN, STTSettings, _NotGiven
from pipecat.services.settings import NOT_GIVEN, STTSettings, _NotGiven, _warn_deprecated_param
from pipecat.services.stt_service import WebsocketSTTService
from pipecat.transcriptions.language import Language
from pipecat.utils.time import time_now_iso8601
@@ -124,8 +124,8 @@ class DeepgramFluxSTTService(WebsocketSTTService):
class InputParams(BaseModel):
"""Configuration parameters for Deepgram Flux API.
This class defines all available connection parameters for the Deepgram Flux API
based on the official documentation.
.. deprecated:: 1.0
Use ``settings=DeepgramFluxSTTSettings(...)`` instead.
Parameters:
eager_eot_threshold: Optional. EagerEndOfTurn/TurnResumed are off by default.
@@ -158,10 +158,11 @@ class DeepgramFluxSTTService(WebsocketSTTService):
api_key: str,
url: str = "wss://api.deepgram.com/v2/listen",
sample_rate: Optional[int] = None,
model: str = "flux-general-en",
model: Optional[str] = None,
flux_encoding: str = "linear16",
params: Optional[InputParams] = None,
should_interrupt: bool = True,
settings: Optional[DeepgramFluxSTTSettings] = None,
**kwargs,
):
"""Initialize the Deepgram Flux STT service.
@@ -170,12 +171,21 @@ class DeepgramFluxSTTService(WebsocketSTTService):
api_key: Deepgram API key for authentication. Required for API access.
url: WebSocket URL for the Deepgram Flux API. Defaults to the preview endpoint.
sample_rate: Audio sample rate in Hz. If None, uses the rate from params or 16000.
model: Deepgram Flux model to use for transcription. Currently only supports "flux-general-en".
model: Deepgram Flux model to use for transcription.
.. deprecated:: 1.0
Use ``settings=DeepgramFluxSTTSettings(model=...)`` instead.
flux_encoding: Audio encoding format required by Flux API. Must be "linear16".
Raw signed little-endian 16-bit PCM encoding.
params: InputParams instance containing detailed API configuration options.
If None, default parameters will be used.
.. deprecated:: 1.0
Use ``settings=DeepgramFluxSTTSettings(...)`` instead.
should_interrupt: Determine whether the bot should be interrupted when Flux detects that the user is speaking.
settings: Runtime-updatable settings. When provided alongside deprecated
parameters, ``settings`` values take precedence.
**kwargs: Additional arguments passed to the parent WebsocketSTTService class.
Examples:
@@ -185,18 +195,21 @@ class DeepgramFluxSTTService(WebsocketSTTService):
Advanced usage with custom parameters::
params = DeepgramFluxSTTService.InputParams(
eager_eot_threshold=0.5,
eot_threshold=0.8,
keyterm=["AI", "machine learning", "neural network"],
tag=["production", "voice-agent"]
)
stt = DeepgramFluxSTTService(
api_key="your-api-key",
model="flux-general-en",
params=params
settings=DeepgramFluxSTTSettings(
model="flux-general-en",
eager_eot_threshold=0.5,
eot_threshold=0.8,
keyterm=["AI", "machine learning", "neural network"],
tag=["production", "voice-agent"],
),
)
"""
if model is not None:
_warn_deprecated_param("model", "DeepgramFluxSTTSettings", "model")
if params is not None:
_warn_deprecated_param("params", "DeepgramFluxSTTSettings")
# Note: For DeepgramFluxSTTService, differently from other processes, we need to create
# the _receive_task inside _connect_websocket, because the websocket should only be
# considered connected and ready to send audio once we receive from Flux the message
@@ -207,22 +220,27 @@ class DeepgramFluxSTTService(WebsocketSTTService):
# was never destroyed.
# So we can keep it here as false, because inside the method send_with_retry, it will
# already try to reconnect if needed.
params = params or DeepgramFluxSTTService.InputParams()
_params = params or DeepgramFluxSTTService.InputParams()
default_settings = DeepgramFluxSTTSettings(
model=model or "flux-general-en",
language=Language.EN,
encoding=flux_encoding,
eager_eot_threshold=_params.eager_eot_threshold,
eot_threshold=_params.eot_threshold,
eot_timeout_ms=_params.eot_timeout_ms,
keyterm=_params.keyterm or [],
mip_opt_out=_params.mip_opt_out,
tag=_params.tag or [],
min_confidence=_params.min_confidence,
)
if settings is not None:
default_settings.apply_update(settings)
super().__init__(
sample_rate=sample_rate,
reconnect_on_error=False,
settings=DeepgramFluxSTTSettings(
model=model,
language=Language.EN,
encoding=flux_encoding,
eager_eot_threshold=params.eager_eot_threshold,
eot_threshold=params.eot_threshold,
eot_timeout_ms=params.eot_timeout_ms,
keyterm=params.keyterm or [],
mip_opt_out=params.mip_opt_out,
tag=params.tag or [],
min_confidence=params.min_confidence,
),
settings=default_settings,
**kwargs,
)
self._api_key = api_key

View File

@@ -41,7 +41,7 @@ from pipecat.utils.time import time_now_iso8601
from pipecat.utils.tracing.service_decorators import traced_stt
try:
from pipecat.services.deepgram.stt import LiveOptions
from deepgram import LiveOptions
except ModuleNotFoundError as e:
logger.error(f"Exception: {e}")
logger.error(
@@ -51,10 +51,10 @@ except ModuleNotFoundError as e:
@dataclass
class DeepgramSageMakerSTTSettings(DeepgramSTTSettings):
class DeepgramSageMakerSTTSettings(_DeepgramSTTSettingsBase):
"""Settings for the Deepgram SageMaker STT service.
See ``DeepgramSTTSettings`` for full documentation.
See ``_DeepgramSTTSettingsBase`` for full documentation.
"""
pass
@@ -97,6 +97,7 @@ class DeepgramSageMakerSTTService(STTService):
region: str,
sample_rate: Optional[int] = None,
live_options: Optional[LiveOptions] = None,
settings: Optional[DeepgramSageMakerSTTSettings] = None,
ttfs_p99_latency: Optional[float] = DEEPGRAM_SAGEMAKER_TTFS_P99,
**kwargs,
):
@@ -111,37 +112,38 @@ class DeepgramSageMakerSTTService(STTService):
live_options: Deepgram LiveOptions configuration. Treated as a
delta from a set of sensible defaults — only the fields you
set are overridden; all others keep their default values.
settings: Runtime-updatable settings. When provided alongside
``live_options``, ``settings`` values take precedence (applied
after the ``live_options`` merge).
ttfs_p99_latency: P99 latency from speech end to final transcript in seconds.
Override for your deployment. See https://github.com/pipecat-ai/stt-benchmark
**kwargs: Additional arguments passed to the parent STTService.
"""
sample_rate = sample_rate or (live_options.sample_rate if live_options else None)
settings = DeepgramSageMakerSTTSettings(
model="nova-3",
language=Language.EN,
default_options = LiveOptions(
encoding="linear16",
language=Language.EN,
model="nova-3",
channels=1,
interim_results=True,
smart_format=False,
punctuate=True,
profanity_filter=True,
vad_events=False,
diarize=False,
endpointing=None,
)
default_settings = DeepgramSageMakerSTTSettings(
model=default_options.model,
language=default_options.language,
live_options=default_options,
)
if live_options:
lo_dict = live_options.to_dict()
delta = DeepgramSageMakerSTTSettings.from_mapping(
{k: v for k, v in lo_dict.items() if k != "sample_rate"}
)
settings.apply_update(delta)
default_settings._merge_live_options_delta(live_options)
if settings is not None:
default_settings.apply_update(settings)
super().__init__(
sample_rate=sample_rate,
ttfs_p99_latency=ttfs_p99_latency,
settings=settings,
settings=default_settings,
**kwargs,
)
@@ -228,8 +230,9 @@ class DeepgramSageMakerSTTService(STTService):
"""
logger.debug("Connecting to Deepgram on SageMaker...")
# Reconstruct a LiveOptions from the flat settings to build the query string.
live_options = LiveOptions(**self._settings.given_fields())
live_options = LiveOptions(
**{**self._settings.live_options.to_dict(), "sample_rate": self.sample_rate}
)
# Build query string from live_options, converting booleans to strings
query_params = {}
@@ -240,7 +243,6 @@ class DeepgramSageMakerSTTService(STTService):
query_params[key] = str(value).lower()
else:
query_params[key] = str(value)
query_params["sample_rate"] = str(self.sample_rate)
query_string = "&".join(f"{k}={v}" for k, v in query_params.items())

View File

@@ -33,7 +33,7 @@ from pipecat.frames.frames import (
)
from pipecat.processors.frame_processor import FrameDirection
from pipecat.services.aws.sagemaker.bidi_client import SageMakerBidiClient
from pipecat.services.settings import NOT_GIVEN, TTSSettings, _NotGiven
from pipecat.services.settings import NOT_GIVEN, TTSSettings, _NotGiven, _warn_deprecated_param
from pipecat.services.tts_service import TTSService
from pipecat.utils.tracing.service_decorators import traced_tts
@@ -78,9 +78,10 @@ class DeepgramSageMakerTTSService(TTSService):
*,
endpoint_name: str,
region: str,
voice: str = "aura-2-helena-en",
voice: Optional[str] = None,
sample_rate: Optional[int] = None,
encoding: str = "linear16",
settings: Optional[DeepgramSageMakerTTSSettings] = None,
**kwargs,
):
"""Initialize the Deepgram SageMaker TTS service.
@@ -90,21 +91,36 @@ class DeepgramSageMakerTTSService(TTSService):
deployed (e.g., "my-deepgram-tts-endpoint").
region: AWS region where the endpoint is deployed (e.g., "us-east-2").
voice: Voice model to use for synthesis. Defaults to "aura-2-helena-en".
.. deprecated:: 1.0
Use ``settings=DeepgramSageMakerTTSSettings(voice=...)`` instead.
sample_rate: Audio sample rate in Hz. If None, uses the value from StartFrame.
encoding: Audio encoding format. Defaults to "linear16".
settings: Runtime-updatable settings. When provided alongside deprecated
parameters, ``settings`` values take precedence.
**kwargs: Additional arguments passed to the parent TTSService.
"""
if voice is not None:
_warn_deprecated_param("voice", "DeepgramSageMakerTTSSettings", "voice")
voice = voice or "aura-2-helena-en"
default_settings = DeepgramSageMakerTTSSettings(
model=voice,
voice=voice,
language=None,
encoding=encoding,
)
if settings is not None:
default_settings.apply_update(settings)
super().__init__(
sample_rate=sample_rate,
push_stop_frames=True,
pause_frame_processing=True,
append_trailing_space=True,
settings=DeepgramSageMakerTTSSettings(
model=voice,
voice=voice,
language=None,
encoding=encoding,
),
settings=default_settings,
**kwargs,
)

View File

@@ -256,6 +256,7 @@ class DeepgramSTTService(STTService):
live_options: Optional[LiveOptions] = None,
addons: Optional[Dict] = None,
should_interrupt: bool = True,
settings: Optional[DeepgramSTTSettings] = None,
ttfs_p99_latency: Optional[float] = DEEPGRAM_TTFS_P99,
**kwargs,
):
@@ -279,6 +280,9 @@ class DeepgramSTTService(STTService):
.. deprecated:: 0.0.99
This parameter will be removed along with `vad_events` support.
settings: Runtime-updatable settings. When provided alongside
``live_options``, ``settings`` values take precedence (applied
after the ``live_options`` merge).
ttfs_p99_latency: P99 latency from speech end to final transcript in seconds.
Override for your deployment. See https://github.com/pipecat-ai/stt-benchmark
**kwargs: Additional arguments passed to the parent STTService.
@@ -299,7 +303,7 @@ class DeepgramSTTService(STTService):
)
base_url = url
settings = DeepgramSTTSettings(
default_settings = DeepgramSTTSettings(
model="nova-3-general",
language=Language.EN,
encoding="linear16",
@@ -318,15 +322,18 @@ class DeepgramSTTService(STTService):
delta = DeepgramSTTSettings.from_mapping(
{k: v for k, v in lo_dict.items() if k != "sample_rate"}
)
settings.apply_update(delta)
default_settings.apply_update(delta)
if settings is not None:
default_settings.apply_update(settings)
# Sync extra to top-level fields so self._settings is unambiguous
settings._sync_extra_to_fields()
default_settings._sync_extra_to_fields()
super().__init__(
sample_rate=sample_rate,
ttfs_p99_latency=ttfs_p99_latency,
settings=settings,
settings=default_settings,
**kwargs,
)

View File

@@ -30,7 +30,7 @@ from pipecat.frames.frames import (
TTSStoppedFrame,
)
from pipecat.processors.frame_processor import FrameDirection
from pipecat.services.settings import NOT_GIVEN, TTSSettings, _NotGiven
from pipecat.services.settings import NOT_GIVEN, TTSSettings, _NotGiven, _warn_deprecated_param
from pipecat.services.tts_service import TTSService, WebsocketTTSService
from pipecat.utils.tracing.service_decorators import traced_tts
@@ -72,41 +72,55 @@ class DeepgramTTSService(WebsocketTTSService):
self,
*,
api_key: str,
voice: str = "aura-2-helena-en",
voice: Optional[str] = None,
base_url: str = "wss://api.deepgram.com",
sample_rate: Optional[int] = None,
encoding: str = "linear16",
settings: Optional[DeepgramTTSSettings] = None,
**kwargs,
):
"""Initialize the Deepgram WebSocket TTS service.
Args:
api_key: Deepgram API key for authentication.
voice: Voice model to use for synthesis. Defaults to "aura-2-helena-en".
voice: Voice model to use for synthesis.
.. deprecated:: 1.0
Use ``settings=DeepgramTTSSettings(voice=...)`` instead.
base_url: WebSocket base URL for Deepgram API. Defaults to "wss://api.deepgram.com".
sample_rate: Audio sample rate in Hz. If None, uses service default.
encoding: Audio encoding format. Defaults to "linear16". Must be one of SUPPORTED_ENCODINGS.
settings: Runtime-updatable settings. When provided alongside deprecated
parameters, ``settings`` values take precedence.
**kwargs: Additional arguments passed to parent InterruptibleTTSService class.
Raises:
ValueError: If encoding is not in SUPPORTED_ENCODINGS.
"""
if voice is not None:
_warn_deprecated_param("voice", "DeepgramTTSSettings", "voice")
if encoding.lower() not in self.SUPPORTED_ENCODINGS:
raise ValueError(
f"Unsupported encoding '{encoding}'. Must be one of {', '.join(self.SUPPORTED_ENCODINGS)} for WebSocket TTS."
)
default_settings = DeepgramTTSSettings(
model=voice or "aura-2-helena-en",
voice=voice or "aura-2-helena-en",
language=None,
encoding=encoding,
)
if settings is not None:
default_settings.apply_update(settings)
super().__init__(
sample_rate=sample_rate,
pause_frame_processing=True,
push_stop_frames=True,
append_trailing_space=True,
settings=DeepgramTTSSettings(
model=voice,
voice=voice,
language=None,
encoding=encoding,
),
settings=default_settings,
**kwargs,
)
@@ -375,32 +389,46 @@ class DeepgramHttpTTSService(TTSService):
self,
*,
api_key: str,
voice: str = "aura-2-helena-en",
voice: Optional[str] = None,
aiohttp_session: aiohttp.ClientSession,
base_url: str = "https://api.deepgram.com",
sample_rate: Optional[int] = None,
encoding: str = "linear16",
settings: Optional[DeepgramTTSSettings] = None,
**kwargs,
):
"""Initialize the Deepgram TTS service.
Args:
api_key: Deepgram API key for authentication.
voice: Voice model to use for synthesis. Defaults to "aura-2-helena-en".
voice: Voice model to use for synthesis.
.. deprecated:: 1.0
Use ``settings=DeepgramTTSSettings(voice=...)`` instead.
aiohttp_session: Shared aiohttp session for HTTP requests with connection pooling.
base_url: Custom base URL for Deepgram API. Defaults to "https://api.deepgram.com".
sample_rate: Audio sample rate in Hz. If None, uses service default.
encoding: Audio encoding format. Defaults to "linear16".
settings: Runtime-updatable settings. When provided alongside deprecated
parameters, ``settings`` values take precedence.
**kwargs: Additional arguments passed to parent TTSService class.
"""
if voice is not None:
_warn_deprecated_param("voice", "DeepgramTTSSettings", "voice")
default_settings = DeepgramTTSSettings(
model=voice or "aura-2-helena-en",
voice=voice or "aura-2-helena-en",
language=None,
encoding=encoding,
)
if settings is not None:
default_settings.apply_update(settings)
super().__init__(
sample_rate=sample_rate,
settings=DeepgramTTSSettings(
model=voice,
voice=voice,
language=None,
encoding=encoding,
),
settings=default_settings,
**kwargs,
)

View File

@@ -6,10 +6,14 @@
"""DeepSeek LLM service implementation using OpenAI-compatible interface."""
from typing import Optional
from loguru import logger
from pipecat.adapters.services.open_ai_adapter import OpenAILLMInvocationParams
from pipecat.services.openai.base_llm import OpenAILLMSettings
from pipecat.services.openai.llm import OpenAILLMService
from pipecat.services.settings import _warn_deprecated_param
class DeepSeekLLMService(OpenAILLMService):
@@ -24,7 +28,8 @@ class DeepSeekLLMService(OpenAILLMService):
*,
api_key: str,
base_url: str = "https://api.deepseek.com/v1",
model: str = "deepseek-chat",
model: Optional[str] = None,
settings: Optional[OpenAILLMSettings] = None,
**kwargs,
):
"""Initialize the DeepSeek LLM service.
@@ -33,9 +38,22 @@ class DeepSeekLLMService(OpenAILLMService):
api_key: The API key for accessing DeepSeek's API.
base_url: The base URL for DeepSeek API. Defaults to "https://api.deepseek.com/v1".
model: The model identifier to use. Defaults to "deepseek-chat".
.. deprecated:: 1.0
Use ``settings=OpenAILLMSettings(model=...)`` instead.
settings: Runtime-updatable settings. When provided alongside deprecated
parameters, ``settings`` values take precedence.
**kwargs: Additional keyword arguments passed to OpenAILLMService.
"""
super().__init__(api_key=api_key, base_url=base_url, model=model, **kwargs)
if model is not None:
_warn_deprecated_param("model", "OpenAILLMSettings", "model")
default_settings = OpenAILLMSettings(model=model or "deepseek-chat")
if settings is not None:
default_settings.apply_update(settings)
super().__init__(api_key=api_key, base_url=base_url, settings=default_settings, **kwargs)
def create_client(self, api_key=None, base_url=None, **kwargs):
"""Create OpenAI-compatible client for DeepSeek API endpoint.

View File

@@ -35,7 +35,7 @@ from pipecat.frames.frames import (
VADUserStoppedSpeakingFrame,
)
from pipecat.processors.frame_processor import FrameDirection
from pipecat.services.settings import NOT_GIVEN, STTSettings, _NotGiven
from pipecat.services.settings import NOT_GIVEN, STTSettings, _NotGiven, _warn_deprecated_param
from pipecat.services.stt_latency import ELEVENLABS_REALTIME_TTFS_P99, ELEVENLABS_TTFS_P99
from pipecat.services.stt_service import SegmentedSTTService, WebsocketSTTService
from pipecat.transcriptions.language import Language, resolve_language
@@ -228,6 +228,9 @@ class ElevenLabsSTTService(SegmentedSTTService):
class InputParams(BaseModel):
"""Configuration parameters for ElevenLabs STT API.
.. deprecated:: 1.0
Use ``settings=ElevenLabsSTTSettings(...)`` instead.
Parameters:
language: Target language for transcription.
tag_audio_events: Whether to include audio events like (laughter), (coughing), in the transcription.
@@ -242,9 +245,10 @@ class ElevenLabsSTTService(SegmentedSTTService):
api_key: str,
aiohttp_session: aiohttp.ClientSession,
base_url: str = "https://api.elevenlabs.io",
model: str = "scribe_v2",
model: Optional[str] = None,
sample_rate: Optional[int] = None,
params: Optional[InputParams] = None,
settings: Optional[ElevenLabsSTTSettings] = None,
ttfs_p99_latency: Optional[float] = ELEVENLABS_TTFS_P99,
**kwargs,
):
@@ -254,25 +258,44 @@ class ElevenLabsSTTService(SegmentedSTTService):
api_key: ElevenLabs API key for authentication.
aiohttp_session: aiohttp ClientSession for HTTP requests.
base_url: Base URL for ElevenLabs API.
model: Model ID for transcription. Defaults to "scribe_v2".
model: Model ID for transcription.
.. deprecated:: 1.0
Use ``settings=ElevenLabsSTTSettings(model=...)`` instead.
sample_rate: Audio sample rate in Hz. If not provided, uses the pipeline's rate.
params: Configuration parameters for the STT service.
.. deprecated:: 1.0
Use ``settings=ElevenLabsSTTSettings(...)`` instead.
settings: Runtime-updatable settings. When provided alongside deprecated
parameters, ``settings`` values take precedence.
ttfs_p99_latency: P99 latency from speech end to final transcript in seconds.
Override for your deployment. See https://github.com/pipecat-ai/stt-benchmark
**kwargs: Additional arguments passed to SegmentedSTTService.
"""
params = params or ElevenLabsSTTService.InputParams()
if model is not None:
_warn_deprecated_param("model", "ElevenLabsSTTSettings", "model")
if params is not None:
_warn_deprecated_param("params", "ElevenLabsSTTSettings")
_params = params or ElevenLabsSTTService.InputParams()
default_settings = ElevenLabsSTTSettings(
model=model or "scribe_v2",
language=self.language_to_service_language(_params.language)
if _params.language
else "eng",
tag_audio_events=_params.tag_audio_events,
)
if settings is not None:
default_settings.apply_update(settings)
super().__init__(
sample_rate=sample_rate,
ttfs_p99_latency=ttfs_p99_latency,
settings=ElevenLabsSTTSettings(
model=model,
language=self.language_to_service_language(params.language)
if params.language
else "eng",
tag_audio_events=params.tag_audio_events,
),
settings=default_settings,
**kwargs,
)
@@ -429,6 +452,9 @@ class ElevenLabsRealtimeSTTService(WebsocketSTTService):
class InputParams(BaseModel):
"""Configuration parameters for ElevenLabs Realtime STT API.
.. deprecated:: 1.0
Use ``settings=ElevenLabsRealtimeSTTSettings(...)`` instead.
Parameters:
language_code: ISO-639-1 or ISO-639-3 language code. Leave None for auto-detection.
commit_strategy: How to segment speech - manual (Pipecat VAD) or vad (ElevenLabs VAD).
@@ -460,9 +486,10 @@ class ElevenLabsRealtimeSTTService(WebsocketSTTService):
*,
api_key: str,
base_url: str = "api.elevenlabs.io",
model: str = "scribe_v2_realtime",
model: Optional[str] = None,
sample_rate: Optional[int] = None,
params: Optional[InputParams] = None,
settings: Optional[ElevenLabsRealtimeSTTSettings] = None,
ttfs_p99_latency: Optional[float] = ELEVENLABS_REALTIME_TTFS_P99,
**kwargs,
):
@@ -471,32 +498,51 @@ class ElevenLabsRealtimeSTTService(WebsocketSTTService):
Args:
api_key: ElevenLabs API key for authentication.
base_url: Base URL for ElevenLabs WebSocket API.
model: Model ID for transcription. Defaults to "scribe_v2_realtime".
model: Model ID for transcription.
.. deprecated:: 1.0
Use ``settings=ElevenLabsRealtimeSTTSettings(model=...)`` instead.
sample_rate: Audio sample rate in Hz. If not provided, uses the pipeline's rate.
params: Configuration parameters for the STT service.
.. deprecated:: 1.0
Use ``settings=ElevenLabsRealtimeSTTSettings(...)`` instead.
settings: Runtime-updatable settings. When provided alongside deprecated
parameters, ``settings`` values take precedence.
ttfs_p99_latency: P99 latency from speech end to final transcript in seconds.
Override for your deployment. See https://github.com/pipecat-ai/stt-benchmark
**kwargs: Additional arguments passed to WebsocketSTTService.
"""
params = params or ElevenLabsRealtimeSTTService.InputParams()
if model is not None:
_warn_deprecated_param("model", "ElevenLabsRealtimeSTTSettings", "model")
if params is not None:
_warn_deprecated_param("params", "ElevenLabsRealtimeSTTSettings")
_params = params or ElevenLabsRealtimeSTTService.InputParams()
default_settings = ElevenLabsRealtimeSTTSettings(
model=model or "scribe_v2_realtime",
language=_params.language_code,
commit_strategy=_params.commit_strategy,
vad_silence_threshold_secs=_params.vad_silence_threshold_secs,
vad_threshold=_params.vad_threshold,
min_speech_duration_ms=_params.min_speech_duration_ms,
min_silence_duration_ms=_params.min_silence_duration_ms,
include_timestamps=_params.include_timestamps,
enable_logging=_params.enable_logging,
include_language_detection=_params.include_language_detection,
)
if settings is not None:
default_settings.apply_update(settings)
super().__init__(
sample_rate=sample_rate,
ttfs_p99_latency=ttfs_p99_latency,
keepalive_timeout=10,
keepalive_interval=5,
settings=ElevenLabsRealtimeSTTSettings(
model=model,
language=params.language_code,
commit_strategy=params.commit_strategy,
vad_silence_threshold_secs=params.vad_silence_threshold_secs,
vad_threshold=params.vad_threshold,
min_speech_duration_ms=params.min_speech_duration_ms,
min_silence_duration_ms=params.min_silence_duration_ms,
include_timestamps=params.include_timestamps,
enable_logging=params.enable_logging,
include_language_detection=params.include_language_detection,
),
settings=default_settings,
**kwargs,
)

View File

@@ -44,7 +44,7 @@ from pipecat.frames.frames import (
TTSStoppedFrame,
)
from pipecat.processors.frame_processor import FrameDirection
from pipecat.services.settings import NOT_GIVEN, TTSSettings, _NotGiven
from pipecat.services.settings import NOT_GIVEN, TTSSettings, _NotGiven, _warn_deprecated_param
from pipecat.services.tts_service import (
AudioContextTTSService,
TextAggregationMode,
@@ -331,6 +331,9 @@ class ElevenLabsTTSService(AudioContextTTSService):
class InputParams(BaseModel):
"""Input parameters for ElevenLabs TTS configuration.
.. deprecated:: 1.0
Use ``settings=ElevenLabsTTSSettings(...)`` instead.
Parameters:
language: Language to use for synthesis.
stability: Voice stability control (0.0 to 1.0).
@@ -361,11 +364,13 @@ class ElevenLabsTTSService(AudioContextTTSService):
self,
*,
api_key: str,
voice_id: str,
model: str = "eleven_turbo_v2_5",
voice_id: Optional[str] = None,
model: Optional[str] = None,
url: str = "wss://api.elevenlabs.io",
sample_rate: Optional[int] = None,
pronunciation_dictionary_locators: Optional[List[PronunciationDictionaryLocator]] = None,
params: Optional[InputParams] = None,
settings: Optional[ElevenLabsTTSSettings] = None,
text_aggregation_mode: Optional[TextAggregationMode] = None,
aggregate_sentences: Optional[bool] = None,
**kwargs,
@@ -375,10 +380,26 @@ class ElevenLabsTTSService(AudioContextTTSService):
Args:
api_key: ElevenLabs API key for authentication.
voice_id: ID of the voice to use for synthesis.
.. deprecated:: 1.0
Use ``settings=ElevenLabsTTSSettings(voice=...)`` instead.
model: TTS model to use (e.g., "eleven_turbo_v2_5").
.. deprecated:: 1.0
Use ``settings=ElevenLabsTTSSettings(model=...)`` instead.
url: WebSocket URL for ElevenLabs TTS API.
sample_rate: Audio sample rate. If None, uses default.
pronunciation_dictionary_locators: List of pronunciation dictionary
locators to use.
params: Additional input parameters for voice customization.
.. deprecated:: 1.0
Use ``settings=ElevenLabsTTSSettings(...)`` instead.
settings: Runtime-updatable settings. When provided alongside deprecated
parameters, ``settings`` values take precedence.
text_aggregation_mode: How to aggregate incoming text before synthesis.
aggregate_sentences: Whether to aggregate sentences within the TTSService.
@@ -387,6 +408,13 @@ class ElevenLabsTTSService(AudioContextTTSService):
**kwargs: Additional arguments passed to the parent service.
"""
if voice_id is not None:
_warn_deprecated_param("voice_id", "ElevenLabsTTSSettings", "voice")
if model is not None:
_warn_deprecated_param("model", "ElevenLabsTTSSettings", "model")
if params is not None:
_warn_deprecated_param("params", "ElevenLabsTTSSettings")
# By default, we aggregate sentences before sending to TTS. This adds
# ~200-300ms of latency per sentence (waiting for the sentence-ending
# punctuation token from the LLM). Setting
@@ -403,7 +431,26 @@ class ElevenLabsTTSService(AudioContextTTSService):
# Finally, ElevenLabs doesn't provide information on when the bot stops
# speaking for a while, so we want the parent class to send TTSStopFrame
# after a short period not receiving any audio.
params = params or ElevenLabsTTSService.InputParams()
_params = params or ElevenLabsTTSService.InputParams()
default_settings = ElevenLabsTTSSettings(
model=model or "eleven_turbo_v2_5",
voice=voice_id,
language=(
self.language_to_service_language(_params.language) if _params.language else None
),
stability=_params.stability,
similarity_boost=_params.similarity_boost,
style=_params.style,
use_speaker_boost=_params.use_speaker_boost,
speed=_params.speed,
auto_mode=str(_params.auto_mode).lower(),
enable_ssml_parsing=_params.enable_ssml_parsing,
enable_logging=_params.enable_logging,
apply_text_normalization=_params.apply_text_normalization,
)
if settings is not None:
default_settings.apply_update(settings)
super().__init__(
text_aggregation_mode=text_aggregation_mode,
@@ -413,22 +460,7 @@ class ElevenLabsTTSService(AudioContextTTSService):
pause_frame_processing=True,
supports_word_timestamps=True,
sample_rate=sample_rate,
settings=ElevenLabsTTSSettings(
model=model,
voice=voice_id,
language=(
self.language_to_service_language(params.language) if params.language else None
),
stability=params.stability,
similarity_boost=params.similarity_boost,
style=params.style,
use_speaker_boost=params.use_speaker_boost,
speed=params.speed,
auto_mode=str(params.auto_mode).lower(),
enable_ssml_parsing=params.enable_ssml_parsing,
enable_logging=params.enable_logging,
apply_text_normalization=params.apply_text_normalization,
),
settings=default_settings,
**kwargs,
)
@@ -437,7 +469,11 @@ class ElevenLabsTTSService(AudioContextTTSService):
self._output_format = "" # initialized in start()
self._voice_settings = self._set_voice_settings()
self._pronunciation_dictionary_locators = params.pronunciation_dictionary_locators
self._pronunciation_dictionary_locators = (
pronunciation_dictionary_locators
if pronunciation_dictionary_locators is not None
else _params.pronunciation_dictionary_locators
)
self._cumulative_time = 0
# Track partial words that span across alignment chunks
@@ -871,6 +907,9 @@ class ElevenLabsHttpTTSService(TTSService):
class InputParams(BaseModel):
"""Input parameters for ElevenLabs HTTP TTS configuration.
.. deprecated:: 1.0
Use ``settings=ElevenLabsHttpTTSSettings(...)`` instead.
Parameters:
language: Language to use for synthesis.
optimize_streaming_latency: Latency optimization level (0-4).
@@ -897,12 +936,14 @@ class ElevenLabsHttpTTSService(TTSService):
self,
*,
api_key: str,
voice_id: str,
voice_id: Optional[str] = None,
aiohttp_session: aiohttp.ClientSession,
model: str = "eleven_turbo_v2_5",
model: Optional[str] = None,
base_url: str = "https://api.elevenlabs.io",
sample_rate: Optional[int] = None,
pronunciation_dictionary_locators: Optional[List[PronunciationDictionaryLocator]] = None,
params: Optional[InputParams] = None,
settings: Optional[ElevenLabsHttpTTSSettings] = None,
text_aggregation_mode: Optional[TextAggregationMode] = None,
aggregate_sentences: Optional[bool] = None,
**kwargs,
@@ -912,11 +953,27 @@ class ElevenLabsHttpTTSService(TTSService):
Args:
api_key: ElevenLabs API key for authentication.
voice_id: ID of the voice to use for synthesis.
.. deprecated:: 1.0
Use ``settings=ElevenLabsHttpTTSSettings(voice=...)`` instead.
aiohttp_session: aiohttp ClientSession for HTTP requests.
model: TTS model to use (e.g., "eleven_turbo_v2_5").
.. deprecated:: 1.0
Use ``settings=ElevenLabsHttpTTSSettings(model=...)`` instead.
base_url: Base URL for ElevenLabs HTTP API.
sample_rate: Audio sample rate. If None, uses default.
pronunciation_dictionary_locators: List of pronunciation dictionary
locators to use.
params: Additional input parameters for voice customization.
.. deprecated:: 1.0
Use ``settings=ElevenLabsHttpTTSSettings(...)`` instead.
settings: Runtime-updatable settings. When provided alongside deprecated
parameters, ``settings`` values take precedence.
text_aggregation_mode: How to aggregate incoming text before synthesis.
aggregate_sentences: Whether to aggregate sentences within the TTSService.
@@ -925,7 +982,31 @@ class ElevenLabsHttpTTSService(TTSService):
**kwargs: Additional arguments passed to the parent service.
"""
params = params or ElevenLabsHttpTTSService.InputParams()
if voice_id is not None:
_warn_deprecated_param("voice_id", "ElevenLabsHttpTTSSettings", "voice")
if model is not None:
_warn_deprecated_param("model", "ElevenLabsHttpTTSSettings", "model")
if params is not None:
_warn_deprecated_param("params", "ElevenLabsHttpTTSSettings")
_params = params or ElevenLabsHttpTTSService.InputParams()
default_settings = ElevenLabsHttpTTSSettings(
model=model or "eleven_turbo_v2_5",
voice=voice_id,
language=(
self.language_to_service_language(_params.language) if _params.language else None
),
optimize_streaming_latency=_params.optimize_streaming_latency,
stability=_params.stability,
similarity_boost=_params.similarity_boost,
style=_params.style,
use_speaker_boost=_params.use_speaker_boost,
speed=_params.speed,
apply_text_normalization=_params.apply_text_normalization,
)
if settings is not None:
default_settings.apply_update(settings)
super().__init__(
text_aggregation_mode=text_aggregation_mode,
@@ -934,20 +1015,7 @@ class ElevenLabsHttpTTSService(TTSService):
push_stop_frames=True,
supports_word_timestamps=True,
sample_rate=sample_rate,
settings=ElevenLabsHttpTTSSettings(
model=model,
voice=voice_id,
language=self.language_to_service_language(params.language)
if params.language
else None,
optimize_streaming_latency=params.optimize_streaming_latency,
stability=params.stability,
similarity_boost=params.similarity_boost,
style=params.style,
use_speaker_boost=params.use_speaker_boost,
speed=params.speed,
apply_text_normalization=params.apply_text_normalization,
),
settings=default_settings,
**kwargs,
)
@@ -957,7 +1025,11 @@ class ElevenLabsHttpTTSService(TTSService):
self._output_format = "" # initialized in start()
self._voice_settings = self._set_voice_settings()
self._pronunciation_dictionary_locators = params.pronunciation_dictionary_locators
self._pronunciation_dictionary_locators = (
pronunciation_dictionary_locators
if pronunciation_dictionary_locators is not None
else _params.pronunciation_dictionary_locators
)
# Track cumulative time to properly sequence word timestamps across utterances
self._cumulative_time = 0

View File

@@ -23,7 +23,7 @@ from pydantic import BaseModel
from pipecat.frames.frames import ErrorFrame, Frame, URLImageRawFrame
from pipecat.services.image_service import ImageGenService
from pipecat.services.settings import ImageGenSettings
from pipecat.services.settings import ImageGenSettings, _warn_deprecated_param
try:
import fal_client
@@ -75,8 +75,9 @@ class FalImageGenService(ImageGenService):
*,
params: InputParams,
aiohttp_session: aiohttp.ClientSession,
model: str = "fal-ai/fast-sdxl",
model: Optional[str] = None,
key: Optional[str] = None,
settings: Optional[FalImageGenSettings] = None,
**kwargs,
):
"""Initialize the FalImageGenService.
@@ -85,10 +86,23 @@ class FalImageGenService(ImageGenService):
params: Input parameters for image generation configuration.
aiohttp_session: HTTP client session for downloading generated images.
model: The Fal.ai model to use for generation. Defaults to "fal-ai/fast-sdxl".
.. deprecated:: 1.0
Use ``settings=FalImageGenSettings(model=...)`` instead.
key: Optional API key for Fal.ai. If provided, sets FAL_KEY environment variable.
settings: Runtime-updatable settings. When provided alongside deprecated
parameters, ``settings`` values take precedence.
**kwargs: Additional arguments passed to parent ImageGenService.
"""
super().__init__(settings=FalImageGenSettings(model=model), **kwargs)
if model is not None:
_warn_deprecated_param("model", "FalImageGenSettings", "model")
default_settings = FalImageGenSettings(model=model or "fal-ai/fast-sdxl")
if settings is not None:
default_settings.apply_update(settings)
super().__init__(settings=default_settings, **kwargs)
self._params = params
self._aiohttp_session = aiohttp_session
if key:

View File

@@ -18,7 +18,7 @@ from loguru import logger
from pydantic import BaseModel
from pipecat.frames.frames import ErrorFrame, Frame, TranscriptionFrame
from pipecat.services.settings import NOT_GIVEN, STTSettings, _NotGiven
from pipecat.services.settings import NOT_GIVEN, STTSettings, _NotGiven, _warn_deprecated_param
from pipecat.services.stt_latency import FAL_TTFS_P99
from pipecat.services.stt_service import SegmentedSTTService
from pipecat.transcriptions.language import Language, resolve_language
@@ -176,6 +176,9 @@ class FalSTTService(SegmentedSTTService):
class InputParams(BaseModel):
"""Configuration parameters for Fal's Wizper API.
.. deprecated:: 1.0
Use ``settings=FalSTTSettings(...)`` instead.
Parameters:
language: Language of the audio input. Defaults to English.
task: Task to perform ('transcribe' or 'translate'). Defaults to 'transcribe'.
@@ -194,6 +197,7 @@ class FalSTTService(SegmentedSTTService):
api_key: Optional[str] = None,
sample_rate: Optional[int] = None,
params: Optional[InputParams] = None,
settings: Optional[FalSTTSettings] = None,
ttfs_p99_latency: Optional[float] = FAL_TTFS_P99,
**kwargs,
):
@@ -203,24 +207,37 @@ class FalSTTService(SegmentedSTTService):
api_key: Fal API key. If not provided, will check FAL_KEY environment variable.
sample_rate: Audio sample rate in Hz. If not provided, uses the pipeline's rate.
params: Configuration parameters for the Wizper API.
.. deprecated:: 1.0
Use ``settings=FalSTTSettings(...)`` instead.
settings: Runtime-updatable settings. When provided alongside deprecated
parameters, ``settings`` values take precedence.
ttfs_p99_latency: P99 latency from speech end to final transcript in seconds.
Override for your deployment. See https://github.com/pipecat-ai/stt-benchmark
**kwargs: Additional arguments passed to SegmentedSTTService.
"""
params = params or FalSTTService.InputParams()
if params is not None:
_warn_deprecated_param("params", "FalSTTSettings")
_params = params or FalSTTService.InputParams()
default_settings = FalSTTSettings(
model=None,
language=self.language_to_service_language(_params.language)
if _params.language
else "en",
task=_params.task,
chunk_level=_params.chunk_level,
version=_params.version,
)
if settings is not None:
default_settings.apply_update(settings)
super().__init__(
sample_rate=sample_rate,
ttfs_p99_latency=ttfs_p99_latency,
settings=FalSTTSettings(
model=None,
language=self.language_to_service_language(params.language)
if params.language
else "en",
task=params.task,
chunk_level=params.chunk_level,
version=params.version,
),
settings=default_settings,
**kwargs,
)

View File

@@ -6,10 +6,14 @@
"""Fireworks AI service implementation using OpenAI-compatible interface."""
from typing import Optional
from loguru import logger
from pipecat.adapters.services.open_ai_adapter import OpenAILLMInvocationParams
from pipecat.services.openai.base_llm import OpenAILLMSettings
from pipecat.services.openai.llm import OpenAILLMService
from pipecat.services.settings import _warn_deprecated_param
class FireworksLLMService(OpenAILLMService):
@@ -23,8 +27,9 @@ class FireworksLLMService(OpenAILLMService):
self,
*,
api_key: str,
model: str = "accounts/fireworks/models/firefunction-v2",
model: Optional[str] = None,
base_url: str = "https://api.fireworks.ai/inference/v1",
settings: Optional[OpenAILLMSettings] = None,
**kwargs,
):
"""Initialize the Fireworks LLM service.
@@ -32,10 +37,25 @@ class FireworksLLMService(OpenAILLMService):
Args:
api_key: The API key for accessing Fireworks AI.
model: The model identifier to use. Defaults to "accounts/fireworks/models/firefunction-v2".
.. deprecated:: 1.0
Use ``settings=OpenAILLMSettings(model=...)`` instead.
base_url: The base URL for Fireworks API. Defaults to "https://api.fireworks.ai/inference/v1".
settings: Runtime-updatable settings. When provided alongside deprecated
parameters, ``settings`` values take precedence.
**kwargs: Additional keyword arguments passed to OpenAILLMService.
"""
super().__init__(api_key=api_key, base_url=base_url, model=model, **kwargs)
if model is not None:
_warn_deprecated_param("model", "OpenAILLMSettings", "model")
default_settings = OpenAILLMSettings(
model=model or "accounts/fireworks/models/firefunction-v2"
)
if settings is not None:
default_settings.apply_update(settings)
super().__init__(api_key=api_key, base_url=base_url, settings=default_settings, **kwargs)
def create_client(self, api_key=None, base_url=None, **kwargs):
"""Create OpenAI-compatible client for Fireworks API endpoint.

View File

@@ -29,7 +29,7 @@ from pipecat.frames.frames import (
TTSStoppedFrame,
)
from pipecat.processors.frame_processor import FrameDirection
from pipecat.services.settings import NOT_GIVEN, TTSSettings, _NotGiven
from pipecat.services.settings import NOT_GIVEN, TTSSettings, _NotGiven, _warn_deprecated_param
from pipecat.services.tts_service import InterruptibleTTSService
from pipecat.transcriptions.language import Language
from pipecat.utils.tracing.service_decorators import traced_tts
@@ -95,6 +95,9 @@ class FishAudioTTSService(InterruptibleTTSService):
class InputParams(BaseModel):
"""Input parameters for Fish Audio TTS configuration.
.. deprecated:: 1.0
Use ``settings=FishAudioTTSSettings(...)`` instead.
Parameters:
language: Language for synthesis. Defaults to English.
latency: Latency mode ("normal" or "balanced"). Defaults to "normal".
@@ -115,10 +118,11 @@ class FishAudioTTSService(InterruptibleTTSService):
api_key: str,
reference_id: Optional[str] = None, # This is the voice ID
model: Optional[str] = None, # Deprecated
model_id: str = "s1",
model_id: Optional[str] = None,
output_format: FishAudioOutputFormat = "pcm",
sample_rate: Optional[int] = None,
params: Optional[InputParams] = None,
settings: Optional[FishAudioTTSSettings] = None,
**kwargs,
):
"""Initialize the Fish Audio TTS service.
@@ -126,19 +130,40 @@ class FishAudioTTSService(InterruptibleTTSService):
Args:
api_key: Fish Audio API key for authentication.
reference_id: Reference ID of the voice model to use for synthesis.
.. deprecated:: 1.0
Use ``settings=FishAudioTTSSettings(voice=...)`` instead.
model: Deprecated. Reference ID of the voice model to use for synthesis.
.. deprecated:: 0.0.74
The `model` parameter is deprecated and will be removed in version 0.1.0.
Use `reference_id` instead to specify the voice model.
.. deprecated:: 0.0.74
The ``model`` parameter is deprecated and will be removed in version 0.1.0.
Use ``reference_id`` instead to specify the voice model.
model_id: Specify which Fish Audio TTS model to use (e.g. "s1").
.. deprecated:: 1.0
Use ``settings=FishAudioTTSSettings(model=...)`` instead.
model_id: Specify which Fish Audio TTS model to use (e.g. "s1")
output_format: Audio output format. Defaults to "pcm".
sample_rate: Audio sample rate. If None, uses default.
params: Additional input parameters for voice customization.
.. deprecated:: 1.0
Use ``settings=FishAudioTTSSettings(...)`` instead.
settings: Runtime-updatable settings. When provided alongside deprecated
parameters, ``settings`` values take precedence.
**kwargs: Additional arguments passed to the parent service.
"""
params = params or FishAudioTTSService.InputParams()
if reference_id is not None:
_warn_deprecated_param("reference_id", "FishAudioTTSSettings", "voice")
if model_id is not None:
_warn_deprecated_param("model_id", "FishAudioTTSSettings", "model")
if params is not None:
_warn_deprecated_param("params", "FishAudioTTSSettings")
_params = params or FishAudioTTSService.InputParams()
# Validation for model and reference_id parameters
if model and reference_id:
@@ -146,9 +171,6 @@ class FishAudioTTSService(InterruptibleTTSService):
"Cannot specify both 'model' and 'reference_id'. Use 'reference_id' only."
)
if model is None and reference_id is None:
raise ValueError("Must specify 'reference_id' (or deprecated 'model') parameter.")
if model:
import warnings
@@ -162,21 +184,25 @@ class FishAudioTTSService(InterruptibleTTSService):
)
reference_id = model
default_settings = FishAudioTTSSettings(
model=model_id or "s1",
voice=reference_id,
fish_sample_rate=0,
latency=_params.latency,
format=output_format,
normalize=_params.normalize,
prosody_speed=_params.prosody_speed,
prosody_volume=_params.prosody_volume,
reference_id=reference_id,
)
if settings is not None:
default_settings.apply_update(settings)
super().__init__(
push_stop_frames=True,
pause_frame_processing=True,
sample_rate=sample_rate,
settings=FishAudioTTSSettings(
model=model_id,
voice=reference_id,
fish_sample_rate=0,
latency=params.latency,
format=output_format,
normalize=params.normalize,
prosody_speed=params.prosody_speed,
prosody_volume=params.prosody_volume,
reference_id=reference_id,
),
settings=default_settings,
**kwargs,
)

View File

@@ -39,7 +39,7 @@ from pipecat.services.gladia.config import (
PreProcessingConfig,
RealtimeProcessingConfig,
)
from pipecat.services.settings import NOT_GIVEN, STTSettings, _NotGiven
from pipecat.services.settings import NOT_GIVEN, STTSettings, _NotGiven, _warn_deprecated_param
from pipecat.services.stt_latency import GLADIA_TTFS_P99
from pipecat.services.stt_service import WebsocketSTTService
from pipecat.transcriptions.language import Language, resolve_language
@@ -249,10 +249,11 @@ class GladiaSTTService(WebsocketSTTService):
url: str = "https://api.gladia.io/v2/live",
confidence: Optional[float] = None,
sample_rate: Optional[int] = None,
model: str = "solaria-1",
model: Optional[str] = None,
params: Optional[GladiaInputParams] = None,
max_buffer_size: int = 1024 * 1024 * 20, # 20MB default buffer
should_interrupt: bool = True,
settings: Optional[GladiaSTTSettings] = None,
ttfs_p99_latency: Optional[float] = GLADIA_TTFS_P99,
**kwargs,
):
@@ -269,15 +270,30 @@ class GladiaSTTService(WebsocketSTTService):
No confidence threshold is applied.
sample_rate: Audio sample rate in Hz. If None, uses service default.
model: Model to use for transcription. Defaults to "solaria-1".
model: Model to use for transcription.
.. deprecated:: 1.0
Use ``settings=GladiaSTTSettings(model=...)`` instead.
params: Additional configuration parameters for Gladia service.
.. deprecated:: 1.0
Use ``settings=GladiaSTTSettings(...)`` instead.
max_buffer_size: Maximum size of audio buffer in bytes. Defaults to 20MB.
should_interrupt: Determine whether the bot should be interrupted when
Gladia VAD detects user speech. Defaults to True.
settings: Runtime-updatable settings. When provided alongside deprecated
parameters, ``settings`` values take precedence.
ttfs_p99_latency: P99 latency from speech end to final transcript in seconds.
Override for your deployment. See https://github.com/pipecat-ai/stt-benchmark
**kwargs: Additional arguments passed to the STTService parent class.
"""
if model is not None:
_warn_deprecated_param("model", "GladiaSTTSettings", "model")
if params is not None:
_warn_deprecated_param("params", "GladiaSTTSettings")
params = params or GladiaInputParams()
if params.language is not None:
@@ -307,26 +323,30 @@ class GladiaSTTService(WebsocketSTTService):
if language_code:
language_config = LanguageConfig(languages=[language_code], code_switching=False)
default_settings = GladiaSTTSettings(
model=model or "solaria-1",
language=None,
encoding=params.encoding,
bit_depth=params.bit_depth,
channels=params.channels,
custom_metadata=params.custom_metadata,
endpointing=params.endpointing,
maximum_duration_without_endpointing=params.maximum_duration_without_endpointing,
language_config=language_config,
pre_processing=params.pre_processing,
realtime_processing=params.realtime_processing,
messages_config=params.messages_config,
enable_vad=params.enable_vad,
)
if settings is not None:
default_settings.apply_update(settings)
super().__init__(
sample_rate=sample_rate,
ttfs_p99_latency=ttfs_p99_latency,
keepalive_timeout=20,
keepalive_interval=5,
settings=GladiaSTTSettings(
model=model,
language=None,
encoding=params.encoding,
bit_depth=params.bit_depth,
channels=params.channels,
custom_metadata=params.custom_metadata,
endpointing=params.endpointing,
maximum_duration_without_endpointing=params.maximum_duration_without_endpointing,
language_config=language_config,
pre_processing=params.pre_processing,
realtime_processing=params.realtime_processing,
messages_config=params.messages_config,
enable_vad=params.enable_vad,
),
settings=default_settings,
**kwargs,
)

View File

@@ -76,7 +76,7 @@ from pipecat.services.openai.llm import (
OpenAIAssistantContextAggregator,
OpenAIUserContextAggregator,
)
from pipecat.services.settings import NOT_GIVEN, LLMSettings, _NotGiven
from pipecat.services.settings import NOT_GIVEN, LLMSettings, _NotGiven, _warn_deprecated_param
from pipecat.transcriptions.language import Language, resolve_language
from pipecat.utils.string import match_endofsentence
from pipecat.utils.time import time_now_iso8601
@@ -552,6 +552,9 @@ class ContextWindowCompressionParams(BaseModel):
class InputParams(BaseModel):
"""Input parameters for Gemini Live generation.
.. deprecated::
Use ``GeminiLiveLLMSettings`` instead.
Parameters:
frequency_penalty: Frequency penalty for generation (0.0-2.0). Defaults to None.
max_tokens: Maximum tokens to generate. Must be >= 1. Defaults to 4096.
@@ -647,13 +650,14 @@ class GeminiLiveLLMService(LLMService):
*,
api_key: str,
base_url: Optional[str] = None,
model="models/gemini-2.5-flash-native-audio-preview-12-2025",
model: Optional[str] = None,
voice_id: str = "Charon",
start_audio_paused: bool = False,
start_video_paused: bool = False,
system_instruction: Optional[str] = None,
tools: Optional[Union[List[dict], ToolsSchema]] = None,
params: Optional[InputParams] = None,
settings: Optional[GeminiLiveLLMSettings] = None,
inference_on_context_initialization: bool = True,
file_api_base_url: str = "https://generativelanguage.googleapis.com/v1beta/files",
http_options: Optional[HttpOptions] = None,
@@ -670,13 +674,23 @@ class GeminiLiveLLMService(LLMService):
Please use `http_options` to customize requests made by the
API client.
model: Model identifier to use. Defaults to "models/gemini-2.5-flash-native-audio-preview-12-2025".
model: Model identifier to use.
.. deprecated::
Use ``settings=GeminiLiveLLMSettings(model=...)`` instead.
voice_id: TTS voice identifier. Defaults to "Charon".
start_audio_paused: Whether to start with audio input paused. Defaults to False.
start_video_paused: Whether to start with video input paused. Defaults to False.
system_instruction: System prompt for the model. Defaults to None.
tools: Tools/functions available to the model. Defaults to None.
params: Configuration parameters for the model. Defaults to InputParams().
params: Configuration parameters for the model.
.. deprecated::
Use ``settings=GeminiLiveLLMSettings(...)`` instead.
settings: Gemini Live LLM settings. If provided together with deprecated
top-level parameters, the ``settings`` values take precedence.
inference_on_context_initialization: Whether to generate a response when context
is first set. Defaults to True.
file_api_base_url: Base URL for the Gemini File API. Defaults to the official endpoint.
@@ -694,43 +708,49 @@ class GeminiLiveLLMService(LLMService):
DeprecationWarning,
stacklevel=2,
)
if model is not None:
_warn_deprecated_param("model", "GeminiLiveLLMSettings", "model")
if params is not None:
_warn_deprecated_param("params", "GeminiLiveLLMSettings")
params = params or InputParams()
_params = params or InputParams()
default_settings = GeminiLiveLLMSettings(
model=model or "models/gemini-2.5-flash-native-audio-preview-12-2025",
frequency_penalty=_params.frequency_penalty,
max_tokens=_params.max_tokens,
presence_penalty=_params.presence_penalty,
temperature=_params.temperature,
top_k=_params.top_k,
top_p=_params.top_p,
seed=None,
filter_incomplete_user_turns=False,
user_turn_completion_config=None,
modalities=_params.modalities,
language=language_to_gemini_language(_params.language) if _params.language else "en-US",
media_resolution=_params.media_resolution,
vad=_params.vad,
context_window_compression=_params.context_window_compression.model_dump()
if _params.context_window_compression
else {},
thinking=_params.thinking or {},
enable_affective_dialog=_params.enable_affective_dialog or False,
proactivity=_params.proactivity or {},
extra=_params.extra if isinstance(_params.extra, dict) else {},
)
if settings is not None:
default_settings.apply_update(settings)
super().__init__(
base_url=base_url,
settings=GeminiLiveLLMSettings(
model=model,
frequency_penalty=params.frequency_penalty,
max_tokens=params.max_tokens,
presence_penalty=params.presence_penalty,
temperature=params.temperature,
top_k=params.top_k,
top_p=params.top_p,
seed=None,
filter_incomplete_user_turns=False,
user_turn_completion_config=None,
modalities=params.modalities,
language=language_to_gemini_language(params.language)
if params.language
else "en-US",
media_resolution=params.media_resolution,
vad=params.vad,
context_window_compression=params.context_window_compression.model_dump()
if params.context_window_compression
else {},
thinking=params.thinking or {},
enable_affective_dialog=params.enable_affective_dialog or False,
proactivity=params.proactivity or {},
extra=params.extra if isinstance(params.extra, dict) else {},
),
settings=default_settings,
**kwargs,
)
self._last_sent_time = 0
self._base_url = base_url
self._voice_id = voice_id
self._language_code = params.language
self._language_code = _params.language
self._system_instruction_from_init = system_instruction
self._tools_from_init = tools
@@ -760,11 +780,11 @@ class GeminiLiveLLMService(LLMService):
self._sample_rate = 24000
self._language = params.language
self._language = _params.language
self._language_code = (
language_to_gemini_language(params.language) if params.language else "en-US"
language_to_gemini_language(_params.language) if _params.language else "en-US"
)
self._vad_params = params.vad
self._vad_params = _params.vad
# Reconnection tracking
self._consecutive_failures = 0

View File

@@ -19,9 +19,12 @@ from loguru import logger
from pipecat.adapters.schemas.tools_schema import ToolsSchema
from pipecat.services.google.gemini_live.llm import (
GeminiLiveLLMService,
GeminiLiveLLMSettings,
HttpOptions,
InputParams,
language_to_gemini_language,
)
from pipecat.services.settings import _warn_deprecated_param
try:
from google.auth import default
@@ -51,13 +54,14 @@ class GeminiLiveVertexLLMService(GeminiLiveLLMService):
credentials_path: Optional[str] = None,
location: str,
project_id: str,
model="google/gemini-live-2.5-flash-native-audio",
model: Optional[str] = None,
voice_id: str = "Charon",
start_audio_paused: bool = False,
start_video_paused: bool = False,
system_instruction: Optional[str] = None,
tools: Optional[Union[List[dict], ToolsSchema]] = None,
params: Optional[InputParams] = None,
settings: Optional[GeminiLiveLLMSettings] = None,
inference_on_context_initialization: bool = True,
file_api_base_url: str = "https://generativelanguage.googleapis.com/v1beta/files",
http_options: Optional[HttpOptions] = None,
@@ -70,7 +74,11 @@ class GeminiLiveVertexLLMService(GeminiLiveLLMService):
credentials_path: Path to the service account JSON file.
location: GCP region for Vertex AI endpoint (e.g., "us-east4").
project_id: Google Cloud project ID.
model: Model identifier to use. Defaults to "models/gemini-live-2.5-flash-native-audio".
model: Model identifier to use.
.. deprecated::
Use ``settings=GeminiLiveLLMSettings(model=...)`` instead.
voice_id: TTS voice identifier. Defaults to "Charon".
start_audio_paused: Whether to start with audio input paused. Defaults to False.
start_video_paused: Whether to start with video input paused. Defaults to False.
@@ -78,6 +86,12 @@ class GeminiLiveVertexLLMService(GeminiLiveLLMService):
tools: Tools/functions available to the model. Defaults to None.
params: Configuration parameters for the model along with Vertex AI
location and project ID.
.. deprecated::
Use ``settings=GeminiLiveLLMSettings(...)`` instead.
settings: Gemini Live LLM settings. If provided together with deprecated
top-level parameters, the ``settings`` values take precedence.
inference_on_context_initialization: Whether to generate a response when context
is first set. Defaults to True.
file_api_base_url: Base URL for the Gemini File API. Defaults to the official endpoint.
@@ -95,24 +109,59 @@ class GeminiLiveVertexLLMService(GeminiLiveLLMService):
"Invalid parameter 'api_key'. Use 'credentials' or 'credentials_path' for Vertex AI authentication."
)
if model is not None:
_warn_deprecated_param("model", "GeminiLiveLLMSettings", "model")
if params is not None:
_warn_deprecated_param("params", "GeminiLiveLLMSettings")
# These need to be set before calling super().__init__() because
# super().__init__() invokes create_client(), which needs these.
self._credentials = self._get_credentials(credentials, credentials_path)
self._project_id = project_id
self._location = location
# Call parent constructor with the obtained API key
# Build default_settings from deprecated args, then apply settings delta.
# We pass settings= to super() instead of model=/params= to avoid
# double deprecation warnings from the parent.
_params = params or InputParams()
default_settings = GeminiLiveLLMSettings(
model=model or "google/gemini-live-2.5-flash-native-audio",
frequency_penalty=_params.frequency_penalty,
max_tokens=_params.max_tokens,
presence_penalty=_params.presence_penalty,
temperature=_params.temperature,
top_k=_params.top_k,
top_p=_params.top_p,
seed=None,
filter_incomplete_user_turns=False,
user_turn_completion_config=None,
modalities=_params.modalities,
language=language_to_gemini_language(_params.language) if _params.language else "en-US",
media_resolution=_params.media_resolution,
vad=_params.vad,
context_window_compression=_params.context_window_compression.model_dump()
if _params.context_window_compression
else {},
thinking=_params.thinking or {},
enable_affective_dialog=_params.enable_affective_dialog or False,
proactivity=_params.proactivity or {},
extra=_params.extra if isinstance(_params.extra, dict) else {},
)
if settings is not None:
default_settings.apply_update(settings)
# Call parent constructor with the obtained settings
super().__init__(
# api_key is required by parent class, but actually not used with
# Vertex
api_key="dummy",
model=model,
voice_id=voice_id,
start_audio_paused=start_audio_paused,
start_video_paused=start_video_paused,
system_instruction=system_instruction,
tools=tools,
params=params,
settings=default_settings,
inference_on_context_initialization=inference_on_context_initialization,
file_api_base_url=file_api_base_url,
http_options=http_options,

View File

@@ -26,7 +26,7 @@ from pydantic import BaseModel, Field
from pipecat.frames.frames import ErrorFrame, Frame, URLImageRawFrame
from pipecat.services.google.utils import update_google_client_http_options
from pipecat.services.image_service import ImageGenService
from pipecat.services.settings import ImageGenSettings
from pipecat.services.settings import ImageGenSettings, _warn_deprecated_param
try:
from google import genai
@@ -73,18 +73,33 @@ class GoogleImageGenService(ImageGenService):
api_key: str,
params: Optional[InputParams] = None,
http_options: Optional[Any] = None,
settings: Optional[GoogleImageGenSettings] = None,
**kwargs,
):
"""Initialize the GoogleImageGenService with API key and parameters.
Args:
api_key: Google AI API key for authentication.
params: Configuration parameters for image generation. Defaults to InputParams().
params: Configuration parameters for image generation.
.. deprecated:: 1.0
Use ``settings=GoogleImageGenSettings(model=...)`` instead.
http_options: HTTP options for the client.
settings: Runtime-updatable settings. When provided alongside deprecated
parameters, ``settings`` values take precedence.
**kwargs: Additional arguments passed to the parent ImageGenService.
"""
if params is not None:
_warn_deprecated_param("params", "GoogleImageGenSettings")
params = params or GoogleImageGenService.InputParams()
super().__init__(settings=GoogleImageGenSettings(model=params.model), **kwargs)
default_settings = GoogleImageGenSettings(model=params.model)
if settings is not None:
default_settings.apply_update(settings)
super().__init__(settings=default_settings, **kwargs)
self._params = params
# Add client header

View File

@@ -58,7 +58,13 @@ from pipecat.services.openai.llm import (
OpenAIAssistantContextAggregator,
OpenAIUserContextAggregator,
)
from pipecat.services.settings import NOT_GIVEN, LLMSettings, _NotGiven, is_given
from pipecat.services.settings import (
NOT_GIVEN,
LLMSettings,
_NotGiven,
_warn_deprecated_param,
is_given,
)
from pipecat.utils.tracing.service_decorators import traced_llm
# Suppress gRPC fork warnings
@@ -748,6 +754,9 @@ class GoogleLLMService(LLMService):
class InputParams(BaseModel):
"""Input parameters for Google AI models.
.. deprecated::
Use ``settings=GoogleLLMSettings(...)`` instead.
Parameters:
max_tokens: Maximum number of tokens to generate.
temperature: Sampling temperature between 0.0 and 2.0.
@@ -773,8 +782,9 @@ class GoogleLLMService(LLMService):
self,
*,
api_key: str,
model: str = "gemini-2.5-flash",
model: Optional[str] = None,
params: Optional[InputParams] = None,
settings: Optional[GoogleLLMSettings] = None,
system_instruction: Optional[str] = None,
tools: Optional[List[Dict[str, Any]]] = None,
tool_config: Optional[Dict[str, Any]] = None,
@@ -785,33 +795,50 @@ class GoogleLLMService(LLMService):
Args:
api_key: Google AI API key for authentication.
model: Model name to use. Defaults to "gemini-2.0-flash".
params: Input parameters for the model.
model: Model name to use.
.. deprecated::
Use ``settings=GoogleLLMSettings(model=...)`` instead.
params: Optional model parameters for inference.
.. deprecated::
Use ``settings=GoogleLLMSettings(...)`` instead.
settings: Runtime-updatable settings for this service. When both
deprecated parameters and *settings* are provided, *settings*
values take precedence.
system_instruction: System instruction/prompt for the model.
tools: List of available tools/functions.
tool_config: Configuration for tool usage.
http_options: HTTP options for the client.
**kwargs: Additional arguments passed to parent class.
"""
params = params or GoogleLLMService.InputParams()
if model is not None:
_warn_deprecated_param("model", "GoogleLLMSettings", "model")
if params is not None:
_warn_deprecated_param("params", "GoogleLLMSettings")
super().__init__(
settings=GoogleLLMSettings(
model=model,
max_tokens=params.max_tokens,
temperature=params.temperature,
top_k=params.top_k,
top_p=params.top_p,
frequency_penalty=None,
presence_penalty=None,
seed=None,
filter_incomplete_user_turns=False,
user_turn_completion_config=None,
thinking=params.thinking,
extra=params.extra if isinstance(params.extra, dict) else {},
),
**kwargs,
_params = params or GoogleLLMService.InputParams()
default_settings = GoogleLLMSettings(
model=model or "gemini-2.5-flash",
max_tokens=_params.max_tokens,
temperature=_params.temperature,
top_k=_params.top_k,
top_p=_params.top_p,
frequency_penalty=None,
presence_penalty=None,
seed=None,
filter_incomplete_user_turns=False,
user_turn_completion_config=None,
thinking=_params.thinking,
extra=_params.extra if isinstance(_params.extra, dict) else {},
)
if settings is not None:
default_settings.apply_update(settings)
super().__init__(settings=default_settings, **kwargs)
self._api_key = api_key
self._system_instruction = system_instruction

View File

@@ -12,6 +12,7 @@ API format through Google's Gemini API OpenAI compatibility layer.
import json
import os
from typing import Optional
from openai import AsyncStream
from openai.types.chat import ChatCompletionChunk
@@ -26,7 +27,9 @@ from loguru import logger
from pipecat.frames.frames import LLMTextFrame
from pipecat.metrics.metrics import LLMTokenUsage
from pipecat.processors.aggregators.openai_llm_context import OpenAILLMContext
from pipecat.services.openai.base_llm import OpenAILLMSettings
from pipecat.services.openai.llm import OpenAILLMService
from pipecat.services.settings import _warn_deprecated_param
class GoogleLLMOpenAIBetaService(OpenAILLMService):
@@ -52,7 +55,8 @@ class GoogleLLMOpenAIBetaService(OpenAILLMService):
*,
api_key: str,
base_url: str = "https://generativelanguage.googleapis.com/v1beta/openai/",
model: str = "gemini-2.0-flash",
model: Optional[str] = None,
settings: Optional[OpenAILLMSettings] = None,
**kwargs,
):
"""Initialize the Google LLM service.
@@ -61,6 +65,12 @@ class GoogleLLMOpenAIBetaService(OpenAILLMService):
api_key: Google API key for authentication.
base_url: Base URL for Google's OpenAI-compatible API.
model: Google model name to use (e.g., "gemini-2.0-flash").
.. deprecated:: 1.0
Use ``settings=OpenAILLMSettings(model=...)`` instead.
settings: Runtime-updatable settings. When provided alongside deprecated
parameters, ``settings`` values take precedence.
**kwargs: Additional arguments passed to the parent OpenAILLMService.
"""
import warnings
@@ -74,7 +84,14 @@ class GoogleLLMOpenAIBetaService(OpenAILLMService):
stacklevel=2,
)
super().__init__(api_key=api_key, base_url=base_url, model=model, **kwargs)
if model is not None:
_warn_deprecated_param("model", "OpenAILLMSettings", "model")
default_settings = OpenAILLMSettings(model=model or "gemini-2.0-flash")
if settings is not None:
default_settings.apply_update(settings)
super().__init__(api_key=api_key, base_url=base_url, settings=default_settings, **kwargs)
async def _process_context(self, context: OpenAILLMContext):
functions_list = []

View File

@@ -20,7 +20,8 @@ from typing import Optional
from loguru import logger
from pipecat.services.google.llm import GoogleLLMService
from pipecat.services.google.llm import GoogleLLMService, GoogleLLMSettings
from pipecat.services.settings import _warn_deprecated_param
try:
from google.auth import default
@@ -99,10 +100,11 @@ class GoogleVertexLLMService(GoogleLLMService):
*,
credentials: Optional[str] = None,
credentials_path: Optional[str] = None,
model: str = "gemini-2.5-flash",
model: Optional[str] = None,
location: Optional[str] = None,
project_id: Optional[str] = None,
params: Optional[GoogleLLMService.InputParams] = None,
settings: Optional[GoogleLLMSettings] = None,
system_instruction: Optional[str] = None,
tools: Optional[list] = None,
tool_config: Optional[dict] = None,
@@ -115,9 +117,20 @@ class GoogleVertexLLMService(GoogleLLMService):
credentials: JSON string of service account credentials.
credentials_path: Path to the service account JSON file.
model: Model identifier (e.g., "gemini-2.5-flash").
.. deprecated::
Use ``settings=GoogleLLMSettings(model=...)`` instead.
location: GCP region for Vertex AI endpoint (e.g., "us-east4").
project_id: Google Cloud project ID.
params: Input parameters for the model.
.. deprecated::
Use ``settings=GoogleLLMSettings(...)`` instead.
settings: Runtime-updatable settings for this service. When both
deprecated parameters and *settings* are provided, *settings*
values take precedence.
system_instruction: System instruction/prompt for the model.
tools: List of available tools/functions.
tool_config: Configuration for tool usage.
@@ -135,6 +148,11 @@ class GoogleVertexLLMService(GoogleLLMService):
"Invalid parameter 'api_key'. Use 'credentials' or 'credentials_path' for Vertex AI authentication."
)
if model is not None:
_warn_deprecated_param("model", "GoogleLLMSettings", "model")
if params is not None:
_warn_deprecated_param("params", "GoogleLLMSettings")
# Handle deprecated InputParams fields
if params and isinstance(params, GoogleVertexLLMService.InputParams):
# Extract location and project_id from params if not provided
@@ -170,12 +188,30 @@ class GoogleVertexLLMService(GoogleLLMService):
self._project_id = project_id
self._location = location
# Build default_settings from deprecated args
_params = params or GoogleLLMService.InputParams()
default_settings = GoogleLLMSettings(
model=model or "gemini-2.5-flash",
max_tokens=_params.max_tokens,
temperature=_params.temperature,
top_k=_params.top_k,
top_p=_params.top_p,
frequency_penalty=None,
presence_penalty=None,
seed=None,
filter_incomplete_user_turns=False,
user_turn_completion_config=None,
thinking=_params.thinking,
extra=_params.extra if isinstance(_params.extra, dict) else {},
)
if settings is not None:
default_settings.apply_update(settings)
# Call parent constructor with dummy api_key
# (api_key is required by parent class, but not actually used with Vertex)
super().__init__(
api_key="dummy",
model=model,
params=params,
settings=default_settings,
system_instruction=system_instruction,
tools=tools,
tool_config=tool_config,

View File

@@ -36,7 +36,7 @@ from pipecat.frames.frames import (
StartFrame,
TranscriptionFrame,
)
from pipecat.services.settings import NOT_GIVEN, STTSettings, _NotGiven
from pipecat.services.settings import NOT_GIVEN, STTSettings, _NotGiven, _warn_deprecated_param
from pipecat.services.stt_latency import GOOGLE_TTFS_P99
from pipecat.services.stt_service import STTService
from pipecat.transcriptions.language import Language, resolve_language
@@ -425,6 +425,9 @@ class GoogleSTTService(STTService):
class InputParams(BaseModel):
"""Configuration parameters for Google Speech-to-Text.
.. deprecated:: 1.0
Use ``settings=GoogleSTTSettings(...)`` instead.
Parameters:
languages: Single language or list of recognition languages. First language is primary.
model: Speech recognition model to use.
@@ -484,6 +487,7 @@ class GoogleSTTService(STTService):
location: str = "global",
sample_rate: Optional[int] = None,
params: Optional[InputParams] = None,
settings: Optional[GoogleSTTSettings] = None,
ttfs_p99_latency: Optional[float] = GOOGLE_TTFS_P99,
**kwargs,
):
@@ -495,30 +499,43 @@ class GoogleSTTService(STTService):
location: Google Cloud location (e.g., "global", "us-central1").
sample_rate: Audio sample rate in Hertz.
params: Configuration parameters for the service.
.. deprecated:: 1.0
Use ``settings=GoogleSTTSettings(...)`` instead.
settings: Runtime-updatable settings. When provided alongside deprecated
``params``, ``settings`` values take precedence.
ttfs_p99_latency: P99 latency from speech end to final transcript in seconds.
Override for your deployment. See https://github.com/pipecat-ai/stt-benchmark
**kwargs: Additional arguments passed to STTService.
"""
params = params or GoogleSTTService.InputParams()
if params is not None:
_warn_deprecated_param("params", "GoogleSTTSettings")
_params = params or GoogleSTTService.InputParams()
default_settings = GoogleSTTSettings(
language=None,
languages=list(_params.language_list),
language_codes=None,
model=_params.model,
use_separate_recognition_per_channel=_params.use_separate_recognition_per_channel,
enable_automatic_punctuation=_params.enable_automatic_punctuation,
enable_spoken_punctuation=_params.enable_spoken_punctuation,
enable_spoken_emojis=_params.enable_spoken_emojis,
profanity_filter=_params.profanity_filter,
enable_word_time_offsets=_params.enable_word_time_offsets,
enable_word_confidence=_params.enable_word_confidence,
enable_interim_results=_params.enable_interim_results,
enable_voice_activity_events=_params.enable_voice_activity_events,
)
if settings is not None:
default_settings.apply_update(settings)
super().__init__(
sample_rate=sample_rate,
ttfs_p99_latency=ttfs_p99_latency,
settings=GoogleSTTSettings(
language=None,
languages=list(params.language_list),
language_codes=None,
model=params.model,
use_separate_recognition_per_channel=params.use_separate_recognition_per_channel,
enable_automatic_punctuation=params.enable_automatic_punctuation,
enable_spoken_punctuation=params.enable_spoken_punctuation,
enable_spoken_emojis=params.enable_spoken_emojis,
profanity_filter=params.profanity_filter,
enable_word_time_offsets=params.enable_word_time_offsets,
enable_word_confidence=params.enable_word_confidence,
enable_interim_results=params.enable_interim_results,
enable_voice_activity_events=params.enable_voice_activity_events,
),
settings=default_settings,
**kwargs,
)

View File

@@ -37,7 +37,13 @@ from pipecat.frames.frames import (
TTSStartedFrame,
TTSStoppedFrame,
)
from pipecat.services.settings import NOT_GIVEN, TTSSettings, _NotGiven, is_given
from pipecat.services.settings import (
NOT_GIVEN,
TTSSettings,
_NotGiven,
_warn_deprecated_param,
is_given,
)
from pipecat.services.tts_service import TTSService
from pipecat.transcriptions.language import Language, resolve_language
@@ -560,6 +566,9 @@ class GoogleHttpTTSService(TTSService):
class InputParams(BaseModel):
"""Input parameters for Google HTTP TTS voice customization.
.. deprecated:: 1.0
Use ``GoogleHttpTTSSettings`` directly via the ``settings`` parameter instead.
Parameters:
pitch: Voice pitch adjustment (e.g., "+2st", "-50%").
rate: Speaking rate adjustment (e.g., "slow", "fast", "125%"). Used for SSML prosody tags (non-Chirp voices).
@@ -586,9 +595,10 @@ class GoogleHttpTTSService(TTSService):
credentials: Optional[str] = None,
credentials_path: Optional[str] = None,
location: Optional[str] = None,
voice_id: str = "en-US-Chirp3-HD-Charon",
voice_id: Optional[str] = None,
sample_rate: Optional[int] = None,
params: Optional[InputParams] = None,
settings: Optional[GoogleHttpTTSSettings] = None,
**kwargs,
):
"""Initializes the Google HTTP TTS service.
@@ -598,28 +608,47 @@ class GoogleHttpTTSService(TTSService):
credentials_path: Path to Google Cloud service account JSON file.
location: Google Cloud location for regional endpoint (e.g., "us-central1").
voice_id: Google TTS voice identifier (e.g., "en-US-Standard-A").
.. deprecated:: 1.0
Use ``settings=GoogleHttpTTSSettings(voice=...)`` instead.
sample_rate: Audio sample rate in Hz. If None, uses default.
params: Voice customization parameters including pitch, rate, volume, etc.
.. deprecated:: 1.0
Use ``settings=GoogleHttpTTSSettings(...)`` instead.
settings: Runtime-updatable settings. When provided alongside deprecated
parameters, ``settings`` values take precedence.
**kwargs: Additional arguments passed to parent TTSService.
"""
params = params or GoogleHttpTTSService.InputParams()
if voice_id is not None:
_warn_deprecated_param("voice_id", "GoogleHttpTTSSettings", "voice")
if params is not None:
_warn_deprecated_param("params", "GoogleHttpTTSSettings")
_params = params or GoogleHttpTTSService.InputParams()
default_settings = GoogleHttpTTSSettings(
model=None,
pitch=_params.pitch,
rate=_params.rate,
speaking_rate=_params.speaking_rate,
volume=_params.volume,
emphasis=_params.emphasis,
language=self.language_to_service_language(_params.language)
if _params.language
else "en-US",
gender=_params.gender,
google_style=_params.google_style,
voice=voice_id or "en-US-Chirp3-HD-Charon",
)
if settings is not None:
default_settings.apply_update(settings)
super().__init__(
sample_rate=sample_rate,
settings=GoogleHttpTTSSettings(
model=None,
pitch=params.pitch,
rate=params.rate,
speaking_rate=params.speaking_rate,
volume=params.volume,
emphasis=params.emphasis,
language=self.language_to_service_language(params.language)
if params.language
else "en-US",
gender=params.gender,
google_style=params.google_style,
voice=voice_id,
),
settings=default_settings,
**kwargs,
)
@@ -987,6 +1016,9 @@ class GoogleTTSService(GoogleBaseTTSService):
class InputParams(BaseModel):
"""Input parameters for Google streaming TTS configuration.
.. deprecated:: 1.0
Use ``GoogleStreamTTSSettings`` directly via the ``settings`` parameter instead.
Parameters:
language: Language for synthesis. Defaults to English.
speaking_rate: The speaking rate, in the range [0.25, 2.0].
@@ -1001,10 +1033,11 @@ class GoogleTTSService(GoogleBaseTTSService):
credentials: Optional[str] = None,
credentials_path: Optional[str] = None,
location: Optional[str] = None,
voice_id: str = "en-US-Chirp3-HD-Charon",
voice_id: Optional[str] = None,
voice_cloning_key: Optional[str] = None,
sample_rate: Optional[int] = None,
params: InputParams = InputParams(),
params: Optional[InputParams] = None,
settings: Optional[GoogleStreamTTSSettings] = None,
**kwargs,
):
"""Initializes the Google streaming TTS service.
@@ -1014,23 +1047,42 @@ class GoogleTTSService(GoogleBaseTTSService):
credentials_path: Path to Google Cloud service account JSON file.
location: Google Cloud location for regional endpoint (e.g., "us-central1").
voice_id: Google TTS voice identifier (e.g., "en-US-Chirp3-HD-Charon").
.. deprecated:: 1.0
Use ``settings=GoogleStreamTTSSettings(voice=...)`` instead.
voice_cloning_key: The voice cloning key for Chirp 3 custom voices.
sample_rate: Audio sample rate in Hz. If None, uses default.
params: Language configuration parameters.
.. deprecated:: 1.0
Use ``settings=GoogleStreamTTSSettings(...)`` instead.
settings: Runtime-updatable settings. When provided alongside deprecated
parameters, ``settings`` values take precedence.
**kwargs: Additional arguments passed to parent TTSService.
"""
params = params or GoogleTTSService.InputParams()
if voice_id is not None:
_warn_deprecated_param("voice_id", "GoogleStreamTTSSettings", "voice")
if params is not None:
_warn_deprecated_param("params", "GoogleStreamTTSSettings")
_params = params or GoogleTTSService.InputParams()
default_settings = GoogleStreamTTSSettings(
model=None,
language=self.language_to_service_language(_params.language)
if _params.language
else "en-US",
speaking_rate=_params.speaking_rate,
voice=voice_id or "en-US-Chirp3-HD-Charon",
)
if settings is not None:
default_settings.apply_update(settings)
super().__init__(
sample_rate=sample_rate,
settings=GoogleStreamTTSSettings(
model=None,
language=self.language_to_service_language(params.language)
if params.language
else "en-US",
speaking_rate=params.speaking_rate,
voice=voice_id,
),
settings=default_settings,
**kwargs,
)
@@ -1170,6 +1222,9 @@ class GeminiTTSService(GoogleBaseTTSService):
class InputParams(BaseModel):
"""Input parameters for Gemini TTS configuration.
.. deprecated:: 1.0
Use ``GeminiTTSSettings`` directly via the ``settings`` parameter instead.
Parameters:
language: Language for synthesis. Defaults to English.
prompt: Optional style instructions for how to synthesize the content.
@@ -1186,13 +1241,14 @@ class GeminiTTSService(GoogleBaseTTSService):
self,
*,
api_key: Optional[str] = None,
model: str = "gemini-2.5-flash-tts",
model: Optional[str] = None,
credentials: Optional[str] = None,
credentials_path: Optional[str] = None,
location: Optional[str] = None,
voice_id: str = "Kore",
voice_id: Optional[str] = None,
sample_rate: Optional[int] = None,
params: Optional[InputParams] = None,
settings: Optional[GeminiTTSSettings] = None,
**kwargs,
):
"""Initializes the Gemini TTS service.
@@ -1206,12 +1262,26 @@ class GeminiTTSService(GoogleBaseTTSService):
model: Gemini TTS model to use. Must be a TTS model like
"gemini-2.5-flash-tts" or "gemini-2.5-pro-tts".
.. deprecated:: 1.0
Use ``settings=GeminiTTSSettings(model=...)`` instead.
credentials: JSON string containing Google Cloud service account credentials.
credentials_path: Path to Google Cloud service account JSON file.
location: Google Cloud location for regional endpoint (e.g., "us-central1").
voice_id: Voice name from the available Gemini voices.
.. deprecated:: 1.0
Use ``settings=GeminiTTSSettings(voice=...)`` instead.
sample_rate: Audio sample rate in Hz. If None, uses Google's default 24kHz.
params: TTS configuration parameters.
.. deprecated:: 1.0
Use ``settings=GeminiTTSSettings(...)`` instead.
settings: Runtime-updatable settings. When provided alongside deprecated
parameters, ``settings`` values take precedence.
**kwargs: Additional arguments passed to parent TTSService.
"""
# Handle deprecated api_key parameter
@@ -1222,29 +1292,40 @@ class GeminiTTSService(GoogleBaseTTSService):
DeprecationWarning,
stacklevel=2,
)
if model is not None:
_warn_deprecated_param("model", "GeminiTTSSettings", "model")
if voice_id is not None:
_warn_deprecated_param("voice_id", "GeminiTTSSettings", "voice")
if params is not None:
_warn_deprecated_param("params", "GeminiTTSSettings")
if sample_rate and sample_rate != self.GOOGLE_SAMPLE_RATE:
logger.warning(
f"Google TTS only supports {self.GOOGLE_SAMPLE_RATE}Hz sample rate. "
f"Current rate of {sample_rate}Hz may cause issues."
)
params = params or GeminiTTSService.InputParams()
_params = params or GeminiTTSService.InputParams()
voice_id = voice_id or "Kore"
if voice_id not in self.AVAILABLE_VOICES:
logger.warning(f"Voice '{voice_id}' not in known voices list. Using anyway.")
default_settings = GeminiTTSSettings(
model=model or "gemini-2.5-flash-tts",
language=self.language_to_service_language(_params.language)
if _params.language
else "en-US",
prompt=_params.prompt,
multi_speaker=_params.multi_speaker,
speaker_configs=_params.speaker_configs,
voice=voice_id,
)
if settings is not None:
default_settings.apply_update(settings)
super().__init__(
sample_rate=sample_rate,
settings=GeminiTTSSettings(
model=model,
language=self.language_to_service_language(params.language)
if params.language
else "en-US",
prompt=params.prompt,
multi_speaker=params.multi_speaker,
speaker_configs=params.speaker_configs,
voice=voice_id,
),
settings=default_settings,
**kwargs,
)

View File

@@ -28,7 +28,7 @@ from pipecat.frames.frames import (
VADUserStoppedSpeakingFrame,
)
from pipecat.processors.frame_processor import FrameDirection
from pipecat.services.settings import NOT_GIVEN, STTSettings, _NotGiven
from pipecat.services.settings import NOT_GIVEN, STTSettings, _NotGiven, _warn_deprecated_param
from pipecat.services.stt_latency import GRADIUM_TTFS_P99
from pipecat.services.stt_service import WebsocketSTTService
from pipecat.transcriptions.language import Language, resolve_language
@@ -91,6 +91,9 @@ class GradiumSTTService(WebsocketSTTService):
class InputParams(BaseModel):
"""Configuration parameters for Gradium STT API.
.. deprecated:: 1.0
Use ``settings=GradiumSTTSettings(...)`` instead.
Parameters:
language: Expected language of the audio (e.g., "en", "es", "fr").
This helps ground the model to a specific language and improve
@@ -111,6 +114,7 @@ class GradiumSTTService(WebsocketSTTService):
api_endpoint_base_url: str = "wss://eu.api.gradium.ai/api/speech/asr",
params: Optional[InputParams] = None,
json_config: Optional[str] = None,
settings: Optional[GradiumSTTSettings] = None,
ttfs_p99_latency: Optional[float] = GRADIUM_TTFS_P99,
**kwargs,
):
@@ -120,11 +124,17 @@ class GradiumSTTService(WebsocketSTTService):
api_key: Gradium API key for authentication.
api_endpoint_base_url: WebSocket endpoint URL. Defaults to Gradium's streaming endpoint.
params: Configuration parameters for language and delay settings.
.. deprecated:: 1.0
Use ``settings=GradiumSTTSettings(...)`` instead.
json_config: Optional JSON configuration string for additional model settings.
.. deprecated:: 0.0.101
Use `params` instead for type-safe configuration.
settings: Runtime-updatable settings. When provided alongside deprecated
parameters, ``settings`` values take precedence.
ttfs_p99_latency: P99 latency from speech end to final transcript in seconds.
Override for your deployment. See https://github.com/pipecat-ai/stt-benchmark
**kwargs: Additional arguments passed to parent STTService class.
@@ -138,16 +148,23 @@ class GradiumSTTService(WebsocketSTTService):
stacklevel=2,
)
params = params or GradiumSTTService.InputParams()
if params is not None:
_warn_deprecated_param("params", "GradiumSTTSettings")
_params = params or GradiumSTTService.InputParams()
default_settings = GradiumSTTSettings(
model=None,
language=_params.language,
delay_in_frames=_params.delay_in_frames or None,
)
if settings is not None:
default_settings.apply_update(settings)
super().__init__(
sample_rate=SAMPLE_RATE,
ttfs_p99_latency=ttfs_p99_latency,
settings=GradiumSTTSettings(
model=None,
language=params.language,
delay_in_frames=params.delay_in_frames or None,
),
settings=default_settings,
**kwargs,
)

View File

@@ -22,7 +22,7 @@ from pipecat.frames.frames import (
TTSStartedFrame,
TTSStoppedFrame,
)
from pipecat.services.settings import NOT_GIVEN, TTSSettings, _NotGiven
from pipecat.services.settings import NOT_GIVEN, TTSSettings, _NotGiven, _warn_deprecated_param
from pipecat.services.tts_service import AudioContextTTSService
from pipecat.utils.tracing.service_decorators import traced_tts
@@ -57,6 +57,9 @@ class GradiumTTSService(AudioContextTTSService):
class InputParams(BaseModel):
"""Configuration parameters for Gradium TTS service.
.. deprecated:: 1.0
Use ``GradiumTTSSettings`` directly via the ``settings`` parameter instead.
Parameters:
temp: Temperature to be used for generation, defaults to 0.6.
"""
@@ -67,11 +70,12 @@ class GradiumTTSService(AudioContextTTSService):
self,
*,
api_key: str,
voice_id: str = "YTpq7expH9539ERJ",
voice_id: Optional[str] = None,
url: str = "wss://eu.api.gradium.ai/api/speech/tts",
model: str = "default",
model: Optional[str] = None,
json_config: Optional[str] = None,
params: Optional[InputParams] = None,
settings: Optional[GradiumTTSSettings] = None,
**kwargs,
):
"""Initialize the Gradium TTS service.
@@ -79,13 +83,41 @@ class GradiumTTSService(AudioContextTTSService):
Args:
api_key: Gradium API key for authentication.
voice_id: the voice identifier.
.. deprecated:: 1.0
Use ``settings=GradiumTTSSettings(voice=...)`` instead.
url: Gradium websocket API endpoint.
model: Model ID to use for synthesis.
.. deprecated:: 1.0
Use ``settings=GradiumTTSSettings(model=...)`` instead.
json_config: Optional JSON configuration string for additional model settings.
params: Additional configuration parameters.
.. deprecated:: 1.0
Use ``settings=GradiumTTSSettings(...)`` instead.
settings: Runtime-updatable settings. When provided alongside deprecated
parameters, ``settings`` values take precedence.
**kwargs: Additional arguments passed to parent class.
"""
params = params or GradiumTTSService.InputParams()
if voice_id is not None:
_warn_deprecated_param("voice_id", "GradiumTTSSettings", "voice")
if model is not None:
_warn_deprecated_param("model", "GradiumTTSSettings", "model")
if params is not None:
_warn_deprecated_param("params", "GradiumTTSSettings")
default_settings = GradiumTTSSettings(
model=model or "default",
voice=voice_id or "YTpq7expH9539ERJ",
language=None,
output_format="pcm",
)
if settings is not None:
default_settings.apply_update(settings)
super().__init__(
push_stop_frames=True,
@@ -93,12 +125,7 @@ class GradiumTTSService(AudioContextTTSService):
pause_frame_processing=True,
supports_word_timestamps=True,
sample_rate=SAMPLE_RATE,
settings=GradiumTTSSettings(
model=model,
voice=voice_id,
language=None,
output_format="pcm",
),
settings=default_settings,
**kwargs,
)

View File

@@ -12,6 +12,7 @@ and context aggregation functionality.
"""
from dataclasses import dataclass
from typing import Optional
from loguru import logger
@@ -22,11 +23,13 @@ from pipecat.processors.aggregators.llm_response import (
LLMUserAggregatorParams,
)
from pipecat.processors.aggregators.openai_llm_context import OpenAILLMContext
from pipecat.services.openai.base_llm import OpenAILLMSettings
from pipecat.services.openai.llm import (
OpenAIAssistantContextAggregator,
OpenAILLMService,
OpenAIUserContextAggregator,
)
from pipecat.services.settings import _warn_deprecated_param
@dataclass
@@ -81,7 +84,8 @@ class GrokLLMService(OpenAILLMService):
*,
api_key: str,
base_url: str = "https://api.x.ai/v1",
model: str = "grok-3-beta",
model: Optional[str] = None,
settings: Optional[OpenAILLMSettings] = None,
**kwargs,
):
"""Initialize the GrokLLMService with API key and model.
@@ -90,9 +94,22 @@ class GrokLLMService(OpenAILLMService):
api_key: The API key for accessing Grok's API.
base_url: The base URL for Grok API. Defaults to "https://api.x.ai/v1".
model: The model identifier to use. Defaults to "grok-3-beta".
.. deprecated:: 1.0
Use ``settings=OpenAILLMSettings(model=...)`` instead.
settings: Runtime-updatable settings. When provided alongside deprecated
parameters, ``settings`` values take precedence.
**kwargs: Additional keyword arguments passed to OpenAILLMService.
"""
super().__init__(api_key=api_key, base_url=base_url, model=model, **kwargs)
if model is not None:
_warn_deprecated_param("model", "OpenAILLMSettings", "model")
default_settings = OpenAILLMSettings(model=model or "grok-3-beta")
if settings is not None:
default_settings.apply_update(settings)
super().__init__(api_key=api_key, base_url=base_url, settings=default_settings, **kwargs)
# Initialize counters for token usage metrics
self._prompt_tokens = 0
self._completion_tokens = 0

View File

@@ -56,7 +56,7 @@ from pipecat.processors.aggregators.llm_response_universal import (
from pipecat.processors.aggregators.openai_llm_context import OpenAILLMContext
from pipecat.processors.frame_processor import FrameDirection
from pipecat.services.llm_service import FunctionCallFromLLM, LLMService
from pipecat.services.settings import NOT_GIVEN, LLMSettings, _NotGiven
from pipecat.services.settings import NOT_GIVEN, LLMSettings, _NotGiven, _warn_deprecated_param
from pipecat.utils.time import time_now_iso8601
from . import events
@@ -126,6 +126,7 @@ class GrokRealtimeLLMService(LLMService):
api_key: str,
base_url: str = "wss://api.x.ai/v1/realtime",
session_properties: Optional[events.SessionProperties] = None,
settings: Optional[GrokRealtimeLLMSettings] = None,
start_audio_paused: bool = False,
**kwargs,
):
@@ -136,30 +137,46 @@ class GrokRealtimeLLMService(LLMService):
base_url: WebSocket base URL for the realtime API.
Defaults to "wss://api.x.ai/v1/realtime".
session_properties: Configuration properties for the realtime session.
.. deprecated::
Use ``settings=GrokRealtimeLLMSettings(session_properties=...)``
instead.
If None, uses default SessionProperties with voice "Ara".
To set a different voice, configure it in session_properties:
session_properties = events.SessionProperties(voice="Rex")
Available voices: Ara, Rex, Sal, Eve, Leo.
settings: Grok Realtime LLM settings. If provided together with deprecated
top-level parameters, the ``settings`` values take precedence.
start_audio_paused: Whether to start with audio input paused. Defaults to False.
**kwargs: Additional arguments passed to parent LLMService.
"""
if session_properties is not None:
_warn_deprecated_param(
"session_properties", "GrokRealtimeLLMSettings", "session_properties"
)
default_settings = GrokRealtimeLLMSettings(
model=None,
temperature=None,
max_tokens=None,
top_p=None,
top_k=None,
frequency_penalty=None,
presence_penalty=None,
seed=None,
filter_incomplete_user_turns=False,
user_turn_completion_config=None,
session_properties=session_properties or events.SessionProperties(),
)
if settings is not None:
default_settings.apply_update(settings)
super().__init__(
base_url=base_url,
settings=GrokRealtimeLLMSettings(
model=None,
temperature=None,
max_tokens=None,
top_p=None,
top_k=None,
frequency_penalty=None,
presence_penalty=None,
seed=None,
filter_incomplete_user_turns=False,
user_turn_completion_config=None,
session_properties=session_properties or events.SessionProperties(),
),
settings=default_settings,
**kwargs,
)

View File

@@ -6,9 +6,13 @@
"""Groq LLM Service implementation using OpenAI-compatible interface."""
from typing import Optional
from loguru import logger
from pipecat.services.openai.base_llm import OpenAILLMSettings
from pipecat.services.openai.llm import OpenAILLMService
from pipecat.services.settings import _warn_deprecated_param
class GroqLLMService(OpenAILLMService):
@@ -23,7 +27,8 @@ class GroqLLMService(OpenAILLMService):
*,
api_key: str,
base_url: str = "https://api.groq.com/openai/v1",
model: str = "llama-3.3-70b-versatile",
model: Optional[str] = None,
settings: Optional[OpenAILLMSettings] = None,
**kwargs,
):
"""Initialize Groq LLM service.
@@ -32,9 +37,22 @@ class GroqLLMService(OpenAILLMService):
api_key: The API key for accessing Groq's API.
base_url: The base URL for Groq API. Defaults to "https://api.groq.com/openai/v1".
model: The model identifier to use. Defaults to "llama-3.3-70b-versatile".
.. deprecated:: 1.0
Use ``settings=OpenAILLMSettings(model=...)`` instead.
settings: Runtime-updatable settings. When provided alongside deprecated
parameters, ``settings`` values take precedence.
**kwargs: Additional keyword arguments passed to OpenAILLMService.
"""
super().__init__(api_key=api_key, base_url=base_url, model=model, **kwargs)
if model is not None:
_warn_deprecated_param("model", "OpenAILLMSettings", "model")
default_settings = OpenAILLMSettings(model=model or "llama-3.3-70b-versatile")
if settings is not None:
default_settings.apply_update(settings)
super().__init__(api_key=api_key, base_url=base_url, settings=default_settings, **kwargs)
def create_client(self, api_key=None, base_url=None, **kwargs):
"""Create OpenAI-compatible client for Groq API endpoint.

View File

@@ -8,8 +8,13 @@
from typing import Optional
from pipecat.services.settings import _warn_deprecated_param
from pipecat.services.stt_latency import GROQ_TTFS_P99
from pipecat.services.whisper.base_stt import BaseWhisperSTTService, Transcription
from pipecat.services.whisper.base_stt import (
BaseWhisperSTTService,
BaseWhisperSTTSettings,
Transcription,
)
from pipecat.transcriptions.language import Language
@@ -23,35 +28,75 @@ class GroqSTTService(BaseWhisperSTTService):
def __init__(
self,
*,
model: str = "whisper-large-v3-turbo",
model: Optional[str] = None,
api_key: Optional[str] = None,
base_url: str = "https://api.groq.com/openai/v1",
language: Optional[Language] = Language.EN,
language: Optional[Language] = None,
prompt: Optional[str] = None,
temperature: Optional[float] = None,
settings: Optional[BaseWhisperSTTSettings] = None,
ttfs_p99_latency: Optional[float] = GROQ_TTFS_P99,
**kwargs,
):
"""Initialize Groq STT service.
Args:
model: Whisper model to use. Defaults to "whisper-large-v3-turbo".
model: Whisper model to use.
.. deprecated:: 1.0
Use ``settings=BaseWhisperSTTSettings(model=...)`` instead.
api_key: Groq API key. Defaults to None.
base_url: API base URL. Defaults to "https://api.groq.com/openai/v1".
language: Language of the audio input. Defaults to English.
language: Language of the audio input.
.. deprecated:: 1.0
Use ``settings=BaseWhisperSTTSettings(language=...)`` instead.
prompt: Optional text to guide the model's style or continue a previous segment.
temperature: Optional sampling temperature between 0 and 1. Defaults to 0.0.
.. deprecated:: 1.0
Use ``settings=BaseWhisperSTTSettings(prompt=...)`` instead.
temperature: Optional sampling temperature between 0 and 1.
.. deprecated:: 1.0
Use ``settings=BaseWhisperSTTSettings(temperature=...)`` instead.
settings: Runtime-updatable settings. When provided alongside deprecated
parameters, ``settings`` values take precedence.
ttfs_p99_latency: P99 latency from speech end to final transcript in seconds.
Override for your deployment. See https://github.com/pipecat-ai/stt-benchmark
**kwargs: Additional arguments passed to BaseWhisperSTTService.
"""
super().__init__(
if model is not None:
_warn_deprecated_param("model", "BaseWhisperSTTSettings", "model")
if language is not None:
_warn_deprecated_param("language", "BaseWhisperSTTSettings", "language")
if prompt is not None:
_warn_deprecated_param("prompt", "BaseWhisperSTTSettings", "prompt")
if temperature is not None:
_warn_deprecated_param("temperature", "BaseWhisperSTTSettings", "temperature")
model = model or "whisper-large-v3-turbo"
language = language or Language.EN
# Build settings from deprecated params and pass via settings=
# to avoid double deprecation warnings in BaseWhisperSTTService.
default_settings = BaseWhisperSTTSettings(
model=model,
api_key=api_key,
language=self.language_to_service_language(language),
base_url=base_url,
language=language,
prompt=prompt,
temperature=temperature,
)
if settings is not None:
default_settings.apply_update(settings)
super().__init__(
api_key=api_key,
base_url=base_url,
settings=default_settings,
ttfs_p99_latency=ttfs_p99_latency,
**kwargs,
)

View File

@@ -21,7 +21,7 @@ from pipecat.frames.frames import (
TTSStartedFrame,
TTSStoppedFrame,
)
from pipecat.services.settings import NOT_GIVEN, TTSSettings, _NotGiven
from pipecat.services.settings import NOT_GIVEN, TTSSettings, _NotGiven, _warn_deprecated_param
from pipecat.services.tts_service import TTSService
from pipecat.transcriptions.language import Language
from pipecat.utils.tracing.service_decorators import traced_tts
@@ -64,6 +64,9 @@ class GroqTTSService(TTSService):
class InputParams(BaseModel):
"""Input parameters for Groq TTS configuration.
.. deprecated:: 1.0
Use ``settings=GroqTTSSettings(...)`` instead.
Parameters:
language: Language for speech synthesis. Defaults to English.
speed: Speech speed multiplier. Defaults to 1.0.
@@ -80,9 +83,10 @@ class GroqTTSService(TTSService):
api_key: str,
output_format: str = "wav",
params: Optional[InputParams] = None,
model_name: str = "canopylabs/orpheus-v1-english",
voice_id: str = "autumn",
model_name: Optional[str] = None,
voice_id: Optional[str] = None,
sample_rate: Optional[int] = GROQ_SAMPLE_RATE,
settings: Optional[GroqTTSSettings] = None,
**kwargs,
):
"""Initialize Groq TTS service.
@@ -91,27 +95,52 @@ class GroqTTSService(TTSService):
api_key: Groq API key for authentication.
output_format: Audio output format. Defaults to "wav".
params: Additional input parameters for voice customization.
model_name: TTS model to use. Defaults to "playai-tts".
voice_id: Voice identifier to use. Defaults to "Celeste-PlayAI".
.. deprecated:: 1.0
Use ``settings=GroqTTSSettings(...)`` instead.
model_name: TTS model to use.
.. deprecated:: 1.0
Use ``settings=GroqTTSSettings(model=...)`` instead.
voice_id: Voice identifier to use.
.. deprecated:: 1.0
Use ``settings=GroqTTSSettings(voice=...)`` instead.
sample_rate: Audio sample rate. Must be 48000 Hz for Groq TTS.
settings: Runtime-updatable settings. When provided alongside deprecated
parameters, ``settings`` values take precedence.
**kwargs: Additional arguments passed to parent TTSService class.
"""
if model_name is not None:
_warn_deprecated_param("model_name", "GroqTTSSettings", "model")
if voice_id is not None:
_warn_deprecated_param("voice_id", "GroqTTSSettings", "voice")
if params is not None:
_warn_deprecated_param("params", "GroqTTSSettings")
if sample_rate != self.GROQ_SAMPLE_RATE:
logger.warning(f"Groq TTS only supports {self.GROQ_SAMPLE_RATE}Hz sample rate. ")
params = params or GroqTTSService.InputParams()
_params = params or GroqTTSService.InputParams()
default_settings = GroqTTSSettings(
model=model_name or "canopylabs/orpheus-v1-english",
voice=voice_id or "autumn",
language=str(_params.language) if _params.language else "en",
output_format=output_format,
speed=_params.speed,
groq_sample_rate=sample_rate,
)
if settings is not None:
default_settings.apply_update(settings)
super().__init__(
pause_frame_processing=True,
sample_rate=sample_rate,
settings=GroqTTSSettings(
model=model_name,
voice=voice_id,
language=str(params.language) if params.language else "en",
output_format=output_format,
speed=params.speed,
groq_sample_rate=sample_rate,
),
settings=default_settings,
**kwargs,
)

View File

@@ -45,6 +45,7 @@ from pipecat.services.heygen.client import (
HeyGenClient,
ServiceType,
)
from pipecat.services.settings import ServiceSettings
from pipecat.transports.base_transport import TransportParams
# Using the same values that we do in the BaseOutputTransport
@@ -80,6 +81,7 @@ class HeyGenVideoService(AIService):
session: aiohttp.ClientSession,
session_request: Optional[Union[LiveAvatarNewSessionRequest, NewSessionRequest]] = None,
service_type: Optional[ServiceType] = None,
settings: Optional[ServiceSettings] = None,
**kwargs,
) -> None:
"""Initialize the HeyGen video service.
@@ -89,9 +91,15 @@ class HeyGenVideoService(AIService):
session: HTTP client session for API requests
session_request: Configuration for the HeyGen session
service_type: Service type for the avatar session
settings: Runtime-updatable settings. HeyGen has no model concept, so this
is primarily used for the ``extra`` dict.
**kwargs: Additional arguments passed to parent AIService
"""
super().__init__(**kwargs)
default_settings = ServiceSettings(model=None)
if settings is not None:
default_settings.apply_update(settings)
super().__init__(settings=default_settings, **kwargs)
self._api_key = api_key
self._session = session
self._client: Optional[HeyGenClient] = None

View File

@@ -26,7 +26,7 @@ from pipecat.frames.frames import (
TTSStoppedFrame,
)
from pipecat.processors.frame_processor import FrameDirection
from pipecat.services.settings import NOT_GIVEN, TTSSettings, _NotGiven
from pipecat.services.settings import NOT_GIVEN, TTSSettings, _NotGiven, _warn_deprecated_param
from pipecat.services.tts_service import TTSService
from pipecat.utils.tracing.service_decorators import traced_tts
@@ -84,6 +84,9 @@ class HumeTTSService(TTSService):
class InputParams(BaseModel):
"""Optional synthesis parameters for Hume TTS.
.. deprecated:: 1.0
Use ``settings=HumeTTSSettings(...)`` instead.
Parameters:
description: Natural-language acting directions (up to 100 characters).
speed: Speaking-rate multiplier (0.5-2.0).
@@ -98,9 +101,10 @@ class HumeTTSService(TTSService):
self,
*,
api_key: Optional[str] = None,
voice_id: str,
voice_id: Optional[str] = None,
params: Optional[InputParams] = None,
sample_rate: Optional[int] = HUME_SAMPLE_RATE,
settings: Optional[HumeTTSSettings] = None,
**kwargs,
) -> None:
"""Initialize the HumeTTSService.
@@ -108,10 +112,25 @@ class HumeTTSService(TTSService):
Args:
api_key: Hume API key. If omitted, reads the ``HUME_API_KEY`` environment variable.
voice_id: ID of the voice to use. Only voice IDs are supported; voice names are not.
.. deprecated:: 1.0
Use ``settings=HumeTTSSettings(voice=...)`` instead.
params: Optional synthesis controls (acting instructions, speed, trailing silence).
.. deprecated:: 1.0
Use ``settings=HumeTTSSettings(...)`` instead.
sample_rate: Output sample rate for emitted PCM frames. Defaults to 48_000 (Hume).
settings: Runtime-updatable settings. When provided alongside deprecated
parameters, ``settings`` values take precedence.
**kwargs: Additional arguments passed to the parent class.
"""
if voice_id is not None:
_warn_deprecated_param("voice_id", "HumeTTSSettings", "voice")
if params is not None:
_warn_deprecated_param("params", "HumeTTSSettings")
api_key = api_key or os.getenv("HUME_API_KEY")
if not api_key:
raise ValueError("HumeTTSService requires an API key (env HUME_API_KEY or api_key=)")
@@ -121,21 +140,25 @@ class HumeTTSService(TTSService):
f"Hume TTS streams at {HUME_SAMPLE_RATE} Hz; configured sample_rate={sample_rate}"
)
params = params or HumeTTSService.InputParams()
_params = params or HumeTTSService.InputParams()
default_settings = HumeTTSSettings(
model=None,
voice=voice_id,
language=None, # Not applicable here
description=_params.description,
speed=_params.speed,
trailing_silence=_params.trailing_silence,
)
if settings is not None:
default_settings.apply_update(settings)
super().__init__(
sample_rate=sample_rate,
push_text_frames=False,
push_stop_frames=True,
supports_word_timestamps=True,
settings=HumeTTSSettings(
model=None,
voice=voice_id,
language=None, # Not applicable here
description=params.description,
speed=params.speed,
trailing_silence=params.trailing_silence,
),
settings=default_settings,
**kwargs,
)

View File

@@ -29,7 +29,7 @@ from pipecat import version as pipecat_version
USER_AGENT = f"pipecat/{pipecat_version()}"
from pydantic import BaseModel
from pipecat.services.settings import NOT_GIVEN, TTSSettings, _NotGiven
from pipecat.services.settings import NOT_GIVEN, TTSSettings, _NotGiven, _warn_deprecated_param
try:
from websockets.asyncio.client import connect as websocket_connect
@@ -114,6 +114,9 @@ class InworldHttpTTSService(TTSService):
class InputParams(BaseModel):
"""Input parameters for Inworld TTS configuration.
.. deprecated:: 1.0
Use ``InworldTTSSettings`` directly via the ``settings`` parameter instead.
Parameters:
temperature: Temperature for speech synthesis.
speaking_rate: Speaking rate for speech synthesis.
@@ -129,12 +132,13 @@ class InworldHttpTTSService(TTSService):
*,
api_key: str,
aiohttp_session: aiohttp.ClientSession,
voice_id: str = "Ashley",
model: str = "inworld-tts-1.5-max",
voice_id: Optional[str] = None,
model: Optional[str] = None,
streaming: bool = True,
sample_rate: Optional[int] = None,
encoding: str = "LINEAR16",
params: InputParams = None,
params: Optional[InputParams] = None,
settings: Optional[InworldTTSSettings] = None,
**kwargs,
):
"""Initialize the Inworld TTS service.
@@ -143,32 +147,57 @@ class InworldHttpTTSService(TTSService):
api_key: Inworld API key.
aiohttp_session: aiohttp ClientSession for HTTP requests.
voice_id: ID of the voice to use for synthesis.
.. deprecated:: 1.0
Use ``settings=InworldTTSSettings(voice=...)`` instead.
model: ID of the model to use for synthesis.
.. deprecated:: 1.0
Use ``settings=InworldTTSSettings(model=...)`` instead.
streaming: Whether to use streaming mode.
sample_rate: Audio sample rate in Hz.
encoding: Audio encoding format.
params: Input parameters for Inworld TTS configuration.
.. deprecated:: 1.0
Use ``settings=InworldTTSSettings(...)`` instead.
settings: Runtime-updatable settings. When provided alongside deprecated
parameters, ``settings`` values take precedence.
**kwargs: Additional arguments passed to the parent class.
"""
params = params or InworldHttpTTSService.InputParams()
if voice_id is not None:
_warn_deprecated_param("voice_id", "InworldTTSSettings", "voice")
if model is not None:
_warn_deprecated_param("model", "InworldTTSSettings", "model")
if params is not None:
_warn_deprecated_param("params", "InworldTTSSettings")
_params = params or InworldHttpTTSService.InputParams()
default_settings = InworldTTSSettings(
model=model or "inworld-tts-1.5-max",
voice=voice_id or "Ashley",
language=None,
audio_encoding=encoding,
audio_sample_rate=0,
speaking_rate=_params.speaking_rate,
temperature=_params.temperature,
timestamp_transport_strategy=_params.timestamp_transport_strategy,
auto_mode=None, # Not applicable for HTTP TTS
apply_text_normalization=None, # Not applicable for HTTP TTS
)
if settings is not None:
default_settings.apply_update(settings)
super().__init__(
push_text_frames=False,
push_stop_frames=True,
supports_word_timestamps=True,
sample_rate=sample_rate,
settings=InworldTTSSettings(
model=model,
voice=voice_id,
language=None,
audio_encoding=encoding,
audio_sample_rate=0,
speaking_rate=params.speaking_rate,
temperature=params.temperature,
timestamp_transport_strategy=params.timestamp_transport_strategy,
auto_mode=None, # Not applicable for HTTP TTS
apply_text_normalization=None, # Not applicable for HTTP TTS
),
settings=default_settings,
**kwargs,
)
@@ -477,6 +506,9 @@ class InworldTTSService(AudioContextTTSService):
class InputParams(BaseModel):
"""Input parameters for Inworld WebSocket TTS configuration.
.. deprecated:: 1.0
Use ``InworldTTSSettings`` directly via the ``settings`` parameter instead.
Parameters:
temperature: Temperature for speech synthesis.
speaking_rate: Speaking rate for speech synthesis.
@@ -503,12 +535,13 @@ class InworldTTSService(AudioContextTTSService):
self,
*,
api_key: str,
voice_id: str = "Ashley",
model: str = "inworld-tts-1.5-max",
voice_id: Optional[str] = None,
model: Optional[str] = None,
url: str = "wss://api.inworld.ai/tts/v1/voice:streamBidirectional",
sample_rate: Optional[int] = None,
encoding: str = "LINEAR16",
params: InputParams = None,
params: Optional[InputParams] = None,
settings: Optional[InworldTTSSettings] = None,
aggregate_sentences: Optional[bool] = None,
text_aggregation_mode: Optional[TextAggregationMode] = None,
append_trailing_space: bool = True,
@@ -519,11 +552,25 @@ class InworldTTSService(AudioContextTTSService):
Args:
api_key: Inworld API key.
voice_id: ID of the voice to use for synthesis.
.. deprecated:: 1.0
Use ``settings=InworldTTSSettings(voice=...)`` instead.
model: ID of the model to use for synthesis.
.. deprecated:: 1.0
Use ``settings=InworldTTSSettings(model=...)`` instead.
url: URL of the Inworld WebSocket API.
sample_rate: Audio sample rate in Hz.
encoding: Audio encoding format.
params: Input parameters for Inworld WebSocket TTS configuration.
.. deprecated:: 1.0
Use ``settings=InworldTTSSettings(...)`` instead.
settings: Runtime-updatable settings. When provided alongside deprecated
parameters, ``settings`` values take precedence.
aggregate_sentences: Deprecated. Use text_aggregation_mode instead.
.. deprecated:: 0.0.104
@@ -533,7 +580,29 @@ class InworldTTSService(AudioContextTTSService):
append_trailing_space: Whether to append a trailing space to text before sending to TTS.
**kwargs: Additional arguments passed to the parent class.
"""
params = params or InworldTTSService.InputParams()
if voice_id is not None:
_warn_deprecated_param("voice_id", "InworldTTSSettings", "voice")
if model is not None:
_warn_deprecated_param("model", "InworldTTSSettings", "model")
if params is not None:
_warn_deprecated_param("params", "InworldTTSSettings")
_params = params or InworldTTSService.InputParams()
default_settings = InworldTTSSettings(
model=model or "inworld-tts-1.5-max",
voice=voice_id or "Ashley",
language=None,
audio_encoding=encoding,
audio_sample_rate=0,
speaking_rate=_params.speaking_rate,
temperature=_params.temperature,
apply_text_normalization=_params.apply_text_normalization,
timestamp_transport_strategy=_params.timestamp_transport_strategy,
auto_mode=_params.auto_mode if _params.auto_mode is not None else aggregate_sentences,
)
if settings is not None:
default_settings.apply_update(settings)
super().__init__(
push_text_frames=False,
@@ -544,18 +613,7 @@ class InworldTTSService(AudioContextTTSService):
aggregate_sentences=aggregate_sentences,
text_aggregation_mode=text_aggregation_mode,
append_trailing_space=append_trailing_space,
settings=InworldTTSSettings(
model=model,
voice=voice_id,
language=None,
audio_encoding=encoding,
audio_sample_rate=0,
speaking_rate=params.speaking_rate,
temperature=params.temperature,
apply_text_normalization=params.apply_text_normalization,
timestamp_transport_strategy=params.timestamp_transport_strategy,
auto_mode=params.auto_mode if params.auto_mode is not None else aggregate_sentences,
),
settings=default_settings,
**kwargs,
)
@@ -564,8 +622,8 @@ class InworldTTSService(AudioContextTTSService):
self._timestamp_type = "WORD"
self._buffer_settings = {
"maxBufferDelayMs": params.max_buffer_delay_ms,
"bufferCharThreshold": params.buffer_char_threshold,
"maxBufferDelayMs": _params.max_buffer_delay_ms,
"bufferCharThreshold": _params.buffer_char_threshold,
}
self._receive_task = None

View File

@@ -23,7 +23,7 @@ from pipecat.frames.frames import (
TTSStartedFrame,
TTSStoppedFrame,
)
from pipecat.services.settings import NOT_GIVEN, TTSSettings, _NotGiven
from pipecat.services.settings import NOT_GIVEN, TTSSettings, _NotGiven, _warn_deprecated_param
from pipecat.services.tts_service import TTSService
from pipecat.transcriptions.language import Language, resolve_language
from pipecat.utils.tracing.service_decorators import traced_tts
@@ -112,6 +112,9 @@ class KokoroTTSService(TTSService):
class InputParams(BaseModel):
"""Input parameters for Kokoro TTS configuration.
.. deprecated:: 1.0
Use ``KokoroTTSSettings`` directly via the ``settings`` parameter instead.
Parameters:
language: Language to use for synthesis.
"""
@@ -121,35 +124,55 @@ class KokoroTTSService(TTSService):
def __init__(
self,
*,
voice_id: str,
voice_id: Optional[str] = None,
model_path: Optional[str] = None,
voices_path: Optional[str] = None,
params: Optional[InputParams] = None,
settings: Optional[KokoroTTSSettings] = None,
**kwargs,
):
"""Initialize the Kokoro TTS service.
Args:
voice_id: Voice identifier to use for synthesis.
.. deprecated:: 1.0
Use ``settings=KokoroTTSSettings(voice=...)`` instead.
model_path: Path to the kokoro ONNX model file. Defaults to auto-downloaded file.
voices_path: Path to the voices binary file. Defaults to auto-downloaded file.
params: Configuration parameters for synthesis.
.. deprecated:: 1.0
Use ``settings=KokoroTTSSettings(...)`` instead.
settings: Runtime-updatable settings. When provided alongside deprecated
parameters, ``settings`` values take precedence.
**kwargs: Additional arguments passed to parent `TTSService`.
"""
params = params or KokoroTTSService.InputParams()
if voice_id is not None:
_warn_deprecated_param("voice_id", "KokoroTTSSettings", "voice")
if params is not None:
_warn_deprecated_param("params", "KokoroTTSSettings")
_params = params or KokoroTTSService.InputParams()
default_settings = KokoroTTSSettings(
model=None,
voice=voice_id,
language=language_to_kokoro_language(_params.language),
lang_code=language_to_kokoro_language(_params.language),
)
if settings is not None:
default_settings.apply_update(settings)
super().__init__(
settings=KokoroTTSSettings(
model=None,
voice=voice_id,
language=language_to_kokoro_language(params.language),
lang_code=language_to_kokoro_language(params.language),
),
settings=default_settings,
**kwargs,
)
self._lang_code = language_to_kokoro_language(params.language)
self._lang_code = language_to_kokoro_language(_params.language)
model = Path(model_path) if model_path else KOKORO_CACHE_DIR / "kokoro-v1.0.onnx"
voices = Path(voices_path) if voices_path else KOKORO_CACHE_DIR / "voices-v1.0.bin"

View File

@@ -24,7 +24,7 @@ from pipecat.frames.frames import (
TTSStoppedFrame,
)
from pipecat.processors.frame_processor import FrameDirection
from pipecat.services.settings import NOT_GIVEN, TTSSettings, _NotGiven
from pipecat.services.settings import NOT_GIVEN, TTSSettings, _NotGiven, _warn_deprecated_param
from pipecat.services.tts_service import InterruptibleTTSService
from pipecat.transcriptions.language import Language, resolve_language
from pipecat.utils.tracing.service_decorators import traced_tts
@@ -98,10 +98,11 @@ class LmntTTSService(InterruptibleTTSService):
self,
*,
api_key: str,
voice_id: str,
voice_id: Optional[str] = None,
sample_rate: Optional[int] = None,
language: Language = Language.EN,
model: str = "blizzard",
model: Optional[str] = None,
settings: Optional[LmntTTSSettings] = None,
**kwargs,
):
"""Initialize the LMNT TTS service.
@@ -109,21 +110,40 @@ class LmntTTSService(InterruptibleTTSService):
Args:
api_key: LMNT API key for authentication.
voice_id: ID of the voice to use for synthesis.
.. deprecated:: 1.0
Use ``settings=LmntTTSSettings(voice=...)`` instead.
sample_rate: Audio sample rate. If None, uses default.
language: Language for synthesis. Defaults to English.
model: TTS model to use. Defaults to "blizzard".
model: TTS model to use.
.. deprecated:: 1.0
Use ``settings=LmntTTSSettings(model=...)`` instead.
settings: Runtime-updatable settings. When provided alongside deprecated
parameters, ``settings`` values take precedence.
**kwargs: Additional arguments passed to parent InterruptibleTTSService.
"""
if voice_id is not None:
_warn_deprecated_param("voice_id", "LmntTTSSettings", "voice")
if model is not None:
_warn_deprecated_param("model", "LmntTTSSettings", "model")
default_settings = LmntTTSSettings(
model=model or "blizzard",
voice=voice_id,
language=self.language_to_service_language(language),
format="raw",
)
if settings is not None:
default_settings.apply_update(settings)
super().__init__(
push_stop_frames=True,
pause_frame_processing=True,
sample_rate=sample_rate,
settings=LmntTTSSettings(
model=model,
voice=voice_id,
language=self.language_to_service_language(language),
format="raw",
),
settings=default_settings,
**kwargs,
)

View File

@@ -26,7 +26,7 @@ from pipecat.frames.frames import (
TTSStartedFrame,
TTSStoppedFrame,
)
from pipecat.services.settings import NOT_GIVEN, TTSSettings, _NotGiven
from pipecat.services.settings import NOT_GIVEN, TTSSettings, _NotGiven, _warn_deprecated_param
from pipecat.services.tts_service import TTSService
from pipecat.transcriptions.language import Language, resolve_language
from pipecat.utils.tracing.service_decorators import traced_tts
@@ -166,6 +166,9 @@ class MiniMaxHttpTTSService(TTSService):
class InputParams(BaseModel):
"""Configuration parameters for MiniMax TTS.
.. deprecated:: 1.0
Use ``MiniMaxTTSSettings`` directly via the ``settings`` parameter instead.
Parameters:
language: Language for TTS generation. Supports 40 languages.
Note: Filipino, Tamil, and Persian require speech-2.6-* models.
@@ -201,11 +204,12 @@ class MiniMaxHttpTTSService(TTSService):
api_key: str,
base_url: str = "https://api.minimax.io/v1/t2a_v2",
group_id: str,
model: str = "speech-02-turbo",
voice_id: str = "Calm_Woman",
model: Optional[str] = None,
voice_id: Optional[str] = None,
aiohttp_session: aiohttp.ClientSession,
sample_rate: Optional[int] = None,
params: Optional[InputParams] = None,
settings: Optional[MiniMaxTTSSettings] = None,
**kwargs,
):
"""Initialize the MiniMax TTS service.
@@ -221,50 +225,45 @@ class MiniMaxHttpTTSService(TTSService):
"speech-2.6-hd", "speech-2.6-turbo" (latest, supports Filipino/Tamil/Persian),
"speech-02-hd", "speech-02-turbo",
"speech-01-hd", "speech-01-turbo".
.. deprecated:: 1.0
Use ``settings=MiniMaxTTSSettings(model=...)`` instead.
voice_id: Voice identifier. Defaults to "Calm_Woman".
.. deprecated:: 1.0
Use ``settings=MiniMaxTTSSettings(voice=...)`` instead.
aiohttp_session: aiohttp.ClientSession for API communication.
sample_rate: Output audio sample rate in Hz. If None, uses pipeline default.
params: Additional configuration parameters.
.. deprecated:: 1.0
Use ``settings=MiniMaxTTSSettings(...)`` instead.
settings: Runtime-updatable settings. When provided alongside deprecated
parameters, ``settings`` values take precedence.
**kwargs: Additional arguments passed to parent TTSService.
"""
params = params or MiniMaxHttpTTSService.InputParams()
if model is not None:
_warn_deprecated_param("model", "MiniMaxTTSSettings", "model")
if voice_id is not None:
_warn_deprecated_param("voice_id", "MiniMaxTTSSettings", "voice")
if params is not None:
_warn_deprecated_param("params", "MiniMaxTTSSettings")
super().__init__(
sample_rate=sample_rate,
settings=MiniMaxTTSSettings(
model=model,
voice=voice_id,
language=None,
stream=True,
speed=params.speed,
volume=params.volume,
pitch=params.pitch,
language_boost=None,
emotion=None,
text_normalization=None,
latex_read=None,
audio_bitrate=128000,
audio_format="pcm",
audio_channel=1,
audio_sample_rate=0,
),
**kwargs,
)
_params = params or MiniMaxHttpTTSService.InputParams()
self._api_key = api_key
self._group_id = group_id
self._base_url = f"{base_url}?GroupId={group_id}"
self._session = aiohttp_session
# Add language boost if provided
if params.language:
service_lang = self.language_to_service_language(params.language)
# Resolve language boost
language_boost = None
if _params.language:
service_lang = self.language_to_service_language(_params.language)
if service_lang:
self._settings.language_boost = service_lang
language_boost = service_lang
# Add optional emotion if provided
if params.emotion:
# Validate emotion is in the supported list
# Resolve emotion
emotion = None
if _params.emotion:
supported_emotions = [
"happy",
"sad",
@@ -275,15 +274,16 @@ class MiniMaxHttpTTSService(TTSService):
"neutral",
"fluent",
]
if params.emotion in supported_emotions:
self._settings.emotion = params.emotion
if _params.emotion in supported_emotions:
emotion = _params.emotion
else:
logger.warning(
f"Unsupported emotion: {params.emotion}. Supported emotions: {supported_emotions}"
f"Unsupported emotion: {_params.emotion}. Supported emotions: {supported_emotions}"
)
# If `english_normalization`, add `text_normalization` and print warning
if params.english_normalization is not None:
# Resolve text_normalization
text_normalization = None
if _params.english_normalization is not None:
import warnings
with warnings.catch_warnings():
@@ -292,15 +292,40 @@ class MiniMaxHttpTTSService(TTSService):
"Parameter `english_normalization` is deprecated and will be removed in a future version. Use `text_normalization` instead.",
DeprecationWarning,
)
self._settings.text_normalization = params.english_normalization
text_normalization = _params.english_normalization
if _params.text_normalization is not None:
text_normalization = _params.text_normalization
# Add text_normalization if provided (corrected parameter name)
if params.text_normalization is not None:
self._settings.text_normalization = params.text_normalization
default_settings = MiniMaxTTSSettings(
model=model or "speech-02-turbo",
voice=voice_id or "Calm_Woman",
language=None,
stream=True,
speed=_params.speed,
volume=_params.volume,
pitch=_params.pitch,
language_boost=language_boost,
emotion=emotion,
text_normalization=text_normalization,
latex_read=_params.latex_read,
audio_bitrate=128000,
audio_format="pcm",
audio_channel=1,
audio_sample_rate=0,
)
if settings is not None:
default_settings.apply_update(settings)
# Add latex_read if provided
if params.latex_read is not None:
self._settings.latex_read = params.latex_read
super().__init__(
sample_rate=sample_rate,
settings=default_settings,
**kwargs,
)
self._api_key = api_key
self._group_id = group_id
self._base_url = f"{base_url}?GroupId={group_id}"
self._session = aiohttp_session
def can_generate_metrics(self) -> bool:
"""Check if this service can generate processing metrics.

View File

@@ -6,14 +6,16 @@
"""Mistral LLM service implementation using OpenAI-compatible interface."""
from typing import List, Sequence
from typing import List, Optional, Sequence
from loguru import logger
from openai.types.chat import ChatCompletionMessageParam
from pipecat.adapters.services.open_ai_adapter import OpenAILLMInvocationParams
from pipecat.frames.frames import FunctionCallFromLLM
from pipecat.services.openai.base_llm import OpenAILLMSettings
from pipecat.services.openai.llm import OpenAILLMService
from pipecat.services.settings import _warn_deprecated_param
class MistralLLMService(OpenAILLMService):
@@ -28,7 +30,8 @@ class MistralLLMService(OpenAILLMService):
*,
api_key: str,
base_url: str = "https://api.mistral.ai/v1",
model: str = "mistral-small-latest",
model: Optional[str] = None,
settings: Optional[OpenAILLMSettings] = None,
**kwargs,
):
"""Initialize the Mistral LLM service.
@@ -37,9 +40,22 @@ class MistralLLMService(OpenAILLMService):
api_key: The API key for accessing Mistral's API.
base_url: The base URL for Mistral API. Defaults to "https://api.mistral.ai/v1".
model: The model identifier to use. Defaults to "mistral-small-latest".
.. deprecated:: 1.0
Use ``settings=OpenAILLMSettings(model=...)`` instead.
settings: Runtime-updatable settings. When provided alongside deprecated
parameters, ``settings`` values take precedence.
**kwargs: Additional keyword arguments passed to OpenAILLMService.
"""
super().__init__(api_key=api_key, base_url=base_url, model=model, **kwargs)
if model is not None:
_warn_deprecated_param("model", "OpenAILLMSettings", "model")
default_settings = OpenAILLMSettings(model=model or "mistral-small-latest")
if settings is not None:
default_settings.apply_update(settings)
super().__init__(api_key=api_key, base_url=base_url, settings=default_settings, **kwargs)
def create_client(self, api_key=None, base_url=None, **kwargs):
"""Create OpenAI-compatible client for Mistral API endpoint.

View File

@@ -25,7 +25,7 @@ from pipecat.frames.frames import (
VisionFullResponseStartFrame,
VisionTextFrame,
)
from pipecat.services.settings import VisionSettings
from pipecat.services.settings import VisionSettings, _warn_deprecated_param
from pipecat.services.vision_service import VisionService
try:
@@ -80,17 +80,36 @@ class MoondreamService(VisionService):
"""
def __init__(
self, *, model="vikhyatk/moondream2", revision="2025-01-09", use_cpu=False, **kwargs
self,
*,
model: Optional[str] = None,
revision="2025-01-09",
use_cpu=False,
settings: Optional[MoondreamSettings] = None,
**kwargs,
):
"""Initialize the Moondream service.
Args:
model: Hugging Face model identifier for the Moondream model.
.. deprecated:: 1.0
Use ``settings=MoondreamSettings(model=...)`` instead.
revision: Specific model revision to use.
use_cpu: Whether to force CPU usage instead of hardware acceleration.
settings: Runtime-updatable settings. When provided alongside deprecated
parameters, ``settings`` values take precedence.
**kwargs: Additional arguments passed to the parent VisionService.
"""
super().__init__(settings=MoondreamSettings(model=model), **kwargs)
if model is not None:
_warn_deprecated_param("model", "MoondreamSettings", "model")
default_settings = MoondreamSettings(model=model or "vikhyatk/moondream2")
if settings is not None:
default_settings.apply_update(settings)
super().__init__(settings=default_settings, **kwargs)
if not use_cpu:
device, dtype = detect_device()
@@ -101,7 +120,7 @@ class MoondreamService(VisionService):
logger.debug("Loading Moondream model...")
self._model = AutoModelForCausalLM.from_pretrained(
model,
self._settings.model,
trust_remote_code=True,
revision=revision,
device_map={"": device},

View File

@@ -35,7 +35,7 @@ from pipecat.frames.frames import (
TTSStoppedFrame,
)
from pipecat.processors.frame_processor import FrameDirection
from pipecat.services.settings import NOT_GIVEN, TTSSettings, _NotGiven
from pipecat.services.settings import NOT_GIVEN, TTSSettings, _NotGiven, _warn_deprecated_param
from pipecat.services.tts_service import InterruptibleTTSService, TextAggregationMode, TTSService
from pipecat.transcriptions.language import Language, resolve_language
from pipecat.utils.tracing.service_decorators import traced_tts
@@ -102,6 +102,9 @@ class NeuphonicTTSService(InterruptibleTTSService):
class InputParams(BaseModel):
"""Input parameters for Neuphonic TTS configuration.
.. deprecated:: 1.0
Use ``settings=NeuphonicTTSSettings(...)`` instead.
Parameters:
language: Language for synthesis. Defaults to English.
speed: Speech speed multiplier. Defaults to 1.0.
@@ -119,6 +122,7 @@ class NeuphonicTTSService(InterruptibleTTSService):
sample_rate: Optional[int] = 22050,
encoding: str = "pcm_linear",
params: Optional[InputParams] = None,
settings: Optional[NeuphonicTTSSettings] = None,
aggregate_sentences: Optional[bool] = None,
text_aggregation_mode: Optional[TextAggregationMode] = None,
**kwargs,
@@ -128,10 +132,20 @@ class NeuphonicTTSService(InterruptibleTTSService):
Args:
api_key: Neuphonic API key for authentication.
voice_id: ID of the voice to use for synthesis.
.. deprecated:: 1.0
Use ``settings=NeuphonicTTSSettings(voice=...)`` instead.
url: WebSocket URL for the Neuphonic API.
sample_rate: Audio sample rate in Hz. Defaults to 22050.
encoding: Audio encoding format. Defaults to "pcm_linear".
params: Additional input parameters for TTS configuration.
.. deprecated:: 1.0
Use ``settings=NeuphonicTTSSettings(...)`` instead.
settings: Runtime-updatable settings. When provided alongside deprecated
parameters, ``settings`` values take precedence.
aggregate_sentences: Deprecated. Use text_aggregation_mode instead.
.. deprecated:: 0.0.104
@@ -140,7 +154,23 @@ class NeuphonicTTSService(InterruptibleTTSService):
text_aggregation_mode: How to aggregate text before synthesis.
**kwargs: Additional arguments passed to parent InterruptibleTTSService.
"""
params = params or NeuphonicTTSService.InputParams()
if voice_id is not None:
_warn_deprecated_param("voice_id", "NeuphonicTTSSettings", "voice")
if params is not None:
_warn_deprecated_param("params", "NeuphonicTTSSettings")
_params = params or NeuphonicTTSService.InputParams()
default_settings = NeuphonicTTSSettings(
model=None,
language=self.language_to_service_language(_params.language),
speed=_params.speed,
encoding=encoding,
sampling_rate=sample_rate,
voice=voice_id,
)
if settings is not None:
default_settings.apply_update(settings)
super().__init__(
aggregate_sentences=aggregate_sentences,
@@ -148,14 +178,7 @@ class NeuphonicTTSService(InterruptibleTTSService):
push_stop_frames=True,
stop_frame_timeout_s=2.0,
sample_rate=sample_rate,
settings=NeuphonicTTSSettings(
model=None,
language=self.language_to_service_language(params.language),
speed=params.speed,
encoding=encoding,
sampling_rate=sample_rate,
voice=voice_id,
),
settings=default_settings,
**kwargs,
)
@@ -418,6 +441,9 @@ class NeuphonicHttpTTSService(TTSService):
class InputParams(BaseModel):
"""Input parameters for Neuphonic HTTP TTS configuration.
.. deprecated:: 1.0
Use ``settings=NeuphonicTTSSettings(...)`` instead.
Parameters:
language: Language for synthesis. Defaults to English.
speed: Speech speed multiplier. Defaults to 1.0.
@@ -436,6 +462,7 @@ class NeuphonicHttpTTSService(TTSService):
sample_rate: Optional[int] = 22050,
encoding: Optional[str] = "pcm_linear",
params: Optional[InputParams] = None,
settings: Optional[NeuphonicTTSSettings] = None,
**kwargs,
):
"""Initialize the Neuphonic HTTP TTS service.
@@ -443,25 +470,44 @@ class NeuphonicHttpTTSService(TTSService):
Args:
api_key: Neuphonic API key for authentication.
voice_id: ID of the voice to use for synthesis.
.. deprecated:: 1.0
Use ``settings=NeuphonicTTSSettings(voice=...)`` instead.
aiohttp_session: Shared aiohttp session for HTTP requests.
url: Base URL for the Neuphonic HTTP API.
sample_rate: Audio sample rate in Hz. Defaults to 22050.
encoding: Audio encoding format. Defaults to "pcm_linear".
params: Additional input parameters for TTS configuration.
.. deprecated:: 1.0
Use ``settings=NeuphonicTTSSettings(...)`` instead.
settings: Runtime-updatable settings. When provided alongside deprecated
parameters, ``settings`` values take precedence.
**kwargs: Additional arguments passed to parent TTSService.
"""
params = params or NeuphonicHttpTTSService.InputParams()
if voice_id is not None:
_warn_deprecated_param("voice_id", "NeuphonicTTSSettings", "voice")
if params is not None:
_warn_deprecated_param("params", "NeuphonicTTSSettings")
_params = params or NeuphonicHttpTTSService.InputParams()
default_settings = NeuphonicTTSSettings(
model=None,
voice=voice_id,
language=self.language_to_service_language(_params.language) or "en",
speed=_params.speed,
encoding=encoding,
sampling_rate=sample_rate,
)
if settings is not None:
default_settings.apply_update(settings)
super().__init__(
sample_rate=sample_rate,
settings=NeuphonicTTSSettings(
model=None,
voice=voice_id,
language=self.language_to_service_language(params.language) or "en",
speed=params.speed,
encoding=encoding,
sampling_rate=sample_rate,
),
settings=default_settings,
**kwargs,
)

View File

@@ -10,10 +10,14 @@ This module provides a service for interacting with NVIDIA's NIM (NVIDIA Inferen
Microservice) API while maintaining compatibility with the OpenAI-style interface.
"""
from typing import Optional
from pipecat.metrics.metrics import LLMTokenUsage
from pipecat.processors.aggregators.llm_context import LLMContext
from pipecat.processors.aggregators.openai_llm_context import OpenAILLMContext
from pipecat.services.openai.base_llm import OpenAILLMSettings
from pipecat.services.openai.llm import OpenAILLMService
from pipecat.services.settings import _warn_deprecated_param
class NvidiaLLMService(OpenAILLMService):
@@ -29,7 +33,8 @@ class NvidiaLLMService(OpenAILLMService):
*,
api_key: str,
base_url: str = "https://integrate.api.nvidia.com/v1",
model: str = "nvidia/llama-3.1-nemotron-70b-instruct",
model: Optional[str] = None,
settings: Optional[OpenAILLMSettings] = None,
**kwargs,
):
"""Initialize the NvidiaLLMService.
@@ -37,10 +42,26 @@ class NvidiaLLMService(OpenAILLMService):
Args:
api_key: The API key for accessing NVIDIA's NIM API.
base_url: The base URL for NIM API. Defaults to "https://integrate.api.nvidia.com/v1".
model: The model identifier to use. Defaults to "nvidia/llama-3.1-nemotron-70b-instruct".
model: The model identifier to use. Defaults to
"nvidia/llama-3.1-nemotron-70b-instruct".
.. deprecated:: 1.0
Use ``settings=OpenAILLMSettings(model=...)`` instead.
settings: Runtime-updatable settings. When provided alongside deprecated
parameters, ``settings`` values take precedence.
**kwargs: Additional keyword arguments passed to OpenAILLMService.
"""
super().__init__(api_key=api_key, base_url=base_url, model=model, **kwargs)
if model is not None:
_warn_deprecated_param("model", "OpenAILLMSettings", "model")
default_settings = OpenAILLMSettings(
model=model or "nvidia/llama-3.1-nemotron-70b-instruct"
)
if settings is not None:
default_settings.apply_update(settings)
super().__init__(api_key=api_key, base_url=base_url, settings=default_settings, **kwargs)
# Counters for accumulating token usage metrics
self._prompt_tokens = 0
self._completion_tokens = 0

View File

@@ -23,7 +23,7 @@ from pipecat.frames.frames import (
StartFrame,
TranscriptionFrame,
)
from pipecat.services.settings import NOT_GIVEN, STTSettings, _NotGiven
from pipecat.services.settings import NOT_GIVEN, STTSettings, _NotGiven, _warn_deprecated_param
from pipecat.services.stt_latency import NVIDIA_TTFS_P99
from pipecat.services.stt_service import SegmentedSTTService, STTService
from pipecat.transcriptions.language import Language, resolve_language
@@ -130,6 +130,9 @@ class NvidiaSTTService(STTService):
class InputParams(BaseModel):
"""Configuration parameters for NVIDIA Riva STT service.
.. deprecated:: 1.0
Use ``settings=NvidiaSTTSettings(...)`` instead.
Parameters:
language: Target language for transcription. Defaults to EN_US.
"""
@@ -148,6 +151,7 @@ class NvidiaSTTService(STTService):
sample_rate: Optional[int] = None,
params: Optional[InputParams] = None,
use_ssl: bool = True,
settings: Optional[NvidiaSTTSettings] = None,
ttfs_p99_latency: Optional[float] = NVIDIA_TTFS_P99,
**kwargs,
):
@@ -159,20 +163,33 @@ class NvidiaSTTService(STTService):
model_function_map: Mapping containing 'function_id' and 'model_name' for the ASR model.
sample_rate: Audio sample rate in Hz. If None, uses pipeline default.
params: Additional configuration parameters for NVIDIA Riva.
.. deprecated:: 1.0
Use ``settings=NvidiaSTTSettings(...)`` instead.
use_ssl: Whether to use SSL for the NVIDIA Riva server. Defaults to True.
settings: Runtime-updatable settings. When provided alongside deprecated
parameters, ``settings`` values take precedence.
ttfs_p99_latency: P99 latency from speech end to final transcript in seconds.
Override for your deployment. See https://github.com/pipecat-ai/stt-benchmark
**kwargs: Additional arguments passed to STTService.
"""
params = params or NvidiaSTTService.InputParams()
if params is not None:
_warn_deprecated_param("params", "NvidiaSTTSettings")
_params = params or NvidiaSTTService.InputParams()
default_settings = NvidiaSTTSettings(
model=model_function_map.get("model_name"),
language=_params.language,
)
if settings is not None:
default_settings.apply_update(settings)
super().__init__(
sample_rate=sample_rate,
ttfs_p99_latency=ttfs_p99_latency,
settings=NvidiaSTTSettings(
model=model_function_map.get("model_name"),
language=params.language,
),
settings=default_settings,
**kwargs,
)
@@ -421,6 +438,9 @@ class NvidiaSegmentedSTTService(SegmentedSTTService):
class InputParams(BaseModel):
"""Configuration parameters for NVIDIA Riva segmented STT service.
.. deprecated:: 1.0
Use ``settings=NvidiaSegmentedSTTSettings(...)`` instead.
Parameters:
language: Target language for transcription. Defaults to EN_US.
profanity_filter: Whether to filter profanity from results.
@@ -449,6 +469,7 @@ class NvidiaSegmentedSTTService(SegmentedSTTService):
sample_rate: Optional[int] = None,
params: Optional[InputParams] = None,
use_ssl: bool = True,
settings: Optional[NvidiaSegmentedSTTSettings] = None,
ttfs_p99_latency: Optional[float] = NVIDIA_TTFS_P99,
**kwargs,
):
@@ -460,26 +481,39 @@ class NvidiaSegmentedSTTService(SegmentedSTTService):
model_function_map: Mapping of model name and its corresponding NVIDIA Cloud Function ID
sample_rate: Audio sample rate in Hz. If not provided, uses the pipeline's rate
params: Additional configuration parameters for NVIDIA Riva
.. deprecated:: 1.0
Use ``settings=NvidiaSegmentedSTTSettings(...)`` instead.
use_ssl: Whether to use SSL for the NVIDIA Riva server. Defaults to True.
settings: Runtime-updatable settings. When provided alongside deprecated
parameters, ``settings`` values take precedence.
ttfs_p99_latency: P99 latency from speech end to final transcript in seconds.
Override for your deployment. See https://github.com/pipecat-ai/stt-benchmark
**kwargs: Additional arguments passed to SegmentedSTTService
"""
params = params or NvidiaSegmentedSTTService.InputParams()
if params is not None:
_warn_deprecated_param("params", "NvidiaSegmentedSTTSettings")
_params = params or NvidiaSegmentedSTTService.InputParams()
default_settings = NvidiaSegmentedSTTSettings(
model=model_function_map.get("model_name"),
language=self.language_to_service_language(_params.language or Language.EN_US)
or "en-US",
profanity_filter=_params.profanity_filter,
automatic_punctuation=_params.automatic_punctuation,
verbatim_transcripts=_params.verbatim_transcripts,
boosted_lm_words=_params.boosted_lm_words,
boosted_lm_score=_params.boosted_lm_score,
)
if settings is not None:
default_settings.apply_update(settings)
super().__init__(
sample_rate=sample_rate,
ttfs_p99_latency=ttfs_p99_latency,
settings=NvidiaSegmentedSTTSettings(
model=model_function_map.get("model_name"),
language=self.language_to_service_language(params.language or Language.EN_US)
or "en-US",
profanity_filter=params.profanity_filter,
automatic_punctuation=params.automatic_punctuation,
verbatim_transcripts=params.verbatim_transcripts,
boosted_lm_words=params.boosted_lm_words,
boosted_lm_score=params.boosted_lm_score,
),
settings=default_settings,
**kwargs,
)

View File

@@ -31,7 +31,7 @@ from pipecat.frames.frames import (
TTSStartedFrame,
TTSStoppedFrame,
)
from pipecat.services.settings import NOT_GIVEN, TTSSettings, _NotGiven
from pipecat.services.settings import NOT_GIVEN, TTSSettings, _NotGiven, _warn_deprecated_param
from pipecat.services.tts_service import TTSService
from pipecat.transcriptions.language import Language
@@ -68,6 +68,9 @@ class NvidiaTTSService(TTSService):
class InputParams(BaseModel):
"""Input parameters for Riva TTS configuration.
.. deprecated:: 1.0
Use ``NvidiaTTSSettings`` directly via the ``settings`` parameter instead.
Parameters:
language: Language code for synthesis. Defaults to US English.
quality: Audio quality setting (0-100). Defaults to 20.
@@ -81,13 +84,14 @@ class NvidiaTTSService(TTSService):
*,
api_key: str,
server: str = "grpc.nvcf.nvidia.com:443",
voice_id: str = "Magpie-Multilingual.EN-US.Aria",
voice_id: Optional[str] = None,
sample_rate: Optional[int] = None,
model_function_map: Mapping[str, str] = {
"function_id": "877104f7-e885-42b9-8de8-f6e4c6303969",
"model_name": "magpie-tts-multilingual",
},
params: Optional[InputParams] = None,
settings: Optional[NvidiaTTSSettings] = None,
use_ssl: bool = True,
**kwargs,
):
@@ -96,23 +100,42 @@ class NvidiaTTSService(TTSService):
Args:
api_key: NVIDIA API key for authentication.
server: gRPC server endpoint. Defaults to NVIDIA's cloud endpoint.
voice_id: Voice model identifier. Defaults to multilingual Ray voice.
voice_id: Voice model identifier. Defaults to multilingual Aria voice.
.. deprecated:: 1.0
Use ``settings=NvidiaTTSSettings(voice=...)`` instead.
sample_rate: Audio sample rate. If None, uses service default.
model_function_map: Dictionary containing function_id and model_name for the TTS model.
params: Additional configuration parameters for TTS synthesis.
.. deprecated:: 1.0
Use ``settings=NvidiaTTSSettings(...)`` instead.
settings: Runtime-updatable settings. When provided alongside deprecated
parameters, ``settings`` values take precedence.
use_ssl: Whether to use SSL for the NVIDIA Riva server. Defaults to True.
**kwargs: Additional arguments passed to parent TTSService.
"""
params = params or NvidiaTTSService.InputParams()
if voice_id is not None:
_warn_deprecated_param("voice_id", "NvidiaTTSSettings", "voice")
if params is not None:
_warn_deprecated_param("params", "NvidiaTTSSettings")
_params = params or NvidiaTTSService.InputParams()
default_settings = NvidiaTTSSettings(
model=model_function_map.get("model_name"),
voice=voice_id or "Magpie-Multilingual.EN-US.Aria",
language=_params.language,
quality=_params.quality,
)
if settings is not None:
default_settings.apply_update(settings)
super().__init__(
sample_rate=sample_rate,
settings=NvidiaTTSSettings(
model=model_function_map.get("model_name"),
voice=voice_id,
language=params.language,
quality=params.quality,
),
settings=default_settings,
**kwargs,
)

View File

@@ -6,9 +6,13 @@
"""OLLama LLM service implementation for Pipecat AI framework."""
from typing import Optional
from loguru import logger
from pipecat.services.openai.base_llm import OpenAILLMSettings
from pipecat.services.openai.llm import OpenAILLMService
from pipecat.services.settings import _warn_deprecated_param
class OLLamaLLMService(OpenAILLMService):
@@ -19,17 +23,35 @@ class OLLamaLLMService(OpenAILLMService):
"""
def __init__(
self, *, model: str = "llama2", base_url: str = "http://localhost:11434/v1", **kwargs
self,
*,
model: Optional[str] = None,
base_url: str = "http://localhost:11434/v1",
settings: Optional[OpenAILLMSettings] = None,
**kwargs,
):
"""Initialize OLLama LLM service.
Args:
model: The OLLama model to use. Defaults to "llama2".
.. deprecated:: 1.0
Use ``settings=OpenAILLMSettings(model=...)`` instead.
base_url: The base URL for the OLLama API endpoint.
Defaults to "http://localhost:11434/v1".
settings: Runtime-updatable settings. When provided alongside deprecated
parameters, ``settings`` values take precedence.
**kwargs: Additional keyword arguments passed to OpenAILLMService.
"""
super().__init__(model=model, base_url=base_url, api_key="ollama", **kwargs)
if model is not None:
_warn_deprecated_param("model", "OpenAILLMSettings", "model")
default_settings = OpenAILLMSettings(model=model or "llama2")
if settings is not None:
default_settings.apply_update(settings)
super().__init__(base_url=base_url, api_key="ollama", settings=default_settings, **kwargs)
def create_client(self, base_url=None, **kwargs):
"""Create OpenAI-compatible client for Ollama.

View File

@@ -75,6 +75,10 @@ class BaseOpenAILLMService(LLMService):
class InputParams(BaseModel):
"""Input parameters for OpenAI model configuration.
.. deprecated:: 1.0
Use ``settings=OpenAILLMSettings(...)`` instead of
``params=InputParams(...)``.
Parameters:
frequency_penalty: Penalty for frequent tokens (-2.0 to 2.0).
presence_penalty: Penalty for new tokens (-2.0 to 2.0).
@@ -108,13 +112,14 @@ class BaseOpenAILLMService(LLMService):
def __init__(
self,
*,
model: str,
model: Optional[str] = None,
api_key=None,
base_url=None,
organization=None,
project=None,
default_headers: Optional[Mapping[str, str]] = None,
params: Optional[InputParams] = None,
settings: Optional[OpenAILLMSettings] = None,
retry_timeout_secs: Optional[float] = 5.0,
retry_on_timeout: Optional[bool] = False,
system_instruction: Optional[str] = None,
@@ -124,35 +129,50 @@ class BaseOpenAILLMService(LLMService):
Args:
model: The OpenAI model name to use (e.g., "gpt-4.1", "gpt-4o").
.. deprecated:: 1.0
Use ``settings=OpenAILLMSettings(model=...)`` instead.
api_key: OpenAI API key. If None, uses environment variable.
base_url: Custom base URL for OpenAI API. If None, uses default.
organization: OpenAI organization ID.
project: OpenAI project ID.
default_headers: Additional HTTP headers to include in requests.
params: Input parameters for model configuration and behavior.
.. deprecated:: 1.0
Use ``settings=OpenAILLMSettings(...)`` instead.
settings: Runtime-updatable settings. When provided alongside deprecated
parameters, ``settings`` values take precedence.
retry_timeout_secs: Request timeout in seconds. Defaults to 5.0 seconds.
retry_on_timeout: Whether to retry the request once if it times out.
system_instruction: Optional system instruction to prepend to messages.
**kwargs: Additional arguments passed to the parent LLMService.
"""
params = params or BaseOpenAILLMService.InputParams()
_params = params or BaseOpenAILLMService.InputParams()
default_settings = OpenAILLMSettings(
model=model or "gpt-4o",
frequency_penalty=_params.frequency_penalty,
presence_penalty=_params.presence_penalty,
seed=_params.seed,
temperature=_params.temperature,
top_p=_params.top_p,
top_k=None,
max_tokens=_params.max_tokens,
max_completion_tokens=_params.max_completion_tokens,
service_tier=_params.service_tier,
filter_incomplete_user_turns=False,
user_turn_completion_config=None,
extra=_params.extra if isinstance(_params.extra, dict) else {},
)
if settings is not None:
default_settings.apply_update(settings)
super().__init__(
settings=OpenAILLMSettings(
model=model,
frequency_penalty=params.frequency_penalty,
presence_penalty=params.presence_penalty,
seed=params.seed,
temperature=params.temperature,
top_p=params.top_p,
top_k=None,
max_tokens=params.max_tokens,
max_completion_tokens=params.max_completion_tokens,
service_tier=params.service_tier,
filter_incomplete_user_turns=False,
user_turn_completion_config=None,
extra=params.extra if isinstance(params.extra, dict) else {},
),
settings=default_settings,
**kwargs,
)
self._retry_timeout_secs = retry_timeout_secs

View File

@@ -25,7 +25,7 @@ from pipecat.frames.frames import (
URLImageRawFrame,
)
from pipecat.services.image_service import ImageGenService
from pipecat.services.settings import ImageGenSettings
from pipecat.services.settings import ImageGenSettings, _warn_deprecated_param
@dataclass
@@ -52,7 +52,8 @@ class OpenAIImageGenService(ImageGenService):
base_url: Optional[str] = None,
aiohttp_session: aiohttp.ClientSession,
image_size: Literal["256x256", "512x512", "1024x1024", "1792x1024", "1024x1792"],
model: str = "dall-e-3",
model: Optional[str] = None,
settings: Optional[OpenAIImageGenSettings] = None,
):
"""Initialize the OpenAI image generation service.
@@ -62,8 +63,21 @@ class OpenAIImageGenService(ImageGenService):
aiohttp_session: HTTP session for downloading generated images.
image_size: Target size for generated images.
model: DALL-E model to use for generation. Defaults to "dall-e-3".
.. deprecated:: 1.0
Use ``settings=OpenAIImageGenSettings(model=...)`` instead.
settings: Runtime-updatable settings. When provided alongside deprecated
parameters, ``settings`` values take precedence.
"""
super().__init__(settings=OpenAIImageGenSettings(model=model))
if model is not None:
_warn_deprecated_param("model", "OpenAIImageGenSettings", "model")
default_settings = OpenAIImageGenSettings(model=model or "dall-e-3")
if settings is not None:
default_settings.apply_update(settings)
super().__init__(settings=default_settings)
self._image_size = image_size
self._client = AsyncOpenAI(api_key=api_key, base_url=base_url)
self._aiohttp_session = aiohttp_session

View File

@@ -23,7 +23,8 @@ from pipecat.processors.aggregators.llm_response import (
LLMUserContextAggregator,
)
from pipecat.processors.aggregators.openai_llm_context import OpenAILLMContext
from pipecat.services.openai.base_llm import BaseOpenAILLMService
from pipecat.services.openai.base_llm import BaseOpenAILLMService, OpenAILLMSettings
from pipecat.services.settings import _warn_deprecated_param
@dataclass
@@ -72,18 +73,53 @@ class OpenAILLMService(BaseOpenAILLMService):
def __init__(
self,
*,
model: str = "gpt-4.1",
model: Optional[str] = None,
params: Optional[BaseOpenAILLMService.InputParams] = None,
settings: Optional[OpenAILLMSettings] = None,
**kwargs,
):
"""Initialize OpenAI LLM service.
Args:
model: The OpenAI model name to use. Defaults to "gpt-4.1".
.. deprecated:: 1.0
Use ``settings=OpenAILLMSettings(model=...)`` instead.
params: Input parameters for model configuration.
.. deprecated:: 1.0
Use ``settings=OpenAILLMSettings(...)`` instead.
settings: Runtime-updatable settings. When provided alongside deprecated
parameters, ``settings`` values take precedence.
**kwargs: Additional arguments passed to the parent BaseOpenAILLMService.
"""
super().__init__(model=model, params=params, **kwargs)
if model is not None:
_warn_deprecated_param("model", "OpenAILLMSettings", "model")
if params is not None:
_warn_deprecated_param("params", "OpenAILLMSettings")
_params = params or BaseOpenAILLMService.InputParams()
default_settings = OpenAILLMSettings(
model=model or "gpt-4.1",
frequency_penalty=_params.frequency_penalty,
presence_penalty=_params.presence_penalty,
seed=_params.seed,
temperature=_params.temperature,
top_p=_params.top_p,
top_k=None,
max_tokens=_params.max_tokens,
max_completion_tokens=_params.max_completion_tokens,
service_tier=_params.service_tier,
filter_incomplete_user_turns=False,
user_turn_completion_config=None,
extra=_params.extra if isinstance(_params.extra, dict) else {},
)
if settings is not None:
default_settings.apply_update(settings)
super().__init__(settings=default_settings, **kwargs)
def create_context_aggregator(
self,

View File

@@ -59,7 +59,7 @@ from pipecat.processors.aggregators.openai_llm_context import (
)
from pipecat.processors.frame_processor import FrameDirection
from pipecat.services.llm_service import FunctionCallFromLLM, LLMService
from pipecat.services.settings import NOT_GIVEN, LLMSettings, _NotGiven
from pipecat.services.settings import NOT_GIVEN, LLMSettings, _NotGiven, _warn_deprecated_param
from pipecat.transcriptions.language import Language
from pipecat.utils.time import time_now_iso8601
from pipecat.utils.tracing.service_decorators import traced_openai_realtime, traced_stt
@@ -121,9 +121,10 @@ class OpenAIRealtimeLLMService(LLMService):
self,
*,
api_key: str,
model: str = "gpt-realtime-1.5",
model: Optional[str] = None,
base_url: str = "wss://api.openai.com/v1/realtime",
session_properties: Optional[events.SessionProperties] = None,
settings: Optional[OpenAIRealtimeLLMSettings] = None,
start_audio_paused: bool = False,
start_video_paused: bool = False,
video_frame_detail: str = "auto",
@@ -134,14 +135,25 @@ class OpenAIRealtimeLLMService(LLMService):
Args:
api_key: OpenAI API key for authentication.
model: OpenAI model name. Defaults to "gpt-realtime".
model: OpenAI model name.
.. deprecated::
Use ``settings=OpenAIRealtimeLLMSettings(model=...)`` instead.
This is a connection-level parameter set via the WebSocket URL query
parameter and cannot be changed during the session.
base_url: WebSocket base URL for the realtime API.
Defaults to "wss://api.openai.com/v1/realtime".
session_properties: Configuration properties for the realtime session.
.. deprecated::
Use ``settings=OpenAIRealtimeLLMSettings(session_properties=...)``
instead.
These are session-level settings that can be updated during the session
(except for voice and model). If None, uses default SessionProperties.
settings: Realtime LLM settings. If provided together with deprecated
top-level parameters, the ``settings`` values take precedence.
start_audio_paused: Whether to start with audio input paused. Defaults to False.
start_video_paused: Whether to start with video input paused. Defaults to False.
video_frame_detail: Detail level for video processing. Can be "auto", "low", or "high".
@@ -156,6 +168,12 @@ class OpenAIRealtimeLLMService(LLMService):
**kwargs: Additional arguments passed to parent LLMService.
"""
if model is not None:
_warn_deprecated_param("model", "OpenAIRealtimeLLMSettings", "model")
if session_properties is not None:
_warn_deprecated_param(
"session_properties", "OpenAIRealtimeLLMSettings", "session_properties"
)
if send_transcription_frames is not None:
import warnings
@@ -168,24 +186,28 @@ class OpenAIRealtimeLLMService(LLMService):
stacklevel=2,
)
default_settings = OpenAIRealtimeLLMSettings(
model=model or "gpt-realtime-1.5",
temperature=None,
max_tokens=None,
top_p=None,
top_k=None,
frequency_penalty=None,
presence_penalty=None,
seed=None,
filter_incomplete_user_turns=False,
user_turn_completion_config=None,
session_properties=session_properties or events.SessionProperties(),
)
if settings is not None:
default_settings.apply_update(settings)
# Build WebSocket URL with model query parameter
# Source: https://platform.openai.com/docs/guides/realtime-websocket
full_url = f"{base_url}?model={model}"
full_url = f"{base_url}?model={default_settings.model}"
super().__init__(
base_url=full_url,
settings=OpenAIRealtimeLLMSettings(
model=model,
temperature=None,
max_tokens=None,
top_p=None,
top_k=None,
frequency_penalty=None,
presence_penalty=None,
seed=None,
filter_incomplete_user_turns=False,
user_turn_completion_config=None,
session_properties=session_properties or events.SessionProperties(),
),
settings=default_settings,
**kwargs,
)

View File

@@ -35,10 +35,14 @@ from pipecat.frames.frames import (
VADUserStoppedSpeakingFrame,
)
from pipecat.processors.frame_processor import FrameDirection
from pipecat.services.settings import NOT_GIVEN, STTSettings, _NotGiven
from pipecat.services.settings import NOT_GIVEN, STTSettings, _NotGiven, _warn_deprecated_param
from pipecat.services.stt_latency import OPENAI_REALTIME_TTFS_P99, OPENAI_TTFS_P99
from pipecat.services.stt_service import WebsocketSTTService
from pipecat.services.whisper.base_stt import BaseWhisperSTTService, Transcription
from pipecat.services.whisper.base_stt import (
BaseWhisperSTTService,
BaseWhisperSTTSettings,
Transcription,
)
from pipecat.transcriptions.language import Language
from pipecat.utils.time import time_now_iso8601
from pipecat.utils.tracing.service_decorators import traced_stt
@@ -61,30 +65,40 @@ class OpenAISTTService(BaseWhisperSTTService):
def __init__(
self,
*,
model: str = "gpt-4o-transcribe",
model: Optional[str] = None,
api_key: Optional[str] = None,
base_url: Optional[str] = None,
language: Optional[Language] = Language.EN,
prompt: Optional[str] = None,
temperature: Optional[float] = None,
settings: Optional[BaseWhisperSTTSettings] = None,
ttfs_p99_latency: Optional[float] = OPENAI_TTFS_P99,
**kwargs,
):
"""Initialize OpenAI STT service.
Args:
model: Model to use — either gpt-4o or Whisper. Defaults to "gpt-4o-transcribe".
model: Model to use — either gpt-4o or Whisper.
.. deprecated:: 1.0
Use ``settings=BaseWhisperSTTSettings(model=...)`` instead.
api_key: OpenAI API key. Defaults to None.
base_url: API base URL. Defaults to None.
language: Language of the audio input. Defaults to English.
prompt: Optional text to guide the model's style or continue a previous segment.
temperature: Optional sampling temperature between 0 and 1. Defaults to 0.0.
settings: Runtime-updatable settings. When provided alongside deprecated
parameters, ``settings`` values take precedence.
ttfs_p99_latency: P99 latency from speech end to final transcript in seconds.
Override for your deployment. See https://github.com/pipecat-ai/stt-benchmark
**kwargs: Additional arguments passed to BaseWhisperSTTService.
"""
if model is not None:
_warn_deprecated_param("model", "BaseWhisperSTTSettings", "model")
super().__init__(
model=model,
model=model or "gpt-4o-transcribe",
api_key=api_key,
base_url=base_url,
language=language,
@@ -94,6 +108,9 @@ class OpenAISTTService(BaseWhisperSTTService):
**kwargs,
)
if settings is not None:
self._settings.apply_update(settings)
async def _transcribe(self, audio: bytes) -> Transcription:
assert self._language is not None # Assigned in the BaseWhisperSTTService class
@@ -175,13 +192,14 @@ class OpenAIRealtimeSTTService(WebsocketSTTService):
self,
*,
api_key: str,
model: str = "gpt-4o-transcribe",
model: Optional[str] = None,
base_url: str = "wss://api.openai.com/v1/realtime",
language: Optional[Language] = Language.EN,
prompt: Optional[str] = None,
turn_detection: Optional[Union[dict, Literal[False]]] = False,
noise_reduction: Optional[Literal["near_field", "far_field"]] = None,
should_interrupt: bool = True,
settings: Optional[OpenAIRealtimeSTTSettings] = None,
ttfs_p99_latency: Optional[float] = OPENAI_REALTIME_TTFS_P99,
**kwargs,
):
@@ -191,7 +209,10 @@ class OpenAIRealtimeSTTService(WebsocketSTTService):
api_key: OpenAI API key for authentication.
model: Transcription model. Supported values are
``"gpt-4o-transcribe"`` and ``"gpt-4o-mini-transcribe"``.
Defaults to ``"gpt-4o-transcribe"``.
.. deprecated:: 1.0
Use ``settings=OpenAIRealtimeSTTSettings(model=...)`` instead.
base_url: WebSocket base URL for the Realtime API.
Defaults to ``"wss://api.openai.com/v1/realtime"``.
language: Language of the audio input. Defaults to English.
@@ -208,6 +229,8 @@ class OpenAIRealtimeSTTService(WebsocketSTTService):
should_interrupt: Whether to interrupt bot output when
speech is detected by server-side VAD. Only applies when
turn detection is enabled. Defaults to True.
settings: Runtime-updatable settings. When provided alongside deprecated
parameters, ``settings`` values take precedence.
ttfs_p99_latency: P99 latency from speech end to final transcript in seconds.
Override for your deployment. See https://github.com/pipecat-ai/stt-benchmark
**kwargs: Additional arguments passed to parent
@@ -219,13 +242,20 @@ class OpenAIRealtimeSTTService(WebsocketSTTService):
"Install it with: pip install pipecat-ai[openai]"
)
if model is not None:
_warn_deprecated_param("model", "OpenAIRealtimeSTTSettings", "model")
default_settings = OpenAIRealtimeSTTSettings(
model=model or "gpt-4o-transcribe",
language=language,
prompt=prompt,
)
if settings is not None:
default_settings.apply_update(settings)
super().__init__(
ttfs_p99_latency=ttfs_p99_latency,
settings=OpenAIRealtimeSTTSettings(
model=model,
language=language,
prompt=prompt,
),
settings=default_settings,
**kwargs,
)

View File

@@ -25,7 +25,7 @@ from pipecat.frames.frames import (
TTSStartedFrame,
TTSStoppedFrame,
)
from pipecat.services.settings import NOT_GIVEN, TTSSettings, _NotGiven
from pipecat.services.settings import NOT_GIVEN, TTSSettings, _NotGiven, _warn_deprecated_param
from pipecat.services.tts_service import TTSService
from pipecat.utils.tracing.service_decorators import traced_tts
@@ -90,6 +90,9 @@ class OpenAITTSService(TTSService):
class InputParams(BaseModel):
"""Input parameters for OpenAI TTS configuration.
.. deprecated:: 1.0
Use ``settings=OpenAITTSSettings(...)`` instead.
Parameters:
instructions: Instructions to guide voice synthesis behavior.
speed: Voice speed control (0.25 to 4.0, default 1.0).
@@ -103,12 +106,13 @@ class OpenAITTSService(TTSService):
*,
api_key: Optional[str] = None,
base_url: Optional[str] = None,
voice: str = "alloy",
model: str = "gpt-4o-mini-tts",
voice: Optional[str] = None,
model: Optional[str] = None,
sample_rate: Optional[int] = None,
instructions: Optional[str] = None,
speed: Optional[float] = None,
params: Optional[InputParams] = None,
settings: Optional[OpenAITTSSettings] = None,
**kwargs,
):
"""Initialize OpenAI TTS service.
@@ -117,40 +121,69 @@ class OpenAITTSService(TTSService):
api_key: OpenAI API key for authentication. If None, uses environment variable.
base_url: Custom base URL for OpenAI API. If None, uses default.
voice: Voice ID to use for synthesis. Defaults to "alloy".
.. deprecated:: 1.0
Use ``settings=OpenAITTSSettings(voice=...)`` instead.
model: TTS model to use. Defaults to "gpt-4o-mini-tts".
.. deprecated:: 1.0
Use ``settings=OpenAITTSSettings(model=...)`` instead.
sample_rate: Output audio sample rate in Hz. If None, uses OpenAI's default 24kHz.
instructions: Optional instructions to guide voice synthesis behavior.
speed: Voice speed control (0.25 to 4.0, default 1.0).
params: Optional synthesis controls (acting instructions, speed, ...).
**kwargs: Additional keyword arguments passed to TTSService.
.. deprecated:: 0.0.91
The `instructions` and `speed` parameters are deprecated, use `InputParams` instead.
.. deprecated:: 1.0
Use ``settings=OpenAITTSSettings(instructions=...)`` instead.
speed: Voice speed control (0.25 to 4.0, default 1.0).
.. deprecated:: 1.0
Use ``settings=OpenAITTSSettings(speed=...)`` instead.
params: Optional synthesis controls (acting instructions, speed, ...).
.. deprecated:: 1.0
Use ``settings=OpenAITTSSettings(...)`` instead.
settings: Runtime-updatable settings. When provided alongside deprecated
parameters, ``settings`` values take precedence.
**kwargs: Additional keyword arguments passed to TTSService.
"""
if voice is not None:
_warn_deprecated_param("voice", "OpenAITTSSettings", "voice")
if model is not None:
_warn_deprecated_param("model", "OpenAITTSSettings", "model")
if instructions is not None:
_warn_deprecated_param("instructions", "OpenAITTSSettings", "instructions")
if speed is not None:
_warn_deprecated_param("speed", "OpenAITTSSettings", "speed")
if params is not None:
_warn_deprecated_param("params", "OpenAITTSSettings")
if sample_rate and sample_rate != self.OPENAI_SAMPLE_RATE:
logger.warning(
f"OpenAI TTS only supports {self.OPENAI_SAMPLE_RATE}Hz sample rate. "
f"Current rate of {sample_rate}Hz may cause issues."
)
if instructions or speed:
import warnings
with warnings.catch_warnings():
warnings.simplefilter("always")
warnings.warn(
"The `instructions` and `speed` parameters are deprecated, use `InputParams` instead.",
DeprecationWarning,
stacklevel=2,
)
_params = params or OpenAITTSService.InputParams()
_instructions = instructions if instructions is not None else _params.instructions
_speed = speed if speed is not None else _params.speed
default_settings = OpenAITTSSettings(
model=model or "gpt-4o-mini-tts",
voice=voice or "alloy",
language=None,
instructions=_instructions,
speed=_speed,
)
if settings is not None:
default_settings.apply_update(settings)
super().__init__(
sample_rate=sample_rate,
settings=OpenAITTSSettings(
model=model,
voice=voice,
instructions=params.instructions if params else instructions,
speed=params.speed if params else speed,
),
settings=default_settings,
**kwargs,
)

View File

@@ -54,7 +54,7 @@ from pipecat.processors.aggregators.openai_llm_context import (
from pipecat.processors.frame_processor import FrameDirection
from pipecat.services.llm_service import FunctionCallFromLLM, LLMService
from pipecat.services.openai.llm import OpenAIContextAggregatorPair
from pipecat.services.settings import NOT_GIVEN, LLMSettings, _NotGiven
from pipecat.services.settings import NOT_GIVEN, LLMSettings, _NotGiven, _warn_deprecated_param
from pipecat.transcriptions.language import Language
from pipecat.utils.time import time_now_iso8601
from pipecat.utils.tracing.service_decorators import traced_openai_realtime, traced_stt
@@ -126,9 +126,10 @@ class OpenAIRealtimeBetaLLMService(LLMService):
self,
*,
api_key: str,
model: str = "gpt-4o-realtime-preview-2025-06-03",
model: Optional[str] = None,
base_url: str = "wss://api.openai.com/v1/realtime",
session_properties: Optional[events.SessionProperties] = None,
settings: Optional[OpenAIRealtimeBetaLLMSettings] = None,
start_audio_paused: bool = False,
send_transcription_frames: bool = True,
**kwargs,
@@ -137,11 +138,22 @@ class OpenAIRealtimeBetaLLMService(LLMService):
Args:
api_key: OpenAI API key for authentication.
model: OpenAI model name. Defaults to "gpt-4o-realtime-preview-2025-06-03".
model: OpenAI model name.
.. deprecated::
Use ``settings=OpenAIRealtimeBetaLLMSettings(model=...)`` instead.
base_url: WebSocket base URL for the realtime API.
Defaults to "wss://api.openai.com/v1/realtime".
session_properties: Configuration properties for the realtime session.
.. deprecated::
Use ``settings=OpenAIRealtimeBetaLLMSettings(session_properties=...)``
instead.
If None, uses default SessionProperties.
settings: Realtime Beta LLM settings. If provided together with deprecated
top-level parameters, the ``settings`` values take precedence.
start_audio_paused: Whether to start with audio input paused. Defaults to False.
send_transcription_frames: Whether to emit transcription frames. Defaults to True.
**kwargs: Additional arguments passed to parent LLMService.
@@ -155,22 +167,33 @@ class OpenAIRealtimeBetaLLMService(LLMService):
stacklevel=2,
)
full_url = f"{base_url}?model={model}"
if model is not None:
_warn_deprecated_param("model", "OpenAIRealtimeBetaLLMSettings", "model")
if session_properties is not None:
_warn_deprecated_param(
"session_properties", "OpenAIRealtimeBetaLLMSettings", "session_properties"
)
default_settings = OpenAIRealtimeBetaLLMSettings(
model=model or "gpt-4o-realtime-preview-2025-06-03",
temperature=None,
max_tokens=None,
top_p=None,
top_k=None,
frequency_penalty=None,
presence_penalty=None,
seed=None,
filter_incomplete_user_turns=False,
user_turn_completion_config=None,
session_properties=session_properties or events.SessionProperties(),
)
if settings is not None:
default_settings.apply_update(settings)
full_url = f"{base_url}?model={default_settings.model}"
super().__init__(
base_url=full_url,
settings=OpenAIRealtimeBetaLLMSettings(
model=model,
temperature=None,
max_tokens=None,
top_p=None,
top_k=None,
frequency_penalty=None,
presence_penalty=None,
seed=None,
filter_incomplete_user_turns=False,
user_turn_completion_config=None,
session_properties=session_properties or events.SessionProperties(),
),
settings=default_settings,
**kwargs,
)

View File

@@ -15,7 +15,9 @@ from typing import Dict, Optional
from loguru import logger
from pipecat.adapters.services.open_ai_adapter import OpenAILLMInvocationParams
from pipecat.services.openai.base_llm import OpenAILLMSettings
from pipecat.services.openai.llm import OpenAILLMService
from pipecat.services.settings import _warn_deprecated_param
try:
from openpipe import AsyncOpenAI as OpenPipeAI
@@ -36,31 +38,45 @@ class OpenPipeLLMService(OpenAILLMService):
def __init__(
self,
*,
model: str = "gpt-4.1",
model: Optional[str] = None,
api_key: Optional[str] = None,
base_url: Optional[str] = None,
openpipe_api_key: Optional[str] = None,
openpipe_base_url: str = "https://app.openpipe.ai/api/v1",
tags: Optional[Dict[str, str]] = None,
settings: Optional[OpenAILLMSettings] = None,
**kwargs,
):
"""Initialize OpenPipe LLM service.
Args:
model: The model name to use. Defaults to "gpt-4.1".
.. deprecated:: 1.0
Use ``settings=OpenAILLMSettings(model=...)`` instead.
api_key: OpenAI API key for authentication. If None, reads from environment.
base_url: Custom OpenAI API endpoint URL. Uses default if None.
openpipe_api_key: OpenPipe API key for enhanced features. If None, reads from environment.
openpipe_base_url: OpenPipe API endpoint URL. Defaults to "https://app.openpipe.ai/api/v1".
tags: Optional dictionary of tags to apply to all requests for tracking.
settings: Runtime-updatable settings. When provided alongside deprecated
parameters, ``settings`` values take precedence.
**kwargs: Additional arguments passed to parent OpenAILLMService.
"""
if model is not None:
_warn_deprecated_param("model", "OpenAILLMSettings", "model")
default_settings = OpenAILLMSettings(model=model or "gpt-4.1")
if settings is not None:
default_settings.apply_update(settings)
super().__init__(
model=model,
api_key=api_key,
base_url=base_url,
openpipe_api_key=openpipe_api_key,
openpipe_base_url=openpipe_base_url,
settings=default_settings,
**kwargs,
)
self._tags = tags

View File

@@ -14,7 +14,9 @@ from typing import Any, Dict, Optional
from loguru import logger
from pipecat.services.openai.base_llm import OpenAILLMSettings
from pipecat.services.openai.llm import OpenAILLMService
from pipecat.services.settings import _warn_deprecated_param
class OpenRouterLLMService(OpenAILLMService):
@@ -28,8 +30,9 @@ class OpenRouterLLMService(OpenAILLMService):
self,
*,
api_key: Optional[str] = None,
model: str = "openai/gpt-4o-2024-11-20",
model: Optional[str] = None,
base_url: str = "https://openrouter.ai/api/v1",
settings: Optional[OpenAILLMSettings] = None,
**kwargs,
):
"""Initialize the OpenRouter LLM service.
@@ -38,13 +41,26 @@ class OpenRouterLLMService(OpenAILLMService):
api_key: The API key for accessing OpenRouter's API. If None, will attempt
to read from environment variables.
model: The model identifier to use. Defaults to "openai/gpt-4o-2024-11-20".
.. deprecated:: 1.0
Use ``settings=OpenAILLMSettings(model=...)`` instead.
base_url: The base URL for OpenRouter API. Defaults to "https://openrouter.ai/api/v1".
settings: Runtime-updatable settings. When provided alongside deprecated
parameters, ``settings`` values take precedence.
**kwargs: Additional keyword arguments passed to OpenAILLMService.
"""
if model is not None:
_warn_deprecated_param("model", "OpenAILLMSettings", "model")
default_settings = OpenAILLMSettings(model=model or "openai/gpt-4o-2024-11-20")
if settings is not None:
default_settings.apply_update(settings)
super().__init__(
api_key=api_key,
base_url=base_url,
model=model,
settings=default_settings,
**kwargs,
)

View File

@@ -11,11 +11,15 @@ an OpenAI-compatible interface. It handles Perplexity's unique token usage
reporting patterns while maintaining compatibility with the Pipecat framework.
"""
from typing import Optional
from pipecat.adapters.services.open_ai_adapter import OpenAILLMInvocationParams
from pipecat.metrics.metrics import LLMTokenUsage
from pipecat.processors.aggregators.llm_context import LLMContext
from pipecat.processors.aggregators.openai_llm_context import OpenAILLMContext
from pipecat.services.openai.base_llm import OpenAILLMSettings
from pipecat.services.openai.llm import OpenAILLMService
from pipecat.services.settings import _warn_deprecated_param
class PerplexityLLMService(OpenAILLMService):
@@ -31,7 +35,8 @@ class PerplexityLLMService(OpenAILLMService):
*,
api_key: str,
base_url: str = "https://api.perplexity.ai",
model: str = "sonar",
model: Optional[str] = None,
settings: Optional[OpenAILLMSettings] = None,
**kwargs,
):
"""Initialize the Perplexity LLM service.
@@ -40,9 +45,22 @@ class PerplexityLLMService(OpenAILLMService):
api_key: The API key for accessing Perplexity's API.
base_url: The base URL for Perplexity's API. Defaults to "https://api.perplexity.ai".
model: The model identifier to use. Defaults to "sonar".
.. deprecated:: 1.0
Use ``settings=OpenAILLMSettings(model=...)`` instead.
settings: Runtime-updatable settings. When provided alongside deprecated
parameters, ``settings`` values take precedence.
**kwargs: Additional keyword arguments passed to OpenAILLMService.
"""
super().__init__(api_key=api_key, base_url=base_url, model=model, **kwargs)
if model is not None:
_warn_deprecated_param("model", "OpenAILLMSettings", "model")
default_settings = OpenAILLMSettings(model=model or "sonar")
if settings is not None:
default_settings.apply_update(settings)
super().__init__(api_key=api_key, base_url=base_url, settings=default_settings, **kwargs)
# Counters for accumulating token usage metrics
self._prompt_tokens = 0
self._completion_tokens = 0

View File

@@ -20,7 +20,7 @@ from pipecat.frames.frames import (
TTSStartedFrame,
TTSStoppedFrame,
)
from pipecat.services.settings import TTSSettings
from pipecat.services.settings import TTSSettings, _warn_deprecated_param
from pipecat.services.tts_service import TTSService
from pipecat.utils.tracing.service_decorators import traced_tts
@@ -53,41 +53,56 @@ class PiperTTSService(TTSService):
def __init__(
self,
*,
voice_id: str,
voice_id: Optional[str] = None,
download_dir: Optional[Path] = None,
force_redownload: bool = False,
use_cuda: bool = False,
settings: Optional[PiperTTSSettings] = None,
**kwargs,
):
"""Initialize the Piper TTS service.
Args:
voice_id: Piper voice model identifier (e.g. `en_US-ryan-high`).
.. deprecated:: 1.0
Use ``settings=PiperTTSSettings(voice=...)`` instead.
download_dir: Directory for storing voice model files. Defaults to
the current working directory.
force_redownload: Re-download the voice model even if it already exists.
use_cuda: Use CUDA for GPU-accelerated inference.
settings: Runtime-updatable settings. When provided alongside deprecated
parameters, ``settings`` values take precedence.
**kwargs: Additional arguments passed to the parent `TTSService`.
"""
if voice_id is not None:
_warn_deprecated_param("voice_id", "PiperTTSSettings", "voice")
default_settings = PiperTTSSettings(model=None, voice=voice_id, language=None)
if settings is not None:
default_settings.apply_update(settings)
super().__init__(
settings=PiperTTSSettings(model=None, voice=voice_id, language=None),
settings=default_settings,
**kwargs,
)
download_dir = download_dir or Path.cwd()
model_file = f"{voice_id}.onnx"
_voice = self._settings.voice
model_file = f"{_voice}.onnx"
model_path = Path(download_dir) / model_file
if not model_path.exists():
logger.debug(f"Downloading Piper '{voice_id}' model")
download_voice(voice_id, download_dir, force_redownload=force_redownload)
logger.debug(f"Downloading Piper '{_voice}' model")
download_voice(_voice, download_dir, force_redownload=force_redownload)
logger.debug(f"Loading Piper '{voice_id}' model from {model_path}")
logger.debug(f"Loading Piper '{_voice}' model from {model_path}")
self._voice = PiperVoice.load(model_path, use_cuda=use_cuda)
logger.debug(f"Loaded Piper '{voice_id}' model")
logger.debug(f"Loaded Piper '{_voice}' model")
def can_generate_metrics(self) -> bool:
"""Check if this service can generate processing metrics.
@@ -190,6 +205,7 @@ class PiperHttpTTSService(TTSService):
base_url: str,
aiohttp_session: aiohttp.ClientSession,
voice_id: Optional[str] = None,
settings: Optional[PiperHttpTTSSettings] = None,
**kwargs,
):
"""Initialize the Piper TTS service.
@@ -198,10 +214,23 @@ class PiperHttpTTSService(TTSService):
base_url: Base URL for the Piper TTS HTTP server.
aiohttp_session: aiohttp ClientSession for making HTTP requests.
voice_id: Piper voice model identifier (e.g. `en_US-ryan-high`).
.. deprecated:: 1.0
Use ``settings=PiperHttpTTSSettings(voice=...)`` instead.
settings: Runtime-updatable settings. When provided alongside deprecated
parameters, ``settings`` values take precedence.
**kwargs: Additional arguments passed to the parent TTSService.
"""
if voice_id is not None:
_warn_deprecated_param("voice_id", "PiperHttpTTSSettings", "voice")
default_settings = PiperHttpTTSSettings(model=None, voice=voice_id, language=None)
if settings is not None:
default_settings.apply_update(settings)
super().__init__(
settings=PiperHttpTTSSettings(model=None, voice=voice_id, language=None),
settings=default_settings,
**kwargs,
)

View File

@@ -6,9 +6,13 @@
"""Qwen LLM service implementation using OpenAI-compatible interface."""
from typing import Optional
from loguru import logger
from pipecat.services.openai.base_llm import OpenAILLMSettings
from pipecat.services.openai.llm import OpenAILLMService
from pipecat.services.settings import _warn_deprecated_param
class QwenLLMService(OpenAILLMService):
@@ -23,7 +27,8 @@ class QwenLLMService(OpenAILLMService):
*,
api_key: str,
base_url: str = "https://dashscope-intl.aliyuncs.com/compatible-mode/v1",
model: str = "qwen-plus",
model: Optional[str] = None,
settings: Optional[OpenAILLMSettings] = None,
**kwargs,
):
"""Initialize the Qwen LLM service.
@@ -32,10 +37,23 @@ class QwenLLMService(OpenAILLMService):
api_key: The API key for accessing Qwen's API (DashScope API key).
base_url: Base URL for Qwen API. Defaults to "https://dashscope-intl.aliyuncs.com/compatible-mode/v1".
model: The model identifier to use. Defaults to "qwen-plus".
.. deprecated:: 1.0
Use ``settings=OpenAILLMSettings(model=...)`` instead.
settings: Runtime-updatable settings. When provided alongside deprecated
parameters, ``settings`` values take precedence.
**kwargs: Additional keyword arguments passed to OpenAILLMService.
"""
super().__init__(api_key=api_key, base_url=base_url, model=model, **kwargs)
logger.info(f"Initialized Qwen LLM service with model: {model}")
if model is not None:
_warn_deprecated_param("model", "OpenAILLMSettings", "model")
default_settings = OpenAILLMSettings(model=model or "qwen-plus")
if settings is not None:
default_settings.apply_update(settings)
super().__init__(api_key=api_key, base_url=base_url, settings=default_settings, **kwargs)
logger.info(f"Initialized Qwen LLM service with model: {self._settings.model}")
def create_client(self, api_key=None, base_url=None, **kwargs):
"""Create OpenAI-compatible client for Qwen API endpoint.

View File

@@ -23,7 +23,7 @@ from pipecat.frames.frames import (
TTSStartedFrame,
TTSStoppedFrame,
)
from pipecat.services.settings import NOT_GIVEN, TTSSettings, _NotGiven
from pipecat.services.settings import NOT_GIVEN, TTSSettings, _NotGiven, _warn_deprecated_param
from pipecat.services.tts_service import AudioContextTTSService
from pipecat.utils.tracing.service_decorators import traced_tts
@@ -70,11 +70,12 @@ class ResembleAITTSService(AudioContextTTSService):
self,
*,
api_key: str,
voice_id: str,
voice_id: Optional[str] = None,
url: str = "wss://websocket.cluster.resemble.ai/stream",
precision: Optional[str] = "PCM_16",
output_format: Optional[str] = "wav",
sample_rate: Optional[int] = 22050,
settings: Optional[ResembleAITTSSettings] = None,
**kwargs,
):
"""Initialize the Resemble AI TTS service.
@@ -82,24 +83,37 @@ class ResembleAITTSService(AudioContextTTSService):
Args:
api_key: Resemble AI API key for authentication.
voice_id: Voice UUID to use for synthesis.
.. deprecated:: 1.0
Use ``settings=ResembleAITTSSettings(voice=...)`` instead.
url: WebSocket URL for Resemble AI TTS API.
precision: PCM bit depth (PCM_32, PCM_24, PCM_16, or MULAW).
output_format: Audio format (wav or mp3).
sample_rate: Audio sample rate (8000, 16000, 22050, 32000, or 44100). Defaults to 22050.
settings: Runtime-updatable settings. When provided alongside deprecated
parameters, ``settings`` values take precedence.
**kwargs: Additional arguments passed to the parent service.
"""
if voice_id is not None:
_warn_deprecated_param("voice_id", "ResembleAITTSSettings", "voice")
default_settings = ResembleAITTSSettings(
model=None,
voice=voice_id,
language=None,
precision=precision,
output_format=output_format,
resemble_sample_rate=sample_rate,
)
if settings is not None:
default_settings.apply_update(settings)
super().__init__(
sample_rate=sample_rate,
reuse_context_id_within_turn=False,
supports_word_timestamps=True,
settings=ResembleAITTSSettings(
model=None,
voice=voice_id,
language=None,
precision=precision,
output_format=output_format,
resemble_sample_rate=sample_rate,
),
settings=default_settings,
**kwargs,
)

View File

@@ -31,7 +31,7 @@ from pipecat.frames.frames import (
TTSStoppedFrame,
)
from pipecat.processors.frame_processor import FrameDirection
from pipecat.services.settings import NOT_GIVEN, TTSSettings, _NotGiven
from pipecat.services.settings import NOT_GIVEN, TTSSettings, _NotGiven, _warn_deprecated_param
from pipecat.services.tts_service import (
AudioContextTTSService,
InterruptibleTTSService,
@@ -144,6 +144,9 @@ class RimeTTSService(AudioContextTTSService):
class InputParams(BaseModel):
"""Configuration parameters for Rime TTS service.
.. deprecated:: 1.0
Use ``settings=RimeTTSSettings(...)`` instead.
Parameters:
language: Language for synthesis. Defaults to English.
segment: Text segmentation mode ("immediate", "bySentence", "never").
@@ -176,11 +179,12 @@ class RimeTTSService(AudioContextTTSService):
self,
*,
api_key: str,
voice_id: str,
voice_id: Optional[str] = None,
url: str = "wss://users-ws.rime.ai/ws3",
model: str = "arcana",
model: Optional[str] = None,
sample_rate: Optional[int] = None,
params: Optional[InputParams] = None,
settings: Optional[RimeTTSSettings] = None,
text_aggregator: Optional[BaseTextAggregator] = None,
text_aggregation_mode: Optional[TextAggregationMode] = None,
aggregate_sentences: Optional[bool] = None,
@@ -191,10 +195,24 @@ class RimeTTSService(AudioContextTTSService):
Args:
api_key: Rime API key for authentication.
voice_id: ID of the voice to use.
.. deprecated:: 1.0
Use ``settings=RimeTTSSettings(voice=...)`` instead.
url: Rime websocket API endpoint.
model: Model ID to use for synthesis.
.. deprecated:: 1.0
Use ``settings=RimeTTSSettings(model=...)`` instead.
sample_rate: Audio sample rate in Hz.
params: Additional configuration parameters.
.. deprecated:: 1.0
Use ``settings=RimeTTSSettings(...)`` instead.
settings: Runtime-updatable settings. When provided alongside deprecated
parameters, ``settings`` values take precedence.
text_aggregator: Custom text aggregator for processing input text.
.. deprecated:: 0.0.95
@@ -208,8 +226,40 @@ class RimeTTSService(AudioContextTTSService):
**kwargs: Additional arguments passed to parent class.
"""
if voice_id is not None:
_warn_deprecated_param("voice_id", "RimeTTSSettings", "voice")
if model is not None:
_warn_deprecated_param("model", "RimeTTSSettings", "model")
if params is not None:
_warn_deprecated_param("params", "RimeTTSSettings")
# Initialize with parent class settings for proper frame handling
params = params or RimeTTSService.InputParams()
_params = params or RimeTTSService.InputParams()
default_settings = RimeTTSSettings(
model=model or "arcana",
voice=voice_id,
audioFormat="pcm",
samplingRate=0, # updated in start()
language=self.language_to_service_language(_params.language)
if _params.language
else None,
segment=_params.segment,
inlineSpeedAlpha=None, # Not applicable here
speedAlpha=_params.speed_alpha,
# Arcana params
repetition_penalty=_params.repetition_penalty,
temperature=_params.temperature,
top_p=_params.top_p,
# Mistv2 params
reduceLatency=_params.reduce_latency,
pauseBetweenBrackets=_params.pause_between_brackets,
phonemizeBetweenBrackets=_params.phonemize_between_brackets,
noTextNormalization=_params.no_text_normalization,
saveOovs=_params.save_oovs,
)
if settings is not None:
default_settings.apply_update(settings)
super().__init__(
text_aggregation_mode=text_aggregation_mode,
@@ -220,28 +270,7 @@ class RimeTTSService(AudioContextTTSService):
supports_word_timestamps=True,
append_trailing_space=True,
sample_rate=sample_rate,
settings=RimeTTSSettings(
model=model,
voice=voice_id,
audioFormat="pcm",
samplingRate=0, # updated in start()
language=self.language_to_service_language(params.language)
if params.language
else None,
segment=params.segment,
inlineSpeedAlpha=None, # Not applicable here
speedAlpha=params.speed_alpha,
# Arcana params
repetition_penalty=params.repetition_penalty,
temperature=params.temperature,
top_p=params.top_p,
# Mistv2 params
reduceLatency=params.reduce_latency,
pauseBetweenBrackets=params.pause_between_brackets,
phonemizeBetweenBrackets=params.phonemize_between_brackets,
noTextNormalization=params.no_text_normalization,
saveOovs=params.save_oovs,
),
settings=default_settings,
**kwargs,
)
@@ -628,6 +657,9 @@ class RimeHttpTTSService(TTSService):
class InputParams(BaseModel):
"""Configuration parameters for Rime HTTP TTS service.
.. deprecated:: 1.0
Use ``settings=RimeTTSSettings(...)`` instead.
Parameters:
language: Language for synthesis. Defaults to English.
pause_between_brackets: Whether to add pauses between bracketed content.
@@ -648,11 +680,12 @@ class RimeHttpTTSService(TTSService):
self,
*,
api_key: str,
voice_id: str,
voice_id: Optional[str] = None,
aiohttp_session: aiohttp.ClientSession,
model: str = "mistv2",
model: Optional[str] = None,
sample_rate: Optional[int] = None,
params: Optional[InputParams] = None,
settings: Optional[RimeTTSSettings] = None,
**kwargs,
):
"""Initialize Rime HTTP TTS service.
@@ -660,36 +693,61 @@ class RimeHttpTTSService(TTSService):
Args:
api_key: Rime API key for authentication.
voice_id: ID of the voice to use.
.. deprecated:: 1.0
Use ``settings=RimeTTSSettings(voice=...)`` instead.
aiohttp_session: Shared aiohttp session for HTTP requests.
model: Model ID to use for synthesis.
.. deprecated:: 1.0
Use ``settings=RimeTTSSettings(model=...)`` instead.
sample_rate: Audio sample rate in Hz.
params: Additional configuration parameters.
.. deprecated:: 1.0
Use ``settings=RimeTTSSettings(...)`` instead.
settings: Runtime-updatable settings. When provided alongside deprecated
parameters, ``settings`` values take precedence.
**kwargs: Additional arguments passed to parent TTSService.
"""
params = params or RimeHttpTTSService.InputParams()
if voice_id is not None:
_warn_deprecated_param("voice_id", "RimeTTSSettings", "voice")
if model is not None:
_warn_deprecated_param("model", "RimeTTSSettings", "model")
if params is not None:
_warn_deprecated_param("params", "RimeTTSSettings")
_params = params or RimeHttpTTSService.InputParams()
default_settings = RimeTTSSettings(
model=model or "mistv2",
language=self.language_to_service_language(_params.language)
if _params.language
else "eng",
audioFormat="pcm",
samplingRate=0,
segment=None,
speedAlpha=_params.speed_alpha,
reduceLatency=_params.reduce_latency,
pauseBetweenBrackets=_params.pause_between_brackets,
phonemizeBetweenBrackets=_params.phonemize_between_brackets,
noTextNormalization=None,
saveOovs=None,
inlineSpeedAlpha=_params.inline_speed_alpha if _params.inline_speed_alpha else None,
repetition_penalty=None,
temperature=None,
top_p=None,
voice=voice_id,
)
if settings is not None:
default_settings.apply_update(settings)
super().__init__(
sample_rate=sample_rate,
settings=RimeTTSSettings(
model=model,
language=self.language_to_service_language(params.language)
if params.language
else "eng",
audioFormat="pcm",
samplingRate=0,
segment=None,
speedAlpha=params.speed_alpha,
reduceLatency=params.reduce_latency,
pauseBetweenBrackets=params.pause_between_brackets,
phonemizeBetweenBrackets=params.phonemize_between_brackets,
noTextNormalization=None,
saveOovs=None,
inlineSpeedAlpha=params.inline_speed_alpha if params.inline_speed_alpha else None,
repetition_penalty=None,
temperature=None,
top_p=None,
voice=voice_id,
),
settings=default_settings,
**kwargs,
)
@@ -810,6 +868,9 @@ class RimeNonJsonTTSService(InterruptibleTTSService):
class InputParams(BaseModel):
"""Configuration parameters for Rime Non-JSON WebSocket TTS service.
.. deprecated:: 1.0
Use ``settings=RimeNonJsonTTSSettings(...)`` instead.
Args:
language: Language for synthesis. Defaults to English.
segment: Text segmentation mode ("immediate", "bySentence", "never").
@@ -830,12 +891,13 @@ class RimeNonJsonTTSService(InterruptibleTTSService):
self,
*,
api_key: str,
voice_id: str,
voice_id: Optional[str] = None,
url: str = "wss://users.rime.ai/ws",
model: str = "arcana",
model: Optional[str] = None,
audio_format: str = "pcm",
sample_rate: Optional[int] = None,
params: Optional[InputParams] = None,
settings: Optional[RimeNonJsonTTSSettings] = None,
aggregate_sentences: Optional[bool] = None,
text_aggregation_mode: Optional[TextAggregationMode] = None,
**kwargs,
@@ -845,11 +907,25 @@ class RimeNonJsonTTSService(InterruptibleTTSService):
Args:
api_key: Rime API key for authentication.
voice_id: ID of the voice to use.
.. deprecated:: 1.0
Use ``settings=RimeNonJsonTTSSettings(voice=...)`` instead.
url: Rime websocket API endpoint.
model: Model ID to use for synthesis.
.. deprecated:: 1.0
Use ``settings=RimeNonJsonTTSSettings(model=...)`` instead.
audio_format: Audio format to use.
sample_rate: Audio sample rate in Hz.
params: Additional configuration parameters.
.. deprecated:: 1.0
Use ``settings=RimeNonJsonTTSSettings(...)`` instead.
settings: Runtime-updatable settings. When provided alongside deprecated
parameters, ``settings`` values take precedence.
aggregate_sentences: Deprecated. Use text_aggregation_mode instead.
.. deprecated:: 0.0.104
@@ -860,7 +936,31 @@ class RimeNonJsonTTSService(InterruptibleTTSService):
text_aggregation_mode: How to aggregate text before synthesis.
**kwargs: Additional arguments passed to parent class.
"""
params = params or RimeNonJsonTTSService.InputParams()
if voice_id is not None:
_warn_deprecated_param("voice_id", "RimeNonJsonTTSSettings", "voice")
if model is not None:
_warn_deprecated_param("model", "RimeNonJsonTTSSettings", "model")
if params is not None:
_warn_deprecated_param("params", "RimeNonJsonTTSSettings")
_params = params or RimeNonJsonTTSService.InputParams()
default_settings = RimeNonJsonTTSSettings(
voice=voice_id,
model=model or "arcana",
audioFormat=audio_format,
samplingRate=sample_rate,
language=self.language_to_service_language(_params.language)
if _params.language
else None,
segment=_params.segment,
repetition_penalty=_params.repetition_penalty,
temperature=_params.temperature,
top_p=_params.top_p,
)
if settings is not None:
default_settings.apply_update(settings)
super().__init__(
sample_rate=sample_rate,
aggregate_sentences=aggregate_sentences,
@@ -868,26 +968,14 @@ class RimeNonJsonTTSService(InterruptibleTTSService):
push_stop_frames=True,
pause_frame_processing=True,
append_trailing_space=True,
settings=RimeNonJsonTTSSettings(
voice=voice_id,
model=model,
audioFormat=audio_format,
samplingRate=sample_rate,
language=self.language_to_service_language(params.language)
if params.language
else None,
segment=params.segment,
repetition_penalty=params.repetition_penalty,
temperature=params.temperature,
top_p=params.top_p,
),
settings=default_settings,
**kwargs,
)
self._api_key = api_key
self._url = url
# Add any extra parameters for future compatibility
if params.extra:
self._settings.extra.update(params.extra)
if _params.extra:
self._settings.extra.update(_params.extra)
self._receive_task = None
self._context_id: Optional[str] = None

View File

@@ -21,7 +21,9 @@ from pipecat.metrics.metrics import LLMTokenUsage
from pipecat.processors.aggregators.llm_context import LLMContext
from pipecat.processors.aggregators.openai_llm_context import OpenAILLMContext
from pipecat.services.llm_service import FunctionCallFromLLM
from pipecat.services.openai.base_llm import OpenAILLMSettings
from pipecat.services.openai.llm import OpenAILLMService
from pipecat.services.settings import _warn_deprecated_param
from pipecat.utils.tracing.service_decorators import traced_llm
@@ -36,8 +38,9 @@ class SambaNovaLLMService(OpenAILLMService): # type: ignore
self,
*,
api_key: str,
model: str = "Llama-4-Maverick-17B-128E-Instruct",
model: Optional[str] = None,
base_url: str = "https://api.sambanova.ai/v1",
settings: Optional[OpenAILLMSettings] = None,
**kwargs: Dict[Any, Any],
) -> None:
"""Initialize SambaNova LLM service.
@@ -45,10 +48,23 @@ class SambaNovaLLMService(OpenAILLMService): # type: ignore
Args:
api_key: The API key for accessing SambaNova API.
model: The model identifier to use. Defaults to "Llama-4-Maverick-17B-128E-Instruct".
.. deprecated:: 1.0
Use ``settings=OpenAILLMSettings(model=...)`` instead.
base_url: The base URL for SambaNova API. Defaults to "https://api.sambanova.ai/v1".
settings: Runtime-updatable settings. When provided alongside deprecated
parameters, ``settings`` values take precedence.
**kwargs: Additional keyword arguments passed to OpenAILLMService.
"""
super().__init__(api_key=api_key, base_url=base_url, model=model, **kwargs)
if model is not None:
_warn_deprecated_param("model", "OpenAILLMSettings", "model")
default_settings = OpenAILLMSettings(model=model or "Llama-4-Maverick-17B-128E-Instruct")
if settings is not None:
default_settings.apply_update(settings)
super().__init__(api_key=api_key, base_url=base_url, settings=default_settings, **kwargs)
def create_client(
self,

View File

@@ -10,8 +10,13 @@ from typing import Any, Optional
from loguru import logger
from pipecat.services.settings import _warn_deprecated_param
from pipecat.services.stt_latency import SAMBANOVA_TTFS_P99
from pipecat.services.whisper.base_stt import BaseWhisperSTTService, Transcription
from pipecat.services.whisper.base_stt import (
BaseWhisperSTTService,
BaseWhisperSTTSettings,
Transcription,
)
from pipecat.transcriptions.language import Language
@@ -25,35 +30,75 @@ class SambaNovaSTTService(BaseWhisperSTTService): # type: ignore
def __init__(
self,
*,
model: str = "Whisper-Large-v3",
model: Optional[str] = None,
api_key: Optional[str] = None,
base_url: str = "https://api.sambanova.ai/v1",
language: Optional[Language] = Language.EN,
language: Optional[Language] = None,
prompt: Optional[str] = None,
temperature: Optional[float] = None,
settings: Optional[BaseWhisperSTTSettings] = None,
ttfs_p99_latency: Optional[float] = SAMBANOVA_TTFS_P99,
**kwargs: Any,
) -> None:
"""Initialize SambaNova STT service.
Args:
model: Whisper model to use. Defaults to "Whisper-Large-v3".
model: Whisper model to use.
.. deprecated:: 1.0
Use ``settings=BaseWhisperSTTSettings(model=...)`` instead.
api_key: SambaNova API key. Defaults to None.
base_url: API base URL. Defaults to "https://api.sambanova.ai/v1".
language: Language of the audio input. Defaults to English.
language: Language of the audio input.
.. deprecated:: 1.0
Use ``settings=BaseWhisperSTTSettings(language=...)`` instead.
prompt: Optional text to guide the model's style or continue a previous segment.
temperature: Optional sampling temperature between 0 and 1. Defaults to 0.0.
.. deprecated:: 1.0
Use ``settings=BaseWhisperSTTSettings(prompt=...)`` instead.
temperature: Optional sampling temperature between 0 and 1.
.. deprecated:: 1.0
Use ``settings=BaseWhisperSTTSettings(temperature=...)`` instead.
settings: Runtime-updatable settings. When provided alongside deprecated
parameters, ``settings`` values take precedence.
ttfs_p99_latency: P99 latency from speech end to final transcript in seconds.
Override for your deployment. See https://github.com/pipecat-ai/stt-benchmark
**kwargs: Additional arguments passed to `pipecat.services.whisper.base_stt.BaseWhisperSTTService`.
"""
super().__init__(
if model is not None:
_warn_deprecated_param("model", "BaseWhisperSTTSettings", "model")
if language is not None:
_warn_deprecated_param("language", "BaseWhisperSTTSettings", "language")
if prompt is not None:
_warn_deprecated_param("prompt", "BaseWhisperSTTSettings", "prompt")
if temperature is not None:
_warn_deprecated_param("temperature", "BaseWhisperSTTSettings", "temperature")
model = model or "Whisper-Large-v3"
language = language or Language.EN
# Build settings from deprecated params and pass via settings=
# to avoid double deprecation warnings in BaseWhisperSTTService.
default_settings = BaseWhisperSTTSettings(
model=model,
api_key=api_key,
language=self.language_to_service_language(language),
base_url=base_url,
language=language,
prompt=prompt,
temperature=temperature,
)
if settings is not None:
default_settings.apply_update(settings)
super().__init__(
api_key=api_key,
base_url=base_url,
settings=default_settings,
ttfs_p99_latency=ttfs_p99_latency,
**kwargs,
)

View File

@@ -32,7 +32,13 @@ from pipecat.frames.frames import (
)
from pipecat.processors.frame_processor import FrameDirection
from pipecat.services.sarvam._sdk import sdk_headers
from pipecat.services.settings import NOT_GIVEN, STTSettings, _NotGiven, is_given
from pipecat.services.settings import (
NOT_GIVEN,
STTSettings,
_NotGiven,
_warn_deprecated_param,
is_given,
)
from pipecat.services.stt_latency import SARVAM_TTFS_P99
from pipecat.services.stt_service import STTService
from pipecat.transcriptions.language import Language, resolve_language
@@ -171,6 +177,9 @@ class SarvamSTTService(STTService):
class InputParams(BaseModel):
"""Configuration parameters for Sarvam STT service.
.. deprecated:: 1.0
Use ``settings=SarvamSTTSettings(...)`` instead.
Parameters:
language: Target language for transcription.
- saarika:v2.5: Defaults to "unknown" (auto-detect supported)
@@ -194,10 +203,11 @@ class SarvamSTTService(STTService):
self,
*,
api_key: str,
model: str = "saarika:v2.5",
model: Optional[str] = None,
sample_rate: Optional[int] = None,
input_audio_codec: str = "wav",
params: Optional[InputParams] = None,
settings: Optional[SarvamSTTSettings] = None,
ttfs_p99_latency: Optional[float] = SARVAM_TTFS_P99,
keepalive_timeout: Optional[float] = None,
keepalive_interval: float = 5.0,
@@ -207,13 +217,20 @@ class SarvamSTTService(STTService):
Args:
api_key: Sarvam API key for authentication.
model: Sarvam model to use for transcription. Allowed values:
- "saarika:v2.5": Standard STT model
- "saaras:v2.5": STT-Translate model (auto-detects language, supports prompts)
- "saaras:v3": Advanced STT model (supports mode)
model: Sarvam model to use for transcription.
.. deprecated:: 1.0
Use ``settings=SarvamSTTSettings(model=...)`` instead.
sample_rate: Audio sample rate. Defaults to 16000 if not specified.
input_audio_codec: Audio codec/format of the input file. Defaults to "wav".
params: Configuration parameters for Sarvam STT service.
.. deprecated:: 1.0
Use ``settings=SarvamSTTSettings(...)`` instead.
settings: Runtime-updatable settings. When provided alongside deprecated
parameters, ``settings`` values take precedence.
ttfs_p99_latency: P99 latency from speech end to final transcript in seconds.
Override for your deployment. See https://github.com/pipecat-ai/stt-benchmark
keepalive_timeout: Seconds of no audio before sending silence to keep the
@@ -221,7 +238,13 @@ class SarvamSTTService(STTService):
keepalive_interval: Seconds between idle checks when keepalive is enabled.
**kwargs: Additional arguments passed to the parent STTService.
"""
params = params or SarvamSTTService.InputParams()
if model is not None:
_warn_deprecated_param("model", "SarvamSTTSettings", "model")
if params is not None:
_warn_deprecated_param("params", "SarvamSTTSettings")
model = model or "saarika:v2.5"
_params = params or SarvamSTTService.InputParams()
# Get model configuration (validates model exists)
if model not in MODEL_CONFIGS:
@@ -231,31 +254,35 @@ class SarvamSTTService(STTService):
self._config = MODEL_CONFIGS[model]
# Validate parameters against model capabilities
if params.prompt is not None and not self._config.supports_prompt:
if _params.prompt is not None and not self._config.supports_prompt:
raise ValueError(f"Model '{model}' does not support prompt parameter.")
if params.mode is not None and not self._config.supports_mode:
if _params.mode is not None and not self._config.supports_mode:
raise ValueError(f"Model '{model}' does not support mode parameter.")
if params.language is not None and not self._config.supports_language:
if _params.language is not None and not self._config.supports_language:
raise ValueError(
f"Model '{model}' does not support language parameter (auto-detects language)."
)
# Resolve mode default from model config
mode = params.mode if params.mode is not None else self._config.default_mode
mode = _params.mode if _params.mode is not None else self._config.default_mode
default_settings = SarvamSTTSettings(
model=model,
language=_params.language,
prompt=_params.prompt,
mode=mode,
vad_signals=_params.vad_signals,
high_vad_sensitivity=_params.high_vad_sensitivity,
)
if settings is not None:
default_settings.apply_update(settings)
super().__init__(
sample_rate=sample_rate,
ttfs_p99_latency=ttfs_p99_latency,
keepalive_timeout=keepalive_timeout,
keepalive_interval=keepalive_interval,
settings=SarvamSTTSettings(
model=model,
language=params.language,
prompt=params.prompt,
mode=mode,
vad_signals=params.vad_signals,
high_vad_sensitivity=params.high_vad_sensitivity,
),
settings=default_settings,
**kwargs,
)
@@ -274,7 +301,7 @@ class SarvamSTTService(STTService):
self._socket_client = None
self._receive_task = None
if params.vad_signals:
if _params.vad_signals:
self._register_event_handler("on_speech_started")
self._register_event_handler("on_speech_stopped")
self._register_event_handler("on_utterance_end")

View File

@@ -62,7 +62,7 @@ from pipecat.frames.frames import (
)
from pipecat.processors.frame_processor import FrameDirection
from pipecat.services.sarvam._sdk import sdk_headers
from pipecat.services.settings import NOT_GIVEN, TTSSettings, _NotGiven
from pipecat.services.settings import NOT_GIVEN, TTSSettings, _NotGiven, _warn_deprecated_param
from pipecat.services.tts_service import InterruptibleTTSService, TextAggregationMode, TTSService
from pipecat.transcriptions.language import Language, resolve_language
from pipecat.utils.tracing.service_decorators import traced_tts
@@ -376,6 +376,9 @@ class SarvamHttpTTSService(TTSService):
class InputParams(BaseModel):
"""Input parameters for Sarvam TTS configuration.
.. deprecated:: 1.0
Use ``SarvamHttpTTSSettings`` directly via the ``settings`` parameter instead.
Parameters:
language: Language for synthesis. Defaults to English (India).
pitch: Voice pitch adjustment (-0.75 to 0.75). Defaults to 0.0.
@@ -428,10 +431,11 @@ class SarvamHttpTTSService(TTSService):
api_key: str,
aiohttp_session: aiohttp.ClientSession,
voice_id: Optional[str] = None,
model: str = "bulbul:v2",
model: Optional[str] = None,
base_url: str = "https://api.sarvam.ai",
sample_rate: Optional[int] = None,
params: Optional[InputParams] = None,
settings: Optional[SarvamHttpTTSSettings] = None,
**kwargs,
):
"""Initialize the Sarvam TTS service.
@@ -440,15 +444,38 @@ class SarvamHttpTTSService(TTSService):
api_key: Sarvam AI API subscription key.
aiohttp_session: Shared aiohttp session for making requests.
voice_id: Speaker voice ID. If None, uses model-appropriate default.
.. deprecated:: 1.0
Use ``settings=SarvamHttpTTSSettings(voice=...)`` instead.
model: TTS model to use. Options:
- "bulbul:v2" (default): Standard model with pitch/loudness support
- "bulbul:v3-beta": Advanced model with temperature control
.. deprecated:: 1.0
Use ``settings=SarvamHttpTTSSettings(model=...)`` instead.
base_url: Sarvam AI API base URL. Defaults to "https://api.sarvam.ai".
sample_rate: Audio sample rate in Hz (8000, 16000, 22050, 24000).
If None, uses model-specific default.
params: Additional voice and preprocessing parameters. If None, uses defaults.
.. deprecated:: 1.0
Use ``settings=SarvamHttpTTSSettings(...)`` instead.
settings: Runtime-updatable settings. When provided alongside deprecated
parameters, ``settings`` values take precedence.
**kwargs: Additional arguments passed to parent TTSService.
"""
if voice_id is not None:
_warn_deprecated_param("voice_id", "SarvamHttpTTSSettings", "voice")
if model is not None:
_warn_deprecated_param("model", "SarvamHttpTTSSettings", "model")
if params is not None:
_warn_deprecated_param("params", "SarvamHttpTTSSettings")
model = model or "bulbul:v2"
# Get model configuration (validates model exists)
if model not in TTS_MODEL_CONFIGS:
allowed = ", ".join(sorted(TTS_MODEL_CONFIGS.keys()))
@@ -460,39 +487,39 @@ class SarvamHttpTTSService(TTSService):
if sample_rate is None:
sample_rate = self._config.default_sample_rate
params = params or SarvamHttpTTSService.InputParams()
_params = params or SarvamHttpTTSService.InputParams()
# Set default voice based on model if not specified
if voice_id is None:
voice_id = self._config.default_speaker
# Validate and clamp pace to model's valid range
pace = params.pace
pace = _params.pace
pace_min, pace_max = self._config.pace_range
if pace is not None and (pace < pace_min or pace > pace_max):
logger.warning(f"Pace {pace} is outside model range ({pace_min}-{pace_max}). Clamping.")
pace = max(pace_min, min(pace_max, pace))
default_settings = SarvamHttpTTSSettings(
language=(
self.language_to_service_language(_params.language) if _params.language else "en-IN"
),
enable_preprocessing=(
True if self._config.preprocessing_always_enabled else _params.enable_preprocessing
),
pace=pace,
pitch=None,
loudness=None,
temperature=None,
model=model,
voice=voice_id,
)
if settings is not None:
default_settings.apply_update(settings)
super().__init__(
sample_rate=sample_rate,
settings=SarvamHttpTTSSettings(
language=(
self.language_to_service_language(params.language)
if params.language
else "en-IN"
),
enable_preprocessing=(
True
if self._config.preprocessing_always_enabled
else params.enable_preprocessing
),
pace=pace,
pitch=None,
loudness=None,
temperature=None,
model=model,
voice=voice_id,
),
settings=default_settings,
**kwargs,
)
@@ -502,18 +529,18 @@ class SarvamHttpTTSService(TTSService):
# Add parameters based on model support
if self._config.supports_pitch:
self._settings.pitch = params.pitch
elif params.pitch != 0.0:
self._settings.pitch = _params.pitch
elif _params.pitch != 0.0:
logger.warning(f"pitch parameter is ignored for {model}")
if self._config.supports_loudness:
self._settings.loudness = params.loudness
elif params.loudness != 1.0:
self._settings.loudness = _params.loudness
elif _params.loudness != 1.0:
logger.warning(f"loudness parameter is ignored for {model}")
if self._config.supports_temperature:
self._settings.temperature = params.temperature
elif params.temperature != 0.6:
self._settings.temperature = _params.temperature
elif _params.temperature != 0.6:
logger.warning(f"temperature parameter is ignored for {model}")
def can_generate_metrics(self) -> bool:
@@ -697,6 +724,9 @@ class SarvamTTSService(InterruptibleTTSService):
class InputParams(BaseModel):
"""Configuration parameters for Sarvam TTS WebSocket service.
.. deprecated:: 1.0
Use ``SarvamTTSSettings`` directly via the ``settings`` parameter instead.
Parameters:
pitch: Voice pitch adjustment (-0.75 to 0.75). Defaults to 0.0.
**Note:** Only supported for bulbul:v2. Ignored for v3 models.
@@ -782,13 +812,14 @@ class SarvamTTSService(InterruptibleTTSService):
self,
*,
api_key: str,
model: str = "bulbul:v2",
model: Optional[str] = None,
voice_id: Optional[str] = None,
url: str = "wss://api.sarvam.ai/text-to-speech/ws",
aggregate_sentences: Optional[bool] = None,
text_aggregation_mode: Optional[TextAggregationMode] = None,
sample_rate: Optional[int] = None,
params: Optional[InputParams] = None,
settings: Optional[SarvamTTSSettings] = None,
**kwargs,
):
"""Initialize the Sarvam TTS service with voice and transport configuration.
@@ -798,7 +829,15 @@ class SarvamTTSService(InterruptibleTTSService):
model: TTS model to use. Options:
- "bulbul:v2" (default): Standard model with pitch/loudness support
- "bulbul:v3-beta": Advanced model with temperature control
.. deprecated:: 1.0
Use ``settings=SarvamTTSSettings(model=...)`` instead.
voice_id: Speaker voice ID. If None, uses model-appropriate default.
.. deprecated:: 1.0
Use ``settings=SarvamTTSSettings(voice=...)`` instead.
url: WebSocket URL for the TTS backend (default production URL).
aggregate_sentences: Deprecated. Use text_aggregation_mode instead.
@@ -809,10 +848,25 @@ class SarvamTTSService(InterruptibleTTSService):
sample_rate: Output audio sample rate in Hz (8000, 16000, 22050, 24000).
If None, uses model-specific default.
params: Optional input parameters to override defaults.
.. deprecated:: 1.0
Use ``settings=SarvamTTSSettings(...)`` instead.
settings: Runtime-updatable settings. When provided alongside deprecated
parameters, ``settings`` values take precedence.
**kwargs: Arguments forwarded to InterruptibleTTSService.
See https://docs.sarvam.ai/api-reference-docs/text-to-speech/stream
"""
if model is not None:
_warn_deprecated_param("model", "SarvamTTSSettings", "model")
if voice_id is not None:
_warn_deprecated_param("voice_id", "SarvamTTSSettings", "voice")
if params is not None:
_warn_deprecated_param("params", "SarvamTTSSettings")
model = model or "bulbul:v2"
# Get model configuration (validates model exists)
if model not in TTS_MODEL_CONFIGS:
allowed = ", ".join(sorted(TTS_MODEL_CONFIGS.keys()))
@@ -828,15 +882,37 @@ class SarvamTTSService(InterruptibleTTSService):
if voice_id is None:
voice_id = self._config.default_speaker
params = params or SarvamTTSService.InputParams()
_params = params or SarvamTTSService.InputParams()
# Validate and clamp pace to model's valid range
pace = params.pace
pace = _params.pace
pace_min, pace_max = self._config.pace_range
if pace is not None and (pace < pace_min or pace > pace_max):
logger.warning(f"Pace {pace} is outside model range ({pace_min}-{pace_max}). Clamping.")
pace = max(pace_min, min(pace_max, pace))
default_settings = SarvamTTSSettings(
language=(
self.language_to_service_language(_params.language) if _params.language else "en-IN"
),
speech_sample_rate=str(sample_rate),
enable_preprocessing=(
True if self._config.preprocessing_always_enabled else _params.enable_preprocessing
),
min_buffer_size=_params.min_buffer_size,
max_chunk_length=_params.max_chunk_length,
output_audio_codec=_params.output_audio_codec,
output_audio_bitrate=_params.output_audio_bitrate,
pace=pace,
pitch=None,
loudness=None,
temperature=None,
model=model,
voice=voice_id,
)
if settings is not None:
default_settings.apply_update(settings)
# Initialize parent class first
super().__init__(
aggregate_sentences=aggregate_sentences,
@@ -845,29 +921,7 @@ class SarvamTTSService(InterruptibleTTSService):
pause_frame_processing=True,
push_stop_frames=True,
sample_rate=sample_rate,
settings=SarvamTTSSettings(
language=(
self.language_to_service_language(params.language)
if params.language
else "en-IN"
),
speech_sample_rate=str(sample_rate),
enable_preprocessing=(
True
if self._config.preprocessing_always_enabled
else params.enable_preprocessing
),
min_buffer_size=params.min_buffer_size,
max_chunk_length=params.max_chunk_length,
output_audio_codec=params.output_audio_codec,
output_audio_bitrate=params.output_audio_bitrate,
pace=pace,
pitch=None,
loudness=None,
temperature=None,
model=model,
voice=voice_id,
),
settings=default_settings,
**kwargs,
)
@@ -877,18 +931,18 @@ class SarvamTTSService(InterruptibleTTSService):
# Add parameters based on model support
if self._config.supports_pitch:
self._settings.pitch = params.pitch
elif params.pitch != 0.0:
self._settings.pitch = _params.pitch
elif _params.pitch != 0.0:
logger.warning(f"pitch parameter is ignored for {model}")
if self._config.supports_loudness:
self._settings.loudness = params.loudness
elif params.loudness != 1.0:
self._settings.loudness = _params.loudness
elif _params.loudness != 1.0:
logger.warning(f"loudness parameter is ignored for {model}")
if self._config.supports_temperature:
self._settings.temperature = params.temperature
elif params.temperature != 0.6:
self._settings.temperature = _params.temperature
elif _params.temperature != 0.6:
logger.warning(f"temperature parameter is ignored for {model}")
self._receive_task = None

View File

@@ -37,6 +37,7 @@ Key helpers:
from __future__ import annotations
import copy
import warnings
from dataclasses import dataclass, field, fields
from typing import TYPE_CHECKING, Any, ClassVar, Dict, Mapping, Optional, Type, TypeVar
@@ -47,6 +48,45 @@ from pipecat.transcriptions.language import Language
if TYPE_CHECKING:
from pipecat.turns.user_turn_completion_mixin import UserTurnCompletionConfig
# ---------------------------------------------------------------------------
# Deprecation helper
# ---------------------------------------------------------------------------
def _warn_deprecated_param(
param_name: str,
settings_class_name: str,
settings_field: str | None = None,
stacklevel: int = 3,
):
"""Emit DeprecationWarning for a deprecated init parameter.
Args:
param_name: Name of the deprecated parameter.
settings_class_name: Name of the settings class to use instead.
settings_field: Specific field on the settings class, if different
from *param_name*.
stacklevel: Stack depth for the warning. Default ``3`` targets
the caller's caller (i.e. user code that instantiated the service).
"""
if settings_field:
msg = (
f"The `{param_name}` parameter is deprecated. "
f"Use `settings={settings_class_name}({settings_field}=...)` instead. "
f"If both are provided, `settings` takes precedence."
)
else:
msg = (
f"The `{param_name}` parameter is deprecated. "
f"Use `settings={settings_class_name}(...)` instead. "
f"If both are provided, `settings` takes precedence."
)
with warnings.catch_warnings():
warnings.simplefilter("always")
warnings.warn(msg, DeprecationWarning, stacklevel=stacklevel)
# ---------------------------------------------------------------------------
# NOT_GIVEN sentinel
# ---------------------------------------------------------------------------

View File

@@ -24,7 +24,7 @@ from pipecat.frames.frames import (
VADUserStoppedSpeakingFrame,
)
from pipecat.processors.frame_processor import FrameDirection
from pipecat.services.settings import NOT_GIVEN, STTSettings, _NotGiven
from pipecat.services.settings import NOT_GIVEN, STTSettings, _NotGiven, _warn_deprecated_param
from pipecat.services.stt_latency import SONIOX_TTFS_P99
from pipecat.services.stt_service import WebsocketSTTService
from pipecat.transcriptions.language import Language
@@ -79,6 +79,9 @@ class SonioxContextObject(BaseModel):
class SonioxInputParams(BaseModel):
"""Real-time transcription settings.
.. deprecated:: 1.0
Use ``settings=SonioxSTTSettings(...)`` instead.
See Soniox WebSocket API documentation for more details:
https://soniox.com/docs/speech-to-text/api-reference/websocket-api#configuration-parameters
@@ -183,8 +186,10 @@ class SonioxSTTService(WebsocketSTTService):
api_key: str,
url: str = "wss://stt-rt.soniox.com/transcribe-websocket",
sample_rate: Optional[int] = None,
model: Optional[str] = None,
params: Optional[SonioxInputParams] = None,
vad_force_turn_endpoint: bool = True,
settings: Optional[SonioxSTTSettings] = None,
ttfs_p99_latency: Optional[float] = SONIOX_TTFS_P99,
**kwargs,
):
@@ -194,33 +199,53 @@ class SonioxSTTService(WebsocketSTTService):
api_key: Soniox API key.
url: Soniox WebSocket API URL.
sample_rate: Audio sample rate.
model: Soniox model to use for transcription.
.. deprecated:: 1.0
Use ``settings=SonioxSTTSettings(model=...)`` instead.
params: Additional configuration parameters, such as language hints, context and
speaker diarization.
.. deprecated:: 1.0
Use ``settings=SonioxSTTSettings(...)`` instead.
vad_force_turn_endpoint: Listen to `VADUserStoppedSpeakingFrame` to send finalize message to Soniox.
If disabled, Soniox will detect the end of the speech. Defaults to True.
settings: Runtime-updatable settings. When provided alongside deprecated
parameters, ``settings`` values take precedence.
ttfs_p99_latency: P99 latency from speech end to final transcript in seconds.
Override for your deployment. See https://github.com/pipecat-ai/stt-benchmark
**kwargs: Additional arguments passed to the STTService.
"""
params = params or SonioxInputParams()
if model is not None:
_warn_deprecated_param("model", "SonioxSTTSettings", "model")
if params is not None:
_warn_deprecated_param("params", "SonioxSTTSettings")
_params = params or SonioxInputParams()
default_settings = SonioxSTTSettings(
model=model or _params.model,
language=None,
audio_format=_params.audio_format,
num_channels=_params.num_channels,
language_hints=_params.language_hints,
language_hints_strict=_params.language_hints_strict,
context=_params.context,
enable_speaker_diarization=_params.enable_speaker_diarization,
enable_language_identification=_params.enable_language_identification,
client_reference_id=_params.client_reference_id,
)
if settings is not None:
default_settings.apply_update(settings)
super().__init__(
sample_rate=sample_rate,
ttfs_p99_latency=ttfs_p99_latency,
keepalive_timeout=1,
keepalive_interval=5,
settings=SonioxSTTSettings(
model=params.model,
language=None,
audio_format=params.audio_format,
num_channels=params.num_channels,
language_hints=params.language_hints,
language_hints_strict=params.language_hints_strict,
context=params.context,
enable_speaker_diarization=params.enable_speaker_diarization,
enable_language_identification=params.enable_language_identification,
client_reference_id=params.client_reference_id,
),
settings=default_settings,
**kwargs,
)

View File

@@ -33,7 +33,7 @@ from pipecat.frames.frames import (
VADUserStoppedSpeakingFrame,
)
from pipecat.processors.frame_processor import FrameDirection
from pipecat.services.settings import NOT_GIVEN, STTSettings, _NotGiven
from pipecat.services.settings import NOT_GIVEN, STTSettings, _NotGiven, _warn_deprecated_param
from pipecat.services.stt_latency import SPEECHMATICS_TTFS_P99
from pipecat.services.stt_service import STTService
from pipecat.transcriptions.language import Language, resolve_language
@@ -381,6 +381,7 @@ class SpeechmaticsSTTService(STTService):
sample_rate: int | None = None,
params: InputParams | None = None,
should_interrupt: bool = True,
settings: SpeechmaticsSTTSettings | None = None,
ttfs_p99_latency: float | None = SPEECHMATICS_TTFS_P99,
**kwargs,
):
@@ -392,8 +393,14 @@ class SpeechmaticsSTTService(STTService):
base_url: Base URL for Speechmatics API. Uses environment variable `SPEECHMATICS_RT_URL`
or defaults to `wss://eu2.rt.speechmatics.com/v2`.
sample_rate: Optional audio sample rate in Hz.
params: Optional[InputParams]: Input parameters for the service.
params: Input parameters for the service.
.. deprecated:: 1.0
Use ``settings=SpeechmaticsSTTSettings(...)`` instead.
should_interrupt: Determine whether the bot should be interrupted when Speechmatics turn_detection_mode is configured to detect user speech.
settings: Runtime-updatable settings. When provided alongside deprecated
``params``, ``settings`` values take precedence.
ttfs_p99_latency: P99 latency from speech end to final transcript in seconds.
Override for your deployment. See https://github.com/pipecat-ai/stt-benchmark
**kwargs: Additional arguments passed to STTService.
@@ -410,6 +417,9 @@ class SpeechmaticsSTTService(STTService):
if not self._base_url:
raise ValueError("Missing Speechmatics base URL")
if params is not None:
_warn_deprecated_param("params", "SpeechmaticsSTTSettings")
# Default params
params = params or SpeechmaticsSTTService.InputParams()
self._should_interrupt = should_interrupt
@@ -426,7 +436,7 @@ class SpeechmaticsSTTService(STTService):
speaker_passive_format = params.speaker_passive_format or speaker_active_format
# Settings — seeded from InputParams
settings = SpeechmaticsSTTSettings(
default_settings = SpeechmaticsSTTSettings(
model=None, # Will be resolved from operating_point after config is built
language=params.language,
domain=params.domain,
@@ -455,13 +465,16 @@ class SpeechmaticsSTTService(STTService):
# Build SDK config from settings, then resolve model from operating_point
self._client: VoiceAgentClient | None = None
self._config: VoiceAgentConfig = self._build_config(settings)
settings.model = self._config.operating_point.value
self._config: VoiceAgentConfig = self._build_config(default_settings)
default_settings.model = self._config.operating_point.value
if settings is not None:
default_settings.apply_update(settings)
super().__init__(
sample_rate=sample_rate,
ttfs_p99_latency=ttfs_p99_latency,
settings=settings,
settings=default_settings,
**kwargs,
)

View File

@@ -22,7 +22,7 @@ from pipecat.frames.frames import (
TTSStartedFrame,
TTSStoppedFrame,
)
from pipecat.services.settings import NOT_GIVEN, TTSSettings, _NotGiven
from pipecat.services.settings import NOT_GIVEN, TTSSettings, _NotGiven, _warn_deprecated_param
from pipecat.services.tts_service import TTSService
from pipecat.utils.network import exponential_backoff_time
from pipecat.utils.tracing.service_decorators import traced_tts
@@ -62,6 +62,9 @@ class SpeechmaticsTTSService(TTSService):
class InputParams(BaseModel):
"""Optional input parameters for Speechmatics TTS configuration.
.. deprecated:: 1.0
Use ``settings=SpeechmaticsTTSSettings(...)`` instead.
Parameters:
max_retries: Maximum number of retries for TTS requests. Defaults to 5.
"""
@@ -73,10 +76,11 @@ class SpeechmaticsTTSService(TTSService):
*,
api_key: str,
base_url: str = "https://preview.tts.speechmatics.com",
voice_id: str = "sarah",
voice_id: Optional[str] = None,
aiohttp_session: aiohttp.ClientSession,
sample_rate: Optional[int] = SPEECHMATICS_SAMPLE_RATE,
params: Optional[InputParams] = None,
settings: Optional[SpeechmaticsTTSSettings] = None,
**kwargs,
):
"""Initialize the Speechmatics TTS service.
@@ -85,26 +89,45 @@ class SpeechmaticsTTSService(TTSService):
api_key: Speechmatics API key for authentication.
base_url: Base URL for Speechmatics TTS API.
voice_id: Voice model to use for synthesis.
.. deprecated:: 1.0
Use ``settings=SpeechmaticsTTSSettings(voice=...)`` instead.
aiohttp_session: Shared aiohttp session for HTTP requests.
sample_rate: Audio sample rate in Hz.
params: Optional[InputParams]: Input parameters for the service.
params: Input parameters for the service.
.. deprecated:: 1.0
Use ``settings=SpeechmaticsTTSSettings(...)`` instead.
settings: Runtime-updatable settings. When provided alongside deprecated
parameters, ``settings`` values take precedence.
**kwargs: Additional arguments passed to TTSService.
"""
if voice_id is not None:
_warn_deprecated_param("voice_id", "SpeechmaticsTTSSettings", "voice")
if params is not None:
_warn_deprecated_param("params", "SpeechmaticsTTSSettings")
if sample_rate and sample_rate != self.SPEECHMATICS_SAMPLE_RATE:
logger.warning(
f"Speechmatics TTS only supports {self.SPEECHMATICS_SAMPLE_RATE}Hz sample rate. "
f"Current rate of {sample_rate}Hz may cause issues."
)
params = params or SpeechmaticsTTSService.InputParams()
_params = params or SpeechmaticsTTSService.InputParams()
default_settings = SpeechmaticsTTSSettings(
model=None,
voice=voice_id or "sarah",
language=None,
max_retries=_params.max_retries,
)
if settings is not None:
default_settings.apply_update(settings)
super().__init__(
sample_rate=sample_rate,
settings=SpeechmaticsTTSSettings(
model=None,
voice=voice_id,
language=None,
max_retries=params.max_retries,
),
settings=default_settings,
**kwargs,
)

View File

@@ -34,6 +34,7 @@ from pipecat.frames.frames import (
)
from pipecat.processors.frame_processor import FrameDirection, FrameProcessorSetup
from pipecat.services.ai_service import AIService
from pipecat.services.settings import ServiceSettings
from pipecat.transports.tavus.transport import TavusCallbacks, TavusParams, TavusTransportClient
@@ -57,6 +58,7 @@ class TavusVideoService(AIService):
replica_id: str,
persona_id: str = "pipecat-stream",
session: aiohttp.ClientSession,
settings: Optional[ServiceSettings] = None,
**kwargs,
) -> None:
"""Initialize the Tavus video service.
@@ -66,9 +68,15 @@ class TavusVideoService(AIService):
replica_id: ID of the Tavus voice replica to use for speech synthesis.
persona_id: ID of the Tavus persona. Defaults to "pipecat-stream" for Pipecat TTS voice.
session: Async HTTP session used for communication with Tavus.
settings: Runtime-updatable settings. Tavus has no model concept, so this
is primarily used for the ``extra`` dict.
**kwargs: Additional arguments passed to the parent AIService class.
"""
super().__init__(**kwargs)
default_settings = ServiceSettings(model=None)
if settings is not None:
default_settings.apply_update(settings)
super().__init__(settings=default_settings, **kwargs)
self._api_key = api_key
self._session = session
self._replica_id = replica_id

View File

@@ -6,9 +6,13 @@
"""Together.ai LLM service implementation using OpenAI-compatible interface."""
from typing import Optional
from loguru import logger
from pipecat.services.openai.base_llm import OpenAILLMSettings
from pipecat.services.openai.llm import OpenAILLMService
from pipecat.services.settings import _warn_deprecated_param
class TogetherLLMService(OpenAILLMService):
@@ -23,7 +27,8 @@ class TogetherLLMService(OpenAILLMService):
*,
api_key: str,
base_url: str = "https://api.together.xyz/v1",
model: str = "meta-llama/Meta-Llama-3.1-8B-Instruct-Turbo",
model: Optional[str] = None,
settings: Optional[OpenAILLMSettings] = None,
**kwargs,
):
"""Initialize Together.ai LLM service.
@@ -32,9 +37,24 @@ class TogetherLLMService(OpenAILLMService):
api_key: The API key for accessing Together.ai's API.
base_url: The base URL for Together.ai API. Defaults to "https://api.together.xyz/v1".
model: The model identifier to use. Defaults to "meta-llama/Meta-Llama-3.1-8B-Instruct-Turbo".
.. deprecated:: 1.0
Use ``settings=OpenAILLMSettings(model=...)`` instead.
settings: Runtime-updatable settings. When provided alongside deprecated
parameters, ``settings`` values take precedence.
**kwargs: Additional keyword arguments passed to OpenAILLMService.
"""
super().__init__(api_key=api_key, base_url=base_url, model=model, **kwargs)
if model is not None:
_warn_deprecated_param("model", "OpenAILLMSettings", "model")
default_settings = OpenAILLMSettings(
model=model or "meta-llama/Meta-Llama-3.1-8B-Instruct-Turbo"
)
if settings is not None:
default_settings.apply_update(settings)
super().__init__(api_key=api_key, base_url=base_url, settings=default_settings, **kwargs)
def create_client(self, api_key=None, base_url=None, **kwargs):
"""Create OpenAI-compatible client for Together.ai API endpoint.

View File

@@ -172,32 +172,38 @@ class UltravoxRealtimeLLMService(LLMService):
self,
*,
params: Union[AgentInputParams, OneShotInputParams, JoinUrlInputParams],
settings: Optional[UltravoxRealtimeLLMSettings] = None,
one_shot_selected_tools: Optional[ToolsSchema] = None,
**kwargs,
):
"""Initialize the Ultravox Realtime LLM service.
Args:
api_key: Ultravox API key for authentication.
params: Configuration parameters for the model.
settings: Ultravox Realtime LLM settings. If provided, the ``settings``
values take precedence over default values.
one_shot_selected_tools: ToolsSchema for tools to use with this call.
May only be set with OneShotInputParams.
**kwargs: Additional arguments passed to parent LLMService.
"""
default_settings = UltravoxRealtimeLLMSettings(
model=None,
temperature=None,
max_tokens=None,
top_p=None,
top_k=None,
frequency_penalty=None,
presence_penalty=None,
seed=None,
filter_incomplete_user_turns=False,
user_turn_completion_config=None,
output_medium=None,
)
if settings is not None:
default_settings.apply_update(settings)
super().__init__(
settings=UltravoxRealtimeLLMSettings(
model=None,
temperature=None,
max_tokens=None,
top_p=None,
top_k=None,
frequency_penalty=None,
presence_penalty=None,
seed=None,
filter_incomplete_user_turns=False,
user_turn_completion_config=None,
output_medium=None,
),
settings=default_settings,
**kwargs,
)
self._params = params

View File

@@ -18,7 +18,7 @@ from openai import AsyncOpenAI
from openai.types.audio import Transcription
from pipecat.frames.frames import ErrorFrame, Frame, TranscriptionFrame
from pipecat.services.settings import NOT_GIVEN, STTSettings, _NotGiven
from pipecat.services.settings import NOT_GIVEN, STTSettings, _NotGiven, _warn_deprecated_param
from pipecat.services.stt_latency import WHISPER_TTFS_P99
from pipecat.services.stt_service import SegmentedSTTService
from pipecat.transcriptions.language import Language, resolve_language
@@ -129,13 +129,14 @@ class BaseWhisperSTTService(SegmentedSTTService):
def __init__(
self,
*,
model: str,
model: Optional[str] = None,
api_key: Optional[str] = None,
base_url: Optional[str] = None,
language: Optional[Language] = Language.EN,
language: Optional[Language] = None,
prompt: Optional[str] = None,
temperature: Optional[float] = None,
include_prob_metrics: bool = False,
settings: Optional[BaseWhisperSTTSettings] = None,
ttfs_p99_latency: Optional[float] = WHISPER_TTFS_P99,
**kwargs,
):
@@ -143,33 +144,68 @@ class BaseWhisperSTTService(SegmentedSTTService):
Args:
model: Name of the Whisper model to use.
.. deprecated:: 1.0
Use ``settings=BaseWhisperSTTSettings(model=...)`` instead.
api_key: Service API key. Defaults to None.
base_url: Service API base URL. Defaults to None.
language: Language of the audio input. Defaults to English.
language: Language of the audio input.
.. deprecated:: 1.0
Use ``settings=BaseWhisperSTTSettings(language=...)`` instead.
prompt: Optional text to guide the model's style or continue a previous segment.
temperature: Sampling temperature between 0 and 1. Defaults to 0.0.
.. deprecated:: 1.0
Use ``settings=BaseWhisperSTTSettings(prompt=...)`` instead.
temperature: Sampling temperature between 0 and 1.
.. deprecated:: 1.0
Use ``settings=BaseWhisperSTTSettings(temperature=...)`` instead.
include_prob_metrics: If True, enables probability metrics in API response.
Each service implements this differently (see child classes).
Defaults to False.
settings: Runtime-updatable settings. When provided alongside deprecated
parameters, ``settings`` values take precedence.
ttfs_p99_latency: P99 latency from speech end to final transcript in seconds.
Override for your deployment. See https://github.com/pipecat-ai/stt-benchmark
**kwargs: Additional arguments passed to SegmentedSTTService.
"""
if model is not None:
_warn_deprecated_param("model", "BaseWhisperSTTSettings", "model")
if language is not None:
_warn_deprecated_param("language", "BaseWhisperSTTSettings", "language")
if prompt is not None:
_warn_deprecated_param("prompt", "BaseWhisperSTTSettings", "prompt")
if temperature is not None:
_warn_deprecated_param("temperature", "BaseWhisperSTTSettings", "temperature")
_language = language or Language.EN
default_settings = BaseWhisperSTTSettings(
model=model,
language=self.language_to_service_language(_language),
base_url=base_url,
prompt=prompt,
temperature=temperature,
)
if settings is not None:
default_settings.apply_update(settings)
super().__init__(
ttfs_p99_latency=ttfs_p99_latency,
settings=BaseWhisperSTTSettings(
model=model,
language=self.language_to_service_language(language or Language.EN),
base_url=base_url,
prompt=prompt,
temperature=temperature,
),
settings=default_settings,
**kwargs,
)
self._client = self._create_client(api_key, base_url)
self._language = self._settings.language
self._prompt = prompt
self._temperature = temperature
self._prompt = self._settings.prompt if self._settings.prompt else prompt
self._temperature = (
self._settings.temperature if self._settings.temperature else temperature
)
self._include_prob_metrics = include_prob_metrics
def _create_client(self, api_key: Optional[str], base_url: Optional[str]):

View File

@@ -20,7 +20,7 @@ from loguru import logger
from typing_extensions import TYPE_CHECKING, override
from pipecat.frames.frames import ErrorFrame, Frame, TranscriptionFrame
from pipecat.services.settings import NOT_GIVEN, STTSettings, _NotGiven
from pipecat.services.settings import NOT_GIVEN, STTSettings, _NotGiven, _warn_deprecated_param
from pipecat.services.stt_service import SegmentedSTTService
from pipecat.transcriptions.language import Language, resolve_language
from pipecat.utils.time import time_now_iso8601
@@ -216,36 +216,80 @@ class WhisperSTTService(SegmentedSTTService):
def __init__(
self,
*,
model: str | Model = Model.DISTIL_MEDIUM_EN,
device: str = "auto",
compute_type: str = "default",
no_speech_prob: float = 0.4,
language: Language = Language.EN,
model: Optional[str | Model] = None,
device: Optional[str] = None,
compute_type: Optional[str] = None,
no_speech_prob: Optional[float] = None,
language: Optional[Language] = None,
settings: Optional[WhisperSTTSettings] = None,
**kwargs,
):
"""Initialize the Whisper STT service.
Args:
model: The Whisper model to use for transcription. Can be a Model enum or string.
.. deprecated:: 1.0
Use ``settings=WhisperSTTSettings(model=...)`` instead.
device: The device to run inference on ('cpu', 'cuda', or 'auto').
.. deprecated:: 1.0
Use ``settings=WhisperSTTSettings(device=...)`` instead.
compute_type: The compute type for inference ('default', 'int8', 'int8_float16', etc.).
.. deprecated:: 1.0
Use ``settings=WhisperSTTSettings(compute_type=...)`` instead.
no_speech_prob: Probability threshold for filtering out non-speech segments.
.. deprecated:: 1.0
Use ``settings=WhisperSTTSettings(no_speech_prob=...)`` instead.
language: The default language for transcription.
.. deprecated:: 1.0
Use ``settings=WhisperSTTSettings(language=...)`` instead.
settings: Runtime-updatable settings. When provided alongside deprecated
parameters, ``settings`` values take precedence.
**kwargs: Additional arguments passed to SegmentedSTTService.
"""
if model is not None:
_warn_deprecated_param("model", "WhisperSTTSettings", "model")
if device is not None:
_warn_deprecated_param("device", "WhisperSTTSettings", "device")
if compute_type is not None:
_warn_deprecated_param("compute_type", "WhisperSTTSettings", "compute_type")
if no_speech_prob is not None:
_warn_deprecated_param("no_speech_prob", "WhisperSTTSettings", "no_speech_prob")
if language is not None:
_warn_deprecated_param("language", "WhisperSTTSettings", "language")
_model = model if model is not None else Model.DISTIL_MEDIUM_EN
_device = device or "auto"
_compute_type = compute_type or "default"
_no_speech_prob = no_speech_prob if no_speech_prob is not None else 0.4
_language = language or Language.EN
default_settings = WhisperSTTSettings(
model=_model if isinstance(_model, str) else _model.value,
language=_language,
device=_device,
compute_type=_compute_type,
no_speech_prob=_no_speech_prob,
)
if settings is not None:
default_settings.apply_update(settings)
super().__init__(
settings=WhisperSTTSettings(
model=model if isinstance(model, str) else model.value,
language=language,
device=device,
compute_type=compute_type,
no_speech_prob=no_speech_prob,
),
settings=default_settings,
**kwargs,
)
self._device: str = device
self._compute_type = compute_type
self._no_speech_prob = no_speech_prob
self._device: str = self._settings.device
self._compute_type = self._settings.compute_type
self._no_speech_prob = self._settings.no_speech_prob
self._model: Optional[WhisperModel] = None
self._load()
@@ -352,36 +396,73 @@ class WhisperSTTServiceMLX(WhisperSTTService):
def __init__(
self,
*,
model: str | MLXModel = MLXModel.TINY,
no_speech_prob: float = 0.6,
language: Language = Language.EN,
temperature: float = 0.0,
model: Optional[str | MLXModel] = None,
no_speech_prob: Optional[float] = None,
language: Optional[Language] = None,
temperature: Optional[float] = None,
settings: Optional[WhisperMLXSTTSettings] = None,
**kwargs,
):
"""Initialize the MLX Whisper STT service.
Args:
model: The MLX Whisper model to use for transcription. Can be an MLXModel enum or string.
.. deprecated:: 1.0
Use ``settings=WhisperMLXSTTSettings(model=...)`` instead.
no_speech_prob: Probability threshold for filtering out non-speech segments.
.. deprecated:: 1.0
Use ``settings=WhisperMLXSTTSettings(no_speech_prob=...)`` instead.
language: The default language for transcription.
.. deprecated:: 1.0
Use ``settings=WhisperMLXSTTSettings(language=...)`` instead.
temperature: Temperature for sampling. Can be a float or tuple of floats.
.. deprecated:: 1.0
Use ``settings=WhisperMLXSTTSettings(temperature=...)`` instead.
settings: Runtime-updatable settings. When provided alongside deprecated
parameters, ``settings`` values take precedence.
**kwargs: Additional arguments passed to SegmentedSTTService.
"""
if model is not None:
_warn_deprecated_param("model", "WhisperMLXSTTSettings", "model")
if no_speech_prob is not None:
_warn_deprecated_param("no_speech_prob", "WhisperMLXSTTSettings", "no_speech_prob")
if language is not None:
_warn_deprecated_param("language", "WhisperMLXSTTSettings", "language")
if temperature is not None:
_warn_deprecated_param("temperature", "WhisperMLXSTTSettings", "temperature")
_model = model if model is not None else MLXModel.TINY
_no_speech_prob = no_speech_prob if no_speech_prob is not None else 0.6
_language = language or Language.EN
_temperature = temperature if temperature is not None else 0.0
default_settings = WhisperMLXSTTSettings(
model=_model if isinstance(_model, str) else _model.value,
language=_language,
no_speech_prob=_no_speech_prob,
temperature=_temperature,
engine="mlx",
)
if settings is not None:
default_settings.apply_update(settings)
# Skip WhisperSTTService.__init__ and call its parent directly
SegmentedSTTService.__init__(
self,
settings=WhisperMLXSTTSettings(
model=model if isinstance(model, str) else model.value,
language=language,
no_speech_prob=no_speech_prob,
temperature=temperature,
engine="mlx",
),
settings=default_settings,
**kwargs,
)
self._no_speech_prob = no_speech_prob
self._temperature = temperature
self._no_speech_prob = self._settings.no_speech_prob
self._temperature = self._settings.temperature
# No need to call _load() as MLX Whisper loads models on demand

View File

@@ -25,7 +25,7 @@ from pipecat.frames.frames import (
TTSStartedFrame,
TTSStoppedFrame,
)
from pipecat.services.settings import NOT_GIVEN, TTSSettings, _NotGiven
from pipecat.services.settings import NOT_GIVEN, TTSSettings, _NotGiven, _warn_deprecated_param
from pipecat.services.tts_service import TTSService
from pipecat.transcriptions.language import Language, resolve_language
from pipecat.utils.tracing.service_decorators import traced_tts
@@ -94,31 +94,45 @@ class XTTSService(TTSService):
def __init__(
self,
*,
voice_id: str,
voice_id: Optional[str] = None,
base_url: str,
aiohttp_session: aiohttp.ClientSession,
language: Language = Language.EN,
sample_rate: Optional[int] = None,
settings: Optional[XTTSTTSSettings] = None,
**kwargs,
):
"""Initialize the XTTS service.
Args:
voice_id: ID of the voice/speaker to use for synthesis.
.. deprecated:: 1.0
Use ``settings=XTTSTTSSettings(voice=...)`` instead.
base_url: Base URL of the XTTS streaming server.
aiohttp_session: HTTP session for making requests to the server.
language: Language for synthesis. Defaults to English.
sample_rate: Audio sample rate. If None, uses default.
settings: Runtime-updatable settings. When provided alongside deprecated
parameters, ``settings`` values take precedence.
**kwargs: Additional arguments passed to parent TTSService.
"""
if voice_id is not None:
_warn_deprecated_param("voice_id", "XTTSTTSSettings", "voice")
default_settings = XTTSTTSSettings(
model=None,
voice=voice_id,
language=self.language_to_service_language(language),
base_url=base_url,
)
if settings is not None:
default_settings.apply_update(settings)
super().__init__(
sample_rate=sample_rate,
settings=XTTSTTSSettings(
model=None,
voice=voice_id,
language=self.language_to_service_language(language),
base_url=base_url,
),
settings=default_settings,
**kwargs,
)
self._studio_speakers: Optional[Dict[str, Any]] = None