Kodflux
Kodflux
Crear cuenta gratisIniciar Sesión

TypeScript / Intermedio / 6 min

Bot Discord para resumir hilos con IA

Bot en TypeScript que escucha hilos de Discord y genera resúmenes automáticos con Claude API.

Automatiza el resumen de conversaciones largas en Discord. Es útil para comunidades técnicas, equipos de trabajo o servidores de clientes donde los hilos acumulan contexto que luego nadie quiere leer entero.

El bot escucha el comando /resumir, recupera los últimos mensajes del hilo y usa Claude API para generar un resumen estructurado.

Guía de Implementación Paso a Paso

  1. Crea una aplicación en Discord Developer Portal, activa el modo Bot y copia el TOKEN.
  2. Crea una API key en Anthropic Console.
  3. Inicializa el proyecto e instala dependencias.
BASH
mkdir discord-summary-bot && cd discord-summary-bot
npm init -y
npm install discord.js @anthropic-ai/sdk dotenv
npm install -D typescript ts-node @types/node
npx tsc --init
  1. Crea un archivo .env en la raíz.
ENV
DISCORD_TOKEN=tu_token_aqui
ANTHROPIC_API_KEY=tu_api_key_aqui
  1. Pega el código en src/index.ts.
  2. Ejecuta el bot con npx ts-node src/index.ts.
  3. Invita el bot a tu servidor con permisos de lectura, envío de mensajes e historial.
TYPESCRIPT
// src/index.ts
// Bot Discord que resume hilos usando Claude API
// Comando: /resumir [numero_de_mensajes]

import { Client, GatewayIntentBits, ThreadChannel, Message } from 'discord.js';
import Anthropic from '@anthropic-ai/sdk';
import * as dotenv from 'dotenv';

dotenv.config();

const client = new Client({
  intents: [
    GatewayIntentBits.Guilds,
    GatewayIntentBits.GuildMessages,
    GatewayIntentBits.MessageContent,
    GatewayIntentBits.GuildMessageTyping,
  ],
});

const anthropic = new Anthropic({
  apiKey: process.env.ANTHROPIC_API_KEY,
});

async function fetchThreadMessages(
  thread: ThreadChannel,
  limit: number = 50
): Promise<string> {
  const messages = await thread.messages.fetch({ limit });
  const sorted = [...messages.values()].reverse();

  return sorted
    .filter((msg: Message) => !msg.author.bot)
    .map((msg: Message) => `[${msg.author.username}]: ${msg.content}`)
    .join('\n');
}

async function generateSummary(conversation: string): Promise<string> {
  const response = await anthropic.messages.create({
    model: 'claude-sonnet-4-20250514',
    max_tokens: 1024,
    messages: [
      {
        role: 'user',
        content: `Analiza la siguiente conversación de Discord y genera un resumen claro y estructurado en español.

El resumen debe incluir:
1. **Tema principal**: ¿De qué trata la conversación?
2. **Puntos clave**: Los 3-5 puntos más importantes discutidos
3. **Decisiones tomadas**: Si se tomó alguna decisión o conclusión
4. **Próximos pasos**: Si se mencionaron acciones o tareas pendientes

Conversación:
${conversation}

Formato de salida: usa markdown con negritas y listas. Máximo 300 palabras.`,
      },
    ],
  });

  const content = response.content[0];
  return content.type === 'text' ? content.text : 'No se pudo generar el resumen.';
}

client.on('messageCreate', async (message: Message) => {
  if (message.author.bot) return;
  if (!message.content.startsWith('/resumir')) return;

  if (!message.channel.isThread()) {
    await message.reply('Este comando solo funciona dentro de hilos (threads).');
    return;
  }

  const thread = message.channel as ThreadChannel;
  const args = message.content.split(' ');
  const limit = parseInt(args[1]) || 50;

  await thread.sendTyping();

  try {
    const conversation = await fetchThreadMessages(thread, Math.min(limit, 100));

    if (!conversation.trim()) {
      await message.reply('No encontré mensajes para resumir en este hilo.');
      return;
    }

    const summary = await generateSummary(conversation);

    await message.reply({
      content: `## Resumen del hilo (últimos ${limit} mensajes)\n\n${summary}`,
    });
  } catch (error) {
    console.error('Error al generar resumen:', error);
    await message.reply('Ocurrió un error al generar el resumen. Intenta de nuevo.');
  }
});

client.once('ready', () => {
  console.log(`Bot conectado como ${client.user?.tag}`);
  console.log('Usa /resumir [n] dentro de un hilo para activarlo');
});

client.login(process.env.DISCORD_TOKEN);

Prompt para Codex

TEXT
Crea un bot de Discord en TypeScript que use la Claude API para resumir hilos de conversación.

Requisitos técnicos:
- Usa discord.js v14 con GatewayIntentBits: Guilds, GuildMessages, MessageContent
- Usa @anthropic-ai/sdk con el modelo claude-sonnet-4-20250514
- El comando se activa con /resumir [numero_opcional] dentro de un Thread/Hilo
- Recupera los últimos N mensajes (default: 50, max: 100) filtrando bots
- Envía cada mensaje con formato [username]: contenido
- El prompt a Claude debe pedir: tema principal, puntos clave, decisiones y próximos pasos
- Responde con markdown usando negritas y emojis
- Maneja errores con try/catch y mensajes descriptivos al usuario
- Usa dotenv para DISCORD_TOKEN y ANTHROPIC_API_KEY
- TypeScript estricto con tipos correctos de discord.js

Salida: el archivo completo src/index.ts listo para ejecutar con ts-node.

Buscar en Kodflux