# Description: Gradio UI for Creating and Testing new Prompts
#
# Imports
import logging
import gradio as gr
from App_Function_Libraries.Chat.Chat_Functions import chat
from App_Function_Libraries.DB.DB_Manager import add_or_update_prompt
from App_Function_Libraries.Prompt_Engineering.Prompt_Engineering import generate_prompt, test_generated_prompt
from App_Function_Libraries.Utils.Utils import format_api_name, global_api_endpoints, default_api_endpoint
#
# Local Imports
#
########################################################################################################################
#
# Functions
# Gradio tab for prompt suggestion and testing
def create_prompt_suggestion_tab():
try:
default_value = None
if default_api_endpoint:
if default_api_endpoint in global_api_endpoints:
default_value = format_api_name(default_api_endpoint)
else:
logging.warning(f"Default API endpoint '{default_api_endpoint}' not found in global_api_endpoints")
except Exception as e:
logging.error(f"Error setting default API endpoint: {str(e)}")
default_value = None
with gr.TabItem("Prompt Suggestion/Creation", visible=True):
gr.Markdown("# Generate and Test AI Prompts with the Metaprompt Approach")
with gr.Row():
with gr.Column():
# Task and variable inputs
task_input = gr.Textbox(label="Task Description",
placeholder="E.g., Draft an email responding to a customer complaint")
variables_input = gr.Textbox(label="Variables (comma-separated)",
placeholder="E.g., CUSTOMER_COMPLAINT, COMPANY_NAME")
# API-related inputs
# Refactored API selection dropdown
api_name_input = gr.Dropdown(
choices=["None"] + [format_api_name(api) for api in global_api_endpoints],
value=default_value,
label="API for Analysis (Optional)"
)
api_key_input = gr.Textbox(label="API Key", placeholder="Enter your API key (if required)",
type="password")
# Temperature slider for controlling randomness of generation
temperature_input = gr.Slider(minimum=0, maximum=1, step=0.01, value=0.7, label="Temperature")
# Button to generate the prompt
generate_prompt_button = gr.Button("Generate Prompt")
with gr.Column():
# Output for the generated prompt
generated_prompt_output = gr.Textbox(label="Generated Prompt", interactive=False)
# FIXME - figure this out
# copy_button = gr.HTML("""
#
#
# """)
# Section to test the generated prompt
with gr.Row():
with gr.Column():
# Input to test the prompt with variable values
variable_values_input = gr.Textbox(label="Variable Values (comma-separated)",
placeholder="Enter variable values in order, comma-separated")
test_prompt_button = gr.Button("Test Generated Prompt")
with gr.Column():
# Output for the test result
test_output = gr.Textbox(label="Test Output", interactive=False)
# Section to save the generated prompt to the database
with gr.Row():
with gr.Column():
prompt_title_input = gr.Textbox(label="Prompt Title", placeholder="Enter a title for this prompt")
prompt_author_input = gr.Textbox(label="Author",
placeholder="Enter the author's name") # New author field
prompt_description_input = gr.Textbox(label="Prompt Description", placeholder="Enter a description", lines=3)
save_prompt_button = gr.Button("Save Prompt to Database")
save_prompt_output = gr.Textbox(label="Save Prompt Output", interactive=False)
# Callback function to generate prompt
def on_generate_prompt(api_name, api_key, task, variables, temperature):
# Generate the prompt using the metaprompt approach and API
generated_prompt = generate_prompt(api_name, api_key, task, variables, temperature)
return generated_prompt
# Callback function to test the generated prompt
def on_test_prompt(api_name, api_key, generated_prompt, variable_values, temperature):
# Test the prompt by filling in variable values
test_result = test_generated_prompt(api_name, api_key, generated_prompt, variable_values, temperature)
return test_result
# Callback function to save the generated prompt to the database
def on_save_prompt(title, author, description, generated_prompt):
if not title or not generated_prompt:
return "Error: Title and generated prompt are required."
# Add the generated prompt to the database
result = add_or_update_prompt(title, author, description, system_prompt="", user_prompt=generated_prompt, keywords=None)
return result
# Connect the button to the function that generates the prompt
generate_prompt_button.click(
fn=on_generate_prompt,
inputs=[api_name_input, api_key_input, task_input, variables_input, temperature_input],
outputs=[generated_prompt_output]
)
# Connect the button to the function that tests the generated prompt
test_prompt_button.click(
fn=on_test_prompt,
inputs=[api_name_input, api_key_input, generated_prompt_output, variable_values_input, temperature_input],
outputs=[test_output]
)
# Connect the save button to the function that saves the prompt to the database
save_prompt_button.click(
fn=on_save_prompt,
inputs=[prompt_title_input, prompt_author_input, prompt_description_input, generated_prompt_output],
outputs=[save_prompt_output]
)
# Example chat function based on your API structure
def chat_api_call(api_endpoint, api_key, input_data, prompt, temp, system_message=None):
# Here you will call your chat function as defined previously
response = chat(message=input_data, history=[], media_content={}, selected_parts=[],
api_endpoint=api_endpoint, api_key=api_key, prompt=prompt, temperature=temp,
system_message=system_message)
return response
#
# End of Functions
########################################################################################################################