ThunderPhone 2.0 on nyt julkaistu.Ota käyttöön itse – alkaen 2¢/min.Lue lisää julkistuksesta

Connect tools & data

Käytä ThunderPhonea Pipecatista

Käytä ThunderPhone-puheagenttia puheesta puheeseen -palveluna Pipecat-putkessa oman siirtoyhteytesi ja puhelininfrastruktuurisi kanssa.

Pipecat on avoimen lähdekoodin kehys, jolla voi rakentaa puheagentteja yhdisteltävistä palveluista. ThunderPhone liitetään siihen puheesta puheeksi -LLM-palveluna: Pipecat lähettää soittajan äänen, ThunderPhone palauttaa agentin äänen, litteroinnit ja funktiokutsut, ja Pipecatin siirtokerros (Daily, LiveKit, Twilio, WebRTC, paikallinen mikrofoni) välittää äänen. Puheentunnistus, kielimalli, ääni, vuorottelu, 47 kieltä ja työkalut toimivat kaikki ThunderPhonessa.

Näin tehdyt puhelut näkyvät puheluhistoriassa, ja niistä veloitetaan tuotteesi minuuttihinnan mukaan kuten muistakin reaaliaikaisista puheluista. Tilauksia tai ThunderPhone-puhelinnumeroa ei tarvita.

Asenna

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

Paketti käärii Pipecatin OpenAI Realtime -palvelun, koska ThunderPhonen Realtime WebSocket käyttää samaa protokollaa. Se vaatii pipecat-ai-version 1.8 tai uudemman.

Suorita tallennettu agentti

Kaikki, mitä agentti tekee (kehote, ääni, moottori, kielet, työkalut, tervehdys, hiljaisuuden tarkistukset), määritetään ThunderPhonessa. Putki siirtää vain ääntä.

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

Tallennettu agentti aloittaa puhelun oman ajoituksensa mukaisesti, joten palvelu ei pyydä Pipecatilta aloitusvastausta. Välitä greet_on_connect=True, jos haluat sellaisen silti.

Määritä istunto suoraan

Ilman agent_id-tunnistetta ohjeet ja työkalut tulevat Pipecat-kontekstista samalla tavalla kuin OpenAI:ssa. product valitsee moottorin ja voice valitsee ThunderPhone-äänen.

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

Suoraan määritetyt istunnot ovat asiakkaan ohjaamia: agentti puhuu ensin, koska Pipecat pyytää vastausta, kun konteksti saapuu, ja pysyy hiljaa hiljaisuuden aikana, ellet lisää viestiä tai pyydä uutta vastausta.

Vaihtoehdot

ArgumenttiMerkitys
api_keySalainen avain (sk_live_...). Oletusarvo on THUNDERPHONE_API_KEY.
agent_idSuorita tallennettu agentti. Ei voi käyttää yhdessä arvojen product ja voice kanssa.
productMoottori sisäisille istunnoille: spark, bolt tai storm.
voiceThunderPhone-puheäänen nimi sisäisille istunnoille.
languageEnsisijaisen kielen vihje sisäisille istunnoille, esimerkiksi es.
from_number, to_numberPuheluun tallennettavat numerot, kun putkisto toimii puhelinlinjan edessä.
live_transcriptsSuoratoista soittajan litteroinnin osia kesken lausuman (lisäveloitus).
greet_on_connectPyydä ensimmäinen vastaus heti, kun istunto on valmis.
end_task_on_call_endedLähetä EndWorkerFrame, kun ThunderPhone päättää puhelun (oletusarvoisesti käytössä).

Tapahtumat

ThunderPhone lisää alustan tapahtumia reaaliaikaprotokollan päälle. Palvelu välittää ne käsittelijöille:

@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 asetetaan, kun istunto on käynnissä. Käytä sitä yhdessä GET /v1/calls/{call_id}-päätepisteen kanssa hakeaksesi tallenteen, litteroinnin ja arvioinnin puhelun jälkeen.

Rajoitukset

  • Vuoron tunnistus tehdään palvelinpuolella ja se on aina käytössä; Pipecatin ohjaamia vuoroja (turn_detection=False) ei tueta.
  • Palveluun rekisteröidyt funktiot suoritetaan vain sisäisissä istunnoissa. Tallennettu agentti suorittaa omat työkalunsa ThunderPhonessa.
  • Ääni on 16-bittistä monofonista PCM-ääntä 24 kHz:n taajuudella molempiin suuntiin.
  • Videokehykset ohitetaan.