CCAR-F› 1. Architektura agentowa i orkiestracja›Lekcja 1.1 CCAR-01

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ć.

~9 min czytania8 pojęć3 schematy4 pytaniasprawdzone ze źródłami 2 lis 2026
Źródła (4)

W jednej minucie

Definicja

Agent to system, w którym model sam decyduje, jakie kroki wykonać i po które narzędzia sięgnąć1.

Ważne

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.

Zapamiętaj

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.

Definicja

Workflow to system, w którym model i narzędzia działają według ścieżki zapisanej z góry w kodzie1.

CechaWorkflowAgent
Kto wybiera krokTwój kodModel
Liczba krokówZnana z góryZależy od zadania
Przewidywalnośćwysokaniższa
Dobry, gdyKroki są stałeKrokó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:

  1. Żądaniehistoria + narzędzia
  2. Odpowiedźstop_reason
  3. Narzędzieuruchamia Twój kod
  4. Wyniktool_result → znowu 1

Ten sam obieg z rozgałęzieniami. Przejdź go krok po kroku albo pokaż wszystko naraz:

żądanie odpowiedź tool_use tool_result end_turn limit Twój kodmessages[] ClaudeMessages API stop_reason?decyzja pętli Narzędzierun_tool(input) Odpowiedźkoniec pętli StopMAX_STEPS 1 2 3 4 5 6
Krok po kroku
  1. 1Żądanie. Wysyłasz historię rozmowy i listę narzędzi.
  2. 2Odpowiedź. Claude odpowiada i ustawia stop_reason, czyli powód, dla którego przestał pisać.
  3. 3tool_use. Model prosi o narzędzie. Uruchamiasz je w swoim kodzie z podanym input.
  4. 4tool_result. Dopisujesz wynik do historii i wracasz do kroku 1.
  5. 5end_turn. Model skończył, więc pętla się zatrzymuje.
  6. 6Limit. Twój warunek stopu przerywa pętlę, nawet gdy model chce dalej.
Pętla agenta: dwa wyjścia (koniec odpowiedzi albo limit) i jeden powrót (wynik narzędzia).
Definicja

stop_reason to pole odpowiedzi API, które mówi, dlaczego model przestał pisać. Wartość tool_use znaczy, że Claude woła narzędzie2, a end_turn, że skończył odpowiedź2.

Co wraca do modelu

Model nie pamięta poprzednich wywołań. W każdym obrocie wysyłasz mu całą historię od nowa.

Twój kodProwadzi pętlę i trzyma listę messages.
wysyła w każdym obrocie
Jedno żądanie do API
NarzędziaNazwa, opis i schemat wejścia każdego narzędzia.
HistoriaPytanie, odpowiedzi Claude z blokami tool_use i Twoje tool_result.
Treść z zewnątrzWyniki narzędzi: strony, maile, pliki. Traktuj je jako niezaufane.
odpowiada
ClaudeTekst i/lub kolejne 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.

Definicja

is_error to flaga w tool_result, którą ustawiasz na true, gdy narzędzie zawiodło3.

Przykład

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_reasonCo znaczyCo robi pętla
tool_useClaude woła narzędziekolejny obrót
end_turnNaturalny koniec odpowiedzikoniec
max_tokensOdpowiedź doszła do Twojego limitu max_tokens2podnieś limit lub dokończ
pause_turnPętla narzędzi serwerowych trafiła na limit2wyślij ponownie
refusalClaude odmówił odpowiedzi2nie ponawiaj w ciemno

Kolumna „Co robi pętla” to nasza rada, nie cytat z dokumentacji.

Ważne

Zawsze dodaj Warunek stopu, np. limit iteracji1. Model nie powinien być jedyną rzeczą, która decyduje o końcu.

Z praktyki

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.

Uwaga — koniec rozpoznawany po tekście

„Gotowe!” w odpowiedzi nic nie znaczy. Decyduj po stop_reason, bo tekst modelu nie ma stałego formatu4.

Uwaga — tekst przed wynikami

„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, z tool_use_id.
  • Limit iteracji ustawiasz Ty, nie model.

Źródła

  1. Building effective agents — Anthropic Engineeringopublikowano 2024-12-19 · sprawdzone 2026-11-02
  2. Stop reasons and fallback — Claude Docssprawdzone 2026-11-02
  3. Handle tool calls — Claude Docssprawdzone 2026-11-02
  4. Define tools — Claude Docssprawdzone 2026-11-02