Squeak.ru - шаблоны программирования

Выполнить скрипт python в фоновом режиме, пока ответ диалогового потока отправляется обратно (Python Flask)

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() вообще не возвращает.


Ответы:


1

Я сам прикинул. Проблема заключалась в синтаксисе: threade=threading.Thread(target=again())

Не должно быть () после again.

07.05.2020

2

проблема, с которой вы сталкиваетесь, заключается в том, что у вас есть вычислительная задача, которая может занять больше, чем максимум 4 секунды, которые DialogFlow ждет между вопросом и ответом.
Действительно, базовое решение - когда-нибудь покупать, задавая другие вопросы.

Во время следующего взаимодействия вам необходимо проверить, завершен ли фоновый поток, а затем узнать время. В противном случае вам нужно продлить этот процесс.

Один немного лучший подход - запускать события (а не задавать вопросы):

  • введите адрес
  • вызывается веб-перехватчик
  • запуск фонового потока, сон 3 секунды, событие запуска IN_PROGRESS
  • Цель DialogFlow I1 запускается событием IN_PROGRESS, пользователю отображается сообщение (т.е. работа над ним)
  • webhook вызывается после намерения I1, засыпает 3 секунды, затем проверяет состояние фонового потока
07.05.2020
Новые материалы

Угловая структура архитектуры
Обратите внимание, что эта статья устарела, я решил создать новую с лучшей структурой и с учетом автономных компонентов: https://medium.com/@marekpanti/angular-standalone-architecture-b645edd0d54a..

«Данные, которые большинство людей используют для обучения своих моделей искусственного интеллекта, поставляются со встроенным…
Первоначально опубликовано HalkTalks: https://hacktown.com.br/blog/blog/os-dados-que-a-maioria-das-pessoas-usa-para-treinar-seus-modelos-de-inteligencia-artificial- ja-vem-com-um-vies-embutido/..

Сильный ИИ против слабого ИИ: различия парадигм искусственного интеллекта
В последние годы изучению и развитию искусственного интеллекта (ИИ) уделяется большое внимание и прогресс. Сильный ИИ и Слабый ИИ — две основные парадигмы в области искусственного интеллекта...

Правильный способ добавить Firebase в ваш проект React с помощью React Hooks
React + Firebase - это мощная комбинация для быстрого и безопасного создания приложений, от проверки концепции до массового производства. Раньше (знаете, несколько месяцев назад) добавление..

Создайте API с помощью Python FastAPI
Создание API с помощью Python становится очень простым при использовании пакета FastAPI. После установки и импорта вы можете создать приложение FastAPI и указать несколько конечных точек. Каждой..

Веселье с прокси-сервером JavaScript
Прокси-серверы JavaScript — это чистый сахар, если вы хотите создать некоторую общую логику в своих приложениях, чтобы облегчить себе жизнь. Вот один пример: Связь клиент-сервер Мы..

Получить бесплатный хостинг для разработчиков | Разместите свой сайт за несколько шагов 🔥
Статические веб-сайты — это веб-страницы с фиксированным содержанием и его постоянным содержанием. Но теперь статические сайты также обрабатывают динамические данные с помощью API и запросов...