From e71cb3ba68f82c6938cc58d3798495a6e3553e8c Mon Sep 17 00:00:00 2001 From: Mark Backman Date: Wed, 2 Jul 2025 07:27:29 -0700 Subject: [PATCH] Docstring cleanup, fix missing examples imports --- .../daily-multi-translation/requirements.txt | 2 +- .../open-telemetry/jaeger/requirements.txt | 2 +- .../open-telemetry/langfuse/requirements.txt | 2 +- .../daily-twilio-sip-dial-in/requirements.txt | 2 +- .../observers/loggers/debug_log_observer.py | 5 ++-- src/pipecat/processors/aggregators/gated.py | 23 ------------------- .../processors/aggregators/sentence.py | 14 ++--------- .../aggregators/vision_image_frame.py | 11 --------- src/pipecat/processors/text_transformer.py | 8 ------- src/pipecat/utils/utils.py | 19 --------------- 10 files changed, 9 insertions(+), 79 deletions(-) diff --git a/examples/daily-multi-translation/requirements.txt b/examples/daily-multi-translation/requirements.txt index e20c41d5a..f75f059d7 100644 --- a/examples/daily-multi-translation/requirements.txt +++ b/examples/daily-multi-translation/requirements.txt @@ -2,4 +2,4 @@ aiofiles python-dotenv fastapi[all] uvicorn -pipecat-ai[daily,deepgram,openai,silero,cartesia] +pipecat-ai[daily,deepgram,openai,silero,cartesia,soundfile] diff --git a/examples/open-telemetry/jaeger/requirements.txt b/examples/open-telemetry/jaeger/requirements.txt index 7f5abb16d..344a0560e 100644 --- a/examples/open-telemetry/jaeger/requirements.txt +++ b/examples/open-telemetry/jaeger/requirements.txt @@ -1,6 +1,6 @@ fastapi uvicorn python-dotenv -pipecat-ai[webrtc,silero,cartesia,deepgram,openai,tracing] +pipecat-ai[daily,webrtc,silero,cartesia,deepgram,openai,tracing] pipecat-ai-small-webrtc-prebuilt opentelemetry-exporter-otlp-proto-grpc \ No newline at end of file diff --git a/examples/open-telemetry/langfuse/requirements.txt b/examples/open-telemetry/langfuse/requirements.txt index fe0f32468..6f06ac809 100644 --- a/examples/open-telemetry/langfuse/requirements.txt +++ b/examples/open-telemetry/langfuse/requirements.txt @@ -1,6 +1,6 @@ fastapi uvicorn python-dotenv -pipecat-ai[webrtc,silero,cartesia,deepgram,openai,tracing] +pipecat-ai[daily,webrtc,silero,cartesia,deepgram,openai,tracing] pipecat-ai-small-webrtc-prebuilt opentelemetry-exporter-otlp-proto-http \ No newline at end of file diff --git a/examples/phone-chatbot/daily-twilio-sip-dial-in/requirements.txt b/examples/phone-chatbot/daily-twilio-sip-dial-in/requirements.txt index cd12dd07a..1ba848312 100644 --- a/examples/phone-chatbot/daily-twilio-sip-dial-in/requirements.txt +++ b/examples/phone-chatbot/daily-twilio-sip-dial-in/requirements.txt @@ -1,4 +1,4 @@ -pipecat-ai[daily,elevenlabs,openai,silero] +pipecat-ai[daily,cartesia,openai,silero] fastapi==0.115.6 uvicorn python-dotenv diff --git a/src/pipecat/observers/loggers/debug_log_observer.py b/src/pipecat/observers/loggers/debug_log_observer.py index a8cf7d2d3..abb0db8d7 100644 --- a/src/pipecat/observers/loggers/debug_log_observer.py +++ b/src/pipecat/observers/loggers/debug_log_observer.py @@ -47,7 +47,7 @@ class DebugLogObserver(BaseObserver): Log specific frame types from any source/destination:: - from pipecat.frames.frames import TranscriptionFrame, InterimTranscriptionFrame + from pipecat.frames.frames import LLMTextFrame, TranscriptionFrame observers=[ DebugLogObserver(frame_types=(LLMTextFrame,TranscriptionFrame,)), ] @@ -55,7 +55,8 @@ class DebugLogObserver(BaseObserver): Log frames with specific source/destination filters:: from pipecat.frames.frames import StartInterruptionFrame, UserStartedSpeakingFrame, LLMTextFrame - from pipecat.transports.base_output_transport import BaseOutputTransport + from pipecat.observers.loggers.debug_log_observer import DebugLogObserver, FrameEndpoint + from pipecat.transports.base_output import BaseOutputTransport from pipecat.services.stt_service import STTService observers=[ diff --git a/src/pipecat/processors/aggregators/gated.py b/src/pipecat/processors/aggregators/gated.py index 33f80247d..cb153cde9 100644 --- a/src/pipecat/processors/aggregators/gated.py +++ b/src/pipecat/processors/aggregators/gated.py @@ -26,29 +26,6 @@ class GatedAggregator(FrameProcessor): until and not including the gate-closed frame. The aggregator maintains an internal gate state that controls whether frames are passed through immediately or accumulated for later release. - - Doctest: FIXME to work with asyncio - >>> from pipecat.frames.frames import ImageRawFrame - - >>> async def print_frames(aggregator, frame): - ... async for frame in aggregator.process_frame(frame): - ... if isinstance(frame, TextFrame): - ... print(frame.text) - ... else: - ... print(frame.__class__.__name__) - - >>> aggregator = GatedAggregator( - ... gate_close_fn=lambda x: isinstance(x, LLMResponseStartFrame), - ... gate_open_fn=lambda x: isinstance(x, ImageRawFrame), - ... start_open=False) - >>> asyncio.run(print_frames(aggregator, TextFrame("Hello"))) - >>> asyncio.run(print_frames(aggregator, TextFrame("Hello again."))) - >>> asyncio.run(print_frames(aggregator, ImageRawFrame(image=bytes([]), size=(0, 0)))) - ImageRawFrame - Hello - Hello again. - >>> asyncio.run(print_frames(aggregator, TextFrame("Goodbye."))) - Goodbye. """ def __init__( diff --git a/src/pipecat/processors/aggregators/sentence.py b/src/pipecat/processors/aggregators/sentence.py index 5a2bc59dc..da287bd6f 100644 --- a/src/pipecat/processors/aggregators/sentence.py +++ b/src/pipecat/processors/aggregators/sentence.py @@ -23,20 +23,10 @@ class SentenceAggregator(FrameProcessor): Useful for ensuring downstream processors receive coherent, complete sentences rather than fragmented text. - Frame input/output: + Frame input/output:: + TextFrame("Hello,") -> None TextFrame(" world.") -> TextFrame("Hello, world.") - - Doctest: FIXME to work with asyncio - >>> import asyncio - >>> async def print_frames(aggregator, frame): - ... async for frame in aggregator.process_frame(frame): - ... print(frame.text) - - >>> aggregator = SentenceAggregator() - >>> asyncio.run(print_frames(aggregator, TextFrame("Hello,"))) - >>> asyncio.run(print_frames(aggregator, TextFrame(" world."))) - Hello, world. """ def __init__(self): diff --git a/src/pipecat/processors/aggregators/vision_image_frame.py b/src/pipecat/processors/aggregators/vision_image_frame.py index ea1848ff1..de4d74186 100644 --- a/src/pipecat/processors/aggregators/vision_image_frame.py +++ b/src/pipecat/processors/aggregators/vision_image_frame.py @@ -20,17 +20,6 @@ class VisionImageFrameAggregator(FrameProcessor): This aggregator waits for a consecutive TextFrame and an InputImageRawFrame. After the InputImageRawFrame arrives it will output a VisionImageRawFrame combining both the text and image data for multimodal processing. - - >>> from pipecat.frames.frames import ImageFrame - - >>> async def print_frames(aggregator, frame): - ... async for frame in aggregator.process_frame(frame): - ... print(frame) - - >>> aggregator = VisionImageFrameAggregator() - >>> asyncio.run(print_frames(aggregator, TextFrame("What do you see?"))) - >>> asyncio.run(print_frames(aggregator, ImageFrame(image=bytes([]), size=(0, 0)))) - VisionImageFrame, text: What do you see?, image size: 0x0, buffer size: 0 B """ def __init__(self): diff --git a/src/pipecat/processors/text_transformer.py b/src/pipecat/processors/text_transformer.py index 7dcef31df..0fdbbb043 100644 --- a/src/pipecat/processors/text_transformer.py +++ b/src/pipecat/processors/text_transformer.py @@ -18,14 +18,6 @@ class StatelessTextTransformer(FrameProcessor): This processor intercepts TextFrame objects and applies a user-provided transformation function to the text content. The function can be either synchronous or asynchronous (coroutine). - - >>> async def print_frames(aggregator, frame): - ... async for frame in aggregator.process_frame(frame): - ... print(frame.text) - - >>> aggregator = StatelessTextTransformer(lambda x: x.upper()) - >>> asyncio.run(print_frames(aggregator, TextFrame("Hello"))) - HELLO """ def __init__( diff --git a/src/pipecat/utils/utils.py b/src/pipecat/utils/utils.py index f741bc05b..fb0299b2c 100644 --- a/src/pipecat/utils/utils.py +++ b/src/pipecat/utils/utils.py @@ -25,15 +25,6 @@ def obj_id() -> int: Returns: A unique integer identifier that increments globally across all objects. - - Examples:: - - >>> obj_id() - 0 - >>> obj_id() - 1 - >>> obj_id() - 2 """ with _ID_LOCK: return next(_ID) @@ -47,16 +38,6 @@ def obj_count(obj) -> int: Returns: A unique integer count that increments per class type. - - Examples:: - - >>> obj_count(object()) - 0 - >>> obj_count(object()) - 1 - >>> new_type = type('NewType', (object,), {}) - >>> obj_count(new_type()) - 0 """ with _COUNTS_LOCK: return next(_COUNTS[obj.__class__.__name__])