tienhiep-api / backend /engine /translate_api_server.py
Cong123779
deploy: update backend production to new Space
d9bfc2d
Raw
History Blame Contribute Delete
2.8 kB
import os
import sys
import json
import asyncio
from fastapi import FastAPI, HTTPException, Body
from fastapi.responses import StreamingResponse
from pydantic import BaseModel
from typing import List, Optional
# Add parent directory to path to import engine
current_dir = os.path.dirname(os.path.abspath(__file__))
sys.path.insert(0, os.path.dirname(os.path.dirname(current_dir)))
from backend.engine.engine import VietphraseEngine
from backend.config import Config
app = FastAPI(
title="Vietphrase Translation Standalone API Server",
description="Standalone API for fast Chinese to Vietnamese translation with 5 modes"
)
# Initialize engine
print("Lazy-loading Vietphrase Engine on API Startup...")
engine = VietphraseEngine()
print("Vietphrase Engine successfully loaded!")
class TranslateRequest(BaseModel):
texts: List[str]
mode: Optional[str] = "advanced"
@app.get("/health")
def health():
return {
"status": "ok",
"modes": ["advanced", "fast", "vietphrase", "hanviet", "advanced_hanviet"],
"dictionary_sizes": {
"char_dict": len(engine.char_dict),
"proper_names": len(engine.proper_names),
"vietphrase": len(engine.vietphrase)
}
}
@app.post("/v1/translate")
def translate(req: TranslateRequest):
if not req.texts:
raise HTTPException(status_code=400, detail="Missing 'texts' list")
translations = []
for text in req.texts:
if not text.strip():
translations.append(text)
else:
try:
translations.append(engine.translate(text, mode=req.mode))
except Exception as e:
translations.append(text)
print(f"Error translating text: {e}")
return {"translations": translations}
@app.post("/v1/translate_stream")
async def translate_stream(req: TranslateRequest):
if not req.texts:
raise HTTPException(status_code=400, detail="Missing 'texts' list")
async def event_generator():
for i, text in enumerate(req.texts):
if not text.strip():
trans = text
else:
try:
trans = engine.translate(text, mode=req.mode)
except Exception as e:
trans = text
print(f"Error streaming translation: {e}")
yield f"data: {json.dumps({'index': i, 'text': trans}, ensure_ascii=False)}\n\n"
await asyncio.sleep(0.001)
return StreamingResponse(event_generator(), media_type="text/event-stream")
if __name__ == "__main__":
import uvicorn
port = int(os.environ.get("PORT", 8050))
uvicorn.run("translate_api_server:app", host="0.0.0.0", port=port, reload=False)