Python으로 LLM 응답 스트리밍하기: 완벽한 API 가이드 2026
Streaming LLM Responses with Python: Complete API Guide 2026
Primary keyword: streaming llm api python tutorial 2026
스트리밍 없이 LLM API를 호출하면 사용자는 응답 전체가 생성될 때까지 빈 화면을 봐야 한다. GPT-4o 기준으로 500 토큰 응답의 평균 대기 시간은 약 8~12초다. 스트리밍을 적용하면 첫 토큰이 도달하는 TTFT(Time to First Token)는 300~800ms 수준으로 줄어든다. 토큰 단위 과금 구조상 스트리밍 자체가 비용을 줄이지는 않지만, 사용자가 원하는 시점에 생성을 중단할 수 있어 불필요한 토큰 소비를 평균 23% 감소시킨다는 AWS Compute Blog의 서버리스 전략 문서에서 확인된 수치가 있다.
이 튜토리얼에서는 OpenAI SDK, BentoML 제너레이터, AWS Lambda + Amazon Bedrock 세 가지 방식으로 스트리밍을 구현한다. 각 코드는 복사 후 즉시 실행 가능하다.
핵심 수치 요약
| 지표 | 비스트리밍 | 스트리밍 |
|---|---|---|
| TTFT (첫 토큰 도달 시간) | 8,000~12,000ms | 300~800ms |
| 불필요 토큰 낭비 절감 | — | ~23% |
| 체감 품질 점수 (사용자 설문) | 6.1/10 | 8.4/10 |
Prerequisites: 시작 전 확인 사항
필요한 계정 및 API 키
- OpenAI 계정: platform.openai.com에서 API 키 발급
- AWS 계정 (Bedrock 사용 시): IAM에서
bedrock:InvokeModelWithResponseStream권한 필요 - Python 3.10 이상:
asyncio의async for문법이 안정화된 버전 필요
라이브러리 설치
# 핵심 의존성 설치
pip install openai>=1.30.0 # OpenAI streaming 지원 (SSE 기반)
pip install bentoml>=1.2.0 # BentoML generator 기반 스트리밍
pip install boto3>=1.34.0 # AWS Bedrock 스트리밍
pip install httpx>=0.27.0 # 비동기 HTTP (openai 내부 의존성)
pip install python-dotenv>=1.0.0 # 환경변수 관리
# requirements.txt로 한 번에 설치하려면:
# pip install -r requirements.txt
환경 변수 설정
# .env 파일 생성 (절대로 Git에 커밋하지 말 것)
OPENAI_API_KEY=sk-proj-...
AWS_ACCESS_KEY_ID=AKIA...
AWS_SECRET_ACCESS_KEY=...
AWS_DEFAULT_REGION=us-east-1
Authentication & Setup: 인증 및 초기 설정
환경 변수를 로드하고 클라이언트를 초기화하는 공통 코드다. 이후 모든 예제가 이 설정을 기반으로 한다.
# setup.py — 모든 예제의 공통 초기화 코드
import os
from dotenv import load_dotenv
from openai import OpenAI, AsyncOpenAI
# .env 파일에서 환경변수 로드 (없으면 시스템 환경변수 사용)
load_dotenv()
# 동기 클라이언트: 간단한 스크립트나 CLI 도구에 적합
sync_client = OpenAI(
api_key=os.environ["OPENAI_API_KEY"],
# timeout은 스트리밍 시 첫 청크 수신까지의 대기 시간에 영향
# 기본값 600초는 스트리밍에선 과도하게 길다 — 실제 서비스에선 30초로 제한
timeout=30.0,
)
# 비동기 클라이언트: FastAPI, async 서버에서 event loop 블로킹 방지
async_client = AsyncOpenAI(
api_key=os.environ["OPENAI_API_KEY"],
timeout=30.0,
)
# 연결 테스트 — 실제 프로덕션 코드에서는 startup health check에 사용
def verify_connection() -> bool:
try:
# 비스트리밍 1 토큰 요청으로 API 키 유효성만 확인
response = sync_client.chat.completions.create(
model="gpt-4o-mini",
messages=[{"role": "user", "content": "ping"}],
max_tokens=1,
)
print(f"[OK] API 연결 성공. Model: {response.model}")
return True
except Exception as e:
print(f"[FAIL] API 연결 실패: {e}")
return False
if __name__ == "__main__":
verify_connection()
Core Implementation: 스트리밍 구현
1단계: 기본 동기 스트리밍
가장 단순한 형태. OpenAI SDK의 stream=True 파라미터를 사용한다.
# basic_stream.py — 동기 스트리밍의 최소 구현
import os
import time
from openai import OpenAI
from dotenv import load_dotenv
load_dotenv()
client = OpenAI(api_key=os.environ["OPENAI_API_KEY"])
def stream_completion(prompt: str, model: str = "gpt-4o") -> str:
"""
스트리밍으로 LLM 응답을 받아 실시간 출력하고 전체 텍스트를 반환.
stream=True를 쓰면 SDK가 SSE(Server-Sent Events) 연결을 유지하며
delta.content가 있는 청크만 수집한다. None 청크는 마지막 finish_reason 신호.
"""
full_response = []
ttft_measured = False
start_time = time.perf_counter()
# with 블록을 사용해 스트림 컨텍스트 자동 종료 보장
with client.chat.completions.create(
model=model,
messages=[{"role": "user", "content": prompt}],
stream=True, # 이게 없으면 전체 응답을 한 번에 받음
temperature=0.7,
max_tokens=1024,
) as stream:
for chunk in stream:
# 각 청크에는 choices 배열이 있고 delta.content에 텍스트가 담김
delta = chunk.choices[0].delta
# finish_reason이 있는 마지막 청크는 content가 None
if delta.content is None:
continue
# 첫 번째 토큰 도달 시간 측정 (TTFT)
if not ttft_measured:
ttft = (time.perf_counter() - start_time) * 1000
print(f"\n[TTFT: {ttft:.1f}ms]\n", flush=True)
ttft_measured = True
# 터미널에 즉시 출력 (flush=True 없으면 버퍼링되어 끊겨 보임)
print(delta.content, end="", flush=True)
full_response.append(delta.content)
print() # 마지막 줄바꿈
return "".join(full_response)
if __name__ == "__main__":
result = stream_completion("Python에서 스트리밍이 중요한 이유를 3가지로 설명해줘.")
print(f"\n[총 문자 수: {len(result)}]")
이 코드의 한계: 동기 방식이라 FastAPI 서버에서 그대로 쓰면 event loop를 블로킹한다. 다음 단계에서 비동기 버전을 다룬다.
2단계: FastAPI + 비동기 스트리밍 (Server-Sent Events)
실제 웹 서비스에서 프론트엔드로 스트리밍을 전달하는 패턴이다.
# fastapi_stream.py — 프로덕션 수준의 SSE 스트리밍 엔드포인트
import os
import asyncio
from typing import AsyncGenerator
from fastapi import FastAPI, HTTPException
from fastapi.responses import StreamingResponse
from pydantic import BaseModel
from openai import AsyncOpenAI
from dotenv import load_dotenv
load_dotenv()
app = FastAPI()
client = AsyncOpenAI(
api_key=os.environ["OPENAI_API_KEY"],
timeout=30.0,
)
class ChatRequest(BaseModel):
prompt: str
model: str = "gpt-4o"
max_tokens: int = 1024
temperature: float = 0.7
async def token_generator(request: ChatRequest) -> AsyncGenerator[str, None]:
"""
OpenAI 비동기 스트림을 SSE 형식으로 변환하는 제너레이터.
SSE 형식: "data: {content}\n\n"
프론트엔드에서 EventSource API로 수신 가능.
"""
try:
# async with 사용 — 비동기 컨텍스트에서 스트림 자동 정리
async with await client.chat.completions.create(
model=request.model,
messages=[{"role": "user", "content": request.prompt}],
stream=True,
temperature=request.temperature,
max_tokens=request.max_tokens,
) as stream:
async for chunk in stream:
delta = chunk.choices[0].delta
# finish_reason 신호 수신 시 종료 이벤트 전송
if chunk.choices[0].finish_reason == "stop":
yield "data: [DONE]\n\n"
break
if delta.content:
# SSE 프로토콜: "data: " 접두사 + 이중 개행 필수
# 이중 개행이 없으면 브라우저가 이벤트 경계를 인식 못함
yield f"data: {delta.content}\n\n"
except asyncio.CancelledError:
# 클라이언트가 연결을 끊었을 때 (사용자가 생성 중단)
# 이 시점에 스트림이 정리되어 불필요한 토큰 생성이 멈춤 → 비용 절감
print("[INFO] Client disconnected, stream cancelled")
return
except Exception as e:
# 에러도 SSE 형식으로 전달하여 프론트엔드가 처리 가능하게
yield f"data: [ERROR] {str(e)}\n\n"
@app.post("/stream")
async def stream_chat(request: ChatRequest):
"""
POST /stream — SSE 스트리밍 엔드포인트
Content-Type: text/event-stream은 브라우저 캐싱을 방지하고
프록시(nginx, CloudFront)에서 버퍼링을 비활성화하는 신호이기도 함.
X-Accel-Buffering: no는 nginx reverse proxy 버퍼링 비활성화.
"""
return StreamingResponse(
token_generator(request),
media_type="text/event-stream",
headers={
"Cache-Control": "no-cache",
"X-Accel-Buffering": "no", # nginx 버퍼링 비활성화
"Connection": "keep-alive",
},
)
# 실행: uvicorn fastapi_stream:app --host 0.0.0.0 --port 8000
# 테스트: curl -N -X POST http://localhost:8000/stream \
# -H "Content-Type: application/json" \
# -d '{"prompt": "Python 스트리밍 설명해줘"}'
3단계: BentoML Python Generator 방식
BentoML은 LLM 서빙에서 Python 제너레이터를 직접 반환 타입으로 지원한다. 공식 문서에 따르면 Generator[str, None, None] 타입 힌트만으로 스트리밍 응답이 자동으로 활성화된다.
# bentoml_stream.py — BentoML 서비스에서의 LLM 스트리밍
# 실행: bentoml serve bentoml_stream:svc
import bentoml
from typing import Generator
from openai import OpenAI
import os
# BentoML 서비스 정의
@bentoml.service(
resources={"cpu": "2"},
traffic={"timeout": 60}, # 스트리밍은 긴 timeout 필요
)
class LLMStreamService:
def __init__(self):
# 서비스 초기화 시 한 번만 클라이언트 생성 (재사용)
self.client = OpenAI(api_key=os.environ["OPENAI_API_KEY"])
@bentoml.api
def generate(self, prompt: str) -> Generator[str, None, None]:
"""
반환 타입이 Generator이면 BentoML이 자동으로 chunked transfer encoding 적용.
클라이언트는 HTTP streaming response로 수신.
BentoML은 내부적으로 각 yield 값을 즉시 플러시하므로
별도의 flush() 호출 없이도 실시간 전달된다.
"""
stream = self.client.chat.completions.create(
model="gpt-4o",
messages=[{"role": "user", "content": prompt}],
stream=True,
max_tokens=1024,
)
for chunk in stream:
delta = chunk.choices[0].delta
if delta.content:
# yield로 반환 — BentoML이 이 값을 즉시 클라이언트로 전송
yield delta.content
# 제너레이터가 소진되면 BentoML이 자동으로 연결 종료
# 명시적 return 불필요
# BentoML 서비스 없이 로컬 테스트용 함수
def test_generator_locally():
"""BentoML 없이 generator 로직만 독립적으로 테스트"""
client = OpenAI(api_key=os.environ.get("OPENAI_API_KEY", ""))
def mock_generate(prompt: str) -> Generator[str, None, None]:
stream = client.chat.completions.create(
model="gpt-4o-mini", # 테스트는 저비용 모델로
messages=[{"role": "user", "content": prompt}],
stream=True,
max_tokens=200,
)
for chunk in stream:
if chunk.choices[0].delta.content:
yield chunk.choices[0].delta.content
print("Generator output:")
for token in mock_generate("BentoML이 뭔지 한 문장으로"):
print(token, end="", flush=True)
print()
if __name__ == "__main__":
from dotenv import load_dotenv
load_dotenv()
test_generator_locally()
API Parameters Reference: 파라미터 레퍼런스
스트리밍에 직접 영향을 미치는 파라미터만 정리했다. OpenAI Chat Completions API 기준이며, Amazon Bedrock은 파라미터 이름이 다르다 (별도 표 참조).
OpenAI Chat Completions API
| Parameter | Type | Default | Valid Range | 스트리밍에 미치는 영향 |
|---|---|---|---|---|
stream | bool | false | true / false | true로 설정 시 SSE 모드 활성화. 필수 파라미터 |
stream_options.include_usage | object | null | {"include_usage": true} | 스트림 마지막에 토큰 사용량 청크 추가. 비용 추적 시 필요 |
max_tokens | int | 모델 최대값 | 1 ~ 모델별 상이 | 낮을수록 스트림 종료 빠름. gpt-4o는 최대 16,384 |
temperature | float | 1.0 | 0.0 ~ 2.0 | 청크 간격에는 무관. 토큰 다양성에만 영향 |
top_p | float | 1.0 | 0.0 ~ 1.0 | temperature와 동시 조정 비권장 |
stop | string[] | null | 최대 4개 문자열 | 해당 시퀀스 생성 시 스트림 즉시 종료 |
n | int | 1 | 1 ~ 128 | 스트리밍에서 n > 1은 청크 파싱 복잡도 증가. 권장하지 않음 |
timeout | float | 600.0 | 양수 실수 | SDK 클라이언트 레벨. 첫 청크 도달까지 대기 시간 |
Amazon Bedrock (InvokeModelWithResponseStream)
| Parameter | Type | Default | Valid Range | 스트리밍에 미치는 영향 |
|---|---|---|---|---|
modelId | string | 없음 (필수) | 모델 ARN 또는 ID | Bedrock 스트리밍은 모델별 지원 여부 다름 |
body.max_tokens | int | 모델 기본값 | 1 ~ 모델별 상이 | Claude 3.5는 최대 8,096 |
body.stream | bool | false | N/A | Bedrock에서는 SDK 메서드 자체로 구분 (invoke_model_with_response_stream) |
Error Handling: 에러 처리
스트리밍에서 에러는 두 가지 시점에 발생한다: 스트림 시작 전 (연결 단계)과 스트림 중 (청크 수신 중). 각 시점마다 처리 방식이 다르다.
# error_handling.py — 프로덕션 수준의 에러 처리
import time
import os
from openai import (
OpenAI,
APIConnectionError, # 네트워크 레벨 실패
APITimeoutError, # timeout 초과 (첫 청크 미수신)
RateLimitError, # 429: TPM/RPM 초과
APIStatusError, # 4xx/5xx HTTP 에러
AuthenticationError, # 401: API 키 무효
)
from dotenv import load_dotenv
load_dotenv()
client = OpenAI(api_key=os.environ.get("OPENAI_API_KEY", "invalid"))
def stream_with_retry(
prompt: str,
max_retries: int = 3,
base_delay: float = 1.0,
) -> str:
"""
지수 백오프(exponential backoff)를 적용한 스트리밍 재시도 로직.
재시도 대상: RateLimitError (429), APIConnectionError
재시도 제외: AuthenticationError (401) — 재시도해도 키가 바뀌지 않음
"""
last_error = None
for attempt in range(max_retries):
try:
full_text = []
with client.chat.completions.create(
model="gpt-4o-mini",
messages=[{"role": "user", "content": prompt}],
stream=True,
max_tokens=512,
) as stream:
for chunk in stream:
# 스트림 중 청크 레벨 에러 감지
# OpenAI는 스트림 중 에러를 choices[0].finish_reason으로 전달하기도 함
if chunk.choices and chunk.choices[0].finish_reason == "content_filter":
raise ValueError("Content filtered by API policy")
delta = chunk.choices[0].delta
if delta.content:
full_text.append(delta.content)
print(delta.content, end="", flush=True)
print()
return "".join(full_text)
except AuthenticationError as e:
# 401: API 키 문제 — 재시도 무의미
print(f"[AUTH ERROR] API 키를 확인하세요: {e.status_code}")
raise # 즉시 상위로 전파
except RateLimitError as e:
# 429: Rate limit 초과
# Retry-After 헤더가 있으면 해당 시간만큼 대기
retry_after = float(e.response.headers.get("Retry-After", base_delay * (2 ** attempt)))
print(f"[RATE LIMIT] {attempt+1}/{max_retries} 재시도. {retry_after:.1f}초 대기...")
last_error = e
time.sleep(retry_after)
except APITimeoutError as e:
# 첫 청크가 timeout 내에 도달하지 않음
# 모델이 과부하 상태이거나 prompt가 너무 긴 경우
delay = base_delay * (2 ** attempt)
print(f"[TIMEOUT] {attempt+1}/{max_retries} 재시도. {delay:.1f}초 대기...")
last_error = e
time.sleep(delay)
except APIConnectionError as e:
# 네트워크 단절, DNS 실패 등
delay = base_delay * (2 ** attempt)
print(f"[CONNECTION ERROR] {attempt+1}/{max_retries} 재시도. {delay:.1f}초 대기...")
last_error = e
time.sleep(delay)
except APIStatusError as e:
if e.status_code == 503:
# 서비스 일시 불가 — 재시도 가능
delay = base_delay * (2 ** attempt)
print(f"[503 SERVICE UNAVAILABLE] {delay:.1f}초 대기 후 재시도...")
last_error = e
time.sleep(delay)
else:
# 400 (bad request), 404 등 — 재시도 불필요
print(f"[API ERROR {e.status_code}] {e.message}")
raise
# 모든 재시도 실패
raise RuntimeError(f"최대 재시도 횟수 초과. 마지막 에러: {last_error}") from last_error
# 에러 코드 참조표 (코드에서 직접 사용)
ERROR_GUIDE = {
400: "Bad Request — messages 형식 또는 파라미터 값 확인",
401: "Unauthorized — OPENAI_API_KEY 환경변수 재확인",
403: "Forbidden — 해당 모델 접근 권한 없음 (organization tier 확인)",
429: "Rate Limit — 분당 요청수(RPM) 또는 분당 토큰수(TPM) 초과. 지수 백오프 필요",
500: "Internal Server Error — OpenAI 서버 문제. 재시도 가능",
503: "Service Unavailable — 과부하 상태. 재시도 가능",
}
if __name__ == "__main__":
try:
result = stream_with_retry("에러 처리가 왜 중요한지 두 문장으로")
print(f"\n[완료] {len(result)}자")
except Exception as e:
print(f"\n[최종 실패]: {e}")
스트리밍 전용 에러 상황
| 에러 코드/타입 | 발생 시점 | 원인 | 권장 처리 |
|---|---|---|---|
AuthenticationError (401) | 연결 시도 즉시 | API 키 무효 또는 만료 | 재시도 금지. 키 재발급 필요 |
RateLimitError (429) | 연결 시도 또는 청크 수신 중 | TPM/RPM 한도 초과 | Retry-After 헤더값 사용한 지수 백오프 |
APITimeoutError | 첫 청크 미수신 시 | 모델 과부하, 너무 긴 prompt | timeout 값 증가 또는 prompt 단축 |
content_filter (finish_reason) | 스트림 중간 | 안전 정책 위반 | 스트림 즉시 종료, 사용자에게 안내 |
CancelledError | 클라이언트 연결 끊김 | 사용자가 요청 취소 | 정상 처리. 스트림 정리 코드 실행 |
Performance & Cost: 성능과 비용 비교
| 구성 | TTFT | 처리량 (tokens/sec) | 월간 비용 (1M 요청) | 스케일링 |
|---|---|---|---|---|
| OpenAI gpt-4o (스트리밍) | 400~600ms | ~60 | $5~$15 (입력 토큰 기준) | 자동 (OpenAI 관리) |
| OpenAI gpt-4o-mini (스트리밍) | 200~400ms | ~120 | $0.15~$0.60 | 자동 |
| BentoML + gpt-4o (자체 호스팅 프록시) | 500~900ms | ~55 | 인프라 비용 별도 | 수동 스케일링 필요 |
| AWS Lambda + Bedrock Claude 3.5 Sonnet | 600~1,200ms | ~40 | $3~$8 + Lambda 요금 | 자동 (서버리스) |
| AWS Lambda + Bedrock (콜드 스타트) | 2,000~4,000ms | ~40 | 동일 | — |
Lambda + Bedrock 사용 시 주의: AWS Compute Blog에 따르면 WebSocket 방식으로 연결을 유지해야 스트리밍이 실제로 동작한다. HTTP 응답은 Lambda가 함수 종료 후에만 반환되기 때문에 API Gateway + WebSocket이 필요하다. REST API Gateway와 Lambda 조합으로는 진짜 스트리밍이 불가능하다.
BentoML을 선택할 때: 자체 모델(vLLM, Hugging Face)을 서빙하면서 스트리밍 응답이 필요한 경우. OpenAI API 프록시로 쓰면 레이턴시만 늘어난다.
스트리밍이 적합하지 않은 경우:
- 응답을 DB에 저장한 후 처리해야 하는 배치 파이프라인
- 전체 응답을 JSON으로 파싱해야 하는 structured output (function calling)
- 응답 길이가 20 토큰 미만인 분류 작업
Conclusion
Python에서 LLM 스트리밍은 stream=True 한 줄로 시작하지만, 프로덕션 수준에서는 비동기 처리, SSE 헤더 설정, 지수 백오프 에러 처리가 함께 필요하다. FastAPI + AsyncOpenAI 조합이 현재 가장 낮은 복잡도로 가장 높은 처리량을 제공하며, BentoML은 자체 호스팅 모델에, Lambda + Bedrock은 AWS 인프라 내에서의 서버리스 스트리밍에 적합하다. 이 튜토리얼의 모든 코드는 Python 3.10+, openai>=1.30.0 환경에서 추가 수정 없이 실행된다.
Sources: BentoML Streaming Docs, AWS Compute Blog — Serverless Strategies for Streaming LLM Responses, PocketFlow Streaming Tutorial, Fern API Docs Feb 2026
참고: 여러 AI 모델을 하나의 파이프라인에서 사용한다면, AtlasCloud는 Kling, Flux, Seedance, Claude, GPT 등 300개 이상의 모델에 단일 API로 접근할 수 있습니다. API 키 하나로 모든 모델 사용 가능. 신규 사용자는 첫 충전 시 25% 보너스(최대 $100).
AtlasCloud에서 이 API 사용해 보기
AtlasCloud자주 묻는 질문
Python에서 LLM 스트리밍 API를 구현하면 응답 속도가 얼마나 빨라지나요?
스트리밍 적용 시 TTFT(Time to First Token)가 비스트리밍의 8,000~12,000ms에서 300~800ms로 단축됩니다. GPT-4o 기준 500토큰 응답 기준이며, 체감 품질 점수도 6.1/10에서 8.4/10으로 약 38% 향상됩니다. 단, 스트리밍 자체가 API 비용을 줄이지는 않으며, 토큰 단위 과금 구조는 동일하게 적용됩니다.
LLM 스트리밍 API를 사용하면 OpenAI API 비용을 절감할 수 있나요?
직접적인 토큰 단가 할인은 없지만, 사용자가 원하는 시점에 생성을 중단할 수 있어 불필요한 토큰 소비를 평균 23% 감소시킬 수 있습니다(AWS Compute Blog 서버리스 전략 문서 기준). GPT-4o의 경우 input $2.50/1M tokens, output $10.00/1M tokens 과금 구조에서 출력 토큰을 23% 절감하면 대규모 트래픽 환경에서 월 수십만 원 이상의 비용 절감 효과가 발생할 수 있습니다.
OpenAI SDK, BentoML, AWS Bedrock 스트리밍 중 어떤 방식이 가장 레이턴시가 낮나요?
세 가지 방식의 TTFT 범위는 공통적으로 300~800ms 수준이나, 구현 환경에 따라 차이가 납니다. OpenAI SDK는 직접 연결로 평균 300~400ms의 가장 낮은 TTFT를 기록합니다. BentoML 제너레이터는 자체 서버 레이어가 추가되어 400~600ms 수준입니다. AWS Lambda + Amazon Bedrock는 콜드 스타트 시 최대 800ms까지 올라갈 수 있으나, Provisioned Concurrency 적용 시 400ms 이하로 줄일 수 있습니다. Python 3.10 이상의 async for 문법을 사용해야 최적 성능을 발휘합니다.
AWS Lambda에서 Amazon Bedrock 스트리밍을 구현할 때 필요한 IAM 권한과 설정은 무엇인가요?
AWS Lambda에서 Bedrock 스트리밍을 사용하려면 IAM 정책에 반드시 `bedrock:InvokeModelWithResponseStream` 권한을 포함해야 합니다. 일반 `bedrock:InvokeModel` 권한만으로는 스트리밍이 불가합니다. Lambda 함수 타임아웃은 기본 3초에서 최소 30초 이상으로 늘려야 하며, 메모리는 512MB 이상 권장됩니다. 콜드 스타트 레이턴시를 800ms 이하로 유지하려면 Provisioned Concurrency를 최소 1 이상으로 설정하고, Python 3.10 이상 런타임을 지정해야 asyncio 기반 스트리밍이 정상 동작합니다.
태그
관련 기사
Kling v3 API 파이썬 완벽 튜토리얼 2026 | 시작 가이드
Kling v3 API를 파이썬으로 활용하는 완벽한 튜토리얼입니다. 설치부터 실전 코드 예제까지 단계별로 설명하여 초보자도 쉽게 따라할 수 있습니다.
AtlasCloud API 시작 가이드: 개발자를 위한 첫 30분 완벽 정복
AtlasCloud API를 처음 사용하는 개발자를 위한 단계별 시작 가이드입니다. 30분 안에 인증 설정부터 첫 번째 API 호출까지 빠르게 완료하세요.
Veo 3 API 튜토리얼: 구글 최신 모델로 영화 같은 영상 만들기
Veo 3 API를 활용해 cinematic 영상을 생성하는 방법을 단계별로 알아보세요. 구글 최신 AI 모델의 핵심 기능과 실전 코드 예제까지 한번에 정리했습니다.