HenriqueBraz commited on
Commit
ec4b7be
·
verified ·
1 Parent(s): 2760483

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +54 -191
app.py CHANGED
@@ -1,7 +1,6 @@
1
  import streamlit as st
2
  import streamlit_authenticator as stauth
3
- import yaml
4
- from yaml.loader import SafeLoader
5
  import os
6
  from transformers import pipeline, AutoModelForCausalLM, AutoTokenizer
7
  import torch
@@ -28,55 +27,66 @@ logging.basicConfig(
28
  format='%(asctime)s - %(levelname)s - %(message)s'
29
  )
30
 
31
- # Configurar autenticação
32
- def load_auth_config():
33
- """Carrega configuração de autenticação de variável de ambiente ou arquivo"""
 
 
 
 
 
 
 
 
 
 
 
 
 
 
34
  try:
35
- # Tenta carregar da variável de ambiente (Hugging Face Secrets)
36
- config_yaml = os.getenv('AUTH_CONFIG')
37
- if config_yaml:
38
- config = yaml.load(config_yaml, Loader=SafeLoader)
39
- return config
40
-
41
- # Alternativa: carregar de um arquivo externo
42
- config_path = os.getenv('AUTH_CONFIG_PATH', '~/.streamlit/config.yaml')
43
- config_path = os.path.expanduser(config_path)
44
- if os.path.exists(config_path):
45
- with open(config_path, 'r') as file:
46
- config = yaml.load(file, Loader=SafeLoader)
47
- return config
 
 
 
 
 
 
 
 
 
 
 
 
48
 
49
- # Configuração padrão para testes (remover em produção)
50
- st.warning("⚠️ Nenhuma configuração de autenticação encontrada. Usando credenciais padrão (inseguro).")
51
  config = {
52
- 'credentials': {
53
- 'usernames': {
54
- 'cliente': {
55
- 'name': 'Cliente',
56
- 'password': '$2b$12$6r1z.7zM7kL9vJ8K2Qf3Ce7V8Z9Qz3q0zXzY7W8K9vJ8K2Qf3Ce7' # Senha: senha123
57
- }
58
- }
59
- },
60
- 'cookie': {
61
- 'name': 'ai_app_cookie',
62
- 'key': 'random_key_123',
63
- 'expiry_days': 30
64
- },
65
- 'preauthorized': {
66
- 'emails': []
67
- }
68
  }
69
  return config
70
  except Exception as e:
71
- st.error(f"Erro ao carregar configuração de autenticação: {str(e)}")
72
- logging.error(f"Erro na configuração de autenticação: {e}")
73
  return None
74
 
75
  # Cache para evitar recarregar modelos a cada execução
76
  @st.cache_resource(show_spinner=False)
77
  def load_models():
78
  """Carrega todos os modelos com cache para melhor performance"""
79
- device = torch.device("cpu")
80
  logging.info(f"Usando dispositivo: {device}")
81
  models = {}
82
 
@@ -442,8 +452,11 @@ def handle_use_case_demo(models, use_case_key, use_case):
442
  logging.error(f"Erro na demonstração do caso de uso {use_case_key}: {e}")
443
 
444
  def main():
 
 
 
445
  # Carregar configuração de autenticação
446
- config = load_auth_config()
447
  if not config:
448
  st.error("Falha ao carregar autenticação. Contate o administrador.")
449
  return
@@ -639,154 +652,4 @@ def handle_text_models(models, model_key, model_name):
639
  else:
640
  st.warning("⚠️ Por favor, insira um texto válido.")
641
 
642
- def handle_qa_model(models, model_key):
643
- """Manipula modelo de Q&A"""
644
- col1, col2 = st.columns(2)
645
-
646
- with col1:
647
- context = st.text_area(
648
- "Contexto:",
649
- height=200,
650
- placeholder="Cole o texto que contém a informação...",
651
- key="qa_context"
652
- )
653
-
654
- with col2:
655
- question = st.text_area(
656
- "Pergunta:",
657
- height=150,
658
- placeholder="Faça sua pergunta sobre o contexto...",
659
- key="qa_question"
660
- )
661
-
662
- with st.expander("⚙️ Parâmetros Avançados"):
663
- confidence_threshold = st.slider("Limite de confiança", 0.0, 1.0, 0.5, 0.01)
664
-
665
- if st.button("🚀 Executar Pergunta e Resposta", type="primary", key="btn_qa"):
666
- if context.strip() and question.strip():
667
- with st.spinner("Buscando resposta..."):
668
- try:
669
- result = models[model_key](question=question, context=context)
670
-
671
- if result['score'] < confidence_threshold:
672
- st.warning(f"⚠️ Confiança baixa na resposta ({result['score']:.2%})")
673
-
674
- st.success("🔍 Resposta encontrada:")
675
- st.markdown(f"**Contexto:** {context}")
676
- st.markdown(f"**Pergunta:** {question}")
677
- st.markdown(f"**Resposta:** {result['answer']}")
678
- st.markdown(f"**Confiança:** {result['score']:.2%}")
679
-
680
- except Exception as e:
681
- st.error(f"Erro ao processar Q&A: {str(e)}")
682
- logging.error(f"Erro no modelo Q&A: {e}")
683
- else:
684
- st.warning("⚠️ Por favor, forneça tanto o contexto quanto a pergunta.")
685
-
686
- def handle_image_models(models, model_key, model_name):
687
- """Manipula modelos de imagem"""
688
- uploaded_file = st.file_uploader(
689
- "Carregue uma imagem",
690
- type=["jpg", "png", "jpeg", "bmp"],
691
- help="Formatos suportados: JPG, PNG, JPEG, BMP",
692
- key=f"img_upload_{model_key}"
693
- )
694
-
695
- if uploaded_file is not None:
696
- if not validate_image_file(uploaded_file):
697
- st.error("⚠️ Formato de arquivo inválido ou arquivo corrompido.")
698
- return
699
-
700
- col1, col2 = st.columns(2)
701
-
702
- with col1:
703
- st.subheader("🖼️ Imagem Original")
704
- image = process_image_file(uploaded_file)
705
- if image:
706
- st.image(image)
707
-
708
- with col2:
709
- st.subheader("📊 Resultados")
710
- if st.button(f"🚀 Executar {model_name}", type="primary", key=f"btn_img_{model_key}"):
711
- if image:
712
- with st.spinner("Analisando imagem..."):
713
- try:
714
- result = models[model_key](image)
715
- display_results(result, model_key)
716
-
717
- except Exception as e:
718
- st.error(f"Erro ao processar imagem: {str(e)}")
719
- logging.error(f"Erro no modelo {model_key}: {e}")
720
-
721
- def handle_audio_models(models, model_key):
722
- """Manipula modelos de áudio"""
723
- model_name = "Transcrição de Áudio" if model_key == 'speech_to_text' else "Classificação de Áudio"
724
-
725
- uploaded_file = st.file_uploader(
726
- f"Carregue um arquivo de áudio para {model_name}",
727
- type=["wav", "mp3", "flac", "m4a"],
728
- help="Formatos suportados: WAV, MP3, FLAC, M4A",
729
- key=f"audio_upload_{model_key}"
730
- )
731
-
732
- if uploaded_file is not None:
733
- if not validate_audio_file(uploaded_file):
734
- st.error("⚠️ Formato de arquivo inválido ou não suportado.")
735
- return
736
-
737
- st.audio(uploaded_file, format="audio/wav")
738
-
739
- if st.button(f"🚀 Executar {model_name}", type="primary", key=f"btn_audio_{model_key}"):
740
- with st.spinner("Processando áudio..."):
741
- try:
742
- audio_array = process_audio_file(uploaded_file)
743
-
744
- if audio_array is not None:
745
- result = models[model_key](audio_array)
746
- display_results(result, model_key)
747
- else:
748
- st.error("Não foi possível processar o arquivo de áudio.")
749
-
750
- except Exception as e:
751
- st.error(f"Erro ao processar áudio: {str(e)}")
752
- logging.error(f"Erro no modelo {model_key}: {e}")
753
-
754
- def handle_generative_models(models, model_key):
755
- """Manipula modelos generativos"""
756
- prompt = st.text_area(
757
- "Descrição da imagem:",
758
- height=150,
759
- placeholder="Descreva a imagem que deseja gerar...",
760
- key="text_to_image_prompt"
761
- )
762
-
763
- with st.expander("⚙️ Parâmetros Avançados"):
764
- cols = st.columns(2)
765
- with cols[0]:
766
- width = st.slider("Largura", 256, 1024, 512, 64)
767
- with cols[1]:
768
- height = st.slider("Altura", 256, 1024, 512, 64)
769
- num_images = st.slider("Número de imagens", 1, 4, 1)
770
- guidance_scale = st.slider("Escala de orientação", 1.0, 20.0, 7.5)
771
-
772
- if st.button("🚀 Gerar Imagem", type="primary", key="btn_text_to_image"):
773
- if prompt.strip():
774
- with st.spinner("Criando imagem..."):
775
- try:
776
- result = models[model_key](
777
- prompt,
778
- height=height,
779
- width=width,
780
- num_images_per_prompt=num_images,
781
- guidance_scale=guidance_scale
782
- )
783
- display_results(result, model_key)
784
-
785
- except Exception as e:
786
- st.error(f"Erro ao gerar imagem: {str(e)}")
787
- logging.error(f"Erro no modelo text-to-image: {e}")
788
- else:
789
- st.warning("⚠️ Por favor, insira uma descrição para a imagem.")
790
-
791
- if __name__ == "__main__":
792
- main()
 
1
  import streamlit as st
2
  import streamlit_authenticator as stauth
3
+ import sqlite3
 
4
  import os
5
  from transformers import pipeline, AutoModelForCausalLM, AutoTokenizer
6
  import torch
 
27
  format='%(asctime)s - %(levelname)s - %(message)s'
28
  )
29
 
30
+ # Configurar banco de dados SQLite
31
+ def init_db():
32
+ """Inicializa o banco de dados SQLite com tabela de usuários"""
33
+ db_path = os.getenv('DB_PATH', 'users.db')
34
+ conn = sqlite3.connect(db_path)
35
+ cursor = conn.cursor()
36
+
37
+ # Criar tabela de usuários se não existir
38
+ cursor.execute('''
39
+ CREATE TABLE IF NOT EXISTS users (
40
+ username TEXT PRIMARY KEY,
41
+ name TEXT NOT NULL,
42
+ password TEXT NOT NULL
43
+ )
44
+ ''')
45
+
46
+ # Adicionar usuários de exemplo (remover ou personalizar em produção)
47
  try:
48
+ hashed_password = stauth.Hasher(['senha123']).generate()[0]
49
+ cursor.execute('''
50
+ INSERT OR IGNORE INTO users (username, name, password)
51
+ VALUES (?, ?, ?)
52
+ ''', ('cliente', 'Cliente', hashed_password))
53
+ cursor.execute('''
54
+ INSERT OR IGNORE INTO users (username, name, password)
55
+ VALUES (?, ?, ?)
56
+ ''', ('empresa1', 'Empresa Um', hashed_password))
57
+ conn.commit()
58
+ except Exception as e:
59
+ logging.error(f"Erro ao inicializar banco de dados: {e}")
60
+ st.error(f"Erro ao inicializar banco de dados: {str(e)}")
61
+
62
+ conn.close()
63
+
64
+ def load_users_from_db():
65
+ """Carrega usuários do banco de dados SQLite"""
66
+ try:
67
+ db_path = os.getenv('DB_PATH', 'users.db')
68
+ conn = sqlite3.connect(db_path)
69
+ cursor = conn.cursor()
70
+ cursor.execute("SELECT username, name, password FROM users")
71
+ users = {row[0]: {'name': row[1], 'password': row[2]} for row in cursor.fetchall()}
72
+ conn.close()
73
 
 
 
74
  config = {
75
+ 'credentials': {'usernames': users},
76
+ 'cookie': {'name': 'ai_app_cookie', 'key': 'random_key_123', 'expiry_days': 30},
77
+ 'preauthorized': {'emails': []}
 
 
 
 
 
 
 
 
 
 
 
 
 
78
  }
79
  return config
80
  except Exception as e:
81
+ st.error(f"Erro ao carregar usuários do banco de dados: {str(e)}")
82
+ logging.error(f"Erro ao carregar usuários: {e}")
83
  return None
84
 
85
  # Cache para evitar recarregar modelos a cada execução
86
  @st.cache_resource(show_spinner=False)
87
  def load_models():
88
  """Carrega todos os modelos com cache para melhor performance"""
89
+ device = torch.device("cpu") # Use 'cuda' se GPU estiver disponível
90
  logging.info(f"Usando dispositivo: {device}")
91
  models = {}
92
 
 
452
  logging.error(f"Erro na demonstração do caso de uso {use_case_key}: {e}")
453
 
454
  def main():
455
+ # Inicializar banco de dados
456
+ init_db()
457
+
458
  # Carregar configuração de autenticação
459
+ config = load_users_from_db()
460
  if not config:
461
  st.error("Falha ao carregar autenticação. Contate o administrador.")
462
  return
 
652
  else:
653
  st.warning("⚠️ Por favor, insira um texto válido.")
654
 
655
+ def handle