Bot Discord Sumber Terbuka Dengan LLM Tanpa Sensor
Bot Discord sumber terbuka yang berbicara melalui LLM terdiri dari sekitar delapan puluh baris Python. Panduan ini memberikan kode, batas yang harus Anda hormati, dan biaya per balasan, menggunakan API kompatibel OpenAI dengan model yang tidak menolak permintaan dewasa yang sah.

Poin utama
- discord.py ditambah SDK OpenAI sudah cukup; arahkan SDK ke https://api.openrouternsfw.com/v1 dan gunakan model uncensored.
- Aktifkan izin Konten Pesan di portal pengembang Discord atau bot akan melihat pesan kosong.
- Gunakan semaphore di bawah 8 untuk tetap berada di dalam batas konkurensi, dan simpan konten dewasa di saluran yang ditandai terbatas usia.
- Balasan dengan 1.500 token input dan 300 token output berharga $0,000375, jadi sekitar $3,75 per 10.000 balasan.
Tidak perlu kartu. Setelah mendaftar, klaim $0,50 kredit uji coba gratis dengan satu klik (sekali per orang).
Dapatkan kunci APIYang sedang Anda bangun
Bot di bawah ini menjawab ketika seseorang menyebutnya. Bot menyimpan riwayat singkat per saluran, mengirimkannya ke endpoint penyelesaian obrolan, dan memposting balasan. Ini adalah Python murni, ramah MIT, dan tidak memiliki database. Anda dapat membacanya sekaligus, yang merupakan inti dari proyek sumber terbuka: orang lain dapat melakukan fork dan memahaminya.
Model di baliknya adalah model teks bobot terbuka tunggal, dijalankan oleh penyedia independen dan disesuaikan untuk menjawab tanpa penolakan konten untuk penggunaan dewasa yang sah. Itu cocok untuk komunitas Discord yang dibangun di sekitar fiksi, roleplay, atau percakapan dewasa. Dua aturan berlaku sejak awal. Pertama, konten seksual yang melibatkan anak di bawah umur tidak diperbolehkan oleh API dan tidak boleh menjadi bagian dari desain bot Anda. Kedua, Discord memiliki aturan sendiri dan pengaturan saluran terbatas usia, dan Anda bertanggung jawab untuk mengikuti aturan tersebut. Batasi konten dewasa untuk saluran yang ditandai sebagai demikian dan ke server tempat anggota adalah orang dewasa.
Siapkan Discord dan kunci Anda
- Buka portal pengembang Discord dan buat aplikasi, lalu tambahkan bot ke dalamnya.
- Di bawah pengaturan bot, aktifkan Izin Konten Pesan. Tanpanya, bot menerima pesan dengan teks kosong.
- Salin token bot. Perlakukan seperti kata sandi.
- Gunakan generator URL OAuth2 untuk mengundang bot dengan izin membaca dan mengirim pesan di saluran yang Anda pilih.
- Dapatkan kunci API dari halaman kunci. Pengguna baru dapat mengklaim $0.50 kredit uji coba dengan satu klik, tanpa perlu detail pembayaran, berlaku selama 7 hari.
Simpan kedua rahasia tersebut sebagai variabel lingkungan, jangan pernah di dalam repositori. Untuk proyek sumber terbuka, hal ini lebih penting dari biasanya karena kode bersifat publik.
pip install discord.py openai python-dotenv
printf 'DISCORD_TOKEN=your-discord-token
API_KEY=your-api-key
' > .env
echo ".env" >> .gitignore
Kode bot
Simpan ini sebagai bot.py. Komentar menjelaskan keputusan yang tidak jelas.
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"])
Jalankan dengan python bot.py, lalu sebutkan bot tersebut di saluran yang dapat dibaca oleh bot. Balasan pertama akan tiba dalam beberapa detik.
Jika tidak ada yang terjadi, periksa tiga hal secara berurutan. Bot harus online di daftar anggota, sehingga token valid. Bot harus memiliki izin untuk membaca dan mengirim pesan di saluran tersebut. Dan penyebutan harus merupakan penyebutan Discord yang sebenarnya, dipilih dari daftar autocomplete, karena teks biasa dengan nama bot tidak muncul di message.mentions. Terminal mencetak kesalahan API, sehingga kunci yang salah akan muncul di sana sebagai kegagalan autentikasi.
Mengapa kode dibentuk seperti ini
Riwayat kecil disengaja
Jendela konteks adalah 100.000 token, sehingga Anda dapat mengirim banyak data. Namun setiap token input ditagih pada setiap panggilan, dan obrolan Discord sebagian besar terdiri dari baris pendek. Dua belas putaran menjaga agar balasan tetap koheren tanpa mengubah setiap pesan menjadi tagihan besar. Naikkan maxlen untuk saluran cerita di mana kontinuitas penting.
Semaphore melindungi kunci Anda
Kunci penuh mengizinkan 8 permintaan paralel dan 300 permintaan per menit. Kunci uji coba hanya mengizinkan 2 dan 60. Jika sepuluh orang menyebutkan bot sekaligus dan Anda mengirim sepuluh permintaan, permintaan tambahan akan mendapatkan HTTP 429 dengan kode kesalahan concurrency. Semaphore mengurutkannya di proses Anda sendiri. Atur menjadi 2 saat Anda menggunakan kunci uji coba. Jika Anda pernah mengaktifkan streaming, ingat bahwa permintaan streaming memegang slotnya hingga stream selesai.
Coba ulang berasal dari SDK
SDK Python OpenAI melakukan retry pada 429 dan menghormati header Retry-After, yang dikirim oleh layanan sebagai Retry-After: 5 saat kelebihan beban sementara. Mengatur max_retries ke 4 mencakup lonjakan singkat. Permintaan yang gagal atau ditolak tidak dikenakan biaya, sehingga retry tidak memakan token Anda saat gagal.
Satu persona bersama
Prompt sistem berada di awal setiap panggilan. Persona per-saluran adalah ekstensi kecil: simpan kamus dari ID saluran ke prompt dan cari di ask.
Jadikan sebagai proyek sumber terbuka yang baik
Kode berfungsi, tetapi repositori publik membutuhkan beberapa tambahan sebelum orang asing dapat menggunakannya.
- Lisensi. MIT atau Apache 2.0 adalah pilihan umum untuk bot kecil. Tambahkan file di akar repositori.
- .env.example. Daftar
DISCORD_TOKENdanAPI_KEYdengan nilai palsu agar orang tahu apa yang harus diatur. - URL dasar yang dapat dikonfigurasi. Baca
BASE_URLdanMODELdari lingkungan, dengan nilai default sesuai di atas. Siapa pun yang melakukan fork dapat menggunakan server kompatibel OpenAI mana pun. - Dockerfile. File pendek berdasarkan gambar Python slim, menyalin
bot.py, menginstal tiga paket, dan menjalankan skrip, memungkinkan orang menghostingnya di mana saja. - README dengan peringatan intent. Intent Konten Pesan yang hilang adalah pertanyaan dukungan utama untuk setiap bot Discord.
Jaga token dan kunci Anda sendiri agar keluar dari riwayat Git. Jika salah satu bocor, cabut di portal Discord atau di halaman kunci API dan keluarkan yang baru.
Hosting dan biayanya
Bot adalah proses panjang tunggal dengan penggunaan CPU ringan. VPS kecil, mesin cadangan, atau platform container sudah cukup. Tidak ada server web yang perlu diekspos, karena bot terhubung ke Discord.
Biaya API mudah dihitung. Balasan khas di sini menggunakan 1.500 token input (prompt sistem ditambah dua belas putaran pendek) dan 300 token output.
- Input: 1.500 x $0,15 / 1M = $0,000225
- Output: 300 x $0,50 / 1M = $0,00015
- Per balasan: $0,000375
Itu membuat 1.000 balasan $0,375 dan 10.000 balasan $3,75. Uji coba $0,50 mencakup sekitar 1.333 balasan. Top-up $20 mencakup lebih dari 53.000. Top-up berjalan dari $20 hingga $500, dengan +5% dari $50, +10% dari $100, dan +15% dari $200. Saldo prabayar tidak pernah kedaluwarsa dan tidak ada langganan, sehingga server yang tenang hampir tidak mengeluarkan biaya. Lihat halaman harga untuk detailnya. Pembayaran hanya kripto, menggunakan USDT di TRC20 atau USDC di Base.
Langkah selanjutnya
Tiga peningkatan sepadan dengan usaha. Tambahkan streaming dengan mengedit pesan tunggal saat bagian-bagian tiba, tetapi perhatikan batas laju edit Discord. Tambahkan perintah slash yang mereset riwayat saluran. Tambahkan pemanggilan alat agar bot dapat melempar dadu atau mencari lembaran karakter; API mendukung tools, tool_choice dan hasil role: "tool" dalam format OpenAI.
Dokumentasi API mencantumkan setiap parameter yang didukung, dan artikel API Hermes mencakup bagaimana model tanpa sensor berperilaku di dalam proyek. Prompt yang dikirim ke API tidak digunakan untuk pelatihan, yang layak disebutkan dalam aturan server Anda jika anggota bertanya.
Panduan lainnya
Tanya jawab
Apakah bot memerlukan izin Konten Pesan?
Ya. Aktifkan di portal pengembang Discord dan dalam kode dengan intents.message_content diatur ke true. Jika tidak, bot melihat pesan kosong.
Berapa banyak balasan yang dapat ditangani bot secara bersamaan?
Kunci penuh mengizinkan 8 permintaan paralel dan 300 per menit; kunci uji coba mengizinkan 2 dan 60. Semaphore dalam bot menjaga Anda tetap di bawah batas.
Dapatkah saya menerbitkan kode bot?
Ya, selama token Discord dan kunci API tidak masuk ke dalam repositori. Baca dari variabel lingkungan dan sertakan file .env.example.
Apakah diperbolehkan menggunakan tema dewasa?
Hanya untuk penggunaan dewasa yang sah, sesuai dengan aturan Discord dan pengaturan saluran terbatas usia. Konten seksual yang melibatkan anak di bawah umur tidak pernah diperbolehkan.
Berapa biaya untuk menjalankannya?
Balasan dengan 1.500 token input dan 300 token output berharga $0,000375, sehingga sekitar $3,75 per 10.000 balasan, ditambah biaya untuk menjalankan prosesnya.
Kunci Anda hanya selangkah lagi dari satu formulir
Buat akun, salin kunci, ubah URL dasar. Itu saja seluruh proses pengaturannya.
Dapatkan kunci API