saadfarhad's picture
Update app.py
c95ddc9 verified
import gradio as gr
import requests
import os
# Maximum number of factor textboxes allowed
MAX_FACTORS = 10
def add_factor(num_factors):
"""
Increase the number of visible factor rows.
Inputs:
1. num_factors: current number of visible factor rows
Outputs:
1. Updated number of visible rows
2. Updated visibility for each factor textbox (list of gr.update objects)
"""
new_num = num_factors + 1 if num_factors < MAX_FACTORS else num_factors
# Prepare update list for each textbox: show textbox if its index is less than new_num, hide otherwise.
updates = [gr.update(visible=True) if i < new_num else gr.update(visible=False) for i in range(MAX_FACTORS)]
return new_num, *updates
def generate_factors(problem_statement, *factors):
"""
Call the Hugging Face inference API to generate additional factors.
Inputs:
1. problem_statement: The problem statement provided by the user.
2. factors: A list of factor inputs (only non-empty ones will be used).
Output:
1. A string containing additional factor suggestions.
"""
# Filter out empty or whitespace-only factor entries
factor_list = [f for f in factors if f and f.strip() != ""]
# Prepare the prompt text for the LLM
factors_text = "\n".join([f"- {factor}" for factor in factor_list])
prompt = (
f"You are an expert problem solver. Given the following problem statement:\n"
f"{problem_statement}\n\n"
f"And the following user-provided factors:\n"
f"{factors_text}\n\n"
f"Please suggest additional factors that would complete a MECE (Mutually Exclusive, Collectively Exhaustive) "
f"set of factors responsible for solving the problem. Provide your suggestions as a bullet list."
)
# Call the Hugging Face inference API (using GPT-2 as an example; change the model as needed)
API_URL = "https://api-inference.huggingface.co/models/gpt2"
token = os.environ.get("HF_API_TOKEN", "")
headers = {"Authorization": f"Bearer {token}"} if token else {}
response = requests.post(API_URL, headers=headers, json={"inputs": prompt})
if response.status_code == 200:
result = response.json()
if isinstance(result, list) and result and "generated_text" in result[0]:
generated = result[0]["generated_text"]
# Remove the prompt portion from the response to return only the suggestions.
suggestions = generated[len(prompt):].strip()
return suggestions
else:
return "Unexpected response format."
else:
return f"Error: {response.status_code} - {response.text}"
with gr.Blocks() as demo:
# State variable to keep track of the current number of factor rows visible.
num_factors_state = gr.State(value=1)
# Define the layout with 4 columns for 4 levels.
with gr.Row():
# Level 1: Problem Statement
with gr.Column():
problem_statement = gr.Textbox(label="Level 1: Problem Statement", placeholder="Enter your problem statement here")
# Level 2: Factor inputs and an Add Factor Row button
with gr.Column():
factor_textboxes = []
# Pre-create MAX_FACTORS textboxes. Only the first 'num_factors_state' will be visible.
for i in range(MAX_FACTORS):
tb = gr.Textbox(label=f"Factor {i+1}", visible=(i == 0), placeholder="Enter a factor")
factor_textboxes.append(tb)
add_factor_btn = gr.Button("Add Factor Row")
# Level 3: Generate More Factors button
with gr.Column():
generate_btn = gr.Button("Generate More Factors")
# Level 4: LLM suggestions display
with gr.Column():
llm_output = gr.Textbox(label="Level 4: LLM Suggestions", interactive=False, placeholder="LLM suggestions will appear here")
# When Add Factor Row is clicked, update the state and the visibility of each factor textbox.
add_factor_btn.click(
fn=add_factor,
inputs=num_factors_state,
outputs=[num_factors_state] + factor_textboxes
)
# When Generate More Factors is clicked, call the LLM generation function.
generate_btn.click(
fn=generate_factors,
inputs=[problem_statement] + factor_textboxes,
outputs=llm_output
)
demo.launch()