import gradio as gr
from dotenv import load_dotenv
import os
load_dotenv()
import openai
from gptcall import generate
# Set your OpenAI API key
api_key = os.environ.get('OPEN_AI_KEY') # Replace with your actual API key
openai.api_key = api_key
hf = os.environ.get("HF_TOKEN")
server_error_msg = "**NETWORK ERROR DUE TO HIGH TRAFFIC. PLEASE REGENERATE OR REFRESH THIS PAGE.**"
def clear_history(request: gr.Request):
state = None
return ([], state, "")
def post_process_code(code):
sep = "\n```"
if sep in code:
blocks = code.split(sep)
if len(blocks) % 2 == 1:
for i in range(1, len(blocks), 2):
blocks[i] = blocks[i].replace("\\_", "_")
code = sep.join(blocks)
return code
def post_process_answer(answer):
answer += f"
"
answer = answer.replace("\n", "
")
return answer
def predict(
question: str,
system_content: str,
use_api: bool,
chatbot: list = [],
history: list = [],
):
try:
if use_api: # Check if API call is requested
history.append(question)
answer = generate(question)
history.append(answer)
else:
pass
# Ensure history has an even number of elements
if len(history) % 2 != 0:
history.append("")
chatbot = [(history[i], history[i + 1]) for i in range(0, len(history), 2)]
return chatbot, history
except Exception as e:
history.append("")
answer = server_error_msg + f" (error_code: 503)"
history.append(answer)
# Ensure history has an even number of elements
if len(history) % 2 != 0:
history.append("")
chatbot = [(history[i], history[i + 1]) for i in range(0, len(history), 2)]
return chatbot, history
def reset_textbox(): return gr.update(value="")
def main():
title = """
Chat with TxGpt 🤖
"""
css = """
@import url('https://fonts.googleapis.com/css2?family=Poppins:wght@400;700&display=swap');
/* Hide the footer */
footer .svelte-1lyswbr {
display: none !important;
}
/* Center the column container */
#prompt_container {
margin-left: auto;
margin-right: auto;
background: linear-gradient(to right, #48c6ef, #6f86d6); /* Gradient background */
padding: 20px; /* Decreased padding */
border-radius: 10px;
box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1);
color: black;
font-family: 'Poppins', sans-serif; /* Poppins font */
font-weight: 600; /* Bold font */
resize: none;
font-size: 18px;
}
/* Chatbot container styling */
#chatbot_container {
margin: 0 auto; /* Remove left and right margins */
max-width: 80%; /* Adjust the maximum width as needed */
background: linear-gradient(to right, #ff7e5f, #feb47b); /* Gradient background */
padding: 20px;
border-radius: 10px;
box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1);
}
/* Chatbot message area styling */
#chatbot .wrap.svelte-13f7djk {
height: 60vh; /* Adjusted height */
max-height: 60vh; /* Adjusted height */
border: 2px solid #007bff;
border-radius: 10px;
overflow-y: auto;
padding: 20px;
background-color: #e9f5ff;
}
/* User message styling */
#chatbot .message.user.svelte-13f7djk.svelte-13f7djk {
width: fit-content;
background: #007bff;
color: white;
border-bottom-right-radius: 0;
border-top-left-radius: 10px;
border-top-right-radius: 10px;
border-bottom-left-radius: 10px;
margin-bottom: 10px;
padding: 10px 15px;
font-size: 14px;
font-family: 'Poppins', sans-serif; /* Poppins font */
font-weight: 700; /* Bold font */
box-shadow: 0 4px 8px rgba(0, 0, 0, 0.2);
}
/* Bot message styling */
#chatbot .message.bot.svelte-13f7djk.svelte-13f7djk {
width: fit-content;
background: #e1e1e1;
color: black;
border-bottom-left-radius: 0;
border-top-right-radius: 10px;
border-top-left-radius: 10px;
border-bottom-right-radius: 10px;
margin-bottom: 10px;
padding: 10px 15px;
font-size: 14px;
font-family: 'Poppins', sans-serif; /* Poppins font */
font-weight: 700; /* Bold font */
box-shadow: 0 4px 8px rgba(0, 0, 0, 0.2);
}
/* Preformatted text styling */
#chatbot .pre {
border: 2px solid #f1f1f1;
padding: 10px;
border-radius: 5px;
background-color: #ffffff;
box-shadow: 0 4px 8px rgba(0, 0, 0, 0.05);
font-family: 'Poppins', sans-serif; /* Poppins font */
font-size: 14px;
font-weight: 400; /* Regular font */
}
/* General preformatted text styling */
pre {
white-space: pre-wrap; /* Since CSS 2.1 */
white-space: -moz-pre-wrap; /* Mozilla, since 1999 */
white-space: -pre-wrap; /* Opera 4-6 */
white-space: -o-pre-wrap; /* Opera 7 */
word-wrap: break-word; /* Internet Explorer 5.5+ */
font-family: 'Poppins', sans-serif; /* Poppins font */
font-size: 14px;
font-weight: 400; /* Regular font */
line-height: 1.5;
color: #333;
background-color: #f8f9fa;
padding: 10px;
border-radius: 5px;
}
/* Styling for accordion sections */
.accordion.svelte-1lyswbr {
background-color: #e9f5ff; /* Light blue background for accordions */
border: 1px solid #007bff;
border-radius: 10px;
padding: 10px;
box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1);
resize: both;
}
/* Prompt styling */
#prompt_title {
font-size: 24px;
margin-bottom: 10px;
resize= none;
}
/* Styling for Copy button */
.copy_button {
display: inline-block;
padding: 5px 10px;
margin: 5px 0;
font-size: 14px;
cursor: pointer;
color: #007bff;
border: 1px solid #007bff;
border-radius: 5px;
background-color: #ffffff;
transition: background-color 0.3s;
}
.copy_button:hover {
background-color: #007bff;
color: #ffffff;
}
"""
with gr.Blocks(css=css) as demo:
gr.HTML(title)
with gr.Row():
with gr.Column(elem_id="prompt_container", scale=0.3): # Separate column for prompt
with gr.Accordion("Description", open=True):
system_content = gr.Textbox(value="TxGpt talk to your local documents without internet. If you need information on public data, please enable the ChatGpt checkbox and start querying!",show_label=False,lines=5)
with gr.Column(elem_id="chatbot_container", scale=0.7): # Right column for chatbot interface
chatbot = gr.Chatbot(elem_id="chatbot", label="TxGpt")
question = gr.Textbox(placeholder="Ask something", show_label=False, value="")
state = gr.State([])
use_api_toggle = gr.Checkbox(label="Enable ChatGpt", key="use_api")
with gr.Row():
with gr.Column():
submit_btn = gr.Button(value="🚀 Send")
with gr.Column():
clear_btn = gr.Button(value="🗑️ Clear history")
question.submit(
predict,
[question, system_content, use_api_toggle, chatbot, state],
[chatbot, state],
concurrency_limit=10
)
submit_btn.click(
predict,
[question, system_content, chatbot, state],
[chatbot, state],
concurrency_limit=10
)
submit_btn.click(reset_textbox, [], [question], concurrency_limit=10)
clear_btn.click(clear_history, None, [chatbot, state, question], concurrency_limit=10)
question.submit(reset_textbox, [], [question], concurrency_limit=10)
#demo.launch(server_name=args.server_name, server_port=args.server_port, share=args.share, debug=args.debug)
demo.launch(share=True, server_name='0.0.0.0')
if __name__ == '__main__':
""" import argparse
parser = argparse.ArgumentParser()
parser.add_argument("--server-name", default="0.0.0.0")
parser.add_argument("--server-port", default=8071)
parser.add_argument("--share", action="store_true")
parser.add_argument("--debug", action="store_true")
parser.add_argument("--verbose", action="store_true")
args = parser.parse_args() """
main()