All Downloads are FREE. Search and download functionalities are using the official Maven repository.

google.cloud.dialogflow.v2.conversation_model.proto Maven / Gradle / Ivy

There is a newer version: 4.59.0
Show newest version
// Copyright 2024 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.v2;

import "google/api/annotations.proto";
import "google/api/client.proto";
import "google/api/field_behavior.proto";
import "google/api/resource.proto";
import "google/longrunning/operations.proto";
import "google/protobuf/empty.proto";
import "google/protobuf/timestamp.proto";

option cc_enable_arenas = true;
option csharp_namespace = "Google.Cloud.Dialogflow.V2";
option go_package = "cloud.google.com/go/dialogflow/apiv2/dialogflowpb;dialogflowpb";
option java_multiple_files = true;
option java_outer_classname = "ConversationModelProto";
option java_package = "com.google.cloud.dialogflow.v2";
option objc_class_prefix = "DF";

// Manages a collection of models for human agent assistant.
service ConversationModels {
  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";

  // Creates a model.
  //
  // This method is a [long-running
  // operation](https://cloud.google.com/dialogflow/es/docs/how/long-running-operations).
  // The returned `Operation` type has the following method-specific fields:
  //
  // - `metadata`:
  // [CreateConversationModelOperationMetadata][google.cloud.dialogflow.v2.CreateConversationModelOperationMetadata]
  // - `response`:
  // [ConversationModel][google.cloud.dialogflow.v2.ConversationModel]
  rpc CreateConversationModel(CreateConversationModelRequest)
      returns (google.longrunning.Operation) {
    option (google.api.http) = {
      post: "/v2/{parent=projects/*}/conversationModels"
      body: "conversation_model"
      additional_bindings {
        post: "/v2/{parent=projects/*/locations/*}/conversationModels"
        body: "conversation_model"
      }
    };
    option (google.api.method_signature) = "parent,conversation_model";
    option (google.longrunning.operation_info) = {
      response_type: "ConversationModel"
      metadata_type: "CreateConversationModelOperationMetadata"
    };
  }

  // Gets conversation model.
  rpc GetConversationModel(GetConversationModelRequest)
      returns (ConversationModel) {
    option (google.api.http) = {
      get: "/v2/{name=projects/*/conversationModels/*}"
      additional_bindings {
        get: "/v2/{name=projects/*/locations/*/conversationModels/*}"
      }
    };
    option (google.api.method_signature) = "name";
  }

  // Lists conversation models.
  rpc ListConversationModels(ListConversationModelsRequest)
      returns (ListConversationModelsResponse) {
    option (google.api.http) = {
      get: "/v2/{parent=projects/*}/conversationModels"
      additional_bindings {
        get: "/v2/{parent=projects/*/locations/*}/conversationModels"
      }
    };
    option (google.api.method_signature) = "parent";
  }

  // Deletes a model.
  //
  // This method is a [long-running
  // operation](https://cloud.google.com/dialogflow/es/docs/how/long-running-operations).
  // The returned `Operation` type has the following method-specific fields:
  //
  // - `metadata`:
  // [DeleteConversationModelOperationMetadata][google.cloud.dialogflow.v2.DeleteConversationModelOperationMetadata]
  // - `response`: An [Empty
  //   message](https://developers.google.com/protocol-buffers/docs/reference/google.protobuf#empty)
  rpc DeleteConversationModel(DeleteConversationModelRequest)
      returns (google.longrunning.Operation) {
    option (google.api.http) = {
      delete: "/v2/{name=projects/*/conversationModels/*}"
      additional_bindings {
        delete: "/v2/{name=projects/*/locations/*/conversationModels/*}"
      }
    };
    option (google.api.method_signature) = "name";
    option (google.longrunning.operation_info) = {
      response_type: "google.protobuf.Empty"
      metadata_type: "DeleteConversationModelOperationMetadata"
    };
  }

  // Deploys a model. If a model is already deployed, deploying it
  // has no effect. A model can only serve prediction requests after it gets
  // deployed. For article suggestion, custom model will not be used unless
  // it is deployed.
  //
  // This method is a [long-running
  // operation](https://cloud.google.com/dialogflow/es/docs/how/long-running-operations).
  // The returned `Operation` type has the following method-specific fields:
  //
  // - `metadata`:
  // [DeployConversationModelOperationMetadata][google.cloud.dialogflow.v2.DeployConversationModelOperationMetadata]
  // - `response`: An [Empty
  //   message](https://developers.google.com/protocol-buffers/docs/reference/google.protobuf#empty)
  rpc DeployConversationModel(DeployConversationModelRequest)
      returns (google.longrunning.Operation) {
    option (google.api.http) = {
      post: "/v2/{name=projects/*/conversationModels/*}:deploy"
      body: "*"
      additional_bindings {
        post: "/v2/{name=projects/*/locations/*/conversationModels/*}:deploy"
        body: "*"
      }
    };
    option (google.longrunning.operation_info) = {
      response_type: "google.protobuf.Empty"
      metadata_type: "DeployConversationModelOperationMetadata"
    };
  }

  // Undeploys a model. If the model is not deployed this method has no effect.
  // If the model is currently being used:
  //   - For article suggestion, article suggestion will fallback to the default
  //     model if model is undeployed.
  //
  // This method is a [long-running
  // operation](https://cloud.google.com/dialogflow/es/docs/how/long-running-operations).
  // The returned `Operation` type has the following method-specific fields:
  //
  // - `metadata`:
  // [UndeployConversationModelOperationMetadata][google.cloud.dialogflow.v2.UndeployConversationModelOperationMetadata]
  // - `response`: An [Empty
  //   message](https://developers.google.com/protocol-buffers/docs/reference/google.protobuf#empty)
  rpc UndeployConversationModel(UndeployConversationModelRequest)
      returns (google.longrunning.Operation) {
    option (google.api.http) = {
      post: "/v2/{name=projects/*/conversationModels/*}:undeploy"
      body: "*"
      additional_bindings {
        post: "/v2/{name=projects/*/locations/*/conversationModels/*}:undeploy"
        body: "*"
      }
    };
    option (google.longrunning.operation_info) = {
      response_type: "google.protobuf.Empty"
      metadata_type: "UndeployConversationModelOperationMetadata"
    };
  }

  // Gets an evaluation of conversation model.
  rpc GetConversationModelEvaluation(GetConversationModelEvaluationRequest)
      returns (ConversationModelEvaluation) {
    option (google.api.http) = {
      get: "/v2/{name=projects/*/conversationModels/*/evaluations/*}"
      additional_bindings {
        get: "/v2/{name=projects/*/locations/*/conversationModels/*/evaluations/*}"
      }
    };
    option (google.api.method_signature) = "name";
  }

  // Lists evaluations of a conversation model.
  rpc ListConversationModelEvaluations(ListConversationModelEvaluationsRequest)
      returns (ListConversationModelEvaluationsResponse) {
    option (google.api.http) = {
      get: "/v2/{parent=projects/*/conversationModels/*}/evaluations"
      additional_bindings {
        get: "/v2/{parent=projects/*/locations/*/conversationModels/*}/evaluations"
      }
    };
    option (google.api.method_signature) = "parent";
  }

  // Creates evaluation of a conversation model.
  rpc CreateConversationModelEvaluation(
      CreateConversationModelEvaluationRequest)
      returns (google.longrunning.Operation) {
    option (google.api.http) = {
      post: "/v2/{parent=projects/*/locations/*/conversationModels/*}/evaluations"
      body: "*"
    };
    option (google.api.method_signature) =
        "parent,conversation_model_evaluation";
    option (google.longrunning.operation_info) = {
      response_type: "ConversationModelEvaluation"
      metadata_type: "CreateConversationModelEvaluationOperationMetadata"
    };
  }
}

// Represents a conversation model.
message ConversationModel {
  option (google.api.resource) = {
    type: "dialogflow.googleapis.com/ConversationModel"
    pattern: "projects/{project}/locations/{location}/conversationModels/{conversation_model}"
    pattern: "projects/{project}/conversationModels/{conversation_model}"
  };

  // State of the model.
  enum State {
    // Should not be used, an un-set enum has this value by default.
    STATE_UNSPECIFIED = 0;

    // Model being created.
    CREATING = 1;

    // Model is not deployed but ready to deploy.
    UNDEPLOYED = 2;

    // Model is deploying.
    DEPLOYING = 3;

    // Model is deployed and ready to use.
    DEPLOYED = 4;

    // Model is undeploying.
    UNDEPLOYING = 5;

    // Model is deleting.
    DELETING = 6;

    // Model is in error state. Not ready to deploy and use.
    FAILED = 7;

    // Model is being created but the training has not started,
    // The model may remain in this state until there is enough capacity to
    // start training.
    PENDING = 8;
  }

  // Model type.
  enum ModelType {
    // ModelType unspecified.
    MODEL_TYPE_UNSPECIFIED = 0;

    // ModelType smart reply dual encoder model.
    SMART_REPLY_DUAL_ENCODER_MODEL = 2;

    // ModelType smart reply bert model.
    SMART_REPLY_BERT_MODEL = 6;
  }

  // ConversationModel resource name. Format:
  // `projects//conversationModels/`
  string name = 1;

  // Required. The display name of the model. At most 64 bytes long.
  string display_name = 2 [(google.api.field_behavior) = REQUIRED];

  // Output only. Creation time of this model.
  google.protobuf.Timestamp create_time = 3
      [(google.api.field_behavior) = OUTPUT_ONLY];

  // Required. Datasets used to create model.
  repeated InputDataset datasets = 4 [(google.api.field_behavior) = REQUIRED];

  // Output only. State of the model. A model can only serve prediction requests
  // after it gets deployed.
  State state = 7 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Language code for the conversation model. If not specified, the language
  // is en-US. Language at ConversationModel should be set for all non en-us
  // languages.
  // This should be a [BCP-47](https://www.rfc-editor.org/rfc/bcp/bcp47.txt)
  // language tag. Example: "en-US".
  string language_code = 19;

  // Required.
  // The model metadata that is specific to the problem type.
  // Must match the metadata type of the dataset used to train the model.
  oneof model_metadata {
    // Metadata for article suggestion models.
    ArticleSuggestionModelMetadata article_suggestion_model_metadata = 8;

    // Metadata for smart reply models.
    SmartReplyModelMetadata smart_reply_model_metadata = 9;
  }
}

// Represents evaluation result of a conversation model.
message ConversationModelEvaluation {
  option (google.api.resource) = {
    type: "dialogflow.googleapis.com/ConversationModelEvaluation"
    pattern: "projects/{project}/conversationModels/{conversation_model}/evaluations/{evaluation}"
    pattern: "projects/{project}/locations/{location}/conversationModels/{conversation_model}/evaluations/{evaluation}"
  };

  // The resource name of the evaluation. Format:
  // `projects//conversationModels//evaluations/`
  string name = 1;

  // Optional. The display name of the model evaluation. At most 64 bytes long.
  string display_name = 2 [(google.api.field_behavior) = OPTIONAL];

  // Optional. The configuration of the evaluation task.
  EvaluationConfig evaluation_config = 6
      [(google.api.field_behavior) = OPTIONAL];

  // Output only. Creation time of this model.
  google.protobuf.Timestamp create_time = 3
      [(google.api.field_behavior) = OUTPUT_ONLY];

  // Metrics details.
  oneof metrics {
    // Output only. Only available when model is for smart reply.
    SmartReplyMetrics smart_reply_metrics = 5
        [(google.api.field_behavior) = OUTPUT_ONLY];
  }

  // Output only. Human eval template in csv format.
  // It tooks real-world conversations provided through input dataset, generates
  // example suggestions for customer to verify quality of the model.
  // For Smart Reply, the generated csv file contains columns of
  // Context, (Suggestions,Q1,Q2)*3, Actual reply.
  // Context contains at most 10 latest messages in the conversation prior to
  // the current suggestion.
  // Q1: "Would you send it as the next message of agent?"
  // Evaluated based on whether the suggest is appropriate to be sent by
  // agent in current context.
  // Q2: "Does the suggestion move the conversation closer to resolution?"
  // Evaluated based on whether the suggestion provide solutions, or answers
  // customer's question or collect information from customer to resolve the
  // customer's issue.
  // Actual reply column contains the actual agent reply sent in the context.
  string raw_human_eval_template_csv = 8
      [(google.api.field_behavior) = OUTPUT_ONLY];
}

// The configuration for model evaluation.
message EvaluationConfig {
  // Smart reply specific configuration for evaluation job.
  message SmartReplyConfig {
    // The allowlist document resource name.
    // Format: `projects//knowledgeBases//documents/`. Only used for smart reply model.
    string allowlist_document = 1 [(google.api.resource_reference) = {
      type: "dialogflow.googleapis.com/Document"
    }];

    // Required. The model to be evaluated can return multiple results with
    // confidence score on each query. These results will be sorted by the
    // descending order of the scores and we only keep the first
    // max_result_count results as the final results to evaluate.
    int32 max_result_count = 2 [(google.api.field_behavior) = REQUIRED];
  }

  // Smart compose specific configuration for evaluation job.
  message SmartComposeConfig {
    // The allowlist document resource name.
    // Format: `projects//knowledgeBases//documents/`. Only used for smart compose model.
    string allowlist_document = 1 [(google.api.resource_reference) = {
      type: "dialogflow.googleapis.com/Document"
    }];

    // Required. The model to be evaluated can return multiple results with
    // confidence score on each query. These results will be sorted by the
    // descending order of the scores and we only keep the first
    // max_result_count results as the final results to evaluate.
    int32 max_result_count = 2 [(google.api.field_behavior) = REQUIRED];
  }

  // Required. Datasets used for evaluation.
  repeated InputDataset datasets = 3 [(google.api.field_behavior) = REQUIRED];

  // Specific configurations for different models in order to do evaluation.
  oneof model_specific_config {
    // Configuration for smart reply model evalution.
    SmartReplyConfig smart_reply_config = 2;

    // Configuration for smart compose model evalution.
    SmartComposeConfig smart_compose_config = 4;
  }
}

// InputDataset used to create model or do evaluation.
// NextID:5
message InputDataset {
  // Required. ConversationDataset resource name. Format:
  // `projects//locations//conversationDatasets/`
  string dataset = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      type: "dialogflow.googleapis.com/ConversationDataset"
    }
  ];
}

// Metadata for article suggestion models.
message ArticleSuggestionModelMetadata {
  // Optional. Type of the article suggestion model. If not provided, model_type
  // is used.
  ConversationModel.ModelType training_model_type = 3
      [(google.api.field_behavior) = OPTIONAL];
}

// Metadata for smart reply models.
message SmartReplyModelMetadata {
  // Optional. Type of the smart reply model. If not provided, model_type is
  // used.
  ConversationModel.ModelType training_model_type = 6
      [(google.api.field_behavior) = OPTIONAL];
}

// The evaluation metrics for smart reply model.
message SmartReplyMetrics {
  // Evaluation metrics when retrieving `n` smart replies with the model.
  message TopNMetrics {
    // Number of retrieved smart replies. For example, when `n` is 3, this
    // evaluation contains metrics for when Dialogflow retrieves 3 smart replies
    // with the model.
    int32 n = 1;

    // Defined as `number of queries whose top n smart replies have at least one
    // similar (token match similarity above the defined threshold) reply as the
    // real reply` divided by `number of queries with at least one smart reply`.
    // Value ranges from 0.0 to 1.0 inclusive.
    float recall = 2;
  }

  // Percentage of target participant messages in the evaluation dataset for
  // which similar messages have appeared at least once in the allowlist. Should
  // be [0, 1].
  float allowlist_coverage = 1;

  // Metrics of top n smart replies, sorted by [TopNMetric.n][].
  repeated TopNMetrics top_n_metrics = 2;

  // Total number of conversations used to generate this metric.
  int64 conversation_count = 3;
}

// The request message for
// [ConversationModels.CreateConversationModel][google.cloud.dialogflow.v2.ConversationModels.CreateConversationModel]
message CreateConversationModelRequest {
  // The project to create conversation model for. Format:
  // `projects/`
  string parent = 1;

  // Required. The conversation model to create.
  ConversationModel conversation_model = 2
      [(google.api.field_behavior) = REQUIRED];
}

// The request message for
// [ConversationModels.GetConversationModel][google.cloud.dialogflow.v2.ConversationModels.GetConversationModel]
message GetConversationModelRequest {
  // Required. The conversation model to retrieve. Format:
  // `projects//conversationModels/`
  string name = 1 [(google.api.field_behavior) = REQUIRED];
}

// The request message for
// [ConversationModels.ListConversationModels][google.cloud.dialogflow.v2.ConversationModels.ListConversationModels]
message ListConversationModelsRequest {
  // Required. The project to list all conversation models for.
  // Format: `projects/`
  string parent = 1 [(google.api.field_behavior) = REQUIRED];

  // Optional. Maximum number of conversation models to return in a single
  // page. By default 100 and at most 1000.
  int32 page_size = 2 [(google.api.field_behavior) = OPTIONAL];

  // Optional. The next_page_token value returned from a previous list request.
  string page_token = 3 [(google.api.field_behavior) = OPTIONAL];
}

// The response message for
// [ConversationModels.ListConversationModels][google.cloud.dialogflow.v2.ConversationModels.ListConversationModels]
message ListConversationModelsResponse {
  // The list of models to return.
  repeated ConversationModel conversation_models = 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
// [ConversationModels.DeleteConversationModel][google.cloud.dialogflow.v2.ConversationModels.DeleteConversationModel]
message DeleteConversationModelRequest {
  // Required. The conversation model to delete. Format:
  // `projects//conversationModels/`
  string name = 1 [(google.api.field_behavior) = REQUIRED];
}

// The request message for
// [ConversationModels.DeployConversationModel][google.cloud.dialogflow.v2.ConversationModels.DeployConversationModel]
message DeployConversationModelRequest {
  // Required. The conversation model to deploy. Format:
  // `projects//conversationModels/`
  string name = 1 [(google.api.field_behavior) = REQUIRED];
}

// The request message for
// [ConversationModels.UndeployConversationModel][google.cloud.dialogflow.v2.ConversationModels.UndeployConversationModel]
message UndeployConversationModelRequest {
  // Required. The conversation model to undeploy. Format:
  // `projects//conversationModels/`
  string name = 1 [(google.api.field_behavior) = REQUIRED];
}

// The request message for
// [ConversationModels.GetConversationModelEvaluation][google.cloud.dialogflow.v2.ConversationModels.GetConversationModelEvaluation]
message GetConversationModelEvaluationRequest {
  // Required. The conversation model evaluation resource name. Format:
  // `projects//conversationModels//evaluations/`
  string name = 1 [(google.api.field_behavior) = REQUIRED];
}

// The request message for
// [ConversationModels.ListConversationModelEvaluations][google.cloud.dialogflow.v2.ConversationModels.ListConversationModelEvaluations]
message ListConversationModelEvaluationsRequest {
  // Required. The conversation model resource name. Format:
  // `projects//conversationModels/`
  string parent = 1 [(google.api.field_behavior) = REQUIRED];

  // Optional. Maximum number of evaluations to return in a
  // single page. By default 100 and at most 1000.
  int32 page_size = 2 [(google.api.field_behavior) = OPTIONAL];

  // Optional. The next_page_token value returned from a previous list request.
  string page_token = 3 [(google.api.field_behavior) = OPTIONAL];
}

// The response message for
// [ConversationModels.ListConversationModelEvaluations][google.cloud.dialogflow.v2.ConversationModels.ListConversationModelEvaluations]
message ListConversationModelEvaluationsResponse {
  // The list of evaluations to return.
  repeated ConversationModelEvaluation conversation_model_evaluations = 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
// [ConversationModels.CreateConversationModelEvaluation][google.cloud.dialogflow.v2.ConversationModels.CreateConversationModelEvaluation]
message CreateConversationModelEvaluationRequest {
  // Required. The conversation model resource name. Format:
  // `projects//locations//conversationModels/`
  string parent = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      child_type: "dialogflow.googleapis.com/ConversationModelEvaluation"
    }
  ];

  // Required. The conversation model evaluation to be created.
  ConversationModelEvaluation conversation_model_evaluation = 2
      [(google.api.field_behavior) = REQUIRED];
}

// Metadata for a
// [ConversationModels.CreateConversationModel][google.cloud.dialogflow.v2.ConversationModels.CreateConversationModel]
// operation.
message CreateConversationModelOperationMetadata {
  // State of CreateConversationModel operation.
  enum State {
    // Invalid.
    STATE_UNSPECIFIED = 0;

    // Request is submitted, but training has not started yet.
    // The model may remain in this state until there is enough capacity to
    // start training.
    PENDING = 1;

    // The training has succeeded.
    SUCCEEDED = 2;

    // The training has succeeded.
    FAILED = 3;

    // The training has been cancelled.
    CANCELLED = 4;

    // The training is in cancelling state.
    CANCELLING = 5;

    // Custom model is training.
    TRAINING = 6;
  }

  // The resource name of the conversation model. Format:
  // `projects//conversationModels/`
  string conversation_model = 1;

  // State of CreateConversationModel operation.
  State state = 2;

  // Timestamp when the request to create conversation model is submitted. The
  // time is measured on server side.
  google.protobuf.Timestamp create_time = 3;
}

// Metadata for a
// [ConversationModels.DeployConversationModel][google.cloud.dialogflow.v2.ConversationModels.DeployConversationModel]
// operation.
message DeployConversationModelOperationMetadata {
  // The resource name of the conversation model. Format:
  // `projects//conversationModels/`
  string conversation_model = 1;

  // Timestamp when request to deploy conversation model was submitted. The time
  // is measured on server side.
  google.protobuf.Timestamp create_time = 3;
}

// Metadata for a
// [ConversationModels.UndeployConversationModel][google.cloud.dialogflow.v2.ConversationModels.UndeployConversationModel]
// operation.
message UndeployConversationModelOperationMetadata {
  // The resource name of the conversation model. Format:
  // `projects//conversationModels/`
  string conversation_model = 1;

  // Timestamp when the request to undeploy conversation model was submitted.
  // The time is measured on server side.
  google.protobuf.Timestamp create_time = 3;
}

// Metadata for a
// [ConversationModels.DeleteConversationModel][google.cloud.dialogflow.v2.ConversationModels.DeleteConversationModel]
// operation.
message DeleteConversationModelOperationMetadata {
  // The resource name of the conversation model. Format:
  // `projects//conversationModels/`
  string conversation_model = 1;

  // Timestamp when delete conversation model request was created. The time is
  // measured on server side.
  google.protobuf.Timestamp create_time = 3;
}

// Metadata for a
// [ConversationModels.CreateConversationModelEvaluation][google.cloud.dialogflow.v2.ConversationModels.CreateConversationModelEvaluation]
// operation.
message CreateConversationModelEvaluationOperationMetadata {
  // State of CreateConversationModel operation.
  enum State {
    // Operation status not specified.
    STATE_UNSPECIFIED = 0;

    // The operation is being prepared.
    INITIALIZING = 1;

    // The operation is running.
    RUNNING = 2;

    // The operation is cancelled.
    CANCELLED = 3;

    // The operation has succeeded.
    SUCCEEDED = 4;

    // The operation has failed.
    FAILED = 5;
  }

  // The resource name of the conversation model. Format:
  // `projects//locations//conversationModels//evaluations/`
  string conversation_model_evaluation = 1;

  // The resource name of the conversation model. Format:
  // `projects//locations//conversationModels/`
  string conversation_model = 4;

  // State of CreateConversationModel operation.
  State state = 2;

  // Timestamp when the request to create conversation model was submitted. The
  // time is measured on server side.
  google.protobuf.Timestamp create_time = 3;
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy