// Copyright 2025 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

edition = "2023";

package optimization_guide.proto;

import "components/optimization_guide/proto/on_device_model_execution_config.proto";

import "components/optimization_guide/proto/features/media.proto";

option optimize_for = LITE_RUNTIME;
option java_package = "org.chromium.components.optimization_guide.features.proto";

option java_outer_classname = "PromptApiProto";

// DO NOT EDIT THIS FILE DIRECTLY!
//
// This file is generated in g3 and then synced to Chrome. Instead, please refer to
// http://go/chrome-mqls-onboarding (Google-internal link), and then changes will
// be synced with Chrome automatically.

message PromptApiLoggingData {
  PromptApiRequest request = 1 [features = { field_presence: EXPLICIT }];

  PromptApiResponse response = 2 [features = { field_presence: EXPLICIT }];

  // Metadata is added to force it to be included in the Chrome version.
  PromptApiMetadata metadata = 3 [features = { field_presence: EXPLICIT }];
}

// A request from PromptApi for prompt execution call.
message PromptApiRequest {
  // The values passed as initialPrompts for the session.
  // See https://github.com/explainers-by-googlers/prompt-api#n-shot-prompting
  repeated PromptApiPrompt initial_prompts = 1;

  // Previously executed prompts, and their responses.
  // See
  // https://github.com/explainers-by-googlers/prompt-api#session-persistence-and-cloning
  // Typically this will be some alternating sequence of 'user' and 'assistant'
  // prompts.
  repeated PromptApiPrompt prompt_history = 2;

  // The new prompts for the current execution request (e.g. what is passed to
  // prompt()/promptStreaming()) Typically this will be a single 'user' prompt.
  repeated PromptApiPrompt current_prompts = 3;
}

// A single part of a prompt.
// See https://github.com/explainers-by-googlers/prompt-api#n-shot-prompting
message PromptApiPrompt {
  // The content for this prompt.
  oneof kind {
    string text = 2;

    Media media = 3;
  }

  // The role for this prompt.
  PromptApiRole role = 1 [features = { field_presence: EXPLICIT }];
}

message PromptApiResponse {
  string output = 1 [features = { field_presence: EXPLICIT }];
}

// Type for OnDeviceModelExecutionFeatureConfig::feature_metadata.
message PromptApiMetadata {
  // A version for config changes that require implementor updates.
  // Version 0->2 Changes from using StringValue -> PromptApiRequest.
  uint32 version = 1 [features = { field_presence: EXPLICIT }];

  // The maximum value of top k and temperature that this feature can support.
  // If the provided value is largest than the max value, they will be clamped.
  SamplingParams max_sampling_params = 3 [features = { field_presence: EXPLICIT }];

  // A list of custom presets for sampling configuration.
  repeated SamplingPreset sampling_presets = 4;

  // Represents a custom sampling parameter mapping configuration.
  message SamplingPreset {
    string name = 1 [features = { field_presence: EXPLICIT }];

    uint32 top_k = 2 [features = { field_presence: EXPLICIT }];

    float temperature = 3 [features = { field_presence: EXPLICIT }];
  }

  reserved 2;
}

// A prompt role.
// See https://github.com/explainers-by-googlers/prompt-api#n-shot-prompting
enum PromptApiRole {
  PROMPT_API_ROLE_UNSPECIFIED = 0;

  PROMPT_API_ROLE_SYSTEM = 1;

  PROMPT_API_ROLE_ASSISTANT = 2;

  PROMPT_API_ROLE_USER = 3;
}
