Bot Telegram et Discord
Faites tourner votre propre bot privé qui crée des images et des vidéos, anime des images et discute avec des personnages que vous définissez, payé sur votre solde SpicyAPI, avec des limites de dépense vérifiées avant chaque débit.
Le bot SpicyAPI est un petit programme que vous exécutez vous-même. Il se connecte à Telegram (et, si vous le souhaitez, à Discord) et permet aux personnes que vous autorisez de générer des images, de créer des vidéos, de transformer des images en vidéos et de discuter avec des personnages que vous définissez. Tout est payé sur votre propre solde SpicyAPI, et chaque requête est chiffrée avant tout débit.
Le bot est gratuit et open source (MIT) sur github.com/spicyapi-ai/spicyapi-bot. Il est privé par défaut : vous seul pouvez l’utiliser tant que vous n’autorisez pas d’autres personnes ou groupes.
Le résumé
- Dans la console, créez une clé API réservée au bot et donnez-lui un plafond de dépense quotidien.
- Dans Telegram, écrivez à @BotFather, envoyez
/newbotet copiez le jeton. - Clonez le dépôt, copiez
.env.examplevers.env, renseignezSPICY_API_KEY,TELEGRAM_BOT_TOKENetOWNER_ID, puis lancezdocker compose up -d --build. - Ouvrez votre bot dans Telegram, envoyez
/start, acceptez les règles et essayez/pic a cozy cabin in the snow.
Ce que fait le bot
- Images :
/pic a lighthouse at dusk - Vidéos :
/vid waves rolling onto a beach at sunset - Animate : appuyez sur Animate sous n’importe quelle image créée par le bot, ou répondez-y avec
/animate <how it should move>. - Chat avec un personnage : écrivez dans une conversation privée, ou utilisez
/talk. Les réponses arrivent au fil de l’eau dans un seul message. - Protection des dépenses : chaque requête est chiffrée d’abord (les devis sont gratuits), les plus coûteuses demandent un appui sur Confirm, et des limites quotidiennes par personne et pour l’ensemble du bot sont appliquées.
- Privé par défaut : personne d’autre ne peut l’utiliser tant que vous ne l’avez pas autorisé.
Le catalogue de SpicyAPI comprend des modèles sans censure qui n’ajoutent aucun filtre de contenu de leur part, et le bot fonctionne avec le modèle que vous choisissez. La loi et la politique de contenu de SpicyAPI s’appliquent toujours à tout ce que vous générez. Voir Politique.
Commandes
| Commande | Ce qu’elle fait |
|---|---|
/pic <prompt> | Génère une image |
/vid <prompt> | Génère une vidéo à partir d’un texte |
/animate <motion> | Répondez à une image pour la transformer en vidéo. Les images créées par le bot fonctionnent toujours ; vos propres photos seulement si l’opérateur a défini ALLOW_PHOTO_UPLOADS=true |
| Bouton Animate | Sous chaque image générée : l’anime en réutilisant son prompt |
/talk <message> | Parle au personnage actuel (dans une conversation privée, vous pouvez simplement écrire) |
/persona | Choisit un personnage |
/newchat | Oublie la conversation et repart de zéro |
/models | Choisit vos modèles d’image, de vidéo, d’animation et de chat |
/spend | Ce que vous avez dépensé aujourd’hui ; le propriétaire voit aussi l’ensemble du bot et le solde du compte |
/report <text> | Envoie un signalement à l’opérateur |
/help | Résumé de tout ceci |
Les noms ne sont volontairement pas /image, /video ou /chat, que d’autres bots populaires utilisent : ce bot peut ainsi partager un groupe avec eux. Dans un groupe Telegram, répondez à l’un des messages de chat du bot pour continuer à parler au personnage.
Avant de commencer
- Un ordinateur ou un serveur qui reste allumé, avec Docker installé. (Ou un compte Railway, voir plus bas.)
- Un compte SpicyAPI avec un solde. Voir Préparer votre compte et Facturation.
- Un compte Telegram, pour créer le bot avec BotFather.
Déployer avec Docker Compose
Créer une clé pour le bot
Dans la console, créez une nouvelle clé API réservée à ce bot. Donnez à cette clé un plafond de dépense quotidien et, si vous le souhaitez, une liste de modèles autorisés.
Le bot a aussi ses propres limites, mais le plafond de la clé est appliqué par SpicyAPI lui-même : il tient donc même si le bot est mal configuré ou si ses données sont perdues. Les nouvelles clés n’ont aucun plafond tant que vous n’en définissez pas. Voir Authentification.
Créer le bot Telegram
Ouvrez @BotFather, envoyez /newbot, choisissez un nom et un nom d’utilisateur, et copiez le jeton qu’il vous donne. Il ressemble à 123456789:AA....
Configurer
git clone https://github.com/spicyapi-ai/spicyapi-bot.git
cd spicyapi-bot
cp .env.example .envOuvrez .env et renseignez les trois lignes obligatoires :
SPICY_API_KEY=sk-spicy-...
TELEGRAM_BOT_TOKEN=123456789:AA...
OWNER_ID=your-telegram-user-idToutes les autres lignes ont une valeur par défaut sûre. .env.example explique chaque réglage.
Trouver votre identifiant utilisateur Telegram (si vous ne le connaissez pas)
Mettez OWNER_ID=0 pour l’instant et terminez l’étape suivante. Envoyez ensuite un message quelconque à votre bot : il répond avec votre identifiant. Placez ce nombre dans OWNER_ID et redémarrez :
docker compose up -dDémarrer
docker compose up -d --build
docker compose logs -fLe journal affiche Telegram bot @yourbot is running lorsque le bot est prêt.
L’essayer
Ouvrez votre bot dans Telegram, envoyez /start, acceptez les règles une fois, puis envoyez /pic a cozy cabin in the snow. Le modèle d’image par défaut coûte environ 0,01 $ par image.
Pour mettre à jour plus tard, lancez git pull && docker compose up -d --build.
Déployer sur Railway
Railway peut exécuter le bot sans serveur à vous. Il n’existe pas de modèle en un clic : vous déployez depuis votre propre copie du dépôt.
Forker le dépôt
Forkez github.com/spicyapi-ai/spicyapi-bot vers votre compte GitHub.
Créer le projet
Dans Railway, choisissez New Project > Deploy from GitHub repo et sélectionnez votre fork. Railway trouve le Dockerfile et le construit.
Ajouter les variables
Ouvrez l’onglet Variables du service et ajoutez SPICY_API_KEY, TELEGRAM_BOT_TOKEN et OWNER_ID, ainsi que tout autre réglage de .env.example.
Attacher un volume
Faites un clic droit sur le service, choisissez Attach volume et utilisez le chemin de montage /data. Sans volume, chaque redéploiement oublie les dépenses du jour et les réglages de chacun.
Déployer
Déployez et vérifiez dans les journaux la présence de Telegram bot @yourbot is running.
Gardez le service à un seul réplica : deux copies qui interrogent le même jeton Telegram se disputent les mises à jour. Le bot n’a besoin d’aucun domaine public ni d’aucun port ouvert.
Ajouter Discord (facultatif)
Créer l’application
Dans le Discord Developer Portal, créez une application, ouvrez Bot, réinitialisez et copiez le jeton, et désactivez Public Bot pour que vous seul puissiez l’ajouter à des serveurs. Aucun intent privilégié n’est nécessaire.
L’inviter sur votre serveur
Sous OAuth2 > URL Generator, cochez les scopes bot et applications.commands, ainsi que les permissions Send Messages, Attach Files, Embed Links et Read Message History. Ouvrez le lien généré et ajoutez le bot à votre serveur.
Configurer
Dans .env, définissez :
DISCORD_TOKENavec le jeton du bot.DISCORD_GUILD_IDavec l’identifiant de votre serveur, si vous voulez que les commandes apparaissent instantanément plutôt qu’après un court déploiement global.OWNER_IDpour y inclure votre identifiant utilisateur Discord, par exempleOWNER_ID=tg:123,dc:456. Les préfixestg:etdc:rattachent un identifiant à une seule plateforme.ALLOWED_CHAT_IDSavec l’identifiant du salon ou du serveur où le bot doit répondre.
Pour trouver les identifiants, activez le mode développeur (User Settings > Advanced), puis faites un clic droit sur un utilisateur, un salon ou un serveur et choisissez Copy ID. Redémarrez le bot.
Marquer le salon comme réservé aux adultes
Les images et les vidéos ne fonctionnent que dans des salons réservés aux adultes (age-restricted) : Edit Channel > Overview > Age-Restricted Channel. Les commandes /pic et /vid sont enregistrées comme réservées aux adultes, si bien que Discord ne les affiche que là.
Le chat (/talk, ou une mention du bot) fonctionne dans tout salon autorisé, sauf si vous définissez DISCORD_CHAT_REQUIRES_NSFW=true, qui limite aussi le chat aux salons réservés aux adultes.
Discord n’autorise pas dans son App Directory les applications dotées de commandes réservées aux adultes : gardez donc le bot privé. .env.example contient aussi DISCORD_MEDIA_IN_DMS, qui vaut false par défaut : les images et les vidéos ne fonctionnent alors que dans les salons de serveur réservés aux adultes, pas dans les messages privés.
Qui peut l’utiliser
| Réglage | Par défaut | Effet |
|---|---|---|
OWNER_ID | obligatoire | Vous. Toujours autorisé, non soumis à la limite quotidienne par personne, et le seul à voir le solde du compte. Séparez plusieurs identifiants par des virgules. |
ALLOWED_USER_IDS | vide | Autres personnes autorisées dans les conversations privées. Vide signifie vous seul. |
ALLOWED_CHAT_IDS | vide | Groupes (Telegram) ou salons et serveurs (Discord) où le bot répond. Vide signifie aucun groupe. |
REQUIRE_CONSENT | true | Chacun confirme une fois qu’il a 18 ans ou plus et qu’il respectera les règles de contenu. |
Les inconnus qui trouvent le bot apprennent qu’il est privé et reçoivent leur identifiant utilisateur à vous transmettre. Les groupes sont ignorés tant qu’ils ne figurent pas dans ALLOWED_CHAT_IDS ; dès qu’un groupe y figure, tous ses membres peuvent utiliser le bot, dans la limite des plafonds quotidiens. Les identifiants de groupe Telegram sont négatifs, par exemple -1001234567890.
Ne définissez pas ALLOWED_USER_IDS=*
ALLOWED_USER_IDS=* rend le bot public et permet à quiconque le trouve de dépenser votre solde. Ne l’utilisez que si c’est votre intention.
Vous exploitez ce bot et vous êtes responsable des personnes que vous laissez l’utiliser. Les conditions de SpicyAPI s’appliquent, y compris les régions que SpicyAPI ne dessert pas.
Comment fonctionnent les dépenses
- Le prix d’abord. Chaque image ou vidéo est chiffrée par SpicyAPI avant que quoi que ce soit ne se passe. Les devis sont gratuits.
- Plafond strict. Si une requête pouvait coûter plus que
MAX_COST_PER_REQUEST_USD(1 $ par défaut), elle est refusée. Rien n’est débité. - Confirmation. Si elle pouvait coûter plus que
CONFIRM_ABOVE_USD(0,10 $ par défaut), le bot affiche le prix avec les boutons Confirm et Cancel. Seule la personne qui a fait la demande peut confirmer. - Limites quotidiennes. Chaque personne peut dépenser
USER_DAILY_BUDGET_USD(1 $ par défaut) par jour UTC et l’ensemble du botDAILY_BUDGET_USD(5 $ par défaut). Les générations en cours comptent comme dépensées jusqu’à leur fin : plusieurs requêtes simultanées ne peuvent donc pas contourner une limite. Les propriétaires ne sont soumis qu’à la limite de l’ensemble du bot. - Pas de double débit. Chaque requête porte une clé d’idempotence dérivée du message de chat ou de l’appui sur le bouton : une mise à jour Telegram dupliquée ou un double appui renvoie la tâche qui existe déjà.
- Résultats. La progression est affichée en modifiant un message toutes les quelques secondes. Le résultat indique le débit réel et l’identifiant de la tâche, que vous pouvez retrouver sous Logs dans la console.
Une génération acceptée ne peut pas être annulée. Les exécutions réussies sont facturées ; les échecs ordinaires libèrent la réservation. Certains refus de contenu ne sont facturés que si la page du modèle l’indique explicitement. Voir Facturation.
Utiliser une clé plafonnée
Le bot tient son propre registre dans DATA_DIR/state.json. Si ce fichier est perdu, le bot oublie ce qui a été dépensé aujourd’hui. Le plafond de la clé API dans la console est la limite qui ne peut jamais être perdue, car SpicyAPI l’applique. Créez une clé distincte pour le bot, définissez un plafond de dépense quotidien et, si vous le souhaitez, n’autorisez que les modèles voulus. Lorsque le plafond est atteint, le bot vous indique que la clé a atteint son plafond de dépense.
Autres réglages utiles :
| Réglage | Par défaut | Ce qu’il fait |
|---|---|---|
MAX_CONCURRENT_TASKS_PER_USER | 2 | Images et vidéos qu’une personne peut avoir en cours en même temps |
VIDEO_SECONDS / VIDEO_RESOLUTION | 5 / 480p | Durée et taille de la vidéo, ajustées à ce que chaque modèle autorise. Plus court et plus bas coûte moins cher |
ALLOWED_MODELS | vide | Limite les menus de /models. Identifiants exacts ou préfixes se terminant par *, par exemple alibaba/* |
Modèles et prix
Chaque personne peut changer ses modèles avec /models. L’opérateur définit les valeurs par défaut :
| Variable | Par défaut | Coût au moment de la rédaction |
|---|---|---|
DEFAULT_IMAGE_MODEL | Z-Image Turbo, texte vers image | Environ 0,01 $ par image |
DEFAULT_VIDEO_MODEL | MiniMax H3, texte vers vidéo | Environ 0,037 $ par seconde en 768p |
DEFAULT_ANIMATE_MODEL | MiniMax H3, image vers vidéo | Environ 0,037 $ par seconde en 768p |
DEFAULT_CHAT_MODEL | DeepSeek V4.1 Flash | N’importe quel modèle de chat du catalogue |
Les identifiants exacts des modèles figurent dans .env.example ; pour en changer, copiez un autre identifiant depuis le catalogue en ligne (GET /api/v1/models ; dans l’exemple de personnage ci-dessous, MODEL_ID_FROM_CATALOG marque l’endroit où un tel identifiant va). Les prix proviennent du catalogue public et peuvent changer ; le bot affiche toujours le devis en direct. Parcourez les modèles sur spicyapi.ai/models ou voir Modèles. Pour le jeu de rôle, le classement jeu de rôle aide à choisir un modèle de chat.
Personnages
Les personnages vivent dans un fichier JSON (CHARACTERS_FILE, par défaut characters/default.json, qui contient deux personnages d’exemple) :
{
"characters": [
{
"id": "mira",
"name": "Mira",
"system": "You are Mira, ... Never speak or act for {{user}}.",
"greeting": "Welcome aboard, {{user}}!",
"model": "MODEL_ID_FROM_CATALOG"
}
]
}systemcorrespond aux instructions du personnage.greeting(facultatif) est sa première réplique.model(facultatif) fixe un modèle de chat pour ce personnage.{{char}}et{{user}}sont remplacés par le nom du personnage et le prénom de la personne.- Les entrées peuvent aussi être du JSON Character Card V2, le format que la plupart des sites de personnages et SillyTavern exportent. La description, la personnalité, le scénario, l’exemple de dialogue et le premier message sont utilisés.
Avec Docker, montez votre propre fichier et pointez le réglage dessus. Dans docker-compose.yml :
volumes:
- ./my-characters.json:/app/characters/custom.json:roEt dans .env :
CHARACTERS_FILE=characters/custom.jsonLe bot retient HISTORY_TURNS échanges par conversation (20 par défaut) et limite les réponses à CHAT_MAX_TOKENS tokens (2048 par défaut). Les modèles de raisonnement comptent leur réflexion dans cette limite : une valeur très petite peut ne laisser aucune place à la réponse. Voir Recettes de chat pour en savoir plus sur la rédaction de personnages.
L’envoi de photos est désactivé par défaut
Par défaut, seules les images générées par le bot peuvent être animées. Transformer des photos de personnes réelles en vidéos est la principale manière dont des bots de ce genre sont détournés, et une personne figurant sur une photo n’a pas accepté d’apparaître dans votre vidéo.
Si vous définissez ALLOW_PHOTO_UPLOADS=true, toute personne que vous autorisez peut animer une photo qu’elle envoie. N’activez cela que pour des personnes de confiance, et uniquement pour des photos d’adultes consentants. Lorsque l’option est activée, les images envoyées sont téléchargées par le bot et stockées chez SpicyAPI. Les liens de fichiers Telegram ne sont jamais transmis, car ils contiennent le jeton de votre bot.
Confidentialité : ce qui est stocké où
| Quoi | Où | Pendant combien de temps |
|---|---|---|
| Totaux de dépenses du jour, modèle et personnage choisis par chacun, qui a accepté les règles | state.json dans DATA_DIR (un volume avec Docker) | Jusqu’à ce que vous le supprimiez |
| Historique des conversations | En mémoire uniquement | Oublié au redémarrage, après un jour d’inactivité, ou avec /newchat |
| Journaux du bot | Votre machine | Identifiants de tâche et montants uniquement, jamais de prompts ni de médias |
| Prompts et résultats | SpicyAPI | La durée de conservation de votre compte ; voir Conservation des données |
Définissez RETENTION_SECONDS pour demander à SpicyAPI de supprimer les résultats et les prompts plus tôt que la valeur par défaut de votre compte.
Dans les groupes, les résultats sont masqués derrière un spoiler (SPOILER_MEDIA, par défaut groups ; les autres valeurs sont always et never). /report transmet un message au propriétaire. Un contenu qui enfreint les règles de SpicyAPI peut aussi être signalé sur spicyapi.ai/abuse.
Dépannage
| Message ou symptôme | Que faire |
|---|---|
« out of balance » (40201) | Rechargez votre solde SpicyAPI. |
« reached the spend cap » (40202) | Le plafond de la clé dans la console est atteint. Relevez-le ou attendez. |
« not allowed to use that model » (40301) | Autorisez le modèle sur la clé dans la console, ou choisissez-en un autre avec /models. |
« has not verified its email » (40310) | Ouvrez le lien de vérification envoyé par SpicyAPI. |
| « The model declined this request » | Ce modèle a refusé le prompt. Adaptez la requête ou choisissez un autre modèle. Vérifiez les conditions de facturation des refus sur la page du modèle. |
Conflict: terminated by other getUpdates request | Deux copies du bot utilisent le même jeton. Arrêtez-en une. |
| Commandes Discord absentes | /pic et /vid ne s’affichent que dans les salons réservés aux adultes. Les commandes globales peuvent mettre un moment à apparaître ; définissez DISCORD_GUILD_ID pour un enregistrement instantané. |
| Erreurs réseau derrière un proxy | Le fetch de Node ignore HTTPS_PROXY sauf si le bot démarre avec NODE_USE_ENV_PROXY=1. |
| Le bot répond par un nombre quand vous lui écrivez | C’est votre identifiant utilisateur. Placez-le dans OWNER_ID et redémarrez. |
Les codes d’erreur sont expliqués dans Erreurs.
Applications de jeu de rôle
Connectez les modèles de texte SpicyAPI à RisuAI, Agnai, Chub, KoboldAI Lite et Janitor AI. Les champs exacts de chaque application, les modèles adaptés au jeu de rôle, les modèles de raisonnement et le plafonnement des dépenses.
n8n
Utilisez les modèles d’image, de vidéo, d’audio et de chat de SpicyAPI dans vos workflows n8n. Installez le nœud communautaire, importez les modèles HTTP Request, ou pointez l’identifiant OpenAI de n8n vers SpicyAPI pour les nœuds AI Agent.

