O FormFlow expõe operações com múltiplas etapas interdependentes: criar variáveis, associá-las a formulários, capturar dados e validar resultados. O Sequential Thinking é um MCP que estrutura esse raciocínio em passos revisáveis antes da execução.

Quando usar

Use Sequential Thinking antes de chamar reasonFormFlowPlan ou encadear chamadas manuais ao FormFlow quando:

  • A operação envolve 3 ou mais etapas interdependentes
  • Você precisa decidir quais variáveis já existem antes de criar novas
  • O escopo correto (lead, conversation, global) não está explícito nas instruções recebidas
  • Há risco de criar duplicatas ou sobrescrever dados importantes
  • A instrução é ambígua e precisa de refinamento antes da execução

Como funciona

O Sequential Thinking emite pensamentos numerados (thoughtNumber / totalThoughts). Cada pensamento pode:

  • Avançar o raciocínio para a próxima etapa
  • Revisar um pensamento anterior (isRevision: true, revisesThought: N)
  • Criar um ramo alternativo (branchFromThought, branchId)
  • Estimar que mais passos são necessários (needsMoreThoughts: true)

O processo termina quando nextThoughtNeeded: false e uma conclusão clara foi atingida.


Padrão de uso com o FormFlow

1. Entender o estado atual

Antes de planejar, consulte o que já existe:

// Passo 1 do Sequential Thinking: levantar o contexto
// "Preciso saber quais variáveis e formulários já existem antes de planejar qualquer criação"

const [fields, catalogs] = await Promise.all([
  fetch('{BASE_URL}/getFormFields', { method: 'POST', ... }).then(r => r.json()),
  fetch('{BASE_URL}/getFormCatalogs', { method: 'POST', ... }).then(r => r.json())
]);

2. Raciocinar sobre o que criar vs reutilizar

Pensamento 1: A instrução pede "formulário de pré-vendas com email e telefone".
  → Preciso verificar se variáveis com keyName "lead_email" e "lead_phone" já existem.

Pensamento 2: Encontrei "lead_email" (id: abc) mas não encontrei "lead_phone".
  → Plano: criar "lead_phone", depois criar o catálogo associando ambas.

Pensamento 3 (revisão do 2): O escopo pedido é "leads".
  → A variável "lead_email" existente tem scope "conversation" — isso pode causar conflito.
  → Revisar: criar nova variável com scope "lead" ou atualizar a existente?

3. Gerar o plano final

Após o Sequential Thinking concluir, envie as instruções refinadas para reasonFormFlowPlan:

curl -X POST {BASE_URL}/reasonFormFlowPlan \
  -H "Authorization: Bearer {TOKEN}" \
  -H "Content-Type: application/json" \
  -d '{
    "instructions": "Criar variável lead_phone com scope lead e tipo phone. Criar formulário Pré-vendas com scope lead associando lead_email (id: abc) e a nova lead_phone.",
    "options": {
      "maxSteps": 4,
      "model": "gpt-oss-120b",
      "provider": "cerebras"
    },
    "executeAfterPlan": true
  }'

Exemplo completo

O exemplo abaixo mostra a sequência de pensamentos típica para uma operação de criação de formulário:

[Pensamento 1/5]
Instrução recebida: "Crie um formulário chamado Qualificação com nome, email e empresa do lead".
Preciso primeiro verificar o que já existe no host antes de criar qualquer coisa.
→ nextThoughtNeeded: true

[Pensamento 2/5]
Consultei getFormFields. Encontrei:
  - "lead_name" (scope: lead) ✅
  - "lead_email" (scope: lead) ✅
  - "lead_company" → não existe
Precisarei criar "lead_company".
→ nextThoughtNeeded: true

[Pensamento 3/5]
Consultei getFormCatalogs. Não existe formulário com nome "Qualificação".
Posso prosseguir com a criação.
→ nextThoughtNeeded: true

[Pensamento 4/5]
Plano definido:
  1. createVariable → lead_company (type: text, scope: lead)
  2. createCatalog → Qualificação (scope: lead, variableIds: [lead_name.id, lead_email.id, $step1.id])
Sem ambiguidades. Plano pronto para enviar ao reasonFormFlowPlan.
→ nextThoughtNeeded: true

[Pensamento 5/5]
Instrução refinada para o reasonFormFlowPlan:
"Criar variável lead_company (text, scope lead). Criar formulário Qualificação (scope lead)
associando as variáveis existentes lead_name (uuid-a) e lead_email (uuid-b) e a nova lead_company."
→ nextThoughtNeeded: false

Integração com execução via WebSocket

Após enviar o plano ao reasonFormFlowPlan com executeAfterPlan: true, monitore a execução em tempo real:

socket.on('form_flow_step_executed', ({ stepNumber, totalSteps, action, success, realtimeInstructions }) => {
  console.log(`Step ${stepNumber}/${totalSteps}${action}: ${success ? '✅' : '❌'}`);
  realtimeInstructions?.forEach(msg => appendToLog(msg));
});

socket.on('form_flow_plan_generated', ({ totalSteps, plan }) => {
  renderPlanPreview(plan, totalSteps);
});

Quando o Sequential Thinking evita erros

SituaçãoSem Sequential ThinkingCom Sequential Thinking
Variável com mesmo keyName já existe400 Conflict ou duplicata silenciosaDetecta antes e reutiliza o ID existente
Escopo ambíguo na instruçãoCria com escopo erradoSolicita clarificação antes de executar
Formulário com nome parecido já existeCria duplicataDetecta e pergunta se deve atualizar
Step 2 depende do ID gerado no Step 1Referência $previous.id falha se Step 1 falhouValida a saída do Step 1 antes de continuar

O Sequential Thinking não executa nenhuma ação — ele apenas estrutura o raciocínio. A execução sempre passa pelo FormFlow via reasonFormFlowPlan ou chamadas diretas aos endpoints.