Bot para Telegram e Discord
Rode o seu próprio bot privado que cria imagens e vídeos, anima imagens e conversa com personagens que você define, pago com o seu saldo da SpicyAPI e com limites de gasto verificados antes de cada cobrança.
O bot da SpicyAPI é um pequeno programa que você mesmo executa. Ele se conecta ao Telegram (e, se quiser, ao Discord) e permite que as pessoas que você autorizar gerem imagens, criem vídeos, transformem imagens em vídeos e conversem com personagens que você define. Tudo é pago com o seu próprio saldo da SpicyAPI, e cada requisição é cotada antes de qualquer cobrança.
O bot é gratuito e de código aberto (MIT) em github.com/spicyapi-ai/spicyapi-bot. Ele é privado por padrão: só você pode usá-lo até autorizar outras pessoas ou grupos.
Versão resumida
- No console, crie uma chave de API só para o bot e defina um limite de gasto diário.
- No Telegram, envie uma mensagem para o @BotFather, mande
/newbote copie o token. - Clone o repositório, copie
.env.examplepara.env, preenchaSPICY_API_KEY,TELEGRAM_BOT_TOKENeOWNER_IDe executedocker compose up -d --build. - Abra o seu bot no Telegram, envie
/start, aceite as regras e experimente/pic a cozy cabin in the snow.
O que o bot faz
- Imagens:
/pic a lighthouse at dusk - Vídeos:
/vid waves rolling onto a beach at sunset - Animate: toque em Animate sob qualquer imagem criada pelo bot, ou responda a ela com
/animate <como ela deve se mover>. - Chat com personagens: digite em um chat privado ou use
/talk. As respostas chegam em streaming em uma única mensagem. - Proteção de gastos: cada requisição é cotada antes (as cotações são gratuitas), as caras exigem um toque em Confirm, e os limites diários por pessoa e do bot inteiro são aplicados.
- Privado por padrão: ninguém mais pode usá-lo até você autorizar.
O catálogo da SpicyAPI inclui modelos sem censura, que não adicionam filtro de conteúdo próprio, e o bot funciona com qualquer modelo que você escolher. A lei e a política de conteúdo da SpicyAPI continuam valendo para tudo o que você gerar. Veja Política.
Comandos
| Comando | O que faz |
|---|---|
/pic <prompt> | Gera uma imagem |
/vid <prompt> | Gera um vídeo a partir de texto |
/animate <motion> | Responda a uma imagem para transformá-la em vídeo. Imagens criadas pelo bot sempre funcionam; fotos suas só se o operador definiu ALLOW_PHOTO_UPLOADS=true |
| Botão Animate | Sob cada imagem gerada: anima a imagem, reaproveitando o prompt dela |
/talk <message> | Conversa com o personagem atual (em um chat privado basta digitar) |
/persona | Escolhe um personagem |
/newchat | Esquece a conversa e recomeça |
/models | Escolhe seus modelos de imagem, vídeo, animação e chat |
/spend | Quanto você gastou hoje; o dono também vê o bot inteiro e o saldo da conta |
/report <text> | Envia um relatório ao operador |
/help | Resumo de tudo isso |
Os nomes não são /image, /video nem /chat, que outros bots populares usam, de propósito: assim este bot pode dividir um grupo com eles. Em um grupo do Telegram, responda a uma das mensagens de chat do bot para continuar falando com o personagem.
Antes de começar
- Um computador ou servidor que fique ligado, com o Docker instalado. (Ou uma conta no Railway, veja abaixo.)
- Uma conta SpicyAPI com saldo. Veja Prepare sua conta e Cobrança.
- Uma conta no Telegram, para criar o bot com o BotFather.
Implante com Docker Compose
Crie uma chave para o bot
No console, crie uma nova chave de API só para este bot. Defina nela um limite de gasto diário e, se quiser, uma lista de modelos permitidos.
O bot também tem limites próprios, mas o limite da chave é aplicado pela própria SpicyAPI, então ele continua valendo se o bot estiver mal configurado ou se os dados dele forem perdidos. Chaves novas não têm limite, a menos que você defina um. Veja Autenticação.
Crie o bot do Telegram
Abra o @BotFather, envie /newbot, escolha um nome e um nome de usuário e copie o token que ele fornece. Ele se parece com 123456789:AA....
Configure
git clone https://github.com/spicyapi-ai/spicyapi-bot.git
cd spicyapi-bot
cp .env.example .envAbra o .env e preencha as três linhas obrigatórias:
SPICY_API_KEY=sk-spicy-...
TELEGRAM_BOT_TOKEN=123456789:AA...
OWNER_ID=your-telegram-user-idTodas as outras linhas têm um padrão seguro. O .env.example explica cada configuração.
Descubra o seu ID de usuário do Telegram (se não o conhece)
Coloque OWNER_ID=0 por enquanto e conclua o próximo passo. Depois envie qualquer mensagem ao seu bot e ele responde com o seu ID. Coloque esse número em OWNER_ID e reinicie:
docker compose up -dInicie
docker compose up -d --build
docker compose logs -fO log mostra Telegram bot @yourbot is running quando tudo está pronto.
Experimente
Abra o seu bot no Telegram, envie /start, aceite as regras uma vez e envie /pic a cozy cabin in the snow. O modelo de imagem padrão custa cerca de $0,01 por imagem.
Para atualizar depois, execute git pull && docker compose up -d --build.
Implante no Railway
O Railway pode executar o bot sem que você precise de um servidor próprio. Não há template de um clique: você implanta a partir da sua própria cópia do repositório.
Faça um fork do repositório
Faça um fork de github.com/spicyapi-ai/spicyapi-bot para a sua conta do GitHub.
Crie o projeto
No Railway, escolha New Project > Deploy from GitHub repo e selecione o seu fork. O Railway encontra o Dockerfile e o compila.
Adicione as variáveis
Abra a aba Variables do serviço e adicione SPICY_API_KEY, TELEGRAM_BOT_TOKEN e OWNER_ID, além de qualquer outra configuração do .env.example.
Anexe um volume
Clique com o botão direito no serviço, escolha Attach volume e use o caminho de montagem /data. Sem volume, cada novo deploy esquece o gasto de hoje e as configurações de todo mundo.
Implante
Faça o deploy e confira nos logs a linha Telegram bot @yourbot is running.
Mantenha o serviço em uma réplica: duas cópias consultando o mesmo token do Telegram disputam as atualizações. O bot não precisa de domínio público nem de porta aberta.
Adicione o Discord (opcional)
Crie o aplicativo
No Discord Developer Portal, crie um aplicativo, abra Bot, redefina e copie o token e desative Public Bot para que só você possa adicioná-lo a servidores. Nenhum privileged intent é necessário.
Convide-o para o seu servidor
Em OAuth2 > URL Generator, marque os escopos bot e applications.commands e as permissões Send Messages, Attach Files, Embed Links e Read Message History. Abra o link gerado e adicione o bot ao seu servidor.
Configure
No .env, defina:
DISCORD_TOKENcom o token do bot.DISCORD_GUILD_IDcom o ID do seu servidor, se quiser que os comandos apareçam na hora, em vez de depois de uma breve liberação global.OWNER_IDincluindo o seu ID de usuário do Discord, por exemploOWNER_ID=tg:123,dc:456. Os prefixostg:edc:fixam um ID a uma única plataforma.ALLOWED_CHAT_IDScom o ID do canal ou servidor onde o bot deve responder.
Para encontrar os IDs, ative o Developer Mode (User Settings > Advanced), clique com o botão direito em um usuário, canal ou servidor e escolha Copy ID. Reinicie o bot.
Marque o canal como com restrição de idade
Imagens e vídeos só funcionam em canais com restrição de idade: Edit Channel > Overview > Age-Restricted Channel. Os comandos /pic e /vid são registrados como restritos por idade, então o Discord só os mostra nesses canais.
O chat (/talk, ou mencionar o bot) funciona em qualquer canal permitido, a menos que você defina DISCORD_CHAT_REQUIRES_NSFW=true, que limita o chat também a canais com restrição de idade.
O Discord não permite apps com comandos restritos por idade no App Directory, então mantenha o bot privado. O .env.example também tem DISCORD_MEDIA_IN_DMS, que por padrão é false: imagens e vídeos então funcionam só em canais de servidor com restrição de idade, não em mensagens diretas.
Quem pode usar
| Configuração | Padrão | Efeito |
|---|---|---|
OWNER_ID | obrigatório | Você. Sempre permitido, sem o limite diário por pessoa, e o único que vê o saldo da conta. Separe vários IDs com vírgulas. |
ALLOWED_USER_IDS | vazio | Outras pessoas autorizadas em chats privados. Vazio significa só você. |
ALLOWED_CHAT_IDS | vazio | Grupos (Telegram) ou canais e servidores (Discord) onde o bot responde. Vazio significa nenhum grupo. |
REQUIRE_CONSENT | true | Cada pessoa confirma uma vez que tem 18 anos ou mais e que seguirá as regras de conteúdo. |
Quem encontra o bot sem ser autorizado é informado de que ele é privado e recebe o próprio ID de usuário para enviar a você. Grupos são ignorados até serem listados em ALLOWED_CHAT_IDS; depois que um grupo é listado, todos os membros dele podem usar o bot, dentro dos limites diários. Os IDs de grupos do Telegram são negativos, por exemplo -1001234567890.
Não defina ALLOWED_USER_IDS=*
ALLOWED_USER_IDS=* torna o bot público e deixa qualquer pessoa que o encontre gastar o seu saldo. Só use se for essa a sua intenção.
Você opera este bot e é responsável por quem deixa usá-lo. Os termos da SpicyAPI se aplicam, inclusive as regiões que a SpicyAPI não atende.
Como funciona o gasto
- Preço primeiro. Cada imagem ou vídeo é cotado pela SpicyAPI antes de qualquer coisa acontecer. As cotações são gratuitas.
- Teto rígido. Se uma requisição puder custar mais que
MAX_COST_PER_REQUEST_USD(padrão $1), ela é recusada. Nada é cobrado. - Confirmação. Se puder custar mais que
CONFIRM_ABOVE_USD(padrão $0,10), o bot mostra o preço com os botões Confirm e Cancel. Só quem fez o pedido pode confirmar. - Limites diários. Cada pessoa pode gastar
USER_DAILY_BUDGET_USD(padrão $1) por dia UTC e o bot inteiroDAILY_BUDGET_USD(padrão $5). Gerações ainda em andamento contam como gastas até terminarem, então várias requisições ao mesmo tempo não conseguem escapar de um limite. Os donos só estão sujeitos ao limite do bot inteiro. - Sem cobrança duplicada. Cada requisição leva uma chave de idempotência derivada da mensagem do chat ou do toque no botão, então uma atualização duplicada do Telegram ou um toque duplo retorna a tarefa que já existe.
- Resultados. O progresso é exibido editando uma mensagem a cada poucos segundos. O resultado mostra a cobrança real e o ID da tarefa, que você pode consultar em Logs no console.
Uma geração aceita não pode ser cancelada. Execuções bem-sucedidas são cobradas; falhas comuns liberam a retenção. Algumas recusas de conteúdo só são cobradas quando a página do modelo informa isso explicitamente. Veja Cobrança.
Use uma chave com limite
O bot mantém o próprio registro em DATA_DIR/state.json. Se esse arquivo for perdido, o bot esquece o que foi gasto hoje. O limite da chave de API no console é o que nunca se perde, porque a SpicyAPI o aplica. Crie uma chave separada para o bot, defina um limite de gasto diário e, se quiser, permita só os modelos desejados. Quando o limite é atingido, o bot avisa que a chave atingiu o limite de gasto.
Outras configurações úteis:
| Configuração | Padrão | O que faz |
|---|---|---|
MAX_CONCURRENT_TASKS_PER_USER | 2 | Imagens e vídeos que uma pessoa pode ter em execução ao mesmo tempo |
VIDEO_SECONDS / VIDEO_RESOLUTION | 5 / 480p | Duração e tamanho do vídeo, ajustados ao que cada modelo permite. Mais curto e menor é mais barato |
ALLOWED_MODELS | vazio | Limita os menus de /models. IDs exatos ou prefixos terminados em *, por exemplo alibaba/* |
Modelos e preços
Cada pessoa pode mudar os próprios modelos com /models. O operador define os padrões:
| Variável | Padrão | Custo na data desta redação |
|---|---|---|
DEFAULT_IMAGE_MODEL | Z-Image Turbo, texto para imagem | Cerca de $0,01 por imagem |
DEFAULT_VIDEO_MODEL | MiniMax H3, texto para vídeo | Cerca de $0,037 por segundo em 768p |
DEFAULT_ANIMATE_MODEL | MiniMax H3, imagem para vídeo | Cerca de $0,037 por segundo em 768p |
DEFAULT_CHAT_MODEL | DeepSeek V4.1 Flash | Qualquer modelo de chat do catálogo |
Os ids exatos dos modelos estão no .env.example; para trocar, copie outro id do catálogo ao vivo (GET /api/v1/models; no exemplo de personagem abaixo, MODEL_ID_FROM_CATALOG marca onde um id desses entra). Os preços vêm do catálogo público e podem mudar; o bot sempre mostra a cotação em tempo real. Veja os modelos em spicyapi.ai/models ou consulte Catálogo de modelos e schemas. Para roleplay, o ranking de roleplay ajuda a escolher um modelo de chat.
Personagens
Os personagens ficam em um arquivo JSON (CHARACTERS_FILE, padrão characters/default.json, que tem dois personagens de exemplo):
{
"characters": [
{
"id": "mira",
"name": "Mira",
"system": "You are Mira, ... Never speak or act for {{user}}.",
"greeting": "Welcome aboard, {{user}}!",
"model": "MODEL_ID_FROM_CATALOG"
}
]
}systemsão as instruções do personagem.greeting(opcional) é a primeira fala dele.model(opcional) fixa um modelo de chat para este personagem.{{char}}e{{user}}são substituídos pelo nome do personagem e pelo primeiro nome da pessoa.- As entradas também podem ser JSON no formato Character Card V2, o formato que a maioria dos sites de personagens e o SillyTavern exportam. São usados a descrição, a personalidade, o cenário, o diálogo de exemplo e a primeira mensagem.
Com Docker, monte o seu próprio arquivo e aponte a configuração para ele. No docker-compose.yml:
volumes:
- ./my-characters.json:/app/characters/custom.json:roE no .env:
CHARACTERS_FILE=characters/custom.jsonO bot lembra HISTORY_TURNS trocas por conversa (padrão 20) e limita as respostas a CHAT_MAX_TOKENS tokens (padrão 2048). Modelos de raciocínio contam o pensamento nesse limite, então um valor muito pequeno pode não deixar espaço para a resposta. Veja Receitas de chat para mais sobre como escrever personagens.
O envio de fotos vem desativado
Por padrão, só as imagens geradas pelo bot podem ser animadas. Transformar fotos de pessoas reais em vídeos é a principal forma de abuso de bots como este, e a pessoa da foto não concordou em aparecer no seu vídeo.
Se você definir ALLOW_PHOTO_UPLOADS=true, qualquer pessoa autorizada por você pode animar uma foto que enviar. Ative apenas para pessoas de confiança e só para fotos de adultos que concordaram. Quando está ativado, as imagens enviadas são baixadas pelo bot e armazenadas na SpicyAPI. Os links de arquivos do Telegram nunca são repassados, porque contêm o token do seu bot.
Privacidade: o que fica guardado onde
| O quê | Onde | Por quanto tempo |
|---|---|---|
| Totais de gasto diário, o modelo e o personagem escolhidos por cada pessoa, quem aceitou as regras | state.json em DATA_DIR (um volume no Docker) | Até você apagar |
| Histórico de chat | Somente em memória | Esquecido ao reiniciar, após um dia de inatividade ou com /newchat |
| Logs do bot | Sua máquina | Apenas IDs de tarefa e valores, nunca prompts nem mídia |
| Prompts e resultados | SpicyAPI | O período de retenção da sua conta; veja Retenção e destruição |
Defina RETENTION_SECONDS para pedir à SpicyAPI que apague resultados e prompts antes do padrão da sua conta.
Em grupos, os resultados ficam ocultos atrás de um spoiler (SPOILER_MEDIA, padrão groups; os outros valores são always e never). O /report encaminha uma mensagem ao dono. Conteúdo que viola as regras da SpicyAPI também pode ser denunciado em spicyapi.ai/abuse.
Solução de problemas
| Mensagem ou sintoma | O que fazer |
|---|---|
"out of balance" (40201) | Recarregue o seu saldo da SpicyAPI. |
"reached the spend cap" (40202) | O limite da chave no console foi atingido. Aumente-o ou espere. |
"not allowed to use that model" (40301) | Permita o modelo na chave no console ou escolha outro com /models. |
"has not verified its email" (40310) | Abra o link de verificação enviado pela SpicyAPI. |
| "The model declined this request" | O modelo recusou o prompt. Ajuste a requisição ou escolha outro modelo. Confira as condições de cobrança por recusa na página do modelo. |
Conflict: terminated by other getUpdates request | Duas cópias do bot usam o mesmo token. Pare uma. |
| Comandos do Discord ausentes | /pic e /vid só aparecem em canais com restrição de idade. Os comandos globais podem demorar um pouco para aparecer; defina DISCORD_GUILD_ID para um registro instantâneo. |
| Erros de rede atrás de um proxy | O fetch do Node ignora HTTPS_PROXY, a menos que o bot seja iniciado com NODE_USE_ENV_PROXY=1. |
| O bot responde com um número quando você manda mensagem | Esse é o seu ID de usuário. Coloque-o em OWNER_ID e reinicie. |
Os códigos de erro estão explicados em Erros.
Apps de roleplay
Conecte os modelos de texto da SpicyAPI ao RisuAI, Agnai, Chub, KoboldAI Lite e Janitor AI. Os campos exatos de cada app, quais modelos servem para roleplay, como lidar com modelos de raciocínio e como limitar o gasto.
n8n
Use os modelos de imagem, vídeo, áudio e chat da SpicyAPI em workflows do n8n. Instale o community node, importe os templates de HTTP Request ou aponte a credencial OpenAI do n8n para a SpicyAPI nos nodes de AI Agent.

