HF-Small-LLMs / app.py
KK-Sequeira's picture
add app.py
e373c36
import numpy as np
import streamlit as st
from openai import OpenAI
import os
# inicializar o cliente
client = OpenAI(
base_url="https://api-inference.huggingface.co/v1",
api_key=os.environ.get('API_KEY') # Substitua pela sua chave API
)
# Definir mensagem do sistema para configuração inicial
smessage = """
Seu nome é Assistente.
Responda sempre em português do Brasil.
As respostas devem ser concisas.
O tom da conversa deve ser informal.
"""
# Criar modelos suportados e seus limites de tokens
model_links = {
"Meta-Llama-3-8B-Instruct": ("meta-llama/Meta-Llama-3-8B-Instruct", 4096),
"Mixtral-8x7B-Instruct-v0.1": ("mistralai/Mixtral-8x7B-Instruct-v0.1", 32768),
"Nous-Hermes-2-Mixtral-8x7B-DPO": ("NousResearch/Nous-Hermes-2-Mixtral-8x7B-DPO", 32768),
"Yi-1.5-34B-Chat": ("01-ai/Yi-1.5-34B-Chat", 4096),
"Mistral-7B-Instruct-v0.1": ("mistralai/Mistral-7B-Instruct-v0.1", 8192),
"Mistral-7B-Instruct-v0.2": ("mistralai/Mistral-7B-Instruct-v0.2", 8192),
"Mistral-7B-Instruct-v0.3": ("mistralai/Mistral-7B-Instruct-v0.3", 8192),
"Zephyr-7B-Beta": ("HuggingFaceH4/zephyr-7b-beta", 8192),
"Zephyr-7B-Alpha": ("HuggingFaceH4/zephyr-7b-alpha", 8192),
"Phi-3-mini-4k-instruct": ("microsoft/Phi-3-mini-4k-instruct", 4096),
}
def reset_conversation():
'''
Reinicia a Conversa
'''
st.session_state.conversation = []
st.session_state.messages = []
st.session_state.system_message_added = False
add_system_message()
return None
def add_system_message():
system_message = {
"role": "system",
"content": smessage
}
if "system_message_added" not in st.session_state or not st.session_state.system_message_added:
st.session_state.messages.append(system_message)
st.session_state.system_message_added = True
def calculate_max_tokens(model_name, current_context_length):
repo_id, model_limit = model_links[model_name]
available_tokens = model_limit - current_context_length
return max(100, min(available_tokens - 100, 3000)) # Garante um mínimo de 100 e máximo de 3000
# Definir os modelos disponíveis
models = list(model_links.keys())
# Criar a barra lateral com o menu suspenso para seleção de modelo
selected_model = st.sidebar.selectbox("Selecione o Modelo", models)
# Criar um slider de temperatura
temp_values = st.sidebar.slider('Selecione um valor de temperatura', 0.0, 1.0, (0.5))
# Adicionar botão de reiniciar para limpar a conversa
st.sidebar.button('Reiniciar Chat', on_click=reset_conversation) # Botão de reiniciar
# Criar descrição do modelo
st.sidebar.write(f"Você está conversando com **{selected_model}**")
st.sidebar.markdown("*O conteúdo gerado pode ser impreciso ou falso.*")
if "prev_option" not in st.session_state:
st.session_state.prev_option = selected_model
if st.session_state.prev_option != selected_model:
st.session_state.messages = []
st.session_state.prev_option = selected_model
reset_conversation()
# Obter o modelo que queremos usar
repo_id = model_links[selected_model][0]
st.subheader(f'Chat com {selected_model}')
# Definir um modelo padrão
if selected_model not in st.session_state:
st.session_state[selected_model] = repo_id
# Inicializar histórico do chat
if "messages" not in st.session_state:
st.session_state.messages = []
# Adicionar mensagem do sistema para configuração inicial
add_system_message()
# Exibir mensagens do chat do histórico ao reiniciar o app
for message in st.session_state.messages:
if message["role"] != "system":
with st.chat_message(message["role"]):
st.markdown(message["content"])
# Aceitar entrada do usuário
if prompt := st.chat_input(f"Olá, sou o {selected_model}. Faça uma pergunta"):
# Exibir mensagem do usuário no container de mensagens do chat
with st.chat_message("user"):
st.markdown(prompt)
# Adicionar mensagem do usuário ao histórico do chat
st.session_state.messages.append({"role": "user", "content": prompt})
# Exibir resposta do assistente no container de mensagens do chat
with st.chat_message("assistant"):
try:
current_context_length = sum(len(m['content']) for m in st.session_state.messages)
max_tokens = calculate_max_tokens(selected_model, current_context_length)
stream = client.chat.completions.create(
model=repo_id,
messages=[
{"role": m["role"], "content": m["content"]}
for m in st.session_state.messages
],
temperature=temp_values,
stream=True,
max_tokens=max_tokens,
)
response = st.write_stream(stream)
except Exception as e:
response = "😵 Parece que algo deu errado!\
\n O modelo pode estar sendo atualizado ou há um problema no sistema.\
\n Tente novamente mais tarde."
st.write(response)
st.write("Esta foi a mensagem de erro:")
st.write(e)
st.session_state.messages.append({"role": "assistant", "content": response})