Spaces:
Running
Running
from fastapi import HTTPException | |
from fastapi.responses import JSONResponse | |
from typing import Callable, Dict, Any | |
from backend import config | |
from backend.cache import cache | |
from backend.utils import generate_completions | |
async def handle_generation_request( | |
data: Any, | |
mode: str, | |
instructions_template: str | |
) -> JSONResponse: | |
""" | |
Shared handler for all generation endpoints (curriculum, flashcards, exercises, simulation). | |
Args: | |
data: The GenerationRequest object containing query and metadata | |
mode: The type of generation (curriculum, flashcards, exercises, simulation) | |
instructions_template: The template string from config to use | |
Returns: | |
JSONResponse with the generated content | |
Raises: | |
HTTPException: If required metadata is missing or other errors occur | |
""" | |
# Validate required metadata | |
if not (data.native_language and data.target_language and data.proficiency): | |
raise HTTPException( | |
status_code=400, | |
detail="native_language, target_language, and proficiency are required. Please extract metadata first." | |
) | |
# Format instructions with metadata | |
instructions = ( | |
instructions_template | |
.replace("{native_language}", data.native_language) | |
.replace("{target_language}", data.target_language) | |
.replace("{proficiency}", data.proficiency) | |
) | |
# Get response from cache or generate new | |
response = await cache.get_or_set( | |
(str(data.query), instructions), | |
generate_completions.get_completions, | |
data.query, | |
instructions | |
) | |
return JSONResponse( | |
content={ | |
"data": response, | |
"type": mode, | |
"status": "success" | |
}, | |
status_code=200 | |
) | |
# Mapping of modes to their instruction templates | |
INSTRUCTION_TEMPLATES: Dict[str, str] = { | |
"curriculum": config.curriculum_instructions, | |
"flashcards": config.flashcard_mode_instructions, | |
"exercises": config.exercise_mode_instructions, | |
"simulation": config.simulation_mode_instructions | |
} |