samu's picture
optimized backend
77e56ff
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
}