Skip to main content
Quando o modelo precisa de uma decisão sua — qual abordagem seguir, qual alvo usar, confirmar um plano — em vez de escrever “me diga A ou B” em texto solto, ele chama a ferramenta ask_user (@ask). Você responde num overlay interativo (Bubble Tea, o mesmo motor do command palette) e as seleções voltam estruturadas ao modelo no mesmo turno. É o equivalente ao AskUserQuestion do Claude Code.

Onde funciona


A interface

Cada chamada traz de 1 a 6 perguntas. Para cada pergunta:
  • um cabeçalho curto e o texto da pergunta;
  • uma lista de opções (rótulo + descrição);
  • single-select (radio (•)) ou multi-select (checkbox [x]);
  • uma linha “Other” para digitar uma resposta livre.

Controles


Single vs múltipla escolha

Quem decide é o modelo, por pergunta, através do campo multiSelect:
  • multiSelect: false (ou omitido) → escolha única (radios).
  • multiSelect: true → múltipla escolha (checkboxes [x]); o espaço marca/desmarca vários e o enter confirma o conjunto.
Para induzir múltipla escolha, basta pedir: “me pergunte, permitindo múltipla escolha, quais ambientes…”.

Exceção no modo chat

O modo chat é tool-less por design — ele nunca executa tools. As exceções sancionadas são quatro, todas inofensivas por construção: o ask_user (interativa), a consulta read-only à knowledge base (/config chat knowledge), o @graphview (renderização única, /config chat graphview) e a memória (/config chat memory — persiste fatos duráveis que você revela no mesmo turno e carrega o caminho de pull que permite ao chat honrar o modo de memória index: digest compacto, recall sob demanda, blocos proativos de auto-recall/session-recall/card do grafo). Quando habilitadas, o chat oferece exclusivamente essas ferramentas (nenhuma de leitura de arquivos/escrita/execução). Funciona com qualquer provider:
  • Providers com tools nativas (Claude por API key, OpenAI…): turno de decisão estruturado.
  • Providers sem tools nativas (ex.: Claude em modo OAuth): turno de decisão via XML, com o formato injetado e o markup suprimido antes de chegar à tela.
Em ambos os casos, depois que você responde, o mesmo spinner do prompt do turno normal aparece enquanto a IA elabora a resposta final.

Ligar/desligar

A exceção do chat vem ligada por padrão e pode ser controlada em runtime:
Para um padrão permanente, defina no .env:
Com a exceção ligada, cada turno de chat passa por um turno de decisão buffered (necessário para detectar/suprimir a chamada antes de exibi-la). Se preferir o streaming token-a-token no dia a dia, use /config chat ask off.

Contextos não-interativos

Em execução desassistida (gateway/daemon), pipe ou one-shot (-p) não há terminal para o overlay. Nesses casos o ask_user não trava: retorna a primeira opção de cada pergunta como fallback determinístico, deixando claro que foi auto-selecionado, e o fluxo segue.

Resultado para o modelo

A resposta volta como um resumo legível seguido de um bloco JSON canônico, para que tanto modelos fracos quanto fortes interpretem sem ambiguidade:
Cancelar (Esc) não é erro: o modelo recebe um aviso de que você não respondeu e segue com defaults razoáveis ou pergunta de novo em texto.

Veja também