dialogflow-cx/validate_form_sample.py (148 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: Form validation 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 build_fulfillment(text=None, webhook=None, tag=None):
"""Helper method that provides a Fulfillment based on text, webhook and tag."""
return cx.Fulfillment(
webhook=webhook,
tag=tag,
messages=[cx.ResponseMessage(text=cx.ResponseMessage.Text(text=text))],
)
class ValidateFormSample(ds.DialogflowSample):
"""Sets up a Dialogflow agent that uses a webhook to validate a form parameter."""
_WEBHOOK_DISPLAY_NAME = "Validate form"
_INTENT_DISPLAY_NAME = "go-to-example-page"
_INTENT_TRAINING_PHRASES_TEXT = ["trigger intent", "trigger the intent"]
_PAGE_DISPLAY_NAME = "Main Page"
_PAGE_ENTRY_FULFILLMENT_TEXT = f"Entering {_PAGE_DISPLAY_NAME}"
_PAGE_WEBHOOK_ENTRY_TAG = "validate_form"
_PAGE_PROMPT = "What is your age?"
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
)
self.intent_delegator = dg.IntentDelegator(
self,
display_name=self._INTENT_DISPLAY_NAME,
training_phrases=self._INTENT_TRAINING_PHRASES_TEXT,
)
self.page_delegator = dg.FulfillmentPageDelegator(
self,
display_name=self._PAGE_DISPLAY_NAME,
entry_fulfillment_text=self._PAGE_ENTRY_FULFILLMENT_TEXT,
)
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,
)
self.page_delegator.add_parameter(
display_name="age",
required=True,
entity_type="projects/-/locations/-/agents/-/entityTypes/sys.number",
fill_behavior=cx.Form.Parameter.FillBehavior(
initial_prompt_fulfillment=build_fulfillment(text=[self._PAGE_PROMPT])
),
default_value=None,
redact=False,
is_list=False,
)
self.page_delegator.append_transition_route(
target_page=self.start_flow_delegator.start_page_name,
condition="$page.params.status = FINAL",
trigger_fulfillment=build_fulfillment(
webhook=self.webhook_delegator.webhook.name,
tag=self._PAGE_WEBHOOK_ENTRY_TAG,
text=["Form Filled"],
),
)
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 Validate Form 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 = ValidateFormSample(**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}"
)