๊ธฐ์ ํ๋กํ ์ฝ์ด WebSocket์ผ๋ก ๋ณ๊ฒฝ๋จ์ ๋ฐ๋ผ ์ด์ ์๋ C#์์๋ง ์ฌ์ฉํ ์ ์์๋ Typescript์์ ์ฌ์ฉํ ์ ์๋ ์๋ก์ด ์คํธ๋ฆฌ๋ฐ ํ์ฅ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๊ธฐ๋ค๋ฆฌ๊ณ ์์์ต๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด Typescript๋ฅผ ์ฌ์ฉํ ๋ Virtual Assistant์ ๋ํ ๊ธฐ์ ํธ์ถ ์๋๋ฆฌ์ค์ ์ฐจ๋จ์ด ํด์ ๋ฉ๋๋ค.
... ๊ฐ๋ฐ์๋ก์
๊ธฐ์ ์ TypeScript ๋ฒ์ ์ Virtual Assistant์ ์ฐ๊ฒฐํ ์ ์๊ธฐ๋ฅผ ์ํฉ๋๋ค.
๊ทธ๋์ ... C#๊ณผ Typescript ์ฌ์ด์ ํจ๋ฆฌํฐ๊ฐ ์์ต๋๋ค.
์๋
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
๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋ก์ปฌ์์ ์ฌ์ฉํ๋ ค๋ฉด ๋ค์ ๋จ๊ณ๋ฅผ ๋ฐ๋ฅด์ญ์์ค(์ธ๊ธ๋ ๋ถ๊ธฐ ์ฌ์ฉ).
npm install
์คํnpm run build
์คํnpm pack
๋ฅผ ์คํํ์ฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ .tgz ํ์ผ์ ์์ฑํฉ๋๋ค.package.json
ํ์ผ์ ์ฝ๋๋ค.npm install
๋ฅผ ์คํํฉ๋๋ค.์ฐ๋ฆฌ๋ ํ์ฌ ์ด๋ฌํ ๋ณ๊ฒฝ ์ฌํญ์ ํ์ธํ๊ณ ์์ต๋๋ค. ์ฃผ์ ํ์ง ๋ง๊ณ ํด๋น PR์ ํผ๋๋ฐฑ์ ์ ๊ณตํ๋ฉด ์ต๋ํ ๋นจ๋ฆฌ ๊ฒํ ํ๊ฒ ์ต๋๋ค.
์ด ๋ฌธ์ ๋ 30์ผ ๋์ ํ๋์ด ์์๊ธฐ ๋๋ฌธ์ ์ ํจํ์ง ์์ต๋๋ค. ์ค๋๋ ๋ ์ด๋ธ์ด๋ ๋๊ธ์ ์ ๊ฑฐํ์ง ์์ผ๋ฉด 5์ผ ํ์ ๋ซํ๋๋ค.
@darrenj - VA(C#)์์ ๋ ธ๋ js์ธ Skill๋ก์ ์ฐ๊ฒฐ์ ๋ํด ์๋์ ์ธ๊ธ๋ ๋ณ๊ฒฝ ์ฌํญ์ ์ํํ ์ ์๋์ง ์๋ ค์ฃผ์ญ์์ค.
์ - ๋ฌธ์๋ PR์ ์์ผ๋ฉฐ ํ์ ์ฐ๋ฆฌ๊ฐ ๋งํ๋ ๋์ ์ด ์์ ์ ๋ง๋ฌด๋ฆฌํ๊ณ ์์ต๋๋ค! (@Batta32). ์ฌ๊ธฐ์์ ์งํ ์ค์ธ ์์ ์ ๋ณผ ์ ์์ต๋๋ค. https://github.com/microsoft/botframework-solutions/pull/3123
SDK์ ๋ํ ๊ด๋ จ ๋ณ๊ฒฝ ์ฌํญ๊ณผ ํจ๊ป: https://github.com/microsoft/botframework-solutions/pull/3122
์ฝ์๋๋ก SDK ์ ๋ฐ์ ๊ฑธ์น ์ผ๋ จ์ ๋ณ๊ฒฝ ์ฌํญ์ ์ฒ๋ฆฌํ๋ ๋์ ๊ธฐ๋ค๋ ค ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค.
๋ํ 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
์ ๊ฑฐ ๊ณ ๋ ค). :
.npmrc
๋ ์ง์คํธ๋ฆฌ๋ฅผ ๊ฐ๋ฆฌํค๋ ํ์ผ์ https://botbuilder.myget.org/F/aitemplates/npm
, ๊ทธ๋ฆฌ๊ณ ์
๋ฐ์ดํธ package.json
๊ฐ๋ฆฌ ํค๋๋ก botbuilder-solutions
๋ฒ์ ์ 4.5.0-preview223
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)
๊ฐ์ฒด์์.
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
๊ฐ ๋๋จธ์ง์ ๋ถ๋ฆฌ๋์ด ์ค์น๋ ๋ ์ถฉ๋์ ์ผ์ผํค๋ ์ข
์์ฑ ์ค์น ๋ฐฉ๋ฒ์ ์ค๋ฅ์
๋๋ค.
๋ค์ ๋จ๊ณ๋ฅผ ๋ฐ๋ฅด์ญ์์ค . ( node_modules
๋ฐ package-lock
)
package.json
์ 4.5.0-preview223
๋ฒ์ ์ผ๋ก botbuilder-solutions
npm install
์คํํ๋ ๋ชจ๋ ์ข
์์ฑ์ ์ค์นํฉ๋๋ค.npm run build
์คํํ๋ ์๋ฃจ์
๋น๋npm run start
์คํํ๋ ๊ฐ์ ๋์ฐ๋ฏธ ์์@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๋งํผ ์ข์ง ์์ต๋๋ค. . ์ด๊ฒ์ ์์๋ ๊ฒ์ ๋๊น ์๋๋ฉด ์ ๊ฐ ๋์น๊ณ ์๋ ๊ฒ์ ๋๊น?
(๊ธฐ๋ค๋ ค์ฃผ์ธ์ ๋ฉ์์ง๋ ์ฌ์ฉ์ ์ ์ ๋ฉ์์ง์
๋๋ค ๊ทธ๊ฒ์ ๋ํด ๊ฑฑ์ ํ์ง ๋ง์ญ์์ค
)
@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์์
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์ ๋ถ์ผ์น_
_axios ์ข
์์ฑ์ ':'๋ฅผ '%3A'๋ก ๋์ฒดํฉ๋๋ค_
@Batta32 ๊ณง ๊ณ ์ณ์ง ๊ฒ ๊ฐ๋์ ์๋๋ฉด ์๊ฐ์ด ์ข ๊ฑธ๋ฆด ๊ฒ ๊ฐ๋์?
@ tommyJimmy87, @ tomSauret847 - ์ฐ๋ฆฌ๋ ๋ฌธ์ ๊ฐ์๋ ๊ฒ์ผ๋ก ๋ํ๋ฌ์ต๋๋ค MS-๋๋จธ์ง-JS ๋์ Axios์ .
๋ฌธ์ ๋ Skill๊ณผ Virtual Assistant ๊ฐ์ conversationId
๋ถ์ผ์น์
๋๋ค. ์ด ๋ฌธ์ ๋ Teams์ _conversationId_์ _':'_ ๋ฌธ์๊ฐ _'%3A'_๋ก ๋ฐ๋๊ณ ์๊ธฐ ๋๋ฌธ์ ๋ฐ์ํฉ๋๋ค. ์ด ๋ฌธ์๋ ๋ค์ _':'_ ์ _axios_ ์ฒ๋ผ sendOperationRequest์์ ๊ตฌํ ๋์ง ์์ต๋๋ค.
์ค์ํด์ ์ฃ์กํฉ๋๋ค ๐ .
_encodeURIComponent๋ '%3A'๋ฅผ ๋ค์ ':'_์ผ๋ก ๋ฐ๊พธ์ง ์์ต๋๋ค.
_axios์ ms-rest-js์ ์ธ์ฝ๋ฉ ์ฐจ์ด_
@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๋ก ์ ์ค๋์ง ์์_
_๋์ ์ด ์๋ฆฐ ๋ํ ID๋ก ์ ์ค๋์์ต๋๋ค_
_C#์๋ ๋ฌธ์ ๊ฐ ์์ต๋๋ค.
@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 ๊ฐ์ฌํฉ๋๋ค. ์ด๋ฌํ ๋ณ๊ฒฝ ์ฌํญ์ด ๋ณํฉ๋๋ ์ฆ์ ํ ์คํธํ ์ ์์ต๋๋ค ๐.
@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
๋ถ๊ธฐ์ ๋ณํฉ๋๋ฏ๋ก ์ ์ฅ์์์ ๋ฌธ์ ๋ฅผ ์์ฑํ์ฌ ๋ค์์ ์ํํ ์ ์์ต๋๋ค. ๋ฌธ์ ๋ฅผ ๋ ์ ์ค๋ช
ํ๊ณ ์ฐ๋ฆฌ๋ ๊ทธ๋ค์ ๋ฐ๋ผ๊ฐ ๊ฒ์
๋๋ค ๐.
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
@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