
Günümüzdeki çoğu ajan çerçevesi bir masaüstü bilgisayar varsayımıyla çalışır. Tek kullanıcı, tek makine, tek işlem. Ajan, dizüstü bilgisayar açıkken çalışır, yerel dosya sistemine yazar, API anahtarlarını ortam değişkenlerinde tutar ve terminal kapandığında ölür. Bir şey bozulduğunda, kullanıcı yeniden dener. Ajanın bir pakete ihtiyacı olduğunda, pip install onu kullanıcının Python ortamına kurar. Durum, gizli bilgiler ve yaşam döngüsü tamamen güvenilir bir sınır içinde yer alır.
Bulut ajan altyapısı bu lükslerin hiçbirine sahip değildir.
Ajan, her seferinde sıfırdan başlayan, kullanıcının hiç tanımadığı arayanlar tarafından tetiklenen (bir zamanlayıcı, bir HTTP isteği, başka bir ajan) ve yabancılarla paylaşılan donanım üzerinde çalışan bir kum havuzunda (sandbox) koşar. Kullanıcı, çalışma gerçekleştiğinde genellikle uykudadır. Kum havuzunun içindeki kod düşmanca olabilir. Dosya sisteminin dağıtımlara dayanması gerekir. Kimlik bilgileri, ajanın olduğu yerde yaşayamaz. Masaüstü bilgisayarın size ücretsiz olarak verdiği her garanti (kalıcılık, kimlik, ağ güveni, yeniden deneme) açık bir sistem olarak yeniden inşa edilmelidir.
Son birkaç ayımızı CREAO'da bu katmanı sıkılaştırarak geçirdik. Bundan iki ders çıkardık. Eğer bir masaüstü ajanı gönderdiyseniz ve buluta taşındığında neyin değiştiğini merak ettiyseniz, işte cevabı.
Ders 1: Yavaş değişeni hızlı değişenden ayırın

Masaüstünde, kullanıcının ortamı ve ajanın çalışma zamanı aynı şeydir, aynı kişi tarafından aynı tempoda güncellenir. Bulutta ise durum böyle değildir.
Bir ajan uygulaması, platform tarafında durum biriktirir. Bir borsa analisti matplotlib kurar, piyasa verilerini indirir, grafik komut dosyaları yazar. Bu ortam, ajanın kas hafızasıdır. Kullanıcı bu ortamdan memnun kaldığı anı bir kum havuzu anlık görüntüsü olarak dondururuz ve kullanıcı ortamı tekrar düzenleyene kadar bu anlık görüntüyü dondurulmuş halde tutarız. Her çalıştırma aynı imajdan başlar. Aynı paketler, aynı dosyalar, aynı sürümler. Pazartesi günkü çalıştırma, Cuma günkü gibi davranır çünkü altta hiçbir şey değişmemiştir.
Masaüstü çerçevelerinin size ücretsiz veremeyeceği özellik budur. Altı ay önce yapılan bir pip install, bugün farklı sürümlere çözümlenir. Bir bulut anlık görüntüsü ise sonsuza kadar aynı baytlara çözümlenir. Tekrarlanabilirlik, platformun kullanıcıya borçlu olduğu bir şeydir ve donmuş bir anlık görüntü, bunu sunmanın en ucuz yoludur.
Ardından bağlantı sorunu ortaya çıkar.
Kullanıcının ortamını donduran aynı imaj, aynı zamanda koşucu kodunu da içerir — bizim geliştirdiğimiz, ajanı her çalıştırmada yöneten küçük koşum takımı kütüphanesi. Kullanıcı, ortamının sabit kalmasını ister. Biz ise koşucumuzu günde birçok kez dağıtmak isteriz. Tek bir yapıt, iki zıt gereksinim.
İlk çözümümüz sertti. Önyükleme sırasında, anlık görüntüdeki koşucunun az önce dağıttığımız sürümle eşleşip eşleşmediğini kontrol et. Eşleşmiyorsa, anlık görüntüyü at ve temiz bir şablondan başlat. İşe yaradı ve kimse şikayet etmedi. Hasar sadece bir dağıtımdan sonraki ilk çalıştırmayı etkiledi.
Katılımsız çalıştırmalar bu korumayı geçersiz kıldı. Pazartesi sabah 9'daki bir cron işi, saat 8:55'te dağıtım yaptığımız için ortamını kaybetmemelidir. Sessizce ihlal ettiğimiz sözleşme — "ortamınız, siz değiştirene kadar dondurulur" — buydu.
Çözümü görmemiz gerektiğinden daha uzun sürdü. Kullanıcının ortamı ve koşucu kodu tamamen farklı hızlarda değişir. Kullanıcı, ajanını istediği zaman düzenler. Platformu günde birçok kez dağıtırız. Bunları tek bir yapıt olarak ele almak, her dağıtımda bir seçim yapmaya zorladı: eski koşucu kodunu koru veya kullanıcının açıkça korumamızı istediği donmuş ortamı yok et.
Vardığımız model, işletim sistemlerinin güncellemeleri nasıl ele aldığından ödünç alınmıştır. Çekirdek değişir. Ev dizininiz değişmez. Bir güvenlik yaması yüklemek için diski silmezsiniz.
Aynı sınırı çizdik. Kum havuzu, kullanıcının donmuş anlık görüntüsünden, dokunulmadan başlatılır. Ardından sadece koşucuyu sıcak olarak değiştiririz. Sıralama:
- Yeni koşucuyu kum havuzunun içinde geçici bir dizine yerleştir.
- Herhangi bir sözdizimi hatasını canlıya dokunmadan yakalamak için node --check ile doğrula.
- Atomik olarak değiştir: eski koşucudaki değişmez bayrağı kaldır, yenisini kopyala, chattr +i ile yeniden kilitle, ardından chattr ikili dosyasını gizle ki kum havuzu kodu kilidi tersine çeviremesin.
- V8 derleme önbelleğini (/home/user/.cache/v8-compile-cache/*) temizle ki yeni dosya eski bayt kodunu çalıştırmak yerine gerçekten yüklensin.
- Herhangi bir adım başarısız olursa, kum havuzunu öldür ve yenisiyle dene. Yarı yükseltilmiş bir durum asla bir ajanı çalıştırmaz.
Tüm değiştirme işlemi yaklaşık 300 milisaniye sürer. Yalnızca koşucu kodu değiştirildiğinde başarılı bir çalıştırmanın ardından yeniden anlık görüntü alırız, böylece güncellenmiş kodu kullanıcının imajına yerleştiririz ve bir sonraki çalıştırma değiştirme işlemini tamamen atlar. Platform dağıtımları asla kullanıcının durumunu atmaz; yeni koşucuyu onun içine katlarlar. Kullanıcının paketleri, dosyaları ve özelleştirmeleri değişmeden devam eder.
Bu dersten tek bir şey alacak olsanız, bu teşhis sorusudur. Bir bulut platformunda kalıcı hale getirdiğiniz her şey için şunu sorun: Bu yapıtın değişim temposunu kim kontrol ediyor? Kullanıcı ve platformun her ikisi de ona sahipse, eninde sonunda bu bağlantının bedelini ödersiniz. Yapıtı sahiplik sınırı boyunca bölün ve her iki tarafın kendi saatine göre güncelleme yapmasına izin verin.
Ders 2: Gizli bilgileri yürütme sınırının dışında tutun

Bu ders, bulut ajan altyapısını diğer her şeyden ayırandır.
Bir masaüstü ajanı, kullanıcı olarak çalışır. Kullanıcının anahtarlarını, kullanıcının makinesinde, kullanıcının ağına karşı kullanır. Bir bulut ajanı, hiç kimse olarak, paylaşılan donanımda, açık internete karşı, düşmanca olabilecek bir istemden bir LLM'nin yazdığı kodu yürüterek çalışır. Güvenlik modeli, kum havuzunun içindeki kodun zaten tehlikeye atıldığını varsaymalı, aksini ummamalıdır.
Sahip olduğumuz kural basittir. Hiçbir uzun ömürlü kimlik bilgisi, kum havuzunun içinde yaşamaz.
Bir ajanın kimliği doğrulanmış bir hizmeti (Slack, GitHub, kullanıcının kendi API'si) araması gerektiğinde, token'ı elinde tutmaz. Kum havuzunun dışında çalışan bir API köprüsüne yerel bir HTTP isteği gönderir. Köprü, OAuth token'ını ana bilgisayar tarafına ekler ve çağrıyı iletir. Yanıt, token kum havuzunun belleğine veya ortamına asla girmeden geri gelir.
İlginç kısım, köprünün kum havuzunun sormaya yetkili olduğunu nasıl bildiğidir. İki kontrol, kasıtlı olarak katmanlı.
İlk olarak, IP izin listesi. Köprü yalnızca kum havuzu ana bilgisayarlarımızın bulunduğu dahili ağ aralığındaki bağlantıları kabul eder. Başka bir yerden (bir geliştirici dizüstü bilgisayarı, sızdırılmış bir URL, genel internet) gelen bir çağrı, herhangi bir uygulama kodu çalıştırılmadan önce ağ katmanında reddedilir. Bu, köprüyü tek bir fiziksel altyapı parçasına sabitler ve dışındaki herkes için işe yaramaz hale getirir.
İkinci olarak, çalıştırma başına basılan kısa ömürlü bir JWT. Bir kum havuzu başlatıldığında, platform bu belirli çalıştırmaya (hangi kullanıcı, hangi uygulama, hangi oturum) kapsamlı ve çalıştırma penceresini kapsayan ve daha fazlasını kapsamayan bir son kullanma tarihi olan bir token imzalar. Kum havuzu, her köprü çağrısında bunu sunar. Köprü, imzayı doğrular, süre sonunu kontrol eder ve ancak o zaman kullanıcının depolanan kimlik bilgilerini çözer ve sunucu tarafına ekler. Bir kum havuzu ele geçirilirse, saldırgan çalıştırmayla birlikte ölen ve yalnızca o tek oturuma kapsamlı çağrıları yetkilendiren bir token alır. Çalınacak ana kimlik bilgisi yoktur.
Aynı köprü, fatura kesintilerini, günlükleri ve metrikleri dışarı taşır, bu nedenle kum havuzu sınırını her iki yönde de geçen tek arayüzdür. Kum havuzunun içindeki diğer her şey varsayılan olarak tehlikeye atılmış olarak kabul edilir.
Yarın bir istem enjeksiyonu, bir ajana process.env'i bir webhook'a dökmesi için ikna ederse, saldırgan yalnızca ağımızın içinden çalışan ve çalıştırmayla birlikte sona eren kısa ömürlü bir JWT alır. Bu özellik, güvenilmeyen kullanıcı kodunu paylaşılan altyapıda endişelenmeden çalıştırmamızı sağlar.
Alttaki desen
Güvenilir, güvenli bulut ajan altyapısı yeni bir sistem değildir. İstisnasız tutulan birkaç özelliktir:
- Durum, kullanıcı değiştirene kadar donmuş halde kum havuzunda yaşar.
- Kod, durumdan bağımsız olarak sıcak değiştirilebilir.
- Kimlik bilgileri ana bilgisayar tarafında yaşar, asla ajanın içinde olmaz.
- Tek bir yürütme hattı, tetikleyici ister bir insan, ister bir zamanlayıcı veya başka bir yazılım parçası olsun, tüm arayanlara hizmet eder.
Bu son özellik, tüm tasarımın can alıcı noktasıdır. Tek bir executeAgent işlevi, UI tıklamalarını, zamanlanmış çalıştırmaları ve API çağrılarını yönetir. Faturalandırma sistemi, kredi kesintisi günlükleri, gözlemlenebilirlik sinyalleri — bir insan Çalıştır'a tıklasın, bir cron tetiklesin veya bir komut dosyası API'yi çağırsın, hepsi aynıdır. Yeni bir tetik yüzeyi eklemek, bir mimari değişikliği değil, bir yönlendirme değişikliğidir. Ajan, tetiği kimin çektiğini bilmez veya umursamaz.
Masaüstü çerçevelerinin size veremeyeceği ve bulut sürümünü inşa etmeye değer kılan şey budur. Bir dizüstü bilgisayardaki ajan, dizüstü bilgisayara bağlıdır. Buluttaki bir ajan, yığınınızın geri kalanının çağırabileceği bir fonksiyondur. Kullanıcı onu bir kez yazar. Platform, onu dağıtımlardan kurtulacak, paylaşılan donanımda güvenle çalışacak ve kullanıcının hiç beklemediği arayanları kabul edecek hale getirir.
Bir ajan, doğal dil arayüzüne sahip bir fonksiyondur. Uygulaması kullanıcıya aittir. Tetik yüzeyi, çalışma zamanı, güvenlik sınırı platforma aittir. Disiplin, katmanları her birinin kendi saatinde gelişecek şekilde inşa etmek ve başka biri yapmadan önce sistemler arasındaki çatlakları bulmak için zaman harcamaktır.
Bir sonraki yüzeyi göndermeyi ucuz ve güvenli kılan şey budur.





