TR ▾
API anahtarı al

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.

Sohbet penceresinde dallanan bir kod ağacına bağlı, parlayan küplerden oluşan bir botun izometrik illüstrasyonu

güncellendi

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ı al

Ne 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

  1. Discord geliştirici portalını açın ve bir uygulama oluşturun, ardından ona bir bot ekleyin.
  2. Bot ayarları altında Message Content Intent (Mesaj İçeriği Amacı) seçeneğini etkinleştirin. Bu olmadan bot boş metinli mesajlar alır.
  3. Bot tokenını kopyalayın. Onu bir şifre gibi muamele edin.
  4. OAuth2 URL oluşturucuyu kullanarak botu, seçtiğiniz kanallarda mesajları okuma ve gönderme izniyle davet edin.
  5. 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_TOKEN ve API_KEY değerlerini sahte değerlerle listeleyin.
  • Yapılandırılabilir bir base URL. BASE_URL ve MODEL değ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.py dosyası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.

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