samu's picture
optimized backend
77e56ff
raw
history blame
2.13 kB
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
}