HuwiDevelopers

IA y MCP

Conecta un modelo de IA a tu bot. Respuestas que se van escribiendo y el servidor MCP de Huwi con la misma clave del bot.

Huwi no pone el modelo: tu bot trae el suyo (el que tú elijas, con tu propia cuenta y tu propia clave del proveedor). Huwi pone el chat, los componentes y la API.

Un asistente con un modelo

El patrón es el de siempre: pides novedades, le das el texto al modelo y mandas lo que contesta. Para que se sienta en vivo, manda un mensaje corto y edítalo mientras llegan las palabras:

import { mutate } from "./huwi.ts";

// Texto que se va escribiendo (por ejemplo, la respuesta de un modelo): se manda un mensaje y se edita.
async function* model(): AsyncGenerator<string> {
  for (const word of "Claro, te cuento cómo va tu pedido: sale hoy y llega en la tarde.".split(" ")) {
    await new Promise((resolve) => setTimeout(resolve, 150));
    yield `${word} `;
  }
}

const chatId = process.env.CHAT_ID!;
const message = await mutate("message.send", { chatId, clientId: crypto.randomUUID(), text: "…" });

let text = "";
let last = 0;
for await (const piece of model()) {
  text += piece;
  // Edita como mucho cada ~700 ms: cada edición es un pedido más y llega a la persona en vivo.
  if (Date.now() - last > 700) {
    await mutate("message.edit", { messageId: message.id, text });
    last = Date.now();
  }
}
await mutate("message.edit", { messageId: message.id, text: text.trim() }); // la versión final

Reemplaza model() por la respuesta en streaming de tu proveedor. Algunas ideas que funcionan bien:

  • Un mensaje de bienvenida con /start y botones con las tres cosas que sabe hacer.
  • Un comando /olvidar que borre la memoria de esa conversación en tu servidor.
  • Mensajes de menos de 2000 caracteres: es el máximo de un mensaje. Parte las respuestas largas.
  • Una frase en el perfil del bot que diga que es un asistente de IA. Quien le escribe lo lee quien maneja el bot, y la gente tiene que saber que habla con un programa (por eso lleva el robotcito).

Respeta los turnos

Si el modelo manda varios mensajes seguidos, recuerda: 5 respuestas por turno y 5 mensajes cada 5 segundos por chat. Mejor un mensaje que se edita que cinco mensajes.

Servidor MCP

Huwi tiene un servidor MCP en POST https://huwi.app/api/mcp. Un agente conectado con la clave del bot puede ver qué procedimientos tiene permitidos, llamarlos y pedir novedades. Es JSON-RPC 2.0 sobre HTTP.

La clave va en x-api-key o como Authorization: Bearer hwk_.... Sin clave, el servidor responde unauthorized.

HerramientaQué hace
list_proceduresUna línea por procedimiento que la clave puede usar, con una frase de lo que hace.
callLlama un procedimiento: { "path": "message.send", "input": { ... } }. Lo cerrado para bots responde forbidden.
wait_for_updatesLas novedades pendientes (offset opcional). No espera: responde al instante.
# Listar las herramientas
curl -s https://huwi.app/api/mcp \
  -H "x-api-key: $HUWI_KEY" -H "content-type: application/json" \
  -d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}'

# Llamar a un procedimiento
curl -s https://huwi.app/api/mcp \
  -H "x-api-key: $HUWI_KEY" -H "content-type: application/json" \
  -d '{"jsonrpc":"2.0","id":2,"method":"tools/call","params":{"name":"call","arguments":{"path":"bot.me"}}}'

La respuesta trae el resultado como texto JSON en result.content[0].text.

Para que un agente conozca la API

Un agente con la clave puede pedir la lista viva de procedimientos y su forma exacta (JSON Schema):

# Todos los procedimientos que esta clave puede usar
curl -s "https://huwi.app/api/trpc/api.index" -H "x-api-key: $HUWI_KEY"

# La entrada y la salida de los que empiezan igual
curl -s -G "https://huwi.app/api/trpc/api.index" -H "x-api-key: $HUWI_KEY" \
  --data-urlencode 'input={"json":{"prefix":"message.send"}}'

api.index solo responde con una clave (con una sesión común da FORBIDDEN con apiKeyOnly) y deja afuera lo cerrado para bots.

Y el resumen del sitio, para el modelo, está en llms.txt.

En esta página