Python: Added Copilot Studio Agent (#722)

* Small fix in dotnet conformance tests

* Added CopilotStudioAgent implementation

* Added examples

* Updated package README

* Small fixes

* Small improvements

* Fixed dotnet tests

* Add unit tests

* Updated tests

* Small updates

* Small test fixes

* Revert "Small test fixes"

This reverts commit 983ac44a70.

* Small fixes in documentation

* Updated test configuration

* Revert "Updated test configuration"

This reverts commit 2a16fea815.

* Small fix

* Reverted TODO item

* Small suppressions

* More fixes

* Small fixes

* Fixed tests

* Removed disallow_any_unimported rule in all packages

* Fixes
This commit is contained in:
Dmytro Struk
2025-09-15 16:21:07 -07:00
committed by GitHub
Unverified
parent 74879489a4
commit e7cd03b32e
34 changed files with 3778 additions and 2181 deletions
@@ -6,6 +6,7 @@ from typing import Any, Final
from agent_framework import ChatMessage, Context, ContextProvider, TextContent
from agent_framework.exceptions import ServiceInitializationError
from mem0 import AsyncMemoryClient
from pydantic import PrivateAttr
if sys.version_info >= (3, 11):
@@ -18,6 +19,7 @@ DEFAULT_CONTEXT_PROMPT: Final[str] = "## Memories\nConsider the following memori
class Mem0Provider(ContextProvider):
mem0_client: AsyncMemoryClient
api_key: str | None = None
application_id: str | None = None
agent_id: str | None = None
@@ -25,8 +27,6 @@ class Mem0Provider(ContextProvider):
user_id: str | None = None
scope_to_per_operation_thread_id: bool = False
context_prompt: str = DEFAULT_CONTEXT_PROMPT
# Use Any to avoid forward reference issues with AsyncMemoryClient
mem0_client: Any = None
_should_close_client: bool = PrivateAttr(default=False) # Track whether we should close client connection
@@ -39,7 +39,7 @@ class Mem0Provider(ContextProvider):
user_id: str | None = None,
scope_to_per_operation_thread_id: bool = False,
context_prompt: str = DEFAULT_CONTEXT_PROMPT,
mem0_client: Any = None,
mem0_client: AsyncMemoryClient | None = None,
) -> None:
"""Initializes a new instance of the Mem0Provider class.
@@ -56,8 +56,6 @@ class Mem0Provider(ContextProvider):
"""
should_close_client = False
if mem0_client is None:
from mem0 import AsyncMemoryClient
mem0_client = AsyncMemoryClient(api_key=api_key)
should_close_client = True
@@ -84,7 +82,7 @@ class Mem0Provider(ContextProvider):
async def __aexit__(self, exc_type: type[BaseException] | None, exc_val: BaseException | None, exc_tb: Any) -> None:
"""Async context manager exit."""
if self._should_close_client and self.mem0_client:
await self.mem0_client.__aexit__(exc_type, exc_val, exc_tb)
await self.mem0_client.__aexit__(exc_type, exc_val, exc_tb) # type: ignore
async def thread_created(self, thread_id: str | None = None) -> None:
"""Called when a new thread is created.