SilvioLima commited on
Commit
5c47d7e
·
verified ·
1 Parent(s): 34dfb98

Create app.py

Browse files
Files changed (1) hide show
  1. app.py +105 -0
app.py ADDED
@@ -0,0 +1,105 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import os
2
+ import sqlite3
3
+ import pandas as pd
4
+ from dotenv import load_dotenv
5
+ from langchain_openai import ChatOpenAI
6
+ from langchain.prompts import PromptTemplate
7
+ from langchain.chains import ConversationChain
8
+ from langchain.memory import ConversationBufferMemory
9
+
10
+
11
+
12
+ # Carrega chave da API (this is redundant now, but kept for clarity)
13
+ load_dotenv()
14
+ api_key = os.getenv("OPENROUTER_API_KEY")
15
+ if not api_key:
16
+ raise ValueError("❌ Variável OPENROUTER_API_KEY não encontrada.")
17
+
18
+ # Define variáveis de ambiente
19
+ os.environ["OPENAI_API_KEY"] = api_key
20
+ os.environ["OPENAI_API_BASE"] = "https://openrouter.ai/api/v1"
21
+
22
+ # Cria banco de dados se ainda não existir
23
+ conn = sqlite3.connect("historico_conversas.db")
24
+ cursor = conn.cursor()
25
+ cursor.execute('''
26
+ CREATE TABLE IF NOT EXISTS conversas (
27
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
28
+ aluno TEXT,
29
+ pergunta TEXT,
30
+ resposta TEXT,
31
+ timestamp DATETIME DEFAULT CURRENT_TIMESTAMP
32
+ )
33
+ ''')
34
+ conn.commit()
35
+ conn.close()
36
+
37
+ # Instancia o modelo
38
+ llm = ChatOpenAI(model="deepseek/deepseek-r1:free", temperature=0.4)
39
+
40
+ # Prompt com histórico
41
+ template = PromptTemplate.from_template(
42
+ """Você é um tutor de programação em Python. Responda com clareza e exemplos.
43
+
44
+ Histórico da conversa:
45
+ {history}
46
+
47
+ Aluno: {input}
48
+ Resposta:"""
49
+ )
50
+
51
+ # Memória da conversa
52
+ memoria = ConversationBufferMemory(return_messages=True)
53
+
54
+ # Cadeia com memória e prompt
55
+ chat_chain = ConversationChain(llm=llm, memory=memoria, prompt=template)
56
+
57
+ # Função para salvar no banco
58
+ def salvar_conversa(nome, pergunta, resposta):
59
+ conn = sqlite3.connect("historico_conversas.db")
60
+ cursor = conn.cursor()
61
+ cursor.execute("INSERT INTO conversas (aluno, pergunta, resposta) VALUES (?, ?, ?)",
62
+ (nome or "Anônimo", pergunta, resposta))
63
+ conn.commit()
64
+ conn.close()
65
+
66
+ # Função para responder e gravar
67
+ def responder(pergunta, nome):
68
+ try:
69
+ resposta = chat_chain.run(pergunta)
70
+ salvar_conversa(nome, pergunta, resposta)
71
+ return resposta
72
+ except Exception as e:
73
+ import traceback
74
+ return f"❌ Erro:\n{traceback.format_exc()}"
75
+
76
+ # Resetar memória
77
+ def resetar_memoria():
78
+ memoria.clear()
79
+ return "✅ Memória resetada com sucesso!"
80
+
81
+ # Exportar conversas para arquivos
82
+ def exportar_conversas():
83
+ conn = sqlite3.connect("historico_conversas.db")
84
+ df = pd.read_sql_query("SELECT * FROM conversas ORDER BY timestamp DESC", conn)
85
+ df.to_csv("conversas_exportadas.csv", index=False)
86
+ df.to_excel("conversas_exportadas.xlsx", index=False, engine="openpyxl")
87
+ conn.close()
88
+ return "✅ Arquivos 'conversas_exportadas.csv' e 'conversas_exportadas.xlsx' foram salvos!"
89
+
90
+ # Interface Gradio
91
+ with gr.Blocks() as app:
92
+ gr.Markdown("## 🤖 Tutor de Python com IA + Histórico em Banco de Dados + Exportação")
93
+ nome = gr.Textbox(label="Seu nome (opcional)", placeholder="Ex: João")
94
+ pergunta = gr.Textbox(label="Sua dúvida sobre Python", placeholder="Ex: Como usar listas em Python?")
95
+ resposta = gr.Textbox(label="Resposta do Assistente")
96
+
97
+ botao_enviar = gr.Button("Enviar")
98
+ botao_resetar = gr.Button("🔁 Resetar Memória")
99
+ botao_exportar = gr.Button("📤 Exportar Histórico")
100
+
101
+ botao_enviar.click(fn=responder, inputs=[pergunta, nome], outputs=resposta)
102
+ botao_resetar.click(fn=resetar_memoria, outputs=resposta)
103
+ botao_exportar.click(fn=exportar_conversas, outputs=resposta)
104
+
105
+ app.launch(share=True)