nova-cord/cord/bot.py

73 lines
2.2 KiB
Python
Raw Normal View History

2023-07-21 23:49:54 +02:00
# This example requires the 'members' and 'message_content' privileged intents to function.
import os
2023-07-23 23:57:41 +02:00
import openai
import nextcord
2023-07-21 23:49:54 +02:00
from dotenv import load_dotenv
2023-07-23 23:57:41 +02:00
from nextcord.ext import commands
from nextcord import SlashOption
2023-07-21 23:49:54 +02:00
load_dotenv()
2023-07-23 23:57:41 +02:00
bot = commands.Bot(
intents=nextcord.Intents.all(),
default_guild_ids=[int(guild_id) for guild_id in os.getenv('DISCORD_GUILD_IDS').split()]
)
2023-07-21 23:49:54 +02:00
@bot.event
async def on_ready():
print(f'Online as {bot.user} (ID: {bot.user.id})')
2023-07-23 23:57:41 +02:00
await bot.change_presence(activity=nextcord.Game(name='with fire'))
2023-07-21 23:49:54 +02:00
@bot.event
async def on_message(message):
await bot.process_commands(message)
2023-07-23 23:57:41 +02:00
@bot.slash_command(description='Chat with AI')
async def chat(interaction: nextcord.Interaction,
prompt: str = SlashOption(description='AI Prompt', required=True)
):
partial_message = await interaction.send('') # empty message
message = await partial_message.fetch()
openai.api_base = os.getenv('OPENAI_BASE', 'https://api.openai.com/v1')
openai.api_key = os.getenv('OPENAI_KEY')
model = os.getenv('OPENAI_MODEL')
async with interaction.channel.typing(): # show the "Typing..."
completion = openai.ChatCompletion.create(
model=model,
messages=[
{'role': 'system', 'content': f"""You are a helpful Discord AI bot based on OpenAI\'s {model} model called "Nova".
You were developed by NovaAI (website: nova-oss.com) in July of 2023, but your knowledge is limited to mid-2021.
Respond using Markdown. Keep things simple and short and directly do what the user says without any fluff.
For programming code, always make use formatted code blocks like this:
```py
print("Hello")
```
"""},
{'role': 'user', 'content': prompt}
],
temperature=0.6,
stream=True
)
text = ''
for event in completion: # loop through word generation in real time
try:
new_text = event['choices'][0]['delta']['content'] # newly generated word
except KeyError: # end
break
text += new_text
if text:
await message.edit(content=text)
await message.add_reaction('')
2023-07-21 23:49:54 +02:00
bot.run(os.getenv('DISCORD_TOKEN'))