отправить активность бот-фреймворка из бизнес-логики Python

Я пробую Bot Framework SDK V4 Python GA. Как только я обнаружу намерение с помощью LUIS, я хочу иметь возможность обрабатывать некоторую бизнес-логику и отвечать. Я хочу иметь возможность отправлять сообщения во время бизнес-логики, поскольку я хочу, чтобы пользователь знал, что логика обрабатывается, и ему нужно немного подождать. Я понимаю, что боты обычно не используются для длительных процессов, но у меня есть вариант использования, когда это необходимо. Я пытаюсь передать поворотный контекст в бизнес-логику и отправить оттуда сообщение, но выдает следующую ошибку.

не могу распарить объекты сопрограммы

Ошибка

Я новичок в асинхронном программировании и не уверен, что именно здесь происходит. Ниже то, что я пробовал. Я попытался сделать то же самое, поместив бизнес-логику в другой класс, но получил ту же проблему. Первоначальное сообщение от on_message_activity проходит хорошо, но при попытке отправить сообщение из бизнеса выдает указанную выше ошибку. Что мне здесь не хватает?

async def someUseCase(self,turncontext: TurnContext):
    await turncontext.send_activity(MessageFactory.text("Processing your query. Give me a moment."))
    output = someLongRunningBusinessLogic()
    return MessageFactory.text(output)

async def on_message_activity(self, turn_context: TurnContext):
    luisResult = await self.LuisRecog.recognize(turn_context) 
    print(luisResult.get_top_scoring_intent())
    intent = LuisRecognizer.top_intent(luisResult,min_score=0.40)
    if intent != "None":
        await turn_context.send_activity("processing your query...")
        return await turn_context.send_activity(self.someUseCase(turn_context))
    else:
        await turn_context.send_activity(MessageFactory.text("No intent detected."))

Вывод эмулятора


person Vijay    schedule 28.06.2020    source источник
comment
Похоже, что someUseCase является асинхронным, так почему вы его не ждете? Кроме того, почему ваш on_message_activity возвращает результат send_activity в одном случае?   -  person Kyle Delaney    schedule 29.06.2020
comment
Да, Кайл, я должен был подождать. Я немного новичок в асинхронности, отсюда и путаница. Я теперь понял, что именно делать. Я опубликую ответ здесь для дальнейшего использования.   -  person Vijay    schedule 30.06.2020


Ответы (1)


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

return await turn_context.send_activity(self.someUseCase(turn_context))

send_activity ожидает действия, но someUseCase возвращает сопрограмму.

Подробнее о сопрограммах можно прочитать в документации по Python: https://docs.python.org/3/library/asyncio-task.html

person Kyle Delaney    schedule 30.06.2020