# セッションの制限

セッションの制限により、アプリケーションは、Copilot セッションの AI クレジット予算を設定できます。 セッションを作成または再開するときに sessionLimits を使用して、現在の会計ウィンドウのソフト キャップを設定します。

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

## セッション制限を構成する

`maxAiCredits`を、セッションの現在の会計期間におけるAIクレジットのソフトキャップに設定します。 モデル呼び出しが戻った後に使用状況がチェックされるため、ランタイムが次のモデル呼び出しをブロックする前に、1 つの応答が構成された値を超える可能性があります。 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,
        });
    }
});
```