spicyapiДокументация
Приложения и плагины
Основное содержимое

Бот для Telegram и Discord

Запустите собственного приватного бота, который создаёт изображения и видео, оживляет картинки и общается с заданными вами персонажами. Оплата с баланса SpicyAPI, лимиты расходов проверяются перед каждым списанием.

Бот SpicyAPI — это небольшая программа, которую вы запускаете сами. Она подключается к Telegram (и, если хотите, к Discord) и позволяет тем, кому вы разрешили, создавать изображения, делать видео, превращать изображения в видео и общаться с заданными вами персонажами. Всё оплачивается с вашего баланса SpicyAPI, а цена каждого запроса рассчитывается до любого списания.

Бот бесплатный и с открытым исходным кодом (MIT): github.com/spicyapi-ai/spicyapi-bot. По умолчанию он приватный: им можете пользоваться только вы, пока не разрешите другим людям или группам.

Коротко

  1. В консоли создайте API-ключ специально для бота и задайте ему суточный лимит расходов.
  2. В Telegram напишите @BotFather, отправьте /newbot и скопируйте токен.
  3. Клонируйте репозиторий, скопируйте .env.example в .env, заполните SPICY_API_KEY, TELEGRAM_BOT_TOKEN и OWNER_ID, затем выполните docker compose up -d --build.
  4. Откройте своего бота в 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_CONSENTtrueКаждый один раз подтверждает, что ему есть 18 лет и что он будет соблюдать правила содержимого.

Посторонним, нашедшим бота, сообщается, что он приватный, и выдаётся их user ID, чтобы они прислали его вам. Группы игнорируются, пока их нет в ALLOWED_CHAT_IDS; после добавления группы бота может использовать каждый её участник в пределах суточных лимитов. ID групп Telegram отрицательные, например -1001234567890.

Не задавайте ALLOWED_USER_IDS=*

ALLOWED_USER_IDS=* делает бота публичным и позволяет любому, кто его найдёт, тратить ваш баланс. Используйте это, только если вы действительно этого хотите.

Этого бота запускаете вы, и вы отвечаете за то, кому разрешаете им пользоваться. Действуют условия SpicyAPI, включая перечень регионов, которые SpicyAPI не обслуживает.

Как расходуются деньги

  1. Сначала цена. Каждое изображение или видео оценивается SpicyAPI до того, как что-либо произойдёт. Расчёты бесплатны.
  2. Жёсткий потолок. Если запрос может стоить больше MAX_COST_PER_REQUEST_USD (по умолчанию $1), он отклоняется. Ничего не списывается.
  3. Подтверждение. Если запрос может стоить больше CONFIRM_ABOVE_USD (по умолчанию $0.10), бот показывает цену с кнопками Confirm и Cancel. Подтвердить может только тот, кто сделал запрос.
  4. Суточные лимиты. Каждый человек может потратить USER_DAILY_BUDGET_USD (по умолчанию $1) за сутки по UTC, а весь бот — DAILY_BUDGET_USD (по умолчанию $5). Генерации, которые ещё выполняются, считаются потраченными до их завершения, поэтому несколько одновременных запросов не смогут проскочить лимит. На владельцев действует только лимит всего бота.
  5. Никаких двойных списаний. Каждый запрос несёт ключ идемпотентности, полученный из сообщения чата или нажатия кнопки, поэтому дублированное обновление Telegram или двойное нажатие возвращает уже существующую задачу.
  6. Результаты. Ход выполнения показывается правкой одного сообщения раз в несколько секунд. Результат показывает фактическое списание и идентификатор задачи, который можно найти в разделе Logs в консоли.

Принятую генерацию нельзя отменить. Успешные запуски оплачиваются, а при обычном сбое резерв освобождается. Некоторые отказы по содержимому оплачиваются только тогда, когда это прямо указано на странице модели. См. Оплата.

Используйте ключ с лимитом

Бот ведёт собственный журнал учёта в DATA_DIR/state.json. Если этот файл потерян, бот забывает, сколько потрачено сегодня. Лимит на API-ключе в консоли — это ограничение, которое потерять нельзя, потому что его обеспечивает SpicyAPI. Создайте для бота отдельный ключ, задайте суточный лимит расходов и при желании разрешите только нужные модели. Когда лимит достигнут, бот сообщит, что ключ достиг лимита расходов.

Другие полезные настройки:

НастройкаПо умолчаниюЧто делает
MAX_CONCURRENT_TASKS_PER_USER2Сколько изображений и видео один человек может выполнять одновременно
VIDEO_SECONDS / VIDEO_RESOLUTION5 / 480pДлительность и размер видео, подгоняемые под допустимое для каждой модели. Короче и ниже — дешевле
ALLOWED_MODELSпустоОграничивает меню /models. Точные идентификаторы или префиксы, оканчивающиеся на *, например alibaba/*

Модели и цены

Каждый человек может менять свои модели командой /models. Значения по умолчанию задаёт оператор:

ПеременнаяПо умолчаниюСтоимость на момент написания
DEFAULT_IMAGE_MODELZ-Image Turbo, текст в изображениеОколо $0.01 за изображение
DEFAULT_VIDEO_MODELMiniMax H3, текст в видеоОколо $0.037 за секунду в 768p
DEFAULT_ANIMATE_MODELMiniMax H3, изображение в видеоОколо $0.037 за секунду в 768p
DEFAULT_CHAT_MODELDeepSeek 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 и перезапустите.

Коды ошибок описаны в разделе Ошибки и повторы.

На этой странице