Saltar al contenido

Nitori

← Volver a proyectos Imagen del proyecto Nitori
Python

El problema

Una comunidad de Discord suele terminar juntando varios bots, cada uno con funciones de pago bloqueadas, solo para moderar, conversar, traducir y consultar datos.

La idea

Un solo bot, sin funciones premium: lo agregas a tu servidor (o lo ejecutas tú), usas /setup y listo. La IA es una puerta de entrada en lenguaje natural, no un reemplazo de los comandos: todo sigue funcionando con slash y prefijo, y al pedirlo con palabras la IA ejecuta las mismas funciones, incluso varios pasos en un solo mensaje.

Qué hace

  • Moderación de mensajes, usuarios, canales y roles, también pidiéndola en lenguaje natural si tienes el permiso correspondiente.
  • Conversación con IA, generación, edición y análisis de imágenes, y mensajes de voz nativos de Discord cuando se piden.
  • Información de fútbol basada en API-Football: equipos, jugadores, partidos, posiciones, goleadores, lesiones, alineaciones, cuotas, predicciones y seguimiento en vivo.
  • Lectura de enlaces: resumir, explicar, comparar o verificar su contenido.
  • Traducción a cualquier idioma, ejecución de código, recordatorios, memes, estado de servidores de Minecraft, cumpleaños y aniversarios.
  • Memoria estructurada por servidor, con reglas de estilo que solo administradores de confianza pueden cambiar.

Cómo está hecho

Python 3.11 o superior con SQLite. Un modelo actúa como router: devuelve un plan tipado con las funciones a ejecutar, sus datos y su orden. El código valida autorización, identidad, alcance y dependencias con el estado real de Discord antes de ejecutar nada; si rechaza el plan, el router tiene una oportunidad de corregirlo. La respuesta final se escribe únicamente a partir de resultados confiables. El código de los usuarios se ejecuta en un runner propio, y las páginas con mucho JavaScript se leen con Playwright, de forma opcional.

Decisiones

  • Los permisos salen del estado real de Discord, nunca de lo que diga un mensaje.
  • Todo lo que cambia el servidor necesita el permiso real, se valida completo antes de ejecutarse y nunca se reintenta ni se revierte automáticamente.
  • Las respuestas de fútbol se validan contra API-Football en lugar de dejar que el modelo adivine.
  • No escucha todo el canal: responde solo si lo mencionan, si se responde a un mensaje suyo o si continúa una conversación reciente del mismo usuario.
  • La búsqueda web viene desactivada y solo se usa cuando la pregunta necesita información actual.

Dato curioso

Cada mensaje pasa primero por el router, una llamada al modelo con unos 15,000 tokens de instrucciones fijas. Al inicio esa llamada leía solo 128 tokens de caché. Reordené la petición para que lo fijo vaya primero y lo que cambia por mensaje al final, y agregué llaves de caché.

Con la caché caliente, la mayor parte de esa entrada se lee desde caché y la llamada cuesta cerca de un tercio. El ahorro no es inmediato: después de un rato sin uso o de un reinicio, los primeros mensajes pagan el precio completo. Las cifras son de registros reales con el precio actual del modelo.

tokens por llamada del router
~15,000
de la entrada leída desde caché
~91%
costo de una llamada del router
0.022 → 0.007 USD

Estado actual

Este rediseño de la IA vive en la rama dev, que todavía es trabajo en progreso y no está en la rama principal.

En el blog

¿Cómo contactarme?

Estoy disponible para nuevas oportunidades. ¡Hablemos!