GNL, kendin yazmak ve agent framework'leri
Aynı işi kurmanın üç yolu var: dayanıklılığı kendin yazarsın; tam bir agent framework'ü benimseyip dayanıklılığı üstüne eklersin; ya da zaten koşturduğun Vercel AI SDK agent döngüsünün üstüne oturan bir dayanıklılık katmanından başlarsın. GNL üçüncüsü — ve o çekirdeğin üstünde RAG, workflow ve dinamik agent ağlarını da taşır; her biri ayrı bir alt sistem değil, aynı journal'a yazılan ve yeniden oynatılabilen yetenekler. Bu sayfada hiçbir ürün adı geçmiyor. Hangi framework'ün size uyduğu ekibinize ve probleminize bağlı, ve adaylardan birinin yazdığı karşılaştırma bunun karara bağlanacağı yer değil — onlarınkini de okuyun. Yazmaya değer olan, gerçekten ayrışan eksen ve GNL'in bilerek yapmadığı şeyler.
GNL, Vercel AI SDK'yı değiştirmez — altına ince bir dayanıklılık şeridi olarak oturur.
Özellik matrisi
GNL'in çekirdek ayrımının en net görüldüğü eksenler — dayanıklılık, exactly-once ve deterministik replay — üzerinde üç yaklaşımı yan yana koyuyoruz. Orkestrasyon yüzeyindeki (RAG/workflow/network) pariteyi aşağıdaki "kapanan boşluklar" tablosunda ayrıca ele alıyoruz.
| Eksen | Kendin yaz | Agent framework'leri | GNL |
|---|---|---|---|
| Dayanıklılık (crash → kaldığı yerden devam) | Elle inşa edilir — checkpoint/state yönetimi sana ait | Nadiren çekirdek garanti — tarttığınız ürüne bakın | Çekirdek garanti — her adım journal'a yazılır; senkron replikasyon altında ack'lenmiş 30/30 yazı canlı bir failover'dan sağ çıktı, arkasında 4.900+ test var |
| Aynı yan etkinin iki kez olmaması | Idempotency anahtarlarını kendin tasarlarsın — ve modelin aynı işi yeniden planladığını fark etmen gerekir | Nadiren çekirdek garanti — ve toolCallId'ye bakan her çözüm yeniden planlanan çağrıya kördür | Varsayılan: toolCallId ile anahtarlı, çok-worker CAS yarış testleriyle kanıtlı. Opt-in `idempotency: 'args'` ile ARGÜMANLARLA anahtarlanır — model aynı işi yepyeni bir toolCallId ile yeniden planlasa bile tek kez çalışır (sahadaki baskın duplicate vakası) |
| Anlamca aynı işin tekrarı (hash’in kör olduğu yer) | Yok — “ABC ürününü oluştur” iki farklı şekilde yazıldığında iki iş olur | Yok — bu eksende beyan edilmiş bir çekirdek garanti göremedik | Aday bulunur, karar deterministik alan karşılaştırmasıyla verilir; belirsizlik insana sorulur. Skor asla karar vermez — karar hiyerarşisi: deterministik > insan kapısı > olasılıksal. İki beyan da gerekmezse katman tamamen atıldır (opt-in) |
| Deterministik replay / time-travel | Genelde yok — elle log/debug | Değişir — o framework'ün kendi araçlarına bağlı | Studio'da timeline + time-travel replay |
| Edge-native boyut | Kendi bağımlılıklarına bağlı | Tam çatı (workflow/RAG/memory) — daha geniş yüzey | 32.4 KiB gzip çekirdek, soğuk başlatma maliyeti yok |
| BYO-DB (veri sende kalır) | Neye yazdıysan odur — sende kalır | Değişir — o framework'ün kendi araçlarına bağlı | Sqlite/Postgres/Redis journal — veri her zaman sende |
| Telemetri / phone-home | Yok (kendi kodun) | Değişir — o framework'ün kendi araçlarına bağlı | Yok — ilke. B/C plan yalnızca imzalı AGREGE kullanım check-in'i yapar |
| Yönetişim (onay kuyruğu, denetim, retention/GDPR, policy, eval kapısı) | Elle inşa edilir | Değişir — o framework'ün kendi araçlarına bağlı | Studio ile kutudan çıkar |
“Değişir”, bu eksenin baktığımız framework'lerde beyan edilmiş bir çekirdek garanti olmadığı anlamına gelir — üründen ürüne ve sürümden sürüme farklıdır. Bizim yazdığımız bir tabloya değil, tarttığınız ürünün kendi dokümantasyonuna bakın.
Orkestrasyon yüzeyi
Tam bir agent framework'ünden beklenen şeyler, aynı journal'ın üstünde — yani her biri kendi kuralları olan ayrı bir alt sistem değil, exactly-once ve yeniden oynatılabilir. Her satır kaynak koddaki adlandırılmış bir API'ye dayanır.
| Yetenek | GNL API | Not |
|---|---|---|
| Dinamik multi-agent routing (Supervisor/.network()) | createGnl networks: + runNetwork | Router kararları CAS ile journal'a donar → resume'da router çağrılmaz; maxIterations tavanı + zorunlu final. |
| Hazır scorer kütüphanesi | @gnldev/evals — 8 scorer | faithfulness, hallucination, answerRelevancy, toxicity, bias, completeness, contextPrecision, toneConsistency — hepsi llmJudge sarar, journal-memoized. |
| Dataset & deney yönetimi | createDatasetsManager | İçerik-hash'li versiyon geçmişi, idempotent deney kaydı, compare (aggregate deltalar + regresyon/iyileşme). |
| GraphRAG (dolaylı-ilgi retrieval) | @gnldev/rag — GraphRag | Benzerlik-grafı üzerinden threshold/hops/decay; VectorStore drop-in → createRagTool içinde exactly-once. |
| Chunking + kalıcı vektör DB | chunkText/chunkDocuments + PostgresVectorStore | recursive/markdown/character strateji, deterministik id#i; pgvector (HNSW/ivfflat) InMemory ile aynı arayüz. |
| Semantik tool-arama | @gnldev/processors — toolSearch | Embedding ile topK tool seçimi; seçim journal'lı → resume'da embed koşmaz (always/minScore). |
| Adlandırılmış SSO sağlayıcıları | createAuth0Sso, createWorkOsSso | Auth0 (OIDC code + JWKS RS256) ve WorkOS; imza doğrulama merkezi, CSRF state kancası. |
| Adlandırılmış observability preset'leri | @gnldev/otel — otlpPresets | Langfuse/LangSmith/Braintrust/Honeycomb/Datadog/Collector tek satır; + canlı mod (@gnldev/otel/live). |
| Redis storage adaptörü + dağıtık pubsub | @gnldev/durable/redis — RedisStorage | SET NX ile atomik CAS, native TTL cache; @gnldev/events ile iki-worker fan-out (gerçek Redis entegrasyon testli). |
Kanıt — iddia değil, çalışan test
GNL'in exactly-once/deterministik replay iddiası laf değil; gerçek altyapı üzerinde sınandı.
Canlı failover testi — 30/30 yazı korundu
Senkron replikasyonlu gerçek Postgres primary-SIGKILL → promote senaryosunda 30/30 ack'li CAS yazısı korundu, exactly-once sürdü; yeni primary'de atomiklik 10 tur yarışla kanıtlandı (test/failover-real.test.ts).
Çok-worker CAS yarış testleri
CAS tek-bağlantı varsaymıyor; birden fazla instance aynı run'a yazmaya çalıştığında atomik kaldığı 13 senaryoyla doğrulandı (test/multi-worker.test.ts). Bulunan split-brain kenar durumu putIfMatch CAS'i ile KAPATILDI — gerçek PG+Redis üzerinde takeover yarışıyla doğrulandı.
4.900+ test / 548 dosya yeşil
548 dosyada 5.004 test geçiyor (ölçüm 14 Eyl 2026), gerçek Postgres ve Redis entegrasyonları dahil; her paket temiz typecheck ediyor. 65 test ve 5 dosya varsayılan olarak atlanıyor, çünkü suite’in varsayamayacağı bir ortam istiyorlar — aralarında canlı failover senaryosu da var; o, yeşil sayının parçası değil, ayrı ve tekrarlanabilir bir deney (docker compose + GNL_FAILOVER=1). Journal büyümesi karakterize edildi, uzun ömürlü çalıştırmalarda sıkıştırmayı rolloverRun çözüyor.
Taint guard'ın nedensel kanıtı — 2/5 → 0/N
Aynı model, aynı prompt-injection senaryosu: guard kapalıyken saldırgana para transferi 5 denemenin 2'sinde gerçekleşiyor; guard açıkken (block veya taintGuardian) hiç gerçekleşmiyor (gnl-eval, ölçüm 2026-08-29).
8 farklı runtime'da doğrulandı
Aynı HTTP/Studio handler'ı Hono, node:http, Express, Fastify, Koa, Nest, Bun ve Deno üzerine gerçekten mount edilip ayakta kaldığı test edildi (server-matrix, ölçüm 2026-08-29).
Yük altında doğrusala yakın ölçekleme
PM2 cluster + gerçek Postgres + SSE altında 1 worker 24,5 tur/sn'den 4 worker'da 87,3 tur/sn'ye (3,38×), 8 worker'da 135,8 tur/sn'ye çıktı; 600 eşzamanlı rezervasyon denemesinde tam 200 rezervasyon ve 200 defter satırı oluştu, fazlası olmadı (performance-test, ölçüm 2026-08-29).
BYO-DB: SQLite'tan Postgres'e tek satır
Aynı agent kodu, npm'den gerçek bir paket olarak kurulup (symlink değil) SQLite ve Postgres storage arasında yalnızca tek satır değiştirilerek çalıştırıldı (trial-sqlite/trial-pg, ölçüm 2026-08-29).
Framework'lerin yapıp GNL'in yapmadıkları
Dürüstlük tek yönlü değil. Bunlardan birine ihtiyacınız varsa doğru araç tam bir agent framework'üdür, onu kullanın — bunlar ya bilerek kapsam dışı, ya da henüz yapılmadı:
Ses (Voice: TTS/STT)
Konuşma giriş/çıkışı. Birçok framework'te yerleşik; GNL bunu kapsam dışı bırakıyor.
Kanallar (Slack/WhatsApp)
Hazır Slack/WhatsApp türü kanal entegrasyonları. GNL bunları bilerek atlıyor — uygulamanızın altında duran bir katman, kanallar zaten uygulamanızın işi.
No-code / görsel agent editörü
Görsel, sürükle-bırak agent editörü. GNL kod-öncelikli, böyle bir şey sunmuyor.
~16 storage adaptörü
Depolama arka ucu çeşitliliği. GNL'de 4 tane var (InMemory/SQLite/Postgres/Redis); bazı framework'ler çok daha fazlasını sunuyor. Garanti dördünde de aynı, ama seçenek aralığı dar.
ClickHouse observability adaptörü
ClickHouse gibi gözlemlenebilirlik arka uçları için doğrudan adaptör. GNL adlandırılmış hazır ayarlarla OTLP/OTel üzerinden gidiyor — çoğuna ulaşıyor, ama doğrudan adaptör yok.
GNL ne DEĞİLDİR
Beklentiyi netleştirmek konumlanmanın parçası — GNL'in kapsamadığı alanlar:
Framework değiştirici değil
Vercel AI SDK'nın agent döngüsünü sarar; yerine geçmez, generateText/streamText'i değiştirmez.
No-code / görsel builder değil
GNL kod-öncelikli bir katmandır. Durable RAG (@gnldev/rag), workflow ve agent ağları artık kutudan çıkar — ama no-code agent editörü, ses ya da hazır sohbet kanalları sağlamaz.
Telemetri/analitik platformu değil
Phone-home yok; ilke olarak hiçbir çalışma verisi ya da içerik GNL'e gönderilmez.
Zorunlu barındırma değil
Journal kendi veritabanınızda kalır — GNL veriyi asla barındırmaz.
Yerine değil, altına
GNL'in ayırt edici değeri exactly-once ve deterministik replay çekirdeğidir. Üstündeki orkestrasyon yüzeyi, o garantilerin uygulamanın tamamına ulaşması için var — hâlihazırda memnun kullandığınız bir şeyin yerini aldığı iddiası için değil.