Spaces:
Sleeping
Sleeping
Update app.py
Browse files
app.py
CHANGED
|
@@ -30,7 +30,7 @@ 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-
|
| 34 |
|
| 35 |
|
| 36 |
# --- 3. DEFINIÇÃO DOS PROMPTS ---
|
|
@@ -56,29 +56,35 @@ Você é um especialista em análise de intenções que opera sob um protocolo d
|
|
| 56 |
Sua função é conduzir uma conversa para entender 100% da dúvida de um usuário ANTES de respondê-la.
|
| 57 |
Sua SAÍDA DEVE SER SEMPRE E SOMENTE um objeto JSON válido.
|
| 58 |
|
| 59 |
-
**PROTOCOLO DE EXECUÇÃO OBRIGATÓRIO:**
|
| 60 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 61 |
---
|
| 62 |
**Passo 1: Análise Primária (Clareza)**
|
| 63 |
-
- **Decisão:** Se a clareza for 'baixa',
|
| 64 |
---
|
| 65 |
**Passo 2: Análise de Propósito (Para Que)**
|
| 66 |
-
- **Decisão:** Se a confiança for 'baixa',
|
| 67 |
---
|
| 68 |
**Passo 3: Análise de Motivação (Porquê)**
|
| 69 |
-
- **Decisão:** Se a confiança for 'baixa',
|
| 70 |
---
|
| 71 |
**Passo 4: Análise de Coerência**
|
| 72 |
-
- **Decisão:** Se a coerência for 'baixa',
|
| 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 |
-
-
|
| 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?"*
|
|
@@ -87,7 +93,7 @@ Analise o `estado_pipeline` atual e o `historico_conversa`. Decida qual passo ex
|
|
| 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 |
{
|
|
@@ -119,9 +125,6 @@ Você é um Conselheiro de IA em um processo de refinamento. Sua resposta anteri
|
|
| 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 |
|
|
@@ -165,12 +168,14 @@ def handle_chat(mensagem, historico_chat_gradio, modo_sabio, modo_supervisor):
|
|
| 165 |
estado_pipeline_global = resetar_estado()
|
| 166 |
historico_conversa_llm = []
|
| 167 |
|
|
|
|
| 168 |
historico_conversa_llm.append({"role": "user", "parts": [mensagem]})
|
| 169 |
|
|
|
|
| 170 |
if estado_pipeline_global["duvida_inicial"] is None:
|
| 171 |
estado_pipeline_global["duvida_inicial"] = mensagem
|
| 172 |
|
| 173 |
-
#
|
| 174 |
prompt_base = PROMPT_SISTEMA_METODOLOGICO
|
| 175 |
if modo_sabio and CONTEXTO_EPICTETO:
|
| 176 |
prompt_base = f"""{DIRETIVA_AMIGO_SABIO}
|
|
@@ -238,7 +243,8 @@ Agora, aplique esta persona e seus princípios ao executar a seguinte metodologi
|
|
| 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 |
-
|
|
|
|
| 242 |
|
| 243 |
return resposta_final_para_usuario
|
| 244 |
|
|
|
|
| 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 ---
|
|
|
|
| 56 |
Sua função é conduzir uma conversa para entender 100% da dúvida de um usuário ANTES de respondê-la.
|
| 57 |
Sua SAÍDA DEVE SER SEMPRE E SOMENTE um objeto JSON válido.
|
| 58 |
|
| 59 |
+
**PROTOCOLO DE EXECUÇÃO OBRIGATÓRIO (COM AJUSTES DE DIÁLOGO E FLUXO):**
|
| 60 |
+
|
| 61 |
+
**Passo 0: Análise Preliminar e Detecção de Intenção do Usuário (NOVO)**
|
| 62 |
+
- **Ação:** Antes de aplicar o protocolo de 6 passos, analise a mensagem do usuário.
|
| 63 |
+
- **Decisão:**
|
| 64 |
+
- Se a mensagem for uma pergunta direta sobre um fato específico (ex: "Qual o nome daquela atriz?") ou uma solicitação de informação isolada, **responda diretamente** (não use o protocolo de 6 passos). Em seguida, se apropriado, tente reconectar com o fluxo ou perguntar se o usuário quer prosseguir com a análise da dúvida anterior.
|
| 65 |
+
- Se a mensagem for uma mudança de assunto que **dialoga com o contexto anterior** (ex: após falar de carros, o usuário pergunta sobre pneus), tente integrar essa nova informação ao protocolo ou crie uma ponte para ela.
|
| 66 |
+
- Se a mensagem for uma **mudança de assunto radical** ou uma solicitação que não se encaixa no protocolo, responda diretamente à solicitação e **RESETE o estado da pipeline**.
|
| 67 |
+
- Se a mensagem for uma **pergunta de esclarecimento** sua, trate-a como tal, use a Persona de Amigo Sábio, e espere a resposta do usuário.
|
| 68 |
+
- Se o modelo não conseguir determinar a intenção clara (dúvida ambígua que precisa de mais dados), ele deve seguir para o Passo 1, tentando um diálogo mais exploratório.
|
| 69 |
+
- **Saída JSON (se for usar o protocolo):** `{"proximo_passo": "passo_1_clareza", ...}`. Se responder diretamente ou resetar, a função `handle_chat` lidará com isso.
|
| 70 |
+
|
| 71 |
---
|
| 72 |
**Passo 1: Análise Primária (Clareza)**
|
| 73 |
+
- **Decisão:** Se a clareza for 'baixa', use a persona do Amigo Sábio para fazer uma pergunta de esclarecimento. Senão, `proximo_passo` = `"passo_2_proposito"`.
|
| 74 |
---
|
| 75 |
**Passo 2: Análise de Propósito (Para Que)**
|
| 76 |
+
- **Decisão:** Se a confiança no propósito for 'baixa', use a persona do Amigo Sábio para formular uma pergunta de esclarecimento conversacional, mostrando que entendeu o tópico geral. Senão, `proximo_passo` = `"passo_3_motivacao"`.
|
| 77 |
---
|
| 78 |
**Passo 3: Análise de Motivação (Porquê)**
|
| 79 |
+
- **Decisão:** Se a confiança na motivação for 'baixa', use a persona do Amigo Sábio para perguntar sobre o que despertou o interesse. Senão, `proximo_passo` = `"passo_4_coerencia"`.
|
| 80 |
---
|
| 81 |
**Passo 4: Análise de Coerência**
|
| 82 |
+
- **Decisão:** Se a coerência for 'baixa', use a persona do Amigo Sábio para perguntar, resolvendo a contradição. Senão, `proximo_passo` = `"passo_5_ambiguidade"`.
|
| 83 |
---
|
| 84 |
**Passo 5: Análise de Ambiguidade de Cenário (Validação de Perspectiva)**
|
| 85 |
- **Meta:** A dúvida pode ter múltiplas respostas válidas dependendo de uma perspectiva oculta?
|
| 86 |
+
- **Decisão:** Se existem vários cenários válidos, sua tarefa é **formular uma pergunta de esclarecimento conversacional e aberta**, usando a persona do Amigo Sábio.
|
| 87 |
+
- **REGRA DE OURO PARA PERGUNTAS:** Não use menus. Comece com uma frase de engajamento, crie uma ponte de entendimento, e termine com uma pergunta aberta.
|
|
|
|
|
|
|
|
|
|
|
|
|
| 88 |
- **Exemplo de Pergunta Conversacional Perfeita:**
|
| 89 |
Dúvida: "Me fale sobre carros". A pergunta no campo `pergunta_para_usuario` DEVE ser algo como:
|
| 90 |
*"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?"*
|
|
|
|
| 93 |
---
|
| 94 |
**Passo 6: Geração da Resposta Final**
|
| 95 |
- **Meta:** Tenho 100% de clareza para dar uma resposta definitiva.
|
| 96 |
+
- **Decisão:** Se todos os passos têm confiança 'alta', construa a resposta final, adaptada à persona do Amigo Sábio e à sua análise. Coloque-a em `"resposta_final"`. Defina `proximo_passo` como `"concluido"`. Senão, volte ao passo com a confiança mais baixa.
|
| 97 |
---
|
| 98 |
**ESTRUTURA JSON DE SAÍDA OBRIGATÓRIA:**
|
| 99 |
{
|
|
|
|
| 125 |
3. **Reescreva sua resposta final**, integrando a correção de forma natural e fluida em sua análise original.
|
| 126 |
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:".
|
| 127 |
|
|
|
|
|
|
|
|
|
|
| 128 |
Produza apenas a resposta final e corrigida, pronta para o usuário.
|
| 129 |
"""
|
| 130 |
|
|
|
|
| 168 |
estado_pipeline_global = resetar_estado()
|
| 169 |
historico_conversa_llm = []
|
| 170 |
|
| 171 |
+
# Adiciona a mensagem do usuário ao histórico para o LLM
|
| 172 |
historico_conversa_llm.append({"role": "user", "parts": [mensagem]})
|
| 173 |
|
| 174 |
+
# Define a dúvida inicial se for a primeira mensagem
|
| 175 |
if estado_pipeline_global["duvida_inicial"] is None:
|
| 176 |
estado_pipeline_global["duvida_inicial"] = mensagem
|
| 177 |
|
| 178 |
+
# --- Lógica de Construção do Prompt ---
|
| 179 |
prompt_base = PROMPT_SISTEMA_METODOLOGICO
|
| 180 |
if modo_sabio and CONTEXTO_EPICTETO:
|
| 181 |
prompt_base = f"""{DIRETIVA_AMIGO_SABIO}
|
|
|
|
| 243 |
# Segunda chamada à API para o Conselheiro se corrigir
|
| 244 |
response_corrigida = counselor_model.generate_content(prompt_refinamento)
|
| 245 |
resposta_final_para_usuario = response_corrigida.text
|
| 246 |
+
# Adiciona a resposta corrigida ao histórico
|
| 247 |
+
historico_conversa_llm.append({"role": "model", "parts": [resposta_final_para_usuario]})
|
| 248 |
|
| 249 |
return resposta_final_para_usuario
|
| 250 |
|