---
title: "Utilizați ThunderPhone cu clienți OpenAI Realtime"
description: "Direcționați un client de server compatibil cu OpenAI Realtime către ThunderPhone, utilizând fie un agent salvat, fie o configurație de sesiune inline."
---

ThunderPhone implementează un subset concentrat al modelului de evenimente OpenAI Realtime.
Un client existent de pe server își poate păstra fluxul de evenimente WebSocket, audio, sesiune și
răspuns în timp ce utilizează un agent vocal ThunderPhone.

## Înainte de conectare

Aveți nevoie de o cheie API secretă de organizație ThunderPhone și de un mediu de rulare pe server care
poate deschide WebSocket-uri. Nu vă conectați din codul browserului și nu expuneți cheia într-un
browser. Pentru a utiliza un agent salvat, implementați-l mai întâi și copiați ID-ul său numeric de agent.

Conectați-vă la:

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

Autentificați actualizarea WebSocket de pe serverul dumneavoastră:

```http
Authorization: Bearer sk_live_YOUR_API_KEY
```

Autentificarea prin șir de interogare există pentru clienții care nu pot seta antete
la negocierea conexiunii, dar URL-urile sunt mai ușor de divulgat în jurnale.

## Alegeți cine deține configurația

| Mod | Conectați-vă cu | Sursa configurației |
| --- | --- | --- |
| Agent salvat | `?agent_id=12` | Prompt implementat, voce, produs, limbi, cunoștințe și instrumente compatibile executate pe server |
| Inline | Fără `agent_id` | Primul `session.update` acceptat de la clientul dumneavoastră |

### Agent salvat

Conectați-vă cu ID-ul agentului implementat:

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

Agentul pornește în timpul conectării socketului. Salutul său rămâne disponibil,
însă Realtime îi dezactivează verificările vocale în perioadele de tăcere și omite
`transfer_call` și `send_keypad_input`. Alte instrumente compatibile rulează pe ThunderPhone. Nu
trimiteți instrucțiuni inline sau instrumente executate de client pentru acest mod.

Setați formatul audio transmis înainte ca agentul să pornească folosind parametrii de interogare
`input_audio_format`, `output_audio_format`, `input_rate` și `output_rate`. Nu
puteți modifica configurația salvată sau formatele audio după conectare.

### Sesiune inline

Fără `agent_id`, așteptați `session.created`, apoi trimiteți `session.update`:

```json
{
  "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"
    }
  }
}
```

Prima actualizare acceptată pregătește apelul. `session.updated` înseamnă că
sesiunea este activă. Instrucțiunile, vocea, produsul, instrumentele și formatele audio nu pot fi
modificate după acel moment.

Sesiunile inline nu au un salut automat sau verificări vocale în perioadele de tăcere. Pentru ca
agentul să vorbească primul, adăugați un mesaj de sistem sau de utilizator și trimiteți
`response.create`. O sesiune complet inactivă se încheie totuși la limita platformei pentru apeluri
silențioase, implicit 600 de secunde.

## Utilizați SDK-ul oficial OpenAI

Transmiteți un URL de bază WebSocket care se termină cu `/v1`; SDK-ul adaugă `/realtime`. Valoarea `model` este un nume de compatibilitate și nu selectează produsul ThunderPhone. Alegeți produsul în configurația sesiunii sau în agentul salvat.

Această verificare a conexiunii creează o sesiune Bolt inline, afișează evenimente până la primul `session.updated`, apoi se închide. Utilizați [clientul Python
minimal](/api-reference/realtime#minimal-python-client) pentru a transmite audio în flux.

```python
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())
```

Păstrați gestionarea existentă pentru adăugarea audio de intrare, diferențele audio ale răspunsului, întreruperi, apeluri de funcții, erori și închiderea corectă a socketului. Funcțiile personalizate inline se execută în clientul dumneavoastră; returnați rezultatele lor prin protocolul Realtime. Instrumentele agentului salvat se execută pe ThunderPhone.

## Ciclul de viață al sesiunii și erori

Un WebSocket reprezintă un apel. Un ID de agent nevalid sau o configurație inline respinsă produce un eveniment `error`. Așteptați `session.updated` înainte de a considera sesiunea activă. Declarați formatele și frecvențele de eșantionare reale pentru intrare și ieșire: o nepotrivire a frecvenței PCM redă sunetul prea rapid sau prea lent, în loc să producă o eroare de validare.

După ce sesiunea începe, închideți corect socketul când aplicația dumneavoastră a terminat. Sesiunile inline pot utiliza funcții executate de client. Sesiunile cu agent salvat utilizează instrumente compatibile executate de ThunderPhone și nu oferă transfer sau introducere prin tastatură.

## Testați integrarea

Începeți cu [clientul Python WAV minimal](/api-reference/realtime#minimal-python-client)
și un WAV PCM16 mono la frecvența declarată. Verificați:

1. Serverul acceptă configurația și trimite `session.updated`.
2. Intrarea produce evenimente de transcriere și audio de răspuns la viteza așteptată.
3. Întreruperea și anularea răspunsului opresc sunetul de ieșire rămas.
4. Rezultatele funcțiilor inline sau rezultatele instrumentelor agentului salvat sunt returnate modelului.
5. O intrare nevalidă produce un eveniment `error` pe care clientul dumneavoastră îl gestionează.
6. Clientul dumneavoastră închide socketul, iar apelul apare în [Istoricul
   apelurilor](/ro/guides/review-calls).

[Referința WebSocket Realtime](/api-reference/realtime) listează evenimentele acceptate, formatele audio, câmpurile sesiunii și exemple complete.

## Cost

Apelurile Realtime utilizează tariful normal pe minut al produsului selectat. Activarea diferențelor de transcriere live adaugă o suprataxă pe minut pentru întreaga sesiune; consultați [Transcrieri
live](/api-reference/realtime#live-transcripts) pentru tarif și
[Prețuri](/ro/guides/pricing) pentru tarifele produselor.

`POST /v1/realtime/sessions` este o cale LiveKit gestionată separată. Aceasta creează o cameră și un token de participant cu domeniu de aplicare; nu este necesară pentru o conexiune WebSocket directă.

Pentru integrări cu frameworkuri, consultați [Utilizați ThunderPhone din Pipecat](/ro/guides/use-with-pipecat)
și [Utilizați ThunderPhone din LiveKit Agents](/ro/guides/use-with-livekit).
