Selam, Livekit webhook kullanıyorum. Telefon kapa...
# ask-ai
a
Selam, Livekit webhook kullanıyorum. Telefon kapandığında bana ne gibi statusler gelebiliyor?
✅ 1
t
Thanks for reaching out, İbrahim. I'm an AI assistant and I'm here to help. Give me a moment while I research this topic.
Selam — iyi soru. Telefon kapandığında (ör. arayan kişinin telefonu kapatması veya çağrının sonlanması) LiveKit’in sana gönderebileceği ana webhook olayları ve durumlar şu şekilde: • participant_left ◦ Bir katılımcı (SIP çağrısı yapan telefon) odadan ayrıldığında gönderilir. Genellikle telefon kapandığında ilk göreceğin olay budur. • room_finished ◦ Odadaki son katılımcı da ayrıldığında ve oda kapandığında gönderilir. Eğer çağrı tek kişilikse ve telefon kapanınca oda boşalıyorsa bu tetiklenir. • SIP özelinde katılımcı attribute’ları (çağrı durumunu takip etmek için): ◦
sip.callStatus = 'hangup'
— Çağrı sonlandı / karşı taraf kapattı. ◦
sip.callStatus = 'active'
— Çağrı bağlı ve aktif. ◦
sip.callStatus = 'dialing'
— Arama çalınıyor / aranıyor. ◦
sip.callStatus = 'ringing'
— Gelen çağrı çalıyor. • Disconnect / Close reason alanları (neden kapandığını anlamak için): ◦
CLIENT_INITIATED
— Kullanıcı kendisi kapattı (ör. telefon kapatıldı veya görüşmeyi sonlandırdı). ◦
PARTICIPANT_REMOVED
— API ile katılımcı uzaklaştırıldı. ◦
CONNECTION_TIMEOUT
— Ağ bağlantı zaman aşımı / ağ kopması. ◦
ROOM_DELETED
— Oda API ile silindi. • Diğer ilgili olaylar: ◦ track_unpublished — Ses track’i kaldırıldığında (ör. bağlantı kesildiğinde ses akışı durursa). ◦ egress_ended — Eğer kayıt (egress) açıksa, kayıt sonlandığında gönderilir. İşleme dair kısa notlar ve öneriler: • Telefon kapanması tipik olarak
participant_left
+
sip.callStatus = 'hangup'
veya
CLIENT_INITIATED
close reason ile gözlemlenir; ancak ağ kopması durumunda
CONNECTION_TIMEOUT
gelebilir. • Webhook’lar JWT ile imzalanır — güvenlik için imzayı doğrulayarak gelen olayların gerçekliğini kontrol etmeni öneririm. • Hangi olayları kullanacağına senin uygulama mantığı karar verir: örneğin faturalama için
sip.callStatus = 'hangup'
kullanırken; yeniden bağlanma mantığı için `CONNECTION_TIMEOUT`’ı ayrı ele alabilirsin. İstersen şu bilgileri paylaş, sana daha hedefli öneri vereyim: • SIP entegrasyonunu hangi senaryoda kullanıyorsun (inbound, outbound, her ikisi)? • Hangi olaylarla tetiklenen iş akışları (faturalama, kayıt durdurma, bildirim gönderme) kurmak istiyorsun? Yardımcı olayları veya örnek webhook payload’larını görmek istersen, hangi senaryoya odaklanmak istediğini söyle yeter. Sources: Server-side | livekit/livekit_composite | DeepWiki | SIP Lifecycle Management Agent | LiveKit Documentation, with interactive elements
a
Meşgul, cevapsız gibi şeyleri alabiliyor muyum?
t
Kısa ve net: Evet, “meşgul” veya “cevapsız” gibi durumları alabilirsin — fakat bunlar ayrı webhook event’leri olarak değil, SIP katılımcısının attribute’ları üzerinden iletilir. Ne yapman gerektiği: •
sip.callStatus
attribute’u SIP çağrısının ayrıntılı durumunu taşır. Olası değerler arasında
busy
(meşgul) ve
no answer
(cevapsız) bulunur; ayrıca
dialing
,
ringing
,
active
,
hangup
gibi durumlar da vardır. • Bu attribute değiştiğinde odada
participant_attributes_changed
(veya SDK tarafında
participantAttributesChanged
) olayı tetiklenir. Bu olayı dinleyerek gelen değişikliklerde
sip.callStatus
varsa ilgili durumu yakalayabilirsin. Kısa örnek akış (uygulamada izlemen gereken adımlar): 1. Oda içindeki katılımcı attribute değişikliklerini dinle (
participant_attributes_changed
). 2. Değişen attribute’larda
sip.callStatus
olup olmadığına bak. 3.
sip.callStatus
değeri
busy
veya
no answer
ise kendi iş mantığına göre (bildirim, faturalama, yeniden deneme vs.) hareket et. Notlar: • Standart webhook event’leri (ör.
participant_left
) yine gönderilir ama onlar “meşgul/cevapsız” gibi SIP özel durumlarını içermez. • Eğer istersen, kullandığın SDK (JavaScript/Python vb.) veya hangi iş akışını tetiklemek istediğini paylaş; sana örnek kod veya daha spesifik nasıl ele alabileceğine dair adımlar göndereyim. Sources: SIP Lifecycle Management Agent | LiveKit Documentation | Job lifecycle | LiveKit Documentation | sip | livekit/livekit_composite | DeepWiki | Agents telephony integration | LiveKit Documentation, with interactive elements
a
Olası değerler arasında
busy
(meşgul) ve
no answer
(cevapsız) bulunur; ayrıca
dialing
,
ringing
,
active
,
hangup
gibi durumlar da vardır. Bunları görebileceğim döküman, kod falan var mı?
t
İyi soru — evet, bu durumları görebilmen için doküman ve örnek kodlar mevcut. Aşağıda kısa bir özet, olası
sip.callStatus
değerleri, ve hem TypeScript hem Python için örnek dinleme kodu ile nerelere bakman gerektiğine dair yönlendirme var. Olası
sip.callStatus
değerleri •
dialing
— Arama başlatılıyor •
ringing
— Telefon çalıyor •
active
— Görüşme bağlandı •
hangup
— Görüşme sonlandı •
busy
— Hedef hat meşgul •
no answer
— Cevap verilmedi •
automation
— DTMF/otomasyon aşaması (ör. sesli yanıt sistemi) Nasıl izlersin (genel yaklaşım) • SIP çağrılarının ayrıntılı durumları webhook’lara ayrı event olarak gelmez;
sip.callStatus
participant attribute’u olarak tutulur. • Attribute değiştiğinde oda içinde
participant_attributes_changed
(SDK’da
participantAttributesChanged
) olayı tetiklenir — bu olayı dinleyip
sip.callStatus
değişimini kontrol etmelisin. • Standart webhook’lar (
participant_left
vb.) yine gelir ama “busy/no answer” gibi SIP özel durumlarını taşımazlar. TypeScript (örnek)
Copy code
ctx.room.on('participantAttributesChanged', (changedAttrs: Record<string,string>, p: Participant) => {
  if (p.kind === ParticipantKind.PARTICIPANT_KIND_SIP && changedAttrs['sip.callStatus']) {
    const callStatus = changedAttrs['sip.callStatus'];
    console.log(`SIP call status updated for ${p.identity}: ${callStatus}`);
    // Örneğin:
    // if (callStatus === 'busy') { ... }
    // if (callStatus === 'no answer') { ... }
  }
});
Python (örnek)
Copy code
@ctx.room.on("participant_attributes_changed")
def on_participant_attributes_changed(changed_attrs: dict, participant):
    if participant.kind == rtc.ParticipantKind.PARTICIPANT_KIND_SIP:
        if 'sip.callStatus' in changed_attrs:
            call_status = changed_attrs['sip.callStatus']
            print(f"SIP call status updated for {participant.identity}: {call_status}")
            # call_status: 'busy', 'no answer', 'dialing', 'ringing', 'active', 'hangup', ...
Dokümantasyon ve örneklere nereden bakmalısın • SIP katılımcı attribute’ları ve
sip.callStatus
hakkında bilgi edinmek için LiveKit’ın SIP/SIP gateway bölümüne bak. • SDK’larında (JS/Python)
participantAttributesChanged
/
participant_attributes_changed
olaylarını nasıl dinleyeceğini gösteren örnek kodları incele. • Webhook yapısı ve imza doğrulama için webhook güvenliği bölümlerine bakman faydalı olacaktır. İstersen hangi SDK’yı kullanıyorsun (JavaScript/TypeScript, Python veya başka)? Hangi iş akışını tetikleyeceksin (bildirim, faturalama, kayıt durdurma vb.)? Bu bilgileri verirsen, sana doğrudan kullanabileceğin daha özelleşmiş örnek kod ve hangi dokümana bakman gerektiğini içeren linklerle göndereyim. , with interactive elements
a
Repo içinde veya sitede dökümanlarda nerede bulabilirim bunları? Bütün çağrı durumlarını görebilmek istiyorum.
t
Harika — tüm çağrı durumlarını (meşgul, cevapsız, çalıyor vb.) nerede bulabileceğini ve örnek kodları nasıl kullanacağını net şekilde aşağıda paylaşıyorum. Kısa cevap • Tüm SIP çağrı durumları
sip.callStatus
attribute’unda tutulur. Bu attribute değiştiğinde odada
participant_attributes_changed
(SDK’larda
participantAttributesChanged
) olayı tetiklenir. • Bu durumların listesi ve örnekler dokümanda ve repo içindeki “recipes” bölümünde bulunuyor. Doğrudan bakman gereken yerler (doküman ve örnekler) • Telephony / SIP genel bakış: https://docs.livekit.io/telephony/ • SIP API ve SIP participant attribute’ları: https://docs.livekit.io/reference/telephony/sip-api/ ve https://docs.livekit.io/reference/telephony/sip-participant/ • SIP yaşam döngüsü (kod örnekleri, recipes): https://docs.livekit.io/recipes/sip_lifecycle • Diğer örnekler (ör. telefon asistanı, company directory): https://docs.livekit.io/recipes/company-directory Olası
sip.callStatus
değerleri (tam liste) •
dialing
— Arama başlatılıyor •
ringing
— Hedef telefon çalıyor •
active
— Görüşme bağlı/aktif •
hangup
— Görüşme sonlandı •
busy
— Hedef hat meşgul •
no answer
— Cevap verilmedi •
automation
— DTMF/otomasyon aşaması (ör. IVR) Nasıl kullanırsın — hızlı örnekler 1. Oda içinde attribute değişikliklerini dinle: ◦ JavaScript/TypeScript:
participantAttributesChanged
olayını kullan. ◦ Python:
participant_attributes_changed
olayını kullan. 1. Gelen değişikliklerde
sip.callStatus
olup olmadığına bak; varsa iş mantığını çalıştır (
busy
,
no answer
, vs.). 2. İhtiyaç varsa ayrıca
participant_left
veya
track_unpublished
gibi webhook/olaylarla kombine ederek daha sağlam durum takibi yapabilirsin. Kısa TypeScript örneği
Copy code
ctx.room.on('participantAttributesChanged', (changedAttrs, p) => {
  if (p.kind === ParticipantKind.PARTICIPANT_KIND_SIP && changedAttrs['sip.callStatus']) {
    const callStatus = changedAttrs['sip.callStatus'];
    console.log(`SIP status for ${p.identity}: ${callStatus}`);
  }
});
Kısa Python örneği
Copy code
@ctx.room.on("participant_attributes_changed")
def on_participant_attributes_changed(changed_attrs: dict, participant):
    if participant.kind == rtc.ParticipantKind.PARTICIPANT_KIND_SIP:
        if 'sip.callStatus' in changed_attrs:
            call_status = changed_attrs['sip.callStatus']
            print(f"SIP status for {participant.identity}: {call_status}")
İstersen ben yardımcı olayları ve örnek repo dosya yollarını (senin kullandığın SDK’ya göre) daha detaylı verebilirim: • Hangi SDK’yı kullanıyorsun (JavaScript/TypeScript, Python, Go)? • Çağrı durumlarını izleyince hangi iş akışlarını tetikleyeceksin (bildirim, faturalama, kayıt durdurma, otomatik yeniden deneme vs.)? Bu bilgileri paylaşırsan sana doğrudan kullanabileceğin kod parçacıkları ve tam doküman linkleriyle yardımcı olayım. Sources: Agents telephony integration | LiveKit Documentation | SIP Lifecycle Management Agent | LiveKit Documentation | Company directory phone assistant | LiveKit Documentation | Server-side | livekit/livekit_composite | DeepWiki | server-sdk-go | livekit/livekit_composite | DeepWiki, with interactive elements