File size: 5,563 Bytes
78fa649
 
0cfb089
78fa649
 
 
 
 
 
 
 
 
 
26bc02a
 
 
78fa649
 
 
6d92cf2
78fa649
 
 
 
 
b0b903f
26bc02a
aa5d7c9
8cdebc7
aa5d7c9
 
 
26bc02a
 
 
 
aa5d7c9
 
 
26bc02a
 
6d92cf2
26bc02a
6d92cf2
78c8391
78fa649
 
 
 
 
 
 
6169ebe
78fa649
78c8391
4a1c22a
78fa649
 
 
6169ebe
4a1c22a
 
78fa649
 
 
 
 
 
aa5d7c9
78c8391
 
26bc02a
6d92cf2
26bc02a
 
78fa649
6d92cf2
 
 
 
 
 
78fa649
6d92cf2
 
26bc02a
 
6d92cf2
26bc02a
6d92cf2
 
 
 
 
 
 
26bc02a
 
6d92cf2
 
 
 
 
 
 
26bc02a
 
6d92cf2
26bc02a
 
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
initialState="1"
transitions=[
[1,"When are your opening hours?","""We are at your disposal 24/7""",-1],
[1,"I forgot my password",""""There is no password - just type "Login" and click on "Submit".""",-1],
[2,"Cool, thank you so much.","""With pleasure. Please let me know if you have further questions?""",-1],
[2,"I don't find the logout-button.","""Just type "Logout" in the text-box and click on "Submit".""",-1],
[0,"Are you an AI?","""No, not really.""",-1]
]

conditions=[line[0] for line in transitions]
intents=[line[1] for line in transitions]
replies=[line[2] for line in transitions]
consequences=[line[3] for line in transitions]

import gradio as gr

#changeableElemNames=["Input Text","Submit","Button to State 2","Button to State 3","Button to State 4","Button to State 5","Button to State 6"] # Input Text, Submit Button and further buttons
changeableElemNames=["Input Text","Submit"]
changeableElemNames.extend(intents) #[intents[i] for i in subsetIDs])
elemIDs=list(range(len(changeableElemNames))) # IDs of elements 
#defaultElemIDs=list(range(0,len(changeableElemNames))) 
defaultElemIDs=[0,1]
defaultElemIDs.extend([i+2 for i in range(len(conditions)) if conditions[i]<2]) # IDs of elements visible at the beginnning
defaultElemIDs

def toggler(visibility=defaultElemIDs):
   l=[]
   l.append(gr.Textbox(changeableElemNames[0],  visible=(0 in visibility)))
   l.append(gr.Button(changeableElemNames[1],   visible=(1 in visibility), variant="primary"))
   for i in list(range(2,len(changeableElemNames))):
     l.append(gr.Button(changeableElemNames[i], visible=(i in visibility)))
   #print("Toggler:\n\nelemIDs="+str(elemIDs)+"\n\nVisibility="+str(visibility)+"\n\nl="+str(l)) 
   return l

def listener(btn):
  r=0
  for i in list(range(1,len(changeableElemNames))):
    if(btn==changeableElemNames[i]): r=i
  #print("Listener:\n\nbtn="+str(btn)+"\n\nr="+str(r))
  return gr.Radio([str(e) for e in elemIDs],label="Button clicked",value=str(r))

def respond(state, chat_history, visible_elemIDs,internal_state):
  previous_state = internal_state
  internal_state = state # in this example the internal state is set to the button clicked
  if(str(state) in [str(e) for e in visible_elemIDs]):  # react to Buttons
    internal_state=previous_state # default is to not change the state
    intent=intents[int(state)-2]
    reply=replies[int(state)-2]
    condition=conditions[int(state)-2]
    consequence=consequences[int(state)-2]
    if(int(consequence)>=0): internal_state=consequence # react to consequence if specified
    bot_message = f"{reply}\n\n<i><small>[Debugging info: I was in state \"{previous_state}\" and am now in state \"{internal_state}\". please click another button.]</small></i>"
    #print("respond to button!")
    chat_history.append((intent, bot_message)) #((str(state), bot_message))
  else: # react to Text-Input
    internal_state="1"
    if("Login" in state):internal_state="2"
    if("Logout" in state):internal_state="1"
    bot_message = f"I was in state \"{previous_state}\" and am now in state \"{internal_state}\" after processing \"{state}\". please click another button."
    #print("respond to text!")
    chat_history.append((str(state), bot_message))
    state="1"
  visible_elemIDs= [e for e in elemIDs 
    #if ((str(e) != str(internal_state))|(str(e)=="1")|(str(e)=="0"))] # delete some buttons
    if(
      (str(e)=="1")|(str(e)=="0")|
      (str(conditions[int(e)-2])=="0")|
      (str(conditions[int(e)-2])==str(internal_state)))]
  if(len(visible_elemIDs)<=2): # if visible_elemIDs has length below 3, reset
    print("restore visibility to "+str(defaultElemIDs)) 
    visible_elemIDs=defaultElemIDs 
  print("respond:\n\nvisible_elemIDs="+str(visible_elemIDs)+"\n\nbot_message="+str(bot_message))
  return state, chat_history, visible_elemIDs, internal_state

with gr.Blocks() as demo:
  chatbot = gr.Chatbot(value=[[None, f"I'm in state \"{initialState}\". Please click a button!"]])
  changeableElems=toggler()
  for name, value in zip(changeableElemNames, changeableElems):
   globals()[name] = value
  hideInternals=True    
  internalState=gr.Radio(
    [str(e) for e in elemIDs],
    value=initialState,
    visible=hideInternals==False,
    label="Internal state") # determine internal state of the chatbot
  visibility=gr.Dropdown(
    elemIDs, 
    value=defaultElemIDs,
    multiselect=True, 
    visible=hideInternals==False,     
    label="Active Elements") # determine which elements are visible 
  clicked=gr.Radio(
    [str(e) for e in elemIDs],
    value="0", 
    visible=hideInternals==False,
    label="Button clicked") # determine which Element/Button was clicked last
  visibility.change(toggler, inputs=visibility, outputs=changeableElems) # change elemIDs when visibility is changed 
  chatbot.change(toggler, inputs=visibility, outputs=changeableElems) # change elemIDs when chatbot responds
  clicked.change(respond,inputs=[clicked,chatbot,visibility,internalState], outputs=[clicked,chatbot,visibility,internalState])
  globals()[changeableElemNames[1]].click(
    respond,
    inputs=[globals()[changeableElemNames[0]],chatbot,visibility,internalState], 
    outputs=[globals()[changeableElemNames[0]],chatbot,visibility,internalState])
  for n in [changeableElemNames[x] for x in list(range(2,len(changeableElemNames)))]: # for all elements except 0&1:
    globals()[n].click(listener, inputs=globals()[n], outputs=clicked)
  with gr.Row():
      chatbot
      gr.Column([changeableElemNames[x] for x in list(range(1,len(changeableElemNames)))])

demo.launch()