INTEGRITY Dokumentace

Programové odesílání

Trvale přijměte kolo Think a vraťte se ještě před spuštěním inference. Použijte submitMessages() pro handlery webhooků, volající RPC a nadřazené Workery, které potřebují rychlé potvrzení, bezpečné opakování a pozdější kontrolu stavu.

Deklarativní naplánované úlohy s prompty interně používají stejnou trvalou cestu odesílání. Použijte getScheduledTasks() když je spouštěč opakovaný a deklarovaný v kódu; použijte submitMessages() přímo, když externí volající nebo webhook vytvoří jednorázovou práci. Chcete-li na odpověď počkat přímo v kódu, použijte saveMessages() místo toho.

submitMessages

async submitMessages(
	messages: UIMessage[],
	options?: {
		submissionId?: string;
		idempotencyKey?: string;
		metadata?: Record<string, unknown>;
	},
): Promise<SubmitMessagesResult>

submitMessages() přijímá serializovatelné UIMessage[] hodnoty. Nepřijímá tvar funkce podporovaný saveMessages((messages) => ...), protože trvalá odeslání ukládají práci ještě před spuštěním a nemohou uchovávat closures. Pole musí obsahovat alespoň jednu zprávu.

const submission = await this.submitMessages(
	[
		{
			id: crypto.randomUUID(),
			role: "user",
			parts: [{ type: "text", text: "Process webhook event 123" }],
		},
	],
	{ idempotencyKey: "webhook-event-123" },
);

return Response.json({
	submissionId: submission.submissionId,
	status: submission.status,
	accepted: submission.accepted,
});
const submission = await this.submitMessages(
	[
		{
			id: crypto.randomUUID(),
			role: "user",
			parts: [{ type: "text", text: "Process webhook event 123" }],
		},
	],
	{ idempotencyKey: "webhook-event-123" },
);

return Response.json({
	submissionId: submission.submissionId,
	status: submission.status,
	accepted: submission.accepted,
});

Stavy odeslání

Stav Význam
pending Přijato a čeká na své pořadí
running Převzato agentem a právě se provádí
completed Kolo Think bylo úspěšně dokončeno
aborted Odeslání bylo zrušeno
skipped Stav kola byl resetován před spuštěním odeslání
error Spuštění selhalo nebo obnovení nebylo bezpečné

Idempotentní opakování pokusů

Předejte idempotencyKey z vašeho externího systému. Opakování se stejným klíčem vrátí existující odeslání s accepted: false místo vkládání duplicitních zpráv:

const first = await this.submitMessages(messages, {
	idempotencyKey: payload.id,
});

const retry = await this.submitMessages(messages, {
	idempotencyKey: payload.id,
});

console.log(first.submissionId === retry.submissionId); // true
console.log(retry.accepted); // false
const first = await this.submitMessages(messages, {
	idempotencyKey: payload.id,
});

const retry = await this.submitMessages(messages, {
	idempotencyKey: payload.id,
});

console.log(first.submissionId === retry.submissionId); // true
console.log(retry.accepted); // false

Pokud předáte obě submissionId a idempotencyKey, musí identifikovat stejné podání. Pokud odkazují na různá existující podání, submitMessages() vyvolá výjimku.

Prohlížení, výpis, rušení a mazání

Použijte API pro odesílání k prozkoumání aktivní práce, zrušení trvalého odeslání a vyčištění ukončených záznamů:

const current = await this.inspectSubmission(submission.submissionId);

const active = await this.listSubmissions({
	status: ["pending", "running"],
});

await this.cancelSubmission(submission.submissionId, "No longer needed");

await this.deleteSubmissions({
	status: ["completed", "error", "aborted"],
	completedBefore: new Date(Date.now() - 7 * 24 * 60 * 60 * 1000),
});
const current = await this.inspectSubmission(submission.submissionId);

const active = await this.listSubmissions({
	status: ["pending", "running"],
});

await this.cancelSubmission(submission.submissionId, "No longer needed");

await this.deleteSubmissions({
	status: ["completed", "error", "aborted"],
	completedBefore: new Date(Date.now() - 7 * 24 * 60 * 60 * 1000),
});

Použijte cancelSubmission(submissionId) pro trvalé zrušení napříč hranicemi RPC mezi Workerem a Durable Object. Použijte AbortSignal hodnotou saveMessages() nebo continueLastTurn() pouze tehdy, když volající vytvoří signál uvnitř Durable Object, který dané kolo zpracovává.

Chování Session

Think nejprve ukládá přijatá odeslání do deníku odeslání. Odeslané zprávy připojí ke konverzační Session až ve chvíli, kdy se odeslání začne provádět. Později přijatá odeslání zůstávají modelu skrytá, dokud nezačne jejich vlastní kolo, což zachovává sémantiku kol založenou na principu FIFO.

Pokud odeslání zrušíte dříve, než se jeho zprávy použijí, a to i v případě, že už bylo přijato ke zpracování, ale stále čeká na své kolo, tyto zprávy se do konverzace neuloží.

Pokud se chat vymaže nebo se stav kola resetuje dříve, než proběhne čekající odeslání, toto odeslání se označí jako skipped.

Srovnání s Workflows

Používejte Workflows pro vícekrokovou orchestraci, opakování jednotlivých kroků, dlouhá čekání, externí události, schválení člověkem nebo pipeline, které mohou jako součást většího procesu spustit Think. Viz Think Workflows.