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)