google-genai 1.44.0__tar.gz → 1.45.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (45) hide show
  1. {google_genai-1.44.0/google_genai.egg-info → google_genai-1.45.0}/PKG-INFO +21 -1
  2. {google_genai-1.44.0 → google_genai-1.45.0}/README.md +19 -0
  3. {google_genai-1.44.0 → google_genai-1.45.0}/google/genai/_api_client.py +1 -0
  4. {google_genai-1.44.0 → google_genai-1.45.0}/google/genai/_common.py +1 -3
  5. {google_genai-1.44.0 → google_genai-1.45.0}/google/genai/_replay_api_client.py +8 -3
  6. {google_genai-1.44.0 → google_genai-1.45.0}/google/genai/types.py +131 -16
  7. {google_genai-1.44.0 → google_genai-1.45.0}/google/genai/version.py +1 -1
  8. {google_genai-1.44.0 → google_genai-1.45.0/google_genai.egg-info}/PKG-INFO +21 -1
  9. {google_genai-1.44.0 → google_genai-1.45.0}/pyproject.toml +3 -2
  10. {google_genai-1.44.0 → google_genai-1.45.0}/LICENSE +0 -0
  11. {google_genai-1.44.0 → google_genai-1.45.0}/MANIFEST.in +0 -0
  12. {google_genai-1.44.0 → google_genai-1.45.0}/google/genai/__init__.py +0 -0
  13. {google_genai-1.44.0 → google_genai-1.45.0}/google/genai/_adapters.py +0 -0
  14. {google_genai-1.44.0 → google_genai-1.45.0}/google/genai/_api_module.py +0 -0
  15. {google_genai-1.44.0 → google_genai-1.45.0}/google/genai/_automatic_function_calling_util.py +0 -0
  16. {google_genai-1.44.0 → google_genai-1.45.0}/google/genai/_base_transformers.py +0 -0
  17. {google_genai-1.44.0 → google_genai-1.45.0}/google/genai/_base_url.py +0 -0
  18. {google_genai-1.44.0 → google_genai-1.45.0}/google/genai/_extra_utils.py +0 -0
  19. {google_genai-1.44.0 → google_genai-1.45.0}/google/genai/_live_converters.py +0 -0
  20. {google_genai-1.44.0 → google_genai-1.45.0}/google/genai/_local_tokenizer_loader.py +0 -0
  21. {google_genai-1.44.0 → google_genai-1.45.0}/google/genai/_mcp_utils.py +0 -0
  22. {google_genai-1.44.0 → google_genai-1.45.0}/google/genai/_operations_converters.py +0 -0
  23. {google_genai-1.44.0 → google_genai-1.45.0}/google/genai/_test_api_client.py +0 -0
  24. {google_genai-1.44.0 → google_genai-1.45.0}/google/genai/_tokens_converters.py +0 -0
  25. {google_genai-1.44.0 → google_genai-1.45.0}/google/genai/_transformers.py +0 -0
  26. {google_genai-1.44.0 → google_genai-1.45.0}/google/genai/batches.py +0 -0
  27. {google_genai-1.44.0 → google_genai-1.45.0}/google/genai/caches.py +0 -0
  28. {google_genai-1.44.0 → google_genai-1.45.0}/google/genai/chats.py +0 -0
  29. {google_genai-1.44.0 → google_genai-1.45.0}/google/genai/client.py +0 -0
  30. {google_genai-1.44.0 → google_genai-1.45.0}/google/genai/errors.py +0 -0
  31. {google_genai-1.44.0 → google_genai-1.45.0}/google/genai/files.py +0 -0
  32. {google_genai-1.44.0 → google_genai-1.45.0}/google/genai/live.py +0 -0
  33. {google_genai-1.44.0 → google_genai-1.45.0}/google/genai/live_music.py +0 -0
  34. {google_genai-1.44.0 → google_genai-1.45.0}/google/genai/local_tokenizer.py +0 -0
  35. {google_genai-1.44.0 → google_genai-1.45.0}/google/genai/models.py +0 -0
  36. {google_genai-1.44.0 → google_genai-1.45.0}/google/genai/operations.py +0 -0
  37. {google_genai-1.44.0 → google_genai-1.45.0}/google/genai/pagers.py +0 -0
  38. {google_genai-1.44.0 → google_genai-1.45.0}/google/genai/py.typed +0 -0
  39. {google_genai-1.44.0 → google_genai-1.45.0}/google/genai/tokens.py +0 -0
  40. {google_genai-1.44.0 → google_genai-1.45.0}/google/genai/tunings.py +0 -0
  41. {google_genai-1.44.0 → google_genai-1.45.0}/google_genai.egg-info/SOURCES.txt +0 -0
  42. {google_genai-1.44.0 → google_genai-1.45.0}/google_genai.egg-info/dependency_links.txt +0 -0
  43. {google_genai-1.44.0 → google_genai-1.45.0}/google_genai.egg-info/requires.txt +0 -0
  44. {google_genai-1.44.0 → google_genai-1.45.0}/google_genai.egg-info/top_level.txt +0 -0
  45. {google_genai-1.44.0 → google_genai-1.45.0}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: google-genai
3
- Version: 1.44.0
3
+ Version: 1.45.0
4
4
  Summary: GenAI Python SDK
5
5
  Author-email: Google LLC <googleapis-packages@google.com>
6
6
  License: Apache-2.0
@@ -15,6 +15,7 @@ Classifier: Programming Language :: Python :: 3.10
15
15
  Classifier: Programming Language :: Python :: 3.11
16
16
  Classifier: Programming Language :: Python :: 3.12
17
17
  Classifier: Programming Language :: Python :: 3.13
18
+ Classifier: Programming Language :: Python :: 3.14
18
19
  Classifier: Topic :: Internet
19
20
  Classifier: Topic :: Software Development :: Libraries :: Python Modules
20
21
  Requires-Python: >=3.9
@@ -279,6 +280,25 @@ http_options = types.HttpOptions(
279
280
  client=Client(..., http_options=http_options)
280
281
  ```
281
282
 
283
+ ### Custom base url
284
+
285
+ In some cases you might need a custom base url (for example, API gateway proxy
286
+ server) and bypass some authentication checks for project, location, or API key.
287
+ You may pass the custom base url like this:
288
+
289
+ ```python
290
+
291
+ base_url = 'https://test-api-gateway-proxy.com'
292
+ client = Client(
293
+ vertexai=True,
294
+ http_options={
295
+ 'base_url': base_url,
296
+ 'headers': {'Authorization': 'Bearer test_token'},
297
+ },
298
+ )
299
+
300
+ ```
301
+
282
302
  ## Types
283
303
 
284
304
  Parameter types can be specified as either dictionaries(`TypedDict`) or
@@ -242,6 +242,25 @@ http_options = types.HttpOptions(
242
242
  client=Client(..., http_options=http_options)
243
243
  ```
244
244
 
245
+ ### Custom base url
246
+
247
+ In some cases you might need a custom base url (for example, API gateway proxy
248
+ server) and bypass some authentication checks for project, location, or API key.
249
+ You may pass the custom base url like this:
250
+
251
+ ```python
252
+
253
+ base_url = 'https://test-api-gateway-proxy.com'
254
+ client = Client(
255
+ vertexai=True,
256
+ http_options={
257
+ 'base_url': base_url,
258
+ 'headers': {'Authorization': 'Bearer test_token'},
259
+ },
260
+ )
261
+
262
+ ```
263
+
245
264
  ## Types
246
265
 
247
266
  Parameter types can be specified as either dictionaries(`TypedDict`) or
@@ -692,6 +692,7 @@ class BaseApiClient:
692
692
  client_args, async_client_args = self._ensure_httpx_ssl_ctx(
693
693
  self._http_options
694
694
  )
695
+ self._async_httpx_client_args = async_client_args
695
696
  self._httpx_client = SyncHttpxClient(**client_args)
696
697
  self._async_httpx_client = AsyncHttpxClient(**async_client_args)
697
698
  if self._use_aiohttp():
@@ -272,9 +272,7 @@ def convert_to_dict(obj: object, convert_keys: bool = False) -> Any:
272
272
  return convert_to_dict(obj.model_dump(exclude_none=True), convert_keys)
273
273
  elif isinstance(obj, dict):
274
274
  return {
275
- maybe_snake_to_camel(key, convert_keys): convert_to_dict(
276
- value, convert_keys
277
- )
275
+ maybe_snake_to_camel(key, convert_keys): convert_to_dict(value)
278
276
  for key, value in obj.items()
279
277
  }
280
278
  elif isinstance(obj, list):
@@ -56,8 +56,13 @@ def _normalize_json_case(obj: Any) -> Any:
56
56
  return [_normalize_json_case(item) for item in obj]
57
57
  elif isinstance(obj, enum.Enum):
58
58
  return obj.value
59
- else:
60
- return obj
59
+ elif isinstance(obj, str):
60
+ # Python >= 3.14 has a new division by zero error message.
61
+ if 'division by zero' in obj:
62
+ return obj.replace(
63
+ 'division by zero', 'integer division or modulo by zero'
64
+ )
65
+ return obj
61
66
 
62
67
 
63
68
  def _equals_ignore_key_case(obj1: Any, obj2: Any) -> bool:
@@ -88,7 +93,7 @@ def _equals_ignore_key_case(obj1: Any, obj2: Any) -> bool:
88
93
 
89
94
  def _redact_version_numbers(version_string: str) -> str:
90
95
  """Redacts version numbers in the form x.y.z from a string."""
91
- return re.sub(r'\d+\.\d+\.\d+', '{VERSION_NUMBER}', version_string)
96
+ return re.sub(r'\d+\.\d+\.\d+[a-zA-Z0-9]*', '{VERSION_NUMBER}', version_string)
92
97
 
93
98
 
94
99
  def _redact_language_label(language_label: str) -> str:
@@ -1696,6 +1696,10 @@ class JSONSchema(_common.BaseModel):
1696
1696
  ' matches the instance successfully.'
1697
1697
  ),
1698
1698
  )
1699
+ additional_properties: Optional[Any] = Field(
1700
+ default=None,
1701
+ description="""Can either be a boolean or an object; controls the presence of additional properties.""",
1702
+ )
1699
1703
  any_of: Optional[list['JSONSchema']] = Field(
1700
1704
  default=None,
1701
1705
  description=(
@@ -1704,6 +1708,20 @@ class JSONSchema(_common.BaseModel):
1704
1708
  ' keyword’s value.'
1705
1709
  ),
1706
1710
  )
1711
+ unique_items: Optional[bool] = Field(
1712
+ default=None,
1713
+ description="""Boolean value that indicates whether the items in an array are unique.""",
1714
+ )
1715
+ ref: Optional[str] = Field(
1716
+ default=None,
1717
+ alias='$ref',
1718
+ description="""Allows indirect references between schema nodes.""",
1719
+ )
1720
+ defs: Optional[dict[str, 'JSONSchema']] = Field(
1721
+ default=None,
1722
+ alias='$defs',
1723
+ description="""Schema definitions to be used with $ref.""",
1724
+ )
1707
1725
 
1708
1726
 
1709
1727
  class Schema(_common.BaseModel):
@@ -1915,7 +1933,7 @@ class Schema(_common.BaseModel):
1915
1933
  list_schema_field_names: tuple[str, ...] = (
1916
1934
  'any_of', # 'one_of', 'all_of', 'not' to come
1917
1935
  )
1918
- dict_schema_field_names: tuple[str, ...] = ('properties',) # 'defs' to come
1936
+ dict_schema_field_names: tuple[str, ...] = ('properties',)
1919
1937
 
1920
1938
  related_field_names_by_type: dict[str, tuple[str, ...]] = {
1921
1939
  JSONSchemaType.NUMBER.value: (
@@ -1964,6 +1982,23 @@ class Schema(_common.BaseModel):
1964
1982
  # placeholder for potential gemini api unsupported fields
1965
1983
  gemini_api_unsupported_field_names: tuple[str, ...] = ()
1966
1984
 
1985
+ def _resolve_ref(
1986
+ ref_path: str, root_schema_dict: dict[str, Any]
1987
+ ) -> dict[str, Any]:
1988
+ """Helper to resolve a $ref path."""
1989
+ current = root_schema_dict
1990
+ for part in ref_path.lstrip('#/').split('/'):
1991
+ if part == '$defs':
1992
+ part = 'defs'
1993
+ current = current[part]
1994
+ current.pop('title', None)
1995
+ if 'properties' in current and current['properties'] is not None:
1996
+ for prop_schema in current['properties'].values():
1997
+ if isinstance(prop_schema, dict):
1998
+ prop_schema.pop('title', None)
1999
+
2000
+ return current
2001
+
1967
2002
  def normalize_json_schema_type(
1968
2003
  json_schema_type: Optional[
1969
2004
  Union[JSONSchemaType, Sequence[JSONSchemaType], str, Sequence[str]]
@@ -1972,11 +2007,16 @@ class Schema(_common.BaseModel):
1972
2007
  """Returns (non_null_types, nullable)"""
1973
2008
  if json_schema_type is None:
1974
2009
  return [], False
1975
- if not isinstance(json_schema_type, Sequence):
1976
- json_schema_type = [json_schema_type]
2010
+ type_sequence: Sequence[Union[JSONSchemaType, str]]
2011
+ if isinstance(json_schema_type, str) or not isinstance(
2012
+ json_schema_type, Sequence
2013
+ ):
2014
+ type_sequence = [json_schema_type]
2015
+ else:
2016
+ type_sequence = json_schema_type
1977
2017
  non_null_types = []
1978
2018
  nullable = False
1979
- for type_value in json_schema_type:
2019
+ for type_value in type_sequence:
1980
2020
  if isinstance(type_value, JSONSchemaType):
1981
2021
  type_value = type_value.value
1982
2022
  if type_value == JSONSchemaType.NULL.value:
@@ -1996,7 +2036,10 @@ class Schema(_common.BaseModel):
1996
2036
  for field_name, field_value in json_schema_dict.items():
1997
2037
  if field_value is None:
1998
2038
  continue
1999
- if field_name not in google_schema_field_names:
2039
+ if field_name not in google_schema_field_names and field_name not in [
2040
+ 'ref',
2041
+ 'defs',
2042
+ ]:
2000
2043
  raise ValueError(
2001
2044
  f'JSONSchema field "{field_name}" is not supported by the '
2002
2045
  'Schema object. And the "raise_error_on_unsupported_field" '
@@ -2026,12 +2069,19 @@ class Schema(_common.BaseModel):
2026
2069
  )
2027
2070
 
2028
2071
  def convert_json_schema(
2029
- json_schema: JSONSchema,
2072
+ current_json_schema: JSONSchema,
2073
+ root_json_schema_dict: dict[str, Any],
2030
2074
  api_option: Literal['VERTEX_AI', 'GEMINI_API'],
2031
2075
  raise_error_on_unsupported_field: bool,
2032
2076
  ) -> 'Schema':
2033
2077
  schema = Schema()
2034
- json_schema_dict = json_schema.model_dump()
2078
+ json_schema_dict = current_json_schema.model_dump()
2079
+
2080
+ if json_schema_dict.get('ref'):
2081
+ json_schema_dict = _resolve_ref(
2082
+ json_schema_dict['ref'], root_json_schema_dict
2083
+ )
2084
+
2035
2085
  raise_error_if_cannot_convert(
2036
2086
  json_schema_dict=json_schema_dict,
2037
2087
  api_option=api_option,
@@ -2057,6 +2107,7 @@ class Schema(_common.BaseModel):
2057
2107
  non_null_types, nullable = normalize_json_schema_type(
2058
2108
  json_schema_dict.get('type', None)
2059
2109
  )
2110
+ is_union_like_type = len(non_null_types) > 1
2060
2111
  if len(non_null_types) > 1:
2061
2112
  logger.warning(
2062
2113
  'JSONSchema type is union-like, e.g. ["null", "string", "array"]. '
@@ -2086,11 +2137,14 @@ class Schema(_common.BaseModel):
2086
2137
  # Pass 2: the JSONSchema.type is not union-like,
2087
2138
  # e.g. 'string', ['string'], ['null', 'string'].
2088
2139
  for field_name, field_value in json_schema_dict.items():
2089
- if field_value is None:
2140
+ if field_value is None or field_name == 'defs':
2090
2141
  continue
2091
2142
  if field_name in schema_field_names:
2143
+ if field_name == 'items' and not field_value:
2144
+ continue
2092
2145
  schema_field_value: 'Schema' = convert_json_schema(
2093
- json_schema=JSONSchema(**field_value),
2146
+ current_json_schema=JSONSchema(**field_value),
2147
+ root_json_schema_dict=root_json_schema_dict,
2094
2148
  api_option=api_option,
2095
2149
  raise_error_on_unsupported_field=raise_error_on_unsupported_field,
2096
2150
  )
@@ -2098,17 +2152,21 @@ class Schema(_common.BaseModel):
2098
2152
  elif field_name in list_schema_field_names:
2099
2153
  list_schema_field_value: list['Schema'] = [
2100
2154
  convert_json_schema(
2101
- json_schema=JSONSchema(**this_field_value),
2155
+ current_json_schema=JSONSchema(**this_field_value),
2156
+ root_json_schema_dict=root_json_schema_dict,
2102
2157
  api_option=api_option,
2103
2158
  raise_error_on_unsupported_field=raise_error_on_unsupported_field,
2104
2159
  )
2105
2160
  for this_field_value in field_value
2106
2161
  ]
2107
2162
  setattr(schema, field_name, list_schema_field_value)
2163
+ if not schema.type and not is_union_like_type:
2164
+ schema.type = Type('OBJECT')
2108
2165
  elif field_name in dict_schema_field_names:
2109
2166
  dict_schema_field_value: dict[str, 'Schema'] = {
2110
2167
  key: convert_json_schema(
2111
- json_schema=JSONSchema(**value),
2168
+ current_json_schema=JSONSchema(**value),
2169
+ root_json_schema_dict=root_json_schema_dict,
2112
2170
  api_option=api_option,
2113
2171
  raise_error_on_unsupported_field=raise_error_on_unsupported_field,
2114
2172
  )
@@ -2116,20 +2174,52 @@ class Schema(_common.BaseModel):
2116
2174
  }
2117
2175
  setattr(schema, field_name, dict_schema_field_value)
2118
2176
  elif field_name == 'type':
2119
- # non_null_types can only be empty or have one element.
2120
- # because already handled union-like case above.
2121
2177
  non_null_types, nullable = normalize_json_schema_type(field_value)
2122
2178
  if nullable:
2123
2179
  schema.nullable = True
2124
2180
  if non_null_types:
2125
2181
  schema.type = Type(non_null_types[0])
2126
2182
  else:
2127
- setattr(schema, field_name, field_value)
2183
+ if (
2184
+ hasattr(schema, field_name)
2185
+ and field_name != 'additional_properties'
2186
+ ):
2187
+ setattr(schema, field_name, field_value)
2188
+
2189
+ if (
2190
+ schema.type == 'ARRAY'
2191
+ and schema.items
2192
+ and not schema.items.model_dump(exclude_unset=True)
2193
+ ):
2194
+ schema.items = None
2195
+
2196
+ if schema.any_of and len(schema.any_of) == 2:
2197
+ nullable_part = None
2198
+ type_part = None
2199
+ for part in schema.any_of:
2200
+ # A schema representing `None` will either be of type NULL or just be nullable.
2201
+ part_dict = part.model_dump(exclude_unset=True)
2202
+ if part_dict == {'nullable': True} or part_dict == {'type': 'NULL'}:
2203
+ nullable_part = part
2204
+ else:
2205
+ type_part = part
2206
+
2207
+ # If we found both parts, unwrap them into a single schema.
2208
+ if nullable_part and type_part:
2209
+ default_value = schema.default
2210
+ schema = type_part
2211
+ schema.nullable = True
2212
+ # Carry the default value over to the unwrapped schema
2213
+ if default_value is not None:
2214
+ schema.default = default_value
2128
2215
 
2129
2216
  return schema
2130
2217
 
2218
+ # This is the initial call to the recursive function.
2219
+ root_schema_dict = json_schema.model_dump()
2131
2220
  return convert_json_schema(
2132
- json_schema=json_schema,
2221
+ current_json_schema=json_schema,
2222
+ root_json_schema_dict=root_schema_dict,
2133
2223
  api_option=api_option,
2134
2224
  raise_error_on_unsupported_field=raise_error_on_unsupported_field,
2135
2225
  )
@@ -2371,7 +2461,32 @@ class FunctionDeclaration(_common.BaseModel):
2371
2461
  json_schema_dict = _automatic_function_calling_util._add_unevaluated_items_to_fixed_len_tuple_schema(
2372
2462
  json_schema_dict
2373
2463
  )
2374
- parameters_json_schema[name] = json_schema_dict
2464
+ if 'prefixItems' in json_schema_dict:
2465
+ parameters_json_schema[name] = json_schema_dict
2466
+ continue
2467
+
2468
+ union_args = typing.get_args(param.annotation)
2469
+ has_primitive = any(
2470
+ _automatic_function_calling_util._is_builtin_primitive_or_compound(
2471
+ arg
2472
+ )
2473
+ for arg in union_args
2474
+ )
2475
+ if (
2476
+ '$ref' in json_schema_dict or '$defs' in json_schema_dict
2477
+ ) and has_primitive:
2478
+ # This is a complex schema with a primitive (e.g., str | MyModel)
2479
+ # that is better represented by raw JSON schema.
2480
+ parameters_json_schema[name] = json_schema_dict
2481
+ continue
2482
+
2483
+ schema = Schema.from_json_schema(
2484
+ json_schema=JSONSchema(**json_schema_dict),
2485
+ api_option=api_option,
2486
+ )
2487
+ if param.default is not inspect.Parameter.empty:
2488
+ schema.default = param.default
2489
+ parameters_properties[name] = schema
2375
2490
  except Exception as e:
2376
2491
  _automatic_function_calling_util._raise_for_unsupported_param(
2377
2492
  param, callable.__name__, e
@@ -13,4 +13,4 @@
13
13
  # limitations under the License.
14
14
  #
15
15
 
16
- __version__ = '1.44.0' # x-release-please-version
16
+ __version__ = '1.45.0' # x-release-please-version
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: google-genai
3
- Version: 1.44.0
3
+ Version: 1.45.0
4
4
  Summary: GenAI Python SDK
5
5
  Author-email: Google LLC <googleapis-packages@google.com>
6
6
  License: Apache-2.0
@@ -15,6 +15,7 @@ Classifier: Programming Language :: Python :: 3.10
15
15
  Classifier: Programming Language :: Python :: 3.11
16
16
  Classifier: Programming Language :: Python :: 3.12
17
17
  Classifier: Programming Language :: Python :: 3.13
18
+ Classifier: Programming Language :: Python :: 3.14
18
19
  Classifier: Topic :: Internet
19
20
  Classifier: Topic :: Software Development :: Libraries :: Python Modules
20
21
  Requires-Python: >=3.9
@@ -279,6 +280,25 @@ http_options = types.HttpOptions(
279
280
  client=Client(..., http_options=http_options)
280
281
  ```
281
282
 
283
+ ### Custom base url
284
+
285
+ In some cases you might need a custom base url (for example, API gateway proxy
286
+ server) and bypass some authentication checks for project, location, or API key.
287
+ You may pass the custom base url like this:
288
+
289
+ ```python
290
+
291
+ base_url = 'https://test-api-gateway-proxy.com'
292
+ client = Client(
293
+ vertexai=True,
294
+ http_options={
295
+ 'base_url': base_url,
296
+ 'headers': {'Authorization': 'Bearer test_token'},
297
+ },
298
+ )
299
+
300
+ ```
301
+
282
302
  ## Types
283
303
 
284
304
  Parameter types can be specified as either dictionaries(`TypedDict`) or
@@ -3,7 +3,7 @@ requires = ["setuptools", "wheel", "twine>=6.1.0", "packaging>=24.2", "pkginfo>=
3
3
 
4
4
  [project]
5
5
  name = "google-genai"
6
- version = "1.44.0"
6
+ version = "1.45.0"
7
7
  description = "GenAI Python SDK"
8
8
  readme = "README.md"
9
9
  license = {text = "Apache-2.0"}
@@ -22,6 +22,7 @@ classifiers = [
22
22
  "Programming Language :: Python :: 3.11",
23
23
  "Programming Language :: Python :: 3.12",
24
24
  "Programming Language :: Python :: 3.13",
25
+ "Programming Language :: Python :: 3.14",
25
26
  "Topic :: Internet",
26
27
  "Topic :: Software Development :: Libraries :: Python Modules",
27
28
  ]
@@ -51,4 +52,4 @@ packages = [
51
52
  include-package-data = true
52
53
 
53
54
  [tools.setuptools.package_data]
54
- "google.genai" = ["py.typed"]
55
+ "google.genai" = ["py.typed"]
File without changes
File without changes
File without changes