ThunderPhone 2.0 je tady.Začnete bez obchodníka, od 2 ¢/min.Přečíst oznámení

Connect tools & data

Používejte ThunderPhone z Pipecatu

Spusťte hlasového agenta ThunderPhone jako službu převodu řeči na řeč v pipeline Pipecat s vlastním transportem a telefonií.

Pipecat je open-source framework pro vytváření hlasových agentů z kombinovatelných služeb. ThunderPhone se integruje jako LLM služba řeč–řeč: Pipecat odesílá zvuk volajícího, ThunderPhone vrací hlas agenta, přepisy a volání funkcí a přenosová vrstva Pipecatu (Daily, LiveKit, Twilio, WebRTC, místní mikrofon) přenáší zvuk. Rozpoznávání řeči, jazykový model, hlas, střídání mluvčích, 47 jazyků a nástroje běží v ThunderPhone.

Hovory uskutečněné tímto způsobem se zobrazují v historii hovorů a jsou účtovány minutovou sazbou vašeho produktu jako jakýkoli jiný hovor v reálném čase. Nejde o předplatné a není zapotřebí žádné telefonní číslo ThunderPhone.

Instalace

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

Balíček obaluje službu OpenAI Realtime v Pipecatu, protože Realtime WebSocket ThunderPhone používá stejný protokol. Vyžaduje pipecat-ai 1.8 nebo novější.

Spuštění uloženého agenta

Vše, co agent dělá (prompt, hlas, engine, jazyky, nástroje, pozdrav, kontroly ticha), se konfiguruje v ThunderPhone. Pipeline pouze přenáší 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))

Uložený agent zahájí hovor podle vlastního nastavení, takže služba nevyžaduje od Pipecatu úvodní odpověď. Pokud ji přesto chcete, předejte greet_on_connect=True.

Konfigurace relace přímo v kódu

Bez agent_id pocházejí instrukce a nástroje z kontextu Pipecatu, stejně jako u OpenAI. product vybírá engine a voice vybírá hlas 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"],
        )
    ]),
)

Relace konfigurované přímo v kódu řídí klient: agent promluví jako první, protože Pipecat vyžádá odpověď při přijetí kontextu, a během ticha zůstane zticha, dokud nepřidáte zprávu nebo nevyžádáte další odpověď.

Možnosti

ArgumentVýznam
api_keyTajný klíč (sk_live_...). Ve výchozím nastavení se použije THUNDERPHONE_API_KEY.
agent_idSpustí uloženého agenta. Vzájemně se vylučuje s product a voice.
productModul pro vložené relace: spark, bolt nebo storm.
voiceNázev hlasu ThunderPhone pro vložené relace.
languageNápověda pro primární jazyk vložených relací, např. es.
from_number, to_numberČísla, která se mají zaznamenat u hovoru, když pipeline obsluhuje telefonní linku.
live_transcriptsStreamuje fragmenty přepisu volajícího během promluvy (účtováno navíc).
greet_on_connectVyžádá první odpověď ihned, jakmile je relace připravena.
end_task_on_call_endedOdešle EndWorkerFrame, když ThunderPhone ukončí hovor (ve výchozím nastavení zapnuto).

Události

ThunderPhone přidává k protokolu v reálném čase události platformy. Služba je doručuje obslužným funkcím:

@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 se nastaví, jakmile je relace aktivní. Použijte jej s GET /v1/calls/{call_id} k načtení nahrávky, přepisu a hodnocení po hovoru.

Omezení

  • Detekce tahů probíhá na serveru a je vždy zapnutá; tahy řízené Pipecat (turn_detection=False) nejsou podporovány.
  • Funkce zaregistrované ve službě se spouštějí pouze pro vložené relace. Uložený agent spouští vlastní nástroje v ThunderPhone.
  • Zvuk je v obou směrech 16bitové mono PCM při 24 kHz.
  • Videosnímky jsou ignorovány.