세션 시작하기
세션 시작하기 (Start a session)
세션은 환경 안의 에이전트 인스턴스예요. 각 세션은 에이전트와 환경(둘 다 별도로 생성)을 참조하고, 여러 상호작용에 걸쳐 대화 기록을 유지해요. 세션은 두 단계 수명주기를 따라요: 먼저 세션을 만들고, 그다음 사용자 이벤트를 보내 작업을 시작하죠. initial_events로 두 단계를 한 번의 호출로 합칠 수도 있어요.
출처: 문서
본문
세션은 환경 내의 에이전트 인스턴스예요. 각 세션은 에이전트와 환경(둘 다 별도로 생성됨)을 참조하고, 여러 상호작용에 걸쳐 대화 기록을 유지해요. 세션은 두 단계 수명주기를 따라요: 먼저 세션을 만들고, 그다음 사용자 이벤트를 보내 작업을 시작하세요. initial_events로 두 단계를 한 번의 호출로 합칠 수도 있어요.
Creating a session
세션에는 agent ID와 environment ID가 필요해요. 에이전트는 버전이 관리되는 리소스예요. agent ID를 문자열로 전달하면 최신 에이전트 버전으로 세션이 생성돼요.
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
)
세션을 특정 에이전트 버전에 고정하려면 객체를 전달하세요. 이렇게 하면 정확히 어떤 버전이 실행될지 제어하고 새 버전의 배포를 독립적으로 단계화할 수 있어요.
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.message와 user.define_outcome 이벤트를 지원하고, 최대 50개까지 받아요. 비어 있지 않은 목록은 같은 호출에서 에이전트 루프를 시작해요: 세션은 추가 요청 없이 곧바로 running 상태로 생성됩니다.
다음 예시는 initial_events에 단일 user.message를 넣어 세션을 만들어요:
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_events는 system.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_events의 user.define_outcome 이벤트는 기존 세션에 보내는 것과 같은 조건으로 받아들여져요. Define outcomes을 참고하세요.
Override agent configuration for a session
agent를 세 가지 형태로 전달할 수 있어요: 에이전트 ID 문자열, 고정 버전 객체(type: "agent"), 또는 오버라이드 객체. 오버라이드 형태는 단일 세션을 위해 에이전트 구성의 일부를 바꿔요. 에이전트를 버전 관리하지 않고 한 세션에서 다른 모델을 시도하거나 추가 도구를 부여할 때 사용하세요. 오버라이드 형태에서는 type을 agent_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 tosystemandskills. There are three exceptions:modelis never clearable. A session always needs a model, somodel: nullreturns a 400agent_model_requirederror.- Clearing
toolsreturns a 400 error when the session's effectiveskillsis non-empty, because skills require thereadtool. Otherwise,tools: nullandtools: []clear the field. - Clearing
mcp_serversreturns a 400 error when the session's effectivetoolsstill contains anmcp_toolsetthat references one of the agent's servers. Overridetoolsin the same request to remove thosemcp_toolsetentries, then clearmcp_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
toolsoverride must list every tool the session should have. There is one exception:- An
effortlevel inside a per-sessionmodeloverride isn't applied, and because the override replaces the agent'smodelobject in full, the agent's owneffortisn't carried over either: a session created with amodeloverride runs at the model's default effort level. To run at a specific effort level, setefforton the agent and don't overridemodelfor that session.
- An
오버라이드는 여러분이 만든 세션에만 적용돼요. 에이전트 리소스를 수정하거나 새 에이전트 버전을 만들지 않으므로, 같은 에이전트를 참조하는 다른 세션은 영향을 받지 않아요.
응답에서 agent 객체는 오버라이드가 적용된 후 세션이 실행하는 구성을 반영해요. 그 id와 version은 여전히 오버라이드가 적용되는 에이전트와 버전을 식별해요. 이렇게 하면 세션을 기본 에이전트까지 추적할 수 있어요.
다음 예시는 모델을 오버라이드하고 시스템 프롬프트를 지우는 세션을 시작해요:
# 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에 반영된 값을 출력해요:
# 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}"
Set a session budget
세션이 지출할 수 있는 상한을 정하려면 생성 시 선택적 budget 객체를 전달하세요. 예산은 세션의 list cost에 대한 하드 상한이에요: 플랫폼이 세션이 소비하는 모든 것을 공개 목록 가격으로 가격을 매기고, 그 누적 합계가 max_list_cost에 도달하면 새 모델 요청 발행을 멈춰요. type을 limit으로 설정하고 max_list_cost에 amount와 currency를 주세요. 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를 참고하세요.
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를 참고하세요. 세션은 이벤트가 실제 실행을 이끄는 동안 진행 상황을 추적하는 상태 머신으로 작동해요.
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
더 알아보기 (Learn more)
- Session operations — 세션 조회·목록·업데이트·보관·삭제
- Session event stream — 이벤트 보내고 스트리밍하며 세션 조종하기
- Define your agent — 에이전트 구성 정의하기
- Session budgets — 세션 지출 상한 설정하기