Jon Taylor
first commit
bd1c43c
raw
history blame
5.21 kB
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)