File size: 4,198 Bytes
705d282
 
 
 
d1ed09d
705d282
 
 
 
 
 
 
0c5818b
705d282
 
 
 
 
 
 
fa9a2fa
705d282
810bf3f
d1ed09d
705d282
d1ed09d
 
 
73c3249
 
 
 
 
 
705d282
fa9a2fa
 
 
705d282
 
 
d1ed09d
24e24f3
755230a
 
 
ee3b1c9
3cca29d
 
 
 
 
 
 
 
 
 
 
 
705d282
 
 
 
fa9a2fa
705d282
810bf3f
fa9a2fa
bf4af03
705d282
 
fa9a2fa
705d282
fa9a2fa
 
594ffdd
aa8c944
705d282
aa8c944
 
 
705d282
 
810bf3f
d1ed09d
705d282
755230a
d1ed09d
705d282
 
 
755230a
 
fa9a2fa
aa8c944
bfc464c
705d282
 
 
 
 
bfc464c
705d282
 
 
8d0bb7b
41da63d
705d282
 
 
d1ed09d
e178c81
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
###############################################################################
# 1) Set environment variables BEFORE importing Gradio (if you actually need them).
#    In many cases, you can omit these entirely. 
###############################################################################
import os

# If you want Gradio to run on a particular host/port, you can do this:
os.environ["GRADIO_SERVER_NAME"] = "0.0.0.0"
os.environ["GRADIO_SERVER_PORT"] = "7860"

# If you do NOT really need GRADIO_ROOT_PATH, don’t set it. 
# If you do set it, do so BEFORE the Gradio import, e.g.:
os.environ["GRADIO_ROOT_PATH"] = "/_app/immutable"

###############################################################################
# 2) Now import everything
###############################################################################
import time
import json
import base64
from datetime import datetime
from pathlib import Path

import gradio as gr
from fastapi import FastAPI, Request
from fastapi.staticfiles import StaticFiles
import uvicorn

from io import BytesIO
from fastapi import FastAPI, Form
from fastapi import FastAPI, File, UploadFile
from fastapi.responses import StreamingResponse, FileResponse


# Hugging Face Spaces
import spaces
from spaces.zero.client import _get_token

###############################################################################
# 3) Create your FastAPI app and (optionally) mount a static folder for user files
###############################################################################
app = FastAPI()

static_dir = Path("./static")
static_dir.mkdir(parents=True, exist_ok=True)
app.mount("/static", StaticFiles(directory="static"), name="static")

@app.post("/echo-image/",
          tags=["Test"],
          description="Descripción",
          summary="Summary"
          )
async def echo_image(image: UploadFile = File(...)):
    if not image.content_type.startswith("image/"):
        return {"error": "El archivo no es una imagen"}

    contents = await image.read()
    return StreamingResponse(BytesIO(contents), media_type=image.content_type)

###############################################################################
# 4) Define your GPU function and main processing function
###############################################################################
@spaces.GPU(duration=240)  # specify GPU usage for 4 minutes
def process_text(text):
    """Simulate a GPU-based process."""
    time.sleep(10)
    return text.upper()

def process_and_save(request: gr.Request, text: str):
    """Handles GPU call and writes result to a file in ./static."""
    token = _get_token(request)
    payload = token.split(".")[1]
    payload = f"{payload}{'=' * ((4 - len(payload) % 4) % 4)}"
    payload = json.loads(base64.urlsafe_b64decode(payload).decode())
    print(f"Token payload: {payload}")

    result = process_text(text)
    timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
    file_path = static_dir / f"output_{timestamp}.txt"
    with open(file_path, "w") as f:
        f.write(result)

    return gr.File(value=str(file_path))

# Mark as not requiring GPU
process_and_save.zerogpu = True

###############################################################################
# 5) Build the Gradio Blocks interface
###############################################################################
with gr.Blocks() as demo:
    text_input = gr.Textbox(label="Enter some text")
    submit_btn = gr.Button("Process and Download")
    output = gr.File(label="Download Processed File")

    submit_btn.click(
        fn=process_and_save,
        inputs=[text_input],
        outputs=output
    )

###############################################################################
# 6) Mount the Gradio app WITH SSR. Don’t manually mount _app/immutable.
###############################################################################
app = gr.mount_gradio_app(app, demo, path="/", ssr_mode=False)

###############################################################################
# 7) Run with Uvicorn
###############################################################################
if __name__ == "__main__":
    uvicorn.run(app, host="0.0.0.0", port=7860)