← Vytvářejte agenty na Cloudflare / agents / harnesses / think
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:
instructionsse připojí před základní systémový prompt pro dané kolo.toolsfiltruje sestavenou sadu nástrojů (může nástroje pouze odebírat,getTools()seam je přidává).maxTurnsomezuje počet kroků modelu:beforeTurn:maxStepszvítězí, poté kanálmaxTurns, poté instancemaxStepsvýchozí hodnota.
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:
web: oznámení se vždy připojí k přepisu (to je jeho jediná cesta vykreslení).informModelpak řídí pouze formulaci.messenger: oznámení se odešle poskytovateli. Mimo pořadí kol předejtethreadk zacílení na konverzaci. SinformModel: true, zapíše se také do přepisu.voice/custom: doručení mimo kolo vyvolá výjimku, protože tato doručovací rozhraní zatím nemají cíl doručení.
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. |
Související
- Messengery : Podrobně o nastavení a doručování webhooků Chat SDK.
- Akce : zaznamená přílohy odpovědi pro
renderAttachment(). - Hlas : rozhraní pro řeč v reálném čase.