Spaces:
Running
Running
Update app.py
Browse files
app.py
CHANGED
@@ -1,166 +1,166 @@
|
|
1 |
-
import streamlit as st
|
2 |
-
from llms import LLM
|
3 |
-
|
4 |
-
st.set_page_config(page_title="Multi-LLM", layout="wide", page_icon=":robot_face:", initial_sidebar_state="expanded")
|
5 |
-
st.title("Multi-LLM 🤖")
|
6 |
-
|
7 |
-
st.sidebar.title("Escolha um provedor de LLM")
|
8 |
-
provider = st.sidebar.selectbox("Provedor", ["OpenAI", "Groq"], key="provider_selectbox")
|
9 |
-
|
10 |
-
# Inicializa o estado da sessão se não existir
|
11 |
-
if 'provider' not in st.session_state:
|
12 |
-
st.session_state.provider = provider
|
13 |
-
st.session_state.model = None
|
14 |
-
|
15 |
-
# Inicializa as chaves API para cada provedor se não existirem
|
16 |
-
if 'api_keys' not in st.session_state:
|
17 |
-
st.session_state.api_keys = {
|
18 |
-
"OpenAI": "",
|
19 |
-
"Groq": ""
|
20 |
-
}
|
21 |
-
|
22 |
-
# Campo para API key específica do provedor selecionado
|
23 |
-
api_key = st.sidebar.text_input(
|
24 |
-
f"Insira sua chave API para {provider}:",
|
25 |
-
type="password",
|
26 |
-
value=st.session_state.api_keys[provider]
|
27 |
-
)
|
28 |
-
|
29 |
-
# Armazena a chave API do provedor atual
|
30 |
-
if api_key:
|
31 |
-
st.session_state.api_keys[provider] = api_key
|
32 |
-
|
33 |
-
# Verifica se houve mudança de provedor
|
34 |
-
if st.session_state.provider != provider:
|
35 |
-
st.session_state.provider = provider
|
36 |
-
st.session_state.model = None
|
37 |
-
st.rerun()
|
38 |
-
|
39 |
-
# Adiciona botão para limpar sessão no sidebar
|
40 |
-
if st.sidebar.button("Novo Chat"):
|
41 |
-
# Guarda temporariamente as chaves API e a mensagem do sistema
|
42 |
-
api_keys_temp = st.session_state.api_keys
|
43 |
-
mensagem_sistema_temp = st.session_state.mensagem_sistema
|
44 |
-
provider_temp = st.session_state.provider
|
45 |
-
|
46 |
-
# Limpa todo o estado da sessão
|
47 |
-
for key in list(st.session_state.keys()):
|
48 |
-
del st.session_state[key]
|
49 |
-
|
50 |
-
# Restaura as chaves API e a mensagem do sistema
|
51 |
-
st.session_state.api_keys = api_keys_temp
|
52 |
-
st.session_state.mensagem_sistema = mensagem_sistema_temp
|
53 |
-
st.session_state.provider = provider_temp
|
54 |
-
|
55 |
-
# Força o recarregamento da página
|
56 |
-
st.rerun()
|
57 |
-
|
58 |
-
# Só mostra o select de modelos se tiver API key para o provedor atual
|
59 |
-
if st.session_state.api_keys[provider]:
|
60 |
-
# Define os modelos disponíveis para cada provedor
|
61 |
-
models = {
|
62 |
-
"OpenAI": ["gpt-4", "gpt-4o-mini", "gpt-3.5-turbo"],
|
63 |
-
"Groq": [
|
64 |
-
"llama3-groq-70b-8192-tool-use-preview",
|
65 |
-
"llama-3.1-70b-versatile",
|
66 |
-
"
|
67 |
-
]
|
68 |
-
}
|
69 |
-
|
70 |
-
# Inicializa as configurações no estado da sessão se não existirem
|
71 |
-
if 'selected_model' not in st.session_state:
|
72 |
-
st.session_state.selected_model = models[provider][0] # Primeiro modelo como padrão
|
73 |
-
|
74 |
-
if 'temperatura' not in st.session_state:
|
75 |
-
st.session_state.temperatura = 0.5 # Valor padrão
|
76 |
-
|
77 |
-
if 'quantidade_tokens' not in st.session_state:
|
78 |
-
st.session_state.quantidade_tokens = 150 # Valor padrão
|
79 |
-
|
80 |
-
if 'quantidade_tokens_input' not in st.session_state:
|
81 |
-
st.session_state.quantidade_tokens_input = "" # Valor padrão
|
82 |
-
|
83 |
-
# Mostra selectbox com os modelos do provedor escolhido e atualiza o estado da sessão
|
84 |
-
selected_model = st.sidebar.selectbox(
|
85 |
-
"Escolha o modelo:",
|
86 |
-
models[provider],
|
87 |
-
key="model_selectbox",
|
88 |
-
index=models[provider].index(st.session_state.selected_model) if st.session_state.selected_model in models[provider] else 0
|
89 |
-
)
|
90 |
-
st.session_state.selected_model = selected_model
|
91 |
-
|
92 |
-
# Controles para temperatura
|
93 |
-
temperatura = st.sidebar.slider(
|
94 |
-
"Temperatura:",
|
95 |
-
min_value=0.0,
|
96 |
-
max_value=1.0,
|
97 |
-
value=st.session_state.temperatura,
|
98 |
-
step=0.1
|
99 |
-
)
|
100 |
-
st.session_state.temperatura = temperatura
|
101 |
-
|
102 |
-
# Campo para quantidade de tokens (opcional)
|
103 |
-
quantidade_tokens_input = st.sidebar.text_input(
|
104 |
-
"Quantidade de tokens (deixe em branco para padrão):",
|
105 |
-
value=st.session_state.quantidade_tokens_input,
|
106 |
-
placeholder="Ex: 150"
|
107 |
-
)
|
108 |
-
st.session_state.quantidade_tokens_input = quantidade_tokens_input
|
109 |
-
|
110 |
-
# Converte a entrada para um número ou usa o padrão
|
111 |
-
if quantidade_tokens_input.strip() == "": # Se o campo estiver vazio
|
112 |
-
quantidade_tokens = 150 # Valor padrão
|
113 |
-
else:
|
114 |
-
quantidade_tokens = int(quantidade_tokens_input) if quantidade_tokens_input.isdigit() else 150 # Converte ou usa padrão
|
115 |
-
|
116 |
-
st.session_state.quantidade_tokens = quantidade_tokens
|
117 |
-
|
118 |
-
# Verifica se a mensagem do sistema foi inicializada
|
119 |
-
if 'mensagem_sistema' not in st.session_state:
|
120 |
-
st.session_state.mensagem_sistema = "" # Inicializa se não existir
|
121 |
-
|
122 |
-
# Recupera a mensagem do sistema do estado da sessão
|
123 |
-
mensagem = st.session_state.mensagem_sistema
|
124 |
-
|
125 |
-
# Cria o container para o chat
|
126 |
-
chat_container = st.container()
|
127 |
-
|
128 |
-
# Inicializa o histórico de mensagens se não existir
|
129 |
-
if "messages" not in st.session_state:
|
130 |
-
st.session_state.messages = []
|
131 |
-
|
132 |
-
# Mostra histórico de mensagens
|
133 |
-
with chat_container:
|
134 |
-
for message in st.session_state.messages:
|
135 |
-
with st.chat_message(message["role"]):
|
136 |
-
st.write(message["content"])
|
137 |
-
|
138 |
-
# Campo de entrada do usuário
|
139 |
-
if prompt := st.chat_input("Digite sua mensagem..."):
|
140 |
-
# Adiciona mensagem do usuário ao histórico
|
141 |
-
st.session_state.messages.append({"role": "user", "content": prompt})
|
142 |
-
|
143 |
-
# Mostra mensagem do usuário
|
144 |
-
with chat_container:
|
145 |
-
with st.chat_message("user"):
|
146 |
-
st.write(prompt)
|
147 |
-
|
148 |
-
# Placeholder para resposta do assistente
|
149 |
-
with st.chat_message("assistant"):
|
150 |
-
message_placeholder = st.empty()
|
151 |
-
message_placeholder.write("Pensando...")
|
152 |
-
|
153 |
-
# Chama a função para gerar a resposta com base no provedor selecionado
|
154 |
-
llm_instance = LLM(
|
155 |
-
api_key=st.session_state.api_keys[provider],
|
156 |
-
modelo=st.session_state.selected_model,
|
157 |
-
temperatura=st.session_state.temperatura,
|
158 |
-
quantidade_tokens=st.session_state.quantidade_tokens,
|
159 |
-
mensagem=st.session_state.mensagem_sistema
|
160 |
-
)
|
161 |
-
llm_instance.prompt = prompt
|
162 |
-
response = llm_instance.gerar_resposta()
|
163 |
-
message_placeholder.write(response)
|
164 |
-
|
165 |
-
# Adiciona resposta do assistente ao histórico
|
166 |
-
st.session_state.messages.append({"role": "assistant", "content": response})
|
|
|
1 |
+
import streamlit as st
|
2 |
+
from llms import LLM
|
3 |
+
|
4 |
+
st.set_page_config(page_title="Multi-LLM", layout="wide", page_icon=":robot_face:", initial_sidebar_state="expanded")
|
5 |
+
st.title("Multi-LLM 🤖")
|
6 |
+
|
7 |
+
st.sidebar.title("Escolha um provedor de LLM")
|
8 |
+
provider = st.sidebar.selectbox("Provedor", ["OpenAI", "Groq"], key="provider_selectbox")
|
9 |
+
|
10 |
+
# Inicializa o estado da sessão se não existir
|
11 |
+
if 'provider' not in st.session_state:
|
12 |
+
st.session_state.provider = provider
|
13 |
+
st.session_state.model = None
|
14 |
+
|
15 |
+
# Inicializa as chaves API para cada provedor se não existirem
|
16 |
+
if 'api_keys' not in st.session_state:
|
17 |
+
st.session_state.api_keys = {
|
18 |
+
"OpenAI": "",
|
19 |
+
"Groq": ""
|
20 |
+
}
|
21 |
+
|
22 |
+
# Campo para API key específica do provedor selecionado
|
23 |
+
api_key = st.sidebar.text_input(
|
24 |
+
f"Insira sua chave API para {provider}:",
|
25 |
+
type="password",
|
26 |
+
value=st.session_state.api_keys[provider]
|
27 |
+
)
|
28 |
+
|
29 |
+
# Armazena a chave API do provedor atual
|
30 |
+
if api_key:
|
31 |
+
st.session_state.api_keys[provider] = api_key
|
32 |
+
|
33 |
+
# Verifica se houve mudança de provedor
|
34 |
+
if st.session_state.provider != provider:
|
35 |
+
st.session_state.provider = provider
|
36 |
+
st.session_state.model = None
|
37 |
+
st.rerun()
|
38 |
+
|
39 |
+
# Adiciona botão para limpar sessão no sidebar
|
40 |
+
if st.sidebar.button("Novo Chat"):
|
41 |
+
# Guarda temporariamente as chaves API e a mensagem do sistema
|
42 |
+
api_keys_temp = st.session_state.api_keys
|
43 |
+
mensagem_sistema_temp = st.session_state.mensagem_sistema
|
44 |
+
provider_temp = st.session_state.provider
|
45 |
+
|
46 |
+
# Limpa todo o estado da sessão
|
47 |
+
for key in list(st.session_state.keys()):
|
48 |
+
del st.session_state[key]
|
49 |
+
|
50 |
+
# Restaura as chaves API e a mensagem do sistema
|
51 |
+
st.session_state.api_keys = api_keys_temp
|
52 |
+
st.session_state.mensagem_sistema = mensagem_sistema_temp
|
53 |
+
st.session_state.provider = provider_temp
|
54 |
+
|
55 |
+
# Força o recarregamento da página
|
56 |
+
st.rerun()
|
57 |
+
|
58 |
+
# Só mostra o select de modelos se tiver API key para o provedor atual
|
59 |
+
if st.session_state.api_keys[provider]:
|
60 |
+
# Define os modelos disponíveis para cada provedor
|
61 |
+
models = {
|
62 |
+
"OpenAI": ["gpt-4", "gpt-4o-mini", "gpt-3.5-turbo"],
|
63 |
+
"Groq": [
|
64 |
+
"llama3-groq-70b-8192-tool-use-preview",
|
65 |
+
"llama-3.1-70b-versatile",
|
66 |
+
"llama-3.2-90b-vision-preview"
|
67 |
+
]
|
68 |
+
}
|
69 |
+
|
70 |
+
# Inicializa as configurações no estado da sessão se não existirem
|
71 |
+
if 'selected_model' not in st.session_state:
|
72 |
+
st.session_state.selected_model = models[provider][0] # Primeiro modelo como padrão
|
73 |
+
|
74 |
+
if 'temperatura' not in st.session_state:
|
75 |
+
st.session_state.temperatura = 0.5 # Valor padrão
|
76 |
+
|
77 |
+
if 'quantidade_tokens' not in st.session_state:
|
78 |
+
st.session_state.quantidade_tokens = 150 # Valor padrão
|
79 |
+
|
80 |
+
if 'quantidade_tokens_input' not in st.session_state:
|
81 |
+
st.session_state.quantidade_tokens_input = "" # Valor padrão
|
82 |
+
|
83 |
+
# Mostra selectbox com os modelos do provedor escolhido e atualiza o estado da sessão
|
84 |
+
selected_model = st.sidebar.selectbox(
|
85 |
+
"Escolha o modelo:",
|
86 |
+
models[provider],
|
87 |
+
key="model_selectbox",
|
88 |
+
index=models[provider].index(st.session_state.selected_model) if st.session_state.selected_model in models[provider] else 0
|
89 |
+
)
|
90 |
+
st.session_state.selected_model = selected_model
|
91 |
+
|
92 |
+
# Controles para temperatura
|
93 |
+
temperatura = st.sidebar.slider(
|
94 |
+
"Temperatura:",
|
95 |
+
min_value=0.0,
|
96 |
+
max_value=1.0,
|
97 |
+
value=st.session_state.temperatura,
|
98 |
+
step=0.1
|
99 |
+
)
|
100 |
+
st.session_state.temperatura = temperatura
|
101 |
+
|
102 |
+
# Campo para quantidade de tokens (opcional)
|
103 |
+
quantidade_tokens_input = st.sidebar.text_input(
|
104 |
+
"Quantidade de tokens (deixe em branco para padrão):",
|
105 |
+
value=st.session_state.quantidade_tokens_input,
|
106 |
+
placeholder="Ex: 150"
|
107 |
+
)
|
108 |
+
st.session_state.quantidade_tokens_input = quantidade_tokens_input
|
109 |
+
|
110 |
+
# Converte a entrada para um número ou usa o padrão
|
111 |
+
if quantidade_tokens_input.strip() == "": # Se o campo estiver vazio
|
112 |
+
quantidade_tokens = 150 # Valor padrão
|
113 |
+
else:
|
114 |
+
quantidade_tokens = int(quantidade_tokens_input) if quantidade_tokens_input.isdigit() else 150 # Converte ou usa padrão
|
115 |
+
|
116 |
+
st.session_state.quantidade_tokens = quantidade_tokens
|
117 |
+
|
118 |
+
# Verifica se a mensagem do sistema foi inicializada
|
119 |
+
if 'mensagem_sistema' not in st.session_state:
|
120 |
+
st.session_state.mensagem_sistema = "" # Inicializa se não existir
|
121 |
+
|
122 |
+
# Recupera a mensagem do sistema do estado da sessão
|
123 |
+
mensagem = st.session_state.mensagem_sistema
|
124 |
+
|
125 |
+
# Cria o container para o chat
|
126 |
+
chat_container = st.container()
|
127 |
+
|
128 |
+
# Inicializa o histórico de mensagens se não existir
|
129 |
+
if "messages" not in st.session_state:
|
130 |
+
st.session_state.messages = []
|
131 |
+
|
132 |
+
# Mostra histórico de mensagens
|
133 |
+
with chat_container:
|
134 |
+
for message in st.session_state.messages:
|
135 |
+
with st.chat_message(message["role"]):
|
136 |
+
st.write(message["content"])
|
137 |
+
|
138 |
+
# Campo de entrada do usuário
|
139 |
+
if prompt := st.chat_input("Digite sua mensagem..."):
|
140 |
+
# Adiciona mensagem do usuário ao histórico
|
141 |
+
st.session_state.messages.append({"role": "user", "content": prompt})
|
142 |
+
|
143 |
+
# Mostra mensagem do usuário
|
144 |
+
with chat_container:
|
145 |
+
with st.chat_message("user"):
|
146 |
+
st.write(prompt)
|
147 |
+
|
148 |
+
# Placeholder para resposta do assistente
|
149 |
+
with st.chat_message("assistant"):
|
150 |
+
message_placeholder = st.empty()
|
151 |
+
message_placeholder.write("Pensando...")
|
152 |
+
|
153 |
+
# Chama a função para gerar a resposta com base no provedor selecionado
|
154 |
+
llm_instance = LLM(
|
155 |
+
api_key=st.session_state.api_keys[provider],
|
156 |
+
modelo=st.session_state.selected_model,
|
157 |
+
temperatura=st.session_state.temperatura,
|
158 |
+
quantidade_tokens=st.session_state.quantidade_tokens,
|
159 |
+
mensagem=st.session_state.mensagem_sistema
|
160 |
+
)
|
161 |
+
llm_instance.prompt = prompt
|
162 |
+
response = llm_instance.gerar_resposta()
|
163 |
+
message_placeholder.write(response)
|
164 |
+
|
165 |
+
# Adiciona resposta do assistente ao histórico
|
166 |
+
st.session_state.messages.append({"role": "assistant", "content": response})
|