DHEIVER commited on
Commit
2cf26e9
·
verified ·
1 Parent(s): eeed458

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +423 -69
app.py CHANGED
@@ -1,60 +1,176 @@
1
  import gradio as gr
2
  import random
3
- from transformers import AutoModelForCausalLM, AutoTokenizer
4
  import torch
5
- from typing import Dict, List
6
-
7
- class PromptGenerator:
8
- def __init__(self):
9
- print("Carregando modelo... (pode demorar alguns minutos na primeira vez)")
10
- self.model_name = "beomi/llama-2-ko-7b"
11
- self.tokenizer = AutoTokenizer.from_pretrained(self.model_name)
12
- self.model = AutoModelForCausalLM.from_pretrained(
13
- self.model_name,
14
- torch_dtype=torch.float16,
15
- device_map="auto"
16
- )
17
- print("Modelo carregado!")
18
-
19
- def generate_with_model(self, prompt: str) -> str:
20
- inputs = self.tokenizer(prompt, return_tensors="pt").to(self.model.device)
21
- outputs = self.model.generate(
22
- **inputs,
23
- max_new_tokens=512,
24
- temperature=0.7,
25
- top_p=0.9,
26
- do_sample=True,
27
- pad_token_id=self.tokenizer.eos_token_id
28
- )
29
- return self.tokenizer.decode(outputs[0], skip_special_tokens=True)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
30
 
 
31
  TEMPLATES = {
32
  "história": {
33
- "creative": "Crie uma história {gênero} sobre {tema} com {personagens} personagens. A história deve ter {comprimento} palavras e incluir {elementos}.",
34
- "analysis": "Analise a seguinte história considerando {aspectos}. Foque em {elementos} e forneça exemplos específicos do texto.",
35
- "continuation": "Continue a seguinte história mantendo o {tom} e desenvolvendo {elementos}."
 
 
 
 
 
 
 
 
 
36
  },
37
  "técnico": {
38
- "tutorial": "Crie um tutorial detalhado sobre {tema} para {público}. Inclua {elementos} e forneça {exemplos} exemplos práticos.",
39
- "documentation": "Documente {sistema} incluindo {aspectos}. Foque em {elementos} e forneça {exemplos} exemplos de uso.",
40
- "troubleshooting": "Crie um guia de solução de problemas para {sistema} cobrindo {problemas}."
 
 
 
 
 
 
 
 
 
41
  },
42
  "educacional": {
43
- "lesson": "Prepare uma aula sobre {tema} para {público}. Inclua {objetivos} e atividades práticas.",
44
- "exercise": "Crie exercícios sobre {tema} com {dificuldade} níveis de dificuldade.",
45
- "explanation": "Explique {conceito} para {público} usando {analogias} e exemplos práticos."
 
 
 
 
 
 
 
 
 
46
  }
47
  }
48
 
49
- generator = PromptGenerator()
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
50
 
51
- def generate_prompt(categoria: str, subcategoria: str, tema: str, elementos: str,
52
- público_alvo: str, tom: str, comprimento: int,
53
- usar_llm: bool = True) -> str:
54
  if categoria not in TEMPLATES or subcategoria not in TEMPLATES[categoria]:
55
- return "Categoria ou subcategoria não encontrada"
56
 
57
- template = TEMPLATES[categoria][subcategoria]
58
 
59
  params = {
60
  "tema": tema,
@@ -80,22 +196,29 @@ def generate_prompt(categoria: str, subcategoria: str, tema: str, elementos: str
80
  base_prompt += f"\nComprimento aproximado: {comprimento} palavras"
81
 
82
  if usar_llm:
 
83
  instruction = f"""
84
  Você é um assistente especializado em criar prompts detalhados em português para LLMs.
85
  Expanda e melhore o seguinte prompt base, adicionando mais detalhes, exemplos e estrutura:
86
 
87
  {base_prompt}
88
 
 
 
 
 
 
89
  Crie uma versão mais completa e detalhada deste prompt, mantendo o objetivo original
90
  mas adicionando mais contexto e especificidade.
91
  """
92
- return generator.generate_with_model(instruction)
93
 
94
- return base_prompt
95
 
96
  def create_interface():
 
97
  with gr.Blocks(
98
- title="Gerador de Prompts para LLMs",
99
  theme=gr.themes.Soft(
100
  primary_hue="indigo",
101
  secondary_hue="blue",
@@ -103,8 +226,8 @@ def create_interface():
103
  ) as app:
104
  gr.Markdown(
105
  """
106
- # 🤖 Gerador de Prompts Inteligente
107
- ### Crie prompts estruturados e detalhados usando IA
108
  """
109
  )
110
 
@@ -125,6 +248,11 @@ def create_interface():
125
  value="creative",
126
  container=False,
127
  )
 
 
 
 
 
128
 
129
  with gr.Column(scale=2):
130
  tema = gr.Textbox(
@@ -153,14 +281,23 @@ def create_interface():
153
  )
154
 
155
  with gr.Column(scale=2):
156
- comprimento = gr.Slider(
157
- minimum=100,
158
- maximum=2000,
159
- step=100,
160
- label="📏 Comprimento (palavras)",
161
- value=500,
162
- container=False,
163
- )
 
 
 
 
 
 
 
 
 
164
  usar_llm = gr.Checkbox(
165
  label="🤖 Usar IA para expandir prompt",
166
  value=True,
@@ -180,37 +317,254 @@ def create_interface():
180
  lines=10,
181
  container=False,
182
  )
 
 
 
 
 
 
 
 
 
 
183
 
184
  with gr.TabItem("ℹ️ Sobre"):
185
  gr.Markdown(
186
  """
187
- ### Sobre o Gerador de Prompts
188
 
189
- Este é um gerador de prompts inteligente que utiliza IA para criar prompts estruturados
190
- e detalhados para diversos tipos de conteúdo. Ele pode ser usado para:
191
 
192
- - 📚 Criação de histórias
193
- - 📖 Análise de textos
194
- - 💻 Documentação técnica
195
- - 🎓 Conteúdo educacional
 
196
 
197
- O gerador usa um modelo de linguagem avançado para expandir e melhorar os prompts básicos,
198
- tornando-os mais detalhados e específicos para suas necessidades.
199
  """
200
  )
201
 
202
- def atualizar_subcategorias(categoria):
203
- return gr.Dropdown(choices=list(TEMPLATES[categoria].keys()))
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
204
 
205
- categoria.change(atualizar_subcategorias, inputs=[categoria], outputs=[subcategoria])
 
 
 
 
 
206
  gerar_btn.click(
207
  generate_prompt,
208
- inputs=[categoria, subcategoria, tema, elementos, público_alvo, tom, comprimento, usar_llm],
209
- outputs=[saida]
 
 
 
 
 
210
  )
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
211
 
212
  return app
213
 
214
  if __name__ == "__main__":
215
  app = create_interface()
216
- app.launch()
 
 
 
 
 
 
1
  import gradio as gr
2
  import random
 
3
  import torch
4
+ from transformers import AutoModelForCausalLM, AutoTokenizer
5
+ from typing import Dict, List, Tuple, Optional
6
+ from dataclasses import dataclass
7
+ import json
8
+ import os
9
+ from datetime import datetime
10
+ import numpy as np
11
+
12
+ @dataclass
13
+ class PromptConfig:
14
+ """Configuração para geração de prompts"""
15
+ temperatura: float = 0.7
16
+ top_p: float = 0.9
17
+ max_tokens: int = 512
18
+ repetition_penalty: float = 1.1
19
+
20
+ class EnhancedPromptGenerator:
21
+ def __init__(self, model_name: str = "beomi/llama-2-ko-7b"):
22
+ self.model_name = model_name
23
+ self.history_file = "prompt_history.json"
24
+ self.load_model()
25
+ self.load_history()
26
+
27
+ def load_model(self):
28
+ """Carrega o modelo com tratamento de erro"""
29
+ try:
30
+ print("Carregando modelo... (pode demorar alguns minutos na primeira vez)")
31
+ self.tokenizer = AutoTokenizer.from_pretrained(self.model_name)
32
+ self.model = AutoModelForCausalLM.from_pretrained(
33
+ self.model_name,
34
+ torch_dtype=torch.float16,
35
+ device_map="auto",
36
+ low_cpu_mem_usage=True
37
+ )
38
+ print("Modelo carregado com sucesso!")
39
+ except Exception as e:
40
+ print(f"Erro ao carregar o modelo: {e}")
41
+ raise
42
+
43
+ def load_history(self):
44
+ """Carrega histórico de prompts gerados"""
45
+ self.history = []
46
+ if os.path.exists(self.history_file):
47
+ try:
48
+ with open(self.history_file, 'r', encoding='utf-8') as f:
49
+ self.history = json.load(f)
50
+ except:
51
+ print("Erro ao carregar histórico. Criando novo arquivo.")
52
+
53
+ def save_history(self):
54
+ """Salva histórico de prompts"""
55
+ try:
56
+ with open(self.history_file, 'w', encoding='utf-8') as f:
57
+ json.dump(self.history, f, ensure_ascii=False, indent=2)
58
+ except Exception as e:
59
+ print(f"Erro ao salvar histórico: {e}")
60
+
61
+ def analyze_prompt_quality(self, prompt: str) -> Dict[str, float]:
62
+ """Analisa a qualidade do prompt gerado"""
63
+ analysis = {
64
+ "complexidade": len(prompt.split()) / 100, # Normalizado para 0-1
65
+ "especificidade": len(set(prompt.split())) / len(prompt.split()),
66
+ "clareza": 1 - (prompt.count(',') + prompt.count(';')) / len(prompt.split())
67
+ }
68
+ return analysis
69
+
70
+ def generate_with_model(self, prompt: str, config: PromptConfig = PromptConfig()) -> Tuple[str, Dict[str, float]]:
71
+ """Gera texto usando o modelo com configurações avançadas"""
72
+ try:
73
+ inputs = self.tokenizer(prompt, return_tensors="pt").to(self.model.device)
74
+
75
+ outputs = self.model.generate(
76
+ **inputs,
77
+ max_new_tokens=config.max_tokens,
78
+ temperature=config.temperatura,
79
+ top_p=config.top_p,
80
+ repetition_penalty=config.repetition_penalty,
81
+ do_sample=True,
82
+ pad_token_id=self.tokenizer.eos_token_id
83
+ )
84
+
85
+ generated_text = self.tokenizer.decode(outputs[0], skip_special_tokens=True)
86
+ quality_metrics = self.analyze_prompt_quality(generated_text)
87
+
88
+ # Salva no histórico
89
+ self.history.append({
90
+ "timestamp": datetime.now().isoformat(),
91
+ "prompt": prompt,
92
+ "generated": generated_text,
93
+ "metrics": quality_metrics
94
+ })
95
+ self.save_history()
96
+
97
+ return generated_text, quality_metrics
98
+
99
+ except Exception as e:
100
+ print(f"Erro na geração: {e}")
101
+ return str(e), {"erro": 1.0}
102
 
103
+ # Templates expandidos com mais opções e detalhes
104
  TEMPLATES = {
105
  "história": {
106
+ "creative": {
107
+ "template": "Crie uma história {gênero} sobre {tema} com {personagens} personagens. A história deve ter {comprimento} palavras e incluir {elementos}.",
108
+ "sugestões": ["aventura épica", "drama pessoal", "mistério sobrenatural"]
109
+ },
110
+ "analysis": {
111
+ "template": "Analise a seguinte história considerando {aspectos}. Foque em {elementos} e forneça exemplos específicos do texto.",
112
+ "sugestões": ["análise profunda", "crítica construtiva", "interpretação temática"]
113
+ },
114
+ "continuation": {
115
+ "template": "Continue a seguinte história mantendo o {tom} e desenvolvendo {elementos}.",
116
+ "sugestões": ["expansão do universo", "desenvolvimento de personagem", "resolução de conflito"]
117
+ }
118
  },
119
  "técnico": {
120
+ "tutorial": {
121
+ "template": "Crie um tutorial detalhado sobre {tema} para {público}. Inclua {elementos} e forneça {exemplos} exemplos práticos.",
122
+ "sugestões": ["passo a passo", "guia completo", "referência rápida"]
123
+ },
124
+ "documentation": {
125
+ "template": "Documente {sistema} incluindo {aspectos}. Foque em {elementos} e forneça {exemplos} exemplos de uso.",
126
+ "sugestões": ["documentação técnica", "manual do usuário", "guia de referência"]
127
+ },
128
+ "troubleshooting": {
129
+ "template": "Crie um guia de solução de problemas para {sistema} cobrindo {problemas}.",
130
+ "sugestões": ["resolução de problemas", "diagnóstico", "manutenção"]
131
+ }
132
  },
133
  "educacional": {
134
+ "lesson": {
135
+ "template": "Prepare uma aula sobre {tema} para {público}. Inclua {objetivos} e atividades práticas.",
136
+ "sugestões": ["aula interativa", "workshop prático", "seminário"]
137
+ },
138
+ "exercise": {
139
+ "template": "Crie exercícios sobre {tema} com {dificuldade} níveis de dificuldade.",
140
+ "sugestões": ["exercícios práticos", "desafios", "problemas"]
141
+ },
142
+ "explanation": {
143
+ "template": "Explique {conceito} para {público} usando {analogias} e exemplos práticos.",
144
+ "sugestões": ["explicação detalhada", "conceitos básicos", "aprofundamento"]
145
+ }
146
  }
147
  }
148
 
149
+ generator = EnhancedPromptGenerator()
150
+
151
+ def get_suggestions(categoria: str, subcategoria: str) -> List[str]:
152
+ """Retorna sugestões baseadas na categoria e subcategoria"""
153
+ return TEMPLATES[categoria][subcategoria].get("sugestões", [])
154
+
155
+ def generate_prompt(
156
+ categoria: str,
157
+ subcategoria: str,
158
+ tema: str,
159
+ elementos: str,
160
+ público_alvo: str,
161
+ tom: str,
162
+ comprimento: int,
163
+ temperatura: float,
164
+ usar_llm: bool = True
165
+ ) -> Tuple[str, Dict[str, float]]:
166
+ """Função aprimorada de geração de prompts"""
167
+ if not tema or not elementos:
168
+ return "Por favor, preencha o tema e os elementos.", {"erro": 1.0}
169
 
 
 
 
170
  if categoria not in TEMPLATES or subcategoria not in TEMPLATES[categoria]:
171
+ return "Categoria ou subcategoria não encontrada", {"erro": 1.0}
172
 
173
+ template = TEMPLATES[categoria][subcategoria]["template"]
174
 
175
  params = {
176
  "tema": tema,
 
196
  base_prompt += f"\nComprimento aproximado: {comprimento} palavras"
197
 
198
  if usar_llm:
199
+ config = PromptConfig(temperatura=temperatura)
200
  instruction = f"""
201
  Você é um assistente especializado em criar prompts detalhados em português para LLMs.
202
  Expanda e melhore o seguinte prompt base, adicionando mais detalhes, exemplos e estrutura:
203
 
204
  {base_prompt}
205
 
206
+ Considere:
207
+ - Público-alvo: {público_alvo}
208
+ - Elementos específicos: {elementos}
209
+ - Tom desejado: {tom}
210
+
211
  Crie uma versão mais completa e detalhada deste prompt, mantendo o objetivo original
212
  mas adicionando mais contexto e especificidade.
213
  """
214
+ return generator.generate_with_model(instruction, config)
215
 
216
+ return base_prompt, generator.analyze_prompt_quality(base_prompt)
217
 
218
  def create_interface():
219
+ """Interface aprimorada com mais recursos"""
220
  with gr.Blocks(
221
+ title="Gerador de Prompts Inteligente",
222
  theme=gr.themes.Soft(
223
  primary_hue="indigo",
224
  secondary_hue="blue",
 
226
  ) as app:
227
  gr.Markdown(
228
  """
229
+ # 🤖 Gerador de Prompts Inteligente v2.0
230
+ ### Crie prompts estruturados e detalhados usando IA avançada
231
  """
232
  )
233
 
 
248
  value="creative",
249
  container=False,
250
  )
251
+ sugestoes = gr.Dropdown(
252
+ choices=[],
253
+ label="💫 Sugestões",
254
+ container=False,
255
+ )
256
 
257
  with gr.Column(scale=2):
258
  tema = gr.Textbox(
 
281
  )
282
 
283
  with gr.Column(scale=2):
284
+ with gr.Row():
285
+ comprimento = gr.Slider(
286
+ minimum=100,
287
+ maximum=2000,
288
+ step=100,
289
+ label="📏 Comprimento (palavras)",
290
+ value=500,
291
+ container=False,
292
+ )
293
+ temperatura = gr.Slider(
294
+ minimum=0.1,
295
+ maximum=1.0,
296
+ step=0.1,
297
+ label="🌡️ Temperatura",
298
+ value=0.7,
299
+ container=False,
300
+ )
301
  usar_llm = gr.Checkbox(
302
  label="🤖 Usar IA para expandir prompt",
303
  value=True,
 
317
  lines=10,
318
  container=False,
319
  )
320
+ metricas = gr.JSON(
321
+ label="📊 Métricas de Qualidade",
322
+ container=False,
323
+ )
324
+
325
+ with gr.TabItem("📈 Histórico"):
326
+ historico = gr.DataFrame(
327
+ headers=["Data", "Prompt Original", "Texto Gerado", "Métricas"],
328
+ label="Histórico de Prompts Gerados"
329
+ )
330
 
331
  with gr.TabItem("ℹ️ Sobre"):
332
  gr.Markdown(
333
  """
334
+ ### Sobre o Gerador de Prompts v2.0
335
 
336
+ Esta é uma versão aprimorada do gerador de prompts que inclui:
 
337
 
338
+ - 📊 Análise de qualidade dos prompts gerados
339
+ - 📈 Histórico de gerações
340
+ - 🎯 Sugestões contextuais
341
+ - 🌡️ Controle de temperatura
342
+ - 🔄 Sistema de feedback
343
 
344
+ O gerador usa um modelo de linguagem avançado para criar prompts
345
+ detalhados e específicos para suas necessidades.
346
  """
347
  )
348
 
349
+ def atualizar_interface(categoria, subcategoria):
350
+ sugestoes_list = get_suggestions(categoria, subcategoria)
351
+ return [
352
+ gr.Dropdown(choices=list(TEMPLATES[categoria].keys())),
353
+ gr.Dropdown(choices=sugestoes_list)
354
+ ]
355
+
356
+ def atualizar_historico():
357
+ if generator.history:
358
+ dados = [(
359
+ h["timestamp"],
360
+ h["prompt"],
361
+ h["generated"],
362
+ str(h["metrics"])
363
+ ) for h in generator.history]
364
+ return gr.DataFrame(value=dados)
365
+ return gr.DataFrame()
366
 
367
+ categoria.change(
368
+ atualizar_interface,
369
+ inputs=[categoria, subcategoria],
370
+ outputs=[subcategoria, sugestoes]
371
+ )
372
+
373
  gerar_btn.click(
374
  generate_prompt,
375
+ inputs=[
376
+ categoria, subcategoria, tema, elementos,
377
+ público_alvo, tom, comprimento, temperatura, usar_llm
378
+ ],
379
+ outputs=[saida, metricas]
380
+ ).then(
381
+ atualizar_historico,outputs=[historico]
382
  )
383
+
384
+ # Adiciona feedback visual de carregamento
385
+ gerar_btn.click(
386
+ lambda: gr.update(interactive=False),
387
+ outputs=[gerar_btn]
388
+ ).then(
389
+ lambda: gr.update(interactive=True),
390
+ outputs=[gerar_btn]
391
+ )
392
+
393
+ # Função para exportar histórico
394
+ def exportar_historico():
395
+ timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
396
+ filename = f"historico_prompts_{timestamp}.json"
397
+ try:
398
+ with open(filename, 'w', encoding='utf-8') as f:
399
+ json.dump(generator.history, f, ensure_ascii=False, indent=2)
400
+ return f"Histórico exportado com sucesso para {filename}"
401
+ except Exception as e:
402
+ return f"Erro ao exportar histórico: {e}"
403
+
404
+ # Adiciona botão de exportação na aba de histórico
405
+ with gr.TabItem("📈 Histórico"):
406
+ with gr.Row():
407
+ exportar_btn = gr.Button("📥 Exportar Histórico")
408
+ status_exportacao = gr.Textbox(label="Status da Exportação")
409
+
410
+ exportar_btn.click(
411
+ exportar_historico,
412
+ outputs=[status_exportacao]
413
+ )
414
+
415
+ # Adiciona sistema de templates favoritos
416
+ class TemplateManager:
417
+ def __init__(self, filename="templates_favoritos.json"):
418
+ self.filename = filename
419
+ self.templates = self.carregar_templates()
420
+
421
+ def carregar_templates(self):
422
+ if os.path.exists(self.filename):
423
+ try:
424
+ with open(self.filename, 'r', encoding='utf-8') as f:
425
+ return json.load(f)
426
+ except:
427
+ return {}
428
+ return {}
429
+
430
+ def salvar_templates(self):
431
+ with open(self.filename, 'w', encoding='utf-8') as f:
432
+ json.dump(self.templates, f, ensure_ascii=False, indent=2)
433
+
434
+ def adicionar_template(self, nome: str, template: dict):
435
+ self.templates[nome] = template
436
+ self.salvar_templates()
437
+
438
+ def remover_template(self, nome: str):
439
+ if nome in self.templates:
440
+ del self.templates[nome]
441
+ self.salvar_templates()
442
+
443
+ template_manager = TemplateManager()
444
+
445
+ # Adiciona aba de templates favoritos
446
+ with gr.TabItem("⭐ Templates Favoritos"):
447
+ with gr.Row():
448
+ with gr.Column():
449
+ nome_template = gr.Textbox(label="Nome do Template")
450
+ salvar_template_btn = gr.Button("💾 Salvar Template Atual")
451
+ templates_salvos = gr.Dropdown(
452
+ choices=list(template_manager.templates.keys()),
453
+ label="Templates Salvos"
454
+ )
455
+ carregar_template_btn = gr.Button("📂 Carregar Template")
456
+ remover_template_btn = gr.Button("🗑️ Remover Template")
457
+
458
+ def salvar_template_atual(nome, categoria, subcategoria, tema, elementos, público_alvo, tom, comprimento):
459
+ if not nome:
460
+ return "Por favor, forneça um nome para o template"
461
+
462
+ template = {
463
+ "categoria": categoria,
464
+ "subcategoria": subcategoria,
465
+ "tema": tema,
466
+ "elementos": elementos,
467
+ "público_alvo": público_alvo,
468
+ "tom": tom,
469
+ "comprimento": comprimento
470
+ }
471
+
472
+ template_manager.adicionar_template(nome, template)
473
+ return f"Template '{nome}' salvo com sucesso!"
474
+
475
+ def carregar_template(nome):
476
+ if nome not in template_manager.templates:
477
+ return [gr.update() for _ in range(7)]
478
+
479
+ template = template_manager.templates[nome]
480
+ return [
481
+ gr.update(value=template["categoria"]),
482
+ gr.update(value=template["subcategoria"]),
483
+ gr.update(value=template["tema"]),
484
+ gr.update(value=template["elementos"]),
485
+ gr.update(value=template["público_alvo"]),
486
+ gr.update(value=template["tom"]),
487
+ gr.update(value=template["comprimento"])
488
+ ]
489
+
490
+ def remover_template(nome):
491
+ if nome:
492
+ template_manager.remover_template(nome)
493
+ return [
494
+ gr.update(choices=list(template_manager.templates.keys())),
495
+ f"Template '{nome}' removido com sucesso!"
496
+ ]
497
+ return [gr.update(), "Selecione um template para remover"]
498
+
499
+ salvar_template_btn.click(
500
+ salvar_template_atual,
501
+ inputs=[
502
+ nome_template, categoria, subcategoria,
503
+ tema, elementos, público_alvo, tom, comprimento
504
+ ],
505
+ outputs=[gr.Textbox(label="Status")]
506
+ )
507
+
508
+ carregar_template_btn.click(
509
+ carregar_template,
510
+ inputs=[templates_salvos],
511
+ outputs=[categoria, subcategoria, tema, elementos, público_alvo, tom, comprimento]
512
+ )
513
+
514
+ remover_template_btn.click(
515
+ remover_template,
516
+ inputs=[templates_salvos],
517
+ outputs=[templates_salvos, gr.Textbox(label="Status")]
518
+ )
519
+
520
+ # Adiciona sistema de feedback
521
+ with gr.TabItem("📝 Feedback"):
522
+ with gr.Row():
523
+ feedback_text = gr.TextArea(
524
+ label="Seu feedback sobre o prompt gerado",
525
+ placeholder="Digite seu feedback aqui..."
526
+ )
527
+ rating = gr.Slider(
528
+ minimum=1,
529
+ maximum=5,
530
+ step=1,
531
+ label="Avaliação (1-5 estrelas)"
532
+ )
533
+
534
+ def salvar_feedback(texto, nota):
535
+ if not texto:
536
+ return "Por favor, forneça um feedback"
537
+
538
+ feedback = {
539
+ "texto": texto,
540
+ "avaliacao": nota,
541
+ "timestamp": datetime.now().isoformat()
542
+ }
543
+
544
+ try:
545
+ with open("feedbacks.json", "a+") as f:
546
+ json.dump(feedback, f)
547
+ f.write("\n")
548
+ return "Feedback salvo com sucesso! Obrigado pela sua avaliação."
549
+ except Exception as e:
550
+ return f"Erro ao salvar feedback: {e}"
551
+
552
+ feedback_btn = gr.Button("✉️ Enviar Feedback")
553
+ feedback_status = gr.Textbox(label="Status do Feedback")
554
+
555
+ feedback_btn.click(
556
+ salvar_feedback,
557
+ inputs=[feedback_text, rating],
558
+ outputs=[feedback_status]
559
+ )
560
 
561
  return app
562
 
563
  if __name__ == "__main__":
564
  app = create_interface()
565
+ app.launch(
566
+ share=True,
567
+ server_name="0.0.0.0",
568
+ server_port=7860,
569
+ enable_queue=True
570
+ )