Förklaringar av stoporsaker
end_turn, tool_use, max_tokens och stop_sequence.
Förklaringar av stoporsaker är en gratis lektion i Claude Architect på CoddyKit. Detta är lektion 3 av 4. Du kan läsa vilka 3 lektioner som helst i den här lärvägen kostnadsfritt i sin helhet – därefter låser CoddyKit PRO upp alla lektioner, plus praktisk övning med en inbyggd kodredigerare och en AI-lärare dygnet runt. Den ingår i lärvägen för Claude Architect, och Era framsteg synkroniseras mellan webben och CoddyKit-appen. Kursen i Claude Architect innehåller totalt 4 lektioner.
Varför stopporsaker är viktiga
Varje gång Ni anropar Claude API returneras svaret med ett fält som heter stop_reason. Det talar om varför modellen slutade generera.
Detta enda fält styr hela Er kontrollflödeslogik. En tillförlitlig agent granskar stop_reason efter varje tur och avgör utifrån det vad som ska göras härnäst.
Det finns fyra värden Ni måste känna till: end_turn, tool_use, max_tokens och stop_sequence. Låt oss lära oss vart och ett.
Var hittar man det
stop_reason finns i svarsobjektet som returneras av messages.create.
Läs av det direkt. Skanna inte textutdata efter ord som "done" eller "finished" för att avgöra vad som hände. Modellen styr stop_reason; texten är bara innehåll.
from anthropic import Anthropic
client = Anthropic()
response = client.messages.create(
model="claude-opus-4-8",
max_tokens=1024,
messages=[{"role": "user", "content": "Hello"}],
)
print(response.stop_reason) # "end_turn"end_turn — Slutförd
end_turn betyder att Claude avslutade sitt svar på naturlig väg. Den har sagt allt den ville säga.
Detta är signalen för normal slutföring. I en agentloop är end_turn Er signal att sluta iterera och returnera svaret till användaren.
if response.stop_reason == "end_turn":
# Claude is done. Return the answer.
print(response.content[0].text)tool_use — Kör ett verktyg
tool_use betyder att Claude vill anropa ett av verktygen Ni gav den. Svaret är inte färdigt — Claude väntar på ett verktygsresultat.
Er uppgift är att köra det begärda verktyget, lägga till resultatet i meddelandehistoriken och anropa API:et igen så att Claude kan fortsätta.
if response.stop_reason == "tool_use":
tool_call = next(b for b in response.content if b.type == "tool_use")
result = run_tool(tool_call.name, tool_call.input)
# Append the result and loop again (next scenes show how)max_tokens — Kapat
max_tokens betyder att svaret kapades eftersom det nådde gränsen för max_tokens som Ni angav i begäran.
Utdata är ofullständig — genereringen avbröts mitt i ett resonemang, inte för att Claude var färdig. Lösningen är att höja max_tokens eller strömma svaret vid mycket långa utdata.
Behandla aldrig max_tokens som en lyckad slutföring.
if response.stop_reason == "max_tokens":
# Output was truncated. Retry with a higher max_tokens,
# or use client.messages.stream(...) for long outputs.
print("Response was cut off — increase max_tokens.")stop_sequence — Anpassat stopp
stop_sequence betyder att Claude nådde en anpassad stoppsträng som Ni definierade i Er begäran via stop_sequences.
Genereringen stoppas i samma ögonblick som strängen produceras. Detta är användbart när Ni vill att modellen ska stanna vid en känd gräns, till exempel "###" eller "END".
response = client.messages.create(
model="claude-opus-4-8",
max_tokens=1024,
stop_sequences=["###"],
messages=[{"role": "user", "content": "List three colors, then ###"}],
)
if response.stop_reason == "stop_sequence":
print("Stopped at a custom sequence.")De fyra i översikt
Här är hela uppsättningen för den här lektionen:
- end_turn — Claude avslutade på naturlig väg. Stoppa loopen.
- tool_use — Claude vill använda ett verktyg. Kör det, lägg till resultatet och anropa igen.
- max_tokens — Utdata har kapats. Höj gränsen eller strömma.
- stop_sequence — En anpassad stoppsträng som Ni definierade nåddes.
Två av dessa (end_turn, stop_sequence) betyder att turen är slutförd. En (tool_use) betyder att Ni ska fortsätta. En (max_tokens) betyder att något gick fel med Er gräns.
Agentloopen
En agent är helt enkelt en loop som styrs av stop_reason:
Skicka en begäran och inspektera stop_reason. Om värdet är tool_use, kör verktygen, lägg till resultaten i historiken och upprepa. Fortsätt tills stop_reason är end_turn.
Modellen behåller inget tillstånd mellan anrop, så Ni måste skicka hela meddelandehistoriken vid varje tur.
messages = [{"role": "user", "content": user_input}]
while True:
response = client.messages.create(
model="claude-opus-4-8",
max_tokens=4096,
tools=tools,
messages=messages,
)
if response.stop_reason == "end_turn":
break
if response.stop_reason == "tool_use":
messages.append({"role": "assistant", "content": response.content})
results = run_tools(response.content)
messages.append({"role": "user", "content": results})Avsluta på signalen, inte texten
Den allra viktigaste regeln är: avsluta loopen baserat på stop_reason, aldrig genom att tolka text efter ord som "done", "finished" eller "complete".
Textmatchning är bräcklig — modellen kan säga "I'm done thinking, let me check one more file" och Er kod skulle då stoppa för tidigt. stop_reason är modellens strukturerade och tillförlitliga signal.
Iterationsgränser är ett säkerhetsnät
Ni kan lägga till ett maximalt antal iterationer i loopen så att en agent som fastnat inte kan iterera för evigt. Det är god praxis.
Men en iterationsgräns är ett säkerhetsnät, aldrig det primära sättet att stoppa. Det primära stoppet är alltid end_turn. Beslut om när arbetet är klart fattas av modellen; gränsen fångar bara upp det sällsynta fall då något går fel.
MAX_ITERS = 25 # safety net only
for _ in range(MAX_ITERS):
response = client.messages.create(...)
if response.stop_reason == "end_turn":
break # the real, primary stop
# ... handle tool_use ...
else:
log.warning("Hit iteration cap — investigate.")Sätt ihop helheten
En robust hanterare gör en uttrycklig förgrening för varje stopporsak:
end_turn→ returnera resultatet.tool_use→ kör verktygen, lägg till resultaten och fortsätt.max_tokens→ utdatan är kapad; höj gränsen och försök igen i stället för att använda ett ofullständigt svar.stop_sequence→ hantera den kända gräns Ni definierade.
Att hantera alla förgreningar är det som skiljer en tillförlitlig agent från en som tyst slutar fungera vid kantfall.
def handle(response):
sr = response.stop_reason
if sr == "end_turn":
return finish(response)
if sr == "tool_use":
return continue_with_tools(response)
if sr == "max_tokens":
return retry_with_more_tokens(response)
if sr == "stop_sequence":
return handle_boundary(response)Snabbtest
En agentloop returnerar ett svar med stop_reason == "tool_use". Vilken är nästa korrekta åtgärd?
Sammanfattning
Viktiga lärdomar:
- end_turn — slutfört; stoppa loopen och returnera.
- tool_use — kör verktyget, lägg till resultatet och anropa igen.
- max_tokens — kapat; höj gränsen eller strömma, använd inte den ofullständiga utdatan.
- stop_sequence — en anpassad stoppsträng som Ni definierade nåddes.
Styr alltid kontrollflödet från stop_reason, aldrig genom att tolka text. Avsluta på end_turn; använd iterationsgränser endast som säkerhetsnät. När Ni behärskar detta blir agentloopen enkel och tillförlitlig.
Lär dig Python med en AI-lärare – gratis
Skriv och kör riktig kod i webbläsaren, få omedelbar hjälp av en AI-lärare dygnet runt och fortsätt där du slutade – på webben eller i appen.
- Kurser
- 26
- Lektioner
- 104
Vanliga frågor
Är lektionen ”Förklaringar av stoporsaker” gratis?
Ja – du kan läsa vilka 3 lektioner som helst i lärvägen Claude Architect, inklusive ”Förklaringar av stoporsaker”, kostnadsfritt i sin helhet här på webben. Därefter låser CoddyKit PRO upp alla lektioner, plus interaktiv övning med en inbyggd kodredigerare och en AI-lärare dygnet runt. Kursen i Claude Architect innehåller totalt 4 lektioner.
Vad lär jag mig i ”Förklaringar av stoporsaker”?
end_turn, tool_use, max_tokens och stop_sequence. Ni övar på Claude Architect med praktisk kod som körs direkt i webbläsaren, medan en AI-handledare som är tillgänglig dygnet runt svarar på Era frågor under lektionen.
Behöver jag någon erfarenhet för att börja lära mig Claude Architect?
Du behöver inga förkunskaper. Utbildningen i Claude Architect på CoddyKit är upplagd för allt från nybörjare till avancerade elever, så att du kan börja här eller från början och gå fram i din egen takt. Detta är lektion 3 av 4.
Hur lång tid tar lektionen ”Förklaringar av stoporsaker”?
De flesta CoddyKit-lektioner tar cirka 5–10 minuter. Varje lektion är kort och interaktiv, så att du gör stadiga framsteg och kan fortsätta precis där du slutade – på webben eller i appen.
Kan jag skriva och köra kod i den här Claude Architect-lektionen?
Ja. Varje Claude Architect-lektion innehåller en inbyggd kodredigerare, så att du kan skriva och köra riktig kod direkt i webbläsaren och få omedelbar AI-feedback – utan lokal installation.
Alla lektioner i den här kursen
- Claude-modellfamiljen
- Anatomin hos en API-begäran
- Förklaringar av stoporsaker
- Tokens, kontextfönster och kostnad