From a43d47941f55f2198365b7143c899081081aad41 Mon Sep 17 00:00:00 2001 From: Mark Daoust Date: Wed, 3 Jun 2026 21:51:57 -0700 Subject: [PATCH] chore: stainless update PiperOrigin-RevId: 926454195 --- google/genai/_interactions/__init__.py | 2 +- google/genai/_interactions/_base_client.py | 4 +- google/genai/_interactions/_client.py | 52 ++++++++---- google/genai/_interactions/_client_adapter.py | 21 ++--- google/genai/_interactions/_exceptions.py | 6 +- google/genai/_interactions/_files.py | 2 +- google/genai/_interactions/_models.py | 80 +++++++++++++++++++ .../_interactions/resources/interactions.py | 32 +++++--- .../genai/_interactions/resources/webhooks.py | 28 +++---- .../_interactions/types/agent_list_params.py | 8 +- .../types/agent_list_response.py | 4 +- .../types/function_result_step.py | 3 +- .../types/function_result_step_param.py | 3 +- .../types/mcp_server_tool_result_step.py | 3 +- .../mcp_server_tool_result_step_param.py | 3 +- .../genai/_interactions/types/step_delta.py | 6 +- 16 files changed, 182 insertions(+), 75 deletions(-) diff --git a/google/genai/_interactions/__init__.py b/google/genai/_interactions/__init__.py index 03f065d92..13e8d1032 100644 --- a/google/genai/_interactions/__init__.py +++ b/google/genai/_interactions/__init__.py @@ -98,7 +98,7 @@ "DefaultAsyncHttpxClient", "DefaultAioHttpClient", "AsyncGeminiNextGenAPIClientAdapter", - "GeminiNextGenAPIClientAdapter" + "GeminiNextGenAPIClientAdapter", ] if not _t.TYPE_CHECKING: diff --git a/google/genai/_interactions/_base_client.py b/google/genai/_interactions/_base_client.py index 21aa18721..530456a0f 100644 --- a/google/genai/_interactions/_base_client.py +++ b/google/genai/_interactions/_base_client.py @@ -417,9 +417,9 @@ def __init__( def _build_maybe_vertex_path(self, *, api_version: str, path: str) -> str: if not self._is_vertex or not self._vertex_location or not self._vertex_project: - return f'/{api_version}/{path}' + return f"/{api_version}/{path}" - return f'{api_version}/projects/{self._vertex_project}/locations/{self._vertex_location}/{path}' + return f"{api_version}/projects/{self._vertex_project}/locations/{self._vertex_location}/{path}" def _enforce_trailing_slash(self, url: URL) -> URL: if url.raw_path.endswith(b"/"): diff --git a/google/genai/_interactions/_client.py b/google/genai/_interactions/_client.py index 05c6d7fca..09f745f95 100644 --- a/google/genai/_interactions/_client.py +++ b/google/genai/_interactions/_client.py @@ -35,7 +35,7 @@ RequestOptions, not_given, ) -from ._utils import is_given +from ._utils import is_given, is_mapping_t from ._compat import cached_property from ._models import FinalRequestOptions from ._version import __version__ @@ -116,6 +116,15 @@ def __init__( self.client_adapter = client_adapter + custom_headers_env = os.environ.get("GEMINI_NEXT_GEN_API_CUSTOM_HEADERS") + if custom_headers_env is not None: + parsed: dict[str, str] = {} + for line in custom_headers_env.split("\n"): + colon = line.find(":") + if colon >= 0: + parsed[line[:colon].strip()] = line[colon + 1 :].strip() + default_headers = {**parsed, **(default_headers if is_mapping_t(default_headers) else {})} + super().__init__( version=__version__, base_url=base_url, @@ -179,7 +188,11 @@ def default_headers(self) -> dict[str, str | Omit]: @override def _validate_headers(self, headers: Headers, custom_headers: Headers) -> None: - if headers.get("Authorization") or custom_headers.get("Authorization") or isinstance(custom_headers.get("Authorization"), Omit): + if ( + headers.get("Authorization") + or custom_headers.get("Authorization") + or isinstance(custom_headers.get("Authorization"), Omit) + ): return if self.api_key and headers.get("x-goog-api-key"): return @@ -189,25 +202,22 @@ def _validate_headers(self, headers: Headers, custom_headers: Headers) -> None: raise TypeError( '"Could not resolve authentication method. Expected the api_key to be set. Or for the `x-goog-api-key` headers to be explicitly omitted"' ) - + @override def _prepare_options(self, options: FinalRequestOptions) -> FinalRequestOptions: if not self.client_adapter or not self.client_adapter.is_vertex_ai(): return options headers = options.headers or {} - has_auth = headers.get("Authorization") or headers.get("x-goog-api-key") # pytype: disable=attribute-error + has_auth = headers.get("Authorization") or headers.get("x-goog-api-key") # pytype: disable=attribute-error if has_auth: return options adapted_headers = self.client_adapter.get_auth_headers() if adapted_headers: - options.headers = { - **adapted_headers, - **headers - } + options.headers = {**adapted_headers, **headers} return options - + def copy( self, *, @@ -350,6 +360,15 @@ def __init__( self.client_adapter = client_adapter + custom_headers_env = os.environ.get("GEMINI_NEXT_GEN_API_CUSTOM_HEADERS") + if custom_headers_env is not None: + parsed: dict[str, str] = {} + for line in custom_headers_env.split("\n"): + colon = line.find(":") + if colon >= 0: + parsed[line[:colon].strip()] = line[colon + 1 :].strip() + default_headers = {**parsed, **(default_headers if is_mapping_t(default_headers) else {})} + super().__init__( version=__version__, base_url=base_url, @@ -413,7 +432,11 @@ def default_headers(self) -> dict[str, str | Omit]: @override def _validate_headers(self, headers: Headers, custom_headers: Headers) -> None: - if headers.get("Authorization") or custom_headers.get("Authorization") or isinstance(custom_headers.get("Authorization"), Omit): + if ( + headers.get("Authorization") + or custom_headers.get("Authorization") + or isinstance(custom_headers.get("Authorization"), Omit) + ): return if self.api_key and headers.get("x-goog-api-key"): return @@ -423,23 +446,20 @@ def _validate_headers(self, headers: Headers, custom_headers: Headers) -> None: raise TypeError( '"Could not resolve authentication method. Expected the api_key to be set. Or for the `x-goog-api-key` headers to be explicitly omitted"' ) - + @override async def _prepare_options(self, options: FinalRequestOptions) -> FinalRequestOptions: if not self.client_adapter or not self.client_adapter.is_vertex_ai(): return options headers = options.headers or {} - has_auth = headers.get("Authorization") or headers.get("x-goog-api-key") # pytype: disable=attribute-error + has_auth = headers.get("Authorization") or headers.get("x-goog-api-key") # pytype: disable=attribute-error if has_auth: return options adapted_headers = await self.client_adapter.async_get_auth_headers() if adapted_headers: - options.headers = { - **adapted_headers, - **headers - } + options.headers = {**adapted_headers, **headers} return options def copy( diff --git a/google/genai/_interactions/_client_adapter.py b/google/genai/_interactions/_client_adapter.py index 32c4750c2..23ac84830 100644 --- a/google/genai/_interactions/_client_adapter.py +++ b/google/genai/_interactions/_client_adapter.py @@ -17,32 +17,25 @@ from abc import ABC, abstractmethod -__all__ = [ - "GeminiNextGenAPIClientAdapter", - "AsyncGeminiNextGenAPIClientAdapter" -] +__all__ = ["GeminiNextGenAPIClientAdapter", "AsyncGeminiNextGenAPIClientAdapter"] + class BaseGeminiNextGenAPIClientAdapter(ABC): @abstractmethod - def is_vertex_ai(self) -> bool: - ... + def is_vertex_ai(self) -> bool: ... @abstractmethod - def get_project(self) -> str | None: - ... + def get_project(self) -> str | None: ... @abstractmethod - def get_location(self) -> str | None: - ... + def get_location(self) -> str | None: ... class AsyncGeminiNextGenAPIClientAdapter(BaseGeminiNextGenAPIClientAdapter): @abstractmethod - async def async_get_auth_headers(self) -> dict[str, str] | None: - ... + async def async_get_auth_headers(self) -> dict[str, str] | None: ... class GeminiNextGenAPIClientAdapter(BaseGeminiNextGenAPIClientAdapter): @abstractmethod - def get_auth_headers(self) -> dict[str, str] | None: - ... + def get_auth_headers(self) -> dict[str, str] | None: ... diff --git a/google/genai/_interactions/_exceptions.py b/google/genai/_interactions/_exceptions.py index 478838d81..50c0e904b 100644 --- a/google/genai/_interactions/_exceptions.py +++ b/google/genai/_interactions/_exceptions.py @@ -88,7 +88,11 @@ def __init__(self, *, message: str = "Connection error.", request: httpx.Request class APITimeoutError(APIConnectionError): def __init__(self, request: httpx.Request) -> None: - super().__init__(message="Request timed out. This is a client-side timeout. You can increase the timeout by setting the `timeout` argument on your request or in the client http options.", request=request) + super().__init__( + message="Request timed out. This is a client-side timeout. You can increase the timeout by setting the `timeout` argument on your request or in the client http options.", + request=request, + ) + class BadRequestError(APIStatusError): status_code: Literal[400] = 400 # pyright: ignore[reportIncompatibleVariableOverride] diff --git a/google/genai/_interactions/_files.py b/google/genai/_interactions/_files.py index 7f209ee4e..f8603936d 100644 --- a/google/genai/_interactions/_files.py +++ b/google/genai/_interactions/_files.py @@ -115,7 +115,7 @@ async def async_to_httpx_files(files: RequestFiles | None) -> HttpxRequestFiles elif is_sequence_t(files): files = [(key, await _async_transform_file(file)) for key, file in files] else: - raise TypeError("Unexpected file type input {type(files)}, expected mapping or sequence") + raise TypeError(f"Unexpected file type input {type(files)}, expected mapping or sequence") return files diff --git a/google/genai/_interactions/_models.py b/google/genai/_interactions/_models.py index f09924cc5..8a7c4b672 100644 --- a/google/genai/_interactions/_models.py +++ b/google/genai/_interactions/_models.py @@ -41,7 +41,9 @@ ClassVar, Protocol, Required, + Annotated, ParamSpec, + TypeAlias, TypedDict, TypeGuard, final, @@ -95,7 +97,15 @@ from ._constants import RAW_RESPONSE_HEADER if TYPE_CHECKING: + from pydantic import GetCoreSchemaHandler, ValidatorFunctionWrapHandler + from pydantic_core import CoreSchema, core_schema from pydantic_core.core_schema import ModelField, ModelSchema, LiteralSchema, ModelFieldsSchema +else: + try: + from pydantic_core import CoreSchema, core_schema + except ImportError: + CoreSchema = None + core_schema = None __all__ = ["BaseModel", "GenericModel"] @@ -412,6 +422,76 @@ def model_dump_json( ) +class _EagerIterable(list[_T], Generic[_T]): + """ + Accepts any Iterable[T] input (including generators), consumes it + eagerly, and validates all items upfront. + + Validation preserves the original container type where possible + (e.g. a set[T] stays a set[T]). Serialization (model_dump / JSON) + always emits a list — round-tripping through model_dump() will not + restore the original container type. + """ + + @classmethod + def __get_pydantic_core_schema__( + cls, + source_type: Any, + handler: GetCoreSchemaHandler, + ) -> CoreSchema: + (item_type,) = get_args(source_type) or (Any,) + item_schema: CoreSchema = handler.generate_schema(item_type) + list_of_items_schema: CoreSchema = core_schema.list_schema(item_schema) + + return core_schema.no_info_wrap_validator_function( + cls._validate, + list_of_items_schema, + serialization=core_schema.plain_serializer_function_ser_schema( + cls._serialize, + info_arg=False, + ), + ) + + @staticmethod + def _validate(v: Iterable[_T], handler: "ValidatorFunctionWrapHandler") -> Any: + original_type: type[Any] = type(v) + + # Normalize to list so list_schema can validate each item + if isinstance(v, list): + items: list[_T] = v + else: + try: + items = list(v) + except TypeError as e: + raise TypeError("Value is not iterable") from e + + # Validate items against the inner schema + validated: list[_T] = handler(items) + + # Reconstruct original container type + if original_type is list: + return validated + # str(list) produces the list's repr, not a string built from items, + # so skip reconstruction for str and its subclasses. + if issubclass(original_type, str): + return validated + try: + return original_type(validated) + except (TypeError, ValueError): + # If the type cannot be reconstructed, just return the validated list + return validated + + @staticmethod + def _serialize(v: Iterable[_T]) -> list[_T]: + """Always serialize as a list so Pydantic's JSON encoder is happy.""" + if isinstance(v, list): + return v + return list(v) + + +EagerIterable: TypeAlias = Annotated[Iterable[_T], _EagerIterable] + + def _construct_field(value: object, field: FieldInfo, key: str) -> object: if value is None: return field_get_default(field) diff --git a/google/genai/_interactions/resources/interactions.py b/google/genai/_interactions/resources/interactions.py index 274c546c9..1496e72ae 100644 --- a/google/genai/_interactions/resources/interactions.py +++ b/google/genai/_interactions/resources/interactions.py @@ -498,9 +498,13 @@ def create( if not api_version: raise ValueError(f"Expected a non-empty value for `api_version` but received {api_version!r}") if model is not omit and agent_config is not omit: - raise ValueError("Invalid request: specified `model` and `agent_config`. If specifying `model`, use `generation_config`.") + raise ValueError( + "Invalid request: specified `model` and `agent_config`. If specifying `model`, use `generation_config`." + ) if agent is not omit and generation_config is not omit: - raise ValueError("Invalid request: specified `agent` and `generation_config`. If specifying `agent`, use `agent_config`.") + raise ValueError( + "Invalid request: specified `agent` and `generation_config`. If specifying `agent`, use `agent_config`." + ) # For streaming requests against vertex+legacy-lyria, swap in the # Stream subclass that activates the per-event SSE remap during @@ -513,7 +517,7 @@ def create( else Stream[InteractionSSEEvent] ) return self._post( - self._client._build_maybe_vertex_path(api_version=api_version, path='interactions'), + self._client._build_maybe_vertex_path(api_version=api_version, path="interactions"), body=maybe_transform( { "input": input, @@ -577,7 +581,7 @@ def delete( if not id: raise ValueError(f"Expected a non-empty value for `id` but received {id!r}") return self._delete( - self._client._build_maybe_vertex_path(api_version=api_version, path=f'interactions/{id}'), + self._client._build_maybe_vertex_path(api_version=api_version, path=f"interactions/{id}"), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -617,7 +621,7 @@ def cancel( if not id: raise ValueError(f"Expected a non-empty value for `id` but received {id!r}") return self._post( - self._client._build_maybe_vertex_path(api_version=api_version, path=f'interactions/{id}/cancel'), + self._client._build_maybe_vertex_path(api_version=api_version, path=f"interactions/{id}/cancel"), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -771,7 +775,7 @@ def get( else Stream[InteractionSSEEvent] ) return self._get( - self._client._build_maybe_vertex_path(api_version=api_version, path=f'interactions/{id}'), + self._client._build_maybe_vertex_path(api_version=api_version, path=f"interactions/{id}"), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, @@ -1238,9 +1242,13 @@ async def create( if not api_version: raise ValueError(f"Expected a non-empty value for `api_version` but received {api_version!r}") if model is not omit and agent_config is not omit: - raise ValueError("Invalid request: specified `model` and `agent_config`. If specifying `model`, use `generation_config`.") + raise ValueError( + "Invalid request: specified `model` and `agent_config`. If specifying `model`, use `generation_config`." + ) if agent is not omit and generation_config is not omit: - raise ValueError("Invalid request: specified `agent` and `generation_config`. If specifying `agent`, use `agent_config`.") + raise ValueError( + "Invalid request: specified `agent` and `generation_config`. If specifying `agent`, use `agent_config`." + ) # See sync `create` above for rationale. stream_cls = ( @@ -1249,7 +1257,7 @@ async def create( else AsyncStream[InteractionSSEEvent] ) return await self._post( - self._client._build_maybe_vertex_path(api_version=api_version, path='interactions'), + self._client._build_maybe_vertex_path(api_version=api_version, path="interactions"), body=await async_maybe_transform( { "input": input, @@ -1313,7 +1321,7 @@ async def delete( if not id: raise ValueError(f"Expected a non-empty value for `id` but received {id!r}") return await self._delete( - self._client._build_maybe_vertex_path(api_version=api_version, path=f'interactions/{id}'), + self._client._build_maybe_vertex_path(api_version=api_version, path=f"interactions/{id}"), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -1353,7 +1361,7 @@ async def cancel( if not id: raise ValueError(f"Expected a non-empty value for `id` but received {id!r}") return await self._post( - self._client._build_maybe_vertex_path(api_version=api_version, path=f'interactions/{id}/cancel'), + self._client._build_maybe_vertex_path(api_version=api_version, path=f"interactions/{id}/cancel"), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -1503,7 +1511,7 @@ async def get( else AsyncStream[InteractionSSEEvent] ) return await self._get( - self._client._build_maybe_vertex_path(api_version=api_version, path=f'interactions/{id}'), + self._client._build_maybe_vertex_path(api_version=api_version, path=f"interactions/{id}"), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, diff --git a/google/genai/_interactions/resources/webhooks.py b/google/genai/_interactions/resources/webhooks.py index d1117cc45..85fa99359 100644 --- a/google/genai/_interactions/resources/webhooks.py +++ b/google/genai/_interactions/resources/webhooks.py @@ -129,7 +129,7 @@ def create( if not api_version: raise ValueError(f"Expected a non-empty value for `api_version` but received {api_version!r}") return self._post( - self._client._build_maybe_vertex_path(api_version=api_version, path='webhooks'), + self._client._build_maybe_vertex_path(api_version=api_version, path="webhooks"), body=maybe_transform( { "subscribed_events": subscribed_events, @@ -214,7 +214,7 @@ def update( if not id: raise ValueError(f"Expected a non-empty value for `id` but received {id!r}") return self._patch( - self._client._build_maybe_vertex_path(api_version=api_version, path=f'webhooks/{id}'), + self._client._build_maybe_vertex_path(api_version=api_version, path=f"webhooks/{id}"), body=maybe_transform( { "name": name, @@ -272,7 +272,7 @@ def list( if not api_version: raise ValueError(f"Expected a non-empty value for `api_version` but received {api_version!r}") return self._get( - self._client._build_maybe_vertex_path(api_version=api_version, path='webhooks'), + self._client._build_maybe_vertex_path(api_version=api_version, path="webhooks"), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, @@ -320,7 +320,7 @@ def delete( if not id: raise ValueError(f"Expected a non-empty value for `id` but received {id!r}") return self._delete( - self._client._build_maybe_vertex_path(api_version=api_version, path=f'webhooks/{id}'), + self._client._build_maybe_vertex_path(api_version=api_version, path=f"webhooks/{id}"), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -358,7 +358,7 @@ def get( if not id: raise ValueError(f"Expected a non-empty value for `id` but received {id!r}") return self._get( - self._client._build_maybe_vertex_path(api_version=api_version, path=f'webhooks/{id}'), + self._client._build_maybe_vertex_path(api_version=api_version, path=f"webhooks/{id}"), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -399,7 +399,7 @@ def ping( if not id: raise ValueError(f"Expected a non-empty value for `id` but received {id!r}") return self._post( - self._client._build_maybe_vertex_path(api_version=api_version, path=f'webhooks/{id}:ping'), + self._client._build_maybe_vertex_path(api_version=api_version, path=f"webhooks/{id}:ping"), body=maybe_transform(body, webhook_ping_params.WebhookPingParams), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout @@ -442,7 +442,7 @@ def rotate_signing_secret( if not id: raise ValueError(f"Expected a non-empty value for `id` but received {id!r}") return self._post( - self._client._build_maybe_vertex_path(api_version=api_version, path=f'webhooks/{id}:rotateSigningSecret'), + self._client._build_maybe_vertex_path(api_version=api_version, path=f"webhooks/{id}:rotateSigningSecret"), body=maybe_transform( {"revocation_behavior": revocation_behavior}, webhook_rotate_signing_secret_params.WebhookRotateSigningSecretParams, @@ -534,7 +534,7 @@ async def create( if not api_version: raise ValueError(f"Expected a non-empty value for `api_version` but received {api_version!r}") return await self._post( - self._client._build_maybe_vertex_path(api_version=api_version, path='webhooks'), + self._client._build_maybe_vertex_path(api_version=api_version, path="webhooks"), body=await async_maybe_transform( { "subscribed_events": subscribed_events, @@ -619,7 +619,7 @@ async def update( if not id: raise ValueError(f"Expected a non-empty value for `id` but received {id!r}") return await self._patch( - self._client._build_maybe_vertex_path(api_version=api_version, path=f'webhooks/{id}'), + self._client._build_maybe_vertex_path(api_version=api_version, path=f"webhooks/{id}"), body=await async_maybe_transform( { "name": name, @@ -679,7 +679,7 @@ async def list( if not api_version: raise ValueError(f"Expected a non-empty value for `api_version` but received {api_version!r}") return await self._get( - self._client._build_maybe_vertex_path(api_version=api_version, path='webhooks'), + self._client._build_maybe_vertex_path(api_version=api_version, path="webhooks"), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, @@ -727,7 +727,7 @@ async def delete( if not id: raise ValueError(f"Expected a non-empty value for `id` but received {id!r}") return await self._delete( - self._client._build_maybe_vertex_path(api_version=api_version, path=f'webhooks/{id}'), + self._client._build_maybe_vertex_path(api_version=api_version, path=f"webhooks/{id}"), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -765,7 +765,7 @@ async def get( if not id: raise ValueError(f"Expected a non-empty value for `id` but received {id!r}") return await self._get( - self._client._build_maybe_vertex_path(api_version=api_version, path=f'webhooks/{id}'), + self._client._build_maybe_vertex_path(api_version=api_version, path=f"webhooks/{id}"), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout ), @@ -806,7 +806,7 @@ async def ping( if not id: raise ValueError(f"Expected a non-empty value for `id` but received {id!r}") return await self._post( - self._client._build_maybe_vertex_path(api_version=api_version, path=f'webhooks/{id}:ping'), + self._client._build_maybe_vertex_path(api_version=api_version, path=f"webhooks/{id}:ping"), body=await async_maybe_transform(body, webhook_ping_params.WebhookPingParams), options=make_request_options( extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout @@ -849,7 +849,7 @@ async def rotate_signing_secret( if not id: raise ValueError(f"Expected a non-empty value for `id` but received {id!r}") return await self._post( - self._client._build_maybe_vertex_path(api_version=api_version, path=f'webhooks/{id}:rotateSigningSecret'), + self._client._build_maybe_vertex_path(api_version=api_version, path=f"webhooks/{id}:rotateSigningSecret"), body=await async_maybe_transform( {"revocation_behavior": revocation_behavior}, webhook_rotate_signing_secret_params.WebhookRotateSigningSecretParams, diff --git a/google/genai/_interactions/types/agent_list_params.py b/google/genai/_interactions/types/agent_list_params.py index 54db37f6f..af944d617 100644 --- a/google/genai/_interactions/types/agent_list_params.py +++ b/google/genai/_interactions/types/agent_list_params.py @@ -17,9 +17,7 @@ from __future__ import annotations -from typing_extensions import Annotated, TypedDict - -from .._utils import PropertyInfo +from typing_extensions import TypedDict __all__ = ["AgentListParams"] @@ -27,8 +25,8 @@ class AgentListParams(TypedDict, total=False): api_version: str - page_size: Annotated[int, PropertyInfo(alias="pageSize")] + page_size: int - page_token: Annotated[str, PropertyInfo(alias="pageToken")] + page_token: str parent: str diff --git a/google/genai/_interactions/types/agent_list_response.py b/google/genai/_interactions/types/agent_list_response.py index 845e917b2..fabad2175 100644 --- a/google/genai/_interactions/types/agent_list_response.py +++ b/google/genai/_interactions/types/agent_list_response.py @@ -17,8 +17,6 @@ from typing import List, Optional -from pydantic import Field as FieldInfo - from .agent import Agent from .._models import BaseModel @@ -28,4 +26,4 @@ class AgentListResponse(BaseModel): agents: Optional[List[Agent]] = None - next_page_token: Optional[str] = FieldInfo(alias="nextPageToken", default=None) + next_page_token: Optional[str] = None diff --git a/google/genai/_interactions/types/function_result_step.py b/google/genai/_interactions/types/function_result_step.py index cd56a6f83..fc74d21fe 100644 --- a/google/genai/_interactions/types/function_result_step.py +++ b/google/genai/_interactions/types/function_result_step.py @@ -19,6 +19,7 @@ from typing_extensions import Literal, Annotated, TypeAlias from .._utils import PropertyInfo +from .content import Content from .._models import BaseModel from .text_content import TextContent from .image_content import ImageContent @@ -36,7 +37,7 @@ class FunctionResultStep(BaseModel): call_id: str """Required. ID to match the ID from the function call block.""" - result: Union[List[ResultFunctionResultSubcontentList], str, object] + result: Union[List[Content], List[ResultFunctionResultSubcontentList], str] """The result of the tool call.""" type: Literal["function_result"] diff --git a/google/genai/_interactions/types/function_result_step_param.py b/google/genai/_interactions/types/function_result_step_param.py index aaf7e82a8..feb63c60c 100644 --- a/google/genai/_interactions/types/function_result_step_param.py +++ b/google/genai/_interactions/types/function_result_step_param.py @@ -23,6 +23,7 @@ from .._types import Base64FileInput from .._utils import PropertyInfo from .._models import set_pydantic_config +from .content_param import ContentParam from .text_content_param import TextContentParam from .image_content_param import ImageContentParam @@ -37,7 +38,7 @@ class FunctionResultStepParam(TypedDict, total=False): call_id: Required[str] """Required. ID to match the ID from the function call block.""" - result: Required[Union[Iterable[ResultFunctionResultSubcontentList], str, object]] + result: Required[Union[Iterable[ContentParam], Iterable[ResultFunctionResultSubcontentList], str]] """The result of the tool call.""" type: Required[Literal["function_result"]] diff --git a/google/genai/_interactions/types/mcp_server_tool_result_step.py b/google/genai/_interactions/types/mcp_server_tool_result_step.py index 49c75250e..2249a0310 100644 --- a/google/genai/_interactions/types/mcp_server_tool_result_step.py +++ b/google/genai/_interactions/types/mcp_server_tool_result_step.py @@ -19,6 +19,7 @@ from typing_extensions import Literal, Annotated, TypeAlias from .._utils import PropertyInfo +from .content import Content from .._models import BaseModel from .text_content import TextContent from .image_content import ImageContent @@ -36,7 +37,7 @@ class MCPServerToolResultStep(BaseModel): call_id: str """Required. ID to match the ID from the function call block.""" - result: Union[str, List[ResultFunctionResultSubcontentList], object] + result: Union[List[Content], List[ResultFunctionResultSubcontentList], object] """The output from the MCP server call. Can be simple text or rich content.""" type: Literal["mcp_server_tool_result"] diff --git a/google/genai/_interactions/types/mcp_server_tool_result_step_param.py b/google/genai/_interactions/types/mcp_server_tool_result_step_param.py index b8073d9d9..4d8637ba9 100644 --- a/google/genai/_interactions/types/mcp_server_tool_result_step_param.py +++ b/google/genai/_interactions/types/mcp_server_tool_result_step_param.py @@ -23,6 +23,7 @@ from .._types import Base64FileInput from .._utils import PropertyInfo from .._models import set_pydantic_config +from .content_param import ContentParam from .text_content_param import TextContentParam from .image_content_param import ImageContentParam @@ -37,7 +38,7 @@ class MCPServerToolResultStepParam(TypedDict, total=False): call_id: Required[str] """Required. ID to match the ID from the function call block.""" - result: Required[Union[str, Iterable[ResultFunctionResultSubcontentList], object]] + result: Required[Union[Iterable[ContentParam], Iterable[ResultFunctionResultSubcontentList], object]] """The output from the MCP server call. Can be simple text or rich content.""" type: Required[Literal["mcp_server_tool_result"]] diff --git a/google/genai/_interactions/types/step_delta.py b/google/genai/_interactions/types/step_delta.py index ea3df50ce..5cb3b7e24 100644 --- a/google/genai/_interactions/types/step_delta.py +++ b/google/genai/_interactions/types/step_delta.py @@ -20,6 +20,7 @@ from .usage import Usage from .._utils import PropertyInfo +from .content import Content from .._models import BaseModel from .annotation import Annotation from .text_content import TextContent @@ -131,6 +132,7 @@ class DeltaDocument(BaseModel): uri: Optional[str] = None + class DeltaVideo(BaseModel): type: Literal["video"] @@ -285,7 +287,7 @@ class DeltaGoogleSearchResult(BaseModel): class DeltaMCPServerToolResult(BaseModel): - result: Union[List[DeltaMCPServerToolResultResultFunctionResultSubcontentList], str, object] + result: Union[List[Content], List[DeltaMCPServerToolResultResultFunctionResultSubcontentList], str] type: Literal["mcp_server_tool_result"] @@ -325,7 +327,7 @@ class DeltaFunctionResult(BaseModel): call_id: str """Required. ID to match the ID from the function call block.""" - result: Union[List[DeltaFunctionResultResultFunctionResultSubcontentList], str, object] + result: Union[List[Content], List[DeltaFunctionResultResultFunctionResultSubcontentList], str] type: Literal["function_result"]