INTEGRITY Dokumentace

Kanály

Kanál je rozhraní, přes které agent Think komunikuje: WebSocket prohlížeče, webhook messengeru (Telegram, Slack a podobně), hlas nebo váš vlastní transport. Kanály zobecňují messengery do jednoho slovníku, abyste mohli uplatnit zásady pro jednotlivé kanály (jiný systémový prompt, zúžená sada nástrojů, limit kroků) a doručovat mimopásmová upozornění bez ohledu na to, z jakého rozhraní kolo přišlo.

Každý agent Think má vždy implicitní web kanál (WebSocket chat, který používají klienti ve vašem prohlížeči). Další kanály deklarujete a přepisujete web zásady: s configureChannels(). Messengery vrácené z getMessengers() se automaticky absorbují jako messenger kanály, takže stávající messengerové aplikace fungují beze změny.

Konfigurace kanálů

Přepsat configureChannels() k vrácení mapy ID kanálu na ChannelDefinition. Pomocí id vybíráte kanál pro dané kolo:

import { Think, messengerChannel } from "@cloudflare/think";
import { telegram } from "@chat-adapter/telegram";

export class Assistant extends Think {
	configureChannels() {
		return {
			// Override policy for the built-in web channel.
			web: {
				kind: "web",
				ingress: { transport: "websocket" },
				instructions: "You are chatting in a web app. Use markdown freely.",
			},
			// A voice channel with tighter limits.
			voice: {
				kind: "voice",
				ingress: { transport: "voice" },
				instructions: "Keep replies short and speakable. No markdown.",
				maxTurns: 3,
			},
			// A messenger channel (Chat SDK webhook).
			telegram: messengerChannel(telegram({/* adapter config */})),
		};
	}
}
import { Think, messengerChannel } from "@cloudflare/think";
import { telegram } from "@chat-adapter/telegram";

export class Assistant extends Think<Env> {
	configureChannels() {
		return {
			// Override policy for the built-in web channel.
			web: {
				kind: "web",
				ingress: { transport: "websocket" },
				instructions: "You are chatting in a web app. Use markdown freely.",
			},
			// A voice channel with tighter limits.
			voice: {
				kind: "voice",
				ingress: { transport: "voice" },
				instructions: "Keep replies short and speakable. No markdown.",
				maxTurns: 3,
			},
			// A messenger channel (Chat SDK webhook).
			telegram: messengerChannel(
				telegram({
					/* adapter config */
				}),
			),
		};
	}
}

A ChannelDefinition má tato pole:

Pole Typ Popis
kind "web" | "messenger" | "voice" | "custom" Kategorie rozhraní.
ingress { transport: "websocket" | "voice" } nebo specifikaci webhook messengeru Jak kola přicházejí. messengerChannel() za vás sestaví formulář webhooku.
instructions string | (ctx: ChannelContext) => string | Promise<string> Připojeno na začátek systémového promptu pro kola v tomto kanálu.
tools (all: ToolSet) => ToolSet Zužte sestavenou sadu nástrojů pro tento kanál (pouze filtrování, nelze přidávat nástroje).
maxTurns number Limit počtu kroků modelu na kanál pro jedno kolo.
capabilities ChannelCapabilities Zpřístupňuje možnosti (streamování, úpravy zpráv). Výchozí nastavení platí pro web.
conversation režim konverzace v messengeru nebo resolver Směrování vláken Messengeru (viz Messengery).
delivery zásada doručování kanálu Zásada doručování Messengeru.

Použijte defineChannels() pomocnou funkci pro odvozování typů a messengerChannel() k zabalení definice adaptéru Chat SDK jako kind: "messenger" kanál.

Typy kanálů

Typ Ingress Poznámky
web { transport: "websocket" } Vždy přítomné. Deklarujte v configureChannels() pouze pro nastavení zásady; nelze ji odebrat.
messenger webhook (messengerChannel(...)) Předáno do běhového prostředí messengeru. Odpovídá getMessengers() položka.
voice { transport: "voice" } Uplatňuje zásady a kontext kola; mimopásmové doručování zatím není zapojeno.
custom definováno aplikací Pro vlastní transport. Stejná omezení doručování jako u voice dnes.

Zásady pro jednotlivé kanály

Zásada kanálu se uplatňuje jako přepsatelná výchozí hodnota před beforeTurn se spustí, takže beforeTurn override má stále přednost:

Vyberte kanál pro kolo

Předejte channel na runTurn() (nebo chat()) ke spuštění kola na konkrétním kanálu. ID kanálu se otiskne do uživatelské zprávy, takže pokračující nebo obnovené kolo znovu přiřadí stejný kanál a znovu uplatní jeho zásadu:

export class Assistant extends Think {
	async speak() {
		await this.runTurn({ input: "Read this out loud", channel: "voice" });
	}
}
export class Assistant extends Think<Env> {
	async speak() {
		await this.runTurn({ input: "Read this out loud", channel: "voice" });
	}
}

Uvnitř tahu je aktivní kanál dostupný jako this.activeChannel (typu ChannelContext hodnotou channelId, kind, a podrobnosti messengeru, pokud jsou relevantní). Kolo bez channel se spustí bez kontextu kanálu a neuplatní žádné zásady kanálu.

Doručit mimo běžný komunikační kanál

deliverNotice() odešle zprávu do kanálu bez před začátkem kola modelu. Použijte ho pro aktualizace stavu („váš import byl dokončen“) nebo pro zobrazení příloha odpovědi : nespouští inferenci, nevstupuje do fronty kol, a proto je bezpečné jej volat zevnitř execute:

export class Assistant extends Think {
	async notify() {
		await this.deliverNotice("Your export is ready to download.");

		await this.deliverNotice("Background research finished.", {
			informModel: true, // also record it in the transcript so the next turn knows
		});
	}
}
export class Assistant extends Think<Env> {
	async notify() {
		await this.deliverNotice("Your export is ready to download.");

		await this.deliverNotice("Background research finished.", {
			informModel: true, // also record it in the transcript so the next turn knows
		});
	}
}
type DeliverNoticeOptions = {
	channel?: string; // defaults to the active turn's channel, else "web"
	informModel?: boolean; // also write to the model-visible transcript (default false)
	kind?: "final" | "interim" | "notice" | "command"; // wire tag (default "notice")
	thread?: string; // required for out-of-turn delivery to a multi-thread messenger
};

Chování závisí na cílovém kanálu:

Přepsat renderAttachment(attachment) k převedení přílohy s odpovědí na akci na oznámení; Think ji volá na konci tahu a vykreslený text doručí jako závěrečné interim oznámení. Vraťte undefined k přeskočení typu přílohy.

Vztah k messengerům

configureChannels() obaluje getMessengers() : Nenahrazuje ji. Každé getMessengers() položka se stane kind: "messenger" kanál a vše v Messengery průvodce (nastavení Telegramu, směrování webhooků, cíle konverzace, doručování a obnova) platí i nadále. Id kanálu v configureChannels() která koliduje s getMessengers() id je chyba. Nadále používejte getMessengers() pro aplikace určené pouze pro zasílání zpráv; sáhněte po configureChannels() když také chcete web/voice/custom zásady nebo mimopásmová oznámení.

Observabilita

Aktivita kanálu se hlásí na channel kanál pozorovatelnosti:

import { subscribe } from "agents/observability";

const unsubscribe = subscribe("channel", (event) => {
	// event.type is one of:
	//   "channel:resolved"  — a turn resolved a registered channel
	//   "channel:delivered" — a turn's final reply was delivered
	//   "notice:delivered"  — deliverNotice() succeeded
	//   "notice:failed"     — deliverNotice() threw
});
import { subscribe } from "agents/observability";

const unsubscribe = subscribe("channel", (event) => {
	// event.type is one of:
	//   "channel:resolved"  — a turn resolved a registered channel
	//   "channel:delivered" — a turn's final reply was delivered
	//   "notice:delivered"  — deliverNotice() succeeded
	//   "notice:failed"     — deliverNotice() threw
});

Referenční informace

Člen Popis
configureChannels() Vraťte mapu kanálů. Výchozí hodnota je {} (implicitní web pouze kanál).
deliverNotice(text, options?) Odešlete mimopásmovou zprávu do kanálu bez kola modelu.
activeChannel ChannelContext pro právě probíhající kolo, nebo undefined.
renderAttachment(attachment) Namapovat přílohu odpovědi na text oznámení kanálu (nebo undefined k přeskočení).
defineChannels(channels) Pomocná funkce identity pro odvozování typu mapy kanálů.
messengerChannel(definition) Obalte adaptér Chat SDK jako kind: "messenger" kanál.