mirror of
https://github.com/NovaOSS/nova-cord.git
synced 2024-11-29 10:53:57 +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)
|