Spaces:
Running
Running
File size: 4,614 Bytes
e859e00 45bc0ca 3e7859d c704ad6 45bc0ca e859e00 45bc0ca c704ad6 e859e00 3e7859d e859e00 c704ad6 e859e00 3e7859d c704ad6 45bc0ca e859e00 c704ad6 e859e00 c704ad6 e859e00 3e7859d e859e00 45bc0ca c704ad6 3e7859d c704ad6 3e7859d c704ad6 3e7859d c704ad6 3e7859d c704ad6 3e7859d c704ad6 3e7859d 45bc0ca 3e7859d e859e00 c704ad6 45bc0ca 32027a1 c704ad6 32027a1 e859e00 c704ad6 32027a1 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 |
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)
|