import random from fastapi import APIRouter, Depends from fastapi.responses import JSONResponse from src.api_models import ( ResponseGuessWord, ResponseSemanticCalculation, RequestSemanticCalculation, ResponseMessage, SemanticCalculation ) from src.setting import AVAILABLE_WORDS, CFG from src.vector_db import VectorDatabaseHandler router = APIRouter() DEFAULT_RESPONSES = { 500: {"description": "Internal Server Error", "model": ResponseMessage}, } @router.get( "/v1/service/status", response_model=ResponseMessage, responses={**DEFAULT_RESPONSES}, description="Description: The endpoint is used to check the service status.", tags=["Service Status"] ) async def status() -> ResponseMessage: """Health endpoint.""" return ResponseMessage(message="Success.") @router.get( "/v1/service/get_guess_word", response_model=ResponseGuessWord, responses={**DEFAULT_RESPONSES}, description="Description: The endpoint is used to get a random word from the list of available words.", tags=["Get Word"] ) async def get_guess_word() -> ResponseGuessWord: try: guess_word = random.choices(AVAILABLE_WORDS, k=1)[0] except Exception as e: return JSONResponse(status_code=500, content={"message": str(e)}) return ResponseGuessWord(word=guess_word) @router.get( "/v1/service/semantic_calculation", response_model=ResponseSemanticCalculation, responses={**DEFAULT_RESPONSES}, description="Description: The endpoint is used to calculate the semantic similarity between the guessed word \ and the supposed word.", tags=["Semantic Analysis"] ) async def semantic_calculation( request: RequestSemanticCalculation = Depends(RequestSemanticCalculation) ) -> ResponseGuessWord: supposed_word = request.supposed_word guessed_word = request.guessed_word if supposed_word not in AVAILABLE_WORDS: return ResponseSemanticCalculation( word_exist=False, metadata=None ) vector_db = VectorDatabaseHandler( db_path=CFG.db.folder_path, table_name=CFG.db.table_name, metrics_cfg=CFG.db.metrics ) try: result = vector_db(guessed_word, supposed_word) except Exception as e: return JSONResponse(status_code=500, content={"message": str(e)}) return ResponseSemanticCalculation( word_exist=True, metadata=SemanticCalculation(**result) )