from typing import Generator import streamlit as st from groq import Groq st.title("ChatBot UBS Flamengo") def clear_all_session_state(): """ Clears all keys from the `st.session_state` dictionary. This function iterates over all the keys in the `st.session_state` dictionary and deletes each key from the dictionary. This is useful when you want to reset the session state and start fresh. Parameters: None Returns: None """ for key in list(st.session_state.keys()): del st.session_state[key] if st.sidebar.button('Limpar Estado da Sessão', type = "primary"): clear_all_session_state() st.experimental_rerun() col1, col2 =st.columns(2) with col1: st.write('') with col2: st.markdown("### 📚 - Documentos, pesquisas e temas gerais!") # Configuração do cliente Groq client = Groq( api_key=st.secrets["GROQ_API_KEY"], ) # Inicialização do histórico de chat e modelo selecionado if "messages" not in st.session_state: st.session_state.messages = [] if "selected_model" not in st.session_state: st.session_state.selected_model = None # Definição dos modelos disponíveis modelos = { "gemma-7b-it": {"name": "Gemma-7b-it", "tokens": 8192, "developer": "Google"}, "llama2-70b-4096": {"name": "llamA2-70b-chat", "tokens": 4096, "developer": "Meta"}, "llama3-70b-8192": {"name": "LLaMA3-70b-8192", "tokens": 8192, "developer": "Meta"}, "llama3-8b-8192": {"name": "LLaMA3-8b-8192", "tokens": 8192, "developer": "Meta"}, "mixtral-8x7b-32768": {"name": "Mixtral-8x7b-Instruct-v0.1", "tokens": 32768, "developer": "Mistral"}, } # Layout para seleção do modelo e controle deslizante de max_tokens col1, col2 = st.columns(2) with col1: opcao_modelo = st.selectbox( "Escolha um modelo:", options=list(modelos.keys()), format_func=lambda x: modelos[x]["name"], index=2 # Padrão para llama 70b ) prompt_model = """ Você é um assistente virtual especializado, atuando em uma Unidade Básica de Saúde (UBS) que se chama UBS Flamengo em Contagem - Minas Gerais - Brasil. Sua função principal é auxiliar profissionais de saúde e administrativos em diversas tarefas, sempre se comunicando em português brasileiro formal. Comportamento e Comunicação Inicie cada interação perguntando o nome do usuário e use-o respeitosamente durante toda a conversa. Mantenha um tom profissional, cortês e empático em todas as interações. Adapte seu nível de linguagem ao do usuário, mantendo-se sempre claro e compreensível. Evite usar termos técnicos excessivos, a menos que solicitado ou apropriado ao contexto. Principais Responsabilidades Auxiliar na elaboração de relatórios médicos e administrativos. Interpretar e explicar notas técnicas e diretrizes de saúde. Sumarizar textos complexos relacionados à saúde pública. Oferecer insights e análises quando solicitado, baseando-se em informações atualizadas e confiáveis. Responder a perguntas sobre procedimentos padrão na UBS. Limitações e Ética Nunca forneça diagnósticos médicos ou substitua o aconselhamento de profissionais de saúde. Mantenha estrita confidencialidade e não solicite ou discuta informações pessoais de pacientes. Se não tiver conhecimento sobre um tópico específico, admita honestamente e sugira que o usuário consulte um profissional qualificado. Em situações de emergência, oriente o usuário a buscar ajuda médica imediata. Formato de Respostas Forneça respostas completas e estruturadas, usando marcadores ou numeração quando apropriado. Para tópicos complexos, ofereça uma visão geral concisa seguida por detalhes, se necessário. Use analogias ou exemplos práticos para explicar conceitos difíceis, quando relevante. Conhecimento e Atualizações Mantenha-se atualizado sobre as políticas de saúde pública brasileiras e procedimentos padrão em UBS. Esteja preparado para discutir tópicos atuais relacionados à saúde pública no Brasil. Quando citar informações, mencione a necessidade de verificar fontes oficiais para obter os dados mais recentes. """ # Detectar mudança de modelo e limpar histórico de chat se o modelo mudou if st.session_state.selected_model != opcao_modelo: st.session_state.messages = [{"role": "system", "content": prompt_model}] st.session_state.selected_model = opcao_modelo intervalo_max_tokens = modelos[opcao_modelo]["tokens"] with col2: max_tokens = st.slider( "Máximo de Tokens:", min_value=512, max_value=intervalo_max_tokens, value=min(32768, intervalo_max_tokens), step=512, help=f"Ajuste o número máximo de tokens (palavras) para a resposta do modelo. Máximo para o modelo selecionado: {intervalo_max_tokens}" ) # Exibir mensagens do chat do histórico for message in st.session_state.messages: if message["role"] != "system": avatar = '🤖' if message["role"] == "assistant" else '👤' with st.chat_message(message["role"], avatar=avatar): st.markdown(message["content"]) def generate_chat_responses(chat_complete) -> Generator[str, None, None]: """Gera conteúdo de resposta do chat a partir da resposta da API Groq.""" for chunk in chat_complete: if chunk.choices[0].delta.content: yield chunk.choices[0].delta.content if prompt := st.chat_input("Digite seu prompt aqui..."): st.session_state.messages.append({"role": "user", "content": prompt}) with st.chat_message("user", avatar='👤'): st.markdown(prompt) # Buscar resposta da API Groq try: chat_complete = client.chat.completions.create( model=opcao_modelo, messages=st.session_state.messages, max_tokens=max_tokens, stream=True ) # Usar a função geradora com st.write_stream with st.chat_message("assistant", avatar="🤖"): response_placeholder = st.empty() full_response = "" for chunk in generate_chat_responses(chat_complete): full_response += chunk response_placeholder.markdown(full_response + "▌") response_placeholder.markdown(full_response) # Adicionar a resposta completa ao st.session_state.messages st.session_state.messages.append({"role": "assistant", "content": full_response}) except Exception as e: st.error(f"Ocorreu um erro: {e}", icon="🚨")