VI ▾
Lấy khóa API

Bot Discord mã nguồn mở với LLM không kiểm duyệt

Một bot Discord mã nguồn mở sử dụng LLM để trò chuyện chỉ cần khoảng tám mươi dòng Python. Hướng dẫn này cung cấp cho bạn mã nguồn, các giới hạn bạn phải tuân thủ và chi phí cho mỗi câu trả lời, sử dụng API tương thích OpenAI với một mô hình không từ chối các yêu cầu hợp pháp của người lớn.

Ảnh minh họa đẳng hướng của một bot được tạo từ các khối phát sáng trong cửa sổ trò chuyện liên kết với cây mã phân nhánh

Cập nhật

Điểm chính

  • discord.py cộng với SDK OpenAI là đủ; bạn hãy trỏ SDK vào https://api.openrouternsfw.com/v1 và sử dụng mô hình uncensored.
  • Bạn hãy bật quyền Message Content trong bảng điều khiển nhà phát triển Discord hoặc bot sẽ nhận được các tin nhắn trống.
  • Bạn hãy sử dụng bộ semaphore dưới mức 8 để nằm trong giới hạn đồng thời, và giữ nội dung người lớn trong các kênh được đánh dấu là dành cho người lớn.
  • Một phản hồi với 1.500 token đầu vào và 300 token đầu ra tốn $0,000375, tức khoảng $3,75 cho 10.000 phản hồi.

Không cần thẻ. Sau khi đăng ký, nhận $0,50 tín dụng dùng thử miễn phí bằng một cú nhấp chuột (một lần mỗi người).

Lấy khóa API

Bạn đang xây dựng

Bot bên dưới sẽ trả lời khi ai đó đề cập đến nó. Bot này giữ một lịch sử ngắn cho mỗi kênh, gửi lịch sử đó đến endpoint hoàn thành trò chuyện và đăng câu trả lời. Đây là mã Python thuần túy, phù hợp với giấy phép MIT và không có cơ sở dữ liệu. Bạn có thể đọc toàn bộ mã trong một lần, đây là điểm mấu chốt của một dự án mã nguồn mở: người khác có thể sao chép và hiểu nó.

Mô hình đằng sau là một mô hình văn bản trọng số mở đơn lẻ, được vận hành bởi một nhà cung cấp độc lập và được tinh chỉnh để trả lời mà không từ chối nội dung cho mục đích sử dụng người lớn hợp pháp. Điều này phù hợp với các cộng đồng Discord được xây dựng xung quanh tiểu thuyết, nhập vai hoặc trò chuyện người lớn. Hai quy tắc áp dụng ngay từ đầu. Thứ nhất, nội dung khiêu dâm liên quan đến người chưa thành niên không được API cho phép và không được nằm trong thiết kế của bot bạn. Thứ hai, Discord có các quy tắc riêng và cài đặt kênh dành cho người lớn, và bạn chịu trách nhiệm tuân thủ chúng. Hãy giữ nội dung người lớn trong các kênh được đánh dấu là dành cho người lớn và trong các máy chủ nơi các thành viên là người trưởng thành.

Thiết lập Discord và các khóa của bạn

  1. Mở bảng điều khiển nhà phát triển Discord và tạo một ứng dụng, sau đó thêm một bot vào đó.
  2. Trong cài đặt bot, hãy bật Message Content Intent. Nếu không, bot sẽ nhận được các tin nhắn có nội dung rỗng.
  3. Sao chép token bot. Hãy coi nó như một mật khẩu.
  4. Sử dụng trình tạo URL OAuth2 để mời bot với quyền đọc và gửi tin nhắn trong các kênh bạn chọn.
  5. Lấy một khóa API từ trang khóa API. Người dùng mới có thể nhận $0,50 tín dụng dùng thử chỉ với một cú nhấp chuột, không cần thông tin thanh toán, có hiệu lực trong 7 ngày.

Lưu trữ cả hai bí mật dưới dạng các biến môi trường, không lưu trong kho lưu trữ. Đối với một dự án mã nguồn mở, điều này quan trọng hơn bình thường vì mã nguồn là công khai.

pip install discord.py openai python-dotenv
printf 'DISCORD_TOKEN=your-discord-token
API_KEY=your-api-key
' > .env
echo ".env" >> .gitignore

Mã bot

Lưu mã này dưới dạng bot.py. Các chú thích giải thích các quyết định không rõ ràng.

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"])

Chạy nó bằng python bot.py, sau đó đề cập đến bot trong một kênh mà bot có thể đọc. Câu trả lời đầu tiên sẽ xuất hiện sau vài giây.

Nếu không có gì xảy ra, hãy kiểm tra ba điều theo thứ tự. Bot phải trực tuyến trong danh sách thành viên, nghĩa là token hợp lệ. Bot phải có quyền đọc và gửi tin nhắn trong kênh đó. Và việc đề cập phải là một đề cập Discord thực sự, được chọn từ danh sách tự động hoàn thành, vì văn bản thuần túy có tên bot không xuất hiện trong message.mentions. Terminal in ra các lỗi API, vì vậy khóa sai sẽ hiển thị ở đó dưới dạng lỗi xác thực.

Tại sao mã được thiết kế như vậy

Lịch sử nhỏ một cách có chủ đích

Cửa sổ ngữ cảnh là 100.000 token, vì vậy bạn có thể gửi rất nhiều. Nhưng mỗi token đầu vào đều được tính phí trong mỗi lệnh gọi, và Discord chat chủ yếu là các dòng ngắn. Mười hai lượt hội thoại giữ cho các phản hồi mạch lạc mà không biến mỗi tin nhắn thành một hóa đơn lớn. Hãy tăng maxlen cho các kênh truyện nơi tính liên tục quan trọng.

Bộ semaphore bảo vệ khóa của bạn

Một khóa đầy đủ cho phép 8 yêu cầu đồng thời và 300 yêu cầu mỗi phút. Một khóa dùng thử chỉ cho phép 2 và 60. Nếu mười người nhắc đến bot cùng lúc và bạn gửi mười yêu cầu, các yêu cầu dư thừa sẽ nhận HTTP 429 với mã lỗi concurrency. Semaphore xếp hàng chúng trong quá trình của riêng bạn. Hãy đặt nó thành 2 khi bạn đang dùng khóa dùng thử. Nếu bạn bật streaming, hãy nhớ rằng một yêu cầu streaming giữ slot của nó cho đến khi stream kết thúc.

Các lần thử lại đến từ SDK

SDK Python của OpenAI tự động thử lại khi gặp 429 và tuân thủ tiêu đề Retry-After, dịch vụ gửi dưới dạng Retry-After: 5 khi quá tải tạm thời. Đặt max_retries thành 4 để xử lý các đỉnh ngắn. Các yêu cầu thất bại hoặc bị từ chối không được tính phí, vì vậy việc thử lại không tốn token của bạn khi chúng thất bại.

Một nhân vật chia sẻ

Prompt hệ thống nằm ở đầu mỗi lệnh gọi. Các nhân vật theo kênh là một phần mở rộng nhỏ: bạn hãy giữ một từ điển từ ID kênh đến prompt và tra cứu nó trong ask.

Tạo một dự án mã nguồn mở tốt

Mã hoạt động, nhưng một kho lưu trữ công khai cần một vài thứ bổ sung trước khi người lạ có thể sử dụng nó.

  • Một giấy phép. MIT hoặc Apache 2.0 là những lựa chọn thông thường cho các bot nhỏ. Bạn hãy thêm tệp này vào gốc kho lưu trữ.
  • Một tệp .env.example. Liệt kê DISCORD_TOKEN và API_KEY với các giá trị giả để mọi người biết phải đặt gì.
  • Một Base URL có thể cấu hình. Đọc BASE_URL và MODEL từ môi trường, mặc định là các giá trị ở trên. Bất kỳ ai fork nó thì sau đó có thể sử dụng bất kỳ máy chủ tương thích OpenAI nào.
  • Một Dockerfile. Một tệp ngắn dựa trên hình ảnh Python slim, sao chép bot.py, cài đặt ba gói và chạy tập lệnh, cho phép mọi người lưu trữ nó ở bất cứ đâu.
  • Một README với cảnh báo về intents. Message Content intent bị thiếu là câu hỏi hỗ trợ hàng đầu cho mọi bot Discord.

Bạn hãy giữ token và khóa của riêng mình khỏi lịch sử Git. Nếu một cái bị rò rỉ, hãy thu hồi nó trong bảng điều khiển Discord hoặc trên trang khóa API và phát hành một cái mới.

Lưu trữ và chi phí

Bot là một quy trình chạy dài với mức sử dụng CPU nhẹ. Một VPS nhỏ, một máy tính dự phòng hoặc nền tảng container là đủ. Không có máy chủ web nào cần hiển thị vì bot kết nối ra Discord.

Chi phí API dễ tính toán. Một câu trả lời điển hình ở đây sử dụng 1.500 token đầu vào (prompt hệ thống cộng mười hai lượt ngắn) và 300 token đầu ra.

  • Đầu vào: 1.500 x $0,15 / 1M = $0,000225
  • Đầu ra: 300 x $0.50 / 1M = $0.00015
  • Mỗi câu trả lời: $0,000375

Điều đó có nghĩa là 1.000 phản hồi tốn $0,375 và 10.000 phản hồi tốn $3,75. Tín dụng dùng thử $0,50 đủ cho khoảng 1.333 phản hồi. Nạp tiền $20 đủ cho hơn 53.000. Các khoản nạp từ $20 đến $500, với +5% từ $50, +10% từ $100 và +15% từ $200. Tín dụng không bao giờ hết hạn và không có gói đăng ký, vì vậy một server yên tĩnh tốn gần như không đáng kể. Xem trang giá cả để biết chi tiết. Thanh toán chỉ bằng crypto, sử dụng USDT trên TRC20 hoặc USDC trên Base.

Đi tiếp ở đâu

Ba nâng cấp đáng để thực hiện. Thêm streaming bằng cách chỉnh sửa một tin nhắn duy nhất khi các chunk đến, nhưng hãy lưu ý giới hạn tốc độ chỉnh sửa của Discord. Thêm một lệnh slash để đặt lại lịch sử kênh. Thêm gọi công cụ để bot có thể tung xúc xắc hoặc tra cứu bảng nhân vật; API hỗ trợ tools, tool_choice và role: "tool" theo định dạng OpenAI.

Tài liệu API liệt kê mọi tham số được hỗ trợ, và bài viết Hermes API giải thích cách các mô hình không kiểm duyệt hoạt động bên trong một dự án. Các prompt gửi đến API không được dùng để huấn luyện, điều này đáng được ghi rõ trong quy tắc máy chủ của bạn nếu các thành viên yêu cầu.

Hỏi đáp

Bot có cần quyền Message Content không?

Có. Hãy bật nó trong cổng dành cho nhà phát triển của Discord và trong mã nguồn với intents.message_content được đặt thành true. Nếu không, bot sẽ thấy các tin nhắn rỗng.

Bot có thể xử lý bao nhiêu câu trả lời cùng lúc?

Một khóa đầy đủ cho phép 8 yêu cầu đồng thời và 300 mỗi phút; một khóa dùng thử cho phép 2 và 60. Một semaphore trong bot đảm bảo bạn duy trì dưới giới hạn.

Tôi có thể công bố mã nguồn của bot không?

Có, miễn là token Discord và khóa API không nằm trong kho lưu trữ. Đọc chúng từ biến môi trường và cung cấp file .env.example.

Có được sử dụng các chủ đề người lớn không?

Chỉ dành cho mục đích người lớn hợp pháp, phù hợp với quy tắc của Discord và cài đặt kênh dành riêng cho người lớn. Nội dung tình dục liên quan đến người chưa thành niên không bao giờ được phép.

Chi phí vận hành là bao nhiêu?

Một phản hồi với 1.500 token đầu vào và 300 token đầu ra tốn $0,000375, tức khoảng $3,75 cho 10.000 phản hồi, cộng thêm chi phí lưu trữ quá trình.

Khóa của bạn chỉ cách một bước điền mẫu

Tạo tài khoản, sao chép khóa, thay đổi URL cơ sở. Đó là toàn bộ thiết lập.

Lấy khóa API