diff --git a/sdk/agentserver/azure-ai-agentserver-activity/azure/ai/agentserver/activity/_foundry_storage.py b/sdk/agentserver/azure-ai-agentserver-activity/azure/ai/agentserver/activity/_foundry_storage.py index 92438e5fca2c..98e23e061bfc 100644 --- a/sdk/agentserver/azure-ai-agentserver-activity/azure/ai/agentserver/activity/_foundry_storage.py +++ b/sdk/agentserver/azure-ai-agentserver-activity/azure/ai/agentserver/activity/_foundry_storage.py @@ -11,7 +11,7 @@ from collections import OrderedDict from contextlib import asynccontextmanager from dataclasses import dataclass -from typing import TYPE_CHECKING, Any, AsyncIterator, Callable, TypeVar +from typing import TYPE_CHECKING, Any, AsyncIterator, Callable, TypeVar, cast from azure.ai.agentserver.core.storage import FoundryStateStore, FoundryStorageEndpoint, FoundryStorageNotFoundError from azure.core.credentials_async import AsyncTokenCredential @@ -327,15 +327,17 @@ async def _read_item( item = await store.get_item(_bounded_store_name(key)) if item is None or target_cls is None: return None, None - return key, target_cls.from_json_to_store_item(item.value) + # ``StoreItem.from_json_to_store_item`` is annotated ``-> StoreItem`` upstream, so + # calling it through ``type[StoreItemT]`` does not narrow to the concrete subclass. + return key, cast(StoreItemT, target_cls.from_json_to_store_item(item.value)) - async def _write_item(self, key: str, value: StoreItemT) -> None: + async def _write_item(self, key: str, value: StoreItem) -> None: """Create-or-replace one item, creating its backing store on first write. :param key: The M365 storage key to write (also the store name). :type key: str :param value: The ``StoreItem`` to persist. - :type value: StoreItemT + :type value: ~microsoft_agents.hosting.core.storage.StoreItem :return: None. :rtype: None """ diff --git a/sdk/agentserver/azure-ai-agentserver-activity/tests/test_bridge_turn.py b/sdk/agentserver/azure-ai-agentserver-activity/tests/test_bridge_turn.py index 1dc31d2530e6..43c33c9ccc13 100644 --- a/sdk/agentserver/azure-ai-agentserver-activity/tests/test_bridge_turn.py +++ b/sdk/agentserver/azure-ai-agentserver-activity/tests/test_bridge_turn.py @@ -142,9 +142,11 @@ def test_claims_authenticated_with_empty_bot_app_id_has_empty_claims(): but with no appid/audience entries.""" claims = bridge._build_outbound_claims(ClaimsIdentity, digital_worker=False, is_hosted=True, bot_app_id="") - assert claims.is_authenticated is True + # ``is_authenticated`` is deprecated upstream and now derives from the claim + # dict being non-empty, so assert on the authentication type instead. assert claims.authentication_type == OutboundAuth.AUTH_TYPE_BEARER assert claims.get_claim_value(OutboundAuth.CLAIM_APP_ID) is None + assert claims.get_claim_value(OutboundAuth.CLAIM_AUDIENCE) is None # --------------------------------------------------------------------------- diff --git a/sdk/agentserver/azure-ai-agentserver-core/CHANGELOG.md b/sdk/agentserver/azure-ai-agentserver-core/CHANGELOG.md index fa35b7f66fc5..7373e53838fd 100644 --- a/sdk/agentserver/azure-ai-agentserver-core/CHANGELOG.md +++ b/sdk/agentserver/azure-ai-agentserver-core/CHANGELOG.md @@ -1,5 +1,11 @@ # Release History +## 2.1.0b3 (Unreleased) + +### Other Changes + +- `FoundryStateStore.set_item()` and `create_item()` now accept any `Mapping[str, JSONValue]` for `value` instead of requiring a concrete `dict`. The payload is never mutated, only serialized, so the narrower `dict` requirement rejected valid callers (for example M365 `StoreItem.store_item_to_json()`, which returns a `MutableMapping`). Widening a parameter type is backward compatible for all existing callers. + ## 2.1.0b2 (2026-08-18) ### Other Changes diff --git a/sdk/agentserver/azure-ai-agentserver-core/api.md b/sdk/agentserver/azure-ai-agentserver-core/api.md index 1c5aaa679540..5b60a51175e3 100644 --- a/sdk/agentserver/azure-ai-agentserver-core/api.md +++ b/sdk/agentserver/azure-ai-agentserver-core/api.md @@ -252,7 +252,7 @@ namespace azure.ai.agentserver.core.storage async def create_item( self, key: str, - value: JSONObject, + value: Mapping[str, JSONValue], *, call_id: str | None = ..., tags: Mapping[str, str] | None = ... @@ -291,7 +291,7 @@ namespace azure.ai.agentserver.core.storage async def set_item( self, key: str, - value: JSONObject, + value: Mapping[str, JSONValue], *, call_id: str | None = ..., if_match: str | None = ..., diff --git a/sdk/agentserver/azure-ai-agentserver-core/azure/ai/agentserver/core/_version.py b/sdk/agentserver/azure-ai-agentserver-core/azure/ai/agentserver/core/_version.py index bfd75595682e..61045c9b08c6 100644 --- a/sdk/agentserver/azure-ai-agentserver-core/azure/ai/agentserver/core/_version.py +++ b/sdk/agentserver/azure-ai-agentserver-core/azure/ai/agentserver/core/_version.py @@ -2,4 +2,4 @@ # Copyright (c) Microsoft Corporation. All rights reserved. # --------------------------------------------------------- -VERSION = "2.1.0b2" +VERSION = "2.1.0b3" diff --git a/sdk/agentserver/azure-ai-agentserver-core/azure/ai/agentserver/core/storage/_local_state.py b/sdk/agentserver/azure-ai-agentserver-core/azure/ai/agentserver/core/storage/_local_state.py index cd439123d8c7..a0738b5ccb8d 100644 --- a/sdk/agentserver/azure-ai-agentserver-core/azure/ai/agentserver/core/storage/_local_state.py +++ b/sdk/agentserver/azure-ai-agentserver-core/azure/ai/agentserver/core/storage/_local_state.py @@ -22,7 +22,7 @@ from ._state_serializer import ( DeletedStateStore, DeletedStateStoreItem, - JSONObject, + JSONValue, Order, StateStore, StateStoreItem, @@ -139,7 +139,7 @@ def delete_store(self) -> DeletedStateStore: def create_item( self, key: str, - value: JSONObject, + value: Mapping[str, JSONValue], tags: Mapping[str, str] | None, ) -> StateStoreItemRef: with self._lock: @@ -159,7 +159,7 @@ def create_item( def set_item( self, key: str, - value: JSONObject, + value: Mapping[str, JSONValue], tags: Mapping[str, str] | None, if_match: str | None, ) -> StateStoreItemRef: @@ -296,7 +296,7 @@ def _write(self, document: dict[str, Any]) -> None: def _new_item( self, key: str, - value: JSONObject, + value: Mapping[str, JSONValue], tags: Mapping[str, str] | None, ) -> dict[str, Any]: now = _now() diff --git a/sdk/agentserver/azure-ai-agentserver-core/azure/ai/agentserver/core/storage/_state.py b/sdk/agentserver/azure-ai-agentserver-core/azure/ai/agentserver/core/storage/_state.py index ccadc6444844..80f2f72bdbf3 100644 --- a/sdk/agentserver/azure-ai-agentserver-core/azure/ai/agentserver/core/storage/_state.py +++ b/sdk/agentserver/azure-ai-agentserver-core/azure/ai/agentserver/core/storage/_state.py @@ -28,7 +28,7 @@ _UNSET, DeletedStateStore, DeletedStateStoreItem, - JSONObject, + JSONValue, StateStoreItemKeyPage, Order, StateStore, @@ -374,7 +374,7 @@ async def update( async def create_item( self, key: str, - value: JSONObject, + value: Mapping[str, JSONValue], *, tags: Mapping[str, str] | None = None, call_id: str | None = None, @@ -384,7 +384,7 @@ async def create_item( :param key: The item key to create. :type key: str :param value: The item payload as a JSON object. - :type value: dict[str, any] + :type value: ~collections.abc.Mapping[str, any] :keyword tags: Optional string labels stored with the item and used to filter :meth:`list_keys`. :paramtype tags: ~collections.abc.Mapping[str, str] or None @@ -412,7 +412,7 @@ async def create_item( async def set_item( self, key: str, - value: JSONObject, + value: Mapping[str, JSONValue], *, tags: Mapping[str, str] | None = None, if_match: str | None = None, @@ -424,7 +424,7 @@ async def set_item( :param key: The item key to create or replace. :type key: str :param value: The item payload as a JSON object. - :type value: dict[str, any] + :type value: ~collections.abc.Mapping[str, any] :keyword tags: Optional string labels stored with the item and used to filter :meth:`list_keys`. :paramtype tags: ~collections.abc.Mapping[str, str] or None diff --git a/sdk/agentserver/azure-ai-agentserver-core/azure/ai/agentserver/core/storage/_state_serializer.py b/sdk/agentserver/azure-ai-agentserver-core/azure/ai/agentserver/core/storage/_state_serializer.py index aa9a2feb3bfd..a522b0555e94 100644 --- a/sdk/agentserver/azure-ai-agentserver-core/azure/ai/agentserver/core/storage/_state_serializer.py +++ b/sdk/agentserver/azure-ai-agentserver-core/azure/ai/agentserver/core/storage/_state_serializer.py @@ -136,13 +136,13 @@ def serialize_store_update_request(description: str | None | object, tags: Mappi return json.dumps(dict(request)).encode("utf-8") -def serialize_item_create_request(key: str, value: JSONObject, tags: Mapping[str, str] | None) -> bytes: - request = CreateItemRequest(key=key, value=value, tags=_to_wire_tags(tags)) +def serialize_item_create_request(key: str, value: Mapping[str, JSONValue], tags: Mapping[str, str] | None) -> bytes: + request = CreateItemRequest(key=key, value=dict(value), tags=_to_wire_tags(tags)) return json.dumps(dict(request)).encode("utf-8") -def serialize_item_put_request(value: JSONObject, tags: Mapping[str, str] | None) -> bytes: - request = PutItemRequest(value=value, tags=_to_wire_tags(tags)) +def serialize_item_put_request(value: Mapping[str, JSONValue], tags: Mapping[str, str] | None) -> bytes: + request = PutItemRequest(value=dict(value), tags=_to_wire_tags(tags)) return json.dumps(dict(request)).encode("utf-8")