app = Flask(__name__)
av=""
time=""
action=""
def again():
...
@app.route('/')
def index():
return 'Hello World!'
def results():
global action
req = request.get_json(force=True)
action = req.get('queryResult').get('action')
if(action=="get_address"):
global av
global time
av=req.get('queryResult').get('parameters').get('location').get('city')
threade=threading.Thread(target=again())
threade.start()
textv="Thanks! Please enter your name now."
return {'fulfillmentText': textv}
else:
textv="Time: " + time
return {'fulfillmentText': textv}
# create a route for webhook
@app.route('/webhook', methods=['GET', 'POST'])
def webhook():
# return response
return make_response(jsonify(results()))
# run the app
if __name__ == '__main__':
app.run()
Итак, это сценарий python для моего бэкэнда для Dialogflow Agent. У агента следующая структура разговора:
Привет-> Пожалуйста, введите адрес-> Пожалуйста, введите имя (чтобы тратить время) -> [а затем укажите время в пути]
Таким образом, этот агент в основном дает время в пути между введенным адресом и фиксированным адресом (используя сценарий в again()
). Также обратите внимание, что я зря трачу время, поскольку, если я напрямую попытаюсь вывести время в пути после адреса, агент Dialogflow сообщает, что крайний срок Превышено. Чтобы преодолеть это, я попробовал использовать потоки, чтобы время в пути вычислялось в фоновом режиме, а тем временем ответ возвращается в диалог, он запрашивает имя пользователя, а затем выводит время в пути.
Но проблема в том, что DialogFlow по-прежнему сообщает, что крайний срок превышен (в «Пожалуйста, введите свой адрес»). И я подозреваю, что причина в том, что хотя скрипт python возвращает веб-перехватчик, но диалоговый поток не показывает вывод, пока скрипт python не перестанет выполняться. Так как мне это преодолеть?
Подводя итог, я хочу, чтобы запрос был возвращен (действие get_address
), а тем временем время в пути вычисляется (с использованием again()
) и возвращается в следующем запросе.
Как и было предложено, я удалил return {'fulfillmentText': textv}
из if()
части функции results()
и заменил ее на return {'followupEventInput': 'IN_PROGRESS'}
, но все равно там написано DEADLINE_EXCEEDED
. Как я сказал ранее, проблема, похоже, заключается в том, что функция results()
вообще не возвращает.