Spaces:
Sleeping
Sleeping
| 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) |