Temelinden dayanıklı, tam bir agent framework'ü
GNL ekibiarchitecturedurabilityframework
Dayanıklılık sonradan eklediğimiz bir eklenti değil. GNL'in diğer her paketi bu çekirdeğin üstünde duruyor. Hepsini kullan ya da yalnızca çekirdeği — ve birinden ötekine adım adım geç.
Kısaca#
GNL, Vercel AI SDK üstüne kurulu, TypeScript için tam bir agent framework'ü: çalışma zamanı, HTTP sunucusu, Studio, iş akışları, RAG, bellek, değerlendirme, yetkilendirme ve kanallar. Hepsini kullanabilirsin. Ya da yalnızca çekirdeği mevcut ajanına takabilirsin.
İkisi de aynı ürün, çünkü geri kalan her şey o çekirdeğin üstüne kurulu.
Çekirdek neden dayanıklılık#
Ajanlar yarıda kalır. Süreç, iade yapıldıktan sonra ve cevap gönderilmeden önce yeniden başlar. Bir kuyruk bir turu yeniden dener. Dayanıklılık sonradan eklenen bir katmansa, ne yaptığını bilmeyen bir döngünün dışında durur. Döngüyü yeniden çalıştırabilir, ama hangi araç çağrılarının zaten yapıldığını bilemez.
GNL'de çekirdek, kendi veritabanındaki bir journal'dır. Her model adımı ve her araç çağrısı oraya kaydedilir. Bir koşuyu aynı kimlikle yeniden çağır; biten adımlar journal'dan yeniden oynatılır. Zaten çalışmış bir araç tekrar çalışmaz, yalnızca hiç bitmeyen kısım çalışır.
Diğer her paket işini aynı journal'a yazar. Böylece kendi garantisini kurmadan aynı garantiyi alır. Bir paketin eklediği araç ya da adım, çekirdeğinki gibi journal'a yazılır: çökmeden sonra yeniden oynatılır, asla iki kez çalışmaz. Slack ya da Telegram'dan gelen bir mesaj bir kez işlenir, cevap bir kez gönderilir.
Elindeki ajanla başla#
İlk adım hiçbir şeyi taşımanı istemez. runDurable, generateText ile aynı argümanları alır, üstüne iki tane daha: bu işin kimliği (runId) ve kendi veritabanındaki bir journal.
import { runDurable, gnlTool } from '@gnldev/durable';
import { SqliteStorage } from '@gnldev/durable/sqlite';
import { openai } from '@ai-sdk/openai';
import { tool } from 'ai';
import { z } from 'zod';
const storage = new SqliteStorage('runs.db');
const refund = gnlTool(
tool({
description: 'Refund an order',
inputSchema: z.object({ orderId: z.string() }),
execute: async ({ orderId }) => ({ refunded: orderId }),
}),
{ sideEffect: true, idempotency: 'args' },
);
const res = await runDurable({
runId: 'refund-order-42', // the id of THIS work — call again with it after a crash
journal: storage.runs,
model: openai('gpt-4o'),
tools: { refund },
prompt: 'Refund order 42',
});Çökmeden sonra aynı kimlikle tekrar çağır. Biten adımlar journal'dan yeniden oynatılır, iade ikinci kez yapılmaz, yalnızca hiç bitmeyen kısım çalışır.
Sonra ihtiyacın olanı ekle#
Her adım bir öncekinin verdiğini korur. Hiçbiri yeniden yazma değil; herhangi birinde durabilirsin.
- Kayıt —
createGnl: adıyla ajanlar, kendi kimliğinle adlanan iş, onu başlatan çağrıdan uzun yaşayan koşular, onaylar. - Sunucu —
createRestApi: her ajan için REST, OpenAPI ve server-sent events; yetkilendirme, limitler ve bütçelerle. - Studio — her koşu bir zaman çizelgesinde, zamanda yolculuk ve fork, onay kuyruğu, playground.
- Paketler — bellek, iş akışları, RAG, değerlendirme, MCP, işler, kanallar. Her biri diğerleriyle de tek başına da çalışır.
Her adımın koduyla birlikte tam anlatım çekirdekten tüm framework'e rehberinde.
Yapmadıkları#
GNL önce koddur: görsel bir ajan editörü ve ses yok. AI SDK'nın yerini almaz; modellerin ve araçların olduğu gibi kalır. Journal kendi veritabanında kalır ve bize hiçbir koşu verisi gönderilmez. Karşılaştırma sayfası bu sınırları ve diğer framework'lerin yapıp GNL'in yapmadıklarını listeler.
npm create gnl@latest my-agent kaydı, sunucuyu ve Studio'yu tek seferde kurar.