Yapay zeka modeli API’lerinin istek biçimlerinden yanıt formatlarına kadar standartlaşmamış yapıları, geliştiricilerin karşılaştığı en büyük zorluklardan biri. Anthropic, OpenAI ve Google gibi farklı sağlayıcıların sistem istemlerini (system prompts), mesaj rollerini ve akış protokollerini farklı şekillerde ele alması, kod tabanında karmaşıklığa yol açıyor. BoxAgnts’in sunduğu Provider soyutlama katmanı ve Akıllı Sorgulama Döngüsü (Agent Query Loop) ise bu sorunu kökten çözmeyi hedefliyor.
Farklı API Biçimlerine Karşı Standartlaştırılmış Bir Model
Her yapay zeka sağlayıcısının API’si, istek gövdesinin yapısından hata yönetimine kadar birbirinden oldukça farklı. Örneğin:
- Anthropic’in sistem istemi (
systemalanı) ayrı bir alan olarak yer alırken, OpenAI’derole: "system"mesajı olarak tanımlanıyor. - Google Gemini ise sistemi
system_instructionadıyla üst düzey bir alana yerleştiriyor. - Hata yanıtları bile sağlayıcıdan sağlayıcıya değişiklik gösteriyor: Bazıları HTTP durum kodlarını kullanırken, diğerleri özel hata mesajları döndürüyor.
BoxAgnts’in çözümü, bu çeşitliliği üç katmanlı bir soyutlama sistemiyle yönetiyor. İlk katmanda, tüm sağlayıcılar için ortak bir ProviderRequest ve ProviderResponse veri modeli tanımlanıyor. Bu yapı, sistem isteminden araç tanımlarına kadar tüm bileşenleri standart bir formatta tutuyor. Böylece geliştiriciler, hangi sağlayıcıyı kullandıklarını dikkate almadan kod yazabiliyor.
İkinci katmanda, LlmProvider adında bir trait (arayüz) sunuluyor. Bu trait, tüm sağlayıcıların ortak özelliklerini tanımlıyor ve her birinin asenkron akışlar aracılığıyla yanıt üretmesini sağlıyor. Üçüncü katmanda ise Transformer adı verilen fonksiyonlar yer alıyor. Bu fonksiyonlar, standart ProviderRequest yapısını alıp, doğrudan sağlayıcıya özel istek formatına dönüştürüyor. Örneğin, to_anthropic_request fonksiyonu, standart bir istek yapısını Anthropic’in anlayacağı biçime çeviriyor.
Akış Protokollerindeki Farklılıkların Yönetimi
Yapay zeka modelleriyle gerçek zamanlı etkileşimler genellikle Server-Sent Events (SSE) protokolü üzerinden gerçekleşiyor. Ancak her sağlayıcı, bu akışları farklı şekillerde yönetiyor:
- Anthropic, içerik bloklarını üç aşamalı olay hiyerarşisiyle (başlangıç, delta, durdurma) takip ediyor. Örneğin, bir metin bloğunun oluşumu sırasında
content_block_start, ardındancontent_block_deltaolayları geliyor ve son olarakcontent_block_stopile tamamlanıyor. - OpenAI ise daha basit bir yaklaşım benimsiyor ve tüm değişiklikleri
choices[0].deltaadı altında tek bir olayda topluyor. - Google Gemini ise gRPC-web protokolünü kullanıyor ve akış formatı tamamen farklı.
BoxAgnts’in stream_parser modülü, tüm bu farklılıkları tek bir StreamEvent enum’una indirgiyor. Bu enum, metin değişimlerinden araç kullanımına, düşünme akışından kullanım istatistiklerine kadar tüm olayları standart bir yapıda temsil ediyor. Örneğin:
pub enum StreamEvent {
TextDelta { text: String },
ToolUseStart { id: String, name: String },
ToolUseDelta { id: String, json: String },
ToolUseEnd { id: String },
ThinkingDelta { text: String },
UsageUpdate { input_tokens: u32, output_tokens: u32 },
MessageStop,
}Her sağlayıcı için özel bir akış çözümleyici (parser) geliştiriliyor. Bu çözümleyiciler, sağlayıcıya özgü durum makineleri olarak çalışıyor. Örneğin, Anthropic’in akış çözümleyicisi, message_start olayından itibaren bir durum makinesi gibi davranarak, içerik bloklarının başlangıcını, değişimlerini ve sonunu takip ediyor. Tüm bu olaylar, standart StreamEvent yapısına dönüştürülerek, üst katmanlara iletiliyor.
Akıllı Sorgulama Döngüsü: Araç Çağrılarının Yönetimi
Standartlaştırılmış akış olayları elde edildikten sonra, BoxAgnts’in query::run_query_loop fonksiyonu devreye giriyor. Bu fonksiyon, mesaj geçmişini, sistem istemini ve araç tanımlarını bir araya getirerek yapay zeka modeline gönderiyor. Ardından, modelin yanıt akışını dinleyerek hem kullanıcı arayüzüne gerçek zamanlı geri bildirimler gönderiyor hem de araç çağrılarını yönetiyor.
Sorgulama döngüsü üç temel adımdan oluşuyor:
- İstek Oluşturma:
CreateMessageRequestyapısı kullanılarak, model adı, maksimum token sayısı, mesaj geçmişi ve araç tanımları belirleniyor. Bu yapı, tüm sağlayıcılar için aynı şekilde oluşturuluyor.
- Akış Başlatma ve Olay İşleme: Yapay zeka modeline yapılan istek, akış başlatıyor.
StreamAccumulatoradı verilen bir yapı, tüm gelen olayları takip ediyor ve içerikleri bloklara ayırıyor. Örneğin, bir araç kullanımının başlangıcı (ToolUseStart) algılandığında, kullanıcı arayüzüne gerçek zamanlı olarak gönderiliyor. Benzer şekilde, metin değişimleri (TextDelta) ve kullanım istatistikleri (UsageUpdate) de izleniyor.
- Tamamlanan Mesajın İşlenmesi: Tüm içerik blokları tamamlandığında,
MessageStopolayı tetikleniyor.StreamAccumulator, bu noktada tüm blokları birleştirerek tam bir mesaj oluşturuyor ve durdurma nedenini (stop_reason) ile birlikte geri döndürüyor.
Bu süreç, yapay zeka modelleriyle etkileşimi hem güvenilir hem de kullanıcı dostu hale getiriyor. Geliştiriciler, karmaşık API farklılıklarını yönetmek zorunda kalmadan, uygulamalarını kolayca farklı sağlayıcılarla entegre edebiliyor.
Geleceğe Yönelik Bakış
BoxAgnts’in çoklu sağlayıcı uyumlu mimarisi, yapay zeka araçlarının geliştirilmesini ve dağıtılmasını önemli ölçüde basitleştiriyor. Gelecekte, bu yaklaşımın daha fazla sağlayıcıyı desteklemesi ve geliştiricilerin farklı API’ler arasında geçiş yapmasını kolaylaştırması bekleniyor. Ayrıca, gerçek zamanlı araç izleme ve hata yönetimi gibi özelliklerin, kullanıcı deneyimini daha da iyileştirmesi öngörülüyor. Bu yenilikçi mimari, yapay zeka tabanlı uygulamaların geleceğini şekillendiren önemli bir adım olarak karşımıza çıkıyor.
Yapay zeka özeti
BoxAgnts’in çoklu yapay zeka sağlayıcı uyumu nasıl sağlıyor? Provider soyutlama katmanı ve Akıllı Sorgulama Döngüsü hakkında detaylı inceleme.