Користите ThunderPhone из Pipecat-а
Покрените ThunderPhone гласовног агента као услугу говор-у-говор унутар Pipecat цевовода, са сопственим транспортом и телефонијом.
Pipecat је оквир отвореног кода за изградњу гласовних агената од састављивих услуга. ThunderPhone се интегрише као LLM услуга за говор у говор: Pipecat шаље звук позиваоца, ThunderPhone враћа глас агента, транскрипте и позиве функција, а Pipecat пренос (Daily, LiveKit, Twilio, WebRTC, локални микрофон) преноси звук. Препознавање говора, језички модел, глас, смењивање у разговору, 47 језика и алати раде на ThunderPhone-у.
Позиви обављени на овај начин појављују се у историји позива и наплаћују се по цени по минуту Вашег производа као и сваки други позив у реалном времену. Не постоји претплата нити је укључен ThunderPhone телефонски број.
Инсталирајте
pip install pipecat-thunderphone
export THUNDERPHONE_API_KEY=sk_live_... # a secret API keyПакет обавија Pipecat-ову OpenAI Realtime услугу, јер ThunderPhone-ов
Realtime WebSocket користи исти протокол. Потребан је
pipecat-ai 1.8 или новији.
Покрените сачуваног агента
Све што агент ради (упутство, глас, погон, језици, алати, поздрав, провере тишине) конфигурише се на ThunderPhone-у. Цевовод само преноси звук.
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))Сачувани агент самостално започиње позив према сопственом распореду, па услуга не
захтева почетни одговор од Pipecat-а. Проследите greet_on_connect=True ако га
ипак желите.
Конфигуришите сесију у линији
Без agent_id, упутства и алати долазе из Pipecat контекста, на
исти начин као за OpenAI. product бира погон, а voice бира
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"],
)
]),
)Сесијама у линији управља клијент: агент говори први јер Pipecat захтева одговор када контекст стигне и остаје тих током тишине осим ако не додате поруку или не затражите други одговор.
Опције
| Аргумент | Значење |
|---|---|
api_key | Тајни кључ (sk_live_...). Подразумевано је THUNDERPHONE_API_KEY. |
agent_id | Покрените сачуваног агента. Узајамно се искључује са product и voice. |
product | Механизам за уграђене сесије: spark, bolt или storm. |
voice | Назив ThunderPhone гласа за уграђене сесије. |
language | Назнака примарног језика за уграђене сесије, нпр. es. |
from_number, to_number | Бројеви за евидентирање у позиву када процес обрађује телефонску линију. |
live_transcripts | Стримујте делове транскрипта позиваоца током изговора (додатно се наплаћује). |
greet_on_connect | Затражите први одговор чим сесија буде спремна. |
end_task_on_call_ended | Пошаљите EndWorkerFrame када ThunderPhone заврши позив (подразумевано укључено). |
Догађаји
ThunderPhone додаје догађаје платформе поврх протокола у реалном времену. Услуга их испоручује обрађивачима:
@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 се поставља када сесија постане активна. Користите га са
GET /v1/calls/{call_id} да бисте преузели снимак,
транскрипт и оцену након позива.
Ограничења
- Детекција смене говора се извршава на серверу и увек је укључена; смене које
покреће Pipecat (
turn_detection=False) нису подржане. - Функције регистроване у услузи извршавају се само за уграђене сесије. Сачувани агент извршава сопствене алате у ThunderPhone-у.
- Аудио је 16-битни моно PCM на 24 kHz у оба смера.
- Видео-кадрови се занемарују.