Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
268 changes: 268 additions & 0 deletions agentplatform/_genai/memory_banks.py
Original file line number Diff line number Diff line change
Expand Up @@ -590,6 +590,44 @@ def _StructuredMemorySchemaConfig_to_vertex(
return to_object


def _UpdateMemoryBankConfig_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, ["display_name"]) is not None:
setv(parent_object, ["displayName"], getv(from_object, ["display_name"]))

if getv(from_object, ["description"]) is not None:
setv(parent_object, ["description"], getv(from_object, ["description"]))

return to_object


def _UpdateMemoryBankRequestParameters_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, ["name"]) is not None:
setv(to_object, ["_url", "name"], getv(from_object, ["name"]))

if getv(from_object, ["memory_bank_config"]) is not None:
setv(
to_object,
["context_spec", "memory_bank_config"],
_ReasoningEngineContextSpecMemoryBankConfig_to_vertex(
getv(from_object, ["memory_bank_config"]), to_object
),
)

if getv(from_object, ["config"]) is not None:
_UpdateMemoryBankConfig_to_vertex(getv(from_object, ["config"]), to_object)

return to_object


class MemoryBanks(_api_module.BaseModule):

def _create(
Expand Down Expand Up @@ -669,6 +707,85 @@ def _create(
self._api_client._verify_response(return_value)
return return_value

def _update(
self,
*,
name: str,
memory_bank_config: Optional[
types.ReasoningEngineContextSpecMemoryBankConfigOrDict
] = None,
config: Optional[types.UpdateMemoryBankConfigOrDict] = None,
) -> types.MemoryBankOperation:
"""
Updates a Memory Bank.
"""

parameter_model = types._UpdateMemoryBankRequestParameters(
name=name,
memory_bank_config=memory_bank_config,
config=config,
)

request_url_dict: Optional[dict[str, str]]
if not self._api_client.vertexai:
raise ValueError(
"This method is only supported in Gemini Enterprise Agent Platform mode, not in Gemini Developer API mode."
)
else:
request_dict = _UpdateMemoryBankRequestParameters_to_vertex(parameter_model)
request_url_dict = request_dict.get("_url")
if request_url_dict:
path = "{name}".format_map(request_url_dict)
else:
path = "{name}"

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("patch", path, request_dict, http_options)

response_dict = {} if not response.body else json.loads(response.body)

if self._api_client.vertexai:
response_dict = _MemoryBankOperation_from_vertex(response_dict)

return_value = types.MemoryBankOperation._from_response(
response=response_dict,
kwargs=(
{
"config": {
"response_schema": getattr(
parameter_model.config, "response_schema", None
),
"response_json_schema": getattr(
parameter_model.config, "response_json_schema", None
),
"include_all_fields": getattr(
parameter_model.config, "include_all_fields", None
),
}
}
if getattr(parameter_model, "config", None)
else {}
),
)

self._api_client._verify_response(return_value)
return return_value

def _delete(
self,
*,
Expand Down Expand Up @@ -1082,6 +1199,41 @@ def create(
memory_bank = types.MemoryBank(name=operation.response.name)
return memory_bank

def update(
self,
*,
name: str,
managed_semantic_memory_config: Optional[
types.ManagedSemanticMemoryConfigOrDict
] = None,
config: Optional[types.UpdateMemoryBankConfigOrDict] = None,
) -> types.MemoryBank:
"""Updates a Memory Bank resource."""
memory_bank_config = (
_memory_bank_utils._managed_semantic_memory_config_to_memory_bank_config(
managed_semantic_memory_config
)
)

operation = self._update(
name=name,
memory_bank_config=memory_bank_config,
config=config,
)

operation = _memory_bank_utils._await_operation(
operation_name=operation.name,
get_operation_fn=self._get_memory_bank_operation,
)
if operation.error:
raise RuntimeError(operation.error)
if not operation.response:
raise RuntimeError(
f"Memory Bank update completed without a response: {operation}"
)
memory_bank = types.MemoryBank(name=operation.response.name)
return memory_bank

def delete(
self,
*,
Expand Down Expand Up @@ -1332,6 +1484,87 @@ async def _create(
self._api_client._verify_response(return_value)
return return_value

async def _update(
self,
*,
name: str,
memory_bank_config: Optional[
types.ReasoningEngineContextSpecMemoryBankConfigOrDict
] = None,
config: Optional[types.UpdateMemoryBankConfigOrDict] = None,
) -> types.MemoryBankOperation:
"""
Updates a Memory Bank.
"""

parameter_model = types._UpdateMemoryBankRequestParameters(
name=name,
memory_bank_config=memory_bank_config,
config=config,
)

request_url_dict: Optional[dict[str, str]]
if not self._api_client.vertexai:
raise ValueError(
"This method is only supported in Gemini Enterprise Agent Platform mode, not in Gemini Developer API mode."
)
else:
request_dict = _UpdateMemoryBankRequestParameters_to_vertex(parameter_model)
request_url_dict = request_dict.get("_url")
if request_url_dict:
path = "{name}".format_map(request_url_dict)
else:
path = "{name}"

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(
"patch", path, request_dict, http_options
)

response_dict = {} if not response.body else json.loads(response.body)

if self._api_client.vertexai:
response_dict = _MemoryBankOperation_from_vertex(response_dict)

return_value = types.MemoryBankOperation._from_response(
response=response_dict,
kwargs=(
{
"config": {
"response_schema": getattr(
parameter_model.config, "response_schema", None
),
"response_json_schema": getattr(
parameter_model.config, "response_json_schema", None
),
"include_all_fields": getattr(
parameter_model.config, "include_all_fields", None
),
}
}
if getattr(parameter_model, "config", None)
else {}
),
)

self._api_client._verify_response(return_value)
return return_value

async def _delete(
self,
*,
Expand Down Expand Up @@ -1755,6 +1988,41 @@ async def create(
memory_bank = types.MemoryBank(name=operation.response.name)
return memory_bank

async def update(
self,
*,
name: str,
managed_semantic_memory_config: Optional[
types.ManagedSemanticMemoryConfigOrDict
] = None,
config: Optional[types.UpdateMemoryBankConfigOrDict] = None,
) -> types.MemoryBank:
"""Updates a Memory Bank."""
memory_bank_config = (
_memory_bank_utils._managed_semantic_memory_config_to_memory_bank_config(
managed_semantic_memory_config
)
)

operation = await self._update(
name=name,
memory_bank_config=memory_bank_config,
config=config,
)

operation = await _memory_bank_utils._await_async_operation(
operation_name=operation.name,
get_operation_fn=self._get_memory_bank_operation,
)
if operation.error:
raise RuntimeError(operation.error)
if not operation.response:
raise RuntimeError(
f"Memory Bank update completed without a response: {operation}"
)
memory_bank = types.MemoryBank(name=operation.response.name)
return memory_bank

async def delete(
self,
*,
Expand Down
8 changes: 8 additions & 0 deletions agentplatform/_genai/types/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -183,6 +183,7 @@
from .common import _UndeployModelRequestParameters
from .common import _UpdateDatasetParameters
from .common import _UpdateEvaluationExperimentParameters
from .common import _UpdateMemoryBankRequestParameters
from .common import _UpdateMemoryRequestParameters
from .common import _UpdateMultimodalDatasetParameters
from .common import _UpdateRagConfigRequestParameters
Expand Down Expand Up @@ -2265,6 +2266,9 @@
from .common import UpdateEvaluationExperimentConfig
from .common import UpdateEvaluationExperimentConfigDict
from .common import UpdateEvaluationExperimentConfigOrDict
from .common import UpdateMemoryBankConfig
from .common import UpdateMemoryBankConfigDict
from .common import UpdateMemoryBankConfigOrDict
from .common import UpdateMemoryConfig
from .common import UpdateMemoryConfigDict
from .common import UpdateMemoryConfigOrDict
Expand Down Expand Up @@ -3024,6 +3028,9 @@
"MemoryBankOperation",
"MemoryBankOperationDict",
"MemoryBankOperationOrDict",
"UpdateMemoryBankConfig",
"UpdateMemoryBankConfigDict",
"UpdateMemoryBankConfigOrDict",
"DeleteMemoryBankConfig",
"DeleteMemoryBankConfigDict",
"DeleteMemoryBankConfigOrDict",
Expand Down Expand Up @@ -4493,6 +4500,7 @@
"_GetDeleteRuntimeRevisionOperationParameters",
"_QueryRuntimeRevisionRequestParameters",
"_CreateMemoryBankRequestParameters",
"_UpdateMemoryBankRequestParameters",
"_DeleteMemoryBankRequestParameters",
"_GetMemoryBankRequestParameters",
"_IngestEventsRequestParameters",
Expand Down
Loading
Loading