import asyncio import aiohttp import logging import os from dailyai.pipeline.aggregators import ( LLMResponseAggregator, UserResponseAggregator, ) from dailyai.pipeline.pipeline import Pipeline from dailyai.services.ai_services import FrameLogger from dailyai.transports.daily_transport import DailyTransport from dailyai.services.open_ai_services import OpenAILLMService from dailyai.services.elevenlabs_ai_service import ElevenLabsTTSService from runner import configure from dotenv import load_dotenv load_dotenv(override=True) logging.basicConfig(format=f"%(levelno)s %(asctime)s %(message)s") logger = logging.getLogger("dailyai") logger.setLevel(logging.DEBUG) async def main(room_url: str, token): async with aiohttp.ClientSession() as session: transport = DailyTransport( room_url, token, "Respond bot", duration_minutes=5, start_transcription=True, mic_enabled=True, mic_sample_rate=16000, camera_enabled=False, vad_enabled=True, ) tts = ElevenLabsTTSService( aiohttp_session=session, api_key=os.getenv("ELEVENLABS_API_KEY"), voice_id=os.getenv("ELEVENLABS_VOICE_ID"), ) llm = OpenAILLMService( api_key=os.getenv("OPENAI_API_KEY"), model="gpt-4-turbo-preview") pipeline = Pipeline([FrameLogger(), llm, FrameLogger(), tts]) @transport.event_handler("on_first_other_participant_joined") async def on_first_other_participant_joined(transport): await transport.say("Hi, I'm listening!", tts) async def run_conversation(): messages = [ { "role": "system", "content": "You are a helpful LLM in a WebRTC call. Your goal is to demonstrate your capabilities in a succinct way. Your output will be converted to audio. Respond to what the user said in a creative and helpful way.", }, ] await transport.run_interruptible_pipeline( pipeline, post_processor=LLMResponseAggregator(messages), pre_processor=UserResponseAggregator(messages), ) transport.transcription_settings["extra"]["punctuate"] = False await asyncio.gather(transport.run(), run_conversation()) if __name__ == "__main__": (url, token) = configure() asyncio.run(main(url, token))