{"meta":{"title":"세션 제한","intro":"세션 제한을 사용하면 애플리케이션이 Copilot 세션에 대한 AI 크레딧 예산을 설정할 수 있습니다. 세션을 생성하거나 재개할 때 현재 회계 기간의 소프트 캡을 설정하려면 sessionLimits를 사용합니다.","product":"GitHub Copilot","breadcrumbs":[{"href":"/ko/copilot","title":"GitHub Copilot"},{"href":"/ko/copilot/how-tos","title":"방법"},{"href":"/ko/copilot/how-tos/copilot-sdk","title":"코필로트 SDK"},{"href":"/ko/copilot/how-tos/copilot-sdk/features","title":"기능"},{"href":"/ko/copilot/how-tos/copilot-sdk/features/session-limits","title":"세션 제한"}],"documentType":"article"},"body":"# 세션 제한\n\n세션 제한을 사용하면 애플리케이션이 Copilot 세션에 대한 AI 크레딧 예산을 설정할 수 있습니다. 세션을 생성하거나 재개할 때 현재 회계 기간의 소프트 캡을 설정하려면 sessionLimits를 사용합니다.\n\n<!-- markdownlint-disable GHD046 GHD005 -->\n<!-- Suppressed: GHD046 (outdated release terminology), GHD005 (hardcoded data variable) -->\n\n## 세션 제한 구성\n\n`maxAiCredits`를 세션의 현재 정산 기간에 대한 AI 크레딧 소프트 캡으로 설정하세요. 모델 호출이 반환된 후 사용량이 확인되므로 런타임이 다음 모델 호출을 차단하기 전에 하나의 응답이 구성된 값을 초과할 수 있습니다. SDK는 세션을 만들거나 다시 시작할 때 이 값을 Copilot CLI에 전달합니다.\n\n<div class=\"ghd-codetabs\">\n<div class=\"ghd-codetab\" data-lang=\"typescript\" data-label=\"TypeScript\"><div class=\"ghd-codetab-fallback-label\" role=\"heading\" aria-level=\"3\">TypeScript</div>\n\n<!-- docs-validate: skip -->\n\n```typescript\nconst session = await client.createSession({\n    onPermissionRequest: approveAll,\n    sessionLimits: {\n        maxAiCredits: 30,\n    },\n});\n\nconst resumed = await client.resumeSession(session.sessionId, {\n    onPermissionRequest: approveAll,\n    sessionLimits: {\n        maxAiCredits: 30,\n    },\n});\n```\n\n</div>\n\n<div class=\"ghd-codetab\" data-lang=\"python\" data-label=\"Python\"><div class=\"ghd-codetab-fallback-label\" role=\"heading\" aria-level=\"3\">Python</div>\n\n<!-- docs-validate: skip -->\n\n```python\nsession = await client.create_session(\n    on_permission_request=PermissionHandler.approve_all,\n    session_limits={\n        \"max_ai_credits\": 30,\n    },\n)\n\nresumed = await client.resume_session(\n    session.session_id,\n    on_permission_request=PermissionHandler.approve_all,\n    session_limits={\n        \"max_ai_credits\": 30,\n    },\n)\n```\n\n</div>\n\n<div class=\"ghd-codetab\" data-lang=\"go\" data-label=\"Go\"><div class=\"ghd-codetab-fallback-label\" role=\"heading\" aria-level=\"3\">Go</div>\n\n<!-- docs-validate: skip -->\n\n```golang\nsession, err := client.CreateSession(ctx, &copilot.SessionConfig{\n    OnPermissionRequest: copilot.PermissionHandler.ApproveAll,\n    SessionLimits: &rpc.SessionLimitsConfig{\n        MaxAiCredits: copilot.Float64(30),\n    },\n})\n\nresumed, err := client.ResumeSession(ctx, session.SessionID, &copilot.ResumeSessionConfig{\n    OnPermissionRequest: copilot.PermissionHandler.ApproveAll,\n    SessionLimits: &rpc.SessionLimitsConfig{\n        MaxAiCredits: copilot.Float64(30),\n    },\n})\n```\n\n</div>\n\n<div class=\"ghd-codetab\" data-lang=\"dotnet\" data-label=\".NET\"><div class=\"ghd-codetab-fallback-label\" role=\"heading\" aria-level=\"3\">.NET</div>\n\n<!-- docs-validate: skip -->\n\n```csharp\nvar session = await client.CreateSessionAsync(new SessionConfig\n{\n    OnPermissionRequest = PermissionHandler.ApproveAll,\n    SessionLimits = new SessionLimitsConfig\n    {\n        MaxAiCredits = 30,\n    },\n});\n\nvar resumed = await client.ResumeSessionAsync(session.SessionId, new ResumeSessionConfig\n{\n    OnPermissionRequest = PermissionHandler.ApproveAll,\n    SessionLimits = new SessionLimitsConfig\n    {\n        MaxAiCredits = 30,\n    },\n});\n```\n\n</div>\n\n<div class=\"ghd-codetab\" data-lang=\"java\" data-label=\"Java\"><div class=\"ghd-codetab-fallback-label\" role=\"heading\" aria-level=\"3\">Java</div>\n\n<!-- docs-validate: skip -->\n\n```java\nCopilotSession session = client\n        .createSession(new SessionConfig()\n                .setOnPermissionRequest(PermissionHandler.APPROVE_ALL)\n                .setSessionLimits(new SessionLimitsConfig(30.0)))\n        .get();\n\nCopilotSession resumed = client\n        .resumeSession(session.getSessionId(), new ResumeSessionConfig()\n                .setOnPermissionRequest(PermissionHandler.APPROVE_ALL)\n                .setSessionLimits(new SessionLimitsConfig(30.0)))\n        .get();\n```\n\n</div>\n\n<div class=\"ghd-codetab\" data-lang=\"rust\" data-label=\"Rust\"><div class=\"ghd-codetab-fallback-label\" role=\"heading\" aria-level=\"3\">Rust</div>\n\n<!-- docs-validate: skip -->\n\n```rust\nlet limits = SessionLimitsConfig {\n    max_ai_credits: Some(30.0),\n};\n\nlet session = client\n    .create_session(\n        SessionConfig::default()\n            .approve_all_permissions()\n            .with_session_limits(limits.clone()),\n    )\n    .await?;\n\nlet resumed = client\n    .resume_session(\n        ResumeSessionConfig::new(session.id().clone())\n            .approve_all_permissions()\n            .with_session_limits(limits),\n    )\n    .await?;\n```\n\n</div>\n\n</div>\n\n## 예산 이벤트 관찰\n\n애플리케이션은 세션 이벤트를 구독하여 소프트 캡이 변경되거나 세션이 고갈된 예산 흐름에 도달할 때 UI를 업데이트할 수 있습니다.\n\n| 이벤트 유형 | 방출될 때 | 중요 필드 |\n|---|---|---|\n| `session.session_limits_changed` | 활성 세션 제한이 변경되었습니다. 값은 `null``sessionLimits` 제한이 활성화되지 않음을 의미합니다. | `sessionLimits.maxAiCredits?` |\n| `session.usage_checkpoint` | 런타임은 재개 및 정산을 위해 영구적으로 유지되는 집계 사용량을 기록합니다. | \n`totalNanoAiu`, `totalPremiumRequests?` |\n| `session_limits_exhausted.requested` | 세션이 고갈된 예산 흐름에 도달했으며 계속하기 전에 사용자 결정이 필요합니다. | \n`requestId`, `maxAiCredits`, `usedAiCredits` |\n| `session_limits_exhausted.completed` | 한도 초과 프롬프트 문제가 해결되었습니다. | \n`requestId`, `response.action`, , `response.additionalAiCredits?`, `response.maxAiCredits?` |\n\n사용 중인 SDK 언어에 대해 생성된 이벤트 유형을 사용합니다. 예를 들어 TypeScript는 다음과 같이 좁혀 줍니다.`event.type`\n\n```typescript\nsession.on((event) => {\n    if (event.type === \"session_limits_exhausted.requested\") {\n        showBudgetDialog({\n            requestId: event.data.requestId,\n            maxAiCredits: event.data.maxAiCredits,\n            usedAiCredits: event.data.usedAiCredits,\n        });\n    }\n});\n```"}