Docfile commited on
Commit
4f0de92
·
verified ·
1 Parent(s): 8713d08

Create app.py

Browse files
Files changed (1) hide show
  1. app.py +153 -0
app.py ADDED
@@ -0,0 +1,153 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from flask import Flask, render_template, request, jsonify, send_file, session
2
+ from google import genai
3
+ from google.genai import types
4
+ import os
5
+ from datetime import datetime
6
+ import uuid
7
+ from reportlab.lib.pagesizes import letter
8
+ from reportlab.platypus import SimpleDocTemplate, Paragraph, Spacer
9
+ from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle
10
+ from reportlab.lib.enums import TA_JUSTIFY
11
+ import io
12
+
13
+ app = Flask(__name__)
14
+ app.secret_key = 'votre_cle_secrete_ici' # Changez cette clé en production
15
+
16
+ # Configuration de l'API Gemini
17
+ GEMINI_API_KEY = os.environ.get('GEMINI_API_KEY')
18
+ client = genai.Client(api_key=GEMINI_API_KEY)
19
+
20
+ # Initialiser les discussions en session
21
+ def init_session():
22
+ if 'discussions' not in session:
23
+ session['discussions'] = []
24
+ session.modified = True
25
+
26
+ @app.route('/')
27
+ def index():
28
+ init_session()
29
+ return render_template('index.html')
30
+
31
+ @app.route('/api/resume', methods=['POST'])
32
+ def resume_content():
33
+ init_session()
34
+
35
+ try:
36
+ content = request.form.get('content')
37
+ resume_type = request.form.get('type', 'court')
38
+
39
+ if not content:
40
+ return jsonify({'error': 'Aucun contenu fourni'}), 400
41
+
42
+ # Définir les prompts selon le type de résumé
43
+ prompts = {
44
+ 'court': "Fais un résumé court et concis (3-5 phrases) du texte suivant :\n\n",
45
+ 'detaille': "Fais un résumé détaillé et structuré du texte suivant, en gardant les points importants :\n\n",
46
+ 'points_cles': "Extrais les points clés du texte suivant sous forme de liste à puces :\n\n"
47
+ }
48
+
49
+ prompt = prompts.get(resume_type, prompts['court']) + content
50
+
51
+ # Appel à l'API Gemini
52
+ response = client.models.generate_content(
53
+ model='gemini-2.5-flash',
54
+ contents=[prompt]
55
+ )
56
+
57
+ resume = response.text
58
+
59
+ # Sauvegarder dans la session
60
+ discussion = {
61
+ 'id': str(uuid.uuid4()),
62
+ 'timestamp': datetime.now().isoformat(),
63
+ 'content': content[:200] + '...' if len(content) > 200 else content,
64
+ 'type': resume_type,
65
+ 'resume': resume
66
+ }
67
+
68
+ discussions = session.get('discussions', [])
69
+ discussions.insert(0, discussion) # Ajouter au début
70
+ session['discussions'] = discussions[-50:] # Garder les 50 dernières
71
+ session.modified = True
72
+
73
+ return jsonify({
74
+ 'success': True,
75
+ 'resume': resume,
76
+ 'id': discussion['id']
77
+ })
78
+
79
+ except Exception as e:
80
+ return jsonify({'error': str(e)}), 500
81
+
82
+ @app.route('/api/discussions', methods=['GET'])
83
+ def get_discussions():
84
+ init_session()
85
+ return jsonify({'discussions': session.get('discussions', [])})
86
+
87
+ @app.route('/api/discussion/<discussion_id>', methods=['DELETE'])
88
+ def delete_discussion(discussion_id):
89
+ init_session()
90
+ discussions = session.get('discussions', [])
91
+ discussions = [d for d in discussions if d['id'] != discussion_id]
92
+ session['discussions'] = discussions
93
+ session.modified = True
94
+ return jsonify({'success': True})
95
+
96
+ @app.route('/api/download/<discussion_id>', methods=['GET'])
97
+ def download_pdf(discussion_id):
98
+ init_session()
99
+ discussions = session.get('discussions', [])
100
+ discussion = next((d for d in discussions if d['id'] == discussion_id), None)
101
+
102
+ if not discussion:
103
+ return jsonify({'error': 'Discussion non trouvée'}), 404
104
+
105
+ # Créer le PDF
106
+ buffer = io.BytesIO()
107
+ doc = SimpleDocTemplate(buffer, pagesize=letter)
108
+ styles = getSampleStyleSheet()
109
+ story = []
110
+
111
+ # Titre
112
+ title_style = ParagraphStyle(
113
+ 'CustomTitle',
114
+ parent=styles['Heading1'],
115
+ fontSize=18,
116
+ textColor='#2c3e50'
117
+ )
118
+ story.append(Paragraph(f"Résumé - {discussion['type'].upper()}", title_style))
119
+ story.append(Spacer(1, 12))
120
+
121
+ # Date
122
+ date_text = f"Généré le : {datetime.fromisoformat(discussion['timestamp']).strftime('%d/%m/%Y %H:%M')}"
123
+ story.append(Paragraph(date_text, styles['Normal']))
124
+ story.append(Spacer(1, 20))
125
+
126
+ # Contenu original
127
+ story.append(Paragraph("Contenu original :", styles['Heading2']))
128
+ story.append(Spacer(1, 6))
129
+ content_style = ParagraphStyle(
130
+ 'ContentStyle',
131
+ parent=styles['Normal'],
132
+ alignment=TA_JUSTIFY
133
+ )
134
+ story.append(Paragraph(discussion['content'].replace('\n', '<br/>'), content_style))
135
+ story.append(Spacer(1, 20))
136
+
137
+ # Résumé
138
+ story.append(Paragraph("Résumé :", styles['Heading2']))
139
+ story.append(Spacer(1, 6))
140
+ story.append(Paragraph(discussion['resume'].replace('\n', '<br/>'), content_style))
141
+
142
+ doc.build(story)
143
+ buffer.seek(0)
144
+
145
+ return send_file(
146
+ buffer,
147
+ as_attachment=True,
148
+ download_name=f"resume_{discussion_id[:8]}.pdf",
149
+ mimetype='application/pdf'
150
+ )
151
+
152
+ if __name__ == '__main__':
153
+ app.run(debug=True)