Payloads e transporte
Envelope
interface PayloadEnvelope {
schema_version: 1
account_id: string
project_id: string
resource: string
resource_id: string
source: PayloadSource
references: ArtifactRef[]
payload: JsonObject
}account_id e project_id vêm do projeto validado. Eles roteiam e contextualizam um payload; não são credenciais nem autorizam acesso. resource é o pilar e o tipo, como vision.prd, e resource_id é o ID do artefato ou evento.
Para um artefato Markdown, payload é { metadata, body }. Payloads Record e Drift Event são seus envelopes JSON validados. references são as referências explícitas derivadas da entrada validada.
Proveniência da origem
PayloadSource.kind é um destes valores:
markdown— exige umpathrelativo segurojson— exige umpathrelativo segurointegration— exigeintegrationeexternal_id
Artefatos analisados inferem markdown ou json a partir do caminho. Um Record direto infere sua origem de integração. Um Drift Event direto não tem campo de origem, então quem chama a API deve fornecer a proveniência explicitamente.
createPayload(
project: Project,
input: ParsedArtifact | RecordEvent | DriftEvent,
source?: PayloadSource
): PayloadEnvelopeObjetos de origem rejeitam campos adicionais e combinações inválidas. A proveniência de arquivos usa as mesmas restrições de sintaxe de caminhos relativos dos artefatos locais.
Transporte injetado
interface PayloadTransport {
send(
payload: PayloadEnvelope,
context: { authorization: string }
): Promise<{ correlationId?: string }>
}sendPayload valida e constrói o envelope, resolve uma credencial e chama essa interface fornecida por quem chama a API. Ele não escolhe um endpoint nem uma topologia de protocolo.
As credenciais usam uma referência env:NAME. resolveCredential lê o valor em tempo de execução e rejeita valores ausentes ou que contenham quebra de linha ou byte nulo. A credencial é passada separadamente no contexto de transporte e nunca é incluída no envelope do payload.
await sendPayload(project, input, transport, {
credentialRef: 'env:LANGDRIFT_TOKEN',
source
})O SDK não fornece cliente HTTP, persistência, processamento em lote, fila em segundo plano, novas tentativas automáticas ou envio automático. Não coloque segredos em corpos Markdown e dados de Record, pois esses campos são conteúdo do payload.
Erros de transporte
Um adaptador injetado pode lançar TransportError(status). sendPayload mapeia:
401ou403paraREMOTE_UNAUTHORIZED- outros status
4xxparaREMOTE_REJECTED - todas as outras falhas de transporte para
MCP_UNAVAILABLE
Eles se tornam valores LangDriftError. Corpos brutos de respostas remotas, rastreamentos de pilha e credenciais não são encaminhados. Dados de transporte indisponível não ficam em fila local; qualquer nova tentativa é explícita.