Spaces:
Runtime error
Runtime error
Update app.py
Browse files
app.py
CHANGED
|
@@ -10,13 +10,13 @@ from pydantic import BaseModel
|
|
| 10 |
API_URL = "https://api-inference.huggingface.co/models/joyfox/Qwen-Image-Edit-Cosplay"
|
| 11 |
HF_TOKEN = os.getenv("HF_TOKEN")
|
| 12 |
|
| 13 |
-
# 2. Inicializamos FastAPI
|
| 14 |
-
|
| 15 |
|
| 16 |
class CosplayPayload(BaseModel):
|
| 17 |
data: list[str]
|
| 18 |
|
| 19 |
-
@
|
| 20 |
async def fusionar_cosplay(payload: CosplayPayload):
|
| 21 |
if not HF_TOKEN:
|
| 22 |
print("[-] ERROR: El HF_TOKEN no está configurado en las variables (Secrets) del Space.")
|
|
@@ -32,7 +32,7 @@ async def fusionar_cosplay(payload: CosplayPayload):
|
|
| 32 |
data_uri_real = payload.data[0] if payload.data[0].startswith("data:") else f"data:image/jpeg;base64,{payload.data[0]}"
|
| 33 |
data_uri_ref = payload.data[1] if payload.data[1].startswith("data:") else f"data:image/jpeg;base64,{payload.data[1]}"
|
| 34 |
|
| 35 |
-
prompt_texto = "把图2中动漫人物中的发型,服饰
|
| 36 |
|
| 37 |
# Payload JSON limpio para la API de Inferencia Serverless
|
| 38 |
json_payload = {
|
|
@@ -52,7 +52,7 @@ async def fusionar_cosplay(payload: CosplayPayload):
|
|
| 52 |
|
| 53 |
print("[+] Enviando petición a la API de Inferencia de Hugging Face mediante el puente de Gradio...")
|
| 54 |
|
| 55 |
-
#
|
| 56 |
respuesta = requests.post(API_URL, headers=headers, json=json_payload, timeout=110)
|
| 57 |
print(f"[+] Respuesta recibida. Código de estado: {respuesta.status_code}")
|
| 58 |
|
|
@@ -76,11 +76,11 @@ async def fusionar_cosplay(payload: CosplayPayload):
|
|
| 76 |
print("=====================================================\n")
|
| 77 |
raise fastapi.HTTPException(status_code=500, detail=f"Crash interno: {str(e)}")
|
| 78 |
|
| 79 |
-
# 3. Interfaz de Gradio
|
| 80 |
with gr.Blocks() as demo:
|
| 81 |
gr.Markdown("# Cosplay API Bridge Active 🎭")
|
| 82 |
gr.Markdown("Este Space está corriendo un servidor FastAPI en segundo plano optimizado para peticiones desde Android.")
|
| 83 |
|
| 84 |
-
# 4.
|
| 85 |
-
#
|
| 86 |
-
app = gr.mount_gradio_app(
|
|
|
|
| 10 |
API_URL = "https://api-inference.huggingface.co/models/joyfox/Qwen-Image-Edit-Cosplay"
|
| 11 |
HF_TOKEN = os.getenv("HF_TOKEN")
|
| 12 |
|
| 13 |
+
# 2. Inicializamos FastAPI de manera independiente
|
| 14 |
+
io_app = fastapi.FastAPI()
|
| 15 |
|
| 16 |
class CosplayPayload(BaseModel):
|
| 17 |
data: list[str]
|
| 18 |
|
| 19 |
+
@io_app.post("/api/predict")
|
| 20 |
async def fusionar_cosplay(payload: CosplayPayload):
|
| 21 |
if not HF_TOKEN:
|
| 22 |
print("[-] ERROR: El HF_TOKEN no está configurado en las variables (Secrets) del Space.")
|
|
|
|
| 32 |
data_uri_real = payload.data[0] if payload.data[0].startswith("data:") else f"data:image/jpeg;base64,{payload.data[0]}"
|
| 33 |
data_uri_ref = payload.data[1] if payload.data[1].startswith("data:") else f"data:image/jpeg;base64,{payload.data[1]}"
|
| 34 |
|
| 35 |
+
prompt_texto = "把图2中动漫人物中的发型,服饰 and 装扮道具迁移到图1的真实人物,图1真实人物保持高度人脸一致性"
|
| 36 |
|
| 37 |
# Payload JSON limpio para la API de Inferencia Serverless
|
| 38 |
json_payload = {
|
|
|
|
| 52 |
|
| 53 |
print("[+] Enviando petición a la API de Inferencia de Hugging Face mediante el puente de Gradio...")
|
| 54 |
|
| 55 |
+
# Petición HTTP POST síncrona
|
| 56 |
respuesta = requests.post(API_URL, headers=headers, json=json_payload, timeout=110)
|
| 57 |
print(f"[+] Respuesta recibida. Código de estado: {respuesta.status_code}")
|
| 58 |
|
|
|
|
| 76 |
print("=====================================================\n")
|
| 77 |
raise fastapi.HTTPException(status_code=500, detail=f"Crash interno: {str(e)}")
|
| 78 |
|
| 79 |
+
# 3. Interfaz de Gradio (Obligatoria para que Hugging Face mantenga vivo el contenedor)
|
| 80 |
with gr.Blocks() as demo:
|
| 81 |
gr.Markdown("# Cosplay API Bridge Active 🎭")
|
| 82 |
gr.Markdown("Este Space está corriendo un servidor FastAPI en segundo plano optimizado para peticiones desde Android.")
|
| 83 |
|
| 84 |
+
# 4. Montamos la aplicación de FastAPI dentro de la instancia de Gradio 'demo'
|
| 85 |
+
# El objeto final resultante se debe mapear de nuevo a la aplicación nativa para que la plataforma lo detecte.
|
| 86 |
+
app = gr.mount_gradio_app(io_app, demo, path="/")
|