Docfile commited on
Commit
52ff9e1
·
verified ·
1 Parent(s): eda0c9b

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +33 -26
app.py CHANGED
@@ -6,9 +6,8 @@ import logging
6
  import json
7
 
8
  def load_prompt():
9
- return " fais une dissertation "
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
- @app.route('/api/francais', methods=['POST','GET'])
 
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(f"Données reçues : sujet='{french_prompt[:50]}', choix='{choix}', style='{style}', deepthink={use_deepthink}")
 
 
48
 
49
  if not french_prompt:
50
  logging.warning("Sujet vide, retour erreur.")
51
- return Response(f"data: {json.dumps({'type': 'error', 'content': 'Erreur: Le sujet ne peut pas être vide.'})}\n\n",
52
- mimetype='text/event-stream'), 400
 
 
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 f"data: {json.dumps({'type': 'thoughts_start'})}\n\n"
92
  thoughts += part.text
93
- yield f"data: {json.dumps({'type': 'thought', 'content': part.text})}\n\n"
94
  else:
95
  if not answer:
96
  logging.info("Premiers éléments de réponse envoyés.")
97
- yield f"data: {json.dumps({'type': 'answer_start'})}\n\n"
98
  answer += part.text
99
- yield f"data: {json.dumps({'type': 'answer', 'content': part.text})}\n\n"
100
 
101
  logging.info("Fin du streaming de génération.")
102
- yield f"data: {json.dumps({'type': 'done'})}\n\n"
103
 
104
  except Exception:
105
  logging.exception("Erreur pendant la génération de contenu.")
106
- yield f"data: {json.dumps({'type': 'error', 'content': 'Erreur serveur pendant la génération.'})}\n\n"
107
 
108
  return Response(generate_stream(), mimetype='text/event-stream')
109
 
110
- @app.route('/api/etude-texte', methods=['POST','GET'])
 
111
  def gpt_francais_cc():
112
- logging.info("Requête POST reçue sur /api/etude-texte")
113
 
114
  if 'images' not in request.files:
115
  logging.warning("Aucun fichier image reçu.")
116
- return Response(f"data: {json.dumps({'type': 'error', 'content': 'Aucun fichier image envoyé.'})}\n\n",
117
- mimetype='text/event-stream'), 400
 
 
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(f"data: {json.dumps({'type': 'error', 'content': 'Aucune image sélectionnée.'})}\n\n",
123
- mimetype='text/event-stream'), 400
 
 
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 f"data: {json.dumps({'type': 'content', 'content': part.text})}\n\n"
161
 
162
  logging.info("Fin du streaming d'analyse d'image.")
163
- # Note: The original code was missing a final "done" signal here.
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 f"data: {json.dumps({'type': 'error', 'content': 'Erreur serveur pendant l\\'analyse de l\\'image.'})}\n\n"
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