Bot de Telegram y Discord
Ejecuta tu propio bot privado que crea imágenes y videos, anima imágenes y chatea con personajes que defines, pagado con tu saldo de SpicyAPI y con los límites de gasto comprobados antes de cada cobro.
El bot de SpicyAPI es un programa pequeño que ejecutas tú mismo. Se conecta a Telegram (y, si quieres, a Discord) y permite que las personas que autorices generen imágenes, creen videos, conviertan imágenes en videos y chateen con personajes que defines. Todo se paga con tu propio saldo de SpicyAPI, y cada solicitud se cotiza antes de cobrar nada.
El bot es gratuito y de código abierto (MIT) en github.com/spicyapi-ai/spicyapi-bot. Es privado por defecto: solo tú puedes usarlo hasta que autorices a otras personas o grupos.
La versión corta
- En la consola, crea una clave de API solo para el bot y ponle un límite de gasto diario.
- En Telegram, escribe a @BotFather, envía
/newboty copia el token. - Clona el repositorio, copia
.env.examplea.env, rellenaSPICY_API_KEY,TELEGRAM_BOT_TOKENyOWNER_ID, y ejecutadocker compose up -d --build. - Abre tu bot en Telegram, envía
/start, acepta las reglas y prueba/pic a cozy cabin in the snow.
Qué hace el bot
- Imágenes:
/pic a lighthouse at dusk - Videos:
/vid waves rolling onto a beach at sunset - Animar: toca Animate debajo de cualquier imagen que haya creado el bot, o responde a ella con
/animate <cómo debe moverse>. - Chat con personajes: escribe en un chat privado o usa
/talk. Las respuestas llegan en streaming dentro de un único mensaje. - Protección del gasto: cada solicitud se cotiza primero (las cotizaciones son gratuitas), las caras requieren un toque en Confirm, y se aplican límites diarios por persona y para todo el bot.
- Privado por defecto: nadie más puede usarlo hasta que lo autorices.
El catálogo de SpicyAPI incluye modelos sin censura que no añaden ningún filtro de contenido propio, y el bot funciona con cualquier modelo que elijas. La ley y la política de contenido de SpicyAPI siguen aplicándose a todo lo que generes. Consulta Política.
Comandos
| Comando | Qué hace |
|---|---|
/pic <prompt> | Genera una imagen |
/vid <prompt> | Genera un video a partir de texto |
/animate <motion> | Responde a una imagen para convertirla en video. Las imágenes que creó el bot siempre funcionan; tus propias fotos solo si el operador estableció ALLOW_PHOTO_UPLOADS=true |
| Botón Animate | Debajo de cada imagen generada: la anima reutilizando su prompt |
/talk <message> | Habla con el personaje actual (en un chat privado puedes simplemente escribir) |
/persona | Elige un personaje |
/newchat | Olvida la conversación y empieza de nuevo |
/models | Elige tus modelos de imagen, video, animación y chat |
/spend | Lo que has gastado hoy; el propietario también ve el total del bot y el saldo de la cuenta |
/report <text> | Envía un reporte al operador |
/help | Resumen de todo esto |
Los nombres no son /image, /video ni /chat a propósito, porque otros bots populares los usan, y así este bot puede convivir con ellos en un grupo. En un grupo de Telegram, responde a uno de los mensajes de chat del bot para seguir hablando con el personaje.
Antes de empezar
- Un equipo o servidor que se mantenga encendido, con Docker instalado. (O una cuenta de Railway, consulta más abajo.)
- Una cuenta de SpicyAPI con saldo. Consulta Configura tu cuenta y Facturación.
- Una cuenta de Telegram, para crear el bot con BotFather.
Despliega con Docker Compose
Crea una clave para el bot
En la consola, crea una clave de API nueva solo para este bot. Ponle un límite de gasto diario y, si quieres, una lista de modelos permitidos.
El bot también tiene sus propios límites, pero el límite de la clave lo aplica la propia SpicyAPI, así que se mantiene aunque el bot esté mal configurado o pierda sus datos. Las claves nuevas no tienen límite a menos que lo establezcas. Consulta Autenticación.
Crea el bot de Telegram
Abre @BotFather, envía /newbot, elige un nombre y un nombre de usuario, y copia el token que te da. Tiene este aspecto: 123456789:AA....
Configura
git clone https://github.com/spicyapi-ai/spicyapi-bot.git
cd spicyapi-bot
cp .env.example .envAbre .env y rellena las tres líneas obligatorias:
SPICY_API_KEY=sk-spicy-...
TELEGRAM_BOT_TOKEN=123456789:AA...
OWNER_ID=your-telegram-user-idTodas las demás líneas tienen un valor por defecto seguro. .env.example explica cada ajuste.
Averigua tu ID de usuario de Telegram (si no lo sabes)
Pon OWNER_ID=0 por ahora y termina el paso siguiente. Después envía cualquier mensaje a tu bot y te responderá con tu ID. Pon ese número en OWNER_ID y reinicia:
docker compose up -dInicia
docker compose up -d --build
docker compose logs -fEl registro muestra Telegram bot @yourbot is running cuando está listo.
Pruébalo
Abre tu bot en Telegram, envía /start, acepta las reglas una vez y envía /pic a cozy cabin in the snow. El modelo de imagen por defecto cuesta alrededor de $0.01 por imagen.
Para actualizar más adelante, ejecuta git pull && docker compose up -d --build.
Despliega en Railway
Railway puede ejecutar el bot sin que tengas un servidor propio. No hay una plantilla de un clic: despliegas desde tu propia copia del repositorio.
Haz un fork del repositorio
Haz un fork de github.com/spicyapi-ai/spicyapi-bot en tu cuenta de GitHub.
Crea el proyecto
En Railway elige New Project > Deploy from GitHub repo y selecciona tu fork. Railway encuentra el Dockerfile y lo compila.
Añade las variables
Abre la pestaña Variables del servicio y añade SPICY_API_KEY, TELEGRAM_BOT_TOKEN y OWNER_ID, además de cualquier otro ajuste de .env.example.
Adjunta un volumen
Haz clic derecho en el servicio, elige Attach volume y usa la ruta de montaje /data. Sin volumen, cada redespliegue olvida el gasto de hoy y los ajustes de todos.
Despliega
Despliega y revisa en los registros que aparezca Telegram bot @yourbot is running.
Mantén el servicio con una sola réplica: dos copias que consultan el mismo token de Telegram se pelean por las actualizaciones. El bot no necesita dominio público ni puerto abierto.
Añade Discord (opcional)
Crea la aplicación
En el Discord Developer Portal, crea una aplicación, abre Bot, restablece y copia el token, y desactiva Public Bot para que solo tú puedas añadirlo a servidores. No se necesitan intents privilegiados.
Invítalo a tu servidor
En OAuth2 > URL Generator, marca los scopes bot y applications.commands, y los permisos Send Messages, Attach Files, Embed Links y Read Message History. Abre el enlace generado y añade el bot a tu servidor.
Configura
En .env, establece:
DISCORD_TOKENcon el token del bot.DISCORD_GUILD_IDcon el ID de tu servidor, si quieres que los comandos aparezcan al instante en lugar de tras un breve despliegue global.OWNER_IDpara incluir tu ID de usuario de Discord, por ejemploOWNER_ID=tg:123,dc:456. Los prefijostg:ydc:fijan un ID a una sola plataforma.ALLOWED_CHAT_IDScon el ID del canal o servidor donde el bot debe responder.
Para encontrar los IDs, activa el Developer Mode (User Settings > Advanced), luego haz clic derecho en un usuario, canal o servidor y elige Copy ID. Reinicia el bot.
Marca el canal como con restricción de edad
Las imágenes y los videos solo funcionan en canales con restricción de edad: Edit Channel > Overview > Age-Restricted Channel. Los comandos /pic y /vid se registran con restricción de edad, así que Discord solo los muestra ahí.
El chat (/talk, o mencionar al bot) funciona en cualquier canal permitido, salvo que establezcas DISCORD_CHAT_REQUIRES_NSFW=true, que limita el chat también a los canales con restricción de edad.
Discord no permite apps con comandos con restricción de edad en su App Directory, así que mantén el bot privado. .env.example también incluye DISCORD_MEDIA_IN_DMS, que por defecto es false: entonces las imágenes y los videos solo funcionan en canales de servidor con restricción de edad, no en mensajes directos.
Quién puede usarlo
| Ajuste | Valor por defecto | Efecto |
|---|---|---|
OWNER_ID | obligatorio | Tú. Siempre permitido, sin el límite diario por persona, y el único que ve el saldo de la cuenta. Separa varios IDs con comas. |
ALLOWED_USER_IDS | vacío | Otras personas autorizadas en chats privados. Vacío significa solo tú. |
ALLOWED_CHAT_IDS | vacío | Grupos (Telegram) o canales y servidores (Discord) donde responde el bot. Vacío significa ningún grupo. |
REQUIRE_CONSENT | true | Cada persona confirma una vez que tiene 18 años o más y que cumplirá las reglas de contenido. |
A los desconocidos que encuentren el bot se les dice que es privado y se les da su ID de usuario para que te lo envíen. Los grupos se ignoran hasta que aparecen en ALLOWED_CHAT_IDS; una vez que un grupo está en la lista, todos sus miembros pueden usar el bot, dentro de los límites diarios. Los IDs de grupo de Telegram son negativos, por ejemplo -1001234567890.
No establezcas ALLOWED_USER_IDS=*
ALLOWED_USER_IDS=* hace público el bot y permite que cualquiera que lo encuentre gaste tu saldo. Úsalo solo si es lo que pretendes.
Tú operas este bot y eres responsable de a quién dejas usarlo. Se aplican los términos de SpicyAPI, incluidas las regiones en las que SpicyAPI no presta servicio.
Cómo funciona el gasto
- Primero el precio. SpicyAPI cotiza cada imagen o video antes de que ocurra nada. Las cotizaciones son gratuitas.
- Techo estricto. Si una solicitud pudiera costar más de
MAX_COST_PER_REQUEST_USD(por defecto $1), se rechaza. No se cobra nada. - Confirmación. Si pudiera costar más de
CONFIRM_ABOVE_USD(por defecto $0.10), el bot muestra el precio con los botones Confirm y Cancel. Solo quien lo pidió puede confirmar. - Límites diarios. Cada persona puede gastar
USER_DAILY_BUDGET_USD(por defecto $1) por día UTC y todo el botDAILY_BUDGET_USD(por defecto $5). Las generaciones aún en curso cuentan como gastadas hasta que terminan, de modo que varias solicitudes a la vez no pueden esquivar un límite. A los propietarios solo les afecta el límite de todo el bot. - Sin cobros dobles. Cada solicitud lleva una clave de idempotencia derivada del mensaje del chat o del toque en el botón, de modo que una actualización de Telegram duplicada o un doble toque devuelve la tarea que ya existe.
- Resultados. El progreso se muestra editando un mensaje cada pocos segundos. El resultado muestra el cobro real y el ID de la tarea, que puedes consultar en Logs en la consola.
Una generación aceptada no se puede cancelar. Las ejecuciones correctas se cobran; los fallos normales liberan la retención. Algunos rechazos de contenido solo se cobran cuando la página del modelo lo indica expresamente. Consulta Facturación.
Usa una clave con límite
El bot lleva su propio libro de cuentas en DATA_DIR/state.json. Si ese archivo se pierde, el bot olvida lo gastado hoy. El límite de la clave de API en la consola es el que nunca se puede perder, porque lo aplica SpicyAPI. Crea una clave separada para el bot, establece un límite de gasto diario y, opcionalmente, permite solo los modelos que quieras. Cuando se alcanza el límite, el bot te avisa de que la clave ha llegado a su límite de gasto.
Otros ajustes útiles:
| Ajuste | Valor por defecto | Qué hace |
|---|---|---|
MAX_CONCURRENT_TASKS_PER_USER | 2 | Imágenes y videos que una persona puede tener en curso al mismo tiempo |
VIDEO_SECONDS / VIDEO_RESOLUTION | 5 / 480p | Duración y tamaño del video, ajustados a lo que permite cada modelo. Más corto y más bajo es más barato |
ALLOWED_MODELS | vacío | Limita los menús de /models. IDs exactos o prefijos que terminan en *, por ejemplo alibaba/* |
Modelos y precios
Cada persona puede cambiar sus modelos con /models. El operador establece los valores por defecto:
| Variable | Valor por defecto | Costo en el momento de escribir esto |
|---|---|---|
DEFAULT_IMAGE_MODEL | Z-Image Turbo, texto a imagen | Alrededor de $0.01 por imagen |
DEFAULT_VIDEO_MODEL | MiniMax H3, texto a video | Alrededor de $0.037 por segundo a 768p |
DEFAULT_ANIMATE_MODEL | MiniMax H3, imagen a video | Alrededor de $0.037 por segundo a 768p |
DEFAULT_CHAT_MODEL | DeepSeek V4.1 Flash | Cualquier modelo de chat del catálogo |
Los ids exactos de los modelos están en .env.example; para cambiarlos, copia otro id del catálogo en vivo (GET /api/v1/models; en el ejemplo de personaje de abajo, MODEL_ID_FROM_CATALOG marca dónde va un id así). Los precios proceden del catálogo público y pueden cambiar; el bot siempre muestra la cotización en vivo. Explora los modelos en spicyapi.ai/models o consulta Modelos. Para roleplay, el ranking de roleplay te ayuda a elegir un modelo de chat.
Personajes
Los personajes viven en un archivo JSON (CHARACTERS_FILE, por defecto characters/default.json, que incluye dos personajes de ejemplo):
{
"characters": [
{
"id": "mira",
"name": "Mira",
"system": "You are Mira, ... Never speak or act for {{user}}.",
"greeting": "Welcome aboard, {{user}}!",
"model": "MODEL_ID_FROM_CATALOG"
}
]
}systemson las instrucciones del personaje.greeting(opcional) es su primera frase.model(opcional) fija un modelo de chat para este personaje.{{char}}y{{user}}se sustituyen por el nombre del personaje y el nombre de pila de la persona.- Las entradas también pueden ser JSON de Character Card V2, el formato que exportan la mayoría de los sitios de personajes y SillyTavern. Se usan la descripción, la personalidad, el escenario, el diálogo de ejemplo y el primer mensaje.
Con Docker, monta tu propio archivo y apunta el ajuste hacia él. En docker-compose.yml:
volumes:
- ./my-characters.json:/app/characters/custom.json:roY en .env:
CHARACTERS_FILE=characters/custom.jsonEl bot recuerda HISTORY_TURNS intercambios por conversación (por defecto 20) y limita las respuestas a CHAT_MAX_TOKENS tokens (por defecto 2048). Los modelos de razonamiento cuentan su razonamiento dentro de ese límite, así que un valor muy pequeño puede dejar sin espacio a la respuesta. Consulta Recetas de chat para saber más sobre cómo escribir personajes.
Las subidas de fotos están desactivadas por defecto
Por defecto, solo se pueden animar las imágenes que generó el bot. Convertir fotos de personas reales en videos es la principal vía por la que se abusa de bots como este, y una persona que aparece en una foto no ha aceptado aparecer en tu video.
Si estableces ALLOW_PHOTO_UPLOADS=true, cualquiera que autorices puede animar una foto que envíe. Actívalo solo para personas de confianza y solo para fotos de adultos que hayan dado su consentimiento. Cuando está activado, el bot descarga las imágenes subidas y las guarda en SpicyAPI. Los enlaces de archivos de Telegram nunca se transmiten, porque contienen el token de tu bot.
Privacidad: qué se guarda y dónde
| Qué | Dónde | Cuánto tiempo |
|---|---|---|
| Totales de gasto diario, el modelo y el personaje elegidos por cada persona, quién aceptó las reglas | state.json en DATA_DIR (un volumen en Docker) | Hasta que lo borres |
| Historial del chat | Solo en memoria | Se olvida al reiniciar, tras un día de inactividad o con /newchat |
| Registros del bot | Tu equipo | Solo IDs de tarea e importes, nunca prompts ni contenido multimedia |
| Prompts y resultados | SpicyAPI | El periodo de retención de tu cuenta; consulta Retención |
Establece RETENTION_SECONDS para pedir a SpicyAPI que elimine los resultados y los prompts antes que el valor por defecto de tu cuenta.
En los grupos, los resultados se ocultan tras un spoiler (SPOILER_MEDIA, por defecto groups; los otros valores son always y never). /report reenvía un mensaje al propietario. El contenido que incumpla las reglas de SpicyAPI también se puede reportar en spicyapi.ai/abuse.
Solución de problemas
| Mensaje o síntoma | Qué hacer |
|---|---|
"out of balance" (40201) | Recarga tu saldo de SpicyAPI. |
"reached the spend cap" (40202) | Se alcanzó el límite de la clave en la consola. Súbelo o espera. |
"not allowed to use that model" (40301) | Permite el modelo en la clave desde la consola, o elige otro con /models. |
"has not verified its email" (40310) | Abre el enlace de verificación que envió SpicyAPI. |
| "The model declined this request" | Ese modelo rechazó el prompt. Ajusta la solicitud o elige otro modelo. Comprueba las condiciones de cobro por rechazo en la página del modelo. |
Conflict: terminated by other getUpdates request | Dos copias del bot usan el mismo token. Detén una. |
| Faltan comandos de Discord | /pic y /vid solo aparecen en canales con restricción de edad. Los comandos globales pueden tardar un momento en aparecer; establece DISCORD_GUILD_ID para un registro instantáneo. |
| Errores de red detrás de un proxy | El fetch de Node ignora HTTPS_PROXY a menos que el bot se inicie con NODE_USE_ENV_PROXY=1. |
| El bot responde con un número cuando le escribes | Es tu ID de usuario. Ponlo en OWNER_ID y reinicia. |
Los códigos de error se explican en Errores.
Apps de roleplay
Conecta los modelos de texto de SpicyAPI con RisuAI, Agnai, Chub, KoboldAI Lite y Janitor AI. Los campos exactos de cada app, qué modelos van bien para roleplay, cómo tratar los modelos de razonamiento y cómo limitar el gasto.
n8n
Usa los modelos de imagen, video, audio y chat de SpicyAPI en flujos de trabajo de n8n. Instala el nodo de la comunidad, importa las plantillas de HTTP Request o apunta la credencial de OpenAI de n8n a SpicyAPI para los nodos AI Agent.

