본문 바로가기

Claude API 스트리밍 응답 — SSE로 실시간 출력 받기

긴 응답을 빈 화면에서 기다리지 마세요. stream:true와 SDK로 응답을 조각조각 받아 바로 보여주는 스트리밍을, 이벤트 흐름과 주의점까지 정리합니다.

글갱신

Claude API로 긴 답변을 받을 때, 전부 완성될 때까지 빈 화면에서 기다리면 사용자 경험이 나빠지고 연결이 끊길 위험도 있습니다. 스트리밍은 응답을 만들어지는 대로 조각조각 받아 바로 보여주는 방식입니다. 이 글은 Claude API 스트리밍을 켜는 법과 이벤트 흐름을 정리합니다. (공식 문서: platform.claude.com/docs · 기준 시점: 2026년 9월, streaming 문서 재대조)

🟢 현행 모델 라인업 일치 · 모델 안내 · Fable 구독 안내
🟢 현행 모델 라인업 일치 · Claude Opus 5.5 / Claude Sonnet 5 / Claude Haiku 4.5 (상위 티어: Claude Fable 5.1). 이 안내는 새 모델이 출시될 때만 바뀝니다.

Fable 5·5.1 구독 안내(2026년 9월 7일 갱신): 2026년 9월 1일 출시된 Claude Fable 5.1이 현행 Fable 모델이고, Fable 5는 레거시로 전환됐습니다. 구독 조건은 두 모델이 같습니다 — Max·Team Premium 플랜은 주간 사용 한도의 50% 범위에서 포함되고, Pro·Team Standard 플랜은 사용량 크레딧(입력 100만 토큰당

🟢 현행 모델 라인업 일치 · Claude Opus 5.5 / Claude Sonnet 5 / Claude Haiku 4.5 (상위 티어: Claude Fable 5.1). 이 안내는 새 모델이 출시될 때만 바뀝니다.
0, 출력 $50)으로 이용합니다. 일회성
🟢 현행 모델 라인업 일치 · Claude Opus 5.5 / Claude Sonnet 5 / Claude Haiku 4.5 (상위 티어: Claude Fable 5.1). 이 안내는 새 모델이 출시될 때만 바뀝니다.
00 크레딧은 Fable 5 전환 당시에만 지급됐고 5.1에는 없습니다. 일부 코딩·디버깅 요청은 보안 분류기에 의해 Opus 모델로 대체 응답될 수 있습니다(두 모델 공통). 자세한 내용은 Fable 5.1 가이드와 Fable 5 재개 안내를 참조하세요.

한꺼번에 vs 토막토막 즉시비스트리밍전부 만들어질 때까지빈 화면에서 대기→ 첫 글자까지 오래 걸림스트리밍 (SSE)만들어지는 대로조각조각 바로 표시→ 첫 글자가 빨리 나옴총 시간은 비슷해도 체감 속도(첫 응답)가 크게 다릅니다 · 기준 2026.6

스트리밍이란, 왜 쓰나

스트리밍은 서버가 응답을 SSE(server-sent events)로 잘게 나눠 보내고, 클라이언트가 도착하는 대로 처리하는 방식입니다. 다음 상황에서 특히 유용합니다.

  • 채팅 UI — 타이핑되듯 글자가 흐르면 체감 속도가 빨라집니다.
  • 긴 출력 — 큰 max_tokens 응답은 한 번에 기다리면 타임아웃·연결 끊김 위험이 있어, 스트리밍이 권장됩니다.
  • 중간 표시 — 진행 상황을 즉시 보여줘야 할 때.

켜는 법: stream true

요청에 "stream": true를 넣으면 됩니다. curl 예시:

curl https://api.anthropic.com/v1/messages \
  -H "x-api-key: $ANTHROPIC_API_KEY" \
  -H "anthropic-version: 2023-06-01" \
  -H "content-type: application/json" \
  -d '{"model":"<모델 ID>","max_tokens":256,"messages":[{"role":"user","content":"안녕"}],"stream":true}'

모델 ID는 변동되므로 모델 ID와 버전 관리 글과 공식 문서로 확인하세요.

SDK로 더 쉽게

공식 Python·TypeScript SDK는 스트리밍 헬퍼를 제공합니다. Python 예시(텍스트만 흘려 받기):

import anthropic
client = anthropic.Anthropic()
with client.messages.stream(
    max_tokens=1024,
    messages=[{"role": "user", "content": "안녕"}],
    model="<모델 ID>",
) as stream:
    for text in stream.text_stream:
        print(text, end="", flush=True)

조각을 직접 다룰 필요가 없다면, SDK가 내부적으로 스트리밍하면서 완성된 Message 객체를 돌려주는 방법도 있습니다(예: Python get_final_message(), TypeScript finalMessage()). SDK 기본기는 SDK 시작하기를 참고하세요.

스트리밍 이벤트의 흐름message_start빈 메시지로 시작content_block_delta (반복)텍스트가 조각으로 도착block_start … delta … block_stopmessage_delta마무리 정보message_stop끝중간에 ping 이벤트가 섞일 수 있음 · 정확한 이벤트 종류는 공식 문서 확인 · 기준 2026.6

이벤트 흐름 이해하기

직접 API를 연동한다면 이벤트를 스스로 처리해야 합니다. 한 번의 스트림은 대략 이렇게 흐릅니다.

  • message_start — 빈 내용의 Message 객체로 시작
  • 콘텐츠 블록들 — 각 블록은 content_block_start → content_block_delta(여러 번) → content_block_stop
  • message_delta — 마무리 단계의 변경 정보
  • message_stop — 종료

한 가지 새로 알아둘 점: 요청이 보안 분류기 등으로 다른 모델에 대체 응답(서버 측 폴백)되면, 모델이 바뀌는 경계마다 델타 없이 content_block_start/content_block_stop 쌍만 오는 fallback 콘텐츠 블록이 스트림에 끼어듭니다(2026년 9월 공식 문서. 실제 응답 모델 정보는 thinking-binding-controls-2026-08-01 베타 헤더를 쓸 때 마지막 message_delta에 실립니다). 블록 타입을 확인하지 않고 텍스트만 이어붙이는 코드는 이 블록을 무시하면 됩니다.

중간에 ping 이벤트가 섞일 수 있습니다. 텍스트는 content_block_delta 안의 델타로 도착하며, 도구 사용·확장 사고 등은 델타 종류가 다를 수 있으니(예: 부분 JSON, 사고 델타) 공식 이벤트 문서를 함께 확인하세요.

주의할 점

  • 연결 끊김 — 일부 네트워크는 유휴 연결을 끊습니다. 긴 작업은 스트리밍을 쓰고, 재시도 로직을 준비하세요(공식 SDK는 재시도를 일부 자동 처리).
  • 델타 종류 — 텍스트만 이어붙이면 도구 입력·사고 내용이 누락될 수 있으니, 필요한 델타를 구분해 처리하세요.
  • 모델·이벤트 변동 — 모델 문자열과 이벤트 세부는 바뀔 수 있으니 공식 문서가 기준입니다.

관련 가이드

API 첫 호출은 Claude API 시작하기, 비용 절감(프롬프트 캐싱·배치)은 비용 줄이기, 도구 사용은 Tool Use 가이드를 함께 보세요.

타임아웃(504)·한도(429) 등 에러 처리와 재시도는 에러와 레이트리밋 다루기에서 함께 다룹니다.

추론 과정(thinking)을 켜는 방법은 확장 사고 가이드에서 다룹니다.

모델 ID·이벤트 종류 등 세부 사항은 변동될 수 있으며, 가장 정확한 정보는 공식 문서(platform.claude.com/docs)에서 확인하시기 바랍니다. 본 사이트는 Anthropic 공식 사이트가 아닙니다.

관련 글

이 글이 도움이 됐나요?

이어서 읽어보세요