llms / app.py
souzat19's picture
Update app.py
75bcbe4 verified
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})