ããŒãã£ã«ã¢ã·ã¹ã¿ã³ããããžã§ã¯ããšã¹ãã«ãããžã§ã¯ãã
Typescriptã
MS Teams Channelãããã¹ãã«ããã¢ã¯ãã£ããã£ãæŽæ°ããããšãããšãä»®æ³ã¢ã·ã¹ã¿ã³ãã¯ãšã©ãŒã«ãªããŸãã
updateActivity
é¢æ°ãå®è£
ãããŠããªãããããããå®è£
ããå¿
èŠããããŸãïŒonUpdateActivity
å®è£
ããŸãã 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);
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;
};
AppCredentials.trustServiceUrl(skillConversationReference.conversationReference.serviceUrl);
await (this.adapter as BotFrameworkAdapter).continueConversation(skillConversationReference.conversationReference, skillConversationReference.oAuthScope, callback);
return { id: uuid() };
}
SkillHandler
宣èšãå€æŽããŸãã// Register the request handler.
const handler: CustomSkillHandler = new CustomSkillHandler(adapter, bot, skillConversationIdFactory, credentialProvider, authenticationConfiguration);
const skillEndpoint = new ChannelServiceRoutes(handler);
skillEndpoint.register(server, '/api/skills');
ã«ãŒãã¯Teamsã§æŽæ°ãããŸã
ãšã©ãŒã¯ãVAãåè¿°ã®é¢æ°onUpdateActivity
ããã¢ã¯ãã£ããã£ãæŽæ°ããããšãããšãã«è¡šç€ºãããŸãã
(node:13410) UnhandledPromiseRejectionWarning: Error: Failed to decrypt conversation id
at new RestError (/Users/xxxx/Desktop/repository/xxx/virtual-assistant/node_modules/botframework-connector/node_modules/@azure/ms-rest-js/dist/msRest.node.js:1397:28)
at /Users/xxxx/Desktop/repository/xxx/virtual-assistant/node_modules/botframework-connector/node_modules/@azure/ms-rest-js/dist/msRest.node.js:1849:37
at process._tickCallback (internal/process/next_tick.js:68:7)
(node:13410) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). (rejection id: 10)
ãã£ãã«ããŒã
ãã®åé¡ãå ±åããŠããã@ tommyJimmy87ã«æè¬ããŸããç§ãã¡ã¯ãŸã ãããã¬ãã¥ãŒããŠããŸãã æŽæ°ããã次第ãæãè¿ããé£çµ¡ããããŸãðïŒ
ããã«ã¡ã¯@ tommyjimmy87 ãç§ãã¡ã¯ããªããçŽé¢ããŠããåé¡ãåçŸ
The Card is updated in Teams
ãšã¯ã©ãããæå³ã§ããïŒCustomSkillHandler
ãã©ã®ããã«ãã¹ãããŠããŸããïŒããã¯ããã®åé¡ãåçŸããããã«è¡ã£ãææ°ã®å€æŽãå«ããã©ã³ãã§ãã
generator-bot-virtualassistant
ã䜿çšããŠVAãšã¹ãã«ãå±éããŸãbotskills connect
ã³ãã³ãã䜿çšããŠVAãšã¹ãã«ãæ¥ç¶ããŸãCustomSkillHandler
onUpdateActivityã¡ãœãããšupdateActivityã¡ãœãããè¿œå ããŸãCustomSkillHandler
ãåãåãããã«ã€ã³ããã¯ã¹ãã¡ã€ã«ãå€æŽããŸãç§ãã¡ã¯ããªãã®çãã«æ°ãé ããŸãïŒ
ããã«ã¡ã¯@ Batta32 ãããªãã®è³ªåã«çããããšããŸãïŒ
ã€ãŸããMS Teamsãã£ãã«ã§adaptive card
ãæŽæ°ããããšããŠããŸãããã®çµæãäœããã®ã¢ã¯ã·ã§ã³ãå®è¡ããåŸã«ã«ãŒããæŽæ°ãããã¯ãã§ãïŒã«ãŒãã¯ã¹ãã«ã®ç¯å²å
ã§ãããããåºæ¬çã«ãã¹ãã¯updateActivity
ã¹ãã«ããVAãžã®
ã¯ããVAãšã¹ãã«ã®äž¡æ¹ãTypescriptã«ãããŸã
ç§ã®ã¹ãã«ã§ã¯adaptive card
ããããŸãããŠãŒã¶ãŒããã®ã¢ã¯ã·ã§ã³ã®åŸããã®ã«ãŒãã¯å¥ã®ã³ã³ãã³ãã§æŽæ°ããå¿
èŠããããŸãã ç§ãupdateActivity
ãšåŒã¶ã¹ãã«ããïŒ
dc.context.updateActivity(previouslySentActivity);
previouslySentActivity
æŽæ°ããã¢ã¯ãã£ããã£ã§ããåŸã§æŽæ°ã§ããããã«ãã¢ã¯ãã£ããã£ãç¶æ
ã§ä¿åããŸãã ããã¯ä»¥åã®ããŒãžã§ã³ã§æ©èœããŠããŸããããç§ãç解ããŠããéããã¢ã¯ãã£ããã£ã®éä¿¡ãšæŽæ°ã®ãããŒã¯æ°ããããŒãžã§ã³ã§å€æŽãããŸããã
ããã«ãããVAãšã³ããã€ã³ãïŒããã¯æ©èœããŠããŸãïŒãåŒã³åºãããã¢ã¯ãã£ããã£ãæŽæ°ãããŸãã åŒã³åºãã¯onUpdateActivity
ã¡ãœããã®CustomSkillHandler
ã«å
¥ããŸãããã¢ã¯ãã£ããã£ãMSTeamsã«éä¿¡ããããšãšã©ãŒãçºçããŸãã
ããã«ã³ã³ããã¹ããå¿ èŠãªå Žåã¯ãç¥ãããã ããããã®éããã©ã³ãã§ããããè©ŠããŠãåããšã©ãŒãçºçãããã©ããã確èªã§ããŸãã
ããã«ã¡ã¯@ Batta32 ãç§ã¯ããªãããã¹ãã«äœ¿çšããŠãããã©ã³ãããããããã¹ãããŸããã ããã§ãã©ãŒã¯ãäœæããŸããïŒ https ïŒ
åããšã©ãŒãåçŸããããã«ãã©ã³ããå€æŽããŸããã testSkillHandler
ã«ããšã©ãŒãååŸããããã«try-catchãè¿œå ããŸããã
try{
await context.updateActivity(activity);
}catch(e){
console.log(e);
}
ããã¯ç§ãupdateActivity
åŒã³åºãããåŸãŠããå®éã®ãšã©ãŒã§ãïŒ
{ body: '{"error":{"code":"ServiceError","message":"Unknown"}}',
headers: HttpHeaders { _headersMap: [Object] },
status: 400 },
body: { error: { code: 'ServiceError', message: 'Unknown' } } }
ããã¯ç§ã®ãããžã§ã¯ãã§åŸããã®ãšåãã§ãã
ããã¯ç§ãè¡ã£ããã¹ãã§ãïŒ
ãµã³ãã«ã¹ãã«testUpdateActivityDialog
å
ã«æ°ãããã€ã¢ãã°ãäœæããŸãããããã§ãbeginDialogã§TestCard
ãããã¹ããšãšãã«éä¿¡ããŸãã onContinueDialog
ãåãã«ãŒããç°ãªãããã¹ãã§éä¿¡ããŸãã
VAãã¹ãã«ã«æ¥ç¶ããŸãã
ã¹ãã«ãåŒã³åºããŠãã¹ããã€ã¢ãã°ãéå§ããã«ãŒãã衚瀺ããæå³ãæã£ãŠVAãåŒã³åºããŸãã
ã¹ãã«ãšãã¹ããã€ã¢ãã°ã®continueDialog
ãåŒã³åºãæå³ãæã£ãŠVAãåŒã³åºããŸãã
ã¹ãã«ã¯ã«ãŒããæŽæ°ããããã«VAãåŒã³åºãããšã©ãŒãçºçããŸãã
çŽ æŽããã@ tommyJimmy87 ïŒ ãã®æ°ããæ å ±ã§ã¬ãã¥ãŒããŸããããããšãããããŸããðã
ããã«ã¡ã¯@ tommyJimmy87ïŒ ææ°ã®å€æŽãšåè¿°ã®åçŸæé ã䜿çšããŠãã·ããªãªãæ£åžžã«åçŸããŸããã
ä»åŸããã®åé¡ã«ã€ããŠèª¿æ»ãç¶ããŠãããŸãã æŽæ°ããã次第ãæãè¿ããé£çµ¡ããããŸãðã
_ã¹ãã«ãã¢ã¯ãã£ããã£æ
å ±ãVAã«éä¿¡ãããšãã«åãåé¡ãæ€åºããVAããããšã¹ãã«ãããéã®æ¥ç¶ããã¹ãããŸãã_
ããã«ã¡ã¯@ DiegoCardozo94 ã
æŽæ°ããŠããã ãããããšãããããŸãã
ããããã€ãªãªãŒã¹ããããèããŠããŸããïŒ
ç§ãã¡ã®åŽããå³å¯ã«ãªãªãŒã¹ãããŠããã®ã§ãããã¯17æ¥ããåã«ãªãªãŒã¹ã§ãããšæããŸããïŒ17æ¥ãå®è¡å¯èœãã©ãããç解ãããã ãã§ããïŒ :)
ããããšã
ããã«ã¡ã¯@ tommyJimmy87 ãé ããŠãã¿ãŸããã
ãã®åé¡ãCïŒã§ã
ç§ãã¡ã¯ããã€ãã®é¢é£ããåé¡ãèŠã€ããŸããïŒ
SkillHandler
ãåœã®ResourceResponse
çæããããšã詳ãã説æããŠããŸãã ãã®æ段ãã®ãããªæäœupdate
ãšdelete
ã§ã¯ãªãã§ãããäœåãSkillHandler
ã¯ã©ã¹ãOnUpdateActivityAsync
å®è£
ããŠããªãããšã詳ãã説æããŠããŸããæåŸã«ãªããŸããããåè¿°ã®æé ã䜿çšããŠã次ã®ã·ããªãªãæ€èšŒããŸããã
@ darrenj ãCïŒãããã䜿çšããŠãã®åé¡ãåçŸããŸããã
ç§ãã¡ã®ãã¹ãç°å¢ïŒ
ç§ãã¡ã®åçŸæé ïŒ
_ã¢ã¯ãã£ããã£ãæŽæ°ããããšãããšãä»®æ³ã¢ã·ã¹ã¿ã³ãã¯äŸå€ãã¹ããŒããŸã_
_TypeScriptã¹ãã«ãMicrosoftTeams Channelã§æ£åžžã«å®è¡ããã以åã«éä¿¡ãããã«ãŒããæŽæ°ãããŸãã_
ããã«ã¡ã¯ã httpsïŒ//github.com/microsoft/botframework-sdk/issues/5919ã¯ããµããŒããããŠãã3ã€ã®èšèªãã¹ãŠã«å¯Ÿå¿ããŠããŸãããã®ãœãªã¥ãŒã·ã§ã³ããææ¥ããå§ãŸããã€ãªãŒãã«ãã®1ã€ã䜿çšããã®ã«åœ¹ç«ã€ãã©ããè©ŠããŠã¿ãŠãã ããã
ããã«ã¡ã¯@ Batta32 ãããã§æåã«æŽæ°ããå¿ èŠããããã®ããããŸããïŒ ããã¯ç§ããã§ã«è©Šãããšãã§ãããã®ã§ã¯ãããŸãããïŒ
ããã«ã¡ã¯@ tommyJimmy87ïŒ ã¯ãã @ gabogãTypeScriptãšCïŒã«ã€ããŠèšåããããšãæ€èšŒããŸãã
ãã®ãã©ã³ããæŽæ°ããŠãæåŸã®æŽæ°ãè¿œå ãã botbuilder-v4-js- microsoft / botbuilder-jsïŒ2489ããã³microsoft / botbuilder-dotnetïŒ4264ãå«ãSDKã®ãã€ãªãŒãã«ããçµã¿èŸŒã¿ãŸãã
æŽæ°ããã次第ãæãè¿ããé£çµ¡ããããŸãðã
ããã«ã¡ã¯tommyJimmy87 @ãæã
ãæ£åžžã«ãã€ã¯ããœãã/ã®botbuilder-jsããïŒ2489ã®å€æŽãé©çšããããšã§ããããšã確èªãtestSkillHandler
ãã®åé¡ã解決ããã掻åãæ£ãããã€ã¯ããœããããŒã ã®ãã£ãã«ã䜿çšããŠæŽæ°ãããŸãã
testSkillHandler
ãç¹ã«processActivity
ã¡ãœããã«é©çšããå¿
èŠãããå€æŽãç¹å®ããã«ã¯ããã®ã³ãããã確èªããŠãã ããã
@ darrenj ïŒ @ gabog- CïŒãããã䜿çšããŠmicrosoft / botbuilder-dotnetïŒ4264ã®å€æŽãæ£åžžã«æ€èšŒããŸããã
ç§ãã¡ã®ãã¹ãç°å¢ïŒ
åçŸæé ïŒ
_testSkillHandlerã®processActivityã¡ãœããã«å ããããå€æŽ_
_TypeScript VirtualAssistantãMicrosoftTeams Channelã§æ£åžžã«å®è¡ããã以åã«éä¿¡ãããã«ãŒããæŽæ°ãããŸãã_
ç§ãã¡ã¯ããªãã®çãã«æ°ãé ããŸãïŒ
ããã«ã¡ã¯@ Batta32 ãã¢ããããŒããããããšããç§ãã¡ã¯ãããã§ããã ãæ©ãè©ŠããŠã¿ãŸãã ç§ã®åŽããã®1ã€ã®è³ªåïŒã©ã€ãã©ãªã®ããŒãžã§ã³ãå€æŽãããã®ã§ããããããšãäžèšã§æçš¿ããã³ãããã ãã§ããïŒ ããããšã
@ tommyJimmy87-äžèšã«æçš¿ããã³ãããã ãã§ãïŒ
ããã«ã¡ã¯@ Batta32 :)ããã解決ããããã§ãïŒ ææ¥ã¯ããã«è©³çŽ°ãªãã¹ããè¡ããŸãããæäŸãããã¹ãã¹ãã«ãã³ãã©ãŒã¯ã©ã¹ã®å€æŽã«ã¯åé¡ããªãããã§ãã ããããšãïŒ
ããããšã@ tommyJimmy87ïŒ ããã確èªã§ã次第ããã®åé¡ã解決ã§ããŸãðã
ããã«ã¡ã¯@ Batta32ïŒ ãã®åé¡ã¯åãã§ã¯ããŒãºã§ããŸã:)
ããã確èªããŠãããŠããããšã@ tommyJimmy87 ïŒ
@ darrenj -SDKããŒã ã«ãã£ãŠè§£æ±ºãããããããã®åé¡ã解決ã§ããŸãã
æãåèã«ãªãã³ã¡ã³ã
ããã«ã¡ã¯@ Batta32 :)ããã解決ããããã§ãïŒ ææ¥ã¯ããã«è©³çŽ°ãªãã¹ããè¡ããŸãããæäŸãããã¹ãã¹ãã«ãã³ãã©ãŒã¯ã©ã¹ã®å€æŽã«ã¯åé¡ããªãããã§ãã ããããšãïŒ