Spaces:
Runtime error
Runtime error
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- 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
|
| 28 |
|
| 29 |
-
[
|
| 30 |
-
|
| 31 |
-
|
| 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 |
-
|
|
|
|
|
|
|
|
|
|
| 78 |
|
| 79 |
-
|
| 80 |
-
|
| 81 |
-
|
| 82 |
-
|
| 83 |
-
|
| 84 |
-
stream=False, # Pas de stream tout de suite pour bien vérifier les outils
|
| 85 |
-
)
|
| 86 |
|
| 87 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 88 |
|
| 89 |
-
|
| 90 |
-
if
|
| 91 |
-
|
| 92 |
-
|
| 93 |
-
|
| 94 |
-
|
| 95 |
-
|
| 96 |
-
|
| 97 |
-
|
| 98 |
-
|
| 99 |
-
|
| 100 |
-
|
| 101 |
-
|
| 102 |
-
|
| 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 |
-
|
|
|
|
| 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 |
-
|
| 123 |
-
if
|
| 124 |
-
response_text +=
|
| 125 |
yield response_text
|
| 126 |
-
|
| 127 |
-
|
| 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__":
|