File size: 5,034 Bytes
4f0de92 |
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 |
from flask import Flask, render_template, request, jsonify, send_file, session
from google import genai
from google.genai import types
import os
from datetime import datetime
import uuid
from reportlab.lib.pagesizes import letter
from reportlab.platypus import SimpleDocTemplate, Paragraph, Spacer
from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle
from reportlab.lib.enums import TA_JUSTIFY
import io
app = Flask(__name__)
app.secret_key = 'votre_cle_secrete_ici' # Changez cette clé en production
# Configuration de l'API Gemini
GEMINI_API_KEY = os.environ.get('GEMINI_API_KEY')
client = genai.Client(api_key=GEMINI_API_KEY)
# Initialiser les discussions en session
def init_session():
if 'discussions' not in session:
session['discussions'] = []
session.modified = True
@app.route('/')
def index():
init_session()
return render_template('index.html')
@app.route('/api/resume', methods=['POST'])
def resume_content():
init_session()
try:
content = request.form.get('content')
resume_type = request.form.get('type', 'court')
if not content:
return jsonify({'error': 'Aucun contenu fourni'}), 400
# Définir les prompts selon le type de résumé
prompts = {
'court': "Fais un résumé court et concis (3-5 phrases) du texte suivant :\n\n",
'detaille': "Fais un résumé détaillé et structuré du texte suivant, en gardant les points importants :\n\n",
'points_cles': "Extrais les points clés du texte suivant sous forme de liste à puces :\n\n"
}
prompt = prompts.get(resume_type, prompts['court']) + content
# Appel à l'API Gemini
response = client.models.generate_content(
model='gemini-2.5-flash',
contents=[prompt]
)
resume = response.text
# Sauvegarder dans la session
discussion = {
'id': str(uuid.uuid4()),
'timestamp': datetime.now().isoformat(),
'content': content[:200] + '...' if len(content) > 200 else content,
'type': resume_type,
'resume': resume
}
discussions = session.get('discussions', [])
discussions.insert(0, discussion) # Ajouter au début
session['discussions'] = discussions[-50:] # Garder les 50 dernières
session.modified = True
return jsonify({
'success': True,
'resume': resume,
'id': discussion['id']
})
except Exception as e:
return jsonify({'error': str(e)}), 500
@app.route('/api/discussions', methods=['GET'])
def get_discussions():
init_session()
return jsonify({'discussions': session.get('discussions', [])})
@app.route('/api/discussion/<discussion_id>', methods=['DELETE'])
def delete_discussion(discussion_id):
init_session()
discussions = session.get('discussions', [])
discussions = [d for d in discussions if d['id'] != discussion_id]
session['discussions'] = discussions
session.modified = True
return jsonify({'success': True})
@app.route('/api/download/<discussion_id>', methods=['GET'])
def download_pdf(discussion_id):
init_session()
discussions = session.get('discussions', [])
discussion = next((d for d in discussions if d['id'] == discussion_id), None)
if not discussion:
return jsonify({'error': 'Discussion non trouvée'}), 404
# Créer le PDF
buffer = io.BytesIO()
doc = SimpleDocTemplate(buffer, pagesize=letter)
styles = getSampleStyleSheet()
story = []
# Titre
title_style = ParagraphStyle(
'CustomTitle',
parent=styles['Heading1'],
fontSize=18,
textColor='#2c3e50'
)
story.append(Paragraph(f"Résumé - {discussion['type'].upper()}", title_style))
story.append(Spacer(1, 12))
# Date
date_text = f"Généré le : {datetime.fromisoformat(discussion['timestamp']).strftime('%d/%m/%Y %H:%M')}"
story.append(Paragraph(date_text, styles['Normal']))
story.append(Spacer(1, 20))
# Contenu original
story.append(Paragraph("Contenu original :", styles['Heading2']))
story.append(Spacer(1, 6))
content_style = ParagraphStyle(
'ContentStyle',
parent=styles['Normal'],
alignment=TA_JUSTIFY
)
story.append(Paragraph(discussion['content'].replace('\n', '<br/>'), content_style))
story.append(Spacer(1, 20))
# Résumé
story.append(Paragraph("Résumé :", styles['Heading2']))
story.append(Spacer(1, 6))
story.append(Paragraph(discussion['resume'].replace('\n', '<br/>'), content_style))
doc.build(story)
buffer.seek(0)
return send_file(
buffer,
as_attachment=True,
download_name=f"resume_{discussion_id[:8]}.pdf",
mimetype='application/pdf'
)
if __name__ == '__main__':
app.run(debug=True) |