Skip to main content
Skip to content

스트리밍 세션 이벤트

Copilot 에이전트 수행하는 모든 작업(생각, 코드 작성, 실행 도구)은 구독할 수 있는 session 이벤트로 내보내집니다. 이 가이드는 각 이벤트 유형에 대한 필드 수준 참조이므로 SDK 원본을 읽지 않고도 예상되는 데이터를 정확하게 알 수 있습니다.

Overview

세션에서 설정되면 streaming: true SDK는 지속형 이벤트(전체 메시지, 도구 결과)와 함께 임시 이벤트(델타, 진행률 업데이트)를 실시간으로 내보냅니다. 모든 이벤트는 공통 엔벨로프를 공유하며, 이벤트 data 형식에 따라 달라지는 type 페이로드를 전달합니다.

다이어그램: 설명된 프로세스를 보여 주는 시퀀스 다이어그램

ConceptDescription
임시 이벤트일시적인; 실시간으로 스트리밍되지만 세션 로그에 유지 되지 않습니다 . 세션 다시 시작에서 재생되지 않습니다.
지속형 이벤트디스크의 세션 이벤트 로그에 저장됩니다. 세션을 다시 열 때 재생됩니다.
델타 이벤트임시 스트리밍 청크(텍스트 또는 추론)입니다. 델타를 누적하여 전체 콘텐츠를 빌드합니다.
parentId 체인각 이벤트는 parentId 이전 이벤트를 가리키며 걸을 수 있는 연결된 목록을 형성합니다.

이벤트 봉투

형식에 관계없이 모든 세션 이벤트에는 다음 필드가 포함됩니다.

FieldTypeDescription
id
string (UUID v4)고유 이벤트 식별자
timestamp
string (ISO 8601)이벤트를 만든 경우
parentIdstring | null체인에 있는 이전 이벤트의 ID입니다. null 첫 번째 이벤트에 대한
agentIdstring?하위 에이전트에서 시작된 이벤트에 대한 하위 에이전트 인스턴스 ID; 루트/주 에이전트 및 세션 수준 이벤트에 대한 없음
ephemeralboolean?
true 일시적 이벤트의 경우 없음; 지속형 이벤트의 경우 false
typestring이벤트 유형 판별자(아래 표 참조)
dataobject이벤트별 페이로드

이벤트 구독

코드 언어 navigation

TypeScript
// All events
session.on((event) => {
    console.log(event.type, event.data);
});

// Specific event type — data is narrowed automatically
session.on("assistant.message_delta", (event) => {
    process.stdout.write(event.data.deltaContent);
});

팁

(Python/Go) 이러한 SDK는 별도의 이벤트별 데이터 형식(예AssistantMessageDeltaData: )을 사용하므로 각 형식에 관련 필드만 존재합니다.

(.NET) .NET SDK는 이벤트당 강력한 형식의 별도의 데이터 클래스(예: AssistantMessageDeltaData)를 사용하므로 각 형식에 관련 필드만 존재합니다.

(TypeScript) TypeScript SDK는 태그된 유니온을 사용합니다. event.type을 기준으로 매칭하면 data 페이로드가 자동으로 올바른 형태로 좁혀집니다.

세션이 시작되기 전에 구독

세션은 만들기 또는 다시 시작 호출이 반환되기 전에 이벤트를 내보낼 수 있습니다. 에이전트가 이미 작업 중일 수 있으며—특히 continuePendingWork로 재개하는 경우에는 더욱 그렇고—getMessages와 같은 일시적 이벤트는 세션 로그에 절대 기록되지 않으므로, session.idle는 나중에 이를 복구할 수 없습니다. 세션 핸들이 생성된 후에 설치된 구독은 해당 시작 시점을 놓치게 됩니다.

팁

(Rust)Client::prepare_session 프로토콜 Client::prepare_resume_session 활동이 발생하기 전에 세션의 이벤트 채널을 소유하는 값을 반환 PreparedSession 합니다. 먼저 구독한 다음 start()을(를) 호출합니다.

use github_copilot_sdk::{Client, SessionConfig};

async fn create_without_missing_startup_events(
    client: &Client,
) -> Result<(), github_copilot_sdk::Error> {
    let prepared = client.prepare_session(
        SessionConfig::default().with_event_buffer_capacity(2048),
    )?;

    // Installed before any wire activity: nothing is dropped for lack of a receiver.
    let mut events = prepared.subscribe();
    tokio::spawn(async move {
        while let Ok(event) = events.recv().await {
            println!("{}", event.event_type);
        }
    });

    let session = prepared.start().await?;
    let _ = session;
    Ok(())
}

prepare_* 는 동기적이며 불활성입니다. 버퍼 용량의 유효성을 검사하고 로컬 채널을 할당하며 다른 작업은 수행하지 않습니다. 세션은 등록되지 않으며 start()이 처음 폴링되기 전까지는 CLI에 아무것도 도달하지 않습니다. 시작되지 않은 준비된 세션을 폐기해도 어떤 상태도 남기지 않고 해당 구독을 종료합니다. start() future를 폐기하면 진행 중인 시작 작업이 취소되고 세션 등록이 해제되므로, 동일한 세션 ID로 다시 시도해도 성공합니다. 정리 작업은 중단된 시작 작업이 소유했던 바로 그 등록 항목에만 한정되므로, 동일한 세션 ID를 이미 이어받은 재시도를 제거할 수 없습니다.

초기 버퍼링은 미리 대비할 가치가 있습니다.

  • 이벤트 버퍼는 유한하며, event_buffer_capacity가 이를 재정의하지 않는 한 512개 이벤트로 제한됩니다. 0 용량이 고정되지 않고 잘못된 구성 오류로 거부됩니다.
  • 느린 구독자에게는 건너뛴 이벤트 수를 보고하는 Lagged 오류가 표시됩니다. 세션의 이벤트 루프에는 역압을 적용하지 않습니다.
  • 시작 시 대규모 버스트를 데이터 손실 없이 확인해야 하는 소비자는 해당 버스트를 감당할 수 있는 용량을 구성하거나 start()와 동시에 구독의 데이터를 소진해야 합니다.

참고

서버가 세션 ID를 할당하는 클라우드 세션의 경우 SDK는 만들기 응답이 도착하고 ID가 알려지게 될 때까지 알림을 라우팅할 수 없습니다. 해당 지점 이전에 내보낸 이벤트는 세션으로 라우팅할 수 없습니다. 보장은 더 좁습니다. 라우트된 이벤트는 설치된 수신기 부족으로 인해 삭제되지 않습니다. 첫 번째 바이트부터 라우팅과 응답 전 전체 적용 범위를 확보하려면 session_id를 구성에 고정하세요.

부모 에이전트 응답만 렌더링

하위 에이전트 이벤트는 상위 세션 스트림을 공유하며, 엔벌로프 수준의 agentId를 포함합니다. 루트/메인 에이전트 이벤트와 세션 수준 이벤트에는 agentId가 포함되지 않으므로, 메인 채팅 렌더러는 agentId가 설정된 assistant 이벤트를 무시하고 대신 해당 이벤트를 트레이스 또는 진행률 UI로 라우팅할 수 있습니다.

코드 언어 navigation

TypeScript
import type { CopilotSession } from "@github/copilot-sdk";

export function subscribeParentResponse(session: CopilotSession): void {
    session.on("assistant.message_delta", (event) => {
        if (!event.agentId) {
            process.stdout.write(event.data.deltaContent);
        }
    });
}

도우미 이벤트

이러한 이벤트는 턴 시작부터 스트리밍 청크를 거쳐 최종 메시지까지 에이전트의 응답 수명 주기를 추적합니다.

assistant.turn_start

에이전트가 턴 처리를 시작할 때 내보내집니다.

데이터 필드TypeRequiredDescription
turnIdstring✅턴 식별자(일반적으로 문자열화된 턴 번호)
interactionIdstring원격 분석 상관 관계에 대한 CAPI 상호 작용 ID

assistant.intent

임시. 에이전트가 현재 수행하는 작업에 대한 간단한 설명이며 작동하면서 업데이트됩니다.

데이터 필드TypeRequiredDescription
intentstring✅사람이 읽을 수 있는 의도(예: "코드베이스 탐색")

assistant.reasoning

모델에서 확장된 사고 블록을 완성합니다. 추론이 완료된 후 내보냅니다.

데이터 필드TypeRequiredDescription
reasoningIdstring✅이 추론 블록의 고유 식별자
contentstring✅확장된 사고 전체 텍스트

assistant.reasoning_delta

임시. 실시간으로 스트리밍되는 모델의 확장된 사고의 증분 조각.

데이터 필드TypeRequiredDescription
reasoningIdstring✅해당 이벤트와 일치 assistant.reasoning
deltaContentstring✅추론 콘텐츠에 추가할 텍스트 청크

assistant.message

이 LLM 호출에 대한 도우미의 전체 응답입니다. 도구 호출 요청을 포함할 수 있습니다.

데이터 필드TypeRequiredDescription
messageIdstring✅이 메시지의 고유 식별자
contentstring✅도우미의 텍스트 응답
toolRequestsToolRequest[]도우미가 수행하려는 도구 호출(아래 참조)
reasoningOpaquestring암호화된 확장 사고(인류 모델); 세션 바인딩
reasoningTextstring확장된 사고에서 읽을 수 있는 추론 텍스트
encryptedContentstring암호화된 추론 콘텐츠(OpenAI 모델); 세션 바인딩
phasestring생성 단계(예: "thinking" 대 "response")
outputTokensnumberAPI 응답의 실제 출력 토큰 수
interactionIdstring원격 분석에 대한 CAPI 상호 작용 ID
parentToolCallIdstringDeprecated. 하위 에이전트 귀속에 엔벌로프 수준 agentId 사용

** ToolRequest 필드:**

FieldTypeRequiredDescription
toolCallIdstring✅이 도구 호출의 고유 ID
namestring✅도구 이름(예: , "bash", "edit"``"grep")
argumentsobject구문 분석된 도구의 인수
type"function" | "custom"호출 유형; 없는 경우 기본값은 "function" 입니다.

assistant.message_delta

임시. 실시간으로 스트리밍되는 도우미 텍스트 응답의 증분 조각.

데이터 필드TypeRequiredDescription
messageIdstring✅해당 이벤트와 일치 assistant.message
deltaContentstring✅메시지에 추가할 텍스트 청크
parentToolCallIdstringDeprecated. 하위 에이전트 귀속에 엔벌로프 수준 agentId 사용

assistant.turn_end

에이전트가 턴을 완료할 때 내보내집니다(모든 도구 실행이 완료되고 최종 응답이 전달됨).

데이터 필드TypeRequiredDescription
turnIdstring✅해당 이벤트와 일치 assistant.turn_start

assistant.usage

임시. 개별 API 호출에 대한 토큰 사용량 및 비용 정보입니다.

데이터 필드TypeRequiredDescription
modelstring✅모델 식별자(예: "gpt-5.4")
inputTokensnumber사용된 입력 토큰
outputTokensnumber생성된 출력 토큰
reasoningTokensnumber추론/사고 과정에 사용되는 출력 토큰 (outputTokens의 일부)
cacheReadTokensnumber프롬프트 캐시에서 읽은 토큰
cacheWriteTokensnumber프롬프트 캐시에 기록된 토큰
cacheExpiresAtstring이 모델 호출의 프롬프트 캐시가 만료되는 시점의 ISO 8601 타임스탬프
contentFilterTriggeredboolean콘텐츠 필터링에 의해 응답이 차단되었는지 또는 잘렸는지 여부(finish_reason === 'content_filter')
finishReasonstring모델 완료 이유(예: "stop", "length", "tool_calls", "content_filter")
costnumber비용 청구를 위한 모델 승수 비용
durationnumberAPI 호출 기간(밀리초)
timeToFirstTokenMsnumber요청 디스패치에서 받은 첫 번째 토큰까지의 시간(스트리밍 대기 시간)
interTokenLatencyMsnumber연속 토큰 간의 평균 대기 시간(스트리밍 처리량)
reasoningEffortstring이 호출에 사용되는 추론 작업 수준(예: "low", , "medium"``"high")
initiatorstring이 호출을 발생시킨 항목(예: "sub-agent"); 사용자가 시작한 경우에는 없음
apiCallIdstring공급자의 완료 ID(예: chatcmpl-abc123)
serviceRequestIdstringCAPI 로그 상관 관계에 대한 Copilot 서비스 요청 ID(x-copilot-service-request-id)
apiEndpoint"/chat/completions" | "/v1/messages" | "/responses" | "ws:/responses"
모델 호출에 사용되는 API 엔드포인트; 는 관찰 가능성 및 비용 특성에 유용합니다.
ws:/responses 는 응답 API의 websocket 변형입니다.
providerCallIdstringGitHub 요청 추적 ID(x-github-request-id)
parentToolCallIdstringDeprecated. 하위 에이전트 귀속에 엔벌로프 수준 agentId 사용
quotaSnapshotsRecord<string, QuotaSnapshot>할당량별 리소스 사용량( 할당량 식별자 키 지정)
copilotUsageCopilotUsageAPI의 항목별 토큰 비용 분석

assistant.streaming_delta

임시. 낮은 수준의 네트워크 진행률 표시기 - 스트리밍 API 응답에서 받은 총 바이트 수입니다.

데이터 필드TypeRequiredDescription
totalResponseSizeBytesnumber✅지금까지 받은 누적 바이트

도구 실행 이벤트

이러한 이벤트는 실행부터 완료까지 도구 호출을 요청하는 모델에서 각 도구 호출의 전체 수명 주기를 추적합니다.

tool.execution_start

도구 실행을 시작할 때 내보냅니다.

데이터 필드TypeRequiredDescription
toolCallIdstring✅이 도구 호출에 대한 고유 식별자
toolNamestring✅도구의 이름(예: "bash", , "edit"``"grep")
argumentsobject구문 분석된 인수가 도구에 전달됨
mcpServerNamestringMCP 서버에서 도구를 제공하는 경우 MCP 서버 이름
mcpToolNamestringMCP 서버의 원래 도구 이름
parentToolCallIdstringDeprecated. 하위 에이전트 귀속에 엔벌로프 수준 agentId 사용

tool.execution_partial_result

Deprecated. tool.shell_output를 라이브 터미널 출력에 사용합니다. 이 임시 이벤트는 마이그레이션 중에 교체와 함께 계속 내보내집니다. 동일한 출력을 두 번 표시하지 않도록 하나의 표현만 구독하세요.

데이터 필드TypeRequiredDescription
toolCallIdstring✅해당 항목과 일치 tool.execution_start
partialOutputstring✅stdout 및 stderr가 병합된 제한된 누적 교체 스냅샷; 추가 전용 청크가 아님

tool.shell_output

임시. 연결된 터미널 명령 또는 사용자가 요청한 터미널 명령의 추가 전용 출력입니다. 각 이벤트에는 모델의 최종 도구 결과의 서식을 지정하는 데 사용되는 구분 기호 또는 표식이 없는 새로 관찰된 비밀이 필터링된 텍스트가 포함됩니다.

데이터 필드TypeRequiredDescription
toolCallIdstring✅원래 도구 호출을 식별합니다.
textstring✅대체 스냅샷이 아닌 추가할 새 텍스트
stream"stdout" | "stderr" | "terminal"
출력 원본; 생략됨은 "stdout"를 의미합니다.
"terminal" 는 stdout/stderr 원본을 복구할 수 없는 본질적으로 병합된 PTY 출력을 식별합니다.
sequencenumber✅0부터 시작하여 관찰된 게시 순서로 이 도구 호출의 모든 스트림에서 증가합니다.

text toolCallId 및 stream별로 개별적으로 누적하거나, 결합된 표시를 위해 청크를 순서대로 조인합니다. 시퀀스 번호는 중복된 청크 및 누락된 청크를 식별합니다. 독립 운영 체제 쓰기 간에 정확한 순서를 설정하지 않습니다. 늦은 구독자는 0보다 큰 첫 번째 시퀀스를 받을 수 있습니다.

이러한 이벤트는 라이브 전용입니다. 다시 시작 후 저장되거나 재생되지 않습니다. 최종 tool.execution_complete 결과, 모델 대상 서식 및 분리된 명령 캡처는 변경되지 않습니다. 텍스트는 터미널 컨트롤 시퀀스를 포함할 수 있습니다. 렌더러는 각 렌더러의 일반적인 터미널 텍스트 처리를 적용해야 합니다.

연결된 터미널 명령은 비동기적으로 실행되거나 tool.execution_complete을(를) 넘어 계속되는 경우 initial_wait 이후에도 계속 실행될 수 있습니다. 계속하는 동안 받은 출력은 0부터 다시 시작하는 대신 원래의 toolCallId 및 동일한 sequence를 사용합니다. 활성 호출만 표시하는 소비자는 완료된 호출 상태를 다시 만드는 대신 완료 후 받은 청크를 무시해야 합니다.

비밀 필터링은 디코딩된 각 청크에 대해 작동합니다. 런타임은 줄을 인위적으로 나누지 않지만 운영 체제 읽기는 줄 또는 비밀을 청크 간에 나눌 수 있습니다. 청크 간 비밀 재구성은 제공되지 않습니다.

tool.execution_progress

임시. 실행 중인 도구에서 사람이 읽을 수 있는 진행 상태(예: MCP 서버 진행률 알림).

데이터 필드TypeRequiredDescription
toolCallIdstring✅해당 항목과 일치 tool.execution_start
progressMessagestring✅진행 상태 메시지

tool.execution_complete

도구 실행이 성공적으로 또는 오류와 함께 완료될 때 내보냅니다.

데이터 필드TypeRequiredDescription
toolCallIdstring✅해당 항목과 일치 tool.execution_start
successboolean✅실행 성공 여부
modelstring이 도구 호출을 생성한 모델
interactionIdstringCAPI 상호 작용 ID
isUserRequestedboolean
true 사용자가 이 도구 호출을 명시적으로 요청한 경우
resultResult성공 시, 그리고 도구가 오류와 함께 콘텐츠를 반환한 경우의 실패 시 표시(아래 참조)
error{ message, code? }실패 시 표시됨
toolTelemetryobject도구별 텔레메트리(예: CodeQL 검사 수)
parentToolCallIdstringDeprecated. 하위 에이전트 귀속에 엔벌로프 수준 agentId 사용

** Result 필드:**

FieldTypeRequiredDescription
contentstring✅LLM으로 전송된 간결한 결과(토큰 효율성을 위해 잘려질 수 있음)
detailedContentstring전체 표시 결과, diffs와 같은 전체 콘텐츠 유지
contentsContentBlock[]구조적 콘텐츠 블록(텍스트, 터미널, 이미지, 오디오, 리소스)

tool.user_requested

사용자가 도구 호출을 명시적으로 요청할 때 내보내집니다(모델이 호출하도록 선택하는 대신).

데이터 필드TypeRequiredDescription
toolCallIdstring✅이 도구 호출에 대한 고유 식별자
toolNamestring✅사용자가 호출하려는 도구의 이름
argumentsobject호출에 대한 인수

세션 수명 주기 이벤트

session.idle

임시. 에이전트가 모든 처리를 완료했으며 다음 메시지를 준비했습니다. 이는 턴이 완전히 완료되었다는 신호입니다.

데이터 필드TypeRequiredDescription
abortedboolean중단 신호를 통해 이전 턴이 취소된 경우 True입니다.

session.error

세션 처리 중에 오류가 발생했습니다.

데이터 필드TypeRequiredDescription
errorTypestring✅오류 범주(예: , "authentication", "quota"``"rate_limit")
messagestring✅사람이 읽을 수 있는 오류 메시지
stackstring오류 스택 추적
statusCodenumber업스트림 요청의 HTTP 상태 코드
providerCallIdstring서버 쪽 로그 상관 관계에 대한 GitHub 요청 추적 ID

session.compaction_start

컨텍스트 창 압축이 시작되었습니다. 데이터 페이로드가 비어 있습니다({}).

session.compaction_complete

컨텍스트 창 압축이 완료되었습니다.

데이터 필드TypeRequiredDescription
successboolean✅압축 성공 여부
errorstring압축에 실패한 경우 오류 메시지
preCompactionTokensnumber압축 전 토큰
postCompactionTokensnumber압축 후 토큰
preCompactionMessagesLengthnumber압축 전 메시지 수
messagesRemovednumber제거된 메시지
tokensRemovednumber제거된 토큰
summaryContentstring압축된 기록의 LLM 생성 요약
checkpointNumbernumber복구를 위해 만든 검사점 스냅샷 번호
checkpointPathstring검사점이 저장된 파일 경로
compactionTokensUsed{ input, output, cachedInput }압축 LLM 호출에 대한 토큰 사용량
requestIdstring컴팩션 호출에 대한 GitHub 요청 추적 ID

session.title_changed

임시. 세션의 자동 생성된 타이틀이 업데이트되었습니다.

데이터 필드TypeRequiredDescription
titlestring✅새 세션 제목

session.context_changed

세션의 작업 디렉터리 또는 리포지토리 컨텍스트가 변경되었습니다.

데이터 필드TypeRequiredDescription
cwdstring✅현재 작업 디렉터리
gitRootstringGit 리포지토리 루트
repositorystring형식의 "owner/name" 리포지토리
branchstring현재 Git 브랜치

session.usage_info

임시. 컨텍스트 창 사용률 스냅샷

데이터 필드TypeRequiredDescription
tokenLimitnumber✅모델의 컨텍스트 창에 대한 최대 토큰
currentTokensnumber✅컨텍스트 창의 현재 토큰
messagesLengthnumber✅대화의 현재 메시지 수

session.session_limits_changed

현재 회계 기간의 세션 제한이 변경되었습니다. 값은 null``sessionLimits 제한이 활성화되지 않음을 의미합니다.

데이터 필드TypeRequiredDescription
sessionLimitsSessionLimitsConfig | null✅현재 세션 제한 또는 제한이 활성화되어 있지 않은 경우 null
sessionLimits.maxAiCreditsnumber세션의 현재 회계 기간 동안 허용되는 최대 AI 크레딧

session.usage_checkpoint

세션이 다시 시작될 때 회계를 다시 구성하는 데 사용되는 지속성 집계 사용 검사점입니다.

데이터 필드TypeRequiredDescription
totalNanoAiunumber✅체크포인트 시점의 세션 전반에 걸쳐 누적된 나노-AI 단위 비용
totalPremiumRequestsnumber검사점 시간에 사용된 총 프리미엄 API 요청 수

session.task_complete

에이전트가 할당된 작업을 완료했습니다.

데이터 필드TypeRequiredDescription
summarystring완료된 작업의 요약

session.shutdown

세션이 종료되었습니다.

데이터 필드TypeRequiredDescription
shutdownType"routine" | "error"✅정상적인 종료 또는 충돌
errorReasonstring
shutdownType이 "error"일 때 오류 설명
totalPremiumRequestsnumber✅사용된 총 프리미엄 API 요청
totalApiDurationMsnumber✅누적 API 호출 시간(밀리초)
sessionStartTimenumber✅세션이 시작된 때의 Unix 타임스탬프(ms)
codeChanges{ linesAdded, linesRemoved, filesModified }✅집계 코드 변경 메트릭
modelMetricsRecord<string, ModelMetric>✅모델별 사용량 분석
currentModelstring종료 시 선택한 모델

권한 및 사용자 입력 이벤트

이러한 이벤트는 에이전트가 계속하기 전에 사용자의 승인 또는 입력이 필요할 때 내보내집니다.

permission.requested

에이전트는 작업을 수행할 수 있는 권한이 필요합니다(명령 실행, 파일 쓰기 등).

데이터 필드TypeRequiredDescription
requestIdstring✅이를 통해 응답하세요. session.respondToPermission()
permissionRequestPermissionRequest✅요청되는 권한의 세부 정보

permissionRequest는 kind에 대한 구별된 합집합입니다.

kind핵심 필드Description
"shell"
fullCommandText, intention, , commands[], possiblePaths[]셸 명령 실행
"write"
fileName, diff, intention, newFileContents?``fileEdits?파일 쓰기/수정
"read"
path, intention파일 또는 디렉터리 읽기
"mcp"
serverName, toolName, toolTitle, args?``readOnlyMCP 도구 호출
"url"
url, intentionURL 가져오기
"memory"
subject, fact, citations메모리 저장
"custom-tool"
toolName, toolDescription, args?사용자 지정 도구 호출

또한 모든 kind 변형에는 요청을 트리거한 도구 호출에 대한 선택적 toolCallId 연결도 포함됩니다.

쓰기 요청은 promptRequest와 permissionRequest 모두에 fileEdits를 포함할 수도 있습니다. 각 항목에는 선택적 path 및 after 스냅샷이 포함되며, 각 스냅샷에는 세션 파일 시스템 네임스페이스의 절대 content 및 완전한 UTF-8 before가 있습니다. 누락된 before는 생성을 의미하고, 누락된 after는 삭제를 의미합니다. 빈 content 문자열은 사용할 수 없는 미리 보기가 아닌 빈 파일을 나타냅니다. 이동의 두 면에는 서로 다른 경로가 있을 수 있습니다. 이동 작업이 기존 대상을 덮어쓰는 경우 개별 항목은 원본 삭제 및 대상 대체를 설명합니다.

이러한 스냅샷은 라이브 파일 시스템을 나중에 읽은 결과가 아니라 계획된 작업을 설명합니다. 런타임은 샌드박스로 보호된 파일, UTF-8이 아닌 콘텐츠 또는 명명된 파이프와 같이 읽을 수 없거나 일반 파일이 아닌 이동 대상을 읽기 전에 수행한 요청을 포함하여 전체 텍스트 미리 보기를 제공할 수 없는 경우 fileEdits를 생략합니다. 빈 레거시 newFileContents 값에서 삭제를 유추하지 마세요. 미리 보기를 사용하지 않는 소비자는 기존 필드 및 승인 선택을 계속 사용할 수 있습니다.

permission.completed

권한 요청이 해결되었습니다.

데이터 필드TypeRequiredDescription
requestIdstring✅해당 항목과 일치 permission.requested
result.kindstring✅다음 중 하나: "approved", "denied-by-rules", "denied-interactively-by-user", "denied-no-approval-rule-and-could-not-request-from-user"``"denied-by-content-exclusion-policy"

user_input.requested

임시. 에이전트가 사용자에게 질문을 하고 있습니다.

데이터 필드TypeRequiredDescription
requestIdstring✅이를 통해 응답하세요. session.respondToUserInput()
questionstring✅사용자에게 제시할 질문
choicesstring[]사용자에 대해 미리 정의된 선택
allowFreeformboolean자유 형식 텍스트 입력 허용 여부

user_input.completed

임시. 사용자 입력 요청이 확인되었습니다.

데이터 필드TypeRequiredDescription
requestIdstring✅해당 항목과 일치 user_input.requested

elicitation.requested

임시. 에이전트에는 사용자의 구조적 양식 입력이 필요합니다(MCP 유도 프로토콜).

데이터 필드TypeRequiredDescription
requestIdstring✅이를 통해 응답하세요. session.respondToElicitation()
messagestring✅필요한 정보에 대한 설명
mode"form"유도 모드(현재는 "form"만 가능)
requestedSchema{ type: "object", properties, required? }✅양식 필드를 설명하는 JSON 스키마

elicitation.completed

임시. 유도 요청이 해결되었습니다.

데이터 필드TypeRequiredDescription
requestIdstring✅해당 항목과 일치 elicitation.requested

하위 에이전트 및 기술 이벤트

subagent.started

사용자 지정 에이전트가 하위 에이전트로 호출되었습니다.

데이터 필드TypeRequiredDescription
toolCallIdstring✅이 하위 에이전트를 생성한 부모 도구 호출
agentNamestring✅하위 에이전트의 내부 이름
agentDisplayNamestring✅사람이 읽을 수 있는 표시 이름
agentDescriptionstring✅하위 에이전트가 수행하는 작업 설명
modelstring하위 에이전트가 실행될 모델(시작 시 알려진 경우)

subagent.completed

하위 에이전트가 성공적으로 완료되었습니다.

데이터 필드TypeRequiredDescription
toolCallIdstring✅해당 항목과 일치 subagent.started
agentNamestring✅내부 이름
agentDisplayNamestring✅표시 이름
modelstring하위 에이전트에서 사용하는 모델
durationMsnumber벽시계 실행 기간(밀리초)
totalTokensnumber사용된 총 입력 및 출력 토큰
totalToolCallsnumber총 도구 호출 수

subagent.failed

하위 에이전트에 오류가 발생했습니다.

데이터 필드TypeRequiredDescription
toolCallIdstring✅해당 항목과 일치 subagent.started
agentNamestring✅내부 이름
agentDisplayNamestring✅표시 이름
errorstring✅오류 메시지
modelstring하위 에이전트에 대해 선택된 모델(알려진 경우)
durationMsnumber벽시계 실행 기간(밀리초)
totalTokensnumber실패하기 전에 사용된 총 입력 및 출력 토큰
totalToolCallsnumber실패하기 전에 수행한 총 도구 호출

subagent.selected

현재 요청을 처리하기 위해 사용자 지정 에이전트를 선택(유추)했습니다.

데이터 필드TypeRequiredDescription
agentNamestring✅선택한 에이전트의 내부 이름
agentDisplayNamestring✅표시 이름
toolsstring[] | null✅이 에이전트에서 사용할 수 있는 도구 이름; null 모든 도구에 대해

subagent.deselected

사용자 지정 에이전트가 선택 취소되어 기본 에이전트로 돌아갑니다. 데이터 페이로드가 비어 있습니다({}).

skill.invoked

현재 대화에 대한 기술이 활성화되었습니다.

데이터 필드TypeRequiredDescription
namestring✅기술 이름
pathstring✅SKILL.md 정의에 대한 파일 경로
contentstring✅기술 콘텐츠 전체가 대화에 삽입됨
allowedToolsstring[]스킬의 allowed-tools 프런트매터에 나열된 도구입니다. SDK는 이를 자동으로 승인하지 않습니다. 사용 권한 처리기는 여전히 이를 승인할지 여부를 결정합니다. Copilot CLI는 스킬이 활성화된 동안 해당 항목을 자동으로 승인합니다.
pluginNamestring스킬이 기원한 플러그인
pluginVersionstring플러그 인 버전

기타 이벤트

abort

현재 턴이 중단되었습니다.

데이터 필드TypeRequiredDescription
reasonstring✅턴이 중단된 이유(예: "user initiated")

user.message

사용자가 메시지를 보냈습니다. 세션 타임라인을 위해 기록됩니다.

데이터 필드TypeRequiredDescription
contentstring✅사용자의 메시지 텍스트
transformedContentstring전처리 후 변환된 버전
attachmentsAttachment[]파일, 디렉터리, 선택 영역, Blob 또는 GitHub 참조 첨부 파일
sourcestring메시지 원본 식별자
agentModestring에이전트 모드: "interactive", "plan", "autopilot"또는 "shell"
interactionIdstringCAPI 상호 작용 ID

system.message

시스템 또는 개발자 프롬프트가 대화에 삽입되었습니다.

데이터 필드TypeRequiredDescription
contentstring✅프롬프트 텍스트
role"system" | "developer"✅메시지 역할
namestring원본 식별자
metadata{ promptVersion?, variables? }프롬프트 템플릿 메타데이터

external_tool.requested

에이전트는 외부 도구(SDK 소비자가 제공하는 도구)를 호출하려고 합니다.

데이터 필드TypeRequiredDescription
requestIdstring✅이를 통해 응답하세요. session.respondToExternalTool()
sessionIdstring✅이 요청이 속한 세션
toolCallIdstring✅이 호출에 대한 도구 호출 ID
toolNamestring✅외부 도구의 이름
argumentsobject도구의 인수

external_tool.completed

외부 도구 요청이 확인되었습니다.

데이터 필드TypeRequiredDescription
requestIdstring✅해당 항목과 일치 external_tool.requested

exit_plan_mode.requested

임시. 에이전트가 계획을 만들고 계획 모드를 종료하려고 합니다.

데이터 필드TypeRequiredDescription
requestIdstring✅이를 통해 응답하세요. session.respondToExitPlanMode()
summarystring✅계획 요약
planContentstring✅전체 계획 파일 콘텐츠
actionsstring[]✅사용 가능한 사용자 작업(예: 승인, 편집, 거부)
recommendedActionstring✅권장 작업

exit_plan_mode.completed

임시. 종료 계획 모드 요청이 해결되었습니다.

데이터 필드TypeRequiredDescription
requestIdstring✅해당 항목과 일치 exit_plan_mode.requested

command.queued

임시. 슬래시 명령이 실행을 위해 큐에 대기되었습니다.

데이터 필드TypeRequiredDescription
requestIdstring✅이를 통해 응답하세요. session.respondToQueuedCommand()
commandstring✅슬래시 명령 텍스트(예: /help, /clear)

command.completed

임시. 큐에 대기된 명령이 해결되었습니다.

데이터 필드TypeRequiredDescription
requestIdstring✅해당 항목과 일치 command.queued

session_limits_exhausted.requested

임시. 현재 세션 예산이 소진되었으며 계속하기 전에 런타임에 사용자 결정이 필요합니다.

데이터 필드TypeRequiredDescription
requestIdstring✅보류 중인 고갈 제한 요청에 응답할 때 이 ID 사용
maxAiCreditsnumber✅현재 회계 창에 대해 구성된 최대 AI 크레딧
usedAiCreditsnumber✅현재 집계 기간에 이미 소진된 AI 크레딧

session_limits_exhausted.completed

임시. 대기 중인 한도 초과 요청이 해결되었습니다.

데이터 필드TypeRequiredDescription
requestIdstring✅해당 이벤트와 일치 session_limits_exhausted.requested
response.action"add" | "set" | "unset" | "cancel"✅고갈된 제한 요청에 대해 선택한 작업
response.additionalAiCreditsnumber
response.action이(가) "add"일 때 현재 최대치에 추가할 AI 크레딧
response.maxAiCreditsnumber
response.action이(가) "set"일 때의 새로운 절대 최대 AI 크레딧

빠른 참조: 에이전시적 단계 흐름

일반적인 에이전트 동작은 다음 순서로 이벤트를 발생시킵니다.

assistant.turn_start          → Turn begins
├── assistant.intent          → What the agent plans to do (ephemeral)
├── assistant.reasoning_delta → Streaming thinking chunks (ephemeral, repeated)
├── assistant.reasoning       → Complete thinking block
├── assistant.message_delta   → Streaming response chunks (ephemeral, repeated)
├── assistant.message         → Complete response (may include toolRequests)
├── assistant.usage           → Token usage for this API call (ephemeral)
│
├── [If tools were requested:]
│   ├── permission.requested  → Needs user approval
│   ├── permission.completed  → Approval result
│   ├── tool.execution_start  → Tool begins
│   ├── tool.shell_output              → Stream-tagged terminal output (ephemeral, repeated)
│   ├── tool.execution_progress        → Progress updates (ephemeral, repeated)
│   ├── tool.execution_complete        → Tool finished
│   │
│   └── [Agent loops: more reasoning → message → tool calls...]
│
assistant.turn_end            → Turn complete
session.idle                  → Ready for next message (ephemeral)

모든 이벤트 유형 한눈에 보기

이 표에는 키 data 페이로드 필드가 나열됩니다. 일반적인 봉투 필드는 위에 설명되어 있습니다.

이벤트 유형임시카테고리키 데이터 필드
assistant.turn_start
도우미
turnId, interactionId?
assistant.intent✅도우미intent
assistant.reasoning
도우미
reasoningId, content
assistant.reasoning_delta✅도우미
reasoningId, deltaContent
assistant.streaming_delta✅도우미totalResponseSizeBytes
assistant.message
도우미
messageId, content, toolRequests?, outputTokens?``phase?
assistant.message_delta✅도우미
messageId, deltaContent
assistant.turn_end도우미turnId
assistant.usage✅도우미
model, apiEndpoint?, inputTokens?, outputTokens?, cost?``duration?
tool.user_requested
Tool
toolCallId, toolName, arguments?
tool.execution_start
Tool
toolCallId, toolName, , arguments?, mcpServerName?
tool.execution_partial_result✅Tool
toolCallId, partialOutput
tool.shell_output✅Tool
toolCallId, text, , stream?, sequence
tool.execution_progress✅Tool
toolCallId, progressMessage
tool.execution_complete
Tool
toolCallId, success, , result?, error?
session.idle✅Sessionaborted?
session.error
Session
errorType, message, statusCode?
session.compaction_start
Session
(비어 있음)
session.compaction_complete
Session
success, preCompactionTokens?, summaryContent?
session.title_changed✅Sessiontitle
session.context_changed
Session
cwd, gitRoot?, , repository?, branch?
session.usage_info✅Session
tokenLimit, currentTokens, messagesLength
session.session_limits_changedSessionsessionLimits
session.usage_checkpoint
Session
totalNanoAiu, totalPremiumRequests?
session.task_completeSessionsummary?
session.shutdown
Session
shutdownType, codeChanges, modelMetrics
permission.requested
허가
requestId, permissionRequest
permission.completed
허가
requestId, result.kind
user_input.requested✅사용자 입력
requestId, question, choices?
user_input.completed✅사용자 입력requestId
elicitation.requested✅사용자 입력
requestId, message, requestedSchema
elicitation.completed✅사용자 입력requestId
subagent.started
하위 에이전트
toolCallId, agentName, , agentDisplayName, model?
subagent.completed
하위 에이전트
toolCallId, agentName, agentDisplayName, model?, durationMs?, totalTokens?``totalToolCalls?
subagent.failed
하위 에이전트
toolCallId, agentName, error, model?, durationMs?, totalTokens?``totalToolCalls?
subagent.selected
하위 에이전트
agentName, agentDisplayName, tools
subagent.deselected
하위 에이전트
(비어 있음)
skill.invoked
기술
name, path, , content, allowedTools?
abort제어reason
user.message
사용자
content, attachments?, agentMode?
system.message
System
content, role
external_tool.requested
외부 도구
requestId, toolName, arguments?
external_tool.completed외부 도구requestId
command.queued✅Command
requestId, command
command.completed✅CommandrequestId
session_limits_exhausted.requested✅Session
requestId, maxAiCredits, usedAiCredits
session_limits_exhausted.completed✅Session
requestId, response.action
exit_plan_mode.requested✅계획 모드
requestId, summary, , planContent, actions
exit_plan_mode.completed✅계획 모드requestId