ThunderPhone 2.0 вече е тук.Започнете самостоятелно от 2¢/мин.Прочетете съобщението

Connect tools & data

Използвайте ThunderPhone от Pipecat

Изпълнявайте гласов агент на ThunderPhone като услуга за реч към реч в конвейер на Pipecat, със собствен транспорт и телефония.

Pipecat е рамка с отворен код за изграждане на гласови агенти от компонуеми услуги. ThunderPhone се включва като LLM услуга за говор към говор: Pipecat изпраща аудиото на обаждащия се, ThunderPhone връща гласа на агента, транскрипциите и извикванията на функции, а транспортът на Pipecat (Daily, LiveKit, Twilio, WebRTC, локален микрофон) пренася аудиото. Разпознаването на реч, езиковият модел, гласът, управлението на редуването в разговора, 47 езика и инструментите работят изцяло в ThunderPhone.

Обажданията, осъществени по този начин, се показват в историята на обажданията и се таксуват според тарифата на минута за вашия продукт, както всяко друго обаждане в реално време. Няма абонамент и не е необходим телефонен номер на ThunderPhone.

Инсталиране

pip install pipecat-thunderphone
export THUNDERPHONE_API_KEY=sk_live_...   # a secret API key

Пакетът обвива услугата OpenAI Realtime на Pipecat, защото Realtime WebSocket на ThunderPhone използва същия протокол. Необходим е pipecat-ai 1.8 или по-нова версия.

Стартиране на запазен агент

Всичко, което агентът прави (подкана, глас, механизъм, езици, инструменти, поздрав, проверки при тишина), се конфигурира в ThunderPhone. Конвейерът само пренася аудио.

from pipecat.pipeline.pipeline import Pipeline
from pipecat.pipeline.worker import PipelineParams, PipelineWorker
from pipecat.processors.aggregators.llm_context import LLMContext
from pipecat.processors.aggregators.llm_response_universal import LLMContextAggregatorPair
from pipecat_thunderphone import ThunderPhoneRealtimeLLMService
 
llm = ThunderPhoneRealtimeLLMService(agent_id=12)
 
context = LLMContext()
aggregators = LLMContextAggregatorPair(context)
pipeline = Pipeline([
    transport.input(),
    aggregators.user(),
    llm,
    aggregators.assistant(),
    transport.output(),
])
worker = PipelineWorker(pipeline, params=PipelineParams(allow_interruptions=True))

Запазеният агент започва обаждането по собствен график, затова услугата не заявява начална реплика от Pipecat. Подайте greet_on_connect=True, ако все пак искате такава.

Конфигуриране на сесията директно

Без agent_id инструкциите и инструментите идват от контекста на Pipecat, по същия начин както при OpenAI. product избира механизма, а voice избира гласа на ThunderPhone.

from pipecat.adapters.schemas.function_schema import FunctionSchema
from pipecat.adapters.schemas.tools_schema import ToolsSchema
from pipecat.services.llm_service import FunctionCallParams
 
llm = ThunderPhoneRealtimeLLMService(product="bolt", voice="olivia", language="es")
 
async def check_availability(params: FunctionCallParams):
    slots = await calendar.free_slots(params.arguments["date"])
    await params.result_callback({"slots": slots})
 
llm.register_function("check_availability", check_availability)
 
context = LLMContext(
    messages=[{"role": "system", "content": "You are Acme Dental's receptionist."}],
    tools=ToolsSchema(standard_tools=[
        FunctionSchema(
            name="check_availability",
            description="Free appointment slots on a date",
            properties={"date": {"type": "string"}},
            required=["date"],
        )
    ]),
)

Директните сесии се управляват от клиента: агентът говори първи, защото Pipecat заявява отговор, когато пристигне контекстът, и остава тих при тишина, освен ако не добавите съобщение или не заявите друг отговор.

Опции

АргументЗначение
api_keyТаен ключ (sk_live_...). По подразбиране е THUNDERPHONE_API_KEY.
agent_idСтартиране на запазен агент. Взаимно изключващ се с product и voice.
productМеханизъм за вградени сесии: spark, bolt или storm.
voiceИме на глас в ThunderPhone за вградени сесии.
languageПодсказка за основния език при вградени сесии, например es.
from_number, to_numberНомера, които да се записват в разговора, когато конвейерът е пред телефонна линия.
live_transcriptsПоточно предаване на фрагменти от транскрипцията на обаждащия се по време на изказването му (таксува се допълнително).
greet_on_connectЗаявяване на първи отговор веднага щом сесията е готова.
end_task_on_call_endedИзпращане на EndWorkerFrame, когато ThunderPhone приключи разговора (включено по подразбиране).

Събития

ThunderPhone добавя събития на платформата към протокола в реално време. Услугата ги предава на обработчиците:

@llm.event_handler("on_call_ended")
async def on_call_ended(service, event):
    print("call ended:", event["reason"], "call id:", service.call_id)

service.call_id се задава, след като сесията е активна. Използвайте го с GET /v1/calls/{call_id}, за да изтеглите записа, транскрипцията и оценката след разговора.

Ограничения

  • Разпознаването на реда за говорене се извършва от сървъра и винаги е включено; не се поддържат редове, управлявани от Pipecat (turn_detection=False).
  • Функциите, регистрирани в услугата, се изпълняват само за вградени сесии. Запазен агент изпълнява собствените си инструменти в ThunderPhone.
  • Аудиото е 16-битов моно PCM с 24 kHz и в двете посоки.
  • Видео кадрите се игнорират.