[ADR-0010] Interrupção Graciosa de Streaming e Correção em Tempo Real (`/sugestion`) | Wiki
[ADR-0010] Interrupção Graciosa de Streaming e Correção em Tempo Real (/sugestion)
- *Status:* Proposto
- *Data:* 16 de Maio, 2026
*Contexto:*
Em interfaces de linha de comando (CLI) tradicionais, a geração de texto por LLMs (Streaming SSE) bloqueia a entrada do usuário (stdin). Se o operador perceber, nos primeiros segundos, que o Agente tomou uma decisão errada ou esqueceu um requisito, ele é forçado a aguardar a conclusão da geração (desperdiçando tempo e tokens financeiros) ou forçar o encerramento do processo (SIGINT), perdendo todo o histórico em memória.
Como a arquitetura do gleambr_ai utiliza Atores OTP para dissociar o I/O de rede do I/O de terminal, temos a capacidade técnica de interceptar a comunicação em pleno voo.
*Decisão:*
Implementaremos o comando de Interrupção Graciosa (/sugestion <texto> ou /s <texto>) no Ator do REPL. O fluxo de orquestração será:
-
*Interceptação:* O REPL, mesmo no estado
Streaming, continuará lendo a task de teclado silenciosamente em background. Ao detectar o prefixo/s, ele não imprimirá o texto na tela para não quebrar a UI, mas capturará a intenção. -
*Sinal de Aborto:* O REPL enviará uma mensagem assíncrona
InterruptAndSuggest(texto)para o Ator de Sessão (session.gleam). -
*Cancelamento de Rede:* O Ator de Sessão comandará o proxy do
gun(via FFI) para cancelar ativamente o stream HTTP atual (gun:cancel(StreamRef)), cortando a conexão com a OpenAI/Gemini instantaneamente. -
*Reconstrução de Memória:* O Ator de Sessão pegará o texto parcial gerado até aquele milissegundo (que está no
accumulator) e o salvará no histórico como uma mensagem do Assistente interrompida. Em seguida, anexará a sugestão do usuário. -
*O Novo Caminhão:* A Sessão acionará automaticamente a função de
Prompt, despachando uma nova requisição com o histórico atualizado, fazendo a IA "mudar de ideia" e continuar de onde parou.
*Consequências:*
- *Positivas:* Economia drástica de custos (API API Tokens); Developer Experience (DX) incomparável no mercado de CLIs; sensação real de Pair Programming colaborativo (o agente pode ser corrigido enquanto "fala").
-
*Negativas:* Requer tratamento de estado complexo na recuperação parcial. Exemplo crítico: E se o usuário interromper a IA exatamente no meio da digitação de um JSON de chamada de ferramenta MCP? O histórico parcial ficará com um JSON quebrado (ex:
{"name": "read_f). A IA terá que ser inteligente o suficiente para ignorar a sintaxe quebrada ou o parser precisará limpar o lixo final.
Análise da negativa
Uma forma fácil de mitigar isso é dizer no System Prompt: "Se o seu pensamento anterior foi interrompido no meio de um JSON, simplesmente ignore o erro sintático anterior, peça desculpas, e recomece a chamada da ferramenta na nova mensagem". LLMs modernos lidam muito bem com isso!