Skip to content

Commit 9adca45

Browse files
authored
Users/axsuarez/teams (#36)
* WIP Teams models with pydantic * Teams models WIP * Teams models WIP * Teams models WIP * Teams models replace BaseModel * Teams connector Client WIP * Teams connector client WIP * New connector testing pending * ConnectorClient working single tenant * TeamsActivityHandler WIP * Testing teams sample * Teams sample WIP * Messaging extensions working, TeamsInfo bugfixing * Most TeamsInfo working * teams handler formatting * UserTokenClient Refactor * UserTokenClient Refactor - formatting * Cleaning teams sample and bugfixing * Removing unused class
1 parent f8009fe commit 9adca45

143 files changed

Lines changed: 6922 additions & 26 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.devcontainer/devcontainer.json

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
{
2+
"image": "mcr.microsoft.com/devcontainers/universal:2",
3+
"features": {
4+
"ghcr.io/roul/devcontainer-features/mise-python:1": {
5+
"version": "3.9"
6+
}
7+
}
8+
}

libraries/Builder/microsoft-agents-builder/microsoft/agents/builder/activity_handler.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -84,8 +84,9 @@ async def on_turn(
8484
if invoke_response and not turn_context.turn_state.get(
8585
ActivityTypes.invoke_response
8686
):
87+
response = invoke_response.model_dump(by_alias=True, exclude_none=True)
8788
await turn_context.send_activity(
88-
Activity(value=invoke_response, type=ActivityTypes.invoke_response)
89+
Activity(value=response, type=ActivityTypes.invoke_response)
8990
)
9091
elif turn_context.activity.type == ActivityTypes.end_of_conversation:
9192
await self.on_end_of_conversation_activity(turn_context)

libraries/Builder/microsoft-agents-builder/microsoft/agents/builder/basic_oauth_flow.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
TurnContextProtocol as TurnContext,
1919
)
2020
from microsoft.agents.storage import StoreItem
21-
from pydantic import BaseModel, ConfigDict
21+
from pydantic import BaseModel
2222

2323
from .message_factory import MessageFactory
2424
from .card_factory import CardFactory

libraries/Builder/microsoft-agents-builder/microsoft/agents/builder/channel_service_adapter.py

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,6 @@
3939

4040
class ChannelServiceAdapter(ChannelAdapter, ABC):
4141
_AGENT_CONNECTOR_CLIENT_KEY = "ConnectorClient"
42-
_INVOKE_RESPONSE_KEY = "ChannelServiceAdapter.InvokeResponse"
4342

4443
def __init__(self, channel_service_client_factory: ChannelServiceClientFactoryBase):
4544
super().__init__()
@@ -87,18 +86,15 @@ async def send_activities(
8786
response = await connector_client.conversations.reply_to_activity(
8887
activity.conversation.id,
8988
activity.reply_to_id,
90-
activity.model_dump(by_alias=True, exclude_unset=True),
89+
activity,
9190
)
9291
else:
9392
response = (
9493
await connector_client.conversations.send_to_conversation(
9594
activity.conversation.id,
96-
activity.model_dump(by_alias=True, exclude_unset=True),
95+
activity,
9796
)
9897
)
99-
# TODO: The connector client is not casting the response but returning the JSON, need to fix it appropiatly
100-
if not isinstance(response, ResourceResponse):
101-
response = ResourceResponse.model_validate(response)
10298
response = response or ResourceResponse(id=activity.id or "")
10399

104100
responses.append(response)
@@ -455,12 +451,12 @@ def _process_turn_results(self, context: TurnContext) -> InvokeResponse:
455451
# Handle Invoke scenarios where the agent will return a specific body and return code.
456452
if context.activity.type == ActivityTypes.invoke:
457453
activity_invoke_response: Activity = context.turn_state.get(
458-
self._INVOKE_RESPONSE_KEY
454+
self.INVOKE_RESPONSE_KEY
459455
)
460456
if not activity_invoke_response:
461457
return InvokeResponse(status=HTTPStatus.NOT_IMPLEMENTED)
462458

463-
return activity_invoke_response.value
459+
return InvokeResponse.model_validate(activity_invoke_response.value)
464460

465461
# No body to return
466462
return None

libraries/Builder/microsoft-agents-builder/microsoft/agents/builder/rest_channel_service_client_factory.py

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,12 @@
66
ClaimsIdentity,
77
Connections,
88
)
9+
from microsoft.agents.authorization import AccessTokenProviderBase
910
from microsoft.agents.connector import (
1011
ConnectorClientBase,
11-
ConnectorClient,
1212
UserTokenClient,
1313
)
14+
from microsoft.agents.connector.teams import TeamsConnectorClient
1415

1516
from .channel_service_client_factory_base import ChannelServiceClientFactoryBase
1617

@@ -46,17 +47,19 @@ async def create_connector_client(
4647
"RestChannelServiceClientFactory.create_connector_client: audience can't be None or Empty"
4748
)
4849

49-
token_provider = (
50+
token_provider: AccessTokenProviderBase = (
5051
self._connections.get_token_provider(claims_identity, service_url)
5152
if not use_anonymous
5253
else self._ANONYMOUS_TOKEN_PROVIDER
5354
)
5455

55-
return ConnectorClient(
56+
token = await token_provider.get_access_token(
57+
audience, scopes or [f"{audience}/.default"]
58+
)
59+
60+
return TeamsConnectorClient(
5661
endpoint=service_url,
57-
credential_token_provider=token_provider,
58-
credential_resource_url=audience,
59-
credential_scopes=scopes,
62+
token=token,
6063
)
6164

6265
async def create_user_token_client(
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
from .connector_client import ConnectorClient
2+
from .user_token_client import UserTokenClient
3+
4+
__all__ = ["ConnectorClient", "UserTokenClient"]

0 commit comments

Comments
 (0)