DHEIVER commited on
Commit
b974190
·
verified ·
1 Parent(s): a1fb155

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +155 -390
app.py CHANGED
@@ -1,13 +1,19 @@
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:
@@ -17,140 +23,108 @@ class PromptConfig:
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,
@@ -162,58 +136,62 @@ def generate_prompt(
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,
177
- "elementos": elementos,
178
- "público": público_alvo,
179
- "tom": tom,
180
- "comprimento": comprimento,
181
- "gênero": random.choice(["de aventura", "de mistério", "de fantasia", "de ficção científica"]),
182
- "personagens": random.randint(2, 5),
183
- "aspectos": "caracterização, desenvolvimento do enredo, temas principais",
184
- "exemplos": random.randint(3, 5),
185
- "sistema": tema,
186
- "problemas": "problemas comuns e casos específicos",
187
- "dificuldade": random.randint(3, 5),
188
- "conceito": tema,
189
- "analogias": "analogias cotidianas"
190
- }
191
-
192
- base_prompt = template.format(**params)
193
- base_prompt += f"\n\nTom desejado: {tom}"
194
-
195
- if comprimento:
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"""
@@ -249,7 +227,7 @@ def create_interface():
249
  container=False,
250
  )
251
  sugestoes = gr.Dropdown(
252
- choices=[],
253
  label="💫 Sugestões",
254
  container=False,
255
  )
@@ -281,28 +259,28 @@ def create_interface():
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,
304
  container=False,
305
  )
 
 
 
 
 
 
306
 
307
  with gr.Row():
308
  gerar_btn = gr.Button(
@@ -317,52 +295,21 @@ def create_interface():
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,
@@ -376,197 +323,15 @@ def create_interface():
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
- # No final do código, substitua o bloco de launch por:
564
-
565
  if __name__ == "__main__":
566
  app = create_interface()
567
- app.queue() # Habilita queue de forma compatível
568
  app.launch(
569
- share=True,
570
  server_name="0.0.0.0",
571
  server_port=7860
572
  )
 
1
  import gradio as gr
2
  import random
 
3
  from transformers import AutoModelForCausalLM, AutoTokenizer
4
+ import torch
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 logging
11
+
12
+ # Configuração de logging
13
+ logging.basicConfig(
14
+ level=logging.INFO,
15
+ format='%(asctime)s - %(levelname)s - %(message)s'
16
+ )
17
 
18
  @dataclass
19
  class PromptConfig:
 
23
  max_tokens: int = 512
24
  repetition_penalty: float = 1.1
25
 
26
+ # Templates corrigidos com estrutura adequada
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
27
  TEMPLATES = {
28
  "história": {
29
  "creative": {
30
  "template": "Crie uma história {gênero} sobre {tema} com {personagens} personagens. A história deve ter {comprimento} palavras e incluir {elementos}.",
31
+ "sugestoes": ["Narrativa épica", "História de mistério", "Conto de fantasia"]
32
  },
33
  "analysis": {
34
  "template": "Analise a seguinte história considerando {aspectos}. Foque em {elementos} e forneça exemplos específicos do texto.",
35
+ "sugestoes": ["Análise de personagens", "Análise de trama", "Análise temática"]
36
  },
37
  "continuation": {
38
  "template": "Continue a seguinte história mantendo o {tom} e desenvolvendo {elementos}.",
39
+ "sugestoes": ["Desenvolvimento de personagem", "Resolução de conflito", "Expansão do universo"]
40
  }
41
  },
42
  "técnico": {
43
  "tutorial": {
44
  "template": "Crie um tutorial detalhado sobre {tema} para {público}. Inclua {elementos} e forneça {exemplos} exemplos práticos.",
45
+ "sugestoes": ["Tutorial passo a passo", "Guia de início rápido", "Manual detalhado"]
46
  },
47
  "documentation": {
48
  "template": "Documente {sistema} incluindo {aspectos}. Foque em {elementos} e forneça {exemplos} exemplos de uso.",
49
+ "sugestoes": ["Documentação técnica", "Manual do usuário", "Especificação de API"]
50
  },
51
  "troubleshooting": {
52
  "template": "Crie um guia de solução de problemas para {sistema} cobrindo {problemas}.",
53
+ "sugestoes": ["Resolução de erros comuns", "Guia de manutenção", "FAQ técnico"]
54
  }
55
  },
56
  "educacional": {
57
  "lesson": {
58
  "template": "Prepare uma aula sobre {tema} para {público}. Inclua {objetivos} e atividades práticas.",
59
+ "sugestoes": ["Plano de aula", "Roteiro de workshop", "Material didático"]
60
  },
61
  "exercise": {
62
  "template": "Crie exercícios sobre {tema} com {dificuldade} níveis de dificuldade.",
63
+ "sugestoes": ["Exercícios práticos", "Desafios progressivos", "Questões de revisão"]
64
  },
65
  "explanation": {
66
  "template": "Explique {conceito} para {público} usando {analogias} e exemplos práticos.",
67
+ "sugestoes": ["Explicação detalhada", "Guia simplificado", "Tutorial conceitual"]
68
  }
69
  }
70
  }
71
 
72
+ class EnhancedPromptGenerator:
73
+ def __init__(self, model_name: str = "beomi/llama-2-ko-7b"):
74
+ self.model_name = model_name
75
+ self.load_model()
76
+
77
+ def load_model(self):
78
+ """Carrega o modelo com otimizações para Spaces"""
79
+ try:
80
+ logging.info("Carregando modelo... (pode demorar alguns minutos na primeira vez)")
81
+ self.tokenizer = AutoTokenizer.from_pretrained(
82
+ self.model_name,
83
+ use_fast=True
84
+ )
85
+ self.model = AutoModelForCausalLM.from_pretrained(
86
+ self.model_name,
87
+ torch_dtype=torch.float16,
88
+ device_map="auto",
89
+ low_cpu_mem_usage=True
90
+ )
91
+ logging.info("Modelo carregado com sucesso!")
92
+ except Exception as e:
93
+ logging.error(f"Erro ao carregar o modelo: {e}")
94
+ raise
95
+
96
+ def generate_with_model(self, prompt: str, config: PromptConfig = PromptConfig()) -> str:
97
+ """Gera texto usando o modelo com configurações avançadas"""
98
+ try:
99
+ inputs = self.tokenizer(prompt, return_tensors="pt").to(self.model.device)
100
+
101
+ outputs = self.model.generate(
102
+ **inputs,
103
+ max_new_tokens=config.max_tokens,
104
+ temperature=config.temperatura,
105
+ top_p=config.top_p,
106
+ repetition_penalty=config.repetition_penalty,
107
+ do_sample=True,
108
+ pad_token_id=self.tokenizer.eos_token_id
109
+ )
110
+
111
+ return self.tokenizer.decode(outputs[0], skip_special_tokens=True)
112
+
113
+ except Exception as e:
114
+ logging.error(f"Erro na geração: {e}")
115
+ return f"Erro na geração: {str(e)}"
116
+
117
  generator = EnhancedPromptGenerator()
118
 
119
  def get_suggestions(categoria: str, subcategoria: str) -> List[str]:
120
  """Retorna sugestões baseadas na categoria e subcategoria"""
121
+ try:
122
+ if categoria in TEMPLATES and subcategoria in TEMPLATES[categoria]:
123
+ return TEMPLATES[categoria][subcategoria].get("sugestoes", [])
124
+ return []
125
+ except Exception as e:
126
+ logging.error(f"Erro ao obter sugestões: {e}")
127
+ return []
128
 
129
  def generate_prompt(
130
  categoria: str,
 
136
  comprimento: int,
137
  temperatura: float,
138
  usar_llm: bool = True
139
+ ) -> Tuple[str, dict]:
140
  """Função aprimorada de geração de prompts"""
141
+ try:
142
+ if not tema or not elementos:
143
+ return "Por favor, preencha o tema e os elementos.", {"erro": "Campos obrigatórios não preenchidos"}
144
 
145
+ if categoria not in TEMPLATES or subcategoria not in TEMPLATES[categoria]:
146
+ return "Categoria ou subcategoria não encontrada", {"erro": "Categoria inválida"}
147
+
148
+ template = TEMPLATES[categoria][subcategoria]["template"]
149
+
150
+ params = {
151
+ "tema": tema,
152
+ "elementos": elementos,
153
+ "público": público_alvo,
154
+ "tom": tom,
155
+ "comprimento": comprimento,
156
+ "gênero": random.choice(["de aventura", "de mistério", "de fantasia", "de ficção científica"]),
157
+ "personagens": random.randint(2, 5),
158
+ "aspectos": "caracterização, desenvolvimento do enredo, temas principais",
159
+ "exemplos": random.randint(3, 5),
160
+ "sistema": tema,
161
+ "problemas": "problemas comuns e casos específicos",
162
+ "dificuldade": random.randint(3, 5),
163
+ "conceito": tema,
164
+ "analogias": "analogias cotidianas"
165
+ }
166
+
167
+ base_prompt = template.format(**params)
168
+ base_prompt += f"\n\nTom desejado: {tom}"
169
+
170
+ if comprimento:
171
+ base_prompt += f"\nComprimento aproximado: {comprimento} palavras"
172
+
173
+ if usar_llm:
174
+ config = PromptConfig(temperatura=temperatura)
175
+ instruction = f"""
176
+ Você é um assistente especializado em criar prompts detalhados em português para LLMs.
177
+ Expanda e melhore o seguinte prompt base, adicionando mais detalhes, exemplos e estrutura:
178
 
179
+ {base_prompt}
180
 
181
+ Considere:
182
+ - Público-alvo: {público_alvo}
183
+ - Elementos específicos: {elementos}
184
+ - Tom desejado: {tom}
185
 
186
+ Crie uma versão mais completa e detalhada deste prompt, mantendo o objetivo original
187
+ mas adicionando mais contexto e especificidade.
188
+ """
189
+ return generator.generate_with_model(instruction, config), {"status": "success"}
190
+
191
+ return base_prompt, {"status": "success"}
192
+ except Exception as e:
193
+ logging.error(f"Erro na geração do prompt: {e}")
194
+ return f"Erro na geração do prompt: {str(e)}", {"erro": str(e)}
195
 
196
  def create_interface():
197
  """Interface aprimorada com mais recursos"""
 
227
  container=False,
228
  )
229
  sugestoes = gr.Dropdown(
230
+ choices=get_suggestions("história", "creative"),
231
  label="💫 Sugestões",
232
  container=False,
233
  )
 
259
  )
260
 
261
  with gr.Column(scale=2):
262
+ comprimento = gr.Slider(
263
+ minimum=100,
264
+ maximum=2000,
265
+ step=100,
266
+ label="📏 Comprimento (palavras)",
267
+ value=500,
268
+ container=False,
269
+ )
270
+ temperatura = gr.Slider(
271
+ minimum=0.1,
272
+ maximum=1.0,
273
+ step=0.1,
274
+ label="🌡️ Temperatura",
275
+ value=0.7,
 
 
 
 
 
 
276
  container=False,
277
  )
278
+
279
+ usar_llm = gr.Checkbox(
280
+ label="🤖 Usar IA para expandir prompt",
281
+ value=True,
282
+ container=False,
283
+ )
284
 
285
  with gr.Row():
286
  gerar_btn = gr.Button(
 
295
  lines=10,
296
  container=False,
297
  )
298
+ status = gr.JSON(
299
+ label="📊 Status",
300
  container=False,
301
  )
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
302
 
303
  def atualizar_interface(categoria, subcategoria):
304
+ try:
305
+ sugestoes_list = get_suggestions(categoria, subcategoria)
306
+ return [
307
+ gr.Dropdown(choices=list(TEMPLATES[categoria].keys())),
308
+ gr.Dropdown(choices=sugestoes_list)
309
+ ]
310
+ except Exception as e:
311
+ logging.error(f"Erro ao atualizar interface: {e}")
312
+ return [gr.Dropdown(), gr.Dropdown()]
 
 
 
 
 
 
 
313
 
314
  categoria.change(
315
  atualizar_interface,
 
323
  categoria, subcategoria, tema, elementos,
324
  público_alvo, tom, comprimento, temperatura, usar_llm
325
  ],
326
+ outputs=[saida, status]
 
 
 
 
 
 
 
 
 
 
 
327
  )
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
328
 
329
  return app
330
 
 
 
331
  if __name__ == "__main__":
332
  app = create_interface()
333
+ app.queue()
334
  app.launch(
 
335
  server_name="0.0.0.0",
336
  server_port=7860
337
  )