# Limites de sessão

Os limites de sessão permitem que um aplicativo defina um orçamento de Créditos de IA para uma sessão de Copilot. Use sessionLimits ao criar ou retomar uma sessão para definir um limite flexível para a janela de contabilidade atual.

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

## Configurar um limite de sessão

Defina `maxAiCredits` como o limite flexível de Créditos de IA na janela de contabilização atual da sessão. O uso é verificado após o retorno de chamadas de modelo, portanto, uma resposta pode exceder o valor configurado antes que o runtime bloqueie a próxima chamada de modelo. O SDK encaminha esse valor para a CLI Copilot quando cria ou retoma a sessão.

<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>

## Ver eventos orçamentários

Os aplicativos podem se inscrever em eventos da sessão para atualizar a interface do usuário quando o limite flexível muda ou a sessão entra no fluxo de orçamento esgotado.

| Tipo de evento | Quando é emitido | Campos importantes |
|---|---|---|
| `session.session_limits_changed` | Os limites de sessões ativas foram alterados. Um `null``sessionLimits` valor significa que nenhum limite está ativo. | `sessionLimits.maxAiCredits?` |
| `session.usage_checkpoint` | O runtime registra o uso agregado persistente para retomada e contabilização. | 
`totalNanoAiu`, `totalPremiumRequests?` |
| `session_limits_exhausted.requested` | A sessão atingiu o fluxo de orçamento esgotado e precisa de uma decisão do usuário antes de continuar. | 
`requestId`, , `maxAiCredits``usedAiCredits` |
| `session_limits_exhausted.completed` | A mensagem de limite atingido foi corrigida. | 
`requestId`, `response.action`, , `response.additionalAiCredits?``response.maxAiCredits?` |

Use os tipos de evento gerados para o idioma do SDK que você está usando. Por exemplo, TypeScript restringe por `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,
        });
    }
});
```