from fastapi import FastAPI, BackgroundTasks, HTTPException from pydantic import BaseModel from typing import Optional from generation import generate_image_from_prompt app = FastAPI(title="Sofia AI Backend") class MessageRequest(BaseModel): platform: str message: str user_id: str timestamp: Optional[str] = None class ImageGenerationRequest(BaseModel): prompt_type: Optional[str] = None custom_prompt: Optional[str] = None model: str = "black-forest-labs/FLUX.1-dev" @app.get("/health") async def health(): return {"status": "ok", "service": "sofia-ai-backend"} @app.post("/webhook/message") async def webhook_message(body: MessageRequest, background_tasks: BackgroundTasks): # Aquí luego conectarás lógica real (guardar en cola, n8n, etc.) background_tasks.add_task( lambda: print(f"[Message] {body.platform}: {body.message} (user: {body.user_id})") ) return {"status": "queued"} @app.post("/api/generate") async def api_generate(body: ImageGenerationRequest): # 1) Validar entrada if not body.custom_prompt and not body.prompt_type: raise HTTPException(status_code=400, detail="prompt_type or custom_prompt required") # 2) Construir prompt final (basado en tipos de Sofia Rivera) if body.custom_prompt: final_prompt = body.custom_prompt negative_prompt = "" else: prompt_map = { "lifestyle": { "prompt": ( "foto selfie profesional con iPhone de Sofia Rivera, hermosa mujer latina " "cubanoamericana de 25 años, cabello largo oscuro y ondulado, sonrisa cálida, " "departamento de Miami con vista al mar, golden hour, estética influencer Instagram" ), "negative": "borroso, de baja calidad, distorsionado, deformado, feo, mala anatomía", }, "fitness": { "prompt": ( "selfie de cuerpo completo en el espejo de Sofia Rivera, influencer latina fitness, " "cuerpo atlético tonificado, sujetador deportivo negro, mallas de cintura alta, " "gimnasio moderno con espejos, iluminación natural, estética fitness Instagram" ), "negative": "borroso, de baja calidad, distorsionado, malas proporciones", }, "premium_boudoir": { "prompt": ( "selfie en el dormitorio de Sofia Rivera, influencer latina de 25 años, lencería de encaje " "blanco, luz suave de la mañana a través de cortinas transparentes, cama lujosa con sábanas " "de seda, expresión sensual y segura, estilo boudoir de buen gusto, fotografía profesional" ), "negative": "explícito, borroso, de baja calidad, distorsionado", }, "fashion": { "prompt": ( "foto de estilo urbano de Sofia Rivera, influencer de moda latina, outfit moderno de Miami, " "gafas de sol de diseñador, pose natural y segura, fondo urbano, golden hour, estética moda Instagram" ), "negative": "borroso, de baja calidad, mala iluminación", }, "beach": { "prompt": ( "foto de estilo de vida de Sofia Rivera en la playa, influencer latina, Miami Beach al atardecer, " "atuendo casual de playa, expresión natural feliz, vibraciones tropicales, contenido lifestyle Instagram" ), "negative": "borroso, de baja calidad, distorsionado", }, } if body.prompt_type not in prompt_map: raise HTTPException(status_code=400, detail=f"Unknown prompt_type: {body.prompt_type}") final_prompt = prompt_map[body.prompt_type]["prompt"] negative_prompt = prompt_map[body.prompt_type]["negative"] # 3) Llamar al motor de generación REAL (generation.py) image_path, status = generate_image_from_prompt( prompt=final_prompt, negative_prompt=negative_prompt, model_name=body.model, seed=None, ) if image_path is None: raise HTTPException(status_code=500, detail=status) return { "status": "completed", "prompt": final_prompt, "model": body.model, "image_path": image_path, "status_message": status, } if __name__ == "__main__": import uvicorn uvicorn.run(app, host="0.0.0.0", port=7860)