SJLee-0525
[CHORE] test9
9f30ef0
"""
μ•± μ„€μ • 파일
"""
import os
from dataclasses import dataclass
from typing import Dict
@dataclass
class AppConfig:
"""μ•± μ„€μ • 클래슀"""
# μ•± 정보
app_name: str = "μŒμ„± 검증 μ‹œμŠ€ν…œ"
version: str = "1.0.0"
# STT μ„€μ •
stt_provider: str = os.getenv('STT_PROVIDER', 'mock') # 'openai', 'google', 'azure', 'mock'
# OpenAI μ„€μ •
openai_api_key: str = os.getenv('OPENAI_API_KEY', '')
openai_model: str = "whisper-1"
# Google μ„€μ •
google_credentials_path: str = os.getenv('GOOGLE_APPLICATION_CREDENTIALS', '')
# Azure μ„€μ •
azure_speech_key: str = os.getenv('AZURE_SPEECH_KEY', '')
azure_speech_region: str = os.getenv('AZURE_SPEECH_REGION', 'koreacentral')
# λ‚œμ΄λ„ μ„€μ •
min_difficulty: int = 1
max_difficulty: int = 5
default_difficulty: int = 1
# μœ μ‚¬λ„ μž„κ³„κ°’ (λ‚œμ΄λ„λ³„)
similarity_thresholds: Dict[int, float] = None
# UI μ„€μ •
theme: str = "soft"
primary_color: str = "indigo"
# μ„œλ²„ μ„€μ •
server_name: str = os.getenv("SERVER_HOST")
server_port: int = os.getenv("FRONTEND_PORT")
share: bool = False
# λ°±μ—”λ“œ μ„€μ •
backend_port: int = os.getenv("BACKEND_PORT")
backend_api_url: str = os.getenv("BACKEND_API_URL", "")
# 파일 μ„€μ •
max_audio_duration: int = 30 # 초
allowed_audio_formats: list = None
def __post_init__(self):
"""μ΄ˆκΈ°ν™” ν›„ 처리"""
# κΈ°λ³Έ μž„κ³„κ°’ μ„€μ •
if self.similarity_thresholds is None:
self.similarity_thresholds = {
1: 0.70,
2: 0.75,
3: 0.80,
4: 0.85,
5: 0.90
}
# ν—ˆμš© μ˜€λ””μ˜€ 포맷 μ„€μ •
if self.allowed_audio_formats is None:
self.allowed_audio_formats = [
'.wav', '.mp3', '.m4a', '.ogg', '.flac', '.webm'
]
@classmethod
def from_env(cls):
"""
ν™˜κ²½ λ³€μˆ˜μ—μ„œ μ„€μ • λ‘œλ“œ
Returns:
AppConfig: μ„€μ • μΈμŠ€ν„΄μŠ€
"""
backend_port = os.getenv('BACKEND_PORT')
return cls(
stt_provider=os.getenv('STT_PROVIDER', 'mock'),
openai_api_key=os.getenv('OPENAI_API_KEY', ''),
server_name=os.getenv('SERVER_HOST'),
server_port=int(os.getenv('FRONTEND_PORT')),
backend_port=int(backend_port),
backend_api_url=os.getenv('BACKEND_API_URL', f'http://localhost:{backend_port}'),
share=os.getenv('GRADIO_SHARE', 'false').lower() == 'true'
)
def validate(self) -> bool:
"""
μ„€μ • 검증
Returns:
bool: 유효 μ—¬λΆ€
Raises:
ValueError: 섀정이 μœ νš¨ν•˜μ§€ μ•Šμ„ λ•Œ
"""
# STT provider별 검증
if self.stt_provider == 'openai':
if not self.openai_api_key:
raise ValueError("OpenAI API ν‚€κ°€ μ„€μ •λ˜μ§€ μ•Šμ•˜μŠ΅λ‹ˆλ‹€")
elif self.stt_provider == 'google':
if not self.google_credentials_path:
raise ValueError("Google 인증 파일 κ²½λ‘œκ°€ μ„€μ •λ˜μ§€ μ•Šμ•˜μŠ΅λ‹ˆλ‹€")
elif self.stt_provider == 'azure':
if not self.azure_speech_key:
raise ValueError("Azure Speech ν‚€κ°€ μ„€μ •λ˜μ§€ μ•Šμ•˜μŠ΅λ‹ˆλ‹€")
# λ‚œμ΄λ„ λ²”μœ„ 검증
if not (1 <= self.min_difficulty <= self.max_difficulty <= 5):
raise ValueError("λ‚œμ΄λ„ λ²”μœ„κ°€ μ˜¬λ°”λ₯΄μ§€ μ•ŠμŠ΅λ‹ˆλ‹€")
return True
def to_dict(self) -> dict:
"""
λ”•μ…”λ„ˆλ¦¬λ‘œ λ³€ν™˜
Returns:
dict: μ„€μ • λ”•μ…”λ„ˆλ¦¬
"""
return {
'app_name': self.app_name,
'version': self.version,
'stt_provider': self.stt_provider,
'difficulty_range': f"{self.min_difficulty}-{self.max_difficulty}",
'server': f"{self.server_name}:{self.server_port}"
}
def __str__(self) -> str:
"""λ¬Έμžμ—΄ ν‘œν˜„"""
config_dict = self.to_dict()
lines = [f"{k}: {v}" for k, v in config_dict.items()]
return "\n".join(lines)