TL;DR
OpenAI, farklı kullanım durumları için iki WebSocket API modu sunar: yoğun araç çağrısı içeren ajans iş akışları için **Yanıtlar API WebSocket modu** (20'den fazla araç çağrısı için %40'a kadar daha hızlı) ve düşük gecikmeli ses ve işitsel uygulamalar için **Gerçek Zamanlı API**. Her ikisi de durum bilgisi olmayan HTTP istekleri yerine kalıcı WebSocket bağlantıları kullanır, tekrarlanan bağlantı yükünü ortadan kaldırarak gecikmeyi azaltır ve olay odaklı, durum bilgili etkileşimleri mümkün kılar.
Giriş
OpenAI'ın API'si basit istek-yanıt modellerinin ötesine geçti. Hızlı araç çağrıları veya gerçek zamanlı ses akışı gerektiren uygulamalar için, geleneksel HTTP modeli gereksiz ek yük oluşturur. Her yeni istek, aynı görüşmeyi sürdürseniz bile bağlantı kurulumu, kimlik doğrulama ve durum iletimi gerektirir.
OpenAI'ın WebSocket API'si, kalıcı, çift yönlü bir bağlantı sürdürerek bu sorunu çözer. 20'den fazla ardışık araç çağrısı içeren ajans iş akışları için bu, uçtan uca yürütmede yaklaşık %40 daha hızlı performans anlamına gelir. Ses uygulamaları için, 500 ms'nin altında gecikmelerle doğal, kesilebilir konuşmalar sağlar.
Bu kılavuz, OpenAI'ın her iki WebSocket modunu da kapsar: araç ağırlıklı ajans iş akışları için Yanıtlar API'si ve ses akışı için Gerçek Zamanlı API. Her birini ne zaman kullanacağınızı, nasıl uygulayacağınızı ve etkili bir şekilde nasıl test edeceğinizi öğreneceksiniz.
OpenAI WebSocket API Nedir?
OpenAI WebSocket API, OpenAI'ın dil modelleriyle etkileşim için HTTP'ye alternatif bir taşıma mekanizması sağlar. Her API çağrısı için yeni bir bağlantı oluşturmak yerine, WebSocket oturumunuz boyunca açık kalan tek, uzun ömürlü bir bağlantı kurar.
Temel Özellikler
Kalıcı Bağlantı: Kurulduktan sonra, WebSocket bağlantısı açıkça kapatılana kadar açık kalır ve istek başına bağlantı ek yükünü ortadan kaldırır.
Çift Yönlü İletişim: Hem istemci hem de sunucu, istediği zaman mesaj gönderebilir, bu da gerçek olay odaklı mimarileri mümkün kılar.
Durum Bilgili Oturumlar: Sunucu, mevcut bağlantı için bağlamı korur ve tüm konuşma geçmişini yeniden göndermeden önceki yanıtlara referans vermenizi sağlar.
Olay Odaklı Model: İletişim, istek-yanıt çiftleri yerine ayrık olaylar (JSON mesajları) aracılığıyla gerçekleşir.
WebSocket Protokol Temelleri
WebSocket bağlantıları bir HTTP yükseltme isteğiyle başlar, ardından WebSocket protokolüne geçer. OpenAI için, aşağıdaki gibi uç noktalara bağlanacaksınız:
- Yanıtlar API'si:
wss://api.openai.com/v1/responses - Gerçek Zamanlı API:
wss://api.openai.com/v1/realtime?model=gpt-realtime
wss:// şeması, güvenli bir WebSocket bağlantısını gösterir (HTTP için HTTPS'ye benzer).
İki WebSocket Modu Açıklandı
OpenAI, her biri farklı kullanım durumları için optimize edilmiş iki farklı WebSocket modu sunar.
Yanıtlar API WebSocket Modu
Yanıtlar API'si, birçok ardışık araç çağrısı yapmanız gereken **ajans iş akışları** için WebSocket bağlantılarını destekler. Bu mod, karmaşık görevleri yerine getirmek için araçları tekrar tekrar çağıran kodlama yardımcıları, orkestrasyon sistemleri ve otonom aracılar için tasarlanmıştır.
Nasıl Çalışır:
Aktif bir WebSocket bağlantısında, hizmet bağlantıya özel bellekteki önbellekte bir önceki yanıt durumunu (en son yanıt) korur. Bir turu devam ettirdiğinizde, yalnızca şunları gönderirsiniz:
previous_response_id(son yanıta referans)- Yeni girdi öğeleri (kullanıcı mesajları, araç sonuçları vb.)
Sunucu, tüm konuşma geçmişini yeniden işlemeden önbelleğe alınmış durumu yeniden kullanır.
Performans Avantajları:
20'den fazla araç çağrısı içeren iş akışları için OpenAI, HTTP'ye kıyasla uçtan uca yürütmede **%40'a kadar daha hızlı performans** bildirmektedir. Bu avantajlar şunlardan kaynaklanır:
- İstek başına bağlantı kurulumu yok
- Tekrarlanan kimlik doğrulama ek yükü yok
- Önbelleğe alınmış durum işlem süresini azaltır
- Küçük devam mesajları için daha düşük ağ gecikmesi
Uyumluluk:
WebSocket modu hem Sıfır Veri Saklama (ZDR) hem de store=false seçenekleriyle çalışır, bu da onu gizlilik açısından hassas uygulamalar için uygun hale getirir.
Gerçek Zamanlı API WebSocket Modu
Gerçek Zamanlı API, **ses odaklı uygulamalar** için düşük gecikmeli, akışlı ses yetenekleri sağlar. Modelin ses girişine ses çıkışı ile yanıt verebildiği, kesintileri doğal bir şekilde ele aldığı konuşmadan konuşmaya etkileşimleri mümkün kılar.
Nasıl Çalışır:
Gerçek Zamanlı API, durum bilgili, olay odaklı bir oturum oluşturmak için WebSocket kullanır. API'ye ses öbekleri akışı yaparsınız ve API hem transkripsiyonları hem de oluşturulan ses yanıtlarını geri akışla gönderir. Bağlantı şunları destekler:
- Ses girişi akışı (ses öbekleri yakalandıkça gönderilir)
- Ses çıkışı akışı (oluşturulan ses gerçek zamanlı olarak alınır)
- Metin girişi/çıkışı (hibrit metin+ses etkileşimleri için)
- Otomatik kesinti yönetimi (kullanıcı konuştuğunda üretimi durdurma)
Temel Özellikler:
Ses Aktivite Algılama (VAD): API, bir kullanıcının sadece duraklama yerine ne zaman konuşmayı bitirdiğini anlayan semantik VAD içerir. Bu, daha doğal bir konuşma akışı yaratır.
Çok Modlu Yetenekler: GPT-4o'nun yerel çok modlu yeteneklerine doğrudan erişim, hem sesi hem de metni tek bir modelde işleme.
Düşük Gecikme: Ses etkileşimleri için 500ms'nin altında gecikmeler için tasarlanmıştır, gerçek zamanlı konuşmalar için uygundur.
WebSocket ve HTTP: Performans Karşılaştırması
WebSocket ve HTTP arasında seçim yapmak, uygulamanızın özelliklerine bağlıdır. İşte her bir protokolün ne zaman öne çıktığı.

WebSocket'in HTTP'den Üstün Olduğu Durumlar
Yüksek Araç Çağrısı Hacmi:
İş akışınız 10'dan fazla ardışık araç çağrısı yapıyorsa, WebSocket'in kalıcı bağlantısı tekrarlanan kurulum ek yükünü ortadan kaldırır. Her HTTP isteği şunları gerektirir:
- DNS sorgulama (önbelleğe alınmadıysa)
- TCP el sıkışması (3 yollu)
- TLS el sıkışması (TLS 1.3 için 2 gidiş-dönüş)
- HTTP istek/yanıt başlıkları
WebSocket bunu bir kez yapar, sonra bağlantıyı yeniden kullanır.
Gecikmeye Duyarlı Uygulamalar:
Her milisaniyenin önemli olduğu gerçek zamanlı sesli veya sohbet uygulamaları için, WebSocket'in kalıcı bağlantısı ve akış yetenekleri algılanan gecikmeyi önemli ölçüde azaltır.
Sunucu Tarafından Başlatılan Güncellemeler:
WebSocket, sunucunun istemcilere anket yapmadan veri göndermesine olanak tanır. Uzun süreli ajan görevleri için, sunucu olaylar meydana geldikçe ilerleme güncellemeleri gönderebilir.
HTTP'nin Yeterli Olduğu Durumlar
Basit İstek-Yanıt:
Tek seferlik API çağrıları veya 1-2 araç çağrısı içeren iş akışları için HTTP'yi uygulamak ve hata ayıklamak daha basittir. Çoğu geliştirici HTTP istemcilerine aşinadır ve altyapı (yük dengeleyiciler, proxy'ler) HTTP'yi iyi yönetir.
Durum Bilgisiz İşlemler:
İstekler arasında oturum durumu tutmanız gerekmiyorsa, HTTP'nin durum bilgisiz doğası aslında bir avantajdır – bağlantı yönetimi gerekmez.
Altyapı Kısıtlamaları:
Bazı dağıtım ortamları (sunucusuz işlevler, belirli proxy'ler) uzun ömürlü WebSocket bağlantılarını desteklemez. HTTP evrensel olarak çalışır.
Performans Metrikleri
OpenAI'ın dokümantasyonuna ve topluluk testlerine dayanarak:
| Metrik | HTTP | WebSocket (Yanıtlar API) | WebSocket (Gerçek Zamanlı API) |
|---|---|---|---|
| Bağlantı Kurulumu | Her istek (~100-300ms) | Bir kez (~100-300ms) | Bir kez (~100-300ms) |
| 20+ Araç Çağrısı İş Akışı | Temel | ~%40 daha hızlı | Uygulanamaz |
| Ses Gidiş-Dönüş Gecikmesi | Uygulanamaz (bunun için tasarlanmamış) | Uygulanamaz | <500ms |
| Bellek Yükü | Düşük (durum bilgisiz) | Orta (önbelleğe alınmış durum) | Orta-Yüksek (oturum durumu) |
| Uygulama Karmaşıklığı | Düşük | Orta | Orta-Yüksek |
Yanıtlar API WebSocket Modu Nasıl Kullanılır
Ajans iş akışı için Yanıtlar API'sine bir WebSocket bağlantısı uygulayalım.
Ön Koşullar
- Yanıtlar API'sine erişimi olan bir OpenAI API anahtarı
- WebSocket istemci kütüphanesi (Node.js için
wsveya Python içinwebsocket-client) - OpenAI API'sinde araç çağrısının anlaşılması
Bağlantı Kurulumu
Node.js Örneği:
const WebSocket = require('ws');
// Yanıtlar API WebSocket uç noktasına bağlan
const ws = new WebSocket('wss://api.openai.com/v1/responses', {
headers: {
'Authorization': `Bearer ${process.env.OPENAI_API_KEY}`,
'OpenAI-Beta': 'responses-api=v1'
}
});
ws.on('open', () => {
console.log('OpenAI Yanıtlar API\'sine Bağlandı');
// Başlangıç isteğini gönder
const initialMessage = {
model: 'gpt-4o',
messages: [
{ role: 'user', content: 'Bu kod tabanını analiz etmeme ve iyileştirmeler önermeme yardımcı ol.' }
],
tools: [
{
type: 'function',
function: {
name: 'read_file',
description: 'Bir dosyanın içeriğini oku',
parameters: {
type: 'object',
properties: {
path: { type: 'string', description: 'Okunacak dosya yolu' }
},
required: ['path']
}
}
},
{
type: 'function',
function: {
name: 'search_code',
description: 'Kod desenlerini ara',
parameters: {
type: 'object',
properties: {
pattern: { type: 'string', description: 'Aranacak Regex deseni' }
},
required: ['pattern']
}
}
}
]
};
ws.send(JSON.stringify(initialMessage));
});
ws.on('message', (data) => {
const response = JSON.parse(data);
console.log('Alındı:', response);
// Modelin araç çağırmak isteyip istemediğini kontrol et
if (response.choices[0].finish_reason === 'tool_calls') {
const toolCalls = response.choices[0].message.tool_calls;
// Araçları yürüt (basitleştirilmiş)
const toolResults = toolCalls.map(call => ({
tool_call_id: call.id,
output: executeToolLocally(call.function.name, call.function.arguments)
}));
// Konuşmayı araç sonuçlarıyla devam ettir
const continuation = {
previous_response_id: response.id, // Önceki yanıta referans
input: toolResults
};
ws.send(JSON.stringify(continuation));
}
});
ws.on('error', (error) => {
console.error('WebSocket hatası:', error);
});
ws.on('close', () => {
console.log('Bağlantı kapatıldı');
});
function executeToolLocally(name, args) {
// Araç yürütme mantığınız
if (name === 'read_file') {
const { path } = JSON.parse(args);
return fs.readFileSync(path, 'utf-8');
}
// ... diğer araçlar
}
Python Örneği:
import websocket
import json
import os
def on_message(ws, message):
response = json.loads(message)
print(f"Alındı: {response}")
# Araç çağrılarını ele al
if response['choices'][0]['finish_reason'] == 'tool_calls':
tool_calls = response['choices'][0]['message']['tool_calls']
# Araçları yürüt
tool_results = []
for call in tool_calls:
result = execute_tool(call['function']['name'],
json.loads(call['function']['arguments']))
tool_results.append({
'tool_call_id': call['id'],
'output': result
})
# Yalnızca yeni girdi + previous_response_id ile devamı gönder
continuation = {
'previous_response_id': response['id'],
'input': tool_results
}
ws.send(json.dumps(continuation))
def on_error(ws, error):
print(f"Hata: {error}")
def on_close(ws, close_status_code, close_msg):
print("Bağlantı kapatıldı")
def on_open(ws):
print("OpenAI Yanıtlar API'sine Bağlandı")
# Başlangıç isteğini gönder
initial_message = {
'model': 'gpt-4o',
'messages': [
{'role': 'user', 'content': 'Bu kod tabanını analiz et ve iyileştirmeler öner.'}
],
'tools': [
{
'type': 'function',
'function': {
'name': 'read_file',
'description': 'Dosya içeriğini oku',
'parameters': {
'type': 'object',
'properties': {
'path': {'type': 'string'}
},
'required': ['path']
}
}
}
]
}
ws.send(json.dumps(initial_message))
def execute_tool(name, args):
if name == 'read_file':
with open(args['path'], 'r') as f:
return f.read()
# ... diğer araçlar
# WebSocket bağlantısı oluştur
ws = websocket.WebSocketApp(
"wss://api.openai.com/v1/responses",
header={
"Authorization": f"Bearer {os.environ['OPENAI_API_KEY']}",
"OpenAI-Beta": "responses-api=v1"
},
on_open=on_open,
on_message=on_message,
on_error=on_error,
on_close=on_close
)
ws.run_forever()
Temel Uygulama Detayları
Durum Yönetimi:
HTTP'den kritik fark, devam eden isteklerde previous_response_id kullanmaktır. Bu, API'ye son yanıttan önbelleğe alınmış durumu yeniden kullanmasını söyler.
Yalnızca Girdi Devamları:
Bir turu devam ettirirken, yalnızca şunları gönderin:
previous_response_id: Önbelleğe alınmış yanıta referans veririnput: Yeni veriler (araç sonuçları, kullanıcı mesajları vb.)
Tam messages dizisini yeniden göndermeyin; sunucu bu bağlama zaten sahiptir.
Sıfır Veri Saklama:
WebSocket moduyla ZDR kullanmak için, ilk isteğinize store: false ekleyin.
Gerçek Zamanlı API WebSocket Modu Nasıl Kullanılır
Gerçek Zamanlı API, düşük gecikmeli ses etkileşimlerini etkinleştirir. İşte nasıl uygulanacağı.
Ön Koşullar
- Gerçek Zamanlı API erişimi olan bir OpenAI API anahtarı
- Ses yakalama/oynatma yetenekleri
- WebSocket istemci kütüphanesi
- Ses kodlama (en iyi sonuçlar için 24kHz, 16-bit, mono PCM)
Bağlantı Kurulumu
JavaScript (Tarayıcı) Örneği:
// Gerçek Zamanlı API'ye bağlan
const ws = new WebSocket(
`wss://api.openai.com/v1/realtime?model=gpt-realtime`,
['realtime', 'openai-insecure-api-key.' + process.env.OPENAI_API_KEY]
);
ws.addEventListener('open', () => {
console.log('Gerçek Zamanlı API\'ye Bağlandı');
// Oturumu yapılandır
ws.send(JSON.stringify({
type: 'session.update',
session: {
modalities: ['text', 'audio'],
voice: 'alloy',
input_audio_format: 'pcm16',
output_audio_format: 'pcm16',
turn_detection: {
type: 'server_vad', // veya daha akıllı algılama için 'semantic_vad'
threshold: 0.5,
prefix_padding_ms: 300,
silence_duration_ms: 500
}
}
}));
});
ws.addEventListener('message', (event) => {
const message = JSON.parse(event.data);
switch (message.type) {
case 'session.created':
console.log('Oturum oluşturuldu:', message.session);
break;
case 'conversation.item.created':
console.log('Yeni öğe:', message.item);
break;
case 'response.audio.delta':
// Ses öbeği alındı - oynat
const audioChunk = base64ToArrayBuffer(message.delta);
playAudioChunk(audioChunk);
break;
case 'response.audio_transcript.delta':
// Transkript öbeği alındı
console.log('Transkript:', message.delta);
break;
case 'input_audio_buffer.speech_started':
console.log('Kullanıcı konuşmaya başladı');
break;
case 'input_audio_buffer.speech_stopped':
console.log('Kullanıcı konuşmayı durdurdu');
break;
case 'error':
console.error('API hatası:', message.error);
break;
}
});
// Mikrofondan ses gönder
async function streamMicrophoneToAPI() {
const stream = await navigator.mediaDevices.getUserMedia({ audio: true });
const audioContext = new AudioContext({ sampleRate: 24000 });
const source = audioContext.createMediaStreamSource(stream);
const processor = audioContext.createScriptProcessor(4096, 1, 1);
processor.onaudioprocess = (e) => {
const inputData = e.inputBuffer.getChannelData(0);
// Float32'yi Int16 PCM'ye dönüştür
const pcmData = new Int16Array(inputData.length);
for (let i = 0; i < inputData.length; i++) {
pcmData[i] = Math.max(-32768, Math.min(32767, inputData[i] * 32768));
}
// API'ye gönder
ws.send(JSON.stringify({
type: 'input_audio_buffer.append',
audio: arrayBufferToBase64(pcmData.buffer)
}));
};
source.connect(processor);
processor.connect(audioContext.destination);
}
// Metin girişi gönder
function sendTextMessage(text) {
ws.send(JSON.stringify({
type: 'conversation.item.create',
item: {
type: 'message',
role: 'user',
content: [
{ type: 'input_text', text: text }
]
}
}));
// Yanıt üretimi iste
ws.send(JSON.stringify({
type: 'response.create'
}));
}
function playAudioChunk(arrayBuffer) {
const audioContext = new AudioContext({ sampleRate: 24000 });
audioContext.decodeAudioData(arrayBuffer, (buffer) => {
const source = audioContext.createBufferSource();
source.buffer = buffer;
source.connect(audioContext.destination);
source.start();
});
}
Python Örneği:
import websocket
import json
import base64
import pyaudio
# Ses yapılandırması
RATE = 24000
CHUNK = 4096
FORMAT = pyaudio.paInt16
CHANNELS = 1
audio = pyaudio.PyAudio()
def on_open(ws):
print("Gerçek Zamanlı API'ye Bağlandı")
# Oturumu yapılandır
ws.send(json.dumps({
'type': 'session.update',
'session': {
'modalities': ['text', 'audio'],
'voice': 'alloy',
'input_audio_format': 'pcm16',
'output_audio_format': 'pcm16',
'turn_detection': {
'type': 'server_vad',
'threshold': 0.5,
'silence_duration_ms': 500
}
}
}))
# Mikrofon akışını başlat
stream_microphone(ws)
def on_message(ws, message):
data = json.loads(message)
if data['type'] == 'response.audio.delta':
# Sesi çöz ve oynat
audio_chunk = base64.b64decode(data['delta'])
play_audio(audio_chunk)
elif data['type'] == 'response.audio_transcript.delta':
print(f"Transkript: {data['delta']}", end='', flush=True)
elif data['type'] == 'input_audio_buffer.speech_started':
print("\n[Kullanıcı konuşuyor...]")
elif data['type'] == 'error':
print(f"Hata: {data['error']}")
def stream_microphone(ws):
stream = audio.open(
format=FORMAT,
channels=CHANNELS,
rate=RATE,
input=True,
frames_per_buffer=CHUNK
)
def audio_thread():
while True:
audio_data = stream.read(CHUNK)
ws.send(json.dumps({
'type': 'input_audio_buffer.append',
'audio': base64.b64encode(audio_data).decode('utf-8')
}))
import threading
threading.Thread(target=audio_thread, daemon=True).start()
def play_audio(audio_chunk):
stream = audio.open(
format=FORMAT,
channels=CHANNELS,
rate=RATE,
output=True
)
stream.write(audio_chunk)
stream.stop_stream()
stream.close()
# WebSocket bağlantısı oluştur
ws = websocket.WebSocketApp(
f"wss://api.openai.com/v1/realtime?model=gpt-realtime",
header={
"Authorization": f"Bearer {os.environ['OPENAI_API_KEY']}"
},
on_open=on_open,
on_message=on_message
)
ws.run_forever()
Temel Uygulama Detayları
Olay Türleri:
Gerçek Zamanlı API, olay odaklı iletişim kullanır. Yaygın olaylar:
İstemci → Sunucu:
session.update- Oturum parametrelerini yapılandırinput_audio_buffer.append- Ses öbekleri gönderconversation.item.create- Metin mesajları ekleresponse.create- Yapay zeka yanıtı iste
Sunucu → İstemci:
session.created- Oturum kurulumunu onaylarresponse.audio.delta- Yapay zekadan ses öbeğiresponse.audio_transcript.delta- Yapay zeka sesinin transkripsiyonuinput_audio_buffer.speech_started/stopped- VAD olaylarıerror- Hata bildirimleri
Ses Aktivite Algılama:
İki VAD modu arasında seçim yapın:
server_vad: Ses seviyesi ve sessizlik süresine dayalı temel ses aktivite algılama.
semantic_vad: Doğal duraklamalar ile sıra tamamlama arasındaki farkı anlayan daha akıllı algılama. Kullanıcıların düşünürken duraklayabileceği daha doğal konuşmalar için bunu kullanın.
Apidog ile WebSocket Bağlantılarını Test Etme
WebSocket API'lerini test etmek, HTTP testinden farklıdır – bir bağlantıyı sürdürmeniz, olaylar göndermeniz ve çift yönlü mesaj akışını izlemeniz gerekir. Apidog, özel WebSocket test yetenekleri sunar.

Apidog'da WebSocket Testleri Kurulumu
Adım 1: WebSocket İsteği Oluşturun
Apidog'da yeni bir istek oluşturun ve protokol olarak "WebSocket"i seçin. Bağlantı URL'nizi girin:

wss://api.openai.com/v1/responses
Adım 2: Başlıkları Yapılandırın
Kimlik doğrulama başlıklarını ekleyin:
Authorization: Bearer YOUR_OPENAI_API_KEY
OpenAI-Beta: responses-api=v1
Gerçek Zamanlı API için, URL tabanlı kimlik doğrulamasını da kullanabilirsiniz:
wss://api.openai.com/v1/realtime?model=gpt-realtime
API anahtarı alt protokol başlığında.
Adım 3: Bağlantı Kurun
WebSocket bağlantısını kurmak için "Bağlan"a tıklayın. Apidog şunları gösterir:
- Bağlantı durumu (bağlı/bağlantısız)
- Gecikme metrikleri
- Bağlantı süresi
Adım 4: Olayları Gönderin
JSON olaylarını göndermek için Apidog'un mesaj oluşturucusunu kullanın. Yanıtlar API'si için:
{
"model": "gpt-4o",
"messages": [
{
"role": "user",
"content": "San Francisco'da hava nasıl?"
}
],
"tools": [
{
"type": "function",
"function": {
"name": "get_weather",
"description": "Mevcut hava durumunu al",
"parameters": {
"type": "object",
"properties": {
"location": { "type": "string" }
}
}
}
}
]
}
Adım 5: Yanıtları İzleyin
Apidog şunları görüntüler:
- Tüm alınan mesajlar kronolojik sırayla
- Mesaj zaman damgaları ve boyutları
- JSON biçimlendirme ve sözdizimi vurgulama
- Hata ayıklama için kopyalama/dışa aktarma yetenekleri
Devam Eden İstekleri Test Etme
previous_response_id ile devam eden istek modelini test etmek için:
- İlk mesajı gönderin, yanıttaki
response.id'yi not alın - Yalnızca yeni girdi ile devam eden isteği gönderin:
{
"previous_response_id": "resp_abc123",
"input": [
{
"tool_call_id": "call_xyz789",
"output": "{\"temperature\": 72, \"conditions\": \"sunny\"}"
}
]
}
- Tam bağlamı yeniden göndermeye kıyasla azalan gecikmeyi gözlemleyin
Gerçek Zamanlı API'yi Test Etme
Gerçek Zamanlı API için Apidog size şunları sağlar:
- Base64 kodlu ses öbekleri gönder
- Oturum güncelleme olaylarını izle
- VAD olaylarını takip et (konuşma başladı/durdu)
- Gerçek zamanlı olarak transkript farklılıklarını görüntüle
Bu, sesli asistanınızın neden kullanıcıları kesintiye uğrattığını veya konuşmayı düzgün algılamadığını hata ayıklamak için özellikle faydalıdır.
Ortam Değişkenleri
API anahtarlarını Apidog'un ortam değişkenlerini kullanarak güvenli bir şekilde saklayın:
{{OPENAI_API_KEY}}
Bu, istekleri düzenlemeden geliştirme ve üretim anahtarları arasında geçiş yapmanızı sağlar.
Gerçek Dünya Kullanım Durumları
OpenAI'ın WebSocket modlarının öne çıktığı pratik senaryoları inceleyelim.
Kullanım Durumu 1: Otonom Kodlama Aracısı
Senaryo: Kod tabanlarını analiz eden, sorunları belirleyen ve otonom olarak iyileştirmeler yapan bir kodlama asistanı.
Neden Yanıtlar API WebSocket:
- Tipik iş akışı: Dosya oku → Analiz et → Benzer desenleri ara → Daha fazla dosya oku → Değişiklikler öner
- Bu, görev başına 15-30 araç çağrısı oluşturur
- WebSocket modu toplam yürütme süresini ~%40 azaltır
- Kalıcı bağlantı, tüm araç çağrıları arasında bağlamı korur
Uygulama Modeli:
// Initial task
ws.send({ messages: [{ role: 'user', content: 'Audit security vulnerabilities' }], tools: [...] })
// First response: model calls read_file
ws.on('message', (resp1) => {
ws.send({ previous_response_id: resp1.id, input: [tool_result_1] })
})
// Second response: model calls search_code
ws.on('message', (resp2) => {
ws.send({ previous_response_id: resp2.id, input: [tool_result_2] })
})
// Continue for 20+ iterations...
Kullanım Durumu 2: Sesli Müşteri Hizmetleri Botu
Senaryo: Müşteri sorularını doğal konuşma akışıyla ele alan telefon destek botu.
Neden Gerçek Zamanlı API WebSocket:
- Düşük gecikme kritik (doğal konuşma için <500ms)
- Kesintileri ele alması gerekir (müşteri botun üzerine konuşur)
- Ses girişini ayrı bir transkripsiyona gerek duymadan doğrudan işler
- Yanıtları gerçek zamanlı olarak akışla gönderir (tam bir cümleyi beklemez)
Uygulama Modeli:
// Stream phone audio to API
phoneSystem.on('audio', (chunk) => {
ws.send({
type: 'input_audio_buffer.append',
audio: base64Encode(chunk)
})
})
// Play AI responses immediately
ws.on('message', (event) => {
if (event.type === 'response.audio.delta') {
phoneSystem.playAudio(base64Decode(event.delta))
}
})
Sık Karşılaşılan Sorunları Giderme
Bağlantı Kurulamıyor
Belirtiler: WebSocket bağlantısı asla açılmıyor, anında kapanma olayı.
Yaygın Nedenler:
- Geçersiz API anahtarı -
Authorizationbaşlığınızı tekrar kontrol edin - Eksik beta başlığı - Yanıtlar API'si
OpenAI-Beta: responses-api=v1gerektirir - Ağ kısıtlamaları - Bazı kurumsal ağlar WebSocket'i engeller
- Yanlış URL -
wss://(ws://değil) ve uç nokta yolunu doğrulayın
Çözüm:
Bağlantıyı ayrıntılı hata mesajlarıyla test etmek için Apidog'u kullanın. İstek denetleyicisi, hangi başlıkların gönderildiğini tam olarak göstererek eksik veya yanlış API anahtarlarını tespit etmeyi kolaylaştırır.
Hata Ayıklama Kodu:
ws.on('error', (error) => {
console.error('Bağlantı hatası:', error);
});
ws.on('close', (code, reason) => {
console.log(`Kod ${code} ile kapatıldı: ${reason}`);
// Yaygın kodlar:
// 1006: Anormal kapanma (genellikle kimlik doğrulama sorunları)
// 1008: Politika ihlali (geçersiz başlıklar)
});
WebSocket'e Rağmen Yüksek Gecikme
Belirtiler: WebSocket bağlantısı çalışıyor ancak HTTP'den daha hızlı değil.
Yaygın Nedenler:
previous_response_idkullanmıyorsunuz - Tüm bağlamı yeniden gönderiyorsunuz- Soğuk başlangıç - Yeni bağlantıdaki ilk istek daha yavaştır
- Ağ gecikmesi - API sunucularına coğrafi uzaklık
- Büyük yükler - Devam eden isteklerde gereksiz veri gönderme
Çözüm:
Devam eden isteklerde yalnızca yeni girdi gönderdiğinizi doğrulayın:
// YANLIŞ - her seferinde tam bağlamı gönderir
ws.send({
messages: [...allPreviousMessages, newMessage],
tools: [...]
})
// DOĞRU - önbelleğe alınmış duruma referans verir
ws.send({
previous_response_id: lastResponse.id,
input: [newMessage]
})
Uzun Süreli Bağlantılarda Bellek Sızıntıları
Belirtiler: Uygulama belleği, kalıcı bağlantıyla zamanla artar.
Yaygın Nedenler:
- Olay dinleyicileri kaldırılmamış - Yeniden bağlantıda dinleyiciler birikiyor
- Ses arabellekleri serbest bırakılmamış - Çalınan seslere referanslar tutuluyor
- Mesaj geçmişi büyüyor - Tüm alınan mesajları saklama
Çözüm:
// Yeniden bağlantıda olay dinleyicilerini temizle
function cleanupAndReconnect(ws) {
ws.removeAllListeners();
ws.close();
const newWs = createConnection();
return newWs;
}
// Oynadıktan sonra ses arabelleklerini serbest bırak
function playAndRelease(audioBuffer) {
const audioContext = new AudioContext({ sampleRate: 24000 });
audioContext.decodeAudioData(audioBuffer, (buffer) => {
const source = audioContext.createBufferSource();
source.buffer = buffer;
source.connect(audioContext.destination);
source.start();
source.onended = () => {
source.disconnect();
// Arabellek çöp toplama ile temizlenecek
};
});
}
// Mesaj geçmişini sınırlayın
const messageHistory = [];
const MAX_HISTORY = 100;
ws.on('message', (data) => {
messageHistory.push(data);
if (messageHistory.length > MAX_HISTORY) {
messageHistory.shift(); // En eskisini kaldır
}
});
Sonuç
OpenAI'ın WebSocket API modları, yapay zeka uygulamaları için yeni olanaklar sunuyor. Yanıtlar API WebSocket modu, yoğun araç çağrısı içeren ajans iş akışları için %40'a kadar daha hızlı yürütme sağlayarak, otonom kodlama yardımcıları ve orkestrasyon sistemleri için idealdir. Gerçek Zamanlı API, ses uygulamaları için 500 ms'nin altında gecikme sunarak doğal, kesilebilir konuşmaları mümkün kılar.
Doğru modu seçmek, kullanım durumunuza bağlıdır:
- Yanıtlar API WebSocket: Yoğun araç kullanan aracılar, kodlama yardımcıları, araştırma araçları (10'dan fazla araç çağrısı)
- Gerçek Zamanlı API WebSocket: Sesli asistanlar, telefon botları, dil öğretmenleri (ses akışı)
- HTTP: Basit istekler, sunucusuz ortamlar, 1-5 API çağrısı
WebSocket bağlantılarının kalıcı, olay odaklı yapısı, HTTP'den farklı test yaklaşımları gerektirir. OpenAI'ın WebSocket API'lerini Apidog'un gerçek zamanlı WebSocket istemcisiyle test edin – API anahtarınızı içe aktarın, bağlantılar kurun, olaylar gönderin ve ayrıntılı günlükleme ile yanıtları izleyin. Üretim dağıtımından önce entegrasyonlarınızı doğrulamak için ücretsiz deneyin.
