Pular para o conteúdo principal
O ChatCLI suporta streaming em tempo real de respostas de LLM, exibindo o texto character-by-character conforme ele e gerado pela API. Isso melhora significativamente a experiencia do usuário, eliminando a espera por respostas completas.

Interface StreamingClient

O streaming e implementado como uma interface opcional que provedores podem adotar:
type StreamingClient interface {
    LLMClient

    SendPromptStream(ctx context.Context, prompt string,
        history []models.Message, maxTokens int) (<-chan StreamChunk, error)

    SupportsStreaming() bool
}
A detecção e automatica via type assertion — provedores que implementam StreamingClient recebem streaming automaticamente:
if sc, ok := client.AsStreamingClient(c); ok {
    chunks, err := sc.SendPromptStream(ctx, prompt, history, maxTokens)
    // processa chunks em tempo real
}
Provedores que não implementam StreamingClient continuam funcionando normalmente. O ChatCLI faz fallback para SendPrompt (resposta completa) automaticamente.

StreamChunk

Cada chunk do streaming carrega:
CampoTipoDescricao
TextstringTexto incremental neste chunk (pode ser vazio)
Donebooltrue no chunk final
Usage*UsageInfoDados de uso de tokens (apenas no chunk final)
StopReasonstringRazao da parada: end_turn, max_tokens, tool_use
ErrorerrorErro durante streaming (termina o stream)

Contrato de Streaming

  • O canal retorna zero ou mais chunks de texto
  • O chunk final tem Done=true e pode incluir Usage e StopReason
  • Se ocorrer erro, um chunk com Error e enviado e o canal fecha
  • O canal fecha após o chunk final ou erro
  • O caller pode cancelar via contexto

Provedores com Suporte

ProvedorStreamingObservacoes
Anthropic (API Key)SimStreaming nativo via Messages API
Anthropic (OAuth)SimStreaming via token OAuth
OpenAISimStreaming via Chat Completions
ZAI (Zhipu AI)SimStreaming compatível com OpenAI
MiniMaxSimStreaming compatível com OpenAI
Moonshot (Kimi)SimStreaming compatível com OpenAI
OpenRouterSimStreaming via API OpenAI-compatible
Google (Gemini)NãoFallback para resposta completa
xAI (Grok)NãoFallback para resposta completa
GitHub ModelsNãoFallback para resposta completa
OllamaNãoFallback para resposta completa

Stream Watchdog

O Stream Watchdog monitora o stream para detectar stalls (interupcoes sem dados) e prevenir que o ChatCLI fique travado esperando indefinidamente:
TimerDuracaoAcao
Warning45 segundosLoga aviso de stall no log
Idle Timeout90 segundosAborta stream e retorna conteúdo parcial
Ambos os timers sao resetados a cada chunk recebido. Se o provedor parar de enviar dados por 90 segundos, o watchdog interrompe o stream e retorna o texto já acumulado.

Configuração do Watchdog

Variável de AmbienteDescricaoDefault
CHATCLI_STREAM_IDLE_TIMEOUT_SECONDSTimeout de idle em segundos90
Em redes lentas ou com provedores que tem alta latência entre chunks, aumente o timeout para evitar interrupcoes prematuras. O padrão de 90 segundos e suficiente para a maioria dos cenarios.

Fallback para Não-Streaming

Quando o streaming não esta disponível (provedor não suporta ou erro na conexão), o ChatCLI faz fallback automático:
1. Tenta SendPromptStream()  → streaming em tempo real
2. Se não suportado → fallback para SendPrompt()
3. Resposta completa exibida de uma vez
A função DrainStream permite converter um stream em resposta completa quando necessário:
text, usage, stopReason, err := client.DrainStream(chunks)

Integração com TUI

No modo interativo (Bubble Tea), o streaming integra-se diretamente com o renderizador:
  • Cada chunk e emitido como evento via TUIEmitter
  • O modelo Bubble Tea atualiza a view incrementalmente
  • Markdown e renderizado progressivamente via Glamour
  • A barra de status mostra o estado do streaming em tempo real
No modo one-shot (-p), o streaming e desabilitado e DrainStream e usado para coletar a resposta completa antes de imprimir.

Próximos Passos

Recuperação de Contexto

O que acontece quando max_tokens e atingido durante streaming.

Provider Fallback

Chain de fallback entre provedores com e sem streaming.

Tool Use Nativo

Streaming com tool calls nativas.

UI de Progresso

Indicadores visuais durante streaming do agente.