nova-cord/cord/chatbot.py

70 lines
2.2 KiB
Python
Executable file
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import os
import openai
import random
import embedder
from dotenv import load_dotenv
load_dotenv()
async def respond(interaction, prompt):
partial_message = await interaction.send('') # send an empty message
message = await partial_message.fetch() # gets the message that was send
openai.api_base = os.getenv('OPENAI_BASE')
openai.api_key = os.getenv('OPENAI_KEY')
model = os.getenv('OPENAI_MODEL')
async with interaction.channel.typing(): # show the "Typing..."
try:
completion = openai.ChatCompletion.create(
model=model,
messages=[
{'role': 'system', 'content': f"""You are a helpful Discord AI bot called "Nova". You're based on NovaAI\'s {model} model.
You were developed by *NovaAI* (website: https://nova-oss.com) in 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.
Have cool humour and be friendly. Precicesly follow the instructions of the user.
For programming code, always make use formatted code blocks like this:
```py
print("Hello")
```"""},
{'role': 'user', 'content': prompt}
],
temperature=0.6,
stream=True,
max_tokens=1000
)
except Exception as exc:
await embedder.error(interaction, 'Could not generate an AI response.', ephemeral=True)
raise exc
text = f"""### {interaction.user.mention}:
{prompt}
### NovaAI [`{model}`]:
"""
for event in completion: # loop through word generation in real time
try:
new_text = event['choices'][0]['delta']['content'] # newly generated word
except KeyError:
if not event['choices'][0].get('text'):
continue
if '[DONE]' in event['choices'][0]['text']:
break
text += new_text
if text and random.randint(0, 100) < 20:
await message.edit(content=text)
if text:
await message.edit(content=text)
await message.add_reaction('')