---
title: Claude Managed Agents 시작하기
url: https://platform.claude.com/docs/ko/managed-agents/quickstart
description: 첫 번째 자율 에이전트를 만들어 보세요.
featureMetadata:
  topic:
    title: Managed Agents
    url: https://platform.claude.com/docs/en/managed-agents/overview
  status: beta
  betaHeader: managed-agents-2026-04-01
---

이 가이드는 에이전트 생성, 환경 설정, 세션 시작, 에이전트 응답 스트리밍 과정을 안내합니다.

<Tip>
  **대화형 안내를 선호하시나요?** 최신 버전의 [Claude Code](https://claude.com/product/claude-code)에서 `/claude-api managed-agents-onboard`를 실행하면 안내에 따른 설정과 대화형 질의응답을 이용할 수 있습니다.
</Tip>

## 핵심 개념

| 개념              | 설명                                                                      |
| --------------- | ----------------------------------------------------------------------- |
| **Agent**       | 모델, 시스템 프롬프트, 도구, MCP 서버 및 스킬                                           |
| **Environment** | 세션이 실행되는 위치에 대한 구성: Anthropic이 관리하는 클라우드 샌드박스 또는 자체 인프라에서 직접 호스팅하는 샌드박스 |
| **Session**     | 환경 내에서 실행 중인 에이전트 인스턴스로, 특정 작업을 수행하고 출력을 생성합니다                          |
| **Events**      | 애플리케이션과 에이전트 간에 교환되는 메시지(사용자 턴, 도구 결과, 상태 업데이트)                         |

## 사전 요구 사항

* [Claude Console 계정](https://platform.claude.com)
* [API 키](https://platform.claude.com/settings/keys)

## CLI 설치

<Tabs>
  <Tab title="Homebrew (macOS)">
    ```bash
    brew install anthropics/tap/ant
    ```
  </Tab>

  <Tab title="curl (Linux/WSL)">
    Linux 환경에서는 릴리스 바이너리를 직접 다운로드하세요.

    ```bash
    VERSION=1.42.0
    OS=$(uname -s | tr '[:upper:]' '[:lower:]')
    case $(uname -m) in
      x86_64) ARCH=amd64 ;;
      aarch64) ARCH=arm64 ;;
    esac
    curl -fsSL "https://github.com/anthropics/anthropic-cli/releases/download/v${VERSION}/ant_${VERSION}_${OS}_${ARCH}.tar.gz" \
      | sudo tar -xz -C /usr/local/bin ant
    ```

    모든 릴리스는 [GitHub 릴리스 페이지](https://github.com/anthropics/anthropic-cli/releases)에서 확인할 수 있습니다.
  </Tab>

  <Tab title="Go">
    `go install`을 사용하여 소스에서 CLI를 설치할 수도 있습니다. Go 1.25 이상이 필요합니다.

    ```bash
    go install github.com/anthropics/anthropic-cli/cmd/ant@latest
    ```

    바이너리는 `$(go env GOPATH)/bin`에 설치됩니다. 아직 `PATH`에 추가되어 있지 않다면 추가하세요:

    ```bash
    export PATH="$PATH:$(go env GOPATH)/bin"
    ```
  </Tab>
</Tabs>

설치를 확인하세요:

```bash
ant --version
```

## SDK 설치

<Tabs>
  <Tab title="Python">
    ```bash
    pip install anthropic
    ```
  </Tab>

  <Tab title="TypeScript">
    ```bash
    npm install @anthropic-ai/sdk
    ```
  </Tab>

  <Tab title="Java">
    ```groovy Gradle
    implementation("com.anthropic:anthropic-java:2.73.0")
    ```
  </Tab>

  <Tab title="Go">
    ```bash
    go get github.com/anthropics/anthropic-sdk-go
    ```
  </Tab>

  <Tab title="C#">
    ```bash
    dotnet add package Anthropic
    ```
  </Tab>

  <Tab title="Ruby">
    ```bash
    bundle add anthropic
    ```
  </Tab>

  <Tab title="PHP">
    ```bash
    composer require "anthropic-ai/sdk" "guzzlehttp/guzzle:^7"
    ```
  </Tab>
</Tabs>

API 키를 환경 변수로 설정하세요:

```bash
export ANTHROPIC_API_KEY="your-api-key-here"
```

## 첫 번째 세션 만들기

<Steps>
  <Step title="에이전트 생성">
    모델, 시스템 프롬프트, 사용 가능한 도구를 정의하는 에이전트를 생성하세요.

    <CodeGroup defaultLanguage="CLI">
      <CodeGroupItem>
        ```bash cURL
        curl -sS --fail-with-body https://api.anthropic.com/v1/agents \
          -H "x-api-key: $ANTHROPIC_API_KEY" \
          -H "anthropic-version: 2023-06-01" \
          -H "anthropic-beta: managed-agents-2026-04-01" \
          -H "content-type: application/json" \
          -d '{
            "name": "Coding Assistant",
            "model": "claude-opus-5-5",
            "system": "You are a helpful coding assistant. Write clean, well-documented code.",
            "tools": [
              {"type": "agent_toolset_20260401"}
            ]
          }'
        ```

        반환된 `agent.id`를 저장하세요. 생성하는 모든 세션에서 이를 참조하게 됩니다.
      </CodeGroupItem>

      <CodeGroupItem>
        ```bash CLI
        ant apply coding-assistant.md
        ```

        <File filename="coding-assistant.md">
          ```markdown
          ---
          name: Coding Assistant
          model: claude-opus-5-5
          tools:
            - type: agent_toolset_20260401
          ---

          You are a helpful coding assistant. Write clean, well-documented code.
          ```
        </File>

        [`ant apply`](https://platform.claude.com/docs/ko/cli-sdks-libraries/cli/apply)는 에이전트의 ID를 출력하고 `claude-lock.json`에 기록합니다. 생성하는 모든 세션에서 이를 참조하게 됩니다.
      </CodeGroupItem>

      <CodeGroupItem>
        ```python Python
        from anthropic import Anthropic

        client = Anthropic()

        agent = client.beta.agents.create(
            name="Coding Assistant",
            model="claude-opus-5-5",
            system="You are a helpful coding assistant. Write clean, well-documented code.",
            tools=[
                {"type": "agent_toolset_20260401"},
            ],
        )

        print(f"Agent ID: {agent.id}, version: {agent.version}")
        ```

        반환된 `agent.id`를 저장하세요. 생성하는 모든 세션에서 이를 참조하게 됩니다.
      </CodeGroupItem>

      <CodeGroupItem>
        ```typescript TypeScript
        import Anthropic from "@anthropic-ai/sdk";

        const client = new Anthropic();

        const agent = await client.beta.agents.create({
          name: "Coding Assistant",
          model: "claude-opus-5-5",
          system: "You are a helpful coding assistant. Write clean, well-documented code.",
          tools: [
            { type: "agent_toolset_20260401" },
          ],
        });

        console.log(`Agent ID: ${agent.id}, version: ${agent.version}`);
        ```

        반환된 `agent.id`를 저장하세요. 생성하는 모든 세션에서 이를 참조하게 됩니다.
      </CodeGroupItem>

      <CodeGroupItem>
        ```csharp C#
        using Anthropic;
        using Anthropic.Models.Beta.Agents;
        using Anthropic.Models.Beta.Environments;
        using Anthropic.Models.Beta.Sessions;
        using Anthropic.Models.Beta.Sessions.Events;

        var client = new AnthropicClient();

        var agent = await client.Beta.Agents.Create(new()
        {
            Name = "Coding Assistant",
            Model = BetaManagedAgentsModel.ClaudeOpus5_5,
            System = "You are a helpful coding assistant. Write clean, well-documented code.",
            Tools =
            [
                new BetaManagedAgentsAgentToolset20260401Params
                {
                    Type = "agent_toolset_20260401",
                },
            ],
        });

        Console.WriteLine($"Agent ID: {agent.ID}, version: {agent.Version}");
        ```

        반환된 `agent.id`를 저장하세요. 생성하는 모든 세션에서 이를 참조하게 됩니다.
      </CodeGroupItem>

      <CodeGroupItem>
        ```go Go
        package main

        import (
        	"context"
        	"fmt"

        	"github.com/anthropics/anthropic-sdk-go"
        )

        func main() {
        	client := anthropic.NewClient()
        	ctx := context.Background()

        	agent, err := client.Beta.Agents.New(ctx, anthropic.BetaAgentNewParams{
        		Name: "Coding Assistant",
        		Model: anthropic.BetaManagedAgentsModelConfigParams{
        			ID: anthropic.BetaManagedAgentsModelClaudeOpus5_5,
        		},
        		System: anthropic.String("You are a helpful coding assistant. Write clean, well-documented code."),
        		Tools: []anthropic.BetaAgentNewParamsToolUnion{{
        			OfAgentToolset20260401: &anthropic.BetaManagedAgentsAgentToolset20260401Params{
        				Type: anthropic.BetaManagedAgentsAgentToolset20260401ParamsTypeAgentToolset20260401,
        			},
        		}},
        	})
        	if err != nil {
        		panic(err)
        	}

        	fmt.Printf("Agent ID: %s, version: %d\n", agent.ID, agent.Version)
        ```

        반환된 `agent.id`를 저장하세요. 생성하는 모든 세션에서 이를 참조하게 됩니다.
      </CodeGroupItem>

      <CodeGroupItem>
        ```java Java
        import com.anthropic.client.okhttp.AnthropicOkHttpClient;
        import com.anthropic.models.beta.agents.AgentCreateParams;
        import com.anthropic.models.beta.agents.BetaManagedAgentsAgentToolset20260401Params;
        import com.anthropic.models.beta.agents.BetaManagedAgentsModel;
        import com.anthropic.models.beta.environments.BetaCloudConfigParams;
        import com.anthropic.models.beta.environments.BetaLimitedNetworkParams;
        import com.anthropic.models.beta.environments.EnvironmentCreateParams;
        import com.anthropic.models.beta.sessions.SessionCreateParams;
        import com.anthropic.models.beta.sessions.events.BetaManagedAgentsStreamSessionEvents;
        import com.anthropic.models.beta.sessions.events.BetaManagedAgentsUserMessageEventParams;
        import com.anthropic.models.beta.sessions.events.EventSendParams;

        void main() {
            var client = AnthropicOkHttpClient.fromEnv();

            var agent = client.beta().agents().create(AgentCreateParams.builder()
                .name("Coding Assistant")
                .model(BetaManagedAgentsModel.CLAUDE_OPUS_5_5)
                .system("You are a helpful coding assistant. Write clean, well-documented code.")
                .addTool(BetaManagedAgentsAgentToolset20260401Params.builder()
                    .type(BetaManagedAgentsAgentToolset20260401Params.Type.AGENT_TOOLSET_20260401)
                    .build())
                .build());

            IO.println("Agent ID: " + agent.id() + ", version: " + agent.version());
        ```

        반환된 `agent.id`를 저장하세요. 생성하는 모든 세션에서 이를 참조하게 됩니다.
      </CodeGroupItem>

      <CodeGroupItem>
        ```php PHP
        use Anthropic\Client;

        $client = new Client();

        $agent = $client->beta->agents->create(
            name: 'Coding Assistant',
            model: 'claude-opus-5-5',
            system: 'You are a helpful coding assistant. Write clean, well-documented code.',
            tools: [
                ['type' => 'agent_toolset_20260401'],
            ],
        );

        echo "Agent ID: {$agent->id}, version: {$agent->version}\n";
        ```

        반환된 `agent.id`를 저장하세요. 생성하는 모든 세션에서 이를 참조하게 됩니다.
      </CodeGroupItem>

      <CodeGroupItem>
        ```ruby Ruby
        require "anthropic"

        client = Anthropic::Client.new

        agent = client.beta.agents.create(
          name: "Coding Assistant",
          model: "claude-opus-5-5",
          system_: "You are a helpful coding assistant. Write clean, well-documented code.",
          tools: [{type: "agent_toolset_20260401"}]
        )

        puts "Agent ID: #{agent.id}, version: #{agent.version}"
        ```

        반환된 `agent.id`를 저장하세요. 생성하는 모든 세션에서 이를 참조하게 됩니다.
      </CodeGroupItem>
    </CodeGroup>

    `agent_toolset_20260401` 도구 유형은 사전 구축된 에이전트 도구 전체(bash, 파일 작업, 웹 검색 등)를 활성화합니다. 전체 목록과 도구별 구성 옵션은 [도구](https://platform.claude.com/docs/ko/managed-agents/tools)를 참조하세요.
  </Step>

  <Step title="환경 생성">
    환경은 에이전트가 실행되는 "sandbox"(샌드박스)를 정의합니다. 이 환경은 패키지 관리자가 허용된 `limited` [네트워킹](https://platform.claude.com/docs/ko/managed-agents/environments#networking)을 사용하므로, 샌드박스에서 실행되는 코드가 공개 [패키지 레지스트리 및 코드 호스트](https://platform.claude.com/docs/ko/managed-agents/environments#package-manager-hosts)에 접근할 수 있습니다. 웹 검색과 웹 가져오기는 샌드박스 외부에서 실행되며, 이 빠른 시작에서는 필요하지 않습니다. `limited` 네트워킹에서는 [`allowed_hosts` (java, php: `allowedHosts`; csharp, go: `AllowedHosts`) 목록](https://platform.claude.com/docs/ko/managed-agents/environments#networking)이 이들에도 적용됩니다. 이 환경에는 나열된 호스트가 없으므로 웹 검색과 웹 가져오기는 이 환경에서 페이지나 검색 결과를 반환하지 않습니다. 직접 만드는 에이전트의 경우, 필요한 호스트를 `allowed_hosts` (java, php: `allowedHosts`; csharp, go: `AllowedHosts`)에 나열하세요.

    <CodeGroup defaultLanguage="CLI">
      <CodeGroupItem>
        ```bash cURL
        curl -sS --fail-with-body https://api.anthropic.com/v1/environments \
          -H "x-api-key: $ANTHROPIC_API_KEY" \
          -H "anthropic-version: 2023-06-01" \
          -H "anthropic-beta: managed-agents-2026-04-01" \
          -H "content-type: application/json" \
          -d '{
            "name": "quickstart-env",
            "config": {
              "type": "cloud",
              "networking": {"type": "limited", "allow_package_managers": true}
            }
          }'
        ```

        반환된 `environment.id`도 저장하세요.
      </CodeGroupItem>

      <CodeGroupItem>
        ```bash CLI
        ant apply environment.yaml
        ```

        <File filename="environment.yaml">
          ```yaml
          # yaml-language-server: $schema=https://platform.claude.com/schemas/ant/beta/environment.json
          name: quickstart-env
          config:
            type: cloud
            networking:
              type: limited
              allow_package_managers: true
          ```
        </File>

        [`ant apply`](https://platform.claude.com/docs/ko/cli-sdks-libraries/cli/apply)는 환경의 ID도 `claude-lock.json`에 기록합니다. 하나의 명령으로 에이전트와 환경을 함께 생성하려면 두 파일을 모두 전달하세요: `ant apply coding-assistant.md environment.yaml`.
      </CodeGroupItem>

      <CodeGroupItem>
        ```python Python
        environment = client.beta.environments.create(
            name="quickstart-env",
            config={
                "type": "cloud",
                "networking": {"type": "limited", "allow_package_managers": True},
            },
        )

        print(f"Environment ID: {environment.id}")
        ```

        반환된 `environment.id`도 저장하세요.
      </CodeGroupItem>

      <CodeGroupItem>
        ```typescript TypeScript
        const environment = await client.beta.environments.create({
          name: "quickstart-env",
          config: {
            type: "cloud",
            networking: { type: "limited", allow_package_managers: true },
          },
        });

        console.log(`Environment ID: ${environment.id}`);
        ```

        반환된 `environment.id`도 저장하세요.
      </CodeGroupItem>

      <CodeGroupItem>
        ```csharp C#
        var environment = await client.Beta.Environments.Create(new()
        {
            Name = "quickstart-env",
            Config = new BetaCloudConfigParams
            {
                Networking = new BetaLimitedNetworkParams { AllowPackageManagers = true },
            },
        });

        Console.WriteLine($"Environment ID: {environment.ID}");
        ```

        반환된 `environment.id`도 저장하세요.
      </CodeGroupItem>

      <CodeGroupItem>
        ```go Go
        environment, err := client.Beta.Environments.New(ctx, anthropic.BetaEnvironmentNewParams{
        	Name: "quickstart-env",
        	Config: anthropic.BetaEnvironmentNewParamsConfigUnion{
        		OfCloud: &anthropic.BetaCloudConfigParams{
        			Networking: anthropic.BetaCloudConfigParamsNetworkingUnion{
        				OfLimited: &anthropic.BetaLimitedNetworkParams{
        					AllowPackageManagers: anthropic.Bool(true),
        				},
        			},
        		},
        	},
        })
        if err != nil {
        	panic(err)
        }

        fmt.Printf("Environment ID: %s\n", environment.ID)
        ```

        반환된 `environment.id`도 저장하세요.
      </CodeGroupItem>

      <CodeGroupItem>
        ```java Java
        var environment = client.beta().environments().create(EnvironmentCreateParams.builder()
            .name("quickstart-env")
            .config(BetaCloudConfigParams.builder()
                .networking(BetaLimitedNetworkParams.builder()
                    .allowPackageManagers(true)
                    .build())
                .build())
            .build());

        IO.println("Environment ID: " + environment.id());
        ```

        반환된 `environment.id`도 저장하세요.
      </CodeGroupItem>

      <CodeGroupItem>
        ```php PHP
        $environment = $client->beta->environments->create(
            name: 'quickstart-env',
            config: [
                'type' => 'cloud',
                'networking' => ['type' => 'limited', 'allow_package_managers' => true],
            ],
        );

        echo "Environment ID: {$environment->id}\n";
        ```

        반환된 `environment.id`도 저장하세요.
      </CodeGroupItem>

      <CodeGroupItem>
        ```ruby Ruby
        environment = client.beta.environments.create(
          name: "quickstart-env",
          config: {type: "cloud", networking: {type: "limited", allow_package_managers: true}}
        )

        puts "Environment ID: #{environment.id}"
        ```

        반환된 `environment.id`도 저장하세요.
      </CodeGroupItem>
    </CodeGroup>

    <Tip>
      이 빠른 시작은 클라우드 환경을 사용합니다. 대신 

      [자체 호스팅 샌드박스](https://platform.claude.com/docs/ko/managed-agents/self-hosted-sandboxes)

      를 사용하여 자체 인프라에서 도구를 실행할지 결정하려면 

      [에이전트 환경 선택하기](https://platform.claude.com/docs/ko/managed-agents/choosing-an-environment)

      를 참조하세요.
    </Tip>
  </Step>

  <Step title="세션 시작">
    에이전트와 환경을 참조하는 세션을 생성하세요.

    <CodeGroup>
      ```bash cURL
      curl -sS --fail-with-body https://api.anthropic.com/v1/sessions \
        -H "x-api-key: $ANTHROPIC_API_KEY" \
        -H "anthropic-version: 2023-06-01" \
        -H "anthropic-beta: managed-agents-2026-04-01" \
        -H "content-type: application/json" \
        -d '{
          "agent": "'"$AGENT_ID"'",
          "environment_id": "'"$ENVIRONMENT_ID"'",
          "title": "Quickstart session"
        }'
      ```

      ```bash CLI
      ant beta:sessions create \
        --agent "$AGENT_ID" \
        --environment-id "$ENVIRONMENT_ID" \
        --title "Quickstart session"
      ```

      ```python Python
      session = client.beta.sessions.create(
          agent=agent.id,
          environment_id=environment.id,
          title="Quickstart session",
      )

      print(f"Session ID: {session.id}")
      ```

      ```typescript TypeScript
      const session = await client.beta.sessions.create({
        agent: agent.id,
        environment_id: environment.id,
        title: "Quickstart session",
      });

      console.log(`Session ID: ${session.id}`);
      ```

      ```csharp C#
      var session = await client.Beta.Sessions.Create(new()
      {
          Agent = agent.ID,
          EnvironmentID = environment.ID,
          Title = "Quickstart session",
      });

      Console.WriteLine($"Session ID: {session.ID}");
      ```

      ```go Go
      session, err := client.Beta.Sessions.New(ctx, anthropic.BetaSessionNewParams{
      	Agent:         anthropic.BetaSessionNewParamsAgentUnion{OfString: anthropic.String(agent.ID)},
      	EnvironmentID: environment.ID,
      	Title:         anthropic.String("Quickstart session"),
      })
      if err != nil {
      	panic(err)
      }

      fmt.Printf("Session ID: %s\n", session.ID)
      ```

      ```java Java
      var session = client.beta().sessions().create(SessionCreateParams.builder()
          .agent(agent.id())
          .environmentId(environment.id())
          .title("Quickstart session")
          .build());

      IO.println("Session ID: " + session.id());
      ```

      ```php PHP
      $session = $client->beta->sessions->create(
          agent: $agent->id,
          environmentID: $environment->id,
          title: 'Quickstart session',
      );

      echo "Session ID: {$session->id}\n";
      ```

      ```ruby Ruby
      session = client.beta.sessions.create(
        agent: agent.id,
        environment_id: environment.id,
        title: "Quickstart session"
      )

      puts "Session ID: #{session.id}"
      ```
    </CodeGroup>
  </Step>

  <Step title="메시지 전송 및 응답 스트리밍">
    스트림을 열고, 사용자 이벤트를 전송한 다음, 도착하는 이벤트를 처리하세요:

    <CodeGroup exclude="shell">
      <CodeGroupItem language="cURL">
        이 워크플로에는 단일 셸 명령보다 더 많은 로직이 필요합니다. 실행하려면 [Claude SDK](https://platform.claude.com/docs/ko/cli-sdks-libraries/overview)를 사용하세요.
      </CodeGroupItem>

      <CodeGroupItem language="CLI">
        이 워크플로에는 단일 셸 명령보다 더 많은 로직이 필요합니다. 실행하려면 [Claude SDK](https://platform.claude.com/docs/ko/cli-sdks-libraries/overview)를 사용하세요.
      </CodeGroupItem>

      ```python Python
      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": "Create a Python script that generates the first 20 Fibonacci numbers and saves them to fibonacci.txt",
                          },
                      ],
                  },
              ],
          )

          # 스트리밍 이벤트를 처리하세요
          for event in stream:
              match event.type:
                  case "agent.message":
                      for block in event.content:
                          if block.type == "text":
                              print(block.text, end="")
                  case "agent.tool_use":
                      print(f"\n[Using tool: {event.name}]")
                  case "session.status_idle":
                      print("\n\nAgent finished.")
                      break
      ```

      ```typescript TypeScript
      const stream = await client.beta.sessions.events.stream(session.id);

      // 스트림이 열린 후 사용자 메시지를 전송하세요
      await client.beta.sessions.events.send(session.id, {
        events: [
          {
            type: "user.message",
            content: [
              {
                type: "text",
                text: "Create a Python script that generates the first 20 Fibonacci numbers and saves them to fibonacci.txt",
              },
            ],
          },
        ],
      });

      // 스트리밍 이벤트를 처리하세요
      loop: for await (const event of stream) {
        switch (event.type) {
          case "agent.message":
            for (const block of event.content) {
              if (block.type === "text") {
                process.stdout.write(block.text);
              }
            }
            break;
          case "agent.tool_use":
            console.log(`\n[Using tool: ${event.name}]`);
            break;
          case "session.status_idle":
            console.log("\n\nAgent finished.");
            break loop;
        }
      }
      ```

      ```csharp C#
      var stream = client.Beta.Sessions.Events.StreamStreaming(session.ID);

      // 스트림이 열린 후 사용자 메시지를 전송합니다
      await client.Beta.Sessions.Events.Send(session.ID, new()
      {
          Events =
          [
              new BetaManagedAgentsUserMessageEventParams
              {
                  Type = "user.message",
                  Content =
                  [
                      new BetaManagedAgentsTextBlock
                      {
                          Type = "text",
                          Text = "Create a Python script that generates the first 20 Fibonacci numbers and saves them to fibonacci.txt",
                      },
                  ],
              },
          ],
      });

      // 스트리밍 이벤트를 처리합니다
      await foreach (var ev in stream)
      {
          if (ev.Value is BetaManagedAgentsAgentMessageEvent message)
          {
              foreach (var block in message.Content)
              {
                  if (block.Value is BetaManagedAgentsTextBlock textBlock)
                  {
                      Console.Write(textBlock.Text);
                  }
              }
          }
          else if (ev.Value is BetaManagedAgentsAgentToolUseEvent toolUse)
          {
              Console.WriteLine($"\n[Using tool: {toolUse.Name}]");
          }
          else if (ev.Value is BetaManagedAgentsSessionStatusIdleEvent)
          {
              Console.WriteLine("\n\nAgent finished.");
              break;
          }
      }
      ```

      ```go Go
      	stream := client.Beta.Sessions.Events.StreamEvents(ctx, session.ID, anthropic.BetaSessionEventStreamParams{})
      	defer stream.Close()

      	// 스트림이 열린 후 사용자 메시지를 전송합니다
      	_, err = client.Beta.Sessions.Events.Send(ctx, session.ID, anthropic.BetaSessionEventSendParams{
      		Events: []anthropic.BetaManagedAgentsEventParamsUnion{{
      			OfUserMessage: &anthropic.BetaManagedAgentsUserMessageEventParams{
      				Type: anthropic.BetaManagedAgentsUserMessageEventParamsTypeUserMessage,
      				Content: []anthropic.BetaManagedAgentsUserMessageEventParamsContentUnion{{
      					OfText: &anthropic.BetaManagedAgentsTextBlockParam{
      						Type: anthropic.BetaManagedAgentsTextBlockTypeText,
      						Text: "Create a Python script that generates the first 20 Fibonacci numbers and saves them to fibonacci.txt",
      					},
      				}},
      			},
      		}},
      	})
      	if err != nil {
      		panic(err)
      	}

      	// 스트리밍 이벤트를 처리합니다
      loop:
      	for stream.Next() {
      		switch event := stream.Current().AsAny().(type) {
      		case anthropic.BetaManagedAgentsAgentMessageEvent:
      			for _, block := range event.Content {
      				if block.Type == "text" {
      					fmt.Print(block.Text)
      				}
      			}
      		case anthropic.BetaManagedAgentsAgentToolUseEvent:
      			fmt.Printf("\n[Using tool: %s]\n", event.Name)
      		case anthropic.BetaManagedAgentsSessionStatusIdleEvent:
      			fmt.Print("\n\nAgent finished.\n")
      			break loop
      		}
      	}
      	if err := stream.Err(); err != nil {
      		panic(err)
      	}
      ```

      ```java Java
      try (var stream = client.beta().sessions().events().streamStreaming(session.id())) {
          // 스트림이 열린 후 사용자 메시지를 전송합니다
          client.beta().sessions().events().send(session.id(), EventSendParams.builder()
              .addEvent(BetaManagedAgentsUserMessageEventParams.builder()
                  .type(BetaManagedAgentsUserMessageEventParams.Type.USER_MESSAGE)
                  .addTextContent("Create a Python script that generates the first 20 Fibonacci numbers and saves them to fibonacci.txt")
                  .build())
              .build());

          // 스트리밍 이벤트를 처리합니다
          loop:
          for (var event : (Iterable<BetaManagedAgentsStreamSessionEvents>) stream.stream()::iterator) {
              switch (event.type().value()) {
                  case AGENT_MESSAGE -> event.asAgentMessage().content().forEach(block -> block.text().ifPresent(textBlock -> IO.print(textBlock.text())));
                  case AGENT_TOOL_USE -> IO.println("\n[Using tool: " + event.asAgentToolUse().name() + "]");
                  case SESSION_STATUS_IDLE -> {
                      IO.println("\n\nAgent finished.");
                      break loop;
                  }
              }
          }
      }
      ```

      ```php PHP
      $stream = $client->beta->sessions->events->streamStream($session->id);

      // 스트림이 열린 후 사용자 메시지를 전송합니다
      $client->beta->sessions->events->send(
          $session->id,
          events: [
              [
                  'type' => 'user.message',
                  'content' => [
                      ['type' => 'text', 'text' => 'Create a Python script that generates the first 20 Fibonacci numbers and saves them to fibonacci.txt'],
                  ],
              ],
          ],
      );

      // 스트리밍 이벤트를 처리합니다
      foreach ($stream as $event) {
          match (true) {
              $event instanceof \Anthropic\Beta\Sessions\Events\ManagedAgentsAgentMessageEvent => array_walk(
                  $event->content,
                  static fn ($block) => $block instanceof \Anthropic\Beta\Sessions\Events\ManagedAgentsTextBlock ? print($block->text) : null,
              ),
              $event instanceof \Anthropic\Beta\Sessions\Events\ManagedAgentsAgentToolUseEvent => print("\n[Using tool: {$event->name}]\n"),
              $event instanceof \Anthropic\Beta\Sessions\Events\ManagedAgentsSessionStatusIdleEvent => print("\n\nAgent finished.\n"),
              default => null,
          };
          if ($event->type === 'session.status_idle') {
              break;
          }
      }
      ```

      ```ruby Ruby
      stream = client.beta.sessions.events.stream_events(session.id)

      # 스트림이 열린 후 사용자 메시지를 전송합니다
      client.beta.sessions.events.send_(
        session.id,
        events: [{
          type: "user.message",
          content: [{type: "text", text: "Create a Python script that generates the first 20 Fibonacci numbers and saves them to fibonacci.txt"}]
        }]
      )

      # 스트리밍 이벤트를 처리합니다
      stream.each do |event|
        case event
        when Anthropic::Beta::Sessions::BetaManagedAgentsAgentMessageEvent
          event.content.each { print it.text if it.is_a?(Anthropic::Beta::Sessions::BetaManagedAgentsTextBlock) }
        when Anthropic::Beta::Sessions::BetaManagedAgentsAgentToolUseEvent
          puts "\n[Using tool: #{event.name}]"
        when Anthropic::Beta::Sessions::BetaManagedAgentsSessionStatusIdleEvent
          puts "\n\nAgent finished."
          break
        else
          # 다른 이벤트 유형은 무시합니다
        end
      end
      ```
    </CodeGroup>

    에이전트는 Python 스크립트를 작성하고, 샌드박스에서 실행한 다음, 출력 파일이 생성되었는지 확인합니다. 출력은 다음과 비슷합니다:

    ```text wrap
    I'll create a Python script that generates the first 20 Fibonacci numbers and saves them to a file.
    [Using tool: write]
    [Using tool: bash]
    The script ran successfully. Let me verify the output file.
    [Using tool: bash]
    fibonacci.txt contains the first 20 Fibonacci numbers (0 through 4181).

    Agent finished.
    ```
  </Step>
</Steps>

## 내부 동작

사용자 이벤트를 전송하면 Claude Managed Agents는 다음을 수행합니다:

1. **샌드박스 프로비저닝:** 환경 구성에 따라 샌드박스가 구축되는 방식이 결정됩니다.
2. **에이전트 루프 실행:** Claude가 메시지를 기반으로 사용할 도구를 결정합니다.
3. **도구 실행:** 파일 쓰기, bash 명령 및 기타 도구 호출이 샌드박스 내부에서 실행됩니다.
4. **이벤트 스트리밍:** 에이전트가 작업하는 동안 실시간 업데이트를 받습니다.
5. **유휴 상태 전환:** 에이전트는 더 이상 할 일이 없으면 `session.status_idle` 이벤트를 발생시킵니다.

## 완전한 앱 구축하기

다음 각 퀵스타트는 Claude Managed Agents를 인기 있는 채팅 프레임워크와 결합하여 완전하고 실행 가능한 애플리케이션을 만듭니다. 각 예제에서 프레임워크는 채팅 화면을 렌더링하고, 관리형 세션은 서버 측에서 에이전트 루프를 실행합니다. 세션은 대화 기록을 보관하고, 샌드박스에서 도구를 실행하며, 프런트엔드가 렌더링하는 이벤트를 스트리밍합니다.

<CardGroup cols={3}>
  <Card title="Chat SDK" icon="github-logo" href="https://github.com/anthropics/claude-quickstarts/tree/main/managed-agents/chat-sdk">
    Vercel의 Chat SDK로 구축한 브라우저 채팅 속 리서치 애널리스트입니다. 각 대화는 하나의 영구 세션으로, 라이브 피드가 도구 호출을 보여주는 동안 응답을 스트리밍합니다. Chat SDK 어댑터를 교체하면 동일한 핸들러를 Slack, Teams, Discord 또는 WhatsApp으로 옮길 수 있습니다.
  </Card>

  <Card title="assistant-ui" icon="github-logo" href="https://github.com/anthropics/claude-quickstarts/tree/main/managed-agents/assistant-ui">
    assistant-ui 프리미티브로 구축한 채팅 속 스프레드시트 애널리스트입니다. 세션이 스레드 목록이 되고, 하나의 리듀서가 세션 이벤트 로그를 메시지와 도구 카드로 변환하며, 각 bash 명령은 실행 전에 인라인 허용/거부 게이트를 렌더링합니다.
  </Card>

  <Card title="CopilotKit (AG-UI)" icon="github-logo" href="https://github.com/anthropics/claude-quickstarts/tree/main/managed-agents/copilot-kit-ag-ui">
    CopilotKit 채팅 속 개인 재무 어시스턴트입니다. Claude Managed Agents용 AG-UI 어댑터가 각 채팅 스레드를 관리형 세션에 매핑하고 응답을 토큰 단위로 스트리밍하며, 커스텀 도구가 대화 내에 대화형 차트를 인라인으로 렌더링합니다.
  </Card>
</CardGroup>

## 다음 단계

<CardGroup cols={2}>
  <Card title="에이전트 정의하기" icon="brain" href="https://platform.claude.com/docs/ko/managed-agents/agent-setup">
    재사용 가능하고 버전 관리되는 에이전트 구성 만들기
  </Card>

  <Card title="환경 구성하기" icon="settings" href="https://platform.claude.com/docs/ko/managed-agents/environments">
    네트워킹 및 샌드박스 설정 사용자 지정
  </Card>

  <Card title="에이전트 도구" icon="tool" href="https://platform.claude.com/docs/ko/managed-agents/tools">
    에이전트에 특정 도구 활성화
  </Card>

  <Card title="세션 이벤트 스트림" icon="lightning" href="https://platform.claude.com/docs/ko/managed-agents/events-and-streaming">
    이벤트 처리 및 실행 중 에이전트 조정
  </Card>

  <Card title="예약 배포" icon="arrows-clockwise" href="https://platform.claude.com/docs/ko/managed-agents/scheduled-deployments">
    반복 cron 일정에 따라 에이전트 실행
  </Card>

  <Card title="지식 위키 퀵스타트" icon="github-logo" href="https://github.com/anthropics/claude-quickstarts/tree/main/managed-agents/knowledge-wiki">
    문서 코퍼스를 한 번 지식 위키로 정제한 다음, 반복되는 질문에 훨씬 적은 비용으로 답변하기
  </Card>
</CardGroup>
