Spaces:
Running
Running
| 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" | |
| async def health(): | |
| return {"status": "ok", "service": "sofia-ai-backend"} | |
| 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"} | |
| 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) | |