Docfile commited on
Commit
37c758b
·
verified ·
1 Parent(s): ff2055f

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +63 -73
app.py CHANGED
@@ -6,7 +6,6 @@ from PIL import Image
6
  import io
7
  import base64
8
  import json
9
- import re
10
 
11
  app = Flask(__name__)
12
 
@@ -24,50 +23,6 @@ def index():
24
  def indexx():
25
  return render_template('maj.html')
26
 
27
- def process_markdown_and_code(text):
28
- """Traite le texte pour identifier et formater le code et le markdown"""
29
- # Convertit le texte en HTML formaté
30
- # Cette fonction pourrait être étendue pour utiliser une bibliothèque de markdown
31
- return text
32
-
33
- def format_code_execution_result(response_parts):
34
- """Formate les résultats d'exécution de code pour l'affichage HTML"""
35
- result = []
36
-
37
- for part in response_parts:
38
- # Traitement du texte (équivalent à display(Markdown(part.text)))
39
- if hasattr(part, 'text') and part.text is not None:
40
- result.append({
41
- 'type': 'markdown',
42
- 'content': part.text
43
- })
44
-
45
- # Traitement du code exécutable
46
- if hasattr(part, 'executable_code') and part.executable_code is not None:
47
- result.append({
48
- 'type': 'code',
49
- 'content': part.executable_code.code
50
- })
51
-
52
- # Traitement des résultats d'exécution
53
- if hasattr(part, 'code_execution_result') and part.code_execution_result is not None:
54
- result.append({
55
- 'type': 'execution_result',
56
- 'content': part.code_execution_result.output
57
- })
58
-
59
- # Traitement des images (équivalent à display(Image(data=part.inline_data.data)))
60
- if hasattr(part, 'inline_data') and part.inline_data is not None:
61
- # Encodage de l'image en base64 pour l'affichage HTML
62
- img_data = base64.b64encode(part.inline_data.data).decode('utf-8')
63
- result.append({
64
- 'type': 'image',
65
- 'content': img_data,
66
- 'format': 'png' # Supposé comme png par défaut
67
- })
68
-
69
- return result
70
-
71
  @app.route('/solve', methods=['POST'])
72
  def solve():
73
  try:
@@ -85,13 +40,13 @@ def solve():
85
  model="gemini-2.5-pro-exp-03-25",
86
  contents=[
87
  {'inline_data': {'mime_type': 'image/png', 'data': img_str}},
88
- """Résous ça en français with rendering latex"""
 
89
  ],
90
  config=types.GenerateContentConfig(
91
  thinking_config=types.ThinkingConfig(
92
  thinking_budget=8000
93
  ),
94
- # Ajouter l'outil d'exécution de code
95
  tools=[types.Tool(
96
  code_execution=types.ToolCodeExecution
97
  )]
@@ -100,28 +55,45 @@ def solve():
100
 
101
  for chunk in response:
102
  for part in chunk.candidates[0].content.parts:
 
103
  if hasattr(part, 'thought') and part.thought:
104
  if mode != "thinking":
105
  yield f'data: {json.dumps({"mode": "thinking"})}\n\n'
106
  mode = "thinking"
107
- else:
 
108
  if mode != "answering":
109
  yield f'data: {json.dumps({"mode": "answering"})}\n\n'
110
  mode = "answering"
 
111
 
112
- # Gestion des différents types de contenu
113
- if hasattr(part, 'text') and part.text is not None:
114
- yield f'data: {json.dumps({"content": part.text, "type": "text"})}\n\n'
115
-
116
- if hasattr(part, 'executable_code') and part.executable_code is not None:
117
- yield f'data: {json.dumps({"content": part.executable_code.code, "type": "code"})}\n\n'
 
 
118
 
119
- if hasattr(part, 'code_execution_result') and part.code_execution_result is not None:
120
- yield f'data: {json.dumps({"content": part.code_execution_result.output, "type": "result"})}\n\n'
 
 
 
 
121
 
122
- if hasattr(part, 'inline_data') and part.inline_data is not None:
123
- img_data = base64.b64encode(part.inline_data.data).decode('utf-8')
124
- yield f'data: {json.dumps({"content": img_data, "type": "image"})}\n\n'
 
 
 
 
 
 
 
 
125
 
126
  except Exception as e:
127
  print(f"Error during generation: {e}")
@@ -141,6 +113,7 @@ def solve():
141
 
142
  @app.route('/solved', methods=['POST'])
143
  def solved():
 
144
  try:
145
  image_data = request.files['image'].read()
146
  img = Image.open(io.BytesIO(image_data))
@@ -156,10 +129,10 @@ def solved():
156
  model="gemini-2.5-flash-preview-04-17",
157
  contents=[
158
  {'inline_data': {'mime_type': 'image/png', 'data': img_str}},
159
- """Résous ça en français with rendering latex. utilise python pour les calculs"""
 
160
  ],
161
  config=types.GenerateContentConfig(
162
- # Ajouter l'outil d'exécution de code
163
  tools=[types.Tool(
164
  code_execution=types.ToolCodeExecution
165
  )]
@@ -168,28 +141,45 @@ def solved():
168
 
169
  for chunk in response:
170
  for part in chunk.candidates[0].content.parts:
 
171
  if hasattr(part, 'thought') and part.thought:
172
  if mode != "thinking":
173
  yield f'data: {json.dumps({"mode": "thinking"})}\n\n'
174
  mode = "thinking"
175
- else:
 
176
  if mode != "answering":
177
  yield f'data: {json.dumps({"mode": "answering"})}\n\n'
178
  mode = "answering"
 
179
 
180
- # Gestion des différents types de contenu
181
- if hasattr(part, 'text') and part.text is not None:
182
- yield f'data: {json.dumps({"content": part.text, "type": "text"})}\n\n'
183
-
184
- if hasattr(part, 'executable_code') and part.executable_code is not None:
185
- yield f'data: {json.dumps({"content": part.executable_code.code, "type": "code"})}\n\n'
 
 
186
 
187
- if hasattr(part, 'code_execution_result') and part.code_execution_result is not None:
188
- yield f'data: {json.dumps({"content": part.code_execution_result.output, "type": "result"})}\n\n'
 
 
 
 
189
 
190
- if hasattr(part, 'inline_data') and part.inline_data is not None:
191
- img_data = base64.b64encode(part.inline_data.data).decode('utf-8')
192
- yield f'data: {json.dumps({"content": img_data, "type": "image"})}\n\n'
 
 
 
 
 
 
 
 
193
 
194
  except Exception as e:
195
  print(f"Error during generation: {e}")
 
6
  import io
7
  import base64
8
  import json
 
9
 
10
  app = Flask(__name__)
11
 
 
23
  def indexx():
24
  return render_template('maj.html')
25
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
26
  @app.route('/solve', methods=['POST'])
27
  def solve():
28
  try:
 
40
  model="gemini-2.5-pro-exp-03-25",
41
  contents=[
42
  {'inline_data': {'mime_type': 'image/png', 'data': img_str}},
43
+ """Résous ce problème en français en utilisant des formules mathématiques LaTeX quand nécessaire.
44
+ Présente ta réponse de manière claire et structurée."""
45
  ],
46
  config=types.GenerateContentConfig(
47
  thinking_config=types.ThinkingConfig(
48
  thinking_budget=8000
49
  ),
 
50
  tools=[types.Tool(
51
  code_execution=types.ToolCodeExecution
52
  )]
 
55
 
56
  for chunk in response:
57
  for part in chunk.candidates[0].content.parts:
58
+ # Gestion des modes (thinking/answering)
59
  if hasattr(part, 'thought') and part.thought:
60
  if mode != "thinking":
61
  yield f'data: {json.dumps({"mode": "thinking"})}\n\n'
62
  mode = "thinking"
63
+ yield f'data: {json.dumps({"content": part.thought})}\n\n'
64
+ elif part.text is not None:
65
  if mode != "answering":
66
  yield f'data: {json.dumps({"mode": "answering"})}\n\n'
67
  mode = "answering"
68
+ yield f'data: {json.dumps({"content": part.text})}\n\n'
69
 
70
+ # Gestion du code exécutable
71
+ elif hasattr(part, 'executable_code') and part.executable_code is not None:
72
+ if mode != "answering":
73
+ yield f'data: {json.dumps({"mode": "answering"})}\n\n'
74
+ mode = "answering"
75
+ # Formater le code pour l'affichage
76
+ code_content = f"```python\n{part.executable_code.code}\n```"
77
+ yield f'data: {json.dumps({"content": code_content})}\n\n'
78
 
79
+ # Gestion des résultats de l'exécution du code
80
+ elif hasattr(part, 'code_execution_result') and part.code_execution_result is not None:
81
+ if mode != "answering":
82
+ yield f'data: {json.dumps({"mode": "answering"})}\n\n'
83
+ mode = "answering"
84
+ yield f'data: {json.dumps({"content": f"```\n{part.code_execution_result.output}\n```"})}\n\n'
85
 
86
+ # Gestion des images inline
87
+ elif hasattr(part, 'inline_data') and part.inline_data is not None:
88
+ if mode != "answering":
89
+ yield f'data: {json.dumps({"mode": "answering"})}\n\n'
90
+ mode = "answering"
91
+ # Convertir l'image en base64 pour l'affichage HTML
92
+ image_data = part.inline_data.data
93
+ image_format = part.inline_data.mime_type.split('/')[-1]
94
+ image_src = f"data:{part.inline_data.mime_type};base64,{image_data}"
95
+ image_tag = f'<img src="{image_src}" alt="Generated Image" style="max-width:100%;">'
96
+ yield f'data: {json.dumps({"content": image_tag})}\n\n'
97
 
98
  except Exception as e:
99
  print(f"Error during generation: {e}")
 
113
 
114
  @app.route('/solved', methods=['POST'])
115
  def solved():
116
+ # Version similaire avec le modèle flash
117
  try:
118
  image_data = request.files['image'].read()
119
  img = Image.open(io.BytesIO(image_data))
 
129
  model="gemini-2.5-flash-preview-04-17",
130
  contents=[
131
  {'inline_data': {'mime_type': 'image/png', 'data': img_str}},
132
+ """Résous ce problème en français en utilisant des formules mathématiques LaTeX quand nécessaire.
133
+ Présente ta réponse de manière claire et structurée."""
134
  ],
135
  config=types.GenerateContentConfig(
 
136
  tools=[types.Tool(
137
  code_execution=types.ToolCodeExecution
138
  )]
 
141
 
142
  for chunk in response:
143
  for part in chunk.candidates[0].content.parts:
144
+ # Gestion des modes (thinking/answering)
145
  if hasattr(part, 'thought') and part.thought:
146
  if mode != "thinking":
147
  yield f'data: {json.dumps({"mode": "thinking"})}\n\n'
148
  mode = "thinking"
149
+ yield f'data: {json.dumps({"content": part.thought})}\n\n'
150
+ elif part.text is not None:
151
  if mode != "answering":
152
  yield f'data: {json.dumps({"mode": "answering"})}\n\n'
153
  mode = "answering"
154
+ yield f'data: {json.dumps({"content": part.text})}\n\n'
155
 
156
+ # Gestion du code exécutable
157
+ elif hasattr(part, 'executable_code') and part.executable_code is not None:
158
+ if mode != "answering":
159
+ yield f'data: {json.dumps({"mode": "answering"})}\n\n'
160
+ mode = "answering"
161
+ # Formater le code pour l'affichage
162
+ code_content = f"```python\n{part.executable_code.code}\n```"
163
+ yield f'data: {json.dumps({"content": code_content})}\n\n'
164
 
165
+ # Gestion des résultats de l'exécution du code
166
+ elif hasattr(part, 'code_execution_result') and part.code_execution_result is not None:
167
+ if mode != "answering":
168
+ yield f'data: {json.dumps({"mode": "answering"})}\n\n'
169
+ mode = "answering"
170
+ yield f'data: {json.dumps({"content": f"```\n{part.code_execution_result.output}\n```"})}\n\n'
171
 
172
+ # Gestion des images inline
173
+ elif hasattr(part, 'inline_data') and part.inline_data is not None:
174
+ if mode != "answering":
175
+ yield f'data: {json.dumps({"mode": "answering"})}\n\n'
176
+ mode = "answering"
177
+ # Convertir l'image en base64 pour l'affichage HTML
178
+ image_data = part.inline_data.data
179
+ image_format = part.inline_data.mime_type.split('/')[-1]
180
+ image_src = f"data:{part.inline_data.mime_type};base64,{image_data}"
181
+ image_tag = f'<img src="{image_src}" alt="Generated Image" style="max-width:100%;">'
182
+ yield f'data: {json.dumps({"content": image_tag})}\n\n'
183
 
184
  except Exception as e:
185
  print(f"Error during generation: {e}")