diff --git a/libraries/microsoft-agents-a365-observability-core/pyproject.toml b/libraries/microsoft-agents-a365-observability-core/pyproject.toml index dd7df79..95e41b6 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,9 @@ azure = [ "azure-identity >= 1.12.0", "azure-monitor-ingestion >= 1.0.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 9a73c0a..b315193 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 6ede0ac..7ca862e 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 e291001..540048f 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/libraries/microsoft-agents-a365-tooling-extensions-agentframework/README.md b/libraries/microsoft-agents-a365-tooling-extensions-agentframework/README.md new file mode 100644 index 0000000..7d98d56 --- /dev/null +++ b/libraries/microsoft-agents-a365-tooling-extensions-agentframework/README.md @@ -0,0 +1,285 @@ +# 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 + import logging + + logger = logging.getLogger("my-agent") + + service = McpToolRegistrationService( + logger=logger + ) + + # 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! Feel free to open issues or submit pull requests to help improve this project. + +## License + +This project is licensed under the MIT License. See the [LICENSE](https://github.com/microsoft/Agent365/blob/main/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 0000000..b06cfe4 --- /dev/null +++ b/libraries/microsoft-agents-a365-tooling-extensions-agentframework/microsoft_agents_a365/tooling/extensions/agentframework/__init__.py @@ -0,0 +1,27 @@ +# Copyright (c) Microsoft. All rights reserved. + +""" +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 + +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 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 new file mode 100644 index 0000000..6f38d19 --- /dev/null +++ b/libraries/microsoft-agents-a365-tooling-extensions-agentframework/microsoft_agents_a365/tooling/extensions/agentframework/services/__init__.py @@ -0,0 +1,14 @@ +# Copyright (c) Microsoft. All rights reserved. + +""" +Services module for Agent Framework tooling. + +This package contains service implementations for MCP tool registration +and management within the Agent Framework. +""" + +from .mcp_tool_registration_service import McpToolRegistrationService + +__all__ = [ + "McpToolRegistrationService", +] 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 0000000..50237f6 --- /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,152 @@ +# Copyright (c) Microsoft. All rights reserved. + +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 + +from microsoft_agents_a365.tooling.services.mcp_tool_server_configuration_service import ( + McpToolServerConfigurationService, +) +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. + """ + + def __init__(self, logger: Optional[logging.Logger] = None): + """ + Initialize the MCP Tool Registration Service for Agent Framework. + + Args: + 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._connected_servers = [] + + async def add_tool_servers_to_agent( + self, + chat_client: Union[OpenAIChatClient, AzureOpenAIChatClient], + agent_instructions: str, + initial_tools: List[Any], + agent_user_id: str, + environment_id: str, + auth: Optional[Authorization] = None, + auth_token: Optional[str] = None, + turn_context: Optional[TurnContext] = None, + ) -> Optional[ChatAgent]: + """ + Add MCP tool servers to a chat agent (mirrors .NET implementation). + + Args: + 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 + 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: + 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}" + ) + + # 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, + ) + + self._logger.info(f"Loaded {len(server_configs)} MCP server configurations") + + # Create the agent with all tools (initial + MCP tools) + all_tools = list(initial_tools) + + # Add servers as MCPStreamableHTTPTool instances + 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 MCPStreamableHTTPTool + 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, + ) + + 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 tool servers to agent: {ex}") + raise + + async def cleanup(self): + """Clean up any resources used by the service.""" + try: + 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.debug(f"Error during service cleanup: {ex}") 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 0000000..0fbf2b0 --- /dev/null +++ b/libraries/microsoft-agents-a365-tooling-extensions-agentframework/pyproject.toml @@ -0,0 +1,72 @@ +[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", + "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", +] + +[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/libraries/microsoft-agents-a365-tooling-extensions-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.find] +where = ["."] + +[tool.setuptools] +license-files = ["../../LICENSE"] +include-package-data = true + +[tool.setuptools.package-data] +"*" = ["../../LICENSE"] + +[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 0000000..885895e --- /dev/null +++ b/libraries/microsoft-agents-a365-tooling-extensions-agentframework/setup.py @@ -0,0 +1,30 @@ +# Copyright (c) Microsoft. All rights reserved. + +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, +) 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 bfbd8de..b13bf98 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,8 @@ +# Copyright (c) Microsoft. All rights reserved. + from typing import Dict, Optional from dataclasses import dataclass +import logging from agents import Agent @@ -32,8 +35,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 +79,15 @@ 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 +147,22 @@ 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 +189,19 @@ 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,9 +210,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 - pass + self._logger.debug(f"Error during server cleanup: {e}") async def cleanup_all_servers(self): """Clean up all connected MCP servers""" 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 92e56d9..0ff1a4e 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,17 @@ 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 +107,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 diff --git a/pyproject.toml b/pyproject.toml index 58324dd..9c7d239 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 = [ ".", diff --git a/uv.lock b/uv.lock index 864267b..6312229 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"