microsoft-agents-activity 1.1.0.dev8__tar.gz → 1.2.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 (223) hide show
  1. {microsoft_agents_activity-1.1.0.dev8 → microsoft_agents_activity-1.2.0}/PKG-INFO +29 -1
  2. microsoft_agents_activity-1.2.0/VERSION.txt +1 -0
  3. {microsoft_agents_activity-1.1.0.dev8 → microsoft_agents_activity-1.2.0}/microsoft_agents/activity/__init__.py +4 -0
  4. {microsoft_agents_activity-1.1.0.dev8 → microsoft_agents_activity-1.2.0}/microsoft_agents/activity/activity.py +150 -96
  5. {microsoft_agents_activity-1.1.0.dev8 → microsoft_agents_activity-1.2.0}/microsoft_agents/activity/channel_adapter_protocol.py +4 -4
  6. microsoft_agents_activity-1.2.0/microsoft_agents/activity/config/_coercion.py +99 -0
  7. {microsoft_agents_activity-1.1.0.dev8 → microsoft_agents_activity-1.2.0}/microsoft_agents/activity/config/_configure_logging.py +40 -3
  8. {microsoft_agents_activity-1.1.0.dev8 → microsoft_agents_activity-1.2.0}/microsoft_agents/activity/conversation_reference.py +2 -6
  9. {microsoft_agents_activity-1.1.0.dev8 → microsoft_agents_activity-1.2.0}/microsoft_agents/activity/entity/__init__.py +3 -0
  10. microsoft_agents_activity-1.2.0/microsoft_agents/activity/entity/activity_treatment.py +27 -0
  11. {microsoft_agents_activity-1.1.0.dev8 → microsoft_agents_activity-1.2.0}/microsoft_agents/activity/entity/ai_entity.py +4 -4
  12. {microsoft_agents_activity-1.1.0.dev8 → microsoft_agents_activity-1.2.0}/microsoft_agents/activity/entity/entity_types.py +1 -0
  13. {microsoft_agents_activity-1.1.0.dev8 → microsoft_agents_activity-1.2.0}/microsoft_agents/activity/teams/conversation_list.py +2 -3
  14. {microsoft_agents_activity-1.1.0.dev8 → microsoft_agents_activity-1.2.0}/microsoft_agents/activity/teams/meeting_notification_channel_data.py +1 -2
  15. {microsoft_agents_activity-1.1.0.dev8 → microsoft_agents_activity-1.2.0}/microsoft_agents/activity/teams/meeting_notification_response.py +1 -2
  16. {microsoft_agents_activity-1.1.0.dev8 → microsoft_agents_activity-1.2.0}/microsoft_agents/activity/teams/meeting_participants_event_details.py +1 -2
  17. {microsoft_agents_activity-1.1.0.dev8 → microsoft_agents_activity-1.2.0}/microsoft_agents/activity/teams/message_actions_payload.py +7 -7
  18. {microsoft_agents_activity-1.1.0.dev8 → microsoft_agents_activity-1.2.0}/microsoft_agents/activity/teams/messaging_extension_action.py +2 -3
  19. {microsoft_agents_activity-1.1.0.dev8 → microsoft_agents_activity-1.2.0}/microsoft_agents/activity/teams/messaging_extension_query.py +3 -3
  20. {microsoft_agents_activity-1.1.0.dev8 → microsoft_agents_activity-1.2.0}/microsoft_agents/activity/teams/messaging_extension_result.py +3 -3
  21. {microsoft_agents_activity-1.1.0.dev8 → microsoft_agents_activity-1.2.0}/microsoft_agents/activity/teams/messaging_extension_suggested_action.py +2 -3
  22. {microsoft_agents_activity-1.1.0.dev8 → microsoft_agents_activity-1.2.0}/microsoft_agents/activity/teams/o365_connector_card.py +5 -5
  23. {microsoft_agents_activity-1.1.0.dev8 → microsoft_agents_activity-1.2.0}/microsoft_agents/activity/teams/o365_connector_card_action_card.py +4 -5
  24. {microsoft_agents_activity-1.1.0.dev8 → microsoft_agents_activity-1.2.0}/microsoft_agents/activity/teams/o365_connector_card_multichoice_input.py +2 -2
  25. {microsoft_agents_activity-1.1.0.dev8 → microsoft_agents_activity-1.2.0}/microsoft_agents/activity/teams/o365_connector_card_open_uri.py +2 -3
  26. {microsoft_agents_activity-1.1.0.dev8 → microsoft_agents_activity-1.2.0}/microsoft_agents/activity/teams/o365_connector_card_section.py +7 -7
  27. {microsoft_agents_activity-1.1.0.dev8 → microsoft_agents_activity-1.2.0}/microsoft_agents/activity/teams/tab_response_cards.py +1 -2
  28. {microsoft_agents_activity-1.1.0.dev8 → microsoft_agents_activity-1.2.0}/microsoft_agents/activity/teams/tab_suggested_actions.py +1 -3
  29. {microsoft_agents_activity-1.1.0.dev8 → microsoft_agents_activity-1.2.0}/microsoft_agents/activity/teams/targeted_meeting_notification_value.py +3 -4
  30. {microsoft_agents_activity-1.1.0.dev8 → microsoft_agents_activity-1.2.0}/microsoft_agents/activity/teams/teams_channel_account.py +7 -1
  31. {microsoft_agents_activity-1.1.0.dev8 → microsoft_agents_activity-1.2.0}/microsoft_agents/activity/teams/teams_channel_data.py +2 -3
  32. {microsoft_agents_activity-1.1.0.dev8 → microsoft_agents_activity-1.2.0}/microsoft_agents/activity/teams/teams_paged_members_result.py +1 -2
  33. {microsoft_agents_activity-1.1.0.dev8 → microsoft_agents_activity-1.2.0}/microsoft_agents/activity/token_exchange_state.py +2 -2
  34. {microsoft_agents_activity-1.1.0.dev8 → microsoft_agents_activity-1.2.0}/microsoft_agents/activity/turn_context_protocol.py +8 -4
  35. {microsoft_agents_activity-1.1.0.dev8 → microsoft_agents_activity-1.2.0}/microsoft_agents_activity.egg-info/PKG-INFO +29 -1
  36. {microsoft_agents_activity-1.1.0.dev8 → microsoft_agents_activity-1.2.0}/microsoft_agents_activity.egg-info/SOURCES.txt +2 -0
  37. {microsoft_agents_activity-1.1.0.dev8 → microsoft_agents_activity-1.2.0}/readme.md +28 -0
  38. microsoft_agents_activity-1.1.0.dev8/VERSION.txt +0 -1
  39. {microsoft_agents_activity-1.1.0.dev8 → microsoft_agents_activity-1.2.0}/LICENSE +0 -0
  40. {microsoft_agents_activity-1.1.0.dev8 → microsoft_agents_activity-1.2.0}/MANIFEST.in +0 -0
  41. {microsoft_agents_activity-1.1.0.dev8 → microsoft_agents_activity-1.2.0}/microsoft_agents/activity/_channel_id_field_mixin.py +0 -0
  42. {microsoft_agents_activity-1.1.0.dev8 → microsoft_agents_activity-1.2.0}/microsoft_agents/activity/_model_utils.py +0 -0
  43. {microsoft_agents_activity-1.1.0.dev8 → microsoft_agents_activity-1.2.0}/microsoft_agents/activity/_type_aliases.py +0 -0
  44. {microsoft_agents_activity-1.1.0.dev8 → microsoft_agents_activity-1.2.0}/microsoft_agents/activity/_utils/__init__.py +0 -0
  45. {microsoft_agents_activity-1.1.0.dev8 → microsoft_agents_activity-1.2.0}/microsoft_agents/activity/_utils/_deferred_string.py +0 -0
  46. {microsoft_agents_activity-1.1.0.dev8 → microsoft_agents_activity-1.2.0}/microsoft_agents/activity/action_types.py +0 -0
  47. {microsoft_agents_activity-1.1.0.dev8 → microsoft_agents_activity-1.2.0}/microsoft_agents/activity/activity_event_names.py +0 -0
  48. {microsoft_agents_activity-1.1.0.dev8 → microsoft_agents_activity-1.2.0}/microsoft_agents/activity/activity_importance.py +0 -0
  49. {microsoft_agents_activity-1.1.0.dev8 → microsoft_agents_activity-1.2.0}/microsoft_agents/activity/activity_types.py +0 -0
  50. {microsoft_agents_activity-1.1.0.dev8 → microsoft_agents_activity-1.2.0}/microsoft_agents/activity/adaptive_card_invoke_action.py +0 -0
  51. {microsoft_agents_activity-1.1.0.dev8 → microsoft_agents_activity-1.2.0}/microsoft_agents/activity/adaptive_card_invoke_response.py +0 -0
  52. {microsoft_agents_activity-1.1.0.dev8 → microsoft_agents_activity-1.2.0}/microsoft_agents/activity/adaptive_card_invoke_value.py +0 -0
  53. {microsoft_agents_activity-1.1.0.dev8 → microsoft_agents_activity-1.2.0}/microsoft_agents/activity/agents_model.py +0 -0
  54. {microsoft_agents_activity-1.1.0.dev8 → microsoft_agents_activity-1.2.0}/microsoft_agents/activity/animation_card.py +0 -0
  55. {microsoft_agents_activity-1.1.0.dev8 → microsoft_agents_activity-1.2.0}/microsoft_agents/activity/attachment.py +0 -0
  56. {microsoft_agents_activity-1.1.0.dev8 → microsoft_agents_activity-1.2.0}/microsoft_agents/activity/attachment_data.py +0 -0
  57. {microsoft_agents_activity-1.1.0.dev8 → microsoft_agents_activity-1.2.0}/microsoft_agents/activity/attachment_info.py +0 -0
  58. {microsoft_agents_activity-1.1.0.dev8 → microsoft_agents_activity-1.2.0}/microsoft_agents/activity/attachment_layout_types.py +0 -0
  59. {microsoft_agents_activity-1.1.0.dev8 → microsoft_agents_activity-1.2.0}/microsoft_agents/activity/attachment_view.py +0 -0
  60. {microsoft_agents_activity-1.1.0.dev8 → microsoft_agents_activity-1.2.0}/microsoft_agents/activity/audio_card.py +0 -0
  61. {microsoft_agents_activity-1.1.0.dev8 → microsoft_agents_activity-1.2.0}/microsoft_agents/activity/basic_card.py +0 -0
  62. {microsoft_agents_activity-1.1.0.dev8 → microsoft_agents_activity-1.2.0}/microsoft_agents/activity/caller_id_constants.py +0 -0
  63. {microsoft_agents_activity-1.1.0.dev8 → microsoft_agents_activity-1.2.0}/microsoft_agents/activity/card_action.py +0 -0
  64. {microsoft_agents_activity-1.1.0.dev8 → microsoft_agents_activity-1.2.0}/microsoft_agents/activity/card_image.py +0 -0
  65. {microsoft_agents_activity-1.1.0.dev8 → microsoft_agents_activity-1.2.0}/microsoft_agents/activity/channel_account.py +0 -0
  66. {microsoft_agents_activity-1.1.0.dev8 → microsoft_agents_activity-1.2.0}/microsoft_agents/activity/channel_id.py +0 -0
  67. {microsoft_agents_activity-1.1.0.dev8 → microsoft_agents_activity-1.2.0}/microsoft_agents/activity/channels.py +0 -0
  68. {microsoft_agents_activity-1.1.0.dev8 → microsoft_agents_activity-1.2.0}/microsoft_agents/activity/config/__init__.py +0 -0
  69. {microsoft_agents_activity-1.1.0.dev8 → microsoft_agents_activity-1.2.0}/microsoft_agents/activity/config/_load_configuration.py +0 -0
  70. {microsoft_agents_activity-1.1.0.dev8 → microsoft_agents_activity-1.2.0}/microsoft_agents/activity/contact_relation_update_action_types.py +0 -0
  71. {microsoft_agents_activity-1.1.0.dev8 → microsoft_agents_activity-1.2.0}/microsoft_agents/activity/conversation_account.py +0 -0
  72. {microsoft_agents_activity-1.1.0.dev8 → microsoft_agents_activity-1.2.0}/microsoft_agents/activity/conversation_members.py +0 -0
  73. {microsoft_agents_activity-1.1.0.dev8 → microsoft_agents_activity-1.2.0}/microsoft_agents/activity/conversation_parameters.py +0 -0
  74. {microsoft_agents_activity-1.1.0.dev8 → microsoft_agents_activity-1.2.0}/microsoft_agents/activity/conversation_resource_response.py +0 -0
  75. {microsoft_agents_activity-1.1.0.dev8 → microsoft_agents_activity-1.2.0}/microsoft_agents/activity/conversation_update_types.py +0 -0
  76. {microsoft_agents_activity-1.1.0.dev8 → microsoft_agents_activity-1.2.0}/microsoft_agents/activity/conversations_result.py +0 -0
  77. {microsoft_agents_activity-1.1.0.dev8 → microsoft_agents_activity-1.2.0}/microsoft_agents/activity/delivery_modes.py +0 -0
  78. {microsoft_agents_activity-1.1.0.dev8 → microsoft_agents_activity-1.2.0}/microsoft_agents/activity/end_of_conversation_codes.py +0 -0
  79. {microsoft_agents_activity-1.1.0.dev8 → microsoft_agents_activity-1.2.0}/microsoft_agents/activity/entity/_schema_mixin.py +0 -0
  80. {microsoft_agents_activity-1.1.0.dev8 → microsoft_agents_activity-1.2.0}/microsoft_agents/activity/entity/entity.py +0 -0
  81. {microsoft_agents_activity-1.1.0.dev8 → microsoft_agents_activity-1.2.0}/microsoft_agents/activity/entity/geo_coordinates.py +0 -0
  82. {microsoft_agents_activity-1.1.0.dev8 → microsoft_agents_activity-1.2.0}/microsoft_agents/activity/entity/mention.py +0 -0
  83. {microsoft_agents_activity-1.1.0.dev8 → microsoft_agents_activity-1.2.0}/microsoft_agents/activity/entity/place.py +0 -0
  84. {microsoft_agents_activity-1.1.0.dev8 → microsoft_agents_activity-1.2.0}/microsoft_agents/activity/entity/product_info.py +0 -0
  85. {microsoft_agents_activity-1.1.0.dev8 → microsoft_agents_activity-1.2.0}/microsoft_agents/activity/entity/stream_info.py +0 -0
  86. {microsoft_agents_activity-1.1.0.dev8 → microsoft_agents_activity-1.2.0}/microsoft_agents/activity/entity/thing.py +0 -0
  87. {microsoft_agents_activity-1.1.0.dev8 → microsoft_agents_activity-1.2.0}/microsoft_agents/activity/error.py +0 -0
  88. {microsoft_agents_activity-1.1.0.dev8 → microsoft_agents_activity-1.2.0}/microsoft_agents/activity/error_response.py +0 -0
  89. {microsoft_agents_activity-1.1.0.dev8 → microsoft_agents_activity-1.2.0}/microsoft_agents/activity/errors/__init__.py +0 -0
  90. {microsoft_agents_activity-1.1.0.dev8 → microsoft_agents_activity-1.2.0}/microsoft_agents/activity/errors/error_message.py +0 -0
  91. {microsoft_agents_activity-1.1.0.dev8 → microsoft_agents_activity-1.2.0}/microsoft_agents/activity/errors/error_resources.py +0 -0
  92. {microsoft_agents_activity-1.1.0.dev8 → microsoft_agents_activity-1.2.0}/microsoft_agents/activity/expected_replies.py +0 -0
  93. {microsoft_agents_activity-1.1.0.dev8 → microsoft_agents_activity-1.2.0}/microsoft_agents/activity/fact.py +0 -0
  94. {microsoft_agents_activity-1.1.0.dev8 → microsoft_agents_activity-1.2.0}/microsoft_agents/activity/hero_card.py +0 -0
  95. {microsoft_agents_activity-1.1.0.dev8 → microsoft_agents_activity-1.2.0}/microsoft_agents/activity/inner_http_error.py +0 -0
  96. {microsoft_agents_activity-1.1.0.dev8 → microsoft_agents_activity-1.2.0}/microsoft_agents/activity/input_hints.py +0 -0
  97. {microsoft_agents_activity-1.1.0.dev8 → microsoft_agents_activity-1.2.0}/microsoft_agents/activity/installation_update_action_types.py +0 -0
  98. {microsoft_agents_activity-1.1.0.dev8 → microsoft_agents_activity-1.2.0}/microsoft_agents/activity/invoke_response.py +0 -0
  99. {microsoft_agents_activity-1.1.0.dev8 → microsoft_agents_activity-1.2.0}/microsoft_agents/activity/media_card.py +0 -0
  100. {microsoft_agents_activity-1.1.0.dev8 → microsoft_agents_activity-1.2.0}/microsoft_agents/activity/media_event_value.py +0 -0
  101. {microsoft_agents_activity-1.1.0.dev8 → microsoft_agents_activity-1.2.0}/microsoft_agents/activity/media_url.py +0 -0
  102. {microsoft_agents_activity-1.1.0.dev8 → microsoft_agents_activity-1.2.0}/microsoft_agents/activity/message_reaction.py +0 -0
  103. {microsoft_agents_activity-1.1.0.dev8 → microsoft_agents_activity-1.2.0}/microsoft_agents/activity/message_reaction_types.py +0 -0
  104. {microsoft_agents_activity-1.1.0.dev8 → microsoft_agents_activity-1.2.0}/microsoft_agents/activity/message_update_types.py +0 -0
  105. {microsoft_agents_activity-1.1.0.dev8 → microsoft_agents_activity-1.2.0}/microsoft_agents/activity/oauth_card.py +0 -0
  106. {microsoft_agents_activity-1.1.0.dev8 → microsoft_agents_activity-1.2.0}/microsoft_agents/activity/paged_members_result.py +0 -0
  107. {microsoft_agents_activity-1.1.0.dev8 → microsoft_agents_activity-1.2.0}/microsoft_agents/activity/receipt_card.py +0 -0
  108. {microsoft_agents_activity-1.1.0.dev8 → microsoft_agents_activity-1.2.0}/microsoft_agents/activity/receipt_item.py +0 -0
  109. {microsoft_agents_activity-1.1.0.dev8 → microsoft_agents_activity-1.2.0}/microsoft_agents/activity/resource_response.py +0 -0
  110. {microsoft_agents_activity-1.1.0.dev8 → microsoft_agents_activity-1.2.0}/microsoft_agents/activity/role_types.py +0 -0
  111. {microsoft_agents_activity-1.1.0.dev8 → microsoft_agents_activity-1.2.0}/microsoft_agents/activity/semantic_action.py +0 -0
  112. {microsoft_agents_activity-1.1.0.dev8 → microsoft_agents_activity-1.2.0}/microsoft_agents/activity/semantic_actions_states.py +0 -0
  113. {microsoft_agents_activity-1.1.0.dev8 → microsoft_agents_activity-1.2.0}/microsoft_agents/activity/sign_in_constants.py +0 -0
  114. {microsoft_agents_activity-1.1.0.dev8 → microsoft_agents_activity-1.2.0}/microsoft_agents/activity/sign_in_resource.py +0 -0
  115. {microsoft_agents_activity-1.1.0.dev8 → microsoft_agents_activity-1.2.0}/microsoft_agents/activity/signin_card.py +0 -0
  116. {microsoft_agents_activity-1.1.0.dev8 → microsoft_agents_activity-1.2.0}/microsoft_agents/activity/suggested_actions.py +0 -0
  117. {microsoft_agents_activity-1.1.0.dev8 → microsoft_agents_activity-1.2.0}/microsoft_agents/activity/teams/__init__.py +0 -0
  118. {microsoft_agents_activity-1.1.0.dev8 → microsoft_agents_activity-1.2.0}/microsoft_agents/activity/teams/app_based_link_query.py +0 -0
  119. {microsoft_agents_activity-1.1.0.dev8 → microsoft_agents_activity-1.2.0}/microsoft_agents/activity/teams/batch_failed_entries_response.py +0 -0
  120. {microsoft_agents_activity-1.1.0.dev8 → microsoft_agents_activity-1.2.0}/microsoft_agents/activity/teams/batch_failed_entry.py +0 -0
  121. {microsoft_agents_activity-1.1.0.dev8 → microsoft_agents_activity-1.2.0}/microsoft_agents/activity/teams/batch_operation_response.py +0 -0
  122. {microsoft_agents_activity-1.1.0.dev8 → microsoft_agents_activity-1.2.0}/microsoft_agents/activity/teams/batch_operation_state_response.py +0 -0
  123. {microsoft_agents_activity-1.1.0.dev8 → microsoft_agents_activity-1.2.0}/microsoft_agents/activity/teams/bot_config_auth.py +0 -0
  124. {microsoft_agents_activity-1.1.0.dev8 → microsoft_agents_activity-1.2.0}/microsoft_agents/activity/teams/cache_info.py +0 -0
  125. {microsoft_agents_activity-1.1.0.dev8 → microsoft_agents_activity-1.2.0}/microsoft_agents/activity/teams/cancel_operation_response.py +0 -0
  126. {microsoft_agents_activity-1.1.0.dev8 → microsoft_agents_activity-1.2.0}/microsoft_agents/activity/teams/channel_info.py +0 -0
  127. {microsoft_agents_activity-1.1.0.dev8 → microsoft_agents_activity-1.2.0}/microsoft_agents/activity/teams/config_auth_response.py +0 -0
  128. {microsoft_agents_activity-1.1.0.dev8 → microsoft_agents_activity-1.2.0}/microsoft_agents/activity/teams/config_response.py +0 -0
  129. {microsoft_agents_activity-1.1.0.dev8 → microsoft_agents_activity-1.2.0}/microsoft_agents/activity/teams/config_response_base.py +0 -0
  130. {microsoft_agents_activity-1.1.0.dev8 → microsoft_agents_activity-1.2.0}/microsoft_agents/activity/teams/config_task_response.py +0 -0
  131. {microsoft_agents_activity-1.1.0.dev8 → microsoft_agents_activity-1.2.0}/microsoft_agents/activity/teams/file_consent_card.py +0 -0
  132. {microsoft_agents_activity-1.1.0.dev8 → microsoft_agents_activity-1.2.0}/microsoft_agents/activity/teams/file_consent_card_response.py +0 -0
  133. {microsoft_agents_activity-1.1.0.dev8 → microsoft_agents_activity-1.2.0}/microsoft_agents/activity/teams/file_download_info.py +0 -0
  134. {microsoft_agents_activity-1.1.0.dev8 → microsoft_agents_activity-1.2.0}/microsoft_agents/activity/teams/file_info_card.py +0 -0
  135. {microsoft_agents_activity-1.1.0.dev8 → microsoft_agents_activity-1.2.0}/microsoft_agents/activity/teams/file_upload_info.py +0 -0
  136. {microsoft_agents_activity-1.1.0.dev8 → microsoft_agents_activity-1.2.0}/microsoft_agents/activity/teams/meeting_details.py +0 -0
  137. {microsoft_agents_activity-1.1.0.dev8 → microsoft_agents_activity-1.2.0}/microsoft_agents/activity/teams/meeting_details_base.py +0 -0
  138. {microsoft_agents_activity-1.1.0.dev8 → microsoft_agents_activity-1.2.0}/microsoft_agents/activity/teams/meeting_end_event_details.py +0 -0
  139. {microsoft_agents_activity-1.1.0.dev8 → microsoft_agents_activity-1.2.0}/microsoft_agents/activity/teams/meeting_event_details.py +0 -0
  140. {microsoft_agents_activity-1.1.0.dev8 → microsoft_agents_activity-1.2.0}/microsoft_agents/activity/teams/meeting_info.py +0 -0
  141. {microsoft_agents_activity-1.1.0.dev8 → microsoft_agents_activity-1.2.0}/microsoft_agents/activity/teams/meeting_notification.py +0 -0
  142. {microsoft_agents_activity-1.1.0.dev8 → microsoft_agents_activity-1.2.0}/microsoft_agents/activity/teams/meeting_notification_base.py +0 -0
  143. {microsoft_agents_activity-1.1.0.dev8 → microsoft_agents_activity-1.2.0}/microsoft_agents/activity/teams/meeting_notification_recipient_failure_info.py +0 -0
  144. {microsoft_agents_activity-1.1.0.dev8 → microsoft_agents_activity-1.2.0}/microsoft_agents/activity/teams/meeting_participant_info.py +0 -0
  145. {microsoft_agents_activity-1.1.0.dev8 → microsoft_agents_activity-1.2.0}/microsoft_agents/activity/teams/meeting_stage_surface.py +0 -0
  146. {microsoft_agents_activity-1.1.0.dev8 → microsoft_agents_activity-1.2.0}/microsoft_agents/activity/teams/meeting_start_event_details.py +0 -0
  147. {microsoft_agents_activity-1.1.0.dev8 → microsoft_agents_activity-1.2.0}/microsoft_agents/activity/teams/meeting_tab_icon_surface.py +0 -0
  148. {microsoft_agents_activity-1.1.0.dev8 → microsoft_agents_activity-1.2.0}/microsoft_agents/activity/teams/message_actions_payload_app.py +0 -0
  149. {microsoft_agents_activity-1.1.0.dev8 → microsoft_agents_activity-1.2.0}/microsoft_agents/activity/teams/message_actions_payload_attachment.py +0 -0
  150. {microsoft_agents_activity-1.1.0.dev8 → microsoft_agents_activity-1.2.0}/microsoft_agents/activity/teams/message_actions_payload_body.py +0 -0
  151. {microsoft_agents_activity-1.1.0.dev8 → microsoft_agents_activity-1.2.0}/microsoft_agents/activity/teams/message_actions_payload_conversation.py +0 -0
  152. {microsoft_agents_activity-1.1.0.dev8 → microsoft_agents_activity-1.2.0}/microsoft_agents/activity/teams/message_actions_payload_from.py +0 -0
  153. {microsoft_agents_activity-1.1.0.dev8 → microsoft_agents_activity-1.2.0}/microsoft_agents/activity/teams/message_actions_payload_mention.py +0 -0
  154. {microsoft_agents_activity-1.1.0.dev8 → microsoft_agents_activity-1.2.0}/microsoft_agents/activity/teams/message_actions_payload_reaction.py +0 -0
  155. {microsoft_agents_activity-1.1.0.dev8 → microsoft_agents_activity-1.2.0}/microsoft_agents/activity/teams/message_actions_payload_user.py +0 -0
  156. {microsoft_agents_activity-1.1.0.dev8 → microsoft_agents_activity-1.2.0}/microsoft_agents/activity/teams/messaging_extension_action_response.py +0 -0
  157. {microsoft_agents_activity-1.1.0.dev8 → microsoft_agents_activity-1.2.0}/microsoft_agents/activity/teams/messaging_extension_attachment.py +0 -0
  158. {microsoft_agents_activity-1.1.0.dev8 → microsoft_agents_activity-1.2.0}/microsoft_agents/activity/teams/messaging_extension_parameter.py +0 -0
  159. {microsoft_agents_activity-1.1.0.dev8 → microsoft_agents_activity-1.2.0}/microsoft_agents/activity/teams/messaging_extension_query_options.py +0 -0
  160. {microsoft_agents_activity-1.1.0.dev8 → microsoft_agents_activity-1.2.0}/microsoft_agents/activity/teams/messaging_extension_response.py +0 -0
  161. {microsoft_agents_activity-1.1.0.dev8 → microsoft_agents_activity-1.2.0}/microsoft_agents/activity/teams/notification_info.py +0 -0
  162. {microsoft_agents_activity-1.1.0.dev8 → microsoft_agents_activity-1.2.0}/microsoft_agents/activity/teams/o365_connector_card_action_base.py +0 -0
  163. {microsoft_agents_activity-1.1.0.dev8 → microsoft_agents_activity-1.2.0}/microsoft_agents/activity/teams/o365_connector_card_action_query.py +0 -0
  164. {microsoft_agents_activity-1.1.0.dev8 → microsoft_agents_activity-1.2.0}/microsoft_agents/activity/teams/o365_connector_card_date_input.py +0 -0
  165. {microsoft_agents_activity-1.1.0.dev8 → microsoft_agents_activity-1.2.0}/microsoft_agents/activity/teams/o365_connector_card_fact.py +0 -0
  166. {microsoft_agents_activity-1.1.0.dev8 → microsoft_agents_activity-1.2.0}/microsoft_agents/activity/teams/o365_connector_card_http_post.py +0 -0
  167. {microsoft_agents_activity-1.1.0.dev8 → microsoft_agents_activity-1.2.0}/microsoft_agents/activity/teams/o365_connector_card_image.py +0 -0
  168. {microsoft_agents_activity-1.1.0.dev8 → microsoft_agents_activity-1.2.0}/microsoft_agents/activity/teams/o365_connector_card_input_base.py +0 -0
  169. {microsoft_agents_activity-1.1.0.dev8 → microsoft_agents_activity-1.2.0}/microsoft_agents/activity/teams/o365_connector_card_multichoice_input_choice.py +0 -0
  170. {microsoft_agents_activity-1.1.0.dev8 → microsoft_agents_activity-1.2.0}/microsoft_agents/activity/teams/o365_connector_card_open_uri_target.py +0 -0
  171. {microsoft_agents_activity-1.1.0.dev8 → microsoft_agents_activity-1.2.0}/microsoft_agents/activity/teams/o365_connector_card_text_input.py +0 -0
  172. {microsoft_agents_activity-1.1.0.dev8 → microsoft_agents_activity-1.2.0}/microsoft_agents/activity/teams/o365_connector_card_view_action.py +0 -0
  173. {microsoft_agents_activity-1.1.0.dev8 → microsoft_agents_activity-1.2.0}/microsoft_agents/activity/teams/on_behalf_of.py +0 -0
  174. {microsoft_agents_activity-1.1.0.dev8 → microsoft_agents_activity-1.2.0}/microsoft_agents/activity/teams/read_receipt_info.py +0 -0
  175. {microsoft_agents_activity-1.1.0.dev8 → microsoft_agents_activity-1.2.0}/microsoft_agents/activity/teams/signin_state_verification_query.py +0 -0
  176. {microsoft_agents_activity-1.1.0.dev8 → microsoft_agents_activity-1.2.0}/microsoft_agents/activity/teams/surface.py +0 -0
  177. {microsoft_agents_activity-1.1.0.dev8 → microsoft_agents_activity-1.2.0}/microsoft_agents/activity/teams/tab_context.py +0 -0
  178. {microsoft_agents_activity-1.1.0.dev8 → microsoft_agents_activity-1.2.0}/microsoft_agents/activity/teams/tab_entity_context.py +0 -0
  179. {microsoft_agents_activity-1.1.0.dev8 → microsoft_agents_activity-1.2.0}/microsoft_agents/activity/teams/tab_request.py +0 -0
  180. {microsoft_agents_activity-1.1.0.dev8 → microsoft_agents_activity-1.2.0}/microsoft_agents/activity/teams/tab_response.py +0 -0
  181. {microsoft_agents_activity-1.1.0.dev8 → microsoft_agents_activity-1.2.0}/microsoft_agents/activity/teams/tab_response_card.py +0 -0
  182. {microsoft_agents_activity-1.1.0.dev8 → microsoft_agents_activity-1.2.0}/microsoft_agents/activity/teams/tab_response_payload.py +0 -0
  183. {microsoft_agents_activity-1.1.0.dev8 → microsoft_agents_activity-1.2.0}/microsoft_agents/activity/teams/tab_submit.py +0 -0
  184. {microsoft_agents_activity-1.1.0.dev8 → microsoft_agents_activity-1.2.0}/microsoft_agents/activity/teams/tab_submit_data.py +0 -0
  185. {microsoft_agents_activity-1.1.0.dev8 → microsoft_agents_activity-1.2.0}/microsoft_agents/activity/teams/targeted_meeting_notification.py +0 -0
  186. {microsoft_agents_activity-1.1.0.dev8 → microsoft_agents_activity-1.2.0}/microsoft_agents/activity/teams/task_module_card_response.py +0 -0
  187. {microsoft_agents_activity-1.1.0.dev8 → microsoft_agents_activity-1.2.0}/microsoft_agents/activity/teams/task_module_continue_response.py +0 -0
  188. {microsoft_agents_activity-1.1.0.dev8 → microsoft_agents_activity-1.2.0}/microsoft_agents/activity/teams/task_module_message_response.py +0 -0
  189. {microsoft_agents_activity-1.1.0.dev8 → microsoft_agents_activity-1.2.0}/microsoft_agents/activity/teams/task_module_request.py +0 -0
  190. {microsoft_agents_activity-1.1.0.dev8 → microsoft_agents_activity-1.2.0}/microsoft_agents/activity/teams/task_module_request_context.py +0 -0
  191. {microsoft_agents_activity-1.1.0.dev8 → microsoft_agents_activity-1.2.0}/microsoft_agents/activity/teams/task_module_response.py +0 -0
  192. {microsoft_agents_activity-1.1.0.dev8 → microsoft_agents_activity-1.2.0}/microsoft_agents/activity/teams/task_module_response_base.py +0 -0
  193. {microsoft_agents_activity-1.1.0.dev8 → microsoft_agents_activity-1.2.0}/microsoft_agents/activity/teams/task_module_task_info.py +0 -0
  194. {microsoft_agents_activity-1.1.0.dev8 → microsoft_agents_activity-1.2.0}/microsoft_agents/activity/teams/team_details.py +0 -0
  195. {microsoft_agents_activity-1.1.0.dev8 → microsoft_agents_activity-1.2.0}/microsoft_agents/activity/teams/team_info.py +0 -0
  196. {microsoft_agents_activity-1.1.0.dev8 → microsoft_agents_activity-1.2.0}/microsoft_agents/activity/teams/teams_batch_operation_response.py +0 -0
  197. {microsoft_agents_activity-1.1.0.dev8 → microsoft_agents_activity-1.2.0}/microsoft_agents/activity/teams/teams_channel_data_settings.py +0 -0
  198. {microsoft_agents_activity-1.1.0.dev8 → microsoft_agents_activity-1.2.0}/microsoft_agents/activity/teams/teams_meeting_info.py +0 -0
  199. {microsoft_agents_activity-1.1.0.dev8 → microsoft_agents_activity-1.2.0}/microsoft_agents/activity/teams/teams_meeting_member.py +0 -0
  200. {microsoft_agents_activity-1.1.0.dev8 → microsoft_agents_activity-1.2.0}/microsoft_agents/activity/teams/teams_meeting_participant.py +0 -0
  201. {microsoft_agents_activity-1.1.0.dev8 → microsoft_agents_activity-1.2.0}/microsoft_agents/activity/teams/teams_member.py +0 -0
  202. {microsoft_agents_activity-1.1.0.dev8 → microsoft_agents_activity-1.2.0}/microsoft_agents/activity/teams/tenant_info.py +0 -0
  203. {microsoft_agents_activity-1.1.0.dev8 → microsoft_agents_activity-1.2.0}/microsoft_agents/activity/teams/user_meeting_details.py +0 -0
  204. {microsoft_agents_activity-1.1.0.dev8 → microsoft_agents_activity-1.2.0}/microsoft_agents/activity/text_format_types.py +0 -0
  205. {microsoft_agents_activity-1.1.0.dev8 → microsoft_agents_activity-1.2.0}/microsoft_agents/activity/text_highlight.py +0 -0
  206. {microsoft_agents_activity-1.1.0.dev8 → microsoft_agents_activity-1.2.0}/microsoft_agents/activity/thumbnail_card.py +0 -0
  207. {microsoft_agents_activity-1.1.0.dev8 → microsoft_agents_activity-1.2.0}/microsoft_agents/activity/thumbnail_url.py +0 -0
  208. {microsoft_agents_activity-1.1.0.dev8 → microsoft_agents_activity-1.2.0}/microsoft_agents/activity/token_exchange_invoke_request.py +0 -0
  209. {microsoft_agents_activity-1.1.0.dev8 → microsoft_agents_activity-1.2.0}/microsoft_agents/activity/token_exchange_invoke_response.py +0 -0
  210. {microsoft_agents_activity-1.1.0.dev8 → microsoft_agents_activity-1.2.0}/microsoft_agents/activity/token_exchange_resource.py +0 -0
  211. {microsoft_agents_activity-1.1.0.dev8 → microsoft_agents_activity-1.2.0}/microsoft_agents/activity/token_or_sign_in_resource_response.py +0 -0
  212. {microsoft_agents_activity-1.1.0.dev8 → microsoft_agents_activity-1.2.0}/microsoft_agents/activity/token_post_resource.py +0 -0
  213. {microsoft_agents_activity-1.1.0.dev8 → microsoft_agents_activity-1.2.0}/microsoft_agents/activity/token_request.py +0 -0
  214. {microsoft_agents_activity-1.1.0.dev8 → microsoft_agents_activity-1.2.0}/microsoft_agents/activity/token_response.py +0 -0
  215. {microsoft_agents_activity-1.1.0.dev8 → microsoft_agents_activity-1.2.0}/microsoft_agents/activity/token_status.py +0 -0
  216. {microsoft_agents_activity-1.1.0.dev8 → microsoft_agents_activity-1.2.0}/microsoft_agents/activity/transcript.py +0 -0
  217. {microsoft_agents_activity-1.1.0.dev8 → microsoft_agents_activity-1.2.0}/microsoft_agents/activity/video_card.py +0 -0
  218. {microsoft_agents_activity-1.1.0.dev8 → microsoft_agents_activity-1.2.0}/microsoft_agents_activity.egg-info/dependency_links.txt +0 -0
  219. {microsoft_agents_activity-1.1.0.dev8 → microsoft_agents_activity-1.2.0}/microsoft_agents_activity.egg-info/requires.txt +0 -0
  220. {microsoft_agents_activity-1.1.0.dev8 → microsoft_agents_activity-1.2.0}/microsoft_agents_activity.egg-info/top_level.txt +0 -0
  221. {microsoft_agents_activity-1.1.0.dev8 → microsoft_agents_activity-1.2.0}/pyproject.toml +0 -0
  222. {microsoft_agents_activity-1.1.0.dev8 → microsoft_agents_activity-1.2.0}/setup.cfg +0 -0
  223. {microsoft_agents_activity-1.1.0.dev8 → microsoft_agents_activity-1.2.0}/setup.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: microsoft-agents-activity
3
- Version: 1.1.0.dev8
3
+ Version: 1.2.0
4
4
  Summary: A protocol library for Microsoft Agents
5
5
  Author: Microsoft Corporation
6
6
  License-Expression: MIT
@@ -35,6 +35,24 @@ This library is part of the **Microsoft 365 Agents SDK for Python** - a comprehe
35
35
  <th style="width:20%">Date</th>
36
36
  <th style="width:60%">Release Notes</th>
37
37
  </tr>
38
+ <tr>
39
+ <td>1.2.0</td>
40
+ <td>2026-07-17</td>
41
+ <td>
42
+ <a href="https://github.com/microsoft/Agents-for-python/blob/main/changelog.md#microsoft-365-agents-sdk-for-python---release-notes-v120">
43
+ 1.2.0 Release Notes
44
+ </a>
45
+ </td>
46
+ </tr>
47
+ <tr>
48
+ <td>1.1.0</td>
49
+ <td>2026-06-19</td>
50
+ <td>
51
+ <a href="https://github.com/microsoft/Agents-for-python/blob/main/changelog.md#microsoft-365-agents-sdk-for-python---release-notes-v110">
52
+ 1.1.0 Release Notes
53
+ </a>
54
+ </td>
55
+ </tr>
38
56
  <tr>
39
57
  <td>1.0.0</td>
40
58
  <td>2026-05-22</td>
@@ -44,6 +62,15 @@ This library is part of the **Microsoft 365 Agents SDK for Python** - a comprehe
44
62
  </a>
45
63
  </td>
46
64
  </tr>
65
+ <tr>
66
+ <td>0.9.1</td>
67
+ <td>2026-05-04</td>
68
+ <td>
69
+ <a href="https://github.com/microsoft/Agents-for-python/blob/main/changelog.md#microsoft-365-agents-sdk-for-python---release-notes-v091">
70
+ 0.9.1 Release Notes
71
+ </a>
72
+ </td>
73
+ </tr>
47
74
  <tr>
48
75
  <td>0.9.0</td>
49
76
  <td>2026-04-15</td>
@@ -110,6 +137,7 @@ We offer the following PyPI packages to create conversational experiences based
110
137
  | `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. |
111
138
  | `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. |
112
139
  | `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. |
140
+ | `microsoft-agents-hosting-dialogs` | [![PyPI](https://img.shields.io/pypi/v/microsoft-agents-hosting-dialogs)](https://pypi.org/project/microsoft-agents-hosting-dialogs/) | Dialog system with waterfall dialogs, prompts, and multi-turn conversation management. |
113
141
  | `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. |
114
142
  | `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. |
115
143
  | `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. |
@@ -0,0 +1 @@
1
+ 1.2.0
@@ -45,6 +45,8 @@ from .entity import (
45
45
  ProductInfo,
46
46
  Thing,
47
47
  StreamInfo,
48
+ ActivityTreatment,
49
+ ActivityTreatmentTypes,
48
50
  )
49
51
  from .error import Error
50
52
  from .error_response import ErrorResponse
@@ -199,5 +201,7 @@ __all__ = [
199
201
  "load_configuration_from_env",
200
202
  "ChannelAdapterProtocol",
201
203
  "TurnContextProtocol",
204
+ "ActivityTreatment",
205
+ "ActivityTreatmentTypes",
202
206
  "TokenOrSignInResourceResponse",
203
207
  ]
@@ -6,7 +6,8 @@ from __future__ import annotations
6
6
  import logging
7
7
  from copy import copy
8
8
  from datetime import datetime, timezone
9
- from typing import Optional, Any
9
+ from typing import Optional, Any, cast, Annotated, TypeVar
10
+ from typing_extensions import Self
10
11
 
11
12
  from pydantic import (
12
13
  Field,
@@ -48,6 +49,8 @@ from microsoft_agents.activity.errors import activity_errors
48
49
 
49
50
  logger = logging.getLogger(__name__)
50
51
 
52
+ _EntityT = TypeVar("_EntityT", bound=Entity)
53
+
51
54
 
52
55
  # TODO: A2A Agent 2 is responding with None as id, had to mark it as optional (investigate)
53
56
  class Activity(AgentsModel, _ChannelIdFieldMixin):
@@ -157,7 +160,7 @@ class Activity(AgentsModel, _ChannelIdFieldMixin):
157
160
  local_timestamp: datetime = None
158
161
  local_timezone: NonEmptyString = None
159
162
  service_url: NonEmptyString = None
160
- from_property: ChannelAccount = Field(None, alias="from")
163
+ from_property: Annotated[ChannelAccount, Field(alias="from")] = None
161
164
  conversation: ConversationAccount = None
162
165
  recipient: ChannelAccount = None
163
166
  text_format: NonEmptyString = None
@@ -497,7 +500,7 @@ class Activity(AgentsModel, _ChannelIdFieldMixin):
497
500
  """
498
501
  return Activity(type=ActivityTypes.message)
499
502
 
500
- def create_reply(self, text: str = None, locale: str = None):
503
+ def create_reply(self, text: str | None = None, locale: str | None = None):
501
504
  """
502
505
  Creates a new message activity as a response to this activity.
503
506
 
@@ -509,37 +512,44 @@ class Activity(AgentsModel, _ChannelIdFieldMixin):
509
512
  .. remarks::
510
513
  The new activity sets up routing information based on this activity.
511
514
  """
512
- return pick_model(
513
- Activity,
514
- type=ActivityTypes.message,
515
- timestamp=datetime.now(timezone.utc),
516
- from_property=SkipNone(
517
- ChannelAccount.pick_properties(self.recipient, ["id", "name"])
518
- ),
519
- recipient=SkipNone(
520
- ChannelAccount.pick_properties(self.from_property, ["id", "name"])
515
+ return cast(
516
+ Self,
517
+ pick_model(
518
+ self.__class__,
519
+ type=ActivityTypes.message,
520
+ timestamp=datetime.now(timezone.utc),
521
+ from_property=SkipNone(
522
+ ChannelAccount.pick_properties(self.recipient, ["id", "name"])
523
+ ),
524
+ recipient=SkipNone(
525
+ ChannelAccount.pick_properties(self.from_property, ["id", "name"])
526
+ ),
527
+ reply_to_id=(
528
+ SkipNone(self.id)
529
+ if self.type != ActivityTypes.conversation_update
530
+ or self.channel_id not in ["directline", "webchat"]
531
+ else None
532
+ ),
533
+ service_url=self.service_url,
534
+ channel_id=self.channel_id,
535
+ conversation=SkipNone(
536
+ ConversationAccount.pick_properties(
537
+ self.conversation, ["is_group", "id", "name"]
538
+ )
539
+ ),
540
+ text=text if text else "",
541
+ locale=locale if locale else SkipNone(self.locale),
542
+ attachments=[],
543
+ entities=[],
521
544
  ),
522
- reply_to_id=(
523
- SkipNone(self.id)
524
- if type != ActivityTypes.conversation_update
525
- or self.channel_id not in ["directline", "webchat"]
526
- else None
527
- ),
528
- service_url=self.service_url,
529
- channel_id=self.channel_id,
530
- conversation=SkipNone(
531
- ConversationAccount.pick_properties(
532
- self.conversation, ["is_group", "id", "name"]
533
- )
534
- ),
535
- text=text if text else "",
536
- locale=locale if locale else SkipNone(self.locale),
537
- attachments=[],
538
- entities=[],
539
545
  )
540
546
 
541
547
  def create_trace(
542
- self, name: str, value: object = None, value_type: str = None, label: str = None
548
+ self,
549
+ name: str,
550
+ value: object = None,
551
+ value_type: str | None = None,
552
+ label: str | None = None,
543
553
  ):
544
554
  """
545
555
  Creates a new trace activity based on this activity.
@@ -554,39 +564,45 @@ class Activity(AgentsModel, _ChannelIdFieldMixin):
554
564
  if not value_type and value:
555
565
  value_type = type(value).__name__
556
566
 
557
- return pick_model(
558
- Activity,
559
- type=ActivityTypes.trace,
560
- timestamp=datetime.now(timezone.utc),
561
- from_property=SkipNone(
562
- ChannelAccount.pick_properties(self.recipient, ["id", "name"])
563
- ),
564
- recipient=SkipNone(
565
- ChannelAccount.pick_properties(self.from_property, ["id", "name"])
567
+ return cast(
568
+ Self,
569
+ pick_model(
570
+ self.__class__,
571
+ type=ActivityTypes.trace,
572
+ timestamp=datetime.now(timezone.utc),
573
+ from_property=SkipNone(
574
+ ChannelAccount.pick_properties(self.recipient, ["id", "name"])
575
+ ),
576
+ recipient=SkipNone(
577
+ ChannelAccount.pick_properties(self.from_property, ["id", "name"])
578
+ ),
579
+ reply_to_id=(
580
+ SkipNone(self.id) # preserve unset
581
+ if self.type != ActivityTypes.conversation_update
582
+ or self.channel_id not in ["directline", "webchat"]
583
+ else None
584
+ ),
585
+ service_url=self.service_url,
586
+ channel_id=self.channel_id,
587
+ conversation=SkipNone(
588
+ ConversationAccount.pick_properties(
589
+ self.conversation, ["is_group", "id", "name"]
590
+ )
591
+ ),
592
+ name=SkipNone(name),
593
+ label=SkipNone(label),
594
+ value_type=SkipNone(value_type),
595
+ value=SkipNone(value),
566
596
  ),
567
- reply_to_id=(
568
- SkipNone(self.id) # preserve unset
569
- if type != ActivityTypes.conversation_update
570
- or self.channel_id not in ["directline", "webchat"]
571
- else None
572
- ),
573
- service_url=self.service_url,
574
- channel_id=self.channel_id,
575
- conversation=SkipNone(
576
- ConversationAccount.pick_properties(
577
- self.conversation, ["is_group", "id", "name"]
578
- )
579
- ),
580
- name=SkipNone(name),
581
- label=SkipNone(label),
582
- value_type=SkipNone(value_type),
583
- value=SkipNone(value),
584
597
  ).as_trace_activity()
585
598
 
586
599
  @staticmethod
587
600
  def create_trace_activity(
588
- name: str, value: object = None, value_type: str = None, label: str = None
589
- ):
601
+ name: str,
602
+ value: object = None,
603
+ value_type: str | None = None,
604
+ label: str | None = None,
605
+ ) -> Activity:
590
606
  """
591
607
  Creates an instance of the :class:`microsoft_agents.activity.Activity` class as a TraceActivity object.
592
608
 
@@ -600,13 +616,16 @@ class Activity(AgentsModel, _ChannelIdFieldMixin):
600
616
  if not value_type and value:
601
617
  value_type = type(value).__name__
602
618
 
603
- return pick_model(
619
+ return cast(
604
620
  Activity,
605
- type=ActivityTypes.trace,
606
- name=name,
607
- label=SkipNone(label),
608
- value_type=SkipNone(value_type),
609
- value=SkipNone(value),
621
+ pick_model(
622
+ Activity,
623
+ type=ActivityTypes.trace,
624
+ name=name,
625
+ label=SkipNone(label),
626
+ value_type=SkipNone(value_type),
627
+ value=SkipNone(value),
628
+ ),
610
629
  )
611
630
 
612
631
  @staticmethod
@@ -629,33 +648,71 @@ class Activity(AgentsModel, _ChannelIdFieldMixin):
629
648
  Composite values are split only on the first ``:``.
630
649
  :returns: A conversation reference for the conversation that contains this activity.
631
650
  """
632
- return pick_model(
651
+ return cast(
633
652
  ConversationReference,
634
- activity_id=(
635
- SkipNone(self.id)
636
- if self.type != ActivityTypes.conversation_update
637
- or self.channel_id not in ["directline", "webchat"]
638
- else None
639
- ),
640
- user=copy(self.from_property),
641
- agent=copy(self.recipient),
642
- conversation=copy(self.conversation),
643
- channel_id=(
644
- self.channel_id.split(":", 1)[0]
645
- if force_base_channel and self.channel_id is not None
646
- else self.channel_id
653
+ pick_model(
654
+ ConversationReference,
655
+ activity_id=(
656
+ SkipNone(self.id)
657
+ if self.type != ActivityTypes.conversation_update
658
+ or self.channel_id not in ["directline", "webchat"]
659
+ else None
660
+ ),
661
+ user=copy(self.from_property),
662
+ agent=copy(self.recipient),
663
+ conversation=copy(self.conversation),
664
+ channel_id=(
665
+ self.channel_id.split(":", 1)[0]
666
+ if force_base_channel and self.channel_id is not None
667
+ else self.channel_id
668
+ ),
669
+ locale=self.locale,
670
+ service_url=self.service_url,
647
671
  ),
648
- locale=self.locale,
649
- service_url=self.service_url,
650
672
  )
651
673
 
674
+ @staticmethod
675
+ def _convert_entity(raw_entity: Entity, entity_cls: type[_EntityT]) -> _EntityT:
676
+ """
677
+ Converts an entity to a specific entity type.
678
+
679
+ :param raw_entity: The entity to convert.
680
+ :param entity_cls: The class of the entity type to convert to.
681
+ :return: The converted entity of the specified type.
682
+ """
683
+ if isinstance(raw_entity, entity_cls):
684
+ return raw_entity
685
+ return entity_cls.model_validate(raw_entity.model_dump())
686
+
687
+ @staticmethod
688
+ def _convert_entity_list(
689
+ raw_entities: list[Entity], entity_cls: type[_EntityT]
690
+ ) -> list[_EntityT]:
691
+ """
692
+ Converts a list of entities to a list of a specific entity type.
693
+
694
+ :param raw_entities: The list of entities to convert.
695
+ :param entity_cls: The class of the entity type to convert to.
696
+ :return: The list of converted entities of the specified type.
697
+ """
698
+
699
+ entities: list[_EntityT] = []
700
+ for e in raw_entities:
701
+ entities.append(Activity._convert_entity(e, entity_cls))
702
+ return entities
703
+
652
704
  def get_product_info_entity(self) -> Optional[ProductInfo]:
653
705
  if not self.entities:
654
706
  return None
655
707
  target = EntityTypes.PRODUCT_INFO.lower()
656
708
  # validated entities can be Entity, and that prevents us from
657
709
  # making assumptions about the casing of the 'type' attribute
658
- return next(filter(lambda e: e.type.lower() == target, self.entities), None)
710
+ raw_product_info = next(
711
+ filter(lambda e: e.type.lower() == target, self.entities), None
712
+ )
713
+ if raw_product_info is None:
714
+ return None
715
+ return Activity._convert_entity(raw_product_info, ProductInfo)
659
716
 
660
717
  def get_mentions(self) -> list[Mention]:
661
718
  """
@@ -669,7 +726,11 @@ class Activity(AgentsModel, _ChannelIdFieldMixin):
669
726
  """
670
727
  if not self.entities:
671
728
  return []
672
- return [x for x in self.entities if x.type.lower() == EntityTypes.MENTION]
729
+ raw_mentions = [
730
+ x for x in self.entities if x.type.lower() == EntityTypes.MENTION
731
+ ]
732
+
733
+ return Activity._convert_entity_list(raw_mentions, Mention)
673
734
 
674
735
  def get_reply_conversation_reference(
675
736
  self, reply: ResourceResponse
@@ -732,21 +793,14 @@ class Activity(AgentsModel, _ChannelIdFieldMixin):
732
793
  if self.type is None:
733
794
  return False
734
795
 
735
- type_attribute = f"ActivityTypes.{str(self.type)}".lower()
736
- activity_type = str(activity_type).lower()
737
-
738
- result = type_attribute.startswith(activity_type)
796
+ type_value = str(getattr(self.type, "value", self.type)).lower()
797
+ activity_type_value = str(
798
+ getattr(activity_type, "value", activity_type)
799
+ ).lower()
739
800
 
740
- if result:
741
- result = len(type_attribute) == len(activity_type)
742
-
743
- if not result:
744
- result = (
745
- len(type_attribute) > len(activity_type)
746
- and type_attribute[len(activity_type)] == "/"
747
- )
748
-
749
- return result
801
+ return type_value == activity_type_value or type_value.startswith(
802
+ f"{activity_type_value}/"
803
+ )
750
804
 
751
805
  def add_ai_metadata(
752
806
  self,
@@ -2,7 +2,7 @@
2
2
  # Licensed under the MIT License.
3
3
 
4
4
  from abc import abstractmethod
5
- from typing import Protocol, List, Callable, Awaitable, Optional
5
+ from typing import Protocol, Callable, Awaitable, Optional
6
6
 
7
7
  from .turn_context_protocol import TurnContextProtocol
8
8
  from microsoft_agents.activity import (
@@ -18,8 +18,8 @@ class ChannelAdapterProtocol(Protocol):
18
18
 
19
19
  @abstractmethod
20
20
  async def send_activities(
21
- self, context: TurnContextProtocol, activities: List[Activity]
22
- ) -> List[ResourceResponse]:
21
+ self, context: TurnContextProtocol, activities: list[Activity]
22
+ ) -> list[ResourceResponse]:
23
23
  pass
24
24
 
25
25
  @abstractmethod
@@ -54,7 +54,7 @@ class ChannelAdapterProtocol(Protocol):
54
54
  claims_identity: dict,
55
55
  continuation_activity: Activity,
56
56
  callback: Callable[[TurnContextProtocol], Awaitable],
57
- audience: str = None,
57
+ audience: str | None = None,
58
58
  ):
59
59
  pass
60
60
 
@@ -0,0 +1,99 @@
1
+ # Copyright (c) Microsoft Corporation. All rights reserved.
2
+ # Licensed under the MIT License.
3
+
4
+ """Coercion helpers for values loaded from environment configuration.
5
+
6
+ :func:`load_configuration_from_env` keeps every value as the raw string (or a
7
+ nested ``dict``) read from the environment. Consumers that expect a bool, int or
8
+ float must coerce explicitly: a naive ``bool("false")`` is ``True`` and would
9
+ silently invert a flag, and ``int("5") + 1`` style math fails on values that may
10
+ legitimately arrive as strings. These helpers centralize that coercion so every
11
+ config consumer parses env values the same, fail-safe way.
12
+ """
13
+
14
+ from __future__ import annotations
15
+
16
+ from typing import Any
17
+
18
+ _TRUTHY = ("1", "true")
19
+ _FALSY = ("0", "false")
20
+
21
+
22
+ def coerce_bool(value: Any, default: bool | None = None, name: str = "value") -> bool:
23
+ """Coerce a config value (possibly an env string) to a bool.
24
+
25
+ Environment variables always arrive as strings, so ``bool("false")`` would
26
+ be ``True``. Recognized truthy spellings are ``1/true`` and falsy spellings
27
+ are ``0/false`` (case-insensitive).
28
+
29
+ An empty/whitespace-only string or ``None`` is treated as *unset* (not as an
30
+ explicit ``false``). For unset and unrecognized values: if ``default`` is
31
+ provided it is returned, otherwise a ``ValueError`` is raised naming the
32
+ offending setting -- mirroring :func:`coerce_int` and :func:`coerce_float`.
33
+ """
34
+ if isinstance(value, bool):
35
+ return value
36
+ if isinstance(value, (int, float)):
37
+ return bool(value)
38
+ if value is not None:
39
+ text = str(value).strip().lower()
40
+ if text in _TRUTHY:
41
+ return True
42
+ if text in _FALSY:
43
+ return False
44
+ if text:
45
+ if default is not None:
46
+ return default
47
+ raise ValueError(f"Invalid boolean for {name}: {value!r}")
48
+ # Unset (None or empty/whitespace-only string).
49
+ if default is not None:
50
+ return default
51
+ raise ValueError(f"Invalid boolean for {name}: {value!r}")
52
+
53
+
54
+ def coerce_int(value: Any, default: int, name: str = "value") -> int:
55
+ """Coerce a config value (possibly an env string) to an int.
56
+
57
+ Empty/``None`` values fall back to ``default``. Bools are treated as unset
58
+ (a stray ``True``/``False`` is not a meaningful count). Numeric strings such
59
+ as ``"5"`` or ``"5.0"`` are accepted; anything else raises ``ValueError``
60
+ naming the offending setting.
61
+ """
62
+ if value is None:
63
+ return default
64
+ if isinstance(value, bool):
65
+ return default
66
+ if isinstance(value, int):
67
+ return value
68
+ text = str(value).strip()
69
+ if not text:
70
+ return default
71
+ try:
72
+ return int(text, 10)
73
+ except ValueError:
74
+ try:
75
+ return int(float(text))
76
+ except ValueError as ex:
77
+ raise ValueError(f"Invalid integer for {name}: {value!r}") from ex
78
+
79
+
80
+ def coerce_float(value: Any, default: float, name: str = "value") -> float:
81
+ """Coerce a config value (possibly an env string) to a float.
82
+
83
+ Empty/``None`` values fall back to ``default``. Bools are treated as unset.
84
+ Anything that is not parseable as a float raises ``ValueError`` naming the
85
+ offending setting.
86
+ """
87
+ if value is None:
88
+ return default
89
+ if isinstance(value, bool):
90
+ return default
91
+ if isinstance(value, (int, float)):
92
+ return float(value)
93
+ text = str(value).strip()
94
+ if not text:
95
+ return default
96
+ try:
97
+ return float(text)
98
+ except ValueError as ex:
99
+ raise ValueError(f"Invalid number for {name}: {value!r}") from ex
@@ -20,6 +20,44 @@ _NAME_TO_LEVEL = {
20
20
  }
21
21
 
22
22
 
23
+ class ColorFormatter(logging.Formatter):
24
+ """Logging formatter that can add ANSI color based on severity."""
25
+
26
+ MAGENTA = "\033[1;35m"
27
+ RED = "\033[1;31m"
28
+ YELLOW = "\033[1;33m"
29
+ GREEN = "\033[1;32m"
30
+ BLUE = "\033[1;34m"
31
+ RESET = "\033[0m"
32
+
33
+ FMT = (
34
+ "%(asctime)s - %(name)s - %(levelname)s - %(message)s (%(filename)s:%(lineno)d)"
35
+ )
36
+
37
+ def __init__(
38
+ self,
39
+ use_colors: bool = True,
40
+ ) -> None:
41
+ super().__init__(fmt=self.FMT)
42
+ self._plain_formatter = logging.Formatter(fmt=self.FMT)
43
+ if not use_colors:
44
+ self._formatters: dict[int, logging.Formatter] = {}
45
+ return
46
+ self._formatters = {
47
+ logging.CRITICAL: logging.Formatter(
48
+ f"{self.MAGENTA}{self.FMT}{self.RESET}"
49
+ ),
50
+ logging.ERROR: logging.Formatter(f"{self.RED}{self.FMT}{self.RESET}"),
51
+ logging.WARNING: logging.Formatter(f"{self.YELLOW}{self.FMT}{self.RESET}"),
52
+ logging.INFO: logging.Formatter(f"{self.GREEN}{self.FMT}{self.RESET}"),
53
+ logging.DEBUG: logging.Formatter(f"{self.BLUE}{self.FMT}{self.RESET}"),
54
+ }
55
+
56
+ def format(self, record: logging.LogRecord) -> str:
57
+ formatter = self._formatters.get(record.levelno)
58
+ return (formatter or self._plain_formatter).format(record)
59
+
60
+
23
61
  def _configure_logging(logging_config: dict):
24
62
  """Configures logging based on the provided logging configuration dictionary.
25
63
 
@@ -31,9 +69,7 @@ def _configure_logging(logging_config: dict):
31
69
 
32
70
  console_handler = logging.StreamHandler()
33
71
  console_handler.setFormatter(
34
- logging.Formatter(
35
- "%(asctime)s - %(name)s - %(levelname)s - %(message)s (%(filename)s:%(lineno)d)"
36
- )
72
+ ColorFormatter(use_colors=console_handler.stream.isatty())
37
73
  )
38
74
 
39
75
  for key in log_levels:
@@ -50,6 +86,7 @@ def _configure_logging(logging_config: dict):
50
86
  else:
51
87
  logger = logging.getLogger(namespace)
52
88
 
89
+ logger.propagate = False # Prevent log messages from being propagated
53
90
  logger.handlers.clear() # Remove existing handlers to prevent duplicates
54
91
  logger.addHandler(console_handler)
55
92
  logger.setLevel(level)
@@ -4,22 +4,18 @@
4
4
  from __future__ import annotations
5
5
 
6
6
  from uuid import uuid4 as uuid
7
- from typing import Optional
8
- import logging
7
+ from typing import Optional, Annotated
9
8
 
10
9
  from pydantic import Field
11
10
 
12
11
  from .channel_account import ChannelAccount
13
12
  from ._channel_id_field_mixin import _ChannelIdFieldMixin
14
- from .channel_id import ChannelId
15
13
  from .conversation_account import ConversationAccount
16
14
  from .agents_model import AgentsModel
17
15
  from ._type_aliases import NonEmptyString
18
16
  from .activity_types import ActivityTypes
19
17
  from .activity_event_names import ActivityEventNames
20
18
 
21
- logger = logging.getLogger(__name__)
22
-
23
19
 
24
20
  class ConversationReference(AgentsModel, _ChannelIdFieldMixin):
25
21
  """An object relating to a particular point in a conversation.
@@ -48,7 +44,7 @@ class ConversationReference(AgentsModel, _ChannelIdFieldMixin):
48
44
  # optionals here are due to webchat
49
45
  activity_id: Optional[NonEmptyString] = None
50
46
  user: Optional[ChannelAccount] = None
51
- agent: ChannelAccount = Field(None, alias="bot")
47
+ agent: Annotated[ChannelAccount, Field(alias="bot")] = None
52
48
  conversation: ConversationAccount
53
49
  locale: Optional[NonEmptyString] = None
54
50
  service_url: NonEmptyString = None
@@ -1,6 +1,7 @@
1
1
  # Copyright (c) Microsoft Corporation. All rights reserved.
2
2
  # Licensed under the MIT License.
3
3
 
4
+ from .activity_treatment import ActivityTreatment, ActivityTreatmentTypes
4
5
  from .mention import Mention
5
6
  from .entity import Entity
6
7
  from .entity_types import EntityTypes
@@ -35,4 +36,6 @@ __all__ = [
35
36
  "Place",
36
37
  "ProductInfo",
37
38
  "Thing",
39
+ "ActivityTreatment",
40
+ "ActivityTreatmentTypes",
38
41
  ]