From c0020e45ef58c84c3cf482192fa9d80a199247f1 Mon Sep 17 00:00:00 2001 From: Ace Nassri Date: Mon, 21 Nov 2022 11:45:04 -0800 Subject: [PATCH] migrate code from googleapis/nodejs-dialogflow-cx (#2854) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat!: initial full generation of library (#1) * chore: release 1.0.0 (#3) * feat(samples): examples of dialogflow-cx in action * chore: release 1.1.0 (#9) Co-authored-by: release-please[bot] <55107282+release-please[bot]@users.noreply.github.com> * chore: release 1.2.0 (#32) :robot: I have created a release \*beep\* \*boop\* --- ## [1.2.0](https://www.github.com/googleapis/nodejs-dialogflow-cx/compare/v1.1.0...v1.2.0) (2020-11-17) ### Features * adds event to MessageType ([999d156](https://www.github.com/googleapis/nodejs-dialogflow-cx/commit/999d15616da58c1c909f99ac093833a5eb8665bb)) ### Bug Fixes * do not modify options object, use defaultScopes ([#27](https://www.github.com/googleapis/nodejs-dialogflow-cx/issues/27)) ([a0124c7](https://www.github.com/googleapis/nodejs-dialogflow-cx/commit/a0124c774e59d0a2873445f6fa7697a192739ebf)) --- This PR was generated with [Release Please](https://github.com/googleapis/release-please). * docs: update quickstart to reflect actual use case (#11) * chore: release 2.0.0 (#36) Co-authored-by: release-please[bot] <55107282+release-please[bot]@users.noreply.github.com> * chore: release 2.1.0 (#40) :robot: I have created a release \*beep\* \*boop\* --- ## [2.1.0](https://www.github.com/googleapis/nodejs-dialogflow-cx/compare/v2.0.0...v2.1.0) (2020-11-25) ### Features * add back v3beta1 API surface ([#39](https://www.github.com/googleapis/nodejs-dialogflow-cx/issues/39)) ([36ba8fa](https://www.github.com/googleapis/nodejs-dialogflow-cx/commit/36ba8fa857ae34a21ce0710986689667f909349f)) --- This PR was generated with [Release Please](https://github.com/googleapis/release-please). * docs: improved instructions for samples and tests (#41) * chore: release 2.2.0 (#45) :robot: I have created a release \*beep\* \*boop\* --- ## [2.2.0](https://www.github.com/googleapis/nodejs-dialogflow-cx/compare/v2.1.0...v2.2.0) (2021-01-09) ### Features * adds style enumeration ([#49](https://www.github.com/googleapis/nodejs-dialogflow-cx/issues/49)) ([6d65571](https://www.github.com/googleapis/nodejs-dialogflow-cx/commit/6d655718327044ea6e77bc8501c805b5cd3fc4e2)) * allowed custom to specify webhook headers through query parameters docs: suggested to always use version for production traffic when calling DetectIntent ([#44](https://www.github.com/googleapis/nodejs-dialogflow-cx/issues/44)) ([0ffd0b7](https://www.github.com/googleapis/nodejs-dialogflow-cx/commit/0ffd0b7a8a2f34c06062c9baf4f33b719b15ad9f)) * expose Security Settings API. ([#46](https://www.github.com/googleapis/nodejs-dialogflow-cx/issues/46)) ([f6460ce](https://www.github.com/googleapis/nodejs-dialogflow-cx/commit/f6460cea16473d1f208eae4bfa3def7cf5583579)) --- This PR was generated with [Release Please](https://github.com/googleapis/release-please). See [documentation](https://github.com/googleapis/release-please#release-please). * chore: release 2.3.0 (#55) Co-authored-by: release-please[bot] <55107282+release-please[bot]@users.noreply.github.com> * chore: release 2.4.0 (#65) :robot: I have created a release \*beep\* \*boop\* --- ## [2.4.0](https://www.github.com/googleapis/nodejs-dialogflow-cx/compare/v2.3.0...v2.4.0) (2021-03-15) ### Features * added fallback option when restoring an agent docs: clarified experiment length ([f90bb9c](https://www.github.com/googleapis/nodejs-dialogflow-cx/commit/f90bb9cd369659160a16fcfc67bc08c248bd1552)) * added fallback option when restoring an agent docs: clarified experiment length ([f90bb9c](https://www.github.com/googleapis/nodejs-dialogflow-cx/commit/f90bb9cd369659160a16fcfc67bc08c248bd1552)) * allow to disable webhook invocation per request ([f90bb9c](https://www.github.com/googleapis/nodejs-dialogflow-cx/commit/f90bb9cd369659160a16fcfc67bc08c248bd1552)) * allow to disable webhook invocation per request ([3b1b674](https://www.github.com/googleapis/nodejs-dialogflow-cx/commit/3b1b674bbddbcb26fa607f9dc16db6c43752c371)) * supports SentimentAnalysisResult in webhook request, add http rules for long running operations docs: minor ([3b1b674](https://www.github.com/googleapis/nodejs-dialogflow-cx/commit/3b1b674bbddbcb26fa607f9dc16db6c43752c371)) ### Bug Fixes * RunTestCase http template. PHP REST client lib can be generated. feat: Support transition route group coverage for Test Cases. feat: Support SentimentAnalysisResult input in the WebhookRequest. ([3b1b674](https://www.github.com/googleapis/nodejs-dialogflow-cx/commit/3b1b674bbddbcb26fa607f9dc16db6c43752c371)) --- This PR was generated with [Release Please](https://github.com/googleapis/release-please). See [documentation](https://github.com/googleapis/release-please#release-please). * chore: release 2.5.0 (#84) :robot: I have created a release \*beep\* \*boop\* --- ## [2.5.0](https://www.github.com/googleapis/nodejs-dialogflow-cx/compare/v2.4.0...v2.5.0) (2021-04-28) ### Features * Expose supported languages of the agent; feat: add export / import flow API docs: Update docs on Pages, Session, Version, etc. ([#103](https://www.github.com/googleapis/nodejs-dialogflow-cx/issues/103)) ([daa06ab](https://www.github.com/googleapis/nodejs-dialogflow-cx/commit/daa06abca3ef1e601672d9a18363603dcb359c6f)) * include original user query in WebhookRequest; add GetTextCaseresult API. ([528192e](https://www.github.com/googleapis/nodejs-dialogflow-cx/commit/528192eb11453502332a35ff5838130e19c5e869)) * include original user query in WebhookRequest; add GetTextCaseresult API. doc: clarify resource format for session response. ([#82](https://www.github.com/googleapis/nodejs-dialogflow-cx/issues/82)) ([ff13a97](https://www.github.com/googleapis/nodejs-dialogflow-cx/commit/ff13a9708fccc0bf85f7972328dc289b50fdac20)) * support setting current_page to resume sessions; expose transition_route_groups in flows and language_code in webhook ([#90](https://www.github.com/googleapis/nodejs-dialogflow-cx/issues/90)) ([53f1e21](https://www.github.com/googleapis/nodejs-dialogflow-cx/commit/53f1e21deaf3adee3493b398529fc75baae70f99)) * support setting current_page to resume sessions; expose transition_route_groups in flows and language_code in webhook ([#91](https://www.github.com/googleapis/nodejs-dialogflow-cx/issues/91)) ([cd125d3](https://www.github.com/googleapis/nodejs-dialogflow-cx/commit/cd125d35c75ad740d3aa46d5af4a2142aaa051f1)) --- This PR was generated with [Release Please](https://github.com/googleapis/release-please). See [documentation](https://github.com/googleapis/release-please#release-please). * chore: release 2.6.0 (#105) Co-authored-by: release-please[bot] <55107282+release-please[bot]@users.noreply.github.com> * chore: release 2.7.0 (#111) :robot: I have created a release \*beep\* \*boop\* --- ## [2.7.0](https://www.github.com/googleapis/nodejs-dialogflow-cx/compare/v2.6.0...v2.7.0) (2021-05-10) ### Features * add support for service directory webhooks ([#110](https://www.github.com/googleapis/nodejs-dialogflow-cx/issues/110)) ([d4b87a5](https://www.github.com/googleapis/nodejs-dialogflow-cx/commit/d4b87a5ba49dfa723079be71f9a7c6e69b4240b2)) * add support for service directory webhooks ([#113](https://www.github.com/googleapis/nodejs-dialogflow-cx/issues/113)) ([2ce89d5](https://www.github.com/googleapis/nodejs-dialogflow-cx/commit/2ce89d5a885f73bb66630f2ba1e5ad79b7c40730)) ### Bug Fixes * **deps:** require google-gax v2.12.0 ([#106](https://www.github.com/googleapis/nodejs-dialogflow-cx/issues/106)) ([2c333d7](https://www.github.com/googleapis/nodejs-dialogflow-cx/commit/2c333d73df45ff13b0a2a85332bbcb23be2e7d41)) * use require() to load JSON protos ([#112](https://www.github.com/googleapis/nodejs-dialogflow-cx/issues/112)) ([d0cf055](https://www.github.com/googleapis/nodejs-dialogflow-cx/commit/d0cf055738496681fa351a9228f2a788b4132910)) --- This PR was generated with [Release Please](https://github.com/googleapis/release-please). See [documentation](https://github.com/googleapis/release-please#release-please). * chore: release 2.8.0 (#121) Co-authored-by: release-please[bot] <55107282+release-please[bot]@users.noreply.github.com> * chore: release 2.8.1 (#128) :robot: I have created a release \*beep\* \*boop\* --- ### [2.8.1](https://www.github.com/googleapis/nodejs-dialogflow-cx/compare/v2.8.0...v2.8.1) (2021-06-10) ### Bug Fixes * GoogleAdsError missing using generator version after 1.3.0 ([#122](https://www.github.com/googleapis/nodejs-dialogflow-cx/issues/122)) ([af8ca45](https://www.github.com/googleapis/nodejs-dialogflow-cx/commit/af8ca45c8d70264899bb458f68d6b5c0060229fa)) --- This PR was generated with [Release Please](https://github.com/googleapis/release-please). See [documentation](https://github.com/googleapis/release-please#release-please). * chore: release 2.9.0 (#135) :robot: I have created a release \*beep\* \*boop\* --- ## [2.9.0](https://www.github.com/googleapis/nodejs-dialogflow-cx/compare/v2.8.1...v2.9.0) (2021-06-14) ### Features * added API for running continuous test ([#123](https://www.github.com/googleapis/nodejs-dialogflow-cx/issues/123)) ([248ae74](https://www.github.com/googleapis/nodejs-dialogflow-cx/commit/248ae742e786dd24f8a0e8161a1a30f684c3b7ff)) --- This PR was generated with [Release Please](https://github.com/googleapis/release-please). See [documentation](https://github.com/googleapis/release-please#release-please). * chore: release 2.10.0 (#136) :robot: I have created a release \*beep\* \*boop\* --- ## [2.10.0](https://www.github.com/googleapis/nodejs-dialogflow-cx/compare/v2.9.0...v2.10.0) (2021-06-17) ### Features * **v3:** support sentiment analysis in bot testing ([#125](https://www.github.com/googleapis/nodejs-dialogflow-cx/issues/125)) ([d6d7684](https://www.github.com/googleapis/nodejs-dialogflow-cx/commit/d6d7684692ec3790ec5a4284cb206a4c26f4a1ab)) --- This PR was generated with [Release Please](https://github.com/googleapis/release-please). See [documentation](https://github.com/googleapis/release-please#release-please). * chore: release 2.11.0 (#137) :robot: I have created a release \*beep\* \*boop\* --- ## [2.11.0](https://www.github.com/googleapis/nodejs-dialogflow-cx/compare/v2.10.0...v2.11.0) (2021-06-21) ### Features * **v3beta1:** Support partial response feature ([ee8a24a](https://www.github.com/googleapis/nodejs-dialogflow-cx/commit/ee8a24a1e47cb352198880490f047e2ff3d47152)) * **v3beta1:** support sentiment analysis in bot testing ([#127](https://www.github.com/googleapis/nodejs-dialogflow-cx/issues/127)) ([2c45b2c](https://www.github.com/googleapis/nodejs-dialogflow-cx/commit/2c45b2c4e9662aaef7352f3b3edf58c0bf29779e)) ### Bug Fixes * **v3beta1:** set agent default language code as required ([#134](https://www.github.com/googleapis/nodejs-dialogflow-cx/issues/134)) ([ee8a24a](https://www.github.com/googleapis/nodejs-dialogflow-cx/commit/ee8a24a1e47cb352198880490f047e2ff3d47152)) --- This PR was generated with [Release Please](https://github.com/googleapis/release-please). See [documentation](https://github.com/googleapis/release-please#release-please). * chore: release 2.12.0 (#143) :robot: I have created a release \*beep\* \*boop\* --- ## [2.12.0](https://www.github.com/googleapis/nodejs-dialogflow-cx/compare/v2.11.0...v2.12.0) (2021-06-30) ### Features * mark agent.default_language_code as required feat: add return_partial response to Fulfillment docs: add notes to train agent before sending queries ([#140](https://www.github.com/googleapis/nodejs-dialogflow-cx/issues/140)) ([eae8f44](https://www.github.com/googleapis/nodejs-dialogflow-cx/commit/eae8f4409cf5832c5fd28e2e676847a4722997b9)) ### Bug Fixes * **deps:** google-gax v2.17.0 with mTLS ([#145](https://www.github.com/googleapis/nodejs-dialogflow-cx/issues/145)) ([d5f2918](https://www.github.com/googleapis/nodejs-dialogflow-cx/commit/d5f291886d1418ad43684d3db7b0a2d12cd8c219)) * make request optional in all cases ([#139](https://www.github.com/googleapis/nodejs-dialogflow-cx/issues/139)) ([ad950f0](https://www.github.com/googleapis/nodejs-dialogflow-cx/commit/ad950f057f413b9c094b6d23a21ada0d64887206)) --- This PR was generated with [Release Please](https://github.com/googleapis/release-please). See [documentation](https://github.com/googleapis/release-please#release-please). * chore: release 2.12.1 (#149) :robot: I have created a release \*beep\* \*boop\* --- ### [2.12.1](https://www.github.com/googleapis/nodejs-dialogflow-cx/compare/v2.12.0...v2.12.1) (2021-07-21) ### Bug Fixes * **deps:** google-gax v2.17.1 ([#148](https://www.github.com/googleapis/nodejs-dialogflow-cx/issues/148)) ([5e1ec0a](https://www.github.com/googleapis/nodejs-dialogflow-cx/commit/5e1ec0a77db21c219531800d2c54c5edd4f54fba)) * Updating WORKSPACE files to use the newest version of the Typescript generator. ([#150](https://www.github.com/googleapis/nodejs-dialogflow-cx/issues/150)) ([8974183](https://www.github.com/googleapis/nodejs-dialogflow-cx/commit/8974183edd156e9adb9e9d11557931bda03c1d3c)) --- This PR was generated with [Release Please](https://github.com/googleapis/release-please). See [documentation](https://github.com/googleapis/release-please#release-please). * docs: add create agent code sample (#163) * chore: release 2.13.0 (#157) :robot: I have created a release \*beep\* \*boop\* --- ## [2.13.0](https://www.github.com/googleapis/nodejs-dialogflow-cx/compare/v2.12.1...v2.13.0) (2021-08-17) ### Features * add advanced settings for agent level feat: add rollout config, state and failure reason for experiment feat: add insights export settings for security setting feat: add language code for streaming recognition result and flow versions for query p... ([#156](https://www.github.com/googleapis/nodejs-dialogflow-cx/issues/156)) ([80d2f94](https://www.github.com/googleapis/nodejs-dialogflow-cx/commit/80d2f94bcfaa65ea442ee4f8133d850035be04ed)) * added support for DLP templates; expose `Locations` service to get/list avaliable locations of Dialogflow products ([#162](https://www.github.com/googleapis/nodejs-dialogflow-cx/issues/162)) ([b77bde9](https://www.github.com/googleapis/nodejs-dialogflow-cx/commit/b77bde9893cde0c9e766b8e844fa4cca61efb5aa)) ### Bug Fixes * **build:** migrate to using main branch ([#164](https://www.github.com/googleapis/nodejs-dialogflow-cx/issues/164)) ([092d69d](https://www.github.com/googleapis/nodejs-dialogflow-cx/commit/092d69d76716297aff6a671200088d5740b1fd47)) * **deps:** google-gax v2.24.1 ([#165](https://www.github.com/googleapis/nodejs-dialogflow-cx/issues/165)) ([6261c37](https://www.github.com/googleapis/nodejs-dialogflow-cx/commit/6261c37019b3ce94a9876bfa4634837132691888)) --- This PR was generated with [Release Please](https://github.com/googleapis/release-please). See [documentation](https://github.com/googleapis/release-please#release-please). * docs: add update intent sample (#160) * add sample * Fixed lint * lint fix * fix lint * lint fix * 🦉 Updates from OwlBot See https://github.com/googleapis/repo-automation-bots/blob/main/packages/owl-bot/README.md * added broken link * 🦉 Updates from OwlBot See https://github.com/googleapis/repo-automation-bots/blob/main/packages/owl-bot/README.md * added broken link to skip * Revised come from feedback * Fixed lint and added async * Fixed getProjectID call * Reverted cmd change * Fixing assert since match breaks testing * added match back * added async * reverted to include because match produces error * removed displayName Print * Revised Code * Lint Fix * Removed Debug * Updated Intent Path * lint fix * Added Field comments * added function to main * lint fix * lint fix Co-authored-by: Owl Bot Co-authored-by: Benjamin E. Coe * docs: add page management code samples (#174) * samples: fixed using wrong variable naming (#182) * chore: release 2.14.0 (#168) Co-authored-by: release-please[bot] <55107282+release-please[bot]@users.noreply.github.com> Co-authored-by: Justin Beckwith * docs: add filter code sample (#179) * docs: added voice selection (#193) Thank you for opening a Pull Request! Before submitting your PR, there are a few things you can do to make sure it goes smoothly: - [ ] Make sure to open an issue as a [bug/issue](https://github.com/googleapis/nodejs-dialogflow-cx/issues/new/choose) before writing your code! That way we can discuss the change, evaluate designs, and agree on the general idea - [ ] Ensure the tests and linter pass - [ ] Code coverage does not decrease (if any source code was changed) - [ ] Appropriate docs were updated (if necessary) Fixes # 🦕 * docs(samples): addes new training phrases sample (#195) * docs: add webhook code sample (#177) * docs: add webhook code sample * update json data * fixed failing test * fixed test naming * converted response to string * removed convert to str * moved response object * lint fix * 🦉 Updates from OwlBot See https://github.com/googleapis/repo-automation-bots/blob/main/packages/owl-bot/README.md * Added link to linkinator * update test * revised code * lint fix * lint fix Co-authored-by: Owl Bot Co-authored-by: Justin Beckwith * docs: added comment (#204) * docs(samples): add LRO code snippets (#209) * docs(samples): add LRO code snippets * lint fix * lint fix * lint fix * 🦉 Updates from OwlBot See https://github.com/googleapis/repo-automation-bots/blob/main/packages/owl-bot/README.md Co-authored-by: Owl Bot * docs: `exports.` removed from the cloud function's entry point (#244) Cloud function's entry point shouldn't be prefixed with `exports.`. Co-authored-by: Gal Zahavi <38544478+galz10@users.noreply.github.com> * feat: add Webhook samples (#259) * add webhook-configure-session-parameter-enable-agent-response sample and test Change-Id: Ia8593160ed33060eb497a15723b21c1221ce55c9 * add webhook-configure-session-parameter-trigger-transition sample and test Change-Id: I118abb59182879b6969018da97d04eea0b8daeb0 * add webhook-configure-optional-or-required-form-parameters sample and test Change-Id: I7cbfeb11cece7ccf873dbc7a6dd7cff9ae264ffe * add configure-session-parameters sample and test Change-Id: Ib9f1a110473751508b50259c4696593580c64a91 * fix form parameter path Change-Id: I6411000a7d0240d7552d725c2fd1049be781a9ab * add webhook-validate-form-parameter sample and test Change-Id: I82097be3fc3f91651c88b99c7431ebb602c42c66 * add cx to region tag Change-Id: I6640604512c27a341ab8e26238bf8c3fbd1e77ef * 🦉 Updates from OwlBot post-processor See https://github.com/googleapis/repo-automation-bots/blob/main/packages/owl-bot/README.md * 🦉 Updates from OwlBot post-processor See https://github.com/googleapis/repo-automation-bots/blob/main/packages/owl-bot/README.md * fix test Change-Id: Icc70e18b40d8684c7909e8383b4c226fa94a162b * fix region tag Change-Id: I0fe3849c0eaf12eaf247088993898cbb47dace44 Co-authored-by: Owl Bot * docs(samples): Add detectIntent samples (#263) * add webhook-configure-session-parameter-enable-agent-response sample and test Change-Id: Ia8593160ed33060eb497a15723b21c1221ce55c9 * add webhook-configure-session-parameter-trigger-transition sample and test Change-Id: I118abb59182879b6969018da97d04eea0b8daeb0 * add webhook-configure-optional-or-required-form-parameters sample and test Change-Id: I7cbfeb11cece7ccf873dbc7a6dd7cff9ae264ffe * add configure-session-parameters sample and test Change-Id: Ib9f1a110473751508b50259c4696593580c64a91 * fix form parameter path Change-Id: I6411000a7d0240d7552d725c2fd1049be781a9ab * add webhook-validate-form-parameter sample and test Change-Id: I82097be3fc3f91651c88b99c7431ebb602c42c66 * add cx to region tag Change-Id: I6640604512c27a341ab8e26238bf8c3fbd1e77ef * 🦉 Updates from OwlBot post-processor See https://github.com/googleapis/repo-automation-bots/blob/main/packages/owl-bot/README.md * 🦉 Updates from OwlBot post-processor See https://github.com/googleapis/repo-automation-bots/blob/main/packages/owl-bot/README.md * fix test Change-Id: Icc70e18b40d8684c7909e8383b4c226fa94a162b * fix region tag Change-Id: I0fe3849c0eaf12eaf247088993898cbb47dace44 * add detect intent with sentiment analysis sample and test Change-Id: I99aa3985c64b6c80ec1a85591b1e49f381c379de * punctuation Change-Id: I2fe6f929f4c786595b4bbc4fbe422f2370d3adf0 * add detect intent with eventInput sample and test Change-Id: I32a5b04e975b8e1a4c7d92b328d3bdd1e1c70448 * fix region tag Change-Id: I3795770f8ef68e154f36057ca9aa1bbb2ad8075f * add detect intent with IntentInput sample and test Change-Id: Iea12505b745ea8ea3995fdca2381f6e4bf60d051 * add detect intent synthesize tts response sample and test Change-Id: Ie7d22212f6f8107a36f555e771ff409c2d1f0bf0 * add resource output file Change-Id: I3f0f78d5dbb30a0c50ecad3996332cbd6ff0b7b5 * fix formatting Change-Id: Ia651757249955d18613f844734674f1eea49ed82 * 🦉 Updates from OwlBot post-processor See https://github.com/googleapis/repo-automation-bots/blob/main/packages/owl-bot/README.md * fix test agent Change-Id: Ib75ccf20985dcfae3130619f69c5fd546b24ca1d * fix test Change-Id: I1423fdb6916fa50fe0f21481fb1964e08ab62080 * change function names Change-Id: Iaa02c248807b72fcff4f07b46f0f70fddf9d6e7a * change test Change-Id: If5ea5d044f040cdb0f3b121af5af960322a1cf5a * change test Change-Id: I9a6b457d1739b2f51de86b77d75d9d0ce2973b04 * change test Change-Id: I92f20ec34c132448a0375d0c88f64b705eb216f5 Co-authored-by: Owl Bot * docs(samples) - streamliine and clarify webhook samples (#264) * streamline and clarify webhook samples Change-Id: I80d80b42f60ac6ccc643afb7b2931916d6843813 * remove sessionInfo config Change-Id: I1b14852ad9e238e7cdc04dbb418ed5ed0fca2992 * 🦉 Updates from OwlBot post-processor See https://github.com/googleapis/repo-automation-bots/blob/main/packages/owl-bot/README.md Co-authored-by: Owl Bot * docs(samples): hardcode parameter in webhook sample (#268) * streamline and clarify webhook samples Change-Id: I80d80b42f60ac6ccc643afb7b2931916d6843813 * remove sessionInfo config Change-Id: I1b14852ad9e238e7cdc04dbb418ed5ed0fca2992 * 🦉 Updates from OwlBot post-processor See https://github.com/googleapis/repo-automation-bots/blob/main/packages/owl-bot/README.md * hardcode parameter Change-Id: Iea962f2ea2bf73ca86ce3ecd7852a290dd3a2fac * clarify parameter name Change-Id: I5c0a1c654be5133889f4838a118e5bdebe667303 Co-authored-by: Owl Bot * docs(samples): replace agent ids (#271) * add webhook-configure-session-parameter-enable-agent-response sample and test Change-Id: Ia8593160ed33060eb497a15723b21c1221ce55c9 * add webhook-configure-session-parameter-trigger-transition sample and test Change-Id: I118abb59182879b6969018da97d04eea0b8daeb0 * add webhook-configure-optional-or-required-form-parameters sample and test Change-Id: I7cbfeb11cece7ccf873dbc7a6dd7cff9ae264ffe * add configure-session-parameters sample and test Change-Id: Ib9f1a110473751508b50259c4696593580c64a91 * fix form parameter path Change-Id: I6411000a7d0240d7552d725c2fd1049be781a9ab * add webhook-validate-form-parameter sample and test Change-Id: I82097be3fc3f91651c88b99c7431ebb602c42c66 * add cx to region tag Change-Id: I6640604512c27a341ab8e26238bf8c3fbd1e77ef * 🦉 Updates from OwlBot post-processor See https://github.com/googleapis/repo-automation-bots/blob/main/packages/owl-bot/README.md * 🦉 Updates from OwlBot post-processor See https://github.com/googleapis/repo-automation-bots/blob/main/packages/owl-bot/README.md * fix test Change-Id: Icc70e18b40d8684c7909e8383b4c226fa94a162b * fix region tag Change-Id: I0fe3849c0eaf12eaf247088993898cbb47dace44 * add detect intent with sentiment analysis sample and test Change-Id: I99aa3985c64b6c80ec1a85591b1e49f381c379de * punctuation Change-Id: I2fe6f929f4c786595b4bbc4fbe422f2370d3adf0 * add detect intent with eventInput sample and test Change-Id: I32a5b04e975b8e1a4c7d92b328d3bdd1e1c70448 * fix region tag Change-Id: I3795770f8ef68e154f36057ca9aa1bbb2ad8075f * add detect intent with IntentInput sample and test Change-Id: Iea12505b745ea8ea3995fdca2381f6e4bf60d051 * add detect intent synthesize tts response sample and test Change-Id: Ie7d22212f6f8107a36f555e771ff409c2d1f0bf0 * add resource output file Change-Id: I3f0f78d5dbb30a0c50ecad3996332cbd6ff0b7b5 * fix formatting Change-Id: Ia651757249955d18613f844734674f1eea49ed82 * 🦉 Updates from OwlBot post-processor See https://github.com/googleapis/repo-automation-bots/blob/main/packages/owl-bot/README.md * fix test agent Change-Id: Ib75ccf20985dcfae3130619f69c5fd546b24ca1d * fix test Change-Id: I1423fdb6916fa50fe0f21481fb1964e08ab62080 * change function names Change-Id: Iaa02c248807b72fcff4f07b46f0f70fddf9d6e7a * change test Change-Id: If5ea5d044f040cdb0f3b121af5af960322a1cf5a * change test Change-Id: I9a6b457d1739b2f51de86b77d75d9d0ce2973b04 * change test Change-Id: I92f20ec34c132448a0375d0c88f64b705eb216f5 * replace agent ids and add deleteAgent logic Change-Id: Ibf7504b92e5beb7193bf9b685f4540493dc37ff6 * fix test Change-Id: Ic5153f8f3f09645eb60b50124fb4961887c59fa4 Co-authored-by: Owl Bot * build!: update library to use Node 12 (#288) * feat!: Update library to use Node 12 * 🦉 Updates from OwlBot post-processor See https://github.com/googleapis/repo-automation-bots/blob/main/packages/owl-bot/README.md Co-authored-by: Owl Bot * docs(samples): refactor webhook samples (#270) * streamline and clarify webhook samples Change-Id: I80d80b42f60ac6ccc643afb7b2931916d6843813 * remove sessionInfo config Change-Id: I1b14852ad9e238e7cdc04dbb418ed5ed0fca2992 * 🦉 Updates from OwlBot post-processor See https://github.com/googleapis/repo-automation-bots/blob/main/packages/owl-bot/README.md * hardcode parameter Change-Id: Iea962f2ea2bf73ca86ce3ecd7852a290dd3a2fac * clarify parameter name Change-Id: I5c0a1c654be5133889f4838a118e5bdebe667303 * refactor configure-session-parameter-enable-agent-response sample Change-Id: I62af853767f9097e3448f60060f739ac8bb018b2 * refactor webhook samples Change-Id: I07f2addae8b452d89124d123e3c2be8042ee0292 * remove unnecessary samples Change-Id: Ia936ce14eafb9d44a67a314eb282fb93b5c96319 * change form parameter test Change-Id: Ia7aeb8117f6db4bee2111bdb5bcf6461b2700601 * change sample description Change-Id: I842e1e0bca1eec43d5437cd37575a43b48105bed * 🦉 Updates from OwlBot post-processor See https://github.com/googleapis/repo-automation-bots/blob/main/packages/owl-bot/README.md Co-authored-by: Owl Bot * docs (samples): add detect intent samples (#292) * add webhook-configure-session-parameter-enable-agent-response sample and test Change-Id: Ia8593160ed33060eb497a15723b21c1221ce55c9 * add webhook-configure-session-parameter-trigger-transition sample and test Change-Id: I118abb59182879b6969018da97d04eea0b8daeb0 * add webhook-configure-optional-or-required-form-parameters sample and test Change-Id: I7cbfeb11cece7ccf873dbc7a6dd7cff9ae264ffe * add configure-session-parameters sample and test Change-Id: Ib9f1a110473751508b50259c4696593580c64a91 * fix form parameter path Change-Id: I6411000a7d0240d7552d725c2fd1049be781a9ab * add webhook-validate-form-parameter sample and test Change-Id: I82097be3fc3f91651c88b99c7431ebb602c42c66 * add cx to region tag Change-Id: I6640604512c27a341ab8e26238bf8c3fbd1e77ef * 🦉 Updates from OwlBot post-processor See https://github.com/googleapis/repo-automation-bots/blob/main/packages/owl-bot/README.md * 🦉 Updates from OwlBot post-processor See https://github.com/googleapis/repo-automation-bots/blob/main/packages/owl-bot/README.md * fix test Change-Id: Icc70e18b40d8684c7909e8383b4c226fa94a162b * fix region tag Change-Id: I0fe3849c0eaf12eaf247088993898cbb47dace44 * add detect intent with sentiment analysis sample and test Change-Id: I99aa3985c64b6c80ec1a85591b1e49f381c379de * punctuation Change-Id: I2fe6f929f4c786595b4bbc4fbe422f2370d3adf0 * add detect intent with eventInput sample and test Change-Id: I32a5b04e975b8e1a4c7d92b328d3bdd1e1c70448 * fix region tag Change-Id: I3795770f8ef68e154f36057ca9aa1bbb2ad8075f * add detect intent with IntentInput sample and test Change-Id: Iea12505b745ea8ea3995fdca2381f6e4bf60d051 * add detect intent synthesize tts response sample and test Change-Id: Ie7d22212f6f8107a36f555e771ff409c2d1f0bf0 * add resource output file Change-Id: I3f0f78d5dbb30a0c50ecad3996332cbd6ff0b7b5 * fix formatting Change-Id: Ia651757249955d18613f844734674f1eea49ed82 * 🦉 Updates from OwlBot post-processor See https://github.com/googleapis/repo-automation-bots/blob/main/packages/owl-bot/README.md * fix test agent Change-Id: Ib75ccf20985dcfae3130619f69c5fd546b24ca1d * fix test Change-Id: I1423fdb6916fa50fe0f21481fb1964e08ab62080 * change function names Change-Id: Iaa02c248807b72fcff4f07b46f0f70fddf9d6e7a * change test Change-Id: If5ea5d044f040cdb0f3b121af5af960322a1cf5a * change test Change-Id: I9a6b457d1739b2f51de86b77d75d9d0ce2973b04 * change test Change-Id: I92f20ec34c132448a0375d0c88f64b705eb216f5 * replace agent ids and add deleteAgent logic Change-Id: Ibf7504b92e5beb7193bf9b685f4540493dc37ff6 * fix test Change-Id: Ic5153f8f3f09645eb60b50124fb4961887c59fa4 * add detect intent with disabled webhook sample and test Change-Id: I1c565063d4e749029b872009722106222ca28b3d * remove unnecessary comment Change-Id: I3f56e80f4d2f7df3a1aa863d7b4e3f120ecce7a3 * 🦉 Updates from OwlBot post-processor See https://github.com/googleapis/repo-automation-bots/blob/main/packages/owl-bot/README.md * update test Change-Id: Ie37488c281b513a592832836df8fbe4da60f95fb * add streamingDetectIntent with partial response enabled sample and test Change-Id: I499e395658d8c8b0e6f7f2229bb70d1969b25b9b * 🦉 Updates from OwlBot post-processor See https://github.com/googleapis/repo-automation-bots/blob/main/packages/owl-bot/README.md * clean up extra comments and test lines Change-Id: I28179e19fb1b567e743a399c2525b2d517ef1a1b * clean up comments Change-Id: I6182825f1d5205c0da284dbe27e9a044c0283dda * update year Change-Id: Idd732f365062f23a76a31fd3caf66cedd91813bb Co-authored-by: Owl Bot * chore(main): release 3.0.0 (#269) :robot: I have created a release *beep* *boop* --- ## [3.0.0](https://github.com/googleapis/nodejs-dialogflow-cx/compare/v2.15.0...v3.0.0) (2022-06-23) ### ⚠ BREAKING CHANGES * update library to use Node 12 (#288) ### Features * add Webhook samples ([#259](https://github.com/googleapis/nodejs-dialogflow-cx/issues/259)) ([709dc6d](https://github.com/googleapis/nodejs-dialogflow-cx/commit/709dc6d88d768a9b553187787e9fb3808be8d991)) * added audio_export_settings ([#257](https://github.com/googleapis/nodejs-dialogflow-cx/issues/257)) ([39f1d1c](https://github.com/googleapis/nodejs-dialogflow-cx/commit/39f1d1ced3401e7cfa72f1448745d424837d42f2)) * added data format specification for export agent ([361e7d9](https://github.com/googleapis/nodejs-dialogflow-cx/commit/361e7d9d1f596a6280f07a1ce20456195a943d7a)) * added data format specification for export agent ([361e7d9](https://github.com/googleapis/nodejs-dialogflow-cx/commit/361e7d9d1f596a6280f07a1ce20456195a943d7a)) * added page in TestConfig ([7adaf67](https://github.com/googleapis/nodejs-dialogflow-cx/commit/7adaf6735cbef19d38e1288fd40ea27cf595b20f)) * added page in TestConfig ([#239](https://github.com/googleapis/nodejs-dialogflow-cx/issues/239)) ([283c389](https://github.com/googleapis/nodejs-dialogflow-cx/commit/283c389cc220b9f192f15822ef2d1e38f35d6103)) * added support for locking an agent for changes ([361e7d9](https://github.com/googleapis/nodejs-dialogflow-cx/commit/361e7d9d1f596a6280f07a1ce20456195a943d7a)) * added support for locking an agent for changes ([361e7d9](https://github.com/googleapis/nodejs-dialogflow-cx/commit/361e7d9d1f596a6280f07a1ce20456195a943d7a)) ### Build System * update library to use Node 12 ([#288](https://github.com/googleapis/nodejs-dialogflow-cx/issues/288)) ([9a72b32](https://github.com/googleapis/nodejs-dialogflow-cx/commit/9a72b3214b65c59ef6a34471dc93050bd61e846c)) --- This PR was generated with [Release Please](https://github.com/googleapis/release-please). See [documentation](https://github.com/googleapis/release-please#release-please). * chore(main): release 3.1.0 (#299) * chore(main): release 3.1.0 * 🦉 Updates from OwlBot post-processor See https://github.com/googleapis/repo-automation-bots/blob/main/packages/owl-bot/README.md Co-authored-by: release-please[bot] <55107282+release-please[bot]@users.noreply.github.com> Co-authored-by: Owl Bot * fix(deps): update dependency uuid to v9 (#311) [![Mend Renovate](https://app.renovatebot.com/images/banner.svg)](https://renovatebot.com) This PR contains the following updates: | Package | Change | Age | Adoption | Passing | Confidence | |---|---|---|---|---|---| | [uuid](https://togithub.com/uuidjs/uuid) | [`^8.3.1` -> `^9.0.0`](https://renovatebot.com/diffs/npm/uuid/8.3.2/9.0.0) | [![age](https://badges.renovateapi.com/packages/npm/uuid/9.0.0/age-slim)](https://docs.renovatebot.com/merge-confidence/) | [![adoption](https://badges.renovateapi.com/packages/npm/uuid/9.0.0/adoption-slim)](https://docs.renovatebot.com/merge-confidence/) | [![passing](https://badges.renovateapi.com/packages/npm/uuid/9.0.0/compatibility-slim/8.3.2)](https://docs.renovatebot.com/merge-confidence/) | [![confidence](https://badges.renovateapi.com/packages/npm/uuid/9.0.0/confidence-slim/8.3.2)](https://docs.renovatebot.com/merge-confidence/) | --- ### Release Notes
uuidjs/uuid ### [`v9.0.0`](https://togithub.com/uuidjs/uuid/blob/HEAD/CHANGELOG.md#​900-httpsgithubcomuuidjsuuidcomparev832v900-2022-09-05) [Compare Source](https://togithub.com/uuidjs/uuid/compare/v8.3.2...v9.0.0) ##### âš  BREAKING CHANGES - Drop Node.js 10.x support. This library always aims at supporting one EOLed LTS release which by this time now is 12.x which has reached EOL 30 Apr 2022. - Remove the minified UMD build from the package. Minified code is hard to audit and since this is a widely used library it seems more appropriate nowadays to optimize for auditability than to ship a legacy module format that, at best, serves educational purposes nowadays. For production browser use cases, users should be using a bundler. For educational purposes, today's online sandboxes like replit.com offer convenient ways to load npm modules, so the use case for UMD through repos like UNPKG or jsDelivr has largely vanished. - Drop IE 11 and Safari 10 support. Drop support for browsers that don't correctly implement const/let and default arguments, and no longer transpile the browser build to ES2015. This also removes the fallback on msCrypto instead of the crypto API. Browser tests are run in the first supported version of each supported browser and in the latest (as of this commit) version available on Browserstack. ##### Features - optimize uuid.v1 by 1.3x uuid.v4 by 4.3x (430%) ([#​597](https://togithub.com/uuidjs/uuid/issues/597)) ([3a033f6](https://togithub.com/uuidjs/uuid/commit/3a033f6bab6bb3780ece6d645b902548043280bc)) - remove UMD build ([#​645](https://togithub.com/uuidjs/uuid/issues/645)) ([e948a0f](https://togithub.com/uuidjs/uuid/commit/e948a0f22bf22f4619b27bd913885e478e20fe6f)), closes [#​620](https://togithub.com/uuidjs/uuid/issues/620) - use native crypto.randomUUID when available ([#​600](https://togithub.com/uuidjs/uuid/issues/600)) ([c9e076c](https://togithub.com/uuidjs/uuid/commit/c9e076c852edad7e9a06baaa1d148cf4eda6c6c4)) ##### Bug Fixes - add Jest/jsdom compatibility ([#​642](https://togithub.com/uuidjs/uuid/issues/642)) ([16f9c46](https://togithub.com/uuidjs/uuid/commit/16f9c469edf46f0786164cdf4dc980743984a6fd)) - change default export to named function ([#​545](https://togithub.com/uuidjs/uuid/issues/545)) ([c57bc5a](https://togithub.com/uuidjs/uuid/commit/c57bc5a9a0653273aa639cda9177ce52efabe42a)) - handle error when parameter is not set in v3 and v5 ([#​622](https://togithub.com/uuidjs/uuid/issues/622)) ([fcd7388](https://togithub.com/uuidjs/uuid/commit/fcd73881692d9fabb63872576ba28e30ff852091)) - run npm audit fix ([#​644](https://togithub.com/uuidjs/uuid/issues/644)) ([04686f5](https://togithub.com/uuidjs/uuid/commit/04686f54c5fed2cfffc1b619f4970c4bb8532353)) - upgrading from uuid3 broken link ([#​568](https://togithub.com/uuidjs/uuid/issues/568)) ([1c849da](https://togithub.com/uuidjs/uuid/commit/1c849da6e164259e72e18636726345b13a7eddd6)) ##### build - drop Node.js 8.x from babel transpile target ([#​603](https://togithub.com/uuidjs/uuid/issues/603)) ([aa11485](https://togithub.com/uuidjs/uuid/commit/aa114858260402107ec8a1e1a825dea0a259bcb5)) - drop support for legacy browsers (IE11, Safari 10) ([#​604](https://togithub.com/uuidjs/uuid/issues/604)) ([0f433e5](https://togithub.com/uuidjs/uuid/commit/0f433e5ec444edacd53016de67db021102f36148)) - drop node 10.x to upgrade dev dependencies ([#​653](https://togithub.com/uuidjs/uuid/issues/653)) ([28a5712](https://togithub.com/uuidjs/uuid/commit/28a571283f8abda6b9d85e689f95b7d3ee9e282e)), closes [#​643](https://togithub.com/uuidjs/uuid/issues/643) ##### [8.3.2](https://togithub.com/uuidjs/uuid/compare/v8.3.1...v8.3.2) (2020-12-08) ##### Bug Fixes - lazy load getRandomValues ([#​537](https://togithub.com/uuidjs/uuid/issues/537)) ([16c8f6d](https://togithub.com/uuidjs/uuid/commit/16c8f6df2f6b09b4d6235602d6a591188320a82e)), closes [#​536](https://togithub.com/uuidjs/uuid/issues/536) ##### [8.3.1](https://togithub.com/uuidjs/uuid/compare/v8.3.0...v8.3.1) (2020-10-04) ##### Bug Fixes - support expo>=39.0.0 ([#​515](https://togithub.com/uuidjs/uuid/issues/515)) ([c65a0f3](https://togithub.com/uuidjs/uuid/commit/c65a0f3fa73b901959d638d1e3591dfacdbed867)), closes [#​375](https://togithub.com/uuidjs/uuid/issues/375)
--- ### Configuration 📅 **Schedule**: Branch creation - "after 9am and before 3pm" (UTC), Automerge - At any time (no schedule defined). 🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied. ♻ **Rebasing**: Whenever PR is behind base branch, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] If you want to rebase/retry this PR, click this checkbox. --- This PR has been generated by [Mend Renovate](https://www.mend.io/free-developer-tools/renovate/). View repository job log [here](https://app.renovatebot.com/dashboard#github/googleapis/nodejs-dialogflow-cx). * chore(main): release 3.1.1 (#307) :robot: I have created a release *beep* *boop* --- ## [3.1.1](https://github.com/googleapis/nodejs-dialogflow-cx/compare/v3.1.0...v3.1.1) (2022-09-14) ### Bug Fixes * Allow passing gax instance to client constructor ([#310](https://github.com/googleapis/nodejs-dialogflow-cx/issues/310)) ([5eb33cd](https://github.com/googleapis/nodejs-dialogflow-cx/commit/5eb33cd1e3ace81e70a844b870d9fc102ec73a3e)) * Better support for fallback mode ([#305](https://github.com/googleapis/nodejs-dialogflow-cx/issues/305)) ([f63bcf2](https://github.com/googleapis/nodejs-dialogflow-cx/commit/f63bcf25e3354b00d4a428cad0a082134642b661)) * Change import long to require ([#306](https://github.com/googleapis/nodejs-dialogflow-cx/issues/306)) ([343bc0e](https://github.com/googleapis/nodejs-dialogflow-cx/commit/343bc0efe2ee44888c706f3f377399df3fef13af)) * **deps:** Update dependency uuid to v9 ([#311](https://github.com/googleapis/nodejs-dialogflow-cx/issues/311)) ([f7ba638](https://github.com/googleapis/nodejs-dialogflow-cx/commit/f7ba63867b32a4435f089584c08c5721eec428a7)) * Do not import the whole google-gax from proto JS ([#1553](https://github.com/googleapis/nodejs-dialogflow-cx/issues/1553)) ([#309](https://github.com/googleapis/nodejs-dialogflow-cx/issues/309)) ([844c8f7](https://github.com/googleapis/nodejs-dialogflow-cx/commit/844c8f71bf36ed7829542c3f5ff552baee17811a)) * Preserve default values in x-goog-request-params header ([#312](https://github.com/googleapis/nodejs-dialogflow-cx/issues/312)) ([239d018](https://github.com/googleapis/nodejs-dialogflow-cx/commit/239d0185f5897109914543c96116cc35574fd2af)) * Remove pip install statements ([#1546](https://github.com/googleapis/nodejs-dialogflow-cx/issues/1546)) ([#308](https://github.com/googleapis/nodejs-dialogflow-cx/issues/308)) ([7363dfe](https://github.com/googleapis/nodejs-dialogflow-cx/commit/7363dfe3bf9ba7431871a7a9ecbff68024a37191)) * use google-gax v3.3.0 ([844c8f7](https://github.com/googleapis/nodejs-dialogflow-cx/commit/844c8f71bf36ed7829542c3f5ff552baee17811a)) --- This PR was generated with [Release Please](https://github.com/googleapis/release-please). See [documentation](https://github.com/googleapis/release-please#release-please). * chore(main): release 3.1.2 (#322) :robot: I have created a release *beep* *boop* --- ## [3.1.2](https://togithub.com/googleapis/nodejs-dialogflow-cx/compare/v3.1.1...v3.1.2) (2022-11-11) ### Bug Fixes * **deps:** Use google-gax v3.5.2 ([#320](https://togithub.com/googleapis/nodejs-dialogflow-cx/issues/320)) ([516e59d](https://togithub.com/googleapis/nodejs-dialogflow-cx/commit/516e59d6f6a4a9e16ed635900bd89d6c3a73ee10)) * Regenerated protos JS and TS definitions ([#324](https://togithub.com/googleapis/nodejs-dialogflow-cx/issues/324)) ([c82e46a](https://togithub.com/googleapis/nodejs-dialogflow-cx/commit/c82e46a74aa30862e999ae37f16508f241792493)) --- This PR was generated with [Release Please](https://togithub.com/googleapis/release-please). See [documentation](https://togithub.com/googleapis/release-please#release-please). * Add workflows config * Delete test for unused sample * Add secrets Add missing env vars * Allow specifying agent project ID via env var * Lint Co-authored-by: Benjamin E. Coe Co-authored-by: release-please[bot] <55107282+release-please[bot]@users.noreply.github.com> Co-authored-by: WEI, Yunchen Co-authored-by: WEI, Yunchen Co-authored-by: Gal Zahavi <38544478+galz10@users.noreply.github.com> Co-authored-by: Owl Bot Co-authored-by: Justin Beckwith Co-authored-by: Franklin Nunez <69214580+b-loved-dreamer@users.noreply.github.com> Co-authored-by: Alexander Prikhodko Co-authored-by: aribray <45905583+aribray@users.noreply.github.com> Co-authored-by: Alexander Fenster Co-authored-by: WhiteSource Renovate --- .github/workflows/dialogflow-cx.yaml | 76 ++++++++++ .github/workflows/workflows.json | 1 + ...-form-parameter-as-optional-or-required.js | 48 +++++++ dialogflow-cx/create-agent.js | 56 ++++++++ dialogflow-cx/create-page.js | 51 +++++++ dialogflow-cx/delete-page.js | 48 +++++++ dialogflow-cx/detect-intent-audio.js | 102 ++++++++++++++ .../detect-intent-disabled-webhook.js | 75 ++++++++++ dialogflow-cx/detect-intent-event.js | 102 ++++++++++++++ dialogflow-cx/detect-intent-streaming.js | 133 ++++++++++++++++++ .../detect-intent-synthesize-tts-response.js | 105 ++++++++++++++ dialogflow-cx/detect-intent-text.js | 78 ++++++++++ .../detect-intent-with-intent-input.js | 108 ++++++++++++++ .../detect-intent-with-sentiment-analysis.js | 120 ++++++++++++++++ dialogflow-cx/list-intents.js | 60 ++++++++ dialogflow-cx/list-page.js | 47 +++++++ dialogflow-cx/list-testcase-results.js | 49 +++++++ dialogflow-cx/long-running-operation.js | 54 +++++++ dialogflow-cx/package.json | 24 ++++ dialogflow-cx/quickstart.js | 104 ++++++++++++++ dialogflow-cx/resources/book_a_room.wav | Bin 0 -> 31058 bytes dialogflow-cx/resources/output.wav | Bin 0 -> 197458 bytes ...treaming-detect-intent-partial-response.js | 116 +++++++++++++++ ...-form-parameter-as-optional-or-required.js | 68 +++++++++ dialogflow-cx/test/create-agent.test.js | 32 +++++ .../test/detect-intent-audio.test.js | 40 ++++++ .../detect-intent-disabled-webhook-test.js | 36 +++++ .../test/detect-intent-event-test.js | 38 +++++ .../detect-intent-sentiment-analysis-test.js | 50 +++++++ ...ect-intent-synthesize-tts-response-test.js | 40 ++++++ dialogflow-cx/test/detect-intent-text.test.js | 43 ++++++ .../detect-intent-with-intent-input-test.js | 38 +++++ dialogflow-cx/test/list-intents.test.js | 34 +++++ .../test/list_testcase-results.test.js | 36 +++++ .../test/long-running-operation.test.js | 62 ++++++++ dialogflow-cx/test/page-management.test.js | 74 ++++++++++ dialogflow-cx/test/quickstart.js | 44 ++++++ ...ing-detect-intent-partial-response-test.js | 39 +++++ dialogflow-cx/test/update-intent.test.js | 76 ++++++++++ ...bhook-configure-session-parameters-test.js | 58 ++++++++ .../webhook-validate-form-parameter-test.js | 58 ++++++++ dialogflow-cx/test/webhook.test.js | 45 ++++++ dialogflow-cx/update-intent.js | 65 +++++++++ .../webhook-configure-session-parameters.js | 35 +++++ .../webhook-validate-form-parameter.js | 48 +++++++ dialogflow-cx/webhooks.js | 46 ++++++ 46 files changed, 2662 insertions(+) create mode 100644 .github/workflows/dialogflow-cx.yaml create mode 100644 dialogflow-cx/configure-webhook-to-set-form-parameter-as-optional-or-required.js create mode 100644 dialogflow-cx/create-agent.js create mode 100644 dialogflow-cx/create-page.js create mode 100644 dialogflow-cx/delete-page.js create mode 100644 dialogflow-cx/detect-intent-audio.js create mode 100644 dialogflow-cx/detect-intent-disabled-webhook.js create mode 100644 dialogflow-cx/detect-intent-event.js create mode 100644 dialogflow-cx/detect-intent-streaming.js create mode 100644 dialogflow-cx/detect-intent-synthesize-tts-response.js create mode 100644 dialogflow-cx/detect-intent-text.js create mode 100644 dialogflow-cx/detect-intent-with-intent-input.js create mode 100644 dialogflow-cx/detect-intent-with-sentiment-analysis.js create mode 100644 dialogflow-cx/list-intents.js create mode 100644 dialogflow-cx/list-page.js create mode 100644 dialogflow-cx/list-testcase-results.js create mode 100644 dialogflow-cx/long-running-operation.js create mode 100644 dialogflow-cx/package.json create mode 100644 dialogflow-cx/quickstart.js create mode 100644 dialogflow-cx/resources/book_a_room.wav create mode 100644 dialogflow-cx/resources/output.wav create mode 100644 dialogflow-cx/streaming-detect-intent-partial-response.js create mode 100644 dialogflow-cx/test/configure-webhook-to-set-form-parameter-as-optional-or-required.js create mode 100644 dialogflow-cx/test/create-agent.test.js create mode 100644 dialogflow-cx/test/detect-intent-audio.test.js create mode 100644 dialogflow-cx/test/detect-intent-disabled-webhook-test.js create mode 100644 dialogflow-cx/test/detect-intent-event-test.js create mode 100644 dialogflow-cx/test/detect-intent-sentiment-analysis-test.js create mode 100644 dialogflow-cx/test/detect-intent-synthesize-tts-response-test.js create mode 100644 dialogflow-cx/test/detect-intent-text.test.js create mode 100644 dialogflow-cx/test/detect-intent-with-intent-input-test.js create mode 100644 dialogflow-cx/test/list-intents.test.js create mode 100644 dialogflow-cx/test/list_testcase-results.test.js create mode 100644 dialogflow-cx/test/long-running-operation.test.js create mode 100644 dialogflow-cx/test/page-management.test.js create mode 100644 dialogflow-cx/test/quickstart.js create mode 100644 dialogflow-cx/test/streaming-detect-intent-partial-response-test.js create mode 100644 dialogflow-cx/test/update-intent.test.js create mode 100644 dialogflow-cx/test/webhook-configure-session-parameters-test.js create mode 100644 dialogflow-cx/test/webhook-validate-form-parameter-test.js create mode 100644 dialogflow-cx/test/webhook.test.js create mode 100644 dialogflow-cx/update-intent.js create mode 100644 dialogflow-cx/webhook-configure-session-parameters.js create mode 100644 dialogflow-cx/webhook-validate-form-parameter.js create mode 100644 dialogflow-cx/webhooks.js diff --git a/.github/workflows/dialogflow-cx.yaml b/.github/workflows/dialogflow-cx.yaml new file mode 100644 index 0000000000..00405c3926 --- /dev/null +++ b/.github/workflows/dialogflow-cx.yaml @@ -0,0 +1,76 @@ +name: dialogflow-cx +on: + push: + branches: + - main + paths: + - 'dialogflow-cx/**' + pull_request: + paths: + - 'dialogflow-cx/**' + pull_request_target: + types: [labeled] + schedule: + - cron: '0 0 * * 0' +jobs: + test: + if: ${{ github.event.action != 'labeled' || github.event.label.name == 'actions:force-run' }} + runs-on: ubuntu-latest + timeout-minutes: 60 + permissions: + contents: 'write' + pull-requests: 'write' + id-token: 'write' + steps: + - uses: actions/checkout@v3 + with: + ref: ${{github.event.pull_request.head.ref}} + repository: ${{github.event.pull_request.head.repo.full_name}} + - uses: google-github-actions/auth@v1.0.0 + with: + workload_identity_provider: 'projects/1046198160504/locations/global/workloadIdentityPools/github-actions-pool/providers/github-actions-provider' + service_account: 'kokoro-system-test@long-door-651.iam.gserviceaccount.com' + create_credentials_file: 'true' + access_token_lifetime: 600s + - id: secrets + uses: 'google-github-actions/get-secretmanager-secrets@v0' + with: + secrets: |- + agent_id:nodejs-docs-samples-tests/nodejs-docs-samples-dialogflow-cx-agent-id + test_id:nodejs-docs-samples-tests/nodejs-docs-samples-dialogflow-cx-test-id + - uses: actions/setup-node@v3 + with: + node-version: 14 + - run: npm install + working-directory: dialogflow-cx + - run: npm test + working-directory: dialogflow-cx + env: + AGENT_ID: ${{ steps.secrets.outputs.agent_id }} + TEST_ID: ${{ steps.secrets.outputs.test_id }} + AGENT_PROJECT_ID: nodejs-docs-samples-tests + MOCHA_REPORTER_SUITENAME: dialogflow-cx + MOCHA_REPORTER_OUTPUT: dialogflow_cx_sponge_log.xml + MOCHA_REPORTER: xunit + - if: ${{ github.event.action == 'labeled' && github.event.label.name == 'actions:force-run' }} + uses: actions/github-script@v6 + with: + github-token: ${{ secrets.GITHUB_TOKEN }} + script: | + try { + await github.rest.issues.removeLabel({ + name: 'actions:force-run', + owner: 'GoogleCloudPlatform', + repo: 'nodejs-docs-samples', + issue_number: context.payload.pull_request.number + }); + } catch (e) { + if (!e.message.includes('Label does not exist')) { + throw e; + } + } + - if: ${{ github.event_name == 'schedule' && always() }} + run: | + curl https://github.com/googleapis/repo-automation-bots/releases/download/flakybot-1.1.0/flakybot -o flakybot -s -L + chmod +x ./flakybot + ./flakybot --repo GoogleCloudPlatform/nodejs-docs-samples --commit_hash ${{github.sha}} --build_url https://github.com/${{github.repository}}/actions/runs/${{github.run_id}} diff --git a/.github/workflows/workflows.json b/.github/workflows/workflows.json index 48f7845f7d..7db436808f 100644 --- a/.github/workflows/workflows.json +++ b/.github/workflows/workflows.json @@ -34,6 +34,7 @@ "datastore/functions", "datacatalog/quickstart", "dialogflow", + "dialogflow-cx", "document-ai", "endpoints/getting-started", "endpoints/getting-started-grpc", diff --git a/dialogflow-cx/configure-webhook-to-set-form-parameter-as-optional-or-required.js b/dialogflow-cx/configure-webhook-to-set-form-parameter-as-optional-or-required.js new file mode 100644 index 0000000000..434824d1fa --- /dev/null +++ b/dialogflow-cx/configure-webhook-to-set-form-parameter-as-optional-or-required.js @@ -0,0 +1,48 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +/** + * Configures a webhook to set form parameters as optional/required + */ + +// [START dialogflow_cx_v3_configure_webhooks_to_set_form_parameter_as_optional_or_required] + +exports.configureOptionalFormParam = (request, response) => { + // The value of the parameter that the webhook will set as optional or required. + // Note that the webhook cannot add or remove any form parameter + + const jsonResponse = { + pageInfo: { + formInfo: { + parameterInfo: [ + { + displayName: 'order-number', + // if required: false, the agent will not reprompt for this parameter, even if the state is 'INVALID' + required: true, + state: 'VALID', + }, + ], + }, + }, + }; + + // Info about form parameter that is sent in the webhook response: + console.log( + 'Parameter Info: \n', + jsonResponse.pageInfo.formInfo.parameterInfo[0] + ); + + response.send(jsonResponse); +}; +// [END dialogflow_cx_v3_configure_webhooks_to_set_form_parameter_as_optional_or_required] diff --git a/dialogflow-cx/create-agent.js b/dialogflow-cx/create-agent.js new file mode 100644 index 0000000000..014203108b --- /dev/null +++ b/dialogflow-cx/create-agent.js @@ -0,0 +1,56 @@ +// Copyright 2021 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +'use strict'; + +process.env.DEBUG = 'dialogflow:debug'; // enables lib debugging statements + +async function main(projectId, displayName) { + // [START dialogflow_set_agent_sample] + + const parent = 'projects/' + projectId + '/locations/global'; + + const api_endpoint = 'global-dialogflow.googleapis.com'; + + const agent = { + displayName: displayName, + defaultLanguageCode: 'en', + timeZone: 'America/Los_Angeles', + }; + + const {AgentsClient} = require('@google-cloud/dialogflow-cx'); + + const client = new AgentsClient({apiEndpoint: api_endpoint}); + + async function setAgentSample() { + const request = { + agent, + parent, + }; + + const [response] = await client.createAgent(request); + console.log(`response: ${JSON.stringify(response, null, 2)}`); + + // Delete created agent resource + client.deleteAgent({name: response.name}); + } + await setAgentSample(); + // [END dialogflow_set_agent_sample] +} + +process.on('unhandledRejection', err => { + console.error(err.message); + process.exitCode = 1; +}); +main(...process.argv.slice(2)); diff --git a/dialogflow-cx/create-page.js b/dialogflow-cx/create-page.js new file mode 100644 index 0000000000..f4b0dd2c0f --- /dev/null +++ b/dialogflow-cx/create-page.js @@ -0,0 +1,51 @@ +// Copyright 2021 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +'use strict'; + +const {PagesClient} = require('@google-cloud/dialogflow-cx'); + +async function main(projectId, agentId, flowId, location, displayName) { + /** + * TODO(developer): Uncomment these variables before running the sample. + */ + // const projectId = 'my-project'; + // const agentId = 'my-agent'; + // const flowId = 'my-flow'; + // const displayName = 'my-display-name'; + // const location = 'global'; + + // [START dialogflow_cx_create_page_sample] + async function createPage(projectId, agentId, flowId, location, displayName) { + const pagesClient = new PagesClient(); + + const createPageRequest = { + parent: `projects/${projectId}/locations/${location}/agents/${agentId}/flows/${flowId}`, + page: { + displayName: displayName, + }, + }; + + const response = await pagesClient.createPage(createPageRequest); + console.log(response); + } + // [END dialogflow_cx_create_page_sample] + + await createPage(projectId, agentId, flowId, location, displayName); +} + +main(...process.argv.slice(2)).catch(err => { + console.error(err); + process.exitCode = 1; +}); diff --git a/dialogflow-cx/delete-page.js b/dialogflow-cx/delete-page.js new file mode 100644 index 0000000000..a7dcaa46f1 --- /dev/null +++ b/dialogflow-cx/delete-page.js @@ -0,0 +1,48 @@ +// Copyright 2021 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +'use strict'; + +const {PagesClient} = require('@google-cloud/dialogflow-cx'); + +async function main(projectId, agentId, flowId, pageId, location) { + /** + * TODO(developer): Uncomment these variables before running the sample. + */ + // const projectId = 'my-project'; + // const agentId = 'my-agent'; + // const flowId = 'my-flow'; + // const pageId = 'my-page'; + // const location = 'global'; + + // [START dialogflow_cx_delete_page_sample] + async function deletePage(projectId, agentId, flowId, pageId, location) { + const pagesClient = new PagesClient(); + + const req = { + name: `projects/${projectId}/locations/${location}/agents/${agentId}/flows/${flowId}/pages/${pageId}`, + }; + + const response = await pagesClient.deletePage(req); + console.log(response); + } + // [END dialogflow_cx_delete_page_sample] + + await deletePage(projectId, agentId, flowId, pageId, location); +} + +main(...process.argv.slice(2)).catch(err => { + console.error(err); + process.exitCode = 1; +}); diff --git a/dialogflow-cx/detect-intent-audio.js b/dialogflow-cx/detect-intent-audio.js new file mode 100644 index 0000000000..a389c00fc8 --- /dev/null +++ b/dialogflow-cx/detect-intent-audio.js @@ -0,0 +1,102 @@ +// Copyright 2020 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +'use strict'; + +async function main( + projectId, + location, + agentId, + audioFileName, + encoding, + sampleRateHertz, + languageCode +) { + // [START dialogflow_cx_detect_intent_audio] + /** + * TODO(developer): Uncomment these variables before running the sample. + */ + // const projectId = 'my-project'; + // const location = 'global'; + // const agentId = 'my-agent'; + // const audioFileName = '/path/to/audio.raw'; + // const encoding = 'AUDIO_ENCODING_LINEAR_16'; + // const sampleRateHertz = 16000; + // const languageCode = 'en' + + // Imports the Google Cloud Some API library + const {SessionsClient} = require('@google-cloud/dialogflow-cx'); + /** + * Example for regional endpoint: + * const location = 'us-central1' + * const client = new SessionsClient({apiEndpoint: 'us-central1-dialogflow.googleapis.com'}) + */ + const client = new SessionsClient(); + + const fs = require('fs'); + const util = require('util'); + + async function detectIntentAudio() { + const sessionId = Math.random().toString(36).substring(7); + const sessionPath = client.projectLocationAgentSessionPath( + projectId, + location, + agentId, + sessionId + ); + console.info(sessionPath); + + // Read the content of the audio file and send it as part of the request. + const readFile = util.promisify(fs.readFile); + const inputAudio = await readFile(audioFileName); + + const request = { + session: sessionPath, + queryInput: { + audio: { + config: { + audioEncoding: encoding, + sampleRateHertz: sampleRateHertz, + }, + audio: inputAudio, + }, + languageCode, + }, + }; + const [response] = await client.detectIntent(request); + console.log(`User Query: ${response.queryResult.transcript}`); + for (const message of response.queryResult.responseMessages) { + if (message.text) { + console.log(`Agent Response: ${message.text.text}`); + } + } + if (response.queryResult.match.intent) { + console.log( + `Matched Intent: ${response.queryResult.match.intent.displayName}` + ); + } + console.log( + `Current Page: ${response.queryResult.currentPage.displayName}` + ); + } + + detectIntentAudio(); + // [END dialogflow_cx_detect_intent_audio] +} + +main(...process.argv.slice(2)); +process.on('unhandledRejection', err => { + console.error(err.message); + process.exitCode = 1; +}); diff --git a/dialogflow-cx/detect-intent-disabled-webhook.js b/dialogflow-cx/detect-intent-disabled-webhook.js new file mode 100644 index 0000000000..1c9a04e0b7 --- /dev/null +++ b/dialogflow-cx/detect-intent-disabled-webhook.js @@ -0,0 +1,75 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +'use strict'; + +async function main(projectId, location, agentId, query, languageCode) { + // [START dialogflow_cx_detect_intent_with_disabled_webhook] + /** + * TODO(developer): Uncomment these variables before running the sample. + */ + // const projectId = 'my-project'; + // const location = 'global'; + // const agentId = 'my-agent'; + // const query = 'Hello'; + // const languageCode = 'en' + + const {SessionsClient} = require('@google-cloud/dialogflow-cx'); + /** + * Example for regional endpoint: + * const location = 'us-central1' + * const client = new SessionsClient({apiEndpoint: 'us-central1-dialogflow.googleapis.com'}) + */ + const client = new SessionsClient(); + + async function detectIntentText() { + const sessionId = Math.random().toString(36).substring(7); + const sessionPath = client.projectLocationAgentSessionPath( + projectId, + location, + agentId, + sessionId + ); + console.info(sessionPath); + + const request = { + session: sessionPath, + queryParams: { + disableWebhook: true, + }, + queryInput: { + text: { + text: query, + }, + languageCode, + }, + }; + const [response] = await client.detectIntent(request); + console.log(`Detect Intent Request: ${request.queryParams.disableWebhook}`); + for (const message of response.queryResult.responseMessages) { + if (message.text) { + console.log(`Agent Response: ${message.text.text}`); + } + } + } + + detectIntentText(); + // [END dialogflow_cx_detect_intent_with_disabled_webhook] +} + +main(...process.argv.slice(2)); +process.on('unhandledRejection', err => { + console.error(err.message); + process.exitCode = 1; +}); diff --git a/dialogflow-cx/detect-intent-event.js b/dialogflow-cx/detect-intent-event.js new file mode 100644 index 0000000000..035bbc5fe8 --- /dev/null +++ b/dialogflow-cx/detect-intent-event.js @@ -0,0 +1,102 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +/** + * Detects intent using EventInput + * + * See https://cloud.google.com/dialogflow/cx/docs/quick/api before running the code snippet. + */ + +'use strict'; + +function main(projectId, location, agentId, event, languageCode) { + // [START dialogflow_cx_v3_detect_intent_event_input_async] + /** + * TODO(developer): Uncomment these variables before running the sample. + */ + /** + * Required. The name of the session this query is sent to. + * Format: `projects//locations//agents//sessions/` or `projects//locations//agents//environments//sessions/`. + * If `Environment ID` is not specified, we assume default 'draft' + * environment. + * It's up to the API caller to choose an appropriate `Session ID`. It can be + * a random number or some type of session identifiers (preferably hashed). + * The length of the `Session ID` must not exceed 36 characters. + * For more information, see the sessions + * guide (https://cloud.google.com/dialogflow/cx/docs/concept/session). + * Note: Always use agent versions for production traffic. + * See Versions and + * environments (https://cloud.google.com/dialogflow/cx/docs/concept/version). + */ + + /** + * Optional. The parameters of this query. + */ + // const queryParams = {} + /** + * Required. The input specification. See https://cloud.google.com/dialogflow/cx/docs/reference/rest/v3beta1/ConversationTurn#QueryInput for information about query inputs. + */ + // const event = 'name-of-event-to-trigger'; + + // Imports the Cx library + const {SessionsClient} = require('@google-cloud/dialogflow-cx'); + /** + * Example for regional endpoint: + * const location = 'us-central1' + * const client = new SessionsClient({apiEndpoint: 'us-central1-dialogflow.googleapis.com'}) + */ + // Instantiates a client + const cxClient = new SessionsClient(); + + async function detectIntentWithEventInput() { + const sessionId = Math.random().toString(36).substring(7); + const sessionPath = cxClient.projectLocationAgentSessionPath( + projectId, + location, + agentId, + sessionId + ); + + // Construct detect intent request + const request = { + session: sessionPath, + queryInput: { + event: { + event: event, + }, + languageCode, + }, + }; + + // Send request and receive response + const [response] = await cxClient.detectIntent(request); + console.log(`Event Name: ${event}`); + + // Response message from the triggered event + console.log('Agent Response: \n'); + console.log(response.queryResult.responseMessages[0].text.text[0]); + } + + detectIntentWithEventInput(); + // [END dialogflow_cx_v3_detect_intent_event_input_async] +} + +process.on('unhandledRejection', err => { + console.error(err.message); + process.exitCode = 1; +}); +main(...process.argv.slice(2)); diff --git a/dialogflow-cx/detect-intent-streaming.js b/dialogflow-cx/detect-intent-streaming.js new file mode 100644 index 0000000000..c0f02959ca --- /dev/null +++ b/dialogflow-cx/detect-intent-streaming.js @@ -0,0 +1,133 @@ +// Copyright 2020 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +'use strict'; + +async function main( + projectId, + location, + agentId, + audioFileName, + encoding, + sampleRateHertz, + languageCode +) { + // [START dialogflow_cx_detect_intent_streaming] + /** + * TODO(developer): Uncomment these variables before running the sample. + */ + // const projectId = 'my-project'; + // const location = 'global'; + // const agentId = 'my-agent'; + // const audioFileName = '/path/to/audio.raw'; + // const encoding = 'AUDIO_ENCODING_LINEAR_16'; + // const sampleRateHertz = 16000; + // const languageCode = 'en' + + // Imports the Google Cloud Some API library + const {SessionsClient} = require('@google-cloud/dialogflow-cx'); + /** + * Example for regional endpoint: + * const location = 'us-central1' + * const client = new SessionsClient({apiEndpoint: 'us-central1-dialogflow.googleapis.com'}) + */ + const client = new SessionsClient(); + + const fs = require('fs'); + const util = require('util'); + const {Transform, pipeline} = require('stream'); + const pump = util.promisify(pipeline); + + async function detectIntentAudio() { + const sessionId = Math.random().toString(36).substring(7); + const sessionPath = client.projectLocationAgentSessionPath( + projectId, + location, + agentId, + sessionId + ); + console.info(sessionPath); + + // Create a stream for the streaming request. + const detectStream = client + .streamingDetectIntent() + .on('error', console.error) + .on('data', data => { + if (data.recognitionResult) { + console.log( + `Intermediate Transcript: ${data.recognitionResult.transcript}` + ); + } else { + console.log('Detected Intent:'); + const result = data.detectIntentResponse.queryResult; + + console.log(`User Query: ${result.transcript}`); + for (const message of result.responseMessages) { + if (message.text) { + console.log(`Agent Response: ${message.text.text}`); + } + } + if (result.match.intent) { + console.log(`Matched Intent: ${result.match.intent.displayName}`); + } + console.log(`Current Page: ${result.currentPage.displayName}`); + } + }); + + // Write the initial stream request to config for audio input. + const initialStreamRequest = { + session: sessionPath, + queryInput: { + audio: { + config: { + audioEncoding: encoding, + sampleRateHertz: sampleRateHertz, + synthesize_speech_config: { + voice: { + // Set's the name and gender of the ssml voice + name: 'en-GB-Standard-A', + ssml_gender: 'SSML_VOICE_GENDER_FEMALE', + }, + }, + singleUtterance: true, + }, + }, + languageCode: languageCode, + }, + }; + detectStream.write(initialStreamRequest); + + // Stream the audio from audio file to Dialogflow. + await pump( + fs.createReadStream(audioFileName), + // Format the audio stream into the request format. + new Transform({ + objectMode: true, + transform: (obj, _, next) => { + next(null, {queryInput: {audio: {audio: obj}}}); + }, + }), + detectStream + ); + } + + detectIntentAudio(); + // [END dialogflow_cx_detect_intent_streaming] +} + +main(...process.argv.slice(2)); +process.on('unhandledRejection', err => { + console.error(err.message); + process.exitCode = 1; +}); diff --git a/dialogflow-cx/detect-intent-synthesize-tts-response.js b/dialogflow-cx/detect-intent-synthesize-tts-response.js new file mode 100644 index 0000000000..d75521b9ad --- /dev/null +++ b/dialogflow-cx/detect-intent-synthesize-tts-response.js @@ -0,0 +1,105 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +/** + * Detects intent and returns a synthesized Text-to-Speech (TTS) response + + * See https://cloud.google.com/dialogflow/cx/docs/quick/api before running the code snippet. + */ + +'use strict'; + +function main( + projectId, + location, + agentId, + sessionId, + query, + languageCode, + outputFile +) { + // [START dialogflow_cx_v3_detect_intent_synthesize_tts_response_async] + + // Imports the Cx library + const {SessionsClient} = require('@google-cloud/dialogflow-cx'); + + /** + * TODO(developer): Uncomment the following lines before running the sample. + */ + // const projectId = 'ID of GCP project associated with your Dialogflow agent'; + // const sessionId = `user specific ID of session, e.g. 12345`; + // const query = `phrase(s) to pass to detect, e.g. I'd like to reserve a room for six people`; + // const languageCode = 'BCP-47 language code, e.g. en-US'; + // const outputFile = `path for audio output file, e.g. ./resources/myOutput.wav`; + + // Instantiates a Sessions client + const sessionsClient = new SessionsClient(); + + // Define session path + const sessionPath = sessionsClient.projectLocationAgentSessionPath( + projectId, + location, + agentId, + sessionId + ); + const fs = require('fs'); + const util = require('util'); + + async function detectIntentSynthesizeTTSResponse() { + // Configuration of how speech should be synthesized. See https://cloud.google.com/dialogflow/cx/docs/reference/rest/v3/OutputAudioConfig#SynthesizeSpeechConfig + const synthesizeSpeechConfig = { + speakingRate: 1.25, + pitch: 10.0, + }; + + // Constructs the audio query request + const request = { + session: sessionPath, + queryInput: { + text: { + text: query, + }, + languageCode: languageCode, + }, + outputAudioConfig: { + audioEncoding: 'OUTPUT_AUDIO_ENCODING_LINEAR_16', + synthesizeSpeechConfig: synthesizeSpeechConfig, + }, + }; + + // Sends the detectIntent request + const [response] = await sessionsClient.detectIntent(request); + // Output audio configurations + console.log( + `Speaking Rate: ${response.outputAudioConfig.synthesizeSpeechConfig.speakingRate}` + ); + console.log( + `Pitch: ${response.outputAudioConfig.synthesizeSpeechConfig.pitch}` + ); + + const audioFile = response.outputAudio; + // Writes audio content to output file + util.promisify(fs.writeFile)(outputFile, audioFile, 'binary'); + console.log(`Audio content written to file: ${outputFile}`); + } + detectIntentSynthesizeTTSResponse(); + // [END dialogflow_cx_v3_detect_intent_synthesize_tts_response_async] +} + +process.on('unhandledRejection', err => { + console.error(err.message); + process.exitCode = 1; +}); +main(...process.argv.slice(2)); diff --git a/dialogflow-cx/detect-intent-text.js b/dialogflow-cx/detect-intent-text.js new file mode 100644 index 0000000000..3f90567f98 --- /dev/null +++ b/dialogflow-cx/detect-intent-text.js @@ -0,0 +1,78 @@ +// Copyright 2020 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +'use strict'; + +async function main(projectId, location, agentId, query, languageCode) { + // [START dialogflow_cx_detect_intent_text] + /** + * TODO(developer): Uncomment these variables before running the sample. + */ + // const projectId = 'my-project'; + // const location = 'global'; + // const agentId = 'my-agent'; + // const query = 'Hello'; + // const languageCode = 'en' + + // Imports the Google Cloud Some API library + const {SessionsClient} = require('@google-cloud/dialogflow-cx'); + /** + * Example for regional endpoint: + * const location = 'us-central1' + * const client = new SessionsClient({apiEndpoint: 'us-central1-dialogflow.googleapis.com'}) + */ + const client = new SessionsClient(); + + async function detectIntentText() { + const sessionId = Math.random().toString(36).substring(7); + const sessionPath = client.projectLocationAgentSessionPath( + projectId, + location, + agentId, + sessionId + ); + const request = { + session: sessionPath, + queryInput: { + text: { + text: query, + }, + languageCode, + }, + }; + const [response] = await client.detectIntent(request); + for (const message of response.queryResult.responseMessages) { + if (message.text) { + console.log(`Agent Response: ${message.text.text}`); + } + } + if (response.queryResult.match.intent) { + console.log( + `Matched Intent: ${response.queryResult.match.intent.displayName}` + ); + } + console.log( + `Current Page: ${response.queryResult.currentPage.displayName}` + ); + } + + detectIntentText(); + // [END dialogflow_cx_detect_intent_text] +} + +main(...process.argv.slice(2)); +process.on('unhandledRejection', err => { + console.error(err.message); + process.exitCode = 1; +}); diff --git a/dialogflow-cx/detect-intent-with-intent-input.js b/dialogflow-cx/detect-intent-with-intent-input.js new file mode 100644 index 0000000000..d08ec4def3 --- /dev/null +++ b/dialogflow-cx/detect-intent-with-intent-input.js @@ -0,0 +1,108 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +/** + * Trigger intent programmatically rather than as a result of natural language processing + + * See https://cloud.google.com/dialogflow/cx/docs/quick/api before running the code snippet. + */ + +'use strict'; + +function main(projectId, location, agentId, intentId, languageCode) { + // [START dialogflow_cx_v3_detect_intent_with_intent_input_async] + /** + * TODO(developer): Uncomment these variables before running the sample. + */ + + /** + * const projectId = 'your-project-id'; + * const location = 'location'; + * const agentId = 'your-agent-id'; + * const languageCode = 'your-language-code'; + */ + + /** + * The input specification. See https://cloud.google.com/dialogflow/cx/docs/reference/rest/v3beta1/ConversationTurn#QueryInput for information about query inputs. + */ + // const intentId = 'unique-identifier-of-the-intent-to-trigger'; + + // Imports the Cx library + const { + SessionsClient, + IntentsClient, + } = require('@google-cloud/dialogflow-cx'); + /** + * Example for regional endpoint: + * const location = 'us-central1' + * const client = new SessionsClient({apiEndpoint: 'us-central1-dialogflow.googleapis.com'}) + */ + // Instantiates a Sessions client + const sessionsClient = new SessionsClient(); + + // Instantiates an Intents client + const intentsClient = new IntentsClient(); + + async function detectIntentWithIntentInput() { + const sessionId = Math.random().toString(36).substring(7); + + // Creates session path + const sessionPath = sessionsClient.projectLocationAgentSessionPath( + projectId, + location, + agentId, + sessionId + ); + + // Creates intent path. Format: projects//locations//agents//intents/ + const intentPath = intentsClient.intentPath( + projectId, + location, + agentId, + intentId + ); + + // Construct detectIntent request + const request = { + session: sessionPath, + queryInput: { + intent: { + intent: intentPath, + }, + languageCode, + }, + }; + + // Send request and receive response + const [response] = await sessionsClient.detectIntent(request); + + // Display the name of the detected intent + console.log('Intent Name: \n'); + console.log(response.queryResult.intent.displayName); + + // Agent responds with fulfillment message of the detected intent + console.log('Agent Response: \n'); + console.log(response.queryResult.responseMessages[0].text.text[0]); + } + + detectIntentWithIntentInput(); + // [END dialogflow_cx_v3_detect_intent_with_intent_input_async] +} + +process.on('unhandledRejection', err => { + console.error(err.message); + process.exitCode = 1; +}); +main(...process.argv.slice(2)); diff --git a/dialogflow-cx/detect-intent-with-sentiment-analysis.js b/dialogflow-cx/detect-intent-with-sentiment-analysis.js new file mode 100644 index 0000000000..a760940cf1 --- /dev/null +++ b/dialogflow-cx/detect-intent-with-sentiment-analysis.js @@ -0,0 +1,120 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +/** + * Detects intent with sentiment analysis + * + * See https://cloud.google.com/dialogflow/cx/docs/quick/api before running the code snippet. + */ + +'use strict'; + +function main(projectId, location, agentId, query, languageCode) { + // [START dialogflow_cx_v3_detect_intent_sentiment_analysis_async] + /** + * TODO(developer): Uncomment these variables before running the sample. + */ + /** + * Required. The name of the session this query is sent to. + * Format: `projects//locations//agents//sessions/` or `projects//locations//agents//environments//sessions/`. + * If `Environment ID` is not specified, we assume default 'draft' + * environment. + * It's up to the API caller to choose an appropriate `Session ID`. It can be + * a random number or some type of session identifiers (preferably hashed). + * The length of the `Session ID` must not exceed 36 characters. + * For more information, see the sessions + * guide (https://cloud.google.com/dialogflow/cx/docs/concept/session). + * Note: Always use agent versions for production traffic. + * See Versions and + * environments (https://cloud.google.com/dialogflow/cx/docs/concept/version). + */ + + /** + * Optional. The parameters of this query. + */ + // const queryParams = {} + /** + * Required. The input specification. See https://cloud.google.com/dialogflow/cx/docs/reference/rest/v3beta1/ConversationTurn#QueryInput for information about query inputs. + */ + // const text = 'text-of-your-query'; + + // Imports the Cx library + const {SessionsClient} = require('@google-cloud/dialogflow-cx'); + /** + * Example for regional endpoint: + * const location = 'us-central1' + * const client = new SessionsClient({apiEndpoint: 'us-central1-dialogflow.googleapis.com'}) + */ + // Instantiates a client + const cxClient = new SessionsClient(); + + // Configures whether sentiment analysis should be performed. If not provided, sentiment analysis is not performed. + const analyzeQueryTextSentiment = true; + + async function detectIntentWithSentimentAnalysis() { + const sessionId = Math.random().toString(36).substring(7); + const sessionPath = cxClient.projectLocationAgentSessionPath( + projectId, + location, + agentId, + sessionId + ); + + // Construct detect intent request + const request = { + session: sessionPath, + queryInput: { + text: { + text: query, + }, + languageCode, + }, + queryParams: { + analyzeQueryTextSentiment: analyzeQueryTextSentiment, + }, + }; + + // Run request + const [response] = await cxClient.detectIntent(request); + console.log(`User Query: ${query}`); + + // Shows result of sentiment analysis (sentimentAnalysisResult) + const sentimentAnalysis = response.queryResult.sentimentAnalysisResult; + + // Determines sentiment score of user query + let sentiment; + if (sentimentAnalysis.score < 0) { + sentiment = 'negative'; + } else if (sentimentAnalysis.score > 0) { + sentiment = 'positive'; + } else { + sentiment = 'neutral'; + } + console.log( + `User input sentiment has a score of ${sentimentAnalysis.score}, which indicates ${sentiment} sentiment.` + ); + } + + detectIntentWithSentimentAnalysis(); + // [END dialogflow_cx_v3_detect_intent_sentiment_analysis_async] +} + +process.on('unhandledRejection', err => { + console.error(err.message); + process.exitCode = 1; +}); +main(...process.argv.slice(2)); diff --git a/dialogflow-cx/list-intents.js b/dialogflow-cx/list-intents.js new file mode 100644 index 0000000000..f28ec20755 --- /dev/null +++ b/dialogflow-cx/list-intents.js @@ -0,0 +1,60 @@ +// Copyright 2020 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +'use strict'; + +async function main(projectId, location, agentId) { + // [START dialogflow_cx_list_intents] + /** + * TODO(developer): Uncomment these variables before running the sample. + */ + // const projectId = 'my-project'; + // const location = 'global'; + // const agentId = 'my-agent'; + + // Imports the Google Cloud Some API library + const {IntentsClient} = require('@google-cloud/dialogflow-cx'); + /** + * Example for regional endpoint: + * const location = 'us-central1' + * const client = new SessionsClient({apiEndpoint: 'us-central1-dialogflow.googleapis.com'}) + */ + const client = new IntentsClient(); + + async function listIntents() { + const parent = client.agentPath(projectId, location, agentId); + console.info(parent); + + const [intents] = await client.listIntents({ + parent, + pageSize: 100, + }); + intents.forEach(intent => { + console.log('===================='); + console.log(`Intent name: ${intent.name}`); + console.log(`Intent display name: ${intent.displayName}`); + console.log(`# Parameters: ${intent.parameters.length}`); + console.log(`# Training Phrases: ${intent.trainingPhrases.length}`); + }); + } + + listIntents(); + // [END dialogflow_cx_list_intents] +} + +main(...process.argv.slice(2)); +process.on('unhandledRejection', err => { + console.error(err.message); + process.exitCode = 1; +}); diff --git a/dialogflow-cx/list-page.js b/dialogflow-cx/list-page.js new file mode 100644 index 0000000000..3dbe8292af --- /dev/null +++ b/dialogflow-cx/list-page.js @@ -0,0 +1,47 @@ +// Copyright 2021 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +'use strict'; + +const {PagesClient} = require('@google-cloud/dialogflow-cx'); + +async function main(projectId, agentId, flowId, location) { + /** + * TODO(developer): Uncomment these variables before running the sample. + */ + // const projectId = 'my-project'; + // const agentId = 'my-agent'; + // const flowId = 'my-flow'; + // const location = 'global'; + + // [START dialogflow_cx_list_page_sample] + async function listPages(projectId, agentId, flowId, location) { + const pagesClient = new PagesClient(); + const listPageRequest = { + parent: `projects/${projectId}/locations/${location}/agents/${agentId}/flows/${flowId}`, + languageCode: 'en', + }; + + const response = await pagesClient.listPages(listPageRequest); + console.log(response); + } + // [END dialogflow_cx_list_page_sample] + + await listPages(projectId, agentId, flowId, location); +} + +main(...process.argv.slice(2)).catch(err => { + console.error(err); + process.exitCode = 1; +}); diff --git a/dialogflow-cx/list-testcase-results.js b/dialogflow-cx/list-testcase-results.js new file mode 100644 index 0000000000..89a2be1b4a --- /dev/null +++ b/dialogflow-cx/list-testcase-results.js @@ -0,0 +1,49 @@ +// Copyright 2021 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +'use strict'; + +async function main(projectId, agentId, testId, location) { + /** + * TODO(developer): Uncomment these variables before running the sample. + */ + // const projectId = 'my-project'; + // const agentId = 'my-agent'; + // const testId = 'my-flow'; + // const location = 'global'; + + // [START dialogflow_cx_list_testcase_sample] + const parent = `projects/${projectId}/locations/${location}/agents/${agentId}/testCases/${testId}`; + + const {TestCasesClient} = require('@google-cloud/dialogflow-cx'); + + const client = new TestCasesClient({ + apiEndpoint: 'global-dialogflow.googleapis.com', + }); + const req = { + parent, + filter: 'environment=draft', + }; + + const res = await client.listTestCaseResults(req); + + console.log(res); + // [END dialogflow_cx_list_testcase_sample] +} + +process.on('unhandledRejection', err => { + console.error(err.message); + process.exitCode = 1; +}); +main(...process.argv.slice(2)); diff --git a/dialogflow-cx/long-running-operation.js b/dialogflow-cx/long-running-operation.js new file mode 100644 index 0000000000..020a7a2e25 --- /dev/null +++ b/dialogflow-cx/long-running-operation.js @@ -0,0 +1,54 @@ +// Copyright 2021 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +'use strict'; + +async function main(projectId, agentId, location) { + /** + * TODO(developer): Uncomment these variables before running the sample. + */ + // const projectId = 'my-project'; + // const agentId = 'my-agent'; + // const location = 'global'; + + // [START dialogflow_cx_log_running_operation] + + const {AgentsClient, protos} = require('@google-cloud/dialogflow-cx'); + + const api_endpoint = `${location}-dialogflow.googleapis.com`; + + const client = new AgentsClient({apiEndpoint: api_endpoint}); + + const exportAgentRequest = + new protos.google.cloud.dialogflow.cx.v3.ExportAgentRequest(); + + exportAgentRequest.name = `projects/${projectId}/locations/${location}/agents/${agentId}`; + + // exportAgent call returns a promise to a long running operation + const [operation] = await client.exportAgent(exportAgentRequest); + + // Waiting for the long running opporation to finish + const [response] = await operation.promise(); + + // Prints the result of the operation when the operation is done + console.log(response); + + // [END dialogflow_cx_log_running_operation] +} + +process.on('unhandledRejection', err => { + console.error(err.message); + process.exitCode = 1; +}); +main(...process.argv.slice(2)); diff --git a/dialogflow-cx/package.json b/dialogflow-cx/package.json new file mode 100644 index 0000000000..5438f221af --- /dev/null +++ b/dialogflow-cx/package.json @@ -0,0 +1,24 @@ +{ + "name": "nodejs-dialogflow-cx-samples", + "private": true, + "license": "Apache-2.0", + "author": "Google LLC", + "engines": { + "node": ">=12.0.0" + }, + "files": [ + "*.js" + ], + "scripts": { + "test": "c8 mocha --timeout 600000 test/*.js" + }, + "dependencies": { + "@google-cloud/dialogflow-cx": "^3.1.2", + "uuid": "^9.0.0" + }, + "devDependencies": { + "c8": "^7.3.0", + "chai": "^4.2.0", + "mocha": "^8.1.1" + } +} diff --git a/dialogflow-cx/quickstart.js b/dialogflow-cx/quickstart.js new file mode 100644 index 0000000000..4e7efe3c31 --- /dev/null +++ b/dialogflow-cx/quickstart.js @@ -0,0 +1,104 @@ +// Copyright 2020 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +'use strict'; + +async function main( + projectId, + location, + agentId, + audioFileName, + encoding, + sampleRateHertz, + languageCode +) { + // [START dialogflow_cx_quickstart] + /** + * TODO(developer): Uncomment these variables before running the sample. + */ + // const projectId = 'my-project'; + // const location = 'global'; + // const agentId = 'my-agent'; + // const audioFileName = '/path/to/audio.raw'; + // const encoding = 'AUDIO_ENCODING_LINEAR_16'; + // const sampleRateHertz = 16000; + // const languageCode = 'en' + + // Imports the Google Cloud Some API library + const {SessionsClient} = require('@google-cloud/dialogflow-cx'); + /** + * Example for regional endpoint: + * const location = 'us-central1' + * const client = new SessionsClient({apiEndpoint: 'us-central1-dialogflow.googleapis.com'}) + */ + const client = new SessionsClient(); + + const fs = require('fs'); + const util = require('util'); + // Assumes uuid module has been installed from npm, + // npm i uuid: + const {v4} = require('uuid'); + + async function detectIntentAudio() { + const sessionId = v4(); + const sessionPath = client.projectLocationAgentSessionPath( + projectId, + location, + agentId, + sessionId + ); + + // Read the content of the audio file and send it as part of the request. + const readFile = util.promisify(fs.readFile); + const inputAudio = await readFile(audioFileName); + + const request = { + session: sessionPath, + queryInput: { + audio: { + config: { + audioEncoding: encoding, + sampleRateHertz: sampleRateHertz, + }, + audio: inputAudio, + }, + languageCode, + }, + }; + const [response] = await client.detectIntent(request); + console.log(`User Query: ${response.queryResult.transcript}`); + for (const message of response.queryResult.responseMessages) { + if (message.text) { + console.log(`Agent Response: ${message.text.text}`); + } + } + if (response.queryResult.match.intent) { + console.log( + `Matched Intent: ${response.queryResult.match.intent.displayName}` + ); + } + console.log( + `Current Page: ${response.queryResult.currentPage.displayName}` + ); + } + + detectIntentAudio(); + // [END dialogflow_cx_quickstart] +} + +main(...process.argv.slice(2)); +process.on('unhandledRejection', err => { + console.error(err.message); + process.exitCode = 1; +}); diff --git a/dialogflow-cx/resources/book_a_room.wav b/dialogflow-cx/resources/book_a_room.wav new file mode 100644 index 0000000000000000000000000000000000000000..9124e9279460a0057df91202a5d0e5e147b60813 GIT binary patch literal 31058 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 Nh$0A1lK;Pd{tuoqdJX^p literal 0 HcmV?d00001 diff --git a/dialogflow-cx/resources/output.wav b/dialogflow-cx/resources/output.wav new file mode 100644 index 0000000000000000000000000000000000000000..c180743f63d3caffc9d803eab9ae5db19961e15a GIT binary patch literal 197458 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 E1F5WLRR910 literal 0 HcmV?d00001 diff --git a/dialogflow-cx/streaming-detect-intent-partial-response.js b/dialogflow-cx/streaming-detect-intent-partial-response.js new file mode 100644 index 0000000000..6da8439b10 --- /dev/null +++ b/dialogflow-cx/streaming-detect-intent-partial-response.js @@ -0,0 +1,116 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +'use strict'; + +async function main( + projectId, + location, + agentId, + audioFileName, + encoding, + sampleRateHertz, + languageCode +) { + // [START dialogflow_cx_streaming_detect_intent_enable_partial_response] + /** + * TODO(developer): Uncomment these variables before running the sample. + */ + // const projectId = 'my-project'; + // const location = 'global'; + // const agentId = 'my-agent'; + // const audioFileName = '/path/to/audio.raw'; + // const encoding = 'AUDIO_ENCODING_LINEAR_16'; + // const sampleRateHertz = 16000; + // const languageCode = 'en'; + + const {SessionsClient} = require('@google-cloud/dialogflow-cx'); + /** + * Example for regional endpoint: + * const location = 'us-central1' + * const client = new SessionsClient({apiEndpoint: 'us-central1-dialogflow.googleapis.com'}) + */ + const client = new SessionsClient(); + + const fs = require('fs'); + const util = require('util'); + const {Transform, pipeline} = require('stream'); + const pump = util.promisify(pipeline); + + async function streamingDetectIntentPartialResponse() { + const sessionId = Math.random().toString(36).substring(7); + const sessionPath = client.projectLocationAgentSessionPath( + projectId, + location, + agentId, + sessionId + ); + + const request = { + session: sessionPath, + queryInput: { + audio: { + config: { + audio_encoding: encoding, + sampleRateHertz: sampleRateHertz, + singleUtterance: true, + }, + }, + languageCode: languageCode, + }, + enablePartialResponse: true, + }; + + const stream = await client.streamingDetectIntent(); + stream.on('data', data => { + if (data.detectIntentResponse) { + const result = data.detectIntentResponse.queryResult; + + for (const message of result.responseMessages) { + if (message.text) { + console.log(`Agent Response: ${message.text.text}`); + } + } + } + }); + stream.on('error', err => { + console.log(err); + }); + stream.on('end', () => { + /* API call completed */ + }); + stream.write(request); + + // Stream the audio from audio file to Dialogflow. + await pump( + fs.createReadStream(audioFileName), + // Format the audio stream into the request format. + new Transform({ + objectMode: true, + transform: (obj, _, next) => { + next(null, {queryInput: {audio: {audio: obj}}}); + }, + }), + stream + ); + } + streamingDetectIntentPartialResponse(); + // [END dialogflow_cx_streaming_detect_intent_enable_partial_response] +} + +main(...process.argv.slice(2)); +process.on('unhandledRejection', err => { + console.error(err.message); + process.exitCode = 1; +}); diff --git a/dialogflow-cx/test/configure-webhook-to-set-form-parameter-as-optional-or-required.js b/dialogflow-cx/test/configure-webhook-to-set-form-parameter-as-optional-or-required.js new file mode 100644 index 0000000000..8cf58a6abc --- /dev/null +++ b/dialogflow-cx/test/configure-webhook-to-set-form-parameter-as-optional-or-required.js @@ -0,0 +1,68 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +'use strict'; + +// Copyright 2021 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +'use strict'; + +const {assert} = require('chai'); +const {describe, it} = require('mocha'); +const webhook = require('../configure-webhook-to-set-form-parameter-as-optional-or-required'); + +describe('configure optional or required form parameter', () => { + it('should test that webhook sets parameter as required', async () => { + const request = { + body: { + fulfillmentInfo: { + tag: 'optional-or-required', + }, + pageInfo: { + formInfo: { + parameterInfo: [ + { + displayName: 'number', + value: 100, + }, + ], + }, + }, + }, + }; + const temp = JSON.stringify(request); + let response = ''; + + const res = { + send: function (s) { + response = JSON.stringify(s); + }, + }; + + webhook.configureOptionalFormParam(JSON.parse(temp), res); + assert.include(response, '"required":true'); + }); +}); diff --git a/dialogflow-cx/test/create-agent.test.js b/dialogflow-cx/test/create-agent.test.js new file mode 100644 index 0000000000..23d805a113 --- /dev/null +++ b/dialogflow-cx/test/create-agent.test.js @@ -0,0 +1,32 @@ +// // Copyright 2021 Google LLC +// // +// // Licensed under the Apache License, Version 2.0 (the "License"); +// // you may not use this file except in compliance with the License. +// // You may obtain a copy of the License at +// // +// // http://www.apache.org/licenses/LICENSE-2.0 +// // +// // Unless required by applicable law or agreed to in writing, software +// // distributed under the License is distributed on an "AS IS" BASIS, +// // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// // See the License for the specific language governing permissions and +// // limitations under the License. + +// 'use strict'; + +// const {assert} = require('chai'); +// const {describe, it} = require('mocha'); +// const uuid = require('uuid'); +// const execSync = require('child_process').execSync; +// const exec = cmd => execSync(cmd, {encoding: 'utf8'}); + +// describe('create agent', () => { +// const cmd = 'node create-agent.js'; +// const agentId = `temp_agent_${uuid.v4().split('-')[0]}`; +// const projectId = process.env.GCLOUD_PROJECT; + +// it('should create agent', async () => { +// const output = exec(`${cmd} ${projectId} ${agentId}`); +// assert.include(output, agentId); +// }); +// }); diff --git a/dialogflow-cx/test/detect-intent-audio.test.js b/dialogflow-cx/test/detect-intent-audio.test.js new file mode 100644 index 0000000000..e0a3a2745c --- /dev/null +++ b/dialogflow-cx/test/detect-intent-audio.test.js @@ -0,0 +1,40 @@ +// Copyright 2020 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +'use strict'; + +const {assert} = require('chai'); +const {describe, it} = require('mocha'); +const execSync = require('child_process').execSync; +const exec = cmd => execSync(cmd, {encoding: 'utf8'}); + +describe('detect intent with audio input', () => { + const cmd = 'node detect-intent-audio.js'; + + const projectId = process.env.GCLOUD_PROJECT; + const location = 'global'; + const agentId = 'b1808233-450b-4065-9492-bc9b40151641'; + const audioFileName = 'resources/book_a_room.wav'; + const encoding = 'AUDIO_ENCODING_LINEAR_16'; + const sampleRateHertz = 16000; + const languageCode = 'en'; + + it('should response to "book a room"', async () => { + const output = exec( + `${cmd} ${projectId} ${location} ${agentId} ${audioFileName} ${encoding} ${sampleRateHertz} ${languageCode}` + ); + console.log(output); + assert.include(output, '?'); + }); +}); diff --git a/dialogflow-cx/test/detect-intent-disabled-webhook-test.js b/dialogflow-cx/test/detect-intent-disabled-webhook-test.js new file mode 100644 index 0000000000..7ff993ea86 --- /dev/null +++ b/dialogflow-cx/test/detect-intent-disabled-webhook-test.js @@ -0,0 +1,36 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +'use strict'; + +const {assert} = require('chai'); +const {describe, it} = require('mocha'); +const execSync = require('child_process').execSync; +const exec = cmd => execSync(cmd, {encoding: 'utf8'}); + +describe('detect intent with disabled webhook', () => { + const cmd = 'node detect-intent-disabled-webhook.js'; + + const projectId = process.env.GCLOUD_PROJECT; + const location = 'global'; + const agentId = 'b1808233-450b-4065-9492-bc9b40151641'; + const languageCode = 'en'; + + it('should have disableWebhook set to "true"', async () => { + const output = exec( + `${cmd} ${projectId} ${location} ${agentId} 'hello' ${languageCode}` + ); + assert.include(output, 'true'); + }); +}); diff --git a/dialogflow-cx/test/detect-intent-event-test.js b/dialogflow-cx/test/detect-intent-event-test.js new file mode 100644 index 0000000000..e0f4b9f520 --- /dev/null +++ b/dialogflow-cx/test/detect-intent-event-test.js @@ -0,0 +1,38 @@ +// Copyright 2020 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +'use strict'; + +const {assert} = require('chai'); +const {describe, it} = require('mocha'); +const execSync = require('child_process').execSync; +const exec = cmd => execSync(cmd, {encoding: 'utf8'}); + +describe('detect intent with EventInput', () => { + const cmd = 'node detect-intent-event.js'; + + const projectId = process.env.GCLOUD_PROJECT; + const location = 'global'; + const agentId = 'b1808233-450b-4065-9492-bc9b40151641'; + const languageCode = 'en'; + const event = '"No-input Options"'; + + it('should return agent response for custom event', async () => { + const output = exec( + `${cmd} ${projectId} ${location} ${agentId} ${event} ${languageCode}` + ); + console.log('OUTPUT', output); + assert.include(output, "Hi! I'm the Rental Car Virtual Agent"); + }); +}); diff --git a/dialogflow-cx/test/detect-intent-sentiment-analysis-test.js b/dialogflow-cx/test/detect-intent-sentiment-analysis-test.js new file mode 100644 index 0000000000..6b5b0e8f71 --- /dev/null +++ b/dialogflow-cx/test/detect-intent-sentiment-analysis-test.js @@ -0,0 +1,50 @@ +// Copyright 2020 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +'use strict'; + +const {assert} = require('chai'); +const {describe, it} = require('mocha'); +const execSync = require('child_process').execSync; +const exec = cmd => execSync(cmd, {encoding: 'utf8'}); + +describe('detect intent with sentiment analysis', () => { + const cmd = 'node detect-intent-with-sentiment-analysis.js'; + + const projectId = process.env.GCLOUD_PROJECT; + const location = 'global'; + const agentId = 'b1808233-450b-4065-9492-bc9b40151641'; + const languageCode = 'en'; + + it('should detect negative sentiment score of user query', async () => { + const output = exec( + `${cmd} ${projectId} ${location} ${agentId} 'I am not happy' ${languageCode}` + ); + assert.include(output, 'negative'); + }); + + it('should detect positive intent', async () => { + const output = exec( + `${cmd} ${projectId} ${location} ${agentId} 'Perfect!' ${languageCode}` + ); + assert.include(output, 'positive'); + }); + + it('should detect neutral intent', async () => { + const output = exec( + `${cmd} ${projectId} ${location} ${agentId} 'whatever' ${languageCode}` + ); + assert.include(output, 'neutral'); + }); +}); diff --git a/dialogflow-cx/test/detect-intent-synthesize-tts-response-test.js b/dialogflow-cx/test/detect-intent-synthesize-tts-response-test.js new file mode 100644 index 0000000000..4ab8aae9a8 --- /dev/null +++ b/dialogflow-cx/test/detect-intent-synthesize-tts-response-test.js @@ -0,0 +1,40 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +'use strict'; + +const {assert} = require('chai'); +const {describe, it} = require('mocha'); +const execSync = require('child_process').execSync; +const exec = cmd => execSync(cmd, {encoding: 'utf8'}); + +describe('detect intent with TTS response', () => { + const cmd = 'node detect-intent-synthesize-tts-response.js'; + + const projectId = process.env.GCLOUD_PROJECT; + const location = 'global'; + const agentId = 'b1808233-450b-4065-9492-bc9b40151641'; + const sessionId = 'SESSION_ID'; + const testQuery = 'Hello!'; + const languageCode = 'en-US'; + const outputFile = './resources/output.wav'; + + it('should write TTS response to output file', async () => { + const output = exec( + `${cmd} ${projectId} ${location} ${agentId} ${sessionId} ${testQuery} ${languageCode} ${outputFile}` + ); + console.log(output); + assert.include(output, `Audio content written to file: ${outputFile}`); + }); +}); diff --git a/dialogflow-cx/test/detect-intent-text.test.js b/dialogflow-cx/test/detect-intent-text.test.js new file mode 100644 index 0000000000..7fd3bf454a --- /dev/null +++ b/dialogflow-cx/test/detect-intent-text.test.js @@ -0,0 +1,43 @@ +// Copyright 2020 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +'use strict'; + +const {assert} = require('chai'); +const {describe, it} = require('mocha'); +const execSync = require('child_process').execSync; +const exec = cmd => execSync(cmd, {encoding: 'utf8'}); + +describe('detect intent with text input', () => { + const cmd = 'node detect-intent-text.js'; + + const projectId = process.env.GCLOUD_PROJECT; + const location = 'global'; + const agentId = 'b1808233-450b-4065-9492-bc9b40151641'; + const languageCode = 'en'; + + it('should respond to "hello"', async () => { + const output = exec( + `${cmd} ${projectId} ${location} ${agentId} 'hello' ${languageCode}` + ); + assert.include(output, 'How can I assist you today?'); + }); + + it('should respond to "reserve a van"', async () => { + const output = exec( + `${cmd} ${projectId} ${location} ${agentId} 'i need to reserve a van' ${languageCode}` + ); + assert.include(output, 'Where would you like '); + }); +}); diff --git a/dialogflow-cx/test/detect-intent-with-intent-input-test.js b/dialogflow-cx/test/detect-intent-with-intent-input-test.js new file mode 100644 index 0000000000..f2f0e926c9 --- /dev/null +++ b/dialogflow-cx/test/detect-intent-with-intent-input-test.js @@ -0,0 +1,38 @@ +// Copyright 2020 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +'use strict'; + +const {assert} = require('chai'); +const {describe, it} = require('mocha'); +const execSync = require('child_process').execSync; +const exec = cmd => execSync(cmd, {encoding: 'utf8'}); + +describe('detect intent with IntentInput', () => { + const cmd = 'node detect-intent-with-intent-input.js'; + + const projectId = process.env.GCLOUD_PROJECT; + const location = 'global'; + const agentId = 'b1808233-450b-4065-9492-bc9b40151641'; + const languageCode = 'en'; + const intent = '00000000-0000-0000-0000-000000000000'; + + it('should return agent response Default Welcome Intent', async () => { + const output = exec( + `${cmd} ${projectId} ${location} ${agentId} ${intent} ${languageCode}` + ); + console.log(output); + assert.include(output, 'Default Welcome Intent'); + }); +}); diff --git a/dialogflow-cx/test/list-intents.test.js b/dialogflow-cx/test/list-intents.test.js new file mode 100644 index 0000000000..fd27513471 --- /dev/null +++ b/dialogflow-cx/test/list-intents.test.js @@ -0,0 +1,34 @@ +// Copyright 2020 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +'use strict'; + +const {assert} = require('chai'); +const {describe, it} = require('mocha'); +const execSync = require('child_process').execSync; +const exec = cmd => execSync(cmd, {encoding: 'utf8'}); + +describe('list intents', () => { + const cmd = 'node list-intents.js'; + + const projectId = process.env.GCLOUD_PROJECT; + const location = 'global'; + const agentId = 'b1808233-450b-4065-9492-bc9b40151641'; + + it('should List the Intents', async () => { + const output = exec(`${cmd} ${projectId} ${location} ${agentId}`); + assert.include(output, 'Default Welcome Intent'); + assert.include(output, 'Default Negative Intent'); + }); +}); diff --git a/dialogflow-cx/test/list_testcase-results.test.js b/dialogflow-cx/test/list_testcase-results.test.js new file mode 100644 index 0000000000..72d7bf1a74 --- /dev/null +++ b/dialogflow-cx/test/list_testcase-results.test.js @@ -0,0 +1,36 @@ +// Copyright 2021 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +'use strict'; + +const {assert} = require('chai'); +const {describe, it} = require('mocha'); +const execSync = require('child_process').execSync; +const exec = cmd => execSync(cmd, {encoding: 'utf8'}); +const dialogflow = require('@google-cloud/dialogflow-cx'); + +describe('Test filtering results', async () => { + const cmd = 'node list-testcase-results.js'; + const agentId = process.env.AGENT_ID; + const testId = process.env.TEST_ID; + const location = 'global'; + const agentClient = new dialogflow.AgentsClient(); + const projectId = + process.env.AGENT_PROJECT_ID || (await agentClient.getProjectId()); + + it('should return filtered test results', async () => { + const output = exec(`${cmd} ${projectId} ${agentId} ${testId} ${location}`); + assert.include(output, testId); + }); +}); diff --git a/dialogflow-cx/test/long-running-operation.test.js b/dialogflow-cx/test/long-running-operation.test.js new file mode 100644 index 0000000000..9c60c04faa --- /dev/null +++ b/dialogflow-cx/test/long-running-operation.test.js @@ -0,0 +1,62 @@ +// Copyright 2021 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +'use strict'; + +const {assert} = require('chai'); +const {describe, before, it, after} = require('mocha'); +const execSync = require('child_process').execSync; +const uuid = require('uuid'); +const dialogflow = require('@google-cloud/dialogflow-cx'); +const exec = cmd => execSync(cmd, {encoding: 'utf8'}); +const location = 'global'; +let agentId = ''; +let agentPath = ''; + +describe('update intent', async () => { + const agentClient = new dialogflow.AgentsClient(); + const projectId = await agentClient.getProjectId(); + const agentDisplayName = `temp_agent_${uuid.v4().split('-')[0]}`; + const parent = 'projects/' + projectId + '/locations/' + location; + const cmd = 'node long-running-operation.js'; + + before('create an agent and get agent id', async () => { + // The path to identify the agent that owns the intents. + + const agent = { + displayName: agentDisplayName, + defaultLanguageCode: 'en', + timeZone: 'America/Los_Angeles', + }; + + const request = { + agent, + parent, + }; + + const [agentResponse] = await agentClient.createAgent(request); + + agentPath = agentResponse.name; + agentId = agentPath.split('/')[5]; + }); + + after('delete Agent', async () => { + agentClient.deleteAgent({name: agentPath}); + }); + + it('should export agent', async () => { + const output = exec(`${cmd} ${projectId} ${agentId} ${location}`); + assert.include(output, 'agentContent'); + }); +}); diff --git a/dialogflow-cx/test/page-management.test.js b/dialogflow-cx/test/page-management.test.js new file mode 100644 index 0000000000..f3898c0298 --- /dev/null +++ b/dialogflow-cx/test/page-management.test.js @@ -0,0 +1,74 @@ +// Copyright 2021 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the 'License'); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an 'AS IS' BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +'use strict'; + +const {assert} = require('chai'); +const {describe, it} = require('mocha'); +const uuid = require('uuid'); +const execSync = require('child_process').execSync; +const exec = cmd => execSync(cmd, {encoding: 'utf8'}); + +describe('should test page management functions', async () => { + const location = 'global'; + const projectId = process.env.GCLOUD_PROJECT; + const flowId = '00000000-0000-0000-0000-000000000000'; + const pageName = `temp_page_${uuid.v4()}`; + const agentID = 'b1808233-450b-4065-9492-bc9b40151641'; + let pageID = ''; + + it('should create a page', async () => { + const cmd = 'node create-page.js'; + const temp = `${cmd} ${projectId} ${agentID} ${flowId} ${location} ${pageName}`; + const output = exec(temp); + assert.include(output, pageName); + }); + + it('should list pages', async () => { + const cmd = 'node list-page.js'; + const output = exec(`${cmd} ${projectId} ${agentID} ${flowId} global`); + assert.include(output, pageName); + }); + + it('should delete a page', async () => { + const {PagesClient, protos} = require('@google-cloud/dialogflow-cx'); + const pagesClient = new PagesClient(); + const listPageRequest = + new protos.google.cloud.dialogflow.cx.v3.ListPagesRequest(); + + listPageRequest.parent = + 'projects/' + + projectId + + '/locations/' + + location + + '/agents/' + + agentID + + '/flows/' + + flowId; + listPageRequest.languageCode = 'en'; + + const response = await pagesClient.listPages(listPageRequest); + + for (let i = 0; i < response[0].length; i++) { + if (response[0][i].displayName === pageName) { + pageID = response[0][i].name.split('/')[9]; + } + } + + const cmd = 'node delete-page.js'; + const temp = `${cmd} ${projectId} ${agentID} ${flowId} ${pageID} global`; + const output = exec(temp); + assert.strictEqual(output.includes('['), true); + }); +}); diff --git a/dialogflow-cx/test/quickstart.js b/dialogflow-cx/test/quickstart.js new file mode 100644 index 0000000000..eca2311972 --- /dev/null +++ b/dialogflow-cx/test/quickstart.js @@ -0,0 +1,44 @@ +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// ** This file is automatically generated by gapic-generator-typescript. ** +// ** https://github.com/googleapis/gapic-generator-typescript ** +// ** All changes to this file may be overwritten. ** + +'use strict'; + +const path = require('path'); +const {assert} = require('chai'); +const cp = require('child_process'); +const {describe, it} = require('mocha'); + +const execSync = cmd => cp.execSync(cmd, {encoding: 'utf-8'}); + +const cwd = path.join(__dirname, '..'); + +const project = process.env.GCLOUD_PROJECT; + +describe('Quickstart', () => { + it('should run quickstart', async () => { + try { + // TODO: write an actual functional test: + execSync( + `node ./quickstart.js ${project} global my-agent audio.raw AUDIO_ENCODING_LINEAR_16 16000 en`, + {cwd} + ); + assert('unreachable'); + } catch (err) { + assert.match(err.message, /no such file or directory, open 'audio.raw/); + } + }); +}); diff --git a/dialogflow-cx/test/streaming-detect-intent-partial-response-test.js b/dialogflow-cx/test/streaming-detect-intent-partial-response-test.js new file mode 100644 index 0000000000..e0c414c78e --- /dev/null +++ b/dialogflow-cx/test/streaming-detect-intent-partial-response-test.js @@ -0,0 +1,39 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +'use strict'; + +const {assert} = require('chai'); +const {describe, it} = require('mocha'); +const execSync = require('child_process').execSync; +const exec = cmd => execSync(cmd, {encoding: 'utf8'}); + +describe('streaming detect intent with partial response', () => { + const cmd = 'node streaming-detect-intent-partial-response.js'; + + const projectId = process.env.GCLOUD_PROJECT; + const location = 'global'; + const agentId = '7e4c5542-823b-4e28-bd02-d37016826e9e'; + const audioFileName = 'resources/book_a_room.wav'; + const encoding = 'AUDIO_ENCODING_LINEAR_16'; + const sampleRateHertz = 16000; + const languageCode = 'en'; + + it('should respond to with partial response', async () => { + const output = exec( + `${cmd} ${projectId} ${location} ${agentId} ${audioFileName} ${encoding} ${sampleRateHertz} ${languageCode}` + ); + assert.include(output, 'One moment while I try to help!'); + }); +}); diff --git a/dialogflow-cx/test/update-intent.test.js b/dialogflow-cx/test/update-intent.test.js new file mode 100644 index 0000000000..63e44cf664 --- /dev/null +++ b/dialogflow-cx/test/update-intent.test.js @@ -0,0 +1,76 @@ +// Copyright 2021 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +'use strict'; + +const {assert} = require('chai'); +const {describe, before, it, after} = require('mocha'); +const execSync = require('child_process').execSync; +const uuid = require('uuid'); +const dialogflow = require('@google-cloud/dialogflow-cx'); +const exec = cmd => execSync(cmd, {encoding: 'utf8'}); +const intentId = []; +const location = 'global'; +let agentId = ''; +let agentPath = ''; + +describe('update intent', async () => { + const intentClient = new dialogflow.IntentsClient(); + const agentClient = new dialogflow.AgentsClient(); + const projectId = await agentClient.getProjectId(); + const displayName = `fake_display_name_${uuid.v4().split('-')[0]}`; + const agentDisplayName = `temp_agent_${uuid.v4().split('-')[0]}`; + const parent = 'projects/' + projectId + '/locations/' + location; + const cmd = 'node update-intent.js'; + + before('get intent ID and agent ID', async () => { + // The path to identify the agent that owns the intents. + + const agent = { + displayName: agentDisplayName, + defaultLanguageCode: 'en', + timeZone: 'America/Los_Angeles', + }; + + const request = { + agent, + parent, + }; + + const [agentResponse] = await agentClient.createAgent(request); + + agentPath = agentResponse.name; + agentId = agentPath.split('/')[5]; + + const intentRequest = { + parent: agentPath, + }; + + const [response] = await intentClient.listIntents(intentRequest); + response.forEach(intent => { + intentId.push(intent.name.split('/')[7]); + }); + }); + + after('delete Agent', async () => { + agentClient.deleteAgent({name: agentPath}); + }); + + it('should update an intent using fieldmasks', async () => { + const output = exec( + `${cmd} ${projectId} ${agentId} ${intentId[0]} ${location} ${displayName}` + ); + assert.include(output, displayName); + }); +}); diff --git a/dialogflow-cx/test/webhook-configure-session-parameters-test.js b/dialogflow-cx/test/webhook-configure-session-parameters-test.js new file mode 100644 index 0000000000..a03209a5e7 --- /dev/null +++ b/dialogflow-cx/test/webhook-configure-session-parameters-test.js @@ -0,0 +1,58 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +'use strict'; + +// Copyright 2021 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +'use strict'; + +const {assert} = require('chai'); +const {describe, it} = require('mocha'); +const webhook = require('../webhook-configure-session-parameters'); + +describe('configure session parameters', () => { + it('should test that webhook adds new session parameter', async () => { + const request = { + body: { + fulfillmentInfo: { + tag: 'configure-session-parameter', + }, + }, + }; + const temp = JSON.stringify(request); + let response = ''; + + const res = { + send: function (s) { + response = JSON.stringify(s); + }, + }; + + webhook.configureSessionParams(JSON.parse(temp), res); + assert.include(response, 'orderNumber'); + }); +}); diff --git a/dialogflow-cx/test/webhook-validate-form-parameter-test.js b/dialogflow-cx/test/webhook-validate-form-parameter-test.js new file mode 100644 index 0000000000..0a4d0f3ce9 --- /dev/null +++ b/dialogflow-cx/test/webhook-validate-form-parameter-test.js @@ -0,0 +1,58 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +'use strict'; + +// Copyright 2021 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +'use strict'; + +const {assert} = require('chai'); +const {describe, it} = require('mocha'); +const webhook = require('../webhook-validate-form-parameter'); + +describe('configure session parameters', () => { + it('should test that webhook invalidates form parameter', async () => { + const request = { + body: { + fulfillmentInfo: { + tag: 'invalidate-form-parameter', + }, + }, + }; + const temp = JSON.stringify(request); + let response = ''; + + const res = { + send: function (s) { + response = JSON.stringify(s); + }, + }; + + webhook.validateParameter(JSON.parse(temp), res); + assert.include(response, 'INVALID'); + }); +}); diff --git a/dialogflow-cx/test/webhook.test.js b/dialogflow-cx/test/webhook.test.js new file mode 100644 index 0000000000..cf3e338f40 --- /dev/null +++ b/dialogflow-cx/test/webhook.test.js @@ -0,0 +1,45 @@ +// Copyright 2021 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +'use strict'; + +const {assert} = require('chai'); +const {describe, it} = require('mocha'); +const webhook = require('../webhooks'); + +const request = { + body: { + fulfillmentInfo: { + tag: 'Default Welcome Intent', + }, + text: 'hi', + languageCode: 'en', + }, +}; + +describe('create agent', () => { + it('should test webhook returns correct response', async () => { + const temp = JSON.stringify(request); + let response = ''; + + const res = { + send: function (s) { + response = JSON.stringify(s); + }, + }; + + webhook.handleWebhook(JSON.parse(temp), res); + assert.include(response, 'Hello from a GCF Webhook'); + }); +}); diff --git a/dialogflow-cx/update-intent.js b/dialogflow-cx/update-intent.js new file mode 100644 index 0000000000..129e4ff4f6 --- /dev/null +++ b/dialogflow-cx/update-intent.js @@ -0,0 +1,65 @@ +// Copyright 2021 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +'use strict'; + +async function main(projectId, agentId, intentId, location, displayName) { + // [START dialogflow_cx_update_intent] + + const {IntentsClient} = require('@google-cloud/dialogflow-cx'); + + const intentClient = new IntentsClient(); + + //TODO(developer): Uncomment these variables before running the sample. + // const projectId = 'your-project-id'; + // const agentId = 'your-agent-id'; + // const intentId = 'your-intent-id'; + // const location = 'your-location'; + // const displayName = 'your-display-name'; + + async function updateIntent() { + const agentPath = intentClient.projectPath(projectId); + const intentPath = `${agentPath}/locations/${location}/agents/${agentId}/intents/${intentId}`; + + //Gets the intent from intentPath + const intent = await intentClient.getIntent({name: intentPath}); + intent[0].displayName = displayName; + + //Specifies what is being updated + const updateMask = { + paths: ['display_name'], + }; + + const updateIntentRequest = { + intent: intent[0], + updateMask, + languageCode: 'en', + }; + + //Send the request for update the intent. + const result = await intentClient.updateIntent(updateIntentRequest); + console.log(result); + } + + updateIntent(); + + // [END dialogflow_cx_update_intent] +} + +process.on('unhandledRejection', err => { + console.error(err.message); + process.exitCode = 1; +}); + +main(...process.argv.slice(2)); diff --git a/dialogflow-cx/webhook-configure-session-parameters.js b/dialogflow-cx/webhook-configure-session-parameters.js new file mode 100644 index 0000000000..b4b1199be9 --- /dev/null +++ b/dialogflow-cx/webhook-configure-session-parameters.js @@ -0,0 +1,35 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +/** + * Configures a webhook to set a session parameter + */ + +// [START dialogflow_cx_v3_webhook_configure_session_parameters] + +exports.configureSessionParams = (request, response) => { + // Session parameter configured by the webhook + const orderNumber = 123; + + const jsonResponse = { + sessionInfo: { + parameters: { + orderNumber: orderNumber, + }, + }, + }; + + response.send(jsonResponse); +}; +// [END dialogflow_cx_v3_webhook_configure_session_parameters] diff --git a/dialogflow-cx/webhook-validate-form-parameter.js b/dialogflow-cx/webhook-validate-form-parameter.js new file mode 100644 index 0000000000..0cde7dce74 --- /dev/null +++ b/dialogflow-cx/webhook-validate-form-parameter.js @@ -0,0 +1,48 @@ +// Copyright 2022 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +/** + * Uses a webhook to validate or invalidate form parameters. + */ + +// [START dialogflow_cx_v3_webhook_validate_form_parameter] + +exports.validateParameter = (request, response) => { + // Webhook will validate or invalidate parameter based on logic configured by the user. + // Access parameter values through the webhook request via `request.body.pageInfo.formInfo.parameterInfo[]` + + const jsonResponse = { + page_info: { + form_info: { + parameter_info: [ + { + displayName: 'orderNumber', + required: true, + state: 'INVALID', + value: 123, + }, + ], + }, + }, + sessionInfo: { + parameters: { + // Set session parameter to null if the form parameter is 'INVALID' and your agent needs to reprompt the user + orderNumber: null, + }, + }, + }; + + response.send(jsonResponse); +}; +// [END dialogflow_cx_v3_webhook_validate_form_parameter] diff --git a/dialogflow-cx/webhooks.js b/dialogflow-cx/webhooks.js new file mode 100644 index 0000000000..9d687394bd --- /dev/null +++ b/dialogflow-cx/webhooks.js @@ -0,0 +1,46 @@ +// Copyright 2021 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +'use strict'; + +// [START dialogflow_cx_webhook] + +exports.handleWebhook = (request, response) => { + const tag = request.body.fulfillmentInfo.tag; + let text = ''; + + if (tag === 'Default Welcome Intent') { + text = 'Hello from a GCF Webhook'; + } else if (tag === 'get-name') { + text = 'My name is Flowhook'; + } else { + text = `There are no fulfillment responses defined for "${tag}"" tag`; + } + + const jsonResponse = { + fulfillment_response: { + messages: [ + { + text: { + //fulfillment text response to be sent to the agent + text: [text], + }, + }, + ], + }, + }; + + response.send(jsonResponse); +}; +// [END dialogflow_cx_webhook]