// 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.ai.generativelanguage.v1;

import "google/api/field_behavior.proto";

option go_package = "cloud.google.com/go/ai/generativelanguage/apiv1/generativelanguagepb;generativelanguagepb";
option java_multiple_files = true;
option java_outer_classname = "SafetyProto";
option java_package = "com.google.ai.generativelanguage.v1";

// The category of a rating.
//
// These categories cover various kinds of harms that developers
// may wish to adjust.
enum HarmCategory {
  // Category is unspecified.
  HARM_CATEGORY_UNSPECIFIED = 0;

  // **PaLM** - Negative or harmful comments targeting identity and/or protected
  // attribute.
  HARM_CATEGORY_DEROGATORY = 1;

  // **PaLM** - Content that is rude, disrespectful, or profane.
  HARM_CATEGORY_TOXICITY = 2;

  // **PaLM** - Describes scenarios depicting violence against an individual or
  // group, or general descriptions of gore.
  HARM_CATEGORY_VIOLENCE = 3;

  // **PaLM** - Contains references to sexual acts or other lewd content.
  HARM_CATEGORY_SEXUAL = 4;

  // **PaLM** - Promotes unchecked medical advice.
  HARM_CATEGORY_MEDICAL = 5;

  // **PaLM** - Dangerous content that promotes, facilitates, or encourages
  // harmful acts.
  HARM_CATEGORY_DANGEROUS = 6;

  // **Gemini** - Harassment content.
  HARM_CATEGORY_HARASSMENT = 7;

  // **Gemini** - Hate speech and content.
  HARM_CATEGORY_HATE_SPEECH = 8;

  // **Gemini** - Sexually explicit content.
  HARM_CATEGORY_SEXUALLY_EXPLICIT = 9;

  // **Gemini** - Dangerous content.
  HARM_CATEGORY_DANGEROUS_CONTENT = 10;

  // **Gemini** - Content that may be used to harm civic integrity.
  HARM_CATEGORY_CIVIC_INTEGRITY = 11;
}

// Safety rating for a piece of content.
//
// The safety rating contains the category of harm and the
// harm probability level in that category for a piece of content.
// Content is classified for safety across a number of
// harm categories and the probability of the harm classification is included
// here.
message SafetyRating {
  // The probability that a piece of content is harmful.
  //
  // The classification system gives the probability of the content being
  // unsafe. This does not indicate the severity of harm for a piece of content.
  enum HarmProbability {
    // Probability is unspecified.
    HARM_PROBABILITY_UNSPECIFIED = 0;

    // Content has a negligible chance of being unsafe.
    NEGLIGIBLE = 1;

    // Content has a low chance of being unsafe.
    LOW = 2;

    // Content has a medium chance of being unsafe.
    MEDIUM = 3;

    // Content has a high chance of being unsafe.
    HIGH = 4;
  }

  // Required. The category for this rating.
  HarmCategory category = 3 [(google.api.field_behavior) = REQUIRED];

  // Required. The probability of harm for this content.
  HarmProbability probability = 4 [(google.api.field_behavior) = REQUIRED];

  // Was this content blocked because of this rating?
  bool blocked = 5;
}

// Safety setting, affecting the safety-blocking behavior.
//
// Passing a safety setting for a category changes the allowed probability that
// content is blocked.
message SafetySetting {
  // Block at and beyond a specified harm probability.
  enum HarmBlockThreshold {
    // Threshold is unspecified.
    HARM_BLOCK_THRESHOLD_UNSPECIFIED = 0;

    // Content with NEGLIGIBLE will be allowed.
    BLOCK_LOW_AND_ABOVE = 1;

    // Content with NEGLIGIBLE and LOW will be allowed.
    BLOCK_MEDIUM_AND_ABOVE = 2;

    // Content with NEGLIGIBLE, LOW, and MEDIUM will be allowed.
    BLOCK_ONLY_HIGH = 3;

    // All content will be allowed.
    BLOCK_NONE = 4;

    // Turn off the safety filter.
    OFF = 5;
  }

  // Required. The category for this setting.
  HarmCategory category = 3 [(google.api.field_behavior) = REQUIRED];

  // Required. Controls the probability threshold at which harm is blocked.
  HarmBlockThreshold threshold = 4 [(google.api.field_behavior) = REQUIRED];
}
