From c522a1ad1a53e6ad19fa935619c2745430786087 Mon Sep 17 00:00:00 2001 From: Mark Backman Date: Thu, 29 May 2025 00:59:45 -0400 Subject: [PATCH] Fix OTel examples to use new runner --- examples/open-telemetry/daily_runner.py | 64 +++++++++++++++++++++++++ examples/open-telemetry/jaeger/bot.py | 4 +- examples/open-telemetry/langfuse/bot.py | 4 +- examples/open-telemetry/run.py | 24 ++++++++-- 4 files changed, 91 insertions(+), 5 deletions(-) create mode 100644 examples/open-telemetry/daily_runner.py diff --git a/examples/open-telemetry/daily_runner.py b/examples/open-telemetry/daily_runner.py new file mode 100644 index 000000000..04157d549 --- /dev/null +++ b/examples/open-telemetry/daily_runner.py @@ -0,0 +1,64 @@ +# +# Copyright (c) 2024–2025, Daily +# +# SPDX-License-Identifier: BSD 2-Clause License +# + +import argparse +import os +from typing import Optional + +import aiohttp + +from pipecat.transports.services.helpers.daily_rest import DailyRESTHelper + + +async def configure(aiohttp_session: aiohttp.ClientSession): + (url, token, _) = await configure_with_args(aiohttp_session) + return (url, token) + + +async def configure_with_args( + aiohttp_session: aiohttp.ClientSession, parser: Optional[argparse.ArgumentParser] = None +): + if not parser: + parser = argparse.ArgumentParser(description="Daily AI SDK Bot Sample") + parser.add_argument( + "-u", "--url", type=str, required=False, help="URL of the Daily room to join" + ) + parser.add_argument( + "-k", + "--apikey", + type=str, + required=False, + help="Daily API Key (needed to create an owner token for the room)", + ) + + args, unknown = parser.parse_known_args() + + url = args.url or os.getenv("DAILY_SAMPLE_ROOM_URL") + key = args.apikey or os.getenv("DAILY_API_KEY") + + if not url: + raise Exception( + "No Daily room specified. use the -u/--url option from the command line, or set DAILY_SAMPLE_ROOM_URL in your environment to specify a Daily room URL." + ) + + if not key: + raise Exception( + "No Daily API key specified. use the -k/--apikey option from the command line, or set DAILY_API_KEY in your environment to specify a Daily API key, available from https://dashboard.daily.co/developers." + ) + + daily_rest_helper = DailyRESTHelper( + daily_api_key=key, + daily_api_url=os.getenv("DAILY_API_URL", "https://api.daily.co/v1"), + aiohttp_session=aiohttp_session, + ) + + # Create a meeting token for the given room with an expiration 1 hour in + # the future. + expiry_time: float = 60 * 60 + + token = await daily_rest_helper.get_token(url, expiry_time) + + return (url, token, args) diff --git a/examples/open-telemetry/jaeger/bot.py b/examples/open-telemetry/jaeger/bot.py index 0fb8bfd2e..4bf2cd6e7 100644 --- a/examples/open-telemetry/jaeger/bot.py +++ b/examples/open-telemetry/jaeger/bot.py @@ -6,6 +6,7 @@ import argparse import os +import sys from dotenv import load_dotenv from loguru import logger @@ -162,6 +163,7 @@ async def run_example(transport: BaseTransport, _: argparse.Namespace, handle_si if __name__ == "__main__": - from ..run import main + sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), ".."))) + from run import main main(run_example, transport_params=transport_params) diff --git a/examples/open-telemetry/langfuse/bot.py b/examples/open-telemetry/langfuse/bot.py index eb1ed0748..c55f81b18 100644 --- a/examples/open-telemetry/langfuse/bot.py +++ b/examples/open-telemetry/langfuse/bot.py @@ -6,6 +6,7 @@ import argparse import os +import sys from dotenv import load_dotenv from loguru import logger @@ -159,6 +160,7 @@ async def run_example(transport: BaseTransport, _: argparse.Namespace, handle_si if __name__ == "__main__": - from ..run import main + sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), ".."))) + from run import main main(run_example, transport_params=transport_params) diff --git a/examples/open-telemetry/run.py b/examples/open-telemetry/run.py index 101efc96a..65a4e94b3 100644 --- a/examples/open-telemetry/run.py +++ b/examples/open-telemetry/run.py @@ -10,11 +10,10 @@ import json import os import sys from contextlib import asynccontextmanager -from typing import Callable, Dict, Mapping, Optional +from typing import Any, Callable, Dict, Mapping, Optional import aiohttp import uvicorn -from daily_runner import configure from dotenv import load_dotenv from fastapi import BackgroundTasks, FastAPI, WebSocket from fastapi.middleware.cors import CORSMiddleware @@ -22,7 +21,7 @@ from fastapi.responses import HTMLResponse, RedirectResponse from loguru import logger from pipecat.serializers.twilio import TwilioFrameSerializer -from pipecat.transports.base_transport import TransportParams +from pipecat.transports.base_transport import BaseTransport, TransportParams from pipecat.transports.network.fastapi_websocket import ( FastAPIWebsocketParams, FastAPIWebsocketTransport, @@ -35,6 +34,23 @@ from pipecat.transports.services.daily import DailyParams, DailyTransport load_dotenv(override=True) +def get_transport_client_id(transport: BaseTransport, client: Any) -> str: + if isinstance(transport, SmallWebRTCTransport): + return client.pc_id + elif isinstance(transport, DailyTransport): + return client["id"] + logger.warning(f"Unable to get client id from unsupported transport {type(transport)}") + return "" + + +async def maybe_capture_participant_video(transport: BaseTransport, client: Any): + if isinstance(transport, DailyTransport): + await transport.capture_participant_video(client["id"], framerate=0, video_source="camera") + await transport.capture_participant_video( + client["id"], framerate=0, video_source="screenVideo" + ) + + def run_example_daily( run_example: Callable, args: argparse.Namespace, @@ -42,6 +58,8 @@ def run_example_daily( ): logger.info("Running example with DailyTransport...") + from daily_runner import configure + async def run(): async with aiohttp.ClientSession() as session: (room_url, token) = await configure(session)