Reza2kn commited on
Commit
947596b
·
verified ·
1 Parent(s): 4ead9f6

Detect ZeroGPU token expiry and prompt refresh

Browse files
Files changed (1) hide show
  1. app.py +59 -8
app.py CHANGED
@@ -1,3 +1,4 @@
 
1
  import io
2
  import json
3
  import math
@@ -60,14 +61,16 @@ DEFAULT_ZERO_GPU_MAX_SHARDS = int(
60
  os.getenv("CHIZZLER_ZERO_GPU_MAX_SHARDS", "1")
61
  )
62
  SPACE_ID = os.getenv("SPACE_ID")
63
- if SPACE_ID:
64
- warnings.filterwarnings(
65
- "ignore",
66
- message=(
67
- "LoginButton created outside of a Blocks context\\. "
68
- "May not work unless you call its `activate\\(\\)` method manually\\."
69
- ),
70
- )
 
 
71
 
72
 
73
  def log_progress(message: str, level: int = 1, enabled: bool = True) -> None:
@@ -80,6 +83,39 @@ def log_progress(message: str, level: int = 1, enabled: bool = True) -> None:
80
  sys.stdout.flush()
81
 
82
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
83
  # Load environment variables
84
  load_dotenv()
85
 
@@ -1175,6 +1211,16 @@ def process_dataset_and_push(
1175
  )
1176
  attempts = 0
1177
  while True:
 
 
 
 
 
 
 
 
 
 
1178
  try:
1179
  result = _process_dataset_and_push_gpu(
1180
  dataset_id,
@@ -1199,6 +1245,11 @@ def process_dataset_and_push(
1199
  )
1200
  except Exception as exc:
1201
  message = str(exc)
 
 
 
 
 
1202
  if auto_resume and "GPU task aborted" in message:
1203
  attempts += 1
1204
  log_progress(
 
1
+ import base64
2
  import io
3
  import json
4
  import math
 
61
  os.getenv("CHIZZLER_ZERO_GPU_MAX_SHARDS", "1")
62
  )
63
  SPACE_ID = os.getenv("SPACE_ID")
64
+ ZERO_GPU_TOKEN_REFRESH_BUFFER_SEC = int(
65
+ os.getenv("CHIZZLER_ZERO_GPU_TOKEN_REFRESH_BUFFER_SEC", "120")
66
+ )
67
+ warnings.filterwarnings(
68
+ "ignore",
69
+ message=(
70
+ "LoginButton created outside of a Blocks context\\. "
71
+ "May not work unless you call its `activate\\(\\)` method manually\\."
72
+ ),
73
+ )
74
 
75
 
76
  def log_progress(message: str, level: int = 1, enabled: bool = True) -> None:
 
83
  sys.stdout.flush()
84
 
85
 
86
+ def get_zero_gpu_token_payload(request: Optional[gr.Request]) -> Optional[dict]:
87
+ if request is None:
88
+ return None
89
+ headers = getattr(request, "headers", None)
90
+ if headers is None or not hasattr(headers, "get"):
91
+ return None
92
+ token = headers.get("x-ip-token")
93
+ if not token:
94
+ return None
95
+ try:
96
+ payload = token.split(".")[1]
97
+ payload += "=" * (-len(payload) % 4)
98
+ data = json.loads(base64.urlsafe_b64decode(payload.encode()).decode("utf-8"))
99
+ if isinstance(data, dict):
100
+ return data
101
+ except Exception:
102
+ return None
103
+ return None
104
+
105
+
106
+ def zero_gpu_token_seconds_left(request: Optional[gr.Request]) -> Optional[int]:
107
+ payload = get_zero_gpu_token_payload(request)
108
+ if not payload:
109
+ return None
110
+ exp = payload.get("exp")
111
+ if exp is None:
112
+ return None
113
+ try:
114
+ return int(exp) - int(time.time())
115
+ except Exception:
116
+ return None
117
+
118
+
119
  # Load environment variables
120
  load_dotenv()
121
 
 
1211
  )
1212
  attempts = 0
1213
  while True:
1214
+ seconds_left = zero_gpu_token_seconds_left(request)
1215
+ if (
1216
+ SPACE_ID
1217
+ and seconds_left is not None
1218
+ and seconds_left <= ZERO_GPU_TOKEN_REFRESH_BUFFER_SEC
1219
+ ):
1220
+ return (
1221
+ "ZeroGPU login token is expiring "
1222
+ f"({seconds_left}s left). Click Process/Resume again to refresh it."
1223
+ )
1224
  try:
1225
  result = _process_dataset_and_push_gpu(
1226
  dataset_id,
 
1245
  )
1246
  except Exception as exc:
1247
  message = str(exc)
1248
+ if "ZeroGPU proxy token expired" in message:
1249
+ return (
1250
+ "ZeroGPU login token expired. Click Process/Resume again "
1251
+ "to refresh your session."
1252
+ )
1253
  if auto_resume and "GPU task aborted" in message:
1254
  attempts += 1
1255
  log_progress(