GNL
Dokümanlar menüsü
Core · Ücretsiz@gnldev/durable

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 (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ı).

createGnl — networks tanımı
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#

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.

runNetwork — dinamik yönlendirme
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.

Garanti
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.

getNetworkTrace — gözlemlenebilirlik
import { getNetworkTrace } from '@gnldev/durable';

const tree = await getNetworkTrace(journal, 'r1');
// tree => { routes: [{ i, decision }], steps: [{ i, agent, task, text }] }

API referansı#

fncreateGnl({ networks })

networks: Record<string, NetworkConfig> — her ağ router modeli + yönlendirilebilir agent adları + opsiyonel system/maxIterations alır.

fngnl.runNetwork

(name, { runId, task, context?, limits?, approvals? }) → NetworkResult. Router her turda alt-agent seçer ya da final yazar; kararlar CAS-frozen.

fnrunNetwork

Registry'siz çekirdek: route kararını <runId>:net:route:<i>'ye, adım sonucunu <runId>:net:step:<i>'ye dondurur; interrupts yukarı taşınır.

fngetNetworkTrace

Journal'dan bir network run'ının dinamik ağacını (routes + steps) çıkarır — Studio Networks görünümünün kaynağı.

typeNetworkResult

{ runId, text, steps, iterations, stopped?, interrupts, suspended? }.

typeNetworkConfig

{ router, agents, system?, maxIterations? } — createGnl networks kaydı.

İpucu
Nested alt-agent run'ları (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.