Sansürsüz LLM ile Açık Kaynaklı Discord Botu
Bir LLM üzerinden konuşan açık kaynaklı bir Discord botu, yaklaşık seksen satır Python kodu ile yazılır. Bu rehber, yasal yetişkin isteklerini reddetmeyen bir model kullanan OpenAI uyumlu API ile size kodu, gözetmeniz gereken limitleri ve yanıt başına maliyeti sunar.

Temel noktalar
- discord.py ve OpenAI SDK yeterlidir; SDK'yı https://api.openrouternsfw.com/v1 adresine yönlendirin ve uncensored modelini kullanın.
- Discord geliştirici portalında Message Content (Mesaj İçeriği) amacını açın, aksi takdirde bot boş mesajlar görür.
- Eşzamanlılık limitinin altında kalmak için 8'in altında bir semafor kullanın ve yetişkin içeriği yaş kısıtlı olarak işaretlenmiş kanallarda tutun.
- 1.500 giriş ve 300 çıkış token'lı bir yanıt $0.000375 tutarındadır, yani 10.000 yanıt başına yaklaşık $3.75 eder.
Kart gerekmez. Kayıt olduktan sonra, tek tıkla (kişi başı bir kez) $0.50 ücretsiz deneme kredisi talep edebilirsiniz.
API anahtarı alNe inşa ettiğinizi
Aşağıdaki bot, biri kendisini etiketlediğinde yanıt verir. Her kanal için kısa bir geçmiş tutar, bunu sohbet tamamlama uç noktasına gönderir ve yanıtı yayınlar. Sade Python'dur, MIT lisansına uygundur ve veritabanı içermez. Tümünü tek oturuşta okuyabilirsiniz; bu da açık kaynaklı bir projenin amacıdır: başkası çatallayabilir ve anlayabilir.
Arka plandaki model, bağımsız bir sağlayıcı tarafından işletilen ve yasal yetişkin kullanımı için içerik reddi olmadan yanıt verecek şekilde ayarlanmış tek bir açık ağırlıklı metin modelidir. Bu durum; kurgu, rol yapma veya yetişkin sohbeti etrafında kurulu Discord topluluklarına uygundur. İki kural başlangıçtan itibaren geçerlidir. Birincisi, API tarafından reşit olmayanların yer aldığı cinsel içeriğe izin verilmez ve botunuzun tasarımında yer almamalıdır. İkincisi, Discord'un kendi kuralları ve yaş kısıtlamalı kanal ayarları vardır ve bunlara uymanız sizin sorumluluğunuzdadır. Yetişkin içeriği yalnızca bu şekilde işaretlenmiş kanallarda ve üyeleri yetişkin olan sunucularda tutun.
Discord ve anahtarlarınızı kurun
- Discord geliştirici portalını açın ve bir uygulama oluşturun, ardından ona bir bot ekleyin.
- Bot ayarları altında Message Content Intent (Mesaj İçeriği Amacı) seçeneğini etkinleştirin. Bu olmadan bot boş metinli mesajlar alır.
- Bot tokenını kopyalayın. Onu bir şifre gibi muamele edin.
- OAuth2 URL oluşturucuyu kullanarak botu, seçtiğiniz kanallarda mesajları okuma ve gönderme izniyle davet edin.
- anahtar sayfasından bir API anahtarı alın. Yeni kullanıcılar tek tıkla, ödeme bilgisi gerekmeden 7 gün geçerli $0.50 deneme kredisi talep edebilir.
Her iki gizli bilgiyi de ortam değişkenleri olarak saklayın, depoda asla değil. Açık kaynaklı bir proje için bu, kodun herkese açık olması nedeniyle her zamankinden daha önemlidir.
pip install discord.py openai python-dotenv
printf 'DISCORD_TOKEN=your-discord-token
API_KEY=your-api-key
' > .env
echo ".env" >> .gitignore
Bot kodu
Bunu bot.py olarak kaydedin. Yorumlar, açık olmayan kararları açıklar.
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"])
python bot.py ile çalıştırın, ardından okuyabildiği bir kanalda botu etiketleyin. İlk yanıt birkaç saniye içinde gelmelidir.
Hiçbir şey olmuyorsa, sırayla üç şeyi kontrol edin. Bot üye listesinde çevrimiçi olmalıdır, yani token geçerlidir. O kanalda mesaj okuma ve gönderme izni olmalıdır. Ve etiket, düz metin bot adının message.mentions içinde görünmediği için, tamamlama listesinden seçilen gerçek bir Discord etiketi olmalıdır. Terminal API hatalarını yazdırır, bu yüzden yanlış anahtar bir kimlik doğrulama hatası olarak orada görünür.
Kodun neden bu şekilde şekillendirildiği
Geçmiş kasıtlı olarak küçüktür
Bağlam penceresi 100.000 token'dır, bu yüzden çok şey gönderebilirsiniz. Ancak her giriş token'ı her çağrıda faturalandırılır ve Discord sohbeti çoğunlukla kısa satırlardan oluşur. On iki dönüş, her mesajı büyük bir faturaya dönüştürmeden yanıtın tutarlı kalmasını sağlar. Sürekliliğin önemli olduğu hikaye kanalları için maxlen değerini artırın.
Semafor anahtarınızı korur
Tam anahtar 8 eşzamanlı istek ve dakikada 300 istek izni verir. Deneme anahtarı yalnızca 2 ve 60 izni verir. On kişi botu aynı anda etiketler ve on istek gönderirseniz, ek olanlar concurrency hata koduyla HTTP 429 alır. Semafor bunları kendi işleminizde kuyruğa alır. Deneme anahtarıdayken 2 olarak ayarlayın. Akış'ı açarsanız, akış bitene kadar akışlı bir isteğin slotunu tuttuğunu unutmayın.
Yeniden denemeler SDK'dan gelir
OpenAI Python SDK, 429 durum kodunda yeniden deneme yapar ve hizmetin geçici aşırı yüklenme durumunda Retry-After: 5 olarak gönderdiği Retry-After başlığını dikkate alır. max_retries değerini 4 olarak ayarlamak kısa süreli artışları kapsar. Başarısız veya reddedilen istekler için ücret alınmaz; bu nedenle başarısız olan yeniden denemeler token maliyeti oluşturmaz.
Tek bir paylaşılmış kişilik
Sistem istemi her çağrıda ilk sırada yer alır. Kanal başına kişilikler küçük bir uzantıdır: Kanal kimliğinden isteme bir sözlük tutun ve ask içinde bunu sorgulayın.
Bunu iyi bir açık kaynaklı proje haline getirin
Kod çalışıyor, ancak bir genel depoda yabancıların kullanabilmesi için birkaç ek şeye ihtiyaç var.
- Bir lisans. Küçük botlar için MIT veya Apache 2.0 yaygın seçimlerdir. Dosyayı depo köküne ekleyin.
- Bir .env.example. İnsanların ne ayarlaması gerektiğini bilmeleri için
DISCORD_TOKENveAPI_KEYdeğerlerini sahte değerlerle listeleyin. - Yapılandırılabilir bir base URL.
BASE_URLveMODELdeğerlerini ortamdan okuyun, yukarıdaki değerlere varsayılan olarak ayarlayın. Çatallayan herkes artık herhangi bir OpenAI uyumlu sunucu kullanabilir. - Bir Dockerfile. Python slim görüntüsüne dayalı kısa bir dosya,
bot.pydosyasını kopyalar, üç paketi yükler ve betiği çalıştırır; insanların onu her yerde barındırmasını sağlar. - Niyet uyarısı içeren bir README dosyası. Eksik Mesaj İçeriği niyeti, her Discord botu için en yaygın destek sorunudur.
Kendi tokenınızı ve anahtarınızı Git geçmişinden uzak tutun. Bir sızıntı olursa, Discord portalında veya API anahtarı sayfasında iptal edin ve yeni bir tane oluşturun.
Barındırma ve maliyeti
Bot, hafif CPU kullanımıyla tek bir uzun süre çalışan işlemdir. Küçük bir VPS, bir yedek makine veya bir kapsayıcı platform yeterlidir. Açığa çıkarılacak bir web sunucusu yoktur, çünkü bot Discord'a dışarı bağlanır.
API maliyeti kolayca hesaplanabilir. Burada tipik bir yanıt 1.500 giriş token'ı (sistem istemi ve on iki kısa dönüş) ve 300 çıkış token'ı kullanır.
- Giriş: 1.500 x $0.15 / 1M = $0.000225
- Çıktı: 300 x $0.50 / 1M = $0.00015
- Yanıt başına: $0.000375
Bu, 1.000 yanıtın $0.375 ve 10.000 yanıtın $3.75 ettiği anlamına gelir. $0.50 deneme yaklaşık 1.333 yanıtı kapsar. $20 bakiye yükleme 53.000'den fazlasını kapsar. Bakiye yüklemeler $20 ile $500 arasındadır, $50'den itibaren +%5, $100'den itibaren +%10 ve $200'den itibaren +%15 eklenir. Kredi asla sona ermez ve abonelik yoktur, bu yüzden sessiz bir sunucu neredeyse hiçbir şeye mal olmaz. Detaylar için fiyatlandırma sayfasına bakın. Ödeme yalnızca kripto ile yapılır, TRC20 üzerinde USDT veya Base üzerinde USDC kullanılarak.
Sonraki adımlar
Üç yükseltme çabaya değerdir. Parçalar geldikçe tek bir mesajı düzenleyerek akış ekleyin, ancak Discord'un düzenleme hız limitlerine dikkat edin. Kanal geçmişini sıfırlayan bir slash komutu ekleyin. Botun zar atmasına veya bir karakter sayfası aramasına olanak tanıyan araç çağırma ekleyin; API, OpenAI formatında tools, tool_choice ve role: "tool" sonuçlarını destekler.
API dokümantasyonu desteklenen tüm parametreleri listeler ve Hermes API makalesi bir projede sansürsüz modellerin nasıl davrandığını kapsar. API'ye gönderilen istemler eğitim için kullanılmaz; bu, üyeleriniz sorarsa sunucu kurallarınızda belirtmeye değer.
Daha fazla kılavuz
Sorular ve cevaplar
Bot Message Content (Mesaj İçeriği) amacına mı ihtiyaç duyar?
Evet. Discord geliştirici portalında ve kodda intents.message_content değerini true olarak ayarlayın. Aksi takdirde bot boş mesajlar görür.
Bot aynı anda kaç yanıtı işleyebilir?
Tam bir anahtar dakikada 300 istek ve eşzamanlı 8 istek izni verir; deneme anahtarı ise 2 eşzamanlı istek ve dakikada 60 istek izni verir. Botunuzdaki bir semafor, limitin altında kalmanızı sağlar.
Botun kodunu yayınlayabilir miyim?
Evet, Discord token'ı ve API anahtarı depo içinde kalmadığı sürece. Bunları ortam değişkenlerinden okuyun ve bir .env.example dosyası ekleyin.
Yetişkinlere yönelik temalar kullanmak serbest mi?
Discord'un kuralları ve yaş sınırı olan kanal ayarları ile uyumlu olarak yalnızca yasal yetişkin kullanımı için. Reşit olmayanlar ile ilgili cinsel içerik asla serbest değildir.
Çalıştırmak ne kadar maliyetlidir?
1.500 girdi ve 300 çıktı token içeren bir yanıt $0.000375 tutarındadır; bu da 10.000 yanıt için yaklaşık $3.75 eder, ayrıca işlemi barındırma maliyeti eklenir.
Anahtarınız tek bir formun uzağında
Bir hesap oluşturun, anahtarı kopyalayın ve base URL'yi değiştirin. Kurulum bu kadar basit.
API anahtarı al