Alture-AI / app.py
MozI1223's picture
fix: ZeroGPU server binding 0.0.0.0:7860
da9c720
Raw
History Blame
2.82 kB
"""
Alture AI — Hugging Face ZeroGPU Production Backend Entrypoint
============================================================
Official Hugging Face ZeroGPU production runner using user's proven monkeypatching pattern.
"""
import os
import sys
import torch
import gradio as gr
from fastapi.middleware.cors import CORSMiddleware
from fastapi.responses import Response
try:
import spaces
@spaces.GPU
def dummy_gpu_function():
return "ZeroGPU is active and ready"
except ImportError:
def dummy_gpu_function():
return "Local CPU mode"
from deployment.backend.main import app as main_fastapi_app
# Create Gradio demo to satisfy ZeroGPU compiler
with gr.Blocks(title="Alture AI Backend API") as demo:
gr.Markdown("# Alture AI — Production ZeroGPU Backend Engine")
gr.Markdown("FastAPI REST endpoints available under `/api/v1` and `/v1`.")
btn = gr.Button("⚡ Verify ZeroGPU Pipeline", variant="primary")
out = gr.Textbox(label="Pipeline Output")
btn.click(dummy_gpu_function, outputs=out)
# Monkeypatch Gradio's internal FastAPI app creator (proven portfolio pattern)
original_create_app = gr.routes.App.create_app
def custom_create_app(*args, **kwargs):
app = original_create_app(*args, **kwargs)
# Configure CORS & preflight middleware
app.add_middleware(
CORSMiddleware,
allow_origins=["*"],
allow_credentials=True,
allow_methods=["*"],
allow_headers=["*"],
)
@app.middleware("http")
async def cors_preflight_middleware(request, call_next):
if request.method == "OPTIONS":
return Response(
status_code=200,
headers={
"Access-Control-Allow-Origin": "*",
"Access-Control-Allow-Methods": "*",
"Access-Control-Allow-Headers": "*",
}
)
response = await call_next(request)
response.headers["Access-Control-Allow-Origin"] = "*"
response.headers["Access-Control-Allow-Methods"] = "*"
response.headers["Access-Control-Allow-Headers"] = "*"
return response
# Inject main FastAPI app router
app.include_router(main_fastapi_app.router)
# Reorder routes so /api and /v1 routes take precedence
api_routes = []
other_routes = []
for route in app.router.routes:
path = getattr(route, 'path', '')
if path.startswith("/api") or path.startswith("/v1") or path.startswith("/health"):
api_routes.append(route)
else:
other_routes.append(route)
app.router.routes = api_routes + other_routes
return app
gr.routes.App.create_app = custom_create_app
if __name__ == "__main__":
demo.launch(server_name="0.0.0.0", server_port=7860)