Claude Managed Agents заменяет ваш написанный вручную цикл агента управляемой инфраструктурой. На этой странице описано, что меняется при миграции с пользовательского цикла, построенного на Messages API, или с Claude Agent SDK.
Все запросы к Managed Agents API требуют бета-заголовка managed-agents-2026-04-01. SDK устанавливает бета-заголовок автоматически.
Если вы создали агента, вызывая messages.create в цикле while, самостоятельно выполняя вызовы инструментов и добавляя результаты в историю разговора, большая часть этого кода больше не нужна.
| До | После |
|---|---|
| Вы поддерживаете массив истории разговора и передаёте его обратно на каждом шаге. | Сессия хранит историю на стороне сервера. Отправляйте события, получайте события. |
Вы перебираете блоки содержимого tool_use, запускаете каждый инструмент и возвращаетесь в цикл с сообщениями tool_result. | Встроенные инструменты автоматически выполняются внутри песочницы. Вы обрабатываете только пользовательские инструменты через события agent.custom_tool_use. |
| Вы предоставляете собственную песочницу для выполнения кода, сгенерированного агентом. | Песочница сессии обрабатывает выполнение кода, файловые операции и bash. |
| Вы решаете, когда цикл завершён. | Сессия генерирует session.status_idle, когда агенту больше нечего делать. |
До (цикл Messages API, упрощённый):
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,
}
],
}
)После (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. См. Поток событий сессии.Если вы разрабатывали с использованием Claude Agent SDK, вы уже работаете с агентами, инструментами и сессиями как с концепциями. Разница в том, где они выполняются: SDK работает в процессе, которым управляете вы, тогда как Managed Agents работает в инфраструктуре Anthropic. Большая часть миграции сводится к сопоставлению объектов конфигурации SDK с их эквивалентами на стороне API.
| Agent SDK | Managed Agents |
|---|---|
ClaudeAgentOptions(...) создаётся при каждом запуске | client.beta.agents.create(...) один раз; агент сохраняется и версионируется на стороне сервера. См. Настройка агента. |
async with ClaudeSDKClient(...) или query(...) | client.beta.sessions.create(...), затем отправка и получение событий. |
Функции с декоратором @tool, автоматически диспетчеризуемые SDK | Объявляются как {"type": "custom", ...} в агенте; ваш клиент обрабатывает события agent.custom_tool_use и отвечает user.custom_tool_result. См. Инструменты. |
| Встроенные инструменты выполняются в вашем процессе с вашей файловой системой | {"type": "agent_toolset_20260401"} запускает те же инструменты внутри песочницы сессии с /workspace. |
cwd, add_dirs указывают на локальные пути | Загружайте или монтируйте файлы как ресурсы сессии. |
system_prompt и иерархия CLAUDE.md | Единая строка system в агенте. Каждое обновление создаёт новую версию на стороне сервера; закрепляйте сессии за конкретной версией, чтобы продвигать или откатывать изменения без развёртывания. См. Настройка агента. |
mcp_servers настраиваются и аутентифицируются в одном месте | Объявляйте серверы в агенте; предоставляйте учётные данные через Vault в сессии. |
permission_mode, can_use_tool | permission_policy для каждого инструмента; отправляйте события user.tool_confirmation для инструментов с always_ask. |
До (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)После (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"
):
breakАгент и окружение создаются один раз и повторно используются в разных сессиях. Функция инструмента по-прежнему выполняется в вашем процессе; разница в том, что вы читаете событие agent.custom_tool_use и явно отправляете результат, вместо того чтобы SDK делал это за вас.
Компромисс за то, что Anthropic выполняет цикл агента, состоит в том, что несколько вещей, которые SDK обрабатывал автоматически, становятся ответственностью вашего клиента.
| Функция SDK | Подход Managed Agents |
|---|---|
| Режим планирования | Сначала запустите сессию только для планирования, затем вторую сессию для выполнения плана. |
| Стили вывода, слэш-команды | Применяйте в вашем клиенте перед отправкой user.message или после получения agent.message. |
Хуки PreToolUse / PostToolUse | Ваш клиент уже видит каждое событие agent.custom_tool_use перед ответом; разместите логику там. Для встроенных инструментов используйте permission_policy: always_ask. |
max_turns | Считайте шаги на стороне клиента. |
sessions.create и sessions.events.stream.resources.agent.custom_tool_use.Когда выпускается новая модель Claude, миграция интеграции Claude Managed Agents обычно сводится к изменению одного поля: обновите model в вашем определении агента, и изменение вступит в силу при следующей создаваемой вами сессии.
ant beta:agents update \
--agent-id "$AGENT_ID" \
--version "$AGENT_VERSION" \
--model claude-opus-4-8Большинство изменений поведения на уровне модели, задокументированных в руководстве по миграции Messages API, не требуют действий с вашей стороны:
max_tokens, конфигурация thinking) обрабатываются средой выполнения Claude Managed Agents. Эти поля не отображаются в определении агента.agent.custom_tool_use. Вы видите структурированные данные, а не необработанные строки.Описания поведения в руководстве по Messages API (что модель делает иначе) по-прежнему применимы. Шаги миграции (как изменить код вашего запроса) — нет.
Was this page helpful?