Loading...
    • 构建
    • 管理
    • 模型与定价
    • 客户端 SDK
    • API 参考
    Search...
    ⌘K
    管理
    Admin API 概览工作区数据驻留API 与数据保留
    监控
    Claude Code 分析 API用量与费用 API
    第三方平台
    Amazon BedrockMicrosoft FoundryVertex AI
    Console
    Log in
    Loading...
    Loading...
    Loading...
    Loading...
    Loading...
    Loading...
    Loading...
    Loading...
    Loading...
    Loading...
    Loading...
    Loading...
    Loading...
    Loading...
    Loading...
    Loading...

    Solutions

    • AI agents
    • Code modernization
    • Coding
    • Customer support
    • Education
    • Financial services
    • Government
    • Life sciences

    Partners

    • Amazon Bedrock
    • Google Cloud's Vertex AI

    Learn

    • Blog
    • Catalog
    • Courses
    • Use cases
    • Connectors
    • Customer stories
    • Engineering at Anthropic
    • Events
    • Powered by Claude
    • Service partners
    • Startups program

    Company

    • Anthropic
    • Careers
    • Economic Futures
    • Research
    • News
    • Responsible Scaling Policy
    • Security and compliance
    • Transparency

    Learn

    • Blog
    • Catalog
    • Courses
    • Use cases
    • Connectors
    • Customer stories
    • Engineering at Anthropic
    • Events
    • Powered by Claude
    • Service partners
    • Startups program

    Help and security

    • Availability
    • Status
    • Support
    • Discord

    Terms and policies

    • Privacy policy
    • Responsible disclosure policy
    • Terms of service: Commercial
    • Terms of service: Consumer
    • Usage policy
    管理

    迁移

    将在 Messages API 或 Claude Agent SDK 上构建的现有代理迁移到 Claude Managed Agents。

    Was this page helpful?

    • 从 Messages API 代理循环迁移
    • 从 Claude Agent SDK 迁移

    Claude Managed Agents 用托管基础设施替换了您手写的代理循环。本页介绍了从使用 Messages API 构建的自定义循环或从 Claude Agent SDK 迁移时的变化。

    所有 Managed Agents API 请求都需要 managed-agents-2026-04-01 beta 头。SDK 会自动设置 beta 头。

    从 Messages API 代理循环迁移

    如果您通过在 while 循环中调用 messages.create、自己执行工具调用并将结果附加到对话历史来构建代理,大部分代码都会消失。

    您停止管理的内容

    之前之后
    您维护对话历史数组并在每个回合中传回它。会话在服务器端存储历史。发送事件,接收事件。
    您解析 stop_reason: "tool_use",执行工具,并使用 tool_result 消息循环回。预构建的工具在容器内自动执行。您只需通过 agent.custom_tool_use 事件处理自定义工具。
    您为运行代理生成的代码配置自己的沙箱。会话容器处理代码执行、文件操作和 bash。
    您决定循环何时完成。当代理没有更多工作要做时,会话发出 session.status_idle。

    代码比较

    之前(Messages API 循环,简化版):

    之后(Claude Managed Agents):

    您仍然控制的内容

    • 系统提示和模型: 相同的字段,现在在代理定义上。
    • 自定义工具: 仍然使用 JSON Schema 声明。执行从内联处理移到响应 agent.custom_tool_use 事件。请参阅 会话事件流。
    • 上下文: 您仍然可以通过系统提示、文件资源 或 技能 注入上下文。

    从 Claude Agent SDK 迁移

    如果您使用 Claude Agent SDK 构建,您已经在使用代理、工具和会话作为概念。区别在于它们运行的位置:SDK 在您操作的进程中执行,而 Managed Agents 在 Anthropic 的基础设施中运行。大部分迁移是将 SDK 配置对象映射到其 API 端等效项。

    变化内容

    Agent SDKManaged 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 运行相同的工具。

    代码比较

    之前(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)

    之后(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":
                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在客户端计算回合。

    迁移清单

    1. 创建环境,具有您的代理需要的网络和运行时。
    2. 将您的系统提示和工具选择移植到 代理定义。
    3. 使用 sessions.create 和 sessions.stream 替换您的循环。
    4. 对于代理读取的任何本地文件,通过 Files API 上传它们并将其挂载为 resources。
    5. 对于任何自定义工具处理程序,将执行移到您的事件循环中,作为对 agent.custom_tool_use 事件的响应。
    6. 在将生产流量指向新流程之前,使用测试会话进行验证。

    在模型版本之间迁移

    发布新的 Claude 模型时,迁移 Claude Managed Agents 集成通常是一个字段的更改:更新 代理定义 上的 model,更改在您创建的下一个会话上生效。

    Messages API 迁移指南 中记录的大多数模型级行为变化不需要您采取行动:

    • 请求参数更改(max_tokens 默认值、thinking 配置)由 Claude Managed Agents 运行时处理。这些字段不在代理定义上公开。
    • 助手消息预填充在基于事件的会话模型中不存在,因此其在较新模型上的删除是无操作。
    • 工具参数 JSON 转义在您接收 agent.custom_tool_use 事件之前由运行时解析。您看到的是结构化数据,而不是原始字符串。

    Messages API 指南中的行为描述(模型的不同之处)仍然适用。迁移步骤(如何更改您的请求代码)则不适用。

    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
    cwd、add_dirs 指向本地路径上传或挂载 文件 作为会话资源。
    system_prompt 和 CLAUDE.md 层次结构代理上的单个 system 字符串。每次更新都会产生新的服务器端版本;将会话固定到特定版本以进行推广或回滚,无需部署。请参阅 代理设置。
    mcp_servers 在一个地方配置和认证在代理上声明服务器;通过会话上的 Vault 提供凭证。
    permission_mode、can_use_tool每个工具的 permission_policy;对 always_ask 工具的 user.tool_confirmation 事件做出响应。
    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"}')"