File size: 5,480 Bytes
4c05b4a 1cd99ec 4c05b4a 89d73de ed86c67 4c05b4a 3c750c3 2c591bd 3c750c3 2c591bd 89d73de 3c750c3 2c591bd 1492293 4c05b4a 1492293 4c05b4a 1492293 4c05b4a 1492293 4c05b4a 2c591bd 89d73de 4c05b4a 1cd99ec 89d73de 2c591bd 1cd99ec 3c750c3 2c591bd 89d73de 2c591bd 1cd99ec 3c750c3 1cd99ec 3c750c3 2c591bd 1cd99ec 2c591bd 1cd99ec 3c750c3 2c591bd 89d73de 2c591bd 89d73de 2c591bd 89d73de 2c591bd 89d73de 2c591bd 89d73de ed86c67 89d73de ed86c67 4c05b4a |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 |
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":""}
#********* UI Code ***********#
with gr.Blocks(title="Customer Support Assistant",
analytics_enabled=False) as app:
# States for triggering events
# Order Num, Sentiment, Category, User Input
state_order_num = gr.State([NO_ORDER, None, None, None, None])
# Category, User Input
state_ret_pol_cat = gr.State([None, None])
# Item, Category
state_match_item = gr.State([None, None])
# Item, theme, age group
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")
# Inputs from user
with gr.Row():
cust_qry = gr.Textbox(lines=5, type="text", label="Customer Query")
btn_cust_qry = gr.Button("Analyze Query")
# Model Output
@gr.render(inputs=[cust_qry, llm_api], triggers=[btn_cust_qry.click])
# Function for prediction
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]
# Output response
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)
# Decision Rules
# Order Details
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") |