Ajanımızı tamamen Pi, Agents SDK ve Code Mode ile Durable Object üzerinde çalışacak şekilde yeniden yazdık

@Vercantez
İNGILIZCE3 gün önce · 28 Tem 2026
519K
1.6K
166
82
3.5K

TL;DR

camelAI'ın VM tabanlı altyapıdan Cloudflare tabanlı bir yığına geçişinin, maliyeti ve performansı optimize etmek için Bash yerine JavaScript kullanımının teknik bir incelemesi.

Geçtiğimiz günlerde camelAI ajanını sanal makinelerden taşımayı tamamladık. Ajan artık bir Cloudflare Durable Object içinde çalışıyor, dosya sistemi SQLite ve R2'de yaşıyor ve bash yerine JavaScript yazıyor. Çoğu ekip kodlama ajanlarını tam bir Linux VM veya konteyner sandbox'ında çalıştırır ve biz de eskiden böyle yapıyorduk.

VM'lerden kurtulmak istedik çünkü her kullanıcıya her zaman açık, bağlı diskli bir makine vermek ölçeklenemeyecek kadar pahalıydı. Zor kısım ise kodlama ajanlarının Linux varsayımıyla çalışması. Bash kullanmaya eğitilmişler ve başlangıçta kullandığımız altyapı tam bir VM gerektiriyordu, bu yüzden bu noktaya gelmek üç yeniden tasarım aldı. Bunun karşılığında, ajan artık yalnızca açık bir yöntem oluşturduğumuz şeyleri yapabiliyor; bu kulağa sınırlayıcı gelse de ürün için iyi oldu.

Ben Miguel, camelAI'nin CTO'su. Kod tabanımız yakın zamanda açık kaynak oldu, bu yazıdaki her şey github.com/qaml-ai/camelAI adresinde okuyabileceğiniz kodlardan oluşuyor. İlgili dosyalara ilerledikçe bağlantı vereceğim. İşte ilerleme.

Sıfırıncı adım: VM dönemi

Claude Code altyapısıyla başladık, bu altyapı çalışmak için tam bir sanal makine gerektiriyor. Birkaç VM sağlayıcısı denedik, hiçbiri kalıcılık ve performans gereksinimlerimize uymadı ve sonunda kendi konteyner hizmetimizi oluşturduk. Bu yazı hâlâ yayında, ancak artık bu altyapının hiçbirini çalıştırmıyoruz.

Konteyner hizmeti işe yaradı ama ağırdı. Her kullanıcı için her zaman açık bir VM pahalıdır ve her kullanıcının dosyalarını hızlı bağlı diskte tutmak da öyle. Ölçeklendirmek, gerçek makineleri ve gerçek diskleri ölçeklendirmek anlamına geliyordu ki bu da hedeflediğimiz kullanıcı sayılarında aşırı pahalı olacaktı. Bu yüzden VM orkestrasyonu konusunda akıllı olmaya çalışmak yerine, hiç VM gerektirmeyecek şekilde tasarım yapmaya başladık.

Birinci adım: Ajanı VM'den çıkarmak

Claude Code altyapısı VM'sinden ayrılamaz, bu yüzden ilk hamle kendi altyapımızı oluşturmaktı. Bunu, Mario Zechner'in açık kaynak kodlama ajanı pi üzerine inşa ettik. pi bir kütüphane yığınıdır. En üst katman normal bir işletim sistemi varsayar, ancak alt katmanlar size ajan döngüsü ve durum yönetimi gibi ajan temel öğelerini nerede çalıştıklarını umursamadan verir. pi kodunda hiçbir değişiklik yapmadık. Bu alt katmanları içe aktardık ve üzerlerine kendi altyapımızı inşa ettik ve bir Linux ortamı yerine Cloudflare Durable Object içinde çalıştırdık.

Durable Object, Cloudflare'in ucunda, onu oluşturan kullanıcıya yakın bir yerde açılan küçük, durum bilgisi olan bir hesaplama örneğidir. Her sohbet dizisi kendi Durable Object'ine sahip olur ve bu, her şeyi merkezi bir VM sunucusu üzerinden yönlendirmeye kıyasla gecikmeyi kendi başına düşürdü.

Bu aşamada VM'leri tuttuk, ancak ajan artık bir VM'nin içinde yaşamıyordu. Komut çalıştırması gerektiğinde VM'ye uzaktan çağrı yapıyordu. Anthropic, yönetilen ajanları için aynı bölünmeyi tanımlar: beyin ellerden ayrılır. Bu bize bazı güzel özellikler kazandırdı:

  • Ajan, VM uyanmadan önce yanıt vermeye başlar çünkü bir makinenin başlamasını beklemez.
  • VM, ajan çalışmaya devam ederken uykuya dönebilir veya işlem herhangi bir komut gerektirmiyorsa hiç uyanmayabilir.
  • Bir beyin birden fazla eli kontrol edebilir. Tek bir ajan aynı anda birden fazla VM'yi çalıştırabilir.

Bu ellere projeler diyoruz. Her proje, komutları yürütmek için bir VM ve Cloudflare Artifacts aracılığıyla programlı olarak oluşturulmuş bir git deposu ile geliyordu; Artifacts, bir Worker üzerinden anında sağlanabilen git uyumlu bir depolamadır. Ajan, VM dışında çalıştığını pek fark etmiyordu. Hâlâ bash'ı vardı ve diğer kodlama ajanları gibi çalışıyordu.

Sorun şu ki bu yalnızca gecikmeyi düzeltti, başka bir şeyi değil. Hâlâ kullanıcı başına bir VM'imiz vardı, bu yüzden orijinal tasarımdaki tüm maliyet ve ölçekleme sorunları devam ediyordu.

İkinci adım: VM'yi kaldırmak

Bir sonraki sürüm aynı proje yapısını korudu ancak arkasındaki VM'yi kaldırdı. Artık her proje, Durable Object içinde yaşayan bir dosya sistemi tarafından destekleniyor ve daha büyük dosyalar için arkasında R2 bulunuyor.

Bunu biz icat etmedik. Cloudflare'in ajan ekibi, Worker'lar için deneysel bir dosya sistemi ve yürütme çalışma zamanı olan Shell'i geliştirdi ve biz onların kodlarını yoğun bir şekilde yeniden kullandık. Mekanikler basit. Bir Durable Object'in depolaması, 10 GB sınırı olan bir SQLite veritabanıdır ve her satırın maksimum bir boyutu vardır. Küçük dosyalar doğrudan SQLite satırlarında yaşar. Yaklaşık 1,5 MB'ın üzerindeki dosyalar R2'ye yazılır ve SQLite satırı yalnızca bir işaretçi tutar. Ajan için normal bir dosya sistemi gibi görünür, ancak altında bir veritabanı ve nesne depolama vardır, bu nedenle kalıcılık, canlı tutmamız gereken bir altyapıdan ziyade depolanmış veridir.

Sürüm geçmişi hâlâ Artifacts üzerinden çalışır, bu nedenle her proje, bir git sunucusu barındırmamıza gerek kalmadan bir git geçmişi tutar.

Üçüncü adım: Bash'i kaldırmak

Bash'i kaldırmak radikal bir adımdı. Kodlama ajanları bash kullanmaya eğitilmiştir ve bash, herkesin onları VM'lerde çalıştırmasının da nedenidir. Aynı zamanda maliyetin ötesinde bir sorundu. Bash ve ağ erişimi olan bir ajanın yararlı bir şey yapması için kimlik bilgilerine ihtiyacı vardır ve kimlik doğrulamalı proxy URL'leri ile ilgili girişimlerimiz giderek karmaşıklaşıyor ve uygulanması zorlaşıyordu.

Bu yüzden onu kaldırdık. Bash yerine ajan, Code Mode ve Cloudflare'in dinamik Worker yükleyicileri aracılığıyla yürütülen JavaScript yazıyor. Her yürütme, milisaniyeler içinde başlayan ve birkaç megabayt bellek kullanan yeni bir V8 yalıtımında çalışır. Sandbox, kullanıcının veri bağlantıları ve platformun yapabileceği her şey için yöntemler ile önceden yüklenmiş olarak gelir. Kimlik bilgileri asla sandbox'a girmez. Ajan bir bağlantının yöntemlerini çağırır ve kimlik doğrulama bizim tarafımızda gerçekleşir.

Ajanların bash'i ne için kullandığına baktığınızda, onu kaybetmenin beklediğinizden daha az maliyetli olduğunu görürsünüz. Çoğu, ajanın yerel araçlara sahip olduğu dosya işlemleridir. Okuma, yazma ve düzenleme ile birlikte kendi grep ve glob uygulamalarımızı veriyoruz. Bu, 80-20 kuralını karşılıyor. Geri kalanı, belirli işler için belirli komutlardır ve bunlar açık yöntemler haline geldi:

  • Bir proxy üzerinden wrangler deploy, tamamen kontrol ettiğimiz bir deploy_project yöntemi haline geldi. Bir dağıtımın tam olarak ne zaman gerçekleştiğini bildiğimiz için, ona bağlanıp otomatik olarak canlı bir önizleme açabiliyoruz. Önceden, hangi iş parçacığının bir şey dağıttığını tahmin etmek için proxy'lenmiş wrangler trafiğini koklamamız gerekiyordu.
  • Kullanıcının uygulamasını oluşturmak ve Python notebook'larını çalıştırmak, her ikisi de kısa ömürlü konteynerler tarafından desteklenen kendi yöntemleri haline geldi.

Bu iki iş için konteynerleri tuttuk çünkü gerçekten Linux'a ihtiyaç duyuyorlar. Kullanıcı uygulamaları Vite, Tailwind ve React Router ile oluşturuluyor ve bağımlılık eklemek bun install çalıştırmak anlamına geliyor. Derlemeleri bir Worker içinde çalıştırmayı düşündük, çünkü derlenen şeyin kendisi bir Worker, ancak bu yol iyi desteklenmiyor ve Worker'ların 128 MB bellek sınırı ve bir CPU'nun çok küçük bir kısmı var. Derlemeler yavaş olurdu ve birçok proje bellek sınırını aşardı. Bunun yerine bir derleme, Cloudflare Sandbox SDK aracılığıyla bir konteyner başlatır, projeyi kopyalar, işi çalıştırır, sonucu döndürür ve konteyneri kapatır. Notebook çalıştırmaları da aynı şekilde çalışır. Hâlâ tam Linux kullanıyoruz, ancak yalnızca gerçekten ihtiyaç duyulan saniyeler boyunca.

Dürüst olmak gerekirse olumsuz yanı, ajanın neye ihtiyacı olacağını önceden kestirmek zorunda olmamız. Bash ile kendi başına bir şeyler çözebiliyordu. Şimdi, bir yetenek eksikse, onu eklemek zorundayız. Pratikte bu baskı ürün için iyi oldu, çünkü kullanıcıların ne yaptığını düşünmeye ve ajanın doğaçlama yapmasına izin vermek yerine bunun için birinci sınıf bir yol oluşturmaya zorluyor.

Beklenmedik bir fayda da oldu. Bash açık uçludur ve ucuz modeller açık uçlu ortamlarda zorlanır. Daha küçük bir dizi açık yöntemle belirgin şekilde daha iyi performans gösterirler; bu önemlidir çünkü camelAI'yi çalıştırmanın ucuz kalması bu mimarinin amacıdır.

Bizi nereye getirdi

Artık yığın şu şekilde: ajan ve dosya sistemi için Durable Objects, büyük dosyalar için R2, git geçmişi için Artifacts, altyapı olarak pi ve yürütme için Code Mode ile dinamik Worker'lar. Diğer Cloudflare uygulamaları gibi dağıtılır ve yönetilecek harici konteyner hizmeti yoktur.

Dinamik Worker'lar, çalışma süresi başına değil, yürütme başına faturalandırılır. Binlerce yürütme, eskiden değerlendirdiğimiz hizmetlerde birkaç dakikalık konteyner süresinin maliyetine denk gelir. Gecikme düşüktür çünkü her şey kullanıcıya yakın uçta çalışır ve ölçeklendirme Cloudflare'in sorunudur, bizim değil.

Kullanıcılar hâlâ canlı URL'lere tam yığın uygulamalar oluşturup dağıtıyor ve ajan hâlâ okuyor, yazıyor, grep yapıyor ve dağıtıyor. Kullanıcı tarafında hiçbir şey değişmedi.

Kısacası

Kendi oluşturduğumuz bir VM hizmetinde Claude Code altyapısıyla başladık; bu pahalıydı ve ölçeklenmesi zordu. Önce ajanın kendisini bir Cloudflare Durable Object'e taşıdık ve VM'leri uzaktan kontrol etmesini sağladık; bu gecikmeyi düzeltti ancak maliyeti değil. Ardından VM'leri tamamen kaldırdık ve Cloudflare'in Shell projesine dayanan, Durable Object SQLite ve R2'de depolanan bir dosya sistemi ile git geçmişini Cloudflare Artifacts aracılığıyla sağladık. Son olarak bash'i kaldırdık ve ajana Code Mode ve dinamik Worker'lar aracılığıyla bir JavaScript sandbox'ı ile dağıtım, derleme ve notebook'lar için açık yöntemler verdik. Sonuç, katbekat daha ucuz, daha düşük gecikmeli, işletmesi daha basit ve daha küçük modellerin yönlendirmesi için daha kolay. Her şey github.com/qaml-ai/camelAI adresinde açık kaynak olarak mevcut.

Tek tıkla kaydet

YouMind ile viral makaleleri AI derin okumayla incele

Kaynağı kaydedin, odaklı sorular sorun, argümanı özetleyin ve viral bir makaleyi tek bir AI çalışma alanında yeniden kullanılabilir notlara dönüştürün.

YouMind'ı keşfet
Üreticiler için

Markdown'ınızı temiz bir 𝕏 makalesine dönüştürün

Kendi uzun yazılarınızı yayımlarken görselleri, tabloları ve kod bloklarını 𝕏 için biçimlendirmek zahmetlidir. YouMind, eksiksiz bir Markdown taslağını temiz ve hemen paylaşılabilir bir 𝕏 makalesine dönüştürür.

Markdown'dan 𝕏'e deneyin

Çözülecek daha fazla kalıp

Son viral makaleler

Daha fazla viral makale keşfet