import os import sqlite3 import pandas as pd from dotenv import load_dotenv from langchain_openai import ChatOpenAI from langchain.prompts import PromptTemplate from langchain.chains import ConversationChain from langchain.memory import ConversationBufferMemory import gradio as gr # Carrega chave da API (this is redundant now, but kept for clarity) load_dotenv() api_key = os.getenv("OPENROUTER_API_KEY") if not api_key: raise ValueError("❌ Variável OPENROUTER_API_KEY não encontrada.") # Define variáveis de ambiente os.environ["OPENAI_API_KEY"] = api_key os.environ["OPENAI_API_BASE"] = "https://openrouter.ai/api/v1" # Cria banco de dados se ainda não existir conn = sqlite3.connect("historico_conversas.db") cursor = conn.cursor() cursor.execute(''' CREATE TABLE IF NOT EXISTS conversas ( id INTEGER PRIMARY KEY AUTOINCREMENT, aluno TEXT, pergunta TEXT, resposta TEXT, timestamp DATETIME DEFAULT CURRENT_TIMESTAMP ) ''') conn.commit() conn.close() # Instancia o modelo llm = ChatOpenAI(model="deepseek/deepseek-r1:free", temperature=0.4) # Prompt com histórico template = PromptTemplate.from_template( """Você é um tutor de programação em Python. Responda com clareza e exemplos. Histórico da conversa: {history} Aluno: {input} Resposta:""" ) # Memória da conversa memoria = ConversationBufferMemory(return_messages=True) # Cadeia com memória e prompt chat_chain = ConversationChain(llm=llm, memory=memoria, prompt=template) # Função para salvar no banco def salvar_conversa(nome, pergunta, resposta): conn = sqlite3.connect("historico_conversas.db") cursor = conn.cursor() cursor.execute("INSERT INTO conversas (aluno, pergunta, resposta) VALUES (?, ?, ?)", (nome or "Anônimo", pergunta, resposta)) conn.commit() conn.close() # Função para responder e gravar def responder(pergunta, nome): try: resposta = chat_chain.run(pergunta) salvar_conversa(nome, pergunta, resposta) return resposta except Exception as e: import traceback return f"❌ Erro:\n{traceback.format_exc()}" # Resetar memória def resetar_memoria(): memoria.clear() return "✅ Memória resetada com sucesso!" # Exportar conversas para arquivos def exportar_conversas(): conn = sqlite3.connect("historico_conversas.db") df = pd.read_sql_query("SELECT * FROM conversas ORDER BY timestamp DESC", conn) df.to_csv("conversas_exportadas.csv", index=False) df.to_excel("conversas_exportadas.xlsx", index=False, engine="openpyxl") conn.close() return "✅ Arquivos 'conversas_exportadas.csv' e 'conversas_exportadas.xlsx' foram salvos!" # Interface Gradio with gr.Blocks() as app: gr.Markdown("## 🤖 Tutor de Python com IA + Histórico em Banco de Dados + Exportação") nome = gr.Textbox(label="Seu nome (opcional)", placeholder="Ex: João") pergunta = gr.Textbox(label="Sua dúvida sobre Python", placeholder="Ex: Como usar listas em Python?") resposta = gr.Textbox(label="Resposta do Assistente") botao_enviar = gr.Button("Enviar") botao_resetar = gr.Button("🔁 Resetar Memória") botao_exportar = gr.Button("📤 Exportar Histórico") botao_enviar.click(fn=responder, inputs=[pergunta, nome], outputs=resposta) botao_resetar.click(fn=resetar_memoria, outputs=resposta) botao_exportar.click(fn=exportar_conversas, outputs=resposta) app.launch(share=True)