Spaces:
Running
Running
import streamlit as st | |
from llms import LLM | |
st.set_page_config(page_title="Multi-LLM", layout="wide", page_icon=":robot_face:", initial_sidebar_state="expanded") | |
st.title("Multi-LLM 🤖") | |
st.sidebar.title("Escolha um provedor de LLM") | |
provider = st.sidebar.selectbox("Provedor", ["OpenAI", "Groq"], key="provider_selectbox") | |
# Inicializa o estado da sessão se não existir | |
if 'provider' not in st.session_state: | |
st.session_state.provider = provider | |
st.session_state.model = None | |
# Inicializa as chaves API para cada provedor se não existirem | |
if 'api_keys' not in st.session_state: | |
st.session_state.api_keys = { | |
"OpenAI": "", | |
"Groq": "" | |
} | |
# Campo para API key específica do provedor selecionado | |
api_key = st.sidebar.text_input( | |
f"Insira sua chave API para {provider}:", | |
type="password", | |
value=st.session_state.api_keys[provider] | |
) | |
# Armazena a chave API do provedor atual | |
if api_key: | |
st.session_state.api_keys[provider] = api_key | |
# Verifica se houve mudança de provedor | |
if st.session_state.provider != provider: | |
st.session_state.provider = provider | |
st.session_state.model = None | |
st.rerun() | |
# Adiciona botão para limpar sessão no sidebar | |
if st.sidebar.button("Novo Chat"): | |
# Guarda temporariamente as chaves API e a mensagem do sistema | |
api_keys_temp = st.session_state.api_keys | |
mensagem_sistema_temp = st.session_state.mensagem_sistema | |
provider_temp = st.session_state.provider | |
# Limpa todo o estado da sessão | |
for key in list(st.session_state.keys()): | |
del st.session_state[key] | |
# Restaura as chaves API e a mensagem do sistema | |
st.session_state.api_keys = api_keys_temp | |
st.session_state.mensagem_sistema = mensagem_sistema_temp | |
st.session_state.provider = provider_temp | |
# Força o recarregamento da página | |
st.rerun() | |
# Só mostra o select de modelos se tiver API key para o provedor atual | |
if st.session_state.api_keys[provider]: | |
# Define os modelos disponíveis para cada provedor | |
models = { | |
"OpenAI": ["gpt-4o", "gpt-4o-mini"], | |
"Groq": [ | |
"llama-3.3-70b-versatile", | |
"llama-3.2-90b-vision-preview", | |
"mixtral-8x7b-32768" | |
] | |
} | |
# Inicializa as configurações no estado da sessão se não existirem | |
if 'selected_model' not in st.session_state: | |
st.session_state.selected_model = models[provider][0] # Primeiro modelo como padrão | |
if 'temperatura' not in st.session_state: | |
st.session_state.temperatura = 0.5 # Valor padrão | |
if 'quantidade_tokens' not in st.session_state: | |
st.session_state.quantidade_tokens = 2048 # Valor padrão | |
if 'quantidade_tokens_input' not in st.session_state: | |
st.session_state.quantidade_tokens_input = "" # Valor padrão | |
# Mostra selectbox com os modelos do provedor escolhido e atualiza o estado da sessão | |
selected_model = st.sidebar.selectbox( | |
"Escolha o modelo:", | |
models[provider], | |
key="model_selectbox", | |
index=models[provider].index(st.session_state.selected_model) if st.session_state.selected_model in models[provider] else 0 | |
) | |
st.session_state.selected_model = selected_model | |
# Controles para temperatura | |
temperatura = st.sidebar.slider( | |
"Temperatura:", | |
min_value=0.0, | |
max_value=1.0, | |
value=st.session_state.temperatura, | |
step=0.1 | |
) | |
st.session_state.temperatura = temperatura | |
# Campo para quantidade de tokens (opcional) | |
quantidade_tokens_input = st.sidebar.text_input( | |
"Quantidade de tokens (deixe em branco para padrão):", | |
value=st.session_state.quantidade_tokens_input, | |
placeholder="Ex: 2048" | |
) | |
st.session_state.quantidade_tokens_input = quantidade_tokens_input | |
# Converte a entrada para um número ou usa o padrão | |
if quantidade_tokens_input.strip() == "": # Se o campo estiver vazio | |
quantidade_tokens = 2048 # Valor padrão | |
else: | |
quantidade_tokens = int(quantidade_tokens_input) if quantidade_tokens_input.isdigit() else 2048 # Converte ou usa padrão | |
st.session_state.quantidade_tokens = quantidade_tokens | |
# Verifica se a mensagem do sistema foi inicializada | |
if 'mensagem_sistema' not in st.session_state: | |
st.session_state.mensagem_sistema = "" # Inicializa se não existir | |
# Recupera a mensagem do sistema do estado da sessão | |
mensagem = st.session_state.mensagem_sistema | |
# Cria o container para o chat | |
chat_container = st.container() | |
# Inicializa o histórico de mensagens se não existir | |
if "messages" not in st.session_state: | |
st.session_state.messages = [] | |
# Mostra histórico de mensagens | |
with chat_container: | |
for message in st.session_state.messages: | |
with st.chat_message(message["role"]): | |
st.write(message["content"]) | |
# Campo de entrada do usuário | |
if prompt := st.chat_input("Digite sua mensagem..."): | |
# Adiciona mensagem do usuário ao histórico | |
st.session_state.messages.append({"role": "user", "content": prompt}) | |
# Mostra mensagem do usuário | |
with chat_container: | |
with st.chat_message("user"): | |
st.write(prompt) | |
# Placeholder para resposta do assistente | |
with st.chat_message("assistant"): | |
message_placeholder = st.empty() | |
message_placeholder.write("Pensando...") | |
# Chama a função para gerar a resposta com base no provedor selecionado | |
llm_instance = LLM( | |
api_key=st.session_state.api_keys[provider], | |
modelo=st.session_state.selected_model, | |
temperatura=st.session_state.temperatura, | |
quantidade_tokens=st.session_state.quantidade_tokens, | |
mensagem=st.session_state.mensagem_sistema | |
) | |
llm_instance.prompt = prompt | |
response = llm_instance.gerar_resposta() | |
message_placeholder.write(response) | |
# Adiciona resposta do assistente ao histórico | |
st.session_state.messages.append({"role": "assistant", "content": response}) | |