import gradio as gr from comparison import compare_ingredient_methods_ui # Import from our UI modules from ui_core import embeddings, get_css, load_examples from ui_ingredient_matching import categorize_products from ui_category_matching import categorize_products_by_category from ui_hybrid_matching import categorize_products_with_voyage_reranking from ui_expanded_matching import categorize_products_with_openai_reranking def create_demo(): """Create the Gradio interface""" with gr.Blocks(css=get_css()) as demo: gr.Markdown("# Product Categorization Tool\nAnalyze products by matching to ingredients or categories using AI embeddings.") with gr.Tabs() as tabs: # Original Ingredient Matching Tab with gr.TabItem("Ingredient Embeddings"): with gr.Row(): with gr.Column(scale=1): # Input section text_input = gr.Textbox( lines=10, placeholder="Enter product names, one per line", label="Product Names" ) input_controls = gr.Row() with input_controls: use_expansion = gr.Checkbox( value=False, label="Use Description Expansion", info="Expand product descriptions using AI before matching" ) top_n = gr.Slider(1, 25, 10, step=1, label="Top N Results") confidence = gr.Slider(0.1, 0.9, 0.5, label="Similarity Threshold") with gr.Row(): examples_btn = gr.Button("Load Examples", variant="secondary") categorize_btn = gr.Button("Find Similar Ingredients", variant="primary") with gr.Column(scale=1): # Results section text_output = gr.HTML(label="Similar Ingredients Results", elem_id="results-container") # New Category Matching Tab with gr.TabItem("Category Embeddings"): with gr.Row(): with gr.Column(scale=1): # Input section category_text_input = gr.Textbox( lines=10, placeholder="Enter product names, one per line", label="Product Names" ) category_input_controls = gr.Row() with category_input_controls: category_use_expansion = gr.Checkbox( value=False, label="Use Description Expansion", info="Expand product descriptions using AI before matching" ) category_top_n = gr.Slider(1, 10, 5, step=1, label="Top N Categories") category_confidence = gr.Slider(0.1, 0.9, 0.5, label="Matching Threshold") with gr.Row(): category_examples_btn = gr.Button("Load Examples", variant="secondary") match_categories_btn = gr.Button("Match to Categories", variant="primary") with gr.Column(scale=1): # Results section category_output = gr.HTML(label="Category Matching Results", elem_id="results-container") # Common function to create reranking UI tabs def create_reranking_tab(tab_name, fn_name, default_match="ingredients"): with gr.TabItem(tab_name): with gr.Row(): with gr.Column(scale=1): # Input section tab_input = gr.Textbox( lines=10, placeholder="Enter product names, one per line", label="Product Names" ) with gr.Row(): tab_expansion = gr.Checkbox( value=False, label="Use Description Expansion", info="Expand product descriptions using AI before matching" ) tab_emb_top_n = gr.Slider(1, 50, 20, step=1, label="Embedding Top N Results") tab_top_n = gr.Slider(1, 10, 5, step=1, label="Final Top N Results") tab_confidence = gr.Slider(0.1, 0.9, 0.5, label="Matching Threshold") tab_match_type = gr.Radio( choices=["ingredients", "categories"], value=default_match, label="Match Type", info="Choose whether to match against ingredients or categories" ) with gr.Row(): tab_examples_btn = gr.Button("Load Examples", variant="secondary") tab_match_btn = gr.Button(f"Match using {tab_name}", variant="primary") with gr.Column(scale=1): # Results section tab_output = gr.HTML(label=f"{tab_name} Results", elem_id="results-container") # Connect button events tab_match_btn.click( fn=fn_name, inputs=[tab_input, gr.State(False), tab_expansion, tab_emb_top_n, tab_top_n, tab_confidence, tab_match_type], outputs=[tab_output], ) tab_examples_btn.click( fn=load_examples, inputs=[], outputs=tab_input ) # Create the reranking tabs using the shared function create_reranking_tab("Voyage AI Reranking", categorize_products_with_voyage_reranking, "categories") create_reranking_tab("OpenAI Reranking", categorize_products_with_openai_reranking, "ingredients") # New Comparison Tab with gr.TabItem("Compare Methods"): with gr.Row(): with gr.Column(): compare_product_input = gr.Textbox( label="Enter product names (one per line)", placeholder="4 Tbsp sweet pickle relish\nchocolate chips\nfresh parsley", lines=5 ) with gr.Row(): compare_embedding_top_n = gr.Slider( minimum=5, maximum=50, value=20, step=5, label="Initial embedding candidates" ) compare_final_top_n = gr.Slider( minimum=1, maximum=10, value=3, step=1, label="Final results per method" ) compare_confidence_threshold = gr.Slider( minimum=0.0, maximum=1.0, value=0.5, step=0.05, label="Confidence threshold" ) compare_btn = gr.Button("Compare Methods", variant="primary") compare_examples_btn = gr.Button("Load Examples", variant="secondary") with gr.Column(): comparison_output = gr.HTML(label="Results", elem_id="results-container") # Connect the compare button compare_btn.click( fn=compare_ingredient_methods_ui, inputs=[ compare_product_input, gr.State(False), # Always text input mode compare_embedding_top_n, compare_final_top_n, compare_confidence_threshold ], outputs=comparison_output ) # Add examples button functionality compare_examples_btn.click( fn=load_examples, inputs=[], outputs=compare_product_input ) # Connect buttons for ingredient matching categorize_btn.click( fn=categorize_products, inputs=[text_input, gr.State(False), use_expansion, top_n, confidence], outputs=[text_output], ) # Connect buttons for category matching match_categories_btn.click( fn=categorize_products_by_category, inputs=[category_text_input, gr.State(False), category_use_expansion, category_top_n, category_confidence], outputs=[category_output], ) # Examples buttons for the first two tabs examples_btn.click( fn=load_examples, inputs=[], outputs=text_input ) category_examples_btn.click( fn=load_examples, # Reuse the same examples inputs=[], outputs=category_text_input ) gr.Markdown("Powered by Voyage AI embeddings • Built with Gradio") return demo