Struktureret fejlkontekst
Fejltype, forsøgt forespørgsel, delvise resultater og alternativer
Struktureret fejlkontekst er en gratis Claude Architect-lektion på CoddyKit. Dette er lektion 3 af 4. Du kan læse alle 3 lektioner i dette læringsspor gratis i deres fulde længde — derefter låser CoddyKit PRO alle lektioner op samt praktiske øvelser med en indbygget kodeeditor og en AI-underviser døgnet rundt. Den er en del af læringsforløbet i Claude Architect, og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. Claude Architect-kurset indeholder 4 lektioner i alt.
Hvorfor fejl kræver struktur
I et multiagentsystem vil en underagent før eller siden støde på en fejl: en database er nede, en forespørgsel returnerer ingenting, eller en tilladelse bliver afvist. Måden, fejlen rapporteres på, afgør, om koordinatoren kan genoprette intelligent eller bare giver op.
En generisk status som "Operation failed" blokerer genoprettelse — koordinatoren har ingen idé om, hvad den skal gøre som det næste. En struktureret fejlkontekst forvandler en blindgyde til en routingsbeslutning.
Denne lektion gennemgår de fire grundpiller i en god fejlkontekst: fejltype, forsøgt forespørgsel, delvise resultater og alternativer.
Antimønstret med den generiske fejl
Sammenlign to fejl-payloads, der kommer tilbage fra en underagent eller et værktøj.
Den generiske version fortæller koordinatoren intet handlingsanvisende. Den kan ikke afgøre, om den skal prøve igen, bede brugeren om flere oplysninger eller eskalere. Lydløs undertrykkelse er endnu værre — arbejdsgangen fortsætter, som om dataene findes, selv om de ikke gør.
Den strukturerede version angiver hvad der gik galt, og hvorfor, hvilket er første skridt mod et intelligent næste træk.
# Anti-pattern: opaque, un-actionable
return {"isError": True, "message": "Operation failed"}
# Better: structured, routable
return {
"isError": True,
"errorCategory": "transient",
"isRetryable": True,
"message": "Connection to orders DB timed out after 5s",
}Søjle 1 — Fejltype
Den første opgave for en fejl-kontekst er at klassificere fejlen. Strukturerede MCP-fejl indeholder feltet errorCategory med et lille, fast ordforråd:
- transient — en midlertidig fejl i infrastrukturen (timeout, hastighedsbegrænsning). Kan ofte forsøges igen.
- validation — inputtet havde et ugyldigt format.
- business — en domæneregel blokerede handlingen.
- permission — adgang blev nægtet.
Den tilhørende booleske værdi isRetryable fjerner gætteriet: Koordinatoren læser den direkte i stedet for at udlede hensigten fra en frit formuleret meddelelse.
{
"isError": true,
"errorCategory": "transient",
"isRetryable": true,
"message": "Rate limit hit on inventory service"
}Fejl kontra tomt resultat
Én skelnen volder arkitekter konstante problemer: en adgangsfejl er ikke det samme som et gyldigt tomt resultat.
- Fejl: opslaget kunne ikke køres — databasen er utilgængelig, eller adgang blev nægtet. Det kan være værd at prøve igen.
- Tomt: opslaget blev kørt uden problemer og fandt nul match. Et nyt forsøg ændrer intet — svaret er reelt "ingen".
Hvis de to blandes sammen, fører det til meningsløse løkker med nye forsøg på tomme resultater eller til, at et reelt driftsudfald behandles som "ingen data fundet". Modellér dem altid som separate tilstande.
def classify(result):
if result.connection_error:
return {"isError": True, "errorCategory": "transient",
"isRetryable": True}
if not result.rows: # ran fine, found nothing
return {"isError": False, "empty": True, "matches": 0}
return {"isError": False, "matches": len(result.rows)}Søjle 2 — Forsøgt forespørgsel
Koordinatoren kørte ikke selv den fejlslagne handling, så den kan ikke se, hvad der blev forsøgt. Medtag attempted_query ordret i fejl-konteksten.
Det tjener to formål:
- Det lader koordinatoren afgøre, om den skal prøve igen med den samme forespørgsel eller omformulere den (f.eks. udvide et filter, der var for snævert).
- Det giver den menneskelige kontrollant den nøjagtige genskabelsessag ved eskalering i stedet for en vag "søgning mislykkedes".
return {
"isError": True,
"errorCategory": "transient",
"isRetryable": True,
"attempted_query": {
"endpoint": "GET /orders",
"filters": {"customer_id": "C-4821", "status": "shipped"},
},
"message": "Orders service returned 503",
}Søjle 3 — Delvise resultater
En fejl betyder sjældent, at der blev udført nul arbejde. En research-underagent kan have indsamlet 6 af 10 kilder, før en udbyder satte en hastighedsbegrænsning på den. At kassere det hele — eller afbryde hele arbejdsgangen — spilder reelle fremskridt.
Vedhæft det, der blev indsamlet uden problemer, som partial_results. Koordinatoren kan derefter samle det, der findes, beskrive manglen og afgøre, om resten er værd at forsøge igen.
Undertryk aldrig en fejl lydløst, og præsenter ikke delresultater, som om de var komplette.
return {
"isError": True,
"errorCategory": "transient",
"isRetryable": True,
"attempted_query": "fetch 10 sources on 'EU AI Act timelines'",
"partial_results": collected_sources, # 6 of 10 gathered
"message": "Provider rate-limited after 6 sources",
}Søjle 4 — Alternativer
De mest nyttige fejl-kontekster beskriver ikke bare muren — de peger på en dør. Feltet alternatives foreslår konkrete næste handlinger, som koordinatoren (eller et menneske) kan udføre.
Eksempler: "prøv igen mod læsereplikaen", "udvid datofilteret", "bed brugeren om et ordrenummer", "eskalér til et menneske med de delvise resultater vedhæftet".
Det er det, der forvandler en struktureret fejl fra en rapport til en ruteanvisning.
return {
"isError": True,
"errorCategory": "business",
"isRetryable": False,
"attempted_query": "process_refund(order='O-77', amount=620)",
"partial_results": {"order_total": 620, "customer_verified": True},
"alternatives": [
"Refund exceeds $500 policy cap — escalate to human",
"Offer store credit within auto-approve limit",
],
"message": "Refund blocked by policy threshold",
}Genskab lokalt, eskalér fejl, der ikke kan genskabes
Struktureret kontekst driver en klar politik. Håndter transient-fejl inde i underagenten — prøv igen ved timeout, og vent længere mellem forsøg ved en hastighedsbegrænsning — så koordinatoren aldrig ser en fejl, der kan håndteres lokalt.
Først når en fejl reelt ikke kan genskabes (en politikgrænse er nået, adgang er nægtet, eller alle forsøg er opbrugt), eskalerer du den opad — og du eskalerer med de delvise resultater og alternativerne vedhæftet, ikke som en bar "mislykkedes".
Målet er ikke at afbryde hele arbejdsgangen, fordi én gren mislykkedes.
for attempt in range(3): # local recovery for transient faults
res = run_query()
if not res.get("isError"):
return res
if not res.get("isRetryable"):
break # non-recoverable: stop retrying
# escalate upward WITH context, never a bare failure
return escalate(res)Håndhæv strukturen med et skema
Frit formulerede fejldicts ændrer sig over tid. Håndhæv kontrakten med et JSON Schema via et værktøj / struktureret output, så underagenten skal udfylde de rigtige felter.
En vigtig regel fra design af struktureret output: Markér kun et felt som påkrævet, hvis det altid er til stede. errorCategory og message er altid til stede — gør dem påkrævede. partial_results og alternatives kan mangle — lad dem være valgfrie, ellers vil modellen opfinde dem for at opfylde skemaet.
error_schema = {
"type": "object",
"properties": {
"errorCategory": {"enum": ["transient", "validation",
"business", "permission", "other"]},
"isRetryable": {"type": "boolean"},
"attempted_query": {"type": "string"},
"partial_results": {"type": "array"},
"alternatives": {"type": "array", "items": {"type": "string"}},
"message": {"type": "string"},
},
"required": ["errorCategory", "isRetryable", "message"],
}Kontekst krydser ikke agentgrænser af sig selv
Underagenter arver ikke koordinatorens samtalehistorik. Når en underagent derfor mislykkes, kender koordinatoren kun de oplysninger, som fejl-payloaden udtrykkeligt indeholder.
Det er netop derfor, at attempted_query og partial_results skal være i den strukturerede fejl — der findes ingen delt hukommelse, som koordinatoren kan falde tilbage på. Fejl-konteksten er hele forbindelsen mellem de to.
Begræns den til de relevante felter, men fjern aldrig de fire søjler.
# Coordinator delegates; subagent returns ONLY its payload.
# No shared history -> the error context must be self-contained.
results = await asyncio.gather(
research_subagent("EU AI Act"),
research_subagent("US AI policy"),
)
for r in results:
if r.get("isError") and not r["isRetryable"]:
annotate_coverage_gap(r["attempted_query"], r["partial_results"])Sæt det hele sammen
En fejl-kontekst i produktionskvalitet lader koordinatoren handle uden selv at køre noget igen:
- fejltype +
isRetryable→ beslutning om nyt forsøg eller eskalering - forsøgt forespørgsel → genskab eller omformulér
- delvise resultater → red de eksisterende fremskridt, og beskriv manglen
- alternativer → den konkrete næste handling
Det er forskellen mellem en skrøbelig arbejdsgang, der dør ved det første lille problem, og et modstandsdygtigt system, der håndterer forringelser på en kontrolleret måde og leder uden om skaden.
{
"isError": true,
"errorCategory": "permission",
"isRetryable": false,
"attempted_query": "SELECT * FROM payroll WHERE dept='ENG'",
"partial_results": [],
"alternatives": [
"Request read grant on payroll schema",
"Escalate to data-owner for approval"
],
"message": "Access denied to payroll table"
}Hurtigt tjek
En research-underagent blev bedt om at indsamle 10 kilder. Efter at have indsamlet 6 satte nyheds-API'et en hastighedsbegrænsning på den (HTTP 429). Hvad skal underagenten returnere til koordinatoren?
Opsummering — Struktureret fejl-kontekst
Vigtigste pointer:
- Generiske fejl blokerer gendannelse; strukturerede fejl muliggør intelligent routing.
- Medtag altid de fire søjler: fejltype, forsøgt forespørgsel, delvise resultater, alternativer.
- Brug
errorCategory(transient / validation / business / permission) +isRetryabletil at træffe beslutningen om nyt forsøg eller eskalering. - Skeln mellem en adgangsfejl (måske nyt forsøg) og et gyldigt tomt resultat (ingen match — et nyt forsøg hjælper ikke).
- Genskab transient-fejl lokalt i underagenten; eskalér fejl, der ikke kan genskabes, med de delvise resultater vedhæftet.
- Undertryk aldrig fejl lydløst, og afbryd aldrig hele arbejdsgangen på grund af én fejl.
- Håndhæv strukturen med et skema, men gør kun felter påkrævede, når de er altid til stede — valgfrie søjler skal forblive valgfrie for at undgå opdigtede værdier.
Lær Python med en AI-underviser — gratis
Skriv og kør rigtig kode i din browser, få øjeblikkelig hjælp fra en AI-underviser døgnet rundt, og fortsæt, hvor du slap, på web eller i appen.
- Kurser
- 26
- Lektioner
- 104
Ofte stillede spørgsmål
Er lektionen “Struktureret fejlkontekst” gratis?
Ja — alle 3 lektioner i læringssporet Claude Architect, inklusive “Struktureret fejlkontekst”, kan læses gratis i deres fulde længde her på webstedet. Derefter låser CoddyKit PRO alle lektioner op samt interaktive øvelser med en indbygget kodeeditor og en AI-underviser døgnet rundt. Claude Architect-kurset indeholder 4 lektioner i alt.
Hvad lærer jeg i “Struktureret fejlkontekst”?
Fejltype, forsøgt forespørgsel, delvise resultater og alternativer Du øver dig i Claude Architect med praktisk kode, som du kører direkte i browseren, og en AI-vejleder døgnet rundt besvarer dine spørgsmål, mens du arbejder dig gennem lektionen.
Skal jeg have erfaring for at begynde på Claude Architect?
Der kræves ingen tidligere erfaring. Claude Architect på CoddyKit er tilrettelagt for både begyndere og øvede, så du kan starte her eller fra begyndelsen og lære i dit eget tempo. Dette er lektion 3 af 4.
Hvor lang tid tager lektionen “Struktureret fejlkontekst”?
De fleste CoddyKit-lektioner tager cirka 5–10 minutter. Hver lektion er kort og interaktiv, så du gør løbende fremskridt og kan fortsætte, hvor du slap – på både web og app.
Kan jeg skrive og køre kode i denne Claude Architect-lektion?
Ja. Alle Claude Architect-lektioner har en indbygget kodeeditor, så du kan skrive og køre rigtig kode direkte i din browser og få øjeblikkelig feedback fra AI – uden lokal opsætning.
Alle lektioner i dette kursus
- Tydelige eskaleringstriggere
- Anti-pattern: Følelses- og selvtillidsscorer
- Struktureret fejlkontekst
- Lokal genoprettelse vs. eskalering