Aller au contenu principal

API de dialogue

@grant CAT.agent.conversation

L'API de dialogue est le cœur du système Agent : elle permet à un script de créer des dialogues IA, d'envoyer des messages et de recevoir des réponses.

Créer un dialogue

const conv = await CAT.agent.conversation.create(options?);

ConversationCreateOptions

ParamètreTypeDéfautDescription
idstringgénéré automatiquementID du dialogue, utilisé pour reprendre un dialogue existant
systemstringInvite système personnalisée, ajoutée après l'invite intégrée
modelstringmodèle par défautID du modèle (obtenu après configuration sur la page de gestion)
maxIterationsnumber20Nombre maximal de boucles d'appels d'outils au sein d'un tour de dialogue
skills"auto" | string[]"auto" charge automatiquement tous les Skills, ou un tableau de noms de Skills spécifiques
toolsToolDefinition[]Liste d'outils personnalisés (voir ci-dessous)
commandsRecord<string, CommandHandler>Commandes de dialogue personnalisées
ephemeralbooleanfalseUn dialogue éphémère qui n'est pas persisté dans le stockage
cachebooleantrueActive la mise en cache des invites (réduit la consommation de jetons)

Outils personnalisés

Un script peut enregistrer ses propres outils que l'IA pourra appeler :

const conv = await CAT.agent.conversation.create({
tools: [{
name: "get_weather",
description: "Get weather information for the specified city",
parameters: {
type: "object",
properties: {
city: {
type: "string",
description: "City name"
},
unit: {
type: "string",
enum: ["celsius", "fahrenheit"],
description: "Temperature unit"
}
},
required: ["city"]
},
handler: async (args) => {
// args = { city: "Beijing", unit: "celsius" }
const data = await fetchWeather(args.city, args.unit);
return { temperature: data.temp, condition: data.condition };
}
}]
});

Les parameters d'un outil suivent la spécification JSON Schema. L'IA utilise description pour comprendre quand et comment appeler l'outil.

Commandes personnalisées

Des commandes personnalisées commençant par / peuvent être enregistrées :

const conv = await CAT.agent.conversation.create({
commands: {
"/export": async (args) => {
// Triggered when the user types "/export pdf"
await exportToPdf(args);
return "Export complete";
}
}
});

Commandes intégrées : /new (efface l'historique du dialogue) — peut être remplacée par un gestionnaire personnalisé.

Obtenir un dialogue existant

const conv = await CAT.agent.conversation.get(conversationId);
// Returns null if the conversation doesn't exist

Méthodes de ConversationInstance

chat — dialogue synchrone

const reply = await conv.chat(content, options?);

Envoie un message et attend la réponse complète. L'IA peut appeler des outils en répondant ; chat attend la fin de toute l'exécution des outils avant de retourner le résultat final.

Paramètres :

ParamètreTypeDescription
contentstring | ContentBlock[]Contenu du message, texte ou blocs de contenu multimodaux
options.toolsToolDefinition[]Outils supplémentaires à ajouter pour cet appel uniquement (fusionnés avec les outils passés à la création)

Retourne ChatReply :

ChampTypeDescription
contentstring | ContentBlock[]Contenu de la réponse de l'IA
thinkingstringProcessus de réflexion du modèle (seuls certains modèles le prennent en charge)
toolCallsToolCall[]Enregistrement des appels d'outils effectués pendant cette réponse
usage{ inputTokens, outputTokens }Consommation de jetons
commandbooleanIndique si cette réponse a été déclenchée par une commande

chatStream — dialogue en flux

const stream = await conv.chatStream(content, options?);
for await (const chunk of stream) {
// Handle streaming events
}

Reçoit la réponse de l'IA en temps réel — utile lorsque vous devez afficher la sortie de manière incrémentale.

Types d'événements StreamChunk :

typeChampsDescription
content_deltacontent: stringContenu texte incrémental
thinking_deltathinking: stringContenu de réflexion incrémental
tool_calltoolCall: ToolCallInformations sur l'appel d'outil (déclenché lors des changements d'état)
content_blockblock: ContentBlockUn bloc de contenu (image, fichier, etc.)
doneusage: { inputTokens, outputTokens }Tour de dialogue terminé
errorerror: string, errorCode?: stringErreur

Codes d'erreur (errorCode) :

CodeDescription
rate_limitLimite de débit de l'API atteinte ; généralement relancé automatiquement
authÉchec de l'authentification ; vérifiez la clé API
tool_timeoutDélai d'expiration de l'exécution d'un outil
max_iterationsNombre maximal de boucles d'appels d'outils atteint
api_errorAutre erreur d'API

getMessages — obtenir l'historique des messages

const messages = await conv.getMessages();

Retourne un ChatMessage[] contenant tous les messages du dialogue.

Forme de ChatMessage :

ChampTypeDescription
idstringID du message
role"user" | "assistant" | "system" | "tool"Rôle du message
contentstring | ContentBlock[]Contenu du message
thinking{ content: string }Processus de réflexion (messages assistant — notez qu'il s'agit d'un objet, pas d'une simple chaîne)
errorstringMessage d'erreur si ce tour a échoué
modelIdstringID du modèle utilisé pour ce message
durationMsnumberDurée totale de la réponse en ms
parentIdstringID du message parent (pour la ramification)
toolCallsToolCall[]Enregistrement des appels d'outils (messages assistant)
toolCallIdstringID de l'appel d'outil correspondant (messages d'outil)
usage{ inputTokens, outputTokens }Consommation de jetons
createtimenumberHorodatage de création

clear — effacer le dialogue

await conv.clear();

Efface tout l'historique des messages du dialogue.

save — persister le dialogue

await conv.save();

Enregistre les métadonnées du dialogue dans le stockage. Les dialogues éphémères (ephemeral: true) ne sont pas enregistrés par défaut ; appeler cette méthode les convertit en dialogue persisté.

Propriétés d'instance

PropriétéTypeDescription
idstringID du dialogue
titlestringTitre du dialogue
modelIdstringID du modèle utilisé

Contenu multimodal

Le contenu d'un message peut être une chaîne de texte simple, ou un tableau ContentBlock[] pour prendre en charge les entrées multimodales :

// Send text + an image
await conv.chat([
{ type: "text", text: "Please analyze what's in this image" },
{ type: "image", attachmentId: "img-id", mimeType: "image/png" }
]);

Types de ContentBlock

typeChamps obligatoiresDescription
texttext: stringContenu texte
imageattachmentId: string, mimeType: stringImage ; nécessite un modèle avec capacités visuelles
fileattachmentId: string, mimeType: string, name: stringFichier
audioattachmentId: string, mimeType: stringAudio

Dialogues éphémères vs persistés

FonctionnalitéDialogue persisté (défaut)Dialogue éphémère
Stockage des messagesPersisté dans OPFSEn mémoire uniquement
Outils intégrésTous disponiblesNon inclus ; fournissez les vôtres via tools
Liste des dialoguesVisibleNon visible
Mise en cache des invitesprise en chargePeut être désactivée
Cas d'usageDialogues à usage généralTâches légères ponctuelles et questions-réponses rapides

Gestion du contexte

Compression automatique

Lorsque l'utilisation du contexte du dialogue dépasse 80 % de la fenêtre de contexte du modèle, le système appelle automatiquement le LLM pour générer un résumé de l'historique, remplaçant les messages plus anciens afin de libérer de l'espace.

Mise en cache des invites

Activée par défaut. Pour les modèles Anthropic, l'invite système et l'historique des messages sont mis en cache, ce qui réduit considérablement la consommation de jetons et la latence des tours répétés.

Peut être désactivée via cache: false :

const conv = await CAT.agent.conversation.create({ cache: false });

Exemple complet

// ==UserScript==
// @name Smart translation assistant
// @match *://*/*
// @grant CAT.agent.conversation
// @grant CAT.agent.dom
// ==/UserScript==

// Create a conversation with a custom tool
const conv = await CAT.agent.conversation.create({
system: "You are a translation assistant. The user will give you web page content — please translate it into Chinese.",
tools: [{
name: "get_selection",
description: "Get the text the user has selected on the page",
parameters: { type: "object", properties: {} },
handler: async () => {
return { text: window.getSelection()?.toString() || "No text selected" };
}
}]
});

// Stream the translation result
const stream = await conv.chatStream("Please get the selected text and translate it into Chinese");
let result = "";
for await (const chunk of stream) {
if (chunk.type === "content_delta") {
result += chunk.content;
// Update the UI in real time
updateTranslationUI(result);
}
}