microsoft-agents-hosting-core 0.4.0.dev18__tar.gz → 0.5.0__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 (109) hide show
  1. microsoft_agents_hosting_core-0.5.0/LICENSE +21 -0
  2. microsoft_agents_hosting_core-0.5.0/PKG-INFO +191 -0
  3. {microsoft_agents_hosting_core-0.4.0.dev18 → microsoft_agents_hosting_core-0.5.0}/microsoft_agents/hosting/core/_oauth/_flow_state.py +2 -2
  4. {microsoft_agents_hosting_core-0.4.0.dev18 → microsoft_agents_hosting_core-0.5.0}/microsoft_agents/hosting/core/_oauth/_oauth_flow.py +26 -23
  5. {microsoft_agents_hosting_core-0.4.0.dev18 → microsoft_agents_hosting_core-0.5.0}/microsoft_agents/hosting/core/activity_handler.py +19 -17
  6. {microsoft_agents_hosting_core-0.4.0.dev18 → microsoft_agents_hosting_core-0.5.0}/microsoft_agents/hosting/core/app/agent_application.py +37 -13
  7. microsoft_agents_hosting_core-0.5.0/microsoft_agents/hosting/core/app/input_file.py +49 -0
  8. {microsoft_agents_hosting_core-0.4.0.dev18 → microsoft_agents_hosting_core-0.5.0}/microsoft_agents/hosting/core/app/oauth/_handlers/_authorization_handler.py +4 -4
  9. {microsoft_agents_hosting_core-0.4.0.dev18 → microsoft_agents_hosting_core-0.5.0}/microsoft_agents/hosting/core/app/oauth/_handlers/_user_authorization.py +2 -2
  10. {microsoft_agents_hosting_core-0.4.0.dev18 → microsoft_agents_hosting_core-0.5.0}/microsoft_agents/hosting/core/app/oauth/_handlers/agentic_user_authorization.py +9 -9
  11. {microsoft_agents_hosting_core-0.4.0.dev18 → microsoft_agents_hosting_core-0.5.0}/microsoft_agents/hosting/core/app/oauth/authorization.py +38 -20
  12. {microsoft_agents_hosting_core-0.4.0.dev18 → microsoft_agents_hosting_core-0.5.0}/microsoft_agents/hosting/core/app/state/state.py +50 -6
  13. microsoft_agents_hosting_core-0.5.0/microsoft_agents/hosting/core/app/typing_indicator.py +79 -0
  14. {microsoft_agents_hosting_core-0.4.0.dev18 → microsoft_agents_hosting_core-0.5.0}/microsoft_agents/hosting/core/authorization/access_token_provider_base.py +1 -1
  15. {microsoft_agents_hosting_core-0.4.0.dev18 → microsoft_agents_hosting_core-0.5.0}/microsoft_agents/hosting/core/authorization/anonymous_token_provider.py +1 -1
  16. {microsoft_agents_hosting_core-0.4.0.dev18 → microsoft_agents_hosting_core-0.5.0}/microsoft_agents/hosting/core/authorization/jwt_token_validator.py +6 -4
  17. {microsoft_agents_hosting_core-0.4.0.dev18 → microsoft_agents_hosting_core-0.5.0}/microsoft_agents/hosting/core/channel_adapter.py +9 -9
  18. {microsoft_agents_hosting_core-0.4.0.dev18 → microsoft_agents_hosting_core-0.5.0}/microsoft_agents/hosting/core/channel_service_adapter.py +64 -6
  19. {microsoft_agents_hosting_core-0.4.0.dev18 → microsoft_agents_hosting_core-0.5.0}/microsoft_agents/hosting/core/connector/client/connector_client.py +1 -1
  20. {microsoft_agents_hosting_core-0.4.0.dev18 → microsoft_agents_hosting_core-0.5.0}/microsoft_agents/hosting/core/connector/client/user_token_client.py +40 -43
  21. microsoft_agents_hosting_core-0.5.0/microsoft_agents/hosting/core/connector/user_token_base.py +120 -0
  22. {microsoft_agents_hosting_core-0.4.0.dev18 → microsoft_agents_hosting_core-0.5.0}/microsoft_agents/hosting/core/connector/user_token_client_base.py +3 -0
  23. {microsoft_agents_hosting_core-0.4.0.dev18 → microsoft_agents_hosting_core-0.5.0}/microsoft_agents/hosting/core/state/agent_state.py +16 -20
  24. {microsoft_agents_hosting_core-0.4.0.dev18 → microsoft_agents_hosting_core-0.5.0}/microsoft_agents/hosting/core/storage/transcript_file_store.py +1 -5
  25. {microsoft_agents_hosting_core-0.4.0.dev18 → microsoft_agents_hosting_core-0.5.0}/microsoft_agents/hosting/core/turn_context.py +2 -1
  26. microsoft_agents_hosting_core-0.5.0/microsoft_agents_hosting_core.egg-info/PKG-INFO +191 -0
  27. {microsoft_agents_hosting_core-0.4.0.dev18 → microsoft_agents_hosting_core-0.5.0}/microsoft_agents_hosting_core.egg-info/SOURCES.txt +2 -0
  28. {microsoft_agents_hosting_core-0.4.0.dev18 → microsoft_agents_hosting_core-0.5.0}/microsoft_agents_hosting_core.egg-info/requires.txt +1 -1
  29. {microsoft_agents_hosting_core-0.4.0.dev18 → microsoft_agents_hosting_core-0.5.0}/pyproject.toml +9 -2
  30. microsoft_agents_hosting_core-0.5.0/readme.md +166 -0
  31. microsoft_agents_hosting_core-0.4.0.dev18/PKG-INFO +0 -16
  32. microsoft_agents_hosting_core-0.4.0.dev18/microsoft_agents/hosting/core/app/input_file.py +0 -45
  33. microsoft_agents_hosting_core-0.4.0.dev18/microsoft_agents/hosting/core/app/typing_indicator.py +0 -55
  34. microsoft_agents_hosting_core-0.4.0.dev18/microsoft_agents/hosting/core/connector/user_token_base.py +0 -44
  35. microsoft_agents_hosting_core-0.4.0.dev18/microsoft_agents_hosting_core.egg-info/PKG-INFO +0 -16
  36. {microsoft_agents_hosting_core-0.4.0.dev18 → microsoft_agents_hosting_core-0.5.0}/microsoft_agents/hosting/core/__init__.py +0 -0
  37. {microsoft_agents_hosting_core-0.4.0.dev18 → microsoft_agents_hosting_core-0.5.0}/microsoft_agents/hosting/core/_oauth/__init__.py +0 -0
  38. {microsoft_agents_hosting_core-0.4.0.dev18 → microsoft_agents_hosting_core-0.5.0}/microsoft_agents/hosting/core/_oauth/_flow_storage_client.py +0 -0
  39. {microsoft_agents_hosting_core-0.4.0.dev18 → microsoft_agents_hosting_core-0.5.0}/microsoft_agents/hosting/core/agent.py +0 -0
  40. {microsoft_agents_hosting_core-0.4.0.dev18 → microsoft_agents_hosting_core-0.5.0}/microsoft_agents/hosting/core/app/__init__.py +0 -0
  41. {microsoft_agents_hosting_core-0.4.0.dev18 → microsoft_agents_hosting_core-0.5.0}/microsoft_agents/hosting/core/app/_routes/__init__.py +0 -0
  42. {microsoft_agents_hosting_core-0.4.0.dev18 → microsoft_agents_hosting_core-0.5.0}/microsoft_agents/hosting/core/app/_routes/_route.py +0 -0
  43. {microsoft_agents_hosting_core-0.4.0.dev18 → microsoft_agents_hosting_core-0.5.0}/microsoft_agents/hosting/core/app/_routes/_route_list.py +0 -0
  44. {microsoft_agents_hosting_core-0.4.0.dev18 → microsoft_agents_hosting_core-0.5.0}/microsoft_agents/hosting/core/app/_routes/route_rank.py +0 -0
  45. {microsoft_agents_hosting_core-0.4.0.dev18 → microsoft_agents_hosting_core-0.5.0}/microsoft_agents/hosting/core/app/_type_defs.py +0 -0
  46. {microsoft_agents_hosting_core-0.4.0.dev18 → microsoft_agents_hosting_core-0.5.0}/microsoft_agents/hosting/core/app/app_error.py +0 -0
  47. {microsoft_agents_hosting_core-0.4.0.dev18 → microsoft_agents_hosting_core-0.5.0}/microsoft_agents/hosting/core/app/app_options.py +0 -0
  48. {microsoft_agents_hosting_core-0.4.0.dev18 → microsoft_agents_hosting_core-0.5.0}/microsoft_agents/hosting/core/app/oauth/__init__.py +0 -0
  49. {microsoft_agents_hosting_core-0.4.0.dev18 → microsoft_agents_hosting_core-0.5.0}/microsoft_agents/hosting/core/app/oauth/_handlers/__init__.py +0 -0
  50. {microsoft_agents_hosting_core-0.4.0.dev18 → microsoft_agents_hosting_core-0.5.0}/microsoft_agents/hosting/core/app/oauth/_sign_in_response.py +0 -0
  51. {microsoft_agents_hosting_core-0.4.0.dev18 → microsoft_agents_hosting_core-0.5.0}/microsoft_agents/hosting/core/app/oauth/_sign_in_state.py +0 -0
  52. {microsoft_agents_hosting_core-0.4.0.dev18 → microsoft_agents_hosting_core-0.5.0}/microsoft_agents/hosting/core/app/oauth/auth_handler.py +0 -0
  53. {microsoft_agents_hosting_core-0.4.0.dev18 → microsoft_agents_hosting_core-0.5.0}/microsoft_agents/hosting/core/app/query.py +0 -0
  54. {microsoft_agents_hosting_core-0.4.0.dev18 → microsoft_agents_hosting_core-0.5.0}/microsoft_agents/hosting/core/app/state/__init__.py +0 -0
  55. {microsoft_agents_hosting_core-0.4.0.dev18 → microsoft_agents_hosting_core-0.5.0}/microsoft_agents/hosting/core/app/state/conversation_state.py +0 -0
  56. {microsoft_agents_hosting_core-0.4.0.dev18 → microsoft_agents_hosting_core-0.5.0}/microsoft_agents/hosting/core/app/state/temp_state.py +0 -0
  57. {microsoft_agents_hosting_core-0.4.0.dev18 → microsoft_agents_hosting_core-0.5.0}/microsoft_agents/hosting/core/app/state/turn_state.py +0 -0
  58. {microsoft_agents_hosting_core-0.4.0.dev18 → microsoft_agents_hosting_core-0.5.0}/microsoft_agents/hosting/core/authorization/__init__.py +0 -0
  59. {microsoft_agents_hosting_core-0.4.0.dev18 → microsoft_agents_hosting_core-0.5.0}/microsoft_agents/hosting/core/authorization/agent_auth_configuration.py +0 -0
  60. {microsoft_agents_hosting_core-0.4.0.dev18 → microsoft_agents_hosting_core-0.5.0}/microsoft_agents/hosting/core/authorization/auth_types.py +0 -0
  61. {microsoft_agents_hosting_core-0.4.0.dev18 → microsoft_agents_hosting_core-0.5.0}/microsoft_agents/hosting/core/authorization/authentication_constants.py +0 -0
  62. {microsoft_agents_hosting_core-0.4.0.dev18 → microsoft_agents_hosting_core-0.5.0}/microsoft_agents/hosting/core/authorization/claims_identity.py +0 -0
  63. {microsoft_agents_hosting_core-0.4.0.dev18 → microsoft_agents_hosting_core-0.5.0}/microsoft_agents/hosting/core/authorization/connections.py +0 -0
  64. {microsoft_agents_hosting_core-0.4.0.dev18 → microsoft_agents_hosting_core-0.5.0}/microsoft_agents/hosting/core/card_factory.py +0 -0
  65. {microsoft_agents_hosting_core-0.4.0.dev18 → microsoft_agents_hosting_core-0.5.0}/microsoft_agents/hosting/core/channel_api_handler_protocol.py +0 -0
  66. {microsoft_agents_hosting_core-0.4.0.dev18 → microsoft_agents_hosting_core-0.5.0}/microsoft_agents/hosting/core/channel_service_client_factory_base.py +0 -0
  67. {microsoft_agents_hosting_core-0.4.0.dev18 → microsoft_agents_hosting_core-0.5.0}/microsoft_agents/hosting/core/client/__init__.py +0 -0
  68. {microsoft_agents_hosting_core-0.4.0.dev18 → microsoft_agents_hosting_core-0.5.0}/microsoft_agents/hosting/core/client/agent_conversation_reference.py +0 -0
  69. {microsoft_agents_hosting_core-0.4.0.dev18 → microsoft_agents_hosting_core-0.5.0}/microsoft_agents/hosting/core/client/channel_factory_protocol.py +0 -0
  70. {microsoft_agents_hosting_core-0.4.0.dev18 → microsoft_agents_hosting_core-0.5.0}/microsoft_agents/hosting/core/client/channel_host_protocol.py +0 -0
  71. {microsoft_agents_hosting_core-0.4.0.dev18 → microsoft_agents_hosting_core-0.5.0}/microsoft_agents/hosting/core/client/channel_info_protocol.py +0 -0
  72. {microsoft_agents_hosting_core-0.4.0.dev18 → microsoft_agents_hosting_core-0.5.0}/microsoft_agents/hosting/core/client/channel_protocol.py +0 -0
  73. {microsoft_agents_hosting_core-0.4.0.dev18 → microsoft_agents_hosting_core-0.5.0}/microsoft_agents/hosting/core/client/channels_configuration.py +0 -0
  74. {microsoft_agents_hosting_core-0.4.0.dev18 → microsoft_agents_hosting_core-0.5.0}/microsoft_agents/hosting/core/client/configuration_channel_host.py +0 -0
  75. {microsoft_agents_hosting_core-0.4.0.dev18 → microsoft_agents_hosting_core-0.5.0}/microsoft_agents/hosting/core/client/conversation_constants.py +0 -0
  76. {microsoft_agents_hosting_core-0.4.0.dev18 → microsoft_agents_hosting_core-0.5.0}/microsoft_agents/hosting/core/client/conversation_id_factory.py +0 -0
  77. {microsoft_agents_hosting_core-0.4.0.dev18 → microsoft_agents_hosting_core-0.5.0}/microsoft_agents/hosting/core/client/conversation_id_factory_options.py +0 -0
  78. {microsoft_agents_hosting_core-0.4.0.dev18 → microsoft_agents_hosting_core-0.5.0}/microsoft_agents/hosting/core/client/conversation_id_factory_protocol.py +0 -0
  79. {microsoft_agents_hosting_core-0.4.0.dev18 → microsoft_agents_hosting_core-0.5.0}/microsoft_agents/hosting/core/client/http_agent_channel.py +0 -0
  80. {microsoft_agents_hosting_core-0.4.0.dev18 → microsoft_agents_hosting_core-0.5.0}/microsoft_agents/hosting/core/client/http_agent_channel_factory.py +0 -0
  81. {microsoft_agents_hosting_core-0.4.0.dev18 → microsoft_agents_hosting_core-0.5.0}/microsoft_agents/hosting/core/connector/__init__.py +0 -0
  82. {microsoft_agents_hosting_core-0.4.0.dev18 → microsoft_agents_hosting_core-0.5.0}/microsoft_agents/hosting/core/connector/agent_sign_in_base.py +0 -0
  83. {microsoft_agents_hosting_core-0.4.0.dev18 → microsoft_agents_hosting_core-0.5.0}/microsoft_agents/hosting/core/connector/attachments_base.py +0 -0
  84. {microsoft_agents_hosting_core-0.4.0.dev18 → microsoft_agents_hosting_core-0.5.0}/microsoft_agents/hosting/core/connector/client/__init__.py +0 -0
  85. {microsoft_agents_hosting_core-0.4.0.dev18 → microsoft_agents_hosting_core-0.5.0}/microsoft_agents/hosting/core/connector/connector_client_base.py +0 -0
  86. {microsoft_agents_hosting_core-0.4.0.dev18 → microsoft_agents_hosting_core-0.5.0}/microsoft_agents/hosting/core/connector/conversations_base.py +0 -0
  87. {microsoft_agents_hosting_core-0.4.0.dev18 → microsoft_agents_hosting_core-0.5.0}/microsoft_agents/hosting/core/connector/get_product_info.py +0 -0
  88. {microsoft_agents_hosting_core-0.4.0.dev18 → microsoft_agents_hosting_core-0.5.0}/microsoft_agents/hosting/core/connector/teams/__init__.py +0 -0
  89. {microsoft_agents_hosting_core-0.4.0.dev18 → microsoft_agents_hosting_core-0.5.0}/microsoft_agents/hosting/core/connector/teams/teams_connector_client.py +0 -0
  90. {microsoft_agents_hosting_core-0.4.0.dev18 → microsoft_agents_hosting_core-0.5.0}/microsoft_agents/hosting/core/message_factory.py +0 -0
  91. {microsoft_agents_hosting_core-0.4.0.dev18 → microsoft_agents_hosting_core-0.5.0}/microsoft_agents/hosting/core/middleware_set.py +0 -0
  92. {microsoft_agents_hosting_core-0.4.0.dev18 → microsoft_agents_hosting_core-0.5.0}/microsoft_agents/hosting/core/rest_channel_service_client_factory.py +0 -0
  93. {microsoft_agents_hosting_core-0.4.0.dev18 → microsoft_agents_hosting_core-0.5.0}/microsoft_agents/hosting/core/state/__init__.py +0 -0
  94. {microsoft_agents_hosting_core-0.4.0.dev18 → microsoft_agents_hosting_core-0.5.0}/microsoft_agents/hosting/core/state/state_property_accessor.py +0 -0
  95. {microsoft_agents_hosting_core-0.4.0.dev18 → microsoft_agents_hosting_core-0.5.0}/microsoft_agents/hosting/core/state/user_state.py +0 -0
  96. {microsoft_agents_hosting_core-0.4.0.dev18 → microsoft_agents_hosting_core-0.5.0}/microsoft_agents/hosting/core/storage/__init__.py +0 -0
  97. {microsoft_agents_hosting_core-0.4.0.dev18 → microsoft_agents_hosting_core-0.5.0}/microsoft_agents/hosting/core/storage/_type_aliases.py +0 -0
  98. {microsoft_agents_hosting_core-0.4.0.dev18 → microsoft_agents_hosting_core-0.5.0}/microsoft_agents/hosting/core/storage/error_handling.py +0 -0
  99. {microsoft_agents_hosting_core-0.4.0.dev18 → microsoft_agents_hosting_core-0.5.0}/microsoft_agents/hosting/core/storage/memory_storage.py +0 -0
  100. {microsoft_agents_hosting_core-0.4.0.dev18 → microsoft_agents_hosting_core-0.5.0}/microsoft_agents/hosting/core/storage/storage.py +0 -0
  101. {microsoft_agents_hosting_core-0.4.0.dev18 → microsoft_agents_hosting_core-0.5.0}/microsoft_agents/hosting/core/storage/store_item.py +0 -0
  102. {microsoft_agents_hosting_core-0.4.0.dev18 → microsoft_agents_hosting_core-0.5.0}/microsoft_agents/hosting/core/storage/transcript_info.py +0 -0
  103. {microsoft_agents_hosting_core-0.4.0.dev18 → microsoft_agents_hosting_core-0.5.0}/microsoft_agents/hosting/core/storage/transcript_logger.py +0 -0
  104. {microsoft_agents_hosting_core-0.4.0.dev18 → microsoft_agents_hosting_core-0.5.0}/microsoft_agents/hosting/core/storage/transcript_memory_store.py +0 -0
  105. {microsoft_agents_hosting_core-0.4.0.dev18 → microsoft_agents_hosting_core-0.5.0}/microsoft_agents/hosting/core/storage/transcript_store.py +0 -0
  106. {microsoft_agents_hosting_core-0.4.0.dev18 → microsoft_agents_hosting_core-0.5.0}/microsoft_agents_hosting_core.egg-info/dependency_links.txt +0 -0
  107. {microsoft_agents_hosting_core-0.4.0.dev18 → microsoft_agents_hosting_core-0.5.0}/microsoft_agents_hosting_core.egg-info/top_level.txt +0 -0
  108. {microsoft_agents_hosting_core-0.4.0.dev18 → microsoft_agents_hosting_core-0.5.0}/setup.cfg +0 -0
  109. {microsoft_agents_hosting_core-0.4.0.dev18 → microsoft_agents_hosting_core-0.5.0}/setup.py +0 -0
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) Microsoft Corporation.
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE
@@ -0,0 +1,191 @@
1
+ Metadata-Version: 2.4
2
+ Name: microsoft-agents-hosting-core
3
+ Version: 0.5.0
4
+ Summary: Core library for Microsoft Agents
5
+ Author: Microsoft Corporation
6
+ License-Expression: MIT
7
+ Project-URL: Homepage, https://github.com/microsoft/Agents
8
+ Classifier: Programming Language :: Python :: 3
9
+ Classifier: Programming Language :: Python :: 3.10
10
+ Classifier: Programming Language :: Python :: 3.11
11
+ Classifier: Programming Language :: Python :: 3.12
12
+ Classifier: Programming Language :: Python :: 3.13
13
+ Classifier: Programming Language :: Python :: 3.14
14
+ Classifier: Operating System :: OS Independent
15
+ Requires-Python: >=3.10
16
+ Description-Content-Type: text/markdown
17
+ License-File: LICENSE
18
+ Requires-Dist: microsoft-agents-activity==0.5.0
19
+ Requires-Dist: pyjwt>=2.10.1
20
+ Requires-Dist: isodate>=0.6.1
21
+ Requires-Dist: azure-core>=1.30.0
22
+ Requires-Dist: python-dotenv>=1.1.1
23
+ Dynamic: license-file
24
+ Dynamic: requires-dist
25
+
26
+ # Microsoft Agents Hosting Core
27
+
28
+ [![PyPI version](https://img.shields.io/pypi/v/microsoft-agents-hosting-core)](https://pypi.org/project/microsoft-agents-hosting-core/)
29
+
30
+ The core hosting library for Microsoft 365 Agents SDK. This library provides the fundamental building blocks for creating conversational AI agents, including activity processing, state management, authentication, and channel communication.
31
+
32
+ This is the heart of the Microsoft 365 Agents SDK - think of it as the engine that powers your conversational agents. It handles the complex orchestration of conversations, manages state across turns, and provides the infrastructure needed to build production-ready agents that work across Microsoft 365 platforms.
33
+
34
+ # What is this?
35
+ This library is part of the **Microsoft 365 Agents SDK for Python** - a comprehensive framework for building enterprise-grade conversational AI agents. The SDK enables developers to create intelligent agents that work across multiple platforms including Microsoft Teams, M365 Copilot, Copilot Studio, and web chat, with support for third-party integrations like Slack, Facebook Messenger, and Twilio.
36
+
37
+ ## Release Notes
38
+ <table style="width:100%">
39
+ <tr>
40
+ <th style="width:20%">Version</th>
41
+ <th style="width:20%">Date</th>
42
+ <th style="width:60%">Release Notes</th>
43
+ </tr>
44
+ <tr>
45
+ <td>0.5.0</td>
46
+ <td>2025-10-22</td>
47
+ <td>
48
+ <a href="https://github.com/microsoft/Agents-for-python/blob/main/changelog.md">
49
+ 0.5.0 Release Notes
50
+ </a>
51
+ </td>
52
+ </tr>
53
+ </table>
54
+
55
+ ## Packages Overview
56
+
57
+ We offer the following PyPI packages to create conversational experiences based on Agents:
58
+
59
+ | Package Name | PyPI Version | Description |
60
+ |--------------|-------------|-------------|
61
+ | `microsoft-agents-activity` | [![PyPI](https://img.shields.io/pypi/v/microsoft-agents-activity)](https://pypi.org/project/microsoft-agents-activity/) | Types and validators implementing the Activity protocol spec. |
62
+ | `microsoft-agents-hosting-core` | [![PyPI](https://img.shields.io/pypi/v/microsoft-agents-hosting-core)](https://pypi.org/project/microsoft-agents-hosting-core/) | Core library for Microsoft Agents hosting. |
63
+ | `microsoft-agents-hosting-aiohttp` | [![PyPI](https://img.shields.io/pypi/v/microsoft-agents-hosting-aiohttp)](https://pypi.org/project/microsoft-agents-hosting-aiohttp/) | Configures aiohttp to run the Agent. |
64
+ | `microsoft-agents-hosting-teams` | [![PyPI](https://img.shields.io/pypi/v/microsoft-agents-hosting-teams)](https://pypi.org/project/microsoft-agents-hosting-teams/) | Provides classes to host an Agent for Teams. |
65
+ | `microsoft-agents-storage-blob` | [![PyPI](https://img.shields.io/pypi/v/microsoft-agents-storage-blob)](https://pypi.org/project/microsoft-agents-storage-blob/) | Extension to use Azure Blob as storage. |
66
+ | `microsoft-agents-storage-cosmos` | [![PyPI](https://img.shields.io/pypi/v/microsoft-agents-storage-cosmos)](https://pypi.org/project/microsoft-agents-storage-cosmos/) | Extension to use CosmosDB as storage. |
67
+ | `microsoft-agents-authentication-msal` | [![PyPI](https://img.shields.io/pypi/v/microsoft-agents-authentication-msal)](https://pypi.org/project/microsoft-agents-authentication-msal/) | MSAL-based authentication for Microsoft Agents. |
68
+
69
+ Additionally we provide a Copilot Studio Client, to interact with Agents created in CopilotStudio:
70
+
71
+ | Package Name | PyPI Version | Description |
72
+ |--------------|-------------|-------------|
73
+ | `microsoft-agents-copilotstudio-client` | [![PyPI](https://img.shields.io/pypi/v/microsoft-agents-copilotstudio-client)](https://pypi.org/project/microsoft-agents-copilotstudio-client/) | Direct to Engine client to interact with Agents created in CopilotStudio |
74
+
75
+
76
+ ## Installation
77
+
78
+ ```bash
79
+ pip install microsoft-agents-hosting-core
80
+ ```
81
+ ## Simple Echo Agent
82
+ See the [Quickstart sample](https://github.com/microsoft/Agents/tree/main/samples/python/quickstart) for full working code.
83
+
84
+ ```python
85
+ agents_sdk_config = load_configuration_from_env(environ)
86
+
87
+ STORAGE = MemoryStorage()
88
+ CONNECTION_MANAGER = MsalConnectionManager(**agents_sdk_config)
89
+ ADAPTER = CloudAdapter(connection_manager=CONNECTION_MANAGER)
90
+ AUTHORIZATION = Authorization(STORAGE, CONNECTION_MANAGER, **agents_sdk_config)
91
+
92
+ AGENT_APP = AgentApplication[TurnState](
93
+ storage=STORAGE, adapter=ADAPTER, authorization=AUTHORIZATION, **agents_sdk_config
94
+ )
95
+
96
+ @AGENT_APP.activity("message")
97
+ async def on_message(context: TurnContext, state: TurnState):
98
+ await context.send_activity(f"You said: {context.activity.text}")
99
+
100
+ ...
101
+
102
+ start_server(
103
+ agent_application=AGENT_APP,
104
+ auth_configuration=CONNECTION_MANAGER.get_default_connection_configuration(),
105
+ )
106
+ ```
107
+
108
+ ## Core Concepts
109
+
110
+ ### AgentApplication vs ActivityHandler
111
+
112
+ **AgentApplication** - Modern, fluent API for building agents:
113
+ - Decorator-based routing (`@agent_app.activity("message")`)
114
+ - Built-in state management and middleware
115
+ - AI-ready with authorization support
116
+ - Type-safe with generics
117
+
118
+ **ActivityHandler** - Traditional inheritance-based approach:
119
+ - Override methods for different activity types
120
+ - More familiar to Bot Framework developers
121
+ - Lower-level control over activity processing
122
+
123
+ ### Route-based Message Handling
124
+
125
+ ```python
126
+ @AGENT_APP.message(re.compile(r"^hello$"))
127
+ async def on_hello(context: TurnContext, _state: TurnState):
128
+ await context.send_activity("Hello!")
129
+
130
+
131
+ @AGENT_APP.activity("message")
132
+ async def on_message(context: TurnContext, _state: TurnState):
133
+ await context.send_activity(f"you said: {context.activity.text}")
134
+ ```
135
+
136
+ ### Error Handling
137
+
138
+ ```python
139
+ @AGENT_APP.error
140
+ async def on_error(context: TurnContext, error: Exception):
141
+ # NOTE: In production environment, you should consider logging this to Azure
142
+ # application insights.
143
+ print(f"\n [on_turn_error] unhandled error: {error}", file=sys.stderr)
144
+ traceback.print_exc()
145
+
146
+ # Send a message to the user
147
+ await context.send_activity("The bot encountered an error or bug.")
148
+ ```
149
+
150
+
151
+ ## Key Classes Reference
152
+
153
+ ### Core Classes
154
+ - **`AgentApplication`** - Main application class with fluent API
155
+ - **`ActivityHandler`** - Base class for inheritance-based agents
156
+ - **`TurnContext`** - Context for each conversation turn
157
+ - **`TurnState`** - State management across conversation turns
158
+
159
+ ### State Management
160
+ - **`ConversationState`** - Conversation-scoped state
161
+ - **`UserState`** - User-scoped state across conversations
162
+ - **`TempState`** - Temporary state for current turn
163
+ - **`MemoryStorage`** - In-memory storage (development)
164
+
165
+ ### Messaging
166
+ - **`MessageFactory`** - Create different types of messages
167
+ - **`CardFactory`** - Create rich card attachments
168
+ - **`InputFile`** - Handle file attachments
169
+
170
+ ### Authorization
171
+ - **`Authorization`** - Authentication and authorization manager
172
+ - **`ClaimsIdentity`** - User identity and claims
173
+
174
+ # Quick Links
175
+
176
+ - 📦 [All SDK Packages on PyPI](https://pypi.org/search/?q=microsoft-agents)
177
+ - 📖 [Complete Documentation](https://aka.ms/agents)
178
+ - 💡 [Python Samples Repository](https://github.com/microsoft/Agents/tree/main/samples/python)
179
+ - 🐛 [Report Issues](https://github.com/microsoft/Agents-for-python/issues)
180
+
181
+ # Sample Applications
182
+
183
+ |Name|Description|README|
184
+ |----|----|----|
185
+ |Quickstart|Simplest agent|[Quickstart](https://github.com/microsoft/Agents/blob/main/samples/python/quickstart/README.md)|
186
+ |Auto Sign In|Simple OAuth agent using Graph and GitHub|[auto-signin](https://github.com/microsoft/Agents/blob/main/samples/python/auto-signin/README.md)|
187
+ |OBO Authorization|OBO flow to access a Copilot Studio Agent|[obo-authorization](https://github.com/microsoft/Agents/blob/main/samples/python/obo-authorization/README.md)|
188
+ |Semantic Kernel Integration|A weather agent built with Semantic Kernel|[semantic-kernel-multiturn](https://github.com/microsoft/Agents/blob/main/samples/python/semantic-kernel-multiturn/README.md)|
189
+ |Streaming Agent|Streams OpenAI responses|[azure-ai-streaming](https://github.com/microsoft/Agents/blob/main/samples/python/azureai-streaming/README.md)|
190
+ |Copilot Studio Client|Console app to consume a Copilot Studio Agent|[copilotstudio-client](https://github.com/microsoft/Agents/blob/main/samples/python/copilotstudio-client/README.md)|
191
+ |Cards Agent|Agent that uses rich cards to enhance conversation design |[cards](https://github.com/microsoft/Agents/blob/main/samples/python/cards/README.md)|
@@ -3,7 +3,7 @@
3
3
 
4
4
  from __future__ import annotations
5
5
 
6
- from datetime import datetime
6
+ from datetime import datetime, timezone
7
7
  from enum import Enum
8
8
  from typing import Optional
9
9
 
@@ -60,7 +60,7 @@ class _FlowState(BaseModel, StoreItem):
60
60
  return _FlowState.model_validate(json_data)
61
61
 
62
62
  def is_expired(self) -> bool:
63
- return datetime.now().timestamp() >= self.expiration
63
+ return datetime.now(timezone.utc).timestamp() >= self.expiration
64
64
 
65
65
  def reached_max_attempts(self) -> bool:
66
66
  return self.attempts_remaining <= 0
@@ -6,7 +6,7 @@ from __future__ import annotations
6
6
  import logging
7
7
 
8
8
  from pydantic import BaseModel
9
- from datetime import datetime
9
+ from datetime import datetime, timezone
10
10
  from typing import Optional
11
11
 
12
12
  from microsoft_agents.activity import (
@@ -30,7 +30,6 @@ class _FlowResponse(BaseModel):
30
30
  flow_error_tag: _FlowErrorTag = _FlowErrorTag.NONE
31
31
  token_response: Optional[TokenResponse] = None
32
32
  sign_in_resource: Optional[SignInResource] = None
33
- continuation_activity: Optional[Activity] = None
34
33
 
35
34
 
36
35
  class _OAuthFlow:
@@ -112,7 +111,7 @@ class _OAuthFlow:
112
111
  """Get the user token based on the context.
113
112
 
114
113
  Args:
115
- magic_code (str, optional): Defaults to None. The magic code for user authentication.
114
+ magic_code (str, Optional): Defaults to None. The magic code for user authentication.
116
115
 
117
116
  Returns:
118
117
  TokenResponse
@@ -137,7 +136,7 @@ class _OAuthFlow:
137
136
  if token_response:
138
137
  logger.info("User token obtained successfully: %s", token_response)
139
138
  self._flow_state.expiration = (
140
- datetime.now().timestamp() + self._default_flow_duration
139
+ datetime.now(timezone.utc).timestamp() + self._default_flow_duration
141
140
  )
142
141
  self._flow_state.tag = _FlowStateTag.COMPLETE
143
142
 
@@ -183,20 +182,8 @@ class _OAuthFlow:
183
182
  Notes:
184
183
  The flow state is reset if a token is not obtained from cache.
185
184
  """
186
- token_response = await self.get_user_token()
187
- if token_response:
188
- return _FlowResponse(
189
- flow_state=self._flow_state, token_response=token_response
190
- )
191
185
 
192
186
  logger.debug("Starting new OAuth flow")
193
- self._flow_state.tag = _FlowStateTag.BEGIN
194
- self._flow_state.expiration = (
195
- datetime.now().timestamp() + self._default_flow_duration
196
- )
197
-
198
- self._flow_state.attempts_remaining = self._max_attempts
199
- self._flow_state.continuation_activity = activity.model_copy()
200
187
 
201
188
  token_exchange_state = TokenExchangeState(
202
189
  connection_name=self._abs_oauth_connection_name,
@@ -205,16 +192,33 @@ class _OAuthFlow:
205
192
  ms_app_id=self._ms_app_id,
206
193
  )
207
194
 
208
- sign_in_resource = (
209
- await self._user_token_client.agent_sign_in.get_sign_in_resource(
210
- state=token_exchange_state.get_encoded_state()
195
+ res = await self._user_token_client.user_token._get_token_or_sign_in_resource(
196
+ activity.from_property.id,
197
+ self._abs_oauth_connection_name,
198
+ activity.channel_id,
199
+ token_exchange_state.get_encoded_state(),
200
+ )
201
+
202
+ if res.token_response:
203
+ logger.info("Skipping flow, user token obtained.")
204
+ self._flow_state.tag = _FlowStateTag.COMPLETE
205
+ self._flow_state.expiration = (
206
+ datetime.now(timezone.utc).timestamp() + self._default_flow_duration
207
+ )
208
+ return _FlowResponse(
209
+ flow_state=self._flow_state, token_response=res.token_response
211
210
  )
211
+
212
+ self._flow_state.tag = _FlowStateTag.BEGIN
213
+ self._flow_state.expiration = (
214
+ datetime.now(timezone.utc).timestamp() + self._default_flow_duration
212
215
  )
216
+ self._flow_state.attempts_remaining = self._max_attempts
213
217
 
214
- logger.debug("Sign-in resource obtained successfully: %s", sign_in_resource)
218
+ logger.debug("Sign-in resource obtained successfully: %s", res.sign_in_resource)
215
219
 
216
220
  return _FlowResponse(
217
- flow_state=self._flow_state, sign_in_resource=sign_in_resource
221
+ flow_state=self._flow_state, sign_in_resource=res.sign_in_resource
218
222
  )
219
223
 
220
224
  async def _continue_from_message(
@@ -299,7 +303,7 @@ class _OAuthFlow:
299
303
  else:
300
304
  self._flow_state.tag = _FlowStateTag.COMPLETE
301
305
  self._flow_state.expiration = (
302
- datetime.now().timestamp() + self._default_flow_duration
306
+ datetime.now(timezone.utc).timestamp() + self._default_flow_duration
303
307
  )
304
308
  logger.debug(
305
309
  "OAuth flow completed successfully, got TokenResponse: %s",
@@ -310,7 +314,6 @@ class _OAuthFlow:
310
314
  flow_state=self._flow_state.model_copy(),
311
315
  flow_error_tag=flow_error_tag,
312
316
  token_response=token_response,
313
- continuation_activity=self._flow_state.continuation_activity,
314
317
  )
315
318
 
316
319
  async def begin_or_continue_flow(self, activity: Activity) -> _FlowResponse:
@@ -38,7 +38,7 @@ class ActivityHandler(Agent):
38
38
  in order to process an inbound :class:`microsoft_agents.activity.Activity`.
39
39
 
40
40
  :param turn_context: The context object for this turn
41
- :type turn_context: :class:`microsoft_agents.builder.TurnContext`
41
+ :type turn_context: :class:`microsoft_agents.activity.TurnContextProtocol`
42
42
 
43
43
  :returns: A task that represents the work queued to execute
44
44
 
@@ -143,7 +143,7 @@ class ActivityHandler(Agent):
143
143
  :meth:`on_turn()` is used.
144
144
 
145
145
  :param turn_context: The context object for this turn
146
- :type turn_context: :class:`microsoft_agents.builder.TurnContext`
146
+ :type turn_context: :class:`microsoft_agents.activity.TurnContextProtocol`
147
147
  :returns: A task that represents the work queued to execute
148
148
 
149
149
  .. remarks::
@@ -176,7 +176,7 @@ class ActivityHandler(Agent):
176
176
 
177
177
  :param members_added: A list of all the members added to the conversation, as described by the
178
178
  conversation update activity
179
- :type members_added: list[ChannelAccount]
179
+ :type members_added: list[:class:`microsoft_agents.activity.ChannelAccount`]
180
180
  :param turn_context: The context object for this turn
181
181
  :type turn_context: :class:`microsoft_agents.activity.TurnContextProtocol`
182
182
  :returns: A task that represents the work queued to execute
@@ -195,9 +195,9 @@ class ActivityHandler(Agent):
195
195
  Override this method in a derived class to provide logic for when members other than the agent leave
196
196
  the conversation. You can add your agent's good-bye logic.
197
197
 
198
- :param members_added: A list of all the members removed from the conversation, as described by the
198
+ :param members_removed: A list of all the members removed from the conversation, as described by the
199
199
  conversation update activity
200
- :type members_added: list[ChannelAccount]
200
+ :type members_removed: list[:class:`microsoft_agents.activity.ChannelAccount`]
201
201
  :param turn_context: The context object for this turn
202
202
  :type turn_context: :class:`microsoft_agents.activity.TurnContextProtocol`
203
203
  :returns: A task that represents the work queued to execute
@@ -216,7 +216,7 @@ class ActivityHandler(Agent):
216
216
  :meth:`on_turn()` is used.
217
217
 
218
218
  :param turn_context: The context object for this turn
219
- :type turn_context: :class:`microsoft_agents.builder.TurnContext`
219
+ :type turn_context: :class:`microsoft_agents.activity.TurnContextProtocol`
220
220
 
221
221
  :returns: A task that represents the work queued to execute
222
222
 
@@ -260,7 +260,7 @@ class ActivityHandler(Agent):
260
260
  are added to the conversation.
261
261
 
262
262
  :param message_reactions: The list of reactions added
263
- :type message_reactions: list[MessageReaction]
263
+ :type message_reactions: list[:class:`microsoft_agents.activity.MessageReaction`]
264
264
  :param turn_context: The context object for this turn
265
265
  :type turn_context: :class:`microsoft_agents.activity.TurnContextProtocol`
266
266
  :returns: A task that represents the work queued to execute
@@ -285,7 +285,7 @@ class ActivityHandler(Agent):
285
285
  are removed from the conversation.
286
286
 
287
287
  :param message_reactions: The list of reactions removed
288
- :type message_reactions: list[MessageReaction]
288
+ :type message_reactions: list[:class:`microsoft_agents.activity.MessageReaction`]
289
289
  :param turn_context: The context object for this turn
290
290
  :type turn_context: :class:`microsoft_agents.activity.TurnContextProtocol`
291
291
 
@@ -382,7 +382,7 @@ class ActivityHandler(Agent):
382
382
  ActivityTypes.typing activities, such as the conversational logic.
383
383
 
384
384
  :param turn_context: The context object for this turn
385
- :type turn_context: :class:`microsoft_agents.builder.TurnContext`
385
+ :type turn_context: :class:`microsoft_agents.activity.TurnContextProtocol`
386
386
  :returns: A task that represents the work queued to execute
387
387
  """
388
388
  return
@@ -395,7 +395,7 @@ class ActivityHandler(Agent):
395
395
  ActivityTypes.InstallationUpdate activities.
396
396
 
397
397
  :param turn_context: The context object for this turn
398
- :type turn_context: :class:`microsoft_agents.builder.TurnContext`
398
+ :type turn_context: :class:`microsoft_agents.activity.TurnContextProtocol`
399
399
  :returns: A task that represents the work queued to execute
400
400
  """
401
401
  if turn_context.activity.action in ("add", "add-upgrade"):
@@ -412,7 +412,7 @@ class ActivityHandler(Agent):
412
412
  ActivityTypes.InstallationUpdate activities with 'action' set to 'add'.
413
413
 
414
414
  :param turn_context: The context object for this turn
415
- :type turn_context: :class:`microsoft_agents.builder.TurnContext`
415
+ :type turn_context: :class:`microsoft_agents.activity.TurnContextProtocol`
416
416
  :returns: A task that represents the work queued to execute
417
417
  """
418
418
  return
@@ -425,7 +425,7 @@ class ActivityHandler(Agent):
425
425
  ActivityTypes.InstallationUpdate activities with 'action' set to 'remove'.
426
426
 
427
427
  :param turn_context: The context object for this turn
428
- :type turn_context: :class:`microsoft_agents.builder.TurnContext`
428
+ :type turn_context: :class:`microsoft_agents.activity.TurnContextProtocol`
429
429
  :returns: A task that represents the work queued to execute
430
430
  """
431
431
  return
@@ -439,7 +439,7 @@ class ActivityHandler(Agent):
439
439
  If overridden, this method could potentially respond to any of the other activity types.
440
440
 
441
441
  :param turn_context: The context object for this turn
442
- :type turn_context: :class:`microsoft_agents.builder.TurnContext`
442
+ :type turn_context: :class:`microsoft_agents.activity.TurnContextProtocol`
443
443
 
444
444
  :returns: A task that represents the work queued to execute
445
445
 
@@ -456,9 +456,10 @@ class ActivityHandler(Agent):
456
456
  Registers an activity event handler for the _invoke_ event, emitted for every incoming event activity.
457
457
 
458
458
  :param turn_context: The context object for this turn
459
- :type turn_context: :class:`microsoft_agents.builder.TurnContext`
459
+ :type turn_context: :class:`microsoft_agents.activity.TurnContextProtocol`
460
460
 
461
461
  :returns: A task that represents the work queued to execute
462
+ :rtype: Optional[:class:`microsoft_agents.activity.InvokeResponse`]
462
463
  """
463
464
  try:
464
465
  if (
@@ -492,7 +493,7 @@ class ActivityHandler(Agent):
492
493
  By default, this method does nothing.
493
494
 
494
495
  :param turn_context: The context object for this turn
495
- :type turn_context: :class:`microsoft_agents.builder.TurnContext`
496
+ :type turn_context: :class:`microsoft_agents.activity.TurnContextProtocol`
496
497
 
497
498
  :returns: A task that represents the work queued to execute
498
499
  """
@@ -508,10 +509,11 @@ class ActivityHandler(Agent):
508
509
  calls this method.
509
510
 
510
511
  :param turn_context: A context object for this turn.
511
- :type turn_context: :class:`microsoft_agents.builder.TurnContext`
512
+ :type turn_context: :class:`microsoft_agents.activity.TurnContextProtocol`
512
513
  :param invoke_value: A string-typed object from the incoming activity's value.
513
- :type invoke_value: :class:`microsoft_agents.activity.adaptive_card_invoke_value.AdaptiveCardInvokeValue`
514
+ :type invoke_value: :class:`microsoft_agents.activity.AdaptiveCardInvokeValue`
514
515
  :return: The HealthCheckResponse object
516
+ :rtype: :class:`microsoft_agents.activity.AdaptiveCardInvokeResponse`
515
517
  """
516
518
  raise _InvokeResponseException(HTTPStatus.NOT_IMPLEMENTED)
517
519
 
@@ -83,8 +83,16 @@ class AgentApplication(Agent, Generic[StateT]):
83
83
  ) -> None:
84
84
  """
85
85
  Creates a new AgentApplication instance.
86
+
87
+ :param options: Configuration options for the application.
88
+ :type options: Optional[:class:`microsoft_agents.hosting.core.app.app_options.ApplicationOptions`]
89
+ :param connection_manager: OAuth connection manager.
90
+ :type connection_manager: Optional[:class:`microsoft_agents.hosting.core.authorization.Connections`]
91
+ :param authorization: Authorization manager for handling authentication flows.
92
+ :type authorization: Optional[:class:`microsoft_agents.hosting.core.app.oauth.Authorization`]
93
+ :param kwargs: Additional configuration parameters.
94
+ :type kwargs: Any
86
95
  """
87
- self.typing = TypingIndicator()
88
96
  self._route_list = _RouteList[StateT]()
89
97
 
90
98
  configuration = kwargs
@@ -161,6 +169,10 @@ class AgentApplication(Agent, Generic[StateT]):
161
169
  def adapter(self) -> ChannelServiceAdapter:
162
170
  """
163
171
  The bot's adapter.
172
+
173
+ :return: The channel service adapter for the bot.
174
+ :rtype: :class:`microsoft_agents.hosting.core.channel_service_adapter.ChannelServiceAdapter`
175
+ :raises ApplicationError: If the adapter is not configured.
164
176
  """
165
177
 
166
178
  if not self._adapter:
@@ -181,6 +193,10 @@ class AgentApplication(Agent, Generic[StateT]):
181
193
  def auth(self) -> Authorization:
182
194
  """
183
195
  The application's authentication manager
196
+
197
+ :return: The authentication manager for handling OAuth flows.
198
+ :rtype: :class:`microsoft_agents.hosting.core.app.oauth.Authorization`
199
+ :raises ApplicationError: If authentication is not configured.
184
200
  """
185
201
  if not self._auth:
186
202
  logger.error(
@@ -200,6 +216,9 @@ class AgentApplication(Agent, Generic[StateT]):
200
216
  def options(self) -> ApplicationOptions:
201
217
  """
202
218
  The application's configured options.
219
+
220
+ :return: The configuration options for the application.
221
+ :rtype: :class:`microsoft_agents.hosting.core.app.app_options.ApplicationOptions`
203
222
  """
204
223
  return self._options
205
224
 
@@ -217,18 +236,18 @@ class AgentApplication(Agent, Generic[StateT]):
217
236
  Routes are ordered by: is_agentic, is_invoke, rank (lower is higher priority), in that order.
218
237
 
219
238
  :param selector: A function that takes a TurnContext and returns a boolean indicating whether the route should be selected.
220
- :type selector: RouteSelector
239
+ :type selector: :class:`microsoft_agents.hosting.core.app._type_defs.RouteSelector`
221
240
  :param handler: A function that takes a TurnContext and a TurnState and returns an Awaitable.
222
- :type handler: RouteHandler[StateT]
241
+ :type handler: :class:`microsoft_agents.hosting.core.app._type_defs.RouteHandler`[StateT]
223
242
  :param is_invoke: Whether the route is for an invoke activity, defaults to False
224
- :type is_invoke: bool, optional
243
+ :type is_invoke: bool, Optional
225
244
  :param is_agentic: Whether the route is for an agentic request, defaults to False. For agentic requests
226
245
  the selector will include a new check for `context.activity.is_agentic_request()`.
227
- :type is_agentic: bool, optional
246
+ :type is_agentic: bool, Optional
228
247
  :param rank: The rank of the route, defaults to RouteRank.DEFAULT
229
- :type rank: RouteRank, optional
248
+ :type rank: :class:`microsoft_agents.hosting.core.app._routes.RouteRank`, Optional
230
249
  :param auth_handlers: A list of authentication handler IDs to use for this route, defaults to None
231
- :type auth_handlers: Optional[list[str]], optional
250
+ :type auth_handlers: Optional[list[str]], Optional
232
251
  :raises ApplicationError: If the selector or handler are not valid.
233
252
  """
234
253
  if not selector or not handler:
@@ -639,9 +658,12 @@ class AgentApplication(Agent, Generic[StateT]):
639
658
  await self._start_long_running_call(context, self._on_turn)
640
659
 
641
660
  async def _on_turn(self, context: TurnContext):
661
+ typing = None
642
662
  try:
643
663
  if context.activity.type != ActivityTypes.typing:
644
- await self._start_typing(context)
664
+ if self._options.start_typing_timer:
665
+ typing = TypingIndicator()
666
+ await typing.start(context)
645
667
 
646
668
  self._remove_mentions(context)
647
669
 
@@ -689,11 +711,8 @@ class AgentApplication(Agent, Generic[StateT]):
689
711
  )
690
712
  await self._on_error(context, err)
691
713
  finally:
692
- self.typing.stop()
693
-
694
- async def _start_typing(self, context: TurnContext):
695
- if self._options.start_typing_timer:
696
- await self.typing.start(context)
714
+ if typing:
715
+ await typing.stop()
697
716
 
698
717
  def _remove_mentions(self, context: TurnContext):
699
718
  if (
@@ -706,6 +725,11 @@ class AgentApplication(Agent, Generic[StateT]):
706
725
  def parse_env_vars_configuration(vars: dict[str, Any]) -> dict:
707
726
  """
708
727
  Parses environment variables and returns a dictionary with the relevant configuration.
728
+
729
+ :param vars: Dictionary of environment variable names and values.
730
+ :type vars: dict[str, Any]
731
+ :return: Parsed configuration dictionary with nested structure.
732
+ :rtype: dict
709
733
  """
710
734
  result = {}
711
735
  for key, value in vars.items():
@@ -0,0 +1,49 @@
1
+ """
2
+ Copyright (c) Microsoft Corporation. All rights reserved.
3
+ Licensed under the MIT License.
4
+ """
5
+
6
+ from __future__ import annotations
7
+
8
+ from abc import ABC, abstractmethod
9
+ from dataclasses import dataclass
10
+ from typing import List, Optional
11
+
12
+ from microsoft_agents.hosting.core import TurnContext
13
+
14
+
15
+ @dataclass
16
+ class InputFile:
17
+ """A file sent by the user to the bot.
18
+
19
+ :param content: The downloaded content of the file.
20
+ :type content: bytes
21
+ :param content_type: The content type of the file.
22
+ :type content_type: str
23
+ :param content_url: Optional. URL to the content of the file.
24
+ :type content_url: Optional[str]
25
+ """
26
+
27
+ content: bytes
28
+ content_type: str
29
+ content_url: Optional[str]
30
+
31
+
32
+ class InputFileDownloader(ABC):
33
+ """
34
+ Abstract base class for a plugin responsible for downloading files provided by the user.
35
+
36
+ Implementations should download any files referenced by the incoming activity and return a
37
+ list of :class:`InputFile` instances representing the downloaded content.
38
+ """
39
+
40
+ @abstractmethod
41
+ async def download_files(self, context: TurnContext) -> List[InputFile]:
42
+ """
43
+ Download any files referenced by the incoming activity for the current turn.
44
+
45
+ :param context: The turn context for the current request.
46
+ :type context: :class:`microsoft_agents.hosting.core.turn_context.TurnContext`
47
+ :return: A list of downloaded :class:`InputFile` objects.
48
+ :rtype: list[:class:`microsoft_agents.hosting.core.app.input_file.InputFile`]
49
+ """