Ubuntu TechHive
building-a-discord-bot-using-open-ai-and-python.md
Building a Discord Bot Using Open AI and python
article.détail

Building a Discord Bot Using Open AI and python

reading.progression 16 min de lecture

Créer un bot Discord en utilisant Open AI et Python

Discord

Discord est une plateforme de communication polyvalente initialement conçue pour les joueurs, mais qui a depuis étendu son attrait à un éventail plus large de communautés et de groupes en ligne. Elle offre un riche ensemble de fonctionnalités visant à favoriser l'interaction et à construire des communautés par le biais de la communication textuelle, vocale et vidéo.

Fonctionnalités Clés de Discord :- Serveurs et Canaux :

  • Serveurs : Les serveurs Discord sont comme des centres communautaires individuels où des groupes de personnes peuvent se réunir pour communiquer et partager du contenu. Chaque serveur peut être subdivisé en plusieurs canaux.

  • Canaux : Ce sont des zones spécifiques au sein d'un serveur désignées pour des sujets particuliers ou des types d'interaction. Les canaux peuvent être basés sur le texte ou la voix, et les administrateurs de serveur peuvent créer plusieurs canaux pour organiser efficacement les discussions.

  • Communication Vocale et Vidéo :

  • Les utilisateurs peuvent rejoindre des salons vocaux où ils peuvent parler avec d'autres personnes à l'aide de leur microphone, partager leur écran ou même discuter en vidéo. Cette fonctionnalité est particulièrement populaire parmi les joueurs pour coordonner les activités en jeu, mais elle est également utilisée pour les réunions virtuelles, les cours en direct et les discussions vocales informelles.

  • Messagerie Texte :

  • Les salons textuels permettent aux utilisateurs de communiquer via des messages tapés. Ces salons prennent en charge le formatage de texte enrichi, les messages directs, les mentions et les médias intégrés (images, vidéos et liens).

  • Intégration et Bots :

  • Discord prend en charge l'intégration avec d'autres services comme Spotify, Twitch et de nombreux services de jeux, améliorant l'expérience utilisateur en permettant des activités telles que la diffusion de musique en continu, le partage de statistiques de jeu ou la diffusion en direct de parties.

  • Les bots sont une autre fonctionnalité puissante de Discord, qui peuvent automatiser des tâches, gérer les activités du serveur ou même ajouter des éléments interactifs amusants pour les utilisateurs.

  • Rôles et autorisations :

  • Discord permet une personnalisation étendue des rôles et des autorisations des utilisateurs au sein d'un serveur. Les administrateurs peuvent attribuer des rôles avec des autorisations spécifiques qui contrôlent qui peut accéder à certains canaux, modifier les paramètres du serveur ou gérer d'autres utilisateurs.

  • Sécurité et confidentialité :

  • Discord offre des contrôles de confidentialité et des fonctionnalités de sécurité robustes, y compris l'authentification à deux facteurs, des outils de modération et la possibilité de contrôler qui peut envoyer des messages directs ou vous ajouter comme ami.

  • Utilisation multiplateforme :

  • Discord est accessible via des applications de bureau pour Windows, macOS et Linux, des applications mobiles pour Android et iOS, et peut également être exécuté directement dans les navigateurs web, ce qui le rend largement accessible.

OpenAI

OpenAI est une organisation de recherche en intelligence artificielle qui vise à promouvoir et développer une IA amicale de manière à bénéficier à l'humanité dans son ensemble. Fondée en décembre 2015 par Elon Musk, Sam Altman et d'autres, OpenAI a initialement débuté comme une entité à but non lucratif, mais a ensuite formé une branche à profit plafonné pour attirer des investissements extérieurs.

Les aspects clés d'OpenAI incluent :

  • Recherche et Développement : OpenAI mène des recherches de pointe en IA et en apprentissage automatique, en se concentrant sur le développement de technologies et de capacités d'IA avancées.

  • Sécurité et Éthique : Une partie essentielle de la mission d'OpenAI est de s'assurer que les technologies d'IA sont développées de manière sûre et éthique, avec les risques potentiels gérés de manière responsable.

  • Modèles GPT : OpenAI est bien connue pour ses modèles Generative Pre-trained Transformer (GPT), qui sont capables d'effectuer un large éventail de tâches de traitement du langage naturel.

  • Collaboration et Licences : OpenAI collabore avec diverses organisations et entreprises et propose des versions commerciales de ses modèles d'IA, tels que GPT-3, via des services d'API.

Replit

Replit (anciennement Repl.it) est un environnement de développement intégré (IDE) en ligne qui permet aux utilisateurs d'écrire, d'exécuter et de partager du code en ligne. C'est un outil puissant pour les développeurs, les éducateurs et les étudiants, conçu pour rendre le codage plus accessible et collaboratif. Replit prend en charge un large éventail de langages de programmation, y compris Python, JavaScript, Ruby, C++, et bien d'autres.

Fonctionnalités Clés de Replit :- Configuration Instantanée de l'IDE :

  • Zéro Installation : Replit fonctionne entièrement dans le navigateur, éliminant le besoin d'installer des logiciels ou de gérer des dépendances sur votre machine locale.

  • Prise en charge de nombreuses langues : Replit prend en charge plus de 50 langages de programmation, vous permettant de basculer entre les projets et les langages sans aucune configuration supplémentaire.

  • Codage collaboratif :

  • Collaboration en temps réel : Similaire à Google Docs, Replit permet à plusieurs utilisateurs de coder simultanément dans le même environnement. Cette fonctionnalité est particulièrement utile pour la programmation en binôme, l'enseignement ou la résolution collaborative de problèmes.

  • Mode multijoueur : Ce mode permet une collaboration en temps réel avec d'autres utilisateurs, y compris une fonction de chat pour discuter du code directement au sein de l'IDE.

  • Hébergement et déploiement :

  • Déploiement instantané : Replit fournit des services d'hébergement, ce qui signifie que vous pouvez développer et déployer des applications web directement depuis la plateforme. Il génère une URL publique et en direct pour chaque projet.

  • Repls toujours actifs : Pour les utilisateurs payants, Replit offre la possibilité de maintenir les applications toujours en cours d'exécution, même lorsque vous fermez le navigateur, ce qui est excellent pour les bots, les applications web et autres services continus.

  • Contrôle de version :

  • Support Git intégré : Replit intègre Git, permettant aux utilisateurs de pousser et de tirer depuis n'importe quel dépôt Git externe. Cette intégration facilite le contrôle de version et le partage de code via des plateformes comme GitHub.

  • Outils éducatifs :

  • Gestion de classe : Les éducateurs peuvent gérer les devoirs de codage, fournir des commentaires et suivre les progrès des étudiants directement dans Replit. Il est largement utilisé dans les milieux éducatifs en raison de sa facilité d'utilisation et de sa configuration minimale.

  • Modèles et exemples : Replit propose une gamme de modèles et de projets d'exemple qui peuvent aider les utilisateurs à démarrer rapidement avec de nouveaux langages ou frameworks.

  • Environnement Nix :

  • Environnements Personnalisables : Les utilisateurs avancés peuvent personnaliser leur environnement de codage à l'aide de Nix, un puissant outil de gestion de paquets. Cette fonctionnalité permet aux développeurs de définir des environnements de projet précis qui incluent des dépendances système spécifiques.

  • Prise en charge de base de données intégrée :

  • Base de données intégrée : Replit inclut une fonctionnalité de base de données intégrée pour un stockage simple clé-valeur, ce qui est utile pour les applications qui ont besoin de persister des données sans configurer de base de données externe.

Meilleures utilisations de Replit :- Prototypage rapide : Prototyper rapidement des applications sans se soucier de la configuration de l'environnement.

  • Apprentissage et éducation : Idéal pour les salles de classe et l'auto-apprentissage, grâce à son accessibilité et sa facilité d'utilisation.

  • Entretiens techniques : Mener facilement des entretiens de codage et des évaluations avec des sessions partagées.

  • Hackathons *: Démarrez des projets rapidement lors de hackathons sans perdre de temps sur la configuration.

Démonstration

Note latérale :

Async & await

En Python, async et await sont des mots-clés utilisés pour définir et gérer le code asynchrone, qui est un code qui vous permet d'effectuer des opérations de longue durée sans bloquer l'exécution de votre programme. Ceci est particulièrement utile pour les tâches liées aux E/S et au réseau, comme l'envoi de requêtes réseau, la lecture ou l'écriture de fichiers, etc., où le programme passe la majeure partie de son temps à attendre des événements externes.

Voici une explication détaillée de ces deux mots-clés et de leur fonctionnement en Python :

  • Le mot-clé async

  • Définir des fonctions asynchrones : Le mot-clé async est utilisé pour déclarer une fonction comme une "fonction asynchrone". Cela signifie que la fonction est non bloquante et renvoie un objet awaitable, spécifiquement un objet asyncio.Future. Une fonction asynchrone est définie en utilisant la syntaxe async def :

async def fetch_data():
       # function body

En déclarant une fonction avec async def, vous indiquez à Python que cette fonction peut effectuer des opérations asynchrones et peut être mise en pause et reprise.

  • Le mot-clé await

  • Mettre en pause et reprendre l'exécution : Le mot-clé await est utilisé au sein d'une fonction asynchrone pour suspendre l'exécution de la fonction jusqu'à ce que l'objet awaitable (comme ceux renvoyés par d'autres fonctions asynchrones) soit résolu. Cela permet à la fonction d'attendre qu'un résultat soit disponible tout en permettant à d'autres tâches de s'exécuter pendant ce temps.

async def fetch_data():
       data = await some_async_function()
       return data

Dans cet exemple,some_async_function()est une autre fonction asynchrone, etawaitmet en pausefetch_data()jusqu'à ce quesome_async_function()termine sa tâche et renvoie des données.

  • Commentasyncetawaitfonctionnent ensemble

  • Concurrence: Ensemble,asyncetawaitoffrent un moyen d'écrire du code concurrent en Python. En utilisant ces mots-clés, vous pouvez maintenir la réactivité de votre application en permettant à Python de gérer d'autres tâches en attendant que les opérations d'E/S se terminent. Il ne s'agit pas d'une exécution parallèle mais d'une exécution concurrente (via le multitâche coopératif).

  • Boucle d'événements : Le concept fondamental derrièreasyncetawaitest la boucle d'événements, qui est fournie par la bibliothèqueasyncioen Python. La boucle d'événements gère et distribue l'exécution de différentes tâches. Elle garde une trace de toutes les tâches en cours d'exécution et reprend les fonctions mises en pause parawaitdès que leurs opérations attendues sont terminées.

Exemple d'utilisation

Voici un exemple simple utilisantasynciopour effectuer une tâche de manière asynchrone :

import asyncio

async def main():
    print("Hello")
    await asyncio.sleep(1)  # Veille asynchrone, ne bloque pas la boucle d'événements
    print("world")

# Exécution de la fonction principale asynchrone
asyncio.run(main())

Applications pratiques

  • Développement Web : Dans les serveurs web et les applications web,asyncetawaitpermettent de gérer plusieurs requêtes web simultanément. Cela rend la gestion des charges élevées et l'exécution de multiples requêtes réseau efficaces.

  • Collecte de données : Ils sont utiles dans les scénarios où des données doivent être collectées à partir de plusieurs sources sur Internet, telles que des API ou des bases de données, sans attendre que chaque tâche se termine séquentiellement.

Étape 0 Bonjour Bot !

  • Étape 1 : Installer discord.py

Tout d'abord, vous devez installer la bibliothèque discord.py. Vous pouvez utiliser Rye comme gestionnaire de paquets.

  • Étape 2 : Configurer votre bot Discord

Allez sur le portail des développeurs Discord (https://discord.com/developers/applications). Créez une nouvelle application et donnez-lui un nom. Allez dans l'onglet Bot et cliquez sur "Ajouter un bot". Copiez le jeton qui est généré. Vous aurez besoin de ce jeton pour exécuter votre bot.

  • Étape 3 : Écrire le script Python

Créez un script Python qui utilise le jeton du bot pour se connecter et répondre aux messages. Ci-dessous, un exemple de base d'un bot qui répond à des commandes simples :

Variables d'environnement

import discord
import os
from dotenv import load_dotenv

# Charger les variables d'environnement depuis le fichier .env
load_dotenv()

intents = discord.Intents.default()
intents.messages = True

client = discord.Client(intents=intents)

@client.event
async def on_ready():
    print(f'Logged in as {client.user}')

@c*lient.event
async def on_message(message):
    # ne pas laisser le bot se répondre à lui-même
    if message.author == client.user:
        return

elif message.content.startswith('!hello'):
        await message.channel.send('Hello!')

elif message.content.startswith('hi'):
        await message.channel.send('welcome!')

elif message.content.startswith('what is the best meetup up there?'):
        await message.channel.send('The Ubuntu Tech Hive :)')

elif message.content.startswith('!bye'):
        await message.channel.send('Goodbye!')

else:
        await message.channel.send("Je n'ai pas compris votre demande !!")

client.run(os.environ ["DISCORD_TOKEN"])import math  # importation de la bibliothèque mathématique

Ce qui a été utilisé :

  • dotenv api

  • Disord token

  • Discord api bot

  • Python3

Limitations

  • Le bot ne peut pas interagir.

  • Ne répond qu'à des invites spécifiques basées sur une condition

  • Pas très utile

Étape 1 Rendons le bot plus utile

Outils nécessaires : OpenAi api dotenv api Disord token Python3

import discord
import my_openai
import os
from dotenv import load_dotenv

# Charger les variables d'environnement depuis le fichier .env
load_dotenv()

intents = discord.Intents.default()
intents.messages = True

client = discord.Client(intents=intents)

@client.event
async def on_ready():
    print(f'Connecté en tant que {client.user}')

@client.event
async def on_message(message):
# ne laissez pas le bot se répondre à lui-même
if message.author == client.user:
return

if message.content.startswith('$hello'):
await message.channel.send('Bonjour, comment puis-je vous aider ?')

Vérifie si le message commence par un mot-clé de question

if message.content.startswith('!ask'):
    # Supprime la partie de la commande et les espaces blancs au début/à la fin
    user_question = message.content [len('!ask'):].strip()

if user_question:

try:
response = my_openai.generate_answer(message.content)
await message.channel.send("Accrochez-vous ! Je cherche la réponse...")
await message.channel.send(response)

except Exception as e:
await message.channel.send(f"Erreur lors du traitement de votre requête : {str(e)}")
else:
await message.channel.send("Veuillez fournir une question après !ask")

if message.content.startswith('$question'):
response = my_openai.generate_answer(message.content)
await message.channel.send("recherche de réponse")
await message.channel.send(response)

Remplacez 'your_token_here' par le jeton réel de votre bot

client.run(os.environ ["DISCORD_TOKEN"])


from openai import OpenAI
import os

Configurez vos identifiants d'API OpenAI

client = OpenAI(
# Ceci est la valeur par défaut et peut être omis
api_key=os.environ ["OPENAI_TOKEN"],
)

MODEL = "gpt-3.5-turbo"
# Define the function to generate answers
def generate_answer(question):
    response = client.chat.completions.create(
        model=MODEL,
        messages= [
            {"role": "system", "content": "You are a helpful assistant in a discord server answering question and being helpful."},
            {"role": "user", "content": question},
        ],
        temperature=0,
    )

return response.choices [0].message.content

Limitations

  • Le bot est toujours local

  • Pas utile pour notre Ubuntu ou qui que ce soit d'autre

  • Pas d'état à sauvegarder

Ce qui a été utilisé :

  • dotenv api

  • Disord token

  • Discord api bot

  • Python3

  • openai api key

Étape 2 : Déployons, Présentation de Replit

import discord
import my_openai
import os
from dotenv import load_dotenv

# Load environment variables from .env file
load_dotenv()

intents = discord.Intents.default()
intents.messages = True

client = discord.Client(intents=intents)

@client.event
async def on_ready():
print(f'Logged in as {client.user}')

@client.event
async def on_message(message):
# ne laissez pas le bot se répondre à lui-même
if message.author == client.user:
return

if message.content.startswith('$hello'):
await message.channel.send('Bonjour, comment puis-je vous aider ?')

Vérifiez si le message commence par un mot-clé de question

if message.content.startswith('!ask'):
    # Remove the command part and strip leading/trailing whitespace
    user_question = message.content [len('!ask'):].strip()

if user_question:

try:
response = my_openai.generate_answer(message.content)
await message.channel.send("Accrochez-vous ! Je cherche la réponse...")
await message.channel.send(response)

except Exception as e:
await message.channel.send(f"Erreur lors du traitement de votre requête : {str(e)}")
else:
await message.channel.send("Veuillez poser une question après !ask")

if message.content.startswith('$question'):
response = my_openai.generate_answer(message.content)
await message.channel.send("recherche de réponse")
await message.channel.send(response)

Remplacez 'your_token_here' par le jeton réel de votre bot

client.run(os.environ ["DISCORD_TOKEN"])


from replit import db

URL et leurs clés personnalisées correspondantes

urls = {
"deep-dive-into-rag-with-langchain": "https://dev.ubuntuhive.tech/en-us/articles/deep-dive-into-rag-with-langchain/",
"exploring-new-chatgpt-features": "https://dev.ubuntuhive.tech/en-us/articles/exploring-new-chatgpt-features-/",
"build-small-apps-with-llms": "https://dev.ubuntuhive.tech/en-us/articles/build-small-apps-with-llms/",
"docker-orchestra-swarm-k8s-kubernetes-for-beginners": "https://dev.ubuntuhive.tech/en-us/articles/docker-orchestra-swarm-k8s-kubernetes-for-beginners/",
"devops-from-scratch-automated-basics": "https://dev.ubuntuhive.tech/en-us/articles/devops-from-scratch-automated-basics/",
"from-networks-to-http-and-apis": "https://dev.ubuntuhive.tech/en-us/articles/from-networks-to-http-and-apis/",

"data-and-cloud-infrastructure-as-code": "https://dev.ubuntuhive.tech/en-us/articles/data-and-cloud-infrastructure-as-code/"
}

Stocker dans la base de données sous la clé 'articles'

db ["articles"] = urls


from openai import OpenAI
import os

Set up your OpenAI API credentials

my_api_key = ''

client = OpenAI(
# This is the default and can be omitted
api_key=os.environ ["OPENAI_TOKEN"],
)

MODEL = "gpt-3.5-turbo"

Define the function to generate answers

def generate_answer(question):

example with a system message

response = client.chat.completions.create(
    model=MODEL,
    messages= [
        {"role": "system", "content": "You are a helpful assistant in a discord server answering question and being helpful."},
        {"role": "user", "content": question},
    ],
    temperature=0,
)

return response.choices [0].message.content


**Ce qui a été utilisé :**

- API dotenv

- Jeton Discord

- Bot API Discord

- Python3

- Clé API OpenAI

- Replit

## Étape 3 Accueillir les nouveaux membres

import discord
import my_openai as opai
import os
from discord.ext import commands
from replit import db
from dotenv import load_dotenv

Load environment variables from .env file

load_dotenv()

intents = discord.Intents.default()
intents.message_content = True

Initialize the Discord bot

bot = commands.Bot(command_prefix='!',intents=intents)

@bot.event
async def on_ready():
print(f'Logged in as {bot.user}!')

@bot.command(help="Ask the user what kind of summary they are looking for.")
async def choose_article(ctx):
# Retrieve the articles from the Replit database
articles = db ["articles"]
# Create a message with options
options = "\n".join([f"Send {idx+1} for {key.replace('-', ' ').title()}" for idx, key in enumerate(articles.keys())])
prompt = "Please choose from the below list:\n" + options
await ctx.send(prompt)

Fonction de vérification pour valider le choix de l'utilisateur

def check(m):
    return m.author == ctx.author and m.content.isdigit() and 1 <= int(m.content) <= len(articles)

try:
# Attendre la réponse de l'utilisateur
msg = await bot.wait_for('message', check=check, timeout=60.0) # 60 secondes pour répondre
choice = int(msg.content) - 1
selected_key = list(articles.keys()) [choice]
selected_article = articles [selected_key]
# Vous pouvez ajouter des fonctionnalités supplémentaires ici pour résumer l'article
await ctx.send(f"Vous avez sélectionné : {selected_key.replace('-', ' ').title()}\nURL : {selected_article}")
await ctx.send("Veuillez patienter pendant que je vous prépare le résumé...")
await ctx.send(opai.generate_summary(selected_article))

except Exception as e:
await ctx.send('Aucune entrée valide reçue ou délai d'attente atteint. Veuillez réessayer.')

@bot.command(help="Envoie un message de bienvenue avec des ressources utiles.")
async def new_member(ctx):
articles = db ["articles"]
most_recent_article_key = list(articles.keys()) [-1] # Obtention de la clé de l'article le plus récent
most_recent_article_url = articles [most_recent_article_key] # Obtention de l'URL

Message de bienvenue et ressources

welcome_message = (
    f"Bienvenue sur le serveur, {ctx.author.mention} ! 🎉 Voici quelques ressources qui pourraient vous être utiles :\n"
    f"1. Consultez notre dernier article : {most_recent_article_url}\n"
    f"2. Visitez notre site web Ubuntu Hive pour plus d'informations : https://dev.ubuntuhive.tech/en-us/\n"
    f"3. Apprenez-en davantage sur la technologie avec ce tutoriel complet : [Insérez votre lien de tutoriel ici]\n"
    f"4. Autres ressources et informations diverses : [Insérez plus de liens ou d'informations ici]\n"
)

await ctx.send(welcome_message)

Exécuter le bot

token = os.getenv("DISCORD_TOKEN")
if token:
bot.run(token)
else:
print("Erreur : Le jeton Discord n'a pas été trouvé dans les variables d'environnement. Veuillez vous assurer que DISCORD_TOKEN est défini.")


from replit import db

URL et leurs clés personnalisées correspondantes

urls = {
"deep-dive-into-rag-with-langchain": "https://dev.ubuntuhive.tech/en-us/articles/deep-dive-into-rag-with-langchain/",
"exploring-new-chatgpt-features": "https://dev.ubuntuhive.tech/en-us/articles/exploring-new-chatgpt-features-/",
"build-small-apps-with-llms": "https://dev.ubuntuhive.tech/en-us/articles/build-small-apps-with-llms/",
"docker-orchestra-swarm-k8s-kubernetes-for-beginners": "https://dev.ubuntuhive.tech/en-us/articles/docker-orchestra-swarm-k8s-kubernetes-for-beginners/",
"devops-from-scratch-automated-basics": "https://dev.ubuntuhive.tech/en-us/articles/devops-from-scratch-automated-basics/",
"from-networks-to-http-and-apis": "https://dev.ubuntuhive.tech/en-us/articles/from-networks-to-http-and-apis/",

"data-and-cloud-infrastructure-as-code": "https://dev.ubuntuhive.tech/en-us/articles/data-and-cloud-infrastructure-as-code/"
}

Stocker dans la base de données sous la clé 'articles'

db ["articles"] = urls


from openai import OpenAI
import os

Set up your OpenAI API credentials

my_api_key = ''

client = OpenAI(
# This is the default and can be omitted
api_key=os.environ ["OPENAI_TOKEN"],
)

MODEL = "gpt-3.5-turbo"

Define the function to generate answers

def generate_answer(question):

example with a system message

response = client.chat.completions.create(
    model=MODEL,
    messages= [
        {"role": "system", "content": "Vous êtes un assistant utile dans un serveur Discord, répondant aux questions et étant serviable."},
        {"role": "user", "content": question},
    ],
    temperature=0,
)

return response.choices [0].message.content

def generate_summary(articles):
response = client.chat.completions.create(
model=MODEL,
messages= [
{"role": "system", "content": "You are a helpful assistant in a discord server. You are great as providing summaries of text when given an article link. when prompted, provide a max of 200 words summary of the provided link"},
{"role": "user", "content": articles},
],
temperature=0,
)

return response.choices [0].message.content

Liens importants