Discord-бот с AI может генерировать текст, анализировать изображения, помогать участникам сервера и автоматизировать модерацию. В этом руководстве мы создадим бота с slash-командами, используя discord.py и ModelSwitch API для доступа к GPT-4o и мультимодальным моделям.
Настройка проекта
Установите зависимости и создайте приложение в Discord Developer Portal:
pip install discord.py openai python-dotenv
# .env
DISCORD_TOKEN=ваш_токен_discord
MODELSWITCH_API_KEY=msk_ваш_ключ
MODELSWITCH_BASE_URL=https://api.modelswitch.ru/v1
При создании бота в Discord Developer Portal включите привилегированные intents: Message Content Intent и присвойте необходимые scopes (bot, applications.commands).
Бот со slash-командами
Создайте основной файл бота с обработкой slash-команд:
# bot.py
import os
import discord
from discord import app_commands
from openai import AsyncOpenAI
from dotenv import load_dotenv
load_dotenv()
intents = discord.Intents.default()
intents.message_content = True
client = discord.Client(intents=intents)
tree = app_commands.CommandTree(client)
ai_client = AsyncOpenAI(
base_url=os.environ["MODELSWITCH_BASE_URL"],
api_key=os.environ["MODELSWITCH_API_KEY"],
)
@tree.command(name="ask", description="Задать вопрос AI")
@app_commands.describe(
question="Ваш вопрос",
model="Модель AI (gpt-4o, claude-3.5-sonnet, gemini-2.0-pro)"
)
async def ask_command(
interaction: discord.Interaction,
question: str,
model: str = "gpt-4o"
):
await interaction.response.defer(thinking=True)
try:
response = await ai_client.chat.completions.create(
model=model,
messages=[
{"role": "system", "content": "Ты помощник на Discord-сервере. Отвечай кратко и по делу."},
{"role": "user", "content": question},
],
max_tokens=1500,
)
answer = response.choices[0].message.content or "Нет ответа."
# Discord ограничивает длину сообщения 2000 символами
if len(answer) > 1900:
answer = answer[:1900] + "..."
await interaction.followup.send(f"**Вопрос:** {question}
{answer}")
except Exception as e:
await interaction.followup.send(f"Ошибка: {str(e)}")
@client.event
async def on_ready():
await tree.sync()
print(f"Бот {client.user} запущен!")
client.run(os.environ["DISCORD_TOKEN"])
Анализ изображений
Добавьте команду для анализа прикреплённых изображений через мультимодальную модель GPT-4o:
@tree.command(name="analyze", description="Анализ изображения с помощью AI")
@app_commands.describe(prompt="Что нужно узнать об изображении")
async def analyze_command(
interaction: discord.Interaction,
image: discord.Attachment,
prompt: str = "Опиши это изображение подробно"
):
await interaction.response.defer(thinking=True)
if not image.content_type or not image.content_type.startswith("image/"):
await interaction.followup.send("Пожалуйста, прикрепите изображение.")
return
try:
response = await ai_client.chat.completions.create(
model="gpt-4o",
messages=[
{
"role": "user",
"content": [
{"type": "text", "text": prompt},
{"type": "image_url", "image_url": {"url": image.url}},
],
}
],
max_tokens=1000,
)
answer = response.choices[0].message.content or "Не удалось проанализировать."
await interaction.followup.send(f"**Анализ:** {answer}")
except Exception as e:
await interaction.followup.send(f"Ошибка: {str(e)}")
Контекст канала и модерация
Для более продвинутого бота можно добавить автоматическое резюмирование обсуждений, автоответы по ключевым словам и модерацию контента. ModelSwitch позволяет использовать разные модели для разных задач: например, GPT-4o-mini для быстрых автоответов и Claude для глубокого анализа.
Пример команды для резюмирования обсуждения:
@tree.command(name="summarize", description="Резюме последних сообщений в канале")
@app_commands.describe(count="Количество сообщений для анализа (макс. 50)")
async def summarize_command(interaction: discord.Interaction, count: int = 20):
await interaction.response.defer(thinking=True)
count = min(count, 50)
messages_text = []
async for msg in interaction.channel.history(limit=count):
if msg.content and not msg.author.bot:
messages_text.append(f"{msg.author.display_name}: {msg.content}")
messages_text.reverse()
context = "
".join(messages_text)
response = await ai_client.chat.completions.create(
model="gpt-4o-mini",
messages=[
{"role": "system", "content": "Составь краткое резюме обсуждения на русском языке."},
{"role": "user", "content": context},
],
)
await interaction.followup.send(f"**Резюме ({count} сообщений):**
{response.choices[0].message.content}")
Заключение
Discord-бот с AI через ModelSwitch открывает массу возможностей: от простого Q&A до анализа изображений и автоматической модерации. Единый API-ключ ModelSwitch позволяет комбинировать модели для разных задач без переписывания кода.