|
""" |
|
Sema Translation API - Main Application |
|
Enterprise-grade translation API with proper FastAPI structure |
|
""" |
|
|
|
from fastapi import FastAPI |
|
from fastapi.middleware.cors import CORSMiddleware |
|
from fastapi.middleware.trustedhost import TrustedHostMiddleware |
|
from slowapi import _rate_limit_exceeded_handler |
|
from slowapi.errors import RateLimitExceeded |
|
|
|
from .core.config import settings |
|
from .core.logging import configure_logging, get_logger |
|
from .middleware.request_middleware import request_middleware |
|
from .services.translation import load_models |
|
from .api.v1.endpoints import router as v1_router, limiter |
|
|
|
|
|
configure_logging() |
|
logger = get_logger() |
|
|
|
|
|
def create_application() -> FastAPI: |
|
"""Create and configure the FastAPI application""" |
|
|
|
app = FastAPI( |
|
title=settings.app_name, |
|
description=""" |
|
Enterprise translation API supporting 200+ languages with automatic language detection. |
|
|
|
**Key Features:** |
|
- Automatic language detection |
|
- 200+ FLORES-200 language support |
|
- Rate limiting (60 req/min per IP) |
|
- Character limit (5000 chars per request) |
|
- Prometheus metrics and monitoring |
|
- Request tracking with unique IDs |
|
|
|
**Endpoints:** |
|
- `/translate` - Main translation endpoint |
|
- `/detect-language` - Language detection |
|
- `/languages` - Supported languages information |
|
- `/health` - System health monitoring |
|
- `/metrics` - Prometheus metrics |
|
""", |
|
version=settings.app_version, |
|
docs_url="/", |
|
redoc_url="/redoc", |
|
openapi_url="/openapi.json", |
|
contact={ |
|
"name": "Sema AI Team", |
|
"url": "https://github.com/lewiskimaru/sema", |
|
"email": "support@sema.ai" |
|
}, |
|
license_info={ |
|
"name": "MIT License", |
|
"url": "https://opensource.org/licenses/MIT" |
|
}, |
|
servers=[ |
|
{ |
|
"url": "https://sematech-sema-api.hf.space", |
|
"description": "Production server" |
|
}, |
|
{ |
|
"url": "http://localhost:8000", |
|
"description": "Development server" |
|
} |
|
] |
|
) |
|
|
|
|
|
app.state.limiter = limiter |
|
app.add_exception_handler(RateLimitExceeded, _rate_limit_exceeded_handler) |
|
|
|
|
|
if settings.allowed_hosts != ["*"]: |
|
app.add_middleware(TrustedHostMiddleware, allowed_hosts=settings.allowed_hosts) |
|
|
|
|
|
app.add_middleware( |
|
CORSMiddleware, |
|
allow_origins=settings.cors_origins, |
|
allow_credentials=True, |
|
allow_methods=["GET", "POST", "OPTIONS"], |
|
allow_headers=["*"], |
|
) |
|
|
|
|
|
app.middleware("http")(request_middleware) |
|
|
|
|
|
app.include_router(v1_router, prefix="/api/v1") |
|
|
|
app.include_router(v1_router, prefix="", include_in_schema=False) |
|
|
|
return app |
|
|
|
|
|
|
|
app = create_application() |
|
|
|
|
|
@app.on_event("startup") |
|
async def startup_event(): |
|
"""Initialize the application on startup""" |
|
logger.info("application_startup", version=settings.app_version, environment=settings.environment) |
|
|
|
print(f"\n[INFO] Starting {settings.app_name} v{settings.app_version}") |
|
print("[INFO] Loading translation models...") |
|
|
|
try: |
|
load_models() |
|
logger.info("models_loaded_successfully") |
|
print("[SUCCESS] API started successfully") |
|
print(f"[CONFIG] Metrics enabled: {settings.enable_metrics}") |
|
print(f"[CONFIG] Environment: {settings.environment}") |
|
print(f"[ENDPOINT] Documentation: / (Swagger UI)") |
|
print(f"[ENDPOINT] Metrics: /metrics") |
|
print(f"[ENDPOINT] Health: /health") |
|
print(f"[ENDPOINT] Status: /status") |
|
print(f"[ENDPOINT] API v1: /api/v1/") |
|
print() |
|
|
|
except Exception as e: |
|
logger.error("startup_failed", error=str(e)) |
|
print(f"[ERROR] Startup failed: {e}") |
|
raise |
|
|
|
|
|
@app.on_event("shutdown") |
|
async def shutdown_event(): |
|
"""Cleanup on application shutdown""" |
|
logger.info("application_shutdown") |
|
print("\n[INFO] Shutting down Sema Translation API...") |
|
print("[INFO] Cleaning up resources...") |
|
print("[SUCCESS] Shutdown complete\n") |
|
|
|
|
|
if __name__ == "__main__": |
|
import uvicorn |
|
uvicorn.run( |
|
"app.main:app", |
|
host="0.0.0.0", |
|
port=8000, |
|
reload=settings.debug |
|
) |
|
|