dialogflow-cx/delegators/intent_delegator.py (81 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 Intents API interactions."""
from typing import List
import dialogflow_sample as ds
import google.api_core.exceptions
import google.cloud.dialogflowcx as cx
from .client_delegator import ClientDelegator
class IntentDelegator(ClientDelegator):
"""Class for organizing interactions with the Dialogflow Intents API."""
_CLIENT_CLASS = cx.IntentsClient
def __init__(
self,
controller: ds.DialogflowSample,
training_phrases: List[cx.Intent.TrainingPhrase.Part],
**kwargs,
) -> None:
self._intent = None
self.training_phrases = training_phrases
super().__init__(controller, **kwargs)
@property
def intent(self):
"""Intent set in Dialogflow."""
if not self._intent:
raise RuntimeError("Intent not yet created")
return self._intent
def get_intent(self):
"""Create and Intent object to be pushed to the API."""
training_phrases = []
for training_phrase_text in self.training_phrases:
training_phrase = cx.Intent.TrainingPhrase(
{
"parts": [{"text": f"{training_phrase_text}"}],
"id": "",
"repeat_count": 1,
}
)
training_phrases.append(training_phrase)
return cx.Intent(
{
"display_name": self.display_name,
"training_phrases": training_phrases,
}
)
def setup(self):
"""Initializes the intent delegator."""
intent = self.get_intent()
try:
self._intent = self.client.create_intent(
parent=self.parent,
intent=intent,
)
except google.api_core.exceptions.AlreadyExists:
request = cx.ListIntentsRequest(
parent=self.parent,
)
for intent in self.client.list_intents(request=request):
if intent.display_name == self.display_name:
request = cx.GetIntentRequest(
name=intent.name,
)
self._intent = self.client.get_intent(request=request)
return
def tear_down(self):
"""Destroys the Dialogflow intent."""
request = cx.DeleteIntentRequest(name=self.intent.name)
try:
self.client.delete_intent(request=request)
self._intent = None
except google.api_core.exceptions.NotFound:
pass
class AnnotatedIntentDelegator(IntentDelegator):
"""IntentDelegator with annotated spans of text for parameter detection."""
def __init__(
self,
controller: ds.DialogflowSample,
training_phrases: List[cx.Intent.TrainingPhrase.Part],
parameters: List[cx.Intent.Parameter],
**kwargs,
) -> None:
super().__init__(controller, training_phrases=training_phrases, **kwargs)
self.parameters = parameters
def get_intent(self):
"""Create and Intent object to be pushed to the API, including parameters."""
return cx.Intent(
{
"display_name": self.display_name,
"training_phrases": self.training_phrases,
"parameters": self.parameters,
}
)