mirror of
https://github.com/NovaOSS/nova-cord.git
synced 2024-11-25 20:23:58 +01:00
131 lines
5 KiB
Python
131 lines
5 KiB
Python
import embedder
|
||
|
||
async def send(interaction, how_can_i):
|
||
if how_can_i == 'fix ModuleNotFoundErrors':
|
||
text = """You can install Python packages using `pip`. Here's an example: `pip install openai`.
|
||
Don't have `pip` installed? Learn more here: https://pip.pypa.io/en/stable/installation/.
|
||
"""
|
||
|
||
if how_can_i == 'use the Python library':
|
||
text = """For the official `openai` Python library, you just need to set the `openai.api_base` to `https://api.nova-oss.com/v1`.
|
||
```py
|
||
import openai
|
||
|
||
openai.api_key = "PUT_YOUR_NOVA_AI_API_KEY_IN_HERE"
|
||
openai.api_base = "https://api.nova-oss.com/v1"
|
||
|
||
completion = openai.ChatCompletion.create(
|
||
model="gpt-3.5-turbo",
|
||
messages=[
|
||
{"role": "system", "content": "You are a helpful assistant."},
|
||
{"role": "user", "content": "Hello!"}
|
||
]
|
||
)
|
||
|
||
print(completion.choices[0].message)
|
||
```
|
||
"""
|
||
|
||
if how_can_i == 'use curl':
|
||
text = """For curl, just follow the official OpenAI documentation: https://platform.openai.com/docs/api-reference/chat/create?lang=curl
|
||
And replace ~~`openai.com`~~ with **`nova-oss.com`**. Here's an example:
|
||
|
||
```bash
|
||
curl https://api.nova-oss.com/v1/chat/completions \
|
||
-H "Content-Type: application/json" \
|
||
-H "Authorization: Bearer PUT_YOUR_NOVA_AI_API_KEY_IN_HERE" \
|
||
-d '{
|
||
"model": "gpt-3.5-turbo",
|
||
"messages": [
|
||
{
|
||
"role": "user",
|
||
"content": "1+1"
|
||
}
|
||
]
|
||
}'
|
||
```
|
||
"""
|
||
|
||
if how_can_i == 'use Node.js':
|
||
text = """Currently, the official node.js `openai` package doesn't support custom endpoints in their stable version,
|
||
but will probably change after the release of v4.0.0: https://github.com/openai/openai-node/discussions/182#discussioncomment-6335703.
|
||
Meanwhile, you can just do "normal" requests like in curl without any package.
|
||
"""
|
||
|
||
if how_can_i == 'program a Python Discord Bot with streaming':
|
||
text = """I'm assuming you know how to run Discord bots in Python and have already set up a bot.
|
||
And if not - there are tons of tutorials out there on the internet on how to do that.
|
||
|
||
**Warning:** I'm using *Nextcord* as my package of choice for programming Discord bots, because it worked the best for me.
|
||
If you get an error saying that Nextcord isn't compatible with another package,
|
||
simply uninstall it using a command like `pip uninstall discord.py`.
|
||
|
||
Anyways, make sure you have all packages you need installed:
|
||
`pip install openai python-dotenv nextcord`.
|
||
|
||
We don't want our code to contain the secret API key and Discord bot token.
|
||
So create a `.env` file with the following content (obviously replace the values with the actual ones appropriately).:
|
||
|
||
```
|
||
NOVA_KEY=PUT_YOUR_NOVA_API_KEY_HERE
|
||
DISCORD_TOKEN=PUT_YOUR_DISCORD_BOT_TOKEN_HERE
|
||
```
|
||
|
||
And you should be good to go!
|
||
|
||
```py
|
||
import os
|
||
import openai
|
||
import nextcord
|
||
|
||
from dotenv import load_dotenv
|
||
|
||
load_dotenv() # reads our secret of our .env file and makes them accessible using os.getenv()
|
||
|
||
# add a new command
|
||
@bot.slash_command(description='Chat with AI')
|
||
async def chat(interaction: nextcord.Interaction,
|
||
# this makes it so people can enter their prompt when using the slash command
|
||
prompt: str = SlashOption(description='Chatbot Prompt', required=True)
|
||
):
|
||
partial_message = await interaction.send('') # just writes an empty message
|
||
message = await partial_message.fetch() # prepares this message to be used
|
||
|
||
# set the configuration for the AI access
|
||
openai.api_base = 'https://api.nova-oss.com/v1'
|
||
openai.api_key = os.getenv('NOVA_KEY')
|
||
|
||
async with interaction.channel.typing(): # so Discord displays the "[Bot name] is typing..." at the bottom
|
||
try:
|
||
completion = openai.ChatCompletion.create(
|
||
model='gpt-3.5-turbo',
|
||
messages=[{'role': 'user', 'content': prompt}],
|
||
stream=True # this is really important to get the streaming (realtime updates) to work
|
||
)
|
||
# from now on, we will get new completions in the background which are saved in the completion variable
|
||
except Exception as exc:
|
||
await interaction.send(':x: Error - could not generate an AI response. Look in the console.')
|
||
raise exc # so the error shows up in the console
|
||
|
||
# we want to save the text that was generated using the AI
|
||
text = ''
|
||
|
||
for event in completion: # loop through word generation in real time
|
||
try:
|
||
new_text = event['choices'][0]['delta']['content'] # add the newly generated word to the variable
|
||
except KeyError: # end or an error occured
|
||
break # stop the loop
|
||
|
||
text += new_text # ad the new word to the complete text variable
|
||
|
||
if text: # we get errors if the new text we're editing the message to is empty
|
||
await message.edit(content=text) # finally edit the message to include the entire new text
|
||
|
||
# put any code in here if you want anything to happen when the AI is done with the completion
|
||
|
||
# starts the Discord bot
|
||
bot.run(os.getenv('DISCORD_TOKEN'))
|
||
```
|
||
"""
|
||
return await embedder.info(interaction, text)
|