microsoft-agents-hosting-core 0.9.0.dev1__tar.gz → 0.9.0.dev3__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (122) hide show
  1. {microsoft_agents_hosting_core-0.9.0.dev1 → microsoft_agents_hosting_core-0.9.0.dev3}/PKG-INFO +2 -2
  2. microsoft_agents_hosting_core-0.9.0.dev3/VERSION.txt +1 -0
  3. {microsoft_agents_hosting_core-0.9.0.dev1 → microsoft_agents_hosting_core-0.9.0.dev3}/microsoft_agents/hosting/core/app/streaming/streaming_response.py +75 -75
  4. microsoft_agents_hosting_core-0.9.0.dev3/microsoft_agents/hosting/core/authorization/jwt_token_validator.py +116 -0
  5. {microsoft_agents_hosting_core-0.9.0.dev1 → microsoft_agents_hosting_core-0.9.0.dev3}/microsoft_agents/hosting/core/connector/client/connector_client.py +1 -1
  6. {microsoft_agents_hosting_core-0.9.0.dev1 → microsoft_agents_hosting_core-0.9.0.dev3}/microsoft_agents/hosting/core/turn_context.py +2 -8
  7. {microsoft_agents_hosting_core-0.9.0.dev1 → microsoft_agents_hosting_core-0.9.0.dev3}/microsoft_agents_hosting_core.egg-info/PKG-INFO +2 -2
  8. {microsoft_agents_hosting_core-0.9.0.dev1 → microsoft_agents_hosting_core-0.9.0.dev3}/microsoft_agents_hosting_core.egg-info/requires.txt +1 -1
  9. microsoft_agents_hosting_core-0.9.0.dev1/VERSION.txt +0 -1
  10. microsoft_agents_hosting_core-0.9.0.dev1/microsoft_agents/hosting/core/authorization/jwt_token_validator.py +0 -56
  11. {microsoft_agents_hosting_core-0.9.0.dev1 → microsoft_agents_hosting_core-0.9.0.dev3}/LICENSE +0 -0
  12. {microsoft_agents_hosting_core-0.9.0.dev1 → microsoft_agents_hosting_core-0.9.0.dev3}/MANIFEST.in +0 -0
  13. {microsoft_agents_hosting_core-0.9.0.dev1 → microsoft_agents_hosting_core-0.9.0.dev3}/microsoft_agents/hosting/core/__init__.py +0 -0
  14. {microsoft_agents_hosting_core-0.9.0.dev1 → microsoft_agents_hosting_core-0.9.0.dev3}/microsoft_agents/hosting/core/_oauth/__init__.py +0 -0
  15. {microsoft_agents_hosting_core-0.9.0.dev1 → microsoft_agents_hosting_core-0.9.0.dev3}/microsoft_agents/hosting/core/_oauth/_flow_state.py +0 -0
  16. {microsoft_agents_hosting_core-0.9.0.dev1 → microsoft_agents_hosting_core-0.9.0.dev3}/microsoft_agents/hosting/core/_oauth/_flow_storage_client.py +0 -0
  17. {microsoft_agents_hosting_core-0.9.0.dev1 → microsoft_agents_hosting_core-0.9.0.dev3}/microsoft_agents/hosting/core/_oauth/_oauth_flow.py +0 -0
  18. {microsoft_agents_hosting_core-0.9.0.dev1 → microsoft_agents_hosting_core-0.9.0.dev3}/microsoft_agents/hosting/core/activity_handler.py +0 -0
  19. {microsoft_agents_hosting_core-0.9.0.dev1 → microsoft_agents_hosting_core-0.9.0.dev3}/microsoft_agents/hosting/core/agent.py +0 -0
  20. {microsoft_agents_hosting_core-0.9.0.dev1 → microsoft_agents_hosting_core-0.9.0.dev3}/microsoft_agents/hosting/core/app/__init__.py +0 -0
  21. {microsoft_agents_hosting_core-0.9.0.dev1 → microsoft_agents_hosting_core-0.9.0.dev3}/microsoft_agents/hosting/core/app/_routes/__init__.py +0 -0
  22. {microsoft_agents_hosting_core-0.9.0.dev1 → microsoft_agents_hosting_core-0.9.0.dev3}/microsoft_agents/hosting/core/app/_routes/_route.py +0 -0
  23. {microsoft_agents_hosting_core-0.9.0.dev1 → microsoft_agents_hosting_core-0.9.0.dev3}/microsoft_agents/hosting/core/app/_routes/_route_list.py +0 -0
  24. {microsoft_agents_hosting_core-0.9.0.dev1 → microsoft_agents_hosting_core-0.9.0.dev3}/microsoft_agents/hosting/core/app/_routes/route_rank.py +0 -0
  25. {microsoft_agents_hosting_core-0.9.0.dev1 → microsoft_agents_hosting_core-0.9.0.dev3}/microsoft_agents/hosting/core/app/_type_defs.py +0 -0
  26. {microsoft_agents_hosting_core-0.9.0.dev1 → microsoft_agents_hosting_core-0.9.0.dev3}/microsoft_agents/hosting/core/app/agent_application.py +0 -0
  27. {microsoft_agents_hosting_core-0.9.0.dev1 → microsoft_agents_hosting_core-0.9.0.dev3}/microsoft_agents/hosting/core/app/app_error.py +0 -0
  28. {microsoft_agents_hosting_core-0.9.0.dev1 → microsoft_agents_hosting_core-0.9.0.dev3}/microsoft_agents/hosting/core/app/app_options.py +0 -0
  29. {microsoft_agents_hosting_core-0.9.0.dev1 → microsoft_agents_hosting_core-0.9.0.dev3}/microsoft_agents/hosting/core/app/input_file.py +0 -0
  30. {microsoft_agents_hosting_core-0.9.0.dev1 → microsoft_agents_hosting_core-0.9.0.dev3}/microsoft_agents/hosting/core/app/oauth/__init__.py +0 -0
  31. {microsoft_agents_hosting_core-0.9.0.dev1 → microsoft_agents_hosting_core-0.9.0.dev3}/microsoft_agents/hosting/core/app/oauth/_handlers/__init__.py +0 -0
  32. {microsoft_agents_hosting_core-0.9.0.dev1 → microsoft_agents_hosting_core-0.9.0.dev3}/microsoft_agents/hosting/core/app/oauth/_handlers/_authorization_handler.py +0 -0
  33. {microsoft_agents_hosting_core-0.9.0.dev1 → microsoft_agents_hosting_core-0.9.0.dev3}/microsoft_agents/hosting/core/app/oauth/_handlers/_user_authorization.py +0 -0
  34. {microsoft_agents_hosting_core-0.9.0.dev1 → microsoft_agents_hosting_core-0.9.0.dev3}/microsoft_agents/hosting/core/app/oauth/_handlers/agentic_user_authorization.py +0 -0
  35. {microsoft_agents_hosting_core-0.9.0.dev1 → microsoft_agents_hosting_core-0.9.0.dev3}/microsoft_agents/hosting/core/app/oauth/_handlers/connector_user_authorization.py +0 -0
  36. {microsoft_agents_hosting_core-0.9.0.dev1 → microsoft_agents_hosting_core-0.9.0.dev3}/microsoft_agents/hosting/core/app/oauth/_sign_in_response.py +0 -0
  37. {microsoft_agents_hosting_core-0.9.0.dev1 → microsoft_agents_hosting_core-0.9.0.dev3}/microsoft_agents/hosting/core/app/oauth/_sign_in_state.py +0 -0
  38. {microsoft_agents_hosting_core-0.9.0.dev1 → microsoft_agents_hosting_core-0.9.0.dev3}/microsoft_agents/hosting/core/app/oauth/auth_handler.py +0 -0
  39. {microsoft_agents_hosting_core-0.9.0.dev1 → microsoft_agents_hosting_core-0.9.0.dev3}/microsoft_agents/hosting/core/app/oauth/authorization.py +0 -0
  40. {microsoft_agents_hosting_core-0.9.0.dev1 → microsoft_agents_hosting_core-0.9.0.dev3}/microsoft_agents/hosting/core/app/query.py +0 -0
  41. {microsoft_agents_hosting_core-0.9.0.dev1 → microsoft_agents_hosting_core-0.9.0.dev3}/microsoft_agents/hosting/core/app/state/__init__.py +0 -0
  42. {microsoft_agents_hosting_core-0.9.0.dev1 → microsoft_agents_hosting_core-0.9.0.dev3}/microsoft_agents/hosting/core/app/state/conversation_state.py +0 -0
  43. {microsoft_agents_hosting_core-0.9.0.dev1 → microsoft_agents_hosting_core-0.9.0.dev3}/microsoft_agents/hosting/core/app/state/state.py +0 -0
  44. {microsoft_agents_hosting_core-0.9.0.dev1 → microsoft_agents_hosting_core-0.9.0.dev3}/microsoft_agents/hosting/core/app/state/temp_state.py +0 -0
  45. {microsoft_agents_hosting_core-0.9.0.dev1 → microsoft_agents_hosting_core-0.9.0.dev3}/microsoft_agents/hosting/core/app/state/turn_state.py +0 -0
  46. {microsoft_agents_hosting_core-0.9.0.dev1 → microsoft_agents_hosting_core-0.9.0.dev3}/microsoft_agents/hosting/core/app/streaming/__init__.py +0 -0
  47. {microsoft_agents_hosting_core-0.9.0.dev1 → microsoft_agents_hosting_core-0.9.0.dev3}/microsoft_agents/hosting/core/app/streaming/citation.py +0 -0
  48. {microsoft_agents_hosting_core-0.9.0.dev1 → microsoft_agents_hosting_core-0.9.0.dev3}/microsoft_agents/hosting/core/app/streaming/citation_util.py +0 -0
  49. {microsoft_agents_hosting_core-0.9.0.dev1 → microsoft_agents_hosting_core-0.9.0.dev3}/microsoft_agents/hosting/core/app/typing_indicator.py +0 -0
  50. {microsoft_agents_hosting_core-0.9.0.dev1 → microsoft_agents_hosting_core-0.9.0.dev3}/microsoft_agents/hosting/core/authorization/__init__.py +0 -0
  51. {microsoft_agents_hosting_core-0.9.0.dev1 → microsoft_agents_hosting_core-0.9.0.dev3}/microsoft_agents/hosting/core/authorization/access_token_provider_base.py +0 -0
  52. {microsoft_agents_hosting_core-0.9.0.dev1 → microsoft_agents_hosting_core-0.9.0.dev3}/microsoft_agents/hosting/core/authorization/agent_auth_configuration.py +0 -0
  53. {microsoft_agents_hosting_core-0.9.0.dev1 → microsoft_agents_hosting_core-0.9.0.dev3}/microsoft_agents/hosting/core/authorization/anonymous_token_provider.py +0 -0
  54. {microsoft_agents_hosting_core-0.9.0.dev1 → microsoft_agents_hosting_core-0.9.0.dev3}/microsoft_agents/hosting/core/authorization/auth_types.py +0 -0
  55. {microsoft_agents_hosting_core-0.9.0.dev1 → microsoft_agents_hosting_core-0.9.0.dev3}/microsoft_agents/hosting/core/authorization/authentication_constants.py +0 -0
  56. {microsoft_agents_hosting_core-0.9.0.dev1 → microsoft_agents_hosting_core-0.9.0.dev3}/microsoft_agents/hosting/core/authorization/claims_identity.py +0 -0
  57. {microsoft_agents_hosting_core-0.9.0.dev1 → microsoft_agents_hosting_core-0.9.0.dev3}/microsoft_agents/hosting/core/authorization/connections.py +0 -0
  58. {microsoft_agents_hosting_core-0.9.0.dev1 → microsoft_agents_hosting_core-0.9.0.dev3}/microsoft_agents/hosting/core/card_factory.py +0 -0
  59. {microsoft_agents_hosting_core-0.9.0.dev1 → microsoft_agents_hosting_core-0.9.0.dev3}/microsoft_agents/hosting/core/channel_adapter.py +0 -0
  60. {microsoft_agents_hosting_core-0.9.0.dev1 → microsoft_agents_hosting_core-0.9.0.dev3}/microsoft_agents/hosting/core/channel_api_handler_protocol.py +0 -0
  61. {microsoft_agents_hosting_core-0.9.0.dev1 → microsoft_agents_hosting_core-0.9.0.dev3}/microsoft_agents/hosting/core/channel_service_adapter.py +0 -0
  62. {microsoft_agents_hosting_core-0.9.0.dev1 → microsoft_agents_hosting_core-0.9.0.dev3}/microsoft_agents/hosting/core/channel_service_client_factory_base.py +0 -0
  63. {microsoft_agents_hosting_core-0.9.0.dev1 → microsoft_agents_hosting_core-0.9.0.dev3}/microsoft_agents/hosting/core/client/__init__.py +0 -0
  64. {microsoft_agents_hosting_core-0.9.0.dev1 → microsoft_agents_hosting_core-0.9.0.dev3}/microsoft_agents/hosting/core/client/agent_conversation_reference.py +0 -0
  65. {microsoft_agents_hosting_core-0.9.0.dev1 → microsoft_agents_hosting_core-0.9.0.dev3}/microsoft_agents/hosting/core/client/channel_factory_protocol.py +0 -0
  66. {microsoft_agents_hosting_core-0.9.0.dev1 → microsoft_agents_hosting_core-0.9.0.dev3}/microsoft_agents/hosting/core/client/channel_host_protocol.py +0 -0
  67. {microsoft_agents_hosting_core-0.9.0.dev1 → microsoft_agents_hosting_core-0.9.0.dev3}/microsoft_agents/hosting/core/client/channel_info_protocol.py +0 -0
  68. {microsoft_agents_hosting_core-0.9.0.dev1 → microsoft_agents_hosting_core-0.9.0.dev3}/microsoft_agents/hosting/core/client/channel_protocol.py +0 -0
  69. {microsoft_agents_hosting_core-0.9.0.dev1 → microsoft_agents_hosting_core-0.9.0.dev3}/microsoft_agents/hosting/core/client/channels_configuration.py +0 -0
  70. {microsoft_agents_hosting_core-0.9.0.dev1 → microsoft_agents_hosting_core-0.9.0.dev3}/microsoft_agents/hosting/core/client/configuration_channel_host.py +0 -0
  71. {microsoft_agents_hosting_core-0.9.0.dev1 → microsoft_agents_hosting_core-0.9.0.dev3}/microsoft_agents/hosting/core/client/conversation_constants.py +0 -0
  72. {microsoft_agents_hosting_core-0.9.0.dev1 → microsoft_agents_hosting_core-0.9.0.dev3}/microsoft_agents/hosting/core/client/conversation_id_factory.py +0 -0
  73. {microsoft_agents_hosting_core-0.9.0.dev1 → microsoft_agents_hosting_core-0.9.0.dev3}/microsoft_agents/hosting/core/client/conversation_id_factory_options.py +0 -0
  74. {microsoft_agents_hosting_core-0.9.0.dev1 → microsoft_agents_hosting_core-0.9.0.dev3}/microsoft_agents/hosting/core/client/conversation_id_factory_protocol.py +0 -0
  75. {microsoft_agents_hosting_core-0.9.0.dev1 → microsoft_agents_hosting_core-0.9.0.dev3}/microsoft_agents/hosting/core/client/http_agent_channel.py +0 -0
  76. {microsoft_agents_hosting_core-0.9.0.dev1 → microsoft_agents_hosting_core-0.9.0.dev3}/microsoft_agents/hosting/core/client/http_agent_channel_factory.py +0 -0
  77. {microsoft_agents_hosting_core-0.9.0.dev1 → microsoft_agents_hosting_core-0.9.0.dev3}/microsoft_agents/hosting/core/connector/__init__.py +0 -0
  78. {microsoft_agents_hosting_core-0.9.0.dev1 → microsoft_agents_hosting_core-0.9.0.dev3}/microsoft_agents/hosting/core/connector/agent_sign_in_base.py +0 -0
  79. {microsoft_agents_hosting_core-0.9.0.dev1 → microsoft_agents_hosting_core-0.9.0.dev3}/microsoft_agents/hosting/core/connector/attachments_base.py +0 -0
  80. {microsoft_agents_hosting_core-0.9.0.dev1 → microsoft_agents_hosting_core-0.9.0.dev3}/microsoft_agents/hosting/core/connector/client/__init__.py +0 -0
  81. {microsoft_agents_hosting_core-0.9.0.dev1 → microsoft_agents_hosting_core-0.9.0.dev3}/microsoft_agents/hosting/core/connector/client/user_token_client.py +0 -0
  82. {microsoft_agents_hosting_core-0.9.0.dev1 → microsoft_agents_hosting_core-0.9.0.dev3}/microsoft_agents/hosting/core/connector/connector_client_base.py +0 -0
  83. {microsoft_agents_hosting_core-0.9.0.dev1 → microsoft_agents_hosting_core-0.9.0.dev3}/microsoft_agents/hosting/core/connector/conversations_base.py +0 -0
  84. {microsoft_agents_hosting_core-0.9.0.dev1 → microsoft_agents_hosting_core-0.9.0.dev3}/microsoft_agents/hosting/core/connector/get_product_info.py +0 -0
  85. {microsoft_agents_hosting_core-0.9.0.dev1 → microsoft_agents_hosting_core-0.9.0.dev3}/microsoft_agents/hosting/core/connector/mcs/__init__.py +0 -0
  86. {microsoft_agents_hosting_core-0.9.0.dev1 → microsoft_agents_hosting_core-0.9.0.dev3}/microsoft_agents/hosting/core/connector/mcs/mcs_connector_client.py +0 -0
  87. {microsoft_agents_hosting_core-0.9.0.dev1 → microsoft_agents_hosting_core-0.9.0.dev3}/microsoft_agents/hosting/core/connector/teams/__init__.py +0 -0
  88. {microsoft_agents_hosting_core-0.9.0.dev1 → microsoft_agents_hosting_core-0.9.0.dev3}/microsoft_agents/hosting/core/connector/teams/teams_connector_client.py +0 -0
  89. {microsoft_agents_hosting_core-0.9.0.dev1 → microsoft_agents_hosting_core-0.9.0.dev3}/microsoft_agents/hosting/core/connector/user_token_base.py +0 -0
  90. {microsoft_agents_hosting_core-0.9.0.dev1 → microsoft_agents_hosting_core-0.9.0.dev3}/microsoft_agents/hosting/core/connector/user_token_client_base.py +0 -0
  91. {microsoft_agents_hosting_core-0.9.0.dev1 → microsoft_agents_hosting_core-0.9.0.dev3}/microsoft_agents/hosting/core/errors/__init__.py +0 -0
  92. {microsoft_agents_hosting_core-0.9.0.dev1 → microsoft_agents_hosting_core-0.9.0.dev3}/microsoft_agents/hosting/core/errors/error_resources.py +0 -0
  93. {microsoft_agents_hosting_core-0.9.0.dev1 → microsoft_agents_hosting_core-0.9.0.dev3}/microsoft_agents/hosting/core/http/__init__.py +0 -0
  94. {microsoft_agents_hosting_core-0.9.0.dev1 → microsoft_agents_hosting_core-0.9.0.dev3}/microsoft_agents/hosting/core/http/_channel_service_routes.py +0 -0
  95. {microsoft_agents_hosting_core-0.9.0.dev1 → microsoft_agents_hosting_core-0.9.0.dev3}/microsoft_agents/hosting/core/http/_http_adapter_base.py +0 -0
  96. {microsoft_agents_hosting_core-0.9.0.dev1 → microsoft_agents_hosting_core-0.9.0.dev3}/microsoft_agents/hosting/core/http/_http_request_protocol.py +0 -0
  97. {microsoft_agents_hosting_core-0.9.0.dev1 → microsoft_agents_hosting_core-0.9.0.dev3}/microsoft_agents/hosting/core/http/_http_response.py +0 -0
  98. {microsoft_agents_hosting_core-0.9.0.dev1 → microsoft_agents_hosting_core-0.9.0.dev3}/microsoft_agents/hosting/core/message_factory.py +0 -0
  99. {microsoft_agents_hosting_core-0.9.0.dev1 → microsoft_agents_hosting_core-0.9.0.dev3}/microsoft_agents/hosting/core/middleware_set.py +0 -0
  100. {microsoft_agents_hosting_core-0.9.0.dev1 → microsoft_agents_hosting_core-0.9.0.dev3}/microsoft_agents/hosting/core/rest_channel_service_client_factory.py +0 -0
  101. {microsoft_agents_hosting_core-0.9.0.dev1 → microsoft_agents_hosting_core-0.9.0.dev3}/microsoft_agents/hosting/core/state/__init__.py +0 -0
  102. {microsoft_agents_hosting_core-0.9.0.dev1 → microsoft_agents_hosting_core-0.9.0.dev3}/microsoft_agents/hosting/core/state/agent_state.py +0 -0
  103. {microsoft_agents_hosting_core-0.9.0.dev1 → microsoft_agents_hosting_core-0.9.0.dev3}/microsoft_agents/hosting/core/state/state_property_accessor.py +0 -0
  104. {microsoft_agents_hosting_core-0.9.0.dev1 → microsoft_agents_hosting_core-0.9.0.dev3}/microsoft_agents/hosting/core/state/user_state.py +0 -0
  105. {microsoft_agents_hosting_core-0.9.0.dev1 → microsoft_agents_hosting_core-0.9.0.dev3}/microsoft_agents/hosting/core/storage/__init__.py +0 -0
  106. {microsoft_agents_hosting_core-0.9.0.dev1 → microsoft_agents_hosting_core-0.9.0.dev3}/microsoft_agents/hosting/core/storage/_type_aliases.py +0 -0
  107. {microsoft_agents_hosting_core-0.9.0.dev1 → microsoft_agents_hosting_core-0.9.0.dev3}/microsoft_agents/hosting/core/storage/error_handling.py +0 -0
  108. {microsoft_agents_hosting_core-0.9.0.dev1 → microsoft_agents_hosting_core-0.9.0.dev3}/microsoft_agents/hosting/core/storage/memory_storage.py +0 -0
  109. {microsoft_agents_hosting_core-0.9.0.dev1 → microsoft_agents_hosting_core-0.9.0.dev3}/microsoft_agents/hosting/core/storage/storage.py +0 -0
  110. {microsoft_agents_hosting_core-0.9.0.dev1 → microsoft_agents_hosting_core-0.9.0.dev3}/microsoft_agents/hosting/core/storage/store_item.py +0 -0
  111. {microsoft_agents_hosting_core-0.9.0.dev1 → microsoft_agents_hosting_core-0.9.0.dev3}/microsoft_agents/hosting/core/storage/transcript_file_store.py +0 -0
  112. {microsoft_agents_hosting_core-0.9.0.dev1 → microsoft_agents_hosting_core-0.9.0.dev3}/microsoft_agents/hosting/core/storage/transcript_info.py +0 -0
  113. {microsoft_agents_hosting_core-0.9.0.dev1 → microsoft_agents_hosting_core-0.9.0.dev3}/microsoft_agents/hosting/core/storage/transcript_logger.py +0 -0
  114. {microsoft_agents_hosting_core-0.9.0.dev1 → microsoft_agents_hosting_core-0.9.0.dev3}/microsoft_agents/hosting/core/storage/transcript_memory_store.py +0 -0
  115. {microsoft_agents_hosting_core-0.9.0.dev1 → microsoft_agents_hosting_core-0.9.0.dev3}/microsoft_agents/hosting/core/storage/transcript_store.py +0 -0
  116. {microsoft_agents_hosting_core-0.9.0.dev1 → microsoft_agents_hosting_core-0.9.0.dev3}/microsoft_agents_hosting_core.egg-info/SOURCES.txt +0 -0
  117. {microsoft_agents_hosting_core-0.9.0.dev1 → microsoft_agents_hosting_core-0.9.0.dev3}/microsoft_agents_hosting_core.egg-info/dependency_links.txt +0 -0
  118. {microsoft_agents_hosting_core-0.9.0.dev1 → microsoft_agents_hosting_core-0.9.0.dev3}/microsoft_agents_hosting_core.egg-info/top_level.txt +0 -0
  119. {microsoft_agents_hosting_core-0.9.0.dev1 → microsoft_agents_hosting_core-0.9.0.dev3}/pyproject.toml +0 -0
  120. {microsoft_agents_hosting_core-0.9.0.dev1 → microsoft_agents_hosting_core-0.9.0.dev3}/readme.md +0 -0
  121. {microsoft_agents_hosting_core-0.9.0.dev1 → microsoft_agents_hosting_core-0.9.0.dev3}/setup.cfg +0 -0
  122. {microsoft_agents_hosting_core-0.9.0.dev1 → microsoft_agents_hosting_core-0.9.0.dev3}/setup.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: microsoft-agents-hosting-core
3
- Version: 0.9.0.dev1
3
+ Version: 0.9.0.dev3
4
4
  Summary: Core library for Microsoft Agents
5
5
  Author: Microsoft Corporation
6
6
  License-Expression: MIT
@@ -15,7 +15,7 @@ Classifier: Operating System :: OS Independent
15
15
  Requires-Python: >=3.10
16
16
  Description-Content-Type: text/markdown
17
17
  License-File: LICENSE
18
- Requires-Dist: microsoft-agents-activity==0.9.0.dev1
18
+ Requires-Dist: microsoft-agents-activity==0.9.0.dev3
19
19
  Requires-Dist: pyjwt>=2.10.1
20
20
  Requires-Dist: isodate>=0.6.1
21
21
  Requires-Dist: azure-core>=1.30.0
@@ -0,0 +1 @@
1
+ 0.9.0.dev3
@@ -1,22 +1,26 @@
1
1
  # Copyright (c) Microsoft Corporation. All rights reserved.
2
2
  # Licensed under the MIT License.
3
3
 
4
+ import uuid
4
5
  import asyncio
5
6
  import logging
6
- from typing import List, Optional, Callable, Literal, TYPE_CHECKING
7
+ from typing import List, Optional, Callable, Literal, cast
7
8
 
8
9
  from microsoft_agents.activity import (
9
10
  Activity,
11
+ AIEntity,
10
12
  Entity,
13
+ EntityTypes,
11
14
  Attachment,
12
15
  Channels,
13
16
  ClientCitation,
14
17
  DeliveryModes,
15
18
  SensitivityUsageInfo,
19
+ ClientCitationAppearance,
20
+ StreamInfo,
16
21
  )
17
22
 
18
- if TYPE_CHECKING:
19
- from microsoft_agents.hosting.core.turn_context import TurnContext
23
+ from microsoft_agents.hosting.core.errors import error_resources
20
24
 
21
25
  from .citation import Citation
22
26
  from .citation_util import CitationUtil
@@ -47,58 +51,38 @@ class StreamingResponse:
47
51
  self._sequence_number = 1
48
52
  self._stream_id: Optional[str] = None
49
53
  self._message = ""
50
- self._attachments: Optional[List[Attachment]] = None
51
- self._ended = False
52
- self._cancelled = False
53
-
54
- # Queue for outgoing activities
55
- self._queue: List[Callable[[], Activity]] = []
54
+ self._queue: List[Callable[[], Activity | None]] = []
56
55
  self._queue_sync: Optional[asyncio.Task] = None
57
56
  self._chunk_queued = False
58
-
59
- # Powered by AI feature flags
57
+ self._ended = False
58
+ self._cancelled = False
59
+ self._is_streaming_channel = False
60
+ self._interval = 0.1
61
+ self._attachments: Optional[List[Attachment]] = None
62
+ self._citations: List[ClientCitation] = []
63
+ self._sensitivity_label: Optional[SensitivityUsageInfo] = None
60
64
  self._enable_feedback_loop = False
61
65
  self._feedback_loop_type: Optional[Literal["default", "custom"]] = None
62
66
  self._enable_generated_by_ai_label = False
63
- self._citations: Optional[List[ClientCitation]] = []
64
- self._sensitivity_label: Optional[SensitivityUsageInfo] = None
65
67
 
66
- # Channel information
67
- self._is_streaming_channel: bool = False
68
- self._channel_id: Channels = None
69
- self._interval: float = 0.1 # Default interval for sending updates
68
+ # Set defaults based on channel
70
69
  self._set_defaults(context)
71
70
 
72
- @property
73
- def stream_id(self) -> Optional[str]:
74
- """
75
- Gets the stream ID of the current response.
76
- Assigned after the initial update is sent.
77
- """
78
- return self._stream_id
79
-
80
- @property
81
- def citations(self) -> Optional[List[ClientCitation]]:
82
- """Gets the citations of the current response."""
83
- return self._citations
84
-
85
- @property
86
- def updates_sent(self) -> int:
87
- """Gets the number of updates sent for the stream."""
88
- return self._sequence_number - 1
89
-
90
71
  def queue_informative_update(self, text: str) -> None:
91
72
  """
92
73
  Queues an informative update to be sent to the client.
93
74
 
75
+ Informative updates do not contain the message content that the user will
76
+ read but rather an indication that the agent is processing the request.
77
+
94
78
  Args:
95
- text: Text of the update to send.
79
+ text: The informative text to send to the client.
96
80
  """
97
- if not self._is_streaming_channel:
81
+ if self._cancelled or not self._is_streaming_channel:
98
82
  return
99
83
 
100
84
  if self._ended:
101
- raise RuntimeError("The stream has already ended.")
85
+ raise RuntimeError(str(error_resources.StreamAlreadyEnded))
102
86
 
103
87
  # Queue a typing activity
104
88
  def create_activity():
@@ -106,8 +90,7 @@ class StreamingResponse:
106
90
  type="typing",
107
91
  text=text,
108
92
  entities=[
109
- Entity(
110
- type="streaminfo",
93
+ StreamInfo(
111
94
  stream_type="informative",
112
95
  stream_sequence=self._sequence_number,
113
96
  )
@@ -134,7 +117,7 @@ class StreamingResponse:
134
117
  if self._cancelled:
135
118
  return
136
119
  if self._ended:
137
- raise RuntimeError("The stream has already ended.")
120
+ raise RuntimeError(str(error_resources.StreamAlreadyEnded))
138
121
 
139
122
  # Update full message text
140
123
  self._message += text
@@ -150,7 +133,7 @@ class StreamingResponse:
150
133
  Ends the stream by sending the final message to the client.
151
134
  """
152
135
  if self._ended:
153
- raise RuntimeError("The stream has already ended.")
136
+ raise RuntimeError(str(error_resources.StreamAlreadyEnded))
154
137
 
155
138
  # Queue final message
156
139
  self._ended = True
@@ -192,13 +175,12 @@ class StreamingResponse:
192
175
 
193
176
  for citation in citations:
194
177
  client_citation = ClientCitation(
195
- type="Claim",
196
178
  position=curr_pos + 1,
197
- appearance={
198
- "type": "DigitalDocument",
199
- "name": citation.title or f"Document #{curr_pos + 1}",
200
- "abstract": CitationUtil.snippet(citation.content, 477),
201
- },
179
+ appearance=ClientCitationAppearance(
180
+ name=citation.title or f"Document #{curr_pos + 1}",
181
+ abstract=CitationUtil.snippet(citation.content, 480),
182
+ url=citation.url,
183
+ ),
202
184
  )
203
185
  curr_pos += 1
204
186
  self._citations.append(client_citation)
@@ -249,17 +231,29 @@ class StreamingResponse:
249
231
  await self._queue_sync
250
232
 
251
233
  def _set_defaults(self, context: "TurnContext"):
252
- if Channels.ms_teams == context.activity.channel_id.channel:
253
- self._is_streaming_channel = True
254
- self._interval = 1.0
255
- elif Channels.direct_line == context.activity.channel_id.channel:
234
+
235
+ channel = (
236
+ context.activity.channel_id.channel if context.activity.channel_id else None
237
+ )
238
+
239
+ if channel == Channels.ms_teams:
240
+ if context.activity.is_agentic_request():
241
+ # Agentic requests do not support streaming responses at this time.
242
+ # TODO : Enable streaming for agentic requests when supported.
243
+ self._is_streaming_channel = False
244
+ else:
245
+ self._is_streaming_channel = True
246
+ self._interval = 1.0
247
+ elif channel in [Channels.webchat, Channels.direct_line]:
256
248
  self._is_streaming_channel = True
257
249
  self._interval = 0.5
250
+ self._stream_id = str(uuid.uuid4())
258
251
  elif context.activity.delivery_mode == DeliveryModes.stream:
259
252
  self._is_streaming_channel = True
260
253
  self._interval = 0.1
261
-
262
- self._channel_id = context.activity.channel_id
254
+ self._stream_id = str(uuid.uuid4())
255
+ else:
256
+ self._is_streaming_channel = False
263
257
 
264
258
  def _queue_next_chunk(self) -> None:
265
259
  """
@@ -272,7 +266,7 @@ class StreamingResponse:
272
266
  # Queue a chunk of text to be sent
273
267
  self._chunk_queued = True
274
268
 
275
- def create_activity():
269
+ def create_activity() -> Activity | None:
276
270
  self._chunk_queued = False
277
271
  if self._ended:
278
272
  # Send final message
@@ -281,9 +275,7 @@ class StreamingResponse:
281
275
  text=self._message or "end stream response",
282
276
  attachments=self._attachments or [],
283
277
  entities=[
284
- Entity(
285
- type="streaminfo",
286
- stream_id=self._stream_id,
278
+ StreamInfo(
287
279
  stream_type="final",
288
280
  stream_sequence=self._sequence_number,
289
281
  )
@@ -295,8 +287,7 @@ class StreamingResponse:
295
287
  type="typing",
296
288
  text=self._message,
297
289
  entities=[
298
- Entity(
299
- type="streaminfo",
290
+ StreamInfo(
300
291
  stream_type="streaming",
301
292
  stream_sequence=self._sequence_number,
302
293
  )
@@ -309,7 +300,7 @@ class StreamingResponse:
309
300
 
310
301
  self._queue_activity(create_activity)
311
302
 
312
- def _queue_activity(self, factory: Callable[[], Activity]) -> None:
303
+ def _queue_activity(self, factory: Callable[[], Activity | None]) -> None:
313
304
  """
314
305
  Queues an activity to be sent to the client.
315
306
  """
@@ -331,15 +322,15 @@ class StreamingResponse:
331
322
  if activity:
332
323
  await self._send_activity(activity)
333
324
  except Exception as err:
334
- if (
335
- "403" in str(err)
336
- and self._context.activity.channel_id == Channels.ms_teams
325
+ if "403" in str(err) and (
326
+ self._context.activity.channel_id is not None
327
+ and self._context.activity.channel_id.channel == Channels.ms_teams
337
328
  ):
338
329
  logger.warning("Teams channel stopped the stream.")
339
330
  self._cancelled = True
340
331
  else:
341
332
  logger.error(
342
- f"Error occurred when sending activity while streaming: {err}"
333
+ f"Error occurred when sending activity while streaming: {type(err).__name__}"
343
334
  )
344
335
  raise
345
336
  finally:
@@ -353,20 +344,22 @@ class StreamingResponse:
353
344
  activity: The activity to send.
354
345
  """
355
346
 
356
- streaminfo_entity = None
347
+ streaminfo_entity: StreamInfo | None = None
357
348
 
358
349
  if not activity.entities:
359
- streaminfo_entity = Entity(type="streaminfo")
350
+ streaminfo_entity = StreamInfo(stream_sequence=self._sequence_number)
351
+ self._sequence_number += 1
360
352
  activity.entities = [streaminfo_entity]
361
353
  else:
362
354
  for entity in activity.entities:
363
- if hasattr(entity, "type") and entity.type == "streaminfo":
364
- streaminfo_entity = entity
355
+ if entity.type == EntityTypes.STREAM_INFO:
356
+ streaminfo_entity = cast(StreamInfo, entity)
365
357
  break
366
358
 
367
359
  if not streaminfo_entity:
368
360
  # If no streaminfo entity exists, create one
369
- streaminfo_entity = Entity(type="streaminfo")
361
+ streaminfo_entity = StreamInfo(stream_sequence=self._sequence_number)
362
+ self._sequence_number += 1
370
363
  activity.entities.append(streaminfo_entity)
371
364
 
372
365
  # Set activity ID to the assigned stream ID
@@ -374,17 +367,21 @@ class StreamingResponse:
374
367
  activity.id = self._stream_id
375
368
  streaminfo_entity.stream_id = self._stream_id
376
369
 
377
- if self._citations and len(self._citations) > 0 and not self._ended:
370
+ # the activity.add_ai_metadata call further down will add citations.
371
+ # The extra condition here is to avoid duplication
372
+ if (
373
+ self._citations
374
+ and not self._ended
375
+ and not self._enable_generated_by_ai_label
376
+ ):
378
377
  # Filter out the citations unused in content.
379
378
  curr_citations = CitationUtil.get_used_citations(
380
379
  self._message, self._citations
381
380
  )
382
381
  if curr_citations:
383
382
  activity.entities.append(
384
- Entity(
383
+ AIEntity(
385
384
  type="https://schema.org/Message",
386
- schema_type="Message",
387
- context="https://schema.org",
388
385
  id="",
389
386
  citation=curr_citations,
390
387
  )
@@ -400,7 +397,10 @@ class StreamingResponse:
400
397
  streaminfo_entity.feedback_loop_enabled = self._enable_feedback_loop
401
398
  # Add in Generated by AI
402
399
  if self._enable_generated_by_ai_label:
403
- activity.add_ai_metadata(self._citations, self._sensitivity_label)
400
+ curr_citations = CitationUtil.get_used_citations(
401
+ self._message, self._citations
402
+ )
403
+ activity.add_ai_metadata(curr_citations, self._sensitivity_label)
404
404
 
405
405
  # Send activity
406
406
  response = await self._context.send_activity(activity)
@@ -0,0 +1,116 @@
1
+ # Copyright (c) Microsoft Corporation. All rights reserved.
2
+ # Licensed under the MIT License.
3
+
4
+ import asyncio
5
+ import logging
6
+ import threading
7
+ from typing import Any
8
+ from dataclasses import dataclass
9
+
10
+ from jwt import PyJWKClient, PyJWK, decode, get_unverified_header
11
+
12
+ from .agent_auth_configuration import AgentAuthConfiguration
13
+ from .claims_identity import ClaimsIdentity
14
+
15
+ logger = logging.getLogger(__name__)
16
+
17
+
18
+ @dataclass
19
+ class _JwkClientCacheEntry:
20
+
21
+ jwk_client: PyJWKClient
22
+ lock: threading.Lock
23
+
24
+
25
+ class _JwkClientManager:
26
+ """Helper class to manage PyJWKClient instances for different JWKS URIs, with caching and async-safety"""
27
+
28
+ _cache: dict[str, _JwkClientCacheEntry]
29
+
30
+ def __init__(self):
31
+ self._cache = {}
32
+
33
+ def _get_jwk_client(self, jwks_uri: str) -> _JwkClientCacheEntry:
34
+ """Retrieves a PyJWKClient for the given JWKS URI, using a cache to avoid creating multiple clients for the same URI."""
35
+ if jwks_uri not in self._cache:
36
+ self._cache[jwks_uri] = _JwkClientCacheEntry(
37
+ PyJWKClient(jwks_uri), threading.Lock()
38
+ )
39
+ return self._cache[jwks_uri]
40
+
41
+ async def get_signing_key(self, jwks_uri: str, header: dict[str, Any]) -> PyJWK:
42
+ """Retrieves the signing key from the JWK client for the given token header."""
43
+
44
+ jwk_cache_entry = self._get_jwk_client(jwks_uri)
45
+
46
+ # locking and creating a new thread seems strange,
47
+ # but PyJWKClient.get_signing_key is synchronous, so we spawn another thread
48
+ # to make the call non-blocking, allowing other queued coroutines to run in the meantime.
49
+ # Meanwhile, the lock ensures safety for the PyJWKClient's underlying cache and
50
+ # prevents duplicate calls to the JWKS endpoint for the same URI when multiple
51
+ # coroutines are trying to get signing keys concurrently.
52
+
53
+ def _helper():
54
+ with jwk_cache_entry.lock:
55
+ return jwk_cache_entry.jwk_client.get_signing_key(header["kid"])
56
+
57
+ key = await asyncio.to_thread(_helper)
58
+ return key
59
+
60
+
61
+ class JwtTokenValidator:
62
+ """Utility class for validating JWT tokens using the PyJWT library and JWKs from a specified URI."""
63
+
64
+ _jwk_client_manager = _JwkClientManager()
65
+
66
+ def __init__(self, configuration: AgentAuthConfiguration):
67
+ """Initializes the JwtTokenValidator with the given configuration.
68
+
69
+ :param configuration: An instance of AgentAuthConfiguration containing the necessary settings for token validation.
70
+ """
71
+ self.configuration = configuration
72
+
73
+ async def validate_token(self, token: str) -> ClaimsIdentity:
74
+ """Validates a JWT token.
75
+
76
+ :param token: The JWT token to validate.
77
+ :return: A ClaimsIdentity object containing the token's claims if validation is successful.
78
+ :raises ValueError: If the token is invalid or if the audience claim is not valid
79
+ """
80
+
81
+ logger.debug("Validating JWT token.")
82
+ key = await self._get_public_key_or_secret(token)
83
+ decoded_token = decode(
84
+ token,
85
+ key=key,
86
+ algorithms=["RS256"],
87
+ leeway=300.0,
88
+ options={"verify_aud": False},
89
+ )
90
+ if not self.configuration._jwt_patch_is_valid_aud(decoded_token["aud"]):
91
+ logger.error(f"Invalid audience: {decoded_token['aud']}", stack_info=True)
92
+ raise ValueError("Invalid audience.")
93
+
94
+ # This probably should return a ClaimsIdentity
95
+ logger.debug("JWT token validated successfully.")
96
+ return ClaimsIdentity(decoded_token, True, security_token=token)
97
+
98
+ def get_anonymous_claims(self) -> ClaimsIdentity:
99
+ """Returns a ClaimsIdentity for an anonymous user."""
100
+ logger.debug("Returning anonymous claims identity.")
101
+ return ClaimsIdentity({}, False, authentication_type="Anonymous")
102
+
103
+ async def _get_public_key_or_secret(self, token: str) -> PyJWK:
104
+ """Retrieves the public key or secret for validating the JWT token."""
105
+ header = get_unverified_header(token)
106
+ unverified_payload: dict = decode(token, options={"verify_signature": False})
107
+
108
+ jwks_uri = (
109
+ "https://login.botframework.com/v1/.well-known/keys"
110
+ if unverified_payload.get("iss") == "https://api.botframework.com"
111
+ else f"https://login.microsoftonline.com/{self.configuration.TENANT_ID}/discovery/v2.0/keys"
112
+ )
113
+
114
+ key = await self._jwk_client_manager.get_signing_key(jwks_uri, header)
115
+
116
+ return key
@@ -311,7 +311,7 @@ class ConversationsOperations(ConversationsBase):
311
311
  )
312
312
  async with self.client.put(
313
313
  url,
314
- json=body.model_dump(by_alias=True, exclude_unset=True),
314
+ json=body.model_dump(exclude_unset=True, by_alias=True),
315
315
  ) as response:
316
316
  if response.status >= 300:
317
317
  logger.error(
@@ -142,15 +142,9 @@ class TurnContext(TurnContextProtocol):
142
142
  """
143
143
  # Use lazy import to avoid circular dependency
144
144
  if not hasattr(self, "_streaming_response"):
145
- try:
146
- from microsoft_agents.hosting.aiohttp.app.streaming import (
147
- StreamingResponse,
148
- )
145
+ from microsoft_agents.hosting.core.app.streaming import StreamingResponse
149
146
 
150
- self._streaming_response = StreamingResponse(self)
151
- except ImportError:
152
- # If the hosting library isn't available, return None
153
- self._streaming_response = None
147
+ self._streaming_response = StreamingResponse(self)
154
148
  return self._streaming_response
155
149
 
156
150
  @property
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: microsoft-agents-hosting-core
3
- Version: 0.9.0.dev1
3
+ Version: 0.9.0.dev3
4
4
  Summary: Core library for Microsoft Agents
5
5
  Author: Microsoft Corporation
6
6
  License-Expression: MIT
@@ -15,7 +15,7 @@ Classifier: Operating System :: OS Independent
15
15
  Requires-Python: >=3.10
16
16
  Description-Content-Type: text/markdown
17
17
  License-File: LICENSE
18
- Requires-Dist: microsoft-agents-activity==0.9.0.dev1
18
+ Requires-Dist: microsoft-agents-activity==0.9.0.dev3
19
19
  Requires-Dist: pyjwt>=2.10.1
20
20
  Requires-Dist: isodate>=0.6.1
21
21
  Requires-Dist: azure-core>=1.30.0
@@ -1,4 +1,4 @@
1
- microsoft-agents-activity==0.9.0.dev1
1
+ microsoft-agents-activity==0.9.0.dev3
2
2
  pyjwt>=2.10.1
3
3
  isodate>=0.6.1
4
4
  azure-core>=1.30.0
@@ -1 +0,0 @@
1
- 0.9.0.dev1
@@ -1,56 +0,0 @@
1
- # Copyright (c) Microsoft Corporation. All rights reserved.
2
- # Licensed under the MIT License.
3
-
4
- import asyncio
5
- import logging
6
- import jwt
7
-
8
- from jwt import PyJWKClient, PyJWK, decode, get_unverified_header
9
-
10
- from .agent_auth_configuration import AgentAuthConfiguration
11
- from .claims_identity import ClaimsIdentity
12
-
13
- logger = logging.getLogger(__name__)
14
-
15
-
16
- class JwtTokenValidator:
17
- def __init__(self, configuration: AgentAuthConfiguration):
18
- self.configuration = configuration
19
-
20
- async def validate_token(self, token: str) -> ClaimsIdentity:
21
-
22
- logger.debug("Validating JWT token.")
23
- key = await self._get_public_key_or_secret(token)
24
- decoded_token = jwt.decode(
25
- token,
26
- key=key,
27
- algorithms=["RS256"],
28
- leeway=300.0,
29
- options={"verify_aud": False},
30
- )
31
- if not self.configuration._jwt_patch_is_valid_aud(decoded_token["aud"]):
32
- logger.error(f"Invalid audience: {decoded_token['aud']}", stack_info=True)
33
- raise ValueError("Invalid audience.")
34
-
35
- # This probably should return a ClaimsIdentity
36
- logger.debug("JWT token validated successfully.")
37
- return ClaimsIdentity(decoded_token, True, security_token=token)
38
-
39
- def get_anonymous_claims(self) -> ClaimsIdentity:
40
- logger.debug("Returning anonymous claims identity.")
41
- return ClaimsIdentity({}, False, authentication_type="Anonymous")
42
-
43
- async def _get_public_key_or_secret(self, token: str) -> PyJWK:
44
- header = get_unverified_header(token)
45
- unverified_payload: dict = decode(token, options={"verify_signature": False})
46
-
47
- jwksUri = (
48
- "https://login.botframework.com/v1/.well-known/keys"
49
- if unverified_payload.get("iss") == "https://api.botframework.com"
50
- else f"https://login.microsoftonline.com/{self.configuration.TENANT_ID}/discovery/v2.0/keys"
51
- )
52
- jwks_client = PyJWKClient(jwksUri)
53
-
54
- key = await asyncio.to_thread(jwks_client.get_signing_key, header["kid"])
55
-
56
- return key