File size: 4,624 Bytes
1366db9
 
 
 
 
 
 
 
 
 
 
f5c6733
1366db9
f5c6733
1366db9
 
 
 
 
 
 
 
 
 
 
f5c6733
1366db9
f5c6733
 
 
1366db9
 
 
f5c6733
 
1366db9
 
 
 
 
f5c6733
 
1366db9
 
 
 
 
 
 
 
 
 
 
f5c6733
 
1366db9
 
 
 
 
 
 
 
f5c6733
1366db9
f5c6733
 
1366db9
f5c6733
1366db9
 
f5c6733
1366db9
f5c6733
1366db9
 
 
f5c6733
 
 
 
 
 
 
 
1366db9
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
f5c6733
1366db9
 
 
 
 
 
 
f5c6733
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
#
# Copyright (c) 2024–2025, Daily
#
# SPDX-License-Identifier: BSD 2-Clause License
#
import argparse
import asyncio
import os
import sys
from loguru import logger

from call_connection_manager import CallConfigManager
from pipecat.audio.vad.silero import SileroVADAnalyzer
from pipecat.frames.frames import EndTaskFrame, LLMMessagesFrame
from pipecat.pipeline.pipeline import Pipeline
from pipecat.pipeline.runner import PipelineRunner
from pipecat.pipeline.task import PipelineParams, PipelineTask
from pipecat.processors.aggregators.openai_llm_context import OpenAILLMContext
from pipecat.services.cartesia.tts import CartesiaTTSService
from pipecat.services.openai.llm import OpenAILLMService
from pipecat.transports.services.daily import DailyDialinSettings, DailyParams, DailyTransport

logger.remove(0)
logger.add(sys.stderr, level="DEBUG")

async def main(room_url: str, token: str, body: dict):
    call_config_manager = CallConfigManager.from_json_string(body) if body else CallConfigManager()
    caller_info = call_config_manager.get_caller_info()
    caller_number = caller_info["caller_number"]
    dialed_number = caller_info["dialed_number"]
    test_mode = call_config_manager.is_test_mode()
    dialin_settings = call_config_manager.get_dialin_settings()

    logger.info(f"Caller number: {caller_number}")
    logger.info(f"Dialed number: {dialed_number}")

    # ------------ TRANSPORT SETUP ------------
    if test_mode:
        logger.info("Running in test mode")
        transport_params = DailyParams(
            api_url=os.environ.get("DAILY_API_URL", "https://api.daily.co/v1"),
            api_key=os.environ.get("HF_DAILY_API_KEY", ""),
            audio_in_enabled=True,
            audio_out_enabled=True,
            video_out_enabled=False,
            vad_analyzer=SileroVADAnalyzer(),
            transcription_enabled=True,
        )
    else:
        daily_dialin_settings = DailyDialinSettings(
            call_id=dialin_settings.get("call_id"), call_domain=dialin_settings.get("call_domain")
        )
        transport_params = DailyParams(
            api_url=os.environ.get("DAILY_API_URL", "https://api.daily.co/v1"),
            api_key=os.environ.get("HF_DAILY_API_KEY", ""),
            dialin_settings=daily_dialin_settings,
            audio_in_enabled=True,
            audio_out_enabled=True,
            video_out_enabled=False,
            vad_analyzer=SileroVADAnalyzer(),
            transcription_enabled=True,
        )

    transport = DailyTransport(room_url, token, "Simple Dialin Bot", transport_params)
    tts = CartesiaTTSService(
        api_key=os.environ.get("HF_CARTESIA_API_KEY", ""),
        voice_id="b7d50908-b17c-442d-ad8d-810c63997ed9",
    )
    llm = OpenAILLMService(api_key=os.environ.get("HF_OPENAI_API_KEY"))

    # ------------ LLM AND CONTEXT SETUP ------------
    system_instruction = """You are a friendly, helpful robot. Greet the user and ask how you can assist them."""
    messages = [call_config_manager.create_system_message(system_instruction)]
    context = OpenAILLMContext(messages)
    context_aggregator = llm.create_context_aggregator(context)

    # ------------ PIPELINE SETUP ------------
    pipeline = Pipeline([
        transport.input(),
        context_aggregator.user(),
        llm,
        tts,
        transport.output(),
        context_aggregator.assistant(),
    ])

    task = PipelineTask(pipeline, params=PipelineParams(allow_interruptions=True))

    @transport.event_handler("on_first_participant_joined")
    async def on_first_participant_joined(transport, participant):
        await transport.capture_participant_transcription(participant["id"])
        await task.queue_frames([context_aggregator.user().get_context_frame()])

    @transport.event_handler("on_participant_left")
    async def on_participant_left(transport, participant, reason):
        logger.debug(f"Participant left: {participant}, reason: {reason}")
        await task.cancel()

    # ------------ RUN PIPELINE ------------
    runner = PipelineRunner()
    await runner.run(task)

if __name__ == "__main__":
    parser = argparse.ArgumentParser(description="Pipecat Simple Dialin Bot")
    parser.add_argument("-u", "--url", type=str, help="Room URL")
    parser.add_argument("-t", "--token", type=str, help="Room Token")
    parser.add_argument("-b", "--body", type=str, help="JSON configuration string")
    args = parser.parse_args()
    logger.info(f"Room URL: {args.url}")
    logger.info(f"Token: {args.token}")
    logger.info(f"Body provided: {bool(args.body)}")
    asyncio.run(main(args.url, args.token, args.body))