DJAKOUA KWANKAM BRAYAN STEVE commited on
Commit
42262ff
·
1 Parent(s): 73653a8

Correction du crash 400 Bad Request en desactivant tools pour Qwen-7B et cache_examples

Browse files
Files changed (1) hide show
  1. cypher-ai/app.py +53 -70
cypher-ai/app.py CHANGED
@@ -24,30 +24,11 @@ client = InferenceClient("Qwen/Qwen2.5-Coder-7B-Instruct", token=token)
24
 
25
  SYSTEM_PROMPT = """Tu es Cypher AI, une IA ultra-intelligente experte en programmation de toute catégorie.
26
  Tu as été créé et développé par DJAKOUA KWANKAM, un brillant étudiant en informatique à l'Institut Universitaire de Douala.
27
- Tu dois toujours te présenter en tant que tel si on te demande qui tu es.
28
 
29
- [INSTRUCTION MAJEURE] : Tu as désormais accès à internet grâce à l'outil `search_web`. Si un utilisateur te pose une question nécessitant des informations récentes, de la documentation technique à jour, ou des faits dont tu n'es pas sûr, TU DOIS IMPÉRATIVEMENT utiliser l'outil `search_web` avant de répondre. Ne devine jamais une nouveauté technologique si tu peux chercher sur internet."""
30
-
31
- # Définition des "Outils" (Function Calling)
32
- tools = [
33
- {
34
- "type": "function",
35
- "function": {
36
- "name": "search_web",
37
- "description": "Fait une recherche sur internet pour trouver des informations récentes, des articles de presse, ou de la documentation technique.",
38
- "parameters": {
39
- "type": "object",
40
- "properties": {
41
- "query": {
42
- "type": "string",
43
- "description": "La requête de recherche (en français ou en anglais)."
44
- }
45
- },
46
- "required": ["query"]
47
- }
48
- }
49
- }
50
- ]
51
 
52
  def search_web(query):
53
  """Effectue une recherche via DuckDuckGo et renvoie les résultats structurés."""
@@ -66,68 +47,69 @@ def search_web(query):
66
  return f"Erreur lors de la recherche: {str(e)}"
67
 
68
  def respond(message, history):
 
69
  messages = [{"role": "system", "content": SYSTEM_PROMPT}]
70
-
71
  for val in history:
72
  if val[0]:
73
  messages.append({"role": "user", "content": val[0]})
74
  if val[1]:
75
  messages.append({"role": "assistant", "content": val[1]})
76
-
77
- messages.append({"role": "user", "content": message})
 
 
 
78
 
79
- # 1. On donne la question au modèle et on attend de voir s'il décide d'utiliser un outil
80
- response = client.chat_completion(
81
- messages,
82
- max_tokens=2048,
83
- tools=tools,
84
- stream=False, # Pas de stream tout de suite pour bien vérifier les outils
85
- )
86
 
87
- first_response = response.choices[0].message
 
 
 
 
 
 
 
 
 
 
 
 
 
88
 
89
- # 2. Si le modèle a décidé d'utiliser un outil (ex: search_web)
90
- if first_response.tool_calls:
91
- # Petit message d'attente pour l'utilisateur
92
- yield "🔍 *Cypher AI fouille le web pour répondre de manière précise...*"
93
-
94
- # On ajoute sa décision à l'historique
95
- messages.append(first_response)
96
-
97
- # Exécution des outils demandés
98
- for tool_call in first_response.tool_calls:
99
- if tool_call.function.name == "search_web":
100
- args = json.loads(tool_call.function.arguments)
101
- search_query = args["query"]
102
- search_result = search_web(search_query)
103
-
104
- # On ajoute le résultat de la recherche à la conversation
105
- messages.append({
106
- "role": "tool",
107
- "name": "search_web",
108
- "content": search_result,
109
- "tool_call_id": tool_call.id
110
- })
111
-
112
- # 3. On redemande au modèle de formuler sa réponse finale en lisant les résultats du web (avec stream cette fois)
113
  final_stream = client.chat_completion(
114
- messages,
 
115
  max_tokens=2048,
116
- stream=True,
117
  )
118
 
119
- response_text = ""
120
  for chunk in final_stream:
121
  if chunk.choices and len(chunk.choices) > 0:
122
- token = chunk.choices[0].delta.content
123
- if token:
124
- response_text += token
125
  yield response_text
126
-
127
- else:
128
- # S'il n'a pas besoin du web, il répond directement
129
- if first_response.content:
130
- yield first_response.content
131
 
132
  demo = gr.ChatInterface(
133
  respond,
@@ -137,7 +119,8 @@ demo = gr.ChatInterface(
137
  "Qui es-tu et qui t'a créé ?",
138
  "Cherche sur le web quelles sont les nouveautés de React 19.",
139
  "Quelle est l'actualité tech d'aujourd'hui ?"
140
- ]
 
141
  )
142
 
143
  if __name__ == "__main__":
 
24
 
25
  SYSTEM_PROMPT = """Tu es Cypher AI, une IA ultra-intelligente experte en programmation de toute catégorie.
26
  Tu as été créé et développé par DJAKOUA KWANKAM, un brillant étudiant en informatique à l'Institut Universitaire de Douala.
27
+ Tu devez toujours te présenter en tant que tel si on te demande qui tu es.
28
 
29
+ [INSTRUCTIONS DE CONTEXTE INTERNET] :
30
+ Quand l'utilisateur te pose une question nécessitant des recherches actualisées ou de la documentation technique récente, des extraits de résultats de recherche DuckDuckGo seront injectés automatiquement en début de message. Utilise ces données pour enrichir et structurer tes explications de manière claire et actualisée.
31
+ """
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
32
 
33
  def search_web(query):
34
  """Effectue une recherche via DuckDuckGo et renvoie les résultats structurés."""
 
47
  return f"Erreur lors de la recherche: {str(e)}"
48
 
49
  def respond(message, history):
50
+ # Formater l'historique
51
  messages = [{"role": "system", "content": SYSTEM_PROMPT}]
 
52
  for val in history:
53
  if val[0]:
54
  messages.append({"role": "user", "content": val[0]})
55
  if val[1]:
56
  messages.append({"role": "assistant", "content": val[1]})
57
+
58
+ # Analyse et déclenchement de la recherche web par mots-clés
59
+ search_needed = False
60
+ search_query = message
61
+ msg_lower = message.lower()
62
 
63
+ keywords = [
64
+ "cherche sur le web", "recherche sur le web", "cherche sur internet", "recherche sur internet",
65
+ "actualités", "actualité", "dernière version", "nouveautés de", "nouveautés sur",
66
+ "météo", "cours de l'action", "dernières nouvelles"
67
+ ]
 
 
68
 
69
+ for kw in keywords:
70
+ if kw in msg_lower:
71
+ search_needed = True
72
+ for kw_to_remove in keywords:
73
+ search_query = search_query.replace(kw_to_remove, "")
74
+ search_query = search_query.strip(" :?./\"'()")
75
+ if not search_query or len(search_query) < 3:
76
+ search_query = message
77
+ break
78
+
79
+ if message.startswith("/web ") or message.startswith("/search "):
80
+ search_needed = True
81
+ parts = message.split(" ", 1)
82
+ search_query = parts[1] if len(parts) > 1 else message
83
 
84
+ context = ""
85
+ if search_needed and search_query:
86
+ yield "🔍 *Recherche en cours sur le web...*"
87
+ search_res = search_web(search_query)
88
+ context = f"\n\n[CONTEXTE DU WEB]\n{search_res}\n[FIN DU CONTEXTE]"
89
+ yield "🔍 *Résultats de recherche intégrés. Génération de la réponse...*"
90
+
91
+ if context:
92
+ messages[0]["content"] += f"\nTu as accès aux résultats de recherche suivants pour répondre à l'utilisateur : {context}"
93
+
94
+ messages.append({"role": "user", "content": message})
95
+
96
+ response_text = ""
97
+ try:
 
 
 
 
 
 
 
 
 
 
98
  final_stream = client.chat_completion(
99
+ model="Qwen/Qwen2.5-Coder-7B-Instruct",
100
+ messages=messages,
101
  max_tokens=2048,
102
+ stream=True
103
  )
104
 
 
105
  for chunk in final_stream:
106
  if chunk.choices and len(chunk.choices) > 0:
107
+ token_val = chunk.choices[0].delta.content
108
+ if token_val:
109
+ response_text += token_val
110
  yield response_text
111
+ except Exception as e:
112
+ yield f"⚠️ Une erreur est survenue lors de la communication avec l'IA : {str(e)}"
 
 
 
113
 
114
  demo = gr.ChatInterface(
115
  respond,
 
119
  "Qui es-tu et qui t'a créé ?",
120
  "Cherche sur le web quelles sont les nouveautés de React 19.",
121
  "Quelle est l'actualité tech d'aujourd'hui ?"
122
+ ],
123
+ cache_examples=False
124
  )
125
 
126
  if __name__ == "__main__":