caarleexx commited on
Commit
04bcc0f
·
verified ·
1 Parent(s): 7bb9ee0

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +84 -27
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. Modo Sábio indisponível.")
 
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": "...", "proximo_passo": "...", "pergunta_para_usuario": "...",
74
- "estado_pipeline_atualizado": { ... }, "resposta_final": "..."
 
 
 
 
 
 
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, usando sua ferramenta de busca. Se encontrar divergências, liste as correções. Se não encontrar, responda EXATAMENTE `NO_DIVERGENCE`.
 
 
 
 
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
- print("Resetando o estado da pipeline.")
85
- return {"passo_atual": "passo_1_clareza", "duvida_inicial": None, "clareza": {"confianca": "baixa"}, "proposito": {"valor": None, "confianca": "baixa"}, "motivacao": {"valor": None, "confianca": "baixa"}, "coerencia": {"confianca": "baixa"}, "ambiguidade": {"confianca": "baixa"}}
 
 
 
 
 
 
86
 
87
  estado_pipeline_global = resetar_estado()
88
  historico_conversa_llm = []
89
 
90
  def run_supervisor(text_to_check):
91
- print("--- Acionando o Supervisor ---")
 
92
  try:
93
- response = supervisor_model.generate_content(f"{PROMPT_SUPERVISOR}\n\n--- TEXTO PARA ANÁLISE ---\n{text_to_check}")
 
 
94
  if "NO_DIVERGENCE" in response.text:
95
- print("Supervisor: Nenhuma divergência encontrada.")
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 no Supervisor: {e}")
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"""**AVISO: MODO SÁBIO ATIVADO.** Sua tarefa é agir como um conselheiro filosófico, refletindo sobre os princípios no texto de referência abaixo antes de qualquer raciocínio. Este texto é seu guia ético para contornar vieses.\n\n--- INÍCIO DO TEXTO DE REFERÊNCIA ---\n{CONTEXTO_EPICTETO}\n--- FIM DO TEXTO DE REFERÊNCIA ---\n\nAgora, aplique estes princípios ao executar sua metodologia de análise.\n{PROMPT_SISTEMA_METODOLOGICO}"""
117
- elif modo_sabio and not CONTEXTO_EPICTETO:
118
- return "O 'Modo Sábio' não pôde ser ativado porque `epct0.md` não foi encontrado."
119
 
120
- prompt_completo = f"""{prompt_base}\n---\n**HISTÓRICO DA CONVERSA:**\n{json.dumps(historico_conversa_llm, indent=2)}\n---\n**ESTADO ATUAL DA ANÁLISE:**\n{json.dumps(estado_pipeline_global, indent=2)}\n---\n**Instrução:** Gere o próximo JSON de ação."""
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
- return "Desculpe, tive um problema técnico. Por favor, clique em 'Limpar' e tente novamente."
 
 
 
 
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=[["Me fale sobre buracos negros."], ["Como posso lidar com a ansiedade?"]],
 
 
 
 
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 ---```