अनसेंसर्ड LLM के साथ ओपन सोर्स डिस्कोर्ड बॉट
एक ओपन सोर्स डिस्कोर्ड बॉट जो LLM के माध्यम से बात करता है, वह पायथन में लगभग अस्सी लाइनों का बना है। यह गाइड आपको कोड, उन सीमाओं को देता है जिन्हें आपको पालन करना है, और प्रति प्रतिक्रिया लागत देता है, एक OpenAI-कम्पैटिबल API का उपयोग करके जिसमें एक ऐसा मॉडल है जो कानूनी वयस्क अनुरोधों को अस्वीकार नहीं करता है।

मुख्य बिंदु
- discord.py और OpenAI SDK काफी हैं; SDK को https://api.openrouternsfw.com/v1 की ओर इशारा करें और मॉडल uncensored का उपयोग करें।
- Discord डेवलपर पोर्टल में Message Content इंटेंट को सक्षम करें, अन्यथा बॉट खाली संदेश देखता है।
- समवर्ती सीमा के अंदर रहने के लिए 8 से कम सिमेफोर का उपयोग करें, और वयस्क सामग्री को उम्र-सीमित चैनलों में रखें।
- 1,500 इनपुट और 300 आउटपुट टोकन वाले एक जवाब की लागत $0.000375 है, इसलिए प्रति 10,000 जवाब लगभग $3.75।
कोई कार्ड आवश्यक नहीं। साइन-अप के बाद, एक क्लिक से $0.50 का मुफ़्त ट्रायल क्रेडिट क्लेम करें (प्रति व्यक्ति एक बार)।
API कुंजी पाएँआप क्या बना रहे हैं
नीचे दिया गया बॉट तब जवाब देता है जब कोई उसे मेन्शन करता है। यह चैनल के लिए एक छोटा इतिहास रखता है, उसे चैट पूर्णता एंडपॉइंट पर भेजता है, और प्रतिक्रिया पोस्ट करता है। यह सादा पायथन है, MIT-अनुकूल है, और इसमें कोई डेटाबेस नहीं है। आप इसे एक ही बैठक में पढ़ सकते हैं, जो एक ओपन सोर्स प्रोजेक्ट का उद्देश्य है: कोई और इसे फॉर्क कर सकता है और इसे समझ सकता है।
इसके पीछे का मॉडल एकल ओपन-वेट टेक्स्ट मॉडल है, एक स्वतंत्र प्रदाता द्वारा चलाया जाता है और कानूनी वयस्क उपयोग के लिए सामग्री अस्वीकृति के बिना जवाब देने के लिए ट्यून्ड किया गया है। यह कथा, रोलप्ले या वयस्क संवाद के आसपास बने डिस्कोर्ड समुदायों के लिए उपयुक्त है। दो नियम शुरुआत से लागू होते हैं। पहला, नाबालिगों से जुड़ी यौन सामग्री API द्वारा अनुमति नहीं है और आपके बॉट के डिज़ाइन का हिस्सा नहीं होनी चाहिए। दूसरा, डिस्कोर्ड के अपने नियम और उम्र-सीमित चैनल सेटिंग्स हैं, और उन्हें मानने की ज़िम्मेदारी आपकी है। वयस्क सामग्री को उन चैनलों तक सीमित रखें जिन्हें इस तरह चिह्नित किया गया है और सर्वरों में जहां सदस्य वयस्क हैं।
डिस्कोर्ड और अपनी कुंजियाँ सेट करें
- डिस्कोर्ड डेवलपर पोर्टल खोलें और एक एप्लिकेशन बनाएं, फिर उसमें एक बॉट जोड़ें।
- बॉट सेटिंग्स के तहत Message Content Intent को सक्षम करें। इसके बिना, बॉट खाली टेक्स्ट वाले संदेश प्राप्त करता है।
- बॉट टोकन कॉपी करें। इसे पासवर्ड की तरह मानें।
- OAuth2 URL जनरेटर का उपयोग करके बॉट को उन चैनलों में संदेश पढ़ने और भेजने की अनुमति के साथ आमंत्रित करें जिनकी आप चयन करते हैं।
- की पेज से एक API कुंजी प्राप्त करें। नए उपयोगकर्ता एक क्लिक के साथ $0.50 का मुफ़्त ट्रायल क्रेडिट दावा कर सकते हैं, बिना भुगतान विवरण की आवश्यकता के, जो 7 दिनों के लिए मान्य है।
दोनों रहस्यों को एनवायरनमेंट वेरिएबल्स के रूप में स्टोर करें, रिपॉजिटरी में कभी नहीं। एक ओपन सोर्स प्रोजेक्ट के लिए यह सामान्य से ज़्यादा मायने रखता है, क्योंकि कोड सार्वजनिक है।
pip install discord.py openai python-dotenv
printf 'DISCORD_TOKEN=your-discord-token
API_KEY=your-api-key
' > .env
echo ".env" >> .gitignore
बॉट कोड
इसे bot.py के रूप में सेव करें। कमेंट्स उन निर्णयों को समझाते हैं जो स्पष्ट नहीं हैं।
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 चलाएं, फिर किसी ऐसे चैनल में बॉट को मेन्शन करें जहाँ वह पढ़ सकता है। पहला जवाब कुछ ही सेकंड में आना चाहिए।
यदि कुछ नहीं होता है, तो तीन बातों की जाँच क्रम से करें। बॉट को सदस्य सूची में ऑनलाइन होना चाहिए, ताकि टोकन वैध हो। उसे उस चैनल में संदेश पढ़ने और भेजने की अनुमति होनी चाहिए। और एक मेन्शन एक वास्तविक Discord मेन्शन होना चाहिए, जो ऑटोकम्प्लीट सूची से चुना गया हो, क्योंकि बॉट के नाम वाले सादे टेक्स्ट को message.mentions में दिखाई नहीं देता। टर्मिनल API त्रुटियाँ प्रिंट करता है, इसलिए गलत कुंजी वहाँ प्रमाणीकरण विफलता के रूप में दिखाई देती है।
कोड इस तरह क्यों बना है
इतिहास जानबूझकर छोटा है
कॉन्टेक्स्ट विंडो 100,000 टोकन की है, इसलिए आप बहुत कुछ भेज सकते हैं। लेकिन हर कॉल पर हर इनपुट टोकन के लिए शुल्क लिया जाता है, और Discord चैट में ज्यादातर छोटी लाइनें होती हैं। बारह टर्न्स जवाबों को संगत रखते हैं बिना हर संदेश को बिल में बदले। कहानी चैनलों के लिए जहाँ निरंतरता मायने रखती है, वहाँ maxlen बढ़ाएं।
सेमाफोर आपकी कुंजी की रक्षा करता है
एक पूर्ण कुंजी 8 समानांतर अनुरोधों और प्रति मिनट 300 अनुरोधों की अनुमति देती है। एक ट्रायल कुंजी केवल 2 और 60 की अनुमति देती है। यदि दस लोग एक साथ बॉट को मेन्शन करते हैं और आप दस अनुरोध भेजते हैं, तो अतिरिक्त अनुरोध HTTP 429 प्राप्त करते हैं concurrency त्रुटि कोड के साथ। सेमाफोर उन्हें आपके प्रोग्राम में क्यू करता है। जब आप ट्रायल कुंजी पर हों तो इसे 2 पर सेट करें। यदि आप कभी स्ट्रीमिंग चालू करते हैं, तो याद रखें कि एक स्ट्रीम किए गए अनुरोध स्ट्रीम समाप्त होने तक अपनी स्लॉट पकड़े रखता है।
रीट्राइज़ SDK से आते हैं
OpenAI Python SDK 429 पर पुनः प्रयास करता है और Retry-After हेडर का सम्मान करता है, जिसे सेवा अस्थायी ओवरलोड पर Retry-After: 5 के रूप में भेजती है। max_retries को 4 पर सेट करने से छोटी चोटियों को कवर किया जा सकता है। विफल या अस्वीकृत अनुरोधों का शुल्क नहीं लिया जाता, इसलिए जब पुनः प्रयास होते हैं तो वे आपको टोकन नहीं खर्च करते, भले ही वे विफल हों।
एक साझा व्यक्तित्व
सिस्टम प्रॉम्प्ट हर कॉल पर पहले आता है। प्रति-चैनल पर्सोना एक छोटा विस्तार है: चैनल ID से प्रॉम्प्ट तक एक डिक्शनरी रखें और ask में इसे खोजें।
इसे एक अच्छा ओपन सोर्स प्रोजेक्ट बनाएं
कोड काम करता है, लेकिन एक सार्वजनिक रिपॉजिटरी को कुछ अतिरिक्त चीज़ों की ज़रूरत है ताकि अन्य लोग इसे उपयोग कर सकें।
- एक लाइसेंस। छोटे बॉट्स के लिए MIT या Apache 2.0 सामान्य विकल्प हैं। रिपॉज़िटरी की जड़ पर फ़ाइल जोड़ें।
- एक .env.example।
DISCORD_TOKENऔरAPI_KEYको नकली मानों के साथ सूचीबद्ध करें ताकि लोग जान सकें कि उन्हें क्या सेट करना है। - एक कॉन्फ़िगर करने योग्य बेस URL। वातावरण से
BASE_URLऔरMODELपढ़ें, जो ऊपर दिए गए मानों पर डिफ़ॉल्ट होंगे। कोई भी इसे फ़ॉर्क कर सकता है और फिर किसी भी OpenAI-संगत सर्वर का उपयोग कर सकता है। - एक Dockerfile। एक छोटा फ़ाइल जो Python की slim इमेज पर आधारित है,
bot.pyकॉपी करता है, तीन पैकेज इंस्टॉल करता है और स्क्रिप्ट चलाता है, जिससे लोग इसे कहीं भी होस्ट कर सकते हैं। - इंटेंट चेतावनी वाला एक README। Message Content इंटेंट का न होना हर Discord बॉट के लिए सबसे आम सपोर्ट सवाल है।
अपने टोकन और कुंजी को Git इतिहास से बाहर रखें। यदि एक लीक हो जाता है, तो इसे Discord पोर्टल या API कुंजी पृष्ठ पर रद्द करें और एक नई जारी करें।
होस्टिंग और इसकी लागत
बॉट एक लंबा चलने वाला प्रोसेस है जिसमें हल्का CPU उपयोग होता है। एक छोटा VPS, एक अतिरिक्त मशीन या एक कंटेनर प्लेटफ़ॉर्म पर्याप्त है। बाहर निकालने के लिए कोई वेब सर्वर नहीं है, क्योंकि बॉट Discord से कनेक्ट होता है।
API लागत की गणना आसान है। एक सामान्य प्रतिक्रिया यहाँ 1,500 इनपुट टोकन (सिस्टम प्रॉम्प्ट और बारह छोटे टर्न्स सहित) और 300 आउटपुट टोकन का उपयोग करती है।
- इनपुट: 1,500 x $0.15 / 1M = $0.000225
- आउटपुट: 300 x $0.50 / 1M = $0.00015
- प्रति प्रतिक्रिया: $0.000375
इससे 1,000 जवाबों की कीमत $0.375 और 10,000 जवाबों की $3.75 होती है। $0.50 का ट्रायल लगभग 1,333 जवाबों को कवर करता है। $20 का टॉप-अप 53,000 से ज़्यादा को कवर करता है। टॉप-अप $20 से $500 तक होते हैं, $50 से +5%, $100 से +10% और $200 से +15% मिलते हैं। क्रेडिट कभी समाप्त नहीं होता और कोई सब्सक्रिप्शन नहीं है, इसलिए एक शांत सर्वर की लागत लगभग शून्य है। विवरण के लिए मूल्य निर्धारण पेज देखें। भुगतान केवल क्रिप्टो के साथ होता है, TRC20 पर USDT या Base पर USDC का उपयोग करके।
आगे कहाँ जाएँ
तीन अपग्रेड प्रयास के लायक हैं। स्ट्रीमिंग जोड़ें, एकल संदेश को चंक आने पर संपादित करके, लेकिन डिस्कोर्ड के एडिट रेट लिमिट का ध्यान रखें। एक स्लैश कमांड जोड़ें जो चैनल इतिहास को रीसेट करे। टूल कॉलिंग जोड़ें ताकि बॉट पासा फेंक सके या किरदार शीट खोज सके; API tools, tool_choice और role: "tool" को समर्थन देती है, जो OpenAI फॉर्मेट में परिणाम देता है।
API दस्तावेज़ में प्रत्येक समर्थित पैरामीटर सूचीबद्ध है, और Hermes API लेख में बताया गया है कि बिना सेंसर मॉडल किसी प्रोजेक्ट के भीतर कैसे व्यवहार करते हैं। API को भेजे गए प्रॉम्प्ट प्रशिक्षण के लिए उपयोग नहीं किए जाते हैं, जो आपके सर्वर के नियमों में उल्लेखनीय है यदि आपके सदस्य पूछते हैं।
अधिक गाइड
प्रश्न और उत्तर
क्या बॉट को Message Content intent की आवश्यकता है?
हाँ। इसे Discord डेवलपर पोर्टल और कोड में intents.message_content को true सेट करके सक्षम करें। अन्यथा बॉट खाली संदेश देखता है।
बॉट एक साथ कितनी प्रतिक्रियाओं को संभाल सकता है?
एक पूर्ण कुंजी 8 समानांतर अनुरोधों और प्रति मिनट 300 की अनुमति देती है; एक ट्रायल कुंजी 2 और 60 की अनुमति देती है। बॉट में एक सीमांकक आपको सीमा से नीचे रखता है।
क्या मैं बॉट का कोड प्रकाशित कर सकता हूँ?
हाँ, जब तक Discord टोकन और API कुंजी रिपॉजिटरी से बाहर रहें। उन्हें एन्वायरनमेंट वेरिएबल्स से पढ़ें और एक .env.example भेजें।
क्या वयस्क विषयों का उपयोग करना अनुमत है?
केवल कानूनी वयस्क उपयोग के लिए, डिस्कोर्ड के नियमों और इसके उम्र-सीमित चैनल सेटिंग्स के अनुरूप। नाबालिगों से जुड़ी यौन सामग्री कभी भी अनुमति नहीं है।
चलाए जाने पर इसकी लागत क्या है?
1,500 इनपुट और 300 आउटपुट टोकन वाली एक प्रतिक्रिया की लागत $0.000375 आती है, इसलिए प्रति 10,000 प्रतिक्रिया लगभग $3.75, साथ ही प्रक्रिया की होस्टिंग की लागत।
आपकी कुंजी बस एक फ़ॉर्म दूर है
एक खाता बनाएँ, कुंजी कॉपी करें, बेस URL बदलें। सेटअप यही है।
API कुंजी पाएँ