From cb94bc3d3cc52a67dd273dba5f105d8240953cad Mon Sep 17 00:00:00 2001 From: Mrunal Hirve Date: Wed, 29 Oct 2025 15:06:16 -0700 Subject: [PATCH 01/20] Agent framework --- .../README.md | 288 ++++++++++++++++++ .../extensions/agentframework/__init__.py | 24 ++ .../agentframework/services/__init__.py | 17 ++ .../services/mcp_tool_registration_service.py | 211 +++++++++++++ .../pyproject.toml | 69 +++++ .../setup.py | 31 ++ 6 files changed, 640 insertions(+) create mode 100644 libraries/microsoft-agents-a365-tooling-extensions-agentframework/README.md create mode 100644 libraries/microsoft-agents-a365-tooling-extensions-agentframework/microsoft_agents_a365/tooling/extensions/agentframework/__init__.py create mode 100644 libraries/microsoft-agents-a365-tooling-extensions-agentframework/microsoft_agents_a365/tooling/extensions/agentframework/services/__init__.py create mode 100644 libraries/microsoft-agents-a365-tooling-extensions-agentframework/microsoft_agents_a365/tooling/extensions/agentframework/services/mcp_tool_registration_service.py create mode 100644 libraries/microsoft-agents-a365-tooling-extensions-agentframework/pyproject.toml create mode 100644 libraries/microsoft-agents-a365-tooling-extensions-agentframework/setup.py diff --git a/libraries/microsoft-agents-a365-tooling-extensions-agentframework/README.md b/libraries/microsoft-agents-a365-tooling-extensions-agentframework/README.md new file mode 100644 index 00000000..af234b7a --- /dev/null +++ b/libraries/microsoft-agents-a365-tooling-extensions-agentframework/README.md @@ -0,0 +1,288 @@ +# Microsoft Agent 365 Tooling Extensions - Agent Framework +[![PyPI version](https://badge.fury.io/py/microsoft-agents-a365-tooling-extensions-agentframework.svg)](https://badge.fury.io/py/microsoft-agents-a365-tooling-extensions-agentframework) + +Agent Framework integration tools and MCP tool registration services for AI agent applications built with the Microsoft Agent 365 SDK. Provides specialized tooling for integrating MCP (Model Context Protocol) servers with Agent Framework agents and projects. + +## What is this? + +This library is part of the Microsoft Agent 365 SDK for Python - a comprehensive framework for building enterprise-grade conversational AI agents. The Agent Framework tooling extensions specifically provide integration with Microsoft Agent Framework, enabling seamless registration and management of MCP tool servers within the Agent Framework ecosystem. + +## Key Features + +✅ **Agent Framework Integration** - Native integration with Microsoft Agent Framework +✅ **MCP Tool Registration** - Automatic registration of MCP servers with Agent Framework agents +✅ **Azure Identity Support** - Built-in Azure authentication with DefaultAzureCredential +✅ **Tool Resource Management** - Comprehensive management of tool definitions and resources +✅ **Multi-Environment Support** - Support for development and production deployment scenarios +✅ **Enterprise Ready** - Production-grade tooling for Agent Framework-based agent deployments + +## Installation + +```bash +pip install microsoft-agents-a365-tooling-extensions-agentframework +``` + +### Prerequisites + +The Agent Framework tooling extensions require the Agent Framework Core package: + +```bash +# Core Agent Framework (includes Azure OpenAI and OpenAI support by default) +# also includes workflows and orchestrations +pip install agent-framework-core --pre +``` + +**Optional Agent Framework packages:** +```bash +# Core + Azure AI integration +pip install agent-framework-azure-ai --pre + +# Core + Microsoft Copilot Studio integration +pip install agent-framework-copilotstudio --pre + +# Core + both Microsoft Copilot Studio and Azure AI integration +pip install agent-framework-microsoft agent-framework-azure-ai --pre +``` + +## Quick Start + +### Basic Concepts + +The Microsoft Agent 365 Agent Framework Tooling Extensions enable seamless integration between MCP tool servers and Agent Framework agents. Key concepts include: + +- **MCP Tool Registration**: Automatic registration of tool definitions with Agent Framework +- **Agent Resource Management**: Management of agent resources and configurations +- **Tool Discovery**: Dynamic discovery and registration of available tools +- **Service Integration**: Integration with various service providers and backends + +### Basic Usage + +```python +import asyncio +from agent_framework import ChatAgent +from agent_framework.azure import AzureOpenAIChatClient +from microsoft_agents_a365.tooling.extensions.agentframework import ( + McpToolRegistrationService, +) + +async def main(): + # Initialize the MCP tool registration service + service = McpToolRegistrationService() + + # Create Azure OpenAI chat client + chat_client = AzureOpenAIChatClient( + api_key='', + endpoint='', + deployment_name='', + api_version='', + ) + + # Create agent with MCP tools from all configured servers + agent = await service.add_tool_servers_to_agent( + chat_client=chat_client, + agent_instructions="You are a helpful assistant that can provide weather and restaurant information.", + initial_tools=[], # Your existing tools + agent_user_id="user-123", + environment_id="prod", + auth_token="your-auth-token" + ) + +if __name__ == "__main__": + asyncio.run(main()) +``` + +### Advanced Configuration + +```python +import asyncio +from agent_framework import ChatAgent +from agent_framework.azure import AzureOpenAIChatClient +from microsoft_agents_a365.tooling.extensions.agentframework import ( + McpToolRegistrationService, +) + +async def main(): + # Initialize with custom logger and credentials + import logging + from azure.identity import DefaultAzureCredential + + logger = logging.getLogger("my-agent") + credential = DefaultAzureCredential() + + service = McpToolRegistrationService( + logger=logger, + credential=credential + ) + + # Create Azure OpenAI chat client + chat_client = AzureOpenAIChatClient( + api_key='', + endpoint='', + deployment_name='', + api_version='', + ) + + # Define existing tools (if any) + existing_tools = [ + # Your existing tools go here + ] + + # Create agent with comprehensive instructions and all MCP tools + agent = await service.add_tool_servers_to_agent( + chat_client=chat_client, + agent_instructions=""" + You are a helpful AI assistant with access to various tools and services. + + Guidelines: + 1) Always be helpful and accurate + 2) Use available tools when appropriate to provide better assistance + 3) Explain your reasoning when using tools + + You have access to MCP (Model Context Protocol) tools that are automatically + loaded from configured servers. Use these tools to enhance your capabilities. + """, + initial_tools=existing_tools, + agent_user_id="user-123", + environment_id="production", + auth_token="your-auth-token" + ) + + # The agent now has all MCP tools from configured servers + print(f"Agent created with {len(agent.tools)} total tools") + +if __name__ == "__main__": + asyncio.run(main()) +``` + +## Configuration + +The library supports various configuration options through environment variables: + +- `AGENT_FRAMEWORK_ENDPOINT`: The Agent Framework endpoint URL +- `AGENT_FRAMEWORK_API_KEY`: API key for Agent Framework authentication +- `MCP_TOOLS_DIRECTORY`: Directory containing MCP tool definitions +- `AGENT_ENVIRONMENT`: Deployment environment (development, staging, production) + +## Agent Framework Integration + +This library provides deep integration with Microsoft Agent Framework using the `ChatAgent` pattern: + +### MCP Tool Server Registration + +Automatically register MCP tools from all configured servers with your Agent Framework agents: + +```python +from agent_framework import ChatAgent +from agent_framework.azure import AzureOpenAIChatClient +from microsoft_agents_a365.tooling.extensions.agentframework import ( + McpToolRegistrationService, +) + +service = McpToolRegistrationService() + +# Create Azure OpenAI chat client +chat_client = AzureOpenAIChatClient( + api_key='', + endpoint='', + deployment_name='', + api_version='', +) + +# Register all MCP tools from configured servers +agent = await service.add_tool_servers_to_agent( + chat_client=chat_client, + agent_instructions="You are a helpful assistant with access to various tools.", + initial_tools=[], # Your existing tools + agent_user_id="user-123", + environment_id="prod", + auth_token="your-token" +) +``` + +### How It Works + +The `add_tool_servers_to_agent` method: + +1. **Discovers MCP Servers**: Uses the MCP server configuration service to find all configured servers +2. **Retrieves Tools**: Connects to each server and retrieves available tool definitions +3. **Combines Tools**: Merges your existing tools with the MCP tools +4. **Creates New Agent**: Returns a new `ChatAgent` instance with all tools configured + +### Agent Configuration + +Configure agents with different chat clients: + +```python +# Using Azure OpenAI (recommended) +from agent_framework.azure import AzureOpenAIChatClient + +chat_client = AzureOpenAIChatClient( + api_key='', + endpoint='', + deployment_name='', + api_version='', +) + +# Alternative: Using OpenAI directly +from agent_framework.openai import OpenAIChatClient +chat_client = OpenAIChatClient() +``` + +## Development + +### Prerequisites + +- Python 3.11 or higher +- Agent Framework Core SDK (`agent-framework-core`) +- Azure Identity (for authentication) + +### Development Setup + +1. Clone the repository +2. Install development dependencies: + ```bash + pip install -e ".[dev]" + ``` +3. Run tests: + ```bash + pytest + ``` + +### Code Style + +This project uses: +- **Black** for code formatting +- **Ruff** for linting +- **MyPy** for type checking + +Run the formatter and linter: +```bash +black microsoft_agents_a365/ +ruff check microsoft_agents_a365/ +mypy microsoft_agents_a365/ +``` + +## Contributing + +We welcome contributions! Please see our [Contributing Guide](../../CONTRIBUTING.md) for details. + +## License + +This project is licensed under the MIT License. See the [LICENSE](../../LICENSE.md) file for details. + +## Support + +For support and questions: +- File issues on [GitHub Issues](https://github.com/microsoft/Agent365/issues) +- Check the [documentation](https://github.com/microsoft/Agent365/tree/main/python) +- Join the community discussions + +## Related Libraries + +This library is part of the Microsoft Agent 365 SDK ecosystem: + +- `microsoft-agents-a365-runtime` - Core runtime and utilities +- `microsoft-agents-a365-tooling` - Base tooling framework +- `microsoft-agents-a365-tooling-extensions-openai` - OpenAI integration +- `microsoft-agents-a365-tooling-extensions-semantickernel` - Semantic Kernel integration +- `microsoft-agents-a365-observability-core` - Observability and monitoring \ No newline at end of file diff --git a/libraries/microsoft-agents-a365-tooling-extensions-agentframework/microsoft_agents_a365/tooling/extensions/agentframework/__init__.py b/libraries/microsoft-agents-a365-tooling-extensions-agentframework/microsoft_agents_a365/tooling/extensions/agentframework/__init__.py new file mode 100644 index 00000000..4c3527c5 --- /dev/null +++ b/libraries/microsoft-agents-a365-tooling-extensions-agentframework/microsoft_agents_a365/tooling/extensions/agentframework/__init__.py @@ -0,0 +1,24 @@ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. + +""" +Agent 365 Tooling Agent Framework Extensions + +Agent Framework specific tools and services for AI agent development. +Provides Agent Framework-specific implementations and utilities for +building agents with Microsoft Agent Framework capabilities. + +Main Service: +- McpToolRegistrationService: Add MCP tool servers to Agent Framework agents +""" + +__version__ = "1.0.0" + +# Import services +from .services import ( + McpToolRegistrationService, +) + +__all__ = [ + "McpToolRegistrationService", +] \ No newline at end of file diff --git a/libraries/microsoft-agents-a365-tooling-extensions-agentframework/microsoft_agents_a365/tooling/extensions/agentframework/services/__init__.py b/libraries/microsoft-agents-a365-tooling-extensions-agentframework/microsoft_agents_a365/tooling/extensions/agentframework/services/__init__.py new file mode 100644 index 00000000..ecdd2ecb --- /dev/null +++ b/libraries/microsoft-agents-a365-tooling-extensions-agentframework/microsoft_agents_a365/tooling/extensions/agentframework/services/__init__.py @@ -0,0 +1,17 @@ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. + +""" +Agent Framework Services Module. + +This module contains service implementations for Agent Framework integration, +including MCP (Model Context Protocol) tool registration and management. +""" + +from .mcp_tool_registration_service import ( + McpToolRegistrationService, +) + +__all__ = [ + "McpToolRegistrationService", +] \ No newline at end of file diff --git a/libraries/microsoft-agents-a365-tooling-extensions-agentframework/microsoft_agents_a365/tooling/extensions/agentframework/services/mcp_tool_registration_service.py b/libraries/microsoft-agents-a365-tooling-extensions-agentframework/microsoft_agents_a365/tooling/extensions/agentframework/services/mcp_tool_registration_service.py new file mode 100644 index 00000000..07cd0e7b --- /dev/null +++ b/libraries/microsoft-agents-a365-tooling-extensions-agentframework/microsoft_agents_a365/tooling/extensions/agentframework/services/mcp_tool_registration_service.py @@ -0,0 +1,211 @@ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. + +""" +MCP Tool Registration Service implementation for Agent Framework. + +This module provides the concrete implementation of the MCP (Model Context Protocol) +tool registration service that integrates with Agent Framework to add MCP tool +servers to agents. +""" + +# Standard library imports +import logging +from typing import Optional, List, Any + +# Third-party imports +from azure.identity import DefaultAzureCredential + +# Agent Framework imports +from agent_framework import ChatAgent, MCPStreamableHTTPTool +from agent_framework.openai import OpenAIChatClient +from agent_framework.azure import AzureOpenAIChatClient + +# Local imports from tooling package +from microsoft_agents_a365.tooling.services.mcp_tool_server_configuration_service import ( + McpToolServerConfigurationService, +) +from microsoft_agents_a365.tooling.models import MCPServerConfig +from microsoft_agents_a365.tooling.utils.constants import Constants + + +class McpToolRegistrationService: + """ + Provides MCP tool registration services for Agent Framework agents. + + This service handles registration and management of MCP (Model Context Protocol) + tool servers with Agent Framework agents. It provides seamless integration + between MCP servers and Microsoft Agent Framework. + + Features: + - Automatic MCP server discovery and configuration + - Azure identity integration with DefaultAzureCredential + - Tool definitions and resources management + - Support for both development (ToolingManifest.json) and production (gateway API) scenarios + - Comprehensive error handling and logging + + Example: + >>> service = McpToolRegistrationService() + >>> agent = await service.add_tool_servers_to_agent( + ... chat_client=chat_client, + ... agent_instructions="You are a helpful assistant.", + ... initial_tools=[], + ... agent_user_id="user-123", + ... environment_id="prod", + ... auth_token="your-token" + ... ) + """ + + def __init__( + self, + logger: Optional[logging.Logger] = None, + credential: Optional["DefaultAzureCredential"] = None, + ): + """ + Initialize the MCP Tool Registration Service for Agent Framework. + + Args: + logger: Logger instance for logging operations. + credential: Azure credential for authentication. If None, DefaultAzureCredential will be used. + """ + self._logger = logger or logging.getLogger(self.__class__.__name__) + self._credential = credential or DefaultAzureCredential() + self._mcp_server_configuration_service = McpToolServerConfigurationService( + logger=self._logger + ) + + # ============================================================================ + # Public Methods - Main Entry Points + # ============================================================================ + + async def add_tool_servers_to_agent( + self, + chat_client: Any, # OpenAIChatClient or AzureOpenAIChatClient + agent_instructions: str, + initial_tools: List[Any], + agent_user_id: str, + environment_id: str, + auth_token: Optional[str] = None, + ) -> "ChatAgent": + """ + Add new MCP servers to the agent by creating a new ChatAgent instance. + + Note: Due to Agent Framework design, MCP tools must be set during + ChatAgent creation. If new tools are found, this method creates a new ChatAgent + instance with all tools (existing + new) properly initialized. + + Args: + chat_client: The configured chat client (OpenAIChatClient or AzureOpenAIChatClient). + agent_instructions: The agent instructions. + initial_tools: The existing tools to add servers to. + agent_user_id: Agent User ID for the agent. + environment_id: Environment ID for the environment. + auth_token: Authentication token to access the MCP servers. + + Returns: + New ChatAgent instance with all MCP tools, or agent with original tools if no new servers. + + Raises: + ValueError: If chat_client is None or auth_token is invalid. + Exception: If there's an error during MCP tool registration. + """ + if chat_client is None: + raise ValueError("chat_client cannot be None") + + if not auth_token or auth_token.strip() == "": + raise ValueError("Auth token cannot be null or empty.") + + try: + # Step 2: Now update agent by adding MCP tools + updated_tools = [] + + # Keep any existing tools that were passed in + updated_tools.extend(initial_tools) + + # Get MCP tool server configurations + servers = await self._mcp_server_configuration_service.list_tool_servers( + agent_user_id, environment_id, auth_token + ) + + # Retrieve MCP tools from all configured servers + for server in servers: + try: + mcp_tools = await self._get_tools(server, environment_id, auth_token) + # Add the MCP tools + updated_tools.extend(mcp_tools) + + self._logger.info( + f"Successfully loaded {len(mcp_tools)} tools from MCP server '{server.mcp_server_name}'" + ) + except Exception as ex: + self._logger.error( + f"Failed to load tools from MCP server '{server.mcp_server_name}': {ex}" + ) + + self._logger.info( + f"Loaded {len(updated_tools)} MCP tools for agent {agent_user_id} in environment {environment_id}" + ) + + # Create ChatAgent with updated tools (since ChatAgent is immutable) + agent_with_tools = ChatAgent( + chat_client=chat_client, + instructions=agent_instructions, + tools=updated_tools + ) + + # Return the enhanced agent + return agent_with_tools + + except Exception as ex: + self._logger.error( + f"Failed to add MCP tool servers for agent {agent_user_id} in environment {environment_id}: {ex}" + ) + raise + + # ============================================================================ + # Private Methods - Implementation Details + # ============================================================================ + + async def _get_tools( + self, server: MCPServerConfig, environment_id: str, auth_token: str + ) -> List[Any]: + """ + Get tools from a specific MCP server. + + Args: + server: MCP server configuration. + environment_id: Environment ID for the environment. + auth_token: Authentication token for the MCP server. + + Returns: + List of tools from the MCP server. + """ + if not server.mcp_server_name or not server.mcp_server_unique_name: + self._logger.warning( + f"Skipping invalid MCP server config: Name='{server.mcp_server_name}', Url='{server.mcp_server_unique_name}'" + ) + return [] + + try: + # Create headers for MCP server authentication + headers = { + Constants.Headers.AUTHORIZATION: f"{Constants.Headers.BEARER_PREFIX} {auth_token}", + Constants.Headers.ENVIRONMENT_ID: environment_id, + } + + # Create MCP plugin using Agent Framework + plugin = MCPStreamableHTTPTool( + name=server.mcp_server_name, + url=server.mcp_server_unique_name, + headers=headers or None, + ) + + # Get tools from the MCP plugin + tools = await plugin.get_tools() + + self._logger.info(f"Retrieved {len(tools)} tools from MCP server {server.mcp_server_name}") + return tools + + except Exception as ex: + self._logger.error(f"Failed to get tools from MCP server {server.mcp_server_name}: {ex}") + return [] \ No newline at end of file diff --git a/libraries/microsoft-agents-a365-tooling-extensions-agentframework/pyproject.toml b/libraries/microsoft-agents-a365-tooling-extensions-agentframework/pyproject.toml new file mode 100644 index 00000000..f5530dca --- /dev/null +++ b/libraries/microsoft-agents-a365-tooling-extensions-agentframework/pyproject.toml @@ -0,0 +1,69 @@ +[build-system] +requires = ["setuptools>=68", "wheel", "tzdata"] +build-backend = "setuptools.build_meta" + +[project] +name = "microsoft-agents-a365-tooling-extensions-agentframework" +dynamic = ["version"] +authors = [ + { name = "Microsoft", email = "support@microsoft.com" }, +] +description = "Agent Framework integration tools for Agent 365 AI agent tooling" +readme = "README.md" +requires-python = ">=3.11" +classifiers = [ + "Development Status :: 3 - Alpha", + "Intended Audience :: Developers", + "Programming Language :: Python :: 3", + "Programming Language :: Python :: 3.11", + "Programming Language :: Python :: 3.12", + "Operating System :: OS Independent", + "Topic :: Software Development :: Libraries :: Python Modules", + "Topic :: Scientific/Engineering :: Artificial Intelligence", +] +license = "MIT" +dependencies = [ + "microsoft-agents-a365-tooling >= 0.1.0", + "agent-framework", + "azure-identity >= 1.12.0", +] + +[project.urls] +Homepage = "https://github.com/microsoft/Agent365" +Repository = "https://github.com/microsoft/Agent365" +Issues = "https://github.com/microsoft/Agent365/issues" +Documentation = "https://github.com/microsoft/Agent365/tree/main/python/microsoft_agents_a365/tooling/agentframework" + +[project.optional-dependencies] +dev = [ + "pytest >= 7.0.0", + "pytest-asyncio >= 0.21.0", + "ruff >= 0.1.0", + "black >= 23.0.0", + "mypy >= 1.0.0", +] +test = [ + "pytest >= 7.0.0", + "pytest-asyncio >= 0.21.0", +] + +[tool.setuptools] +packages = ["microsoft_agents_a365.tooling.extensions.agentframework"] + +[tool.setuptools.package-dir] +"microsoft_agents_a365.tooling.extensions.agentframework" = "microsoft_agents_a365/tooling/extensions/agentframework" + +[tool.setuptools.dynamic] +version = {attr = "microsoft_agents_a365.tooling.extensions.agentframework.__version__"} + +[tool.black] +line-length = 100 +target-version = ['py311'] + +[tool.ruff] +line-length = 100 +target-version = "py311" + +[tool.mypy] +python_version = "3.11" +strict = true \ No newline at end of file diff --git a/libraries/microsoft-agents-a365-tooling-extensions-agentframework/setup.py b/libraries/microsoft-agents-a365-tooling-extensions-agentframework/setup.py new file mode 100644 index 00000000..8e05e639 --- /dev/null +++ b/libraries/microsoft-agents-a365-tooling-extensions-agentframework/setup.py @@ -0,0 +1,31 @@ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. + +import os +from datetime import datetime +from zoneinfo import ZoneInfo + +from setuptools import setup + + +def build_version(): + """ + Example: 2025.10.3+preview.65532 (PEP 440 compliant; avoids hyphens) + Uses UTC. + """ + + if defined_version := os.getenv("A365_SDK_VERSION"): + return defined_version # For CI/CD to set a specific version. + + today = datetime.now(ZoneInfo("UTC")) + + return ( + f"{today.year}.{today.month}.{today.day}+preview.{today.hour}{today.minute}{today.second}" + ) + + +VERSION = build_version() + +setup( + version=VERSION, +) \ No newline at end of file From f12a2443745a1c99d27001c72df75ae5cad5a460 Mon Sep 17 00:00:00 2001 From: Mrunal Hirve Date: Wed, 29 Oct 2025 15:12:17 -0700 Subject: [PATCH 02/20] ruff format --- .../extensions/agentframework/__init__.py | 2 +- .../agentframework/services/__init__.py | 2 +- .../services/mcp_tool_registration_service.py | 28 ++++++++++--------- .../setup.py | 2 +- 4 files changed, 18 insertions(+), 16 deletions(-) diff --git a/libraries/microsoft-agents-a365-tooling-extensions-agentframework/microsoft_agents_a365/tooling/extensions/agentframework/__init__.py b/libraries/microsoft-agents-a365-tooling-extensions-agentframework/microsoft_agents_a365/tooling/extensions/agentframework/__init__.py index 4c3527c5..7206e5d7 100644 --- a/libraries/microsoft-agents-a365-tooling-extensions-agentframework/microsoft_agents_a365/tooling/extensions/agentframework/__init__.py +++ b/libraries/microsoft-agents-a365-tooling-extensions-agentframework/microsoft_agents_a365/tooling/extensions/agentframework/__init__.py @@ -21,4 +21,4 @@ __all__ = [ "McpToolRegistrationService", -] \ No newline at end of file +] diff --git a/libraries/microsoft-agents-a365-tooling-extensions-agentframework/microsoft_agents_a365/tooling/extensions/agentframework/services/__init__.py b/libraries/microsoft-agents-a365-tooling-extensions-agentframework/microsoft_agents_a365/tooling/extensions/agentframework/services/__init__.py index ecdd2ecb..ac24b306 100644 --- a/libraries/microsoft-agents-a365-tooling-extensions-agentframework/microsoft_agents_a365/tooling/extensions/agentframework/services/__init__.py +++ b/libraries/microsoft-agents-a365-tooling-extensions-agentframework/microsoft_agents_a365/tooling/extensions/agentframework/services/__init__.py @@ -14,4 +14,4 @@ __all__ = [ "McpToolRegistrationService", -] \ No newline at end of file +] diff --git a/libraries/microsoft-agents-a365-tooling-extensions-agentframework/microsoft_agents_a365/tooling/extensions/agentframework/services/mcp_tool_registration_service.py b/libraries/microsoft-agents-a365-tooling-extensions-agentframework/microsoft_agents_a365/tooling/extensions/agentframework/services/mcp_tool_registration_service.py index 07cd0e7b..1aea7231 100644 --- a/libraries/microsoft-agents-a365-tooling-extensions-agentframework/microsoft_agents_a365/tooling/extensions/agentframework/services/mcp_tool_registration_service.py +++ b/libraries/microsoft-agents-a365-tooling-extensions-agentframework/microsoft_agents_a365/tooling/extensions/agentframework/services/mcp_tool_registration_service.py @@ -34,7 +34,7 @@ class McpToolRegistrationService: Provides MCP tool registration services for Agent Framework agents. This service handles registration and management of MCP (Model Context Protocol) - tool servers with Agent Framework agents. It provides seamless integration + tool servers with Agent Framework agents. It provides seamless integration between MCP servers and Microsoft Agent Framework. Features: @@ -89,7 +89,7 @@ async def add_tool_servers_to_agent( ) -> "ChatAgent": """ Add new MCP servers to the agent by creating a new ChatAgent instance. - + Note: Due to Agent Framework design, MCP tools must be set during ChatAgent creation. If new tools are found, this method creates a new ChatAgent instance with all tools (existing + new) properly initialized. @@ -118,7 +118,7 @@ async def add_tool_servers_to_agent( try: # Step 2: Now update agent by adding MCP tools updated_tools = [] - + # Keep any existing tools that were passed in updated_tools.extend(initial_tools) @@ -126,14 +126,14 @@ async def add_tool_servers_to_agent( servers = await self._mcp_server_configuration_service.list_tool_servers( agent_user_id, environment_id, auth_token ) - + # Retrieve MCP tools from all configured servers for server in servers: try: mcp_tools = await self._get_tools(server, environment_id, auth_token) # Add the MCP tools updated_tools.extend(mcp_tools) - + self._logger.info( f"Successfully loaded {len(mcp_tools)} tools from MCP server '{server.mcp_server_name}'" ) @@ -148,14 +148,12 @@ async def add_tool_servers_to_agent( # Create ChatAgent with updated tools (since ChatAgent is immutable) agent_with_tools = ChatAgent( - chat_client=chat_client, - instructions=agent_instructions, - tools=updated_tools + chat_client=chat_client, instructions=agent_instructions, tools=updated_tools ) # Return the enhanced agent return agent_with_tools - + except Exception as ex: self._logger.error( f"Failed to add MCP tool servers for agent {agent_user_id} in environment {environment_id}: {ex}" @@ -202,10 +200,14 @@ async def _get_tools( # Get tools from the MCP plugin tools = await plugin.get_tools() - - self._logger.info(f"Retrieved {len(tools)} tools from MCP server {server.mcp_server_name}") + + self._logger.info( + f"Retrieved {len(tools)} tools from MCP server {server.mcp_server_name}" + ) return tools except Exception as ex: - self._logger.error(f"Failed to get tools from MCP server {server.mcp_server_name}: {ex}") - return [] \ No newline at end of file + self._logger.error( + f"Failed to get tools from MCP server {server.mcp_server_name}: {ex}" + ) + return [] diff --git a/libraries/microsoft-agents-a365-tooling-extensions-agentframework/setup.py b/libraries/microsoft-agents-a365-tooling-extensions-agentframework/setup.py index 8e05e639..8f98673a 100644 --- a/libraries/microsoft-agents-a365-tooling-extensions-agentframework/setup.py +++ b/libraries/microsoft-agents-a365-tooling-extensions-agentframework/setup.py @@ -28,4 +28,4 @@ def build_version(): setup( version=VERSION, -) \ No newline at end of file +) From 19917d7238d14b82589b0170e523cfc73a06eab1 Mon Sep 17 00:00:00 2001 From: Mrunal Hirve Date: Thu, 30 Oct 2025 18:42:01 -0700 Subject: [PATCH 03/20] update tooling service --- .../extensions/agentframework/__init__.py | 12 +- .../agentframework/services/__init__.py | 12 +- .../services/mcp_tool_registration_service.py | 241 +++++++----------- .../pyproject.toml | 17 +- 4 files changed, 109 insertions(+), 173 deletions(-) diff --git a/libraries/microsoft-agents-a365-tooling-extensions-agentframework/microsoft_agents_a365/tooling/extensions/agentframework/__init__.py b/libraries/microsoft-agents-a365-tooling-extensions-agentframework/microsoft_agents_a365/tooling/extensions/agentframework/__init__.py index 7206e5d7..c4ba4378 100644 --- a/libraries/microsoft-agents-a365-tooling-extensions-agentframework/microsoft_agents_a365/tooling/extensions/agentframework/__init__.py +++ b/libraries/microsoft-agents-a365-tooling-extensions-agentframework/microsoft_agents_a365/tooling/extensions/agentframework/__init__.py @@ -10,14 +10,18 @@ Main Service: - McpToolRegistrationService: Add MCP tool servers to Agent Framework agents + +This module includes implementations for: +- Agent Framework agent creation with MCP (Model Context Protocol) server support +- MCP tool registration service for dynamically adding MCP servers to agents +- Azure OpenAI and OpenAI chat client integration +- Authentication and authorization patterns for MCP server discovery """ __version__ = "1.0.0" -# Import services -from .services import ( - McpToolRegistrationService, -) +# Import services from the services module +from .services import McpToolRegistrationService __all__ = [ "McpToolRegistrationService", diff --git a/libraries/microsoft-agents-a365-tooling-extensions-agentframework/microsoft_agents_a365/tooling/extensions/agentframework/services/__init__.py b/libraries/microsoft-agents-a365-tooling-extensions-agentframework/microsoft_agents_a365/tooling/extensions/agentframework/services/__init__.py index ac24b306..ad149fa5 100644 --- a/libraries/microsoft-agents-a365-tooling-extensions-agentframework/microsoft_agents_a365/tooling/extensions/agentframework/services/__init__.py +++ b/libraries/microsoft-agents-a365-tooling-extensions-agentframework/microsoft_agents_a365/tooling/extensions/agentframework/services/__init__.py @@ -2,16 +2,14 @@ # Licensed under the MIT License. """ -Agent Framework Services Module. +Services module for Agent Framework tooling. -This module contains service implementations for Agent Framework integration, -including MCP (Model Context Protocol) tool registration and management. +This package contains service implementations for MCP tool registration +and management within the Agent Framework. """ -from .mcp_tool_registration_service import ( - McpToolRegistrationService, -) +from .mcp_tool_registration_service import McpToolRegistrationService __all__ = [ "McpToolRegistrationService", -] +] \ No newline at end of file diff --git a/libraries/microsoft-agents-a365-tooling-extensions-agentframework/microsoft_agents_a365/tooling/extensions/agentframework/services/mcp_tool_registration_service.py b/libraries/microsoft-agents-a365-tooling-extensions-agentframework/microsoft_agents_a365/tooling/extensions/agentframework/services/mcp_tool_registration_service.py index 1aea7231..02d833d8 100644 --- a/libraries/microsoft-agents-a365-tooling-extensions-agentframework/microsoft_agents_a365/tooling/extensions/agentframework/services/mcp_tool_registration_service.py +++ b/libraries/microsoft-agents-a365-tooling-extensions-agentframework/microsoft_agents_a365/tooling/extensions/agentframework/services/mcp_tool_registration_service.py @@ -1,31 +1,17 @@ # Copyright (c) Microsoft Corporation. # Licensed under the MIT License. -""" -MCP Tool Registration Service implementation for Agent Framework. - -This module provides the concrete implementation of the MCP (Model Context Protocol) -tool registration service that integrates with Agent Framework to add MCP tool -servers to agents. -""" - -# Standard library imports -import logging from typing import Optional, List, Any +import logging -# Third-party imports -from azure.identity import DefaultAzureCredential - -# Agent Framework imports from agent_framework import ChatAgent, MCPStreamableHTTPTool -from agent_framework.openai import OpenAIChatClient -from agent_framework.azure import AzureOpenAIChatClient -# Local imports from tooling package +from microsoft_agents.hosting.core import Authorization, TurnContext + from microsoft_agents_a365.tooling.services.mcp_tool_server_configuration_service import ( McpToolServerConfigurationService, ) -from microsoft_agents_a365.tooling.models import MCPServerConfig +from microsoft_agents_a365.tooling.utils.utility import get_ppapi_token_scope from microsoft_agents_a365.tooling.utils.constants import Constants @@ -34,49 +20,21 @@ class McpToolRegistrationService: Provides MCP tool registration services for Agent Framework agents. This service handles registration and management of MCP (Model Context Protocol) - tool servers with Agent Framework agents. It provides seamless integration - between MCP servers and Microsoft Agent Framework. - - Features: - - Automatic MCP server discovery and configuration - - Azure identity integration with DefaultAzureCredential - - Tool definitions and resources management - - Support for both development (ToolingManifest.json) and production (gateway API) scenarios - - Comprehensive error handling and logging - - Example: - >>> service = McpToolRegistrationService() - >>> agent = await service.add_tool_servers_to_agent( - ... chat_client=chat_client, - ... agent_instructions="You are a helpful assistant.", - ... initial_tools=[], - ... agent_user_id="user-123", - ... environment_id="prod", - ... auth_token="your-token" - ... ) + tool servers with Agent Framework agents. """ - def __init__( - self, - logger: Optional[logging.Logger] = None, - credential: Optional["DefaultAzureCredential"] = None, - ): + def __init__(self, logger: Optional[logging.Logger] = None): """ Initialize the MCP Tool Registration Service for Agent Framework. Args: logger: Logger instance for logging operations. - credential: Azure credential for authentication. If None, DefaultAzureCredential will be used. """ self._logger = logger or logging.getLogger(self.__class__.__name__) - self._credential = credential or DefaultAzureCredential() self._mcp_server_configuration_service = McpToolServerConfigurationService( logger=self._logger ) - - # ============================================================================ - # Public Methods - Main Entry Points - # ============================================================================ + self._connected_servers = [] async def add_tool_servers_to_agent( self, @@ -85,129 +43,102 @@ async def add_tool_servers_to_agent( initial_tools: List[Any], agent_user_id: str, environment_id: str, + auth: Optional[Authorization] = None, auth_token: Optional[str] = None, - ) -> "ChatAgent": + turn_context: Optional[TurnContext] = None, + ) -> Optional[ChatAgent]: """ - Add new MCP servers to the agent by creating a new ChatAgent instance. - - Note: Due to Agent Framework design, MCP tools must be set during - ChatAgent creation. If new tools are found, this method creates a new ChatAgent - instance with all tools (existing + new) properly initialized. + Add MCP tool servers to a chat agent (mirrors .NET implementation). Args: - chat_client: The configured chat client (OpenAIChatClient or AzureOpenAIChatClient). - agent_instructions: The agent instructions. - initial_tools: The existing tools to add servers to. - agent_user_id: Agent User ID for the agent. - environment_id: Environment ID for the environment. - auth_token: Authentication token to access the MCP servers. + chat_client: The chat client instance (OpenAI or Azure OpenAI) + agent_instructions: Instructions for the agent behavior + initial_tools: List of initial tools to add to the agent + agent_user_id: Unique identifier for the agent user + environment_id: Environment identifier for MCP server discovery + auth: Optional authorization context + auth_token: Optional bearer token for authentication + turn_context: Optional turn context for the operation Returns: - New ChatAgent instance with all MCP tools, or agent with original tools if no new servers. - - Raises: - ValueError: If chat_client is None or auth_token is invalid. - Exception: If there's an error during MCP tool registration. + ChatAgent instance with MCP tools registered, or None if creation failed """ - if chat_client is None: - raise ValueError("chat_client cannot be None") - - if not auth_token or auth_token.strip() == "": - raise ValueError("Auth token cannot be null or empty.") - try: - # Step 2: Now update agent by adding MCP tools - updated_tools = [] - - # Keep any existing tools that were passed in - updated_tools.extend(initial_tools) + self._logger.info(f"Listing MCP tool servers for agent {agent_user_id} in environment {environment_id}") - # Get MCP tool server configurations - servers = await self._mcp_server_configuration_service.list_tool_servers( - agent_user_id, environment_id, auth_token + # Get MCP server configurations + server_configs = await self._mcp_server_configuration_service.list_tool_servers( + agent_user_id=agent_user_id, + environment_id=environment_id, + auth_token=auth_token, ) - # Retrieve MCP tools from all configured servers - for server in servers: - try: - mcp_tools = await self._get_tools(server, environment_id, auth_token) - # Add the MCP tools - updated_tools.extend(mcp_tools) + self._logger.info(f"Loaded {len(server_configs)} MCP server configurations") - self._logger.info( - f"Successfully loaded {len(mcp_tools)} tools from MCP server '{server.mcp_server_name}'" - ) - except Exception as ex: - self._logger.error( - f"Failed to load tools from MCP server '{server.mcp_server_name}': {ex}" - ) - - self._logger.info( - f"Loaded {len(updated_tools)} MCP tools for agent {agent_user_id} in environment {environment_id}" - ) + # Create the agent with all tools (initial + MCP tools) + all_tools = list(initial_tools) - # Create ChatAgent with updated tools (since ChatAgent is immutable) - agent_with_tools = ChatAgent( - chat_client=chat_client, instructions=agent_instructions, tools=updated_tools + # Add MCP plugins for each server config + for config in server_configs: + try: + server_url = getattr(config, 'server_url', None) or getattr(config, 'mcp_server_unique_name', None) + if not server_url: + self._logger.warning(f"MCP server config missing server_url: {config}") + continue + + # Prepare auth headers + headers = {} + if auth_token: + headers[Constants.Headers.AUTHORIZATION] = f"{Constants.Headers.BEARER_PREFIX} {auth_token}" + if environment_id: + headers[Constants.Headers.ENVIRONMENT_ID] = environment_id + + server_name = getattr(config, 'mcp_server_name', 'Unknown') + + # Create and configure MCP plugin + mcp_tools = MCPStreamableHTTPTool( + name=server_name, + url=server_url, + headers=headers, + description=f"MCP tools from {server_name}" + ) + + # Let Agent Framework handle the connection automatically + self._logger.info(f"Created MCP plugin for '{server_name}' at {server_url}") + + all_tools.append(mcp_tools) + self._connected_servers.append(mcp_tools) + + self._logger.info(f"Added MCP plugin '{server_name}' to agent tools") + + except Exception as tool_ex: + server_name = getattr(config, 'mcp_server_name', 'Unknown') + self._logger.warning(f"Failed to create MCP plugin for {server_name}: {tool_ex}") + continue + + # Create the ChatAgent + agent = ChatAgent( + chat_client=chat_client, + tools=all_tools, + instructions=agent_instructions, ) - # Return the enhanced agent - return agent_with_tools + self._logger.info(f"Agent created with {len(all_tools)} total tools") + return agent except Exception as ex: - self._logger.error( - f"Failed to add MCP tool servers for agent {agent_user_id} in environment {environment_id}: {ex}" - ) - raise - - # ============================================================================ - # Private Methods - Implementation Details - # ============================================================================ - - async def _get_tools( - self, server: MCPServerConfig, environment_id: str, auth_token: str - ) -> List[Any]: - """ - Get tools from a specific MCP server. - - Args: - server: MCP server configuration. - environment_id: Environment ID for the environment. - auth_token: Authentication token for the MCP server. - - Returns: - List of tools from the MCP server. - """ - if not server.mcp_server_name or not server.mcp_server_unique_name: - self._logger.warning( - f"Skipping invalid MCP server config: Name='{server.mcp_server_name}', Url='{server.mcp_server_unique_name}'" - ) - return [] + self._logger.error(f"Failed to add tool servers to agent: {ex}") + return None + async def cleanup(self): + """Clean up any resources used by the service.""" try: - # Create headers for MCP server authentication - headers = { - Constants.Headers.AUTHORIZATION: f"{Constants.Headers.BEARER_PREFIX} {auth_token}", - Constants.Headers.ENVIRONMENT_ID: environment_id, - } - - # Create MCP plugin using Agent Framework - plugin = MCPStreamableHTTPTool( - name=server.mcp_server_name, - url=server.mcp_server_unique_name, - headers=headers or None, - ) - - # Get tools from the MCP plugin - tools = await plugin.get_tools() - - self._logger.info( - f"Retrieved {len(tools)} tools from MCP server {server.mcp_server_name}" - ) - return tools - + for plugin in self._connected_servers: + try: + if hasattr(plugin, 'close'): + await plugin.close() + except Exception as cleanup_ex: + self._logger.debug(f"Error during cleanup: {cleanup_ex}") + self._connected_servers.clear() except Exception as ex: - self._logger.error( - f"Failed to get tools from MCP server {server.mcp_server_name}: {ex}" - ) - return [] + self._logger.debug(f"Error during service cleanup: {ex}") \ No newline at end of file diff --git a/libraries/microsoft-agents-a365-tooling-extensions-agentframework/pyproject.toml b/libraries/microsoft-agents-a365-tooling-extensions-agentframework/pyproject.toml index f5530dca..9ea5d7a2 100644 --- a/libraries/microsoft-agents-a365-tooling-extensions-agentframework/pyproject.toml +++ b/libraries/microsoft-agents-a365-tooling-extensions-agentframework/pyproject.toml @@ -24,8 +24,10 @@ classifiers = [ license = "MIT" dependencies = [ "microsoft-agents-a365-tooling >= 0.1.0", - "agent-framework", + "microsoft-agents-hosting >= 0.1.0", + "agent-framework-azure-ai >= 0.1.0", "azure-identity >= 1.12.0", + "typing-extensions >= 4.0.0", ] [project.urls] @@ -47,14 +49,15 @@ test = [ "pytest-asyncio >= 0.21.0", ] -[tool.setuptools] -packages = ["microsoft_agents_a365.tooling.extensions.agentframework"] +[tool.setuptools.packages.find] +where = ["."] -[tool.setuptools.package-dir] -"microsoft_agents_a365.tooling.extensions.agentframework" = "microsoft_agents_a365/tooling/extensions/agentframework" +[tool.setuptools] +license-files = ["../../LICENSE"] +include-package-data = true -[tool.setuptools.dynamic] -version = {attr = "microsoft_agents_a365.tooling.extensions.agentframework.__version__"} +[tool.setuptools.package-data] +"*" = ["../../LICENSE"] [tool.black] line-length = 100 From 0082a804d958d6eb2c703ea62291ef95824cdb0d Mon Sep 17 00:00:00 2001 From: Mrunal Hirve Date: Thu, 30 Oct 2025 18:46:06 -0700 Subject: [PATCH 04/20] fixed logger in open ai --- .../openai/mcp_tool_registration_service.py | 28 ++++++++++++++++--- 1 file changed, 24 insertions(+), 4 deletions(-) diff --git a/libraries/microsoft-agents-a365-tooling-extensions-openai/microsoft_agents_a365/tooling/extensions/openai/mcp_tool_registration_service.py b/libraries/microsoft-agents-a365-tooling-extensions-openai/microsoft_agents_a365/tooling/extensions/openai/mcp_tool_registration_service.py index bfbd8de5..6b781b28 100644 --- a/libraries/microsoft-agents-a365-tooling-extensions-openai/microsoft_agents_a365/tooling/extensions/openai/mcp_tool_registration_service.py +++ b/libraries/microsoft-agents-a365-tooling-extensions-openai/microsoft_agents_a365/tooling/extensions/openai/mcp_tool_registration_service.py @@ -1,5 +1,9 @@ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. + from typing import Dict, Optional from dataclasses import dataclass +import logging from agents import Agent @@ -32,8 +36,15 @@ class MCPServerInfo: class McpToolRegistrationService: """Service for managing MCP tools and servers for an agent""" - def __init__(self): - self.config_service = McpToolServerConfigurationService() + def __init__(self, logger: Optional[logging.Logger] = None): + """ + Initialize the MCP Tool Registration Service for OpenAI. + + Args: + logger: Logger instance for logging operations. + """ + self._logger = logger or logging.getLogger(self.__class__.__name__) + self.config_service = McpToolServerConfigurationService(logger=self._logger) async def add_tool_servers_to_agent( self, @@ -69,10 +80,13 @@ async def add_tool_servers_to_agent( # Get MCP server configurations from the configuration service # mcp_server_configs = [] # TODO: radevika: Update once the common project is merged. + self._logger.info(f"Listing MCP tool servers for agent {agent_user_id} in environment {environment_id}") mcp_server_configs = await self.config_service.list_tool_servers( agent_user_id=agent_user_id, environment_id=environment_id, auth_token=auth_token ) + self._logger.info(f"Loaded {len(mcp_server_configs)} MCP server configurations") + # Convert MCP server configs to MCPServerInfo objects mcp_servers_info = [] for server_config in mcp_server_configs: @@ -132,16 +146,18 @@ async def add_tool_servers_to_agent( connected_servers.append(mcp_server) existing_server_urls.append(si.url) + self._logger.info(f"Successfully connected to MCP server '{si.name}' at {si.url}") except Exception as e: # Log the error but continue with other servers - print(f"Failed to connect to MCP server {si.name} at {si.url}: {e}") + self._logger.warning(f"Failed to connect to MCP server {si.name} at {si.url}: {e}") continue # If we have new servers, we need to recreate the agent # The OpenAI Agents SDK requires MCP servers to be set during agent creation if new_mcp_servers: try: + self._logger.info(f"Recreating agent with {len(new_mcp_servers)} new MCP servers") all_mcp_servers = existing_mcp_servers + new_mcp_servers # Recreate the agent with all MCP servers @@ -168,14 +184,17 @@ async def add_tool_servers_to_agent( self._connected_servers = [] self._connected_servers.extend(connected_servers) + self._logger.info(f"Agent recreated successfully with {len(all_mcp_servers)} total MCP servers") # Return the new agent (caller needs to replace the old one) return new_agent except Exception as e: # Clean up connected servers if agent creation fails + self._logger.error(f"Failed to recreate agent with new MCP servers: {e}") await self._cleanup_servers(connected_servers) raise e + self._logger.info("No new MCP servers to add to agent") return agent async def _cleanup_servers(self, servers): @@ -184,8 +203,9 @@ async def _cleanup_servers(self, servers): try: if hasattr(server, "cleanup"): await server.cleanup() - except Exception: + except Exception as e: # Log cleanup errors but don't raise them + self._logger.debug(f"Error during server cleanup: {e}") pass async def cleanup_all_servers(self): From 1289d10ea14d0dc327fe34e6a78ce7fb76c62ccf Mon Sep 17 00:00:00 2001 From: Mrunal Hirve Date: Thu, 30 Oct 2025 18:49:34 -0700 Subject: [PATCH 05/20] Fix init for sk --- .../services/mcp_tool_registration_service.py | 14 ++------------ 1 file changed, 2 insertions(+), 12 deletions(-) diff --git a/libraries/microsoft-agents-a365-tooling-extensions-semantickernel/microsoft_agents_a365/tooling/extensions/semantickernel/services/mcp_tool_registration_service.py b/libraries/microsoft-agents-a365-tooling-extensions-semantickernel/microsoft_agents_a365/tooling/extensions/semantickernel/services/mcp_tool_registration_service.py index 92e56d9d..f974e4db 100644 --- a/libraries/microsoft-agents-a365-tooling-extensions-semantickernel/microsoft_agents_a365/tooling/extensions/semantickernel/services/mcp_tool_registration_service.py +++ b/libraries/microsoft-agents-a365-tooling-extensions-semantickernel/microsoft_agents_a365/tooling/extensions/semantickernel/services/mcp_tool_registration_service.py @@ -41,20 +41,15 @@ class McpToolRegistrationService: def __init__( self, logger: Optional[logging.Logger] = None, - service_provider: Optional[Any] = None, - mcp_server_configuration_service: Optional[McpToolServerConfigurationService] = None, ): """ - Initialize the MCP Tool Registration Service. + Initialize the MCP Tool Registration Service for Semantic Kernel. Args: logger: Logger instance for logging operations. - service_provider: Service provider for dependency injection. - mcp_server_configuration_service: Service for MCP server configuration. """ self._logger = logger or logging.getLogger(self.__class__.__name__) - self._service_provider = service_provider - self._mcp_server_configuration_service = mcp_server_configuration_service + self._mcp_server_configuration_service = McpToolServerConfigurationService(logger=self._logger) # Store connected plugins to keep them alive self._connected_plugins = [] @@ -110,11 +105,6 @@ async def add_tool_servers_to_agent( self._validate_inputs(kernel, agent_user_id, environment_id, auth_token) - if self._mcp_server_configuration_service is None: - raise ValueError( - "MCP server configuration service is required but was not provided during initialization" - ) - # Get and process servers servers = await self._mcp_server_configuration_service.list_tool_servers( agent_user_id, environment_id, auth_token From c82e08bfc07695b70cccc2c24a5cded4c5dac3fd Mon Sep 17 00:00:00 2001 From: Mrunal Hirve Date: Thu, 30 Oct 2025 18:57:18 -0700 Subject: [PATCH 06/20] fix --- .../agentframework/services/__init__.py | 2 +- .../services/mcp_tool_registration_service.py | 41 +++++++++++-------- .../openai/mcp_tool_registration_service.py | 16 ++++++-- .../services/mcp_tool_registration_service.py | 4 +- 4 files changed, 40 insertions(+), 23 deletions(-) diff --git a/libraries/microsoft-agents-a365-tooling-extensions-agentframework/microsoft_agents_a365/tooling/extensions/agentframework/services/__init__.py b/libraries/microsoft-agents-a365-tooling-extensions-agentframework/microsoft_agents_a365/tooling/extensions/agentframework/services/__init__.py index ad149fa5..d0ff91ab 100644 --- a/libraries/microsoft-agents-a365-tooling-extensions-agentframework/microsoft_agents_a365/tooling/extensions/agentframework/services/__init__.py +++ b/libraries/microsoft-agents-a365-tooling-extensions-agentframework/microsoft_agents_a365/tooling/extensions/agentframework/services/__init__.py @@ -12,4 +12,4 @@ __all__ = [ "McpToolRegistrationService", -] \ No newline at end of file +] diff --git a/libraries/microsoft-agents-a365-tooling-extensions-agentframework/microsoft_agents_a365/tooling/extensions/agentframework/services/mcp_tool_registration_service.py b/libraries/microsoft-agents-a365-tooling-extensions-agentframework/microsoft_agents_a365/tooling/extensions/agentframework/services/mcp_tool_registration_service.py index 02d833d8..a7b63e7b 100644 --- a/libraries/microsoft-agents-a365-tooling-extensions-agentframework/microsoft_agents_a365/tooling/extensions/agentframework/services/mcp_tool_registration_service.py +++ b/libraries/microsoft-agents-a365-tooling-extensions-agentframework/microsoft_agents_a365/tooling/extensions/agentframework/services/mcp_tool_registration_service.py @@ -11,7 +11,6 @@ from microsoft_agents_a365.tooling.services.mcp_tool_server_configuration_service import ( McpToolServerConfigurationService, ) -from microsoft_agents_a365.tooling.utils.utility import get_ppapi_token_scope from microsoft_agents_a365.tooling.utils.constants import Constants @@ -64,7 +63,9 @@ async def add_tool_servers_to_agent( ChatAgent instance with MCP tools registered, or None if creation failed """ try: - self._logger.info(f"Listing MCP tool servers for agent {agent_user_id} in environment {environment_id}") + self._logger.info( + f"Listing MCP tool servers for agent {agent_user_id} in environment {environment_id}" + ) # Get MCP server configurations server_configs = await self._mcp_server_configuration_service.list_tool_servers( @@ -81,39 +82,45 @@ async def add_tool_servers_to_agent( # Add MCP plugins for each server config for config in server_configs: try: - server_url = getattr(config, 'server_url', None) or getattr(config, 'mcp_server_unique_name', None) + server_url = getattr(config, "server_url", None) or getattr( + config, "mcp_server_unique_name", None + ) if not server_url: self._logger.warning(f"MCP server config missing server_url: {config}") continue - + # Prepare auth headers headers = {} if auth_token: - headers[Constants.Headers.AUTHORIZATION] = f"{Constants.Headers.BEARER_PREFIX} {auth_token}" + headers[Constants.Headers.AUTHORIZATION] = ( + f"{Constants.Headers.BEARER_PREFIX} {auth_token}" + ) if environment_id: headers[Constants.Headers.ENVIRONMENT_ID] = environment_id - - server_name = getattr(config, 'mcp_server_name', 'Unknown') - + + server_name = getattr(config, "mcp_server_name", "Unknown") + # Create and configure MCP plugin mcp_tools = MCPStreamableHTTPTool( name=server_name, url=server_url, headers=headers, - description=f"MCP tools from {server_name}" + description=f"MCP tools from {server_name}", ) - + # Let Agent Framework handle the connection automatically self._logger.info(f"Created MCP plugin for '{server_name}' at {server_url}") - + all_tools.append(mcp_tools) self._connected_servers.append(mcp_tools) - + self._logger.info(f"Added MCP plugin '{server_name}' to agent tools") - + except Exception as tool_ex: - server_name = getattr(config, 'mcp_server_name', 'Unknown') - self._logger.warning(f"Failed to create MCP plugin for {server_name}: {tool_ex}") + server_name = getattr(config, "mcp_server_name", "Unknown") + self._logger.warning( + f"Failed to create MCP plugin for {server_name}: {tool_ex}" + ) continue # Create the ChatAgent @@ -135,10 +142,10 @@ async def cleanup(self): try: for plugin in self._connected_servers: try: - if hasattr(plugin, 'close'): + if hasattr(plugin, "close"): await plugin.close() except Exception as cleanup_ex: self._logger.debug(f"Error during cleanup: {cleanup_ex}") self._connected_servers.clear() except Exception as ex: - self._logger.debug(f"Error during service cleanup: {ex}") \ No newline at end of file + self._logger.debug(f"Error during service cleanup: {ex}") diff --git a/libraries/microsoft-agents-a365-tooling-extensions-openai/microsoft_agents_a365/tooling/extensions/openai/mcp_tool_registration_service.py b/libraries/microsoft-agents-a365-tooling-extensions-openai/microsoft_agents_a365/tooling/extensions/openai/mcp_tool_registration_service.py index 6b781b28..21412cb6 100644 --- a/libraries/microsoft-agents-a365-tooling-extensions-openai/microsoft_agents_a365/tooling/extensions/openai/mcp_tool_registration_service.py +++ b/libraries/microsoft-agents-a365-tooling-extensions-openai/microsoft_agents_a365/tooling/extensions/openai/mcp_tool_registration_service.py @@ -80,7 +80,9 @@ async def add_tool_servers_to_agent( # Get MCP server configurations from the configuration service # mcp_server_configs = [] # TODO: radevika: Update once the common project is merged. - self._logger.info(f"Listing MCP tool servers for agent {agent_user_id} in environment {environment_id}") + self._logger.info( + f"Listing MCP tool servers for agent {agent_user_id} in environment {environment_id}" + ) mcp_server_configs = await self.config_service.list_tool_servers( agent_user_id=agent_user_id, environment_id=environment_id, auth_token=auth_token ) @@ -146,11 +148,15 @@ async def add_tool_servers_to_agent( connected_servers.append(mcp_server) existing_server_urls.append(si.url) - self._logger.info(f"Successfully connected to MCP server '{si.name}' at {si.url}") + self._logger.info( + f"Successfully connected to MCP server '{si.name}' at {si.url}" + ) except Exception as e: # Log the error but continue with other servers - self._logger.warning(f"Failed to connect to MCP server {si.name} at {si.url}: {e}") + self._logger.warning( + f"Failed to connect to MCP server {si.name} at {si.url}: {e}" + ) continue # If we have new servers, we need to recreate the agent @@ -184,7 +190,9 @@ async def add_tool_servers_to_agent( self._connected_servers = [] self._connected_servers.extend(connected_servers) - self._logger.info(f"Agent recreated successfully with {len(all_mcp_servers)} total MCP servers") + self._logger.info( + f"Agent recreated successfully with {len(all_mcp_servers)} total MCP servers" + ) # Return the new agent (caller needs to replace the old one) return new_agent diff --git a/libraries/microsoft-agents-a365-tooling-extensions-semantickernel/microsoft_agents_a365/tooling/extensions/semantickernel/services/mcp_tool_registration_service.py b/libraries/microsoft-agents-a365-tooling-extensions-semantickernel/microsoft_agents_a365/tooling/extensions/semantickernel/services/mcp_tool_registration_service.py index f974e4db..0ff1a4e8 100644 --- a/libraries/microsoft-agents-a365-tooling-extensions-semantickernel/microsoft_agents_a365/tooling/extensions/semantickernel/services/mcp_tool_registration_service.py +++ b/libraries/microsoft-agents-a365-tooling-extensions-semantickernel/microsoft_agents_a365/tooling/extensions/semantickernel/services/mcp_tool_registration_service.py @@ -49,7 +49,9 @@ def __init__( logger: Logger instance for logging operations. """ self._logger = logger or logging.getLogger(self.__class__.__name__) - self._mcp_server_configuration_service = McpToolServerConfigurationService(logger=self._logger) + self._mcp_server_configuration_service = McpToolServerConfigurationService( + logger=self._logger + ) # Store connected plugins to keep them alive self._connected_plugins = [] From c734e460f2ff79951263cbf655695ae4ab202afd Mon Sep 17 00:00:00 2001 From: Mrunal Suyoga Hirve <112517572+mrunalhirve128@users.noreply.github.com> Date: Thu, 30 Oct 2025 19:36:04 -0700 Subject: [PATCH 07/20] Apply suggestion from @Copilot Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- .../tooling/extensions/openai/mcp_tool_registration_service.py | 1 - 1 file changed, 1 deletion(-) diff --git a/libraries/microsoft-agents-a365-tooling-extensions-openai/microsoft_agents_a365/tooling/extensions/openai/mcp_tool_registration_service.py b/libraries/microsoft-agents-a365-tooling-extensions-openai/microsoft_agents_a365/tooling/extensions/openai/mcp_tool_registration_service.py index 21412cb6..c69fffaf 100644 --- a/libraries/microsoft-agents-a365-tooling-extensions-openai/microsoft_agents_a365/tooling/extensions/openai/mcp_tool_registration_service.py +++ b/libraries/microsoft-agents-a365-tooling-extensions-openai/microsoft_agents_a365/tooling/extensions/openai/mcp_tool_registration_service.py @@ -214,7 +214,6 @@ async def _cleanup_servers(self, servers): except Exception as e: # Log cleanup errors but don't raise them self._logger.debug(f"Error during server cleanup: {e}") - pass async def cleanup_all_servers(self): """Clean up all connected MCP servers""" From 609d4d7b964a7176602cee1336250ea99757b772 Mon Sep 17 00:00:00 2001 From: Mrunal Hirve Date: Thu, 30 Oct 2025 19:40:10 -0700 Subject: [PATCH 08/20] push main toml --- pyproject.toml | 1 + 1 file changed, 1 insertion(+) diff --git a/pyproject.toml b/pyproject.toml index 58324dd9..9c7d2391 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -14,6 +14,7 @@ members = [ "libraries/microsoft-agents-a365-tooling-extensions-azureaifoundry", "libraries/microsoft-agents-a365-tooling-extensions-openai", "libraries/microsoft-agents-a365-tooling-extensions-semantickernel", + "libraries/microsoft-agents-a365-tooling-extensions-agentframework", ] exclude = [ ".", From 10b220d3838fb0467ef9f83519de8c0bd4ed5112 Mon Sep 17 00:00:00 2001 From: Mrunal Hirve Date: Thu, 30 Oct 2025 20:01:19 -0700 Subject: [PATCH 09/20] resolve comments --- .../services/mcp_tool_registration_service.py | 6 +++--- .../setup.py | 5 ++--- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/libraries/microsoft-agents-a365-tooling-extensions-agentframework/microsoft_agents_a365/tooling/extensions/agentframework/services/mcp_tool_registration_service.py b/libraries/microsoft-agents-a365-tooling-extensions-agentframework/microsoft_agents_a365/tooling/extensions/agentframework/services/mcp_tool_registration_service.py index a7b63e7b..48c49ef0 100644 --- a/libraries/microsoft-agents-a365-tooling-extensions-agentframework/microsoft_agents_a365/tooling/extensions/agentframework/services/mcp_tool_registration_service.py +++ b/libraries/microsoft-agents-a365-tooling-extensions-agentframework/microsoft_agents_a365/tooling/extensions/agentframework/services/mcp_tool_registration_service.py @@ -79,7 +79,7 @@ async def add_tool_servers_to_agent( # Create the agent with all tools (initial + MCP tools) all_tools = list(initial_tools) - # Add MCP plugins for each server config + # Add servers as MCPStreamableHTTPTool instances for config in server_configs: try: server_url = getattr(config, "server_url", None) or getattr( @@ -100,7 +100,7 @@ async def add_tool_servers_to_agent( server_name = getattr(config, "mcp_server_name", "Unknown") - # Create and configure MCP plugin + # Create and configure MCPStreamableHTTPTool mcp_tools = MCPStreamableHTTPTool( name=server_name, url=server_url, @@ -135,7 +135,7 @@ async def add_tool_servers_to_agent( except Exception as ex: self._logger.error(f"Failed to add tool servers to agent: {ex}") - return None + raise async def cleanup(self): """Clean up any resources used by the service.""" diff --git a/libraries/microsoft-agents-a365-tooling-extensions-agentframework/setup.py b/libraries/microsoft-agents-a365-tooling-extensions-agentframework/setup.py index 8f98673a..ed10edb6 100644 --- a/libraries/microsoft-agents-a365-tooling-extensions-agentframework/setup.py +++ b/libraries/microsoft-agents-a365-tooling-extensions-agentframework/setup.py @@ -1,5 +1,4 @@ -# Copyright (c) Microsoft Corporation. -# Licensed under the MIT License. +# Copyright (c) Microsoft. All rights reserved. import os from datetime import datetime @@ -28,4 +27,4 @@ def build_version(): setup( version=VERSION, -) +) \ No newline at end of file From b8badbd64f3aea516939c9584ea52bb09b78f790 Mon Sep 17 00:00:00 2001 From: Mrunal Hirve Date: Thu, 30 Oct 2025 20:04:32 -0700 Subject: [PATCH 10/20] fix --- .../pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/microsoft-agents-a365-tooling-extensions-agentframework/pyproject.toml b/libraries/microsoft-agents-a365-tooling-extensions-agentframework/pyproject.toml index 9ea5d7a2..a8f25d9c 100644 --- a/libraries/microsoft-agents-a365-tooling-extensions-agentframework/pyproject.toml +++ b/libraries/microsoft-agents-a365-tooling-extensions-agentframework/pyproject.toml @@ -24,7 +24,7 @@ classifiers = [ license = "MIT" dependencies = [ "microsoft-agents-a365-tooling >= 0.1.0", - "microsoft-agents-hosting >= 0.1.0", + "microsoft-agents-hosting-core >= 0.4.0", "agent-framework-azure-ai >= 0.1.0", "azure-identity >= 1.12.0", "typing-extensions >= 4.0.0", From bb11f4388779ee4ee2dcff3476b661ce9b3b7374 Mon Sep 17 00:00:00 2001 From: Mrunal Hirve Date: Thu, 30 Oct 2025 20:16:58 -0700 Subject: [PATCH 11/20] fix --- .../README.md | 7 ++----- .../tooling/extensions/agentframework/__init__.py | 3 +-- .../tooling/extensions/agentframework/services/__init__.py | 3 +-- .../services/mcp_tool_registration_service.py | 3 +-- .../pyproject.toml | 2 ++ 5 files changed, 7 insertions(+), 11 deletions(-) diff --git a/libraries/microsoft-agents-a365-tooling-extensions-agentframework/README.md b/libraries/microsoft-agents-a365-tooling-extensions-agentframework/README.md index af234b7a..4412eeee 100644 --- a/libraries/microsoft-agents-a365-tooling-extensions-agentframework/README.md +++ b/libraries/microsoft-agents-a365-tooling-extensions-agentframework/README.md @@ -102,16 +102,13 @@ from microsoft_agents_a365.tooling.extensions.agentframework import ( ) async def main(): - # Initialize with custom logger and credentials + # Initialize with custom logger import logging - from azure.identity import DefaultAzureCredential logger = logging.getLogger("my-agent") - credential = DefaultAzureCredential() service = McpToolRegistrationService( - logger=logger, - credential=credential + logger=logger ) # Create Azure OpenAI chat client diff --git a/libraries/microsoft-agents-a365-tooling-extensions-agentframework/microsoft_agents_a365/tooling/extensions/agentframework/__init__.py b/libraries/microsoft-agents-a365-tooling-extensions-agentframework/microsoft_agents_a365/tooling/extensions/agentframework/__init__.py index c4ba4378..b06cfe4e 100644 --- a/libraries/microsoft-agents-a365-tooling-extensions-agentframework/microsoft_agents_a365/tooling/extensions/agentframework/__init__.py +++ b/libraries/microsoft-agents-a365-tooling-extensions-agentframework/microsoft_agents_a365/tooling/extensions/agentframework/__init__.py @@ -1,5 +1,4 @@ -# Copyright (c) Microsoft Corporation. -# Licensed under the MIT License. +# Copyright (c) Microsoft. All rights reserved. """ Agent 365 Tooling Agent Framework Extensions diff --git a/libraries/microsoft-agents-a365-tooling-extensions-agentframework/microsoft_agents_a365/tooling/extensions/agentframework/services/__init__.py b/libraries/microsoft-agents-a365-tooling-extensions-agentframework/microsoft_agents_a365/tooling/extensions/agentframework/services/__init__.py index d0ff91ab..6f38d194 100644 --- a/libraries/microsoft-agents-a365-tooling-extensions-agentframework/microsoft_agents_a365/tooling/extensions/agentframework/services/__init__.py +++ b/libraries/microsoft-agents-a365-tooling-extensions-agentframework/microsoft_agents_a365/tooling/extensions/agentframework/services/__init__.py @@ -1,5 +1,4 @@ -# Copyright (c) Microsoft Corporation. -# Licensed under the MIT License. +# Copyright (c) Microsoft. All rights reserved. """ Services module for Agent Framework tooling. diff --git a/libraries/microsoft-agents-a365-tooling-extensions-agentframework/microsoft_agents_a365/tooling/extensions/agentframework/services/mcp_tool_registration_service.py b/libraries/microsoft-agents-a365-tooling-extensions-agentframework/microsoft_agents_a365/tooling/extensions/agentframework/services/mcp_tool_registration_service.py index 48c49ef0..7d1b7c4c 100644 --- a/libraries/microsoft-agents-a365-tooling-extensions-agentframework/microsoft_agents_a365/tooling/extensions/agentframework/services/mcp_tool_registration_service.py +++ b/libraries/microsoft-agents-a365-tooling-extensions-agentframework/microsoft_agents_a365/tooling/extensions/agentframework/services/mcp_tool_registration_service.py @@ -1,5 +1,4 @@ -# Copyright (c) Microsoft Corporation. -# Licensed under the MIT License. +# Copyright (c) Microsoft. All rights reserved. from typing import Optional, List, Any import logging diff --git a/libraries/microsoft-agents-a365-tooling-extensions-agentframework/pyproject.toml b/libraries/microsoft-agents-a365-tooling-extensions-agentframework/pyproject.toml index a8f25d9c..0799fedd 100644 --- a/libraries/microsoft-agents-a365-tooling-extensions-agentframework/pyproject.toml +++ b/libraries/microsoft-agents-a365-tooling-extensions-agentframework/pyproject.toml @@ -28,6 +28,8 @@ dependencies = [ "agent-framework-azure-ai >= 0.1.0", "azure-identity >= 1.12.0", "typing-extensions >= 4.0.0", + "protobuf >= 5.0.0", + "googleapis-common-protos >= 1.60.0", ] [project.urls] From 313c90434e3ddab8e59c63ca486d5078b3bdaba9 Mon Sep 17 00:00:00 2001 From: Mrunal Suyoga Hirve <112517572+mrunalhirve128@users.noreply.github.com> Date: Thu, 30 Oct 2025 20:21:00 -0700 Subject: [PATCH 12/20] Update libraries/microsoft-agents-a365-tooling-extensions-openai/microsoft_agents_a365/tooling/extensions/openai/mcp_tool_registration_service.py Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- .../tooling/extensions/openai/mcp_tool_registration_service.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/libraries/microsoft-agents-a365-tooling-extensions-openai/microsoft_agents_a365/tooling/extensions/openai/mcp_tool_registration_service.py b/libraries/microsoft-agents-a365-tooling-extensions-openai/microsoft_agents_a365/tooling/extensions/openai/mcp_tool_registration_service.py index c69fffaf..b13bf982 100644 --- a/libraries/microsoft-agents-a365-tooling-extensions-openai/microsoft_agents_a365/tooling/extensions/openai/mcp_tool_registration_service.py +++ b/libraries/microsoft-agents-a365-tooling-extensions-openai/microsoft_agents_a365/tooling/extensions/openai/mcp_tool_registration_service.py @@ -1,5 +1,4 @@ -# Copyright (c) Microsoft Corporation. -# Licensed under the MIT License. +# Copyright (c) Microsoft. All rights reserved. from typing import Dict, Optional from dataclasses import dataclass From 320d67a985686b63b1281347db2fa45c965c814a Mon Sep 17 00:00:00 2001 From: Mrunal Hirve Date: Thu, 30 Oct 2025 20:28:03 -0700 Subject: [PATCH 13/20] test --- .../pyproject.toml | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/libraries/microsoft-agents-a365-tooling-extensions-agentframework/pyproject.toml b/libraries/microsoft-agents-a365-tooling-extensions-agentframework/pyproject.toml index 0799fedd..9c43a8d6 100644 --- a/libraries/microsoft-agents-a365-tooling-extensions-agentframework/pyproject.toml +++ b/libraries/microsoft-agents-a365-tooling-extensions-agentframework/pyproject.toml @@ -24,12 +24,10 @@ classifiers = [ license = "MIT" dependencies = [ "microsoft-agents-a365-tooling >= 0.1.0", - "microsoft-agents-hosting-core >= 0.4.0", + "microsoft-agents-hosting-core >= 0.4.0, < 0.6.0", "agent-framework-azure-ai >= 0.1.0", "azure-identity >= 1.12.0", "typing-extensions >= 4.0.0", - "protobuf >= 5.0.0", - "googleapis-common-protos >= 1.60.0", ] [project.urls] From 5cb7e41dd5ce3bef7264c5d04d14316e7f441c59 Mon Sep 17 00:00:00 2001 From: Mrunal Hirve Date: Thu, 30 Oct 2025 20:37:03 -0700 Subject: [PATCH 14/20] Pr comment --- .../services/mcp_tool_registration_service.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/libraries/microsoft-agents-a365-tooling-extensions-agentframework/microsoft_agents_a365/tooling/extensions/agentframework/services/mcp_tool_registration_service.py b/libraries/microsoft-agents-a365-tooling-extensions-agentframework/microsoft_agents_a365/tooling/extensions/agentframework/services/mcp_tool_registration_service.py index 7d1b7c4c..50237f6b 100644 --- a/libraries/microsoft-agents-a365-tooling-extensions-agentframework/microsoft_agents_a365/tooling/extensions/agentframework/services/mcp_tool_registration_service.py +++ b/libraries/microsoft-agents-a365-tooling-extensions-agentframework/microsoft_agents_a365/tooling/extensions/agentframework/services/mcp_tool_registration_service.py @@ -1,9 +1,11 @@ # Copyright (c) Microsoft. All rights reserved. -from typing import Optional, List, Any +from typing import Optional, List, Any, Union import logging from agent_framework import ChatAgent, MCPStreamableHTTPTool +from agent_framework.azure import AzureOpenAIChatClient +from agent_framework.openai import OpenAIChatClient from microsoft_agents.hosting.core import Authorization, TurnContext @@ -36,7 +38,7 @@ def __init__(self, logger: Optional[logging.Logger] = None): async def add_tool_servers_to_agent( self, - chat_client: Any, # OpenAIChatClient or AzureOpenAIChatClient + chat_client: Union[OpenAIChatClient, AzureOpenAIChatClient], agent_instructions: str, initial_tools: List[Any], agent_user_id: str, @@ -49,7 +51,7 @@ async def add_tool_servers_to_agent( Add MCP tool servers to a chat agent (mirrors .NET implementation). Args: - chat_client: The chat client instance (OpenAI or Azure OpenAI) + chat_client: The chat client instance (Union[OpenAIChatClient, AzureOpenAIChatClient]) agent_instructions: Instructions for the agent behavior initial_tools: List of initial tools to add to the agent agent_user_id: Unique identifier for the agent user From 0f97ac2e3fa2f45e2c5a63ff856b166c62b900b2 Mon Sep 17 00:00:00 2001 From: Mrunal Suyoga Hirve <112517572+mrunalhirve128@users.noreply.github.com> Date: Thu, 30 Oct 2025 20:41:30 -0700 Subject: [PATCH 15/20] Update libraries/microsoft-agents-a365-tooling-extensions-agentframework/pyproject.toml Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- .../pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/microsoft-agents-a365-tooling-extensions-agentframework/pyproject.toml b/libraries/microsoft-agents-a365-tooling-extensions-agentframework/pyproject.toml index 9c43a8d6..0fbf2b0a 100644 --- a/libraries/microsoft-agents-a365-tooling-extensions-agentframework/pyproject.toml +++ b/libraries/microsoft-agents-a365-tooling-extensions-agentframework/pyproject.toml @@ -34,7 +34,7 @@ dependencies = [ Homepage = "https://github.com/microsoft/Agent365" Repository = "https://github.com/microsoft/Agent365" Issues = "https://github.com/microsoft/Agent365/issues" -Documentation = "https://github.com/microsoft/Agent365/tree/main/python/microsoft_agents_a365/tooling/agentframework" +Documentation = "https://github.com/microsoft/Agent365/tree/main/libraries/microsoft-agents-a365-tooling-extensions-agentframework" [project.optional-dependencies] dev = [ From bdc99f078713dec88d3914ca8a86523d568f975c Mon Sep 17 00:00:00 2001 From: Mrunal Suyoga Hirve <112517572+mrunalhirve128@users.noreply.github.com> Date: Thu, 30 Oct 2025 21:02:30 -0700 Subject: [PATCH 16/20] Update libraries/microsoft-agents-a365-tooling-extensions-agentframework/README.md Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- .../README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/microsoft-agents-a365-tooling-extensions-agentframework/README.md b/libraries/microsoft-agents-a365-tooling-extensions-agentframework/README.md index 4412eeee..512d61dc 100644 --- a/libraries/microsoft-agents-a365-tooling-extensions-agentframework/README.md +++ b/libraries/microsoft-agents-a365-tooling-extensions-agentframework/README.md @@ -265,7 +265,7 @@ We welcome contributions! Please see our [Contributing Guide](../../CONTRIBUTING ## License -This project is licensed under the MIT License. See the [LICENSE](../../LICENSE.md) file for details. +This project is licensed under the MIT License. See the [LICENSE](https://github.com/microsoft/Agent365/blob/main/LICENSE.md) file for details. ## Support From 4338e58a44b95cefafc8b209d73327b8f75194ea Mon Sep 17 00:00:00 2001 From: Mrunal Suyoga Hirve <112517572+mrunalhirve128@users.noreply.github.com> Date: Thu, 30 Oct 2025 21:02:46 -0700 Subject: [PATCH 17/20] Update libraries/microsoft-agents-a365-tooling-extensions-agentframework/README.md Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- .../README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/microsoft-agents-a365-tooling-extensions-agentframework/README.md b/libraries/microsoft-agents-a365-tooling-extensions-agentframework/README.md index 512d61dc..7d98d56a 100644 --- a/libraries/microsoft-agents-a365-tooling-extensions-agentframework/README.md +++ b/libraries/microsoft-agents-a365-tooling-extensions-agentframework/README.md @@ -261,7 +261,7 @@ mypy microsoft_agents_a365/ ## Contributing -We welcome contributions! Please see our [Contributing Guide](../../CONTRIBUTING.md) for details. +We welcome contributions! Feel free to open issues or submit pull requests to help improve this project. ## License From c7baa680630aa1b80b9ba0c683006ad4ae9993e7 Mon Sep 17 00:00:00 2001 From: Mrunal Hirve Date: Fri, 31 Oct 2025 10:02:10 -0700 Subject: [PATCH 18/20] Test --- .../pyproject.toml | 12 +- .../pyproject.toml | 6 +- .../pyproject.toml | 6 +- .../pyproject.toml | 6 +- uv.lock | 455 ++++++++++++++---- 5 files changed, 381 insertions(+), 104 deletions(-) diff --git a/libraries/microsoft-agents-a365-observability-core/pyproject.toml b/libraries/microsoft-agents-a365-observability-core/pyproject.toml index dd7df79b..79e2684c 100644 --- a/libraries/microsoft-agents-a365-observability-core/pyproject.toml +++ b/libraries/microsoft-agents-a365-observability-core/pyproject.toml @@ -25,9 +25,9 @@ classifiers = [ license = "MIT" keywords = ["observability", "telemetry", "tracing", "opentelemetry", "monitoring", "ai", "agents"] dependencies = [ - "opentelemetry-api >= 1.20.0", - "opentelemetry-sdk >= 1.20.0", - "opentelemetry-exporter-otlp >= 1.20.0", + "opentelemetry-api >= 1.36.0", + "opentelemetry-sdk >= 1.36.0", + "opentelemetry-exporter-otlp >= 1.36.0", "pydantic >= 2.0.0", "typing-extensions >= 4.0.0", "microsoft-agents-a365-runtime >= 2025.10.16" @@ -45,8 +45,12 @@ azure = [ "azure-identity >= 1.12.0", "azure-monitor-ingestion >= 1.0.0", ] +# jaeger = [ +# "opentelemetry-exporter-jaeger >= 1.20.0", +# ] +# Modern approach: use OTLP exporter to send to Jaeger (since Jaeger v1.35+ supports OTLP natively) jaeger = [ - "opentelemetry-exporter-jaeger >= 1.20.0", + "opentelemetry-exporter-otlp-proto-grpc >= 1.36.0", ] dev = [ "pytest >= 7.0.0", diff --git a/libraries/microsoft-agents-a365-observability-extensions-langchain/pyproject.toml b/libraries/microsoft-agents-a365-observability-extensions-langchain/pyproject.toml index 9a73c0ae..b3151933 100644 --- a/libraries/microsoft-agents-a365-observability-extensions-langchain/pyproject.toml +++ b/libraries/microsoft-agents-a365-observability-extensions-langchain/pyproject.toml @@ -28,9 +28,9 @@ dependencies = [ "microsoft-agents-a365-observability-core >= 2025.10.16", "langchain >= 0.1.0", "langchain-core >= 0.1.0", - "opentelemetry-api >= 1.20.0", - "opentelemetry-sdk >= 1.20.0", - "opentelemetry-instrumentation >= 0.41b0", + "opentelemetry-api >= 1.36.0", + "opentelemetry-sdk >= 1.36.0", + "opentelemetry-instrumentation >= 0.47b0", ] [project.urls] diff --git a/libraries/microsoft-agents-a365-observability-extensions-openai/pyproject.toml b/libraries/microsoft-agents-a365-observability-extensions-openai/pyproject.toml index 6ede0ac9..7ca862e6 100644 --- a/libraries/microsoft-agents-a365-observability-extensions-openai/pyproject.toml +++ b/libraries/microsoft-agents-a365-observability-extensions-openai/pyproject.toml @@ -27,9 +27,9 @@ keywords = ["observability", "telemetry", "tracing", "opentelemetry", "openai", dependencies = [ "microsoft-agents-a365-observability-core >= 2025.10.16", "openai-agents >= 0.2.6", - "opentelemetry-api >= 1.20.0", - "opentelemetry-sdk >= 1.20.0", - "opentelemetry-instrumentation >= 0.41b0", + "opentelemetry-api >= 1.36.0", + "opentelemetry-sdk >= 1.36.0", + "opentelemetry-instrumentation >= 0.47b0", ] [project.urls] diff --git a/libraries/microsoft-agents-a365-observability-extensions-semantickernel/pyproject.toml b/libraries/microsoft-agents-a365-observability-extensions-semantickernel/pyproject.toml index e291001d..540048f3 100644 --- a/libraries/microsoft-agents-a365-observability-extensions-semantickernel/pyproject.toml +++ b/libraries/microsoft-agents-a365-observability-extensions-semantickernel/pyproject.toml @@ -27,9 +27,9 @@ keywords = ["observability", "telemetry", "tracing", "opentelemetry", "semantic- dependencies = [ "microsoft-agents-a365-observability-core >= 2025.10.16", "semantic-kernel >= 1.0.0", - "opentelemetry-api >= 1.20.0", - "opentelemetry-sdk >= 1.20.0", - "opentelemetry-instrumentation >= 0.41b0", + "opentelemetry-api >= 1.36.0", + "opentelemetry-sdk >= 1.36.0", + "opentelemetry-instrumentation >= 0.47b0", ] [project.urls] diff --git a/uv.lock b/uv.lock index 864267b8..63122299 100644 --- a/uv.lock +++ b/uv.lock @@ -16,11 +16,60 @@ members = [ "microsoft-agents-a365-observability-extensions-semantic-kernel", "microsoft-agents-a365-runtime", "microsoft-agents-a365-tooling", + "microsoft-agents-a365-tooling-extensions-agentframework", "microsoft-agents-a365-tooling-extensions-azureaifoundry", "microsoft-agents-a365-tooling-extensions-openai", "microsoft-agents-a365-tooling-extensions-semantickernel", ] +[[package]] +name = "agent-framework-azure-ai" +version = "1.0.0b251028" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "agent-framework-core" }, + { name = "aiohttp" }, + { name = "azure-ai-agents" }, + { name = "azure-ai-projects" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/95/90/aff52df23aa2e5400ffd25b3ed5435f751d3ff1eac0d55070763d67c704b/agent_framework_azure_ai-1.0.0b251028.tar.gz", hash = "sha256:de0e910f611c144fcdea489755c572c2724adde67abf17d780010eb9e3e60d84", size = 27719, upload-time = "2025-10-28T19:39:21.829Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9b/c2/bd5673521fc954e20210b6c316b2317b1ea9098d4be63263defbac542e68/agent_framework_azure_ai-1.0.0b251028-py3-none-any.whl", hash = "sha256:977b47ef3b89ff000c2e00278389523295fafe755e69bcf040bda68068416fa1", size = 13907, upload-time = "2025-10-28T19:39:20.255Z" }, +] + +[[package]] +name = "agent-framework-core" +version = "1.0.0b251028" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "aiofiles" }, + { name = "azure-identity" }, + { name = "azure-monitor-opentelemetry" }, + { name = "azure-monitor-opentelemetry-exporter" }, + { name = "mcp", extra = ["ws"] }, + { name = "openai" }, + { name = "opentelemetry-api" }, + { name = "opentelemetry-exporter-otlp-proto-grpc" }, + { name = "opentelemetry-sdk" }, + { name = "opentelemetry-semantic-conventions-ai" }, + { name = "pydantic" }, + { name = "pydantic-settings" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/8f/f4/af984c341e8c1cc802cbf3c11dea4b2bb99ee13fe074e2b413aa550771c1/agent_framework_core-1.0.0b251028.tar.gz", hash = "sha256:f291a398a283e236e8d0f1048a717a87d1bc351432ac40a2e7de7781ba5c6a70", size = 443690, upload-time = "2025-10-28T19:39:25.162Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/27/26/5f5aa44dbe0a03b9cb99bf72db5f5a5ecd37e22f80b0870f096ae34fd3fd/agent_framework_core-1.0.0b251028-py3-none-any.whl", hash = "sha256:4c5f71ff11703452144db69904ab54ddcf084f099b81df0bc0b4c5c341ee8467", size = 313387, upload-time = "2025-10-28T19:39:23.964Z" }, +] + +[[package]] +name = "aiofiles" +version = "25.1.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/41/c3/534eac40372d8ee36ef40df62ec129bee4fdb5ad9706e58a29be53b2c970/aiofiles-25.1.0.tar.gz", hash = "sha256:a8d728f0a29de45dc521f18f07297428d56992a742f0cd2701ba86e44d23d5b2", size = 46354, upload-time = "2025-10-09T20:51:04.358Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/bc/8a/340a1555ae33d7354dbca4faa54948d76d89a27ceef032c8c3bc661d003e/aiofiles-25.1.0-py3-none-any.whl", hash = "sha256:abe311e527c862958650f9438e859c1fa7568a141b22abcd015e120e86a85695", size = 14668, upload-time = "2025-10-09T20:51:03.174Z" }, +] + [[package]] name = "aiohappyeyeballs" version = "2.6.1" @@ -199,6 +248,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/6f/12/e5e0282d673bb9746bacfb6e2dba8719989d3660cdb2ea79aee9a9651afb/anyio-4.10.0-py3-none-any.whl", hash = "sha256:60e474ac86736bbfd6f210f7a61218939c318f43f9972497381f1c5e930ed3d1", size = 107213, upload-time = "2025-08-04T08:54:24.882Z" }, ] +[[package]] +name = "asgiref" +version = "3.10.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/46/08/4dfec9b90758a59acc6be32ac82e98d1fbfc321cb5cfa410436dbacf821c/asgiref-3.10.0.tar.gz", hash = "sha256:d89f2d8cd8b56dada7d52fa7dc8075baa08fb836560710d38c292a7a3f78c04e", size = 37483, upload-time = "2025-10-05T09:15:06.557Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/17/9c/fc2331f538fbf7eedba64b2052e99ccf9ba9d6888e2f41441ee28847004b/asgiref-3.10.0-py3-none-any.whl", hash = "sha256:aef8a81283a34d0ab31630c9b7dfe70c812c95eba78171367ca8745e88124734", size = 24050, upload-time = "2025-10-05T09:15:05.11Z" }, +] + [[package]] name = "asyncio-throttle" version = "1.0.2" @@ -311,6 +369,19 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/27/52/805980aa1ba18282077c484dba634ef0ede1e84eec8be9c92b2e162d0ed6/azure_core-1.35.1-py3-none-any.whl", hash = "sha256:12da0c9e08e48e198f9158b56ddbe33b421477e1dc98c2e1c8f9e254d92c468b", size = 211800, upload-time = "2025-09-11T22:58:06.281Z" }, ] +[[package]] +name = "azure-core-tracing-opentelemetry" +version = "1.0.0b12" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "azure-core" }, + { name = "opentelemetry-api" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/5a/7f/5de13a331a5f2919417819cc37dcf7c897018f02f83aa82b733e6629a6a6/azure_core_tracing_opentelemetry-1.0.0b12.tar.gz", hash = "sha256:bb454142440bae11fd9d68c7c1d67ae38a1756ce808c5e4d736730a7b4b04144", size = 26010, upload-time = "2025-03-21T00:18:37.346Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/76/5e/97a471f66935e7f89f521d0e11ae49c7f0871ca38f5c319dccae2155c8d8/azure_core_tracing_opentelemetry-1.0.0b12-py3-none-any.whl", hash = "sha256:38fd42709f1cc4bbc4f2797008b1c30a6a01617e49910c05daa3a0d0c65053ac", size = 11962, upload-time = "2025-03-21T00:18:38.581Z" }, +] + [[package]] name = "azure-identity" version = "1.25.0" @@ -341,9 +412,32 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/f7/9f/e9a55bbe647aceeaf78f1bf48e00699b8d5135dd6756af9f98dc7b4fa005/azure_monitor_ingestion-1.1.0-py3-none-any.whl", hash = "sha256:41765fb3df8e0933f1a7eaf1cb0a5f30acce856afa8831bfa4777ad26594f019", size = 57560, upload-time = "2025-07-18T23:26:51.948Z" }, ] +[[package]] +name = "azure-monitor-opentelemetry" +version = "1.8.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "azure-core" }, + { name = "azure-core-tracing-opentelemetry" }, + { name = "azure-monitor-opentelemetry-exporter" }, + { name = "opentelemetry-instrumentation-django" }, + { name = "opentelemetry-instrumentation-fastapi" }, + { name = "opentelemetry-instrumentation-flask" }, + { name = "opentelemetry-instrumentation-psycopg2" }, + { name = "opentelemetry-instrumentation-requests" }, + { name = "opentelemetry-instrumentation-urllib" }, + { name = "opentelemetry-instrumentation-urllib3" }, + { name = "opentelemetry-resource-detector-azure" }, + { name = "opentelemetry-sdk" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/55/ae/eae89705498c975b1cfcc2ce0e5bfbe784a47ffd54cef6fbebe31fdb2295/azure_monitor_opentelemetry-1.8.1.tar.gz", hash = "sha256:9b93b62868775d74db60d9e997cfccc5898260c5de23278d7e99cce3764e9fda", size = 53471, upload-time = "2025-09-16T20:30:22.587Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/85/ab/d063f5d0debbb01ef716789f5b4b315d58f657dd5dbf15e47ca6648a557b/azure_monitor_opentelemetry-1.8.1-py3-none-any.whl", hash = "sha256:bebca6af9d81ddc52df59b281a5acc84182bbf1cbccd6f843a2074f6e283947e", size = 27169, upload-time = "2025-09-16T20:30:23.794Z" }, +] + [[package]] name = "azure-monitor-opentelemetry-exporter" -version = "1.0.0b40" +version = "1.0.0b44" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "azure-core" }, @@ -354,9 +448,9 @@ dependencies = [ { name = "opentelemetry-sdk" }, { name = "psutil" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/5b/82/b7e438cb3e8eb179a7f8933431c76790a29d926522944dcef97f62312a7a/azure_monitor_opentelemetry_exporter-1.0.0b40.tar.gz", hash = "sha256:4727aff433df0fe991cb98a8a7d51358d67bc59908ddd9c024b2e916c854053b", size = 201312, upload-time = "2025-07-17T21:51:37.078Z" } +sdist = { url = "https://files.pythonhosted.org/packages/3e/9a/acb253869ef59482c628f4dc7e049323d0026a9374adf7b398d0b04b6094/azure_monitor_opentelemetry_exporter-1.0.0b44.tar.gz", hash = "sha256:9b0f430a6a46a78bf757ae301488c10c1996f1bd6c5c01a07b9d33583cc4fa4b", size = 271712, upload-time = "2025-10-14T00:27:20.869Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/32/74/2eaa35844ecad4f053a4ef00a586b08307c63613244a51e9ce756b2e0cbe/azure_monitor_opentelemetry_exporter-1.0.0b40-py2.py3-none-any.whl", hash = "sha256:304fcda99499fb679e701d0bd034e3a8787b146548fd05154056fd0453796303", size = 159995, upload-time = "2025-07-17T21:51:38.568Z" }, + { url = "https://files.pythonhosted.org/packages/4a/46/31809698a0d50559fde108a4f4cb2d9532967ae514a113dba39763e048b7/azure_monitor_opentelemetry_exporter-1.0.0b44-py2.py3-none-any.whl", hash = "sha256:82d23081bf007acab8d4861229ab482e4666307a29492fbf0bf19981b4d37024", size = 198516, upload-time = "2025-10-14T00:27:22.379Z" }, ] [[package]] @@ -800,14 +894,14 @@ wheels = [ [[package]] name = "googleapis-common-protos" -version = "1.56.1" +version = "1.71.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "protobuf" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/a6/65/e178ee378323aabdd3a283d9030dc39872de6ee3500bec853f302d3987a0/googleapis-common-protos-1.56.1.tar.gz", hash = "sha256:6b5ee59dc646eb61a8eb65ee1db186d3df6687c8804830024f32573298bca19b", size = 109702, upload-time = "2022-05-12T20:10:27.839Z" } +sdist = { url = "https://files.pythonhosted.org/packages/30/43/b25abe02db2911397819003029bef768f68a974f2ece483e6084d1a5f754/googleapis_common_protos-1.71.0.tar.gz", hash = "sha256:1aec01e574e29da63c80ba9f7bbf1ccfaacf1da877f23609fe236ca7c72a2e2e", size = 146454, upload-time = "2025-10-20T14:58:08.732Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/00/11/2a8d766a5b2378e243fdce6b7e74cc961594a8cf1c3d6ddab1ef99cbb717/googleapis_common_protos-1.56.1-py2.py3-none-any.whl", hash = "sha256:ddcd955b5bb6589368f659fa475373faa1ed7d09cde5ba25e88513d87007e174", size = 211748, upload-time = "2022-05-12T20:10:26.232Z" }, + { url = "https://files.pythonhosted.org/packages/25/e8/eba9fece11d57a71e3e22ea672742c8f3cf23b35730c9e96db768b295216/googleapis_common_protos-1.71.0-py3-none-any.whl", hash = "sha256:59034a1d849dc4d18971997a72ac56246570afdd17f9369a0ff68218d50ab78c", size = 294576, upload-time = "2025-10-20T14:56:21.295Z" }, ] [[package]] @@ -1333,6 +1427,11 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/04/7b/84b0dd4c2c5a499d2c5d63fb7a1224c25fc4c8b6c24623fa7a566471480d/mcp-1.14.0-py3-none-any.whl", hash = "sha256:b2d27feba27b4c53d41b58aa7f4d090ae0cb740cbc4e339af10f8cbe54c4e19d", size = 163805, upload-time = "2025-09-11T17:40:46.891Z" }, ] +[package.optional-dependencies] +ws = [ + { name = "websockets" }, +] + [[package]] name = "microsoft-agents-a365-notifications" source = { editable = "libraries/microsoft-agents-a365-notifications" } @@ -1397,9 +1496,6 @@ dev = [ { name = "pytest-asyncio" }, { name = "ruff" }, ] -jaeger = [ - { name = "opentelemetry-exporter-jaeger" }, -] test = [ { name = "pytest" }, { name = "pytest-asyncio" }, @@ -1413,10 +1509,9 @@ requires-dist = [ { name = "black", marker = "extra == 'dev'", specifier = ">=23.0.0" }, { name = "microsoft-agents-a365-runtime", editable = "libraries/microsoft-agents-a365-runtime" }, { name = "mypy", marker = "extra == 'dev'", specifier = ">=1.0.0" }, - { name = "opentelemetry-api", specifier = ">=1.20.0" }, - { name = "opentelemetry-exporter-jaeger", marker = "extra == 'jaeger'", specifier = ">=1.20.0" }, - { name = "opentelemetry-exporter-otlp", specifier = ">=1.20.0" }, - { name = "opentelemetry-sdk", specifier = ">=1.20.0" }, + { name = "opentelemetry-api", specifier = ">=1.36.0" }, + { name = "opentelemetry-exporter-otlp", specifier = ">=1.36.0" }, + { name = "opentelemetry-sdk", specifier = ">=1.36.0" }, { name = "pydantic", specifier = ">=2.0.0" }, { name = "pytest", marker = "extra == 'dev'", specifier = ">=7.0.0" }, { name = "pytest", marker = "extra == 'test'", specifier = ">=7.0.0" }, @@ -1425,7 +1520,7 @@ requires-dist = [ { name = "ruff", marker = "extra == 'dev'", specifier = ">=0.1.0" }, { name = "typing-extensions", specifier = ">=4.0.0" }, ] -provides-extras = ["azure", "jaeger", "dev", "test"] +provides-extras = ["azure", "dev", "test"] [[package]] name = "microsoft-agents-a365-observability-extensions-langchain" @@ -1459,9 +1554,9 @@ requires-dist = [ { name = "langchain-core", specifier = ">=0.1.0" }, { name = "microsoft-agents-a365-observability-core", editable = "libraries/microsoft-agents-a365-observability-core" }, { name = "mypy", marker = "extra == 'dev'", specifier = ">=1.0.0" }, - { name = "opentelemetry-api", specifier = ">=1.20.0" }, - { name = "opentelemetry-instrumentation", specifier = ">=0.41b0" }, - { name = "opentelemetry-sdk", specifier = ">=1.20.0" }, + { name = "opentelemetry-api", specifier = ">=1.36.0" }, + { name = "opentelemetry-instrumentation", specifier = ">=0.47b0" }, + { name = "opentelemetry-sdk", specifier = ">=1.36.0" }, { name = "pytest", marker = "extra == 'dev'", specifier = ">=7.0.0" }, { name = "pytest", marker = "extra == 'test'", specifier = ">=7.0.0" }, { name = "pytest-asyncio", marker = "extra == 'dev'", specifier = ">=0.21.0" }, @@ -1500,9 +1595,9 @@ requires-dist = [ { name = "microsoft-agents-a365-observability-core", editable = "libraries/microsoft-agents-a365-observability-core" }, { name = "mypy", marker = "extra == 'dev'", specifier = ">=1.0.0" }, { name = "openai-agents", specifier = ">=0.2.6" }, - { name = "opentelemetry-api", specifier = ">=1.20.0" }, - { name = "opentelemetry-instrumentation", specifier = ">=0.41b0" }, - { name = "opentelemetry-sdk", specifier = ">=1.20.0" }, + { name = "opentelemetry-api", specifier = ">=1.36.0" }, + { name = "opentelemetry-instrumentation", specifier = ">=0.47b0" }, + { name = "opentelemetry-sdk", specifier = ">=1.36.0" }, { name = "pytest", marker = "extra == 'dev'", specifier = ">=7.0.0" }, { name = "pytest", marker = "extra == 'test'", specifier = ">=7.0.0" }, { name = "pytest-asyncio", marker = "extra == 'dev'", specifier = ">=0.21.0" }, @@ -1540,9 +1635,9 @@ requires-dist = [ { name = "black", marker = "extra == 'dev'", specifier = ">=23.0.0" }, { name = "microsoft-agents-a365-observability-core", editable = "libraries/microsoft-agents-a365-observability-core" }, { name = "mypy", marker = "extra == 'dev'", specifier = ">=1.0.0" }, - { name = "opentelemetry-api", specifier = ">=1.20.0" }, - { name = "opentelemetry-instrumentation", specifier = ">=0.41b0" }, - { name = "opentelemetry-sdk", specifier = ">=1.20.0" }, + { name = "opentelemetry-api", specifier = ">=1.36.0" }, + { name = "opentelemetry-instrumentation", specifier = ">=0.47b0" }, + { name = "opentelemetry-sdk", specifier = ">=1.36.0" }, { name = "pytest", marker = "extra == 'dev'", specifier = ">=7.0.0" }, { name = "pytest", marker = "extra == 'test'", specifier = ">=7.0.0" }, { name = "pytest-asyncio", marker = "extra == 'dev'", specifier = ">=0.21.0" }, @@ -1610,6 +1705,47 @@ requires-dist = [ ] provides-extras = ["dev"] +[[package]] +name = "microsoft-agents-a365-tooling-extensions-agentframework" +source = { editable = "libraries/microsoft-agents-a365-tooling-extensions-agentframework" } +dependencies = [ + { name = "agent-framework-azure-ai" }, + { name = "azure-identity" }, + { name = "microsoft-agents-a365-tooling" }, + { name = "microsoft-agents-hosting-core" }, + { name = "typing-extensions" }, +] + +[package.optional-dependencies] +dev = [ + { name = "black" }, + { name = "mypy" }, + { name = "pytest" }, + { name = "pytest-asyncio" }, + { name = "ruff" }, +] +test = [ + { name = "pytest" }, + { name = "pytest-asyncio" }, +] + +[package.metadata] +requires-dist = [ + { name = "agent-framework-azure-ai", specifier = ">=0.1.0" }, + { name = "azure-identity", specifier = ">=1.12.0" }, + { name = "black", marker = "extra == 'dev'", specifier = ">=23.0.0" }, + { name = "microsoft-agents-a365-tooling", editable = "libraries/microsoft-agents-a365-tooling" }, + { name = "microsoft-agents-hosting-core", specifier = ">=0.4.0,<0.6.0" }, + { name = "mypy", marker = "extra == 'dev'", specifier = ">=1.0.0" }, + { name = "pytest", marker = "extra == 'dev'", specifier = ">=7.0.0" }, + { name = "pytest", marker = "extra == 'test'", specifier = ">=7.0.0" }, + { name = "pytest-asyncio", marker = "extra == 'dev'", specifier = ">=0.21.0" }, + { name = "pytest-asyncio", marker = "extra == 'test'", specifier = ">=0.21.0" }, + { name = "ruff", marker = "extra == 'dev'", specifier = ">=0.1.0" }, + { name = "typing-extensions", specifier = ">=4.0.0" }, +] +provides-extras = ["dev", "test"] + [[package]] name = "microsoft-agents-a365-tooling-extensions-azureaifoundry" source = { editable = "libraries/microsoft-agents-a365-tooling-extensions-azureaifoundry" } @@ -2153,172 +2289,315 @@ wheels = [ [[package]] name = "opentelemetry-api" -version = "1.34.1" +version = "1.38.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "importlib-metadata" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/4d/5e/94a8cb759e4e409022229418294e098ca7feca00eb3c467bb20cbd329bda/opentelemetry_api-1.34.1.tar.gz", hash = "sha256:64f0bd06d42824843731d05beea88d4d4b6ae59f9fe347ff7dfa2cc14233bbb3", size = 64987, upload-time = "2025-06-10T08:55:19.818Z" } +sdist = { url = "https://files.pythonhosted.org/packages/08/d8/0f354c375628e048bd0570645b310797299754730079853095bf000fba69/opentelemetry_api-1.38.0.tar.gz", hash = "sha256:f4c193b5e8acb0912b06ac5b16321908dd0843d75049c091487322284a3eea12", size = 65242, upload-time = "2025-10-16T08:35:50.25Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/a5/3a/2ba85557e8dc024c0842ad22c570418dc02c36cbd1ab4b832a93edf071b8/opentelemetry_api-1.34.1-py3-none-any.whl", hash = "sha256:b7df4cb0830d5a6c29ad0c0691dbae874d8daefa934b8b1d642de48323d32a8c", size = 65767, upload-time = "2025-06-10T08:54:56.717Z" }, + { url = "https://files.pythonhosted.org/packages/ae/a2/d86e01c28300bd41bab8f18afd613676e2bd63515417b77636fc1add426f/opentelemetry_api-1.38.0-py3-none-any.whl", hash = "sha256:2891b0197f47124454ab9f0cf58f3be33faca394457ac3e09daba13ff50aa582", size = 65947, upload-time = "2025-10-16T08:35:30.23Z" }, ] [[package]] -name = "opentelemetry-exporter-jaeger" -version = "1.21.0" +name = "opentelemetry-exporter-otlp" +version = "1.38.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "opentelemetry-exporter-jaeger-proto-grpc" }, - { name = "opentelemetry-exporter-jaeger-thrift" }, + { name = "opentelemetry-exporter-otlp-proto-grpc" }, + { name = "opentelemetry-exporter-otlp-proto-http" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/b6/52/d84ee33cb2a3b32f820bd1af035cdfe1fa03baa692aabb90bbe01812a235/opentelemetry_exporter_jaeger-1.21.0.tar.gz", hash = "sha256:e5650af9d09adad35add56b93d9856bd410644d25b0b5b87e6111467b9877dc2", size = 6150, upload-time = "2023-11-07T23:16:24.258Z" } +sdist = { url = "https://files.pythonhosted.org/packages/c2/2d/16e3487ddde2dee702bd746dd41950a8789b846d22a1c7e64824aac5ebea/opentelemetry_exporter_otlp-1.38.0.tar.gz", hash = "sha256:2f55acdd475e4136117eff20fbf1b9488b1b0b665ab64407516e1ac06f9c3f9d", size = 6147, upload-time = "2025-10-16T08:35:52.53Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/bc/71/f45b52bde0cd0b316fd7ef034afa93d171c1de612923ea9e6be76dfe0d50/opentelemetry_exporter_jaeger-1.21.0-py3-none-any.whl", hash = "sha256:3d645eff7e31461d917be5c6635803ad7913cbb7662feed014ba2fe6e005b209", size = 7038, upload-time = "2023-11-07T23:15:48.48Z" }, + { url = "https://files.pythonhosted.org/packages/fd/8a/81cd252b16b7d95ec1147982b6af81c7932d23918b4c3b15372531242ddd/opentelemetry_exporter_otlp-1.38.0-py3-none-any.whl", hash = "sha256:bc6562cef229fac8887ed7109fc5abc52315f39d9c03fd487bb8b4ef8fbbc231", size = 7018, upload-time = "2025-10-16T08:35:32.995Z" }, ] [[package]] -name = "opentelemetry-exporter-jaeger-proto-grpc" -version = "1.21.0" +name = "opentelemetry-exporter-otlp-proto-common" +version = "1.38.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "opentelemetry-proto" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/19/83/dd4660f2956ff88ed071e9e0e36e830df14b8c5dc06722dbde1841accbe8/opentelemetry_exporter_otlp_proto_common-1.38.0.tar.gz", hash = "sha256:e333278afab4695aa8114eeb7bf4e44e65c6607d54968271a249c180b2cb605c", size = 20431, upload-time = "2025-10-16T08:35:53.285Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a7/9e/55a41c9601191e8cd8eb626b54ee6827b9c9d4a46d736f32abc80d8039fc/opentelemetry_exporter_otlp_proto_common-1.38.0-py3-none-any.whl", hash = "sha256:03cb76ab213300fe4f4c62b7d8f17d97fcfd21b89f0b5ce38ea156327ddda74a", size = 18359, upload-time = "2025-10-16T08:35:34.099Z" }, +] + +[[package]] +name = "opentelemetry-exporter-otlp-proto-grpc" +version = "1.38.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "googleapis-common-protos" }, { name = "grpcio" }, { name = "opentelemetry-api" }, + { name = "opentelemetry-exporter-otlp-proto-common" }, + { name = "opentelemetry-proto" }, { name = "opentelemetry-sdk" }, + { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/68/c1/69b224098252b89a79e075db1be7001bb14095daff1c0348c3e83b466e85/opentelemetry_exporter_jaeger_proto_grpc-1.21.0.tar.gz", hash = "sha256:359ceb15b72e798881b4b7b2afdcbc189aef3a0508944856ac70d74968574ed7", size = 32224, upload-time = "2023-11-07T23:16:25.406Z" } +sdist = { url = "https://files.pythonhosted.org/packages/a2/c0/43222f5b97dc10812bc4f0abc5dc7cd0a2525a91b5151d26c9e2e958f52e/opentelemetry_exporter_otlp_proto_grpc-1.38.0.tar.gz", hash = "sha256:2473935e9eac71f401de6101d37d6f3f0f1831db92b953c7dcc912536158ebd6", size = 24676, upload-time = "2025-10-16T08:35:53.83Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/77/2e/d062a7a009138a40dd748add1cbe1c761eebfc791440bc7a631b53f8e5bd/opentelemetry_exporter_jaeger_proto_grpc-1.21.0-py3-none-any.whl", hash = "sha256:cf8ec4761c56d611e7bfb9538d4d85ea6a67cd1548f12deff83afaa5c447816e", size = 37548, upload-time = "2023-11-07T23:15:50.391Z" }, + { url = "https://files.pythonhosted.org/packages/28/f0/bd831afbdba74ca2ce3982142a2fad707f8c487e8a3b6fef01f1d5945d1b/opentelemetry_exporter_otlp_proto_grpc-1.38.0-py3-none-any.whl", hash = "sha256:7c49fd9b4bd0dbe9ba13d91f764c2d20b0025649a6e4ac35792fb8d84d764bc7", size = 19695, upload-time = "2025-10-16T08:35:35.053Z" }, ] [[package]] -name = "opentelemetry-exporter-jaeger-thrift" -version = "1.21.0" +name = "opentelemetry-exporter-otlp-proto-http" +version = "1.38.0" source = { registry = "https://pypi.org/simple" } dependencies = [ + { name = "googleapis-common-protos" }, { name = "opentelemetry-api" }, + { name = "opentelemetry-exporter-otlp-proto-common" }, + { name = "opentelemetry-proto" }, { name = "opentelemetry-sdk" }, - { name = "thrift" }, + { name = "requests" }, + { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/c7/ff/560d975ce09ec123dce1b7a97877bad1a5b2424c5c8e31e55169d4cd85e6/opentelemetry_exporter_jaeger_thrift-1.21.0.tar.gz", hash = "sha256:41119bc7e5602cec83dd7d7060f061ecbc91de231272e8f515b07ef9a4b6e41c", size = 27722, upload-time = "2023-11-07T23:16:26.522Z" } +sdist = { url = "https://files.pythonhosted.org/packages/81/0a/debcdfb029fbd1ccd1563f7c287b89a6f7bef3b2902ade56797bfd020854/opentelemetry_exporter_otlp_proto_http-1.38.0.tar.gz", hash = "sha256:f16bd44baf15cbe07633c5112ffc68229d0edbeac7b37610be0b2def4e21e90b", size = 17282, upload-time = "2025-10-16T08:35:54.422Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/81/2b/c6ff9604f5b8469e1fabe2b6ee50c36dadf0f572a430494d8dd5ce37d99f/opentelemetry_exporter_jaeger_thrift-1.21.0-py3-none-any.whl", hash = "sha256:4364b8dfa6965707c72c43d85942b1491982b7d44f0123d593513e8bedafa9e2", size = 35929, upload-time = "2023-11-07T23:15:52.341Z" }, + { url = "https://files.pythonhosted.org/packages/e5/77/154004c99fb9f291f74aa0822a2f5bbf565a72d8126b3a1b63ed8e5f83c7/opentelemetry_exporter_otlp_proto_http-1.38.0-py3-none-any.whl", hash = "sha256:84b937305edfc563f08ec69b9cb2298be8188371217e867c1854d77198d0825b", size = 19579, upload-time = "2025-10-16T08:35:36.269Z" }, ] [[package]] -name = "opentelemetry-exporter-otlp" -version = "1.34.1" +name = "opentelemetry-instrumentation" +version = "0.59b0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "opentelemetry-exporter-otlp-proto-grpc" }, - { name = "opentelemetry-exporter-otlp-proto-http" }, + { name = "opentelemetry-api" }, + { name = "opentelemetry-semantic-conventions" }, + { name = "packaging" }, + { name = "wrapt" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/44/ba/786b4de7e39d88043622d901b92c4485835f43e0be76c2824d2687911bc2/opentelemetry_exporter_otlp-1.34.1.tar.gz", hash = "sha256:71c9ad342d665d9e4235898d205db17c5764cd7a69acb8a5dcd6d5e04c4c9988", size = 6173, upload-time = "2025-06-10T08:55:21.595Z" } +sdist = { url = "https://files.pythonhosted.org/packages/04/ed/9c65cd209407fd807fa05be03ee30f159bdac8d59e7ea16a8fe5a1601222/opentelemetry_instrumentation-0.59b0.tar.gz", hash = "sha256:6010f0faaacdaf7c4dff8aac84e226d23437b331dcda7e70367f6d73a7db1adc", size = 31544, upload-time = "2025-10-16T08:39:31.959Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/00/c1/259b8d8391c968e8f005d8a0ccefcb41aeef64cf55905cd0c0db4e22aaee/opentelemetry_exporter_otlp-1.34.1-py3-none-any.whl", hash = "sha256:f4a453e9cde7f6362fd4a090d8acf7881d1dc585540c7b65cbd63e36644238d4", size = 7040, upload-time = "2025-06-10T08:54:59.655Z" }, + { url = "https://files.pythonhosted.org/packages/10/f5/7a40ff3f62bfe715dad2f633d7f1174ba1a7dd74254c15b2558b3401262a/opentelemetry_instrumentation-0.59b0-py3-none-any.whl", hash = "sha256:44082cc8fe56b0186e87ee8f7c17c327c4c2ce93bdbe86496e600985d74368ee", size = 33020, upload-time = "2025-10-16T08:38:31.463Z" }, ] [[package]] -name = "opentelemetry-exporter-otlp-proto-common" -version = "1.34.1" +name = "opentelemetry-instrumentation-asgi" +version = "0.59b0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "opentelemetry-proto" }, + { name = "asgiref" }, + { name = "opentelemetry-api" }, + { name = "opentelemetry-instrumentation" }, + { name = "opentelemetry-semantic-conventions" }, + { name = "opentelemetry-util-http" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/86/f0/ff235936ee40db93360233b62da932d4fd9e8d103cd090c6bcb9afaf5f01/opentelemetry_exporter_otlp_proto_common-1.34.1.tar.gz", hash = "sha256:b59a20a927facd5eac06edaf87a07e49f9e4a13db487b7d8a52b37cb87710f8b", size = 20817, upload-time = "2025-06-10T08:55:22.55Z" } +sdist = { url = "https://files.pythonhosted.org/packages/b7/a4/cfbb6fc1ec0aa9bf5a93f548e6a11ab3ac1956272f17e0d399aa2c1f85bc/opentelemetry_instrumentation_asgi-0.59b0.tar.gz", hash = "sha256:2509d6fe9fd829399ce3536e3a00426c7e3aa359fc1ed9ceee1628b56da40e7a", size = 25116, upload-time = "2025-10-16T08:39:36.092Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/72/e8/8b292a11cc8d8d87ec0c4089ae21b6a58af49ca2e51fa916435bc922fdc7/opentelemetry_exporter_otlp_proto_common-1.34.1-py3-none-any.whl", hash = "sha256:8e2019284bf24d3deebbb6c59c71e6eef3307cd88eff8c633e061abba33f7e87", size = 18834, upload-time = "2025-06-10T08:55:00.806Z" }, + { url = "https://files.pythonhosted.org/packages/f3/88/fe02d809963b182aafbf5588685d7a05af8861379b0ec203d48e360d4502/opentelemetry_instrumentation_asgi-0.59b0-py3-none-any.whl", hash = "sha256:ba9703e09d2c33c52fa798171f344c8123488fcd45017887981df088452d3c53", size = 16797, upload-time = "2025-10-16T08:38:37.214Z" }, ] [[package]] -name = "opentelemetry-exporter-otlp-proto-grpc" -version = "1.34.1" +name = "opentelemetry-instrumentation-dbapi" +version = "0.59b0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "googleapis-common-protos" }, - { name = "grpcio" }, { name = "opentelemetry-api" }, - { name = "opentelemetry-exporter-otlp-proto-common" }, - { name = "opentelemetry-proto" }, - { name = "opentelemetry-sdk" }, - { name = "typing-extensions" }, + { name = "opentelemetry-instrumentation" }, + { name = "opentelemetry-semantic-conventions" }, + { name = "wrapt" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/41/f7/bb63837a3edb9ca857aaf5760796874e7cecddc88a2571b0992865a48fb6/opentelemetry_exporter_otlp_proto_grpc-1.34.1.tar.gz", hash = "sha256:7c841b90caa3aafcfc4fee58487a6c71743c34c6dc1787089d8b0578bbd794dd", size = 22566, upload-time = "2025-06-10T08:55:23.214Z" } +sdist = { url = "https://files.pythonhosted.org/packages/60/aa/36a09652c98c65b42408d40f222fba031a3a281f1b6682e1b141b20b508d/opentelemetry_instrumentation_dbapi-0.59b0.tar.gz", hash = "sha256:c50112ae1cdb7f55bddcf57eca96aaa0f2dd78732be2b00953183439a4740493", size = 16308, upload-time = "2025-10-16T08:39:43.192Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/b4/42/0a4dd47e7ef54edf670c81fc06a83d68ea42727b82126a1df9dd0477695d/opentelemetry_exporter_otlp_proto_grpc-1.34.1-py3-none-any.whl", hash = "sha256:04bb8b732b02295be79f8a86a4ad28fae3d4ddb07307a98c7aa6f331de18cca6", size = 18615, upload-time = "2025-06-10T08:55:02.214Z" }, + { url = "https://files.pythonhosted.org/packages/e5/9b/1739b5b7926cbae342880d7a56d59a847313e6568a96ba7d4873ce0c0996/opentelemetry_instrumentation_dbapi-0.59b0-py3-none-any.whl", hash = "sha256:672d59caa06754b42d4e722644d9fcd00a1f9f862e9ea5cef6d4da454515ac67", size = 13970, upload-time = "2025-10-16T08:38:48.342Z" }, ] [[package]] -name = "opentelemetry-exporter-otlp-proto-http" -version = "1.34.1" +name = "opentelemetry-instrumentation-django" +version = "0.59b0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "googleapis-common-protos" }, { name = "opentelemetry-api" }, - { name = "opentelemetry-exporter-otlp-proto-common" }, - { name = "opentelemetry-proto" }, - { name = "opentelemetry-sdk" }, - { name = "requests" }, - { name = "typing-extensions" }, + { name = "opentelemetry-instrumentation" }, + { name = "opentelemetry-instrumentation-wsgi" }, + { name = "opentelemetry-semantic-conventions" }, + { name = "opentelemetry-util-http" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/19/8f/954bc725961cbe425a749d55c0ba1df46832a5999eae764d1a7349ac1c29/opentelemetry_exporter_otlp_proto_http-1.34.1.tar.gz", hash = "sha256:aaac36fdce46a8191e604dcf632e1f9380c7d5b356b27b3e0edb5610d9be28ad", size = 15351, upload-time = "2025-06-10T08:55:24.657Z" } +sdist = { url = "https://files.pythonhosted.org/packages/6e/cf/a329abb33a9f7934cfd9e5645e69550a4d5dcdd6d1970283854460e11f9d/opentelemetry_instrumentation_django-0.59b0.tar.gz", hash = "sha256:469c2d973619355645ec696bbc4afab836ce22cbc83236a0382c3090588f7772", size = 25008, upload-time = "2025-10-16T08:39:44.045Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/79/54/b05251c04e30c1ac70cf4a7c5653c085dfcf2c8b98af71661d6a252adc39/opentelemetry_exporter_otlp_proto_http-1.34.1-py3-none-any.whl", hash = "sha256:5251f00ca85872ce50d871f6d3cc89fe203b94c3c14c964bbdc3883366c705d8", size = 17744, upload-time = "2025-06-10T08:55:03.802Z" }, + { url = "https://files.pythonhosted.org/packages/7e/c0/c8980bcb1ef1263fe0f4bbe52b74a1442c29b35eca4a9cb4ab4bb1028a3c/opentelemetry_instrumentation_django-0.59b0-py3-none-any.whl", hash = "sha256:a0a9eb74afc3870e72eaaa776054fbfd4d83ae306d0c5995f14414bcef2d830e", size = 19595, upload-time = "2025-10-16T08:38:49.164Z" }, ] [[package]] -name = "opentelemetry-instrumentation" -version = "0.55b1" +name = "opentelemetry-instrumentation-fastapi" +version = "0.59b0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "opentelemetry-api" }, + { name = "opentelemetry-instrumentation" }, + { name = "opentelemetry-instrumentation-asgi" }, { name = "opentelemetry-semantic-conventions" }, + { name = "opentelemetry-util-http" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ab/a7/7a6ce5009584ce97dbfd5ce77d4f9d9570147507363349d2cb705c402bcf/opentelemetry_instrumentation_fastapi-0.59b0.tar.gz", hash = "sha256:e8fe620cfcca96a7d634003df1bc36a42369dedcdd6893e13fb5903aeeb89b2b", size = 24967, upload-time = "2025-10-16T08:39:46.056Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/35/27/5914c8bf140ffc70eff153077e225997c7b054f0bf28e11b9ab91b63b18f/opentelemetry_instrumentation_fastapi-0.59b0-py3-none-any.whl", hash = "sha256:0d8d00ff7d25cca40a4b2356d1d40a8f001e0668f60c102f5aa6bb721d660c4f", size = 13492, upload-time = "2025-10-16T08:38:52.312Z" }, +] + +[[package]] +name = "opentelemetry-instrumentation-flask" +version = "0.59b0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "opentelemetry-api" }, + { name = "opentelemetry-instrumentation" }, + { name = "opentelemetry-instrumentation-wsgi" }, + { name = "opentelemetry-semantic-conventions" }, + { name = "opentelemetry-util-http" }, { name = "packaging" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/81/42/afccc8414f85108d41bb73155d0e828bf07102068ef03396bd1ef4296544/opentelemetry_instrumentation_flask-0.59b0.tar.gz", hash = "sha256:8b379d331b61f40a7c72c9ae8e0fca72c72ffeb6db75908811217196c9544b9b", size = 19587, upload-time = "2025-10-16T08:39:46.97Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c1/5e/99db8cedd745d989f860a8c9544c6d5c47c79117251088927e98c7167f85/opentelemetry_instrumentation_flask-0.59b0-py3-none-any.whl", hash = "sha256:5e97fde228f66d7bf9512a86383c0d30a869e2d3b424b51a2781ca40d0287cdc", size = 14741, upload-time = "2025-10-16T08:38:53.211Z" }, +] + +[[package]] +name = "opentelemetry-instrumentation-psycopg2" +version = "0.59b0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "opentelemetry-api" }, + { name = "opentelemetry-instrumentation" }, + { name = "opentelemetry-instrumentation-dbapi" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/88/76/d4adf1b9e811ee6af19b074d80cff1026f3074f78d2d915846aecbab29d9/opentelemetry_instrumentation_psycopg2-0.59b0.tar.gz", hash = "sha256:ba440b15543a7e8c6ffd1f20a30e6062cbf34cc42e61c602b8587b512704588b", size = 10735, upload-time = "2025-10-16T08:39:55.036Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5b/70/3ac33f00c928725fb52bb9eaf2b51ac57370dfd9eb8ddb60d6fd6e9fab95/opentelemetry_instrumentation_psycopg2-0.59b0-py3-none-any.whl", hash = "sha256:c96e1f5d91320166173af4ca8f4735ec2de61b7d99810bd23dd44644334514bd", size = 10731, upload-time = "2025-10-16T08:39:02.298Z" }, +] + +[[package]] +name = "opentelemetry-instrumentation-requests" +version = "0.59b0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "opentelemetry-api" }, + { name = "opentelemetry-instrumentation" }, + { name = "opentelemetry-semantic-conventions" }, + { name = "opentelemetry-util-http" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/49/01/31282a46b09684dfc636bc066deb090bae6973e71e85e253a8c74e727b1f/opentelemetry_instrumentation_requests-0.59b0.tar.gz", hash = "sha256:9af2ffe3317f03074d7f865919139e89170b6763a0251b68c25e8e64e04b3400", size = 15186, upload-time = "2025-10-16T08:40:00.558Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e5/ea/c282ba418b2669e4f730cb3f68b02a0ca65f4baf801e971169a4cc449ffb/opentelemetry_instrumentation_requests-0.59b0-py3-none-any.whl", hash = "sha256:d43121532877e31a46c48649279cec2504ee1e0ceb3c87b80fe5ccd7eafc14c1", size = 12966, upload-time = "2025-10-16T08:39:09.919Z" }, +] + +[[package]] +name = "opentelemetry-instrumentation-urllib" +version = "0.59b0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "opentelemetry-api" }, + { name = "opentelemetry-instrumentation" }, + { name = "opentelemetry-semantic-conventions" }, + { name = "opentelemetry-util-http" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/61/85/70cc79162aa778179520b82234e3a8668f0aea67a279bd81a2522868687d/opentelemetry_instrumentation_urllib-0.59b0.tar.gz", hash = "sha256:1e2bb3427ce13854453777d8dccf3b0144640b03846f00fc302bdb6e1f2f8c7a", size = 13931, upload-time = "2025-10-16T08:40:05.272Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/29/94/0e87ffe1edfdda27e401d8ebab71ee3dd9ceaac11f98b8f5c190820a317f/opentelemetry_instrumentation_urllib-0.59b0-py3-none-any.whl", hash = "sha256:ed2bd1a02e4334c13c13033681ff8cf10d5dfcd5b0e6d7514f94a00e7f7bd671", size = 12672, upload-time = "2025-10-16T08:39:19.079Z" }, +] + +[[package]] +name = "opentelemetry-instrumentation-urllib3" +version = "0.59b0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "opentelemetry-api" }, + { name = "opentelemetry-instrumentation" }, + { name = "opentelemetry-semantic-conventions" }, + { name = "opentelemetry-util-http" }, { name = "wrapt" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/cb/69/d8995f229ddf4d98b9c85dd126aeca03dd1742f6dc5d3bc0d2f6dae1535c/opentelemetry_instrumentation-0.55b1.tar.gz", hash = "sha256:2dc50aa207b9bfa16f70a1a0571e011e737a9917408934675b89ef4d5718c87b", size = 28552, upload-time = "2025-06-10T08:58:15.312Z" } +sdist = { url = "https://files.pythonhosted.org/packages/94/53/ff93665911808933b1af6fbbb1be2eb83c0c46e3b5f24b0b04c094b5b719/opentelemetry_instrumentation_urllib3-0.59b0.tar.gz", hash = "sha256:2de8d53a746bba043be1bc8f3246e1b131ebb6e94fe73601edd8b2bd91fe35b8", size = 15788, upload-time = "2025-10-16T08:40:05.889Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/83/3d/673cbea7aafb93a4613abf3d9c920d7c65a8cad79c910719dc286169bac8/opentelemetry_instrumentation_urllib3-0.59b0-py3-none-any.whl", hash = "sha256:a68c363092cf5db8c67c5778dbb2e4a14554e77baf7d276c374ea75ec926e148", size = 13187, upload-time = "2025-10-16T08:39:20.727Z" }, +] + +[[package]] +name = "opentelemetry-instrumentation-wsgi" +version = "0.59b0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "opentelemetry-api" }, + { name = "opentelemetry-instrumentation" }, + { name = "opentelemetry-semantic-conventions" }, + { name = "opentelemetry-util-http" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/2e/1d/595907631263e0e4a9e3d5b2958b9ecfe3872938c706e6c842d0767c798c/opentelemetry_instrumentation_wsgi-0.59b0.tar.gz", hash = "sha256:ff0c3df043bd3653ad6a543cb2a1e666fbd4d63efffa04fa9d9090cef462e798", size = 18377, upload-time = "2025-10-16T08:40:06.836Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/60/7d/8ddfda1506c2fcca137924d5688ccabffa1aed9ec0955b7d0772de02cec3/opentelemetry_instrumentation-0.55b1-py3-none-any.whl", hash = "sha256:cbb1496b42bc394e01bc63701b10e69094e8564e281de063e4328d122cc7a97e", size = 31108, upload-time = "2025-06-10T08:57:14.355Z" }, + { url = "https://files.pythonhosted.org/packages/75/06/ef769a4f6fde97ff58bc4e38a12b6ae4be1d5fe0f76e69c19b0fd2e10405/opentelemetry_instrumentation_wsgi-0.59b0-py3-none-any.whl", hash = "sha256:f271076e56c22da1d0d3404519ba4a1891b39ee3d470ca7ece7332d57cbaa6b9", size = 14447, upload-time = "2025-10-16T08:39:22.002Z" }, ] [[package]] name = "opentelemetry-proto" -version = "1.34.1" +version = "1.38.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "protobuf" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/66/b3/c3158dd012463bb7c0eb7304a85a6f63baeeb5b4c93a53845cf89f848c7e/opentelemetry_proto-1.34.1.tar.gz", hash = "sha256:16286214e405c211fc774187f3e4bbb1351290b8dfb88e8948af209ce85b719e", size = 34344, upload-time = "2025-06-10T08:55:32.25Z" } +sdist = { url = "https://files.pythonhosted.org/packages/51/14/f0c4f0f6371b9cb7f9fa9ee8918bfd59ac7040c7791f1e6da32a1839780d/opentelemetry_proto-1.38.0.tar.gz", hash = "sha256:88b161e89d9d372ce723da289b7da74c3a8354a8e5359992be813942969ed468", size = 46152, upload-time = "2025-10-16T08:36:01.612Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/28/ab/4591bfa54e946350ce8b3f28e5c658fe9785e7cd11e9c11b1671a867822b/opentelemetry_proto-1.34.1-py3-none-any.whl", hash = "sha256:eb4bb5ac27f2562df2d6857fc557b3a481b5e298bc04f94cc68041f00cebcbd2", size = 55692, upload-time = "2025-06-10T08:55:14.904Z" }, + { url = "https://files.pythonhosted.org/packages/b6/6a/82b68b14efca5150b2632f3692d627afa76b77378c4999f2648979409528/opentelemetry_proto-1.38.0-py3-none-any.whl", hash = "sha256:b6ebe54d3217c42e45462e2a1ae28c3e2bf2ec5a5645236a490f55f45f1a0a18", size = 72535, upload-time = "2025-10-16T08:35:45.749Z" }, +] + +[[package]] +name = "opentelemetry-resource-detector-azure" +version = "0.1.5" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "opentelemetry-sdk" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/67/e4/0d359d48d03d447225b30c3dd889d5d454e3b413763ff721f9b0e4ac2e59/opentelemetry_resource_detector_azure-0.1.5.tar.gz", hash = "sha256:e0ba658a87c69eebc806e75398cd0e9f68a8898ea62de99bc1b7083136403710", size = 11503, upload-time = "2024-05-16T21:54:58.994Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c3/ae/c26d8da88ba2e438e9653a408b0c2ad6f17267801250a8f3cc6405a93a72/opentelemetry_resource_detector_azure-0.1.5-py3-none-any.whl", hash = "sha256:4dcc5d54ab5c3b11226af39509bc98979a8b9e0f8a24c1b888783755d3bf00eb", size = 14252, upload-time = "2024-05-16T21:54:57.208Z" }, ] [[package]] name = "opentelemetry-sdk" -version = "1.34.1" +version = "1.38.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "opentelemetry-api" }, { name = "opentelemetry-semantic-conventions" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/6f/41/fe20f9036433da8e0fcef568984da4c1d1c771fa072ecd1a4d98779dccdd/opentelemetry_sdk-1.34.1.tar.gz", hash = "sha256:8091db0d763fcd6098d4781bbc80ff0971f94e260739aa6afe6fd379cdf3aa4d", size = 159441, upload-time = "2025-06-10T08:55:33.028Z" } +sdist = { url = "https://files.pythonhosted.org/packages/85/cb/f0eee1445161faf4c9af3ba7b848cc22a50a3d3e2515051ad8628c35ff80/opentelemetry_sdk-1.38.0.tar.gz", hash = "sha256:93df5d4d871ed09cb4272305be4d996236eedb232253e3ab864c8620f051cebe", size = 171942, upload-time = "2025-10-16T08:36:02.257Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/07/1b/def4fe6aa73f483cabf4c748f4c25070d5f7604dcc8b52e962983491b29e/opentelemetry_sdk-1.34.1-py3-none-any.whl", hash = "sha256:308effad4059562f1d92163c61c8141df649da24ce361827812c40abb2a1e96e", size = 118477, upload-time = "2025-06-10T08:55:16.02Z" }, + { url = "https://files.pythonhosted.org/packages/2f/2e/e93777a95d7d9c40d270a371392b6d6f1ff170c2a3cb32d6176741b5b723/opentelemetry_sdk-1.38.0-py3-none-any.whl", hash = "sha256:1c66af6564ecc1553d72d811a01df063ff097cdc82ce188da9951f93b8d10f6b", size = 132349, upload-time = "2025-10-16T08:35:46.995Z" }, ] [[package]] name = "opentelemetry-semantic-conventions" -version = "0.55b1" +version = "0.59b0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "opentelemetry-api" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/5d/f0/f33458486da911f47c4aa6db9bda308bb80f3236c111bf848bd870c16b16/opentelemetry_semantic_conventions-0.55b1.tar.gz", hash = "sha256:ef95b1f009159c28d7a7849f5cbc71c4c34c845bb514d66adfdf1b3fff3598b3", size = 119829, upload-time = "2025-06-10T08:55:33.881Z" } +sdist = { url = "https://files.pythonhosted.org/packages/40/bc/8b9ad3802cd8ac6583a4eb7de7e5d7db004e89cb7efe7008f9c8a537ee75/opentelemetry_semantic_conventions-0.59b0.tar.gz", hash = "sha256:7a6db3f30d70202d5bf9fa4b69bc866ca6a30437287de6c510fb594878aed6b0", size = 129861, upload-time = "2025-10-16T08:36:03.346Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/24/7d/c88d7b15ba8fe5c6b8f93be50fc11795e9fc05386c44afaf6b76fe191f9b/opentelemetry_semantic_conventions-0.59b0-py3-none-any.whl", hash = "sha256:35d3b8833ef97d614136e253c1da9342b4c3c083bbaf29ce31d572a1c3825eed", size = 207954, upload-time = "2025-10-16T08:35:48.054Z" }, +] + +[[package]] +name = "opentelemetry-semantic-conventions-ai" +version = "0.4.13" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ba/e6/40b59eda51ac47009fb47afcdf37c6938594a0bd7f3b9fadcbc6058248e3/opentelemetry_semantic_conventions_ai-0.4.13.tar.gz", hash = "sha256:94efa9fb4ffac18c45f54a3a338ffeb7eedb7e1bb4d147786e77202e159f0036", size = 5368, upload-time = "2025-08-22T10:14:17.387Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/35/b5/cf25da2218910f0d6cdf7f876a06bed118c4969eacaf60a887cbaef44f44/opentelemetry_semantic_conventions_ai-0.4.13-py3-none-any.whl", hash = "sha256:883a30a6bb5deaec0d646912b5f9f6dcbb9f6f72557b73d0f2560bf25d13e2d5", size = 6080, upload-time = "2025-08-22T10:14:16.477Z" }, +] + +[[package]] +name = "opentelemetry-util-http" +version = "0.59b0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/34/f7/13cd081e7851c42520ab0e96efb17ffbd901111a50b8252ec1e240664020/opentelemetry_util_http-0.59b0.tar.gz", hash = "sha256:ae66ee91be31938d832f3b4bc4eb8a911f6eddd38969c4a871b1230db2a0a560", size = 9412, upload-time = "2025-10-16T08:40:11.335Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/1a/89/267b0af1b1d0ba828f0e60642b6a5116ac1fd917cde7fc02821627029bd1/opentelemetry_semantic_conventions-0.55b1-py3-none-any.whl", hash = "sha256:5da81dfdf7d52e3d37f8fe88d5e771e191de924cfff5f550ab0b8f7b2409baed", size = 196223, upload-time = "2025-06-10T08:55:17.638Z" }, + { url = "https://files.pythonhosted.org/packages/20/56/62282d1d4482061360449dacc990c89cad0fc810a2ed937b636300f55023/opentelemetry_util_http-0.59b0-py3-none-any.whl", hash = "sha256:6d036a07563bce87bf521839c0671b507a02a0d39d7ea61b88efa14c6e25355d", size = 7648, upload-time = "2025-10-16T08:39:25.706Z" }, ] [[package]] @@ -3327,12 +3606,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/e5/30/643397144bfbfec6f6ef821f36f33e57d35946c44a2352d3c9f0ae847619/tenacity-9.1.2-py3-none-any.whl", hash = "sha256:f77bf36710d8b73a50b2dd155c97b870017ad21afe6ab300326b0371b3b05138", size = 28248, upload-time = "2025-04-02T08:25:07.678Z" }, ] -[[package]] -name = "thrift" -version = "0.22.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/b2/c2/db648cc10dd7d15560f2eafd92a27cd280811924696e0b4a87175fb28c94/thrift-0.22.0.tar.gz", hash = "sha256:42e8276afbd5f54fe1d364858b6877bc5e5a4a5ed69f6a005b94ca4918fe1466", size = 62303, upload-time = "2025-05-23T20:49:33.309Z" } - [[package]] name = "tqdm" version = "4.67.1" From 6feac83b4a4b30d08500dba1fc5e353c82a98c7f Mon Sep 17 00:00:00 2001 From: Mrunal Hirve Date: Fri, 31 Oct 2025 10:05:03 -0700 Subject: [PATCH 19/20] Ruff format --- .../setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/microsoft-agents-a365-tooling-extensions-agentframework/setup.py b/libraries/microsoft-agents-a365-tooling-extensions-agentframework/setup.py index ed10edb6..885895ea 100644 --- a/libraries/microsoft-agents-a365-tooling-extensions-agentframework/setup.py +++ b/libraries/microsoft-agents-a365-tooling-extensions-agentframework/setup.py @@ -27,4 +27,4 @@ def build_version(): setup( version=VERSION, -) \ No newline at end of file +) From 06d695fe1a82ea9145c0ec43e49a600db08e35d9 Mon Sep 17 00:00:00 2001 From: Mrunal Hirve Date: Fri, 31 Oct 2025 11:15:00 -0700 Subject: [PATCH 20/20] change --- .../microsoft-agents-a365-observability-core/pyproject.toml | 3 --- 1 file changed, 3 deletions(-) diff --git a/libraries/microsoft-agents-a365-observability-core/pyproject.toml b/libraries/microsoft-agents-a365-observability-core/pyproject.toml index 79e2684c..95e41b61 100644 --- a/libraries/microsoft-agents-a365-observability-core/pyproject.toml +++ b/libraries/microsoft-agents-a365-observability-core/pyproject.toml @@ -45,9 +45,6 @@ azure = [ "azure-identity >= 1.12.0", "azure-monitor-ingestion >= 1.0.0", ] -# jaeger = [ -# "opentelemetry-exporter-jaeger >= 1.20.0", -# ] # Modern approach: use OTLP exporter to send to Jaeger (since Jaeger v1.35+ supports OTLP natively) jaeger = [ "opentelemetry-exporter-otlp-proto-grpc >= 1.36.0",