From 37b363b317b948b6bb5f2c47725509e9822c0d5a Mon Sep 17 00:00:00 2001 From: Josh Knapp Date: Thu, 2 Jan 2025 17:22:32 -0800 Subject: [PATCH] adding V2 --- v2/.env.example | 4 ++ v2/bot.py | 94 +++++++++++++++++++++++++++++++++++++++++++++ v2/requirements.txt | 3 ++ 3 files changed, 101 insertions(+) create mode 100644 v2/.env.example create mode 100644 v2/bot.py create mode 100644 v2/requirements.txt diff --git a/v2/.env.example b/v2/.env.example new file mode 100644 index 0000000..513638f --- /dev/null +++ b/v2/.env.example @@ -0,0 +1,4 @@ +DISCORD_TOKEN=your_discord_bot_token +OPENAI_API_KEY=your_openai_api_key +OPENWEBUI_API_BASE=http://your.api.endpoint/v1 +MODEL_NAME="Your_Model_Name" diff --git a/v2/bot.py b/v2/bot.py new file mode 100644 index 0000000..e33a9c2 --- /dev/null +++ b/v2/bot.py @@ -0,0 +1,94 @@ +import os +import discord +from discord.ext import commands +import openai +from collections import deque +from dotenv import load_dotenv + +# Load environment variables +load_dotenv() + +# Get environment variables +DISCORD_TOKEN = os.getenv('DISCORD_TOKEN') +OPENAI_API_KEY = os.getenv('OPENAI_API_KEY') +OPENWEBUI_API_BASE = os.getenv('OPENWEBUI_API_BASE') +MODEL_NAME = os.getenv('MODEL_NAME') + +# Configure OpenAI +openai.api_key = OPENAI_API_KEY +openai.api_base = OPENWEBUI_API_BASE + +# Initialize Discord bot +intents = discord.Intents.default() +intents.message_content = True +intents.messages = True +bot = commands.Bot(command_prefix='!', intents=intents) + +# Message history cache +channel_history = {} + +async def get_chat_history(channel, limit=100): + messages = [] + async for message in channel.history(limit=limit): + messages.append(f"{message.author.name}: {message.content}") + return "\n".join(reversed(messages)) + +async def get_ai_response(context, user_message): + formatted_prompt = f"##CONTEXT##\n{context}\n##ENDCONTEXT##\n\n{user_message}" + + try: + response = openai.ChatCompletion.create( + model=MODEL_NAME, + messages=[ + {"role": "user", "content": formatted_prompt} + ] + ) + return response.choices[0].message.content + except Exception as e: + return f"Error: {str(e)}" + +@bot.event +async def on_ready(): + print(f'{bot.user} has connected to Discord!') + +@bot.event +async def on_message(message): + # Ignore messages from the bot itself + if message.author == bot.user: + return + + should_respond = False + + # Check if bot was mentioned + if bot.user in message.mentions: + should_respond = True + + # Check if message is a DM + if isinstance(message.channel, discord.DMChannel): + should_respond = True + + if should_respond: + async with message.channel.typing(): + # Get chat history + history = await get_chat_history(message.channel) + + # Remove bot mention from the message + user_message = message.content.replace(f'<@{bot.user.id}>', '').strip() + + # Get AI response + response = await get_ai_response(history, user_message) + + # Send response + await message.reply(response) + + await bot.process_commands(message) + +def main(): + if not all([DISCORD_TOKEN, OPENAI_API_KEY, OPENWEBUI_API_BASE, MODEL_NAME]): + print("Error: Missing required environment variables") + return + + bot.run(DISCORD_TOKEN) + +if __name__ == "__main__": + main() diff --git a/v2/requirements.txt b/v2/requirements.txt new file mode 100644 index 0000000..225bbeb --- /dev/null +++ b/v2/requirements.txt @@ -0,0 +1,3 @@ +discord.py +openai +python-dotenv