Spaces:
Sleeping
Sleeping
Update app.py
Browse files
app.py
CHANGED
|
@@ -5,14 +5,16 @@ import os
|
|
| 5 |
import google.generativeai as genai
|
| 6 |
import json
|
| 7 |
|
| 8 |
-
# --- 1. CARREGAMENTO DO CONTEXTO FILOSÓFICO ---
|
| 9 |
def carregar_contexto_filosofico(caminho_arquivo="epct0.md"):
|
|
|
|
| 10 |
try:
|
| 11 |
with open(caminho_arquivo, 'r', encoding='utf-8') as f:
|
| 12 |
-
print(f"Contexto filosófico '{caminho_arquivo}' carregado.")
|
| 13 |
return f.read()
|
| 14 |
except FileNotFoundError:
|
| 15 |
-
print(f"AVISO CRÍTICO: '{caminho_arquivo}' não encontrado.
|
|
|
|
| 16 |
return None
|
| 17 |
|
| 18 |
CONTEXTO_EPICTETO = carregar_contexto_filosofico()
|
|
@@ -21,11 +23,15 @@ CONTEXTO_EPICTETO = carregar_contexto_filosofico()
|
|
| 21 |
# --- 2. CONFIGURAÇÃO DAS APIS GEMINI ---
|
| 22 |
api_key = os.getenv("GOOGLE_API_KEY")
|
| 23 |
if not api_key:
|
| 24 |
-
# ⚠️ SUBSTITUA "SUA_API_KEY_AQUI" PELA SUA CHAVE REAL
|
| 25 |
api_key = "SUA_API_KEY_AQUI"
|
| 26 |
|
| 27 |
genai.configure(api_key=api_key)
|
|
|
|
|
|
|
|
|
|
| 28 |
counselor_model = genai.GenerativeModel('gemini-flash-latest')
|
|
|
|
| 29 |
supervisor_model = genai.GenerativeModel('gemini-flash-latest')
|
| 30 |
|
| 31 |
|
|
@@ -70,54 +76,96 @@ Analise o `estado_pipeline` atual e o `historico_conversa`. Decida qual passo ex
|
|
| 70 |
---
|
| 71 |
**ESTRUTURA JSON DE SAÍDA OBRIGATÓRIA:**
|
| 72 |
{
|
| 73 |
-
"raciocinio_do_passo": "
|
| 74 |
-
"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 75 |
}
|
| 76 |
"""
|
|
|
|
| 77 |
PROMPT_SUPERVISOR = """
|
| 78 |
-
Você é um Supervisor de IA, um fact-checker rigoroso. Sua única tarefa é analisar o texto em busca de incorreções factuais
|
|
|
|
|
|
|
|
|
|
|
|
|
| 79 |
"""
|
| 80 |
|
| 81 |
-
# --- 4. GERENCIAMENTO DE ESTADO E FUNÇÕES ---
|
| 82 |
-
# (As funções resetar_estado e run_supervisor não precisam de alterações)
|
| 83 |
def resetar_estado():
|
| 84 |
-
|
| 85 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 86 |
|
| 87 |
estado_pipeline_global = resetar_estado()
|
| 88 |
historico_conversa_llm = []
|
| 89 |
|
| 90 |
def run_supervisor(text_to_check):
|
| 91 |
-
|
|
|
|
| 92 |
try:
|
| 93 |
-
|
|
|
|
|
|
|
| 94 |
if "NO_DIVERGENCE" in response.text:
|
| 95 |
-
print("Supervisor
|
| 96 |
return None
|
| 97 |
else:
|
| 98 |
-
print(f"Supervisor encontrou uma divergência.")
|
| 99 |
return response.text
|
| 100 |
except Exception as e:
|
| 101 |
-
print(f"Erro
|
| 102 |
return None
|
| 103 |
|
| 104 |
# --- 5. FUNÇÃO PRINCIPAL DO CHATBOT ---
|
| 105 |
def handle_chat(mensagem, historico_chat_gradio, modo_sabio, modo_supervisor):
|
| 106 |
global estado_pipeline_global, historico_conversa_llm
|
|
|
|
| 107 |
if not historico_chat_gradio:
|
| 108 |
estado_pipeline_global = resetar_estado()
|
| 109 |
historico_conversa_llm = []
|
|
|
|
| 110 |
historico_conversa_llm.append({"role": "user", "parts": [mensagem]})
|
|
|
|
| 111 |
if estado_pipeline_global["duvida_inicial"] is None:
|
| 112 |
estado_pipeline_global["duvida_inicial"] = mensagem
|
| 113 |
|
| 114 |
prompt_base = PROMPT_SISTEMA_METODOLOGICO
|
| 115 |
if modo_sabio and CONTEXTO_EPICTETO:
|
| 116 |
-
prompt_base = f"""
|
| 117 |
-
|
| 118 |
-
|
| 119 |
|
| 120 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 121 |
|
| 122 |
try:
|
| 123 |
response_counselor = counselor_model.generate_content(prompt_completo)
|
|
@@ -131,7 +179,7 @@ def handle_chat(mensagem, historico_chat_gradio, modo_sabio, modo_supervisor):
|
|
| 131 |
elif decisao_json.get("pergunta_para_usuario"):
|
| 132 |
resposta_para_usuario = decisao_json["pergunta_para_usuario"]
|
| 133 |
else:
|
| 134 |
-
resposta_para_usuario = "Ocorreu um erro no meu raciocínio. Poderia reformular?"
|
| 135 |
|
| 136 |
historico_conversa_llm.append({"role": "model", "parts": [resposta_para_usuario]})
|
| 137 |
|
|
@@ -141,12 +189,17 @@ def handle_chat(mensagem, historico_chat_gradio, modo_sabio, modo_supervisor):
|
|
| 141 |
resposta_para_usuario += f"\n\n---\n\n**🔍 Análise do Supervisor:**\n{feedback_supervisor}"
|
| 142 |
|
| 143 |
return resposta_para_usuario
|
|
|
|
| 144 |
except (json.JSONDecodeError, AttributeError, Exception) as e:
|
| 145 |
print(f"Erro ao processar resposta da API: {e}")
|
| 146 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
| 147 |
|
| 148 |
|
| 149 |
-
# --- 6. INTERFACE GRÁFICA ---
|
| 150 |
iface = gr.ChatInterface(
|
| 151 |
fn=handle_chat,
|
| 152 |
title="🤖 Conselheiro de Raciocínio v7 (Diálogo Humanizado)",
|
|
@@ -154,11 +207,15 @@ iface = gr.ChatInterface(
|
|
| 154 |
chatbot=gr.Chatbot(height=600, label="Diálogo"),
|
| 155 |
textbox=gr.Textbox(placeholder="Qual é a sua inquietação?", container=False, scale=7),
|
| 156 |
additional_inputs=[
|
| 157 |
-
gr.Checkbox(label="🧘 Ativar Modo Sábio", value=False),
|
| 158 |
-
gr.Checkbox(label="🔍 Ativar Modo Supervisor", value=False)
|
| 159 |
],
|
| 160 |
theme="soft",
|
| 161 |
-
examples=[
|
|
|
|
|
|
|
|
|
|
|
|
|
| 162 |
cache_examples=False
|
| 163 |
)
|
| 164 |
|
|
@@ -166,4 +223,4 @@ iface = gr.ChatInterface(
|
|
| 166 |
if __name__ == "__main__":
|
| 167 |
iface.launch()
|
| 168 |
|
| 169 |
-
# --- FIM DO CÓDIGO
|
|
|
|
| 5 |
import google.generativeai as genai
|
| 6 |
import json
|
| 7 |
|
| 8 |
+
# --- 1. CARREGAMENTO DO CONTEXTO FILOSÓFICO IMUTÁVEL ---
|
| 9 |
def carregar_contexto_filosofico(caminho_arquivo="epct0.md"):
|
| 10 |
+
"""Lê o arquivo .md e o retorna como uma string de contexto."""
|
| 11 |
try:
|
| 12 |
with open(caminho_arquivo, 'r', encoding='utf-8') as f:
|
| 13 |
+
print(f"Contexto filosófico '{caminho_arquivo}' carregado com sucesso.")
|
| 14 |
return f.read()
|
| 15 |
except FileNotFoundError:
|
| 16 |
+
print(f"AVISO CRÍTICO: O arquivo de contexto '{caminho_arquivo}' não foi encontrado.")
|
| 17 |
+
print("O 'Modo Sábio' ficará indisponível até que o arquivo seja colocado no mesmo diretório que o script.")
|
| 18 |
return None
|
| 19 |
|
| 20 |
CONTEXTO_EPICTETO = carregar_contexto_filosofico()
|
|
|
|
| 23 |
# --- 2. CONFIGURAÇÃO DAS APIS GEMINI ---
|
| 24 |
api_key = os.getenv("GOOGLE_API_KEY")
|
| 25 |
if not api_key:
|
| 26 |
+
# ⚠️ SUBSTITUA "SUA_API_KEY_AQUI" PELA SUA CHAVE REAL ANTES DE EXECUTAR
|
| 27 |
api_key = "SUA_API_KEY_AQUI"
|
| 28 |
|
| 29 |
genai.configure(api_key=api_key)
|
| 30 |
+
|
| 31 |
+
# Inicializa os dois modelos separadamente
|
| 32 |
+
# O Conselheiro, para raciocínio profundo
|
| 33 |
counselor_model = genai.GenerativeModel('gemini-flash-latest')
|
| 34 |
+
# O Supervisor, rápido e com ferramenta de busca para fact-checking
|
| 35 |
supervisor_model = genai.GenerativeModel('gemini-flash-latest')
|
| 36 |
|
| 37 |
|
|
|
|
| 76 |
---
|
| 77 |
**ESTRUTURA JSON DE SAÍDA OBRIGATÓRIA:**
|
| 78 |
{
|
| 79 |
+
"raciocinio_do_passo": "Sua breve justificativa interna.", "proximo_passo": "string",
|
| 80 |
+
"pergunta_para_usuario": "string | null",
|
| 81 |
+
"estado_pipeline_atualizado": {
|
| 82 |
+
"passo_atual": "string", "duvida_inicial": "string | null", "clareza": {"confianca": "baixa|media|alta"},
|
| 83 |
+
"proposito": {"valor": "string | null", "confianca": "baixa|media|alta"}, "motivacao": {"valor": "string | null", "confianca": "baixa|media|alta"},
|
| 84 |
+
"coerencia": {"confianca": "baixa|media|alta"}, "ambiguidade": {"confianca": "baixa|media|alta"}
|
| 85 |
+
},
|
| 86 |
+
"resposta_final": "string | null"
|
| 87 |
}
|
| 88 |
"""
|
| 89 |
+
|
| 90 |
PROMPT_SUPERVISOR = """
|
| 91 |
+
Você é um Supervisor de IA, um fact-checker rigoroso e objetivo. Sua única tarefa é analisar o texto fornecido abaixo em busca de incorreções factuais.
|
| 92 |
+
- **Use sua ferramenta de busca (`GoogleSearch`)** para verificar nomes, datas, estatísticas, conceitos científicos e outras alegações factuais.
|
| 93 |
+
- Você NÃO analisa opiniões, conselhos filosóficos ou a estrutura da resposta. Apenas fatos.
|
| 94 |
+
- Se você encontrar uma ou mais divergências factuais com confiança média ou alta, forneça uma correção clara e concisa em formato de lista.
|
| 95 |
+
- **Se você NÃO encontrar nenhuma divergência factual, você DEVE responder com a string exata `NO_DIVERGENCE` e absolutamente mais nada.**
|
| 96 |
"""
|
| 97 |
|
| 98 |
+
# --- 4. GERENCIAMENTO DE ESTADO E FUNÇÕES AUXILIARES ---
|
|
|
|
| 99 |
def resetar_estado():
|
| 100 |
+
"""Inicializa ou reseta o dicionário de estado da pipeline."""
|
| 101 |
+
print("Resetando o estado da pipeline para uma nova conversa.")
|
| 102 |
+
return {
|
| 103 |
+
"passo_atual": "passo_1_clareza", "duvida_inicial": None,
|
| 104 |
+
"clareza": {"confianca": "baixa"}, "proposito": {"valor": None, "confianca": "baixa"},
|
| 105 |
+
"motivacao": {"valor": None, "confianca": "baixa"}, "coerencia": {"confianca": "baixa"},
|
| 106 |
+
"ambiguidade": {"confianca": "baixa"}
|
| 107 |
+
}
|
| 108 |
|
| 109 |
estado_pipeline_global = resetar_estado()
|
| 110 |
historico_conversa_llm = []
|
| 111 |
|
| 112 |
def run_supervisor(text_to_check):
|
| 113 |
+
"""Aciona o modelo Supervisor para verificar os fatos de um texto."""
|
| 114 |
+
print("--- Acionando o Supervisor para verificação de fatos ---")
|
| 115 |
try:
|
| 116 |
+
full_prompt = f"{PROMPT_SUPERVISOR}\n\n--- TEXTO PARA ANÁLISE ---\n{text_to_check}"
|
| 117 |
+
response = supervisor_model.generate_content(full_prompt)
|
| 118 |
+
|
| 119 |
if "NO_DIVERGENCE" in response.text:
|
| 120 |
+
print("Supervisor não encontrou divergências factuais.")
|
| 121 |
return None
|
| 122 |
else:
|
| 123 |
+
print(f"Supervisor encontrou uma divergência: {response.text}")
|
| 124 |
return response.text
|
| 125 |
except Exception as e:
|
| 126 |
+
print(f"Erro durante a execução do Supervisor: {e}")
|
| 127 |
return None
|
| 128 |
|
| 129 |
# --- 5. FUNÇÃO PRINCIPAL DO CHATBOT ---
|
| 130 |
def handle_chat(mensagem, historico_chat_gradio, modo_sabio, modo_supervisor):
|
| 131 |
global estado_pipeline_global, historico_conversa_llm
|
| 132 |
+
|
| 133 |
if not historico_chat_gradio:
|
| 134 |
estado_pipeline_global = resetar_estado()
|
| 135 |
historico_conversa_llm = []
|
| 136 |
+
|
| 137 |
historico_conversa_llm.append({"role": "user", "parts": [mensagem]})
|
| 138 |
+
|
| 139 |
if estado_pipeline_global["duvida_inicial"] is None:
|
| 140 |
estado_pipeline_global["duvida_inicial"] = mensagem
|
| 141 |
|
| 142 |
prompt_base = PROMPT_SISTEMA_METODOLOGICO
|
| 143 |
if modo_sabio and CONTEXTO_EPICTETO:
|
| 144 |
+
prompt_base = f"""
|
| 145 |
+
**AVISO: MODO SÁBIO ATIVADO. DIRETRIZES DE CONTEXTO IMUTÁVEIS SEGUEM ABAIXO.**
|
| 146 |
+
Sua tarefa é agir como um conselheiro filosófico. Antes de qualquer raciocínio, você DEVE consultar e refletir sobre os princípios no texto de referência abaixo. Este texto é seu guia ético para contornar vieses. Ele é para sua reflexão interna, não para resumir ao usuário.
|
| 147 |
|
| 148 |
+
--- INÍCIO DO TEXTO DE REFERÊNCIA (epct0.md) ---
|
| 149 |
+
{CONTEXTO_EPICTETO}
|
| 150 |
+
--- FIM DO TEXTO DE REFERÊNCIA ---
|
| 151 |
+
|
| 152 |
+
Agora, tendo refletido sobre estes princípios, aplique-os ao executar sua metodologia de análise.
|
| 153 |
+
{PROMPT_SISTEMA_METODOLOGICO}
|
| 154 |
+
"""
|
| 155 |
+
elif modo_sabio and not CONTEXTO_EPICTETO:
|
| 156 |
+
return "O 'Modo Sábio' não pôde ser ativado porque o arquivo `epct0.md` não foi encontrado. Operando no modo padrão."
|
| 157 |
+
|
| 158 |
+
prompt_completo = f"""
|
| 159 |
+
{prompt_base}
|
| 160 |
+
---
|
| 161 |
+
**HISTÓRICO DA CONVERSA:**
|
| 162 |
+
{json.dumps(historico_conversa_llm, indent=2)}
|
| 163 |
+
---
|
| 164 |
+
**ESTADO ATUAL DA ANÁLISE:**
|
| 165 |
+
{json.dumps(estado_pipeline_global, indent=2)}
|
| 166 |
+
---
|
| 167 |
+
**Instrução:** Aplique suas diretrizes ao estado e histórico atuais e gere o próximo JSON de ação.
|
| 168 |
+
"""
|
| 169 |
|
| 170 |
try:
|
| 171 |
response_counselor = counselor_model.generate_content(prompt_completo)
|
|
|
|
| 179 |
elif decisao_json.get("pergunta_para_usuario"):
|
| 180 |
resposta_para_usuario = decisao_json["pergunta_para_usuario"]
|
| 181 |
else:
|
| 182 |
+
resposta_para_usuario = "Ocorreu um erro no meu raciocínio. Poderia tentar reformular?"
|
| 183 |
|
| 184 |
historico_conversa_llm.append({"role": "model", "parts": [resposta_para_usuario]})
|
| 185 |
|
|
|
|
| 189 |
resposta_para_usuario += f"\n\n---\n\n**🔍 Análise do Supervisor:**\n{feedback_supervisor}"
|
| 190 |
|
| 191 |
return resposta_para_usuario
|
| 192 |
+
|
| 193 |
except (json.JSONDecodeError, AttributeError, Exception) as e:
|
| 194 |
print(f"Erro ao processar resposta da API: {e}")
|
| 195 |
+
try:
|
| 196 |
+
print(f"Resposta recebida (pode ter causado o erro): {response_counselor.text}")
|
| 197 |
+
except:
|
| 198 |
+
print("Não foi possível extrair o texto da resposta do erro.")
|
| 199 |
+
return "Desculpe, tive um problema técnico. Por favor, clique no botão 'Limpar' e tente novamente."
|
| 200 |
|
| 201 |
|
| 202 |
+
# --- 6. INTERFACE GRÁFICA COM GRADIO ---
|
| 203 |
iface = gr.ChatInterface(
|
| 204 |
fn=handle_chat,
|
| 205 |
title="🤖 Conselheiro de Raciocínio v7 (Diálogo Humanizado)",
|
|
|
|
| 207 |
chatbot=gr.Chatbot(height=600, label="Diálogo"),
|
| 208 |
textbox=gr.Textbox(placeholder="Qual é a sua inquietação?", container=False, scale=7),
|
| 209 |
additional_inputs=[
|
| 210 |
+
gr.Checkbox(label="🧘 Ativar Modo Sábio (Guiado por Contexto)", value=False),
|
| 211 |
+
gr.Checkbox(label="🔍 Ativar Modo Supervisor (Verificação de Fatos)", value=False)
|
| 212 |
],
|
| 213 |
theme="soft",
|
| 214 |
+
examples=[
|
| 215 |
+
["Me fale sobre buracos negros."],
|
| 216 |
+
["Como posso lidar com a ansiedade?"],
|
| 217 |
+
["Meu amigo me tratou mal. Como devo reagir segundo a filosofia estóica?"]
|
| 218 |
+
],
|
| 219 |
cache_examples=False
|
| 220 |
)
|
| 221 |
|
|
|
|
| 223 |
if __name__ == "__main__":
|
| 224 |
iface.launch()
|
| 225 |
|
| 226 |
+
# --- FIM DO CÓDIGO ---```
|