Bot per Telegram e Discord
Gestisci un tuo bot privato che crea immagini e video, anima le immagini e chatta con personaggi definiti da te, pagato dal tuo saldo SpicyAPI con i limiti di spesa controllati prima di ogni addebito.
Il bot SpicyAPI è un piccolo programma che esegui tu stesso. Si collega a Telegram (e, se vuoi, a Discord) e permette alle persone che autorizzi di generare immagini, creare video, trasformare immagini in video e chattare con personaggi che definisci tu. Tutto viene pagato dal tuo saldo SpicyAPI, e ogni richiesta viene quotata prima che venga addebitato qualcosa.
Il bot è gratuito e open source (MIT) su github.com/spicyapi-ai/spicyapi-bot. È privato per impostazione predefinita: lo puoi usare solo tu, finché non autorizzi altre persone o gruppi.
In breve
- Nella console crea una chiave API solo per il bot e imposta un tetto di spesa giornaliero.
- In Telegram scrivi a @BotFather, invia
/newbote copia il token. - Clona il repository, copia
.env.examplein.env, compilaSPICY_API_KEY,TELEGRAM_BOT_TOKENeOWNER_ID, poi eseguidocker compose up -d --build. - Apri il tuo bot in Telegram, invia
/start, accetta le regole e prova/pic a cozy cabin in the snow.
Cosa fa il bot
- Immagini:
/pic a lighthouse at dusk - Video:
/vid waves rolling onto a beach at sunset - Animate: tocca Animate sotto qualsiasi immagine creata dal bot, oppure rispondile con
/animate <come deve muoversi>. - Chat con i personaggi: scrivi in una chat privata, oppure usa
/talk. Le risposte arrivano in streaming in un unico messaggio. - Protezione della spesa: ogni richiesta viene quotata prima (i preventivi sono gratuiti), quelle costose richiedono un tocco su Confirm, e vengono applicati limiti giornalieri per persona e per l’intero bot.
- Privato per impostazione predefinita: nessun altro può usarlo finché non lo autorizzi.
Il catalogo di SpicyAPI include modelli senza censura che non aggiungono filtri di contenuto propri, e il bot funziona con qualsiasi modello scegli. La legge e la policy sui contenuti di SpicyAPI valgono comunque per tutto ciò che generi. Vedi Policy.
Comandi
| Comando | Cosa fa |
|---|---|
/pic <prompt> | Genera un’immagine |
/vid <prompt> | Genera un video da testo |
/animate <motion> | Rispondi a un’immagine per trasformarla in video. Le immagini create dal bot funzionano sempre; le tue foto solo se l’operatore ha impostato ALLOW_PHOTO_UPLOADS=true |
| Pulsante Animate | Sotto ogni immagine generata: la anima, riutilizzando il suo prompt |
/talk <message> | Parla con il personaggio corrente (in una chat privata puoi semplicemente scrivere) |
/persona | Scegli un personaggio |
/newchat | Dimentica la conversazione e ricomincia |
/models | Scegli i tuoi modelli per immagini, video, animazione e chat |
/spend | Quanto hai speso oggi; il proprietario vede anche il totale del bot e il saldo dell’account |
/report <text> | Invia una segnalazione all’operatore |
/help | Riepilogo di tutto questo |
I nomi non sono volutamente /image, /video o /chat, usati da altri bot molto diffusi, così questo bot può convivere con loro in un gruppo. In un gruppo Telegram, rispondi a uno dei messaggi di chat del bot per continuare a parlare con il personaggio.
Prima di cominciare
- Un computer o un server sempre acceso, con Docker installato. (Oppure un account Railway, vedi sotto.)
- Un account SpicyAPI con un saldo. Vedi Configura il tuo account e Fatturazione.
- Un account Telegram, per creare il bot con BotFather.
Distribuzione con Docker Compose
Crea una chiave per il bot
Nella console crea una nuova chiave API solo per questo bot. Imposta su quella chiave un tetto di spesa giornaliero e, se vuoi, un elenco di modelli consentiti.
Anche il bot ha limiti propri, ma il tetto della chiave viene applicato da SpicyAPI stessa, quindi regge anche se il bot è configurato male o i suoi dati vanno persi. Le nuove chiavi non hanno alcun tetto, a meno che tu non lo imposti. Vedi Autenticazione.
Crea il bot Telegram
Apri @BotFather, invia /newbot, scegli un nome e uno username, e copia il token che ti dà. Assomiglia a 123456789:AA....
Configura
git clone https://github.com/spicyapi-ai/spicyapi-bot.git
cd spicyapi-bot
cp .env.example .envApri .env e compila le tre righe obbligatorie:
SPICY_API_KEY=sk-spicy-...
TELEGRAM_BOT_TOKEN=123456789:AA...
OWNER_ID=your-telegram-user-idOgni altra riga ha un valore predefinito sicuro. .env.example spiega ogni impostazione.
Trova il tuo ID utente Telegram (se non lo conosci)
Per ora metti OWNER_ID=0 e completa il passaggio successivo. Poi invia al tuo bot un messaggio qualsiasi e ti risponderà con il tuo ID. Inserisci quel numero in OWNER_ID e riavvia:
docker compose up -dAvvia
docker compose up -d --build
docker compose logs -fIl log mostra Telegram bot @yourbot is running quando è pronto.
Provalo
Apri il tuo bot in Telegram, invia /start, accetta le regole una volta sola e invia /pic a cozy cabin in the snow. Il modello di immagini predefinito costa circa $0,01 per immagine.
Per aggiornare in seguito, esegui git pull && docker compose up -d --build.
Distribuzione su Railway
Railway può eseguire il bot senza un server tuo. Non c’è un template con un clic: lo distribuisci dalla tua copia del repository.
Fai il fork del repository
Fai il fork di github.com/spicyapi-ai/spicyapi-bot nel tuo account GitHub.
Crea il progetto
In Railway scegli New Project > Deploy from GitHub repo e seleziona il tuo fork. Railway trova il Dockerfile e lo compila.
Aggiungi le variabili
Apri la scheda Variables del servizio e aggiungi SPICY_API_KEY, TELEGRAM_BOT_TOKEN e OWNER_ID, oltre a qualsiasi altra impostazione di .env.example.
Collega un volume
Fai clic con il tasto destro sul servizio, scegli Attach volume e usa il percorso di mount /data. Senza un volume, a ogni nuova distribuzione si dimenticano la spesa di oggi e le impostazioni di tutti.
Distribuisci
Distribuisci e controlla nei log la riga Telegram bot @yourbot is running.
Tieni il servizio a una sola replica: due copie che interrogano lo stesso token Telegram si contendono gli aggiornamenti. Il bot non ha bisogno di un dominio pubblico né di una porta aperta.
Aggiungi Discord (facoltativo)
Crea l’applicazione
Nel Discord Developer Portal crea un’applicazione, apri Bot, reimposta e copia il token, e disattiva Public Bot in modo che solo tu possa aggiungerlo ai server. Non servono privileged intent.
Invitalo nel tuo server
In OAuth2 > URL Generator seleziona gli scope bot e applications.commands e i permessi Send Messages, Attach Files, Embed Links e Read Message History. Apri il link generato e aggiungi il bot al tuo server.
Configura
In .env imposta:
DISCORD_TOKENsul token del bot.DISCORD_GUILD_IDsull’ID del tuo server, se vuoi che i comandi compaiano subito invece che dopo una breve diffusione globale.OWNER_IDin modo che includa il tuo ID utente Discord, per esempioOWNER_ID=tg:123,dc:456. I prefissitg:edc:vincolano un ID a una sola piattaforma.ALLOWED_CHAT_IDSsull’ID del canale o del server in cui il bot deve rispondere.
Per trovare gli ID attiva la modalità sviluppatore (User Settings > Advanced), poi fai clic con il tasto destro su un utente, un canale o un server e scegli Copy ID. Riavvia il bot.
Segna il canale come con limite di età
Immagini e video funzionano solo nei canali con limite di età: Edit Channel > Overview > Age-Restricted Channel. I comandi /pic e /vid sono registrati come con limite di età, quindi Discord li mostra solo lì.
La chat (/talk, o menzionando il bot) funziona in qualsiasi canale autorizzato, a meno che tu non imposti DISCORD_CHAT_REQUIRES_NSFW=true, che limita la chat ai canali con limite di età.
Discord non consente nella sua App Directory le app con comandi con limite di età, quindi mantieni il bot privato. .env.example contiene anche DISCORD_MEDIA_IN_DMS, che per impostazione predefinita è false: immagini e video allora funzionano solo nei canali del server con limite di età, non nei messaggi diretti.
Chi può usarlo
| Impostazione | Predefinito | Effetto |
|---|---|---|
OWNER_ID | obbligatorio | Tu. Sempre autorizzato, non soggetto al limite giornaliero per persona, e l’unico a vedere il saldo dell’account. Separa più ID con virgole. |
ALLOWED_USER_IDS | vuoto | Altre persone autorizzate nelle chat private. Vuoto significa solo tu. |
ALLOWED_CHAT_IDS | vuoto | Gruppi (Telegram) o canali e server (Discord) in cui il bot risponde. Vuoto significa nessun gruppo. |
REQUIRE_CONSENT | true | Tutti confermano una volta di avere almeno 18 anni e di rispettare le regole sui contenuti. |
Agli sconosciuti che trovano il bot viene detto che è privato e viene dato il loro ID utente da inviarti. I gruppi vengono ignorati finché non sono elencati in ALLOWED_CHAT_IDS; una volta elencato un gruppo, ogni membro può usare il bot, entro i limiti giornalieri. Gli ID dei gruppi Telegram sono negativi, per esempio -1001234567890.
Non impostare ALLOWED_USER_IDS=*
ALLOWED_USER_IDS=* rende pubblico il bot e permette a chiunque lo trovi di spendere il tuo saldo. Usalo solo se è proprio ciò che vuoi.
Il bot lo gestisci tu e sei responsabile di chi lo usa. Si applicano i termini di SpicyAPI, comprese le regioni che SpicyAPI non serve.
Come funziona la spesa
- Prima il prezzo. Ogni immagine o video viene quotato da SpicyAPI prima che accada qualsiasi cosa. I preventivi sono gratuiti.
- Tetto massimo. Se una richiesta potrebbe costare più di
MAX_COST_PER_REQUEST_USD(predefinito $1), viene rifiutata. Non viene addebitato nulla. - Conferma. Se potrebbe costare più di
CONFIRM_ABOVE_USD(predefinito $0,10), il bot mostra il prezzo con i pulsanti Confirm e Cancel. Solo chi ha fatto la richiesta può confermare. - Limiti giornalieri. Ogni persona può spendere
USER_DAILY_BUDGET_USD(predefinito $1) per giorno UTC e l’intero botDAILY_BUDGET_USD(predefinito $5). Le generazioni ancora in corso contano come spese finché non terminano, quindi più richieste simultanee non possono eludere un limite. I proprietari sono soggetti solo al limite dell’intero bot. - Nessun doppio addebito. Ogni richiesta porta una chiave di idempotenza derivata dal messaggio di chat o dal tocco sul pulsante, quindi un aggiornamento Telegram duplicato o un doppio tocco restituiscono l’attività già esistente.
- Risultati. L’avanzamento viene mostrato modificando un solo messaggio ogni pochi secondi. Il risultato mostra l’addebito effettivo e l’ID dell’attività, che puoi cercare sotto Logs nella console.
Una generazione accettata non può essere annullata. Le esecuzioni riuscite vengono addebitate; i normali errori liberano l’importo riservato. Alcuni rifiuti di contenuto vengono addebitati solo quando la pagina del modello lo indica esplicitamente. Vedi Fatturazione.
Usa una chiave con tetto
Il bot tiene un proprio registro in DATA_DIR/state.json. Se quel file va perso, il bot dimentica quanto è stato speso oggi. Il tetto sulla chiave API nella console è il limite che non si può mai perdere, perché lo applica SpicyAPI. Crea una chiave separata per il bot, imposta un tetto di spesa giornaliero e, se vuoi, consenti solo i modelli che desideri. Quando il tetto viene raggiunto, il bot ti avvisa che la chiave ha raggiunto il suo tetto di spesa.
Altre impostazioni utili:
| Impostazione | Predefinito | Cosa fa |
|---|---|---|
MAX_CONCURRENT_TASKS_PER_USER | 2 | Immagini e video che una persona può avere in esecuzione contemporaneamente |
VIDEO_SECONDS / VIDEO_RESOLUTION | 5 / 480p | Durata e dimensione del video, adattate a ciò che ogni modello consente. Più corto e più basso costa meno |
ALLOWED_MODELS | vuoto | Limita i menu di /models. ID esatti o prefissi che terminano con *, per esempio alibaba/* |
Modelli e prezzi
Ogni persona può cambiare i propri modelli con /models. L’operatore imposta i valori predefiniti:
| Variabile | Predefinito | Costo al momento della stesura |
|---|---|---|
DEFAULT_IMAGE_MODEL | Z-Image Turbo, da testo a immagine | Circa $0,01 per immagine |
DEFAULT_VIDEO_MODEL | MiniMax H3, da testo a video | Circa $0,037 al secondo a 768p |
DEFAULT_ANIMATE_MODEL | MiniMax H3, da immagine a video | Circa $0,037 al secondo a 768p |
DEFAULT_CHAT_MODEL | DeepSeek V4.1 Flash | Qualsiasi modello di chat del catalogo |
Gli ID esatti dei modelli sono in .env.example; per cambiare, copia un altro ID dal catalogo in tempo reale (GET /api/v1/models; nell’esempio del personaggio qui sotto, MODEL_ID_FROM_CATALOG segna dove va un ID del genere). I prezzi provengono dal catalogo pubblico e possono cambiare; il bot mostra sempre il preventivo aggiornato. Sfoglia i modelli su spicyapi.ai/models oppure vedi Catalogo dei modelli. Per il roleplay, la classifica roleplay ti aiuta a scegliere un modello di chat.
Personaggi
I personaggi stanno in un file JSON (CHARACTERS_FILE, predefinito characters/default.json, che contiene due personaggi di esempio):
{
"characters": [
{
"id": "mira",
"name": "Mira",
"system": "You are Mira, ... Never speak or act for {{user}}.",
"greeting": "Welcome aboard, {{user}}!",
"model": "MODEL_ID_FROM_CATALOG"
}
]
}systemcontiene le istruzioni del personaggio.greeting(facoltativo) è la sua prima battuta.model(facoltativo) assegna al personaggio un modello di chat fisso.{{char}}e{{user}}vengono sostituiti con il nome del personaggio e il nome di battesimo della persona.- Le voci possono anche essere JSON Character Card V2, il formato esportato dalla maggior parte dei siti di personaggi e da SillyTavern. Vengono usati descrizione, personalità, scenario, dialoghi di esempio e primo messaggio.
Con Docker, monta il tuo file e punta l’impostazione verso di esso. In docker-compose.yml:
volumes:
- ./my-characters.json:/app/characters/custom.json:roE in .env:
CHARACTERS_FILE=characters/custom.jsonIl bot ricorda HISTORY_TURNS scambi per conversazione (predefinito 20) e limita le risposte a CHAT_MAX_TOKENS token (predefinito 2048). I modelli con ragionamento contano il loro pensiero in questo limite, quindi un valore molto piccolo può non lasciare spazio alla risposta. Per saperne di più su come scrivere i personaggi, vedi Ricette di chat.
Il caricamento di foto è disattivato per impostazione predefinita
Per impostazione predefinita si possono animare solo le immagini generate dal bot. Trasformare in video le foto di persone reali è il modo principale in cui bot come questo vengono usati in modo abusivo, e una persona in una foto non ha acconsentito a comparire nel tuo video.
Se imposti ALLOW_PHOTO_UPLOADS=true, chiunque tu autorizzi può animare una foto che invia. Attivalo solo per persone di cui ti fidi, e solo per foto di adulti consenzienti. Quando è attivo, le immagini caricate vengono scaricate dal bot e conservate presso SpicyAPI. I link ai file di Telegram non vengono mai passati oltre, perché contengono il token del tuo bot.
Privacy: cosa viene conservato e dove
| Cosa | Dove | Per quanto tempo |
|---|---|---|
| Totali di spesa giornalieri, modello e personaggio scelti da ciascuno, chi ha accettato le regole | state.json in DATA_DIR (un volume in Docker) | Finché non lo elimini |
| Cronologia della chat | Solo in memoria | Dimenticata al riavvio, dopo un giorno di inattività o con /newchat |
| Log del bot | La tua macchina | Solo ID delle attività e importi, mai prompt o contenuti multimediali |
| Prompt e risultati | SpicyAPI | Il periodo di conservazione del tuo account; vedi Conservazione e distruzione |
Imposta RETENTION_SECONDS per chiedere a SpicyAPI di eliminare risultati e prompt prima del valore predefinito del tuo account.
Nei gruppi i risultati sono nascosti dietro uno spoiler (SPOILER_MEDIA, predefinito groups; gli altri valori sono always e never). /report inoltra un messaggio al proprietario. I contenuti che violano le regole di SpicyAPI si possono segnalare anche su spicyapi.ai/abuse.
Risoluzione dei problemi
| Messaggio o sintomo | Cosa fare |
|---|---|
«out of balance» (40201) | Ricarica il tuo saldo SpicyAPI. |
«reached the spend cap» (40202) | È stato raggiunto il tetto della chiave nella console. Aumentalo o aspetta. |
«not allowed to use that model» (40301) | Consenti il modello sulla chiave nella console, oppure scegline un altro con /models. |
«has not verified its email» (40310) | Apri il link di verifica inviato da SpicyAPI. |
| «The model declined this request» | Quel modello ha rifiutato il prompt. Adatta la richiesta o scegli un altro modello. Controlla le condizioni di addebito dei rifiuti sulla pagina del modello. |
Conflict: terminated by other getUpdates request | Due copie del bot usano lo stesso token. Ferma una delle due. |
| Comandi Discord mancanti | /pic e /vid compaiono solo nei canali con limite di età. I comandi globali possono impiegare un po’ a comparire; imposta DISCORD_GUILD_ID per la registrazione immediata. |
| Errori di rete dietro un proxy | Il fetch di Node ignora HTTPS_PROXY a meno che il bot non parta con NODE_USE_ENV_PROXY=1. |
| Il bot risponde con un numero quando gli scrivi | È il tuo ID utente. Inseriscilo in OWNER_ID e riavvia. |
I codici di errore sono spiegati in Errori.
App di roleplay
Collega i modelli di testo di SpicyAPI a RisuAI, Agnai, Chub, KoboldAI Lite e Janitor AI. I campi esatti di ogni app, quali modelli vanno bene per il roleplay, come gestire i modelli con ragionamento e come limitare la spesa.
n8n
Usa i modelli di immagini, video, audio e chat di SpicyAPI nei workflow di n8n. Installa il community node, importa i template HTTP Request, oppure punta la credenziale OpenAI di n8n a SpicyAPI per i nodi AI Agent.

