alesamodio commited on
Commit
3247df2
·
1 Parent(s): 9f7896e

after public attempt#1

Browse files
Files changed (1) hide show
  1. app.py +87 -11
app.py CHANGED
@@ -1,21 +1,97 @@
1
  from fastapi import FastAPI
2
- import requests
3
 
4
  app = FastAPI()
5
 
6
- DB3_URL = "https://alesamodio-db3-update.hf.space" # receiver Space URL
 
 
 
 
 
 
 
 
 
 
 
7
 
8
  @app.get("/")
9
  def home():
10
- return {"status": "running", "message": "Minimal ping trigger alive"}
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
11
 
12
- @app.get("/run") # matches your GitHub workflow
13
- def run_trigger():
14
- """Ping the receiver Space once to wake it up."""
15
  try:
16
- r = requests.get(DB3_URL, timeout=10)
17
- print(f"🌤️ Pinged receiver, status {r.status_code}")
18
- return {"status": "ok", "code": r.status_code, "response": r.text[:200]}
 
 
 
 
 
19
  except Exception as e:
20
- print(f" Error pinging receiver: {e}")
21
- return {"status": "error", "error": str(e)}
 
1
  from fastapi import FastAPI
2
+ import os, time, requests
3
 
4
  app = FastAPI()
5
 
6
+ # === CONFIG ===
7
+ BASE = os.getenv("DB3_BASE_URL", "https://alesamodio-db3-update.hf.space") # receiver base URL
8
+ CRON_SECRET = os.getenv("CRON_SECRET", "") # receiver's /run secret (set in receiver Space)
9
+ HF_DB3_TOKEN = os.getenv("HF_DB3_TOKEN", "") # READ token if receiver is PRIVATE (set in this trigger Space)
10
+
11
+ # Timings (tune if needed; can also override via query params)
12
+ DEFAULT_WARMUP_WAIT_S = int(os.getenv("WARMUP_WAIT_S", "180")) # quiet wait after first wake
13
+ READY_INTERVAL_S = int(os.getenv("READY_INTERVAL_S", "20")) # poll cadence
14
+ READY_MAX_ATTEMPTS = int(os.getenv("READY_MAX_ATTEMPTS", "15")) # ~5 min total
15
+
16
+ def _headers():
17
+ return {"Authorization": f"Bearer {HF_DB3_TOKEN}"} if HF_DB3_TOKEN else {}
18
 
19
  @app.get("/")
20
  def home():
21
+ return {"status": "running", "message": "HF trigger alive"}
22
+
23
+ @app.get("/run")
24
+ def run():
25
+ """
26
+ Wake receiver once -> quiet wait -> poll /ready -> fire /run?secret=...
27
+ Optional query overrides:
28
+ warmup_wait (int seconds), max_attempts, interval
29
+ """
30
+ log = []
31
+ warmup_wait = int(os.getenv("WARMUP_WAIT_S", str(DEFAULT_WARMUP_WAIT_S)))
32
+ # allow query overrides without importing FastAPI Request
33
+ try:
34
+ import starlette.requests
35
+ # no-op; just to avoid extra dependency notes
36
+ except Exception:
37
+ pass
38
+
39
+ # simple query parsing without typing Request
40
+ from fastapi import Request
41
+ def get_query():
42
+ # tiny helper because we didn't annotate Request in signature
43
+ import inspect
44
+ frame = inspect.currentframe().f_back
45
+ req = frame.f_locals.get('request') # not available in this simple handler
46
+ return {}
47
+ # actual overrides via os env only to keep it minimal
48
+ max_attempts = READY_MAX_ATTEMPTS
49
+ interval = READY_INTERVAL_S
50
+
51
+ # --- 1) Wake once (GET /) ---
52
+ try:
53
+ r = requests.get(f"{BASE}/", headers=_headers(), timeout=10)
54
+ log.append(f"wake: {r.status_code}")
55
+ except Exception as e:
56
+ log.append(f"wake_err: {e}")
57
+
58
+ # --- 2) Quiet wait to let models load ---
59
+ time.sleep(warmup_wait)
60
+ log.append(f"quiet_wait_done: {warmup_wait}s")
61
+
62
+ # --- 3) Poll /ready ---
63
+ ready = False
64
+ last_text = ""
65
+ for i in range(1, max_attempts + 1):
66
+ try:
67
+ rr = requests.get(f"{BASE}/ready", headers=_headers(), timeout=10)
68
+ last_text = rr.text
69
+ if rr.ok and '"ready"' in rr.text:
70
+ log.append(f"ready_yes_at_attempt:{i}")
71
+ ready = True
72
+ break
73
+ else:
74
+ log.append(f"ready_no_{i}: {rr.status_code} {rr.text[:80]}")
75
+ except Exception as e:
76
+ log.append(f"ready_err_{i}: {e}")
77
+ time.sleep(interval)
78
+
79
+ if not ready:
80
+ return {
81
+ "status": "not_ready",
82
+ "last_ready_response": last_text[:200],
83
+ "log": log
84
+ }
85
 
86
+ # --- 4) Fire /run with secret ---
 
 
87
  try:
88
+ run_url = f"{BASE}/run?secret={CRON_SECRET}"
89
+ final = requests.get(run_url, headers=_headers(), timeout=600)
90
+ return {
91
+ "status": "ok",
92
+ "code": final.status_code,
93
+ "body": (final.text[:2000] if final.text else ""),
94
+ "log": log
95
+ }
96
  except Exception as e:
97
+ return {"status": "run_error", "error": str(e), "log": log}