From cc5bfa8af835c98299195665565a6e4e57c0bfcb Mon Sep 17 00:00:00 2001 From: Jon Taylor Date: Thu, 6 Jun 2024 20:22:35 +0200 Subject: [PATCH] removed helps and fixed linting --- examples/dialin-chatbot/bot_daily.py | 6 +- examples/dialin-chatbot/bot_runner.py | 18 ++-- examples/dialin-chatbot/daily_helpers.py | 130 ----------------------- 3 files changed, 13 insertions(+), 141 deletions(-) delete mode 100644 examples/dialin-chatbot/daily_helpers.py diff --git a/examples/dialin-chatbot/bot_daily.py b/examples/dialin-chatbot/bot_daily.py index 18bdf6e46..a3ebd8de8 100644 --- a/examples/dialin-chatbot/bot_daily.py +++ b/examples/dialin-chatbot/bot_daily.py @@ -24,8 +24,8 @@ load_dotenv(override=True) logger.remove(0) logger.add(sys.stderr, level="DEBUG") -daily_api_url = os.getenv("DAILY_API_URL", "api.daily.co/v1") -daily_api_key = os.getenv("DAILY_API_KEY") +daily_api_url = os.getenv("DAILY_API_URL", "https://api.daily.co/v1") +daily_api_key = os.getenv("DAILY_API_KEY", "") async def main(room_url: str, token: str, callId: str, callDomain: str, sipUri: str): @@ -44,7 +44,7 @@ async def main(room_url: str, token: str, callId: str, callDomain: str, sipUri: token, "Chatbot", DailyParams( - api_url=f"https://{daily_api_url}", + api_url=f"{daily_api_url}", api_key=daily_api_key, dialin_settings=diallin_settings, audio_in_enabled=True, diff --git a/examples/dialin-chatbot/bot_runner.py b/examples/dialin-chatbot/bot_runner.py index 8428eabfd..f5c9ece5a 100644 --- a/examples/dialin-chatbot/bot_runner.py +++ b/examples/dialin-chatbot/bot_runner.py @@ -2,14 +2,14 @@ bot_runner.py HTTP service that listens for incoming calls from either Daily or Twilio, -provisioning a room and starting a Pipecat bot in response. +provisioning a room and starting a Pipecat bot in response. Refer to README for more information. """ import os import argparse import subprocess -from daily_helpers import DailyRESTHelper, DailyRoomObject, DailyRoomProperties, DailyRoomSipParams, DailyRoomParams +from pipecat.transports.services.helpers.daily_rest import DailyRESTHelper, DailyRoomObject, DailyRoomProperties, DailyRoomSipParams, DailyRoomParams from fastapi import FastAPI, Request, HTTPException from fastapi.middleware.cors import CORSMiddleware from fastapi.responses import JSONResponse, PlainTextResponse @@ -26,8 +26,8 @@ REQUIRED_ENV_VARS = ['OPENAI_API_KEY', 'DAILY_API_KEY', 'ELEVENLABS_API_KEY', 'ELEVENLABS_VOICE_ID'] daily_rest_helper = DailyRESTHelper( - os.getenv("DAILY_API_KEY", None), - os.getenv("DAILY_API_URL", 'api.daily.co/v1')) + os.getenv("DAILY_API_KEY", ""), + os.getenv("DAILY_API_URL", 'https://api.daily.co/v1')) # ----------------- API ----------------- # @@ -48,7 +48,7 @@ When the vendor is Daily, the bot handles the call forwarding automatically, i.e, forwards the call from the "hold music state" to the Daily Room's SIP URI. Alternatively, when the vendor is Twilio (not Daily), the bot is responsible for -updating the state on Twilio. So when `dialin-ready` fires, it takes appropriate +updating the state on Twilio. So when `dialin-ready` fires, it takes appropriate action using the Twilio Client library. """ @@ -92,9 +92,11 @@ def _create_daily_room(room_url, callId, callDomain=None, vendor="daily"): # Spawn a new agent, and join the user session # Note: this is mostly for demonstration purposes (refer to 'deployment' in docs) if vendor == "daily": - bot_proc = f"python3 -m bot_daily -u {room.url} -t {token} -i {callId} -d {callDomain} -s {room.config.sip_endpoint}" + bot_proc = f"python3 -m bot_daily -u {room.url} -t {token} -i { + callId} -d {callDomain} -s {room.config.sip_endpoint}" else: - bot_proc = f"python3 -m bot_twilio -u {room.url} -t {token} -i {callId} -s {room.config.sip_endpoint}" + bot_proc = f"python3 -m bot_twilio -u {room.url} -t { + token} -i {callId} -s {room.config.sip_endpoint}" try: subprocess.Popen( @@ -119,7 +121,7 @@ async def twilio_start_bot(request: Request): # Click Configure and under Voice Configuration, # "a call comes in" choose webhook and point the URL to # where this code is hosted. - data = None + data = {} try: # shouldnt have received json, twilio sends form data form_data = await request.form() diff --git a/examples/dialin-chatbot/daily_helpers.py b/examples/dialin-chatbot/daily_helpers.py deleted file mode 100644 index f508f428c..000000000 --- a/examples/dialin-chatbot/daily_helpers.py +++ /dev/null @@ -1,130 +0,0 @@ - -""" -Daily Helpers - -Methods that wrap the Daily API to create rooms, check room URLs, and get meeting tokens. - -""" -import urllib.parse -import urllib -import requests -from typing import Literal, Optional -from time import time - -from pydantic import BaseModel, ValidationError - - -class DailyRoomSipParams(BaseModel): - display_name: str = "sw-sip-dialin" - video: bool = False - sip_mode: str = "dial-in" - num_endpoints: int = 1 - - -class DailyRoomProperties(BaseModel): - exp: float = time() + 5 * 60 - enable_chat: bool = False - enable_emoji_reactions: bool = False - eject_at_room_exp: bool = True - enable_dialout: Optional[bool] = None - sip: DailyRoomSipParams = None - sip_uri: dict = None - - @property - def sip_endpoint(self) -> str: - return "sip:%s" % self.sip_uri['endpoint'] - - -class DailyRoomParams(BaseModel): - name: Optional[str] = None - privacy: Literal['private', 'public'] = "public" - properties: DailyRoomProperties = DailyRoomProperties() - - -class DailyRoomObject(BaseModel): - id: str - name: str - api_created: bool - privacy: str - url: str - created_at: str - config: DailyRoomProperties - - -class DailyRESTHelper: - def __init__(self, daily_api_key: str, daily_api_url: str = "api.daily.co/v1"): - self.daily_api_key = daily_api_key - self.daily_api_url = daily_api_url - - def _get_name_from_url(self, room_url: str) -> str: - return urllib.parse.urlparse(room_url).path[1:] - - def create_room(self, params: DailyRoomParams) -> DailyRoomObject: - res = requests.post( - f"https://{self.daily_api_url}/rooms", - headers={"Authorization": f"Bearer {self.daily_api_key}"}, - json={**params.model_dump(exclude_none=True)} - ) - - if res.status_code != 200: - raise Exception(f"Unable to create room: {res.text}") - - data = res.json() - - try: - room = DailyRoomObject(**data) - except ValidationError as e: - raise Exception(f"Invalid response: {e}") - - return room - - def _get_room_from_name(self, room_name: str) -> DailyRoomObject: - res: requests.Response = requests.get( - f"https://{self.daily_api_url}/rooms/{room_name}", - headers={"Authorization": f"Bearer {self.daily_api_key}"} - ) - - if res.status_code != 200: - raise Exception(f"Room not found: {room_name}") - - data = res.json() - - try: - room = DailyRoomObject(**data) - except ValidationError as e: - raise Exception(f"Invalid response: {e}") - - return room - - def get_room_from_url(self, room_url: str,) -> DailyRoomObject: - room_name = self._get_name_from_url(room_url) - return self._get_room_from_name(room_name) - - def get_token(self, room_url: str, expiry_time: float = 60 * 60, owner: bool = True) -> str: - if not room_url: - raise Exception( - "No Daily room specified. You must specify a Daily room in order a token to be generated.") - - expiration: float = time() + expiry_time - - room_name = self._get_name_from_url(room_url) - - res: requests.Response = requests.post( - f"https://{self.daily_api_url}/meeting-tokens", - headers={ - "Authorization": f"Bearer {self.daily_api_key}"}, - json={ - "properties": { - "room_name": room_name, - "is_owner": owner, - "exp": expiration - }}, - ) - - if res.status_code != 200: - raise Exception( - f"Failed to create meeting token: {res.status_code} {res.text}") - - token: str = res.json()["token"] - - return token