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")