ThunderPhone 2.0 jau čia.Pradėkite savarankiškai – nuo 2 ¢ už minutę.Skaityti pranešimą

Connect tools & data

Naudokite ThunderPhone su Pipecat

Paleiskite ThunderPhone balso agentą kaip kalba į kalbą paslaugą Pipecat sraute, naudodami savo perdavimo ir telefonijos sprendimus.

Pipecat yra atvirojo kodo sistema, skirta balso agentams kurti iš komponuojamų paslaugų. ThunderPhone integruojasi kaip kalbos į kalbą LLM paslauga: Pipecat siunčia skambinančiojo garsą, ThunderPhone grąžina agento balsą, transkripcijas ir funkcijų iškvietimus, o Pipecat perdavimo mechanizmas („Daily“, „LiveKit“, „Twilio“, „WebRTC“, vietinis mikrofonas) perduoda garsą. Kalbos atpažinimas, kalbos modelis, balsas, pokalbio eiliškumo valdymas, 47 kalbos ir įrankiai veikia ThunderPhone.

Tokiu būdu atlikti skambučiai rodomi skambučių istorijoje ir apmokestinami pagal jūsų produkto minutės įkainį, kaip ir bet kuris kitas realaus laiko skambutis. Nereikia prenumeratos ar ThunderPhone telefono numerio.

Įdiegimas

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

Paketas apgaubia Pipecat „OpenAI Realtime“ paslaugą, nes ThunderPhone Realtime WebSocket naudoja tą patį protokolą. Jam reikia pipecat-ai 1.8 arba naujesnės versijos.

Paleiskite išsaugotą agentą

Viskas, ką atlieka agentas (nurodymai, balsas, variklis, kalbos, įrankiai, pasisveikinimas, tylos patikrinimai), konfigūruojama ThunderPhone. Konvejeris tik perduoda garsą.

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))

Išsaugotas agentas pradeda skambutį pagal savo tvarkaraštį, todėl paslauga neprašo Pipecat pradinio atsakymo. Perduokite greet_on_connect=True, jei vis tiek jo norite.

Konfigūruokite sesiją įterptuoju būdu

Nenaudojant agent_id, nurodymai ir įrankiai gaunami iš Pipecat konteksto, taip pat kaip ir naudojant OpenAI. product parenka variklį, o voice parenka ThunderPhone balsą.

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"],
        )
    ]),
)

Įterptosios sesijos valdomos kliento: agentas kalba pirmas, nes Pipecat prašo atsakymo, kai gaunamas kontekstas, ir tyli tylos metu, nebent pridėtumėte pranešimą arba paprašytumėte kito atsakymo.

Parinktys

ArgumentasReikšmė
api_keySlaptasis raktas (sk_live_...). Numatytoji reikšmė – THUNDERPHONE_API_KEY.
agent_idPaleisti išsaugotą agentą. Negalima naudoti kartu su product ir voice.
productĮterptinių sesijų variklis: spark, bolt arba storm.
voiceThunderPhone balso pavadinimas įterptinėms sesijoms.
languagePagrindinės kalbos nuoroda įterptinėms sesijoms, pvz., es.
from_number, to_numberNumeriai, kuriuos reikia įrašyti į skambučio duomenis, kai apdorojimo seka aptarnauja telefono liniją.
live_transcriptsTransliuoti skambinančiojo transkripcijos fragmentus nebaigus pasisakymo (taikomas papildomas mokestis).
greet_on_connectPaprašyti pirmojo atsakymo, kai tik sesija bus paruošta.
end_task_on_call_endedSiųsti EndWorkerFrame, kai ThunderPhone baigia skambutį (įjungta pagal numatytuosius nustatymus).

Įvykiai

ThunderPhone prie realaus laiko protokolo prideda platformos įvykius. Paslauga perduoda juos tvarkyklėms:

@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 nustatomas, kai sesija tampa aktyvi. Naudokite jį su GET /v1/calls/{call_id}, kad po skambučio gautumėte įrašą, transkripciją ir įvertinimą.

Apribojimai

  • Pasisakymų aptikimas vykdomas serveryje ir visada įjungtas; Pipecat valdomi pasisakymai (turn_detection=False) nepalaikomi.
  • Paslaugoje užregistruotos funkcijos vykdomos tik įterptinėse sesijose. Išsaugotas agentas ThunderPhone vykdo savo įrankius.
  • Garsas abiem kryptimis yra 16 bitų vieno kanalo PCM, 24 kHz.
  • Vaizdo kadrai ignoruojami.