Spaces:
Build error
Build error
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()
|