From a3c46f510a158218d21af44fcdc0fdff9e04d0f2 Mon Sep 17 00:00:00 2001 From: Matthew Tang Date: Thu, 14 Aug 2025 15:40:30 -0700 Subject: [PATCH 1/9] feat: Support Imagen image segmentation on Vertex PiperOrigin-RevId: 795227899 --- google/genai/models.py | 340 ++++++++++++++++++ .../tests/data/segmentation_scribble.jpg | Bin 0 -> 7880 bytes .../genai/tests/data/skateboard_stop_sign.jpg | Bin 0 -> 351072 bytes .../genai/tests/models/test_segment_image.py | 147 ++++++++ google/genai/types.py | 240 +++++++++++++ 5 files changed, 727 insertions(+) create mode 100644 google/genai/tests/data/segmentation_scribble.jpg create mode 100644 google/genai/tests/data/skateboard_stop_sign.jpg create mode 100644 google/genai/tests/models/test_segment_image.py diff --git a/google/genai/models.py b/google/genai/models.py index ee5888257..e414e9d9b 100644 --- a/google/genai/models.py +++ b/google/genai/models.py @@ -3025,6 +3025,120 @@ def _RecontextImageParameters_to_vertex( return to_object +def _ScribbleImage_to_vertex( + from_object: Union[dict[str, Any], object], + parent_object: Optional[dict[str, Any]] = None, +) -> dict[str, Any]: + to_object: dict[str, Any] = {} + if getv(from_object, ['image']) is not None: + setv( + to_object, + ['image'], + _Image_to_vertex(getv(from_object, ['image']), to_object), + ) + + return to_object + + +def _SegmentImageSource_to_vertex( + from_object: Union[dict[str, Any], object], + parent_object: Optional[dict[str, Any]] = None, +) -> dict[str, Any]: + to_object: dict[str, Any] = {} + if getv(from_object, ['prompt']) is not None: + setv( + parent_object, ['instances[0]', 'prompt'], getv(from_object, ['prompt']) + ) + + if getv(from_object, ['image']) is not None: + setv( + parent_object, + ['instances[0]', 'image'], + _Image_to_vertex(getv(from_object, ['image']), to_object), + ) + + if getv(from_object, ['scribble_image']) is not None: + setv( + parent_object, + ['instances[0]', 'scribble'], + _ScribbleImage_to_vertex( + getv(from_object, ['scribble_image']), to_object + ), + ) + + return to_object + + +def _SegmentImageConfig_to_vertex( + from_object: Union[dict[str, Any], object], + parent_object: Optional[dict[str, Any]] = None, +) -> dict[str, Any]: + to_object: dict[str, Any] = {} + + if getv(from_object, ['mode']) is not None: + setv(parent_object, ['parameters', 'mode'], getv(from_object, ['mode'])) + + if getv(from_object, ['max_predictions']) is not None: + setv( + parent_object, + ['parameters', 'maxPredictions'], + getv(from_object, ['max_predictions']), + ) + + if getv(from_object, ['confidence_threshold']) is not None: + setv( + parent_object, + ['parameters', 'confidenceThreshold'], + getv(from_object, ['confidence_threshold']), + ) + + if getv(from_object, ['mask_dilation']) is not None: + setv( + parent_object, + ['parameters', 'maskDilation'], + getv(from_object, ['mask_dilation']), + ) + + if getv(from_object, ['binary_color_threshold']) is not None: + setv( + parent_object, + ['parameters', 'binaryColorThreshold'], + getv(from_object, ['binary_color_threshold']), + ) + + return to_object + + +def _SegmentImageParameters_to_vertex( + api_client: BaseApiClient, + from_object: Union[dict[str, Any], object], + parent_object: Optional[dict[str, Any]] = None, +) -> dict[str, Any]: + to_object: dict[str, Any] = {} + if getv(from_object, ['model']) is not None: + setv( + to_object, + ['_url', 'model'], + t.t_model(api_client, getv(from_object, ['model'])), + ) + + if getv(from_object, ['source']) is not None: + setv( + to_object, + ['config'], + _SegmentImageSource_to_vertex(getv(from_object, ['source']), to_object), + ) + + if getv(from_object, ['config']) is not None: + setv( + to_object, + ['config'], + _SegmentImageConfig_to_vertex(getv(from_object, ['config']), to_object), + ) + + return to_object + + def _GetModelParameters_to_vertex( api_client: BaseApiClient, from_object: Union[dict[str, Any], object], @@ -4618,6 +4732,63 @@ def _RecontextImageResponse_from_vertex( return to_object +def _EntityLabel_from_vertex( + from_object: Union[dict[str, Any], object], + parent_object: Optional[dict[str, Any]] = None, +) -> dict[str, Any]: + to_object: dict[str, Any] = {} + if getv(from_object, ['label']) is not None: + setv(to_object, ['label'], getv(from_object, ['label'])) + + if getv(from_object, ['score']) is not None: + setv(to_object, ['score'], getv(from_object, ['score'])) + + return to_object + + +def _GeneratedImageMask_from_vertex( + from_object: Union[dict[str, Any], object], + parent_object: Optional[dict[str, Any]] = None, +) -> dict[str, Any]: + to_object: dict[str, Any] = {} + if getv(from_object, ['_self']) is not None: + setv( + to_object, + ['mask'], + _Image_from_vertex(getv(from_object, ['_self']), to_object), + ) + + if getv(from_object, ['labels']) is not None: + setv( + to_object, + ['labels'], + [ + _EntityLabel_from_vertex(item, to_object) + for item in getv(from_object, ['labels']) + ], + ) + + return to_object + + +def _SegmentImageResponse_from_vertex( + from_object: Union[dict[str, Any], object], + parent_object: Optional[dict[str, Any]] = None, +) -> dict[str, Any]: + to_object: dict[str, Any] = {} + if getv(from_object, ['predictions']) is not None: + setv( + to_object, + ['generated_masks'], + [ + _GeneratedImageMask_from_vertex(item, to_object) + for item in getv(from_object, ['predictions']) + ], + ) + + return to_object + + def _Endpoint_from_vertex( from_object: Union[dict[str, Any], object], parent_object: Optional[dict[str, Any]] = None, @@ -5511,6 +5682,89 @@ def recontext_image( self._api_client._verify_response(return_value) return return_value + def segment_image( + self, + *, + model: str, + source: types.SegmentImageSourceOrDict, + config: Optional[types.SegmentImageConfigOrDict] = None, + ) -> types.SegmentImageResponse: + """Segments an image, creating a mask of a specified area. + + Args: + model (str): The model to use. + source (SegmentImageSource): An object containing the source inputs + (prompt, image, scribble_image) for image segmentation. The prompt is + required for prompt mode and semantic mode, disallowed for other modes. + scribble_image is required for the interactive mode, disallowed for + other modes. + config (SegmentImageConfig): Configuration for segmentation. + + Usage: + + ``` + response = client.models.segment_image( + model="image-segmentation-001", + source=types.SegmentImageSource( + image=types.Image.from_file(IMAGE_FILE_PATH), + ), + ) + + mask_image = response.generated_masks[0].mask + ``` + """ + + parameter_model = types._SegmentImageParameters( + model=model, + source=source, + config=config, + ) + + request_url_dict: Optional[dict[str, str]] + if not self._api_client.vertexai: + raise ValueError('This method is only supported in the Vertex AI client.') + else: + request_dict = _SegmentImageParameters_to_vertex( + self._api_client, parameter_model + ) + request_url_dict = request_dict.get('_url') + if request_url_dict: + path = '{model}:predict'.format_map(request_url_dict) + else: + path = '{model}:predict' + + query_params = request_dict.get('_query') + if query_params: + path = f'{path}?{urlencode(query_params)}' + # TODO: remove the hack that pops config. + request_dict.pop('config', None) + + http_options: Optional[types.HttpOptions] = None + if ( + parameter_model.config is not None + and parameter_model.config.http_options is not None + ): + http_options = parameter_model.config.http_options + + request_dict = _common.convert_to_dict(request_dict) + request_dict = _common.encode_unserializable_types(request_dict) + + response = self._api_client.request( + 'post', path, request_dict, http_options + ) + + response_dict = '' if not response.body else json.loads(response.body) + + if self._api_client.vertexai: + response_dict = _SegmentImageResponse_from_vertex(response_dict) + + return_value = types.SegmentImageResponse._from_response( + response=response_dict, kwargs=parameter_model.model_dump() + ) + + self._api_client._verify_response(return_value) + return return_value + def get( self, *, model: str, config: Optional[types.GetModelConfigOrDict] = None ) -> types.Model: @@ -7240,6 +7494,92 @@ async def recontext_image( self._api_client._verify_response(return_value) return return_value + async def segment_image( + self, + *, + model: str, + source: types.SegmentImageSourceOrDict, + config: Optional[types.SegmentImageConfigOrDict] = None, + ) -> types.SegmentImageResponse: + """Segments an image, creating a mask of a specified area. + + Args: + model (str): The model to use. + source (SegmentImageSource): An object containing the source inputs + (prompt, image, scribble_image) for image segmentation. The prompt is + required for prompt mode and semantic mode, disallowed for other modes. + scribble_image is required for the interactive mode, disallowed for + other modes. + config (SegmentImageConfig): Configuration for segmentation. + + Usage: + + ``` + response = client.models.segment_image( + model="image-segmentation-001", + source=types.SegmentImageSource( + image=types.Image.from_file(IMAGE_FILE_PATH), + ), + config=types.SegmentImageConfig( + mode=types.SegmentMode.foreground, + ), + ) + + mask_image = response.generated_masks[0].mask + ``` + """ + + parameter_model = types._SegmentImageParameters( + model=model, + source=source, + config=config, + ) + + request_url_dict: Optional[dict[str, str]] + if not self._api_client.vertexai: + raise ValueError('This method is only supported in the Vertex AI client.') + else: + request_dict = _SegmentImageParameters_to_vertex( + self._api_client, parameter_model + ) + request_url_dict = request_dict.get('_url') + if request_url_dict: + path = '{model}:predict'.format_map(request_url_dict) + else: + path = '{model}:predict' + + query_params = request_dict.get('_query') + if query_params: + path = f'{path}?{urlencode(query_params)}' + # TODO: remove the hack that pops config. + request_dict.pop('config', None) + + http_options: Optional[types.HttpOptions] = None + if ( + parameter_model.config is not None + and parameter_model.config.http_options is not None + ): + http_options = parameter_model.config.http_options + + request_dict = _common.convert_to_dict(request_dict) + request_dict = _common.encode_unserializable_types(request_dict) + + response = await self._api_client.async_request( + 'post', path, request_dict, http_options + ) + + response_dict = '' if not response.body else json.loads(response.body) + + if self._api_client.vertexai: + response_dict = _SegmentImageResponse_from_vertex(response_dict) + + return_value = types.SegmentImageResponse._from_response( + response=response_dict, kwargs=parameter_model.model_dump() + ) + + self._api_client._verify_response(return_value) + return return_value + async def get( self, *, model: str, config: Optional[types.GetModelConfigOrDict] = None ) -> types.Model: diff --git a/google/genai/tests/data/segmentation_scribble.jpg b/google/genai/tests/data/segmentation_scribble.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b99d53632fbeff562a8a013b3c1e3aa34f84d28e GIT binary patch literal 7880 zcmeIyX;e~a7zgl+#s$XlP_;U}9usWNKn!3bVF=nVZ9GEv?|z4t9=9kakFW z)H07BQO<78_Q;h!Xg91E9*=iiu|8m(x4#Dt@AWwZVq$6vGl$t&SlD#Z|5UpG zGw94Ia3~xg07YxQRKYhW01C{JfZj3;YuS8P{Lc@^E2Hp>T>LcrNvO^CG`t#G0?IDml9cn0+H7}$m2t^GnlKcu6^3zq5RO>?dt@C{Bs{QDsh__ zQNdnJaSnVVqV*N`Xjn)AgS=yxCcQ)XagyK8Q#Yfv5r|`{MZMoo_|;(EG9>$1r^Ue` z;q4K3)VYQTH;fw8eB*jnFlYI=R?4nITt4FPl$7fAepC!|StB-jP3@3&(mQm$6VayZi z-S}19>+Q>?TmLp$Dbjb}ow`xPIG}|d~r--w!VzjXKG_&e_Fms8Y zr~7v?whDay^x`w$92Mk+leEINmnC?tre6&g_Z%BtNXbW+ZBR$Ih4k@?lSr*e?d+3N z1dZ{->zLqy(#rKss@+{oSR+OyrL%{(mtG>qHe{gdT)aI+kIj;=$g0aWmkQ$gV>8w4 zO#I2%u${Ljj&GAuv3t5L-8X;wLzG4tn80kqrt&B8&+j_nvC`9b^HB-!Q|LqzcI3kF znXndIMSpAGThqQKckP`-&pxxzY_zx3?)Sj_L$gAht0u@$=WtIBqjOih-%)Za+VuFJ zJx%-aL@-!EZ&^din~4dkOO+Hs6qY_%(9N49$VZsfzSKKzcbr|b^l94*W2?>;)6j%d zOA`5U{)Njd`7xQ945a;FA1X4LqTJCKP9!@pL*bIKbsa{f;rkEY8X+@J23LjgMF;8& z#f0#TncweOthnOFMtMO$Jt(Mwy&&SH_rVW~5Ty!SYq8L}ZODpF5=)|MLdzJ0En}P) zb9M3Ao^c)`?j!rg{D6C}-ysTQL!C%cB9`2;MF;THkc1Tr zof2?ii(HrsL*s^N>JG!x?gO(RGoK3l1ljGSf z(b%lZm1|`qAzVj?g^%`O`<+n6ER>V1{N1HpI1#By*o%+~$n`u?@`=1GA}Ln^M=UM3yXz$28FjgKO7P-)sr7x#oyQ$tTk#+vTW;rw6}C;$q8 i0-yjW01AKtpa3WU3V;Hj04M+ofC8Yv|6YKg>--B8_U~i> literal 0 HcmV?d00001 diff --git a/google/genai/tests/data/skateboard_stop_sign.jpg b/google/genai/tests/data/skateboard_stop_sign.jpg new file mode 100644 index 0000000000000000000000000000000000000000..541294f3be557cc75e6fca2d7e7d8d809b81fe3f GIT binary patch literal 351072 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

NbIQCr7 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�&a#u;!Rx} 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

Submodules +
+async segment_image(*, model, source, config=None)
+

Segments an image, creating a mask of a specified area.

+
+
Return type:
+

SegmentImageResponse

+
+
Parameters:
+
    +
  • model (str) – The model to use.

  • +
  • source (SegmentImageSource) – An object containing the source inputs +(prompt, image, scribble_image) for image segmentation. The prompt is +required for prompt mode and semantic mode, disallowed for other modes. +scribble_image is required for the interactive mode, disallowed for +other modes.

  • +
  • config (SegmentImageConfig) – Configuration for segmentation.

  • +
+
+
+

Usage:

+
+

``` +response = client.models.segment_image(

+
+

model=”image-segmentation-001”, +source=types.SegmentImageSource(

+
+

image=types.Image.from_file(IMAGE_FILE_PATH),

+
+

), +config=types.SegmentImageConfig(

+
+

mode=types.SegmentMode.foreground,

+
+

),

+
+

)

+

mask_image = response.generated_masks[0].mask +```

+
+
+
async update(*, model, config=None)
@@ -2691,7 +2734,7 @@

Submodules``` +

``` operation = client.models.generate_videos(

model=”veo-2.0-generate-001”, @@ -2704,7 +2747,7 @@

Submodules```

+```

@@ -2780,7 +2823,7 @@

Submodules``` +

``` product_recontext_response = client.models.recontext_image(

model=”imagen-product-recontext-preview-06-30”, @@ -2815,7 +2858,45 @@

Submodules```

+```

+

+ + +
+
+segment_image(*, model, source, config=None)
+

Segments an image, creating a mask of a specified area.

+
+
Return type:
+

SegmentImageResponse

+
+
Parameters:
+
    +
  • model (str) – The model to use.

  • +
  • source (SegmentImageSource) – An object containing the source inputs +(prompt, image, scribble_image) for image segmentation. The prompt is +required for prompt mode and semantic mode, disallowed for other modes. +scribble_image is required for the interactive mode, disallowed for +other modes.

  • +
  • config (SegmentImageConfig) – Configuration for segmentation.

  • +
+
+
+

Usage:

+
+

``` +response = client.models.segment_image(

+
+

model=”image-segmentation-001”, +source=types.SegmentImageSource(

+
+

image=types.Image.from_file(IMAGE_FILE_PATH),

+
+

),

+
+

)

+

mask_image = response.generated_masks[0].mask +```

@@ -4999,6 +5080,143 @@

Submodules +
+pydantic model genai.types.AutoraterConfig
+

Bases: BaseModel

+

Autorater config used for evaluation.

+

Create a new model by parsing and validating input data from keyword arguments.

+

Raises [ValidationError][pydantic_core.ValidationError] if the input data cannot be +validated to form a valid model.

+

self is explicitly positional-only to allow self as a field name.

+

+Show JSON schema
{
+   "title": "AutoraterConfig",
+   "description": "Autorater config used for evaluation.",
+   "type": "object",
+   "properties": {
+      "samplingCount": {
+         "anyOf": [
+            {
+               "type": "integer"
+            },
+            {
+               "type": "null"
+            }
+         ],
+         "default": null,
+         "description": "Number of samples for each instance in the dataset.\n  If not specified, the default is 4. Minimum value is 1, maximum value\n  is 32.",
+         "title": "Samplingcount"
+      },
+      "flipEnabled": {
+         "anyOf": [
+            {
+               "type": "boolean"
+            },
+            {
+               "type": "null"
+            }
+         ],
+         "default": null,
+         "description": "Optional. Default is true. Whether to flip the candidate and baseline\n  responses. This is only applicable to the pairwise metric. If enabled, also\n  provide PairwiseMetricSpec.candidate_response_field_name and\n  PairwiseMetricSpec.baseline_response_field_name. When rendering\n  PairwiseMetricSpec.metric_prompt_template, the candidate and baseline\n  fields will be flipped for half of the samples to reduce bias.",
+         "title": "Flipenabled"
+      },
+      "autoraterModel": {
+         "anyOf": [
+            {
+               "type": "string"
+            },
+            {
+               "type": "null"
+            }
+         ],
+         "default": null,
+         "description": "The fully qualified name of the publisher model or tuned autorater\n  endpoint to use.\n\n  Publisher model format:\n  `projects/{project}/locations/{location}/publishers/*/models/*`\n\n  Tuned model endpoint format:\n  `projects/{project}/locations/{location}/endpoints/{endpoint}`",
+         "title": "Autoratermodel"
+      }
+   },
+   "additionalProperties": false
+}
+
+
+

+
Fields:
+
+
+
+
+
+field autorater_model: Optional[str] = None (alias 'autoraterModel')
+

The fully qualified name of the publisher model or tuned autorater +endpoint to use.

+

Publisher model format: +projects/{project}/locations/{location}/publishers/*/models/*

+

Tuned model endpoint format: +projects/{project}/locations/{location}/endpoints/{endpoint}

+
+ +
+
+field flip_enabled: Optional[bool] = None (alias 'flipEnabled')
+

Optional. Default is true. Whether to flip the candidate and baseline +responses. This is only applicable to the pairwise metric. If enabled, also +provide PairwiseMetricSpec.candidate_response_field_name and +PairwiseMetricSpec.baseline_response_field_name. When rendering +PairwiseMetricSpec.metric_prompt_template, the candidate and baseline +fields will be flipped for half of the samples to reduce bias.

+
+ +
+
+field sampling_count: Optional[int] = None (alias 'samplingCount')
+

Number of samples for each instance in the dataset. +If not specified, the default is 4. Minimum value is 1, maximum value +is 32.

+
+ +
+ +
+
+class genai.types.AutoraterConfigDict
+

Bases: TypedDict

+

Autorater config used for evaluation.

+
+
+autorater_model: Optional[str]
+

The fully qualified name of the publisher model or tuned autorater +endpoint to use.

+

Publisher model format: +projects/{project}/locations/{location}/publishers/*/models/*

+

Tuned model endpoint format: +projects/{project}/locations/{location}/endpoints/{endpoint}

+
+ +
+
+flip_enabled: Optional[bool]
+

Optional. Default is true. Whether to flip the candidate and baseline +responses. This is only applicable to the pairwise metric. If enabled, also +provide PairwiseMetricSpec.candidate_response_field_name and +PairwiseMetricSpec.baseline_response_field_name. When rendering +PairwiseMetricSpec.metric_prompt_template, the candidate and baseline +fields will be flipped for half of the samples to reduce bias.

+
+ +
+
+sampling_count: Optional[int]
+

Number of samples for each instance in the dataset. +If not specified, the default is 4. Minimum value is 1, maximum value +is 32.

+
+ +
+
pydantic model genai.types.BatchJob
@@ -6098,10 +6316,36 @@

Submodules "EnterpriseWebSearch": { "additionalProperties": false, "description": "Tool to search public web data, powered by Vertex AI Search and Sec4 compliance.", - "properties": {}, + "properties": { + "excludeDomains": { + "anyOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional. List of domains to be excluded from the search results. The default limit is 2000 domains.", + "title": "Excludedomains" + } + }, "title": "EnterpriseWebSearch", "type": "object" }, + "Environment": { + "description": "The environment being operated.", + "enum": [ + "ENVIRONMENT_UNSPECIFIED", + "ENVIRONMENT_BROWSER" + ], + "title": "Environment", + "type": "string" + }, "ExecutableCode": { "additionalProperties": false, "description": "Code generated by the model that is meant to be executed, and the result returned to the model.\n\nGenerated when using the [CodeExecution] tool, in which the code will be\nautomatically executed, and a corresponding [CodeExecutionResult] will also be\ngenerated.", @@ -7769,6 +8013,22 @@

Submodules ], "default": null, "description": "Optional. Filter search results to a specific time range.\n If customers set a start time, they must set an end time (and vice versa).\n " + }, + "excludeDomains": { + "anyOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional. List of domains to be excluded from the search results.\n The default limit is 2000 domains.", + "title": "Excludedomains" } }, "title": "GoogleSearch", @@ -8117,6 +8377,19 @@

Submodules "additionalProperties": false, "description": "Chunk from context retrieved by the retrieval tools.", "properties": { + "documentName": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Output only. The full document name for the referenced Vertex AI Search document.", + "title": "Documentname" + }, "ragChunk": { "anyOf": [ { @@ -10487,6 +10760,26 @@

Submodules "title": "ToolCodeExecution", "type": "object" }, + "ToolComputerUse": { + "additionalProperties": false, + "description": "Tool to support computer use.", + "properties": { + "environment": { + "anyOf": [ + { + "$ref": "#/$defs/Environment" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Required. The environment being operated." + } + }, + "title": "ToolComputerUse", + "type": "object" + }, "ToolConfig": { "additionalProperties": false, "description": "Tool config.\n\nThis config is shared for all tools provided in the request.", @@ -11017,6 +11310,18 @@

Submodules "default": null, "description": "Optional. Tool to support URL context retrieval." }, + "computerUse": { + "anyOf": [ + { + "$ref": "#/$defs/ToolComputerUse" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional. Tool to support the model interacting directly with the\n computer. If enabled, it automatically populates computer-use specific\n Function Declarations." + }, "codeExecution": { "anyOf": [ { @@ -12544,6 +12849,19 @@

Submodules "additionalProperties": false, "description": "Chunk from context retrieved by the retrieval tools.", "properties": { + "documentName": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Output only. The full document name for the referenced Vertex AI Search document.", + "title": "Documentname" + }, "ragChunk": { "anyOf": [ { @@ -14462,10 +14780,36 @@

Submodules "EnterpriseWebSearch": { "additionalProperties": false, "description": "Tool to search public web data, powered by Vertex AI Search and Sec4 compliance.", - "properties": {}, + "properties": { + "excludeDomains": { + "anyOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional. List of domains to be excluded from the search results. The default limit is 2000 domains.", + "title": "Excludedomains" + } + }, "title": "EnterpriseWebSearch", "type": "object" }, + "Environment": { + "description": "The environment being operated.", + "enum": [ + "ENVIRONMENT_UNSPECIFIED", + "ENVIRONMENT_BROWSER" + ], + "title": "Environment", + "type": "string" + }, "ExecutableCode": { "additionalProperties": false, "description": "Code generated by the model that is meant to be executed, and the result returned to the model.\n\nGenerated when using the [CodeExecution] tool, in which the code will be\nautomatically executed, and a corresponding [CodeExecutionResult] will also be\ngenerated.", @@ -15766,6 +16110,22 @@

Submodules ], "default": null, "description": "Optional. Filter search results to a specific time range.\n If customers set a start time, they must set an end time (and vice versa).\n " + }, + "excludeDomains": { + "anyOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional. List of domains to be excluded from the search results.\n The default limit is 2000 domains.", + "title": "Excludedomains" } }, "title": "GoogleSearch", @@ -17301,6 +17661,26 @@

Submodules "title": "ToolCodeExecution", "type": "object" }, + "ToolComputerUse": { + "additionalProperties": false, + "description": "Tool to support computer use.", + "properties": { + "environment": { + "anyOf": [ + { + "$ref": "#/$defs/Environment" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Required. The environment being operated." + } + }, + "title": "ToolComputerUse", + "type": "object" + }, "ToolConfig": { "additionalProperties": false, "description": "Tool config.\n\nThis config is shared for all tools provided in the request.", @@ -17752,6 +18132,18 @@

Submodules "default": null, "description": "Optional. Tool to support URL context retrieval." }, + "computerUse": { + "anyOf": [ + { + "$ref": "#/$defs/ToolComputerUse" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional. Tool to support the model interacting directly with the\n computer. If enabled, it automatically populates computer-use specific\n Function Declarations." + }, "codeExecution": { "anyOf": [ { @@ -17925,6 +18317,67 @@

Submodules +
+pydantic model genai.types.BleuSpec
+

Bases: BaseModel

+

Spec for bleu metric.

+

Create a new model by parsing and validating input data from keyword arguments.

+

Raises [ValidationError][pydantic_core.ValidationError] if the input data cannot be +validated to form a valid model.

+

self is explicitly positional-only to allow self as a field name.

+

+Show JSON schema
{
+   "title": "BleuSpec",
+   "description": "Spec for bleu metric.",
+   "type": "object",
+   "properties": {
+      "useEffectiveOrder": {
+         "anyOf": [
+            {
+               "type": "boolean"
+            },
+            {
+               "type": "null"
+            }
+         ],
+         "default": null,
+         "description": "Optional. Whether to use_effective_order to compute bleu score.",
+         "title": "Useeffectiveorder"
+      }
+   },
+   "additionalProperties": false
+}
+
+
+

+
Fields:
+
+
+
+
+
+field use_effective_order: Optional[bool] = None (alias 'useEffectiveOrder')
+

Optional. Whether to use_effective_order to compute bleu score.

+
+ +

+ +
+
+class genai.types.BleuSpecDict
+

Bases: TypedDict

+

Spec for bleu metric.

+
+
+use_effective_order: Optional[bool]
+

Optional. Whether to use_effective_order to compute bleu score.

+
+ +
+
pydantic model genai.types.Blob
@@ -19743,6 +20196,19 @@

Submodules "additionalProperties": false, "description": "Chunk from context retrieved by the retrieval tools.", "properties": { + "documentName": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Output only. The full document name for the referenced Vertex AI Search document.", + "title": "Documentname" + }, "ragChunk": { "anyOf": [ { @@ -23882,10 +24348,36 @@

Submodules "EnterpriseWebSearch": { "additionalProperties": false, "description": "Tool to search public web data, powered by Vertex AI Search and Sec4 compliance.", - "properties": {}, + "properties": { + "excludeDomains": { + "anyOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional. List of domains to be excluded from the search results. The default limit is 2000 domains.", + "title": "Excludedomains" + } + }, "title": "EnterpriseWebSearch", "type": "object" }, + "Environment": { + "description": "The environment being operated.", + "enum": [ + "ENVIRONMENT_UNSPECIFIED", + "ENVIRONMENT_BROWSER" + ], + "title": "Environment", + "type": "string" + }, "ExecutableCode": { "additionalProperties": false, "description": "Code generated by the model that is meant to be executed, and the result returned to the model.\n\nGenerated when using the [CodeExecution] tool, in which the code will be\nautomatically executed, and a corresponding [CodeExecutionResult] will also be\ngenerated.", @@ -25036,6 +25528,22 @@

Submodules ], "default": null, "description": "Optional. Filter search results to a specific time range.\n If customers set a start time, they must set an end time (and vice versa).\n " + }, + "excludeDomains": { + "anyOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional. List of domains to be excluded from the search results.\n The default limit is 2000 domains.", + "title": "Excludedomains" } }, "title": "GoogleSearch", @@ -26308,6 +26816,18 @@

Submodules "default": null, "description": "Optional. Tool to support URL context retrieval." }, + "computerUse": { + "anyOf": [ + { + "$ref": "#/$defs/ToolComputerUse" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional. Tool to support the model interacting directly with the\n computer. If enabled, it automatically populates computer-use specific\n Function Declarations." + }, "codeExecution": { "anyOf": [ { @@ -26331,6 +26851,26 @@

Submodules "title": "ToolCodeExecution", "type": "object" }, + "ToolComputerUse": { + "additionalProperties": false, + "description": "Tool to support computer use.", + "properties": { + "environment": { + "anyOf": [ + { + "$ref": "#/$defs/Environment" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Required. The environment being operated." + } + }, + "title": "ToolComputerUse", + "type": "object" + }, "Type": { "description": "Optional. The type of the data.", "enum": [ @@ -27576,10 +28116,36 @@

Submodules "EnterpriseWebSearch": { "additionalProperties": false, "description": "Tool to search public web data, powered by Vertex AI Search and Sec4 compliance.", - "properties": {}, + "properties": { + "excludeDomains": { + "anyOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional. List of domains to be excluded from the search results. The default limit is 2000 domains.", + "title": "Excludedomains" + } + }, "title": "EnterpriseWebSearch", "type": "object" }, + "Environment": { + "description": "The environment being operated.", + "enum": [ + "ENVIRONMENT_UNSPECIFIED", + "ENVIRONMENT_BROWSER" + ], + "title": "Environment", + "type": "string" + }, "ExecutableCode": { "additionalProperties": false, "description": "Code generated by the model that is meant to be executed, and the result returned to the model.\n\nGenerated when using the [CodeExecution] tool, in which the code will be\nautomatically executed, and a corresponding [CodeExecutionResult] will also be\ngenerated.", @@ -28730,6 +29296,22 @@

Submodules ], "default": null, "description": "Optional. Filter search results to a specific time range.\n If customers set a start time, they must set an end time (and vice versa).\n " + }, + "excludeDomains": { + "anyOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional. List of domains to be excluded from the search results.\n The default limit is 2000 domains.", + "title": "Excludedomains" } }, "title": "GoogleSearch", @@ -30431,6 +31013,26 @@

Submodules "title": "ToolCodeExecution", "type": "object" }, + "ToolComputerUse": { + "additionalProperties": false, + "description": "Tool to support computer use.", + "properties": { + "environment": { + "anyOf": [ + { + "$ref": "#/$defs/Environment" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Required. The environment being operated." + } + }, + "title": "ToolComputerUse", + "type": "object" + }, "TurnCoverage": { "description": "Options about which input is included in the user's turn.", "enum": [ @@ -30860,6 +31462,18 @@

Submodules "default": null, "description": "Optional. Tool to support URL context retrieval." }, + "computerUse": { + "anyOf": [ + { + "$ref": "#/$defs/ToolComputerUse" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional. Tool to support the model interacting directly with the\n computer. If enabled, it automatically populates computer-use specific\n Function Declarations." + }, "codeExecution": { "anyOf": [ { @@ -31746,10 +32360,36 @@

Submodules "EnterpriseWebSearch": { "additionalProperties": false, "description": "Tool to search public web data, powered by Vertex AI Search and Sec4 compliance.", - "properties": {}, + "properties": { + "excludeDomains": { + "anyOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional. List of domains to be excluded from the search results. The default limit is 2000 domains.", + "title": "Excludedomains" + } + }, "title": "EnterpriseWebSearch", "type": "object" }, + "Environment": { + "description": "The environment being operated.", + "enum": [ + "ENVIRONMENT_UNSPECIFIED", + "ENVIRONMENT_BROWSER" + ], + "title": "Environment", + "type": "string" + }, "ExecutableCode": { "additionalProperties": false, "description": "Code generated by the model that is meant to be executed, and the result returned to the model.\n\nGenerated when using the [CodeExecution] tool, in which the code will be\nautomatically executed, and a corresponding [CodeExecutionResult] will also be\ngenerated.", @@ -32900,6 +33540,22 @@

Submodules ], "default": null, "description": "Optional. Filter search results to a specific time range.\n If customers set a start time, they must set an end time (and vice versa).\n " + }, + "excludeDomains": { + "anyOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional. List of domains to be excluded from the search results.\n The default limit is 2000 domains.", + "title": "Excludedomains" } }, "title": "GoogleSearch", @@ -34601,6 +35257,26 @@

Submodules "title": "ToolCodeExecution", "type": "object" }, + "ToolComputerUse": { + "additionalProperties": false, + "description": "Tool to support computer use.", + "properties": { + "environment": { + "anyOf": [ + { + "$ref": "#/$defs/Environment" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Required. The environment being operated." + } + }, + "title": "ToolComputerUse", + "type": "object" + }, "TurnCoverage": { "description": "Options about which input is included in the user's turn.", "enum": [ @@ -35030,6 +35706,18 @@

Submodules "default": null, "description": "Optional. Tool to support URL context retrieval." }, + "computerUse": { + "anyOf": [ + { + "$ref": "#/$defs/ToolComputerUse" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional. Tool to support the model interacting directly with the\n computer. If enabled, it automatically populates computer-use specific\n Function Declarations." + }, "codeExecution": { "anyOf": [ { @@ -36549,6 +37237,19 @@

Submodules "additionalProperties": false, "description": "Chunk from context retrieved by the retrieval tools.", "properties": { + "documentName": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Output only. The full document name for the referenced Vertex AI Search document.", + "title": "Documentname" + }, "ragChunk": { "anyOf": [ { @@ -38645,10 +39346,36 @@

Submodules "EnterpriseWebSearch": { "additionalProperties": false, "description": "Tool to search public web data, powered by Vertex AI Search and Sec4 compliance.", - "properties": {}, + "properties": { + "excludeDomains": { + "anyOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional. List of domains to be excluded from the search results. The default limit is 2000 domains.", + "title": "Excludedomains" + } + }, "title": "EnterpriseWebSearch", "type": "object" }, + "Environment": { + "description": "The environment being operated.", + "enum": [ + "ENVIRONMENT_UNSPECIFIED", + "ENVIRONMENT_BROWSER" + ], + "title": "Environment", + "type": "string" + }, "ExecutableCode": { "additionalProperties": false, "description": "Code generated by the model that is meant to be executed, and the result returned to the model.\n\nGenerated when using the [CodeExecution] tool, in which the code will be\nautomatically executed, and a corresponding [CodeExecutionResult] will also be\ngenerated.", @@ -39429,6 +40156,22 @@

Submodules ], "default": null, "description": "Optional. Filter search results to a specific time range.\n If customers set a start time, they must set an end time (and vice versa).\n " + }, + "excludeDomains": { + "anyOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional. List of domains to be excluded from the search results.\n The default limit is 2000 domains.", + "title": "Excludedomains" } }, "title": "GoogleSearch", @@ -40603,6 +41346,18 @@

Submodules "default": null, "description": "Optional. Tool to support URL context retrieval." }, + "computerUse": { + "anyOf": [ + { + "$ref": "#/$defs/ToolComputerUse" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional. Tool to support the model interacting directly with the\n computer. If enabled, it automatically populates computer-use specific\n Function Declarations." + }, "codeExecution": { "anyOf": [ { @@ -40626,6 +41381,26 @@

Submodules "title": "ToolCodeExecution", "type": "object" }, + "ToolComputerUse": { + "additionalProperties": false, + "description": "Tool to support computer use.", + "properties": { + "environment": { + "anyOf": [ + { + "$ref": "#/$defs/Environment" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Required. The environment being operated." + } + }, + "title": "ToolComputerUse", + "type": "object" + }, "ToolConfig": { "additionalProperties": false, "description": "Tool config.\n\nThis config is shared for all tools provided in the request.", @@ -41534,7 +42309,6 @@

Submodules Show JSON schema
{
    "title": "CreateTuningJobConfig",
-   "description": "Supervised fine-tuning job creation request - optional fields.",
    "type": "object",
    "properties": {
       "httpOptions": {
@@ -41626,6 +42400,19 @@ 

Submodules "description": "If set to true, disable intermediate checkpoints for SFT and only the last checkpoint will be exported. Otherwise, enable intermediate checkpoints for SFT.", "title": "Exportlastcheckpointonly" }, + "preTunedModelCheckpointId": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "The optional checkpoint id of the pre-tuned model to use for tuning, if applicable.", + "title": "Pretunedmodelcheckpointid" + }, "adapterSize": { "anyOf": [ { @@ -41663,6 +42450,10 @@

Submodules "default": null, "description": "The learning rate hyperparameter for tuning. If not set, a default of 0.001 or 0.0002 will be calculated based on the number of training examples.", "title": "Learningrate" + }, + "evaluationConfig": { + "default": null, + "title": "Evaluationconfig" } }, "$defs": { @@ -41928,10 +42719,12 @@

Submodulesbatch_size (int | None)

  • description (str | None)

  • epoch_count (int | None)

  • +
  • evaluation_config (genai.types.EvaluationConfig | None)

  • export_last_checkpoint_only (bool | None)

  • http_options (genai.types.HttpOptions | None)

  • learning_rate (float | None)

  • learning_rate_multiplier (float | None)

  • +
  • pre_tuned_model_checkpoint_id (str | None)

  • tuned_model_display_name (str | None)

  • validation_dataset (genai.types.TuningValidationDataset | None)

  • @@ -41961,6 +42754,12 @@

    Submodules +
    +field evaluation_config: Optional[EvaluationConfig] = None (alias 'evaluationConfig')
    +

    Evaluation config for the tuning job.

    +

    +
    field export_last_checkpoint_only: Optional[bool] = None (alias 'exportLastCheckpointOnly')
    @@ -41985,6 +42784,12 @@

    Submodules +
    +field pre_tuned_model_checkpoint_id: Optional[str] = None (alias 'preTunedModelCheckpointId')
    +

    The optional checkpoint id of the pre-tuned model to use for tuning, if applicable.

    +

    +
    field tuned_model_display_name: Optional[str] = None (alias 'tunedModelDisplayName')
    @@ -42028,6 +42833,12 @@

    Submodules +
    +evaluation_config: Optional[EvaluationConfigDict]
    +

    Evaluation config for the tuning job.

    +

    +
    export_last_checkpoint_only: Optional[bool]
    @@ -42052,6 +42863,12 @@

    Submodules +
    +pre_tuned_model_checkpoint_id: Optional[str]
    +

    The optional checkpoint id of the pre-tuned model to use for tuning, if applicable.

    +

    +
    tuned_model_display_name: Optional[str]
    @@ -42078,7 +42895,6 @@

    Submodules Show JSON schema
    {
        "title": "CreateTuningJobParameters",
    -   "description": "Supervised fine-tuning job creation parameters - optional fields.",
        "type": "object",
        "properties": {
           "baseModel": {
    @@ -42107,371 +42923,11 @@ 

    Submodules "description": "Cloud Storage path to file containing training dataset for tuning. The dataset must be formatted as a JSONL file." }, "config": { - "anyOf": [ - { - "$ref": "#/$defs/CreateTuningJobConfig" - }, - { - "type": "null" - } - ], "default": null, - "description": "Configuration for the tuning job." + "title": "Config" } }, "$defs": { - "AdapterSize": { - "description": "Optional. Adapter size for tuning.", - "enum": [ - "ADAPTER_SIZE_UNSPECIFIED", - "ADAPTER_SIZE_ONE", - "ADAPTER_SIZE_TWO", - "ADAPTER_SIZE_FOUR", - "ADAPTER_SIZE_EIGHT", - "ADAPTER_SIZE_SIXTEEN", - "ADAPTER_SIZE_THIRTY_TWO" - ], - "title": "AdapterSize", - "type": "string" - }, - "CreateTuningJobConfig": { - "additionalProperties": false, - "description": "Supervised fine-tuning job creation request - optional fields.", - "properties": { - "httpOptions": { - "anyOf": [ - { - "$ref": "#/$defs/HttpOptions" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Used to override HTTP request options." - }, - "validationDataset": { - "anyOf": [ - { - "$ref": "#/$defs/TuningValidationDataset" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Cloud Storage path to file containing training dataset for tuning. The dataset must be formatted as a JSONL file." - }, - "tunedModelDisplayName": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "The display name of the tuned Model. The name can be up to 128 characters long and can consist of any UTF-8 characters.", - "title": "Tunedmodeldisplayname" - }, - "description": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "The description of the TuningJob", - "title": "Description" - }, - "epochCount": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Number of complete passes the model makes over the entire training dataset during training.", - "title": "Epochcount" - }, - "learningRateMultiplier": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Multiplier for adjusting the default learning rate.", - "title": "Learningratemultiplier" - }, - "exportLastCheckpointOnly": { - "anyOf": [ - { - "type": "boolean" - }, - { - "type": "null" - } - ], - "default": null, - "description": "If set to true, disable intermediate checkpoints for SFT and only the last checkpoint will be exported. Otherwise, enable intermediate checkpoints for SFT.", - "title": "Exportlastcheckpointonly" - }, - "adapterSize": { - "anyOf": [ - { - "$ref": "#/$defs/AdapterSize" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Adapter size for tuning." - }, - "batchSize": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ], - "default": null, - "description": "The batch size hyperparameter for tuning. If not set, a default of 4 or 16 will be used based on the number of training examples.", - "title": "Batchsize" - }, - "learningRate": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "default": null, - "description": "The learning rate hyperparameter for tuning. If not set, a default of 0.001 or 0.0002 will be calculated based on the number of training examples.", - "title": "Learningrate" - } - }, - "title": "CreateTuningJobConfig", - "type": "object" - }, - "HttpOptions": { - "additionalProperties": false, - "description": "HTTP options to be used in each of the requests.", - "properties": { - "baseUrl": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "The base URL for the AI platform service endpoint.", - "title": "Baseurl" - }, - "apiVersion": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Specifies the version of the API to use.", - "title": "Apiversion" - }, - "headers": { - "anyOf": [ - { - "additionalProperties": { - "type": "string" - }, - "type": "object" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Additional HTTP headers to be sent with the request.", - "title": "Headers" - }, - "timeout": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Timeout for the request in milliseconds.", - "title": "Timeout" - }, - "clientArgs": { - "anyOf": [ - { - "type": "object" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Args passed to the HTTP client.", - "title": "Clientargs" - }, - "asyncClientArgs": { - "anyOf": [ - { - "type": "object" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Args passed to the async HTTP client.", - "title": "Asyncclientargs" - }, - "extraBody": { - "anyOf": [ - { - "type": "object" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Extra parameters to add to the request body.\n The structure must match the backend API's request structure.\n - VertexAI backend API docs: https://cloud.google.com/vertex-ai/docs/reference/rest\n - GeminiAPI backend API docs: https://ai.google.dev/api/rest", - "title": "Extrabody" - }, - "retryOptions": { - "anyOf": [ - { - "$ref": "#/$defs/HttpRetryOptions" - }, - { - "type": "null" - } - ], - "default": null, - "description": "HTTP retry options for the request." - } - }, - "title": "HttpOptions", - "type": "object" - }, - "HttpRetryOptions": { - "additionalProperties": false, - "description": "HTTP retry options to be used in each of the requests.", - "properties": { - "attempts": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Maximum number of attempts, including the original request.\n If 0 or 1, it means no retries.", - "title": "Attempts" - }, - "initialDelay": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Initial delay before the first retry, in fractions of a second.", - "title": "Initialdelay" - }, - "maxDelay": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Maximum delay between retries, in fractions of a second.", - "title": "Maxdelay" - }, - "expBase": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Multiplier by which the delay increases after each attempt.", - "title": "Expbase" - }, - "jitter": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Randomness factor for the delay.", - "title": "Jitter" - }, - "httpStatusCodes": { - "anyOf": [ - { - "items": { - "type": "integer" - }, - "type": "array" - }, - { - "type": "null" - } - ], - "default": null, - "description": "List of HTTP status codes that should trigger a retry.\n If not specified, a default set of retryable codes may be used.", - "title": "Httpstatuscodes" - } - }, - "title": "HttpRetryOptions", - "type": "object" - }, "TuningDataset": { "additionalProperties": false, "description": "Supervised fine-tuning training dataset.", @@ -42554,39 +43010,6 @@

    Submodules }, "title": "TuningExample", "type": "object" - }, - "TuningValidationDataset": { - "additionalProperties": false, - "properties": { - "gcsUri": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "GCS URI of the file containing validation dataset in JSONL format.", - "title": "Gcsuri" - }, - "vertexDatasetResource": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "The resource name of the Vertex Multimodal Dataset that is used as training dataset. Example: 'projects/my-project-id-or-number/locations/my-location/datasets/my-dataset-id'.", - "title": "Vertexdatasetresource" - } - }, - "title": "TuningValidationDataset", - "type": "object" } }, "additionalProperties": false @@ -42647,6 +43070,67 @@

    Submodules +
    +pydantic model genai.types.CustomOutputFormatConfig
    +

    Bases: BaseModel

    +

    Config for custom output format.

    +

    Create a new model by parsing and validating input data from keyword arguments.

    +

    Raises [ValidationError][pydantic_core.ValidationError] if the input data cannot be +validated to form a valid model.

    +

    self is explicitly positional-only to allow self as a field name.

    +

    +Show JSON schema
    {
    +   "title": "CustomOutputFormatConfig",
    +   "description": "Config for custom output format.",
    +   "type": "object",
    +   "properties": {
    +      "returnRawOutput": {
    +         "anyOf": [
    +            {
    +               "type": "boolean"
    +            },
    +            {
    +               "type": "null"
    +            }
    +         ],
    +         "default": null,
    +         "description": "Optional. Whether to return raw output.",
    +         "title": "Returnrawoutput"
    +      }
    +   },
    +   "additionalProperties": false
    +}
    +
    +
    +

    +
    Fields:
    +
    +
    +
    +
    +
    +field return_raw_output: Optional[bool] = None (alias 'returnRawOutput')
    +

    Optional. Whether to return raw output.

    +
    + +

    + +
    +
    +class genai.types.CustomOutputFormatConfigDict
    +

    Bases: TypedDict

    +

    Config for custom output format.

    +
    +
    +return_raw_output: Optional[bool]
    +

    Optional. Whether to return raw output.

    +
    + +
    +
    pydantic model genai.types.DatasetDistribution
    @@ -46213,422 +46697,6 @@

    Submodules -
    -pydantic model genai.types.DistillationHyperParameters
    -

    Bases: BaseModel

    -

    Hyperparameters for Distillation.

    -

    Create a new model by parsing and validating input data from keyword arguments.

    -

    Raises [ValidationError][pydantic_core.ValidationError] if the input data cannot be -validated to form a valid model.

    -

    self is explicitly positional-only to allow self as a field name.

    -

    -Show JSON schema
    {
    -   "title": "DistillationHyperParameters",
    -   "description": "Hyperparameters for Distillation.",
    -   "type": "object",
    -   "properties": {
    -      "adapterSize": {
    -         "anyOf": [
    -            {
    -               "$ref": "#/$defs/AdapterSize"
    -            },
    -            {
    -               "type": "null"
    -            }
    -         ],
    -         "default": null,
    -         "description": "Optional. Adapter size for distillation."
    -      },
    -      "epochCount": {
    -         "anyOf": [
    -            {
    -               "type": "integer"
    -            },
    -            {
    -               "type": "null"
    -            }
    -         ],
    -         "default": null,
    -         "description": "Optional. Number of complete passes the model makes over the entire training dataset during training.",
    -         "title": "Epochcount"
    -      },
    -      "learningRateMultiplier": {
    -         "anyOf": [
    -            {
    -               "type": "number"
    -            },
    -            {
    -               "type": "null"
    -            }
    -         ],
    -         "default": null,
    -         "description": "Optional. Multiplier for adjusting the default learning rate.",
    -         "title": "Learningratemultiplier"
    -      }
    -   },
    -   "$defs": {
    -      "AdapterSize": {
    -         "description": "Optional. Adapter size for tuning.",
    -         "enum": [
    -            "ADAPTER_SIZE_UNSPECIFIED",
    -            "ADAPTER_SIZE_ONE",
    -            "ADAPTER_SIZE_TWO",
    -            "ADAPTER_SIZE_FOUR",
    -            "ADAPTER_SIZE_EIGHT",
    -            "ADAPTER_SIZE_SIXTEEN",
    -            "ADAPTER_SIZE_THIRTY_TWO"
    -         ],
    -         "title": "AdapterSize",
    -         "type": "string"
    -      }
    -   },
    -   "additionalProperties": false
    -}
    -
    -
    -

    -
    Fields:
    -
    -
    -
    -
    -
    -field adapter_size: Optional[AdapterSize] = None (alias 'adapterSize')
    -

    Optional. Adapter size for distillation.

    -
    - -
    -
    -field epoch_count: Optional[int] = None (alias 'epochCount')
    -

    Optional. Number of complete passes the model makes over the entire training dataset during training.

    -
    - -
    -
    -field learning_rate_multiplier: Optional[float] = None (alias 'learningRateMultiplier')
    -

    Optional. Multiplier for adjusting the default learning rate.

    -
    - -

    - -
    -
    -class genai.types.DistillationHyperParametersDict
    -

    Bases: TypedDict

    -

    Hyperparameters for Distillation.

    -
    -
    -adapter_size: Optional[AdapterSize]
    -

    Optional. Adapter size for distillation.

    -
    - -
    -
    -epoch_count: Optional[int]
    -

    Optional. Number of complete passes the model makes over the entire training dataset during training.

    -
    - -
    -
    -learning_rate_multiplier: Optional[float]
    -

    Optional. Multiplier for adjusting the default learning rate.

    -
    - -
    - -
    -
    -pydantic model genai.types.DistillationSpec
    -

    Bases: BaseModel

    -

    Tuning Spec for Distillation.

    -

    Create a new model by parsing and validating input data from keyword arguments.

    -

    Raises [ValidationError][pydantic_core.ValidationError] if the input data cannot be -validated to form a valid model.

    -

    self is explicitly positional-only to allow self as a field name.

    -

    -Show JSON schema
    {
    -   "title": "DistillationSpec",
    -   "description": "Tuning Spec for Distillation.",
    -   "type": "object",
    -   "properties": {
    -      "baseTeacherModel": {
    -         "anyOf": [
    -            {
    -               "type": "string"
    -            },
    -            {
    -               "type": "null"
    -            }
    -         ],
    -         "default": null,
    -         "description": "The base teacher model that is being distilled. See [Supported models](https://cloud.google.com/vertex-ai/generative-ai/docs/model-reference/tuning#supported_models).",
    -         "title": "Baseteachermodel"
    -      },
    -      "hyperParameters": {
    -         "anyOf": [
    -            {
    -               "$ref": "#/$defs/DistillationHyperParameters"
    -            },
    -            {
    -               "type": "null"
    -            }
    -         ],
    -         "default": null,
    -         "description": "Optional. Hyperparameters for Distillation."
    -      },
    -      "pipelineRootDirectory": {
    -         "anyOf": [
    -            {
    -               "type": "string"
    -            },
    -            {
    -               "type": "null"
    -            }
    -         ],
    -         "default": null,
    -         "description": "Deprecated. A path in a Cloud Storage bucket, which will be treated as the root output directory of the distillation pipeline. It is used by the system to generate the paths of output artifacts.",
    -         "title": "Pipelinerootdirectory"
    -      },
    -      "studentModel": {
    -         "anyOf": [
    -            {
    -               "type": "string"
    -            },
    -            {
    -               "type": "null"
    -            }
    -         ],
    -         "default": null,
    -         "description": "The student model that is being tuned, e.g., \"google/gemma-2b-1.1-it\". Deprecated. Use base_model instead.",
    -         "title": "Studentmodel"
    -      },
    -      "trainingDatasetUri": {
    -         "anyOf": [
    -            {
    -               "type": "string"
    -            },
    -            {
    -               "type": "null"
    -            }
    -         ],
    -         "default": null,
    -         "description": "Deprecated. Cloud Storage path to file containing training dataset for tuning. The dataset must be formatted as a JSONL file.",
    -         "title": "Trainingdataseturi"
    -      },
    -      "tunedTeacherModelSource": {
    -         "anyOf": [
    -            {
    -               "type": "string"
    -            },
    -            {
    -               "type": "null"
    -            }
    -         ],
    -         "default": null,
    -         "description": "The resource name of the Tuned teacher model. Format: `projects/{project}/locations/{location}/models/{model}`.",
    -         "title": "Tunedteachermodelsource"
    -      },
    -      "validationDatasetUri": {
    -         "anyOf": [
    -            {
    -               "type": "string"
    -            },
    -            {
    -               "type": "null"
    -            }
    -         ],
    -         "default": null,
    -         "description": "Optional. Cloud Storage path to file containing validation dataset for tuning. The dataset must be formatted as a JSONL file.",
    -         "title": "Validationdataseturi"
    -      }
    -   },
    -   "$defs": {
    -      "AdapterSize": {
    -         "description": "Optional. Adapter size for tuning.",
    -         "enum": [
    -            "ADAPTER_SIZE_UNSPECIFIED",
    -            "ADAPTER_SIZE_ONE",
    -            "ADAPTER_SIZE_TWO",
    -            "ADAPTER_SIZE_FOUR",
    -            "ADAPTER_SIZE_EIGHT",
    -            "ADAPTER_SIZE_SIXTEEN",
    -            "ADAPTER_SIZE_THIRTY_TWO"
    -         ],
    -         "title": "AdapterSize",
    -         "type": "string"
    -      },
    -      "DistillationHyperParameters": {
    -         "additionalProperties": false,
    -         "description": "Hyperparameters for Distillation.",
    -         "properties": {
    -            "adapterSize": {
    -               "anyOf": [
    -                  {
    -                     "$ref": "#/$defs/AdapterSize"
    -                  },
    -                  {
    -                     "type": "null"
    -                  }
    -               ],
    -               "default": null,
    -               "description": "Optional. Adapter size for distillation."
    -            },
    -            "epochCount": {
    -               "anyOf": [
    -                  {
    -                     "type": "integer"
    -                  },
    -                  {
    -                     "type": "null"
    -                  }
    -               ],
    -               "default": null,
    -               "description": "Optional. Number of complete passes the model makes over the entire training dataset during training.",
    -               "title": "Epochcount"
    -            },
    -            "learningRateMultiplier": {
    -               "anyOf": [
    -                  {
    -                     "type": "number"
    -                  },
    -                  {
    -                     "type": "null"
    -                  }
    -               ],
    -               "default": null,
    -               "description": "Optional. Multiplier for adjusting the default learning rate.",
    -               "title": "Learningratemultiplier"
    -            }
    -         },
    -         "title": "DistillationHyperParameters",
    -         "type": "object"
    -      }
    -   },
    -   "additionalProperties": false
    -}
    -
    -
    -

    -
    Fields:
    -
    -
    -
    -
    -
    -field base_teacher_model: Optional[str] = None (alias 'baseTeacherModel')
    -

    The base teacher model that is being distilled. See [Supported models](https://cloud.google.com/vertex-ai/generative-ai/docs/model-reference/tuning#supported_models).

    -
    - -
    -
    -field hyper_parameters: Optional[DistillationHyperParameters] = None (alias 'hyperParameters')
    -

    Optional. Hyperparameters for Distillation.

    -
    - -
    -
    -field pipeline_root_directory: Optional[str] = None (alias 'pipelineRootDirectory')
    -

    Deprecated. A path in a Cloud Storage bucket, which will be treated as the root output directory of the distillation pipeline. It is used by the system to generate the paths of output artifacts.

    -
    - -
    -
    -field student_model: Optional[str] = None (alias 'studentModel')
    -

    The student model that is being tuned, e.g., “google/gemma-2b-1.1-it”. Deprecated. Use base_model instead.

    -
    - -
    -
    -field training_dataset_uri: Optional[str] = None (alias 'trainingDatasetUri')
    -

    Deprecated. Cloud Storage path to file containing training dataset for tuning. The dataset must be formatted as a JSONL file.

    -
    - -
    -
    -field tuned_teacher_model_source: Optional[str] = None (alias 'tunedTeacherModelSource')
    -

    The resource name of the Tuned teacher model. Format: projects/{project}/locations/{location}/models/{model}.

    -
    - -
    -
    -field validation_dataset_uri: Optional[str] = None (alias 'validationDatasetUri')
    -

    Optional. Cloud Storage path to file containing validation dataset for tuning. The dataset must be formatted as a JSONL file.

    -
    - -
    - -
    -
    -class genai.types.DistillationSpecDict
    -

    Bases: TypedDict

    -

    Tuning Spec for Distillation.

    -
    -
    -base_teacher_model: Optional[str]
    -

    //cloud.google.com/vertex-ai/generative-ai/docs/model-reference/tuning#supported_models).

    -
    -
    Type:
    -

    The base teacher model that is being distilled. See [Supported models](https

    -
    -
    -
    - -
    -
    -hyper_parameters: Optional[DistillationHyperParametersDict]
    -

    Optional. Hyperparameters for Distillation.

    -
    - -
    -
    -pipeline_root_directory: Optional[str]
    -

    Deprecated. A path in a Cloud Storage bucket, which will be treated as the root output directory of the distillation pipeline. It is used by the system to generate the paths of output artifacts.

    -
    - -
    -
    -student_model: Optional[str]
    -

    The student model that is being tuned, e.g., “google/gemma-2b-1.1-it”. Deprecated. Use base_model instead.

    -
    - -
    -
    -training_dataset_uri: Optional[str]
    -

    Deprecated. Cloud Storage path to file containing training dataset for tuning. The dataset must be formatted as a JSONL file.

    -
    - -
    -
    -tuned_teacher_model_source: Optional[str]
    -

    projects/{project}/locations/{location}/models/{model}.

    -
    -
    Type:
    -

    The resource name of the Tuned teacher model. Format

    -
    -
    -
    - -
    -
    -validation_dataset_uri: Optional[str]
    -

    Optional. Cloud Storage path to file containing validation dataset for tuning. The dataset must be formatted as a JSONL file.

    -
    - -
    -
    pydantic model genai.types.DownloadFileConfig
    @@ -48996,18 +49064,351 @@

    Submodules "title": "EnterpriseWebSearch", "description": "Tool to search public web data, powered by Vertex AI Search and Sec4 compliance.", "type": "object", - "properties": {}, + "properties": { + "excludeDomains": { + "anyOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional. List of domains to be excluded from the search results. The default limit is 2000 domains.", + "title": "Excludedomains" + } + }, "additionalProperties": false }

    -

    +

    +
    Fields:
    +
    +
    +
    +
    +
    +field exclude_domains: Optional[list[str]] = None (alias 'excludeDomains')
    +

    Optional. List of domains to be excluded from the search results. The default limit is 2000 domains.

    +
    + +
    class genai.types.EnterpriseWebSearchDict

    Bases: TypedDict

    Tool to search public web data, powered by Vertex AI Search and Sec4 compliance.

    +
    +
    +exclude_domains: Optional[list[str]]
    +

    Optional. List of domains to be excluded from the search results. The default limit is 2000 domains.

    +
    + +
    + +
    +
    +pydantic model genai.types.EntityLabel
    +

    Bases: BaseModel

    +

    An entity representing the segmented area.

    +

    Create a new model by parsing and validating input data from keyword arguments.

    +

    Raises [ValidationError][pydantic_core.ValidationError] if the input data cannot be +validated to form a valid model.

    +

    self is explicitly positional-only to allow self as a field name.

    +

    +Show JSON schema
    {
    +   "title": "EntityLabel",
    +   "description": "An entity representing the segmented area.",
    +   "type": "object",
    +   "properties": {
    +      "label": {
    +         "anyOf": [
    +            {
    +               "type": "string"
    +            },
    +            {
    +               "type": "null"
    +            }
    +         ],
    +         "default": null,
    +         "description": "The label of the segmented entity.",
    +         "title": "Label"
    +      },
    +      "score": {
    +         "anyOf": [
    +            {
    +               "type": "number"
    +            },
    +            {
    +               "type": "null"
    +            }
    +         ],
    +         "default": null,
    +         "description": "The confidence score of the detected label.",
    +         "title": "Score"
    +      }
    +   },
    +   "additionalProperties": false
    +}
    +
    +
    +

    +
    Fields:
    +
    +
    +
    +
    +
    +field label: Optional[str] = None
    +

    The label of the segmented entity.

    +
    + +
    +
    +field score: Optional[float] = None
    +

    The confidence score of the detected label.

    +
    + +
    + +
    +
    +class genai.types.EntityLabelDict
    +

    Bases: TypedDict

    +

    An entity representing the segmented area.

    +
    +
    +label: Optional[str]
    +

    The label of the segmented entity.

    +
    + +
    +
    +score: Optional[float]
    +

    The confidence score of the detected label.

    +
    + +
    + +
    +
    +class genai.types.Environment(*values)
    +

    Bases: CaseInSensitiveEnum

    +

    The environment being operated.

    +
    +
    +ENVIRONMENT_BROWSER = 'ENVIRONMENT_BROWSER'
    +

    Operates in a web browser.

    +
    + +
    +
    +ENVIRONMENT_UNSPECIFIED = 'ENVIRONMENT_UNSPECIFIED'
    +

    Defaults to browser.

    +
    + +
    + +
    +
    +pydantic model genai.types.EvaluationConfig
    +

    Bases: BaseModel

    +

    Evaluation config for tuning.

    +

    Create a new model by parsing and validating input data from keyword arguments.

    +

    Raises [ValidationError][pydantic_core.ValidationError] if the input data cannot be +validated to form a valid model.

    +

    self is explicitly positional-only to allow self as a field name.

    +

    +Show JSON schema
    {
    +   "title": "EvaluationConfig",
    +   "type": "object",
    +   "properties": {
    +      "metrics": {
    +         "default": null,
    +         "title": "Metrics"
    +      },
    +      "outputConfig": {
    +         "anyOf": [
    +            {
    +               "$ref": "#/$defs/OutputConfig"
    +            },
    +            {
    +               "type": "null"
    +            }
    +         ],
    +         "default": null,
    +         "description": "Config for evaluation output."
    +      },
    +      "autoraterConfig": {
    +         "anyOf": [
    +            {
    +               "$ref": "#/$defs/AutoraterConfig"
    +            },
    +            {
    +               "type": "null"
    +            }
    +         ],
    +         "default": null,
    +         "description": "Autorater config for evaluation."
    +      }
    +   },
    +   "$defs": {
    +      "AutoraterConfig": {
    +         "additionalProperties": false,
    +         "description": "Autorater config used for evaluation.",
    +         "properties": {
    +            "samplingCount": {
    +               "anyOf": [
    +                  {
    +                     "type": "integer"
    +                  },
    +                  {
    +                     "type": "null"
    +                  }
    +               ],
    +               "default": null,
    +               "description": "Number of samples for each instance in the dataset.\n  If not specified, the default is 4. Minimum value is 1, maximum value\n  is 32.",
    +               "title": "Samplingcount"
    +            },
    +            "flipEnabled": {
    +               "anyOf": [
    +                  {
    +                     "type": "boolean"
    +                  },
    +                  {
    +                     "type": "null"
    +                  }
    +               ],
    +               "default": null,
    +               "description": "Optional. Default is true. Whether to flip the candidate and baseline\n  responses. This is only applicable to the pairwise metric. If enabled, also\n  provide PairwiseMetricSpec.candidate_response_field_name and\n  PairwiseMetricSpec.baseline_response_field_name. When rendering\n  PairwiseMetricSpec.metric_prompt_template, the candidate and baseline\n  fields will be flipped for half of the samples to reduce bias.",
    +               "title": "Flipenabled"
    +            },
    +            "autoraterModel": {
    +               "anyOf": [
    +                  {
    +                     "type": "string"
    +                  },
    +                  {
    +                     "type": "null"
    +                  }
    +               ],
    +               "default": null,
    +               "description": "The fully qualified name of the publisher model or tuned autorater\n  endpoint to use.\n\n  Publisher model format:\n  `projects/{project}/locations/{location}/publishers/*/models/*`\n\n  Tuned model endpoint format:\n  `projects/{project}/locations/{location}/endpoints/{endpoint}`",
    +               "title": "Autoratermodel"
    +            }
    +         },
    +         "title": "AutoraterConfig",
    +         "type": "object"
    +      },
    +      "GcsDestination": {
    +         "additionalProperties": false,
    +         "description": "The Google Cloud Storage location where the output is to be written to.",
    +         "properties": {
    +            "outputUriPrefix": {
    +               "anyOf": [
    +                  {
    +                     "type": "string"
    +                  },
    +                  {
    +                     "type": "null"
    +                  }
    +               ],
    +               "default": null,
    +               "description": "Required. Google Cloud Storage URI to output directory. If the uri doesn't end with '/', a '/' will be automatically appended. The directory is created if it doesn't exist.",
    +               "title": "Outputuriprefix"
    +            }
    +         },
    +         "title": "GcsDestination",
    +         "type": "object"
    +      },
    +      "OutputConfig": {
    +         "additionalProperties": false,
    +         "description": "Config for evaluation output.",
    +         "properties": {
    +            "gcsDestination": {
    +               "anyOf": [
    +                  {
    +                     "$ref": "#/$defs/GcsDestination"
    +                  },
    +                  {
    +                     "type": "null"
    +                  }
    +               ],
    +               "default": null,
    +               "description": "Cloud storage destination for evaluation output."
    +            }
    +         },
    +         "title": "OutputConfig",
    +         "type": "object"
    +      }
    +   },
    +   "additionalProperties": false
    +}
    +
    +
    +

    +
    Fields:
    +
    +
    +
    +
    +
    +field autorater_config: Optional[AutoraterConfig] = None (alias 'autoraterConfig')
    +

    Autorater config for evaluation.

    +
    + +
    +
    +field metrics: Optional[list[Metric]] = None
    +

    The metrics used for evaluation.

    +
    + +
    +
    +field output_config: Optional[OutputConfig] = None (alias 'outputConfig')
    +

    Config for evaluation output.

    +
    + +
    + +
    +
    +class genai.types.EvaluationConfigDict
    +

    Bases: TypedDict

    +

    Evaluation config for tuning.

    +
    +
    +autorater_config: Optional[AutoraterConfigDict]
    +

    Autorater config for evaluation.

    +
    + +
    +
    +metrics: Optional[list[MetricDict]]
    +

    The metrics used for evaluation.

    +
    + +
    +
    +output_config: Optional[OutputConfigDict]
    +

    Config for evaluation output.

    +
    +
    @@ -51719,6 +52120,13 @@

    Submodules classmethod from_callable(*, client, callable, behavior=None)

    Converts a Callable to a FunctionDeclaration based on the client.

    +

    Note: For best results prefer +[Google-style +docstring](https://google.github.io/styleguide/pyguide.html#383-functions-and-methods) +when describing arguments. This function does not parse argument +descriptions into the property description slots of the resulting structure. +Instead it sends the whole docstring in the top-level function description. +Google-style docstring are closest to what the model is trained on.

    Return type:

    FunctionDeclaration

    @@ -52023,6 +52431,79 @@

    Submodules +
    +pydantic model genai.types.GcsDestination
    +

    Bases: BaseModel

    +

    The Google Cloud Storage location where the output is to be written to.

    +

    Create a new model by parsing and validating input data from keyword arguments.

    +

    Raises [ValidationError][pydantic_core.ValidationError] if the input data cannot be +validated to form a valid model.

    +

    self is explicitly positional-only to allow self as a field name.

    +

    +Show JSON schema
    {
    +   "title": "GcsDestination",
    +   "description": "The Google Cloud Storage location where the output is to be written to.",
    +   "type": "object",
    +   "properties": {
    +      "outputUriPrefix": {
    +         "anyOf": [
    +            {
    +               "type": "string"
    +            },
    +            {
    +               "type": "null"
    +            }
    +         ],
    +         "default": null,
    +         "description": "Required. Google Cloud Storage URI to output directory. If the uri doesn't end with '/', a '/' will be automatically appended. The directory is created if it doesn't exist.",
    +         "title": "Outputuriprefix"
    +      }
    +   },
    +   "additionalProperties": false
    +}
    +
    +
    +

    +
    Fields:
    +
    +
    +
    Validators:
    +
      +
    • _validate_gcs_path » all fields

    • +
    +
    +
    +
    +
    +field output_uri_prefix: Optional[str] = None (alias 'outputUriPrefix')
    +

    Required. Google Cloud Storage URI to output directory. If the uri doesn’t end with ‘/’, a ‘/’ will be automatically appended. The directory is created if it doesn’t exist.

    +
    +
    Validated by:
    +
      +
    • _validate_gcs_path

    • +
    +
    +
    +
    + +

    + +
    +
    +class genai.types.GcsDestinationDict
    +

    Bases: TypedDict

    +

    The Google Cloud Storage location where the output is to be written to.

    +
    +
    +output_uri_prefix: Optional[str]
    +

    Required. Google Cloud Storage URI to output directory. If the uri doesn’t end with ‘/’, a ‘/’ will be automatically appended. The directory is created if it doesn’t exist.

    +
    + +
    +
    pydantic model genai.types.GeminiPreferenceExample
    @@ -54241,10 +54722,36 @@

    Submodules "EnterpriseWebSearch": { "additionalProperties": false, "description": "Tool to search public web data, powered by Vertex AI Search and Sec4 compliance.", - "properties": {}, + "properties": { + "excludeDomains": { + "anyOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional. List of domains to be excluded from the search results. The default limit is 2000 domains.", + "title": "Excludedomains" + } + }, "title": "EnterpriseWebSearch", "type": "object" }, + "Environment": { + "description": "The environment being operated.", + "enum": [ + "ENVIRONMENT_UNSPECIFIED", + "ENVIRONMENT_BROWSER" + ], + "title": "Environment", + "type": "string" + }, "ExecutableCode": { "additionalProperties": false, "description": "Code generated by the model that is meant to be executed, and the result returned to the model.\n\nGenerated when using the [CodeExecution] tool, in which the code will be\nautomatically executed, and a corresponding [CodeExecutionResult] will also be\ngenerated.", @@ -55116,6 +55623,22 @@

    Submodules ], "default": null, "description": "Optional. Filter search results to a specific time range.\n If customers set a start time, they must set an end time (and vice versa).\n " + }, + "excludeDomains": { + "anyOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional. List of domains to be excluded from the search results.\n The default limit is 2000 domains.", + "title": "Excludedomains" } }, "title": "GoogleSearch", @@ -56545,6 +57068,26 @@

    Submodules "title": "ToolCodeExecution", "type": "object" }, + "ToolComputerUse": { + "additionalProperties": false, + "description": "Tool to support computer use.", + "properties": { + "environment": { + "anyOf": [ + { + "$ref": "#/$defs/Environment" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Required. The environment being operated." + } + }, + "title": "ToolComputerUse", + "type": "object" + }, "ToolConfig": { "additionalProperties": false, "description": "Tool config.\n\nThis config is shared for all tools provided in the request.", @@ -56996,6 +57539,18 @@

    Submodules "default": null, "description": "Optional. Tool to support URL context retrieval." }, + "computerUse": { + "anyOf": [ + { + "$ref": "#/$defs/ToolComputerUse" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional. Tool to support the model interacting directly with the\n computer. If enabled, it automatically populates computer-use specific\n Function Declarations." + }, "codeExecution": { "anyOf": [ { @@ -58875,6 +59430,19 @@

    Submodules "additionalProperties": false, "description": "Chunk from context retrieved by the retrieval tools.", "properties": { + "documentName": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Output only. The full document name for the referenced Vertex AI Search document.", + "title": "Documentname" + }, "ragChunk": { "anyOf": [ { @@ -63200,6 +63768,179 @@

    Submodules +
    +pydantic model genai.types.GeneratedImageMask
    +

    Bases: BaseModel

    +

    A generated image mask.

    +

    Create a new model by parsing and validating input data from keyword arguments.

    +

    Raises [ValidationError][pydantic_core.ValidationError] if the input data cannot be +validated to form a valid model.

    +

    self is explicitly positional-only to allow self as a field name.

    +

    +Show JSON schema
    {
    +   "title": "GeneratedImageMask",
    +   "description": "A generated image mask.",
    +   "type": "object",
    +   "properties": {
    +      "mask": {
    +         "anyOf": [
    +            {
    +               "$ref": "#/$defs/Image"
    +            },
    +            {
    +               "type": "null"
    +            }
    +         ],
    +         "default": null,
    +         "description": "The generated image mask."
    +      },
    +      "labels": {
    +         "anyOf": [
    +            {
    +               "items": {
    +                  "$ref": "#/$defs/EntityLabel"
    +               },
    +               "type": "array"
    +            },
    +            {
    +               "type": "null"
    +            }
    +         ],
    +         "default": null,
    +         "description": "The detected entities on the segmented area.",
    +         "title": "Labels"
    +      }
    +   },
    +   "$defs": {
    +      "EntityLabel": {
    +         "additionalProperties": false,
    +         "description": "An entity representing the segmented area.",
    +         "properties": {
    +            "label": {
    +               "anyOf": [
    +                  {
    +                     "type": "string"
    +                  },
    +                  {
    +                     "type": "null"
    +                  }
    +               ],
    +               "default": null,
    +               "description": "The label of the segmented entity.",
    +               "title": "Label"
    +            },
    +            "score": {
    +               "anyOf": [
    +                  {
    +                     "type": "number"
    +                  },
    +                  {
    +                     "type": "null"
    +                  }
    +               ],
    +               "default": null,
    +               "description": "The confidence score of the detected label.",
    +               "title": "Score"
    +            }
    +         },
    +         "title": "EntityLabel",
    +         "type": "object"
    +      },
    +      "Image": {
    +         "additionalProperties": false,
    +         "description": "An image.",
    +         "properties": {
    +            "gcsUri": {
    +               "anyOf": [
    +                  {
    +                     "type": "string"
    +                  },
    +                  {
    +                     "type": "null"
    +                  }
    +               ],
    +               "default": null,
    +               "description": "The Cloud Storage URI of the image. ``Image`` can contain a value\n      for this field or the ``image_bytes`` field but not both.\n      ",
    +               "title": "Gcsuri"
    +            },
    +            "imageBytes": {
    +               "anyOf": [
    +                  {
    +                     "format": "base64url",
    +                     "type": "string"
    +                  },
    +                  {
    +                     "type": "null"
    +                  }
    +               ],
    +               "default": null,
    +               "description": "The image bytes data. ``Image`` can contain a value for this field\n      or the ``gcs_uri`` field but not both.\n      ",
    +               "title": "Imagebytes"
    +            },
    +            "mimeType": {
    +               "anyOf": [
    +                  {
    +                     "type": "string"
    +                  },
    +                  {
    +                     "type": "null"
    +                  }
    +               ],
    +               "default": null,
    +               "description": "The MIME type of the image.",
    +               "title": "Mimetype"
    +            }
    +         },
    +         "title": "Image",
    +         "type": "object"
    +      }
    +   },
    +   "additionalProperties": false
    +}
    +
    +
    +

    +
    Fields:
    +
    +
    +
    +
    +
    +field labels: Optional[list[EntityLabel]] = None
    +

    The detected entities on the segmented area.

    +
    + +
    +
    +field mask: Optional[Image] = None
    +

    The generated image mask.

    +
    + +

    + +
    +
    +class genai.types.GeneratedImageMaskDict
    +

    Bases: TypedDict

    +

    A generated image mask.

    +
    +
    +labels: Optional[list[EntityLabelDict]]
    +

    The detected entities on the segmented area.

    +
    + +
    +
    +mask: Optional[ImageDict]
    +

    The generated image mask.

    +
    + +
    +
    pydantic model genai.types.GeneratedVideo
    @@ -66992,6 +67733,22 @@

    Submodules ], "default": null, "description": "Optional. Filter search results to a specific time range.\n If customers set a start time, they must set an end time (and vice versa).\n " + }, + "excludeDomains": { + "anyOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional. List of domains to be excluded from the search results.\n The default limit is 2000 domains.", + "title": "Excludedomains" } }, "$defs": { @@ -67039,10 +67796,18 @@

    Submodules
    Fields:

    +
    +
    +field exclude_domains: Optional[list[str]] = None (alias 'excludeDomains')
    +

    Optional. List of domains to be excluded from the search results. +The default limit is 2000 domains.

    +
    +
    field time_range_filter: Optional[Interval] = None (alias 'timeRangeFilter')
    @@ -67057,6 +67822,13 @@

    Submodulesclass genai.types.GoogleSearchDict

    Bases: TypedDict

    Tool to support Google Search in Model. Powered by Google.

    +
    +
    +exclude_domains: Optional[list[str]]
    +

    Optional. List of domains to be excluded from the search results. +The default limit is 2000 domains.

    +
    +
    time_range_filter: Optional[IntervalDict]
    @@ -67582,6 +68354,19 @@

    Submodules "additionalProperties": false, "description": "Chunk from context retrieved by the retrieval tools.", "properties": { + "documentName": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Output only. The full document name for the referenced Vertex AI Search document.", + "title": "Documentname" + }, "ragChunk": { "anyOf": [ { @@ -68684,6 +69469,19 @@

    Submodules "description": "Chunk from context retrieved by the retrieval tools.", "type": "object", "properties": { + "documentName": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Output only. The full document name for the referenced Vertex AI Search document.", + "title": "Documentname" + }, "ragChunk": { "anyOf": [ { @@ -68812,6 +69610,7 @@

    Submodules
    Fields:

    +
    field rag_chunk: Optional[RagChunk] = None (alias 'ragChunk')
    @@ -68850,6 +69655,12 @@

    Submodulesclass genai.types.GroundingChunkRetrievedContextDict

    Bases: TypedDict

    Chunk from context retrieved by the retrieval tools.

    +
    +
    +document_name: Optional[str]
    +

    Output only. The full document name for the referenced Vertex AI Search document.

    +
    +
    rag_chunk: Optional[RagChunkDict]
    @@ -69383,6 +70194,19 @@

    Submodules "additionalProperties": false, "description": "Chunk from context retrieved by the retrieval tools.", "properties": { + "documentName": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Output only. The full document name for the referenced Vertex AI Search document.", + "title": "Documentname" + }, "ragChunk": { "anyOf": [ { @@ -71720,10 +72544,36 @@

    Submodules "EnterpriseWebSearch": { "additionalProperties": false, "description": "Tool to search public web data, powered by Vertex AI Search and Sec4 compliance.", - "properties": {}, + "properties": { + "excludeDomains": { + "anyOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional. List of domains to be excluded from the search results. The default limit is 2000 domains.", + "title": "Excludedomains" + } + }, "title": "EnterpriseWebSearch", "type": "object" }, + "Environment": { + "description": "The environment being operated.", + "enum": [ + "ENVIRONMENT_UNSPECIFIED", + "ENVIRONMENT_BROWSER" + ], + "title": "Environment", + "type": "string" + }, "ExecutableCode": { "additionalProperties": false, "description": "Code generated by the model that is meant to be executed, and the result returned to the model.\n\nGenerated when using the [CodeExecution] tool, in which the code will be\nautomatically executed, and a corresponding [CodeExecutionResult] will also be\ngenerated.", @@ -73024,6 +73874,22 @@

    Submodules ], "default": null, "description": "Optional. Filter search results to a specific time range.\n If customers set a start time, they must set an end time (and vice versa).\n " + }, + "excludeDomains": { + "anyOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional. List of domains to be excluded from the search results.\n The default limit is 2000 domains.", + "title": "Excludedomains" } }, "title": "GoogleSearch", @@ -74453,6 +75319,26 @@

    Submodules "title": "ToolCodeExecution", "type": "object" }, + "ToolComputerUse": { + "additionalProperties": false, + "description": "Tool to support computer use.", + "properties": { + "environment": { + "anyOf": [ + { + "$ref": "#/$defs/Environment" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Required. The environment being operated." + } + }, + "title": "ToolComputerUse", + "type": "object" + }, "ToolConfig": { "additionalProperties": false, "description": "Tool config.\n\nThis config is shared for all tools provided in the request.", @@ -74904,6 +75790,18 @@

    Submodules "default": null, "description": "Optional. Tool to support URL context retrieval." }, + "computerUse": { + "anyOf": [ + { + "$ref": "#/$defs/ToolComputerUse" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional. Tool to support the model interacting directly with the\n computer. If enabled, it automatically populates computer-use specific\n Function Declarations." + }, "codeExecution": { "anyOf": [ { @@ -76356,6 +77254,19 @@

    Submodules "additionalProperties": false, "description": "Chunk from context retrieved by the retrieval tools.", "properties": { + "documentName": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Output only. The full document name for the referenced Vertex AI Search document.", + "title": "Documentname" + }, "ragChunk": { "anyOf": [ { @@ -79897,10 +80808,36 @@

    Submodules "EnterpriseWebSearch": { "additionalProperties": false, "description": "Tool to search public web data, powered by Vertex AI Search and Sec4 compliance.", - "properties": {}, + "properties": { + "excludeDomains": { + "anyOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional. List of domains to be excluded from the search results. The default limit is 2000 domains.", + "title": "Excludedomains" + } + }, "title": "EnterpriseWebSearch", "type": "object" }, + "Environment": { + "description": "The environment being operated.", + "enum": [ + "ENVIRONMENT_UNSPECIFIED", + "ENVIRONMENT_BROWSER" + ], + "title": "Environment", + "type": "string" + }, "ExecutableCode": { "additionalProperties": false, "description": "Code generated by the model that is meant to be executed, and the result returned to the model.\n\nGenerated when using the [CodeExecution] tool, in which the code will be\nautomatically executed, and a corresponding [CodeExecutionResult] will also be\ngenerated.", @@ -81568,6 +82505,22 @@

    Submodules ], "default": null, "description": "Optional. Filter search results to a specific time range.\n If customers set a start time, they must set an end time (and vice versa).\n " + }, + "excludeDomains": { + "anyOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional. List of domains to be excluded from the search results.\n The default limit is 2000 domains.", + "title": "Excludedomains" } }, "title": "GoogleSearch", @@ -81916,6 +82869,19 @@

    Submodules "additionalProperties": false, "description": "Chunk from context retrieved by the retrieval tools.", "properties": { + "documentName": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Output only. The full document name for the referenced Vertex AI Search document.", + "title": "Documentname" + }, "ragChunk": { "anyOf": [ { @@ -84286,6 +85252,26 @@

    Submodules "title": "ToolCodeExecution", "type": "object" }, + "ToolComputerUse": { + "additionalProperties": false, + "description": "Tool to support computer use.", + "properties": { + "environment": { + "anyOf": [ + { + "$ref": "#/$defs/Environment" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Required. The environment being operated." + } + }, + "title": "ToolComputerUse", + "type": "object" + }, "ToolConfig": { "additionalProperties": false, "description": "Tool config.\n\nThis config is shared for all tools provided in the request.", @@ -84816,6 +85802,18 @@

    Submodules "default": null, "description": "Optional. Tool to support URL context retrieval." }, + "computerUse": { + "anyOf": [ + { + "$ref": "#/$defs/ToolComputerUse" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional. Tool to support the model interacting directly with the\n computer. If enabled, it automatically populates computer-use specific\n Function Declarations." + }, "codeExecution": { "anyOf": [ { @@ -87455,7 +88453,6 @@

    Submodules Show JSON schema +

    +
    Fields:
    +
    +
    +
    +
    +
    +field next_page_token: Optional[str] = None (alias 'nextPageToken')
    +

    A token to retrieve the next page of results. Pass to ListTuningJobsRequest.page_token to obtain that page.

    +
    + +
    +
    +field sdk_http_response: Optional[HttpResponse] = None (alias 'sdkHttpResponse')
    +

    Used to retain the full HTTP response.

    +
    + +
    +
    +field tuning_jobs: Optional[list[TuningJob]] = None (alias 'tuningJobs')
    +

    List of TuningJobs in the requested page.

    +
    + +

    + +
    +
    +class genai.types.ListTuningJobsResponseDict
    +

    Bases: TypedDict

    +

    Response for the list tuning jobs method.

    +
    +
    +next_page_token: Optional[str]
    +

    A token to retrieve the next page of results. Pass to ListTuningJobsRequest.page_token to obtain that page.

    +
    + +
    +
    +sdk_http_response: Optional[HttpResponseDict]
    +

    Used to retain the full HTTP response.

    +
    + +
    +
    +tuning_jobs: Optional[list[TuningJobDict]]
    +

    List of TuningJobs in the requested page.

    +
    + +
    + +
    +
    +pydantic model genai.types.LiveClientContent
    +

    Bases: BaseModel

    +

    Incremental update of the current conversation delivered from the client.

    +

    All the content here will unconditionally be appended to the conversation +history and used as part of the prompt to the model to generate content.

    +

    A message here will interrupt any current model generation.

    +

    Create a new model by parsing and validating input data from keyword arguments.

    +

    Raises [ValidationError][pydantic_core.ValidationError] if the input data cannot be +validated to form a valid model.

    +

    self is explicitly positional-only to allow self as a field name.

    +

    +Show JSON schema
    {
    +   "title": "LiveClientContent",
    +   "description": "Incremental update of the current conversation delivered from the client.\n\nAll the content here will unconditionally be appended to the conversation\nhistory and used as part of the prompt to the model to generate content.\n\nA message here will interrupt any current model generation.",
    +   "type": "object",
    +   "properties": {
    +      "turns": {
              "anyOf": [
                 {
                    "items": {
    -                  "$ref": "#/$defs/TuningJob"
    +                  "$ref": "#/$defs/Content"
                    },
                    "type": "array"
                 },
    @@ -87496,2725 +88613,21 @@ 

    Submodules } ], "default": null, - "description": "List of TuningJobs in the requested page.", - "title": "Tuningjobs" - } - }, - "$defs": { - "AdapterSize": { - "description": "Optional. Adapter size for tuning.", - "enum": [ - "ADAPTER_SIZE_UNSPECIFIED", - "ADAPTER_SIZE_ONE", - "ADAPTER_SIZE_TWO", - "ADAPTER_SIZE_FOUR", - "ADAPTER_SIZE_EIGHT", - "ADAPTER_SIZE_SIXTEEN", - "ADAPTER_SIZE_THIRTY_TWO" - ], - "title": "AdapterSize", - "type": "string" - }, - "Blob": { - "additionalProperties": false, - "description": "Content blob.", - "properties": { - "displayName": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Optional. Display name of the blob. Used to provide a label or filename to distinguish blobs. This field is not currently used in the Gemini GenerateContent calls.", - "title": "Displayname" - }, - "data": { - "anyOf": [ - { - "format": "base64url", - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Required. Raw bytes.", - "title": "Data" - }, - "mimeType": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Required. The IANA standard MIME type of the source data.", - "title": "Mimetype" - } - }, - "title": "Blob", - "type": "object" - }, - "CodeExecutionResult": { - "additionalProperties": false, - "description": "Result of executing the [ExecutableCode].\n\nOnly generated when using the [CodeExecution] tool, and always follows a\n`part` containing the [ExecutableCode].", - "properties": { - "outcome": { - "anyOf": [ - { - "$ref": "#/$defs/Outcome" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Required. Outcome of the code execution." - }, - "output": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Optional. Contains stdout when code execution is successful, stderr or other description otherwise.", - "title": "Output" - } - }, - "title": "CodeExecutionResult", - "type": "object" - }, - "Content": { - "additionalProperties": false, - "description": "Contains the multi-part content of a message.", - "properties": { - "parts": { - "anyOf": [ - { - "items": { - "$ref": "#/$defs/Part" - }, - "type": "array" - }, - { - "type": "null" - } - ], - "default": null, - "description": "List of parts that constitute a single message. Each part may have\n a different IANA MIME type.", - "title": "Parts" - }, - "role": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Optional. The producer of the content. Must be either 'user' or\n 'model'. Useful to set for multi-turn conversations, otherwise can be\n empty. If role is not specified, SDK will determine the role.", - "title": "Role" - } - }, - "title": "Content", - "type": "object" - }, - "DatasetDistribution": { - "additionalProperties": false, - "description": "Distribution computed over a tuning dataset.", - "properties": { - "buckets": { - "anyOf": [ - { - "items": { - "$ref": "#/$defs/DatasetDistributionDistributionBucket" - }, - "type": "array" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Output only. Defines the histogram bucket.", - "title": "Buckets" - }, - "max": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Output only. The maximum of the population values.", - "title": "Max" - }, - "mean": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Output only. The arithmetic mean of the values in the population.", - "title": "Mean" - }, - "median": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Output only. The median of the values in the population.", - "title": "Median" - }, - "min": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Output only. The minimum of the population values.", - "title": "Min" - }, - "p5": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Output only. The 5th percentile of the values in the population.", - "title": "P5" - }, - "p95": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Output only. The 95th percentile of the values in the population.", - "title": "P95" - }, - "sum": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Output only. Sum of a given population of values.", - "title": "Sum" - } - }, - "title": "DatasetDistribution", - "type": "object" - }, - "DatasetDistributionDistributionBucket": { - "additionalProperties": false, - "description": "Dataset bucket used to create a histogram for the distribution given a population of values.", - "properties": { - "count": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Output only. Number of values in the bucket.", - "title": "Count" - }, - "left": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Output only. Left bound of the bucket.", - "title": "Left" - }, - "right": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Output only. Right bound of the bucket.", - "title": "Right" - } - }, - "title": "DatasetDistributionDistributionBucket", - "type": "object" - }, - "DatasetStats": { - "additionalProperties": false, - "description": "Statistics computed over a tuning dataset.", - "properties": { - "totalBillableCharacterCount": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Output only. Number of billable characters in the tuning dataset.", - "title": "Totalbillablecharactercount" - }, - "totalTuningCharacterCount": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Output only. Number of tuning characters in the tuning dataset.", - "title": "Totaltuningcharactercount" - }, - "tuningDatasetExampleCount": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Output only. Number of examples in the tuning dataset.", - "title": "Tuningdatasetexamplecount" - }, - "tuningStepCount": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Output only. Number of tuning steps for this Tuning Job.", - "title": "Tuningstepcount" - }, - "userDatasetExamples": { - "anyOf": [ - { - "items": { - "$ref": "#/$defs/Content" - }, - "type": "array" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Output only. Sample user messages in the training dataset uri.", - "title": "Userdatasetexamples" - }, - "userInputTokenDistribution": { - "anyOf": [ - { - "$ref": "#/$defs/DatasetDistribution" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Output only. Dataset distributions for the user input tokens." - }, - "userMessagePerExampleDistribution": { - "anyOf": [ - { - "$ref": "#/$defs/DatasetDistribution" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Output only. Dataset distributions for the messages per example." - }, - "userOutputTokenDistribution": { - "anyOf": [ - { - "$ref": "#/$defs/DatasetDistribution" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Output only. Dataset distributions for the user output tokens." - } - }, - "title": "DatasetStats", - "type": "object" - }, - "DistillationDataStats": { - "additionalProperties": false, - "description": "Statistics computed for datasets used for distillation.", - "properties": { - "trainingDatasetStats": { - "anyOf": [ - { - "$ref": "#/$defs/DatasetStats" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Output only. Statistics computed for the training dataset." - } - }, - "title": "DistillationDataStats", - "type": "object" - }, - "DistillationHyperParameters": { - "additionalProperties": false, - "description": "Hyperparameters for Distillation.", - "properties": { - "adapterSize": { - "anyOf": [ - { - "$ref": "#/$defs/AdapterSize" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Optional. Adapter size for distillation." - }, - "epochCount": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Optional. Number of complete passes the model makes over the entire training dataset during training.", - "title": "Epochcount" - }, - "learningRateMultiplier": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Optional. Multiplier for adjusting the default learning rate.", - "title": "Learningratemultiplier" - } - }, - "title": "DistillationHyperParameters", - "type": "object" - }, - "DistillationSpec": { - "additionalProperties": false, - "description": "Tuning Spec for Distillation.", - "properties": { - "baseTeacherModel": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "The base teacher model that is being distilled. See [Supported models](https://cloud.google.com/vertex-ai/generative-ai/docs/model-reference/tuning#supported_models).", - "title": "Baseteachermodel" - }, - "hyperParameters": { - "anyOf": [ - { - "$ref": "#/$defs/DistillationHyperParameters" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Optional. Hyperparameters for Distillation." - }, - "pipelineRootDirectory": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Deprecated. A path in a Cloud Storage bucket, which will be treated as the root output directory of the distillation pipeline. It is used by the system to generate the paths of output artifacts.", - "title": "Pipelinerootdirectory" - }, - "studentModel": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "The student model that is being tuned, e.g., \"google/gemma-2b-1.1-it\". Deprecated. Use base_model instead.", - "title": "Studentmodel" - }, - "trainingDatasetUri": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Deprecated. Cloud Storage path to file containing training dataset for tuning. The dataset must be formatted as a JSONL file.", - "title": "Trainingdataseturi" - }, - "tunedTeacherModelSource": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "The resource name of the Tuned teacher model. Format: `projects/{project}/locations/{location}/models/{model}`.", - "title": "Tunedteachermodelsource" - }, - "validationDatasetUri": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Optional. Cloud Storage path to file containing validation dataset for tuning. The dataset must be formatted as a JSONL file.", - "title": "Validationdataseturi" - } - }, - "title": "DistillationSpec", - "type": "object" - }, - "EncryptionSpec": { - "additionalProperties": false, - "description": "Represents a customer-managed encryption key spec that can be applied to a top-level resource.", - "properties": { - "kmsKeyName": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Required. The Cloud KMS resource identifier of the customer managed encryption key used to protect a resource. Has the form: `projects/my-project/locations/my-region/keyRings/my-kr/cryptoKeys/my-key`. The key needs to be in the same region as where the compute resource is created.", - "title": "Kmskeyname" - } - }, - "title": "EncryptionSpec", - "type": "object" - }, - "ExecutableCode": { - "additionalProperties": false, - "description": "Code generated by the model that is meant to be executed, and the result returned to the model.\n\nGenerated when using the [CodeExecution] tool, in which the code will be\nautomatically executed, and a corresponding [CodeExecutionResult] will also be\ngenerated.", - "properties": { - "code": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Required. The code to be executed.", - "title": "Code" - }, - "language": { - "anyOf": [ - { - "$ref": "#/$defs/Language" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Required. Programming language of the `code`." - } - }, - "title": "ExecutableCode", - "type": "object" - }, - "FileData": { - "additionalProperties": false, - "description": "URI based data.", - "properties": { - "displayName": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Optional. Display name of the file data. Used to provide a label or filename to distinguish file datas. It is not currently used in the Gemini GenerateContent calls.", - "title": "Displayname" - }, - "fileUri": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Required. URI.", - "title": "Fileuri" - }, - "mimeType": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Required. The IANA standard MIME type of the source data.", - "title": "Mimetype" - } - }, - "title": "FileData", - "type": "object" - }, - "FunctionCall": { - "additionalProperties": false, - "description": "A function call.", - "properties": { - "id": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "The unique id of the function call. If populated, the client to execute the\n `function_call` and return the response with the matching `id`.", - "title": "Id" - }, - "args": { - "anyOf": [ - { - "type": "object" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Optional. The function parameters and values in JSON object format. See [FunctionDeclaration.parameters] for parameter details.", - "title": "Args" - }, - "name": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Required. The name of the function to call. Matches [FunctionDeclaration.name].", - "title": "Name" - } - }, - "title": "FunctionCall", - "type": "object" - }, - "FunctionResponse": { - "additionalProperties": false, - "description": "A function response.", - "properties": { - "willContinue": { - "anyOf": [ - { - "type": "boolean" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Signals that function call continues, and more responses will be returned, turning the function call into a generator. Is only applicable to NON_BLOCKING function calls (see FunctionDeclaration.behavior for details), ignored otherwise. If false, the default, future responses will not be considered. Is only applicable to NON_BLOCKING function calls, is ignored otherwise. If set to false, future responses will not be considered. It is allowed to return empty `response` with `will_continue=False` to signal that the function call is finished.", - "title": "Willcontinue" - }, - "scheduling": { - "anyOf": [ - { - "$ref": "#/$defs/FunctionResponseScheduling" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Specifies how the response should be scheduled in the conversation. Only applicable to NON_BLOCKING function calls, is ignored otherwise. Defaults to WHEN_IDLE." - }, - "id": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Optional. The id of the function call this response is for. Populated by the client to match the corresponding function call `id`.", - "title": "Id" - }, - "name": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Required. The name of the function to call. Matches [FunctionDeclaration.name] and [FunctionCall.name].", - "title": "Name" - }, - "response": { - "anyOf": [ - { - "type": "object" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Required. The function response in JSON object format. Use \"output\" key to specify function output and \"error\" key to specify error details (if any). If \"output\" and \"error\" keys are not specified, then whole \"response\" is treated as function output.", - "title": "Response" - } - }, - "title": "FunctionResponse", - "type": "object" - }, - "FunctionResponseScheduling": { - "description": "Specifies how the response should be scheduled in the conversation.", - "enum": [ - "SCHEDULING_UNSPECIFIED", - "SILENT", - "WHEN_IDLE", - "INTERRUPT" - ], - "title": "FunctionResponseScheduling", - "type": "string" - }, - "GeminiPreferenceExample": { - "additionalProperties": false, - "description": "Input example for preference optimization.", - "properties": { - "completions": { - "anyOf": [ - { - "items": { - "$ref": "#/$defs/GeminiPreferenceExampleCompletion" - }, - "type": "array" - }, - { - "type": "null" - } - ], - "default": null, - "description": "List of completions for a given prompt.", - "title": "Completions" - }, - "contents": { - "anyOf": [ - { - "items": { - "$ref": "#/$defs/Content" - }, - "type": "array" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Multi-turn contents that represents the Prompt.", - "title": "Contents" - } - }, - "title": "GeminiPreferenceExample", - "type": "object" - }, - "GeminiPreferenceExampleCompletion": { - "additionalProperties": false, - "description": "Completion and its preference score.", - "properties": { - "completion": { - "anyOf": [ - { - "$ref": "#/$defs/Content" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Single turn completion for the given prompt." - }, - "score": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "default": null, - "description": "The score for the given completion.", - "title": "Score" - } - }, - "title": "GeminiPreferenceExampleCompletion", - "type": "object" - }, - "GoogleRpcStatus": { - "additionalProperties": false, - "description": "The `Status` type defines a logical error model that is suitable for different programming environments, including REST APIs and RPC APIs.\n\nIt is used by [gRPC](https://github.com/grpc). Each `Status` message contains\nthree pieces of data: error code, error message, and error details. You can\nfind out more about this error model and how to work with it in the [API\nDesign Guide](https://cloud.google.com/apis/design/errors).", - "properties": { - "code": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ], - "default": null, - "description": "The status code, which should be an enum value of google.rpc.Code.", - "title": "Code" - }, - "details": { - "anyOf": [ - { - "items": { - "type": "object" - }, - "type": "array" - }, - { - "type": "null" - } - ], - "default": null, - "description": "A list of messages that carry the error details. There is a common set of message types for APIs to use.", - "title": "Details" - }, - "message": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "A developer-facing error message, which should be in English. Any user-facing error message should be localized and sent in the google.rpc.Status.details field, or localized by the client.", - "title": "Message" - } - }, - "title": "GoogleRpcStatus", - "type": "object" - }, - "HttpResponse": { - "additionalProperties": false, - "description": "A wrapper class for the http response.", - "properties": { - "headers": { - "anyOf": [ - { - "additionalProperties": { - "type": "string" - }, - "type": "object" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Used to retain the processed HTTP headers in the response.", - "title": "Headers" - }, - "body": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "The raw HTTP response body, in JSON format.", - "title": "Body" - } - }, - "title": "HttpResponse", - "type": "object" - }, - "JobState": { - "description": "Job state.", - "enum": [ - "JOB_STATE_UNSPECIFIED", - "JOB_STATE_QUEUED", - "JOB_STATE_PENDING", - "JOB_STATE_RUNNING", - "JOB_STATE_SUCCEEDED", - "JOB_STATE_FAILED", - "JOB_STATE_CANCELLING", - "JOB_STATE_CANCELLED", - "JOB_STATE_PAUSED", - "JOB_STATE_EXPIRED", - "JOB_STATE_UPDATING", - "JOB_STATE_PARTIALLY_SUCCEEDED" - ], - "title": "JobState", - "type": "string" - }, - "Language": { - "description": "Required. Programming language of the `code`.", - "enum": [ - "LANGUAGE_UNSPECIFIED", - "PYTHON" - ], - "title": "Language", - "type": "string" - }, - "Outcome": { - "description": "Required. Outcome of the code execution.", - "enum": [ - "OUTCOME_UNSPECIFIED", - "OUTCOME_OK", - "OUTCOME_FAILED", - "OUTCOME_DEADLINE_EXCEEDED" - ], - "title": "Outcome", - "type": "string" - }, - "Part": { - "additionalProperties": false, - "description": "A datatype containing media content.\n\nExactly one field within a Part should be set, representing the specific type\nof content being conveyed. Using multiple fields within the same `Part`\ninstance is considered invalid.", - "properties": { - "videoMetadata": { - "anyOf": [ - { - "$ref": "#/$defs/VideoMetadata" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Metadata for a given video." - }, - "thought": { - "anyOf": [ - { - "type": "boolean" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Indicates if the part is thought from the model.", - "title": "Thought" - }, - "inlineData": { - "anyOf": [ - { - "$ref": "#/$defs/Blob" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Optional. Inlined bytes data." - }, - "fileData": { - "anyOf": [ - { - "$ref": "#/$defs/FileData" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Optional. URI based data." - }, - "thoughtSignature": { - "anyOf": [ - { - "format": "base64url", - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "An opaque signature for the thought so it can be reused in subsequent requests.", - "title": "Thoughtsignature" - }, - "codeExecutionResult": { - "anyOf": [ - { - "$ref": "#/$defs/CodeExecutionResult" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Optional. Result of executing the [ExecutableCode]." - }, - "executableCode": { - "anyOf": [ - { - "$ref": "#/$defs/ExecutableCode" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Optional. Code generated by the model that is meant to be executed." - }, - "functionCall": { - "anyOf": [ - { - "$ref": "#/$defs/FunctionCall" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Optional. A predicted [FunctionCall] returned from the model that contains a string representing the [FunctionDeclaration.name] with the parameters and their values." - }, - "functionResponse": { - "anyOf": [ - { - "$ref": "#/$defs/FunctionResponse" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Optional. The result output of a [FunctionCall] that contains a string representing the [FunctionDeclaration.name] and a structured JSON object containing any output from the function call. It is used as context to the model." - }, - "text": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Optional. Text part (can be code).", - "title": "Text" - } - }, - "title": "Part", - "type": "object" - }, - "PartnerModelTuningSpec": { - "additionalProperties": false, - "description": "Tuning spec for Partner models.", - "properties": { - "hyperParameters": { - "anyOf": [ - { - "type": "object" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Hyperparameters for tuning. The accepted hyper_parameters and their valid range of values will differ depending on the base model.", - "title": "Hyperparameters" - }, - "trainingDatasetUri": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Required. Cloud Storage path to file containing training dataset for tuning. The dataset must be formatted as a JSONL file.", - "title": "Trainingdataseturi" - }, - "validationDatasetUri": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Optional. Cloud Storage path to file containing validation dataset for tuning. The dataset must be formatted as a JSONL file.", - "title": "Validationdataseturi" - } - }, - "title": "PartnerModelTuningSpec", - "type": "object" - }, - "PreTunedModel": { - "additionalProperties": false, - "description": "A pre-tuned model for continuous tuning.", - "properties": { - "baseModel": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Output only. The name of the base model this PreTunedModel was tuned from.", - "title": "Basemodel" - }, - "checkpointId": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Optional. The source checkpoint id. If not specified, the default checkpoint will be used.", - "title": "Checkpointid" - }, - "tunedModelName": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "The resource name of the Model. E.g., a model resource name with a specified version id or alias: `projects/{project}/locations/{location}/models/{model}@{version_id}` `projects/{project}/locations/{location}/models/{model}@{alias}` Or, omit the version id to use the default version: `projects/{project}/locations/{location}/models/{model}`", - "title": "Tunedmodelname" - } - }, - "title": "PreTunedModel", - "type": "object" - }, - "PreferenceOptimizationDataStats": { - "additionalProperties": false, - "description": "Statistics computed for datasets used for preference optimization.", - "properties": { - "scoreVariancePerExampleDistribution": { - "anyOf": [ - { - "$ref": "#/$defs/DatasetDistribution" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Output only. Dataset distributions for scores variance per example." - }, - "scoresDistribution": { - "anyOf": [ - { - "$ref": "#/$defs/DatasetDistribution" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Output only. Dataset distributions for scores." - }, - "totalBillableTokenCount": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Output only. Number of billable tokens in the tuning dataset.", - "title": "Totalbillabletokencount" - }, - "tuningDatasetExampleCount": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Output only. Number of examples in the tuning dataset.", - "title": "Tuningdatasetexamplecount" - }, - "tuningStepCount": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Output only. Number of tuning steps for this Tuning Job.", - "title": "Tuningstepcount" - }, - "userDatasetExamples": { - "anyOf": [ - { - "items": { - "$ref": "#/$defs/GeminiPreferenceExample" - }, - "type": "array" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Output only. Sample user examples in the training dataset.", - "title": "Userdatasetexamples" - }, - "userInputTokenDistribution": { - "anyOf": [ - { - "$ref": "#/$defs/DatasetDistribution" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Output only. Dataset distributions for the user input tokens." - }, - "userOutputTokenDistribution": { - "anyOf": [ - { - "$ref": "#/$defs/DatasetDistribution" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Output only. Dataset distributions for the user output tokens." - } - }, - "title": "PreferenceOptimizationDataStats", - "type": "object" - }, - "PreferenceOptimizationHyperParameters": { - "additionalProperties": false, - "description": "Hyperparameters for Preference Optimization.", - "properties": { - "adapterSize": { - "anyOf": [ - { - "$ref": "#/$defs/AdapterSize" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Optional. Adapter size for preference optimization." - }, - "beta": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Optional. Weight for KL Divergence regularization.", - "title": "Beta" - }, - "epochCount": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Optional. Number of complete passes the model makes over the entire training dataset during training.", - "title": "Epochcount" - }, - "learningRateMultiplier": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Optional. Multiplier for adjusting the default learning rate.", - "title": "Learningratemultiplier" - } - }, - "title": "PreferenceOptimizationHyperParameters", - "type": "object" - }, - "PreferenceOptimizationSpec": { - "additionalProperties": false, - "description": "Tuning Spec for Preference Optimization.", - "properties": { - "hyperParameters": { - "anyOf": [ - { - "$ref": "#/$defs/PreferenceOptimizationHyperParameters" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Optional. Hyperparameters for Preference Optimization." - }, - "trainingDatasetUri": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Required. Cloud Storage path to file containing training dataset for preference optimization tuning. The dataset must be formatted as a JSONL file.", - "title": "Trainingdataseturi" - }, - "validationDatasetUri": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Optional. Cloud Storage path to file containing validation dataset for preference optimization tuning. The dataset must be formatted as a JSONL file.", - "title": "Validationdataseturi" - } - }, - "title": "PreferenceOptimizationSpec", - "type": "object" - }, - "SupervisedHyperParameters": { - "additionalProperties": false, - "description": "Hyperparameters for SFT.", - "properties": { - "adapterSize": { - "anyOf": [ - { - "$ref": "#/$defs/AdapterSize" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Optional. Adapter size for tuning." - }, - "batchSize": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Optional. Batch size for tuning. This feature is only available for open source models.", - "title": "Batchsize" - }, - "epochCount": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Optional. Number of complete passes the model makes over the entire training dataset during training.", - "title": "Epochcount" - }, - "learningRate": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Optional. Learning rate for tuning. Mutually exclusive with `learning_rate_multiplier`. This feature is only available for open source models.", - "title": "Learningrate" - }, - "learningRateMultiplier": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Optional. Multiplier for adjusting the default learning rate. Mutually exclusive with `learning_rate`. This feature is only available for 1P models.", - "title": "Learningratemultiplier" - } - }, - "title": "SupervisedHyperParameters", - "type": "object" - }, - "SupervisedTuningDataStats": { - "additionalProperties": false, - "description": "Tuning data statistics for Supervised Tuning.", - "properties": { - "droppedExampleReasons": { - "anyOf": [ - { - "items": { - "type": "string" - }, - "type": "array" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Output only. For each index in `truncated_example_indices`, the user-facing reason why the example was dropped.", - "title": "Droppedexamplereasons" - }, - "totalBillableCharacterCount": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Output only. Number of billable characters in the tuning dataset.", - "title": "Totalbillablecharactercount" - }, - "totalBillableTokenCount": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Output only. Number of billable tokens in the tuning dataset.", - "title": "Totalbillabletokencount" - }, - "totalTruncatedExampleCount": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Output only. The number of examples in the dataset that have been dropped. An example can be dropped for reasons including: too many tokens, contains an invalid image, contains too many images, etc.", - "title": "Totaltruncatedexamplecount" - }, - "totalTuningCharacterCount": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Output only. Number of tuning characters in the tuning dataset.", - "title": "Totaltuningcharactercount" - }, - "truncatedExampleIndices": { - "anyOf": [ - { - "items": { - "type": "integer" - }, - "type": "array" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Output only. A partial sample of the indices (starting from 1) of the dropped examples.", - "title": "Truncatedexampleindices" - }, - "tuningDatasetExampleCount": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Output only. Number of examples in the tuning dataset.", - "title": "Tuningdatasetexamplecount" - }, - "tuningStepCount": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Output only. Number of tuning steps for this Tuning Job.", - "title": "Tuningstepcount" - }, - "userDatasetExamples": { - "anyOf": [ - { - "items": { - "$ref": "#/$defs/Content" - }, - "type": "array" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Output only. Sample user messages in the training dataset uri.", - "title": "Userdatasetexamples" - }, - "userInputTokenDistribution": { - "anyOf": [ - { - "$ref": "#/$defs/SupervisedTuningDatasetDistribution" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Output only. Dataset distributions for the user input tokens." - }, - "userMessagePerExampleDistribution": { - "anyOf": [ - { - "$ref": "#/$defs/SupervisedTuningDatasetDistribution" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Output only. Dataset distributions for the messages per example." - }, - "userOutputTokenDistribution": { - "anyOf": [ - { - "$ref": "#/$defs/SupervisedTuningDatasetDistribution" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Output only. Dataset distributions for the user output tokens." - } - }, - "title": "SupervisedTuningDataStats", - "type": "object" - }, - "SupervisedTuningDatasetDistribution": { - "additionalProperties": false, - "description": "Dataset distribution for Supervised Tuning.", - "properties": { - "billableSum": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Output only. Sum of a given population of values that are billable.", - "title": "Billablesum" - }, - "buckets": { - "anyOf": [ - { - "items": { - "$ref": "#/$defs/SupervisedTuningDatasetDistributionDatasetBucket" - }, - "type": "array" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Output only. Defines the histogram bucket.", - "title": "Buckets" - }, - "max": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Output only. The maximum of the population values.", - "title": "Max" - }, - "mean": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Output only. The arithmetic mean of the values in the population.", - "title": "Mean" - }, - "median": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Output only. The median of the values in the population.", - "title": "Median" - }, - "min": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Output only. The minimum of the population values.", - "title": "Min" - }, - "p5": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Output only. The 5th percentile of the values in the population.", - "title": "P5" - }, - "p95": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Output only. The 95th percentile of the values in the population.", - "title": "P95" - }, - "sum": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Output only. Sum of a given population of values.", - "title": "Sum" - } - }, - "title": "SupervisedTuningDatasetDistribution", - "type": "object" - }, - "SupervisedTuningDatasetDistributionDatasetBucket": { - "additionalProperties": false, - "description": "Dataset bucket used to create a histogram for the distribution given a population of values.", - "properties": { - "count": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Output only. Number of values in the bucket.", - "title": "Count" - }, - "left": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Output only. Left bound of the bucket.", - "title": "Left" - }, - "right": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Output only. Right bound of the bucket.", - "title": "Right" - } - }, - "title": "SupervisedTuningDatasetDistributionDatasetBucket", - "type": "object" - }, - "SupervisedTuningSpec": { - "additionalProperties": false, - "description": "Tuning Spec for Supervised Tuning for first party models.", - "properties": { - "exportLastCheckpointOnly": { - "anyOf": [ - { - "type": "boolean" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Optional. If set to true, disable intermediate checkpoints for SFT and only the last checkpoint will be exported. Otherwise, enable intermediate checkpoints for SFT. Default is false.", - "title": "Exportlastcheckpointonly" - }, - "hyperParameters": { - "anyOf": [ - { - "$ref": "#/$defs/SupervisedHyperParameters" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Optional. Hyperparameters for SFT." - }, - "trainingDatasetUri": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Required. Training dataset used for tuning. The dataset can be specified as either a Cloud Storage path to a JSONL file or as the resource name of a Vertex Multimodal Dataset.", - "title": "Trainingdataseturi" - }, - "tuningMode": { - "anyOf": [ - { - "$ref": "#/$defs/TuningMode" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Tuning mode." - }, - "validationDatasetUri": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Optional. Validation dataset used for tuning. The dataset can be specified as either a Cloud Storage path to a JSONL file or as the resource name of a Vertex Multimodal Dataset.", - "title": "Validationdataseturi" - } - }, - "title": "SupervisedTuningSpec", - "type": "object" - }, - "TunedModel": { - "additionalProperties": false, - "properties": { - "model": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Output only. The resource name of the TunedModel. Format: `projects/{project}/locations/{location}/models/{model}@{version_id}` When tuning from a base model, the version_id will be 1. For continuous tuning, the version id will be incremented by 1 from the last version id in the parent model. E.g., `projects/{project}/locations/{location}/models/{model}@{last_version_id + 1}`", - "title": "Model" - }, - "endpoint": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Output only. A resource name of an Endpoint. Format: `projects/{project}/locations/{location}/endpoints/{endpoint}`.", - "title": "Endpoint" - }, - "checkpoints": { - "anyOf": [ - { - "items": { - "$ref": "#/$defs/TunedModelCheckpoint" - }, - "type": "array" - }, - { - "type": "null" - } - ], - "default": null, - "description": "The checkpoints associated with this TunedModel.\n This field is only populated for tuning jobs that enable intermediate\n checkpoints.", - "title": "Checkpoints" - } - }, - "title": "TunedModel", - "type": "object" - }, - "TunedModelCheckpoint": { - "additionalProperties": false, - "description": "TunedModelCheckpoint for the Tuned Model of a Tuning Job.", - "properties": { - "checkpointId": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "The ID of the checkpoint.\n ", - "title": "Checkpointid" - }, - "epoch": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ], - "default": null, - "description": "The epoch of the checkpoint.\n ", - "title": "Epoch" - }, - "step": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ], - "default": null, - "description": "The step of the checkpoint.\n ", - "title": "Step" - }, - "endpoint": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "The Endpoint resource name that the checkpoint is deployed to.\n Format: `projects/{project}/locations/{location}/endpoints/{endpoint}`.\n ", - "title": "Endpoint" - } - }, - "title": "TunedModelCheckpoint", - "type": "object" - }, - "TuningDataStats": { - "additionalProperties": false, - "description": "The tuning data statistic values for TuningJob.", - "properties": { - "distillationDataStats": { - "anyOf": [ - { - "$ref": "#/$defs/DistillationDataStats" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Output only. Statistics for distillation." - }, - "preferenceOptimizationDataStats": { - "anyOf": [ - { - "$ref": "#/$defs/PreferenceOptimizationDataStats" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Output only. Statistics for preference optimization." - }, - "supervisedTuningDataStats": { - "anyOf": [ - { - "$ref": "#/$defs/SupervisedTuningDataStats" - }, - { - "type": "null" - } - ], - "default": null, - "description": "The SFT Tuning data stats." - } - }, - "title": "TuningDataStats", - "type": "object" - }, - "TuningJob": { - "additionalProperties": false, - "description": "A tuning job.", - "properties": { - "sdkHttpResponse": { - "anyOf": [ - { - "$ref": "#/$defs/HttpResponse" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Used to retain the full HTTP response." - }, - "name": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Output only. Identifier. Resource name of a TuningJob. Format: `projects/{project}/locations/{location}/tuningJobs/{tuning_job}`", - "title": "Name" - }, - "state": { - "anyOf": [ - { - "$ref": "#/$defs/JobState" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Output only. The detailed state of the job." - }, - "createTime": { - "anyOf": [ - { - "format": "date-time", - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Output only. Time when the TuningJob was created.", - "title": "Createtime" - }, - "startTime": { - "anyOf": [ - { - "format": "date-time", - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Output only. Time when the TuningJob for the first time entered the `JOB_STATE_RUNNING` state.", - "title": "Starttime" - }, - "endTime": { - "anyOf": [ - { - "format": "date-time", - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Output only. Time when the TuningJob entered any of the following JobStates: `JOB_STATE_SUCCEEDED`, `JOB_STATE_FAILED`, `JOB_STATE_CANCELLED`, `JOB_STATE_EXPIRED`.", - "title": "Endtime" - }, - "updateTime": { - "anyOf": [ - { - "format": "date-time", - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Output only. Time when the TuningJob was most recently updated.", - "title": "Updatetime" - }, - "error": { - "anyOf": [ - { - "$ref": "#/$defs/GoogleRpcStatus" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Output only. Only populated when job's state is `JOB_STATE_FAILED` or `JOB_STATE_CANCELLED`." - }, - "description": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Optional. The description of the TuningJob.", - "title": "Description" - }, - "baseModel": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "The base model that is being tuned. See [Supported models](https://cloud.google.com/vertex-ai/generative-ai/docs/model-reference/tuning#supported_models).", - "title": "Basemodel" - }, - "tunedModel": { - "anyOf": [ - { - "$ref": "#/$defs/TunedModel" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Output only. The tuned model resources associated with this TuningJob." - }, - "preTunedModel": { - "anyOf": [ - { - "$ref": "#/$defs/PreTunedModel" - }, - { - "type": "null" - } - ], - "default": null, - "description": "The pre-tuned model for continuous tuning." - }, - "supervisedTuningSpec": { - "anyOf": [ - { - "$ref": "#/$defs/SupervisedTuningSpec" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Tuning Spec for Supervised Fine Tuning." - }, - "tuningDataStats": { - "anyOf": [ - { - "$ref": "#/$defs/TuningDataStats" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Output only. The tuning data statistics associated with this TuningJob." - }, - "encryptionSpec": { - "anyOf": [ - { - "$ref": "#/$defs/EncryptionSpec" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Customer-managed encryption key options for a TuningJob. If this is set, then all resources created by the TuningJob will be encrypted with the provided encryption key." - }, - "partnerModelTuningSpec": { - "anyOf": [ - { - "$ref": "#/$defs/PartnerModelTuningSpec" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Tuning Spec for open sourced and third party Partner models." - }, - "customBaseModel": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Optional. The user-provided path to custom model weights. Set this field to tune a custom model. The path must be a Cloud Storage directory that contains the model weights in .safetensors format along with associated model metadata files. If this field is set, the base_model field must still be set to indicate which base model the custom model is derived from. This feature is only available for open source models.", - "title": "Custombasemodel" - }, - "distillationSpec": { - "anyOf": [ - { - "$ref": "#/$defs/DistillationSpec" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Tuning Spec for Distillation." - }, - "experiment": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Output only. The Experiment associated with this TuningJob.", - "title": "Experiment" - }, - "labels": { - "anyOf": [ - { - "additionalProperties": { - "type": "string" - }, - "type": "object" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Optional. The labels with user-defined metadata to organize TuningJob and generated resources such as Model and Endpoint. Label keys and values can be no longer than 64 characters (Unicode codepoints), can only contain lowercase letters, numeric characters, underscores and dashes. International characters are allowed. See https://goo.gl/xmQnxf for more information and examples of labels.", - "title": "Labels" - }, - "outputUri": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Optional. Cloud Storage path to the directory where tuning job outputs are written to. This field is only available and required for open source models.", - "title": "Outputuri" - }, - "pipelineJob": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Output only. The resource name of the PipelineJob associated with the TuningJob. Format: `projects/{project}/locations/{location}/pipelineJobs/{pipeline_job}`.", - "title": "Pipelinejob" - }, - "preferenceOptimizationSpec": { - "anyOf": [ - { - "$ref": "#/$defs/PreferenceOptimizationSpec" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Tuning Spec for Preference Optimization." - }, - "satisfiesPzi": { - "anyOf": [ - { - "type": "boolean" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Output only. Reserved for future use.", - "title": "Satisfiespzi" - }, - "satisfiesPzs": { - "anyOf": [ - { - "type": "boolean" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Output only. Reserved for future use.", - "title": "Satisfiespzs" - }, - "serviceAccount": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "The service account that the tuningJob workload runs as. If not specified, the Vertex AI Secure Fine-Tuned Service Agent in the project will be used. See https://cloud.google.com/iam/docs/service-agents#vertex-ai-secure-fine-tuning-service-agent Users starting the pipeline must have the `iam.serviceAccounts.actAs` permission on this service account.", - "title": "Serviceaccount" - }, - "tunedModelDisplayName": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Optional. The display name of the TunedModel. The name can be up to 128 characters long and can consist of any UTF-8 characters.", - "title": "Tunedmodeldisplayname" - }, - "veoTuningSpec": { - "anyOf": [ - { - "$ref": "#/$defs/VeoTuningSpec" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Tuning Spec for Veo Tuning." - } - }, - "title": "TuningJob", - "type": "object" - }, - "TuningMode": { - "description": "Tuning mode.", - "enum": [ - "TUNING_MODE_UNSPECIFIED", - "TUNING_MODE_FULL", - "TUNING_MODE_PEFT_ADAPTER" - ], - "title": "TuningMode", - "type": "string" - }, - "TuningTask": { - "description": "Optional. The tuning task. Either I2V or T2V.", - "enum": [ - "TUNING_TASK_UNSPECIFIED", - "TUNING_TASK_I2V", - "TUNING_TASK_T2V" - ], - "title": "TuningTask", - "type": "string" - }, - "VeoHyperParameters": { - "additionalProperties": false, - "description": "Hyperparameters for Veo.", - "properties": { - "epochCount": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Optional. Number of complete passes the model makes over the entire training dataset during training.", - "title": "Epochcount" - }, - "learningRateMultiplier": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Optional. Multiplier for adjusting the default learning rate.", - "title": "Learningratemultiplier" - }, - "tuningTask": { - "anyOf": [ - { - "$ref": "#/$defs/TuningTask" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Optional. The tuning task. Either I2V or T2V." - } - }, - "title": "VeoHyperParameters", - "type": "object" - }, - "VeoTuningSpec": { - "additionalProperties": false, - "description": "Tuning Spec for Veo Model Tuning.", - "properties": { - "hyperParameters": { - "anyOf": [ - { - "$ref": "#/$defs/VeoHyperParameters" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Optional. Hyperparameters for Veo." - }, - "trainingDatasetUri": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Required. Training dataset used for tuning. The dataset can be specified as either a Cloud Storage path to a JSONL file or as the resource name of a Vertex Multimodal Dataset.", - "title": "Trainingdataseturi" - }, - "validationDatasetUri": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Optional. Validation dataset used for tuning. The dataset can be specified as either a Cloud Storage path to a JSONL file or as the resource name of a Vertex Multimodal Dataset.", - "title": "Validationdataseturi" - } - }, - "title": "VeoTuningSpec", - "type": "object" - }, - "VideoMetadata": { - "additionalProperties": false, - "description": "Describes how the video in the Part should be used by the model.", - "properties": { - "fps": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "default": null, - "description": "The frame rate of the video sent to the model. If not specified, the\n default value will be 1.0. The fps range is (0.0, 24.0].", - "title": "Fps" - }, - "endOffset": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Optional. The end offset of the video.", - "title": "Endoffset" - }, - "startOffset": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Optional. The start offset of the video.", - "title": "Startoffset" - } - }, - "title": "VideoMetadata", - "type": "object" - } - }, - "additionalProperties": false -} -

    -
    -

    -
    Fields:
    -
    -
    -
    -
    -
    -field next_page_token: Optional[str] = None (alias 'nextPageToken')
    -

    A token to retrieve the next page of results. Pass to ListTuningJobsRequest.page_token to obtain that page.

    -
    - -
    -
    -field sdk_http_response: Optional[HttpResponse] = None (alias 'sdkHttpResponse')
    -

    Used to retain the full HTTP response.

    -
    - -
    -
    -field tuning_jobs: Optional[list[TuningJob]] = None (alias 'tuningJobs')
    -

    List of TuningJobs in the requested page.

    -
    - -
    - -
    -
    -class genai.types.ListTuningJobsResponseDict
    -

    Bases: TypedDict

    -

    Response for the list tuning jobs method.

    -
    -
    -next_page_token: Optional[str]
    -

    A token to retrieve the next page of results. Pass to ListTuningJobsRequest.page_token to obtain that page.

    -
    - -
    -
    -sdk_http_response: Optional[HttpResponseDict]
    -

    Used to retain the full HTTP response.

    -
    - -
    -
    -tuning_jobs: Optional[list[TuningJobDict]]
    -

    List of TuningJobs in the requested page.

    -
    - -
    - -
    -
    -pydantic model genai.types.LiveClientContent
    -

    Bases: BaseModel

    -

    Incremental update of the current conversation delivered from the client.

    -

    All the content here will unconditionally be appended to the conversation -history and used as part of the prompt to the model to generate content.

    -

    A message here will interrupt any current model generation.

    -

    Create a new model by parsing and validating input data from keyword arguments.

    -

    Raises [ValidationError][pydantic_core.ValidationError] if the input data cannot be -validated to form a valid model.

    -

    self is explicitly positional-only to allow self as a field name.

    -

    -Show JSON schema
    {
    -   "title": "LiveClientContent",
    -   "description": "Incremental update of the current conversation delivered from the client.\n\nAll the content here will unconditionally be appended to the conversation\nhistory and used as part of the prompt to the model to generate content.\n\nA message here will interrupt any current model generation.",
    -   "type": "object",
    -   "properties": {
    -      "turns": {
    -         "anyOf": [
    -            {
    -               "items": {
    -                  "$ref": "#/$defs/Content"
    -               },
    -               "type": "array"
    -            },
    -            {
    -               "type": "null"
    -            }
    -         ],
    -         "default": null,
    -         "description": "The content appended to the current conversation with the model.\n\n      For single-turn queries, this is a single instance. For multi-turn\n      queries, this is a repeated field that contains conversation history and\n      latest request.\n      ",
    -         "title": "Turns"
    -      },
    -      "turnComplete": {
    -         "anyOf": [
    -            {
    -               "type": "boolean"
    -            },
    -            {
    -               "type": "null"
    -            }
    -         ],
    -         "default": null,
    -         "description": "If true, indicates that the server content generation should start with\n  the currently accumulated prompt. Otherwise, the server will await\n  additional messages before starting generation.",
    -         "title": "Turncomplete"
    +         "description": "The content appended to the current conversation with the model.\n\n      For single-turn queries, this is a single instance. For multi-turn\n      queries, this is a repeated field that contains conversation history and\n      latest request.\n      ",
    +         "title": "Turns"
    +      },
    +      "turnComplete": {
    +         "anyOf": [
    +            {
    +               "type": "boolean"
    +            },
    +            {
    +               "type": "null"
    +            }
    +         ],
    +         "default": null,
    +         "description": "If true, indicates that the server content generation should start with\n  the currently accumulated prompt. Otherwise, the server will await\n  additional messages before starting generation.",
    +         "title": "Turncomplete"
           }
        },
        "$defs": {
    @@ -91385,10 +89798,36 @@ 

    Submodules "EnterpriseWebSearch": { "additionalProperties": false, "description": "Tool to search public web data, powered by Vertex AI Search and Sec4 compliance.", - "properties": {}, + "properties": { + "excludeDomains": { + "anyOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional. List of domains to be excluded from the search results. The default limit is 2000 domains.", + "title": "Excludedomains" + } + }, "title": "EnterpriseWebSearch", "type": "object" }, + "Environment": { + "description": "The environment being operated.", + "enum": [ + "ENVIRONMENT_UNSPECIFIED", + "ENVIRONMENT_BROWSER" + ], + "title": "Environment", + "type": "string" + }, "ExecutableCode": { "additionalProperties": false, "description": "Code generated by the model that is meant to be executed, and the result returned to the model.\n\nGenerated when using the [CodeExecution] tool, in which the code will be\nautomatically executed, and a corresponding [CodeExecutionResult] will also be\ngenerated.", @@ -92539,6 +90978,22 @@

    Submodules ], "default": null, "description": "Optional. Filter search results to a specific time range.\n If customers set a start time, they must set an end time (and vice versa).\n " + }, + "excludeDomains": { + "anyOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional. List of domains to be excluded from the search results.\n The default limit is 2000 domains.", + "title": "Excludedomains" } }, "title": "GoogleSearch", @@ -93980,6 +92435,26 @@

    Submodules "title": "ToolCodeExecution", "type": "object" }, + "ToolComputerUse": { + "additionalProperties": false, + "description": "Tool to support computer use.", + "properties": { + "environment": { + "anyOf": [ + { + "$ref": "#/$defs/Environment" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Required. The environment being operated." + } + }, + "title": "ToolComputerUse", + "type": "object" + }, "Type": { "description": "Optional. The type of the data.", "enum": [ @@ -94399,6 +92874,18 @@

    Submodules "default": null, "description": "Optional. Tool to support URL context retrieval." }, + "computerUse": { + "anyOf": [ + { + "$ref": "#/$defs/ToolComputerUse" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional. Tool to support the model interacting directly with the\n computer. If enabled, it automatically populates computer-use specific\n Function Declarations." + }, "codeExecution": { "anyOf": [ { @@ -95513,10 +94000,36 @@

    Submodules "EnterpriseWebSearch": { "additionalProperties": false, "description": "Tool to search public web data, powered by Vertex AI Search and Sec4 compliance.", - "properties": {}, + "properties": { + "excludeDomains": { + "anyOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional. List of domains to be excluded from the search results. The default limit is 2000 domains.", + "title": "Excludedomains" + } + }, "title": "EnterpriseWebSearch", "type": "object" }, + "Environment": { + "description": "The environment being operated.", + "enum": [ + "ENVIRONMENT_UNSPECIFIED", + "ENVIRONMENT_BROWSER" + ], + "title": "Environment", + "type": "string" + }, "ExecutableCode": { "additionalProperties": false, "description": "Code generated by the model that is meant to be executed, and the result returned to the model.\n\nGenerated when using the [CodeExecution] tool, in which the code will be\nautomatically executed, and a corresponding [CodeExecutionResult] will also be\ngenerated.", @@ -96667,6 +95180,22 @@

    Submodules ], "default": null, "description": "Optional. Filter search results to a specific time range.\n If customers set a start time, they must set an end time (and vice versa).\n " + }, + "excludeDomains": { + "anyOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional. List of domains to be excluded from the search results.\n The default limit is 2000 domains.", + "title": "Excludedomains" } }, "title": "GoogleSearch", @@ -97795,6 +96324,26 @@

    Submodules "title": "ToolCodeExecution", "type": "object" }, + "ToolComputerUse": { + "additionalProperties": false, + "description": "Tool to support computer use.", + "properties": { + "environment": { + "anyOf": [ + { + "$ref": "#/$defs/Environment" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Required. The environment being operated." + } + }, + "title": "ToolComputerUse", + "type": "object" + }, "Type": { "description": "Optional. The type of the data.", "enum": [ @@ -98214,6 +96763,18 @@

    Submodules "default": null, "description": "Optional. Tool to support URL context retrieval." }, + "computerUse": { + "anyOf": [ + { + "$ref": "#/$defs/ToolComputerUse" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional. Tool to support the model interacting directly with the\n computer. If enabled, it automatically populates computer-use specific\n Function Declarations." + }, "codeExecution": { "anyOf": [ { @@ -99478,10 +98039,36 @@

    Submodules "EnterpriseWebSearch": { "additionalProperties": false, "description": "Tool to search public web data, powered by Vertex AI Search and Sec4 compliance.", - "properties": {}, + "properties": { + "excludeDomains": { + "anyOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional. List of domains to be excluded from the search results. The default limit is 2000 domains.", + "title": "Excludedomains" + } + }, "title": "EnterpriseWebSearch", "type": "object" }, + "Environment": { + "description": "The environment being operated.", + "enum": [ + "ENVIRONMENT_UNSPECIFIED", + "ENVIRONMENT_BROWSER" + ], + "title": "Environment", + "type": "string" + }, "ExecutableCode": { "additionalProperties": false, "description": "Code generated by the model that is meant to be executed, and the result returned to the model.\n\nGenerated when using the [CodeExecution] tool, in which the code will be\nautomatically executed, and a corresponding [CodeExecutionResult] will also be\ngenerated.", @@ -100632,6 +99219,22 @@

    Submodules ], "default": null, "description": "Optional. Filter search results to a specific time range.\n If customers set a start time, they must set an end time (and vice versa).\n " + }, + "excludeDomains": { + "anyOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional. List of domains to be excluded from the search results.\n The default limit is 2000 domains.", + "title": "Excludedomains" } }, "title": "GoogleSearch", @@ -102017,6 +100620,26 @@

    Submodules "title": "ToolCodeExecution", "type": "object" }, + "ToolComputerUse": { + "additionalProperties": false, + "description": "Tool to support computer use.", + "properties": { + "environment": { + "anyOf": [ + { + "$ref": "#/$defs/Environment" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Required. The environment being operated." + } + }, + "title": "ToolComputerUse", + "type": "object" + }, "TurnCoverage": { "description": "Options about which input is included in the user's turn.", "enum": [ @@ -102446,6 +101069,18 @@

    Submodules "default": null, "description": "Optional. Tool to support URL context retrieval." }, + "computerUse": { + "anyOf": [ + { + "$ref": "#/$defs/ToolComputerUse" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional. Tool to support the model interacting directly with the\n computer. If enabled, it automatically populates computer-use specific\n Function Declarations." + }, "codeExecution": { "anyOf": [ { @@ -103449,10 +102084,36 @@

    Submodules "EnterpriseWebSearch": { "additionalProperties": false, "description": "Tool to search public web data, powered by Vertex AI Search and Sec4 compliance.", - "properties": {}, + "properties": { + "excludeDomains": { + "anyOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional. List of domains to be excluded from the search results. The default limit is 2000 domains.", + "title": "Excludedomains" + } + }, "title": "EnterpriseWebSearch", "type": "object" }, + "Environment": { + "description": "The environment being operated.", + "enum": [ + "ENVIRONMENT_UNSPECIFIED", + "ENVIRONMENT_BROWSER" + ], + "title": "Environment", + "type": "string" + }, "ExecutableCode": { "additionalProperties": false, "description": "Code generated by the model that is meant to be executed, and the result returned to the model.\n\nGenerated when using the [CodeExecution] tool, in which the code will be\nautomatically executed, and a corresponding [CodeExecutionResult] will also be\ngenerated.", @@ -104603,6 +103264,22 @@

    Submodules ], "default": null, "description": "Optional. Filter search results to a specific time range.\n If customers set a start time, they must set an end time (and vice versa).\n " + }, + "excludeDomains": { + "anyOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional. List of domains to be excluded from the search results.\n The default limit is 2000 domains.", + "title": "Excludedomains" } }, "title": "GoogleSearch", @@ -106271,6 +104948,26 @@

    Submodules "title": "ToolCodeExecution", "type": "object" }, + "ToolComputerUse": { + "additionalProperties": false, + "description": "Tool to support computer use.", + "properties": { + "environment": { + "anyOf": [ + { + "$ref": "#/$defs/Environment" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Required. The environment being operated." + } + }, + "title": "ToolComputerUse", + "type": "object" + }, "TurnCoverage": { "description": "Options about which input is included in the user's turn.", "enum": [ @@ -106700,6 +105397,18 @@

    Submodules "default": null, "description": "Optional. Tool to support URL context retrieval." }, + "computerUse": { + "anyOf": [ + { + "$ref": "#/$defs/ToolComputerUse" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional. Tool to support the model interacting directly with the\n computer. If enabled, it automatically populates computer-use specific\n Function Declarations." + }, "codeExecution": { "anyOf": [ { @@ -107444,10 +106153,36 @@

    Submodules "EnterpriseWebSearch": { "additionalProperties": false, "description": "Tool to search public web data, powered by Vertex AI Search and Sec4 compliance.", - "properties": {}, + "properties": { + "excludeDomains": { + "anyOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional. List of domains to be excluded from the search results. The default limit is 2000 domains.", + "title": "Excludedomains" + } + }, "title": "EnterpriseWebSearch", "type": "object" }, + "Environment": { + "description": "The environment being operated.", + "enum": [ + "ENVIRONMENT_UNSPECIFIED", + "ENVIRONMENT_BROWSER" + ], + "title": "Environment", + "type": "string" + }, "ExecutableCode": { "additionalProperties": false, "description": "Code generated by the model that is meant to be executed, and the result returned to the model.\n\nGenerated when using the [CodeExecution] tool, in which the code will be\nautomatically executed, and a corresponding [CodeExecutionResult] will also be\ngenerated.", @@ -108598,6 +107333,22 @@

    Submodules ], "default": null, "description": "Optional. Filter search results to a specific time range.\n If customers set a start time, they must set an end time (and vice versa).\n " + }, + "excludeDomains": { + "anyOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional. List of domains to be excluded from the search results.\n The default limit is 2000 domains.", + "title": "Excludedomains" } }, "title": "GoogleSearch", @@ -110266,6 +109017,26 @@

    Submodules "title": "ToolCodeExecution", "type": "object" }, + "ToolComputerUse": { + "additionalProperties": false, + "description": "Tool to support computer use.", + "properties": { + "environment": { + "anyOf": [ + { + "$ref": "#/$defs/Environment" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Required. The environment being operated." + } + }, + "title": "ToolComputerUse", + "type": "object" + }, "TurnCoverage": { "description": "Options about which input is included in the user's turn.", "enum": [ @@ -110695,6 +109466,18 @@

    Submodules "default": null, "description": "Optional. Tool to support URL context retrieval." }, + "computerUse": { + "anyOf": [ + { + "$ref": "#/$defs/ToolComputerUse" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional. Tool to support the model interacting directly with the\n computer. If enabled, it automatically populates computer-use specific\n Function Declarations." + }, "codeExecution": { "anyOf": [ { @@ -114604,6 +113387,19 @@

    Submodules "additionalProperties": false, "description": "Chunk from context retrieved by the retrieval tools.", "properties": { + "documentName": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Output only. The full document name for the referenced Vertex AI Search document.", + "title": "Documentname" + }, "ragChunk": { "anyOf": [ { @@ -116266,6 +115062,19 @@

    Submodules "additionalProperties": false, "description": "Chunk from context retrieved by the retrieval tools.", "properties": { + "documentName": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Output only. The full document name for the referenced Vertex AI Search document.", + "title": "Documentname" + }, "ragChunk": { "anyOf": [ { @@ -117521,13 +116330,13 @@

    Submodules
    field tool_call: Optional[LiveServerToolCall] = None (alias 'toolCall')
    -

    Request for the client to execute the function_calls and return the responses with the matching `id`s.

    +

    Request for the client to execute the function_calls and return the responses with the matching `id`s.

    field tool_call_cancellation: Optional[LiveServerToolCallCancellation] = None (alias 'toolCallCancellation')
    -

    Notification for the client that a previously issued ToolCallMessage with the specified `id`s should have been not executed and should be cancelled.

    +

    Notification for the client that a previously issued ToolCallMessage with the specified `id`s should have been not executed and should be cancelled.

    @@ -117582,13 +116391,13 @@

    Submodules
    tool_call: Optional[LiveServerToolCallDict]
    -

    Request for the client to execute the function_calls and return the responses with the matching `id`s.

    +

    Request for the client to execute the function_calls and return the responses with the matching `id`s.

    tool_call_cancellation: Optional[LiveServerToolCallCancellationDict]
    -

    Notification for the client that a previously issued ToolCallMessage with the specified `id`s should have been not executed and should be cancelled.

    +

    Notification for the client that a previously issued ToolCallMessage with the specified `id`s should have been not executed and should be cancelled.

    @@ -117679,7 +116488,7 @@

    Submodules
    field new_handle: Optional[str] = None (alias 'newHandle')
    -

    New handle that represents state that can be resumed. Empty if `resumable`=false.

    +

    New handle that represents state that can be resumed. Empty if `resumable`=false.

    @@ -117707,7 +116516,7 @@

    Submodules
    new_handle: Optional[str]
    -

    New handle that represents state that can be resumed. Empty if `resumable`=false.

    +

    New handle that represents state that can be resumed. Empty if `resumable`=false.

    @@ -117783,7 +116592,7 @@

    Submodules pydantic model genai.types.LiveServerToolCall

    Bases: BaseModel

    -

    Request for the client to execute the function_calls and return the responses with the matching `id`s.

    +

    Request for the client to execute the function_calls and return the responses with the matching `id`s.

    Create a new model by parsing and validating input data from keyword arguments.

    Raises [ValidationError][pydantic_core.ValidationError] if the input data cannot be validated to form a valid model.

    @@ -117883,7 +116692,7 @@

    Submodules pydantic model genai.types.LiveServerToolCallCancellation

    Bases: BaseModel

    -

    Notification for the client that a previously issued ToolCallMessage with the specified `id`s should have been not executed and should be cancelled.

    +

    Notification for the client that a previously issued ToolCallMessage with the specified `id`s should have been not executed and should be cancelled.

    If there were side-effects to those tool calls, clients may attempt to undo the tool calls. This message occurs only in cases where the clients interrupt server turns.

    @@ -117937,7 +116746,7 @@

    Submodules class genai.types.LiveServerToolCallCancellationDict

    Bases: TypedDict

    -

    Notification for the client that a previously issued ToolCallMessage with the specified `id`s should have been not executed and should be cancelled.

    +

    Notification for the client that a previously issued ToolCallMessage with the specified `id`s should have been not executed and should be cancelled.

    If there were side-effects to those tool calls, clients may attempt to undo the tool calls. This message occurs only in cases where the clients interrupt server turns.

    @@ -117953,7 +116762,7 @@

    Submodules class genai.types.LiveServerToolCallDict

    Bases: TypedDict

    -

    Request for the client to execute the function_calls and return the responses with the matching `id`s.

    +

    Request for the client to execute the function_calls and return the responses with the matching `id`s.

    function_calls: Optional[list[FunctionCallDict]]
    @@ -118914,6 +117723,297 @@

    Submodules +
    +pydantic model genai.types.Metric
    +

    Bases: BaseModel

    +

    The metric used for evaluation.

    +

    Create a new model by parsing and validating input data from keyword arguments.

    +

    Raises [ValidationError][pydantic_core.ValidationError] if the input data cannot be +validated to form a valid model.

    +

    self is explicitly positional-only to allow self as a field name.

    +

    +Show JSON schema
    {
    +   "title": "Metric",
    +   "type": "object",
    +   "properties": {
    +      "name": {
    +         "anyOf": [
    +            {
    +               "type": "string"
    +            },
    +            {
    +               "type": "null"
    +            }
    +         ],
    +         "default": null,
    +         "description": "The name of the metric.",
    +         "title": "Name"
    +      },
    +      "customFunction": {
    +         "default": null,
    +         "title": "Customfunction"
    +      },
    +      "promptTemplate": {
    +         "anyOf": [
    +            {
    +               "type": "string"
    +            },
    +            {
    +               "type": "null"
    +            }
    +         ],
    +         "default": null,
    +         "description": "The prompt template for the metric.",
    +         "title": "Prompttemplate"
    +      },
    +      "judgeModelSystemInstruction": {
    +         "anyOf": [
    +            {
    +               "type": "string"
    +            },
    +            {
    +               "type": "null"
    +            }
    +         ],
    +         "default": null,
    +         "description": "The system instruction for the judge model.",
    +         "title": "Judgemodelsysteminstruction"
    +      },
    +      "returnRawOutput": {
    +         "anyOf": [
    +            {
    +               "type": "boolean"
    +            },
    +            {
    +               "type": "null"
    +            }
    +         ],
    +         "default": null,
    +         "description": "Whether to return the raw output from the judge model.",
    +         "title": "Returnrawoutput"
    +      },
    +      "parseAndReduceFn": {
    +         "default": null,
    +         "title": "Parseandreducefn"
    +      },
    +      "aggregateSummaryFn": {
    +         "default": null,
    +         "title": "Aggregatesummaryfn"
    +      }
    +   },
    +   "additionalProperties": true
    +}
    +
    +
    +

    +
    Fields:
    +
    +
    +
    Validators:
    +
    +
    +
    +
    +
    +field aggregate_summary_fn: Optional[Callable[..., Any]] = None (alias 'aggregateSummaryFn')
    +

    The aggregate summary function for the judge model.

    +
    +
    Validated by:
    +
    +
    +
    +
    + +
    +
    +field custom_function: Optional[Callable[..., Any]] = None (alias 'customFunction')
    +

    The custom function that defines the end-to-end logic for metric computation.

    +
    +
    Validated by:
    +
    +
    +
    +
    + +
    +
    +field judge_model_system_instruction: Optional[str] = None (alias 'judgeModelSystemInstruction')
    +

    The system instruction for the judge model.

    +
    +
    Validated by:
    +
    +
    +
    +
    + +
    +
    +field name: Optional[str] = None
    +

    The name of the metric.

    +
    +
    Validated by:
    +
    +
    +
    +
    + +
    +
    +field parse_and_reduce_fn: Optional[Callable[..., Any]] = None (alias 'parseAndReduceFn')
    +

    The parse and reduce function for the judge model.

    +
    +
    Validated by:
    +
    +
    +
    +
    + +
    +
    +field prompt_template: Optional[str] = None (alias 'promptTemplate')
    +

    The prompt template for the metric.

    +
    +
    Validated by:
    +
    +
    +
    +
    + +
    +
    +field return_raw_output: Optional[bool] = None (alias 'returnRawOutput')
    +

    Whether to return the raw output from the judge model.

    +
    +
    Validated by:
    +
    +
    +
    +
    + +
    +
    +validator validate_name  »  all fields
    +
    +
    Return type:
    +

    Metric

    +
    +
    +
    + +
    +
    +model_post_init(context, /)
    +

    This function is meant to behave like a BaseModel method to initialise private attributes.

    +

    It takes context as an argument since that’s what pydantic-core passes when calling it.

    +
    +
    Return type:
    +

    None

    +
    +
    Parameters:
    +
      +
    • self – The BaseModel instance.

    • +
    • context – The context.

    • +
    +
    +
    +
    + +
    +
    +to_yaml_file(file_path, version=None)
    +

    Dumps the metric object to a YAML file.

    +
    +
    Return type:
    +

    None

    +
    +
    Parameters:
    +
      +
    • file_path – The path to the YAML file.

    • +
    • version – Optional version string to include in the YAML output.

    • +
    +
    +
    Raises:
    +

    ImportError – If the pyyaml library is not installed.

    +
    +
    +
    + +

    + +
    +
    +class genai.types.MetricDict
    +

    Bases: TypedDict

    +

    The metric used for evaluation.

    +
    +
    +aggregate_summary_fn: Optional[Callable[..., Any]]
    +

    The aggregate summary function for the judge model.

    +
    + +
    +
    +custom_function: Optional[Callable[..., Any]]
    +

    The custom function that defines the end-to-end logic for metric computation.

    +
    + +
    +
    +judge_model_system_instruction: Optional[str]
    +

    The system instruction for the judge model.

    +
    + +
    +
    +name: Optional[str]
    +

    The name of the metric.

    +
    + +
    +
    +parse_and_reduce_fn: Optional[Callable[..., Any]]
    +

    The parse and reduce function for the judge model.

    +
    + +
    +
    +prompt_template: Optional[str]
    +

    The prompt template for the metric.

    +
    + +
    +
    +return_raw_output: Optional[bool]
    +

    Whether to return the raw output from the judge model.

    +
    + +
    +
    class genai.types.Modality(*values)
    @@ -120445,6 +119545,276 @@

    Submodules +
    +pydantic model genai.types.OutputConfig
    +

    Bases: BaseModel

    +

    Config for evaluation output.

    +

    Create a new model by parsing and validating input data from keyword arguments.

    +

    Raises [ValidationError][pydantic_core.ValidationError] if the input data cannot be +validated to form a valid model.

    +

    self is explicitly positional-only to allow self as a field name.

    +

    +Show JSON schema
    {
    +   "title": "OutputConfig",
    +   "description": "Config for evaluation output.",
    +   "type": "object",
    +   "properties": {
    +      "gcsDestination": {
    +         "anyOf": [
    +            {
    +               "$ref": "#/$defs/GcsDestination"
    +            },
    +            {
    +               "type": "null"
    +            }
    +         ],
    +         "default": null,
    +         "description": "Cloud storage destination for evaluation output."
    +      }
    +   },
    +   "$defs": {
    +      "GcsDestination": {
    +         "additionalProperties": false,
    +         "description": "The Google Cloud Storage location where the output is to be written to.",
    +         "properties": {
    +            "outputUriPrefix": {
    +               "anyOf": [
    +                  {
    +                     "type": "string"
    +                  },
    +                  {
    +                     "type": "null"
    +                  }
    +               ],
    +               "default": null,
    +               "description": "Required. Google Cloud Storage URI to output directory. If the uri doesn't end with '/', a '/' will be automatically appended. The directory is created if it doesn't exist.",
    +               "title": "Outputuriprefix"
    +            }
    +         },
    +         "title": "GcsDestination",
    +         "type": "object"
    +      }
    +   },
    +   "additionalProperties": false
    +}
    +
    +
    +

    +
    Fields:
    +
    +
    +
    +
    +
    +field gcs_destination: Optional[GcsDestination] = None (alias 'gcsDestination')
    +

    Cloud storage destination for evaluation output.

    +
    + +

    + +
    +
    +class genai.types.OutputConfigDict
    +

    Bases: TypedDict

    +

    Config for evaluation output.

    +
    +
    +gcs_destination: Optional[GcsDestinationDict]
    +

    Cloud storage destination for evaluation output.

    +
    + +
    + +
    +
    +pydantic model genai.types.PairwiseMetricSpec
    +

    Bases: BaseModel

    +

    Spec for pairwise metric.

    +

    Create a new model by parsing and validating input data from keyword arguments.

    +

    Raises [ValidationError][pydantic_core.ValidationError] if the input data cannot be +validated to form a valid model.

    +

    self is explicitly positional-only to allow self as a field name.

    +

    +Show JSON schema
    {
    +   "title": "PairwiseMetricSpec",
    +   "description": "Spec for pairwise metric.",
    +   "type": "object",
    +   "properties": {
    +      "metricPromptTemplate": {
    +         "anyOf": [
    +            {
    +               "type": "string"
    +            },
    +            {
    +               "type": "null"
    +            }
    +         ],
    +         "default": null,
    +         "description": "Required. Metric prompt template for pairwise metric.",
    +         "title": "Metricprompttemplate"
    +      },
    +      "baselineResponseFieldName": {
    +         "anyOf": [
    +            {
    +               "type": "string"
    +            },
    +            {
    +               "type": "null"
    +            }
    +         ],
    +         "default": null,
    +         "description": "Optional. The field name of the baseline response.",
    +         "title": "Baselineresponsefieldname"
    +      },
    +      "candidateResponseFieldName": {
    +         "anyOf": [
    +            {
    +               "type": "string"
    +            },
    +            {
    +               "type": "null"
    +            }
    +         ],
    +         "default": null,
    +         "description": "Optional. The field name of the candidate response.",
    +         "title": "Candidateresponsefieldname"
    +      },
    +      "customOutputFormatConfig": {
    +         "anyOf": [
    +            {
    +               "$ref": "#/$defs/CustomOutputFormatConfig"
    +            },
    +            {
    +               "type": "null"
    +            }
    +         ],
    +         "default": null,
    +         "description": "Optional. CustomOutputFormatConfig allows customization of metric output. When this config is set, the default output is replaced with the raw output string. If a custom format is chosen, the `pairwise_choice` and `explanation` fields in the corresponding metric result will be empty."
    +      },
    +      "systemInstruction": {
    +         "anyOf": [
    +            {
    +               "type": "string"
    +            },
    +            {
    +               "type": "null"
    +            }
    +         ],
    +         "default": null,
    +         "description": "Optional. System instructions for pairwise metric.",
    +         "title": "Systeminstruction"
    +      }
    +   },
    +   "$defs": {
    +      "CustomOutputFormatConfig": {
    +         "additionalProperties": false,
    +         "description": "Config for custom output format.",
    +         "properties": {
    +            "returnRawOutput": {
    +               "anyOf": [
    +                  {
    +                     "type": "boolean"
    +                  },
    +                  {
    +                     "type": "null"
    +                  }
    +               ],
    +               "default": null,
    +               "description": "Optional. Whether to return raw output.",
    +               "title": "Returnrawoutput"
    +            }
    +         },
    +         "title": "CustomOutputFormatConfig",
    +         "type": "object"
    +      }
    +   },
    +   "additionalProperties": false
    +}
    +
    +
    +

    +
    Fields:
    +
    +
    +
    +
    +
    +field baseline_response_field_name: Optional[str] = None (alias 'baselineResponseFieldName')
    +

    Optional. The field name of the baseline response.

    +
    + +
    +
    +field candidate_response_field_name: Optional[str] = None (alias 'candidateResponseFieldName')
    +

    Optional. The field name of the candidate response.

    +
    + +
    +
    +field custom_output_format_config: Optional[CustomOutputFormatConfig] = None (alias 'customOutputFormatConfig')
    +

    Optional. CustomOutputFormatConfig allows customization of metric output. When this config is set, the default output is replaced with the raw output string. If a custom format is chosen, the pairwise_choice and explanation fields in the corresponding metric result will be empty.

    +
    + +
    +
    +field metric_prompt_template: Optional[str] = None (alias 'metricPromptTemplate')
    +

    Required. Metric prompt template for pairwise metric.

    +
    + +
    +
    +field system_instruction: Optional[str] = None (alias 'systemInstruction')
    +

    Optional. System instructions for pairwise metric.

    +
    + +
    + +
    +
    +class genai.types.PairwiseMetricSpecDict
    +

    Bases: TypedDict

    +

    Spec for pairwise metric.

    +
    +
    +baseline_response_field_name: Optional[str]
    +

    Optional. The field name of the baseline response.

    +
    + +
    +
    +candidate_response_field_name: Optional[str]
    +

    Optional. The field name of the candidate response.

    +
    + +
    +
    +custom_output_format_config: Optional[CustomOutputFormatConfigDict]
    +

    Optional. CustomOutputFormatConfig allows customization of metric output. When this config is set, the default output is replaced with the raw output string. If a custom format is chosen, the pairwise_choice and explanation fields in the corresponding metric result will be empty.

    +
    + +
    +
    +metric_prompt_template: Optional[str]
    +

    Required. Metric prompt template for pairwise metric.

    +
    + +
    +
    +system_instruction: Optional[str]
    +

    Optional. System instructions for pairwise metric.

    +
    + +
    +
    pydantic model genai.types.Part
    @@ -121316,6 +120686,148 @@

    Submodules +
    +pydantic model genai.types.PointwiseMetricSpec
    +

    Bases: BaseModel

    +

    Spec for pointwise metric.

    +

    Create a new model by parsing and validating input data from keyword arguments.

    +

    Raises [ValidationError][pydantic_core.ValidationError] if the input data cannot be +validated to form a valid model.

    +

    self is explicitly positional-only to allow self as a field name.

    +

    +Show JSON schema
    {
    +   "title": "PointwiseMetricSpec",
    +   "description": "Spec for pointwise metric.",
    +   "type": "object",
    +   "properties": {
    +      "metricPromptTemplate": {
    +         "anyOf": [
    +            {
    +               "type": "string"
    +            },
    +            {
    +               "type": "null"
    +            }
    +         ],
    +         "default": null,
    +         "description": "Required. Metric prompt template for pointwise metric.",
    +         "title": "Metricprompttemplate"
    +      },
    +      "customOutputFormatConfig": {
    +         "anyOf": [
    +            {
    +               "$ref": "#/$defs/CustomOutputFormatConfig"
    +            },
    +            {
    +               "type": "null"
    +            }
    +         ],
    +         "default": null,
    +         "description": "Optional. CustomOutputFormatConfig allows customization of metric output. By default, metrics return a score and explanation. When this config is set, the default output is replaced with either: - The raw output string. - A parsed output based on a user-defined schema. If a custom format is chosen, the `score` and `explanation` fields in the corresponding metric result will be empty."
    +      },
    +      "systemInstruction": {
    +         "anyOf": [
    +            {
    +               "type": "string"
    +            },
    +            {
    +               "type": "null"
    +            }
    +         ],
    +         "default": null,
    +         "description": "Optional. System instructions for pointwise metric.",
    +         "title": "Systeminstruction"
    +      }
    +   },
    +   "$defs": {
    +      "CustomOutputFormatConfig": {
    +         "additionalProperties": false,
    +         "description": "Config for custom output format.",
    +         "properties": {
    +            "returnRawOutput": {
    +               "anyOf": [
    +                  {
    +                     "type": "boolean"
    +                  },
    +                  {
    +                     "type": "null"
    +                  }
    +               ],
    +               "default": null,
    +               "description": "Optional. Whether to return raw output.",
    +               "title": "Returnrawoutput"
    +            }
    +         },
    +         "title": "CustomOutputFormatConfig",
    +         "type": "object"
    +      }
    +   },
    +   "additionalProperties": false
    +}
    +
    +
    +

    +
    Fields:
    +
    +
    +
    +
    +
    +field custom_output_format_config: Optional[CustomOutputFormatConfig] = None (alias 'customOutputFormatConfig')
    +

    Optional. CustomOutputFormatConfig allows customization of metric output. By default, metrics return a score and explanation. When this config is set, the default output is replaced with either: - The raw output string. - A parsed output based on a user-defined schema. If a custom format is chosen, the score and explanation fields in the corresponding metric result will be empty.

    +
    + +
    +
    +field metric_prompt_template: Optional[str] = None (alias 'metricPromptTemplate')
    +

    Required. Metric prompt template for pointwise metric.

    +
    + +
    +
    +field system_instruction: Optional[str] = None (alias 'systemInstruction')
    +

    Optional. System instructions for pointwise metric.

    +
    + +

    + +
    +
    +class genai.types.PointwiseMetricSpecDict
    +

    Bases: TypedDict

    +

    Spec for pointwise metric.

    +
    +
    +custom_output_format_config: Optional[CustomOutputFormatConfigDict]
    +
      +
    • The raw output string. - A parsed output based on a user-defined schema. If a custom format is chosen, the score and explanation fields in the corresponding metric result will be empty.

    • +
    +
    +
    Type:
    +

    Optional. CustomOutputFormatConfig allows customization of metric output. By default, metrics return a score and explanation. When this config is set, the default output is replaced with either

    +
    +
    +
    + +
    +
    +metric_prompt_template: Optional[str]
    +

    Required. Metric prompt template for pointwise metric.

    +
    + +
    +
    +system_instruction: Optional[str]
    +

    Optional. System instructions for pointwise metric.

    +
    + +
    +
    pydantic model genai.types.PreTunedModel
    @@ -122504,347 +122016,6 @@

    Submodules -
    -pydantic model genai.types.PreferenceOptimizationHyperParameters
    -

    Bases: BaseModel

    -

    Hyperparameters for Preference Optimization.

    -

    Create a new model by parsing and validating input data from keyword arguments.

    -

    Raises [ValidationError][pydantic_core.ValidationError] if the input data cannot be -validated to form a valid model.

    -

    self is explicitly positional-only to allow self as a field name.

    -

    -Show JSON schema
    {
    -   "title": "PreferenceOptimizationHyperParameters",
    -   "description": "Hyperparameters for Preference Optimization.",
    -   "type": "object",
    -   "properties": {
    -      "adapterSize": {
    -         "anyOf": [
    -            {
    -               "$ref": "#/$defs/AdapterSize"
    -            },
    -            {
    -               "type": "null"
    -            }
    -         ],
    -         "default": null,
    -         "description": "Optional. Adapter size for preference optimization."
    -      },
    -      "beta": {
    -         "anyOf": [
    -            {
    -               "type": "number"
    -            },
    -            {
    -               "type": "null"
    -            }
    -         ],
    -         "default": null,
    -         "description": "Optional. Weight for KL Divergence regularization.",
    -         "title": "Beta"
    -      },
    -      "epochCount": {
    -         "anyOf": [
    -            {
    -               "type": "integer"
    -            },
    -            {
    -               "type": "null"
    -            }
    -         ],
    -         "default": null,
    -         "description": "Optional. Number of complete passes the model makes over the entire training dataset during training.",
    -         "title": "Epochcount"
    -      },
    -      "learningRateMultiplier": {
    -         "anyOf": [
    -            {
    -               "type": "number"
    -            },
    -            {
    -               "type": "null"
    -            }
    -         ],
    -         "default": null,
    -         "description": "Optional. Multiplier for adjusting the default learning rate.",
    -         "title": "Learningratemultiplier"
    -      }
    -   },
    -   "$defs": {
    -      "AdapterSize": {
    -         "description": "Optional. Adapter size for tuning.",
    -         "enum": [
    -            "ADAPTER_SIZE_UNSPECIFIED",
    -            "ADAPTER_SIZE_ONE",
    -            "ADAPTER_SIZE_TWO",
    -            "ADAPTER_SIZE_FOUR",
    -            "ADAPTER_SIZE_EIGHT",
    -            "ADAPTER_SIZE_SIXTEEN",
    -            "ADAPTER_SIZE_THIRTY_TWO"
    -         ],
    -         "title": "AdapterSize",
    -         "type": "string"
    -      }
    -   },
    -   "additionalProperties": false
    -}
    -
    -
    -

    -
    Fields:
    -
    -
    -
    -
    -
    -field adapter_size: Optional[AdapterSize] = None (alias 'adapterSize')
    -

    Optional. Adapter size for preference optimization.

    -
    - -
    -
    -field beta: Optional[float] = None
    -

    Optional. Weight for KL Divergence regularization.

    -
    - -
    -
    -field epoch_count: Optional[int] = None (alias 'epochCount')
    -

    Optional. Number of complete passes the model makes over the entire training dataset during training.

    -
    - -
    -
    -field learning_rate_multiplier: Optional[float] = None (alias 'learningRateMultiplier')
    -

    Optional. Multiplier for adjusting the default learning rate.

    -
    - -

    - -
    -
    -class genai.types.PreferenceOptimizationHyperParametersDict
    -

    Bases: TypedDict

    -

    Hyperparameters for Preference Optimization.

    -
    -
    -adapter_size: Optional[AdapterSize]
    -

    Optional. Adapter size for preference optimization.

    -
    - -
    -
    -beta: Optional[float]
    -

    Optional. Weight for KL Divergence regularization.

    -
    - -
    -
    -epoch_count: Optional[int]
    -

    Optional. Number of complete passes the model makes over the entire training dataset during training.

    -
    - -
    -
    -learning_rate_multiplier: Optional[float]
    -

    Optional. Multiplier for adjusting the default learning rate.

    -
    - -
    - -
    -
    -pydantic model genai.types.PreferenceOptimizationSpec
    -

    Bases: BaseModel

    -

    Tuning Spec for Preference Optimization.

    -

    Create a new model by parsing and validating input data from keyword arguments.

    -

    Raises [ValidationError][pydantic_core.ValidationError] if the input data cannot be -validated to form a valid model.

    -

    self is explicitly positional-only to allow self as a field name.

    -

    -Show JSON schema
    {
    -   "title": "PreferenceOptimizationSpec",
    -   "description": "Tuning Spec for Preference Optimization.",
    -   "type": "object",
    -   "properties": {
    -      "hyperParameters": {
    -         "anyOf": [
    -            {
    -               "$ref": "#/$defs/PreferenceOptimizationHyperParameters"
    -            },
    -            {
    -               "type": "null"
    -            }
    -         ],
    -         "default": null,
    -         "description": "Optional. Hyperparameters for Preference Optimization."
    -      },
    -      "trainingDatasetUri": {
    -         "anyOf": [
    -            {
    -               "type": "string"
    -            },
    -            {
    -               "type": "null"
    -            }
    -         ],
    -         "default": null,
    -         "description": "Required. Cloud Storage path to file containing training dataset for preference optimization tuning. The dataset must be formatted as a JSONL file.",
    -         "title": "Trainingdataseturi"
    -      },
    -      "validationDatasetUri": {
    -         "anyOf": [
    -            {
    -               "type": "string"
    -            },
    -            {
    -               "type": "null"
    -            }
    -         ],
    -         "default": null,
    -         "description": "Optional. Cloud Storage path to file containing validation dataset for preference optimization tuning. The dataset must be formatted as a JSONL file.",
    -         "title": "Validationdataseturi"
    -      }
    -   },
    -   "$defs": {
    -      "AdapterSize": {
    -         "description": "Optional. Adapter size for tuning.",
    -         "enum": [
    -            "ADAPTER_SIZE_UNSPECIFIED",
    -            "ADAPTER_SIZE_ONE",
    -            "ADAPTER_SIZE_TWO",
    -            "ADAPTER_SIZE_FOUR",
    -            "ADAPTER_SIZE_EIGHT",
    -            "ADAPTER_SIZE_SIXTEEN",
    -            "ADAPTER_SIZE_THIRTY_TWO"
    -         ],
    -         "title": "AdapterSize",
    -         "type": "string"
    -      },
    -      "PreferenceOptimizationHyperParameters": {
    -         "additionalProperties": false,
    -         "description": "Hyperparameters for Preference Optimization.",
    -         "properties": {
    -            "adapterSize": {
    -               "anyOf": [
    -                  {
    -                     "$ref": "#/$defs/AdapterSize"
    -                  },
    -                  {
    -                     "type": "null"
    -                  }
    -               ],
    -               "default": null,
    -               "description": "Optional. Adapter size for preference optimization."
    -            },
    -            "beta": {
    -               "anyOf": [
    -                  {
    -                     "type": "number"
    -                  },
    -                  {
    -                     "type": "null"
    -                  }
    -               ],
    -               "default": null,
    -               "description": "Optional. Weight for KL Divergence regularization.",
    -               "title": "Beta"
    -            },
    -            "epochCount": {
    -               "anyOf": [
    -                  {
    -                     "type": "integer"
    -                  },
    -                  {
    -                     "type": "null"
    -                  }
    -               ],
    -               "default": null,
    -               "description": "Optional. Number of complete passes the model makes over the entire training dataset during training.",
    -               "title": "Epochcount"
    -            },
    -            "learningRateMultiplier": {
    -               "anyOf": [
    -                  {
    -                     "type": "number"
    -                  },
    -                  {
    -                     "type": "null"
    -                  }
    -               ],
    -               "default": null,
    -               "description": "Optional. Multiplier for adjusting the default learning rate.",
    -               "title": "Learningratemultiplier"
    -            }
    -         },
    -         "title": "PreferenceOptimizationHyperParameters",
    -         "type": "object"
    -      }
    -   },
    -   "additionalProperties": false
    -}
    -
    -
    -

    -
    Fields:
    -
    -
    -
    -
    -
    -field hyper_parameters: Optional[PreferenceOptimizationHyperParameters] = None (alias 'hyperParameters')
    -

    Optional. Hyperparameters for Preference Optimization.

    -
    - -
    -
    -field training_dataset_uri: Optional[str] = None (alias 'trainingDatasetUri')
    -

    Required. Cloud Storage path to file containing training dataset for preference optimization tuning. The dataset must be formatted as a JSONL file.

    -
    - -
    -
    -field validation_dataset_uri: Optional[str] = None (alias 'validationDatasetUri')
    -

    Optional. Cloud Storage path to file containing validation dataset for preference optimization tuning. The dataset must be formatted as a JSONL file.

    -
    - -
    - -
    -
    -class genai.types.PreferenceOptimizationSpecDict
    -

    Bases: TypedDict

    -

    Tuning Spec for Preference Optimization.

    -
    -
    -hyper_parameters: Optional[PreferenceOptimizationHyperParametersDict]
    -

    Optional. Hyperparameters for Preference Optimization.

    -
    - -
    -
    -training_dataset_uri: Optional[str]
    -

    Required. Cloud Storage path to file containing training dataset for preference optimization tuning. The dataset must be formatted as a JSONL file.

    -
    - -
    -
    -validation_dataset_uri: Optional[str]
    -

    Optional. Cloud Storage path to file containing validation dataset for preference optimization tuning. The dataset must be formatted as a JSONL file.

    -
    - -
    -
    pydantic model genai.types.ProactivityConfig
    @@ -127235,6 +126406,119 @@

    Submodules +
    +pydantic model genai.types.RougeSpec
    +

    Bases: BaseModel

    +

    Spec for rouge metric.

    +

    Create a new model by parsing and validating input data from keyword arguments.

    +

    Raises [ValidationError][pydantic_core.ValidationError] if the input data cannot be +validated to form a valid model.

    +

    self is explicitly positional-only to allow self as a field name.

    +

    +Show JSON schema
    {
    +   "title": "RougeSpec",
    +   "description": "Spec for rouge metric.",
    +   "type": "object",
    +   "properties": {
    +      "rougeType": {
    +         "anyOf": [
    +            {
    +               "type": "string"
    +            },
    +            {
    +               "type": "null"
    +            }
    +         ],
    +         "default": null,
    +         "description": "Optional. Supported rouge types are rougen[1-9], rougeL, and rougeLsum.",
    +         "title": "Rougetype"
    +      },
    +      "splitSummaries": {
    +         "anyOf": [
    +            {
    +               "type": "boolean"
    +            },
    +            {
    +               "type": "null"
    +            }
    +         ],
    +         "default": null,
    +         "description": "Optional. Whether to split summaries while using rougeLsum.",
    +         "title": "Splitsummaries"
    +      },
    +      "useStemmer": {
    +         "anyOf": [
    +            {
    +               "type": "boolean"
    +            },
    +            {
    +               "type": "null"
    +            }
    +         ],
    +         "default": null,
    +         "description": "Optional. Whether to use stemmer to compute rouge score.",
    +         "title": "Usestemmer"
    +      }
    +   },
    +   "additionalProperties": false
    +}
    +
    +
    +

    +
    Fields:
    +
    +
    +
    +
    +
    +field rouge_type: Optional[str] = None (alias 'rougeType')
    +

    Optional. Supported rouge types are rougen[1-9], rougeL, and rougeLsum.

    +
    + +
    +
    +field split_summaries: Optional[bool] = None (alias 'splitSummaries')
    +

    Optional. Whether to split summaries while using rougeLsum.

    +
    + +
    +
    +field use_stemmer: Optional[bool] = None (alias 'useStemmer')
    +

    Optional. Whether to use stemmer to compute rouge score.

    +
    + +

    + +
    +
    +class genai.types.RougeSpecDict
    +

    Bases: TypedDict

    +

    Spec for rouge metric.

    +
    +
    +rouge_type: Optional[str]
    +

    Optional. Supported rouge types are rougen[1-9], rougeL, and rougeLsum.

    +
    + +
    +
    +split_summaries: Optional[bool]
    +

    Optional. Whether to split summaries while using rougeLsum.

    +
    + +
    +
    +use_stemmer: Optional[bool]
    +

    Optional. Whether to use stemmer to compute rouge score.

    +
    + +
    +
    pydantic model genai.types.SafetyAttributes
    @@ -128671,6 +127955,116 @@

    Submodules +
    +pydantic model genai.types.ScribbleImage
    +

    Bases: BaseModel

    +

    An image mask representing a brush scribble.

    +

    Create a new model by parsing and validating input data from keyword arguments.

    +

    Raises [ValidationError][pydantic_core.ValidationError] if the input data cannot be +validated to form a valid model.

    +

    self is explicitly positional-only to allow self as a field name.

    +

    +Show JSON schema
    {
    +   "title": "ScribbleImage",
    +   "description": "An image mask representing a brush scribble.",
    +   "type": "object",
    +   "properties": {
    +      "image": {
    +         "anyOf": [
    +            {
    +               "$ref": "#/$defs/Image"
    +            },
    +            {
    +               "type": "null"
    +            }
    +         ],
    +         "default": null,
    +         "description": "The brush scribble to guide segmentation. Valid for the interactive mode."
    +      }
    +   },
    +   "$defs": {
    +      "Image": {
    +         "additionalProperties": false,
    +         "description": "An image.",
    +         "properties": {
    +            "gcsUri": {
    +               "anyOf": [
    +                  {
    +                     "type": "string"
    +                  },
    +                  {
    +                     "type": "null"
    +                  }
    +               ],
    +               "default": null,
    +               "description": "The Cloud Storage URI of the image. ``Image`` can contain a value\n      for this field or the ``image_bytes`` field but not both.\n      ",
    +               "title": "Gcsuri"
    +            },
    +            "imageBytes": {
    +               "anyOf": [
    +                  {
    +                     "format": "base64url",
    +                     "type": "string"
    +                  },
    +                  {
    +                     "type": "null"
    +                  }
    +               ],
    +               "default": null,
    +               "description": "The image bytes data. ``Image`` can contain a value for this field\n      or the ``gcs_uri`` field but not both.\n      ",
    +               "title": "Imagebytes"
    +            },
    +            "mimeType": {
    +               "anyOf": [
    +                  {
    +                     "type": "string"
    +                  },
    +                  {
    +                     "type": "null"
    +                  }
    +               ],
    +               "default": null,
    +               "description": "The MIME type of the image.",
    +               "title": "Mimetype"
    +            }
    +         },
    +         "title": "Image",
    +         "type": "object"
    +      }
    +   },
    +   "additionalProperties": false
    +}
    +
    +
    +

    +
    Fields:
    +
    +
    +
    +
    +
    +field image: Optional[Image] = None
    +

    The brush scribble to guide segmentation. Valid for the interactive mode.

    +
    + +

    + +
    +
    +class genai.types.ScribbleImageDict
    +

    Bases: TypedDict

    +

    An image mask representing a brush scribble.

    +
    +
    +image: Optional[ImageDict]
    +

    The brush scribble to guide segmentation. Valid for the interactive mode.

    +
    + +
    +
    pydantic model genai.types.SearchEntryPoint
    @@ -128898,6 +128292,827 @@

    Submodules +
    +pydantic model genai.types.SegmentImageConfig
    +

    Bases: BaseModel

    +

    Configuration for segmenting an image.

    +

    Create a new model by parsing and validating input data from keyword arguments.

    +

    Raises [ValidationError][pydantic_core.ValidationError] if the input data cannot be +validated to form a valid model.

    +

    self is explicitly positional-only to allow self as a field name.

    +

    +Show JSON schema
    {
    +   "title": "SegmentImageConfig",
    +   "description": "Configuration for segmenting an image.",
    +   "type": "object",
    +   "properties": {
    +      "httpOptions": {
    +         "anyOf": [
    +            {
    +               "$ref": "#/$defs/HttpOptions"
    +            },
    +            {
    +               "type": "null"
    +            }
    +         ],
    +         "default": null,
    +         "description": "Used to override HTTP request options."
    +      },
    +      "mode": {
    +         "anyOf": [
    +            {
    +               "$ref": "#/$defs/SegmentMode"
    +            },
    +            {
    +               "type": "null"
    +            }
    +         ],
    +         "default": null,
    +         "description": "The segmentation mode to use."
    +      },
    +      "maxPredictions": {
    +         "anyOf": [
    +            {
    +               "type": "integer"
    +            },
    +            {
    +               "type": "null"
    +            }
    +         ],
    +         "default": null,
    +         "description": "The maximum number of predictions to return up to, by top\n      confidence score.",
    +         "title": "Maxpredictions"
    +      },
    +      "confidenceThreshold": {
    +         "anyOf": [
    +            {
    +               "type": "number"
    +            },
    +            {
    +               "type": "null"
    +            }
    +         ],
    +         "default": null,
    +         "description": "The confidence score threshold for the detections as a decimal\n      value. Only predictions with a confidence score higher than this\n      threshold will be returned.",
    +         "title": "Confidencethreshold"
    +      },
    +      "maskDilation": {
    +         "anyOf": [
    +            {
    +               "type": "number"
    +            },
    +            {
    +               "type": "null"
    +            }
    +         ],
    +         "default": null,
    +         "description": "A decimal value representing how much dilation to apply to the\n      masks. 0 for no dilation. 1.0 means the masked area covers the whole\n      image.",
    +         "title": "Maskdilation"
    +      },
    +      "binaryColorThreshold": {
    +         "anyOf": [
    +            {
    +               "type": "number"
    +            },
    +            {
    +               "type": "null"
    +            }
    +         ],
    +         "default": null,
    +         "description": "The binary color threshold to apply to the masks. The threshold\n      can be set to a decimal value between 0 and 255 non-inclusive.\n      Set to -1 for no binary color thresholding.",
    +         "title": "Binarycolorthreshold"
    +      }
    +   },
    +   "$defs": {
    +      "HttpOptions": {
    +         "additionalProperties": false,
    +         "description": "HTTP options to be used in each of the requests.",
    +         "properties": {
    +            "baseUrl": {
    +               "anyOf": [
    +                  {
    +                     "type": "string"
    +                  },
    +                  {
    +                     "type": "null"
    +                  }
    +               ],
    +               "default": null,
    +               "description": "The base URL for the AI platform service endpoint.",
    +               "title": "Baseurl"
    +            },
    +            "apiVersion": {
    +               "anyOf": [
    +                  {
    +                     "type": "string"
    +                  },
    +                  {
    +                     "type": "null"
    +                  }
    +               ],
    +               "default": null,
    +               "description": "Specifies the version of the API to use.",
    +               "title": "Apiversion"
    +            },
    +            "headers": {
    +               "anyOf": [
    +                  {
    +                     "additionalProperties": {
    +                        "type": "string"
    +                     },
    +                     "type": "object"
    +                  },
    +                  {
    +                     "type": "null"
    +                  }
    +               ],
    +               "default": null,
    +               "description": "Additional HTTP headers to be sent with the request.",
    +               "title": "Headers"
    +            },
    +            "timeout": {
    +               "anyOf": [
    +                  {
    +                     "type": "integer"
    +                  },
    +                  {
    +                     "type": "null"
    +                  }
    +               ],
    +               "default": null,
    +               "description": "Timeout for the request in milliseconds.",
    +               "title": "Timeout"
    +            },
    +            "clientArgs": {
    +               "anyOf": [
    +                  {
    +                     "type": "object"
    +                  },
    +                  {
    +                     "type": "null"
    +                  }
    +               ],
    +               "default": null,
    +               "description": "Args passed to the HTTP client.",
    +               "title": "Clientargs"
    +            },
    +            "asyncClientArgs": {
    +               "anyOf": [
    +                  {
    +                     "type": "object"
    +                  },
    +                  {
    +                     "type": "null"
    +                  }
    +               ],
    +               "default": null,
    +               "description": "Args passed to the async HTTP client.",
    +               "title": "Asyncclientargs"
    +            },
    +            "extraBody": {
    +               "anyOf": [
    +                  {
    +                     "type": "object"
    +                  },
    +                  {
    +                     "type": "null"
    +                  }
    +               ],
    +               "default": null,
    +               "description": "Extra parameters to add to the request body.\n      The structure must match the backend API's request structure.\n      - VertexAI backend API docs: https://cloud.google.com/vertex-ai/docs/reference/rest\n      - GeminiAPI backend API docs: https://ai.google.dev/api/rest",
    +               "title": "Extrabody"
    +            },
    +            "retryOptions": {
    +               "anyOf": [
    +                  {
    +                     "$ref": "#/$defs/HttpRetryOptions"
    +                  },
    +                  {
    +                     "type": "null"
    +                  }
    +               ],
    +               "default": null,
    +               "description": "HTTP retry options for the request."
    +            }
    +         },
    +         "title": "HttpOptions",
    +         "type": "object"
    +      },
    +      "HttpRetryOptions": {
    +         "additionalProperties": false,
    +         "description": "HTTP retry options to be used in each of the requests.",
    +         "properties": {
    +            "attempts": {
    +               "anyOf": [
    +                  {
    +                     "type": "integer"
    +                  },
    +                  {
    +                     "type": "null"
    +                  }
    +               ],
    +               "default": null,
    +               "description": "Maximum number of attempts, including the original request.\n      If 0 or 1, it means no retries.",
    +               "title": "Attempts"
    +            },
    +            "initialDelay": {
    +               "anyOf": [
    +                  {
    +                     "type": "number"
    +                  },
    +                  {
    +                     "type": "null"
    +                  }
    +               ],
    +               "default": null,
    +               "description": "Initial delay before the first retry, in fractions of a second.",
    +               "title": "Initialdelay"
    +            },
    +            "maxDelay": {
    +               "anyOf": [
    +                  {
    +                     "type": "number"
    +                  },
    +                  {
    +                     "type": "null"
    +                  }
    +               ],
    +               "default": null,
    +               "description": "Maximum delay between retries, in fractions of a second.",
    +               "title": "Maxdelay"
    +            },
    +            "expBase": {
    +               "anyOf": [
    +                  {
    +                     "type": "number"
    +                  },
    +                  {
    +                     "type": "null"
    +                  }
    +               ],
    +               "default": null,
    +               "description": "Multiplier by which the delay increases after each attempt.",
    +               "title": "Expbase"
    +            },
    +            "jitter": {
    +               "anyOf": [
    +                  {
    +                     "type": "number"
    +                  },
    +                  {
    +                     "type": "null"
    +                  }
    +               ],
    +               "default": null,
    +               "description": "Randomness factor for the delay.",
    +               "title": "Jitter"
    +            },
    +            "httpStatusCodes": {
    +               "anyOf": [
    +                  {
    +                     "items": {
    +                        "type": "integer"
    +                     },
    +                     "type": "array"
    +                  },
    +                  {
    +                     "type": "null"
    +                  }
    +               ],
    +               "default": null,
    +               "description": "List of HTTP status codes that should trigger a retry.\n      If not specified, a default set of retryable codes may be used.",
    +               "title": "Httpstatuscodes"
    +            }
    +         },
    +         "title": "HttpRetryOptions",
    +         "type": "object"
    +      },
    +      "SegmentMode": {
    +         "description": "Enum that represents the segmentation mode.",
    +         "enum": [
    +            "FOREGROUND",
    +            "BACKGROUND",
    +            "PROMPT",
    +            "SEMANTIC",
    +            "INTERACTIVE"
    +         ],
    +         "title": "SegmentMode",
    +         "type": "string"
    +      }
    +   },
    +   "additionalProperties": false
    +}
    +
    +
    +

    +
    Fields:
    +
    +
    +
    +
    +
    +field binary_color_threshold: Optional[float] = None (alias 'binaryColorThreshold')
    +

    The binary color threshold to apply to the masks. The threshold +can be set to a decimal value between 0 and 255 non-inclusive. +Set to -1 for no binary color thresholding.

    +
    + +
    +
    +field confidence_threshold: Optional[float] = None (alias 'confidenceThreshold')
    +

    The confidence score threshold for the detections as a decimal +value. Only predictions with a confidence score higher than this +threshold will be returned.

    +
    + +
    +
    +field http_options: Optional[HttpOptions] = None (alias 'httpOptions')
    +

    Used to override HTTP request options.

    +
    + +
    +
    +field mask_dilation: Optional[float] = None (alias 'maskDilation')
    +

    A decimal value representing how much dilation to apply to the +masks. 0 for no dilation. 1.0 means the masked area covers the whole +image.

    +
    + +
    +
    +field max_predictions: Optional[int] = None (alias 'maxPredictions')
    +

    The maximum number of predictions to return up to, by top +confidence score.

    +
    + +
    +
    +field mode: Optional[SegmentMode] = None
    +

    The segmentation mode to use.

    +
    + +

    + +
    +
    +class genai.types.SegmentImageConfigDict
    +

    Bases: TypedDict

    +

    Configuration for segmenting an image.

    +
    +
    +binary_color_threshold: Optional[float]
    +

    The binary color threshold to apply to the masks. The threshold +can be set to a decimal value between 0 and 255 non-inclusive. +Set to -1 for no binary color thresholding.

    +
    + +
    +
    +confidence_threshold: Optional[float]
    +

    The confidence score threshold for the detections as a decimal +value. Only predictions with a confidence score higher than this +threshold will be returned.

    +
    + +
    +
    +http_options: Optional[HttpOptionsDict]
    +

    Used to override HTTP request options.

    +
    + +
    +
    +mask_dilation: Optional[float]
    +

    A decimal value representing how much dilation to apply to the +masks. 0 for no dilation. 1.0 means the masked area covers the whole +image.

    +
    + +
    +
    +max_predictions: Optional[int]
    +

    The maximum number of predictions to return up to, by top +confidence score.

    +
    + +
    +
    +mode: Optional[SegmentMode]
    +

    The segmentation mode to use.

    +
    + +
    + +
    +
    +pydantic model genai.types.SegmentImageResponse
    +

    Bases: BaseModel

    +

    The output images response.

    +

    Create a new model by parsing and validating input data from keyword arguments.

    +

    Raises [ValidationError][pydantic_core.ValidationError] if the input data cannot be +validated to form a valid model.

    +

    self is explicitly positional-only to allow self as a field name.

    +

    +Show JSON schema
    {
    +   "title": "SegmentImageResponse",
    +   "description": "The output images response.",
    +   "type": "object",
    +   "properties": {
    +      "generatedMasks": {
    +         "anyOf": [
    +            {
    +               "items": {
    +                  "$ref": "#/$defs/GeneratedImageMask"
    +               },
    +               "type": "array"
    +            },
    +            {
    +               "type": "null"
    +            }
    +         ],
    +         "default": null,
    +         "description": "List of generated image masks.\n      ",
    +         "title": "Generatedmasks"
    +      }
    +   },
    +   "$defs": {
    +      "EntityLabel": {
    +         "additionalProperties": false,
    +         "description": "An entity representing the segmented area.",
    +         "properties": {
    +            "label": {
    +               "anyOf": [
    +                  {
    +                     "type": "string"
    +                  },
    +                  {
    +                     "type": "null"
    +                  }
    +               ],
    +               "default": null,
    +               "description": "The label of the segmented entity.",
    +               "title": "Label"
    +            },
    +            "score": {
    +               "anyOf": [
    +                  {
    +                     "type": "number"
    +                  },
    +                  {
    +                     "type": "null"
    +                  }
    +               ],
    +               "default": null,
    +               "description": "The confidence score of the detected label.",
    +               "title": "Score"
    +            }
    +         },
    +         "title": "EntityLabel",
    +         "type": "object"
    +      },
    +      "GeneratedImageMask": {
    +         "additionalProperties": false,
    +         "description": "A generated image mask.",
    +         "properties": {
    +            "mask": {
    +               "anyOf": [
    +                  {
    +                     "$ref": "#/$defs/Image"
    +                  },
    +                  {
    +                     "type": "null"
    +                  }
    +               ],
    +               "default": null,
    +               "description": "The generated image mask."
    +            },
    +            "labels": {
    +               "anyOf": [
    +                  {
    +                     "items": {
    +                        "$ref": "#/$defs/EntityLabel"
    +                     },
    +                     "type": "array"
    +                  },
    +                  {
    +                     "type": "null"
    +                  }
    +               ],
    +               "default": null,
    +               "description": "The detected entities on the segmented area.",
    +               "title": "Labels"
    +            }
    +         },
    +         "title": "GeneratedImageMask",
    +         "type": "object"
    +      },
    +      "Image": {
    +         "additionalProperties": false,
    +         "description": "An image.",
    +         "properties": {
    +            "gcsUri": {
    +               "anyOf": [
    +                  {
    +                     "type": "string"
    +                  },
    +                  {
    +                     "type": "null"
    +                  }
    +               ],
    +               "default": null,
    +               "description": "The Cloud Storage URI of the image. ``Image`` can contain a value\n      for this field or the ``image_bytes`` field but not both.\n      ",
    +               "title": "Gcsuri"
    +            },
    +            "imageBytes": {
    +               "anyOf": [
    +                  {
    +                     "format": "base64url",
    +                     "type": "string"
    +                  },
    +                  {
    +                     "type": "null"
    +                  }
    +               ],
    +               "default": null,
    +               "description": "The image bytes data. ``Image`` can contain a value for this field\n      or the ``gcs_uri`` field but not both.\n      ",
    +               "title": "Imagebytes"
    +            },
    +            "mimeType": {
    +               "anyOf": [
    +                  {
    +                     "type": "string"
    +                  },
    +                  {
    +                     "type": "null"
    +                  }
    +               ],
    +               "default": null,
    +               "description": "The MIME type of the image.",
    +               "title": "Mimetype"
    +            }
    +         },
    +         "title": "Image",
    +         "type": "object"
    +      }
    +   },
    +   "additionalProperties": false
    +}
    +
    +
    +

    +
    Fields:
    +
    +
    +
    +
    +
    +field generated_masks: Optional[list[GeneratedImageMask]] = None (alias 'generatedMasks')
    +

    List of generated image masks.

    +
    + +
    + +
    +
    +class genai.types.SegmentImageResponseDict
    +

    Bases: TypedDict

    +

    The output images response.

    +
    +
    +generated_masks: Optional[list[GeneratedImageMaskDict]]
    +

    List of generated image masks.

    +
    + +
    + +
    +
    +pydantic model genai.types.SegmentImageSource
    +

    Bases: BaseModel

    +

    A set of source input(s) for image segmentation.

    +

    Create a new model by parsing and validating input data from keyword arguments.

    +

    Raises [ValidationError][pydantic_core.ValidationError] if the input data cannot be +validated to form a valid model.

    +

    self is explicitly positional-only to allow self as a field name.

    +

    +Show JSON schema
    {
    +   "title": "SegmentImageSource",
    +   "description": "A set of source input(s) for image segmentation.",
    +   "type": "object",
    +   "properties": {
    +      "prompt": {
    +         "anyOf": [
    +            {
    +               "type": "string"
    +            },
    +            {
    +               "type": "null"
    +            }
    +         ],
    +         "default": null,
    +         "description": "A text prompt for guiding the model during image segmentation.\n      Required for prompt mode and semantic mode, disallowed for other modes.",
    +         "title": "Prompt"
    +      },
    +      "image": {
    +         "anyOf": [
    +            {
    +               "$ref": "#/$defs/Image"
    +            },
    +            {
    +               "type": "null"
    +            }
    +         ],
    +         "default": null,
    +         "description": "The image to be segmented."
    +      },
    +      "scribbleImage": {
    +         "anyOf": [
    +            {
    +               "$ref": "#/$defs/ScribbleImage"
    +            },
    +            {
    +               "type": "null"
    +            }
    +         ],
    +         "default": null,
    +         "description": "The brush scribble to guide segmentation.\n      Required for the interactive mode, disallowed for other modes."
    +      }
    +   },
    +   "$defs": {
    +      "Image": {
    +         "additionalProperties": false,
    +         "description": "An image.",
    +         "properties": {
    +            "gcsUri": {
    +               "anyOf": [
    +                  {
    +                     "type": "string"
    +                  },
    +                  {
    +                     "type": "null"
    +                  }
    +               ],
    +               "default": null,
    +               "description": "The Cloud Storage URI of the image. ``Image`` can contain a value\n      for this field or the ``image_bytes`` field but not both.\n      ",
    +               "title": "Gcsuri"
    +            },
    +            "imageBytes": {
    +               "anyOf": [
    +                  {
    +                     "format": "base64url",
    +                     "type": "string"
    +                  },
    +                  {
    +                     "type": "null"
    +                  }
    +               ],
    +               "default": null,
    +               "description": "The image bytes data. ``Image`` can contain a value for this field\n      or the ``gcs_uri`` field but not both.\n      ",
    +               "title": "Imagebytes"
    +            },
    +            "mimeType": {
    +               "anyOf": [
    +                  {
    +                     "type": "string"
    +                  },
    +                  {
    +                     "type": "null"
    +                  }
    +               ],
    +               "default": null,
    +               "description": "The MIME type of the image.",
    +               "title": "Mimetype"
    +            }
    +         },
    +         "title": "Image",
    +         "type": "object"
    +      },
    +      "ScribbleImage": {
    +         "additionalProperties": false,
    +         "description": "An image mask representing a brush scribble.",
    +         "properties": {
    +            "image": {
    +               "anyOf": [
    +                  {
    +                     "$ref": "#/$defs/Image"
    +                  },
    +                  {
    +                     "type": "null"
    +                  }
    +               ],
    +               "default": null,
    +               "description": "The brush scribble to guide segmentation. Valid for the interactive mode."
    +            }
    +         },
    +         "title": "ScribbleImage",
    +         "type": "object"
    +      }
    +   },
    +   "additionalProperties": false
    +}
    +
    +
    +

    +
    Fields:
    +
    +
    +
    +
    +
    +field image: Optional[Image] = None
    +

    The image to be segmented.

    +
    + +
    +
    +field prompt: Optional[str] = None
    +

    A text prompt for guiding the model during image segmentation. +Required for prompt mode and semantic mode, disallowed for other modes.

    +
    + +
    +
    +field scribble_image: Optional[ScribbleImage] = None (alias 'scribbleImage')
    +

    The brush scribble to guide segmentation. +Required for the interactive mode, disallowed for other modes.

    +
    + +
    + +
    +
    +class genai.types.SegmentImageSourceDict
    +

    Bases: TypedDict

    +

    A set of source input(s) for image segmentation.

    +
    +
    +image: Optional[ImageDict]
    +

    The image to be segmented.

    +
    + +
    +
    +prompt: Optional[str]
    +

    A text prompt for guiding the model during image segmentation. +Required for prompt mode and semantic mode, disallowed for other modes.

    +
    + +
    +
    +scribble_image: Optional[ScribbleImageDict]
    +

    The brush scribble to guide segmentation. +Required for the interactive mode, disallowed for other modes.

    +
    + +
    + +
    +
    +class genai.types.SegmentMode(*values)
    +

    Bases: CaseInSensitiveEnum

    +

    Enum that represents the segmentation mode.

    +
    +
    +BACKGROUND = 'BACKGROUND'
    +
    + +
    +
    +FOREGROUND = 'FOREGROUND'
    +
    + +
    +
    +INTERACTIVE = 'INTERACTIVE'
    +
    + +
    +
    +PROMPT = 'PROMPT'
    +
    + +
    +
    +SEMANTIC = 'SEMANTIC'
    +
    + +
    +
    pydantic model genai.types.SessionResumptionConfig
    @@ -132931,6 +133146,18 @@

    Submodules "default": null, "description": "Optional. Tool to support URL context retrieval." }, + "computerUse": { + "anyOf": [ + { + "$ref": "#/$defs/ToolComputerUse" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional. Tool to support the model interacting directly with the\n computer. If enabled, it automatically populates computer-use specific\n Function Declarations." + }, "codeExecution": { "anyOf": [ { @@ -133289,10 +133516,36 @@

    Submodules "EnterpriseWebSearch": { "additionalProperties": false, "description": "Tool to search public web data, powered by Vertex AI Search and Sec4 compliance.", - "properties": {}, + "properties": { + "excludeDomains": { + "anyOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional. List of domains to be excluded from the search results. The default limit is 2000 domains.", + "title": "Excludedomains" + } + }, "title": "EnterpriseWebSearch", "type": "object" }, + "Environment": { + "description": "The environment being operated.", + "enum": [ + "ENVIRONMENT_UNSPECIFIED", + "ENVIRONMENT_BROWSER" + ], + "title": "Environment", + "type": "string" + }, "ExternalApi": { "additionalProperties": false, "description": "Retrieve from data source powered by external API for grounding.\n\nThe external API is not owned by Google, but need to follow the pre-defined\nAPI spec.", @@ -133555,6 +133808,22 @@

    Submodules ], "default": null, "description": "Optional. Filter search results to a specific time range.\n If customers set a start time, they must set an end time (and vice versa).\n " + }, + "excludeDomains": { + "anyOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional. List of domains to be excluded from the search results.\n The default limit is 2000 domains.", + "title": "Excludedomains" } }, "title": "GoogleSearch", @@ -134222,6 +134491,26 @@

    Submodules "title": "ToolCodeExecution", "type": "object" }, + "ToolComputerUse": { + "additionalProperties": false, + "description": "Tool to support computer use.", + "properties": { + "environment": { + "anyOf": [ + { + "$ref": "#/$defs/Environment" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Required. The environment being operated." + } + }, + "title": "ToolComputerUse", + "type": "object" + }, "Type": { "description": "Optional. The type of the data.", "enum": [ @@ -134491,6 +134780,7 @@

    SubmodulesFields:

    +
    @@ -134586,6 +134884,77 @@

    Submodules +
    +pydantic model genai.types.ToolComputerUse
    +

    Bases: BaseModel

    +

    Tool to support computer use.

    +

    Create a new model by parsing and validating input data from keyword arguments.

    +

    Raises [ValidationError][pydantic_core.ValidationError] if the input data cannot be +validated to form a valid model.

    +

    self is explicitly positional-only to allow self as a field name.

    +

    +Show JSON schema
    {
    +   "title": "ToolComputerUse",
    +   "description": "Tool to support computer use.",
    +   "type": "object",
    +   "properties": {
    +      "environment": {
    +         "anyOf": [
    +            {
    +               "$ref": "#/$defs/Environment"
    +            },
    +            {
    +               "type": "null"
    +            }
    +         ],
    +         "default": null,
    +         "description": "Required. The environment being operated."
    +      }
    +   },
    +   "$defs": {
    +      "Environment": {
    +         "description": "The environment being operated.",
    +         "enum": [
    +            "ENVIRONMENT_UNSPECIFIED",
    +            "ENVIRONMENT_BROWSER"
    +         ],
    +         "title": "Environment",
    +         "type": "string"
    +      }
    +   },
    +   "additionalProperties": false
    +}
    +
    +
    +

    +
    Fields:
    +
    +
    +
    +
    +
    +field environment: Optional[Environment] = None
    +

    Required. The environment being operated.

    +
    + +

    + +
    +
    +class genai.types.ToolComputerUseDict
    +

    Bases: TypedDict

    +

    Tool to support computer use.

    +
    +
    +environment: Optional[Environment]
    +

    Required. The environment being operated.

    +
    + +
    +
    pydantic model genai.types.ToolConfig
    @@ -134800,6 +135169,14 @@

    Submodules +
    +computer_use: Optional[ToolComputerUseDict]
    +

    Optional. Tool to support the model interacting directly with the +computer. If enabled, it automatically populates computer-use specific +Function Declarations.

    +

    +
    @@ -137120,7 +137497,6 @@

    Submodules Show JSON schema
    {
        "title": "TuningJob",
    -   "description": "A tuning job.",
        "type": "object",
        "properties": {
           "sdkHttpResponse": {
    @@ -137326,6 +137702,10 @@ 

    Submodules "default": null, "description": "Tuning Spec for open sourced and third party Partner models." }, + "evaluationConfig": { + "default": null, + "title": "Evaluationconfig" + }, "customBaseModel": { "anyOf": [ { @@ -137339,18 +137719,6 @@

    Submodules "description": "Optional. The user-provided path to custom model weights. Set this field to tune a custom model. The path must be a Cloud Storage directory that contains the model weights in .safetensors format along with associated model metadata files. If this field is set, the base_model field must still be set to indicate which base model the custom model is derived from. This feature is only available for open source models.", "title": "Custombasemodel" }, - "distillationSpec": { - "anyOf": [ - { - "$ref": "#/$defs/DistillationSpec" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Tuning Spec for Distillation." - }, "experiment": { "anyOf": [ { @@ -137406,44 +137774,6 @@

    Submodules "description": "Output only. The resource name of the PipelineJob associated with the TuningJob. Format: `projects/{project}/locations/{location}/pipelineJobs/{pipeline_job}`.", "title": "Pipelinejob" }, - "preferenceOptimizationSpec": { - "anyOf": [ - { - "$ref": "#/$defs/PreferenceOptimizationSpec" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Tuning Spec for Preference Optimization." - }, - "satisfiesPzi": { - "anyOf": [ - { - "type": "boolean" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Output only. Reserved for future use.", - "title": "Satisfiespzi" - }, - "satisfiesPzs": { - "anyOf": [ - { - "type": "boolean" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Output only. Reserved for future use.", - "title": "Satisfiespzs" - }, "serviceAccount": { "anyOf": [ { @@ -137469,18 +137799,6 @@

    Submodules "default": null, "description": "Optional. The display name of the TunedModel. The name can be up to 128 characters long and can consist of any UTF-8 characters.", "title": "Tunedmodeldisplayname" - }, - "veoTuningSpec": { - "anyOf": [ - { - "$ref": "#/$defs/VeoTuningSpec" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Tuning Spec for Veo Tuning." } }, "$defs": { @@ -137910,150 +138228,6 @@

    Submodules "title": "DistillationDataStats", "type": "object" }, - "DistillationHyperParameters": { - "additionalProperties": false, - "description": "Hyperparameters for Distillation.", - "properties": { - "adapterSize": { - "anyOf": [ - { - "$ref": "#/$defs/AdapterSize" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Optional. Adapter size for distillation." - }, - "epochCount": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Optional. Number of complete passes the model makes over the entire training dataset during training.", - "title": "Epochcount" - }, - "learningRateMultiplier": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Optional. Multiplier for adjusting the default learning rate.", - "title": "Learningratemultiplier" - } - }, - "title": "DistillationHyperParameters", - "type": "object" - }, - "DistillationSpec": { - "additionalProperties": false, - "description": "Tuning Spec for Distillation.", - "properties": { - "baseTeacherModel": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "The base teacher model that is being distilled. See [Supported models](https://cloud.google.com/vertex-ai/generative-ai/docs/model-reference/tuning#supported_models).", - "title": "Baseteachermodel" - }, - "hyperParameters": { - "anyOf": [ - { - "$ref": "#/$defs/DistillationHyperParameters" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Optional. Hyperparameters for Distillation." - }, - "pipelineRootDirectory": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Deprecated. A path in a Cloud Storage bucket, which will be treated as the root output directory of the distillation pipeline. It is used by the system to generate the paths of output artifacts.", - "title": "Pipelinerootdirectory" - }, - "studentModel": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "The student model that is being tuned, e.g., \"google/gemma-2b-1.1-it\". Deprecated. Use base_model instead.", - "title": "Studentmodel" - }, - "trainingDatasetUri": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Deprecated. Cloud Storage path to file containing training dataset for tuning. The dataset must be formatted as a JSONL file.", - "title": "Trainingdataseturi" - }, - "tunedTeacherModelSource": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "The resource name of the Tuned teacher model. Format: `projects/{project}/locations/{location}/models/{model}`.", - "title": "Tunedteachermodelsource" - }, - "validationDatasetUri": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Optional. Cloud Storage path to file containing validation dataset for tuning. The dataset must be formatted as a JSONL file.", - "title": "Validationdataseturi" - } - }, - "title": "DistillationSpec", - "type": "object" - }, "EncryptionSpec": { "additionalProperties": false, "description": "Represents a customer-managed encryption key spec that can be applied to a top-level resource.", @@ -138821,111 +138995,6 @@

    Submodules "title": "PreferenceOptimizationDataStats", "type": "object" }, - "PreferenceOptimizationHyperParameters": { - "additionalProperties": false, - "description": "Hyperparameters for Preference Optimization.", - "properties": { - "adapterSize": { - "anyOf": [ - { - "$ref": "#/$defs/AdapterSize" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Optional. Adapter size for preference optimization." - }, - "beta": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Optional. Weight for KL Divergence regularization.", - "title": "Beta" - }, - "epochCount": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Optional. Number of complete passes the model makes over the entire training dataset during training.", - "title": "Epochcount" - }, - "learningRateMultiplier": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Optional. Multiplier for adjusting the default learning rate.", - "title": "Learningratemultiplier" - } - }, - "title": "PreferenceOptimizationHyperParameters", - "type": "object" - }, - "PreferenceOptimizationSpec": { - "additionalProperties": false, - "description": "Tuning Spec for Preference Optimization.", - "properties": { - "hyperParameters": { - "anyOf": [ - { - "$ref": "#/$defs/PreferenceOptimizationHyperParameters" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Optional. Hyperparameters for Preference Optimization." - }, - "trainingDatasetUri": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Required. Cloud Storage path to file containing training dataset for preference optimization tuning. The dataset must be formatted as a JSONL file.", - "title": "Trainingdataseturi" - }, - "validationDatasetUri": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Optional. Cloud Storage path to file containing validation dataset for preference optimization tuning. The dataset must be formatted as a JSONL file.", - "title": "Validationdataseturi" - } - }, - "title": "PreferenceOptimizationSpec", - "type": "object" - }, "SupervisedHyperParameters": { "additionalProperties": false, "description": "Hyperparameters for SFT.", @@ -139577,108 +139646,6 @@

    Submodules "title": "TuningMode", "type": "string" }, - "TuningTask": { - "description": "Optional. The tuning task. Either I2V or T2V.", - "enum": [ - "TUNING_TASK_UNSPECIFIED", - "TUNING_TASK_I2V", - "TUNING_TASK_T2V" - ], - "title": "TuningTask", - "type": "string" - }, - "VeoHyperParameters": { - "additionalProperties": false, - "description": "Hyperparameters for Veo.", - "properties": { - "epochCount": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Optional. Number of complete passes the model makes over the entire training dataset during training.", - "title": "Epochcount" - }, - "learningRateMultiplier": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Optional. Multiplier for adjusting the default learning rate.", - "title": "Learningratemultiplier" - }, - "tuningTask": { - "anyOf": [ - { - "$ref": "#/$defs/TuningTask" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Optional. The tuning task. Either I2V or T2V." - } - }, - "title": "VeoHyperParameters", - "type": "object" - }, - "VeoTuningSpec": { - "additionalProperties": false, - "description": "Tuning Spec for Veo Model Tuning.", - "properties": { - "hyperParameters": { - "anyOf": [ - { - "$ref": "#/$defs/VeoHyperParameters" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Optional. Hyperparameters for Veo." - }, - "trainingDatasetUri": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Required. Training dataset used for tuning. The dataset can be specified as either a Cloud Storage path to a JSONL file or as the resource name of a Vertex Multimodal Dataset.", - "title": "Trainingdataseturi" - }, - "validationDatasetUri": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "description": "Optional. Validation dataset used for tuning. The dataset can be specified as either a Cloud Storage path to a JSONL file or as the resource name of a Vertex Multimodal Dataset.", - "title": "Validationdataseturi" - } - }, - "title": "VeoTuningSpec", - "type": "object" - }, "VideoMetadata": { "additionalProperties": false, "description": "Describes how the video in the Part should be used by the model.", @@ -139738,10 +139705,10 @@

    Submodulescreate_time (datetime.datetime | None)

  • custom_base_model (str | None)

  • description (str | None)

  • -
  • distillation_spec (genai.types.DistillationSpec | None)

  • encryption_spec (genai.types.EncryptionSpec | None)

  • end_time (datetime.datetime | None)

  • error (genai.types.GoogleRpcStatus | None)

  • +
  • evaluation_config (genai.types.EvaluationConfig | None)

  • experiment (str | None)

  • labels (dict[str, str] | None)

  • name (str | None)

  • @@ -139749,9 +139716,6 @@

    Submodulespartner_model_tuning_spec (genai.types.PartnerModelTuningSpec | None)

  • pipeline_job (str | None)

  • pre_tuned_model (genai.types.PreTunedModel | None)

  • -
  • preference_optimization_spec (genai.types.PreferenceOptimizationSpec | None)

  • -
  • satisfies_pzi (bool | None)

  • -
  • satisfies_pzs (bool | None)

  • sdk_http_response (genai.types.HttpResponse | None)

  • service_account (str | None)

  • start_time (datetime.datetime | None)

  • @@ -139761,7 +139725,6 @@

    Submodulestuned_model_display_name (str | None)

  • tuning_data_stats (genai.types.TuningDataStats | None)

  • update_time (datetime.datetime | None)

  • -
  • veo_tuning_spec (genai.types.VeoTuningSpec | None)

  • @@ -139789,12 +139752,6 @@

    Submodules -
    -field distillation_spec: Optional[DistillationSpec] = None (alias 'distillationSpec')
    -

    Tuning Spec for Distillation.

    -

    -
    field encryption_spec: Optional[EncryptionSpec] = None (alias 'encryptionSpec')
    @@ -139813,6 +139770,11 @@

    Submodules +
    +field evaluation_config: Optional[EvaluationConfig] = None (alias 'evaluationConfig')
    +

    +
    field experiment: Optional[str] = None
    @@ -139855,24 +139817,6 @@

    Submodules -
    -field preference_optimization_spec: Optional[PreferenceOptimizationSpec] = None (alias 'preferenceOptimizationSpec')
    -

    Tuning Spec for Preference Optimization.

    -

    - -
    -
    -field satisfies_pzi: Optional[bool] = None (alias 'satisfiesPzi')
    -

    Output only. Reserved for future use.

    -
    - -
    -
    -field satisfies_pzs: Optional[bool] = None (alias 'satisfiesPzs')
    -

    Output only. Reserved for future use.

    -
    -
    field sdk_http_response: Optional[HttpResponse] = None (alias 'sdkHttpResponse')
    @@ -139927,12 +139871,6 @@

    Submodules -
    -field veo_tuning_spec: Optional[VeoTuningSpec] = None (alias 'veoTuningSpec')
    -

    Tuning Spec for Veo Tuning.

    -

    -
    property has_ended: bool
    @@ -139981,12 +139919,6 @@

    Submodules -
    -distillation_spec: Optional[DistillationSpecDict]
    -

    Tuning Spec for Distillation.

    -

    -
    encryption_spec: Optional[EncryptionSpecDict]
    @@ -140010,6 +139942,11 @@

    Submodules +
    +evaluation_config: Optional[EvaluationConfigDict]
    +

    +
    experiment: Optional[str]
    @@ -140067,24 +140004,6 @@

    Submodules -
    -preference_optimization_spec: Optional[PreferenceOptimizationSpecDict]
    -

    Tuning Spec for Preference Optimization.

    -

    - -
    -
    -satisfies_pzi: Optional[bool]
    -

    Output only. Reserved for future use.

    -
    - -
    -
    -satisfies_pzs: Optional[bool]
    -

    Output only. Reserved for future use.

    -
    -
    sdk_http_response: Optional[HttpResponseDict]
    @@ -140144,12 +140063,6 @@

    Submodules -
    -veo_tuning_spec: Optional[VeoTuningSpecDict]
    -

    Tuning Spec for Veo Tuning.

    -

    -

    @@ -140380,31 +140293,6 @@

    Submodules -
    -class genai.types.TuningTask(*values)
    -

    Bases: CaseInSensitiveEnum

    -

    Optional. The tuning task. Either I2V or T2V.

    -
    -
    -TUNING_TASK_I2V = 'TUNING_TASK_I2V'
    -

    Tuning task for image to video.

    -
    - -
    -
    -TUNING_TASK_T2V = 'TUNING_TASK_T2V'
    -

    Tuning task for text to video.

    -
    - -
    -
    -TUNING_TASK_UNSPECIFIED = 'TUNING_TASK_UNSPECIFIED'
    -

    Default value. This value is unused.

    -
    - -

    -
    pydantic model genai.types.TuningValidationDataset
    @@ -143999,300 +143887,6 @@

    Submodules -
    -pydantic model genai.types.VeoHyperParameters
    -

    Bases: BaseModel

    -

    Hyperparameters for Veo.

    -

    Create a new model by parsing and validating input data from keyword arguments.

    -

    Raises [ValidationError][pydantic_core.ValidationError] if the input data cannot be -validated to form a valid model.

    -

    self is explicitly positional-only to allow self as a field name.

    -

    -Show JSON schema
    {
    -   "title": "VeoHyperParameters",
    -   "description": "Hyperparameters for Veo.",
    -   "type": "object",
    -   "properties": {
    -      "epochCount": {
    -         "anyOf": [
    -            {
    -               "type": "integer"
    -            },
    -            {
    -               "type": "null"
    -            }
    -         ],
    -         "default": null,
    -         "description": "Optional. Number of complete passes the model makes over the entire training dataset during training.",
    -         "title": "Epochcount"
    -      },
    -      "learningRateMultiplier": {
    -         "anyOf": [
    -            {
    -               "type": "number"
    -            },
    -            {
    -               "type": "null"
    -            }
    -         ],
    -         "default": null,
    -         "description": "Optional. Multiplier for adjusting the default learning rate.",
    -         "title": "Learningratemultiplier"
    -      },
    -      "tuningTask": {
    -         "anyOf": [
    -            {
    -               "$ref": "#/$defs/TuningTask"
    -            },
    -            {
    -               "type": "null"
    -            }
    -         ],
    -         "default": null,
    -         "description": "Optional. The tuning task. Either I2V or T2V."
    -      }
    -   },
    -   "$defs": {
    -      "TuningTask": {
    -         "description": "Optional. The tuning task. Either I2V or T2V.",
    -         "enum": [
    -            "TUNING_TASK_UNSPECIFIED",
    -            "TUNING_TASK_I2V",
    -            "TUNING_TASK_T2V"
    -         ],
    -         "title": "TuningTask",
    -         "type": "string"
    -      }
    -   },
    -   "additionalProperties": false
    -}
    -
    -
    -

    -
    Fields:
    -
    -
    -
    -
    -
    -field epoch_count: Optional[int] = None (alias 'epochCount')
    -

    Optional. Number of complete passes the model makes over the entire training dataset during training.

    -
    - -
    -
    -field learning_rate_multiplier: Optional[float] = None (alias 'learningRateMultiplier')
    -

    Optional. Multiplier for adjusting the default learning rate.

    -
    - -
    -
    -field tuning_task: Optional[TuningTask] = None (alias 'tuningTask')
    -

    Optional. The tuning task. Either I2V or T2V.

    -
    - -

    - -
    -
    -class genai.types.VeoHyperParametersDict
    -

    Bases: TypedDict

    -

    Hyperparameters for Veo.

    -
    -
    -epoch_count: Optional[int]
    -

    Optional. Number of complete passes the model makes over the entire training dataset during training.

    -
    - -
    -
    -learning_rate_multiplier: Optional[float]
    -

    Optional. Multiplier for adjusting the default learning rate.

    -
    - -
    -
    -tuning_task: Optional[TuningTask]
    -

    Optional. The tuning task. Either I2V or T2V.

    -
    - -
    - -
    -
    -pydantic model genai.types.VeoTuningSpec
    -

    Bases: BaseModel

    -

    Tuning Spec for Veo Model Tuning.

    -

    Create a new model by parsing and validating input data from keyword arguments.

    -

    Raises [ValidationError][pydantic_core.ValidationError] if the input data cannot be -validated to form a valid model.

    -

    self is explicitly positional-only to allow self as a field name.

    -

    -Show JSON schema
    {
    -   "title": "VeoTuningSpec",
    -   "description": "Tuning Spec for Veo Model Tuning.",
    -   "type": "object",
    -   "properties": {
    -      "hyperParameters": {
    -         "anyOf": [
    -            {
    -               "$ref": "#/$defs/VeoHyperParameters"
    -            },
    -            {
    -               "type": "null"
    -            }
    -         ],
    -         "default": null,
    -         "description": "Optional. Hyperparameters for Veo."
    -      },
    -      "trainingDatasetUri": {
    -         "anyOf": [
    -            {
    -               "type": "string"
    -            },
    -            {
    -               "type": "null"
    -            }
    -         ],
    -         "default": null,
    -         "description": "Required. Training dataset used for tuning. The dataset can be specified as either a Cloud Storage path to a JSONL file or as the resource name of a Vertex Multimodal Dataset.",
    -         "title": "Trainingdataseturi"
    -      },
    -      "validationDatasetUri": {
    -         "anyOf": [
    -            {
    -               "type": "string"
    -            },
    -            {
    -               "type": "null"
    -            }
    -         ],
    -         "default": null,
    -         "description": "Optional. Validation dataset used for tuning. The dataset can be specified as either a Cloud Storage path to a JSONL file or as the resource name of a Vertex Multimodal Dataset.",
    -         "title": "Validationdataseturi"
    -      }
    -   },
    -   "$defs": {
    -      "TuningTask": {
    -         "description": "Optional. The tuning task. Either I2V or T2V.",
    -         "enum": [
    -            "TUNING_TASK_UNSPECIFIED",
    -            "TUNING_TASK_I2V",
    -            "TUNING_TASK_T2V"
    -         ],
    -         "title": "TuningTask",
    -         "type": "string"
    -      },
    -      "VeoHyperParameters": {
    -         "additionalProperties": false,
    -         "description": "Hyperparameters for Veo.",
    -         "properties": {
    -            "epochCount": {
    -               "anyOf": [
    -                  {
    -                     "type": "integer"
    -                  },
    -                  {
    -                     "type": "null"
    -                  }
    -               ],
    -               "default": null,
    -               "description": "Optional. Number of complete passes the model makes over the entire training dataset during training.",
    -               "title": "Epochcount"
    -            },
    -            "learningRateMultiplier": {
    -               "anyOf": [
    -                  {
    -                     "type": "number"
    -                  },
    -                  {
    -                     "type": "null"
    -                  }
    -               ],
    -               "default": null,
    -               "description": "Optional. Multiplier for adjusting the default learning rate.",
    -               "title": "Learningratemultiplier"
    -            },
    -            "tuningTask": {
    -               "anyOf": [
    -                  {
    -                     "$ref": "#/$defs/TuningTask"
    -                  },
    -                  {
    -                     "type": "null"
    -                  }
    -               ],
    -               "default": null,
    -               "description": "Optional. The tuning task. Either I2V or T2V."
    -            }
    -         },
    -         "title": "VeoHyperParameters",
    -         "type": "object"
    -      }
    -   },
    -   "additionalProperties": false
    -}
    -
    -
    -

    -
    Fields:
    -
    -
    -
    -
    -
    -field hyper_parameters: Optional[VeoHyperParameters] = None (alias 'hyperParameters')
    -

    Optional. Hyperparameters for Veo.

    -
    - -
    -
    -field training_dataset_uri: Optional[str] = None (alias 'trainingDatasetUri')
    -

    Required. Training dataset used for tuning. The dataset can be specified as either a Cloud Storage path to a JSONL file or as the resource name of a Vertex Multimodal Dataset.

    -
    - -
    -
    -field validation_dataset_uri: Optional[str] = None (alias 'validationDatasetUri')
    -

    Optional. Validation dataset used for tuning. The dataset can be specified as either a Cloud Storage path to a JSONL file or as the resource name of a Vertex Multimodal Dataset.

    -
    - -
    - -
    -
    -class genai.types.VeoTuningSpecDict
    -

    Bases: TypedDict

    -

    Tuning Spec for Veo Model Tuning.

    -
    -
    -hyper_parameters: Optional[VeoHyperParametersDict]
    -

    Optional. Hyperparameters for Veo.

    -
    - -
    -
    -training_dataset_uri: Optional[str]
    -

    Required. Training dataset used for tuning. The dataset can be specified as either a Cloud Storage path to a JSONL file or as the resource name of a Vertex Multimodal Dataset.

    -
    - -
    -
    -validation_dataset_uri: Optional[str]
    -

    Optional. Validation dataset used for tuning. The dataset can be specified as either a Cloud Storage path to a JSONL file or as the resource name of a Vertex Multimodal Dataset.

    -
    - -
    -
    pydantic model genai.types.VertexAISearch
    diff --git a/docs/genindex.html b/docs/genindex.html index 9d922a223..c9b29da99 100644 --- a/docs/genindex.html +++ b/docs/genindex.html @@ -318,14 +318,6 @@

    A

    - - + - - + +
  • candidate_response_field_name (genai.types.PairwiseMetricSpec attribute) + +
  • CandidateDict (class in genai.types) @@ -1128,14 +1150,20 @@

    C

  • (genai.types.GenerateVideosConfigDict attribute)
  • - - + +
  • custom_function (genai.types.Metric attribute) + +
  • +
  • custom_output_format_config (genai.types.PairwiseMetricSpec attribute) + +
  • +
  • CustomOutputFormatConfigDict (class in genai.types) +
  • @@ -1598,24 +1650,20 @@

    D

    -
  • distillation_spec (genai.types.TuningJob attribute) - -
  • DistillationDataStatsDict (class in genai.types) -
  • -
  • DistillationHyperParametersDict (class in genai.types) -
  • -
  • DistillationSpecDict (class in genai.types)
  • DIVERSITY (genai.types.MusicGenerationMode attribute)
  • DOCUMENT (genai.types.MediaModality attribute)
  • +
  • document_name (genai.types.GroundingChunkRetrievedContext attribute) + +
  • domain (genai.types.GroundingChunkWeb attribute)
  • - - + +
  • Environment (class in genai.types) +
  • +
  • environment (genai.types.ToolComputerUse attribute) + +
  • +
  • ENVIRONMENT_BROWSER (genai.types.Environment attribute) +
  • +
  • ENVIRONMENT_UNSPECIFIED (genai.types.Environment attribute) +
  • epoch (genai.types.Checkpoint attribute)
  • es (genai.types.ImagePromptLanguage attribute) +
  • +
  • evaluation_config (genai.types.CreateTuningJobConfig attribute) + +
  • +
  • EvaluationConfigDict (class in genai.types)
  • example (genai.types.Schema attribute) @@ -1976,6 +2038,16 @@

    E

  • +
  • exclude_domains (genai.types.EnterpriseWebSearch attribute) + +
  • executable_code (genai.types.GenerateContentResponse property) @@ -2198,6 +2270,14 @@

    F

  • GeneratedImageDict (class in genai.types) +
  • +
  • GeneratedImageMaskDict (class in genai.types)
  • GeneratedVideoDict (class in genai.types)
  • @@ -2508,6 +2604,8 @@

    G

  • (genai.types.LiveServerContentDict attribute)
  • + + - -
  • hyper_parameters (genai.types.DistillationSpec attribute) +
  • hyper_parameters (genai.types.PartnerModelTuningSpec attribute)
  • @@ -3034,9 +3122,17 @@

    I

  • (genai.types.Modality attribute)
  • -
  • image (genai.types.UpscaleImageParameters attribute) +
  • image (genai.types.ScribbleImage attribute)
  • @@ -3090,6 +3186,8 @@

    I

  • (genai.types.UpscaleImageConfigDict attribute)
  • + + - - + @@ -3280,10 +3384,20 @@

    K

    L

    - + + - - + + - @@ -6219,6 +6441,8 @@

    T

  • (genai.types.SchemaDict attribute)
  • +
  • to_yaml_file() (genai.types.Metric method) +
  • token (genai.types.LogprobsResultCandidate attribute)
      @@ -6316,6 +6540,8 @@

      T

  • ToolCodeExecutionDict (class in genai.types) +
  • +
  • ToolComputerUseDict (class in genai.types)
  • ToolConfigDict (class in genai.types)
  • @@ -6343,6 +6569,8 @@

    T

  • (genai.types.LiveConnectConfigDict attribute)
  • + + - - +
    +
  • max_predictions (genai.types.SegmentImageConfig attribute) + +
  • max_properties (genai.types.JSONSchema attribute) @@ -3796,6 +3914,24 @@

    M

  • (genai.types.SafetySetting attribute)
  • (genai.types.SafetySettingDict attribute) +
  • + +
  • metric_prompt_template (genai.types.PairwiseMetricSpec attribute) + +
  • +
  • MetricDict (class in genai.types) +
  • +
  • metrics (genai.types.EvaluationConfig attribute) + +
  • mime_type (genai.types.AudioChunk attribute) @@ -3832,6 +3968,8 @@

    M

  • (genai.types.VideoDict attribute)
  • +
  • model_post_init() (genai.types.Image method) + +
  • model_routing_preference (genai.types.GenerationConfigRoutingConfigAutoRoutingMode attribute)
  • + + -
  • tuning_task (genai.types.VeoHyperParameters attribute) - -
  • -
  • TUNING_TASK_I2V (genai.types.TuningTask attribute) -
  • -
  • TUNING_TASK_T2V (genai.types.TuningTask attribute) -
  • -
  • TUNING_TASK_UNSPECIFIED (genai.types.TuningTask attribute) -
  • TuningDatasetDict (class in genai.types)
  • TuningDataStatsDict (class in genai.types) @@ -6657,8 +6853,6 @@

    T

  • (genai.client.Client property)
  • -
  • TuningTask (class in genai.types) -
  • TuningValidationDatasetDict (class in genai.types)
  • turn_complete (genai.types.LiveClientContent attribute) @@ -6821,8 +7015,6 @@

    U

  • (genai.types.ToolDict attribute)
  • -

    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 VMw4^Vo}&7wl4hQ3aP+^q{{w0Lcy0gy literal 0 HcmV?d00001 diff --git a/google/genai/tests/models/test_segment_image.py b/google/genai/tests/models/test_segment_image.py new file mode 100644 index 000000000..495d52e56 --- /dev/null +++ b/google/genai/tests/models/test_segment_image.py @@ -0,0 +1,147 @@ +# Copyright 2025 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. +# + + +"""Tests for segment_image.""" + +import os + +import pytest + +from ... import types +from .. import pytest_helper + +SEGMENT_IMAGE_MODEL_LATEST = 'image-segmentation-001' + +SOURCE_IMAGE_FILE_PATH1 = os.path.abspath( + os.path.join(os.path.dirname(__file__), '../data/google.png') +) + +SOURCE_IMAGE1 = types.Image.from_file(location=SOURCE_IMAGE_FILE_PATH1) + +SOURCE_IMAGE_FILE_PATH2 = os.path.abspath( + os.path.join(os.path.dirname(__file__), '../data/skateboard_stop_sign.jpg') +) + +SOURCE_IMAGE2 = types.Image.from_file(location=SOURCE_IMAGE_FILE_PATH2) + +SCRIBBLE_IMAGE_FILE_PATH = os.path.abspath( + os.path.join(os.path.dirname(__file__), '../data/segmentation_scribble.jpg') +) + +SCRIBBLE_IMAGE = types.Image.from_file(location=SCRIBBLE_IMAGE_FILE_PATH) + +test_table: list[pytest_helper.TestTableItem] = [ + pytest_helper.TestTableItem( + name='test_segment_foreground', + exception_if_mldev='only supported in the Vertex AI client', + parameters=types._SegmentImageParameters( + model=SEGMENT_IMAGE_MODEL_LATEST, + source=types.SegmentImageSource( + image=SOURCE_IMAGE1, + ), + config=types.SegmentImageConfig( + mode=types.SegmentMode.FOREGROUND, + max_predictions=1, + confidence_threshold=0.02, + mask_dilation=0.02, + binary_color_threshold=98, + ), + ), + ), + pytest_helper.TestTableItem( + name='test_segment_background', + exception_if_mldev='only supported in the Vertex AI client', + parameters=types._SegmentImageParameters( + model=SEGMENT_IMAGE_MODEL_LATEST, + source=types.SegmentImageSource( + image=SOURCE_IMAGE1, + ), + config=types.SegmentImageConfig( + mode=types.SegmentMode.BACKGROUND, + ), + ), + ), + pytest_helper.TestTableItem( + name='test_segment_prompt', + exception_if_mldev='only supported in the Vertex AI client', + parameters=types._SegmentImageParameters( + model=SEGMENT_IMAGE_MODEL_LATEST, + source=types.SegmentImageSource( + image=SOURCE_IMAGE1, + prompt='The letter G', + ), + config=types.SegmentImageConfig( + mode=types.SegmentMode.PROMPT, + ), + ), + ), + pytest_helper.TestTableItem( + name='test_segment_semantic', + exception_if_mldev='only supported in the Vertex AI client', + parameters=types._SegmentImageParameters( + model=SEGMENT_IMAGE_MODEL_LATEST, + source=types.SegmentImageSource( + image=SOURCE_IMAGE2, + prompt='skateboard', + ), + config=types.SegmentImageConfig( + mode=types.SegmentMode.SEMANTIC, + ), + ), + ), + pytest_helper.TestTableItem( + name='test_segment_interactive', + exception_if_mldev='only supported in the Vertex AI client', + parameters=types._SegmentImageParameters( + model=SEGMENT_IMAGE_MODEL_LATEST, + source=types.SegmentImageSource( + image=SOURCE_IMAGE2, + scribble_image=types.ScribbleImage(image=SCRIBBLE_IMAGE), + ), + config=types.SegmentImageConfig( + mode=types.SegmentMode.INTERACTIVE, + ), + ), + ), +] +pytestmark = pytest_helper.setup( + file=__file__, + globals_for_file=globals(), + test_method='models.segment_image', + test_table=test_table, +) + + +@pytest.mark.asyncio +async def test_segment_foreground_async(client): + with pytest_helper.exception_if_mldev(client, ValueError): + response = await client.aio.models.segment_image( + model=SEGMENT_IMAGE_MODEL_LATEST, + source=types.SegmentImageSource( + image=SOURCE_IMAGE2, + ), + config=types.SegmentImageConfig( + mode=types.SegmentMode.FOREGROUND, + max_predictions=1, + confidence_threshold=0.02, + mask_dilation=0.02, + binary_color_threshold=98, + ) + ) + assert response.generated_masks[0].mask.image_bytes + assert len(response.generated_masks) == 1 + assert response.generated_masks[0].labels[0].label == 'foreground' + assert response.generated_masks[0].labels[0].score > 0 diff --git a/google/genai/types.py b/google/genai/types.py index c2d7cf67b..f8e03bf4c 100644 --- a/google/genai/types.py +++ b/google/genai/types.py @@ -564,6 +564,16 @@ class EditMode(_common.CaseInSensitiveEnum): EDIT_MODE_PRODUCT_IMAGE = 'EDIT_MODE_PRODUCT_IMAGE' +class SegmentMode(_common.CaseInSensitiveEnum): + """Enum that represents the segmentation mode.""" + + FOREGROUND = 'FOREGROUND' + BACKGROUND = 'BACKGROUND' + PROMPT = 'PROMPT' + SEMANTIC = 'SEMANTIC' + INTERACTIVE = 'INTERACTIVE' + + class VideoCompressionQuality(_common.CaseInSensitiveEnum): """Enum that controls the compression quality of the generated videos.""" @@ -7241,6 +7251,236 @@ class RecontextImageResponseDict(TypedDict, total=False): ] +class ScribbleImage(_common.BaseModel): + """An image mask representing a brush scribble.""" + + image: Optional[Image] = Field( + default=None, + description="""The brush scribble to guide segmentation. Valid for the interactive mode.""", + ) + + +class ScribbleImageDict(TypedDict, total=False): + """An image mask representing a brush scribble.""" + + image: Optional[ImageDict] + """The brush scribble to guide segmentation. Valid for the interactive mode.""" + + +ScribbleImageOrDict = Union[ScribbleImage, ScribbleImageDict] + + +class SegmentImageSource(_common.BaseModel): + """A set of source input(s) for image segmentation.""" + + prompt: Optional[str] = Field( + default=None, + description="""A text prompt for guiding the model during image segmentation. + Required for prompt mode and semantic mode, disallowed for other modes.""", + ) + image: Optional[Image] = Field( + default=None, description="""The image to be segmented.""" + ) + scribble_image: Optional[ScribbleImage] = Field( + default=None, + description="""The brush scribble to guide segmentation. + Required for the interactive mode, disallowed for other modes.""", + ) + + +class SegmentImageSourceDict(TypedDict, total=False): + """A set of source input(s) for image segmentation.""" + + prompt: Optional[str] + """A text prompt for guiding the model during image segmentation. + Required for prompt mode and semantic mode, disallowed for other modes.""" + + image: Optional[ImageDict] + """The image to be segmented.""" + + scribble_image: Optional[ScribbleImageDict] + """The brush scribble to guide segmentation. + Required for the interactive mode, disallowed for other modes.""" + + +SegmentImageSourceOrDict = Union[SegmentImageSource, SegmentImageSourceDict] + + +class SegmentImageConfig(_common.BaseModel): + """Configuration for segmenting an image.""" + + http_options: Optional[HttpOptions] = Field( + default=None, description="""Used to override HTTP request options.""" + ) + mode: Optional[SegmentMode] = Field( + default=None, description="""The segmentation mode to use.""" + ) + max_predictions: Optional[int] = Field( + default=None, + description="""The maximum number of predictions to return up to, by top + confidence score.""", + ) + confidence_threshold: Optional[float] = Field( + default=None, + description="""The confidence score threshold for the detections as a decimal + value. Only predictions with a confidence score higher than this + threshold will be returned.""", + ) + mask_dilation: Optional[float] = Field( + default=None, + description="""A decimal value representing how much dilation to apply to the + masks. 0 for no dilation. 1.0 means the masked area covers the whole + image.""", + ) + binary_color_threshold: Optional[float] = Field( + default=None, + description="""The binary color threshold to apply to the masks. The threshold + can be set to a decimal value between 0 and 255 non-inclusive. + Set to -1 for no binary color thresholding.""", + ) + + +class SegmentImageConfigDict(TypedDict, total=False): + """Configuration for segmenting an image.""" + + http_options: Optional[HttpOptionsDict] + """Used to override HTTP request options.""" + + mode: Optional[SegmentMode] + """The segmentation mode to use.""" + + max_predictions: Optional[int] + """The maximum number of predictions to return up to, by top + confidence score.""" + + confidence_threshold: Optional[float] + """The confidence score threshold for the detections as a decimal + value. Only predictions with a confidence score higher than this + threshold will be returned.""" + + mask_dilation: Optional[float] + """A decimal value representing how much dilation to apply to the + masks. 0 for no dilation. 1.0 means the masked area covers the whole + image.""" + + binary_color_threshold: Optional[float] + """The binary color threshold to apply to the masks. The threshold + can be set to a decimal value between 0 and 255 non-inclusive. + Set to -1 for no binary color thresholding.""" + + +SegmentImageConfigOrDict = Union[SegmentImageConfig, SegmentImageConfigDict] + + +class _SegmentImageParameters(_common.BaseModel): + """The parameters for segmenting an image.""" + + model: Optional[str] = Field( + default=None, + description="""ID of the model to use. For a list of models, see `Google models + `_.""", + ) + source: Optional[SegmentImageSource] = Field( + default=None, + description="""A set of source input(s) for image segmentation.""", + ) + config: Optional[SegmentImageConfig] = Field( + default=None, description="""Configuration for image segmentation.""" + ) + + +class _SegmentImageParametersDict(TypedDict, total=False): + """The parameters for segmenting an image.""" + + model: Optional[str] + """ID of the model to use. For a list of models, see `Google models + `_.""" + + source: Optional[SegmentImageSourceDict] + """A set of source input(s) for image segmentation.""" + + config: Optional[SegmentImageConfigDict] + """Configuration for image segmentation.""" + + +_SegmentImageParametersOrDict = Union[ + _SegmentImageParameters, _SegmentImageParametersDict +] + + +class EntityLabel(_common.BaseModel): + """An entity representing the segmented area.""" + + label: Optional[str] = Field( + default=None, description="""The label of the segmented entity.""" + ) + score: Optional[float] = Field( + default=None, + description="""The confidence score of the detected label.""", + ) + + +class EntityLabelDict(TypedDict, total=False): + """An entity representing the segmented area.""" + + label: Optional[str] + """The label of the segmented entity.""" + + score: Optional[float] + """The confidence score of the detected label.""" + + +EntityLabelOrDict = Union[EntityLabel, EntityLabelDict] + + +class GeneratedImageMask(_common.BaseModel): + """A generated image mask.""" + + mask: Optional[Image] = Field( + default=None, description="""The generated image mask.""" + ) + labels: Optional[list[EntityLabel]] = Field( + default=None, + description="""The detected entities on the segmented area.""", + ) + + +class GeneratedImageMaskDict(TypedDict, total=False): + """A generated image mask.""" + + mask: Optional[ImageDict] + """The generated image mask.""" + + labels: Optional[list[EntityLabelDict]] + """The detected entities on the segmented area.""" + + +GeneratedImageMaskOrDict = Union[GeneratedImageMask, GeneratedImageMaskDict] + + +class SegmentImageResponse(_common.BaseModel): + """The output images response.""" + + generated_masks: Optional[list[GeneratedImageMask]] = Field( + default=None, + description="""List of generated image masks. + """, + ) + + +class SegmentImageResponseDict(TypedDict, total=False): + """The output images response.""" + + generated_masks: Optional[list[GeneratedImageMaskDict]] + """List of generated image masks. + """ + + +SegmentImageResponseOrDict = Union[ + SegmentImageResponse, SegmentImageResponseDict +] + + class GetModelConfig(_common.BaseModel): """Optional parameters for models.get method.""" From 3abf4414002cde35c8f6d023271b12577bc98016 Mon Sep 17 00:00:00 2001 From: Amy Wu Date: Thu, 14 Aug 2025 16:41:44 -0700 Subject: [PATCH 2/9] fix: Fix the bug to support Gemini Batch inlined requests system instruction PiperOrigin-RevId: 795249849 --- google/genai/batches.py | 140 ++++++++++++++++++ .../test_create_with_inlined_requests.py | 18 ++- 2 files changed, 157 insertions(+), 1 deletion(-) diff --git a/google/genai/batches.py b/google/genai/batches.py index 3a56b9314..811c15eef 100644 --- a/google/genai/batches.py +++ b/google/genai/batches.py @@ -2257,6 +2257,17 @@ def create( ) print(batch_job.state) """ + parameter_model = types._CreateBatchJobParameters( + model=model, + src=src, + config=config, + ) + http_options: Optional[types.HttpOptions] = None + if ( + parameter_model.config is not None + and parameter_model.config.http_options is not None + ): + http_options = parameter_model.config.http_options if self._api_client.vertexai: if isinstance(src, list): raise ValueError( @@ -2265,6 +2276,65 @@ def create( ) config = _extra_utils.format_destination(src, config) + else: + if isinstance(parameter_model.src, list) or ( + not isinstance(parameter_model.src, str) + and parameter_model.src + and parameter_model.src.inlined_requests + ): + # Handle system instruction in InlinedRequests. + request_url_dict: Optional[dict[str, str]] + request_dict: dict[str, Any] = _CreateBatchJobParameters_to_mldev( + self._api_client, parameter_model + ) + request_url_dict = request_dict.get('_url') + if request_url_dict: + path = '{model}:batchGenerateContent'.format_map(request_url_dict) + else: + path = '{model}:batchGenerateContent' + query_params = request_dict.get('_query') + if query_params: + path = f'{path}?{urlencode(query_params)}' + request_dict.pop('config', None) + + request_dict = _common.convert_to_dict(request_dict) + request_dict = _common.encode_unserializable_types(request_dict) + # Move system instruction to 'request': + # {'systemInstruction': system_instruction} + requests = [] + batch_dict = request_dict.get('batch') + if batch_dict and isinstance(batch_dict, dict): + input_config_dict = batch_dict.get('inputConfig') + if input_config_dict and isinstance(input_config_dict, dict): + requests_dict = input_config_dict.get('requests') + if requests_dict and isinstance(requests_dict, dict): + requests = requests_dict.get('requests') + new_requests = [] + if requests: + for req in requests: + if req.get('systemInstruction'): + value = req.pop('systemInstruction') + req['request'].update({'systemInstruction': value}) + new_requests.append(req) + request_dict['batch']['inputConfig']['requests'][ # type: ignore + 'requests' + ] = new_requests + + response = self._api_client.request( + 'post', path, request_dict, http_options + ) + + response_dict = '' if not response.body else json.loads(response.body) + + response_dict = _BatchJob_from_mldev(response_dict) + + return_value = types.BatchJob._from_response( + response=response_dict, kwargs=parameter_model.model_dump() + ) + + self._api_client._verify_response(return_value) + return return_value + return self._create(model=model, src=src, config=config) def list( @@ -2691,6 +2761,17 @@ async def create( src="gs://path/to/input/data", ) """ + parameter_model = types._CreateBatchJobParameters( + model=model, + src=src, + config=config, + ) + http_options: Optional[types.HttpOptions] = None + if ( + parameter_model.config is not None + and parameter_model.config.http_options is not None + ): + http_options = parameter_model.config.http_options if self._api_client.vertexai: if isinstance(src, list): raise ValueError( @@ -2699,6 +2780,65 @@ async def create( ) config = _extra_utils.format_destination(src, config) + else: + if isinstance(parameter_model.src, list) or ( + not isinstance(parameter_model.src, str) + and parameter_model.src + and parameter_model.src.inlined_requests + ): + # Handle system instruction in InlinedRequests. + request_url_dict: Optional[dict[str, str]] + request_dict: dict[str, Any] = _CreateBatchJobParameters_to_mldev( + self._api_client, parameter_model + ) + request_url_dict = request_dict.get('_url') + if request_url_dict: + path = '{model}:batchGenerateContent'.format_map(request_url_dict) + else: + path = '{model}:batchGenerateContent' + query_params = request_dict.get('_query') + if query_params: + path = f'{path}?{urlencode(query_params)}' + request_dict.pop('config', None) + + request_dict = _common.convert_to_dict(request_dict) + request_dict = _common.encode_unserializable_types(request_dict) + # Move system instruction to 'request': + # {'systemInstruction': system_instruction} + requests = [] + batch_dict = request_dict.get('batch') + if batch_dict and isinstance(batch_dict, dict): + input_config_dict = batch_dict.get('inputConfig') + if input_config_dict and isinstance(input_config_dict, dict): + requests_dict = input_config_dict.get('requests') + if requests_dict and isinstance(requests_dict, dict): + requests = requests_dict.get('requests') + new_requests = [] + if requests: + for req in requests: + if req.get('systemInstruction'): + value = req.pop('systemInstruction') + req['request'].update({'systemInstruction': value}) + new_requests.append(req) + request_dict['batch']['inputConfig']['requests'][ # type: ignore + 'requests' + ] = new_requests + + response = await self._api_client.async_request( + 'post', path, request_dict, http_options + ) + + response_dict = '' if not response.body else json.loads(response.body) + + response_dict = _BatchJob_from_mldev(response_dict) + + return_value = types.BatchJob._from_response( + response=response_dict, kwargs=parameter_model.model_dump() + ) + + self._api_client._verify_response(return_value) + return return_value + return await self._create(model=model, src=src, config=config) async def list( diff --git a/google/genai/tests/batches/test_create_with_inlined_requests.py b/google/genai/tests/batches/test_create_with_inlined_requests.py index 3faf8c40f..980bb0cee 100644 --- a/google/genai/tests/batches/test_create_with_inlined_requests.py +++ b/google/genai/tests/batches/test_create_with_inlined_requests.py @@ -39,12 +39,17 @@ _INLINED_TEXT_REQUEST = { 'contents': [{ 'parts': [{ - 'text': 'What is the QQQ stock price?', + 'text': 'high', }], 'role': 'user', }], 'config': { 'response_modalities': ['TEXT'], + 'system_instruction': 'I say high, you say low', + 'thinking_config': { + 'include_thoughts': True, + 'thinking_budget': 4000, + }, }, } _INLINED_IMAGE_REQUEST = { @@ -130,6 +135,17 @@ ), pytest_helper.TestTableItem( name='test_with_inlined_request', + parameters=types._CreateBatchJobParameters( + model=_MLDEV_GEMINI_MODEL, + src={'inlined_requests': [_INLINED_REQUEST]}, + config={ + 'display_name': _DISPLAY_NAME, + }, + ), + exception_if_vertex='not supported', + ), + pytest_helper.TestTableItem( + name='test_union_with_inlined_request_system_instruction', parameters=types._CreateBatchJobParameters( model=_MLDEV_GEMINI_MODEL, src={'inlined_requests': [_INLINED_TEXT_REQUEST]}, From 91f3ed7d1516a1850f89934a7694cf3668b81c51 Mon Sep 17 00:00:00 2001 From: Qiao Wang Date: Fri, 15 Aug 2025 11:00:03 -0700 Subject: [PATCH 3/9] chore: Add `hasUnion` flag to a batch creation test case PiperOrigin-RevId: 795535359 --- google/genai/tests/batches/test_create_with_inlined_requests.py | 1 + 1 file changed, 1 insertion(+) diff --git a/google/genai/tests/batches/test_create_with_inlined_requests.py b/google/genai/tests/batches/test_create_with_inlined_requests.py index 980bb0cee..67455a5e2 100644 --- a/google/genai/tests/batches/test_create_with_inlined_requests.py +++ b/google/genai/tests/batches/test_create_with_inlined_requests.py @@ -153,6 +153,7 @@ 'display_name': _DISPLAY_NAME, }, ), + has_union=True, exception_if_vertex='not supported', ), pytest_helper.TestTableItem( From 26a7b62bf786498315287a7f4619695c3d68a495 Mon Sep 17 00:00:00 2001 From: Amy Wu Date: Fri, 15 Aug 2025 15:08:45 -0700 Subject: [PATCH 4/9] chore: internal change PiperOrigin-RevId: 795628626 --- google/genai/_api_client.py | 64 +++++++++---------- .../genai/_automatic_function_calling_util.py | 12 ++++ google/genai/_live_converters.py | 1 + google/genai/_tokens_converters.py | 1 + google/genai/batches.py | 1 + google/genai/caches.py | 1 + google/genai/files.py | 1 + google/genai/models.py | 1 + google/genai/operations.py | 1 + .../client/test_client_initialization.py | 21 +++--- .../tests/client/test_client_requests.py | 14 ++-- .../genai/tests/client/test_http_options.py | 6 +- google/genai/tests/client/test_retries.py | 8 +-- google/genai/tests/conftest.py | 6 ++ google/genai/tests/tokens/test_create.py | 14 ++-- google/genai/tunings.py | 1 + 16 files changed, 90 insertions(+), 63 deletions(-) diff --git a/google/genai/_api_client.py b/google/genai/_api_client.py index f46534bca..021cedbfd 100644 --- a/google/genai/_api_client.py +++ b/google/genai/_api_client.py @@ -91,7 +91,7 @@ class EphemeralTokenAPIKeyError(ValueError): # This method checks for the API key in the environment variables. Google API # key is precedenced over Gemini API key. -def _get_env_api_key() -> Optional[str]: +def get_env_api_key() -> Optional[str]: """Gets the API key from environment variables, prioritizing GOOGLE_API_KEY. Returns: @@ -108,7 +108,7 @@ def _get_env_api_key() -> Optional[str]: return env_google_api_key or env_gemini_api_key or None -def _append_library_version_headers(headers: dict[str, str]) -> None: +def append_library_version_headers(headers: dict[str, str]) -> None: """Appends the telemetry header to the headers dict.""" library_label = f'google-genai-sdk/{version.__version__}' language_label = 'gl-python/' + sys.version.split()[0] @@ -131,7 +131,7 @@ def _append_library_version_headers(headers: dict[str, str]) -> None: headers['x-goog-api-client'] = version_header_value -def _patch_http_options( +def patch_http_options( options: HttpOptions, patch_options: HttpOptions ) -> HttpOptions: copy_option = options.model_copy() @@ -155,11 +155,11 @@ def _patch_http_options( setattr(copy_option, key, getattr(options, key)) if copy_option.headers is not None: - _append_library_version_headers(copy_option.headers) + append_library_version_headers(copy_option.headers) return copy_option -def _populate_server_timeout_header( +def populate_server_timeout_header( headers: dict[str, str], timeout_in_seconds: Optional[Union[float, int]] ) -> None: """Populates the server timeout header in the headers dict.""" @@ -167,7 +167,7 @@ def _populate_server_timeout_header( headers['X-Server-Timeout'] = str(math.ceil(timeout_in_seconds)) -def _join_url_path(base_url: str, path: str) -> str: +def join_url_path(base_url: str, path: str) -> str: parsed_base = urlparse(base_url) base_path = ( parsed_base.path[:-1] @@ -178,7 +178,7 @@ def _join_url_path(base_url: str, path: str) -> str: return urlunparse(parsed_base._replace(path=base_path + '/' + path)) -def _load_auth(*, project: Union[str, None]) -> Tuple[Credentials, str]: +def load_auth(*, project: Union[str, None]) -> Tuple[Credentials, str]: """Loads google auth credentials and project id.""" credentials, loaded_project_id = google.auth.default( # type: ignore[no-untyped-call] scopes=['https://www.googleapis.com/auth/cloud-platform'], @@ -195,12 +195,12 @@ def _load_auth(*, project: Union[str, None]) -> Tuple[Credentials, str]: return credentials, project -def _refresh_auth(credentials: Credentials) -> Credentials: +def refresh_auth(credentials: Credentials) -> Credentials: credentials.refresh(Request()) # type: ignore[no-untyped-call] return credentials -def _get_timeout_in_seconds( +def get_timeout_in_seconds( timeout: Optional[Union[float, int]], ) -> Optional[float]: """Converts the timeout to seconds.""" @@ -454,7 +454,7 @@ def _load_json_from_response(cls, response: Any) -> Any: ) -def _retry_args(options: Optional[HttpRetryOptions]) -> _common.StringDict: +def retry_args(options: Optional[HttpRetryOptions]) -> _common.StringDict: """Returns the retry args for the given http retry options. Args: @@ -574,7 +574,7 @@ def __init__( # Retrieve implicitly set values from the environment. env_project = os.environ.get('GOOGLE_CLOUD_PROJECT', None) env_location = os.environ.get('GOOGLE_CLOUD_LOCATION', None) - env_api_key = _get_env_api_key() + env_api_key = get_env_api_key() self.project = project or env_project self.location = location or env_location self.api_key = api_key or env_api_key @@ -631,7 +631,7 @@ def __init__( and not self.api_key and not validated_http_options.base_url ): - credentials, self.project = _load_auth(project=None) + credentials, self.project = load_auth(project=None) if not self._credentials: self._credentials = credentials @@ -670,12 +670,12 @@ def __init__( self._http_options.headers['x-goog-api-key'] = self.api_key # Update the http options with the user provided http options. if http_options: - self._http_options = _patch_http_options( + self._http_options = patch_http_options( self._http_options, validated_http_options ) else: if self._http_options.headers is not None: - _append_library_version_headers(self._http_options.headers) + append_library_version_headers(self._http_options.headers) client_args, async_client_args = self._ensure_httpx_ssl_ctx( self._http_options @@ -689,7 +689,7 @@ def __init__( ) self._websocket_ssl_ctx = self._ensure_websocket_ssl_ctx(self._http_options) - retry_kwargs = _retry_args(self._http_options.retry_options) + retry_kwargs = retry_args(self._http_options.retry_options) self._retry = tenacity.Retrying(**retry_kwargs) self._async_retry = tenacity.AsyncRetrying(**retry_kwargs) @@ -889,14 +889,14 @@ def _access_token(self) -> str: """Retrieves the access token for the credentials.""" with self._sync_auth_lock: if not self._credentials: - self._credentials, project = _load_auth(project=self.project) + self._credentials, project = load_auth(project=self.project) if not self.project: self.project = project if self._credentials: if self._credentials.expired or not self._credentials.token: # Only refresh when it needs to. Default expiration is 3600 seconds. - _refresh_auth(self._credentials) + refresh_auth(self._credentials) if not self._credentials.token: raise RuntimeError('Could not resolve API token from the environment') return self._credentials.token # type: ignore[no-any-return] @@ -912,7 +912,7 @@ async def _async_access_token(self) -> Union[str, Any]: if not self._credentials: # Double check that the credentials are not set before loading them. self._credentials, project = await asyncio.to_thread( - _load_auth, project=self.project + load_auth, project=self.project ) if not self.project: self.project = project @@ -923,7 +923,7 @@ async def _async_access_token(self) -> Union[str, Any]: async with self._async_auth_lock: if self._credentials.expired or not self._credentials.token: # Double check that the credentials expired before refreshing. - await asyncio.to_thread(_refresh_auth, self._credentials) + await asyncio.to_thread(refresh_auth, self._credentials) if not self._credentials.token: raise RuntimeError('Could not resolve API token from the environment') @@ -946,12 +946,12 @@ def _build_request( # patch the http options with the user provided settings. if http_options: if isinstance(http_options, HttpOptions): - patched_http_options = _patch_http_options( + patched_http_options = patch_http_options( self._http_options, http_options, ) else: - patched_http_options = _patch_http_options( + patched_http_options = patch_http_options( self._http_options, HttpOptions.model_validate(http_options) ) else: @@ -993,7 +993,7 @@ def _build_request( request_dict, patched_http_options.extra_body ) - url = _join_url_path( + url = join_url_path( base_url, versioned_path, ) @@ -1003,11 +1003,11 @@ def _build_request( 'Ephemeral tokens can only be used with the live API.' ) - timeout_in_seconds = _get_timeout_in_seconds(patched_http_options.timeout) + timeout_in_seconds = get_timeout_in_seconds(patched_http_options.timeout) if patched_http_options.headers is None: raise ValueError('Request headers must be set.') - _populate_server_timeout_header( + populate_server_timeout_header( patched_http_options.headers, timeout_in_seconds ) return HttpRequest( @@ -1079,7 +1079,7 @@ def _request( ) # Support per request retry options. if parameter_model.retry_options: - retry_kwargs = _retry_args(parameter_model.retry_options) + retry_kwargs = retry_args(parameter_model.retry_options) retry = tenacity.Retrying(**retry_kwargs) return retry(self._request_once, http_request, stream) # type: ignore[no-any-return] @@ -1239,7 +1239,7 @@ async def _async_request( ) # Support per request retry options. if parameter_model.retry_options: - retry_kwargs = _retry_args(parameter_model.retry_options) + retry_kwargs = retry_args(parameter_model.retry_options) retry = tenacity.AsyncRetrying(**retry_kwargs) return await retry(self._async_request_once, http_request, stream) # type: ignore[no-any-return] return await self._async_retry( # type: ignore[no-any-return] @@ -1398,13 +1398,13 @@ def _upload_fd( if isinstance(self._http_options, dict) else self._http_options.timeout ) - timeout_in_seconds = _get_timeout_in_seconds(timeout) + timeout_in_seconds = get_timeout_in_seconds(timeout) upload_headers = { 'X-Goog-Upload-Command': upload_command, 'X-Goog-Upload-Offset': str(offset), 'Content-Length': str(chunk_size), } - _populate_server_timeout_header(upload_headers, timeout_in_seconds) + populate_server_timeout_header(upload_headers, timeout_in_seconds) retry_count = 0 while retry_count < MAX_RETRY_COUNT: response = self._httpx_client.request( @@ -1558,13 +1558,13 @@ async def _async_upload_fd( if isinstance(self._http_options, dict) else self._http_options.timeout ) - timeout_in_seconds = _get_timeout_in_seconds(timeout) + timeout_in_seconds = get_timeout_in_seconds(timeout) upload_headers = { 'X-Goog-Upload-Command': upload_command, 'X-Goog-Upload-Offset': str(offset), 'Content-Length': str(chunk_size), } - _populate_server_timeout_header(upload_headers, timeout_in_seconds) + populate_server_timeout_header(upload_headers, timeout_in_seconds) retry_count = 0 response = None @@ -1634,13 +1634,13 @@ async def _async_upload_fd( if isinstance(self._http_options, dict) else self._http_options.timeout ) - timeout_in_seconds = _get_timeout_in_seconds(timeout) + timeout_in_seconds = get_timeout_in_seconds(timeout) upload_headers = { 'X-Goog-Upload-Command': upload_command, 'X-Goog-Upload-Offset': str(offset), 'Content-Length': str(chunk_size), } - _populate_server_timeout_header(upload_headers, timeout_in_seconds) + populate_server_timeout_header(upload_headers, timeout_in_seconds) retry_count = 0 client_response = None diff --git a/google/genai/_automatic_function_calling_util.py b/google/genai/_automatic_function_calling_util.py index 3a9ffbe7a..ec7f9a702 100644 --- a/google/genai/_automatic_function_calling_util.py +++ b/google/genai/_automatic_function_calling_util.py @@ -30,6 +30,18 @@ else: VersionedUnionType = typing._UnionGenericAlias # type: ignore[attr-defined] + +__all__ = [ + '_py_builtin_type_to_schema_type', + '_raise_for_unsupported_param', + '_handle_params_as_deferred_annotations', + '_add_unevaluated_items_to_fixed_len_tuple_schema', + '_is_builtin_primitive_or_compound', + '_is_default_value_compatible', + '_parse_schema_from_parameter', + '_get_required_fields', +] + _py_builtin_type_to_schema_type = { str: types.Type.STRING, int: types.Type.INTEGER, diff --git a/google/genai/_live_converters.py b/google/genai/_live_converters.py index 119c75b9a..5aac6d1c8 100644 --- a/google/genai/_live_converters.py +++ b/google/genai/_live_converters.py @@ -16,6 +16,7 @@ # Code generated by the Google Gen AI SDK generator DO NOT EDIT. from typing import Any, Optional, Union + from . import _transformers as t from ._api_client import BaseApiClient from ._common import get_value_by_path as getv diff --git a/google/genai/_tokens_converters.py b/google/genai/_tokens_converters.py index 74ed98acf..20d3c107a 100644 --- a/google/genai/_tokens_converters.py +++ b/google/genai/_tokens_converters.py @@ -16,6 +16,7 @@ # Code generated by the Google Gen AI SDK generator DO NOT EDIT. from typing import Any, Optional, Union + from . import _transformers as t from ._api_client import BaseApiClient from ._common import get_value_by_path as getv diff --git a/google/genai/batches.py b/google/genai/batches.py index 811c15eef..7f3559e43 100644 --- a/google/genai/batches.py +++ b/google/genai/batches.py @@ -30,6 +30,7 @@ from ._common import set_value_by_path as setv from .pagers import AsyncPager, Pager + logger = logging.getLogger('google_genai.batches') diff --git a/google/genai/caches.py b/google/genai/caches.py index d56c4f1c0..91538fab2 100644 --- a/google/genai/caches.py +++ b/google/genai/caches.py @@ -29,6 +29,7 @@ from ._common import set_value_by_path as setv from .pagers import AsyncPager, Pager + logger = logging.getLogger('google_genai.caches') diff --git a/google/genai/files.py b/google/genai/files.py index 7babdf151..e16050799 100644 --- a/google/genai/files.py +++ b/google/genai/files.py @@ -31,6 +31,7 @@ from ._common import set_value_by_path as setv from .pagers import AsyncPager, Pager + logger = logging.getLogger('google_genai.files') diff --git a/google/genai/models.py b/google/genai/models.py index e414e9d9b..ff43d03d8 100644 --- a/google/genai/models.py +++ b/google/genai/models.py @@ -32,6 +32,7 @@ from ._common import set_value_by_path as setv from .pagers import AsyncPager, Pager + logger = logging.getLogger('google_genai.models') diff --git a/google/genai/operations.py b/google/genai/operations.py index 796b002cf..71158c6f7 100644 --- a/google/genai/operations.py +++ b/google/genai/operations.py @@ -26,6 +26,7 @@ from ._common import get_value_by_path as getv from ._common import set_value_by_path as setv + logger = logging.getLogger('google_genai.operations') diff --git a/google/genai/tests/client/test_client_initialization.py b/google/genai/tests/client/test_client_initialization.py index b961d76d5..97dc0f0f0 100644 --- a/google/genai/tests/client/test_client_initialization.py +++ b/google/genai/tests/client/test_client_initialization.py @@ -30,6 +30,7 @@ from ... import _base_url as base_url from ... import _replay_api_client as replay_api_client from ... import Client +from ... import types @pytest.fixture(autouse=True) @@ -223,12 +224,12 @@ def test_constructor_with_invalid_http_options_key(): def test_constructor_with_http_options_as_pydantic_type(): - mldev_http_options = api_client.HttpOptions( + mldev_http_options = types.HttpOptions( api_version="v1", base_url="https://placeholder-fake-url.com/", headers={"X-Custom-Header": "custom_value"}, ) - vertexai_http_options = api_client.HttpOptions( + vertexai_http_options = types.HttpOptions( api_version="v1", base_url=( "https://{self.location}-aiplatform.googleapis.com/{{api_version}}/" @@ -751,7 +752,7 @@ def test_client_logs_to_logger_instance(monkeypatch, caplog): def test_client_ssl_context_implicit_initialization(): client_args, async_client_args = ( - api_client.BaseApiClient._ensure_httpx_ssl_ctx(api_client.HttpOptions()) + api_client.BaseApiClient._ensure_httpx_ssl_ctx(types.HttpOptions()) ) assert client_args["verify"] @@ -760,7 +761,7 @@ def test_client_ssl_context_implicit_initialization(): import aiohttp # pylint: disable=g-import-not-at-top async_client_args = api_client.BaseApiClient._ensure_aiohttp_ssl_ctx( - api_client.HttpOptions() + types.HttpOptions() ) assert async_client_args["ssl"] assert isinstance(async_client_args["ssl"], ssl.SSLContext) @@ -775,7 +776,7 @@ def test_client_ssl_context_explicit_initialization_same_args(): capath=os.environ.get("SSL_CERT_DIR"), ) - options = api_client.HttpOptions( + options = types.HttpOptions( client_args={"verify": ctx}, async_client_args={"verify": ctx} ) client_args, async_client_args = ( @@ -807,7 +808,7 @@ def test_client_ssl_context_explicit_initialization_separate_args(): capath=os.environ.get("SSL_CERT_DIR"), ) - options = api_client.HttpOptions( + options = types.HttpOptions( client_args={"verify": ctx}, async_client_args={"verify": async_ctx} ) client_args, async_client_args = ( @@ -834,7 +835,7 @@ def test_client_ssl_context_explicit_initialization_sync_args(): capath=os.environ.get("SSL_CERT_DIR"), ) - options = api_client.HttpOptions(client_args={"verify": ctx}) + options = types.HttpOptions(client_args={"verify": ctx}) client_args, async_client_args = ( api_client.BaseApiClient._ensure_httpx_ssl_ctx(options) ) @@ -859,7 +860,7 @@ def test_client_ssl_context_explicit_initialization_async_args(): capath=os.environ.get("SSL_CERT_DIR"), ) - options = api_client.HttpOptions(async_client_args={"verify": ctx}) + options = types.HttpOptions(async_client_args={"verify": ctx}) client_args, async_client_args = ( api_client.BaseApiClient._ensure_httpx_ssl_ctx(options) ) @@ -1097,7 +1098,7 @@ def test_async_async_client_args_without_transport_allows_aiohttp_to_be_used(): vertexai=True, project="fake_project_id", location="fake-location", - http_options=api_client.HttpOptions(async_client_args={}), + http_options=types.HttpOptions(async_client_args={}), ) api_client.has_aiohttp = False @@ -1113,7 +1114,7 @@ def test_async_transport_forces_httpx_regardless_of_aiohttp_availability(): vertexai=True, project="fake_project_id", location="fake-location", - http_options=api_client.HttpOptions( + http_options=types.HttpOptions( async_client_args={"transport": httpx.AsyncBaseTransport()} ), ) diff --git a/google/genai/tests/client/test_client_requests.py b/google/genai/tests/client/test_client_requests.py index 03f2df9c5..e83fa1cb4 100644 --- a/google/genai/tests/client/test_client_requests.py +++ b/google/genai/tests/client/test_client_requests.py @@ -32,7 +32,7 @@ def test_join_url_path_base_url_with_trailing_slash_and_path_with_leading_slash( base_url = 'https://fake-url.com/some_path/' path = '/v1beta/models' assert ( - api_client._join_url_path(base_url, path) + api_client.join_url_path(base_url, path) == 'https://fake-url.com/some_path/v1beta/models' ) @@ -41,7 +41,7 @@ def test_join_url_path_with_base_url_with_trailing_slash_and_path_without_leadin base_url = 'https://fake-url.com/some_path/' path = 'v1beta/models' assert ( - api_client._join_url_path(base_url, path) + api_client.join_url_path(base_url, path) == 'https://fake-url.com/some_path/v1beta/models' ) @@ -50,7 +50,7 @@ def test_join_url_path_with_base_url_without_trailing_slash_and_path_with_leadin base_url = 'https://fake-url.com/some_path' path = '/v1beta/models' assert ( - api_client._join_url_path(base_url, path) + api_client.join_url_path(base_url, path) == 'https://fake-url.com/some_path/v1beta/models' ) @@ -59,7 +59,7 @@ def test_join_url_path_with_base_url_without_trailing_slash_and_path_without_lea base_url = 'https://fake-url.com/some_path' path = 'v1beta/models' assert ( - api_client._join_url_path(base_url, path) + api_client.join_url_path(base_url, path) == 'https://fake-url.com/some_path/v1beta/models' ) @@ -68,7 +68,7 @@ def test_join_url_path_base_url_without_path_with_trailing_slash(): base_url = 'https://fake-url.com/' path = 'v1beta/models' assert ( - api_client._join_url_path(base_url, path) + api_client.join_url_path(base_url, path) == 'https://fake-url.com/v1beta/models' ) @@ -77,7 +77,7 @@ def test_join_url_path_base_url_without_path_without_trailing_slash(): base_url = 'https://fake-url.com' path = 'v1beta/models' assert ( - api_client._join_url_path(base_url, path) + api_client.join_url_path(base_url, path) == 'https://fake-url.com/v1beta/models' ) @@ -129,7 +129,7 @@ def test_build_request_appends_to_goog_api_client_headers(monkeypatch): def test_build_request_keeps_sdk_version_headers(monkeypatch): headers_to_inject = {} - api_client._append_library_version_headers(headers_to_inject) + api_client.append_library_version_headers(headers_to_inject) assert 'google-genai-sdk/' in headers_to_inject['user-agent'] request_client = build_test_client(monkeypatch).models._api_client request = request_client._build_request( diff --git a/google/genai/tests/client/test_http_options.py b/google/genai/tests/client/test_http_options.py index 354d562ec..9b89892aa 100644 --- a/google/genai/tests/client/test_http_options.py +++ b/google/genai/tests/client/test_http_options.py @@ -33,7 +33,7 @@ def test_patch_http_options_with_copies_all_fields(): retry_options=types.HttpRetryOptions(attempts=10), ) options = types.HttpOptions() - patched = _api_client._patch_http_options(options, patch_options) + patched = _api_client.patch_http_options(options, patch_options) http_options_keys = types.HttpOptions.model_fields.keys() for key in http_options_keys: @@ -60,7 +60,7 @@ def test_patch_http_options_merges_headers(): headers={'X-Custom-Header': 'custom_value'}, timeout=10000, ) - patched = _api_client._patch_http_options(original_options, patch_options) + patched = _api_client.patch_http_options(original_options, patch_options) # If the header is present in both the original and patch options, the patch # options value should be used assert patched.headers['X-Custom-Header'] == 'custom_value' @@ -81,7 +81,7 @@ def test_patch_http_options_appends_version_headers(): headers={'X-Custom-Header': 'custom_value'}, timeout=10000, ) - patched = _api_client._patch_http_options(original_options, patch_options) + patched = _api_client.patch_http_options(original_options, patch_options) assert 'user-agent' in patched.headers assert 'x-goog-api-client' in patched.headers diff --git a/google/genai/tests/client/test_retries.py b/google/genai/tests/client/test_retries.py index 48531e509..ec6de7cb9 100644 --- a/google/genai/tests/client/test_retries.py +++ b/google/genai/tests/client/test_retries.py @@ -73,7 +73,7 @@ def _httpx_response(code: int): def test_retry_args_disabled(): - args = api_client._retry_args(None) + args = api_client.retry_args(None) assert set(args.keys()) == {'stop', 'reraise'} assert args['stop'].max_attempt_number == 1 @@ -82,7 +82,7 @@ def test_retry_args_disabled(): def test_retry_args_enabled_with_defaults(): # Empty options means use the default values whereas None means no retries. - args = api_client._retry_args(types.HttpRetryOptions()) + args = api_client.retry_args(types.HttpRetryOptions()) assert set(args.keys()) == {'stop', 'retry', 'wait', 'reraise'} @@ -122,7 +122,7 @@ def fn(): raise errors.APIError.raise_for_response(_httpx_response(429)) retrying = tenacity.Retrying( - **api_client._retry_args(types.HttpRetryOptions()) + **api_client.retry_args(types.HttpRetryOptions()) ) try: @@ -147,7 +147,7 @@ def test_retry_args_enabled_with_custom_values_are_not_overridden(): jitter=0.5, http_status_codes=[408, 429], ) - retry_args = api_client._retry_args(options) + retry_args = api_client.retry_args(options) assert retry_args['stop'].max_attempt_number == 10 wait = retry_args['wait'] diff --git a/google/genai/tests/conftest.py b/google/genai/tests/conftest.py index a1726fc98..25844f3e3 100644 --- a/google/genai/tests/conftest.py +++ b/google/genai/tests/conftest.py @@ -41,6 +41,12 @@ def pytest_addoption(parser): * tap: Always replay, fail if replay files do not exist. Also sets default values for the API key and replay directory. """, ) + parser.addoption( + '--private', + action='store_true', + default=False, + help='Run private tests.', + ) # Overridden via parameterized test. diff --git a/google/genai/tests/tokens/test_create.py b/google/genai/tests/tokens/test_create.py index 1cf93f048..4b7abca27 100644 --- a/google/genai/tests/tokens/test_create.py +++ b/google/genai/tests/tokens/test_create.py @@ -30,7 +30,7 @@ pytest_helper.TestTableItem( name='test_create_no_lock', parameters=types.CreateAuthTokenParameters( - # remove v1alpha1 after v1beta is available. + # remove v1alpha after v1beta is available. config={'http_options': {'api_version': 'v1alpha'}}, ), exception_if_vertex='only supported in the Gemini Developer client', @@ -38,7 +38,7 @@ pytest_helper.TestTableItem( name='test_create_global_lock', parameters=types.CreateAuthTokenParameters( - # remove v1alpha1 after v1beta is available. + # remove v1alpha after v1beta is available. config={ 'http_options': {'api_version': 'v1alpha'}, 'uses': 2, @@ -56,7 +56,7 @@ pytest_helper.TestTableItem( name='test_create_lock_non_null_fields', parameters=types.CreateAuthTokenParameters( - # remove v1alpha1 after v1beta is available. + # remove v1alpha after v1beta is available. config={ 'http_options': {'api_version': 'v1alpha'}, 'uses': 2, @@ -75,7 +75,7 @@ pytest_helper.TestTableItem( name='test_create_lock_unset_fields_as_default', parameters=types.CreateAuthTokenParameters( - # remove v1alpha1 after v1beta is available. + # remove v1alpha after v1beta is available. config={ 'http_options': {'api_version': 'v1alpha'}, 'uses': 2, @@ -94,7 +94,7 @@ pytest_helper.TestTableItem( name='test_create_lock_additional_fields', parameters=types.CreateAuthTokenParameters( - # remove v1alpha1 after v1beta is available. + # remove v1alpha after v1beta is available. config={ 'http_options': {'api_version': 'v1alpha'}, 'uses': 2, @@ -113,7 +113,7 @@ pytest_helper.TestTableItem( name='test_create_lock_with_no_params', parameters=types.CreateAuthTokenParameters( - # remove v1alpha1 after v1beta is available. + # remove v1alpha after v1beta is available. config={ 'http_options': {'api_version': 'v1alpha'}, 'lock_additional_fields': ['output_audio_transcription'], @@ -124,7 +124,7 @@ pytest_helper.TestTableItem( name='test_create_lock_with_empty_params', parameters=types.CreateAuthTokenParameters( - # remove v1alpha1 after v1beta is available. + # remove v1alpha after v1beta is available. config={ 'http_options': {'api_version': 'v1alpha'}, 'lock_additional_fields': ['output_audio_transcription'], diff --git a/google/genai/tunings.py b/google/genai/tunings.py index e0f1239f4..9883ac37d 100644 --- a/google/genai/tunings.py +++ b/google/genai/tunings.py @@ -28,6 +28,7 @@ from ._common import set_value_by_path as setv from .pagers import AsyncPager, Pager + logger = logging.getLogger('google_genai.tunings') From dd9ac87053e97d55a46fb896ce16dfbc79fe2624 Mon Sep 17 00:00:00 2001 From: Mark Daoust Date: Sat, 16 Aug 2025 09:41:28 -0700 Subject: [PATCH 5/9] chore: Refresh docs for 1.30.0 PiperOrigin-RevId: 795859299 --- docs/genai.html | 9000 +++++++++++++++++++++---------------------- docs/genindex.html | 548 ++- docs/index.html | 328 +- docs/modules.html | 328 +- docs/objects.inv | Bin 18979 -> 19675 bytes docs/searchindex.js | 2 +- 6 files changed, 5121 insertions(+), 5085 deletions(-) diff --git a/docs/genai.html b/docs/genai.html index 3908cb1df..6147992a7 100644 --- a/docs/genai.html +++ b/docs/genai.html @@ -2299,6 +2299,49 @@