Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
113 changes: 112 additions & 1 deletion examples/agent365/src/main.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,18 @@
import logging
import re

from microsoft_teams.api import MessageActivity
from microsoft_teams.api import (
AgenticUserDeletedActivity,
AgenticUserDisabledActivity,
AgenticUserEnabledActivity,
AgenticUserIdentityCreatedActivity,
AgenticUserIdentityUpdatedActivity,
AgenticUserManagerUpdatedActivity,
AgenticUserUndeletedActivity,
AgenticUserWorkloadOnboardingUpdatedActivity,
AgentLifecycleEventActivity,
MessageActivity,
)
from microsoft_teams.api.activities.typing import TypingActivityInput
from microsoft_teams.apps import ActivityContext, App

Expand All @@ -17,6 +28,106 @@
app = App()


def _log_lifecycle_envelope(activity: AgentLifecycleEventActivity, handler_name: str) -> None:
logger.info(
"[Agent365 lifecycle:%s] name=%s value_type=%s event_type=%s channel_id=%s from=%s recipient_identity=%s",
handler_name,
activity.name,
activity.value_type,
activity.value.event_type,
activity.channel_id,
activity.from_.id,
activity.recipient.agentic_identity,
)
logger.info(
"[Agent365 lifecycle:%s] tenant_id=%s agentic_user_id=%s app_instance_id=%s blueprint_id=%s version=%s",
handler_name,
activity.value.tenant_id,
activity.value.agentic_user_id,
activity.value.agentic_app_instance_id,
activity.value.agent_identity_blueprint_id,
activity.value.version,
)


@app.on_agent_lifecycle
async def handle_agent_lifecycle(ctx: ActivityContext[AgentLifecycleEventActivity]) -> None:
"""Log every Agent 365 agentLifecycle event."""
_log_lifecycle_envelope(ctx.activity, "all")
await ctx.next()


@app.on_agentic_user_identity_created
async def handle_agentic_user_identity_created(ctx: ActivityContext[AgenticUserIdentityCreatedActivity]) -> None:
"""Log an agentic user identity creation event."""
activity = ctx.activity
_log_lifecycle_envelope(activity, "identity_created")
logger.info(
"[Agent365 lifecycle:identity_created] expiration_date_time=%s manager=%s",
activity.value.expiration_date_time,
activity.value.manager,
)


@app.on_agentic_user_identity_updated
async def handle_agentic_user_identity_updated(ctx: ActivityContext[AgenticUserIdentityUpdatedActivity]) -> None:
"""Log an agentic user identity property update event."""
activity = ctx.activity
_log_lifecycle_envelope(activity, "identity_updated")
logger.info(
"[Agent365 lifecycle:identity_updated] updated_property=%s",
activity.value.updated_property,
)


@app.on_agentic_user_manager_updated
async def handle_agentic_user_manager_updated(ctx: ActivityContext[AgenticUserManagerUpdatedActivity]) -> None:
"""Log an agentic user manager update event."""
activity = ctx.activity
_log_lifecycle_envelope(activity, "manager_updated")
logger.info("[Agent365 lifecycle:manager_updated] manager=%s", activity.value.manager)


@app.on_agentic_user_enabled
async def handle_agentic_user_enabled(ctx: ActivityContext[AgenticUserEnabledActivity]) -> None:
"""Log an agentic user enabled event."""
_log_lifecycle_envelope(ctx.activity, "enabled")


@app.on_agentic_user_disabled
async def handle_agentic_user_disabled(ctx: ActivityContext[AgenticUserDisabledActivity]) -> None:
"""Log an agentic user disabled event."""
_log_lifecycle_envelope(ctx.activity, "disabled")


@app.on_agentic_user_deleted
async def handle_agentic_user_deleted(ctx: ActivityContext[AgenticUserDeletedActivity]) -> None:
"""Log an agentic user deleted event."""
activity = ctx.activity
_log_lifecycle_envelope(activity, "deleted")
logger.info("[Agent365 lifecycle:deleted] deletion_reason=%s", activity.value.deletion_reason)


@app.on_agentic_user_undeleted
async def handle_agentic_user_undeleted(ctx: ActivityContext[AgenticUserUndeletedActivity]) -> None:
"""Log an agentic user undeleted event."""
_log_lifecycle_envelope(ctx.activity, "undeleted")


@app.on_agentic_user_workload_onboarding_updated
async def handle_agentic_user_workload_onboarding_updated(
ctx: ActivityContext[AgenticUserWorkloadOnboardingUpdatedActivity],
) -> None:
"""Log an agentic user workload onboarding update event."""
activity = ctx.activity
_log_lifecycle_envelope(activity, "workload_onboarding_updated")
logger.info(
"[Agent365 lifecycle:workload_onboarding_updated] workload_name=%s workload_onboarding_state=%s",
activity.value.workload_name,
activity.value.workload_onboarding_state,
)


@app.on_message_pattern(re.compile(r"hello|hi|greetings"))
async def handle_greeting(ctx: ActivityContext[MessageActivity]) -> None:
"""Handle greeting messages using the inbound AgenticIdentity when present."""
Expand Down
47 changes: 47 additions & 0 deletions packages/api/src/microsoft_teams/api/activities/event/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,30 @@

from pydantic import Field

from .agent_lifecycle import (
AgenticUserDeletedActivity,
AgenticUserDeletedValue,
AgenticUserDisabledActivity,
AgenticUserDisabledValue,
AgenticUserEnabledActivity,
AgenticUserEnabledValue,
AgenticUserIdentityCreatedActivity,
AgenticUserIdentityCreatedValue,
AgenticUserIdentityUpdatedActivity,
AgenticUserIdentityUpdatedValue,
AgenticUserManagerUpdatedActivity,
AgenticUserManagerUpdatedValue,
AgenticUserUndeletedActivity,
AgenticUserUndeletedValue,
AgenticUserWorkloadOnboardingUpdatedActivity,
AgenticUserWorkloadOnboardingUpdatedValue,
AgentLifecycleEventActivity,
AgentLifecycleEventActivityBase,
AgentLifecycleManager,
AgentLifecycleManagerRef,
AgentLifecycleUpdatedProperty,
AgentLifecycleValueBase,
)
from .meeting_end import MeetingEndEventActivity
from .meeting_participant import MeetingParticipantEventActivity
from .meeting_participant_join import MeetingParticipantJoinEventActivity
Expand All @@ -21,6 +45,7 @@
MeetingEndEventActivity,
MeetingParticipantJoinEventActivity,
MeetingParticipantLeaveEventActivity,
AgentLifecycleEventActivity,
],
Field(discriminator="name"),
]
Expand All @@ -33,4 +58,26 @@
"MeetingParticipantLeaveEventActivity",
"ReadReceiptEventActivity",
"EventActivity",
"AgentLifecycleEventActivity",
"AgentLifecycleEventActivityBase",
"AgenticUserIdentityCreatedActivity",
"AgenticUserIdentityUpdatedActivity",
"AgenticUserManagerUpdatedActivity",
"AgenticUserEnabledActivity",
"AgenticUserDisabledActivity",
"AgenticUserDeletedActivity",
"AgenticUserUndeletedActivity",
"AgenticUserWorkloadOnboardingUpdatedActivity",
"AgentLifecycleManager",
"AgentLifecycleManagerRef",
"AgentLifecycleUpdatedProperty",
"AgentLifecycleValueBase",
"AgenticUserIdentityCreatedValue",
"AgenticUserIdentityUpdatedValue",
"AgenticUserManagerUpdatedValue",
"AgenticUserEnabledValue",
"AgenticUserDisabledValue",
"AgenticUserDeletedValue",
"AgenticUserUndeletedValue",
"AgenticUserWorkloadOnboardingUpdatedValue",
]
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
"""
Copyright (c) Microsoft Corporation. All rights reserved.
Licensed under the MIT License.
"""

from .activity import (
AgenticUserDeletedActivity,
AgenticUserDisabledActivity,
AgenticUserEnabledActivity,
AgenticUserIdentityCreatedActivity,
AgenticUserIdentityUpdatedActivity,
AgenticUserManagerUpdatedActivity,
AgenticUserUndeletedActivity,
AgenticUserWorkloadOnboardingUpdatedActivity,
AgentLifecycleEventActivity,
AgentLifecycleEventActivityBase,
)
from .value import (
AgenticUserDeletedValue,
AgenticUserDisabledValue,
AgenticUserEnabledValue,
AgenticUserIdentityCreatedValue,
AgenticUserIdentityUpdatedValue,
AgenticUserManagerUpdatedValue,
AgenticUserUndeletedValue,
AgenticUserWorkloadOnboardingUpdatedValue,
AgentLifecycleManager,
AgentLifecycleManagerRef,
AgentLifecycleUpdatedProperty,
AgentLifecycleValueBase,
)

__all__ = [
"AgentLifecycleEventActivity",
"AgentLifecycleEventActivityBase",
"AgenticUserIdentityCreatedActivity",
"AgenticUserIdentityUpdatedActivity",
"AgenticUserManagerUpdatedActivity",
"AgenticUserEnabledActivity",
"AgenticUserDisabledActivity",
"AgenticUserDeletedActivity",
"AgenticUserUndeletedActivity",
"AgenticUserWorkloadOnboardingUpdatedActivity",
"AgentLifecycleManager",
"AgentLifecycleManagerRef",
"AgentLifecycleUpdatedProperty",
"AgentLifecycleValueBase",
"AgenticUserIdentityCreatedValue",
"AgenticUserIdentityUpdatedValue",
"AgenticUserManagerUpdatedValue",
"AgenticUserEnabledValue",
"AgenticUserDisabledValue",
"AgenticUserDeletedValue",
"AgenticUserUndeletedValue",
"AgenticUserWorkloadOnboardingUpdatedValue",
]
Original file line number Diff line number Diff line change
@@ -0,0 +1,119 @@
"""
Copyright (c) Microsoft Corporation. All rights reserved.
Licensed under the MIT License.
"""

from typing import Annotated, Literal, Union

from pydantic import Field

from ....models import ActivityBase, CustomBaseModel
from .value import (
AgenticUserDeletedValue,
AgenticUserDisabledValue,
AgenticUserEnabledValue,
AgenticUserIdentityCreatedValue,
AgenticUserIdentityUpdatedValue,
AgenticUserManagerUpdatedValue,
AgenticUserUndeletedValue,
AgenticUserWorkloadOnboardingUpdatedValue,
)


class AgentLifecycleEventActivityBase(ActivityBase, CustomBaseModel):
"""Base for Agent 365 ``agentLifecycle`` event activities.

These activities arrive from the ``System`` user on the ``agents`` channel with
``type == "event"`` and ``name == "agentLifecycle"``. The ``value_type`` field
names the variant and ``value`` carries the typed payload.
"""

type: Literal["event"] = "event"

name: Literal["agentLifecycle"] = "agentLifecycle"
"""The name of the operation associated with an event activity."""


class AgenticUserIdentityCreatedActivity(AgentLifecycleEventActivityBase):
"""Fired when an agentic user identity is created."""

value_type: Literal["AgenticUserIdentityCreated"] = "AgenticUserIdentityCreated"
value: AgenticUserIdentityCreatedValue


class AgenticUserIdentityUpdatedActivity(AgentLifecycleEventActivityBase):
"""Fired when an agentic user identity property changes."""

value_type: Literal["AgenticUserIdentityUpdated"] = "AgenticUserIdentityUpdated"
value: AgenticUserIdentityUpdatedValue


class AgenticUserManagerUpdatedActivity(AgentLifecycleEventActivityBase):
"""Fired when an agentic user's manager changes."""

value_type: Literal["AgenticUserManagerUpdated"] = "AgenticUserManagerUpdated"
value: AgenticUserManagerUpdatedValue


class AgenticUserEnabledActivity(AgentLifecycleEventActivityBase):
"""Fired when an agentic user is enabled."""

value_type: Literal["AgenticUserEnabled"] = "AgenticUserEnabled"
value: AgenticUserEnabledValue


class AgenticUserDisabledActivity(AgentLifecycleEventActivityBase):
"""Fired when an agentic user is disabled."""

value_type: Literal["AgenticUserDisabled"] = "AgenticUserDisabled"
value: AgenticUserDisabledValue


class AgenticUserDeletedActivity(AgentLifecycleEventActivityBase):
"""Fired when an agentic user is deleted."""

value_type: Literal["AgenticUserDeleted"] = "AgenticUserDeleted"
value: AgenticUserDeletedValue


class AgenticUserUndeletedActivity(AgentLifecycleEventActivityBase):
"""Fired when a previously deleted agentic user is restored."""

value_type: Literal["AgenticUserUndeleted"] = "AgenticUserUndeleted"
value: AgenticUserUndeletedValue


class AgenticUserWorkloadOnboardingUpdatedActivity(AgentLifecycleEventActivityBase):
"""Fired when a workload onboarding state changes for an agentic user."""

value_type: Literal["AgenticUserWorkloadOnboardingUpdated"] = "AgenticUserWorkloadOnboardingUpdated"
value: AgenticUserWorkloadOnboardingUpdatedValue


AgentLifecycleEventActivity = Annotated[
Union[
AgenticUserIdentityCreatedActivity,
AgenticUserIdentityUpdatedActivity,
AgenticUserManagerUpdatedActivity,
AgenticUserEnabledActivity,
AgenticUserDisabledActivity,
AgenticUserDeletedActivity,
AgenticUserUndeletedActivity,
AgenticUserWorkloadOnboardingUpdatedActivity,
],
Field(discriminator="value_type"),
]
"""Union of all Agent 365 ``agentLifecycle`` event activities, discriminated by ``valueType``."""

__all__ = [
"AgentLifecycleEventActivityBase",
"AgenticUserIdentityCreatedActivity",
"AgenticUserIdentityUpdatedActivity",
"AgenticUserManagerUpdatedActivity",
"AgenticUserEnabledActivity",
"AgenticUserDisabledActivity",
"AgenticUserDeletedActivity",
"AgenticUserUndeletedActivity",
"AgenticUserWorkloadOnboardingUpdatedActivity",
"AgentLifecycleEventActivity",
]
Loading
Loading