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.