Ilustración editorial para Streaming de respuestas de IA: cómo mostrar progreso sin ejecutar datos o acciones antes de tener una salida válida
Imagen generada con gpt-image-2.5-sunburst para InferamaFonte ↗
01

Um fragmento visível não equivale a uma saída utilizável

Uma interface pode mostrar texto à medida que ele chega de um modelo e, ainda assim, manter uma fronteira rigorosa entre esse texto e o estado do sistema. Essa fronteira é importante porque um delta de streaming comunica apenas que uma parte de uma geração foi recebida. Ele não prova que a mensagem terminou, que seu significado não será alterado, que um objeto estruturado está completo nem que uma chamada de ferramenta possui argumentos válidos.

A latência percebida e a validade são propriedades distintas. O streaming pode reduzir o tempo até o primeiro fragmento e fornecer sinais úteis de atividade para a pessoa usuária. Porém, o resultado que ativa uma operação precisa atender a requisitos adicionais: receber uma finalização inequívoca, estar completamente montado, passar pela validação sintática e semântica, estar associado a uma geração específica e, quando o risco exigir, obter confirmação humana. Uma aplicação que confunde essas camadas pode criar registros incompletos, indexar afirmações posteriormente retiradas ou executar uma ação duas vezes após uma interrupção.

É recomendável tratar o que é exibido durante a transmissão como uma projeção provisória. Ela pode ser útil para leitura, revisão e cancelamento, mas deve ser identificada como rascunho. Já o estado de negócio deve derivar de uma representação final controlada pelo servidor ou por um componente confiável. Essa regra vale tanto para assistentes conversacionais quanto para extração documental, geração de código, automação administrativa e agentes que usam ferramentas.

As APIs dos provedores não usam todas os mesmos nomes de eventos nem oferecem exatamente as mesmas garantias. Algumas documentam eventos incrementais, identificadores de resposta e um evento de conclusão; outras descrevem estados de execução ou um sinal de resultado. A integração deve se basear no contrato concreto da API escolhida, e não deduzir que há completude porque o tráfego deixou de chegar por alguns segundos.

02

Projete uma máquina de estados explícita

A maneira mais clara de impedir que a interface se torne um caminho de execução é modelar o ciclo de vida de cada geração. O identificador interno da geração deve ser criado antes da abertura da conexão e associado, quando existir, ao identificador devolvido pelo provedor. Ele também deve ser relacionado à sessão, à pessoa usuária ou ao principal autorizado, à versão do prompt ou da configuração aplicada e à operação de negócio solicitada.

O primeiro estado é recebido: chegou um evento com metadados de transporte, mas seu conteúdo ainda não foi aceito. Em seguida, o evento vai para o buffer provisório, onde é mantido por ordem de sequência ou pela posição definida pelo protocolo. O cliente pode ler esse buffer para renderizar um rascunho. Se o fluxo entregar partes de vários itens, como texto, raciocínio não exposto e argumentos de ferramenta, devem ser mantidos buffers separados por item e por tipo.

Em montagem, o consumidor transforma os fragmentos em uma representação candidata completa: texto final, objeto estruturado ou solicitação de ferramenta. Essa etapa não é uma validação. Por exemplo, o fato de uma concatenação poder ser interpretada como JSON não comprova que ela contém os campos permitidos, que os valores estão dentro de faixas aceitáveis ou que a pessoa usuária autorizou a ação resultante.

Uma saída só passa a validada depois da verificação do evento terminal ou do estado final documentado, da ordem e da integridade dos eventos necessários, do esquema esperado e das regras de negócio. Resultado confirmado também significa que o sistema persistiu a versão validada com uma chave estável e registrou a decisão. Ação executada é um estado posterior, não um sinônimo de validada: ela exige uma política de autorização, uma chave de idempotência e uma evidência de seu resultado.

Estados terminais alternativos merecem tratamento próprio. Cancelada indica que a pessoa usuária ou o sistema solicitou a interrupção da experiência; incompleta indica que faltou uma parte necessária ou que o provedor informou uma finalização não satisfatória; falha representa um erro processável; expirada indica que já não é seguro retomar. Nenhum deles deve promover o buffer provisório a resultado final.

Transição recomendada de uma geração

  1. 01Criar uma geração interna e registrar a finalidade da operação.
  2. 02Receber eventos e verificar que pertencem à geração esperada.
  3. 03Ordenar ou eliminar duplicidades dos eventos antes de adicioná-los aos buffers provisórios.
  4. 04Exibir somente a projeção provisória permitida pela interface.
  5. 05Após o sinal terminal documentado, montar a representação candidata.
  6. 06Validar integridade, esquema, regras de negócio e autorização.
  7. 07Persistir uma versão confirmada e imutável da saída validada.
  8. 08Se houver uma ferramenta, solicitar confirmação quando aplicável e executar com uma chave de idempotência.
03

Decida o que pode ser exibido, salvo, indexado ou executado

A política não deve depender apenas de o conteúdo parecer razoável. Ela deve depender de seu estado e da classe de fluxo. Um chat informativo tolera que a pessoa veja um rascunho marcado como tal. Uma extração que alimenta uma base de conhecimento exige uma versão final antes da indexação. Uma ferramenta que cria uma reserva, envia uma comunicação ou altera permissões requer controles adicionais, mesmo que seus argumentos já tenham passado por um esquema.

Salvar telemetria de transporte não equivale a persistir a saída como conteúdo de negócio. Pode ser legítimo reter um registro mínimo de evento recebido para depurar interrupções e reconciliar sessões, respeitando as políticas aplicáveis de privacidade e retenção. Isso deve ser diferenciado de armazenar o texto parcial como resposta aprovada. Da mesma forma, um log não deve transformar segredos, dados pessoais ou instruções potencialmente sensíveis em uma cópia sem controles.

A indexação exige uma decisão especialmente conservadora. Fragmentos parciais podem conter uma conclusão intermediária que desaparece ao final da resposta. Indexá-los cria recuperação futura de material não confirmado e torna mais difícil explicar o que uma pessoa viu e qual versão foi adotada pelo sistema. Indexe a versão validada, com seu identificador de geração e de versão, e permita remover ou substituir essa versão de maneira auditável.

Matriz de decisão por estado

EstadoExibir para a pessoaPersistir como resultadoIndexarExecutar uma ação externa
Evento recebidoNão necessariamente; primeiro verificar pertencimento e formatoNãoNãoNão
Buffer provisórioSim, como rascunho e com cancelamento disponívelApenas rastros técnicos mínimos, se a política permitirNãoNão
Objeto montadoOpcionalmente, ainda como provisórioNão como resultado confirmadoNãoNão
Saída validadaSim, como resultado finalSim, com versão e identificadorSim, se o fluxo exigirAinda não por padrão
Resultado confirmadoSimSimSim, quando apropriadoSomente se a política de ação autorizar
Ação executadaSim, com status e comprovante disponívelSim, registrar a decisão e o resultadoNão se aplicaJá realizada; não repetir sem idempotência
04

Consuma o transporte sem assumir que pacotes são mensagens

Em um fluxo baseado em eventos enviados pelo servidor, o protocolo define como os eventos são formados e prevê reconexões. O transporte usa texto codificado em UTF-8, e o limite de um pacote de rede não equivale ao limite de um caractere, de uma linha de evento ou de um objeto JSON. Por isso, o consumidor deve usar um decodificador incremental e um analisador de eventos; ele não deve converter cada leitura de bytes em uma cadeia independente e supor que ela contém um evento completo.

Depois de reconstruir um evento do protocolo, ainda é preciso interpretar o contrato da API. Um texto pode chegar em deltas; os argumentos de uma chamada de função podem chegar divididos; os itens de saída podem ser intercalados. O consumidor deve agrupar pelos identificadores documentados, como geração, item ou índice de saída, e aplicar números de sequência quando disponíveis. Uma entrega repetida não deve duplicar caracteres, criar dois objetos nem provocar uma segunda execução.

O encerramento da conexão também não é prova suficiente de sucesso. A conexão pode ser fechada por cancelamento, proxy, limite de tempo ou erro. Somente o sinal terminal e o estado documentado pelo provedor permitem classificar a geração como concluída, incompleta ou com falha. Se essa evidência estiver ausente, o estado correto é incerto ou incompleto, e a promoção e a execução devem ser bloqueadas.

Nem todas as APIs fornecem checksum, versão final ou mecanismo de retomada. Se existir um identificador de resposta e um cursor de sequência, preserve-os junto com o último evento aceito. Se não existir, uma reconexão pode exigir a criação de uma nova geração do ponto de vista de negócio. Não é seguro deduzir que duas sequências semelhantes são a mesma resposta apenas por seu conteúdo.

05

Chamada de ferramenta: completar não é autorizar

Chamadas de ferramentas merecem uma barreira independente porque transformam texto gerado em efeitos fora do modelo. O fato de aparecer o nome de uma função ou parte de seus argumentos não constitui uma solicitação executável. Os argumentos devem ser acumulados até o sinal de finalização correspondente, convertidos em uma representação estruturada e validados contra um esquema rigoroso. Campos desconhecidos, conversões implícitas e valores fora da política devem ser rejeitados ou exigir uma nova interação.

A validação de esquema é necessária, mas insuficiente. Uma ferramenta de transferência pode receber um valor com formato correto e, ainda assim, exceder um limite, não ter autorização ou apontar para um destinatário não permitido. As regras de negócio devem ser executadas no serviço que controla a ação, e não apenas no cliente que renderiza a conversa. Para operações significativas, uma confirmação da pessoa usuária deve exibir uma descrição estável da ação derivada dos argumentos já validados.

A execução deve carregar uma chave de idempotência calculada ou atribuída pelo servidor. Essa chave precisa estar vinculada à intenção confirmada, e não a cada nova tentativa de rede. Antes de tentar novamente, o executor consulta o registro de operações para saber se essa chave já possui um resultado. Isso é relevante porque o HTTP alerta que repetir uma operação não idempotente é inseguro quando não se consegue saber se a solicitação original chegou a ser aplicada.

O resultado da ferramenta também precisa de reconciliação. Se o provedor externo aceitar a operação, mas a resposta se perder, o estado não é «não executada»: ele é desconhecido até consultar um identificador de operação ou aplicar um procedimento de compensação. Projetar esse caso desde o início evita que um botão de tentar novamente se transforme em uma ordem duplicada.

Controles para uma ferramenta externa

EtapaControle mínimoResultado se falhar
Argumentos parciaisAcumular por identificador de chamada; não interpretar para executarManter rascunho ou descartar
Argumentos completosValidar JSON, esquema e campos permitidosRejeitar a chamada
IntençãoAplicar autorização, limites e regras de negócioBloquear e explicar o motivo
ConfirmaçãoSolicitá-la quando a política de risco exigirNão criar a ordem externa
ExecuçãoUsar chave de idempotência e registrar a tentativaConsultar o estado antes de tentar novamente
Resposta externaSalvar identificador e resultado verificávelMarcar como estado desconhecido ou pendente de reconciliação
06

Interrupções, cancelamentos, retomada e experiência de produto

Diante de uma interrupção, a aplicação deve preservar a distinção entre o que foi visto e o que foi confirmado. Ela pode manter o rascunho visível com um aviso de interrupção, oferecer uma nova tentativa ou tentar retomar quando o protocolo e o provedor derem suporte. Se houver retomada, deve solicitar ou processar apenas eventos posteriores ao último cursor confirmado e eliminar duplicidades de qualquer repetição. Se a continuidade não puder ser comprovada, é preferível iniciar uma nova geração e identificá-la como tal.

O cancelamento pela pessoa usuária exige duas operações diferentes: deixar de mostrar ou solicitar mais conteúdo e decidir o que acontece com o trabalho já iniciado. Cancelar a assinatura não implica necessariamente que o provedor tenha interrompido o processamento. O sistema deve registrar a solicitação de cancelamento, impedir promoções posteriores indesejadas e tratar qualquer evento que chegue depois segundo uma política definida. Uma ação externa já enviada exige consulta ou compensação, e não uma suposição baseada no fato de a interface ter sido fechada.

No produto, os indicadores devem comunicar atividade sem prometer conclusão. Um cursor de digitação, um estado de «gerando» e uma opção de parar são adequados para o rascunho. Uma etiqueta de «resultado pronto» deve ser reservada para a saída validada. Se for permitido editar o rascunho, a edição humana deve criar uma ramificação ou versão separada: ela não deve ser confundida com a resposta confirmada pelo sistema.

A recuperação de uma sessão deve conseguir explicar o que ocorreu. Preserve a relação entre a geração, os eventos aceitos, o último cursor, a versão validada e, se houver, a operação externa. Essa rastreabilidade não exige armazenar todo o texto indefinidamente; o nível de detalhe deve se ajustar à sensibilidade dos dados e às obrigações de retenção.

Resposta a uma desconexão

  1. 01Marcar a transmissão como interrompida sem declarar sucesso.
  2. 02Conservar o último identificador ou cursor aceito e o estado dos buffers.
  3. 03Tentar retomar somente com o mecanismo documentado pelo provedor.
  4. 04Eliminar duplicidades de eventos por sequência, identificador de evento ou ambos.
  5. 05Exigir novamente um sinal terminal válido antes de validar a saída.
  6. 06Se não houver continuidade demonstrável, encerrar como incompleta e oferecer uma nova geração.
  7. 07Bloquear qualquer ferramenta pendente até reconstruir e validar uma intenção completa.
07

Telemetria e testes antes da implantação

As métricas devem separar rapidez percebida e correção. Registre o tempo até o primeiro fragmento, o tempo até a finalização, o tempo até a validação e, em fluxos com ferramentas, o tempo até a confirmação e a execução. Registre também abandonos, cancelamentos, reconexões, eventos descartados por duplicidade, gerações incompletas e divergências entre o conteúdo provisório e a versão confirmada. Esses sinais permitem detectar se uma melhoria visual está escondendo uma degradação de completude.

Não use o texto completo como a única base de observabilidade. Um identificador de geração, o identificador do provedor quando existir, a sequência, o tipo de evento, as transições de estado e os motivos de rejeição geralmente são suficientes para investigar muitos incidentes. Quando for necessário conservar conteúdo para auditoria, aplique controles de acesso, minimização e uma política explícita de retenção.

Os testes de caos devem intervir em cada fronteira, e não apenas desconectar antes do primeiro token. Simule interrupções no meio de um caractere multibyte, entre linhas de evento, dentro de JSON, depois de argumentos de ferramenta aparentemente completos e imediatamente antes do sinal terminal. Simule reenvios de eventos, alterações de ordem quando o contrato não as proibir, respostas terminais de erro, cancelamentos tardios e perda da resposta do sistema externo. O critério principal é que nenhum caso transforme conteúdo incompleto em resultado confirmado nem provoque uma segunda ação para a mesma finalidade.

Como verificação de implantação, revise se o cliente não possui credenciais capazes de executar diretamente ações sensíveis; se a validação está centralizada; se o armazenamento de idempotência sobrevive a reinicializações razoáveis; e se os painéis distinguem uma geração abandonada de uma ação confirmada. Consulte também as áreas internas Aprender, Comparar e Descobrir para alinhar essa decisão de integração aos padrões e capacidades do produto.

Questões em aberto

  • A disponibilidade de identificadores de sequência, cursores de retomada e eventos terminais inequívocos varia entre APIs e versões.
  • A possibilidade de retomar uma transmissão e o comportamento diante de eventos repetidos devem ser verificados no contrato específico do provedor.
  • As regras que exigem confirmação humana dependem do risco da ferramenta, da autorização da pessoa usuária e das políticas de cada organização.
  • A retenção de buffers, rastros e conteúdo confirmado deve ser definida conforme a sensibilidade dos dados e os requisitos aplicáveis.
08

Continue a explorar

08

Fontes consultadas

03

Correções e transparência

Se encontrar informação incorreta ou desatualizada, envie-nos a página e a fonte que devemos rever.

Propor uma correção