Pętla agenta: jak agent wie, co zrobić dalej
Po tej lekcji wiesz, czym agent różni się od workflow, jak wygląda jeden obrót pętli i po czym Twój kod poznaje, że trzeba kręcić dalej albo skończyć.
W jednej minucie
Agent to system, w którym model sam decyduje, jakie kroki wykonać i po które narzędzia sięgnąć1.
Agent to w praktyce zwykła pętla w Twoim kodzie: model prosi o narzędzie, Ty je uruchamiasz i odsyłasz wynik — aż model skończy1.
O kolejnym obrocie decyduje pole stop_reason, nie treść odpowiedzi.
Agent czy workflow?
Anthropic dzieli systemy z modelem na dwa rodzaje. Różnią się tym, kto wybiera następny krok.
Workflow to system, w którym model i narzędzia działają według ścieżki zapisanej z góry w kodzie1.
| Cecha | Workflow | Agent |
|---|---|---|
| Kto wybiera krok | Twój kod | Model |
| Liczba kroków | Znana z góry | Zależy od zadania |
| Przewidywalność | wysoka | niższa |
| Dobry, gdy | Kroki są stałe | Kroków nie da się przewidzieć |
Anthropic zaleca zaczynać od najprostszego rozwiązania i dokładać złożoność dopiero wtedy, gdy jest potrzebna1. Często wystarczy jedno wywołanie modelu albo prosty workflow.
Pętla krok po kroku
Jeden obrót pętli agenta to jedno wywołanie API. W skrócie:
- Żądaniehistoria + narzędzia
- Odpowiedźstop_reason
- Narzędzieuruchamia Twój kod
- Wyniktool_result → znowu 1
Ten sam obieg z rozgałęzieniami. Przejdź go krok po kroku albo pokaż wszystko naraz:
- 1Żądanie. Wysyłasz historię rozmowy i listę narzędzi.
- 2Odpowiedź. Claude odpowiada i ustawia
stop_reason, czyli powód, dla którego przestał pisać. - 3tool_use. Model prosi o narzędzie. Uruchamiasz je w swoim kodzie z podanym
input. - 4tool_result. Dopisujesz wynik do historii i wracasz do kroku 1.
- 5end_turn. Model skończył, więc pętla się zatrzymuje.
- 6Limit. Twój warunek stopu przerywa pętlę, nawet gdy model chce dalej.
Co wraca do modelu
Model nie pamięta poprzednich wywołań. W każdym obrocie wysyłasz mu całą historię od nowa.
messages.tool_use i Twoje tool_result.tool_use, plus stop_reason.Wynik zaraz po prośbie
Między wiadomością z tool_use a odpowiedzią z tool_result nie może być nic innego3.
Najpierw wyniki, potem tekst
W wiadomości z wynikami bloki tool_result idą na początek, a ewentualny tekst dopiero po nich3.
Treść z zewnątrz to dane, nie polecenia
Strona czy mail mogą zawierać ukryte instrukcje (pośredni prompt injection). Trzymaj je w tool_result, nie w system prompcie3.
Pętla w kodzie
Cała pętla mieści się w kilkunastu linijkach. Podświetlone linie to decyzja o następnym obrocie i odesłanie wyników.
import anthropic
client = anthropic.Anthropic()
MAX_STEPS = 10 # warunek stopu po Twojej stronie
def run_agent(task, tools):
messages = [{"role": "user", "content": task}]
for _ in range(MAX_STEPS):
response = client.messages.create(
model="claude-sonnet-5-5",
max_tokens=2048,
tools=tools,
messages=messages,
)
messages.append({"role": "assistant", "content": response.content})
if response.stop_reason != "tool_use":
return response # end_turn (lub inny powód): koniec
# model prosi o narzędzia: wykonaj je i odeślij wyniki
results = [run_tool(b) for b in response.content if b.type == "tool_use"]
messages.append({"role": "user", "content": results})
raise RuntimeError("Przekroczono limit kroków")
def run_tool(block):
try:
output = TOOLS[block.name](**block.input)
return {"type": "tool_result", "tool_use_id": block.id, "content": str(output)}
except Exception as e:
return {"type": "tool_result", "tool_use_id": block.id,
"content": f"{type(e).__name__}: {e}", "is_error": True}
TOOLS to słownik Twoich funkcji, np. {"get_weather": get_weather}, a tools to ich opisy dla modelu.
Jedna wymiana: prośba i wynik
{
"type": "tool_use",
"id": "toolu_01A09q90qw90lq917835lq9",
"name": "get_weather",
"input": { "location": "Zakopane" }
}
{
"type": "tool_result",
"tool_use_id": "toolu_01A09q90qw90lq917835lq9",
"content": "4°C, śnieg"
}
tool_use_id łączy wynik z prośbą3.
is_error to flaga w tool_result, którą ustawiasz na true, gdy narzędzie zawiodło3.
Zamiast "failed" napisz "Limit zapytań przekroczony. Spróbuj za 60 sekund.". Model wie wtedy, co zrobić dalej3.
Kiedy pętla się kończy
Kod z poprzedniej sekcji kończy pętlę przy każdym powodzie innym niż tool_use. W prawdziwym agencie obsłuż je osobno.
| stop_reason | Co znaczy | Co robi pętla |
|---|---|---|
tool_use | Claude woła narzędzie | kolejny obrót |
end_turn | Naturalny koniec odpowiedzi | koniec |
max_tokens | Odpowiedź doszła do Twojego limitu max_tokens2 | podnieś limit lub dokończ |
pause_turn | Pętla narzędzi serwerowych trafiła na limit2 | wyślij ponownie |
refusal | Claude odmówił odpowiedzi2 | nie ponawiaj w ciemno |
Kolumna „Co robi pętla” to nasza rada, nie cytat z dokumentacji.
Zawsze dodaj Warunek stopu, np. limit iteracji1. Model nie powinien być jedyną rzeczą, która decyduje o końcu.
Loguj stop_reason i liczbę obrotów przy każdym uruchomieniu. Gdy agent zachowuje się dziwnie, to pierwsze dwie rzeczy, które warto sprawdzić.
Częste błędy
Większość problemów z pierwszą pętlą to jedna z tych czterech rzeczy.
„Gotowe!” w odpowiedzi nic nie znaczy. Decyduj po stop_reason, bo tekst modelu nie ma stałego formatu4.
„Oto wyniki:” przed blokiem tool_result kończy się błędem 4003.
- Pętla bez limitu: agent może krążyć bez końca i tyle samo kosztować.
- Błąd „failed”: ogólny komunikat nie daje modelowi szansy na poprawkę.
Pytania sprawdzające
Odpowiedź Claude kończy się słowami „Gotowe, to wszystko”, a stop_reason to tool_use. Co robi pętla?
Wykonuje narzędzie i robi kolejny obrót. Decyduje stop_reason, nie tekst: tool_use znaczy, że model czeka na wynik.
Czym różni się agent od workflow?
W workflow kolejne kroki zapisujesz w kodzie z góry. W agencie model sam wybiera następny krok i narzędzie.
Gdzie w wiadomości umieszczasz bloki tool_result?
Na początku tablicy content wiadomości z rolą user, przed jakimkolwiek tekstem. Inaczej API zwróci błąd 400.
Narzędzie rzuciło wyjątek. Co odsyłasz modelowi?
tool_result z is_error: true i konkretnym opisem: co poszło nie tak i co spróbować dalej.
Podsumowanie
- Workflow ma kroki zapisane w kodzie; agent wybiera je sam.
- Jeden obrót pętli to jedno wywołanie API z całą historią.
- Kolejny obrót robisz tylko przy
stop_reason=tool_use. - Wyniki odsyłasz jako
tool_result: na początku wiadomości, ztool_use_id. - Limit iteracji ustawiasz Ty, nie model.
Źródła
- Building effective agents — Anthropic Engineeringopublikowano 2024-12-19 · sprawdzone 2026-11-02
- Stop reasons and fallback — Claude Docssprawdzone 2026-11-02
- Handle tool calls — Claude Docssprawdzone 2026-11-02
- Define tools — Claude Docssprawdzone 2026-11-02