Visão geral
O CrewAI expõe um contrato de streaming baseado em frames para runtimes que precisam de mais do que chunks de texto simples. O contrato emite objetosStreamFrame ordenados para eventos de ciclo de vida de Flow, tokens de LLM diretos, atividade de ferramentas, mensagens de conversa e eventos personalizados.
Use esta API ao criar uma UI, ponte de serviço, aplicativo de terminal ou runtime de implantação que precise de um fluxo estável de eventos estruturados enquanto um Flow, turno de chat ou chamada direta de LLM está em execução.
StreamFrame
Todo frame tem o mesmo envelope:channel é a forma mais rápida de rotear frames em consumidores:
| Canal | Contém |
|---|---|
llm | Tokens e chunks de raciocínio de eventos de streaming de LLM |
flow | Ciclo de vida do Flow, execução de métodos, roteamento e eventos de pausa/retomada |
tools | Eventos de uso de ferramentas |
messages | Eventos do transcript da conversa |
lifecycle | Eventos de ciclo de vida do runtime que não pertencem a outro canal |
custom | Eventos que não mapeiam para um canal integrado |
frame.type preserva o tipo do evento de origem, para que consumidores possam tratar eventos específicos dentro de um canal.
Transmitir um Flow
Definastream=True em um Flow para fazer kickoff() retornar uma sessão de stream:
stream.result. Acessar o resultado cedo demais gera um RuntimeError, para que consumidores não tratem uma execução parcial como concluída.
Você também pode chamar flow.stream_events(...) diretamente quando quiser streaming para uma única invocação sem definir stream=True na instância do Flow.
Filtrar por canal
StreamSession expõe projeções por canal que preservam a ordem global dos frames dentro do canal selecionado:
| Projeção | Frames |
|---|---|
stream.events | Todos os frames |
stream.llm | Frames de LLM |
stream.messages | Frames de mensagens de conversa |
stream.flow | Frames de Flow |
stream.tools | Frames de ferramentas |
stream.interleave([...]) | Um conjunto selecionado de canais |
stream.interleave(["flow", "llm", "messages"]) quando um consumidor quiser apenas alguns canais, mas ainda precisar da ordem relativa entre eles.
Streaming assíncrono
Useastream() para consumidores assíncronos:
Transmitir uma chamada direta de LLM
llm.call(...) ainda retorna o resultado final montado. Use llm.stream_events(...) quando quiser iterar pelos chunks conforme eles chegam, mantendo o payload estruturado do evento:
llm.stream_events(...) ativa temporariamente o streaming para a chamada encapsulada e restaura a configuração anterior de stream do LLM depois. As integrações de provedores continuam emitindo os eventos de stream de LLM subjacentes; esse helper fornece uma API de iterador comum sobre esses eventos para todos os provedores de LLM.
Turnos conversacionais
Flows conversacionais podem transmitir um turno de usuário comstream_turn():
stream_turn(), o caminho de resposta conversacional integrado ativa o streaming de tokens de LLM para esse turno e restaura a configuração anterior de stream do LLM depois. Handlers de rota personalizados que criam seus próprios agentes ou instâncias de LLM devem configurar esses LLMs para streaming se precisarem de saída em nível de token.
Limpeza
Use a sessão como gerenciador de contexto quando possível. Se um cliente se desconectar antes de o stream ser esgotado, feche a sessão explicitamente:await stream.aclose().
Streaming de chunks legado
O streaming de Crew comstream=True ainda retorna a API orientada a chunks CrewStreamingOutput descrita em Streaming da Execução de Crew. Chamadas diretas llm.call(...) ainda retornam o resultado final do LLM. O contrato de frames é destinado a runtimes que precisam de um envelope de evento estável em Flows, chamadas diretas de LLM, turnos conversacionais, ferramentas e mensagens.