RU ▾

chatbotnsfw.comAPI LLM uncensored для разработчиков

NSFW Chatbot API для разработчиков: как создать один

API NSFW-чат-бота для разработчиков — это обычный чат-эндпоинт, работающий на модели, которая не отказывает в законном контенте для взрослых. Эндпоинт — это простая часть. Персона, память, возрастная проверка и модерация вокруг неё — то, что вы строите сами.

Последнее обновление:

Изометрическая сцена с светящимися чат-пузырями, проходящими через врата над серверной стойкой

Итоги

  1. API заменяет отказывающуюся модель на ту, что отвечает на произведения для взрослых; всё, что касается продукта, остаётся у вас.
  2. Храните ключ на своём сервере, храните историю самостоятельно и отправляйте обрезанное контекстное окно при каждом запросе.
  3. Открывайте доступ только взрослым перед любым вызовом чата и устанавливайте жесткий блок на контент с участием несовершеннолетних.
  4. Потоковая передача, повторные попытки при 429 и лимит на пользователя поддерживают стабильность небольшого бота при 8 параллельных запросах.

Что даёт API, а что остаётся вашей собственностью

Сервис представляет собой размещённый текстовый API, совместимый с OpenAI. Вы указываете OpenAI SDK на https://api.chatbotnsfw.com/v1, используете идентификатор модели uncensored и отправляете обычные сообщения чата. Модель — это модель с открытыми весами, настроенная на ответы без отказов в контенте для законного использования для взрослых. Только текст: нет изображений, аудио или видео.

Это весь контракт. API не знает, кто ваш пользователь, сколько ему лет или что разрешает ваша платформа. Он также ничего не запоминает между вызовами. Каждый запрос должен содержать полную историю разговора, которую вы хотите показать модели.

ВопросКто за это отвечает
Генерация ответов без отказов в контентеAPI
Персонаж, тон и правила историиВы, в системном промпте
Память разговораВы, в вашей базе данных
Проверка возраста и согласиеВы
Блокировка контента с участием несовершеннолетнихВы, и у API тот же строгий лимит
Жалобы, баны, условия использованияВы

Если вы ещё не работали с API чат-ботов, документация API описывает формат запроса. Существующее руководство по интеграции NSFW LLM более подробно рассматривает сторону интеграции; эта статья посвящена продукту вокруг неё.

Архитектура: храните ключ на сервере

Ваш фронтенд никогда не должен хранить API-ключ. Разместите небольшой бэкенд между браузером или приложением и API. Бэкенд аутентифицирует вашего пользователя, проверяет прохождение возрастной проверки, загружает его историю, вызывает API и сохраняет ответ.

  1. Браузер отправляет сообщение пользователя вашему бэкенду с его сессией.
  2. Бэкенд проверяет, что пользователь подтвердил свой возраст и находится в пределах лимита запросов.
  3. Бэкенд формирует список сообщений: системный промпт, память, недавние реплики, новое сообщение.
  4. Бэкенд вызывает POST /v1/chat/completions и потоково передает токены обратно.
  5. Бэкенд сохраняет новую реплику после завершения потоковой передачи.

Полный ключ позволяет выполнять 8 параллельных запросов и 300 запросов в минуту. Этого достаточно для хобби-бота и это честное начало для небольшого продукта, при условии, что ваш бэкенд не позволяет одному пользователю открывать много потоков одновременно. Запрос с потоковой передачей занимает слот параллельности до тех пор, пока поток не завершится, поэтому пользователь, который уходит от открытого потока, всё равно занимает у вас слот.

Напишите персонаж как контракт

Системный промпт выполняет большую часть работы продукта. Хороший промпт читается как короткий контракт с моделью, а не как абзац прилагательных. Охватите четыре вещи: кто персонаж, как он говорит, в чём история и что выходит за рамки.

import os
from openai import OpenAI

client = OpenAI(
    base_url="https://api.chatbotnsfw.com/v1",
    api_key=os.environ["NSFW_API_KEY"],
)

PERSONA = """You play Mara, a 34-year-old ship's navigator in a slow-burn
space romance. All characters are adults.
Voice: dry, warm, short paragraphs, first person.
Story rules: keep continuity with the notes below; never speak for the user;
stay in character unless the user writes OOC: in brackets.
Hard limits: no sexual content involving anyone under 18, ever. If the user
steers there, refuse in character and change the scene."""

def reply(history, user_text):
    messages = [{"role": "system", "content": PERSONA}]
    messages += history[-24:]
    messages.append({"role": "user", "content": user_text})
    r = client.chat.completions.create(
        model="uncensored",
        messages=messages,
        temperature=0.9,
        top_p=0.95,
    )
    return r.choices[0].message.content

Два момента важнее, чем кажется. Укажите, что все персонажи — взрослые, простыми словами, в промпте. И скажите модели, что делать на границе, например, сменить сцену, чтобы история продолжалась, а не заканчивалась сообщением об ошибке. Повысьте temperature для более живого текста и понизьте, если персонаж уходит в сторону.

Протестируйте персонажа перед запуском

Прогоните те же двадцать сообщений пользователя через промпт после каждого редактирования, включая неловкие: пользователь, который просит бота выйти из роли, тот, кто меняет обстановку посреди сцены, тот, кто толкает к правилу о несовершеннолетних. Сохраните выводы и прочитайте их. Изменения промпта, исправляющие один случай, часто ломают другой.

Память, которая помещается в контекстное окно

Контекстное окно составляет 100 000 токенов, промпт плюс завершение, так что есть место для длинной истории. Больше — не всегда лучше. Вы платите за каждый входной токен на каждом шаге, и модель с огромной историей всё равно может потерять ранние детали.

Практичная структура имеет три слоя. Системный промпт содержит персону. Краткий блок заметок содержит факты, которые должны сохраниться: имена, состояние отношений, обещания, данные в истории. Последние 20–30 реплик идут дословно. Старые реплики суммируются в блок заметок дешёвым вызовом каждые 20 шагов или около того.

Код выше уже разрезает history[-24:], что сохраняет последние 24 сообщения. Добавьте блок заметок как второе системное сообщение, если оно у вас есть. Затраты остаются низкими таким образом: типичный шаг отправляет несколько тысяч входных токенов, что при $0,15 за 1 млн входных токенов составляет долю цента. На странице цен есть цифры, а статья о интеграции показывает формы запросов.

Продукту для взрослых нужна возрастная проверка перед первым вызовом чата, а не после. API не проверяет возраст. Эта обязанность лежит на вас, и правильный метод зависит от того, где вы работаете и где живут ваши пользователи.

  • Чекбокс, который говорит Мне больше 18 — это уведомление, а не проверка. В некоторых юрисдикциях требуется больше.
  • Храните результат на стороне сервера, привязанный к аккаунту, и проверяйте его при каждом запросе чата, а не только при регистрации.
  • Сделайте ясно, что продукт только для взрослых, на целевой странице и в условиях, до регистрации.
  • Держите вымышленных персонажей взрослыми в каждом персонаже, в промпте и в карточке, показываемой пользователям.

Спросите юриста, который знает ваш рынок, каков минимум. Эта статья не может вам сказать, и поставщик API не может решить это за вас.

Обязанности модерации, которые остаются на вас

Модель без цензуры меняет то, в чём модель отказывает. Она не меняет то, за что вы несёте ответственность. Планируйте это с первого дня:

  • Жёсткий запрет на несовершеннолетних. Сексуальный контент с участием несовершеннолетних запрещён. Добавьте собственную проверку ввода для очевидных попыток и завершите сессию при срабатывании.
  • Жалобы. Дайте пользователям способ отметить разговор и решите, что вы делаете с жалобой.
  • Действия с аккаунтом. Имейте возможность быстро приостановить пользователя.
  • Данные. Решите, как долго вы храните транскрипты и укажите это на странице конфиденциальности. Поставщик API не использует промпты для обучения, но ваша собственная база данных — ваша ответственность.
  • Область применения. Сохраните продукт в рамках законного использования взрослыми и вымыслом. Укажите это в ваших условиях.

Неудачные или отклонённые запросы не оплачиваются, что означает, что запрос, заблокированный вашей собственной проверкой, также ничего не стоит, так как он никогда не достигает API.

Лимиты на пользователя и контроль расходов

Открытый чат без ограничений — это приглашение для одного пользователя исчерпать ваш баланс. Установите дневной лимит токенов для каждого аккаунта и проверяйте его перед вызовом API. Ответ содержит информацию о том, сколько токенов использовал каждый ход, поэтому лимит требует лишь одного счётчика.

import os
from openai import OpenAI

client = OpenAI(
    base_url="https://api.chatbotnsfw.com/v1",
    api_key=os.environ["NSFW_API_KEY"],
)

DAILY_CAP = 400_000   # tokens per user per day
used_today = {}       # user_id -> tokens, keep this in your database

def guarded_reply(user_id, messages):
    if used_today.get(user_id, 0) >= DAILY_CAP:
        return "You have reached today's limit. Come back tomorrow."
    r = client.chat.completions.create(model="uncensored", messages=messages)
    used = r.usage.prompt_tokens + r.usage.completion_tokens
    used_today[user_id] = used_today.get(user_id, 0) + used
    return r.choices[0].message.content

Лимит в 400 000 токенов — это число для настройки, а не рекомендация. С промптом в 6 000 токенов на шаг это позволяет примерно 65 шагов в день. Определите, сколько стоит пользователь для вас, установите лимит с учётом этого и следите за заголовком X-Balance-USD в своём мониторинге, чтобы баг не сжёг кредит за ночь.

Храните отдельный небольшой баланс для тестовой среды. Тестовый трафик и реальный трафик никогда не должны использовать один ключ, потому что цикл тестирования, который повторяет запросы при каждой ошибке, может потратить больше за час, чем неделя реальных пользователей.

Потоковая передача и обработка 429

Чат кажется медленным без потоковой передачи. Установите stream: true и передавайте фрагменты в браузер. Потоковая передача также завершается блоком использования, который вы можете логировать для отслеживания затрат.

При превышении лимита API возвращает HTTP 429. Код ошибки rate_limited для запросов в минуту и concurrency для одновременных запросов. Временная перегрузка также возвращает 429 с заголовком Retry-After: 5. Соблюдайте этот заголовок.

import os, time
from openai import OpenAI, RateLimitError

client = OpenAI(
    base_url="https://api.chatbotnsfw.com/v1",
    api_key=os.environ["NSFW_API_KEY"],
    max_retries=0,
)

def stream_reply(messages):
    for attempt in range(4):
        try:
            stream = client.chat.completions.create(
                model="uncensored",
                messages=messages,
                stream=True,
            )
            for chunk in stream:
                if chunk.choices and chunk.choices[0].delta.content:
                    yield chunk.choices[0].delta.content
            return
        except RateLimitError:
            time.sleep(5)
    yield "The service is busy. Please try again in a moment."

Добавьте блокировку на пользователя, чтобы один аккаунт удерживал один поток одновременно. Тогда 8 одновременных запросов поддерживают примерно 8 одновременных пользователей чата, а очередь поглощает остальные.

Для начала получите API-ключ. Новые пользователи могут получить $0,50 пробного баланса одним нажатием на странице ключа. Пробный ключ ограничен 2 параллельными запросами и 60 запросами в минуту, чего достаточно для проверки работы.

Часто задаваемые вопросы

Существует ли официальный API NSFW-чатбота от крупных поставщиков ИИ?

Этот сервис не является официальным API какого-либо поставщика моделей. Он использует одну модель с открытыми весами, запущенную независимым провайдером и настроенную на ответы без отказов по контенту для законного использования взрослыми.

Проверяет ли API, что мои пользователи являются взрослыми?

Нет. Проверка возраста, согласие и ваши условия использования — ваша задача как разработчика. API устанавливает строгий запрет на сексуальный контент с участием несовершеннолетних.

Может ли он генерировать изображения для моего чат-бота?

Нет. Это только текст. Нет генерации изображений, аудио или видео, нет векторных представлений и нет дообучения.

Как сохранить согласованность персонажа в течение долгого чата?

Сохраните персону в системном промпте, краткий блок заметок с ключевыми фактами и последние 20–30 реплик дословно. Старые реплики суммируйте в заметки.

Как оплатить?

Пополните баланс от $20 до $500 только криптовалютой (USDT в сети TRC20 или USDC в сети Base). Баланс не сгорает, подписки нет.

Получите API-ключ сейчас

Зарегистрируйтесь, получите ключ и обновите базовый URL. Вот и всё.