· ENPT-BR
Grok Build para Alembic · Mecânica da integração

JSONL headless: reconstrua a resposta com honestidade

Siga eventos thought, text, end e error sem inventar um evento de resultado final.

Fonte primária
Guia fixado do modo headless

Commit upstream fixado: b189869b7755d2b482969acf6c92da3ecfeffd36

A camada Simples se sustenta sozinha; abra Técnico para contratos exatos e edge cases.
Ao final, você consegue
  • Reconstruir uma resposta a partir de deltas de texto ordenados.
  • Ler `end` como metadata, não texto da resposta.
  • Explicar por que eventos desconhecidos são ignorados e falha de processo ainda falha.
1

A grande ideia


No modo streaming o Grok imprime um objeto JSON por linha. O texto chega em partes, então o Alembic concatena cada campo `data` na ordem. A linha final `end` fecha o stream e carrega metadados de sessão e uso; ela não repete a resposta. Linhas desconhecidas são ignoradas para que um evento futuro não corrompa o resultado atual.

Pense como… É um trem: cada linha `text` é um vagão com parte da resposta, enquanto `end` é a lanterna do guarda confirmando que o trem terminou. A lanterna traz documentação, não outro vagão. A analogia quebra porque o JSONL pode incluir tipos de evento ignoráveis entre chunks de texto.

`parseStreamLine` é stateless: `text` vira evento de texto; `end` pode virar eventos de sessão e uso; `error` vira detalhe de resultado/erro; thought, desconhecido, malformado e não JSON não produzem eventos. O estado vive no acumulador ordenado do Orchestrator.

O fallback do resultado é `resultText || accumulatedOutput || raw stdout`. A ordem importa: o stream normal do Grok tem deltas mais end somente com metadata, então o texto acumulado precisa vencer o JSONL bruto. Exit não zero ainda falha a execução e prefere stderr no diagnóstico.

Evidência: Guia fixado do modo headless

stdinprocessoJSONLthoughttext-1 Seguro: concatenar apenas `text.data`, então retornar o acumulador.
Siga eventos thought, text, end e error sem inventar um evento de resultado final.
2

Compare as fronteiras


Seguro
Seguro: concatenar apenas `text.data`, então retornar o acumulador.
Arriscado
Arriscado: serializar `end` ou JSONL bruto como resposta do assistente.
SuperfícieUpstreamAlembicVeredito
textDelta de resposta em `data`Concatenar ao acumuladorKEEP
thoughtStream de raciocínioIgnorar no output do providerIGNORE
endMetadata de sessão + usoEmitir metadata; sem texto finalCLOSE

O fallback do resultado é `resultText || accumulatedOutput || raw stdout`. A ordem importa: o stream normal do Grok tem deltas mais end somente com metadata, então o texto acumulado precisa vencer o JSONL bruto. Exit não zero ainda falha a execução e prefere stderr no diagnóstico.

3

Código e comandos reais


packages/factory/src/GrokAgentProvider.ts
if (event.type === "text" && typeof event.data === "string") {
  return [{ type: "text", text: event.data }];
}

if (event.type !== "end") return [];
if (typeof event.sessionId === "string") {
  parsed.push({ type: "session_id", sessionId: event.sessionId });
}
Como chegar lá
sed -n '35,120p' packages/factory/src/GrokAgentProvider.ts
sed -n '145,205p' packages/factory/src/Orchestrator.ts

Evidência: RESOURCES.md

4

Atlas visual


entradaprovastdin
Trace a fronteira: stdin.
superfíciecosturadonoprocesso
Localize o dono: processo.
afirmaçãosem gateevidênciana fronteiravsJSONL
Compare afirmação e evidência: JSONL.
aprenderexecutarverificarthought
Leia a sequência: thought.
completo?sim / nãotext-1
Encontre o gate de decisão: text-1.
entradaprovatext-2
Trace a fronteira: text-2.
superfíciecosturadonoend
Localize o dono: end.
afirmaçãosem gateevidênciana fronteiravssessionId
Compare afirmação e evidência: sessionId.
aprenderexecutarverificarusage
Leia a sequência: usage.
completo?sim / nãoerro
Encontre o gate de decisão: erro.
entradaprovaparser
Trace a fronteira: parser.
superfíciecosturadonoacumulador
Localize o dono: acumulador.
afirmaçãosem gateevidênciana fronteiravsresultado
Compare afirmação e evidência: resultado.
aprenderexecutarverificarstderr
Leia a sequência: stderr.
5

Prática e feedback


Preveja antes de revelar

O stream emite dois deltas de texto e então `end`. Onde está a resposta final?

Na concatenação ordenada dos dois deltas; `end` contribui apenas metadata.

Cartões de recuperação

Cartões de recuperaçãoJSONLClique ou pressione Enter para virar
JSONLUm objeto JSON completo por linha.
Cartões de recuperaçãoText deltaClique ou pressione Enter para virar
Text deltaUm chunk parcial da resposta concatenado em ordem.
Cartões de recuperaçãoTerminal eventClique ou pressione Enter para virar
Terminal eventO evento final de metadata, sempre por último.
Cartões de recuperaçãoAccumulatorClique ou pressione Enter para virar
AccumulatorEstado do Orchestrator que reconstrói a resposta.
No modo streaming o Grok imprime um objeto JSON por linha. O texto chega em partes, então o Alembic concatena cada campo `data` na ordem. A linha final `end` fecha o stream e carrega metadados de sessão e uso; ela não repete a resposta. Linhas desconhecidas são ignoradas para que um evento futuro não corrompa o resultado atual.
`parseStreamLine` é stateless: `text` vira evento de texto; `end` pode virar eventos de sessão e uso; `error` vira detalhe de resultado/erro; thought, desconhecido, malformado e não JSON não produzem eventos. O estado vive no acumulador ordenado do Orchestrator.

Percorra o stream

Selecione um evento e veja a ação exata do provider.

Veredito

Resumo em quatro slides

JSONL

Um objeto JSON completo por linha.

Text delta

Um chunk parcial da resposta concatenado em ordem.

Terminal event

O evento final de metadata, sempre por último.

Accumulator

Estado do Orchestrator que reconstrói a resposta.

Teste seu modelo

Revisão espaçada

Qual evento fornece o texto normal da resposta final?

`text` carrega deltas. `end` fecha o stream e carrega metadata.
6

Fontes e próximo movimento


Peça ao seu professor para desafiar um veredito, repetir um evento ou revisar uma unidade futura com a mesma disciplina de prova.