ThunderPhone 2.0 jau čia.Viską atlikite savarankiškai – nuo 2 ct/min.Skaityti pranešimą

Connect tools & data

Naudokite ThunderPhone su OpenAI Realtime klientais

Nukreipkite su OpenAI Realtime suderinamą serverio klientą į ThunderPhone, naudodami išsaugotą agentą arba įterptinę sesijos konfigūraciją.

ThunderPhone įgyvendina tikslinį OpenAI Realtime įvykių modelio poaibį. Esamas serverio pusės klientas gali išlaikyti savo WebSocket, garso, sesijos ir atsako įvykių srautą naudodamas ThunderPhone balso agentą.

Prieš prisijungdami

Jums reikia ThunderPhone organizacijos slaptojo API rakto ir serverio vykdymo aplinkos, galinčios atidaryti WebSocket ryšius. Nejunkite iš naršyklės kodo ir neatskleiskite rakto naršyklei. Norėdami naudoti išsaugotą agentą, pirmiausia jį įdiekite ir nukopijuokite jo skaitinį agento ID.

Prisijunkite prie:

wss://api.thunderphone.com/v1/realtime

Autentifikuokite WebSocket atnaujinimą iš savo serverio:

Authorization: Bearer sk_live_YOUR_API_KEY

Užklausos eilutės autentifikavimas galimas klientams, kurie negali nustatyti prisijungimo antraščių, tačiau URL lengviau patenka į žurnalus.

Pasirinkite, kam priklauso konfigūracija

RežimasPrisijunkite naudodamiKonfigūracijos šaltinis
Išsaugotas agentas?agent_id=12Įdiegta instrukcija, balsas, produktas, kalbos, žinių bazė ir suderinami serveryje vykdomi įrankiai
ĮterptinisBe agent_idPirmasis iš jūsų kliento priimtas session.update

Išsaugotas agentas

Prisijunkite naudodami įdiegto agento ID:

wss://api.thunderphone.com/v1/realtime?agent_id=12

Agentas paleidžiamas jungiantis lizdu. Jo pasisveikinimas lieka pasiekiamas, tačiau Realtime išjungia jo sakytinius tylos patikrinimus ir neįtraukia transfer_call bei send_keypad_input. Kiti suderinami įrankiai vykdomi ThunderPhone. Šiam režimui nesiųskite įterptinių instrukcijų ar kliento vykdomų įrankių.

Prieš paleidžiant agentą nustatykite perdavimo garso parametrus naudodami input_audio_format, output_audio_format, input_rate ir output_rate užklausos parametrus. Po prisijungimo negalite keisti išsaugotos konfigūracijos ar garso formatų.

Įterptinė sesija

Be agent_id, palaukite session.created, tada siųskite session.update:

{
  "type": "session.update",
  "session": {
    "type": "realtime",
    "instructions": "Answer questions clearly and keep responses brief.",
    "audio": {
      "input": {
        "format": { "type": "audio/pcm", "rate": 24000 }
      },
      "output": {
        "format": { "type": "audio/pcm", "rate": 24000 },
        "voice": "olivia"
      }
    },
    "config": {
      "product": "bolt"
    }
  }
}

Pirmasis priimtas atnaujinimas parengia skambutį. session.updated reiškia, kad sesija aktyvi. Po to instrukcijų, balso, produkto, įrankių ir garso formatų keisti negalima.

Įterptinės sesijos neturi automatinio pasisveikinimo ar sakytinių tylos patikrinimų. Kad agentas pradėtų kalbėti pirmas, pridėkite sistemos arba naudotojo pranešimą ir siųskite response.create. Visiškai neaktyvi sesija vis tiek baigiasi pasiekus platformos tylaus skambučio ribą, kuri pagal numatytuosius nustatymus yra 600 sekundžių.

Naudokite oficialų OpenAI SDK

Nurodykite WebSocket bazinį URL, kuris baigiasi /v1; SDK prideda /realtime. model reikšmė yra suderinamumo pavadinimas ir nepasirenka ThunderPhone produkto. Produktą pasirinkite sesijos konfigūracijoje arba išsaugotame agente.

Ši ryšio patikra sukuria įterptinę Bolt sesiją, išveda įvykius iki pirmojo session.updated ir užsidaro. Garsui transliuoti naudokite minimalų Python klientą.

import asyncio
import os
 
from openai import AsyncOpenAI
 
 
async def main():
    client = AsyncOpenAI(
        api_key=os.environ["THUNDERPHONE_API_KEY"],
        websocket_base_url="wss://api.thunderphone.com/v1",
    )
 
    async with client.realtime.connect(
        model="thunderphone-realtime"
    ) as connection:
        await connection.session.update(session={
            "type": "realtime",
            "instructions": "Listen to the caller and help them complete the call.",
            "config": {"product": "bolt"},
        })
        async for event in connection:
            print(event.type)
            if event.type == "session.updated":
                break
 
 
if __name__ == "__main__":
    asyncio.run(main())

Išlaikykite esamą įvesties garso pridėjimo, atsako garso deltų, pertraukimų, funkcijų iškvietimų, klaidų ir tvarkingo lizdo uždarymo apdorojimą. Įterptinės pasirinktinės funkcijos vykdomos jūsų kliente; jų rezultatus grąžinkite per Realtime protokolą. Išsaugoto agente įrankiai vykdomi ThunderPhone.

Sesijos gyvavimo ciklas ir gedimai

Vienas WebSocket reiškia vieną skambutį. Netinkamas agento ID arba atmesta įterptinė konfigūracija sukuria error įvykį. Prieš laikydami sesiją aktyvia, palaukite session.updated. Nurodykite faktinius įvesties ir išvesties formatus bei diskretizavimo dažnius: dėl PCM dažnio neatitikties garsas atkuriamas per greitai arba per lėtai, užuot sukėlus patvirtinimo klaidą.

Prasidėjus sesijai, tvarkingai uždarykite lizdą, kai programa baigia darbą. Įterptinės sesijos gali naudoti kliento vykdomas funkcijas. Išsaugoto agento sesijos naudoja suderinamus ThunderPhone vykdomus įrankius ir nesiūlo perdavimo ar klaviatūros įvesties.

Išbandykite integraciją

Pradėkite nuo minimalaus Python WAV kliento ir mono PCM16 WAV failo jo nurodytu dažniu. Patikrinkite:

  1. Serveris priima konfigūraciją ir siunčia session.updated.
  2. Įvestis sukuria transkripto ir atsako garso įvykius numatytu greičiu.
  3. Pertraukimas ir atsako atšaukimas sustabdo likusį išvesties garsą.
  4. Įterptinių funkcijų rezultatai arba išsaugoto agento įrankių rezultatai grąžinami modeliui.
  5. Netinkama įvestis sukuria error įvykį, kurį apdoroja jūsų klientas.
  6. Jūsų klientas uždaro lizdą, o skambutis rodomas Skambučių istorijoje.

Realtime WebSocket nuorodoje pateikiami priimami įvykiai, garso formatai, sesijos laukai ir išsamūs pavyzdžiai.

Kaina

Realtime skambučiams taikomas įprastas pasirinkto produkto minutinis tarifas. Įjungus tiesioginius transkripto delta atnaujinimus, visai sesijai pridedamas minutinis mokestis; tarifą žr. Tiesioginiuose transkriptuose, o produktų tarifus – Kainodaroje.

POST /v1/realtime/sessions yra atskiras valdomas LiveKit kelias. Jis sukuria kambarį ir dalyvio prieigos raktą su nustatyta aprėptimi; jis nereikalingas tiesioginiam WebSocket ryšiui.

Karkasų integracijoms žr. Naudokite ThunderPhone su Pipecat ir Naudokite ThunderPhone su LiveKit Agents.