OpenAI Responses API 완전 가이드 — Chat Completions 대체와 Assistants API 마이그레이션
OpenAI의 새로운 표준 API인 Responses API를 완전 분석한다. Chat Completions와의 차이, 내장 도구(웹 검색·코드 인터프리터·MCP), 상태 관리, 그리고 2026년 8월 종료되는 Assistants API 마이그레이션 방법을 실제 코드와 함께 정리한다.
OpenAI Responses API는 Chat Completions와 Assistants API를 통합·대체하는 새로운 API 표준이다. Assistants API는 2026년 8월 26일 종료된다. 현재 Assistants를 쓰는 팀은 지금 마이그레이션을 시작해야 한다. 이 글은 Responses API의 핵심 기능, Chat Completions와의 차이, 실제 마이그레이션 코드까지 단계별로 정리한다.
이 글이 필요한 사람: OpenAI API를 사용 중인 개발자, Assistants API 마이그레이션을 준비 중인 팀, 웹 검색·코드 인터프리터·MCP 도구를 앱에 통합하려는 개발자.
Responses API는 OpenAI가 2025년 초 발표한 새로운 API 표준으로, 기존 Chat Completions와 Assistants API를 하나의 인터페이스로 통합한다. OpenAI는 이를 "Chat Completions의 진화"라고 설명하며 모든 신규 프로젝트에서 Responses API 사용을 권장한다.
세 API의 위치를 명확하게 구분하면:
Chat Completions — 상태 없는(stateless) 기본 API. 대화 이력을 직접 관리해야 한다.
Responses API — Chat Completions 기반에 상태 관리·도구 호출·에이전틱 루프를 더한 통합 API.
Assistants API — Thread·Run·Step 구조로 복잡성이 높았던 관리형 API. 2026년 8월 26일 종료.
Responses API는 Chat Completions를 기반으로 에이전틱 기능을 더한 통합 표준이다. Assistants API는 2026년 8월 종료.
기본 사용법 — Chat Completions와 비교
Responses API의 엔드포인트는 /v1/responses다. Chat Completions와 비슷하지만 몇 가지 필드가 다르다. messages 대신 input을 사용하고, 이전 응답과 연결할 때 previous_response_id를 쓴다.
Chat Completions vs Responses API 비교
from openai import OpenAI
client = OpenAI()
# --- Chat Completions (기존) ---
response = client.chat.completions.create(
model="gpt-4o",
messages=[
{"role": "system", "content": "당신은 코드 리뷰어입니다."},
{"role": "user", "content": "이 함수를 리뷰해줘"}
]
)
print(response.choices[0].message.content)
# --- Responses API (신규) ---
response = client.responses.create(
model="gpt-4o",
instructions="당신은 코드 리뷰어입니다.", # system 대신 instructions
input="이 함수를 리뷰해줘" # messages 대신 input
)
print(response.output_text)
대화 상태 관리 — previous_response_id
Responses API에서 멀티턴 대화는 previous_response_id로 이전 응답을 참조하는 방식이다. Chat Completions처럼 전체 messages 배열을 전송하지 않아도 되고, Assistants API처럼 Thread를 따로 관리할 필요도 없다.
previous_response_id로 멀티턴 대화
from openai import OpenAI
client = OpenAI()
# 첫 번째 요청
response1 = client.responses.create(
model="gpt-4o",
instructions="당신은 Python 튜터입니다.",
input="asyncio가 뭐야?"
)
print(response1.output_text)
# 두 번째 요청 — 이전 응답 참조
response2 = client.responses.create(
model="gpt-4o",
previous_response_id=response1.id, # 이전 응답 ID만 전달
input="그럼 await는 어떻게 쓰는 거야?"
# messages 배열에 이전 대화를 담지 않아도 됨
)
print(response2.output_text)
내장 도구 — 웹 검색, 코드 실행, MCP
Responses API의 가장 큰 장점은 별도 구현 없이 웹 검색·코드 인터프리터·MCP 도구를 바로 쓸 수 있다는 점이다. tools 파라미터에 도구 이름을 지정하면 모델이 필요할 때 자율적으로 호출한다.
웹 검색 + 코드 인터프리터 통합
response = client.responses.create(
model="gpt-4o",
tools=[
{"type": "web_search_preview"}, # 웹 검색
{"type": "code_interpreter", # 코드 실행 (Python 샌드박스)
"container": {"type": "auto"}}
],
input="Python 최신 버전을 검색하고, 그 버전으로 피보나치 수열을 계산해서 결과를 보여줘"
)
# 모델이 알아서 웹 검색 → 코드 작성 → 실행 → 결과 반환
print(response.output_text)
MCP 서버 연결
response = client.responses.create(
model="gpt-4o",
tools=[
{
"type": "mcp",
"server_label": "github",
"server_url": "https://mcp.github.com/",
"headers": {"Authorization": "Bearer github_pat_..."},
"allowed_tools": ["list_repos", "create_issue", "get_pull_request"]
}
],
input="내 GitHub 저장소 목록을 보여주고, 가장 최근에 업데이트된 레포에 이슈를 하나 만들어줘"
)
스트리밍 응답 처리
Responses API는 스트리밍을 기본 지원한다. 도구 실행 중에도 부분 결과를 실시간으로 받을 수 있다.
Responses API 스트리밍
with client.responses.stream(
model="gpt-4o",
tools=[{"type": "web_search_preview"}],
input="오늘 서울 날씨와 미세먼지 현황을 알려줘"
) as stream:
for event in stream:
if event.type == "response.output_text.delta":
print(event.delta, end="", flush=True)
elif event.type == "response.web_search_call.completed":
print(f"\n[검색 완료: {event.output}]")
# 최종 응답 객체
final = stream.get_final_response()
print(f"\n총 토큰: {final.usage.total_tokens}")
Assistants API에서 마이그레이션하기
Assistants API를 쓰고 있다면 2026년 8월 26일 전에 마이그레이션이 필요하다. 핵심 개념의 대응 관계는 다음과 같다.
Assistants API → Responses API 마이그레이션 예시
# === 기존 Assistants API ===
assistant = client.beta.assistants.create(
model="gpt-4o",
instructions="코드 리뷰어입니다.",
tools=[{"type": "code_interpreter"}]
)
thread = client.beta.threads.create()
client.beta.threads.messages.create(
thread_id=thread.id,
role="user",
content="이 코드를 리뷰해줘"
)
run = client.beta.threads.runs.create_and_poll(
thread_id=thread.id, assistant_id=assistant.id
)
# === 마이그레이션 후 Responses API ===
response = client.responses.create(
model="gpt-4o",
instructions="코드 리뷰어입니다.",
tools=[{"type": "code_interpreter", "container": {"type": "auto"}}],
input="이 코드를 리뷰해줘"
)
print(response.output_text)
# 3개 객체(Assistant, Thread, Run) → 1개 호출로 단순화
Assistants API의 3단계 객체 구조가 Responses API에서는 단일 호출로 단순화된다.
마이그레이션 데드라인: Assistants API는 2026년 8월 26일 종료된다. 지금 신규 프로젝트에 Assistants API를 쓰기 시작했다면 즉시 Responses API로 전환해야 한다. 기존 프로젝트는 2026년 Q2 중 마이그레이션 완료를 목표로 잡는 것이 안전하다.
이미지 입력 — 멀티모달 분석
Responses API는 텍스트 외에 이미지 입력을 지원한다. input을 배열로 구성하면 텍스트와 이미지를 함께 전달할 수 있다.