Luma public docs
English

Operasyon

Hata Referansı

Luma model ve tool hatalarını normalize eder: bunların her biri bir kod, bir mesaj ve bir retryable bayrağı taşır; bu bayrak retry döngüsünün ve run policy'lerin davranışını doğrudan belirler. Parse hataları, doğrulama hataları ve v0.4.0 veri yüzeyinin tamamı bu normalizasyonun dışındadır — yalnızca mesaj taşırlar.

Hata biçimi

Error: [TOOL_INPUT_INVALID] calculate.input.a must be a number.

CLI hataları Error: [CODE] message biçimindedir ve exit code 1 ile sonlanır. Kod yalnızca normalize edilmiş model/tool hatalarında görünür. Parse hataları, doğrulama hataları ve her veri yüzeyi hatası — datasource/query/command, std/http, std/state, parallel over — kodsuzdur; yani CLI satırı önünde [CODE] olmadan doğrudan mesajla başlar.

try/catch içinde yakalandığında hata bir nesnedir:

json
{
  "code":      "TOOL_TIMEOUT",
  "message":   "Tool 'http_get' timeout occurred (3000 ms).",
  "retryable": true,
  "details":   { "url": "https://…" }
}
luma
import agent from "std/agent"

} catch error {
  code = agent.errorCode(error)        // "TOOL_TIMEOUT"
  msg  = agent.errorMessage(error)
  if agent.isRetryable(error) {
    ...
  }
}

Normalize edilmemiş hatalar yalnızca message taşır: bir pure fn içindeki tip hatası ve veri yüzeyi hatalarının tamamı. Bunlarda agent.errorCode null, agent.isRetryable ise false döner — bayrak hatanın kendi retryable alanını okur ve kodsuz bir hatada böyle bir alan yoktur. Bunları mesaj metniyle eşleştir.

Model hataları

KodDurumNe zamanNe yapmalı
MODEL_PROVIDER_ERRORkalıcı / retryableGateway 2xx dışı yanıt verdi (429 ve 408 dışında).5xx, 409 ve 425 retryable'dır. Kalıcı olanlar için base_url, model kimliği ve yetkiyi kontrol et.
MODEL_RATE_LIMITretryableHTTP 429.fallback policy ile ikinci modele geç veya isteği yavaşlat.
MODEL_TIMEOUTretryableHTTP 408 veya istemci tarafı timeout.timeout değerini yükselt; büyük prompt'ları böl.
MODEL_CANCELLEDkalıcıHTTP 499 veya iptal sinyali (race kaybedeni, parallel timeout'u).Genellikle beklenen davranıştır.
MODEL_EMPTY_CONTENTretryableProvider içerik döndürmedi.max_tokens çok düşük olabilir; streaming yanıtı erken kesilmiş olabilir.
MODEL_INVALID_RESPONSEretryableYanıt ayrıştırılamadı, geçerli JSON değildi ya da schema doğrulamasından geçmedi.En sık görülen hata. retry ver, schema'yı daralt, @desc ve @feedback ekle.
MODEL_REFUSALkalıcıModel isteği açıkça reddetti.Prompt'u yeniden yaz — retry etmez, etmemeli.
MODEL_INVALID_TOOL_CALLretryableTool call argümanları geçerli JSON değildi.Tool parametre schema'sını sadeleştir.
MODEL_UNSUPPORTEDkalıcıTanınmayan provider değeri. Normalde parse zamanında yakalanır; bu kod yalnızca savunma amaçlıdır.Geçerli provider adlarını buradan kontrol et.
MODEL_BUDGET_EXCEEDEDkalıcıtoken_budget, cost_budget veya fusion_input_tokens aşıldı.Bütçeyi yükselt veya prompt/memory boyutunu düşür.
MODEL_VOTE_NO_QUORUMretryablevote policy'de quorum oluşmadı.quorum'u düşür veya schema'yı daralt — serbest metin alanları oy birliğini imkânsızlaştırır.
MODEL_VOTE_TIEkalıcıQuorum sağlandı ama beraberlik var ve tie: "fail".tie: "first" veya "highest_confidence" kullan.
MODEL_VOTE_CONFIDENCE_UNAVAILABLEkalıcıtie: "highest_confidence" seçili ama sonuçlarda sayısal confidence yok.Schema'ya confidence: float [0..1] ekle.
MODEL_FUSION_NO_INPUTSretryablefusion policy'de hiçbir aday başarılı olmadı.Aday modelleri ve schema uyumluluğunu kontrol et.

HTTP status eşlemesi

StatusKodRetryable
408MODEL_TIMEOUTretryable
409 · 425MODEL_PROVIDER_ERRORretryable
429MODEL_RATE_LIMITretryable
499MODEL_CANCELLEDkalıcı
5xxMODEL_PROVIDER_ERRORretryable
diğer 4xxMODEL_PROVIDER_ERRORkalıcı

Provider'ın gövdesindeki error.code, error.type ve ham yanıtın ilk 1000 karakteri details alanına redakte edilerek eklenir.

Tool hataları

KodDurumNe zamanNe yapmalı
TOOL_NOT_FOUNDkalıcıContract var ama registry'de handler yok.Handler'ı src/tool-registry.ts'e ekle veya --tool-module ile yükle.
TOOL_INPUT_INVALIDkalıcıInput schema doğrulamasından geçmedi.Native çağrılarda modelin ürettiği argümanlar hatalıdır — parametre @desc'lerini iyileştir.
TOOL_OUTPUT_INVALIDkalıcıHandler'ın döndürdüğü değer output schema'sına uymuyor.Handler'ı düzelt; --generate-tool-types ile tip güvenliği ekle.
TOOL_TIMEOUTretryableEtkin timeout aşıldı.timeout/tool_timeout yükselt; handler'ı AbortSignal'e duyarlı yaz.
TOOL_CANCELLEDkalıcıÜst akış iptal edildi (parallel timeout'u, race, Ctrl-C).Genellikle beklenen davranıştır.
TOOL_PERMISSION_DENIEDkalıcıcredential eksik, scope izinli değil, deny_write engelledi ya da approval verilmedi.Mesaj hangisi olduğunu söyler. LUMA_APPROVED_TOOLS veya tool_scopes ayarla.
TOOL_CONTEXT_INVALIDkalıcıneeds context'i yok, tool_contexts izin vermiyor ya da tipi uymuyor.luma.config.json içindeki tool_contexts'i ve agent allowlist'ini kontrol et.
TOOL_EXECUTION_ERRORretryable / kalıcıHandler istisna fırlattı.Typed hata için LumaToolError kullan ve retryable'ı sen belirle.
TOOL_ERROR_INVALIDkalıcıFırlatılan hata, contract'taki error: schema'sına uymuyor.Hata nesnesini schema'ya uydur.
TOOL_IDEMPOTENCY_CONFLICTkalıcıAynı idempotency key farklı input ile kullanıldı.Anahtar üretimini gözden geçir — istek başına tekil olmalı.
TOOL_CIRCUIT_OPENkalıcıtool_failure_limit aşıldı.Alt sistemi düzelt; limiti bilinçli olarak yükselt.

Veri yüzeyi hataları

v0.4.0 veri yüzeyi — datasource/query/command, std/http, std/state ve parallel over — adlandırılmış hatalar fırlatır ve hiçbiri kod taşımaz. Düz hata olarak fırlatılırlar; dolayısıyla bir try/catch içinde bu sayfadaki her mesaj için agent.errorCode(error) null, agent.isRetryable(error) ise false döner. Bunları mesaj metniyle eşleştir. Bildirimlerin kendisi Veri & Entegrasyon sayfasında; bu sayfa onların hata görünümünün, Telemetry ise trace görünümünün sahibidir.

Error: query 'Orders' expected exactly one row, got 3.

Önünde [CODE] yok — aşağıdaki her mesajın biçimi budur. Bir kısmı program başlamadan, parse zamanında verilir; tablolarda işaretlendi.

datasource · query · command

MesajSebep ve çözüm
datasource 'X' has no registered bridge; export it from a tool module as datasources.X.Bildirim var ama hiçbir şey onun için bridge kaydetmemiş. Contract Luma'nın, driver senin: bir tool modülü datasources.X export etmelidir. --tool-module ile ya da luma.config.json içindeki tool_modules ile yükle.
datasource 'X' is missing credential: <ENV>.credential: ile adı verilen environment değişkeni tanımlı değil. Yalnızca varlığı kontrol edilir — değer hiçbir zaman prompt'a, trace'e veya hata mesajına okunmaz.
query 'X' bridge must return a list of rows.Bridge bir query'ye array olmayan bir şey döndürdü. Boş sonuç için null değil [] döndür.
command 'X' bridge must return the affected row count as an integer.Bir command -> int olarak bildirilir ve bridge tam olarak o sayıyı üretmelidir — satırları ya da driver'ın sonuç nesnesini değil.
query 'X' expected exactly one row, got N.Schema[] değil -> Schema yazmak tam olarak bir satır bildirir; N bridge'in gerçekte döndürdüğüdür, sıfır dahil. Sayı garanti değilse Schema[] bildir.
query|command 'X' timed out after N ms on datasource 'Y'.Bridge çalışırken datasource'un timeout'u doldu. Mesaj bildirim türüyle başlar, dolayısıyla aynı biçim ikisini de kapsar.
Result set exceeded the row limit (200000). Process in batches with col.chunk, or raise --max-rows.Satır üreten her yol için geneldir: aynı tavan ve aynı mesaj hem query sonuçlarını hem io.readFiles'ı korur. Mesajdaki sayı etkin limittir; --max-rows onu değiştirir. Bkz. limitler.
query 'X' sql cannot interpolate; use $1 parameters.Parse zamanı. sql string'inin içinde {name} biçimi var. Parametreler $1..$n olarak sırayla bağlanır; injection yüzeyi dilin kendisinde kapatılmıştır. command da aynı mesajla reddedilir.
Datasource 'X' does not support 'transaction'; it is deliberately out of this package — handle transactions inside the bridge (ROADMAP § U4).Parse zamanı. Transaction bilinçli olarak yok: transaction sınırı bridge'in içine aittir; burada bildirmek dili hiçbir contract'ın zorlayamayacağı bir semantiğe bağlardı. Diğer bilinmeyen anahtarlar has no key 'k'; known keys: … alır.

std/http · std/state

MesajSebep ve çözüm
http.<fn> could not reach '<url>': <reason>.Fırlatılan tek ağ hatası. reason, Luma'nın kendi timeout'u tetiklendiyse timed out after N ms, diğer her şeyde connection failed olur — DNS hatası, reddedilen bağlantı ve TLS hatası tek kovaya normalize edilir, çünkü engine'ler bunları sınıflandırmada anlaşamıyor. İstek child process'i hiç yanıt vermezse üçüncü bir biçim çıkar (child exited with status N).
http.<fn> response exceeded the byte limit (10485760); raise --max-response-bytes if this is intended.Yanıt gövdesi tavandan büyük (varsayılan 10 MiB). Gövde kırpılmaz, atılır.
http.<fn> timeout must be a positive integer of milliseconds.timeout varsayılanı olmayan zorunlu bir argümandır; 0, negatifler ve kesirler reddedilir: sessiz sonsuz bekleme, bu paketin ortadan kaldırmak için var olduğu hata sınıfının ta kendisidir.
http.<fn> expects a url string. · http.<fn> expects headers as a map.Argüman biçimleri. Header yoksa {} geç — argümanın kendisi opsiyonel değildir.
state.read needs a state file; pass --state-file <path>.--state-file yokken her std/state fonksiyonu adıyla reddeder; mesajdaki ad çağırdığın fonksiyondur. Varsayılan konum yoktur, çünkü sessiz varsayılan sessiz veri kaybıdır.
state store could not be read: <file> (<reason>).State dosyası var ama bir JSON nesnesi değil. Dosyanın hiç olmaması hata değildir — boş store olarak okunur.

parallel over

MesajSebep ve çözüm
parallel over 'X' requires a limit.Parse zamanı. Eşzamanlılık tavanı zorunludur — bir query sonucu üzerinde sınırsız fan-out, arkasındaki datasource'u devirmenin yoludur.
parallel over 'X' on_error fallback is not supported; use on_error continue or the default fail_fast.Parse zamanı. Veri-paralel işin düşeceği bir fallback dalı yoktur; burada yalnızca continue ve fail_fast vardır.
parallel over cannot be nested.Parse zamanı. İç içe fan-out iki limiti çarpar ve etkin eşzamanlılık kaynaktan okunamaz hale gelir.
parallel over 'X' body must return a <Schema>.Parse zamanı. Gövdede hiç return yok.
parallel over 'X' body did not return a value for '<item>'.Runtime: return var ama bu elemanın izlediği yol ona hiç ulaşmadı — koşulu false çıkan bir if içindeki return gibi. Her eleman bir değer üretmelidir; bazı elemanların düşmesi isteniyorsa on_error continue kullan.
parallel over 'X' expected a list from '<expression>', got <kind>.Koleksiyon ifadesi bir listeye çözülmedi. <kind>, gelen değerin JavaScript düzeyindeki türüdür (object, null, nothing).
HTTP status'ü hata değildir

http.get, 404 ve 500 için de tıpkı 200'de olduğu gibi { status, body, headers } döndürür: status kodu veridir, başarısızlık değil. Bir HTTP çağrısını saran try/catch hatalı status'te hiç tetiklenmez — fırlattığı tek hata host'a ulaşamamaktır. response.status'ü kendin kontrol et ve kontrol edilmemiş bir status'ü ele alınmamış bir hata yolu olarak gör.

Retry semantiği

hata oluştu
   ↓
retryable == false ?
   ├── evet → döngü anında durur, hata yukarı fırlatılır
   └── hayır ↓
deneme sayısı < retry ?
   ├── hayır → hata fırlatılır
   └── evet ↓
prompt'a hata metni eklenir → yeni attempt_id → tekrar istek
KatmanAyarNeyi tekrarlar
ask retry'ıretry N veya agent retry:Tüm LLM isteğini; hata metni prompt'a eklenir.
Tool retry'ıTool contract'ındaki retriesYalnızca handler'ı; LLM'e dokunmaz.
Run policyfallback + on: [...]Başka bir modele geçer.
Bu üç katman iç içedir

Bir fallback policy'si altında her aday model retry: 0 ile çalışır — dayanıklılık policy'nin kendisinden gelir. Tool retry'ları ise LLM retry'ından tamamen bağımsızdır ve tool'un kendi retry_backoff zamanlamasını kullanır.

retryable: false her şeyi durdurur

Bir tool retryable: false hata fırlattığında yalnızca tool retry'ı değil, onu çağıran LLM retry döngüsü de durur. Bu bilinçlidir: kalıcı bir izin hatasında modele aynı isteği tekrar ettirmenin anlamı yoktur.

Doğrulama mesajları

Doğrulama hataları kodsuzdur ve bir turdaki tüm hatalar birleştirilerek raporlanır:

text
Error: A.f.v.name must be at least 2 characters.
A.f.v.age must be an integer.
A.f.v.email must be in email format.
A.f.v.tags must contain unique items.
A.f.v.score must be at most 100.
A.f.v.role must be one of these values: admin, user.
A.f.v.extra is not defined in the schema.
Mesaj kalıbıSebep
X.y missing.Zorunlu alan yok.
X.y must be a string. · must be an integer. · must be a number. · must be a boolean.Tip uyumsuzluğu. must be a number ayrıca NaN/Infinity için de çıkar.
X.y must be one of these values: …Enum ihlali.
X.y must be an array.Array beklenirken başka tip geldi.
X.y must contain exactly N items.Tuple uzunluğu.
X.y must contain at least/at most N items.@minItems / @maxItems.
X.y must contain unique items.@unique.
X.y.field values must be unique.@uniqueBy.
X.y must contain the expected item.@contains.
X.y must be at least/at most N characters.@length.
X.y does not match the expected format.@match.
X.y must be in <format> format.@fmt.
X.y must be at least/at most N.@range veya aralık kısayolu.
X.y does not satisfy its @valid rule: <expression>@valid.
X.k is not defined in the schema.Bilinmeyen alan.
X.y was given more than one alias: a, bKanonik alan yok ve @alias adlarından ikisi ya da daha fazlası aynı anda gelmiş — runtime aralarından kazanan seçmez.
X does not match any union type: … | …Union'ın hiçbir üyesi tutmadı.
X does not satisfy its where rule: <expression>where invariant'ı. Boolean dönmeyen bir where ayrıca X where rule must return a boolean result: … ile başarısız olur.
X conditional rule 'a' requires/forbids field: <condition>when kuralı; 'a', dalın istediği ya da yasakladığı alanın adıdır.
X.sources.sources contains an invalid context source: <id>Tanımsız context kimliği. sources runtime'ın yerleşik kaynak-doğrulama alanıdır; adı sabittir ve mesajda iki kez görünür, çünkü yol zaten alan adıyla bitiyor.
X.y cannot be given by its canonical name and an alias at the same time.Hem kanonik ad hem alias gönderildi.

@feedback tanımlıysa bu mesajlar Path.field: <your message> ile değiştirilir.

Kural soft olduğunda aynı metin başka yerden gelir

@severity("warn") taşıyan bir kural yukarıdaki mesajı üretir, ama sonuç yolunda bir hata üretmez. Metin bunun yerine finding'in message alanında yol alır ve koşu devam eder. İki satır bu yola özgüdür ve zaten hata değildir:

SatırNerede görünürNe demek
Warning: 2 findings accepted but never read: A.f.return (1), B.g.return (1). Read them with findings.of(...) from std/findings.Standart hata, koşunun sonundaFinding üretilmiş ve kimse okumamış. Çıkış kodu 0 kalır — bkz. @severity.
Findings cap reached (1000); 412 more soft violations were not recorded.rule alanı findings.capped olan bir finding'in message'ıBir operasyon operasyon-başı tavanı aşmış. Kesilenin sayısı her zaman kayıttadır.

Girdi yolunda — tool argümanı, method ya da pure fn parametresi — @severity yok sayılır ve yukarıdaki olağan hatayı alırsın.

Parse ve başlangıç hataları

Bunlar program çalışmaya başlamadan önce oluşur ve kod taşımazlar.

MesajSebep
Invalid schema field: …Alan sözdizimi hatalı — artık bir token ya da require öncesinde bölünmüş bir keyword devam satırı.
A schema line may define only one field: …Aynı satırda iki name: type çifti var. Tek alandan sonra gelen virgül sorun değildir.
Unknown annotation: @xTanınmayan annotation. @prompt alan üzerinde kullanılamaz — yalnızca schema başlığında.
@x can only be used once on a field.Tek kullanımlık annotation tekrarlandı.
@length can only be used on string fields…Annotation, alanın tipiyle uyumsuz.
Field range cannot be specified with both legacy syntax and @range.float [0..1] ile @range birlikte yazıldı.
No schema named 'X' was found.Tanımsız schema referansı.
No model named 'X' was found.Agent'ta tanımsız model profili.
'X' is not registered in the tool registry.Contract var, handler yok.
Agent method f cannot use ask and return together.Terminal ask ile return bir arada.
fn f return schema differs from the ask schema.Method çıkışı ile ask hedefi uyuşmuyor.
Agent 'A' does not allow tool 'x' to be called directly.Tool, agent'ın tools listesinde değil.
'x' is not defined as a dependency.uses ile bildirilmemiş bir ad üzerinden x = name.f(...). Std modül alias'larında da görülür → ayrılmış namespace'ler.
'dependency' cannot be used inside a pure fn.Aynı sebep, pure fn gövdesinde.
IO cannot be used inside pure fn 'f'.pure fn içinde std/io çağrısı. io fn kullan.
where is deterministic and cannot use IO.where içinde io.*.
ask, agent call or parallel not found.Programda üst düzey operation yok.
.env must define base_url, api_key, and model.Legacy gateway gerekiyor ama yapılandırılmamış.
Model 'X' is missing credential: api_key.getEnv ile istenen environment değişkeni yok.
Import module may contain only schemas and exported pure fns: …Import edilen dosyada agent/tool/operation var.
Import cycle found: … · Agent dependency cycle found: … · Pure fn cycle found: …Döngüsel bağımlılık.
io path cannot escape the project directory: …IO yolu kökün dışında.
Model 'X' has unknown provider 'y'. Valid values: …Tanınmayan provider değeri; hata parse zamanında verilir ve geçerli değerleri listeler.
@valid expression is not supported: …Desteklenmeyen @valid lambda gövdesi; schema alanı, tool parametresi ve fn parametresi fark etmeksizin parse zamanında reddedilir.
@severity value must be "error" or "warn": reviewBilinmeyen severity. Küme ikide kapalı — kendi tier sözlüğün, finding'leri okuyan kodda yaşar.
@severity must follow the @valid rule it modifies.Önünde @valid olmayan @severity. Alanda, ardından geldiği kuralı niteler; alanın tamamını değil.
where only supports the @feedback and @severity annotations: @descwhere satırında başka bir annotation.
findings is io and cannot be used inside @valid or where rules: findings.countDeterministik kalması gereken bir kuraldan std/findings çağrısı. Bir kuralın kendi ihlallerini okumasını engeller.
pure fn X parameter block not closed.İmzada kapanmamış parantez.
Operator '%' is not supported: y % 2Dilde olmayan bir operatör. Mesaj operatörü adlandırır ve satırı alıntılar; böylece aşağıdaki tanımsız-değişken hatasıyla karıştırılamaz. Kapsam: ?. ** % & | ve ? :.
'??' cannot be mixed with '&&' or '||' without parentheses: n ?? b || bOkunuş belirsiz olurdu; kastettiğin tarafı parantezle. (n ?? b) || b ve b || (n ?? b) ikisi de meşru.

Teşhis rehberi

Belirtiİlk bakılacak yer
Model sürekli aynı alanı yanlış üretiyorAlana @desc ve @feedback ekle; retry ver. Trace'te validation event'lerini filtrele ve hangi kuralın patladığını gör.
Model tool'u hiç çağırmıyorNative çağrı model kararına bağlıdır ve zorlanamaz. Garantili çalışması gerekiyorsa direct tool kullan.
İlk yanıt biçimsiz geliyor, ikinci deneme düzeliyorBeklenen davranış: tools tanımlıyken ilk istekte response_format gönderilmez. retry ver.
Strict gateway isteği reddediyorSchema'da map<T> var mı? Entry[] desenine geç.
Alan array bekliyorum ama tek değer geliyor (veya tersi)float[0..1] ile float [0..1] karışmış olabilir → kısayollar.
Boolean if condition expected: …Mantıksal bağlamda boolean olmayan bir değer var — ! yalnızca boolean üzerinde çalışır, &&/|| parçaları da boolean olmalıdır → expression dili.
'x' is not defined as a dependency.Std modül alias'ı ayrılmış isimlerden biri değil → import kuralları.
Bütçe hiç tetiklenmiyorGateway usage döndürmüyor olabilir; cost_per_1k_tokens ayarlanmamış olabilir. Trace metriklerini kontrol et.
Tool timeout'u beklediğimden kısaEtkin süre min(tool.timeout, tool_timeout_max)'tur.
vote hiç quorum sağlamıyorSerbest metin alanları tam JSON eşitliğini imkânsızlaştırır. Dar schema kullan → vote.
Görsel modele ulaşmıyorModel profilinde multimodal: true var mı? Yoksa marker düz metin olarak gider.
Ham model yanıtını görmek istiyorumLUMA_DEBUG_MODEL_RESPONSE=1 ile çalıştır — yanıtın ilk 4000 karakteri hata detayına eklenir.
http.get etrafındaki try/catch 500'de hiç tetiklenmiyorStatus kodu hata değildir: 404 ve 500 sıradan bir { status, body, headers } değeri olarak döner. response.status'ü kendin kontrol et → std/http.
parallel over girdideki eleman sayısından az sonuç döndürdüon_error continue sözleşmesi budur: başarısız eleman atlanır, listede boşluk bırakmaz. Tek sinyal parallel_over telemetry event'idir → düşme sayacı.
Datasource retry bildirdiği hâlde başarısız command tekrar denenmiyorBilinçli: okumalar tekrar denenir, yazmalar denenmez. Idempotency anahtarı olmayan tekrar edilmiş bir yazma iki kez uygulanabilir; bu yüzden command için deneme sayısı 1'de sabittir. İfade gerçekten idempotent ise tekrarı bridge'in içinde yap → datasource.
# Hızlı teşhis seti
luma program.luma --all --trace-file /tmp/t.json

jq -r '.events[] | select(.ok==false) | "\(.type) \(.name) \(.error)"' /tmp/t.json
jq -r '.events[] | select(.type=="validation" and .ok==false) | .metadata.rule' /tmp/t.json | sort | uniq -c | sort -rn
jq '.metrics' /tmp/t.json