Arcana / app.py
Ocillus's picture
Update app.py
0d16b39 verified
raw
history blame
5.13 kB
import gradio as gr
import ssl
from openai import OpenAI
import time
import os
import shutil
# SSL configuration
try:
_create_unverified_https_context = ssl._create_unverified_context
except AttributeError:
pass
else:
ssl._create_default_https_context = _create_unverified_https_context
# OpenAI client setup
client = OpenAI(
base_url='https://api.openai-proxy.org/v1',
api_key='sk-Nxf8HmLpfIMhCd83n3TOr00TR57uBZ0jMbAgGCOzppXvlsx1',
)
# Retry logic for OpenAI API call
def openai_api_call(messages, retries=3, delay=5):
for attempt in range(retries):
try:
completion = client.chat.completions.create(
model="gpt-3.5-turbo",
messages=messages,
timeout=10 # Increase timeout
)
return completion.choices[0].message.content
except Exception as e:
print(f"Attempt {attempt + 1} failed: {e}")
time.sleep(delay)
return "Sorry, I am having trouble connecting to the server. Please try again later."
# Chatbot response function
def chatbot_response(message, history):
# Prepare the conversation history for the API
messages = [{"role": "system", "content": "You are a dynamic study resource database named Arcana. Your goal is to help students study and excel in their exams."}]
for human, assistant in history:
messages.append({"role": "user", "content": human})
messages.append({"role": "assistant", "content": assistant})
messages.append({"role": "user", "content": message})
# Get response from OpenAI API with retry logic
response = openai_api_call(messages)
return response
def upload_file(file):
foldername = 'cache'
if not os.path.exists(foldername):
os.mkdir(foldername)
file_path = os.path.join(foldername, os.path.basename(file.name))
shutil.copy(file.name, file_path)
return list_uploaded_files()
def list_uploaded_files():
foldername = 'cache'
if not os.path.exists(foldername):
return []
files = os.listdir(foldername)
return [[file] for file in files]
def refresh_files():
return list_uploaded_files()
# Create the Gradio interface for the chatbot
chatbot_interface = gr.ChatInterface(
chatbot_response,
chatbot=gr.Chatbot(height=300),
textbox=gr.Textbox(placeholder="Type your message here...", container=False, scale=7),
title="Review With Arcana",
description="ArcanaUI v0.7 - Chatbot",
theme="soft",
examples=[
"What is Hydrogen Bonding?",
"Tell me the difference between impulse and force.",
"Tell me a joke that Calculus students will know.",
"How should I review for the AP Biology Exam?"
],
cache_examples=False,
retry_btn=None,
undo_btn="Delete Previous",
clear_btn="Clear"
)
# Combine the interfaces using Tabs
with gr.Blocks() as demo:
gr.Markdown("# ArcanaUI v0.7")
with gr.Tabs():
with gr.TabItem("Welcome Page"):
gr.Markdown("""
# Welcome to ArcanaUI v0.7 by the Indexademics Team
Program Base Powered by StandardCAS™
## Introduction
Welcome to Arcana, your dynamic study resource database! Our goal is to help students like you excel in your exams by providing quick and accurate answers to your study questions.
## How to Use
- Navigate to the 'Chatbot' tab to ask your study-related questions.
- Type your question into the textbox and press Enter.
- The chatbot will respond with helpful information.
- Use the 'Delete Previous' button to remove the last interaction or 'Clear' to reset the chat.
## Works Cited
Below is a sample citation in BibTeX format:
```
@article{Fan2023CELSIA,
title={CELSIA-Nylon},
author={Chengjui Fan},
journal={Conf-MLA 2023},
year={2023},
volume={NAN},
number={NAN},
pages={NAN},
publisher={Conf-MLA}
}
@misc{Indexademics,
title={indexademics Chatbot},
author={NAN},
journal={SHSID},
year={2024},
volume={NAN},
number={NAN},
pages={NAN},
publisher={Peer Advisor(PA) SHSID}
}
```
""")
with gr.TabItem("Chatbot"):
chatbot_interface.render()
# File uploading interface
with gr.TabItem('Upload'):
gr.Markdown('# Upload and View Files')
refresh_button = gr.Button('Refresh')
upload_button = gr.UploadButton('Upload File')
uploaded_files_list = gr.DataFrame(headers=["Uploaded Files"])
refresh_button.click(fn=refresh_files, outputs=uploaded_files_list)
upload_button.upload(upload_file, inputs=upload_button, outputs=uploaded_files_list)
gr.Row([upload_button, refresh_button, uploaded_files_list])
# Launch the interface
demo.launch(share=True)