Saltar al contenido principal

API de Conversación

@grant CAT.agent.conversation

La API de Conversación es el núcleo del sistema Agent, permitiendo a un script crear conversaciones con IA, enviar mensajes y recibir respuestas.

Crear una conversación

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

ConversationCreateOptions

ParámetroTipoPredeterminadoDescripción
idstringauto-generadoID de conversación, usado para reanudar una conversación existente
systemstringPrompt del sistema personalizado, añadido después del prompt integrado
modelstringmodelo predeterminadoID del modelo (obtenido después de configurarlo en la página de gestión)
maxIterationsnumber20Conteo máximo de bucles de llamadas a herramientas dentro de un turno de conversación
skills"auto" | string[]"auto" carga todas las Skills automáticamente, o un array de nombres de Skills específicas
toolsToolDefinition[]Lista de herramientas personalizadas (ver abajo)
commandsRecord<string, CommandHandler>Comandos de conversación personalizados
ephemeralbooleanfalseUna conversación efímera que no se persiste en almacenamiento
cachebooleantrueHabilitar caché de prompts (reduce el uso de tokens)

Herramientas personalizadas

Un script puede registrar sus propias herramientas para que la IA las llame:

const conv = await CAT.agent.conversation.create({
tools: [{
name: "get_weather",
description: "Obtener información del clima para la ciudad especificada",
parameters: {
type: "object",
properties: {
city: {
type: "string",
description: "Nombre de la ciudad"
},
unit: {
type: "string",
enum: ["celsius", "fahrenheit"],
description: "Unidad de temperatura"
}
},
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 };
}
}]
});

Los parameters de una herramienta siguen la especificación JSON Schema. La IA usa description para entender cuándo y cómo llamar a la herramienta.

Comandos personalizados

Se pueden registrar comandos personalizados que comienzan con /:

const conv = await CAT.agent.conversation.create({
commands: {
"/export": async (args) => {
// Se activa cuando el usuario escribe "/export pdf"
await exportToPdf(args);
return "Exportación completa";
}
}
});

Comandos integrados: /new (limpiar historial de conversación) — puede ser anulado por un manejador personalizado.

Obtener una conversación existente

const conv = await CAT.agent.conversation.get(conversationId);
// Retorna null si la conversación no existe

Métodos de ConversationInstance

chat — chat síncrono

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

Envía un mensaje y espera la respuesta completa. La IA puede llamar herramientas mientras responde; chat espera a que termine toda la ejecución de herramientas antes de retornar el resultado final.

Parámetros:

ParámetroTipoDescripción
contentstring | ContentBlock[]Contenido del mensaje, texto o bloques de contenido multimodales
options.toolsToolDefinition[]Herramientas extra a añadir solo para esta llamada (se combinan con las herramientas pasadas en la creación)

Retorna ChatReply:

CampoTipoDescripción
contentstring | ContentBlock[]El contenido de la respuesta de la IA
thinkingstringEl proceso de razonamiento del modelo (solo algunos modelos soportan esto)
toolCallsToolCall[]Registro de llamadas a herramientas realizadas durante esta respuesta
usage{ inputTokens, outputTokens }Uso de tokens
commandbooleanSi esta respuesta fue activada por un comando

chatStream — chat en streaming

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

Recibe la respuesta de la IA en tiempo real — útil cuando necesitas mostrar salida incrementalmente.

Tipos de eventos StreamChunk:

tipoCamposDescripción
content_deltacontent: stringContenido de texto incremental
thinking_deltathinking: stringContenido de razonamiento incremental
tool_calltoolCall: ToolCallInformación de llamada a herramienta (se dispara en cambios de estado)
content_blockblock: ContentBlockUn bloque de contenido (imagen, archivo, etc.)
doneusage: { inputTokens, outputTokens }Turno de conversación completo
errorerror: string, errorCode?: stringError

Códigos de error (errorCode):

CódigoDescripción
rate_limitLímite de velocidad de API alcanzado; generalmente se reintenta automáticamente
authAutenticación fallida; verificar la clave API
tool_timeoutTiempo de espera de ejecución de herramienta agotado
max_iterationsSe alcanzó el conteo máximo de bucles de llamadas a herramientas
api_errorOtro error de API

getMessages — obtener historial de mensajes

const messages = await conv.getMessages();

Retorna un ChatMessage[] que contiene cada mensaje de la conversación.

Estructura de ChatMessage:

CampoTipoDescripción
idstringID del mensaje
role"user" | "assistant" | "system" | "tool"Rol del mensaje
contentstring | ContentBlock[]Contenido del mensaje
thinking{ content: string }Proceso de razonamiento (mensajes del asistente — nota que es un objeto, no una cadena simple)
errorstringMensaje de error si este turno tuvo un error
modelIdstringID del modelo usado para este mensaje
durationMsnumberDuración total de la respuesta en ms
parentIdstringID del mensaje padre (para ramificación)
toolCallsToolCall[]Registro de llamadas a herramientas (mensajes del asistente)
toolCallIdstringEl ID correspondiente de la llamada a herramienta (mensajes de herramienta)
usage{ inputTokens, outputTokens }Uso de tokens
createtimenumberMarca de tiempo de creación

clear — limpiar la conversación

await conv.clear();

Limpia todo el historial de mensajes en la conversación.

save — persistir la conversación

await conv.save();

Guarda los metadatos de la conversación en almacenamiento. Las conversaciones efímeras (ephemeral: true) no se guardan por defecto; llamar a este método las convierte en conversaciones persistidas.

Propiedades de instancia

PropiedadTipoDescripción
idstringID de conversación
titlestringTítulo de la conversación
modelIdstringEl ID del modelo en uso

Contenido multimodal

El contenido del mensaje puede ser una cadena de texto simple, o un array ContentBlock[] para soportar entrada multimodal:

// Enviar texto + una imagen
await conv.chat([
{ type: "text", text: "Por favor analiza lo que hay en esta imagen" },
{ type: "image", attachmentId: "img-id", mimeType: "image/png" }
]);

Tipos de ContentBlock

tipoCampos requeridosDescripción
texttext: stringContenido de texto
imageattachmentId: string, mimeType: stringImagen; requiere un modelo con capacidad de visión
fileattachmentId: string, mimeType: string, name: stringArchivo
audioattachmentId: string, mimeType: stringAudio

Conversaciones efímeras vs. persistidas

CaracterísticaConversación persistida (predeterminada)Conversación efímera
Almacenamiento de mensajesPersistido en OPFSSolo en memoria
Herramientas integradasTodas disponiblesNo incluidas; proporciona las tuyas vía tools
Lista de conversacionesVisibleNo visible
Caché de promptsSoportadoPuede deshabilitarse
Caso de usoConversaciones de propósito generalTareas ligeras, únicas y preguntas rápidas

Gestión del contexto

Auto-compactación

Cuando el uso del contexto de la conversación supera el 80% de la ventana de contexto del modelo, el sistema llama automáticamente al LLM para generar un resumen del historial, reemplazando mensajes más antiguos para liberar espacio.

Caché de prompts

Habilitado por defecto. Para modelos de Anthropic, el prompt del sistema y el historial de mensajes se cachean, reduciendo significativamente el uso de tokens y la latencia para turnos repetidos.

Puede deshabilitarse via cache: false:

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

Ejemplo completo

// ==UserScript==
// @name Asistente de traducción inteligente
// @match *://*/*
// @grant CAT.agent.conversation
// @grant CAT.agent.dom
// ==/UserScript==

// Crear una conversación con una herramienta personalizada
const conv = await CAT.agent.conversation.create({
system: "Eres un asistente de traducción. El usuario te dará contenido de una página web — por favor tradúcelo al español.",
tools: [{
name: "get_selection",
description: "Obtener el texto que el usuario ha seleccionado en la página",
parameters: { type: "object", properties: {} },
handler: async () => {
return { text: window.getSelection()?.toString() || "No hay texto seleccionado" };
}
}]
});

// Transmitir el resultado de la traducción
const stream = await conv.chatStream("Por favor obtén el texto seleccionado y tradúcelo al español");
let result = "";
for await (const chunk of stream) {
if (chunk.type === "content_delta") {
result += chunk.content;
// Actualizar la UI en tiempo real
updateTranslationUI(result);
}
}