ThunderPhone 2.0 je stigao.Samostalno, već od 2 centa/min.Pročitajte objavu

Connect tools & data

Upotrebljavajte ThunderPhone iz Pipecata

Pokrenite glasovnog agenta ThunderPhone kao uslugu govora u govor unutar Pipecat cjevovoda, uz vlastiti prijenos i telefoniju.

Pipecat je framework otvorenog koda za izradu glasovnih agenata od sastavljivih usluga. ThunderPhone se povezuje kao LLM usluga govor-u-govor: Pipecat šalje zvuk pozivatelja, ThunderPhone vraća glas agenta, transkripte i pozive funkcija, a Pipecatov transport (Daily, LiveKit, Twilio, WebRTC, lokalni mikrofon) prenosi zvuk. Prepoznavanje govora, jezični model, glas, izmjena redova govora, 47 jezika i alati pokreću se na ThunderPhoneu.

Ovako upućeni pozivi prikazuju se u povijesti poziva i naplaćuju se prema cijeni po minuti vašeg proizvoda, kao i svaki drugi poziv u stvarnom vremenu. Nema pretplate niti je uključen telefonski broj ThunderPhonea.

Instalacija

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

Paket omata Pipecatovu uslugu OpenAI Realtime jer ThunderPhoneov Realtime WebSocket koristi isti protokol. Potreban mu je pipecat-ai 1.8 ili noviji.

Pokrenite spremljenog agenta

Sve što agent radi (prompt, glas, engine, jezici, alati, pozdrav, provjere tišine) konfigurira se na ThunderPhoneu. Cjevovod samo prenosi zvuk.

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

Spremljeni agent započinje poziv prema vlastitom rasporedu, pa usluga ne zahtijeva početni odgovor od Pipecata. Proslijedite greet_on_connect=True ako ga ipak želite.

Konfigurirajte sesiju izravno u kodu

Bez agent_id, upute i alati dolaze iz Pipecatova konteksta, na isti način kao za OpenAI. product odabire engine, a voice odabire ThunderPhoneov glas.

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

Sesijama u kodu upravlja klijent: agent govori prvi jer Pipecat zahtijeva odgovor kada kontekst stigne te ostaje tih tijekom tišine, osim ako dodate poruku ili zatražite drugi odgovor.

Opcije

ArgumentZnačenje
api_keyTajni ključ (sk_live_...). Zadana vrijednost je THUNDERPHONE_API_KEY.
agent_idPokrenite spremljenog agenta. Uzajamno se isključuje s product i voice.
productPokretač za ugrađene sesije: spark, bolt ili storm.
voiceNaziv glasa ThunderPhone za ugrađene sesije.
languagePrimarni jezični savjet za ugrađene sesije, npr. es.
from_number, to_numberBrojevi za bilježenje u pozivu kada niz za obradu upravlja telefonskom linijom.
live_transcriptsStrujno šaljite dijelove prijepisa pozivatelja tijekom izgovaranja (dodatno se naplaćuje).
greet_on_connectZatražite prvi odgovor čim sesija bude spremna.
end_task_on_call_endedPošaljite EndWorkerFrame kada ThunderPhone završi poziv (zadano uključeno).

Događaji

ThunderPhone dodaje događaje platforme povrh protokola u stvarnom vremenu. Usluga ih šalje obrađivačima:

@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 postavlja se kada sesija postane aktivna. Upotrijebite ga s GET /v1/calls/{call_id} za dohvaćanje snimke, prijepisa i ocjene nakon poziva.

Ograničenja

  • Prepoznavanje izmjene govornika odvija se na poslužitelju i uvijek je uključeno; izmjene kojima upravlja Pipecat (turn_detection=False) nisu podržane.
  • Funkcije registrirane u usluzi pokreću se samo za ugrađene sesije. Spremljeni agent pokreće vlastite alate na ThunderPhoneu.
  • Zvuk je 16-bitni mono PCM pri 24 kHz u oba smjera.
  • Videookviri se zanemaruju.