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.
Tipe Message
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": session metadata untuk run. Ketika hookSessionStartatauSetupberjalan selama session startup, hook lifecycle messages tiba sebelum messageinit"compact_boundary": menyala setelah compaction"informational": plain-text status banners dari loop"worker_shutting_down": loop akan berakhir setelah turn saat ini karena host sedang keluar atau Remote Control terputus
"init"adalah tipenya sendiri dalam unionSDKMessagedaripada 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:
Melampaui built-in tools, Anda dapat:
- 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.
Kontrol cara loop berjalan
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
Ketika salah satu batas tercapai, SDK mengembalikan
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.
Dengan streaming input, pesan yang Anda kirim saat turn masih berjalan tetap antri ketika turn itu berakhir pada batas max-turns, dan itu memulai turn-nya sendiri dengan batas max-turns-nya sendiri. Sebelum v2.1.205, pesan yang tiba pada iterasi final turn bisa dikonsumsi ke dalam ending turn dan hilang tanpa pernah mencapai model.
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.
Jika Anda tidak set
effort, kedua SDKs membiarkan parameter unset dan menunda ke model’s default behavior.
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:
Untuk interactive applications, gunakan
"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-5") 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:
Large tool outputs mengkonsumsi significant context. Membaca file besar atau menjalankan command dengan verbose output dapat menggunakan ribuan tokens dalam satu turn. Konteks terakumulasi di seluruh turns, jadi longer sessions dengan banyak tool calls membangun significantly lebih banyak konteks daripada short ones.
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 Google Cloud’s Agent Platform, 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.
Field
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.
Ketika query berakhir pada error result:
- Sebuah single-shot
query()call menghasilkan final result message, kemudian raises error yang mencakup failure text, sepertiReached maximum number of turns. Raise adalah intentional — bungkus loop dalam try block jika kode Anda perlu melanjutkan melewatinya. Underlying Claude Code process juga exits dengan nonzero code. - Sebuah streaming input session tetap alive, dan Anda dapat terus mengirim messages.
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 titik-titik spesifik dalam loop: sebelum tool berjalan, setelah dikembalikan, ketika agent selesai, dan sebagainya. Beberapa hooks yang umum digunakan adalah:
Hooks berjalan dalam proses aplikasi Anda, bukan di dalam jendela konteks agent, jadi mereka tidak mengkonsumsi konteks. Hooks juga dapat memutus loop: hook
PreToolUse yang menolak panggilan tool mencegahnya dari eksekusi, dan Claude menerima pesan penolakan sebagai gantinya.
Kedua SDK mendukung semua peristiwa di atas. SDK TypeScript mencakup peristiwa tambahan yang Python belum dukung. Lihat Kontrol eksekusi dengan hooks untuk daftar peristiwa lengkap, ketersediaan per-SDK, dan API callback lengkap.
Satukan semuanya
Contoh ini menggabungkan konsep-konsep kunci dari halaman ini ke dalam satu agent yang memperbaiki tes yang gagal. Ini mengkonfigurasi agent dengan tools yang diizinkan (auto-approved sehingga agent berjalan secara otonom), pengaturan proyek, dan batas keamanan pada turns dan effort reasoning. Saat loop berjalan, ini menangkap session ID untuk potensi resumption, menangani hasil akhir, dan mencetak total biaya. Karena panggilanquery() single-shot menaikkan error setelah menghasilkan hasil error, loop dibungkus dalam blok try sehingga skrip keluar dengan bersih ketika batas tercapai.
Langkah selanjutnya
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.