File size: 6,731 Bytes
8cf0e23
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
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="🚨")