Spaces:
Sleeping
Sleeping
Update app.py
Browse files
app.py
CHANGED
@@ -6,9 +6,8 @@ import logging
|
|
6 |
import json
|
7 |
|
8 |
def load_prompt():
|
9 |
-
return "
|
10 |
|
11 |
-
# Configuration du logging
|
12 |
logging.basicConfig(
|
13 |
level=logging.INFO,
|
14 |
format='%(asctime)s - %(levelname)s - %(message)s'
|
@@ -16,11 +15,9 @@ logging.basicConfig(
|
|
16 |
|
17 |
app = Flask(__name__)
|
18 |
|
19 |
-
# Configuration du client Gemini
|
20 |
token = os.environ.get("TOKEN")
|
21 |
client = genai.Client(api_key=token)
|
22 |
|
23 |
-
# Configuration par défaut
|
24 |
default_generation_config = types.GenerateContentConfig(
|
25 |
temperature=1,
|
26 |
max_output_tokens=8192
|
@@ -29,27 +26,32 @@ default_generation_config = types.GenerateContentConfig(
|
|
29 |
STANDARD_MODEL_NAME = "gemini-2.5-flash"
|
30 |
DEEPTHINK_MODEL_NAME = "gemini-2.5-pro"
|
31 |
|
|
|
32 |
@app.route('/')
|
33 |
def index():
|
34 |
logging.info("Page index demandée.")
|
35 |
return render_template('index.html')
|
36 |
|
37 |
-
|
|
|
38 |
def gpt_francais():
|
39 |
-
# FIX: The frontend uses EventSource which sends a GET request.
|
40 |
-
# Data must be read from `request.args` (query string) instead of `request.form`.
|
41 |
logging.info(f"Requête {request.method} reçue sur /api/francais")
|
|
|
42 |
french_prompt = request.args.get('sujet', '').strip()
|
43 |
choix = request.args.get('choix', '').strip()
|
44 |
style = request.args.get('style', '').strip()
|
45 |
use_deepthink = request.args.get('use_deepthink', 'false').lower() == 'true'
|
46 |
|
47 |
-
logging.info(
|
|
|
|
|
48 |
|
49 |
if not french_prompt:
|
50 |
logging.warning("Sujet vide, retour erreur.")
|
51 |
-
return Response(
|
52 |
-
|
|
|
|
|
53 |
|
54 |
model_to_use = DEEPTHINK_MODEL_NAME if use_deepthink else STANDARD_MODEL_NAME
|
55 |
logging.info(f"Modèle utilisé : {model_to_use}")
|
@@ -88,43 +90,49 @@ def gpt_francais():
|
|
88 |
elif hasattr(part, 'thought') and part.thought:
|
89 |
if not thoughts:
|
90 |
logging.info("Premiers éléments de réflexion envoyés.")
|
91 |
-
yield
|
92 |
thoughts += part.text
|
93 |
-
yield
|
94 |
else:
|
95 |
if not answer:
|
96 |
logging.info("Premiers éléments de réponse envoyés.")
|
97 |
-
yield
|
98 |
answer += part.text
|
99 |
-
yield
|
100 |
|
101 |
logging.info("Fin du streaming de génération.")
|
102 |
-
yield
|
103 |
|
104 |
except Exception:
|
105 |
logging.exception("Erreur pendant la génération de contenu.")
|
106 |
-
yield
|
107 |
|
108 |
return Response(generate_stream(), mimetype='text/event-stream')
|
109 |
|
110 |
-
|
|
|
111 |
def gpt_francais_cc():
|
112 |
-
logging.info("Requête
|
113 |
|
114 |
if 'images' not in request.files:
|
115 |
logging.warning("Aucun fichier image reçu.")
|
116 |
-
return Response(
|
117 |
-
|
|
|
|
|
118 |
|
119 |
images = request.files.getlist('images')
|
120 |
if not images or not images[0].filename:
|
121 |
logging.warning("Liste d'images vide.")
|
122 |
-
return Response(
|
123 |
-
|
|
|
|
|
124 |
|
125 |
def generate_image_analysis():
|
126 |
try:
|
127 |
logging.info(f"Nombre d'images reçues : {len(images)}")
|
|
|
128 |
try:
|
129 |
system_instruction = load_prompt()
|
130 |
except Exception:
|
@@ -157,15 +165,14 @@ def gpt_francais_cc():
|
|
157 |
):
|
158 |
for part in chunk.candidates[0].content.parts:
|
159 |
if part.text:
|
160 |
-
yield
|
161 |
|
162 |
logging.info("Fin du streaming d'analyse d'image.")
|
163 |
-
|
164 |
-
yield f"data: {json.dumps({'type': 'done'})}\n\n"
|
165 |
|
166 |
except Exception:
|
167 |
logging.exception("Erreur pendant l'analyse d'image.")
|
168 |
-
yield
|
169 |
|
170 |
return Response(generate_image_analysis(), mimetype='text/event-stream')
|
171 |
|
|
|
6 |
import json
|
7 |
|
8 |
def load_prompt():
|
9 |
+
return "fais une dissertation"
|
10 |
|
|
|
11 |
logging.basicConfig(
|
12 |
level=logging.INFO,
|
13 |
format='%(asctime)s - %(levelname)s - %(message)s'
|
|
|
15 |
|
16 |
app = Flask(__name__)
|
17 |
|
|
|
18 |
token = os.environ.get("TOKEN")
|
19 |
client = genai.Client(api_key=token)
|
20 |
|
|
|
21 |
default_generation_config = types.GenerateContentConfig(
|
22 |
temperature=1,
|
23 |
max_output_tokens=8192
|
|
|
26 |
STANDARD_MODEL_NAME = "gemini-2.5-flash"
|
27 |
DEEPTHINK_MODEL_NAME = "gemini-2.5-pro"
|
28 |
|
29 |
+
# Page d'accueil
|
30 |
@app.route('/')
|
31 |
def index():
|
32 |
logging.info("Page index demandée.")
|
33 |
return render_template('index.html')
|
34 |
|
35 |
+
# API pour génération française
|
36 |
+
@app.route('/api/francais', methods=['POST', 'GET'])
|
37 |
def gpt_francais():
|
|
|
|
|
38 |
logging.info(f"Requête {request.method} reçue sur /api/francais")
|
39 |
+
|
40 |
french_prompt = request.args.get('sujet', '').strip()
|
41 |
choix = request.args.get('choix', '').strip()
|
42 |
style = request.args.get('style', '').strip()
|
43 |
use_deepthink = request.args.get('use_deepthink', 'false').lower() == 'true'
|
44 |
|
45 |
+
logging.info(
|
46 |
+
f"Données reçues : sujet='{french_prompt[:50]}', choix='{choix}', style='{style}', deepthink={use_deepthink}"
|
47 |
+
)
|
48 |
|
49 |
if not french_prompt:
|
50 |
logging.warning("Sujet vide, retour erreur.")
|
51 |
+
return Response(
|
52 |
+
"data: " + json.dumps({'type': 'error', 'content': 'Erreur: Le sujet ne peut pas être vide.'}) + "\n\n",
|
53 |
+
mimetype='text/event-stream'
|
54 |
+
), 400
|
55 |
|
56 |
model_to_use = DEEPTHINK_MODEL_NAME if use_deepthink else STANDARD_MODEL_NAME
|
57 |
logging.info(f"Modèle utilisé : {model_to_use}")
|
|
|
90 |
elif hasattr(part, 'thought') and part.thought:
|
91 |
if not thoughts:
|
92 |
logging.info("Premiers éléments de réflexion envoyés.")
|
93 |
+
yield "data: " + json.dumps({'type': 'thoughts_start'}) + "\n\n"
|
94 |
thoughts += part.text
|
95 |
+
yield "data: " + json.dumps({'type': 'thought', 'content': part.text}) + "\n\n"
|
96 |
else:
|
97 |
if not answer:
|
98 |
logging.info("Premiers éléments de réponse envoyés.")
|
99 |
+
yield "data: " + json.dumps({'type': 'answer_start'}) + "\n\n"
|
100 |
answer += part.text
|
101 |
+
yield "data: " + json.dumps({'type': 'answer', 'content': part.text}) + "\n\n"
|
102 |
|
103 |
logging.info("Fin du streaming de génération.")
|
104 |
+
yield "data: " + json.dumps({'type': 'done'}) + "\n\n"
|
105 |
|
106 |
except Exception:
|
107 |
logging.exception("Erreur pendant la génération de contenu.")
|
108 |
+
yield "data: " + json.dumps({'type': 'error', 'content': 'Erreur serveur pendant la génération.'}) + "\n\n"
|
109 |
|
110 |
return Response(generate_stream(), mimetype='text/event-stream')
|
111 |
|
112 |
+
# API pour analyse de texte à partir d'images
|
113 |
+
@app.route('/api/etude-texte', methods=['POST', 'GET'])
|
114 |
def gpt_francais_cc():
|
115 |
+
logging.info("Requête reçue sur /api/etude-texte")
|
116 |
|
117 |
if 'images' not in request.files:
|
118 |
logging.warning("Aucun fichier image reçu.")
|
119 |
+
return Response(
|
120 |
+
"data: " + json.dumps({'type': 'error', 'content': 'Aucun fichier image envoyé.'}) + "\n\n",
|
121 |
+
mimetype='text/event-stream'
|
122 |
+
), 400
|
123 |
|
124 |
images = request.files.getlist('images')
|
125 |
if not images or not images[0].filename:
|
126 |
logging.warning("Liste d'images vide.")
|
127 |
+
return Response(
|
128 |
+
"data: " + json.dumps({'type': 'error', 'content': 'Aucune image sélectionnée.'}) + "\n\n",
|
129 |
+
mimetype='text/event-stream'
|
130 |
+
), 400
|
131 |
|
132 |
def generate_image_analysis():
|
133 |
try:
|
134 |
logging.info(f"Nombre d'images reçues : {len(images)}")
|
135 |
+
|
136 |
try:
|
137 |
system_instruction = load_prompt()
|
138 |
except Exception:
|
|
|
165 |
):
|
166 |
for part in chunk.candidates[0].content.parts:
|
167 |
if part.text:
|
168 |
+
yield "data: " + json.dumps({'type': 'content', 'content': part.text}) + "\n\n"
|
169 |
|
170 |
logging.info("Fin du streaming d'analyse d'image.")
|
171 |
+
yield "data: " + json.dumps({'type': 'done'}) + "\n\n"
|
|
|
172 |
|
173 |
except Exception:
|
174 |
logging.exception("Erreur pendant l'analyse d'image.")
|
175 |
+
yield "data: " + json.dumps({'type': 'error', 'content': "Erreur serveur pendant l'analyse de l'image."}) + "\n\n"
|
176 |
|
177 |
return Response(generate_image_analysis(), mimetype='text/event-stream')
|
178 |
|