Loop sekilas
Setiap sesi agent mengikuti siklus yang sama:- Terima prompt. Claude menerima prompt Anda, bersama dengan system prompt, tool definitions, dan conversation history. SDK menghasilkan
SystemMessagedengan subtype"init"yang berisi session metadata. - Evaluasi dan respons. Claude mengevaluasi state saat ini dan menentukan cara melanjutkan. Ini dapat merespons dengan teks, meminta satu atau lebih tool calls, atau keduanya. SDK menghasilkan
AssistantMessageyang berisi teks dan permintaan tool call apa pun. - Eksekusi tools. SDK menjalankan setiap tool yang diminta dan mengumpulkan hasilnya. Setiap set hasil tool umpan balik ke Claude untuk keputusan berikutnya. Anda dapat menggunakan hooks untuk mengintersepsi, memodifikasi, atau memblokir tool calls sebelum dijalankan.
- Ulangi. Langkah 2 dan 3 berulang sebagai siklus. Setiap siklus penuh adalah satu turn. Claude terus memanggil tools dan memproses hasil sampai menghasilkan respons tanpa tool calls.
- Kembalikan hasil. SDK menghasilkan
AssistantMessagefinal dengan respons teks (tanpa tool calls), diikuti olehResultMessagedengan teks final, token usage, cost, dan session ID.
Glob dan merespons dengan hasilnya. Tugas kompleks (“refactor modul auth dan perbarui tests”) dapat merantai puluhan tool calls di banyak turn, membaca file, mengedit kode, dan menjalankan tests, dengan Claude menyesuaikan pendekatannya berdasarkan setiap hasil.
Turns dan messages
Turn adalah satu round trip di dalam loop: Claude menghasilkan output yang mencakup tool calls, SDK menjalankan tools tersebut, dan hasilnya umpan balik ke Claude secara otomatis. Ini terjadi tanpa menghasilkan kontrol kembali ke kode Anda. Turns berlanjut sampai Claude menghasilkan output tanpa tool calls, di mana titik loop berakhir dan hasil final dikirimkan. Pertimbangkan seperti apa sesi penuh untuk prompt “Fix the failing tests in auth.ts”. Pertama, SDK mengirim prompt Anda ke Claude dan menghasilkanSystemMessage dengan session metadata. Kemudian loop dimulai:
- Turn 1: Claude memanggil
Bashuntuk menjalankannpm test. SDK menghasilkanAssistantMessagedengan tool call, menjalankan perintah, kemudian menghasilkanUserMessagedengan output (tiga kegagalan). - Turn 2: Claude memanggil
Readpadaauth.tsdanauth.test.ts. SDK mengembalikan konten file dan menghasilkanAssistantMessage. - Turn 3: Claude memanggil
Edituntuk memperbaikiauth.ts, kemudian memanggilBashuntuk menjalankan kembalinpm test. Ketiga tests lulus. SDK menghasilkanAssistantMessage. - Turn final: Claude menghasilkan respons hanya teks tanpa tool calls: “Fixed the auth bug, all three tests pass now.” SDK menghasilkan
AssistantMessagefinal dengan teks ini, kemudianResultMessagedengan teks yang sama ditambah cost dan usage.
max_turns / maxTurns, yang menghitung tool-use turns saja. Misalnya, max_turns=2 dalam loop di atas akan berhenti sebelum langkah edit. Anda juga dapat menggunakan max_budget_usd / maxBudgetUsd untuk membatasi turns berdasarkan threshold pengeluaran.
Tanpa batas, loop berjalan sampai Claude selesai sendiri, yang baik untuk tugas yang well-scoped tetapi dapat berjalan lama pada prompts open-ended (“improve this codebase”). Menetapkan budget adalah default yang baik untuk production agents. Lihat Turns dan budget di bawah untuk referensi opsi.
Message types
Saat loop berjalan, SDK menghasilkan aliran messages. Setiap message membawa tipe yang memberi tahu Anda tahap loop mana yang berasal darinya. Lima tipe inti adalah:SystemMessage: session lifecycle events. Fieldsubtypemembedakannya:"init"adalah message pertama (session metadata), dan"compact_boundary"menyala setelah compaction. Di TypeScript, compact boundary adalah tipeSDKCompactBoundaryMessagetersendiri daripada subtype dariSDKSystemMessage.AssistantMessage: dipancarkan setelah setiap respons Claude, termasuk yang hanya teks final. Berisi text content blocks dan tool call blocks dari turn itu.UserMessage: dipancarkan setelah setiap eksekusi tool dengan tool result content yang dikirim kembali ke Claude. Juga dipancarkan untuk input pengguna apa pun yang Anda stream mid-loop.StreamEvent: hanya dipancarkan ketika partial messages diaktifkan. Berisi raw API streaming events (text deltas, tool input chunks). Lihat Stream responses.ResultMessage: menandai akhir dari agent loop. Berisi hasil teks final, token usage, cost, dan session ID. Periksa fieldsubtypeuntuk menentukan apakah tugas berhasil atau mencapai batas. Sejumlah kecil trailing system events, sepertiprompt_suggestion, dapat tiba setelahnya, jadi iterasi stream hingga selesai daripada break pada hasil. Lihat Handle the result.
Handle messages
Messages mana yang Anda handle tergantung pada apa yang Anda bangun:- Final results only: handle
ResultMessageuntuk mendapatkan output, cost, dan apakah tugas berhasil atau mencapai batas. - Progress updates: handle
AssistantMessageuntuk melihat apa yang dilakukan Claude setiap turn, termasuk tools mana yang dipanggilnya. - Live streaming: aktifkan partial messages (
include_partial_messagesdi Python,includePartialMessagesdi TypeScript) untuk mendapatkanStreamEventmessages secara real time. Lihat Stream responses in real-time.
- Python: periksa message types dengan
isinstance()terhadap classes yang diimpor dariclaude_agent_sdk(misalnya,isinstance(message, ResultMessage)). - TypeScript: periksa field string
type(misalnya,message.type === "result").AssistantMessagedanUserMessagemembungkus raw API message dalam field.message, jadi content blocks berada dimessage.message.content, bukanmessage.content.
Contoh: Periksa message types dan handle results
Contoh: Periksa message types dan handle results
Eksekusi tool
Tools memberikan agent Anda kemampuan untuk mengambil tindakan. Tanpa tools, Claude hanya dapat merespons dengan teks. Dengan tools, Claude dapat membaca file, menjalankan perintah, mencari kode, dan berinteraksi dengan layanan eksternal.Built-in tools
SDK mencakup tools yang sama yang menggerakkan Claude Code:| Kategori | Tools | Apa yang mereka lakukan |
|---|---|---|
| File operations | Read, Edit, Write | Baca, modifikasi, dan buat file |
| Search | Glob, Grep | Temukan file berdasarkan pola, cari konten dengan regex |
| Execution | Bash | Jalankan shell commands, scripts, git operations |
| Web | WebSearch, WebFetch | Cari web, ambil dan parse halaman |
| Discovery | ToolSearch | Temukan dan muat tools secara dinamis on-demand daripada preloading semuanya |
| Orchestration | Agent, Skill, AskUserQuestion, TaskCreate, TaskUpdate | Spawn subagents, invoke skills, tanya pengguna, track tasks |
- Hubungkan layanan eksternal dengan MCP servers (databases, browsers, APIs)
- Tentukan custom tools dengan custom tool handlers
- Muat project skills melalui setting sources untuk reusable workflows
Tool permissions
Claude menentukan tools mana yang akan dipanggil berdasarkan tugas, tetapi Anda mengontrol apakah panggilan tersebut diizinkan untuk dieksekusi. Anda dapat auto-approve tools spesifik, memblokir yang lain sepenuhnya, atau memerlukan approval untuk semuanya. Tiga opsi bekerja bersama untuk menentukan apa yang berjalan:allowed_tools/allowedToolsauto-approves tools yang terdaftar. Agent read-only dengan["Read", "Glob", "Grep"]dalam daftar allowed tools-nya menjalankan tools tersebut tanpa prompting. Tools yang tidak terdaftar masih tersedia tetapi memerlukan permission.disallowed_tools/disallowedToolsmemblokir tools yang terdaftar, terlepas dari pengaturan lainnya. Lihat Permissions untuk urutan aturan yang diperiksa sebelum tool berjalan.permission_mode/permissionModemengontrol apa yang terjadi pada tools yang tidak tercakup oleh allow atau deny rules. Lihat Permission mode untuk mode yang tersedia.
"Bash(npm *)" untuk mengizinkan hanya perintah spesifik. Lihat Permissions untuk full rule syntax.
Ketika tool ditolak, Claude menerima rejection message sebagai tool result dan biasanya mencoba pendekatan berbeda atau melaporkan bahwa tidak dapat melanjutkan.
Parallel tool execution
Ketika Claude meminta multiple tool calls dalam satu turn, kedua SDK dapat menjalankannya secara concurrent atau sequential tergantung pada tool. Read-only tools (sepertiRead, Glob, Grep, dan MCP tools yang ditandai sebagai read-only) dapat berjalan secara concurrent. Tools yang memodifikasi state (seperti Edit, Write, dan Bash) berjalan secara sequential untuk menghindari conflicts.
Custom tools default ke sequential execution. Untuk mengaktifkan parallel execution untuk custom tool, set readOnlyHint dalam annotationsnya. Kedua TypeScript dan Python SDKs menggunakan field name ini dari MCP SDK.
Control how the loop runs
Anda dapat membatasi berapa banyak turns yang diambil loop, berapa banyak biayanya, seberapa dalam Claude bernalar, dan apakah tools memerlukan approval sebelum berjalan. Semua ini adalah fields padaClaudeAgentOptions (Python) / Options (TypeScript).
Turns dan budget
| Opsi | Apa yang dikontrolnya | Default |
|---|---|---|
Max turns (max_turns / maxTurns) | Maximum tool-use round trips | Tidak ada batas |
Max budget (max_budget_usd / maxBudgetUsd) | Maximum cost sebelum berhenti | Tidak ada batas |
ResultMessage dengan error subtype yang sesuai (error_max_turns atau error_max_budget_usd). Lihat Handle the result untuk cara memeriksa subtypes ini dan ClaudeAgentOptions / Options untuk syntax.
Effort level
Opsieffort mengontrol berapa banyak reasoning yang diterapkan Claude. Lower effort levels menggunakan fewer tokens per turn dan mengurangi cost. Tidak semua models mendukung effort parameter. Lihat Effort untuk models mana yang mendukungnya.
| Level | Behavior | Baik untuk |
|---|---|---|
"low" | Minimal reasoning, fast responses | File lookups, listing directories |
"medium" | Balanced reasoning | Routine edits, standard tasks |
"high" | Thorough analysis | Refactors, debugging |
"xhigh" | Extended reasoning depth | Coding dan agentic tasks; recommended pada Opus 4.7 |
"max" | Maximum reasoning depth | Multi-step problems memerlukan deep analysis |
effort, Python SDK membiarkan parameter unset dan menunda ke model’s default behavior. TypeScript SDK defaults ke "high".
effort trades latency dan token cost untuk reasoning depth dalam setiap respons. Extended thinking adalah fitur terpisah yang menghasilkan visible chain-of-thought blocks dalam output. Mereka independen: Anda dapat set effort: "low" dengan extended thinking diaktifkan, atau effort: "max" tanpanya.effort dalam top-level query() options untuk seluruh sesi, atau per subagent dengan field effort pada AgentDefinition untuk override session level.
Permission mode
Opsi permission mode (permission_mode di Python, permissionMode di TypeScript) mengontrol apakah agent meminta approval sebelum menggunakan tools:
| Mode | Behavior |
|---|---|
"default" | Tools yang tidak tercakup oleh allow rules memicu approval callback Anda; tidak ada callback berarti deny |
"acceptEdits" | Auto-approves file edits dan common filesystem commands (mkdir, touch, mv, cp, dll.); Bash commands lainnya mengikuti default rules |
"plan" | Read-only tools berjalan; Claude mengeksplorasi dan menghasilkan plan tanpa mengedit source files Anda |
"dontAsk" | Tidak pernah prompt. Tools pre-approved oleh permission rules berjalan, semuanya lainnya ditolak |
"auto" (TypeScript only) | Menggunakan model classifier untuk approve atau deny setiap tool call. Lihat Auto mode untuk availability dan behavior |
"bypassPermissions" | Menjalankan semua allowed tools tanpa bertanya. Tidak dapat digunakan saat berjalan sebagai root pada Unix. Gunakan hanya dalam isolated environments di mana tindakan agent tidak dapat mempengaruhi systems yang Anda pedulikan |
"default" dengan tool approval callback untuk surface approval prompts. Untuk autonomous agents pada dev machine, "acceptEdits" auto-approves file edits dan common filesystem commands (mkdir, touch, mv, cp, dll.) sambil masih gating Bash commands lainnya di belakang allow rules. Reserve "bypassPermissions" untuk CI, containers, atau isolated environments lainnya. Lihat Permissions untuk full details.
Model
Jika Anda tidak setmodel, SDK menggunakan Claude Code’s default, yang tergantung pada authentication method dan subscription Anda. Set secara eksplisit (misalnya, model="claude-sonnet-4-6") untuk pin model spesifik atau untuk menggunakan smaller model untuk faster, cheaper agents. Lihat models untuk available IDs.
Jendela konteks
Jendela konteks adalah total jumlah informasi yang tersedia untuk Claude selama sesi. Ini tidak reset antara turns dalam sesi. Semuanya terakumulasi: system prompt, tool definitions, conversation history, tool inputs, dan tool outputs. Konten yang tetap sama di seluruh turns (system prompt, tool definitions, CLAUDE.md) secara otomatis prompt cached, yang mengurangi cost dan latency untuk repeated prefixes.Apa yang mengkonsumsi konteks
Berikut adalah cara setiap komponen mempengaruhi konteks dalam SDK:| Sumber | Ketika dimuat | Dampak |
|---|---|---|
| System prompt | Setiap request | Small fixed cost, selalu present |
| CLAUDE.md files | Session start, melalui settingSources | Full content dalam setiap request (tetapi prompt-cached, jadi hanya request pertama yang membayar full cost) |
| Tool definitions | Setiap request; MCP schemas deferred secara default | Built-in tool schemas dimuat setiap request. Tool search menunda MCP tool schemas secara default, kembali ke upfront loading pada Vertex AI atau non-first-party ANTHROPIC_BASE_URL. Lihat Configure tool search untuk full matrix |
| Conversation history | Terakumulasi di seluruh turns | Tumbuh dengan setiap turn: prompts, responses, tool inputs, tool outputs |
| Skill descriptions | Session start, melalui setting sources | Short summaries; full content dimuat hanya ketika invoked |
Automatic compaction
Ketika jendela konteks mendekati limitnya, SDK secara otomatis compacts conversation: ini merangkum older history untuk membebaskan space, menjaga most recent exchanges dan key decisions Anda tetap intact. SDK memancarkan message dengantype: "system" dan subtype: "compact_boundary" dalam stream ketika ini terjadi (di Python ini adalah SystemMessage; di TypeScript ini adalah tipe SDKCompactBoundaryMessage terpisah).
Compaction menggantikan older messages dengan summary, jadi specific instructions dari early dalam conversation mungkin tidak dipertahankan. Persistent rules milik CLAUDE.md (dimuat melalui settingSources) daripada dalam initial prompt, karena CLAUDE.md content di-re-inject pada setiap request.
Anda dapat customize compaction behavior dalam beberapa cara:
- Summarization instructions dalam CLAUDE.md: Compactor membaca CLAUDE.md Anda seperti context lainnya, jadi Anda dapat menyertakan section yang memberi tahu apa yang dipertahankan saat merangkum. Section header adalah free-form (bukan magic string); compactor matches pada intent.
PreCompacthook: Jalankan custom logic sebelum compaction terjadi, misalnya untuk archive full transcript. Hook menerima fieldtrigger(manualatauauto). Lihat hooks.- Manual compaction: Kirim
/compactsebagai prompt string untuk trigger compaction on demand. Commands yang dikirim dengan cara ini adalah SDK inputs, bukan CLI-only shortcuts. Lihat commands dalam SDK.
Contoh: Summarization instructions dalam CLAUDE.md
Contoh: Summarization instructions dalam CLAUDE.md
Tambahkan section ke CLAUDE.md proyek Anda yang memberi tahu compactor apa yang dipertahankan. Nama header tidak special; gunakan label yang jelas apa pun.
CLAUDE.md
Jaga konteks tetap efisien
Beberapa strategi untuk long-running agents:- Gunakan subagents untuk subtasks. Setiap subagent dimulai dengan fresh conversation (tidak ada prior message history, meskipun dimuat system prompt dan project-level context seperti CLAUDE.md sendiri). Ini tidak melihat parent’s turns, dan hanya final responsenya kembali ke parent sebagai tool result. Main agent’s context tumbuh oleh summary itu, bukan oleh full subtask transcript. Lihat What subagents inherit untuk details.
- Jadilah selective dengan tools. Setiap tool definition mengambil context space. Gunakan field
toolspadaAgentDefinitionuntuk scope subagents ke minimum set yang mereka butuhkan. - Perhatikan MCP server costs. MCP tool search menunda MCP tool schemas secara default dan memuat mereka on demand. Ketika tool search dimatikan, pada Vertex AI, atau di belakang non-first-party
ANTHROPIC_BASE_URL, setiap MCP server menambahkan semua tool schemas-nya ke setiap request, jadi beberapa servers dengan banyak tools dapat mengkonsumsi significant context sebelum agent melakukan pekerjaan apa pun. - Gunakan lower effort untuk routine tasks. Set effort ke
"low"untuk agents yang hanya perlu membaca files atau list directories. Ini mengurangi token usage dan cost.
Sessions dan continuity
Setiap interaksi dengan SDK membuat atau melanjutkan sesi. Capture session ID dariResultMessage.session_id (tersedia di kedua SDKs) untuk resume nanti. TypeScript SDK juga mengeksposnya sebagai direct field pada init SystemMessage; di Python ini nested dalam SystemMessage.data.
Ketika Anda resume, full context dari previous turns dipulihkan: files yang dibaca, analysis yang dilakukan, dan actions yang diambil. Anda juga dapat fork sesi untuk branch ke pendekatan berbeda tanpa memodifikasi original.
Lihat Session management untuk full guide pada resume, continue, dan fork patterns.
Di Python,
ClaudeSDKClient menangani session IDs secara otomatis di seluruh multiple calls. Lihat Python SDK reference untuk details.Handle the result
Ketika loop berakhir,ResultMessage memberi tahu Anda apa yang terjadi dan memberikan output. Field subtype (tersedia di kedua SDKs) adalah cara utama untuk memeriksa termination state.
| Result subtype | Apa yang terjadi | Field result tersedia? |
|---|---|---|
success | Claude menyelesaikan tugas secara normal | Ya |
error_max_turns | Mencapai batas maxTurns sebelum selesai | Tidak |
error_max_budget_usd | Mencapai batas maxBudgetUsd sebelum selesai | Tidak |
error_during_execution | Error mengganggu loop (misalnya, API failure atau cancelled request) | Tidak |
error_max_structured_output_retries | Structured output validation gagal setelah configured retry limit | Tidak |
result (final text output) hanya present pada variant success, jadi selalu periksa subtype sebelum membacanya. Semua result subtypes membawa total_cost_usd, usage, num_turns, dan session_id sehingga Anda dapat track cost dan resume bahkan setelah errors. Di Python, total_cost_usd dan usage diketik sebagai optional dan mungkin None pada beberapa error paths, jadi guard sebelum formatting mereka. Lihat Tracking costs dan usage untuk details tentang interpreting usage fields.
Hasil juga mencakup field stop_reason (string | null di TypeScript, str | None di Python) yang menunjukkan mengapa model berhenti generating pada final turn-nya. Common values adalah end_turn (model selesai secara normal), max_tokens (mencapai output token limit), dan refusal (model menolak request). Pada error result subtypes, stop_reason membawa value dari last assistant response sebelum loop berakhir. Untuk mendeteksi refusals, periksa stop_reason === "refusal" (TypeScript) atau stop_reason == "refusal" (Python). Lihat SDKResultMessage (TypeScript) atau ResultMessage (Python) untuk full type.
Hooks
Hooks adalah callbacks yang menyala pada points spesifik dalam loop: sebelum tool berjalan, setelah dikembalikan, ketika agent selesai, dan sebagainya. Beberapa commonly used hooks adalah:| Hook | Ketika menyala | Common uses |
|---|---|---|
PreToolUse | Sebelum tool dieksekusi | Validate inputs, block dangerous commands |
PostToolUse | Setelah tool dikembalikan | Audit outputs, trigger side effects |
UserPromptSubmit | Ketika prompt dikirim | Inject additional context ke prompts |
Stop | Ketika agent selesai | Validate hasil, save session state |
SubagentStart / SubagentStop | Ketika subagent spawned atau completed | Track dan aggregate parallel task results |
PreCompact | Sebelum context compaction | Archive full transcript sebelum merangkum |
PreToolUse hook yang menolak tool call mencegahnya dari executing, dan Claude menerima rejection message sebagai gantinya.
Kedua SDKs mendukung semua events di atas. TypeScript SDK mencakup additional events yang Python belum dukung. Lihat Control execution dengan hooks untuk complete event list, per-SDK availability, dan full callback API.
Put it all together
Contoh ini menggabungkan key concepts dari halaman ini ke dalam single agent yang memperbaiki failing tests. Ini mengkonfigurasi agent dengan allowed tools (auto-approved sehingga agent berjalan secara autonomous), project settings, dan safety limits pada turns dan reasoning effort. Saat loop berjalan, ini menangkap session ID untuk potential resumption, handles final result, dan prints total cost.Next steps
Sekarang Anda memahami loop, berikut adalah tempat untuk pergi tergantung pada apa yang Anda bangun:- Belum menjalankan agent? Mulai dengan quickstart untuk mendapatkan SDK terinstal dan lihat contoh lengkap berjalan end to end.
- Siap untuk hook ke proyek Anda? Load CLAUDE.md, skills, dan filesystem hooks sehingga agent mengikuti project conventions Anda secara otomatis.
- Membangun interactive UI? Aktifkan streaming untuk menampilkan live text dan tool calls saat loop berjalan.
- Butuh tighter control atas apa yang dapat dilakukan agent? Lock down tool access dengan permissions, dan gunakan hooks untuk audit, block, atau transform tool calls sebelum dieksekusi.
- Menjalankan long atau expensive tasks? Offload isolated work ke subagents untuk keep main context Anda lean.