Spaces:
Running
Running
import os | |
import json | |
import requests | |
import streamlit as st | |
from streamlit_extras.stylable_container import stylable_container | |
# Configuração da API do OpenRouter | |
OPENROUTER = os.getenv('OPEN_ROUTER_API_KEY') | |
if not OPENROUTER: | |
raise ValueError("API Key não encontrada. Configure a variável de ambiente 'OPEN_ROUTER_API_KEY'.") | |
url = "https://openrouter.ai/api/v1/chat/completions" | |
headers = { | |
"Authorization": f"Bearer {OPENROUTER}", | |
"Content-Type": "application/json" | |
} | |
def chat_imagem(): | |
with stylable_container( | |
key="bot1", | |
css_styles=""" | |
img { | |
width: 220px; | |
height: 280px; | |
overflow: hidden; | |
position: relative; | |
object-fit: cover; | |
border-radius: 24px; | |
} | |
""" | |
): | |
st.image("src/Images/bot.png") | |
cf1, cf2, cf3 = st.columns(3) | |
with cf1: | |
st.title("🤖🧠 - ChatBot UBS Flamengo") | |
with cf2: | |
chat_imagem() | |
with cf3: | |
st.subheader(':blue[🔍📚 Auxílio em temas gerais e administrativos!]') | |
st.write(""" | |
Trata-se do modelo DeepSeek, uma IA com raciocínio, aprimorado. Portanto | |
as respostas são mais demoradas, mas mais elaboradas! Após a resposta, | |
deixei em azul, a linha de raciocínio da IA! | |
""") | |
def clear_all_session_state(): | |
""" | |
Remove todas as chaves do st.session_state e reinicia a aplicação. | |
""" | |
for key in list(st.session_state.keys()): | |
del st.session_state[key] | |
st.rerun() | |
# Inicialização do histórico do chat | |
if "ubs_chat_history" not in st.session_state: | |
st.session_state.ubs_chat_history = [] | |
for message in st.session_state.ubs_chat_history: | |
with st.chat_message(message["role"]): | |
st.markdown(message["content"]) | |
# Input do usuário (fora e abaixo do container do histórico) | |
user_message = st.chat_input("Digite sua pergunta ") | |
if user_message: | |
# Adiciona a mensagem do usuário ao histórico | |
st.session_state.ubs_chat_history.append({"role": "user", "content": user_message}) | |
with st.chat_message("user"): | |
st.markdown(user_message) | |
try: | |
# Contexto e instruções para o assistente | |
context = """ | |
Você é um assistente virtual que atua em uma Unidade Básica de Saúde (UBS) chamada UBS Flamengo, em Contagem - Minas Gerais. | |
Sua função é auxiliar profissionais de saúde e administrativos em diversas tarefas, sempre se comunicando em português brasileiro formal. | |
1. Comportamento e Comunicação | |
- Pergunte inicialmente o nome do usuário e utilize-o de forma respeitosa durante toda a conversa. | |
- Mantenha um tom profissional, cortês e empático. | |
- Seja claro e compreensível. | |
2. Principais Responsabilidades | |
- Auxiliar na elaboração de relatórios médicos e administrativos. | |
- Interpretar e explicar notas técnicas e diretrizes de saúde. | |
- Sumarizar textos complexos relacionados à saúde pública. | |
- Oferecer insights e análises. | |
- Se não souber sobre um tópico específico, admita e sugira a consulta a um profissional qualificado. | |
3. Formato de Respostas | |
- Forneça respostas completas e estruturadas. | |
- Para tópicos complexos, apresente uma visão geral concisa seguida de detalhes. | |
- Utilize analogias ou exemplos práticos quando relevantes. | |
""" | |
# Constrói o prompt completo combinando o contexto com o histórico da conversa | |
full_prompt = context + "\n" | |
for msg in st.session_state.ubs_chat_history: | |
full_prompt += f"{msg['role']}: {msg['content']}\n" | |
payload = { | |
"model": "deepseek/deepseek-r1", | |
"messages": [ | |
{"role": "user", "content": full_prompt} | |
], | |
"include_reasoning": True, | |
"temperature": 0.5, | |
"language": "pt-BR" | |
} | |
response = requests.post(url, headers=headers, data=json.dumps(payload)) | |
response.raise_for_status() | |
json_response = response.json() | |
message = json_response['choices'][0]['message'] | |
content = message.get('content', '') | |
reasoning = message.get('reasoning', '') | |
# Adiciona a resposta ao histórico | |
st.session_state.ubs_chat_history.append({ | |
"role": "assistant", | |
"content": content | |
}) | |
# Exibe a resposta do assistente | |
with st.chat_message("assistant"): | |
st.markdown(content) | |
if reasoning: | |
st.info(f"Raciocínio: {reasoning}") | |
except Exception as e: | |
st.error(f"Ocorreu um erro ao processar a resposta: {str(e)}") | |
# Log para análise posterior (opcional) | |
with open("error_log.txt", "a") as log_file: | |
log_file.write(f"Erro: {str(e)}\n") | |