58 lines
1.7 KiB
Python
58 lines
1.7 KiB
Python
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,
|
|
)
|