Managing Entities within an EntityType is pretty easy, you can only delete, create, or update - all in batch. To start, you always need to get the parent EntityType or its name. You can grab this with:
entity_type_UUID = "ab3dasd2-4d23-4da4-b124-75337b48e35d"
entity_type_client = dialogflow.EntityTypesClient()
full_entity_type_path = entity_type_client.entity_type_path(dialogflow_project_id(), entity_type_UUID)
entity_type = entity_type_client.get_entity_type(full_entity_type_path)
Like most things with DialogFlow, in order to grab the EntityType, you need to get what the documentation refers to as the "name", which is really a UUID and is not clear how to get.
As normal, the "name" is really a UUID and not the display name (which is shown as the "entity name" in the visual admin), it is the unique identifier. You can go about grabbing this several different ways.
When you are just testing out functionality, you can manually pull up the "Edit EntityType" page in the DialogFlow admin. The UUID is then the last part of the url:
https://dialogflow.cloud.google.com/#/agent/xxxxx/editEntity/1c681506-fca2-4fd4-9eac-09eed28507ad/
This works just fine with a limited amount of intents, but it doesn't work if you need to get something dynamically, or a large number. It also doesn't work if you ever re-create the agent or the entity type, or want to reuse the code on another agent, since it would then change.
It's much better long term (at least for my purposes) to get the entity type via the display name, which will also be the same. To do this you grab all the entity types in your agent and loop through them comparing the display names to the one you are looking for.
entity_type_client = dialogflow.EntityTypesClient()
parent = entity_type_client.project_agent_path(dialogflow_project_id())
entity_type_to_find_display_name = "[Display Name]" #I.E. "food_cut" in the example above
entity_types = entity_type_client.list_entity_types(parent)
entity_type_to_find = None
for entity_type in entity_types:
if entity_type_to_find_display_name == entity_type.display_name:
entity_type_to_find = entity_type
if entity_type_to_find:
#Do Stuff
Once you have the entity type, you can grab the uuid name with:
entity_type_to_find.name
Finally we can create and delete Entities!
To add an Entity to an EntityType, you need to use the Entity object, which is just the "value" (or "name") and an array of the synonyms.
dialogflow.types.EntityType.Entity(
value = "Entity Name",
synonyms = ["Synonm 1", "Synonm 2", "Synonm 3"]
)
You then pass that into the "batch_create_entities()" call.
entity_type_client = dialogflow.EntityTypesClient()
entity_to_add = dialogflow.types.EntityType.Entity(
value = "Entity Name",
synonyms = ["Entity Syn 1", "Entity Syn 2", "Entity Syn 3"]
)
response = entity_type_client.batch_create_entities(entity_type_UUID, [entity_to_add])
This also works with multiple entities.
entity_type_client = dialogflow.EntityTypesClient()
response = entity_type_client.batch_create_entities(entity_type_UUID, [entity_to_add1, entity_to_add2, entity_to_add3])
Updating entites works the exact same way, just pass it into the "batch_update_entities" funtction instead.
entity_type_client = dialogflow.EntityTypesClient()
entity_to_update = dialogflow.types.EntityType.Entity(
value = "Entity Name",
synonyms = ["Entity Syn 1", "Entity Syn 2", "Entity Syn 3"]
)
response = entity_type_client.batch_update_entities(entity_type_UUID, [entity_to_update])
Strangly, if you call "batch_create_entities()" and the entity already exists it will just update it. And if you call "batch_update_entities()" and the entity doesn't exist, it just creates it. I honestly have no idea what the difference between the two is.
As of April 2nd, 2020, updating the entities does not do a full update, it just adds to them. So you can't remove entities using that method. This really comes into play for the synonyms.
I.E. if dialogflow has:
EntityToUpdate: ["Syn1"]
and I pass in:
EntityToUpdate: ["Syn2", "Syn3", "Syn4"]
It currently results in:
EntityToUpdate: ["Syn1", "Syn2", "Syn3", "Syn4"]
So if you only want it to have the new synonyms, you need to delete and re-create it.
One we have the entity name, it is relatively easy to delete the entities. You just need to know the name of the entity (and for once it is just the actual name, not a UUID) and pass it into the delete_entites() function. All entities work is done in bulk, so it's always an array.
entity_type_client = dialogflow.EntityTypesClient()
entity_to_delete = "Entity Name" #In the Above Screenshot, "Zucchini" or "Pea Pods" would be the name
response = entity_type_client.batch_delete_entities(entity_type_UUID, [entity_to_delete])
And for multiples ones just pass them all in.
entity_type_client = dialogflow.EntityTypesClient()
entity_to_delete1 = "Entity Name 1"
entity_to_delete2 = "Entity Name 2"
entity_to_delete3 = "Entity Name 3"
response = entity_type_client.batch_delete_entities(entity_type_UUID, [entity_to_delete1, entity_to_delete2, entity_to_delete3])
And if you want to just delete all entities in an EntityType you can do the following:
entity_type_client = dialogflow.EntityTypesClient()
full_entity_type_path = entity_type_client.entity_type_path(dialogflow_project_id(), entity_type_UUID)
entity_type = entity_type_client.get_entity_type(full_entity_type_path)
entities = entity_type.entities
entity_values = [entity.value for entity in entities]
response = entity_type_client.batch_delete_entities(entity_type_UUID, entity_values)