Gleam.br Wiki

[ADR-0010] Interrupção Graciosa de Streaming e Correção em Tempo Real (`/sugestion`) | Wiki

Documentação de engenharia e especificações técnicas da Gleam-BR.

[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á:

  1. *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.
  2. *Sinal de Aborto:* O REPL enviará uma mensagem assíncrona InterruptAndSuggest(texto) para o Ator de Sessão (session.gleam).
  3. *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.
  4. *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.
  5. *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!