Izzac / app.py
caarleexx's picture
Update app.py
b9516fa verified
# Gradio 6.0.2 compatible chatbot application
import gradio as gr
import openai
import os
import json
from threading import Lock
import pkg_resources
# --- Configuração Inicial e Gerenciamento de Memória ---
CHATBOT_MEMORY_FILE = "memory_chatbot.json"
API_MEMORY_FILE = "memory_api.json"
MODEL_NAME = "openai/gpt-oss-120b"
TOGETHER_API_BASE = "https://api.together.xyz/v1"
file_lock = Lock()
def initialize_memory_files():
with file_lock:
if not os.path.exists(CHATBOT_MEMORY_FILE):
with open(CHATBOT_MEMORY_FILE, 'w') as f:
json.dump([], f)
if not os.path.exists(API_MEMORY_FILE):
with open(API_MEMORY_FILE, 'w') as f:
json.dump([], f)
def load_json(filepath):
with file_lock:
try:
with open(filepath, 'r', encoding='utf-8') as f:
return json.load(f)
except (FileNotFoundError, json.JSONDecodeError):
return []
def save_json(filepath, data):
with file_lock:
with open(filepath, 'w', encoding='utf-8') as f:
json.dump(data, f, indent=4, ensure_ascii=False)
# --- Funções da Aba de Ajuda ---
def get_library_versions():
"""Retorna as versões das bibliotecas principais."""
try:
gradio_version = pkg_resources.get_distribution("gradio").version
openai_version = pkg_resources.get_distribution("openai").version
return f"""
- **Gradio:** `{gradio_version}`
- **OpenAI:** `{openai_version}`
"""
except pkg_resources.DistributionNotFound:
return "Não foi possível obter as versões das bibliotecas."
def load_help_content():
"""Carrega o conteúdo do arquivo help.md."""
try:
with open('help.md', 'r', encoding='utf-8') as f:
return f.read()
except FileNotFoundError:
return "Arquivo help.md não encontrado."
# --- Função Principal do Chatbot ---
def get_model_response(user_message, chat_history):
"""Obtém uma resposta da API e gerencia a memória."""
try:
client = openai.OpenAI(
api_key=os.getenv("TOGETHER_API_KEY"),
base_url=TOGETHER_API_BASE,
)
except Exception as e:
chat_history.append((user_message, f"ERRO: A chave da API não foi encontrada. Verifique o segredo 'TOGETHER_API_KEY' no seu Space. Detalhes: {e}"))
return chat_history
messages = [{"role": "system", "content": "Você é um assistente prestativo e detalhista."}]
for user_msg, assistant_msg in chat_history:
messages.append({"role": "user", "content": user_msg})
if assistant_msg: # Evita adicionar respostas nulas
messages.append({"role": "assistant", "content": assistant_msg})
messages.append({"role": "user", "content": user_message})
try:
chat_completion = client.chat.completions.create(
messages=messages,
model=MODEL_NAME,
)
assistant_response = chat_completion.choices[0].message.content
except Exception as e:
assistant_response = f"Ocorreu um erro ao contatar a API: {e}"
chat_history.append((user_message, assistant_response))
save_json(CHATBOT_MEMORY_FILE, chat_history) # A memória do chatbot agora é o próprio histórico
api_memory = load_json(API_MEMORY_FILE)
api_memory.append({ "request": messages, "response": assistant_response })
save_json(API_MEMORY_FILE, api_memory)
return chat_history
# Função wrapper para a interface do chatbot que lida com o estado
def add_text(history, text):
history = history + [(text, None)]
return history, ""
# --- Construção da Interface Gradio (Compatível com v6.0.2) ---
with gr.Blocks(title=f"Assistente com {MODEL_NAME}") as demo:
gr.Markdown(f"# 🤖 Assistente de Chat com {MODEL_NAME}")
gr.Markdown("Faça uma pergunta e receba uma resposta do modelo hospedado na Together.ai.")
with gr.Tabs():
with gr.TabItem("Chatbot"):
initial_history = load_json(CHATBOT_MEMORY_FILE)
chatbot_ui = gr.Chatbot(value=initial_history, label="Conversa").style(height=600)
with gr.Row():
msg_input = gr.Textbox(
scale=4,
show_label=False,
placeholder="Digite sua mensagem e pressione Enter",
)
btn_submit = gr.Button("Enviar", variant="primary")
with gr.TabItem("JSON API Log"):
gr.Markdown("Exibe o log completo de requisições e respostas para a API.")
btn_update_api_log = gr.Button("Atualizar")
json_api_view = gr.JSON(label="Memória da API")
with gr.TabItem("JSON Chatbot"):
gr.Markdown("Exibe o histórico de mensagens formatado para a interface do chatbot.")
btn_update_chatbot = gr.Button("Atualizar")
json_chatbot_view = gr.JSON(label="Memória do Chatbot")
with gr.TabItem("Help"):
# Usar um Textbox para exibir o conteúdo do Markdown é mais robusto em versões antigas
help_display = gr.Markdown(load_help_content())
gr.Markdown("### Versões das Bibliotecas")
gr.Markdown(get_library_versions())
# --- Lógica de Eventos da UI ---
# Ações do Chatbot
msg_input.submit(add_text, [chatbot_ui, msg_input], [chatbot_ui, msg_input]).then(
get_model_response, chatbot_ui, chatbot_ui
)
btn_submit.click(add_text, [chatbot_ui, msg_input], [chatbot_ui, msg_input]).then(
get_model_response, chatbot_ui, chatbot_ui
)
# Ações dos botões de atualização para as abas JSON
btn_update_api_log.click(fn=lambda: load_json(API_MEMORY_FILE), inputs=None, outputs=[json_api_view])
btn_update_chatbot.click(fn=lambda: load_json(CHATBOT_MEMORY_FILE), inputs=None, outputs=[json_chatbot_view])
# Carrega os JSONs quando o aplicativo é iniciado
demo.load(fn=lambda: load_json(API_MEMORY_FILE), inputs=None, outputs=[json_api_view])
demo.load(fn=lambda: load_json(CHATBOT_MEMORY_FILE), inputs=None, outputs=[json_chatbot_view])
# Inicializa os arquivos de memória antes de iniciar o app
initialize_memory_files()
# Lança a aplicação
demo.launch()