---
# ----------------------------------------------------------------------------
#
#     ***     AUTO GENERATED CODE    ***    Type: MMv1     ***
#
# ----------------------------------------------------------------------------
#
#     This file is automatically generated by Magic Modules and manual
#     changes will be clobbered when the file is regenerated.
#
#     Please read more about how to change this file in
#     .github/CONTRIBUTING.md.
#
# ----------------------------------------------------------------------------
subcategory: "Dialogflow"
description: |-
  A Dialogflow agent is a virtual agent that handles conversations with your end-users.
---

# google_dialogflow_agent

A Dialogflow agent is a virtual agent that handles conversations with your end-users. It is a natural language
understanding module that understands the nuances of human language. Dialogflow translates end-user text or audio
during a conversation to structured data that your apps and services can understand. You design and build a Dialogflow
agent to handle the types of conversations required for your system.


To get more information about Agent, see:

* [API documentation](https://cloud.google.com/dialogflow/docs/reference/rest/v2/projects/agent)
* How-to Guides
    * [Official Documentation](https://cloud.google.com/dialogflow/docs/)

<div class = "oics-button" style="float: right; margin: 0 0 -15px">
  <a href="https://console.cloud.google.com/cloudshell/open?cloudshell_git_repo=https%3A%2F%2Fgithub.com%2Fterraform-google-modules%2Fdocs-examples.git&cloudshell_image=gcr.io%2Fcloudshell-images%2Fcloudshell%3Alatest&cloudshell_print=.%2Fmotd&cloudshell_tutorial=.%2Ftutorial.md&cloudshell_working_dir=dialogflow_agent_full&open_in_editor=main.tf" target="_blank">
    <img alt="Open in Cloud Shell" src="//gstatic.com/cloudssh/images/open-btn.svg" style="max-height: 44px; margin: 32px auto; max-width: 100%;">
  </a>
</div>
## Example Usage - Dialogflow Agent Full


```hcl
resource "google_dialogflow_agent" "full_agent" {
  display_name = "dialogflow-agent"
  default_language_code = "en"
  supported_language_codes = ["fr","de","es"]
  time_zone = "America/New_York"
  description = "Example description."
  avatar_uri = "https://cloud.google.com/_static/images/cloud/icons/favicons/onecloud/super_cloud.png"
  enable_logging = true
  match_mode = "MATCH_MODE_ML_ONLY"
  classification_threshold = 0.3
  api_version = "API_VERSION_V2_BETA_1"
  tier = "TIER_STANDARD"
}
```

## Argument Reference

The following arguments are supported:


* `display_name` -
  (Required)
  The name of this agent.

* `default_language_code` -
  (Required)
  The default language of the agent as a language tag. [See Language Support](https://cloud.google.com/dialogflow/docs/reference/language)
  for a list of the currently supported language codes. This field cannot be updated after creation.

* `time_zone` -
  (Required)
  The time zone of this agent from the [time zone database](https://www.iana.org/time-zones), e.g., America/New_York,
  Europe/Paris.


- - -


* `supported_language_codes` -
  (Optional)
  The list of all languages supported by this agent (except for the defaultLanguageCode).

* `description` -
  (Optional)
  The description of this agent. The maximum length is 500 characters. If exceeded, the request is rejected.

* `avatar_uri` -
  (Optional)
  The URI of the agent's avatar, which are used throughout the Dialogflow console. When an image URL is entered
  into this field, the Dialogflow will save the image in the backend. The address of the backend image returned
  from the API will be shown in the [avatarUriBackend] field.

* `enable_logging` -
  (Optional)
  Determines whether this agent should log conversation queries.

* `match_mode` -
  (Optional)
  Determines how intents are detected from user queries.
  * MATCH_MODE_HYBRID: Best for agents with a small number of examples in intents and/or wide use of templates
  syntax and composite entities.
  * MATCH_MODE_ML_ONLY: Can be used for agents with a large number of examples in intents, especially the ones
  using @sys.any or very large developer entities.
  Possible values are: `MATCH_MODE_HYBRID`, `MATCH_MODE_ML_ONLY`.

* `classification_threshold` -
  (Optional)
  To filter out false positive results and still get variety in matched natural language inputs for your agent,
  you can tune the machine learning classification threshold. If the returned score value is less than the threshold
  value, then a fallback intent will be triggered or, if there are no fallback intents defined, no intent will be
  triggered. The score values range from 0.0 (completely uncertain) to 1.0 (completely certain). If set to 0.0, the
  default of 0.3 is used.

* `api_version` -
  (Optional)
  API version displayed in Dialogflow console. If not specified, V2 API is assumed. Clients are free to query
  different service endpoints for different API versions. However, bots connectors and webhook calls will follow
  the specified API version.
  * API_VERSION_V1: Legacy V1 API.
  * API_VERSION_V2: V2 API.
  * API_VERSION_V2_BETA_1: V2beta1 API.
  Possible values are: `API_VERSION_V1`, `API_VERSION_V2`, `API_VERSION_V2_BETA_1`.

* `tier` -
  (Optional)
  The agent tier. If not specified, TIER_STANDARD is assumed.
  * TIER_STANDARD: Standard tier.
  * TIER_ENTERPRISE: Enterprise tier (Essentials).
  * TIER_ENTERPRISE_PLUS: Enterprise tier (Plus).
  NOTE: Due to consistency issues, the provider will not read this field from the API. Drift is possible between
  the Terraform state and Dialogflow if the agent tier is changed outside of Terraform.
  Possible values are: `TIER_STANDARD`, `TIER_ENTERPRISE`, `TIER_ENTERPRISE_PLUS`.

* `project` - (Optional) The ID of the project in which the resource belongs.
    If it is not provided, the provider project is used.


## Attributes Reference

In addition to the arguments listed above, the following computed attributes are exported:

* `id` - an identifier for the resource with format `{{project}}`

* `avatar_uri_backend` -
  The URI of the agent's avatar as returned from the API. Output only. To provide an image URL for the agent avatar,
  the [avatarUri] field can be used.


## Timeouts

This resource provides the following
[Timeouts](https://developer.hashicorp.com/terraform/plugin/sdkv2/resources/retries-and-customizable-timeouts) configuration options:

- `create` - Default is 40 minutes.
- `update` - Default is 40 minutes.
- `delete` - Default is 20 minutes.

## Import


Agent can be imported using any of these accepted formats:

* `{{project}}`


In Terraform v1.5.0 and later, use an [`import` block](https://developer.hashicorp.com/terraform/language/import) to import Agent using one of the formats above. For example:

```tf
import {
  id = "{{project}}"
  to = google_dialogflow_agent.default
}
```

When using the [`terraform import` command](https://developer.hashicorp.com/terraform/cli/commands/import), Agent can be imported using one of the formats above. For example:

```
$ terraform import google_dialogflow_agent.default {{project}}
```

## User Project Overrides

This resource supports [User Project Overrides](https://registry.terraform.io/providers/hashicorp/google/latest/docs/guides/provider_reference#user_project_override).
