MisterAI commited on
Commit
8965b07
·
verified ·
1 Parent(s): c906b26

Create app.py

Browse files
Files changed (1) hide show
  1. app.py +224 -0
app.py ADDED
@@ -0,0 +1,224 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #https://huggingface.co/spaces/MisterAI/GenDoc_05
2
+ #app.py_146
3
+ #Separation Du Code
4
+ #Correction Sortie Logs
5
+
6
+ import os
7
+ import gradio as gr
8
+ from transformers import AutoModelForCausalLM, AutoTokenizer
9
+ import torch
10
+ import time
11
+ from llm.list_llm import TEXT_MODELS, IMAGE_MODELS
12
+ from llm.prompt_llm import PREPROMPT
13
+ from python_pptx.python_pptx import PresentationGenerator
14
+
15
+ # Configuration du modèle par défaut
16
+ DEFAULT_MODEL = "ibm-granite/granite-3.1-3b-a800m-Instruct"
17
+
18
+ class ExecutionTimer:
19
+ def __init__(self):
20
+ self.start_time = None
21
+ self.last_duration = None
22
+
23
+ def start(self):
24
+ self.start_time = time.time()
25
+
26
+ def get_elapsed(self):
27
+ if self.start_time is None:
28
+ return 0
29
+ return time.time() - self.start_time
30
+
31
+ def stop(self):
32
+ if self.start_time is not None:
33
+ self.last_duration = self.get_elapsed()
34
+ self.start_time = None
35
+ return self.last_duration
36
+
37
+ def get_status(self):
38
+ if self.start_time is not None:
39
+ current = self.get_elapsed()
40
+ last = f" (précédent: {self.last_duration:.2f}s)" if self.last_duration else ""
41
+ return f"En cours... {current:.2f}s{last}"
42
+ elif self.last_duration:
43
+ return f"Terminé en {self.last_duration:.2f}s"
44
+ return "En attente..."
45
+
46
+ def generate_text(model_path, prompt, temperature=0.7, max_tokens=2048):
47
+ try:
48
+ tokenizer = AutoTokenizer.from_pretrained(model_path)
49
+ model = AutoModelForCausalLM.from_pretrained(
50
+ model_path,
51
+ torch_dtype=torch.float32,
52
+ device_map="auto"
53
+ )
54
+ model.eval()
55
+
56
+ chat = [{"role": "user", "content": prompt}]
57
+ formatted_prompt = tokenizer.apply_chat_template(
58
+ chat,
59
+ tokenize=False,
60
+ add_generation_prompt=True
61
+ )
62
+
63
+ inputs = tokenizer(
64
+ formatted_prompt,
65
+ return_tensors="pt",
66
+ truncation=True,
67
+ max_length=4096
68
+ ).to(model.device)
69
+
70
+ with torch.no_grad():
71
+ outputs = model.generate(
72
+ **inputs,
73
+ max_new_tokens=max_tokens,
74
+ temperature=temperature,
75
+ do_sample=True,
76
+ pad_token_id=tokenizer.eos_token_id
77
+ )
78
+
79
+ return tokenizer.decode(outputs[0], skip_special_tokens=True)
80
+
81
+ except Exception as e:
82
+ print(f"Erreur lors de la génération: {str(e)}")
83
+ raise
84
+
85
+ def generate_skeleton(model_name, text, temperature, max_tokens):
86
+ """Génère le squelette de la présentation"""
87
+ try:
88
+ timer.start()
89
+
90
+ model_path = TEXT_MODELS.get(model_name, DEFAULT_MODEL)
91
+ full_prompt = PREPROMPT + "\n\n" + text
92
+ generated_content = generate_text(model_path, full_prompt, temperature, max_tokens)
93
+
94
+ status = timer.get_status()
95
+ timer.stop()
96
+
97
+ return status, generated_content, gr.update(visible=True)
98
+
99
+ except Exception as e:
100
+ timer.stop()
101
+ error_msg = f"Erreur: {str(e)}"
102
+ print(error_msg)
103
+ return error_msg, None, gr.update(visible=False)
104
+
105
+ def create_presentation_file(generated_content):
106
+ """Crée le fichier PowerPoint à partir du contenu généré"""
107
+ try:
108
+ timer.start()
109
+ generator = PresentationGenerator()
110
+
111
+ slides = generator.parse_presentation_content(generated_content)
112
+ prs = generator.create_presentation(slides)
113
+
114
+ output_path = os.path.join(os.getcwd(), "presentation.pptx")
115
+ prs.save(output_path)
116
+
117
+ timer.stop()
118
+ return output_path
119
+
120
+ except Exception as e:
121
+ timer.stop()
122
+ print(f"Erreur lors de la création du fichier: {str(e)}")
123
+ return None
124
+
125
+ # Timer global pour le suivi du temps
126
+ timer = ExecutionTimer()
127
+
128
+ # Interface Gradio
129
+ with gr.Blocks(theme=gr.themes.Glass()) as demo:
130
+ gr.Markdown(
131
+ """
132
+ # Générateur de Présentations PowerPoint IA
133
+
134
+ Créez des présentations professionnelles automatiquement avec l'aide de l'IA.
135
+ """
136
+ )
137
+
138
+ with gr.Row():
139
+ with gr.Column(scale=1):
140
+ model_selector = gr.Dropdown(
141
+ choices=list(TEXT_MODELS.keys()) if TEXT_MODELS else ["Granite"],
142
+ value="Granite" if not TEXT_MODELS else list(TEXT_MODELS.keys())[0],
143
+ label="Modèle de texte"
144
+ )
145
+ temperature = gr.Slider(
146
+ minimum=0.1,
147
+ maximum=1.0,
148
+ value=0.7,
149
+ step=0.1,
150
+ label="Température"
151
+ )
152
+ max_tokens = gr.Slider(
153
+ minimum=1000,
154
+ maximum=4096,
155
+ value=2048,
156
+ step=256,
157
+ label="Tokens maximum"
158
+ )
159
+
160
+ with gr.Row():
161
+ with gr.Column(scale=2):
162
+ input_text = gr.Textbox(
163
+ lines=10,
164
+ label="Votre texte",
165
+ placeholder="Décrivez le contenu que vous souhaitez pour votre présentation..."
166
+ )
167
+
168
+ with gr.Row():
169
+ generate_skeleton_btn = gr.Button("Générer le Squelette de la Présentation", variant="primary")
170
+
171
+ with gr.Row():
172
+ with gr.Column():
173
+ status_output = gr.Textbox(
174
+ label="Statut",
175
+ lines=2,
176
+ value=timer.get_status()
177
+ )
178
+ generated_content = gr.Textbox(
179
+ label="Contenu généré",
180
+ lines=10,
181
+ show_copy_button=True
182
+ )
183
+ create_presentation_btn = gr.Button("Créer Présentation", visible=True)
184
+ output_file = gr.File(
185
+ label="Présentation PowerPoint",
186
+ type="filepath"
187
+ )
188
+
189
+ def update_status():
190
+ """Met à jour le statut avec le temps écoulé"""
191
+ return timer.get_status()
192
+
193
+ generate_skeleton_btn.click(
194
+ fn=generate_skeleton,
195
+ inputs=[
196
+ model_selector,
197
+ input_text,
198
+ temperature,
199
+ max_tokens
200
+ ],
201
+ outputs=[
202
+ status_output,
203
+ generated_content,
204
+ create_presentation_btn
205
+ ]
206
+ )
207
+
208
+ create_presentation_btn.click(
209
+ fn=create_presentation_file,
210
+ inputs=[generated_content],
211
+ outputs=[output_file]
212
+ )
213
+
214
+ # Met à jour le statut toutes les 5 secondes
215
+ gr.Interval(every=5, fn=update_status, outputs=status_output)
216
+
217
+ if __name__ == "__main__":
218
+ demo.launch()
219
+
220
+
221
+
222
+
223
+
224
+