# Ограничения сессий

Ограничения сессий позволяют приложению устанавливать бюджет AI-кредитов для сессии Copilot. При создании или возобновлении сессии используйте sessionLimits мягкий лимит для текущего бухгалтерского окна.

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

## Настройте лимит сессий

Установите `maxAiCredits` софтлимит AI Credits для текущего бухгалтерского окна сессии. Использование проверяется после возвращения вызовов модели, поэтому один ответ может превысить заданное значение до того, как время выполнения блокирует следующий вызов модели. 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>

## Наблюдайте за бюджетными событиями

Приложения могут подписываться на события сессий для обновления интерфейса, когда меняется мягкий лимит или сессия достигает исчерпанного бюджета.

| Тип события | Когда он излучается | Важные области |
|---|---|---|
| `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,
        });
    }
});
```