Botframework-solutions: [Машинопись] Добавить поддержку навыков GA SDK в VA / Skill Generator

Созданный на 8 окт. 2019  ·  64Комментарии  ·  Источник: microsoft/botframework-solutions

После изменения протокола Skill на WebSockets мы ждали появления новой библиотеки Streaming Extensions для Typescript, ранее доступной только для C #. Это разблокирует сценарии вызова навыков для виртуального помощника при использовании Typescript.

История пользователя

Как ... Разработчик
Я хочу ... иметь возможность подключать навыки к версии виртуального помощника TypeScript
так что ... есть паритет между C # и Typescript

Критерии приемки

  • [] Обновите VA и генератор навыков, чтобы включить новые навыки GA SDK.
  • [] Разверните виртуальную машину машинописного текста и добавьте навык C # (например, Календарь)
  • [] Предоставьте документацию об изменениях, необходимых для существующих решений VA, и навыков, созданных генератором по мере необходимости.
P0 Committed In Progress

Самый полезный комментарий

@ Batta32 Если SkillConversationIdFactory использует encodeURI, то навык получит этот идентификатор разговора и ответит на него соответствующим образом. Я почти уверен, что это необходимо.

Также да, существует проблема с длинными идентификаторами разговоров при использовании restify. Мы упоминаем, как решить проблему в этом примере: https://github.com/microsoft/BotBuilder-Samples/blob/master/samples/javascript_nodejs/80.skills-simple-bot-to-bot/simple-root -bot / skillConversationIdFactory.js # L21

// Этот ключ по умолчанию имеет ограничение в 100 символов. Увеличьте на restify.createServer({ maxParamLength: 1000 }); в index.js.

Все 64 Комментарий

привет Даррендж,
Есть ли какое-либо расчетное время прибытия для решения проблемы?
Благодарность,
Кумар

Надеюсь, что на этой неделе закончу работу над тестированием, все в порядке.

Спасибо @darrenj за обновление.

есть ли обновления по этой проблеме @darrenj

Привет Даррен,

@darrenj, не могли бы вы предоставить обновленную информацию по этому

ценю вашу помощь.

Благодарность,
Кумар

Привет @darrenj!

Извините, что снова беспокою, есть какие-нибудь обновления по этому поводу?
Я видел, что библиотека была выпущена для версии 4.6.0 (https://botbuilder.myget.org/feed/botbuilder-v4-js-daily/package/npm/botframework-streaming), совместимо ли это с Botframework 4.5.0 и виртуальный помощник?

Здесь есть несколько вещей, одна из которых - доступность потокового расширения, которую вы заметили, а другая - доступность машинописного текста новой версии GA библиотеки Skills. Я ожидаю выхода первой пакетной сборки библиотеки Skills на следующей неделе, после чего мы сможем начать обновления как шаблонов C #, так и Typescript, чтобы протестировать и предоставить (простые) шаги по миграции.

Мы планируем подготовить эту работу к использованию в январе и будем постоянно обновлять эту проблему, в том числе, когда будут доступны ежедневные сборки.

Между тем, виртуальный бот Javascript / Typescript может вызывать навык, созданный в JavaScript / Typescript, поскольку он использует HTTP из-за отсутствия зависимости потокового расширения. Проблема возникает, когда вы хотите вызвать навык C #, например Calendar, который приведенные выше изменения будут согласованы для всех языков.

@darrenj это исправлено, и могу ли я подключить C # Skill из машинописного VA? Я запутался в вашем последнем комментарии.

Привет @darrenj ,

Как только проблема будет решена, можно ли будет активировать навыки cSharp, такие как ToDo, из версии TypeScript на VA?

В настоящее время я получаю сообщение об ошибке, связанной с WebSocketTransport, используемым в навыке C #. Но мой VA - машинописный.

Да, переход на версию Skills для GA устраняет зависимость от Websockets и, таким образом, обеспечивает плавное сочетание / соответствие навыков на разных платформах. У нас есть последние версии для C # и JS, и мы работаем над начальной интеграцией, цель - внести изменения в ежедневную сборку в течение следующих нескольких недель, чтобы разблокировать сценарии.

Привет @darrenj!

У меня есть еще один вариант использования - Typescript VA и Typescript Skill.

Моя проблема в том, что updateActivity недоступен через VA для Skill, и мне нужна потоковая библиотека для этого (насколько я понял). Теперь я действительно заметил, что зависимости WebSocket были удалены из последней библиотеки навыков (4.4.9).
Не понимаю почему :) Собираетесь куда-нибудь переехать? Или?

Хорошо, у меня есть обновленная информация о прогрессе в отношении общих возможностей навыков в SDK Bot Framework. Это превратило работу, инкубируемую Virtual Assistant, в формальную версию GA.

Доступен образец, показывающий, как бот может вызвать другого бота (навык). Ключевое изменение: теперь у нас есть унифицированный адаптер, что означает, что нет необходимости использовать другой адаптер или расширения потоковой передачи. C # и JS .

Мы работаем над обновлениями шаблона виртуального помощника / навыков, чтобы предоставить (небольшие) изменения из коробки и предоставить документацию по нескольким шагам, необходимым для обновления существующих навыков. Ориентация на конец января, скоро будут дополнены наши ежедневные сборки.

Если вы хотите добиться прогресса раньше, приведенные выше образцы должны дать вам все необходимое. Я обновлю этот выпуск указателями на ежедневные сборки / изменения, как только они будут готовы.

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

Означает ли это, что мы можем использовать унифицированный адаптер в Typescript VA и по-прежнему использовать навык C #?

Долгожданное обновление!

Вчера мы опубликовали наш выпуск 0.8, который включает обновление для всех наших примеров навыков, чтобы поддерживать новые возможности GA Skills и больше не использовать предварительную версию. Веб-сокеты были удалены в пользу обмена данными между навыками через веб-службы. Навыки связываются с ботом асинхронно, используя HTTP-соединение «обратного вызова».

В результате необходимо внести несколько прямых обновлений в существующий виртуальный помощник и навыки. Обновления C # VA описаны здесь и C # обновления Skill документируются здесь .

Эквивалентные изменения генератора JS / Typescript завершаются, когда мы говорим, и нацелены на публикацию нового генератора и документации для существующих VA / Skills к 14 февраля. Для справки: шаги высокого уровня для поддержки навыков вызова можно найти здесь.

После того, как эти изменения будут внесены, это означает, что виртуальное устройство JS / typescript может вызывать навыки C #, наоборот, и Python тоже.

@darrenj , какие-либо мысли по поводу вышеупомянутого комментария о проекте машинописного

В соответствии с вышеизложенным, да, необходимо будет выполнить некоторые шаги по миграции, которые мы завершаем.

Спасибо.

Привет, @darrenj , есть новости о том, когда будут выпущены изменения генератора JS / TS и обновления документации?

Привет ,
ценю вашу помощь

@darrenj есть ли обновления по этому билету?

@darrenj Сегодня я попытался выполнить миграцию или исправить вызов навыка C # из VA / RootBot (Typescript). Я нашел руководство по реализации навыков потребителя, в котором нет примера rootbot / VA машинописного текста. Есть ли какой-либо план поддержки руководства по миграции на основе машинописного текста? Дайте мне знать расчетное время прибытия или любое другое руководство, которое может помочь в достижении того же.

У нас есть набор запросов на вытягивание для изменений, позволяющих новому машинописному тексту VA / Skills использовать новые навыки GA. Я обновлю заявку, как только они будут объединены и станут доступны ежедневные сборки.

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

https://github.com/microsoft/botframework-solutions/pull/3123

Привет, @darrenj , спасибо за обновление, единственный вопрос, который у меня есть на данный момент, - это «решения для ботов». Обязательно ли использовать локальную версию? Отсюда? Я нашел здесь эту ветку, которая выглядит как будущий выпуск (https://github.com/microsoft/botframework-solutions/tree/feature/southworks/0.7/parity-botbuilder-solutions/sdk/typescript/libraries/botbuilder-solutions) , это правильно?

Заранее спасибо.

@ Batta32 Можете ли вы быстро подтвердить, какую ветвь кода люди могут использовать для тестирования инструкций (перед публикацией новой библиотеки)

@ tommyJimmy87 - вы можете проверить PR # 3122, который содержит все необходимые изменения BotBuilder-Solutions for GA Skills SDK в TypeScript.
Ветка: feature / southworks / ga-skills-sdk / botbuilder-solutions

Чтобы использовать библиотеку локально, выполните следующие действия (используя указанную ветку):

  1. Откройте библиотеку в Visual Studio Code
  2. Выполните npm install , чтобы установить зависимости
  3. Выполните npm run build , чтобы скомпилировать решение
  4. Выполните npm pack чтобы создать файл библиотеки .tgz.
  5. Откройте файл package.json виртуального помощника в Visual Studio Code.
  6. Обновите ссылку botbuilder-solutions, указывающую на созданный путь tgz
  7. Выполните npm install , чтобы установить зависимости, которые установят локальный пакет.

В настоящее время мы проверяем эти изменения, не стесняйтесь оставлять отзывы в этом PR, и мы рассмотрим их как можно скорее.

Этот выпуск устарел, потому что он был открыт 30 дней без активности. Удалите устаревший ярлык или комментарий, иначе он будет закрыт через 5 дней

@darrenj - не могли бы вы сообщить нам, можно ли сделать изменения, упомянутые ниже, для подключения от VA (C #) к Skill, который является node js.

https://microsoft.github.io/botframework-solutions/overview/whats-new/0.8-beta/migrate-existing-va-to-0.8/

Да, документация находится в PR и команда завершает эту работу, пока мы говорим! (@ Batta32). Вы можете увидеть текущую работу здесь: https://github.com/microsoft/botframework-solutions/pull/3123

Наряду с соответствующими изменениями в SDK: https://github.com/microsoft/botframework-solutions/pull/3122

Как и было обещано, спасибо за терпение, пока мы работали над набором изменений в SDK.

  • Шаги по обновлению существующего машинописного VA до GA BF Skills здесь.
  • Шаги по обновлению существующего навыка машинописного текста до навыков GA BF находятся здесь.

Кроме того, в следующие ежедневные сборки генератора VA эти изменения будут включены прямо из коробки. Я обновлю эту проблему, указав точную версию после обработки и проверки.

Затем он будет опубликован в npm, когда мы обработаем выпуск 1.0, который в настоящее время находится в ожидании окна изменений Azure. Надеемся до конца месяца.

Если у вас возникнут какие-либо вопросы / проблемы с вышеуказанным, поднимите новую проблему, и мы здесь, чтобы помочь.

@ Batta32 для миграции мы можем начать использовать botbuilder-solutions 4.5.0-preview? Я предполагаю, что новый выпуск подходит для миграции?

@ Batta32 Когда будет выпущен новый SDK для использования? Я создаю виртуальную машину с 13 навыками, и одно из требований - она ​​должна быть построена на TypeScript. В настоящее время я использую SDK из ветки Next для запуска проекта.

Привет, @ tommyJimmy87 и @ tomSauret847 , перед их публикацией вы можете использовать пакеты, опубликованные в MyGet, в качестве ежедневных сборок:

Чтобы интегрировать ежедневную сборку botbuilder-solutions вас есть два разных варианта, мы рекомендуем первый вариант, так как он самый простой (примите во внимание удаление package-lock и node_modules ваших ботов) :

  • Вариант 1. Добавьте файл .npmrc указывающий на реестр https://botbuilder.myget.org/F/aitemplates/npm , и обновите package.json чтобы указать версию botbuilder-solutions на 4.5.0-preview223
  • Вариант 2: Загрузите tgz botbuilder-solutions ссылаясь на него непосредственно в package.json с абсолютным путем
npm pack [email protected] --registry https://botbuilder.myget.org/F/aitemplates/npm

Если вы хотите использовать generator-botbuilder-assistant , вам следует удалить его, если он у вас уже есть, а затем установить MyGet:

npm uninstall -g generator-botbuilder-assistant
npm install -g [email protected] --registry https://botbuilder.myget.org/F/aitemplates/npm

@ Batta32 Где нам нужно будет сообщать о проблемах, которые мы обнаруживаем в предварительных сборках? Я сгенерировал новое виртуальное устройство с помощью генератора предварительного просмотра и использовал предварительный пакет SDK и получил сообщение об ошибке, что при попытке запустить виртуальное устройство без какой-либо настройки добавляется недопустимый диалог.
Ошибка: DialogSet.add (): добавляется недопустимый диалог.

@darrenj - как лучше всего сообщать о проблемах ежедневных сборок?

@ tomSauret847 - тем временем вы можете поделиться своей проблемой в этой ветке со своей средой и инструкциями по воспроизведению 😊!

Среда работает локально на компьютере с Windows 10
Шаги: запустите генератор предварительного просмотра для создания пустого VA
обновите appsettings.json и cognitivemodels.json
добавить файл .npmrc, указывающий на https://botbuilder.myget.org/F/aitemplates/npm
удалить node_modules и package-lock.json
запустите npm install [email protected]
запустите npm install, чтобы установить все остальные пакеты
запустить сборку NPM
запустить npm запустить запуск
то я получаю следующую ошибку
C: UsersuserDesktopBlankVAtestassistantnode_modulesapplicationinsightsoutAutoCollectionExceptions.js: 34
выбросить THIS_IS_APPLICATION_INSIGHTS_RETHROWING_YOUR_EXCEPTION; // Ошибка возникла где-то еще в вашем приложении
^

Ошибка: DialogSet.add (): добавляется недопустимый диалог.
в DialogSet.add (C: UsersuserDesktopBlankVAtestassistantnode_modulesbotbuilder-dialogslibdialogSet.js: 87: 19)
в MainDialog.addDialog (C: UsersuserDesktopBlankVAtestassistantnode_modulesbotbuilder-dialogslibcomponentDialog.js: 148: 22)
в новом MainDialog (C: UsersuserDesktopBlankVAtestassistantlibdialogsmainDialog.js: 34: 14)
на объекте.(C: UsersuserDesktopBlankVAtestassistantlibindex.js: 159: 24)
в Module._compile (внутренний / модули / cjs / loader.js: 778: 30)
в Object.Module._extensions..js (internal / modules / cjs / loader.js: 789: 10)
в Module.load (internal / modules / cjs / loader.js: 653: 32)
в tryModuleLoad (внутренний / модули / cjs / loader.js: 593: 12)
в Function.Module._load (internal / modules / cjs / loader.js: 585: 3)
в Function.Module.runMain (internal / modules / cjs / loader.js: 831: 12)

Спасибо! Мы воспроизвели проблему в соответствии с вашими действиями, однако это ошибка в порядке установки зависимостей, вызывающая конфликт при установке botbuilder-solutions разделенных остальными.

image

Попробуйте выполнить следующие node_modules и package-lock )

  1. Обновите package.json 4.5.0-preview223 версией botbuilder-solutions

image

  1. Установите все зависимости, выполнив npm install
  2. Создайте решение, выполнив npm run build
  3. Запустите виртуальный помощник, выполнив npm run start

image

@ tomSauret847 дайте мне знать, если вы заметите другие проблемы. Мы завершаем окончательную проверку и по ее завершении отправим новые сборки в npm.

Привет, @darrenj , у меня возникла ошибка при попытке разрешить файлы lg с помощью нового диспетчера шаблонов, в основном происходит то, что я получаю языковой стандарт en-US от MS Teams, но я установил только en-us (нижний регистр) и не будет признан. Возможно, добавление здесь нижнего регистра if (this.templateEnginesPerLocale.has(locale)) решит проблему (строка 61 LocaleTemplateEngineManager.ts). Чтобы обойти эту проблему, мне пришлось добавить это в свой index.ts:

const supportedLocales: string[] = ['en-us', 'en-US','de-de'];

supportedLocales.forEach((locale: string) => {
    const localeTemplateFiles: string[] = [];
    templateFiles.forEach(template => {
        // LG template for en-us does not include locale in file extension.
        if (locale === 'en-us' || locale === 'en-US') {
            localeTemplateFiles.push(path.join(__dirname, 'responses', `${ template }.lg`));
        }
        else {
            localeTemplateFiles.push(path.join(__dirname, 'responses', `${ template }.${ locale }.lg`));
        }
    });

    localizedTemplates.set(locale, localeTemplateFiles);
});

Это работает хорошо, но я не знаю, можно ли сделать лучше.

Спасибо. @ Batta32 - можете ли вы проверить, есть ли у вас изменение LocaleTemplateEngine в решениях Lib, которые используют предоставленный SDK MultiLanguageLG ? Я надеюсь, что это будет элегантно обрабатывать смешанный случай, но некоторые тесты было бы хорошо проверить.

@ lzc850612 Можем ли мы запустить быструю проверку с помощью csharp GA RC, чтобы дважды проверить, работает ли он должным образом со смешанными языковыми стандартами, поступающими в бота в процессе действия?

Конечно, @darrenj , мы будем проверять это изменение!

@darrenj спасибо за информацию о прогрессе! У меня была та же проблема с локалью, на которую указал Томми Джимми, но я обошел ее, добавив locale.toLowerCase в localeTemplateManager. В настоящее время я прикрепляю пользовательский навык к VA, но все еще получаю сообщение об ошибке, которое пытаюсь отследить. Навык возвращает виртуальному агенту ошибку 501, но он обрабатывает сообщение в функции onMessage в defaultActitivityHandler.ts, он просто не передает действие в основной диалог для обработки навыком. Я добавил навык, обновив файл appSettings.json, и навык получает активность.

@ Batta32 Я хотел проверить, есть ли в пути вперед по-прежнему localTemplateEngineManager. Я заметил, что он отсутствует в предварительных сборках и присутствует только responseManager. В дальнейшем нам нужно будет использовать диспетчер ответов или шаблон языкового стандарта будет добавлен обратно?

@ Batta32 Мне удалось отследить ошибку, которую я получал при общении с навыком от VA. В модуле dialogEx есть трассировка отправки, которая отправляет трассировку обратно в VA, на котором был запущен навык. Эта sendActivity при вызове выдает следующую ошибку:
Ошибка: / api / messages / v3 / беседы / 5659a380-841b-11ea-bed3-831b5a6aa1eb% 7Clivechat-dlpskill-emulator-skillconvo / activity / 5b61c920-841b-11ea-b148-8581dc55a9bb не существует
Когда идентификатор разговора добавлен в SkillConversationIdFactory, навык не может отправить обратно в новый идентификатор разговора.

Обновлять:
У меня была опечатка в skillHostEndpoint, из-за которой возникла эта проблема. Как только я исправил, что теперь я могу прикреплять навыки и заставлять их взаимодействовать с VA.

@ Batta32 @darrenj Я столкнулся с неожиданным поведением при попытке использовать болтовню с VA: в основном каждый раз, когда пользователь что-то спрашивает у бота, интростаг повторно запрашивает исходное сообщение, что в случае болтовни не так хорошо, как UX . Это ожидаемый результат или я что-то упускаю?

Screen Shot 2020-04-23 at 11 25 46

(сообщение, пожалуйста, подождите, это настраиваемое сообщение, не беспокойтесь об этом
)

@ Batta32 Мне удалось отследить ошибку, которую я получал при общении с навыком от VA. В модуле dialogEx есть трассировка отправки, которая отправляет трассировку обратно в VA, на котором был запущен навык. Эта sendActivity при вызове выдает следующую ошибку:
Ошибка: / api / messages / v3 / беседы / 5659a380-841b-11ea-bed3-831b5a6aa1eb% 7Clivechat-dlpskill-emulator-skillconvo / activity / 5b61c920-841b-11ea-b148-8581dc55a9bb не существует
Когда идентификатор разговора добавлен в SkillConversationIdFactory, навык не может отправить обратно в новый идентификатор разговора.

Обновлять:
У меня была опечатка в skillHostEndpoint, из-за которой возникла эта проблема. Как только я исправил, что теперь я могу прикреплять навыки и заставлять их взаимодействовать с VA.

@ tomSauret847 В чем была ваша проблема? потому что у меня такая же ошибка, и я не понимаю, что это такое. В моем виртуальном помощнике есть это:
"skillHostEndpoint": "https://1c34e472.ngrok.io/api/skills"
Это конечная точка VA.

Error: /api/skills/v3/conversations/a%3A1QIRXOg6VwVn2aGC-eTj9sj3YYd6YUVrRKf8J7wLrjH1fPYcpn2dYpMyQpr_aHLHSp9Z2SHVzu8lKbdj_ArEh06kvjyF48IG1tgE1ctKTWdIASDloNgy51_eBFoGzwwIN-waSearchSkill-msteams-skillconvo/activities/1588679971133 does not exist at new RestError (/Users/em.tomaselli/Desktop/repository/BMW/wa-search-skill/node_modules/@azure/ms-rest-js/dist/msRest.node.js:1397:28) at /Users/em.tomaselli/Desktop/repository/BMW/wa-search-skill/node_modules/@azure/ms-rest-js/dist/msRest.node.js:1849:37 at process._tickCallback (internal/process/next_tick.js:68:7)

@ Batta32 Мне удалось развернуть
Ошибка: ошибка при вызове идентификатора навыка: "dlpskill" по адресу "https: // {app name} .azurewebsites.net / api / skill / messages" (статус 500).
Ошибка: / API / / v3 / разговоры / Навыки: 1lFWWXG9CVtdrkA76VLFeS9CbYWzsHVr9mQ4S7BqDpL4K5WNIc0ND6mqaaj_QsSqH-Quu-Gb2vLX3HQ4CpG3ZDPCbR0XKLtJGOqW0kwKUbe2HKv5C9fs1sjLSO4EvoE5h-dlpskill-msteams-skillconvo / мероприятие / 1588712064379 не существует
в SkillDialog.(D: домашний сайтwwrootnode_modulesbotbuilder-dialogslibskillDialog.js: 164: 23)
в Generator.next ()
при выполнении (D: homesitewwwrootnode_modulesbotbuilder-dialogslibskillDialog.js: 11:58)
в process._tickCallback (внутренний / процесс / next_tick.js: 68: 7)

@ tommyJimmy87 Я не использовал ngrok для локальной связи от VA к навыку, поэтому я смог использовать localhost: 3979 / api / Skills для skillHostEndpoint и смог достичь этого навыка. Поскольку вы также используете канал Teams, я скажу, что это проблема с каналом Teams. Вы можете попробовать достичь навыка с помощью веб-чата и посмотреть, сможете ли вы общаться с навыком от VA в лазурном цвете.

Привет, @ Batta32 , я согласен с @ tomSauret847, что, скорее всего, есть какая-то проблема с каналом Teams.

После небольшой отладки я мог бы попытаться объяснить, что я обнаружил:

1) В ChannelServiceHandler не реализованы все методы, это означает, что при вызове одного из /api/skills каждый раз будет возвращаться код ошибки;

т.е. файл: ChannelServiceHandler.ts (botbuilder), строка: 219

    protected async onGetActivityMembers(claimsIdentity: ClaimsIdentity, conversationId: string, activityId: string): Promise<ChannelAccount[]> {
        throw new StatusCodeError(StatusCodes.NOT_IMPLEMENTED, `ChannelServiceHandler.onGetActivityMembers(): ${StatusCodes.NOT_IMPLEMENTED}: ${STATUS_CODES[StatusCodes.NOT_IMPLEMENTED]}`);
    }

2) /api/skills/v3/conversations/a%3A1QIRXOg6VwVn2aGC-eTj9sj3YYd6YUVrRKf8J7wLrjH1fPYcpn2dYpMyQpr_aHLHSp9Z2SHVzu8lKbdj_ArEh06kvjyF48IG1tgE1ctKTWdIASDloNgy51_eBFoGzwwIN-waSearchSkill-msteams-skillconvo/activities/1588761991793 В этом случае вместо этого возникает некоторая проблема с анализом идентификатора разговора, и результатом ошибки всегда является то, что ресурс не существует, но если вы попытаетесь вызвать тот же URL, изменив идентификатор разговора с более простой строкой он будет работать (но результат все равно будет, что метод не реализован из-за предыдущего пункта).

Привет, @ tommyJimmy87 , @ tomSauret847 - извините за задержку. Мы рассмотрим сценарий Teams Channel с использованием изменений SDK GA Skills и вернемся к этой теме позже 😊.

@ tommyJimmy87 - мы успешно воспроизвели проблему с помощью Microsoft Teams Channel. Мы вернемся к этой теме, как только исправим проблему.

Спасибо!

Привет, @ tommyJimmy87 , @ tomSauret847 , мы успешно нашли причину проблемы.

Проблема в том, что символ _ ':' _ заменяется на _ '% 3A'_, когда действия отправляются обратно виртуальному помощнику из навыка, что приводит к несоответствию _conversationId_ между обоими ботами.
По-видимому, это поведение выполняется в зависимости от axios, заменяя упомянутые символы.

И последнее, но не менее важное: есть проблема в microsoft / botbuilder-js # 2182, которая заменяет axios в botbuilder и помечена как готовая к _R10_.

Мы собираемся обновить документ " Известные проблемы", в котором объясняется проблема.

Наконец, мы вернемся к этой теме, как только у нас появятся новые обновления для вас, ребята 😊

_ Несоответствие идентификаторов бесед_
image

Зависимость _axios заменяет ':' на '% 3A'_
image

@ Batta32 Как вы думаете, скоро это будет исправлено или это займет немного времени?

@ tommyJimmy87 , @ tomSauret847 - мы заметили, что проблема в ms-rest-js, а не в axios .

Проблема заключается в несоответствии conversationId между навыком и виртуальным помощником. Эта проблема возникает из-за того, что символ _ ':' _ в _conversationId_ из Teams заменяется на _ '% 3A'_, который следует заменить обратно на _': '_. Последнее преобразование не реализовано в sendOperationRequest, как _axios_.

Простите за ошибку 😊.

_encodeURIComponent не заменяет "% 3A" обратно на ":" _
image

_Различия кодировки между axios и ms-rest-js_
image

@ Batta32 агентом по умолчанию для версий ms-rest-js <2.0 является axios https://github.com/Azure/ms-rest-js/blob/1.x/lib/axiosHttpClient.ts

Я думаю, что один из способов решить эту проблему - использовать encodeURI в реализации SkillConversationIdFactory. Таким образом, базовый агент не изменит идентификатор разговора по сравнению с тем, что хранится в фабрике.

Спасибо @EricDahlvang , мы рассмотрим альтернативу использования encodeURI в SkillConversationIdFactory !

@EricDahlvang - добавление encodeURI в SkillConversationIdFactory не устраняет проблему, поскольку Навык уже кодирует conversationId перед отправкой действий обратно виртуальному помощнику.

Мы поняли, что проблема может быть связана с длиной идентификатора разговора, когда он получен от Microsoft Teams. Мы заметили, что при использовании исходного conversationId конечная точка VA не достигается, однако обрезка некоторых символов из conversationId выполняется правильно.

И последнее, но не менее важное: этой проблемы нет в C #.

_ Конечная точка не достигнута с исходным идентификатором беседы_
image

_Конечная точка достигнута с обрезанным идентификатором беседы_
image

_Проблема отсутствует в C # _
image

@ Batta32 Если SkillConversationIdFactory использует encodeURI, то навык получит этот идентификатор разговора и ответит на него соответствующим образом. Я почти уверен, что это необходимо.

Также да, существует проблема с длинными идентификаторами разговоров при использовании restify. Мы упоминаем, как решить проблему в этом примере: https://github.com/microsoft/BotBuilder-Samples/blob/master/samples/javascript_nodejs/80.skills-simple-bot-to-bot/simple-root -bot / skillConversationIdFactory.js # L21

// Этот ключ по умолчанию имеет ограничение в 100 символов. Увеличьте на restify.createServer({ maxParamLength: 1000 }); в index.js.

@EricDahlvang Спасибо за эту информацию. Я добавил обновление как для своего VA, так и для навыка. Теперь я могу заставить VA без ошибок связываться с навыком в канале Teams.

Спасибо @EricDahlvang за предоставленную информацию! Мы создали PR # 3359, улучшив maxParamLength а также обновив версию @types/restify@^8.4.2 .

Спасибо, ребята, @ tommyJimmy87 , @ tomSauret847 , как только эти изменения будут объединены, вы сможете протестировать его 😊.

image

@ Batta32 извините, что снова беспокою вас, во-первых, я применил изменения, и теперь он работает. Теперь у меня проблема с активностью обновления навыков через VA, в SkillHandler для этого нет реализации, не могли бы вы ее предоставить? Спасибо

Привет @ tommyJimmy87 , мы заметили, что SkillHandler в C # и JS не содержит onUpdateActivity() как вы упомянули, тем временем вы можете добавить свой собственный обработчик, расширяющийся от SkillHandler или ChannelServiceHandler .

@darrenj - можете ли вы подтвердить, что отсутствие метода onUpdateActivity() в SkillHandler является правильным или есть ли какой-либо план его реализации?

@ Batta32 Я действительно пробовал это, реализация выглядит так:

    protected async onUpdateActivity(claimsIdentity: ClaimsIdentity, conversationId: string, activityId: string, activity: Activity): Promise<ResourceResponse> {
        return await this.updateActivity(claimsIdentity, conversationId, activityId, activity);
    }

А функция updateActivity следующая:

private async updateActivity(claimsIdentity: ClaimsIdentity, conversationId: string, replyToActivityId: string, activity: Activity): Promise<ResourceResponse> {

        let skillConversationReference: SkillConversationReference;
        try {
            skillConversationReference = await this.conversationIdFactory.getSkillConversationReference(conversationId);
        } catch (err) {
            // If the factory has overridden getSkillConversationReference, call the deprecated getConversationReference().
            // In this scenario, the oAuthScope paired with the ConversationReference can only be used for talking with
            // an official channel, not another bot.
            if (err.message === 'Not Implemented') {
                const conversationReference = await this.conversationIdFactory.getConversationReference(conversationId);
                skillConversationReference = {
                    conversationReference,
                    oAuthScope: JwtTokenValidation.isGovernment(this.channelService) ?
                        GovernmentConstants.ToChannelFromBotOAuthScope :
                        AuthenticationConstants.ToChannelFromBotOAuthScope
                };
            } else {
                // Re-throw all other errors. 
                throw err;
            }
        }

        if (!skillConversationReference) {
            throw new Error('skillConversationReference not found');
        }
        if (!skillConversationReference.conversationReference) {
            throw new Error('conversationReference not found.');
        }

        const activityConversationReference = TurnContext.getConversationReference(activity);

        /**
         * Callback passed to the BotFrameworkAdapter.createConversation() call.
         * This function does the following:
         *  - Caches the ClaimsIdentity on the TurnContext.turnState
         *  - Applies the correct ConversationReference to the Activity for sending to the user-router conversation.
         *  - For EndOfConversation Activities received from the Skill, removes the ConversationReference from the
         *    ConversationIdFactory
         */
        const callback = async (context: TurnContext): Promise<void> => {
            const adapter: BotFrameworkAdapter = (context.adapter as BotFrameworkAdapter);
            // Cache the ClaimsIdentity and ConnectorClient on the context so that it's available inside of the bot's logic.
            context.turnState.set(adapter.BotIdentityKey, claimsIdentity);
            context.turnState.set(this.SkillConversationReferenceKey, activityConversationReference);
            activity = TurnContext.applyConversationReference(activity, skillConversationReference.conversationReference) as Activity;
            const client = adapter.createConnectorClient(activity.serviceUrl);
            context.turnState.set(adapter.ConnectorClientKey, client);

            context.activity.id = replyToActivityId;
            await context.updateActivity(context.activity);
            return;
        };

        // Add the channel service URL to the trusted services list so we can send messages back.
        // the service URL for skills is trusted because it is applied based on the original request
        // received by the root bot.
        AppCredentials.trustServiceUrl(skillConversationReference.conversationReference.serviceUrl);

        await (this.adapter as BotFrameworkAdapter).continueConversation(skillConversationReference.conversationReference, skillConversationReference.oAuthScope, callback);
        return { id: uuid() };
    }

По сути, это копия функции processActivity которая уже реализована в SkillHandler но вызывает context.updateActivity(context.activity) в конце.

Сказал, что я получаю эту ошибку:

(node:68325) UnhandledPromiseRejectionWarning: Error: Failed to decrypt conversation id 

Возможно, что-то мне не хватает или я делаю не так.

@ tommyJimmy87 - мы постараемся воспроизвести ваш сценарий и вернемся к вам позже 😊.

@ Batta32 Я заметил на «

Привет, @ tommyJimmy87 , @ tomSauret847! Спасибо, что сообщили об этих проблемах.

Поскольку [email protected] , [email protected] и [email protected] опубликованы в npmjs и объединены в ветке master , вы можете создавать задачи в репозитории, чтобы лучше объясните проблему, и мы будем следить за ними 😊.

Была ли эта страница полезной?
0 / 5 - 0 рейтинги