Botframework-solutions: 0.8둜 λ§ˆμ΄κ·Έλ ˆμ΄μ…˜ν•œ ν›„ μ—…λ°μ΄νŠΈ μž‘μ—…μ΄ μž‘λ™ν•˜μ§€ μ•ŠμŒ

에 λ§Œλ“  2020λ…„ 05μ›” 20일  Β·  18μ½”λ©˜νŠΈ  Β·  좜처: microsoft/botframework-solutions

μ–΄λ–€ ν”„λ‘œμ νŠΈκ°€ 영ν–₯을 λ°›μŠ΅λ‹ˆκΉŒ?

가상 μ–΄μ‹œμŠ€ν„΄νŠΈ ν”„λ‘œμ νŠΈ 및 μŠ€ν‚¬ ν”„λ‘œμ νŠΈ.

이것은 μ–΄λ–€ μ–Έμ–΄λ‘œ λ˜μ–΄ μžˆμŠ΅λ‹ˆκΉŒ?

νƒ€μ΄ν”„μŠ€ν¬λ¦½νŠΈ.

무슨 일이야?

MS νŒ€ μ±„λ„μ—μ„œ μŠ€ν‚¬μ˜ ν™œλ™μ„ μ—…λ°μ΄νŠΈν•˜λ €κ³  ν•˜λ©΄ 가상 λ„μš°λ―Έμ— 였λ₯˜κ°€ λ°œμƒν•©λ‹ˆλ‹€.

이 문제λ₯Ό μž¬ν˜„ν•˜κΈ° μœ„ν•œ λ‹¨κ³„λŠ” λ¬΄μ—‡μž…λ‹ˆκΉŒ?

  1. VA 및 Skill을 Typescript의 μ΅œμ‹  버전 0.8둜 λ§ˆμ΄κ·Έλ ˆμ΄μ…˜
  2. VAμ—μ„œ "ChannelServiceHandler" 클래슀λ₯Ό ν™•μž₯ν•˜λŠ” μƒˆ 클래슀 "CustomSkillHandler"λ₯Ό κ΅¬ν˜„ν•΄μ•Ό ν•©λ‹ˆλ‹€( updateActivity ν•¨μˆ˜κ°€ 제곡된 "SkillHandler"μ—μ„œ κ΅¬ν˜„λ˜μ§€ μ•ŠκΈ° λ•Œλ¬Έμ— 이λ₯Ό κ΅¬ν˜„ν•΄μ•Ό 함).
  3. "CustomSkillHandler" λ‚΄λΆ€μ—μ„œ 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() };
    }
  1. μƒ‰μΈμ—μ„œ 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');

  1. νŒ€ μ±„λ„μ—μ„œ μ—…λ°μ΄νŠΈ ν™œλ™μ„ ν…ŒμŠ€νŠΈν•©λ‹ˆλ‹€.

무슨 일이 일어날 것이라고 μ˜ˆμƒν–ˆμŠ΅λ‹ˆκΉŒ?

μΉ΄λ“œκ°€ νŒ€μ—μ„œ μ—…λ°μ΄νŠΈλ©λ‹ˆλ‹€.

둜그, 였λ₯˜ 좜λ ₯ 등을 κ³΅μœ ν•  수 μžˆμŠ΅λ‹ˆκΉŒ?

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)

μŠ€ν¬λ¦°μƒ·μ΄λ‚˜ μΆ”κ°€ μ»¨ν…μŠ€νŠΈκ°€ μžˆμŠ΅λ‹ˆκΉŒ?

채널 νŒ€

Bot Services Bug customer-replied-to customer-reported

κ°€μž₯ μœ μš©ν•œ λŒ“κΈ€

@Batta32 λ‹˜ μ•ˆλ…•ν•˜μ„Έμš” :)

λͺ¨λ“  18 λŒ“κΈ€

이 문제λ₯Ό 보고해 μ£Όμ…”μ„œ κ°μ‚¬ν•©λ‹ˆλ‹€ @tommyJimmy87 . 아직 κ²€ν†  μ€‘μž…λ‹ˆλ‹€. μ—…λ°μ΄νŠΈλ˜λŠ” λŒ€λ‘œ λ°”λ‘œ μ—°λ½λ“œλ¦¬κ² μŠ΅λ‹ˆλ‹€ 😊!

@tommyjimmy87λ‹˜ , μ•ˆλ…•ν•˜μ„Έμš”, κ·€ν•˜κ°€ μ§λ©΄ν•œ 문제λ₯Ό μž¬ν˜„ν•  수 μ—†μœΌλ―€λ‘œ 무엇이 잘λͺ»λ˜μ—ˆλŠ”지 νŒŒμ•…ν•˜κΈ° μœ„ν•΄ κ·€ν•˜κ°€ ν•˜κ³  μžˆλŠ” μž‘μ—…μ— λŒ€ν•œ μΆ”κ°€ μž¬ν˜„ 단계λ₯Ό μ œκ³΅ν•΄μ•Ό ν•©λ‹ˆλ‹€.

  1. The Card is updated in Teams 은(λŠ”) 무슨 λœ»μΈκ°€μš”?
  2. TypeScript λ²„μ „μ—μ„œ Virtual Assistant 및 Skill을 μ‚¬μš©ν•˜κ³  μžˆμŠ΅λ‹ˆκΉŒ?
  3. Virtual Assistant & Skill μ‚¬μ΄μ˜ μ—°κ²°/톡신 단계와 CustomSkillHandler ν…ŒμŠ€νŠΈ 방법을 μ œκ³΅ν•  수 μžˆμŠ΅λ‹ˆκΉŒ?
  4. [email protected] 을 μ‚¬μš©ν•˜μ—¬ 가상 λ„μš°λ―Έ 및 κΈ°μˆ μ„ μƒμ„±ν•˜κ³  μžˆμŠ΅λ‹ˆκΉŒ?

λ‹€μŒμ€ 이 문제λ₯Ό μž¬ν˜„ν•˜κΈ° μœ„ν•΄ μˆ˜ν–‰ν•œ μ΅œμ‹  λ³€κ²½ 사항 이 μžˆλŠ” λΆ„κΈ°μž…λ‹ˆλ‹€.

ν™˜κ²½

μž¬ν˜„ 단계

  1. generator-bot-virtualassistant μ‚¬μš©ν•˜μ—¬ VA 및 기술 배포
  2. botskills connect λͺ…령을 μ‚¬μš©ν•˜μ—¬ VA 및 Skill μ—°κ²°
  3. ChannelServiceHandlerμ—μ„œ ν™•μž₯λ˜λŠ” μƒˆ CustomSkillHandler 클래슀 λ§Œλ“€κΈ°
  4. CustomSkillHandler 에 onUpdateActivity 및 updateActivity λ©”μ†Œλ“œ μΆ”κ°€
  5. CustomSkillHandler λ₯Ό μˆ˜μ‹ ν•˜λ„λ‘ 인덱슀 파일 μˆ˜μ •
  6. Teams 채널을 μ‚¬μš©ν•˜μ—¬ Virtual Assistant와 Skill κ°„μ˜ μ—°κ²° ν…ŒμŠ€νŠΈ

μš°λ¦¬λŠ” λ‹Ήμ‹ μ˜ λŒ€λ‹΅μ—μ£Όμ˜λ₯Ό 기울일 κ²ƒμž…λ‹ˆλ‹€!

μ•ˆλ…•ν•˜μ„Έμš” @Batta32λ‹˜ , κ·€ν•˜μ˜ μ§ˆλ¬Έμ— λ‹΅λ³€ν•΄ λ“œλ¦¬κ² μŠ΅λ‹ˆλ‹€.

  1. λ‚΄ 말은 MS Teams μ±„λ„μ—μ„œ adaptive card 을 μ—…λ°μ΄νŠΈν•˜λ €κ³  ν•˜λŠ”λ° κ²°κ³ΌλŠ” λ‚΄κ°€ μ–΄λ–€ μž‘μ—…μ„ μˆ˜ν–‰ν•œ ν›„ μΉ΄λ“œκ°€ μ—…λ°μ΄νŠΈλ˜μ–΄μ•Ό ν•œλ‹€λŠ” κ²ƒμž…λ‹ˆλ‹€(μΉ΄λ“œλŠ” μŠ€ν‚¬ 내에 μžˆμœΌλ―€λ‘œ 기본적으둜 ν…ŒμŠ€νŠΈλŠ” updateActivity μŠ€ν‚¬μ—μ„œ VAκΉŒμ§€).

  2. 예, VA와 Skill λͺ¨λ‘ Typescript에 μžˆμŠ΅λ‹ˆλ‹€.

  3. κΈ°μˆ μ—μ„œ adaptive card κ°€ μžˆμŠ΅λ‹ˆλ‹€. μ‚¬μš©μžμ˜ μž‘μ—… 후에 이 μΉ΄λ“œλŠ” λ‹€λ₯Έ μ½˜ν…μΈ λ‘œ μ—…λ°μ΄νŠΈλ˜μ–΄μ•Ό ν•©λ‹ˆλ‹€. μŠ€ν‚¬μ—μ„œ updateActivity .

dc.context.updateActivity(previouslySentActivity);

previouslySentActivity μ—…λ°μ΄νŠΈν•˜λ €λŠ” μ•‘ν‹°λΉ„ν‹°μž…λ‹ˆλ‹€. λ‚˜μ€‘μ— μ—…λ°μ΄νŠΈν•  수 μžˆλ„λ‘ μ•‘ν‹°λΉ„ν‹°λ₯Ό μƒνƒœμ— μ €μž₯ν•©λ‹ˆλ‹€. 이 μ‚¬μš©μ€ 이전 λ²„μ „μ—μ„œ μž‘λ™ν•˜μ§€λ§Œ λ‚΄κ°€ μ΄ν•΄ν•˜λŠ” ν•œ 전솑 및 μ—…λ°μ΄νŠΈ ν™œλ™μ˜ 흐름은 μƒˆ λ²„μ „μ—μ„œ λ³€κ²½λ˜μ—ˆμŠ΅λ‹ˆλ‹€.

그러면 ν™œλ™μ„ μ—…λ°μ΄νŠΈν•΄μ•Ό ν•˜λŠ” VA 끝점(μž‘λ™ 쀑)이 ν˜ΈμΆœλ©λ‹ˆλ‹€. ν˜ΈμΆœμ€μ— μ™€μ„œ CustomSkillHandler μ—μ„œ onUpdateActivity λ°©λ²•ν•˜μ§€λ§Œ ν™œλ™μ΄ MS νŒ€μ— 보낼 λ•Œ λ‚˜λŠ”μ΄ 였λ₯˜κ°€ λ°œμƒν•©λ‹ˆλ‹€.

  1. μ•„λ‹ˆμš”, λΆˆν–‰νžˆλ„ 우리 ν”„λ‘œμ νŠΈλŠ” 이미 κ³ κΈ‰ μƒνƒœμ— 있으며 기본적으둜 μˆ˜λ™μœΌλ‘œ λ§ˆμ΄κ·Έλ ˆμ΄μ…˜ν•œ λͺ¨λ“  μ‚¬μš©μž 지정 ν•­λͺ©μ„ μœ μ§€ κ΄€λ¦¬ν•˜λ©΄μ„œ μƒˆ λ²„μ „μœΌλ‘œ λ§ˆμ΄κ·Έλ ˆμ΄μ…˜ν•΄μ•Ό ν–ˆμŠ΅λ‹ˆλ‹€. μœ„λŒ€ν•˜μ§€λŠ” μ•Šμ§€λ§Œ ν•„μš”ν•œ κ²ƒμž…λ‹ˆλ‹€.

더 λ§Žμ€ μ»¨ν…μŠ€νŠΈκ°€ ν•„μš”ν•˜λ©΄ μ•Œλ €μ£Όμ‹­μ‹œμ˜€. ν•œνŽΈ, κ·€ν•˜μ˜ μ§€μ μ—μ„œλ„ 이것을 μ‹œλ„ν•˜κ³  λ™μΌν•œ 였λ₯˜κ°€ μžˆλŠ”μ§€ 확인할 수 μžˆμŠ΅λ‹ˆλ‹€.

μ•ˆλ…•ν•˜μ„Έμš” @ Batta32 , ν…ŒμŠ€νŠΈμ— μ‚¬μš©ν•˜λŠ” μ§€μ μ—μ„œ ν…ŒμŠ€νŠΈν–ˆμŠ΅λ‹ˆλ‹€. μ—¬κΈ°μ—μ„œ 포크λ₯Ό λ§Œλ“€μ—ˆμŠ΅λ‹ˆλ‹€. https://github.com/tommyJimmy87/botframework-solutions/tree/feature/southworks/conversationid-issue
λ™μΌν•œ 였λ₯˜λ₯Ό μž¬ν˜„ν•˜κΈ° μœ„ν•΄ 지점을 λ³€κ²½ν–ˆμŠ΅λ‹ˆλ‹€. 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' } } }

λ‚΄ ν”„λ‘œμ νŠΈμ—μ„œ μ–»λŠ” 것과 λ™μΌν•©λ‹ˆλ‹€.
이것은 λ‚΄κ°€ ν•œ ν…ŒμŠ€νŠΈμž…λ‹ˆλ‹€.

  1. sample-skill testUpdateActivityDialog μ•ˆμ— μƒˆ Dialogλ₯Ό λ§Œλ“€μ—ˆμŠ΅λ‹ˆλ‹€. μ—¬κΈ°μ„œ beginDialogμ—μ„œ ν…μŠ€νŠΈμ™€ ν•¨κ»˜ TestCard λ₯Ό λ³΄λƒ…λ‹ˆλ‹€. onContinueDialog μ—μ„œ λ™μΌν•œ μΉ΄λ“œλ₯Ό λ³΄λ‚΄μ§€λ§Œ λ‹€λ₯Έ ν…μŠ€νŠΈλ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€.

  2. VAλ₯Ό μŠ€ν‚¬μ— μ—°κ²°ν•©λ‹ˆλ‹€.

  3. μŠ€ν‚¬μ„ ν˜ΈμΆœν•˜κ³  ν…ŒμŠ€νŠΈ λŒ€ν™” μƒμžλ₯Ό μ‹œμž‘ν•˜κ³  μΉ΄λ“œλ₯Ό ν‘œμ‹œν•  μ˜λ„λ‘œ VAλ₯Ό ν˜ΈμΆœν•©λ‹ˆλ‹€.

  4. Skillκ³Ό Test Dialog의 continueDialog λ₯Ό ν˜ΈμΆœν•  μ˜λ„λ‘œ VAλ₯Ό ν˜ΈμΆœν•©λ‹ˆλ‹€.

  5. κΈ°μˆ μ€ μΉ΄λ“œλ₯Ό μ—…λ°μ΄νŠΈν•˜κΈ° μœ„ν•΄ VAλ₯Ό ν˜ΈμΆœν•œ λ‹€μŒ 였λ₯˜κ°€ λ°œμƒν•©λ‹ˆλ‹€.

멋지닀 @tommyJimmy87 ! μƒˆλ‘œμš΄ μ •λ³΄λ‘œ λ¦¬λ·°ν•΄λ“œλ¦¬κ² μŠ΅λ‹ˆλ‹€ 😊 정말 κ°μ‚¬ν•©λ‹ˆλ‹€.

μ•ˆλ…•ν•˜μ„Έμš” @tommyJimmy87μž…λ‹ˆλ‹€! μ΅œμ‹  λ³€κ²½ 사항과 μ–ΈκΈ‰λœ μž¬ν˜„ 단계λ₯Ό μ‚¬μš©ν•˜μ—¬ μ‹œλ‚˜λ¦¬μ˜€λ₯Ό μ„±κ³΅μ μœΌλ‘œ μž¬ν˜„ ν–ˆμŠ΅λ‹ˆλ‹€.

μš°λ¦¬λŠ” 이 λ¬Έμ œμ— λŒ€ν•΄ 계속 연ꡬ할 κ²ƒμž…λ‹ˆλ‹€. μ—…λ°μ΄νŠΈλ˜λŠ” λŒ€λ‘œ λ°”λ‘œ μ—°λ½λ“œλ¦¬κ² μŠ΅λ‹ˆλ‹€ 😊.

_μŠ€ν‚¬μ΄ VA에 ν™œλ™ 정보λ₯Ό 보낼 λ•Œ λ™μΌν•œ 문제λ₯Ό κ°μ§€ν•˜λŠ” VA와 Skill 봇 κ°„μ˜ 연결을 ν…ŒμŠ€νŠΈν–ˆμŠ΅λ‹ˆλ‹€_
image

μ•ˆλ…•ν•˜μ„Έμš” @DiegoCardozo94 ,

μ—…λ°μ΄νŠΈν•΄μ£Όμ…”μ„œ κ°μ‚¬ν•©λ‹ˆλ‹€.

이거 μ–Έμ œ μΆœμ‹œλ μ§€ μ•„μ‹œλŠ”λΆ„ κ³„μ‹ κ°€μš”?
17일 이전에 λ°œλ§€κ°€ κ°€λŠ₯ν• κΉŒμš”? :)

감사 ν•΄μš”

@tommyJimmy87 μ•ˆλ…•ν•˜μ„Έμš”,

μš°λ¦¬λŠ” 이 문제 κ°€ C#μ—μ„œλ„

λͺ‡ 가지 κ΄€λ ¨ 문제λ₯Ό μ°Ύμ•˜μŠ΅λ‹ˆλ‹€.

  1. microsoft/botframework-sdk#5919: SkillHandler κ°€ κΈ°μˆ μ—μ„œ μ±„λ„λ‘œ ν™œλ™μ„ 전달할 λ•Œ κ°€μ§œ ResourceResponse μƒμ„±ν•œλ‹€κ³  μžμ„Ένžˆ μ„€λͺ…ν•©λ‹ˆλ‹€. 즉, update 및 delete μž‘μ—…μ€ μž‘λ™ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€ .
  2. microsoft/botbuilder-dotnet#3686: SkillHandler ν΄λž˜μŠ€κ°€ OnUpdateActivityAsync κ΅¬ν˜„ν•˜μ§€ μ•ŠλŠ”λ‹€κ³  μžμ„Ένžˆ μ„€λͺ…ν•©λ‹ˆλ‹€.
    가상 λ„μš°λ―Έ 없이 μŠ€ν‚¬μ„ μ‹€ν–‰ν•˜λ©΄ μΉ΄λ“œκ°€ μ˜¬λ°”λ₯΄κ²Œ μ—…λ°μ΄νŠΈλ˜μ§€λ§Œ 가상 λ„μš°λ―Έμ— μ—°κ²°ν•˜μ—¬ μ‹€ν–‰ν•˜λ©΄ μΉ΄λ“œκ°€ μ—…λ°μ΄νŠΈλ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.
    이 λ¬Έμ œμ—λŠ” 이 λ¬Έμ œκ°€ λ‹€μŒ 릴리슀 μ—μ„œ μˆ˜μ •λ˜μ–΄μ•Ό ν•œλ‹€λŠ” 의견 이 μžˆμŠ΅λ‹ˆλ‹€. 이 microsoft/botframework-sdk#5788μ—μ„œ μž‘μ—… μƒνƒœλ₯Ό 좔적할 수 μžˆμŠ΅λ‹ˆλ‹€.
  3. officedev/botbuilder-microsoftteams#124: Teams μ±„λ„μ—μ„œ V3 봇을 μ‚¬μš©ν•˜λ©΄ HTTP 400 잘λͺ»λœ μš”μ²­(이 λ¬Έμ œμ™€ μœ μ‚¬)으둜 μ‹€νŒ¨ν•œλ‹€κ³  μžμ„Ένžˆ μ„€λͺ…ν•©λ‹ˆλ‹€.

λ§ˆμ§€λ§‰μœΌλ‘œ μ–ΈκΈ‰λœ 단계λ₯Ό μ‚¬μš©ν•˜μ—¬ λ‹€μŒ μ‹œλ‚˜λ¦¬μ˜€λ₯Ό κ²€μ¦ν–ˆμŠ΅λ‹ˆλ‹€.

  • [μž‘λ™] TypeScript μŠ€ν‚¬ 단독
  • [μž¬ν˜„λœ 문제] TypeScript Virtual Assistant와 μ—°κ²°λœ TypeScript Skill
  • [μž¬ν˜„λœ 문제] TypeScript Virtual Assistant μ—°κ²° C# Skill
  • [문제 μž¬ν˜„] C# 가상 λ„μš°λ―Έ μ—°κ²° TypeScript 기술
  • [문제 μž¬ν˜„] C# 가상 λ„μš°λ―Έ μ—°κ²° C# μŠ€ν‚¬

@darrenj , μš°λ¦¬λŠ” C# 봇도 μ‚¬μš©ν•˜μ—¬ 이 문제λ₯Ό 볡제 ν–ˆμŠ΅λ‹ˆλ‹€.

우리의 ν…ŒμŠ€νŠΈ ν™˜κ²½ :

  • μˆ˜μ • 사항이 μžˆλŠ” λΆ„κΈ°
  • C# 가상 λ„μš°λ―Έ μƒ˜ν”Œ
  • C# μŠ€ν‚¬ μƒ˜ν”Œ

우리의 μž¬ν˜„ 단계 :

  1. 두 μƒ˜ν”Œ λͺ¨λ‘ 배포
  2. Ngrok으둜 가상 λ„μš°λ―Έ μ„€μ •
  3. Microsoft Teams와 가상 λ„μš°λ―Έ μ—°κ²°
  4. 가상 μ–΄μ‹œμŠ€ν„΄νŠΈμ™€ μŠ€ν‚¬ μ—°κ²°
  5. 두 μƒ˜ν”Œ λͺ¨λ‘ μ‹€ν–‰
  6. Microsoft Teamsμ—μ„œ Virtual Assistantμ—κ²Œ 인사λ₯Ό 보내고 OnboardingDialogλ₯Ό μ™„λ£Œν•©λ‹ˆλ‹€.
  7. μ‹€ν–‰ μƒ˜ν”Œ λŒ€ν™” μƒμž 보내기, 가상 λ„μš°λ―ΈλŠ” ν™œλ™ 보내기 ν…μŠ€νŠΈκ°€ ν¬ν•¨λœ μΉ΄λ“œλ‘œ μ‘λ‹΅ν•©λ‹ˆλ‹€.
  8. Virtual Assistant에 λ‹€λ₯Έ λ©”μ‹œμ§€λ₯Ό 보내면 ν™œλ™ μ—…λ°μ΄νŠΈλ₯Ό μ‹œλ„ν•˜λŠ” λ™μ•ˆ μ˜ˆμ™Έκ°€ λ°œμƒν•©λ‹ˆλ‹€.

_ν™œλ™μ„ μ—…λ°μ΄νŠΈν•˜λ €κ³  ν•  λ•Œ 가상 λ„μš°λ―Έμ—μ„œ μ˜ˆμ™Έκ°€ λ°œμƒν•©λ‹ˆλ‹€_
image

_TypeScript Skill이 Microsoft Teams μ±„λ„μ—μ„œ μ„±κ³΅μ μœΌλ‘œ μ‹€ν–‰ 쀑이며 이전에 보낸 μΉ΄λ“œ μ—…λ°μ΄νŠΈ_
image

μ•ˆλ…•ν•˜μ„Έμš”, https://github.com/microsoft/botframework-sdk/issues/5919 λŠ” μ§€μ›λ˜λŠ” 3개 μ–Έμ–΄ λͺ¨λ‘μ— λŒ€ν•΄ ν•΄κ²°ν•΄μ•Ό ν•©λ‹ˆλ‹€. ν•΄λ‹Ή μ†”λ£¨μ…˜μ΄ 내일뢀터 μ‹œμž‘λ˜λŠ” 일일 λΉŒλ“œ 쀑 ν•˜λ‚˜λ₯Ό μ‚¬μš©ν•˜λŠ” 데 도움이 λœλ‹€λ©΄ μ‹œλ„ν•΄ λ³Ό 수 μžˆμŠ΅λ‹ˆλ‹€.

@Batta32 λ‹˜ μ•ˆλ…•ν•˜μ„Έμš”, λ¨Όμ € μ—…λ°μ΄νŠΈν•΄μ•Ό ν•  μ‚¬ν•­μž…λ‹ˆλ‹€. λ‚΄κ°€ 이미 μ‹œλ„ ν•  μˆ˜μžˆλŠ” 것이 μ•„λ‹™λ‹ˆλ‹€?

μ•ˆλ…•ν•˜μ„Έμš” @tommyJimmy87μž…λ‹ˆλ‹€! 예, @gabog κ°€ TypeScript 및 C#에 λŒ€ν•΄ μ–ΈκΈ‰ν•œ λ‚΄μš© 을 검증할 κ²ƒμž…λ‹ˆλ‹€.

λ§ˆμ§€λ§‰ μ—…λ°μ΄νŠΈλ₯Ό μΆ”κ°€ν•˜κ³  microsoft/botbuilder-js#2489 및 microsoft/botbuilder-dotnet#4264 κ°€ ν¬ν•¨λœ SDK의 botbuilder-v4-js-daily 일일 λΉŒλ“œλ₯Ό ν†΅ν•©ν•˜μ—¬ 이 λΆ„κΈ°λ₯Ό μ—…λ°μ΄νŠΈν•  κ²ƒμž…λ‹ˆλ‹€.

μ—…λ°μ΄νŠΈλ˜λŠ” λŒ€λ‘œ λ°”λ‘œ μ—°λ½λ“œλ¦¬κ² μŠ΅λ‹ˆλ‹€ 😊.

@tommyJimmy87λ‹˜ , 이 λ¬Έμ œκ°€ testSkillHandler 에 microsoft/botbuilder-js#2489의 λ³€κ²½ 사항을 μ μš©ν•˜λŠ” 것을 μ„±κ³΅μ μœΌλ‘œ 확인 ν–ˆμœΌλ©° Microsoft Teams 채널을 μ‚¬μš©ν•˜μ—¬ ν™œλ™μ΄ μ˜¬λ°”λ₯΄κ²Œ μ—…λ°μ΄νŠΈλ˜μ—ˆμŠ΅λ‹ˆλ‹€.

testSkillHandler , 특히 processActivity λ©”μ†Œλ“œμ— μ μš©ν•΄μ•Ό ν•˜λŠ” λ³€κ²½ 사항을 μ‹λ³„ν•˜λ €λ©΄ 이 컀밋 을 ν™•μΈν•˜μ‹­μ‹œμ˜€.

@darrenj & @gabog - C# 봇을 μ‚¬μš©ν•˜μ—¬ microsoft/botbuilder-dotnet#4264의 λ³€κ²½ 사항도 μ„±κ³΅μ μœΌλ‘œ κ²€μ¦ν–ˆμŠ΅λ‹ˆλ‹€.

ν…ŒμŠ€νŠΈ ν™˜κ²½:

  • μˆ˜μ • 사항이 μžˆλŠ” λΆ„κΈ°
  • TypeScript 가상 λ„μš°λ―Έ μƒ˜ν”Œ
  • TypeScript 기술 μƒ˜ν”Œ

μž¬ν˜„ 단계:

  1. 두 μƒ˜ν”Œ λͺ¨λ‘ 배포
  2. Ngrok으둜 가상 λ„μš°λ―Έ μ„€μ •
  3. Microsoft Teams와 가상 λ„μš°λ―Έ μ—°κ²°
  4. 가상 μ–΄μ‹œμŠ€ν„΄νŠΈμ™€ μŠ€ν‚¬ μ—°κ²°
  5. 두 μƒ˜ν”Œ λͺ¨λ‘ μ‹€ν–‰
  6. Microsoft Teamsμ—μ„œ Virtual Assistantμ—κ²Œ 인사λ₯Ό 보내고 OnboardingDialogλ₯Ό μ™„λ£Œν•©λ‹ˆλ‹€.
  7. μ‹€ν–‰ μƒ˜ν”Œ λŒ€ν™” μƒμž 보내기, 가상 λ„μš°λ―ΈλŠ” ν™œλ™ 보내기 ν…μŠ€νŠΈκ°€ ν¬ν•¨λœ μΉ΄λ“œλ‘œ μ‘λ‹΅ν•©λ‹ˆλ‹€.
  8. Virtual Assistant에 λ‹€λ₯Έ λ©”μ‹œμ§€λ₯Ό 보내면 μ—…λ°μ΄νŠΈ ν™œλ™μ΄λΌλŠ” ν…μŠ€νŠΈλ‘œ μΉ΄λ“œλ₯Ό μ—…λ°μ΄νŠΈν•©λ‹ˆλ‹€.

μžμ„Έν•œ λ‚΄μš©μ€

_testSkillHandler_의 processActivity λ©”μ†Œλ“œμ— λŒ€ν•œ λ³€κ²½ 사항_
image

_TypeScript 가상 λ„μš°λ―Έκ°€ Microsoft Teams μ±„λ„μ—μ„œ μ„±κ³΅μ μœΌλ‘œ μ‹€ν–‰ 쀑이며 이전에 보낸 μΉ΄λ“œλ₯Ό μ—…λ°μ΄νŠΈν–ˆμŠ΅λ‹ˆλ‹€_
image

μš°λ¦¬λŠ” λ‹Ήμ‹ μ˜ λŒ€λ‹΅μ—μ£Όμ˜λ₯Ό 기울일 κ²ƒμž…λ‹ˆλ‹€!

@Batta32λ‹˜ , μ—…λ°μ΄νŠΈ κ°μ‚¬ν•©λ‹ˆλ‹€. μ΅œλŒ€ν•œ 빨리 μ‹œλ„ν•΄ λ³΄κ² μŠ΅λ‹ˆλ‹€. λ‚΄ μͺ½μ—μ„œ ν•œ 가지 질문이 μžˆμŠ΅λ‹ˆλ‹€. 라이브러리 버전이 λ³€κ²½λ˜μ—ˆκ±°λ‚˜ μœ„μ— κ²Œμ‹œν•œ 컀밋일 λΏμž…λ‹ˆλ‹€. 감사 ν•΄μš”

@tommyJimmy87 - μœ„μ— κ²Œμ‹œν•œ μ»€λ°‹μž…λ‹ˆλ‹€ !

@Batta32 λ‹˜ μ•ˆλ…•ν•˜μ„Έμš” :)

@tommyJimmy87 κ°μ‚¬ν•©λ‹ˆλ‹€! 이 문제λ₯Ό ν™•μΈν•˜λŠ” μ¦‰μ‹œ 이 문제λ₯Ό μ’…λ£Œν•  수 μžˆμŠ΅λ‹ˆλ‹€ 😊.

μ•ˆλ…•ν•˜μ„Έμš” @Batta32μž…λ‹ˆλ‹€! 이 문제λ₯Ό 기꺼이 μ’…λ£Œν•  수 μžˆμŠ΅λ‹ˆλ‹€. :)

ν™•μΈν•΄μ£Όμ…”μ„œ κ°μ‚¬ν•©λ‹ˆλ‹€ @tommyJimmy87 !

@darrenj - SDK νŒ€μ—μ„œ ν•΄κ²°

이 νŽ˜μ΄μ§€κ°€ 도움이 λ˜μ—ˆλ‚˜μš”?
0 / 5 - 0 λ“±κΈ‰