Açık Kaynak Katkı Serisi · #06

LangGraph Update Stream’lerini
Güvenlik Kanıtına Dönüştürmek

Bir graph çalışmasının yalnızca son cevabını görmek, güvenlik açısından en önemli ara adımları kaybetmek demektir. Update stream; node bazlı değişimi görünür kılar, fakat ham akışı güvenilir kanıta çevirmek için kapsamı dar ve sözleşmesi açık bir adapter gerekir.

Final Output Neden Yetmez?

Agent son adımda güvenli bir cümle döndürebilir; buna rağmen ara adımda gereksiz veri çekmiş, yasaklı bir tool çağırmış veya hedef dışı bir node’a geçmiş olabilir. Yalnızca final metnini kaydeden test, davranışın önemli bölümünü göremez.

LangGraph update stream her node’un durum değişikliğini parça parça verir. Bu akıştan assistant mesajı ve tool çağrısı çıkarıldığında regresyon harness’ı “ne söylendi?” sorusunun yanında “hangi eylem planlandı?” sorusunu da değerlendirebilir.

Updates Akışı Bir Event Log Değildir

Update chunk’ları graph node adlarını ve o adımda değişen durum parçalarını taşır. Her uygulamanın state şeması farklı olabilir. Adapter’ın tüm olası Python nesnelerini sessizce yorumlamaya çalışması gelecekte belirsiz trace üretir.

Sağlam yaklaşım, desteklenen biçimi açıkça sınırlar: senkron stream_mode="updates", object biçimli chunk, standart node-update payload’ları ve tanınan assistant/tool mesaj yapıları. Desteklenmeyen biçim “boş trace” olarak geçmez; açık AdapterError üretir.

Varsayılan Invoke Yolunu Korumak

Streaming her hedefte aynı değildir ve bazı uygulamalar callback, token stream veya async generator kullanır. Mevcut adapter davranışını otomatik streaming’e çevirmek uyumluluğu bozar. PR #158 bu nedenle yeni yolu ayrı CLI seçeneğiyle opt-in yaptı; varsayılan invoke() davranışı değişmedi.

Bu tercih iki avantaj sağlar: mevcut kullanıcılar aynı sonucu almaya devam eder, streaming kullanan ekip ise güvenlik kanıtı için dar ve test edilmiş bir yol seçer.

Assistant Mesajı ve Tool Çağrısı Nasıl Ayrılır?

Bir update içinde node adı, message listesi ve tool call metadata’sı birlikte bulunabilir. Adapter önce desteklenen mesaj türünü doğrular, sonra assistant içeriğini ve yapılandırılmış tool çağrılarını ayrı trace event’lerine dönüştürür. Tool adı, çağrı kimliği ve argümanlar korunur; fakat bilinmeyen nesne keyfi biçimde string’e çevrilmez.

Bu ayrım politika testlerini mümkün kılar: “agent yanıtında güvenli konuştu mu?” ile “agent hangi aracı hangi argümanla çağırdı?” aynı kanıt değildir.

Boş Akış da Başarılı Çalışma Değildir

Hedefte stream metodu yoksa, stream hiç chunk üretmiyorsa veya chunk object değilse test değerlendirmeye alınmamalıdır. Sessizce boş trace üretmek, güvenlik kontrolünün geçtiği izlenimini yaratabilir.

Adapter hatası ile agent bulgusu ayrı kanallarda tutulmalıdır. Bu ilke, PR #51’deki not_assessed yaklaşımıyla aynı mühendislik çizgisini taşır: gözlem yoksa sonuç üretme.

LangGraph Güvenlik Testi İçin Kontrol Listesi

  • Streaming yolunu açıkça opt-in yapın; varsayılan yürütmeyi değiştirmeyin.
  • Desteklenen stream mode ve chunk biçimini dokümante edin.
  • Assistant içeriği, tool çağrısı ve goal event’i ayrı trace türlerinde tutun.
  • Boş, object olmayan veya desteklenmeyen akışı açık hata ile durdurun.
  • Fake-object testleriyle dış servise ihtiyaç duymadan adapter sözleşmesini doğrulayın.
  • Async, token, callback ve subgraph yollarını desteklemiyorsanız bunu açıkça yazın.

Kaynaklar ve Kanıt Sınırı

Bu yazı Enes Deniz tarafından hazırlanmış bağımsız bir teknik değerlendirmedir. Bağlantılı upstream proje veya standart kuruluşu tarafından yayımlanmış ya da onaylanmış bir metin değildir. Merge, test ve kapsam iddiaları yukarıdaki birincil kayıtlara bağlanmıştır.