Was this page helpful?
Claude Managed Agents menggantikan loop agen yang ditulis tangan dengan infrastruktur terkelola. Halaman ini mencakup perubahan apa ketika Anda bermigrasi dari loop kustom yang dibangun di Messages API atau dari Claude Agent SDK.
Semua permintaan Claude Managed Agents API memerlukan header beta managed-agents-2026-04-01. SDK menetapkan header beta secara otomatis.
Jika Anda membangun agen dengan memanggil messages.create dalam loop while, menjalankan panggilan alat sendiri, dan menambahkan hasil ke riwayat percakapan, sebagian besar kode itu akan hilang.
| Sebelum | Sesudah |
|---|---|
| Anda mempertahankan array riwayat percakapan dan meneruskannya kembali di setiap giliran. | Sesi menyimpan riwayat di sisi server. Kirim acara, terima acara. |
Anda mengurai stop_reason: "tool_use", menjalankan alat, dan loop kembali dengan pesan tool_result. | Alat pra-bangun dijalankan di dalam kontainer secara otomatis. Anda hanya menangani alat kustom melalui acara agent.custom_tool_use. |
| Anda menyediakan sandbox Anda sendiri untuk menjalankan kode yang dihasilkan agen. | Kontainer sesi menangani eksekusi kode, operasi file, dan bash. |
| Anda memutuskan kapan loop selesai. | Sesi memancarkan session.status_idle ketika agen tidak memiliki apa pun lagi untuk dilakukan. |
Sebelum (loop Messages API, disederhanakan):
Sesudah (Claude Managed Agents):
agent.custom_tool_use. Lihat Aliran acara sesi.Jika Anda membangun dengan Claude Agent SDK, Anda sudah bekerja dengan agen, alat, dan sesi sebagai konsep. Perbedaannya adalah di mana mereka berjalan: SDK dijalankan dalam proses yang Anda operasikan, sementara Managed Agents berjalan di infrastruktur Anthropic. Sebagian besar migrasi adalah pemetaan objek konfigurasi SDK ke padanan mereka di sisi API.
| Agent SDK | Managed Agents |
|---|---|
ClaudeAgentOptions(...) dibangun per jalankan | client.beta.agents.create(...) sekali; Agen disimpan dan diversi di sisi server. Lihat Penyiapan Agen. |
async with ClaudeSDKClient(...) atau query(...) | client.beta.sessions.create(...) kemudian kirim dan terima acara. |
Fungsi @tool-decorated dikirim secara otomatis oleh SDK | Deklarasikan sebagai {"type": "custom", ...} pada Agen; klien Anda menangani acara agent.custom_tool_use dan membalas dengan user.custom_tool_result. Lihat Alat. |
| Alat bawaan berjalan dalam proses Anda terhadap sistem file Anda | {"type": "agent_toolset_20260401"} menjalankan alat yang sama di dalam kontainer sesi terhadap . |
Sebelum (Agent SDK):
from claude_agent_sdk import (
ClaudeAgentOptions,
ClaudeSDKClient,
create_sdk_mcp_server,
tool,
)
@tool("get_weather", "Get the current weather for a city.", {"city": str})
async def get_weather(args: dict) -> dict:
return {"content": [{"type": "text", "text": f"{args['city']}: 18°C, clear"}]}
options = ClaudeAgentOptions(
model="claude-sonnet-4-6",
system_prompt="You are a concise weather assistant.",
mcp_servers={
"weather": create_sdk_mcp_server("weather", "1.0", tools=[get_weather])
},
)
async with ClaudeSDKClient(options=options) as agent:
await agent.query("What's the weather in Tokyo?")
async for msg in agent.receive_response():
print(msg)Sesudah (Managed Agents):
from anthropic import Anthropic
client = Anthropic()
agent = client.beta.agents.create(
name="weather-agent",
model="claude-sonnet-4-6",
system="You are a concise weather assistant.",
tools=[
{
"type": "custom",
"name": "get_weather",
"description": "Get the current weather for a city.",
"input_schema": {
"type": "object",
"properties": {"city": {"type": "string"}},
"required": ["city"],
},
}
],
)
environment = client.beta.environments.create(
name="weather-env",
config={"type": "cloud", "networking": {"type": "unrestricted"}},
)
session = client.beta.sessions.create(
agent={"type": "agent", "id": agent.id, "version": agent.version},
environment_id=environment.id,
)
def get_weather(city: str) -> str:
return f"{city}: 18°C, clear"
with client.beta.sessions.events.stream(session.id) as stream:
client.beta.sessions.events.send(
session.id,
events=[
{
"type": "user.message",
"content": [{"type": "text", "text": "What's the weather in Tokyo?"}],
}
],
)
for ev in stream:
if ev.type == "agent.message":
print("".join(b.text for b in ev.content))
elif ev.type == "agent.custom_tool_use":
result = get_weather(**ev.input)
client.beta.sessions.events.send(
session.id,
events=[
{
"type": "user.custom_tool_result",
"custom_tool_use_id": ev.id,
"content": [{"type": "text", "text": result}],
}
],
)
elif ev.type == "session.status_idle" and ev.stop_reason.type == "end_turn":
breakAgen dan Lingkungan dibuat sekali dan digunakan kembali di seluruh sesi. Fungsi alat masih berjalan dalam proses Anda; perbedaannya adalah Anda membaca acara agent.custom_tool_use dan mengirim hasilnya secara eksplisit alih-alih SDK mengirimnya untuk Anda.
Pertukaran untuk Anthropic menjalankan loop agen adalah bahwa beberapa hal yang ditangani SDK secara otomatis menjadi tanggung jawab klien Anda.
| Fitur SDK | Pendekatan Managed Agents |
|---|---|
| Mode perencanaan | Jalankan sesi khusus perencanaan terlebih dahulu, kemudian sesi kedua untuk dieksekusi. |
| Gaya output, perintah slash | Terapkan di klien Anda sebelum mengirim user.message atau setelah menerima agent.message. |
Hook PreToolUse / PostToolUse | Klien Anda sudah melihat setiap acara agent.custom_tool_use sebelum merespons; letakkan logika di sana. Untuk alat bawaan, gunakan permission_policy: always_ask. |
max_turns | Hitung giliran di sisi klien. |
sessions.create dan sessions.stream.resources.agent.custom_tool_use.Ketika model Claude baru dirilis, bermigrasi integrasi Claude Managed Agents biasanya merupakan perubahan satu bidang: perbarui model pada definisi agen Anda dan perubahan berlaku pada sesi berikutnya yang Anda buat.
Sebagian besar perubahan perilaku tingkat model yang didokumentasikan dalam panduan migrasi Messages API tidak memerlukan tindakan di pihak Anda:
max_tokens, konfigurasi thinking) ditangani oleh runtime Claude Managed Agents. Bidang-bidang ini tidak diekspos pada definisi agen.agent.custom_tool_use. Anda melihat data terstruktur, bukan string mentah.Deskripsi perilaku dalam panduan Messages API (apa yang dilakukan model secara berbeda) masih berlaku. Langkah-langkah migrasi (cara mengubah kode permintaan Anda) tidak.
messages = [{"role": "user", "content": task}]
while True:
response = client.messages.create(
model="claude-sonnet-4-6",
max_tokens=1024,
messages=messages,
tools=tools,
)
messages.append({"role": "assistant", "content": response.content})
if response.stop_reason == "end_turn":
break
for block in response.content:
if block.type == "tool_use":
result = execute_tool(block.name, block.input)
messages.append(
{
"role": "user",
"content": [
{
"type": "tool_result",
"tool_use_id": block.id,
"content": result,
}
],
}
)agent=$(
curl --fail-with-body -sS "https://api.anthropic.com/v1/agents?beta=true" \
-H "x-api-key: ${ANTHROPIC_API_KEY}" \
-H "anthropic-version: 2023-06-01" \
-H "anthropic-beta: managed-agents-2026-04-01" \
--json '{
"name": "Task Runner",
"model": "claude-sonnet-4-6",
"tools": [{"type": "agent_toolset_20260401"}]
}'
)
agent_id=$(jq -r '.id' <<< "${agent}")
session_id=$(
curl --fail-with-body -sS "https://api.anthropic.com/v1/sessions?beta=true" \
-H "x-api-key: ${ANTHROPIC_API_KEY}" \
-H "anthropic-version: 2023-06-01" \
-H "anthropic-beta: managed-agents-2026-04-01" \
--json "$(jq -n --argjson a "${agent}" --arg env "${environment_id}" \
'{agent: {type: "agent", id: $a.id, version: $a.version}, environment_id: $env}')" \
| jq -r '.id'
)
# Open the SSE stream in the background, then send the user message.
stream_log=$(mktemp)
curl --fail-with-body -sS -N \
"https://api.anthropic.com/v1/sessions/${session_id}/stream?beta=true" \
-H "x-api-key: ${ANTHROPIC_API_KEY}" \
-H "anthropic-version: 2023-06-01" \
-H "anthropic-beta: managed-agents-2026-04-01" \
> "${stream_log}" &
stream_pid=$!
curl --fail-with-body -sS \
"https://api.anthropic.com/v1/sessions/${session_id}/events?beta=true" \
-H "x-api-key: ${ANTHROPIC_API_KEY}" \
-H "anthropic-version: 2023-06-01" \
-H "anthropic-beta: managed-agents-2026-04-01" \
--json "$(jq -n --arg text "${task}" \
'{events: [{type: "user.message", content: [{type: "text", text: $text}]}]}')" \
> /dev/null
# Read events until the session goes idle.
while IFS= read -r line; do
[[ ${line} == data:* ]] || continue
event_type=$(jq -r '.type // empty' 2>/dev/null <<< "${line#data: }" || true)
[[ ${event_type} == "session.status_idle" ]] && break
done < <(tail -f -n +1 "${stream_log}")
kill "${stream_pid}" 2>/dev/null || true/workspacecwd, add_dirs menunjuk ke jalur lokal | Unggah atau pasang file sebagai sumber daya sesi. |
system_prompt dan hierarki CLAUDE.md | String system tunggal pada Agen. Setiap pembaruan menghasilkan versi baru di sisi server; pin sesi ke versi tertentu untuk mempromosikan atau rollback tanpa deploy. Lihat Penyiapan Agen. |
mcp_servers dikonfigurasi dan diautentikasi di satu tempat | Deklarasikan server pada Agen; berikan kredensial melalui Vault pada Sesi. |
permission_mode, can_use_tool | Per-alat permission_policy; merespons acara user.tool_confirmation untuk alat always_ask. |
curl -sS --fail-with-body "https://api.anthropic.com/v1/agents/$AGENT_ID?beta=true" \
-H "x-api-key: $ANTHROPIC_API_KEY" \
-H "anthropic-version: 2023-06-01" \
-H "anthropic-beta: managed-agents-2026-04-01" \
--json "$(jq -n --argjson version "$AGENT_VERSION" '{version: $version, model: "claude-sonnet-4-6"}')"