spicyapiDocumentazione
App e plugin
Contenuto principale

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

  1. Nella console crea una chiave API solo per il bot e imposta un tetto di spesa giornaliero.
  2. In Telegram scrivi a @BotFather, invia /newbot e copia il token.
  3. Clona il repository, copia .env.example in .env, compila SPICY_API_KEY, TELEGRAM_BOT_TOKEN e OWNER_ID, poi esegui docker compose up -d --build.
  4. 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

ComandoCosa 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 AnimateSotto ogni immagine generata: la anima, riutilizzando il suo prompt
/talk <message>Parla con il personaggio corrente (in una chat privata puoi semplicemente scrivere)
/personaScegli un personaggio
/newchatDimentica la conversazione e ricomincia
/modelsScegli i tuoi modelli per immagini, video, animazione e chat
/spendQuanto hai speso oggi; il proprietario vede anche il totale del bot e il saldo dell’account
/report <text>Invia una segnalazione all’operatore
/helpRiepilogo 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

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

Apri .env e compila le tre righe obbligatorie:

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

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

Avvia

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

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

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_TOKEN sul token del bot.
  • DISCORD_GUILD_ID sull’ID del tuo server, se vuoi che i comandi compaiano subito invece che dopo una breve diffusione globale.
  • OWNER_ID in modo che includa il tuo ID utente Discord, per esempio OWNER_ID=tg:123,dc:456. I prefissi tg: e dc: vincolano un ID a una sola piattaforma.
  • ALLOWED_CHAT_IDS sull’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

ImpostazionePredefinitoEffetto
OWNER_IDobbligatorioTu. 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_IDSvuotoAltre persone autorizzate nelle chat private. Vuoto significa solo tu.
ALLOWED_CHAT_IDSvuotoGruppi (Telegram) o canali e server (Discord) in cui il bot risponde. Vuoto significa nessun gruppo.
REQUIRE_CONSENTtrueTutti 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

  1. Prima il prezzo. Ogni immagine o video viene quotato da SpicyAPI prima che accada qualsiasi cosa. I preventivi sono gratuiti.
  2. Tetto massimo. Se una richiesta potrebbe costare più di MAX_COST_PER_REQUEST_USD (predefinito $1), viene rifiutata. Non viene addebitato nulla.
  3. 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.
  4. Limiti giornalieri. Ogni persona può spendere USER_DAILY_BUDGET_USD (predefinito $1) per giorno UTC e l’intero bot DAILY_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.
  5. 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.
  6. 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:

ImpostazionePredefinitoCosa fa
MAX_CONCURRENT_TASKS_PER_USER2Immagini e video che una persona può avere in esecuzione contemporaneamente
VIDEO_SECONDS / VIDEO_RESOLUTION5 / 480pDurata e dimensione del video, adattate a ciò che ogni modello consente. Più corto e più basso costa meno
ALLOWED_MODELSvuotoLimita 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:

VariabilePredefinitoCosto al momento della stesura
DEFAULT_IMAGE_MODELZ-Image Turbo, da testo a immagineCirca $0,01 per immagine
DEFAULT_VIDEO_MODELMiniMax H3, da testo a videoCirca $0,037 al secondo a 768p
DEFAULT_ANIMATE_MODELMiniMax H3, da immagine a videoCirca $0,037 al secondo a 768p
DEFAULT_CHAT_MODELDeepSeek V4.1 FlashQualsiasi 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"
    }
  ]
}
  • system contiene 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:ro

E in .env:

CHARACTERS_FILE=characters/custom.json

Il 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

CosaDovePer quanto tempo
Totali di spesa giornalieri, modello e personaggio scelti da ciascuno, chi ha accettato le regolestate.json in DATA_DIR (un volume in Docker)Finché non lo elimini
Cronologia della chatSolo in memoriaDimenticata al riavvio, dopo un giorno di inattività o con /newchat
Log del botLa tua macchinaSolo ID delle attività e importi, mai prompt o contenuti multimediali
Prompt e risultatiSpicyAPIIl 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 sintomoCosa 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 requestDue 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 proxyIl 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.

In questa pagina