steep-balloon-41261
03/05/2026, 2:36 PMtall-airline-16756
03/05/2026, 2:36 PMtall-airline-16756
03/05/2026, 2:37 PMend_call aracı çağrısında neden WebSocket hatası (1008, "Requested entity was not found") alındığını ve nasıl düzeltebileceğini açıklıyorum.
Kısa cevap / temel sorun
• Hata, çağrı (room/session) veya realtime agent oturumu (ör. Gemini Live) silindikten veya sonlandırıldıktan sonra hâlâ bu kapalı kaynağa erişilmeye çalışılmasından kaynaklanıyor.
• Yani önce oda/sessi̇yonu veya altta çalışan realtime modeli sonlandırıp temizlemeden önce kaynakları (ör. room/participant) kaldırırsan, realtime modelin hâlâ açık WebSocket üzerinden veri göndermeye/almaya çalışması sonucu "Requested entity was not found" kapanış kodu geliyor.
Önerilen düzeltme (özeti)
1. Aktif agent konuşmasını kes ve kapanış mesajını oynat.
2. Realtime agent oturumunu / session'u düzgün şekilde SHUT DOWN et (WebSocket bağlantısını sonlandır).
3. Son olarak hangup / room silme / SIP disconnect gibi işlemi çağır.
Neden bu sıra önemli
• Realtime modeller (Gemini Live veya benzeri) WebSocket açık tutuyor; room/participant silinirse modelin bağlantısı kaynak bulunamadığı için sunucu tarafından 1008 ile kapatılıyor. Bu da logtaki traceback'e neden oluyor.
• Bu yüzden önce agent/model tarafını kapatıp WebSocket'i sonlandırırsan, sonrasında room'u güvenle silebilirsin.
Uygulanabilir kod önerisi
• Aşağıdaki adımları koduna ekle veya sıralamayı bu mantığa göre değiştir:
1) Konuşmayı interrupt / wait_for_playout ile durdur (senin mevcut kodda var). 2) Kapanış mesajını speak_message(..., wait_for_playout=True, allow_interruptions=True) ile çal. 3) Eğer kullanıcı araya girdiyse iptal et (senin mevcut kontrolün). 4) Eğer kapanış mesajı tamamlandıysa realtime session'ı düzgün kapat:
• session üzerinde varsa shutdown() veya eşdeğer oturum sonlandırma metodunu çağır.
• await gerekiyorsa await et; değilse en azından kısa bir bekleme (temizlik için) ekle.
5) Son olarak hangup(ctx, reason="agent_ended") (oda/sip cleanup) çağır.
Örnek (yapılandırılmış özet)
1. interrupt / fallback wait_for_playout
2. oynat closing message
3. if interrupted -> return None
4. session.shutdown() ← buraya ekle (veya session'a uygun sonlandırma)
5. await asyncio.sleep(0.2) ← opsiyonel kısa bekleme
6. session_report.set_ended_by("agent") (mevcutsa)
7. await hangup(ctx, reason="agent_ended")
Kontrol etmeni önerdiğim yerler
• session nesnenin gerçekten bir shutdown() metoduna sahip olup olmadığını kontrol et. (varsa onu kullan; yoksa realtime plugin için sağlanan uygun sonlandırma metodunu kullan.)
• hangup() fonksiyonun oda/katılımcı silme işlemi yapıyorsa, onu kesinlikle session sonlandırmasından sonra çağır.
• Eğer kullandığın realtime modelin kendi cleanup/close callback'leri varsa (örn. model.stop(), session.close() vs.) onları da çağır.
Eğer istersen yardımcı olabilirim:
• session nesnesinin gerçek tipini ve hangi realtime plugin'i (Gemini Live, OpenAI Realtime vb.) kullandığını paylaşırsan, doğru shutdown metodunu netleştirip örnek kodu doğrudan dosyana göre uyarlayabilirim.
• Ayrıca hangup() içeriğini paylaşırsan, orada oda silme/participant disconnect işlemlerinin nereye denk düştüğünü kontrol ederim.
İstersen önce hangi realtime model/kitaplık kullandığını (ör. Gemini Live) ve session nesnesinin hangi sınıfa ait olduğunu gönder; hemen uygun kapatma adımlarını ve örneği atayım.
Sources: Python Agents: Handling exceptions in your entrypoint | LiveKit | OpenAI Realtime API plugin guide | LiveKit Documentation | Agents telephony integration | LiveKit Documentation | Gemini Live API plugin | LiveKit Documentation