Spaces:
Sleeping
Sleeping
import argparse | |
import logging | |
import os | |
import time | |
from threading import Thread | |
from typing import Any, Mapping | |
from daily import EventHandler, CallClient, Daily | |
from datetime import datetime | |
from dotenv import load_dotenv | |
from auth import get_meeting_token, get_room_name | |
load_dotenv() | |
class DailyLLM(EventHandler): | |
def __init__( | |
self, | |
room_url=os.getenv("DAILY_URL"), | |
token=os.getenv("DAILY_TOKEN"), | |
bot_name="TestBot", | |
): | |
duration = os.getenv("BOT_MAX_DURATION") | |
if not duration: | |
duration = 300 | |
else: | |
duration = int(duration) | |
self.expiration = time.time() + duration | |
# room + bot details | |
self.room_url = room_url | |
room_name = get_room_name(room_url) | |
if token: | |
self.token = token | |
else: | |
self.token = get_meeting_token( | |
room_name, os.getenv("DAILY_API_KEY"), self.expiration | |
) | |
self.bot_name = bot_name | |
self.finished_talking_at = None | |
FORMAT = f"%(asctime)s {room_name} %(message)s" | |
logging.basicConfig(format=FORMAT) | |
self.logger = logging.getLogger("bot-instance") | |
self.logger.setLevel(logging.DEBUG) | |
self.logger.info(f"Joining as {self.bot_name}") | |
self.logger.info(f"Joining room {self.room_url}") | |
self.logger.info( | |
f"expiration: {datetime.utcfromtimestamp(self.expiration).strftime('%Y-%m-%d %H:%M:%S')}" | |
) | |
self.logger.info( | |
f"now: {datetime.utcfromtimestamp(time.time()).strftime('%Y-%m-%d %H:%M:%S')}" | |
) | |
self.my_participant_id = None | |
self.logger.info("configuring daily") | |
self.configure_daily() | |
self.stop_threads = False | |
self.image = None | |
#self.logger.info("starting camera thread") | |
#self.camera_thread = Thread(target=self.run_camera) | |
#self.camera_thread.start() | |
self.participant_left = False | |
self.last_fragment_at = None | |
try: | |
participant_count = len(self.client.participants()) | |
self.logger.info(f"{participant_count} participants in room") | |
while time.time() < self.expiration and not self.participant_left: | |
time.sleep(1) | |
except Exception as e: | |
self.logger.error(f"Exception {e}") | |
finally: | |
self.client.leave() | |
self.stop_threads = True | |
self.logger.info("Shutting down") | |
#self.camera_thread.join() | |
#self.logger.info("camera thread stopped") | |
#self.logger.info("Services closed.") | |
def configure_daily(self): | |
Daily.init() | |
self.client = CallClient(event_handler=self) | |
self.mic = Daily.create_microphone_device("mic", sample_rate=16000, channels=1) | |
self.speaker = Daily.create_speaker_device( | |
"speaker", sample_rate=16000, channels=1 | |
) | |
self.camera = Daily.create_camera_device( | |
"camera", width=1024, height=1024, color_format="RGB" | |
) | |
Daily.select_speaker_device("speaker") | |
self.client.set_user_name(self.bot_name) | |
self.client.join(self.room_url, completion=self.call_joined) | |
#self.client.join(self.room_url, self.token, completion=self.call_joined) | |
self.client.update_inputs( | |
{ | |
"camera": { | |
"isEnabled": True, | |
"settings": { | |
"deviceId": "camera", | |
"frameRate": 5, | |
}, | |
}, | |
"microphone": {"isEnabled": True, "settings": {"deviceId": "mic"}}, | |
} | |
) | |
self.my_participant_id = self.client.participants()["local"]["id"] | |
def call_joined(self, join_data, client_error): | |
self.logger.info(f"call_joined: {join_data}, {client_error}") | |
def on_participant_joined(self, participant): | |
self.logger.info(f"on_participant_joined: {participant}") | |
#self.client.send_app_message({"event": "story-id", "storyID": self.story_id}) | |
self.wave() | |
time.sleep(2) | |
def on_participant_left(self, participant, reason): | |
if len(self.client.participants()) < 2: | |
self.logger.info("participant left") | |
self.participant_left = True | |
def wave(self): | |
self.client.send_app_message( | |
{ | |
"event": "sync-emoji-reaction", | |
"reaction": { | |
"emoji": "👋", | |
"room": "main-room", | |
"sessionId": "bot", | |
"id": time.time(), | |
}, | |
} | |
) | |
if __name__ == "__main__": | |
parser = argparse.ArgumentParser(description="Daily LLM bot") | |
parser.add_argument("-u", "--url", type=str, help="URL of the Daily room") | |
parser.add_argument("-t", "--token", type=str, help="Token for Daily API") | |
parser.add_argument("-b", "--bot-name", type=str, help="Name of the bot") | |
args = parser.parse_args() | |
url = args.url or os.getenv("DAILY_URL") | |
bot_name = args.bot_name or "TestBot" | |
token = args.token or None | |
app = DailyLLM(url, token, bot_name) |