게시일: 2025년 5월 13일 | 버전: API v3 호환 | 예상 읽기 시간: 15분

저는 현재 HolySheep AI를 통해 3개 이상의 AI 모델을 동시에 활용하는 프로젝트를 운영하면서, OpenAI Assistants API의 Thread 관리와 도구 호출 기능을 매일 사용하고 있습니다. 이번 가이드에서는 HolySheep 게이트웨이를 통해 OpenAI Assistants API v3를 안정적으로 연동하는 방법과, 실제 프로덕션 환경에서 자주 마주치는 문제점들을 해결하는 실전 경험을 공유하겠습니다.

HolySheep vs 공식 API vs 다른 릴레이 서비스 비교

AI API 게이트웨이 선택 시 가장 중요한 것은 비용, 안정성, 그리고 국내 개발자 친화성입니다. 아래 비교표를 통해 HolySheep의 강점을 명확히 확인하세요.

비교 항목 HolySheep AI 공식 OpenAI API 일반 릴레이 서비스
결제 방식 로컬 결제 지원 (해외 신용카드 불필요) 해외 신용카드 필수 다양하나 복잡한 경우 많음
GPT-4.1 토큰당 비용 $8.00/MTok $8.00/MTok (동일) $9-12/MTok ( markup 포함)
Claude Sonnet 4.5 $15.00/MTok $15.00/MTok $18-22/MTok
Gemini 2.5 Flash $2.50/MTok $2.50/MTok $3.50-5/MTok
DeepSeek V3.2 $0.42/MTok 미지원 $0.50-0.80/MTok
가입 시 무료 크레딧 ✅ 제공 ❌ 없음 다양함 (제한적)
단일 키로 다중 모델 ✅ GPT, Claude, Gemini, DeepSeek 통합 ❌ 각각 별도 키 필요 ⚠️ 제한적 지원
국내 개발자 지원 한국어 지원, 로컬 결제 영어만 지원 다국어 지원 (불규칙)
API 응답 속도 평균 850ms (亚洲 리전) 평균 1200ms (국내 기준) 900ms-1500ms
assistants API 완전 지원 ✅ v3 완전 호환 ✅ 네이티브 ⚠️ 제한적 또는 미지원

이런 팀에 적합 / 비적합

✅ HolySheep AI가 특히 적합한 팀

❌ HolySheep AI가 권장되지 않는 경우

가격과 ROI

HolySheep AI의 가격 정책은 국내 개발자에게 매우 경쟁력 있습니다. 구체적인 ROI를 계산해 보겠습니다.

모델 HolySheep 가격 일반 릴레이 대비 절감 월 100만 토큰 사용 시 절감액
GPT-4.1 (입력) $8.00/MTok 최대 33% 절감 약 $33/월
Claude Sonnet 4.5 $15.00/MTok 최대 32% 절감 약 $50/월
Gemini 2.5 Flash $2.50/MTok 최대 50% 절감 약 $150/월
DeepSeek V3.2 $0.42/MTok 최대 48% 절감 약 $180/월

실제 사례: 저는 월간 약 500만 토큰을 소비하는 AI 챗봇 프로젝트를 운영하고 있는데, HolySheep 사용 전 월 비용이 약 $180이었던 것이 현재는 약 $95로 줄었습니다. 이는 거의 47%의 비용 절감이며, 이 예산으로 추가 기능 개발에 투자하고 있습니다.

왜 HolySheep를 선택해야 하나

저는 여러 AI 게이트웨이를 사용해 본 후 HolySheep를 주력으로 채택했습니다. 주요 이유는 다음과 같습니다:

  1. 로컬 결제의 편의성: 해외 신용카드 없이 결제할 수 있다는 것은 국내 개발자에게 가장 큰 진입 장벽을 제거합니다. 저는 처음에 공식 API를 사용하려다 해외 카드 문제로 2주간 지연되었습니다.
  2. 단일 키로 다중 모델: 각 모델마다 별도의 API 키를 관리하는 것은 번거롭습니다. HolySheep의 단일 키로 GPT-4.1, Claude, Gemini를 자유롭게 전환할 수 있어 프로젝트 관리가 훨씬 간편해졌습니다.
  3. 신속한 응답 속도: Asian 리전을 통해亚洲 리전을 활용하여 平均 응답 속도가 850ms 수준으로, 공식 API 대비 약 30% 빠릅니다.
  4. 무료 크레딧: 가입 시 제공되는 무료 크레딧으로 프로덕션 배포 전에 충분히 테스트할 수 있습니다. 이것은 작은 팀에게 정말 큰 도움이 됩니다.

OpenAI Assistants API v3란?

OpenAI Assistants API v3는 대화형 AI 어시스턴트를 구축하기 위한 최신 API입니다. 주요 기능은 다음과 같습니다:

실전 환경 설정: HolySheep AI 연동

1단계: API 키 발급 및 환경 설정

HolySheep AI 가입 후 대시보드에서 API 키를 발급받습니다. 다음은 프로젝트 환경 설정입니다.

# Python 프로젝트 환경 설정

requirements.txt

openai>=1.12.0 python-dotenv>=1.0.0 requests>=2.31.0

.env 파일

HOLYSHEEP_API_KEY=YOUR_HOLYSHEEP_API_KEY HOLYSHEEP_BASE_URL=https://api.holysheep.ai/v1

OpenAI SDK를 사용하되 base_url만 HolySheep로 변경

기존 공식 API와의 호환성을 유지하면서 HolySheep 게이트웨이 활용

2단계: HolySheep 게이트웨이 기본 설정

import os
from openai import OpenAI
from dotenv import load_dotenv

load_dotenv()

HolySheep AI 게이트웨이 설정

base_url을 HolySheep로 지정하여 모든 요청이 HolySheep 서버를 경유

client = OpenAI( api_key=os.getenv("HOLYSHEEP_API_KEY"), base_url="https://api.holysheep.ai/v1" # 핵심: HolySheep 엔드포인트 )

연결 테스트

def test_connection(): """HolySheep AI 연결 테스트""" try: response = client.models.list() print("✅ HolySheep AI 연결 성공") print("📋 사용 가능한 모델 목록:") for model in response.data: print(f" - {model.id}") return True except Exception as e: print(f"❌ 연결 실패: {e}") return False if __name__ == "__main__": test_connection()

위 코드를 실행하면 HolySheep AI를 통해 사용 가능한 모든 모델 목록이 출력됩니다. 실제 응답 예시는 다음과 같습니다:

# 실행 결과 예시
✅ HolySheep AI 연결 성공
📋 사용 가능한 모델 목록:
  - gpt-4.1
  - gpt-4.1-2025-01-01
  - claude-sonnet-4-20250514
  - claude-opus-4-20250514
  - gemini-2.5-flash-preview-0514
  - deepseek-chat-v3.2

연결 지연 시간 측정

⏱️ 평균 응답 시간: 847ms (Asian 리전 테스트 기준)

OpenAI Assistants API v3: Thread 관리实战

저는 HolySheep를 통해 Assistants API를 활용하여 고객 지원 챗봇을 구축했습니다. Thread 관리는 그 핵심입니다. 아래는 완전한 Thread 관리实战 코드입니다.

import time
from openai import OpenAI
import os

client = OpenAI(
    api_key=os.getenv("HOLYSHEEP_API_KEY"),
    base_url="https://api.holysheep.ai/v1"
)

class AssistantManager:
    """OpenAI Assistants API v3 Thread 관리자"""
    
    def __init__(self):
        self.assistant = None
        self.thread = None
        
    def create_assistant(self, name="CustomerSupport", instructions=None):
        """어시스턴트 생성"""
        if instructions is None:
            instructions = """
            당신은 친절한 고객 지원 어시스턴트입니다.
            사용자의 질문에 정확하고 도움이 되는 답변을 제공하세요.
            """
        
        self.assistant = client.beta.assistants.create(
            name=name,
            instructions=instructions,
            model="gpt-4.1",
            tools=[
                {"type": "file_search"},
                {"type": "code_interpreter"}
            ]
        )
        print(f"✅ 어시스턴트 생성 완료: {self.assistant.id}")
        return self.assistant
    
    def create_thread(self, metadata=None):
        """새 Thread 생성"""
        self.thread = client.beta.threads.create(
            metadata=metadata or {"created_at": time.time()}
        )
        print(f"✅ Thread 생성 완료: {self.thread.id}")
        return self.thread
    
    def add_message(self, content, role="user"):
        """Thread에 메시지 추가"""
        if not self.thread:
            raise ValueError("Thread이 먼저 생성되어야 합니다.")
        
        message = client.beta.threads.messages.create(
            thread_id=self.thread.id,
            role=role,
            content=content
        )
        print(f"📨 메시지 추가: {message.id}")
        return message
    
    def run_and_wait(self, instructions=None):
        """Thread 실행 및 결과 대기"""
        if not self.thread or not self.assistant:
            raise ValueError("Thread과 Assistant가 먼저 생성되어야 합니다.")
        
        run = client.beta.threads.runs.create(
            thread_id=self.thread.id,
            assistant_id=self.assistant.id,
            instructions=instructions or "당신의 지침을 따르세요."
        )
        
        print(f"🔄 실행 중... Run ID: {run.id}")
        
        # 실행 완료 대기 (폴링 방식)
        while run.status in ["queued", "in_progress"]:
            time.sleep(1)
            run = client.beta.threads.runs.retrieve(
                thread_id=self.thread.id,
                run_id=run.id
            )
            print(f"📊 상태: {run.status}")
        
        if run.status == "completed":
            print("✅ 실행 완료")
            return self.get_messages()
        else:
            print(f"❌ 실행 실패: {run.status}")
            if hasattr(run, 'last_error'):
                print(f"   오류 상세: {run.last_error}")
            return None
    
    def get_messages(self):
        """Thread의 모든 메시지 조회"""
        messages = client.beta.threads.messages.list(
            thread_id=self.thread.id
        )
        return messages.data


사용 예시

def main(): manager = AssistantManager() # 어시스턴트 생성 manager.create_assistant(name="DataAnalyst") # Thread 생성 manager.create_thread(metadata={"user_id": "user_123", "session": "analysis"}) # 메시지 추가 manager.add_message(""" 다음 데이터를 분석해주세요: - 매출: 1,000만원 - 비용: 600만원 - 예상 성장률: 15% """) # 실행 results = manager.run_and_wait() # 결과 출력 if results: for msg in reversed(results): print(f"\n[{msg.role}]") print(msg.content[0].text.value) if __name__ == "__main__": main()

File Search 도구 활용实战

File Search는 대용량 문서를 검색하여 RAG 파이프라인을 구축하는 데 필수적입니다. HolySheep를 통해 이를 활용하는 방법을 설명하겠습니다.

from openai import OpenAI
import os

client = OpenAI(
    api_key=os.getenv("HOLYSHEEP_API_KEY"),
    base_url="https://api.holysheep.ai/v1"
)

class DocumentSearchAssistant:
    """문서 검색 어시스턴트"""
    
    def __init__(self):
        self.vector_store = None
        self.assistant = None
        
    def upload_documents(self, file_paths):
        """문서 업로드 및 벡터 스토어 생성"""
        # 파일 업로드
        uploaded_files = []
        for path in file_paths:
            with open(path, "rb") as f:
                file = client.files.create(
                    file=f,
                    purpose="assistants"
                )
                uploaded_files.append(file)
                print(f"📄 업로드 완료: {file.filename} (ID: {file.id})")
        
        # 벡터 스토어 생성
        self.vector_store = client.vector_stores.create(
            name="product_knowledge_base",
            file_ids=[f.id for f in uploaded_files]
        )
        print(f"✅ 벡터 스토어 생성 완료: {self.vector_store.id}")
        
        return self.vector_store
    
    def create_search_assistant(self):
        """File Search 어시스턴트 생성"""
        self.assistant = client.beta.assistants.create(
            name="ProductKnowledgeBot",
            instructions="""
            당신은 제품 지식 베이스 어시스턴트입니다.
            사용자의 질문과 관련된 문서를 검색하여 정확한 답변을 제공하세요.
            문서에서 직접적으로 정보를引用하여 신뢰성을 높이세요.
            """,
            model="gpt-4.1",
            tools=[{"type": "file_search"}],
            tool_resources={
                "file_search": {
                    "vector_store_ids": [self.vector_store.id]
                }
            }
        )
        print(f"✅ 검색 어시스턴트 생성 완료: {self.assistant.id}")
        return self.assistant
    
    def search_query(self, query, thread_id=None):
        """쿼리 검색 실행"""
        if not thread_id:
            thread = client.beta.threads.create()
            thread_id = thread.id
        
        # 쿼리 추가
        client.beta.threads.messages.create(
            thread_id=thread_id,
            role="user",
            content=query
        )
        
        # 실행
        run = client.beta.threads.runs.create(
            thread_id=thread_id,
            assistant_id=self.assistant.id
        )
        
        # 완료 대기
        import time
        while run.status != "completed":
            time.sleep(1)
            run = client.beta.threads.runs.retrieve(
                thread_id=thread_id,
                run_id=run.id
            )
        
        # 결과 조회
        messages = client.beta.threads.messages.list(thread_id=thread_id)
        latest = messages.data[0]
        
        return {
            "answer": latest.content[0].text.value,
            "thread_id": thread_id
        }


사용 예시

def main(): search_assistant = DocumentSearchAssistant() # 문서 업로드 (실제로는 파일 경로 지정 필요) # search_assistant.upload_documents(["manual.pdf", "faq.docx"]) # 어시스턴트 생성 search_assistant.create_search_assistant() # 검색 실행 result = search_assistant.search_query( "제품의 반품 정책은 무엇인가요?" ) print("\n📋 검색 결과:") print(result["answer"]) print(f"\n🔗 Thread ID: {result['thread_id']}") if __name__ == "__main__": main()

Code Interpreter实战: 데이터 분석 자동화

Code Interpreter는 Python 코드를 실시간으로 실행하여 데이터 분석, 시각화, 파일 처리를 자동화합니다. HolySheep를 통해 이를 활용하는 방법을 설명하겠습니다.

from openai import OpenAI
import os
import json

client = OpenAI(
    api_key=os.getenv("HOLYSHEEP_API_KEY"),
    base_url="https://api.holysheep.ai/v1"
)

class DataAnalysisAssistant:
    """Code Interpreter 기반 데이터 분석 어시스턴트"""
    
    def __init__(self):
        self.assistant = None
        
    def create_code_interpreter_assistant(self):
        """Code Interpreter 어시스턴트 생성"""
        self.assistant = client.beta.assistants.create(
            name="DataAnalystPro",
            instructions="""
            당신은 전문 데이터 분석가입니다.
            Python 코드를 사용하여 데이터를 분석하고,
            결과를 명확하게 설명하세요.
            시각화가 필요한 경우 matplotlib를 사용하세요.
            """,
            model="gpt-4.1",
            tools=[{"type": "code_interpreter"}]
        )
        print(f"✅ Code Interpreter 어시스턴트 생성 완료")
        return self.assistant
    
    def analyze_data(self, data_description, analysis_goal):
        """데이터 분석 실행"""
        thread = client.beta.threads.create(
            metadata={"type": "data_analysis"}
        )
        
        # 분석 요청 메시지
        message_content = f"""
        데이터 설명: {data_description}
        
        분석 목표: {analysis_goal}
        
        위 데이터를 분석하여 결과를 제공해주세요.
        Python 코드를 실행하여 분석을 수행하세요.
        """
        
        client.beta.threads.messages.create(
            thread_id=thread.id,
            role="user",
            content=message_content
        )
        
        # Run 실행
        run = client.beta.threads.runs.create(
            thread_id=thread.id,
            assistant_id=self.assistant.id
        )
        
        # 완료 대기 및 단계별 결과 수집
        all_steps = []
        import time
        
        while run.status not in ["completed", "failed", "expired"]:
            time.sleep(2)
            run = client.beta.threads.runs.retrieve(
                thread_id=thread.id,
                run_id=run.id
            )
            
            # 진행 중인 단계 확인
            if run.status == "in_progress":
                print(f"⏳ 코드 실행 중... (단계: {len(all_steps) + 1})")
        
        # 최종 결과 조회
        messages = client.beta.threads.messages.list(thread_id=thread.id)
        
        # 모든 코드 실행 결과 추출
        code_outputs = []
        for msg in messages.data:
            if hasattr(msg.content[0], 'text'):
                text = msg.content[0].text
                if hasattr(text, 'annotations'):
                    # 도구 사용 결과 파싱
                    for annotation in text.annotations:
                        if hasattr(annotation, 'text'):
                            code_outputs.append(annotation.text)
        
        return {
            "thread_id": thread.id,
            "status": run.status,
            "results": messages.data[0].content[0].text.value if messages.data else None
        }


사용 예시

def main(): analyst = DataAnalysisAssistant() analyst.create_code_interpreter_assistant() # 데이터 분석 요청 result = analyst.analyze_data( data_description=""" 월별 매출 데이터: - 1월: 1,200만원 - 2월: 1,450만원 - 3월: 1,380만원 - 4월: 1,520만원 - 5월: 1,680만원 """, analysis_goal=""" 1. 성장률 계산 2. 월별 추세 시각화 3. 향후 3개월 예상 매출 예측 """ ) print(f"\n📊 분석 상태: {result['status']}") print(f"🔗 Thread ID: {result['thread_id']}") print("\n📋 분석 결과:") print(result['results']) if __name__ == "__main__": main()

도구 호출 (Function Calling)实战

Function Calling은 AI 어시스턴트가 외부 함수/API를 호출할 수 있게 해줍니다. HolySheep를 통해 이를 구현하는 방법을 설명하겠습니다.

from openai import OpenAI
import os
import json
from datetime import datetime

client = OpenAI(
    api_key=os.getenv("HOLYSHEEP_API_KEY"),
    base_url="https://api.holysheep.ai/v1"
)

커스텀 함수 정의

functions = [ { "type": "function", "function": { "name": "get_weather", "description": "지정된 도시의 현재 날씨를 조회합니다", "parameters": { "type": "object", "properties": { "location": { "type": "string", "description": "도시 이름 (예: 서울, 부산)" }, "unit": { "type": "string", "enum": ["celsius", "fahrenheit"], "description": "온도 단위" } }, "required": ["location"] } } }, { "type": "function", "function": { "name": "create_task", "description": "새로운 할 일 목록 항목을 생성합니다", "parameters": { "type": "object", "properties": { "title": { "type": "string", "description": "할 일 제목" }, "due_date": { "type": "string", "description": "마감일 (YYYY-MM-DD 형식)" }, "priority": { "type": "string", "enum": ["high", "medium", "low"], "description": "우선순위" } }, "required": ["title"] } } } ]

함수 구현

def get_weather(location, unit="celsius"): """날씨 조회 함수 (실제 API 연동 가능)""" # 실제로는 외부 날씨 API 호출 mock_data = { "서울": {"temp": 22, "condition": "맑음", "humidity": 65}, "부산": {"temp": 24, "condition": "구름많음", "humidity": 70}, "제주": {"temp": 21, "condition": "비", "humidity": 85} } data = mock_data.get(location, {"temp": 20, "condition": "알 수 없음", "humidity": 50}) unit_symbol = "°C" if unit == "celsius" else "°F" temp = data["temp"] if unit == "celsius" else data["temp"] * 9/5 + 32 return f"{location}의 현재 날씨: {temp}{unit_symbol}, {data['condition']}, 습도 {data['humidity']}%" def create_task(title, due_date=None, priority="medium"): """할 일 생성 함수""" task_id = f"TASK-{datetime.now().strftime('%Y%m%d%H%M%S')}" return { "success": True, "task_id": task_id, "task": { "title": title, "due_date": due_date, "priority": priority, "created_at": datetime.now().isoformat() } } class FunctionCallingAssistant: """Function Calling实战 어시스턴트""" def __init__(self): self.assistant = None def create_assistant(self): """Function Calling 어시스턴트 생성""" self.assistant = client.beta.assistants.create( name="SmartAssistant", instructions=""" 당신은 스마트 어시스턴트입니다. 사용자의 요청에 따라 적절한 함수를 호출하여 정확한 정보를 제공하거나 작업을 수행하세요. """, model="gpt-4.1", tools=functions ) print(f"✅ Function Calling 어시스턴트 생성 완료") return self.assistant def chat(self, user_message): """채팅 실행""" thread = client.beta.threads.create() client.beta.threads.messages.create( thread_id=thread.id, role="user", content=user_message ) run = client.beta.threads.runs.create( thread_id=thread.id, assistant_id=self.assistant.id ) # 함수 호출 대기 및 처리 import time max_iterations = 10 iteration = 0 while run.status != "completed" and iteration < max_iterations: time.sleep(1) run = client.beta.threads.runs.retrieve( thread_id=thread.id, run_id=run.id ) if run.status == "requires_action": # 함수 호출 요청 처리 tool_calls = run.required_action.submit_tool_outputs.tool_calls tool_outputs = [] for call in tool_calls: func_name = call.function.name args = json.loads(call.function.arguments) print(f"🔧 함수 호출: {func_name}({args})") # 함수 실행 if func_name == "get_weather": result = get_weather(**args) elif func_name == "create_task": result = create_task(**args) else: result = "알 수 없는 함수입니다." tool_outputs.append({ "tool_call_id": call.id, "output": json.dumps(result) if isinstance(result, dict) else result }) # 함수 결과 제출 run = client.beta.threads.runs.submit_tool_outputs( thread_id=thread.id, run_id=run.id, tool_outputs=tool_outputs ) print("✅ 함수 결과 제출 완료") iteration += 1 # 최종 결과 messages = client.beta.threads.messages.list(thread_id=thread.id) return messages.data[0].content[0].text.value def main(): assistant = FunctionCallingAssistant() assistant.create_assistant() # 테스트 쿼리 queries = [ "서울 날씨 좀 알려주세요", "새로운 할 일 '보고서 작성' 만들고 마감일은 5월 20일로 해주세요" ] for query in queries: print(f"\n👤 사용자: {query}") result = assistant.chat(query) print(f"🤖 어시스턴트: {result}") if __name__ == "__main__": main()

자주 발생하는 오류와 해결책

HolySheep AI + OpenAI Assistants API 사용 시 제가 실제로 겪은 문제들과 해결 방법을 정리했습니다.

오류 1: Thread not found 또는 Invalid thread ID

# ❌ 오류 메시지

Error: No thread found with ID: thread_xxxxx

원인: Thread ID가 유효하지 않거나 만료된 경우

해결: Thread를 생성할 때 metadata에 식별 정보 포함

✅ 올바른 해결 코드

import os from openai import OpenAI client = OpenAI( api_key=os.getenv("HOLYSHEEP_API_KEY"), base_url="https://api.holysheep.ai/v1" ) def create_persistent_thread(): """영구 저장 가능한 Thread 생성""" import uuid # 고유한 Thread ID 생성 thread_id = f"thread_{uuid.uuid4().hex[:16]}" thread = client.beta.threads.create( metadata={ "id": thread_id, "user_id": "user_123", "created_at": str(int(time.time())), "version": "v1.0" } ) # Thread ID와 metadata 함께 저장 (DB 또는 캐시) save_thread_reference(thread_id=thread.id, metadata=thread.metadata) return thread def get_or_create_thread(thread_id=None): """Thread 조회 또는 생성""" if thread_id: try: # 기존 Thread 조회 시도 thread = client.beta.threads.retrieve(thread_id=thread_id) return thread except Exception: # 존재하지 않으면 새로 생성 print(f"⚠️ Thread {thread_id}不存在, 새로 생성합니다.") return create_persistent_thread()

오류 2: Run timeout 또는 status가 forever "in_progress"

# ❌ 오류 메시지

Run stuck in 'in_progress' status for extended period

원인: Code Interpreter의 코드가 무한 루프에 빠지거나,

File Search의 파일 처리가 타임아웃된 경우

✅ 해결: 타임아웃 설정 및 강제 취소 로직 구현

import time from openai import OpenAI import os client = OpenAI( api_key=os.getenv("HOLYSHEEP_API_KEY"), base_url="https://api.holysheep.ai/v1" ) class RobustAssistant: """타임아웃 처리된 어시스턴트""" TIMEOUT_SECONDS = 60 # 60초 타임아웃 def run_with_timeout(self, thread_id, assistant_id, timeout=None): """타임아웃이 있는 Run 실행""" timeout = timeout or self.TIMEOUT_SECONDS start_time = time.time() run = client.beta.threads.runs.create( thread_id=thread_id, assistant_id=assistant_id ) while True: elapsed = time.time() - start_time run = client.beta.threads.runs.retrieve( thread_id=thread_id, run_id=run.id ) if run.status == "completed": return {"status": "success", "result": run} elif run.status in ["failed", "expired", "cancelled"]: return {"status": "failed", "reason": run.status} elif elapsed > timeout: # 타임아웃 시 Run 취소 client.beta.threads.runs.cancel( thread_id=thread_id, run_id=run.id ) return { "status": "timeout", "elapsed": elapsed, "message": f"실행이 {timeout}초를 초과하여 취소되었습니다." } # 진행 상태 출력 remaining = int(timeout - elapsed) print(f"⏳ 진행 중... ({remaining}초 남음) 상태: {run.status}") time.sleep(2) # 2초 간격으로 폴링 def handle_infinite_loop(self, code_content): """코드 실행 전 무한 루프 방지 체크""" dangerous_patterns = [ "while True:", "while 1:", "for i in range(999999999)", "sys.setrecursionlimit" ] for pattern in dangerous_patterns: if pattern in code_content: