Otwarty bot Discord z LLM bez cenzury
Otwarty bot Discord rozmawiający przez LLM to około osiemdziesiąt linii kodu Python. Ten przewodnik dostarcza kod, limity, które musisz respektować, oraz koszt odpowiedzi, korzystając z API kompatybilnego z OpenAI i modelu bez cenzury, który nie odrzuca prawnych zapytań od dorosłych.

Kluczowe punkty
- discord.py oraz OpenAI SDK wystarczą; wskaż SDK na https://api.openrouternsfw.com/v1 i używaj modelu uncensored.
- Włącz uprawnienie Message Content w portalu deweloperskim Discord, inaczej bot będzie widział puste wiadomości.
- Użyj semafora poniżej 8, aby mieścić się w limicie równoległych zapytań i trzymać treści dla dorosłych na kanałach oznaczonych jako wiekowo ograniczone.
- Odpowiedź z 1500 tokenami wejściowymi i 300 wyjściowymi kosztuje $0,000375, czyli około $3,75 za 10 000 odpowiedzi.
Nie potrzeba karty. Po rejestracji zdobądź $0,50 darmowego kredytu próbnego jednym kliknięciem (raz na osobę).
Pobierz klucz APICo budujesz
Poniższy bot odpowiada, gdy ktoś go wspomni. Przechowuje krótką historię na kanał, wysyła ją do endpointu uzupełniania czatu i publikuje odpowiedź. To czysty Python, licencja MIT, bez bazy danych. Możesz przeczytać cały kod na raz, co jest celem projektu open source: ktoś inny może go forkować i zrozumieć.
Modelem napędzającym jest pojedynczy model tekstowy o otwartych wagach, uruchamiany przez niezależnego dostawcę i dostrojony do odpowiadania bez odmów treści dla legalnego użytku przez osoby dorosłe. Pasuje to do społeczności Discord zbudowanych wokół fikcji, roleplay lub rozmów dla dorosłych. Obowiązują od razu dwie zasady. Po pierwsze, treści seksualne z udziałem nieletnich są zabronione przez API i nie mogą być częścią projektu Twojego bota. Po drugie, Discord ma własne zasady i ustawienia kanałów wiekowo ograniczonych, a Ty jesteś odpowiedzialny za ich przestrzeganie. Trzymaj treści dla dorosłych w kanałach oznaczonych jako takie i w serwerach, gdzie członkowie są dorośli.
Konfiguracja Discord i kluczy
- Otwórz portal deweloperski Discord i utwórz aplikację, a następnie dodaj do niej bota.
- W ustawieniach bota włącz Intencję Treści Wiadomości. Bez niej bot otrzymuje wiadomości z pustym tekstem.
- Skopiuj token bota. Traktuj go jak hasło.
- Użyj generatora URL OAuth2, aby zaprosić bota z uprawnieniami do odczytu i wysyłania wiadomości na wybranych kanałach.
- Uzyskaj klucz API ze strony kluczy. Nowi użytkownicy mogą jednym kliknięciem odebrać $0.50 kredytu próbnego bez podawania danych płatności, ważny przez 7 dni.
Przechowuj obie tajemnice jako zmienne środowiskowe, nigdy w repozytorium. Dla projektu open source ma to większe znaczenie niż zwykle, ponieważ kod jest publiczny.
pip install discord.py openai python-dotenv
printf 'DISCORD_TOKEN=your-discord-token
API_KEY=your-api-key
' > .env
echo ".env" >> .gitignore
Kod bota
Zapisz to jako bot.py. Komentarze wyjaśniają decyzje, które nie są oczywiste.
import asyncio
import os
from collections import defaultdict, deque
import discord
from dotenv import load_dotenv
from openai import AsyncOpenAI
load_dotenv()
ai = AsyncOpenAI(
base_url="https://api.openrouternsfw.com/v1",
api_key=os.environ["API_KEY"],
max_retries=4, # the SDK retries 429 and honors Retry-After
)
SYSTEM = (
"You are Vex, a sharp-tongued storyteller in a Discord server for adults. "
"Stay in character, keep replies under 150 words, and never write "
"anything sexual involving minors."
)
intents = discord.Intents.default()
intents.message_content = True
bot = discord.Client(intents=intents)
slots = asyncio.Semaphore(6) # stay under 8 concurrent
history = defaultdict(lambda: deque(maxlen=12)) # last 12 turns per channel
async def ask(channel_id, user_text):
turns = history[channel_id]
turns.append({"role": "user", "content": user_text})
messages = [{"role": "system", "content": SYSTEM}] + list(turns)
async with slots:
resp = await ai.chat.completions.create(
model="uncensored",
messages=messages,
temperature=0.9,
max_tokens=400,
)
reply = resp.choices[0].message.content or ""
turns.append({"role": "assistant", "content": reply})
return reply
@bot.event
async def on_ready():
print(f"Logged in as {bot.user}")
@bot.event
async def on_message(message):
if message.author.bot or bot.user not in message.mentions:
return
text = message.clean_content.replace(f"@{bot.user.display_name}", "").strip()
if not text:
return
async with message.channel.typing():
try:
reply = await ask(message.channel.id, f"{message.author.display_name}: {text}")
except Exception as exc:
print("API error:", exc)
await message.reply("The model is busy. Try again in a few seconds.")
return
for i in range(0, len(reply), 1900): # Discord caps messages at 2000 chars
await message.reply(reply[i:i + 1900])
bot.run(os.environ["DISCORD_TOKEN"])
Uruchom go poleceniem python bot.py, a następnie wspomnij bota na kanale, który może odczytywać. Pierwsza odpowiedź powinna nadejść w ciągu kilku sekund.
Jeśli nic się nie dzieje, sprawdź trzy rzeczy po kolei. Bot musi być online na liście członków, więc token jest ważny. Musi mieć uprawnienia do odczytu i wysyłania wiadomości na tym kanale. I wzmianka musi być prawdziwą wzmianką na Discordzie, wybraną z listy autouzupełniania, ponieważ zwykły tekst z nazwą bota nie pojawia się w message.mentions. Terminal wypisuje błędy API, więc nieprawidłowy klucz pojawi się tam jako błąd uwierzytelniania.
Dlaczego kod ma taką strukturę
Historia jest celowo krótka
Okno kontekstu ma 100 000 tokenów, więc możesz wysłać dużo. Ale każdy token wejściowy jest rozliczany przy każdym zapytaniu, a czat Discord to głównie krótkie linie. Dwanaście zwrotów utrzymuje spójność odpowiedzi, nie zamieniając każdej wiadomości w duży koszt. Zwiększ maxlen dla kanałów fabularnych, gdzie liczy się ciągłość.
Semafor chroni twój klucz
Pełny klucz pozwala na 8 równoległych zapytań i 300 zapytań na minutę. Klucz próbny pozwala tylko na 2 i 60. Jeśli dziesięć osób wspomni bota naraz i wyślesz dziesięć zapytań, dodatkowe otrzymają HTTP 429 z kodem błędu concurrency. Semafor kolejkuje je w Twoim własnym procesie. Ustaw go na 2, gdy jesteś na kluczu próbnym. Jeśli kiedykolwiek włączysz strumieniowanie, pamiętaj, że zapytanie strumieniowe trzyma swój slot do zakończenia strumienia.
Ponowne próby pochodzą z SDK
OpenAI Python SDK ponawia zapytania przy kodzie 429 i respektuje nagłówek Retry-After, który usługa zwraca jako Retry-After: 5 przy tymczasowym przeciążeniu. Ustawienie max_retries na 4 pokrywa krótkotrwałe szczyty. Nieudane lub odrzucone zapytania nie są rozliczane, więc ponawianie nie kosztuje tokenów, gdy zapytanie się nie powiedzie.
Wspólna osobowość
Prompt systemowy znajduje się na początku każdego wywołania. Osobowości na kanał to małe rozszerzenie: utrzymuj słownik od ID kanału do promptu i szukaj go w ask.
Stwórz dobry projekt open source
Kod działa, ale publiczne repozytorium potrzebuje kilku dodatków, zanim obcy mogą go użyć.
- Licencja. MIT lub Apache 2.0 to zwykłe wybory dla małych botów. Dodaj plik w katalogu głównym repozytorium.
- .env.example. Wymień
DISCORD_TOKENiAPI_KEYz fałszywymi wartościami, aby ludzie wiedzieli, co ustawić. - Konfigurowalny adres URL bazowy. Odczytuj
BASE_URLiMODELze środowiska, domyślnie do wartości powyżej. Każdy, kto go forkuje, może wtedy użyć dowolnego serwera kompatybilnego z OpenAI. - Dockerfile. Krótki plik oparty na obrazie Python slim, kopiujący
bot.py, instalujący trzy pakiety i uruchamiający skrypt, pozwala hostować go gdziekolwiek. - README z ostrzeżeniem o intentach. Brakujący intent Treści Wiadomości to najczęstsze pytanie o wsparcie dla każdego bota Discord.
Trzymaj swój token i klucz z dala od historii Git. Jeśli wycieknie, odwołaj go w portalu Discord lub na stronie kluczy API i wygeneruj nowy.
Hosting i koszty
Bot to pojedynczy długotrwały proces z lekkim użyciem CPU. Mały VPS, wolna maszyna lub platforma kontenerowa wystarczą. Nie ma serwera WWW do wystawienia, ponieważ bot łączy się z Discord.
Koszt API łatwo obliczyć. Typowa odpowiedź tutaj używa 1500 tokenów wejściowych (prompt systemowy plus dwanaście krótkich tur) i 300 tokenów wyjściowych.
- Wejście: 1500 x $0,15 / 1M = $0,000225
- Wyjście: 300 x $0.50 / 1M = $0.00015
- Na odpowiedź: $0,000375
To daje 1000 odpowiedzi za $0,375 i 10 000 odpowiedzi za $3,75. Kredyt próbny $0,50 pokrywa około 1333 odpowiedzi. Doładowanie $20 pokrywa ponad 53 000. Doładowania wynoszą od $20 do $500, z +5% od $50, +10% od $100 i +15% od $200. Kredyt nie wygasa i nie ma subskrypcji, więc cichy serwer kosztuje prawie nic. Zobacz stronę cenową po szczegóły. Płatność tylko kryptowalutami, używając USDT na TRC20 lub USDC na Base.
Gdzie iść dalej
Trzy ulepszenia są warte wysiłku. Dodaj strumieniowanie, edytując pojedynczą wiadomość, gdy przychodzą fragmenty, ale pamiętaj o limitach edycji Discord. Dodaj polecenie slash, które resetuje historię kanału. Dodaj wywoływanie narzędzi, aby bot mógł rzucać kostką lub wyszukiwać arkusz postaci; API obsługuje tools, tool_choice i wyniki role: "tool" w formacie OpenAI.
Dokumentacja API wymienia wszystkie obsługiwane parametry, a artykuł Hermes API omawia, jak zachowują się modele bez cenzury w projekcie. Prompty wysłane do API nie są używane do trenowania, co warto wspomnieć w zasadach Twojego serwera, jeśli pytają o to członkowie.
Więcej przewodników
Pytania i odpowiedzi
Czy bot wymaga uprawnienia Message Content?
Tak. Włącz to w portalu deweloperskim Discord i w kodzie, ustawiając intents.message_content na true. W przeciwnym razie bot widzi puste wiadomości.
Ile odpowiedzi bot może obsłużyć jednocześnie?
Pełny klucz pozwala na 8 równoległych zapytań i 300 na minutę; klucz próbny pozwala na 2 i 60. Semafor w botcie utrzymuje Cię poniżej limitu.
Czy mogę opublikować kod bota?
Tak, o ile token Discorda i klucz API nie trafią do repozytorium. Odczytuj je ze zmiennych środowiskowych i dołącz plik .env.example.
Czy dozwolona jest tematyka dla dorosłych?
Tylko w ramach legalnego użytku dla dorosłych, zgodnie z regulaminem Discorda i ustawieniami kanałów dla pełnoletnich. Treści seksualne z udziałem nieletnich są zawsze zabronione.
Ile to kosztuje?
Odpowiedź z 1500 tokenami wejściowymi i 300 tokenami wyjściowymi kosztuje $0,000375, czyli około $3,75 za 10 000 odpowiedzi, plus koszt hostowania procesu.
Twój klucz dzieli od Ciebie tylko jeden formularz
Utwórz konto, skopiuj klucz, zmień bazowy URL. To cała konfiguracja.
Pobierz klucz API