diff --git a/docs/api/conf.py b/docs/api/conf.py index 653727668..5f7a3c2dc 100644 --- a/docs/api/conf.py +++ b/docs/api/conf.py @@ -91,6 +91,25 @@ autodoc_mock_imports = [ # MLX dependencies (Apple Silicon specific) "mlx", "mlx_whisper", # Note: might need underscore format too + # Pydantic v2 compatibility issues in third-party SDKs + "hume", + "hume.tts", + "hume.tts.types", + "cartesia", + "camb", + "sarvamai", + "openpipe", + "openai.types.beta.realtime", + "langchain_core", + "langchain_core.messages", + # FastAPI - Pydantic v2 compatibility issues during Sphinx autodoc + "fastapi", + "fastapi.applications", + "fastapi.routing", + "fastapi.params", + "fastapi.middleware", + "fastapi.responses", + "uvicorn", ] # HTML output settings diff --git a/pyproject.toml b/pyproject.toml index a6b5afafa..4dc92b879 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -97,7 +97,7 @@ qwen = [] remote-smart-turn = [] rime = [ "pipecat-ai[websockets-base]" ] riva = [ "pipecat-ai[nvidia]" ] -runner = [ "python-dotenv>=1.0.0,<2.0.0", "uvicorn>=0.32.0,<1.0.0", "fastapi>=0.115.6,<0.122.0", "pipecat-ai-small-webrtc-prebuilt>=2.0.4"] +runner = [ "python-dotenv>=1.0.0,<2.0.0", "uvicorn>=0.32.0,<1.0.0", "fastapi>=0.115.6,<0.128.0", "pipecat-ai-small-webrtc-prebuilt>=2.0.4"] sagemaker = ["aws_sdk_sagemaker_runtime_http2; python_version>='3.12'"] sambanova = [] sarvam = [ "sarvamai==0.1.21", "pipecat-ai[websockets-base]" ] @@ -113,7 +113,7 @@ together = [] tracing = [ "opentelemetry-sdk>=1.33.0", "opentelemetry-api>=1.33.0", "opentelemetry-instrumentation>=0.54b0" ] ultravox = [ "pipecat-ai[websockets-base]" ] webrtc = [ "aiortc>=1.14.0,<2", "opencv-python>=4.11.0.86,<5" ] -websocket = [ "pipecat-ai[websockets-base]", "fastapi>=0.115.6,<0.122.0" ] +websocket = [ "pipecat-ai[websockets-base]", "fastapi>=0.115.6,<0.128.0" ] websockets-base = [ "websockets>=13.1,<16.0" ] whisper = [ "faster-whisper~=1.1.1" ] diff --git a/src/pipecat/audio/filters/krisp_filter.py b/src/pipecat/audio/filters/krisp_filter.py index 7fbc00b88..58c4a2835 100644 --- a/src/pipecat/audio/filters/krisp_filter.py +++ b/src/pipecat/audio/filters/krisp_filter.py @@ -61,6 +61,7 @@ class KrispFilter(BaseAudioFilter): Provides real-time noise reduction for audio streams using Krisp's proprietary noise suppression algorithms. Requires a Krisp model file for operation. + .. deprecated:: 0.0.94 The KrispFilter is deprecated and will be removed in a future version. Use KrispVivaFilter instead. diff --git a/src/pipecat/serializers/vonage.py b/src/pipecat/serializers/vonage.py index 9de1cc038..3213e8bba 100644 --- a/src/pipecat/serializers/vonage.py +++ b/src/pipecat/serializers/vonage.py @@ -34,8 +34,7 @@ class VonageFrameSerializer(FrameSerializer): WebSocket streaming protocol. Note: - Ref docs: - https://developer.vonage.com/en/video/guides/audio-connector + Ref docs: https://developer.vonage.com/en/video/guides/audio-connector """ class InputParams(BaseModel): diff --git a/src/pipecat/services/openai/realtime/events.py b/src/pipecat/services/openai/realtime/events.py index c0ef5b890..78faff45d 100644 --- a/src/pipecat/services/openai/realtime/events.py +++ b/src/pipecat/services/openai/realtime/events.py @@ -1002,17 +1002,15 @@ class TokenDetails(BaseModel): image_tokens: Number of image tokens used (for input only). """ + model_config = ConfigDict(extra="allow") + __pydantic_extra__: dict[str, Any] + cached_tokens: Optional[int] = 0 text_tokens: Optional[int] = 0 audio_tokens: Optional[int] = 0 cached_tokens_details: Optional[CachedTokensDetails] = None image_tokens: Optional[int] = 0 - class Config: - """Pydantic configuration for TokenDetails.""" - - extra = "allow" - class Usage(BaseModel): """Token usage statistics for a response. diff --git a/src/pipecat/services/openai_realtime_beta/events.py b/src/pipecat/services/openai_realtime_beta/events.py index ce582e9bd..ea4e738c2 100644 --- a/src/pipecat/services/openai_realtime_beta/events.py +++ b/src/pipecat/services/openai_realtime_beta/events.py @@ -877,15 +877,13 @@ class TokenDetails(BaseModel): audio_tokens: Number of audio tokens used. Defaults to 0. """ + model_config = ConfigDict(extra="allow") + __pydantic_extra__: dict[str, Any] + cached_tokens: Optional[int] = 0 text_tokens: Optional[int] = 0 audio_tokens: Optional[int] = 0 - class Config: - """Pydantic configuration for TokenDetails.""" - - extra = "allow" - class Usage(BaseModel): """Token usage statistics for a response. diff --git a/src/pipecat/transports/daily/utils.py b/src/pipecat/transports/daily/utils.py index bc4c4fa9d..9ea02e203 100644 --- a/src/pipecat/transports/daily/utils.py +++ b/src/pipecat/transports/daily/utils.py @@ -10,11 +10,11 @@ Methods that wrap the Daily API to create rooms, check room URLs, and get meetin """ import time -from typing import Dict, List, Literal, Optional +from typing import Any, Dict, List, Literal, Optional from urllib.parse import urlparse import aiohttp -from pydantic import BaseModel, Field, ValidationError +from pydantic import BaseModel, ConfigDict, Field, ValidationError class DailyRoomSipParams(BaseModel): @@ -77,7 +77,7 @@ class TranscriptionBucketConfig(BaseModel): allow_api_access: bool = False -class DailyRoomProperties(BaseModel, extra="allow"): +class DailyRoomProperties(BaseModel): """Properties for configuring a Daily room. Reference: https://docs.daily.co/reference/rest-api/rooms/create-room#properties @@ -100,6 +100,11 @@ class DailyRoomProperties(BaseModel, extra="allow"): start_video_off: Whether video is off by default. """ + model_config = ConfigDict(extra="allow") + + # Pydantic v2.12+ requires explicit annotation for extra fields + __pydantic_extra__: dict[str, Any] + exp: Optional[float] = None enable_chat: bool = False enable_prejoin_ui: bool = False @@ -113,7 +118,7 @@ class DailyRoomProperties(BaseModel, extra="allow"): recordings_bucket: Optional[RecordingsBucketConfig] = None transcription_bucket: Optional[TranscriptionBucketConfig] = None sip: Optional[DailyRoomSipParams] = None - sip_uri: Optional[dict] = None + sip_uri: Optional[Dict[str, Any]] = None start_video_off: bool = False @property @@ -203,7 +208,7 @@ class DailyMeetingTokenProperties(BaseModel): enable_recording: Optional[Literal["cloud", "local", "raw-tracks"]] = None enable_prejoin_ui: Optional[bool] = None start_cloud_recording: Optional[bool] = None - permissions: Optional[dict] = None + permissions: Optional[Dict[str, Any]] = None class DailyMeetingTokenParams(BaseModel): diff --git a/uv.lock b/uv.lock index 43a44bb5c..45c1f892f 100644 --- a/uv.lock +++ b/uv.lock @@ -1446,7 +1446,7 @@ wheels = [ [[package]] name = "fastapi" -version = "0.121.3" +version = "0.127.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "annotated-doc" }, @@ -1454,9 +1454,9 @@ dependencies = [ { name = "starlette" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/80/f0/086c442c6516195786131b8ca70488c6ef11d2f2e33c9a893576b2b0d3f7/fastapi-0.121.3.tar.gz", hash = "sha256:0055bc24fe53e56a40e9e0ad1ae2baa81622c406e548e501e717634e2dfbc40b", size = 344501, upload-time = "2025-11-19T16:53:39.243Z" } +sdist = { url = "https://files.pythonhosted.org/packages/96/8a/6b9ba6eb8ff3817caae83120495965d9e70afb4d6348cb120e464ee199f4/fastapi-0.127.1.tar.gz", hash = "sha256:946a87ee5d931883b562b6bada787d6c8178becee2683cb3f9b980d593206359", size = 391876, upload-time = "2025-12-26T13:04:47.075Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/98/b6/4f620d7720fc0a754c8c1b7501d73777f6ba43b57c8ab99671f4d7441eb8/fastapi-0.121.3-py3-none-any.whl", hash = "sha256:0c78fc87587fcd910ca1bbf5bc8ba37b80e119b388a7206b39f0ecc95ebf53e9", size = 109801, upload-time = "2025-11-19T16:53:37.918Z" }, + { url = "https://files.pythonhosted.org/packages/d2/f3/a6858d147ed2645c095d11dc2440f94a5f1cd8f4df888e3377e6b5281a0f/fastapi-0.127.1-py3-none-any.whl", hash = "sha256:31d670a4f9373cc6d7994420f98e4dc46ea693145207abc39696746c83a44430", size = 112332, upload-time = "2025-12-26T13:04:45.329Z" }, ] [package.optional-dependencies] @@ -4513,8 +4513,8 @@ requires-dist = [ { name = "docstring-parser", specifier = "~=0.16" }, { name = "einops", marker = "extra == 'moondream'", specifier = "~=0.8.0" }, { name = "fal-client", marker = "extra == 'fal'", specifier = "~=0.5.9" }, - { name = "fastapi", marker = "extra == 'runner'", specifier = ">=0.115.6,<0.122.0" }, - { name = "fastapi", marker = "extra == 'websocket'", specifier = ">=0.115.6,<0.122.0" }, + { name = "fastapi", marker = "extra == 'runner'", specifier = ">=0.115.6,<0.128.0" }, + { name = "fastapi", marker = "extra == 'websocket'", specifier = ">=0.115.6,<0.128.0" }, { name = "faster-whisper", marker = "extra == 'whisper'", specifier = "~=1.1.1" }, { name = "google-cloud-speech", marker = "extra == 'google'", specifier = ">=2.33.0,<3" }, { name = "google-cloud-texttospeech", marker = "extra == 'google'", specifier = ">=2.31.0,<3" },