Kimyayd commited on
Commit
14fcf84
·
verified ·
1 Parent(s): 7b387c1

fix: secrets colles avec retour a la ligne, demo au niveau module

Browse files
Files changed (2) hide show
  1. app.py +12 -12
  2. evaluator.py +29 -9
app.py CHANGED
@@ -8,7 +8,6 @@ transitent jamais.
8
 
9
  from __future__ import annotations
10
 
11
- import os
12
  import time
13
 
14
  import gradio as gr
@@ -17,12 +16,10 @@ import requests
17
 
18
  import evaluator
19
 
20
- SUPABASE_URL = os.environ.get(
21
- "SUPABASE_URL", "https://cqdimvcnmhrsdcoobkmd.supabase.co"
22
- ).rstrip("/")
23
- ANON_KEY = os.environ.get(
24
- "SUPABASE_ANON_KEY", "sb_publishable_MapYll-_Y0hNoLYOfaDR3w_tsTEHyiz"
25
- )
26
  REST = f"{SUPABASE_URL}/rest/v1"
27
  HEADERS = {"apikey": ANON_KEY}
28
 
@@ -391,9 +388,12 @@ def build_ui() -> gr.Blocks:
391
  return demo
392
 
393
 
 
 
 
 
 
 
 
394
  if __name__ == "__main__":
395
- evaluator.start()
396
- build_ui().launch(
397
- css=CSS,
398
- theme=gr.themes.Soft(primary_hue="indigo", secondary_hue="amber"),
399
- )
 
8
 
9
  from __future__ import annotations
10
 
 
11
  import time
12
 
13
  import gradio as gr
 
16
 
17
  import evaluator
18
 
19
+ # evaluator.env() : une valeur collée dans l'interface du Space traîne
20
+ # souvent un retour à la ligne, qui rend l'en-tête HTTP invalide.
21
+ SUPABASE_URL = evaluator.SUPABASE_URL
22
+ ANON_KEY = evaluator.ANON_KEY
 
 
23
  REST = f"{SUPABASE_URL}/rest/v1"
24
  HEADERS = {"apikey": ANON_KEY}
25
 
 
388
  return demo
389
 
390
 
391
+ THEME = gr.themes.Soft(primary_hue="indigo", secondary_hue="amber")
392
+
393
+ # Au niveau du module, pas sous `__main__` : le lanceur de Hugging Face
394
+ # importe app.py et cherche une variable nommée `demo`.
395
+ evaluator.start()
396
+ demo = build_ui()
397
+
398
  if __name__ == "__main__":
399
+ demo.launch(css=CSS, theme=THEME)
 
 
 
 
evaluator.py CHANGED
@@ -54,20 +54,29 @@ except Exception: # noqa: BLE001
54
 
55
  # --- configuration ------------------------------------------------------
56
 
57
- SUPABASE_URL = os.environ.get(
 
 
 
 
 
 
 
 
 
 
58
  "SUPABASE_URL", "https://cqdimvcnmhrsdcoobkmd.supabase.co"
59
  ).rstrip("/")
60
  # Publique par conception : la Row Level Security fait le tri, pas le secret.
61
- ANON_KEY = os.environ.get(
62
  "SUPABASE_ANON_KEY", "sb_publishable_MapYll-_Y0hNoLYOfaDR3w_tsTEHyiz"
63
  )
64
- SPACE_TOKEN = os.environ.get("SPACE_TOKEN", "")
65
 
66
  # Sorti de l'environnement immédiatement : un modèle inconnu chargé plus
67
  # tard ne doit pas pouvoir le lire dans os.environ.
68
- _DATA_TOKEN = os.environ.pop("HF_DATA_TOKEN", None) or os.environ.pop(
69
- "HF_TOKEN", None
70
- )
71
 
72
  REST = f"{SUPABASE_URL}/rest/v1"
73
  HEADERS = {"apikey": ANON_KEY, "Content-Type": "application/json"}
@@ -494,7 +503,18 @@ def loop() -> None:
494
  gc.collect()
495
 
496
 
 
 
 
497
  def start() -> threading.Thread:
498
- t = threading.Thread(target=loop, name="fonbench-eval", daemon=True)
499
- t.start()
500
- return t
 
 
 
 
 
 
 
 
 
54
 
55
  # --- configuration ------------------------------------------------------
56
 
57
+ def env(name: str, default: str = "") -> str:
58
+ """Variable d'environnement nettoyée.
59
+
60
+ Un secret collé dans l'interface du Space embarque volontiers un retour
61
+ à la ligne, ce qui rend l'en-tête HTTP invalide et fait échouer tous les
62
+ appels — sans indice évident dans les logs. On tranche à la source.
63
+ """
64
+ return (os.environ.get(name) or default).strip()
65
+
66
+
67
+ SUPABASE_URL = env(
68
  "SUPABASE_URL", "https://cqdimvcnmhrsdcoobkmd.supabase.co"
69
  ).rstrip("/")
70
  # Publique par conception : la Row Level Security fait le tri, pas le secret.
71
+ ANON_KEY = env(
72
  "SUPABASE_ANON_KEY", "sb_publishable_MapYll-_Y0hNoLYOfaDR3w_tsTEHyiz"
73
  )
74
+ SPACE_TOKEN = env("SPACE_TOKEN")
75
 
76
  # Sorti de l'environnement immédiatement : un modèle inconnu chargé plus
77
  # tard ne doit pas pouvoir le lire dans os.environ.
78
+ _DATA_TOKEN = (os.environ.pop("HF_DATA_TOKEN", None)
79
+ or os.environ.pop("HF_TOKEN", None) or "").strip() or None
 
80
 
81
  REST = f"{SUPABASE_URL}/rest/v1"
82
  HEADERS = {"apikey": ANON_KEY, "Content-Type": "application/json"}
 
503
  gc.collect()
504
 
505
 
506
+ _thread: threading.Thread | None = None
507
+
508
+
509
  def start() -> threading.Thread:
510
+ """Démarre l'évaluateur. Sans effet s'il tourne déjà.
511
+
512
+ Le lanceur du Space peut importer app.py plus d'une fois : sans cette
513
+ garde, deux threads se disputeraient la même tâche.
514
+ """
515
+ global _thread
516
+ if _thread is None or not _thread.is_alive():
517
+ _thread = threading.Thread(target=loop, name="fonbench-eval",
518
+ daemon=True)
519
+ _thread.start()
520
+ return _thread