import os from io import BytesIO import tiktoken from config.setting import ALLOWED_EXTENSIONS from fastapi import HTTPException, UploadFile def validate_all_files(*upload_files: UploadFile): for upload_file in upload_files: if not upload_file: continue _, ext = os.path.splitext(upload_file.filename.lower()) if ext not in ALLOWED_EXTENSIONS: raise HTTPException( status_code=400, detail=( f"파일 '{upload_file.filename}'은(는) 지원하지 않는 확장자입니다. " f"허용된 확장자는 {', '.join(ALLOWED_EXTENSIONS)} 입니다." ), ) def token_counter(prompt: str, text: str) -> int: try: enc = tiktoken.get_encoding("cl100k_base") # OpenAI 기반 tokenizer token_count = len(enc.encode(prompt + text)) except Exception: token_count = len(prompt + text) // 4 # fallback: 대략적 추정 return token_count # ✅ UploadFile을 대신할 수 있는 간단한 래퍼 클래스 class SimpleUploadFile: def __init__( self, filename: str, content: bytes, content_type: str = "application/octet-stream", ): self.filename = filename self.file = BytesIO(content) self.content_type = content_type # ✅ UploadFile 객체 복사 → SimpleUploadFile로 변환 def clone_upload_file(upload_file: UploadFile) -> SimpleUploadFile: file_bytes = upload_file.file.read() upload_file.file.seek(0) return SimpleUploadFile( filename=upload_file.filename, content=file_bytes, content_type=upload_file.content_type, )