spicyapiDocumentación
Apps y plugins
Contenido principal

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

  1. En la consola, crea una clave de API solo para el bot y ponle un límite de gasto diario.
  2. En Telegram, escribe a @BotFather, envía /newbot y copia el token.
  3. Clona el repositorio, copia .env.example a .env, rellena SPICY_API_KEY, TELEGRAM_BOT_TOKEN y OWNER_ID, y ejecuta docker compose up -d --build.
  4. 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

ComandoQué 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 AnimateDebajo de cada imagen generada: la anima reutilizando su prompt
/talk <message>Habla con el personaje actual (en un chat privado puedes simplemente escribir)
/personaElige un personaje
/newchatOlvida la conversación y empieza de nuevo
/modelsElige tus modelos de imagen, video, animación y chat
/spendLo 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
/helpResumen 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 .env

Abre .env y rellena las tres líneas obligatorias:

SPICY_API_KEY=sk-spicy-...
TELEGRAM_BOT_TOKEN=123456789:AA...
OWNER_ID=your-telegram-user-id

Todas 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 -d

Inicia

docker compose up -d --build
docker compose logs -f

El 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.

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_TOKEN con el token del bot.
  • DISCORD_GUILD_ID con el ID de tu servidor, si quieres que los comandos aparezcan al instante en lugar de tras un breve despliegue global.
  • OWNER_ID para incluir tu ID de usuario de Discord, por ejemplo OWNER_ID=tg:123,dc:456. Los prefijos tg: y dc: fijan un ID a una sola plataforma.
  • ALLOWED_CHAT_IDS con 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

AjusteValor por defectoEfecto
OWNER_IDobligatorioTú. 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_IDSvacíoOtras personas autorizadas en chats privados. Vacío significa solo tú.
ALLOWED_CHAT_IDSvacíoGrupos (Telegram) o canales y servidores (Discord) donde responde el bot. Vacío significa ningún grupo.
REQUIRE_CONSENTtrueCada 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

  1. Primero el precio. SpicyAPI cotiza cada imagen o video antes de que ocurra nada. Las cotizaciones son gratuitas.
  2. Techo estricto. Si una solicitud pudiera costar más de MAX_COST_PER_REQUEST_USD (por defecto $1), se rechaza. No se cobra nada.
  3. 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.
  4. Límites diarios. Cada persona puede gastar USER_DAILY_BUDGET_USD (por defecto $1) por día UTC y todo el bot DAILY_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.
  5. 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.
  6. 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:

AjusteValor por defectoQué hace
MAX_CONCURRENT_TASKS_PER_USER2Imágenes y videos que una persona puede tener en curso al mismo tiempo
VIDEO_SECONDS / VIDEO_RESOLUTION5 / 480pDuració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_MODELSvacíoLimita 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:

VariableValor por defectoCosto en el momento de escribir esto
DEFAULT_IMAGE_MODELZ-Image Turbo, texto a imagenAlrededor de $0.01 por imagen
DEFAULT_VIDEO_MODELMiniMax H3, texto a videoAlrededor de $0.037 por segundo a 768p
DEFAULT_ANIMATE_MODELMiniMax H3, imagen a videoAlrededor de $0.037 por segundo a 768p
DEFAULT_CHAT_MODELDeepSeek V4.1 FlashCualquier 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"
    }
  ]
}
  • system son 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:ro

Y en .env:

CHARACTERS_FILE=characters/custom.json

El 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óndeCuánto tiempo
Totales de gasto diario, el modelo y el personaje elegidos por cada persona, quién aceptó las reglasstate.json en DATA_DIR (un volumen en Docker)Hasta que lo borres
Historial del chatSolo en memoriaSe olvida al reiniciar, tras un día de inactividad o con /newchat
Registros del botTu equipoSolo IDs de tarea e importes, nunca prompts ni contenido multimedia
Prompts y resultadosSpicyAPIEl 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íntomaQué 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 requestDos 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 proxyEl 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 escribesEs tu ID de usuario. Ponlo en OWNER_ID y reinicia.

Los códigos de error se explican en Errores.

En esta página