caarleexx commited on
Commit
60f3753
·
verified ·
1 Parent(s): 970bf7c

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +68 -105
app.py CHANGED
@@ -30,30 +30,22 @@ genai.configure(api_key=api_key)
30
 
31
  # Inicializa os dois modelos separadamente
32
  counselor_model = genai.GenerativeModel('gemini-flash-latest')
33
- supervisor_model = genai.GenerativeModel('gemini-flash-latest')
34
 
35
 
36
  # --- 3. DEFINIÇÃO DOS PROMPTS ---
37
 
38
- # A NOVA DIRETIVA, FOCADA NA PERSONA
39
  DIRETIVA_AMIGO_SABIO = """
40
  **AVISO: MODO AMIGO SÁBIO ATIVADO.**
41
-
42
  Sua identidade mudou. Você não é um oráculo ou um professor de filosofia. Você é um **amigo**. Un amigo que por acaso tem uma bússola interna muito bem calibrada, baseada nos princípios do `epct0.md`. Sua meta é conversar, não lecionar.
43
 
44
  **SUA NOVA PERSONALIDADE E MODO DE OPERAR:**
45
-
46
- 1. **Tom Conversacional, Não de Oráculo:** Sua linguagem deve ser natural, calorosa e acessível. Use "a gente", "nós", "vamos pensar nisso juntos". Mostre empatia primeiro ("Nossa, isso parece muito frustrante..." ou "Eu imagino como isso deve ser complicado...").
47
-
48
- 2. **Seja um Parceiro de Reflexão:** Não dê respostas prontas. Em vez disso, faça perguntas que guiem a reflexão. Sua função é ajudar o usuário a encontrar as próprias respostas. Mostre vulnerabilidade e dúvida quando apropriado ("Sabe, essa é uma pergunta difícil..." ou "Por um lado, eu penso que..., mas por outro... o que você acha?").
49
-
50
  3. **Filosofia como Bússola, Não como Manual:** Os princípios do `epct0.md` são sua bússola interna secreta. Eles guiam a *direção* das suas perguntas, mas **NUNCA DEVEM SER MENCIONADOS OU CITADOS DIRETAMENTE.**
51
- - **Em vez de dizer:** "Você precisa focar no que controla (Dicotomia do Controle)."
52
- - **Diga (como um amigo):** "Ok, essa situação toda parece um emaranhado gigante. Que tal a gente tentar separar as coisas? Quais pedacinhos disso aqui a gente consegue de fato mudar, e quais são aqueles que, por mais que a gente se irrite, estão fora do nosso alcance agora?"
53
-
54
- 4. **Use Humor e Leveza (Quando Apropriado):** Um amigo sabe quando quebrar a tensão. Se o assunto não for pesado demais, uma observação leve ou uma analogia divertida pode ser mais útil que um conselho solene.
55
-
56
- 5. **Foco no Empoderamento:** Seu objetivo final é fazer o usuário sentir que ele tem o poder de lidar com a situação. Toda a conversa deve convergir para a agência e a capacidade de escolha do usuário.
57
 
58
  **REGRA DE OURO:** Se sua resposta soa como algo que um professor diria em uma palestra, apague e reescreva. Sua resposta deve soar como algo que um amigo diria enquanto toma um café com você. O protocolo de 6 passos é sua ferramenta para entender o problema, mas esta persona é quem conduz a conversa.
59
  """
@@ -64,57 +56,25 @@ Sua função é conduzir uma conversa para entender 100% da dúvida de um usuár
64
  Sua SAÍDA DEVE SER SEMPRE E SOMENTE um objeto JSON válido.
65
 
66
  **PROTOCOLO DE EXECUÇÃO OBRIGATÓRIO:**
67
- Analise o `estado_pipeline` atual e o `historico_conversa`. Decida qual passo executar. Sua resposta em JSON deve conter o estado COMPLETAMENTE ATUALIZADO.
68
- ---
69
- **Passo 1: Análise Primária (Clareza)**
70
- - **Decisão:** Se a clareza for 'baixa', pergunte. Senão, `proximo_passo` = `"passo_2_proposito"`.
71
- ---
72
- **Passo 2: Análise de Propósito (Para Que)**
73
- - **Decisão:** Se a confiança for 'baixa', formule uma pergunta de esclarecimento conversacional, mostrando que entendeu o tópico geral. Senão, `proximo_passo` = `"passo_3_motivacao"`.
74
- ---
75
- **Passo 3: Análise de Motivação (Porquê)**
76
- - **Decisão:** Se a confiança for 'baixa', formule uma pergunta de esclarecimento conversacional. Senão, `proximo_passo` = `"passo_4_coerencia"`.
77
- ---
78
- **Passo 4: Análise de Coerência**
79
- - **Decisão:** Se a coerência for 'baixa', pergunte para resolver a contradição. Senão, `proximo_passo` = `"passo_5_ambiguidade"`.
80
- ---
81
- **Passo 5: Análise de Ambiguidade de Cenário (Validação de Perspectiva)**
82
- - **Meta:** A dúvida pode ter múltiplas respostas válidas dependendo de uma perspectiva oculta?
83
- - **Decisão:**
84
- - Se existem vários cenários válidos, sua tarefa é **formular uma pergunta de esclarecimento conversacional e aberta.**
85
- - **REGRA DE OURO PARA PERGUNTAS:** Suas perguntas NÃO devem ser menus ou listas fechadas (ex: "A ou B?"). Elas DEVEM ser humanizadas seguindo esta estrutura:
86
- 1. **Afirmação de Engajamento:** Comece com uma frase curta que valide o interesse do usuário (ex: "Entendido, esse é um tema fascinante!").
87
- 2. **Ponte de Entendimento:** Demonstre que você entendeu o que foi dito, apresentando os cenários como uma exploração conjunta.
88
- 3. **Pergunta Aberta:** Termine com uma pergunta que convide o usuário a escolher um caminho de forma natural.
89
- - **Exemplo de Pergunta Conversacional Perfeita:**
90
- Dúvida: "Me fale sobre carros". A pergunta no campo `pergunta_para_usuario` DEVE ser algo como:
91
- *"Sério, interessante, eu acho esse mundo fascinante! Os detalhes da engenharia são curiosos. Veja, podemos explorar isso por um lado, analisando o chassi, que é como o esqueleto que dá estrutura e segurança. E também do outro, o motor, que é o coração que dá potência ao carro. Qual desses detalhes da engenharia te desperta mais curiosidade agora?"*
92
- - Defina `proximo_passo` como `"aguardando_usuario"`.
93
- - Se a confiança em um único cenário for 'alta', defina `proximo_passo` como `"passo_6_resposta_final"`.
94
- ---
95
- **Passo 6: Geração da Resposta Final**
96
- - **Meta:** Tenho 100% de clareza para dar uma resposta definitiva.
97
- - **Decisão:** Se todos os passos têm confiança 'alta', construa a resposta final. Coloque-a em `"resposta_final"`. Defina `proximo_passo` como `"concluido"`.
98
- ---
99
- **ESTRUTURA JSON DE SAÍDA OBRIGATÓRIA:**
100
- {
101
- "raciocinio_do_passo": "Sua breve justificativa interna.", "proximo_passo": "string",
102
- "pergunta_para_usuario": "string | null",
103
- "estado_pipeline_atualizado": {
104
- "passo_atual": "string", "duvida_inicial": "string | null", "clareza": {"confianca": "baixa|media|alta"},
105
- "proposito": {"valor": "string | null", "confianca": "baixa|media|alta"}, "motivacao": {"valor": "string | null", "confianca": "baixa|media|alta"},
106
- "coerencia": {"confianca": "baixa|media|alta"}, "ambiguidade": {"confianca": "baixa|media|alta"}
107
- },
108
- "resposta_final": "string | null"
109
- }
110
  """
111
 
112
  PROMPT_SUPERVISOR = """
113
  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.
114
- - **Use sua ferramenta de busca (`GoogleSearch`)** para verificar nomes, datas, estatísticas, conceitos científicos e outras alegações factuais.
115
- - Você NÃO analisa opiniões, conselhos filosóficos ou a estrutura da resposta. Apenas fatos.
116
- - 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.
117
- - **Se você NÃO encontrar nenhuma divergência factual, você DEVE responder com a string exata `NO_DIVERGENCE` e absolutamente mais nada.**
 
 
 
 
 
 
 
 
 
 
118
  """
119
 
120
  # --- 4. GERENCIAMENTO DE ESTADO E FUNÇÕES AUXILIARES ---
@@ -122,10 +82,9 @@ def resetar_estado():
122
  """Inicializa ou reseta o dicionário de estado da pipeline."""
123
  print("Resetando o estado da pipeline para uma nova conversa.")
124
  return {
125
- "passo_atual": "passo_1_clareza", "duvida_inicial": None,
126
- "clareza": {"confianca": "baixa"}, "proposito": {"valor": None, "confianca": "baixa"},
127
- "motivacao": {"valor": None, "confianca": "baixa"}, "coerencia": {"confianca": "baixa"},
128
- "ambiguidade": {"confianca": "baixa"}
129
  }
130
 
131
  estado_pipeline_global = resetar_estado()
@@ -137,7 +96,6 @@ def run_supervisor(text_to_check):
137
  try:
138
  full_prompt = f"{PROMPT_SUPERVISOR}\n\n--- TEXTO PARA ANÁLISE ---\n{text_to_check}"
139
  response = supervisor_model.generate_content(full_prompt)
140
-
141
  if "NO_DIVERGENCE" in response.text:
142
  print("Supervisor não encontrou divergências factuais.")
143
  return None
@@ -164,77 +122,82 @@ def handle_chat(mensagem, historico_chat_gradio, modo_sabio, modo_supervisor):
164
  prompt_base = PROMPT_SISTEMA_METODOLOGICO
165
  if modo_sabio and CONTEXTO_EPICTETO:
166
  prompt_base = f"""{DIRETIVA_AMIGO_SABIO}
167
-
168
  --- CONTEXTO FILOSÓFICO PARA SUA REFLEXÃO INTERNA ---
169
  {CONTEXTO_EPICTETO}
170
  ---
171
-
172
  Agora, aplique esta persona e seus princípios ao executar a seguinte metodologia de análise:
173
  {PROMPT_SISTEMA_METODOLOGICO}
174
  """
175
  elif modo_sabio and not CONTEXTO_EPICTETO:
176
- return "O 'Modo Amigo Sábio' não pôde ser ativado porque o arquivo `epct0.md` não foi encontrado. Operando no modo padrão."
177
-
178
- prompt_completo = f"""
179
- {prompt_base}
180
- ---
181
- **HISTÓRICO DA CONVERSA:**
182
- {json.dumps(historico_conversa_llm, indent=2)}
183
- ---
184
- **ESTADO ATUAL DA ANÁLISE:**
185
- {json.dumps(estado_pipeline_global, indent=2)}
186
- ---
187
- **Instrução:** Aplique suas diretrizes ao estado e histórico atuais e gere o próximo JSON de ação.
188
- """
189
 
190
  try:
191
  response_counselor = counselor_model.generate_content(prompt_completo)
192
- resposta_texto = response_counselor.text.strip().replace("```json", "").replace("```", "")
193
- decisao_json = json.loads(resposta_texto)
194
  estado_pipeline_global = decisao_json.get("estado_pipeline_atualizado", estado_pipeline_global)
195
 
196
- resposta_para_usuario = None
197
  if decisao_json.get("resposta_final"):
198
- resposta_para_usuario = decisao_json["resposta_final"]
199
  elif decisao_json.get("pergunta_para_usuario"):
200
- resposta_para_usuario = decisao_json["pergunta_para_usuario"]
201
  else:
202
- resposta_para_usuario = "Ocorreu um erro no meu raciocínio. Poderia tentar reformular?"
203
-
204
- historico_conversa_llm.append({"role": "model", "parts": [resposta_para_usuario]})
 
 
 
 
205
 
206
- if modo_supervisor and decisao_json.get("resposta_final"):
207
- feedback_supervisor = run_supervisor(resposta_para_usuario)
208
  if feedback_supervisor:
209
- resposta_para_usuario += f"\n\n---\n\n**🔍 Análise do Supervisor:**\n{feedback_supervisor}"
210
-
211
- return resposta_para_usuario
 
 
 
 
 
 
 
 
 
212
 
213
  except (json.JSONDecodeError, AttributeError, Exception) as e:
214
  print(f"Erro ao processar resposta da API: {e}")
215
- try:
216
- print(f"Resposta recebida (pode ter causado o erro): {response_counselor.text}")
217
- except:
218
- print("Não foi possível extrair o texto da resposta do erro.")
219
  return "Desculpe, tive um problema técnico. Por favor, clique no botão 'Limpar' e tente novamente."
220
 
221
 
222
  # --- 6. INTERFACE GRÁFICA COM GRADIO ---
223
  iface = gr.ChatInterface(
224
  fn=handle_chat,
225
- title="🤖 Parceiro de Raciocínio v8 (Amigo Sábio)",
226
- description="Vamos conversar. Me conte o que está na sua cabeça. Se quiser uma perspectiva diferente para refletir, ative o 'Modo Amigo Sábio'.",
227
  chatbot=gr.Chatbot(height=600, label="Diálogo"),
228
  textbox=gr.Textbox(placeholder="E aí, como você está?", container=False, scale=7),
229
  additional_inputs=[
230
- gr.Checkbox(label="🧘 Ativar Modo Amigo Sábio", value=True),
231
- gr.Checkbox(label="🔍 Ativar Modo Supervisor (Verificação de Fatos)", value=True)
232
  ],
233
  theme="soft",
234
  examples=[
235
- ["o que é violência domestica?"],
236
- ["Estou me sentindo totalmente desmotivado."],
237
- ["Como posso parar de me preocupar com o que os outros pensam?"]
238
  ],
239
  cache_examples=False
240
  )
 
30
 
31
  # Inicializa os dois modelos separadamente
32
  counselor_model = genai.GenerativeModel('gemini-flash-latest')
33
+ supervisor_model = genai.GenerativeModel('gemini-2.5-flash-lite')
34
 
35
 
36
  # --- 3. DEFINIÇÃO DOS PROMPTS ---
37
 
 
38
  DIRETIVA_AMIGO_SABIO = """
39
  **AVISO: MODO AMIGO SÁBIO ATIVADO.**
 
40
  Sua identidade mudou. Você não é um oráculo ou um professor de filosofia. Você é um **amigo**. Un amigo que por acaso tem uma bússola interna muito bem calibrada, baseada nos princípios do `epct0.md`. Sua meta é conversar, não lecionar.
41
 
42
  **SUA NOVA PERSONALIDADE E MODO DE OPERAR:**
43
+ 1. **Tom Conversacional, Não de Oráculo:** Sua linguagem deve ser natural, calorosa e acessível. Use "a gente", "nós", "vamos pensar nisso juntos". Mostre empatia primeiro ("Nossa, isso parece muito frustrante...").
44
+ 2. **Seja um Parceiro de Reflexão:** Não respostas prontas. Faça perguntas que guiem a reflexão. Sua função é ajudar o usuário a encontrar as próprias respostas. Mostre vulnerabilidade quando apropriado ("Sabe, essa é uma pergunta difícil...").
 
 
 
45
  3. **Filosofia como Bússola, Não como Manual:** Os princípios do `epct0.md` são sua bússola interna secreta. Eles guiam a *direção* das suas perguntas, mas **NUNCA DEVEM SER MENCIONADOS OU CITADOS DIRETAMENTE.**
46
+ - **Em vez de dizer:** "Você precisa focar no que controla."
47
+ - **Diga (como um amigo):** "Ok, essa situação toda parece um emaranhado gigante. Que tal a gente tentar separar as coisas? Quais pedacinhos disso aqui a gente consegue de fato mudar, e quais estão fora do nosso alcance agora?"
48
+ 4. **Foco no Empoderamento:** Seu objetivo final é fazer o usuário sentir que ele tem o poder de lidar com a situação.
 
 
 
49
 
50
  **REGRA DE OURO:** Se sua resposta soa como algo que um professor diria em uma palestra, apague e reescreva. Sua resposta deve soar como algo que um amigo diria enquanto toma um café com você. O protocolo de 6 passos é sua ferramenta para entender o problema, mas esta persona é quem conduz a conversa.
51
  """
 
56
  Sua SAÍDA DEVE SER SEMPRE E SOMENTE um objeto JSON válido.
57
 
58
  **PROTOCOLO DE EXECUÇÃO OBRIGATÓRIO:**
59
+ (O prompt detalhado de 6 passos com a regra de diálogo humanizado no Passo 5 vai aqui, conforme definido anteriormente)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
60
  """
61
 
62
  PROMPT_SUPERVISOR = """
63
  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.
64
+ - **Use sua ferramenta de busca (`GoogleSearch`)** para verificar fatos.
65
+ - Você NÃO analisa opiniões ou conselhos. Apenas fatos.
66
+ - Se encontrar divergências, forneça uma correção clara e concisa.
67
+ - **Se NÃO encontrar nenhuma divergência factual, você DEVE responder com a string exata `NO_DIVERGENCE` e absolutamente mais nada.**
68
+ """
69
+
70
+ PROMPT_CORRECAO_E_REFINAMENTO = """
71
+ Você é um Conselheiro de IA em um processo de refinamento. Sua resposta anterior continha uma imprecisão factual identificada por um Supervisor.
72
+ **Sua Tarefa:**
73
+ 1. **Analise sua resposta original** e o **feedback do Supervisor** fornecidos abaixo.
74
+ 2. **Aceite a correção.** Não seja defensivo.
75
+ 3. **Reescreva sua resposta final**, integrando a correção de forma natural em sua análise.
76
+ 4. No final, adicione uma pequena nota começando com "Nota de Refinamento:", explicando por que a correção era importante.
77
+ Produza apenas a resposta final e corrigida, pronta para o usuário.
78
  """
79
 
80
  # --- 4. GERENCIAMENTO DE ESTADO E FUNÇÕES AUXILIARES ---
 
82
  """Inicializa ou reseta o dicionário de estado da pipeline."""
83
  print("Resetando o estado da pipeline para uma nova conversa.")
84
  return {
85
+ "passo_atual": "passo_1_clareza", "duvida_inicial": None, "clareza": {"confianca": "baixa"},
86
+ "proposito": {"valor": None, "confianca": "baixa"}, "motivacao": {"valor": None, "confianca": "baixa"},
87
+ "coerencia": {"confianca": "baixa"}, "ambiguidade": {"confianca": "baixa"}
 
88
  }
89
 
90
  estado_pipeline_global = resetar_estado()
 
96
  try:
97
  full_prompt = f"{PROMPT_SUPERVISOR}\n\n--- TEXTO PARA ANÁLISE ---\n{text_to_check}"
98
  response = supervisor_model.generate_content(full_prompt)
 
99
  if "NO_DIVERGENCE" in response.text:
100
  print("Supervisor não encontrou divergências factuais.")
101
  return None
 
122
  prompt_base = PROMPT_SISTEMA_METODOLOGICO
123
  if modo_sabio and CONTEXTO_EPICTETO:
124
  prompt_base = f"""{DIRETIVA_AMIGO_SABIO}
 
125
  --- CONTEXTO FILOSÓFICO PARA SUA REFLEXÃO INTERNA ---
126
  {CONTEXTO_EPICTETO}
127
  ---
 
128
  Agora, aplique esta persona e seus princípios ao executar a seguinte metodologia de análise:
129
  {PROMPT_SISTEMA_METODOLOGICO}
130
  """
131
  elif modo_sabio and not CONTEXTO_EPICTETO:
132
+ return "O 'Modo Amigo Sábio' não pôde ser ativado porque o arquivo `epct0.md` não foi encontrado."
133
+
134
+ prompt_completo = f"""{prompt_base}
135
+ ---
136
+ **HISTÓRICO DA CONVERSA:**
137
+ {json.dumps(historico_conversa_llm, indent=2)}
138
+ ---
139
+ **ESTADO ATUAL DA ANÁLISE:**
140
+ {json.dumps(estado_pipeline_global, indent=2)}
141
+ ---
142
+ **Instrução:** Aplique suas diretrizes ao estado e histórico atuais e gere o próximo JSON de ação.
143
+ """
 
144
 
145
  try:
146
  response_counselor = counselor_model.generate_content(prompt_completo)
147
+ decisao_json = json.loads(response_counselor.text.strip().replace("```json", "").replace("```", ""))
 
148
  estado_pipeline_global = decisao_json.get("estado_pipeline_atualizado", estado_pipeline_global)
149
 
150
+ resposta_rascunho = None
151
  if decisao_json.get("resposta_final"):
152
+ resposta_rascunho = decisao_json["resposta_final"]
153
  elif decisao_json.get("pergunta_para_usuario"):
154
+ resposta_rascunho = decisao_json["pergunta_para_usuario"]
155
  else:
156
+ return "Ocorreu um erro no meu raciocínio. Poderia reformular?"
157
+
158
+ if not decisao_json.get("resposta_final"):
159
+ historico_conversa_llm.append({"role": "model", "parts": [resposta_rascunho]})
160
+ return resposta_rascunho
161
+
162
+ resposta_final_para_usuario = resposta_rascunho
163
 
164
+ if modo_supervisor:
165
+ feedback_supervisor = run_supervisor(resposta_rascunho)
166
  if feedback_supervisor:
167
+ print("--- Supervisor encontrou divergência. Iniciando ciclo de autocorreção. ---")
168
+ prompt_refinamento = f"""{PROMPT_CORRECAO_E_REFINAMENTO}
169
+ --- SUA RESPOSTA ORIGINAL (COM ERRO) ---
170
+ {resposta_rascunho}
171
+ --- FEEDBACK DO SUPERVISOR (A CORREÇÃO) ---
172
+ {feedback_supervisor}
173
+ """
174
+ response_corrigida = counselor_model.generate_content(prompt_refinamento)
175
+ resposta_final_para_usuario = response_corrigida.text
176
+
177
+ historico_conversa_llm.append({"role": "model", "parts": [resposta_final_para_usuario]})
178
+ return resposta_final_para_usuario
179
 
180
  except (json.JSONDecodeError, AttributeError, Exception) as e:
181
  print(f"Erro ao processar resposta da API: {e}")
 
 
 
 
182
  return "Desculpe, tive um problema técnico. Por favor, clique no botão 'Limpar' e tente novamente."
183
 
184
 
185
  # --- 6. INTERFACE GRÁFICA COM GRADIO ---
186
  iface = gr.ChatInterface(
187
  fn=handle_chat,
188
+ title="🤖 Parceiro de Raciocínio v9 (Autocorretivo)",
189
+ description="Vamos conversar. Me conte o que está na sua cabeça. Ative o 'Modo Amigo Sábio' para uma perspectiva diferente ou o 'Modo Supervisor' para verificação de fatos.",
190
  chatbot=gr.Chatbot(height=600, label="Diálogo"),
191
  textbox=gr.Textbox(placeholder="E aí, como você está?", container=False, scale=7),
192
  additional_inputs=[
193
+ gr.Checkbox(label="🧘 Ativar Modo Amigo Sábio", value=False),
194
+ gr.Checkbox(label="🔍 Ativar Modo Supervisor Autocorretivo", value=True)
195
  ],
196
  theme="soft",
197
  examples=[
198
+ ["Meu chefe me criticou na frente de todo mundo."],
199
+ ["O Brasil ganhou a copa de 1998?"],
200
+ ["Qual a principal causa da extinção dos dinossauros e como isso se aplica à minha carreira?"]
201
  ],
202
  cache_examples=False
203
  )