Merge pull request #4393 from pipecat-ai/mb/fix-smart-turn-import

fix(turns): defer LocalSmartTurnAnalyzerV3 import to fix transformers warning
This commit is contained in:
Mark Backman
2026-04-30 16:40:17 -04:00
committed by GitHub
6 changed files with 40 additions and 44 deletions

1
changelog/4393.fixed.md Normal file
View File

@@ -0,0 +1 @@
- Fixed an issue where `LocalSmartTurnAnalyzerV3` was imported unconditionally for user turn stop strategies. It is now only imported when `default_user_turn_stop_strategies()` is called. This improves startup time and removes the `transformers` "PyTorch/TensorFlow/Flax not found" warning when the default stop strategies are not used.

View File

@@ -8,7 +8,6 @@
from dataclasses import dataclass from dataclasses import dataclass
from pipecat.audio.turn.smart_turn.local_smart_turn_v3 import LocalSmartTurnAnalyzerV3
from pipecat.turns.user_start import ( from pipecat.turns.user_start import (
BaseUserTurnStartStrategy, BaseUserTurnStartStrategy,
ExternalUserTurnStartStrategy, ExternalUserTurnStartStrategy,
@@ -44,6 +43,8 @@ def default_user_turn_stop_strategies() -> list[BaseUserTurnStopStrategy]:
Returns ``[TurnAnalyzerUserTurnStopStrategy(LocalSmartTurnAnalyzerV3)]``. Returns ``[TurnAnalyzerUserTurnStopStrategy(LocalSmartTurnAnalyzerV3)]``.
Useful when building a custom strategy list that extends the defaults. Useful when building a custom strategy list that extends the defaults.
""" """
from pipecat.audio.turn.smart_turn.local_smart_turn_v3 import LocalSmartTurnAnalyzerV3
return [TurnAnalyzerUserTurnStopStrategy(turn_analyzer=LocalSmartTurnAnalyzerV3())] return [TurnAnalyzerUserTurnStopStrategy(turn_analyzer=LocalSmartTurnAnalyzerV3())]

View File

@@ -12,10 +12,6 @@ from unittest.mock import MagicMock, patch
import numpy as np import numpy as np
# Mock package version check before importing pipecat (development mode)
_version_patcher = patch("importlib.metadata.version", return_value="0.0.0-dev")
_version_patcher.start()
# Mock krisp_audio before any pipecat import that loads krisp_instance / VIVA IP strategy # Mock krisp_audio before any pipecat import that loads krisp_instance / VIVA IP strategy
mock_krisp_audio = MagicMock() mock_krisp_audio = MagicMock()
mock_krisp_audio.SamplingRate.Sr8000Hz = 8000 mock_krisp_audio.SamplingRate.Sr8000Hz = 8000
@@ -37,18 +33,22 @@ sys.modules["pipecat_ai_krisp"] = mock_pipecat_krisp
sys.modules["pipecat_ai_krisp.audio"] = MagicMock() sys.modules["pipecat_ai_krisp.audio"] = MagicMock()
sys.modules["pipecat_ai_krisp.audio.krisp_processor"] = MagicMock() sys.modules["pipecat_ai_krisp.audio.krisp_processor"] = MagicMock()
from pipecat.frames.frames import ( # The version patch is scoped to just the import so it doesn't leak across the
BotStartedSpeakingFrame, # test session and corrupt importlib.metadata.version for other tests
BotStoppedSpeakingFrame, # (e.g. transformers' import-time dependency checks).
InputAudioRawFrame, with patch("importlib.metadata.version", return_value="0.0.0-dev"):
TranscriptionFrame, from pipecat.frames.frames import (
VADUserStartedSpeakingFrame, BotStartedSpeakingFrame,
VADUserStoppedSpeakingFrame, BotStoppedSpeakingFrame,
) InputAudioRawFrame,
from pipecat.turns.types import ProcessFrameResult TranscriptionFrame,
from pipecat.turns.user_start.krisp_viva_ip_user_turn_start_strategy import ( VADUserStartedSpeakingFrame,
KrispVivaIPUserTurnStartStrategy, VADUserStoppedSpeakingFrame,
) )
from pipecat.turns.types import ProcessFrameResult
from pipecat.turns.user_start.krisp_viva_ip_user_turn_start_strategy import (
KrispVivaIPUserTurnStartStrategy,
)
STRATEGY_MODULE = "pipecat.turns.user_start.krisp_viva_ip_user_turn_start_strategy" STRATEGY_MODULE = "pipecat.turns.user_start.krisp_viva_ip_user_turn_start_strategy"

View File

@@ -11,11 +11,6 @@ from unittest.mock import MagicMock, patch
import pytest import pytest
# Mock package version check before importing pipecat
# This allows tests to run in development mode without installed package
_version_patcher = patch("importlib.metadata.version", return_value="0.0.0-dev")
_version_patcher.start()
# Mock krisp_audio module BEFORE any pipecat imports # Mock krisp_audio module BEFORE any pipecat imports
# This allows tests to run without krisp_audio installed # This allows tests to run without krisp_audio installed
mock_krisp_audio = MagicMock() mock_krisp_audio = MagicMock()
@@ -48,12 +43,15 @@ sys.modules["pipecat_ai_krisp"] = mock_pipecat_krisp
sys.modules["pipecat_ai_krisp.audio"] = MagicMock() sys.modules["pipecat_ai_krisp.audio"] = MagicMock()
sys.modules["pipecat_ai_krisp.audio.krisp_processor"] = MagicMock() sys.modules["pipecat_ai_krisp.audio.krisp_processor"] = MagicMock()
# Now we can safely import # Now we can safely import. The version patch is scoped to just the import so
from pipecat.audio.krisp_instance import ( # it doesn't leak across the test session and corrupt importlib.metadata.version
KRISP_SAMPLE_RATES, # for other tests (e.g. transformers' import-time dependency checks).
KrispVivaSDKManager, with patch("importlib.metadata.version", return_value="0.0.0-dev"):
int_to_krisp_sample_rate, from pipecat.audio.krisp_instance import (
) KRISP_SAMPLE_RATES,
KrispVivaSDKManager,
int_to_krisp_sample_rate,
)
class TestKrispVivaSDKManager: class TestKrispVivaSDKManager:

View File

@@ -13,11 +13,6 @@ from unittest.mock import MagicMock, patch
import numpy as np import numpy as np
# Mock package version check before importing pipecat
# This allows tests to run in development mode without installed package
_version_patcher = patch("importlib.metadata.version", return_value="0.0.0-dev")
_version_patcher.start()
# Mock krisp_audio module BEFORE any pipecat imports # Mock krisp_audio module BEFORE any pipecat imports
# This allows tests to run without krisp_audio installed # This allows tests to run without krisp_audio installed
mock_krisp_audio = MagicMock() mock_krisp_audio = MagicMock()
@@ -42,9 +37,12 @@ sys.modules["pipecat_ai_krisp"] = mock_pipecat_krisp
sys.modules["pipecat_ai_krisp.audio"] = MagicMock() sys.modules["pipecat_ai_krisp.audio"] = MagicMock()
sys.modules["pipecat_ai_krisp.audio.krisp_processor"] = MagicMock() sys.modules["pipecat_ai_krisp.audio.krisp_processor"] = MagicMock()
# Now we can safely import # Now we can safely import. The version patch is scoped to just the import so
from pipecat.audio.filters.krisp_viva_filter import KrispVivaFilter # it doesn't leak across the test session and corrupt importlib.metadata.version
from pipecat.frames.frames import FilterEnableFrame # for other tests (e.g. transformers' import-time dependency checks).
with patch("importlib.metadata.version", return_value="0.0.0-dev"):
from pipecat.audio.filters.krisp_viva_filter import KrispVivaFilter
from pipecat.frames.frames import FilterEnableFrame
class TestKrispVivaFilter(unittest.IsolatedAsyncioTestCase): class TestKrispVivaFilter(unittest.IsolatedAsyncioTestCase):

View File

@@ -15,11 +15,6 @@ from unittest.mock import MagicMock, patch
import numpy as np import numpy as np
# Mock package version check before importing pipecat
# This allows tests to run in development mode without installed package
_version_patcher = patch("importlib.metadata.version", return_value="0.0.0-dev")
_version_patcher.start()
# Mock krisp_audio module BEFORE any pipecat imports # Mock krisp_audio module BEFORE any pipecat imports
# This allows tests to run without krisp_audio installed # This allows tests to run without krisp_audio installed
mock_krisp_audio = MagicMock() mock_krisp_audio = MagicMock()
@@ -44,9 +39,12 @@ sys.modules["pipecat_ai_krisp"] = mock_pipecat_krisp
sys.modules["pipecat_ai_krisp.audio"] = MagicMock() sys.modules["pipecat_ai_krisp.audio"] = MagicMock()
sys.modules["pipecat_ai_krisp.audio.krisp_processor"] = MagicMock() sys.modules["pipecat_ai_krisp.audio.krisp_processor"] = MagicMock()
# Now we can safely import # Now we can safely import. The version patch is scoped to just the import so
from pipecat.audio.vad.krisp_viva_vad import KrispVivaVadAnalyzer # it doesn't leak across the test session and corrupt importlib.metadata.version
from pipecat.audio.vad.vad_analyzer import VADParams # for other tests (e.g. transformers' import-time dependency checks).
with patch("importlib.metadata.version", return_value="0.0.0-dev"):
from pipecat.audio.vad.krisp_viva_vad import KrispVivaVadAnalyzer
from pipecat.audio.vad.vad_analyzer import VADParams
class TestKrispVivaVadAnalyzer(unittest.TestCase): class TestKrispVivaVadAnalyzer(unittest.TestCase):