oceansweep's picture
Upload 169 files
c5b0bb7 verified
raw
history blame
13.3 kB
# Prompts_tab.py
# Description: This file contains the code for the prompts tab in the Gradio UI
#
# Imports
import html
import logging
#
# External Imports
import gradio as gr
#
# Local Imports
from App_Function_Libraries.DB.DB_Manager import fetch_prompt_details, list_prompts
#
####################################################################################################
#
# Functions:
def create_prompt_view_tab():
with gr.TabItem("View Prompt Database", visible=True):
gr.Markdown("# View Prompt Database Entries")
with gr.Row():
with gr.Column():
entries_per_page = gr.Dropdown(choices=[10, 20, 50, 100], label="Entries per Page", value=10)
page_number = gr.Number(value=1, label="Page Number", precision=0)
view_button = gr.Button("View Page")
previous_page_button = gr.Button("Previous Page", visible=True)
next_page_button = gr.Button("Next Page", visible=True)
pagination_info = gr.Textbox(label="Pagination Info", interactive=False)
prompt_selector = gr.Dropdown(label="Select Prompt to View", choices=[])
with gr.Column():
results_table = gr.HTML()
selected_prompt_display = gr.HTML()
# Function to view database entries
def view_database(page, entries_per_page):
try:
# Use list_prompts to get prompts and total pages
prompts, total_pages, current_page = list_prompts(page=int(page), per_page=int(entries_per_page))
table_html = "<table style='width:100%; border-collapse: collapse;'>"
table_html += "<tr><th style='border: 1px solid black; padding: 8px;'>Title</th><th style='border: 1px solid black; padding: 8px;'>Author</th></tr>"
prompt_choices = []
for prompt_name in prompts:
details = fetch_prompt_details(prompt_name)
if details:
title, author, _, _, _, _ = details
author = author or "Unknown" # Handle None author
table_html += f"<tr><td style='border: 1px solid black; padding: 8px;'>{html.escape(title)}</td><td style='border: 1px solid black; padding: 8px;'>{html.escape(author)}</td></tr>"
prompt_choices.append(prompt_name) # Using prompt_name as value
table_html += "</table>"
# Get total prompts if possible
total_prompts = total_pages * int(entries_per_page) # This might overestimate if the last page is not full
pagination = f"Page {current_page} of {total_pages} (Total prompts: {total_prompts})"
return table_html, pagination, total_pages, prompt_choices
except Exception as e:
return f"<p>Error fetching prompts: {e}</p>", "Error", 0, []
# Function to update page content
def update_page(page, entries_per_page):
results, pagination, total_pages, prompt_choices = view_database(page, entries_per_page)
page = int(page)
next_disabled = page >= total_pages
prev_disabled = page <= 1
return (
results,
pagination,
page,
gr.update(visible=True, interactive=not prev_disabled), # previous_page_button
gr.update(visible=True, interactive=not next_disabled), # next_page_button
gr.update(choices=prompt_choices)
)
# Function to go to the next page
def go_to_next_page(current_page, entries_per_page):
next_page = int(current_page) + 1
return update_page(next_page, entries_per_page)
# Function to go to the previous page
def go_to_previous_page(current_page, entries_per_page):
previous_page = max(1, int(current_page) - 1)
return update_page(previous_page, entries_per_page)
# Function to display selected prompt details
def display_selected_prompt(prompt_name):
details = fetch_prompt_details(prompt_name)
if details:
title, author, description, system_prompt, user_prompt, keywords = details
# Handle None values by converting them to empty strings
description = description or ""
system_prompt = system_prompt or ""
user_prompt = user_prompt or ""
author = author or "Unknown"
keywords = keywords or ""
html_content = f"""
<div style="border: 1px solid #ddd; padding: 10px; margin-bottom: 20px;">
<h3>{html.escape(title)}</h3> <h4>by {html.escape(author)}</h4>
<p><strong>Description:</strong> {html.escape(description)}</p>
<div style="margin-top: 10px;">
<strong>System Prompt:</strong>
<pre style="white-space: pre-wrap; word-wrap: break-word;">{html.escape(system_prompt)}</pre>
</div>
<div style="margin-top: 10px;">
<strong>User Prompt:</strong>
<pre style="white-space: pre-wrap; word-wrap: break-word;">{html.escape(user_prompt)}</pre>
</div>
<p><strong>Keywords:</strong> {html.escape(keywords)}</p>
</div>
"""
return html_content
else:
return "<p>Prompt not found.</p>"
# Event handlers
view_button.click(
fn=update_page,
inputs=[page_number, entries_per_page],
outputs=[results_table, pagination_info, page_number, previous_page_button, next_page_button, prompt_selector]
)
next_page_button.click(
fn=go_to_next_page,
inputs=[page_number, entries_per_page],
outputs=[results_table, pagination_info, page_number, previous_page_button, next_page_button, prompt_selector]
)
previous_page_button.click(
fn=go_to_previous_page,
inputs=[page_number, entries_per_page],
outputs=[results_table, pagination_info, page_number, previous_page_button, next_page_button, prompt_selector]
)
prompt_selector.change(
fn=display_selected_prompt,
inputs=[prompt_selector],
outputs=[selected_prompt_display]
)
def create_prompts_export_tab():
"""Creates a tab for exporting prompts database content with multiple format options"""
with gr.TabItem("Export Prompts", visible=True):
gr.Markdown("# Export Prompts Database Content")
with gr.Row():
with gr.Column():
export_type = gr.Radio(
choices=["All Prompts", "Prompts by Keyword"],
label="Export Type",
value="All Prompts"
)
# Keyword selection for filtered export
with gr.Column(visible=False) as keyword_col:
keyword_input = gr.Textbox(
label="Enter Keywords (comma-separated)",
placeholder="Enter keywords to filter prompts..."
)
# Export format selection
export_format = gr.Radio(
choices=["CSV", "Markdown (ZIP)"],
label="Export Format",
value="CSV"
)
# Export options
include_options = gr.CheckboxGroup(
choices=[
"Include System Prompts",
"Include User Prompts",
"Include Details",
"Include Author",
"Include Keywords"
],
label="Export Options",
value=["Include Keywords", "Include Author"]
)
# Markdown-specific options (only visible when Markdown is selected)
with gr.Column(visible=False) as markdown_options_col:
markdown_template = gr.Radio(
choices=[
"Basic Template",
"Detailed Template",
"Custom Template"
],
label="Markdown Template",
value="Basic Template"
)
custom_template = gr.Textbox(
label="Custom Template",
placeholder="Use {title}, {author}, {details}, {system}, {user}, {keywords} as placeholders",
visible=False
)
export_button = gr.Button("Export Prompts")
with gr.Column():
export_status = gr.Textbox(label="Export Status", interactive=False)
export_file = gr.File(label="Download Export")
def update_ui_visibility(export_type, format_choice, template_choice):
"""Update UI elements visibility based on selections"""
show_keywords = export_type == "Prompts by Keyword"
show_markdown_options = format_choice == "Markdown (ZIP)"
show_custom_template = template_choice == "Custom Template" and show_markdown_options
return [
gr.update(visible=show_keywords), # keyword_col
gr.update(visible=show_markdown_options), # markdown_options_col
gr.update(visible=show_custom_template) # custom_template
]
def handle_export(export_type, keywords, export_format, options, markdown_template, custom_template):
"""Handle the export process based on selected options"""
try:
# Parse options
include_system = "Include System Prompts" in options
include_user = "Include User Prompts" in options
include_details = "Include Details" in options
include_author = "Include Author" in options
include_keywords = "Include Keywords" in options
# Handle keyword filtering
keyword_list = None
if export_type == "Prompts by Keyword" and keywords:
keyword_list = [k.strip() for k in keywords.split(",") if k.strip()]
# Get the appropriate template
template = None
if export_format == "Markdown (ZIP)":
if markdown_template == "Custom Template":
template = custom_template
else:
template = markdown_template
# Perform export
from App_Function_Libraries.DB.Prompts_DB import export_prompts
status, file_path = export_prompts(
export_format=export_format.split()[0].lower(), # 'csv' or 'markdown'
filter_keywords=keyword_list,
include_system=include_system,
include_user=include_user,
include_details=include_details,
include_author=include_author,
include_keywords=include_keywords,
markdown_template=template
)
return status, file_path
except Exception as e:
error_msg = f"Export failed: {str(e)}"
logging.error(error_msg)
return error_msg, None
# Event handlers
export_type.change(
fn=lambda t, f, m: update_ui_visibility(t, f, m),
inputs=[export_type, export_format, markdown_template],
outputs=[keyword_col, markdown_options_col, custom_template]
)
export_format.change(
fn=lambda t, f, m: update_ui_visibility(t, f, m),
inputs=[export_type, export_format, markdown_template],
outputs=[keyword_col, markdown_options_col, custom_template]
)
markdown_template.change(
fn=lambda t, f, m: update_ui_visibility(t, f, m),
inputs=[export_type, export_format, markdown_template],
outputs=[keyword_col, markdown_options_col, custom_template]
)
export_button.click(
fn=handle_export,
inputs=[
export_type,
keyword_input,
export_format,
include_options,
markdown_template,
custom_template
],
outputs=[export_status, export_file]
)
#
# End of Prompts_tab.py
####################################################################################################