Dokümanlar menüsü
Dinamik agent ağları (networks)
Router-LLM çalışma anında hangi alt-agent'ın koşacağına karar verir; her karar CAS ile journal'a donar → resume/replay'de router yeniden çağrılmaz, aynı yol izlenir.
Ne işe yarar / ne zaman kullanılır#
Statik agent_<name> tool'u ile bir agent'ı başka bir agent'a araç olarak verebilirsiniz — ama hangi alt-agent'ın çağrılacağı prompt akışında sabittir. Bir ağ (network) bunun dinamik hâlidir: bir router-LLM (supervisor) her turda, eldeki ara sonuçlara bakarak kayıtlı agent'lardan hangisine hangi kayıtlı agent'ın hangi görevi alacağına karar verir — ya da yeterince bilgi toplanınca nihai cevabı yazar. Bu, supervisor.network() desenine paritedir.
GNL'in farkı determinizm: router'ın her kararı <runId>:net:route:<i> anahtarına CAS ile donar ( withModelFallback'teki "kazananı dondur" deseninin routing'e uygulanması). Bir run çöküp resume edildiğinde router yeniden çağrılmaz — donmuş kararlar okunur, aynı yol izlenir. Alt-agent adım sonuçları da <runId>:net:step:<i>'ye donar → tamamlanmış bir alt-agent resume'da tamamen atlanır (agent-tool'daki iki-seviye durability ile aynı sinerji).
Kurulum / tanımlama#
Ağlar createGnl yapılandırmasında networks: altında tanımlanır. Her ağ bir router modeli ile yönlendirilebilir kayıtlı agent adlarının listesini alır — router agent seçerken her agent'ın description'ını görür (tek kaynak; agent-as-tool tanıtımıyla aynı).
import { createGnl } from '@gnldev/durable';
const gnl = createGnl({
storage,
agents: {
researcher: { model, description: 'Gathers facts from the web / a knowledge base' },
writer: { model, description: 'Toplanan olgulardan taslak yazar' },
critic: { model, description: 'Reviews the draft and asks for corrections' },
},
networks: {
editorial: {
router: candidateModels, // spec / obje / fallback zinciri / dinamik
agents: ['researcher', 'writer', 'critic'],
system: 'Write a good article; loop with the critic when needed.',
maxIterations: 6, // ceiling on routing turns (default 6)
},
},
});Çalıştırma — runNetwork#
Ağ gnl.runNetwork(name, ...) ile durable çalışır. Alt-agent çağrı semantiği agent-tool ile aynıdır : model fallback nested runId'ye donar, run limitleri aynen miras alınır. Her alt-agent kendi nested journal'ına (net:<runId>:<i>) yazar → mid-crash resume alt-agent seviyesinde de karşılanır.
const res = await gnl.runNetwork('editorial', {
runId: 'r1',
task: 'Write three paragraphs explaining the GNL exactly-once guarantee.',
});
// res => { runId, text, steps: [{ i, agent, task, text }], iterations, interrupts }
Bir alt-agent bir guard'a takılıp askıya alınırsa (interrupts dolu), o adım dondurulmaz — kesinti yukarı taşınır ve suspended: { i, agent, task } işaretlenir. Onaydan sonra aynı runId ile tekrar çağrıldığında route kararı donmuş olduğundan router koşmaz; alt-agent kendi journal'ından resume eder, tamamlanınca adım o zaman donar.
maxIterations tavanı (varsayılan 6) aşılırsa router final'e zorlanır — sınırsız router döngüsü yapısal olarak imkânsızdır. Router 2 denemede de geçerli final üretemezse çökme yerine son adımın (donmuş) metni deterministik olarak döner.Studio — dinamik ağaç#
Studio GET /runs/:id/network ucu, journal'daki route ve step kayıtlarını okuyup ağın dinamik ağacını döner (Networks görünümü). Bu sonradan-türetilir: getNetworkTrace journal'dan router kararlarını ve çalışan adımları çıkarır — canlı-instrument gerekmez, çökme sonrası bile tamdır.
import { getNetworkTrace } from '@gnldev/durable';
const tree = await getNetworkTrace(journal, 'r1');
// tree => { routes: [{ i, decision }], steps: [{ i, agent, task, text }] }API referansı#
createGnl({ networks })networks: Record<string, NetworkConfig> — her ağ router modeli + yönlendirilebilir agent adları + opsiyonel system/maxIterations alır.
gnl.runNetwork(name, { runId, task, context?, limits?, approvals? }) → NetworkResult. Router her turda alt-agent seçer ya da final yazar; kararlar CAS-frozen.
runNetworkRegistry'siz çekirdek: route kararını <runId>:net:route:<i>'ye, adım sonucunu <runId>:net:step:<i>'ye dondurur; interrupts yukarı taşınır.
getNetworkTraceJournal'dan bir network run'ının dinamik ağacını (routes + steps) çıkarır — Studio Networks görünümünün kaynağı.
NetworkResult{ runId, text, steps, iterations, stopped?, interrupts, suspended? }.
NetworkConfig{ router, agents, system?, maxIterations? } — createGnl networks kaydı.
net:<runId>:<i> ) Studio Runs listesinde ayrı top-level run olarak da görünür (nested-run ontolojisi) — ağ ağacı onları hiyerarşik bağlar, tekil run inspector'ında her biri kendi journal timeline'ıyla incelenebilir.