Spaces:
Paused
Paused
Download app.py from SM737/satquery-api: direct link, hf CLI and curl.
- Browser
- Download file 2.5 kB
-
https://huggingface.co/spaces/SM737/satquery-api/resolve/main/app.py
- Command line
-
hf download hf://spaces/SM737/satquery-api/app.py
-
curl -L -o app.py https://huggingface.co/spaces/SM737/satquery-api/resolve/main/app.py
2.5 kB
| """Hugging Face Gradio SDK entry point for the existing FastAPI service. | |
| The Gradio Space runner executes this file. SatQuery keeps its API routes so the | |
| separate Vercel frontend can call the same endpoints without a UI rewrite. | |
| """ | |
| import os | |
| import shutil | |
| import uuid | |
| from pathlib import Path | |
| # 1. ZeroGPU compatibility: import spaces BEFORE torch or other GPU libraries | |
| try: | |
| import spaces | |
| except ImportError: | |
| class _MockSpaces: | |
| def GPU(func=None, **kwargs): | |
| if func is not None: | |
| return func | |
| def decorator(f): | |
| return f | |
| return decorator | |
| spaces = _MockSpaces() | |
| os.environ.setdefault("SATQUERY_ENV", "production") | |
| os.environ.setdefault("SATQUERY_OFFLINE_MODE", "true") | |
| os.environ.setdefault("SATQUERY_MODEL_DIR", os.path.join(os.path.dirname(__file__), "models")) | |
| os.environ.setdefault("SATQUERY_ARTIFACT_DIR", "artifacts") | |
| os.environ.setdefault("SATQUERY_DATABASE_PATH", "artifacts/satquery.sqlite3") | |
| import uvicorn | |
| from app.main import app # noqa: E402 | |
| try: | |
| import gradio as gr | |
| def gpu_probe_check(probe_text: str = "health"): | |
| import torch | |
| cuda_avail = torch.cuda.is_available() | |
| device_name = torch.cuda.get_device_name(0) if cuda_avail else "CPU" | |
| return { | |
| "status": "online", | |
| "cuda_available": cuda_avail, | |
| "device": device_name, | |
| "probe": probe_text, | |
| } | |
| with gr.Blocks(title="SatQuery GeoProof API") as demo: | |
| gr.Markdown( | |
| "# 🛰️ SatQuery GeoProof - Space Runner\n" | |
| "This Space hosts the **SatQuery API** service for the Vercel frontend, accelerated with ZeroGPU.\n\n" | |
| "- **API Endpoints**: `/api/v1/analyze`, `/health`, `/api/v1/models`\n" | |
| "- **Interactive Swagger Docs**: [`/docs`](/docs)" | |
| ) | |
| with gr.Row(): | |
| probe_in = gr.Textbox(label="Probe Ping", value="ZeroGPU Ready", placeholder="Status check...") | |
| probe_out = gr.JSON(label="Hardware Info") | |
| probe_btn = gr.Button("Test GPU Allocation", variant="primary") | |
| probe_btn.click(fn=gpu_probe_check, inputs=[probe_in], outputs=[probe_out]) | |
| app = gr.mount_gradio_app(app, demo, path="/") | |
| except Exception as exc: | |
| import traceback | |
| print("Gradio setup failed with exception:") | |
| traceback.print_exc() | |
| if __name__ == "__main__": | |
| uvicorn.run(app, host="0.0.0.0", port=7860, workers=1) | |