// Copyright 2021 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.

syntax = "proto3";

package google.cloud.dialogflow.v2beta1;

import "google/api/annotations.proto";
import "google/api/client.proto";
import "google/api/field_behavior.proto";
import "google/api/resource.proto";
import "google/cloud/dialogflow/v2beta1/audio_config.proto";
import "google/cloud/dialogflow/v2beta1/document.proto";
import "google/cloud/dialogflow/v2beta1/participant.proto";
import "google/longrunning/operations.proto";
import "google/protobuf/empty.proto";
import "google/protobuf/field_mask.proto";
import "google/protobuf/timestamp.proto";

option cc_enable_arenas = true;
option csharp_namespace = "Google.Cloud.Dialogflow.V2beta1";
option go_package = "google.golang.org/genproto/googleapis/cloud/dialogflow/v2beta1;dialogflow";
option java_multiple_files = true;
option java_outer_classname = "ConversationProfileProto";
option java_package = "com.google.cloud.dialogflow.v2beta1";
option objc_class_prefix = "DF";
option (google.api.resource_definition) = {
  type: "dialogflow.googleapis.com/CXSecuritySettings"
  pattern: "projects/{project}/locations/{location}/securitySettings/{security_settings}"
};
option (google.api.resource_definition) = {
  type: "dialogflow.googleapis.com/ConversationModel"
  pattern: "projects/{project}/locations/{location}/conversationModels/{conversation_model}"
};

// Service for managing [ConversationProfiles][google.cloud.dialogflow.v2beta1.ConversationProfile].
service ConversationProfiles {
  option (google.api.default_host) = "dialogflow.googleapis.com";
  option (google.api.oauth_scopes) =
      "https://www.googleapis.com/auth/cloud-platform,"
      "https://www.googleapis.com/auth/dialogflow";

  // Returns the list of all conversation profiles in the specified project.
  rpc ListConversationProfiles(ListConversationProfilesRequest) returns (ListConversationProfilesResponse) {
    option (google.api.http) = {
      get: "/v2beta1/{parent=projects/*}/conversationProfiles"
      additional_bindings {
        get: "/v2beta1/{parent=projects/*/locations/*}/conversationProfiles"
      }
    };
    option (google.api.method_signature) = "parent";
  }

  // Retrieves the specified conversation profile.
  rpc GetConversationProfile(GetConversationProfileRequest) returns (ConversationProfile) {
    option (google.api.http) = {
      get: "/v2beta1/{name=projects/*/conversationProfiles/*}"
      additional_bindings {
        get: "/v2beta1/{name=projects/*/locations/*/conversationProfiles/*}"
      }
    };
    option (google.api.method_signature) = "name";
  }

  // Creates a conversation profile in the specified project.
  //
  // [ConversationProfile.CreateTime][] and [ConversationProfile.UpdateTime][]
  // aren't populated in the response. You can retrieve them via
  // [GetConversationProfile][google.cloud.dialogflow.v2beta1.ConversationProfiles.GetConversationProfile] API.
  rpc CreateConversationProfile(CreateConversationProfileRequest) returns (ConversationProfile) {
    option (google.api.http) = {
      post: "/v2beta1/{parent=projects/*}/conversationProfiles"
      body: "conversation_profile"
      additional_bindings {
        post: "/v2beta1/{parent=projects/*/locations/*}/conversationProfiles"
        body: "conversation_profile"
      }
    };
    option (google.api.method_signature) = "parent,conversation_profile";
  }

  // Updates the specified conversation profile.
  //
  // [ConversationProfile.CreateTime][] and [ConversationProfile.UpdateTime][]
  // aren't populated in the response. You can retrieve them via
  // [GetConversationProfile][google.cloud.dialogflow.v2beta1.ConversationProfiles.GetConversationProfile] API.
  rpc UpdateConversationProfile(UpdateConversationProfileRequest) returns (ConversationProfile) {
    option (google.api.http) = {
      patch: "/v2beta1/{conversation_profile.name=projects/*/conversationProfiles/*}"
      body: "conversation_profile"
      additional_bindings {
        patch: "/v2beta1/{conversation_profile.name=projects/*/locations/*/conversationProfiles/*}"
        body: "conversation_profile"
      }
    };
    option (google.api.method_signature) = "conversation_profile,update_mask";
  }

  // Deletes the specified conversation profile.
  rpc DeleteConversationProfile(DeleteConversationProfileRequest) returns (google.protobuf.Empty) {
    option (google.api.http) = {
      delete: "/v2beta1/{name=projects/*/conversationProfiles/*}"
      additional_bindings {
        delete: "/v2beta1/{name=projects/*/locations/*/conversationProfiles/*}"
      }
    };
    option (google.api.method_signature) = "name";
  }
}

// Defines the services to connect to incoming Dialogflow conversations.
message ConversationProfile {
  option (google.api.resource) = {
    type: "dialogflow.googleapis.com/ConversationProfile"
    pattern: "projects/{project}/conversationProfiles/{conversation_profile}"
    pattern: "projects/{project}/locations/{location}/conversationProfiles/{conversation_profile}"
  };

  // The unique identifier of this conversation profile.
  // Format: `projects/<Project ID>/locations/<Location
  // ID>/conversationProfiles/<Conversation Profile ID>`.
  string name = 1;

  // Required. Human readable name for this profile. Max length 1024 bytes.
  string display_name = 2 [(google.api.field_behavior) = REQUIRED];

  // Output only. Create time of the conversation profile.
  google.protobuf.Timestamp create_time = 11 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. Update time of the conversation profile.
  google.protobuf.Timestamp update_time = 12 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Configuration for an automated agent to use with this profile.
  AutomatedAgentConfig automated_agent_config = 3;

  // Configuration for agent assistance to use with this profile.
  HumanAgentAssistantConfig human_agent_assistant_config = 4;

  // Configuration for connecting to a live agent.
  //
  // Currently, this feature is not general available, please contact Google
  // to get access.
  HumanAgentHandoffConfig human_agent_handoff_config = 5;

  // Configuration for publishing conversation lifecycle events.
  NotificationConfig notification_config = 6;

  // Configuration for logging conversation lifecycle events.
  LoggingConfig logging_config = 7;

  // Configuration for publishing new message events. Event will be sent in
  // format of [ConversationEvent][google.cloud.dialogflow.v2beta1.ConversationEvent]
  NotificationConfig new_message_event_notification_config = 8;

  // Settings for speech transcription.
  SpeechToTextConfig stt_config = 9;

  // Language code for the conversation profile. If not specified, the language
  // is en-US. Language at ConversationProfile should be set for all non en-us
  // languages.
  string language_code = 10;
}

// Defines the Automated Agent to connect to a conversation.
message AutomatedAgentConfig {
  // Required. ID of the Dialogflow agent environment to use.
  //
  // This project needs to either be the same project as the conversation or you
  // need to grant `service-<Conversation Project
  // Number>@gcp-sa-dialogflow.iam.gserviceaccount.com` the `Dialogflow API
  // Service Agent` role in this project.
  //
  // - For ES agents, use format: `projects/<Project ID>/locations/<Location
  // ID>/agent/environments/<Environment ID or '-'>`. If environment is not
  // specified, the default `draft` environment is used. Refer to
  // [DetectIntentRequest](/dialogflow/docs/reference/rpc/google.cloud.dialogflow.v2beta1#google.cloud.dialogflow.v2beta1.DetectIntentRequest)
  // for more details.
  //
  // - For CX agents, use format `projects/<Project ID>/locations/<Location
  // ID>/agents/<Agent ID>/environments/<Environment ID
  // or '-'>`. If environment is not specified, the default `draft` environment
  // is used.
  string agent = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      type: "dialogflow.googleapis.com/Agent"
    }
  ];
}

// Defines the Human Agent Assistant to connect to a conversation.
message HumanAgentAssistantConfig {
  // Settings of suggestion trigger.
  message SuggestionTriggerSettings {
    // Do not trigger if last utterance is small talk.
    bool no_small_talk = 1;

    // Only trigger suggestion if participant role of last utterance is
    // END_USER.
    bool only_end_user = 2;
  }

  // Config for suggestion features.
  message SuggestionFeatureConfig {
    // The suggestion feature.
    SuggestionFeature suggestion_feature = 5;

    // Automatically iterates all participants and tries to compile
    // suggestions.
    //
    // Supported features: ARTICLE_SUGGESTION, FAQ, DIALOGFLOW_ASSIST.
    bool enable_event_based_suggestion = 3;

    // Settings of suggestion trigger.
    //
    // Currently, only ARTICLE_SUGGESTION, FAQ, and DIALOGFLOW_ASSIST will use
    // this field.
    SuggestionTriggerSettings suggestion_trigger_settings = 10;

    // Configs of query.
    SuggestionQueryConfig query_config = 6;

    // Configs of custom conversation model.
    ConversationModelConfig conversation_model_config = 7;
  }

  // Detail human agent assistant config.
  message SuggestionConfig {
    // Configuration of different suggestion features. One feature can have only
    // one config.
    repeated SuggestionFeatureConfig feature_configs = 2;

    // If `group_suggestion_responses` is false, and there are multiple
    // `feature_configs` in `event based suggestion` or
    // StreamingAnalyzeContent, we will try to deliver suggestions to customers
    // as soon as we get new suggestion. Different type of suggestions based on
    // the same context will be in  separate Pub/Sub event or
    // `StreamingAnalyzeContentResponse`.
    //
    // If `group_suggestion_responses` set to true. All the suggestions to the
    // same participant based on the same context will be grouped into a single
    // Pub/Sub event or StreamingAnalyzeContentResponse.
    bool group_suggestion_responses = 3;
  }

  // Config for suggestion query.
  message SuggestionQueryConfig {
    // Knowledge base source settings.
    //
    // Supported features: ARTICLE_SUGGESTION, FAQ.
    message KnowledgeBaseQuerySource {
      // Required. Knowledge bases to query. Format:
      // `projects/<Project ID>/locations/<Location
      // ID>/knowledgeBases/<Knowledge Base ID>`. Currently, only one knowledge
      // base is supported.
      repeated string knowledge_bases = 1 [
        (google.api.field_behavior) = REQUIRED,
        (google.api.resource_reference) = {
          type: "dialogflow.googleapis.com/KnowledgeBase"
        }
      ];
    }

    // Document source settings.
    //
    // Supported features: SMART_REPLY, SMART_COMPOSE.
    message DocumentQuerySource {
      // Required. Knowledge documents to query from. Format:
      // `projects/<Project ID>/locations/<Location
      // ID>/knowledgeBases/<KnowledgeBase ID>/documents/<Document ID>`.
      // Currently, only one document is supported.
      repeated string documents = 1 [
        (google.api.field_behavior) = REQUIRED,
        (google.api.resource_reference) = {
          type: "dialogflow.googleapis.com/Document"
        }
      ];
    }

    // Dialogflow source setting.
    //
    // Supported feature: DIALOGFLOW_ASSIST.
    message DialogflowQuerySource {
      // Required. The name of a dialogflow virtual agent used for end user side intent
      // detection and suggestion. Format: `projects/<Project Number /
      // ID>/locations/<Location ID>/agent`. When multiple agents are allowed in
      // the same Dialogflow project.
      string agent = 1 [
        (google.api.field_behavior) = REQUIRED,
        (google.api.resource_reference) = {
          type: "dialogflow.googleapis.com/Agent"
        }
      ];
    }

    // Settings that determine how to filter recent conversation context when
    // generating suggestions.
    message ContextFilterSettings {
      // If set to true, the last message from virtual agent (hand off message)
      // and the message before it (trigger message of hand off) are dropped.
      bool drop_handoff_messages = 1;

      // If set to true, all messages from virtual agent are dropped.
      bool drop_virtual_agent_messages = 2;

      // If set to true, all messages from ivr stage are dropped.
      bool drop_ivr_messages = 3;
    }

    // Source of query.
    oneof query_source {
      // Query from knowledgebase. It is used by:
      // ARTICLE_SUGGESTION, FAQ.
      KnowledgeBaseQuerySource knowledge_base_query_source = 1;

      // Query from knowledge base document. It is used by:
      // SMART_REPLY, SMART_COMPOSE.
      DocumentQuerySource document_query_source = 2;

      // Query from Dialogflow agent. It is used by DIALOGFLOW_ASSIST.
      DialogflowQuerySource dialogflow_query_source = 3;
    }

    // Maximum number of results to return. Currently, if unset, defaults to 10.
    // And the max number is 20.
    int32 max_results = 4;

    // Confidence threshold of query result.
    //
    // Agent Assist gives each suggestion a score in the range [0.0, 1.0], based
    // on the relevance between the suggestion and the current conversation
    // context. A score of 0.0 has no relevance, while a score of 1.0 has high
    // relevance. Only suggestions with a score greater than or equal to the
    // value of this field are included in the results.
    //
    // For a baseline model (the default), the recommended value is in the range
    // [0.05, 0.1].
    //
    // For a custom model, there is no recommended value. Tune this value by
    // starting from a very low value and slowly increasing until you have
    // desired results.
    //
    // If this field is not set, it is default to 0.0, which means that all
    // suggestions are returned.
    //
    // Supported features: ARTICLE_SUGGESTION, FAQ, SMART_REPLY, SMART_COMPOSE.
    float confidence_threshold = 5;

    // Determines how recent conversation context is filtered when generating
    // suggestions. If unspecified, no messages will be dropped.
    ContextFilterSettings context_filter_settings = 7;
  }

  // Custom conversation models used in agent assist feature.
  //
  // Supported feature: ARTICLE_SUGGESTION, SMART_COMPOSE, SMART_REPLY.
  message ConversationModelConfig {
    // Conversation model resource name. Format: `projects/<Project
    // ID>/conversationModels/<Model ID>`.
    string model = 1 [(google.api.resource_reference) = {
                        type: "dialogflow.googleapis.com/ConversationModel"
                      }];
  }

  // Configuration for analyses to run on each conversation message.
  message MessageAnalysisConfig {
    // Enable entity extraction in conversation messages on [agent assist
    // stage](https://cloud.google.com/dialogflow/priv/docs/contact-center/basics#stages).
    // If unspecified, defaults to false.
    //
    // Currently, this feature is not general available, please contact Google
    // to get access.
    bool enable_entity_extraction = 2;

    // Enable sentiment analysis in conversation messages on [agent assist
    // stage](https://cloud.google.com/dialogflow/priv/docs/contact-center/basics#stages).
    // If unspecified, defaults to false. Sentiment analysis inspects user input
    // and identifies the prevailing subjective opinion, especially to determine
    // a user's attitude as positive, negative, or neutral:
    // https://cloud.google.com/natural-language/docs/basics#sentiment_analysis
    // For [Participants.StreamingAnalyzeContent][google.cloud.dialogflow.v2beta1.Participants.StreamingAnalyzeContent] method, result will be in
    // [StreamingAnalyzeContentResponse.message.SentimentAnalysisResult][google.cloud.dialogflow.v2beta1.StreamingAnalyzeContentResponse.message].
    // For [Participants.AnalyzeContent][google.cloud.dialogflow.v2beta1.Participants.AnalyzeContent] method, result will be in
    // [AnalyzeContentResponse.message.SentimentAnalysisResult][google.cloud.dialogflow.v2beta1.AnalyzeContentResponse.message]
    // For [Conversations.ListMessages][google.cloud.dialogflow.v2beta1.Conversations.ListMessages] method, result will be in
    // [ListMessagesResponse.messages.SentimentAnalysisResult][google.cloud.dialogflow.v2beta1.ListMessagesResponse.messages]
    // If Pub/Sub notification is configured, result will be in
    // [ConversationEvent.new_message_payload.SentimentAnalysisResult][google.cloud.dialogflow.v2beta1.ConversationEvent.new_message_payload].
    bool enable_sentiment_analysis = 3;
  }

  // Pub/Sub topic on which to publish new agent assistant events.
  NotificationConfig notification_config = 2;

  // Configuration for agent assistance of human agent participant.
  SuggestionConfig human_agent_suggestion_config = 3;

  // Configuration for agent assistance of end user participant.
  //
  // Currently, this feature is not general available, please contact Google
  // to get access.
  SuggestionConfig end_user_suggestion_config = 4;

  // Configuration for message analysis.
  MessageAnalysisConfig message_analysis_config = 5;
}

// Defines the hand off to a live agent, typically on which external agent
// service provider to connect to a conversation.
//
// Currently, this feature is not general available, please contact Google
// to get access.
message HumanAgentHandoffConfig {
  // Configuration specific to LivePerson (https://www.liveperson.com).
  message LivePersonConfig {
    // Required. Account number of the LivePerson account to connect. This is
    // the account number you input at the login page.
    string account_number = 1 [(google.api.field_behavior) = REQUIRED];
  }

  // Configuration specific to Salesforce Live Agent.
  message SalesforceLiveAgentConfig {
    // Required. The organization ID of the Salesforce account.
    string organization_id = 1 [(google.api.field_behavior) = REQUIRED];

    // Required. Live Agent deployment ID.
    string deployment_id = 2 [(google.api.field_behavior) = REQUIRED];

    // Required. Live Agent chat button ID.
    string button_id = 3 [(google.api.field_behavior) = REQUIRED];

    // Required. Domain of the Live Agent endpoint for this agent. You can find
    // the endpoint URL in the `Live Agent settings` page. For example if URL
    // has the form https://d.la4-c2-phx.salesforceliveagent.com/...,
    // you should fill in d.la4-c2-phx.salesforceliveagent.com.
    string endpoint_domain = 4 [(google.api.field_behavior) = REQUIRED];
  }

  // Required. Specifies which agent service to connect for human agent handoff.
  oneof agent_service {
    // Uses LivePerson (https://www.liveperson.com).
    LivePersonConfig live_person_config = 1;

    // Uses Salesforce Live Agent.
    SalesforceLiveAgentConfig salesforce_live_agent_config = 2;
  }
}

// Defines notification behavior.
message NotificationConfig {
  // Format of cloud pub/sub message.
  enum MessageFormat {
    // If it is unspecified, PROTO will be used.
    MESSAGE_FORMAT_UNSPECIFIED = 0;

    // Pubsub message will be serialized proto.
    PROTO = 1;

    // Pubsub message will be json.
    JSON = 2;
  }

  // Name of the Pub/Sub topic to publish conversation
  // events like
  // [CONVERSATION_STARTED][google.cloud.dialogflow.v2beta1.ConversationEvent.Type.CONVERSATION_STARTED] as
  // serialized [ConversationEvent][google.cloud.dialogflow.v2beta1.ConversationEvent] protos.
  //
  // Notification works for phone calls, if this topic either is in the same
  // project as the conversation or you grant `service-<Conversation Project
  // Number>@gcp-sa-dialogflow.iam.gserviceaccount.com` the `Dialogflow Service
  // Agent` role in the topic project.
  //
  // Format: `projects/<Project ID>/locations/<Location ID>/topics/<Topic ID>`.
  string topic = 1;

  // Format of message.
  MessageFormat message_format = 2;
}

// Defines logging behavior for conversation lifecycle events.
message LoggingConfig {
  // Whether to log conversation events like
  // [CONVERSATION_STARTED][google.cloud.dialogflow.v2beta1.ConversationEvent.Type.CONVERSATION_STARTED] to
  // Stackdriver in the conversation project as JSON format
  // [ConversationEvent][google.cloud.dialogflow.v2beta1.ConversationEvent] protos.
  bool enable_stackdriver_logging = 3;
}

// The request message for [ConversationProfiles.ListConversationProfiles][google.cloud.dialogflow.v2beta1.ConversationProfiles.ListConversationProfiles].
message ListConversationProfilesRequest {
  // Required. The project to list all conversation profiles from.
  // Format: `projects/<Project ID>/locations/<Location ID>`.
  string parent = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      child_type: "dialogflow.googleapis.com/ConversationProfile"
    }
  ];

  // The maximum number of items to return in a single page. By
  // default 100 and at most 1000.
  int32 page_size = 2;

  // The next_page_token value returned from a previous list request.
  string page_token = 3;
}

// The response message for [ConversationProfiles.ListConversationProfiles][google.cloud.dialogflow.v2beta1.ConversationProfiles.ListConversationProfiles].
message ListConversationProfilesResponse {
  // The list of project conversation profiles. There is a maximum number
  // of items returned based on the page_size field in the request.
  repeated ConversationProfile conversation_profiles = 1;

  // Token to retrieve the next page of results, or empty if there are no
  // more results in the list.
  string next_page_token = 2;
}

// The request message for [ConversationProfiles.GetConversationProfile][google.cloud.dialogflow.v2beta1.ConversationProfiles.GetConversationProfile].
message GetConversationProfileRequest {
  // Required. The resource name of the conversation profile.
  // Format: `projects/<Project ID>/locations/<Location
  // ID>/conversationProfiles/<Conversation Profile ID>`.
  string name = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      type: "dialogflow.googleapis.com/ConversationProfile"
    }
  ];
}

// The request message for [ConversationProfiles.CreateConversationProfile][google.cloud.dialogflow.v2beta1.ConversationProfiles.CreateConversationProfile].
message CreateConversationProfileRequest {
  // Required. The project to create a conversation profile for.
  // Format: `projects/<Project ID>/locations/<Location ID>`.
  string parent = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      child_type: "dialogflow.googleapis.com/ConversationProfile"
    }
  ];

  // Required. The conversation profile to create.
  ConversationProfile conversation_profile = 2 [(google.api.field_behavior) = REQUIRED];
}

// The request message for [ConversationProfiles.UpdateConversationProfile][google.cloud.dialogflow.v2beta1.ConversationProfiles.UpdateConversationProfile].
message UpdateConversationProfileRequest {
  // Required. The conversation profile to update.
  ConversationProfile conversation_profile = 1 [(google.api.field_behavior) = REQUIRED];

  // Required. The mask to control which fields to update.
  google.protobuf.FieldMask update_mask = 2 [(google.api.field_behavior) = REQUIRED];
}

// The request message for [ConversationProfiles.DeleteConversationProfile][google.cloud.dialogflow.v2beta1.ConversationProfiles.DeleteConversationProfile].
//
// This operation fails if the conversation profile is still referenced from
// a phone number.
message DeleteConversationProfileRequest {
  // Required. The name of the conversation profile to delete.
  // Format: `projects/<Project ID>/locations/<Location
  // ID>/conversationProfiles/<Conversation Profile ID>`.
  string name = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      type: "dialogflow.googleapis.com/ConversationProfile"
    }
  ];
}
