Botframework-solutions: [Typescript] VA/Skill Generator์— GA SDK Skill ์ง€์› ์ถ”๊ฐ€

์— ๋งŒ๋“  2019๋…„ 10์›” 08์ผ  ยท  64์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: microsoft/botframework-solutions

๊ธฐ์ˆ  ํ”„๋กœํ† ์ฝœ์ด WebSocket์œผ๋กœ ๋ณ€๊ฒฝ๋จ์— ๋”ฐ๋ผ ์ด์ „์—๋Š” C#์—์„œ๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์—ˆ๋˜ Typescript์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ƒˆ๋กœ์šด ์ŠคํŠธ๋ฆฌ๋ฐ ํ™•์žฅ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๊ณ  ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด Typescript๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ Virtual Assistant์— ๋Œ€ํ•œ ๊ธฐ์ˆ  ํ˜ธ์ถœ ์‹œ๋‚˜๋ฆฌ์˜ค์˜ ์ฐจ๋‹จ์ด ํ•ด์ œ๋ฉ๋‹ˆ๋‹ค.

์‚ฌ์šฉ์ž ์Šคํ† ๋ฆฌ

... ๊ฐœ๋ฐœ์ž๋กœ์„œ
๊ธฐ์ˆ ์„ TypeScript ๋ฒ„์ „์˜ Virtual Assistant์— ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ์›ํ•ฉ๋‹ˆ๋‹ค.
๊ทธ๋ž˜์„œ ... C#๊ณผ Typescript ์‚ฌ์ด์— ํŒจ๋ฆฌํ‹ฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ—ˆ์šฉ ๊ธฐ์ค€

  • [ ] ์ƒˆ๋กœ์šด GA SDK ๊ธฐ์ˆ ์„ ํ†ตํ•ฉํ•˜๋„๋ก VA ๋ฐ ๊ธฐ์ˆ  ์ƒ์„ฑ๊ธฐ ์—…๋ฐ์ดํŠธ
  • [ ] typescript VA ๋ฐฐํฌ ๋ฐ C# ์Šคํ‚ฌ ์ถ”๊ฐ€(์˜ˆ: ์บ˜๋ฆฐ๋”)
  • [ ] ํ•„์š”์— ๋”ฐ๋ผ ์ƒ์„ฑ์ž๊ฐ€ ์ƒ์„ฑํ•œ ๊ธฐ์กด VA ์†”๋ฃจ์…˜ ๋ฐ ๊ธฐ์ˆ ์— ํ•„์š”ํ•œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์— ๋Œ€ํ•œ ๋ฌธ์„œ ์ œ๊ณต
P0 Committed In Progress

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

@Batta32 SkillConversationIdFactory๊ฐ€ encodeURI๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ, ์Šคํ‚ฌ์€ ํ•ด๋‹น dialog.id๋ฅผ ์ˆ˜์‹ ํ•˜๊ณ  ๊ทธ์— ๋”ฐ๋ผ ์‘๋‹ตํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ด๊ฒƒ์ด ํ•„์ˆ˜๋ผ๊ณ  ํ™•์‹ ํ•ฉ๋‹ˆ๋‹ค.

๋˜ํ•œ ์˜ˆ, restify๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋™์•ˆ ๊ธด ๋Œ€ํ™” ID์— ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ์ƒ˜ํ”Œ์—์„œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์–ธ๊ธ‰ํ•ฉ๋‹ˆ๋‹ค. https://github.com/microsoft/BotBuilder-Samples/blob/master/samples/javascript_nodejs/80.skills-simple-bot-to-bot/simple-root -bot/skillConversationIdFactory.js#L21

// ์ด ํ‚ค๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ 100์ž๋กœ ์ œํ•œ๋ฉ๋‹ˆ๋‹ค. index.js์—์„œ restify.createServer({ maxParamLength: 1000 }); ๋กœ ์ฆ๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

๋ชจ๋“  64 ๋Œ“๊ธ€

์•ˆ๋…• Darrenj,
ํ•ด๊ฒฐํ•ด์•ผ ํ•  ๋ฌธ์ œ์— ๋Œ€ํ•œ ETA๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?
๊ฐ์‚ฌ ํ•ด์š”,
์ฟ ๋งˆ๋ฅด

์ด๋ฒˆ ์ฃผ์— ํ…Œ์ŠคํŠธ๋ฅผ ์œ„ํ•ด ๋์—์„œ ๋๊นŒ์ง€ ๋ชจ๋“  ๊ฒƒ์ด ์ž˜๋˜๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

์—…๋ฐ์ดํŠธ์— ๋Œ€ํ•ด @darrenj ์—๊ฒŒ ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

@darrenj ์ด ๋ฌธ์ œ์— ๋Œ€ํ•œ ์—…๋ฐ์ดํŠธ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

์•ˆ๋…• ๋Œ€๋Ÿฐ,

@darrenj ์ด ์ž‘์—… ํ•ญ๋ชฉ์— ๋Œ€ํ•œ ์—…๋ฐ์ดํŠธ๋ฅผ ์ œ๊ณตํ•ด ์ฃผ

๋‹น์‹ ์˜ ๋„์›€์„ ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

๊ฐ์‚ฌ ํ•ด์š”,
์ฟ ๋งˆ๋ฅด

์•ˆ๋…•ํ•˜์„ธ์š” @darrenj ์ž…๋‹ˆ๋‹ค .

๋‹ค์‹œ ํ•œ ๋ฒˆ ๋ฒˆ๊ฑฐ๋กญ๊ฒŒ ํ•ด์„œ ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค. ์ด์— ๋Œ€ํ•œ ์—…๋ฐ์ดํŠธ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?
๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ๋ฒ„์ „ 4.6.0(https://botbuilder.myget.org/feed/botbuilder-v4-js-daily/package/npm/botframework-streaming)์šฉ์œผ๋กœ ์ถœ์‹œ๋œ ๊ฒƒ์„ ๋ณด์•˜๋Š”๋ฐ Botframework์™€ ํ˜ธํ™˜๋˜๋‚˜์š”? 4.5.0๊ณผ ๊ฐ€์ƒ ๋„์šฐ๋ฏธ?

์—ฌ๊ธฐ์—๋Š” ๋ช‡ ๊ฐ€์ง€ ์ง„ํ–‰ ์ค‘์ธ ์‚ฌํ•ญ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜๋‚˜๋Š” ๊ท€ํ•˜๊ฐ€ ๋ฐœ๊ฒฌํ•œ ์ŠคํŠธ๋ฆฌ๋ฐ ํ™•์žฅ ๊ธฐ๋Šฅ์˜ ๊ฐ€์šฉ์„ฑ์ด๊ณ  ๋‹ค๋ฅธ ํ•˜๋‚˜๋Š” Skills ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ์ƒˆ GA ๋ฒ„์ „์˜ ์œ ํ˜• ์Šคํฌ๋ฆฝํŠธ ๊ฐ€์šฉ์„ฑ์ž…๋‹ˆ๋‹ค. ๋‹ค์Œ ์ฃผ์— Skills ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ์ฒซ ๋ฒˆ์งธ ํŒจํ‚ค์ง€ ๋นŒ๋“œ๊ฐ€ ์‹œ์ž‘๋˜๋ฉด C# ๋ฐ Typescript ํ…œํ”Œ๋ฆฟ ์—…๋ฐ์ดํŠธ๋ฅผ ์‹œ์ž‘ํ•˜์—ฌ (๊ฐ„๋‹จํ•œ) ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ๋‹จ๊ณ„๋ฅผ ํ…Œ์ŠคํŠธํ•˜๊ณ  ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๋Š” ์ด ์ž‘์—…์„ 1์›”์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ์ค€๋น„ํ•˜๋Š” ๊ฒƒ์„ ๋ชฉํ‘œ๋กœ ํ•˜๊ณ  ์žˆ์œผ๋ฉฐ ์ผ์ผ ๋นŒ๋“œ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์‹œ์ ์„ ํฌํ•จํ•˜์—ฌ ์ง„ํ–‰ ์ƒํ™ฉ์— ๋”ฐ๋ผ ์ด ๋ฌธ์ œ๋ฅผ ๊ณ„์† ์—…๋ฐ์ดํŠธํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ทธ ๋™์•ˆ JavaScript/Typescript VA ๋ด‡์€ ์ŠคํŠธ๋ฆฌ๋ฐ ํ™•์žฅ ์ข…์†์„ฑ์ด ์—†๊ธฐ ๋•Œ๋ฌธ์— HTTP๋ฅผ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ JavaScript/Typescript์—์„œ ์ƒ์„ฑ๋œ ์Šคํ‚ฌ์„ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์œ„์˜ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ๋ชจ๋“  ์–ธ์–ด์— ๋งž์ถฐ ์ •๋ ฌ๋˜๋Š” ์บ˜๋ฆฐ๋”์™€ ๊ฐ™์€ C# ์Šคํ‚ฌ์„ ํ˜ธ์ถœํ•˜๋ ค๋Š” ๊ฒฝ์šฐ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

@darrenj ๋Š” ์ด

์•ˆ๋…•ํ•˜์„ธ์š” @darrenj ์ž…๋‹ˆ๋‹ค .

์ด ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋˜๋ฉด VA์˜ TypeScript ๋ฒ„์ „์—์„œ ToDo ์™€ ๊ฐ™์€ cSharp ๊ธฐ์ˆ ์„ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

ํ˜„์žฌ C# ์Šคํ‚ฌ์— ์‚ฌ์šฉ๋˜๋Š” WebSocketTransport ๊ด€๋ จ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋‚ด VA๋Š” typescript์ž…๋‹ˆ๋‹ค.

์˜ˆ, Skills์˜ GA ๋ฒ„์ „์œผ๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ํ•˜๋ฉด Websockets์— ๋Œ€ํ•œ ์ข…์†์„ฑ์ด ์ œ๊ฑฐ๋˜๋ฏ€๋กœ ํ”Œ๋žซํผ ๊ฐ„์— ๊ธฐ์ˆ ์„ ์›ํ™œํ•˜๊ฒŒ ํ˜ผํ•ฉ/๋งค์นญํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” C# ๋ฐ JS์— ๋Œ€ํ•œ ์ตœ์‹  ์ •๋ณด๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฉฐ ์ดˆ๊ธฐ ํ†ตํ•ฉ ์ž‘์—…์„ ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋ชฉํ‘œ๋Š” ์‹œ๋‚˜๋ฆฌ์˜ค ์ฐจ๋‹จ์„ ํ•ด์ œํ•˜๊ธฐ ์œ„ํ•ด ๋‹ค์Œ ๋ช‡ ์ฃผ ์ด๋‚ด์— ์ผ์ผ ๋นŒ๋“œ์— ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์ ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์•ˆ๋…•ํ•˜์„ธ์š” @darrenj ์ž…๋‹ˆ๋‹ค .

Typescript VA ๋ฐ Typescript Skill์ธ ๋˜ ๋‹ค๋ฅธ ์‚ฌ์šฉ ์‚ฌ๋ก€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚ด ๋ฌธ์ œ๋Š” updateActivity๋ฅผ VA์—์„œ Skill๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์œผ๋ฉฐ ์ด์— ๋Œ€ํ•œ ์ŠคํŠธ๋ฆฌ๋ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ํ•„์š”ํ•˜๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค(๋‚ด๊ฐ€ ์ดํ•ดํ•˜๋Š” ํ•œ). ์ด์ œ ์‹ค์ œ๋กœ WebSocket ์ข…์†์„ฑ์ด ์ตœ์‹  ๊ธฐ์ˆ  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ(4.4.9)์—์„œ ์ œ๊ฑฐ๋˜์—ˆ์Œ์„ ์•Œ์•˜์Šต๋‹ˆ๋‹ค.
์™œ ๊ทธ๋Ÿฐ์ง€ ์ดํ•ด๊ฐ€ ์•ˆ ๊ฐ€๋„ค์š” :) ๋‹ค๋ฅธ ๊ณณ์œผ๋กœ ์ด์‚ฌ ๊ฐ€์‹ค ๊ฑด๊ฐ€์š”? ๋˜๋Š”?

์•Œ๊ฒ ์Šต๋‹ˆ๋‹ค. Bot Framework SDK ๋‚ด ๊ธฐ์ˆ  ๊ธฐ๋Šฅ์˜ GA์™€ ๊ด€๋ จ๋œ ์ง„ํ–‰ ์ƒํ™ฉ์— ๋Œ€ํ•œ ์—…๋ฐ์ดํŠธ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ Virtual Assistant์— ์˜ํ•ด ๋ฐฐ์–‘๋œ ์ž‘์—…์„ ๊ณต์‹์ ์ธ GA ๋ฒ„์ „์œผ๋กœ ์ „ํ™˜ํ–ˆ์Šต๋‹ˆ๋‹ค.

๋ด‡์ด ๋‹ค๋ฅธ ๋ด‡(๊ธฐ์ˆ )์„ ํ˜ธ์ถœํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ณด์—ฌ์ฃผ๋Š” ์ƒ˜ํ”Œ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฃผ์š” ๋ณ€๊ฒฝ ์‚ฌํ•ญ์€ ์ด์ œ ๋‹ค๋ฅธ ์–ด๋Œ‘ํ„ฐ๋‚˜ ์ŠคํŠธ๋ฆฌ๋ฐ ํ™•์žฅ์„ ์‚ฌ์šฉํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•˜๋Š” ํ†ตํ•ฉ ์–ด๋Œ‘ํ„ฐ๊ฐ€ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. C# ๋ฐ JS .

์šฐ๋ฆฌ๋Š” (์ž‘์€)๋ฅผ ์ œ๊ณตํ•˜๋Š” ์ƒ์ž ๋ฐ–์œผ๋กœ ๋ณ€๊ฒฝ๊ณผ ๊ธฐ์ˆ ์„ ๊ธฐ์กด์˜ ์—…๋ฐ์ดํŠธ์— ํ•„์š”ํ•œ ๋ช‡ ๊ฐ€์ง€ ๋‹จ๊ณ„์— ๋ฌธ์„œ๋ฅผ ์ œ๊ณตํ•˜๊ธฐ ์œ„ํ•ด ๊ฐ€์ƒ ์ง€์› / ์Šคํ‚ฌ ํ…œํ”Œ๋ฆฟ ์—…๋ฐ์ดํŠธ์— ์ตœ์„ ์„ ๋‹คํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. 1์›” ๋ง์„ ๋ชฉํ‘œ๋กœ ํ•˜๊ณ  ์žˆ์œผ๋ฉฐ ๊ณง ์ผ์ผ ๋นŒ๋“œ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๋นŒ๋“œ๋ฉ๋‹ˆ๋‹ค.

์ด๋ณด๋‹ค ์•ž์„œ ์ง„ํ–‰ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ์œ„์˜ ์ƒ˜ํ”Œ์ด ํ•„์š”ํ•œ ๋ชจ๋“  ๊ฒƒ์„ ์ œ๊ณตํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ผ์ผ ๋นŒ๋“œ/๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ์ค€๋น„๋˜๋Š” ๋Œ€๋กœ ์ด ๋ฌธ์ œ๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

@darrenj ์ด ๋ฉ‹์ง„ ์—…๋ฐ์ดํŠธ์— ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค. ํ”„๋กœ๋•์…˜ ๊ฐ€์ƒ ๋„์šฐ๋ฏธ์—์„œ ํ†ตํ•ฉ ์–ด๋Œ‘ํ„ฐ ๋ฅผ ํ™œ์šฉํ•˜๊ธฐ ์ „์—

์ด๊ฒƒ์€ Typescript VA์—์„œ ํ†ตํ•ฉ ์–ด๋Œ‘ํ„ฐ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ณ  ์—ฌ์ „ํžˆ C# ๊ธฐ์ˆ ์„ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๊นŒ?

๊ธฐ๋‹ค๋ฆฌ๊ณ  ๊ธฐ๋‹ค๋ฆฌ๋˜ ์—…๋ฐ์ดํŠธ!

์šฐ๋ฆฌ๋Š” ์–ด์ œ ์ƒˆ๋กœ์šด GA ์Šคํ‚ฌ ๊ธฐ๋Šฅ ์„ ์ง€์›ํ•˜๊ณ  ๋” ์ด์ƒ ๋ฏธ๋ฆฌ๋ณด๊ธฐ๊ฐ€ ์•„๋‹Œ ์ƒ˜ํ”Œ ์Šคํ‚ฌ์— ๋Œ€ํ•œ ์—…๋ฐ์ดํŠธ๋ฅผ ํฌํ•จํ•˜๋Š” 0.8 ๋ฆด๋ฆฌ์Šค๋ฅผ ๊ฒŒ์‹œํ–ˆ์Šต๋‹ˆ๋‹ค. Websockets๋Š” ๊ธฐ์ˆ  ๊ฐ„์˜ ์›น ์„œ๋น„์Šค ํ†ต์‹ ์„ ์œ„ํ•ด ์‚ฌ์šฉ ์ค‘์ง€๋˜์—ˆ์œผ๋ฉฐ Skills๋Š” "์ฝœ๋ฐฑ" HTTP ์—ฐ๊ฒฐ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋น„๋™๊ธฐ์ ์œผ๋กœ ๋ด‡๊ณผ ๋‹ค์‹œ ํ†ต์‹ ํ•ฉ๋‹ˆ๋‹ค.

๊ฒฐ๊ณผ์ ์œผ๋กœ ๊ธฐ์กด ๊ฐ€์ƒ ๋„์šฐ๋ฏธ ๋ฐ ๊ธฐ์ˆ ์— ๋Œ€ํ•œ ๋ช‡ ๊ฐ€์ง€ ์ง์ ‘์ ์ธ ์—…๋ฐ์ดํŠธ๊ฐ€ ์ด๋ฃจ์–ด์ง‘๋‹ˆ๋‹ค. C# VA ์—…๋ฐ์ดํŠธ๋Š” ์—ฌ๊ธฐ ์— ๋ฌธ์„œํ™”๋˜์–ด ์žˆ๊ณ  C# ๊ธฐ์ˆ  ์—…๋ฐ์ดํŠธ๋Š” ์—ฌ๊ธฐ ์— ๋ฌธ์„œํ™”๋˜์–ด

์ด์— ์ƒ์‘ํ•˜๋Š” JS/Typescript ์ƒ์„ฑ๊ธฐ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์€ 2์›” 14์ผ๊นŒ์ง€ ๊ธฐ์กด VA/Skills์— ๋Œ€ํ•œ ์ƒˆ ์ƒ์„ฑ๊ธฐ ๋ฐ ๋ฌธ์„œ ๊ฒŒ์‹œ๋ฅผ ๋ชฉํ‘œ๋กœ ํ•˜๊ณ  ๋…ผ์˜ํ•˜๋ฉด์„œ ๋งˆ๋ฌด๋ฆฌ๋˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฐฐ๊ฒฝ ์ฐธ์กฐ๋ฅผ ์œ„ํ•ด ์—ฌ๊ธฐ ์—์„œ ๊ธฐ์ˆ  ํ˜ธ์ถœ์„ ์ง€์›ํ•˜๋Š” ๋†’์€ ์ˆ˜์ค€์˜ ๋‹จ๊ณ„๋ฅผ ์ฐพ์„ ์ˆ˜

์ด๋Ÿฌํ•œ ๋ณ€๊ฒฝ์ด ์™„๋ฃŒ๋˜๋ฉด JS/typescript VA๊ฐ€ C# ๊ธฐ์ˆ ์„ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ๊ทธ ๋ฐ˜๋Œ€๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์ด๋ฉฐ ์‹ค์ œ๋กœ Python๋„ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

@darrenj , typescript ํ”„๋กœ์ ํŠธ์— ๋Œ€ํ•œ ์œ„์˜ ์˜๊ฒฌ์— ๋Œ€ํ•œ ์ƒ๊ฐ์ด ์žˆ์Šต๋‹ˆ๊นŒ?

์œ„์˜ ๋‚ด์šฉ์— ๋”ฐ๋ผ ์˜ˆ, ์™„๋ฃŒํ•  ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ๋‹จ๊ณ„๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

@darrenj๋‹˜ , JS/TS ์ƒ์„ฑ๊ธฐ๊ฐ€ ๋ณ€๊ฒฝ๋˜๊ณ  ๋ฌธ์„œ ์—…๋ฐ์ดํŠธ๊ฐ€ ์–ธ์ œ ์ถœ์‹œ

@darrenj ๋‹˜ , ์œ„์—์„œ ์–ธ๊ธ‰ํ•œ ์ƒˆ ํ”„๋ ˆ์ž„์›Œํฌ(SDK)์—์„œ VA(C#)์—์„œ typescript ๊ธฐ์ˆ  ์ž‘์—…์œผ๋กœ์˜ ํ†ต์‹ ์ด ์ˆ˜ํ–‰๋˜๋Š”์ง€ ์•Œ๋ ค์ฃผ์‹ญ์‹œ์˜ค. 2์›” 14์ผ๊นŒ์ง€ ํ•œ๋‹ค๊ณ  ํ•˜์…จ์Šต๋‹ˆ๋‹ค.
๋‹น์‹ ์˜ ๋„์›€์„ ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค

@darrenj ์ด ํ‹ฐ์ผ“์— ๋Œ€ํ•œ ์—…๋ฐ์ดํŠธ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

@darrenj ์˜ค๋Š˜ ์ €๋Š” VA/RootBot(Typescript)์—์„œ C# ์Šคํ‚ฌ์„ ํ˜ธ์ถœํ•˜๊ธฐ ์œ„ํ•ด ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ํ•˜๊ฑฐ๋‚˜ ์ˆ˜์ •ํ•˜๋ ค๊ณ  ํ–ˆ์Šต๋‹ˆ๋‹ค. typescript rootbot/VA ์˜ˆ์ œ๊ฐ€ ์—†๋Š” ์Šคํ‚ฌ ์ปจ์Šˆ๋จธ ๊ตฌํ˜„ ๊ฐ€์ด๋“œ๋ฅผ ์ฐพ์•˜์Šต๋‹ˆ๋‹ค. ํƒ€์ดํ”„์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋ฐ˜ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ๊ฐ€์ด๋“œ๋ฅผ ์ง€์›ํ•  ๊ณ„ํš์€ ์—†๋‚˜์š”? ETA ๋˜๋Š” ๋™์ผํ•œ ๋‹ฌ์„ฑ์— ๋„์›€์ด ๋  ์ˆ˜ ์žˆ๋Š” ๋‹ค๋ฅธ ๊ฐ€์ด๋“œ๋ฅผ ์•Œ๋ ค์ฃผ์‹ญ์‹œ์˜ค.

์ƒˆ๋กœ์šด typescript VA/Skills๊ฐ€ ์ƒˆ๋กœ์šด GA Skills๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ๋ณ€๊ฒฝ ์‚ฌํ•ญ์— ๋Œ€ํ•œ ์ผ๋ จ์˜ pull ์š”์ฒญ์ด ์ง„ํ–‰ ์ค‘์ž…๋‹ˆ๋‹ค. ํ†ตํ•ฉ๋˜๊ณ  ์ผ์ผ ๋นŒ๋“œ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜๋ฉด ํ‹ฐ์ผ“์„ ์—…๋ฐ์ดํŠธํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

๊ทธ๋™์•ˆ ๊ธฐ์กด VA๋ฅผ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ํ•˜๋Š” ๋‹จ๊ณ„์— ๋Œ€ํ•œ ์ดˆ์•ˆ ๋ฌธ์„œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ํ”ผ๋“œ๋ฐฑ์„ ํ™˜์˜ํ•ฉ๋‹ˆ๋‹ค.

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

์•ˆ๋…•ํ•˜์„ธ์š” @darrenj๋‹˜ , ์—…๋ฐ์ดํŠธ์— ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค. ํ˜„์žฌ ์ œ๊ฐ€ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ์œ ์ผํ•œ ์งˆ๋ฌธ์€ 'botbuilder-solutions'์— ๊ด€ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋กœ์ปฌ ๋ฒ„์ „์„ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ? ์–ด๋””์—์„œ? ๋ฏธ๋ž˜ ๋ฆด๋ฆฌ์Šค์ฒ˜๋Ÿผ ๋ณด์ด๋Š” ์ด ๋ถ„๊ธฐ๋ฅผ ์—ฌ๊ธฐ์—์„œ ์ฐพ์•˜์Šต๋‹ˆ๋‹ค(https://github.com/microsoft/botframework-solutions/tree/feature/southworks/0.7/parity-botbuilder-solutions/sdk/typescript/libraries/botbuilder-solutions). , ๊ทธ๋ ‡์ง€?

๋ฏธ๋ฆฌ ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

@Batta32 ์‚ฌ๋žŒ๋“ค์ด ์ง€์นจ์„ ํ…Œ์ŠคํŠธํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ฝ”๋“œ ๋ถ„๊ธฐ๋ฅผ ๋น ๋ฅด๊ฒŒ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ(์ƒˆ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ๊ฒŒ์‹œ๋˜๊ธฐ ์ „์—)

@tommyJimmy87 -
๋ถ„๊ธฐ: feature/southworks/ga-skills-sdk/botbuilder-solutions

๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋กœ์ปฌ์—์„œ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ๋‹ค์Œ ๋‹จ๊ณ„๋ฅผ ๋”ฐ๋ฅด์‹ญ์‹œ์˜ค(์–ธ๊ธ‰๋œ ๋ถ„๊ธฐ ์‚ฌ์šฉ).

  1. Visual Studio Code์—์„œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์—ด๊ธฐ
  2. ์ข…์†์„ฑ์„ ์„ค์น˜ํ•˜๊ธฐ ์œ„ํ•ด npm install ์‹คํ–‰
  3. ์†”๋ฃจ์…˜์„ ์ปดํŒŒ์ผํ•˜๊ธฐ ์œ„ํ•ด npm run build ์‹คํ–‰
  4. npm pack ๋ฅผ ์‹คํ–‰ํ•˜์—ฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ .tgz ํŒŒ์ผ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
  5. Visual Studio Code์—์„œ Virtual Assistant์˜ package.json ํŒŒ์ผ์„ ์—ฝ๋‹ˆ๋‹ค.
  6. ์ƒ์„ฑ๋œ tgz์˜ ๊ฒฝ๋กœ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” botbuilder-solutions์˜ ์ฐธ์กฐ๋ฅผ ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค.
  7. ๋กœ์ปฌ ํŒจํ‚ค์ง€๋ฅผ ์„ค์น˜ํ•  ์ข…์†์„ฑ์„ ์„ค์น˜ํ•˜๊ธฐ ์œ„ํ•ด npm install ๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๋Š” ํ˜„์žฌ ์ด๋Ÿฌํ•œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ํ™•์ธํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ฃผ์ €ํ•˜์ง€ ๋ง๊ณ  ํ•ด๋‹น PR์— ํ”ผ๋“œ๋ฐฑ์„ ์ œ๊ณตํ•˜๋ฉด ์ตœ๋Œ€ํ•œ ๋นจ๋ฆฌ ๊ฒ€ํ† ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

์ด ๋ฌธ์ œ๋Š” 30์ผ ๋™์•ˆ ํ™œ๋™์ด ์—†์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์œ ํšจํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์˜ค๋ž˜๋œ ๋ ˆ์ด๋ธ”์ด๋‚˜ ๋Œ“๊ธ€์„ ์ œ๊ฑฐํ•˜์ง€ ์•Š์œผ๋ฉด 5์ผ ํ›„์— ๋‹ซํž™๋‹ˆ๋‹ค.

@darrenj - VA(C#)์—์„œ ๋…ธ๋“œ js์ธ Skill๋กœ์˜ ์—ฐ๊ฒฐ์— ๋Œ€ํ•ด ์•„๋ž˜์— ์–ธ๊ธ‰๋œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์•Œ๋ ค์ฃผ์‹ญ์‹œ์˜ค.

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 ์ „๋ฐ˜์— ๊ฑธ์นœ ์ผ๋ จ์˜ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋™์•ˆ ๊ธฐ๋‹ค๋ ค ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

  • ๊ธฐ์กด typescript VA๋ฅผ GA BF ๊ธฐ์ˆ ๋กœ ์—…๋ฐ์ดํŠธํ•˜๋Š” ๋‹จ๊ณ„๋Š” ์—ฌ๊ธฐ
  • ๊ธฐ์กด typescript ๊ธฐ์ˆ ์„ GA BF ๊ธฐ์ˆ ๋กœ ์—…๋ฐ์ดํŠธํ•˜๋Š” ๋‹จ๊ณ„๋Š” ์—ฌ๊ธฐ

๋˜ํ•œ VA ์ƒ์„ฑ๊ธฐ ์˜

๊ทธ๋Ÿฐ ๋‹ค์Œ ํ˜„์žฌ Azure ๋ณ€๊ฒฝ ๊ธฐ๊ฐ„์„ ๊ธฐ๋‹ค๋ฆฌ๊ณ  ์žˆ๋Š” 1.0 ๋ฆด๋ฆฌ์Šค๋ฅผ ์ฒ˜๋ฆฌํ•  ๋•Œ npm์— ๊ฒŒ์‹œ๋ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์›”๋ง๊นŒ์ง€ ํฌ๋งํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

์œ„์˜ ์งˆ๋ฌธ/๋ฌธ์ œ๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ ์ƒˆ๋กœ์šด ๋ฌธ์ œ๋ฅผ ์ œ๊ธฐํ•ด ์ฃผ์‹œ๋ฉด ๋„์™€๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค.

@Batta32 ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์„ ์œ„ํ•ด botbuilder-solutions 4.5.0-preview ์‚ฌ์šฉ์„ ์‹œ์ž‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์„ ์œ„ํ•œ ์ƒˆ ๋ฆด๋ฆฌ์Šค๊ฐ€ ๋งž์Šต๋‹ˆ๊นŒ?

@Batta32 ์ƒˆ SDK๋Š” ์–ธ์ œ ์ถœ์‹œ๋˜๋‚˜์š”? ์ €๋Š” 13๊ฐ€์ง€ ๊ธฐ์ˆ ๋กœ VA๋ฅผ ๊ตฌ์ถ• ์ค‘์ด๋ฉฐ ์š”๊ตฌ ์‚ฌํ•ญ ์ค‘ ํ•˜๋‚˜๋Š” TypeScript๋กœ ๊ตฌ์ถ•ํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ”„๋กœ์ ํŠธ๋ฅผ ์‹œ์ž‘ํ•˜๊ธฐ ์œ„ํ•ด ํ˜„์žฌ ๋‹ค์Œ ๋ถ„๊ธฐ์˜ SDK๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

@tommyJimmy87 & @tomSauret847 ์•ˆ๋…•ํ•˜์„ธ์š”. ๊ฒŒ์‹œ๋˜๊ธฐ ์ „์—

botbuilder-solutions ์ผ์ผ ๋นŒ๋“œ๋ฅผ ํ†ตํ•ฉํ•˜๋ ค๋ฉด ๋‘ ๊ฐ€์ง€ ์˜ต์…˜์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ€์žฅ ์‰ฌ์šด ์˜ต์…˜์ธ ์ฒซ ๋ฒˆ์งธ ์˜ต์…˜์„ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค(๋ด‡์˜ package-lock ๋ฐ node_modules ์ œ๊ฑฐ ๊ณ ๋ ค). :

  • ์˜ต์…˜ 1 : ์ถ”๊ฐ€ .npmrc ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ํŒŒ์ผ์„ https://botbuilder.myget.org/F/aitemplates/npm , ๊ทธ๋ฆฌ๊ณ  ์—…๋ฐ์ดํŠธ package.json ๊ฐ€๋ฆฌ ํ‚ค๋„๋ก botbuilder-solutions ๋ฒ„์ „์— 4.5.0-preview223
  • ์˜ต์…˜ 2: ์ ˆ๋Œ€ ๊ฒฝ๋กœ๊ฐ€ ์žˆ๋Š” package.json์—์„œ ์ง์ ‘ ์ฐธ์กฐํ•˜๋Š” botbuilder-solutions ์˜ tgz ๋‹ค์šด๋กœ๋“œ
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 ๋ฏธ๋ฆฌ๋ณด๊ธฐ ๋นŒ๋“œ์—์„œ ๋ฐœ๊ฒฌํ•œ ๋ฌธ์ œ๋ฅผ ์–ด๋””์— ๋ณด๊ณ ํ•ด์•ผ ํ•˜๋‚˜์š”? ๋ฏธ๋ฆฌ ๋ณด๊ธฐ ์ƒ์„ฑ๊ธฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ƒˆ VA๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ๋ฏธ๋ฆฌ ๋ณด๊ธฐ SDK๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์‚ฌ์šฉ์ž ์ง€์ • ์—†์ด VA๋ฅผ ์‹คํ–‰ํ•˜๋ ค๊ณ  ํ•  ๋•Œ ์ž˜๋ชป๋œ ๋Œ€ํ™” ์ƒ์ž๊ฐ€ ์ถ”๊ฐ€๋œ๋‹ค๋Š” ์˜ค๋ฅ˜๋ฅผ ์ˆ˜์‹ ํ–ˆ์Šต๋‹ˆ๋‹ค.
์˜ค๋ฅ˜: DialogSet.add(): ์ž˜๋ชป๋œ ๋Œ€ํ™”๊ฐ€ ์ถ”๊ฐ€๋˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

@darrenj - ์ผ์ผ ๋นŒ๋“œ ๋ฌธ์ œ๋ฅผ ๋ณด๊ณ ํ•˜๋Š” ๊ฐ€์žฅ ์ข‹์€ ๋ฐฉ๋ฒ•์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

@tomSauret847 - ํ•œํŽธ, ์ด ์Šค๋ ˆ๋“œ์˜ ๋ฌธ์ œ๋ฅผ ํ™˜๊ฒฝ ๋ฐ ์žฌํ˜„ ๋‹จ๊ณ„์™€ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค ๐Ÿ˜Š!

ํ™˜๊ฒฝ์ด Windows 10 ์ปดํ“จํ„ฐ์—์„œ ๋กœ์ปฌ๋กœ ์‹คํ–‰ ์ค‘์ž…๋‹ˆ๋‹ค.
๋‹จ๊ณ„: ๋ฏธ๋ฆฌ๋ณด๊ธฐ ์ƒ์„ฑ๊ธฐ๋ฅผ ์‹คํ–‰ํ•˜์—ฌ ๋นˆ VA ๋นŒ๋“œ
appsettings.json ๋ฐcognitivemodels.json ์—…๋ฐ์ดํŠธ
https://botbuilder.myget.org/F/aitemplates/npm์„ ๊ฐ€๋ฆฌํ‚ค๋Š” .npmrc ํŒŒ์ผ ์ถ”๊ฐ€
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์—์„œ (internal/modules/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์—์„œ(internal/modules/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 ํŒŒ์ผ์„ ํ•ด๊ฒฐํ•˜๋ ค๊ณ  ํ•  ๋•Œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ MS ํŒ€์—์„œ en-US ๋กœ์ผ€์ผ์„ ์ˆ˜์‹ ํ•˜์ง€๋งŒ en-us(์†Œ๋ฌธ์ž)๋งŒ ์„ค์ •ํ•˜๊ณ  ์ธ์‹๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์— if (this.templateEnginesPerLocale.has(locale)) ์†Œ๋ฌธ์ž๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉด ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(LocaleTemplateEngineManager.ts ์ค„ 61). ์ž ์‹œ ๋™์•ˆ ์ด ๋ฌธ์ œ๋ฅผ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด 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 - MultiLanguageLG ์ œ๊ณต SDK๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์†”๋ฃจ์…˜ Lib์—์„œ LocaleTemplateEngine์— ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ์žˆ๋Š”์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ๋‚˜๋Š” ์ด๊ฒƒ์ด ํ˜ผํ•ฉ ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ์šฐ์•„ํ•˜๊ฒŒ ์ฒ˜๋ฆฌํ•˜๊ธฐ๋ฅผ ํฌ๋งํ•˜์ง€๋งŒ ์ผ๋ถ€ ํ…Œ์ŠคํŠธ๋Š” ๊ฒ€์ฆํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

@ lzc850612 csharp GA RC๋กœ ๋น ๋ฅธ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ๋ฅผ ์‹คํ–‰ํ•˜์—ฌ ํ™œ๋™์˜ ๋ด‡์œผ๋กœ ๋“ค์–ด์˜ค๋Š” ๋Œ€์†Œ๋ฌธ์ž ํ˜ผํ•ฉ ๋กœ์ผ€์ผ์—์„œ ์˜ˆ์ƒ๋Œ€๋กœ ์ž‘๋™ํ•˜๋Š”์ง€ ๋‹ค์‹œ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

๋ฌผ๋ก  @darrenj , ์šฐ๋ฆฌ๋Š” ๊ทธ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ํ™•์ธํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค!

@darrenj ์ง„ํ–‰ ์ƒํ™ฉ ์—…๋ฐ์ดํŠธ์— ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค! tommyJimmy๊ฐ€ ์ง€์ ํ•œ ๊ฒƒ๊ณผ ๋™์ผํ•œ ๋กœ์ผ€์ผ ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ์ง€๋งŒ localeTemplateManager์— locale.toLowerCase๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ ํ•ด๊ฒฐํ–ˆ์Šต๋‹ˆ๋‹ค. ํ˜„์žฌ VA์— ์‚ฌ์šฉ์ž ์ง€์ • ๊ธฐ์ˆ ์„ ์—ฐ๊ฒฐํ•˜๊ณ  ์žˆ์ง€๋งŒ ์—ฌ์ „ํžˆ ์ถ”์ ํ•˜๋ ค๋Š” ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ์Šคํ‚ฌ์ด VA์— 501 ์˜ค๋ฅ˜๋ฅผ ๋ฐ˜ํ™˜ํ•˜์ง€๋งŒ defaultActitivityHandler.ts์˜ onMessage ํ•จ์ˆ˜์—์„œ ๋ฉ”์‹œ์ง€๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ณ  ์žˆ์œผ๋ฉฐ, ์Šคํ‚ฌ์ด ์ฒ˜๋ฆฌํ•  ๊ธฐ๋ณธ ๋Œ€ํ™” ์ƒ์ž๋กœ ํ™œ๋™์„ ์ „๋‹ฌํ•˜์ง€ ์•Š์„ ๋ฟ์ž…๋‹ˆ๋‹ค. appSettings.json ํŒŒ์ผ์„ ์—…๋ฐ์ดํŠธํ•˜์—ฌ ์Šคํ‚ฌ์„ ์ถ”๊ฐ€ํ–ˆ๋Š”๋ฐ ์Šคํ‚ฌ์ด ์•กํ‹ฐ๋น„ํ‹ฐ๋ฅผ ๋ฐ›๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

@ Batta32 ์•ž์œผ๋กœ ๊ฒฝ๋กœ์— ์—ฌ์ „ํžˆ localTemplateEngineManager๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๊ณ  ์‹ถ์—ˆ์Šต๋‹ˆ๋‹ค. ๋ฏธ๋ฆฌ๋ณด๊ธฐ ๋นŒ๋“œ์—์„œ ๋ˆ„๋ฝ๋˜์—ˆ๊ณ  responseManager๋งŒ ์žˆ๋Š” ๊ฒƒ์œผ๋กœ ๋‚˜ํƒ€๋‚ฌ์Šต๋‹ˆ๋‹ค. ์•ž์œผ๋กœ ์‘๋‹ต ๊ด€๋ฆฌ์ž๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ ์•„๋‹ˆ๋ฉด ๋กœ์ผ€์ผ ํ…œํ”Œ๋ฆฟ์ด ๋‹ค์‹œ ์ถ”๊ฐ€๋  ์˜ˆ์ •์ž…๋‹ˆ๊นŒ?

@Batta32 VA์˜ ์Šคํ‚ฌ๊ณผ ํ†ต์‹ ํ•  ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ์˜ค๋ฅ˜๋ฅผ ์ถ”์ ํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. dialogEx ๋ชจ๋“ˆ์—๋Š” ๊ธฐ์ˆ ์ด ์‹œ์ž‘๋œ VA๋กœ ์ถ”์ ์„ ๋‹ค์‹œ ๋ณด๋‚ด๋Š” ์ „์†ก ์ถ”์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด sendActivity๋Š” ํ˜ธ์ถœ๋  ๋•Œ ๋‹ค์Œ ์˜ค๋ฅ˜๋ฅผ ๋ฐœ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค.
์˜ค๋ฅ˜: /api/messages/v3/conversations/5659a380-841b-11ea-bed3-831b5a6aa1eb%7Clivechat-dlpskill-emulator-skillconvo/activities/5b61c920-841b-11ea-b14555abb๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š์Œ
SkillConversationIdFactory์— ๋Œ€ํ™” ID๊ฐ€ ์ถ”๊ฐ€๋˜๋ฉด ์Šคํ‚ฌ์ด ์ƒˆ ๋Œ€ํ™” ID์— ๋‹ค์‹œ ๊ฒŒ์‹œํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

์—…๋ฐ์ดํŠธ:
์ด ๋ฌธ์ œ์˜ ์›์ธ์ด ๋œ SkillHostEndpoint์— ์˜คํƒ€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ผ๋‹จ ๊ธฐ์ˆ ์„ ๋ถ€์ฐฉํ•˜๊ณ  VA์™€ ์ƒํ˜ธ ์ž‘์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ˆ˜์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.

@Batta32 @darrenj VA๋กœ ์žก๋‹ด์„ ์‚ฌ์šฉํ•˜๋ ค๊ณ  ํ•  ๋•Œ ์˜ˆ๊ธฐ์น˜ ์•Š์€ ๋™์ž‘์— ์ง๋ฉดํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ ์‚ฌ์šฉ์ž๊ฐ€ ๋ด‡์—๊ฒŒ ๋ฌด์–ธ๊ฐ€๋ฅผ ์š”์ฒญํ•  ๋•Œ๋งˆ๋‹ค ์ธํŠธ๋กœ์Šคํ…์€ ์ดˆ๊ธฐ ๋ฉ”์‹œ์ง€๋ฅผ ๋‹ค์‹œ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. ์žก๋‹ด์˜ ๊ฒฝ์šฐ UX๋งŒํผ ์ข‹์ง€ ์•Š์Šต๋‹ˆ๋‹ค. . ์ด๊ฒƒ์€ ์˜ˆ์ƒ๋œ ๊ฒƒ์ž…๋‹ˆ๊นŒ ์•„๋‹ˆ๋ฉด ์ œ๊ฐ€ ๋†“์น˜๊ณ  ์žˆ๋Š” ๊ฒƒ์ž…๋‹ˆ๊นŒ?

Screen Shot 2020-04-23 at 11 25 46

(๊ธฐ๋‹ค๋ ค์ฃผ์„ธ์š” ๋ฉ”์‹œ์ง€๋Š” ์‚ฌ์šฉ์ž ์ •์˜ ๋ฉ”์‹œ์ง€์ž…๋‹ˆ๋‹ค ๊ทธ๊ฒƒ์— ๋Œ€ํ•ด ๊ฑฑ์ •ํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค
)

@Batta32 VA์˜ ์Šคํ‚ฌ๊ณผ ํ†ต์‹ ํ•  ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ์˜ค๋ฅ˜๋ฅผ ์ถ”์ ํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. dialogEx ๋ชจ๋“ˆ์—๋Š” ๊ธฐ์ˆ ์ด ์‹œ์ž‘๋œ VA๋กœ ์ถ”์ ์„ ๋‹ค์‹œ ๋ณด๋‚ด๋Š” ์ „์†ก ์ถ”์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด sendActivity๋Š” ํ˜ธ์ถœ๋  ๋•Œ ๋‹ค์Œ ์˜ค๋ฅ˜๋ฅผ ๋ฐœ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค.
์˜ค๋ฅ˜: /api/messages/v3/conversations/5659a380-841b-11ea-bed3-831b5a6aa1eb%7Clivechat-dlpskill-emulator-skillconvo/activities/5b61c920-841b-11ea-b14555abb๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š์Œ
SkillConversationIdFactory์— ๋Œ€ํ™” ID๊ฐ€ ์ถ”๊ฐ€๋˜๋ฉด ์Šคํ‚ฌ์ด ์ƒˆ ๋Œ€ํ™” ID์— ๋‹ค์‹œ ๊ฒŒ์‹œํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

์—…๋ฐ์ดํŠธ:
์ด ๋ฌธ์ œ์˜ ์›์ธ์ด ๋œ 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 ์ €๋Š” VA์™€ 1๊ฐœ์˜ ์Šคํ‚ฌ์„ Azure์— ๋ฐฐํฌํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์›น ์ฑ„ํŒ…์„ ์‚ฌ์šฉํ•˜๋ฉด ๋ชจ๋“  ๊ฒƒ์ด ์˜ˆ์ƒ๋Œ€๋กœ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ํŒ€ ์ฑ„๋„์„ ์‚ฌ์šฉํ•˜๋ ค๊ณ  ํ•˜๋ฉด ์•„๋ž˜ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ์›น ์ฑ„ํŒ…์ด ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๋ผ์šฐํŒ…๋˜๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์€ Teams ์ฑ„๋„์— ๊ฒฉ๋ฆฌ๋œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.
์˜ค๋ฅ˜: "https://{app name}.azurewebsites.net/api/skill/messages"์—์„œ ๊ธฐ์ˆ  ID: "dlpskill"์„ ํ˜ธ์ถœํ•˜๋Š” ๋™์•ˆ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค(์ƒํƒœ๋Š” 500).
์˜ค๋ฅ˜ : / / ์Šคํ‚ฌ / / ๋Œ€ํ™” / A V3 API : 1lFWWXG9CVtdrkA76VLFeS9CbYWzsHVr9mQ4S7BqDpL4K5WNIc0ND6mqaaj_QsSqH-qUU-Gb2vLX3HQ4CpG3ZDPCbR0XKLtJGOqW0kwKUbe2HKv5C9fs1sjLSO4EvoE5h-dlpskill-msteams-skillconvo / / 1,588,712,064,379๊ฐ€ํ•˜๋Š” ํ™œ๋™์€ํ•˜์ง€ ์กด์žฌ
SkillDialog์—์„œ(D:homesitewwwrootnode_modulesbotbuilder-dialogslibskillDialog.js:164:23)
Generator.next์—์„œ ()
์ดํ–‰ ์‹œ(D:homesitewwwrootnode_modulesbotbuilder-dialogslibskillDialog.js:11:58)
process._tickCallback์—์„œ (๋‚ด๋ถ€/ํ”„๋กœ์„ธ์Šค/next_tick.js:68:7)

@tommyJimmy87 ngrok์„ ์‚ฌ์šฉํ•˜์—ฌ VA์—์„œ ์Šคํ‚ฌ๋กœ ๋กœ์ปฌ๋กœ ํ†ต์‹ ํ•˜์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์— SkillHostEndpoint์— ๋Œ€ํ•ด localhost:3979/api/skills๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์—ˆ๊ณ  ์Šคํ‚ฌ์— ๋„๋‹ฌํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. Teams ์ฑ„๋„๋„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— Teams ์ฑ„๋„์˜ ๋ฌธ์ œ๋ผ๊ณ  ๋ง์”€๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค. ์›น ์ฑ„ํŒ…์„ ํ†ตํ•ด ์Šคํ‚ฌ์— ์ ‘๊ทผ์„ ์‹œ๋„ํ•˜๊ณ  ํ•˜๋Š˜๋น›์—์„œ VA์˜ ์Šคํ‚ฌ๊ณผ ํ†ต์‹ ํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์•ˆ๋…•ํ•˜์„ธ์š” @Batta32๋‹˜ , ์ €๋Š” Teams ์ฑ„๋„์— ์–ด๋–ค ์ข…๋ฅ˜์˜ ๋ฌธ์ œ๊ฐ€ ์žˆ์„ ๊ฐ€๋Šฅ์„ฑ์ด ๋†’๋‹ค๋Š” @tomSauret847์— ๋™์˜ํ•ฉ๋‹ˆ๋‹ค.

์•ฝ๊ฐ„์˜ ๋””๋ฒ„๊น… ํ›„์— ๋‚ด๊ฐ€ ์•Œ์•„๋‚ธ ๊ฒƒ์„ ์„ค๋ช…ํ•˜๋ ค๊ณ  ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

1) ChannelServiceHandler ๋ชจ๋“  ๋ฉ”์†Œ๋“œ๊ฐ€ ๊ตฌํ˜„๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ฆ‰, /api/skills ์ค‘ ํ•˜๋‚˜๊ฐ€ ํ˜ธ์ถœ๋  ๋•Œ๋งˆ๋‹ค ์˜ค๋ฅ˜ ์ฝ”๋“œ๊ฐ€ ๋ฐ˜ํ™˜๋ฉ๋‹ˆ๋‹ค.

ie ํŒŒ์ผ : ChannelServiceHandler.ts (botbuilder) , line : 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 ์ด ๊ฒฝ์šฐ ๋Œ€์‹ ์— ๋Œ€ํ™” ID๋ฅผ ํŒŒ์‹ฑํ•˜๋Š” ๋ฐ ์•ฝ๊ฐ„์˜ ๋ฌธ์ œ๊ฐ€ ์žˆ๊ณ  ์˜ค๋ฅ˜ ๊ฒฐ๊ณผ๋Š” ํ•ญ์ƒ ๋ฆฌ์†Œ์Šค๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š์ง€๋งŒ ๋™์ผํ•œ URL์„ ํ˜ธ์ถœํ•˜๋ ค๊ณ  ํ•˜๋ฉด ๋Œ€ํ™” ID๋ฅผ ๋” ๊ฐ„๋‹จํ•œ ๋ฌธ์ž์—ด๋กœ ๋ณ€๊ฒฝํ•˜์—ฌ ๋Œ€ํ™” ID๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ž‘๋™ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค(๊ทธ๋Ÿฌ๋‚˜ ๊ฒฐ๊ณผ๋Š” ์—ฌ์ „ํžˆ ์ด์ „ ์š”์ ์œผ๋กœ ์ธํ•ด ๋ฉ”์„œ๋“œ๊ฐ€ ๊ตฌํ˜„๋˜์ง€ ์•Š์Œ).

์•ˆ๋…•ํ•˜์„ธ์š” @tommyJimmy87 , @tomSauret847 -

@tommyJimmy87 - Microsoft ํŒ€ ์ฑ„๋„์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฌธ์ œ๋ฅผ ์„ฑ๊ณต์ ์œผ๋กœ ์žฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ์ฆ‰์‹œ ์ด ์Šค๋ ˆ๋“œ๋กœ ๋Œ์•„์˜ค๊ฒ ์Šต๋‹ˆ๋‹ค.

๊ฐ์‚ฌ ํ•ด์š”!

์•ˆ๋…•ํ•˜์„ธ์š” @tommyJimmy87 , @tomSauret847 , ๋ฌธ์ œ์˜ ์›์ธ ์„ ์„ฑ๊ณต์ ์œผ๋กœ ์ฐพ์•˜์Šต๋‹ˆ๋‹ค.

๋ฌธ์ œ๋Š” ํ™œ๋™์ด Skill์—์„œ Virtual Assistant๋กœ ๋‹ค์‹œ ์ „์†ก๋  ๋•Œ _':'_ ๋ฌธ์ž ๊ฐ€ _'%3A'_
๋ถ„๋ช…ํžˆ ์ด ๋™์ž‘์€ ์–ธ๊ธ‰ํ•œ ๋Œ€๋กœ ๋ฌธ์ž๋ฅผ ๋Œ€์ฒดํ•˜๋Š” axios ์ข…์†์„ฑ์—์„œ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.

๋งˆ์ง€๋ง‰์œผ๋กœ ์ค‘์š”ํ•œ ๊ฒƒ์€ botbuilder์˜ axios๋ฅผ ๋Œ€์ฒดํ•˜๋Š” microsoft/botbuilder-js#2182์— ๋ฌธ์ œ๊ฐ€ ์žˆ์œผ๋ฉฐ _R10_ ์— ๋Œ€ํ•ด ์ค€๋น„๋œ ๊ฒƒ์œผ๋กœ ํƒœ๊ทธ

๋ฌธ์ œ๋ฅผ ์„ค๋ช…ํ•˜๋Š”

๋งˆ์ง€๋ง‰์œผ๋กœ ์—ฌ๋Ÿฌ๋ถ„์„ ์œ„ํ•œ ์ƒˆ๋กœ์šด ์—…๋ฐ์ดํŠธ๊ฐ€ ์žˆ๋Š” ๋Œ€๋กœ ์ด ์Šค๋ ˆ๋“œ๋กœ ๋Œ์•„์˜ค๊ฒ ์Šต๋‹ˆ๋‹ค ๐Ÿ˜Š

_conversationIds์˜ ๋ถˆ์ผ์น˜_
image

_axios ์ข…์†์„ฑ์€ ':'๋ฅผ '%3A'๋กœ ๋Œ€์ฒดํ•ฉ๋‹ˆ๋‹ค_
image

@Batta32 ๊ณง ๊ณ ์ณ์งˆ ๊ฒƒ ๊ฐ™๋‚˜์š” ์•„๋‹ˆ๋ฉด ์‹œ๊ฐ„์ด ์ข€ ๊ฑธ๋ฆด ๊ฒƒ ๊ฐ™๋‚˜์š”?

@ tommyJimmy87, @ tomSauret847 - ์šฐ๋ฆฌ๋Š” ๋ฌธ์ œ๊ฐ€์žˆ๋Š” ๊ฒƒ์œผ๋กœ ๋‚˜ํƒ€๋‚ฌ์Šต๋‹ˆ๋‹ค MS-๋‚˜๋จธ์ง€-JS ๋Œ€์‹  Axios์˜ .

๋ฌธ์ œ๋Š” Skill๊ณผ Virtual Assistant ๊ฐ„์˜ conversationId ๋ถˆ์ผ์น˜์ž…๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ๋Š” Teams์˜ _conversationId_์˜ _':'_ ๋ฌธ์ž๊ฐ€ _'%3A'_๋กœ ๋ฐ”๋€Œ๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ฌธ์ž๋Š” ๋‹ค์‹œ _':'_ ์€ _axios_ ์ฒ˜๋Ÿผ sendOperationRequest์—์„œ ๊ตฌํ˜„ ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์‹ค์ˆ˜ํ•ด์„œ ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค ๐Ÿ˜Š .

_encodeURIComponent๋Š” '%3A'๋ฅผ ๋‹ค์‹œ ':'_์œผ๋กœ ๋ฐ”๊พธ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
image

_axios์™€ ms-rest-js์˜ ์ธ์ฝ”๋”ฉ ์ฐจ์ด_
image

@Batta32 ms-rest-js ๋ฒ„์ „ < 2.0์˜ ๊ธฐ๋ณธ ์—์ด์ „ํŠธ๋Š” https://github.com/Azure/ms-rest-js/blob/1.x/lib/axiosHttpClient.ts์ž…๋‹ˆ๋‹ค.

์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ํ•œ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์€ SkillConversationIdFactory ๊ตฌํ˜„ ๋‚ด์—์„œ encodeURI๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๋Ÿฐ ์‹์œผ๋กœ ๊ธฐ๋ณธ ์—์ด์ „ํŠธ๋Š” ํŒฉํ† ๋ฆฌ์— ์ €์žฅ๋œ ๋Œ€ํ™” ID๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

@EricDahlvang๋‹˜ , ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. encodeURI ๋‚ด์—์„œ SkillConversationIdFactory encodeURI ์˜ ๋Œ€์•ˆ์„ ๊ฒ€ํ† ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค!

@EricDahlvang ์ผ - ์ถ”๊ฐ€ encodeURI ์˜๋ฅผ SkillConversationIdFactory ์Šคํ‚ฌ์€ ์ด๋ฏธ ์ธ์ฝ”๋”ฉ ๋  ๋•Œ ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋˜์ง€ ์•Š๋Š” conversationId ๊ฐ€์ƒ ์–ด์‹œ์Šคํ„ดํŠธ๋กœ ๋‹ค์‹œ ํ™œ๋™์„ ๋ณด๋‚ด๊ธฐ ์ „์—.

Microsoft Teams์—์„œ ๋ฐ›์€ ๋Œ€ํ™” ID์˜ ๊ธธ์ด ์™€ ๊ด€๋ จ๋œ ๋ฌธ์ œ์ผ ์ˆ˜ ์žˆ์Œ์„ ๊นจ๋‹ฌ์•˜์Šต๋‹ˆ๋‹ค. ์›๋ž˜ conversationId ํ•˜๋ฉด VA์˜ ๋์ ์ด ์ ์ค‘๋˜์ง€ ์•Š์ง€๋งŒ conversationId ์—์„œ ์ผ๋ถ€ ๋ฌธ์ž๋ฅผ ํŠธ๋ฆฌ๋ฐํ•˜๋Š” ๊ฒƒ์€ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ ์ค‘๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๋งˆ์ง€๋ง‰์œผ๋กœ ์ด ๋ฌธ์ œ๋Š” C#์— ์กด์žฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

_์—”๋“œํฌ์ธํŠธ๊ฐ€ ์›๋ž˜ ๋Œ€ํ™” ID๋กœ ์ ์ค‘๋˜์ง€ ์•Š์Œ_
image

_๋์ ์ด ์ž˜๋ฆฐ ๋Œ€ํ™” ID๋กœ ์ ์ค‘๋˜์—ˆ์Šต๋‹ˆ๋‹ค_
image

_C#์—๋Š” ๋ฌธ์ œ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.
image

@Batta32 SkillConversationIdFactory๊ฐ€ encodeURI๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ, ์Šคํ‚ฌ์€ ํ•ด๋‹น dialog.id๋ฅผ ์ˆ˜์‹ ํ•˜๊ณ  ๊ทธ์— ๋”ฐ๋ผ ์‘๋‹ตํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ด๊ฒƒ์ด ํ•„์ˆ˜๋ผ๊ณ  ํ™•์‹ ํ•ฉ๋‹ˆ๋‹ค.

๋˜ํ•œ ์˜ˆ, restify๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋™์•ˆ ๊ธด ๋Œ€ํ™” ID์— ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ์ƒ˜ํ”Œ์—์„œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์–ธ๊ธ‰ํ•ฉ๋‹ˆ๋‹ค. https://github.com/microsoft/BotBuilder-Samples/blob/master/samples/javascript_nodejs/80.skills-simple-bot-to-bot/simple-root -bot/skillConversationIdFactory.js#L21

// ์ด ํ‚ค๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ 100์ž๋กœ ์ œํ•œ๋ฉ๋‹ˆ๋‹ค. index.js์—์„œ restify.createServer({ maxParamLength: 1000 }); ๋กœ ์ฆ๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

@EricDahlvang ์ •๋ณด ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ๋‚ด VA์™€ ๊ธฐ์ˆ  ๋ชจ๋‘์— ์—…๋ฐ์ดํŠธ๋ฅผ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด์ œ VA๊ฐ€ ์˜ค๋ฅ˜ ์—†์ด Teams ์ฑ„๋„์˜ ๊ธฐ์ˆ ๊ณผ ํ†ต์‹ ํ•˜๋„๋ก ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ œ๊ณต๋œ ์ •๋ณด์— ๋Œ€ํ•ด @EricDahlvang ์—๊ฒŒ ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค! ์šฐ๋ฆฌ๋Š” ๊ฐœ์„  PR # 3359์„ ๋งŒ๋“  maxParamLength ๋„์˜ ๋ฒ„์ „ ์—…๋ฐ์ดํŠธ @types/restify@^8.4.2 .

@tommyJimmy87 , @tomSauret847 ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ๋ณ‘ํ•ฉ๋˜๋Š” ์ฆ‰์‹œ ํ…Œ์ŠคํŠธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค ๐Ÿ˜Š.

image

@Batta32 ๋‹ค์‹œ ํ•œ๋ฒˆ ๋ฒˆ๊ฑฐ๋กญ๊ฒŒ ํ•ด์„œ ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค. ์šฐ์„  ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์ ์šฉํ•ด

@tommyJimmy87 ๋‹˜ ์•ˆ๋…•ํ•˜์„ธ์š”, C# ๋ฐ JS ์˜ SkillHandler ์—๋Š” ์–ธ๊ธ‰ํ•œ ๋Œ€๋กœ onUpdateActivity() ํฌํ•จ๋˜์–ด ์žˆ์ง€ ์•Š์ง€๋งŒ SkillHandler ๋˜๋Š” ChannelServiceHandler ์—์„œ ํ™•์žฅํ•˜๋Š” ๊ณ ์œ ํ•œ ์ฒ˜๋ฆฌ๊ธฐ๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ChannelServiceHandler .

@darrenj - onUpdateActivity() ๋ฉ”์„œ๋“œ๊ฐ€ ์—†๋Š” ๊ฒƒ์ด ๋งž๋Š”์ง€ ์•„๋‹ˆ๋ฉด ๊ตฌํ˜„ํ•  ๊ณ„ํš์ด ์žˆ๋Š”์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

@ 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 ๊ฐ€์ƒ ๋„์šฐ๋ฏธ๊ฐ€ ์žˆ๋Š” "๋„์›€๋ง ์นด๋“œ"์—์„œ ํ™œ์„ฑ ๊ธฐ์ˆ ์— ๋Œ€ํ•œ ๋„์›€๋ง ์นด๋“œ๊ฐ€ ํ‘œ์‹œ๋˜์ง€ ์•Š๋Š” ๊ฒƒ์„ ํ™•์ธํ–ˆ์Šต๋‹ˆ๋‹ค. ์Šคํ‚ฌ ๋Œ€ํ™” ์ƒ์ž์—์„œ "๋„์›€๋ง" ์ธํ„ฐ๋ŸฝํŠธ๋ฅผ ๋ˆ„๋ฅด๋ฉด ์Šคํ‚ฌ์ด ์•„๋‹Œ VA์— ๋Œ€ํ•œ ๋„์›€๋ง ์นด๋“œ๊ฐ€ ๊ณ„์† ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ํ™œ์„ฑ ์Šคํ‚ฌ๋กœ activeSkillProperty ์ƒํƒœ๋ฅผ ์„ค์ •ํ•˜๋Š” ๊ฒƒ์ด ํฌํ•จ๋œ ๋งˆ์ง€๋ง‰ ๋ฆด๋ฆฌ์Šค๋กœ ์—…๋ฐ์ดํŠธํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ์•„์ด๋””์–ด๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ? ํ™œ์„ฑ ๋Œ€ํ™”๊ฐ€ ํ™œ์„ฑ ์Šคํ‚ฌ์ด ์•„๋‹ˆ๋ผ VA์— ์žˆ๋Š” ๋Œ€ํ™”๋กœ ์—ฌ์ „ํžˆ ๋“ฑ๋ก๋œ ์ƒํƒœ์—์„œ ๋กœ๊ทธ์•„์›ƒํ•ฉ๋‹ˆ๋‹ค.

์•ˆ๋…•ํ•˜์„ธ์š” @tommyJimmy87 , @tomSauret847 , ์ด๋Ÿฌํ•œ ๋ฌธ์ œ๋ฅผ ๋ณด๊ณ ํ•ด ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

[email protected] , [email protected] ๋ฐ [email protected] ๊ฐ€ npmjs ์— ๊ฒŒ์‹œ ๋˜๊ณ  master ๋ถ„๊ธฐ์— ๋ณ‘ํ•ฉ๋˜๋ฏ€๋กœ ์ €์žฅ์†Œ์—์„œ ๋ฌธ์ œ๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฌธ์ œ๋ฅผ ๋” ์ž˜ ์„ค๋ช…ํ•˜๊ณ  ์šฐ๋ฆฌ๋Š” ๊ทธ๋“ค์„ ๋”ฐ๋ผ๊ฐˆ ๊ฒƒ์ž…๋‹ˆ๋‹ค ๐Ÿ˜Š.

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰