dialogflow-cx/set_session_param_sample.py (155 lines of code) (raw):
# 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.
"""Dialogflow CX Sample: Set session param with a webhook."""
import delegators as dg
import dialogflow_sample as ds
import google.cloud.dialogflowcx as cx
from webhook.main import get_webhook_uri
def get_expected_response():
"""Gets the response expected from the webhook."""
return "Session parameter set"
class SetSessionParamSample(ds.DialogflowSample):
"""Sets up a Dialogflow agent that uses a webhook to provide an entry fulfillment."""
_WEBHOOK_DISPLAY_NAME = "Set Session Parameter"
_INTENT_DISPLAY_NAME = "set-session-param"
_INTENT_TRAINING_PHRASE_TEXT = "set session parameter API to Dialogflow"
_PAGE_DISPLAY_NAME = "Main Page"
_PAGE_ENTRY_FULFILLMENT_TEXT = f"Entering {_PAGE_DISPLAY_NAME}"
_PAGE_WEBHOOK_ENTRY_TAG = "set_session_param"
def __init__(
self,
project_id=None,
quota_project_id=None,
webhook_uri=None,
agent_display_name=None,
):
super().__init__()
if not quota_project_id:
quota_project_id = project_id
self.set_auth_delegator(
dg.AuthDelegator(
self,
project_id=project_id,
quota_project_id=quota_project_id,
)
)
self.set_agent_delegator(
dg.AgentDelegator(self, display_name=agent_display_name)
)
self.webhook_delegator = dg.WebhookDelegator(
self, display_name=self._WEBHOOK_DISPLAY_NAME, uri=webhook_uri
)
training_phrases = [
cx.Intent.TrainingPhrase(
repeat_count=1,
parts=[
cx.Intent.TrainingPhrase.Part(text="Set session parameter "),
cx.Intent.TrainingPhrase.Part(
text="session_param",
parameter_id="key",
),
cx.Intent.TrainingPhrase.Part(text=" to "),
cx.Intent.TrainingPhrase.Part(
text="value",
parameter_id="val",
),
],
)
]
parameters = [
cx.Intent.Parameter(
id="key",
entity_type="projects/-/locations/-/agents/-/entityTypes/sys.any",
),
cx.Intent.Parameter(
id="val",
entity_type="projects/-/locations/-/agents/-/entityTypes/sys.any",
),
]
self.intent_delegator = dg.AnnotatedIntentDelegator(
self,
display_name=self._INTENT_DISPLAY_NAME,
training_phrases=training_phrases,
parameters=parameters,
)
self.page_delegator = dg.FulfillmentPageDelegator(
self,
display_name=self._PAGE_DISPLAY_NAME,
entry_fulfillment_text=self._PAGE_ENTRY_FULFILLMENT_TEXT,
webhook_delegator=self.webhook_delegator,
tag=self._PAGE_WEBHOOK_ENTRY_TAG,
)
self.set_start_flow_delegator(dg.StartFlowDelegator(self))
self.set_session_delegator(dg.SessionsDelegator(self))
self.start_page_delegator = dg.StartPageDelegator(self)
def setup(self, wait=1):
"""Initializes the sample by communicating with the Dialogflow API."""
self.agent_delegator.setup()
self.webhook_delegator.setup()
self.intent_delegator.setup()
self.page_delegator.setup()
self.start_flow_delegator.setup()
self.start_flow_delegator.append_transition_route(
target_page=self.page_delegator.page.name,
intent=self.intent_delegator.intent.name,
)
super().setup(wait=wait)
def tear_down(self):
"""Deletes the sample components via the Dialogflow API."""
self.page_delegator.tear_down()
self.start_flow_delegator.tear_down()
self.intent_delegator.tear_down()
self.webhook_delegator.tear_down()
self.agent_delegator.tear_down()
if __name__ == "__main__":
import argparse
parser = argparse.ArgumentParser(
description="Setup Dialogflow CX basic webhook sample"
)
parser.add_argument(
"--agent-display-name",
help="Display name of the Dialogflow CX agent",
required=True,
)
parser.add_argument(
"--project-id",
help="Google Cloud project to create/use Dialogflow CX in",
required=True,
)
parser.add_argument(
"--quota-project-id",
help="Quota project, if different from project-id",
default=None,
)
parser.add_argument(
"--user-input",
nargs="+",
help="User text utterances",
required=False,
default=[],
)
parser.add_argument(
"--tear-down", action="store_true", help="Destroy the agent after run?"
)
group = parser.add_mutually_exclusive_group(required=True)
group.add_argument(
"--webhook-uri",
help=(
"Webhook URL for the Dialogflow CX to use. "
"Format: https://<region>-<project_id>.cloudfunctions.net/<webhook_name>"
),
)
group.add_argument(
"--build-uuid", help="Infer the webhook URI from the build_uuid and project id"
)
args = vars(parser.parse_args())
if args["build_uuid"]:
assert not args["webhook_uri"]
args["webhook_uri"] = get_webhook_uri(
args["project_id"], args.pop("build_uuid")
)
tear_down = args.pop("tear_down")
user_input = args.pop("user_input", [])
sample = SetSessionParamSample(**args)
sample.setup()
sample.run(user_input)
if tear_down:
sample.tear_down()
else:
print(
"Agent sample available at: "
f"https://dialogflow.cloud.google.com/cx/{sample.start_flow_delegator.flow.name}"
)