# 세션 제한

세션 제한을 사용하면 애플리케이션이 Copilot 세션에 대한 AI 크레딧 예산을 설정할 수 있습니다. 세션을 생성하거나 재개할 때 현재 회계 기간의 소프트 캡을 설정하려면 sessionLimits를 사용합니다.

<!-- markdownlint-disable GHD046 GHD005 -->
<!-- Suppressed: GHD046 (outdated release terminology), GHD005 (hardcoded data variable) -->

## 세션 제한 구성

`maxAiCredits`를 세션의 현재 정산 기간에 대한 AI 크레딧 소프트 캡으로 설정하세요. 모델 호출이 반환된 후 사용량이 확인되므로 런타임이 다음 모델 호출을 차단하기 전에 하나의 응답이 구성된 값을 초과할 수 있습니다. SDK는 세션을 만들거나 다시 시작할 때 이 값을 Copilot CLI에 전달합니다.

<div class="ghd-codetabs">
<div class="ghd-codetab" data-lang="typescript" data-label="TypeScript"><div class="ghd-codetab-fallback-label" role="heading" aria-level="3">TypeScript</div>

<!-- docs-validate: skip -->

```typescript
const session = await client.createSession({
    onPermissionRequest: approveAll,
    sessionLimits: {
        maxAiCredits: 30,
    },
});

const resumed = await client.resumeSession(session.sessionId, {
    onPermissionRequest: approveAll,
    sessionLimits: {
        maxAiCredits: 30,
    },
});
```

</div>

<div class="ghd-codetab" data-lang="python" data-label="Python"><div class="ghd-codetab-fallback-label" role="heading" aria-level="3">Python</div>

<!-- docs-validate: skip -->

```python
session = await client.create_session(
    on_permission_request=PermissionHandler.approve_all,
    session_limits={
        "max_ai_credits": 30,
    },
)

resumed = await client.resume_session(
    session.session_id,
    on_permission_request=PermissionHandler.approve_all,
    session_limits={
        "max_ai_credits": 30,
    },
)
```

</div>

<div class="ghd-codetab" data-lang="go" data-label="Go"><div class="ghd-codetab-fallback-label" role="heading" aria-level="3">Go</div>

<!-- docs-validate: skip -->

```golang
session, err := client.CreateSession(ctx, &copilot.SessionConfig{
    OnPermissionRequest: copilot.PermissionHandler.ApproveAll,
    SessionLimits: &rpc.SessionLimitsConfig{
        MaxAiCredits: copilot.Float64(30),
    },
})

resumed, err := client.ResumeSession(ctx, session.SessionID, &copilot.ResumeSessionConfig{
    OnPermissionRequest: copilot.PermissionHandler.ApproveAll,
    SessionLimits: &rpc.SessionLimitsConfig{
        MaxAiCredits: copilot.Float64(30),
    },
})
```

</div>

<div class="ghd-codetab" data-lang="dotnet" data-label=".NET"><div class="ghd-codetab-fallback-label" role="heading" aria-level="3">.NET</div>

<!-- docs-validate: skip -->

```csharp
var session = await client.CreateSessionAsync(new SessionConfig
{
    OnPermissionRequest = PermissionHandler.ApproveAll,
    SessionLimits = new SessionLimitsConfig
    {
        MaxAiCredits = 30,
    },
});

var resumed = await client.ResumeSessionAsync(session.SessionId, new ResumeSessionConfig
{
    OnPermissionRequest = PermissionHandler.ApproveAll,
    SessionLimits = new SessionLimitsConfig
    {
        MaxAiCredits = 30,
    },
});
```

</div>

<div class="ghd-codetab" data-lang="java" data-label="Java"><div class="ghd-codetab-fallback-label" role="heading" aria-level="3">Java</div>

<!-- docs-validate: skip -->

```java
CopilotSession session = client
        .createSession(new SessionConfig()
                .setOnPermissionRequest(PermissionHandler.APPROVE_ALL)
                .setSessionLimits(new SessionLimitsConfig(30.0)))
        .get();

CopilotSession resumed = client
        .resumeSession(session.getSessionId(), new ResumeSessionConfig()
                .setOnPermissionRequest(PermissionHandler.APPROVE_ALL)
                .setSessionLimits(new SessionLimitsConfig(30.0)))
        .get();
```

</div>

<div class="ghd-codetab" data-lang="rust" data-label="Rust"><div class="ghd-codetab-fallback-label" role="heading" aria-level="3">Rust</div>

<!-- docs-validate: skip -->

```rust
let limits = SessionLimitsConfig {
    max_ai_credits: Some(30.0),
};

let session = client
    .create_session(
        SessionConfig::default()
            .approve_all_permissions()
            .with_session_limits(limits.clone()),
    )
    .await?;

let resumed = client
    .resume_session(
        ResumeSessionConfig::new(session.id().clone())
            .approve_all_permissions()
            .with_session_limits(limits),
    )
    .await?;
```

</div>

</div>

## 예산 이벤트 관찰

애플리케이션은 세션 이벤트를 구독하여 소프트 캡이 변경되거나 세션이 고갈된 예산 흐름에 도달할 때 UI를 업데이트할 수 있습니다.

| 이벤트 유형 | 방출될 때 | 중요 필드 |
|---|---|---|
| `session.session_limits_changed` | 활성 세션 제한이 변경되었습니다. 값은 `null``sessionLimits` 제한이 활성화되지 않음을 의미합니다. | `sessionLimits.maxAiCredits?` |
| `session.usage_checkpoint` | 런타임은 재개 및 정산을 위해 영구적으로 유지되는 집계 사용량을 기록합니다. | 
`totalNanoAiu`, `totalPremiumRequests?` |
| `session_limits_exhausted.requested` | 세션이 고갈된 예산 흐름에 도달했으며 계속하기 전에 사용자 결정이 필요합니다. | 
`requestId`, `maxAiCredits`, `usedAiCredits` |
| `session_limits_exhausted.completed` | 한도 초과 프롬프트 문제가 해결되었습니다. | 
`requestId`, `response.action`, , `response.additionalAiCredits?`, `response.maxAiCredits?` |

사용 중인 SDK 언어에 대해 생성된 이벤트 유형을 사용합니다. 예를 들어 TypeScript는 다음과 같이 좁혀 줍니다.`event.type`

```typescript
session.on((event) => {
    if (event.type === "session_limits_exhausted.requested") {
        showBudgetDialog({
            requestId: event.data.requestId,
            maxAiCredits: event.data.maxAiCredits,
            usedAiCredits: event.data.usedAiCredits,
        });
    }
});
```