wellsaid / app /services /translation.py
iamspruce
fixed the api
73a6a7e
import logging
from app.services.base import load_hf_pipeline
from app.core.config import settings, APP_NAME
from app.core.exceptions import ServiceError
logger = logging.getLogger(f"{APP_NAME}.services.translation")
class Translator:
def __init__(self):
self._pipeline = None
def _get_pipeline(self):
if self._pipeline is None:
logger.info("Loading translation pipeline...")
self._pipeline = load_hf_pipeline(
model_id=settings.TRANSLATION_MODEL_ID,
task="translation",
feature_name="Translation"
)
return self._pipeline
async def translate(self, text: str, target_lang: str) -> dict:
text = text.strip()
target_lang = target_lang.strip()
if not text:
raise ServiceError(status_code=400, detail="Input text is empty for translation.")
if not target_lang:
raise ServiceError(status_code=400, detail="Target language is empty for translation.")
if target_lang not in settings.SUPPORTED_TRANSLATION_LANGUAGES:
raise ServiceError(
status_code=400,
detail=f"Unsupported target language: {target_lang}. "
f"Supported languages are: {', '.join(settings.SUPPORTED_TRANSLATION_LANGUAGES)}"
)
try:
pipeline = self._get_pipeline()
prompt = f">>{target_lang}<< {text}"
result = pipeline(prompt, max_length=256, num_beams=1, early_stopping=True)[0]
translated_text = result.get("translation_text") or result.get("generated_text")
return {"translated_text": translated_text.strip()}
except Exception as e:
logger.error(f"Translation error for text: '{text[:50]}...' to '{target_lang}'", exc_info=True)
raise ServiceError(status_code=500, detail="An internal error occurred during translation.") from e