Pular para o conteúdo principal

API de Conversa

@grant CAT.agent.conversation

A API de Conversa é o núcleo do sistema Agent, permitindo que um script crie conversas com IA, envie mensagens e receba respostas.

Criar uma conversa

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

ConversationCreateOptions

ParâmetroTipoPadrãoDescrição
idstringauto-geradoID da conversa, usado para retomar uma conversa existente
systemstringPrompt do sistema personalizado, adicionado após o prompt integrado
modelstringmodelo padrãoID do modelo (obtido após configurá-lo na página de gerenciamento)
maxIterationsnumber20Contagem máxima de ciclos de chamadas de ferramentas dentro de um turno de conversa
skills"auto" | string[]"auto" carrega todas as Skills automaticamente, ou um array de nomes de Skills específicas
toolsToolDefinition[]Lista de ferramentas personalizadas (veja abaixo)
commandsRecord<string, CommandHandler>Comandos de conversa personalizados
ephemeralbooleanfalseUma conversa efêmera que não é persistida no armazenamento
cachebooleantrueHabilitar cache de prompts (reduz o uso de tokens)

Ferramentas personalizadas

Um script pode registrar suas próprias ferramentas para que a IA chame:

const conv = await CAT.agent.conversation.create({
tools: [{
name: "get_weather",
description: "Obter informações do clima para a cidade especificada",
parameters: {
type: "object",
properties: {
city: {
type: "string",
description: "Nome da cidade"
},
unit: {
type: "string",
enum: ["celsius", "fahrenheit"],
description: "Unidade de temperatura"
}
},
required: ["city"]
},
handler: async (args) => {
// args = { city: "São Paulo", unit: "celsius" }
const data = await fetchWeather(args.city, args.unit);
return { temperature: data.temp, condition: data.condition };
}
}]
});

Os parameters de uma ferramenta seguem a especificação JSON Schema. A IA usa description para entender quando e como chamar a ferramenta.

Comandos personalizados

Comandos personalizados que começam com / podem ser registrados:

const conv = await CAT.agent.conversation.create({
commands: {
"/export": async (args) => {
// Acionado quando o usuário digita "/export pdf"
await exportToPdf(args);
return "Exportação concluída";
}
}
});

Comandos integrados: /new (limpar histórico da conversa) — pode ser sobreposto por um manipulador personalizado.

Obter uma conversa existente

const conv = await CAT.agent.conversation.get(conversationId);
// Retorna null se a conversa não existir

Métodos de ConversationInstance

chat — chat síncrono

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

Envia uma mensagem e aguarda a resposta completa. A IA pode chamar ferramentas enquanto responde; chat aguarda que toda a execução de ferramentas termine antes de retornar o resultado final.

Parâmetros:

ParâmetroTipoDescrição
contentstring | ContentBlock[]Conteúdo da mensagem, texto ou blocos de conteúdo multimodais
options.toolsToolDefinition[]Ferramentas extras a adicionar apenas para esta chamada (combinadas com as ferramentas passadas na criação)

Retorna ChatReply:

CampoTipoDescrição
contentstring | ContentBlock[]O conteúdo da resposta da IA
thinkingstringO processo de raciocínio do modelo (apenas alguns modelos suportam isso)
toolCallsToolCall[]Registro das chamadas de ferramentas feitas durante esta resposta
usage{ inputTokens, outputTokens }Uso de tokens
commandbooleanSe esta resposta foi acionada por um comando

chatStream — chat em streaming

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

Recebe a resposta da IA em tempo real — útil quando você precisa mostrar saída incrementalmente.

Tipos de eventos StreamChunk:

tipoCamposDescrição
content_deltacontent: stringConteúdo de texto incremental
thinking_deltathinking: stringConteúdo de raciocínio incremental
tool_calltoolCall: ToolCallInfo de chamada de ferramenta (disparado em mudanças de estado)
content_blockblock: ContentBlockUm bloco de conteúdo (imagem, arquivo, etc.)
doneusage: { inputTokens, outputTokens }Turno da conversa completo
errorerror: string, errorCode?: stringErro

Códigos de erro (errorCode):

CódigoDescrição
rate_limitLimite de taxa da API atingido; geralmente retentado automaticamente
authAutenticação falhou; verificar a chave API
tool_timeoutTimeout da execução da ferramenta
max_iterationsAtingida a contagem máxima de ciclos de chamadas de ferramentas
api_errorOutro erro de API

getMessages — obter histórico de mensagens

const messages = await conv.getMessages();

Retorna um ChatMessage[] contendo cada mensagem na conversa.

Estrutura de ChatMessage:

CampoTipoDescrição
idstringID da mensagem
role"user" | "assistant" | "system" | "tool"Papel da mensagem
contentstring | ContentBlock[]Conteúdo da mensagem
thinking{ content: string }Processo de raciocínio (mensagens do assistente — note que é um objeto, não uma string simples)
errorstringMensagem de erro se este turno teve um erro
modelIdstringID do modelo usado para esta mensagem
durationMsnumberDuração total da resposta em ms
parentIdstringID da mensagem pai (para ramificação)
toolCallsToolCall[]Registro das chamadas de ferramentas (mensagens do assistente)
toolCallIdstringO ID correspondente da chamada de ferramenta (mensagens da ferramenta)
usage{ inputTokens, outputTokens }Uso de tokens
createtimenumberCarimbo de data/hora de criação

clear — limpar a conversa

await conv.clear();

Limpa todo o histórico de mensagens na conversa.

save — persistir a conversa

await conv.save();

Salva os metadados da conversa no armazenamento. Conversas efêmeras (ephemeral: true) não são salvas por padrão; chamar este método a converte em uma conversa persistida.

Propriedades da instância

PropriedadeTipoDescrição
idstringID da conversa
titlestringTítulo da conversa
modelIdstringO ID do modelo em uso

Conteúdo multimodal

O conteúdo da mensagem pode ser uma string de texto simples, ou um array ContentBlock[] para suportar entrada multimodal:

// Enviar texto + uma imagem
await conv.chat([
{ type: "text", text: "Por favor analise o que há nesta imagem" },
{ type: "image", attachmentId: "img-id", mimeType: "image/png" }
]);

Tipos de ContentBlock

tipoCampos obrigatóriosDescrição
texttext: stringConteúdo de texto
imageattachmentId: string, mimeType: stringImagem; requer um modelo com capacidade de visão
fileattachmentId: string, mimeType: string, name: stringArquivo
audioattachmentId: string, mimeType: stringÁudio

Conversas efêmeras vs. persistidas

CaracterísticaConversa persistida (padrão)Conversa efêmera
Armazenamento de mensagensPersistido no OPFSApenas em memória
Ferramentas integradasTodas disponíveisNão incluídas; forneça as suas via tools
Lista de conversasVisívelNão visível
Cache de promptsSuportadoPode ser desabilitado
Caso de usoConversas de propósito geralTarefas leves, únicas e perguntas rápidas

Gerenciamento de contexto

Auto-compactação

Quando o uso do contexto da conversa excede 80% da janela de contexto do modelo, o sistema chama automaticamente o LLM para gerar um resumo do histórico, substituindo mensagens mais antigas para liberar espaço.

Cache de prompts

Habilitado por padrão. Para modelos Anthropic, o prompt do sistema e o histórico de mensagens são cacheados, reduzindo significativamente o uso de tokens e a latência para turnos repetidos.

Pode ser desabilitado via cache: false:

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

Exemplo completo

// ==UserScript==
// @name Assistente de tradução inteligente
// @match *://*/*
// @grant CAT.agent.conversation
// @grant CAT.agent.dom
// ==/UserScript==

// Criar uma conversa com uma ferramenta personalizada
const conv = await CAT.agent.conversation.create({
system: "Você é um assistente de tradução. O usuário fornecerá conteúdo de uma página web — por favor traduza para o português.",
tools: [{
name: "get_selection",
description: "Obter o texto que o usuário selecionou na página",
parameters: { type: "object", properties: {} },
handler: async () => {
return { text: window.getSelection()?.toString() || "Nenhum texto selecionado" };
}
}]
});

// Transmitir o resultado da tradução
const stream = await conv.chatStream("Por favor obtenha o texto selecionado e traduza para o português");
let result = "";
for await (const chunk of stream) {
if (chunk.type === "content_delta") {
result += chunk.content;
// Atualizar a interface em tempo real
updateTranslationUI(result);
}
}