Spaces:
Sleeping
Sleeping
Update app.py
Browse files
app.py
CHANGED
@@ -124,7 +124,8 @@ def load_models():
|
|
124 |
)
|
125 |
|
126 |
# Modelos generativos
|
127 |
-
models['text_to_image'] = StableDiffusionPipeline.from_pretrained(
|
|
|
128 |
torch_dtype=torch.float16,
|
129 |
use_safetensors=True,
|
130 |
safety_checker=None,
|
@@ -159,12 +160,10 @@ def validate_image_file(file: UploadedFile) -> bool:
|
|
159 |
def process_audio_file(audio_file):
|
160 |
"""Processa arquivo de áudio para o formato correto"""
|
161 |
try:
|
162 |
-
# Criar arquivo temporário para processamento
|
163 |
with tempfile.NamedTemporaryFile(delete=False, suffix=os.path.splitext(audio_file.name)[1]) as tmp_file:
|
164 |
tmp_file.write(audio_file.read())
|
165 |
tmp_file_path = tmp_file.name
|
166 |
|
167 |
-
# Carregar áudio com librosa
|
168 |
audio_array, sample_rate = librosa.load(tmp_file_path, sr=16000)
|
169 |
os.unlink(tmp_file_path)
|
170 |
|
@@ -244,6 +243,151 @@ def display_results(result, model_key):
|
|
244 |
st.subheader("🎨 Imagem Gerada")
|
245 |
st.image(result[0], caption="Imagem gerada a partir do texto")
|
246 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
247 |
def main():
|
248 |
st.title("🤖 Aplicação de IA Multi-Modal Avançada")
|
249 |
st.markdown("---")
|
@@ -256,94 +400,121 @@ def main():
|
|
256 |
st.error("Falha crítica ao carregar os modelos. Verifique os logs para mais detalhes.")
|
257 |
return
|
258 |
|
259 |
-
#
|
260 |
-
st.
|
261 |
-
|
262 |
-
|
263 |
-
|
264 |
-
|
265 |
-
|
266 |
-
|
267 |
-
|
268 |
-
|
269 |
-
|
270 |
-
|
271 |
-
|
272 |
-
|
273 |
-
|
274 |
-
|
275 |
-
|
276 |
-
|
277 |
-
|
278 |
-
|
279 |
-
|
280 |
-
|
281 |
-
|
282 |
-
|
283 |
-
|
284 |
-
|
285 |
-
|
286 |
-
|
287 |
-
|
288 |
-
list(model_categories.keys()),
|
289 |
-
index=0
|
290 |
-
)
|
291 |
-
|
292 |
-
selected_model = st.sidebar.selectbox(
|
293 |
-
"Modelo",
|
294 |
-
[name for name, key in model_categories[selected_category]],
|
295 |
-
format_func=lambda x: x,
|
296 |
-
index=0
|
297 |
-
)
|
298 |
-
|
299 |
-
# Obter chave do modelo selecionado
|
300 |
-
model_key = next(key for name, key in model_categories[selected_category] if name == selected_model)
|
301 |
-
|
302 |
-
# Interface principal
|
303 |
-
st.header(f"{selected_model}")
|
304 |
-
|
305 |
-
# Accordion para informações do modelo
|
306 |
-
with st.expander("ℹ️ Sobre este modelo"):
|
307 |
-
model_info = {
|
308 |
-
'sentiment_analysis': "Analisa o sentimento expresso em um texto (positivo/negativo/neutro)",
|
309 |
-
'text_classification': "Classifica textos em categorias pré-definidas",
|
310 |
-
'summarization': "Gera um resumo conciso de um texto longo",
|
311 |
-
'question_answering': "Responde perguntas baseadas em um contexto fornecido",
|
312 |
-
'translation': "Traduz texto de inglês para português",
|
313 |
-
'ner': "Identifica e classifica entidades nomeadas (pessoas, lugares, organizações)",
|
314 |
-
'text_generation': "Gera texto criativo continuando a partir de um prompt",
|
315 |
-
'image_classification': "Identifica objetos e cenas em imagens",
|
316 |
-
'object_detection': "Detecta e localiza múltiplos objetos em uma imagem",
|
317 |
-
'image_segmentation': "Segmenta diferentes elementos em uma imagem",
|
318 |
-
'facial_recognition': "Reconhece características faciais e emoções",
|
319 |
-
'speech_to_text': "Transcreve fala em texto",
|
320 |
-
'audio_classification': "Classifica emoções em arquivos de áudio",
|
321 |
-
'text_to_image': "Gera imagens a partir de descrições textuais"
|
322 |
}
|
323 |
-
st.info(model_info.get(model_key, "Informações detalhadas sobre este modelo."))
|
324 |
-
|
325 |
-
# Processamento baseado no tipo de modelo
|
326 |
-
try:
|
327 |
-
if model_key in ['sentiment_analysis', 'text_classification', 'summarization',
|
328 |
-
'translation', 'text_generation', 'ner']:
|
329 |
-
handle_text_models(models, model_key, selected_model)
|
330 |
|
331 |
-
|
332 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
333 |
|
334 |
-
|
335 |
-
|
336 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
337 |
|
338 |
-
|
339 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
340 |
|
341 |
-
|
342 |
-
|
|
|
343 |
|
344 |
-
|
345 |
-
st.
|
346 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
347 |
|
348 |
def handle_text_models(models, model_key, model_name):
|
349 |
"""Manipula modelos de texto"""
|
@@ -373,7 +544,7 @@ def handle_text_models(models, model_key, model_name):
|
|
373 |
try:
|
374 |
if model_key == 'ner':
|
375 |
result = models[model_key](input_text)
|
376 |
-
elif model_key== 'text_generation':
|
377 |
result = models[model_key](
|
378 |
input_text,
|
379 |
max_new_tokens=advanced_params.get('max_length', 100),
|
|
|
124 |
)
|
125 |
|
126 |
# Modelos generativos
|
127 |
+
models['text_to_image'] = StableDiffusionPipeline.from_pretrained(
|
128 |
+
"runwayml/stable-diffusion-v1-5",
|
129 |
torch_dtype=torch.float16,
|
130 |
use_safetensors=True,
|
131 |
safety_checker=None,
|
|
|
160 |
def process_audio_file(audio_file):
|
161 |
"""Processa arquivo de áudio para o formato correto"""
|
162 |
try:
|
|
|
163 |
with tempfile.NamedTemporaryFile(delete=False, suffix=os.path.splitext(audio_file.name)[1]) as tmp_file:
|
164 |
tmp_file.write(audio_file.read())
|
165 |
tmp_file_path = tmp_file.name
|
166 |
|
|
|
167 |
audio_array, sample_rate = librosa.load(tmp_file_path, sr=16000)
|
168 |
os.unlink(tmp_file_path)
|
169 |
|
|
|
243 |
st.subheader("🎨 Imagem Gerada")
|
244 |
st.image(result[0], caption="Imagem gerada a partir do texto")
|
245 |
|
246 |
+
def get_use_cases():
|
247 |
+
"""Retorna os casos de uso para cada modelo"""
|
248 |
+
return {
|
249 |
+
'sentiment_analysis': {
|
250 |
+
'title': "Análise de Sentimento",
|
251 |
+
'description': "Analisa o sentimento (positivo, negativo, neutro) em comentários, avaliações ou postagens de clientes em redes sociais.",
|
252 |
+
'example': "Uma empresa de varejo monitora menções da marca no Twitter/X, identificando feedback negativo para responder proativamente ou destacando comentários positivos em campanhas de marketing.",
|
253 |
+
'benefit': "Melhoria na gestão de reputação online e resposta rápida a crises de imagem.",
|
254 |
+
'demo_input': "A entrega foi super rápida, adorei!",
|
255 |
+
'demo_type': 'text'
|
256 |
+
},
|
257 |
+
'text_classification': {
|
258 |
+
'title': "Classificação de Texto",
|
259 |
+
'description': "Classifica e-mails recebidos como positivos ou negativos para priorizar respostas ou identificar reclamações.",
|
260 |
+
'example': "Um call center categoriza e-mails de clientes, direcionando mensagens negativas para equipes de suporte prioritário.",
|
261 |
+
'benefit': "Otimização do tempo da equipe de atendimento e melhoria na experiência do cliente.",
|
262 |
+
'demo_input': "Estou insatisfeito com o produto",
|
263 |
+
'demo_type': 'text'
|
264 |
+
},
|
265 |
+
'summarization': {
|
266 |
+
'title': "Resumo de Texto",
|
267 |
+
'description': "Gera resumos concisos de documentos longos, como relatórios financeiros ou atas de reuniões.",
|
268 |
+
'example': "Uma consultoria financeira resume relatórios anuais de empresas em poucos parágrafos para facilitar a análise de investidores.",
|
269 |
+
'benefit': "Economia de tempo na leitura de documentos extensos e tomada de decisão mais rápida.",
|
270 |
+
'demo_input': "A empresa XYZ reportou um crescimento de 15% no último trimestre, impulsionado por novas parcerias estratégicas e expansão no mercado asiático. No entanto, desafios logísticos aumentaram os custos operacionais em 5%. A diretoria planeja investir em automação para mitigar esses custos no próximo ano.",
|
271 |
+
'demo_type': 'text'
|
272 |
+
},
|
273 |
+
'question_answering': {
|
274 |
+
'title': "Perguntas e Respostas",
|
275 |
+
'description': "Responde perguntas específicas com base em manuais, FAQs ou documentos internos.",
|
276 |
+
'example': "Um chatbot de suporte técnico responde perguntas como 'Como configurar o produto X?' extraindo respostas diretamente do manual do produto.",
|
277 |
+
'benefit': "Redução do tempo de suporte e maior autonomia para os usuários finais.",
|
278 |
+
'demo_input': {
|
279 |
+
'context': "O produto X tem garantia de 2 anos e pode ser configurado via aplicativo móvel em 5 minutos.",
|
280 |
+
'question': "Qual é o tempo de garantia do produto X?"
|
281 |
+
},
|
282 |
+
'demo_type': 'qa'
|
283 |
+
},
|
284 |
+
'translation': {
|
285 |
+
'title': "Tradução (EN→PT)",
|
286 |
+
'description': "Traduz conteúdo de marketing, manuais ou comunicações de inglês para português.",
|
287 |
+
'example': "Uma empresa de software traduz descrições de produtos para lançar no mercado brasileiro.",
|
288 |
+
'benefit': "Expansão de mercado com conteúdo adaptado e redução de custos com tradutores humanos.",
|
289 |
+
'demo_input': "Our product ensures high performance",
|
290 |
+
'demo_type': 'text'
|
291 |
+
},
|
292 |
+
'ner': {
|
293 |
+
'title': "Reconhecimento de Entidades",
|
294 |
+
'description': "Identifica entidades como nomes de pessoas, organizações e locais em contratos ou documentos legais.",
|
295 |
+
'example': "Um escritório de advocacia extrai automaticamente nomes de partes envolvidas em contratos, agilizando revisões.",
|
296 |
+
'benefit': "Redução de erros manuais e maior eficiência na análise de documentos.",
|
297 |
+
'demo_input': "Microsoft assinou um contrato com a empresa XYZ em Nova York.",
|
298 |
+
'demo_type': 'text'
|
299 |
+
},
|
300 |
+
'text_generation': {
|
301 |
+
'title': "Geração de Texto",
|
302 |
+
'description': "Gera textos criativos para campanhas de marketing, postagens em redes sociais ou roteiros.",
|
303 |
+
'example': "Uma agência de publicidade cria slogans ou descrições de produtos a partir de prompts iniciais.",
|
304 |
+
'benefit': "Aceleração do processo criativo e geração de ideias inovadoras.",
|
305 |
+
'demo_input': "Um futuro onde a tecnologia conecta todos",
|
306 |
+
'demo_type': 'text'
|
307 |
+
},
|
308 |
+
'image_classification': {
|
309 |
+
'title': "Classificação de Imagem",
|
310 |
+
'description': "Identifica defeitos ou classifica produtos em linhas de produção com base em imagens.",
|
311 |
+
'example': "Uma fábrica de eletrônicos classifica imagens de circuitos como 'Defeituoso' ou 'Aprovado' para controle de qualidade.",
|
312 |
+
'benefit': "Redução de erros humanos e aumento da eficiência na inspeção.",
|
313 |
+
'demo_input': None, # Imagens não podem ser pré-carregadas diretamente no código
|
314 |
+
'demo_type': 'image'
|
315 |
+
},
|
316 |
+
'object_detection': {
|
317 |
+
'title': "Detecção de Objetos",
|
318 |
+
'description': "Detecta objetos como pessoas, veículos ou itens em imagens de câmeras de segurança.",
|
319 |
+
'example': "Um sistema de segurança identifica veículos em um estacionamento para monitoramento automático.",
|
320 |
+
'benefit': "Maior segurança e automação de processos de monitoramento.",
|
321 |
+
'demo_input': None,
|
322 |
+
'demo_type': 'image'
|
323 |
+
},
|
324 |
+
'image_segmentation': {
|
325 |
+
'title': "Segmentação de Imagem",
|
326 |
+
'description': "Segmenta diferentes partes de uma imagem, como órgãos em exames médicos.",
|
327 |
+
'example': "Um hospital segmenta tumores em imagens de ressonância magnética, facilitando diagnósticos.",
|
328 |
+
'benefit': "Apoio a diagnósticos médicos com maior precisão e rapidez.",
|
329 |
+
'demo_input': None,
|
330 |
+
'demo_type': 'image'
|
331 |
+
},
|
332 |
+
'facial_recognition': {
|
333 |
+
'title': "Reconhecimento Facial",
|
334 |
+
'description': "Identifica emoções faciais em vídeos ou fotos de clientes em lojas ou eventos.",
|
335 |
+
'example': "Uma loja de varejo analisa expressões faciais de clientes para avaliar a satisfação durante interações com produtos.",
|
336 |
+
'benefit': "Melhoria na experiência do cliente com base em dados emocionais.",
|
337 |
+
'demo_input': None,
|
338 |
+
'demo_type': 'image'
|
339 |
+
},
|
340 |
+
'speech_to_text': {
|
341 |
+
'title': "Transcrição de Áudio",
|
342 |
+
'description': "Converte gravações de reuniões ou entrevistas em texto para documentação.",
|
343 |
+
'example': "Uma empresa transcreve automaticamente reuniões para criar atas ou resumos.",
|
344 |
+
'benefit': "Economia de tempo na documentação e maior acessibilidade de conteúdo.",
|
345 |
+
'demo_input': None,
|
346 |
+
'demo_type': 'audio'
|
347 |
+
},
|
348 |
+
'audio_classification': {
|
349 |
+
'title': "Classificação de Áudio",
|
350 |
+
'description': "Classifica emoções em chamadas de suporte para avaliar a qualidade do atendimento.",
|
351 |
+
'example': "Um call center analisa chamadas para identificar emoções como 'Frustração' ou 'Satisfação' dos clientes.",
|
352 |
+
'benefit': "Melhoria na formação de equipes e na experiência do cliente.",
|
353 |
+
'demo_input': None,
|
354 |
+
'demo_type': 'audio'
|
355 |
+
},
|
356 |
+
'text_to_image': {
|
357 |
+
'title': "Texto para Imagem",
|
358 |
+
'description': "Gera imagens personalizadas a partir de descrições textuais para campanhas publicitárias ou design de produtos.",
|
359 |
+
'example': "Uma agência de design cria mockups de produtos com base em prompts como 'Um smartphone futurista em um fundo azul neon'.",
|
360 |
+
'benefit': "Redução de custos com designers gráficos e maior agilidade na criação de conteúdo visual.",
|
361 |
+
'demo_input': "Uma paisagem tropical ao pôr do sol",
|
362 |
+
'demo_type': 'text'
|
363 |
+
}
|
364 |
+
}
|
365 |
+
|
366 |
+
def handle_use_case_demo(models, use_case_key, use_case):
|
367 |
+
"""Executa a demonstração de um caso de uso com entrada pré-definida"""
|
368 |
+
if use_case['demo_input'] is None:
|
369 |
+
st.warning("⚠️ Demonstração não disponível. Este modelo requer upload de imagem ou áudio.")
|
370 |
+
return
|
371 |
+
|
372 |
+
st.subheader("📊 Demonstração")
|
373 |
+
try:
|
374 |
+
if use_case['demo_type'] == 'text':
|
375 |
+
with st.spinner("Processando demonstração..."):
|
376 |
+
result = models[use_case_key](use_case['demo_input'])
|
377 |
+
display_results(result, use_case_key)
|
378 |
+
elif use_case['demo_type'] == 'qa':
|
379 |
+
with st.spinner("Processando demonstração..."):
|
380 |
+
result = models[use_case_key](
|
381 |
+
question=use_case['demo_input']['question'],
|
382 |
+
context=use_case['demo_input']['context']
|
383 |
+
)
|
384 |
+
st.success("🔍 Resposta encontrada:")
|
385 |
+
st.markdown(f"**Resposta:** {result['answer']}")
|
386 |
+
st.markdown(f"**Confiança:** {result['score']:.2%}")
|
387 |
+
except Exception as e:
|
388 |
+
st.error(f"Erro ao executar demonstração: {str(e)}")
|
389 |
+
logging.error(f"Erro na demonstração do caso de uso {use_case_key}: {e}")
|
390 |
+
|
391 |
def main():
|
392 |
st.title("🤖 Aplicação de IA Multi-Modal Avançada")
|
393 |
st.markdown("---")
|
|
|
400 |
st.error("Falha crítica ao carregar os modelos. Verifique os logs para mais detalhes.")
|
401 |
return
|
402 |
|
403 |
+
# Abas para navegação
|
404 |
+
tab1, tab2 = st.tabs(["Explorar Modelos", "Casos de Uso"])
|
405 |
+
|
406 |
+
with tab1:
|
407 |
+
# Sidebar para seleção de modelo
|
408 |
+
st.sidebar.title("⚙️ Configurações")
|
409 |
+
model_categories = {
|
410 |
+
"📝 Processamento de Texto": [
|
411 |
+
("Análise de Sentimento", "sentiment_analysis"),
|
412 |
+
("Classificação de Texto", "text_classification"),
|
413 |
+
("Resumo de Texto", "summarization"),
|
414 |
+
("Perguntas e Respostas", "question_answering"),
|
415 |
+
("Tradução (EN→PT)", "translation"),
|
416 |
+
("Reconhecimento de Entidades", "ner"),
|
417 |
+
("Geração de Texto", "text_generation")
|
418 |
+
],
|
419 |
+
"🖼️ Processamento de Imagem": [
|
420 |
+
("Classificação de Imagem", "image_classification"),
|
421 |
+
("Detecção de Objetos", "object_detection"),
|
422 |
+
("Segmentação de Imagem", "image_segmentation"),
|
423 |
+
("Reconhecimento Facial", "facial_recognition")
|
424 |
+
],
|
425 |
+
"🎵 Processamento de Áudio": [
|
426 |
+
("Transcrição de Áudio", "speech_to_text"),
|
427 |
+
("Classificação de Emoções", "audio_classification")
|
428 |
+
],
|
429 |
+
"✨ Modelos Generativos": [
|
430 |
+
("Texto para Imagem", "text_to_image")
|
431 |
+
]
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
432 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
433 |
|
434 |
+
selected_category = st.sidebar.selectbox(
|
435 |
+
"Categoria",
|
436 |
+
list(model_categories.keys()),
|
437 |
+
index=0
|
438 |
+
)
|
439 |
+
|
440 |
+
selected_model = st.sidebar.selectbox(
|
441 |
+
"Modelo",
|
442 |
+
[name for name, key in model_categories[selected_category]],
|
443 |
+
format_func=lambda x: x,
|
444 |
+
index=0
|
445 |
+
)
|
446 |
+
|
447 |
+
# Obter chave do modelo selecionado
|
448 |
+
model_key = next(key for name, key in model_categories[selected_category] if name == selected_model)
|
449 |
+
|
450 |
+
# Interface principal
|
451 |
+
st.header(f"{selected_model}")
|
452 |
|
453 |
+
# Accordion para informações do modelo
|
454 |
+
with st.expander("ℹ️ Sobre este modelo"):
|
455 |
+
model_info = {
|
456 |
+
'sentiment_analysis': "Analisa o sentimento expresso em um texto (positivo/negativo/neutro).",
|
457 |
+
'text_classification': "Classifica textos em categorias pré-definidas.",
|
458 |
+
'summarization': "Gera um resumo conciso de um texto longo.",
|
459 |
+
'question_answering': "Responde perguntas baseadas em um contexto fornecido.",
|
460 |
+
'translation': "Traduz texto de inglês para português.",
|
461 |
+
'ner': "Identifica e classifica entidades nomeadas (pessoas, lugares, organizações).",
|
462 |
+
'text_generation': "Gera texto criativo continuando a partir de um prompt.",
|
463 |
+
'image_classification': "Identifica objetos e cenas em imagens.",
|
464 |
+
'object_detection': "Detecta e localiza múltiplos objetos em uma imagem.",
|
465 |
+
'image_segmentation': "Segmenta diferentes elementos em uma imagem.",
|
466 |
+
'facial_recognition': "Reconhece características faciais e emoções.",
|
467 |
+
'speech_to_text': "Transcreve fala em texto.",
|
468 |
+
'audio_classification': "Classifica emoções em arquivos de áudio.",
|
469 |
+
'text_to_image': "Gera imagens a partir de descrições textuais."
|
470 |
+
}
|
471 |
+
st.info(model_info.get(model_key, "Informações detalhadas sobre este modelo."))
|
472 |
|
473 |
+
# Processamento baseado no tipo de modelo
|
474 |
+
try:
|
475 |
+
if model_key in ['sentiment_analysis', 'text_classification', 'summarization',
|
476 |
+
'translation', 'text_generation', 'ner']:
|
477 |
+
handle_text_models(models, model_key, selected_model)
|
478 |
+
|
479 |
+
elif model_key == 'question_answering':
|
480 |
+
handle_qa_model(models, model_key)
|
481 |
+
|
482 |
+
elif model_key in ['image_classification', 'object_detection',
|
483 |
+
'image_segmentation', 'facial_recognition']:
|
484 |
+
handle_image_models(models, model_key, selected_model)
|
485 |
+
|
486 |
+
elif model_key in ['speech_to_text', 'audio_classification']:
|
487 |
+
handle_audio_models(models, model_key)
|
488 |
+
|
489 |
+
elif model_key == 'text_to_image':
|
490 |
+
handle_generative_models(models, model_key)
|
491 |
|
492 |
+
except Exception as e:
|
493 |
+
st.error(f"Erro inesperado durante a execução: {str(e)}")
|
494 |
+
logging.exception("Erro durante a execução do modelo")
|
495 |
|
496 |
+
with tab2:
|
497 |
+
st.header("Casos de Uso")
|
498 |
+
st.markdown("Explore casos práticos de aplicação dos modelos para resolver problemas reais.")
|
499 |
+
|
500 |
+
use_cases = get_use_cases()
|
501 |
+
selected_use_case = st.selectbox(
|
502 |
+
"Selecione um caso de uso",
|
503 |
+
list(use_cases.keys()),
|
504 |
+
format_func=lambda x: use_cases[x]['title']
|
505 |
+
)
|
506 |
+
|
507 |
+
use_case = use_cases[selected_use_case]
|
508 |
+
|
509 |
+
st.subheader(use_case['title'])
|
510 |
+
with st.expander("ℹ️ Detalhes do Caso de Uso"):
|
511 |
+
st.markdown(f"**Descrição**: {use_case['description']}")
|
512 |
+
st.markdown(f"**Exemplo Prático**: {use_case['example']}")
|
513 |
+
st.markdown(f"**Benefício**: {use_case['benefit']}")
|
514 |
+
|
515 |
+
if use_case['demo_input'] is not None:
|
516 |
+
if st.button("🚀 Executar Demonstração", key=f"demo_{selected_use_case}"):
|
517 |
+
handle_use_case_demo(models, selected_use_case, use_case)
|
518 |
|
519 |
def handle_text_models(models, model_key, model_name):
|
520 |
"""Manipula modelos de texto"""
|
|
|
544 |
try:
|
545 |
if model_key == 'ner':
|
546 |
result = models[model_key](input_text)
|
547 |
+
elif model_key == 'text_generation':
|
548 |
result = models[model_key](
|
549 |
input_text,
|
550 |
max_new_tokens=advanced_params.get('max_length', 100),
|