File size: 6,823 Bytes
8b97f99 a7b4db3 8b97f99 a7b4db3 8b97f99 a7b4db3 8b97f99 a7b4db3 8b97f99 a7b4db3 63271b3 a7b4db3 63271b3 892bcef 63271b3 8b97f99 a7b4db3 81e2902 a7b4db3 8b97f99 a7b4db3 8b97f99 a7b4db3 e6cee82 a7b4db3 8b97f99 a7b4db3 e6cee82 a7b4db3 e6cee82 a7b4db3 8b97f99 a7b4db3 e6cee82 a7b4db3 8b97f99 e96901a 8b97f99 e96901a a7b4db3 8b97f99 a7b4db3 e6cee82 a7b4db3 8b97f99 a7b4db3 8b97f99 a7b4db3 8b97f99 81e2902 8b97f99 a7b4db3 8b97f99 a7b4db3 8b97f99 a7b4db3 8b97f99 a7b4db3 8b97f99 a7b4db3 8b97f99 a7b4db3 8b97f99 a7b4db3 8b97f99 a7b4db3 8b97f99 a7b4db3 8b97f99 a7b4db3 8b97f99 a7b4db3 e6cee82 d60058e e6cee82 a7b4db3 e6cee82 81e2902 d60058e e6cee82 8b97f99 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 |
import gradio as gr
import openai
import fitz # PyMuPDF for PDF processing
import base64
# Store API Key
api_key = ""
# Function to update API Key
def set_api_key(key):
global api_key
api_key = key
return "API Key Set Successfully!"
# Function to interact with OpenAI API using conversation history
def query_openai(messages, temperature, top_p, max_output_tokens):
if not api_key:
return ["Please enter your OpenAI API key first."], messages
try:
openai.api_key = api_key # Set API Key dynamically
# Ensure valid values for OpenAI parameters
temperature = float(temperature) if temperature else 1.0
top_p = float(top_p) if top_p else 1.0
max_output_tokens = int(max_output_tokens) if max_output_tokens else 2048
response = openai.ChatCompletion.create(
model="gpt-4.5-preview",
messages=messages,
temperature=temperature,
top_p=top_p,
max_tokens=max_output_tokens
)
bot_response = response["choices"][0]["message"]["content"]
messages.append({"role": "assistant", "content": bot_response}) # Store bot response in history
return messages, messages # Return updated conversation
except Exception as e:
return [f"Error: {str(e)}"], messages
# Image URL Chat
def image_url_chat(image_url, text_query, messages, temperature, top_p, max_output_tokens):
if not image_url or not text_query:
return ["Please provide an image URL and a query."], messages
messages.append({"role": "user", "content": [
{"type": "image_url", "image_url": {"url": image_url}},
{"type": "text", "text": text_query}
]})
return query_openai(messages, temperature, top_p, max_output_tokens)
# Text Chat
def text_chat(text_query, messages, temperature, top_p, max_output_tokens):
if not text_query:
return ["Please enter a query."], messages
messages.append({"role": "user", "content": text_query})
return query_openai(messages, temperature, top_p, max_output_tokens)
# Image Chat
def image_chat(image_file, text_query, messages, temperature, top_p, max_output_tokens):
if image_file is None or not text_query:
return ["Please upload an image and provide a query."], messages
# Encode image as base64
with open(image_file, "rb") as img:
base64_image = base64.b64encode(img.read()).decode("utf-8")
image_data = f"data:image/jpeg;base64,{base64_image}"
messages.append({"role": "user", "content": [
{"type": "image_url", "image_url": {"url": image_data}},
{"type": "text", "text": text_query}
]})
return query_openai(messages, temperature, top_p, max_output_tokens)
# PDF Chat
def pdf_chat(pdf_file, text_query, messages, temperature, top_p, max_output_tokens):
if pdf_file is None or not text_query:
return ["Please upload a PDF and provide a query."], messages
doc = fitz.open(pdf_file)
text = "\n".join([page.get_text("text") for page in doc][:5]) # Extract text from first 5 pages
messages.append({"role": "user", "content": [
{"type": "text", "text": text},
{"type": "text", "text": text_query}
]})
return query_openai(messages, temperature, top_p, max_output_tokens)
# Function to clear chat history and reset parameters
def clear_chat():
return [], [], [], [], "", "", [], "", [], None, "", [], None, "", 1.0, 1.0, 2048
# Gradio UI Layout
with gr.Blocks() as demo:
gr.Markdown("## GPT-4.5 Preview Conversational Chatbot")
# API Key Input
with gr.Row():
api_key_input = gr.Textbox(label="Enter OpenAI API Key", type="password")
api_key_button = gr.Button("Set API Key")
api_key_output = gr.Textbox(label="API Key Status", interactive=False)
with gr.Row():
temperature = gr.Slider(0, 2, value=1.0, step=0.1, label="Temperature")
top_p = gr.Slider(0, 1, value=1.0, step=0.1, label="Top-P")
max_output_tokens = gr.Slider(0, 16384, value=2048, step=512, label="Max Output Tokens")
with gr.Tabs():
with gr.Tab("Image URL Chat"):
image_url = gr.Textbox(label="Enter Image URL")
image_query = gr.Textbox(label="Ask about the Image")
image_url_output = gr.Chatbot(label="Conversation History", elem_id="chatbot1")
image_url_button = gr.Button("Ask")
with gr.Tab("Text Chat"):
text_query = gr.Textbox(label="Enter your query")
text_output = gr.Chatbot(label="Conversation History", elem_id="chatbot2")
text_button = gr.Button("Ask")
with gr.Tab("Image Chat"):
image_upload = gr.File(label="Upload an Image", type="filepath")
image_text_query = gr.Textbox(label="Ask about the uploaded image")
image_output = gr.Chatbot(label="Conversation History", elem_id="chatbot3")
image_button = gr.Button("Ask")
with gr.Tab("PDF Chat"):
pdf_upload = gr.File(label="Upload a PDF", type="filepath")
pdf_text_query = gr.Textbox(label="Ask about the uploaded PDF")
pdf_output = gr.Chatbot(label="Conversation History", elem_id="chatbot4")
pdf_button = gr.Button("Ask")
# Clear chat button
clear_button = gr.Button("Clear Chat")
# Chat Histories
image_url_chat_history = gr.State([])
text_chat_history = gr.State([])
image_chat_history = gr.State([])
pdf_chat_history = gr.State([])
# Button Click Actions
api_key_button.click(set_api_key, inputs=[api_key_input], outputs=[api_key_output])
image_url_button.click(image_url_chat, [image_url, image_query, image_url_chat_history, temperature, top_p, max_output_tokens], [image_url_output, image_url_chat_history])
text_button.click(text_chat, [text_query, text_chat_history, temperature, top_p, max_output_tokens], [text_output, text_chat_history])
image_button.click(image_chat, [image_upload, image_text_query, image_chat_history, temperature, top_p, max_output_tokens], [image_output, image_chat_history])
pdf_button.click(pdf_chat, [pdf_upload, pdf_text_query, pdf_chat_history, temperature, top_p, max_output_tokens], [pdf_output, pdf_chat_history])
# Fix: Clear button resets all necessary fields correctly
clear_button.click(
clear_chat,
outputs=[
image_url_chat_history, text_chat_history, image_chat_history, pdf_chat_history,
image_url, image_query, image_url_output,
text_query, text_output,
image_upload, image_text_query, image_output,
pdf_upload, pdf_text_query, pdf_output,
temperature, top_p, max_output_tokens
]
)
# Launch Gradio App
if __name__ == "__main__":
demo.launch() |