Çalışma Zamanı
Agent & Orchestration
Agent, Luma'da davranışın paketlendiği birimdir: bir model profili, bir rol, izin verilen tool listesi, bellek politikası ve bir veya daha fazla typed method. Bir agent method'u LLM çağırabilir, deterministik hesap yapabilir veya ikisini aynı akışta karıştırabilir.
Agent anatomisi
agent Reporter(rule: string) { // constructor parameter
model: Primary // model profile
role: "{rule}" // system role (interpolated)
temperature: 0
retry: 2
tools: [calculate] // tools exposed to the LLM
contexts: [document] // reachable contexts
uses researcher: Researcher("Belgeden iki bulgu çıkar.")
fn report(topic: string, document: string) -> Report {
research = researcher.research(topic, document)
ask "Araştırmayı rapora dönüştür.\n\nARAŞTIRMA:\n{research}" -> Report
}
}
reporter = Reporter("Tarafsız ve belgeye sadık yaz.")
result = reporter.report(topic, document)| Parça | Açıklama |
|---|---|
| Constructor parametreleri | agent Name(p: string) — instance oluşturulurken verilir, tipli olarak doğrulanır ve tüm method'larda görünür. |
| Yapılandırma anahtarları | key: value biçiminde, method'lardan önce. Sıra önemsizdir. |
uses | Bağımlı agent bildirimi; method içinde name.method(...) ile çağrılır. |
fn method'ları | Tipli giriş ve çıkış. Bir agent birden fazla method içerebilir. |
Instance oluşturma ve çağırma
first = Chatbot() // empty parentheses when there is no constructor parameter
second = Analyst("kural") // the argument count must match exactly
x = first.answer(question) // method call — a top-level operationAynı agent'tan birden fazla instance oluşturabilirsin; memory_scope: "instance" altında her instance kendi geçmişini tutar.
Method türleri
Bir method'un LLM çağırıp çağırmadığı gövdesinden anlaşılır. Üç kalıp vardır:
1 · Deterministik method
agent Calculator {
fn add(a: float, b: float) -> Result {
total = a + b
return { value: total }
}
}Hiç ask yoktur, return ile biter. Gateway'e istek gitmez, .env gerekmez. Dönüş değeri yine de schema'ya göre doğrulanır.
2 · LLM method'u (terminal ask)
agent Analyst {
fn analyze(text: string) -> Analysis {
ask "Metni analiz et: {text}" -> Analysis
}
}Gövde tek bir ask ile biter ve return içermez. ask'in hedef schema'sı method'un dönüş tipiyle birebir aynı olmalıdır (array-lık dahil: -> Analysis[] ise ask … -> Analysis[]).
Terminal ask ile return birlikte yazılırsa parser durur: Agent method f cannot use ask and return together. Karma akış istiyorsan ask'i bir değişkene ata (aşağıdaki 3. kalıp).
3 · Karma method
agent Processor {
tools: [validate]
fn run(input: string) -> Final {
draft = ask "Ham veriyi çıkar: {input}" -> Draft
normalized = normalize(draft) // pure fn
checked = tool validate({ value: normalized }) // direct tool
result = ask "Doğrulama sonucu: {checked}" -> Final
return result
}
}ask bir değişkene atandığında return ile birlikte kullanılabilir. Bu kalıpta akışın tamamını sen kurgularsın: LLM çağrısı, deterministik dönüşüm, tool çağrısı ve kontrol akışı serbestçe karışabilir.
karma method içinde izin verilen adımlar:
ask → pure fn → tool → ask → return
│ │ │ │
│ │ │ └─ ikinci LLM turu
│ │ └─ garantili tool çalıştırma
│ └─ deterministik dönüşüm
└─ typed LLM çıktısı
ayrıca: if · else · switch · for · while · break · continue
try/catch · map · filter · reduce · parallel · dependency çağrısıask statement'ı
ask "prompt metni {variable}" -> Schema
x = ask "prompt metni" -> Schema
x = ask "prompt metni" -> Schema retry 3| Parça | Detay |
|---|---|
| Prompt | Çift tırnaklı tek satır. \n ile satır sonu eklenir; {variable} ve istediğin derinlikte noktalı yol ({variable.field}, {cift.sol.ad}) interpole edilir. |
-> Schema | Hedef schema. JSON Schema'ya çevrilip response_format olarak gönderilir ve yanıt buna göre doğrulanır. |
retry N | Bu ask için deneme sayısı; agent'ın retry ayarını ezer. |
Retry davranışı
Doğrulama başarısız olduğunda prompt'a hata metni eklenerek yeniden denenir:
<orijinal prompt> The previous response failed schema validation. Fix the error and return only valid JSON. Error: Analysis.confidence must be at most 1.
- Toplam deneme sayısı
retry + 1'dir (retry: 2→ en fazla 3 istek). - Her denemenin ayrı bir
attempt_id'si vardır;logical_run_idaynı kalır. - Önceki denemenin hataları sonrakine taşınmaz; her yanıt sıfırdan doğrulanır.
retryable: falseolan model/tool hataları döngüyü anında durdurur (örneğinMODEL_REFUSAL,TOOL_PERMISSION_DENIED).
Modele gönderilen system mesajı
Return only valid JSON matching this schema. Include every required field and
do not add or omit fields: {…üretilen JSON Schema…}
Available context source IDs: ["contract","spec"]. If the output has a field
named sources, use only these IDs.
Agent role: {agent'ın role metni}Bu mesaj otomatik oluşturulur. Senin role metnin sonuna eklenir; prompt'un ise user mesajı olur. Agent'ta memory açıksa geçmiş mesajlar ikisinin arasına girer.
Union dönüş tipi
Bir method'un dönüş tipi hâlâ tektir. Yeni olan şey, bu tipin bir tagged union olabilmesi — tek bir union tipi birden fazla somut schema'yı kapsar, böylece tek method fatura da fiş de çıkarabilir; çağıran tarafın aralarından seçim yapması gereken iki ayrı method'a bölünmeye gerek kalmaz.
schema Invoice {
invoice_number: string
}
schema Receipt {
reference: string
}
schema Document = Invoice | Receipt tagged by kind
agent Extractor {
fn extract(kind: string, text: string) -> Document {
switch kind {
case "Invoice" { ask "Extract the invoice fields:\n{text}" -> Invoice }
case "Receipt" { ask "Extract the receipt fields:\n{text}" -> Receipt }
default { ask "Extract whatever you can:\n{text}" -> Invoice }
}
}
}- Her dalın
ask'i union'ın herhangi bir üyesini hedefleyebilir; dalların birbiriyle uyuşma zorunluluğu yoktur. Union dışından bir schema reddedilir:Ask schema 'Result' is not a member of tagged union 'Document'. - Bir
askunion'ın kendisini de hedefleyebilir —fn extract(...) -> Documentve terminalask … -> Document. Bu durumda tek üyeye daraltmıyorsun: modele bütün üyeler gösteriliyor ve yanıtın tag'i hangisini ürettiğini seçiyor. Kodun ne istediğini zaten biliyorsa üye formunu, hangi üyenin geçerli olduğuna karar vermek modelin işiyse union formunu kullan. - Etiketi senin yerine runtime yazar: terminal
askbir üye ürettiğinde, doğrulamadan hemen önce sonuca discriminator (kind: "Invoice") eklenir. - Etiket
ask'te değil, dönüş sınırında doğar. Üyeask'inden atanan bir değer, dal içindeyken hâlâ üye şeklindedir ve ancak method onu döndürürken union şeklini alır. Dolayısıyla dönüşten önce serileştirilen, loglanan ya da bir tool'a verilen değerin henüz etiketi olmaması meşrudur — orada gerekiyorsa kendin yaz ya da işi dönüşten sonraya taşı. matchdalındaki birreturnaynı şekilde damgalanır;switchdalındaki de case değeri bir member adıysa damgalanır — runtime'a dalın hangi member'ı ürettiğini söyleyen şeycase "Invoice"'dır.- Bunun dışındaki her yerde tag'i sen yazarsın ve parser bunu takip eder.
switch'indefaultdalının,case _wildcard'ının veif/else'in iki kolunun member'ı okuyacağı bir şey yoktur; oradaki birreturnkind:alanını açıkça yazmalıdır. Yazılmazsa program çalışmadan önce durdurulur:
Error: Tagged union method 'classify' branch return must explicitly return discriminator 'kind'.
Alternatif, member'ı dalın döndürdüğü alanlardan tahmin etmek olurdu; bu da tagged union'ın ortadan kaldırmak için var olduğu dene-gör davranışıdır — o yüzden tahmin reddediliyor ve zorunluluk parse zamanında görünür kılınıyor. Bu özellikle önemli, çünkü aşağıdaki bütünlük kuralı sana zaten bir default ya da else yazdırıyor.
Method'un tek üreticisi bir switch ya da if zinciriyse, her girdi dallardan birine düşmelidir — yoksa eşleşmeyen girdide method hiçbir şey üretmemiş olur. Bu yüzden eksik yakalayıcı dal, çalışma anında sürpriz değil, parse hatasıdır:
Error: Switch in method extract requires a default branch for tagged union 'Document'. Error: If in method extract requires an else branch for tagged union 'Document'.
Bu, default'u yasaklayan match'in ayna görüntüsüdür: orada olasılıkları zaten etiketin kendisi sayar, dolayısıyla bütünlük yedek dal eklenerek değil, üyeler kapsanarak kanıtlanır.
Dal içindeki ask, dalı açan satırda da kendi satırında da yazılabilir; ikisi aynı biçimde ayrıştırılır.
Sonucu tüketmek
Değeri alan taraf onu match ile açar; union'ı somut bir üyeye daraltan tek yapı odur:
agent Router {
fn route(document: Document) -> Result {
match document {
case Invoice invoice { return { value: invoice.invoice_number } }
case Receipt receipt { return { value: receipt.reference } }
}
}
}match'i çalıştıran method aynı union'ı döndürüyorsa, daldaki return'ün discriminator'ı yazılır — dal zaten üyeyi adlandırmıştır.
Atanmış ask, method'un sonucu değildir
Method'un ürettiği şey yalnızca terminal ask'tir — yani bir değişkene atanmamış olan — ve dönüş tipiyle ölçülen de yalnızca odur. Değişkene atanmış ask ara değerdir: kendi schema'sına göre doğrulanır, sonra gövdede kullanılır; bu yüzden union'a ait olsun olmasın herhangi bir schema'yı hedefleyebilir.
agent Router {
fn route(text: string) -> Document {
draft = ask "Classify the document: {text}" -> Draft
switch draft.kind {
case "Invoice" { ask "Extract the invoice fields:\n{text}" -> Invoice }
default { ask "Extract the receipt fields:\n{text}" -> Receipt }
}
}
}Draft, Document'ın üyesi değildir ve olması da gerekmez. Kural union olmadan da aynıdır: Result döndüren bir method'ta draft = ask … -> Draft serbesttir, ama Result üretmeyen terminal dal ask'i şu mesajla reddedilir: Every ask in agent method run must use the method return schema 'Result'; ask 1 uses 'Draft'. — mesaj every dese de atanmış ask'ler hiçbir zaman sayılmaz.
Yapılandırma referansı
Model ve istek
| Anahtar | Tip | Varsayılan | Açıklama |
|---|---|---|---|
model | profil adı veya string | legacy gateway | Bir model bloğunun adı ya da tırnak içinde ham model kimliği. |
role | string | — | System rolü. {variable} interpolasyonu yapılır. |
temperature | float | 0 | İstek gövdesine yazılır. |
max_tokens | int | model profilinden | Çıktı token limiti. |
timeout | ms | model profilinden | Tek LLM isteği için timeout. |
retry | int | 0 | Doğrulama hatasında yeniden deneme sayısı. |
run_policy | policy adı | single | Çok modelli strateji. → Run policy |
Tool'lar
| Anahtar | Tip | Varsayılan | Açıklama |
|---|---|---|---|
tools | ad listesi | [] | Hem LLM'e açılan hem de direct çağrılabilen tool'lar. Listede olmayan tool tool adımıyla da çağrılamaz. |
tool_timeout | ms | — | Tool başına varsayılan timeout. |
tool_timeout_max | ms | — | Üst sınır: sonuç min(tool.timeout, tool_timeout_max). |
tool_rate_limit | int | 5 | Tool çağrı sayacı üst sınırı — aşağıdaki kapsam notuna bak. |
tool_concurrency | int | sınırsız | Aynı provider turunda eşzamanlı çalışacak native tool sayısı. |
tool_failure_limit | int | — | Bu kadar hatadan sonra circuit breaker açılır → TOOL_CIRCUIT_OPEN. |
tool_policy | allow · deny_write · approval | allow | Write tool'ları için izin modeli. |
tool_scopes | string listesi | sınırsız | İzin verilen tool scope değerleri. |
tool_contexts | string listesi | tümü | Tool'ların needs ile isteyebileceği context'ler. Boş liste hiçbirine izin vermez. |
Bellek
| Anahtar | Tip | Varsayılan | Açıklama |
|---|---|---|---|
memory | bool | false | Konuşma geçmişinin taşınmasını açar. |
memory_scope | instance · session · shared · persistent | instance | Geçmişin paylaşım kapsamı. |
memory_file | yol | .luma-memory-<Agent>.json | persistent scope için dosya. |
memory_limit | int | sınırsız | Tutulan mesaj sayısı; eskiler atılır. |
memory_retention | ms | sınırsız | Bu süre boyunca dokunulmayan geçmiş silinir. |
memory_access | read_write · read_only | read_write | read_only geçmişi okur ama yazmaz. |
Orchestration ve bütçe
| Anahtar | Tip | Varsayılan | Açıklama |
|---|---|---|---|
contexts | ad listesi | tümü | Prompt içinde interpole edilebilecek context'ler (allowlist). |
parallel_limit | int | sınırsız | Method içi parallel bloğunda eşzamanlılık. |
loop_limit | int | 100 | while döngüsü üst sınırı. |
orchestration_timeout | ms | — | Method'un tamamı için timeout. |
cost_per_1k_tokens | float | 0 | Maliyet hesabı için birim fiyat. |
token_budget | int | — | Aşılırsa MODEL_BUDGET_EXCEEDED. |
cost_budget | float | — | Aşılırsa MODEL_BUDGET_EXCEEDED. |
uses name: Agent(args) | bildirim | — | Bağımlı agent. |
Aynı ayar iki farklı yerde, birbirinden bağımsız sayaçlarla uygulanır:
| Kapsam | Sayaç ne zaman sıfırlanır | Hata mesajı |
|---|---|---|
Direct tool adımları | Her method çağrısında | Agent 'A' tool call limit exceeded (5). |
| Native tool call'ları | Her ask çağrısında (ve her retry denemesinde) | Tool call limit exceeded (5). |
tool_concurrency ise bambaşka bir şeydir: tek bir provider turunda model birden fazla tool çağırdığında bunların kaçının aynı anda çalışacağını belirler.
Dependency agent'lar
agent Researcher(instruction: string) {
contexts: [document]
role: "{instruction}"
fn research(topic: string, document: string) -> Research {
ask "{topic} için belgedeki iki bulguyu çıkar.\n\n{document}" -> Research
}
}
agent Reporter {
contexts: [document]
uses researcher: Researcher("Belgeden iki bulgu çıkar; yeni bilgi ekleme.")
fn report(topic: string, document: string) -> Report {
research = researcher.research(topic, document)
ask "Araştırma sonucunu rapora dönüştür.\n\nARAŞTIRMA:\n{research}" -> Report
}
}| Kural | Detay |
|---|---|
| Bildirim | uses <local_name>: <AgentName>(<constructor arguments>) |
| Çağrı | x = local_name.method(arg…) — kendi satırında. |
| Doğrulama | Constructor argüman sayısı ve method varlığı parse zamanında kontrol edilir. |
| Cycle | Reddedilir: Agent dependency cycle found: A -> B -> A |
| Sonuç | Bağımlı method'un typed sonucu doğrudan değişkene atanır. |
x = name.method(...) satırı dependency çağrısı olarak ayrıştırılır. Bu nedenle bir dependency'ye io, schema, json, math, str, col, date, regex, num veya agent adını verme — bu isimler standard library namespace'lerine ayrılmıştır ve dependency olarak tanınmazlar.
Memory
agent Chatbot {
role: "Önceki konuşmayı hatırla."
memory: true
memory_scope: "session"
memory_limit: 6
memory_retention: 60000
memory_access: "read_write"
fn answer(question: string) -> Answer {
ask "Yeni soru: {question}" -> Answer
}
}Scope'lar
| Scope | Geçmiş neyle paylaşılır | parallel over içinde | Kullanım |
|---|---|---|---|
instance varsayılan | Yalnızca o instance | izole | Bağımsız oturumlar; first = C() ve second = C() birbirini görmez. |
session | Aynı agent tipinin tüm instance'ları | paylaşımlı · yarışlı | Tek kullanıcı, çok adımlı akış. |
shared | Tüm agent'lar | paylaşımlı · yarışlı | Ortak bağlam havuzu; dikkatli kullan. |
persistent | Aynı agent tipi + dosya | paylaşımlı · yarışlı | Program yeniden çalıştığında geçmiş korunur. |
Davranış
- Geçmiş,
user(prompt) veassistant(JSON'a çevrilmiş sonuç) mesaj çiftleri olarak tutulur. - Mesajlar system mesajı ile güncel prompt arasına yerleştirilir.
memory_limitaşıldığında en eski mesajlar atılır.memory_retentionsüresi boyunca dokunulmayan geçmiş tamamen silinir.memory_access: "read_only"geçmişi okur ama yenisini yazmaz.persistentgeçmiş, method'un terminalask'i tamamlandıktan sonra dosyaya yazılır.
Her mesaj sonraki isteğin prompt token'larına eklenir. memory_limit vermeden shared scope kullanmak token tüketimini hızla büyütür. token_budget ile üst sınır koymak iyi bir alışkanlıktır.
Geçmiş instance'a göre değil scope'a göre anahtarlanır. Yalnızca instance instance başına anahtarlar; session, shared ve persistent agent adına göre anahtarlar, yani bir parallel over içinde her eleman tek bir geçmişi okur ve yazar. memory_scope: "session" ile üç satır üzerinde, giden istek başına history mesajı sayılarak ölçüldü: limit 1 2, 4, 6 veriyor — geçmiş paylaşılıyor ve büyüyor — limit 3 ise 2, 2, 2 veriyor, üçü de aynı depoyu yarışıyor. Gerçekte gönderilen prompt böylece limit'e bağlanıyor, ki o başka türlü yalnızca bir eşzamanlılık tavanı. Fan-out içinde agent'ları varsayılan scope'ta tut.
Koşular arasında kalıcı olan iki şey var ve birbirinin yerine geçmezler. Agent memory, runtime'ın senin için yönettiği konuşma geçmişidir: terminal bir ask'ten sonra otomatik yazılır, user/assistant mesaj çiftleri biçimindedir ve persistent'ın varsayılan bir dosyası vardır (.luma-memory-<Agent>.json). std/state ise açıkça yazdığın bir key/value deposudur, düz string tutar ve varsayılan konumu yoktur — --state-file zorunludur, çünkü sessiz bir varsayılan sessiz veri kaybıdır. Modele konuşma bağlamı vermek için memory'ye, bir pipeline'ın nerede durduğunu hatırlamak için state'e uzan.
Context erişim kontrolü
context secret = file("docs/secret.md")
context public = file("docs/public.md")
agent Summarizer {
contexts: [public] // only "public" can be interpolated
fn summarize(public: string) -> Summary {
ask "Özetle:\n{public}" -> Summary
}
}contexts verilmezse tüm context'lere erişim serbesttir. Liste verildiğinde, listede olmayan bir context adını prompt'ta interpole etmeye çalışmak çalışma zamanında hata verir:
Error: Agent context access was denied: secret
Aynı liste, schema'daki sources alanının doğrulanacağı kimlik kümesini de belirler.
Method içinde parallel
schema Bundle {
first: StatsResult
second: StatsResult
}
agent Pipeline {
tools: [text_stats]
parallel_limit: 2
fn run(text: string) -> Answer {
bundle = parallel -> Bundle {
first = tool text_stats({ text: text })
second = tool text_stats({ text: text })
}
ask "Sonuçlar: {bundle}" -> Answer
}
}- Blok içindeki her adım eşzamanlı çalışır; eşzamanlılık
parallel_limitile sınırlanır. - Sonuç, adım değişken adlarıyla anahtarlanmış bir nesnedir:
{ first: …, second: … }. -> Schemaverilirse toplanan nesne o schema'ya göre doğrulanır.- Blok içinde
ask,toolve dependency çağrıları kullanılabilir.
Üst düzey parallel: fan-out / fan-in
analyses = parallel -> AnalysisBundle {
technical = technicalAgent.analyze(topic, document)
risk = riskAgent.assess(topic, document)
}
report = editor.combine(analyses)Seçenekler
Değiştiriciler tam olarak şu sırayla yazılmalıdır; sıra bozulursa satır parallel bloğu olarak tanınmaz:
x = parallel on_error … limit … timeout … fan_in … on_conflict …
fallback inst.method(…) merge inst.method(…) -> Schema {| Seçenek | Değerler | Varsayılan | Anlamı |
|---|---|---|---|
on_error | fail_fast · continue · fallback | fail_fast | fail_fast: ilk hatada diğerleri iptal edilir. continue: hatalar toplanır, başarılılar döner. fallback: hata olursa yedek çağrı çalışır. |
limit | sayı | sınırsız | Eşzamanlı dal sayısı. |
timeout | ms | — | Her dal için ayrı timeout; aşan dal iptal edilir. |
fan_in | nested · flat | nested | nested: { branch_name: result }. flat: sonuç nesnelerinin anahtarları tek düzeye birleştirilir. |
on_conflict | error · first · last | error | flat birleştirmede aynı anahtar iki kez gelirse ne yapılacağı. |
fallback | inst.method(args) | — | on_error fallback ile zorunlu. |
merge | inst.method(args?) | — | Birleşmiş sonucu bir agent method'una verip nihai değeri üretir. Argüman verilmezse toplanan nesne tek argüman olarak geçilir. |
-> Schema | schema adı | — | Nihai sonucun doğrulanacağı schema. |
Örnekler
// Swallow the errors, collect the successes
partial = parallel on_error continue limit 1 {
good = calc1.add(2, 3)
bad = calc2.add("yanlis", 3)
}
// Run a backup agent if everything fails
backed = parallel on_error fallback fallback calc3.add(10, 1) {
bad = calc2.add("yanlis", 3)
}
// Flat merge + a dedicated fan-in agent
result = parallel fan_in flat on_conflict last merge combiner.combine -> CalcResult {
first = calc1.add(2, 3)
second = calc2.add(7, 8)
}continue modunda başarısız dallar sonuç nesnesine _errors anahtarı altında eklenir:
{ "good": { "result": 5 }, "_errors": { "bad": "add.input.a must be a number." } }Hata varsa -> Schema doğrulaması atlanır (aksi halde _errors bilinmeyen alan sayılırdı).
Bir parallel bloğunda aynı agent instance'ı birden fazla dalda geçemez: The same agent instance cannot be used more than once in parallel. Her dal için ayrı instance oluştur.
parallel over: veri fan-out'u (v0.4.0)
Yukarıdaki parallel biçimleri bildirilen dallar üzerinde fan-out yapar — yazdığın sabit bir küme. Kardeşi parallel over ise veri üzerinde fan-out yapar, eleman başına bir gövde değerlendirir:
classified = parallel over rows as row limit 4 -> Classified[] {
result = classifier.classify(row)
return result
}Gövde method gövdesi kurallarına uyar — ask, tool çağrıları, match, for — ama parallel over'ın kendisi üst düzey bir operation'dır ve bir agent method'unun içinde yer alamaz. Sahibi olan bir agent'ı yoktur; runtime sentetik bir tane kurar — her elemanın bağımlılıklarını kendi instance key'i altında çözmesinin sebebi de budur. Bu, geçmişi yalnızca varsayılan memory_scope: instance altında izole eder — session, shared ve persistent agent adına göre anahtarlanır, yani onlarda her eleman tek bir geçmişi paylaşır ve limit > 1 sırayı yarışa çevirir.
Kuralların tamamı — girdi sırasında sonuçlar, zorunlu limit, sabit seçenek sırası ve limit'in bir datasource'un pool_max'ıyla etkileşimi — Veri & Entegrasyon sayfasında.
Bütçeler ve limitler
agent Controlled {
model: Primary
cost_per_1k_tokens: 0.01
token_budget: 20000
cost_budget: 0.50
orchestration_timeout: 120000
loop_limit: 50
}LLM yanıtı döndü ↓ usage okundu (prompt_tokens · completion_tokens · total_tokens · reasoning_tokens) ↓ maliyet = total_tokens / 1000 × cost_per_1k_tokens ↓ agent bütçe durumu güncellendi ↓ token_budget veya cost_budget aşıldı mı? ├── evet → MODEL_BUDGET_EXCEEDED (retryable: false → retry döngüsü durur) └── hayır → akış devam eder
- Bütçe kontrolü yanıt alındıktan sonra yapılır: limiti aşan istek çalışır, ama sonraki istek engellenir.
- Bütçe durumu tek bir
askboyunca taşınır; o çağrının her retry denemesi aynı havuzdan harcar. Run policy adayları ayrı havuz alır —escalatehariç, orada tüm merdiven tek havuzu paylaşır. cost_per_1k_tokensverilmezse maliyet0hesaplanır vecost_budgethiç tetiklenmez.orchestration_timeoutmethod'un tamamını kapsar; aşılırsaAgent 'A.f' orchestration timeout occurred (N ms).
| Limit | Kapsam | Varsayılan |
|---|---|---|
timeout | Tek LLM isteği | model profilinden |
orchestration_timeout | Method'un tamamı | sınırsız |
tool_timeout / tool_timeout_max | Tek tool çalıştırma | sınırsız |
loop_limit | while yinelemesi | 100 |
tool_rate_limit | Tool çağrı sayısı | 5 |
token_budget / cost_budget | Agent method çağrısı | sınırsız |