본문으로 바로가기
반응형

이 글에서 사용하는 주요 용어 정의

용어 정의
Assistants API Assistant, Thread, Run 객체를 중심으로 AI 애플리케이션을 구성하는 OpenAI의 기존 API. 2026년 8월 26일 종료 예정
Responses API 모델 응답, 멀티턴 상태 연결, 내장 도구와 함수 호출을 하나의 응답 흐름에서 다루는 OpenAI API
Thread Assistants API에서 사용자 메시지와 대화 상태를 묶어 관리하는 객체
Run Thread에 연결된 Assistant가 모델과 도구를 사용해 작업하도록 실행하는 객체
previous_response_id Responses API에서 이전 응답을 다음 요청과 연결할 때 사용하는 식별자
아웃풋 아이템(output item) Responses API가 반환하는 메시지, 도구 호출 등 여러 출력 유형의 개별 항목

도입

OpenAI Assistants API는 2026년 8월 26일 종료될 예정입니다. 기존에 Assistant, Thread, Run 객체를 중심으로 AI 기능을 구현했다면 단순히 엔드포인트 이름만 바꿔서는 안 됩니다. 대화 상태, 지침, 도구 호출, 비동기 처리 방식을 함께 점검해야 합니다.

이 글에서는 Node.js 프로젝트를 기준으로 이전 전 확인할 코드, Responses API의 기본 호출법, 연속 대화 처리, 안전한 배포 순서를 정리합니다. 종료 일정은 OpenAI Assistants API 공식 문서에서 확인할 수 있습니다.

기준일: 2026년 7월 31일. OpenAI API와 모델은 변경될 수 있으므로 실제 배포 직전에 공식 문서를 다시 확인하세요.


Assistants API와 Responses API의 구조

Assistants API는 정확히 언제 종료되나

OpenAI 공식 문서에 따르면 Assistants API는 deprecated 상태이며 2026년 8월 26일 종료됩니다. 새 프로젝트에는 Responses API를 사용해야 하고, 기존 프로젝트도 종료일 전에 이전과 회귀 테스트를 끝내는 편이 안전합니다.

여기서 중요한 점은 "지원 중단"과 "즉시 사용 불가"가 다르다는 것입니다. 종료일까지 기존 API가 동작하더라도 신규 기능의 중심은 Responses API입니다. 종료일 직전에 코드를 한 번에 교체하면 대화 기록, 파일 검색, 함수 호출처럼 상태가 얽힌 부분에서 문제를 찾을 시간이 부족합니다.

Responses API로 바뀌면 무엇이 달라지나

Responses API는 모델 호출과 도구 사용을 하나의 응답 흐름으로 다루는 API입니다. Assistants API의 객체를 1:1로 바꾸는 방식보다, 애플리케이션이 실제로 필요로 하는 상태와 실행 흐름을 다시 나누는 방식이 적합합니다.

Assistants API에서 익숙한 개념 Responses API 전환 시 확인할 항목
Assistant 요청의 instructions, 모델 설정, 애플리케이션 설정 저장소
Thread previous_response_id, Conversations API 또는 자체 대화 저장소
Message Responses API의 input과 반환되는 output item
Run responses.create() 호출, streaming 또는 background 처리
Run polling 스트리밍 이벤트, background polling, webhook 등 요구사항에 맞는 방식
Tool resources 요청의 tools와 도구별 리소스 설정

이 표는 개념을 이해하기 위한 대응표이지 완전한 변환표가 아닙니다. 예를 들어 장기 대화 보존이 필요한 서비스와 한두 번의 후속 질문만 처리하는 서비스는 상태 관리 설계가 달라집니다.

기존 객체를 1:1로 바꾸면 안 되는 이유

Assistant, Thread, Run을 Responses API의 특정 필드와 억지로 대응시키면 기존 시스템의 숨은 요구사항을 놓칠 수 있습니다. 핵심은 객체 이름을 바꾸는 것이 아니라 각 객체가 맡았던 설정, 대화 기록, 실행 상태를 새 구조에 다시 배치하는 것입니다.


핵심 내용

이전하기 전에 기존 코드를 어떻게 점검해야 하나

먼저 Assistants API가 사용된 위치를 기능별로 분류해야 합니다. API 호출 파일만 검색하면 데이터베이스에 저장된 assistant_idthread_id, 작업 큐의 Run 폴링 로직을 놓칠 수 있습니다.

다음 항목을 확인하세요.

  1. beta.assistants, beta.threads, runs.create 호출 위치
  2. 데이터베이스에 저장한 Assistant ID와 Thread ID
  3. Run 상태를 반복 조회하는 작업과 타임아웃
  4. File Search, Code Interpreter, 함수 호출 사용 여부
  5. 스트리밍 이벤트를 UI로 전달하는 코드
  6. 대화 데이터의 보존 기간과 개인정보 요구사항
  7. 실패 재시도, 중복 요청 방지, 사용량 기록 방식

특히 데이터 보존 정책은 별도로 검토해야 합니다. OpenAI 데이터 제어 문서에 따르면 Responses API의 애플리케이션 상태 보존과 Conversations API의 보존 방식은 같지 않습니다. previous_response_id가 있으니 데이터베이스가 필요 없다고 단정해서는 안 됩니다.

Node.js에서 Responses API를 어떻게 호출하나

아래 예제는 공식 JavaScript SDK의 responses.create() 형식을 보여주는 설명용 코드입니다. 이 글을 작성한 환경에는 OpenAI API 키가 없어 실제 요청은 실행하지 않았습니다. 모델 접근 권한과 최신 SDK 버전은 계정마다 다를 수 있습니다.

1. SDK와 환경 변수를 준비한다

npm install openai

API 키는 소스 코드에 직접 넣지 말고 서버 환경 변수로 전달합니다.

$env:OPENAI_API_KEY="your-api-key"

.env 파일을 쓴다면 Git 저장소에서 제외해야 합니다. 브라우저 코드에 API 키를 포함하는 것도 피해야 합니다.

2. 단일 요청을 Responses API로 바꾼다

import OpenAI from "openai";

const client = new OpenAI();

const response = await client.responses.create({
  model: "gpt-5.6-terra",
  instructions: "답변은 한국어로 간결하게 작성하세요.",
  input: "Responses API의 역할을 세 문장으로 설명해 주세요.",
});

console.log(response.output_text);

output 배열의 첫 번째 항목이 항상 원하는 텍스트라고 가정하지 말고, SDK가 제공하는 output_text 도우미를 사용하는 편이 안전합니다. 도구 호출이나 여러 종류의 output item을 처리한다면 각 item의 타입을 확인해야 합니다.

모델 ID는 예제 작성일 기준입니다. 비용과 품질 요구사항에 맞는 현재 모델은 OpenAI 모델 문서에서 다시 선택하세요.

3. 후속 대화는 상태 요구사항에 맞게 연결한다

짧은 후속 대화는 앞선 응답의 ID를 previous_response_id로 전달할 수 있습니다.

const first = await client.responses.create({
  model: "gpt-5.6-terra",
  instructions: "답변은 한국어로 간결하게 작성하세요.",
  input: "AI 에이전트의 도구 호출이 무엇인지 설명해 주세요.",
});

const followUp = await client.responses.create({
  model: "gpt-5.6-terra",
  previous_response_id: first.id,
  instructions: "답변은 한국어로 간결하게 작성하세요.",
  input: "Node.js 예시를 하나 추가해 주세요.",
});

console.log(followUp.output_text);

주의할 점이 있습니다. previous_response_id를 사용해도 앞 요청의 instructions가 자동으로 이어진다고 가정하면 안 됩니다. Responses API 레퍼런스 안내에 맞춰 후속 호출에도 필요한 지침을 명시하세요.

장기 대화, 여러 기기 동기화, 감사 로그가 필요하다면 응답 ID만 저장하는 것으로 충분한지 검토해야 합니다. Conversations API나 자체 저장소를 선택할 때 삭제 정책, 접근 제어, 장애 복구 요구사항도 함께 비교하세요.

File Search와 함수 호출은 어떻게 옮기나

도구를 사용하던 프로젝트는 도구 이름보다 도구 실행 전후의 상태를 먼저 확인해야 합니다. File Search는 어떤 벡터 스토어와 파일을 참조하는지, 함수 호출은 누가 실제 함수를 실행하고 결과를 다시 모델에 전달하는지 추적해야 합니다.

마이그레이션 목록을 다음처럼 나누면 빠뜨릴 가능성이 줄어듭니다.

  • 입력 계약: 함수 이름, 설명, JSON 스키마
  • 실행 주체: API 서버, 작업 큐, 외부 서비스
  • 권한: 사용자가 호출할 수 있는 도구 범위
  • 결과 반환: call ID와 결과의 연결
  • 실패 처리: 타임아웃, 재시도, 중복 실행 방지
  • 관측성: 요청 ID, 응답 ID, 도구 실행 시간, 오류 코드

함수 호출은 외부 시스템을 실제로 변경할 수 있습니다. 결제, 삭제, 발송처럼 되돌리기 어려운 작업에는 사용자 확인과 멱등성 키를 두는 편이 좋습니다.

Run 폴링은 무엇으로 대체해야 하나

기존 코드가 Run 상태를 일정 간격으로 조회했다면, 무조건 같은 폴링 구조를 유지할 필요는 없습니다. 사용자가 화면에서 답변을 기다리는 요청은 스트리밍이 적합하고, 오래 걸리는 작업은 background mode와 webhook 또는 제한된 폴링을 검토할 수 있습니다.

선택 기준은 다음과 같습니다.

  • 즉시 표시할 텍스트: 서버 전송 스트리밍
  • 수 분 이상 걸릴 수 있는 작업: background 처리
  • 서버가 완료 이벤트를 받아야 하는 작업: webhook
  • 외부 도구 실행: 자체 작업 큐와 상태 저장

각 방식의 데이터 보존 및 Zero Data Retention 호환성은 다를 수 있습니다. 보안 요구사항이 있다면 기능 선택 전에 공식 데이터 제어 문서를 확인하세요.


실제 적용과 한계

서비스 중단 없이 어떻게 배포하나

안전한 이전은 기존 구현을 바로 삭제하지 않고 두 경로를 잠시 비교하는 방식으로 진행합니다.

1단계: API 어댑터를 만든다

비즈니스 로직이 OpenAI SDK 객체를 직접 사용하지 않도록 generateAnswer() 같은 내부 인터페이스를 둡니다. 기존 Assistants 구현과 새 Responses 구현이 같은 애플리케이션 결과 형식을 반환하게 만드세요.

2단계: 대표 시나리오를 고정한다

단일 질문, 연속 대화, 파일 검색, 함수 호출, 오류 재시도 등 실제 사용 시나리오를 테스트 데이터로 만듭니다. 답변 문장 자체가 완전히 같은지보다 필수 사실, JSON 형식, 도구 실행 여부가 요구사항을 만족하는지 검사하세요.

3단계: 일부 트래픽부터 전환한다

내부 사용자나 낮은 비율의 트래픽부터 새 경로로 보냅니다. 성공률, 지연 시간, 토큰 사용량, 도구 오류를 기존 경로와 비교하되 검증하지 않은 성능 향상을 전제로 삼지 않습니다.

4단계: 롤백 조건을 정한다

오류율이나 필수 필드 누락이 기준을 넘으면 기존 경로로 돌릴 수 있어야 합니다. 단, Assistants API 종료일 이후에는 기존 API가 영구적인 롤백 수단이 될 수 없습니다. 종료 전에 새 경로 자체의 안정화와 장애 대응을 끝내야 합니다.

실제 적용 전에 알아둘 한계

  • 접근 권한: 예제의 모델이 모든 API 계정에서 동일하게 제공된다고 가정하면 안 됩니다.
  • 비용과 속도: Responses API로 바꾼다고 비용이나 지연 시간이 자동으로 줄어드는 것은 아닙니다.
  • 데이터 보존: Responses, Conversations, background mode는 보존 특성과 Zero Data Retention 호환성이 다를 수 있습니다.
  • 마이그레이션 범위: 단일 질의 서비스보다 파일, 함수, 장기 대화를 함께 사용하는 서비스의 전환 범위가 큽니다.

자주 하는 실수는 무엇인가

Assistant, Thread, Run을 억지로 1:1 매핑한다

Responses API는 단순한 객체명 변경이 아닙니다. 기존 객체가 담당하던 설정, 대화, 실행 상태를 애플리케이션 요구사항에 따라 다시 배치하세요.

previous_response_id만 저장하면 된다고 생각한다

응답 연결과 서비스의 장기 기록은 다른 문제입니다. 사용자별 대화 목록, 삭제 요청, 감사 기록, 기기 간 동기화가 필요하면 별도 상태 모델이 필요할 수 있습니다.

후속 요청에서 지침을 생략한다

이전 응답의 instructionsprevious_response_id를 통해 자동 승계되지 않습니다. 매 요청에 필요한 개발자 지침을 전달하거나 서버의 버전 관리된 프롬프트에서 불러오세요.

최신 모델 별칭을 영구 설정처럼 취급한다

모델과 가격, 지원 기능은 바뀔 수 있습니다. 모델 ID를 설정 파일로 분리하고, 대표 입력으로 품질·지연·비용을 측정한 뒤 변경하세요.


마무리

Assistants API에서 Responses API로의 이전은 엔드포인트 교체보다 상태 관리 재설계에 가깝습니다. 먼저 Assistant, Thread, Run이 프로젝트에서 맡던 역할을 찾고, 필요한 상태만 새 구조로 옮긴 뒤 대표 시나리오로 검증하세요.

가장 먼저 할 일은 간단합니다. 저장소에서 beta.assistants, beta.threads, runs를 검색해 영향 범위를 목록으로 만드는 것입니다. 종료일 직전의 일괄 전환보다 오늘 작은 요청 하나를 Responses API로 바꾸는 편이 훨씬 안전합니다.

참고 자료

반응형