# api/routes.py import time import os import re import json import logging import uuid from datetime import datetime, timedelta from fastapi import APIRouter, Request from fastapi.responses import JSONResponse, HTMLResponse from .chatbot import CookingTutorChatbot logger = logging.getLogger("routes") # Create router router = APIRouter() # Initialize cooking tutor chatbot chatbot = CookingTutorChatbot( model_name="gemini-2.5-flash" ) @router.post("/chat") async def chat_endpoint(req: Request): """Chat endpoint (web-search only). No DB persistence, no image handling.""" body = await req.json() user_id = body.get("user_id", "anonymous") query_raw = body.get("query") query = query_raw.strip() if isinstance(query_raw, str) else "" lang = body.get("lang", "EN") search_mode = body.get("search", True) video_mode = body.get("video", False) # Optional cooking constraints servings = body.get("servings") dietary = body.get("dietary") # e.g., ["vegetarian", "gluten-free"] allergens = body.get("allergens") # e.g., ["peanuts", "shellfish"] equipment = body.get("equipment") # e.g., ["oven", "cast iron skillet"] time_limit = body.get("time_limit_minutes") # e.g., 30 skill_level = body.get("skill_level") # beginner|intermediate|advanced cuisine = body.get("cuisine") # e.g., "Italian" structured = body.get("structured", False) start = time.time() try: answer = chatbot.chat( user_id, query, lang, search_mode, video_mode, servings=servings, dietary=dietary, allergens=allergens, equipment=equipment, time_limit_minutes=time_limit, skill_level=skill_level, cuisine=cuisine, structured=structured, ) elapsed = time.time() - start # Handle response format (might be string or dict with videos) if isinstance(answer, dict): response_text = answer.get('text', '') video_data = answer.get('videos', []) else: response_text = answer video_data = [] # Final response response_data = {"response": f"{response_text}\n\n(Response time: {elapsed:.2f}s)"} # Include video data if available if video_data: response_data["videos"] = video_data return JSONResponse(response_data) except Exception as e: logger.error(f"[REQUEST] Error processing request: {e}") return JSONResponse({"response": "❌ Failed to get a response. Please try again."}) @router.get("/check-request/{request_id}") async def check_request_status(request_id: str): """Legacy endpoint kept for compatibility; returns not supported.""" return JSONResponse({"status": "unsupported"}) @router.get("/pending-requests/{user_id}") async def get_pending_requests(user_id: str): """Legacy endpoint kept for compatibility; returns empty list.""" return JSONResponse({"requests": []}) @router.delete("/cleanup-requests") async def cleanup_old_requests(): """Legacy endpoint kept for compatibility; no-op.""" return JSONResponse({"deleted_count": 0}) @router.get("/health") async def health_check(): """Health check endpoint""" return {"status": "healthy", "service": "cooking-tutor"} @router.get("/") async def root(): """Root endpoint - Landing page with redirect to main app""" html_content = """ Cooking Tutor API

Cooking Tutor

AI-Powered Cooking Lessons & Recipe Guidance

API Version 1.0.0

Open Frontend
Friendly
Step-by-step
Multi-Language
""" return HTMLResponse(content=html_content)