|
|
|
import os
|
|
|
|
import traceback
|
|
|
|
import asyncio
|
|
|
|
import tempfile
|
|
|
|
from functools import partial
|
|
|
|
import discord
|
|
|
|
|
|
|
|
from gpt_index import GPTSimpleVectorIndex, SimpleDirectoryReader
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class Index_handler:
|
|
|
|
def __init__(self):
|
|
|
|
self.openai_key = os.getenv("OPENAI_TOKEN")
|
|
|
|
self.index_storage = {}
|
|
|
|
self.loop = asyncio.get_running_loop()
|
|
|
|
|
|
|
|
def index_file(self, file_path):
|
|
|
|
document = SimpleDirectoryReader(file_path).load_data()
|
|
|
|
index = GPTSimpleVectorIndex(document)
|
|
|
|
return index
|
|
|
|
|
|
|
|
|
|
|
|
async def set_index(self, ctx: discord.ApplicationContext, file: discord.Attachment, user_api_key):
|
|
|
|
if not user_api_key:
|
|
|
|
os.environ["OPENAI_API_KEY"] = self.openai_key
|
|
|
|
else:
|
|
|
|
os.environ["OPENAI_API_KEY"] = user_api_key
|
|
|
|
|
|
|
|
try:
|
|
|
|
temp_path = tempfile.TemporaryDirectory()
|
|
|
|
temp_file = tempfile.NamedTemporaryFile(suffix=".txt", dir=temp_path.name, delete=False)
|
|
|
|
await file.save(temp_file.name)
|
|
|
|
index = await self.loop.run_in_executor(None, partial(self.index_file, temp_path.name))
|
|
|
|
self.index_storage[ctx.user.id] = index
|
|
|
|
temp_path.cleanup()
|
|
|
|
await ctx.respond("Index set")
|
|
|
|
except Exception:
|
|
|
|
await ctx.respond("Failed to set index")
|
|
|
|
traceback.print_exc()
|
|
|
|
|
|
|
|
async def query(self, ctx: discord.ApplicationContext, query, user_api_key):
|
|
|
|
if not user_api_key:
|
|
|
|
os.environ["OPENAI_API_KEY"] = self.openai_key
|
|
|
|
else:
|
|
|
|
os.environ["OPENAI_API_KEY"] = user_api_key
|
|
|
|
|
|
|
|
if not self.index_storage[ctx.user.id]:
|
|
|
|
await ctx.respond("You need to set an index", ephemeral=True, delete_after=5)
|
|
|
|
return
|
|
|
|
|
|
|
|
index: GPTSimpleVectorIndex = self.index_storage[ctx.user.id]
|
|
|
|
response = await self.loop.run_in_executor(None, partial(index.query, query, verbose=True))
|
|
|
|
await ctx.respond(f"Query response: {response}")
|