Mika110587 commited on
Commit
d23f41e
·
verified ·
1 Parent(s): bed4b10

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +35 -86
app.py CHANGED
@@ -1,115 +1,64 @@
1
  import os
2
- import traceback
3
- import requests
4
  import gradio as gr
 
5
 
6
- # 1. Récupérer ton token Hugging Face (secret HF_TOKEN dans Settings)
7
  HF_TOKEN = os.environ.get("HF_TOKEN")
8
-
9
  if not HF_TOKEN:
10
  raise RuntimeError(
11
- "La variable d'environnement HF_TOKEN n'est pas définie. "
12
  "Va dans Settings → Variables and secrets → Secrets et ajoute HF_TOKEN "
13
- "avec ton token Hugging Face."
14
  )
15
 
16
- # 2. Modèle de chat open-source hébergé par Hugging Face
17
- MODEL_ID = "HuggingFaceH4/zephyr-7b-beta"
18
-
19
- # 3. Nouveau endpoint : router Hugging Face, API compatible OpenAI
20
- API_URL = "https://router.huggingface.co/v1/chat/completions"
21
 
22
- HEADERS = {
23
- "Authorization": f"Bearer {HF_TOKEN}",
24
- "Content-Type": "application/json",
25
- }
26
 
27
  SYSTEM_PROMPT = """
28
  Tu es ArtGPT, un assistant spécialisé à 100% dans l'art :
29
- illustration, dessin, peinture, graphisme, composition, lumière,
30
- histoire de l'art, mouvements artistiques, direction artistique,
31
- portfolio, conseils logiciels et création visuelle.
 
 
32
 
33
  Règles :
34
- - Réponds uniquement en français.
35
  - Si la question n’est pas liée à l’art ou à la création visuelle,
36
  tu rediriges gentiment vers ces thèmes.
37
- - Donne des réponses claires, structurées, pédagogiques.
38
- - Propose volontiers des exercices pratiques.
39
  """
40
 
41
- def query_hf_chat(question: str) -> str:
42
- """Appel au router Hugging Face via l'API /v1/chat/completions (format OpenAI)."""
43
-
44
- payload = {
45
- "model": MODEL_ID,
46
- "messages": [
47
- {"role": "system", "content": SYSTEM_PROMPT.strip()},
48
- {"role": "user", "content": question.strip()},
49
- ],
50
- "max_tokens": 400,
51
- "temperature": 0.7,
52
- "top_p": 0.95,
53
- }
54
-
55
- response = requests.post(API_URL, headers=HEADERS, json=payload, timeout=90)
56
-
57
- # Si le HTTP code n'est pas 200, on affiche clairement l'erreur
58
- if response.status_code != 200:
59
- return (
60
- "### Erreur HTTP Hugging Face (router)\n\n"
61
- "```text\n"
62
- f"Status code: {response.status_code}\n"
63
- f"Body: {response.text}\n"
64
- "```"
65
- )
66
-
67
- data = response.json()
68
-
69
- # Format OpenAI-like: choices[0].message.content
70
- try:
71
- choice = data["choices"][0]
72
- message = choice["message"]
73
- content = message["content"]
74
- content = (content or "").strip()
75
- except Exception:
76
- # Format inattendu → on montre tout pour debug
77
- return (
78
- "### Réponse inattendue de l'API Hugging Face (router)\n\n"
79
- "```text\n"
80
- f"{data}\n"
81
- "```"
82
- )
83
-
84
- if not content:
85
- return "Je n'ai pas réussi à générer une réponse cette fois-ci."
86
-
87
- return content
88
-
89
-
90
  def answer(question: str) -> str:
91
  question = (question or "").strip()
92
  if not question:
93
- return "Pose-moi une question sur l'art 🙂"
94
 
95
  try:
96
- reply = query_hf_chat(question)
97
-
98
- # Si c'est déjà un bloc d'erreur formaté markdown, on le renvoie tel quel
99
- if reply.startswith("### Erreur") or reply.startswith("### Réponse inattendue"):
100
- return reply
101
-
102
- return reply
103
-
104
- except Exception:
105
- tb = traceback.format_exc()
106
- return (
107
- "### Erreur Python côté Space\n\n"
108
- "```text\n"
109
- f"{tb}\n"
110
- "```"
111
  )
112
 
 
 
 
 
 
 
113
 
114
  demo = gr.Interface(
115
  fn=answer,
 
1
  import os
 
 
2
  import gradio as gr
3
+ from openai import OpenAI
4
 
5
+ # 1) Ton token Hugging Face (HF_TOKEN doit être défini dans Settings → Secrets)
6
  HF_TOKEN = os.environ.get("HF_TOKEN")
 
7
  if not HF_TOKEN:
8
  raise RuntimeError(
9
+ "La variable d'environnement HF_TOKEN n'est pas définie.\n"
10
  "Va dans Settings → Variables and secrets → Secrets et ajoute HF_TOKEN "
11
+ "avec ton token Hugging Face (celui qui a la permission « Inference Providers »)."
12
  )
13
 
14
+ # 2) Client OpenAI configuré pour passer par le router Hugging Face
15
+ client = OpenAI(
16
+ base_url="https://router.huggingface.co/v1",
17
+ api_key=HF_TOKEN,
18
+ )
19
 
20
+ # 3) Modèle supporté par HF Inference (gratuit dans la limite de la free tier)
21
+ MODEL_ID = "katanemo/Arch-Router-1.5B:hf-inference"
 
 
22
 
23
  SYSTEM_PROMPT = """
24
  Tu es ArtGPT, un assistant spécialisé à 100% dans l'art :
25
+ - illustration, dessin, peinture, graphisme,
26
+ - composition, couleur, lumière,
27
+ - histoire de l'art, mouvements artistiques,
28
+ - direction artistique, portfolio,
29
+ - conseils logiciels et création visuelle.
30
 
31
  Règles :
32
+ - Tu réponds uniquement en français.
33
  - Si la question n’est pas liée à l’art ou à la création visuelle,
34
  tu rediriges gentiment vers ces thèmes.
35
+ - Tu donnes des réponses claires, structurées, pédagogiques.
36
+ - Tu proposes volontiers des exercices pratiques.
37
  """
38
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
39
  def answer(question: str) -> str:
40
  question = (question or "").strip()
41
  if not question:
42
+ return "Écris une question sur lart pour commencer 🙂"
43
 
44
  try:
45
+ completion = client.chat.completions.create(
46
+ model=MODEL_ID,
47
+ messages=[
48
+ {"role": "system", "content": SYSTEM_PROMPT},
49
+ {"role": "user", "content": question},
50
+ ],
51
+ max_tokens=512,
52
+ temperature=0.7,
53
+ top_p=0.95,
 
 
 
 
 
 
54
  )
55
 
56
+ # Avec la nouvelle lib openai, le contenu est dans .message.content
57
+ return completion.choices[0].message.content
58
+
59
+ except Exception as e:
60
+ # On affiche une erreur lisible au lieu du gros JSON
61
+ return f"Erreur lors de l'appel au modèle :\n\n{e}"
62
 
63
  demo = gr.Interface(
64
  fn=answer,