세션 시작하기

세션 시작하기 (Start a session)

세션은 환경 안의 에이전트 인스턴스예요. 각 세션은 에이전트환경(둘 다 별도로 생성)을 참조하고, 여러 상호작용에 걸쳐 대화 기록을 유지해요. 세션은 두 단계 수명주기를 따라요: 먼저 세션을 만들고, 그다음 사용자 이벤트를 보내 작업을 시작하죠. initial_events로 두 단계를 한 번의 호출로 합칠 수도 있어요.

출처: 문서

본문

세션은 환경 내의 에이전트 인스턴스예요. 각 세션은 에이전트환경(둘 다 별도로 생성됨)을 참조하고, 여러 상호작용에 걸쳐 대화 기록을 유지해요. 세션은 두 단계 수명주기를 따라요: 먼저 세션을 만들고, 그다음 사용자 이벤트를 보내 작업을 시작하세요. initial_events로 두 단계를 한 번의 호출로 합칠 수도 있어요.

Creating a session

세션에는 agent ID와 environment ID가 필요해요. 에이전트는 버전이 관리되는 리소스예요. agent ID를 문자열로 전달하면 최신 에이전트 버전으로 세션이 생성돼요.

```bash cURL curl -fsSL https://api.anthropic.com/v1/sessions \ -H "x-api-key: $ANTHR...KEY" \ -H "anthropic-version: 2023-06-01" \ -H "anthropic-beta: managed-agents-2026-04-01" \ -H "content-type: application/json" \ -d @- <ant beta:sessions create \ --agent "$AGENT_ID" \ --environment-id "$ENVIRONMENT_ID"
session = client.beta.sessions.create(
    agent=agent.id,
    environment_id=environment.id,
)
const session = await client.beta.sessions.create({
  agent: agent.id,
  environment_id: environment.id
});
var session = await client.Beta.Sessions.Create(new()
{
    Agent = agent.ID,
    EnvironmentID = environment.ID,
});
session, err := client.Beta.Sessions.New(ctx, anthropic.BetaSessionNewParams{
	Agent: anthropic.BetaSessionNewParamsAgentUnion{
		OfString: anthropic.String(agent.ID),
	},
	EnvironmentID: environment.ID,
})
if err != nil {
	panic(err)
}
var session = client.beta().sessions().create(SessionCreateParams.builder()
    .agent(agent.id())
    .environmentId(environment.id())
    .build());
$session = $client->beta->sessions->create(
    agent: $agent->id,
    environmentID: $environment->id,
);
session = client.beta.sessions.create(
  agent: agent.id,
  environment_id: environment.id
)

세션을 특정 에이전트 버전에 고정하려면 객체를 전달하세요. 이렇게 하면 정확히 어떤 버전이 실행될지 제어하고 새 버전의 배포를 독립적으로 단계화할 수 있어요.

```bash cURL curl -fsSL https://api.anthropic.com/v1/sessions \ -H "x-api-key: $ANTHR...KEY" \ -H "anthropic-version: 2023-06-01" \ -H "anthropic-beta: managed-agents-2026-04-01" \ -H "content-type: application/json" \ -d @- <ant beta:sessions create <<YAML agent: type: agent id: $AGENT_ID version: 1 environment_id: $ENVIRONMENT_ID YAML
pinned_session = client.beta.sessions.create(
    agent={"type": "agent", "id": agent.id, "version": 1},
    environment_id=environment.id,
)
const pinnedSession = await client.beta.sessions.create({
  agent: { type: "agent", id: agent.id, version: 1 },
  environment_id: environment.id
});
var pinnedSession = await client.Beta.Sessions.Create(new()
{
    Agent = new BetaManagedAgentsAgentParams
    {
        Type = BetaManagedAgentsAgentParamsType.Agent,
        ID = agent.ID,
        Version = 1,
    },
    EnvironmentID = environment.ID,
});
pinnedSession, err := client.Beta.Sessions.New(ctx, anthropic.BetaSessionNewParams{
	Agent: anthropic.BetaSessionNewParamsAgentUnion{
		OfBetaManagedAgentsAgents: &anthropic.BetaManagedAgentsAgentParams{
			Type:    anthropic.BetaManagedAgentsAgentParamsTypeAgent,
			ID:      agent.ID,
			Version: anthropic.Int(1),
		},
	},
	EnvironmentID: environment.ID,
})
if err != nil {
	panic(err)
}
var pinnedSession = client.beta().sessions().create(SessionCreateParams.builder()
    .agent(BetaManagedAgentsAgentParams.builder()
        .type(BetaManagedAgentsAgentParams.Type.AGENT)
        .id(agent.id())
        .version(1)
        .build())
    .environmentId(environment.id())
    .build());
$pinnedSession = $client->beta->sessions->create(
    agent: ['type' => 'agent', 'id' => $agent->id, 'version' => 1],
    environmentID: $environment->id,
);
pinned_session = client.beta.sessions.create(
  agent: {type: :agent, id: agent.id, version: 1},
  environment_id: environment.id
)

Seed the session with initial events

세션을 만들고 작업을 시작하는 것을 한 번의 호출로 할 수 있어요. initial_events는 생성 시 세션에 보낼 초기 이벤트의 선택적 배열이며, 순서대로 처리돼요. user.messageuser.define_outcome 이벤트를 지원하고, 최대 50개까지 받아요. 비어 있지 않은 목록은 같은 호출에서 에이전트 루프를 시작해요: 세션은 추가 요청 없이 곧바로 running 상태로 생성됩니다.

다음 예시는 initial_events에 단일 user.message를 넣어 세션을 만들어요:

```bash cURL seeded_session=$(curl -fsSL https://api.anthropic.com/v1/sessions \ -H "x-api-key: $ANTHR...KEY" \ -H "anthropic-version: 2023-06-01" \ -H "anthropic-beta: managed-agents-2026-04-01" \ -H "content-type: application/json" \ -d @- <initial_events aren't echoed on the create response; list the session's

events to see the seeded message.

seeded_events=$(curl -fsSL
"https://api.anthropic.com/v1/sessions/$SEEDED_SESSION_ID/events"
-H "x-api-key: $ANTHR...KEY"
-H "anthropic-version: 2023-06-01"
-H "anthropic-beta: managed-agents-2026-04-01") echo "Seeded event: $(jq -r
'.data[] | select(.type == "user.message") | .content[0].text' <<< "$seeded_events")"


```bash CLI
SEEDED_SESSION_ID=$(ant beta:sessions create \
  --transform id --raw-output <<YAML
agent: $AGENT_ID
environment_id: $ENVIRONMENT_ID
initial_events:
  - type: user.message
    content:
      - type: text
        text: List the files in the working directory.
YAML
)

# initial_events aren't echoed on the create response; list the session's
# events to see the seeded message.
echo "Seeded event: $(ant beta:sessions:events list \
  --session-id "$SEEDED_SESSION_ID" \
  --format raw \
  --transform 'data.#(type=="user.message").content.0.text' --raw-output)"
seeded_session = client.beta.sessions.create(
    agent=agent.id,
    environment_id=environment.id,
    initial_events=[
        {
            "type": "user.message",
            "content": [
                {"type": "text", "text": "List the files in the working directory."}
            ],
        },
    ],
)
# initial_events are not echoed on the create response; read them back
# from the session's event list.
for event in client.beta.sessions.events.list(seeded_session.id):
    if event.type == "user.message":
        for block in event.content:
            if block.type == "text":
                print(f"Seeded event: {block.text}")
const seededSession = await client.beta.sessions.create({
  agent: agent.id,
  environment_id: environment.id,
  initial_events: [
    {
      type: "user.message",
      content: [{ type: "text", text: "List the files in the working directory." }]
    }
  ]
});

// initial_events are not echoed on the create response; list the session's
// events to read the seeded message back.
for await (const event of client.beta.sessions.events.list(seededSession.id)) {
  if (event.type === "user.message") {
    for (const block of event.content) {
      if (block.type === "text") {
        console.log(`Seeded event: ${block.text}`);
      }
    }
  }
}
var seededSession = await client.Beta.Sessions.Create(new()
{
    Agent = agent.ID,
    EnvironmentID = environment.ID,
    InitialEvents =
    [
        new BetaManagedAgentsUserMessageEventParams
        {
            Type = BetaManagedAgentsUserMessageEventParamsType.UserMessage,
            Content =
            [
                new BetaManagedAgentsTextBlock
                {
                    Type = BetaManagedAgentsTextBlockType.Text,
                    Text = "List the files in the working directory.",
                },
            ],
        },
    ],
});
// initial_events are not echoed on the create response; read them back
// from the session's event list.
var seededEvents = await client.Beta.Sessions.Events.List(seededSession.ID);
await foreach (var sessionEvent in seededEvents.Paginate())
{
    if (sessionEvent.TryPickUserMessage(out var userMessage))
    {
        foreach (var contentBlock in userMessage.Content)
        {
            if (contentBlock.TryPickBetaManagedAgentsTextBlock(out var textBlock))
            {
                Console.WriteLine($"Seeded event: {textBlock.Text}");
            }
        }
    }
}
seededSession, err := client.Beta.Sessions.New(ctx, anthropic.BetaSessionNewParams{
	Agent: anthropic.BetaSessionNewParamsAgentUnion{
		OfString: anthropic.String(agent.ID),
	},
	EnvironmentID: environment.ID,
	InitialEvents: []anthropic.BetaSessionNewParamsInitialEventUnion{{
		OfUserMessage: &anthropic.BetaManagedAgentsUserMessageEventParams{
			Type: anthropic.BetaManagedAgentsUserMessageEventParamsTypeUserMessage,
			Content: []anthropic.BetaManagedAgentsUserMessageEventParamsContentUnion{{
				OfText: &anthropic.BetaManagedAgentsTextBlockParam{
					Type: anthropic.BetaManagedAgentsTextBlockTypeText,
					Text: "List the files in the working directory.",
				},
			}},
		},
	}},
})
if err != nil {
	panic(err)
}
// initial_events are not echoed on the create response, so list the
// session's events to read the seeded user.message back.
seededEvents, err := client.Beta.Sessions.Events.List(ctx, seededSession.ID, anthropic.BetaSessionEventListParams{})
if err != nil {
	panic(err)
}
for _, event := range seededEvents.Data {
	if event.Type != "user.message" {
		continue
	}
	for _, contentBlock := range event.AsUserMessage().Content {
		if contentBlock.Type == "text" {
			fmt.Printf("Seeded event: %s\n", contentBlock.AsText().Text)
		}
	}
}
var seededSession = client.beta().sessions().create(SessionCreateParams.builder()
    .agent(agent.id())
    .environmentId(environment.id())
    .addInitialEvent(BetaManagedAgentsUserMessageEventParams.builder()
        .type(BetaManagedAgentsUserMessageEventParams.Type.USER_MESSAGE)
        .addTextContent("List the files in the working directory.")
        .build())
    .build());
// initial_events are not echoed on the create response; list the
// session's events to read the seeded user.message back.
for (var event : client.beta().sessions().events().list(seededSession.id()).autoPager()) {
    if (event.isUserMessage()) {
        for (var contentBlock : event.asUserMessage().content()) {
            if (contentBlock.isText()) {
                IO.println("Seeded event: " + contentBlock.asText().text());
            }
        }
    }
}
$seededSession = $client->beta->sessions->create(
    agent: $agent->id,
    environmentID: $environment->id,
    initialEvents: [
        [
            'type' => 'user.message',
            'content' => [['type' => 'text', 'text' => 'List the files in the working directory.']],
        ],
    ],
);

// initial_events are not echoed on the create response; read them back
// from the session's event list.
$seededEvents = $client->beta->sessions->events->list($seededSession->id);
foreach ($seededEvents->getItems() as $event) {
    if ($event->type === 'user.message') {
        echo "Seeded event: {$event->content[0]->text}\n";
    }
}
seeded_session = client.beta.sessions.create(
  agent: agent.id,
  environment_id: environment.id,
  initial_events: [
    {
      type: :"user.message",
      content: [{type: :text, text: "List the files in the working directory."}]
    }
  ]
)

# initial_events are not echoed on the create response; read them back from
# the session's event list.
client.beta.sessions.events.list(seeded_session.id).auto_paging_each do |event|
  next unless event.type == :"user.message"
  event.content.each do |block|
    puts "Seeded event: #{block.text}" if block.type == :text
  end
end

다른 이벤트 유형은 받아들여지지 않아요. 에이전트 턴에 응답하는 이벤트(user.tool_confirmation, user.tool_result, user.custom_tool_result)는 아직 에이전트 턴이 없으므로 받아들여지지 않고, 중단할 턴이 없으므로 user.interrupt도 받아들여지지 않아요. 예약된 디플로이먼트의 initial_events와 달리, 세션의 initial_eventssystem.message를 받아들이지 않아요.

initial_events의 각 이벤트는 생성 응답이 반환되기 전에 목록 순서대로, 서버가 할당한 ID로 검증·저장돼요. 이는 생성 직후 이벤트 보내기 엔드포인트에 게시한 것과 정확히 같아요. 이벤트별 콘텐츠 규칙도 그 엔드포인트와 동일해요. 빈 목록은 필드를 생략한 것과 같아요. 검증은 전부 아니면 전무예요: 어떤 이벤트든 검증에 실패하면 전체 요청이 거부되고 세션이 생성되지 않아요.

다음 경우에 생성 요청이 거부돼요:

Condition Status
More than one user.define_outcome event 400
A user.define_outcome event without a rubric 400
More than 100 file-sourced document content blocks across the whole list 400
A request body over 32 MB 413

initial_eventsuser.define_outcome 이벤트는 기존 세션에 보내는 것과 같은 조건으로 받아들여져요. Define outcomes을 참고하세요.

Override agent configuration for a session

agent를 세 가지 형태로 전달할 수 있어요: 에이전트 ID 문자열, 고정 버전 객체(type: "agent"), 또는 오버라이드 객체. 오버라이드 형태는 단일 세션을 위해 에이전트 구성의 일부를 바꿔요. 에이전트를 버전 관리하지 않고 한 세션에서 다른 모델을 시도하거나 추가 도구를 부여할 때 사용하세요. 오버라이드 형태에서는 typeagent_with_overrides로 설정하고 에이전트의 id와 선택적으로 version(최신 버전을 쓰려면 version 생략)을 전달하세요. 그런 다음 세션이 사용할 model, system, tools, mcp_servers, skills 중 무엇이든 포함하세요.

각 오버라이드 가능한 필드는 같은 세 가지 규칙을 따라요:

  • Omit the field: The session inherits the value from the agent version it references.

  • Set the field to null, or to an empty array for list fields: The session runs with that field cleared. This rule applies in full to system and skills. There are three exceptions:

    • model is never clearable. A session always needs a model, so model: null returns a 400 agent_model_required error.
    • Clearing tools returns a 400 error when the session's effective skills is non-empty, because skills require the read tool. Otherwise, tools: null and tools: [] clear the field.
    • Clearing mcp_servers returns a 400 error when the session's effective tools still contains an mcp_toolset that references one of the agent's servers. Override tools in the same request to remove those mcp_toolset entries, then clear mcp_servers.
  • Set the field to a value: The value replaces the agent's value in full. Overrides never merge with the agent's configuration, so a tools override must list every tool the session should have. There is one exception:

    • An effort level inside a per-session model override isn't applied, and because the override replaces the agent's model object in full, the agent's own effort isn't carried over either: a session created with a model override runs at the model's default effort level. To run at a specific effort level, set effort on the agent and don't override model for that session.

오버라이드는 여러분이 만든 세션에만 적용돼요. 에이전트 리소스를 수정하거나 새 에이전트 버전을 만들지 않으므로, 같은 에이전트를 참조하는 다른 세션은 영향을 받지 않아요.

응답에서 agent 객체는 오버라이드가 적용된 후 세션이 실행하는 구성을 반영해요. 그 idversion은 여전히 오버라이드가 적용되는 에이전트와 버전을 식별해요. 이렇게 하면 세션을 기본 에이전트까지 추적할 수 있어요.

다음 예시는 모델을 오버라이드하고 시스템 프롬프트를 지우는 세션을 시작해요:

```bash cURL curl -fsSL https://api.anthropic.com/v1/sessions \ -H "x-api-key: $ANTHR...KEY" \ -H "anthropic-version: 2023-06-01" \ -H "anthropic-beta: managed-agents-2026-04-01" \ -H "content-type: application/json" \ -d @- <# The response's `agent` is the resolved snapshot: each override replaces that # field for this session only, and the agent resource keeps its id and version. ant beta:sessions create <<YAML agent: type: agent_with_overrides id: $AGENT_ID model: id: claude-sonnet-5 system: null environment_id: $ENVIRONMENT_ID YAML
override_session = client.beta.sessions.create(
    agent={
        "type": "agent_with_overrides",
        "id": agent.id,
        "model": {"id": "claude-sonnet-5"},
        "system": None,  # clear the agent's system prompt for this session
    },
    environment_id=environment.id,
)
# The response's agent is the resolved snapshot with the overrides applied.
print(f"Model: {override_session.agent.model.id}")
print(f"System: {override_session.agent.system}")
const overrideSession = await client.beta.sessions.create({
  agent: {
    type: "agent_with_overrides",
    id: agent.id,
    model: { id: "claude-sonnet-5" },
    system: null // clear the agent's system prompt for this session
  },
  environment_id: environment.id
});
// The response's agent is the resolved snapshot with the overrides applied.
console.log(`Model: ${overrideSession.agent.model.id}`);
console.log(`System: ${overrideSession.agent.system}`);
var overrideSession = await client.Beta.Sessions.Create(new()
{
    Agent = new BetaManagedAgentsAgentWithOverridesParams
    {
        Type = BetaManagedAgentsAgentWithOverridesParamsType.AgentWithOverrides,
        ID = agent.ID,
        Model = new BetaManagedAgentsModelConfigParams
        {
            ID = BetaManagedAgentsModel.ClaudeSonnet5,
        },
        System = null, // clear the agent's system prompt for this session
    },
    EnvironmentID = environment.ID,
});
// The response's agent is the resolved snapshot with the overrides applied.
Console.WriteLine($"Model: {overrideSession.Agent.Model.ID.Raw()}");
Console.WriteLine($"System: {overrideSession.Agent.System ?? "null"}");
overrideSession, err := client.Beta.Sessions.New(ctx, anthropic.BetaSessionNewParams{
	Agent: anthropic.BetaSessionNewParamsAgentUnion{
		OfBetaManagedAgentsAgentWithOverridess: &anthropic.BetaManagedAgentsAgentWithOverridesParams{
			Type: anthropic.BetaManagedAgentsAgentWithOverridesParamsTypeAgentWithOverrides,
			ID:   agent.ID,
			Model: anthropic.BetaManagedAgentsModelConfigParams{
				ID: anthropic.BetaManagedAgentsModelClaudeSonnet5,
			},
			// Clear the agent's system prompt for this session.
			System: param.Null[string](),
		},
	},
	EnvironmentID: environment.ID,
})
if err != nil {
	panic(err)
}
// The response's agent is the resolved snapshot with the overrides applied.
fmt.Printf("Model: %s\n", overrideSession.Agent.Model.ID)
fmt.Printf("System: %q\n", overrideSession.Agent.System)
var overrideSession = client.beta().sessions().create(SessionCreateParams.builder()
    .agent(BetaManagedAgentsAgentWithOverridesParams.builder()
        .type(BetaManagedAgentsAgentWithOverridesParams.Type.AGENT_WITH_OVERRIDES)
        .id(agent.id())
        .model(BetaManagedAgentsModelConfigParams.builder()
            .id(BetaManagedAgentsModel.CLAUDE_SONNET_5)
            .build())
        .system((String) null) // clear the agent's system prompt for this session
        .build())
    .environmentId(environment.id())
    .build());
// The response's agent is the resolved snapshot with the overrides applied.
IO.println("Model: " + overrideSession.agent().model().id());
IO.println("System: " + overrideSession.agent().system().orElse("null"));
$overrides = BetaManagedAgentsAgentWithOverridesParams::with(
    id: $agent->id,
    type: 'agent_with_overrides',
    model: ['id' => 'claude-sonnet-5'],
);
// Clear the system prompt for this session. Array access is load-bearing here:
// create() strips nulls from raw arrays and ::with() treats null args as omitted.
$overrides['system'] = null;

$overrideSession = $client->beta->sessions->create(
    agent: $overrides,
    environmentID: $environment->id,
);
// The response's agent is the resolved snapshot with the overrides applied.
echo "Model: {$overrideSession->agent->model->id}\n";
echo 'System: ' . ($overrideSession->agent->system ?? 'null') . "\n";
# The system prompt override is `system_` (trailing underscore) because plain
# `system` is Ruby's Kernel#system. Setting it to nil clears the prompt.
override_session = client.beta.sessions.create(
  agent: Anthropic::Beta::BetaManagedAgentsAgentWithOverridesParams.new(
    type: :agent_with_overrides,
    id: agent.id,
    model: {id: "claude-sonnet-5"},
    system_: nil
  ),
  environment_id: environment.id
)
# The response's agent is the resolved snapshot with the overrides applied.
puts "Model: #{override_session.agent.model.id}"
puts "System: #{override_session.agent.system_.inspect}"

Pin the inference geo for a session

model 오버라이드는 에이전트의 model 객체를 통째로 대체하므로, 세션에 대한 모델의 inference_geo 고정값도 설정하거나 지워요: inference_geo를 포함한 오버라이드는 세션의 모델 요청을 서빙할 지역을 고정하고, 생략하면 에이전트의 고정값을 지워 세션이 워크스페이스의 default_inference_geo를 따르게 해요. 오버라이드된 값은 세션이 생성될 때 워크스페이스의 allowed_inference_geos에 대해 검증돼요.

다음 예시는 지오 고정값이 없는 모델의 에이전트에서 세션을 시작하고, model 오버라이드에 inference_geo를 포함해 세션의 모델 요청을 미국 추론에 고정한 다음, 응답의 agent.model에 반영된 값을 출력해요:

```bash cURL # Replaces the agent's `model` in full: restate `id`, add `inference_geo` to pin. session=$(curl -fsSL https://api.anthropic.com/v1/sessions \ -H "x-api-key: $ANTHR...KEY" \ -H "anthropic-version: 2023-06-01" \ -H "anthropic-beta: managed-agents-2026-04-01" \ -H "content-type: application/json" \ -d @- <# Replaces the agent's `model` in full: restate `id`, add `inference_geo` to pin. session=$(ant beta:sessions create <<YAML agent: type: agent_with_overrides id: $AGENT_ID model: id: claude-opus-5-5 inference_geo: us environment_id: $ENVIRONMENT_ID YAML ) echo "Inference geo: $(jq -r '.agent.model.inference_geo' <<< "$session")"
session = client.beta.sessions.create(
    agent={
        "type": "agent_with_overrides",
        "id": agent.id,
        # Replaces the agent's `model` in full: restate `id`, add `inference_geo` to pin.
        "model": {"id": "claude-opus-5-5", "inference_geo": "us"},
    },
    environment_id=environment.id,
)
print(f"Inference geo: {session.agent.model.inference_geo}")
const session = await client.beta.sessions.create({
  agent: {
    type: "agent_with_overrides",
    id: agent.id,
    // Replaces the agent's `model` in full: restate `id`, add `inference_geo` to pin.
    model: { id: "claude-opus-5-5", inference_geo: "us" }
  },
  environment_id: environment.id
});
console.log(`Inference geo: ${session.agent.model.inference_geo}`);
var session = await client.Beta.Sessions.Create(new()
{
    Agent = new BetaManagedAgentsAgentWithOverridesParams
    {
        Type = BetaManagedAgentsAgentWithOverridesParamsType.AgentWithOverrides,
        ID = agent.ID,
        // Replaces the agent's `model` in full: restate `id`, add `inference_geo` to pin.
        Model = new BetaManagedAgentsModelConfigParams
        {
            ID = BetaManagedAgentsModel.ClaudeOpus5_5,
            InferenceGeo = "us",
        },
    },
    EnvironmentID = environment.ID,
});
Console.WriteLine($"Inference geo: {session.Agent.Model.InferenceGeo}");
session, err := client.Beta.Sessions.New(ctx, anthropic.BetaSessionNewParams{
	Agent: anthropic.BetaSessionNewParamsAgentUnion{
		OfBetaManagedAgentsAgentWithOverridess: &anthropic.BetaManagedAgentsAgentWithOverridesParams{
			Type: anthropic.BetaManagedAgentsAgentWithOverridesParamsTypeAgentWithOverrides,
			ID:   agent.ID,
			// Replaces the agent's `model` in full: restate `id`, add `inference_geo` to pin.
			Model: anthropic.BetaManagedAgentsModelConfigParams{
				ID:           anthropic.BetaManagedAgentsModelClaudeOpus5_5,
				InferenceGeo: anthropic.String("us"),
			},
		},
	},
	EnvironmentID: environment.ID,
})
if err != nil {
	panic(err)
}
fmt.Printf("Inference geo: %s\n", session.Agent.Model.InferenceGeo)
var session = client.beta().sessions().create(SessionCreateParams.builder()
    .agent(BetaManagedAgentsAgentWithOverridesParams.builder()
        .type(BetaManagedAgentsAgentWithOverridesParams.Type.AGENT_WITH_OVERRIDES)
        .id(agent.id())
        // Replaces the agent's `model` in full: restate `id`, add `inference_geo` to pin.
        .model(BetaManagedAgentsModelConfigParams.builder()
            .id(BetaManagedAgentsModel.CLAUDE_OPUS_5_5)
            .inferenceGeo("us")
            .build())
        .build())
    .environmentId(environment.id())
    .build());
IO.println("Inference geo: " + session.agent().model().inferenceGeo().orElseThrow());
$session = $client->beta->sessions->create(
    agent: BetaManagedAgentsAgentWithOverridesParams::with(
        id: $agent->id,
        type: 'agent_with_overrides',
        // Replaces the agent's `model` in full: restate `id`, add `inference_geo` to pin.
        model: BetaManagedAgentsModelConfigParams::with(
            id: 'claude-opus-5-5',
            inferenceGeo: 'us',
        ),
    ),
    environmentID: $environment->id,
);
echo "Inference geo: {$session->agent->model->inferenceGeo}\n";
session = client.beta.sessions.create(
  agent: {
    type: :agent_with_overrides,
    id: agent.id,
    # Replaces the agent's `model` in full: restate `id`, add `inference_geo` to pin.
    model: {id: "claude-opus-5-5", inference_geo: "us"}
  },
  environment_id: environment.id
)
puts "Inference geo: #{session.agent.model.inference_geo}"
The agent defines how Claude behaves within the session, including the model, system prompt, tools, and MCP servers. See [Define your agent](https://platform.claude.com/docs/en/managed-agents/agent-setup) for details.

Set a session budget

세션이 지출할 수 있는 상한을 정하려면 생성 시 선택적 budget 객체를 전달하세요. 예산은 세션의 list cost에 대한 하드 상한이에요: 플랫폼이 세션이 소비하는 모든 것을 공개 목록 가격으로 가격을 매기고, 그 누적 합계가 max_list_cost에 도달하면 새 모델 요청 발행을 멈춰요. typelimit으로 설정하고 max_list_costamountcurrency를 주세요. amount는 문자열로 쓴 미국 센트 정수예요(예: $25.00에 "2500"). API는 정수가 아닌 문자열을 받으므로 부동소수점 반올림이 절대 적용되지 않아요. USD가 현재 유일하게 지원되는 통화예요. 상한에 도달하면 세션은 일시 중지되고 budget_reached 중지 사유로 유휴 상태가 돼요. 상한은 모델 요청 사이에 강제되므로, 상한을 넘는 요청은 먼저 완료되고 세션의 최종 list cost는 상한을 조금 넘을 수 있어요. 예산은 생성 시에만 붙일 수 있어요: 나중에 변경하거나 제거할 수 있지만, 예산 없이 만든 세션에는 추가할 수 없어요.

다음 예시는 $25.00 예산으로 세션을 만들어요. 응답은 세션 리소스에 budget을 반영해요:

curl -fsSL https://api.anthropic.com/v1/sessions \
  -H "x-api-key: $ANTHR...KEY" \
  -H "anthropic-version: 2023-06-01" \
  -H "anthropic-beta: managed-agents-2026-04-01" \
  -H "content-type: application/json" \
  -d @- <<EOF
{
  "agent": "$AGENT_ID",
  "environment_id": "$ENVIRONMENT_ID",
  "budget": {
    "type": "limit",
    "max_list_cost": {"amount": "2500", "currency": "USD"}
  }
}
EOF

강제가 어떻게 작동하는지, 무엇이 list cost에 포함되는지, 멀티에이전트 세션에서 예산이 어떻게 동작하는지는 Session budgets을 참고하세요.

MCP authentication through vaults

에이전트가 인증이 필요한 MCP 도구를 사용한다면, 세션 생성 시 vault_ids를 전달해 저장된 OAuth 자격 증명을 담은 볼트를 참조하세요. Anthropic이 여러분을 대신해 토큰 갱신을 관리해요. 볼트를 만들고 자격 증명을 등록하는 방법은 Authenticate with vaults를 참고하세요.

```bash cURL curl -fsSL https://api.anthropic.com/v1/sessions \ -H "x-api-key: $ANTHR...KEY" \ -H "anthropic-version: 2023-06-01" \ -H "anthropic-beta: managed-agents-2026-04-01" \ -H "content-type: application/json" \ -d @- <ant beta:sessions create <<YAML agent: $AGENT_ID environment_id: $ENVIRONMENT_ID vault_ids: - $VAULT_ID YAML
vault_session = client.beta.sessions.create(
    agent=agent.id,
    environment_id=environment.id,
    vault_ids=[vault.id],
)
const vaultSession = await client.beta.sessions.create({
  agent: agent.id,
  environment_id: environment.id,
  vault_ids: [vault.id]
});
var vaultSession = await client.Beta.Sessions.Create(new()
{
    Agent = agent.ID,
    EnvironmentID = environment.ID,
    VaultIds = [vault.ID],
});
vaultSession, err := client.Beta.Sessions.New(ctx, anthropic.BetaSessionNewParams{
	Agent: anthropic.BetaSessionNewParamsAgentUnion{
		OfString: anthropic.String(agent.ID),
	},
	EnvironmentID: environment.ID,
	VaultIDs:      []string{vault.ID},
})
if err != nil {
	panic(err)
}
var vaultSession = client.beta().sessions().create(SessionCreateParams.builder()
    .agent(agent.id())
    .environmentId(environment.id())
    .addVaultId(vault.id())
    .build());
$vaultSession = $client->beta->sessions->create(
    agent: $agent->id,
    environmentID: $environment->id,
    vaultIDs: [$vault->id],
);
vault_session = client.beta.sessions.create(
  agent: agent.id,
  environment_id: environment.id,
  vault_ids: [vault.id]
)

Starting the session

initial_events 없이 세션을 만들면 세션이 등록되지만 작업은 시작되지 않아요. 환경의 샌드박스는 세션이 생성되자마자 프로비저닝을 시작하므로, 첫 도구 호출이 그것을 기다리지 않아요. 작업을 위임하려면 사용자 이벤트를 사용해 세션에 이벤트를 보내세요. 생성 요청에서 첫 이벤트를 제공하려면 Seed the session with initial events를 참고하세요. 세션은 이벤트가 실제 실행을 이끄는 동안 진행 상황을 추적하는 상태 머신으로 작동해요.

```bash cURL curl -fsSL "https://api.anthropic.com/v1/sessions/$SESSION_ID/events" \ -H "x-api-key: $ANTHR...KEY" \ -H "anthropic-version: 2023-06-01" \ -H "anthropic-beta: managed-agents-2026-04-01" \ -H "content-type: application/json" \ -d @- <<'EOF' { "events": [ { "type": "user.message", "content": [{"type": "text", "text": "List the files in the working directory."}] } ] } EOF ```
ant beta:sessions:events send \
  --session-id "$SESSION_ID" <<'YAML'
events:
  - type: user.message
    content:
      - type: text
        text: List the files in the working directory.
YAML
client.beta.sessions.events.send(
    session.id,
    events=[
        {
            "type": "user.message",
            "content": [
                {"type": "text", "text": "List the files in the working directory."}
            ],
        },
    ],
)
await client.beta.sessions.events.send(session.id, {
  events: [
    {
      type: "user.message",
      content: [{ type: "text", text: "List the files in the working directory." }]
    }
  ]
});
await client.Beta.Sessions.Events.Send(session.ID, new()
{
    Events =
    [
        new BetaManagedAgentsUserMessageEventParams
        {
            Type = BetaManagedAgentsUserMessageEventParamsType.UserMessage,
            Content =
            [
                new BetaManagedAgentsTextBlock
                {
                    Type = BetaManagedAgentsTextBlockType.Text,
                    Text = "List the files in the working directory.",
                },
            ],
        },
    ],
});
if _, 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: "List the files in the working directory.",
				},
			}},
		},
	}},
}); err != nil {
	panic(err)
}
client.beta().sessions().events().send(
    session.id(),
    EventSendParams.builder()
        .addEvent(BetaManagedAgentsUserMessageEventParams.builder()
            .type(BetaManagedAgentsUserMessageEventParams.Type.USER_MESSAGE)
            .addTextContent("List the files in the working directory.")
            .build())
        .build());
$client->beta->sessions->events->send(
    $session->id,
    events: [
        [
            'type' => 'user.message',
            'content' => [['type' => 'text', 'text' => 'List the files in the working directory.']],
        ],
    ],
);
client.beta.sessions.events.send_(
  session.id,
  events: [
    {
      type: :"user.message",
      content: [{type: :text, text: "List the files in the working directory."}]
    }
  ]
)

에이전트 응답을 스트리밍하고 도구 확인을 처리하는 방법은 Session event stream을 참고하세요.

세션이 거치는 상태는 Session statuses를 참고하세요.

Next steps

Retrieve, list, update, archive, and delete Claude Managed Agents sessions. Send events, stream responses, and interrupt or redirect your session mid-execution. Create and manage deployments with the Claude API: run an agent on a recurring cron schedule and inspect its run history.

더 알아보기 (Learn more)