Бот для Telegram и Discord
Запустите собственного приватного бота, который создаёт изображения и видео, оживляет картинки и общается с заданными вами персонажами. Оплата с баланса SpicyAPI, лимиты расходов проверяются перед каждым списанием.
Бот SpicyAPI — это небольшая программа, которую вы запускаете сами. Она подключается к Telegram (и, если хотите, к Discord) и позволяет тем, кому вы разрешили, создавать изображения, делать видео, превращать изображения в видео и общаться с заданными вами персонажами. Всё оплачивается с вашего баланса SpicyAPI, а цена каждого запроса рассчитывается до любого списания.
Бот бесплатный и с открытым исходным кодом (MIT): github.com/spicyapi-ai/spicyapi-bot. По умолчанию он приватный: им можете пользоваться только вы, пока не разрешите другим людям или группам.
Коротко
- В консоли создайте API-ключ специально для бота и задайте ему суточный лимит расходов.
- В Telegram напишите @BotFather, отправьте
/newbotи скопируйте токен. - Клонируйте репозиторий, скопируйте
.env.exampleв.env, заполнитеSPICY_API_KEY,TELEGRAM_BOT_TOKENиOWNER_ID, затем выполнитеdocker compose up -d --build. - Откройте своего бота в Telegram, отправьте
/start, примите правила и попробуйте/pic a cozy cabin in the snow.
Что умеет бот
- Изображения:
/pic a lighthouse at dusk - Видео:
/vid waves rolling onto a beach at sunset - Анимация: нажмите Animate под любым изображением, которое создал бот, или ответьте на него командой
/animate <how it should move>. - Чат с персонажем: пишите в личном чате или используйте
/talk. Ответы поступают потоком в одно сообщение. - Защита от лишних трат: каждый запрос сначала оценивается по цене (расчёты бесплатны), дорогие запросы требуют нажатия Confirm, а суточные лимиты действуют и на каждого человека, и на весь бот.
- Приватность по умолчанию: никто другой не может им пользоваться, пока вы не разрешите.
В каталоге SpicyAPI есть модели без цензуры, которые не добавляют собственного фильтра содержимого, и бот работает с любой выбранной вами моделью. К тому, что вы создаёте, по-прежнему применяются закон и политика содержимого SpicyAPI. См. Политика.
Команды
| Команда | Что делает |
|---|---|
/pic <prompt> | Создаёт изображение |
/vid <prompt> | Создаёт видео по тексту |
/animate <motion> | Ответьте на изображение, чтобы превратить его в видео. Изображения, созданные ботом, работают всегда; ваши собственные фото — только если оператор задал ALLOW_PHOTO_UPLOADS=true |
| Кнопка Animate | Под каждым созданным изображением: оживляет его, используя его промпт |
/talk <message> | Разговор с текущим персонажем (в личном чате можно просто писать текст) |
/persona | Выбор персонажа |
/newchat | Забыть разговор и начать заново |
/models | Выбор моделей для изображений, видео, анимации и чата |
/spend | Сколько вы потратили сегодня; владелец также видит расходы всего бота и баланс аккаунта |
/report <text> | Отправить жалобу оператору |
/help | Краткая справка по всему этому |
Названия намеренно не /image, /video или /chat, которые используют другие популярные боты, чтобы этот бот мог находиться в одной группе с ними. В группе Telegram отвечайте на одно из сообщений чата бота, чтобы продолжать разговор с персонажем.
Перед началом
- Компьютер или сервер, который всегда включён, с установленным Docker. (Или аккаунт Railway, см. ниже.)
- Аккаунт SpicyAPI с балансом. См. Подготовка аккаунта и Оплата.
- Аккаунт Telegram, чтобы создать бота через BotFather.
Развёртывание через Docker Compose
Создайте ключ для бота
В консоли создайте новый API-ключ специально для этого бота. Задайте этому ключу суточный лимит расходов и, если хотите, список разрешённых моделей.
У самого бота тоже есть свои лимиты, но лимит ключа обеспечивает сам SpicyAPI, поэтому он сохраняется, даже если бот неверно настроен или его данные потеряны. У новых ключей лимита нет, пока вы его не зададите. См. Аутентификация.
Создайте бота в Telegram
Откройте @BotFather, отправьте /newbot, выберите имя и username и скопируйте полученный токен. Он выглядит как 123456789:AA....
Настройте
git clone https://github.com/spicyapi-ai/spicyapi-bot.git
cd spicyapi-bot
cp .env.example .envОткройте .env и заполните три обязательные строки:
SPICY_API_KEY=sk-spicy-...
TELEGRAM_BOT_TOKEN=123456789:AA...
OWNER_ID=your-telegram-user-idУ всех остальных строк есть безопасные значения по умолчанию. В .env.example объяснена каждая настройка.
Узнайте свой Telegram user ID (если не знаете его)
Пока укажите OWNER_ID=0 и выполните следующий шаг. Затем отправьте боту любое сообщение, и он ответит вашим ID. Впишите это число в OWNER_ID и перезапустите:
docker compose up -dЗапустите
docker compose up -d --build
docker compose logs -fКогда бот готов, в журнале появится Telegram bot @yourbot is running.
Попробуйте
Откройте своего бота в Telegram, отправьте /start, один раз примите правила и отправьте /pic a cozy cabin in the snow. Модель изображений по умолчанию стоит около $0.01 за изображение.
Чтобы обновить бота позже, выполните git pull && docker compose up -d --build.
Развёртывание на Railway
Railway может запускать бота без собственного сервера. Шаблона в один клик нет: вы развёртываете из собственной копии репозитория.
Сделайте форк репозитория
Сделайте форк github.com/spicyapi-ai/spicyapi-bot в свой аккаунт GitHub.
Создайте проект
В Railway выберите New Project > Deploy from GitHub repo и укажите свой форк. Railway найдёт Dockerfile и соберёт образ.
Добавьте переменные
Откройте вкладку Variables сервиса и добавьте SPICY_API_KEY, TELEGRAM_BOT_TOKEN и OWNER_ID, а также любые другие настройки из .env.example.
Подключите том
Щёлкните сервис правой кнопкой, выберите Attach volume и укажите путь монтирования /data. Без тома при каждом повторном развёртывании забываются сегодняшние расходы и настройки всех пользователей.
Разверните
Запустите развёртывание и проверьте в журнале появление Telegram bot @yourbot is running.
Держите сервис в одной реплике: две копии, опрашивающие один и тот же токен Telegram, мешают друг другу получать обновления. Боту не нужны ни публичный домен, ни открытый порт.
Добавьте Discord (необязательно)
Создайте приложение
В Discord Developer Portal создайте приложение, откройте Bot, сбросьте и скопируйте токен и выключите Public Bot, чтобы добавлять бота на серверы могли только вы. Привилегированные intents не нужны.
Пригласите его на свой сервер
В OAuth2 > URL Generator отметьте scopes bot и applications.commands и разрешения Send Messages, Attach Files, Embed Links и Read Message History. Откройте сгенерированную ссылку и добавьте бота на свой сервер.
Настройте
В .env задайте:
DISCORD_TOKEN— токен бота.DISCORD_GUILD_ID— ID вашего сервера, если хотите, чтобы команды появились мгновенно, а не после недолгого глобального развёртывания.OWNER_IDтак, чтобы он включал ваш Discord user ID, напримерOWNER_ID=tg:123,dc:456. Префиксыtg:иdc:привязывают ID к одной платформе.ALLOWED_CHAT_IDS— ID канала или сервера, где бот должен отвечать.
Чтобы найти ID, включите режим разработчика (User Settings > Advanced), затем щёлкните правой кнопкой пользователя, канал или сервер и выберите Copy ID. Перезапустите бота.
Пометьте канал как возрастной
Изображения и видео работают только в каналах с возрастным ограничением: Edit Channel > Overview > Age-Restricted Channel. Команды /pic и /vid зарегистрированы как возрастные, поэтому Discord показывает их только там.
Чат (/talk или упоминание бота) работает в любом разрешённом канале, если только вы не задали DISCORD_CHAT_REQUIRES_NSFW=true, который ограничивает чат тоже каналами с возрастным ограничением.
Discord не допускает в свой App Directory приложения с возрастными командами, поэтому оставьте бота приватным. В .env.example есть также DISCORD_MEDIA_IN_DMS, по умолчанию false: изображения и видео тогда работают только в каналах серверов с возрастным ограничением, но не в личных сообщениях.
Кто может им пользоваться
| Настройка | По умолчанию | Эффект |
|---|---|---|
OWNER_ID | обязательно | Вы. Всегда разрешены, на вас не действует суточный лимит на человека, и только вы видите баланс аккаунта. Несколько ID разделяйте запятыми. |
ALLOWED_USER_IDS | пусто | Другие люди, которым разрешены личные чаты. Пусто означает, что только вы. |
ALLOWED_CHAT_IDS | пусто | Группы (Telegram) или каналы и серверы (Discord), где бот отвечает. Пусто означает, что ни в каких группах. |
REQUIRE_CONSENT | true | Каждый один раз подтверждает, что ему есть 18 лет и что он будет соблюдать правила содержимого. |
Посторонним, нашедшим бота, сообщается, что он приватный, и выдаётся их user ID, чтобы они прислали его вам. Группы игнорируются, пока их нет в ALLOWED_CHAT_IDS; после добавления группы бота может использовать каждый её участник в пределах суточных лимитов. ID групп Telegram отрицательные, например -1001234567890.
Не задавайте ALLOWED_USER_IDS=*
ALLOWED_USER_IDS=* делает бота публичным и позволяет любому, кто его найдёт, тратить ваш баланс. Используйте это, только если вы действительно этого хотите.
Этого бота запускаете вы, и вы отвечаете за то, кому разрешаете им пользоваться. Действуют условия SpicyAPI, включая перечень регионов, которые SpicyAPI не обслуживает.
Как расходуются деньги
- Сначала цена. Каждое изображение или видео оценивается SpicyAPI до того, как что-либо произойдёт. Расчёты бесплатны.
- Жёсткий потолок. Если запрос может стоить больше
MAX_COST_PER_REQUEST_USD(по умолчанию $1), он отклоняется. Ничего не списывается. - Подтверждение. Если запрос может стоить больше
CONFIRM_ABOVE_USD(по умолчанию $0.10), бот показывает цену с кнопками Confirm и Cancel. Подтвердить может только тот, кто сделал запрос. - Суточные лимиты. Каждый человек может потратить
USER_DAILY_BUDGET_USD(по умолчанию $1) за сутки по UTC, а весь бот —DAILY_BUDGET_USD(по умолчанию $5). Генерации, которые ещё выполняются, считаются потраченными до их завершения, поэтому несколько одновременных запросов не смогут проскочить лимит. На владельцев действует только лимит всего бота. - Никаких двойных списаний. Каждый запрос несёт ключ идемпотентности, полученный из сообщения чата или нажатия кнопки, поэтому дублированное обновление Telegram или двойное нажатие возвращает уже существующую задачу.
- Результаты. Ход выполнения показывается правкой одного сообщения раз в несколько секунд. Результат показывает фактическое списание и идентификатор задачи, который можно найти в разделе Logs в консоли.
Принятую генерацию нельзя отменить. Успешные запуски оплачиваются, а при обычном сбое резерв освобождается. Некоторые отказы по содержимому оплачиваются только тогда, когда это прямо указано на странице модели. См. Оплата.
Используйте ключ с лимитом
Бот ведёт собственный журнал учёта в DATA_DIR/state.json. Если этот файл потерян, бот забывает, сколько потрачено сегодня. Лимит на API-ключе в консоли — это ограничение, которое потерять нельзя, потому что его обеспечивает SpicyAPI. Создайте для бота отдельный ключ, задайте суточный лимит расходов и при желании разрешите только нужные модели. Когда лимит достигнут, бот сообщит, что ключ достиг лимита расходов.
Другие полезные настройки:
| Настройка | По умолчанию | Что делает |
|---|---|---|
MAX_CONCURRENT_TASKS_PER_USER | 2 | Сколько изображений и видео один человек может выполнять одновременно |
VIDEO_SECONDS / VIDEO_RESOLUTION | 5 / 480p | Длительность и размер видео, подгоняемые под допустимое для каждой модели. Короче и ниже — дешевле |
ALLOWED_MODELS | пусто | Ограничивает меню /models. Точные идентификаторы или префиксы, оканчивающиеся на *, например alibaba/* |
Модели и цены
Каждый человек может менять свои модели командой /models. Значения по умолчанию задаёт оператор:
| Переменная | По умолчанию | Стоимость на момент написания |
|---|---|---|
DEFAULT_IMAGE_MODEL | Z-Image Turbo, текст в изображение | Около $0.01 за изображение |
DEFAULT_VIDEO_MODEL | MiniMax H3, текст в видео | Около $0.037 за секунду в 768p |
DEFAULT_ANIMATE_MODEL | MiniMax H3, изображение в видео | Около $0.037 за секунду в 768p |
DEFAULT_CHAT_MODEL | DeepSeek V4.1 Flash | Любая чат-модель из каталога |
Точные идентификаторы моделей указаны в .env.example; чтобы переключиться, скопируйте другой идентификатор из актуального каталога (GET /api/v1/models; в примере персонажа ниже MODEL_ID_FROM_CATALOG отмечает место для такого идентификатора). Цены взяты из публичного каталога и могут меняться; бот всегда показывает актуальный расчёт. Просмотреть модели можно на spicyapi.ai/models или в разделе Модели. Для ролевых игр выбрать чат-модель поможет рейтинг для ролевых игр.
Персонажи
Персонажи хранятся в JSON-файле (CHARACTERS_FILE, по умолчанию characters/default.json, в котором два примера персонажей):
{
"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— инструкции персонажа.greeting(необязательно) — его первая реплика.model(необязательно) закрепляет за этим персонажем чат-модель.{{char}}и{{user}}заменяются на имя персонажа и имя человека.- Записи могут быть и в формате Character Card V2 JSON, который экспортируют большинство сайтов с персонажами и SillyTavern. Используются описание, характер, сценарий, пример диалога и первое сообщение.
В Docker смонтируйте свой файл и укажите его в настройке. В docker-compose.yml:
volumes:
- ./my-characters.json:/app/characters/custom.json:roИ в .env:
CHARACTERS_FILE=characters/custom.jsonБот помнит HISTORY_TURNS обменов репликами в каждом разговоре (по умолчанию 20) и ограничивает ответы CHAT_MAX_TOKENS токенами (по умолчанию 2048). Модели с рассуждением считают свои размышления в этот лимит, поэтому слишком маленькое значение может не оставить места для ответа. О том, как писать персонажей, см. Рецепты чата.
Загрузка фото по умолчанию выключена
По умолчанию оживлять можно только изображения, созданные самим ботом. Превращение фотографий реальных людей в видео — главный способ злоупотребления такими ботами, а человек на фото не соглашался появляться в вашем видео.
Если вы зададите ALLOW_PHOTO_UPLOADS=true, любой, кому вы разрешили, сможет оживить отправленное фото. Включайте это только для людей, которым доверяете, и только для фотографий совершеннолетних, давших согласие. Когда это включено, загруженные изображения скачиваются ботом и хранятся в SpicyAPI. Ссылки на файлы Telegram никогда не передаются дальше, потому что в них содержится токен вашего бота.
Конфиденциальность: что где хранится
| Что | Где | Как долго |
|---|---|---|
| Суточные суммы расходов, выбор модели и персонажа каждым человеком, кто принял правила | state.json в DATA_DIR (том в Docker) | Пока вы его не удалите |
| История чата | Только в памяти | Забывается при перезапуске, после суток бездействия или командой /newchat |
| Журналы бота | Ваша машина | Только идентификаторы задач и суммы, но никогда не промпты и не медиа |
| Промпты и результаты | SpicyAPI | Срок хранения вашего аккаунта; см. Хранение и удаление данных |
Задайте RETENTION_SECONDS, чтобы попросить SpicyAPI удалять результаты и промпты раньше срока по умолчанию для вашего аккаунта.
В группах результаты скрываются под спойлером (SPOILER_MEDIA, по умолчанию groups; другие значения — always и never). /report пересылает сообщение владельцу. О содержимом, нарушающем правила SpicyAPI, можно также сообщить на spicyapi.ai/abuse.
Устранение неполадок
| Сообщение или симптом | Что делать |
|---|---|
«out of balance» (40201) | Пополните баланс SpicyAPI. |
«reached the spend cap» (40202) | Достигнут лимит ключа в консоли. Увеличьте его или подождите. |
«not allowed to use that model» (40301) | Разрешите модель для ключа в консоли или выберите другую командой /models. |
«has not verified its email» (40310) | Перейдите по ссылке подтверждения от SpicyAPI. |
| «The model declined this request» | Эта модель отклонила промпт. Измените запрос или выберите другую модель. Проверьте условия оплаты отказов на странице модели. |
Conflict: terminated by other getUpdates request | Две копии бота используют один токен. Остановите одну. |
| Команды Discord не видны | /pic и /vid показываются только в каналах с возрастным ограничением. Глобальным командам может потребоваться время, чтобы появиться; задайте DISCORD_GUILD_ID для мгновенной регистрации. |
| Сетевые ошибки за прокси | fetch в Node игнорирует HTTPS_PROXY, если бот не запущен с NODE_USE_ENV_PROXY=1. |
| Бот отвечает числом, когда вы ему пишете | Это ваш user ID. Впишите его в OWNER_ID и перезапустите. |
Коды ошибок описаны в разделе Ошибки и повторы.
Приложения для ролевых игр
Подключите текстовые модели SpicyAPI к RisuAI, Agnai, Chub, KoboldAI Lite и Janitor AI. Точные поля для каждого приложения, какие модели подходят для ролевых игр, как работать с моделями с рассуждением и как ограничить расходы.
n8n
Используйте модели SpicyAPI для изображений, видео, звука и чата в рабочих процессах n8n. Установите community-узел, импортируйте шаблоны HTTP Request или направьте учётные данные OpenAI в n8n на SpicyAPI для узлов AI Agent.

