ThunderPhone 2.0 jest już dostępny.Uruchom samodzielnie — od 2 centów/min.Przeczytaj komunikat

Connect tools & data

Używaj ThunderPhone z Pipecat

Uruchom głosowego agenta ThunderPhone jako usługę mowa-mowa w pipeline Pipecat, korzystając z własnego transportu i telefonii.

Pipecat to otwartoźródłowy framework do tworzenia agentów głosowych z komponowalnych usług. ThunderPhone integruje się jako usługa LLM mowa-na-mowę: Pipecat wysyła dźwięk rozmówcy, ThunderPhone zwraca głos agenta, transkrypcje i wywołania funkcji, a transport Pipecat (Daily, LiveKit, Twilio, WebRTC, lokalny mikrofon) przesyła dźwięk. Rozpoznawanie mowy, model językowy, głos, obsługa zmian tur, 47 języków i narzędzia działają w ThunderPhone.

Połączenia wykonane w ten sposób pojawiają się w historii połączeń i są rozliczane według stawki za minutę Twojego produktu, tak jak każde inne połączenie w czasie rzeczywistym. Nie wymagają subskrypcji ani numeru telefonu ThunderPhone.

Instalacja

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

Pakiet opakowuje usługę OpenAI Realtime w Pipecat, ponieważ Realtime WebSocket ThunderPhone korzysta z tego samego protokołu. Wymaga pipecat-ai 1.8 lub nowszego.

Uruchom zapisanego agenta

Wszystko, co robi agent (prompt, głos, silnik, języki, narzędzia, powitanie, komunikaty podczas ciszy), konfiguruje się w ThunderPhone. Pipeline jedynie przesyła dźwięk.

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

Zapisany agent rozpoczyna połączenie zgodnie z własnym harmonogramem, więc usługa nie żąda od Pipecat odpowiedzi otwierającej. Przekaż greet_on_connect=True, jeśli mimo to chcesz ją uzyskać.

Skonfiguruj sesję bezpośrednio w kodzie

Bez agent_id instrukcje i narzędzia pochodzą z kontekstu Pipecat, tak jak w przypadku OpenAI. product wybiera silnik, a voice wybiera głos 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"],
        )
    ]),
)

Sesje konfigurowane bezpośrednio w kodzie są sterowane przez klienta: agent mówi pierwszy, ponieważ Pipecat żąda odpowiedzi po otrzymaniu kontekstu, i pozostaje cichy podczas ciszy, chyba że dodasz wiadomość lub zażądasz kolejnej odpowiedzi.

Opcje

ArgumentZnaczenie
api_keyTajny klucz (sk_live_...). Domyślnie THUNDERPHONE_API_KEY.
agent_idUruchamia zapisanego agenta. Wzajemnie wyklucza się z product i voice.
productSilnik dla sesji inline: spark, bolt lub storm.
voiceNazwa głosu ThunderPhone dla sesji inline.
languageWskazówka dotycząca głównego języka dla sesji inline, np. es.
from_number, to_numberNumery do zarejestrowania w połączeniu, gdy pipeline obsługuje linię telefoniczną.
live_transcriptsPrzesyłaj fragmenty transkrypcji rozmówcy w trakcie wypowiedzi (dodatkowo płatne).
greet_on_connectZażądaj pierwszej odpowiedzi, gdy tylko sesja będzie gotowa.
end_task_on_call_endedWyślij EndWorkerFrame, gdy ThunderPhone zakończy połączenie (domyślnie włączone).

Zdarzenia

ThunderPhone dodaje zdarzenia platformy do protokołu czasu rzeczywistego. Usługa przekazuje je do procedur obsługi:

@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 jest ustawiane, gdy sesja jest aktywna. Użyj go z GET /v1/calls/{call_id}, aby pobrać nagranie, transkrypcję i ocenę po połączeniu.

Limity

  • Wykrywanie tur odbywa się po stronie serwera i jest zawsze włączone; tury sterowane przez Pipecat (turn_detection=False) nie są obsługiwane.
  • Funkcje zarejestrowane w usłudze działają tylko w sesjach inline. Zapisany agent uruchamia własne narzędzia w ThunderPhone.
  • Dźwięk to 16-bitowy monofoniczny PCM o częstotliwości 24 kHz w obu kierunkach.
  • Klatki wideo są ignorowane.