From 7c2df803cca7a166d1b6a4b5d82756980fefe3b9 Mon Sep 17 00:00:00 2001 From: Darren Cohen <39422044+dargilco@users.noreply.github.com> Date: Wed, 9 Apr 2025 11:11:02 -0700 Subject: [PATCH 1/5] Re-emit --- .../apiview-properties.json | 23 +- .../azure/ai/projects/onedp/_client.py | 6 - .../azure/ai/projects/onedp/_patch.py | 5 +- .../azure/ai/projects/onedp/aio/_client.py | 6 - .../azure/ai/projects/onedp/aio/_patch.py | 5 +- .../projects/onedp/aio/operations/__init__.py | 2 - .../onedp/aio/operations/_operations.py | 1405 +--------- .../projects/onedp/aio/operations/_patch.py | 42 +- .../ai/projects/onedp/models/__init__.py | 20 +- .../azure/ai/projects/onedp/models/_enums.py | 32 +- .../azure/ai/projects/onedp/models/_models.py | 408 ++- .../ai/projects/onedp/operations/__init__.py | 2 - .../projects/onedp/operations/_operations.py | 2291 +++-------------- .../ai/projects/onedp/operations/_patch.py | 41 +- .../test_ai_project_connections_operations.py | 11 + ...ai_project_connections_operations_async.py | 11 + .../test_ai_project_datasets_operations.py | 35 - ...st_ai_project_datasets_operations_async.py | 35 - .../test_ai_project_evaluations_operations.py | 1 - ...ai_project_evaluations_operations_async.py | 1 - .../test_ai_project_indexes_operations.py | 22 - ...est_ai_project_indexes_operations_async.py | 22 - .../test_ai_project_red_teams_operations.py | 1 - ...t_ai_project_red_teams_operations_async.py | 1 - .../samples/connections/sample_connections.py | 8 +- .../connections/sample_connections_async.py | 2 +- .../samples/datasets/sample_datasets.py | 12 +- .../samples/deployments/sample_deployments.py | 5 +- .../deployments/sample_deployments_async.py | 2 +- .../samples/indexes/sample_indexes.py | 5 +- .../samples/telemetry/sample_telemetry.py | 3 +- .../azure-ai-projects-onedp/tsp-location.yaml | 2 +- 32 files changed, 929 insertions(+), 3538 deletions(-) diff --git a/sdk/ai/azure-ai-projects-onedp/apiview-properties.json b/sdk/ai/azure-ai-projects-onedp/apiview-properties.json index c93a0c90f921..b947cd0c8bac 100644 --- a/sdk/ai/azure-ai-projects-onedp/apiview-properties.json +++ b/sdk/ai/azure-ai-projects-onedp/apiview-properties.json @@ -5,12 +5,18 @@ "azure.ai.projects.onedp.models.AzureAISearchIndex": "Azure.AI.Projects.AzureAISearchIndex", "azure.ai.projects.onedp.models.BlobReferenceForConsumption": "Azure.AI.Projects.BlobReferenceForConsumption", "azure.ai.projects.onedp.models.Connection": "Azure.AI.Projects.Connection", + "azure.ai.projects.onedp.models.ConnectionWithApiKeyAuth": "Azure.AI.Projects.ConnectionWithApiKeyAuth", + "azure.ai.projects.onedp.models.ConnectionWithCustomAuth": "Azure.AI.Projects.ConnectionWithCustomAuth", + "azure.ai.projects.onedp.models.ConnectionWithEntraIDAuth": "Azure.AI.Projects.ConnectionWithEntraIDAuth", + "azure.ai.projects.onedp.models.ConnectionWithNoAuth": "Azure.AI.Projects.ConnectionWithNoAuth", + "azure.ai.projects.onedp.models.ConnectionWithSASAuth": "Azure.AI.Projects.ConnectionWithSASAuth", "azure.ai.projects.onedp.models.CosmosDBIndex": "Azure.AI.Projects.CosmosDBIndex", + "azure.ai.projects.onedp.models.CredentialsApiKeyAuth": "Azure.AI.Projects.CredentialsApiKeyAuth", + "azure.ai.projects.onedp.models.CredentialsSASAuth": "Azure.AI.Projects.CredentialsSASAuth", "azure.ai.projects.onedp.models.DatasetVersion": "Azure.AI.Projects.DatasetVersion", "azure.ai.projects.onedp.models.Deployment": "Azure.AI.Projects.Deployment", "azure.ai.projects.onedp.models.EmbeddingConfiguration": "Azure.AI.Projects.EmbeddingConfiguration", "azure.ai.projects.onedp.models.Evaluation": "Azure.AI.Projects.Evaluation", - "azure.ai.projects.onedp.models.EvaluationResult": "Azure.AI.Projects.EvaluationResult", "azure.ai.projects.onedp.models.EvaluatorConfiguration": "Azure.AI.Projects.EvaluatorConfiguration", "azure.ai.projects.onedp.models.FileDatasetVersion": "Azure.AI.Projects.FileDatasetVersion", "azure.ai.projects.onedp.models.FolderDatasetVersion": "Azure.AI.Projects.FolderDatasetVersion", @@ -23,18 +29,17 @@ "azure.ai.projects.onedp.models.RedTeam": "Azure.AI.Projects.RedTeam", "azure.ai.projects.onedp.models.SasCredential": "Azure.AI.Projects.SasCredential", "azure.ai.projects.onedp.models.Sku": "Azure.AI.Projects.Sku", - "azure.ai.projects.onedp.models.ConnectionType": "Azure.AI.Projects.ConnectionType", "azure.ai.projects.onedp.models.AuthenticationType": "Azure.AI.Projects.AuthenticationType", + "azure.ai.projects.onedp.models.ConnectionType": "Azure.AI.Projects.ConnectionType", "azure.ai.projects.onedp.models.DatasetType": "Azure.AI.Projects.DatasetType", "azure.ai.projects.onedp.models.ListViewType": "Azure.AI.Projects.ListViewType", - "azure.ai.projects.onedp.models.RepeatabilityResult": "Azure.Core.RepeatabilityResult", "azure.ai.projects.onedp.models.PendingUploadType": "Azure.AI.Projects.PendingUploadType", "azure.ai.projects.onedp.models.IndexType": "Azure.AI.Projects.IndexType", "azure.ai.projects.onedp.models.DeploymentType": "Azure.AI.Projects.DeploymentType", - "azure.ai.projects.onedp.models.ResultType": "Azure.AI.Projects.ResultType", "azure.ai.projects.onedp.models.AttackStrategy": "Azure.AI.Projects.AttackStrategy", "azure.ai.projects.onedp.models.RiskCategory": "Azure.AI.Projects.RiskCategory", "azure.ai.projects.onedp.AIProjectClient.connections.get": "Azure.AI.Projects.Connections.get", + "azure.ai.projects.onedp.AIProjectClient.connections.get_with_credentials": "Azure.AI.Projects.Connections.getWithCredentials", "azure.ai.projects.onedp.AIProjectClient.connections.list": "Azure.AI.Projects.Connections.list", "azure.ai.projects.onedp.AIProjectClient.evaluations.get": "Azure.AI.Projects.Evaluations.get", "azure.ai.projects.onedp.AIProjectClient.evaluations.list": "Azure.AI.Projects.Evaluations.list", @@ -43,25 +48,15 @@ "azure.ai.projects.onedp.AIProjectClient.datasets.list_latest": "Azure.AI.Projects.ServicePatterns.Datasets.listLatest", "azure.ai.projects.onedp.AIProjectClient.datasets.get_version": "Azure.AI.Projects.ServicePatterns.Datasets.getVersion", "azure.ai.projects.onedp.AIProjectClient.datasets.delete_version": "Azure.AI.Projects.ServicePatterns.Datasets.deleteVersion", - "azure.ai.projects.onedp.AIProjectClient.datasets.create": "Azure.AI.Projects.ServicePatterns.Datasets.create", "azure.ai.projects.onedp.AIProjectClient.datasets.create_version": "Azure.AI.Projects.ServicePatterns.Datasets.createVersion", "azure.ai.projects.onedp.AIProjectClient.datasets.start_pending_upload_version": "Azure.AI.Projects.Datasets.startPendingUploadVersion", - "azure.ai.projects.onedp.AIProjectClient.datasets.start_pending_upload": "Azure.AI.Projects.Datasets.startPendingUpload", "azure.ai.projects.onedp.AIProjectClient.indexes.list_versions": "Azure.AI.Projects.ServicePatterns.Indexes.listVersions", "azure.ai.projects.onedp.AIProjectClient.indexes.list_latest": "Azure.AI.Projects.ServicePatterns.Indexes.listLatest", "azure.ai.projects.onedp.AIProjectClient.indexes.get_version": "Azure.AI.Projects.ServicePatterns.Indexes.getVersion", "azure.ai.projects.onedp.AIProjectClient.indexes.delete_version": "Azure.AI.Projects.ServicePatterns.Indexes.deleteVersion", - "azure.ai.projects.onedp.AIProjectClient.indexes.create": "Azure.AI.Projects.ServicePatterns.Indexes.create", "azure.ai.projects.onedp.AIProjectClient.indexes.create_version": "Azure.AI.Projects.ServicePatterns.Indexes.createVersion", "azure.ai.projects.onedp.AIProjectClient.deployments.get": "Azure.AI.Projects.Deployments.get", "azure.ai.projects.onedp.AIProjectClient.deployments.list": "Azure.AI.Projects.Deployments.list", - "azure.ai.projects.onedp.AIProjectClient.evaluation_results.list_versions": "Azure.AI.Projects.ServicePatterns.EvaluationResults.listVersions", - "azure.ai.projects.onedp.AIProjectClient.evaluation_results.list_latest": "Azure.AI.Projects.ServicePatterns.EvaluationResults.listLatest", - "azure.ai.projects.onedp.AIProjectClient.evaluation_results.get_version": "Azure.AI.Projects.ServicePatterns.EvaluationResults.getVersion", - "azure.ai.projects.onedp.AIProjectClient.evaluation_results.delete_version": "Azure.AI.Projects.ServicePatterns.EvaluationResults.deleteVersion", - "azure.ai.projects.onedp.AIProjectClient.evaluation_results.create": "Azure.AI.Projects.ServicePatterns.EvaluationResults.create", - "azure.ai.projects.onedp.AIProjectClient.evaluation_results.create_version": "Azure.AI.Projects.ServicePatterns.EvaluationResults.createVersion", - "azure.ai.projects.onedp.AIProjectClient.evaluation_results.start_pending_upload": "Azure.AI.Projects.EvaluationResults.startPendingUpload", "azure.ai.projects.onedp.AIProjectClient.red_teams.get": "Azure.AI.Projects.RedTeams.get", "azure.ai.projects.onedp.AIProjectClient.red_teams.list": "Azure.AI.Projects.RedTeams.list", "azure.ai.projects.onedp.AIProjectClient.red_teams.create_run": "Azure.AI.Projects.RedTeams.createRun" diff --git a/sdk/ai/azure-ai-projects-onedp/azure/ai/projects/onedp/_client.py b/sdk/ai/azure-ai-projects-onedp/azure/ai/projects/onedp/_client.py index 78f6c499f1c8..27a54a66bf4f 100644 --- a/sdk/ai/azure-ai-projects-onedp/azure/ai/projects/onedp/_client.py +++ b/sdk/ai/azure-ai-projects-onedp/azure/ai/projects/onedp/_client.py @@ -21,7 +21,6 @@ ConnectionsOperations, DatasetsOperations, DeploymentsOperations, - EvaluationResultsOperations, EvaluationsOperations, IndexesOperations, RedTeamsOperations, @@ -47,8 +46,6 @@ class AIProjectClient: # pylint: disable=too-many-instance-attributes :vartype indexes: azure.ai.projects.onedp.operations.IndexesOperations :ivar deployments: DeploymentsOperations operations :vartype deployments: azure.ai.projects.onedp.operations.DeploymentsOperations - :ivar evaluation_results: EvaluationResultsOperations operations - :vartype evaluation_results: azure.ai.projects.onedp.operations.EvaluationResultsOperations :ivar red_teams: RedTeamsOperations operations :vartype red_teams: azure.ai.projects.onedp.operations.RedTeamsOperations :param endpoint: Project endpoint in the form of: @@ -97,9 +94,6 @@ def __init__(self, endpoint: str, credential: Union[AzureKeyCredential, "TokenCr self.datasets = DatasetsOperations(self._client, self._config, self._serialize, self._deserialize) self.indexes = IndexesOperations(self._client, self._config, self._serialize, self._deserialize) self.deployments = DeploymentsOperations(self._client, self._config, self._serialize, self._deserialize) - self.evaluation_results = EvaluationResultsOperations( - self._client, self._config, self._serialize, self._deserialize - ) self.red_teams = RedTeamsOperations(self._client, self._config, self._serialize, self._deserialize) def send_request(self, request: HttpRequest, *, stream: bool = False, **kwargs: Any) -> HttpResponse: diff --git a/sdk/ai/azure-ai-projects-onedp/azure/ai/projects/onedp/_patch.py b/sdk/ai/azure-ai-projects-onedp/azure/ai/projects/onedp/_patch.py index 846ca97d34d0..25dde65497ad 100644 --- a/sdk/ai/azure-ai-projects-onedp/azure/ai/projects/onedp/_patch.py +++ b/sdk/ai/azure-ai-projects-onedp/azure/ai/projects/onedp/_patch.py @@ -11,6 +11,7 @@ from ._client import AIProjectClient as AIProjectClientGenerated from .operations import TelemetryOperations, InferenceOperations + class AIProjectClient(AIProjectClientGenerated): # pylint: disable=too-many-instance-attributes """AIProjectClient. @@ -50,9 +51,7 @@ def __init__(self, endpoint: str, credential: Union[AzureKeyCredential, "TokenCr self.inference = InferenceOperations(self) -__all__: List[str] = [ - "AIProjectClient" -] # Add all objects you want publicly available to users at this package level +__all__: List[str] = ["AIProjectClient"] # Add all objects you want publicly available to users at this package level def patch_sdk(): diff --git a/sdk/ai/azure-ai-projects-onedp/azure/ai/projects/onedp/aio/_client.py b/sdk/ai/azure-ai-projects-onedp/azure/ai/projects/onedp/aio/_client.py index 6b2ebc4df943..e7779e2cf92b 100644 --- a/sdk/ai/azure-ai-projects-onedp/azure/ai/projects/onedp/aio/_client.py +++ b/sdk/ai/azure-ai-projects-onedp/azure/ai/projects/onedp/aio/_client.py @@ -21,7 +21,6 @@ ConnectionsOperations, DatasetsOperations, DeploymentsOperations, - EvaluationResultsOperations, EvaluationsOperations, IndexesOperations, RedTeamsOperations, @@ -47,8 +46,6 @@ class AIProjectClient: # pylint: disable=too-many-instance-attributes :vartype indexes: azure.ai.projects.onedp.aio.operations.IndexesOperations :ivar deployments: DeploymentsOperations operations :vartype deployments: azure.ai.projects.onedp.aio.operations.DeploymentsOperations - :ivar evaluation_results: EvaluationResultsOperations operations - :vartype evaluation_results: azure.ai.projects.onedp.aio.operations.EvaluationResultsOperations :ivar red_teams: RedTeamsOperations operations :vartype red_teams: azure.ai.projects.onedp.aio.operations.RedTeamsOperations :param endpoint: Project endpoint in the form of: @@ -99,9 +96,6 @@ def __init__( self.datasets = DatasetsOperations(self._client, self._config, self._serialize, self._deserialize) self.indexes = IndexesOperations(self._client, self._config, self._serialize, self._deserialize) self.deployments = DeploymentsOperations(self._client, self._config, self._serialize, self._deserialize) - self.evaluation_results = EvaluationResultsOperations( - self._client, self._config, self._serialize, self._deserialize - ) self.red_teams = RedTeamsOperations(self._client, self._config, self._serialize, self._deserialize) def send_request( diff --git a/sdk/ai/azure-ai-projects-onedp/azure/ai/projects/onedp/aio/_patch.py b/sdk/ai/azure-ai-projects-onedp/azure/ai/projects/onedp/aio/_patch.py index e28f59b7aba1..7574606e6a40 100644 --- a/sdk/ai/azure-ai-projects-onedp/azure/ai/projects/onedp/aio/_patch.py +++ b/sdk/ai/azure-ai-projects-onedp/azure/ai/projects/onedp/aio/_patch.py @@ -11,6 +11,7 @@ from ._client import AIProjectClient as AIProjectClientGenerated from .operations import InferenceOperations + class AIProjectClient(AIProjectClientGenerated): # pylint: disable=too-many-instance-attributes """AIProjectClient. @@ -51,9 +52,7 @@ def __init__( self.inference = InferenceOperations(self) -__all__: List[str] = [ - "AIProjectClient" -] # Add all objects you want publicly available to users at this package level +__all__: List[str] = ["AIProjectClient"] # Add all objects you want publicly available to users at this package level def patch_sdk(): diff --git a/sdk/ai/azure-ai-projects-onedp/azure/ai/projects/onedp/aio/operations/__init__.py b/sdk/ai/azure-ai-projects-onedp/azure/ai/projects/onedp/aio/operations/__init__.py index f6be99bbed9c..c8b497b4854b 100644 --- a/sdk/ai/azure-ai-projects-onedp/azure/ai/projects/onedp/aio/operations/__init__.py +++ b/sdk/ai/azure-ai-projects-onedp/azure/ai/projects/onedp/aio/operations/__init__.py @@ -18,7 +18,6 @@ from ._operations import DatasetsOperations # type: ignore from ._operations import IndexesOperations # type: ignore from ._operations import DeploymentsOperations # type: ignore -from ._operations import EvaluationResultsOperations # type: ignore from ._operations import RedTeamsOperations # type: ignore from ._patch import __all__ as _patch_all @@ -32,7 +31,6 @@ "DatasetsOperations", "IndexesOperations", "DeploymentsOperations", - "EvaluationResultsOperations", "RedTeamsOperations", ] __all__.extend([p for p in _patch_all if p not in __all__]) # pyright: ignore diff --git a/sdk/ai/azure-ai-projects-onedp/azure/ai/projects/onedp/aio/operations/_operations.py b/sdk/ai/azure-ai-projects-onedp/azure/ai/projects/onedp/aio/operations/_operations.py index 480f52e3c34e..1299b6fdaed3 100644 --- a/sdk/ai/azure-ai-projects-onedp/azure/ai/projects/onedp/aio/operations/_operations.py +++ b/sdk/ai/azure-ai-projects-onedp/azure/ai/projects/onedp/aio/operations/_operations.py @@ -36,28 +36,19 @@ from ..._validation import api_version_validation from ...operations._operations import ( build_connections_get_request, + build_connections_get_with_credentials_request, build_connections_list_request, - build_datasets_create_request, build_datasets_create_version_request, build_datasets_delete_version_request, build_datasets_get_version_request, build_datasets_list_latest_request, build_datasets_list_versions_request, - build_datasets_start_pending_upload_request, build_datasets_start_pending_upload_version_request, build_deployments_get_request, build_deployments_list_request, - build_evaluation_results_create_request, - build_evaluation_results_create_version_request, - build_evaluation_results_delete_version_request, - build_evaluation_results_get_version_request, - build_evaluation_results_list_latest_request, - build_evaluation_results_list_versions_request, - build_evaluation_results_start_pending_upload_request, build_evaluations_create_run_request, build_evaluations_get_request, build_evaluations_list_request, - build_indexes_create_request, build_indexes_create_version_request, build_indexes_delete_version_request, build_indexes_get_version_request, @@ -119,7 +110,7 @@ def __init__(self, *args, **kwargs) -> None: @distributed_trace_async async def get(self, name: str, **kwargs: Any) -> _models.Connection: - """Get a connection by name. + """Get a connection by name, without populating connection credentials. :param name: The name of the resource. Required. :type name: str @@ -182,21 +173,90 @@ async def get(self, name: str, **kwargs: Any) -> _models.Connection: return deserialized # type: ignore + @distributed_trace_async + async def get_with_credentials(self, name: str, **kwargs: Any) -> _models.Connection: + """Get a connection by name, with its connection credentials. + + :param name: The name of the resource. Required. + :type name: str + :return: Connection. The Connection is compatible with MutableMapping + :rtype: ~azure.ai.projects.onedp.models.Connection + :raises ~azure.core.exceptions.HttpResponseError: + """ + error_map: MutableMapping = { + 401: ClientAuthenticationError, + 404: ResourceNotFoundError, + 409: ResourceExistsError, + 304: ResourceNotModifiedError, + } + error_map.update(kwargs.pop("error_map", {}) or {}) + + _headers = kwargs.pop("headers", {}) or {} + _params = kwargs.pop("params", {}) or {} + + cls: ClsType[_models.Connection] = kwargs.pop("cls", None) + + _request = build_connections_get_with_credentials_request( + name=name, + api_version=self._config.api_version, + headers=_headers, + params=_params, + ) + path_format_arguments = { + "endpoint": self._serialize.url("self._config.endpoint", self._config.endpoint, "str", skip_quote=True), + } + _request.url = self._client.format_url(_request.url, **path_format_arguments) + + _stream = kwargs.pop("stream", False) + pipeline_response: PipelineResponse = await self._client._pipeline.run( # pylint: disable=protected-access + _request, stream=_stream, **kwargs + ) + + response = pipeline_response.http_response + + if response.status_code not in [200]: + if _stream: + try: + await response.read() # Load the body in memory and close the socket + except (StreamConsumedError, StreamClosedError): + pass + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise HttpResponseError(response=response) + + response_headers = {} + response_headers["x-ms-client-request-id"] = self._deserialize( + "str", response.headers.get("x-ms-client-request-id") + ) + + if _stream: + deserialized = response.iter_bytes() + else: + deserialized = _deserialize(_models.Connection, response.json()) + + if cls: + return cls(pipeline_response, deserialized, response_headers) # type: ignore + + return deserialized # type: ignore + @distributed_trace def list( self, *, connection_type: Optional[Union[str, _models.ConnectionType]] = None, + default_connection: Optional[bool] = None, top: Optional[int] = None, skip: Optional[int] = None, **kwargs: Any ) -> AsyncIterable["_models.Connection"]: - """List all connections in the project. + """List all connections in the project, without populating connection credentials. - :keyword connection_type: Specific type of connection to return in list. Known values are: - "AzureOpenAI", "AzureBlob", "CognitiveSearch", "CosmosDB", "ApiKey", "AppInsights", and - "CustomKeys". Default value is None. + :keyword connection_type: List connections of this specific type. Known values are: + "AzureOpenAI", "AzureBlob", "AzureStorageAccount", "CognitiveSearch", "CosmosDB", "ApiKey", + "AppConfig", "AppInsights", and "CustomKeys". Default value is None. :paramtype connection_type: str or ~azure.ai.projects.onedp.models.ConnectionType + :keyword default_connection: List connections that are default connections. Default value is + None. + :paramtype default_connection: bool :keyword top: The number of result items to return. Default value is None. :paramtype top: int :keyword skip: The number of result items to skip. Default value is None. @@ -224,6 +284,7 @@ def prepare_request(next_link=None): _request = build_connections_list_request( connection_type=connection_type, + default_connection=default_connection, top=top, skip=skip, maxpagesize=maxpagesize, @@ -941,143 +1002,6 @@ async def delete_version(self, name: str, version: str, **kwargs: Any) -> None: if cls: return cls(pipeline_response, None, {}) # type: ignore - @overload - async def create( - self, name: str, body: _models.DatasetVersion, *, content_type: str = "application/json", **kwargs: Any - ) -> _models.DatasetVersion: - """Create a new DatasetVersion. The version id will be generated by the service. - - :param name: The name of the resource. Required. - :type name: str - :param body: The definition of the DatasetVersion to create. Required. - :type body: ~azure.ai.projects.onedp.models.DatasetVersion - :keyword content_type: Body Parameter content-type. Content type parameter for JSON body. - Default value is "application/json". - :paramtype content_type: str - :return: DatasetVersion. The DatasetVersion is compatible with MutableMapping - :rtype: ~azure.ai.projects.onedp.models.DatasetVersion - :raises ~azure.core.exceptions.HttpResponseError: - """ - - @overload - async def create( - self, name: str, body: JSON, *, content_type: str = "application/json", **kwargs: Any - ) -> _models.DatasetVersion: - """Create a new DatasetVersion. The version id will be generated by the service. - - :param name: The name of the resource. Required. - :type name: str - :param body: The definition of the DatasetVersion to create. Required. - :type body: JSON - :keyword content_type: Body Parameter content-type. Content type parameter for JSON body. - Default value is "application/json". - :paramtype content_type: str - :return: DatasetVersion. The DatasetVersion is compatible with MutableMapping - :rtype: ~azure.ai.projects.onedp.models.DatasetVersion - :raises ~azure.core.exceptions.HttpResponseError: - """ - - @overload - async def create( - self, name: str, body: IO[bytes], *, content_type: str = "application/json", **kwargs: Any - ) -> _models.DatasetVersion: - """Create a new DatasetVersion. The version id will be generated by the service. - - :param name: The name of the resource. Required. - :type name: str - :param body: The definition of the DatasetVersion to create. Required. - :type body: IO[bytes] - :keyword content_type: Body Parameter content-type. Content type parameter for binary body. - Default value is "application/json". - :paramtype content_type: str - :return: DatasetVersion. The DatasetVersion is compatible with MutableMapping - :rtype: ~azure.ai.projects.onedp.models.DatasetVersion - :raises ~azure.core.exceptions.HttpResponseError: - """ - - @distributed_trace_async - async def create( - self, name: str, body: Union[_models.DatasetVersion, JSON, IO[bytes]], **kwargs: Any - ) -> _models.DatasetVersion: - """Create a new DatasetVersion. The version id will be generated by the service. - - :param name: The name of the resource. Required. - :type name: str - :param body: The definition of the DatasetVersion to create. Is one of the following types: - DatasetVersion, JSON, IO[bytes] Required. - :type body: ~azure.ai.projects.onedp.models.DatasetVersion or JSON or IO[bytes] - :return: DatasetVersion. The DatasetVersion is compatible with MutableMapping - :rtype: ~azure.ai.projects.onedp.models.DatasetVersion - :raises ~azure.core.exceptions.HttpResponseError: - """ - error_map: MutableMapping = { - 401: ClientAuthenticationError, - 404: ResourceNotFoundError, - 409: ResourceExistsError, - 304: ResourceNotModifiedError, - } - error_map.update(kwargs.pop("error_map", {}) or {}) - - _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) - _params = kwargs.pop("params", {}) or {} - - content_type: Optional[str] = kwargs.pop("content_type", _headers.pop("Content-Type", None)) - cls: ClsType[_models.DatasetVersion] = kwargs.pop("cls", None) - - content_type = content_type or "application/json" - _content = None - if isinstance(body, (IOBase, bytes)): - _content = body - else: - _content = json.dumps(body, cls=SdkJSONEncoder, exclude_readonly=True) # type: ignore - - _request = build_datasets_create_request( - name=name, - content_type=content_type, - api_version=self._config.api_version, - content=_content, - headers=_headers, - params=_params, - ) - path_format_arguments = { - "endpoint": self._serialize.url("self._config.endpoint", self._config.endpoint, "str", skip_quote=True), - } - _request.url = self._client.format_url(_request.url, **path_format_arguments) - - _stream = kwargs.pop("stream", False) - pipeline_response: PipelineResponse = await self._client._pipeline.run( # pylint: disable=protected-access - _request, stream=_stream, **kwargs - ) - - response = pipeline_response.http_response - - if response.status_code not in [200]: - if _stream: - try: - await response.read() # Load the body in memory and close the socket - except (StreamConsumedError, StreamClosedError): - pass - map_error(status_code=response.status_code, response=response, error_map=error_map) - raise HttpResponseError(response=response) - - response_headers = {} - response_headers["Repeatability-Result"] = self._deserialize( - "str", response.headers.get("Repeatability-Result") - ) - response_headers["x-ms-client-request-id"] = self._deserialize( - "str", response.headers.get("x-ms-client-request-id") - ) - - if _stream: - deserialized = response.iter_bytes() - else: - deserialized = _deserialize(_models.DatasetVersion, response.json()) - - if cls: - return cls(pipeline_response, deserialized, response_headers) # type: ignore - - return deserialized # type: ignore - @overload async def create_version( self, @@ -1232,7 +1156,7 @@ async def start_pending_upload_version( content_type: str = "application/json", **kwargs: Any ) -> _models.PendingUploadResponse: - """Create or start a pending upload of a dataset for a specific version. + """Start a new or get an existing pending upload of a dataset for a specific version. :param name: The name of the resource. Required. :type name: str @@ -1252,7 +1176,7 @@ async def start_pending_upload_version( async def start_pending_upload_version( self, name: str, version: str, body: JSON, *, content_type: str = "application/json", **kwargs: Any ) -> _models.PendingUploadResponse: - """Create or start a pending upload of a dataset for a specific version. + """Start a new or get an existing pending upload of a dataset for a specific version. :param name: The name of the resource. Required. :type name: str @@ -1272,7 +1196,7 @@ async def start_pending_upload_version( async def start_pending_upload_version( self, name: str, version: str, body: IO[bytes], *, content_type: str = "application/json", **kwargs: Any ) -> _models.PendingUploadResponse: - """Create or start a pending upload of a dataset for a specific version. + """Start a new or get an existing pending upload of a dataset for a specific version. :param name: The name of the resource. Required. :type name: str @@ -1292,7 +1216,7 @@ async def start_pending_upload_version( async def start_pending_upload_version( self, name: str, version: str, body: Union[_models.PendingUploadRequest, JSON, IO[bytes]], **kwargs: Any ) -> _models.PendingUploadResponse: - """Create or start a pending upload of a dataset for a specific version. + """Start a new or get an existing pending upload of a dataset for a specific version. :param name: The name of the resource. Required. :type name: str @@ -1366,188 +1290,59 @@ async def start_pending_upload_version( return deserialized # type: ignore - @overload - async def start_pending_upload( - self, name: str, body: _models.PendingUploadRequest, *, content_type: str = "application/json", **kwargs: Any - ) -> _models.PendingUploadResponse: - """Create or start a pending upload of a dataset. The version id will be generated by the service. - :param name: The name of the resource. Required. - :type name: str - :param body: Parameters for the action. Required. - :type body: ~azure.ai.projects.onedp.models.PendingUploadRequest - :keyword content_type: Body Parameter content-type. Content type parameter for JSON body. - Default value is "application/json". - :paramtype content_type: str - :return: PendingUploadResponse. The PendingUploadResponse is compatible with MutableMapping - :rtype: ~azure.ai.projects.onedp.models.PendingUploadResponse - :raises ~azure.core.exceptions.HttpResponseError: - """ +class IndexesOperations: + """ + .. warning:: + **DO NOT** instantiate this class directly. - @overload - async def start_pending_upload( - self, name: str, body: JSON, *, content_type: str = "application/json", **kwargs: Any - ) -> _models.PendingUploadResponse: - """Create or start a pending upload of a dataset. The version id will be generated by the service. + Instead, you should access the following operations through + :class:`~azure.ai.projects.onedp.aio.AIProjectClient`'s + :attr:`indexes` attribute. + """ + + def __init__(self, *args, **kwargs) -> None: + input_args = list(args) + self._client: AsyncPipelineClient = input_args.pop(0) if input_args else kwargs.pop("client") + self._config: AIProjectClientConfiguration = input_args.pop(0) if input_args else kwargs.pop("config") + self._serialize: Serializer = input_args.pop(0) if input_args else kwargs.pop("serializer") + self._deserialize: Deserializer = input_args.pop(0) if input_args else kwargs.pop("deserializer") + + @distributed_trace + def list_versions( + self, + name: str, + *, + top: Optional[int] = None, + skip: Optional[str] = None, + tags: Optional[str] = None, + list_view_type: Optional[Union[str, _models.ListViewType]] = None, + **kwargs: Any + ) -> AsyncIterable["_models.Index"]: + """List all versions of the given Index. :param name: The name of the resource. Required. :type name: str - :param body: Parameters for the action. Required. - :type body: JSON - :keyword content_type: Body Parameter content-type. Content type parameter for JSON body. - Default value is "application/json". - :paramtype content_type: str - :return: PendingUploadResponse. The PendingUploadResponse is compatible with MutableMapping - :rtype: ~azure.ai.projects.onedp.models.PendingUploadResponse + :keyword top: Top count of results, top count cannot be greater than the page size. If topCount + > page size, results with be default page size count will be returned. Default value is None. + :paramtype top: int + :keyword skip: Continuation token for pagination. Default value is None. + :paramtype skip: str + :keyword tags: Comma-separated list of tag names (and optionally values). Example: + tag1,tag2=value2. Default value is None. + :paramtype tags: str + :keyword list_view_type: [ListViewType.ActiveOnly, ListViewType.ArchivedOnly, ListViewType.All] + View type for including/excluding (for example) archived entities. Known values are: + "ActiveOnly", "ArchivedOnly", and "All". Default value is None. + :paramtype list_view_type: str or ~azure.ai.projects.onedp.models.ListViewType + :return: An iterator like instance of Index + :rtype: ~azure.core.async_paging.AsyncItemPaged[~azure.ai.projects.onedp.models.Index] :raises ~azure.core.exceptions.HttpResponseError: """ + _headers = kwargs.pop("headers", {}) or {} + _params = kwargs.pop("params", {}) or {} - @overload - async def start_pending_upload( - self, name: str, body: IO[bytes], *, content_type: str = "application/json", **kwargs: Any - ) -> _models.PendingUploadResponse: - """Create or start a pending upload of a dataset. The version id will be generated by the service. - - :param name: The name of the resource. Required. - :type name: str - :param body: Parameters for the action. Required. - :type body: IO[bytes] - :keyword content_type: Body Parameter content-type. Content type parameter for binary body. - Default value is "application/json". - :paramtype content_type: str - :return: PendingUploadResponse. The PendingUploadResponse is compatible with MutableMapping - :rtype: ~azure.ai.projects.onedp.models.PendingUploadResponse - :raises ~azure.core.exceptions.HttpResponseError: - """ - - @distributed_trace_async - async def start_pending_upload( - self, name: str, body: Union[_models.PendingUploadRequest, JSON, IO[bytes]], **kwargs: Any - ) -> _models.PendingUploadResponse: - """Create or start a pending upload of a dataset. The version id will be generated by the service. - - :param name: The name of the resource. Required. - :type name: str - :param body: Parameters for the action. Is one of the following types: PendingUploadRequest, - JSON, IO[bytes] Required. - :type body: ~azure.ai.projects.onedp.models.PendingUploadRequest or JSON or IO[bytes] - :return: PendingUploadResponse. The PendingUploadResponse is compatible with MutableMapping - :rtype: ~azure.ai.projects.onedp.models.PendingUploadResponse - :raises ~azure.core.exceptions.HttpResponseError: - """ - error_map: MutableMapping = { - 401: ClientAuthenticationError, - 404: ResourceNotFoundError, - 409: ResourceExistsError, - 304: ResourceNotModifiedError, - } - error_map.update(kwargs.pop("error_map", {}) or {}) - - _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) - _params = kwargs.pop("params", {}) or {} - - content_type: Optional[str] = kwargs.pop("content_type", _headers.pop("Content-Type", None)) - cls: ClsType[_models.PendingUploadResponse] = kwargs.pop("cls", None) - - content_type = content_type or "application/json" - _content = None - if isinstance(body, (IOBase, bytes)): - _content = body - else: - _content = json.dumps(body, cls=SdkJSONEncoder, exclude_readonly=True) # type: ignore - - _request = build_datasets_start_pending_upload_request( - name=name, - content_type=content_type, - api_version=self._config.api_version, - content=_content, - headers=_headers, - params=_params, - ) - path_format_arguments = { - "endpoint": self._serialize.url("self._config.endpoint", self._config.endpoint, "str", skip_quote=True), - } - _request.url = self._client.format_url(_request.url, **path_format_arguments) - - _stream = kwargs.pop("stream", False) - pipeline_response: PipelineResponse = await self._client._pipeline.run( # pylint: disable=protected-access - _request, stream=_stream, **kwargs - ) - - response = pipeline_response.http_response - - if response.status_code not in [200]: - if _stream: - try: - await response.read() # Load the body in memory and close the socket - except (StreamConsumedError, StreamClosedError): - pass - map_error(status_code=response.status_code, response=response, error_map=error_map) - raise HttpResponseError(response=response) - - if _stream: - deserialized = response.iter_bytes() - else: - deserialized = _deserialize(_models.PendingUploadResponse, response.json()) - - if cls: - return cls(pipeline_response, deserialized, {}) # type: ignore - - return deserialized # type: ignore - - -class IndexesOperations: - """ - .. warning:: - **DO NOT** instantiate this class directly. - - Instead, you should access the following operations through - :class:`~azure.ai.projects.onedp.aio.AIProjectClient`'s - :attr:`indexes` attribute. - """ - - def __init__(self, *args, **kwargs) -> None: - input_args = list(args) - self._client: AsyncPipelineClient = input_args.pop(0) if input_args else kwargs.pop("client") - self._config: AIProjectClientConfiguration = input_args.pop(0) if input_args else kwargs.pop("config") - self._serialize: Serializer = input_args.pop(0) if input_args else kwargs.pop("serializer") - self._deserialize: Deserializer = input_args.pop(0) if input_args else kwargs.pop("deserializer") - - @distributed_trace - def list_versions( - self, - name: str, - *, - top: Optional[int] = None, - skip: Optional[str] = None, - tags: Optional[str] = None, - list_view_type: Optional[Union[str, _models.ListViewType]] = None, - **kwargs: Any - ) -> AsyncIterable["_models.Index"]: - """List all versions of the given Index. - - :param name: The name of the resource. Required. - :type name: str - :keyword top: Top count of results, top count cannot be greater than the page size. If topCount - > page size, results with be default page size count will be returned. Default value is None. - :paramtype top: int - :keyword skip: Continuation token for pagination. Default value is None. - :paramtype skip: str - :keyword tags: Comma-separated list of tag names (and optionally values). Example: - tag1,tag2=value2. Default value is None. - :paramtype tags: str - :keyword list_view_type: [ListViewType.ActiveOnly, ListViewType.ArchivedOnly, ListViewType.All] - View type for including/excluding (for example) archived entities. Known values are: - "ActiveOnly", "ArchivedOnly", and "All". Default value is None. - :paramtype list_view_type: str or ~azure.ai.projects.onedp.models.ListViewType - :return: An iterator like instance of Index - :rtype: ~azure.core.async_paging.AsyncItemPaged[~azure.ai.projects.onedp.models.Index] - :raises ~azure.core.exceptions.HttpResponseError: - """ - _headers = kwargs.pop("headers", {}) or {} - _params = kwargs.pop("params", {}) or {} - - cls: ClsType[List[_models.Index]] = kwargs.pop("cls", None) + cls: ClsType[List[_models.Index]] = kwargs.pop("cls", None) error_map: MutableMapping = { 401: ClientAuthenticationError, @@ -1843,141 +1638,6 @@ async def delete_version(self, name: str, version: str, **kwargs: Any) -> None: if cls: return cls(pipeline_response, None, {}) # type: ignore - @overload - async def create( - self, name: str, body: _models.Index, *, content_type: str = "application/json", **kwargs: Any - ) -> _models.Index: - """Create a new Index. The version id will be generated by the service. - - :param name: The name of the resource. Required. - :type name: str - :param body: The definition of the Index to create. Required. - :type body: ~azure.ai.projects.onedp.models.Index - :keyword content_type: Body Parameter content-type. Content type parameter for JSON body. - Default value is "application/json". - :paramtype content_type: str - :return: Index. The Index is compatible with MutableMapping - :rtype: ~azure.ai.projects.onedp.models.Index - :raises ~azure.core.exceptions.HttpResponseError: - """ - - @overload - async def create( - self, name: str, body: JSON, *, content_type: str = "application/json", **kwargs: Any - ) -> _models.Index: - """Create a new Index. The version id will be generated by the service. - - :param name: The name of the resource. Required. - :type name: str - :param body: The definition of the Index to create. Required. - :type body: JSON - :keyword content_type: Body Parameter content-type. Content type parameter for JSON body. - Default value is "application/json". - :paramtype content_type: str - :return: Index. The Index is compatible with MutableMapping - :rtype: ~azure.ai.projects.onedp.models.Index - :raises ~azure.core.exceptions.HttpResponseError: - """ - - @overload - async def create( - self, name: str, body: IO[bytes], *, content_type: str = "application/json", **kwargs: Any - ) -> _models.Index: - """Create a new Index. The version id will be generated by the service. - - :param name: The name of the resource. Required. - :type name: str - :param body: The definition of the Index to create. Required. - :type body: IO[bytes] - :keyword content_type: Body Parameter content-type. Content type parameter for binary body. - Default value is "application/json". - :paramtype content_type: str - :return: Index. The Index is compatible with MutableMapping - :rtype: ~azure.ai.projects.onedp.models.Index - :raises ~azure.core.exceptions.HttpResponseError: - """ - - @distributed_trace_async - async def create(self, name: str, body: Union[_models.Index, JSON, IO[bytes]], **kwargs: Any) -> _models.Index: - """Create a new Index. The version id will be generated by the service. - - :param name: The name of the resource. Required. - :type name: str - :param body: The definition of the Index to create. Is one of the following types: Index, JSON, - IO[bytes] Required. - :type body: ~azure.ai.projects.onedp.models.Index or JSON or IO[bytes] - :return: Index. The Index is compatible with MutableMapping - :rtype: ~azure.ai.projects.onedp.models.Index - :raises ~azure.core.exceptions.HttpResponseError: - """ - error_map: MutableMapping = { - 401: ClientAuthenticationError, - 404: ResourceNotFoundError, - 409: ResourceExistsError, - 304: ResourceNotModifiedError, - } - error_map.update(kwargs.pop("error_map", {}) or {}) - - _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) - _params = kwargs.pop("params", {}) or {} - - content_type: Optional[str] = kwargs.pop("content_type", _headers.pop("Content-Type", None)) - cls: ClsType[_models.Index] = kwargs.pop("cls", None) - - content_type = content_type or "application/json" - _content = None - if isinstance(body, (IOBase, bytes)): - _content = body - else: - _content = json.dumps(body, cls=SdkJSONEncoder, exclude_readonly=True) # type: ignore - - _request = build_indexes_create_request( - name=name, - content_type=content_type, - api_version=self._config.api_version, - content=_content, - headers=_headers, - params=_params, - ) - path_format_arguments = { - "endpoint": self._serialize.url("self._config.endpoint", self._config.endpoint, "str", skip_quote=True), - } - _request.url = self._client.format_url(_request.url, **path_format_arguments) - - _stream = kwargs.pop("stream", False) - pipeline_response: PipelineResponse = await self._client._pipeline.run( # pylint: disable=protected-access - _request, stream=_stream, **kwargs - ) - - response = pipeline_response.http_response - - if response.status_code not in [200]: - if _stream: - try: - await response.read() # Load the body in memory and close the socket - except (StreamConsumedError, StreamClosedError): - pass - map_error(status_code=response.status_code, response=response, error_map=error_map) - raise HttpResponseError(response=response) - - response_headers = {} - response_headers["Repeatability-Result"] = self._deserialize( - "str", response.headers.get("Repeatability-Result") - ) - response_headers["x-ms-client-request-id"] = self._deserialize( - "str", response.headers.get("x-ms-client-request-id") - ) - - if _stream: - deserialized = response.iter_bytes() - else: - deserialized = _deserialize(_models.Index, response.json()) - - if cls: - return cls(pipeline_response, deserialized, response_headers) # type: ignore - - return deserialized # type: ignore - @overload async def create_version( self, name: str, version: str, body: _models.Index, *, content_type: str = "application/json", **kwargs: Any @@ -2305,821 +1965,6 @@ async def get_next(next_link=None): return AsyncItemPaged(get_next, extract_data) -class EvaluationResultsOperations: - """ - .. warning:: - **DO NOT** instantiate this class directly. - - Instead, you should access the following operations through - :class:`~azure.ai.projects.onedp.aio.AIProjectClient`'s - :attr:`evaluation_results` attribute. - """ - - def __init__(self, *args, **kwargs) -> None: - input_args = list(args) - self._client: AsyncPipelineClient = input_args.pop(0) if input_args else kwargs.pop("client") - self._config: AIProjectClientConfiguration = input_args.pop(0) if input_args else kwargs.pop("config") - self._serialize: Serializer = input_args.pop(0) if input_args else kwargs.pop("serializer") - self._deserialize: Deserializer = input_args.pop(0) if input_args else kwargs.pop("deserializer") - - @distributed_trace - @api_version_validation( - method_added_on="2025-05-15-preview", - params_added_on={ - "2025-05-15-preview": ["api_version", "name", "top", "skip", "tags", "list_view_type", "accept"] - }, - ) - def list_versions( - self, - name: str, - *, - top: Optional[int] = None, - skip: Optional[str] = None, - tags: Optional[str] = None, - list_view_type: Optional[Union[str, _models.ListViewType]] = None, - **kwargs: Any - ) -> AsyncIterable["_models.EvaluationResult"]: - """List all versions of the given EvaluationResult. - - :param name: The name of the resource. Required. - :type name: str - :keyword top: Top count of results, top count cannot be greater than the page size. If topCount - > page size, results with be default page size count will be returned. Default value is None. - :paramtype top: int - :keyword skip: Continuation token for pagination. Default value is None. - :paramtype skip: str - :keyword tags: Comma-separated list of tag names (and optionally values). Example: - tag1,tag2=value2. Default value is None. - :paramtype tags: str - :keyword list_view_type: [ListViewType.ActiveOnly, ListViewType.ArchivedOnly, ListViewType.All] - View type for including/excluding (for example) archived entities. Known values are: - "ActiveOnly", "ArchivedOnly", and "All". Default value is None. - :paramtype list_view_type: str or ~azure.ai.projects.onedp.models.ListViewType - :return: An iterator like instance of EvaluationResult - :rtype: - ~azure.core.async_paging.AsyncItemPaged[~azure.ai.projects.onedp.models.EvaluationResult] - :raises ~azure.core.exceptions.HttpResponseError: - """ - _headers = kwargs.pop("headers", {}) or {} - _params = kwargs.pop("params", {}) or {} - - cls: ClsType[List[_models.EvaluationResult]] = kwargs.pop("cls", None) - - error_map: MutableMapping = { - 401: ClientAuthenticationError, - 404: ResourceNotFoundError, - 409: ResourceExistsError, - 304: ResourceNotModifiedError, - } - error_map.update(kwargs.pop("error_map", {}) or {}) - - def prepare_request(next_link=None): - if not next_link: - - _request = build_evaluation_results_list_versions_request( - name=name, - top=top, - skip=skip, - tags=tags, - list_view_type=list_view_type, - api_version=self._config.api_version, - headers=_headers, - params=_params, - ) - path_format_arguments = { - "endpoint": self._serialize.url( - "self._config.endpoint", self._config.endpoint, "str", skip_quote=True - ), - } - _request.url = self._client.format_url(_request.url, **path_format_arguments) - - else: - # make call to next link with the client's api-version - _parsed_next_link = urllib.parse.urlparse(next_link) - _next_request_params = case_insensitive_dict( - { - key: [urllib.parse.quote(v) for v in value] - for key, value in urllib.parse.parse_qs(_parsed_next_link.query).items() - } - ) - _next_request_params["api-version"] = self._config.api_version - _request = HttpRequest( - "GET", urllib.parse.urljoin(next_link, _parsed_next_link.path), params=_next_request_params - ) - path_format_arguments = { - "endpoint": self._serialize.url( - "self._config.endpoint", self._config.endpoint, "str", skip_quote=True - ), - } - _request.url = self._client.format_url(_request.url, **path_format_arguments) - - return _request - - async def extract_data(pipeline_response): - deserialized = pipeline_response.http_response.json() - list_of_elem = _deserialize(List[_models.EvaluationResult], deserialized.get("value", [])) - if cls: - list_of_elem = cls(list_of_elem) # type: ignore - return deserialized.get("nextLink") or None, AsyncList(list_of_elem) - - async def get_next(next_link=None): - _request = prepare_request(next_link) - - _stream = False - pipeline_response: PipelineResponse = await self._client._pipeline.run( # pylint: disable=protected-access - _request, stream=_stream, **kwargs - ) - response = pipeline_response.http_response - - if response.status_code not in [200]: - map_error(status_code=response.status_code, response=response, error_map=error_map) - raise HttpResponseError(response=response) - - return pipeline_response - - return AsyncItemPaged(get_next, extract_data) - - @distributed_trace - @api_version_validation( - method_added_on="2025-05-15-preview", - params_added_on={"2025-05-15-preview": ["api_version", "top", "skip", "tags", "list_view_type", "accept"]}, - ) - def list_latest( - self, - *, - top: Optional[int] = None, - skip: Optional[str] = None, - tags: Optional[str] = None, - list_view_type: Optional[Union[str, _models.ListViewType]] = None, - **kwargs: Any - ) -> AsyncIterable["_models.EvaluationResult"]: - """List the latest version of each EvaluationResult. - - :keyword top: Top count of results, top count cannot be greater than the page size. If topCount - > page size, results with be default page size count will be returned. Default value is None. - :paramtype top: int - :keyword skip: Continuation token for pagination. Default value is None. - :paramtype skip: str - :keyword tags: Comma-separated list of tag names (and optionally values). Example: - tag1,tag2=value2. Default value is None. - :paramtype tags: str - :keyword list_view_type: [ListViewType.ActiveOnly, ListViewType.ArchivedOnly, ListViewType.All] - View type for including/excluding (for example) archived entities. Known values are: - "ActiveOnly", "ArchivedOnly", and "All". Default value is None. - :paramtype list_view_type: str or ~azure.ai.projects.onedp.models.ListViewType - :return: An iterator like instance of EvaluationResult - :rtype: - ~azure.core.async_paging.AsyncItemPaged[~azure.ai.projects.onedp.models.EvaluationResult] - :raises ~azure.core.exceptions.HttpResponseError: - """ - _headers = kwargs.pop("headers", {}) or {} - _params = kwargs.pop("params", {}) or {} - - cls: ClsType[List[_models.EvaluationResult]] = kwargs.pop("cls", None) - - error_map: MutableMapping = { - 401: ClientAuthenticationError, - 404: ResourceNotFoundError, - 409: ResourceExistsError, - 304: ResourceNotModifiedError, - } - error_map.update(kwargs.pop("error_map", {}) or {}) - - def prepare_request(next_link=None): - if not next_link: - - _request = build_evaluation_results_list_latest_request( - top=top, - skip=skip, - tags=tags, - list_view_type=list_view_type, - api_version=self._config.api_version, - headers=_headers, - params=_params, - ) - path_format_arguments = { - "endpoint": self._serialize.url( - "self._config.endpoint", self._config.endpoint, "str", skip_quote=True - ), - } - _request.url = self._client.format_url(_request.url, **path_format_arguments) - - else: - # make call to next link with the client's api-version - _parsed_next_link = urllib.parse.urlparse(next_link) - _next_request_params = case_insensitive_dict( - { - key: [urllib.parse.quote(v) for v in value] - for key, value in urllib.parse.parse_qs(_parsed_next_link.query).items() - } - ) - _next_request_params["api-version"] = self._config.api_version - _request = HttpRequest( - "GET", urllib.parse.urljoin(next_link, _parsed_next_link.path), params=_next_request_params - ) - path_format_arguments = { - "endpoint": self._serialize.url( - "self._config.endpoint", self._config.endpoint, "str", skip_quote=True - ), - } - _request.url = self._client.format_url(_request.url, **path_format_arguments) - - return _request - - async def extract_data(pipeline_response): - deserialized = pipeline_response.http_response.json() - list_of_elem = _deserialize(List[_models.EvaluationResult], deserialized.get("value", [])) - if cls: - list_of_elem = cls(list_of_elem) # type: ignore - return deserialized.get("nextLink") or None, AsyncList(list_of_elem) - - async def get_next(next_link=None): - _request = prepare_request(next_link) - - _stream = False - pipeline_response: PipelineResponse = await self._client._pipeline.run( # pylint: disable=protected-access - _request, stream=_stream, **kwargs - ) - response = pipeline_response.http_response - - if response.status_code not in [200]: - map_error(status_code=response.status_code, response=response, error_map=error_map) - raise HttpResponseError(response=response) - - return pipeline_response - - return AsyncItemPaged(get_next, extract_data) - - @distributed_trace_async - @api_version_validation( - method_added_on="2025-05-15-preview", - params_added_on={"2025-05-15-preview": ["api_version", "name", "version", "accept"]}, - ) - async def get_version(self, name: str, version: str, **kwargs: Any) -> _models.EvaluationResult: - """Get the specific version of the EvaluationResult. - - :param name: The name of the resource. Required. - :type name: str - :param version: The specific version id of the EvaluationResult to retrieve. Required. - :type version: str - :return: EvaluationResult. The EvaluationResult is compatible with MutableMapping - :rtype: ~azure.ai.projects.onedp.models.EvaluationResult - :raises ~azure.core.exceptions.HttpResponseError: - """ - error_map: MutableMapping = { - 401: ClientAuthenticationError, - 404: ResourceNotFoundError, - 409: ResourceExistsError, - 304: ResourceNotModifiedError, - } - error_map.update(kwargs.pop("error_map", {}) or {}) - - _headers = kwargs.pop("headers", {}) or {} - _params = kwargs.pop("params", {}) or {} - - cls: ClsType[_models.EvaluationResult] = kwargs.pop("cls", None) - - _request = build_evaluation_results_get_version_request( - name=name, - version=version, - api_version=self._config.api_version, - headers=_headers, - params=_params, - ) - path_format_arguments = { - "endpoint": self._serialize.url("self._config.endpoint", self._config.endpoint, "str", skip_quote=True), - } - _request.url = self._client.format_url(_request.url, **path_format_arguments) - - _stream = kwargs.pop("stream", False) - pipeline_response: PipelineResponse = await self._client._pipeline.run( # pylint: disable=protected-access - _request, stream=_stream, **kwargs - ) - - response = pipeline_response.http_response - - if response.status_code not in [200]: - if _stream: - try: - await response.read() # Load the body in memory and close the socket - except (StreamConsumedError, StreamClosedError): - pass - map_error(status_code=response.status_code, response=response, error_map=error_map) - raise HttpResponseError(response=response) - - if _stream: - deserialized = response.iter_bytes() - else: - deserialized = _deserialize(_models.EvaluationResult, response.json()) - - if cls: - return cls(pipeline_response, deserialized, {}) # type: ignore - - return deserialized # type: ignore - - @distributed_trace_async - @api_version_validation( - method_added_on="2025-05-15-preview", - params_added_on={"2025-05-15-preview": ["api_version", "name", "version", "accept"]}, - ) - async def delete_version(self, name: str, version: str, **kwargs: Any) -> None: - """Delete the specific version of the EvaluationResult. - - :param name: The name of the resource. Required. - :type name: str - :param version: The version of the EvaluationResult to delete. Required. - :type version: str - :return: None - :rtype: None - :raises ~azure.core.exceptions.HttpResponseError: - """ - error_map: MutableMapping = { - 401: ClientAuthenticationError, - 404: ResourceNotFoundError, - 409: ResourceExistsError, - 304: ResourceNotModifiedError, - } - error_map.update(kwargs.pop("error_map", {}) or {}) - - _headers = kwargs.pop("headers", {}) or {} - _params = kwargs.pop("params", {}) or {} - - cls: ClsType[None] = kwargs.pop("cls", None) - - _request = build_evaluation_results_delete_version_request( - name=name, - version=version, - api_version=self._config.api_version, - headers=_headers, - params=_params, - ) - path_format_arguments = { - "endpoint": self._serialize.url("self._config.endpoint", self._config.endpoint, "str", skip_quote=True), - } - _request.url = self._client.format_url(_request.url, **path_format_arguments) - - _stream = False - pipeline_response: PipelineResponse = await self._client._pipeline.run( # pylint: disable=protected-access - _request, stream=_stream, **kwargs - ) - - response = pipeline_response.http_response - - if response.status_code not in [204]: - map_error(status_code=response.status_code, response=response, error_map=error_map) - raise HttpResponseError(response=response) - - if cls: - return cls(pipeline_response, None, {}) # type: ignore - - @overload - async def create( - self, name: str, body: _models.EvaluationResult, *, content_type: str = "application/json", **kwargs: Any - ) -> _models.EvaluationResult: - """Create a new EvaluationResult. The version id will be generated by the service. - - :param name: The name of the resource. Required. - :type name: str - :param body: The definition of the EvaluationResult to create. Required. - :type body: ~azure.ai.projects.onedp.models.EvaluationResult - :keyword content_type: Body Parameter content-type. Content type parameter for JSON body. - Default value is "application/json". - :paramtype content_type: str - :return: EvaluationResult. The EvaluationResult is compatible with MutableMapping - :rtype: ~azure.ai.projects.onedp.models.EvaluationResult - :raises ~azure.core.exceptions.HttpResponseError: - """ - - @overload - async def create( - self, name: str, body: JSON, *, content_type: str = "application/json", **kwargs: Any - ) -> _models.EvaluationResult: - """Create a new EvaluationResult. The version id will be generated by the service. - - :param name: The name of the resource. Required. - :type name: str - :param body: The definition of the EvaluationResult to create. Required. - :type body: JSON - :keyword content_type: Body Parameter content-type. Content type parameter for JSON body. - Default value is "application/json". - :paramtype content_type: str - :return: EvaluationResult. The EvaluationResult is compatible with MutableMapping - :rtype: ~azure.ai.projects.onedp.models.EvaluationResult - :raises ~azure.core.exceptions.HttpResponseError: - """ - - @overload - async def create( - self, name: str, body: IO[bytes], *, content_type: str = "application/json", **kwargs: Any - ) -> _models.EvaluationResult: - """Create a new EvaluationResult. The version id will be generated by the service. - - :param name: The name of the resource. Required. - :type name: str - :param body: The definition of the EvaluationResult to create. Required. - :type body: IO[bytes] - :keyword content_type: Body Parameter content-type. Content type parameter for binary body. - Default value is "application/json". - :paramtype content_type: str - :return: EvaluationResult. The EvaluationResult is compatible with MutableMapping - :rtype: ~azure.ai.projects.onedp.models.EvaluationResult - :raises ~azure.core.exceptions.HttpResponseError: - """ - - @distributed_trace_async - @api_version_validation( - method_added_on="2025-05-15-preview", - params_added_on={ - "2025-05-15-preview": [ - "api_version", - "name", - "repeatability_request_id", - "repeatability_first_sent", - "client_request_id", - "content_type", - "accept", - ] - }, - ) - async def create( - self, name: str, body: Union[_models.EvaluationResult, JSON, IO[bytes]], **kwargs: Any - ) -> _models.EvaluationResult: - """Create a new EvaluationResult. The version id will be generated by the service. - - :param name: The name of the resource. Required. - :type name: str - :param body: The definition of the EvaluationResult to create. Is one of the following types: - EvaluationResult, JSON, IO[bytes] Required. - :type body: ~azure.ai.projects.onedp.models.EvaluationResult or JSON or IO[bytes] - :return: EvaluationResult. The EvaluationResult is compatible with MutableMapping - :rtype: ~azure.ai.projects.onedp.models.EvaluationResult - :raises ~azure.core.exceptions.HttpResponseError: - """ - error_map: MutableMapping = { - 401: ClientAuthenticationError, - 404: ResourceNotFoundError, - 409: ResourceExistsError, - 304: ResourceNotModifiedError, - } - error_map.update(kwargs.pop("error_map", {}) or {}) - - _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) - _params = kwargs.pop("params", {}) or {} - - content_type: Optional[str] = kwargs.pop("content_type", _headers.pop("Content-Type", None)) - cls: ClsType[_models.EvaluationResult] = kwargs.pop("cls", None) - - content_type = content_type or "application/json" - _content = None - if isinstance(body, (IOBase, bytes)): - _content = body - else: - _content = json.dumps(body, cls=SdkJSONEncoder, exclude_readonly=True) # type: ignore - - _request = build_evaluation_results_create_request( - name=name, - content_type=content_type, - api_version=self._config.api_version, - content=_content, - headers=_headers, - params=_params, - ) - path_format_arguments = { - "endpoint": self._serialize.url("self._config.endpoint", self._config.endpoint, "str", skip_quote=True), - } - _request.url = self._client.format_url(_request.url, **path_format_arguments) - - _stream = kwargs.pop("stream", False) - pipeline_response: PipelineResponse = await self._client._pipeline.run( # pylint: disable=protected-access - _request, stream=_stream, **kwargs - ) - - response = pipeline_response.http_response - - if response.status_code not in [200]: - if _stream: - try: - await response.read() # Load the body in memory and close the socket - except (StreamConsumedError, StreamClosedError): - pass - map_error(status_code=response.status_code, response=response, error_map=error_map) - raise HttpResponseError(response=response) - - response_headers = {} - response_headers["Repeatability-Result"] = self._deserialize( - "str", response.headers.get("Repeatability-Result") - ) - response_headers["x-ms-client-request-id"] = self._deserialize( - "str", response.headers.get("x-ms-client-request-id") - ) - - if _stream: - deserialized = response.iter_bytes() - else: - deserialized = _deserialize(_models.EvaluationResult, response.json()) - - if cls: - return cls(pipeline_response, deserialized, response_headers) # type: ignore - - return deserialized # type: ignore - - @overload - async def create_version( - self, - name: str, - version: str, - body: _models.EvaluationResult, - *, - content_type: str = "application/json", - **kwargs: Any - ) -> _models.EvaluationResult: - """Create a new or replace an existing EvaluationResult with the given version id. - - :param name: The name of the resource. Required. - :type name: str - :param version: The specific version id of the EvaluationResult to create or replace. Required. - :type version: str - :param body: The definition of the EvaluationResult to create. Required. - :type body: ~azure.ai.projects.onedp.models.EvaluationResult - :keyword content_type: Body Parameter content-type. Content type parameter for JSON body. - Default value is "application/json". - :paramtype content_type: str - :return: EvaluationResult. The EvaluationResult is compatible with MutableMapping - :rtype: ~azure.ai.projects.onedp.models.EvaluationResult - :raises ~azure.core.exceptions.HttpResponseError: - """ - - @overload - async def create_version( - self, name: str, version: str, body: JSON, *, content_type: str = "application/json", **kwargs: Any - ) -> _models.EvaluationResult: - """Create a new or replace an existing EvaluationResult with the given version id. - - :param name: The name of the resource. Required. - :type name: str - :param version: The specific version id of the EvaluationResult to create or replace. Required. - :type version: str - :param body: The definition of the EvaluationResult to create. Required. - :type body: JSON - :keyword content_type: Body Parameter content-type. Content type parameter for JSON body. - Default value is "application/json". - :paramtype content_type: str - :return: EvaluationResult. The EvaluationResult is compatible with MutableMapping - :rtype: ~azure.ai.projects.onedp.models.EvaluationResult - :raises ~azure.core.exceptions.HttpResponseError: - """ - - @overload - async def create_version( - self, name: str, version: str, body: IO[bytes], *, content_type: str = "application/json", **kwargs: Any - ) -> _models.EvaluationResult: - """Create a new or replace an existing EvaluationResult with the given version id. - - :param name: The name of the resource. Required. - :type name: str - :param version: The specific version id of the EvaluationResult to create or replace. Required. - :type version: str - :param body: The definition of the EvaluationResult to create. Required. - :type body: IO[bytes] - :keyword content_type: Body Parameter content-type. Content type parameter for binary body. - Default value is "application/json". - :paramtype content_type: str - :return: EvaluationResult. The EvaluationResult is compatible with MutableMapping - :rtype: ~azure.ai.projects.onedp.models.EvaluationResult - :raises ~azure.core.exceptions.HttpResponseError: - """ - - @distributed_trace_async - @api_version_validation( - method_added_on="2025-05-15-preview", - params_added_on={"2025-05-15-preview": ["api_version", "name", "version", "content_type", "accept"]}, - ) - async def create_version( - self, name: str, version: str, body: Union[_models.EvaluationResult, JSON, IO[bytes]], **kwargs: Any - ) -> _models.EvaluationResult: - """Create a new or replace an existing EvaluationResult with the given version id. - - :param name: The name of the resource. Required. - :type name: str - :param version: The specific version id of the EvaluationResult to create or replace. Required. - :type version: str - :param body: The definition of the EvaluationResult to create. Is one of the following types: - EvaluationResult, JSON, IO[bytes] Required. - :type body: ~azure.ai.projects.onedp.models.EvaluationResult or JSON or IO[bytes] - :return: EvaluationResult. The EvaluationResult is compatible with MutableMapping - :rtype: ~azure.ai.projects.onedp.models.EvaluationResult - :raises ~azure.core.exceptions.HttpResponseError: - """ - error_map: MutableMapping = { - 401: ClientAuthenticationError, - 404: ResourceNotFoundError, - 409: ResourceExistsError, - 304: ResourceNotModifiedError, - } - error_map.update(kwargs.pop("error_map", {}) or {}) - - _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) - _params = kwargs.pop("params", {}) or {} - - content_type: Optional[str] = kwargs.pop("content_type", _headers.pop("Content-Type", None)) - cls: ClsType[_models.EvaluationResult] = kwargs.pop("cls", None) - - content_type = content_type or "application/json" - _content = None - if isinstance(body, (IOBase, bytes)): - _content = body - else: - _content = json.dumps(body, cls=SdkJSONEncoder, exclude_readonly=True) # type: ignore - - _request = build_evaluation_results_create_version_request( - name=name, - version=version, - content_type=content_type, - api_version=self._config.api_version, - content=_content, - headers=_headers, - params=_params, - ) - path_format_arguments = { - "endpoint": self._serialize.url("self._config.endpoint", self._config.endpoint, "str", skip_quote=True), - } - _request.url = self._client.format_url(_request.url, **path_format_arguments) - - _stream = kwargs.pop("stream", False) - pipeline_response: PipelineResponse = await self._client._pipeline.run( # pylint: disable=protected-access - _request, stream=_stream, **kwargs - ) - - response = pipeline_response.http_response - - if response.status_code not in [200, 201]: - if _stream: - try: - await response.read() # Load the body in memory and close the socket - except (StreamConsumedError, StreamClosedError): - pass - map_error(status_code=response.status_code, response=response, error_map=error_map) - raise HttpResponseError(response=response) - - if _stream: - deserialized = response.iter_bytes() - else: - deserialized = _deserialize(_models.EvaluationResult, response.json()) - - if cls: - return cls(pipeline_response, deserialized, {}) # type: ignore - - return deserialized # type: ignore - - @overload - async def start_pending_upload( - self, - name: str, - version: str, - body: _models.PendingUploadRequest, - *, - content_type: str = "application/json", - **kwargs: Any - ) -> _models.PendingUploadResponse: - """Create or start a pending upload of a evaluation results for a specific version. - - :param name: The name of the resource. Required. - :type name: str - :param version: The specific version id of the EvaluationResult to operate on. Required. - :type version: str - :param body: Parameters for the action. Required. - :type body: ~azure.ai.projects.onedp.models.PendingUploadRequest - :keyword content_type: Body Parameter content-type. Content type parameter for JSON body. - Default value is "application/json". - :paramtype content_type: str - :return: PendingUploadResponse. The PendingUploadResponse is compatible with MutableMapping - :rtype: ~azure.ai.projects.onedp.models.PendingUploadResponse - :raises ~azure.core.exceptions.HttpResponseError: - """ - - @overload - async def start_pending_upload( - self, name: str, version: str, body: JSON, *, content_type: str = "application/json", **kwargs: Any - ) -> _models.PendingUploadResponse: - """Create or start a pending upload of a evaluation results for a specific version. - - :param name: The name of the resource. Required. - :type name: str - :param version: The specific version id of the EvaluationResult to operate on. Required. - :type version: str - :param body: Parameters for the action. Required. - :type body: JSON - :keyword content_type: Body Parameter content-type. Content type parameter for JSON body. - Default value is "application/json". - :paramtype content_type: str - :return: PendingUploadResponse. The PendingUploadResponse is compatible with MutableMapping - :rtype: ~azure.ai.projects.onedp.models.PendingUploadResponse - :raises ~azure.core.exceptions.HttpResponseError: - """ - - @overload - async def start_pending_upload( - self, name: str, version: str, body: IO[bytes], *, content_type: str = "application/json", **kwargs: Any - ) -> _models.PendingUploadResponse: - """Create or start a pending upload of a evaluation results for a specific version. - - :param name: The name of the resource. Required. - :type name: str - :param version: The specific version id of the EvaluationResult to operate on. Required. - :type version: str - :param body: Parameters for the action. Required. - :type body: IO[bytes] - :keyword content_type: Body Parameter content-type. Content type parameter for binary body. - Default value is "application/json". - :paramtype content_type: str - :return: PendingUploadResponse. The PendingUploadResponse is compatible with MutableMapping - :rtype: ~azure.ai.projects.onedp.models.PendingUploadResponse - :raises ~azure.core.exceptions.HttpResponseError: - """ - - @distributed_trace_async - @api_version_validation( - method_added_on="2025-05-15-preview", - params_added_on={"2025-05-15-preview": ["api_version", "name", "version", "content_type", "accept"]}, - ) - async def start_pending_upload( - self, name: str, version: str, body: Union[_models.PendingUploadRequest, JSON, IO[bytes]], **kwargs: Any - ) -> _models.PendingUploadResponse: - """Create or start a pending upload of a evaluation results for a specific version. - - :param name: The name of the resource. Required. - :type name: str - :param version: The specific version id of the EvaluationResult to operate on. Required. - :type version: str - :param body: Parameters for the action. Is one of the following types: PendingUploadRequest, - JSON, IO[bytes] Required. - :type body: ~azure.ai.projects.onedp.models.PendingUploadRequest or JSON or IO[bytes] - :return: PendingUploadResponse. The PendingUploadResponse is compatible with MutableMapping - :rtype: ~azure.ai.projects.onedp.models.PendingUploadResponse - :raises ~azure.core.exceptions.HttpResponseError: - """ - error_map: MutableMapping = { - 401: ClientAuthenticationError, - 404: ResourceNotFoundError, - 409: ResourceExistsError, - 304: ResourceNotModifiedError, - } - error_map.update(kwargs.pop("error_map", {}) or {}) - - _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) - _params = kwargs.pop("params", {}) or {} - - content_type: Optional[str] = kwargs.pop("content_type", _headers.pop("Content-Type", None)) - cls: ClsType[_models.PendingUploadResponse] = kwargs.pop("cls", None) - - content_type = content_type or "application/json" - _content = None - if isinstance(body, (IOBase, bytes)): - _content = body - else: - _content = json.dumps(body, cls=SdkJSONEncoder, exclude_readonly=True) # type: ignore - - _request = build_evaluation_results_start_pending_upload_request( - name=name, - version=version, - content_type=content_type, - api_version=self._config.api_version, - content=_content, - headers=_headers, - params=_params, - ) - path_format_arguments = { - "endpoint": self._serialize.url("self._config.endpoint", self._config.endpoint, "str", skip_quote=True), - } - _request.url = self._client.format_url(_request.url, **path_format_arguments) - - _stream = kwargs.pop("stream", False) - pipeline_response: PipelineResponse = await self._client._pipeline.run( # pylint: disable=protected-access - _request, stream=_stream, **kwargs - ) - - response = pipeline_response.http_response - - if response.status_code not in [200]: - if _stream: - try: - await response.read() # Load the body in memory and close the socket - except (StreamConsumedError, StreamClosedError): - pass - map_error(status_code=response.status_code, response=response, error_map=error_map) - raise HttpResponseError(response=response) - - if _stream: - deserialized = response.iter_bytes() - else: - deserialized = _deserialize(_models.PendingUploadResponse, response.json()) - - if cls: - return cls(pipeline_response, deserialized, {}) # type: ignore - - return deserialized # type: ignore - - class RedTeamsOperations: """ .. warning:: diff --git a/sdk/ai/azure-ai-projects-onedp/azure/ai/projects/onedp/aio/operations/_patch.py b/sdk/ai/azure-ai-projects-onedp/azure/ai/projects/onedp/aio/operations/_patch.py index 35e33cb3c9ba..d5791550358e 100644 --- a/sdk/ai/azure-ai-projects-onedp/azure/ai/projects/onedp/aio/operations/_patch.py +++ b/sdk/ai/azure-ai-projects-onedp/azure/ai/projects/onedp/aio/operations/_patch.py @@ -23,20 +23,17 @@ PendingUploadType, PendingUploadResponse, ) -from ...models._enums import ( - DatasetType, - AuthenticationType, - ConnectionType -) +from ...models._enums import DatasetType, AuthenticationType, ConnectionType logger = logging.getLogger(__name__) + class InferenceOperations: def __init__(self, outer_instance: "AIProjectClient") -> None: # TODO: Put the user agent initialization code below in a common place used by both sync and async operations. - + # All returned inference clients will have this application id set on their user-agent. # For more info on user-agent HTTP header, see: # https://azure.github.io/azure-sdk/general_azurecore.html#telemetry-policy @@ -51,7 +48,6 @@ def __init__(self, outer_instance: "AIProjectClient") -> None: self._outer_instance = outer_instance - # TODO: Use a common method for both the sync and async operations @classmethod def _get_inference_url(cls, input_url: str) -> str: @@ -67,10 +63,9 @@ def _get_inference_url(cls, input_url: str) -> str: new_url = f"https://{parsed.netloc}/api/models" return new_url - @distributed_trace def get_chat_completions_client(self, **kwargs) -> "ChatCompletionsClient": - """Get an authenticated ChatCompletionsClient (from the package azure-ai-inference) to use with + """Get an authenticated ChatCompletionsClient (from the package azure-ai-inference) to use with AI models deployed to your AI Foundry Project. Keyword arguments are passed to the constructor of ChatCompletionsClient. @@ -108,10 +103,9 @@ def get_chat_completions_client(self, **kwargs) -> "ChatCompletionsClient": return client - @distributed_trace def get_embeddings_client(self, **kwargs) -> "EmbeddingsClient": - """Get an authenticated EmbeddingsClient (from the package azure-ai-inference) to use with + """Get an authenticated EmbeddingsClient (from the package azure-ai-inference) to use with AI models deployed to your AI Foundry Project. Keyword arguments are passed to the constructor of ChatCompletionsClient. @@ -149,10 +143,9 @@ def get_embeddings_client(self, **kwargs) -> "EmbeddingsClient": return client - @distributed_trace def get_image_embeddings_client(self, **kwargs) -> "ImageEmbeddingsClient": - """Get an authenticated ImageEmbeddingsClient (from the package azure-ai-inference) to use with + """Get an authenticated ImageEmbeddingsClient (from the package azure-ai-inference) to use with AI models deployed to your AI Foundry Project. Keyword arguments are passed to the constructor of ChatCompletionsClient. @@ -190,7 +183,6 @@ def get_image_embeddings_client(self, **kwargs) -> "ImageEmbeddingsClient": return client - @distributed_trace_async async def get_azure_openai_client( self, *, api_version: Optional[str] = None, connection_name: Optional[str] = None, **kwargs @@ -233,19 +225,19 @@ async def get_azure_openai_client( if connection_name: connection = await self._outer_instance.connections.get(name=connection_name, **kwargs) else: - connection = await self._outer_instance.connections.get_default(connection_type=ConnectionType.AZURE_OPEN_AI, **kwargs) + connection = await self._outer_instance.connections.get_default( + connection_type=ConnectionType.AZURE_OPEN_AI, **kwargs + ) logger.debug("[InferenceOperations.get_azure_openai_client] connection = %s", str(connection)) - azure_endpoint = ( - connection.target[:-1] - if connection.target.endswith("/") - else connection.target - ) + azure_endpoint = connection.target[:-1] if connection.target.endswith("/") else connection.target if connection.auth_type == AuthenticationType.API_KEY: # For api-key authentication, we need to make another service call to get the connection with credentials. - connection_with_credentials = self._outer_instance.connections.get_with_credentials(name=connection.name, **kwargs) + connection_with_credentials = self._outer_instance.connections.get_with_credentials( + name=connection.name, **kwargs + ) api_key: Optional[str] = None if hasattr(connection_with_credentials.properties, "credentials"): @@ -255,11 +247,7 @@ async def get_azure_openai_client( logger.debug( "[InferenceOperations.get_azure_openai_client] Creating AzureOpenAI using API key authentication" ) - client = AsyncAzureOpenAI( - api_key=api_key, - azure_endpoint=azure_endpoint, - api_version=api_version - ) + client = AsyncAzureOpenAI(api_key=api_key, azure_endpoint=azure_endpoint, api_version=api_version) elif connection.auth_type == AuthenticationType.ENTRA_ID: @@ -496,7 +484,7 @@ async def upload_folder_and_create( __all__: List[str] = [ "InferenceOperations", - "DatasetsOperations" + "DatasetsOperations", ] # Add all objects you want publicly available to users at this package level diff --git a/sdk/ai/azure-ai-projects-onedp/azure/ai/projects/onedp/models/__init__.py b/sdk/ai/azure-ai-projects-onedp/azure/ai/projects/onedp/models/__init__.py index e64b9e16bf3f..d4e288c9d734 100644 --- a/sdk/ai/azure-ai-projects-onedp/azure/ai/projects/onedp/models/__init__.py +++ b/sdk/ai/azure-ai-projects-onedp/azure/ai/projects/onedp/models/__init__.py @@ -17,12 +17,18 @@ AzureAISearchIndex, BlobReferenceForConsumption, Connection, + ConnectionWithApiKeyAuth, + ConnectionWithCustomAuth, + ConnectionWithEntraIDAuth, + ConnectionWithNoAuth, + ConnectionWithSASAuth, CosmosDBIndex, + CredentialsApiKeyAuth, + CredentialsSASAuth, DatasetVersion, Deployment, EmbeddingConfiguration, Evaluation, - EvaluationResult, EvaluatorConfiguration, FileDatasetVersion, FolderDatasetVersion, @@ -47,8 +53,6 @@ IndexType, ListViewType, PendingUploadType, - RepeatabilityResult, - ResultType, RiskCategory, ) from ._patch import __all__ as _patch_all @@ -59,12 +63,18 @@ "AzureAISearchIndex", "BlobReferenceForConsumption", "Connection", + "ConnectionWithApiKeyAuth", + "ConnectionWithCustomAuth", + "ConnectionWithEntraIDAuth", + "ConnectionWithNoAuth", + "ConnectionWithSASAuth", "CosmosDBIndex", + "CredentialsApiKeyAuth", + "CredentialsSASAuth", "DatasetVersion", "Deployment", "EmbeddingConfiguration", "Evaluation", - "EvaluationResult", "EvaluatorConfiguration", "FileDatasetVersion", "FolderDatasetVersion", @@ -86,8 +96,6 @@ "IndexType", "ListViewType", "PendingUploadType", - "RepeatabilityResult", - "ResultType", "RiskCategory", ] __all__.extend([p for p in _patch_all if p not in __all__]) # pyright: ignore diff --git a/sdk/ai/azure-ai-projects-onedp/azure/ai/projects/onedp/models/_enums.py b/sdk/ai/azure-ai-projects-onedp/azure/ai/projects/onedp/models/_enums.py index edf3a99729e0..96bb9edff7b6 100644 --- a/sdk/ai/azure-ai-projects-onedp/azure/ai/projects/onedp/models/_enums.py +++ b/sdk/ai/azure-ai-projects-onedp/azure/ai/projects/onedp/models/_enums.py @@ -55,13 +55,17 @@ class ConnectionType(str, Enum, metaclass=CaseInsensitiveEnumMeta): AZURE_OPEN_AI = "AzureOpenAI" """Azure OpenAI Service""" AZURE_BLOB_STORAGE = "AzureBlob" - """Azure Blob Storage""" + """Azure Blob Storage, with specified container""" + AZURE_STORAGE_ACCOUNT = "AzureStorageAccount" + """Azure Blob Storage, with container not specified (used by Assistants)""" AZURE_AI_SEARCH = "CognitiveSearch" """Azure AI Search""" COSMOS_DB = "CosmosDB" """CosmosDB""" API_KEY = "ApiKey" """Generic connection that uses API Key authentication""" + APPLICATION_CONFIGURATION = "AppConfig" + """Application Configuration""" APPLICATION_INSIGHTS = "AppInsights" """Application Insights""" CUSTOM = "CustomKeys" @@ -115,32 +119,6 @@ class PendingUploadType(str, Enum, metaclass=CaseInsensitiveEnumMeta): """Temporary Blob Reference is the only supported type.""" -class RepeatabilityResult(str, Enum, metaclass=CaseInsensitiveEnumMeta): - """Repeatability Result header options.""" - - ACCEPTED = "accepted" - """If the request was accepted and the server guarantees that the server state reflects a single - execution of the operation.""" - REJECTED = "rejected" - """If the request was rejected because the combination of Repeatability-First-Sent and - Repeatability-Request-ID were invalid - or because the Repeatability-First-Sent value was outside the range of values held by the - server.""" - - -class ResultType(str, Enum, metaclass=CaseInsensitiveEnumMeta): - """Type of Evaluation result.""" - - BENCHMARK = "Benchmark" - """Benchmark result""" - EVALUATION = "Evaluation" - """Evaluations Result""" - REDTEAM = "Redteam" - """Red Team Result""" - SIMULATION = "Simulation" - """Simulation Result""" - - class RiskCategory(str, Enum, metaclass=CaseInsensitiveEnumMeta): """Risk category for the attack objective.""" diff --git a/sdk/ai/azure-ai-projects-onedp/azure/ai/projects/onedp/models/_models.py b/sdk/ai/azure-ai-projects-onedp/azure/ai/projects/onedp/models/_models.py index e195277cfadd..ab128b482533 100644 --- a/sdk/ai/azure-ai-projects-onedp/azure/ai/projects/onedp/models/_models.py +++ b/sdk/ai/azure-ai-projects-onedp/azure/ai/projects/onedp/models/_models.py @@ -12,7 +12,7 @@ from .. import _model_base from .._model_base import rest_discriminator, rest_field -from ._enums import DatasetType, DeploymentType, IndexType, PendingUploadType +from ._enums import AuthenticationType, DatasetType, DeploymentType, IndexType, PendingUploadType if TYPE_CHECKING: from .. import models as _models @@ -175,35 +175,273 @@ def __init__(self, *args: Any, **kwargs: Any) -> None: class Connection(_model_base.Model): - """Response from the listSecrets operation. + """Response from the list and get connections operations. + You probably want to use the sub-classes and not this class directly. Known sub-classes are: + ConnectionWithEntraIDAuth, ConnectionWithApiKeyAuth, ConnectionWithCustomAuth, + ConnectionWithNoAuth, ConnectionWithSASAuth + + :ivar auth_type: The authentication type used by the connection. Required. Known values are: + "ApiKey", "AAD", "SAS", "CustomKeys", and "None". + :vartype auth_type: str or ~azure.ai.projects.onedp.models.AuthenticationType :ivar name: The name of the resource. Required. :vartype name: str :ivar type: Category of the connection. Required. Known values are: "AzureOpenAI", "AzureBlob", - "CognitiveSearch", "CosmosDB", "ApiKey", "AppInsights", and "CustomKeys". + "AzureStorageAccount", "CognitiveSearch", "CosmosDB", "ApiKey", "AppConfig", "AppInsights", and + "CustomKeys". :vartype type: str or ~azure.ai.projects.onedp.models.ConnectionType :ivar target: The connection URL to be used for this service. Required. :vartype target: str - :ivar auth_type: The authentication type used by the connection. Required. Known values are: - "ApiKey", "AAD", "SAS", "CustomKeys", and "None". - :vartype auth_type: str or ~azure.ai.projects.onedp.models.AuthenticationType + :ivar is_default: Whether the connection is tagged as the default connection of its type. + Required. + :vartype is_default: bool :ivar metadata: Metadata of the connection. Required. :vartype metadata: dict[str, str] """ + __mapping__: Dict[str, _model_base.Model] = {} + auth_type: str = rest_discriminator(name="authType", visibility=["read"]) + """The authentication type used by the connection. Required. Known values are: \"ApiKey\", + \"AAD\", \"SAS\", \"CustomKeys\", and \"None\".""" name: str = rest_field(visibility=["read"]) """The name of the resource. Required.""" type: Union[str, "_models.ConnectionType"] = rest_field(visibility=["read"]) """Category of the connection. Required. Known values are: \"AzureOpenAI\", \"AzureBlob\", - \"CognitiveSearch\", \"CosmosDB\", \"ApiKey\", \"AppInsights\", and \"CustomKeys\".""" + \"AzureStorageAccount\", \"CognitiveSearch\", \"CosmosDB\", \"ApiKey\", \"AppConfig\", + \"AppInsights\", and \"CustomKeys\".""" target: str = rest_field(visibility=["read"]) """The connection URL to be used for this service. Required.""" - auth_type: Union[str, "_models.AuthenticationType"] = rest_field(name="authType", visibility=["read"]) - """The authentication type used by the connection. Required. Known values are: \"ApiKey\", - \"AAD\", \"SAS\", \"CustomKeys\", and \"None\".""" + is_default: bool = rest_field(name="isDefault", visibility=["read"]) + """Whether the connection is tagged as the default connection of its type. Required.""" metadata: Dict[str, str] = rest_field(visibility=["read"]) """Metadata of the connection. Required.""" + @overload + def __init__( + self, + *, + auth_type: str, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + + +class ConnectionWithApiKeyAuth(Connection, discriminator="ApiKey"): + """A connection with API key authentication. + + :ivar name: The name of the resource. Required. + :vartype name: str + :ivar type: Category of the connection. Required. Known values are: "AzureOpenAI", "AzureBlob", + "AzureStorageAccount", "CognitiveSearch", "CosmosDB", "ApiKey", "AppConfig", "AppInsights", and + "CustomKeys". + :vartype type: str or ~azure.ai.projects.onedp.models.ConnectionType + :ivar target: The connection URL to be used for this service. Required. + :vartype target: str + :ivar is_default: Whether the connection is tagged as the default connection of its type. + Required. + :vartype is_default: bool + :ivar metadata: Metadata of the connection. Required. + :vartype metadata: dict[str, str] + :ivar auth_type: The authentication type used by the connection. Required. API Key + authentication + :vartype auth_type: str or ~azure.ai.projects.onedp.models.API_KEY + :ivar credentials: The credentials for API-key authentication. + :vartype credentials: ~azure.ai.projects.onedp.models.CredentialsApiKeyAuth + """ + + auth_type: Literal[AuthenticationType.API_KEY] = rest_discriminator(name="authType", visibility=["read"]) # type: ignore + """The authentication type used by the connection. Required. API Key authentication""" + credentials: Optional["_models.CredentialsApiKeyAuth"] = rest_field(visibility=["read"]) + """The credentials for API-key authentication.""" + + @overload + def __init__( + self, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, auth_type=AuthenticationType.API_KEY, **kwargs) + + +class ConnectionWithCustomAuth(Connection, discriminator="CustomKeys"): + """A connection with custom authentication. + + :ivar name: The name of the resource. Required. + :vartype name: str + :ivar type: Category of the connection. Required. Known values are: "AzureOpenAI", "AzureBlob", + "AzureStorageAccount", "CognitiveSearch", "CosmosDB", "ApiKey", "AppConfig", "AppInsights", and + "CustomKeys". + :vartype type: str or ~azure.ai.projects.onedp.models.ConnectionType + :ivar target: The connection URL to be used for this service. Required. + :vartype target: str + :ivar is_default: Whether the connection is tagged as the default connection of its type. + Required. + :vartype is_default: bool + :ivar metadata: Metadata of the connection. Required. + :vartype metadata: dict[str, str] + :ivar auth_type: The authentication type used by the connection. Required. Custom + authentication + :vartype auth_type: str or ~azure.ai.projects.onedp.models.CUSTOM + """ + + auth_type: Literal[AuthenticationType.CUSTOM] = rest_discriminator(name="authType", visibility=["read"]) # type: ignore + """The authentication type used by the connection. Required. Custom authentication""" + + @overload + def __init__( + self, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, auth_type=AuthenticationType.CUSTOM, **kwargs) + + +class ConnectionWithEntraIDAuth(Connection, discriminator="AAD"): + """A connection with EntraID authentication (aka ``Entra ID passthrough``). + + :ivar name: The name of the resource. Required. + :vartype name: str + :ivar type: Category of the connection. Required. Known values are: "AzureOpenAI", "AzureBlob", + "AzureStorageAccount", "CognitiveSearch", "CosmosDB", "ApiKey", "AppConfig", "AppInsights", and + "CustomKeys". + :vartype type: str or ~azure.ai.projects.onedp.models.ConnectionType + :ivar target: The connection URL to be used for this service. Required. + :vartype target: str + :ivar is_default: Whether the connection is tagged as the default connection of its type. + Required. + :vartype is_default: bool + :ivar metadata: Metadata of the connection. Required. + :vartype metadata: dict[str, str] + :ivar auth_type: The authentication type used by the connection. Required. Entra ID + authentication (formerly known as AAD) + :vartype auth_type: str or ~azure.ai.projects.onedp.models.ENTRA_ID + """ + + auth_type: Literal[AuthenticationType.ENTRA_ID] = rest_discriminator(name="authType", visibility=["read"]) # type: ignore + """The authentication type used by the connection. Required. Entra ID authentication (formerly + known as AAD)""" + + @overload + def __init__( + self, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, auth_type=AuthenticationType.ENTRA_ID, **kwargs) + + +class ConnectionWithNoAuth(Connection, discriminator="None"): + """A connection with no authentication. + + :ivar name: The name of the resource. Required. + :vartype name: str + :ivar type: Category of the connection. Required. Known values are: "AzureOpenAI", "AzureBlob", + "AzureStorageAccount", "CognitiveSearch", "CosmosDB", "ApiKey", "AppConfig", "AppInsights", and + "CustomKeys". + :vartype type: str or ~azure.ai.projects.onedp.models.ConnectionType + :ivar target: The connection URL to be used for this service. Required. + :vartype target: str + :ivar is_default: Whether the connection is tagged as the default connection of its type. + Required. + :vartype is_default: bool + :ivar metadata: Metadata of the connection. Required. + :vartype metadata: dict[str, str] + :ivar auth_type: The authentication type used by the connection. Required. No authentication + :vartype auth_type: str or ~azure.ai.projects.onedp.models.NONE + """ + + auth_type: Literal[AuthenticationType.NONE] = rest_discriminator(name="authType", visibility=["read"]) # type: ignore + """The authentication type used by the connection. Required. No authentication""" + + @overload + def __init__( + self, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, auth_type=AuthenticationType.NONE, **kwargs) + + +class ConnectionWithSASAuth(Connection, discriminator="SAS"): + """A connection with Shared Access Signature (SAS) authentication. + + :ivar name: The name of the resource. Required. + :vartype name: str + :ivar type: Category of the connection. Required. Known values are: "AzureOpenAI", "AzureBlob", + "AzureStorageAccount", "CognitiveSearch", "CosmosDB", "ApiKey", "AppConfig", "AppInsights", and + "CustomKeys". + :vartype type: str or ~azure.ai.projects.onedp.models.ConnectionType + :ivar target: The connection URL to be used for this service. Required. + :vartype target: str + :ivar is_default: Whether the connection is tagged as the default connection of its type. + Required. + :vartype is_default: bool + :ivar metadata: Metadata of the connection. Required. + :vartype metadata: dict[str, str] + :ivar auth_type: The authentication type used by the connection. Required. Shared Access + Signature (SAS) authentication + :vartype auth_type: str or ~azure.ai.projects.onedp.models.SAS + :ivar credentials: The credentials for SAS authentication. + :vartype credentials: ~azure.ai.projects.onedp.models.CredentialsSASAuth + """ + + auth_type: Literal[AuthenticationType.SAS] = rest_discriminator(name="authType", visibility=["read"]) # type: ignore + """The authentication type used by the connection. Required. Shared Access Signature (SAS) + authentication""" + credentials: Optional["_models.CredentialsSASAuth"] = rest_field(visibility=["read"]) + """The credentials for SAS authentication.""" + + @overload + def __init__( + self, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, auth_type=AuthenticationType.SAS, **kwargs) + class CosmosDBIndex(Index, discriminator="CosmosDBNoSqlVectorStore"): """CosmosDB Vector Store Index Definition. @@ -269,6 +507,28 @@ def __init__(self, *args: Any, **kwargs: Any) -> None: super().__init__(*args, type=IndexType.COSMOS_DB, **kwargs) +class CredentialsApiKeyAuth(_model_base.Model): + """The credentials needed for API key authentication. + + :ivar key: The API key. Required. + :vartype key: str + """ + + key: str = rest_field(visibility=["read"]) + """The API key. Required.""" + + +class CredentialsSASAuth(_model_base.Model): + """The credentials needed for Shared Access Signatures (SAS) authentication. + + :ivar sas: The Shared Access Signatures (SAS) token. Required. + :vartype sas: str + """ + + sas: str = rest_field(name="SAS", visibility=["read"]) + """The Shared Access Signatures (SAS) token. Required.""" + + class DatasetVersion(_model_base.Model): """DatasetVersion Definition. @@ -437,12 +697,6 @@ class Evaluation(_model_base.Model): :vartype properties: dict[str, str] :ivar evaluators: Evaluators to be used for the evaluation. Required. :vartype evaluators: dict[str, ~azure.ai.projects.onedp.models.EvaluatorConfiguration] - :ivar outputs: Read-only result outputs. Example: { 'evaluationResultId': - 'azureai://accounts/{AccountName}/projects/{projectName}/evaluationresults/{name}/{version}', - 'logId': - 'azureai://accounts/{AccountName}/projects/{projectName}/datasets/{dataset-name}/{dataset-version}' - }. Required. - :vartype outputs: dict[str, str] """ id: str = rest_field(visibility=["read"]) @@ -468,12 +722,6 @@ class Evaluation(_model_base.Model): visibility=["read", "create", "update", "delete", "query"] ) """Evaluators to be used for the evaluation. Required.""" - outputs: Dict[str, str] = rest_field(visibility=["read"]) - """Read-only result outputs. Example: { 'evaluationResultId': - 'azureai://accounts/{AccountName}/projects/{projectName}/evaluationresults/{name}/{version}', - 'logId': - 'azureai://accounts/{AccountName}/projects/{projectName}/datasets/{dataset-name}/{dataset-version}' - }. Required.""" @overload def __init__( @@ -498,110 +746,6 @@ def __init__(self, *args: Any, **kwargs: Any) -> None: super().__init__(*args, **kwargs) -class EvaluationResult(_model_base.Model): - """Evaluation Result resource Definition. - - :ivar result_type: Type of Evaluation result. Known values are: "Benchmark", "Evaluation", - "Redteam", and "Simulation". - :vartype result_type: str or ~azure.ai.projects.onedp.models.ResultType - :ivar model_name: Model Name. - :vartype model_name: str - :ivar model_version: Model Version. - :vartype model_version: str - :ivar model_asset_id: Model Asset ID. - :vartype model_asset_id: str - :ivar dataset_family: Dataset Family. - :vartype dataset_family: str - :ivar dataset_name: Dataset Name. - :vartype dataset_name: str - :ivar metrics: Metrics. - :vartype metrics: dict[str, float] - :ivar blob_uri: Blob URI. - :vartype blob_uri: str - :ivar stage: Asset stage. - :vartype stage: str - :ivar id: A unique identifier for the asset, assetId probably?. - :vartype id: str - :ivar name: The name of the resource. Required. - :vartype name: str - :ivar version: The version of the resource. Required. - :vartype version: str - :ivar description: The asset description text. - :vartype description: str - :ivar tags: Tag dictionary. Tags can be added, removed, and updated. - :vartype tags: dict[str, str] - """ - - result_type: Optional[Union[str, "_models.ResultType"]] = rest_field( - name="ResultType", visibility=["read", "create", "update", "delete", "query"] - ) - """Type of Evaluation result. Known values are: \"Benchmark\", \"Evaluation\", \"Redteam\", and - \"Simulation\".""" - model_name: Optional[str] = rest_field(name="ModelName", visibility=["read", "create", "update", "delete", "query"]) - """Model Name.""" - model_version: Optional[str] = rest_field( - name="ModelVersion", visibility=["read", "create", "update", "delete", "query"] - ) - """Model Version.""" - model_asset_id: Optional[str] = rest_field( - name="ModelAssetId", visibility=["read", "create", "update", "delete", "query"] - ) - """Model Asset ID.""" - dataset_family: Optional[str] = rest_field( - name="DatasetFamily", visibility=["read", "create", "update", "delete", "query"] - ) - """Dataset Family.""" - dataset_name: Optional[str] = rest_field( - name="DatasetName", visibility=["read", "create", "update", "delete", "query"] - ) - """Dataset Name.""" - metrics: Optional[Dict[str, float]] = rest_field( - name="Metrics", visibility=["read", "create", "update", "delete", "query"] - ) - """Metrics.""" - blob_uri: Optional[str] = rest_field(name="BlobUri", visibility=["read", "create", "update", "delete", "query"]) - """Blob URI.""" - stage: Optional[str] = rest_field(visibility=["read", "create", "update"]) - """Asset stage.""" - id: Optional[str] = rest_field(visibility=["read"]) - """A unique identifier for the asset, assetId probably?.""" - name: str = rest_field(visibility=["read"]) - """The name of the resource. Required.""" - version: str = rest_field(visibility=["read"]) - """The version of the resource. Required.""" - description: Optional[str] = rest_field(visibility=["read", "create", "update", "delete", "query"]) - """The asset description text.""" - tags: Optional[Dict[str, str]] = rest_field(visibility=["read", "create", "update", "delete", "query"]) - """Tag dictionary. Tags can be added, removed, and updated.""" - - @overload - def __init__( - self, - *, - result_type: Optional[Union[str, "_models.ResultType"]] = None, - model_name: Optional[str] = None, - model_version: Optional[str] = None, - model_asset_id: Optional[str] = None, - dataset_family: Optional[str] = None, - dataset_name: Optional[str] = None, - metrics: Optional[Dict[str, float]] = None, - blob_uri: Optional[str] = None, - stage: Optional[str] = None, - description: Optional[str] = None, - tags: Optional[Dict[str, str]] = None, - ) -> None: ... - - @overload - def __init__(self, mapping: Mapping[str, Any]) -> None: - """ - :param mapping: raw JSON to initialize the model. - :type mapping: Mapping[str, Any] - """ - - def __init__(self, *args: Any, **kwargs: Any) -> None: - super().__init__(*args, **kwargs) - - class EvaluatorConfiguration(_model_base.Model): """Evaluator Configuration. @@ -1032,12 +1176,6 @@ class RedTeam(_model_base.Model): :ivar simulation_only: Simulation-only or Simulation + Evaluation. Default false, if true the scan outputs conversation not evaluation result. Required. :vartype simulation_only: bool - :ivar outputs: Read-only result outputs. Example: { 'redTeamResultId': - 'azureai://accounts/{AccountName}/projects/{projectName}/evaluationresults/{name}/{version}', - 'logId': - 'azureai://accounts/{AccountName}/projects/{projectName}/datasets/{dataset-name}/{dataset-version}' - }. Required. - :vartype outputs: dict[str, str] :ivar risk_categories: List of risk categories to generate attack objectives for. Required. :vartype risk_categories: list[str or ~azure.ai.projects.onedp.models.RiskCategory] :ivar application_scenario: Application scenario for the red team operation, to generate @@ -1067,12 +1205,6 @@ class RedTeam(_model_base.Model): ) """Simulation-only or Simulation + Evaluation. Default false, if true the scan outputs conversation not evaluation result. Required.""" - outputs: Dict[str, str] = rest_field(visibility=["read"]) - """Read-only result outputs. Example: { 'redTeamResultId': - 'azureai://accounts/{AccountName}/projects/{projectName}/evaluationresults/{name}/{version}', - 'logId': - 'azureai://accounts/{AccountName}/projects/{projectName}/datasets/{dataset-name}/{dataset-version}' - }. Required.""" risk_categories: List[Union[str, "_models.RiskCategory"]] = rest_field( name="riskCategories", visibility=["read", "create", "update", "delete", "query"] ) diff --git a/sdk/ai/azure-ai-projects-onedp/azure/ai/projects/onedp/operations/__init__.py b/sdk/ai/azure-ai-projects-onedp/azure/ai/projects/onedp/operations/__init__.py index f6be99bbed9c..c8b497b4854b 100644 --- a/sdk/ai/azure-ai-projects-onedp/azure/ai/projects/onedp/operations/__init__.py +++ b/sdk/ai/azure-ai-projects-onedp/azure/ai/projects/onedp/operations/__init__.py @@ -18,7 +18,6 @@ from ._operations import DatasetsOperations # type: ignore from ._operations import IndexesOperations # type: ignore from ._operations import DeploymentsOperations # type: ignore -from ._operations import EvaluationResultsOperations # type: ignore from ._operations import RedTeamsOperations # type: ignore from ._patch import __all__ as _patch_all @@ -32,7 +31,6 @@ "DatasetsOperations", "IndexesOperations", "DeploymentsOperations", - "EvaluationResultsOperations", "RedTeamsOperations", ] __all__.extend([p for p in _patch_all if p not in __all__]) # pyright: ignore diff --git a/sdk/ai/azure-ai-projects-onedp/azure/ai/projects/onedp/operations/_operations.py b/sdk/ai/azure-ai-projects-onedp/azure/ai/projects/onedp/operations/_operations.py index c35e8eba1e7b..effe2b7f6bbe 100644 --- a/sdk/ai/azure-ai-projects-onedp/azure/ai/projects/onedp/operations/_operations.py +++ b/sdk/ai/azure-ai-projects-onedp/azure/ai/projects/onedp/operations/_operations.py @@ -6,13 +6,11 @@ # Code generated by Microsoft (R) Python Code Generator. # Changes may cause incorrect behavior and will be lost if the code is regenerated. # -------------------------------------------------------------------------- -import datetime from io import IOBase import json import sys from typing import Any, Callable, Dict, IO, Iterable, List, Optional, TypeVar, Union, overload import urllib.parse -import uuid from azure.core import PipelineClient from azure.core.exceptions import ( @@ -73,9 +71,36 @@ def build_connections_get_request(name: str, **kwargs: Any) -> HttpRequest: return HttpRequest(method="GET", url=_url, params=_params, headers=_headers, **kwargs) +def build_connections_get_with_credentials_request( # pylint: disable=name-too-long + name: str, **kwargs: Any +) -> HttpRequest: + _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) + _params = case_insensitive_dict(kwargs.pop("params", {}) or {}) + + api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2025-05-15-preview")) + accept = _headers.pop("Accept", "application/json") + + # Construct URL + _url = "/connections/{name}/withCredentials" + path_format_arguments = { + "name": _SERIALIZER.url("name", name, "str"), + } + + _url: str = _url.format(**path_format_arguments) # type: ignore + + # Construct parameters + _params["api-version"] = _SERIALIZER.query("api_version", api_version, "str") + + # Construct headers + _headers["Accept"] = _SERIALIZER.header("accept", accept, "str") + + return HttpRequest(method="GET", url=_url, params=_params, headers=_headers, **kwargs) + + def build_connections_list_request( *, connection_type: Optional[Union[str, _models.ConnectionType]] = None, + default_connection: Optional[bool] = None, top: Optional[int] = None, skip: Optional[int] = None, maxpagesize: Optional[int] = None, @@ -94,6 +119,8 @@ def build_connections_list_request( _params["api-version"] = _SERIALIZER.query("api_version", api_version, "str") if connection_type is not None: _params["connectionType"] = _SERIALIZER.query("connection_type", connection_type, "str") + if default_connection is not None: + _params["defaultConnection"] = _SERIALIZER.query("default_connection", default_connection, "bool") if top is not None: _params["top"] = _SERIALIZER.query("top", top, "int") if skip is not None: @@ -304,39 +331,6 @@ def build_datasets_delete_version_request(name: str, version: str, **kwargs: Any return HttpRequest(method="DELETE", url=_url, params=_params, headers=_headers, **kwargs) -def build_datasets_create_request(name: str, **kwargs: Any) -> HttpRequest: - _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) - _params = case_insensitive_dict(kwargs.pop("params", {}) or {}) - - content_type: Optional[str] = kwargs.pop("content_type", _headers.pop("Content-Type", None)) - api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2025-05-15-preview")) - accept = _headers.pop("Accept", "application/json") - - # Construct URL - _url = "/datasets/{name}/versions" - path_format_arguments = { - "name": _SERIALIZER.url("name", name, "str"), - } - - _url: str = _url.format(**path_format_arguments) # type: ignore - - # Construct parameters - _params["api-version"] = _SERIALIZER.query("api_version", api_version, "str") - - # Construct headers - if "Repeatability-Request-ID" not in _headers: - _headers["Repeatability-Request-ID"] = str(uuid.uuid4()) - if "Repeatability-First-Sent" not in _headers: - _headers["Repeatability-First-Sent"] = _SERIALIZER.serialize_data( - datetime.datetime.now(datetime.timezone.utc), "rfc-1123" - ) - if content_type is not None: - _headers["Content-Type"] = _SERIALIZER.header("content_type", content_type, "str") - _headers["Accept"] = _SERIALIZER.header("accept", accept, "str") - - return HttpRequest(method="POST", url=_url, params=_params, headers=_headers, **kwargs) - - def build_datasets_create_version_request(name: str, version: str, **kwargs: Any) -> HttpRequest: _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) _params = case_insensitive_dict(kwargs.pop("params", {}) or {}) @@ -395,35 +389,6 @@ def build_datasets_start_pending_upload_version_request( # pylint: disable=name return HttpRequest(method="POST", url=_url, params=_params, headers=_headers, **kwargs) -def build_datasets_start_pending_upload_request( # pylint: disable=name-too-long - name: str, **kwargs: Any -) -> HttpRequest: - _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) - _params = case_insensitive_dict(kwargs.pop("params", {}) or {}) - - content_type: Optional[str] = kwargs.pop("content_type", _headers.pop("Content-Type", None)) - api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2025-05-15-preview")) - accept = _headers.pop("Accept", "application/json") - - # Construct URL - _url = "/datasets/{name}/startPendingUpload" - path_format_arguments = { - "name": _SERIALIZER.url("name", name, "str"), - } - - _url: str = _url.format(**path_format_arguments) # type: ignore - - # Construct parameters - _params["api-version"] = _SERIALIZER.query("api_version", api_version, "str") - - # Construct headers - if content_type is not None: - _headers["Content-Type"] = _SERIALIZER.header("content_type", content_type, "str") - _headers["Accept"] = _SERIALIZER.header("accept", accept, "str") - - return HttpRequest(method="POST", url=_url, params=_params, headers=_headers, **kwargs) - - def build_indexes_list_versions_request( name: str, *, @@ -548,39 +513,6 @@ def build_indexes_delete_version_request(name: str, version: str, **kwargs: Any) return HttpRequest(method="DELETE", url=_url, params=_params, headers=_headers, **kwargs) -def build_indexes_create_request(name: str, **kwargs: Any) -> HttpRequest: - _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) - _params = case_insensitive_dict(kwargs.pop("params", {}) or {}) - - content_type: Optional[str] = kwargs.pop("content_type", _headers.pop("Content-Type", None)) - api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2025-05-15-preview")) - accept = _headers.pop("Accept", "application/json") - - # Construct URL - _url = "/indexes/{name}/versions" - path_format_arguments = { - "name": _SERIALIZER.url("name", name, "str"), - } - - _url: str = _url.format(**path_format_arguments) # type: ignore - - # Construct parameters - _params["api-version"] = _SERIALIZER.query("api_version", api_version, "str") - - # Construct headers - if "Repeatability-Request-ID" not in _headers: - _headers["Repeatability-Request-ID"] = str(uuid.uuid4()) - if "Repeatability-First-Sent" not in _headers: - _headers["Repeatability-First-Sent"] = _SERIALIZER.serialize_data( - datetime.datetime.now(datetime.timezone.utc), "rfc-1123" - ) - if content_type is not None: - _headers["Content-Type"] = _SERIALIZER.header("content_type", content_type, "str") - _headers["Accept"] = _SERIALIZER.header("accept", accept, "str") - - return HttpRequest(method="POST", url=_url, params=_params, headers=_headers, **kwargs) - - def build_indexes_create_version_request(name: str, version: str, **kwargs: Any) -> HttpRequest: _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) _params = case_insensitive_dict(kwargs.pop("params", {}) or {}) @@ -670,15 +602,7 @@ def build_deployments_list_request( return HttpRequest(method="GET", url=_url, params=_params, headers=_headers, **kwargs) -def build_evaluation_results_list_versions_request( # pylint: disable=name-too-long - name: str, - *, - top: Optional[int] = None, - skip: Optional[str] = None, - tags: Optional[str] = None, - list_view_type: Optional[Union[str, _models.ListViewType]] = None, - **kwargs: Any -) -> HttpRequest: +def build_red_teams_get_request(name: str, **kwargs: Any) -> HttpRequest: _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) _params = case_insensitive_dict(kwargs.pop("params", {}) or {}) @@ -686,7 +610,7 @@ def build_evaluation_results_list_versions_request( # pylint: disable=name-too- accept = _headers.pop("Accept", "application/json") # Construct URL - _url = "/evaluationResults/{name}/versions" + _url = "/redTeams/runs/{name}" path_format_arguments = { "name": _SERIALIZER.url("name", name, "str"), } @@ -695,14 +619,6 @@ def build_evaluation_results_list_versions_request( # pylint: disable=name-too- # Construct parameters _params["api-version"] = _SERIALIZER.query("api_version", api_version, "str") - if top is not None: - _params["top"] = _SERIALIZER.query("top", top, "int") - if skip is not None: - _params["skip"] = _SERIALIZER.query("skip", skip, "str") - if tags is not None: - _params["tags"] = _SERIALIZER.query("tags", tags, "str") - if list_view_type is not None: - _params["listViewType"] = _SERIALIZER.query("list_view_type", list_view_type, "str") # Construct headers _headers["Accept"] = _SERIALIZER.header("accept", accept, "str") @@ -710,13 +626,8 @@ def build_evaluation_results_list_versions_request( # pylint: disable=name-too- return HttpRequest(method="GET", url=_url, params=_params, headers=_headers, **kwargs) -def build_evaluation_results_list_latest_request( # pylint: disable=name-too-long - *, - top: Optional[int] = None, - skip: Optional[str] = None, - tags: Optional[str] = None, - list_view_type: Optional[Union[str, _models.ListViewType]] = None, - **kwargs: Any +def build_red_teams_list_request( + *, top: Optional[int] = None, skip: Optional[int] = None, maxpagesize: Optional[int] = None, **kwargs: Any ) -> HttpRequest: _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) _params = case_insensitive_dict(kwargs.pop("params", {}) or {}) @@ -725,18 +636,16 @@ def build_evaluation_results_list_latest_request( # pylint: disable=name-too-lo accept = _headers.pop("Accept", "application/json") # Construct URL - _url = "/evaluationResults" + _url = "/redTeams/runs" # Construct parameters _params["api-version"] = _SERIALIZER.query("api_version", api_version, "str") if top is not None: _params["top"] = _SERIALIZER.query("top", top, "int") if skip is not None: - _params["skip"] = _SERIALIZER.query("skip", skip, "str") - if tags is not None: - _params["tags"] = _SERIALIZER.query("tags", tags, "str") - if list_view_type is not None: - _params["listViewType"] = _SERIALIZER.query("list_view_type", list_view_type, "str") + _params["skip"] = _SERIALIZER.query("skip", skip, "int") + if maxpagesize is not None: + _params["maxpagesize"] = _SERIALIZER.query("maxpagesize", maxpagesize, "int") # Construct headers _headers["Accept"] = _SERIALIZER.header("accept", accept, "str") @@ -744,268 +653,135 @@ def build_evaluation_results_list_latest_request( # pylint: disable=name-too-lo return HttpRequest(method="GET", url=_url, params=_params, headers=_headers, **kwargs) -def build_evaluation_results_get_version_request( # pylint: disable=name-too-long - name: str, version: str, **kwargs: Any -) -> HttpRequest: +def build_red_teams_create_run_request(**kwargs: Any) -> HttpRequest: _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) _params = case_insensitive_dict(kwargs.pop("params", {}) or {}) + content_type: Optional[str] = kwargs.pop("content_type", _headers.pop("Content-Type", None)) api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2025-05-15-preview")) accept = _headers.pop("Accept", "application/json") # Construct URL - _url = "/evaluationResults/{name}/versions/{version}" - path_format_arguments = { - "name": _SERIALIZER.url("name", name, "str"), - "version": _SERIALIZER.url("version", version, "str"), - } - - _url: str = _url.format(**path_format_arguments) # type: ignore + _url = "/redTeams/runs:run" # Construct parameters _params["api-version"] = _SERIALIZER.query("api_version", api_version, "str") # Construct headers + if content_type is not None: + _headers["Content-Type"] = _SERIALIZER.header("content_type", content_type, "str") _headers["Accept"] = _SERIALIZER.header("accept", accept, "str") - return HttpRequest(method="GET", url=_url, params=_params, headers=_headers, **kwargs) - + return HttpRequest(method="POST", url=_url, params=_params, headers=_headers, **kwargs) -def build_evaluation_results_delete_version_request( # pylint: disable=name-too-long - name: str, version: str, **kwargs: Any -) -> HttpRequest: - _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) - _params = case_insensitive_dict(kwargs.pop("params", {}) or {}) - api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2025-05-15-preview")) - accept = _headers.pop("Accept", "application/json") +class ServicePatternsOperations: + """ + .. warning:: + **DO NOT** instantiate this class directly. - # Construct URL - _url = "/evaluationResults/{name}/versions/{version}" - path_format_arguments = { - "name": _SERIALIZER.url("name", name, "str"), - "version": _SERIALIZER.url("version", version, "str"), - } + Instead, you should access the following operations through + :class:`~azure.ai.projects.onedp.AIProjectClient`'s + :attr:`service_patterns` attribute. + """ - _url: str = _url.format(**path_format_arguments) # type: ignore + def __init__(self, *args, **kwargs): + input_args = list(args) + self._client: PipelineClient = input_args.pop(0) if input_args else kwargs.pop("client") + self._config: AIProjectClientConfiguration = input_args.pop(0) if input_args else kwargs.pop("config") + self._serialize: Serializer = input_args.pop(0) if input_args else kwargs.pop("serializer") + self._deserialize: Deserializer = input_args.pop(0) if input_args else kwargs.pop("deserializer") - # Construct parameters - _params["api-version"] = _SERIALIZER.query("api_version", api_version, "str") + self.building_blocks = ServicePatternsBuildingBlocksOperations( + self._client, self._config, self._serialize, self._deserialize + ) - # Construct headers - _headers["Accept"] = _SERIALIZER.header("accept", accept, "str") - return HttpRequest(method="DELETE", url=_url, params=_params, headers=_headers, **kwargs) +class ConnectionsOperations: + """ + .. warning:: + **DO NOT** instantiate this class directly. + Instead, you should access the following operations through + :class:`~azure.ai.projects.onedp.AIProjectClient`'s + :attr:`connections` attribute. + """ -def build_evaluation_results_create_request(name: str, **kwargs: Any) -> HttpRequest: - _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) - _params = case_insensitive_dict(kwargs.pop("params", {}) or {}) + def __init__(self, *args, **kwargs): + input_args = list(args) + self._client: PipelineClient = input_args.pop(0) if input_args else kwargs.pop("client") + self._config: AIProjectClientConfiguration = input_args.pop(0) if input_args else kwargs.pop("config") + self._serialize: Serializer = input_args.pop(0) if input_args else kwargs.pop("serializer") + self._deserialize: Deserializer = input_args.pop(0) if input_args else kwargs.pop("deserializer") - content_type: Optional[str] = kwargs.pop("content_type", _headers.pop("Content-Type", None)) - api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2025-05-15-preview")) - accept = _headers.pop("Accept", "application/json") + @distributed_trace + def get(self, name: str, **kwargs: Any) -> _models.Connection: + """Get a connection by name, without populating connection credentials. - # Construct URL - _url = "/evaluationResults/{name}/versions" - path_format_arguments = { - "name": _SERIALIZER.url("name", name, "str"), - } + :param name: The name of the resource. Required. + :type name: str + :return: Connection. The Connection is compatible with MutableMapping + :rtype: ~azure.ai.projects.onedp.models.Connection + :raises ~azure.core.exceptions.HttpResponseError: + """ + error_map: MutableMapping = { + 401: ClientAuthenticationError, + 404: ResourceNotFoundError, + 409: ResourceExistsError, + 304: ResourceNotModifiedError, + } + error_map.update(kwargs.pop("error_map", {}) or {}) - _url: str = _url.format(**path_format_arguments) # type: ignore + _headers = kwargs.pop("headers", {}) or {} + _params = kwargs.pop("params", {}) or {} - # Construct parameters - _params["api-version"] = _SERIALIZER.query("api_version", api_version, "str") + cls: ClsType[_models.Connection] = kwargs.pop("cls", None) - # Construct headers - if "Repeatability-Request-ID" not in _headers: - _headers["Repeatability-Request-ID"] = str(uuid.uuid4()) - if "Repeatability-First-Sent" not in _headers: - _headers["Repeatability-First-Sent"] = _SERIALIZER.serialize_data( - datetime.datetime.now(datetime.timezone.utc), "rfc-1123" + _request = build_connections_get_request( + name=name, + api_version=self._config.api_version, + headers=_headers, + params=_params, ) - if content_type is not None: - _headers["Content-Type"] = _SERIALIZER.header("content_type", content_type, "str") - _headers["Accept"] = _SERIALIZER.header("accept", accept, "str") + path_format_arguments = { + "endpoint": self._serialize.url("self._config.endpoint", self._config.endpoint, "str", skip_quote=True), + } + _request.url = self._client.format_url(_request.url, **path_format_arguments) - return HttpRequest(method="POST", url=_url, params=_params, headers=_headers, **kwargs) + _stream = kwargs.pop("stream", False) + pipeline_response: PipelineResponse = self._client._pipeline.run( # pylint: disable=protected-access + _request, stream=_stream, **kwargs + ) + response = pipeline_response.http_response -def build_evaluation_results_create_version_request( # pylint: disable=name-too-long - name: str, version: str, **kwargs: Any -) -> HttpRequest: - _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) - _params = case_insensitive_dict(kwargs.pop("params", {}) or {}) - - content_type: Optional[str] = kwargs.pop("content_type", _headers.pop("Content-Type", None)) - api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2025-05-15-preview")) - accept = _headers.pop("Accept", "application/json") - - # Construct URL - _url = "/evaluationResults/{name}/versions/{version}" - path_format_arguments = { - "name": _SERIALIZER.url("name", name, "str"), - "version": _SERIALIZER.url("version", version, "str"), - } - - _url: str = _url.format(**path_format_arguments) # type: ignore - - # Construct parameters - _params["api-version"] = _SERIALIZER.query("api_version", api_version, "str") - - # Construct headers - if content_type is not None: - _headers["Content-Type"] = _SERIALIZER.header("content_type", content_type, "str") - _headers["Accept"] = _SERIALIZER.header("accept", accept, "str") - - return HttpRequest(method="PUT", url=_url, params=_params, headers=_headers, **kwargs) - - -def build_evaluation_results_start_pending_upload_request( # pylint: disable=name-too-long - name: str, version: str, **kwargs: Any -) -> HttpRequest: - _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) - _params = case_insensitive_dict(kwargs.pop("params", {}) or {}) - - content_type: Optional[str] = kwargs.pop("content_type", _headers.pop("Content-Type", None)) - api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2025-05-15-preview")) - accept = _headers.pop("Accept", "application/json") - - # Construct URL - _url = "/evaluationResults/{name}/versions/{version}/startPendingUpload" - path_format_arguments = { - "name": _SERIALIZER.url("name", name, "str"), - "version": _SERIALIZER.url("version", version, "str"), - } - - _url: str = _url.format(**path_format_arguments) # type: ignore - - # Construct parameters - _params["api-version"] = _SERIALIZER.query("api_version", api_version, "str") - - # Construct headers - if content_type is not None: - _headers["Content-Type"] = _SERIALIZER.header("content_type", content_type, "str") - _headers["Accept"] = _SERIALIZER.header("accept", accept, "str") - - return HttpRequest(method="POST", url=_url, params=_params, headers=_headers, **kwargs) - - -def build_red_teams_get_request(name: str, **kwargs: Any) -> HttpRequest: - _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) - _params = case_insensitive_dict(kwargs.pop("params", {}) or {}) - - api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2025-05-15-preview")) - accept = _headers.pop("Accept", "application/json") - - # Construct URL - _url = "/redTeams/runs/{name}" - path_format_arguments = { - "name": _SERIALIZER.url("name", name, "str"), - } - - _url: str = _url.format(**path_format_arguments) # type: ignore - - # Construct parameters - _params["api-version"] = _SERIALIZER.query("api_version", api_version, "str") - - # Construct headers - _headers["Accept"] = _SERIALIZER.header("accept", accept, "str") - - return HttpRequest(method="GET", url=_url, params=_params, headers=_headers, **kwargs) - - -def build_red_teams_list_request( - *, top: Optional[int] = None, skip: Optional[int] = None, maxpagesize: Optional[int] = None, **kwargs: Any -) -> HttpRequest: - _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) - _params = case_insensitive_dict(kwargs.pop("params", {}) or {}) - - api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2025-05-15-preview")) - accept = _headers.pop("Accept", "application/json") - - # Construct URL - _url = "/redTeams/runs" - - # Construct parameters - _params["api-version"] = _SERIALIZER.query("api_version", api_version, "str") - if top is not None: - _params["top"] = _SERIALIZER.query("top", top, "int") - if skip is not None: - _params["skip"] = _SERIALIZER.query("skip", skip, "int") - if maxpagesize is not None: - _params["maxpagesize"] = _SERIALIZER.query("maxpagesize", maxpagesize, "int") - - # Construct headers - _headers["Accept"] = _SERIALIZER.header("accept", accept, "str") - - return HttpRequest(method="GET", url=_url, params=_params, headers=_headers, **kwargs) - - -def build_red_teams_create_run_request(**kwargs: Any) -> HttpRequest: - _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) - _params = case_insensitive_dict(kwargs.pop("params", {}) or {}) - - content_type: Optional[str] = kwargs.pop("content_type", _headers.pop("Content-Type", None)) - api_version: str = kwargs.pop("api_version", _params.pop("api-version", "2025-05-15-preview")) - accept = _headers.pop("Accept", "application/json") - - # Construct URL - _url = "/redTeams/runs:run" - - # Construct parameters - _params["api-version"] = _SERIALIZER.query("api_version", api_version, "str") - - # Construct headers - if content_type is not None: - _headers["Content-Type"] = _SERIALIZER.header("content_type", content_type, "str") - _headers["Accept"] = _SERIALIZER.header("accept", accept, "str") - - return HttpRequest(method="POST", url=_url, params=_params, headers=_headers, **kwargs) - - -class ServicePatternsOperations: - """ - .. warning:: - **DO NOT** instantiate this class directly. - - Instead, you should access the following operations through - :class:`~azure.ai.projects.onedp.AIProjectClient`'s - :attr:`service_patterns` attribute. - """ - - def __init__(self, *args, **kwargs): - input_args = list(args) - self._client: PipelineClient = input_args.pop(0) if input_args else kwargs.pop("client") - self._config: AIProjectClientConfiguration = input_args.pop(0) if input_args else kwargs.pop("config") - self._serialize: Serializer = input_args.pop(0) if input_args else kwargs.pop("serializer") - self._deserialize: Deserializer = input_args.pop(0) if input_args else kwargs.pop("deserializer") + if response.status_code not in [200]: + if _stream: + try: + response.read() # Load the body in memory and close the socket + except (StreamConsumedError, StreamClosedError): + pass + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise HttpResponseError(response=response) - self.building_blocks = ServicePatternsBuildingBlocksOperations( - self._client, self._config, self._serialize, self._deserialize + response_headers = {} + response_headers["x-ms-client-request-id"] = self._deserialize( + "str", response.headers.get("x-ms-client-request-id") ) + if _stream: + deserialized = response.iter_bytes() + else: + deserialized = _deserialize(_models.Connection, response.json()) -class ConnectionsOperations: - """ - .. warning:: - **DO NOT** instantiate this class directly. - - Instead, you should access the following operations through - :class:`~azure.ai.projects.onedp.AIProjectClient`'s - :attr:`connections` attribute. - """ + if cls: + return cls(pipeline_response, deserialized, response_headers) # type: ignore - def __init__(self, *args, **kwargs): - input_args = list(args) - self._client: PipelineClient = input_args.pop(0) if input_args else kwargs.pop("client") - self._config: AIProjectClientConfiguration = input_args.pop(0) if input_args else kwargs.pop("config") - self._serialize: Serializer = input_args.pop(0) if input_args else kwargs.pop("serializer") - self._deserialize: Deserializer = input_args.pop(0) if input_args else kwargs.pop("deserializer") + return deserialized # type: ignore @distributed_trace - def get(self, name: str, **kwargs: Any) -> _models.Connection: - """Get a connection by name. + def get_with_credentials(self, name: str, **kwargs: Any) -> _models.Connection: + """Get a connection by name, with its connection credentials. :param name: The name of the resource. Required. :type name: str @@ -1026,7 +802,7 @@ def get(self, name: str, **kwargs: Any) -> _models.Connection: cls: ClsType[_models.Connection] = kwargs.pop("cls", None) - _request = build_connections_get_request( + _request = build_connections_get_with_credentials_request( name=name, api_version=self._config.api_version, headers=_headers, @@ -1073,16 +849,20 @@ def list( self, *, connection_type: Optional[Union[str, _models.ConnectionType]] = None, + default_connection: Optional[bool] = None, top: Optional[int] = None, skip: Optional[int] = None, **kwargs: Any ) -> Iterable["_models.Connection"]: - """List all connections in the project. + """List all connections in the project, without populating connection credentials. - :keyword connection_type: Specific type of connection to return in list. Known values are: - "AzureOpenAI", "AzureBlob", "CognitiveSearch", "CosmosDB", "ApiKey", "AppInsights", and - "CustomKeys". Default value is None. + :keyword connection_type: List connections of this specific type. Known values are: + "AzureOpenAI", "AzureBlob", "AzureStorageAccount", "CognitiveSearch", "CosmosDB", "ApiKey", + "AppConfig", "AppInsights", and "CustomKeys". Default value is None. :paramtype connection_type: str or ~azure.ai.projects.onedp.models.ConnectionType + :keyword default_connection: List connections that are default connections. Default value is + None. + :paramtype default_connection: bool :keyword top: The number of result items to return. Default value is None. :paramtype top: int :keyword skip: The number of result items to skip. Default value is None. @@ -1110,6 +890,7 @@ def prepare_request(next_link=None): _request = build_connections_list_request( connection_type=connection_type, + default_connection=default_connection, top=top, skip=skip, maxpagesize=maxpagesize, @@ -1828,13 +1609,21 @@ def delete_version( # pylint: disable=inconsistent-return-statements return cls(pipeline_response, None, {}) # type: ignore @overload - def create( - self, name: str, body: _models.DatasetVersion, *, content_type: str = "application/json", **kwargs: Any + def create_version( + self, + name: str, + version: str, + body: _models.DatasetVersion, + *, + content_type: str = "application/json", + **kwargs: Any ) -> _models.DatasetVersion: - """Create a new DatasetVersion. The version id will be generated by the service. + """Create a new or replace an existing DatasetVersion with the given version id. :param name: The name of the resource. Required. :type name: str + :param version: The specific version id of the DatasetVersion to create or replace. Required. + :type version: str :param body: The definition of the DatasetVersion to create. Required. :type body: ~azure.ai.projects.onedp.models.DatasetVersion :keyword content_type: Body Parameter content-type. Content type parameter for JSON body. @@ -1846,13 +1635,15 @@ def create( """ @overload - def create( - self, name: str, body: JSON, *, content_type: str = "application/json", **kwargs: Any + def create_version( + self, name: str, version: str, body: JSON, *, content_type: str = "application/json", **kwargs: Any ) -> _models.DatasetVersion: - """Create a new DatasetVersion. The version id will be generated by the service. + """Create a new or replace an existing DatasetVersion with the given version id. :param name: The name of the resource. Required. :type name: str + :param version: The specific version id of the DatasetVersion to create or replace. Required. + :type version: str :param body: The definition of the DatasetVersion to create. Required. :type body: JSON :keyword content_type: Body Parameter content-type. Content type parameter for JSON body. @@ -1864,13 +1655,15 @@ def create( """ @overload - def create( - self, name: str, body: IO[bytes], *, content_type: str = "application/json", **kwargs: Any + def create_version( + self, name: str, version: str, body: IO[bytes], *, content_type: str = "application/json", **kwargs: Any ) -> _models.DatasetVersion: - """Create a new DatasetVersion. The version id will be generated by the service. + """Create a new or replace an existing DatasetVersion with the given version id. :param name: The name of the resource. Required. :type name: str + :param version: The specific version id of the DatasetVersion to create or replace. Required. + :type version: str :param body: The definition of the DatasetVersion to create. Required. :type body: IO[bytes] :keyword content_type: Body Parameter content-type. Content type parameter for binary body. @@ -1882,13 +1675,15 @@ def create( """ @distributed_trace - def create( - self, name: str, body: Union[_models.DatasetVersion, JSON, IO[bytes]], **kwargs: Any + def create_version( + self, name: str, version: str, body: Union[_models.DatasetVersion, JSON, IO[bytes]], **kwargs: Any ) -> _models.DatasetVersion: - """Create a new DatasetVersion. The version id will be generated by the service. + """Create a new or replace an existing DatasetVersion with the given version id. :param name: The name of the resource. Required. :type name: str + :param version: The specific version id of the DatasetVersion to create or replace. Required. + :type version: str :param body: The definition of the DatasetVersion to create. Is one of the following types: DatasetVersion, JSON, IO[bytes] Required. :type body: ~azure.ai.projects.onedp.models.DatasetVersion or JSON or IO[bytes] @@ -1917,8 +1712,9 @@ def create( else: _content = json.dumps(body, cls=SdkJSONEncoder, exclude_readonly=True) # type: ignore - _request = build_datasets_create_request( + _request = build_datasets_create_version_request( name=name, + version=version, content_type=content_type, api_version=self._config.api_version, content=_content, @@ -1937,7 +1733,7 @@ def create( response = pipeline_response.http_response - if response.status_code not in [200]: + if response.status_code not in [200, 201]: if _stream: try: response.read() # Load the body in memory and close the socket @@ -1946,225 +1742,73 @@ def create( map_error(status_code=response.status_code, response=response, error_map=error_map) raise HttpResponseError(response=response) - response_headers = {} - response_headers["Repeatability-Result"] = self._deserialize( - "str", response.headers.get("Repeatability-Result") - ) - response_headers["x-ms-client-request-id"] = self._deserialize( - "str", response.headers.get("x-ms-client-request-id") - ) - if _stream: deserialized = response.iter_bytes() else: deserialized = _deserialize(_models.DatasetVersion, response.json()) if cls: - return cls(pipeline_response, deserialized, response_headers) # type: ignore + return cls(pipeline_response, deserialized, {}) # type: ignore return deserialized # type: ignore @overload - def create_version( + def start_pending_upload_version( self, name: str, version: str, - body: _models.DatasetVersion, + body: _models.PendingUploadRequest, *, content_type: str = "application/json", **kwargs: Any - ) -> _models.DatasetVersion: - """Create a new or replace an existing DatasetVersion with the given version id. + ) -> _models.PendingUploadResponse: + """Start a new or get an existing pending upload of a dataset for a specific version. :param name: The name of the resource. Required. :type name: str - :param version: The specific version id of the DatasetVersion to create or replace. Required. + :param version: The specific version id of the DatasetVersion to operate on. Required. :type version: str - :param body: The definition of the DatasetVersion to create. Required. - :type body: ~azure.ai.projects.onedp.models.DatasetVersion + :param body: Parameters for the action. Required. + :type body: ~azure.ai.projects.onedp.models.PendingUploadRequest :keyword content_type: Body Parameter content-type. Content type parameter for JSON body. Default value is "application/json". :paramtype content_type: str - :return: DatasetVersion. The DatasetVersion is compatible with MutableMapping - :rtype: ~azure.ai.projects.onedp.models.DatasetVersion + :return: PendingUploadResponse. The PendingUploadResponse is compatible with MutableMapping + :rtype: ~azure.ai.projects.onedp.models.PendingUploadResponse :raises ~azure.core.exceptions.HttpResponseError: """ @overload - def create_version( + def start_pending_upload_version( self, name: str, version: str, body: JSON, *, content_type: str = "application/json", **kwargs: Any - ) -> _models.DatasetVersion: - """Create a new or replace an existing DatasetVersion with the given version id. + ) -> _models.PendingUploadResponse: + """Start a new or get an existing pending upload of a dataset for a specific version. :param name: The name of the resource. Required. :type name: str - :param version: The specific version id of the DatasetVersion to create or replace. Required. + :param version: The specific version id of the DatasetVersion to operate on. Required. :type version: str - :param body: The definition of the DatasetVersion to create. Required. + :param body: Parameters for the action. Required. :type body: JSON :keyword content_type: Body Parameter content-type. Content type parameter for JSON body. Default value is "application/json". :paramtype content_type: str - :return: DatasetVersion. The DatasetVersion is compatible with MutableMapping - :rtype: ~azure.ai.projects.onedp.models.DatasetVersion + :return: PendingUploadResponse. The PendingUploadResponse is compatible with MutableMapping + :rtype: ~azure.ai.projects.onedp.models.PendingUploadResponse :raises ~azure.core.exceptions.HttpResponseError: """ @overload - def create_version( + def start_pending_upload_version( self, name: str, version: str, body: IO[bytes], *, content_type: str = "application/json", **kwargs: Any - ) -> _models.DatasetVersion: - """Create a new or replace an existing DatasetVersion with the given version id. + ) -> _models.PendingUploadResponse: + """Start a new or get an existing pending upload of a dataset for a specific version. :param name: The name of the resource. Required. :type name: str - :param version: The specific version id of the DatasetVersion to create or replace. Required. + :param version: The specific version id of the DatasetVersion to operate on. Required. :type version: str - :param body: The definition of the DatasetVersion to create. Required. - :type body: IO[bytes] - :keyword content_type: Body Parameter content-type. Content type parameter for binary body. - Default value is "application/json". - :paramtype content_type: str - :return: DatasetVersion. The DatasetVersion is compatible with MutableMapping - :rtype: ~azure.ai.projects.onedp.models.DatasetVersion - :raises ~azure.core.exceptions.HttpResponseError: - """ - - @distributed_trace - def create_version( - self, name: str, version: str, body: Union[_models.DatasetVersion, JSON, IO[bytes]], **kwargs: Any - ) -> _models.DatasetVersion: - """Create a new or replace an existing DatasetVersion with the given version id. - - :param name: The name of the resource. Required. - :type name: str - :param version: The specific version id of the DatasetVersion to create or replace. Required. - :type version: str - :param body: The definition of the DatasetVersion to create. Is one of the following types: - DatasetVersion, JSON, IO[bytes] Required. - :type body: ~azure.ai.projects.onedp.models.DatasetVersion or JSON or IO[bytes] - :return: DatasetVersion. The DatasetVersion is compatible with MutableMapping - :rtype: ~azure.ai.projects.onedp.models.DatasetVersion - :raises ~azure.core.exceptions.HttpResponseError: - """ - error_map: MutableMapping = { - 401: ClientAuthenticationError, - 404: ResourceNotFoundError, - 409: ResourceExistsError, - 304: ResourceNotModifiedError, - } - error_map.update(kwargs.pop("error_map", {}) or {}) - - _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) - _params = kwargs.pop("params", {}) or {} - - content_type: Optional[str] = kwargs.pop("content_type", _headers.pop("Content-Type", None)) - cls: ClsType[_models.DatasetVersion] = kwargs.pop("cls", None) - - content_type = content_type or "application/json" - _content = None - if isinstance(body, (IOBase, bytes)): - _content = body - else: - _content = json.dumps(body, cls=SdkJSONEncoder, exclude_readonly=True) # type: ignore - - _request = build_datasets_create_version_request( - name=name, - version=version, - content_type=content_type, - api_version=self._config.api_version, - content=_content, - headers=_headers, - params=_params, - ) - path_format_arguments = { - "endpoint": self._serialize.url("self._config.endpoint", self._config.endpoint, "str", skip_quote=True), - } - _request.url = self._client.format_url(_request.url, **path_format_arguments) - - _stream = kwargs.pop("stream", False) - pipeline_response: PipelineResponse = self._client._pipeline.run( # pylint: disable=protected-access - _request, stream=_stream, **kwargs - ) - - response = pipeline_response.http_response - - if response.status_code not in [200, 201]: - if _stream: - try: - response.read() # Load the body in memory and close the socket - except (StreamConsumedError, StreamClosedError): - pass - map_error(status_code=response.status_code, response=response, error_map=error_map) - raise HttpResponseError(response=response) - - if _stream: - deserialized = response.iter_bytes() - else: - deserialized = _deserialize(_models.DatasetVersion, response.json()) - - if cls: - return cls(pipeline_response, deserialized, {}) # type: ignore - - return deserialized # type: ignore - - @overload - def start_pending_upload_version( - self, - name: str, - version: str, - body: _models.PendingUploadRequest, - *, - content_type: str = "application/json", - **kwargs: Any - ) -> _models.PendingUploadResponse: - """Create or start a pending upload of a dataset for a specific version. - - :param name: The name of the resource. Required. - :type name: str - :param version: The specific version id of the DatasetVersion to operate on. Required. - :type version: str - :param body: Parameters for the action. Required. - :type body: ~azure.ai.projects.onedp.models.PendingUploadRequest - :keyword content_type: Body Parameter content-type. Content type parameter for JSON body. - Default value is "application/json". - :paramtype content_type: str - :return: PendingUploadResponse. The PendingUploadResponse is compatible with MutableMapping - :rtype: ~azure.ai.projects.onedp.models.PendingUploadResponse - :raises ~azure.core.exceptions.HttpResponseError: - """ - - @overload - def start_pending_upload_version( - self, name: str, version: str, body: JSON, *, content_type: str = "application/json", **kwargs: Any - ) -> _models.PendingUploadResponse: - """Create or start a pending upload of a dataset for a specific version. - - :param name: The name of the resource. Required. - :type name: str - :param version: The specific version id of the DatasetVersion to operate on. Required. - :type version: str - :param body: Parameters for the action. Required. - :type body: JSON - :keyword content_type: Body Parameter content-type. Content type parameter for JSON body. - Default value is "application/json". - :paramtype content_type: str - :return: PendingUploadResponse. The PendingUploadResponse is compatible with MutableMapping - :rtype: ~azure.ai.projects.onedp.models.PendingUploadResponse - :raises ~azure.core.exceptions.HttpResponseError: - """ - - @overload - def start_pending_upload_version( - self, name: str, version: str, body: IO[bytes], *, content_type: str = "application/json", **kwargs: Any - ) -> _models.PendingUploadResponse: - """Create or start a pending upload of a dataset for a specific version. - - :param name: The name of the resource. Required. - :type name: str - :param version: The specific version id of the DatasetVersion to operate on. Required. - :type version: str - :param body: Parameters for the action. Required. + :param body: Parameters for the action. Required. :type body: IO[bytes] :keyword content_type: Body Parameter content-type. Content type parameter for binary body. Default value is "application/json". @@ -2178,7 +1822,7 @@ def start_pending_upload_version( def start_pending_upload_version( self, name: str, version: str, body: Union[_models.PendingUploadRequest, JSON, IO[bytes]], **kwargs: Any ) -> _models.PendingUploadResponse: - """Create or start a pending upload of a dataset for a specific version. + """Start a new or get an existing pending upload of a dataset for a specific version. :param name: The name of the resource. Required. :type name: str @@ -2186,936 +1830,11 @@ def start_pending_upload_version( :type version: str :param body: Parameters for the action. Is one of the following types: PendingUploadRequest, JSON, IO[bytes] Required. - :type body: ~azure.ai.projects.onedp.models.PendingUploadRequest or JSON or IO[bytes] - :return: PendingUploadResponse. The PendingUploadResponse is compatible with MutableMapping - :rtype: ~azure.ai.projects.onedp.models.PendingUploadResponse - :raises ~azure.core.exceptions.HttpResponseError: - """ - error_map: MutableMapping = { - 401: ClientAuthenticationError, - 404: ResourceNotFoundError, - 409: ResourceExistsError, - 304: ResourceNotModifiedError, - } - error_map.update(kwargs.pop("error_map", {}) or {}) - - _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) - _params = kwargs.pop("params", {}) or {} - - content_type: Optional[str] = kwargs.pop("content_type", _headers.pop("Content-Type", None)) - cls: ClsType[_models.PendingUploadResponse] = kwargs.pop("cls", None) - - content_type = content_type or "application/json" - _content = None - if isinstance(body, (IOBase, bytes)): - _content = body - else: - _content = json.dumps(body, cls=SdkJSONEncoder, exclude_readonly=True) # type: ignore - - _request = build_datasets_start_pending_upload_version_request( - name=name, - version=version, - content_type=content_type, - api_version=self._config.api_version, - content=_content, - headers=_headers, - params=_params, - ) - path_format_arguments = { - "endpoint": self._serialize.url("self._config.endpoint", self._config.endpoint, "str", skip_quote=True), - } - _request.url = self._client.format_url(_request.url, **path_format_arguments) - - _stream = kwargs.pop("stream", False) - pipeline_response: PipelineResponse = self._client._pipeline.run( # pylint: disable=protected-access - _request, stream=_stream, **kwargs - ) - - response = pipeline_response.http_response - - if response.status_code not in [200]: - if _stream: - try: - response.read() # Load the body in memory and close the socket - except (StreamConsumedError, StreamClosedError): - pass - map_error(status_code=response.status_code, response=response, error_map=error_map) - raise HttpResponseError(response=response) - - if _stream: - deserialized = response.iter_bytes() - else: - deserialized = _deserialize(_models.PendingUploadResponse, response.json()) - - if cls: - return cls(pipeline_response, deserialized, {}) # type: ignore - - return deserialized # type: ignore - - @overload - def start_pending_upload( - self, name: str, body: _models.PendingUploadRequest, *, content_type: str = "application/json", **kwargs: Any - ) -> _models.PendingUploadResponse: - """Create or start a pending upload of a dataset. The version id will be generated by the service. - - :param name: The name of the resource. Required. - :type name: str - :param body: Parameters for the action. Required. - :type body: ~azure.ai.projects.onedp.models.PendingUploadRequest - :keyword content_type: Body Parameter content-type. Content type parameter for JSON body. - Default value is "application/json". - :paramtype content_type: str - :return: PendingUploadResponse. The PendingUploadResponse is compatible with MutableMapping - :rtype: ~azure.ai.projects.onedp.models.PendingUploadResponse - :raises ~azure.core.exceptions.HttpResponseError: - """ - - @overload - def start_pending_upload( - self, name: str, body: JSON, *, content_type: str = "application/json", **kwargs: Any - ) -> _models.PendingUploadResponse: - """Create or start a pending upload of a dataset. The version id will be generated by the service. - - :param name: The name of the resource. Required. - :type name: str - :param body: Parameters for the action. Required. - :type body: JSON - :keyword content_type: Body Parameter content-type. Content type parameter for JSON body. - Default value is "application/json". - :paramtype content_type: str - :return: PendingUploadResponse. The PendingUploadResponse is compatible with MutableMapping - :rtype: ~azure.ai.projects.onedp.models.PendingUploadResponse - :raises ~azure.core.exceptions.HttpResponseError: - """ - - @overload - def start_pending_upload( - self, name: str, body: IO[bytes], *, content_type: str = "application/json", **kwargs: Any - ) -> _models.PendingUploadResponse: - """Create or start a pending upload of a dataset. The version id will be generated by the service. - - :param name: The name of the resource. Required. - :type name: str - :param body: Parameters for the action. Required. - :type body: IO[bytes] - :keyword content_type: Body Parameter content-type. Content type parameter for binary body. - Default value is "application/json". - :paramtype content_type: str - :return: PendingUploadResponse. The PendingUploadResponse is compatible with MutableMapping - :rtype: ~azure.ai.projects.onedp.models.PendingUploadResponse - :raises ~azure.core.exceptions.HttpResponseError: - """ - - @distributed_trace - def start_pending_upload( - self, name: str, body: Union[_models.PendingUploadRequest, JSON, IO[bytes]], **kwargs: Any - ) -> _models.PendingUploadResponse: - """Create or start a pending upload of a dataset. The version id will be generated by the service. - - :param name: The name of the resource. Required. - :type name: str - :param body: Parameters for the action. Is one of the following types: PendingUploadRequest, - JSON, IO[bytes] Required. - :type body: ~azure.ai.projects.onedp.models.PendingUploadRequest or JSON or IO[bytes] - :return: PendingUploadResponse. The PendingUploadResponse is compatible with MutableMapping - :rtype: ~azure.ai.projects.onedp.models.PendingUploadResponse - :raises ~azure.core.exceptions.HttpResponseError: - """ - error_map: MutableMapping = { - 401: ClientAuthenticationError, - 404: ResourceNotFoundError, - 409: ResourceExistsError, - 304: ResourceNotModifiedError, - } - error_map.update(kwargs.pop("error_map", {}) or {}) - - _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) - _params = kwargs.pop("params", {}) or {} - - content_type: Optional[str] = kwargs.pop("content_type", _headers.pop("Content-Type", None)) - cls: ClsType[_models.PendingUploadResponse] = kwargs.pop("cls", None) - - content_type = content_type or "application/json" - _content = None - if isinstance(body, (IOBase, bytes)): - _content = body - else: - _content = json.dumps(body, cls=SdkJSONEncoder, exclude_readonly=True) # type: ignore - - _request = build_datasets_start_pending_upload_request( - name=name, - content_type=content_type, - api_version=self._config.api_version, - content=_content, - headers=_headers, - params=_params, - ) - path_format_arguments = { - "endpoint": self._serialize.url("self._config.endpoint", self._config.endpoint, "str", skip_quote=True), - } - _request.url = self._client.format_url(_request.url, **path_format_arguments) - - _stream = kwargs.pop("stream", False) - pipeline_response: PipelineResponse = self._client._pipeline.run( # pylint: disable=protected-access - _request, stream=_stream, **kwargs - ) - - response = pipeline_response.http_response - - if response.status_code not in [200]: - if _stream: - try: - response.read() # Load the body in memory and close the socket - except (StreamConsumedError, StreamClosedError): - pass - map_error(status_code=response.status_code, response=response, error_map=error_map) - raise HttpResponseError(response=response) - - if _stream: - deserialized = response.iter_bytes() - else: - deserialized = _deserialize(_models.PendingUploadResponse, response.json()) - - if cls: - return cls(pipeline_response, deserialized, {}) # type: ignore - - return deserialized # type: ignore - - -class IndexesOperations: - """ - .. warning:: - **DO NOT** instantiate this class directly. - - Instead, you should access the following operations through - :class:`~azure.ai.projects.onedp.AIProjectClient`'s - :attr:`indexes` attribute. - """ - - def __init__(self, *args, **kwargs): - input_args = list(args) - self._client: PipelineClient = input_args.pop(0) if input_args else kwargs.pop("client") - self._config: AIProjectClientConfiguration = input_args.pop(0) if input_args else kwargs.pop("config") - self._serialize: Serializer = input_args.pop(0) if input_args else kwargs.pop("serializer") - self._deserialize: Deserializer = input_args.pop(0) if input_args else kwargs.pop("deserializer") - - @distributed_trace - def list_versions( - self, - name: str, - *, - top: Optional[int] = None, - skip: Optional[str] = None, - tags: Optional[str] = None, - list_view_type: Optional[Union[str, _models.ListViewType]] = None, - **kwargs: Any - ) -> Iterable["_models.Index"]: - """List all versions of the given Index. - - :param name: The name of the resource. Required. - :type name: str - :keyword top: Top count of results, top count cannot be greater than the page size. If topCount - > page size, results with be default page size count will be returned. Default value is None. - :paramtype top: int - :keyword skip: Continuation token for pagination. Default value is None. - :paramtype skip: str - :keyword tags: Comma-separated list of tag names (and optionally values). Example: - tag1,tag2=value2. Default value is None. - :paramtype tags: str - :keyword list_view_type: [ListViewType.ActiveOnly, ListViewType.ArchivedOnly, ListViewType.All] - View type for including/excluding (for example) archived entities. Known values are: - "ActiveOnly", "ArchivedOnly", and "All". Default value is None. - :paramtype list_view_type: str or ~azure.ai.projects.onedp.models.ListViewType - :return: An iterator like instance of Index - :rtype: ~azure.core.paging.ItemPaged[~azure.ai.projects.onedp.models.Index] - :raises ~azure.core.exceptions.HttpResponseError: - """ - _headers = kwargs.pop("headers", {}) or {} - _params = kwargs.pop("params", {}) or {} - - cls: ClsType[List[_models.Index]] = kwargs.pop("cls", None) - - error_map: MutableMapping = { - 401: ClientAuthenticationError, - 404: ResourceNotFoundError, - 409: ResourceExistsError, - 304: ResourceNotModifiedError, - } - error_map.update(kwargs.pop("error_map", {}) or {}) - - def prepare_request(next_link=None): - if not next_link: - - _request = build_indexes_list_versions_request( - name=name, - top=top, - skip=skip, - tags=tags, - list_view_type=list_view_type, - api_version=self._config.api_version, - headers=_headers, - params=_params, - ) - path_format_arguments = { - "endpoint": self._serialize.url( - "self._config.endpoint", self._config.endpoint, "str", skip_quote=True - ), - } - _request.url = self._client.format_url(_request.url, **path_format_arguments) - - else: - # make call to next link with the client's api-version - _parsed_next_link = urllib.parse.urlparse(next_link) - _next_request_params = case_insensitive_dict( - { - key: [urllib.parse.quote(v) for v in value] - for key, value in urllib.parse.parse_qs(_parsed_next_link.query).items() - } - ) - _next_request_params["api-version"] = self._config.api_version - _request = HttpRequest( - "GET", urllib.parse.urljoin(next_link, _parsed_next_link.path), params=_next_request_params - ) - path_format_arguments = { - "endpoint": self._serialize.url( - "self._config.endpoint", self._config.endpoint, "str", skip_quote=True - ), - } - _request.url = self._client.format_url(_request.url, **path_format_arguments) - - return _request - - def extract_data(pipeline_response): - deserialized = pipeline_response.http_response.json() - list_of_elem = _deserialize(List[_models.Index], deserialized.get("value", [])) - if cls: - list_of_elem = cls(list_of_elem) # type: ignore - return deserialized.get("nextLink") or None, iter(list_of_elem) - - def get_next(next_link=None): - _request = prepare_request(next_link) - - _stream = False - pipeline_response: PipelineResponse = self._client._pipeline.run( # pylint: disable=protected-access - _request, stream=_stream, **kwargs - ) - response = pipeline_response.http_response - - if response.status_code not in [200]: - map_error(status_code=response.status_code, response=response, error_map=error_map) - raise HttpResponseError(response=response) - - return pipeline_response - - return ItemPaged(get_next, extract_data) - - @distributed_trace - def list_latest( - self, - *, - top: Optional[int] = None, - skip: Optional[str] = None, - tags: Optional[str] = None, - list_view_type: Optional[Union[str, _models.ListViewType]] = None, - **kwargs: Any - ) -> Iterable["_models.Index"]: - """List the latest version of each Index. - - :keyword top: Top count of results, top count cannot be greater than the page size. If topCount - > page size, results with be default page size count will be returned. Default value is None. - :paramtype top: int - :keyword skip: Continuation token for pagination. Default value is None. - :paramtype skip: str - :keyword tags: Comma-separated list of tag names (and optionally values). Example: - tag1,tag2=value2. Default value is None. - :paramtype tags: str - :keyword list_view_type: [ListViewType.ActiveOnly, ListViewType.ArchivedOnly, ListViewType.All] - View type for including/excluding (for example) archived entities. Known values are: - "ActiveOnly", "ArchivedOnly", and "All". Default value is None. - :paramtype list_view_type: str or ~azure.ai.projects.onedp.models.ListViewType - :return: An iterator like instance of Index - :rtype: ~azure.core.paging.ItemPaged[~azure.ai.projects.onedp.models.Index] - :raises ~azure.core.exceptions.HttpResponseError: - """ - _headers = kwargs.pop("headers", {}) or {} - _params = kwargs.pop("params", {}) or {} - - cls: ClsType[List[_models.Index]] = kwargs.pop("cls", None) - - error_map: MutableMapping = { - 401: ClientAuthenticationError, - 404: ResourceNotFoundError, - 409: ResourceExistsError, - 304: ResourceNotModifiedError, - } - error_map.update(kwargs.pop("error_map", {}) or {}) - - def prepare_request(next_link=None): - if not next_link: - - _request = build_indexes_list_latest_request( - top=top, - skip=skip, - tags=tags, - list_view_type=list_view_type, - api_version=self._config.api_version, - headers=_headers, - params=_params, - ) - path_format_arguments = { - "endpoint": self._serialize.url( - "self._config.endpoint", self._config.endpoint, "str", skip_quote=True - ), - } - _request.url = self._client.format_url(_request.url, **path_format_arguments) - - else: - # make call to next link with the client's api-version - _parsed_next_link = urllib.parse.urlparse(next_link) - _next_request_params = case_insensitive_dict( - { - key: [urllib.parse.quote(v) for v in value] - for key, value in urllib.parse.parse_qs(_parsed_next_link.query).items() - } - ) - _next_request_params["api-version"] = self._config.api_version - _request = HttpRequest( - "GET", urllib.parse.urljoin(next_link, _parsed_next_link.path), params=_next_request_params - ) - path_format_arguments = { - "endpoint": self._serialize.url( - "self._config.endpoint", self._config.endpoint, "str", skip_quote=True - ), - } - _request.url = self._client.format_url(_request.url, **path_format_arguments) - - return _request - - def extract_data(pipeline_response): - deserialized = pipeline_response.http_response.json() - list_of_elem = _deserialize(List[_models.Index], deserialized.get("value", [])) - if cls: - list_of_elem = cls(list_of_elem) # type: ignore - return deserialized.get("nextLink") or None, iter(list_of_elem) - - def get_next(next_link=None): - _request = prepare_request(next_link) - - _stream = False - pipeline_response: PipelineResponse = self._client._pipeline.run( # pylint: disable=protected-access - _request, stream=_stream, **kwargs - ) - response = pipeline_response.http_response - - if response.status_code not in [200]: - map_error(status_code=response.status_code, response=response, error_map=error_map) - raise HttpResponseError(response=response) - - return pipeline_response - - return ItemPaged(get_next, extract_data) - - @distributed_trace - def get_version(self, name: str, version: str, **kwargs: Any) -> _models.Index: - """Get the specific version of the Index. - - :param name: The name of the resource. Required. - :type name: str - :param version: The specific version id of the Index to retrieve. Required. - :type version: str - :return: Index. The Index is compatible with MutableMapping - :rtype: ~azure.ai.projects.onedp.models.Index - :raises ~azure.core.exceptions.HttpResponseError: - """ - error_map: MutableMapping = { - 401: ClientAuthenticationError, - 404: ResourceNotFoundError, - 409: ResourceExistsError, - 304: ResourceNotModifiedError, - } - error_map.update(kwargs.pop("error_map", {}) or {}) - - _headers = kwargs.pop("headers", {}) or {} - _params = kwargs.pop("params", {}) or {} - - cls: ClsType[_models.Index] = kwargs.pop("cls", None) - - _request = build_indexes_get_version_request( - name=name, - version=version, - api_version=self._config.api_version, - headers=_headers, - params=_params, - ) - path_format_arguments = { - "endpoint": self._serialize.url("self._config.endpoint", self._config.endpoint, "str", skip_quote=True), - } - _request.url = self._client.format_url(_request.url, **path_format_arguments) - - _stream = kwargs.pop("stream", False) - pipeline_response: PipelineResponse = self._client._pipeline.run( # pylint: disable=protected-access - _request, stream=_stream, **kwargs - ) - - response = pipeline_response.http_response - - if response.status_code not in [200]: - if _stream: - try: - response.read() # Load the body in memory and close the socket - except (StreamConsumedError, StreamClosedError): - pass - map_error(status_code=response.status_code, response=response, error_map=error_map) - raise HttpResponseError(response=response) - - if _stream: - deserialized = response.iter_bytes() - else: - deserialized = _deserialize(_models.Index, response.json()) - - if cls: - return cls(pipeline_response, deserialized, {}) # type: ignore - - return deserialized # type: ignore - - @distributed_trace - def delete_version( # pylint: disable=inconsistent-return-statements - self, name: str, version: str, **kwargs: Any - ) -> None: - """Delete the specific version of the Index. - - :param name: The name of the resource. Required. - :type name: str - :param version: The version of the Index to delete. Required. - :type version: str - :return: None - :rtype: None - :raises ~azure.core.exceptions.HttpResponseError: - """ - error_map: MutableMapping = { - 401: ClientAuthenticationError, - 404: ResourceNotFoundError, - 409: ResourceExistsError, - 304: ResourceNotModifiedError, - } - error_map.update(kwargs.pop("error_map", {}) or {}) - - _headers = kwargs.pop("headers", {}) or {} - _params = kwargs.pop("params", {}) or {} - - cls: ClsType[None] = kwargs.pop("cls", None) - - _request = build_indexes_delete_version_request( - name=name, - version=version, - api_version=self._config.api_version, - headers=_headers, - params=_params, - ) - path_format_arguments = { - "endpoint": self._serialize.url("self._config.endpoint", self._config.endpoint, "str", skip_quote=True), - } - _request.url = self._client.format_url(_request.url, **path_format_arguments) - - _stream = False - pipeline_response: PipelineResponse = self._client._pipeline.run( # pylint: disable=protected-access - _request, stream=_stream, **kwargs - ) - - response = pipeline_response.http_response - - if response.status_code not in [204]: - map_error(status_code=response.status_code, response=response, error_map=error_map) - raise HttpResponseError(response=response) - - if cls: - return cls(pipeline_response, None, {}) # type: ignore - - @overload - def create( - self, name: str, body: _models.Index, *, content_type: str = "application/json", **kwargs: Any - ) -> _models.Index: - """Create a new Index. The version id will be generated by the service. - - :param name: The name of the resource. Required. - :type name: str - :param body: The definition of the Index to create. Required. - :type body: ~azure.ai.projects.onedp.models.Index - :keyword content_type: Body Parameter content-type. Content type parameter for JSON body. - Default value is "application/json". - :paramtype content_type: str - :return: Index. The Index is compatible with MutableMapping - :rtype: ~azure.ai.projects.onedp.models.Index - :raises ~azure.core.exceptions.HttpResponseError: - """ - - @overload - def create(self, name: str, body: JSON, *, content_type: str = "application/json", **kwargs: Any) -> _models.Index: - """Create a new Index. The version id will be generated by the service. - - :param name: The name of the resource. Required. - :type name: str - :param body: The definition of the Index to create. Required. - :type body: JSON - :keyword content_type: Body Parameter content-type. Content type parameter for JSON body. - Default value is "application/json". - :paramtype content_type: str - :return: Index. The Index is compatible with MutableMapping - :rtype: ~azure.ai.projects.onedp.models.Index - :raises ~azure.core.exceptions.HttpResponseError: - """ - - @overload - def create( - self, name: str, body: IO[bytes], *, content_type: str = "application/json", **kwargs: Any - ) -> _models.Index: - """Create a new Index. The version id will be generated by the service. - - :param name: The name of the resource. Required. - :type name: str - :param body: The definition of the Index to create. Required. - :type body: IO[bytes] - :keyword content_type: Body Parameter content-type. Content type parameter for binary body. - Default value is "application/json". - :paramtype content_type: str - :return: Index. The Index is compatible with MutableMapping - :rtype: ~azure.ai.projects.onedp.models.Index - :raises ~azure.core.exceptions.HttpResponseError: - """ - - @distributed_trace - def create(self, name: str, body: Union[_models.Index, JSON, IO[bytes]], **kwargs: Any) -> _models.Index: - """Create a new Index. The version id will be generated by the service. - - :param name: The name of the resource. Required. - :type name: str - :param body: The definition of the Index to create. Is one of the following types: Index, JSON, - IO[bytes] Required. - :type body: ~azure.ai.projects.onedp.models.Index or JSON or IO[bytes] - :return: Index. The Index is compatible with MutableMapping - :rtype: ~azure.ai.projects.onedp.models.Index - :raises ~azure.core.exceptions.HttpResponseError: - """ - error_map: MutableMapping = { - 401: ClientAuthenticationError, - 404: ResourceNotFoundError, - 409: ResourceExistsError, - 304: ResourceNotModifiedError, - } - error_map.update(kwargs.pop("error_map", {}) or {}) - - _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) - _params = kwargs.pop("params", {}) or {} - - content_type: Optional[str] = kwargs.pop("content_type", _headers.pop("Content-Type", None)) - cls: ClsType[_models.Index] = kwargs.pop("cls", None) - - content_type = content_type or "application/json" - _content = None - if isinstance(body, (IOBase, bytes)): - _content = body - else: - _content = json.dumps(body, cls=SdkJSONEncoder, exclude_readonly=True) # type: ignore - - _request = build_indexes_create_request( - name=name, - content_type=content_type, - api_version=self._config.api_version, - content=_content, - headers=_headers, - params=_params, - ) - path_format_arguments = { - "endpoint": self._serialize.url("self._config.endpoint", self._config.endpoint, "str", skip_quote=True), - } - _request.url = self._client.format_url(_request.url, **path_format_arguments) - - _stream = kwargs.pop("stream", False) - pipeline_response: PipelineResponse = self._client._pipeline.run( # pylint: disable=protected-access - _request, stream=_stream, **kwargs - ) - - response = pipeline_response.http_response - - if response.status_code not in [200]: - if _stream: - try: - response.read() # Load the body in memory and close the socket - except (StreamConsumedError, StreamClosedError): - pass - map_error(status_code=response.status_code, response=response, error_map=error_map) - raise HttpResponseError(response=response) - - response_headers = {} - response_headers["Repeatability-Result"] = self._deserialize( - "str", response.headers.get("Repeatability-Result") - ) - response_headers["x-ms-client-request-id"] = self._deserialize( - "str", response.headers.get("x-ms-client-request-id") - ) - - if _stream: - deserialized = response.iter_bytes() - else: - deserialized = _deserialize(_models.Index, response.json()) - - if cls: - return cls(pipeline_response, deserialized, response_headers) # type: ignore - - return deserialized # type: ignore - - @overload - def create_version( - self, name: str, version: str, body: _models.Index, *, content_type: str = "application/json", **kwargs: Any - ) -> _models.Index: - """Create a new or replace an existing Index with the given version id. - - :param name: The name of the resource. Required. - :type name: str - :param version: The specific version id of the Index to create or replace. Required. - :type version: str - :param body: The definition of the Index to create. Required. - :type body: ~azure.ai.projects.onedp.models.Index - :keyword content_type: Body Parameter content-type. Content type parameter for JSON body. - Default value is "application/json". - :paramtype content_type: str - :return: Index. The Index is compatible with MutableMapping - :rtype: ~azure.ai.projects.onedp.models.Index - :raises ~azure.core.exceptions.HttpResponseError: - """ - - @overload - def create_version( - self, name: str, version: str, body: JSON, *, content_type: str = "application/json", **kwargs: Any - ) -> _models.Index: - """Create a new or replace an existing Index with the given version id. - - :param name: The name of the resource. Required. - :type name: str - :param version: The specific version id of the Index to create or replace. Required. - :type version: str - :param body: The definition of the Index to create. Required. - :type body: JSON - :keyword content_type: Body Parameter content-type. Content type parameter for JSON body. - Default value is "application/json". - :paramtype content_type: str - :return: Index. The Index is compatible with MutableMapping - :rtype: ~azure.ai.projects.onedp.models.Index - :raises ~azure.core.exceptions.HttpResponseError: - """ - - @overload - def create_version( - self, name: str, version: str, body: IO[bytes], *, content_type: str = "application/json", **kwargs: Any - ) -> _models.Index: - """Create a new or replace an existing Index with the given version id. - - :param name: The name of the resource. Required. - :type name: str - :param version: The specific version id of the Index to create or replace. Required. - :type version: str - :param body: The definition of the Index to create. Required. - :type body: IO[bytes] - :keyword content_type: Body Parameter content-type. Content type parameter for binary body. - Default value is "application/json". - :paramtype content_type: str - :return: Index. The Index is compatible with MutableMapping - :rtype: ~azure.ai.projects.onedp.models.Index - :raises ~azure.core.exceptions.HttpResponseError: - """ - - @distributed_trace - def create_version( - self, name: str, version: str, body: Union[_models.Index, JSON, IO[bytes]], **kwargs: Any - ) -> _models.Index: - """Create a new or replace an existing Index with the given version id. - - :param name: The name of the resource. Required. - :type name: str - :param version: The specific version id of the Index to create or replace. Required. - :type version: str - :param body: The definition of the Index to create. Is one of the following types: Index, JSON, - IO[bytes] Required. - :type body: ~azure.ai.projects.onedp.models.Index or JSON or IO[bytes] - :return: Index. The Index is compatible with MutableMapping - :rtype: ~azure.ai.projects.onedp.models.Index - :raises ~azure.core.exceptions.HttpResponseError: - """ - error_map: MutableMapping = { - 401: ClientAuthenticationError, - 404: ResourceNotFoundError, - 409: ResourceExistsError, - 304: ResourceNotModifiedError, - } - error_map.update(kwargs.pop("error_map", {}) or {}) - - _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) - _params = kwargs.pop("params", {}) or {} - - content_type: Optional[str] = kwargs.pop("content_type", _headers.pop("Content-Type", None)) - cls: ClsType[_models.Index] = kwargs.pop("cls", None) - - content_type = content_type or "application/json" - _content = None - if isinstance(body, (IOBase, bytes)): - _content = body - else: - _content = json.dumps(body, cls=SdkJSONEncoder, exclude_readonly=True) # type: ignore - - _request = build_indexes_create_version_request( - name=name, - version=version, - content_type=content_type, - api_version=self._config.api_version, - content=_content, - headers=_headers, - params=_params, - ) - path_format_arguments = { - "endpoint": self._serialize.url("self._config.endpoint", self._config.endpoint, "str", skip_quote=True), - } - _request.url = self._client.format_url(_request.url, **path_format_arguments) - - _stream = kwargs.pop("stream", False) - pipeline_response: PipelineResponse = self._client._pipeline.run( # pylint: disable=protected-access - _request, stream=_stream, **kwargs - ) - - response = pipeline_response.http_response - - if response.status_code not in [200, 201]: - if _stream: - try: - response.read() # Load the body in memory and close the socket - except (StreamConsumedError, StreamClosedError): - pass - map_error(status_code=response.status_code, response=response, error_map=error_map) - raise HttpResponseError(response=response) - - if _stream: - deserialized = response.iter_bytes() - else: - deserialized = _deserialize(_models.Index, response.json()) - - if cls: - return cls(pipeline_response, deserialized, {}) # type: ignore - - return deserialized # type: ignore - - -class DeploymentsOperations: - """ - .. warning:: - **DO NOT** instantiate this class directly. - - Instead, you should access the following operations through - :class:`~azure.ai.projects.onedp.AIProjectClient`'s - :attr:`deployments` attribute. - """ - - def __init__(self, *args, **kwargs): - input_args = list(args) - self._client: PipelineClient = input_args.pop(0) if input_args else kwargs.pop("client") - self._config: AIProjectClientConfiguration = input_args.pop(0) if input_args else kwargs.pop("config") - self._serialize: Serializer = input_args.pop(0) if input_args else kwargs.pop("serializer") - self._deserialize: Deserializer = input_args.pop(0) if input_args else kwargs.pop("deserializer") - - @distributed_trace - def get(self, name: str, **kwargs: Any) -> _models.Deployment: - """Get a deployed model. - - :param name: Name of the deployment. Required. - :type name: str - :return: Deployment. The Deployment is compatible with MutableMapping - :rtype: ~azure.ai.projects.onedp.models.Deployment - :raises ~azure.core.exceptions.HttpResponseError: - """ - error_map: MutableMapping = { - 401: ClientAuthenticationError, - 404: ResourceNotFoundError, - 409: ResourceExistsError, - 304: ResourceNotModifiedError, - } - error_map.update(kwargs.pop("error_map", {}) or {}) - - _headers = kwargs.pop("headers", {}) or {} - _params = kwargs.pop("params", {}) or {} - - cls: ClsType[_models.Deployment] = kwargs.pop("cls", None) - - _request = build_deployments_get_request( - name=name, - api_version=self._config.api_version, - headers=_headers, - params=_params, - ) - path_format_arguments = { - "endpoint": self._serialize.url("self._config.endpoint", self._config.endpoint, "str", skip_quote=True), - } - _request.url = self._client.format_url(_request.url, **path_format_arguments) - - _stream = kwargs.pop("stream", False) - pipeline_response: PipelineResponse = self._client._pipeline.run( # pylint: disable=protected-access - _request, stream=_stream, **kwargs - ) - - response = pipeline_response.http_response - - if response.status_code not in [200]: - if _stream: - try: - response.read() # Load the body in memory and close the socket - except (StreamConsumedError, StreamClosedError): - pass - map_error(status_code=response.status_code, response=response, error_map=error_map) - raise HttpResponseError(response=response) - - response_headers = {} - response_headers["x-ms-client-request-id"] = self._deserialize( - "str", response.headers.get("x-ms-client-request-id") - ) - - if _stream: - deserialized = response.iter_bytes() - else: - deserialized = _deserialize(_models.Deployment, response.json()) - - if cls: - return cls(pipeline_response, deserialized, response_headers) # type: ignore - - return deserialized # type: ignore - - @distributed_trace - def list( - self, - *, - model_publisher: Optional[str] = None, - model_name: Optional[str] = None, - top: Optional[int] = None, - skip: Optional[int] = None, - **kwargs: Any - ) -> Iterable["_models.Deployment"]: - """List all deployed models in the project. - - :keyword model_publisher: Model publisher to filter models by. Default value is None. - :paramtype model_publisher: str - :keyword model_name: Model name (the publisher specific name) to filter models by. Default - value is None. - :paramtype model_name: str - :keyword top: The number of result items to return. Default value is None. - :paramtype top: int - :keyword skip: The number of result items to skip. Default value is None. - :paramtype skip: int - :return: An iterator like instance of Deployment - :rtype: ~azure.core.paging.ItemPaged[~azure.ai.projects.onedp.models.Deployment] + :type body: ~azure.ai.projects.onedp.models.PendingUploadRequest or JSON or IO[bytes] + :return: PendingUploadResponse. The PendingUploadResponse is compatible with MutableMapping + :rtype: ~azure.ai.projects.onedp.models.PendingUploadResponse :raises ~azure.core.exceptions.HttpResponseError: """ - _headers = kwargs.pop("headers", {}) or {} - _params = kwargs.pop("params", {}) or {} - - maxpagesize = kwargs.pop("maxpagesize", None) - cls: ClsType[List[_models.Deployment]] = kwargs.pop("cls", None) - error_map: MutableMapping = { 401: ClientAuthenticationError, 404: ResourceNotFoundError, @@ -3124,81 +1843,68 @@ def list( } error_map.update(kwargs.pop("error_map", {}) or {}) - def prepare_request(next_link=None): - if not next_link: + _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) + _params = kwargs.pop("params", {}) or {} - _request = build_deployments_list_request( - model_publisher=model_publisher, - model_name=model_name, - top=top, - skip=skip, - maxpagesize=maxpagesize, - api_version=self._config.api_version, - headers=_headers, - params=_params, - ) - path_format_arguments = { - "endpoint": self._serialize.url( - "self._config.endpoint", self._config.endpoint, "str", skip_quote=True - ), - } - _request.url = self._client.format_url(_request.url, **path_format_arguments) + content_type: Optional[str] = kwargs.pop("content_type", _headers.pop("Content-Type", None)) + cls: ClsType[_models.PendingUploadResponse] = kwargs.pop("cls", None) - else: - # make call to next link with the client's api-version - _parsed_next_link = urllib.parse.urlparse(next_link) - _next_request_params = case_insensitive_dict( - { - key: [urllib.parse.quote(v) for v in value] - for key, value in urllib.parse.parse_qs(_parsed_next_link.query).items() - } - ) - _next_request_params["api-version"] = self._config.api_version - _request = HttpRequest( - "GET", urllib.parse.urljoin(next_link, _parsed_next_link.path), params=_next_request_params - ) - path_format_arguments = { - "endpoint": self._serialize.url( - "self._config.endpoint", self._config.endpoint, "str", skip_quote=True - ), - } - _request.url = self._client.format_url(_request.url, **path_format_arguments) + content_type = content_type or "application/json" + _content = None + if isinstance(body, (IOBase, bytes)): + _content = body + else: + _content = json.dumps(body, cls=SdkJSONEncoder, exclude_readonly=True) # type: ignore - return _request + _request = build_datasets_start_pending_upload_version_request( + name=name, + version=version, + content_type=content_type, + api_version=self._config.api_version, + content=_content, + headers=_headers, + params=_params, + ) + path_format_arguments = { + "endpoint": self._serialize.url("self._config.endpoint", self._config.endpoint, "str", skip_quote=True), + } + _request.url = self._client.format_url(_request.url, **path_format_arguments) - def extract_data(pipeline_response): - deserialized = pipeline_response.http_response.json() - list_of_elem = _deserialize(List[_models.Deployment], deserialized.get("value", [])) - if cls: - list_of_elem = cls(list_of_elem) # type: ignore - return deserialized.get("nextLink") or None, iter(list_of_elem) + _stream = kwargs.pop("stream", False) + pipeline_response: PipelineResponse = self._client._pipeline.run( # pylint: disable=protected-access + _request, stream=_stream, **kwargs + ) - def get_next(next_link=None): - _request = prepare_request(next_link) + response = pipeline_response.http_response - _stream = False - pipeline_response: PipelineResponse = self._client._pipeline.run( # pylint: disable=protected-access - _request, stream=_stream, **kwargs - ) - response = pipeline_response.http_response + if response.status_code not in [200]: + if _stream: + try: + response.read() # Load the body in memory and close the socket + except (StreamConsumedError, StreamClosedError): + pass + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise HttpResponseError(response=response) - if response.status_code not in [200]: - map_error(status_code=response.status_code, response=response, error_map=error_map) - raise HttpResponseError(response=response) + if _stream: + deserialized = response.iter_bytes() + else: + deserialized = _deserialize(_models.PendingUploadResponse, response.json()) - return pipeline_response + if cls: + return cls(pipeline_response, deserialized, {}) # type: ignore - return ItemPaged(get_next, extract_data) + return deserialized # type: ignore -class EvaluationResultsOperations: +class IndexesOperations: """ .. warning:: **DO NOT** instantiate this class directly. Instead, you should access the following operations through :class:`~azure.ai.projects.onedp.AIProjectClient`'s - :attr:`evaluation_results` attribute. + :attr:`indexes` attribute. """ def __init__(self, *args, **kwargs): @@ -3209,12 +1915,6 @@ def __init__(self, *args, **kwargs): self._deserialize: Deserializer = input_args.pop(0) if input_args else kwargs.pop("deserializer") @distributed_trace - @api_version_validation( - method_added_on="2025-05-15-preview", - params_added_on={ - "2025-05-15-preview": ["api_version", "name", "top", "skip", "tags", "list_view_type", "accept"] - }, - ) def list_versions( self, name: str, @@ -3224,8 +1924,8 @@ def list_versions( tags: Optional[str] = None, list_view_type: Optional[Union[str, _models.ListViewType]] = None, **kwargs: Any - ) -> Iterable["_models.EvaluationResult"]: - """List all versions of the given EvaluationResult. + ) -> Iterable["_models.Index"]: + """List all versions of the given Index. :param name: The name of the resource. Required. :type name: str @@ -3241,14 +1941,14 @@ def list_versions( View type for including/excluding (for example) archived entities. Known values are: "ActiveOnly", "ArchivedOnly", and "All". Default value is None. :paramtype list_view_type: str or ~azure.ai.projects.onedp.models.ListViewType - :return: An iterator like instance of EvaluationResult - :rtype: ~azure.core.paging.ItemPaged[~azure.ai.projects.onedp.models.EvaluationResult] + :return: An iterator like instance of Index + :rtype: ~azure.core.paging.ItemPaged[~azure.ai.projects.onedp.models.Index] :raises ~azure.core.exceptions.HttpResponseError: """ _headers = kwargs.pop("headers", {}) or {} _params = kwargs.pop("params", {}) or {} - cls: ClsType[List[_models.EvaluationResult]] = kwargs.pop("cls", None) + cls: ClsType[List[_models.Index]] = kwargs.pop("cls", None) error_map: MutableMapping = { 401: ClientAuthenticationError, @@ -3261,7 +1961,7 @@ def list_versions( def prepare_request(next_link=None): if not next_link: - _request = build_evaluation_results_list_versions_request( + _request = build_indexes_list_versions_request( name=name, top=top, skip=skip, @@ -3302,7 +2002,7 @@ def prepare_request(next_link=None): def extract_data(pipeline_response): deserialized = pipeline_response.http_response.json() - list_of_elem = _deserialize(List[_models.EvaluationResult], deserialized.get("value", [])) + list_of_elem = _deserialize(List[_models.Index], deserialized.get("value", [])) if cls: list_of_elem = cls(list_of_elem) # type: ignore return deserialized.get("nextLink") or None, iter(list_of_elem) @@ -3325,10 +2025,6 @@ def get_next(next_link=None): return ItemPaged(get_next, extract_data) @distributed_trace - @api_version_validation( - method_added_on="2025-05-15-preview", - params_added_on={"2025-05-15-preview": ["api_version", "top", "skip", "tags", "list_view_type", "accept"]}, - ) def list_latest( self, *, @@ -3337,8 +2033,8 @@ def list_latest( tags: Optional[str] = None, list_view_type: Optional[Union[str, _models.ListViewType]] = None, **kwargs: Any - ) -> Iterable["_models.EvaluationResult"]: - """List the latest version of each EvaluationResult. + ) -> Iterable["_models.Index"]: + """List the latest version of each Index. :keyword top: Top count of results, top count cannot be greater than the page size. If topCount > page size, results with be default page size count will be returned. Default value is None. @@ -3352,14 +2048,14 @@ def list_latest( View type for including/excluding (for example) archived entities. Known values are: "ActiveOnly", "ArchivedOnly", and "All". Default value is None. :paramtype list_view_type: str or ~azure.ai.projects.onedp.models.ListViewType - :return: An iterator like instance of EvaluationResult - :rtype: ~azure.core.paging.ItemPaged[~azure.ai.projects.onedp.models.EvaluationResult] + :return: An iterator like instance of Index + :rtype: ~azure.core.paging.ItemPaged[~azure.ai.projects.onedp.models.Index] :raises ~azure.core.exceptions.HttpResponseError: """ _headers = kwargs.pop("headers", {}) or {} _params = kwargs.pop("params", {}) or {} - cls: ClsType[List[_models.EvaluationResult]] = kwargs.pop("cls", None) + cls: ClsType[List[_models.Index]] = kwargs.pop("cls", None) error_map: MutableMapping = { 401: ClientAuthenticationError, @@ -3372,7 +2068,7 @@ def list_latest( def prepare_request(next_link=None): if not next_link: - _request = build_evaluation_results_list_latest_request( + _request = build_indexes_list_latest_request( top=top, skip=skip, tags=tags, @@ -3412,7 +2108,7 @@ def prepare_request(next_link=None): def extract_data(pipeline_response): deserialized = pipeline_response.http_response.json() - list_of_elem = _deserialize(List[_models.EvaluationResult], deserialized.get("value", [])) + list_of_elem = _deserialize(List[_models.Index], deserialized.get("value", [])) if cls: list_of_elem = cls(list_of_elem) # type: ignore return deserialized.get("nextLink") or None, iter(list_of_elem) @@ -3435,19 +2131,15 @@ def get_next(next_link=None): return ItemPaged(get_next, extract_data) @distributed_trace - @api_version_validation( - method_added_on="2025-05-15-preview", - params_added_on={"2025-05-15-preview": ["api_version", "name", "version", "accept"]}, - ) - def get_version(self, name: str, version: str, **kwargs: Any) -> _models.EvaluationResult: - """Get the specific version of the EvaluationResult. + def get_version(self, name: str, version: str, **kwargs: Any) -> _models.Index: + """Get the specific version of the Index. :param name: The name of the resource. Required. :type name: str - :param version: The specific version id of the EvaluationResult to retrieve. Required. + :param version: The specific version id of the Index to retrieve. Required. :type version: str - :return: EvaluationResult. The EvaluationResult is compatible with MutableMapping - :rtype: ~azure.ai.projects.onedp.models.EvaluationResult + :return: Index. The Index is compatible with MutableMapping + :rtype: ~azure.ai.projects.onedp.models.Index :raises ~azure.core.exceptions.HttpResponseError: """ error_map: MutableMapping = { @@ -3461,9 +2153,9 @@ def get_version(self, name: str, version: str, **kwargs: Any) -> _models.Evaluat _headers = kwargs.pop("headers", {}) or {} _params = kwargs.pop("params", {}) or {} - cls: ClsType[_models.EvaluationResult] = kwargs.pop("cls", None) + cls: ClsType[_models.Index] = kwargs.pop("cls", None) - _request = build_evaluation_results_get_version_request( + _request = build_indexes_get_version_request( name=name, version=version, api_version=self._config.api_version, @@ -3494,7 +2186,7 @@ def get_version(self, name: str, version: str, **kwargs: Any) -> _models.Evaluat if _stream: deserialized = response.iter_bytes() else: - deserialized = _deserialize(_models.EvaluationResult, response.json()) + deserialized = _deserialize(_models.Index, response.json()) if cls: return cls(pipeline_response, deserialized, {}) # type: ignore @@ -3502,18 +2194,14 @@ def get_version(self, name: str, version: str, **kwargs: Any) -> _models.Evaluat return deserialized # type: ignore @distributed_trace - @api_version_validation( - method_added_on="2025-05-15-preview", - params_added_on={"2025-05-15-preview": ["api_version", "name", "version", "accept"]}, - ) def delete_version( # pylint: disable=inconsistent-return-statements self, name: str, version: str, **kwargs: Any ) -> None: - """Delete the specific version of the EvaluationResult. + """Delete the specific version of the Index. :param name: The name of the resource. Required. :type name: str - :param version: The version of the EvaluationResult to delete. Required. + :param version: The version of the Index to delete. Required. :type version: str :return: None :rtype: None @@ -3532,7 +2220,7 @@ def delete_version( # pylint: disable=inconsistent-return-statements cls: ClsType[None] = kwargs.pop("cls", None) - _request = build_evaluation_results_delete_version_request( + _request = build_indexes_delete_version_request( name=name, version=version, api_version=self._config.api_version, @@ -3556,244 +2244,83 @@ def delete_version( # pylint: disable=inconsistent-return-statements raise HttpResponseError(response=response) if cls: - return cls(pipeline_response, None, {}) # type: ignore - - @overload - def create( - self, name: str, body: _models.EvaluationResult, *, content_type: str = "application/json", **kwargs: Any - ) -> _models.EvaluationResult: - """Create a new EvaluationResult. The version id will be generated by the service. - - :param name: The name of the resource. Required. - :type name: str - :param body: The definition of the EvaluationResult to create. Required. - :type body: ~azure.ai.projects.onedp.models.EvaluationResult - :keyword content_type: Body Parameter content-type. Content type parameter for JSON body. - Default value is "application/json". - :paramtype content_type: str - :return: EvaluationResult. The EvaluationResult is compatible with MutableMapping - :rtype: ~azure.ai.projects.onedp.models.EvaluationResult - :raises ~azure.core.exceptions.HttpResponseError: - """ - - @overload - def create( - self, name: str, body: JSON, *, content_type: str = "application/json", **kwargs: Any - ) -> _models.EvaluationResult: - """Create a new EvaluationResult. The version id will be generated by the service. - - :param name: The name of the resource. Required. - :type name: str - :param body: The definition of the EvaluationResult to create. Required. - :type body: JSON - :keyword content_type: Body Parameter content-type. Content type parameter for JSON body. - Default value is "application/json". - :paramtype content_type: str - :return: EvaluationResult. The EvaluationResult is compatible with MutableMapping - :rtype: ~azure.ai.projects.onedp.models.EvaluationResult - :raises ~azure.core.exceptions.HttpResponseError: - """ - - @overload - def create( - self, name: str, body: IO[bytes], *, content_type: str = "application/json", **kwargs: Any - ) -> _models.EvaluationResult: - """Create a new EvaluationResult. The version id will be generated by the service. - - :param name: The name of the resource. Required. - :type name: str - :param body: The definition of the EvaluationResult to create. Required. - :type body: IO[bytes] - :keyword content_type: Body Parameter content-type. Content type parameter for binary body. - Default value is "application/json". - :paramtype content_type: str - :return: EvaluationResult. The EvaluationResult is compatible with MutableMapping - :rtype: ~azure.ai.projects.onedp.models.EvaluationResult - :raises ~azure.core.exceptions.HttpResponseError: - """ - - @distributed_trace - @api_version_validation( - method_added_on="2025-05-15-preview", - params_added_on={ - "2025-05-15-preview": [ - "api_version", - "name", - "repeatability_request_id", - "repeatability_first_sent", - "client_request_id", - "content_type", - "accept", - ] - }, - ) - def create( - self, name: str, body: Union[_models.EvaluationResult, JSON, IO[bytes]], **kwargs: Any - ) -> _models.EvaluationResult: - """Create a new EvaluationResult. The version id will be generated by the service. - - :param name: The name of the resource. Required. - :type name: str - :param body: The definition of the EvaluationResult to create. Is one of the following types: - EvaluationResult, JSON, IO[bytes] Required. - :type body: ~azure.ai.projects.onedp.models.EvaluationResult or JSON or IO[bytes] - :return: EvaluationResult. The EvaluationResult is compatible with MutableMapping - :rtype: ~azure.ai.projects.onedp.models.EvaluationResult - :raises ~azure.core.exceptions.HttpResponseError: - """ - error_map: MutableMapping = { - 401: ClientAuthenticationError, - 404: ResourceNotFoundError, - 409: ResourceExistsError, - 304: ResourceNotModifiedError, - } - error_map.update(kwargs.pop("error_map", {}) or {}) - - _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) - _params = kwargs.pop("params", {}) or {} - - content_type: Optional[str] = kwargs.pop("content_type", _headers.pop("Content-Type", None)) - cls: ClsType[_models.EvaluationResult] = kwargs.pop("cls", None) - - content_type = content_type or "application/json" - _content = None - if isinstance(body, (IOBase, bytes)): - _content = body - else: - _content = json.dumps(body, cls=SdkJSONEncoder, exclude_readonly=True) # type: ignore - - _request = build_evaluation_results_create_request( - name=name, - content_type=content_type, - api_version=self._config.api_version, - content=_content, - headers=_headers, - params=_params, - ) - path_format_arguments = { - "endpoint": self._serialize.url("self._config.endpoint", self._config.endpoint, "str", skip_quote=True), - } - _request.url = self._client.format_url(_request.url, **path_format_arguments) - - _stream = kwargs.pop("stream", False) - pipeline_response: PipelineResponse = self._client._pipeline.run( # pylint: disable=protected-access - _request, stream=_stream, **kwargs - ) - - response = pipeline_response.http_response - - if response.status_code not in [200]: - if _stream: - try: - response.read() # Load the body in memory and close the socket - except (StreamConsumedError, StreamClosedError): - pass - map_error(status_code=response.status_code, response=response, error_map=error_map) - raise HttpResponseError(response=response) - - response_headers = {} - response_headers["Repeatability-Result"] = self._deserialize( - "str", response.headers.get("Repeatability-Result") - ) - response_headers["x-ms-client-request-id"] = self._deserialize( - "str", response.headers.get("x-ms-client-request-id") - ) - - if _stream: - deserialized = response.iter_bytes() - else: - deserialized = _deserialize(_models.EvaluationResult, response.json()) - - if cls: - return cls(pipeline_response, deserialized, response_headers) # type: ignore - - return deserialized # type: ignore + return cls(pipeline_response, None, {}) # type: ignore @overload def create_version( - self, - name: str, - version: str, - body: _models.EvaluationResult, - *, - content_type: str = "application/json", - **kwargs: Any - ) -> _models.EvaluationResult: - """Create a new or replace an existing EvaluationResult with the given version id. + self, name: str, version: str, body: _models.Index, *, content_type: str = "application/json", **kwargs: Any + ) -> _models.Index: + """Create a new or replace an existing Index with the given version id. :param name: The name of the resource. Required. :type name: str - :param version: The specific version id of the EvaluationResult to create or replace. Required. + :param version: The specific version id of the Index to create or replace. Required. :type version: str - :param body: The definition of the EvaluationResult to create. Required. - :type body: ~azure.ai.projects.onedp.models.EvaluationResult + :param body: The definition of the Index to create. Required. + :type body: ~azure.ai.projects.onedp.models.Index :keyword content_type: Body Parameter content-type. Content type parameter for JSON body. Default value is "application/json". :paramtype content_type: str - :return: EvaluationResult. The EvaluationResult is compatible with MutableMapping - :rtype: ~azure.ai.projects.onedp.models.EvaluationResult + :return: Index. The Index is compatible with MutableMapping + :rtype: ~azure.ai.projects.onedp.models.Index :raises ~azure.core.exceptions.HttpResponseError: """ @overload def create_version( self, name: str, version: str, body: JSON, *, content_type: str = "application/json", **kwargs: Any - ) -> _models.EvaluationResult: - """Create a new or replace an existing EvaluationResult with the given version id. + ) -> _models.Index: + """Create a new or replace an existing Index with the given version id. :param name: The name of the resource. Required. :type name: str - :param version: The specific version id of the EvaluationResult to create or replace. Required. + :param version: The specific version id of the Index to create or replace. Required. :type version: str - :param body: The definition of the EvaluationResult to create. Required. + :param body: The definition of the Index to create. Required. :type body: JSON :keyword content_type: Body Parameter content-type. Content type parameter for JSON body. Default value is "application/json". :paramtype content_type: str - :return: EvaluationResult. The EvaluationResult is compatible with MutableMapping - :rtype: ~azure.ai.projects.onedp.models.EvaluationResult + :return: Index. The Index is compatible with MutableMapping + :rtype: ~azure.ai.projects.onedp.models.Index :raises ~azure.core.exceptions.HttpResponseError: """ @overload def create_version( self, name: str, version: str, body: IO[bytes], *, content_type: str = "application/json", **kwargs: Any - ) -> _models.EvaluationResult: - """Create a new or replace an existing EvaluationResult with the given version id. + ) -> _models.Index: + """Create a new or replace an existing Index with the given version id. :param name: The name of the resource. Required. :type name: str - :param version: The specific version id of the EvaluationResult to create or replace. Required. + :param version: The specific version id of the Index to create or replace. Required. :type version: str - :param body: The definition of the EvaluationResult to create. Required. + :param body: The definition of the Index to create. Required. :type body: IO[bytes] :keyword content_type: Body Parameter content-type. Content type parameter for binary body. Default value is "application/json". :paramtype content_type: str - :return: EvaluationResult. The EvaluationResult is compatible with MutableMapping - :rtype: ~azure.ai.projects.onedp.models.EvaluationResult + :return: Index. The Index is compatible with MutableMapping + :rtype: ~azure.ai.projects.onedp.models.Index :raises ~azure.core.exceptions.HttpResponseError: """ @distributed_trace - @api_version_validation( - method_added_on="2025-05-15-preview", - params_added_on={"2025-05-15-preview": ["api_version", "name", "version", "content_type", "accept"]}, - ) def create_version( - self, name: str, version: str, body: Union[_models.EvaluationResult, JSON, IO[bytes]], **kwargs: Any - ) -> _models.EvaluationResult: - """Create a new or replace an existing EvaluationResult with the given version id. + self, name: str, version: str, body: Union[_models.Index, JSON, IO[bytes]], **kwargs: Any + ) -> _models.Index: + """Create a new or replace an existing Index with the given version id. :param name: The name of the resource. Required. :type name: str - :param version: The specific version id of the EvaluationResult to create or replace. Required. + :param version: The specific version id of the Index to create or replace. Required. :type version: str - :param body: The definition of the EvaluationResult to create. Is one of the following types: - EvaluationResult, JSON, IO[bytes] Required. - :type body: ~azure.ai.projects.onedp.models.EvaluationResult or JSON or IO[bytes] - :return: EvaluationResult. The EvaluationResult is compatible with MutableMapping - :rtype: ~azure.ai.projects.onedp.models.EvaluationResult + :param body: The definition of the Index to create. Is one of the following types: Index, JSON, + IO[bytes] Required. + :type body: ~azure.ai.projects.onedp.models.Index or JSON or IO[bytes] + :return: Index. The Index is compatible with MutableMapping + :rtype: ~azure.ai.projects.onedp.models.Index :raises ~azure.core.exceptions.HttpResponseError: """ error_map: MutableMapping = { @@ -3808,7 +2335,7 @@ def create_version( _params = kwargs.pop("params", {}) or {} content_type: Optional[str] = kwargs.pop("content_type", _headers.pop("Content-Type", None)) - cls: ClsType[_models.EvaluationResult] = kwargs.pop("cls", None) + cls: ClsType[_models.Index] = kwargs.pop("cls", None) content_type = content_type or "application/json" _content = None @@ -3817,7 +2344,7 @@ def create_version( else: _content = json.dumps(body, cls=SdkJSONEncoder, exclude_readonly=True) # type: ignore - _request = build_evaluation_results_create_version_request( + _request = build_indexes_create_version_request( name=name, version=version, content_type=content_type, @@ -3850,98 +2377,39 @@ def create_version( if _stream: deserialized = response.iter_bytes() else: - deserialized = _deserialize(_models.EvaluationResult, response.json()) + deserialized = _deserialize(_models.Index, response.json()) if cls: return cls(pipeline_response, deserialized, {}) # type: ignore return deserialized # type: ignore - @overload - def start_pending_upload( - self, - name: str, - version: str, - body: _models.PendingUploadRequest, - *, - content_type: str = "application/json", - **kwargs: Any - ) -> _models.PendingUploadResponse: - """Create or start a pending upload of a evaluation results for a specific version. - - :param name: The name of the resource. Required. - :type name: str - :param version: The specific version id of the EvaluationResult to operate on. Required. - :type version: str - :param body: Parameters for the action. Required. - :type body: ~azure.ai.projects.onedp.models.PendingUploadRequest - :keyword content_type: Body Parameter content-type. Content type parameter for JSON body. - Default value is "application/json". - :paramtype content_type: str - :return: PendingUploadResponse. The PendingUploadResponse is compatible with MutableMapping - :rtype: ~azure.ai.projects.onedp.models.PendingUploadResponse - :raises ~azure.core.exceptions.HttpResponseError: - """ - - @overload - def start_pending_upload( - self, name: str, version: str, body: JSON, *, content_type: str = "application/json", **kwargs: Any - ) -> _models.PendingUploadResponse: - """Create or start a pending upload of a evaluation results for a specific version. - :param name: The name of the resource. Required. - :type name: str - :param version: The specific version id of the EvaluationResult to operate on. Required. - :type version: str - :param body: Parameters for the action. Required. - :type body: JSON - :keyword content_type: Body Parameter content-type. Content type parameter for JSON body. - Default value is "application/json". - :paramtype content_type: str - :return: PendingUploadResponse. The PendingUploadResponse is compatible with MutableMapping - :rtype: ~azure.ai.projects.onedp.models.PendingUploadResponse - :raises ~azure.core.exceptions.HttpResponseError: - """ +class DeploymentsOperations: + """ + .. warning:: + **DO NOT** instantiate this class directly. - @overload - def start_pending_upload( - self, name: str, version: str, body: IO[bytes], *, content_type: str = "application/json", **kwargs: Any - ) -> _models.PendingUploadResponse: - """Create or start a pending upload of a evaluation results for a specific version. + Instead, you should access the following operations through + :class:`~azure.ai.projects.onedp.AIProjectClient`'s + :attr:`deployments` attribute. + """ - :param name: The name of the resource. Required. - :type name: str - :param version: The specific version id of the EvaluationResult to operate on. Required. - :type version: str - :param body: Parameters for the action. Required. - :type body: IO[bytes] - :keyword content_type: Body Parameter content-type. Content type parameter for binary body. - Default value is "application/json". - :paramtype content_type: str - :return: PendingUploadResponse. The PendingUploadResponse is compatible with MutableMapping - :rtype: ~azure.ai.projects.onedp.models.PendingUploadResponse - :raises ~azure.core.exceptions.HttpResponseError: - """ + def __init__(self, *args, **kwargs): + input_args = list(args) + self._client: PipelineClient = input_args.pop(0) if input_args else kwargs.pop("client") + self._config: AIProjectClientConfiguration = input_args.pop(0) if input_args else kwargs.pop("config") + self._serialize: Serializer = input_args.pop(0) if input_args else kwargs.pop("serializer") + self._deserialize: Deserializer = input_args.pop(0) if input_args else kwargs.pop("deserializer") @distributed_trace - @api_version_validation( - method_added_on="2025-05-15-preview", - params_added_on={"2025-05-15-preview": ["api_version", "name", "version", "content_type", "accept"]}, - ) - def start_pending_upload( - self, name: str, version: str, body: Union[_models.PendingUploadRequest, JSON, IO[bytes]], **kwargs: Any - ) -> _models.PendingUploadResponse: - """Create or start a pending upload of a evaluation results for a specific version. + def get(self, name: str, **kwargs: Any) -> _models.Deployment: + """Get a deployed model. - :param name: The name of the resource. Required. + :param name: Name of the deployment. Required. :type name: str - :param version: The specific version id of the EvaluationResult to operate on. Required. - :type version: str - :param body: Parameters for the action. Is one of the following types: PendingUploadRequest, - JSON, IO[bytes] Required. - :type body: ~azure.ai.projects.onedp.models.PendingUploadRequest or JSON or IO[bytes] - :return: PendingUploadResponse. The PendingUploadResponse is compatible with MutableMapping - :rtype: ~azure.ai.projects.onedp.models.PendingUploadResponse + :return: Deployment. The Deployment is compatible with MutableMapping + :rtype: ~azure.ai.projects.onedp.models.Deployment :raises ~azure.core.exceptions.HttpResponseError: """ error_map: MutableMapping = { @@ -3952,25 +2420,14 @@ def start_pending_upload( } error_map.update(kwargs.pop("error_map", {}) or {}) - _headers = case_insensitive_dict(kwargs.pop("headers", {}) or {}) + _headers = kwargs.pop("headers", {}) or {} _params = kwargs.pop("params", {}) or {} - content_type: Optional[str] = kwargs.pop("content_type", _headers.pop("Content-Type", None)) - cls: ClsType[_models.PendingUploadResponse] = kwargs.pop("cls", None) - - content_type = content_type or "application/json" - _content = None - if isinstance(body, (IOBase, bytes)): - _content = body - else: - _content = json.dumps(body, cls=SdkJSONEncoder, exclude_readonly=True) # type: ignore + cls: ClsType[_models.Deployment] = kwargs.pop("cls", None) - _request = build_evaluation_results_start_pending_upload_request( + _request = build_deployments_get_request( name=name, - version=version, - content_type=content_type, api_version=self._config.api_version, - content=_content, headers=_headers, params=_params, ) @@ -3995,16 +2452,126 @@ def start_pending_upload( map_error(status_code=response.status_code, response=response, error_map=error_map) raise HttpResponseError(response=response) + response_headers = {} + response_headers["x-ms-client-request-id"] = self._deserialize( + "str", response.headers.get("x-ms-client-request-id") + ) + if _stream: deserialized = response.iter_bytes() else: - deserialized = _deserialize(_models.PendingUploadResponse, response.json()) + deserialized = _deserialize(_models.Deployment, response.json()) if cls: - return cls(pipeline_response, deserialized, {}) # type: ignore + return cls(pipeline_response, deserialized, response_headers) # type: ignore return deserialized # type: ignore + @distributed_trace + def list( + self, + *, + model_publisher: Optional[str] = None, + model_name: Optional[str] = None, + top: Optional[int] = None, + skip: Optional[int] = None, + **kwargs: Any + ) -> Iterable["_models.Deployment"]: + """List all deployed models in the project. + + :keyword model_publisher: Model publisher to filter models by. Default value is None. + :paramtype model_publisher: str + :keyword model_name: Model name (the publisher specific name) to filter models by. Default + value is None. + :paramtype model_name: str + :keyword top: The number of result items to return. Default value is None. + :paramtype top: int + :keyword skip: The number of result items to skip. Default value is None. + :paramtype skip: int + :return: An iterator like instance of Deployment + :rtype: ~azure.core.paging.ItemPaged[~azure.ai.projects.onedp.models.Deployment] + :raises ~azure.core.exceptions.HttpResponseError: + """ + _headers = kwargs.pop("headers", {}) or {} + _params = kwargs.pop("params", {}) or {} + + maxpagesize = kwargs.pop("maxpagesize", None) + cls: ClsType[List[_models.Deployment]] = kwargs.pop("cls", None) + + error_map: MutableMapping = { + 401: ClientAuthenticationError, + 404: ResourceNotFoundError, + 409: ResourceExistsError, + 304: ResourceNotModifiedError, + } + error_map.update(kwargs.pop("error_map", {}) or {}) + + def prepare_request(next_link=None): + if not next_link: + + _request = build_deployments_list_request( + model_publisher=model_publisher, + model_name=model_name, + top=top, + skip=skip, + maxpagesize=maxpagesize, + api_version=self._config.api_version, + headers=_headers, + params=_params, + ) + path_format_arguments = { + "endpoint": self._serialize.url( + "self._config.endpoint", self._config.endpoint, "str", skip_quote=True + ), + } + _request.url = self._client.format_url(_request.url, **path_format_arguments) + + else: + # make call to next link with the client's api-version + _parsed_next_link = urllib.parse.urlparse(next_link) + _next_request_params = case_insensitive_dict( + { + key: [urllib.parse.quote(v) for v in value] + for key, value in urllib.parse.parse_qs(_parsed_next_link.query).items() + } + ) + _next_request_params["api-version"] = self._config.api_version + _request = HttpRequest( + "GET", urllib.parse.urljoin(next_link, _parsed_next_link.path), params=_next_request_params + ) + path_format_arguments = { + "endpoint": self._serialize.url( + "self._config.endpoint", self._config.endpoint, "str", skip_quote=True + ), + } + _request.url = self._client.format_url(_request.url, **path_format_arguments) + + return _request + + def extract_data(pipeline_response): + deserialized = pipeline_response.http_response.json() + list_of_elem = _deserialize(List[_models.Deployment], deserialized.get("value", [])) + if cls: + list_of_elem = cls(list_of_elem) # type: ignore + return deserialized.get("nextLink") or None, iter(list_of_elem) + + def get_next(next_link=None): + _request = prepare_request(next_link) + + _stream = False + pipeline_response: PipelineResponse = self._client._pipeline.run( # pylint: disable=protected-access + _request, stream=_stream, **kwargs + ) + response = pipeline_response.http_response + + if response.status_code not in [200]: + map_error(status_code=response.status_code, response=response, error_map=error_map) + raise HttpResponseError(response=response) + + return pipeline_response + + return ItemPaged(get_next, extract_data) + class RedTeamsOperations: """ diff --git a/sdk/ai/azure-ai-projects-onedp/azure/ai/projects/onedp/operations/_patch.py b/sdk/ai/azure-ai-projects-onedp/azure/ai/projects/onedp/operations/_patch.py index f91cb0dce5f3..62bf93321af8 100644 --- a/sdk/ai/azure-ai-projects-onedp/azure/ai/projects/onedp/operations/_patch.py +++ b/sdk/ai/azure-ai-projects-onedp/azure/ai/projects/onedp/operations/_patch.py @@ -16,13 +16,7 @@ from azure.core.exceptions import ResourceNotFoundError from azure.core.tracing.decorator import distributed_trace from ._operations import DatasetsOperations as DatasetsOperationsGenerated -from ..models._models import ( - DatasetVersion, - PendingUploadRequest, - PendingUploadType, - PendingUploadResponse, - Connection -) +from ..models._models import DatasetVersion, PendingUploadRequest, PendingUploadType, PendingUploadResponse, Connection from ..models._enums import ( DatasetType, AuthenticationType, @@ -50,7 +44,6 @@ def __init__(self, outer_instance: "AIProjectClient") -> None: self._outer_instance = outer_instance - @classmethod def _get_inference_url(cls, input_url: str) -> str: """ @@ -65,10 +58,9 @@ def _get_inference_url(cls, input_url: str) -> str: new_url = f"https://{parsed.netloc}/api/models" return new_url - @distributed_trace def get_chat_completions_client(self, **kwargs) -> "ChatCompletionsClient": - """Get an authenticated ChatCompletionsClient (from the package azure-ai-inference) to use with + """Get an authenticated ChatCompletionsClient (from the package azure-ai-inference) to use with AI models deployed to your AI Foundry Project. Keyword arguments are passed to the constructor of ChatCompletionsClient. @@ -106,10 +98,9 @@ def get_chat_completions_client(self, **kwargs) -> "ChatCompletionsClient": return client - @distributed_trace def get_embeddings_client(self, **kwargs) -> "EmbeddingsClient": - """Get an authenticated EmbeddingsClient (from the package azure-ai-inference) to use with + """Get an authenticated EmbeddingsClient (from the package azure-ai-inference) to use with AI models deployed to your AI Foundry Project. Keyword arguments are passed to the constructor of ChatCompletionsClient. @@ -147,10 +138,9 @@ def get_embeddings_client(self, **kwargs) -> "EmbeddingsClient": return client - @distributed_trace def get_image_embeddings_client(self, **kwargs) -> "ImageEmbeddingsClient": - """Get an authenticated ImageEmbeddingsClient (from the package azure-ai-inference) to use with + """Get an authenticated ImageEmbeddingsClient (from the package azure-ai-inference) to use with AI models deployed to your AI Foundry Project. Keyword arguments are passed to the constructor of ChatCompletionsClient. @@ -188,7 +178,6 @@ def get_image_embeddings_client(self, **kwargs) -> "ImageEmbeddingsClient": return client - @distributed_trace def get_azure_openai_client( self, *, api_version: Optional[str] = None, connection_name: Optional[str] = None, **kwargs @@ -231,19 +220,19 @@ def get_azure_openai_client( if connection_name: connection = self._outer_instance.connections.get(name=connection_name, **kwargs) else: - connection = self._outer_instance.connections.get_default(connection_type=ConnectionType.AZURE_OPEN_AI, **kwargs) + connection = self._outer_instance.connections.get_default( + connection_type=ConnectionType.AZURE_OPEN_AI, **kwargs + ) logger.debug("[InferenceOperations.get_azure_openai_client] connection = %s", str(connection)) - azure_endpoint = ( - connection.target[:-1] - if connection.target.endswith("/") - else connection.target - ) + azure_endpoint = connection.target[:-1] if connection.target.endswith("/") else connection.target if connection.auth_type == AuthenticationType.API_KEY: # For api-key authentication, we need to make another service call to get the connection with credentials. - connection_with_credentials = self._outer_instance.connections.get_with_credentials(name=connection.name, **kwargs) + connection_with_credentials = self._outer_instance.connections.get_with_credentials( + name=connection.name, **kwargs + ) api_key: Optional[str] = None if hasattr(connection_with_credentials.properties, "credentials"): @@ -253,11 +242,7 @@ def get_azure_openai_client( logger.debug( "[InferenceOperations.get_azure_openai_client] Creating AzureOpenAI using API key authentication" ) - client = AzureOpenAI( - api_key=api_key, - azure_endpoint=azure_endpoint, - api_version=api_version - ) + client = AzureOpenAI(api_key=api_key, azure_endpoint=azure_endpoint, api_version=api_version) elif connection.auth_type == AuthenticationType.ENTRA_ID: @@ -527,7 +512,7 @@ def upload_folder_and_create( __all__: List[str] = [ "InferenceOperations", "TelemetryOperations", - "DatasetsOperations" + "DatasetsOperations", ] # Add all objects you want publicly available to users at this package level diff --git a/sdk/ai/azure-ai-projects-onedp/generated_tests/test_ai_project_connections_operations.py b/sdk/ai/azure-ai-projects-onedp/generated_tests/test_ai_project_connections_operations.py index a3cde4337fbe..1ab1fc950f54 100644 --- a/sdk/ai/azure-ai-projects-onedp/generated_tests/test_ai_project_connections_operations.py +++ b/sdk/ai/azure-ai-projects-onedp/generated_tests/test_ai_project_connections_operations.py @@ -23,6 +23,17 @@ def test_connections_get(self, aiproject_endpoint): # please add some check logic here by yourself # ... + @AIProjectPreparer() + @recorded_by_proxy + def test_connections_get_with_credentials(self, aiproject_endpoint): + client = self.create_client(endpoint=aiproject_endpoint) + response = client.connections.get_with_credentials( + name="str", + ) + + # please add some check logic here by yourself + # ... + @AIProjectPreparer() @recorded_by_proxy def test_connections_list(self, aiproject_endpoint): diff --git a/sdk/ai/azure-ai-projects-onedp/generated_tests/test_ai_project_connections_operations_async.py b/sdk/ai/azure-ai-projects-onedp/generated_tests/test_ai_project_connections_operations_async.py index 27f8d231a481..eada3ba467bb 100644 --- a/sdk/ai/azure-ai-projects-onedp/generated_tests/test_ai_project_connections_operations_async.py +++ b/sdk/ai/azure-ai-projects-onedp/generated_tests/test_ai_project_connections_operations_async.py @@ -24,6 +24,17 @@ async def test_connections_get(self, aiproject_endpoint): # please add some check logic here by yourself # ... + @AIProjectPreparer() + @recorded_by_proxy_async + async def test_connections_get_with_credentials(self, aiproject_endpoint): + client = self.create_async_client(endpoint=aiproject_endpoint) + response = await client.connections.get_with_credentials( + name="str", + ) + + # please add some check logic here by yourself + # ... + @AIProjectPreparer() @recorded_by_proxy_async async def test_connections_list(self, aiproject_endpoint): diff --git a/sdk/ai/azure-ai-projects-onedp/generated_tests/test_ai_project_datasets_operations.py b/sdk/ai/azure-ai-projects-onedp/generated_tests/test_ai_project_datasets_operations.py index 0a9241cd13bc..506b7f48ebc3 100644 --- a/sdk/ai/azure-ai-projects-onedp/generated_tests/test_ai_project_datasets_operations.py +++ b/sdk/ai/azure-ai-projects-onedp/generated_tests/test_ai_project_datasets_operations.py @@ -56,29 +56,6 @@ def test_datasets_delete_version(self, aiproject_endpoint): # please add some check logic here by yourself # ... - @AIProjectPreparer() - @recorded_by_proxy - def test_datasets_create(self, aiproject_endpoint): - client = self.create_client(endpoint=aiproject_endpoint) - response = client.datasets.create( - name="str", - body={ - "datasetUri": "str", - "name": "str", - "openAIPurpose": "str", - "type": "uri_file", - "version": "str", - "description": "str", - "id": "str", - "isReference": bool, - "stage": "str", - "tags": {"str": "str"}, - }, - ) - - # please add some check logic here by yourself - # ... - @AIProjectPreparer() @recorded_by_proxy def test_datasets_create_version(self, aiproject_endpoint): @@ -115,15 +92,3 @@ def test_datasets_start_pending_upload_version(self, aiproject_endpoint): # please add some check logic here by yourself # ... - - @AIProjectPreparer() - @recorded_by_proxy - def test_datasets_start_pending_upload(self, aiproject_endpoint): - client = self.create_client(endpoint=aiproject_endpoint) - response = client.datasets.start_pending_upload( - name="str", - body={"pendingUploadType": "str", "connectionName": "str", "pendingUploadId": "str"}, - ) - - # please add some check logic here by yourself - # ... diff --git a/sdk/ai/azure-ai-projects-onedp/generated_tests/test_ai_project_datasets_operations_async.py b/sdk/ai/azure-ai-projects-onedp/generated_tests/test_ai_project_datasets_operations_async.py index a1b34b002a18..18c123286a08 100644 --- a/sdk/ai/azure-ai-projects-onedp/generated_tests/test_ai_project_datasets_operations_async.py +++ b/sdk/ai/azure-ai-projects-onedp/generated_tests/test_ai_project_datasets_operations_async.py @@ -57,29 +57,6 @@ async def test_datasets_delete_version(self, aiproject_endpoint): # please add some check logic here by yourself # ... - @AIProjectPreparer() - @recorded_by_proxy_async - async def test_datasets_create(self, aiproject_endpoint): - client = self.create_async_client(endpoint=aiproject_endpoint) - response = await client.datasets.create( - name="str", - body={ - "datasetUri": "str", - "name": "str", - "openAIPurpose": "str", - "type": "uri_file", - "version": "str", - "description": "str", - "id": "str", - "isReference": bool, - "stage": "str", - "tags": {"str": "str"}, - }, - ) - - # please add some check logic here by yourself - # ... - @AIProjectPreparer() @recorded_by_proxy_async async def test_datasets_create_version(self, aiproject_endpoint): @@ -116,15 +93,3 @@ async def test_datasets_start_pending_upload_version(self, aiproject_endpoint): # please add some check logic here by yourself # ... - - @AIProjectPreparer() - @recorded_by_proxy_async - async def test_datasets_start_pending_upload(self, aiproject_endpoint): - client = self.create_async_client(endpoint=aiproject_endpoint) - response = await client.datasets.start_pending_upload( - name="str", - body={"pendingUploadType": "str", "connectionName": "str", "pendingUploadId": "str"}, - ) - - # please add some check logic here by yourself - # ... diff --git a/sdk/ai/azure-ai-projects-onedp/generated_tests/test_ai_project_evaluations_operations.py b/sdk/ai/azure-ai-projects-onedp/generated_tests/test_ai_project_evaluations_operations.py index b689851e0c0b..2f00a1320ada 100644 --- a/sdk/ai/azure-ai-projects-onedp/generated_tests/test_ai_project_evaluations_operations.py +++ b/sdk/ai/azure-ai-projects-onedp/generated_tests/test_ai_project_evaluations_operations.py @@ -41,7 +41,6 @@ def test_evaluations_create_run(self, aiproject_endpoint): "data": "input_data", "evaluators": {"str": {"id": "str", "dataMapping": {"str": "str"}, "initParams": {"str": {}}}}, "id": "str", - "outputs": {"str": "str"}, "description": "str", "displayName": "str", "properties": {"str": "str"}, diff --git a/sdk/ai/azure-ai-projects-onedp/generated_tests/test_ai_project_evaluations_operations_async.py b/sdk/ai/azure-ai-projects-onedp/generated_tests/test_ai_project_evaluations_operations_async.py index 8f7309a47de4..e3323b6811a8 100644 --- a/sdk/ai/azure-ai-projects-onedp/generated_tests/test_ai_project_evaluations_operations_async.py +++ b/sdk/ai/azure-ai-projects-onedp/generated_tests/test_ai_project_evaluations_operations_async.py @@ -42,7 +42,6 @@ async def test_evaluations_create_run(self, aiproject_endpoint): "data": "input_data", "evaluators": {"str": {"id": "str", "dataMapping": {"str": "str"}, "initParams": {"str": {}}}}, "id": "str", - "outputs": {"str": "str"}, "description": "str", "displayName": "str", "properties": {"str": "str"}, diff --git a/sdk/ai/azure-ai-projects-onedp/generated_tests/test_ai_project_indexes_operations.py b/sdk/ai/azure-ai-projects-onedp/generated_tests/test_ai_project_indexes_operations.py index 9a9e4dc614a8..ce533ee305e8 100644 --- a/sdk/ai/azure-ai-projects-onedp/generated_tests/test_ai_project_indexes_operations.py +++ b/sdk/ai/azure-ai-projects-onedp/generated_tests/test_ai_project_indexes_operations.py @@ -56,28 +56,6 @@ def test_indexes_delete_version(self, aiproject_endpoint): # please add some check logic here by yourself # ... - @AIProjectPreparer() - @recorded_by_proxy - def test_indexes_create(self, aiproject_endpoint): - client = self.create_client(endpoint=aiproject_endpoint) - response = client.indexes.create( - name="str", - body={ - "connectionName": "str", - "indexName": "str", - "name": "str", - "type": "AzureSearch", - "version": "str", - "description": "str", - "id": "str", - "stage": "str", - "tags": {"str": "str"}, - }, - ) - - # please add some check logic here by yourself - # ... - @AIProjectPreparer() @recorded_by_proxy def test_indexes_create_version(self, aiproject_endpoint): diff --git a/sdk/ai/azure-ai-projects-onedp/generated_tests/test_ai_project_indexes_operations_async.py b/sdk/ai/azure-ai-projects-onedp/generated_tests/test_ai_project_indexes_operations_async.py index a54e2fedb856..c2e8e93d8684 100644 --- a/sdk/ai/azure-ai-projects-onedp/generated_tests/test_ai_project_indexes_operations_async.py +++ b/sdk/ai/azure-ai-projects-onedp/generated_tests/test_ai_project_indexes_operations_async.py @@ -57,28 +57,6 @@ async def test_indexes_delete_version(self, aiproject_endpoint): # please add some check logic here by yourself # ... - @AIProjectPreparer() - @recorded_by_proxy_async - async def test_indexes_create(self, aiproject_endpoint): - client = self.create_async_client(endpoint=aiproject_endpoint) - response = await client.indexes.create( - name="str", - body={ - "connectionName": "str", - "indexName": "str", - "name": "str", - "type": "AzureSearch", - "version": "str", - "description": "str", - "id": "str", - "stage": "str", - "tags": {"str": "str"}, - }, - ) - - # please add some check logic here by yourself - # ... - @AIProjectPreparer() @recorded_by_proxy_async async def test_indexes_create_version(self, aiproject_endpoint): diff --git a/sdk/ai/azure-ai-projects-onedp/generated_tests/test_ai_project_red_teams_operations.py b/sdk/ai/azure-ai-projects-onedp/generated_tests/test_ai_project_red_teams_operations.py index 2cab66d614b0..59f381b1ce3c 100644 --- a/sdk/ai/azure-ai-projects-onedp/generated_tests/test_ai_project_red_teams_operations.py +++ b/sdk/ai/azure-ai-projects-onedp/generated_tests/test_ai_project_red_teams_operations.py @@ -41,7 +41,6 @@ def test_red_teams_create_run(self, aiproject_endpoint): "attackStrategy": ["str"], "id": "str", "numTurns": 0, - "outputs": {"str": "str"}, "riskCategories": ["str"], "scanName": "str", "simulationOnly": bool, diff --git a/sdk/ai/azure-ai-projects-onedp/generated_tests/test_ai_project_red_teams_operations_async.py b/sdk/ai/azure-ai-projects-onedp/generated_tests/test_ai_project_red_teams_operations_async.py index 5b7e15d68800..5af2f7fc0d1b 100644 --- a/sdk/ai/azure-ai-projects-onedp/generated_tests/test_ai_project_red_teams_operations_async.py +++ b/sdk/ai/azure-ai-projects-onedp/generated_tests/test_ai_project_red_teams_operations_async.py @@ -42,7 +42,6 @@ async def test_red_teams_create_run(self, aiproject_endpoint): "attackStrategy": ["str"], "id": "str", "numTurns": 0, - "outputs": {"str": "str"}, "riskCategories": ["str"], "scanName": "str", "simulationOnly": bool, diff --git a/sdk/ai/azure-ai-projects-onedp/samples/connections/sample_connections.py b/sdk/ai/azure-ai-projects-onedp/samples/connections/sample_connections.py index 5e5a5133be38..88dc2fb12b57 100644 --- a/sdk/ai/azure-ai-projects-onedp/samples/connections/sample_connections.py +++ b/sdk/ai/azure-ai-projects-onedp/samples/connections/sample_connections.py @@ -32,6 +32,7 @@ # TODO: Remove console logging import sys import logging + logger = logging.getLogger("azure") logger.setLevel(logging.DEBUG) logger.addHandler(logging.StreamHandler(stream=sys.stdout)) @@ -42,16 +43,16 @@ with AIProjectClient( endpoint=endpoint, - #credential=DefaultAzureCredential(), + # credential=DefaultAzureCredential(), credential=AzureKeyCredential(os.environ["PROJECT_API_KEY"]), - logging_enable=True, # TODO: Remove console logging + logging_enable=True, # TODO: Remove console logging ) as project_client: print("List the properties of all connections:") connections = project_client.connections.list() for connection in connections: print(connection) - + print("List the properties of all connections of a particular type (in this case, Azure OpenAI connections):") connections = project_client.connections.list( connection_type=ConnectionType.AZURE_OPEN_AI, @@ -62,4 +63,3 @@ print(f"Get the properties of a connection named `{connection_name}`:") connection = project_client.connections.get(connection_name) print(connection) - diff --git a/sdk/ai/azure-ai-projects-onedp/samples/connections/sample_connections_async.py b/sdk/ai/azure-ai-projects-onedp/samples/connections/sample_connections_async.py index 3f08e72fd0e2..a60de6ffefe7 100644 --- a/sdk/ai/azure-ai-projects-onedp/samples/connections/sample_connections_async.py +++ b/sdk/ai/azure-ai-projects-onedp/samples/connections/sample_connections_async.py @@ -38,7 +38,7 @@ async def sample_connections_async() -> None: async with AIProjectClient( endpoint=endpoint, - #credential=DefaultAzureCredential(), + # credential=DefaultAzureCredential(), credential=AzureKeyCredential(os.environ["PROJECT_API_KEY"]), ) as project_client: diff --git a/sdk/ai/azure-ai-projects-onedp/samples/datasets/sample_datasets.py b/sdk/ai/azure-ai-projects-onedp/samples/datasets/sample_datasets.py index 3c36c0ae603c..ea37c3f4b42b 100644 --- a/sdk/ai/azure-ai-projects-onedp/samples/datasets/sample_datasets.py +++ b/sdk/ai/azure-ai-projects-onedp/samples/datasets/sample_datasets.py @@ -1,3 +1,4 @@ +# pylint: disable=line-too-long,useless-suppression # ------------------------------------ # Copyright (c) Microsoft Corporation. # Licensed under the MIT License. @@ -31,6 +32,7 @@ # TODO: Remove console logging import sys import logging + logger = logging.getLogger("azure") logger.setLevel(logging.DEBUG) logger.addHandler(logging.StreamHandler(stream=sys.stdout)) @@ -41,12 +43,14 @@ with AIProjectClient( endpoint=endpoint, - #credential=DefaultAzureCredential(), + # credential=DefaultAzureCredential(), credential=AzureKeyCredential(os.environ["PROJECT_API_KEY"]), - logging_enable=True, # TODO: Remove console logging + logging_enable=True, # TODO: Remove console logging ) as project_client: - - print("Upload a single file and create a new Dataset to reference the file. Here we explicitly specify the dataset version.") + + print( + "Upload a single file and create a new Dataset to reference the file. Here we explicitly specify the dataset version." + ) dataset: DatasetVersion = project_client.datasets.upload_file_and_create( name=dataset_name, version="1", diff --git a/sdk/ai/azure-ai-projects-onedp/samples/deployments/sample_deployments.py b/sdk/ai/azure-ai-projects-onedp/samples/deployments/sample_deployments.py index 48ada1e003ae..a311a0b2d458 100644 --- a/sdk/ai/azure-ai-projects-onedp/samples/deployments/sample_deployments.py +++ b/sdk/ai/azure-ai-projects-onedp/samples/deployments/sample_deployments.py @@ -30,6 +30,7 @@ # TODO: Remove console logging import sys import logging + logger = logging.getLogger("azure") logger.setLevel(logging.DEBUG) logger.addHandler(logging.StreamHandler(stream=sys.stdout)) @@ -41,9 +42,9 @@ with AIProjectClient( endpoint=endpoint, - #credential=DefaultAzureCredential(), + # credential=DefaultAzureCredential(), credential=AzureKeyCredential(os.environ["PROJECT_API_KEY"]), - logging_enable=True, # TODO: Remove console logging + logging_enable=True, # TODO: Remove console logging ) as project_client: print("List all deployments:") diff --git a/sdk/ai/azure-ai-projects-onedp/samples/deployments/sample_deployments_async.py b/sdk/ai/azure-ai-projects-onedp/samples/deployments/sample_deployments_async.py index 1c5d7367feca..feb8fcef5439 100644 --- a/sdk/ai/azure-ai-projects-onedp/samples/deployments/sample_deployments_async.py +++ b/sdk/ai/azure-ai-projects-onedp/samples/deployments/sample_deployments_async.py @@ -37,7 +37,7 @@ async def sample_deployments_async() -> None: async with AIProjectClient( endpoint=endpoint, - #credential=DefaultAzureCredential(), + # credential=DefaultAzureCredential(), credential=AzureKeyCredential(os.environ["PROJECT_API_KEY"]), ) as project_client: diff --git a/sdk/ai/azure-ai-projects-onedp/samples/indexes/sample_indexes.py b/sdk/ai/azure-ai-projects-onedp/samples/indexes/sample_indexes.py index 4f0e405df1d8..03d6d8a1268c 100644 --- a/sdk/ai/azure-ai-projects-onedp/samples/indexes/sample_indexes.py +++ b/sdk/ai/azure-ai-projects-onedp/samples/indexes/sample_indexes.py @@ -25,6 +25,7 @@ # TODO: Remove console logging import sys import logging + logger = logging.getLogger("azure") logger.setLevel(logging.DEBUG) logger.addHandler(logging.StreamHandler(stream=sys.stdout)) @@ -41,9 +42,9 @@ with AIProjectClient( endpoint=endpoint, - #credential=DefaultAzureCredential(), + # credential=DefaultAzureCredential(), credential=AzureKeyCredential(os.environ["PROJECT_API_KEY"]), - logging_enable=True, # TODO: Remove console logging + logging_enable=True, # TODO: Remove console logging ) as project_client: print(f"Listing all versions of the Index named `{index_name}`:") diff --git a/sdk/ai/azure-ai-projects-onedp/samples/telemetry/sample_telemetry.py b/sdk/ai/azure-ai-projects-onedp/samples/telemetry/sample_telemetry.py index cde9fcc9581e..a2ab2797f00b 100644 --- a/sdk/ai/azure-ai-projects-onedp/samples/telemetry/sample_telemetry.py +++ b/sdk/ai/azure-ai-projects-onedp/samples/telemetry/sample_telemetry.py @@ -29,6 +29,7 @@ # Start remove me -- logging import sys import logging + logger = logging.getLogger("azure") logger.setLevel(logging.DEBUG) logger.addHandler(logging.StreamHandler(stream=sys.stdout)) @@ -38,7 +39,7 @@ with AIProjectClient( endpoint=endpoint, - #credential=DefaultAzureCredential(), + # credential=DefaultAzureCredential(), credential=AzureKeyCredential(os.environ["PROJECT_API_KEY"]), logging_enable=True, ) as project_client: diff --git a/sdk/ai/azure-ai-projects-onedp/tsp-location.yaml b/sdk/ai/azure-ai-projects-onedp/tsp-location.yaml index a07898c9f4d3..9571cadb7f0e 100644 --- a/sdk/ai/azure-ai-projects-onedp/tsp-location.yaml +++ b/sdk/ai/azure-ai-projects-onedp/tsp-location.yaml @@ -1,4 +1,4 @@ directory: specification/ai/Azure.AI.Projects -commit: e0679682e1c4fc1ce3589ab85caad876bcfc7379 +commit: 926613d54831731cfd2cb744e36462e2a8dd6117 repo: Azure/azure-rest-api-specs additionalDirectories: From 286705a64c0ccc206ccd6798d93de0b9b46af47a Mon Sep 17 00:00:00 2001 From: Darren Cohen <39422044+dargilco@users.noreply.github.com> Date: Wed, 9 Apr 2025 16:53:02 -0700 Subject: [PATCH 2/5] Updates --- .../azure/ai/projects/onedp/_patch.py | 3 +- .../azure/ai/projects/onedp/aio/_patch.py | 3 +- .../projects/onedp/aio/operations/_patch.py | 108 ++++++++++++++---- .../ai/projects/onedp/operations/_patch.py | 101 ++++++++++++---- .../assistants/sample_get_assistant_client.py | 39 +++++++ .../sample_get_assistant_client_async.py | 50 ++++++++ .../samples/connections/sample_connections.py | 3 +- .../connections/sample_connections_async.py | 2 +- .../samples/datasets/sample_datasets.py | 3 +- .../samples/deployments/sample_deployments.py | 5 +- .../deployments/sample_deployments_async.py | 2 +- .../samples/indexes/sample_indexes.py | 3 +- .../inference/async_samples/sample1.png | Bin 0 -> 264509 bytes ...ns_with_azure_ai_inference_client_async.py | 59 ++++++++++ ...pletions_with_azure_openai_client_async.py | 70 ++++++++++++ ...gs_with_azure_ai_inference_client_async.py | 67 +++++++++++ ...gs_with_azure_ai_inference_client_async.py | 64 +++++++++++ .../samples/inference/sample1.png | Bin 0 -> 264509 bytes ...pletions_with_azure_ai_inference_client.py | 56 +++++++++ ...at_completions_with_azure_openai_client.py | 54 +++++++++ ...beddings_with_azure_ai_inference_client.py | 61 ++++++++++ ...beddings_with_azure_ai_inference_client.py | 58 ++++++++++ .../samples/telemetry/sample_telemetry.py | 3 +- 23 files changed, 752 insertions(+), 62 deletions(-) create mode 100644 sdk/ai/azure-ai-projects-onedp/samples/assistants/sample_get_assistant_client.py create mode 100644 sdk/ai/azure-ai-projects-onedp/samples/assistants/sample_get_assistant_client_async.py create mode 100644 sdk/ai/azure-ai-projects-onedp/samples/inference/async_samples/sample1.png create mode 100644 sdk/ai/azure-ai-projects-onedp/samples/inference/async_samples/sample_chat_completions_with_azure_ai_inference_client_async.py create mode 100644 sdk/ai/azure-ai-projects-onedp/samples/inference/async_samples/sample_chat_completions_with_azure_openai_client_async.py create mode 100644 sdk/ai/azure-ai-projects-onedp/samples/inference/async_samples/sample_image_embeddings_with_azure_ai_inference_client_async.py create mode 100644 sdk/ai/azure-ai-projects-onedp/samples/inference/async_samples/sample_text_embeddings_with_azure_ai_inference_client_async.py create mode 100644 sdk/ai/azure-ai-projects-onedp/samples/inference/sample1.png create mode 100644 sdk/ai/azure-ai-projects-onedp/samples/inference/sample_chat_completions_with_azure_ai_inference_client.py create mode 100644 sdk/ai/azure-ai-projects-onedp/samples/inference/sample_chat_completions_with_azure_openai_client.py create mode 100644 sdk/ai/azure-ai-projects-onedp/samples/inference/sample_image_embeddings_with_azure_ai_inference_client.py create mode 100644 sdk/ai/azure-ai-projects-onedp/samples/inference/sample_text_embeddings_with_azure_ai_inference_client.py diff --git a/sdk/ai/azure-ai-projects-onedp/azure/ai/projects/onedp/_patch.py b/sdk/ai/azure-ai-projects-onedp/azure/ai/projects/onedp/_patch.py index 25dde65497ad..e7188a84a7e0 100644 --- a/sdk/ai/azure-ai-projects-onedp/azure/ai/projects/onedp/_patch.py +++ b/sdk/ai/azure-ai-projects-onedp/azure/ai/projects/onedp/_patch.py @@ -9,7 +9,7 @@ from typing import List, Any, Union, Optional from azure.core.credentials import AzureKeyCredential from ._client import AIProjectClient as AIProjectClientGenerated -from .operations import TelemetryOperations, InferenceOperations +from .operations import TelemetryOperations, InferenceOperations, AssistantsOperations class AIProjectClient(AIProjectClientGenerated): # pylint: disable=too-many-instance-attributes @@ -49,6 +49,7 @@ def __init__(self, endpoint: str, credential: Union[AzureKeyCredential, "TokenCr super().__init__(endpoint=endpoint, credential=credential, **kwargs) self.telemetry = TelemetryOperations(self) self.inference = InferenceOperations(self) + self.assistants = AssistantsOperations(self) __all__: List[str] = ["AIProjectClient"] # Add all objects you want publicly available to users at this package level diff --git a/sdk/ai/azure-ai-projects-onedp/azure/ai/projects/onedp/aio/_patch.py b/sdk/ai/azure-ai-projects-onedp/azure/ai/projects/onedp/aio/_patch.py index 7574606e6a40..05df68fc47b3 100644 --- a/sdk/ai/azure-ai-projects-onedp/azure/ai/projects/onedp/aio/_patch.py +++ b/sdk/ai/azure-ai-projects-onedp/azure/ai/projects/onedp/aio/_patch.py @@ -9,7 +9,7 @@ from typing import List, Optional, Union, Any from azure.core.credentials import AzureKeyCredential from ._client import AIProjectClient as AIProjectClientGenerated -from .operations import InferenceOperations +from .operations import InferenceOperations, AssistantsOperations class AIProjectClient(AIProjectClientGenerated): # pylint: disable=too-many-instance-attributes @@ -50,6 +50,7 @@ def __init__( self._user_agent: Optional[str] = kwargs.get("user_agent", None) super().__init__(endpoint=endpoint, credential=credential, **kwargs) self.inference = InferenceOperations(self) + self.assistants = AssistantsOperations(self) __all__: List[str] = ["AIProjectClient"] # Add all objects you want publicly available to users at this package level diff --git a/sdk/ai/azure-ai-projects-onedp/azure/ai/projects/onedp/aio/operations/_patch.py b/sdk/ai/azure-ai-projects-onedp/azure/ai/projects/onedp/aio/operations/_patch.py index d5791550358e..f3ffa01e7856 100644 --- a/sdk/ai/azure-ai-projects-onedp/azure/ai/projects/onedp/aio/operations/_patch.py +++ b/sdk/ai/azure-ai-projects-onedp/azure/ai/projects/onedp/aio/operations/_patch.py @@ -13,6 +13,7 @@ from pathlib import Path from urllib.parse import urlparse from azure.storage.blob.aio import ContainerClient +from azure.core.exceptions import ResourceNotFoundError from azure.core.tracing.decorator_async import distributed_trace_async from azure.core.tracing.decorator import distributed_trace @@ -27,6 +28,57 @@ logger = logging.getLogger(__name__) +class AssistantsOperations: + + # TODO: Merge all code related to handling user-agent, into a single place. + def __init__(self, outer_instance: "AIProjectClient") -> None: + + # All returned inference clients will have this application id set on their user-agent. + # For more info on user-agent HTTP header, see: + # https://azure.github.io/azure-sdk/general_azurecore.html#telemetry-policy + USER_AGENT_APP_ID = "AIProjectClient" + + if hasattr(outer_instance, "_user_agent") and outer_instance._user_agent: + # If the calling application has set "user_agent" when constructing the AIProjectClient, + # take that value and prepend it to USER_AGENT_APP_ID. + self._user_agent = f"{outer_instance._user_agent}-{USER_AGENT_APP_ID}" + else: + self._user_agent = USER_AGENT_APP_ID + + self._outer_instance = outer_instance + + @distributed_trace + def get_client(self, **kwargs) -> "AssistantClient": + """Get an authenticated asynchronous AssistantClient (from the package azure-ai-assistants) to use with + your AI Foundry Project. Keyword arguments are passed to the constructor of + ChatCompletionsClient. + + .. note:: The package `azure-ai-assistants` must be installed prior to calling this method. + + :return: An authenticated Assistant Client. + :rtype: ~azure.ai.assistants.AssistantClient + + :raises ~azure.core.exceptions.ModuleNotFoundError: if the `azure-ai-assistants` package + is not installed. + :raises ~azure.core.exceptions.HttpResponseError: + """ + + try: + from azure.ai.assistants.aio import AssistantClient + except ModuleNotFoundError as e: + raise ModuleNotFoundError( + "Azure AI Assistant SDK is not installed. Please install it using 'pip install azure-ai-assistants'" + ) from e + + client = AssistantClient( + endpoint=self._outer_instance._config.endpoint, + credential=self._outer_instance._config.cedential, + user_agent=kwargs.pop("user_agent", self._user_agent), + **kwargs, + ) + + return client + class InferenceOperations: @@ -65,7 +117,7 @@ def _get_inference_url(cls, input_url: str) -> str: @distributed_trace def get_chat_completions_client(self, **kwargs) -> "ChatCompletionsClient": - """Get an authenticated ChatCompletionsClient (from the package azure-ai-inference) to use with + """Get an authenticated asynchronous ChatCompletionsClient (from the package azure-ai-inference) to use with AI models deployed to your AI Foundry Project. Keyword arguments are passed to the constructor of ChatCompletionsClient. @@ -88,7 +140,7 @@ def get_chat_completions_client(self, **kwargs) -> "ChatCompletionsClient": "Azure AI Inference SDK is not installed. Please install it using 'pip install azure-ai-inference'" ) from e - endpoint = self._get_inference_url(self._outer_instance._endpoint) + endpoint = self._get_inference_url(self._outer_instance._config.endpoint) # Older Inference SDK versions use ml.azure.com as the scope. Make sure to set the correct value here. This # is only relevent of course if EntraID auth is used. credential_scopes = ["https://cognitiveservices.azure.com/.default"] @@ -105,7 +157,7 @@ def get_chat_completions_client(self, **kwargs) -> "ChatCompletionsClient": @distributed_trace def get_embeddings_client(self, **kwargs) -> "EmbeddingsClient": - """Get an authenticated EmbeddingsClient (from the package azure-ai-inference) to use with + """Get an authenticated asynchronous EmbeddingsClient (from the package azure-ai-inference) to use with AI models deployed to your AI Foundry Project. Keyword arguments are passed to the constructor of ChatCompletionsClient. @@ -128,7 +180,7 @@ def get_embeddings_client(self, **kwargs) -> "EmbeddingsClient": "Azure AI Inference SDK is not installed. Please install it using 'pip install azure-ai-inference'" ) from e - endpoint = self._get_inference_url(self._outer_instance._endpoint) + endpoint = self._get_inference_url(self._outer_instance._config.endpoint) # Older Inference SDK versions use ml.azure.com as the scope. Make sure to set the correct value here. This # is only relevent of course if EntraID auth is used. credential_scopes = ["https://cognitiveservices.azure.com/.default"] @@ -145,7 +197,7 @@ def get_embeddings_client(self, **kwargs) -> "EmbeddingsClient": @distributed_trace def get_image_embeddings_client(self, **kwargs) -> "ImageEmbeddingsClient": - """Get an authenticated ImageEmbeddingsClient (from the package azure-ai-inference) to use with + """Get an authenticated asynchronous ImageEmbeddingsClient (from the package azure-ai-inference) to use with AI models deployed to your AI Foundry Project. Keyword arguments are passed to the constructor of ChatCompletionsClient. @@ -168,7 +220,7 @@ def get_image_embeddings_client(self, **kwargs) -> "ImageEmbeddingsClient": "Azure AI Inference SDK is not installed. Please install it using 'pip install azure-ai-inference'" ) from e - endpoint = self._get_inference_url(self._outer_instance._endpoint) + endpoint = self._get_inference_url(self._outer_instance._config.endpoint) # Older Inference SDK versions use ml.azure.com as the scope. Make sure to set the correct value here. This # is only relevent of course if EntraID auth is used. credential_scopes = ["https://cognitiveservices.azure.com/.default"] @@ -225,24 +277,29 @@ async def get_azure_openai_client( if connection_name: connection = await self._outer_instance.connections.get(name=connection_name, **kwargs) else: - connection = await self._outer_instance.connections.get_default( - connection_type=ConnectionType.AZURE_OPEN_AI, **kwargs + # If connection name was not specified, get the default Azure OpenAI connection. + connections = await self._outer_instance.connections.list( + connection_type=ConnectionType.AZURE_OPEN_AI, + default_connection=True, + **kwargs ) - logger.debug("[InferenceOperations.get_azure_openai_client] connection = %s", str(connection)) + connection = next(iter(connections), None) + if not connection: + raise ResourceNotFoundError("No default Azure OpenAI connection found.") + connection_name = connection.name + + # If the connection uses API key authentication, we need to make another service call to get + # the connection with API key populated. + if connection.auth_type == AuthenticationType.API_KEY: + connection = await self._outer_instance.connections.get_with_credentials(name=connection_name, **kwargs) + + logger.debug("[InferenceOperations.get_azure_openai_client] connection = %s", str(connection)) azure_endpoint = connection.target[:-1] if connection.target.endswith("/") else connection.target if connection.auth_type == AuthenticationType.API_KEY: - # For api-key authentication, we need to make another service call to get the connection with credentials. - connection_with_credentials = self._outer_instance.connections.get_with_credentials( - name=connection.name, **kwargs - ) - - api_key: Optional[str] = None - if hasattr(connection_with_credentials.properties, "credentials"): - if hasattr(connection_with_credentials.properties.credentials, "key"): # type: ignore - api_key = connection_with_credentials.properties.credentials.key # type: ignore + api_key = connection.credentials.key logger.debug( "[InferenceOperations.get_azure_openai_client] Creating AzureOpenAI using API key authentication" @@ -252,7 +309,7 @@ async def get_azure_openai_client( elif connection.auth_type == AuthenticationType.ENTRA_ID: logger.debug( - "[InferenceOperations.get_azure_openai_client] " + "Creating AzureOpenAI using Entra ID authentication" + "[InferenceOperations.get_azure_openai_client] Creating AzureOpenAI using Entra ID authentication" ) try: @@ -359,7 +416,7 @@ async def _create_dataset_and_get_its_container_client( ) async def upload_file_and_create( - self, *, name: str, version: Optional[str] = None, file: str, **kwargs: Any + self, *, name: str, version: str, file: str, **kwargs: Any ) -> DatasetVersion: """Upload file to a blob storage, and create a dataset that references this file. This method uses the `ContainerClient.upload_blob` method from the azure-storage-blob package @@ -367,8 +424,8 @@ async def upload_file_and_create( :param name: The name of the dataset. Required. :type name: str - :param version: The version identifier for the dataset. Optional. - :type version: str or None + :param version: The version identifier for the dataset. Required. + :type version: str :param file: The file name (including optional path) to be uploaded. Required. :type file: str :return: The created dataset version. @@ -417,7 +474,7 @@ async def upload_file_and_create( return dataset_version async def upload_folder_and_create( - self, *, name: str, version: Optional[str] = None, folder: str, **kwargs: Any + self, *, name: str, version: str, folder: str, **kwargs: Any ) -> DatasetVersion: """Upload all files in a folder and its sub folders to a blob storage, while maintaining relative paths, and create a dataset that references this folder. @@ -426,8 +483,8 @@ async def upload_folder_and_create( :param name: The name of the dataset. Required. :type name: str - :param version: The version identifier for the dataset. Optional. - :type version: str or None + :param version: The version identifier for the dataset. Required. + :type version: str :param folder: The folder name (including optional path) to be uploaded. Required. :type file: str :return: The created dataset version. @@ -485,6 +542,7 @@ async def upload_folder_and_create( __all__: List[str] = [ "InferenceOperations", "DatasetsOperations", + "AssistantsOperations", ] # Add all objects you want publicly available to users at this package level diff --git a/sdk/ai/azure-ai-projects-onedp/azure/ai/projects/onedp/operations/_patch.py b/sdk/ai/azure-ai-projects-onedp/azure/ai/projects/onedp/operations/_patch.py index 62bf93321af8..237a08666265 100644 --- a/sdk/ai/azure-ai-projects-onedp/azure/ai/projects/onedp/operations/_patch.py +++ b/sdk/ai/azure-ai-projects-onedp/azure/ai/projects/onedp/operations/_patch.py @@ -25,6 +25,57 @@ logger = logging.getLogger(__name__) +class AssistantsOperations: + + # TODO: Merge all code related to handling user-agent, into a single place. + def __init__(self, outer_instance: "AIProjectClient") -> None: + + # All returned inference clients will have this application id set on their user-agent. + # For more info on user-agent HTTP header, see: + # https://azure.github.io/azure-sdk/general_azurecore.html#telemetry-policy + USER_AGENT_APP_ID = "AIProjectClient" + + if hasattr(outer_instance, "_user_agent") and outer_instance._user_agent: + # If the calling application has set "user_agent" when constructing the AIProjectClient, + # take that value and prepend it to USER_AGENT_APP_ID. + self._user_agent = f"{outer_instance._user_agent}-{USER_AGENT_APP_ID}" + else: + self._user_agent = USER_AGENT_APP_ID + + self._outer_instance = outer_instance + + @distributed_trace + def get_client(self, **kwargs) -> "AssistantClient": + """Get an authenticated AssistantClient (from the package azure-ai-assistants) to use with + your AI Foundry Project. Keyword arguments are passed to the constructor of + ChatCompletionsClient. + + .. note:: The package `azure-ai-assistants` must be installed prior to calling this method. + + :return: An authenticated Assistant Client. + :rtype: ~azure.ai.assistants.AssistantClient + + :raises ~azure.core.exceptions.ModuleNotFoundError: if the `azure-ai-assistants` package + is not installed. + :raises ~azure.core.exceptions.HttpResponseError: + """ + + try: + from azure.ai.assistants import AssistantClient + except ModuleNotFoundError as e: + raise ModuleNotFoundError( + "Azure AI Assistant SDK is not installed. Please install it using 'pip install azure-ai-assistants'" + ) from e + + client = AssistantClient( + endpoint=self._outer_instance._config.endpoint, + credential=self._outer_instance._config.cedential, + user_agent=kwargs.pop("user_agent", self._user_agent), + **kwargs, + ) + + return client + class InferenceOperations: @@ -83,7 +134,7 @@ def get_chat_completions_client(self, **kwargs) -> "ChatCompletionsClient": "Azure AI Inference SDK is not installed. Please install it using 'pip install azure-ai-inference'" ) from e - endpoint = self._get_inference_url(self._outer_instance._endpoint) + endpoint = self._get_inference_url(self._outer_instance._config.endpoint) # Older Inference SDK versions use ml.azure.com as the scope. Make sure to set the correct value here. This # is only relevent of course if EntraID auth is used. credential_scopes = ["https://cognitiveservices.azure.com/.default"] @@ -123,7 +174,7 @@ def get_embeddings_client(self, **kwargs) -> "EmbeddingsClient": "Azure AI Inference SDK is not installed. Please install it using 'pip install azure-ai-inference'" ) from e - endpoint = self._get_inference_url(self._outer_instance._endpoint) + endpoint = self._get_inference_url(self._outer_instance._config.endpoint) # Older Inference SDK versions use ml.azure.com as the scope. Make sure to set the correct value here. This # is only relevent of course if EntraID auth is used. credential_scopes = ["https://cognitiveservices.azure.com/.default"] @@ -163,7 +214,7 @@ def get_image_embeddings_client(self, **kwargs) -> "ImageEmbeddingsClient": "Azure AI Inference SDK is not installed. Please install it using 'pip install azure-ai-inference'" ) from e - endpoint = self._get_inference_url(self._outer_instance._endpoint) + endpoint = self._get_inference_url(self._outer_instance._config.endpoint) # Older Inference SDK versions use ml.azure.com as the scope. Make sure to set the correct value here. This # is only relevent of course if EntraID auth is used. credential_scopes = ["https://cognitiveservices.azure.com/.default"] @@ -220,24 +271,29 @@ def get_azure_openai_client( if connection_name: connection = self._outer_instance.connections.get(name=connection_name, **kwargs) else: - connection = self._outer_instance.connections.get_default( - connection_type=ConnectionType.AZURE_OPEN_AI, **kwargs + # If connection name was not specified, get the default Azure OpenAI connection. + connections = self._outer_instance.connections.list( + connection_type=ConnectionType.AZURE_OPEN_AI, + default_connection=True, + **kwargs ) - logger.debug("[InferenceOperations.get_azure_openai_client] connection = %s", str(connection)) + connection = next(iter(connections), None) + if not connection: + raise ResourceNotFoundError("No default Azure OpenAI connection found.") + connection_name = connection.name + + # If the connection uses API key authentication, we need to make another service call to get + # the connection with API key populated. + if connection.auth_type == AuthenticationType.API_KEY: + connection = self._outer_instance.connections.get_with_credentials(name=connection_name, **kwargs) + + logger.debug("[InferenceOperations.get_azure_openai_client] connection = %s", str(connection)) azure_endpoint = connection.target[:-1] if connection.target.endswith("/") else connection.target if connection.auth_type == AuthenticationType.API_KEY: - # For api-key authentication, we need to make another service call to get the connection with credentials. - connection_with_credentials = self._outer_instance.connections.get_with_credentials( - name=connection.name, **kwargs - ) - - api_key: Optional[str] = None - if hasattr(connection_with_credentials.properties, "credentials"): - if hasattr(connection_with_credentials.properties.credentials, "key"): # type: ignore - api_key = connection_with_credentials.properties.credentials.key # type: ignore + api_key = connection.credentials.key logger.debug( "[InferenceOperations.get_azure_openai_client] Creating AzureOpenAI using API key authentication" @@ -247,7 +303,7 @@ def get_azure_openai_client( elif connection.auth_type == AuthenticationType.ENTRA_ID: logger.debug( - "[InferenceOperations.get_azure_openai_client] " + "Creating AzureOpenAI using Entra ID authentication" + "[InferenceOperations.get_azure_openai_client] Creating AzureOpenAI using Entra ID authentication" ) try: @@ -388,7 +444,7 @@ def _create_dataset_and_get_its_container_client( ) def upload_file_and_create( - self, *, name: str, version: Optional[str] = None, file: str, **kwargs: Any + self, *, name: str, version: str, file: str, **kwargs: Any ) -> DatasetVersion: """Upload file to a blob storage, and create a dataset that references this file. This method uses the `ContainerClient.upload_blob` method from the azure-storage-blob package @@ -396,8 +452,8 @@ def upload_file_and_create( :param name: The name of the dataset. Required. :type name: str - :param version: The version identifier for the dataset. Optional. - :type version: str or None + :param version: The version identifier for the dataset. Required. + :type version: str :param file: The file name (including optional path) to be uploaded. Required. :type file: str :return: The created dataset version. @@ -446,7 +502,7 @@ def upload_file_and_create( return dataset_version def upload_folder_and_create( - self, *, name: str, version: Optional[str] = None, folder: str, **kwargs: Any + self, *, name: str, version: str, folder: str, **kwargs: Any ) -> DatasetVersion: """Upload all files in a folder and its sub folders to a blob storage, while maintaining relative paths, and create a dataset that references this folder. @@ -455,8 +511,8 @@ def upload_folder_and_create( :param name: The name of the dataset. Required. :type name: str - :param version: The version identifier for the dataset. Optional. - :type version: str or None + :param version: The version identifier for the dataset. Required. + :type version: str :param folder: The folder name (including optional path) to be uploaded. Required. :type file: str :return: The created dataset version. @@ -513,6 +569,7 @@ def upload_folder_and_create( "InferenceOperations", "TelemetryOperations", "DatasetsOperations", + "AssistantsOperations", ] # Add all objects you want publicly available to users at this package level diff --git a/sdk/ai/azure-ai-projects-onedp/samples/assistants/sample_get_assistant_client.py b/sdk/ai/azure-ai-projects-onedp/samples/assistants/sample_get_assistant_client.py new file mode 100644 index 000000000000..c216c2fcfeda --- /dev/null +++ b/sdk/ai/azure-ai-projects-onedp/samples/assistants/sample_get_assistant_client.py @@ -0,0 +1,39 @@ +# ------------------------------------ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. +# ------------------------------------ + +""" +DESCRIPTION: + Given an AIProjectClient, this sample demonstrates how to get an authenticated + AssistantClient from the azure.ai.assistants package. For more information on + the azure.ai.assistants package see https://pypi.org/project/azure-ai-assistants/. + +USAGE: + python sample_get_assistant_client.py + + Before running the sample: + + pip install azure-ai-projects azure-ai-assistants azure-identity + + Set this environment variables with your own values: + 1) PROJECT_ENDPOINT - The Azure AI Project endpoint, as found in the overview page of your + Azure AI Foundry project. +""" + +import os +from azure.core.credentials import AzureKeyCredential # TODO: Remove me when EntraID is supported # TODO: Remove me when EntraID is supported +from azure.identity import DefaultAzureCredential +from azure.ai.projects.onedp import AIProjectClient + +endpoint = os.environ["PROJECT_ENDPOINT"] + +with AIProjectClient( + endpoint=endpoint, + # credential=DefaultAzureCredential(), + credential=AzureKeyCredential(os.environ["PROJECT_API_KEY"]), + logging_enable=True, # TODO: Remove console logging +) as project_client: + + with project_client.assistants.get_client() as client: + pass \ No newline at end of file diff --git a/sdk/ai/azure-ai-projects-onedp/samples/assistants/sample_get_assistant_client_async.py b/sdk/ai/azure-ai-projects-onedp/samples/assistants/sample_get_assistant_client_async.py new file mode 100644 index 000000000000..29737b678c5d --- /dev/null +++ b/sdk/ai/azure-ai-projects-onedp/samples/assistants/sample_get_assistant_client_async.py @@ -0,0 +1,50 @@ +# ------------------------------------ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. +# ------------------------------------ + +""" +DESCRIPTION: + Given an AIProjectClient, this sample demonstrates how to get an authenticated + asynchronous AssistantClient from the azure.ai.assistants package. For more information on + the azure.ai.assistants package see https://pypi.org/project/azure-ai-assistants/. + +USAGE: + python sample_get_assistant_client_async.py + + Before running the sample: + + pip install azure-ai-projects azure-ai-assistants aiohttp azure-identity + + Set this environment variables with your own values: + 1) PROJECT_ENDPOINT - The Azure AI Project endpoint, as found in the overview page of your + Azure AI Foundry project. +""" + +import os +import asyncio +from azure.core.credentials import AzureKeyCredential # TODO: Remove me when EntraID is supported # TODO: Remove me when EntraID is supported +from azure.identity import DefaultAzureCredential +from azure.ai.projects.onedp.aio import AIProjectClient + +async def sample_get_assistant_client_async(): + + endpoint = os.environ["PROJECT_ENDPOINT"] + + async with AIProjectClient( + endpoint=endpoint, + # credential=DefaultAzureCredential(), + credential=AzureKeyCredential(os.environ["PROJECT_API_KEY"]), + logging_enable=True, # TODO: Remove console logging + ) as project_client: + + with project_client.assistants.get_client() as client: + pass + + +async def main(): + await sample_get_assistant_client_async() + + +if __name__ == "__main__": + asyncio.run(main()) \ No newline at end of file diff --git a/sdk/ai/azure-ai-projects-onedp/samples/connections/sample_connections.py b/sdk/ai/azure-ai-projects-onedp/samples/connections/sample_connections.py index 88dc2fb12b57..8543383a991c 100644 --- a/sdk/ai/azure-ai-projects-onedp/samples/connections/sample_connections.py +++ b/sdk/ai/azure-ai-projects-onedp/samples/connections/sample_connections.py @@ -25,14 +25,13 @@ import os from azure.identity import DefaultAzureCredential -from azure.core.credentials import AzureKeyCredential +from azure.core.credentials import AzureKeyCredential # TODO: Remove me when EntraID is supported from azure.ai.projects.onedp import AIProjectClient from azure.ai.projects.onedp.models import ConnectionType # TODO: Remove console logging import sys import logging - logger = logging.getLogger("azure") logger.setLevel(logging.DEBUG) logger.addHandler(logging.StreamHandler(stream=sys.stdout)) diff --git a/sdk/ai/azure-ai-projects-onedp/samples/connections/sample_connections_async.py b/sdk/ai/azure-ai-projects-onedp/samples/connections/sample_connections_async.py index a60de6ffefe7..cb1b6715ec74 100644 --- a/sdk/ai/azure-ai-projects-onedp/samples/connections/sample_connections_async.py +++ b/sdk/ai/azure-ai-projects-onedp/samples/connections/sample_connections_async.py @@ -26,7 +26,7 @@ import asyncio import os from azure.identity.aio import DefaultAzureCredential -from azure.core.credentials import AzureKeyCredential +from azure.core.credentials import AzureKeyCredential # TODO: Remove me when EntraID is supported from azure.ai.projects.onedp.aio import AIProjectClient from azure.ai.projects.onedp.models import ConnectionType diff --git a/sdk/ai/azure-ai-projects-onedp/samples/datasets/sample_datasets.py b/sdk/ai/azure-ai-projects-onedp/samples/datasets/sample_datasets.py index ea37c3f4b42b..5c85c4a50fb9 100644 --- a/sdk/ai/azure-ai-projects-onedp/samples/datasets/sample_datasets.py +++ b/sdk/ai/azure-ai-projects-onedp/samples/datasets/sample_datasets.py @@ -25,14 +25,13 @@ import os from azure.identity import DefaultAzureCredential -from azure.core.credentials import AzureKeyCredential +from azure.core.credentials import AzureKeyCredential # TODO: Remove me when EntraID is supported from azure.ai.projects.onedp import AIProjectClient from azure.ai.projects.onedp.models import DatasetVersion, ListViewType # TODO: Remove console logging import sys import logging - logger = logging.getLogger("azure") logger.setLevel(logging.DEBUG) logger.addHandler(logging.StreamHandler(stream=sys.stdout)) diff --git a/sdk/ai/azure-ai-projects-onedp/samples/deployments/sample_deployments.py b/sdk/ai/azure-ai-projects-onedp/samples/deployments/sample_deployments.py index a311a0b2d458..2f65858dc4b8 100644 --- a/sdk/ai/azure-ai-projects-onedp/samples/deployments/sample_deployments.py +++ b/sdk/ai/azure-ai-projects-onedp/samples/deployments/sample_deployments.py @@ -24,13 +24,12 @@ import os from azure.identity import DefaultAzureCredential -from azure.core.credentials import AzureKeyCredential +from azure.core.credentials import AzureKeyCredential # TODO: Remove me when EntraID is supported from azure.ai.projects.onedp import AIProjectClient # TODO: Remove console logging import sys import logging - logger = logging.getLogger("azure") logger.setLevel(logging.DEBUG) logger.addHandler(logging.StreamHandler(stream=sys.stdout)) @@ -44,7 +43,7 @@ endpoint=endpoint, # credential=DefaultAzureCredential(), credential=AzureKeyCredential(os.environ["PROJECT_API_KEY"]), - logging_enable=True, # TODO: Remove console logging + logging_enable=True, # TODO: Remove console logging ) as project_client: print("List all deployments:") diff --git a/sdk/ai/azure-ai-projects-onedp/samples/deployments/sample_deployments_async.py b/sdk/ai/azure-ai-projects-onedp/samples/deployments/sample_deployments_async.py index feb8fcef5439..22db6f69c70a 100644 --- a/sdk/ai/azure-ai-projects-onedp/samples/deployments/sample_deployments_async.py +++ b/sdk/ai/azure-ai-projects-onedp/samples/deployments/sample_deployments_async.py @@ -25,7 +25,7 @@ import asyncio import os from azure.identity.aio import DefaultAzureCredential -from azure.core.credentials import AzureKeyCredential +from azure.core.credentials import AzureKeyCredential # TODO: Remove me when EntraID is supported from azure.ai.projects.onedp.aio import AIProjectClient diff --git a/sdk/ai/azure-ai-projects-onedp/samples/indexes/sample_indexes.py b/sdk/ai/azure-ai-projects-onedp/samples/indexes/sample_indexes.py index 03d6d8a1268c..b5b6073fd9e2 100644 --- a/sdk/ai/azure-ai-projects-onedp/samples/indexes/sample_indexes.py +++ b/sdk/ai/azure-ai-projects-onedp/samples/indexes/sample_indexes.py @@ -25,7 +25,6 @@ # TODO: Remove console logging import sys import logging - logger = logging.getLogger("azure") logger.setLevel(logging.DEBUG) logger.addHandler(logging.StreamHandler(stream=sys.stdout)) @@ -34,7 +33,7 @@ import os from azure.identity import DefaultAzureCredential -from azure.core.credentials import AzureKeyCredential +from azure.core.credentials import AzureKeyCredential # TODO: Remove me when EntraID is supported from azure.ai.projects.onedp import AIProjectClient endpoint = os.environ["PROJECT_ENDPOINT"] diff --git a/sdk/ai/azure-ai-projects-onedp/samples/inference/async_samples/sample1.png b/sdk/ai/azure-ai-projects-onedp/samples/inference/async_samples/sample1.png new file mode 100644 index 0000000000000000000000000000000000000000..59d79ff28fc57923898ff20a911afde70994fc6e GIT binary patch literal 264509 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 z z93!}zHbduOJxOlat;QtqJ8n{lu~u?`_a->@F(m;&F1U%|67a1<8;t&k-*~g!#F#b! zi(Cw!W$TnMFhr=)!BnfWFB~mD`E%d5{MfJij^*$)_$P>y0ZoQ7crXT&na>7)`#MQV zzj#xgAyQ!P`3++0=kR}=>Uzw!$_3cr;!Moi@~8fz?d4zn5093+lTRcsH?&&K{bLtbQFyI2T@ZK@^o<@MXU<>Jc3It%ltqR=_P&uny-v)_-LC}Wa83}Lt!S`|dPQ8^2|b8qer$Yz{- zC%GX!LG@7_Ndxqpo6>3ezA&ym4w;P!xXmiN#A@Vt-pLT&uZBN#avqOlopg#mGS;gj z^~ugOAj=;eX4@v?9a7r+7O@1$=AF1U%~$RZ56nOxhcZFoJneHCTFuiSoL6)!?KRK{ zLJ|(`o1}>TQvnHV336AtY~T5BoJX!f&(Ic(oQ$p2LxEk+c?I(%Amf01qAMP;e}Yaz zK>r0#XXoe9XFMEROAlR7&k)wJ!V=jiU!z-`9safgk^Z$!KefS^`0G;zxu3IB4j0^M zdy+CfBz`8}`KgihP%H$-gTl-wHK>+R5B+*1=fL4!)eE2QC#$7T;H!N=#a!z?PZC|e zohN$&ZQ8adQFORf>Nx)N+iL74DaBiI!+yboT|xux-`(FP;Ml-RCxmFtb+1ZR1ooH+uC1ZFyvi*R?v3J4=@DQt>M^u8*TF3Y{ae5K zx#idY+%H?cVyrzEa8G^SJFr)A;gRFL*V%k=eE8}hqd5Cq19$h0|EOk-g*I=?hO+1FN5P#mfe!xumj=-e5i6TYmoWQ_Jgz^JMVzf|Jhvl>sK8 z_tK_7n7#(KI`wSDBfHXTXD2tqj{Zlsn?=PA47~*w7MZ$?llIEaz2*G<7ky@bYz?RS zuH{taQWKrXIvwjHvdMzF;$6<)+$1{=eDt03)hFXihRovk&U|GQ2+9WXtwKpb*p`A*>tfZD; zS1^*c$SJ2qKG2_iWm~JCxo+eb>o&n!=oJ)e7iY*%1$1zdd4lOkNjYs=>wqm#CAH!A zcI?J(&TH3%vl;IvSJR)Dp?I3X`MxYA=Q~{J`oPOZ)+y)SI_n%`Kg}nwag^NxGrI`x znPeAIVxD9w*R!o?2ddiNTu`4AxoBlHcuk-&I>Jv2{@6DakkR!DY(E7!)y<8)pTIJ< zIz6y+oHm)0^mXBzG}uS9PfjZPmgTjCEdA9sygVJkt~YZ}zmgaZ+sNR+kBG!eZ!vCnTWIB*q=Vym_P1VAKNm=KvN(pEcq_t z=hzQJBnC$2UgZt#C?aAoZgzUv@qlz1`gOyQ{1?I?nh0aEp)m-#g%UUs%C%&eEJBH= znQ)j@cjn{(q6^13c za;Lyz`fu4ul_J04utvWHG<%H&hQn8?gF-5@b*61_BCLX<(mm~o7?rSEO3eNG z(s#$}a?CYoDr4hpax(YmYhdc@S3?(lP9UQ+nB(Y0K5|VJWCNGCaWNEK0WHRHjcBhf zFT;nMwt12ol_kA+9WKyB?5BwwFx%{f1{@&&N z4^B5c7XXId!KY3jaBfEiCVR)bQ6M;zj~?6XJ)R4i@$`DMvoVeoe4P65Gmd;4?#AF^ z(3YG}-{jY;UcJNpKm3bV%YXfUf4}_YZ|p4J`0z~}%FNbnupFD|B^RC-_dfH!#x-)h zA3TkdAA}EGYBr8_eOzvpk1A4jFw>>(fq-o20DnaEHKaLs8=bJY5@# o{nZaq4OA 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 rH{nuGvleMr zJ?d87^mYkB@SMN?PG7V%6;N(!HHG1cuEWUtdwb&`3{%fhMS+DA(IJiq&+Yy5IFFE; z$=s{~WfQR`TvDgJV3`roxiKjH?T|$9r$zm;EKWpVCMX(kPP$1^XgIf`G`1C{4{lCQ zPOCJ$S`i+=K`6{jhcgU#ad|dwI~3xrclYD$Zfm@IJQ&xB-idiQq((j#rcBON;{E!L zc8%2YeMVzBa}TWQ^I4>MesR`w235Z6bMc;z`mM0vaLHg&5}eH%_|QozuM^lB?J|T6 zb_6irn~GmX@Mg9%nE4Lw&V-K{W<`{H_ zeNLXseNIAPUhXW($QRZq^&0im(^O=HeTk0}GbaTwzsCR_?vMZU51z(vee->XtvX3E zbyr#Bc{o`y*Fc0HBX9DS_d)FJt&d;$g*W4)uN{ux{7=3;Rz5x%|H?=EV=WQRGb116 zA_`*Er%{PqF0WO|S*x2fiX1QF*UA4#5O{OWuk%wGnVd*LbkS6Hh(0Mi&)G}TLY~{> z9;q5tBO?nV?)R*A@o4^Y=5V>^mjz~9ZKq`-Cw__C1IT)Kd@Ve@eR(lH{N4}7N8kGH zSbzI&++Hqr)=WM4eJWl2m8S!M@ok&f;C~T*d6~6N>-ME5Q;a_RGX`WxnNAu8Mg*QN zGxrAW;D?cu9TW+gIHp|JZHJaOfoC~Ji?=(uEIPXmLuDa6k%K;!d8Jckw#|;Ar>QFe zTKX~P6h$Hv)Epe`_d4CixY4~LIbix>QX1W%JoxMcN{8e} zZH2i=f4TSV`Z{&&^qg z!&aNYz8P*X-)Qc0FSx~_GO@~8dyk0vWRI54VM_ToulL7SKl)(2dUF&$TI)O~&)fT6 z0H<%wL`283A9zEZ(FJQ|4ADDeEyt7rgAfY3j!8wSW^Q^lYCV@2_A2#s&>CA4xkSn$ zF3*~HqvKNKcI^qwiR2JwCBH>?YeiruIfS5?{W?NpJs=Y=DAMgAj%WX zCwk01JoICaIYv0&Yuuxty~BKWdyf00$1RJoC`io2=#?qM*ce>jwc#vrN+1M?aHKtg zhq9h$NE=zF-Q`R7d7_*m6D=4KiVMT3t100ym~s>VVPinSDi;X6rxZ1#KN zsqp7Iul8Wy7!$8_3X$x{gd1$n<22Fx<#oL9!nmGD!B|;5WDLQ$-%Tapy#p8=?%;*f zLU6#^wW=3q6%^}s3Cd=ah|CGbLQhe?<$vZ$n8Zjx?5^eab0P{uGE!-H!Zn7dTe>Ea zyja=qTjOfD(-SJlmaWtr{JEZ@Gfht_^BWE3vFJH|P5BbAXD*kX>Tm{+&fKWN$h|OY zzE6XX-@pXNjGcF5i;BrZ`Kbml3Wf2jac8(0$9yKLe-Y!|G5HwqRpWE;*{D39{hnun zJJ)y|Enu-iT3M3mzF)4j2BXq~V}xcxT{Ui$b68#n&evlQ-M% z3dY3Ia{mAZ;Ob#*9AA--@Lu4p(hEP;0WNHLgn7>~3` z7q$%LpFi!*rNem!v!_=a1<&KtZZTXwhE8Q-bb{ZxiHlv<1OyCxoC>YK&59YkPO>GQf)fj1H^}<}BU=i;T}4>SceX!IaWBRG@ur)X9j` z;vNdytG%<@W1HG$%EB33dXI@ddGS^CcJz?dVr&jQr>$n5LTmV+`rU9v=!I_S`_vm8 zjo7=}tB?gPV~f%+aFpF2^)UK0I7cfT_WT^OO8*1S_BID%_G!Lz-di`VP}-~Ac)SaJ zAFOJ+iOx>_oZ`TApWnyFUqsjLv|s4VexortB}w>$i%vLZR2qX2 zuY@7BalWzUo2$7meH%$fqfsOugdphQ$oBantgrIDbIxu5X;Q5Yq5!@Dk6`b~pL1D<(zMKSM z4Ju_b6+NOZN@Cue2xsPE*LbHL3{DuN8q;tYn1M6vlrgZz@zlQS7;fQ_cXD9r@*EEg zVcM@;tASU?=1z?y+;&o17`QXtQy$Yho8F>q%4pWna+IQw(|xp3Cp<|_X{$@u0#6Nd z1W6hl6ZEx|DO&-K(lS}a_$+0nPw+2N79ofVIRagGs_!x{m?<=oK9j0H@Un#9(&`C1 zgRtNU8Js#F!Gj4wghS2pC9lBH~5YaFK5s<-M#n@KGCsBYikiy<6+X)X5BYE7K1&{@V4lk0nhbL zHi{x%+i-10?TzxkbOvHfJ=3xGT+4TnKIh>@lrP03-Toqle(1lGC_X2L#4Px9qW#zR*>9cJ=fIx+Q936V_i_60Okkyi^9+1cVQGu}1W(=3 zF>-1SiZ%C?)*t)1H;E>^yZU+jC;zwK8=wEDe>i^rMVz{;^9XJDCrVY+P9fn%XP7Mh zYm~Cz9MABdrDL3NjwU^Xzo+Dda`=03&MWg=9+Tor`p*N;&d=17b9qk{HR$C{VK8!lrA&@8+bUL{ZFx8O_ow3;X= zOIdrAC!&qq(J|;Kb4d>v-lJa{yhNY$Uf=>l3Wb;Al*gc;DH`K@^2Pzj3nr6w7JT?a zN|~OaqbYYhqMuOI@#_dC(dHO5aLElg_kAf_bjNbf1(bttG^Bf7Ba@tY&f(?xd3i`i zQM+`ciQLsCsmD5Tkv9IB!w_?5VQXivDR6j$e*JgQ&-yQVrsuur>M}-p4w=l1D&ueH z(6EC(p@n{NLK~>19{s=%^cn}s%X-YJM@Kx<7og?T|2_ae!KX|I?n4Jo)~navT|WcD zNlWvUwyTrD1fI`6dsk=OEPSsMH>632dbfv2-LrTGec5LG;ty@QXWf+VR2G>T%;Q~hYo8R`jz?~@Q zsmP}BUg>Uon3r<^p(as@UJ$!cZ2(534l|@J4n|YEVc?~~zz`ZjbRH>Z#YBqpbA}B8 z(q{SzJ_OM=0odX21SjeyxC8gIV8^)Z_hp)H2vmv-&&oktY1M-x9HCj)fX67Pz$aV7> zWCFBv_qZ{B^S4gM`NdtH-3Uw*PEJ6V9;FW7DaEx!YG~)(6kA&d?qwvh~)VTRVqLG!z;A(hvBQm`k zIePi-?RfQj-x_;_$vmhEY;Mlg8e04#$gaMMw2 z1N>3ZgPm6_{JxOy5dllFM5>2|)=Z3HJ$H`fRg3~ z=Egm6Pg3ZAx~qY3@e!P2l%GMi? zZGkiVHB%%L<^WZ=7lIRn2@RWI9p6w7p1kR3g0XOYnbco`y=HX}; z(fC@FI3)pzl!^$a<3PDjU{6B?L{h($x4N2=&OP-l(`23CkpqKu(q8IB0|Z5Ag4zue z^gEqgP99o56Wtr9VnzvNk|-d?0Aqc(aZBJ|)Q0=^mLZnka(AOh$4?KoTn zrCxYo0H^d0I27>7OVoec;!5!@9YI@CzC1k4Gb`g=A{x6cVQS1b6-Sg+Xn_~dhIflj zdV^eEqk8(VJ;ItXMA#=@ZX%+m7!GZ_2A)*eXZqaYyPN1V*GcE}J<6rgn`a;^pNf9@ zHFcW2_tbRaEFWaI3;}IsA@EKIH2fQSF>ahuW8K!3i=sKcBK6K%4{rNCd^IP{xfa^w zl)kr?-V!v%e=Q24o5;8pgWnBmC|31EdA84i6Amfid=1V+pZ)D_GPIsE#0xAjESqUJ zyx(DsIK<>bAIMf;r<=a$ZvZL2^sSrt#2L`vAHKcGeF`-E5WeP2Qe>_*0!kg7$CCQi z)}F#wapLo=wb(!R$6t*PKG>-- z>$1A2#x~a&#L8I?#^7?Hlttv6=w`>3_ziMJ=;WoD)PF`#3NGphMTc@$$m@Y-8L~>FMJ_&(Kp<_<@stWt2JrF8xGjaOgkTM02=fC>_hdjlP9x@06f} z7-2@ywVfJ$!H57UjsqN*mUMCW+wFUmju@>vC17;k zS@a6r%36X<*5%~=aaXV50dglRLC@Op6TF-u_iURR3p3uoeOK7$`{y}2?3-b5RU{QJuIrj2;FNwNWMsUo|uUvh@w2TN-?1rV;(H` z8c)b9dIW2lB|uS(A|;cpMC;aTGqyY);}G+hhL*?z7_vk(kS}$D@e!cQbaEBbn>D`| zC2ZmuVVNnF#pDuiVJtoI)=HkjNv38k5x%4uWkCL)q#d}l~D_SOi90p#xm%?n1tte?ugH3HrK6DUA(LM)-XNq33 z5GL1QB=GF*CDKoQj6Ox_Wi;^O8QyPGi22h$cow<$mA~mA{DKX`YD{E#^{_H7AEFpz zaC;UGeIx?;UfSo#Z`Uhlp6w^3^=40sMp>uJo}KqRp8M)(J+sV=aC@_7e+T|(i}WLg zBmH6wO$1$wk~5JF{`wjG_geU(vvLU&p?2bvl(X@Sl)1I#D~x}PdMa34n+`#cF%7)u zf{#USC!ggxS%Vi{`4Jj$VxzDb*^M;{EO0tg)|u`%S`D&O!8G{u_w0LWtPGJqZw33q z&sN9Vv#CH@PtF;=L~a@W)|*=3BFfZcAMG+eU-|0G@l!v!ugN@@C^TiyzPK1?|LA+; z@OQpD4nO^3tjF;WBUKl`dTI+O=mZvLo=tb>dUn0`UnF~>OnovsCQdE)`JeY@dCyH6 z_eZ}wMf&smqV7Ht`N^|&E?sjo&$WKCNCu&8Y?p&$J22KRKM?}p|Wzs=y7 zJkQ}o&K~T5aneqfi~)7Y92D))J#^m1z~j0M0yyY$(W`?dG4$GO z9QeZ%-IFB0`2=RE(>LUmLG#iv0TI0GkE4MF+6LkNQf2$ztZ4Kt!)ix7nVzMw_1P5~ z;rXe>@z&fwg^m#!Hxs2in(0$?b!|wRpzHAu+!>cPAIuo`T6nyMo@{ao(h2+IvuoR*JZL8C>`aD07ItXkqyKj#mQZD=zi>r)kh{X(rwrIjKCG| zev7y}{7t6FVEUl{>X`56m^u{}42M~PAWPvsIPvN(8U+UUWS902j&dD8&Ec2Mk%_JA zP@}q2r)LEwPmeM3y9ZuMvKfF90j2{yLQ0GxK)@*|(hPHqp<^*&ERh(8K)D&wP!fTp z3O7P#592U>F9jfzH$={u2x8s9pz4N%(@xThhn8o{K;^rjBwizALz4O#clR-<30e%N zednj6s!eIL^%(Z`cs=PjqNdXX1`_HSN0CWqNITcyr@xqz=gYfPP85i-Ey>U~%ily; z<`Pi+n2<3A6VDVAnx7z&ZXZ(zcseO0Og6Iwym{l|x9P)FR9<${$SHUyKxS&Ty$Ei* zlsX9OL`WErl1=?)SQdY9fa!C4J+PTU>IE>@*N@{Q{o@H+m%EEbQ6g2=dA`z;`gY^( zHpLi04ykIm>z$^*Z(hBrS84+w%*R;*D<^~_KxjIwlixOFKsHRc6etrv+;_T17~s1+ zmG8u{=X z18&7e9fTNEZQ=9MIv~yTf1bs6fwyuIndlapf(V9%lmJ`rEOs;2mDdsKH@hk`qR0-->&EpH9m1 zjY;PwD56hruoawOFxTNvx?TT7Aoi8Vqz_M0It2TvG_};Ra|$AyQDcQ2^AKV}K|qzG zj4smV#RcPy0o6ee;XL;#n0&7=hu*$}gP>f4^XXvRJV)8351h16J7*5a%^|ZwWxL0) zh3dWUx9h&+Iqf=&;D6?KuPu%rf13wbCf`mR&gXpxfBM29N*~P|X(TU2&d?{KH;!FH zpZ?Eu{`_p6&h(ujtAP&hsh2b28Drs;Kp3mam$vK&f4Yh zAvn1U0&dU~pX7P`Gy9Y_+M{5>e}Sb}^v(CcWPknj%@^Y`tadxif9B|vaqGfH`irD+$7XdLrDJ;+{%(W+R;4R`p7x{18MY!i=&~FCsJAye*l8xu!J4r;Jmt zh_z$s_uhPzIu_n4qi#8xIRluqUZN;1-x>E#C=2}FHB7i1*1T%eU%kdUBGaJ5!E}PA zF*Gs95=K2{+>Of{d+%l;xt1ao9BbA^;nLPuH;LX8aS%QV$LTw!wb@qq{th2cJ68g97lHMtx$qI3|Si-P@BsM*tjPnt}~N!4^g6m6hON z+#iSKJ!d!1}0~=;m1y;Gv(A1 zoM@*Ggx`5yN^vvMTgSztd@OmJIBFn?8^e?zJ=f zn|~?OC_L~e=kjBsknesRWAdE-)PPKQQ(NW9NiNA*D4IS7UgrY-qYt*ntJibYhx$27 zU{${%tku)YvH!b&I9`1xM*cj}q>Ndj5=PbD?N!h@4N>7u&oVZ6$(e8AJp?A>rO-l= zEvTQ1B7d2I)i8jw6n8%$&+-g@iblP?2;aSUj1h}rkJ8C`GhReSx1xjIyn8>s@!cPc zpZvXVjW^%={&@Q2Z8HyKopVKD!{>JBa_l;b!dA zTQn8F^ja|5?4VSyXkF@^oL`$L)_^AZhJL%gY&+&=Fd}v*RgXYL_Vdg(sy8NM2kFyC z?NR37(--|!?0AdtGNZZhd^PHvt%%Ee$ZgXt6A_pG`P z_N|vExAujY0Z?HKtg@R8q5_+PtkVM=gvmRRqrhxP$DAn7u|sFaC*$_&qT}$K6Am4i zZ$fLq=icsK%3Zd+Ay^p#{DBx?F^|EJ0lv^bnh>7obb5Bx`pv5=W9-wILYnad6{1`x zTIK4&;Xwgr9HdP|$_O$m40{H6NZr}qODE!4qya>+OOSB|#O-)d6eX{cfx1b%7iZEW zh&R*l+GR|n9SArwstZ%q3&R;@gsI>O2`8gz!oa_=>ATCKkEzHij0>SLCT?>86U{Ji z)19ePOLJYgp$dXEkvNrdj1;dgIFg2ua}kO7Q-|ez$6*|k zSCEGzW&FP0Y48qx>b5fy2Zu0YD2EjhzB}REp4J?dG+lhajR>BAapLUpeD38n=|A}J z2|j{zOie+7!$cg4Ttrqn1o#B}<2up%)njlK;R;sLRA>t5`Cstg|3f3^q@V8{d(X`Z zc?#f>xdz^4QW+;PMeG#i>cUj89sND|XV(4WlYt`DZUzUTjY1R^1gyk4?H=_p#A|UP zH+SN7N0A$|_XajjfT4^hGztB?Yh%ia^t}yirtb6I8Ch5w{AC$Rr<3@$rUTLCa*-Pw z%@8!%gnmw;3vWR)vajvnEIR4CC!L zHgjzwb*<;zh%Bv#4=rumOIt^mH{+{s&&JPu{Mqu~9JZC3>^r6_~nuCG8m_1vn00eV=h%Js`N$L1uPMtA3!Kb^hpU-Y^7PEw(S_^) z-ZyjJ{4H+49Nv-*K+vVEr^k`=>(pt;5M5;>;mjx=TSP{|Y%UMoD}%DLw>u7A+U9jV zaHP$^e;Z!YCx*TbMR0)zoC-FHgUxxn5=h~p)HwrA^G(c)5Xhuo3!3R?M5MAz*XtJ= zT%6e)Xv!P?X(Hq0r7eEFY%F}zwgh+6#<5S*_V~*NLbBY~QH;m$-UVL$PaA|a__L&s z4Y5416WoJ2LFkh?A?TI{=*MC^?JxVf+O!PD3$UV;Y1k=^c!lu{0Ny>w!$6(cemw{K zDGE%d@@Z^&AVFS`W^kVo^x}jq>7^(z%FFD=xjqzAnaOFFyy;x%3<5W8666E6GZJ&H z?~#^@2$Jg|#Zq8&57jeDeW7DknZA2RccLsXetW(i; zCv(-?OaBN3W$amXIWWF*oFn@HxQ^K|Cy&>QZ{|3)mlGsP4h@_|+^>y`m6zjo#LJ}sV&H?FJkze{2sT3lIKvAfc&zC@!#=NT0~f-4TddLz zvU4SWdA{}Kb7?Hp>lx3^0}hp*^`eX4z2h_Z@Y!fagv}5)iVrQK7&c<)rR=SjU(ffA zd>T_*4UTLvEA?)Md^1U@qtCkEGj%ZPkqb-Z8o5*4sY9L0bp~>9EB#qTn7-9Xh@2I! z&=2s1HN2qje(N5*;ExolLyi7ZiO)V+Iq}Ky^Z4RC^m#GIOey2e)yOk=l`&66C{rA{ zuFlQqhj*6`%$BxiTI&3ta> zb31iz#|Upnv2VxVY=;+jQ|=&9`v>P|<0n4;c>LUVzBhj1M?V@rb9yp%qT5y;qHpf4 zQJ+f(IjJ~9pGD!`4=$B%zJZ9G!K5ELxivhG|2VY)aVpp1YNmE&u;{Fv-MM^928(>u zXf60rY8HJBpUD)$A%!k0gx<2LqE5QR#9Gd_@8HBIJXmroqN78=Mu#w{^c@4ic@t$% z_g}|S+~v;`60&i>u+0}YN4}q|3G5KOc zWRL6g1#WhPUY_4MQsLjw{KcR9<)8nJ&|%oid^riMj2WCDc9}UI1A^E>7Bc7B%v2I) zvn~)qIwR3{B+`*6lvCp?07)G>)TPN$$dj|c&4g_MR<#Hj1 z>xCY(v{F zLCa?iv9`j4Rjv!;-g-E}IT>*@Y*t`1e8FK5xks6Bv_3ucaT-(jD6x;(6X zp75qb$Kvr|?8d}T4xezq*(OgqP?;!FpU3I>)%eptyFPyDkL@+8@($}NiL{4jrz1s1 z@)`P3{`l=GhVnoD_VM`co^nssA^J@LZ-!qx847H9W+%M2b$mKDVoIq+OkjwDqi`S?=`Hesc)U(PdhIH(`N43h(>h2 z@szs4t1ljIQcny;_h-JYtZA@kI(*7@bYkFOG&uPe2{OR$ zPzRk$_X--zzvQ&KcNwWOgyso=e`ZFt|0a=mK(D?MU@9-*Gc;hR5YNkYICQsJ+{h1m z!AVdzT*;2Wv3U%1tvN_XM=yIa^km8K(^Uc^aGFoTVItQ8S~|4vP>DX^m>FWF{|ZlJ z0&LxmJ9_u!n>TStq}8tr)!c=0F7@MBHLadH8d$<(99rMOAOowe{2X7rJsJCX*08fI zF1x{L(ErM3;ItwF4Q1jub)8#~`*?1d<$Uqy{^T$Gh6q!H2r+pSzEasVI^GS8Afi+T zVqLm11ob%PtcRE%n3cjYd5+PZYvt3q0L+_cY9iDECM-6Mr^8PL_=Dx^;hKKDz@Jr3}z)im3;PgnHn4R!~s}o~V zPrcC)h5%JD1}3HkObCw}bH+Z8R9~hrh`M?67*Y!V>gIkNUp|h@L`H@HULBa=vDN!! z%?Out5U={>(Lw7ZB$UvV+jUHFzvHmxB6u85E@cw6cqsm zhB5@O>2LB8o|&80EY29}8u0K!m%Y_+hi4djGL&Z+cj;TkL>)`x&M-4Flr+9ursF4E z^Mo0&=_@oj@mZlReCkMjc?M3K84LeX5?8m+CTL=KK=M zMMU9kZNK^1#rS``rAVV-K0E7pJK1iQAdQkydoF;=@DtgU%3h(o;}lw3et32{)<5}d zy!g>4WA8Xd|KxORo+d(y;oT77MuN>fX%t?L=2w`Mt@I zMptc|pN`$*v$6hzPsYagKON&+-y27ty&WG!VQ+>f*V6|wO4bn3*z375cjM5J6};SW zVQ28>6u}?H2%F#27de@Klm0Q>80>^=Tiia4)2AK9e5dI zRznhcns`O;398Ju+1XFjAN+AB)LADo^t_jz4SX_>0s-~Uab$3C6zPl{3%-uXhUReq zf>YTCfsZJVyo28}Cf819C43Tk({r3Njv9Ti>kyFWey7-1#%^oMc}(Pwx; zIWoiC$0%zXwE|Z`?=0@p1IxKnR$Bt5*yVx25S)C%w0v}(Dv&aS~-`M^Pq_>);ubv4H z`Q$JZ&*1@efd#x)UF0Ker`^B&XMg24Fp*i`O9h4~h`MjLx~<)&(T$^8ZpCBJ38`cX zAT5+JYT)ub&(&D5w8mBp4DUsHr42If@oc)Gjj^Es>Uqk;8qs=mRTA+c8M|H!qo)~b z-iv-pCSOI3B3iFr+}U0m2QlzEMi2<2$z*fZCA?zDDO4tt**>>@3{oJzOqvrj=vI|c zh=>XFi=m!T9|4_&Fplpvtm@$m%(Uc)g0KP1bR-BahX`KU*Bpf*?PwE$q+P&E!DCbk zw2C%NQqL~m2}I{SC{%JoGoOUeyUWjzWHaV&Y9Lfm^-KaNz;Q;5weXsD{y^ z;I5;PE`zsN$8ocIINm<&je9fbiBtNu+$TN_muY=ZHJvrC8HTB+7E=tJ{2*BH0@i=l z_<1%LOADX*Z+_-q9e^AJA8lO=l?q4e$={Ei1Rs5<{K4?{V#-pqHTd~nqn)#pNqrB^ zIu@V)GwgF|o!=4Ce2UZ=a^rH7-)7W4msz4W8i*jLQ#oOseeIZj?k$HE>c-_O9wbk| z(<$(l#{&;IJJgYz<+Ui6%d5Nb%Re*5zy9Z5M#(L*XO2`Mm;HrCE9$19T$b)nkZbf3oYpv`{+pXPSCKDzg;PM*c0~QrRh+mw=bFI7%rcE*& zTu$9H*KBhf1W^nY_?PpJ7`<*BmHu-YY*Eg^vUkTr@i5cRbgyAZb#-M6{U6wX1owh7 z^Bn-rX>h#;F}?K6)X~vH35ZB_x?LO@?>>t|$k7Q1kw?oOcM6+pGSOu4Jp9yoP=c7$ zdUbsn++Vc~45042=wQo%JER(?hs?@!XrBS@5Ka0+CwkK-e(|0bLjZmEMCAS~G9iOX zAE>yK^-_mPdGJsY1a@_jH_PQXIJI8{9?tI<^9js^u6L2A>anH(1`uHyr?sKJx5Oc~ z$uufWi4vo!?GTp{(h&z;DP;ih5Dsum;kj#R`O~X$an92~{OXZ>E<8m{9|K$lAOsP* zE(;3cMDvly3P$@ESQ#atLxeXSAu8jo|z zn%>H>+(nNvQBTlQIKW2fms!IA(?M9Ru$riNZ?l*fPVnS%lm;(bdJdEGqA_)ZDRq0R zo;IxlKyw~#=SoCC@dihzum@fT{9zO{s5hCqFC!p~yK?YX-bo*7+|x&lKF5wIPw%{b z9v8uvu}!8&it8zn`+aaz!_m~QXmL(HDo^BT_e_AqA1RXG)7UOgR-Pl#GX*^7^nIDm zqjd6bwv)3_sCse{HCvaC=d3c%XJ?MP#8?H7oivtDc&ifD-{6Jg<7BkE=}io~p{n^i z_xh%`815)eOYC}WC-mHn2XDJsWA;17-BT{~W!&*toyycR+s*GN%f5;?r-?*eZaGD^ zCz!~RiJd`x@zOuf2hOJX!LBdl!9#G6htliu>DxGmkxep0E?cetxL#=+@2hJw_r87l zH2(J=-;VF!1c1lD_#7Dwk~xH%k(KSpf|=d;Oh7s-X~){-!~JT z?|kxpY^Tgx4Eu<&Up+ZVWPd&O9`D9}aHh@e&}N6yO}pd|uNvE}@viet_f0yRN7V1+ zAoAwG8+7A+5PW=b9zzsFKf51eOFl4Ko?%Gg)iJYYDF)A}3$YmA8qb{Q3OEY>S>%Qr z^UUSxS>!qnPh^MFjVAOE$DICBCw;;=Sndn{%1q$UFR%+7%(^GHVJXXoeR^yGb_+Brc{pKI^}M}suM z8(9pDqHqSwZ%4BYp$$C%1<*%dcizK}vGo|#;F^AW$a8rjeH7$qKXxj8;t1h!?G%l{ zqk3GUo74wx9b}Vaap~=w1Ul01fYx6$)6bm*xAX$Ox6WN)%D!lyJ55eyddLyIH65Zk z97AVI*UL!XraVW`hH9KWHWfa!WB6lEM4vnA86NfQ@##tHLo53$uybi9FeQjh9UcBj zo$P}C2{;7+>25yLzx3C8;n~yBcQW46IFDrQ|>xA1+Vl{yvpA=yzgDU7KLPU z7vmR2T9^mSVWG$kuhJ$y5s*d|JaNLJuQBvt9ux9hW26asquu=3v$+n4hVn@$>k;O_ zuow-@lp`XLQho1o1@Ps$xk(BI!1*xl(q5E6s^vxMqfLU0^P7FEUP8KT3!F{a1`Q@j zsb@MQQcZTNlRkY6d^6o85(SQEe+t-CI^b6?FMKNkLm?qP27@z(+pJnR;_)-Un7&?e z_(Q+ojrWLV$I`JC1WG!B!yu*M8M)8YBL>tqN5XcwcXy#m+N#r({yxMoSTj3UFtnNp zZ$77S7lBVh>>j#MfXlMI-r~fK;`nC`J*Obo@_i~6*VLcui?h$PoqW;n!0M}$P&;$E z{8S0?y?h(Kh_mUBBE{qBRLeJdt+IfVSx0#<`03WMey74Z(fzLC*``#l#^7=`mg4!2 ze|-0!p&|;vvo%7gv+|oq^)DnzpY)8Op6x5s?`>?+mclu5HF(Ms;Sad0VVX^+Un!G* z=s!nwBOU!G?{3Eb@_U!#w{POKnRTtCp{P7BL!kd6cTUoFluU;Ko*%|mc-B}V{B6b1 z9x?X0)*+}E0Yf}}g>jyp`!1QXLBBhtw&< z+6-p;iyG+C%w7JvcDp2)d_^~r$8cfrCrF~hCeG#<`P5l>QoVlTnR01<8y3L-Z8vz6 z4JJ=!=~JgrgX05HbeS=4{dn${z%zS0b*W`=9Bs}|pc_X=M@{8-H@MU@ov4}G?n*Co zNU&w*zPV|JEtc6yG9`G_(XJfI^POmikMlhI;hnkKDnV6#a{_N~;a9fC9I?5tiD=%N z?>d1H+!q%KrcX*=0hcVay5?T@iwM1RjzbrmpqG~i)lTAk#Kb;}Wv&c)Cb$TVWYqj$60Z+^M|yIr|r)4jMXt`rvE!5=CWCMN-9c=D0& zk%Jh-yL7(8QGsjn)a*~AI}fFLb%SBzy*~<{JJU(XubwZu>5cw6JgzKybgu+;uvF?1pqM|ziC{OtLrm0c^ujwb721^fQ11Nnto#JGhDk;Ac>L`b?+RD2oqA2Io_J>~r%uZ6 z;E_$HchTBJOgLQPy4lpUA^S_ucR4Pp6tdABNkYmPnz?DFA;D)f7=!5vGK^C55q!wb?@r1|nY)E2 z%Ujl=^r1wq6A`3%$GbMABp`|hHksOF5UG$Dp!5TxwF~Y}YD$@&j9BW?HwLJ)o^xK` z#AC{H7|CWfgi3}0J{Z)Ci@CI~j8>aQxOj}nAPPxe)Lpz{$V9tQLMCVMRL$Zfa%O-| z&v<%g6bNHz+>&9?H(SMm86rf5j5dZb?ru!`wgyA?!`Oc4!plurCk6pC;gd4ONS7Da zoseUDU=j2(4b31EJU^N)PCe3MU5XI}LXgnf7@Ki9Du@#Vk0zY8?=%+U8V3cfnwrZ) zesvB-3UnrMdM`q+fz5N%$YWxEQ6RkzCcj({9-Zn>9qR77cfWnl1KW4+^o;F*1ve}%WY~?4DK90tH3?ewmmzzDBP58aL7?&++z$p7yVPXbSU-J*@CfrMpLETw4DZ1&A82TH|ndyfFD7W zBk)Zp$Tj`f1}9v~G%^u5nym`#_^`N2d-~dD^54d49OBgS{o|AIAAK|D7n|d|Pdnr3 zHa$&wS-Zj(!08Rfmk~6qkQUSKjPj&@O}3j2Rzubd7Xc-gBkJwxAcLKtbzyD@uP zxH1k)dMIaR{$AvWK+^-Zc-`1wob17|*_5p@NjNZxl#H2=Vw~KPGX|9*>u_7jkcsMz z^rwM9S0|@#ye2)Hq75q4J^9a> z$TTzv+8R_ebz7ZCF;53kwr?}|seX#I;O%A`7~>daj-;hq4{5jhEU@59N}uk7Z~Eym zJYtUlGsd4o7j!4@W_r^P=s;I6QucOdEY;Z=+Qk(|D|n7G0KRT;lly4qSPt*u^*~qt zbb-U@V5G<#mIk}F@DAMLXt2Vmd)gAT9UaDw(0%C>=SDx9^}L^Q0iOcTX3bh>=#*zG zi*#~M+1AJKJX_K;H)fVJKoysfqx6++vK_NyP8^RcrW}0JdvGBr!{dTfx<9p!>o~sb zM~7+C_RKVamkwU*Jgo+P=^wr~F3!;?z0wG{^RJHQW}H&GR*Iizf>$}AhFPk6A2~aL zHF}$4Cfjj(dRjQU*;@Jrmvu_g4|L*et{O)`7T$o4+n5IN&d<(Lsc1V5=DKtRg9tDL z0vsVj(0Yd<3Sp|3o6acL)KUH{BjdsIEKIP`K}h0xHLV`Rsji-sGWmhoDSvHaJO>AZ zhc3P5HLwR^0)pYxUaBh57$^)spD}hrsotiIbiMU0#_{vpXV*kROn!8?sD5N?7>kz+WsF!jf#3xwKaCz%>^ zEvy4=M7N+@$LHFPB}4H>qfomkM)1pcqp?0N6|Z!BBgFItV>v{Y{hA`Pn6Y=!*u>3K zloKeYO7J@lW(Jnm`&{tpGd6a%AH#?b(G)P+bk>G?PQMW# zeXq~~czG7O#hKsk*MZ1$*wW-sOaEl;{I0QHjK6UPeW$$O1-<5Ji0e80Y&iOu~FItqsfFa1)Cen&^zQgN*ND^4$Tlme#|bfd~hy9 zBe1L6E^>5>IXw85ff9v+MZYRn40Ntf9h3q97dk{vC(S)Hebvv z`O-9Wytg74kei593z4HW8jzcVnv%$`sueLc}zJ49PJZwf0EjgR|h?k}My=~Qw zcT)O-SMsOd^j39y@F;)=KT3iXo>pyK(%qMWSmP3TVw{~{6fn^iMJkP+x>9KvTB;;x z>M0Tk_SSA9=n%lJTOGSocF|ccE8rnfG!vQAxGy893TKGH$Z;$fzp&0kTEv?|lpzpl zHeDS@VrOfuOBZYkf_X3|$AB_Jrrwlae|{LdFQ!9jI7L6on7J^og+K5}u6dJ~i~S3pd^(hy%>>p9>^A^mW+PgO#Fu#e9S1E(Ocl8H33OpV{wKy$ceMv75qh^0AQ z*Z-NOPx(COzFErX$6O|-vJSMu13mCy{zS&cXD`m|@owC9I$#v|Ug{;gp74fB ze51c~jO<7!^hGXb_K>lT{)-;);u6O1A=hMI4~`D1W66`ignpYTWqKkyJblfbDHExm z4Co6Z#u4K@l7$8q;cvek;A*?6XF1n}ewDSLN7F*^5MIqS*(A~S%m_qB=IPE23O`9b zGi2JOi>K2*ot?^d2-h|Afl1R~zqq(q=tcUL6HQ;_d+wt@zJfcpppqN-J!hDNos%&o z^JuK>`T1$;O90f2XE-xlSdcrriAJK!nK=vaKd z658gw%mjL@8b@I0cK7z{rAph}#uJdD5^;$DrGI@gS`55S5ju!t6m0rXuQ?rXE~7g{ zw%0MElnXhf14VoxJcjUmh#-s5amdsd_MP7YoK8zWV<}PugR^Fn`Kn zjC!BtzjQ9u-9PYF=Q>FBNog=>P2V@7HFl$2M%?Rg=Wqn?t10}2Fi6WwZ9=eU922|DwJ1~b^+ZKcHk2w5ZtrVi>W*)w-Bk(cgk?0C}4z9k#TgXO~T8N6YRntrr@O! zGJ3*{UUi6$I#dzHAoSYCK)iI%IYsDLv;q*g;S$5C-vku~&87^LGCFHhG-3ud#b8Vd z)94S}aHy&X7WGWymC8eu=(gZBLZ9B$;6(rll>G`iwiG)3^3K}$N}@&*Tah3bd0ty} z{M3abf}8oau+SsrICJ{<<&p3B05^HA9dzGwp{ssP!OAs+35{|q=R#?OzHn)ry)%$w zKxTxo$WkrJ;!SJvTejcf5u6KWCU|E|;Q>4z)UJLNq{5Vco=ZKAu0sbjVu0-p8VTG<}C-96sX!B{56*1iQd zCe&?&|H3ZqTjzfSzi_}vTNbC|oN$JDsdVWKvI8d~RYs7$*@+(6itHvgaLSL_+HmO&JLRA0ya6gX9Zit!E;e+-m9kMQ4{~e5^K7!3e*z!r3 zfrD)mlcR$?pMElQmYkWyjGsD$7Zex|cHkM$lG7#sKfrtM#_)#5Xxkx@z}xZlJY=}; zOC3a~!~vp5ecy}oLubIntS0(3^kN*l9dXj|X_X2UvtO>^iB=H-N9bgy2Ib1VhV zxYN-lsNE!(G-qlCSfOBWfgexri}&6;HcS6b7D4mk&~twizdd!lpi@)roZ zfiAYW&7*ZR);4BftzFCOz}Goz!37=Cp-*}%fAo@7UU0lhQKxi)6x|r-=y+O~vg33y z?$l@MYwDH&W5PUC#H_4E@dgOU#K=DB0QDLh@Sb;uYiZOxr=JWHL^^p+l$~V>7!2b+ z266^WOKH9-=)Q}3GlZcy@OdhNw0f}l)ZyiXIVl>*G-jbr?M+XIvoe>BU0z@2J45aT z3YMtxfC+m#kUA=;1TM(By12^M7{(As^h*)wM;(y5TcMBqMTPz9`+HKW2g*m@DYaTo19VyV{jEC;1kObCfSY7N-b^dLO2~a z#vPz_)KXXm0q&aG%F`yd^j+3)8XW7-RXj(lCpyD9ULu3wVZ$p;F{N*Ws`SopLgc_d zHmf0DG7DfMRJmM-MKssR*{SOnR_@2IZQPCZ$2bl8xWF~qEDe4BE3<htH~;*;T&3=FS(vx)#@1(_j6Zet!|~tW z`oZ|;Z%)T2kGtcCs|Vw9^I+VE=2gUTj8_Af;Wcdpkl2%b7Szk3EO$I(+?%FHcZ zV<^)$E|4x4iK|Dy4Rsk3qfEOu$JT^FRKBqlehrNH-ZeU^Fr+5$w$NP;25*(o2R{R` zSx3PV&`CG+WQ@#qp6{TTdO>~oq=8gE^RGNOUx*c0@;w-sG}3Cz3OeR@#<4T>>p;%z z7_D9>DDW^KO;x9S1DEJRvd8IhorS(#ER)0Ybua=OJ!zj4a?c>$Nbkl_;Cpj^&>BNC zK8%rP!Jw>^ap!2o=w8I|-zMr*x)FKdoBhnAd5-Mp^Nd8nVGLh?rvc;;;(4k6X_OAl z;R=a3&DB$>iyU_ieP}_ax-4x4_lzMPW85DCn`m2s%4g`xQpqBialX5I5Sx_%HMBxM zPQ4*8P6-FmQdGuRe|>L&8N#q9ctJ47@ZxV}CN6@P=-V#kPXFrchlcvCkGYV0Q%6<5 zw`Vcw<*qO5eV6Jqkm8)}4`vO1{_r_M+%n^0gwdukFrP2kmr`-r9OA~V0G<`BJO?fFg6 z)W>VagcmWI;N=nGO^y^LN)ebq0&)Jl;Y}J-oyxbL`M+u1DEaGa20jWt0wEiqoH0e* zrwm02zYJ@~J3~u*;&Hmi(qE9S_D8TR#d^QYgQ`7T$p^~B+4`nRJV`~Z7@(b zb7`HJH*E(_-ZmkPUaF#L^d6jben9xFDN|#;4;SNC$LaX#hpTQ!S_4uHU_nt1-os0b zOCWRK&Bf`vul`#K57>KcqOD4bQDq>?M+{0n(Wj0|D{|kpDDgbs$32_hu2ax;5OOV` zq#aHR9wJQnY`fD*C=M6T6mQbikr8Q9#>IviHWIe7Uo$W;uz-`6qbH;M3XV(iUvxry<=6Gg>Y4C>Yxw&d=k_zC9Ul z-hMp({M&yz{{7V-j{n)Klkq?KiJS3vHm}F89iNQNL_nvJk<0ria0)88p>S66-Cpky zEt4^E5!^%;UWB&MRPIzJE7xflPm*jjfeXtnDdyco#0-A!G=R{5#)e~9N3^(~JXq(E zept|?v)FqrWrLz=grkHTA=#`XhAjqAR_4{qqp=esVSWUse=GPkDHH!0!xYSvR;eF7 z5x2%5O>HddLvL{E@8QdX)Mu{G)RST1{I@a=500jhjIp5qknSq_;wm!QrG=ZEfmt6T zQAary?{hNXEBNE+!x`KezG~(u?vtSaFwAXUBm2R#vQ0Us?_?jqumeX7x-20>-E3!I zn*2OhhKQq5$!8MPnyvDm|#wubOW2LOug&i;DbEgdXyrZkXv&t^*Taxb zc|W+;M|vBb=QD9oZmz0}=-CDmfKK~XHE>=#1e^PeejVc2H22X&odK&(6MTd7=+(>O zwe~mtBM-=^@3L2i;d2~7e(vA^c3^y z7z8$56vif~#^t6$E|`-^f^?lCjOv5{%&wiKktARtf4+xN0*~vEPLV?>kCq1x7y8*$ zXRcpXshXe{k80Q0)((_5qQYEa1_~S=rWMlmOl8-&2EMbiiI+#8>vwmTItDsaUZ?h4Lvua zch24&BcJb=IgQO<#vwQh-Yya$-F^Oke0252`1$wW9skzVcgDZJ_Ji?1|LA!9{a;)k z|L)K4jKA>555|W(QC30kAH5vo!{CA3%{eOY9y&z^!rsM+t}^g2PHFmXpZArtHRaK{ z(q%*Lg={Zasq@UDXHp!tJhgZbAlqrVBs-!uj$apf! zQwPr>NWT+-=6UqT82V+0oFq`a8BuX1KB(8$zF3 zNuUo`7w6;r)GMw9w=tlhIlh$D71*4foYkgzmj1zOr^mqKm7O^SyyVV8C~(<1kdOZAIaj6?lGfnhG95tm%n)(15+k86wf=L|rC?bs|a1 zNC{8xOF0H~LE==3vAp#EIUX417RebS?B2aOMXhD98XnKZ!wNK$xWQczpx#uQy2J2c zqU|uJ^aNykZhGG_G@cH{MTW-OE#dN}q(9^xB}b$wI0N^c>Ua=xP}}OCzF;A&iNWhjA4=T!$?$ zW6Y)T@1h9S-+eJYID0pK{)_L8|JKgQ_#dr)XZ(lXxETMNKeayogFm%3{yV>XF#gm} z?8opOjJp6KT9TDg_x|nk*ePF4B?5oBQ67RMa7`R9Kgnp|x{mDRIXFZYPNQ*nJ%E=Q z+|(hRZQQpRfMBp`$dtbipTUDu)%ca+mx32%Q*<3K&0nzJ%$7_@XDL&LxwdYNG9w%# zHjVH;WcG>WW;~1{sORJ+!&)3D4gq66@lMBd+|w zCn?4%&YTK3H-^yA4P$NRKAA;RZ7S1c&*mS57wHO<6Um`rxUN_VBJ_{(;a~`;=o-O< zeKJI@2-x@GD%AV@AKLQSzM*q-V5K zeGSKHcew;`rkfK<#|SG&k9S;}6A}Hw;q4HEKGR|PmOiSFUFr&<;PU0`SAlJ%6Z8y0 z3TV&I&jS~@IcVX{(4Ud5(abZYPug7H3hwszg9CwD_##1)rHb?bC(@hj8l(mWyu$F4 z3-*g+hz6cR*O0V&8J*BXaBVAi0AHrhcnqz{KDvJOYadmAS=nayQ;t8msLc&-o574c zpaa^8{+seor&lQwV;?BfcToqyJl)kqSw8zVwLGB10AMT`D#iqHJLzsw2EdduCNOTT zJfhco%Dv^JBAiD&J3~Ie=?Fs)A+`>54U#Bn9?8~bqURuD?s5k@RfGzxJWhs_VAKc&p%}Z=%Hdf%IT4vvD21aByh(9OGGB z25vYISro1?T_c~s)LEeE3lAJTXaJW4N}AMcX1%O89+)Sd@@)D7hlWr@FMIJYDIVUj ze!~@E!zWatK2+_N7NOyizQH}8h|%OoSevX}nG!w_yxj$-SBcnTuEu7fk&o_=$G^UR zKK`q(9>&+6!#81K5z)1o>8X!E;J;4vlS&K^ad75eyBJs|?MP)aIXU#pWptWOAn^M{ zKbP0gfn!t;+U*v>XB1wZg){igr>L~iU1+nnzdc^P+U@!BXls1%YI_`ohVBO)#X*}^s)0__cTyDyrrHw(J2q+KXg`i$S`&zLngi{U*``W{}&n6E)5AF^AszZ|7Tk1;4RbofD6He^F(1|m25OVQ8S_uEy}Xil%f7lU8y zr@wUMS)xt`2E1!l4I~<5(8=y<;9+R&XYTuyTkj)3uQ4~wMF$IdMD6FN;kV<97{ZyB zM=bIysDme+o>BXBuF)R7I?pHf7@TF+1KjjFN19`2c#=+T7KkoQ$2r6LUwe=`J9H5} zHJ!ToNlTfl(+zXrCue0aP7ED%esLDOa6D(wz@S}S*n-=&1aI_I+SMJkHSh{-aK?_% zLHeQXt?rdDQ~VD2uk#il*@jKJI`}d~!l9Af5Pfra3_G(k_*s^rLlw1;p)-7>-qJOF zR;NB$_DnaEt>t_-L%&y77hUaP6-bv^=8qj^r$qTrf$uEAx2!DPjFC9zY#QFXGZr7d z0ka0Kr>2n#^~fk4RumbDk=fP2)tRH;srSX;T4(dX85He z(l930U0%chno1plnZ;`?MOqVKo7yWAJl5OMoa?-~MyC1R=rU~(X0s{xyR($Y0P@qZ z{ORzV4WD16HT5;Q~Ba9P=tJejl!o8Ostzri3llyz_{&OaK9Ive-x## z6}|i%V?VCX$2YcD$3J(lHhyvSaeR<6_R7AA!a2XeE5WblwVgV`PE$!zGHC95PB2yZ zq(7Y_lJA`_pq#%bGO#V!BaP4B=+P*mmnJ>S5cyXA2rl4Io0OQ8`q9DmIE+DmC1OuB zg~x4UdKu$=a$-W<qAKlmXOnV+b zk+lX4xkj-+uiBx^8zT>@e9;0w(IIF>nNpzA+A@o-fAN0K>OR<^%mpPjjEQ3wo}?h> z?vGe8ycL*DJ|v4fDTjZ-ryf}hSpk6zI$esO0+`5)A(wKtFM(Ig$`--VToxxQz);WO z1hPrTi3s;2hn@!yrA=0M_xDo&ZFuD}I(BpHAKG_32B%KL<2X4!Yx-Akh1X^2=)VPv z&J12~&LFtXd6+s&*7UA@kR3TaIgeqv3`~JD_p3Zwh3I;bf=_)t(LRSh(4lmOzRaM= zZ~=Mp&UE{CFszZY;DABrgp;f}S7OeokPdGaATU*4gIoAjzS+5a?uCZqId&wxk9V4K zc0cWMROpn>(8s&E1}6L#;-&n0%d<;{92z)AAAwg}-Mnabx4dO_h6&Z`m@7>l8TymHU0OJU7xmDK`i5W3IbicTp*D2Ve|>%R=BQiKs-F&m%V`6ibMIyT zm)W&-EnIRqqHAN{nq>{l6fhdqNgWiiN;_SL zc|}Myh^dRQLYsQJ?QT5A0Ms;IPE5ZQ1ozEoU<*uAfGlP#AX5 zno((asP$tIGi}WyFg`AYBkIL``dWpaGBrejfyWmWHqN4)F#uxn(v8vFgwUkQIHSH) zzWU!}>MrY{L{jcF5t)egaDOKZx83xK`iq0q2hKbe*vy>Y3k|j#y+lOH2qL3PlUWjp zRO#oul6p#H^(qd5w3{dfz9=Uzd@x328IgMDNx9sI_#0hY@0!#bW}<8?0jbhV89RR& zkMiDU<9)IZ-k?hZvGhCd|&h}VJTgBZZA z7(>?{?r+9UbivQA-i$xJb2EN@?|J;0?dS3J82^WO>2^k4i2zZ~Pvx!DXHYYJNMnU- zMguYEBEa$kq35KENFuBSTVx6`I zG2nL>7vuiybUcQ~AH%QDk==)Uu7vM8Kc>-S`j+24)9yw3@DG3P8{-EtEU?r)%<*aH z2tjqIiYq)@B{8JI)Ws77}S1>8xW zX(KgsE`ux- z>mB-r{x&883m9frF^<^t`y2!g zj52uz3nMrUZ_1?~KH*H8b`+%#yK*PYElMOG;Fm=LpW!2N>R^~!mp{g)SJM~rlII11 zol_OurJ5RA#*`5`J-z78jB`(m>3HSQ)?xgc95O)C#wj$Nq?BV%z=~(UO>Z0>>{J)g zwY5Px1v$?44OHo;Y%X4;@7W+Ja_w}bRQ~8Uhb)L!Xj>*Jh@z`!^v$TU4>B*oapYjn zo(3tW&*Z+ti@_lS?>qaT{=Ec097fIM#Aq za>A7kH~^?o1NAf2!b1*I?|W&1eU7DurQ{iG9;Ibq7jv_QMZ^lKrtb2u%XcW5Jfm@& ze^42O6%zv-(*0H!CML|=o3^7B`BL5#hDjin2*g`T+a;`tNnx}qbDc;P?PQn|n`)_J zT`}&6d3tgjcmiX7cPUR`WlWdRA4Vdy6`%;5u^x(mg6^`kzza_lLA|Q9DaEF4&x?M+ zU|dDIZ98paEZ*(hL_r2Y^d99JX6M0v<@G_B#%2a_R&rM)0}pncIy<@OBq|Z!Wjtl= z*l@#IT!x1*f#D*sg3-ns#`KN(H988u;E$rB7|;Rp!3jr%kfj$@HlmS({llF5!&5-}$~YUpuzE3megA3vwU5@v&)%MoKXtS|HZD%a&&9wUM4;Bwe)M03 z)fqD;oiSDu@hyj(jC-b7+rc99poBF{VWA^_&gK3$3!!z>@o^B8nc1WEzNuxy6447y z1%GjTIX;VVfB*hE#{FvCg&qvI)5}phFXHliynKq_ot}*YeR#SWAH|se#hWk2Um5Sm zzqN5X{<}ZBIsWF}#rV5Fvorq6*Eh$neQjs_k(V3eVD)M|oga^zI01Kg{`&n%4EcEs zd7`lx^Pb`Br#Nq6yr#;ZV?3_j8h69-$xLlPpYpN}DdzuhWRs@X@fT3ms&{MD)tb z4B{h><5;yYsC?$%| z=z?muDs%ns#Im$0Q*aRd`R3JOZ1BUKggLeXO6?0H|c-itIP$t_Q;@*M39C} zIH?YDj2AmZm$vC@xE0~5&pf2u2plpSQ~z-&Iqq<3UkV~nLs~lJ@znQlA0Ca&nlnIW z(`VqAZ3?QaX4)%GEeEqNgWcL3GkTrRl9Xmyf)BI44S&!Lw%OKi^{B(aX``pSWw4QI zXk&E{9AZiP3y>kS!H+YF7tF!)bX4l-1n=%~5UVRgJ2YpL%x0%^;R&40{)C?yR!_>1 za6k;zh~B$8D?G>Xk};hQ$>{RK+M4vw+$MV3JOD7vnf464caO-p%sCkE-@dCI=__Qz zt@F5UFGh+4n;@wJDfsYr7s3zNZOH$_pgcykHK1PRx zj;ZJCoaqTMQN)RCPEJlcZe>zVCy~|Q2DA!h;EmGb(RqOag(xDoImlHINk}mT;=&V! z1Xo&Q#0Wknm3p-c5!{#I?RGy+a3a%PD4iBUJk>o*5|rKs1^igNR>gk#)oVF|xC zVam%e0U>AL2_$B)4J(*WA~co~SzFr_W0(vqXfeIT)E$PpzvbNI_d>XwmJs%Z5fK9W zXq(|nnb|s(QBOBQD@rkSMv)WJD#~1k2SRM?TUic$;xH0se1jI?LtjyVNbaTRDDZEF zG4~VYau&*e!Qmv8dE`_IR}eRw})>Z+v}i{FR^F8UNBx z?2ivO9><3VoUSPR@apYFjCqv9&FAlG&}+mKxjmYc!x^Pa$qr)ZLvTp$Ola~O56g8Il;2EMCF zBI71}HVSO5_R=;SG$TBWLM|I|sXu>Uv;mfN#!YwUd1LGLjNgqCv<#FYCjVYYW8ZoE z&9_JC!$y=JT|~$aj=b?}ClS?6>WowD-SjE>(TA_1H|881hPz|xcrh@@Sgt18?;Hs8 zA;KqMo`J)h)F%3+tYrs$KRLIhEd3MbBz@MOz6G*+p%`jEeZ^Otd;RbG2Nq=v>xdLN zH=frIvfy>1@L}2AhhP0lqyOSAePui@FXk50o|zd(nQa$ST z40=cppP%0qcU?Z1>w=s*`s;K>9P-dzKRid*&!G<~YjP3Ym3!uGaq7_B1Vh0`E>|bg zqYOM4&C2&>H|=>I9vO4r;aYz>F*$VUaBOfL@FR24|INs()`4nSau>=r0~B3Ue#$xV zKHC<=zysJjneh6uP8laF;$0h|E~_!D2$IbOPggUg{y7O!c9Q1AvvB~@H>+M`U+4zW zJRC9NXm76-lZQEK+QzpRp(i}a%ykR)I)JM+;!^A8l*w|z&6U+nf%om(lhX7ca%jE* zPBP5({5-d`7I>kr;XVCe3+P_;k`qH1aM$55nda2>;$QpqU;T~FN)9lLT*_AIFB#RO ztiIOnU~Y)9sZxTis1aVCYA42Ekun=gI zkvHDYs8jaF`NK#dnAA6KzdHAr5Du(TPr^K19aU5WrbEK0a-GCNFs2H5PO%qXu2&BesaALAqcxaqQFhvIT;eL6vpE_o$5(8QvEkgFrZIO*@ z(?jJfglU6U0u^y9V|KgY)FZOOq~|dl95CZI_V<^@wQhe#GXXzk>UhPYw$i|kT0G7= zdhoVTnj&}>l2fz4A8$Q<YU{rO`2;*0a~XSS}#pWV6|e}3a){Dr$O#=rb>G;}uX!pC{9zXMNHGU?J!2Lh|{qa+)_v2OSI{)^M#)?#1l*rZR@5fqr`7XG> zj`4bVdo`}U`R#G@yMHh~OncA2_XlJ1JKr5&zdajA@86EKZ+(0G()!K#$mWF_ zBkQ8P?ktu%%owH+!P#Y&+K616v}zcUlTYN;ZDXL*IHw1Rdfp_0kMuNpBwu|KTk7QS zP!j^QT_C?!M<&N1O(MOrD`b$Q!tPnsf8= z@UZYo&C)aU>rrHg!@}U`2Sb&rtN7dhmwTOcP49@z1xGTL-bqk=MCM?X;ihBAB|4&+ zw6n^<;Gkox%X=+`KKiImRdn*p(Ao+rhPv>kj{=^D4spu<&8#N+a31uz`=12H?v$6h zIq(9Pccb5^d| zOW@?xypixCSDS{@Y!);N4PM7)@Z z0CGScBAC*X_8J!bX@fD%rFygkG*v~Y?8_Zkg6AsH)b$*NgqUYB?l+6cWoLm~27!@2 zi1&|>URFRb((O82=23XLM^Tc7I66E@P6oklYBO+YMcRm`s}FX^Gh^EeWh^7%Jk24M zxo*D`Z_@WJ!3o1qB+H?OI&-;C2@x!_nbGXXPJF?K_Tji_3aogFGecRJ2XLQ09X_s% zosz0-b)oOX=0JFEkxKx8EtF6plIwM0aBm*a3;j<2p>j$hol z9lx@5H~!4Z<@ne3@5aB8X!$R!oQ=P=i|S; zd!OH9{MDVC@n8A+=J@rOPvcL2Wqthd4|m4l&dPZCa<}_}uSPIeay|y<&%y6g=n;q` zWl{8zod*%X`T2M}jZrtdJd+5mr+xC`wX7yqku65R8?@+@IgB=Sj^R3! zY#C_=6JH+1$u(S9W2~>?c`|f`zx3j?6GbR6vciK{%3qR zzJ{&nCei*zB3kW`Cl1(oB7HnZ{^$m}t-1`}!=rG^xglGOns+_WD>va)N}kc$OJG4C z)L^Af^}s_XkOfvl4FVf8w?&?GgB=X@39aZAh7bI88iMt1;1ztr3%GqMKwr$DE$t>M z^t`|UZs8Pu4OghkrcC;eW^`DGMDiQX-N!qwUxq(TxMsLzH?M;ec#&yT25enc9S78; zLYV<`V8Bghzyr9a>~fR@2A0-FZ*nTrlYku@(=T@Eo5QkjmZIe=eYN?})PLqH89tj1 znLSb1hSIzN%4%&9yCL;%saYpKaySBqdN~(h;3zQUo{=%uKTGQ9$TzQ!icbc0>AZ-N z&8v~c!The#gT6O-d-Fl;=H|Fc0HN=Ddk1yw$hCp5 zhzK(!LDeI&!_ou{Aq}Dv>LNT+ln)UGpT;P*xA!Wf7!#5)rHH)a>FQrh{NW7T-CPx+ zU?iYY$@OSMKun3@c)U_z7_+ad6piFl-3X2O_jdNel(HFtiAByay;cTNW+8YCZZInD z>dDpU}0~v1b5ROEyH^>f`9()4N3K7zm660*>wcL?Q8Z;Ry~VF7S)tZ)4t5 zcsl-@W2xFr0y_Wz|MW>jK~&JC`D{o;SzaV^x(v?F<5fSt$o)lKq6D;gybDc@1*WWF zqQ}tx=`LsJ*|f1XQ!6E@&rs@z|g*VQ}b|Uu=cb~_8qW!OI+>T%TBm0T| zug0I)y&He|XLrV5{`%AScYbzt{I~!4o$+_R_B{TFfBJ**-}uG7@vnUNV*IsV{rdQo zKk{;XCBfZK|J2_2sh`*#FL$2CSKn-opZLaJX!1N>CL-T?o#;1$b)P<6hKAUn!xo|3 z3z0*d;R2Z(kMY#+-hMIeKmUB(eU|f!FUG_B@?bZt(3jIfNZ~ErDoxRZH4d73 z?Z-!NNukDMLAoEF(=$@q~IR%i)z9yYfZ8@PdOvGX~5NBwJnj6TX>4gOquKhb&Yc=Y(D^zmC|-9yPZHubj?&SC{167M(n^Gj%278 zS;RP1o|$@^j6?6_1GIOfxj1NxY+!ETd~o02r%&q0MfydM;Mw*+`c?nos1tjGW3nK~ zW3SH6PC7&d&PQZ21=9vunUVK0Z4Yk2&~^;z#82oJdKy9s=$-V22aU6HT%n$Q z0VjP|rzm{pS+wEY2)snvdepf{fs1|GkK;&2H`ccU<5hLM?RwF<`q=n;+TPx>etz05 zy71)mv;kT72nf8;Xs!jgnt_%v&&6uN&}{Wb-~7+2K!dwUoE>uw z;270Cf_Qa%RwQCrV@U*+ z@XYaxiCD}J@er#nQ6jINa;Z@#I6(|#V04HpVbZ}y*^8h?%3d^RJOy!#v+zPY?x$RY z&x9Qjy_A+Rgamxe5-b$i{$lG(eTH1PNDE~s3fHquaiv|tg&@Yxz2OQIG!s!rio!`m zeQAOaV&6B~kv+hSl*4k83R-}VV&DM4i*#k@PJ}*|?A)g=vys8qsAPd7bgP4vXS<{= zr}UMVPhiyf{(BAuhL@V3%8!7VI7n&EOb;hPG^S7L!r)=Z(g?rAAxuA)_q0tB@LIc~|{fT}Ff5VTH z6S9ny(ZqdoHab@bUc+mKA?oBU_`l2N(ny`6$Y$r=kpEm`u%wO2CpgqcvHOHWM#_+( zXjQgUCrotf9HaEt+yaUo9~fR_i0M0#ZTH6y4d#2p6QD)!(6J08maj9#(1p@6a&S1) z(FqiyC-slR>}4pOoSZh{fWf58WE<#2RItq}{-Dbv|JZ&6*|;jr9k<;KaSd!-Leh8yc8xKLb<4 zjDm^k(nOfcp%Ml?jg=qFv!I_}9=$9-$Q&1jz~Ag|=qrF@Z{RB+Ec%r|G)|>p!y0yT zR7Bx(9sGTVo7j=9@HTv&pB;Cufc-M`Pv+$C)#2Eslgn4z<2<_Jc;Vb}av-J-SMaIr zrE{+z_CP=fIA4`=3ChwjLdVlF<|2hV#~hH&i(VLYh5|7tlAD`3W8MyREf<0^v_V%r z35Z2B=WUc$2^(Xg^Hc`FC<($4iqr#EdObv*PDX^vOyvN|a2B3itI-al)|iIy1Q1pU z9|H%ylsTosd%Niv#Zw}QoeGgwFo0|J8pb?b{uX22C?d=w(qvS4uIfU#nHr17oEA#t zFg+$T*2e=R1p3Vg@xmBg*C;Rw0#g%QWnjS2NBAwU@X#@A1Rw6ixo<7eg=&9w=8gH4K!-jBy=SZmU&zx z>TnQX3Vbz@XEO`IyOiNfhjGvdTdV4Ia4Z$}O!F;_fAB%M$|As%$$XRo8)R7EA;$7N z2Gz@j8kH}`iXVa}OSmvCB|OKj(zn3zRD&qOk3tKM(@@j+CWkdr&4H~P=$L}zIZ7{` zh@DHFslT?&l`s?$J*|}coAj0mUA`z zdOSXl0snMH<)_CTN0)AY_I9Y_<3#FTjHmbSYs?=mb3Fq19NIlbF``$q5~1BnV4$dK zbRsMIvW$2g;KYm*CxKI+m2rB$^vHL(%4ZFB?$sesjZa_tyB(j;Xg7Z%N@MMFygm0_ zS6|vRbABh^_tTe^C>x5mI}_&1ZE#H4t5RB%V@W4SQ8ET6r)Pm9j${lN*`Px>qLjOx z-jrqN?BvK0YMLIRWGPQD<3*ojd^7bkklH*;gbI!lJVodc%Tn>Py~QcR$6I}gUReY# zc(U_7Qn#++WkwPlGxL@5sZJdx#5ouRidUwB>=a+=$Lw>Q+Vls6!0?e$kKVPbBtzI z5&-BD$ST*KfBEudVA<}bJT>s)HTuDGmgNfI(uD%9{G9ZcXQPvXrtn7e8U2<1Uv@}_ zUP>MGOzz>M>ErSibbb!;42ph1>YT(C-BMwG*A@qcIPM*w+iPe3PPvj1s@r}Ca z>>BQr?Y76!Gib$;q8AN?reyiY1Jl01S&Vv}#*_~Z*Z^(1kLGm_@=SLTHJq06;GUVJ z=owj#9UC~sfeP+qgXlxJ=M2s{AskzQBAYieF@}QYvRFD3{7((o$iViFY?)P6ChyJV z+lGSaaC(y-r|0Pa^P?`}#K=^goa8g`$_#Y4LwnJi97kDmb()(2XLt^-+0=A8H-gM+ z-5hf!A!cDjqkMu`-j&^+Lc&~ssG>eSxoAZcw^_!I5u$F!66I|Cz2h+H80GD=kwXxn z6TG>(=6!lksX7SeCD{dTF5wbkcOqF47kwOIF@7{tc+-n+ItYRZSn9(J>Yov0jAtq) zJTpxf#0FN3iGZ^X20jKgQ6+>l?Ug?1#}$t=Wncx-^joyp_HxaPPeu(9c})n70TB@w z_jd#>cBgGohWbD`nMlJcG;|U6&pjzN{Ast5d-{U; zFju|h;Ca5OYAuT3Y}lKCK-gZ9m+MVia0)&XbLN`Rc;CSVI4KenpeV34D-gnXt~;uD z%FJMdi$%&Y&zPV>ku9V5I&YaFhz_3|cCuSZ;RGBRHtf?W>!y{+%C=jg%9)*pAxz@2-$Z)r^lJ zF9(Gy0%d$vC2ii!Ukc#|hTh3(7bW4#FOTpSIV2hM3toc*dlPsT9|OzmWlPV<(R^W2 zobbrFWvMh9MNHpYuM9p>t1sjN%=or=P8srDeizvWPHlExOPo4rV@#w)mlKZZJV&Ez zeNG+twPUoQ38hQvccwJlMW1n!&%-m?Xy!t%LMvIZMzuLC5hl-5SAuoDM!@*7eJ|ir zS^5BbMz@$pNJOeF5 z1oZHE%2po+$HvgjEkb*N3dd4ZE(2=gv1S${gMvCMu(mgMqGLD4X`FmEinEGG*dp|y z6PuX{BGH-7w2{%PMD06)3vZdIT-*g;=-eUEFrsw-!NFWciT0dib^;&IIcIPbz6d}1 zEu&p#o9Q`*FW4pB`Dhx8mzByO6|(F}4`Ije|K0*pS56eBXqq=bwTQI|AGBZKsX92*NHEEsP_%9Ki!NsOO#^ZR$k zMJ6NWa+#38P$b&w>pT+~N(V94hc6Gy$e}~(o8vQH|95_N6^4K}Jir5cNPUPHgPdzJ z4f>3UMDK*$de$!Cg6FiwF|h=sli31GQoZuz;y!S7AX$LZr`GjKJ=%A|Y`q$Kny*R+26)G>X(8TuGr6WH8q zG|gZ~kniIq--VtxKl)-^|KPJOd%L&hJfF9pzZ*}9&L2eSx%Tir3L{au`m|RkGyLHb zJ*55udcFp3{Yd}wvj&3`zNphKf#h{fXHj`g2(WbO-b}sbj@JnVam|6dW>hiIgBIZd9&zk zG^7k8(&bQj4n8=YIN+a(>+AvnWX>Hp3SV@B7mjf3627y;S1yH1w1>~cCXfnEEl zOIvWKFLVWm-Dfvr3Vw(pL(W(>z{&+WTK#mCz{0r<3LsrS8DMMe50Cca2)&HVn$u)Q zJz3Xjq#2FQsfvz#VfZXfdSxkHohyOCi?{YmC-vhkeFs;Kb@>t9wCD(zN0-B4f2AD# zY)E$*tlZWG*_qV|4~8yu&q*9`li%RFa~aZaD--AdJc!OW(aV8rG3w?De1^SuH%V{838osGY|$+Vybc@gSnOUZ@_$zWu! z$Rn6x7|(EouCL=XR{w?{(kFKFn&U;z81d&2k|E-yxLVIE2(C99q-=x3cg!EqDtX=nauT#nU!I-TyuRg?NojyP85E`3NA#;lnDe7%ti}k zI_rKJ?=%oN8oegUHRecp>RTSKQXw3KKm=rBWLTr^G9X~xOP{r^ubhi2tdy$VNJnp_ zw*#N_sYyL0#Z^l>>PYeoYg3R{F%2L8mE4qwQ+dwEN8s! zyvD$TeU|q%G$ykNiB9~q7StBo&bH47(>5aK}g7)xW>M+B38Qn2b3^83H69NYg@rZnfL}QH*uaH!gF(sUGzQY=a`e!y${mX(aWRuS5%%( zq<`VBqG{sFfmWOjm$c)2Ad~$boCPj0aK>a6=rEP(BL~Yo0fvkoQ8x##8RQsv{id?e zrg}5a!B_iFuJavDWjrl8gKx{3(f%xsyvct{2TY$&-oJ|jXC91z(mo^{xzHx<*o{&k z#|~AGrOhSombQp90gp0AV1yI!-`qu~gduCY0>AsOzw*`b`l}y}i*uQUv)CyU!#BoP zzxMUOZ7byjw1GuEoD+LkkP$kTUhFEQz`{XbN1$7#_9S}BP%~TP*;V=jmIw(3gGCic zk5`};V=@pd)ph*E*|@zlrW%3HJ)XAh2dvp2W1lr{o`xd9A3Wr&HI@>|O@3`37N4S`{M%dSFUGD009Lk>9XMchauO0h)7 z2ozb6%fL9KUe4kT64cGU$}@dUJ2qWNH{z*EW$_SaWJ1{>V*8%DrJTGkemUmB&}n=2 zIn0-OEBxsLoKiGW>Y|mxADp0!l?TSECbI^A7%W0%f`wVgowQUXKxylTbdVXAQvAp# z0tmqQ?%Hzvs*`P^Wb#Noa)MU)!uYmw#q1rUi~{J4;Lw=xHH{xQDM>WExuh)Ou;dvG zZLUDwiYQ2Jmk!3MLbpc$xu^f?qWIvC-zV}$Cv8%89aad;UPpX)urtm+dNuA+mJOQ5 z$Zf_dxJf=6X)6Mc{ZU zE1xA^g|nFrgwl6Z3XbNSgkoTp!<4LE>U!!u_)yw)_27f$0dMd$pLe@>ZwX~Rmpd^8 zH{tpB`*DOtHGyjyc*qaU<7jc$_m9uUQ4}8WL~}+6AL7Y?QhuApoufC?@pJ3WDC^La z5pOCw^jaF*r2{8bDy2*}n6RZT%4y15+5tzL0h5g|k_f6!dA=X)?~ZNRpTNkmHirii zJFg&LWs0OJbEUjs;}PSTCjY{pRV!(xFzrO2EnnaShL#6^@ICd)G?MNq1HL*VfsY}p z10Vggzh{@b$X{UK9C)5C(4gV5IzOqSo1_F5eIw_U$JDQ0%ZJrVh8%YB)c?+JFl?6N zG`#5D6I~{Ur_e2Z>e_n-p7Q|@DQoDUkuvUtbQ|amJMq!SIUR_#jpt?-o?rF zP6hIAFOkbcuctO)y5ZQ#>@MaDFk5MaZVtaI37>>uurZ+zqHbqJ03vnynnj0upMfhZ47-0DlXIeH`V z!jTi`>9h%7LVQZmVH}GQqfGK_E8=Nd^Vs##>vPgx@dkU$>s4+yx}h{F38^3m7i~&&K!navJv^S}j7}*JyR?BrR0^>o zY({t*E=UX#(k7NSPGm1<%F6hbF>$GCGZ{tim;#)3)idrPa;9tuCT|c zA0`b~l^3QO@FWW6cLZ_yr!S)PrsK_wy^nFuZ)tN|wZciG$0NOlk%Li?WCu)Jfo2gx4vs6@%C5*ApJg`3T=; z^F>(AUzw3TW15o6+?~ z1CiF~EHWb_FoPimQy=sR|H~4RQM14)>!$UCGi_;;vr)auiAn=!F;X^^QWr<*%h}j* zDmY2t0=t9JW|-l6I{H)prS*L0bVOeX(jr^>PKHIX?xBgk>l7Lp2Jmin#>y+eWd=~4 zaca;Oc-w5)q{9pi;--Vuw0(Zd3Eo9-nMfuwg)2sGx#9tT&|{1}T+-+2q#GRg6JOx% z(jmX`hud&kya%6tH&q{C*dQ4m!edh?PK>z@vWI;OXB{NZsE;V-H@lXnZNw&8rc=$T z-w(g3y!8hT-8FPd2cwrsa_Y#xiMt$V2hW_)PR=8bVNCq$dCr5ZfxaWKy<@h*+s*8z zgt=FO9k$Uhx6>Z_Q5=PZQ9gbDMd%iNq{h?}6qJX&3K>~M?m>O^w>N9*uSt5Tpw~ED zXeJozxWAial)^L(cV~;HBN~W!2B5nj=(@A{R#szZ%t%i;28{Q}i0YseCBZWu|_dF)M`T z#7yI7Jb9ti(iR5jwvH8wnYz(0GurJ^)p4LOz3WawSmPeWCf&^dbXi3rk%PTNLLnH& zA=sFK(Uj(~AxP^8Oc;Z=X||_X{gi|V(WE4^WKA~FbMR7*1PY!oLz=6?W|-YqCkF&= zWfCwHg=ta>hMwEIuGK+;+irvux=`921d4Df(Yej2)S}}qkp>#`sJr<^+QIl8Up$P{ zv%5YXcGB0M{pz@hVrJwmX(MEj2YzVtJl-IJM0FFV=I0=mq;sD^e2^V;BKEV%mi3F0L zoWL}vph_g)$wO36PML^Gae?@GV^`YMBPgSYi}(=+t$=QNjf+a4>?R)|UtNHK(Ye)Ki}})G-~vK!DBxxTk({ zs04ZXi;n`&+`l3UF+enU$l1sbKGPmuGc!qo7Di=^ix`MJQXaO+31e^KELbQ=`pk05 z$?J0*cdmmEu7V6kcaHbB+MLlt;hhCZ`kV-_@A}9+_#lt;6&Sok2F&o<*QC-n0Txfg z5ZF2Aob6^O(;g$*O}e7rx{Nd>rMFEIq$}tj@+)0`ab~7>_&Vk445>B`6eq!9WhOja zofv>S+z|Z@chf+e^V@e0_C57RSnfzRsKkXx#6s!q+ZbFpCaX7b>hY)D2;m$4rc;$OZKl)Vks>qKW1H5Z0|Pf% zr%NAXJfmav1%0nBLW|V@{3!S_X^%6+Fo*8~Yy9D6O3~fhOl29aZ{p0PFLPP6`BCXh z+V(a|_6?(TeiY=uacl_Mk~Q#hLRO{3pJTMU9=3)GGo~{+XY^&v<1qlH^I?FkZN_lU zH19fb>Dw4T%)>Jb-=;191qYCj-c{gJM=qosA)R9`l!EBlJq8Maj74)8I1r-ht=$m0 z$Pj@}Pe-bLHPO;Tlx$U2kYfwnjYS#WGKZqeQBpU>P-E*|$BREq4@sDaz;R&C&ZF={ z5W;T4A7Y9mAe&N0aO=hAvN7pzT4s8=A{NZfyN2MV$kH}J$ABiRHRDlYhyvydAv(Dw z9jHRf9bqpVo zJDeFxbh9IqsH~ePMP8*VJL5NSJ_eriS3BeE!^80q!Hz7%$ftg7m(oQYisx_QyH+ar z^EdH0Bla&N1T;vQ8o+!vo85M=jrjdec}wS}Lm-OJJ=YfZn^F$1xCSTX(;AwT3(mn* z1r;!~(F=$^zW{Bv9hq44ph_V`DKB>%TA%WLx}Pq)?~B6vUz^die647B-CPBSI*W%k zv}niuRG^w!#tCDJDZh9o7w#fkpS;`|SCLgpCJ1SI9-YbKc5t`zy-&yJKJTI?4yFlp z=7z)wY^@FZt5=~ep6h-XcP38F@p?Sb`5uwaMxi+w5Jpm&>GZ}h#!%Ftz2LylXuVEn z`eCDw>JIb{PRNqyMMadJ6*J+e@;Gd9B=94CU})e;L^-pHQKpd@FA0)~T3f8QR;QWs z=|Y~jBre7z_bJ$}>WL0fSBKbY#h9T<2T`qqF>bcg*0Sv%Cu2_7qYDi!sAn3fxt1P2 z;Bh189N&HFj%#P9r<11&vF6fR@Y!q{S&32dzIOo>dU76|E1`{kqbJ8^xdH$_=m)w$ zUHXP!IN|UEZqAN_4g)_}Z#cU_kZ0^cV2%YE%naVt8+3vCniW!4J`EATlfE|Fp}v&k zh{#Y(r$f5|l&uJ!$N>AH{Oz4rEnfv^hHYY4WfP*4^?|d7-{@UVmOdJn?=VkfSau0s z4Iio(PYFce0Bm-UV)L-B(;r@Eqfam-iuR(4mS1ECnr_Y?$A)mu zce>9B6dl_Ro?IhrlmbQ&p_Zt*pbkn2qb>KL4$g@54;m6A2f9##vL%zbW;VoT4QN6UEDbqcF#K?N zmHr2oPV7rNXrpY`v8N%C3?FO#C*?4oNg0j*{~6gj73Kf=H^1dR*!w%r?O(5mP=@{)_k|V2E9zt^lLw$4$r@piPQ*ZTIo}(+= zqkK6rvSkbmo>zw6;dqk0Q?t71jr`#T^~*lcaXb5IJNl^Eqrin=`Y=hzktS*o7-dv!ftPUTVv`I;Gh$u*>pM?3@hnB!{a%CfK6s37wX`_o3h|LIxu``*S6@$ z{B{41@KO2n(Yz-#nZvuvF?2hIZ$;$6J3gal=|e*Y_*39OHybK>_wHQ-8M<7Gy|ec7 zHzQ$sF~8Cm&Ya+^!w-=GG+oZaNb{lV#D{k10Cu5)L}(`?Ak#53xzT3nCz$nbeLW5h zJCVL|R16j14Ne~WXz2Fv<*VEe%@%s9`-`NGhsd09c)C^~%c(Lfh(_oL=j!MVj44m2 z!fl!YGoi_s04Tzm>8I(D)|lnN_m&Aoxi>8pZ&4>qP_vhF895CC2(#6Im%2RRX$)LL z<4`<6O+$yN34L13y%?r2CyyjJPDl5{M7BbNJSi{25TVoo`X|5ZIhNs5FJWM$>uE-S z5h0hGfk=C{sl+UZt%6JMX-``wb%+fi*|Ip%Izr1(%<;7_Dr1rM2n}ya8w8y&G1M53 z0dTMD--&NvnvsC(&tunq^U9^ZD(#%t@ea*e6@7P2Wtin!6p}LDqt0{!O731)+~9i$PdSiV366No7&C z!T;wkx4X;TV_@rqvQo;4)(l&CAy-pvf7h|>b;1{1RRG;rei}J{p3`=U=DIGY?% zL&z5P=YbO9Nc~{1^haM7Pvo43XY~P4Kq{_s))5I$+(sE3$JuKdI=__pcHz{gO_pwSr|KRDAST|vRAZ`L`LTpd?(knidgLD5^5pT1ZV zCC2Gr;D#eQaTH?~o(9uijCzeu_{@9CO(tXT$iHku+bJz0hpFFquYTYeXl8i3ZE4`P z@fXKh-Jqv$I^m6BN$1F*IWcy3>-zEZtJ#duo?-_NTB29y9t6$?8)P6bkay0LXE;9` zsBQ=peB54&bT0~*DAAl8Q7IW`fI0fhY$W|d*BY*qu`4YC3!?$k(_$*pH5mf}1$2!S~da^m||mqO8zpiac^8QfJ6HnjE$n z97J-`V6z=@bU44S-@NHO4)RS$;rF>;1-&?jr|?7r&^+7O^Ymweu};p;Z~6}|oM>Sf z*u+Sg2z2E%b3Ewq?cIZ16Iezk=MSgC-BuhKbJV=sKx!Yn^d>%Vn6rWZIczh)K(}ej zX_q2!dv~`fZXVfk-7;lmZ0qXcy4UKd<#C&}Ak0dHsEUrlpioOdI%_h5SDa#)65ElR z9d`{ec~G8nOL=|axe!p}y#%pioP;aLYcv|9LT-&vkaQh}*4dV$pi+lAbr9^0Fm*CN zF=&Sta^K`Seday$eywSoyTU=tj8;t;#6<)Fb4gu2-g|S~Rf)u_?wD7EC4fiB6Dg-| z&c&Pr!@0Q$5jZmDIAGcswsfb~fLk)1!wU-fIr~sk}LJGQbAlwT+ys^tz9%{jB8ND>Y_$F{nWvsuH z6E#OrupMEx6Cj*<#$i_LRr+SW!FIfRn;}tTgnN3iQOqgFxgr#lwg{YZDE$}b!}E*r zSz7z-_3pTefIS8$6tJ=k4dI?ficn55P;tHeoLIb*^HK&LDWn?9bfBQ74o8h+jB=mP ze>JT6tSN0_pX$$-JfhrO{^pyANo2?nryj;8pUbmtw|(WfC+hH=I{SbAa#eM~jR|zd zeA^$0PMN}xXFV_` zz#qzt!?*9o{^xJ|f*Ea7Sl!+=_l^I`Y8>oGUh70tb_oii*lN_mC$dvotwIhS@Y8b4 zx*M*LsgylEK8*}sMM2GIhNJAQa`TSesNKp(tC^_ebNXzvX9%* zg)Y!9uuZ=le zufn$%0eLS-pl}BU&Zq3q z+-`UVC(`ILv)z?0I<&7I4}5(MZ5%Z?X;wS;Pv0M>H!@J>nXq4z4)A~uo%a;_qtj(* z3OBo6kDET7U!E17>f*p`8)G{i;u$)a-O(p}Bx_+97A?`f`Xzv%ckOMOw1R*`l&*?~ z7fcZ5T#MIhoK!R~U2KOPkNz0wJWXMMJC!1al!sT^K~%@`Aty{!&o18~LBye>X{1YS z7(z&H)FZ0Or;bB#$(~Nms5=Nr8yG`neO3)BW{UuU_0?rt0<@KKsa{%lw z4M&DLnq>&w1Wmgp+4Oa=dF&D{f}74pj^I)pgapxKK`@J~$BZt#wM`%4D%eW@!GsRe zxNmhrVhR`k(vsR0af62v=z7*LO{%Mqm^jx>hN?U%o1iJjoylZ==TCakkPCVgC+Ho- zQ4l;wP603cAj(G_RZLL~aMH~)Ql2wbK3gb)I(h2JU)Ry*o;T-Rr~NN>63M@bM;_7i&2Qcsj$voYFIq#Ppsh3;}d@(=yjG_u}woiE6 z-PW&c{tuq#xP9si0Gx-}pBbHeY1~t$b@ZC=c_uCNTK*tp2`}8Z?w22MTZgAduI1jB zqO-WvBR}xQ942u3mA~{MYCXSGJ4r87&weWY<(c33=HzH+d@6GnxL5HT`UdXJ+v~CY zgYS>6@MU+ltZb1nM#R|qbkb#bwqk%82Jm&LCeB8Oj#8fk57e-vjfe0qm<%(S=p>?L z(DmC27R$)?QjTh6lYs!A9A99L#r~HRo14}tJu#%$ei$|Ni|rKR>Mu7KZRgw^NrvOucEM`b&SnIq4O7g%1eHfo}AZz?L)0@y0v! zl9aj4Yd8{~fk%!HzMeWDdOET$bKIaVbm|5_fm@rE{ygI~vSbuLy?l94{x|u~oHBZN zbK5+xz@F!fy>koS;m@L3YfI6vC7NR5=lc)K}m0p8F+ukkqlN0Dw5sG5M&lO6LJaIff9EQy4rW zsV>Sy2RzrbOo(rS88-poWJbO1NME2aJ;P;0j#bi&f1ln6=3XiB$*Fyyz4#WK^vgHsm; zNYMHchbT_seR1UlJfR^bPH9Th6gELXJ3IsdrAO-P9@sIsZ7cUVX71x1ivI3tb)4t^A4G6|u(dMo0{4?) z5AcRZxEv^CM>zb2e#^h|T2CYT{!!YFN-$9 z<1N{C)e@xVVb3atcbv1@P$j(j{?*=i%PD6#g6kLIqpcL#_~f&({_bS#G!mec=WO#T z&V}Kd*|C}K?IgD}!$28+!uM8swEy|5Gm?K^j-(D5ps;?8Bx7}(cF}P!>YxPT`!4 zMHy4NutITq%Nu$#1WTu_4!JMdib9li!ha=gc(@aDE3eZqfrkvCFM~}+)el;)P2D>@ zh|I=lrf>9|NqgXQf9j{SlT+pn9B^WWwuoEiQk!_XDfr-y{HRA}qbm_2*PUFLKl2Gh z#$5*a%%F4V19)iXI{m{Co5;#gbYrH#+ekZj#FO*@orw1M$@RlmQr2573tl>s?%@!~ zVqV__&fpDwWEUszz#&ZFv*;SK8oJ9Sba`F+;d&?W20li&#w+dXBm0m?>qyZ<_)K;i&vEy5=&?ET;f+ItL9z3@OOIL{HM|l~J_QR{CRgl|FQZQTk{(HC{YFzbJhJ zT4~Gha}42z9l4A1CBT9cx*X54XZXdcDZ@sxtD0j=yjE8^P7j?04*gu}d3J6FKGSi6 zFT@a2#kRYnLE&*=Uk z9ZVY#OAYEgf*NxvbGWwfp4Qf8iW{?I0I*r-ef<73-wEP=8P%+G6Jm_}aRQX9(F@pR z^uQuY0l$qCcvK<<3Mbv1_{eu~O2<>~^-_Z$jEu?E)v^8j)*VatuCEsOYxEvt8)3ol z+XOiV8&rjdnYi1(A7_&0g&GCXmFmWnQPR^P-=WM*}JG2)Q zQPLN*rho~Y&1N_R+Ty*UWx7)QyJkqnL>|8x_wF?SzA!#MxMdvD+5LE^%Njdhe3z%&_HSd*$)txIX zH;>krYmX+_y@{fP|M2K);9bx4{W$e|-}%8f2>z|)5K%9kay-LO#9nq{kb2OKk;ji! z&vAUaFafZ~d{pD_8PBX?aKIM67=q`?MR7UEa z6Y128&pFenvd=)b{_XD1b>f{Hq^;28=y117S7psiY-RA~b944QKC`KmYyrcsej9vs z_$~U^>yH*JFT-87}>yvSXBQ6Kk(Jr>WmDzNjvZ$5HO|==BbCt zupy2a9F$fmudnc1I6`mHKK4?_bm)Solw~L#GKT0@e(RM$05vHC57kwv7hcIxvy*ry z%;=f&PH+k44&?8V0XOv;B_6Z^YfFy6UQZXsX=RC6qufR`($j4iRR{afqyR5 zJlq9BxUss^eGJ;xQQSu(1GvgJ?$KDxOa#oaO$D73(0S!%aSj7ak)eZOm&| z-f|%ftgHzy4-{jNwIr?=DA;?MlIUg;i|cb8;`CrTR+CQzA;g^r5N4GwU#8~PW4ODF zAx3?B=V0va9Tv%GgK6qDg+Um$8l`w;C47|P+1cD?u`g^0e!Ao*u=1#*iz;mOxKal~ zQ_eH01>a->jsT}Zf4aF$;4=ePip|n10%x5yf#D5yJdB`(h!woRq)n4$8sSFRE&}6q z&dw1aY!Mv9wHLumJz2L-8S%bNkkKDbMTknE!(95$Dd6-p-Nw;KxyyL7mfK)ceOb$i zLDlb}`SviAH7vWC={s+!LYrkuopaLVMa4-Rp74t0jrwXkN1K^=XEudqe1Ca;Ndt8n zYi$-JaHQ%mxvesJ_>4Pr&v8xTT(-f49|Az(U8K*SMxp#p`u6eO_P7oYnRplAIw=pw z;2VDwMJMn09sJa2I#U_O$Mnt2v@dBFFp>67#4AS9W^PEcbtY?;4`#Zr6fYHjX1K~KltHT`}|!TZqD*DHBb3d_%mu} z$hR2i^o0&+nm9bIoCDpLLq_1MvdpJUAii^OfEks`7%X#Pw!=F|i9R-K@FHJP)HW*d zG8xRSC!VpsTb~#n!#Vg_JM@)tX>Gw>lw0XTRv2?BeMY|yeXjRi-3z1U;AGNI*Ufn0 z8IkJLJ&Ya2Ss9CQV%HfxSsdTt(Ec6EV5Lq^;8F+Y+GIZ2Ir8bANLTdA*e>S=^>w0= zH{e)7yjEM7y)tfJ>X`y`;f(F7~PeWHRd5r!IR_ z;Dxzn+fv5OMwtQt__@DNv>ScY&0!7>rvafeV`PJp;`2W@RF_KWy6Ff`K47E_X@RK^ zrObNn!JVKHrGmUJ`RgqH=&`PJ2<);Jj6MW+NHjXC^0Sbo=`20fkj+4B1}fkY;o6W4 z?{aSU1OJ;3U*{PP%yi%kk?JSAB<(K<%){j!L%*`gchOI58eY*QJn4;s#^bHLVn6ME zN3RN$!FPRi-kn&lFT)Q3f0;q3vywi*rAz|{hE28pT^2;-9?C?SCs2)y2mmK;XS7cS zI1zOQV~E*0xab_ToZu!00`R#af;@%*(&JkjI~CT;i!^$16@Y_?tr$BIPY6*3nT9$s z>^{VlUe1|I+RcB7lG6bU$os1T${z&hR_I|e1wfJJvCL~$HAcng^`_D}9hxbbna(bd zF@6X(C+GwQOcZ1``U_l3*rt)dAd~USy(xblqjhq6URXE@XJ;mea8mMI{-)Px5}s&* zQJxG0k^0vO86kjf@T!-Qbd@{)#Ekh)@$tSfrnRb+6y?HjQ_PeLupaWC2`)G3$GKE_ zaBU4_sx5=7*U4k8a}zG9anE6l9xfTirY}dvFqd z__R%?dmXO0zh3+%7>StjEUKVsXC4P0z;{PGt^{^dhC z9cimJIloJ%e99ugLw>cq?=6~wu64ql_7RmVRKRk*e>w7-a+?R^nF`!!^(vcqaETPo z?QX%EcJ(`La_o-3@^X9{Ww$CS4V>#ax4(EdR{rpN<34ogW*pm_mH#U3v?ChC-}CKl zllMxi@bnTUzh!$mQ3|Y)Y5HlxG~wfna{{YV>d={)Og=?MGdsi~W&Ak*0t-%mv{9nC zMBMP3^XgiLj?(*aMsW7=seC%ey=TCo4fGEX?GGhSXE5H5NL?NLri@dMNXsTvbD}9n zq6#zR((mvl+DRodLiE`A*+u#yizd?(>IGkSiN<6B1OyEJf~rjwbF#=E95;O%JS<^? zOGXzB$*gT@&(ANb4>%agqM>@yvFa{EZ2DXN#%qqihZ21eUdL@C+mpWJ zXgVhPEVIVJksX0}UJY4_6HXZ&#G#Twet1k!7+ZiQwzf4(AD=bIO}TD7l=>RAhgU8VTp7xs z3-#X;LvslX0m)zq8aZ#uaw_ZK1$K4FLecw%Ip$_>b6$znM;;#OTGFkY4m)iqbk2CTz)5p5EIOI7$e^zj$F?c0AAkOqirZ90&uU zm>oh94tCT{k@9+Zn7mnxzyqf|FgHU-STGR935kgQK#_nZ9l;oLQc)sfhPkEsS&iLI@gIM4#R`bQgRXdq3h3z-Rh1w}dn+{kDt@U*uIv z6f-wk4?`)7*|cw25W-SwuJdY_o;c;l$h)WS1Xn-GsQE-Yo+Ky6q(tR0i%m_?T($w@ zZG<*kHsc7t7)!m9dB8tmKD$H}H*s9h32tQ$ylWuH3oX?#Cx zf)bREwCl>)-B=y3j&{e>-q!fh*6R2qk>|x`Xcc(y?GrasPWYkzG! z_3K;9eEApZKzPdH(;Cbki)Yjt9&F{Ib2=AI82EE84Z0UD5%Ow>&_iEbpY4&J(6-g( zKf;qbW=h`0z?n8%T-)IA1fh+5&6n7Kv9(MXb16Rxt2*YNBcCdAGiB$s9DRV|*GSH= z?hoGVjklC)c$R_RjO1*ZnRLXSjN7}J*je7O56LJIhP9o_$kz@FtA?P*o9(eIP17bHl#-O@3 zZPSTUuHhqkI;a0nJywiAfO0<1C1V4B9jn2nE;T!x`c1tDjrvBx@d4reE4BtJd z(PSf1bAf!}>r3dyUX+ z?$tTL6nU0cZQQDp65=^AEH>wnRz{%ZEc^a}BY*o*Uawxhnx0<%)T2!IP}g+&EahCI z(4Q-vIeU735ux7f`{xl3VKFPln8O)TPcgdryG=i&C8eDXb{R;{)N=@H8QXSYyt|nx z8Y!&`LdwE{df*AnaE%2CLYH@>Ka|*XjzE__1$O<{Ws$;s82$i1vjaR!9&PXCj>--g+Yn8>n<7MgQ7mf9!}w8~?G~qK@w+#i zuIE>}=n`e_bSMUQ^M+#XAyY7)2j9L*p7 zXgq)ShaKnKjGW3&;A2rAhY{SA5S}zv-Y7HlVx%U&PeWOylWX*XtPaJbFX+md-QSBd z8^hG>N5GOQrR*6xNKi*n74%rX+p>XC9TX@!Fj`%^pK@Dq0FRC=XWE^($@6sv;34=S z_uGkr=!EOQc5k*bBb;+O%A`KErY;H{+>EqSAEyj(IO(HVcNAy))zopETLzf{q04m2 zIK7nz&`$Pb{+g8tLtD{eQys$%eKlx0(RodIj-jMa;FGTK>e9Y4I(o!-{s*rQ=Wd$0 zHX}o+5&C6Dy!wRR#XDI-tH_RngT{G*_q5P5@Y8)Q@+|#=_tZUMisO}NU8-9I>Xosa z4p|c!gfv?mS$~b@^O$lt1Ey(&@wPcUwq7+SO5F~2Wf~(q6x|h=M76G0e#!@km^&#) zo;d*>^VYBJ=#JdygvxMuE1SNU>tIM?>Rm%2lXpbZ`qrV*7*`GrJ)>OrDhLe_%-$t$ z-W-m@!~NL1z#9138237vG~ThyK{RCL7w*b$N(62W8JdGw;Mw7T;0qjZDg#B2O7Wi_ zd(HY)9V7h zDKz2Y&6`*CzB*a2C-2{uindYr{sybmuur7mX)>cGgFVf^u}e&j+hgM-~@ zG5Gs0esXM<_va^CMkVEp0tgIzZ0GEBC@m^ zp4oVRGFE^8+he7C5u+4Y#SeZghg{}rm&pVAFf&9c5}=lJe27eFqmz%wX9_T&3`FG~ z2tig2QJ$0n7aVlSR!-NYEyKFu2^524aESQQZg{DVMJ~+Y786kCq)+J7UJU@c=Ysh+ zbPD6j$STD6PK?4!F{JwPoEIONz{Q9)@{S>=SMagElABIY4fJH}?Bq00h7$Qs;ogPs z%>$XnJ$2_9DQmc=n=Y=d+O`PLj)41nf{vT=ejSa#ZRucTEBr2tXEPd3PK|adG-KSx zCk!ii&Z6hQqVMowNRd37&x6=_cNr|@cFvi7%+(q-IPb<rSxIVbb8tP@z}b!kxZLv7@K?2Z9mNHC)O2dNnNC ziP#*g{CBHkBAM=ID5sP3$60aK}rq{)wL?9#7#+!<` zcoQ4>{VE>krX8ztQ0jysq)O+F6YTfB?Y!@$*V=K2{3(lxFsiy4EA26a#v{^XnG1tX z1srM0GZcy80`K#6ugl_sXaab0dRd}VjEy?9lfDsjuy1WkbFW6g;~f#$I2$m#^vEci z6t7@;2E*BtS^Ho4@XdJnaxQVGcbYHoBm;4AVH|%(3)gw}G7PvKrMRDZ8DN6ZR9lq5 zX#|$1N8xomD-BDv5z-pgTo(awTqxD{0d0bdDlFb*`Yn&x35jU~li1U_Gfl$?oEc7> zvNJ2dK?>kG&Bj-T`QY4`cfskiVFW3)&wn!@IXFOlF-`=zW0w(9AfS~Y7r250U!-d} z8V<^Y^9ZT<0laW9jY0%9eUk+`+}#=bhhAN~nER0j?t+l}I0{!E9*(o0`pUT2Pyf>1 zQ*h8(_NfEX!2jhRpmOy8C>21?E50tj{TGjkPl|KG+=u$fK;>c|?SGhK@tx_K#zWtG zhHvoVRHDvhN&ioHzdXR+Gxw1Q%7POHXki`xnKJkz{7Y8y8&zCy?ch;IK0ySB-mrJ^ zdT;!LpL#vs1+EuSJR7%HW9tvTJvL&jz-=u$TH`s&oqTuvGjc=btTRV5nHv2dgZR>L zn@COsobL9X`oPx}CFxK%R|!m=aUNbU)(GCdfQr!oBmCqKFL8qL8s$mm;IPqfWQ&2P zt7N^rm5(u(#WGnomA1a>l)!|)=mh#fWXTvV)0>4iEu)R^`f+g{J;7+CU3hn$lL8J= ztBj_H7*`P(og?c7N7^8(jG*ydzrAMl?H4D}1J^;y42tFkEOAf+7o(R)3NPNLi%s-e z(mN>BrSvgv$KjI77q#2h1Mcg1{6>e)(}jIW$y@lUs($1%|6Bn$Cqd)BO@@Cv7m>{ zFVYS?uw(4&#`;zuW?#3vR|sCexs9`vAj$9y+hNu{UM4|xR_Tx6kzC10Z5Tq%Ne6+O zt;U10J9zr^*c@|=W(xOS9EDUdE>Ex1Cu=OXYTzh?(=);lM$0o8LF!Q*ssXDBAG~Kck&%$% zz~IY%5t`0o^jrvwprYlw>)UZ~usaTqqyeYmu?7}g7~|sHWI3s+B5s_=i^m{#r8^9~ z>PA4(0%c;>W@uJsGfpTv=S-;!?l3z?L3*aqb8riOFmaSBX!%X)Nd+;i-K!vQfx+ZG z9yx{}9Op6o?ls*SSSFktF-lLpG2rpu8SvXU9bEEeYp6XCcZ!-(@_| z5>1!hvk1^Z=uFh9V}q6}oX9Xujxw#r(}oE>PHTgk1*p)hjqNywPl?`-4>rc9uXo2u zV0Z|=8p*?F+JzWGsHPq?pARRamp1f!8eGc2r(z58K2;tlz(cz++!t_p9UZ`8}V)9`jrO_dP{>DgD-lA6-3=lcAVK{>S$y1J86KA1>3s z($S}wZH#~Nb03ZWZ)DQuHfvEDE8qG47~lK2FT+syFp!_MUXZNsPa}4k$GB zp|j;yWToTU!Ff}&d6rXHgB5wP(MqGTK)`XJ#2uHB3!opR&M8}*{F%`yZc``YT%(=m zr`$zO&^K*#^QX#BV97m!2Kns$)EtbY-I+x?iyU6Zc~u_&xvoz|Z>~uLd)__zW~pCF z+XenOr6N=1On5^%x(|QOtXFW_enx3?NFpOL5~pXEbp|*ajGMX|zyvSk=`nJJyJ`T# z-?DsZqH{a!`i5oTg7LsJcZpgtHaR9!jC<=z-SFZR$&nYjl#a2SZ1?DBti`ay|zr~6X8#L!4AxI?AqcOm|LZa?n57ZF{oq{Z6T}1Kl*|b#38aN z8XDG~aGvgL6&!d%Yiq~psfWZM>v_v~;D(ZEdN6fKh4aSighVNb1n%NpO07951_oGNwvZ%jdx?B`bm|hN zTc1BYUJ6aB$_fJ;UIbSQWdN6sX_)<<=~u%m1VWm8Dz3-WWgAGZsND%((smg4HVS(> zXq4#02byzcL~#z{uMB(yu@%hAYwzYKH!kMWng2wNX7W;w_=v(bd}79|eqE$LKZ;C$ ze|KY?gnu8>=3^d|aq?EJ54|V2TMh?rmT3F{Ce$Ow9|MRf+7U%N7&tD#{>%-#b{5G!@hiM%D%pdbmQ_nmL zPns89ef+Z@jsN@4ycx$a=E2lhW!V4GH^&Rxy@sZGL@rDQG9;ue8+C}fq!-DJv?GT> zS{#pRqe{E9qi`6Iq@P1` z_o9MJzq{xUb#e@$m2R56u$4mODD6vSKU*#xyagck=+jR=tA1y%ys?r~V0@pGz_GTB zmxJ1jOYj@eOE38L47p|a!OUS`$o+P7XVlbDhb86MHhec>vV>oqm!q@ z$2vz2*}l#<$`fQDRh54}{OGHx3txve!8e0$8)i1^@aR?Gk=a1I)R(#iO8CDi{glt8 zJin1zQF`hYcCk(geb+3(glz_T;fJPb1Hk^_eh57oK5kWo+bikjMloTMT*pYMqn-z* zn=h4^lRJ#Nn}lVCquJKmQSh%4)oyJvj$wk_hgkI!L|&=2oeU2LL*!>-9idaM@9++V z0nSUxr4leV0?!lzb&2LNde?G?prYRsEroY7%>>`aJRobe)E^UF@8Tdf3Xst{NnAn{(t|YvDLQ}Mj7O}7wK!a zhYhVJOjdPlMk%MS`6)dpV&wps6vsiHnW1T1L^TfM-0;)LQHCzClDE!piGu(S(!iSd z;Ap=?TQzJHXA*U=ZLa?&f*m~fIS z^Hgx#q@QbWV-8K%UN2@yZ*JMJW;zlaC(m0Aq;G4HpQ-p68`0%-mcbx0HuNwJRsal; zc{D7;VduygPK@)GKK9L_<-Is?aj*eYS~iP;Rx`+Gy`_WxL?$Eqe#j8Ke|KJkrY-bV zzt_4teAi!nG^`?muk(?%U#KI8tjEl92Jg`&htU&W8Y7!XA8>L+sk=M-)zfrIjcM?Y zR-BI-?VOCh{YE%u#>cIJmtFDtTLCNHsm_l6l9^seMxMoowtig??q_zS@At@e8{AaS zru2R6lf6U~C~DKeM(8=TU!DtW`Yh@XLUNt+F!ePZM@NI>;yic@o%eSSYOA!#DLIYv zcaUp`k%3^mJY*Q;@YSoz4MX)9XPmvX7tO8L5C_k-i_x#uqrn-cqC0Np&3 z( z!gQUnxG>-d&7-L>_DF|Pb!Sg@W!ZVy53+!q=LD*& zMN+0I2Q4`iA=?jrarnu9v7f9^$YIM;NTMZ@VzWt$O^R%`y1TjxK+ba}0Dr%43*Y1;94+JV8eoA>aZ;kllb z=Wlf8KL7BAQpg!#hqURVf9HSlB5&D;NALdG|L}XuzdQ(EK0hpPtWWuW{%m>u{%qN1TN#7EOW-cc zi-@XE1?b{}ESDX>>0-@N6Ef(e0m26Kb{9mxP|czjt8A}hN}J|wtx0jvhccst;Anrh zI8eu)pSHi@NCRub$(Y%3l_`C(V^uEp*>-ageSkBj`_RY{M8)#il&~kGR0a_xH9m{ETAhtt*&n$(P8`>_qYG9tRsRSFV3We*7ce$C~D5syFpVywyC8M6o&Dib8K*iW}YVd3=_7VBO zAG?TJ<%m2QOyoNJ>~l|im^LO5Oagj*R6318_0bdnJT-2?7JozU;F$FY)&M;xoAyZI z*QO(0mU1X&8lZQwpbQ{?E2lH~C{5b9i6ciV$B)nEcDqOqurZ?WaX)~l z9L8B|-y3jtFKpTu0b6j{3@bE}<>;4n3D$jxknd*|FokD=`Ps-bdd5(V2aJ=Ctc3H? zcdIOUs}OvOEUg%IM9x)c`}lTm`R;d4maF|_oB8{5qUtU}BVX%rdEV%rE9hkYZxF7FOf)ii_}^vY?85glwYK9QHfyLapZFr*4-qe)Q$Gg!(x*OF zuYB(9`!RfNzuc#Z-k@vrg@^f_^&~_~{Q7D6?!WnZ`Ded-xO|Mxy}rCy*8ccs%ky9V za@hvxAx>WcIgb~{-80i&!9;oJn?fEMW!@DJT^k$v@~G@qd|{Zywj7W18KU^SPD z53Pd4R;_{YbVYXD|^JqO_lrwa2-S1PzE&)1%Dtuy zdrm`el4EyVFibRl7=cC^YpcGwj$WXxHkGloiV>ceL+@jxBMT0R9F);rE6}n&Ova06 z%HW-5NYZ6HvKO2&h1B&yR?|l>?Dtpg?euOs4oB-SP5rKC?8@96c>{&$1D&BSWKDJ! z*^#otZKmW+u7VOy*fjJ`!eL@iMC*)Hk5JtiQm z*K*{xU&t6lS+*c3%YrwKT$J5a)C3vkQJS9nODRK0^dJHY7_5)uUKs(QTGe@F6?>zh z$eEigL=#-%}!>m#i~< zF!xTV_O}B@XRP1G!J^OnJD?;iB``|E;a!DRLKDRvBtQ`aptskBK4a!wR6o#$7W`#A ztJTh?PmU9*?;RY}K{C`%%83c`X zKu$~Z=<_dQ)Oo&Xh2n=j=A$zGp6m-!{bn3$@6L}gLfL29iGXeI0W@i8uIbO0*Xll> zjnBx-{V&(Ft^6LD^+jP4jmy+k8Q7k;Z|l^<`&PqpnTp0!zEcx>%x4b=+snWIhue({o-uy)1HSmYnOzTR_c*wNZV< z<6O^C(ziO&@Hs>_I1@0-;LX1ZX5X+K{{VPC!{0jTv|;M*GIoIlJ-jOXk-;>m3%&ME z19<(e9xuvHRH~dTXN`&~6}zO{7~R9SqMw{Ax=oLM@e*5li^??l;8$SmVvA5Gj4SZrx z>?&;~a9XcptkV_greQ|J3D6s*ZGr^^EsN&E)#FQ7<@3(%5LyKE?)Wef*vx?#9B1tW zA`bZa8ew_oetW`aultH}bFM#JoHsCXLKq?9VNcVG5hzK0{CM7HsZ;zOb`wRQ zKzPSsJ*mnb#~M#QH*SEr>m;p4d{Lr|Ycu1g{Dj<~M*bTQhAt7TgJme7zeSR>c47{% z8O9IL>ci(d7J)?51c1$4LkmDY+TV^doy-nEcuJp45KrOx?ag%>Oi&i^@&a2^A(%jm zqxUF8Mr_WJyev=xh!kHIM?XZ(oJDSEhE)KGKAH!lmogD;pm{Itygk`pUPoS!>G6Jd zYq|K{}aGTrqjXRSmiz?r0U{`JB{3iyNv z1A4uogRP_QTZThhfUru_f05~X`@^sKpSJp`pLw?(j@_#_`M~$&kaj3WUM_V#_abn4 z3>_T&bH+)}fB6r-S^g;UT8lk=_2>U-`RXtKX1TwZgEUl=fGeHc;ouWw_u!!1@2OZ$ zRm5NYO?6GV*S0i3EQ_I!g7fHJK$Nof;V-#|4b#opO7yB#z14kJfHC)4jM=efY}S=v z`bs}!-KM$fq;iGb6z+eHPB@EVV?6<3cuc1r1CXE4lYRlT>noQC4Q2s(RWW@{>6%`~ zK11VF7h^xc0jrR06QyUIq_qKpV)s=?^AE1o@l=w6O}7U{e=QhmWfuK_yfWk5BO$%h~zaa(;dh8Ce7H zRE(hC`~n(wsN{n?4tifzWgzkU6q9|ijbs!HL}i||3^L{P~O zsI2x3g0yAa=F4G>Y7)#b9&5bHj@(a2RApATHpK<7aCy5d{lAj~1bqHRs#`Ye*!KogR&4TfM(ZN;}1o^fx)VS6W`D}wl%dRN;6>VqBSZry*TJA!q`o=x-=Zj`=Zk=d zXb_{71j_s2Z*LHZttI$)2q9VV>cOZomYfmJmWmCyZ8N(a~N2NuZGHZ*QVp0Ri`*iJ}QwI$e=#7(6GftXczTbRGo{e=F-3;1LNM z-xy?+I-iC5^nvz(T@;)#HIojIcfCQ|R+6$(KVV2Eq51Xp=JJ%!??Us{$?o#;oBfvT zAHu_DiAR)Swwnb6Gp4@Nmdrh-p1;|gzN5pTS$0+T%i&U_TtmaX0PT!xK)&?l?{WOY zPvhd~M;==0$nyO-{~!L&TZEJ$&nxs8|Lkb+p1$yhOvo9?KBb+<^uf75YHnVt+C z$%e+k&epJI(&>Y9Cc_2=p@jaHfBCEDJ^=pQ^P{g%!lwyb>m-9w@D#PRB6yR(f8blL zaW6IU=1g2?>s24wT|FhD{LC*f?(q1ippPET(cWnM3v@Lh*h}y)bL={(CPI2=L-2X@ z)8DkwH=GBDYUhmX5N$hYha*D|K9eiVl}u@Fs%V@ndV|$zyFAJ7tsJHgx%IP>Xuc=J(v;7QBDpJ~eakRy%S>$GM zpXah$T+DwuHIWY)pAl?q7M|ccw6h`W!mKT#^IhbaHm&#SG3fdI;OMw?td75}jzk1_ z+J(lEiM2=)=0+XWjxBY2Q(;fVody+j`x7+f*NbQFP^c zAeK+^@ypyp1TU&lnlfN>$+nAKC-Q;VT?~?c(Xp1vjDhp*x!PeG<+T`a1U-(z81hM- zy9F(Mgks*a4nWys=6W!eVl}c(8$hTIC^Q0rmPrC$o}+K~0oxH7e){xk`4IY|13j_M zyn3B%u5HOO*NB+4W9LCwnLZhWF`HFZK>!p32ue_W&Tqy;2^j(fQjVl7cn9+U8s#NJ zQ!X-AjHz)XOHmo16zHZPlsp7SzMQ6oaS419EO{v>QGOA=dBDBhjYQmW?%}lsa&ve` zKqoo@^F`str2;Th0#jlF0?LRJ6h%`6l7K^MT;)}|n>jiC%{>VKDSvo}CuuhPkMX2k zGS4SVd*N?e8xC=D+*x<&W0WuD$L*{qtq*>bB*@ zuMz+p?RiFmp|R)aRQ`}naSVX4QzGFtyRo3D8I6D~|Il7Xn$K;M^k5D;nx^XDwA1x6 zu@$;X?}bF2uIoEs90$n$**1GvPZrz5wbF=b0aycj=n>n-dk-H{N$i11!KT`L2rs~e z{;qb<%jYV9rqEWw5xc0E)4vlHVT%%}Aiw42D3_<#2@E+*O35+cg{lR|U&kC9V&ilS z{`G-N`Q7~Rs2#cjz^xR7zR+e`{5}~Qz28qTfsgDYjI3T)LDJU9J35iil%RbtgOur8 zv*fIDbblfLr_dKnlwD)|j>pD^UoF$pt6V7vW4CbC6f7C2*hrED+-!~=kv&Je7DrV1 z=6-Vd@cw;lGP)4^;_wj3Hm4dPI1-eMGv!nTH1yR0F?;}>;7mE4NWcH?VN?9fQL@^d z=#KsfM;pWkBXFdFZrY^x4J;xX^YZxN`-ri!lo&KI44r(2AVJb8VB_S-5?yq*xEp$I zZ?2Z>tBat=R0i3b3c<&ZAC~XGe_vgb+*A(}XzFWK0fJ-n7><$we52@5KRb!`MK9uy zB46LDKEW2#-0Zf&BcXE!*H(^(=$3IXDG>`HGEBAoS&4oV(q4qdn1O8+`Z&P4o9i&8 znSB~20A=cn>)Yk#fk9IY+2fQ`DT)mG=&cf%tbejo##*C^BKzAsn@8h`D9x+b&mMU% z8(TXWj1zm}#G@<#NHz;}IAdqS6IxgIN5BL_$c?u06M-0Ib)sxj+g_B2(o+P#kJ2#} zi_$`SeplKNxe`^*kYpvmf?_ek?eKY~ z7rttA2T*0iUHg!K1kdp7T0jwc9un}}Twmq8M7U9M?Npu#)&K~jGYHB?`HfAVWQAu{ z*o?JNYWfrCQ6!6>*76+(f;WtC7EHZb_5#clh~jbXWW$k@YC)s&m~j9rGF4VWn}Dfj z1cW!ExSSo3fv;160seGx9G*p><77B?>nrFNB-Mr>2tM{WUgH6d!h zqw9}d2$3YfDn;VZBqZ@lD$U2|~YIo=t2g2L)XbcPP#kMX;G)FtGF;KVQaC56 zy$SS9Nk+%Qhw5@@@_8KvY|QVU$Sic|-#ARK!4+jxHpP~s(rMFp0?RL_#i<%f6yONj zn(0P3SJ&5VOE$>P@VMDva8qC?!!;-i?bvcl?HM=cEqI1&?7q*+4-TSTAD*kw$_zWn zhaB+W+^nZi5hK6R#nHhD9?a>(R{Whgf4pl888}|!i!58!1^i^f?^Ku=U zY_X1(G^jiGNb88Ti+95xG}3AEO_#+)C&X#nv=KeyRN<#8CEu~4i9>V~dIV0iLC~gj zZ#>p!sNSkZamsc#sm?w(*b3dDNfm%y!Oux_mDOV>8LMeU{3*Uwx9MtZFc|YH_UZbW zCQ4wa?J#RTw1|>2k#Li(h{ zqR5snL$eEweGc3(*B-#hb)CbHky989XC$5fb5CAMjNhMMEgQM^Fg)Tkl>m(sz;a}q zCk5@?b=tvO3gUP~8597}cAuIQ8Q=#YDpAU&(?rWh=x3;$se@}S!$0jiTCoe1Lcgd} z-vWc4yBzQ!M{@Hyg?7zmlu6bER66{~tTGSZoNM4zyBbr#1+To&rGlZa0=RqgS(p)? zJT*93ot~Gt>xGv9HeeYV$)y07e?ZIBP`A=VFU-?fRj;(g(RhhmRe`!SG53(kYXM%` z1USal659(MZ7*Z{oFMDzw~m*a-+Q-Q|Mu~68@W6)L?D~%l>7@^p?me349ly`FxdGk z1ECkjNVj~Sm*pwZvwo&V|x=XY66bj|N+ zv|XkNm50w6=Y4GQ-~W&QVEN~7*O$j{zhB<`*v>1E9Z=hohg8;aHHyBvWQF5ZDV3Hift~?Ek{`X-X zkqO2$(+%%ePZ!Kk6C}Jz&>P#`Qf5v|;kT(EP6^MH<2lilNbnQT16)~5%k}*{HWFuN z+;qx09q19Tavtk(8u;0OIP`aYOZv1r+qj%%!Dg&VZiXD2WP8@OSgmXiGqoUY0KOvU~mSWC)u3G5>2VcQCrFXQxiSye`qGY<3jCxP7g3gC) z>7UP7Yo!-W^i(3{k=4dW-_m*IEs-Rv9cL~ifUp+8`&YmIwocQ@bSg5Y`N)#qchP6C z1a>-BodY(V%Q?e1JHH$>gc^PK;bwxV@R)zHF3X}xyrgGgOY|>1PrGFQ@%`Cy7d?`| zNJIr*bU=Usi(h@kHzlb}d$FGKEgD`sv_50Cc3~C;3f3~*3>GG~svI5aV$b{zW7#x& ziY)>_ESpG48C{u{&?cOm+8PX?1035QqMt@O23mwc|1M^$^I&(jQn>pkz*I$QOmuDisiPX)RS)k_> zH%G6E{(M(O&p*y&wuJ5E*v$QR9k0$>R2IONJGMmk$%02HhC**FpM zf@|I~IM;NXk+EwSsAw4o%77RV+Py-4UXvAT|5bGS3kQj2)mS2WBcdyg$ zS{!7!1fEu4UA@&wJ}r3VJs`@-TXiLT+?(cHK;{uB<9Jv^clHez0eK1E#2C#Mwm8h@T`= zrE@k;N9h>b_Ql!7`48A8Tf`$-xqzV0wI|MU(t^8;J?%b+=9bH2m-wR^V9F0>%$X8w zJbVZV)==n2#lae)>K}rFn|`q8>+8$G&G2BHJO0v{@GqEQd*Q?Vr&i(GciP4)RjY%e z{o)+`vym@d~*O#M{<5`OlJ>?fNky-+N2U2Gm2eoMa$ugH9;tVDupI0k z>8@oEMBm@rrV!;xq;3VZg9kW&%HwU|UBaI>ICX>~+G%Z0s&Wz?qp=mID;fh@xC{Ik z5xOw&>f*9akinvd;hT%UwaqQ}>vghD_sUwqm`q`|0uk;P5p0y3!aIyYG=@oz;{=8n z??o`(8=vuuxH&jkw5$VNf`S`W1KZp%F@5XLSpk}05F*AdSfmJPo6%8ZJ#2)2duByy z`s|5tAy@lffAe;E`}Ikk)6AU$^D&Hz^YhT}X;utO77+jpAUBH3-!y^41=#tZz~Guu zuz;)bIH1n&1>(>w%b<|j5FIN|HfyF}xoP~Lw*+G zk+H~DW~FcCS7mzh_9_Nz`5v5IWeh*R|FZm9`0%qZ>o*zuU5Mf^r{v8kjbqVQL*`uP zcP^VQ16&ekfUfiE|2g?yK7rThQm>r0!UKG0v)YRu_2bn$|66_j!@qnU*vs2@FZY$k zDcfHD=xF()|K%Sq|MyYs@Gt*n+5X92EuX$S4G(1G7N#YD&zMblS%uD7aayuz`apH_ zUx9QxU^nFEf4oBEqv8hqIsDmnsZ<`>#mu^(Dm6`^Gl;A27AAT`(hi>eK<9NMMId891<$6#`}bjH6G08RaJd zWopj`7oaHbTG+(_t_j_U}&3!%DgVUogg?ml>ZyY_LeQETg%#^E zkR^d=!Vr7(H{0QuRrekfcsXaFRms>P8{~U0 z(zi6nD8u}g<#WBY0+eV1n-~H`PTLmw+4l}eIe2RjfJJmHFKY@!;G8Mr2q*xsw0C>0 zH2staY->4rcf9N#?j=x~Y=UEDAOH#2S$#h|HOJ)H$Z5AzDT1Mia<*zwh$M;KuI~fol1E`6@Gj{WcoVv$pdP1HOI{6y6k}(hvNjHlR4GdUc z^WYg#X|Buow8`<!DNgr3(ej7$+vPfKT!#Mt969_|fd4;jyjs3Ze^M&YTAudx z6I%S+0U2#*pq{$w7MC-Y{!XtxJygW z$$A8ChmjSqwf@6mInyuma3vvf>@GM!z{sj+*?q16aN6`GC)cSPv1rH4$6{E7jw}bnavubu_*z_(a~|U zG^@znqY4AJR8oL_J_=hRo7i8dN*flY1{X2{!Ck95wdpvBVAxGE{;80t*u?3@X)680 z8e4y7SB^kN`PZ-_-^d8##vV+;2xhJ4nfYTf$FEhzhi%)vqUvWHoACkN+LpiBs7f3e zvRU_e)p>FD1{CUdHXKWy>tI;;hW5te5W#dlbgDaa9|JUv?M>>)F|;qQGDTykv1F4xihJ}W=^G}psDNz+Uj&>0m6KCJiA z*U(|72z-rx4P)(hzfJ=r*D^%7%dt^>0&9kq?>LdYt&QdFaf~8kk}+~H+OW4>c0l>B zV-UBu3^yZvQ2@gCh}7=44WJa9a{v8JGQ~t?jP!SZ@4sDs{~!J1D4$aHF!ectmD$Zg zuGu!Ro@njh3_WNZ!&daV0nJ~Pg$ND=D|2?C? ziDiOj=gF&*G_#HTSNh5k1LZpLIBf?^aYB`Gz*xYws;H=#0iKAt!NZKfbj=V=PUJxT zvJq1#oU8*sTu>W~qmk{J>+G``B1^P4SdSWT6!>c#etNaan2e0veJ-d4bZA426EK$q zD1sr=Hvrpe|31z-{O>~7TnCH7(bC$Cu;Uj%&zc`j7pUt)CJ*$6`()k*w5q;xw(R`7DrvFTo;jiimz$ zwxB?T1MS9!Pu2U3M{>s&1pU?!S?Jv01inUdURu2>N_*_8|eO3LqIJ;OrzW>l* z&gUu#^lw$^G%hj~Fx^Ei=D=@muJYYD@v*q{u|Ajxs#F{WQ7W?NgPo=c4iYHh1^aK6 zII`Q_kIzVOoB;;2CQvXQRbP59p;DzbgUT^n1K;hp1nZwE6Af*7B=^ym!A^ z-bem-x#mgv&l3>Un4&Yv<$?`CD0>0iwpjsv6%8~*5Ow0YGK6`DwgSO`L8~{u@87-~ zzKnBNecn+Ob4(#HdymCE|NY-t{^YlJmOuHEpDfS+?kCIscORCW*u+}ew;0uR_(!+# zPUf&5(5HLsk4@4Cl`T^plaY^;^0{>;#O2uu+CWRo>KPY@O$GwXmHlv-WUG>czj(v> z172I4=m^lGFC00WA=lhqeFnO8Ri?YMGb^RpeKXy(9KFUrL2Mm+bX!#dmaDRZ@TZcYd4%k*rt}-uryU)QVzs z)T;NjmWapS)ZBR`E!Gvs;7Brtf@?pY#Rh4OWs%a5r?_TwZhmr2t@W z?`RfB2G98=Ygl&n4&ozs6G)KRR8*Rr1a75fUgo}^Y0EiWBYVy%^p9i z-RX_;n$?YdA48jk6bwrgV}A4aV0YO}25=uGmrXlH_VX7}ypq7Dp8M_)n`T{kb3{FQ zFbz3oa68#nkDCocs(85v^BknJv$xy%B75B#2jKuJi|o3vEF(JoaNZ{xiK5(RQH4Om z)B>hsvDKqDz^x~(8QxMTJt2w~XZt8(?Incuv z9KXwW(^UEFI^a3;Tub-(?(TUaT?|jQ9(hH>t60sPBTwMO_$j^iIAq2o8b>2#HyYgXXuMXqEmNYa0+643{S zVdn)M^Mo|>UGzM|$h~17`t!?EK<^=d{2{vf*J<~!)?Y1unfI?=e_l>={X+oWKKd!Q zuXRrUG2`zEa=HIG4n_VEQ|v=;l9$Et=bZq6!$BKhPyHVN;ur+hrmM(SX1x11Q>!|<+yh%M1I+k#XC zWRb?f{yn7(@6Aoh`p9|K`lS8HEEm3PV@i?`n~?}~jZD;?Gx0*(TJ#0&0vERBEC;K@ zXI;!xggWmUfSkGaH{C5XbG)uYpX$Oq3fr77Iy~2*1IxP(C31cfy}^T4aMFCI3gXD8 z)QktYE<=>asE}Bjz<~>};ifs`)%>;bICFn4AJb=5HR5|Cfu4{^pqNhP^zGDN*)0{uu z)COmX7!SOnin8sgn8wD^7MhHs)e6B|d1@6N(IT zKiuh=Dxq^ja9yl6g&n_;&n;3GxHg!H&pJIluS`{Et`g+b4#SA*MR-Q0WP2$A?(w&` z%i3i!8H=eHBZfLZz9pnEy3sc#_FoJ-0^HkA)alWt`Mza~5dQG!T=sk!sR7^uRRkbY znrIb6k_E>>9wtCIINXo09Sdny<6WIZKTBJpBtT5ZEfkI&t6HC#wU1 zY1cUh%4Qv(>w$K@kcoQKtC9~RVkp*Zcv*ca(${8fHaFvipX6n%fY69#3+QGX-njz_ z`F)~!|GA#gdsvP|T0Ru4;el(-XIaeTT7Ym6;1#sYeE*ch0CGV-{1WhR?n+@j+B0;b z4R8w%>%26a_8K6hN8tLH@jJuaLu_vI`&F`@56^eY&%gS#{CR-t-+j7We)4>^eE%we zPDVF}%e;;g&pW?A=RWiIk70@fb?(#WL;iMb5lwZ{++)8FxaaNXV>8c@=}+jf30VG`(Y|!vvOO zi+=#q^x1yo82=P|m$8x8*h=TQL${y|h;Tl12bkD033vdC=?yl{Mn`sZDh?xksJOXL zz~$hmv5ldjm9mU+c9V$D$TDM!9GXSao&4RYAI2ZL%p>Yw;MYtvpVKokV*i}Or_VB< z$M)L;p(1~QURYY);Jhs?O9!Ou<~03+6?7r(o8D7l;8^GZdN@m}!G=0-oImuJkIEm_ zD?4jUYpPOp%UyJUJx}KTCKz$kw)N~h4$}+AM zk48Vz{){y;j?6mM7k;pBub@iXGX_Bpd^V2GEk}kc=cPi}fG0K##~sSkBe}~zL6W4v zN_#jJ`%BwfyE_@1t$2}JaDb#`zfTE_dM?3BCBxge@l00gZ}gxQU+|7BV3q9LTrx~z z({vsUbdAV3cgY>By0KU?guoxzSeyy1eW{WcX&e$N*)aI#dcUm>P4G!Jc=Kr|6cu?9*;?zihB2vwX&h z`q%875=7~Dql`y;PC&B&2XOb&yhBI`w$)*CbLR)(a1Z68XaKI;K*GhdL?%(aqoEp=#Z%dkSFvdQlCHFGGDSghvR5%pIRKSd)F|@s%y+*7JFf!gg&M`bc#CBKwfq7Q8Yh0rxk;2HW=e?^c|Y65||CZ zq~FNlK4VDeF_oSKR^){qG?>CMPdb5JhMl&R{go1Za2KA-e$Irog1b}+RZ@Q4_ym?M|&rG=)-#Qdy?X0=C79f=*hF(dxN-66VfpZQv3&P@x%~3+eEIp)+48f;kIPT5PnVzEpDq9P_Wkm&?msU7 zX1QGca_wo;8U;rxgVmHC0bqaug=JO`t+78cMOWp!G zrO9TJbSW})@9;Yzil9$G9R2`FyuxRJ2s>CEYfayQ{13Y(a(_WhG7z3{4D?J%RyIWz z93Z&}(8h_++%THV%Q^srlzgWA{pQV1?S@_pn-*?K0dDV)(^cFl&_}71jnihcAYe<4IjElIr^Ee z%jbE_aRP|+!I9%{Dj1O??YLD)X{*dk6%~f$} z_h7F(IP^uIRdWO{u;?(!=f=9z6leVOOJL|wDwS3D2oT807z7X9X%JiCjO}otw^&Bs zC1gy?|3Y5<3tYT7y~tQ*J&^^1s>2eL45@kv!|Yb0f2|1R9*LJRUq)`uU%*#4upxRE zo5kW+%fZQ8@`~^oHlsuV;GFsL!@aF#|7iCIps=`$BAZKKEI`}7Z$?V&1kl zK48Fz2r)xNQH^N&P`**EfL{Ug7>d_Kjfvu-j22<(`|xnPtJsAu8tP)I{J!=YA0~hR zL>Bic0hKoa24g~&HfwC@b4r=Yc(Yhz7S4TIF0L+HzD7?CM0@y=HuAp{RId zOvd@5B|p3=JU}52U=6SUADViUV*2e?lXT9RDf8gtIOuHW3qhtdtPMJ6e{8`r^v;7NCRp>P z&=29~W%JQh93UvxZdV+i#C`rD1Q<*#1H*}r;N{^i~I@_$@@SpL<` z+42XsXUm@^)Bjnr?!S)X|JykI{~Vk7oBaNt9&eVvxW8O}_Iwd1ezp80?|*Uge)*?Y z@0b5Q_y5zI56eHx`+xiJn|}7MpRSib{_?Q=EJ499!>{XCpO!#eWz^FS!)J2tp+upL zo_5;G_#+RFh}^8D_!64CjWA=U7gBoit{LV2R&Vl?eDNTkR9}i2xkmX=)d>&Tly>m1 zGAekgLgd1H-fc>uOAyXhW`R)jzs@S3Y4h{4?4p!kXs)aoPN#oH=qukw%D>? zQwz3+(dh;b0d2a3F1(P9$&fi4UD#@brk2lhP4zQ&3A@}6D;Ob-HtIK_p@B;5jDtou z&{pYl3MbuMO<~mDGG=3%YQ^A#k#XXJsy-_tSi*ML+-mMuSr={klvFiX&ONYD=70Ka2|GntJyh2;>H3It-jh1hmIoD)n=!vlhD@LEPf}>nAOLeB)dqxY_*ADC0Tz_(zRDGF0I*Vh--Ll54% zyf};9%mPpWhiP8=#$N2WIC*=p>>ut_epeSCmx}~oXg6l|Jg0xs+oh}K$M#fIZ3Q&N z8heiXVYgr_Bo<%S971rNXyO0;4}ZK|U0U=q5h;VFn1sEZpBy~FYK(9gm;?VYTb66v zN3%&zC(;M>TN%)PfOkLHyG1900?gp7%o(S-v=bp>SePm{Z1nb`s2;4(aH5Heg=`$< z(P5lIX!{gH6M5V6z))N#N(VH`%Che+s>|&F$cu4OYV*4oOwg1-Hji;+WiF24d=&uQ z-Cb{FMmd>0x@GLzkjW}Ja|#5`2<|$+r8?jQB=bhIa<~Brf#kXZho~|UBBcX*7FeL4 zF^lk3MLq=>cXkE{fUokNa=-CWCPSKi9bB@_${Q_wWA@o%z!Q z0RQpx_3~G7{J#uuev^@&hwfj6-d_dS&Z3Lw0gT%OGoJ)Lv6+@%zl>Ab+p|)4PHb#& z7T_h9P#GQGi&NjpZ;tZ~NNq%xR&D2RzyTOMvQ;I(7*&f*y^s&5x3|9^Kv5B}f19o; z37Voa1?T*X=pJRG*O9SP*IuP^hj?spod zOtx*Mp;kH4A0VYmKD)Y@^*?OMxbd~~`Dx38vpTODKFG4QBUrbNM9_+E?I<6sSP)TH zi^q1^focQXYWX+}9=@u=g^%G8zH>OX#I{OS{dI-$lSdMh1nBt2VY`2(JSPFMK+ScZ zV)x|FzP`K?NJM|)9Gmn+CKimUB0iI$ zhuuWvUHxLS`3Gy^S4-|8QqXpgMDtB-Nw&R{-vufjV}1}lrz?^!(@XY|7Xv~M+Ue{H z6Z}nn#?h%u$!+9e-kUto;h7E+8!X!2Kk134H*xl+Y*ku*>v#XF<>=^b+8I95NmUEG zDq`8;pWsn)7X1-4g#YXh#*tMWD88g!_77iSl}ZbKsxAaKC(=^hU=Wm&auFtiw)1vc z9gswbm7iO?G9rUeqL}$D4HtCWmuq*EU2P{~-PsY*kHJwu5T3N4*Z2mo2ZrYWlFrG${F&qL$!#IjCA#Va{)ga?z zblnyd8l9%bAw50Kcjpl_J~*oJAlk)u{Ne-!KgUN09ltF*s|o~=@xtf+o&FqT zGLCX-<|Har8m;oDFE5d`>j6{rzlJmPnEr^FM<(`J17il#EHiX@qe<@^7+sM;YNRKF zg-0qcuG6+a6I(r9Yd2AG_amnV4yk*2LpR5R8gfn3)yHP|`Gd^yjBYj9#A*chm!%mo z0|O9ixi(&Q;byJ^NVjS9IiG*Z{g0tXS^hpUxk!KKas20>@0Y9PdAW$;pXTq|@M&#t zXZf6Vo-^)e`V>AqrN0}2NItXh31GIukT%gdcKW%rC@pqQHgXZ&yY}v0bqF{ZUkC{8 zN6C!3h_=JwlxD#z!0Yr!UVxC}m6f_*d*&h8j=+iS$Ye0M^S|LUhn^P8J8v=uMtDmh ze8k!KY2`CR$f%?50@bly8JN=RedI%y1+&lx0~}yQb#i6e&gc0Za6UYaoQ>DFvb^gA za7xPhgE@3VaJd#9Y6B4O?H>eSw<14|FAggXmk!n;MkhJ6mSFRDv#sz?g{0YLK7&17 zUqnBm-(lJWh~`M#@Wm_I)gUVBz8pq8t~J>(4`3)uYcGFpIs;W zr+WeuJlje@wVUzm?ps7WhsWS88dSH~H@?#u_s{v}0-Bi~P@!v22`(gHwi?%3>S*BZ zJm-S#(g6VpJf|%aGL>%Y&gdU| zWV5$77sWlrL?8eqt%gITi zf9IBGkfJdW5vF-LElBCfB0F>Az`VpOsfB3&ICo|Lv(t;tmz%2>VcBngd9B_!>eiFpp@v2e~*!T#>+2tJPhkV( z<3z-b&vjrNlleHokg}1-z4qMnTxX>;y784^b4vKcl*}<9Dy`ON7_LAJP%G`ncJfmu z88M}gNU+hKOyw~E$Pf&xff?HJN2dl7Q2LHSRf+)+z(#X{PlnL3a$XG<@I2A`o>KP) zfDJ%KMvOvxI5I#B3 z0-XX6pLJb8+VR#_g8}FrplK$bmmLMbcQ^cK@Dl(K5RfSy!!HL%n4in&yTia9SzG(O zfLOP$#rOp)#-TqNX&lZv5Kze!(Pj;TEKh~Qw#}ZlmN5z<^-X4*FMv!=`6X?Jmok^| zxmBy^?d+2thd~DchOKmf$X2lGM1Chv8OPSvPC@BGrWYFPI3hqiq~ic`1&GH$FEj#a z0q&ulC;==_g_Px*JEn_duNq?^+$=ifwBoEY1~L^4vmrJJ{4HkGK8L0J>%0mw(hpjI zcW|!!czzjMzN*6uap92+B>m)C+TLvY<;~M}(IbJc z4pJ$}?X3>t54n=n1PgR+f)EbxfzwOBVMF_68>e z)3SdU#SduMYyaWH)p8xM1(JlL=!>?c0++Yx(u&MBU!wn3S6XIB_72tkQ=q8)s2Y0a6!mM2YZG$OMj#6JhnetIQPnvTt*)U}5B*?SG z=HAYA-A6&fBJ*Ujcb_Tco9^KF?;g>mJRdtT;* z7@WP%GM$U_1VeQMv=63hTTT^XUN3U%TdS2mIc)*b8AF#!9Ko9uwvisaam%rUB zlLhR84_aue3`cJ@a<~44Ph^zQbnMz#&EwKL&g1ytaM?9I^x`Zy^8I9E*2woq} z(gWO{k6>}8-5J}lD^Gjdi&Kh_Td~^Pn*iLsz+^w!_g;b_2I3SuKnawr_@$TDOf(OP z?lKvAgZJKm3~&Jzfi^o4$c`M@!<3Zk6v!^}P(heeFvq!bh`fia#+dQ6Yko3b{Teg7 zPooX2Wk#D4gaj(%3}-=SxK-Nq*}3J&g4M%_sSwTHWU?^!d{I4F?O|6E2io*?I{^^+ z!#&?s`UwEhsJhlO)6>OjA>i;vZy5)^?(iU4-9c8SORz80^08Guk*L+ z#6xk{mR3%NjPQ?xf3-Hwi$e^%Ce0{D6P(Kqjww?BGU zU0aI`$t|R{4L+sqpIwA6umxVmPBT_Py#UZcW=DPBdGJp#qtkY|7O&B~7yA;hu}j#o znv$wwgf4hR-8MIOm!sq3ju{raPEaW!u%=0}>1gK4BV)J;f8b<~(vB)REppBd7#)N4 zsy43IuPI#BGrX*W&o%7GG^9WRznnVQ%0ks}+S)se9f>Fnj?#ri6G7+S9Jxrr1F9Gr z?jhQO0V`NJFA?LLH=-wzZ-`BlqrDQ(G-He&1En=ippR-1jas0bCrbS zyE^!Mr<5dWtfHp>gQLCWz~0EMtqQN(f?_y;?djpma(x+R{>3~r0199xa8TB=ig_o% zq%AKBYfjiWlnO`b%*#)i4_7GRyRY9ik~cm|LqULqtWktYIRrt<*&I(x_IZzz$(}^Y zQH=0fA72=0fDQ;ce8=zpY-ue@PI;~z-jne<;+5e#zS7|x=E}PtIQQ-*Qxw7HvKr23 zfFFgV@MP*UbWncdp;+lYH`mq0^Mi>f-RM%QwG^> zco{PlqNB=b%GHhwRhpZCCIFlJWq^47cpqJ+8@aA4kV79@LuA2DkL?dI=R1A*yVvAh zS}i(5E3n|?at)}ZPtEYiAoq6uKcL1yJ*Rw1YGj7S1PmDio&f@2>GJ|;`j#=_5t*(Dh}{`A1XKIt#EzBqzb z)@Tc7fjayjJ4oOWXV5Kf(OvTMWG~=Sq0+I?sQgJrbdocH8-j^B!gfHgPA9_Jj6UN7 zkRgXwD?*2}vjG&@3S?#5RvWW(`hvbbQW?+Eo(i9S=_Gs_#}~e^_gptmFPydo6|GL> zr(pi3rDWB_$N`?EZGjSZSwY7Ws05j&d;XHlC}Sl*dLXFmHR;QIH=XAk;Y9|S-`RaY zH?+}xI7glw$Au|^d?rv3Ky>apeKsp&hlt0dl7$*WNcVZv0w%VMaShlZi_&_Jw zk+GO(M#oeYROy}?RNO^=?6?_jnzX}*jhluDvx3vXpNy~fr61c*zdkuw-UVObBpaEz z`Khk1xcm`R}W(0XR0^3UUh-4 zKHMe|2#%}Z9-o|KjIp`s5hqD6XWY^I=p_2c?J>UX(HZ#ZUt)%zrh;4##|3~EICHl2 zzt!RBMeh%PkH3D`^1lEJZ@)xV0zRwrRY;#7KPRbt7ut6!KNXuMXn6~g{VgD&d*sGf z;{8Da3xN@kH0M9TN&G|DV-^0|l$~PmAvW#Au}2XCp!>TVluSD})JVQ8cQ+Ri#0a|` zN7%kMK$$&3$=HE8;us?aeot6+SxKqY8&%&@pQ3PqLz$zQU z?6WhgV$-f3IB+1HfiTipM8c@Yu~%u+x6H2w7^4!P$kI7YAk)Y-3WT=K?FO)S69jN9 z6)*tdoRjg$B$VQN)J)mv=qeg5lc}iz3&xgmxZa$nNMxz&DxSY{- zi_ODbd`lwd2;Qn&B`-peJyCWgJW9LDhQ~RP!GLQQzTkD*pRolr1Cp)-8h{W0J%pF$ zYGik40RqZn)Ujl*fz{~WD3~rQb4D{msYPq<)$jCSn zVb^5goEUkc37_!Ji`;>87d%y8WXEYQ*D^3`7|3dC>-DnF!9|9E9xzU{zAB&P-UK;5 zYc(ifgXge0O~1Ux$$QNlJ7XRoC_nNyV9^#`>zNS#4jn+7{*VQS*F`zGhOAd0h-U%= zZPn35j=rnh(Q0B`Ydo_UW)^q=kwJBv_HfzC{dgdAGJbleU$Q4(j(dQ5#k={* z&OLd|3vE-P9%s27@MUM7(T;c86+ku1_IvurU_eM8=*6lc=v2*`hBU3wAg1N{ z(FZzOC+Qu!v=6J;6eoUlecL|Z2nW5ohP*T&*bzXk^iK);IXt8rb>hL9otJy@+dXv8 z+JtToQ`O*r((as{5hsw(w1$7SH{!qk@U*yYaxg)B%kSx)K5_^iPb$-I=|6n-+StGs zyMv}Grm{lD?tyO{jB$qR^%vyC?ge-aw!?ET=WF1V1nnw3l}HH;1QE6$(#0;c{%Wd< zA_TV2A@dDnjBj)WHXKB*qdzJmQ$;kde{ps;_vN1hj5_@q8dUSn%~?k_DpgOh3zJ2= z$)q_%c)}M5ieQL<^}~nv(OE$sTZ$heaAQe7l1`e^fPM}Bvr|=$*zRE*Zs^>|y{}&< zhze~Mg}P&VcQd~6syb)<#WMDkzfFBTC1^nV-r-T(pbJe&VBJ%IIsI zy;ZPE5tlV25t0t?t}YUpygXts#BK$=oX|!&I5OE5@U9coZj{O6_7G^`mvQdE1ZY_- zBI3HZK`UiWWDN{*Mdw~(46}evX^f+ZR5Bh;Zc372P6jONH!nML=QFow{?7?tEotuW zwPZ^9`oR6WsVW$(^0j#)ibeV3L*l@0mfJ*an^7pjpy(}$g#ZTIvza3dI-hFfYEA5esUZIVtr>kE-Umik}5lJ zAGy}CMmD`D|8;Sy>vA7HX=B=Xaq795op@=>LO0KH@aR^V0K2icW;c$+b)10v)@3>Q z2`H84CL2vh9Ru1EOoWyibNbcJZL$H6OMV+bJTM>6&h(KWb(Kle{jT?jtvlCZCqXx! z=c}|G+l}t$lJpP|iwtE&gk;Pf@YL158HcRT_ba``gq9RzXa1~{$~|~NpG^k|yy~D{ zdhkzHFF2!z?r+cOuhT}ibWZ?1WmRJ&7i$DK9~fc#5#sxI>=k<)LIsrBFP_dbE206h z0Ri!3%ulsZ_~CE;3*;M6Eb~v?BCPP@I-0d)={{#3KV69PCbL04QeA7HV@Ou6m8Wr{k-rtmo?k1EQ~)N;=Oa; z?}AIVCgK5S-JMR>BII{|0G;Ubowl`SOt%S)>_+hX0a-4cz%;hKy$=)TC~x;SV2@4; zB4HAJWY^aFXv6a@1WIsc@8D?J-A^{(#6pEDJ}S=p`0Ysra&Zwq75Y43@F;<<>>Kas zw4j+hysF=Q33MfDGj(Yinl5v?cAVII@69e@yX}lW{;l7N?ZR7F`6ik6VQgRm#>?}w z<>vA__P7>Zo63nbL!)CBi_f_;0uhHH;hA8mizmZ-NnL&9OVEX(jyD&iL`&kQ!U(|j zIsm{49qztfjt@lu3?7(su2(U7hpP+_dUY-_oyp2L|IK9M8=F%)5S8MGg&HlBzP3P* z<4j}~fj?v*Ek}k?UiN_QCxX!@fPRjli2TeyD*-;;e_6i&a5+)Y3%wMvi;n878D@Yc zSvoMmIHi<1Yk8Q&$SEqo!GNGG1RxyNs$?Up zGL`W@4jxcWq?NHnQANAP1)vDsmN3E{#k5suJ-?3;DVw6p{Fh)u$yJorj4c8dP@JAw zh%zNPnIt*bDmDgaQPgwK%h#v!X)7QsFg%cXv}~Pgja`=Ulr{t;d!c#7|LgQ4$a2~f zxtia`WBOv-4I_2_!1m58P-L7I*Q^{o5aGxpknjNz#>gH39fzfSpbQh&ts24R!X>lU5bdeoMEjYcpQP*Nimnvj#q?^t{|7C?QwRApk&DxC>^& z&IBgr-gn~6O?7b60v)zMKiwx#G!2l?GX^^{IAR&7a(AsSG`QC|%eUx&^(9K|A53fI zs^9tMZFy^Jltn$}>*-Vjju3**RaFU)&>0n@W)vlFL8WD$*ftKC+yvTne+*i|H>N0G0&+Q$SuVRIczxDftE{*fuYQ|i?h zdL?kGs<4zkG=t2T1e$`mR#?JG0X3TOo*b<~p_8unUEdj77sKW=7-GD;(JK|U$;1VU z)*vOZ%l+(G=FC>SomfXd(bg5}p>G^{@Gku1L)ZrWwep>=nX27PpB$yNG&ADXVNE*peePzQIS zm>FL%z&1SoFu2*Ntk_7mO~zl^8qFUV_xag}@&}D*hanMetI{9df6!cc#i7$d{1aHA zolXcwwMBgezr~;pm7x6M8M;7hZ#F+Z3#8> zn#&NKPn05BH^&}8T8m?d{zhM$k&2=%zOy(d%N2aPJ~qs zp~kbRXF*5U|=2%S`XbW)k zIn4QdvM>t(6Saj879Dbw9ByLX7sO$KZ%XlI0s z*s5^Kx}S(xbZ?%vTW~Tq!HHc7=ojryRUw8I-dg~&A4SFcW~kADKJPn5V;)pSW`8FG ze-qH4aLQ!>hJzKnP+}|gi((NH9cmVqv6Fc|?0x+{a>h@(*>xY0nRXbx1xbJxf7jzU z@mf%&^d~zrK5Ikj;KL~VwWaaqG8xhnr#K5NDUNCoV`b<7THwY7)o~;u2G)WBP5{r{ zD=+|dfE5^+dlwKgJ~a8>PKtv7%}(g^^u(@I&p%n<;oe^K+UZl;;Fy#kDBU>shX7St zi43+1d}!T_{LH`0O7ubw%J1yKcqtN{7m%Kv-*j%-Q}!-n1Ey<^_VydNkgKYJ?h4Ma zBT9+?GoI*a?8^9or+a}W8vsfL^5_Ykwwhq9f|HE#O#;A{5A&VRqkwhxPJNVd;iYPU z0Ize)>w=#o5}}JT=D5)%gX$CF66A1HhPOJ^5Joi%qt9tvKRs6g_rhD--&EH;=*e`` z>M)wl>*g9ZU3?0^IBO1uE-9HCvpH7INE@yNpnX+7(a-Rk9g(%~yg6Qrf42qZ83P`> z->#fhcBPC;)(r}B?}~nQ$yxb~-CNklF+L?I>!3oXKpXb318u}llrQWAUpW_cPETN~ z``HaA<2fA$zN3;8dz9hUzBsEFr{l5U(dZ^Yb&6?hvO{Yb65K=|@<(VMJ*5lQ7O^c@ zgfk5~(jLsVZih2RKaBG-hVm}@b8wKPBLS0OXfGJFvN5Mj!Y@Cq{ysiAYG0;H`4bfb zI$Nh3S&SS{bE1ux#%d&fT(Des@^YdTj`Z#6uZ04H$ z8bM*N-0mp3u zo9H)(X-;rij`yr09S8m9bt3X8%`Bn_^K%_AZR7v|BNU3T0)&Qg@;xTrIl{DiZ-~gWSj?x2G56jrkm}hk+2X3)pv+CT-h-C=PWWt@@D2`)G zmB(chUdM*COsg-+pB z9e3_CUb-acxVaTI%k(_2U^mfuoREt`he%tSu5URs*O8m8Mpng}Hx%FqQk2pCEi=LQ zbXYwpNauHpb!68*2S}|10apPo-b4_!g?um21Lkz){t+i}F84(*>BC<5HOC-Zu;n@x z4A0Xyy&x!cy_de&Rlv&F)3ybDcvA--XCZ5?UPLbIvY%XIF_O7%OJWa6n zwEXz%!`jfzjZ@d`^}SmzF6O9UL55Q9bLe4d`X^TQh>R7V;mDNbH8U7CiBhl& zz4QTZLdW1RCp3ZFPJ%;v&G|a8hz`(4bV~}*etf*Y9GuuroOa{TZf~#09z&Ns+YwxC zLceu>`3DQx;7rklKWQINT<5_$^j*S1=8}_f*pvB^IU7QUpWUk+JJe2w7=6S)^cyRi zisPr(dCO+$H^vG6EHINO(&tuo(ia-Z(zKBZ2wP_#vuZp^OEPaVmpG{$)2;r@c;J-e zKr%OHq--={<-|`verP~je2!cNKPskVmce(5*qQ||av^7x5{WKe$MmDC>_(M?FR||E zyul4yw_udxmQ?j%p076hfHpYWqiWNK@xxep?5VC_1=GP25Q_llE{2C^oMwS1v}w;GAPnU|Ec6o{0y%8}1W(bcb7{ZnD++KIg{LqD&?tw; z2U7a;06YWPikvBa=MafH*Ld`*z|8iQqhuSad3)0oqUzZzD|Z~-7+@wsCM=*40gKQh z$HF0#rv3aoc=qEslnnIK@Tw&jG!aau3gest2`WA`H`S)y^e zhBHtBF*T)ML9hUvO|Pb61Tu7zO#dss z^7yHAi=Rr@oTtZ(rt6F;cAI7#lC(PcZ652&`9}wXOQkFK)FDT|H#w7xZ~ZmR@^Go! z0B^<_Ug5bwm)tIsQ9Y+YV-YYoEJwDd;?z0p@Iqy6-?RF|GnL9#^&&6RopqEoLF<-Y zvbOMmF5)Mewszw@x8p2A@5bwmjE_wQ*CI!H-Qb!nME)!R@5rY5kg;$|yC@u!@eX}YvK&A<>aj2xJ&=!vnweG^sm3{x}rA?(CAPCgNFno zcj3|P1*e_s(yr+YI@<-vWE?$jweevdqul_VJ|;PYxhiJ7kU9N+ANdP(=&sDySl+#R zo1p))bi&D&%@Y8yli7Da_KY`5_o|cH=2tv%Pw-~SHX59J!-MF77rA_R|2{gGBIYlXMF3uy2beI5UK$*XGEP8UVjp&=3sIy}rQ4SH)DmuC9Jx|Gg1|-i; zua@&ms~~050D2-xn#zgEOc*-GqPxyNZOTd=y{P1+ywz2sVXBIPS4(+OFj2iS(*A*y zyxc3JoGo<%1I~yN+KPj5K=||`*-$bgCCV;}3TSh-9HOzJg~5fK@(~JdwfuM|l@iHp>qp)5;&vOAB-N-57xi&C_@#_zNtpH}w zzF$ov2}WcfoQyb$qge$g900tk+yRj-T@z4!Mw9mkum zGPaDrr~ZZh+E+wMSJ^2&D1D(#Fw9mP@Z=s2RA7kjz?faw)&~e-hTv>6$OP!&Kkyd_ z*$IQUC-06r4a3=4Yl40bQ7~-04sb$0oIx8AvKewjA2046?-8#>NeQC!9pFPN44W0< zre|c?WHr+b%}Ql}xsHRAxy^wu0`QFneskKTES2-ILnd~%>p-vs$NAn1ukp=s&1{r@ zbF%c9Gvru`eUbSpaF-aEFIF`mZ~9`K7CE!!ap>^I`l5_AFJtUV{EVYnGv}0Kz|_mE-tTfjk5#BmPTLGIQz+UbjJAREiO_CNL!IV z8lAg9FFCMQb7F+G7V4X8r?0K>@;oD$xp!lg6+hgDzmb^-0)LvQaTNXzF}m*<@>u&|aL7TdyKzD{{vunq%d z>jETC81&>z{@~!~V0>2?%wFjqAINv$6<_#f(*aFRzvE{mLA%wT+uH;%32@gAwq7sC zM=`(*l!u{A%2*6yRX!Cpbe=5$BhnC2w-gls6n#-x&QZirVq=&d7b%hw3^YQj-~*)j z+sSMergSA@7#EI}d5qdXlwq&qM1T3K@1qh*app4^jHpu7^Hm+Mlkq4MCq&_tVecqH zlwvW@6oCI=f0ZqSpf6@E* zA^-xG$yhk!e0-)L>{9j@e<1@8dU!^a;PdkK_+aL{h?71V2oFn7X=wc zNh!!6CB9Uktb6J>TF?0zSlO|S*9R6e>&IowtLtfL4}7PQhCUg2T0*Zgf!qfC4!7! zzfrm$$1gj-jLbL-E9YfneYi}<1kj(7!L%|F`skDAPXyu$7#8jcz&T=$mou|i4u}cx z&Bfb|fwyEyKy}jLA-kr7d!f(EgG3HbVmq5%Z7J_6T;46`XRLH8e?)$qTP_H#^o=f>CKMErvo@-) zk%QpWxO&C}Ipi}ulA&qa=XBBi=#rV!x!e@~b4(UXa=Mf0da)IiGq@pGld0o}z^nS6 zd(qWWL4J22ihBj%cm@YK6-kCfh0gcUpP|{4`i$3$&P5_=e=3vgPFdMQxt#h&-WEm* zK2%%D(6i0ai}xHhJe2TE34d09=YsZckut~FtRMJ97J^~MQ~u`VrvQMXMVG*t4XIY) z9h>Ihfp~vUyQd#NHZz9Nk}*55I&~77;2#?nU3toz_d> zN{`8B~1+cITz3+otrjx@F}yNo>fs@EcDYXF0q7|w zM)iB0&p&)TO?G!x`HFA>EC)&4@dF-H3i<$KR-{tcE|7|{x~9gOF$h@v)Rvz>fMKa1RL8>Ojm=k)m7q}e z9o@>$F#y#XE1aiFBFpeo@PsddKvNc09arOWeHVph9OT6SXCYSf9>1bb^cLq-Pt2DA zYk-e7z=AeGf#Bg@5R3K%t+}im@-ISf+nGzaD%jqh^S|0+$UB>~KrW&4b z?ioYIxt@RlIDh60A}GOVAH$KGZ; z;sm*5>WN|k>%Er)R~)PZ>o|vXhm%DI*(d#!)JfhjmA%X{!ef`5<>=a!=e-(0hYH`5 zeR(KB%xC0K{$xC+5xRaM?QX>;Eilbj9SfTw#~v<|poF7?r?4TH7lUodWCOh}cq_2l z-BxAX4QFSkgqI4W3LCl7C-eBK8vM=2v$NyqIW6s!Z)11I-^qtP&Azsr{PiI}}fW*-Cl0faR zsq5#j{09`HN$E%@otFW+VNMOY01D*Cz^z!cHKwKc2wG&MBgWSK$?42$L!9L_JbtgG zxiG>CPEo5>&lqpt;DGZ0^Yu+4(5pDkC|O#n(JI$Q1L`np?4b{Xx7Gu2k+WxF!@vV8 zk3%zI0&#Pz80;K(krrB28yrM&^7c52{nZ2pQ3e^t?zV#ily*5^bKx=eIRDejywMa8 zJx-?K+#E$b7;VDr9mS%*8mfuH6QQin+FCZphkWKa>4*49QVC{J^S^&uL zv6&DMXP0a8IUv)Hu`^UUA?p_a>4zPfn-c`k+sC`n6}uE#{R*8uIV|I}jZsET529MGI~P9}7~S?%{3AD)Gz&>6eWFYG{O zEz9>PN`W!^54GvvVy4h?KT}K9-|%#IH~Jesx5OOYH$!Ki>CZ`LvD$(wz6zS?Uo)Zf z=N@2(Ci)?36BG+R@ke_VPF?_=ZFf;$1}3O5KG|3kmi&RwOa@;oo~ejA8@uAjH=W z+ka%q#%4NzGo8c-hRwn^ypTDgF=Ni<`Yirr{CkHM-_Z%!J-XMxATqFX$yDZ30;V2@ zq~exq4M)P*R7P zJCc*|?jV8s(EcfW2tLHN_m7UEe-FVOQ$^N)1=G|0#p!vIv2TC#Z86Vy1s_WD$8X=J z&-LP$sYd(J(Fofw&Mua-I9a^IGe8Bfm5N`uAG|uWQ@xElkq<<7Z+Fcp91P0>XU0=e#f7`iv{&D>?Jm4 zeBlB6kw{nlC}mzD) zQ9>CAr@4>dnI(u(14m!>}fJA=d>Sj?#cS@9q5n@VODu^Zln>z5=F=I8PCj_ zS^;{SKqFCd0**QV_@<5;ASr*+O2FGFI zJ7Ae>Dct9ts^AgYCKkFf>fEw_eT+x%oA6vMoc>jr#=_mqepdHbARG&Avi7^`2O z%X$EEr)lz?vC|b989p1Qxmr3#=4f`E*8oO;OTPlJ1a-Ndj?e{D2S*3CD~`UYDsYy9 z7&_5~RcVXy%WlZRTr3_iTw^W2(k5`_EI1r|V37Ex?}9_x0f<_ebI>^lS)BQQ;6QJI zs8Xux)wFAxO0Xb{5ae`Bd25rCEN{?~z6&4$1os#@J^*EXvL$?NAQ7_m4?HDqqtSnz zYiz|mz|?*CFCf0Ux?ir-<_NN2o zI^;kv$;ng#oW&uaj!xz}iH-3zYYyM9(heJ@ubifme$V8{?;b%si!I62)E}D*MtFr! zA4)b*=2C$LlT%C(_aQlwwiQnIm~ z(ckL{^d&JIS}`Mhu)nYe4OzYe_{j15@-$W4l>(rP@`;r`r&>0OTs}9LI=#` zD|$?CUSyN6a;=PAfRN8##sNpzr5Am_j?EaqgVA7D2&fNRGuPP2A<9P~Iu95F!qi#( zqg*2TLGUOL!fR=1nqkR)Es8LorSu}gvZX^Au=8h8dX8E<8BZ5vefkvTm5tuYLd-)U z+@UQu-S=+gBjdK$xQhkCB*4U>_+4g0Q7Bs%iG`5>o07wj{Y14Q^)7&;-~mcmnp2^a zs@}dk&Y0F?AQ8x#g?2~FMlvwjgKR0ygwgh2e@W*4uzb8s)E0UU_xD4ODuel!^b{oy zwsxho3>^63k4)?+Gzf^4s|d$S1`VuL6c~{Vh~w@QK^%Y2oX_~2`bSA9^2%A&nTi$z zgjW4C5Jp!;T2Bw*v%UZ(kpBMsDhBYh>~8HWo(xy#`a*}7`FBS6?&Pq2k%#P!LYl*} z7DB`-IP$;|pHp7+$!JzDft!4aWATb8>ddV07BB&iW*5GQVGD+U7m((NID^^GoNLlP zV7719Ll!)S@y%vvh(JQ(WFXNoi&13g#>+7%jS57a?c9Yu(J2lwq((1fpkoLe3RwUh z0SJbe`YH8d{O7-s~akAqf128e8hye!-?6(swSxr@vPL?*k#e`BS;f(EhQIQyCR zY=9BqBDc=>r3LXMp0OeA9vqPWTC)Y&O;=^-UcEIa$$!?Ca7f>NFI)N4H5M(?g$_F+ zwlZ$PqpAtV4U|mvtSUzIso6^C<6tH`4d5l9@S)uW1t-0-ZB8sfs?0@j<1n07KyrW2 zok%|%Jy{75Fw?FA3PHx<p<1(aycYh+Gd+*cJW0N&kXL*Q^fEp%dh(ibYoiYQTRL zD4K7s9&sr78xTq~Ow&|HBD099;CBR8`ZR1lxo2n5xd8-a_Cis=% zw=zN>jSu~JwF;D`GVl@{H4dTbrp0N z7u|RfVR?X8eTYx!QN8toot(@}FU^z`yQj}E$YX8ckwj9^-PQ21VSRSt82^xQa$px3 zE4y|0n4k1Z+X4uVmNUG(xF{WxOVt9~Ae~a@*%18IVAbce8~h00`2)^fdo5{4R+2l_ z!H``2fIk*D;_=v7^fQCDqpVN$dr4H-K$E}tss{Fwfot{j3?s*d7o9Q#OuwgdfcYJ6tleXECaj06ivX-O}9t#A? zf6bEoFX=?5Iu|WCwy!`NVRG~aWI+OE`cTJRUbt9-Slmo9}M7cO)22Vj;FOw*7 zQQ}69QQn8!5FNuPAyE+JjVnxyz_i<_G;J$cAlh{z8NeeOr3jvTeH$a-T-+l&7TGXv z4i^9_qiiRlH9wI-20YW&CZz#zi3B%Z7sN$=qB%b&QcpIR`_Hbz@X+D8zqZC%V1&VS zB>7wvTV9#VVq{Si^WE-we|iz{`P_MX89fk}O^9GA8KD7CZxJpBLJ?(n4K|WxFQ;^udO6BiqC+JrBPp$^6o*lV8O;$%R!ub9aEg%l;8uvQ6O2U)7JJfF3~dO zRVJe_yD#f9$XxKoVYQl)wt*g!Wh%yMng;+(<~bR*X&O;GXNH$u!5qC1u#i6x07&%A z%RL-CkVBhsZEV{6?g0@pB6O*CDD|3t2nbwUhTddP(G3eXtya|@oly;8Br>xGvE?)S z3BdtgAVD8x6!|*s^Dw>&a0Rd;ijI}sWbAG);6*N`kjTWVwqP7-3sCvH@6Z7N@lW4V z<{Ue~uT{oHf1EIA#kvd>JLs8%Y6Nf18h~i7>Gri;qb!ehAktG7<0xck9v#aL(0G)L zSHI{|_28H}d)LX#))Lf4IL!u?{5=*F4+NMk*Js@NZZ*$aU=rSA1V^eYN%jtxGF?G_ z9HZ|!mFi?})f*vNA6$9j;o+_4BY(p+?WoZj$<*HpEc>{CEzeTeY~>Ikzu z?+JyG5fJ4(n_1=lu3V13IkZGzhm4p}bzp)p^Ut9tZFxq6d(qI(9!GAKKi%I~c|F(-t=2!ygMDnP#ut4Fnp91$FU~s+YR?~ zyNlKWQWQ=^FLR!`+JIxY%!yir#4w!gt17Y86YoTf_sik2;|SvnW6b6aRVgSsC8Knd znQ@sf<5Vx>-0f@KNrt=|VJHDHfWE@asVKZ!wg5^T4FOhZ^FBR~k|nw}bzmhZCrc0v zn$j=^PGc4Ia{>edaJ~evDu;}thQzgluDLsZ!DS^HhOE= zPg9Z43m94!ppD!!zHD&)uUNz2QWhe=Sg$Y%NZvzejiT zN2^e|-?iq}WvG_{XIVR^!SKxwM&5kpS%To45}GND**H|&NJf>NMDB+=G&FyZE-Xu^CpduJ3Zpe>X5=82l=#ez;Q(f z=9$=nFu_O00Z1}Na>DD$v}bArG47*>wOQ+1cK7QryS*q`N;B1ri#^I?DrZdmZDkMr|+wz~W23Fq#CF2*pjnkfYOA^^m{m~HJx!s9Tg-2{{Z$;-3L z@Xf-^$+q3lmHBCg9>G@qNTT3}09)I1K!C4DXW<^bQ*AIUz;;wkJmQt! zZtpr3^QpA&?b>$dtO;v+Bu|1Lfm4F!V9mk7ab<6zupMBniax})V?U}*Dt?#2(RZ+X%@|?p3)gS5BVK8ETC)f&JKb;Wfe|Ej*>^~ZP*FlLpB@X53JzaEnJ4%yZi8O zDmm=z?c2AlZ1bbAbG8t|{jK=dtL03v5E-&{(?iy#S=Yv<^o1TYupzv~>(yEMj)5k7 z{@bp%s|1$pBv*0BqtsKj2mnMtJvl4P;z$YHcjJ7&N=%%Nah4~ol&;v|3d3)4IT1A4xwR^7Tj~Mz!7j&?eZBKO*Lp6FnNc>-j}cXe?gTDXg$DeUY1d+ zOtdrKM>jKs^16@AO#{Y5R{G5#dTqfkeD@i8(S=svtsO?E!lS}4a@6}|s6f;>n|(3- zbm##v4WP6iKBi!FL=5`2u}o zqOC||8Tmc&5WnK%k?UDoD|xv zo1k|Ss2OkW3-44gIM>SyQy+0)q0xzHcx9}uGSRVC&Q^;-rv!f;EEv2CP2mN7t4;-1 z^hpO+6)(KPZ$PeXK^;fc${^f`OifSr;GYgnN!zxm=wA9?wN3TXP-WsQ0QzX`4aD*} zx%o+_ILyj9*Lu0m)6VwxW+xMj=h)#Adx_SD-sp!Ytva3`;h*takVhthh1+0O&zcYr zg{SyL2IWKgBV*&HuiZwQ?`TYYMx2;wFI72wgwLjj$j*ac1n*8Rq_-bGzRz{0Q@3m5 zu$Zouj{NQ9If2@g$&oxVfV(n#Cq-JgR{aiLpT7uFGFCxy`j&J_CQZ%OW)tWL7SdF8 zr1jF$_`BW1Q>dOLm??g;B3U6p*sQm80@# zzDDD5;w0TnAOh8)$Vy2st}J~8h$v;EfBP5bxYQUL=TW7dY=&~QY-nT{7P<(`nbQ;t zpqYcKN>lhSn-RAGh8Yl40+ms2%Q`-<7Qt;K^4rVbaa>Vg43nv$$Nczt3|gjZK6B6M zP?2IItQVv297;NC`8{+JK4%FOY*TWr)x3<0^kv+X#n=eLw7};tkBh?)9QSG-hcM@0 zizz>1AdnIv%M=GlWIN8M9&l|*6y2eZBHREc%A0GC53PRLT5Bmprd@AAp+h&Yw@%|W3d@1Y z#JZp}yb<+sR`equXKWlEDpfY7bcb$+1IU2K)2D!B#s|RY3i?)62Ye&zdA$H6tqO=M zQ%@kM0y0j`8i8)N$$j?WcExkX&N*y^w$Z}@RJtY8%b%4unk}mHQWao3A*|~a825mX zcK|;9SX|>8-8HhOoT0^N>(FI0X@^aj;wfMYPJObv$@Vg)TvLZ0-qVqu@)<(h?_PH8Y;!a^(a#(*XUka$aAdLM#Lg>&j7tV? zoPC68oPk|K^bxb>Op4GPK0zZqE)AjSGI(d#5nZE4hZzT(ROUwis9p2{9tXob;m(P1 zU5izWi0-rT=mvgQe=@cPL(yA%{15gILQ7;6deBN<)+0F84xf5@W3E+62}z*^UVL6o z&n|n9g@mw-ZlRSPN;Wxs?ZORs15cFB(|nSs&5mEy#2F{_HIm79>&aLz!^_(wi7Hs> z3ucA}i%@G{`V983C%E8fohrvB(CsXXmCx}v-tbxMfX8Kg+6 z;GLhc%C;G&CwnLGKDza#+|v?b6e>2?>-9+~?=n!lF)biUmI>}1?1a`Y%e6%|p+yN8 z6P1ppY&<1*PQX6W-<)0esCzH>6FrJZDJLb6$+;H&<~ap7qO&dv43D~1C?L0CA9MQV z>a^8pT#V+PypLcos>gpXbfSoGc!R>*7?nEQbD z%$bI8JP#kEy)DNZBl$2KC2%~RMJNIB=!Qor0#ra^+!WUJj9Lj(20`KVm;VYL-(;gQ9`qe$CgDf?f?xy$+iOy`C_&4MP}m`pDK6+Us$WY{fE##2W% z_9q+D5!%oQBhX-8kJADo#^`}jJ?tq#C4P9}r{TG`*-8F(y$pWJ%CU1!JVA^0c8?Fj zQ_ds$hPmNFt3h?TbUpz}**r?rG#lL==RR_xXV$umJ}V=0zGNUs z6+B0e1NtqsrcM2ulQ*A>rt0*IybIdF6ak_>RQP0ScuPijH^+CAmpR?YDJ&dkpVe#|q{Cv4MzwGugPRiNs=;fehk>tqCqQCvagO<2u?$+8g$j+Fo zt8vq`KfwrITa*lYeU3lp=NHk-;Lle|>HI?MKL0GB<2=vuJ-oEmz)mu<>DEU29lfJx z8X|8fNd79&Do+kL+CAJ~PTsz&o#0!imD4X7nugmyJ}f`%g@+lom3kaGoNdJ}cJn&4 zsb;`j)r$xa4$Q{qwub_Z$-QC%5a6^{IUmq_U3GUg3fSUX|JxE{D*BXEh zS2_^Jm(Q`RK#Q3$t6&{wQs!9*@hXB4q2>D+xpSOb7ETsyo=_Q{liT079V5#06u=E} zRpdK!@{{p!SXQ~3H^hwaIn0XzAul?rd zEwVJLHupun?#tB-0noH$nctg>(uRNwDA8v+V@rzDp|s^C zdj;1179cPlSy9ZS*V9iw5zwtIh{=ntHd_oo>)0|5@&>SMgFLKL!3*=y-1B6;Mk?E* z&jb9N7P)a^y+7@@ge}|6wRDn#(HA=y=wlZPMrHtCn`ku6APf2M{yf22bkzCd0eI_I zraV9GwFDm8bmWvXXELy3)i+1c$|^GO@*Y3{DbsGIMw+RF*9|_>PP4JJrJwcnIOW5` z!Hm$vSpX>jQ-_(qJGk%!FR;?HEBax0Sli4`L7TDHsR2s;M91I)TB|3y7M7@p*yYiA z<20!GmcR3hOc*XC1_*6di?h#M9~&Zm0ki$+=HSujX+;U0!6yyksSJ~d@w8JUScBoca(vASzx}8?}B0qY-`I0AmaGb3v zOMTH7{NnUDuHpln?bMYZP(l#?hF40~9&g?0)bxcHWZCDM$M#W9cVTU_@ceCu1Rmqb z=-dPpu$2ys&RWd;SX^@Mg#^j8t7pASP@d!XfAx#MT@DV9mXmky+Md2UZKjj_PeRb@ zQa*R|xW$8}bR5)_=3jV~L?q+U-{r-1^<6bX#TJGL6g*X~ynG|W{}P9JUYgmQ1=*!5 z_n^T6N)oFNAD!IE&SbrDz8Q<4hy2j5A|iNcNk0zL;>;#ev28prA2V*j1D$L&GxU-h zy;bE?A$t4G*9j7LYm@poJWBR%|M}@-Cg@E}D~P7xch=+Lxr*c_rCt=|0!8Ka0@20A8{pIsuw}ph$%qAsZyc z)nhujPa`)ifm{{H0i`IE@I}^`b$xjjA$U^RUK!;97#kayXP$Tz|Kh?*{0Oy1{kn|0 zxSmz0kI(n%JB~Pt%_wE;XyAYuhV0!yF&q;@U6?c3u;W3i)QRGZL0^=NA*%{_dfMA} zwjj*oQ8B^^Px4;017Ib$Zb=D4KAhbwA49A1b<5as@-^U$qfb@~{TK~29o6}FrL?WI zf8BkhX*z#9<}<*n6qonTwuNdjU;_-@qRfkn^C~*psz9L%00LM*CR4YUekU{lLP~R$ zK9opT<+0pQFtk|f5(wt={m>%n#7sPz%z3IclPSdUB(wB8qZZJi4S>t&x)>*8rZDJ1 z3qu4#7IhfU*+(mFLtki_Y;j7tE1+&^D}OU)hA{x9Bp*jna96ITf!LvJZoyF;GnyC{ zLyIor%U$GTUR!`7&{CST&_x9Rz4+!{Zy8T+!_v~NZ9rSz=WpZEx3;xOt^_8aLu+mu zI|v-%5Y+a>~$?4RH{wQ^srw0%kIB zI&QJiOvB`!+=~YC7Oc`$&wlsa-}@$+ROkj$vx0mw^kz2cSBB=%oUMSRJwdgV#q1Kz z?z_IU2i!{jj0rde%q{#8_~2jHhvawt(-muLfR@0j&rt|{Ui7u=FhYZs%A)ph{(v?a zUV>VT;mGjVpj0np+V(UvK=`8VF2K|`a7@1dO`yjqquKO>Bt#I(+0t2uzL<8wFZv^6 zYpFhcu^+w9ajmLlQ}%{6UUMK%95|Up?$%2PUL*M*LxD>}tKjNKqqA7r2Gz!*lh(QEdTfpmU1ZJ~4Y zEB0MoAA3bF+1chLkcYRe%BGE0;=&ZROKurJ`NAXwR=!hxk=6Gxr?EBq%AWu7XFsb` zJvu%qjrfl?vKR-OKt1@k7l%VX{3C#7!m&G313mC7wvCVOvAckdI26aDu<=#WaM-iw z-YdAeER8ZdJmE6a~#5Jx~8Pxie_-sA~|Ok zFcCp4Oql5>dQU%8?k1t=lNHmK?ZX`V$KQNhZm%9XZT9v@Ck^t*?>V;1K2<3))+oZ7 zIoE)2vT_Os?&eH-*^Yx#92==bzL%dfchOSwt2m@El;h`EclVDv2;Ym?fhABS)sKlt z?r!EG4oY7HaTVvTYM>tq;<2Z)y#ZNs?8^P?T|r4Vo)c*)ckl_GN$mLAT->>t*%I>< zAz##Z8g<1e%?a%vIs2V3&4Jz3cpT85OX}n?unXpz!F&#ICVP&+x87tNj6UO`xb{m{ z`3W>*w-2@qO}~_ea-N=@*H8|U$pck}cVU%nxZ15}lq0t)6!^cDj(*_s+{3R zK8oU#$8)O!z(zUp>LL;0tuq2bVEDRnPL%gDN>AAwVS9AA(-JhrlmTduGf+O{96kS@ z@>h{^4}-;*uFlOpj%@7pQ6`xXFqWm759_H<>5JR}IR__5(VpoDvRpYBU>Sy0-umb< zjOlYKI2<#=X17F7vr79YjUUZx<^o02i+$<&+zNY!){G-^>uTQ6=G&HNIR+CHYZfEE zI1q*&`M3u_)^Ud}Wpxh89NuH-o9Bq<7WC!12_9e82V_hRIw~-PGCC@Q6iL^~r=J2q zezpRV_VGF0=H96!6-e@Zt3=T~tGfjQ#=5Z{hoHn*AfdY!%*}QwI%W~4k}_us^nlBC zvOYoNUV?(FOI45rPoceXdI5b7Tt>e4QaQpy;M2-Mt}m}c)2h_^Cg6gvBd>7vi}Lnl zKLE#A@P&W1qlE&pI5KaMli-4uX`f?+DG*}y5)rjk9RZYIuhjsw! zx-O#4_Z3R`zN*F;INRlf?4h>>a!TU@z?sXYuM!$^*xPZwJDx>PG6sPg*=n~zX_5nD zp=U5t(5nI|A>hPZOD1em@?|?>R4=5bjnL8)57U;XQL5%B?Fx3-fq#ObRzF_!0ME&= zH1zeUHfntI)i&EN;R)KEJm(C0Su49IZ*M%+KR$GtAq@M?FMqXsZ9!M;9zW`kVy|e> zx9XlY1zoajJ735_g+iq^8ZuQwc9{Xj3-#}V@#nJ8X*54}9?4l1e`|?!WtPf59Q%M9F zX*>P1`L59jy?l)4Xb27j-fY&{393P!0BIp00SIpR5$&q_^{8o6kg+ZLk_J(-E@CqS3aD8*{thO?%O2m6Vt5@iDy4(}=v7X~tXj-q>pdN}un`Y55$E3_C05DeLLnD25 zLK;xR&$fXV8QYr#A+p#B>I7mI%?yuyFDuhIzQ~5IoXwD+$GP0H5c8ItI~nN5&pM~r z0>?dv);RIzqfEf=tCjp4;4hG=&Y%h}alhu?u`%tEgxpTv07(Jy&Q-z7G zu!Xe6X2@9f)Sx>wz4{`sqjR2hup9iGGvLWYiCUoL`3#&I9ViaH1nhJe9+e*%ILAB= zJUWyNoV|J$JpCuyfoF53-F=15ohi(%j9Ggzp=ns_HLZ5$kLVQg)Lod zrjE6Aq~GY+n>VTmvs=g^PaocYA6`vcbOhd|`TTS!6P&P9ATkU;1z~jEv(m?=Wx?s6 zE=GqfwB|c}*W_iLc1j-arVQxuglT8I_M#gNIKwyVz?_F+`b_B@UJGF8lD^=I z!_>ADlnbT==j_RLb9i7*UNWVE1OxF`;K(01KuTYdF`U-t_Kt(&65L0YcwlVwYcB!C zyKnwplR8-RB|iD)>b%tlNz~fwD54TG1qCDw4}m&B03q1divpQEBVzzvZ5f3^>}G_u zvwKt^z;y5XL>n9!B5xCks1V3dWFn#xtJ4{reU8c+F%Q!-z|)=;pqFXW z^)hGK`xs`T=={w{l;1ftZE*06`tbOm%H_clB2q^fqTgOgLd6v2jECE&` z+t|A3GT;k@wIQQWm2jUZwUv?Zhf|m`rNugdDEblpD0vCuRE?awA5kyQf|2~vK;fm$ z+>mz1nV=uA3M~BI05UY&PBYHJ<+inj#!yYB8(&Rj#_3w?;U~Ucg})Dvf?tkr7TpMn zjJ4pJwrWuMl4B6q>>uv;^sdqKIK%X%KUQm@qhO2u02^C(Tp+mMKt$@sLyX^V}>nqAB3auDRF19bE$W|2E*NS5a3iD zK~yJ{w%M&GGRkZlw5A_+^_($sdb5ZL1JV8BX!FlDtjWIkRt_scXDbd99KGHUuvl1U z9R=M~Y8PC&|5Npl?OERH#E}`k7 zs*Fd_vbkeH8N6@}p5UYPG<1z!JhyC4cB+Q#w};zU1CW3bcQcUDk9^k??TjP+addVN z(Ur>tlq#&8@z8ja_L5v2pHwGo|8xfXNs=kLLXP@mH}uR}3Q3ObV1DPgEV`_N3$6%* z9n&nxgAuZI3jyILtkR~^et8fc@;4kjIt9`8x=)a@(Nj$~lUULj0fB0VsvVWG=0q@W zM+Ez&cW{?ZxZn4tv*?7XjR(}6CS#V^w1O90A%k~cziS{Xsq)hi-SoFX)pHVqD3J=3 zAOjYtw&2$+J~nk7V#50-Hfw1!$&3UMcCCD)pxStz!!JPvIr69UTcYEBrUmwiu~XPR zdNK;BG#9Nez<7?g>;XW_o`Ef30R}y6BSecV2~31yu8BjIMJW-;)~Zlpq%CSzyn8ax zPNG);ba5qG6IF^>E&iCcF?Y7|DC;{;7Dh`0wRDq}SQD}3Wz87HwY5a`MR0+%>F_;XqV+R&84hr#i<=n|QW`(hG z=j>1I91#Ns9=YZ!yM?IjsO$_660FwhPO8IaSeiVHVzKR{Gb=-Z!Ey28EyDY?yHQ!Dq%p($sK6$GQD{~tAcSBZv~K{zo4h;5LM5+>qA19 z1wgkg<;wmdrvRjkw+AKxIfe*aGDbR&5Be-`@?A5JSd?rJf7qJonPw;95%1$324}4F zuZODSems_8b&4$CsTkoUzNro&nT~qDjt-K~*~R_x-Q}!Vao~zFzVfIs>R%>+|E8Ys zyFm*Z&h-GMSu&xeZNZEqQyLK>q zD|%)+l-Cw5Y9vcuz6grSd4|->6B_l*H+|r)3(MgIiO!;OEYp)_P+oA<8pfHnf8*tshYXoE�Y_cuTKCU!cN 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 z z93!}zHbduOJxOlat;QtqJ8n{lu~u?`_a->@F(m;&F1U%|67a1<8;t&k-*~g!#F#b! zi(Cw!W$TnMFhr=)!BnfWFB~mD`E%d5{MfJij^*$)_$P>y0ZoQ7crXT&na>7)`#MQV zzj#xgAyQ!P`3++0=kR}=>Uzw!$_3cr;!Moi@~8fz?d4zn5093+lTRcsH?&&K{bLtbQFyI2T@ZK@^o<@MXU<>Jc3It%ltqR=_P&uny-v)_-LC}Wa83}Lt!S`|dPQ8^2|b8qer$Yz{- zC%GX!LG@7_Ndxqpo6>3ezA&ym4w;P!xXmiN#A@Vt-pLT&uZBN#avqOlopg#mGS;gj z^~ugOAj=;eX4@v?9a7r+7O@1$=AF1U%~$RZ56nOxhcZFoJneHCTFuiSoL6)!?KRK{ zLJ|(`o1}>TQvnHV336AtY~T5BoJX!f&(Ic(oQ$p2LxEk+c?I(%Amf01qAMP;e}Yaz zK>r0#XXoe9XFMEROAlR7&k)wJ!V=jiU!z-`9safgk^Z$!KefS^`0G;zxu3IB4j0^M zdy+CfBz`8}`KgihP%H$-gTl-wHK>+R5B+*1=fL4!)eE2QC#$7T;H!N=#a!z?PZC|e zohN$&ZQ8adQFORf>Nx)N+iL74DaBiI!+yboT|xux-`(FP;Ml-RCxmFtb+1ZR1ooH+uC1ZFyvi*R?v3J4=@DQt>M^u8*TF3Y{ae5K zx#idY+%H?cVyrzEa8G^SJFr)A;gRFL*V%k=eE8}hqd5Cq19$h0|EOk-g*I=?hO+1FN5P#mfe!xumj=-e5i6TYmoWQ_Jgz^JMVzf|Jhvl>sK8 z_tK_7n7#(KI`wSDBfHXTXD2tqj{Zlsn?=PA47~*w7MZ$?llIEaz2*G<7ky@bYz?RS zuH{taQWKrXIvwjHvdMzF;$6<)+$1{=eDt03)hFXihRovk&U|GQ2+9WXtwKpb*p`A*>tfZD; zS1^*c$SJ2qKG2_iWm~JCxo+eb>o&n!=oJ)e7iY*%1$1zdd4lOkNjYs=>wqm#CAH!A zcI?J(&TH3%vl;IvSJR)Dp?I3X`MxYA=Q~{J`oPOZ)+y)SI_n%`Kg}nwag^NxGrI`x znPeAIVxD9w*R!o?2ddiNTu`4AxoBlHcuk-&I>Jv2{@6DakkR!DY(E7!)y<8)pTIJ< zIz6y+oHm)0^mXBzG}uS9PfjZPmgTjCEdA9sygVJkt~YZ}zmgaZ+sNR+kBG!eZ!vCnTWIB*q=Vym_P1VAKNm=KvN(pEcq_t z=hzQJBnC$2UgZt#C?aAoZgzUv@qlz1`gOyQ{1?I?nh0aEp)m-#g%UUs%C%&eEJBH= znQ)j@cjn{(q6^13c za;Lyz`fu4ul_J04utvWHG<%H&hQn8?gF-5@b*61_BCLX<(mm~o7?rSEO3eNG z(s#$}a?CYoDr4hpax(YmYhdc@S3?(lP9UQ+nB(Y0K5|VJWCNGCaWNEK0WHRHjcBhf zFT;nMwt12ol_kA+9WKyB?5BwwFx%{f1{@&&N z4^B5c7XXId!KY3jaBfEiCVR)bQ6M;zj~?6XJ)R4i@$`DMvoVeoe4P65Gmd;4?#AF^ z(3YG}-{jY;UcJNpKm3bV%YXfUf4}_YZ|p4J`0z~}%FNbnupFD|B^RC-_dfH!#x-)h zA3TkdAA}EGYBr8_eOzvpk1A4jFw>>(fq-o20DnaEHKaLs8=bJY5@# o{nZaq4OA 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 rH{nuGvleMr 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�Y_cuTKCU!cN zC>1s9(~SAMU;nCq^Lre)61#2NAte8?cU5f(73`Zc_F;3-q<;2wla%0Kbk|}*yj6Mn z6g{lZ$e7n0d#YSO$uk0D?C-V?c)bd6Dlwb)m{s-Z#Pf5|;0&KQ#2?WMTY;Mge#`BM7>BIB1J+}6K*$l0_n_n$Q4)TaW z0tJy4gHsA*e4CEz4hG2iPyqr1{ru|V@OXb`N`(Vn9P(tqN>35j^369M zsN->zp>SpcqADe=T;wjN8FCI}3na{s z3%Zn(=#`B2O%z@3q-sG&K1a4PKtR^{uCM4_+K-OmHE^Xr_G$x9`~vdI|5UV@U5F82 zacY1ZU+7w$aR$?^g?Xpbw8?pIJH)D>2B06Gj8H{J`Ox7tZ<_Vup{j?YP@foL3|=J# zNRUCeUs?;+(N8i0>H-}gkEXl(o6@x%O(9D1CDn^wYW5?8er{ z9*3H*RdC1z__9ShWY@>h$wB)kw~mPu%ee7erEebFsj3s+<{I0A1de2MC7_LcnA7)` z%~+4YuEUL%dg)y&4+)g~E~D2re4$hH5lAA^JTcv{D2apeA->DB+$#*uO&oH*XFXIf6byQYNG4?j%NSufSI zN766(NYSj@Q7L50GFB&lvV&PSBH^1g0-U3)7!7aooh@Z-E+Q@l7`JgqVj8HYKh;>W zA6}vxMm%@18B7<9&uV)%H372m+x@chQr_lxVJm+jiDlz^Np@5Y1Ux(OW%NmZWWk@Q zb~O->EL&-QZMw-~?ep*|d<-^h2H*Y8zi4NkOc(x!KZo&GZ^9q`gKvW|k9~ThYB>C! z#7z~Z$#llCv!5h(=kL~asH~bM Date: Wed, 9 Apr 2025 22:13:50 -0700 Subject: [PATCH 3/5] Re-emit with new credential classes. Update get_azure_openai_client methods --- .../apiview-properties.json | 15 +- .../projects/onedp/aio/operations/_patch.py | 43 +- .../ai/projects/onedp/models/__init__.py | 30 +- .../azure/ai/projects/onedp/models/_enums.py | 30 +- .../azure/ai/projects/onedp/models/_models.py | 411 ++++++++---------- .../ai/projects/onedp/operations/_patch.py | 42 +- .../assistants/sample_get_assistant_client.py | 6 +- .../sample_get_assistant_client_async.py | 7 +- .../samples/connections/sample_connections.py | 3 +- .../connections/sample_connections_async.py | 2 +- .../samples/datasets/sample_datasets.py | 3 +- .../samples/deployments/sample_deployments.py | 5 +- .../deployments/sample_deployments_async.py | 2 +- .../samples/indexes/sample_indexes.py | 3 +- ...ns_with_azure_ai_inference_client_async.py | 5 +- ...pletions_with_azure_openai_client_async.py | 6 +- ...gs_with_azure_ai_inference_client_async.py | 5 +- ...gs_with_azure_ai_inference_client_async.py | 5 +- ...pletions_with_azure_ai_inference_client.py | 5 +- ...at_completions_with_azure_openai_client.py | 6 +- ...beddings_with_azure_ai_inference_client.py | 5 +- ...beddings_with_azure_ai_inference_client.py | 5 +- .../samples/telemetry/sample_telemetry.py | 3 +- .../azure-ai-projects-onedp/tsp-location.yaml | 2 +- 24 files changed, 309 insertions(+), 340 deletions(-) diff --git a/sdk/ai/azure-ai-projects-onedp/apiview-properties.json b/sdk/ai/azure-ai-projects-onedp/apiview-properties.json index b947cd0c8bac..0365ccce083b 100644 --- a/sdk/ai/azure-ai-projects-onedp/apiview-properties.json +++ b/sdk/ai/azure-ai-projects-onedp/apiview-properties.json @@ -1,21 +1,18 @@ { "CrossLanguagePackageId": "Azure.AI.Projects", "CrossLanguageDefinitionId": { + "azure.ai.projects.onedp.models.BaseCredentials": "Azure.AI.Projects.BaseCredentials", + "azure.ai.projects.onedp.models.ApiKeyCredentials": "Azure.AI.Projects.ApiKeyCredentials", "azure.ai.projects.onedp.models.Index": "Azure.AI.Projects.Index", "azure.ai.projects.onedp.models.AzureAISearchIndex": "Azure.AI.Projects.AzureAISearchIndex", "azure.ai.projects.onedp.models.BlobReferenceForConsumption": "Azure.AI.Projects.BlobReferenceForConsumption", "azure.ai.projects.onedp.models.Connection": "Azure.AI.Projects.Connection", - "azure.ai.projects.onedp.models.ConnectionWithApiKeyAuth": "Azure.AI.Projects.ConnectionWithApiKeyAuth", - "azure.ai.projects.onedp.models.ConnectionWithCustomAuth": "Azure.AI.Projects.ConnectionWithCustomAuth", - "azure.ai.projects.onedp.models.ConnectionWithEntraIDAuth": "Azure.AI.Projects.ConnectionWithEntraIDAuth", - "azure.ai.projects.onedp.models.ConnectionWithNoAuth": "Azure.AI.Projects.ConnectionWithNoAuth", - "azure.ai.projects.onedp.models.ConnectionWithSASAuth": "Azure.AI.Projects.ConnectionWithSASAuth", "azure.ai.projects.onedp.models.CosmosDBIndex": "Azure.AI.Projects.CosmosDBIndex", - "azure.ai.projects.onedp.models.CredentialsApiKeyAuth": "Azure.AI.Projects.CredentialsApiKeyAuth", - "azure.ai.projects.onedp.models.CredentialsSASAuth": "Azure.AI.Projects.CredentialsSASAuth", + "azure.ai.projects.onedp.models.CustomCredential": "Azure.AI.Projects.CustomCredential", "azure.ai.projects.onedp.models.DatasetVersion": "Azure.AI.Projects.DatasetVersion", "azure.ai.projects.onedp.models.Deployment": "Azure.AI.Projects.Deployment", "azure.ai.projects.onedp.models.EmbeddingConfiguration": "Azure.AI.Projects.EmbeddingConfiguration", + "azure.ai.projects.onedp.models.EntraIDCredentials": "Azure.AI.Projects.EntraIDCredentials", "azure.ai.projects.onedp.models.Evaluation": "Azure.AI.Projects.Evaluation", "azure.ai.projects.onedp.models.EvaluatorConfiguration": "Azure.AI.Projects.EvaluatorConfiguration", "azure.ai.projects.onedp.models.FileDatasetVersion": "Azure.AI.Projects.FileDatasetVersion", @@ -24,13 +21,15 @@ "azure.ai.projects.onedp.models.InputDataset": "Azure.AI.Projects.InputDataset", "azure.ai.projects.onedp.models.ManagedAzureAISearchIndex": "Azure.AI.Projects.ManagedAzureAISearchIndex", "azure.ai.projects.onedp.models.ModelDeployment": "Azure.AI.Projects.ModelDeployment", + "azure.ai.projects.onedp.models.NoAuthenticationCredentials": "Azure.AI.Projects.NoAuthenticationCredentials", "azure.ai.projects.onedp.models.PendingUploadRequest": "Azure.AI.Projects.PendingUploadRequest", "azure.ai.projects.onedp.models.PendingUploadResponse": "Azure.AI.Projects.PendingUploadResponse", "azure.ai.projects.onedp.models.RedTeam": "Azure.AI.Projects.RedTeam", "azure.ai.projects.onedp.models.SasCredential": "Azure.AI.Projects.SasCredential", + "azure.ai.projects.onedp.models.SASCredentials": "Azure.AI.Projects.SASCredentials", "azure.ai.projects.onedp.models.Sku": "Azure.AI.Projects.Sku", - "azure.ai.projects.onedp.models.AuthenticationType": "Azure.AI.Projects.AuthenticationType", "azure.ai.projects.onedp.models.ConnectionType": "Azure.AI.Projects.ConnectionType", + "azure.ai.projects.onedp.models.CredentialType": "Azure.AI.Projects.CredentialType", "azure.ai.projects.onedp.models.DatasetType": "Azure.AI.Projects.DatasetType", "azure.ai.projects.onedp.models.ListViewType": "Azure.AI.Projects.ListViewType", "azure.ai.projects.onedp.models.PendingUploadType": "Azure.AI.Projects.PendingUploadType", diff --git a/sdk/ai/azure-ai-projects-onedp/azure/ai/projects/onedp/aio/operations/_patch.py b/sdk/ai/azure-ai-projects-onedp/azure/ai/projects/onedp/aio/operations/_patch.py index f3ffa01e7856..ab9d62b95f73 100644 --- a/sdk/ai/azure-ai-projects-onedp/azure/ai/projects/onedp/aio/operations/_patch.py +++ b/sdk/ai/azure-ai-projects-onedp/azure/ai/projects/onedp/aio/operations/_patch.py @@ -23,11 +23,15 @@ PendingUploadRequest, PendingUploadType, PendingUploadResponse, + Connection, + ApiKeyCredentials, + EntraIDCredentials ) -from ...models._enums import DatasetType, AuthenticationType, ConnectionType +from ...models._enums import DatasetType, CredentialType, ConnectionType logger = logging.getLogger(__name__) + class AssistantsOperations: # TODO: Merge all code related to handling user-agent, into a single place. @@ -275,38 +279,41 @@ async def get_azure_openai_client( ) from e if connection_name: - connection = await self._outer_instance.connections.get(name=connection_name, **kwargs) + connection: Connection = await self._outer_instance.connections.get(name=connection_name, **kwargs) + if connection.type != ConnectionType.AZURE_OPEN_AI: + raise ValueError(f"Connection `{connection_name}` is not of type Azure OpenAI.") else: # If connection name was not specified, get the default Azure OpenAI connection. connections = await self._outer_instance.connections.list( - connection_type=ConnectionType.AZURE_OPEN_AI, - default_connection=True, - **kwargs + connection_type=ConnectionType.AZURE_OPEN_AI, default_connection=True, **kwargs ) - connection = next(iter(connections), None) + connection: Connection = next(iter(connections), None) if not connection: raise ResourceNotFoundError("No default Azure OpenAI connection found.") connection_name = connection.name - # If the connection uses API key authentication, we need to make another service call to get + # TODO: if there isn't a default openai connection, we would have to by convention + # use https://{resource-name}.openai.azure.com where {resource-name} is the same as the + # foundry API endpoint (https://{resource-name}.services.ai.azure.com) + + # If the connection uses API key authentication, we need to make another service call to get # the connection with API key populated. - if connection.auth_type == AuthenticationType.API_KEY: + if connection.credentials.auth_type == CredentialType.API_KEY: connection = await self._outer_instance.connections.get_with_credentials(name=connection_name, **kwargs) logger.debug("[InferenceOperations.get_azure_openai_client] connection = %s", str(connection)) azure_endpoint = connection.target[:-1] if connection.target.endswith("/") else connection.target - if connection.auth_type == AuthenticationType.API_KEY: - - api_key = connection.credentials.key + if isinstance(connection.credentials, ApiKeyCredentials): logger.debug( "[InferenceOperations.get_azure_openai_client] Creating AzureOpenAI using API key authentication" ) + api_key = connection.credentials.api_key client = AsyncAzureOpenAI(api_key=api_key, azure_endpoint=azure_endpoint, api_version=api_version) - elif connection.auth_type == AuthenticationType.ENTRA_ID: + elif isinstance(connection.credentials, EntraIDCredentials): logger.debug( "[InferenceOperations.get_azure_openai_client] Creating AzureOpenAI using Entra ID authentication" @@ -365,7 +372,7 @@ async def _create_dataset_and_get_its_container_client( raise ValueError("Blob reference for consumption is not present") if not pending_upload_response.blob_reference_for_consumption.credential.type: raise ValueError("Credential type is not present") - if pending_upload_response.blob_reference_for_consumption.credential.type != AuthenticationType.SAS: + if pending_upload_response.blob_reference_for_consumption.credential.type != CredentialType.SAS: raise ValueError("Credential type is not SAS") if not pending_upload_response.blob_reference_for_consumption.blob_uri: raise ValueError("Blob URI is not present or empty") @@ -401,7 +408,7 @@ async def _create_dataset_and_get_its_container_client( "[%s] pending_upload_response.blob_reference_for_consumption.credential.type = %s.", method, pending_upload_response.blob_reference_for_consumption.credential.type, - ) # == AuthenticationType.SAS + ) # == CredentialType.SAS # For overview on Blob storage SDK in Python see: # https://learn.microsoft.com/azure/storage/blobs/storage-quickstart-blobs-python @@ -415,9 +422,7 @@ async def _create_dataset_and_get_its_container_client( output_version, ) - async def upload_file_and_create( - self, *, name: str, version: str, file: str, **kwargs: Any - ) -> DatasetVersion: + async def upload_file_and_create(self, *, name: str, version: str, file: str, **kwargs: Any) -> DatasetVersion: """Upload file to a blob storage, and create a dataset that references this file. This method uses the `ContainerClient.upload_blob` method from the azure-storage-blob package to upload the file. Any keyword arguments provided will be passed to the `upload_blob` method. @@ -473,9 +478,7 @@ async def upload_file_and_create( return dataset_version - async def upload_folder_and_create( - self, *, name: str, version: str, folder: str, **kwargs: Any - ) -> DatasetVersion: + async def upload_folder_and_create(self, *, name: str, version: str, folder: str, **kwargs: Any) -> DatasetVersion: """Upload all files in a folder and its sub folders to a blob storage, while maintaining relative paths, and create a dataset that references this folder. This method uses the `ContainerClient.upload_blob` method from the azure-storage-blob package diff --git a/sdk/ai/azure-ai-projects-onedp/azure/ai/projects/onedp/models/__init__.py b/sdk/ai/azure-ai-projects-onedp/azure/ai/projects/onedp/models/__init__.py index d4e288c9d734..47b84dbc259b 100644 --- a/sdk/ai/azure-ai-projects-onedp/azure/ai/projects/onedp/models/__init__.py +++ b/sdk/ai/azure-ai-projects-onedp/azure/ai/projects/onedp/models/__init__.py @@ -14,20 +14,17 @@ from ._models import ( # type: ignore + ApiKeyCredentials, AzureAISearchIndex, + BaseCredentials, BlobReferenceForConsumption, Connection, - ConnectionWithApiKeyAuth, - ConnectionWithCustomAuth, - ConnectionWithEntraIDAuth, - ConnectionWithNoAuth, - ConnectionWithSASAuth, CosmosDBIndex, - CredentialsApiKeyAuth, - CredentialsSASAuth, + CustomCredential, DatasetVersion, Deployment, EmbeddingConfiguration, + EntraIDCredentials, Evaluation, EvaluatorConfiguration, FileDatasetVersion, @@ -37,17 +34,19 @@ InputDataset, ManagedAzureAISearchIndex, ModelDeployment, + NoAuthenticationCredentials, PendingUploadRequest, PendingUploadResponse, RedTeam, + SASCredentials, SasCredential, Sku, ) from ._enums import ( # type: ignore AttackStrategy, - AuthenticationType, ConnectionType, + CredentialType, DatasetType, DeploymentType, IndexType, @@ -60,20 +59,17 @@ from ._patch import patch_sdk as _patch_sdk __all__ = [ + "ApiKeyCredentials", "AzureAISearchIndex", + "BaseCredentials", "BlobReferenceForConsumption", "Connection", - "ConnectionWithApiKeyAuth", - "ConnectionWithCustomAuth", - "ConnectionWithEntraIDAuth", - "ConnectionWithNoAuth", - "ConnectionWithSASAuth", "CosmosDBIndex", - "CredentialsApiKeyAuth", - "CredentialsSASAuth", + "CustomCredential", "DatasetVersion", "Deployment", "EmbeddingConfiguration", + "EntraIDCredentials", "Evaluation", "EvaluatorConfiguration", "FileDatasetVersion", @@ -83,14 +79,16 @@ "InputDataset", "ManagedAzureAISearchIndex", "ModelDeployment", + "NoAuthenticationCredentials", "PendingUploadRequest", "PendingUploadResponse", "RedTeam", + "SASCredentials", "SasCredential", "Sku", "AttackStrategy", - "AuthenticationType", "ConnectionType", + "CredentialType", "DatasetType", "DeploymentType", "IndexType", diff --git a/sdk/ai/azure-ai-projects-onedp/azure/ai/projects/onedp/models/_enums.py b/sdk/ai/azure-ai-projects-onedp/azure/ai/projects/onedp/models/_enums.py index 96bb9edff7b6..a81e68e9cc9d 100644 --- a/sdk/ai/azure-ai-projects-onedp/azure/ai/projects/onedp/models/_enums.py +++ b/sdk/ai/azure-ai-projects-onedp/azure/ai/projects/onedp/models/_enums.py @@ -34,21 +34,6 @@ class AttackStrategy(str, Enum, metaclass=CaseInsensitiveEnumMeta): """Represents character swapping, a technique for rearranging characters in text.""" -class AuthenticationType(str, Enum, metaclass=CaseInsensitiveEnumMeta): - """The authentication type used by the connection.""" - - API_KEY = "ApiKey" - """API Key authentication""" - ENTRA_ID = "AAD" - """Entra ID authentication (formerly known as AAD)""" - SAS = "SAS" - """Shared Access Signature (SAS) authentication""" - CUSTOM = "CustomKeys" - """Custom authentication""" - NONE = "None" - """No authentication""" - - class ConnectionType(str, Enum, metaclass=CaseInsensitiveEnumMeta): """The Type (or category) of the connection.""" @@ -72,6 +57,21 @@ class ConnectionType(str, Enum, metaclass=CaseInsensitiveEnumMeta): """Custom Keys""" +class CredentialType(str, Enum, metaclass=CaseInsensitiveEnumMeta): + """The credential type used by the connection.""" + + API_KEY = "ApiKey" + """API Key credential""" + ENTRA_ID = "AAD" + """Entra ID credential (formerly known as AAD)""" + SAS = "SAS" + """Shared Access Signature (SAS) credential""" + CUSTOM = "CustomKeys" + """Custom credential""" + NONE = "None" + """No credential""" + + class DatasetType(str, Enum, metaclass=CaseInsensitiveEnumMeta): """Enum to determine the type of data.""" diff --git a/sdk/ai/azure-ai-projects-onedp/azure/ai/projects/onedp/models/_models.py b/sdk/ai/azure-ai-projects-onedp/azure/ai/projects/onedp/models/_models.py index ab128b482533..8e2dbdf54f03 100644 --- a/sdk/ai/azure-ai-projects-onedp/azure/ai/projects/onedp/models/_models.py +++ b/sdk/ai/azure-ai-projects-onedp/azure/ai/projects/onedp/models/_models.py @@ -12,12 +12,77 @@ from .. import _model_base from .._model_base import rest_discriminator, rest_field -from ._enums import AuthenticationType, DatasetType, DeploymentType, IndexType, PendingUploadType +from ._enums import CredentialType, DatasetType, DeploymentType, IndexType, PendingUploadType if TYPE_CHECKING: from .. import models as _models +class BaseCredentials(_model_base.Model): + """A base class for connection credentials. + + You probably want to use the sub-classes and not this class directly. Known sub-classes are: + EntraIDCredentials, ApiKeyCredentials, CustomCredential, NoAuthenticationCredentials, + SASCredentials + + :ivar auth_type: The type of credential used by the connection. Required. Known values are: + "ApiKey", "AAD", "SAS", "CustomKeys", and "None". + :vartype auth_type: str or ~azure.ai.projects.onedp.models.CredentialType + """ + + __mapping__: Dict[str, _model_base.Model] = {} + auth_type: str = rest_discriminator(name="authType", visibility=["read"]) + """The type of credential used by the connection. Required. Known values are: \"ApiKey\", \"AAD\", + \"SAS\", \"CustomKeys\", and \"None\".""" + + @overload + def __init__( + self, + *, + auth_type: str, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + + +class ApiKeyCredentials(BaseCredentials, discriminator="ApiKey"): + """API Key Credential definition. + + :ivar auth_type: The credentail type. Required. API Key credential + :vartype auth_type: str or ~azure.ai.projects.onedp.models.API_KEY + :ivar api_key: API Key. + :vartype api_key: str + """ + + auth_type: Literal[CredentialType.API_KEY] = rest_discriminator(name="authType", visibility=["read"]) # type: ignore + """The credentail type. Required. API Key credential""" + api_key: Optional[str] = rest_field(name="apiKey", visibility=["read"]) + """API Key.""" + + @overload + def __init__( + self, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, auth_type=CredentialType.API_KEY, **kwargs) + + class Index(_model_base.Model): """Index resource Definition. @@ -177,13 +242,8 @@ def __init__(self, *args: Any, **kwargs: Any) -> None: class Connection(_model_base.Model): """Response from the list and get connections operations. - You probably want to use the sub-classes and not this class directly. Known sub-classes are: - ConnectionWithEntraIDAuth, ConnectionWithApiKeyAuth, ConnectionWithCustomAuth, - ConnectionWithNoAuth, ConnectionWithSASAuth - - :ivar auth_type: The authentication type used by the connection. Required. Known values are: - "ApiKey", "AAD", "SAS", "CustomKeys", and "None". - :vartype auth_type: str or ~azure.ai.projects.onedp.models.AuthenticationType + :ivar auth_type: Discriminator property for Connection. Required. + :vartype auth_type: str :ivar name: The name of the resource. Required. :vartype name: str :ivar type: Category of the connection. Required. Known values are: "AzureOpenAI", "AzureBlob", @@ -195,14 +255,14 @@ class Connection(_model_base.Model): :ivar is_default: Whether the connection is tagged as the default connection of its type. Required. :vartype is_default: bool + :ivar credentials: The credentials used by the connection. Required. + :vartype credentials: ~azure.ai.projects.onedp.models.BaseCredentials :ivar metadata: Metadata of the connection. Required. :vartype metadata: dict[str, str] """ - __mapping__: Dict[str, _model_base.Model] = {} - auth_type: str = rest_discriminator(name="authType", visibility=["read"]) - """The authentication type used by the connection. Required. Known values are: \"ApiKey\", - \"AAD\", \"SAS\", \"CustomKeys\", and \"None\".""" + auth_type: str = rest_discriminator(name="authType") + """Discriminator property for Connection. Required.""" name: str = rest_field(visibility=["read"]) """The name of the resource. Required.""" type: Union[str, "_models.ConnectionType"] = rest_field(visibility=["read"]) @@ -213,14 +273,14 @@ class Connection(_model_base.Model): """The connection URL to be used for this service. Required.""" is_default: bool = rest_field(name="isDefault", visibility=["read"]) """Whether the connection is tagged as the default connection of its type. Required.""" + credentials: "_models.BaseCredentials" = rest_field(visibility=["read"]) + """The credentials used by the connection. Required.""" metadata: Dict[str, str] = rest_field(visibility=["read"]) """Metadata of the connection. Required.""" @overload def __init__( self, - *, - auth_type: str, ) -> None: ... @overload @@ -234,215 +294,6 @@ def __init__(self, *args: Any, **kwargs: Any) -> None: super().__init__(*args, **kwargs) -class ConnectionWithApiKeyAuth(Connection, discriminator="ApiKey"): - """A connection with API key authentication. - - :ivar name: The name of the resource. Required. - :vartype name: str - :ivar type: Category of the connection. Required. Known values are: "AzureOpenAI", "AzureBlob", - "AzureStorageAccount", "CognitiveSearch", "CosmosDB", "ApiKey", "AppConfig", "AppInsights", and - "CustomKeys". - :vartype type: str or ~azure.ai.projects.onedp.models.ConnectionType - :ivar target: The connection URL to be used for this service. Required. - :vartype target: str - :ivar is_default: Whether the connection is tagged as the default connection of its type. - Required. - :vartype is_default: bool - :ivar metadata: Metadata of the connection. Required. - :vartype metadata: dict[str, str] - :ivar auth_type: The authentication type used by the connection. Required. API Key - authentication - :vartype auth_type: str or ~azure.ai.projects.onedp.models.API_KEY - :ivar credentials: The credentials for API-key authentication. - :vartype credentials: ~azure.ai.projects.onedp.models.CredentialsApiKeyAuth - """ - - auth_type: Literal[AuthenticationType.API_KEY] = rest_discriminator(name="authType", visibility=["read"]) # type: ignore - """The authentication type used by the connection. Required. API Key authentication""" - credentials: Optional["_models.CredentialsApiKeyAuth"] = rest_field(visibility=["read"]) - """The credentials for API-key authentication.""" - - @overload - def __init__( - self, - ) -> None: ... - - @overload - def __init__(self, mapping: Mapping[str, Any]) -> None: - """ - :param mapping: raw JSON to initialize the model. - :type mapping: Mapping[str, Any] - """ - - def __init__(self, *args: Any, **kwargs: Any) -> None: - super().__init__(*args, auth_type=AuthenticationType.API_KEY, **kwargs) - - -class ConnectionWithCustomAuth(Connection, discriminator="CustomKeys"): - """A connection with custom authentication. - - :ivar name: The name of the resource. Required. - :vartype name: str - :ivar type: Category of the connection. Required. Known values are: "AzureOpenAI", "AzureBlob", - "AzureStorageAccount", "CognitiveSearch", "CosmosDB", "ApiKey", "AppConfig", "AppInsights", and - "CustomKeys". - :vartype type: str or ~azure.ai.projects.onedp.models.ConnectionType - :ivar target: The connection URL to be used for this service. Required. - :vartype target: str - :ivar is_default: Whether the connection is tagged as the default connection of its type. - Required. - :vartype is_default: bool - :ivar metadata: Metadata of the connection. Required. - :vartype metadata: dict[str, str] - :ivar auth_type: The authentication type used by the connection. Required. Custom - authentication - :vartype auth_type: str or ~azure.ai.projects.onedp.models.CUSTOM - """ - - auth_type: Literal[AuthenticationType.CUSTOM] = rest_discriminator(name="authType", visibility=["read"]) # type: ignore - """The authentication type used by the connection. Required. Custom authentication""" - - @overload - def __init__( - self, - ) -> None: ... - - @overload - def __init__(self, mapping: Mapping[str, Any]) -> None: - """ - :param mapping: raw JSON to initialize the model. - :type mapping: Mapping[str, Any] - """ - - def __init__(self, *args: Any, **kwargs: Any) -> None: - super().__init__(*args, auth_type=AuthenticationType.CUSTOM, **kwargs) - - -class ConnectionWithEntraIDAuth(Connection, discriminator="AAD"): - """A connection with EntraID authentication (aka ``Entra ID passthrough``). - - :ivar name: The name of the resource. Required. - :vartype name: str - :ivar type: Category of the connection. Required. Known values are: "AzureOpenAI", "AzureBlob", - "AzureStorageAccount", "CognitiveSearch", "CosmosDB", "ApiKey", "AppConfig", "AppInsights", and - "CustomKeys". - :vartype type: str or ~azure.ai.projects.onedp.models.ConnectionType - :ivar target: The connection URL to be used for this service. Required. - :vartype target: str - :ivar is_default: Whether the connection is tagged as the default connection of its type. - Required. - :vartype is_default: bool - :ivar metadata: Metadata of the connection. Required. - :vartype metadata: dict[str, str] - :ivar auth_type: The authentication type used by the connection. Required. Entra ID - authentication (formerly known as AAD) - :vartype auth_type: str or ~azure.ai.projects.onedp.models.ENTRA_ID - """ - - auth_type: Literal[AuthenticationType.ENTRA_ID] = rest_discriminator(name="authType", visibility=["read"]) # type: ignore - """The authentication type used by the connection. Required. Entra ID authentication (formerly - known as AAD)""" - - @overload - def __init__( - self, - ) -> None: ... - - @overload - def __init__(self, mapping: Mapping[str, Any]) -> None: - """ - :param mapping: raw JSON to initialize the model. - :type mapping: Mapping[str, Any] - """ - - def __init__(self, *args: Any, **kwargs: Any) -> None: - super().__init__(*args, auth_type=AuthenticationType.ENTRA_ID, **kwargs) - - -class ConnectionWithNoAuth(Connection, discriminator="None"): - """A connection with no authentication. - - :ivar name: The name of the resource. Required. - :vartype name: str - :ivar type: Category of the connection. Required. Known values are: "AzureOpenAI", "AzureBlob", - "AzureStorageAccount", "CognitiveSearch", "CosmosDB", "ApiKey", "AppConfig", "AppInsights", and - "CustomKeys". - :vartype type: str or ~azure.ai.projects.onedp.models.ConnectionType - :ivar target: The connection URL to be used for this service. Required. - :vartype target: str - :ivar is_default: Whether the connection is tagged as the default connection of its type. - Required. - :vartype is_default: bool - :ivar metadata: Metadata of the connection. Required. - :vartype metadata: dict[str, str] - :ivar auth_type: The authentication type used by the connection. Required. No authentication - :vartype auth_type: str or ~azure.ai.projects.onedp.models.NONE - """ - - auth_type: Literal[AuthenticationType.NONE] = rest_discriminator(name="authType", visibility=["read"]) # type: ignore - """The authentication type used by the connection. Required. No authentication""" - - @overload - def __init__( - self, - ) -> None: ... - - @overload - def __init__(self, mapping: Mapping[str, Any]) -> None: - """ - :param mapping: raw JSON to initialize the model. - :type mapping: Mapping[str, Any] - """ - - def __init__(self, *args: Any, **kwargs: Any) -> None: - super().__init__(*args, auth_type=AuthenticationType.NONE, **kwargs) - - -class ConnectionWithSASAuth(Connection, discriminator="SAS"): - """A connection with Shared Access Signature (SAS) authentication. - - :ivar name: The name of the resource. Required. - :vartype name: str - :ivar type: Category of the connection. Required. Known values are: "AzureOpenAI", "AzureBlob", - "AzureStorageAccount", "CognitiveSearch", "CosmosDB", "ApiKey", "AppConfig", "AppInsights", and - "CustomKeys". - :vartype type: str or ~azure.ai.projects.onedp.models.ConnectionType - :ivar target: The connection URL to be used for this service. Required. - :vartype target: str - :ivar is_default: Whether the connection is tagged as the default connection of its type. - Required. - :vartype is_default: bool - :ivar metadata: Metadata of the connection. Required. - :vartype metadata: dict[str, str] - :ivar auth_type: The authentication type used by the connection. Required. Shared Access - Signature (SAS) authentication - :vartype auth_type: str or ~azure.ai.projects.onedp.models.SAS - :ivar credentials: The credentials for SAS authentication. - :vartype credentials: ~azure.ai.projects.onedp.models.CredentialsSASAuth - """ - - auth_type: Literal[AuthenticationType.SAS] = rest_discriminator(name="authType", visibility=["read"]) # type: ignore - """The authentication type used by the connection. Required. Shared Access Signature (SAS) - authentication""" - credentials: Optional["_models.CredentialsSASAuth"] = rest_field(visibility=["read"]) - """The credentials for SAS authentication.""" - - @overload - def __init__( - self, - ) -> None: ... - - @overload - def __init__(self, mapping: Mapping[str, Any]) -> None: - """ - :param mapping: raw JSON to initialize the model. - :type mapping: Mapping[str, Any] - """ - - def __init__(self, *args: Any, **kwargs: Any) -> None: - super().__init__(*args, auth_type=AuthenticationType.SAS, **kwargs) - - class CosmosDBIndex(Index, discriminator="CosmosDBNoSqlVectorStore"): """CosmosDB Vector Store Index Definition. @@ -507,26 +358,30 @@ def __init__(self, *args: Any, **kwargs: Any) -> None: super().__init__(*args, type=IndexType.COSMOS_DB, **kwargs) -class CredentialsApiKeyAuth(_model_base.Model): - """The credentials needed for API key authentication. +class CustomCredential(BaseCredentials, discriminator="CustomKeys"): + """Custom credential defintion. - :ivar key: The API key. Required. - :vartype key: str + :ivar auth_type: The credential type. Required. Custom credential + :vartype auth_type: str or ~azure.ai.projects.onedp.models.CUSTOM """ - key: str = rest_field(visibility=["read"]) - """The API key. Required.""" + auth_type: Literal[CredentialType.CUSTOM] = rest_discriminator(name="authType", visibility=["read"]) # type: ignore + """The credential type. Required. Custom credential""" + @overload + def __init__( + self, + ) -> None: ... -class CredentialsSASAuth(_model_base.Model): - """The credentials needed for Shared Access Signatures (SAS) authentication. - - :ivar sas: The Shared Access Signatures (SAS) token. Required. - :vartype sas: str - """ + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ - sas: str = rest_field(name="SAS", visibility=["read"]) - """The Shared Access Signatures (SAS) token. Required.""" + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, auth_type=CredentialType.CUSTOM, **kwargs) class DatasetVersion(_model_base.Model): @@ -675,6 +530,32 @@ def __init__(self, *args: Any, **kwargs: Any) -> None: super().__init__(*args, **kwargs) +class EntraIDCredentials(BaseCredentials, discriminator="AAD"): + """Entra ID credential definition. + + :ivar auth_type: The credential type. Required. Entra ID credential (formerly known as AAD) + :vartype auth_type: str or ~azure.ai.projects.onedp.models.ENTRA_ID + """ + + auth_type: Literal[CredentialType.ENTRA_ID] = rest_discriminator(name="authType", visibility=["read"]) # type: ignore + """The credential type. Required. Entra ID credential (formerly known as AAD)""" + + @overload + def __init__( + self, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, auth_type=CredentialType.ENTRA_ID, **kwargs) + + class Evaluation(_model_base.Model): """Evaluation Definition. @@ -1058,6 +939,32 @@ def __init__(self, *args: Any, **kwargs: Any) -> None: super().__init__(*args, type=DeploymentType.MODEL_DEPLOYMENT, **kwargs) +class NoAuthenticationCredentials(BaseCredentials, discriminator="None"): + """Credentials that do not require authentication. + + :ivar auth_type: The credential type. Required. No credential + :vartype auth_type: str or ~azure.ai.projects.onedp.models.NONE + """ + + auth_type: Literal[CredentialType.NONE] = rest_discriminator(name="authType", visibility=["read"]) # type: ignore + """The credential type. Required. No credential""" + + @overload + def __init__( + self, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, auth_type=CredentialType.NONE, **kwargs) + + class PendingUploadRequest(_model_base.Model): """Represents a request for a pending upload. @@ -1265,6 +1172,36 @@ def __init__(self, *args: Any, **kwargs: Any) -> None: self.type: Literal["SAS"] = "SAS" +class SASCredentials(BaseCredentials, discriminator="SAS"): + """Shared Access Signature (SAS) credential definition. + + :ivar auth_type: The credential type. Required. Shared Access Signature (SAS) credential + :vartype auth_type: str or ~azure.ai.projects.onedp.models.SAS + :ivar sas_token: SAS token. + :vartype sas_token: str + """ + + auth_type: Literal[CredentialType.SAS] = rest_discriminator(name="authType", visibility=["read"]) # type: ignore + """The credential type. Required. Shared Access Signature (SAS) credential""" + sas_token: Optional[str] = rest_field(name="sasToken", visibility=["read"]) + """SAS token.""" + + @overload + def __init__( + self, + ) -> None: ... + + @overload + def __init__(self, mapping: Mapping[str, Any]) -> None: + """ + :param mapping: raw JSON to initialize the model. + :type mapping: Mapping[str, Any] + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, auth_type=CredentialType.SAS, **kwargs) + + class Sku(_model_base.Model): """Sku information. diff --git a/sdk/ai/azure-ai-projects-onedp/azure/ai/projects/onedp/operations/_patch.py b/sdk/ai/azure-ai-projects-onedp/azure/ai/projects/onedp/operations/_patch.py index 237a08666265..e8dd877fe198 100644 --- a/sdk/ai/azure-ai-projects-onedp/azure/ai/projects/onedp/operations/_patch.py +++ b/sdk/ai/azure-ai-projects-onedp/azure/ai/projects/onedp/operations/_patch.py @@ -16,15 +16,16 @@ from azure.core.exceptions import ResourceNotFoundError from azure.core.tracing.decorator import distributed_trace from ._operations import DatasetsOperations as DatasetsOperationsGenerated -from ..models._models import DatasetVersion, PendingUploadRequest, PendingUploadType, PendingUploadResponse, Connection +from ..models._models import DatasetVersion, PendingUploadRequest, PendingUploadType, PendingUploadResponse, Connection, ApiKeyCredentials, EntraIDCredentials from ..models._enums import ( DatasetType, - AuthenticationType, + CredentialType, ConnectionType, ) logger = logging.getLogger(__name__) + class AssistantsOperations: # TODO: Merge all code related to handling user-agent, into a single place. @@ -269,38 +270,41 @@ def get_azure_openai_client( ) from e if connection_name: - connection = self._outer_instance.connections.get(name=connection_name, **kwargs) + connection: Connection = self._outer_instance.connections.get(name=connection_name, **kwargs) + if connection.type != ConnectionType.AZURE_OPEN_AI: + raise ValueError(f"Connection `{connection_name}` is not of type Azure OpenAI.") else: # If connection name was not specified, get the default Azure OpenAI connection. connections = self._outer_instance.connections.list( - connection_type=ConnectionType.AZURE_OPEN_AI, - default_connection=True, - **kwargs + connection_type=ConnectionType.AZURE_OPEN_AI, default_connection=True, **kwargs ) - connection = next(iter(connections), None) + connection: Connection = next(iter(connections), None) if not connection: raise ResourceNotFoundError("No default Azure OpenAI connection found.") connection_name = connection.name - # If the connection uses API key authentication, we need to make another service call to get + # TODO: if there isn't a default openai connection, we would have to by convention + # use https://{resource-name}.openai.azure.com where {resource-name} is the same as the + # foundry API endpoint (https://{resource-name}.services.ai.azure.com) + + # If the connection uses API key authentication, we need to make another service call to get # the connection with API key populated. - if connection.auth_type == AuthenticationType.API_KEY: + if connection.credentials.auth_type == CredentialType.API_KEY: connection = self._outer_instance.connections.get_with_credentials(name=connection_name, **kwargs) logger.debug("[InferenceOperations.get_azure_openai_client] connection = %s", str(connection)) azure_endpoint = connection.target[:-1] if connection.target.endswith("/") else connection.target - if connection.auth_type == AuthenticationType.API_KEY: - - api_key = connection.credentials.key + if isinstance(connection.credentials, ApiKeyCredentials): logger.debug( "[InferenceOperations.get_azure_openai_client] Creating AzureOpenAI using API key authentication" ) + api_key = connection.credentials.api_key client = AzureOpenAI(api_key=api_key, azure_endpoint=azure_endpoint, api_version=api_version) - elif connection.auth_type == AuthenticationType.ENTRA_ID: + elif isinstance(connection.credentials, EntraIDCredentials): logger.debug( "[InferenceOperations.get_azure_openai_client] Creating AzureOpenAI using Entra ID authentication" @@ -393,7 +397,7 @@ def _create_dataset_and_get_its_container_client( raise ValueError("Blob reference for consumption is not present") if not pending_upload_response.blob_reference_for_consumption.credential.type: raise ValueError("Credential type is not present") - if pending_upload_response.blob_reference_for_consumption.credential.type != AuthenticationType.SAS: + if pending_upload_response.blob_reference_for_consumption.credential.type != CredentialType.SAS: raise ValueError("Credential type is not SAS") if not pending_upload_response.blob_reference_for_consumption.blob_uri: raise ValueError("Blob URI is not present or empty") @@ -429,7 +433,7 @@ def _create_dataset_and_get_its_container_client( "[%s] pending_upload_response.blob_reference_for_consumption.credential.type = %s.", method, pending_upload_response.blob_reference_for_consumption.credential.type, - ) # == AuthenticationType.SAS + ) # == CredentialType.SAS # For overview on Blob storage SDK in Python see: # https://learn.microsoft.com/azure/storage/blobs/storage-quickstart-blobs-python @@ -443,9 +447,7 @@ def _create_dataset_and_get_its_container_client( output_version, ) - def upload_file_and_create( - self, *, name: str, version: str, file: str, **kwargs: Any - ) -> DatasetVersion: + def upload_file_and_create(self, *, name: str, version: str, file: str, **kwargs: Any) -> DatasetVersion: """Upload file to a blob storage, and create a dataset that references this file. This method uses the `ContainerClient.upload_blob` method from the azure-storage-blob package to upload the file. Any keyword arguments provided will be passed to the `upload_blob` method. @@ -501,9 +503,7 @@ def upload_file_and_create( return dataset_version - def upload_folder_and_create( - self, *, name: str, version: str, folder: str, **kwargs: Any - ) -> DatasetVersion: + def upload_folder_and_create(self, *, name: str, version: str, folder: str, **kwargs: Any) -> DatasetVersion: """Upload all files in a folder and its sub folders to a blob storage, while maintaining relative paths, and create a dataset that references this folder. This method uses the `ContainerClient.upload_blob` method from the azure-storage-blob package diff --git a/sdk/ai/azure-ai-projects-onedp/samples/assistants/sample_get_assistant_client.py b/sdk/ai/azure-ai-projects-onedp/samples/assistants/sample_get_assistant_client.py index c216c2fcfeda..c881b1cc9757 100644 --- a/sdk/ai/azure-ai-projects-onedp/samples/assistants/sample_get_assistant_client.py +++ b/sdk/ai/azure-ai-projects-onedp/samples/assistants/sample_get_assistant_client.py @@ -22,7 +22,9 @@ """ import os -from azure.core.credentials import AzureKeyCredential # TODO: Remove me when EntraID is supported # TODO: Remove me when EntraID is supported +from azure.core.credentials import ( + AzureKeyCredential, +) # TODO: Remove me when EntraID is supported # TODO: Remove me when EntraID is supported from azure.identity import DefaultAzureCredential from azure.ai.projects.onedp import AIProjectClient @@ -36,4 +38,4 @@ ) as project_client: with project_client.assistants.get_client() as client: - pass \ No newline at end of file + pass diff --git a/sdk/ai/azure-ai-projects-onedp/samples/assistants/sample_get_assistant_client_async.py b/sdk/ai/azure-ai-projects-onedp/samples/assistants/sample_get_assistant_client_async.py index 29737b678c5d..0df9d4100aab 100644 --- a/sdk/ai/azure-ai-projects-onedp/samples/assistants/sample_get_assistant_client_async.py +++ b/sdk/ai/azure-ai-projects-onedp/samples/assistants/sample_get_assistant_client_async.py @@ -23,10 +23,13 @@ import os import asyncio -from azure.core.credentials import AzureKeyCredential # TODO: Remove me when EntraID is supported # TODO: Remove me when EntraID is supported +from azure.core.credentials import ( + AzureKeyCredential, +) # TODO: Remove me when EntraID is supported # TODO: Remove me when EntraID is supported from azure.identity import DefaultAzureCredential from azure.ai.projects.onedp.aio import AIProjectClient + async def sample_get_assistant_client_async(): endpoint = os.environ["PROJECT_ENDPOINT"] @@ -47,4 +50,4 @@ async def main(): if __name__ == "__main__": - asyncio.run(main()) \ No newline at end of file + asyncio.run(main()) diff --git a/sdk/ai/azure-ai-projects-onedp/samples/connections/sample_connections.py b/sdk/ai/azure-ai-projects-onedp/samples/connections/sample_connections.py index 8543383a991c..781a48d99a05 100644 --- a/sdk/ai/azure-ai-projects-onedp/samples/connections/sample_connections.py +++ b/sdk/ai/azure-ai-projects-onedp/samples/connections/sample_connections.py @@ -25,13 +25,14 @@ import os from azure.identity import DefaultAzureCredential -from azure.core.credentials import AzureKeyCredential # TODO: Remove me when EntraID is supported +from azure.core.credentials import AzureKeyCredential # TODO: Remove me when EntraID is supported from azure.ai.projects.onedp import AIProjectClient from azure.ai.projects.onedp.models import ConnectionType # TODO: Remove console logging import sys import logging + logger = logging.getLogger("azure") logger.setLevel(logging.DEBUG) logger.addHandler(logging.StreamHandler(stream=sys.stdout)) diff --git a/sdk/ai/azure-ai-projects-onedp/samples/connections/sample_connections_async.py b/sdk/ai/azure-ai-projects-onedp/samples/connections/sample_connections_async.py index cb1b6715ec74..321b576d7c13 100644 --- a/sdk/ai/azure-ai-projects-onedp/samples/connections/sample_connections_async.py +++ b/sdk/ai/azure-ai-projects-onedp/samples/connections/sample_connections_async.py @@ -26,7 +26,7 @@ import asyncio import os from azure.identity.aio import DefaultAzureCredential -from azure.core.credentials import AzureKeyCredential # TODO: Remove me when EntraID is supported +from azure.core.credentials import AzureKeyCredential # TODO: Remove me when EntraID is supported from azure.ai.projects.onedp.aio import AIProjectClient from azure.ai.projects.onedp.models import ConnectionType diff --git a/sdk/ai/azure-ai-projects-onedp/samples/datasets/sample_datasets.py b/sdk/ai/azure-ai-projects-onedp/samples/datasets/sample_datasets.py index 5c85c4a50fb9..a52eca6c8e7a 100644 --- a/sdk/ai/azure-ai-projects-onedp/samples/datasets/sample_datasets.py +++ b/sdk/ai/azure-ai-projects-onedp/samples/datasets/sample_datasets.py @@ -25,13 +25,14 @@ import os from azure.identity import DefaultAzureCredential -from azure.core.credentials import AzureKeyCredential # TODO: Remove me when EntraID is supported +from azure.core.credentials import AzureKeyCredential # TODO: Remove me when EntraID is supported from azure.ai.projects.onedp import AIProjectClient from azure.ai.projects.onedp.models import DatasetVersion, ListViewType # TODO: Remove console logging import sys import logging + logger = logging.getLogger("azure") logger.setLevel(logging.DEBUG) logger.addHandler(logging.StreamHandler(stream=sys.stdout)) diff --git a/sdk/ai/azure-ai-projects-onedp/samples/deployments/sample_deployments.py b/sdk/ai/azure-ai-projects-onedp/samples/deployments/sample_deployments.py index 2f65858dc4b8..03d0412f1834 100644 --- a/sdk/ai/azure-ai-projects-onedp/samples/deployments/sample_deployments.py +++ b/sdk/ai/azure-ai-projects-onedp/samples/deployments/sample_deployments.py @@ -24,12 +24,13 @@ import os from azure.identity import DefaultAzureCredential -from azure.core.credentials import AzureKeyCredential # TODO: Remove me when EntraID is supported +from azure.core.credentials import AzureKeyCredential # TODO: Remove me when EntraID is supported from azure.ai.projects.onedp import AIProjectClient # TODO: Remove console logging import sys import logging + logger = logging.getLogger("azure") logger.setLevel(logging.DEBUG) logger.addHandler(logging.StreamHandler(stream=sys.stdout)) @@ -43,7 +44,7 @@ endpoint=endpoint, # credential=DefaultAzureCredential(), credential=AzureKeyCredential(os.environ["PROJECT_API_KEY"]), - logging_enable=True, # TODO: Remove console logging + logging_enable=True, # TODO: Remove console logging ) as project_client: print("List all deployments:") diff --git a/sdk/ai/azure-ai-projects-onedp/samples/deployments/sample_deployments_async.py b/sdk/ai/azure-ai-projects-onedp/samples/deployments/sample_deployments_async.py index 22db6f69c70a..b329f0ef5aa2 100644 --- a/sdk/ai/azure-ai-projects-onedp/samples/deployments/sample_deployments_async.py +++ b/sdk/ai/azure-ai-projects-onedp/samples/deployments/sample_deployments_async.py @@ -25,7 +25,7 @@ import asyncio import os from azure.identity.aio import DefaultAzureCredential -from azure.core.credentials import AzureKeyCredential # TODO: Remove me when EntraID is supported +from azure.core.credentials import AzureKeyCredential # TODO: Remove me when EntraID is supported from azure.ai.projects.onedp.aio import AIProjectClient diff --git a/sdk/ai/azure-ai-projects-onedp/samples/indexes/sample_indexes.py b/sdk/ai/azure-ai-projects-onedp/samples/indexes/sample_indexes.py index b5b6073fd9e2..b7d6326ef3ae 100644 --- a/sdk/ai/azure-ai-projects-onedp/samples/indexes/sample_indexes.py +++ b/sdk/ai/azure-ai-projects-onedp/samples/indexes/sample_indexes.py @@ -25,6 +25,7 @@ # TODO: Remove console logging import sys import logging + logger = logging.getLogger("azure") logger.setLevel(logging.DEBUG) logger.addHandler(logging.StreamHandler(stream=sys.stdout)) @@ -33,7 +34,7 @@ import os from azure.identity import DefaultAzureCredential -from azure.core.credentials import AzureKeyCredential # TODO: Remove me when EntraID is supported +from azure.core.credentials import AzureKeyCredential # TODO: Remove me when EntraID is supported from azure.ai.projects.onedp import AIProjectClient endpoint = os.environ["PROJECT_ENDPOINT"] diff --git a/sdk/ai/azure-ai-projects-onedp/samples/inference/async_samples/sample_chat_completions_with_azure_ai_inference_client_async.py b/sdk/ai/azure-ai-projects-onedp/samples/inference/async_samples/sample_chat_completions_with_azure_ai_inference_client_async.py index d71820989677..0bafa8d5bd85 100644 --- a/sdk/ai/azure-ai-projects-onedp/samples/inference/async_samples/sample_chat_completions_with_azure_ai_inference_client_async.py +++ b/sdk/ai/azure-ai-projects-onedp/samples/inference/async_samples/sample_chat_completions_with_azure_ai_inference_client_async.py @@ -25,11 +25,14 @@ import os import asyncio -from azure.core.credentials import AzureKeyCredential # TODO: Remove me when EntraID is supported # TODO: Remove me when EntraID is supported +from azure.core.credentials import ( + AzureKeyCredential, +) # TODO: Remove me when EntraID is supported # TODO: Remove me when EntraID is supported from azure.identity.aio import DefaultAzureCredential from azure.ai.projects.onedp.aio import AIProjectClient from azure.ai.inference.models import UserMessage + async def sample_chat_completions_with_azure_ai_inference_client_async(): endpoint = os.environ["PROJECT_ENDPOINT"] diff --git a/sdk/ai/azure-ai-projects-onedp/samples/inference/async_samples/sample_chat_completions_with_azure_openai_client_async.py b/sdk/ai/azure-ai-projects-onedp/samples/inference/async_samples/sample_chat_completions_with_azure_openai_client_async.py index 4a48b8d0eedd..e9bd6176e283 100644 --- a/sdk/ai/azure-ai-projects-onedp/samples/inference/async_samples/sample_chat_completions_with_azure_openai_client_async.py +++ b/sdk/ai/azure-ai-projects-onedp/samples/inference/async_samples/sample_chat_completions_with_azure_openai_client_async.py @@ -28,7 +28,9 @@ import os import asyncio from azure.ai.projects.aio import AIProjectClient -from azure.core.credentials import AzureKeyCredential # TODO: Remove me when EntraID is supported # TODO: Remove me when EntraID is supported +from azure.core.credentials import ( + AzureKeyCredential, +) # TODO: Remove me when EntraID is supported # TODO: Remove me when EntraID is supported from azure.identity.aio import DefaultAzureCredential @@ -43,7 +45,7 @@ async def sample_chat_completions_with_azure_openai_client_async(): endpoint=endpoint, # credential=DefaultAzureCredential(), credential=AzureKeyCredential(os.environ["PROJECT_API_KEY"]), - logging_enable=True, # TODO: Remove console logging + logging_enable=True, # TODO: Remove console logging ) as project_client: # Get an authenticated AsyncAzureOpenAI client for your default Azure OpenAI connection: diff --git a/sdk/ai/azure-ai-projects-onedp/samples/inference/async_samples/sample_image_embeddings_with_azure_ai_inference_client_async.py b/sdk/ai/azure-ai-projects-onedp/samples/inference/async_samples/sample_image_embeddings_with_azure_ai_inference_client_async.py index 9d8bf1106a84..2e236f9b2f13 100644 --- a/sdk/ai/azure-ai-projects-onedp/samples/inference/async_samples/sample_image_embeddings_with_azure_ai_inference_client_async.py +++ b/sdk/ai/azure-ai-projects-onedp/samples/inference/async_samples/sample_image_embeddings_with_azure_ai_inference_client_async.py @@ -26,11 +26,14 @@ import os import asyncio -from azure.core.credentials import AzureKeyCredential # TODO: Remove me when EntraID is supported # TODO: Remove me when EntraID is supported +from azure.core.credentials import ( + AzureKeyCredential, +) # TODO: Remove me when EntraID is supported # TODO: Remove me when EntraID is supported from azure.identity.aio import DefaultAzureCredential from azure.ai.projects.onedp.aio import AIProjectClient from azure.ai.inference.models import ImageEmbeddingInput + async def sample_image_embeddings_with_azure_ai_inference_client_async(): endpoint = os.environ["PROJECT_ENDPOINT"] diff --git a/sdk/ai/azure-ai-projects-onedp/samples/inference/async_samples/sample_text_embeddings_with_azure_ai_inference_client_async.py b/sdk/ai/azure-ai-projects-onedp/samples/inference/async_samples/sample_text_embeddings_with_azure_ai_inference_client_async.py index f9f33fcc9fdc..31d327ec9f07 100644 --- a/sdk/ai/azure-ai-projects-onedp/samples/inference/async_samples/sample_text_embeddings_with_azure_ai_inference_client_async.py +++ b/sdk/ai/azure-ai-projects-onedp/samples/inference/async_samples/sample_text_embeddings_with_azure_ai_inference_client_async.py @@ -25,10 +25,13 @@ import os import asyncio -from azure.core.credentials import AzureKeyCredential # TODO: Remove me when EntraID is supported # TODO: Remove me when EntraID is supported +from azure.core.credentials import ( + AzureKeyCredential, +) # TODO: Remove me when EntraID is supported # TODO: Remove me when EntraID is supported from azure.identity.aio import DefaultAzureCredential from azure.ai.projects.onedp.aio import AIProjectClient + async def sample_text_embeddings_with_azure_ai_inference_client_async(): endpoint = os.environ["PROJECT_ENDPOINT"] diff --git a/sdk/ai/azure-ai-projects-onedp/samples/inference/sample_chat_completions_with_azure_ai_inference_client.py b/sdk/ai/azure-ai-projects-onedp/samples/inference/sample_chat_completions_with_azure_ai_inference_client.py index ed1b56b3730c..b5814ec3c244 100644 --- a/sdk/ai/azure-ai-projects-onedp/samples/inference/sample_chat_completions_with_azure_ai_inference_client.py +++ b/sdk/ai/azure-ai-projects-onedp/samples/inference/sample_chat_completions_with_azure_ai_inference_client.py @@ -24,7 +24,9 @@ """ import os -from azure.core.credentials import AzureKeyCredential # TODO: Remove me when EntraID is supported # TODO: Remove me when EntraID is supported +from azure.core.credentials import ( + AzureKeyCredential, +) # TODO: Remove me when EntraID is supported # TODO: Remove me when EntraID is supported from azure.identity import DefaultAzureCredential from azure.ai.projects.onedp import AIProjectClient from azure.ai.inference.models import UserMessage @@ -32,6 +34,7 @@ # TODO: Remove console logging import sys import logging + logger = logging.getLogger("azure") logger.setLevel(logging.DEBUG) logger.addHandler(logging.StreamHandler(stream=sys.stdout)) diff --git a/sdk/ai/azure-ai-projects-onedp/samples/inference/sample_chat_completions_with_azure_openai_client.py b/sdk/ai/azure-ai-projects-onedp/samples/inference/sample_chat_completions_with_azure_openai_client.py index e7c6f656f59f..f74dfcc5ce7c 100644 --- a/sdk/ai/azure-ai-projects-onedp/samples/inference/sample_chat_completions_with_azure_openai_client.py +++ b/sdk/ai/azure-ai-projects-onedp/samples/inference/sample_chat_completions_with_azure_openai_client.py @@ -26,7 +26,9 @@ import os from azure.ai.projects import AIProjectClient -from azure.core.credentials import AzureKeyCredential # TODO: Remove me when EntraID is supported # TODO: Remove me when EntraID is supported +from azure.core.credentials import ( + AzureKeyCredential, +) # TODO: Remove me when EntraID is supported # TODO: Remove me when EntraID is supported from azure.identity import DefaultAzureCredential endpoint = os.environ["PROJECT_ENDPOINT"] @@ -36,7 +38,7 @@ endpoint=endpoint, # credential=DefaultAzureCredential(), credential=AzureKeyCredential(os.environ["PROJECT_API_KEY"]), - logging_enable=True, # TODO: Remove console logging + logging_enable=True, # TODO: Remove console logging ) as project_client: with project_client.inference.get_azure_openai_client(api_version="2024-06-01") as client: diff --git a/sdk/ai/azure-ai-projects-onedp/samples/inference/sample_image_embeddings_with_azure_ai_inference_client.py b/sdk/ai/azure-ai-projects-onedp/samples/inference/sample_image_embeddings_with_azure_ai_inference_client.py index 4d32323bced4..0a04d0f8ff89 100644 --- a/sdk/ai/azure-ai-projects-onedp/samples/inference/sample_image_embeddings_with_azure_ai_inference_client.py +++ b/sdk/ai/azure-ai-projects-onedp/samples/inference/sample_image_embeddings_with_azure_ai_inference_client.py @@ -24,7 +24,9 @@ """ import os -from azure.core.credentials import AzureKeyCredential # TODO: Remove me when EntraID is supported # TODO: Remove me when EntraID is supported +from azure.core.credentials import ( + AzureKeyCredential, +) # TODO: Remove me when EntraID is supported # TODO: Remove me when EntraID is supported from azure.identity import DefaultAzureCredential from azure.ai.projects.onedp import AIProjectClient from azure.ai.inference.models import ImageEmbeddingInput @@ -32,6 +34,7 @@ # TODO: Remove console logging import sys import logging + logger = logging.getLogger("azure") logger.setLevel(logging.DEBUG) logger.addHandler(logging.StreamHandler(stream=sys.stdout)) diff --git a/sdk/ai/azure-ai-projects-onedp/samples/inference/sample_text_embeddings_with_azure_ai_inference_client.py b/sdk/ai/azure-ai-projects-onedp/samples/inference/sample_text_embeddings_with_azure_ai_inference_client.py index d3921629b0ef..926e32d9fe97 100644 --- a/sdk/ai/azure-ai-projects-onedp/samples/inference/sample_text_embeddings_with_azure_ai_inference_client.py +++ b/sdk/ai/azure-ai-projects-onedp/samples/inference/sample_text_embeddings_with_azure_ai_inference_client.py @@ -24,13 +24,16 @@ """ import os -from azure.core.credentials import AzureKeyCredential # TODO: Remove me when EntraID is supported # TODO: Remove me when EntraID is supported +from azure.core.credentials import ( + AzureKeyCredential, +) # TODO: Remove me when EntraID is supported # TODO: Remove me when EntraID is supported from azure.identity import DefaultAzureCredential from azure.ai.projects.onedp import AIProjectClient # TODO: Remove console logging import sys import logging + logger = logging.getLogger("azure") logger.setLevel(logging.DEBUG) logger.addHandler(logging.StreamHandler(stream=sys.stdout)) diff --git a/sdk/ai/azure-ai-projects-onedp/samples/telemetry/sample_telemetry.py b/sdk/ai/azure-ai-projects-onedp/samples/telemetry/sample_telemetry.py index 05ed9e63056f..3420b45f1e3b 100644 --- a/sdk/ai/azure-ai-projects-onedp/samples/telemetry/sample_telemetry.py +++ b/sdk/ai/azure-ai-projects-onedp/samples/telemetry/sample_telemetry.py @@ -22,13 +22,14 @@ import os from azure.identity import DefaultAzureCredential -from azure.core.credentials import AzureKeyCredential # TODO: Remove me when EntraID is supported +from azure.core.credentials import AzureKeyCredential # TODO: Remove me when EntraID is supported from azure.ai.projects.onedp import AIProjectClient from azure.ai.projects.onedp.models import ConnectionType # Start remove me -- logging import sys import logging + logger = logging.getLogger("azure") logger.setLevel(logging.DEBUG) logger.addHandler(logging.StreamHandler(stream=sys.stdout)) diff --git a/sdk/ai/azure-ai-projects-onedp/tsp-location.yaml b/sdk/ai/azure-ai-projects-onedp/tsp-location.yaml index 9571cadb7f0e..787ba4479dba 100644 --- a/sdk/ai/azure-ai-projects-onedp/tsp-location.yaml +++ b/sdk/ai/azure-ai-projects-onedp/tsp-location.yaml @@ -1,4 +1,4 @@ directory: specification/ai/Azure.AI.Projects -commit: 926613d54831731cfd2cb744e36462e2a8dd6117 +commit: 124f9c4526d56c1da3b0a8ad59673e16178423d8 repo: Azure/azure-rest-api-specs additionalDirectories: From 4431830bebb6e8522a22faa9fd4556f7b997b49f Mon Sep 17 00:00:00 2001 From: Darren Cohen <39422044+dargilco@users.noreply.github.com> Date: Wed, 9 Apr 2025 23:40:05 -0700 Subject: [PATCH 4/5] Update telemetry operations and samples --- .../azure/ai/projects/onedp/aio/_patch.py | 3 +- .../projects/onedp/aio/operations/_patch.py | 59 +++++++++++++++--- .../ai/projects/onedp/operations/_patch.py | 37 +++++++---- .../samples/connections/sample_connections.py | 8 +-- ...pletions_with_azure_openai_client_async.py | 2 +- ...at_completions_with_azure_openai_client.py | 2 +- .../samples/telemetry/sample_telemetry.py | 5 +- .../telemetry/sample_telemetry_async.py | 61 +++++++++++++++++++ 8 files changed, 147 insertions(+), 30 deletions(-) create mode 100644 sdk/ai/azure-ai-projects-onedp/samples/telemetry/sample_telemetry_async.py diff --git a/sdk/ai/azure-ai-projects-onedp/azure/ai/projects/onedp/aio/_patch.py b/sdk/ai/azure-ai-projects-onedp/azure/ai/projects/onedp/aio/_patch.py index 05df68fc47b3..df5f988b6da5 100644 --- a/sdk/ai/azure-ai-projects-onedp/azure/ai/projects/onedp/aio/_patch.py +++ b/sdk/ai/azure-ai-projects-onedp/azure/ai/projects/onedp/aio/_patch.py @@ -9,7 +9,7 @@ from typing import List, Optional, Union, Any from azure.core.credentials import AzureKeyCredential from ._client import AIProjectClient as AIProjectClientGenerated -from .operations import InferenceOperations, AssistantsOperations +from .operations import InferenceOperations, AssistantsOperations, TelemetryOperations class AIProjectClient(AIProjectClientGenerated): # pylint: disable=too-many-instance-attributes @@ -49,6 +49,7 @@ def __init__( ) -> None: self._user_agent: Optional[str] = kwargs.get("user_agent", None) super().__init__(endpoint=endpoint, credential=credential, **kwargs) + self.telemetry = TelemetryOperations(self) self.inference = InferenceOperations(self) self.assistants = AssistantsOperations(self) diff --git a/sdk/ai/azure-ai-projects-onedp/azure/ai/projects/onedp/aio/operations/_patch.py b/sdk/ai/azure-ai-projects-onedp/azure/ai/projects/onedp/aio/operations/_patch.py index ab9d62b95f73..28ed1195fd5e 100644 --- a/sdk/ai/azure-ai-projects-onedp/azure/ai/projects/onedp/aio/operations/_patch.py +++ b/sdk/ai/azure-ai-projects-onedp/azure/ai/projects/onedp/aio/operations/_patch.py @@ -9,7 +9,7 @@ """ import logging import inspect -from typing import List, Optional, Any, Tuple +from typing import List, Optional, Any, Tuple, AsyncIterable from pathlib import Path from urllib.parse import urlparse from azure.storage.blob.aio import ContainerClient @@ -281,16 +281,16 @@ async def get_azure_openai_client( if connection_name: connection: Connection = await self._outer_instance.connections.get(name=connection_name, **kwargs) if connection.type != ConnectionType.AZURE_OPEN_AI: - raise ValueError(f"Connection `{connection_name}` is not of type Azure OpenAI.") + raise ValueError(f"Connection `{connection_name}` is not of type Azure OpenAI.") else: - # If connection name was not specified, get the default Azure OpenAI connection. - connections = await self._outer_instance.connections.list( + # If connection name was not specified, try to get the default Azure OpenAI connection. + connections: AsyncIterable[Connection] = self._outer_instance.connections.list( connection_type=ConnectionType.AZURE_OPEN_AI, default_connection=True, **kwargs ) - connection: Connection = next(iter(connections), None) - if not connection: + try: + connection: Connection = await connections.__anext__() + except StopAsyncIteration: raise ResourceNotFoundError("No default Azure OpenAI connection found.") - connection_name = connection.name # TODO: if there isn't a default openai connection, we would have to by convention # use https://{resource-name}.openai.azure.com where {resource-name} is the same as the @@ -341,6 +341,50 @@ async def get_azure_openai_client( return client +class TelemetryOperations: + + _connection_string: Optional[str] = None + + def __init__(self, outer_instance: "AIProjectClient") -> None: + self._outer_instance = outer_instance + + @distributed_trace + async def get_connection_string(self) -> str: + """Get the Application Insights connection string associated with the Project's Application Insights resource. + + :return: The Application Insights connection string if a the resource was enabled for the Project. + :rtype: str + :raises ~azure.core.exceptions.ResourceNotFoundError: An Application Insights connection does not + exist for this Foundry project. + """ + if not self._connection_string: + + # TODO: Two REST APIs calls can be replaced by one if we have had REST API for get_with_credentials(connection_type=ConnectionType.APPLICATION_INSIGHTS) + # Returns an empty Iterable if no connections exits. + connections: AsyncIterable[Connection] = self._outer_instance.connections.list( + connection_type=ConnectionType.APPLICATION_INSIGHTS, + default_connection=True, + ) + + connection_name: Optional[str] = None + async for connection in connections: + connection_name = connection.name + break + if not connection_name: + raise ResourceNotFoundError("No Application Insights connection found.") + + connection = await self._outer_instance.connections.get_with_credentials(name=connection_name) + + if isinstance(connection.credentials, ApiKeyCredentials): + if not connection.credentials.api_key: + raise ValueError("Application Insights connection does not have a connection string.") + self._connection_string = connection.credentials.api_key + else: + raise ValueError("Application Insights connection does not use API Key credentials.") + + return self._connection_string + + class DatasetsOperations(DatasetsOperationsGenerated): # Internal helper method to create a new dataset and return a ContainerClient from azure-storage-blob package, @@ -546,6 +590,7 @@ async def upload_folder_and_create(self, *, name: str, version: str, folder: str "InferenceOperations", "DatasetsOperations", "AssistantsOperations", + "TelemetryOperations", ] # Add all objects you want publicly available to users at this package level diff --git a/sdk/ai/azure-ai-projects-onedp/azure/ai/projects/onedp/operations/_patch.py b/sdk/ai/azure-ai-projects-onedp/azure/ai/projects/onedp/operations/_patch.py index e8dd877fe198..c13722143ffd 100644 --- a/sdk/ai/azure-ai-projects-onedp/azure/ai/projects/onedp/operations/_patch.py +++ b/sdk/ai/azure-ai-projects-onedp/azure/ai/projects/onedp/operations/_patch.py @@ -9,7 +9,7 @@ """ import logging import inspect -from typing import List, Optional, Any, Tuple, Iterable +from typing import List, Optional, Any, Tuple, Iterable, Union from pathlib import Path from urllib.parse import urlparse from azure.storage.blob import ContainerClient @@ -274,12 +274,13 @@ def get_azure_openai_client( if connection.type != ConnectionType.AZURE_OPEN_AI: raise ValueError(f"Connection `{connection_name}` is not of type Azure OpenAI.") else: - # If connection name was not specified, get the default Azure OpenAI connection. - connections = self._outer_instance.connections.list( + # If connection name was not specified, try to get the default Azure OpenAI connection. + connections: Iterable[Connection] = self._outer_instance.connections.list( connection_type=ConnectionType.AZURE_OPEN_AI, default_connection=True, **kwargs ) - connection: Connection = next(iter(connections), None) - if not connection: + try: + connection: Connection = next(iter(connections)) + except StopAsyncIteration: raise ResourceNotFoundError("No default Azure OpenAI connection found.") connection_name = connection.name @@ -345,23 +346,33 @@ def get_connection_string(self) -> str: :return: The Application Insights connection string if a the resource was enabled for the Project. :rtype: str - :raises ~azure.core.exceptions.ResourceNotFoundError: An Application Insights resource was not - enabled for this project. + :raises ~azure.core.exceptions.ResourceNotFoundError: An Application Insights connection does not + exist for this Foundry project. """ if not self._connection_string: - # TODO: Test what happens here when there is no AppInsights connection. Does this throw or just returns an empty list? + # TODO: Two REST APIs calls can be replaced by one if we have had REST API for get_with_credentials(connection_type=ConnectionType.APPLICATION_INSIGHTS) + # Returns an empty Iterable if no connections exits. connections: Iterable[Connection] = self._outer_instance.connections.list( - connection_type=ConnectionType.APPLICATION_INSIGHTS + connection_type=ConnectionType.APPLICATION_INSIGHTS, + default_connection=True, ) - # Read AppInsights connection string from the first connection in the list. + connection_name: Optional[str] = None for connection in connections: - self._connection_string = connection.metadata.get("connection_string") + connection_name = connection.name break + if not connection_name: + raise ResourceNotFoundError("No Application Insights connection found.") - if not self._connection_string: - raise ResourceNotFoundError("Application Insights resource was not enabled for this Project.") + connection = self._outer_instance.connections.get_with_credentials(name=connection_name) + + if isinstance(connection.credentials, ApiKeyCredentials): + if not connection.credentials.api_key: + raise ValueError("Application Insights connection does not have a connection string.") + self._connection_string = connection.credentials.api_key + else: + raise ValueError("Application Insights connection does not use API Key credentials.") return self._connection_string diff --git a/sdk/ai/azure-ai-projects-onedp/samples/connections/sample_connections.py b/sdk/ai/azure-ai-projects-onedp/samples/connections/sample_connections.py index 781a48d99a05..33d1132d16da 100644 --- a/sdk/ai/azure-ai-projects-onedp/samples/connections/sample_connections.py +++ b/sdk/ai/azure-ai-projects-onedp/samples/connections/sample_connections.py @@ -49,15 +49,13 @@ ) as project_client: print("List the properties of all connections:") - connections = project_client.connections.list() - for connection in connections: + for connection in project_client.connections.list(): print(connection) print("List the properties of all connections of a particular type (in this case, Azure OpenAI connections):") - connections = project_client.connections.list( + for connection in project_client.connections.list( connection_type=ConnectionType.AZURE_OPEN_AI, - ) - for connection in connections: + ): print(connection) print(f"Get the properties of a connection named `{connection_name}`:") diff --git a/sdk/ai/azure-ai-projects-onedp/samples/inference/async_samples/sample_chat_completions_with_azure_openai_client_async.py b/sdk/ai/azure-ai-projects-onedp/samples/inference/async_samples/sample_chat_completions_with_azure_openai_client_async.py index e9bd6176e283..e993da88eaed 100644 --- a/sdk/ai/azure-ai-projects-onedp/samples/inference/async_samples/sample_chat_completions_with_azure_openai_client_async.py +++ b/sdk/ai/azure-ai-projects-onedp/samples/inference/async_samples/sample_chat_completions_with_azure_openai_client_async.py @@ -27,7 +27,7 @@ import os import asyncio -from azure.ai.projects.aio import AIProjectClient +from azure.ai.projects.onedp.aio import AIProjectClient from azure.core.credentials import ( AzureKeyCredential, ) # TODO: Remove me when EntraID is supported # TODO: Remove me when EntraID is supported diff --git a/sdk/ai/azure-ai-projects-onedp/samples/inference/sample_chat_completions_with_azure_openai_client.py b/sdk/ai/azure-ai-projects-onedp/samples/inference/sample_chat_completions_with_azure_openai_client.py index f74dfcc5ce7c..e94d78d4bcfd 100644 --- a/sdk/ai/azure-ai-projects-onedp/samples/inference/sample_chat_completions_with_azure_openai_client.py +++ b/sdk/ai/azure-ai-projects-onedp/samples/inference/sample_chat_completions_with_azure_openai_client.py @@ -25,7 +25,7 @@ """ import os -from azure.ai.projects import AIProjectClient +from azure.ai.projects.onedp import AIProjectClient from azure.core.credentials import ( AzureKeyCredential, ) # TODO: Remove me when EntraID is supported # TODO: Remove me when EntraID is supported diff --git a/sdk/ai/azure-ai-projects-onedp/samples/telemetry/sample_telemetry.py b/sdk/ai/azure-ai-projects-onedp/samples/telemetry/sample_telemetry.py index 3420b45f1e3b..e00d1b2ae38a 100644 --- a/sdk/ai/azure-ai-projects-onedp/samples/telemetry/sample_telemetry.py +++ b/sdk/ai/azure-ai-projects-onedp/samples/telemetry/sample_telemetry.py @@ -6,7 +6,8 @@ """ DESCRIPTION: Given an AIProjectClient, this sample demonstrates how to use the synchronous - `.telemtry` methods to get the Application Insights connection string. + `.telemetry` methods to get the Application Insights connection string and + enable tracing. USAGE: python sample_telemetry.py @@ -16,7 +17,7 @@ pip install azure-ai-projects azure-identity Set these environment variables with your own values: - 1) PROJECT_ENDPOINT - Required. The Azure AI Project endpoint, as found in the overview page of your + 1) PROJECT_ENDPOINT - The Azure AI Project endpoint, as found in the overview page of your Azure AI Foundry project. """ diff --git a/sdk/ai/azure-ai-projects-onedp/samples/telemetry/sample_telemetry_async.py b/sdk/ai/azure-ai-projects-onedp/samples/telemetry/sample_telemetry_async.py new file mode 100644 index 000000000000..f527d74bff7e --- /dev/null +++ b/sdk/ai/azure-ai-projects-onedp/samples/telemetry/sample_telemetry_async.py @@ -0,0 +1,61 @@ +# ------------------------------------ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. +# ------------------------------------ + +""" +DESCRIPTION: + Given an AIProjectClient, this sample demonstrates how to use the asynchronous + `.telemetry` methods to get the Application Insights connection string and enable + tracing. + +USAGE: + python sample_telemetry_async.py + + Before running the sample: + + pip install azure-ai-projects azure-identity aiohttp + + Set these environment variables with your own values: + 1) PROJECT_ENDPOINT - The Azure AI Project endpoint, as found in the overview page of your + Azure AI Foundry project. +""" + +import os +import asyncio +from azure.identity.aio import DefaultAzureCredential +from azure.core.credentials import AzureKeyCredential # TODO: Remove me when EntraID is supported +from azure.ai.projects.onedp.aio import AIProjectClient +from azure.ai.projects.onedp.models import ConnectionType + +# Start remove me -- logging +import sys +import logging + +logger = logging.getLogger("azure") +logger.setLevel(logging.DEBUG) +logger.addHandler(logging.StreamHandler(stream=sys.stdout)) +# End remove me + +async def sample_telemetry_async() -> None: + + endpoint = os.environ["PROJECT_ENDPOINT"] + + async with AIProjectClient( + endpoint=endpoint, + # credential=DefaultAzureCredential(), + credential=AzureKeyCredential(os.environ["PROJECT_API_KEY"]), + logging_enable=True, + ) as project_client: + + print("Get the Application Insights connection string:") + connection_string = await project_client.telemetry.get_connection_string() + print(connection_string) + + +async def main(): + await sample_telemetry_async() + + +if __name__ == "__main__": + asyncio.run(main()) \ No newline at end of file From 25f0f3ae2546bf5ff3b6ba1fe3e36ebfabd8f7c0 Mon Sep 17 00:00:00 2001 From: Darren Cohen <39422044+dargilco@users.noreply.github.com> Date: Thu, 10 Apr 2025 09:25:02 -0700 Subject: [PATCH 5/5] Test placeholder --- .../azure-ai-projects-onedp/tests/README.md | 55 +++++++++++++++++++ .../tests/connections/test_connections.py | 9 +++ 2 files changed, 64 insertions(+) create mode 100644 sdk/ai/azure-ai-projects-onedp/tests/README.md create mode 100644 sdk/ai/azure-ai-projects-onedp/tests/connections/test_connections.py diff --git a/sdk/ai/azure-ai-projects-onedp/tests/README.md b/sdk/ai/azure-ai-projects-onedp/tests/README.md new file mode 100644 index 000000000000..d1cceb051bdb --- /dev/null +++ b/sdk/ai/azure-ai-projects-onedp/tests/README.md @@ -0,0 +1,55 @@ +# Azure AI Project client library tests for Python + +The instructions below are for running tests locally, on a Windows machine, against the live service using a local build of the client library. + +## Build and install the client library + +- Clone or download this sample repository. +- Open a command prompt window in the folder `sdk\ai\azure-ai-projects-onedp` +- Install development dependencies: + ```bash + pip install -r dev_requirements.txt + ``` +- Install package from sources: + ```bash + pip install -e . + ``` + +## Log in to Azure + +```bash +az login +``` + +## Setup up environment variables + +Edit the file `azure_ai_projects_tests.env` located in the folder above. Follow the instructions there on how to set up Azure AI Foundry projects to be used for testing, and enter appropriate values for the environment variables used for the tests you want to run. + +## Configure test proxy + +Configure the test proxy to run live service tests without recordings: + +```bash +set AZURE_TEST_RUN_LIVE=true +set AZURE_SKIP_LIVE_RECORDING=true +set PROXY_URL=http://localhost:5000 +set AZURE_TEST_USE_CLI_AUTH=true +``` + +## Run tests + +To run all tests, type: + +```bash +pytest +``` + +To run tests in a particular folder (`tests\connections` for example): + +```bash +pytest tests\connections +``` + +## Additional information + +See [test documentation](https://github.com/Azure/azure-sdk-for-python/blob/main/doc/dev/tests.md) for additional information, including how to set proxy recordings and run tests using recordings. diff --git a/sdk/ai/azure-ai-projects-onedp/tests/connections/test_connections.py b/sdk/ai/azure-ai-projects-onedp/tests/connections/test_connections.py new file mode 100644 index 000000000000..20acbef07a47 --- /dev/null +++ b/sdk/ai/azure-ai-projects-onedp/tests/connections/test_connections.py @@ -0,0 +1,9 @@ +# ------------------------------------ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. +# ------------------------------------ + +class TestConnections: + + def test_connections_get(self, **kwargs): + pass