← Vytvářejte agenty na Cloudflare / agents / harnesses / think
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); // falseconst 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); // falsePokud 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.