Files
pierre-bot/vendor/github.com/google/generative-ai-go/genai/generativelanguagepb_veneer.gen.go
2026-02-12 21:44:10 +01:00

1786 lines
55 KiB
Go

// 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.
// This file was generated by protoveneer. DO NOT EDIT.
package genai
import (
"fmt"
"time"
pb "cloud.google.com/go/ai/generativelanguage/apiv1beta/generativelanguagepb"
"github.com/googleapis/gax-go/v2/apierror"
spb "google.golang.org/genproto/googleapis/rpc/status"
gstatus "google.golang.org/grpc/status"
"google.golang.org/protobuf/types/known/durationpb"
"google.golang.org/protobuf/types/known/structpb"
"google.golang.org/protobuf/types/known/timestamppb"
)
// BatchEmbedContentsResponse is the response to a `BatchEmbedContentsRequest`.
type BatchEmbedContentsResponse struct {
// Output only. The embeddings for each request, in the same order as provided
// in the batch request.
Embeddings []*ContentEmbedding
}
func (v *BatchEmbedContentsResponse) toProto() *pb.BatchEmbedContentsResponse {
if v == nil {
return nil
}
return &pb.BatchEmbedContentsResponse{
Embeddings: pvTransformSlice(v.Embeddings, (*ContentEmbedding).toProto),
}
}
func (BatchEmbedContentsResponse) fromProto(p *pb.BatchEmbedContentsResponse) *BatchEmbedContentsResponse {
if p == nil {
return nil
}
return &BatchEmbedContentsResponse{
Embeddings: pvTransformSlice(p.Embeddings, (ContentEmbedding{}).fromProto),
}
}
// Blob contains raw media bytes.
//
// Text should not be sent as raw bytes, use the 'text' field.
type Blob struct {
// The IANA standard MIME type of the source data.
// Examples:
// - image/png
// - image/jpeg
//
// If an unsupported MIME type is provided, an error will be returned. For a
// complete list of supported types, see [Supported file
// formats](https://ai.google.dev/gemini-api/docs/prompting_with_media#supported_file_formats).
MIMEType string
// Raw bytes for media formats.
Data []byte
}
func (v *Blob) toProto() *pb.Blob {
if v == nil {
return nil
}
return &pb.Blob{
MimeType: v.MIMEType,
Data: v.Data,
}
}
func (Blob) fromProto(p *pb.Blob) *Blob {
if p == nil {
return nil
}
return &Blob{
MIMEType: p.MimeType,
Data: p.Data,
}
}
// BlockReason is specifies what was the reason why prompt was blocked.
type BlockReason int32
const (
// BlockReasonUnspecified means default value. This value is unused.
BlockReasonUnspecified BlockReason = 0
// BlockReasonSafety means prompt was blocked due to safety reasons. You can inspect
// `safety_ratings` to understand which safety category blocked it.
BlockReasonSafety BlockReason = 1
// BlockReasonOther means prompt was blocked due to unknown reasons.
BlockReasonOther BlockReason = 2
)
var namesForBlockReason = map[BlockReason]string{
BlockReasonUnspecified: "BlockReasonUnspecified",
BlockReasonSafety: "BlockReasonSafety",
BlockReasonOther: "BlockReasonOther",
}
func (v BlockReason) String() string {
if n, ok := namesForBlockReason[v]; ok {
return n
}
return fmt.Sprintf("BlockReason(%d)", v)
}
// CachedContent is content that has been preprocessed and can be used in subsequent request
// to GenerativeService.
//
// Cached content can be only used with model it was created for.
type CachedContent struct {
// Specifies when this resource will expire.
//
// Types that are assignable to Expiration:
//
// *CachedContent_ExpireTime
// *CachedContent_Ttl
Expiration ExpireTimeOrTTL
// Optional. Identifier. The resource name referring to the cached content.
// Format: `cachedContents/{id}`
Name string
// Optional. Immutable. The user-generated meaningful display name of the
// cached content. Maximum 128 Unicode characters.
DisplayName string
// Required. Immutable. The name of the `Model` to use for cached content
// Format: `models/{model}`
Model string
// Optional. Input only. Immutable. Developer set system instruction.
// Currently text only.
SystemInstruction *Content
// Optional. Input only. Immutable. The content to cache.
Contents []*Content
// Optional. Input only. Immutable. A list of `Tools` the model may use to
// generate the next response
Tools []*Tool
// Optional. Input only. Immutable. Tool config. This config is shared for all
// tools.
ToolConfig *ToolConfig
// Output only. Creation time of the cache entry.
CreateTime time.Time
// Output only. When the cache entry was last updated in UTC time.
UpdateTime time.Time
// Output only. Metadata on the usage of the cached content.
UsageMetadata *CachedContentUsageMetadata
}
func (v *CachedContent) toProto() *pb.CachedContent {
if v == nil {
return nil
}
p := &pb.CachedContent{
Name: pvAddrOrNil(v.Name),
DisplayName: pvAddrOrNil(v.DisplayName),
Model: pvAddrOrNil(v.Model),
SystemInstruction: v.SystemInstruction.toProto(),
Contents: pvTransformSlice(v.Contents, (*Content).toProto),
Tools: pvTransformSlice(v.Tools, (*Tool).toProto),
ToolConfig: v.ToolConfig.toProto(),
CreateTime: pvTimeToProto(v.CreateTime),
UpdateTime: pvTimeToProto(v.UpdateTime),
UsageMetadata: v.UsageMetadata.toProto(),
}
populateCachedContentTo(p, v)
return p
}
func (CachedContent) fromProto(p *pb.CachedContent) *CachedContent {
if p == nil {
return nil
}
v := &CachedContent{
Name: pvDerefOrZero(p.Name),
DisplayName: pvDerefOrZero(p.DisplayName),
Model: pvDerefOrZero(p.Model),
SystemInstruction: (Content{}).fromProto(p.SystemInstruction),
Contents: pvTransformSlice(p.Contents, (Content{}).fromProto),
Tools: pvTransformSlice(p.Tools, (Tool{}).fromProto),
ToolConfig: (ToolConfig{}).fromProto(p.ToolConfig),
CreateTime: pvTimeFromProto(p.CreateTime),
UpdateTime: pvTimeFromProto(p.UpdateTime),
UsageMetadata: (CachedContentUsageMetadata{}).fromProto(p.UsageMetadata),
}
populateCachedContentFrom(v, p)
return v
}
// CachedContentUsageMetadata is metadata on the usage of the cached content.
type CachedContentUsageMetadata struct {
// Total number of tokens that the cached content consumes.
TotalTokenCount int32
}
func (v *CachedContentUsageMetadata) toProto() *pb.CachedContent_UsageMetadata {
if v == nil {
return nil
}
return &pb.CachedContent_UsageMetadata{
TotalTokenCount: v.TotalTokenCount,
}
}
func (CachedContentUsageMetadata) fromProto(p *pb.CachedContent_UsageMetadata) *CachedContentUsageMetadata {
if p == nil {
return nil
}
return &CachedContentUsageMetadata{
TotalTokenCount: p.TotalTokenCount,
}
}
// Candidate is a response candidate generated from the model.
type Candidate struct {
// Output only. Index of the candidate in the list of candidates.
Index int32
// Output only. Generated content returned from the model.
Content *Content
// Optional. Output only. The reason why the model stopped generating tokens.
//
// If empty, the model has not stopped generating the tokens.
FinishReason FinishReason
// List of ratings for the safety of a response candidate.
//
// There is at most one rating per category.
SafetyRatings []*SafetyRating
// Output only. Citation information for model-generated candidate.
//
// This field may be populated with recitation information for any text
// included in the `content`. These are passages that are "recited" from
// copyrighted material in the foundational LLM's training data.
CitationMetadata *CitationMetadata
// Output only. Token count for this candidate.
TokenCount int32
}
func (v *Candidate) toProto() *pb.Candidate {
if v == nil {
return nil
}
return &pb.Candidate{
Index: pvAddrOrNil(v.Index),
Content: v.Content.toProto(),
FinishReason: pb.Candidate_FinishReason(v.FinishReason),
SafetyRatings: pvTransformSlice(v.SafetyRatings, (*SafetyRating).toProto),
CitationMetadata: v.CitationMetadata.toProto(),
TokenCount: v.TokenCount,
}
}
func (Candidate) fromProto(p *pb.Candidate) *Candidate {
if p == nil {
return nil
}
return &Candidate{
Index: pvDerefOrZero(p.Index),
Content: (Content{}).fromProto(p.Content),
FinishReason: FinishReason(p.FinishReason),
SafetyRatings: pvTransformSlice(p.SafetyRatings, (SafetyRating{}).fromProto),
CitationMetadata: (CitationMetadata{}).fromProto(p.CitationMetadata),
TokenCount: p.TokenCount,
}
}
// CitationMetadata is a collection of source attributions for a piece of content.
type CitationMetadata struct {
// Citations to sources for a specific response.
CitationSources []*CitationSource
}
func (v *CitationMetadata) toProto() *pb.CitationMetadata {
if v == nil {
return nil
}
return &pb.CitationMetadata{
CitationSources: pvTransformSlice(v.CitationSources, (*CitationSource).toProto),
}
}
func (CitationMetadata) fromProto(p *pb.CitationMetadata) *CitationMetadata {
if p == nil {
return nil
}
return &CitationMetadata{
CitationSources: pvTransformSlice(p.CitationSources, (CitationSource{}).fromProto),
}
}
// CitationSource contains a citation to a source for a portion of a specific response.
type CitationSource struct {
// Optional. Start of segment of the response that is attributed to this
// source.
//
// Index indicates the start of the segment, measured in bytes.
StartIndex *int32
// Optional. End of the attributed segment, exclusive.
EndIndex *int32
// Optional. URI that is attributed as a source for a portion of the text.
URI *string
// Optional. License for the GitHub project that is attributed as a source for
// segment.
//
// License info is required for code citations.
License string
}
func (v *CitationSource) toProto() *pb.CitationSource {
if v == nil {
return nil
}
return &pb.CitationSource{
StartIndex: v.StartIndex,
EndIndex: v.EndIndex,
Uri: v.URI,
License: pvAddrOrNil(v.License),
}
}
func (CitationSource) fromProto(p *pb.CitationSource) *CitationSource {
if p == nil {
return nil
}
return &CitationSource{
StartIndex: p.StartIndex,
EndIndex: p.EndIndex,
URI: p.Uri,
License: pvDerefOrZero(p.License),
}
}
// CodeExecution is tool that executes code generated by the model, and automatically returns
// the result to the model.
//
// See also `ExecutableCode` and `CodeExecutionResult` which are only generated
// when using this tool.
type CodeExecution struct {
}
func (v *CodeExecution) toProto() *pb.CodeExecution {
if v == nil {
return nil
}
return &pb.CodeExecution{}
}
func (CodeExecution) fromProto(p *pb.CodeExecution) *CodeExecution {
if p == nil {
return nil
}
return &CodeExecution{}
}
// CodeExecutionResult is result of executing the `ExecutableCode`.
//
// Only generated when using the `CodeExecution`, and always follows a `part`
// containing the `ExecutableCode`.
type CodeExecutionResult struct {
// Required. Outcome of the code execution.
Outcome CodeExecutionResultOutcome
// Optional. Contains stdout when code execution is successful, stderr or
// other description otherwise.
Output string
}
func (v *CodeExecutionResult) toProto() *pb.CodeExecutionResult {
if v == nil {
return nil
}
return &pb.CodeExecutionResult{
Outcome: pb.CodeExecutionResult_Outcome(v.Outcome),
Output: v.Output,
}
}
func (CodeExecutionResult) fromProto(p *pb.CodeExecutionResult) *CodeExecutionResult {
if p == nil {
return nil
}
return &CodeExecutionResult{
Outcome: CodeExecutionResultOutcome(p.Outcome),
Output: p.Output,
}
}
// CodeExecutionResultOutcome is enumeration of possible outcomes of the code execution.
type CodeExecutionResultOutcome int32
const (
// CodeExecutionResultOutcomeUnspecified means unspecified status. This value should not be used.
CodeExecutionResultOutcomeUnspecified CodeExecutionResultOutcome = 0
// CodeExecutionResultOutcomeOK means code execution completed successfully.
CodeExecutionResultOutcomeOK CodeExecutionResultOutcome = 1
// CodeExecutionResultOutcomeFailed means code execution finished but with a failure. `stderr` should contain the
// reason.
CodeExecutionResultOutcomeFailed CodeExecutionResultOutcome = 2
// CodeExecutionResultOutcomeDeadlineExceeded means code execution ran for too long, and was cancelled. There may or may not
// be a partial output present.
CodeExecutionResultOutcomeDeadlineExceeded CodeExecutionResultOutcome = 3
)
var namesForCodeExecutionResultOutcome = map[CodeExecutionResultOutcome]string{
CodeExecutionResultOutcomeUnspecified: "CodeExecutionResultOutcomeUnspecified",
CodeExecutionResultOutcomeOK: "CodeExecutionResultOutcomeOK",
CodeExecutionResultOutcomeFailed: "CodeExecutionResultOutcomeFailed",
CodeExecutionResultOutcomeDeadlineExceeded: "CodeExecutionResultOutcomeDeadlineExceeded",
}
func (v CodeExecutionResultOutcome) String() string {
if n, ok := namesForCodeExecutionResultOutcome[v]; ok {
return n
}
return fmt.Sprintf("CodeExecutionResultOutcome(%d)", v)
}
// Content is the base structured datatype containing multi-part content of a message.
//
// A `Content` includes a `role` field designating the producer of the `Content`
// and a `parts` field containing multi-part data that contains the content of
// the message turn.
type Content struct {
// Ordered `Parts` that constitute a single message. Parts may have different
// MIME types.
Parts []Part
// Optional. The producer of the content. Must be either 'user' or 'model'.
//
// Useful to set for multi-turn conversations, otherwise can be left blank
// or unset.
Role string
}
func (v *Content) toProto() *pb.Content {
if v == nil {
return nil
}
return &pb.Content{
Parts: pvTransformSlice(v.Parts, partToProto),
Role: v.Role,
}
}
func (Content) fromProto(p *pb.Content) *Content {
if p == nil {
return nil
}
return &Content{
Parts: pvTransformSlice(p.Parts, partFromProto),
Role: p.Role,
}
}
// ContentEmbedding is a list of floats representing an embedding.
type ContentEmbedding struct {
// The embedding values.
Values []float32
}
func (v *ContentEmbedding) toProto() *pb.ContentEmbedding {
if v == nil {
return nil
}
return &pb.ContentEmbedding{
Values: v.Values,
}
}
func (ContentEmbedding) fromProto(p *pb.ContentEmbedding) *ContentEmbedding {
if p == nil {
return nil
}
return &ContentEmbedding{
Values: p.Values,
}
}
// CountTokensResponse is a response from `CountTokens`.
//
// It returns the model's `token_count` for the `prompt`.
type CountTokensResponse struct {
// The number of tokens that the `model` tokenizes the `prompt` into.
//
// Always non-negative. When cached_content is set, this is still the total
// effective prompt size. I.e. this includes the number of tokens in the
// cached content.
TotalTokens int32
// Number of tokens in the cached part of the prompt, i.e. in the cached
// content.
CachedContentTokenCount int32
}
func (v *CountTokensResponse) toProto() *pb.CountTokensResponse {
if v == nil {
return nil
}
return &pb.CountTokensResponse{
TotalTokens: v.TotalTokens,
CachedContentTokenCount: v.CachedContentTokenCount,
}
}
func (CountTokensResponse) fromProto(p *pb.CountTokensResponse) *CountTokensResponse {
if p == nil {
return nil
}
return &CountTokensResponse{
TotalTokens: p.TotalTokens,
CachedContentTokenCount: p.CachedContentTokenCount,
}
}
// EmbedContentResponse is the response to an `EmbedContentRequest`.
type EmbedContentResponse struct {
// Output only. The embedding generated from the input content.
Embedding *ContentEmbedding
}
func (v *EmbedContentResponse) toProto() *pb.EmbedContentResponse {
if v == nil {
return nil
}
return &pb.EmbedContentResponse{
Embedding: v.Embedding.toProto(),
}
}
func (EmbedContentResponse) fromProto(p *pb.EmbedContentResponse) *EmbedContentResponse {
if p == nil {
return nil
}
return &EmbedContentResponse{
Embedding: (ContentEmbedding{}).fromProto(p.Embedding),
}
}
// ExecutableCode is code generated by the model that is meant to be executed, and the result
// returned to the model.
//
// Only generated when using the `CodeExecution` tool, in which the code will
// be automatically executed, and a corresponding `CodeExecutionResult` will
// also be generated.
type ExecutableCode struct {
// Required. Programming language of the `code`.
Language ExecutableCodeLanguage
// Required. The code to be executed.
Code string
}
func (v *ExecutableCode) toProto() *pb.ExecutableCode {
if v == nil {
return nil
}
return &pb.ExecutableCode{
Language: pb.ExecutableCode_Language(v.Language),
Code: v.Code,
}
}
func (ExecutableCode) fromProto(p *pb.ExecutableCode) *ExecutableCode {
if p == nil {
return nil
}
return &ExecutableCode{
Language: ExecutableCodeLanguage(p.Language),
Code: p.Code,
}
}
// ExecutableCodeLanguage is supported programming languages for the generated code.
type ExecutableCodeLanguage int32
const (
// ExecutableCodeLanguageUnspecified means unspecified language. This value should not be used.
ExecutableCodeLanguageUnspecified ExecutableCodeLanguage = 0
// ExecutableCodePython means python >= 3.10, with numpy and simpy available.
ExecutableCodePython ExecutableCodeLanguage = 1
)
var namesForExecutableCodeLanguage = map[ExecutableCodeLanguage]string{
ExecutableCodeLanguageUnspecified: "ExecutableCodeLanguageUnspecified",
ExecutableCodePython: "ExecutableCodePython",
}
func (v ExecutableCodeLanguage) String() string {
if n, ok := namesForExecutableCodeLanguage[v]; ok {
return n
}
return fmt.Sprintf("ExecutableCodeLanguage(%d)", v)
}
// File is a file uploaded to the API.
type File struct {
// Metadata for the File.
Metadata *FileMetadata
// Immutable. Identifier. The `File` resource name. The ID (name excluding the
// "files/" prefix) can contain up to 40 characters that are lowercase
// alphanumeric or dashes (-). The ID cannot start or end with a dash. If the
// name is empty on create, a unique name will be generated. Example:
// `files/123-456`
Name string
// Optional. The human-readable display name for the `File`. The display name
// must be no more than 512 characters in length, including spaces. Example:
// "Welcome Image"
DisplayName string
// Output only. MIME type of the file.
MIMEType string
// Output only. Size of the file in bytes.
SizeBytes int64
// Output only. The timestamp of when the `File` was created.
CreateTime time.Time
// Output only. The timestamp of when the `File` was last updated.
UpdateTime time.Time
// Output only. The timestamp of when the `File` will be deleted. Only set if
// the `File` is scheduled to expire.
ExpirationTime time.Time
// Output only. SHA-256 hash of the uploaded bytes.
Sha256Hash []byte
// Output only. The uri of the `File`.
URI string
// Output only. Processing state of the File.
State FileState
// Output only. Error status if File processing failed.
Error *apierror.APIError
}
func (v *File) toProto() *pb.File {
if v == nil {
return nil
}
p := &pb.File{
Name: v.Name,
DisplayName: v.DisplayName,
MimeType: v.MIMEType,
SizeBytes: v.SizeBytes,
CreateTime: pvTimeToProto(v.CreateTime),
UpdateTime: pvTimeToProto(v.UpdateTime),
ExpirationTime: pvTimeToProto(v.ExpirationTime),
Sha256Hash: v.Sha256Hash,
Uri: v.URI,
State: pb.File_State(v.State),
Error: pvAPIErrorToProto(v.Error),
}
populateFileTo(p, v)
return p
}
func (File) fromProto(p *pb.File) *File {
if p == nil {
return nil
}
v := &File{
Name: p.Name,
DisplayName: p.DisplayName,
MIMEType: p.MimeType,
SizeBytes: p.SizeBytes,
CreateTime: pvTimeFromProto(p.CreateTime),
UpdateTime: pvTimeFromProto(p.UpdateTime),
ExpirationTime: pvTimeFromProto(p.ExpirationTime),
Sha256Hash: p.Sha256Hash,
URI: p.Uri,
State: FileState(p.State),
Error: pvAPIErrorFromProto(p.Error),
}
populateFileFrom(v, p)
return v
}
// FileData is URI based data.
type FileData struct {
// The IANA standard MIME type of the source data.
// If present, this overrides the MIME type specified or inferred
// when the file was uploaded.
// The supported MIME types are documented on [this page].
//
// [this page]: https://ai.google.dev/gemini-api/docs/prompting_with_media?lang=go#supported_file_formats
MIMEType string
// The URI returned from UploadFile or GetFile.
URI string
}
func (v *FileData) toProto() *pb.FileData {
if v == nil {
return nil
}
return &pb.FileData{
MimeType: v.MIMEType,
FileUri: v.URI,
}
}
func (FileData) fromProto(p *pb.FileData) *FileData {
if p == nil {
return nil
}
return &FileData{
MIMEType: p.MimeType,
URI: p.FileUri,
}
}
// FileState represents states for the lifecycle of a File.
type FileState int32
const (
// FileStateUnspecified means the default value. This value is used if the state is omitted.
FileStateUnspecified FileState = 0
// FileStateProcessing means file is being processed and cannot be used for inference yet.
FileStateProcessing FileState = 1
// FileStateActive means file is processed and available for inference.
FileStateActive FileState = 2
// FileStateFailed means file failed processing.
FileStateFailed FileState = 10
)
var namesForFileState = map[FileState]string{
FileStateUnspecified: "FileStateUnspecified",
FileStateProcessing: "FileStateProcessing",
FileStateActive: "FileStateActive",
FileStateFailed: "FileStateFailed",
}
func (v FileState) String() string {
if n, ok := namesForFileState[v]; ok {
return n
}
return fmt.Sprintf("FileState(%d)", v)
}
// FinishReason is defines the reason why the model stopped generating tokens.
type FinishReason int32
const (
// FinishReasonUnspecified means default value. This value is unused.
FinishReasonUnspecified FinishReason = 0
// FinishReasonStop means natural stop point of the model or provided stop sequence.
FinishReasonStop FinishReason = 1
// FinishReasonMaxTokens means the maximum number of tokens as specified in the request was reached.
FinishReasonMaxTokens FinishReason = 2
// FinishReasonSafety means the candidate content was flagged for safety reasons.
FinishReasonSafety FinishReason = 3
// FinishReasonRecitation means the candidate content was flagged for recitation reasons.
FinishReasonRecitation FinishReason = 4
// FinishReasonOther means unknown reason.
FinishReasonOther FinishReason = 5
)
var namesForFinishReason = map[FinishReason]string{
FinishReasonUnspecified: "FinishReasonUnspecified",
FinishReasonStop: "FinishReasonStop",
FinishReasonMaxTokens: "FinishReasonMaxTokens",
FinishReasonSafety: "FinishReasonSafety",
FinishReasonRecitation: "FinishReasonRecitation",
FinishReasonOther: "FinishReasonOther",
}
func (v FinishReason) String() string {
if n, ok := namesForFinishReason[v]; ok {
return n
}
return fmt.Sprintf("FinishReason(%d)", v)
}
// FunctionCall is a predicted `FunctionCall` returned from the model that contains
// a string representing the `FunctionDeclaration.name` with the
// arguments and their values.
type FunctionCall struct {
// Required. The name of the function to call.
// Must be a-z, A-Z, 0-9, or contain underscores and dashes, with a maximum
// length of 63.
Name string
// Optional. The function parameters and values in JSON object format.
Args map[string]any
}
func (v *FunctionCall) toProto() *pb.FunctionCall {
if v == nil {
return nil
}
return &pb.FunctionCall{
Name: v.Name,
Args: pvMapToStructPB(v.Args),
}
}
func (FunctionCall) fromProto(p *pb.FunctionCall) *FunctionCall {
if p == nil {
return nil
}
return &FunctionCall{
Name: p.Name,
Args: pvMapFromStructPB(p.Args),
}
}
// FunctionCallingConfig holds configuration for function calling.
type FunctionCallingConfig struct {
// Optional. Specifies the mode in which function calling should execute. If
// unspecified, the default value will be set to AUTO.
Mode FunctionCallingMode
// Optional. A set of function names that, when provided, limits the functions
// the model will call.
//
// This should only be set when the Mode is ANY. Function names
// should match [FunctionDeclaration.name]. With mode set to ANY, model will
// predict a function call from the set of function names provided.
AllowedFunctionNames []string
}
func (v *FunctionCallingConfig) toProto() *pb.FunctionCallingConfig {
if v == nil {
return nil
}
return &pb.FunctionCallingConfig{
Mode: pb.FunctionCallingConfig_Mode(v.Mode),
AllowedFunctionNames: v.AllowedFunctionNames,
}
}
func (FunctionCallingConfig) fromProto(p *pb.FunctionCallingConfig) *FunctionCallingConfig {
if p == nil {
return nil
}
return &FunctionCallingConfig{
Mode: FunctionCallingMode(p.Mode),
AllowedFunctionNames: p.AllowedFunctionNames,
}
}
// FunctionCallingMode is defines the execution behavior for function calling by defining the
// execution mode.
type FunctionCallingMode int32
const (
// FunctionCallingUnspecified means unspecified function calling mode. This value should not be used.
FunctionCallingUnspecified FunctionCallingMode = 0
// FunctionCallingAuto means default model behavior, model decides to predict either a function call
// or a natural language response.
FunctionCallingAuto FunctionCallingMode = 1
// FunctionCallingAny means model is constrained to always predicting a function call only.
// If "allowed_function_names" are set, the predicted function call will be
// limited to any one of "allowed_function_names", else the predicted
// function call will be any one of the provided "function_declarations".
FunctionCallingAny FunctionCallingMode = 2
// FunctionCallingNone means model will not predict any function call. Model behavior is same as when
// not passing any function declarations.
FunctionCallingNone FunctionCallingMode = 3
)
var namesForFunctionCallingMode = map[FunctionCallingMode]string{
FunctionCallingUnspecified: "FunctionCallingUnspecified",
FunctionCallingAuto: "FunctionCallingAuto",
FunctionCallingAny: "FunctionCallingAny",
FunctionCallingNone: "FunctionCallingNone",
}
func (v FunctionCallingMode) String() string {
if n, ok := namesForFunctionCallingMode[v]; ok {
return n
}
return fmt.Sprintf("FunctionCallingMode(%d)", v)
}
// FunctionDeclaration is structured representation of a function declaration as defined by the
// [OpenAPI 3.03 specification](https://spec.openapis.org/oas/v3.0.3). Included
// in this declaration are the function name and parameters. This
// FunctionDeclaration is a representation of a block of code that can be used
// as a `Tool` by the model and executed by the client.
type FunctionDeclaration struct {
// Required. The name of the function.
// Must be a-z, A-Z, 0-9, or contain underscores and dashes, with a maximum
// length of 63.
Name string
// Required. A brief description of the function.
Description string
// Optional. Describes the parameters to this function. Reflects the Open
// API 3.03 Parameter Object string Key: the name of the parameter. Parameter
// names are case sensitive. Schema Value: the Schema defining the type used
// for the parameter.
Parameters *Schema
}
func (v *FunctionDeclaration) toProto() *pb.FunctionDeclaration {
if v == nil {
return nil
}
return &pb.FunctionDeclaration{
Name: v.Name,
Description: v.Description,
Parameters: v.Parameters.toProto(),
}
}
func (FunctionDeclaration) fromProto(p *pb.FunctionDeclaration) *FunctionDeclaration {
if p == nil {
return nil
}
return &FunctionDeclaration{
Name: p.Name,
Description: p.Description,
Parameters: (Schema{}).fromProto(p.Parameters),
}
}
// FunctionResponse is the result output from a `FunctionCall` that contains a string
// representing the `FunctionDeclaration.name` and a structured JSON
// object containing any output from the function is used as context to
// the model. This should contain the result of a`FunctionCall` made
// based on model prediction.
type FunctionResponse struct {
// Required. The name of the function to call.
// Must be a-z, A-Z, 0-9, or contain underscores and dashes, with a maximum
// length of 63.
Name string
// Required. The function response in JSON object format.
Response map[string]any
}
func (v *FunctionResponse) toProto() *pb.FunctionResponse {
if v == nil {
return nil
}
return &pb.FunctionResponse{
Name: v.Name,
Response: pvMapToStructPB(v.Response),
}
}
func (FunctionResponse) fromProto(p *pb.FunctionResponse) *FunctionResponse {
if p == nil {
return nil
}
return &FunctionResponse{
Name: p.Name,
Response: pvMapFromStructPB(p.Response),
}
}
// GenerateContentResponse is the response from a GenerateContent or GenerateContentStream call.
//
// Note on safety ratings and content filtering. They are reported for both
// prompt in `GenerateContentResponse.prompt_feedback` and for each candidate
// in `finish_reason` and in `safety_ratings`. The API contract is that:
// - either all requested candidates are returned or no candidates at all
// - no candidates are returned only if there was something wrong with the
// prompt (see `prompt_feedback`)
// - feedback on each candidate is reported on `finish_reason` and
// `safety_ratings`.
type GenerateContentResponse struct {
// Candidate responses from the model.
Candidates []*Candidate
// Returns the prompt's feedback related to the content filters.
PromptFeedback *PromptFeedback
// Output only. Metadata on the generation requests' token usage.
UsageMetadata *UsageMetadata
}
func (v *GenerateContentResponse) toProto() *pb.GenerateContentResponse {
if v == nil {
return nil
}
return &pb.GenerateContentResponse{
Candidates: pvTransformSlice(v.Candidates, (*Candidate).toProto),
PromptFeedback: v.PromptFeedback.toProto(),
UsageMetadata: v.UsageMetadata.toProto(),
}
}
func (GenerateContentResponse) fromProto(p *pb.GenerateContentResponse) *GenerateContentResponse {
if p == nil {
return nil
}
return &GenerateContentResponse{
Candidates: pvTransformSlice(p.Candidates, (Candidate{}).fromProto),
PromptFeedback: (PromptFeedback{}).fromProto(p.PromptFeedback),
UsageMetadata: (UsageMetadata{}).fromProto(p.UsageMetadata),
}
}
// GenerationConfig is configuration options for model generation and outputs. Not all parameters
// may be configurable for every model.
type GenerationConfig struct {
// Optional. Number of generated responses to return.
//
// Currently, this value can only be set to 1. If unset, this will default
// to 1.
CandidateCount *int32
// Optional. The set of character sequences (up to 5) that will stop output
// generation. If specified, the API will stop at the first appearance of a
// stop sequence. The stop sequence will not be included as part of the
// response.
StopSequences []string
// Optional. The maximum number of tokens to include in a candidate.
//
// Note: The default value varies by model, see the `Model.output_token_limit`
// attribute of the `Model` returned from the `getModel` function.
MaxOutputTokens *int32
// Optional. Controls the randomness of the output.
//
// Note: The default value varies by model, see the `Model.temperature`
// attribute of the `Model` returned from the `getModel` function.
//
// Values can range from [0.0, 2.0].
Temperature *float32
// Optional. The maximum cumulative probability of tokens to consider when
// sampling.
//
// The model uses combined Top-k and nucleus sampling.
//
// Tokens are sorted based on their assigned probabilities so that only the
// most likely tokens are considered. Top-k sampling directly limits the
// maximum number of tokens to consider, while Nucleus sampling limits number
// of tokens based on the cumulative probability.
//
// Note: The default value varies by model, see the `Model.top_p`
// attribute of the `Model` returned from the `getModel` function.
TopP *float32
// Optional. The maximum number of tokens to consider when sampling.
//
// Models use nucleus sampling or combined Top-k and nucleus sampling.
// Top-k sampling considers the set of `top_k` most probable tokens.
// Models running with nucleus sampling don't allow top_k setting.
//
// Note: The default value varies by model, see the `Model.top_k`
// attribute of the `Model` returned from the `getModel` function. Empty
// `top_k` field in `Model` indicates the model doesn't apply top-k sampling
// and doesn't allow setting `top_k` on requests.
TopK *int32
// Optional. Output response mimetype of the generated candidate text.
// Supported mimetype:
// `text/plain`: (default) Text output.
// `application/json`: JSON response in the candidates.
ResponseMIMEType string
// Optional. Output response schema of the generated candidate text when
// response mime type can have schema. Schema can be objects, primitives or
// arrays and is a subset of [OpenAPI
// schema](https://spec.openapis.org/oas/v3.0.3#schema).
//
// If set, a compatible response_mime_type must also be set.
// Compatible mimetypes:
// `application/json`: Schema for JSON response.
ResponseSchema *Schema
}
func (v *GenerationConfig) toProto() *pb.GenerationConfig {
if v == nil {
return nil
}
return &pb.GenerationConfig{
CandidateCount: v.CandidateCount,
StopSequences: v.StopSequences,
MaxOutputTokens: v.MaxOutputTokens,
Temperature: v.Temperature,
TopP: v.TopP,
TopK: v.TopK,
ResponseMimeType: v.ResponseMIMEType,
ResponseSchema: v.ResponseSchema.toProto(),
}
}
func (GenerationConfig) fromProto(p *pb.GenerationConfig) *GenerationConfig {
if p == nil {
return nil
}
return &GenerationConfig{
CandidateCount: p.CandidateCount,
StopSequences: p.StopSequences,
MaxOutputTokens: p.MaxOutputTokens,
Temperature: p.Temperature,
TopP: p.TopP,
TopK: p.TopK,
ResponseMIMEType: p.ResponseMimeType,
ResponseSchema: (Schema{}).fromProto(p.ResponseSchema),
}
}
// HarmBlockThreshold specifies block at and beyond a specified harm probability.
type HarmBlockThreshold int32
const (
// HarmBlockUnspecified means threshold is unspecified.
HarmBlockUnspecified HarmBlockThreshold = 0
// HarmBlockLowAndAbove means content with NEGLIGIBLE will be allowed.
HarmBlockLowAndAbove HarmBlockThreshold = 1
// HarmBlockMediumAndAbove means content with NEGLIGIBLE and LOW will be allowed.
HarmBlockMediumAndAbove HarmBlockThreshold = 2
// HarmBlockOnlyHigh means content with NEGLIGIBLE, LOW, and MEDIUM will be allowed.
HarmBlockOnlyHigh HarmBlockThreshold = 3
// HarmBlockNone means all content will be allowed.
HarmBlockNone HarmBlockThreshold = 4
)
var namesForHarmBlockThreshold = map[HarmBlockThreshold]string{
HarmBlockUnspecified: "HarmBlockUnspecified",
HarmBlockLowAndAbove: "HarmBlockLowAndAbove",
HarmBlockMediumAndAbove: "HarmBlockMediumAndAbove",
HarmBlockOnlyHigh: "HarmBlockOnlyHigh",
HarmBlockNone: "HarmBlockNone",
}
func (v HarmBlockThreshold) String() string {
if n, ok := namesForHarmBlockThreshold[v]; ok {
return n
}
return fmt.Sprintf("HarmBlockThreshold(%d)", v)
}
// HarmCategory specifies the category of a rating.
//
// These categories cover various kinds of harms that developers
// may wish to adjust.
type HarmCategory int32
const (
// HarmCategoryUnspecified means category is unspecified.
HarmCategoryUnspecified HarmCategory = 0
// HarmCategoryDerogatory means negative or harmful comments targeting identity and/or protected attribute.
HarmCategoryDerogatory HarmCategory = 1
// HarmCategoryToxicity means content that is rude, disrespectful, or profane.
HarmCategoryToxicity HarmCategory = 2
// HarmCategoryViolence means describes scenarios depicting violence against an individual or group, or
// general descriptions of gore.
HarmCategoryViolence HarmCategory = 3
// HarmCategorySexual means contains references to sexual acts or other lewd content.
HarmCategorySexual HarmCategory = 4
// HarmCategoryMedical means promotes unchecked medical advice.
HarmCategoryMedical HarmCategory = 5
// HarmCategoryDangerous means dangerous content that promotes, facilitates, or encourages harmful acts.
HarmCategoryDangerous HarmCategory = 6
// HarmCategoryHarassment means harasment content.
HarmCategoryHarassment HarmCategory = 7
// HarmCategoryHateSpeech means hate speech and content.
HarmCategoryHateSpeech HarmCategory = 8
// HarmCategorySexuallyExplicit means sexually explicit content.
HarmCategorySexuallyExplicit HarmCategory = 9
// HarmCategoryDangerousContent means dangerous content.
HarmCategoryDangerousContent HarmCategory = 10
)
var namesForHarmCategory = map[HarmCategory]string{
HarmCategoryUnspecified: "HarmCategoryUnspecified",
HarmCategoryDerogatory: "HarmCategoryDerogatory",
HarmCategoryToxicity: "HarmCategoryToxicity",
HarmCategoryViolence: "HarmCategoryViolence",
HarmCategorySexual: "HarmCategorySexual",
HarmCategoryMedical: "HarmCategoryMedical",
HarmCategoryDangerous: "HarmCategoryDangerous",
HarmCategoryHarassment: "HarmCategoryHarassment",
HarmCategoryHateSpeech: "HarmCategoryHateSpeech",
HarmCategorySexuallyExplicit: "HarmCategorySexuallyExplicit",
HarmCategoryDangerousContent: "HarmCategoryDangerousContent",
}
func (v HarmCategory) String() string {
if n, ok := namesForHarmCategory[v]; ok {
return n
}
return fmt.Sprintf("HarmCategory(%d)", v)
}
// HarmProbability specifies 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.
type HarmProbability int32
const (
// HarmProbabilityUnspecified means probability is unspecified.
HarmProbabilityUnspecified HarmProbability = 0
// HarmProbabilityNegligible means content has a negligible chance of being unsafe.
HarmProbabilityNegligible HarmProbability = 1
// HarmProbabilityLow means content has a low chance of being unsafe.
HarmProbabilityLow HarmProbability = 2
// HarmProbabilityMedium means content has a medium chance of being unsafe.
HarmProbabilityMedium HarmProbability = 3
// HarmProbabilityHigh means content has a high chance of being unsafe.
HarmProbabilityHigh HarmProbability = 4
)
var namesForHarmProbability = map[HarmProbability]string{
HarmProbabilityUnspecified: "HarmProbabilityUnspecified",
HarmProbabilityNegligible: "HarmProbabilityNegligible",
HarmProbabilityLow: "HarmProbabilityLow",
HarmProbabilityMedium: "HarmProbabilityMedium",
HarmProbabilityHigh: "HarmProbabilityHigh",
}
func (v HarmProbability) String() string {
if n, ok := namesForHarmProbability[v]; ok {
return n
}
return fmt.Sprintf("HarmProbability(%d)", v)
}
// ModelInfo is information about a language model.
type ModelInfo struct {
// Required. The resource name of the `Model`.
//
// Format: `models/{model}` with a `{model}` naming convention of:
//
// * "{base_model_id}-{version}"
//
// Examples:
//
// * `models/chat-bison-001`
Name string
// Required. The name of the base model, pass this to the generation request.
//
// Examples:
//
// * `chat-bison`
BaseModelID string
// Required. The version number of the model.
//
// This represents the major version
Version string
// The human-readable name of the model. E.g. "Chat Bison".
//
// The name can be up to 128 characters long and can consist of any UTF-8
// characters.
DisplayName string
// A short description of the model.
Description string
// Maximum number of input tokens allowed for this model.
InputTokenLimit int32
// Maximum number of output tokens available for this model.
OutputTokenLimit int32
// The model's supported generation methods.
//
// The method names are defined as Pascal case
// strings, such as `generateMessage` which correspond to API methods.
SupportedGenerationMethods []string
// Controls the randomness of the output.
//
// Values can range over `[0.0,max_temperature]`, inclusive. A higher value
// will produce responses that are more varied, while a value closer to `0.0`
// will typically result in less surprising responses from the model.
// This value specifies default to be used by the backend while making the
// call to the model.
Temperature float32
// The maximum temperature this model can use.
MaxTemperature *float32
// For Nucleus sampling.
//
// Nucleus sampling considers the smallest set of tokens whose probability
// sum is at least `top_p`.
// This value specifies default to be used by the backend while making the
// call to the model.
TopP float32
// For Top-k sampling.
//
// Top-k sampling considers the set of `top_k` most probable tokens.
// This value specifies default to be used by the backend while making the
// call to the model.
// If empty, indicates the model doesn't use top-k sampling, and `top_k` isn't
// allowed as a generation parameter.
TopK int32
}
func (v *ModelInfo) toProto() *pb.Model {
if v == nil {
return nil
}
return &pb.Model{
Name: v.Name,
BaseModelId: v.BaseModelID,
Version: v.Version,
DisplayName: v.DisplayName,
Description: v.Description,
InputTokenLimit: v.InputTokenLimit,
OutputTokenLimit: v.OutputTokenLimit,
SupportedGenerationMethods: v.SupportedGenerationMethods,
Temperature: pvAddrOrNil(v.Temperature),
MaxTemperature: v.MaxTemperature,
TopP: pvAddrOrNil(v.TopP),
TopK: pvAddrOrNil(v.TopK),
}
}
func (ModelInfo) fromProto(p *pb.Model) *ModelInfo {
if p == nil {
return nil
}
return &ModelInfo{
Name: p.Name,
BaseModelID: p.BaseModelId,
Version: p.Version,
DisplayName: p.DisplayName,
Description: p.Description,
InputTokenLimit: p.InputTokenLimit,
OutputTokenLimit: p.OutputTokenLimit,
SupportedGenerationMethods: p.SupportedGenerationMethods,
Temperature: pvDerefOrZero(p.Temperature),
MaxTemperature: p.MaxTemperature,
TopP: pvDerefOrZero(p.TopP),
TopK: pvDerefOrZero(p.TopK),
}
}
// PromptFeedback contains a set of the feedback metadata the prompt specified in
// `GenerateContentRequest.content`.
type PromptFeedback struct {
// Optional. If set, the prompt was blocked and no candidates are returned.
// Rephrase your prompt.
BlockReason BlockReason
// Ratings for safety of the prompt.
// There is at most one rating per category.
SafetyRatings []*SafetyRating
}
func (v *PromptFeedback) toProto() *pb.GenerateContentResponse_PromptFeedback {
if v == nil {
return nil
}
return &pb.GenerateContentResponse_PromptFeedback{
BlockReason: pb.GenerateContentResponse_PromptFeedback_BlockReason(v.BlockReason),
SafetyRatings: pvTransformSlice(v.SafetyRatings, (*SafetyRating).toProto),
}
}
func (PromptFeedback) fromProto(p *pb.GenerateContentResponse_PromptFeedback) *PromptFeedback {
if p == nil {
return nil
}
return &PromptFeedback{
BlockReason: BlockReason(p.BlockReason),
SafetyRatings: pvTransformSlice(p.SafetyRatings, (SafetyRating{}).fromProto),
}
}
// SafetyRating is the 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.
type SafetyRating struct {
// Required. The category for this rating.
Category HarmCategory
// Required. The probability of harm for this content.
Probability HarmProbability
// Was this content blocked because of this rating?
Blocked bool
}
func (v *SafetyRating) toProto() *pb.SafetyRating {
if v == nil {
return nil
}
return &pb.SafetyRating{
Category: pb.HarmCategory(v.Category),
Probability: pb.SafetyRating_HarmProbability(v.Probability),
Blocked: v.Blocked,
}
}
func (SafetyRating) fromProto(p *pb.SafetyRating) *SafetyRating {
if p == nil {
return nil
}
return &SafetyRating{
Category: HarmCategory(p.Category),
Probability: HarmProbability(p.Probability),
Blocked: p.Blocked,
}
}
// SafetySetting is safety setting, affecting the safety-blocking behavior.
//
// Passing a safety setting for a category changes the allowed probability that
// content is blocked.
type SafetySetting struct {
// Required. The category for this setting.
Category HarmCategory
// Required. Controls the probability threshold at which harm is blocked.
Threshold HarmBlockThreshold
}
func (v *SafetySetting) toProto() *pb.SafetySetting {
if v == nil {
return nil
}
return &pb.SafetySetting{
Category: pb.HarmCategory(v.Category),
Threshold: pb.SafetySetting_HarmBlockThreshold(v.Threshold),
}
}
func (SafetySetting) fromProto(p *pb.SafetySetting) *SafetySetting {
if p == nil {
return nil
}
return &SafetySetting{
Category: HarmCategory(p.Category),
Threshold: HarmBlockThreshold(p.Threshold),
}
}
// Schema is the `Schema` object allows the definition of input and output data types.
// These types can be objects, but also primitives and arrays.
// Represents a select subset of an [OpenAPI 3.0 schema
// object](https://spec.openapis.org/oas/v3.0.3#schema).
type Schema struct {
// Required. Data type.
Type Type
// Optional. The format of the data. This is used only for primitive
// datatypes. Supported formats:
//
// for NUMBER type: float, double
// for INTEGER type: int32, int64
Format string
// Optional. A brief description of the parameter. This could contain examples
// of use. Parameter description may be formatted as Markdown.
Description string
// Optional. Indicates if the value may be null.
Nullable bool
// Optional. Possible values of the element of Type.STRING with enum format.
// For example we can define an Enum Direction as :
// {type:STRING, format:enum, enum:["EAST", NORTH", "SOUTH", "WEST"]}
Enum []string
// Optional. Schema of the elements of Type.ARRAY.
Items *Schema
// Optional. Properties of Type.OBJECT.
Properties map[string]*Schema
// Optional. Required properties of Type.OBJECT.
Required []string
}
func (v *Schema) toProto() *pb.Schema {
if v == nil {
return nil
}
return &pb.Schema{
Type: pb.Type(v.Type),
Format: v.Format,
Description: v.Description,
Nullable: v.Nullable,
Enum: v.Enum,
Items: v.Items.toProto(),
Properties: pvTransformMapValues(v.Properties, (*Schema).toProto),
Required: v.Required,
}
}
func (Schema) fromProto(p *pb.Schema) *Schema {
if p == nil {
return nil
}
return &Schema{
Type: Type(p.Type),
Format: p.Format,
Description: p.Description,
Nullable: p.Nullable,
Enum: p.Enum,
Items: (Schema{}).fromProto(p.Items),
Properties: pvTransformMapValues(p.Properties, (Schema{}).fromProto),
Required: p.Required,
}
}
// TaskType is type of task for which the embedding will be used.
type TaskType int32
const (
// TaskTypeUnspecified means unset value, which will default to one of the other enum values.
TaskTypeUnspecified TaskType = 0
// TaskTypeRetrievalQuery means specifies the given text is a query in a search/retrieval setting.
TaskTypeRetrievalQuery TaskType = 1
// TaskTypeRetrievalDocument means specifies the given text is a document from the corpus being searched.
TaskTypeRetrievalDocument TaskType = 2
// TaskTypeSemanticSimilarity means specifies the given text will be used for STS.
TaskTypeSemanticSimilarity TaskType = 3
// TaskTypeClassification means specifies that the given text will be classified.
TaskTypeClassification TaskType = 4
// TaskTypeClustering means specifies that the embeddings will be used for clustering.
TaskTypeClustering TaskType = 5
// TaskTypeQuestionAnswering means specifies that the given text will be used for question answering.
TaskTypeQuestionAnswering TaskType = 6
// TaskTypeFactVerification means specifies that the given text will be used for fact verification.
TaskTypeFactVerification TaskType = 7
)
var namesForTaskType = map[TaskType]string{
TaskTypeUnspecified: "TaskTypeUnspecified",
TaskTypeRetrievalQuery: "TaskTypeRetrievalQuery",
TaskTypeRetrievalDocument: "TaskTypeRetrievalDocument",
TaskTypeSemanticSimilarity: "TaskTypeSemanticSimilarity",
TaskTypeClassification: "TaskTypeClassification",
TaskTypeClustering: "TaskTypeClustering",
TaskTypeQuestionAnswering: "TaskTypeQuestionAnswering",
TaskTypeFactVerification: "TaskTypeFactVerification",
}
func (v TaskType) String() string {
if n, ok := namesForTaskType[v]; ok {
return n
}
return fmt.Sprintf("TaskType(%d)", v)
}
// Tool details that the model may use to generate response.
//
// A `Tool` is a piece of code that enables the system to interact with
// external systems to perform an action, or set of actions, outside of
// knowledge and scope of the model.
type Tool struct {
// Optional. A list of FunctionDeclarations available to the model that
// can be used for function calling. The model or system does not execute
// the function. Instead the defined function may be returned as a [FunctionCall]
// part with arguments to the client side for execution. The next conversation
// turn may contain a [FunctionResponse] with the role "function" generation
// context for the next model turn.
FunctionDeclarations []*FunctionDeclaration
// Optional. Enables the model to execute code as part of generation.
CodeExecution *CodeExecution
}
func (v *Tool) toProto() *pb.Tool {
if v == nil {
return nil
}
return &pb.Tool{
FunctionDeclarations: pvTransformSlice(v.FunctionDeclarations, (*FunctionDeclaration).toProto),
CodeExecution: v.CodeExecution.toProto(),
}
}
func (Tool) fromProto(p *pb.Tool) *Tool {
if p == nil {
return nil
}
return &Tool{
FunctionDeclarations: pvTransformSlice(p.FunctionDeclarations, (FunctionDeclaration{}).fromProto),
CodeExecution: (CodeExecution{}).fromProto(p.CodeExecution),
}
}
// ToolConfig is the Tool configuration containing parameters for specifying `Tool` use
// in the request.
type ToolConfig struct {
// Optional. Function calling config.
FunctionCallingConfig *FunctionCallingConfig
}
func (v *ToolConfig) toProto() *pb.ToolConfig {
if v == nil {
return nil
}
return &pb.ToolConfig{
FunctionCallingConfig: v.FunctionCallingConfig.toProto(),
}
}
func (ToolConfig) fromProto(p *pb.ToolConfig) *ToolConfig {
if p == nil {
return nil
}
return &ToolConfig{
FunctionCallingConfig: (FunctionCallingConfig{}).fromProto(p.FunctionCallingConfig),
}
}
// Type contains the list of OpenAPI data types as defined by
// https://spec.openapis.org/oas/v3.0.3#data-types
type Type int32
const (
// TypeUnspecified means not specified, should not be used.
TypeUnspecified Type = 0
// TypeString means string type.
TypeString Type = 1
// TypeNumber means number type.
TypeNumber Type = 2
// TypeInteger means integer type.
TypeInteger Type = 3
// TypeBoolean means boolean type.
TypeBoolean Type = 4
// TypeArray means array type.
TypeArray Type = 5
// TypeObject means object type.
TypeObject Type = 6
)
var namesForType = map[Type]string{
TypeUnspecified: "TypeUnspecified",
TypeString: "TypeString",
TypeNumber: "TypeNumber",
TypeInteger: "TypeInteger",
TypeBoolean: "TypeBoolean",
TypeArray: "TypeArray",
TypeObject: "TypeObject",
}
func (v Type) String() string {
if n, ok := namesForType[v]; ok {
return n
}
return fmt.Sprintf("Type(%d)", v)
}
// UsageMetadata is metadata on the generation request's token usage.
type UsageMetadata struct {
// Number of tokens in the prompt. When cached_content is set, this is still
// the total effective prompt size. I.e. this includes the number of tokens
// in the cached content.
PromptTokenCount int32
// Number of tokens in the cached part of the prompt, i.e. in the cached
// content.
CachedContentTokenCount int32
// Total number of tokens across the generated candidates.
CandidatesTokenCount int32
// Total token count for the generation request (prompt + candidates).
TotalTokenCount int32
}
func (v *UsageMetadata) toProto() *pb.GenerateContentResponse_UsageMetadata {
if v == nil {
return nil
}
return &pb.GenerateContentResponse_UsageMetadata{
PromptTokenCount: v.PromptTokenCount,
CachedContentTokenCount: v.CachedContentTokenCount,
CandidatesTokenCount: v.CandidatesTokenCount,
TotalTokenCount: v.TotalTokenCount,
}
}
func (UsageMetadata) fromProto(p *pb.GenerateContentResponse_UsageMetadata) *UsageMetadata {
if p == nil {
return nil
}
return &UsageMetadata{
PromptTokenCount: p.PromptTokenCount,
CachedContentTokenCount: p.CachedContentTokenCount,
CandidatesTokenCount: p.CandidatesTokenCount,
TotalTokenCount: p.TotalTokenCount,
}
}
// VideoMetadata is metadata for a video `File`.
type VideoMetadata struct {
// Duration of the video.
Duration time.Duration
}
func (v *VideoMetadata) toProto() *pb.VideoMetadata {
if v == nil {
return nil
}
return &pb.VideoMetadata{
VideoDuration: durationpb.New(v.Duration),
}
}
func (VideoMetadata) fromProto(p *pb.VideoMetadata) *VideoMetadata {
if p == nil {
return nil
}
return &VideoMetadata{
Duration: pvDurationFromProto(p.VideoDuration),
}
}
func pvTransformSlice[From, To any](from []From, f func(From) To) []To {
if from == nil {
return nil
}
to := make([]To, len(from))
for i, e := range from {
to[i] = f(e)
}
return to
}
func pvTransformMapValues[K comparable, VFrom, VTo any](from map[K]VFrom, f func(VFrom) VTo) map[K]VTo {
if from == nil {
return nil
}
to := map[K]VTo{}
for k, v := range from {
to[k] = f(v)
}
return to
}
func pvAddrOrNil[T comparable](x T) *T {
var z T
if x == z {
return nil
}
return &x
}
func pvDerefOrZero[T any](x *T) T {
if x == nil {
var z T
return z
}
return *x
}
func pvMapToStructPB(m map[string]any) *structpb.Struct {
if m == nil {
return nil
}
s, err := structpb.NewStruct(m)
if err != nil {
panic(pvPanic(fmt.Errorf("pvMapToStructPB: %w", err)))
}
return s
}
func pvMapFromStructPB(p *structpb.Struct) map[string]any {
if p == nil {
return nil
}
return p.AsMap()
}
func pvTimeToProto(t time.Time) *timestamppb.Timestamp {
if t.IsZero() {
return nil
}
return timestamppb.New(t)
}
func pvTimeFromProto(ts *timestamppb.Timestamp) time.Time {
if ts == nil {
return time.Time{}
}
return ts.AsTime()
}
func pvAPIErrorToProto(ae *apierror.APIError) *spb.Status {
if ae == nil {
return nil
}
return ae.GRPCStatus().Proto()
}
func pvAPIErrorFromProto(s *spb.Status) *apierror.APIError {
err := gstatus.ErrorProto(s)
aerr, ok := apierror.ParseError(err, true)
if !ok {
// Should be impossible.
return nil
}
return aerr
}
func pvDurationFromProto(d *durationpb.Duration) time.Duration {
if d == nil {
return 0
}
return d.AsDuration()
}
// pvPanic wraps panics from support functions.
// User-provided functions in the same package can also use it.
// It allows callers to distinguish conversion function panics from other panics.
type pvPanic error
// pvCatchPanic recovers from panics of type pvPanic and
// returns an error instead.
func pvCatchPanic[T any](f func() T) (_ T, err error) {
defer func() {
if r := recover(); r != nil {
if _, ok := r.(pvPanic); ok {
err = r.(error)
} else {
panic(r)
}
}
}()
return f(), nil
}