OpenAI에게 역할과 지시문을 부여해서 “특정 일을 하는 비서” 처럼 만드는 기능.
ex) “너는 이제부터 터키어 번역가야!”
기존의 ChatGPT 모델에 역할을 부여하여 만든 AI로 코드 실행, 파일 업로드,번역 까지 확장시킨 AI.
역할을 가진 채팅봇처럼 AI를 만들수 있는 API
대화 기록을 담는 컨테이너 : Assistant와 하나의 사용자의 대화를 하나의 Thread에 기록한다.
thread_id는 특정 대화 세션을 식별하는 고유 ID
Assitant와 사용자 간의 "하나의 대화방 ID”
openAI 대쉬보드에서 Assistant 생성


app.py 수정
@app.route("/sendMessage", methods=["POST"])
def send_message():
global thread_id # 전역 변수 thread_id를 사용
try:
# 클라이언트가 보낸 JSON 데이터를 파싱
data = request.get_json()
# JSON에서 'message' 키의 값을 가져옴 (사용자 입력 메시지)
message = data.get('message', '')
# 메시지가 비어있으면 에러를 반환
if not message:
return jsonify({"error": "메시지가 없습니다."}), 400
# 터미널에 받은 메시지를 출력 (디버깅용)
print(f"받은 메시지: {message}")
# 스레드가 없으면 새로 생성 (첫 번째 메시지인 경우)
if thread_id is None:
# 새로운 대화 스레드를 생성
thread = client.beta.threads.create()
# 생성된 스레드의 ID를 저장
thread_id = thread.id
print(f"새 스레드 생성: {thread_id}")
# 사용자 메시지를 스레드에 추가
client.beta.threads.messages.create(
thread_id=thread_id, # 대화 스레드 ID
role="user", # 메시지 역할 (사용자)
content=message # 메시지 내용
)
# Assistant를 실행하여 응답을 생성
run = client.beta.threads.runs.create(
thread_id=thread_id, # 대화 스레드 ID
assistant_id=ASSISTANT_ID # OpenAI 대시보드에서 생성한 Assistant ID
)
# Assistant가 응답을 완료할 때까지 기다림
while True:
# 현재 실행 상태를 확인
run_status = client.beta.threads.runs.retrieve(
thread_id=thread_id,
run_id=run.id
)
# 실행이 완료되면 루프를 종료
if run_status.status == "completed":
break
# 실행이 실패하면 에러를 반환
elif run_status.status == "failed":
return jsonify({"error": "Assistant 실행 실패"}), 500
# Assistant의 응답 메시지를 가져옴
messages = client.beta.threads.messages.list(thread_id=thread_id)
# 가장 최근 메시지(Assistant의 응답)를 가져옴
assistant_message = messages.data[0]
# 응답 내용을 추출
ai_response = assistant_message.content[0].text.value
# 클라이언트에게 성공 응답을 JSON 형태로 반환
return jsonify({
"success": True,
"message": cleaned_response,
"original_message": message
})
except Exception as e:
# 에러가 발생하면 터미널에 에러 메시지를 출력
print(f"에러 발생: {str(e)}")
# 클라이언트에게 에러 응답을 반환
return jsonify({"error": f"서버 에러: {str(e)}"}), 500


