Saltar al contenido
Todos los proyectos

Proyecto

Necobot

Bot de Discord en TypeScript con economía de puntos, minijuegos y respuestas con personaje propio generadas por un modelo de lenguaje alojado en local.

  • SQLite
  • Ollama
  • Docker
  • Drizzle
  • Sapphire
  • TypeScript
  • Discord API
  • GitHub Actions

Contexto

Un bot para un servidor de Discord con amigos: sistema de puntos, minijuegos y un personaje que responde a las menciones. La parte interesante era conseguir que las respuestas tuvieran personalidad sin pagar por una API externa.

Arquitectura

TypeScript sobre el framework Sapphire, que organiza comandos, listeners y precondiciones. Persistencia en SQLite con Drizzle y migraciones versionadas. Las respuestas del personaje las genera un modelo local a través de Ollama, con tareas programadas para los eventos periódicos.

Integración continua con GitHub Actions y despliegue en un contenedor Docker en mi propio servidor.

Decisiones

SQLite en vez de PostgreSQL: un bot con un puñado de usuarios no justifica un servidor de base de datos, y un archivo único simplifica las copias de seguridad. El modelo local añade latencia frente a una API en la nube, pero elimina el coste por mensaje y mantiene las conversaciones en casa.

Qué haría distinto

Investigaría los modelos antes de construir alrededor de uno. Cambié de modelo seis veces en dos meses: de Qwen 2.5 a Qwen 3, a Salamandra 2B y 7B, de vuelta a 2B porque el 7B se comía el servidor, y otra vez a Qwen tras probar en serio las opciones. Cada cambio movía el tono, la longitud y el coste de las respuestas. Medir primero calidad y consumo en mi hardware habría fijado la elección en una tarde.