// Copyright 2026 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.ces.v1;

import "google/api/field_behavior.proto";
import "google/api/resource.proto";
import "google/cloud/ces/v1/bigquery_export.proto";
import "google/cloud/ces/v1/common.proto";
import "google/cloud/ces/v1/schema.proto";
import "google/protobuf/duration.proto";
import "google/protobuf/timestamp.proto";

option go_package = "cloud.google.com/go/ces/apiv1/cespb;cespb";
option java_multiple_files = true;
option java_outer_classname = "AppProto";
option java_package = "com.google.cloud.ces.v1";
option (google.api.resource_definition) = {
  type: "dlp.googleapis.com/InspectTemplate"
  pattern: "organizations/{organization}/locations/{location}/inspectTemplates/{inspect_template}"
  pattern: "projects/{project}/locations/{location}/inspectTemplates/{inspect_template}"
};
option (google.api.resource_definition) = {
  type: "dlp.googleapis.com/DeidentifyTemplate"
  pattern: "organizations/{organization}/locations/{location}/deidentifyTemplates/{deidentify_template}"
  pattern: "projects/{project}/locations/{location}/deidentifyTemplates/{deidentify_template}"
};
option (google.api.resource_definition) = {
  type: "discoveryengine.googleapis.com/Engine"
  pattern: "projects/{project}/locations/{location}/collections/{collection}/engines/{engine}"
};

// An app serves as a top-level container for a group of agents, including the
// root agent and its sub-agents, along with their associated configurations.
// These agents work together to achieve specific goals within the app's
// context.
message App {
  option (google.api.resource) = {
    type: "ces.googleapis.com/App"
    pattern: "projects/{project}/locations/{location}/apps/{app}"
    plural: "apps"
    singular: "app"
  };

  // Defines the structure and metadata for a variable.
  message VariableDeclaration {
    // Required. The name of the variable. The name must start with a letter or
    // underscore and contain only letters, numbers, or underscores.
    string name = 1 [(google.api.field_behavior) = REQUIRED];

    // Required. The description of the variable.
    string description = 2 [(google.api.field_behavior) = REQUIRED];

    // Required. The schema of the variable.
    Schema schema = 3 [(google.api.field_behavior) = REQUIRED];
  }

  // Defines the tool execution behavior if there are **multiple** tools being
  // selected by the agent **at the same time**.
  enum ToolExecutionMode {
    // Unspecified tool execution mode. Default to PARALLEL.
    TOOL_EXECUTION_MODE_UNSPECIFIED = 0;

    // If there are multiple tools being selected, they will be executed in
    // parallel, with the same
    // [ToolContext](https://google.github.io/adk-docs/context/#the-different-types-of-context).
    PARALLEL = 1;

    // If there are multiple tools being selected, they will be executed
    // sequentially. The next tool will only be executed after the previous tool
    // completes and it can see updated
    // [ToolContext](https://google.github.io/adk-docs/context/#the-different-types-of-context)
    // from the previous tool.
    SEQUENTIAL = 2;
  }

  // Identifier. The unique identifier of the app.
  // Format: `projects/{project}/locations/{location}/apps/{app}`
  string name = 1 [(google.api.field_behavior) = IDENTIFIER];

  // Required. Display name of the app.
  string display_name = 2 [(google.api.field_behavior) = REQUIRED];

  // Optional. Human-readable description of the app.
  string description = 3 [(google.api.field_behavior) = OPTIONAL];

  // Optional. Whether the app is pinned in the app list.
  bool pinned = 31 [(google.api.field_behavior) = OPTIONAL];

  // Optional. The root agent is the entry point of the app.
  // Format: `projects/{project}/locations/{location}/apps/{app}/agents/{agent}`
  string root_agent = 4 [
    (google.api.field_behavior) = OPTIONAL,
    (google.api.resource_reference) = { type: "ces.googleapis.com/Agent" }
  ];

  // Optional. Language settings of the app.
  LanguageSettings language_settings = 18
      [(google.api.field_behavior) = OPTIONAL];

  // Optional. TimeZone settings of the app.
  TimeZoneSettings time_zone_settings = 27
      [(google.api.field_behavior) = OPTIONAL];

  // Optional. Audio processing configuration of the app.
  AudioProcessingConfig audio_processing_config = 7
      [(google.api.field_behavior) = OPTIONAL];

  // Optional. Logging settings of the app.
  LoggingSettings logging_settings = 8 [(google.api.field_behavior) = OPTIONAL];

  // Optional. Error handling settings of the app.
  ErrorHandlingSettings error_handling_settings = 34
      [(google.api.field_behavior) = OPTIONAL];

  // Optional. The default LLM model settings for the app.
  // Individual resources (e.g. agents, guardrails) can override these
  // configurations as needed.
  ModelSettings model_settings = 13 [(google.api.field_behavior) = OPTIONAL];

  // Optional. The tool execution mode for the app. If not provided, will
  // default to PARALLEL.
  ToolExecutionMode tool_execution_mode = 32
      [(google.api.field_behavior) = OPTIONAL];

  // Optional. The evaluation thresholds for the app.
  EvaluationMetricsThresholds evaluation_metrics_thresholds = 24
      [(google.api.field_behavior) = OPTIONAL];

  // Optional. The declarations of the variables.
  repeated VariableDeclaration variable_declarations = 14
      [(google.api.field_behavior) = OPTIONAL];

  // Output only. The declarations of predefined variables for the app.
  repeated VariableDeclaration predefined_variable_declarations = 28
      [(google.api.field_behavior) = OUTPUT_ONLY];

  // Optional. Instructions for all the agents in the app.
  // You can use this instruction to set up a stable identity or personality
  // across all the agents.
  string global_instruction = 17 [(google.api.field_behavior) = OPTIONAL];

  // Optional. List of guardrails for the app.
  // Format:
  // `projects/{project}/locations/{location}/apps/{app}/guardrails/{guardrail}`
  repeated string guardrails = 10 [
    (google.api.field_behavior) = OPTIONAL,
    (google.api.resource_reference) = { type: "ces.googleapis.com/Guardrail" }
  ];

  // Optional. The data store settings for the app.
  DataStoreSettings data_store_settings = 15
      [(google.api.field_behavior) = OPTIONAL];

  // Optional. The default channel profile used by the app.
  ChannelProfile default_channel_profile = 22
      [(google.api.field_behavior) = OPTIONAL];

  // Optional. Metadata about the app. This field can be used to store
  // additional information relevant to the app's details or intended usages.
  map<string, string> metadata = 11 [(google.api.field_behavior) = OPTIONAL];

  // Output only. Timestamp when the app was created.
  google.protobuf.Timestamp create_time = 5
      [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. Timestamp when the app was last updated.
  google.protobuf.Timestamp update_time = 6
      [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. Etag used to ensure the object hasn't changed during a
  // read-modify-write operation. If the etag is empty, the update will
  // overwrite any concurrent changes.
  string etag = 12 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. Number of deployments in the app.
  int32 deployment_count = 23 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Optional. The default client certificate settings for the app.
  ClientCertificateSettings client_certificate_settings = 25
      [(google.api.field_behavior) = OPTIONAL];

  // Optional. Indicates whether the app is locked for changes. If the app is
  // locked, modifications to the app resources will be rejected.
  bool locked = 29 [(google.api.field_behavior) = OPTIONAL];
}

// TimeZone settings of the app.
message TimeZoneSettings {
  // Optional. The time zone of the app from the [time zone
  // database](https://www.iana.org/time-zones), e.g., America/Los_Angeles,
  // Europe/Paris.
  string time_zone = 1 [(google.api.field_behavior) = OPTIONAL];
}

// Language settings of the app.
message LanguageSettings {
  // Optional. The default language code of the app.
  string default_language_code = 1 [(google.api.field_behavior) = OPTIONAL];

  // Optional. List of languages codes supported by the app, in addition to the
  // `default_language_code`.
  repeated string supported_language_codes = 2
      [(google.api.field_behavior) = OPTIONAL];

  // Optional. Enables multilingual support. If true, agents in the app will use
  // pre-built instructions to improve handling of multilingual input.
  bool enable_multilingual_support = 3 [(google.api.field_behavior) = OPTIONAL];

  // Optional. Deprecated: This feature is no longer supported. Use
  // `enable_multilingual_support` instead to improve handling of multilingual
  // input.
  // The action to perform when an agent receives input in an unsupported
  // language.
  //
  // This can be a predefined action or a custom tool call.
  // Valid values are:
  // - A tool's full resource name, which triggers a specific tool execution.
  // - A predefined system action, such as "escalate" or "exit", which triggers
  // an [EndSession][google.cloud.ces.v1.EndSession] signal with corresponding
  // [metadata][google.cloud.ces.v1.EndSession.metadata] to terminate the
  // conversation.
  string fallback_action = 4
      [deprecated = true, (google.api.field_behavior) = OPTIONAL];
}

// Configuration for how the input and output audio should be processed and
// delivered.
message AudioProcessingConfig {
  // Optional. Configuration of how the agent response should be synthesized,
  // mapping from the language code to
  // [SynthesizeSpeechConfig][google.cloud.ces.v1.SynthesizeSpeechConfig].
  //
  // If the configuration for the specified language code is not found, the
  // configuration for the root language code will be used. For example, if the
  // map contains "en-us" and "en", and the specified language code is "en-gb",
  // then "en" configuration will be used.
  //
  // Note: Language code is case-insensitive.
  map<string, SynthesizeSpeechConfig> synthesize_speech_configs = 1
      [(google.api.field_behavior) = OPTIONAL];

  // Optional. Configures the agent behavior for the user barge-in activities.
  BargeInConfig barge_in_config = 3 [(google.api.field_behavior) = OPTIONAL];

  // Optional. The duration of user inactivity (no speech or interaction) before
  // the agent prompts the user for reengagement. If not set, the agent will not
  // prompt the user for reengagement.
  google.protobuf.Duration inactivity_timeout = 4
      [(google.api.field_behavior) = OPTIONAL];

  // Optional. Configuration for the ambient sound to be played with the
  // synthesized agent response, to enhance the naturalness of the conversation.
  AmbientSoundConfig ambient_sound_config = 5
      [(google.api.field_behavior) = OPTIONAL];
}

// Configuration for the ambient sound to be played with the synthesized agent
// response, to enhance the naturalness of the conversation.
message AmbientSoundConfig {
  // Prebuilt ambient noise.
  enum PrebuiltAmbientNoise {
    // Not specified.
    PREBUILT_AMBIENT_NOISE_UNSPECIFIED = 0;

    // Ambient noise of a retail store.
    RETAIL_STORE = 1;

    // Ambient noise of a convention hall.
    CONVENTION_HALL = 2;

    // Ambient noise of a street.
    OUTDOOR = 3;
  }

  // Ambient noise to be played with the synthesized agent response, to
  // enhance the naturalness of the conversation.
  oneof source {
    // Optional. Deprecated: `prebuilt_ambient_noise` is deprecated in favor of
    // `prebuilt_ambient_sound`.
    PrebuiltAmbientNoise prebuilt_ambient_noise = 1
        [deprecated = true, (google.api.field_behavior) = OPTIONAL];

    // Optional. Ambient noise as a mono-channel, 16kHz WAV file stored in
    // [Cloud Storage](https://cloud.google.com/storage).
    //
    // Note: Please make sure the CES service agent
    // `service-<PROJECT-NUMBER>@gcp-sa-ces.iam.gserviceaccount.com` has
    // `storage.objects.get` permission to the Cloud Storage object.
    string gcs_uri = 2 [(google.api.field_behavior) = OPTIONAL];

    // Optional. Name of the prebuilt ambient sound.
    // Valid values are:
    // - "coffee_shop"
    // - "keyboard"
    // - "keypad"
    // - "hum"
    // - "office_1"
    // - "office_2"
    // - "office_3"
    // - "room_1"
    // - "room_2"
    // - "room_3"
    // - "room_4"
    // - "room_5"
    // - "air_conditioner"
    string prebuilt_ambient_sound = 4 [(google.api.field_behavior) = OPTIONAL];
  }

  // Optional. Volume gain (in dB) of the normal native volume supported by
  // ambient noise, in the range [-96.0, 16.0]. If unset, or set to a value of
  // 0.0 (dB), will play at normal native signal amplitude. A value of -6.0 (dB)
  // will play at approximately half the amplitude of the normal native signal
  // amplitude. A value of +6.0 (dB) will play at approximately twice the
  // amplitude of the normal native signal amplitude. We strongly recommend not
  // to exceed +10 (dB) as there's usually no effective increase in loudness for
  // any value greater than that.
  double volume_gain_db = 3 [(google.api.field_behavior) = OPTIONAL];
}

// Configuration for how the user barge-in activities should be handled.
message BargeInConfig {
  // Optional. Disables user barge-in while the agent is speaking. If true, user
  // input during agent response playback will be ignored.
  //
  // Deprecated: `disable_barge_in` is deprecated in favor of
  // [`disable_barge_in_control`][google.cloud.ces.v1.ChannelProfile.disable_barge_in_control]
  // in ChannelProfile.
  bool disable_barge_in = 1
      [deprecated = true, (google.api.field_behavior) = OPTIONAL];

  // Optional. If enabled, the agent will adapt its next response based on the
  // assumption that the user hasn't heard the full preceding agent message.
  // This should not be used in scenarios where agent responses are displayed
  // visually.
  bool barge_in_awareness = 2 [(google.api.field_behavior) = OPTIONAL];
}

// Configuration for how the agent response should be synthesized.
message SynthesizeSpeechConfig {
  // Optional. The name of the voice. If not set, the service will choose a
  // voice based on the other parameters such as language_code.
  //
  // For the list of available voices, please refer to [Supported voices and
  // languages](https://cloud.google.com/text-to-speech/docs/voices) from Cloud
  // Text-to-Speech.
  string voice = 1 [(google.api.field_behavior) = OPTIONAL];

  // Optional. The speaking rate/speed in the range [0.25, 2.0]. 1.0 is the
  // normal native speed supported by the specific voice. 2.0 is twice as fast,
  // and 0.5 is half as fast. Values outside of the range [0.25, 2.0] will
  // return an error.
  double speaking_rate = 2 [(google.api.field_behavior) = OPTIONAL];
}

// Settings to describe the conversation data collection behaviors for LLM
// analysis metrics pipeline.
message MetricAnalysisSettings {
  // Optional. Whether to collect conversation data for llm analysis metrics. If
  // true, conversation data will not be collected for llm analysis metrics;
  // otherwise, conversation data will be collected.
  bool llm_metrics_opted_out = 1 [(google.api.field_behavior) = OPTIONAL];
}

// Settings to describe the logging behaviors for the app.
message LoggingSettings {
  // Optional. Configuration for how sensitive data should be redacted.
  RedactionConfig redaction_config = 1 [(google.api.field_behavior) = OPTIONAL];

  // Optional. Configuration for how audio interactions should be recorded.
  AudioRecordingConfig audio_recording_config = 2
      [(google.api.field_behavior) = OPTIONAL];

  // Optional. Settings to describe the BigQuery export behaviors for the app.
  // The conversation data will be exported to BigQuery tables if it is enabled.
  BigQueryExportSettings bigquery_export_settings = 3
      [(google.api.field_behavior) = OPTIONAL];

  // Optional. Settings to describe the Cloud Logging behaviors for the app.
  CloudLoggingSettings cloud_logging_settings = 4
      [(google.api.field_behavior) = OPTIONAL];

  // Optional. Settings to describe the conversation logging behaviors for the
  // app.
  ConversationLoggingSettings conversation_logging_settings = 5
      [(google.api.field_behavior) = OPTIONAL];

  // Optional. Configuration for how audio interactions should be recorded for
  // the evaluation. By default, audio recording is not enabled for evaluation
  // sessions.
  AudioRecordingConfig evaluation_audio_recording_config = 6
      [(google.api.field_behavior) = OPTIONAL];

  // Optional. Settings to describe the conversation data collection behaviors
  // for the LLM analysis pipeline for the app.
  MetricAnalysisSettings metric_analysis_settings = 7
      [(google.api.field_behavior) = OPTIONAL];
}

// Settings to describe how errors should be handled in the app.
message ErrorHandlingSettings {
  // Defines the strategy for handling errors.
  enum ErrorHandlingStrategy {
    // Unspecified error handling strategy.
    ERROR_HANDLING_STRATEGY_UNSPECIFIED = 0;

    // No specific handling is enabled.
    NONE = 1;

    // A fallback message will be returned to the user in case of
    // system errors (e.g. LLM errors).
    FALLBACK_RESPONSE = 2;

    // An [EndSession][google.cloud.ces.v1.EndSession] signal will be emitted in
    // case of system errors (e.g. LLM errors).
    END_SESSION = 3;
  }

  // Optional. The strategy to use for error handling.
  ErrorHandlingStrategy error_handling_strategy = 1
      [(google.api.field_behavior) = OPTIONAL];
}

// Threshold settings for metrics in an Evaluation.
message EvaluationMetricsThresholds {
  // Settings for golden evaluations.
  message GoldenEvaluationMetricsThresholds {
    // Turn level metrics thresholds.
    message TurnLevelMetricsThresholds {
      // Semantic similarity channel to use.
      enum SemanticSimilarityChannel {
        // Metric unspecified. Defaults to TEXT.
        SEMANTIC_SIMILARITY_CHANNEL_UNSPECIFIED = 0;

        // Use text semantic similarity.
        TEXT = 1;

        // Use audio semantic similarity.
        AUDIO = 2;
      }

      // Optional. The success threshold for semantic similarity. Must be an
      // integer between 0 and 4. Default is >= 3.
      optional int32 semantic_similarity_success_threshold = 1
          [(google.api.field_behavior) = OPTIONAL];

      // Optional. The success threshold for overall tool invocation
      // correctness. Must be a float between 0 and 1. Default is 1.0.
      optional float overall_tool_invocation_correctness_threshold = 2
          [(google.api.field_behavior) = OPTIONAL];

      // Optional. The semantic similarity channel to use for evaluation.
      SemanticSimilarityChannel semantic_similarity_channel = 3
          [(google.api.field_behavior) = OPTIONAL];
    }

    // Expectation level metrics thresholds.
    message ExpectationLevelMetricsThresholds {
      // Optional. The success threshold for individual tool invocation
      // parameter correctness. Must be a float between 0 and 1. Default is 1.0.
      optional float tool_invocation_parameter_correctness_threshold = 1
          [(google.api.field_behavior) = OPTIONAL];
    }

    // Optional. The turn level metrics thresholds.
    TurnLevelMetricsThresholds turn_level_metrics_thresholds = 1
        [(google.api.field_behavior) = OPTIONAL];

    // Optional. The expectation level metrics thresholds.
    ExpectationLevelMetricsThresholds expectation_level_metrics_thresholds = 2
        [(google.api.field_behavior) = OPTIONAL];

    // Optional. The tool matching settings. An
    // extra tool call is a tool call that is present in the execution but does
    // not match any tool call in the golden expectation.
    ToolMatchingSettings tool_matching_settings = 3
        [(google.api.field_behavior) = OPTIONAL];
  }

  // Settings for matching tool calls.
  message ToolMatchingSettings {
    // Defines the behavior when an extra tool call is encountered. An extra
    // tool call is a tool call that is present in the execution but does not
    // match any tool call in the golden expectation.
    enum ExtraToolCallBehavior {
      // Unspecified behavior. Defaults to FAIL.
      EXTRA_TOOL_CALL_BEHAVIOR_UNSPECIFIED = 0;

      // Fail the evaluation if an extra tool call is encountered.
      FAIL = 1;

      // Allow the extra tool call.
      ALLOW = 2;
    }

    // Optional. Behavior for extra tool calls.
    // Defaults to FAIL.
    ExtraToolCallBehavior extra_tool_call_behavior = 1
        [(google.api.field_behavior) = OPTIONAL];
  }

  // The hallucination metric behavior. Regardless of the behavior, the metric
  // will always be calculated. The difference is that when disabled, the
  // metric is not used to calculate the overall evaluation score.
  enum HallucinationMetricBehavior {
    // Unspecified hallucination metric behavior.
    HALLUCINATION_METRIC_BEHAVIOR_UNSPECIFIED = 0;

    // Disable hallucination metric.
    DISABLED = 1;

    // Enable hallucination metric.
    ENABLED = 2;
  }

  // Optional. The golden evaluation metrics thresholds.
  GoldenEvaluationMetricsThresholds golden_evaluation_metrics_thresholds = 1
      [(google.api.field_behavior) = OPTIONAL];

  // Optional. Deprecated: Use `golden_hallucination_metric_behavior` instead.
  // The hallucination metric behavior is currently used for golden evaluations.
  HallucinationMetricBehavior hallucination_metric_behavior = 3
      [deprecated = true, (google.api.field_behavior) = OPTIONAL];

  // Optional. The hallucination metric behavior for golden evaluations.
  HallucinationMetricBehavior golden_hallucination_metric_behavior = 5
      [(google.api.field_behavior) = OPTIONAL];

  // Optional. The hallucination metric behavior for scenario evaluations.
  HallucinationMetricBehavior scenario_hallucination_metric_behavior = 4
      [(google.api.field_behavior) = OPTIONAL];
}

// Settings for custom client certificates.
message ClientCertificateSettings {
  // Required. The TLS certificate encoded in PEM format. This string must
  // include the begin header and end footer lines.
  string tls_certificate = 1 [(google.api.field_behavior) = REQUIRED];

  // Required. The name of the SecretManager secret version resource storing the
  // private key encoded in PEM format.
  // Format: `projects/{project}/secrets/{secret}/versions/{version}`
  string private_key = 2 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      type: "secretmanager.googleapis.com/SecretVersion"
    }
  ];

  // Optional. The name of the SecretManager secret version resource storing the
  // passphrase to decrypt the private key. Should be left unset if the private
  // key is not encrypted.
  // Format: `projects/{project}/secrets/{secret}/versions/{version}`
  string passphrase = 3 [(google.api.field_behavior) = OPTIONAL];
}

// Settings to describe the conversation logging behaviors for the app.
message ConversationLoggingSettings {
  // Optional. Whether to disable conversation logging for the sessions.
  bool disable_conversation_logging = 1
      [(google.api.field_behavior) = OPTIONAL];
}

// Settings to describe the Cloud Logging behaviors for the app.
message CloudLoggingSettings {
  // Optional. Whether to enable Cloud Logging for the sessions.
  bool enable_cloud_logging = 1 [(google.api.field_behavior) = OPTIONAL];
}

// Configuration for how the audio interactions should be recorded.
message AudioRecordingConfig {
  // Optional. The [Cloud Storage](https://cloud.google.com/storage) bucket to
  // store the session audio recordings. The URI must start with "gs://".
  //
  // Please choose a bucket location that meets your data residency
  // requirements.
  //
  // Note: If the Cloud Storage bucket is in a different project from the app,
  // you should grant `storage.objects.create` permission to the CES service
  // agent `service-<PROJECT-NUMBER>@gcp-sa-ces.iam.gserviceaccount.com`.
  string gcs_bucket = 1 [(google.api.field_behavior) = OPTIONAL];

  // Optional. The Cloud Storage path prefix for audio recordings.
  //
  // This prefix can include the following placeholders, which will be
  // dynamically substituted at serving time:
  //   - $project:   project ID
  //   - $location:  app location
  //   - $app:       app ID
  //   - $date:      session date in YYYY-MM-DD format
  //   - $session:   session ID
  //
  // If the path prefix is not specified, the default prefix
  // `$project/$location/$app/$date/$session/` will be used.
  string gcs_path_prefix = 2 [(google.api.field_behavior) = OPTIONAL];
}

// Configuration to instruct how sensitive data should be handled.
message RedactionConfig {
  // Optional. If true, redaction will be applied in various logging scenarios,
  // including conversation history, Cloud Logging and audio recording.
  bool enable_redaction = 1 [(google.api.field_behavior) = OPTIONAL];

  // Optional. [DLP](https://cloud.google.com/dlp/docs) inspect template name to
  // configure detection of sensitive data types.
  //
  // Format:
  // `projects/{project}/locations/{location}/inspectTemplates/{inspect_template}`
  string inspect_template = 2 [
    (google.api.field_behavior) = OPTIONAL,
    (google.api.resource_reference) = {
      type: "dlp.googleapis.com/InspectTemplate"
    }
  ];

  // Optional. [DLP](https://cloud.google.com/dlp/docs) deidentify template name
  // to instruct on how to de-identify content.
  //
  // Format:
  // `projects/{project}/locations/{location}/deidentifyTemplates/{deidentify_template}`
  string deidentify_template = 3 [
    (google.api.field_behavior) = OPTIONAL,
    (google.api.resource_reference) = {
      type: "dlp.googleapis.com/DeidentifyTemplate"
    }
  ];
}

// Data store related settings for the app.
message DataStoreSettings {
  // An engine to which the data stores are connected.
  // See Vertex AI Search:
  // https://cloud.google.com/generative-ai-app-builder/docs/enterprise-search-introduction.
  message Engine {
    // The type of the engine.
    // See the documentation available at
    // https://cloud.google.com/generative-ai-app-builder/docs/reference/rest/v1/SolutionType
    // and
    // https://cloud.google.com/generative-ai-app-builder/docs/create-datastore-ingest.
    enum Type {
      // Unspecified engine type.
      TYPE_UNSPECIFIED = 0;

      // The SOLUTION_TYPE_SEARCH engine for the app. All connector data stores
      // added to the app will be added to this engine.
      ENGINE_TYPE_SEARCH = 1;

      // Chat engine type.
      // The SOLUTION_TYPE_CHAT engine for the app. All connector data stores
      // added to the app will be added to this engine.
      ENGINE_TYPE_CHAT = 2;
    }

    // Output only. The resource name of the engine.
    // Format:
    // `projects/{project}/locations/{location}/collections/{collection}/engines/{engine}`
    string name = 1 [
      (google.api.field_behavior) = OUTPUT_ONLY,
      (google.api.resource_reference) = {
        type: "discoveryengine.googleapis.com/Engine"
      }
    ];

    // Output only. The type of the engine.
    Type type = 2 [(google.api.field_behavior) = OUTPUT_ONLY];
  }

  // Output only. The engines for the app.
  repeated Engine engines = 3 [(google.api.field_behavior) = OUTPUT_ONLY];
}
