From e80281c3c43d7cfa01054e1b5d3db27350270b4f Mon Sep 17 00:00:00 2001 From: Mark Backman Date: Thu, 31 Jul 2025 10:59:06 -0400 Subject: [PATCH] Remove examples/runner-examples --- .../runner-examples/01-all-transport-bot.py | 218 ------------------ .../01-all-transport-factory-bot.py | 144 ------------ .../runner-examples/02-two-transport-bot.py | 157 ------------- .../03-single-transport-bot.py | 117 ---------- examples/runner-examples/Dockerfile | 7 - examples/runner-examples/build.sh | 19 -- examples/runner-examples/env.example | 3 - examples/runner-examples/pcc-deploy.toml | 8 - examples/runner-examples/requirements.txt | 1 - 9 files changed, 674 deletions(-) delete mode 100644 examples/runner-examples/01-all-transport-bot.py delete mode 100644 examples/runner-examples/01-all-transport-factory-bot.py delete mode 100644 examples/runner-examples/02-two-transport-bot.py delete mode 100644 examples/runner-examples/03-single-transport-bot.py delete mode 100644 examples/runner-examples/Dockerfile delete mode 100755 examples/runner-examples/build.sh delete mode 100644 examples/runner-examples/env.example delete mode 100644 examples/runner-examples/pcc-deploy.toml delete mode 100644 examples/runner-examples/requirements.txt diff --git a/examples/runner-examples/01-all-transport-bot.py b/examples/runner-examples/01-all-transport-bot.py deleted file mode 100644 index 982abc58d..000000000 --- a/examples/runner-examples/01-all-transport-bot.py +++ /dev/null @@ -1,218 +0,0 @@ -# -# Copyright (c) 2024–2025, Daily -# -# SPDX-License-Identifier: BSD 2-Clause License -# - -"""Pipecat Cloud-compatible bot example. - -Transports are: - -- Daily -- SmallWebRTC -- Twilio -- Telnyx -- Plivo -""" - -import os - -from dotenv import load_dotenv -from loguru import logger - -from pipecat.audio.vad.silero import SileroVADAnalyzer -from pipecat.pipeline.pipeline import Pipeline -from pipecat.pipeline.runner import PipelineRunner -from pipecat.pipeline.task import PipelineParams, PipelineTask -from pipecat.processors.aggregators.openai_llm_context import OpenAILLMContext -from pipecat.processors.frameworks.rtvi import RTVIConfig, RTVIObserver, RTVIProcessor -from pipecat.runner.types import ( - DailyRunnerArguments, - RunnerArguments, - SmallWebRTCRunnerArguments, - WebSocketRunnerArguments, -) -from pipecat.services.cartesia.tts import CartesiaTTSService -from pipecat.services.deepgram.stt import DeepgramSTTService -from pipecat.services.openai.llm import OpenAILLMService -from pipecat.transports.base_transport import BaseTransport - -load_dotenv(override=True) - - -async def run_bot(transport: BaseTransport): - """Main bot logic that works with any transport.""" - logger.info(f"Starting bot") - - stt = DeepgramSTTService(api_key=os.getenv("DEEPGRAM_API_KEY")) - - tts = CartesiaTTSService( - api_key=os.getenv("CARTESIA_API_KEY"), - voice_id="71a7ad14-091c-4e8e-a314-022ece01c121", # British Reading Lady - ) - - llm = OpenAILLMService(api_key=os.getenv("OPENAI_API_KEY")) - - messages = [ - { - "role": "system", - "content": "You are a friendly AI assistant. Respond naturally and keep your answers conversational.", - }, - ] - - context = OpenAILLMContext(messages) - context_aggregator = llm.create_context_aggregator(context) - - rtvi = RTVIProcessor(config=RTVIConfig(config=[])) - - pipeline = Pipeline( - [ - transport.input(), - rtvi, - stt, - context_aggregator.user(), - llm, - tts, - transport.output(), - context_aggregator.assistant(), - ] - ) - - task = PipelineTask( - pipeline, - params=PipelineParams( - enable_metrics=True, - enable_usage_metrics=True, - ), - observers=[RTVIObserver(rtvi)], - ) - - @transport.event_handler("on_client_connected") - async def on_client_connected(transport, client): - logger.info("Client connected") - messages.append({"role": "system", "content": "Say hello and briefly introduce yourself."}) - await task.queue_frames([context_aggregator.user().get_context_frame()]) - - @transport.event_handler("on_client_disconnected") - async def on_client_disconnected(transport, client): - logger.info("Client disconnected") - await task.cancel() - - runner = PipelineRunner(handle_sigint=False) - await runner.run(task) - - -async def bot(runner_args: RunnerArguments): - """Main bot entry point compatible with Pipecat Cloud.""" - - transport = None - - if isinstance(runner_args, DailyRunnerArguments): - from pipecat.transports.services.daily import DailyParams, DailyTransport - - if os.environ.get("ENV") != "local": - from pipecat.audio.filters.krisp_filter import KrispFilter - - krisp_filter = KrispFilter() - else: - krisp_filter = None - - transport = DailyTransport( - runner_args.room_url, - runner_args.token, - "Pipecat Bot", - params=DailyParams( - audio_in_enabled=True, - audio_in_filter=krisp_filter, - audio_out_enabled=True, - vad_analyzer=SileroVADAnalyzer(), - ), - ) - - elif isinstance(runner_args, SmallWebRTCRunnerArguments): - from pipecat.transports.base_transport import TransportParams - from pipecat.transports.network.small_webrtc import SmallWebRTCTransport - - transport = SmallWebRTCTransport( - params=TransportParams( - audio_in_enabled=True, - audio_out_enabled=True, - vad_analyzer=SileroVADAnalyzer(), - ), - webrtc_connection=runner_args.webrtc_connection, - ) - - elif isinstance(runner_args, WebSocketRunnerArguments): - # Use the utility to parse WebSocket data - from pipecat.runner.utils import parse_telephony_websocket - - transport_type, call_data = await parse_telephony_websocket(runner_args.websocket) - logger.info(f"Auto-detected transport: {transport_type}") - - # Create transport based on detected type - if transport_type == "twilio": - from pipecat.serializers.twilio import TwilioFrameSerializer - - serializer = TwilioFrameSerializer( - stream_sid=call_data["stream_id"], - call_sid=call_data["call_id"], - account_sid=os.getenv("TWILIO_ACCOUNT_SID", ""), - auth_token=os.getenv("TWILIO_AUTH_TOKEN", ""), - ) - - elif transport_type == "telnyx": - from pipecat.serializers.telnyx import TelnyxFrameSerializer - - serializer = TelnyxFrameSerializer( - stream_id=call_data["stream_id"], - call_control_id=call_data["call_control_id"], - outbound_encoding=call_data["outbound_encoding"], - inbound_encoding="PCMU", # Set manually - api_key=os.getenv("TELNYX_API_KEY", ""), - ) - - elif transport_type == "plivo": - from pipecat.serializers.plivo import PlivoFrameSerializer - - serializer = PlivoFrameSerializer( - stream_id=call_data["stream_id"], - call_id=call_data["call_id"], - auth_id=os.getenv("PLIVO_AUTH_ID", ""), - auth_token=os.getenv("PLIVO_AUTH_TOKEN", ""), - ) - - else: - # Generic fallback - serializer = None - - # Create the transport - from pipecat.transports.network.fastapi_websocket import ( - FastAPIWebsocketParams, - FastAPIWebsocketTransport, - ) - - transport = FastAPIWebsocketTransport( - websocket=runner_args.websocket, - params=FastAPIWebsocketParams( - audio_in_enabled=True, - audio_out_enabled=True, - add_wav_header=False, - vad_analyzer=SileroVADAnalyzer(), - serializer=serializer, - ), - ) - else: - logger.error(f"Unsupported runner arguments type: {type(runner_args)}") - return - - if transport is None: - logger.error("Failed to create transport") - return - - await run_bot(transport) - - -if __name__ == "__main__": - from pipecat.runner.run import main - - main() diff --git a/examples/runner-examples/01-all-transport-factory-bot.py b/examples/runner-examples/01-all-transport-factory-bot.py deleted file mode 100644 index 8ec1b7f27..000000000 --- a/examples/runner-examples/01-all-transport-factory-bot.py +++ /dev/null @@ -1,144 +0,0 @@ -# -# Copyright (c) 2024–2025, Daily -# -# SPDX-License-Identifier: BSD 2-Clause License -# - -"""Pipecat Cloud-compatible bot example. - -Transports are: - -- Daily -- SmallWebRTC -- Twilio -- Telnyx -- Plivo -""" - -import os - -from dotenv import load_dotenv -from loguru import logger - -from pipecat.audio.vad.silero import SileroVADAnalyzer -from pipecat.pipeline.pipeline import Pipeline -from pipecat.pipeline.runner import PipelineRunner -from pipecat.pipeline.task import PipelineParams, PipelineTask -from pipecat.processors.aggregators.openai_llm_context import OpenAILLMContext -from pipecat.processors.frameworks.rtvi import RTVIConfig, RTVIObserver, RTVIProcessor -from pipecat.runner.types import RunnerArguments -from pipecat.runner.utils import create_transport -from pipecat.services.cartesia.tts import CartesiaTTSService -from pipecat.services.deepgram.stt import DeepgramSTTService -from pipecat.services.openai.llm import OpenAILLMService -from pipecat.transports.base_transport import BaseTransport, TransportParams -from pipecat.transports.network.fastapi_websocket import FastAPIWebsocketParams -from pipecat.transports.services.daily import DailyParams - -load_dotenv(override=True) - -# Define transport configurations using factory functions -transport_params = { - "daily": lambda: DailyParams( - audio_in_enabled=True, - audio_out_enabled=True, - vad_analyzer=SileroVADAnalyzer(), - ), - "webrtc": lambda: TransportParams( - audio_in_enabled=True, - audio_out_enabled=True, - vad_analyzer=SileroVADAnalyzer(), - ), - "twilio": lambda: FastAPIWebsocketParams( - audio_in_enabled=True, - audio_out_enabled=True, - vad_analyzer=SileroVADAnalyzer(), - # add_wav_header and serializer will be set automatically - ), - "telnyx": lambda: FastAPIWebsocketParams( - audio_in_enabled=True, - audio_out_enabled=True, - vad_analyzer=SileroVADAnalyzer(), - # add_wav_header and serializer will be set automatically - ), - "plivo": lambda: FastAPIWebsocketParams( - audio_in_enabled=True, - audio_out_enabled=True, - vad_analyzer=SileroVADAnalyzer(), - # add_wav_header and serializer will be set automatically - ), -} - - -async def run_bot(transport: BaseTransport): - """Main bot logic that works with any transport.""" - logger.info("Starting bot") - - stt = DeepgramSTTService(api_key=os.getenv("DEEPGRAM_API_KEY")) - - tts = CartesiaTTSService( - api_key=os.getenv("CARTESIA_API_KEY"), - voice_id="71a7ad14-091c-4e8e-a314-022ece01c121", # British Reading Lady - ) - - llm = OpenAILLMService(api_key=os.getenv("OPENAI_API_KEY")) - - messages = [ - { - "role": "system", - "content": "You are a friendly AI assistant. Respond naturally and keep your answers conversational.", - }, - ] - - context = OpenAILLMContext(messages) - context_aggregator = llm.create_context_aggregator(context) - - rtvi = RTVIProcessor(config=RTVIConfig(config=[])) - - pipeline = Pipeline( - [ - transport.input(), - rtvi, - stt, - context_aggregator.user(), - llm, - tts, - transport.output(), - context_aggregator.assistant(), - ] - ) - - task = PipelineTask( - pipeline, - params=PipelineParams( - enable_metrics=True, - enable_usage_metrics=True, - ), - observers=[RTVIObserver(rtvi)], - ) - - @transport.event_handler("on_client_connected") - async def on_client_connected(transport, client): - logger.info("Client connected") - messages.append({"role": "system", "content": "Say hello and briefly introduce yourself."}) - await task.queue_frames([context_aggregator.user().get_context_frame()]) - - @transport.event_handler("on_client_disconnected") - async def on_client_disconnected(transport, client): - logger.info("Client disconnected") - await task.cancel() - - runner = PipelineRunner(handle_sigint=False) - await runner.run(task) - - -async def bot(runner_args: RunnerArguments): - """Main bot entry point compatible with Pipecat Cloud.""" - transport = await create_transport(runner_args, transport_params) - await run_bot(transport) - - -if __name__ == "__main__": - from pipecat.runner.run import main - - main() diff --git a/examples/runner-examples/02-two-transport-bot.py b/examples/runner-examples/02-two-transport-bot.py deleted file mode 100644 index 31ec577e1..000000000 --- a/examples/runner-examples/02-two-transport-bot.py +++ /dev/null @@ -1,157 +0,0 @@ -# -# Copyright (c) 2024–2025, Daily -# -# SPDX-License-Identifier: BSD 2-Clause License -# - -"""Pipecat Cloud-compatible bot example. - -Transports are Daily or SmallWebRTC. - -Run it with: - -- WebRTC transport:: - - python 02-two-transport-bot.py - -- Daily transport:: - - python 02-two-transport-bot.py --transport daily -""" - -import os - -from dotenv import load_dotenv -from loguru import logger - -from pipecat.audio.vad.silero import SileroVADAnalyzer -from pipecat.pipeline.pipeline import Pipeline -from pipecat.pipeline.runner import PipelineRunner -from pipecat.pipeline.task import PipelineParams, PipelineTask -from pipecat.processors.aggregators.openai_llm_context import OpenAILLMContext -from pipecat.processors.frameworks.rtvi import RTVIConfig, RTVIObserver, RTVIProcessor -from pipecat.runner.types import DailyRunnerArguments, RunnerArguments, SmallWebRTCRunnerArguments -from pipecat.services.cartesia.tts import CartesiaTTSService -from pipecat.services.deepgram.stt import DeepgramSTTService -from pipecat.services.openai.llm import OpenAILLMService -from pipecat.transports.base_transport import BaseTransport - -load_dotenv(override=True) - - -async def run_bot(transport: BaseTransport): - """Main bot logic that works with any transport.""" - logger.info(f"Starting bot") - - stt = DeepgramSTTService(api_key=os.getenv("DEEPGRAM_API_KEY")) - - tts = CartesiaTTSService( - api_key=os.getenv("CARTESIA_API_KEY"), - voice_id="71a7ad14-091c-4e8e-a314-022ece01c121", # British Reading Lady - ) - - llm = OpenAILLMService(api_key=os.getenv("OPENAI_API_KEY")) - - messages = [ - { - "role": "system", - "content": "You are a friendly AI assistant. Respond naturally and keep your answers conversational.", - }, - ] - - context = OpenAILLMContext(messages) - context_aggregator = llm.create_context_aggregator(context) - - rtvi = RTVIProcessor(config=RTVIConfig(config=[])) - - pipeline = Pipeline( - [ - transport.input(), - rtvi, - stt, - context_aggregator.user(), - llm, - tts, - transport.output(), - context_aggregator.assistant(), - ] - ) - - task = PipelineTask( - pipeline, - params=PipelineParams( - enable_metrics=True, - enable_usage_metrics=True, - ), - observers=[RTVIObserver(rtvi)], - ) - - @transport.event_handler("on_client_connected") - async def on_client_connected(transport, client): - logger.info("Client connected") - messages.append({"role": "system", "content": "Say hello and briefly introduce yourself."}) - await task.queue_frames([context_aggregator.user().get_context_frame()]) - - @transport.event_handler("on_client_disconnected") - async def on_client_disconnected(transport, client): - logger.info("Client disconnected") - await task.cancel() - - runner = PipelineRunner(handle_sigint=False) - await runner.run(task) - - -async def bot(runner_args: RunnerArguments): - """Main bot entry point compatible with Pipecat Cloud.""" - - transport = None - - if isinstance(runner_args, DailyRunnerArguments): - from pipecat.transports.services.daily import DailyParams, DailyTransport - - if os.environ.get("ENV") != "local": - from pipecat.audio.filters.krisp_filter import KrispFilter - - krisp_filter = KrispFilter() - else: - krisp_filter = None - - transport = DailyTransport( - runner_args.room_url, - runner_args.token, - "Pipecat Bot", - params=DailyParams( - audio_in_enabled=True, - audio_in_filter=krisp_filter, - audio_out_enabled=True, - vad_analyzer=SileroVADAnalyzer(), - ), - ) - - elif isinstance(runner_args, SmallWebRTCRunnerArguments): - from pipecat.transports.base_transport import TransportParams - from pipecat.transports.network.small_webrtc import SmallWebRTCTransport - - transport = SmallWebRTCTransport( - params=TransportParams( - audio_in_enabled=True, - audio_out_enabled=True, - vad_analyzer=SileroVADAnalyzer(), - ), - webrtc_connection=runner_args.webrtc_connection, - ) - else: - logger.error(f"Unsupported runner arguments type: {type(runner_args)}") - return - - if transport is None: - logger.error("Failed to create transport") - return - - await run_bot(transport) - - -if __name__ == "__main__": - from pipecat.runner.run import main - - main() diff --git a/examples/runner-examples/03-single-transport-bot.py b/examples/runner-examples/03-single-transport-bot.py deleted file mode 100644 index bfa2ca3d3..000000000 --- a/examples/runner-examples/03-single-transport-bot.py +++ /dev/null @@ -1,117 +0,0 @@ -# -# Copyright (c) 2024–2025, Daily -# -# SPDX-License-Identifier: BSD 2-Clause License -# - -"""Pipecat development runner example. - -This example has a single transport—SmallWebRTCTransport. - -Run it with:: - - python 03-single-transport-bot.py -""" - -import os - -from dotenv import load_dotenv -from loguru import logger - -from pipecat.audio.vad.silero import SileroVADAnalyzer -from pipecat.pipeline.pipeline import Pipeline -from pipecat.pipeline.runner import PipelineRunner -from pipecat.pipeline.task import PipelineParams, PipelineTask -from pipecat.processors.aggregators.openai_llm_context import OpenAILLMContext -from pipecat.processors.frameworks.rtvi import RTVIConfig, RTVIObserver, RTVIProcessor -from pipecat.runner.types import RunnerArguments -from pipecat.services.cartesia.tts import CartesiaTTSService -from pipecat.services.deepgram.stt import DeepgramSTTService -from pipecat.services.openai.llm import OpenAILLMService -from pipecat.transports.base_transport import BaseTransport, TransportParams -from pipecat.transports.network.small_webrtc import SmallWebRTCTransport - -load_dotenv(override=True) - - -async def run_bot(transport: BaseTransport): - """Main bot logic that works with any transport.""" - logger.info(f"Starting bot") - - stt = DeepgramSTTService(api_key=os.getenv("DEEPGRAM_API_KEY")) - - tts = CartesiaTTSService( - api_key=os.getenv("CARTESIA_API_KEY"), - voice_id="71a7ad14-091c-4e8e-a314-022ece01c121", # British Reading Lady - ) - - llm = OpenAILLMService(api_key=os.getenv("OPENAI_API_KEY")) - - messages = [ - { - "role": "system", - "content": "You are a friendly AI assistant. Respond naturally and keep your answers conversational.", - }, - ] - - context = OpenAILLMContext(messages) - context_aggregator = llm.create_context_aggregator(context) - - rtvi = RTVIProcessor(config=RTVIConfig(config=[])) - - pipeline = Pipeline( - [ - transport.input(), - rtvi, - stt, - context_aggregator.user(), - llm, - tts, - transport.output(), - context_aggregator.assistant(), - ] - ) - - task = PipelineTask( - pipeline, - params=PipelineParams( - enable_metrics=True, - enable_usage_metrics=True, - ), - observers=[RTVIObserver(rtvi)], - ) - - @transport.event_handler("on_client_connected") - async def on_client_connected(transport, client): - logger.info("Client connected") - messages.append({"role": "system", "content": "Say hello and briefly introduce yourself."}) - await task.queue_frames([context_aggregator.user().get_context_frame()]) - - @transport.event_handler("on_client_disconnected") - async def on_client_disconnected(transport, client): - logger.info("Client disconnected") - await task.cancel() - - runner = PipelineRunner(handle_sigint=False) - await runner.run(task) - - -async def bot(runner_args: RunnerArguments): - """Main bot entry point compatible with Pipecat Cloud.""" - - transport = SmallWebRTCTransport( - params=TransportParams( - audio_in_enabled=True, - audio_out_enabled=True, - vad_analyzer=SileroVADAnalyzer(), - ), - webrtc_connection=runner_args.webrtc_connection, - ) - - await run_bot(transport) - - -if __name__ == "__main__": - from pipecat.runner.run import main - - main() diff --git a/examples/runner-examples/Dockerfile b/examples/runner-examples/Dockerfile deleted file mode 100644 index 01ca0b133..000000000 --- a/examples/runner-examples/Dockerfile +++ /dev/null @@ -1,7 +0,0 @@ -FROM dailyco/pipecat-base:latest - -COPY ./requirements.txt requirements.txt - -RUN pip install --no-cache-dir --upgrade -r requirements.txt - -COPY ./02-two-transport-bot.py bot.py diff --git a/examples/runner-examples/build.sh b/examples/runner-examples/build.sh deleted file mode 100755 index d6cf6f8f2..000000000 --- a/examples/runner-examples/build.sh +++ /dev/null @@ -1,19 +0,0 @@ -#!/bin/bash -set -e - -VERSION="0.1" -DOCKER_USERNAME="your_docker_username" -AGENT_NAME="two-transport-bot" - -# Build the Docker image with the correct context -echo "Building Docker image..." -docker build --platform=linux/arm64 -t "$DOCKER_USERNAME/$AGENT_NAME:$VERSION" -t "$DOCKER_USERNAME/$AGENT_NAME:latest" . - -# Push the Docker images -echo "Pushing Docker image $DOCKER_USERNAME/$AGENT_NAME:$VERSION..." -docker push "$DOCKER_USERNAME/$AGENT_NAME:$VERSION" - -echo "Pushing Docker image $DOCKER_USERNAME/$AGENT_NAME:latest..." -docker push "$DOCKER_USERNAME/$AGENT_NAME:latest" - -echo "Successfully built and pushed $DOCKER_USERNAME/$AGENT_NAME:$VERSION and $DOCKER_USERNAME/$AGENT_NAME:latest" \ No newline at end of file diff --git a/examples/runner-examples/env.example b/examples/runner-examples/env.example deleted file mode 100644 index b3e882f5d..000000000 --- a/examples/runner-examples/env.example +++ /dev/null @@ -1,3 +0,0 @@ -DEEPGRAM_API_KEY=your_deepgram_api_key -OPENAI_API_KEY=your_openai_api_key -CARTESIA_API_KEY=your_cartesia_api_key \ No newline at end of file diff --git a/examples/runner-examples/pcc-deploy.toml b/examples/runner-examples/pcc-deploy.toml deleted file mode 100644 index 542d30983..000000000 --- a/examples/runner-examples/pcc-deploy.toml +++ /dev/null @@ -1,8 +0,0 @@ -agent_name = "two-transport-bot" -image = "your_dockerhub_username/two-transport-bot:0.1" -image_credentials = "dockerhub-access" -secret_set = "two-transport-bot-secrets" -enable_krisp = true - -[scaling] - min_agents = 0 diff --git a/examples/runner-examples/requirements.txt b/examples/runner-examples/requirements.txt deleted file mode 100644 index a38c9612a..000000000 --- a/examples/runner-examples/requirements.txt +++ /dev/null @@ -1 +0,0 @@ -pipecat-ai[openai,daily,deepgram,cartesia,silero,webrtc,websocket,runner] \ No newline at end of file