| import gradio as gr |
| from datetime import datetime, timedelta |
|
|
| from gemini_api import model_api, sentiment, category, ord_num, NO_ORDER, NO_ITEM, food_return, cloth_return, item_identy, item_match, generate_add |
| from openai_api import model_api as openai_model_api, sentiment as openai_sentiment, image_gen |
|
|
| cust_qry_resp = {"senti":"", "cat":"", "num":""} |
|
|
| |
| with gr.Blocks(title="Customer Support Assistant", |
| analytics_enabled=False) as app: |
| |
| |
| state_order_num = gr.State([NO_ORDER, None, None, None, None]) |
| |
| state_ret_pol_cat = gr.State([None, None]) |
| |
| state_match_item = gr.State([None, None]) |
| |
| state_gen_add = gr.State([None, None, None]) |
| |
| gr.Markdown("# Customer Support Assistant") |
| llm_api = gr.Radio(["gemini-1.0-pro", "gpt-3.5-turbo"], label="Choose LLM", value="gemini-1.0-pro") |
| |
| with gr.Row(): |
| cust_qry = gr.Textbox(lines=5, type="text", label="Customer Query") |
|
|
| btn_cust_qry = gr.Button("Analyze Query") |
|
|
| |
| @gr.render(inputs=[cust_qry, llm_api], triggers=[btn_cust_qry.click]) |
| |
| def invoke_model(user_input, llm_api): |
| if len(user_input) == 0: |
| gr.Markdown("## No Customer Query Provided") |
| else: |
| if llm_api == "gemini-1.0-pro": |
| senti = model_api(user_input, sentiment) |
| else: |
| senti = openai_model_api(user_input, openai_sentiment) |
| cat = model_api(user_input, category) |
| num = model_api(user_input, ord_num) |
| item = model_api(user_input, item_identy) |
| |
| def btn_ord_det_clk(ord_num): |
| return [ord_num, senti, cat, user_input, item] |
| |
| |
| gr.Textbox(lines=1, type="text", label="Customer Sentiment", value=senti) |
| gr.Textbox(lines=1, type="text", label="Order Category", value=cat) |
| ord_num_txt = gr.Textbox(lines=1, type="text", label="Order Number", value=num, interactive=True) |
| gr.Textbox(lines=1, type="text", label="Order Item", value=item) |
| |
| |
| |
| if senti in ["NEGATIVE", "MIXED"]: |
| if num != NO_ORDER: |
| btn_ord_det = gr.Button("Fetch Order Details") |
| btn_ord_det.click( btn_ord_det_clk, ord_num_txt, state_order_num) |
| else: |
| with gr.Row(): |
| gr.Textbox(lines=1, type="text", label="Next Step", value="Ask Order Number") |
| else: |
| btn_item_match = gr.Button("Fetch Matching Items from Adds Store") |
| btn_item_match.click(lambda x: [item, cat], state_match_item, state_match_item) |
| |
| @gr.render(inputs=state_order_num) |
| def fetch_order_det(ip_arr): |
| print("Get order Details") |
| ord_num = ip_arr[0] |
| ord_senti = ip_arr[1] |
| ord_cat = ip_arr[2] |
| usr_ip = ip_arr[3] |
| ord_item = ip_arr[4] |
| if ord_num != NO_ORDER: |
| pur_dt = datetime.now() + timedelta(days=-2) |
| ord_det = f"Order Number: {ord_num}\nPurchase Date: {pur_dt}\nItem Ordered: {ord_item}" |
| gr.Textbox(lines=1, type="text", label="Order Details", value=ord_det) |
| if ord_senti in ["NEGATIVE", "MIXED"] and ord_num != NO_ORDER: |
| with gr.Row(): |
| btn_ret_pol = gr.Button("Fetch Return / Replacement Response") |
| btn_ret_pol.click(lambda x: [ord_cat, usr_ip], state_ret_pol_cat, state_ret_pol_cat) |
| |
| @gr.render(inputs=state_ret_pol_cat) |
| def fetch_ret_response(ip_arr): |
| print("Return Response") |
| ord_cat = ip_arr[0] |
| user_input = ip_arr[1] |
| if ord_cat is not None: |
| if ord_cat == "Food": |
| resp, policy = food_return(user_input) |
| if ord_cat == "Clothing": |
| resp, policy = cloth_return(user_input) |
| with gr.Row(): |
| with gr.Column(scale=1): |
| gr.Textbox(lines=1, type="text", label="Return Response", value=resp) |
| with gr.Column(scale=1): |
| gr.Textbox(lines=1, type="text", label="Return Policy Used", value=policy) |
| |
| @gr.render(inputs=state_match_item) |
| def fetch_match_item(ip_arr): |
| print("Return Matching Items") |
| ord_item = ip_arr[0] |
| ord_cat = ip_arr[1] |
| if ord_item is not None: |
| ret_item, ret_theme = item_match(ord_item) |
| def btn_clk(rd_ip): |
| return [ret_item, ret_theme, rd_ip] |
| |
| with gr.Row(): |
| gr.Textbox(lines=1, type="text", label="Nearest Matching Item from Adds Store", value=ret_item) |
| gr.Textbox(lines=1, type="text", label="Add Theme", value=ret_theme, interactive=True) |
| with gr.Row(): |
| age_cat = gr.Radio(["less than 13 years", "14 to 30 years", "30 to 50 years", "more than 50 years"], |
| label="Select target age group", value="30 to 50 years", interactive=True) |
| btn_gen_add = gr.Button("Generate Add") |
| btn_gen_add.click(btn_clk, age_cat, state_gen_add) |
| |
| @gr.render(inputs=state_gen_add) |
| def gen_add(ip_arr): |
| print("Generate Add") |
| ord_item = ip_arr[0] |
| theme = ip_arr[1] |
| age_grp = ip_arr[2] |
| if ord_item is not None: |
| ret_add = generate_add(ord_item, theme, age_grp) |
| image_url = image_gen(f"{ord_item} {theme} {age_grp}") |
| with gr.Row(): |
| gr.Textbox(type="text", label="Genarated Add", value=ret_add, interactive=True) |
| with gr.Row(): |
| gr.Image(height=1024, width=1024, value=image_url) |
| |
| if __name__ == "__main__": |
| app.launch(server_name="0.0.0.0") |