types/function-calling.ts (78 lines of code) (raw):
/**
* @license
* 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.
*/
import { FunctionCallingMode } from "./enums";
/**
* Structured representation of a function declaration as defined by the
* [OpenAPI 3.0 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.
* @public
*/
export declare interface FunctionDeclaration {
/**
* The name of the function to call. Must start with a letter or an
* underscore. Must be a-z, A-Z, 0-9, or contain underscores and dashes, with
* a max length of 64.
*/
name: string;
/**
* Optional. Description and purpose of the function. Model uses it to decide
* how and whether to call the function.
*/
description?: string;
/**
* Optional. Describes the parameters to this function in JSON Schema Object
* format. 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. For function with no
* parameters, this can be left unset.
*
* @example with 1 required and 1 optional parameter: type: OBJECT properties:
* ```
* param1:
*
* type: STRING
* param2:
*
* type: INTEGER
* required:
*
* - param1
* ```
*/
parameters?: FunctionDeclarationSchema;
}
/**
* A FunctionDeclarationsTool 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.
* @public
*/
export declare interface FunctionDeclarationsTool {
/**
* Optional. One or more function declarations
* to be passed to the model along with the current user query. Model may
* decide to call a subset of these functions by populating
* [FunctionCall][content.part.functionCall] in the response. User should
* provide a [FunctionResponse][content.part.functionResponse] for each
* function call in the next turn. Based on the function responses, Model will
* generate the final response back to the user. Maximum 64 function
* declarations can be provided.
*/
functionDeclarations?: FunctionDeclaration[];
}
/**
* Contains the list of OpenAPI data types
* as defined by https://swagger.io/docs/specification/data-models/data-types/
* @public
*/
export enum SchemaType {
/** String type. */
STRING = "string",
/** Number type. */
NUMBER = "number",
/** Integer type. */
INTEGER = "integer",
/** Boolean type. */
BOOLEAN = "boolean",
/** Array type. */
ARRAY = "array",
/** Object type. */
OBJECT = "object",
}
/**
* Schema is used to define the format of input/output data.
* Represents a select subset of an OpenAPI 3.0 schema object.
* More fields may be added in the future as needed.
* @public
*/
export type Schema =
| StringSchema
| NumberSchema
| IntegerSchema
| BooleanSchema
| ArraySchema
| ObjectSchema;
/**
* Fields common to all Schema types.
*
* @internal
*/
export interface BaseSchema {
/** Optional. Description of the value. */
description?: string;
/** If true, the value can be null. */
nullable?: boolean;
// The field 'example' is accepted, but in testing, it seems like it accepts
// any value of any type, even when that doesn't match the type that the
// schema describes, and it doesn't appear to affect the model's output.
}
/**
* Describes a JSON-encodable floating point number.
*
* @public
*/
export interface NumberSchema extends BaseSchema {
type: typeof SchemaType.NUMBER;
/** Optional. The format of the number. */
format?: "float" | "double";
// Note that the API accepts `minimum` and `maximum` fields here, as numbers,
// but when tested they had no effect.
}
/**
* Describes a JSON-encodable integer.
*
* @public
*/
export interface IntegerSchema extends BaseSchema {
type: typeof SchemaType.INTEGER;
/** Optional. The format of the number. */
format?: "int32" | "int64"; // server rejects int32 or int64
// Note that the API accepts minimum and maximum fields here, as numbers,
// but when tested they had no effect.
}
/**
* Describes a string.
*
* @public
*/
export type StringSchema =
| SimpleStringSchema
| EnumStringSchema;
/**
* Describes a simple string schema, with or without format
*
* @public
*/
export interface SimpleStringSchema extends BaseSchema {
type: typeof SchemaType.STRING;
// Note: These undefined values are needed to help the type system, they won't,
// be passed to the API as they are undefined
format?: "date-time" | undefined;
enum?: never;
}
/**
* Describes a string enum
*
* @public
*/
export interface EnumStringSchema extends BaseSchema {
type: typeof SchemaType.STRING;
format: "enum";
/** Possible values for this enum */
enum: string[];
}
/**
* Describes a boolean, either 'true' or 'false'.
*
* @public
*/
export interface BooleanSchema extends BaseSchema {
type: typeof SchemaType.BOOLEAN;
}
/**
* Describes an array, an ordered list of values.
*
* @public
*/
export interface ArraySchema extends BaseSchema {
type: typeof SchemaType.ARRAY;
/** A schema describing the entries in the array. */
items: Schema;
/** The minimum number of items in the array. */
minItems?: number;
/** The maximum number of items in the array. */
maxItems?: number;
}
/**
* Describes a JSON object, a mapping of specific keys to values.
*
* @public
*/
export interface ObjectSchema extends BaseSchema {
type: typeof SchemaType.OBJECT;
/** Describes the properties of the JSON object. Must not be empty. */
properties: { [k: string]: Schema };
/**
* A list of keys declared in the properties object.
* Required properties will always be present in the generated object.
*/
required?: string[];
// Note that the API accepts the `minProperties`, and `maxProperties` fields,
// but they may only be advisory.
}
/**
* Schema for parameters passed to {@link FunctionDeclaration.parameters}.
* @public
*/
export interface FunctionDeclarationSchema {
/** The type of the parameter. */
type: SchemaType;
/** The format of the parameter. */
properties: { [k: string]: FunctionDeclarationSchemaProperty };
/** Optional. Description of the parameter. */
description?: string;
/** Optional. Array of required parameters. */
required?: string[];
}
/**
* Schema for top-level function declaration
* @public
*/
export type FunctionDeclarationSchemaProperty = Schema;
/**
* Schema passed to `GenerationConfig.responseSchema`
* @public
*/
export type ResponseSchema = Schema;
/**
* Tool config. This config is shared for all tools provided in the request.
* @public
*/
export interface ToolConfig {
functionCallingConfig: FunctionCallingConfig;
}
/**
* @public
*/
export interface FunctionCallingConfig {
mode?: FunctionCallingMode;
allowedFunctionNames?: string[];
}