Antimønster: Analysere tekst for å finne fullføring
Hvorfor det er skjørt og feil å lete etter «done» i resultatet.
Antimønster: Analysere tekst for å finne fullføring er en gratis leksjon i Claude Architect på CoddyKit. Dette er leksjon 3 av 4. Du kan lese valgfritt 3 leksjoner fra denne læringsstien gratis i sin helhet – deretter låser CoddyKit PRO opp alle leksjoner, samt praktisk øving med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Den er en del av læringsløpet i Claude Architect, og fremdriften din synkroniseres mellom nettet og CoddyKit-appen. Kurset i Claude Architect inneholder totalt 4 leksjoner.
Fellen
De bygger en agent. Den kjører verktøy, tenker og svarer. Nå må De vite når den er ferdig. En fristende snarvei er å lete i modellens tekst etter et ord som done, finished eller complete, og stoppe løkken når De finner det.
Dette er antimønsteret analysere tekst for å fastslå fullføring. Det virker intuitivt, men er skjørt og feil. Claude API gir Dem allerede et presist, strukturert signal for fullføring. I denne leksjonen lærer De hvorfor tekstsøk feiler, og hva De bør bruke i stedet.
Slik fungerer agentløkken egentlig
Agentløkken styres av ett felt i svaret: stop_reason. Løkken er enkel og deterministisk:
- Send forespørselen (med hele meldingshistorikken i hver runde).
- Undersøk
stop_reason. - Hvis verdien er
tool_use, kjør verktøyene, legg resultatene til i historikken og gjenta. - Hvis verdien er
end_turn, er oppgaven fullført. Stopp.
Modellen forteller Dem selv, gjennom strukturerte metadata, om den vil fortsette eller er ferdig. De trenger aldri å gjette ved å lese prosa.
while True:
response = client.messages.create(
model="claude-opus-4-8",
max_tokens=16000,
tools=tools,
messages=messages,
)
if response.stop_reason == "end_turn":
break # complete
# else: tool_use -> run tools, append results, loopDe fire stoppårsakene
Avslutt på signalet, ikke på ordene. Claude returnerer én av fire stoppårsaker:
end_turn— Claude ble naturlig ferdig. Oppgaven er fullført.tool_use— Claude vil at et verktøy skal kjøres; kjør det og fortsett løkken.max_tokens— resultatet ble avkortet av token-grensen.stop_sequence— en konfigurert stoppsekvens ble truffet.
Hver av dem er entydig og maskinlesbar. Sammenlign dette med å søke i fri tekst, der betydningen utelukkende avhenger av hvordan modellen tilfeldigvis formulerte seg denne gangen.
Hvorfor tekstsøk er skjørt
Naturlig språk er ikke en kontrollprotokoll. Den samme fullførte oppgaven kan avsluttes på et dusin ulike måter:
- «All done!»
- «That completes the migration.»
- «I've finished the analysis.»
- «Everything is in place now.»
Nøkkelordsjekken Deres for done treffer det første, kanskje det andre, og overser i stillhet resten. Løkken stopper aldri. De bruker opp tokener og tid, eller treffer en hard grense, på en oppgave som faktisk ble ferdig for flere runder siden.
# ANTI-PATTERN: brittle keyword scan
if "done" in response_text.lower():
break # misses "finished", "complete", "all set"...Falske positiver er verre
Hvis De overser signalet, sløser De med ressurser. Den motsatte feilen er farligere: å stoppe for tidlig.
Anta at brukeren ber Claude om å «check whether the deployment is done». Claude kan midt i undersøkelsen svare: «Let me verify the deploy is done before I continue.» Tekstsøket Deres ser done og avslutter løkken — oppgaven forlates halvveis, før noe verktøy er kjørt eller noe svar er produsert.
Modellen bruker ord som done i samtaler. Et nøkkelordstreff kan ikke skille fortelling fra et ekte fullføringssignal. Det kan stop_reason.
Modellen beholder ingen tilstand
Her er den dypere grunnen til at tekstsøk er feil lag. Claude API er tilstandsløst: modellen beholder ikke minne mellom forespørsler. De sender hele samtalen — system, alle tidligere runder i messages og verktøyresultater — ved hvert eneste kall.
Spørsmålet «er agenten ferdig?» handler derfor om løkken De kontrollerer, og besvares av det strukturerte stop_reason API-et returnerer — ikke noe som skal omvendt konstrueres fra prosa. Kontrollplanet (løkken Deres) og innholdsplanet (modellens tekst) er separate. La fullføringslogikken ligge i kontrollplanet.
# Stateless: full history goes up every turn
response = client.messages.create(
model="claude-opus-4-8",
max_tokens=16000,
system=system_prompt,
tools=tools,
messages=messages, # ENTIRE history, every call
)
messages.append({"role": "assistant", "content": response.content})Den riktige avslutningskontrollen
La løkken styres utelukkende av stop_reason. Når verdien er tool_use, kjører De de forespurte verktøyene og legger resultatene til i historikken med den samsvarende tool_use_id. Når verdien er end_turn, er De ferdig.
Dette fungerer uansett hvordan Claude formulerer den siste meldingen — «All set», «Finished» eller ingenting i det hele tatt. Beslutningen tas av metadata De kan stole på, ikke av strengsøk De må overvåke.
while True:
response = client.messages.create(
model="claude-opus-4-8", max_tokens=16000,
tools=tools, messages=messages,
)
messages.append({"role": "assistant", "content": response.content})
if response.stop_reason == "tool_use":
results = run_tools(response.content) # each with tool_use_id
messages.append({"role": "user", "content": results})
continue
if response.stop_reason == "end_turn":
break # done -- no text parsing anywhereBeslutninger styres av modellen
Et viktig arkitekturprinsipp er at modellen avgjør kontrollflyten i en agentløkke, og at dette formidles gjennom stop_reason. De bestemmer ikke at «etter tre verktøy må De være ferdig». Claude signaliserer når den trenger et nytt verktøy, og når den er ferdig.
Reserver hardkodet kontroll for ting som trenger en garanti — en deterministisk invariant virksomheten Deres krever. Deteksjon av fullføring er ikke en av disse tingene; API-et tilbyr det allerede på en ryddig måte. Når De lager dette selv med tekstanalyse, erstatter De et pålitelig signal med en gjetning.
Iterasjonsgrenser er et sikkerhetsnett
«Greit», sier De, «jeg stopper bare etter N iterasjoner.» Vær forsiktig: en iterasjonsgrense er et sikkerhetsnett, ikke den primære stoppmekanismen. Den skal begrense løkker som løper løpsk og beskytte mot feil — ikke avgjøre at arbeidet er fullført.
Hvis løkken Deres er avhengig av grensen for å avsluttes normalt, har De samme problemet som ved tekstsøk: De erstatter det ekte, modellstyrte signalet med en vilkårlig heuristikk. Avslutt først på stop_reason; la grensen bare fange opp det patologiske tilfellet.
MAX_ITERS = 20 # safety net, NOT the primary stop
for _ in range(MAX_ITERS):
response = client.messages.create(...)
messages.append({"role": "assistant", "content": response.content})
if response.stop_reason == "end_turn":
break # primary: model-driven
# ... handle tool_use ...
else:
log.warning("hit iteration cap -- investigate, don't trust as 'done'")Håndter de andre stoppårsakene
En robust løkke grener på alle stoppårsaker, ikke bare den forventede. Spesielt betyr max_tokens at svaret ble avbrutt — det er ikke en fullføring. Hvis De behandler en avkortet runde som «ferdig», leverer De i stillhet et halvt svar.
Når De ser max_tokens, er løsningen å øke max_tokens eller bytte til strømming for store resultater, og deretter fortsette — aldri gå ut av løkken som om oppgaven var fullført.
if response.stop_reason == "end_turn":
break
elif response.stop_reason == "tool_use":
messages.append({"role": "user", "content": run_tools(response.content)})
elif response.stop_reason == "max_tokens":
# truncated, NOT complete -- raise cap or stream, then continue
raise OutputTruncated("increase max_tokens or stream")Trenger De et strukturert ferdigflagg? Bruk et verktøy
Noen ganger ønsker De faktisk at modellen skal rapportere et strukturert resultat — status, konfidens eller et sammendrag — når den er ferdig. Svaret er fortsatt ikke å analysere prosa. Gi Claude et verktøy (eller et JSON Schema via strukturerte resultater), og la den avgi et resultat med en definert type.
Med tool_choice: "any" kan De tvinge modellen til å kalle et vilkårlig verktøy, slik at De garanterer et strukturert resultat i stedet for fri tekst. Løkken avsluttes fortsatt på stop_reason; verktøyet formidler bare den maskinlesbare vurderingen. Struktur erstatter strengsøk overalt der det er viktig.
tools = [{
"name": "submit_result",
"description": "Report the final task outcome.",
"input_schema": {
"type": "object",
"properties": {
"status": {"type": "string", "enum": ["success", "failed"]},
"summary": {"type": "string"},
},
"required": ["status", "summary"],
},
}]
# tool_choice={"type": "any"} forces a structured call, not proseKort kontroll
Test vurderingsevnen Deres på en realistisk designbeslutning.
Viktigste punkter
Nå vet De hvorfor det er feil verktøy å søke i resultatet etter fullføring:
- Avslutt på
stop_reason, aldri på tekst.end_turn= fullført;tool_use= kjør verktøy og fortsett. - Tekstsøk er skjørt i begge retninger — det overser ekte fullføringer (ulike formuleringer) og utløser falske positiver (samtalebruk av «done»).
- API-et er tilstandsløst og modellstyrt. Send hele historikken i hver runde; la det strukturerte signalet, ikke prosaen, styre løkken.
- Iterasjonsgrenser er et sikkerhetsnett, ikke det primære stoppet. Håndter
max_tokenssom avkorting, ikke som suksess. - Trenger De et strukturert resultat? Bruk et verktøy eller JSON Schema (tving det med
tool_choice: "any") — analyser aldri fri tekst.
Lær deg Python med en AI-veileder – gratis
Skriv og kjør ekte kode i nettleseren, få umiddelbar hjelp fra en AI-veileder som er tilgjengelig døgnet rundt, og fortsett der du slapp – på nettet eller i appen.
- Kurs
- 26
- Leksjoner
- 104
Ofte stilte spørsmål
Er leksjonen «Antimønster: Analysere tekst for å finne fullføring» gratis?
Ja – du kan lese valgfritt 3 av leksjonene i læringsstien Claude Architect, inkludert «Antimønster: Analysere tekst for å finne fullføring», gratis i sin helhet her på nettet. Deretter låser CoddyKit PRO opp alle leksjoner, samt interaktiv øving med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Kurset i Claude Architect inneholder totalt 4 leksjoner.
Hva lærer jeg i «Antimønster: Analysere tekst for å finne fullføring»?
Hvorfor det er skjørt og feil å lete etter «done» i resultatet. Du øver på Claude Architect med praktisk kode som du kjører direkte i nettleseren, mens en AI-veileder som er tilgjengelig døgnet rundt, svarer på spørsmålene dine mens du jobber deg gjennom leksjonen.
Trenger jeg erfaring for å begynne med Claude Architect?
Ingen tidligere erfaring er nødvendig. Claude Architect på CoddyKit er lagt opp for både nybegynnere og viderekomne, så De kan begynne her eller helt fra start og lære i Deres eget tempo. Dette er leksjon 3 av 4.
Hvor lang tid tar leksjonen «Antimønster: Analysere tekst for å finne fullføring»?
De fleste CoddyKit-leksjoner tar omtrent 5–10 minutter. Hver leksjon er kort og interaktiv, slik at De gjør jevne fremskritt og kan fortsette akkurat der De slapp – både på nettet og i appen.
Kan jeg skrive og kjøre kode i denne Claude Architect-leksjonen?
Ja. Alle Claude Architect-leksjoner har en innebygd kodeeditor, slik at De kan skrive og kjøre ekte kode direkte i nettleseren og få umiddelbar tilbakemelding fra AI – uten lokal konfigurering.
Alle leksjonene i dette kurset
- Kjerneløkken
- Avslutte ved stop_reason
- Antimønster: Analysere tekst for å finne fullføring
- Antimønster: Vilkårlige grenser for antall iterasjoner