Spaces:
Running
Running
File size: 6,342 Bytes
b0a7a14 75bcbe4 b0a7a14 a53e6ab 75bcbe4 b0a7a14 d30067f b0a7a14 d30067f b0a7a14 d30067f b0a7a14 d30067f b0a7a14 |
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 |
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})
|