Python: add AzureAIAgent client creation method. Handle user_agent. (#10538)

### Motivation and Context

We weren't sending the user_agent as part of client creation for the
AzureAIAgent. Create a convenience class method to create the
AIProjectClient, which handles creating the user_agent.

<!-- Thank you for your contribution to the semantic-kernel repo!
Please help reviewers and future users, providing the following
information:
  1. Why is this change required?
  2. What problem does it solve?
  3. What scenario does it contribute to?
  4. If it fixes an open issue, please link to the issue here.
-->

### Description

This PR:
- adds a class method to create the AIProjectClient as part of
AzureAIAgent.
- handles configuring the user_agent.
- fixes a check where annotation content indices might not be present
- adds `/.default` to default entra scope
- adds unit tests
- closes #10527
- closes #10520

<!-- Describe your changes, the overall approach, the underlying design.
These notes will help understanding how your code works. Thanks! -->

### Contribution Checklist

<!-- Before submitting this PR, please make sure: -->

- [X] The code builds clean without any errors or warnings
- [X] The PR follows the [SK Contribution
Guidelines](https://github.com/microsoft/semantic-kernel/blob/main/CONTRIBUTING.md)
and the [pre-submission formatting
script](https://github.com/microsoft/semantic-kernel/blob/main/CONTRIBUTING.md#development-scripts)
raises no violations
- [X] All unit tests pass, and I have added new tests where possible
- [X] I didn't break anyone 😄
This commit is contained in:
Evan Mattson
2025-02-14 05:20:24 +00:00
committed by GitHub
parent 1e0866383c
commit 76d101eafd
14 changed files with 93 additions and 44 deletions
@@ -3,7 +3,6 @@
import asyncio
import logging
from azure.ai.projects.aio import AIProjectClient
from azure.ai.projects.models import AzureAISearchTool, ConnectionType
from azure.identity.aio import DefaultAzureCredential
@@ -42,7 +41,7 @@ async def main() -> None:
async with (
DefaultAzureCredential() as creds,
AIProjectClient.from_connection_string(
AzureAIAgent.create_client(
credential=creds,
conn_str=ai_agent_settings.project_connection_string.get_secret_value(),
) as client,
@@ -51,7 +50,7 @@ async def main() -> None:
ai_search_conn_id = ""
for conn in conn_list:
if conn.connection_type == ConnectionType.AZURE_AI_SEARCH:
if conn.connection_type == ConnectionType.AZURE_AI_SEARCH and conn.authentication_type == "ApiKey":
ai_search_conn_id = conn.id
break
@@ -3,7 +3,6 @@
import asyncio
import os
from azure.ai.projects.aio import AIProjectClient
from azure.ai.projects.models import CodeInterpreterTool, FilePurpose
from azure.identity.aio import DefaultAzureCredential
@@ -24,7 +23,7 @@ async def main() -> None:
async with (
DefaultAzureCredential() as creds,
AIProjectClient.from_connection_string(
AzureAIAgent.create_client(
credential=creds,
conn_str=ai_agent_settings.project_connection_string.get_secret_value(),
) as client,
@@ -3,7 +3,6 @@
import asyncio
from typing import Annotated
from azure.ai.projects.aio import AIProjectClient
from azure.identity.aio import DefaultAzureCredential
from semantic_kernel.agents.azure_ai import AzureAIAgent, AzureAIAgentSettings
@@ -36,7 +35,7 @@ async def main() -> None:
async with (
DefaultAzureCredential() as creds,
AIProjectClient.from_connection_string(
AzureAIAgent.create_client(
credential=creds,
conn_str=ai_agent_settings.project_connection_string.get_secret_value(),
) as client,
@@ -33,7 +33,22 @@ The .env should be placed in the root directory.
## Configuring the AI Project Client
Ensure that your Azure AI Agent resources are properly configured with at least a Basic or Standard SKU.
Ensure that your Azure AI Agent resources are configured with at least a Basic or Standard SKU.
To begin, create the project client as follows:
```python
ai_agent_settings = AzureAIAgentSettings.create()
async with DefaultAzureCredential() as credential:
client = await AzureAIAgent.create_client(
connection_string=ai_agent_settings.project_connection_string.get_secret_value(),
credential=credential,
)
async with client:
# Your operational code here
```
### Required Imports
@@ -3,7 +3,6 @@
import asyncio
from typing import Annotated
from azure.ai.projects.aio import AIProjectClient
from azure.identity.aio import DefaultAzureCredential
from semantic_kernel.agents.azure_ai import AzureAIAgent, AzureAIAgentSettings
@@ -42,7 +41,7 @@ async def main() -> None:
async with (
DefaultAzureCredential() as creds,
AIProjectClient.from_connection_string(
AzureAIAgent.create_client(
credential=creds,
conn_str=ai_agent_settings.project_connection_string.get_secret_value(),
) as client,
@@ -2,7 +2,6 @@
import asyncio
from azure.ai.projects.aio import AIProjectClient
from azure.identity.aio import DefaultAzureCredential
from semantic_kernel.agents import AgentGroupChat
@@ -51,7 +50,7 @@ async def main():
async with (
DefaultAzureCredential() as creds,
AIProjectClient.from_connection_string(
AzureAIAgent.create_client(
credential=creds,
conn_str=ai_agent_settings.project_connection_string.get_secret_value(),
) as client,
@@ -2,7 +2,6 @@
import asyncio
from azure.ai.projects.aio import AIProjectClient
from azure.ai.projects.models import CodeInterpreterTool
from azure.identity.aio import DefaultAzureCredential
@@ -22,7 +21,7 @@ async def main() -> None:
async with (
DefaultAzureCredential() as creds,
AIProjectClient.from_connection_string(
AzureAIAgent.create_client(
credential=creds,
conn_str=ai_agent_settings.project_connection_string.get_secret_value(),
) as client,
@@ -3,7 +3,6 @@
import asyncio
import os
from azure.ai.projects.aio import AIProjectClient
from azure.ai.projects.models import FileSearchTool, OpenAIFile, VectorStore
from azure.identity.aio import DefaultAzureCredential
@@ -23,7 +22,7 @@ async def main() -> None:
async with (
DefaultAzureCredential() as creds,
AIProjectClient.from_connection_string(
AzureAIAgent.create_client(
credential=creds,
conn_str=ai_agent_settings.project_connection_string.get_secret_value(),
) as client,
@@ -4,7 +4,6 @@ import asyncio
import json
import os
from azure.ai.projects.aio import AIProjectClient
from azure.ai.projects.models import (
OpenApiAnonymousAuthDetails,
OpenApiTool,
@@ -27,7 +26,7 @@ async def main() -> None:
async with (
DefaultAzureCredential() as creds,
AIProjectClient.from_connection_string(
AzureAIAgent.create_client(
credential=creds,
conn_str=ai_agent_settings.project_connection_string.get_secret_value(),
) as client,
@@ -386,16 +386,16 @@ def generate_annotation_content(
) -> AnnotationContent:
"""Generate annotation content."""
file_id = None
if isinstance(annotation, MessageTextFilePathAnnotation):
if isinstance(annotation, MessageTextFilePathAnnotation) and annotation.file_path is not None:
file_id = annotation.file_path.file_id
elif isinstance(annotation, MessageTextFileCitationAnnotation):
elif isinstance(annotation, MessageTextFileCitationAnnotation) and annotation.file_citation is not None:
file_id = annotation.file_citation.file_id
return AnnotationContent(
file_id=file_id,
quote=annotation.text,
start_index=annotation.start_index,
end_index=annotation.end_index,
start_index=annotation.start_index if annotation.start_index is not None else None,
end_index=annotation.end_index if annotation.end_index is not None else None,
)
@@ -413,6 +413,6 @@ def generate_streaming_annotation_content(
return StreamingAnnotationContent(
file_id=file_id,
quote=annotation.text,
start_index=annotation.start_index,
end_index=annotation.end_index,
start_index=annotation.start_index if annotation.start_index is not None else None,
end_index=annotation.end_index if annotation.end_index is not None else None,
)
@@ -2,7 +2,7 @@
import logging
from collections.abc import AsyncIterable, Iterable
from typing import TYPE_CHECKING, Any, ClassVar
from typing import TYPE_CHECKING, Any, ClassVar, TypeVar
from azure.ai.projects.aio import AIProjectClient
from azure.ai.projects.models import Agent as AzureAIAgentModel
@@ -29,16 +29,24 @@ from semantic_kernel.prompt_template.prompt_template_config import PromptTemplat
from semantic_kernel.utils.experimental_decorator import experimental_class
from semantic_kernel.utils.naming import generate_random_ascii_name
from semantic_kernel.utils.telemetry.agent_diagnostics.decorators import trace_agent_invocation
from semantic_kernel.utils.telemetry.user_agent import (
APP_INFO,
SEMANTIC_KERNEL_USER_AGENT,
)
logger: logging.Logger = logging.getLogger(__name__)
if TYPE_CHECKING:
from azure.identity.aio import DefaultAzureCredential
from semantic_kernel.contents.chat_message_content import ChatMessageContent
AgentsApiResponseFormatOption = (
str | AgentsApiResponseFormatMode | AgentsApiResponseFormat | ResponseFormatJsonSchemaType
)
_T = TypeVar("_T", bound="AzureAIAgent")
@experimental_class
class AzureAIAgent(Agent):
@@ -115,6 +123,27 @@ class AzureAIAgent(Agent):
super().__init__(**args)
@classmethod
def create_client(
cls: type[_T], credential: "DefaultAzureCredential", conn_str: str, **kwargs: Any
) -> AIProjectClient:
"""Create the Azure AI Project client using the connection string.
Args:
credential: The credential
conn_str: The connection string
kwargs: Additional keyword arguments
Returns:
AIProjectClient: The Azure AI Project client
"""
return AIProjectClient.from_connection_string(
credential=credential,
conn_str=conn_str,
**({"user_agent": SEMANTIC_KERNEL_USER_AGENT} if APP_INFO else {}),
**kwargs,
)
async def add_chat_message(self, thread_id: str, message: "ChatMessageContent") -> "ThreadMessage | None":
"""Add a chat message to the thread.
@@ -73,7 +73,7 @@ class AzureOpenAISettings(KernelBaseSettings):
- api_version: str | None - The API version to use. The default value is "2024-02-01".
(Env var AZURE_OPENAI_API_VERSION)
- token_endpoint: str - The token endpoint to use to retrieve the authentication token.
The default value is "https://cognitiveservices.azure.com".
The default value is "https://cognitiveservices.azure.com/.default".
(Env var AZURE_OPENAI_TOKEN_ENDPOINT)
"""
@@ -89,7 +89,7 @@ class AzureOpenAISettings(KernelBaseSettings):
base_url: HttpsUrl | None = None
api_key: SecretStr | None = None
api_version: str = DEFAULT_AZURE_API_VERSION
token_endpoint: str = "https://cognitiveservices.azure.com"
token_endpoint: str = "https://cognitiveservices.azure.com/.default"
def get_azure_openai_auth_token(self, token_endpoint: str | None = None) -> str | None:
"""Retrieve a Microsoft Entra Auth Token for a given token endpoint for the use with Azure OpenAI.
@@ -100,7 +100,7 @@ class AzureOpenAISettings(KernelBaseSettings):
The `token_endpoint` argument takes precedence over the `token_endpoint` attribute.
Args:
token_endpoint: The token endpoint to use. Defaults to `https://cognitiveservices.azure.com`.
token_endpoint: The token endpoint to use. Defaults to `https://cognitiveservices.azure.com/.default`.
Returns:
The Azure token or None if the token could not be retrieved.
@@ -1,9 +1,10 @@
# Copyright (c) Microsoft. All rights reserved.
from unittest.mock import AsyncMock, patch
from unittest.mock import AsyncMock, MagicMock, patch
from azure.ai.projects.aio import AIProjectClient
from azure.ai.projects.models import Agent as AzureAIAgentModel
from azure.identity.aio import DefaultAzureCredential
from semantic_kernel.agents.azure_ai.azure_ai_agent import AzureAIAgent
from semantic_kernel.agents.channels.agent_channel import AgentChannel
@@ -111,3 +112,27 @@ async def test_azure_ai_agent_create_channel():
ch = await agent.create_channel()
assert isinstance(ch, AgentChannel)
assert ch.thread_id == "t"
def test_create_client():
conn_str = "endpoint;subscription_id;resource_group;project_name"
credential = MagicMock(spec=DefaultAzureCredential)
with patch("azure.ai.projects.aio.AIProjectClient.from_connection_string") as mock_from_conn_str:
mock_client = MagicMock(spec=AIProjectClient)
mock_from_conn_str.return_value = mock_client
client = AzureAIAgent.create_client(
credential=credential,
conn_str=conn_str,
extra_arg="extra_value",
)
mock_from_conn_str.assert_called_once()
_, actual_kwargs = mock_from_conn_str.call_args
assert actual_kwargs["credential"] is credential
assert actual_kwargs["conn_str"] == conn_str
assert actual_kwargs["extra_arg"] == "extra_value"
assert actual_kwargs["user_agent"] is not None
assert client is mock_client
+3 -15
View File
@@ -2719,7 +2719,6 @@ name = "nvidia-cublas-cu12"
version = "12.4.5.8"
source = { registry = "https://pypi.org/simple" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/7f/7f/7fbae15a3982dc9595e49ce0f19332423b260045d0a6afe93cdbe2f1f624/nvidia_cublas_cu12-12.4.5.8-py3-none-manylinux2014_aarch64.whl", hash = "sha256:0f8aa1706812e00b9f19dfe0cdb3999b092ccb8ca168c0db5b8ea712456fd9b3", size = 363333771 },
{ url = "https://files.pythonhosted.org/packages/ae/71/1c91302526c45ab494c23f61c7a84aa568b8c1f9d196efa5993957faf906/nvidia_cublas_cu12-12.4.5.8-py3-none-manylinux2014_x86_64.whl", hash = "sha256:2fc8da60df463fdefa81e323eef2e36489e1c94335b5358bcb38360adf75ac9b", size = 363438805 },
]
@@ -2728,7 +2727,6 @@ name = "nvidia-cuda-cupti-cu12"
version = "12.4.127"
source = { registry = "https://pypi.org/simple" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/93/b5/9fb3d00386d3361b03874246190dfec7b206fd74e6e287b26a8fcb359d95/nvidia_cuda_cupti_cu12-12.4.127-py3-none-manylinux2014_aarch64.whl", hash = "sha256:79279b35cf6f91da114182a5ce1864997fd52294a87a16179ce275773799458a", size = 12354556 },
{ url = "https://files.pythonhosted.org/packages/67/42/f4f60238e8194a3106d06a058d494b18e006c10bb2b915655bd9f6ea4cb1/nvidia_cuda_cupti_cu12-12.4.127-py3-none-manylinux2014_x86_64.whl", hash = "sha256:9dec60f5ac126f7bb551c055072b69d85392b13311fcc1bcda2202d172df30fb", size = 13813957 },
]
@@ -2737,7 +2735,6 @@ name = "nvidia-cuda-nvrtc-cu12"
version = "12.4.127"
source = { registry = "https://pypi.org/simple" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/77/aa/083b01c427e963ad0b314040565ea396f914349914c298556484f799e61b/nvidia_cuda_nvrtc_cu12-12.4.127-py3-none-manylinux2014_aarch64.whl", hash = "sha256:0eedf14185e04b76aa05b1fea04133e59f465b6f960c0cbf4e37c3cb6b0ea198", size = 24133372 },
{ url = "https://files.pythonhosted.org/packages/2c/14/91ae57cd4db3f9ef7aa99f4019cfa8d54cb4caa7e00975df6467e9725a9f/nvidia_cuda_nvrtc_cu12-12.4.127-py3-none-manylinux2014_x86_64.whl", hash = "sha256:a178759ebb095827bd30ef56598ec182b85547f1508941a3d560eb7ea1fbf338", size = 24640306 },
]
@@ -2746,7 +2743,6 @@ name = "nvidia-cuda-runtime-cu12"
version = "12.4.127"
source = { registry = "https://pypi.org/simple" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/a1/aa/b656d755f474e2084971e9a297def515938d56b466ab39624012070cb773/nvidia_cuda_runtime_cu12-12.4.127-py3-none-manylinux2014_aarch64.whl", hash = "sha256:961fe0e2e716a2a1d967aab7caee97512f71767f852f67432d572e36cb3a11f3", size = 894177 },
{ url = "https://files.pythonhosted.org/packages/ea/27/1795d86fe88ef397885f2e580ac37628ed058a92ed2c39dc8eac3adf0619/nvidia_cuda_runtime_cu12-12.4.127-py3-none-manylinux2014_x86_64.whl", hash = "sha256:64403288fa2136ee8e467cdc9c9427e0434110899d07c779f25b5c068934faa5", size = 883737 },
]
@@ -2769,7 +2765,6 @@ dependencies = [
{ name = "nvidia-nvjitlink-cu12", marker = "sys_platform == 'linux'" },
]
wheels = [
{ url = "https://files.pythonhosted.org/packages/7a/8a/0e728f749baca3fbeffad762738276e5df60851958be7783af121a7221e7/nvidia_cufft_cu12-11.2.1.3-py3-none-manylinux2014_aarch64.whl", hash = "sha256:5dad8008fc7f92f5ddfa2101430917ce2ffacd86824914c82e28990ad7f00399", size = 211422548 },
{ url = "https://files.pythonhosted.org/packages/27/94/3266821f65b92b3138631e9c8e7fe1fb513804ac934485a8d05776e1dd43/nvidia_cufft_cu12-11.2.1.3-py3-none-manylinux2014_x86_64.whl", hash = "sha256:f083fc24912aa410be21fa16d157fed2055dab1cc4b6934a0e03cba69eb242b9", size = 211459117 },
]
@@ -2778,7 +2773,6 @@ name = "nvidia-curand-cu12"
version = "10.3.5.147"
source = { registry = "https://pypi.org/simple" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/80/9c/a79180e4d70995fdf030c6946991d0171555c6edf95c265c6b2bf7011112/nvidia_curand_cu12-10.3.5.147-py3-none-manylinux2014_aarch64.whl", hash = "sha256:1f173f09e3e3c76ab084aba0de819c49e56614feae5c12f69883f4ae9bb5fad9", size = 56314811 },
{ url = "https://files.pythonhosted.org/packages/8a/6d/44ad094874c6f1b9c654f8ed939590bdc408349f137f9b98a3a23ccec411/nvidia_curand_cu12-10.3.5.147-py3-none-manylinux2014_x86_64.whl", hash = "sha256:a88f583d4e0bb643c49743469964103aa59f7f708d862c3ddb0fc07f851e3b8b", size = 56305206 },
]
@@ -2792,7 +2786,6 @@ dependencies = [
{ name = "nvidia-nvjitlink-cu12", marker = "sys_platform == 'linux'" },
]
wheels = [
{ url = "https://files.pythonhosted.org/packages/46/6b/a5c33cf16af09166845345275c34ad2190944bcc6026797a39f8e0a282e0/nvidia_cusolver_cu12-11.6.1.9-py3-none-manylinux2014_aarch64.whl", hash = "sha256:d338f155f174f90724bbde3758b7ac375a70ce8e706d70b018dd3375545fc84e", size = 127634111 },
{ url = "https://files.pythonhosted.org/packages/3a/e1/5b9089a4b2a4790dfdea8b3a006052cfecff58139d5a4e34cb1a51df8d6f/nvidia_cusolver_cu12-11.6.1.9-py3-none-manylinux2014_x86_64.whl", hash = "sha256:19e33fa442bcfd085b3086c4ebf7e8debc07cfe01e11513cc6d332fd918ac260", size = 127936057 },
]
@@ -2804,7 +2797,6 @@ dependencies = [
{ name = "nvidia-nvjitlink-cu12", marker = "sys_platform == 'linux'" },
]
wheels = [
{ url = "https://files.pythonhosted.org/packages/96/a9/c0d2f83a53d40a4a41be14cea6a0bf9e668ffcf8b004bd65633f433050c0/nvidia_cusparse_cu12-12.3.1.170-py3-none-manylinux2014_aarch64.whl", hash = "sha256:9d32f62896231ebe0480efd8a7f702e143c98cfaa0e8a76df3386c1ba2b54df3", size = 207381987 },
{ url = "https://files.pythonhosted.org/packages/db/f7/97a9ea26ed4bbbfc2d470994b8b4f338ef663be97b8f677519ac195e113d/nvidia_cusparse_cu12-12.3.1.170-py3-none-manylinux2014_x86_64.whl", hash = "sha256:ea4f11a2904e2a8dc4b1833cc1b5181cde564edd0d5cd33e3c168eff2d1863f1", size = 207454763 },
]
@@ -2813,7 +2805,6 @@ name = "nvidia-cusparselt-cu12"
version = "0.6.2"
source = { registry = "https://pypi.org/simple" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/98/8e/675498726c605c9441cf46653bd29cb1b8666da1fb1469ffa25f67f20c58/nvidia_cusparselt_cu12-0.6.2-py3-none-manylinux2014_aarch64.whl", hash = "sha256:067a7f6d03ea0d4841c85f0c6f1991c5dda98211f6302cb83a4ab234ee95bef8", size = 149422781 },
{ url = "https://files.pythonhosted.org/packages/78/a8/bcbb63b53a4b1234feeafb65544ee55495e1bb37ec31b999b963cbccfd1d/nvidia_cusparselt_cu12-0.6.2-py3-none-manylinux2014_x86_64.whl", hash = "sha256:df2c24502fd76ebafe7457dbc4716b2fec071aabaed4fb7691a201cde03704d9", size = 150057751 },
]
@@ -2830,7 +2821,6 @@ name = "nvidia-nvjitlink-cu12"
version = "12.4.127"
source = { registry = "https://pypi.org/simple" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/02/45/239d52c05074898a80a900f49b1615d81c07fceadd5ad6c4f86a987c0bc4/nvidia_nvjitlink_cu12-12.4.127-py3-none-manylinux2014_aarch64.whl", hash = "sha256:4abe7fef64914ccfa909bc2ba39739670ecc9e820c83ccc7a6ed414122599b83", size = 20552510 },
{ url = "https://files.pythonhosted.org/packages/ff/ff/847841bacfbefc97a00036e0fce5a0f086b640756dc38caea5e1bb002655/nvidia_nvjitlink_cu12-12.4.127-py3-none-manylinux2014_x86_64.whl", hash = "sha256:06b3b9b25bf3f8af351d664978ca26a16d2c5127dbd53c0497e28d1fb9611d57", size = 21066810 },
]
@@ -2839,7 +2829,6 @@ name = "nvidia-nvtx-cu12"
version = "12.4.127"
source = { registry = "https://pypi.org/simple" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/06/39/471f581edbb7804b39e8063d92fc8305bdc7a80ae5c07dbe6ea5c50d14a5/nvidia_nvtx_cu12-12.4.127-py3-none-manylinux2014_aarch64.whl", hash = "sha256:7959ad635db13edf4fc65c06a6e9f9e55fc2f92596db928d169c0bb031e88ef3", size = 100417 },
{ url = "https://files.pythonhosted.org/packages/87/20/199b8713428322a2f22b722c62b8cc278cc53dffa9705d744484b5035ee9/nvidia_nvtx_cu12-12.4.127-py3-none-manylinux2014_x86_64.whl", hash = "sha256:781e950d9b9f60d8241ccea575b32f5105a5baf4c2351cab5256a24869f12a1a", size = 99144 },
]
@@ -2906,8 +2895,8 @@ name = "onnxruntime-genai"
version = "0.5.2"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "numpy", marker = "sys_platform == 'darwin' or sys_platform == 'linux' or sys_platform == 'win32'" },
{ name = "onnxruntime", marker = "sys_platform == 'darwin' or sys_platform == 'linux' or sys_platform == 'win32'" },
{ name = "numpy", marker = "(python_full_version < '3.13' and sys_platform == 'darwin') or (python_full_version < '3.13' and sys_platform == 'linux') or (python_full_version < '3.13' and sys_platform == 'win32')" },
{ name = "onnxruntime", marker = "(python_full_version < '3.13' and sys_platform == 'darwin') or (python_full_version < '3.13' and sys_platform == 'linux') or (python_full_version < '3.13' and sys_platform == 'win32')" },
]
wheels = [
{ url = "https://files.pythonhosted.org/packages/52/35/22a421f852eb14f47c33a4dd4c3ef58a2f3d5a96be8bb6d6cc271b2a0e83/onnxruntime_genai-0.5.2-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:cd322ead0027fbfa309e7be76c4512157ad369dc189ab3334a58a199b4f58a02", size = 769921 },
@@ -4770,7 +4759,6 @@ wheels = [
[[package]]
name = "semantic-kernel"
version = "1.21.0"
source = { editable = "." }
dependencies = [
{ name = "aiohttp", marker = "sys_platform == 'darwin' or sys_platform == 'linux' or sys_platform == 'win32'" },
@@ -4909,7 +4897,7 @@ requires-dist = [
{ name = "jinja2", specifier = "~=3.1" },
{ name = "milvus", marker = "sys_platform != 'win32' and extra == 'milvus'", specifier = ">=2.3,<2.3.8" },
{ name = "mistralai", marker = "extra == 'mistralai'", specifier = ">=1.2,<2.0" },
{ name = "motor", marker = "extra == 'mongo'", specifier = ">=3.3.2,<3.7.0" },
{ name = "motor", marker = "extra == 'mongo'", specifier = ">=3.3.2,<3.8.0" },
{ name = "nest-asyncio", specifier = "~=1.6" },
{ name = "numpy", marker = "python_full_version < '3.12'", specifier = ">=1.25.0" },
{ name = "numpy", marker = "python_full_version >= '3.12'", specifier = ">=1.26.0" },