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 keyBalíč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
| Argument | Význam |
|---|---|
api_key | Tajný klíč (sk_live_...). Ve výchozím nastavení se použije THUNDERPHONE_API_KEY. |
agent_id | Spustí uloženého agenta. Vzájemně se vylučuje s product a voice. |
product | Modul pro vložené relace: spark, bolt nebo storm. |
voice | Název hlasu ThunderPhone pro vložené relace. |
language | Ná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_transcripts | Streamuje fragmenty přepisu volajícího během promluvy (účtováno navíc). |
greet_on_connect | Vyžádá první odpověď ihned, jakmile je relace připravena. |
end_task_on_call_ended | Odeš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.