LLM-translator/backend/models.py

116 lines
3.9 KiB
Python

"""Pydantic request/response models for the API."""
from pydantic import BaseModel, Field
# ── Auth ───────────────────────────────────────────────
class LoginRequest(BaseModel):
id: str
password: str
class TokenResponse(BaseModel):
access_token: str
token_type: str = "bearer"
class UserInfo(BaseModel):
user_id: str
# ── LLM Config ───────────────────────────────────────
class LLMConfig(BaseModel):
alias: str
base_url: str
api_key: str
model: str
context_size: int
# ── Translation Session ────────────────────────────────
class ProperNoun(BaseModel):
original: str # 원문 고유명사
suggested: str # 제안 번역
final: str = "" # 사용자 최종 결정 (Phase 2)
class Phase1Result(BaseModel):
translated: str # 초벌 번역 결과
proper_nouns: list[ProperNoun] # 추출된 고유명사 리스트
summary: str # 내용 요약
style: str # 문체 분석 결과
warnings: list[str] = [] # JSON 복구/폴백 등 품질 관련 알림
class TranslationChunk(BaseModel):
source_text: str
translated: str
class PhaseProgress(BaseModel):
phase: int
chunk: int
total_chunks: int
status: str
preview: str = ""
class TranslationSession(BaseModel):
"""Full translation session state."""
source_text: str = "" # 원문
source_language: str = "auto" # 출발어 (auto = 자동판단)
target_language: str = "한국어" # 도착어
model_phase1: str = "" # Phase 1 LLM 모델 alias
model_phase2: str = "" # Phase 2 LLM 모델 alias
model_phase3: str = "" # Phase 3 LLM 모델 alias
model_phase4: str = "" # Phase 4 LLM 모델 alias
phase1_result: Phase1Result | None = None # 초벌 번역 결과
phase1_chunks: list[TranslationChunk] = [] # 장문 분할 시 원문/초벌 번역 쌍
phase2_proper_nouns: list[ProperNoun] = [] # Phase 2에서 최종 확정된 고유명사
phase2_style: str = "" # Phase 2에서 최종 확정된 문체
phase3_result: str = "" # 재번역 결과
phase3_chunks: list[str] = [] # 장문 분할 재번역 결과
phase4_result: str = "" # 마무리 다듬기 결과
progress: PhaseProgress | None = None # 장기 작업 진행 상태
# ── API Requests ───────────────────────────────────────
class CreateSessionRequest(BaseModel):
source_text: str
source_language: str = "auto"
target_language: str = "한국어"
model_phase1: str = ""
model_phase2: str = ""
model_phase3: str = ""
model_phase4: str = ""
class PhaseUpdateRequest(BaseModel):
"""Partial update for a specific phase."""
source_text: str | None = None
source_language: str | None = None
target_language: str | None = None
model_phase1: str | None = None
model_phase2: str | None = None
model_phase3: str | None = None
model_phase4: str | None = None
class Phase2ConfirmRequest(BaseModel):
"""User confirms or edits proper nouns and style for Phase 2."""
proper_nouns: list[ProperNoun]
style: str
# ── API Responses ──────────────────────────────────────
class SessionResponse(BaseModel):
session_id: str
data: TranslationSession