Claude Managed Agents menggantikan loop agen yang Anda tulis sendiri dengan infrastruktur terkelola. Halaman ini membahas apa saja yang berubah ketika Anda bermigrasi dari loop kustom yang dibangun di atas Messages API atau dari Claude Agent SDK.
Semua permintaan Managed Agents API memerlukan beta header managed-agents-2026-04-01. SDK menetapkan beta header tersebut secara otomatis.
Jika Anda membangun agen dengan memanggil messages.create dalam loop while, mengeksekusi pemanggilan alat sendiri, dan menambahkan hasilnya ke riwayat percakapan, sebagian besar kode tersebut tidak lagi diperlukan.
| Sebelum | Sesudah |
|---|---|
| Anda memelihara array riwayat percakapan dan mengirimkannya kembali pada setiap giliran. | Sesi menyimpan riwayat di sisi server. Kirim event, terima event. |
Anda mengiterasi blok konten tool_use, menjalankan setiap alat, dan mengulang kembali dengan pesan tool_result. | Alat bawaan berjalan di dalam sandbox secara otomatis. Anda hanya menangani alat kustom melalui event agent.custom_tool_use. |
| Anda menyediakan sandbox sendiri untuk menjalankan kode yang dihasilkan agen. | Sandbox sesi menangani eksekusi kode, operasi file, dan bash. |
| Anda memutuskan kapan loop selesai. | Sesi mengeluarkan session.status_idle ketika agen tidak memiliki hal lain untuk dilakukan. |
Sebelum (loop Messages API, disederhanakan):
messages = [{"role": "user", "content": task}]
while True:
response = client.messages.create(
model="claude-opus-4-8",
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,
}
],
}
)Sesudah (Claude Managed Agents):
agent = client.beta.agents.create(
name="Task Runner",
model="claude-opus-4-8",
tools=[{"type": "agent_toolset_20260401"}],
)
session = client.beta.sessions.create(
agent={"type": "agent", "id": agent.id, "version": agent.version},
environment_id=environment.id,
)
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": task}]}],
)
for event in stream:
if event.type == "session.status_idle":
breakagent.custom_tool_use. Lihat Stream event 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 dieksekusi dalam proses yang Anda operasikan, sedangkan Managed Agents berjalan di infrastruktur Anthropic. Sebagian besar migrasi adalah memetakan objek konfigurasi SDK ke padanannya di sisi API.
| Agent SDK | Managed Agents |
|---|---|
ClaudeAgentOptions(...) dibuat per eksekusi | client.beta.agents.create(...) sekali; Agen disimpan dan diberi versi di sisi server. Lihat Penyiapan agen. |
async with ClaudeSDKClient(...) atau query(...) | client.beta.sessions.create(...) lalu kirim dan terima event. |
Fungsi dengan dekorator @tool yang di-dispatch secara otomatis oleh SDK | Deklarasikan sebagai {"type": "custom", ...} pada Agen; klien Anda menangani event agent.custom_tool_use dan membalas dengan user.custom_tool_result. Lihat Alat. |
| Alat bawaan berjalan dalam proses Anda terhadap filesystem Anda | {"type": "agent_toolset_20260401"} menjalankan alat yang sama di dalam sandbox sesi terhadap /workspace. |
cwd, add_dirs menunjuk ke path lokal | Unggah atau mount file sebagai resource sesi. |
system_prompt dan hierarki CLAUDE.md | Satu string system pada Agen. Setiap pembaruan menghasilkan versi baru di sisi server; pin sesi ke versi tertentu untuk mempromosikan atau melakukan rollback tanpa deploy. Lihat Penyiapan agen. |
mcp_servers dikonfigurasi dan diautentikasi di satu tempat | Deklarasikan server pada Agen; sediakan kredensial melalui Vault pada Sesi. |
permission_mode, can_use_tool | permission_policy per alat; kirim event user.tool_confirmation untuk alat always_ask. |
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-opus-4-8",
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-opus-4-8",
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(block.text for block in ev.content if block.type == "text"))
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
and ev.stop_reason.type == "end_turn"
):
breakAgen dan Environment dibuat sekali dan digunakan kembali di seluruh sesi. Fungsi alat masih berjalan dalam proses Anda; perbedaannya adalah Anda membaca event agent.custom_tool_use dan mengirim hasilnya secara eksplisit alih-alih SDK yang men-dispatch-nya untuk Anda.
Konsekuensi dari Anthropic yang menjalankan loop agen adalah beberapa hal yang sebelumnya ditangani SDK secara otomatis kini menjadi tanggung jawab klien Anda.
| Fitur SDK | Pendekatan Managed Agents |
|---|---|
| Plan mode | Jalankan sesi khusus perencanaan terlebih dahulu, lalu sesi kedua untuk menjalankan rencana tersebut. |
| Output styles, slash commands | Terapkan di klien Anda sebelum mengirim user.message atau setelah menerima agent.message. |
Hook PreToolUse / PostToolUse | Klien Anda sudah melihat setiap event agent.custom_tool_use sebelum merespons; letakkan logikanya di sana. Untuk alat bawaan, gunakan permission_policy: always_ask. |
max_turns | Hitung giliran di sisi klien. |
sessions.create dan sessions.events.stream.resources.agent.custom_tool_use.Ketika model Claude baru dirilis, memigrasikan integrasi Claude Managed Agents biasanya hanya perubahan satu field: perbarui model pada definisi agen Anda dan perubahan tersebut berlaku pada sesi berikutnya yang Anda buat.
ant beta:agents update \
--agent-id "$AGENT_ID" \
--version "$AGENT_VERSION" \
--model claude-opus-4-8Sebagian besar perubahan perilaku tingkat model yang didokumentasikan dalam panduan migrasi Messages API tidak memerlukan tindakan dari sisi Anda:
max_tokens, konfigurasi thinking) ditangani oleh runtime Claude Managed Agents. Field 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 berlaku.
Was this page helpful?