GoGma's picture
Update api.py
c704ad6 verified
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)