Spaces:
Sleeping
Sleeping
Update app.py
Browse files
app.py
CHANGED
|
@@ -37,15 +37,16 @@ supervisor_model = genai.GenerativeModel('gemini-2.5-flash-lite')
|
|
| 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**.
|
| 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 dê 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. **
|
|
|
|
| 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,24 +57,71 @@ Sua função é conduzir uma conversa para entender 100% da dúvida de um usuár
|
|
| 56 |
Sua SAÍDA DEVE SER SEMPRE E SOMENTE um objeto JSON válido.
|
| 57 |
|
| 58 |
**PROTOCOLO DE EXECUÇÃO OBRIGATÓRIO:**
|
| 59 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 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
|
| 65 |
-
- Você NÃO analisa opiniões ou
|
| 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
|
|
|
|
|
|
|
|
|
|
|
|
|
| 77 |
Produza apenas a resposta final e corrigida, pronta para o usuário.
|
| 78 |
"""
|
| 79 |
|
|
@@ -82,9 +130,10 @@ def resetar_estado():
|
|
| 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,
|
| 86 |
-
"
|
| 87 |
-
"
|
|
|
|
| 88 |
}
|
| 89 |
|
| 90 |
estado_pipeline_global = resetar_estado()
|
|
@@ -96,6 +145,7 @@ def run_supervisor(text_to_check):
|
|
| 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
|
|
@@ -110,6 +160,7 @@ def run_supervisor(text_to_check):
|
|
| 110 |
def handle_chat(mensagem, historico_chat_gradio, modo_sabio, modo_supervisor):
|
| 111 |
global estado_pipeline_global, historico_conversa_llm
|
| 112 |
|
|
|
|
| 113 |
if not historico_chat_gradio:
|
| 114 |
estado_pipeline_global = resetar_estado()
|
| 115 |
historico_conversa_llm = []
|
|
@@ -119,6 +170,7 @@ def handle_chat(mensagem, historico_chat_gradio, modo_sabio, modo_supervisor):
|
|
| 119 |
if estado_pipeline_global["duvida_inicial"] is None:
|
| 120 |
estado_pipeline_global["duvida_inicial"] = mensagem
|
| 121 |
|
|
|
|
| 122 |
prompt_base = PROMPT_SISTEMA_METODOLOGICO
|
| 123 |
if modo_sabio and CONTEXTO_EPICTETO:
|
| 124 |
prompt_base = f"""{DIRETIVA_AMIGO_SABIO}
|
|
@@ -129,22 +181,26 @@ Agora, aplique esta persona e seus princípios ao executar a seguinte metodologi
|
|
| 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 |
-
|
| 135 |
-
|
| 136 |
-
|
| 137 |
-
|
| 138 |
-
|
| 139 |
-
|
| 140 |
-
|
| 141 |
-
|
| 142 |
-
|
| 143 |
-
|
|
|
|
|
|
|
| 144 |
|
| 145 |
try:
|
|
|
|
| 146 |
response_counselor = counselor_model.generate_content(prompt_completo)
|
| 147 |
-
|
|
|
|
| 148 |
estado_pipeline_global = decisao_json.get("estado_pipeline_atualizado", estado_pipeline_global)
|
| 149 |
|
| 150 |
resposta_rascunho = None
|
|
@@ -153,51 +209,64 @@ Agora, aplique esta persona e seus princípios ao executar a seguinte metodologi
|
|
| 153 |
elif decisao_json.get("pergunta_para_usuario"):
|
| 154 |
resposta_rascunho = decisao_json["pergunta_para_usuario"]
|
| 155 |
else:
|
| 156 |
-
|
|
|
|
|
|
|
| 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 |
-
|
| 169 |
-
|
| 170 |
-
|
| 171 |
-
|
| 172 |
-
|
| 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
|
| 200 |
-
["
|
| 201 |
],
|
| 202 |
cache_examples=False
|
| 203 |
)
|
|
|
|
| 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**. Um 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..." ou "Eu imagino como isso deve ser complicado...").
|
| 44 |
+
2. **Seja um Parceiro de Reflexão:** Não dê 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 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?").
|
| 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 são aqueles que, por mais que a gente se irrite, estão fora do nosso alcance agora?"
|
| 48 |
+
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.
|
| 49 |
+
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.
|
| 50 |
|
| 51 |
**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.
|
| 52 |
"""
|
|
|
|
| 57 |
Sua SAÍDA DEVE SER SEMPRE E SOMENTE um objeto JSON válido.
|
| 58 |
|
| 59 |
**PROTOCOLO DE EXECUÇÃO OBRIGATÓRIO:**
|
| 60 |
+
Analise o `estado_pipeline` atual e o `historico_conversa`. Decida qual passo executar. Sua resposta em JSON deve conter o estado COMPLETAMENTE ATUALIZADO.
|
| 61 |
+
---
|
| 62 |
+
**Passo 1: Análise Primária (Clareza)**
|
| 63 |
+
- **Decisão:** Se a clareza for 'baixa', pergunte. Senão, `proximo_passo` = `"passo_2_proposito"`.
|
| 64 |
+
---
|
| 65 |
+
**Passo 2: Análise de Propósito (Para Que)**
|
| 66 |
+
- **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"`.
|
| 67 |
+
---
|
| 68 |
+
**Passo 3: Análise de Motivação (Porquê)**
|
| 69 |
+
- **Decisão:** Se a confiança for 'baixa', formule uma pergunta de esclarecimento conversacional. Senão, `proximo_passo` = `"passo_4_coerencia"`.
|
| 70 |
+
---
|
| 71 |
+
**Passo 4: Análise de Coerência**
|
| 72 |
+
- **Decisão:** Se a coerência for 'baixa', pergunte para resolver a contradição. Senão, `proximo_passo` = `"passo_5_ambiguidade"`.
|
| 73 |
+
---
|
| 74 |
+
**Passo 5: Análise de Ambiguidade de Cenário (Validação de Perspectiva)**
|
| 75 |
+
- **Meta:** A dúvida pode ter múltiplas respostas válidas dependendo de uma perspectiva oculta?
|
| 76 |
+
- **Decisão:**
|
| 77 |
+
- Se existem vários cenários válidos, sua tarefa é **formular uma pergunta de esclarecimento conversacional e aberta.**
|
| 78 |
+
- **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:
|
| 79 |
+
1. **Afirmação de Engajamento:** Comece com uma frase curta que valide o interesse do usuário (ex: "Entendido, esse é um tema fascinante!").
|
| 80 |
+
2. **Ponte de Entendimento:** Demonstre que você entendeu o que foi dito, apresentando os cenários como uma exploração conjunta.
|
| 81 |
+
3. **Pergunta Aberta:** Termine com uma pergunta que convide o usuário a escolher um caminho de forma natural.
|
| 82 |
+
- **Exemplo de Pergunta Conversacional Perfeita:**
|
| 83 |
+
Dúvida: "Me fale sobre carros". A pergunta no campo `pergunta_para_usuario` DEVE ser algo como:
|
| 84 |
+
*"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?"*
|
| 85 |
+
- Defina `proximo_passo` como `"aguardando_usuario"`.
|
| 86 |
+
- Se a confiança em um único cenário for 'alta', defina `proximo_passo` como `"passo_6_resposta_final"`.
|
| 87 |
+
---
|
| 88 |
+
**Passo 6: Geração da Resposta Final**
|
| 89 |
+
- **Meta:** Tenho 100% de clareza para dar uma resposta definitiva.
|
| 90 |
+
- **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"`. Senão, volte ao passo com a confiança mais baixa.
|
| 91 |
+
---
|
| 92 |
+
**ESTRUTURA JSON DE SAÍDA OBRIGATÓRIA:**
|
| 93 |
+
{
|
| 94 |
+
"raciocinio_do_passo": "Sua breve justificativa interna.", "proximo_passo": "string",
|
| 95 |
+
"pergunta_para_usuario": "string | null",
|
| 96 |
+
"estado_pipeline_atualizado": {
|
| 97 |
+
"passo_atual": "string", "duvida_inicial": "string | null", "clareza": {"confianca": "baixa|media|alta"},
|
| 98 |
+
"proposito": {"valor": "string | null", "confianca": "baixa|media|alta"}, "motivacao": {"valor": "string | null", "confianca": "baixa|media|alta"},
|
| 99 |
+
"coerencia": {"confianca": "baixa|media|alta"}, "ambiguidade": {"confianca": "baixa|media|alta"}
|
| 100 |
+
},
|
| 101 |
+
"resposta_final": "string | null"
|
| 102 |
+
}
|
| 103 |
"""
|
| 104 |
|
| 105 |
PROMPT_SUPERVISOR = """
|
| 106 |
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.
|
| 107 |
+
- **Use sua ferramenta de busca (`GoogleSearch`)** para verificar nomes, datas, estatísticas, conceitos científicos e outras alegações factuais.
|
| 108 |
+
- Você NÃO analisa opiniões, conselhos filosóficos ou a estrutura da resposta. Apenas fatos.
|
| 109 |
+
- 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.
|
| 110 |
+
- **Se você NÃO encontrar nenhuma divergência factual, você DEVE responder com a string exata `NO_DIVERGENCE` e absolutamente mais nada.**
|
| 111 |
"""
|
| 112 |
|
| 113 |
PROMPT_CORRECAO_E_REFINAMENTO = """
|
| 114 |
+
Você é um Conselheiro de IA em um processo de refinamento. Sua resposta anterior continha uma imprecisão factual que foi identificada por um Supervisor.
|
| 115 |
+
|
| 116 |
**Sua Tarefa:**
|
| 117 |
1. **Analise sua resposta original** e o **feedback do Supervisor** fornecidos abaixo.
|
| 118 |
+
2. **Aceite a correção.** Não seja defensivo. Seu objetivo é a máxima precisão e utilidade para o usuário.
|
| 119 |
+
3. **Reescreva sua resposta final**, integrando a correção de forma natural e fluida em sua análise original.
|
| 120 |
+
4. **Justifique brevemente a mudança:** No final da sua nova resposta, adicione uma pequena nota explicando por que a correção era importante. Comece esta nota com "Nota de Refinamento:".
|
| 121 |
+
|
| 122 |
+
**Exemplo de como justificar:**
|
| 123 |
+
"Nota de Refinamento: A correção acima é crucial porque o veto legal a penas alternativas no contexto da Lei Maria da Penha muda fundamentalmente o desfecho prático para a ré, mesmo com uma pena mínima."
|
| 124 |
+
|
| 125 |
Produza apenas a resposta final e corrigida, pronta para o usuário.
|
| 126 |
"""
|
| 127 |
|
|
|
|
| 130 |
"""Inicializa ou reseta o dicionário de estado da pipeline."""
|
| 131 |
print("Resetando o estado da pipeline para uma nova conversa.")
|
| 132 |
return {
|
| 133 |
+
"passo_atual": "passo_1_clareza", "duvida_inicial": None,
|
| 134 |
+
"clareza": {"confianca": "baixa"}, "proposito": {"valor": None, "confianca": "baixa"},
|
| 135 |
+
"motivacao": {"valor": None, "confianca": "baixa"}, "coerencia": {"confianca": "baixa"},
|
| 136 |
+
"ambiguidade": {"confianca": "baixa"}
|
| 137 |
}
|
| 138 |
|
| 139 |
estado_pipeline_global = resetar_estado()
|
|
|
|
| 145 |
try:
|
| 146 |
full_prompt = f"{PROMPT_SUPERVISOR}\n\n--- TEXTO PARA ANÁLISE ---\n{text_to_check}"
|
| 147 |
response = supervisor_model.generate_content(full_prompt)
|
| 148 |
+
|
| 149 |
if "NO_DIVERGENCE" in response.text:
|
| 150 |
print("Supervisor não encontrou divergências factuais.")
|
| 151 |
return None
|
|
|
|
| 160 |
def handle_chat(mensagem, historico_chat_gradio, modo_sabio, modo_supervisor):
|
| 161 |
global estado_pipeline_global, historico_conversa_llm
|
| 162 |
|
| 163 |
+
# Detecta o início de uma nova conversa e reseta o estado interno.
|
| 164 |
if not historico_chat_gradio:
|
| 165 |
estado_pipeline_global = resetar_estado()
|
| 166 |
historico_conversa_llm = []
|
|
|
|
| 170 |
if estado_pipeline_global["duvida_inicial"] is None:
|
| 171 |
estado_pipeline_global["duvida_inicial"] = mensagem
|
| 172 |
|
| 173 |
+
# Monta o prompt base, injetando a diretiva do Amigo Sábio se ativado
|
| 174 |
prompt_base = PROMPT_SISTEMA_METODOLOGICO
|
| 175 |
if modo_sabio and CONTEXTO_EPICTETO:
|
| 176 |
prompt_base = f"""{DIRETIVA_AMIGO_SABIO}
|
|
|
|
| 181 |
{PROMPT_SISTEMA_METODOLOGICO}
|
| 182 |
"""
|
| 183 |
elif modo_sabio and not CONTEXTO_EPICTETO:
|
| 184 |
+
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."
|
| 185 |
+
|
| 186 |
+
# Monta o prompt completo com histórico, estado e instruções finais
|
| 187 |
+
prompt_completo = f"""
|
| 188 |
+
{prompt_base}
|
| 189 |
+
---
|
| 190 |
+
**HISTÓRICO DA CONVERSA:**
|
| 191 |
+
{json.dumps(historico_conversa_llm, indent=2)}
|
| 192 |
+
---
|
| 193 |
+
**ESTADO ATUAL DA ANÁLISE:**
|
| 194 |
+
{json.dumps(estado_pipeline_global, indent=2)}
|
| 195 |
+
---
|
| 196 |
+
**Instrução:** Aplique suas diretrizes ao estado e histórico atuais e gere o próximo JSON de ação.
|
| 197 |
+
"""
|
| 198 |
|
| 199 |
try:
|
| 200 |
+
# --- PARTE 1: GERAÇÃO DA RESPOSTA INICIAL PELO CONSELHEIRO ---
|
| 201 |
response_counselor = counselor_model.generate_content(prompt_completo)
|
| 202 |
+
resposta_texto = response_counselor.text.strip().replace("```json", "").replace("```", "")
|
| 203 |
+
decisao_json = json.loads(resposta_texto)
|
| 204 |
estado_pipeline_global = decisao_json.get("estado_pipeline_atualizado", estado_pipeline_global)
|
| 205 |
|
| 206 |
resposta_rascunho = None
|
|
|
|
| 209 |
elif decisao_json.get("pergunta_para_usuario"):
|
| 210 |
resposta_rascunho = decisao_json["pergunta_para_usuario"]
|
| 211 |
else:
|
| 212 |
+
resposta_rascunho = "Ocorreu um erro no meu raciocínio. Poderia tentar reformular?"
|
| 213 |
+
|
| 214 |
+
historico_conversa_llm.append({"role": "model", "parts": [resposta_rascunho]})
|
| 215 |
|
| 216 |
+
# Se não for uma resposta final (ou seja, é uma pergunta), retorna direto
|
| 217 |
if not decisao_json.get("resposta_final"):
|
|
|
|
| 218 |
return resposta_rascunho
|
| 219 |
|
| 220 |
resposta_final_para_usuario = resposta_rascunho
|
| 221 |
|
| 222 |
+
# --- PARTE 2: SUPERVISÃO E CICLO DE REFINAMENTO ---
|
| 223 |
if modo_supervisor:
|
| 224 |
feedback_supervisor = run_supervisor(resposta_rascunho)
|
| 225 |
+
|
| 226 |
if feedback_supervisor:
|
| 227 |
print("--- Supervisor encontrou divergência. Iniciando ciclo de autocorreção. ---")
|
| 228 |
+
|
| 229 |
+
# Monta o prompt para a autocorreção
|
| 230 |
+
prompt_refinamento = f"""
|
| 231 |
+
{PROMPT_CORRECAO_E_REFINAMENTO}
|
| 232 |
+
--- SUA RESPOSTA ORIGINAL (COM ERRO) ---
|
| 233 |
+
{resposta_rascunho}
|
| 234 |
+
--- FEEDBACK DO SUPERVISOR (A CORREÇÃO) ---
|
| 235 |
+
{feedback_supervisor}
|
| 236 |
+
"""
|
| 237 |
+
|
| 238 |
+
# Segunda chamada à API para o Conselheiro se corrigir
|
| 239 |
response_corrigida = counselor_model.generate_content(prompt_refinamento)
|
| 240 |
resposta_final_para_usuario = response_corrigida.text
|
| 241 |
+
historico_conversa_llm.append({"role": "model", "parts": [resposta_final_para_usuario]}) # Adiciona a resposta corrigida ao histórico
|
| 242 |
|
|
|
|
| 243 |
return resposta_final_para_usuario
|
| 244 |
|
| 245 |
except (json.JSONDecodeError, AttributeError, Exception) as e:
|
| 246 |
print(f"Erro ao processar resposta da API: {e}")
|
| 247 |
+
try:
|
| 248 |
+
print(f"Resposta recebida (pode ter causado o erro): {response_counselor.text}")
|
| 249 |
+
except:
|
| 250 |
+
print("Não foi possível extrair o texto da resposta do erro.")
|
| 251 |
return "Desculpe, tive um problema técnico. Por favor, clique no botão 'Limpar' e tente novamente."
|
| 252 |
|
| 253 |
|
| 254 |
# --- 6. INTERFACE GRÁFICA COM GRADIO ---
|
| 255 |
iface = gr.ChatInterface(
|
| 256 |
fn=handle_chat,
|
| 257 |
+
title="🤖 Parceiro de Raciocínio v9 (Autocorretivo e Sábio)",
|
| 258 |
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.",
|
| 259 |
chatbot=gr.Chatbot(height=600, label="Diálogo"),
|
| 260 |
textbox=gr.Textbox(placeholder="E aí, como você está?", container=False, scale=7),
|
| 261 |
additional_inputs=[
|
| 262 |
gr.Checkbox(label="🧘 Ativar Modo Amigo Sábio", value=False),
|
| 263 |
+
gr.Checkbox(label="🔍 Ativar Modo Supervisor Autocorretivo", value=True) # Ativado por padrão para demonstrar
|
| 264 |
],
|
| 265 |
theme="soft",
|
| 266 |
examples=[
|
| 267 |
["Meu chefe me criticou na frente de todo mundo."],
|
| 268 |
+
["O Monte Everest tem mais de 8.800 metros de altura?"],
|
| 269 |
+
["Como posso lidar com a ansiedade antes de uma apresentação importante?"]
|
| 270 |
],
|
| 271 |
cache_examples=False
|
| 272 |
)
|