Spaces:
Running
Running
File size: 7,713 Bytes
51cbadd f388c93 6b10944 12d4886 f388c93 12d4886 f388c93 1382a57 f388c93 2ef19ee c2c3e4e 2ef19ee f388c93 51cbadd f388c93 51cbadd e79be93 51cbadd e79be93 dfa74b3 6b10944 12d4886 01e07c4 12d4886 6b10944 12d4886 e79be93 51cbadd 12d4886 e79be93 61f5a5c e79be93 12d4886 61f5a5c 12d4886 61f5a5c 12d4886 61f5a5c 12d4886 61f5a5c 51cbadd e79be93 61f5a5c e79be93 12d4886 61f5a5c e79be93 51cbadd 61f5a5c 51cbadd 6b10944 f388c93 2ef19ee 93f4a81 2ef19ee 01e07c4 2ef19ee 8566348 12d4886 2ef19ee 12d4886 2ef19ee 12d4886 2ef19ee 61f5a5c 2ef19ee 12d4886 61f5a5c 12d4886 61f5a5c 12d4886 61f5a5c 12d4886 61f5a5c 2ef19ee 61f5a5c 2ef19ee 12d4886 61f5a5c 2ef19ee 61f5a5c 2ef19ee f388c93 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 |
from flask import Flask, render_template, request, jsonify, Response, stream_with_context
from google import genai
from google.genai import types
import os
from PIL import Image
import io
import base64
import json
app = Flask(__name__)
GOOGLE_API_KEY = os.environ.get("GEMINI_API_KEY")
client = genai.Client(
api_key=GOOGLE_API_KEY,
)
@app.route('/')
def index():
return render_template('index.html')
@app.route('/free')
def indexx():
return render_template('maj.html')
@app.route('/solve', methods=['POST'])
def solve():
try:
image_data = request.files['image'].read()
img = Image.open(io.BytesIO(image_data))
buffered = io.BytesIO()
img.save(buffered, format="PNG")
img_str = base64.b64encode(buffered.getvalue()).decode()
def generate():
mode = 'starting'
try:
response = client.models.generate_content_stream(
model="gemini-2.5-pro-exp-03-25",
contents=[
{'inline_data': {'mime_type': 'image/png', 'data': img_str}},
"""Résous cet exercice en français avec du LaTeX.
Si nécessaire, utilise du code Python pour effectuer les calculs complexes.
Présente ta solution de façon claire et espacée."""
],
config=types.GenerateContentConfig(
thinking_config=types.ThinkingConfig(
thinking_budget=8000
),
tools=[types.Tool(
code_execution=types.ToolCodeExecution()
)]
)
)
for chunk in response:
for part in chunk.candidates[0].content.parts:
if hasattr(part, 'thought') and part.thought:
if mode != "thinking":
yield 'data: ' + json.dumps({"mode": "thinking"}) + '\n\n'
mode = "thinking"
elif hasattr(part, 'executable_code') and part.executable_code:
if mode != "executing_code":
yield 'data: ' + json.dumps({"mode": "executing_code"}) + '\n\n'
mode = "executing_code"
code_block_open = "```python\n"
code_block_close = "\n```"
yield 'data: ' + json.dumps({"content": code_block_open + part.executable_code.code + code_block_close}) + '\n\n'
elif hasattr(part, 'code_execution_result') and part.code_execution_result:
if mode != "code_result":
yield 'data: ' + json.dumps({"mode": "code_result"}) + '\n\n'
mode = "code_result"
result_block_open = "Résultat d'exécution:\n```\n"
result_block_close = "\n```"
yield 'data: ' + json.dumps({"content": result_block_open + part.code_execution_result.output + result_block_close}) + '\n\n'
else:
if mode != "answering":
yield 'data: ' + json.dumps({"mode": "answering"}) + '\n\n'
mode = "answering"
if hasattr(part, 'text') and part.text:
yield 'data: ' + json.dumps({"content": part.text}) + '\n\n'
except Exception as e:
print(f"Error during generation: {e}")
yield 'data: ' + json.dumps({"error": str(e)}) + '\n\n'
return Response(
stream_with_context(generate()),
mimetype='text/event-stream',
headers={
'Cache-Control': 'no-cache',
'X-Accel-Buffering': 'no'
}
)
except Exception as e:
return jsonify({'error': str(e)}), 500
@app.route('/solved', methods=['POST'])
def solved():
try:
image_data = request.files['image'].read()
img = Image.open(io.BytesIO(image_data))
buffered = io.BytesIO()
img.save(buffered, format="PNG")
img_str = base64.b64encode(buffered.getvalue()).decode()
def generate():
mode = 'starting'
try:
response = client.models.generate_content_stream(
model="gemini-2.5-flash-preview-04-17",
contents=[
{'inline_data': {'mime_type': 'image/png', 'data': img_str}},
"""Résous cet exercice en français avec du rendu latex.
Si nécessaire, utilise du code Python pour effectuer les calculs complexes.
Présente ta solution de façon claire et espacée."""
],
config=types.GenerateContentConfig(
tools=[types.Tool(
code_execution=types.ToolCodeExecution()
)]
)
)
for chunk in response:
for part in chunk.candidates[0].content.parts:
if hasattr(part, 'thought') and part.thought:
if mode != "thinking":
yield 'data: ' + json.dumps({"mode": "thinking"}) + '\n\n'
mode = "thinking"
elif hasattr(part, 'executable_code') and part.executable_code:
if mode != "executing_code":
yield 'data: ' + json.dumps({"mode": "executing_code"}) + '\n\n'
mode = "executing_code"
code_block_open = "```python\n"
code_block_close = "\n```"
yield 'data: ' + json.dumps({"content": code_block_open + part.executable_code.code + code_block_close}) + '\n\n'
elif hasattr(part, 'code_execution_result') and part.code_execution_result:
if mode != "code_result":
yield 'data: ' + json.dumps({"mode": "code_result"}) + '\n\n'
mode = "code_result"
result_block_open = "Résultat d'exécution:\n```\n"
result_block_close = "\n```"
yield 'data: ' + json.dumps({"content": result_block_open + part.code_execution_result.output + result_block_close}) + '\n\n'
else:
if mode != "answering":
yield 'data: ' + json.dumps({"mode": "answering"}) + '\n\n'
mode = "answering"
if hasattr(part, 'text') and part.text:
yield 'data: ' + json.dumps({"content": part.text}) + '\n\n'
except Exception as e:
print(f"Error during generation: {e}")
yield 'data: ' + json.dumps({"error": str(e)}) + '\n\n'
return Response(
stream_with_context(generate()),
mimetype='text/event-stream',
headers={
'Cache-Control': 'no-cache',
'X-Accel-Buffering': 'no'
}
)
except Exception as e:
return jsonify({'error': str(e)}), 500
if __name__ == '__main__':
app.run(debug=True) |