Mariam-cards / app.py
Docfile's picture
Update app.py
ca9f82a verified
raw
history blame
7.71 kB
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 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)