From 9c5255fefd252d217642846359724fae88701a23 Mon Sep 17 00:00:00 2001 From: Evan Mattson Date: Wed, 14 May 2025 17:46:23 +0900 Subject: [PATCH 01/18] wip --- .../agents/open_ai/open_ai_assistant_agent.py | 238 +++++++++++++++++- 1 file changed, 235 insertions(+), 3 deletions(-) diff --git a/python/semantic_kernel/agents/open_ai/open_ai_assistant_agent.py b/python/semantic_kernel/agents/open_ai/open_ai_assistant_agent.py index 296e83e81246..db12f2acde53 100644 --- a/python/semantic_kernel/agents/open_ai/open_ai_assistant_agent.py +++ b/python/semantic_kernel/agents/open_ai/open_ai_assistant_agent.py @@ -1,10 +1,13 @@ # Copyright (c) Microsoft. All rights reserved. +import inspect import logging import sys from collections.abc import AsyncIterable, Awaitable, Callable, Iterable -from copy import copy -from typing import TYPE_CHECKING, Any, ClassVar, Literal +from copy import copy, deepcopy +from typing import TYPE_CHECKING, Any, ClassVar, Literal, TypeVar + +from semantic_kernel.agents.azure_ai.azure_ai_agent_settings import AzureAIAgentSettings if sys.version_info >= (3, 12): from typing import override # pragma: no cover @@ -24,7 +27,7 @@ from pydantic import BaseModel, Field, ValidationError from semantic_kernel.agents import Agent -from semantic_kernel.agents.agent import AgentResponseItem, AgentThread +from semantic_kernel.agents.agent import AgentResponseItem, AgentSpec, AgentThread from semantic_kernel.agents.channels.agent_channel import AgentChannel from semantic_kernel.agents.channels.open_ai_assistant_channel import OpenAIAssistantChannel from semantic_kernel.agents.open_ai.assistant_thread_actions import AssistantThreadActions @@ -59,10 +62,92 @@ from openai.types.beta.threads.run_create_params import TruncationStrategy from semantic_kernel.kernel import Kernel + from semantic_kernel.kernel_pydantic import KernelBaseSettings from semantic_kernel.prompt_template.prompt_template_config import PromptTemplateConfig +_T = TypeVar("_T", bound="OpenAIAssistantAgent") + logger: logging.Logger = logging.getLogger(__name__) +# region Declarative Spec + +_TOOL_BUILDERS: dict[str, Callable[[ToolSpec, Kernel | None], ToolDefinition]] = {} + + +def _register_tool(tool_type: str): + def decorator(fn: Callable[[ToolSpec, Kernel | None], ToolDefinition]): + _TOOL_BUILDERS[tool_type.lower()] = fn + return fn + + return decorator + + +@_register_tool("code_interpreter") +def _code_interpreter(spec: ToolSpec) -> CodeInterpreterTool: + file_ids = spec.options.get("file_ids") + return CodeInterpreterTool(file_ids=file_ids) if file_ids else CodeInterpreterTool() + + +@_register_tool("file_search") +def _file_search(spec: ToolSpec) -> FileSearchTool: + vector_store_ids = spec.options.get("vector_store_ids") + if not vector_store_ids or not isinstance(vector_store_ids, list) or not vector_store_ids[0]: + raise AgentInitializationException(f"Missing or malformed 'vector_store_ids' in: {spec}") + return FileSearchTool(vector_store_ids=vector_store_ids) + + +@_register_tool("function") +def _function(spec: ToolSpec, kernel: "Kernel") -> ToolDefinition: + def parse_fqn(fqn: str) -> tuple[str, str]: + parts = fqn.split(".") + if len(parts) != 2: + raise AgentInitializationException(f"Function `{fqn}` must be in the form `pluginName.functionName`.") + return parts[0], parts[1] + + if not spec.id: + raise AgentInitializationException("Function ID is required for function tools.") + plugin_name, function_name = parse_fqn(spec.id) + funcs = kernel.get_list_of_function_metadata_filters({"included_functions": f"{plugin_name}-{function_name}"}) + + match len(funcs): + case 0: + raise AgentInitializationException(f"Function `{spec.id}` not found in kernel.") + case 1: + return kernel_function_metadata_to_function_call_format(funcs[0]) # type: ignore[return-value] + case _: + raise AgentInitializationException(f"Multiple definitions found for `{spec.id}`. Please remove duplicates.") + + +def _build_tool(spec: ToolSpec, kernel: "Kernel") -> ToolDefinition: + if not spec.type: + raise AgentInitializationException("Tool spec must include a 'type' field.") + + try: + builder = _TOOL_BUILDERS[spec.type.lower()] + except KeyError as exc: + raise AgentInitializationException(f"Unsupported tool type: {spec.type}") from exc + + sig = inspect.signature(builder) + return builder(spec) if len(sig.parameters) == 1 else builder(spec, kernel) # type: ignore[call-arg] + + +def _build_tool_resources(tool_defs: list[ToolDefinition]) -> ToolResources | None: + """Collects tool resources from known tool types with resource needs.""" + resources: dict[str, Any] = {} + + for tool in tool_defs: + if isinstance(tool, CodeInterpreterTool): + resources["code_interpreter"] = tool.resources.code_interpreter + elif isinstance(tool, AzureAISearchTool): + resources["azure_ai_search"] = tool.resources.azure_ai_search + elif isinstance(tool, FileSearchTool): + resources["file_search"] = tool.resources.file_search + + return ToolResources(**resources) if resources else None + + +# endregion + @release_candidate class AssistantAgentThread(AgentThread): @@ -302,6 +387,153 @@ def setup_resources( # endregion + # region Declarative Spec + + @override + @classmethod + async def _from_dict( + cls: type[_T], + data: dict, + *, + kernel: Kernel, + prompt_template_config: PromptTemplateConfig | None = None, + **kwargs, + ) -> _T: + """Create an Azure AI Agent from the provided dictionary. + + Args: + data: The dictionary containing the agent data. + kernel: The kernel to use for the agent. + prompt_template_config: The prompt template configuration. + kwargs: Additional keyword arguments. Note: unsupported keys may raise validation errors. + + Returns: + AzureAIAgent: The Azure AI Agent instance. + """ + client: AsyncOpenAI = kwargs.pop("client", None) + if client is None: + raise AgentInitializationException("Missing required 'client' in AzureAIAgent._from_dict()") + + spec = AgentSpec.model_validate(data) + + if "settings" in kwargs: + kwargs.pop("settings") + + if spec.id: + existing_definition = await client.beta.assistants.retrieve(spec.id) + + # Create a mutable clone + definition = deepcopy(existing_definition) + + # Selectively override attributes from spec + if spec.name is not None: + setattr(definition, "name", spec.name) + if spec.description is not None: + setattr(definition, "description", spec.description) + if spec.instructions is not None: + setattr(definition, "instructions", spec.instructions) + if spec.extras: + merged_metadata = dict(getattr(definition, "metadata", {}) or {}) + merged_metadata.update(spec.extras) + setattr(definition, "metadata", merged_metadata) + + return cls( + definition=definition, + client=client, + kernel=kernel, + prompt_template_config=prompt_template_config, + **kwargs, + ) + + if not (spec.model and spec.model.id): + raise ValueError("model.id required when creating a new Azure AI agent") + + # Build tool definitions & resources + tool_objs = [_build_tool(t, kernel) for t in spec.tools if t.type != "function"] + tool_defs = [d for tool in tool_objs for d in (tool.definitions if hasattr(tool, "definitions") else [tool])] + tool_resources = _build_tool_resources(tool_objs) + + try: + agent_definition = await client.agents.create_agent( + model=spec.model.id, + name=spec.name, + description=spec.description, + instructions=spec.instructions, + tools=tool_defs, + tool_resources=tool_resources, + metadata=spec.extras, + **kwargs, + ) + except Exception as ex: + print(f"Error creating agent: {ex}") + + return cls( + definition=agent_definition, + client=client, + kernel=kernel, + prompt_template_config=prompt_template_config, + **kwargs, + ) + + @override + @classmethod + def resolve_placeholders( + cls: type[_T], + yaml_str: str, + settings: "KernelBaseSettings | None" = None, + extras: dict[str, Any] | None = None, + ) -> str: + """Substitute ${AzureAI:Key} placeholders with fields from AzureAIAgentSettings and extras.""" + import re + + pattern = re.compile(r"\$\{([^}]+)\}") + + # Build the mapping only if settings is provided and valid + field_mapping: dict[str, Any] = {} + + if settings is not None: + if not isinstance(settings, OpenAISettings | AzureAIAgentSettings): + raise AgentInitializationException(f"Expected AzureAIAgentSettings, got {type(settings).__name__}") + + field_mapping.update({ + "ChatModelId": getattr(settings, "model_deployment_name", None), + "ConnectionString": cls._get_setting(getattr(settings, "project_connection_string", None)), + "AgentId": cls._get_setting(getattr(settings, "agent_id", None)), + "Endpoint": cls._get_setting(getattr(settings, "endpoint", None)), + "SubscriptionId": cls._get_setting(getattr(settings, "subscription_id", None)), + "ResourceGroup": cls._get_setting(getattr(settings, "resource_group_name", None)), + "ProjectName": cls._get_setting(getattr(settings, "project_name", None)), + "BingConnectionId": cls._get_setting(getattr(settings, "bing_connection_id", None)), + "AzureAISearchConnectionId": cls._get_setting(getattr(settings, "azure_ai_search_connection_id", None)), + "AzureAISearchIndexName": cls._get_setting(getattr(settings, "azure_ai_search_index_name", None)), + }) + + if extras: + field_mapping.update(extras) + + def replacer(match: re.Match[str]) -> str: + """Replace the matched placeholder with the corresponding value from field_mapping.""" + full_key = match.group(1) # for example, AzureAI:AzureAISearchConnectionId + section, _, key = full_key.partition(":") + if section != "AzureAI": + return match.group(0) + + # Try short key first (AzureAISearchConnectionId), then full (AzureAI:AzureAISearchConnectionId) + return str(field_mapping.get(key) or field_mapping.get(full_key) or match.group(0)) + + result = pattern.sub(replacer, yaml_str) + + # Safety check for unresolved placeholders + unresolved = pattern.findall(result) + if unresolved: + raise AgentInitializationException( + f"Unresolved placeholders in spec: {', '.join(f'${{{key}}}' for key in unresolved)}" + ) + + return result + + # endregion + # region Tool Handling @staticmethod From b599ef61b2c4f36b27f95371e5d91d64e1740f04 Mon Sep 17 00:00:00 2001 From: Evan Mattson Date: Wed, 14 May 2025 17:46:30 +0900 Subject: [PATCH 02/18] wip --- .../semantic_kernel/agents/open_ai/open_ai_assistant_agent.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/python/semantic_kernel/agents/open_ai/open_ai_assistant_agent.py b/python/semantic_kernel/agents/open_ai/open_ai_assistant_agent.py index db12f2acde53..338d6600a26c 100644 --- a/python/semantic_kernel/agents/open_ai/open_ai_assistant_agent.py +++ b/python/semantic_kernel/agents/open_ai/open_ai_assistant_agent.py @@ -454,7 +454,7 @@ async def _from_dict( tool_resources = _build_tool_resources(tool_objs) try: - agent_definition = await client.agents.create_agent( + agent_definition = await client.beta.assistants.create( model=spec.model.id, name=spec.name, description=spec.description, From 8da28cfcf412a51096971ab87e858e7e88439857 Mon Sep 17 00:00:00 2001 From: Evan Mattson Date: Fri, 16 May 2025 13:21:06 +0900 Subject: [PATCH 03/18] wip --- .../step6_assistant_openai_declarative.py | 104 ++++++++++++++++++ python/semantic_kernel/agents/agent.py | 2 + .../agents/open_ai/azure_assistant_agent.py | 75 ++++++++++++- .../agents/open_ai/open_ai_assistant_agent.py | 102 ++++++++--------- 4 files changed, 231 insertions(+), 52 deletions(-) create mode 100644 python/samples/getting_started_with_agents/openai_assistant/step6_assistant_openai_declarative.py diff --git a/python/samples/getting_started_with_agents/openai_assistant/step6_assistant_openai_declarative.py b/python/samples/getting_started_with_agents/openai_assistant/step6_assistant_openai_declarative.py new file mode 100644 index 000000000000..4cfe63c5f18b --- /dev/null +++ b/python/samples/getting_started_with_agents/openai_assistant/step6_assistant_openai_declarative.py @@ -0,0 +1,104 @@ +# Copyright (c) Microsoft. All rights reserved. +import asyncio +from typing import Annotated + +from semantic_kernel.agents import AgentRegistry, OpenAIAssistantAgent +from semantic_kernel.functions import kernel_function + +""" +The following sample demonstrates how to create an OpenAI assistant using either +Azure OpenAI or OpenAI. The sample shows how to have the assistant answrer +questions about the world. + +The interaction with the agent is via the `get_response` method, which sends a +user input to the agent and receives a response from the agent. The conversation +history is maintained by the agent service, i.e. the responses are automatically +associated with the thread. Therefore, client code does not need to maintain the +conversation history. +""" + +# Simulate a conversation with the agent +USER_INPUTS = [ + "Hello", + "What is the special soup?", + "How much does that cost?", + "Thank you", +] + +# Define the YAML string for the sample +SPEC = """ +type: openai_assistant +name: Host +instructions: Respond politely to the user's questions. +model: + id: ${OpenAI:ChatModelId} +tools: + - id: MenuPlugin.get_specials + type: function + - id: MenuPlugin.get_item_price + type: function +""" + + +# Define a sample plugin for the sample +class MenuPlugin: + """A sample Menu Plugin used for the concept sample.""" + + @kernel_function(description="Provides a list of specials from the menu.") + def get_specials(self) -> Annotated[str, "Returns the specials from the menu."]: + return """ + Special Soup: Clam Chowder + Special Salad: Cobb Salad + Special Drink: Chai Tea + """ + + @kernel_function(description="Provides the price of the requested menu item.") + def get_item_price( + self, menu_item: Annotated[str, "The name of the menu item."] + ) -> Annotated[str, "Returns the price of the menu item."]: + return "$9.99" + + +async def main(): + # 1. Create the client using Azure OpenAI resources and configuration + client, _ = OpenAIAssistantAgent.setup_resources() + + # 2. Create the assistant on the Azure OpenAI service + agent: OpenAIAssistantAgent = await AgentRegistry.create_from_yaml( + SPEC, + plugins=[MenuPlugin()], + client=client, + ) + + # 3. Create a thread for the agent + # If no thread is provided, a new thread will be + # created and returned with the initial response + thread = None + + try: + for user_input in USER_INPUTS: + print(f"# User: {user_input}") + # 4. Invoke the agent for the specified thread for response + async for response in agent.invoke( + messages=user_input, + thread=thread, + ): + print(f"# {response.name}: {response}") + thread = response.thread + finally: + # 5. Clean up the resources + await thread.delete() if thread else None + await agent.client.beta.assistants.delete(assistant_id=agent.id) + + """ + Sample Output: + + # User: Hello + # Agent: Hello! How can I assist you today? + # User: What is the special soup? + # ... + """ + + +if __name__ == "__main__": + asyncio.run(main()) diff --git a/python/semantic_kernel/agents/agent.py b/python/semantic_kernel/agents/agent.py index 470fce37569e..7fe83abbcccc 100644 --- a/python/semantic_kernel/agents/agent.py +++ b/python/semantic_kernel/agents/agent.py @@ -642,6 +642,8 @@ def decorator(cls: type[_TAgent]) -> type[_TAgent]: _BUILTIN_AGENT_MODULES = [ "semantic_kernel.agents.chat_completion.chat_completion_agent", "semantic_kernel.agents.azure_ai.azure_ai_agent", + "semantic_kernel.agents.open_ai.open_ai_assistant_agent", + "semantic_kernel.agents.open_ai.azure_assistant_agent", ] diff --git a/python/semantic_kernel/agents/open_ai/azure_assistant_agent.py b/python/semantic_kernel/agents/open_ai/azure_assistant_agent.py index 343d94859283..bce70cd2c7b4 100644 --- a/python/semantic_kernel/agents/open_ai/azure_assistant_agent.py +++ b/python/semantic_kernel/agents/open_ai/azure_assistant_agent.py @@ -1,21 +1,38 @@ # Copyright (c) Microsoft. All rights reserved. +import sys from collections.abc import Awaitable, Callable from copy import copy -from typing import Any +from typing import TYPE_CHECKING, Any from openai import AsyncAzureOpenAI from pydantic import ValidationError from semantic_kernel.agents import OpenAIAssistantAgent +from semantic_kernel.agents.agent import register_agent_type from semantic_kernel.connectors.ai.open_ai.settings.azure_open_ai_settings import AzureOpenAISettings from semantic_kernel.exceptions.agent_exceptions import AgentInitializationException from semantic_kernel.utils.authentication.entra_id_authentication import get_entra_auth_token from semantic_kernel.utils.feature_stage_decorator import release_candidate from semantic_kernel.utils.telemetry.user_agent import APP_INFO, prepend_semantic_kernel_to_user_agent +if TYPE_CHECKING: + from semantic_kernel.kernel_pydantic import KernelBaseSettings + + +if sys.version_info >= (3, 12): + from typing import override # pragma: no cover +else: + from typing_extensions import override # pragma: no cover + +if sys.version < "3.11": + from typing_extensions import Self # pragma: no cover +else: + from typing import Self # type: ignore # pragma: no cover + @release_candidate +@register_agent_type("azure_openai_assistant") class AzureAssistantAgent(OpenAIAssistantAgent): """An Azure Assistant Agent class that extends the OpenAI Assistant Agent class.""" @@ -108,3 +125,59 @@ def setup_resources( ) return client, azure_openai_settings.chat_deployment_name + + @override + @classmethod + def resolve_placeholders( + cls: type[Self], + yaml_str: str, + settings: "KernelBaseSettings | None" = None, + extras: dict[str, Any] | None = None, + ) -> str: + """Substitute ${OpenAI:Key} placeholders with fields from OpenAIAgentSettings and extras.""" + import re + + pattern = re.compile(r"\$\{([^}]+)\}") + + # Build the mapping only if settings is provided and valid + field_mapping: dict[str, Any] = {} + + if settings is None: + settings = AzureOpenAISettings() + + if not isinstance(settings, AzureOpenAISettings): + raise AgentInitializationException(f"Expected AzureOpenAISettings, got {type(settings).__name__}") + + field_mapping.update({ + "ChatModelId": getattr(settings, "chat_deployment_name", None), + "AgentId": getattr(settings, "agent_id", None), + "ApiKey": getattr(settings, "api_key", None), + "ApiVersion": getattr(settings, "api_version", None), + "BaseUrl": getattr(settings, "base_url", None), + "Endpoint": getattr(settings, "endpoint", None), + "TokenEndpoint": getattr(settings, "token_endpoint", None), + }) + + if extras: + field_mapping.update(extras) + + def replacer(match: re.Match[str]) -> str: + """Replace the matched placeholder with the corresponding value from field_mapping.""" + full_key = match.group(1) # for example, OpenAI:ApiKey + section, _, key = full_key.partition(":") + if section != "AzureOpenAI": + return match.group(0) + + # Try short key first (ApiKey), then full (OpenAI:ApiKey) + return str(field_mapping.get(key) or field_mapping.get(full_key) or match.group(0)) + + result = pattern.sub(replacer, yaml_str) + + # Safety check for unresolved placeholders + unresolved = pattern.findall(result) + if unresolved: + raise AgentInitializationException( + f"Unresolved placeholders in spec: {', '.join(f'${{{key}}}' for key in unresolved)}" + ) + + return result diff --git a/python/semantic_kernel/agents/open_ai/open_ai_assistant_agent.py b/python/semantic_kernel/agents/open_ai/open_ai_assistant_agent.py index 338d6600a26c..8cd35dbe4d8a 100644 --- a/python/semantic_kernel/agents/open_ai/open_ai_assistant_agent.py +++ b/python/semantic_kernel/agents/open_ai/open_ai_assistant_agent.py @@ -7,13 +7,6 @@ from copy import copy, deepcopy from typing import TYPE_CHECKING, Any, ClassVar, Literal, TypeVar -from semantic_kernel.agents.azure_ai.azure_ai_agent_settings import AzureAIAgentSettings - -if sys.version_info >= (3, 12): - from typing import override # pragma: no cover -else: - from typing_extensions import override # pragma: no cover - from openai import NOT_GIVEN, AsyncOpenAI, NotGiven from openai.lib._parsing._completions import type_to_response_format_param from openai.types.beta.assistant import Assistant @@ -23,15 +16,25 @@ ToolResourcesFileSearch, ) from openai.types.beta.assistant_response_format_option_param import AssistantResponseFormatOptionParam +from openai.types.beta.assistant_tool_param import AssistantToolParam +from openai.types.beta.code_interpreter_tool_param import CodeInterpreterToolParam from openai.types.beta.file_search_tool_param import FileSearchToolParam from pydantic import BaseModel, Field, ValidationError from semantic_kernel.agents import Agent -from semantic_kernel.agents.agent import AgentResponseItem, AgentSpec, AgentThread +from semantic_kernel.agents.agent import ( + AgentResponseItem, + AgentSpec, + AgentThread, + DeclarativeSpecMixin, + ToolSpec, + register_agent_type, +) from semantic_kernel.agents.channels.agent_channel import AgentChannel from semantic_kernel.agents.channels.open_ai_assistant_channel import OpenAIAssistantChannel from semantic_kernel.agents.open_ai.assistant_thread_actions import AssistantThreadActions from semantic_kernel.agents.open_ai.run_polling_options import RunPollingOptions +from semantic_kernel.connectors.ai.function_calling_utils import kernel_function_metadata_to_function_call_format from semantic_kernel.connectors.ai.open_ai.settings.open_ai_settings import OpenAISettings from semantic_kernel.connectors.utils.structured_output_schema import generate_structured_output_response_format_schema from semantic_kernel.contents.chat_message_content import ChatMessageContent @@ -45,6 +48,7 @@ from semantic_kernel.functions import KernelArguments from semantic_kernel.functions.kernel_function import TEMPLATE_FORMAT_MAP from semantic_kernel.functions.kernel_plugin import KernelPlugin +from semantic_kernel.kernel import Kernel from semantic_kernel.schema.kernel_json_schema_builder import KernelJsonSchemaBuilder from semantic_kernel.utils.feature_stage_decorator import release_candidate from semantic_kernel.utils.naming import generate_random_ascii_name @@ -56,26 +60,28 @@ if TYPE_CHECKING: from openai import AsyncOpenAI - from openai.types.beta.assistant_tool_param import AssistantToolParam - from openai.types.beta.code_interpreter_tool_param import CodeInterpreterToolParam from openai.types.beta.thread_create_params import Message as ThreadCreateMessage from openai.types.beta.threads.run_create_params import TruncationStrategy - from semantic_kernel.kernel import Kernel from semantic_kernel.kernel_pydantic import KernelBaseSettings from semantic_kernel.prompt_template.prompt_template_config import PromptTemplateConfig +if sys.version_info >= (3, 12): + from typing import override # pragma: no cover +else: + from typing_extensions import override # pragma: no cover + _T = TypeVar("_T", bound="OpenAIAssistantAgent") logger: logging.Logger = logging.getLogger(__name__) # region Declarative Spec -_TOOL_BUILDERS: dict[str, Callable[[ToolSpec, Kernel | None], ToolDefinition]] = {} +_TOOL_BUILDERS: dict[str, Callable[[ToolSpec, Kernel | None], ToolResources]] = {} def _register_tool(tool_type: str): - def decorator(fn: Callable[[ToolSpec, Kernel | None], ToolDefinition]): + def decorator(fn: Callable[[ToolSpec, Kernel | None], ToolResources]): _TOOL_BUILDERS[tool_type.lower()] = fn return fn @@ -83,21 +89,21 @@ def decorator(fn: Callable[[ToolSpec, Kernel | None], ToolDefinition]): @_register_tool("code_interpreter") -def _code_interpreter(spec: ToolSpec) -> CodeInterpreterTool: +def _code_interpreter(spec: ToolSpec) -> CodeInterpreterToolParam: file_ids = spec.options.get("file_ids") - return CodeInterpreterTool(file_ids=file_ids) if file_ids else CodeInterpreterTool() + return CodeInterpreterToolParam(file_ids=file_ids) if file_ids else CodeInterpreterToolParam() @_register_tool("file_search") -def _file_search(spec: ToolSpec) -> FileSearchTool: +def _file_search(spec: ToolSpec) -> FileSearchToolParam: vector_store_ids = spec.options.get("vector_store_ids") if not vector_store_ids or not isinstance(vector_store_ids, list) or not vector_store_ids[0]: raise AgentInitializationException(f"Missing or malformed 'vector_store_ids' in: {spec}") - return FileSearchTool(vector_store_ids=vector_store_ids) + return FileSearchToolParam(vector_store_ids=vector_store_ids) @_register_tool("function") -def _function(spec: ToolSpec, kernel: "Kernel") -> ToolDefinition: +def _function(spec: ToolSpec, kernel: "Kernel") -> ToolResources: def parse_fqn(fqn: str) -> tuple[str, str]: parts = fqn.split(".") if len(parts) != 2: @@ -118,7 +124,7 @@ def parse_fqn(fqn: str) -> tuple[str, str]: raise AgentInitializationException(f"Multiple definitions found for `{spec.id}`. Please remove duplicates.") -def _build_tool(spec: ToolSpec, kernel: "Kernel") -> ToolDefinition: +def _build_tool(spec: ToolSpec, kernel: "Kernel") -> ToolResources: if not spec.type: raise AgentInitializationException("Tool spec must include a 'type' field.") @@ -131,17 +137,15 @@ def _build_tool(spec: ToolSpec, kernel: "Kernel") -> ToolDefinition: return builder(spec) if len(sig.parameters) == 1 else builder(spec, kernel) # type: ignore[call-arg] -def _build_tool_resources(tool_defs: list[ToolDefinition]) -> ToolResources | None: +def _build_tool_resources(tool_defs: list[ToolResources]) -> ToolResources | None: """Collects tool resources from known tool types with resource needs.""" resources: dict[str, Any] = {} for tool in tool_defs: - if isinstance(tool, CodeInterpreterTool): - resources["code_interpreter"] = tool.resources.code_interpreter - elif isinstance(tool, AzureAISearchTool): - resources["azure_ai_search"] = tool.resources.azure_ai_search - elif isinstance(tool, FileSearchTool): - resources["file_search"] = tool.resources.file_search + if isinstance(tool, CodeInterpreterToolParam): + resources["code_interpreter"] = tool.code_interpreter + elif isinstance(tool, FileSearchToolParam): + resources["file_search"] = tool.file_search return ToolResources(**resources) if resources else None @@ -242,7 +246,8 @@ async def get_messages(self, sort_order: Literal["asc", "desc"] | None = None) - @release_candidate -class OpenAIAssistantAgent(Agent): +@register_agent_type("openai_assistant") +class OpenAIAssistantAgent(DeclarativeSpecMixin, Agent): """OpenAI Assistant Agent class. Provides the ability to interact with OpenAI Assistants. @@ -396,10 +401,10 @@ async def _from_dict( data: dict, *, kernel: Kernel, - prompt_template_config: PromptTemplateConfig | None = None, + prompt_template_config: "PromptTemplateConfig | None" = None, **kwargs, ) -> _T: - """Create an Azure AI Agent from the provided dictionary. + """Create an Assistant Agent from the provided dictionary. Args: data: The dictionary containing the agent data. @@ -408,11 +413,11 @@ async def _from_dict( kwargs: Additional keyword arguments. Note: unsupported keys may raise validation errors. Returns: - AzureAIAgent: The Azure AI Agent instance. + AzureAIAgent: The OpenAI Assistant Agent instance. """ client: AsyncOpenAI = kwargs.pop("client", None) if client is None: - raise AgentInitializationException("Missing required 'client' in AzureAIAgent._from_dict()") + raise AgentInitializationException("Missing required 'client' in OpenAIAssistantAgent._from_dict()") spec = AgentSpec.model_validate(data) @@ -483,7 +488,7 @@ def resolve_placeholders( settings: "KernelBaseSettings | None" = None, extras: dict[str, Any] | None = None, ) -> str: - """Substitute ${AzureAI:Key} placeholders with fields from AzureAIAgentSettings and extras.""" + """Substitute ${OpenAI:Key} placeholders with fields from OpenAIAgentSettings and extras.""" import re pattern = re.compile(r"\$\{([^}]+)\}") @@ -491,34 +496,29 @@ def resolve_placeholders( # Build the mapping only if settings is provided and valid field_mapping: dict[str, Any] = {} - if settings is not None: - if not isinstance(settings, OpenAISettings | AzureAIAgentSettings): - raise AgentInitializationException(f"Expected AzureAIAgentSettings, got {type(settings).__name__}") - - field_mapping.update({ - "ChatModelId": getattr(settings, "model_deployment_name", None), - "ConnectionString": cls._get_setting(getattr(settings, "project_connection_string", None)), - "AgentId": cls._get_setting(getattr(settings, "agent_id", None)), - "Endpoint": cls._get_setting(getattr(settings, "endpoint", None)), - "SubscriptionId": cls._get_setting(getattr(settings, "subscription_id", None)), - "ResourceGroup": cls._get_setting(getattr(settings, "resource_group_name", None)), - "ProjectName": cls._get_setting(getattr(settings, "project_name", None)), - "BingConnectionId": cls._get_setting(getattr(settings, "bing_connection_id", None)), - "AzureAISearchConnectionId": cls._get_setting(getattr(settings, "azure_ai_search_connection_id", None)), - "AzureAISearchIndexName": cls._get_setting(getattr(settings, "azure_ai_search_index_name", None)), - }) + if settings is None: + settings = OpenAISettings() + + if not isinstance(settings, OpenAISettings): + raise AgentInitializationException(f"Expected OpenAISettings, got {type(settings).__name__}") + + field_mapping.update({ + "ChatModelId": getattr(settings, "chat_model_id", None), + "AgentId": getattr(settings, "agent_id", None), + "ApiKey": getattr(settings, "api_key", None), + }) if extras: field_mapping.update(extras) def replacer(match: re.Match[str]) -> str: """Replace the matched placeholder with the corresponding value from field_mapping.""" - full_key = match.group(1) # for example, AzureAI:AzureAISearchConnectionId + full_key = match.group(1) # for example, OpenAI:ApiKey section, _, key = full_key.partition(":") - if section != "AzureAI": + if section != "OpenAI": return match.group(0) - # Try short key first (AzureAISearchConnectionId), then full (AzureAI:AzureAISearchConnectionId) + # Try short key first (ApiKey), then full (OpenAI:ApiKey) return str(field_mapping.get(key) or field_mapping.get(full_key) or match.group(0)) result = pattern.sub(replacer, yaml_str) From 05546ec1b77c8a9957e365619324cf4926f60e9c Mon Sep 17 00:00:00 2001 From: Evan Mattson Date: Mon, 19 May 2025 10:37:49 +0900 Subject: [PATCH 04/18] Updates for declarative spec --- ..._assistant_declarative_code_interpreter.py | 141 ++++++++++++++++++ ...penai_assistant_declarative_file_search.py | 99 ++++++++++++ ..._declarative_function_calling_from_file.py | 85 +++++++++++ ...tant_declarative_with_existing_agent_id.py | 64 ++++++++ ..._assistant_declarative_code_interpreter.py | 141 ++++++++++++++++++ ...penai_assistant_declarative_file_search.py | 99 ++++++++++++ ..._declarative_function_calling_from_file.py | 85 +++++++++++ ...openai_assistant_declarative_templating.py | 79 ++++++++++ ...tant_declarative_with_existing_agent_id.py | 70 +++++++++ .../{spec.yaml => azure_ai_agent_spec.yaml} | 0 .../azure_assistant_spec.yaml | 16 ++ .../openai_assistant_spec.yaml | 15 ++ .../step6_assistant_openai_declarative.py | 12 +- ...tep7_assistant_azure_openai_declarative.py | 98 ++++++++++++ python/semantic_kernel/agents/agent.py | 52 +++++-- .../agents/open_ai/open_ai_assistant_agent.py | 44 ++++-- 16 files changed, 1068 insertions(+), 32 deletions(-) create mode 100644 python/samples/concepts/agents/openai_assistant/azure_openai_assistant_declarative_code_interpreter.py create mode 100644 python/samples/concepts/agents/openai_assistant/azure_openai_assistant_declarative_file_search.py create mode 100644 python/samples/concepts/agents/openai_assistant/azure_openai_assistant_declarative_function_calling_from_file.py create mode 100644 python/samples/concepts/agents/openai_assistant/azure_openai_assistant_declarative_with_existing_agent_id.py create mode 100644 python/samples/concepts/agents/openai_assistant/openai_assistant_declarative_code_interpreter.py create mode 100644 python/samples/concepts/agents/openai_assistant/openai_assistant_declarative_file_search.py create mode 100644 python/samples/concepts/agents/openai_assistant/openai_assistant_declarative_function_calling_from_file.py create mode 100644 python/samples/concepts/agents/openai_assistant/openai_assistant_declarative_templating.py create mode 100644 python/samples/concepts/agents/openai_assistant/openai_assistant_declarative_with_existing_agent_id.py rename python/samples/concepts/resources/declarative_spec/{spec.yaml => azure_ai_agent_spec.yaml} (100%) create mode 100644 python/samples/concepts/resources/declarative_spec/azure_assistant_spec.yaml create mode 100644 python/samples/concepts/resources/declarative_spec/openai_assistant_spec.yaml create mode 100644 python/samples/getting_started_with_agents/openai_assistant/step7_assistant_azure_openai_declarative.py diff --git a/python/samples/concepts/agents/openai_assistant/azure_openai_assistant_declarative_code_interpreter.py b/python/samples/concepts/agents/openai_assistant/azure_openai_assistant_declarative_code_interpreter.py new file mode 100644 index 000000000000..8206f5b006aa --- /dev/null +++ b/python/samples/concepts/agents/openai_assistant/azure_openai_assistant_declarative_code_interpreter.py @@ -0,0 +1,141 @@ +# Copyright (c) Microsoft. All rights reserved. + +import asyncio +import os + +from semantic_kernel.agents import AgentRegistry, AzureAssistantAgent + +""" +The following sample demonstrates how to create an Azure AI agent that answers +user questions using the code interpreter tool. + +The agent is then used to answer user questions that require code to be generated and +executed. The responses are handled in a streaming manner. +""" + +# Define the YAML string for the sample +spec = """ +type: openai_assistant +name: CodeInterpreterAgent +description: Agent with code interpreter tool. +instructions: > + Use the code interpreter tool to answer questions that require code to be generated + and executed. +model: + id: ${OpenAI:ChatModelId} + connection: + api_key: ${OpenAI:ApiKey} +tools: + - type: code_interpreter + options: + file_ids: + - ${OpenAI:FileId1} +""" + + +async def main(): + client, _ = AzureAssistantAgent.setup_resources() + + csv_file_path = os.path.join( + os.path.dirname(os.path.dirname(os.path.dirname(os.path.realpath(__file__)))), + "resources", + "agent_assistant_file_manipulation", + "sales.csv", + ) + + # Load the employees PDF file as a FileObject + with open(csv_file_path, "rb") as file: + file = await client.files.create(file=file, purpose="assistants") + + try: + # Create the AzureAI Agent from the YAML spec + # Note: the extras can be provided in the short-format (shown below) or + # in the long-format (as shown in the YAML spec, with the `AzureAI:` prefix). + # The short-format is used here for brevity + agent: AzureAssistantAgent = await AgentRegistry.create_from_yaml( + yaml_str=spec, + client=client, + extras={"OpenAI:FileId1": file.id}, + ) + + # Define the task for the agent + TASK = "Give me the code to calculate the total sales for all segments." + + print(f"# User: '{TASK}'") + + # Invoke the agent for the specified task + is_code = False + last_role = None + async for response in agent.invoke_stream( + messages=TASK, + ): + current_is_code = response.metadata.get("code", False) + + if current_is_code: + if not is_code: + print("\n\n```python") + is_code = True + print(response.content, end="", flush=True) + else: + if is_code: + print("\n```") + is_code = False + last_role = None + if hasattr(response, "role") and response.role is not None and last_role != response.role: + print(f"\n# {response.role}: ", end="", flush=True) + last_role = response.role + print(response.content, end="", flush=True) + if is_code: + print("```\n") + print() + finally: + # Cleanup: Delete the thread and agent + await client.beta.assistants.delete(agent.id) + await client.files.delete(file.id) + + """ + Sample output: + + # User: 'Give me the code to calculate the total sales for all segments.' + + # AuthorRole.ASSISTANT: Let me first examine the contents of the uploaded file to determine its structure. This + will allow me to create the appropriate code for calculating the total sales for all segments. Hang tight! + + ```python + import pandas as pd + + # Load the uploaded file to examine its contents + file_path = '/mnt/data/assistant-3nXizu2EX2EwXikUz71uNc' + data = pd.read_csv(file_path) + + # Display the first few rows and column names to understand the structure of the dataset + data.head(), data.columns + ``` + + # AuthorRole.ASSISTANT: The dataset contains several columns, including `Segment`, `Sales`, and others such as + `Country`, `Product`, and date-related information. To calculate the total sales for all segments, we will: + + 1. Group the data by the `Segment` column. + 2. Sum the `Sales` column for each segment. + 3. Calculate the grand total of all sales across all segments. + + Here is the code snippet for this task: + + ```python + # Group by 'Segment' and sum up 'Sales' + segment_sales = data.groupby('Segment')['Sales'].sum() + + # Calculate the total sales across all segments + total_sales = segment_sales.sum() + + print("Total Sales per Segment:") + print(segment_sales) + print(f"\nGrand Total Sales: {total_sales}") + ``` + + Would you like me to execute this directly for the uploaded data? + """ + + +if __name__ == "__main__": + asyncio.run(main()) diff --git a/python/samples/concepts/agents/openai_assistant/azure_openai_assistant_declarative_file_search.py b/python/samples/concepts/agents/openai_assistant/azure_openai_assistant_declarative_file_search.py new file mode 100644 index 000000000000..793034e921ab --- /dev/null +++ b/python/samples/concepts/agents/openai_assistant/azure_openai_assistant_declarative_file_search.py @@ -0,0 +1,99 @@ +# Copyright (c) Microsoft. All rights reserved. + +import asyncio +import os + +from semantic_kernel.agents import AzureAssistantAgent +from semantic_kernel.agents.agent import AgentRegistry + +""" +The following sample demonstrates how to create an Azure AI agent that answers +user questions using the file search tool. + +The agent is used to answer user questions that require file search to help ground +answers from the model. +""" + +# Define the YAML string for the sample +spec = """ +type: openai_assistant +name: FileSearchAgent +description: Agent with code interpreter tool. +instructions: > + Use the code interpreter tool to answer questions that require code to be generated + and executed. +model: + id: ${OpenAI:ChatModelId} + connection: + api_key: ${OpenAI:ApiKey} +tools: + - type: file_search + options: + vector_store_ids: + - ${OpenAI:VectorStoreId} +""" + + +async def main(): + # Setup the OpenAI Assistant client + client, _ = AzureAssistantAgent.setup_resources() + + # Read and upload the file to the OpenAI AI service + pdf_file_path = os.path.join( + os.path.dirname(os.path.dirname(os.path.dirname(os.path.realpath(__file__)))), + "resources", + "file_search", + "employees.pdf", + ) + # Upload the pdf file to the assistant service + with open(pdf_file_path, "rb") as file: + file = await client.files.create(file=file, purpose="assistants") + + vector_store = await client.vector_stores.create( + name="assistant_file_search", + file_ids=[file.id], + ) + + try: + # Create the AzureAI Agent from the YAML spec + # Note: the extras can be provided in the short-format (shown below) or + # in the long-format (as shown in the YAML spec, with the `AzureAI:` prefix). + # The short-format is used here for brevity + agent: AzureAssistantAgent = await AgentRegistry.create_from_yaml( + yaml_str=spec, + client=client, + extras={"OpenAI:VectorStoreId": vector_store.id}, + ) + + # Define the task for the agent + TASK = "Who can help me if I have a sales question?" + + print(f"# User: '{TASK}'") + + # Invoke the agent for the specified task + async for response in agent.invoke( + messages=TASK, + ): + print(f"# {response.name}: {response}") + finally: + # Cleanup: Delete the agent, vector store, and file + await client.beta.assistants.delete(agent.id) + await client.vector_stores.delete(vector_store.id) + await client.files.delete(file.id) + + """ + Sample output: + + # User: 'Who can help me if I have a sales question?' + # FileSearchAgent: If you have a sales question, you may contact the following individuals: + + 1. **Hicran Bea** - Sales Manager + 2. **Mariam Jaslyn** - Sales Representative + 3. **Angelino Embla** - Sales Representative + + This information comes from the employee records【4:0†source】. + """ + + +if __name__ == "__main__": + asyncio.run(main()) diff --git a/python/samples/concepts/agents/openai_assistant/azure_openai_assistant_declarative_function_calling_from_file.py b/python/samples/concepts/agents/openai_assistant/azure_openai_assistant_declarative_function_calling_from_file.py new file mode 100644 index 000000000000..cfe09a28339b --- /dev/null +++ b/python/samples/concepts/agents/openai_assistant/azure_openai_assistant_declarative_function_calling_from_file.py @@ -0,0 +1,85 @@ +# Copyright (c) Microsoft. All rights reserved. + +import asyncio +import os +from typing import Annotated + +from semantic_kernel.agents import AgentRegistry, AzureAssistantAgent +from semantic_kernel.functions.kernel_function_decorator import kernel_function + +""" +The following sample demonstrates how to create an Azure AI agent that answers +user questions. The sample shows how to load a declarative spec from a file. +The plugins/functions must already exist in the kernel. +They are not created declaratively via the spec. +""" + + +class MenuPlugin: + """A sample Menu Plugin used for the concept sample.""" + + @kernel_function(description="Provides a list of specials from the menu.") + def get_specials(self) -> Annotated[str, "Returns the specials from the menu."]: + return """ + Special Soup: Clam Chowder + Special Salad: Cobb Salad + Special Drink: Chai Tea + """ + + @kernel_function(description="Provides the price of the requested menu item.") + def get_item_price( + self, menu_item: Annotated[str, "The name of the menu item."] + ) -> Annotated[str, "Returns the price of the menu item."]: + return "$9.99" + + +async def main(): + try: + client, _ = AzureAssistantAgent.setup_resources() + + # Define the YAML file path for the sample + file_path = os.path.join( + os.path.dirname(os.path.dirname(os.path.dirname(os.path.realpath(__file__)))), + "resources", + "declarative_spec", + "azure_assistant_spec.yaml", + ) + + # Create the AzureAI Agent from the YAML spec + agent: AzureAssistantAgent = await AgentRegistry.create_from_file( + file_path, + plugins=[MenuPlugin()], + client=client, + ) + + # Create the agent + user_inputs = [ + "Hello", + "What is the special soup?", + "How much does that cost?", + "Thank you", + ] + + # Create a thread for the agent + # If no thread is provided, a new thread will be + # created and returned with the initial response + thread = None + + for user_input in user_inputs: + print(f"# User: '{user_input}'") + # Invoke the agent for the specified task + async for response in agent.invoke( + messages=user_input, + thread=thread, + ): + print(f"# {response.name}: {response}") + # Store the thread for the next iteration + thread = response.thread + finally: + # Cleanup: Delete the thread and agent + await client.beta.assistants.delete(agent.id) if agent else None + await thread.delete() if thread else None + + +if __name__ == "__main__": + asyncio.run(main()) diff --git a/python/samples/concepts/agents/openai_assistant/azure_openai_assistant_declarative_with_existing_agent_id.py b/python/samples/concepts/agents/openai_assistant/azure_openai_assistant_declarative_with_existing_agent_id.py new file mode 100644 index 000000000000..2fa849a78178 --- /dev/null +++ b/python/samples/concepts/agents/openai_assistant/azure_openai_assistant_declarative_with_existing_agent_id.py @@ -0,0 +1,64 @@ +# Copyright (c) Microsoft. All rights reserved. + +import asyncio + +from semantic_kernel.agents import AgentRegistry, AzureAssistantAgent + +""" +The following sample demonstrates how to create an Azure AI agent based +on an existing agent ID. +""" + +# Define the YAML string for the sample +spec = """ +id: ${AzureAI:AgentId} +type: foundry_agent +instructions: You are helpful agent who always responds in French. +""" + + +async def main(): + try: + client, _ = AzureAssistantAgent.setup_resources() + # Create the AzureAI Agent from the YAML spec + # Note: the extras can be provided in the short-format (shown below) or + # in the long-format (as shown in the YAML spec, with the `AzureAI:` prefix). + # The short-format is used here for brevity + agent: AzureAssistantAgent = await AgentRegistry.create_from_yaml( + yaml_str=spec, + client=client, + extras={"AgentId": ""}, # Specify the existing agent ID + ) + + # Define the task for the agent + TASK = "Why is the sky blue?" + + print(f"# User: '{TASK}'") + + # Invoke the agent for the specified task + async for response in agent.invoke( + messages=TASK, + ): + print(f"# {response.name}: {response}") + finally: + # Cleanup: Delete the thread and agent + await client.beta.assistants.delete(agent.id) + + """ + Sample output: + + # User: 'Why is the sky blue?' + # WeatherAgent: Le ciel est bleu à cause d'un phénomène appelé **diffusion de Rayleigh**. La lumière du + Soleil est composée de toutes les couleurs du spectre visible, mais lorsqu'elle traverse l'atmosphère + terrestre, elle entre en contact avec les molécules d'air et les particules présentes. + + Les couleurs à courtes longueurs d'onde, comme le bleu et le violet, sont diffusées dans toutes les directions + beaucoup plus efficacement que les couleurs à longues longueurs d'onde, comme le rouge et l'orange. Bien que le + violet ait une longueur d'onde encore plus courte que le bleu, nos yeux sont moins sensibles à cette couleur, + et une partie du violet est également absorbée par la haute atmosphère. Ainsi, le bleu domine, donnant au ciel + sa couleur caractéristique. + """ + + +if __name__ == "__main__": + asyncio.run(main()) diff --git a/python/samples/concepts/agents/openai_assistant/openai_assistant_declarative_code_interpreter.py b/python/samples/concepts/agents/openai_assistant/openai_assistant_declarative_code_interpreter.py new file mode 100644 index 000000000000..82b505f48c7a --- /dev/null +++ b/python/samples/concepts/agents/openai_assistant/openai_assistant_declarative_code_interpreter.py @@ -0,0 +1,141 @@ +# Copyright (c) Microsoft. All rights reserved. + +import asyncio +import os + +from semantic_kernel.agents import AgentRegistry, OpenAIAssistantAgent + +""" +The following sample demonstrates how to create an Azure AI agent that answers +user questions using the code interpreter tool. + +The agent is then used to answer user questions that require code to be generated and +executed. The responses are handled in a streaming manner. +""" + +# Define the YAML string for the sample +spec = """ +type: openai_assistant +name: CodeInterpreterAgent +description: Agent with code interpreter tool. +instructions: > + Use the code interpreter tool to answer questions that require code to be generated + and executed. +model: + id: ${OpenAI:ChatModelId} + connection: + api_key: ${OpenAI:ApiKey} +tools: + - type: code_interpreter + options: + file_ids: + - ${OpenAI:FileId1} +""" + + +async def main(): + client, _ = OpenAIAssistantAgent.setup_resources() + + csv_file_path = os.path.join( + os.path.dirname(os.path.dirname(os.path.dirname(os.path.realpath(__file__)))), + "resources", + "agent_assistant_file_manipulation", + "sales.csv", + ) + + # Load the employees PDF file as a FileObject + with open(csv_file_path, "rb") as file: + file = await client.files.create(file=file, purpose="assistants") + + try: + # Create the AzureAI Agent from the YAML spec + # Note: the extras can be provided in the short-format (shown below) or + # in the long-format (as shown in the YAML spec, with the `AzureAI:` prefix). + # The short-format is used here for brevity + agent: OpenAIAssistantAgent = await AgentRegistry.create_from_yaml( + yaml_str=spec, + client=client, + extras={"OpenAI:FileId1": file.id}, + ) + + # Define the task for the agent + TASK = "Give me the code to calculate the total sales for all segments." + + print(f"# User: '{TASK}'") + + # Invoke the agent for the specified task + is_code = False + last_role = None + async for response in agent.invoke_stream( + messages=TASK, + ): + current_is_code = response.metadata.get("code", False) + + if current_is_code: + if not is_code: + print("\n\n```python") + is_code = True + print(response.content, end="", flush=True) + else: + if is_code: + print("\n```") + is_code = False + last_role = None + if hasattr(response, "role") and response.role is not None and last_role != response.role: + print(f"\n# {response.role}: ", end="", flush=True) + last_role = response.role + print(response.content, end="", flush=True) + if is_code: + print("```\n") + print() + finally: + # Cleanup: Delete the thread and agent + await client.beta.assistants.delete(agent.id) + await client.files.delete(file.id) + + """ + Sample output: + + # User: 'Give me the code to calculate the total sales for all segments.' + + # AuthorRole.ASSISTANT: Let me first examine the contents of the uploaded file to determine its structure. This + will allow me to create the appropriate code for calculating the total sales for all segments. Hang tight! + + ```python + import pandas as pd + + # Load the uploaded file to examine its contents + file_path = '/mnt/data/assistant-3nXizu2EX2EwXikUz71uNc' + data = pd.read_csv(file_path) + + # Display the first few rows and column names to understand the structure of the dataset + data.head(), data.columns + ``` + + # AuthorRole.ASSISTANT: The dataset contains several columns, including `Segment`, `Sales`, and others such as + `Country`, `Product`, and date-related information. To calculate the total sales for all segments, we will: + + 1. Group the data by the `Segment` column. + 2. Sum the `Sales` column for each segment. + 3. Calculate the grand total of all sales across all segments. + + Here is the code snippet for this task: + + ```python + # Group by 'Segment' and sum up 'Sales' + segment_sales = data.groupby('Segment')['Sales'].sum() + + # Calculate the total sales across all segments + total_sales = segment_sales.sum() + + print("Total Sales per Segment:") + print(segment_sales) + print(f"\nGrand Total Sales: {total_sales}") + ``` + + Would you like me to execute this directly for the uploaded data? + """ + + +if __name__ == "__main__": + asyncio.run(main()) diff --git a/python/samples/concepts/agents/openai_assistant/openai_assistant_declarative_file_search.py b/python/samples/concepts/agents/openai_assistant/openai_assistant_declarative_file_search.py new file mode 100644 index 000000000000..32f66b3299a6 --- /dev/null +++ b/python/samples/concepts/agents/openai_assistant/openai_assistant_declarative_file_search.py @@ -0,0 +1,99 @@ +# Copyright (c) Microsoft. All rights reserved. + +import asyncio +import os + +from semantic_kernel.agents import OpenAIAssistantAgent +from semantic_kernel.agents.agent import AgentRegistry + +""" +The following sample demonstrates how to create an Azure AI agent that answers +user questions using the file search tool. + +The agent is used to answer user questions that require file search to help ground +answers from the model. +""" + +# Define the YAML string for the sample +spec = """ +type: openai_assistant +name: FileSearchAgent +description: Agent with code interpreter tool. +instructions: > + Use the code interpreter tool to answer questions that require code to be generated + and executed. +model: + id: ${OpenAI:ChatModelId} + connection: + api_key: ${OpenAI:ApiKey} +tools: + - type: file_search + options: + vector_store_ids: + - ${OpenAI:VectorStoreId} +""" + + +async def main(): + # Setup the OpenAI Assistant client + client, _ = OpenAIAssistantAgent.setup_resources() + + # Read and upload the file to the OpenAI AI service + pdf_file_path = os.path.join( + os.path.dirname(os.path.dirname(os.path.dirname(os.path.realpath(__file__)))), + "resources", + "file_search", + "employees.pdf", + ) + # Upload the pdf file to the assistant service + with open(pdf_file_path, "rb") as file: + file = await client.files.create(file=file, purpose="assistants") + + vector_store = await client.vector_stores.create( + name="assistant_file_search", + file_ids=[file.id], + ) + + try: + # Create the AzureAI Agent from the YAML spec + # Note: the extras can be provided in the short-format (shown below) or + # in the long-format (as shown in the YAML spec, with the `AzureAI:` prefix). + # The short-format is used here for brevity + agent: OpenAIAssistantAgent = await AgentRegistry.create_from_yaml( + yaml_str=spec, + client=client, + extras={"OpenAI:VectorStoreId": vector_store.id}, + ) + + # Define the task for the agent + TASK = "Who can help me if I have a sales question?" + + print(f"# User: '{TASK}'") + + # Invoke the agent for the specified task + async for response in agent.invoke( + messages=TASK, + ): + print(f"# {response.name}: {response}") + finally: + # Cleanup: Delete the agent, vector store, and file + await client.beta.assistants.delete(agent.id) + await client.vector_stores.delete(vector_store.id) + await client.files.delete(file.id) + + """ + Sample output: + + # User: 'Who can help me if I have a sales question?' + # FileSearchAgent: If you have a sales question, you may contact the following individuals: + + 1. **Hicran Bea** - Sales Manager + 2. **Mariam Jaslyn** - Sales Representative + 3. **Angelino Embla** - Sales Representative + + This information comes from the employee records【4:0†source】. + """ + + +if __name__ == "__main__": + asyncio.run(main()) diff --git a/python/samples/concepts/agents/openai_assistant/openai_assistant_declarative_function_calling_from_file.py b/python/samples/concepts/agents/openai_assistant/openai_assistant_declarative_function_calling_from_file.py new file mode 100644 index 000000000000..1fe6b4d10185 --- /dev/null +++ b/python/samples/concepts/agents/openai_assistant/openai_assistant_declarative_function_calling_from_file.py @@ -0,0 +1,85 @@ +# Copyright (c) Microsoft. All rights reserved. + +import asyncio +import os +from typing import Annotated + +from semantic_kernel.agents import AgentRegistry, OpenAIAssistantAgent +from semantic_kernel.functions.kernel_function_decorator import kernel_function + +""" +The following sample demonstrates how to create an Azure AI agent that answers +user questions. The sample shows how to load a declarative spec from a file. +The plugins/functions must already exist in the kernel. +They are not created declaratively via the spec. +""" + + +class MenuPlugin: + """A sample Menu Plugin used for the concept sample.""" + + @kernel_function(description="Provides a list of specials from the menu.") + def get_specials(self) -> Annotated[str, "Returns the specials from the menu."]: + return """ + Special Soup: Clam Chowder + Special Salad: Cobb Salad + Special Drink: Chai Tea + """ + + @kernel_function(description="Provides the price of the requested menu item.") + def get_item_price( + self, menu_item: Annotated[str, "The name of the menu item."] + ) -> Annotated[str, "Returns the price of the menu item."]: + return "$9.99" + + +async def main(): + try: + client, _ = OpenAIAssistantAgent.setup_resources() + + # Define the YAML file path for the sample + file_path = os.path.join( + os.path.dirname(os.path.dirname(os.path.dirname(os.path.realpath(__file__)))), + "resources", + "declarative_spec", + "openai_assistant_spec.yaml", + ) + + # Create the AzureAI Agent from the YAML spec + agent: OpenAIAssistantAgent = await AgentRegistry.create_from_file( + file_path, + plugins=[MenuPlugin()], + client=client, + ) + + # Create the agent + user_inputs = [ + "Hello", + "What is the special soup?", + "How much does that cost?", + "Thank you", + ] + + # Create a thread for the agent + # If no thread is provided, a new thread will be + # created and returned with the initial response + thread = None + + for user_input in user_inputs: + print(f"# User: '{user_input}'") + # Invoke the agent for the specified task + async for response in agent.invoke( + messages=user_input, + thread=thread, + ): + print(f"# {response.name}: {response}") + # Store the thread for the next iteration + thread = response.thread + finally: + # Cleanup: Delete the thread and agent + await client.beta.assistants.delete(agent.id) if agent else None + await thread.delete() if thread else None + + +if __name__ == "__main__": + asyncio.run(main()) diff --git a/python/samples/concepts/agents/openai_assistant/openai_assistant_declarative_templating.py b/python/samples/concepts/agents/openai_assistant/openai_assistant_declarative_templating.py new file mode 100644 index 000000000000..1973f735bfd0 --- /dev/null +++ b/python/samples/concepts/agents/openai_assistant/openai_assistant_declarative_templating.py @@ -0,0 +1,79 @@ +# Copyright (c) Microsoft. All rights reserved. + +import asyncio + +from semantic_kernel.agents import OpenAIAssistantAgent +from semantic_kernel.agents.agent import AgentRegistry + +""" +The following sample demonstrates how to create an Azure AI agent that answers +user questions using the file search tool. + +The agent is used to answer user questions that require file search to help ground +answers from the model. +""" + +# Define the YAML string for the sample +spec = """ +type: openai_assistant +name: StoryAgent +description: An agent that generates a story about a topic. +instructions: Tell a story about {{$topic}} that is {{$length}} sentences long. +model: + id: ${OpenAI:ChatModelId} +inputs: + topic: + description: The topic of the story. + required: true + default: Cats + length: + description: The number of sentences in the story. + required: true + default: 2 +outputs: + output1: + description: The generated story. +template: + format: semantic-kernel +""" + + +async def main(): + # Setup the OpenAI Assistant client + client, _ = OpenAIAssistantAgent.setup_resources() + + try: + # Create the AzureAI Agent from the YAML spec + # Note: the extras can be provided in the short-format (shown below) or + # in the long-format (as shown in the YAML spec, with the `AzureAI:` prefix). + # The short-format is used here for brevity + agent: OpenAIAssistantAgent = await AgentRegistry.create_from_yaml( + yaml_str=spec, + client=client, + ) + + # Invoke the agent for the specified task + async for response in agent.invoke( + messages=None, + ): + print(f"# {response.name}: {response}") + finally: + # Cleanup: Delete the agent, vector store, and file + await client.beta.assistants.delete(agent.id) + + """ + Sample output: + + # User: 'Who can help me if I have a sales question?' + # FileSearchAgent: If you have a sales question, you may contact the following individuals: + + 1. **Hicran Bea** - Sales Manager + 2. **Mariam Jaslyn** - Sales Representative + 3. **Angelino Embla** - Sales Representative + + This information comes from the employee records【4:0†source】. + """ + + +if __name__ == "__main__": + asyncio.run(main()) diff --git a/python/samples/concepts/agents/openai_assistant/openai_assistant_declarative_with_existing_agent_id.py b/python/samples/concepts/agents/openai_assistant/openai_assistant_declarative_with_existing_agent_id.py new file mode 100644 index 000000000000..1167e5f2ab16 --- /dev/null +++ b/python/samples/concepts/agents/openai_assistant/openai_assistant_declarative_with_existing_agent_id.py @@ -0,0 +1,70 @@ +# Copyright (c) Microsoft. All rights reserved. + +import asyncio + +from azure.identity.aio import DefaultAzureCredential + +from semantic_kernel.agents import AzureAIAgent +from semantic_kernel.agents.agent import AgentRegistry + +""" +The following sample demonstrates how to create an Azure AI agent based +on an existing agent ID. +""" + +# Define the YAML string for the sample +spec = """ +id: ${AzureAI:AgentId} +type: foundry_agent +instructions: You are helpful agent who always responds in French. +""" + + +async def main(): + async with ( + DefaultAzureCredential() as creds, + AzureAIAgent.create_client(credential=creds) as client, + ): + try: + # Create the AzureAI Agent from the YAML spec + # Note: the extras can be provided in the short-format (shown below) or + # in the long-format (as shown in the YAML spec, with the `AzureAI:` prefix). + # The short-format is used here for brevity + agent: AzureAIAgent = await AgentRegistry.create_from_yaml( + yaml_str=spec, + client=client, + extras={"AgentId": ""}, # Specify the existing agent ID + ) + + # Define the task for the agent + TASK = "Why is the sky blue?" + + print(f"# User: '{TASK}'") + + # Invoke the agent for the specified task + async for response in agent.invoke( + messages=TASK, + ): + print(f"# {response.name}: {response}") + finally: + # Cleanup: Delete the thread and agent + await client.agents.delete_agent(agent.id) + + """ + Sample output: + + # User: 'Why is the sky blue?' + # WeatherAgent: Le ciel est bleu à cause d'un phénomène appelé **diffusion de Rayleigh**. La lumière du + Soleil est composée de toutes les couleurs du spectre visible, mais lorsqu'elle traverse l'atmosphère + terrestre, elle entre en contact avec les molécules d'air et les particules présentes. + + Les couleurs à courtes longueurs d'onde, comme le bleu et le violet, sont diffusées dans toutes les directions + beaucoup plus efficacement que les couleurs à longues longueurs d'onde, comme le rouge et l'orange. Bien que le + violet ait une longueur d'onde encore plus courte que le bleu, nos yeux sont moins sensibles à cette couleur, + et une partie du violet est également absorbée par la haute atmosphère. Ainsi, le bleu domine, donnant au ciel + sa couleur caractéristique. + """ + + +if __name__ == "__main__": + asyncio.run(main()) diff --git a/python/samples/concepts/resources/declarative_spec/spec.yaml b/python/samples/concepts/resources/declarative_spec/azure_ai_agent_spec.yaml similarity index 100% rename from python/samples/concepts/resources/declarative_spec/spec.yaml rename to python/samples/concepts/resources/declarative_spec/azure_ai_agent_spec.yaml diff --git a/python/samples/concepts/resources/declarative_spec/azure_assistant_spec.yaml b/python/samples/concepts/resources/declarative_spec/azure_assistant_spec.yaml new file mode 100644 index 000000000000..19bbfe9bc006 --- /dev/null +++ b/python/samples/concepts/resources/declarative_spec/azure_assistant_spec.yaml @@ -0,0 +1,16 @@ +type: azure_openai_assistant +name: FunctionCallingAgent +description: This agent uses the provided functions to answer questions about the menu. +instructions: Use the provided functions to answer questions about the menu. +model: + id: ${AzureOpenAI:ChatModelId} + connection: + connection: + endpoint: ${AzureOpenAI:Endpoint} + options: + temperature: 0.4 +tools: + - id: MenuPlugin.get_specials + type: function + - id: MenuPlugin.get_item_price + type: function \ No newline at end of file diff --git a/python/samples/concepts/resources/declarative_spec/openai_assistant_spec.yaml b/python/samples/concepts/resources/declarative_spec/openai_assistant_spec.yaml new file mode 100644 index 000000000000..0746fa2201fc --- /dev/null +++ b/python/samples/concepts/resources/declarative_spec/openai_assistant_spec.yaml @@ -0,0 +1,15 @@ +type: openai_assistant +name: FunctionCallingAgent +description: This agent uses the provided functions to answer questions about the menu. +instructions: Use the provided functions to answer questions about the menu. +model: + id: ${OpenAI:ChatModelId} + connection: + api_key: ${OpenAI:ApiKey} + options: + temperature: 0.4 +tools: + - id: MenuPlugin.get_specials + type: function + - id: MenuPlugin.get_item_price + type: function \ No newline at end of file diff --git a/python/samples/getting_started_with_agents/openai_assistant/step6_assistant_openai_declarative.py b/python/samples/getting_started_with_agents/openai_assistant/step6_assistant_openai_declarative.py index 4cfe63c5f18b..12d378072515 100644 --- a/python/samples/getting_started_with_agents/openai_assistant/step6_assistant_openai_declarative.py +++ b/python/samples/getting_started_with_agents/openai_assistant/step6_assistant_openai_declarative.py @@ -6,15 +6,9 @@ from semantic_kernel.functions import kernel_function """ -The following sample demonstrates how to create an OpenAI assistant using either -Azure OpenAI or OpenAI. The sample shows how to have the assistant answrer -questions about the world. - -The interaction with the agent is via the `get_response` method, which sends a -user input to the agent and receives a response from the agent. The conversation -history is maintained by the agent service, i.e. the responses are automatically -associated with the thread. Therefore, client code does not need to maintain the -conversation history. +The following sample demonstrates how to create an OpenAI Assistant agent that answers +questions about a sample menu using a Semantic Kernel Plugin. The agent is created +using a yaml declarative spec. """ # Simulate a conversation with the agent diff --git a/python/samples/getting_started_with_agents/openai_assistant/step7_assistant_azure_openai_declarative.py b/python/samples/getting_started_with_agents/openai_assistant/step7_assistant_azure_openai_declarative.py new file mode 100644 index 000000000000..221fe1250630 --- /dev/null +++ b/python/samples/getting_started_with_agents/openai_assistant/step7_assistant_azure_openai_declarative.py @@ -0,0 +1,98 @@ +# Copyright (c) Microsoft. All rights reserved. +import asyncio +from typing import Annotated + +from semantic_kernel.agents import AgentRegistry, AzureAssistantAgent +from semantic_kernel.functions import kernel_function + +""" +The following sample demonstrates how to create an Azure OpenAI Assistant agent that +answers questions about a sample menu using a Semantic Kernel Plugin. The agent is created +using a yaml declarative spec. +""" + +# Simulate a conversation with the agent +USER_INPUTS = [ + "Hello", + "What is the special soup?", + "How much does that cost?", + "Thank you", +] + +# Define the YAML string for the sample +SPEC = """ +type: azure_openai_assistant +name: Host +instructions: Respond politely to the user's questions. +model: + id: ${AzureOpenAI:ChatModelId} +tools: + - id: MenuPlugin.get_specials + type: function + - id: MenuPlugin.get_item_price + type: function +""" + + +# Define a sample plugin for the sample +class MenuPlugin: + """A sample Menu Plugin used for the concept sample.""" + + @kernel_function(description="Provides a list of specials from the menu.") + def get_specials(self) -> Annotated[str, "Returns the specials from the menu."]: + return """ + Special Soup: Clam Chowder + Special Salad: Cobb Salad + Special Drink: Chai Tea + """ + + @kernel_function(description="Provides the price of the requested menu item.") + def get_item_price( + self, menu_item: Annotated[str, "The name of the menu item."] + ) -> Annotated[str, "Returns the price of the menu item."]: + return "$9.99" + + +async def main(): + # 1. Create the client using Azure OpenAI resources and configuration + client, _ = AzureAssistantAgent.setup_resources() + + # 2. Create the assistant on the Azure OpenAI service + agent: AzureAssistantAgent = await AgentRegistry.create_from_yaml( + SPEC, + plugins=[MenuPlugin()], + client=client, + ) + + # 3. Create a thread for the agent + # If no thread is provided, a new thread will be + # created and returned with the initial response + thread = None + + try: + for user_input in USER_INPUTS: + print(f"# User: {user_input}") + # 4. Invoke the agent for the specified thread for response + async for response in agent.invoke( + messages=user_input, + thread=thread, + ): + print(f"# {response.name}: {response}") + thread = response.thread + finally: + # 5. Clean up the resources + await thread.delete() if thread else None + await agent.client.beta.assistants.delete(assistant_id=agent.id) + + """ + Sample Output: + + # User: Hello + # Agent: Hello! How can I assist you today? + # User: What is the special soup? + # ... + """ + + +if __name__ == "__main__": + asyncio.run(main()) diff --git a/python/semantic_kernel/agents/agent.py b/python/semantic_kernel/agents/agent.py index 7fe83abbcccc..98dd894c54fa 100644 --- a/python/semantic_kernel/agents/agent.py +++ b/python/semantic_kernel/agents/agent.py @@ -19,7 +19,6 @@ from semantic_kernel.exceptions.agent_exceptions import AgentExecutionException, AgentInitializationException from semantic_kernel.functions import kernel_function from semantic_kernel.functions.kernel_arguments import KernelArguments -from semantic_kernel.functions.kernel_function import TEMPLATE_FORMAT_MAP from semantic_kernel.functions.kernel_plugin import KernelPlugin from semantic_kernel.kernel import Kernel from semantic_kernel.kernel_pydantic import KernelBaseModel @@ -44,6 +43,21 @@ # region Declarative Spec Definitions +class InputSpec(KernelBaseModel): + """Class representing an input specification.""" + + description: str | None = None + required: bool = False + default: Any = None + + +class OutputSpec(KernelBaseModel): + """Class representing an output specification.""" + + description: str | None = None + type: str | None = None + + class ModelConnection(KernelBaseModel): """Class representing a model connection.""" @@ -83,6 +97,8 @@ class AgentSpec(KernelBaseModel): tools: list[ToolSpec] = Field(default_factory=list) template: dict[str, Any] | None = None extras: dict[str, Any] = Field(default_factory=dict) + inputs: dict[str, InputSpec] = Field(default_factory=dict) + outputs: dict[str, OutputSpec] = Field(default_factory=dict) # endregion @@ -897,12 +913,11 @@ async def from_dict( **kwargs, ) -> _D: """Default implementation: call the protected _from_dict.""" - # Compose `data` and extracted common fields for the subclass extracted, kernel = cls._normalize_spec_fields(data, kernel=kernel, plugins=plugins, **kwargs) return await cls._from_dict( {**data, **extracted}, kernel=kernel, - prompt_template_config=prompt_template_config, + prompt_template_config=extracted.get("prompt_template"), settings=settings, **kwargs, ) @@ -961,11 +976,27 @@ def _normalize_spec_fields( if "tools" in data: cls._validate_tools(data["tools"], kernel) + model_options = data.get("model", {}).get("options", {}) if data.get("model") else {} + + inputs = data.get("inputs", {}) + input_defaults = { + k: v.get("default") + for k, v in (inputs.items() if isinstance(inputs, dict) else []) + if v.get("default") is not None + } + + # Step 1: Start with model options + arguments = KernelArguments(**model_options) + # Step 2: Update with input defaults (only if not already provided by model options) + for k, v in input_defaults.items(): + if k not in arguments: + arguments[k] = v + fields = { "name": data.get("name"), "description": data.get("description"), "instructions": data.get("instructions"), - "arguments": KernelArguments(**(data.get("model", {}).get("options", {}))) if data.get("model") else None, + "arguments": arguments, } # Handle prompt_template if available @@ -973,12 +1004,13 @@ def _normalize_spec_fields( template_data = data.get("prompt_template") or data.get("template") if isinstance(template_data, dict): prompt_template_config = PromptTemplateConfig(**template_data) - fields["prompt_template"] = TEMPLATE_FORMAT_MAP[prompt_template_config.template_format]( - prompt_template_config=prompt_template_config - ) - # Overwrite instructions from prompt template if explicitly provided - if prompt_template_config.template is not None: - fields["instructions"] = prompt_template_config.template + # If 'instructions' is set in YAML, override the template field in config + instructions = data.get("instructions") + if instructions is not None: + prompt_template_config.template = instructions + fields["prompt_template"] = prompt_template_config + # Always set fields["instructions"] to the template being used + fields["instructions"] = prompt_template_config.template return fields, kernel diff --git a/python/semantic_kernel/agents/open_ai/open_ai_assistant_agent.py b/python/semantic_kernel/agents/open_ai/open_ai_assistant_agent.py index 8cd35dbe4d8a..6447a0cf64f1 100644 --- a/python/semantic_kernel/agents/open_ai/open_ai_assistant_agent.py +++ b/python/semantic_kernel/agents/open_ai/open_ai_assistant_agent.py @@ -19,7 +19,7 @@ from openai.types.beta.assistant_tool_param import AssistantToolParam from openai.types.beta.code_interpreter_tool_param import CodeInterpreterToolParam from openai.types.beta.file_search_tool_param import FileSearchToolParam -from pydantic import BaseModel, Field, ValidationError +from pydantic import BaseModel, Field, SecretStr, ValidationError from semantic_kernel.agents import Agent from semantic_kernel.agents.agent import ( @@ -72,6 +72,7 @@ from typing_extensions import override # pragma: no cover _T = TypeVar("_T", bound="OpenAIAssistantAgent") +ToolParam = dict[str, Any] logger: logging.Logger = logging.getLogger(__name__) @@ -81,7 +82,7 @@ def _register_tool(tool_type: str): - def decorator(fn: Callable[[ToolSpec, Kernel | None], ToolResources]): + def decorator(fn: Callable[[ToolSpec, Kernel | None], tuple[list[ToolParam], ToolResources]]): _TOOL_BUILDERS[tool_type.lower()] = fn return fn @@ -89,17 +90,17 @@ def decorator(fn: Callable[[ToolSpec, Kernel | None], ToolResources]): @_register_tool("code_interpreter") -def _code_interpreter(spec: ToolSpec) -> CodeInterpreterToolParam: +def _code_interpreter(spec: ToolSpec, kernel: Kernel | None = None) -> tuple[list[ToolParam], ToolResources]: file_ids = spec.options.get("file_ids") - return CodeInterpreterToolParam(file_ids=file_ids) if file_ids else CodeInterpreterToolParam() + return OpenAIAssistantAgent.configure_code_interpreter_tool(file_ids=file_ids) @_register_tool("file_search") -def _file_search(spec: ToolSpec) -> FileSearchToolParam: +def _file_search(spec: ToolSpec, kernel: Kernel | None = None) -> tuple[list[ToolParam], ToolResources]: vector_store_ids = spec.options.get("vector_store_ids") if not vector_store_ids or not isinstance(vector_store_ids, list) or not vector_store_ids[0]: raise AgentInitializationException(f"Missing or malformed 'vector_store_ids' in: {spec}") - return FileSearchToolParam(vector_store_ids=vector_store_ids) + return OpenAIAssistantAgent.configure_file_search_tool(vector_store_ids=vector_store_ids) @_register_tool("function") @@ -424,6 +425,10 @@ async def _from_dict( if "settings" in kwargs: kwargs.pop("settings") + args = data.pop("arguments", None) + if args: + arguments = KernelArguments(**args) + if spec.id: existing_definition = await client.beta.assistants.retrieve(spec.id) @@ -447,6 +452,7 @@ async def _from_dict( client=client, kernel=kernel, prompt_template_config=prompt_template_config, + arguments=arguments, **kwargs, ) @@ -455,8 +461,12 @@ async def _from_dict( # Build tool definitions & resources tool_objs = [_build_tool(t, kernel) for t in spec.tools if t.type != "function"] - tool_defs = [d for tool in tool_objs for d in (tool.definitions if hasattr(tool, "definitions") else [tool])] - tool_resources = _build_tool_resources(tool_objs) + all_tools: list[ToolParam] = [] + all_resources: ToolResources = {} + + for tool_list, resource in tool_objs: + all_tools.extend(tool_list) + all_resources.update(resource) try: agent_definition = await client.beta.assistants.create( @@ -464,8 +474,8 @@ async def _from_dict( name=spec.name, description=spec.description, instructions=spec.instructions, - tools=tool_defs, - tool_resources=tool_resources, + tools=all_tools, + tool_resources=all_resources, metadata=spec.extras, **kwargs, ) @@ -475,11 +485,19 @@ async def _from_dict( return cls( definition=agent_definition, client=client, + arguments=arguments, kernel=kernel, prompt_template_config=prompt_template_config, **kwargs, ) + @classmethod + def _get_setting(cls: type[_T], value: Any) -> Any: + """Return raw value if `SecretStr`, otherwise pass through.""" + if isinstance(value, SecretStr): + return value.get_secret_value() + return value + @override @classmethod def resolve_placeholders( @@ -503,9 +521,9 @@ def resolve_placeholders( raise AgentInitializationException(f"Expected OpenAISettings, got {type(settings).__name__}") field_mapping.update({ - "ChatModelId": getattr(settings, "chat_model_id", None), - "AgentId": getattr(settings, "agent_id", None), - "ApiKey": getattr(settings, "api_key", None), + "ChatModelId": cls._get_setting(getattr(settings, "chat_model_id", None)), + "AgentId": cls._get_setting(getattr(settings, "agent_id", None)), + "ApiKey": cls._get_setting(getattr(settings, "api_key", None)), }) if extras: From a741eabdf62536403c703ce55d9a5cedee3bd153 Mon Sep 17 00:00:00 2001 From: Evan Mattson Date: Mon, 19 May 2025 14:26:00 +0900 Subject: [PATCH 05/18] Wip for Responses Agent --- python/samples/concepts/README.md | 2 +- .../azure_ai_agent_declarative_templating.py | 72 +++++++ ...openai_assistant_declarative_templating.py | 81 ++++++++ ...tant_declarative_with_existing_agent_id.py | 4 +- ...responses_agent_declarative_file_search.py | 99 +++++++++ ..._declarative_function_calling_from_file.py | 85 ++++++++ ..._responses_agent_declarative_templating.py | 81 ++++++++ ...responses_agent_declarative_file_search.py | 99 +++++++++ ..._declarative_function_calling_from_file.py | 85 ++++++++ ..._responses_agent_declarative_templating.py | 79 ++++++++ python/semantic_kernel/agents/__init__.py | 4 +- python/semantic_kernel/agents/__init__.pyi | 2 +- python/semantic_kernel/agents/agent.py | 4 +- .../agents/azure_ai/azure_ai_agent.py | 40 ++-- .../channels/open_ai_assistant_channel.py | 4 +- .../open_ai/assistant_thread_actions.py | 2 +- .../agents/open_ai/azure_assistant_agent.py | 2 +- .../agents/open_ai/azure_responses_agent.py | 74 ++++++- ...ant_agent.py => openai_assistant_agent.py} | 0 .../agents/open_ai/openai_responses_agent.py | 188 +++++++++++++++++- .../test_assistant_thread_actions.py | 2 +- .../test_azure_assistant_agent.py | 2 +- .../test_open_ai_assistant_channel.py | 2 +- .../test_openai_assistant_agent.py | 2 +- .../agent_diagnostics/test_agent_decorated.py | 2 +- .../test_trace_open_ai_assistant_agent.py | 14 +- 26 files changed, 989 insertions(+), 42 deletions(-) create mode 100644 python/samples/concepts/agents/azure_ai_agent/azure_ai_agent_declarative_templating.py create mode 100644 python/samples/concepts/agents/openai_assistant/azure_openai_assistant_declarative_templating.py create mode 100644 python/samples/concepts/agents/openai_responses/azure_openai_responses_agent_declarative_file_search.py create mode 100644 python/samples/concepts/agents/openai_responses/azure_openai_responses_agent_declarative_function_calling_from_file.py create mode 100644 python/samples/concepts/agents/openai_responses/azure_openai_responses_agent_declarative_templating.py create mode 100644 python/samples/concepts/agents/openai_responses/openai_responses_agent_declarative_file_search.py create mode 100644 python/samples/concepts/agents/openai_responses/openai_responses_agent_declarative_function_calling_from_file.py create mode 100644 python/samples/concepts/agents/openai_responses/openai_responses_agent_declarative_templating.py rename python/semantic_kernel/agents/open_ai/{open_ai_assistant_agent.py => openai_assistant_agent.py} (100%) diff --git a/python/samples/concepts/README.md b/python/samples/concepts/README.md index 7ac2de367a1c..a0a0488d870f 100644 --- a/python/samples/concepts/README.md +++ b/python/samples/concepts/README.md @@ -61,7 +61,7 @@ - [Mixed Chat Reset](./agents/mixed_chat/mixed_chat_reset.py) - [Mixed Chat Streaming](./agents/mixed_chat/mixed_chat_streaming.py) -#### [OpenAI Assistant Agent](../../semantic_kernel/agents/open_ai/open_ai_assistant_agent.py) +#### [OpenAI Assistant Agent](../../semantic_kernel/agents/open_ai/openai_assistant_agent.py) - [OpenAI Assistant Auto Function Invocation Filter Streaming](./agents/openai_assistant/openai_assistant_auto_func_invocation_filter_streaming.py) - [OpenAI Assistant Auto Function Invocation Filter](./agents/openai_assistant/openai_assistant_auto_func_invocation_filter.py) diff --git a/python/samples/concepts/agents/azure_ai_agent/azure_ai_agent_declarative_templating.py b/python/samples/concepts/agents/azure_ai_agent/azure_ai_agent_declarative_templating.py new file mode 100644 index 000000000000..45731aff3f0e --- /dev/null +++ b/python/samples/concepts/agents/azure_ai_agent/azure_ai_agent_declarative_templating.py @@ -0,0 +1,72 @@ +# Copyright (c) Microsoft. All rights reserved. + +import asyncio + +from azure.identity.aio import DefaultAzureCredential + +from semantic_kernel.agents import AzureAIAgent +from semantic_kernel.agents.agent import AgentRegistry + +""" +The following sample demonstrates how to create an Azure AI agent that answers +user questions using the file search tool. + +The agent is used to answer user questions that require file search to help ground +answers from the model. +""" + +# Define the YAML string for the sample +spec = """ +type: foundry_agent +name: StoryAgent +description: An agent that generates a story about a topic. +instructions: Tell a story about {{$topic}} that is {{$length}} sentences long. +model: + id: ${AzureAI:ChatModelId} + connection: + connection_string: ${AzureAI:ConnectionString} +inputs: + topic: + description: The topic of the story. + required: true + default: Cats + length: + description: The number of sentences in the story. + required: true + default: 2 +outputs: + output1: + description: The generated story. +template: + format: semantic-kernel +""" + + +async def main(): + async with ( + DefaultAzureCredential() as creds, + AzureAIAgent.create_client(credential=creds) as client, + ): + try: + # Create the AzureAI Agent from the YAML spec + agent: AzureAIAgent = await AgentRegistry.create_from_yaml( + yaml_str=spec, + client=client, + ) + + # Invoke the agent for the specified task + async for response in agent.invoke( + messages=None, + ): + print(f"# {response.name}: {response}") + finally: + # Cleanup: Delete the agent, vector store, and file + await client.agents.delete_agent(agent.id) + + """ + + """ + + +if __name__ == "__main__": + asyncio.run(main()) diff --git a/python/samples/concepts/agents/openai_assistant/azure_openai_assistant_declarative_templating.py b/python/samples/concepts/agents/openai_assistant/azure_openai_assistant_declarative_templating.py new file mode 100644 index 000000000000..5d4e66ff9f07 --- /dev/null +++ b/python/samples/concepts/agents/openai_assistant/azure_openai_assistant_declarative_templating.py @@ -0,0 +1,81 @@ +# Copyright (c) Microsoft. All rights reserved. + +import asyncio + +from semantic_kernel.agents import OpenAIAssistantAgent +from semantic_kernel.agents.agent import AgentRegistry + +""" +The following sample demonstrates how to create an Azure AI agent that answers +user questions using the file search tool. + +The agent is used to answer user questions that require file search to help ground +answers from the model. +""" + +# Define the YAML string for the sample +spec = """ +type: azure_openai_assistant +name: StoryAgent +description: An agent that generates a story about a topic. +instructions: Tell a story about {{$topic}} that is {{$length}} sentences long. +model: + id: ${AzureOpenAI:ChatModelId} + connection: + endpoint: ${AzureOpenAI:Endpoint} +inputs: + topic: + description: The topic of the story. + required: true + default: Cats + length: + description: The number of sentences in the story. + required: true + default: 2 +outputs: + output1: + description: The generated story. +template: + format: semantic-kernel +""" + + +async def main(): + # Setup the OpenAI Assistant client + client, _ = OpenAIAssistantAgent.setup_resources() + + try: + # Create the AzureAI Agent from the YAML spec + # Note: the extras can be provided in the short-format (shown below) or + # in the long-format (as shown in the YAML spec, with the `AzureAI:` prefix). + # The short-format is used here for brevity + agent: OpenAIAssistantAgent = await AgentRegistry.create_from_yaml( + yaml_str=spec, + client=client, + ) + + # Invoke the agent for the specified task + async for response in agent.invoke( + messages=None, + ): + print(f"# {response.name}: {response}") + finally: + # Cleanup: Delete the agent, vector store, and file + await client.beta.assistants.delete(agent.id) + + """ + Sample output: + + # User: 'Who can help me if I have a sales question?' + # FileSearchAgent: If you have a sales question, you may contact the following individuals: + + 1. **Hicran Bea** - Sales Manager + 2. **Mariam Jaslyn** - Sales Representative + 3. **Angelino Embla** - Sales Representative + + This information comes from the employee records【4:0†source】. + """ + + +if __name__ == "__main__": + asyncio.run(main()) diff --git a/python/samples/concepts/agents/openai_assistant/azure_openai_assistant_declarative_with_existing_agent_id.py b/python/samples/concepts/agents/openai_assistant/azure_openai_assistant_declarative_with_existing_agent_id.py index 2fa849a78178..8a3eec7e7bb9 100644 --- a/python/samples/concepts/agents/openai_assistant/azure_openai_assistant_declarative_with_existing_agent_id.py +++ b/python/samples/concepts/agents/openai_assistant/azure_openai_assistant_declarative_with_existing_agent_id.py @@ -11,8 +11,8 @@ # Define the YAML string for the sample spec = """ -id: ${AzureAI:AgentId} -type: foundry_agent +id: ${AzureOpenAI:AgentId} +type: azure_openai_assistant instructions: You are helpful agent who always responds in French. """ diff --git a/python/samples/concepts/agents/openai_responses/azure_openai_responses_agent_declarative_file_search.py b/python/samples/concepts/agents/openai_responses/azure_openai_responses_agent_declarative_file_search.py new file mode 100644 index 000000000000..cdadede0713c --- /dev/null +++ b/python/samples/concepts/agents/openai_responses/azure_openai_responses_agent_declarative_file_search.py @@ -0,0 +1,99 @@ +# Copyright (c) Microsoft. All rights reserved. + +import asyncio +import os + +from semantic_kernel.agents import AzureAssistantAgent +from semantic_kernel.agents.agent import AgentRegistry + +""" +The following sample demonstrates how to create an Azure AI agent that answers +user questions using the file search tool. + +The agent is used to answer user questions that require file search to help ground +answers from the model. +""" + +# Define the YAML string for the sample +spec = """ +type: azure_openai_responses_agent +name: FileSearchAgent +description: Agent with code interpreter tool. +instructions: > + Use the code interpreter tool to answer questions that require code to be generated + and executed. +model: + id: ${OpenAI:ChatModelId} + connection: + api_key: ${OpenAI:ApiKey} +tools: + - type: file_search + options: + vector_store_ids: + - ${OpenAI:VectorStoreId} +""" + + +async def main(): + # Setup the OpenAI Assistant client + client, _ = AzureAssistantAgent.setup_resources() + + # Read and upload the file to the OpenAI AI service + pdf_file_path = os.path.join( + os.path.dirname(os.path.dirname(os.path.dirname(os.path.realpath(__file__)))), + "resources", + "file_search", + "employees.pdf", + ) + # Upload the pdf file to the assistant service + with open(pdf_file_path, "rb") as file: + file = await client.files.create(file=file, purpose="assistants") + + vector_store = await client.vector_stores.create( + name="assistant_file_search", + file_ids=[file.id], + ) + + try: + # Create the AzureAI Agent from the YAML spec + # Note: the extras can be provided in the short-format (shown below) or + # in the long-format (as shown in the YAML spec, with the `AzureAI:` prefix). + # The short-format is used here for brevity + agent: AzureAssistantAgent = await AgentRegistry.create_from_yaml( + yaml_str=spec, + client=client, + extras={"OpenAI:VectorStoreId": vector_store.id}, + ) + + # Define the task for the agent + TASK = "Who can help me if I have a sales question?" + + print(f"# User: '{TASK}'") + + # Invoke the agent for the specified task + async for response in agent.invoke( + messages=TASK, + ): + print(f"# {response.name}: {response}") + finally: + # Cleanup: Delete the agent, vector store, and file + await client.beta.assistants.delete(agent.id) + await client.vector_stores.delete(vector_store.id) + await client.files.delete(file.id) + + """ + Sample output: + + # User: 'Who can help me if I have a sales question?' + # FileSearchAgent: If you have a sales question, you may contact the following individuals: + + 1. **Hicran Bea** - Sales Manager + 2. **Mariam Jaslyn** - Sales Representative + 3. **Angelino Embla** - Sales Representative + + This information comes from the employee records【4:0†source】. + """ + + +if __name__ == "__main__": + asyncio.run(main()) diff --git a/python/samples/concepts/agents/openai_responses/azure_openai_responses_agent_declarative_function_calling_from_file.py b/python/samples/concepts/agents/openai_responses/azure_openai_responses_agent_declarative_function_calling_from_file.py new file mode 100644 index 000000000000..3177bfc77a31 --- /dev/null +++ b/python/samples/concepts/agents/openai_responses/azure_openai_responses_agent_declarative_function_calling_from_file.py @@ -0,0 +1,85 @@ +# Copyright (c) Microsoft. All rights reserved. + +import asyncio +import os +from typing import Annotated + +from semantic_kernel.agents import AgentRegistry, AzureResponsesAgent +from semantic_kernel.functions.kernel_function_decorator import kernel_function + +""" +The following sample demonstrates how to create an Azure AI agent that answers +user questions. The sample shows how to load a declarative spec from a file. +The plugins/functions must already exist in the kernel. +They are not created declaratively via the spec. +""" + + +class MenuPlugin: + """A sample Menu Plugin used for the concept sample.""" + + @kernel_function(description="Provides a list of specials from the menu.") + def get_specials(self) -> Annotated[str, "Returns the specials from the menu."]: + return """ + Special Soup: Clam Chowder + Special Salad: Cobb Salad + Special Drink: Chai Tea + """ + + @kernel_function(description="Provides the price of the requested menu item.") + def get_item_price( + self, menu_item: Annotated[str, "The name of the menu item."] + ) -> Annotated[str, "Returns the price of the menu item."]: + return "$9.99" + + +async def main(): + try: + client, _ = AzureResponsesAgent.setup_resources() + + # Define the YAML file path for the sample + file_path = os.path.join( + os.path.dirname(os.path.dirname(os.path.dirname(os.path.realpath(__file__)))), + "resources", + "declarative_spec", + "azure_assistant_spec.yaml", + ) + + # Create the AzureAI Agent from the YAML spec + agent: AzureResponsesAgent = await AgentRegistry.create_from_file( + file_path, + plugins=[MenuPlugin()], + client=client, + ) + + # Create the agent + user_inputs = [ + "Hello", + "What is the special soup?", + "How much does that cost?", + "Thank you", + ] + + # Create a thread for the agent + # If no thread is provided, a new thread will be + # created and returned with the initial response + thread = None + + for user_input in user_inputs: + print(f"# User: '{user_input}'") + # Invoke the agent for the specified task + async for response in agent.invoke( + messages=user_input, + thread=thread, + ): + print(f"# {response.name}: {response}") + # Store the thread for the next iteration + thread = response.thread + finally: + # Cleanup: Delete the thread and agent + await client.beta.assistants.delete(agent.id) if agent else None + await thread.delete() if thread else None + + +if __name__ == "__main__": + asyncio.run(main()) diff --git a/python/samples/concepts/agents/openai_responses/azure_openai_responses_agent_declarative_templating.py b/python/samples/concepts/agents/openai_responses/azure_openai_responses_agent_declarative_templating.py new file mode 100644 index 000000000000..0c6f50b1ad9d --- /dev/null +++ b/python/samples/concepts/agents/openai_responses/azure_openai_responses_agent_declarative_templating.py @@ -0,0 +1,81 @@ +# Copyright (c) Microsoft. All rights reserved. + +import asyncio + +from semantic_kernel.agents import AzureResponsesAgent +from semantic_kernel.agents.agent import AgentRegistry + +""" +The following sample demonstrates how to create an Azure AI agent that answers +user questions using the file search tool. + +The agent is used to answer user questions that require file search to help ground +answers from the model. +""" + +# Define the YAML string for the sample +spec = """ +type: azure_openai_responses_agent +name: StoryAgent +description: An agent that generates a story about a topic. +instructions: Tell a story about {{$topic}} that is {{$length}} sentences long. +model: + id: ${AzureOpenAI:ChatModelId} + connection: + endpoint: ${AzureOpenAI:Endpoint} +inputs: + topic: + description: The topic of the story. + required: true + default: Cats + length: + description: The number of sentences in the story. + required: true + default: 2 +outputs: + output1: + description: The generated story. +template: + format: semantic-kernel +""" + + +async def main(): + # Setup the OpenAI Assistant client + client, _ = AzureResponsesAgent.setup_resources() + + try: + # Create the AzureAI Agent from the YAML spec + # Note: the extras can be provided in the short-format (shown below) or + # in the long-format (as shown in the YAML spec, with the `AzureAI:` prefix). + # The short-format is used here for brevity + agent: AzureResponsesAgent = await AgentRegistry.create_from_yaml( + yaml_str=spec, + client=client, + ) + + # Invoke the agent for the specified task + async for response in agent.invoke( + messages=None, + ): + print(f"# {response.name}: {response}") + finally: + # Cleanup: Delete the agent, vector store, and file + await client.beta.assistants.delete(agent.id) + + """ + Sample output: + + # User: 'Who can help me if I have a sales question?' + # FileSearchAgent: If you have a sales question, you may contact the following individuals: + + 1. **Hicran Bea** - Sales Manager + 2. **Mariam Jaslyn** - Sales Representative + 3. **Angelino Embla** - Sales Representative + + This information comes from the employee records【4:0†source】. + """ + + +if __name__ == "__main__": + asyncio.run(main()) diff --git a/python/samples/concepts/agents/openai_responses/openai_responses_agent_declarative_file_search.py b/python/samples/concepts/agents/openai_responses/openai_responses_agent_declarative_file_search.py new file mode 100644 index 000000000000..b5196e4e3341 --- /dev/null +++ b/python/samples/concepts/agents/openai_responses/openai_responses_agent_declarative_file_search.py @@ -0,0 +1,99 @@ +# Copyright (c) Microsoft. All rights reserved. + +import asyncio +import os + +from semantic_kernel.agents import OpenAIResponsesAgent +from semantic_kernel.agents.agent import AgentRegistry + +""" +The following sample demonstrates how to create an Azure AI agent that answers +user questions using the file search tool. + +The agent is used to answer user questions that require file search to help ground +answers from the model. +""" + +# Define the YAML string for the sample +spec = """ +type: openai_responses_agent +name: FileSearchAgent +description: Agent with code interpreter tool. +instructions: > + Use the code interpreter tool to answer questions that require code to be generated + and executed. +model: + id: ${OpenAI:ChatModelId} + connection: + api_key: ${OpenAI:ApiKey} +tools: + - type: file_search + options: + vector_store_ids: + - ${OpenAI:VectorStoreId} +""" + + +async def main(): + # Setup the OpenAI Assistant client + client, _ = OpenAIResponsesAgent.setup_resources() + + # Read and upload the file to the OpenAI AI service + pdf_file_path = os.path.join( + os.path.dirname(os.path.dirname(os.path.dirname(os.path.realpath(__file__)))), + "resources", + "file_search", + "employees.pdf", + ) + # Upload the pdf file to the assistant service + with open(pdf_file_path, "rb") as file: + file = await client.files.create(file=file, purpose="assistants") + + vector_store = await client.vector_stores.create( + name="assistant_file_search", + file_ids=[file.id], + ) + + try: + # Create the AzureAI Agent from the YAML spec + # Note: the extras can be provided in the short-format (shown below) or + # in the long-format (as shown in the YAML spec, with the `AzureAI:` prefix). + # The short-format is used here for brevity + agent: OpenAIResponsesAgent = await AgentRegistry.create_from_yaml( + yaml_str=spec, + client=client, + extras={"OpenAI:VectorStoreId": vector_store.id}, + ) + + # Define the task for the agent + TASK = "Who can help me if I have a sales question?" + + print(f"# User: '{TASK}'") + + # Invoke the agent for the specified task + async for response in agent.invoke( + messages=TASK, + ): + print(f"# {response.name}: {response}") + finally: + # Cleanup: Delete the agent, vector store, and file + await client.beta.assistants.delete(agent.id) + await client.vector_stores.delete(vector_store.id) + await client.files.delete(file.id) + + """ + Sample output: + + # User: 'Who can help me if I have a sales question?' + # FileSearchAgent: If you have a sales question, you may contact the following individuals: + + 1. **Hicran Bea** - Sales Manager + 2. **Mariam Jaslyn** - Sales Representative + 3. **Angelino Embla** - Sales Representative + + This information comes from the employee records【4:0†source】. + """ + + +if __name__ == "__main__": + asyncio.run(main()) diff --git a/python/samples/concepts/agents/openai_responses/openai_responses_agent_declarative_function_calling_from_file.py b/python/samples/concepts/agents/openai_responses/openai_responses_agent_declarative_function_calling_from_file.py new file mode 100644 index 000000000000..d4af62103c0f --- /dev/null +++ b/python/samples/concepts/agents/openai_responses/openai_responses_agent_declarative_function_calling_from_file.py @@ -0,0 +1,85 @@ +# Copyright (c) Microsoft. All rights reserved. + +import asyncio +import os +from typing import Annotated + +from semantic_kernel.agents import AgentRegistry, OpenAIResponsesAgent +from semantic_kernel.functions.kernel_function_decorator import kernel_function + +""" +The following sample demonstrates how to create an Azure AI agent that answers +user questions. The sample shows how to load a declarative spec from a file. +The plugins/functions must already exist in the kernel. +They are not created declaratively via the spec. +""" + + +class MenuPlugin: + """A sample Menu Plugin used for the concept sample.""" + + @kernel_function(description="Provides a list of specials from the menu.") + def get_specials(self) -> Annotated[str, "Returns the specials from the menu."]: + return """ + Special Soup: Clam Chowder + Special Salad: Cobb Salad + Special Drink: Chai Tea + """ + + @kernel_function(description="Provides the price of the requested menu item.") + def get_item_price( + self, menu_item: Annotated[str, "The name of the menu item."] + ) -> Annotated[str, "Returns the price of the menu item."]: + return "$9.99" + + +async def main(): + try: + client, _ = OpenAIResponsesAgent.setup_resources() + + # Define the YAML file path for the sample + file_path = os.path.join( + os.path.dirname(os.path.dirname(os.path.dirname(os.path.realpath(__file__)))), + "resources", + "declarative_spec", + "openai_assistant_spec.yaml", + ) + + # Create the AzureAI Agent from the YAML spec + agent: OpenAIResponsesAgent = await AgentRegistry.create_from_file( + file_path, + plugins=[MenuPlugin()], + client=client, + ) + + # Create the agent + user_inputs = [ + "Hello", + "What is the special soup?", + "How much does that cost?", + "Thank you", + ] + + # Create a thread for the agent + # If no thread is provided, a new thread will be + # created and returned with the initial response + thread = None + + for user_input in user_inputs: + print(f"# User: '{user_input}'") + # Invoke the agent for the specified task + async for response in agent.invoke( + messages=user_input, + thread=thread, + ): + print(f"# {response.name}: {response}") + # Store the thread for the next iteration + thread = response.thread + finally: + # Cleanup: Delete the thread and agent + await client.beta.assistants.delete(agent.id) if agent else None + await thread.delete() if thread else None + + +if __name__ == "__main__": + asyncio.run(main()) diff --git a/python/samples/concepts/agents/openai_responses/openai_responses_agent_declarative_templating.py b/python/samples/concepts/agents/openai_responses/openai_responses_agent_declarative_templating.py new file mode 100644 index 000000000000..c41d5a3f87cf --- /dev/null +++ b/python/samples/concepts/agents/openai_responses/openai_responses_agent_declarative_templating.py @@ -0,0 +1,79 @@ +# Copyright (c) Microsoft. All rights reserved. + +import asyncio + +from semantic_kernel.agents import OpenAIResponsesAgent +from semantic_kernel.agents.agent import AgentRegistry + +""" +The following sample demonstrates how to create an Azure AI agent that answers +user questions using the file search tool. + +The agent is used to answer user questions that require file search to help ground +answers from the model. +""" + +# Define the YAML string for the sample +spec = """ +type: openai_responses_agent +name: StoryAgent +description: An agent that generates a story about a topic. +instructions: Tell a story about {{$topic}} that is {{$length}} sentences long. +model: + id: ${OpenAI:ChatModelId} +inputs: + topic: + description: The topic of the story. + required: true + default: Cats + length: + description: The number of sentences in the story. + required: true + default: 2 +outputs: + output1: + description: The generated story. +template: + format: semantic-kernel +""" + + +async def main(): + # Setup the OpenAI Assistant client + client, _ = OpenAIResponsesAgent.setup_resources() + + try: + # Create the AzureAI Agent from the YAML spec + # Note: the extras can be provided in the short-format (shown below) or + # in the long-format (as shown in the YAML spec, with the `AzureAI:` prefix). + # The short-format is used here for brevity + agent: OpenAIResponsesAgent = await AgentRegistry.create_from_yaml( + yaml_str=spec, + client=client, + ) + + # Invoke the agent for the specified task + async for response in agent.invoke( + messages=None, + ): + print(f"# {response.name}: {response}") + finally: + # Cleanup: Delete the agent, vector store, and file + await client.beta.assistants.delete(agent.id) + + """ + Sample output: + + # User: 'Who can help me if I have a sales question?' + # FileSearchAgent: If you have a sales question, you may contact the following individuals: + + 1. **Hicran Bea** - Sales Manager + 2. **Mariam Jaslyn** - Sales Representative + 3. **Angelino Embla** - Sales Representative + + This information comes from the employee records【4:0†source】. + """ + + +if __name__ == "__main__": + asyncio.run(main()) diff --git a/python/semantic_kernel/agents/__init__.py b/python/semantic_kernel/agents/__init__.py index b89af9f0106a..89cc00e4c9ef 100644 --- a/python/semantic_kernel/agents/__init__.py +++ b/python/semantic_kernel/agents/__init__.py @@ -16,7 +16,7 @@ "AzureAIAgentSettings": ".azure_ai.azure_ai_agent_settings", "AzureAIAgentThread": ".azure_ai.azure_ai_agent", "AzureAssistantAgent": ".open_ai.azure_assistant_agent", - "AssistantAgentThread": ".open_ai.open_ai_assistant_agent", + "AssistantAgentThread": ".open_ai.openai_assistant_agent", "AzureResponsesAgent": ".open_ai.azure_responses_agent", "BedrockAgent": ".bedrock.bedrock_agent", "BedrockAgentThread": ".bedrock.bedrock_agent", @@ -27,7 +27,7 @@ "CopilotStudioAgentSettings": ".copilot_studio.copilot_studio_agent_settings", "CopilotStudioAgentThread": ".copilot_studio.copilot_studio_agent", "DeclarativeSpecMixin": ".agent", - "OpenAIAssistantAgent": ".open_ai.open_ai_assistant_agent", + "OpenAIAssistantAgent": ".open_ai.openai_assistant_agent", "OpenAIResponsesAgent": ".open_ai.openai_responses_agent", "ModelConnection": ".agent", "ModelSpec": ".agent", diff --git a/python/semantic_kernel/agents/__init__.pyi b/python/semantic_kernel/agents/__init__.pyi index 9b6a795aabb1..634b4f5c1a2d 100644 --- a/python/semantic_kernel/agents/__init__.pyi +++ b/python/semantic_kernel/agents/__init__.pyi @@ -23,7 +23,7 @@ from .group_chat.agent_chat import AgentChat from .group_chat.agent_group_chat import AgentGroupChat from .open_ai.azure_assistant_agent import AzureAssistantAgent from .open_ai.azure_responses_agent import AzureResponsesAgent -from .open_ai.open_ai_assistant_agent import AssistantAgentThread, OpenAIAssistantAgent +from .open_ai.openai_assistant_agent import AssistantAgentThread, OpenAIAssistantAgent from .open_ai.openai_responses_agent import OpenAIResponsesAgent, ResponsesAgentThread from .open_ai.run_polling_options import RunPollingOptions from .orchestration.concurrent import ConcurrentOrchestration diff --git a/python/semantic_kernel/agents/agent.py b/python/semantic_kernel/agents/agent.py index 98dd894c54fa..6cf58cf53924 100644 --- a/python/semantic_kernel/agents/agent.py +++ b/python/semantic_kernel/agents/agent.py @@ -658,8 +658,10 @@ def decorator(cls: type[_TAgent]) -> type[_TAgent]: _BUILTIN_AGENT_MODULES = [ "semantic_kernel.agents.chat_completion.chat_completion_agent", "semantic_kernel.agents.azure_ai.azure_ai_agent", - "semantic_kernel.agents.open_ai.open_ai_assistant_agent", + "semantic_kernel.agents.open_ai.openai_assistant_agent", "semantic_kernel.agents.open_ai.azure_assistant_agent", + "semantic_kernel.agents.open_ai.openai_responses_agent", + "semantic_kernel.agents.open_ai.azure_responses_agent", ] diff --git a/python/semantic_kernel/agents/azure_ai/azure_ai_agent.py b/python/semantic_kernel/agents/azure_ai/azure_ai_agent.py index 53c1a908a5d8..67fcbecd4b18 100644 --- a/python/semantic_kernel/agents/azure_ai/azure_ai_agent.py +++ b/python/semantic_kernel/agents/azure_ai/azure_ai_agent.py @@ -482,6 +482,10 @@ async def _from_dict( if "settings" in kwargs: kwargs.pop("settings") + args = data.pop("arguments", None) + if args: + arguments = KernelArguments(**args) + if spec.id: existing_definition = await client.agents.get_agent(spec.id) @@ -505,6 +509,7 @@ async def _from_dict( client=client, kernel=kernel, prompt_template_config=prompt_template_config, + arguments=arguments, **kwargs, ) @@ -534,6 +539,7 @@ async def _from_dict( definition=agent_definition, client=client, kernel=kernel, + arguments=arguments, prompt_template_config=prompt_template_config, **kwargs, ) @@ -561,22 +567,24 @@ def resolve_placeholders( # Build the mapping only if settings is provided and valid field_mapping: dict[str, Any] = {} - if settings is not None: - if not isinstance(settings, AzureAIAgentSettings): - raise AgentInitializationException(f"Expected AzureAIAgentSettings, got {type(settings).__name__}") - - field_mapping.update({ - "ChatModelId": cls._get_setting(getattr(settings, "model_deployment_name", None)), - "ConnectionString": cls._get_setting(getattr(settings, "project_connection_string", None)), - "AgentId": cls._get_setting(getattr(settings, "agent_id", None)), - "Endpoint": cls._get_setting(getattr(settings, "endpoint", None)), - "SubscriptionId": cls._get_setting(getattr(settings, "subscription_id", None)), - "ResourceGroup": cls._get_setting(getattr(settings, "resource_group_name", None)), - "ProjectName": cls._get_setting(getattr(settings, "project_name", None)), - "BingConnectionId": cls._get_setting(getattr(settings, "bing_connection_id", None)), - "AzureAISearchConnectionId": cls._get_setting(getattr(settings, "azure_ai_search_connection_id", None)), - "AzureAISearchIndexName": cls._get_setting(getattr(settings, "azure_ai_search_index_name", None)), - }) + if settings is None: + settings = AzureAIAgentSettings() + + if not isinstance(settings, AzureAIAgentSettings): + raise AgentInitializationException(f"Expected AzureAIAgentSettings, got {type(settings).__name__}") + + field_mapping.update({ + "ChatModelId": cls._get_setting(getattr(settings, "model_deployment_name", None)), + "ConnectionString": cls._get_setting(getattr(settings, "project_connection_string", None)), + "AgentId": cls._get_setting(getattr(settings, "agent_id", None)), + "Endpoint": cls._get_setting(getattr(settings, "endpoint", None)), + "SubscriptionId": cls._get_setting(getattr(settings, "subscription_id", None)), + "ResourceGroup": cls._get_setting(getattr(settings, "resource_group_name", None)), + "ProjectName": cls._get_setting(getattr(settings, "project_name", None)), + "BingConnectionId": cls._get_setting(getattr(settings, "bing_connection_id", None)), + "AzureAISearchConnectionId": cls._get_setting(getattr(settings, "azure_ai_search_connection_id", None)), + "AzureAISearchIndexName": cls._get_setting(getattr(settings, "azure_ai_search_index_name", None)), + }) if extras: field_mapping.update(extras) diff --git a/python/semantic_kernel/agents/channels/open_ai_assistant_channel.py b/python/semantic_kernel/agents/channels/open_ai_assistant_channel.py index e3e8fd7a15bf..6285a91118f2 100644 --- a/python/semantic_kernel/agents/channels/open_ai_assistant_channel.py +++ b/python/semantic_kernel/agents/channels/open_ai_assistant_channel.py @@ -55,7 +55,7 @@ async def invoke(self, agent: "Agent", **kwargs: Any) -> AsyncIterable[tuple[boo Yields: tuple[bool, ChatMessageContent]: The conversation messages. """ - from semantic_kernel.agents.open_ai.open_ai_assistant_agent import OpenAIAssistantAgent + from semantic_kernel.agents.open_ai.openai_assistant_agent import OpenAIAssistantAgent if not isinstance(agent, OpenAIAssistantAgent): raise AgentChatException(f"Agent is not of the expected type {type(OpenAIAssistantAgent)}.") @@ -77,7 +77,7 @@ async def invoke_stream( Yields: tuple[bool, StreamingChatMessageContent]: The conversation messages. """ - from semantic_kernel.agents.open_ai.open_ai_assistant_agent import OpenAIAssistantAgent + from semantic_kernel.agents.open_ai.openai_assistant_agent import OpenAIAssistantAgent if not isinstance(agent, OpenAIAssistantAgent): raise AgentChatException(f"Agent is not of the expected type {type(OpenAIAssistantAgent)}.") diff --git a/python/semantic_kernel/agents/open_ai/assistant_thread_actions.py b/python/semantic_kernel/agents/open_ai/assistant_thread_actions.py index 1231b02e2f56..16993b8adf83 100644 --- a/python/semantic_kernel/agents/open_ai/assistant_thread_actions.py +++ b/python/semantic_kernel/agents/open_ai/assistant_thread_actions.py @@ -49,7 +49,7 @@ from openai.types.beta.threads.run import Run from openai.types.beta.threads.run_create_params import AdditionalMessageAttachmentTool, TruncationStrategy - from semantic_kernel.agents.open_ai.open_ai_assistant_agent import OpenAIAssistantAgent + from semantic_kernel.agents.open_ai.openai_assistant_agent import OpenAIAssistantAgent from semantic_kernel.contents.chat_history import ChatHistory from semantic_kernel.contents.chat_message_content import ChatMessageContent from semantic_kernel.contents.function_call_content import FunctionCallContent diff --git a/python/semantic_kernel/agents/open_ai/azure_assistant_agent.py b/python/semantic_kernel/agents/open_ai/azure_assistant_agent.py index bce70cd2c7b4..e6d3c78b211e 100644 --- a/python/semantic_kernel/agents/open_ai/azure_assistant_agent.py +++ b/python/semantic_kernel/agents/open_ai/azure_assistant_agent.py @@ -134,7 +134,7 @@ def resolve_placeholders( settings: "KernelBaseSettings | None" = None, extras: dict[str, Any] | None = None, ) -> str: - """Substitute ${OpenAI:Key} placeholders with fields from OpenAIAgentSettings and extras.""" + """Substitute ${AzureOpenAI:Key} placeholders with fields from AzureOpenAIAgentSettings and extras.""" import re pattern = re.compile(r"\$\{([^}]+)\}") diff --git a/python/semantic_kernel/agents/open_ai/azure_responses_agent.py b/python/semantic_kernel/agents/open_ai/azure_responses_agent.py index 294477fa2b02..b9f81bfc0fd4 100644 --- a/python/semantic_kernel/agents/open_ai/azure_responses_agent.py +++ b/python/semantic_kernel/agents/open_ai/azure_responses_agent.py @@ -1,14 +1,16 @@ # Copyright (c) Microsoft. All rights reserved. import logging +import sys from collections.abc import Awaitable, Callable from copy import copy -from typing import Any +from typing import TYPE_CHECKING, Any from openai import AsyncAzureOpenAI from pydantic import ValidationError from semantic_kernel.agents import OpenAIResponsesAgent +from semantic_kernel.agents.agent import register_agent_type from semantic_kernel.connectors.ai.open_ai.settings.azure_open_ai_settings import AzureOpenAISettings from semantic_kernel.exceptions.agent_exceptions import ( AgentInitializationException, @@ -17,10 +19,24 @@ from semantic_kernel.utils.feature_stage_decorator import experimental from semantic_kernel.utils.telemetry.user_agent import APP_INFO, prepend_semantic_kernel_to_user_agent +if TYPE_CHECKING: + from semantic_kernel.kernel_pydantic import KernelBaseSettings + logger: logging.Logger = logging.getLogger(__name__) +if sys.version_info >= (3, 12): + from typing import override # pragma: no cover +else: + from typing_extensions import override # pragma: no cover + +if sys.version < "3.11": + from typing_extensions import Self # pragma: no cover +else: + from typing import Self # type: ignore # pragma: no cover + @experimental +@register_agent_type("azure_openai_responses_agent") class AzureResponsesAgent(OpenAIResponsesAgent): """Azure Responses Agent class. @@ -116,3 +132,59 @@ def setup_resources( ) return client, azure_openai_settings.responses_deployment_name + + @override + @classmethod + def resolve_placeholders( + cls: type[Self], + yaml_str: str, + settings: "KernelBaseSettings | None" = None, + extras: dict[str, Any] | None = None, + ) -> str: + """Substitute ${AzureOpenAI:Key} placeholders with fields from AzureOpenAIAgentSettings and extras.""" + import re + + pattern = re.compile(r"\$\{([^}]+)\}") + + # Build the mapping only if settings is provided and valid + field_mapping: dict[str, Any] = {} + + if settings is None: + settings = AzureOpenAISettings() + + if not isinstance(settings, AzureOpenAISettings): + raise AgentInitializationException(f"Expected AzureOpenAISettings, got {type(settings).__name__}") + + field_mapping.update({ + "ChatModelId": getattr(settings, "responses_deployment_name", None), + "AgentId": getattr(settings, "agent_id", None), + "ApiKey": getattr(settings, "api_key", None), + "ApiVersion": getattr(settings, "api_version", None), + "BaseUrl": getattr(settings, "base_url", None), + "Endpoint": getattr(settings, "endpoint", None), + "TokenEndpoint": getattr(settings, "token_endpoint", None), + }) + + if extras: + field_mapping.update(extras) + + def replacer(match: re.Match[str]) -> str: + """Replace the matched placeholder with the corresponding value from field_mapping.""" + full_key = match.group(1) # for example, AzureOpenAI:ApiKey + section, _, key = full_key.partition(":") + if section != "AzureOpenAI": + return match.group(0) + + # Try short key first (ApiKey), then full (AzureOpenAI:ApiKey) + return str(field_mapping.get(key) or field_mapping.get(full_key) or match.group(0)) + + result = pattern.sub(replacer, yaml_str) + + # Safety check for unresolved placeholders + unresolved = pattern.findall(result) + if unresolved: + raise AgentInitializationException( + f"Unresolved placeholders in spec: {', '.join(f'${{{key}}}' for key in unresolved)}" + ) + + return result diff --git a/python/semantic_kernel/agents/open_ai/open_ai_assistant_agent.py b/python/semantic_kernel/agents/open_ai/openai_assistant_agent.py similarity index 100% rename from python/semantic_kernel/agents/open_ai/open_ai_assistant_agent.py rename to python/semantic_kernel/agents/open_ai/openai_assistant_agent.py diff --git a/python/semantic_kernel/agents/open_ai/openai_responses_agent.py b/python/semantic_kernel/agents/open_ai/openai_responses_agent.py index eadfe08d9890..782c6973796f 100644 --- a/python/semantic_kernel/agents/open_ai/openai_responses_agent.py +++ b/python/semantic_kernel/agents/open_ai/openai_responses_agent.py @@ -1,10 +1,11 @@ # Copyright (c) Microsoft. All rights reserved. +import inspect import logging import sys from collections.abc import AsyncIterable, Awaitable, Callable from copy import copy -from typing import TYPE_CHECKING, Any, Literal +from typing import TYPE_CHECKING, Any, Literal, TypeVar from openai import AsyncOpenAI from openai.lib._parsing._responses import type_to_text_format_param @@ -18,10 +19,12 @@ from openai.types.shared_params.comparison_filter import ComparisonFilter from openai.types.shared_params.compound_filter import CompoundFilter from openai.types.shared_params.response_format_json_object import ResponseFormatJSONObject -from pydantic import BaseModel, Field, ValidationError +from pydantic import BaseModel, Field, SecretStr, ValidationError from semantic_kernel.agents import Agent, AgentResponseItem, AgentThread, RunPollingOptions +from semantic_kernel.agents.agent import AgentSpec, ToolSpec, register_agent_type from semantic_kernel.agents.open_ai.responses_agent_thread_actions import ResponsesAgentThreadActions +from semantic_kernel.connectors.ai.function_calling_utils import kernel_function_metadata_to_function_call_format from semantic_kernel.connectors.ai.function_choice_behavior import FunctionChoiceBehavior from semantic_kernel.connectors.ai.open_ai.settings.open_ai_settings import OpenAISettings from semantic_kernel.contents.chat_history import ChatHistory @@ -55,12 +58,79 @@ from openai import AsyncOpenAI from semantic_kernel.kernel import Kernel + from semantic_kernel.kernel_pydantic import KernelBaseSettings from semantic_kernel.prompt_template.prompt_template_config import PromptTemplateConfig +_T = TypeVar("_T", bound="OpenAIResponsesAgent") ResponseFormatUnion = ResponseFormatText | ResponseFormatTextJSONSchemaConfigParam | ResponseFormatJSONObject logger: logging.Logger = logging.getLogger(__name__) + +# region Declarative Spec + +_TOOL_BUILDERS: dict[str, Callable[[ToolSpec, Kernel | None], ToolParam]] = {} + + +def _register_tool(tool_type: str): + def decorator(fn: Callable[[ToolSpec, Kernel | None], ToolParam]): + _TOOL_BUILDERS[tool_type.lower()] = fn + return fn + + return decorator + + +@_register_tool("file_search") +def _file_search(spec: ToolSpec, kernel: Kernel | None = None) -> FileSearchToolParam: + vector_store_ids = spec.options.get("vector_store_ids") + if not vector_store_ids or not isinstance(vector_store_ids, list) or not vector_store_ids[0]: + raise AgentInitializationException(f"Missing or malformed 'vector_store_ids' in: {spec}") + return OpenAIResponsesAgent.configure_file_search_tool(vector_store_ids=vector_store_ids) + + +@_register_tool("web_search") +def _web_search(spec: ToolSpec, kernel: Kernel | None = None) -> WebSearchToolParam: + return OpenAIResponsesAgent.configure_web_search_tool() + + +@_register_tool("function") +def _function(spec: ToolSpec, kernel: "Kernel") -> ToolParam: + def parse_fqn(fqn: str) -> tuple[str, str]: + parts = fqn.split(".") + if len(parts) != 2: + raise AgentInitializationException(f"Function `{fqn}` must be in the form `pluginName.functionName`.") + return parts[0], parts[1] + + if not spec.id: + raise AgentInitializationException("Function ID is required for function tools.") + plugin_name, function_name = parse_fqn(spec.id) + funcs = kernel.get_list_of_function_metadata_filters({"included_functions": f"{plugin_name}-{function_name}"}) + + match len(funcs): + case 0: + raise AgentInitializationException(f"Function `{spec.id}` not found in kernel.") + case 1: + return kernel_function_metadata_to_function_call_format(funcs[0]) # type: ignore[return-value] + case _: + raise AgentInitializationException(f"Multiple definitions found for `{spec.id}`. Please remove duplicates.") + + +def _build_tool(spec: ToolSpec, kernel: "Kernel") -> ToolParam: + if not spec.type: + raise AgentInitializationException("Tool spec must include a 'type' field.") + + try: + builder = _TOOL_BUILDERS[spec.type.lower()] + except KeyError as exc: + raise AgentInitializationException(f"Unsupported tool type: {spec.type}") from exc + + sig = inspect.signature(builder) + return builder(spec) if len(sig.parameters) == 1 else builder(spec, kernel) # type: ignore[call-arg] + + +# endregion + + # region Agent Thread @@ -177,6 +247,7 @@ async def reduce(self) -> ChatHistory | None: @experimental +@register_agent_type("openai_responses_agent") class OpenAIResponsesAgent(Agent): """OpenAI Responses Agent class. @@ -364,6 +435,119 @@ def setup_resources( # endregion + # region Declarative Spec + + @override + @classmethod + async def _from_dict( + cls: type[_T], + data: dict, + *, + kernel: Kernel, + prompt_template_config: "PromptTemplateConfig | None" = None, + **kwargs, + ) -> _T: + """Create an Assistant Agent from the provided dictionary. + + Args: + data: The dictionary containing the agent data. + kernel: The kernel to use for the agent. + prompt_template_config: The prompt template configuration. + kwargs: Additional keyword arguments. Note: unsupported keys may raise validation errors. + + Returns: + AzureAIAgent: The OpenAI Assistant Agent instance. + """ + client: AsyncOpenAI = kwargs.pop("client", None) + if client is None: + raise AgentInitializationException("Missing required 'client' in OpenAIResponsesAgent._from_dict()") + + spec = AgentSpec.model_validate(data) + + if "settings" in kwargs: + kwargs.pop("settings") + + args = data.pop("arguments", None) + if args: + arguments = KernelArguments(**args) + + if not (spec.model and spec.model.id): + raise AgentInitializationException("model.id required when creating a new Azure AI agent") + + # Build tool definitions & resources + tool_objs = [_build_tool(t, kernel) for t in spec.tools if t.type != "function"] + + return cls( + ai_model_id=spec.model.id, + client=client, + arguments=arguments, + kernel=kernel, + prompt_template_config=prompt_template_config, + tools=tool_objs, + **kwargs, + ) + + @classmethod + def _get_setting(cls: type[_T], value: Any) -> Any: + """Return raw value if `SecretStr`, otherwise pass through.""" + if isinstance(value, SecretStr): + return value.get_secret_value() + return value + + @override + @classmethod + def resolve_placeholders( + cls: type[_T], + yaml_str: str, + settings: "KernelBaseSettings | None" = None, + extras: dict[str, Any] | None = None, + ) -> str: + """Substitute ${OpenAI:Key} placeholders with fields from OpenAIAgentSettings and extras.""" + import re + + pattern = re.compile(r"\$\{([^}]+)\}") + + # Build the mapping only if settings is provided and valid + field_mapping: dict[str, Any] = {} + + if settings is None: + settings = OpenAISettings() + + if not isinstance(settings, OpenAISettings): + raise AgentInitializationException(f"Expected OpenAISettings, got {type(settings).__name__}") + + field_mapping.update({ + "ChatModelId": cls._get_setting(getattr(settings, "chat_model_id", None)), + "AgentId": cls._get_setting(getattr(settings, "agent_id", None)), + "ApiKey": cls._get_setting(getattr(settings, "api_key", None)), + }) + + if extras: + field_mapping.update(extras) + + def replacer(match: re.Match[str]) -> str: + """Replace the matched placeholder with the corresponding value from field_mapping.""" + full_key = match.group(1) # for example, OpenAI:ApiKey + section, _, key = full_key.partition(":") + if section != "OpenAI": + return match.group(0) + + # Try short key first (ApiKey), then full (OpenAI:ApiKey) + return str(field_mapping.get(key) or field_mapping.get(full_key) or match.group(0)) + + result = pattern.sub(replacer, yaml_str) + + # Safety check for unresolved placeholders + unresolved = pattern.findall(result) + if unresolved: + raise AgentInitializationException( + f"Unresolved placeholders in spec: {', '.join(f'${{{key}}}' for key in unresolved)}" + ) + + return result + + # endregion + # region Tool Handling @staticmethod diff --git a/python/tests/unit/agents/openai_assistant/test_assistant_thread_actions.py b/python/tests/unit/agents/openai_assistant/test_assistant_thread_actions.py index c49e85dcc88c..1bb688bb42c0 100644 --- a/python/tests/unit/agents/openai_assistant/test_assistant_thread_actions.py +++ b/python/tests/unit/agents/openai_assistant/test_assistant_thread_actions.py @@ -53,7 +53,7 @@ from semantic_kernel.agents.open_ai.assistant_thread_actions import AssistantThreadActions from semantic_kernel.agents.open_ai.function_action_result import FunctionActionResult -from semantic_kernel.agents.open_ai.open_ai_assistant_agent import OpenAIAssistantAgent +from semantic_kernel.agents.open_ai.openai_assistant_agent import OpenAIAssistantAgent from semantic_kernel.agents.open_ai.run_polling_options import RunPollingOptions from semantic_kernel.contents.chat_message_content import ChatMessageContent from semantic_kernel.contents.file_reference_content import FileReferenceContent diff --git a/python/tests/unit/agents/openai_assistant/test_azure_assistant_agent.py b/python/tests/unit/agents/openai_assistant/test_azure_assistant_agent.py index 22f49a0aea53..b8f5d7a83bc6 100644 --- a/python/tests/unit/agents/openai_assistant/test_azure_assistant_agent.py +++ b/python/tests/unit/agents/openai_assistant/test_azure_assistant_agent.py @@ -14,7 +14,7 @@ from pydantic import BaseModel, ValidationError from semantic_kernel.agents.open_ai.azure_assistant_agent import AzureAssistantAgent -from semantic_kernel.agents.open_ai.open_ai_assistant_agent import AssistantAgentThread +from semantic_kernel.agents.open_ai.openai_assistant_agent import AssistantAgentThread from semantic_kernel.agents.open_ai.run_polling_options import RunPollingOptions from semantic_kernel.contents.chat_message_content import ChatMessageContent from semantic_kernel.contents.utils.author_role import AuthorRole diff --git a/python/tests/unit/agents/openai_assistant/test_open_ai_assistant_channel.py b/python/tests/unit/agents/openai_assistant/test_open_ai_assistant_channel.py index 64026abf4724..2d7d1ec0ffed 100644 --- a/python/tests/unit/agents/openai_assistant/test_open_ai_assistant_channel.py +++ b/python/tests/unit/agents/openai_assistant/test_open_ai_assistant_channel.py @@ -14,7 +14,7 @@ from openai.types.beta.threads.text_content_block import TextContentBlock from semantic_kernel.agents.chat_completion.chat_completion_agent import ChatCompletionAgent -from semantic_kernel.agents.open_ai.open_ai_assistant_agent import OpenAIAssistantAgent +from semantic_kernel.agents.open_ai.openai_assistant_agent import OpenAIAssistantAgent from semantic_kernel.contents.chat_message_content import ChatMessageContent from semantic_kernel.contents.function_call_content import FunctionCallContent from semantic_kernel.contents.text_content import TextContent diff --git a/python/tests/unit/agents/openai_assistant/test_openai_assistant_agent.py b/python/tests/unit/agents/openai_assistant/test_openai_assistant_agent.py index 3c2dfe0c3737..e670ff42961e 100644 --- a/python/tests/unit/agents/openai_assistant/test_openai_assistant_agent.py +++ b/python/tests/unit/agents/openai_assistant/test_openai_assistant_agent.py @@ -8,7 +8,7 @@ from semantic_kernel.agents import OpenAIAssistantAgent from semantic_kernel.agents.agent import AgentResponseItem -from semantic_kernel.agents.open_ai.open_ai_assistant_agent import AssistantAgentThread +from semantic_kernel.agents.open_ai.openai_assistant_agent import AssistantAgentThread from semantic_kernel.agents.open_ai.run_polling_options import RunPollingOptions from semantic_kernel.contents.chat_history import ChatHistory from semantic_kernel.contents.chat_message_content import ChatMessageContent diff --git a/python/tests/unit/utils/agent_diagnostics/test_agent_decorated.py b/python/tests/unit/utils/agent_diagnostics/test_agent_decorated.py index 36fc5f9ee2b4..a5c1aa82d1a9 100644 --- a/python/tests/unit/utils/agent_diagnostics/test_agent_decorated.py +++ b/python/tests/unit/utils/agent_diagnostics/test_agent_decorated.py @@ -3,7 +3,7 @@ import pytest from semantic_kernel.agents.chat_completion.chat_completion_agent import ChatCompletionAgent -from semantic_kernel.agents.open_ai.open_ai_assistant_agent import OpenAIAssistantAgent +from semantic_kernel.agents.open_ai.openai_assistant_agent import OpenAIAssistantAgent pytestmark = pytest.mark.parametrize( "decorated_method, expected_attribute", diff --git a/python/tests/unit/utils/agent_diagnostics/test_trace_open_ai_assistant_agent.py b/python/tests/unit/utils/agent_diagnostics/test_trace_open_ai_assistant_agent.py index dbcdb261b4c8..d5e1503ade08 100644 --- a/python/tests/unit/utils/agent_diagnostics/test_trace_open_ai_assistant_agent.py +++ b/python/tests/unit/utils/agent_diagnostics/test_trace_open_ai_assistant_agent.py @@ -6,7 +6,7 @@ from openai import AsyncOpenAI from openai.types.beta.assistant import Assistant -from semantic_kernel.agents.open_ai.open_ai_assistant_agent import AssistantAgentThread, OpenAIAssistantAgent +from semantic_kernel.agents.open_ai.openai_assistant_agent import AssistantAgentThread, OpenAIAssistantAgent from semantic_kernel.contents.chat_message_content import ChatMessageContent from semantic_kernel.contents.streaming_chat_message_content import StreamingChatMessageContent from semantic_kernel.contents.utils.author_role import AuthorRole @@ -26,7 +26,7 @@ async def test_open_ai_assistant_agent_invoke(mock_tracer, chat_history, openai_ definition.temperature = 1.0 definition.top_p = 1.0 definition.metadata = {} - open_ai_assistant_agent = OpenAIAssistantAgent(client=client, definition=definition) + openai_assistant_agent = OpenAIAssistantAgent(client=client, definition=definition) thread = AsyncMock(spec=AssistantAgentThread) @@ -38,10 +38,10 @@ async def fake_invoke(*args, **kwargs): "semantic_kernel.agents.open_ai.assistant_thread_actions.AssistantThreadActions.invoke", side_effect=fake_invoke, ): - async for item in open_ai_assistant_agent.invoke(messages="message", thread=thread): + async for item in openai_assistant_agent.invoke(messages="message", thread=thread): pass # Assert - mock_tracer.start_as_current_span.assert_called_once_with(f"invoke_agent {open_ai_assistant_agent.name}") + mock_tracer.start_as_current_span.assert_called_once_with(f"invoke_agent {openai_assistant_agent.name}") @patch("semantic_kernel.utils.telemetry.agent_diagnostics.decorators.tracer") @@ -58,7 +58,7 @@ async def test_open_ai_assistant_agent_invoke_stream(mock_tracer, chat_history, definition.temperature = 1.0 definition.top_p = 1.0 definition.metadata = {} - open_ai_assistant_agent = OpenAIAssistantAgent(client=client, definition=definition) + openai_assistant_agent = OpenAIAssistantAgent(client=client, definition=definition) thread = AsyncMock(spec=AssistantAgentThread) @@ -70,7 +70,7 @@ async def fake_invoke(*args, **kwargs): "semantic_kernel.agents.open_ai.assistant_thread_actions.AssistantThreadActions.invoke_stream", side_effect=fake_invoke, ): - async for item in open_ai_assistant_agent.invoke_stream(messages="message", thread=thread): + async for item in openai_assistant_agent.invoke_stream(messages="message", thread=thread): pass # Assert - mock_tracer.start_as_current_span.assert_called_once_with(f"invoke_agent {open_ai_assistant_agent.name}") + mock_tracer.start_as_current_span.assert_called_once_with(f"invoke_agent {openai_assistant_agent.name}") From 6491f2aa269826d842066474713a9a0144ea4043 Mon Sep 17 00:00:00 2001 From: Evan Mattson Date: Mon, 19 May 2025 18:42:53 +0900 Subject: [PATCH 06/18] wip --- ...penai_assistant_declarative_file_search.py | 10 +-- ...responses_agent_declarative_file_search.py | 27 +++--- ..._responses_agent_declarative_web_search.py | 90 +++++++++++++++++++ .../agents/azure_ai/azure_ai_agent.py | 1 + .../agents/open_ai/openai_assistant_agent.py | 1 + .../agents/open_ai/openai_responses_agent.py | 38 ++++++-- 6 files changed, 142 insertions(+), 25 deletions(-) create mode 100644 python/samples/concepts/agents/openai_responses/openai_responses_agent_declarative_web_search.py diff --git a/python/samples/concepts/agents/openai_assistant/openai_assistant_declarative_file_search.py b/python/samples/concepts/agents/openai_assistant/openai_assistant_declarative_file_search.py index 32f66b3299a6..7462f1819c3c 100644 --- a/python/samples/concepts/agents/openai_assistant/openai_assistant_declarative_file_search.py +++ b/python/samples/concepts/agents/openai_assistant/openai_assistant_declarative_file_search.py @@ -85,13 +85,9 @@ async def main(): Sample output: # User: 'Who can help me if I have a sales question?' - # FileSearchAgent: If you have a sales question, you may contact the following individuals: - - 1. **Hicran Bea** - Sales Manager - 2. **Mariam Jaslyn** - Sales Representative - 3. **Angelino Embla** - Sales Representative - - This information comes from the employee records【4:0†source】. + # FileSearchAgent: If you have a sales question, you can contact either Mariam Jaslyn or Angelino Embla, who + are both listed as Sales Representatives. Alternatively, you may also reach out to Hicran Bea, + the Sales Manager【4:0†employees.pdf】. """ diff --git a/python/samples/concepts/agents/openai_responses/openai_responses_agent_declarative_file_search.py b/python/samples/concepts/agents/openai_responses/openai_responses_agent_declarative_file_search.py index b5196e4e3341..dd9cff581f2b 100644 --- a/python/samples/concepts/agents/openai_responses/openai_responses_agent_declarative_file_search.py +++ b/python/samples/concepts/agents/openai_responses/openai_responses_agent_declarative_file_search.py @@ -20,14 +20,14 @@ name: FileSearchAgent description: Agent with code interpreter tool. instructions: > - Use the code interpreter tool to answer questions that require code to be generated - and executed. + Find answers to the user's questions in the provided file. model: id: ${OpenAI:ChatModelId} connection: api_key: ${OpenAI:ApiKey} tools: - type: file_search + description: File search for document retrieval. options: vector_store_ids: - ${OpenAI:VectorStoreId} @@ -66,18 +66,23 @@ async def main(): ) # Define the task for the agent - TASK = "Who can help me if I have a sales question?" + USER_INPUTS = ["Who can help me if I have a sales question?", "Who works in sales?"] - print(f"# User: '{TASK}'") + thread = None - # Invoke the agent for the specified task - async for response in agent.invoke( - messages=TASK, - ): - print(f"# {response.name}: {response}") + for user_input in USER_INPUTS: + # Print the user input + print(f"# User: '{user_input}'") + + # Invoke the agent for the specified task + async for response in agent.invoke( + messages=user_input, + thread=thread, + ): + print(f"# {response.name}: {response}") + thread = response.thread finally: - # Cleanup: Delete the agent, vector store, and file - await client.beta.assistants.delete(agent.id) + # Cleanup: Delete the vector store, and file await client.vector_stores.delete(vector_store.id) await client.files.delete(file.id) diff --git a/python/samples/concepts/agents/openai_responses/openai_responses_agent_declarative_web_search.py b/python/samples/concepts/agents/openai_responses/openai_responses_agent_declarative_web_search.py new file mode 100644 index 000000000000..8df3ae7c1ec8 --- /dev/null +++ b/python/samples/concepts/agents/openai_responses/openai_responses_agent_declarative_web_search.py @@ -0,0 +1,90 @@ +# Copyright (c) Microsoft. All rights reserved. + +import asyncio + +from semantic_kernel.agents import OpenAIResponsesAgent +from semantic_kernel.agents.agent import AgentRegistry + +""" +The following sample demonstrates how to create an Azure AI agent that answers +user questions using the file search tool. + +The agent is used to answer user questions that require file search to help ground +answers from the model. +""" + +# Define the YAML string for the sample +spec = """ +type: openai_responses_agent +name: WebSearchAgent +description: Agent with web search tool. +instructions: > + Find answers to the user's questions using the provided tool. +model: + id: ${OpenAI:ChatModelId} + connection: + api_key: ${OpenAI:ApiKey} +tools: + - type: web_search + description: Search the internet for recent information. + options: + search_context_size: high +""" + + +async def main(): + # Setup the OpenAI Assistant client + client, _ = OpenAIResponsesAgent.setup_resources() + + try: + # Create the AzureAI Agent from the YAML spec + # Note: the extras can be provided in the short-format (shown below) or + # in the long-format (as shown in the YAML spec, with the `AzureAI:` prefix). + # The short-format is used here for brevity + agent: OpenAIResponsesAgent = await AgentRegistry.create_from_yaml( + yaml_str=spec, + client=client, + ) + + # Define the task for the agent + USER_INPUTS = ["Who won the 2025 NCAA basketball championship?"] + + thread = None + + for user_input in USER_INPUTS: + # Print the user input + print(f"# User: '{user_input}'") + + # Invoke the agent for the specified task + async for response in agent.invoke( + messages=user_input, + thread=thread, + ): + print(f"# {response.name}: {response}") + thread = response.thread + finally: + await thread.delete() if thread else None + + """ + Sample output: + + # User: 'Who won the 2025 NCAA basketball championship?' + # WebSearchAgent: The Florida Gators won the 2025 NCAA men's basketball championship, defeating the Houston + Cougars 65-63 on April 7, 2025, at the Alamodome in San Antonio, Texas. This victory marked Florida's + third national title and their first since 2007. ([reuters.com](https://www.reuters.com/sports/basketball/florida-beat-houston-claim-third-ncaa-mens-basketball-title-2025-04-08/?utm_source=openai)) + + In the championship game, Florida overcame a 12-point deficit in the second half. Senior guard Walter Clayton + Jr. was instrumental in the comeback, scoring all 11 of his points in the second half and delivering a + crucial defensive stop in the final seconds to secure the win. Will Richard led the Gators with 18 points. ([apnews.com](https://apnews.com/article/74a9c790277595ce53ca130c5ec64429?utm_source=openai)) + + Head coach Todd Golden, in his third season, became the youngest coach to win the NCAA title since 1983. ([reuters.com](https://www.reuters.com/sports/basketball/florida-beat-houston-claim-third-ncaa-mens-basketball-title-2025-04-08/?utm_source=openai)) + + ## Florida Gators' 2025 NCAA Championship Victory: + - [Florida overcome Houston in massive comeback to claim third NCAA title](https://www.reuters.com/sports/basketball/florida-beat-houston-claim-third-ncaa-mens-basketball-title-2025-04-08/?utm_source=openai) + - [Walter Clayton Jr.'s defensive stop gives Florida its 3rd national title with 65-63 win over Houston](https://apnews.com/article/74a9c790277595ce53ca130c5ec64429?utm_source=openai) + - [Reports: National champion Florida sets White House visit](https://www.reuters.com/sports/reports-national-champion-florida-sets-white-house-visit-2025-05-18/?utm_source=openai) + """ + + +if __name__ == "__main__": + asyncio.run(main()) diff --git a/python/semantic_kernel/agents/azure_ai/azure_ai_agent.py b/python/semantic_kernel/agents/azure_ai/azure_ai_agent.py index 67fcbecd4b18..33c178c14c5a 100644 --- a/python/semantic_kernel/agents/azure_ai/azure_ai_agent.py +++ b/python/semantic_kernel/agents/azure_ai/azure_ai_agent.py @@ -483,6 +483,7 @@ async def _from_dict( kwargs.pop("settings") args = data.pop("arguments", None) + arguments = None if args: arguments = KernelArguments(**args) diff --git a/python/semantic_kernel/agents/open_ai/openai_assistant_agent.py b/python/semantic_kernel/agents/open_ai/openai_assistant_agent.py index 6447a0cf64f1..d9fd8e8a0a3e 100644 --- a/python/semantic_kernel/agents/open_ai/openai_assistant_agent.py +++ b/python/semantic_kernel/agents/open_ai/openai_assistant_agent.py @@ -426,6 +426,7 @@ async def _from_dict( kwargs.pop("settings") args = data.pop("arguments", None) + arguments = None if args: arguments = KernelArguments(**args) diff --git a/python/semantic_kernel/agents/open_ai/openai_responses_agent.py b/python/semantic_kernel/agents/open_ai/openai_responses_agent.py index 782c6973796f..a4a733594a7e 100644 --- a/python/semantic_kernel/agents/open_ai/openai_responses_agent.py +++ b/python/semantic_kernel/agents/open_ai/openai_responses_agent.py @@ -22,7 +22,7 @@ from pydantic import BaseModel, Field, SecretStr, ValidationError from semantic_kernel.agents import Agent, AgentResponseItem, AgentThread, RunPollingOptions -from semantic_kernel.agents.agent import AgentSpec, ToolSpec, register_agent_type +from semantic_kernel.agents.agent import AgentSpec, DeclarativeSpecMixin, ToolSpec, register_agent_type from semantic_kernel.agents.open_ai.responses_agent_thread_actions import ResponsesAgentThreadActions from semantic_kernel.connectors.ai.function_calling_utils import kernel_function_metadata_to_function_call_format from semantic_kernel.connectors.ai.function_choice_behavior import FunctionChoiceBehavior @@ -40,6 +40,7 @@ from semantic_kernel.functions import KernelArguments from semantic_kernel.functions.kernel_function import TEMPLATE_FORMAT_MAP from semantic_kernel.functions.kernel_plugin import KernelPlugin +from semantic_kernel.kernel import Kernel from semantic_kernel.schema.kernel_json_schema_builder import KernelJsonSchemaBuilder from semantic_kernel.utils.feature_stage_decorator import experimental from semantic_kernel.utils.naming import generate_random_ascii_name @@ -57,7 +58,6 @@ if TYPE_CHECKING: from openai import AsyncOpenAI - from semantic_kernel.kernel import Kernel from semantic_kernel.kernel_pydantic import KernelBaseSettings from semantic_kernel.prompt_template.prompt_template_config import PromptTemplateConfig @@ -82,15 +82,35 @@ def decorator(fn: Callable[[ToolSpec, Kernel | None], ToolParam]): @_register_tool("file_search") def _file_search(spec: ToolSpec, kernel: Kernel | None = None) -> FileSearchToolParam: - vector_store_ids = spec.options.get("vector_store_ids") + options = spec.options or {} + vector_store_ids = options.get("vector_store_ids") if not vector_store_ids or not isinstance(vector_store_ids, list) or not vector_store_ids[0]: raise AgentInitializationException(f"Missing or malformed 'vector_store_ids' in: {spec}") - return OpenAIResponsesAgent.configure_file_search_tool(vector_store_ids=vector_store_ids) + + filters = options.get("filters") + max_num_results = options.get("max_num_results") + ranking_options = options.get("ranking_options", {}) + score_threshold = ranking_options.get("score_threshold") + ranker = ranking_options.get("ranker") + + return OpenAIResponsesAgent.configure_file_search_tool( + vector_store_ids=vector_store_ids, + filters=filters, + max_num_results=max_num_results, + score_threshold=score_threshold, + ranker=ranker, + ) @_register_tool("web_search") def _web_search(spec: ToolSpec, kernel: Kernel | None = None) -> WebSearchToolParam: - return OpenAIResponsesAgent.configure_web_search_tool() + options = spec.options or {} + context_size = options.get("search_context_size") + user_location = options.get("user_location") + return OpenAIResponsesAgent.configure_web_search_tool( + context_size=context_size, + user_location=user_location, + ) @_register_tool("function") @@ -248,7 +268,7 @@ async def reduce(self) -> ChatHistory | None: @experimental @register_agent_type("openai_responses_agent") -class OpenAIResponsesAgent(Agent): +class OpenAIResponsesAgent(DeclarativeSpecMixin, Agent): """OpenAI Responses Agent class. Provides the ability to interact with OpenAI's Responses API. @@ -468,16 +488,20 @@ async def _from_dict( kwargs.pop("settings") args = data.pop("arguments", None) + arguments = None if args: arguments = KernelArguments(**args) if not (spec.model and spec.model.id): - raise AgentInitializationException("model.id required when creating a new Azure AI agent") + raise AgentInitializationException("model.id required when creating a new OpenAI Responses Agent.") # Build tool definitions & resources tool_objs = [_build_tool(t, kernel) for t in spec.tools if t.type != "function"] return cls( + name=spec.name, + description=spec.description, + instruction_role=spec.instructions, ai_model_id=spec.model.id, client=client, arguments=arguments, From e9fbfc45a63a3e06f60522b78fc8b2c6d86ad6c0 Mon Sep 17 00:00:00 2001 From: Evan Mattson Date: Wed, 21 May 2025 19:48:37 +0900 Subject: [PATCH 07/18] Updates for declarative spec --- .../mixed_chat/mixed_chat_agents_plugins.py | 8 +- .../agents/mixed_chat/mixed_chat_files.py | 6 +- .../agents/mixed_chat/mixed_chat_images.py | 6 +- .../agents/mixed_chat/mixed_chat_reset.py | 6 +- .../agents/mixed_chat/mixed_chat_streaming.py | 6 +- .../agents/openai_assistant/README.md | 6 +- ..._assistant_declarative_code_interpreter.py | 14 +- ...penai_assistant_declarative_file_search.py | 12 +- ..._declarative_function_calling_from_file.py | 6 +- ...openai_assistant_declarative_templating.py | 8 +- ...tant_declarative_with_existing_agent_id.py | 4 +- ...i_assistant_auto_func_invocation_filter.py | 5 +- ...t_auto_func_invocation_filter_streaming.py | 5 +- .../openai_assistant_chart_maker.py | 5 +- .../openai_assistant_chart_maker_streaming.py | 5 +- ..._assistant_declarative_code_interpreter.py | 4 +- ...penai_assistant_declarative_file_search.py | 4 +- ..._declarative_function_calling_from_file.py | 4 +- ...openai_assistant_declarative_templating.py | 4 +- ...tant_declarative_with_existing_agent_id.py | 2 +- .../openai_assistant_file_manipulation.py | 5 +- ...i_assistant_file_manipulation_streaming.py | 10 +- .../openai_assistant_message_callback.py | 5 +- ...ai_assistant_message_callback_streaming.py | 5 +- .../openai_assistant_retrieval.py | 5 +- .../openai_assistant_streaming.py | 5 +- .../openai_assistant_structured_outputs.py | 7 +- .../openai_assistant_templating_streaming.py | 5 +- .../openai_assistant_vision_streaming.py | 5 +- ...responses_agent_declarative_file_search.py | 8 +- ..._declarative_function_calling_from_file.py | 2 +- ..._responses_agent_declarative_templating.py | 2 +- ...responses_agent_declarative_file_search.py | 2 +- ..._declarative_function_calling_from_file.py | 2 +- ..._responses_agent_declarative_templating.py | 2 +- ..._responses_agent_declarative_web_search.py | 2 +- .../responses_agent_file_search_streaming.py | 5 +- .../responses_agent_message_callback.py | 5 +- ...ponses_agent_message_callback_streaming.py | 5 +- .../responses_agent_plugins_streaming.py | 5 +- ...esponses_agent_reuse_existing_thread_id.py | 10 +- .../responses_agent_web_search_streaming.py | 5 +- .../openai_assistant/README.md | 2 +- .../openai_assistant/step1_assistant.py | 5 +- .../step2_assistant_plugins.py | 5 +- .../step3_assistant_vision.py | 5 +- .../step4_assistant_tool_code_interpreter.py | 5 +- .../step5_assistant_tool_file_search.py | 5 +- .../step6_assistant_openai_declarative.py | 2 +- ...tep7_assistant_azure_openai_declarative.py | 2 +- .../step8_responses_agent_declarative.py | 97 +++++++++++++ .../agent_docs/assistant_code.py | 5 +- .../agent_docs/assistant_search.py | 5 +- .../agents/open_ai/azure_assistant_agent.py | 110 ++++++++++++++- .../agents/open_ai/azure_responses_agent.py | 96 +++++++++++++ .../agents/open_ai/openai_assistant_agent.py | 130 +++++++++++------- .../agents/open_ai/openai_responses_agent.py | 99 +++++++++---- ...test_openai_assistant_agent_integration.py | 7 +- ...test_openai_responses_agent_integration.py | 7 +- .../data/prompt_simple_expected.json | 2 +- .../data/prompt_with_chat_roles_expected.json | 2 +- .../prompt_with_complex_objects_expected.json | 2 +- ...prompt_with_helper_functions_expected.json | 2 +- .../prompt_with_simple_variable_expected.json | 2 +- .../cross_language/test_cross_language.py | 5 +- python/uv.lock | 92 ++++++++++--- 66 files changed, 687 insertions(+), 234 deletions(-) create mode 100644 python/samples/getting_started_with_agents/openai_responses/step8_responses_agent_declarative.py diff --git a/python/samples/concepts/agents/mixed_chat/mixed_chat_agents_plugins.py b/python/samples/concepts/agents/mixed_chat/mixed_chat_agents_plugins.py index ac556546064f..a557f377695a 100644 --- a/python/samples/concepts/agents/mixed_chat/mixed_chat_agents_plugins.py +++ b/python/samples/concepts/agents/mixed_chat/mixed_chat_agents_plugins.py @@ -4,9 +4,9 @@ from typing import Annotated from semantic_kernel.agents import AgentGroupChat, AzureAssistantAgent, ChatCompletionAgent -from semantic_kernel.agents.strategies.termination.termination_strategy import TerminationStrategy +from semantic_kernel.agents.strategies import TerminationStrategy from semantic_kernel.connectors.ai import FunctionChoiceBehavior -from semantic_kernel.connectors.ai.open_ai import AzureChatCompletion +from semantic_kernel.connectors.ai.open_ai import AzureChatCompletion, AzureOpenAISettings from semantic_kernel.contents import AuthorRole from semantic_kernel.functions import KernelArguments, kernel_function from semantic_kernel.kernel import Kernel @@ -86,11 +86,11 @@ async def main(): ) # Create the Assistant Agent using Azure OpenAI resources - client, model = AzureAssistantAgent.setup_resources() + client = AzureAssistantAgent.create_client() # Create the assistant definition definition = await client.beta.assistants.create( - model=model, + model=AzureOpenAISettings().chat_deployment_name, name=COPYWRITER_NAME, instructions=COPYWRITER_INSTRUCTIONS, ) diff --git a/python/samples/concepts/agents/mixed_chat/mixed_chat_files.py b/python/samples/concepts/agents/mixed_chat/mixed_chat_files.py index f8fd58c4c0f6..87d5bd7426ac 100644 --- a/python/samples/concepts/agents/mixed_chat/mixed_chat_files.py +++ b/python/samples/concepts/agents/mixed_chat/mixed_chat_files.py @@ -4,7 +4,7 @@ import os from semantic_kernel.agents import AgentGroupChat, AzureAssistantAgent, ChatCompletionAgent -from semantic_kernel.connectors.ai.open_ai import AzureChatCompletion +from semantic_kernel.connectors.ai.open_ai import AzureChatCompletion, AzureOpenAISettings from semantic_kernel.contents import AnnotationContent, AuthorRole from semantic_kernel.kernel import Kernel @@ -31,7 +31,7 @@ async def main(): ) # Create the client using Azure OpenAI resources and configuration - client, model = AzureAssistantAgent.setup_resources() + client = AzureAssistantAgent.create_client() # If desired, create using OpenAI resources # client, model = OpenAIAssistantAgent.setup_resources() @@ -45,7 +45,7 @@ async def main(): ) definition = await client.beta.assistants.create( - model=model, + model=AzureOpenAISettings().chat_deployment_name, instructions="Create charts as requested without explanation.", name="ChartMaker", tools=code_interpreter_tool, diff --git a/python/samples/concepts/agents/mixed_chat/mixed_chat_images.py b/python/samples/concepts/agents/mixed_chat/mixed_chat_images.py index 9fcac8d33cbc..85f2c177f698 100644 --- a/python/samples/concepts/agents/mixed_chat/mixed_chat_images.py +++ b/python/samples/concepts/agents/mixed_chat/mixed_chat_images.py @@ -3,7 +3,7 @@ import asyncio from semantic_kernel.agents import AgentGroupChat, AzureAssistantAgent, ChatCompletionAgent -from semantic_kernel.connectors.ai.open_ai import AzureChatCompletion +from semantic_kernel.connectors.ai.open_ai import AzureChatCompletion, AzureOpenAISettings from semantic_kernel.contents import AnnotationContent from semantic_kernel.contents.utils.author_role import AuthorRole from semantic_kernel.kernel import Kernel @@ -24,14 +24,14 @@ def _create_kernel_with_chat_completion(service_id: str) -> Kernel: async def main(): # Create the client using Azure OpenAI resources and configuration - client, model = AzureAssistantAgent.setup_resources() + client = AzureAssistantAgent.create_client() # Get the code interpreter tool and resources code_interpreter_tool, code_interpreter_resources = AzureAssistantAgent.configure_code_interpreter_tool() # Create the assistant definition definition = await client.beta.assistants.create( - model=model, + model=AzureOpenAISettings().chat_deployment_name, name="Analyst", instructions="Create charts as requested without explanation", tools=code_interpreter_tool, diff --git a/python/samples/concepts/agents/mixed_chat/mixed_chat_reset.py b/python/samples/concepts/agents/mixed_chat/mixed_chat_reset.py index e1c2443d43b1..7cb4d6039c4c 100644 --- a/python/samples/concepts/agents/mixed_chat/mixed_chat_reset.py +++ b/python/samples/concepts/agents/mixed_chat/mixed_chat_reset.py @@ -4,7 +4,7 @@ from typing import TYPE_CHECKING from semantic_kernel.agents import AgentGroupChat, AzureAssistantAgent, ChatCompletionAgent -from semantic_kernel.connectors.ai.open_ai import AzureChatCompletion +from semantic_kernel.connectors.ai.open_ai import AzureChatCompletion, AzureOpenAISettings from semantic_kernel.contents import AuthorRole from semantic_kernel.kernel import Kernel @@ -41,11 +41,11 @@ async def main(): # Next, we will create the AzureAssistantAgent # Create the client using Azure OpenAI resources and configuration - client, model = AzureAssistantAgent.setup_resources() + client = AzureAssistantAgent.create_client() # Create the assistant definition definition = await client.beta.assistants.create( - model=model, + model=AzureOpenAISettings().chat_deployment_name, name="copywriter", instructions=""" The user may either provide information or query on information previously provided. diff --git a/python/samples/concepts/agents/mixed_chat/mixed_chat_streaming.py b/python/samples/concepts/agents/mixed_chat/mixed_chat_streaming.py index 1f90b08ee885..cc7b2681c556 100644 --- a/python/samples/concepts/agents/mixed_chat/mixed_chat_streaming.py +++ b/python/samples/concepts/agents/mixed_chat/mixed_chat_streaming.py @@ -4,7 +4,7 @@ from semantic_kernel.agents import AgentGroupChat, AzureAssistantAgent, ChatCompletionAgent from semantic_kernel.agents.strategies import TerminationStrategy -from semantic_kernel.connectors.ai.open_ai import AzureChatCompletion +from semantic_kernel.connectors.ai.open_ai import AzureChatCompletion, AzureOpenAISettings from semantic_kernel.contents import AuthorRole from semantic_kernel.kernel import Kernel @@ -46,11 +46,11 @@ async def main(): # Next, we will create the AzureAssistantAgent # Create the client using Azure OpenAI resources and configuration - client, model = AzureAssistantAgent.setup_resources() + client = AzureAssistantAgent.create_client() # Create the assistant definition definition = await client.beta.assistants.create( - model=model, + model=AzureOpenAISettings().chat_deployment_name, name="CopyWriter", instructions=""" You are a copywriter with ten years of experience and are known for brevity and a dry humor. diff --git a/python/samples/concepts/agents/openai_assistant/README.md b/python/samples/concepts/agents/openai_assistant/README.md index 4bd3d24e3d9a..37790bfa7733 100644 --- a/python/samples/concepts/agents/openai_assistant/README.md +++ b/python/samples/concepts/agents/openai_assistant/README.md @@ -36,7 +36,7 @@ client, model = OpenAIAssistantAgent.setup_resources() # Create the assistant definition definition = await client.beta.assistants.create( - model=model, + model=AzureOpenAISettings().chat_deployment_name instructions="", name="", ) @@ -73,11 +73,11 @@ Alternatively, you can pass the `api_version` parameter when creating an `AzureA from semantic_kernel.agents import AzureAssistantAgent # Create the client using Azure OpenAI resources and configuration -client, model = AzureAssistantAgent.setup_resources() +client = AzureAssistantAgent.create_client() # Create the assistant definition definition = await client.beta.assistants.create( - model=model, + model=AzureOpenAISettings().chat_deployment_name instructions="", name="", ) diff --git a/python/samples/concepts/agents/openai_assistant/azure_openai_assistant_declarative_code_interpreter.py b/python/samples/concepts/agents/openai_assistant/azure_openai_assistant_declarative_code_interpreter.py index 8206f5b006aa..807fd085b54e 100644 --- a/python/samples/concepts/agents/openai_assistant/azure_openai_assistant_declarative_code_interpreter.py +++ b/python/samples/concepts/agents/openai_assistant/azure_openai_assistant_declarative_code_interpreter.py @@ -6,7 +6,7 @@ from semantic_kernel.agents import AgentRegistry, AzureAssistantAgent """ -The following sample demonstrates how to create an Azure AI agent that answers +The following sample demonstrates how to create an Azure Assistant Agent that answers user questions using the code interpreter tool. The agent is then used to answer user questions that require code to be generated and @@ -15,26 +15,26 @@ # Define the YAML string for the sample spec = """ -type: openai_assistant +type: azure_openai_assistant name: CodeInterpreterAgent description: Agent with code interpreter tool. instructions: > Use the code interpreter tool to answer questions that require code to be generated and executed. model: - id: ${OpenAI:ChatModelId} + id: ${AzureOpenAI:ChatModelId} connection: - api_key: ${OpenAI:ApiKey} + api_key: ${AzureOpenAI:ApiKey} tools: - type: code_interpreter options: file_ids: - - ${OpenAI:FileId1} + - ${AzureOpenAI:FileId1} """ async def main(): - client, _ = AzureAssistantAgent.setup_resources() + client = AzureAssistantAgent.create_client() csv_file_path = os.path.join( os.path.dirname(os.path.dirname(os.path.dirname(os.path.realpath(__file__)))), @@ -55,7 +55,7 @@ async def main(): agent: AzureAssistantAgent = await AgentRegistry.create_from_yaml( yaml_str=spec, client=client, - extras={"OpenAI:FileId1": file.id}, + extras={"AzureOpenAI:FileId1": file.id}, ) # Define the task for the agent diff --git a/python/samples/concepts/agents/openai_assistant/azure_openai_assistant_declarative_file_search.py b/python/samples/concepts/agents/openai_assistant/azure_openai_assistant_declarative_file_search.py index 793034e921ab..31c04f5840ab 100644 --- a/python/samples/concepts/agents/openai_assistant/azure_openai_assistant_declarative_file_search.py +++ b/python/samples/concepts/agents/openai_assistant/azure_openai_assistant_declarative_file_search.py @@ -7,7 +7,7 @@ from semantic_kernel.agents.agent import AgentRegistry """ -The following sample demonstrates how to create an Azure AI agent that answers +The following sample demonstrates how to create an Azure Assistant Agent that answers user questions using the file search tool. The agent is used to answer user questions that require file search to help ground @@ -16,27 +16,27 @@ # Define the YAML string for the sample spec = """ -type: openai_assistant +type: azure_openai_assistant name: FileSearchAgent description: Agent with code interpreter tool. instructions: > Use the code interpreter tool to answer questions that require code to be generated and executed. model: - id: ${OpenAI:ChatModelId} + id: ${AzureOpenAI:ChatModelId} connection: - api_key: ${OpenAI:ApiKey} + api_key: ${AzureOpenAI:ApiKey} tools: - type: file_search options: vector_store_ids: - - ${OpenAI:VectorStoreId} + - ${AzureOpenAI:VectorStoreId} """ async def main(): # Setup the OpenAI Assistant client - client, _ = AzureAssistantAgent.setup_resources() + client = AzureAssistantAgent.create_client() # Read and upload the file to the OpenAI AI service pdf_file_path = os.path.join( diff --git a/python/samples/concepts/agents/openai_assistant/azure_openai_assistant_declarative_function_calling_from_file.py b/python/samples/concepts/agents/openai_assistant/azure_openai_assistant_declarative_function_calling_from_file.py index cfe09a28339b..609e1a258137 100644 --- a/python/samples/concepts/agents/openai_assistant/azure_openai_assistant_declarative_function_calling_from_file.py +++ b/python/samples/concepts/agents/openai_assistant/azure_openai_assistant_declarative_function_calling_from_file.py @@ -5,10 +5,10 @@ from typing import Annotated from semantic_kernel.agents import AgentRegistry, AzureAssistantAgent -from semantic_kernel.functions.kernel_function_decorator import kernel_function +from semantic_kernel.functions import kernel_function """ -The following sample demonstrates how to create an Azure AI agent that answers +The following sample demonstrates how to create an Azure Assistant Agent that answers user questions. The sample shows how to load a declarative spec from a file. The plugins/functions must already exist in the kernel. They are not created declaratively via the spec. @@ -35,7 +35,7 @@ def get_item_price( async def main(): try: - client, _ = AzureAssistantAgent.setup_resources() + client = AzureAssistantAgent.create_client() # Define the YAML file path for the sample file_path = os.path.join( diff --git a/python/samples/concepts/agents/openai_assistant/azure_openai_assistant_declarative_templating.py b/python/samples/concepts/agents/openai_assistant/azure_openai_assistant_declarative_templating.py index 5d4e66ff9f07..4fa9423ed84b 100644 --- a/python/samples/concepts/agents/openai_assistant/azure_openai_assistant_declarative_templating.py +++ b/python/samples/concepts/agents/openai_assistant/azure_openai_assistant_declarative_templating.py @@ -2,11 +2,11 @@ import asyncio -from semantic_kernel.agents import OpenAIAssistantAgent +from semantic_kernel.agents import AzureAssistantAgent from semantic_kernel.agents.agent import AgentRegistry """ -The following sample demonstrates how to create an Azure AI agent that answers +The following sample demonstrates how to create an Azure Assistant Agent that answers user questions using the file search tool. The agent is used to answer user questions that require file search to help ground @@ -42,14 +42,14 @@ async def main(): # Setup the OpenAI Assistant client - client, _ = OpenAIAssistantAgent.setup_resources() + client = AzureAssistantAgent.create_client() try: # Create the AzureAI Agent from the YAML spec # Note: the extras can be provided in the short-format (shown below) or # in the long-format (as shown in the YAML spec, with the `AzureAI:` prefix). # The short-format is used here for brevity - agent: OpenAIAssistantAgent = await AgentRegistry.create_from_yaml( + agent: AzureAssistantAgent = await AgentRegistry.create_from_yaml( yaml_str=spec, client=client, ) diff --git a/python/samples/concepts/agents/openai_assistant/azure_openai_assistant_declarative_with_existing_agent_id.py b/python/samples/concepts/agents/openai_assistant/azure_openai_assistant_declarative_with_existing_agent_id.py index 8a3eec7e7bb9..ae2f25a74ab2 100644 --- a/python/samples/concepts/agents/openai_assistant/azure_openai_assistant_declarative_with_existing_agent_id.py +++ b/python/samples/concepts/agents/openai_assistant/azure_openai_assistant_declarative_with_existing_agent_id.py @@ -5,7 +5,7 @@ from semantic_kernel.agents import AgentRegistry, AzureAssistantAgent """ -The following sample demonstrates how to create an Azure AI agent based +The following sample demonstrates how to create an Azure Assistant Agent based on an existing agent ID. """ @@ -19,7 +19,7 @@ async def main(): try: - client, _ = AzureAssistantAgent.setup_resources() + client = AzureAssistantAgent.create_client() # Create the AzureAI Agent from the YAML spec # Note: the extras can be provided in the short-format (shown below) or # in the long-format (as shown in the YAML spec, with the `AzureAI:` prefix). diff --git a/python/samples/concepts/agents/openai_assistant/openai_assistant_auto_func_invocation_filter.py b/python/samples/concepts/agents/openai_assistant/openai_assistant_auto_func_invocation_filter.py index f94fadb470e7..468ecdebe105 100644 --- a/python/samples/concepts/agents/openai_assistant/openai_assistant_auto_func_invocation_filter.py +++ b/python/samples/concepts/agents/openai_assistant/openai_assistant_auto_func_invocation_filter.py @@ -4,6 +4,7 @@ from typing import Annotated from semantic_kernel.agents import AzureAssistantAgent +from semantic_kernel.connectors.ai.open_ai import AzureOpenAISettings from semantic_kernel.contents import ChatMessageContent, FunctionCallContent, FunctionResultContent from semantic_kernel.filters import ( AutoFunctionInvocationContext, @@ -93,11 +94,11 @@ async def auto_function_invocation_filter(context: AutoFunctionInvocationContext async def main() -> None: # 1. Create the client using Azure OpenAI resources and configuration - client, model = AzureAssistantAgent.setup_resources() + client = AzureAssistantAgent.create_client() # 2. Define the assistant definition definition = await client.beta.assistants.create( - model=model, + model=AzureOpenAISettings().chat_deployment_name, name="Host", instructions="Answer questions about the menu.", ) diff --git a/python/samples/concepts/agents/openai_assistant/openai_assistant_auto_func_invocation_filter_streaming.py b/python/samples/concepts/agents/openai_assistant/openai_assistant_auto_func_invocation_filter_streaming.py index a5ec2c074cdf..536b7916eea7 100644 --- a/python/samples/concepts/agents/openai_assistant/openai_assistant_auto_func_invocation_filter_streaming.py +++ b/python/samples/concepts/agents/openai_assistant/openai_assistant_auto_func_invocation_filter_streaming.py @@ -4,6 +4,7 @@ from typing import Annotated from semantic_kernel.agents import AzureAssistantAgent +from semantic_kernel.connectors.ai.open_ai import AzureOpenAISettings from semantic_kernel.contents import ChatMessageContent, FunctionCallContent, FunctionResultContent from semantic_kernel.filters import ( AutoFunctionInvocationContext, @@ -93,11 +94,11 @@ async def auto_function_invocation_filter(context: AutoFunctionInvocationContext async def main() -> None: # 1. Create the client using Azure OpenAI resources and configuration - client, model = AzureAssistantAgent.setup_resources() + client = AzureAssistantAgent.create_client() # 2. Define the assistant definition definition = await client.beta.assistants.create( - model=model, + model=AzureOpenAISettings().chat_deployment_name, name="Host", instructions="Answer questions about the menu.", ) diff --git a/python/samples/concepts/agents/openai_assistant/openai_assistant_chart_maker.py b/python/samples/concepts/agents/openai_assistant/openai_assistant_chart_maker.py index 4dc6046edcaa..a1dbda2ecf25 100644 --- a/python/samples/concepts/agents/openai_assistant/openai_assistant_chart_maker.py +++ b/python/samples/concepts/agents/openai_assistant/openai_assistant_chart_maker.py @@ -3,6 +3,7 @@ from samples.concepts.agents.openai_assistant.openai_assistant_sample_utils import download_response_images from semantic_kernel.agents import AssistantAgentThread, AzureAssistantAgent +from semantic_kernel.connectors.ai.open_ai import AzureOpenAISettings from semantic_kernel.contents import FileReferenceContent """ @@ -15,14 +16,14 @@ async def main(): # Create the client using Azure OpenAI resources and configuration - client, model = AzureAssistantAgent.setup_resources() + client = AzureAssistantAgent.create_client() # Get the code interpreter tool and resources code_interpreter_tool, code_interpreter_resource = AzureAssistantAgent.configure_code_interpreter_tool() # Define the assistant definition definition = await client.beta.assistants.create( - model=model, + model=AzureOpenAISettings().chat_deployment_name, instructions="Create charts as requested without explanation.", name="ChartMaker", tools=code_interpreter_tool, diff --git a/python/samples/concepts/agents/openai_assistant/openai_assistant_chart_maker_streaming.py b/python/samples/concepts/agents/openai_assistant/openai_assistant_chart_maker_streaming.py index 0b6ad5384ac4..a7a57169134a 100644 --- a/python/samples/concepts/agents/openai_assistant/openai_assistant_chart_maker_streaming.py +++ b/python/samples/concepts/agents/openai_assistant/openai_assistant_chart_maker_streaming.py @@ -3,6 +3,7 @@ from samples.concepts.agents.openai_assistant.openai_assistant_sample_utils import download_response_images from semantic_kernel.agents import AssistantAgentThread, AzureAssistantAgent +from semantic_kernel.connectors.ai.open_ai import AzureOpenAISettings from semantic_kernel.contents import StreamingFileReferenceContent """ @@ -15,14 +16,14 @@ async def main(): # Create the client using Azure OpenAI resources and configuration - client, model = AzureAssistantAgent.setup_resources() + client = AzureAssistantAgent.create_client() # Get the code interpreter tool and resources code_interpreter_tool, code_interpreter_resource = AzureAssistantAgent.configure_code_interpreter_tool() # Define the assistant definition definition = await client.beta.assistants.create( - model=model, + model=AzureOpenAISettings().chat_deployment_name, instructions="Create charts as requested without explanation.", name="ChartMaker", tools=code_interpreter_tool, diff --git a/python/samples/concepts/agents/openai_assistant/openai_assistant_declarative_code_interpreter.py b/python/samples/concepts/agents/openai_assistant/openai_assistant_declarative_code_interpreter.py index 82b505f48c7a..a89fc9c69679 100644 --- a/python/samples/concepts/agents/openai_assistant/openai_assistant_declarative_code_interpreter.py +++ b/python/samples/concepts/agents/openai_assistant/openai_assistant_declarative_code_interpreter.py @@ -6,7 +6,7 @@ from semantic_kernel.agents import AgentRegistry, OpenAIAssistantAgent """ -The following sample demonstrates how to create an Azure AI agent that answers +The following sample demonstrates how to create an OpenAI Assistant Agent that answers user questions using the code interpreter tool. The agent is then used to answer user questions that require code to be generated and @@ -34,7 +34,7 @@ async def main(): - client, _ = OpenAIAssistantAgent.setup_resources() + client = OpenAIAssistantAgent.create_client() csv_file_path = os.path.join( os.path.dirname(os.path.dirname(os.path.dirname(os.path.realpath(__file__)))), diff --git a/python/samples/concepts/agents/openai_assistant/openai_assistant_declarative_file_search.py b/python/samples/concepts/agents/openai_assistant/openai_assistant_declarative_file_search.py index 7462f1819c3c..e06ae7ea63a4 100644 --- a/python/samples/concepts/agents/openai_assistant/openai_assistant_declarative_file_search.py +++ b/python/samples/concepts/agents/openai_assistant/openai_assistant_declarative_file_search.py @@ -7,7 +7,7 @@ from semantic_kernel.agents.agent import AgentRegistry """ -The following sample demonstrates how to create an Azure AI agent that answers +The following sample demonstrates how to create an OpenAI Assistant Agent that answers user questions using the file search tool. The agent is used to answer user questions that require file search to help ground @@ -36,7 +36,7 @@ async def main(): # Setup the OpenAI Assistant client - client, _ = OpenAIAssistantAgent.setup_resources() + client = OpenAIAssistantAgent.create_client() # Read and upload the file to the OpenAI AI service pdf_file_path = os.path.join( diff --git a/python/samples/concepts/agents/openai_assistant/openai_assistant_declarative_function_calling_from_file.py b/python/samples/concepts/agents/openai_assistant/openai_assistant_declarative_function_calling_from_file.py index 1fe6b4d10185..2a9dad7d1a8f 100644 --- a/python/samples/concepts/agents/openai_assistant/openai_assistant_declarative_function_calling_from_file.py +++ b/python/samples/concepts/agents/openai_assistant/openai_assistant_declarative_function_calling_from_file.py @@ -8,7 +8,7 @@ from semantic_kernel.functions.kernel_function_decorator import kernel_function """ -The following sample demonstrates how to create an Azure AI agent that answers +The following sample demonstrates how to create an OpenAI Assistant Agent that answers user questions. The sample shows how to load a declarative spec from a file. The plugins/functions must already exist in the kernel. They are not created declaratively via the spec. @@ -35,7 +35,7 @@ def get_item_price( async def main(): try: - client, _ = OpenAIAssistantAgent.setup_resources() + client = OpenAIAssistantAgent.create_client() # Define the YAML file path for the sample file_path = os.path.join( diff --git a/python/samples/concepts/agents/openai_assistant/openai_assistant_declarative_templating.py b/python/samples/concepts/agents/openai_assistant/openai_assistant_declarative_templating.py index 1973f735bfd0..e514d5771aa2 100644 --- a/python/samples/concepts/agents/openai_assistant/openai_assistant_declarative_templating.py +++ b/python/samples/concepts/agents/openai_assistant/openai_assistant_declarative_templating.py @@ -6,7 +6,7 @@ from semantic_kernel.agents.agent import AgentRegistry """ -The following sample demonstrates how to create an Azure AI agent that answers +The following sample demonstrates how to create an OpenAI Assistant Agent that answers user questions using the file search tool. The agent is used to answer user questions that require file search to help ground @@ -40,7 +40,7 @@ async def main(): # Setup the OpenAI Assistant client - client, _ = OpenAIAssistantAgent.setup_resources() + client = OpenAIAssistantAgent.create_client() try: # Create the AzureAI Agent from the YAML spec diff --git a/python/samples/concepts/agents/openai_assistant/openai_assistant_declarative_with_existing_agent_id.py b/python/samples/concepts/agents/openai_assistant/openai_assistant_declarative_with_existing_agent_id.py index 1167e5f2ab16..974127a1020c 100644 --- a/python/samples/concepts/agents/openai_assistant/openai_assistant_declarative_with_existing_agent_id.py +++ b/python/samples/concepts/agents/openai_assistant/openai_assistant_declarative_with_existing_agent_id.py @@ -8,7 +8,7 @@ from semantic_kernel.agents.agent import AgentRegistry """ -The following sample demonstrates how to create an Azure AI agent based +The following sample demonstrates how to create an OpenAI Assistant Agent based on an existing agent ID. """ diff --git a/python/samples/concepts/agents/openai_assistant/openai_assistant_file_manipulation.py b/python/samples/concepts/agents/openai_assistant/openai_assistant_file_manipulation.py index fd3f54a918d4..e32bdf25d988 100644 --- a/python/samples/concepts/agents/openai_assistant/openai_assistant_file_manipulation.py +++ b/python/samples/concepts/agents/openai_assistant/openai_assistant_file_manipulation.py @@ -4,6 +4,7 @@ from samples.concepts.agents.openai_assistant.openai_assistant_sample_utils import download_response_files from semantic_kernel.agents import AssistantAgentThread, AzureAssistantAgent +from semantic_kernel.connectors.ai.open_ai import AzureOpenAISettings from semantic_kernel.contents import AnnotationContent """ @@ -16,7 +17,7 @@ async def main(): # Create the client using Azure OpenAI resources and configuration - client, model = AzureAssistantAgent.setup_resources() + client = AzureAssistantAgent.create_client() csv_file_path = os.path.join( os.path.dirname(os.path.dirname(os.path.dirname(os.path.realpath(__file__)))), @@ -34,7 +35,7 @@ async def main(): # Create the assistant definition definition = await client.beta.assistants.create( - model=model, + model=AzureOpenAISettings().chat_deployment_name, name="FileManipulation", instructions="Find answers to the user's questions in the provided file.", tools=code_interpreter_tool, diff --git a/python/samples/concepts/agents/openai_assistant/openai_assistant_file_manipulation_streaming.py b/python/samples/concepts/agents/openai_assistant/openai_assistant_file_manipulation_streaming.py index d7b5b7f959b5..e84cb535452e 100644 --- a/python/samples/concepts/agents/openai_assistant/openai_assistant_file_manipulation_streaming.py +++ b/python/samples/concepts/agents/openai_assistant/openai_assistant_file_manipulation_streaming.py @@ -4,19 +4,19 @@ from samples.concepts.agents.openai_assistant.openai_assistant_sample_utils import download_response_files from semantic_kernel.agents import AssistantAgentThread, AzureAssistantAgent +from semantic_kernel.connectors.ai.open_ai import AzureOpenAISettings from semantic_kernel.contents import ChatMessageContent, StreamingAnnotationContent """ -The following sample demonstrates how to create an OpenAI -assistant using either Azure OpenAI or OpenAI and leverage the -assistant's ability to have the code interpreter work with +The following sample demonstrates how to create an Azure Assistant Agent +to leverage the assistant's ability to have the code interpreter work with uploaded files. This sample uses streaming responses. """ async def main(): # Create the client using Azure OpenAI resources and configuration - client, model = AzureAssistantAgent.setup_resources() + client = AzureAssistantAgent.create_client() csv_file_path = os.path.join( os.path.dirname(os.path.dirname(os.path.dirname(os.path.realpath(__file__)))), @@ -36,7 +36,7 @@ async def main(): # Create the assistant definition definition = await client.beta.assistants.create( - model=model, + model=AzureOpenAISettings().chat_deployment_name, name="FileManipulation", instructions="Find answers to the user's questions in the provided file.", tools=code_interpreter_tools, diff --git a/python/samples/concepts/agents/openai_assistant/openai_assistant_message_callback.py b/python/samples/concepts/agents/openai_assistant/openai_assistant_message_callback.py index 6685ae38a828..bead39166158 100644 --- a/python/samples/concepts/agents/openai_assistant/openai_assistant_message_callback.py +++ b/python/samples/concepts/agents/openai_assistant/openai_assistant_message_callback.py @@ -3,6 +3,7 @@ from typing import Annotated from semantic_kernel.agents import AssistantAgentThread, AzureAssistantAgent +from semantic_kernel.connectors.ai.open_ai import AzureOpenAISettings from semantic_kernel.contents import AuthorRole, FunctionCallContent, FunctionResultContent from semantic_kernel.contents.chat_message_content import ChatMessageContent from semantic_kernel.functions import kernel_function @@ -54,11 +55,11 @@ async def handle_intermediate_steps(message: ChatMessageContent) -> None: async def main(): # Create the client using Azure OpenAI resources and configuration - client, model = AzureAssistantAgent.setup_resources() + client = AzureAssistantAgent.create_client() # Define the assistant definition definition = await client.beta.assistants.create( - model=model, + model=AzureOpenAISettings().chat_deployment_name, name="Host", instructions="Answer questions about the menu.", ) diff --git a/python/samples/concepts/agents/openai_assistant/openai_assistant_message_callback_streaming.py b/python/samples/concepts/agents/openai_assistant/openai_assistant_message_callback_streaming.py index 5aa2d4d36031..71d606049c05 100644 --- a/python/samples/concepts/agents/openai_assistant/openai_assistant_message_callback_streaming.py +++ b/python/samples/concepts/agents/openai_assistant/openai_assistant_message_callback_streaming.py @@ -3,6 +3,7 @@ from typing import Annotated from semantic_kernel.agents import AssistantAgentThread, AzureAssistantAgent +from semantic_kernel.connectors.ai.open_ai import AzureOpenAISettings from semantic_kernel.contents import AuthorRole, FunctionCallContent, FunctionResultContent from semantic_kernel.contents.chat_message_content import ChatMessageContent from semantic_kernel.functions import kernel_function @@ -54,11 +55,11 @@ async def handle_streaming_intermediate_steps(message: ChatMessageContent) -> No async def main(): # Create the client using Azure OpenAI resources and configuration - client, model = AzureAssistantAgent.setup_resources() + client = AzureAssistantAgent.create_client() # Define the assistant definition definition = await client.beta.assistants.create( - model=model, + model=AzureOpenAISettings().chat_deployment_name, name="Host", instructions="Answer questions about the menu.", ) diff --git a/python/samples/concepts/agents/openai_assistant/openai_assistant_retrieval.py b/python/samples/concepts/agents/openai_assistant/openai_assistant_retrieval.py index f9aefce33212..ae18a2425bfd 100644 --- a/python/samples/concepts/agents/openai_assistant/openai_assistant_retrieval.py +++ b/python/samples/concepts/agents/openai_assistant/openai_assistant_retrieval.py @@ -2,6 +2,7 @@ import asyncio from semantic_kernel.agents import AssistantAgentThread, AzureAssistantAgent +from semantic_kernel.connectors.ai.open_ai import AzureOpenAISettings """ The following sample demonstrates how to create an OpenAI @@ -14,11 +15,11 @@ async def main(): # Create the client using Azure OpenAI resources and configuration - client, model = AzureAssistantAgent.setup_resources() + client = AzureAssistantAgent.create_client() # Create the assistant definition definition = await client.beta.assistants.create( - model=model, + model=AzureOpenAISettings().chat_deployment_name, name="Assistant", instructions="You are a helpful assistant answering questions about the world in one sentence.", ) diff --git a/python/samples/concepts/agents/openai_assistant/openai_assistant_streaming.py b/python/samples/concepts/agents/openai_assistant/openai_assistant_streaming.py index a2a3424a9a3d..ba55207af9a3 100644 --- a/python/samples/concepts/agents/openai_assistant/openai_assistant_streaming.py +++ b/python/samples/concepts/agents/openai_assistant/openai_assistant_streaming.py @@ -3,6 +3,7 @@ from typing import Annotated from semantic_kernel.agents import AssistantAgentThread, AzureAssistantAgent +from semantic_kernel.connectors.ai.open_ai import AzureOpenAISettings from semantic_kernel.contents import AuthorRole from semantic_kernel.functions import kernel_function @@ -38,11 +39,11 @@ def get_item_price( async def main(): # Create the client using Azure OpenAI resources and configuration - client, model = AzureAssistantAgent.setup_resources() + client = AzureAssistantAgent.create_client() # Define the assistant definition definition = await client.beta.assistants.create( - model=model, + model=AzureOpenAISettings().chat_deployment_name, name="Host", instructions="Answer questions about the menu.", ) diff --git a/python/samples/concepts/agents/openai_assistant/openai_assistant_structured_outputs.py b/python/samples/concepts/agents/openai_assistant/openai_assistant_structured_outputs.py index e17a1f7f1266..636203b212c8 100644 --- a/python/samples/concepts/agents/openai_assistant/openai_assistant_structured_outputs.py +++ b/python/samples/concepts/agents/openai_assistant/openai_assistant_structured_outputs.py @@ -4,6 +4,7 @@ from pydantic import BaseModel from semantic_kernel.agents import AssistantAgentThread, AzureAssistantAgent +from semantic_kernel.connectors.ai.open_ai import AzureOpenAISettings """ The following sample demonstrates how to create an OpenAI @@ -36,7 +37,7 @@ # Create the assistant definition definition = await client.beta.assistants.create( - model=model, + model=AzureOpenAISettings().chat_deployment_name name="Assistant", instructions="You are a helpful assistant answering questions about the world in one sentence.", response_format=json_schema, @@ -52,11 +53,11 @@ class ResponseModel(BaseModel): async def main(): # Create the client using Azure OpenAI resources and configuration - client, model = AzureAssistantAgent.setup_resources() + client = AzureAssistantAgent.create_client() # Create the assistant definition definition = await client.beta.assistants.create( - model=model, + model=AzureOpenAISettings().chat_deployment_name, name="Assistant", instructions="You are a helpful assistant answering questions about the world in one sentence.", response_format=AzureAssistantAgent.configure_response_format(ResponseModel), diff --git a/python/samples/concepts/agents/openai_assistant/openai_assistant_templating_streaming.py b/python/samples/concepts/agents/openai_assistant/openai_assistant_templating_streaming.py index c7401db4c945..4dd9c917f762 100644 --- a/python/samples/concepts/agents/openai_assistant/openai_assistant_templating_streaming.py +++ b/python/samples/concepts/agents/openai_assistant/openai_assistant_templating_streaming.py @@ -3,6 +3,7 @@ import asyncio from semantic_kernel.agents import AssistantAgentThread, AzureAssistantAgent +from semantic_kernel.connectors.ai.open_ai import AzureOpenAISettings from semantic_kernel.functions import KernelArguments from semantic_kernel.prompt_template import PromptTemplateConfig from semantic_kernel.prompt_template.const import TEMPLATE_FORMAT_TYPES @@ -30,14 +31,14 @@ async def invoke_agent_with_template( template_str: str, template_format: TEMPLATE_FORMAT_TYPES, default_style: str = "haiku" ): # Create the client using Azure OpenAI resources and configuration - client, model = AzureAssistantAgent.setup_resources() + client = AzureAssistantAgent.create_client() # Configure the prompt template prompt_template_config = PromptTemplateConfig(template=template_str, template_format=template_format) # Create the assistant definition definition = await client.beta.assistants.create( - model=model, + model=AzureOpenAISettings().chat_deployment_name, name="MyPoetAgent", ) diff --git a/python/samples/concepts/agents/openai_assistant/openai_assistant_vision_streaming.py b/python/samples/concepts/agents/openai_assistant/openai_assistant_vision_streaming.py index 316a1285cfb9..76fcdebf4a90 100644 --- a/python/samples/concepts/agents/openai_assistant/openai_assistant_vision_streaming.py +++ b/python/samples/concepts/agents/openai_assistant/openai_assistant_vision_streaming.py @@ -4,6 +4,7 @@ import os from semantic_kernel.agents import AssistantAgentThread, AzureAssistantAgent +from semantic_kernel.connectors.ai.open_ai import AzureOpenAISettings from semantic_kernel.contents import AuthorRole, ChatMessageContent, FileReferenceContent, ImageContent, TextContent """ @@ -16,7 +17,7 @@ async def main(): # Create the client using Azure OpenAI resources and configuration - client, model = AzureAssistantAgent.setup_resources() + client = AzureAssistantAgent.create_client() file_path = os.path.join( os.path.dirname(os.path.dirname(os.path.dirname(os.path.realpath(__file__)))), "resources", "cat.jpg" @@ -27,7 +28,7 @@ async def main(): # Create the assistant definition definition = await client.beta.assistants.create( - model=model, + model=AzureOpenAISettings().chat_deployment_name, instructions="Answer questions about the menu.", name="Host", ) diff --git a/python/samples/concepts/agents/openai_responses/azure_openai_responses_agent_declarative_file_search.py b/python/samples/concepts/agents/openai_responses/azure_openai_responses_agent_declarative_file_search.py index cdadede0713c..17403c35d81a 100644 --- a/python/samples/concepts/agents/openai_responses/azure_openai_responses_agent_declarative_file_search.py +++ b/python/samples/concepts/agents/openai_responses/azure_openai_responses_agent_declarative_file_search.py @@ -23,20 +23,20 @@ Use the code interpreter tool to answer questions that require code to be generated and executed. model: - id: ${OpenAI:ChatModelId} + id: ${AzureOpenAI:ChatModelId} connection: - api_key: ${OpenAI:ApiKey} + endpoint: ${AzureOpenAI:Endpoint} tools: - type: file_search options: vector_store_ids: - - ${OpenAI:VectorStoreId} + - ${AzureOpenAI:VectorStoreId} """ async def main(): # Setup the OpenAI Assistant client - client, _ = AzureAssistantAgent.setup_resources() + client = AzureAssistantAgent.create_client() # Read and upload the file to the OpenAI AI service pdf_file_path = os.path.join( diff --git a/python/samples/concepts/agents/openai_responses/azure_openai_responses_agent_declarative_function_calling_from_file.py b/python/samples/concepts/agents/openai_responses/azure_openai_responses_agent_declarative_function_calling_from_file.py index 3177bfc77a31..abf09bda840e 100644 --- a/python/samples/concepts/agents/openai_responses/azure_openai_responses_agent_declarative_function_calling_from_file.py +++ b/python/samples/concepts/agents/openai_responses/azure_openai_responses_agent_declarative_function_calling_from_file.py @@ -35,7 +35,7 @@ def get_item_price( async def main(): try: - client, _ = AzureResponsesAgent.setup_resources() + client = AzureResponsesAgent.create_client() # Define the YAML file path for the sample file_path = os.path.join( diff --git a/python/samples/concepts/agents/openai_responses/azure_openai_responses_agent_declarative_templating.py b/python/samples/concepts/agents/openai_responses/azure_openai_responses_agent_declarative_templating.py index 0c6f50b1ad9d..c2b27bbbca3e 100644 --- a/python/samples/concepts/agents/openai_responses/azure_openai_responses_agent_declarative_templating.py +++ b/python/samples/concepts/agents/openai_responses/azure_openai_responses_agent_declarative_templating.py @@ -42,7 +42,7 @@ async def main(): # Setup the OpenAI Assistant client - client, _ = AzureResponsesAgent.setup_resources() + client = AzureResponsesAgent.create_client() try: # Create the AzureAI Agent from the YAML spec diff --git a/python/samples/concepts/agents/openai_responses/openai_responses_agent_declarative_file_search.py b/python/samples/concepts/agents/openai_responses/openai_responses_agent_declarative_file_search.py index dd9cff581f2b..8188462ac468 100644 --- a/python/samples/concepts/agents/openai_responses/openai_responses_agent_declarative_file_search.py +++ b/python/samples/concepts/agents/openai_responses/openai_responses_agent_declarative_file_search.py @@ -36,7 +36,7 @@ async def main(): # Setup the OpenAI Assistant client - client, _ = OpenAIResponsesAgent.setup_resources() + client = OpenAIResponsesAgent.create_client() # Read and upload the file to the OpenAI AI service pdf_file_path = os.path.join( diff --git a/python/samples/concepts/agents/openai_responses/openai_responses_agent_declarative_function_calling_from_file.py b/python/samples/concepts/agents/openai_responses/openai_responses_agent_declarative_function_calling_from_file.py index d4af62103c0f..e33b21a8fb3e 100644 --- a/python/samples/concepts/agents/openai_responses/openai_responses_agent_declarative_function_calling_from_file.py +++ b/python/samples/concepts/agents/openai_responses/openai_responses_agent_declarative_function_calling_from_file.py @@ -35,7 +35,7 @@ def get_item_price( async def main(): try: - client, _ = OpenAIResponsesAgent.setup_resources() + client = OpenAIResponsesAgent.create_client() # Define the YAML file path for the sample file_path = os.path.join( diff --git a/python/samples/concepts/agents/openai_responses/openai_responses_agent_declarative_templating.py b/python/samples/concepts/agents/openai_responses/openai_responses_agent_declarative_templating.py index c41d5a3f87cf..cfbd57f67f15 100644 --- a/python/samples/concepts/agents/openai_responses/openai_responses_agent_declarative_templating.py +++ b/python/samples/concepts/agents/openai_responses/openai_responses_agent_declarative_templating.py @@ -40,7 +40,7 @@ async def main(): # Setup the OpenAI Assistant client - client, _ = OpenAIResponsesAgent.setup_resources() + client = OpenAIResponsesAgent.create_client() try: # Create the AzureAI Agent from the YAML spec diff --git a/python/samples/concepts/agents/openai_responses/openai_responses_agent_declarative_web_search.py b/python/samples/concepts/agents/openai_responses/openai_responses_agent_declarative_web_search.py index 8df3ae7c1ec8..db5d4e55ddc4 100644 --- a/python/samples/concepts/agents/openai_responses/openai_responses_agent_declarative_web_search.py +++ b/python/samples/concepts/agents/openai_responses/openai_responses_agent_declarative_web_search.py @@ -34,7 +34,7 @@ async def main(): # Setup the OpenAI Assistant client - client, _ = OpenAIResponsesAgent.setup_resources() + client = OpenAIResponsesAgent.create_client() try: # Create the AzureAI Agent from the YAML spec diff --git a/python/samples/concepts/agents/openai_responses/responses_agent_file_search_streaming.py b/python/samples/concepts/agents/openai_responses/responses_agent_file_search_streaming.py index 6180b1f39f93..01fed34bc0a3 100644 --- a/python/samples/concepts/agents/openai_responses/responses_agent_file_search_streaming.py +++ b/python/samples/concepts/agents/openai_responses/responses_agent_file_search_streaming.py @@ -3,6 +3,7 @@ import os from semantic_kernel.agents import OpenAIResponsesAgent +from semantic_kernel.connectors.ai.open_ai import OpenAISettings from semantic_kernel.contents.streaming_chat_message_content import StreamingChatMessageContent """ @@ -28,7 +29,7 @@ async def main(): # 1. Create the client using OpenAI resources and configuration - client, model = OpenAIResponsesAgent.setup_resources() + client = OpenAIResponsesAgent.create_client() pdf_file_path = os.path.join( os.path.dirname(os.path.dirname(os.path.realpath(__file__))), "resources", "employees.pdf" @@ -46,7 +47,7 @@ async def main(): # 2. Create a Semantic Kernel agent for the OpenAI Responses API agent = OpenAIResponsesAgent( - ai_model_id=model, + ai_model_id=OpenAISettings().chat_model_id, client=client, instructions="Find answers to the user's questions in the provided file.", name="FileSearch", diff --git a/python/samples/concepts/agents/openai_responses/responses_agent_message_callback.py b/python/samples/concepts/agents/openai_responses/responses_agent_message_callback.py index a33c9ba626f4..832fdc3a7bf1 100644 --- a/python/samples/concepts/agents/openai_responses/responses_agent_message_callback.py +++ b/python/samples/concepts/agents/openai_responses/responses_agent_message_callback.py @@ -3,6 +3,7 @@ from typing import Annotated from semantic_kernel.agents import AzureResponsesAgent +from semantic_kernel.connectors.ai.open_ai import AzureOpenAISettings from semantic_kernel.contents import AuthorRole, FunctionCallContent, FunctionResultContent from semantic_kernel.contents.chat_message_content import ChatMessageContent from semantic_kernel.functions import kernel_function @@ -53,11 +54,11 @@ async def handle_intermediate_steps(message: ChatMessageContent) -> None: async def main(): # 1. Create the client using Azure OpenAI resources and configuration - client, model = AzureResponsesAgent.setup_resources() + client = AzureResponsesAgent.create_client() # 2. Create a Semantic Kernel agent for the OpenAI Responses API agent = AzureResponsesAgent( - ai_model_id=model, + ai_model_id=AzureOpenAISettings().chat_deployment_name, client=client, name="Host", instructions="Answer questions about the menu.", diff --git a/python/samples/concepts/agents/openai_responses/responses_agent_message_callback_streaming.py b/python/samples/concepts/agents/openai_responses/responses_agent_message_callback_streaming.py index 37b8e77d839d..67872b8454c1 100644 --- a/python/samples/concepts/agents/openai_responses/responses_agent_message_callback_streaming.py +++ b/python/samples/concepts/agents/openai_responses/responses_agent_message_callback_streaming.py @@ -3,6 +3,7 @@ from typing import Annotated from semantic_kernel.agents import OpenAIResponsesAgent +from semantic_kernel.connectors.ai.open_ai import OpenAISettings from semantic_kernel.contents import AuthorRole, FunctionCallContent, FunctionResultContent from semantic_kernel.contents.chat_message_content import ChatMessageContent from semantic_kernel.functions import kernel_function @@ -55,11 +56,11 @@ async def handle_streaming_intermediate_steps(message: ChatMessageContent) -> No async def main(): # 1. Create the client using Azure OpenAI resources and configuration - client, model = OpenAIResponsesAgent.setup_resources() + client = OpenAIResponsesAgent.create_client() # 2. Create a Semantic Kernel agent for the OpenAI Responses API agent = OpenAIResponsesAgent( - ai_model_id=model, + ai_model_id=OpenAISettings().chat_model_id, client=client, name="Host", instructions="Answer questions about the menu.", diff --git a/python/samples/concepts/agents/openai_responses/responses_agent_plugins_streaming.py b/python/samples/concepts/agents/openai_responses/responses_agent_plugins_streaming.py index bac6087fb8e9..b005e7bd129d 100644 --- a/python/samples/concepts/agents/openai_responses/responses_agent_plugins_streaming.py +++ b/python/samples/concepts/agents/openai_responses/responses_agent_plugins_streaming.py @@ -3,6 +3,7 @@ from typing import Annotated from semantic_kernel.agents import AzureResponsesAgent +from semantic_kernel.connectors.ai.open_ai import AzureOpenAISettings from semantic_kernel.functions import kernel_function """ @@ -49,11 +50,11 @@ def get_item_price( async def main(): # 1. Create the client using OpenAI resources and configuration - client, model = AzureResponsesAgent.setup_resources() + client = AzureResponsesAgent.create_client() # 2. Create a Semantic Kernel agent for the OpenAI Responses API agent = AzureResponsesAgent( - ai_model_id=model, + ai_model_id=AzureOpenAISettings().chat_deployment_name, client=client, instructions="Answer questions about the menu.", name="Host", diff --git a/python/samples/concepts/agents/openai_responses/responses_agent_reuse_existing_thread_id.py b/python/samples/concepts/agents/openai_responses/responses_agent_reuse_existing_thread_id.py index b86174c964db..6aa7f55042ce 100644 --- a/python/samples/concepts/agents/openai_responses/responses_agent_reuse_existing_thread_id.py +++ b/python/samples/concepts/agents/openai_responses/responses_agent_reuse_existing_thread_id.py @@ -1,8 +1,8 @@ # Copyright (c) Microsoft. All rights reserved. import asyncio -from semantic_kernel.agents import AzureResponsesAgent -from semantic_kernel.agents.open_ai.openai_responses_agent import ResponsesAgentThread +from semantic_kernel.agents import AzureResponsesAgent, ResponsesAgentThread +from semantic_kernel.connectors.ai.open_ai import AzureOpenAISettings """ The following sample demonstrates how to create an OpenAI Responses Agent. @@ -24,13 +24,11 @@ async def main(): # 1. Create the client using Azure OpenAI resources and configuration - client, model = AzureResponsesAgent.setup_resources() - - print(f"Using model: {model}") + client = AzureResponsesAgent.create_client() # 2. Create a Semantic Kernel agent for the OpenAI Responses API agent = AzureResponsesAgent( - ai_model_id=model, + ai_model_id=AzureOpenAISettings().chat_deployment_name, client=client, instructions="Answer questions about from the user.", name="Joker", diff --git a/python/samples/concepts/agents/openai_responses/responses_agent_web_search_streaming.py b/python/samples/concepts/agents/openai_responses/responses_agent_web_search_streaming.py index d2d7f6e3d4f7..a6e0a73af19d 100644 --- a/python/samples/concepts/agents/openai_responses/responses_agent_web_search_streaming.py +++ b/python/samples/concepts/agents/openai_responses/responses_agent_web_search_streaming.py @@ -2,6 +2,7 @@ import asyncio from semantic_kernel.agents import OpenAIResponsesAgent +from semantic_kernel.connectors.ai.open_ai import OpenAISettings """ The following sample demonstrates how to create an OpenAI Responses Agent. @@ -24,13 +25,13 @@ async def main(): # 1. Create the client using OpenAI resources and configuration - client, model = OpenAIResponsesAgent.setup_resources() + client = OpenAIResponsesAgent.create_client() web_search_tool = OpenAIResponsesAgent.configure_web_search_tool() # 2. Create a Semantic Kernel agent for the OpenAI Responses API agent = OpenAIResponsesAgent( - ai_model_id=model, + ai_model_id=OpenAISettings().chat_model_id, client=client, instructions="Answer questions from the user.", name="Host", diff --git a/python/samples/getting_started_with_agents/openai_assistant/README.md b/python/samples/getting_started_with_agents/openai_assistant/README.md index 0a056c38b143..6736ef483849 100644 --- a/python/samples/getting_started_with_agents/openai_assistant/README.md +++ b/python/samples/getting_started_with_agents/openai_assistant/README.md @@ -78,7 +78,7 @@ Alternatively, you can pass the `api_version` parameter when creating an `AzureA from semantic_kernel.agents import AzureAssistantAgent # Create the client using Azure OpenAI resources and configuration -client, model = AzureAssistantAgent.setup_resources() +client = AzureAssistantAgent.create_client() # Create the assistant definition definition = await client.beta.assistants.create( diff --git a/python/samples/getting_started_with_agents/openai_assistant/step1_assistant.py b/python/samples/getting_started_with_agents/openai_assistant/step1_assistant.py index 925b1169ed0f..b0094bba162e 100644 --- a/python/samples/getting_started_with_agents/openai_assistant/step1_assistant.py +++ b/python/samples/getting_started_with_agents/openai_assistant/step1_assistant.py @@ -2,6 +2,7 @@ import asyncio from semantic_kernel.agents import AssistantAgentThread, AzureAssistantAgent +from semantic_kernel.connectors.ai.open_ai import AzureOpenAISettings """ The following sample demonstrates how to create an OpenAI assistant using either @@ -25,11 +26,11 @@ async def main(): # 1. Create the client using Azure OpenAI resources and configuration - client, model = AzureAssistantAgent.setup_resources() + client = AzureAssistantAgent.create_client() # 2. Create the assistant on the Azure OpenAI service definition = await client.beta.assistants.create( - model=model, + model=AzureOpenAISettings().chat_deployment_name, instructions="Answer questions about the world in one sentence.", name="Assistant", ) diff --git a/python/samples/getting_started_with_agents/openai_assistant/step2_assistant_plugins.py b/python/samples/getting_started_with_agents/openai_assistant/step2_assistant_plugins.py index d0f23ddddc36..ecbc09b2e77e 100644 --- a/python/samples/getting_started_with_agents/openai_assistant/step2_assistant_plugins.py +++ b/python/samples/getting_started_with_agents/openai_assistant/step2_assistant_plugins.py @@ -3,6 +3,7 @@ from typing import Annotated from semantic_kernel.agents import AssistantAgentThread, AzureAssistantAgent +from semantic_kernel.connectors.ai.open_ai import AzureOpenAISettings from semantic_kernel.functions import kernel_function """ @@ -44,11 +45,11 @@ def get_item_price( async def main(): # 1. Create the client using Azure OpenAI resources and configuration - client, model = AzureAssistantAgent.setup_resources() + client = AzureAssistantAgent.create_client() # 2. Create the assistant on the Azure OpenAI service definition = await client.beta.assistants.create( - model=model, + model=AzureOpenAISettings().chat_deployment_name, instructions="Answer questions about the menu.", name="Host", ) diff --git a/python/samples/getting_started_with_agents/openai_assistant/step3_assistant_vision.py b/python/samples/getting_started_with_agents/openai_assistant/step3_assistant_vision.py index add47ff6a6d7..049482e02b44 100644 --- a/python/samples/getting_started_with_agents/openai_assistant/step3_assistant_vision.py +++ b/python/samples/getting_started_with_agents/openai_assistant/step3_assistant_vision.py @@ -4,6 +4,7 @@ import os from semantic_kernel.agents import AssistantAgentThread, OpenAIAssistantAgent +from semantic_kernel.connectors.ai.open_ai import OpenAISettings from semantic_kernel.contents import AuthorRole, ChatMessageContent, FileReferenceContent, ImageContent, TextContent """ @@ -17,7 +18,7 @@ async def main(): # 1. Create the OpenAI Assistant Agent client # Note Azure OpenAI doesn't support vision files yet - client, model = OpenAIAssistantAgent.setup_resources() + client = OpenAIAssistantAgent.create_client() # 2. Load a sample image of a cat used for the assistant to describe file_path = os.path.join(os.path.dirname(os.path.dirname(os.path.realpath(__file__))), "resources", "cat.jpg") @@ -27,7 +28,7 @@ async def main(): # 3. Create the assistant on the OpenAI service definition = await client.beta.assistants.create( - model=model, + model=OpenAISettings().chat_model_id, instructions="Answer questions about the provided images.", name="Vision", ) diff --git a/python/samples/getting_started_with_agents/openai_assistant/step4_assistant_tool_code_interpreter.py b/python/samples/getting_started_with_agents/openai_assistant/step4_assistant_tool_code_interpreter.py index cef9e673e663..fc1d55c5d751 100644 --- a/python/samples/getting_started_with_agents/openai_assistant/step4_assistant_tool_code_interpreter.py +++ b/python/samples/getting_started_with_agents/openai_assistant/step4_assistant_tool_code_interpreter.py @@ -2,6 +2,7 @@ import asyncio from semantic_kernel.agents import AssistantAgentThread, AzureAssistantAgent +from semantic_kernel.connectors.ai.open_ai import AzureOpenAISettings """ The following sample demonstrates how to create an OpenAI @@ -15,14 +16,14 @@ async def main(): # 1. Create the client using Azure OpenAI resources and configuration - client, model = AzureAssistantAgent.setup_resources() + client = AzureAssistantAgent.create_client() # 2. Configure the code interpreter tool and resources for the Assistant code_interpreter_tool, code_interpreter_tool_resources = AzureAssistantAgent.configure_code_interpreter_tool() # 3. Create the assistant on the Azure OpenAI service definition = await client.beta.assistants.create( - model=model, + model=AzureOpenAISettings().chat_deployment_name, name="CodeRunner", instructions="Run the provided request as code and return the result.", tools=code_interpreter_tool, diff --git a/python/samples/getting_started_with_agents/openai_assistant/step5_assistant_tool_file_search.py b/python/samples/getting_started_with_agents/openai_assistant/step5_assistant_tool_file_search.py index f62c777ba7b0..2fc5ac0f5981 100644 --- a/python/samples/getting_started_with_agents/openai_assistant/step5_assistant_tool_file_search.py +++ b/python/samples/getting_started_with_agents/openai_assistant/step5_assistant_tool_file_search.py @@ -4,6 +4,7 @@ import os from semantic_kernel.agents import AssistantAgentThread, AzureAssistantAgent +from semantic_kernel.connectors.ai.open_ai import AzureOpenAISettings """ The following sample demonstrates how to create an OpenAI @@ -21,7 +22,7 @@ async def main(): # 1. Create the client using Azure OpenAI resources and configuration - client, model = AzureAssistantAgent.setup_resources() + client = AzureAssistantAgent.create_client() # 2. Read and upload the file to the Azure OpenAI assistant service pdf_file_path = os.path.join( @@ -41,7 +42,7 @@ async def main(): # 4. Create the assistant on the Azure OpenAI service with the file search tool definition = await client.beta.assistants.create( - model=model, + model=AzureOpenAISettings().chat_deployment_name, instructions="Find answers to the user's questions in the provided file.", name="FileSearch", tools=file_search_tool, diff --git a/python/samples/getting_started_with_agents/openai_assistant/step6_assistant_openai_declarative.py b/python/samples/getting_started_with_agents/openai_assistant/step6_assistant_openai_declarative.py index 12d378072515..0d36473e8507 100644 --- a/python/samples/getting_started_with_agents/openai_assistant/step6_assistant_openai_declarative.py +++ b/python/samples/getting_started_with_agents/openai_assistant/step6_assistant_openai_declarative.py @@ -55,7 +55,7 @@ def get_item_price( async def main(): # 1. Create the client using Azure OpenAI resources and configuration - client, _ = OpenAIAssistantAgent.setup_resources() + client = OpenAIAssistantAgent.create_client() # 2. Create the assistant on the Azure OpenAI service agent: OpenAIAssistantAgent = await AgentRegistry.create_from_yaml( diff --git a/python/samples/getting_started_with_agents/openai_assistant/step7_assistant_azure_openai_declarative.py b/python/samples/getting_started_with_agents/openai_assistant/step7_assistant_azure_openai_declarative.py index 221fe1250630..19f44d3dca0b 100644 --- a/python/samples/getting_started_with_agents/openai_assistant/step7_assistant_azure_openai_declarative.py +++ b/python/samples/getting_started_with_agents/openai_assistant/step7_assistant_azure_openai_declarative.py @@ -55,7 +55,7 @@ def get_item_price( async def main(): # 1. Create the client using Azure OpenAI resources and configuration - client, _ = AzureAssistantAgent.setup_resources() + client = AzureAssistantAgent.create_client() # 2. Create the assistant on the Azure OpenAI service agent: AzureAssistantAgent = await AgentRegistry.create_from_yaml( diff --git a/python/samples/getting_started_with_agents/openai_responses/step8_responses_agent_declarative.py b/python/samples/getting_started_with_agents/openai_responses/step8_responses_agent_declarative.py new file mode 100644 index 000000000000..8bc9ee4f9c3e --- /dev/null +++ b/python/samples/getting_started_with_agents/openai_responses/step8_responses_agent_declarative.py @@ -0,0 +1,97 @@ +# Copyright (c) Microsoft. All rights reserved. +import asyncio +from typing import Annotated + +from semantic_kernel.agents import AgentRegistry, OpenAIResponsesAgent +from semantic_kernel.functions import kernel_function + +""" +The following sample demonstrates how to create an OpenAI Assistant agent that answers +questions about a sample menu using a Semantic Kernel Plugin. The agent is created +using a yaml declarative spec. +""" + +# Simulate a conversation with the agent +USER_INPUTS = [ + "Hello", + "What is the special soup?", + "How much does that cost?", + "Thank you", +] + +# Define the YAML string for the sample +SPEC = """ +type: openai_responses_agent +name: Host +instructions: Respond politely to the user's questions. +model: + id: ${OpenAI:ChatModelId} +tools: + - id: MenuPlugin.get_specials + type: function + - id: MenuPlugin.get_item_price + type: function +""" + + +# Define a sample plugin for the sample +class MenuPlugin: + """A sample Menu Plugin used for the concept sample.""" + + @kernel_function(description="Provides a list of specials from the menu.") + def get_specials(self) -> Annotated[str, "Returns the specials from the menu."]: + return """ + Special Soup: Clam Chowder + Special Salad: Cobb Salad + Special Drink: Chai Tea + """ + + @kernel_function(description="Provides the price of the requested menu item.") + def get_item_price( + self, menu_item: Annotated[str, "The name of the menu item."] + ) -> Annotated[str, "Returns the price of the menu item."]: + return "$9.99" + + +async def main(): + # 1. Create the client using Azure OpenAI resources and configuration + client = OpenAIResponsesAgent.create_client() + + # 2. Create the assistant on the Azure OpenAI service + agent: OpenAIResponsesAgent = await AgentRegistry.create_from_yaml( + SPEC, + plugins=[MenuPlugin()], + client=client, + ) + + # 3. Create a thread for the agent + # If no thread is provided, a new thread will be + # created and returned with the initial response + thread = None + + try: + for user_input in USER_INPUTS: + print(f"# User: {user_input}") + # 4. Invoke the agent for the specified thread for response + async for response in agent.invoke( + messages=user_input, + thread=thread, + ): + print(f"# {response.name}: {response}") + thread = response.thread + finally: + # 5. Clean up the resources + await thread.delete() if thread else None + + """ + Sample Output: + + # User: Hello + # Agent: Hello! How can I assist you today? + # User: What is the special soup? + # ... + """ + + +if __name__ == "__main__": + asyncio.run(main()) diff --git a/python/samples/learn_resources/agent_docs/assistant_code.py b/python/samples/learn_resources/agent_docs/assistant_code.py index 86e38f0ad25c..5c55a56b87f3 100644 --- a/python/samples/learn_resources/agent_docs/assistant_code.py +++ b/python/samples/learn_resources/agent_docs/assistant_code.py @@ -5,6 +5,7 @@ import os from semantic_kernel.agents import AssistantAgentThread, AzureAssistantAgent +from semantic_kernel.connectors.ai.open_ai import AzureOpenAISettings from semantic_kernel.contents import StreamingFileReferenceContent logging.basicConfig(level=logging.ERROR) @@ -65,7 +66,7 @@ async def download_response_image(agent: AzureAssistantAgent, file_ids: list[str async def main(): # Create the client using Azure OpenAI resources and configuration - client, model = AzureAssistantAgent.setup_resources() + client = AzureAssistantAgent.create_client() # Upload the files to the client file_ids: list[str] = [] @@ -81,7 +82,7 @@ async def main(): # Create the assistant definition definition = await client.beta.assistants.create( - model=model, + model=AzureOpenAISettings().chat_deployment_name, instructions=""" Analyze the available data to provide an answer to the user's question. Always format response using markdown. diff --git a/python/samples/learn_resources/agent_docs/assistant_search.py b/python/samples/learn_resources/agent_docs/assistant_search.py index ecdac6190b0a..648d3e45dd69 100644 --- a/python/samples/learn_resources/agent_docs/assistant_search.py +++ b/python/samples/learn_resources/agent_docs/assistant_search.py @@ -4,6 +4,7 @@ import os from semantic_kernel.agents import AssistantAgentThread, AzureAssistantAgent +from semantic_kernel.connectors.ai.open_ai import AzureOpenAISettings from semantic_kernel.contents import StreamingAnnotationContent """ @@ -34,7 +35,7 @@ def get_filepath_for_filename(filename: str) -> str: async def main(): # Create the client using Azure OpenAI resources and configuration - client, model = AzureAssistantAgent.setup_resources() + client = AzureAssistantAgent.create_client() # Upload the files to the client file_ids: list[str] = [] @@ -55,7 +56,7 @@ async def main(): # Create the assistant definition definition = await client.beta.assistants.create( - model=model, + model=AzureOpenAISettings().chat_deployment_name, instructions=""" The document store contains the text of fictional stories. Always analyze the document store to provide an answer to the user's question. diff --git a/python/semantic_kernel/agents/open_ai/azure_assistant_agent.py b/python/semantic_kernel/agents/open_ai/azure_assistant_agent.py index e6d3c78b211e..23e2fb4b4a9e 100644 --- a/python/semantic_kernel/agents/open_ai/azure_assistant_agent.py +++ b/python/semantic_kernel/agents/open_ai/azure_assistant_agent.py @@ -30,6 +30,11 @@ else: from typing import Self # type: ignore # pragma: no cover +if sys.version_info >= (3, 13): + from warnings import deprecated +else: + from typing_extensions import deprecated + @release_candidate @register_agent_type("azure_openai_assistant") @@ -37,6 +42,9 @@ class AzureAssistantAgent(OpenAIAssistantAgent): """An Azure Assistant Agent class that extends the OpenAI Assistant Agent class.""" @staticmethod + @deprecated( + "setup_resources is deprecated. Use AzureAssistantAgent.create_client() instead. This method will be removed by 2025-06-15." # noqa: E501 + ) def setup_resources( *, ad_token: str | None = None, @@ -126,6 +134,94 @@ def setup_resources( return client, azure_openai_settings.chat_deployment_name + @staticmethod + def create_client( + *, + ad_token: str | None = None, + ad_token_provider: Callable[[], str | Awaitable[str]] | None = None, + api_key: str | None = None, + api_version: str | None = None, + base_url: str | None = None, + default_headers: dict[str, str] | None = None, + deployment_name: str | None = None, + endpoint: str | None = None, + env_file_path: str | None = None, + env_file_encoding: str | None = None, + token_scope: str | None = None, + **kwargs: Any, + ) -> AsyncAzureOpenAI: + """A method to create the Azure OpenAI client. + + Any arguments provided will override the values in the environment variables/environment file. + + Args: + ad_token: The Microsoft Entra (previously Azure AD) token represented as a string + ad_token_provider: The Microsoft Entra (previously Azure AD) token provider provided as a callback + api_key: The API key + api_version: The API version + base_url: The base URL in the form https://.azure.openai.com/openai/deployments/ + default_headers: The default headers to add to the client + deployment_name: The deployment name + endpoint: The endpoint in the form https://.azure.openai.com + env_file_path: The environment file path + env_file_encoding: The environment file encoding, defaults to utf-8 + token_scope: The token scope + kwargs: Additional keyword arguments + + Returns: + An Azure OpenAI client instance. + """ + try: + azure_openai_settings = AzureOpenAISettings( + api_key=api_key, + base_url=base_url, + endpoint=endpoint, + chat_deployment_name=deployment_name, + api_version=api_version, + env_file_path=env_file_path, + env_file_encoding=env_file_encoding, + token_endpoint=token_scope, + ) + except ValidationError as exc: + raise AgentInitializationException(f"Failed to create Azure OpenAI settings: {exc}") from exc + + if ( + azure_openai_settings.api_key is None + and ad_token_provider is None + and ad_token is None + and azure_openai_settings.token_endpoint + ): + ad_token = get_entra_auth_token(azure_openai_settings.token_endpoint) + + # If we still have no credentials, we can't proceed + if not azure_openai_settings.api_key and not ad_token and not ad_token_provider: + raise AgentInitializationException( + "Please provide either an api_key, ad_token or ad_token_provider for authentication." + ) + + merged_headers = dict(copy(default_headers)) if default_headers else {} + if default_headers: + merged_headers.update(default_headers) + if APP_INFO: + merged_headers.update(APP_INFO) + merged_headers = prepend_semantic_kernel_to_user_agent(merged_headers) + + if not azure_openai_settings.endpoint: + raise AgentInitializationException("Please provide an Azure OpenAI endpoint") + + if not azure_openai_settings.chat_deployment_name: + raise AgentInitializationException("Please provide an Azure OpenAI deployment name") + + return AsyncAzureOpenAI( + azure_endpoint=str(azure_openai_settings.endpoint), + api_version=azure_openai_settings.api_version, + api_key=azure_openai_settings.api_key.get_secret_value() if azure_openai_settings.api_key else None, + azure_ad_token=ad_token, + azure_ad_token_provider=ad_token_provider, + default_headers=merged_headers, + **kwargs, + ) + @override @classmethod def resolve_placeholders( @@ -149,13 +245,13 @@ def resolve_placeholders( raise AgentInitializationException(f"Expected AzureOpenAISettings, got {type(settings).__name__}") field_mapping.update({ - "ChatModelId": getattr(settings, "chat_deployment_name", None), - "AgentId": getattr(settings, "agent_id", None), - "ApiKey": getattr(settings, "api_key", None), - "ApiVersion": getattr(settings, "api_version", None), - "BaseUrl": getattr(settings, "base_url", None), - "Endpoint": getattr(settings, "endpoint", None), - "TokenEndpoint": getattr(settings, "token_endpoint", None), + "ChatModelId": cls._get_setting(getattr(settings, "chat_deployment_name", None)), + "AgentId": cls._get_setting(getattr(settings, "agent_id", None)), + "ApiKey": cls._get_setting(getattr(settings, "api_key", None)), + "ApiVersion": cls._get_setting(getattr(settings, "api_version", None)), + "BaseUrl": cls._get_setting(getattr(settings, "base_url", None)), + "Endpoint": cls._get_setting(getattr(settings, "endpoint", None)), + "TokenEndpoint": cls._get_setting(getattr(settings, "token_endpoint", None)), }) if extras: diff --git a/python/semantic_kernel/agents/open_ai/azure_responses_agent.py b/python/semantic_kernel/agents/open_ai/azure_responses_agent.py index b9f81bfc0fd4..465379a90f4b 100644 --- a/python/semantic_kernel/agents/open_ai/azure_responses_agent.py +++ b/python/semantic_kernel/agents/open_ai/azure_responses_agent.py @@ -34,6 +34,11 @@ else: from typing import Self # type: ignore # pragma: no cover +if sys.version_info >= (3, 13): + from warnings import deprecated +else: + from typing_extensions import deprecated + @experimental @register_agent_type("azure_openai_responses_agent") @@ -44,6 +49,9 @@ class AzureResponsesAgent(OpenAIResponsesAgent): """ @staticmethod + @deprecated( + "setup_resources is deprecated. Use AzureResponsesAgent.create_client() instead. This method will be removed by 2025-06-15." # noqa: E501 + ) def setup_resources( *, ad_token: str | None = None, @@ -133,6 +141,94 @@ def setup_resources( return client, azure_openai_settings.responses_deployment_name + @staticmethod + def create_client( + *, + ad_token: str | None = None, + ad_token_provider: Callable[[], str | Awaitable[str]] | None = None, + api_key: str | None = None, + api_version: str | None = None, + base_url: str | None = None, + default_headers: dict[str, str] | None = None, + deployment_name: str | None = None, + endpoint: str | None = None, + env_file_path: str | None = None, + env_file_encoding: str | None = None, + token_scope: str | None = None, + **kwargs: Any, + ) -> AsyncAzureOpenAI: + """A method to create the Azure OpenAI client. + + Any arguments provided will override the values in the environment variables/environment file. + + Args: + ad_token: The Microsoft Entra (previously Azure AD) token represented as a string + ad_token_provider: The Microsoft Entra (previously Azure AD) token provider provided as a callback + api_key: The API key + api_version: The API version + base_url: The base URL in the form https://.azure.openai.com/openai/deployments/ + default_headers: The default headers to add to the client + deployment_name: The Responses deployment name + endpoint: The endpoint in the form https://.azure.openai.com + env_file_path: The environment file path + env_file_encoding: The environment file encoding, defaults to utf-8 + token_scope: The token scope + kwargs: Additional keyword arguments + + Returns: + An Azure OpenAI client instance. + """ + try: + azure_openai_settings = AzureOpenAISettings( + api_key=api_key, + base_url=base_url, + endpoint=endpoint, + responses_deployment_name=deployment_name, + api_version=api_version, + env_file_path=env_file_path, + env_file_encoding=env_file_encoding, + token_endpoint=token_scope, + ) + except ValidationError as exc: + raise AgentInitializationException(f"Failed to create Azure OpenAI settings: {exc}") from exc + + if ( + azure_openai_settings.api_key is None + and ad_token_provider is None + and ad_token is None + and azure_openai_settings.token_endpoint + ): + ad_token = get_entra_auth_token(azure_openai_settings.token_endpoint) + + # If we still have no credentials, we can't proceed + if not azure_openai_settings.api_key and not ad_token and not ad_token_provider: + raise AgentInitializationException( + "Please provide either an api_key, ad_token or ad_token_provider for authentication." + ) + + merged_headers = dict(copy(default_headers)) if default_headers else {} + if default_headers: + merged_headers.update(default_headers) + if APP_INFO: + merged_headers.update(APP_INFO) + merged_headers = prepend_semantic_kernel_to_user_agent(merged_headers) + + if not azure_openai_settings.endpoint: + raise AgentInitializationException("Please provide an Azure OpenAI endpoint") + + if not azure_openai_settings.responses_deployment_name: + raise AgentInitializationException("Please provide an Azure OpenAI Responses deployment name") + + return AsyncAzureOpenAI( + azure_endpoint=str(azure_openai_settings.endpoint), + api_version=azure_openai_settings.api_version, + api_key=azure_openai_settings.api_key.get_secret_value() if azure_openai_settings.api_key else None, + azure_ad_token=ad_token, + azure_ad_token_provider=ad_token_provider, + default_headers=merged_headers, + **kwargs, + ) + @override @classmethod def resolve_placeholders( diff --git a/python/semantic_kernel/agents/open_ai/openai_assistant_agent.py b/python/semantic_kernel/agents/open_ai/openai_assistant_agent.py index d9fd8e8a0a3e..875fbbee7416 100644 --- a/python/semantic_kernel/agents/open_ai/openai_assistant_agent.py +++ b/python/semantic_kernel/agents/open_ai/openai_assistant_agent.py @@ -34,7 +34,6 @@ from semantic_kernel.agents.channels.open_ai_assistant_channel import OpenAIAssistantChannel from semantic_kernel.agents.open_ai.assistant_thread_actions import AssistantThreadActions from semantic_kernel.agents.open_ai.run_polling_options import RunPollingOptions -from semantic_kernel.connectors.ai.function_calling_utils import kernel_function_metadata_to_function_call_format from semantic_kernel.connectors.ai.open_ai.settings.open_ai_settings import OpenAISettings from semantic_kernel.connectors.utils.structured_output_schema import generate_structured_output_response_format_schema from semantic_kernel.contents.chat_message_content import ChatMessageContent @@ -71,61 +70,50 @@ else: from typing_extensions import override # pragma: no cover +if sys.version_info >= (3, 13): + from warnings import deprecated +else: + from typing_extensions import deprecated + _T = TypeVar("_T", bound="OpenAIAssistantAgent") -ToolParam = dict[str, Any] logger: logging.Logger = logging.getLogger(__name__) # region Declarative Spec -_TOOL_BUILDERS: dict[str, Callable[[ToolSpec, Kernel | None], ToolResources]] = {} +_TOOL_BUILDERS: dict[ + str, + Callable[[ToolSpec, Kernel | None], tuple[list[AssistantToolParam], ToolResources]], +] = {} def _register_tool(tool_type: str): - def decorator(fn: Callable[[ToolSpec, Kernel | None], tuple[list[ToolParam], ToolResources]]): + def decorator( + fn: Callable[[ToolSpec, Kernel | None], tuple[list[AssistantToolParam], ToolResources]], + ): _TOOL_BUILDERS[tool_type.lower()] = fn return fn return decorator +# Update _code_interpreter @_register_tool("code_interpreter") -def _code_interpreter(spec: ToolSpec, kernel: Kernel | None = None) -> tuple[list[ToolParam], ToolResources]: +def _code_interpreter(spec: ToolSpec, kernel: Kernel | None = None) -> tuple[list[AssistantToolParam], ToolResources]: file_ids = spec.options.get("file_ids") return OpenAIAssistantAgent.configure_code_interpreter_tool(file_ids=file_ids) +# Update _file_search @_register_tool("file_search") -def _file_search(spec: ToolSpec, kernel: Kernel | None = None) -> tuple[list[ToolParam], ToolResources]: +def _file_search(spec: ToolSpec, kernel: Kernel | None = None) -> tuple[list[AssistantToolParam], ToolResources]: vector_store_ids = spec.options.get("vector_store_ids") if not vector_store_ids or not isinstance(vector_store_ids, list) or not vector_store_ids[0]: raise AgentInitializationException(f"Missing or malformed 'vector_store_ids' in: {spec}") return OpenAIAssistantAgent.configure_file_search_tool(vector_store_ids=vector_store_ids) -@_register_tool("function") -def _function(spec: ToolSpec, kernel: "Kernel") -> ToolResources: - def parse_fqn(fqn: str) -> tuple[str, str]: - parts = fqn.split(".") - if len(parts) != 2: - raise AgentInitializationException(f"Function `{fqn}` must be in the form `pluginName.functionName`.") - return parts[0], parts[1] - - if not spec.id: - raise AgentInitializationException("Function ID is required for function tools.") - plugin_name, function_name = parse_fqn(spec.id) - funcs = kernel.get_list_of_function_metadata_filters({"included_functions": f"{plugin_name}-{function_name}"}) - - match len(funcs): - case 0: - raise AgentInitializationException(f"Function `{spec.id}` not found in kernel.") - case 1: - return kernel_function_metadata_to_function_call_format(funcs[0]) # type: ignore[return-value] - case _: - raise AgentInitializationException(f"Multiple definitions found for `{spec.id}`. Please remove duplicates.") - - -def _build_tool(spec: ToolSpec, kernel: "Kernel") -> ToolResources: +def _build_tool(spec: ToolSpec, kernel: "Kernel") -> tuple[list[AssistantToolParam], ToolResources]: if not spec.type: raise AgentInitializationException("Tool spec must include a 'type' field.") @@ -138,19 +126,6 @@ def _build_tool(spec: ToolSpec, kernel: "Kernel") -> ToolResources: return builder(spec) if len(sig.parameters) == 1 else builder(spec, kernel) # type: ignore[call-arg] -def _build_tool_resources(tool_defs: list[ToolResources]) -> ToolResources | None: - """Collects tool resources from known tool types with resource needs.""" - resources: dict[str, Any] = {} - - for tool in tool_defs: - if isinstance(tool, CodeInterpreterToolParam): - resources["code_interpreter"] = tool.code_interpreter - elif isinstance(tool, FileSearchToolParam): - resources["file_search"] = tool.file_search - - return ToolResources(**resources) if resources else None - - # endregion @@ -332,6 +307,9 @@ def __init__( super().__init__(**args) @staticmethod + @deprecated( + "setup_resources is deprecated. Use AzureAssistantAgent.create_client() instead. This method will be removed by 2025-06-15." # noqa: E501 + ) def setup_resources( *, ai_model_id: str | None = None, @@ -391,6 +369,64 @@ def setup_resources( return client, openai_settings.chat_model_id + @staticmethod + def create_client( + *, + ai_model_id: str | None = None, + api_key: str | None = None, + org_id: str | None = None, + env_file_path: str | None = None, + env_file_encoding: str | None = None, + default_headers: dict[str, str] | None = None, + **kwargs: Any, + ) -> AsyncOpenAI: + """A method to create the OpenAI client. + + Any arguments provided will override the values in the environment variables/environment file. + + Args: + ai_model_id: The AI model ID + api_key: The API key + org_id: The organization ID + env_file_path: The environment file path + env_file_encoding: The environment file encoding, defaults to utf-8 + default_headers: The default headers to add to the client + kwargs: Additional keyword arguments + + Returns: + An OpenAI client instance. + """ + try: + openai_settings = OpenAISettings( + chat_model_id=ai_model_id, + api_key=api_key, + org_id=org_id, + env_file_path=env_file_path, + env_file_encoding=env_file_encoding, + ) + except ValidationError as ex: + raise AgentInitializationException("Failed to create OpenAI settings.", ex) from ex + + if not openai_settings.api_key: + raise AgentInitializationException("The OpenAI API key is required.") + + if not openai_settings.chat_model_id: + raise AgentInitializationException("The OpenAI model ID is required.") + + merged_headers = dict(copy(default_headers)) if default_headers else {} + if default_headers: + merged_headers.update(default_headers) + if APP_INFO: + merged_headers.update(APP_INFO) + merged_headers = prepend_semantic_kernel_to_user_agent(merged_headers) + + return AsyncOpenAI( + api_key=openai_settings.api_key.get_secret_value() if openai_settings.api_key else None, + organization=openai_settings.org_id, + default_headers=merged_headers, + **kwargs, + ) + # endregion # region Declarative Spec @@ -461,8 +497,10 @@ async def _from_dict( raise ValueError("model.id required when creating a new Azure AI agent") # Build tool definitions & resources - tool_objs = [_build_tool(t, kernel) for t in spec.tools if t.type != "function"] - all_tools: list[ToolParam] = [] + tool_objs = [ + _build_tool(t, kernel) for t in spec.tools if t.type != "function" + ] # List[tuple[list[ToolParam], ToolResources]] + all_tools: list[AssistantToolParam] = [] all_resources: ToolResources = {} for tool_list, resource in tool_objs: @@ -558,7 +596,7 @@ def replacer(match: re.Match[str]) -> str: @staticmethod def configure_code_interpreter_tool( file_ids: str | list[str] | None = None, **kwargs: Any - ) -> tuple[list["CodeInterpreterToolParam"], ToolResources]: + ) -> tuple[list["AssistantToolParam"], ToolResources]: """Generate tool + tool_resources for the code_interpreter.""" if isinstance(file_ids, str): file_ids = [file_ids] @@ -571,7 +609,7 @@ def configure_code_interpreter_tool( @staticmethod def configure_file_search_tool( vector_store_ids: str | list[str], **kwargs: Any - ) -> tuple[list[FileSearchToolParam], ToolResources]: + ) -> tuple[list[AssistantToolParam], ToolResources]: """Generate tool + tool_resources for the file_search.""" if isinstance(vector_store_ids, str): vector_store_ids = [vector_store_ids] diff --git a/python/semantic_kernel/agents/open_ai/openai_responses_agent.py b/python/semantic_kernel/agents/open_ai/openai_responses_agent.py index a4a733594a7e..830e307fceef 100644 --- a/python/semantic_kernel/agents/open_ai/openai_responses_agent.py +++ b/python/semantic_kernel/agents/open_ai/openai_responses_agent.py @@ -24,7 +24,6 @@ from semantic_kernel.agents import Agent, AgentResponseItem, AgentThread, RunPollingOptions from semantic_kernel.agents.agent import AgentSpec, DeclarativeSpecMixin, ToolSpec, register_agent_type from semantic_kernel.agents.open_ai.responses_agent_thread_actions import ResponsesAgentThreadActions -from semantic_kernel.connectors.ai.function_calling_utils import kernel_function_metadata_to_function_call_format from semantic_kernel.connectors.ai.function_choice_behavior import FunctionChoiceBehavior from semantic_kernel.connectors.ai.open_ai.settings.open_ai_settings import OpenAISettings from semantic_kernel.contents.chat_history import ChatHistory @@ -50,16 +49,23 @@ ) from semantic_kernel.utils.telemetry.user_agent import APP_INFO, prepend_semantic_kernel_to_user_agent +if TYPE_CHECKING: + from openai import AsyncOpenAI + + from semantic_kernel.kernel_pydantic import KernelBaseSettings + from semantic_kernel.prompt_template.prompt_template_config import PromptTemplateConfig + + if sys.version_info >= (3, 12): from typing import override # pragma: no cover else: from typing_extensions import override # pragma: no cover -if TYPE_CHECKING: - from openai import AsyncOpenAI +if sys.version_info >= (3, 13): + from warnings import deprecated +else: + from typing_extensions import deprecated - from semantic_kernel.kernel_pydantic import KernelBaseSettings - from semantic_kernel.prompt_template.prompt_template_config import PromptTemplateConfig _T = TypeVar("_T", bound="OpenAIResponsesAgent") ResponseFormatUnion = ResponseFormatText | ResponseFormatTextJSONSchemaConfigParam | ResponseFormatJSONObject @@ -113,28 +119,6 @@ def _web_search(spec: ToolSpec, kernel: Kernel | None = None) -> WebSearchToolPa ) -@_register_tool("function") -def _function(spec: ToolSpec, kernel: "Kernel") -> ToolParam: - def parse_fqn(fqn: str) -> tuple[str, str]: - parts = fqn.split(".") - if len(parts) != 2: - raise AgentInitializationException(f"Function `{fqn}` must be in the form `pluginName.functionName`.") - return parts[0], parts[1] - - if not spec.id: - raise AgentInitializationException("Function ID is required for function tools.") - plugin_name, function_name = parse_fqn(spec.id) - funcs = kernel.get_list_of_function_metadata_filters({"included_functions": f"{plugin_name}-{function_name}"}) - - match len(funcs): - case 0: - raise AgentInitializationException(f"Function `{spec.id}` not found in kernel.") - case 1: - return kernel_function_metadata_to_function_call_format(funcs[0]) # type: ignore[return-value] - case _: - raise AgentInitializationException(f"Multiple definitions found for `{spec.id}`. Please remove duplicates.") - - def _build_tool(spec: ToolSpec, kernel: "Kernel") -> ToolParam: if not spec.type: raise AgentInitializationException("Tool spec must include a 'type' field.") @@ -394,6 +378,9 @@ def __init__( super().__init__(**args) @staticmethod + @deprecated( + "setup_resources is deprecated. Use OpenAIResponsesAgent.create_client() instead. This method will be removed by 2025-06-15." # noqa: E501 + ) def setup_resources( *, ai_model_id: str | None = None, @@ -453,6 +440,64 @@ def setup_resources( return client, openai_settings.responses_model_id + @staticmethod + def create_client( + *, + ai_model_id: str | None = None, + api_key: str | None = None, + org_id: str | None = None, + env_file_path: str | None = None, + env_file_encoding: str | None = None, + default_headers: dict[str, str] | None = None, + **kwargs: Any, + ) -> AsyncOpenAI: + """A method to create the OpenAI client. + + Any arguments provided will override the values in the environment variables/environment file. + + Args: + ai_model_id: The AI model ID + api_key: The API key + org_id: The organization ID + env_file_path: The environment file path + env_file_encoding: The environment file encoding, defaults to utf-8 + default_headers: The default headers to add to the client + kwargs: Additional keyword arguments + + Returns: + An OpenAI client instance. + """ + try: + openai_settings = OpenAISettings( + responses_model_id=ai_model_id, + api_key=api_key, + org_id=org_id, + env_file_path=env_file_path, + env_file_encoding=env_file_encoding, + ) + except ValidationError as ex: + raise AgentInitializationException("Failed to create OpenAI settings.", ex) from ex + + if not openai_settings.api_key: + raise AgentInitializationException("The OpenAI API key is required.") + + if not openai_settings.responses_model_id: + raise AgentInitializationException("The OpenAI Responses model ID is required.") + + merged_headers = dict(copy(default_headers)) if default_headers else {} + if default_headers: + merged_headers.update(default_headers) + if APP_INFO: + merged_headers.update(APP_INFO) + merged_headers = prepend_semantic_kernel_to_user_agent(merged_headers) + + return AsyncOpenAI( + api_key=openai_settings.api_key.get_secret_value() if openai_settings.api_key else None, + organization=openai_settings.org_id, + default_headers=merged_headers, + **kwargs, + ) + # endregion # region Declarative Spec diff --git a/python/tests/integration/agents/openai_assistant_agent/test_openai_assistant_agent_integration.py b/python/tests/integration/agents/openai_assistant_agent/test_openai_assistant_agent_integration.py index c177cd7ba9b5..7ffbde5ce70e 100644 --- a/python/tests/integration/agents/openai_assistant_agent/test_openai_assistant_agent_integration.py +++ b/python/tests/integration/agents/openai_assistant_agent/test_openai_assistant_agent_integration.py @@ -6,6 +6,7 @@ import pytest from semantic_kernel.agents import AzureAssistantAgent, OpenAIAssistantAgent +from semantic_kernel.connectors.ai.open_ai import AzureOpenAISettings, OpenAISettings from semantic_kernel.contents import AuthorRole, ChatMessageContent, StreamingChatMessageContent from semantic_kernel.contents.streaming_text_content import StreamingTextContent from semantic_kernel.contents.text_content import TextContent @@ -37,10 +38,12 @@ async def assistant_agent(self, request): tools, tool_resources, plugins = [], {}, [] if agent_type == "azure": - client, model = AzureAssistantAgent.setup_resources() + client = AzureAssistantAgent.create_client() + model = AzureOpenAISettings().chat_deployment_name AgentClass = AzureAssistantAgent else: # agent_type == "openai" - client, model = OpenAIAssistantAgent.setup_resources() + client = OpenAIAssistantAgent.create_client() + model = OpenAISettings().chat_model_id AgentClass = OpenAIAssistantAgent if params.get("enable_code_interpreter"): diff --git a/python/tests/integration/agents/openai_responses_agent/test_openai_responses_agent_integration.py b/python/tests/integration/agents/openai_responses_agent/test_openai_responses_agent_integration.py index 2d9d5426bcd4..bbd7a363c65e 100644 --- a/python/tests/integration/agents/openai_responses_agent/test_openai_responses_agent_integration.py +++ b/python/tests/integration/agents/openai_responses_agent/test_openai_responses_agent_integration.py @@ -7,6 +7,7 @@ from pydantic import BaseModel from semantic_kernel.agents import AzureResponsesAgent, OpenAIResponsesAgent +from semantic_kernel.connectors.ai.open_ai import AzureOpenAISettings, OpenAISettings from semantic_kernel.contents import AuthorRole, ChatMessageContent, StreamingChatMessageContent from semantic_kernel.contents.streaming_text_content import StreamingTextContent from semantic_kernel.contents.text_content import TextContent @@ -48,10 +49,12 @@ async def responses_agent(self, request): tools, plugins, text = [], [], None if agent_type == "azure": - client, model = AzureResponsesAgent.setup_resources() + client = AzureResponsesAgent.create_client() + model = AzureOpenAISettings().chat_deployment_name AgentClass = AzureResponsesAgent else: # agent_type == "openai" - client, model = OpenAIResponsesAgent.setup_resources() + client = OpenAIResponsesAgent.create_client() + model = OpenAISettings().chat_model_id AgentClass = OpenAIResponsesAgent if params.get("enable_web_search"): diff --git a/python/tests/integration/cross_language/data/prompt_simple_expected.json b/python/tests/integration/cross_language/data/prompt_simple_expected.json index 07fcc52c95f3..ccd9a8267ce8 100644 --- a/python/tests/integration/cross_language/data/prompt_simple_expected.json +++ b/python/tests/integration/cross_language/data/prompt_simple_expected.json @@ -6,5 +6,5 @@ } ], "stream": false, - "model": "gpt-3.5-turbo" + "model": "gpt-4.1-nano" } \ No newline at end of file diff --git a/python/tests/integration/cross_language/data/prompt_with_chat_roles_expected.json b/python/tests/integration/cross_language/data/prompt_with_chat_roles_expected.json index 7aa1f9122b74..203c2d800777 100644 --- a/python/tests/integration/cross_language/data/prompt_with_chat_roles_expected.json +++ b/python/tests/integration/cross_language/data/prompt_with_chat_roles_expected.json @@ -14,5 +14,5 @@ } ], "stream": false, - "model": "gpt-3.5-turbo" + "model": "gpt-4.1-nano" } \ No newline at end of file diff --git a/python/tests/integration/cross_language/data/prompt_with_complex_objects_expected.json b/python/tests/integration/cross_language/data/prompt_with_complex_objects_expected.json index 07fcc52c95f3..ccd9a8267ce8 100644 --- a/python/tests/integration/cross_language/data/prompt_with_complex_objects_expected.json +++ b/python/tests/integration/cross_language/data/prompt_with_complex_objects_expected.json @@ -6,5 +6,5 @@ } ], "stream": false, - "model": "gpt-3.5-turbo" + "model": "gpt-4.1-nano" } \ No newline at end of file diff --git a/python/tests/integration/cross_language/data/prompt_with_helper_functions_expected.json b/python/tests/integration/cross_language/data/prompt_with_helper_functions_expected.json index ee5a6e6e18f9..c69963b47ed6 100644 --- a/python/tests/integration/cross_language/data/prompt_with_helper_functions_expected.json +++ b/python/tests/integration/cross_language/data/prompt_with_helper_functions_expected.json @@ -10,5 +10,5 @@ } ], "stream": false, - "model": "gpt-3.5-turbo" + "model": "gpt-4.1-nano" } \ No newline at end of file diff --git a/python/tests/integration/cross_language/data/prompt_with_simple_variable_expected.json b/python/tests/integration/cross_language/data/prompt_with_simple_variable_expected.json index 07fcc52c95f3..ccd9a8267ce8 100644 --- a/python/tests/integration/cross_language/data/prompt_with_simple_variable_expected.json +++ b/python/tests/integration/cross_language/data/prompt_with_simple_variable_expected.json @@ -6,5 +6,5 @@ } ], "stream": false, - "model": "gpt-3.5-turbo" + "model": "gpt-4.1-nano" } \ No newline at end of file diff --git a/python/tests/integration/cross_language/test_cross_language.py b/python/tests/integration/cross_language/test_cross_language.py index aecc1f8f009f..2289f7e72ed1 100644 --- a/python/tests/integration/cross_language/test_cross_language.py +++ b/python/tests/integration/cross_language/test_cross_language.py @@ -12,8 +12,7 @@ import pytest_asyncio from openai import AsyncOpenAI -from semantic_kernel.connectors.ai.open_ai import OpenAIChatCompletion -from semantic_kernel.connectors.ai.open_ai.settings.open_ai_settings import OpenAISettings +from semantic_kernel.connectors.ai.open_ai import OpenAIChatCompletion, OpenAISettings from semantic_kernel.functions.kernel_arguments import KernelArguments from semantic_kernel.functions.kernel_function import KernelFunction from semantic_kernel.functions.kernel_function_decorator import kernel_function @@ -23,7 +22,7 @@ logger = logging.getLogger(__name__) -OPENAI_MODEL_ID = "gpt-3.5-turbo" +OPENAI_MODEL_ID = "gpt-4.1-nano" # region Test Prompts diff --git a/python/uv.lock b/python/uv.lock index b6556da54f33..356a4be1074b 100644 --- a/python/uv.lock +++ b/python/uv.lock @@ -837,7 +837,8 @@ dependencies = [ { name = "kubernetes", marker = "sys_platform == 'darwin' or sys_platform == 'linux' or sys_platform == 'win32'" }, { name = "mmh3", marker = "sys_platform == 'darwin' or sys_platform == 'linux' or sys_platform == 'win32'" }, { 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 = "onnxruntime", version = "1.21.0", source = { registry = "https://pypi.org/simple" }, marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "onnxruntime", version = "1.22.0", source = { registry = "https://pypi.org/simple" }, marker = "sys_platform == 'win32'" }, { name = "opentelemetry-api", marker = "sys_platform == 'darwin' or sys_platform == 'linux' or sys_platform == 'win32'" }, { name = "opentelemetry-exporter-otlp-proto-grpc", marker = "sys_platform == 'darwin' or sys_platform == 'linux' or sys_platform == 'win32'" }, { name = "opentelemetry-instrumentation-fastapi", marker = "sys_platform == 'darwin' or sys_platform == 'linux' or sys_platform == 'win32'" }, @@ -1550,7 +1551,7 @@ wheels = [ [[package]] name = "google-cloud-aiplatform" -version = "1.91.0" +version = "1.93.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "docstring-parser", marker = "sys_platform == 'darwin' or sys_platform == 'linux' or sys_platform == 'win32'" }, @@ -1559,6 +1560,7 @@ dependencies = [ { name = "google-cloud-bigquery", marker = "sys_platform == 'darwin' or sys_platform == 'linux' or sys_platform == 'win32'" }, { name = "google-cloud-resource-manager", marker = "sys_platform == 'darwin' or sys_platform == 'linux' or sys_platform == 'win32'" }, { name = "google-cloud-storage", marker = "sys_platform == 'darwin' or sys_platform == 'linux' or sys_platform == 'win32'" }, + { name = "google-genai", marker = "sys_platform == 'darwin' or sys_platform == 'linux' or sys_platform == 'win32'" }, { name = "packaging", marker = "sys_platform == 'darwin' or sys_platform == 'linux' or sys_platform == 'win32'" }, { name = "proto-plus", marker = "sys_platform == 'darwin' or sys_platform == 'linux' or sys_platform == 'win32'" }, { name = "protobuf", marker = "sys_platform == 'darwin' or sys_platform == 'linux' or sys_platform == 'win32'" }, @@ -1566,9 +1568,9 @@ dependencies = [ { name = "shapely", marker = "sys_platform == 'darwin' or sys_platform == 'linux' or sys_platform == 'win32'" }, { name = "typing-extensions", marker = "sys_platform == 'darwin' or sys_platform == 'linux' or sys_platform == 'win32'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/50/08/5854569782efbbc8efd0aeda3a4486153605104cbab6ac836b2328bae48e/google_cloud_aiplatform-1.91.0.tar.gz", hash = "sha256:b14e5e52b52b6012c7dc253beab34c511fdc53c69b13f436ddb06882c1a92cd7", size = 9102586, upload_time = "2025-04-30T17:15:23.546Z" } +sdist = { url = "https://files.pythonhosted.org/packages/e2/98/90b3ee5d18228189b34f5cf85aef775971bdf689ff72d1cbb109cab638d3/google_cloud_aiplatform-1.93.0.tar.gz", hash = "sha256:d9986916433668f07e5dca0b8101082ba58a7cedb6f58e91188b1f20dffa3dea", size = 9145814, upload_time = "2025-05-15T17:35:46.51Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/d1/88/cea8583fadd142e8ef26f8ec14a6ee4d7c69c4e5ab82bea01a077fddddbe/google_cloud_aiplatform-1.91.0-py2.py3-none-any.whl", hash = "sha256:ff8df100c2af692d114a2219d3abbb96110b3e5655f342fdbb6aefad43901b52", size = 7591910, upload_time = "2025-04-30T17:15:19.6Z" }, + { url = "https://files.pythonhosted.org/packages/66/a5/23a7a7df50041261638053237ecc32eae4987e4cf344258a873e69f9d350/google_cloud_aiplatform-1.93.0-py2.py3-none-any.whl", hash = "sha256:7fd4079b1de10db560ed9ab78ea33d6845e1f0b1b254f1c0029310a57daa63c3", size = 7634458, upload_time = "2025-05-15T17:35:43.072Z" }, ] [[package]] @@ -1670,6 +1672,24 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/fd/3c/2a19a60a473de48717b4efb19398c3f914795b64a96cf3fbe82588044f78/google_crc32c-1.7.1-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6efb97eb4369d52593ad6f75e7e10d053cf00c48983f7a973105bc70b0ac4d82", size = 28048, upload_time = "2025-03-26T14:41:46.696Z" }, ] +[[package]] +name = "google-genai" +version = "1.16.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "anyio", marker = "sys_platform == 'darwin' or sys_platform == 'linux' or sys_platform == 'win32'" }, + { name = "google-auth", marker = "sys_platform == 'darwin' or sys_platform == 'linux' or sys_platform == 'win32'" }, + { name = "httpx", marker = "sys_platform == 'darwin' or sys_platform == 'linux' or sys_platform == 'win32'" }, + { name = "pydantic", marker = "sys_platform == 'darwin' or sys_platform == 'linux' or sys_platform == 'win32'" }, + { name = "requests", marker = "sys_platform == 'darwin' or sys_platform == 'linux' or sys_platform == 'win32'" }, + { name = "typing-extensions", marker = "sys_platform == 'darwin' or sys_platform == 'linux' or sys_platform == 'win32'" }, + { name = "websockets", marker = "sys_platform == 'darwin' or sys_platform == 'linux' or sys_platform == 'win32'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ca/1f/1a52736e87b4a22afef615de45e2f509fbfb55c09798620b0c3f394076ef/google_genai-1.16.1.tar.gz", hash = "sha256:4b4ed4ed781a9d61e5ce0fef1486dd3a5d7ff0a73bd76b9633d21e687ab998df", size = 194270, upload_time = "2025-05-20T01:05:26.717Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/bc/31/30caa8d4ae987e47c5250fb6680588733863fd5b39cacb03ba1977c29bde/google_genai-1.16.1-py3-none-any.whl", hash = "sha256:6ae5d24282244f577ca4f0d95c09f75ab29e556602c9d3531b70161e34cd2a39", size = 196327, upload_time = "2025-05-20T01:05:24.831Z" }, +] + [[package]] name = "google-generativeai" version = "0.8.5" @@ -3342,42 +3362,76 @@ wheels = [ name = "onnxruntime" version = "1.21.0" source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version < '3.11' and sys_platform == 'darwin'", + "python_full_version == '3.11.*' and sys_platform == 'darwin'", + "python_full_version >= '4.0' and sys_platform == 'darwin'", + "python_full_version == '3.12.*' and sys_platform == 'darwin'", + "python_full_version >= '3.13' and python_full_version < '4.0' and sys_platform == 'darwin'", + "python_full_version < '3.11' and sys_platform == 'linux'", + "python_full_version == '3.11.*' and sys_platform == 'linux'", + "python_full_version >= '4.0' and sys_platform == 'linux'", + "python_full_version == '3.12.*' and sys_platform == 'linux'", + "python_full_version >= '3.13' and python_full_version < '4.0' and sys_platform == 'linux'", +] dependencies = [ - { name = "coloredlogs", marker = "sys_platform == 'darwin' or sys_platform == 'linux' or sys_platform == 'win32'" }, - { name = "flatbuffers", marker = "sys_platform == 'darwin' or sys_platform == 'linux' or sys_platform == 'win32'" }, - { name = "numpy", marker = "sys_platform == 'darwin' or sys_platform == 'linux' or sys_platform == 'win32'" }, - { name = "packaging", marker = "sys_platform == 'darwin' or sys_platform == 'linux' or sys_platform == 'win32'" }, - { name = "protobuf", marker = "sys_platform == 'darwin' or sys_platform == 'linux' or sys_platform == 'win32'" }, - { name = "sympy", marker = "sys_platform == 'darwin' or sys_platform == 'linux' or sys_platform == 'win32'" }, + { name = "coloredlogs", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "flatbuffers", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "numpy", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "packaging", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "protobuf", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, + { name = "sympy", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, ] wheels = [ { url = "https://files.pythonhosted.org/packages/a8/b5/433e46baf8f31a84684f9d3446d8683473706e2810b6171e19beed88ecb9/onnxruntime-1.21.0-cp310-cp310-macosx_13_0_universal2.whl", hash = "sha256:95513c9302bc8dd013d84148dcf3168e782a80cdbf1654eddc948a23147ccd3d", size = 33639595, upload_time = "2025-03-08T02:43:37.245Z" }, { url = "https://files.pythonhosted.org/packages/23/78/1ec7358f9c9de82299cb99a1a48bdb871b4180533cfe5900e2ede102668e/onnxruntime-1.21.0-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:635d4ab13ae0f150dd4c6ff8206fd58f1c6600636ecc796f6f0c42e4c918585b", size = 14159036, upload_time = "2025-03-08T02:43:59.355Z" }, { url = "https://files.pythonhosted.org/packages/eb/66/fcd3e1201f546c736b0050cb2e889296596ff7862f36bd17027fbef5f24d/onnxruntime-1.21.0-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7d06bfa0dd5512bd164f25a2bf594b2e7c9eabda6fc064b684924f3e81bdab1b", size = 16000047, upload_time = "2025-03-08T02:44:01.88Z" }, - { url = "https://files.pythonhosted.org/packages/29/eb/16abd29cdff9cb3237ba13adfafad20048c8f5a4a50b7e4689dd556c58d6/onnxruntime-1.21.0-cp310-cp310-win_amd64.whl", hash = "sha256:b0fc22d219791e0284ee1d9c26724b8ee3fbdea28128ef25d9507ad3b9621f23", size = 11758587, upload_time = "2025-03-08T02:43:40.543Z" }, { url = "https://files.pythonhosted.org/packages/df/34/fd780c62b3ec9268224ada4205a5256618553b8cc26d7205d3cf8aafde47/onnxruntime-1.21.0-cp311-cp311-macosx_13_0_universal2.whl", hash = "sha256:8e16f8a79df03919810852fb46ffcc916dc87a9e9c6540a58f20c914c575678c", size = 33644022, upload_time = "2025-03-08T02:43:43.412Z" }, { url = "https://files.pythonhosted.org/packages/7b/df/622594b43d1a8644ac4d947f52e34a0e813b3d76a62af34667e343c34e98/onnxruntime-1.21.0-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7f9156cf6f8ee133d07a751e6518cf6f84ed37fbf8243156bd4a2c4ee6e073c8", size = 14159570, upload_time = "2025-03-08T02:44:04.343Z" }, { url = "https://files.pythonhosted.org/packages/f9/49/1e916e8d1d957a1432c1662ef2e94f3e4afab31f6f1888fb80d4da374a5d/onnxruntime-1.21.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8a5d09815a9e209fa0cb20c2985b34ab4daeba7aea94d0f96b8751eb10403201", size = 16001965, upload_time = "2025-03-08T02:44:06.619Z" }, - { url = "https://files.pythonhosted.org/packages/09/05/15ec0933f8543f85743571da9b3bf4397f71792c9d375f01f61c6019f130/onnxruntime-1.21.0-cp311-cp311-win_amd64.whl", hash = "sha256:1d970dff1e2fa4d9c53f2787b3b7d0005596866e6a31997b41169017d1362dd0", size = 11759373, upload_time = "2025-03-08T02:43:46.583Z" }, { url = "https://files.pythonhosted.org/packages/ff/21/593c9bc56002a6d1ea7c2236f4a648e081ec37c8d51db2383a9e83a63325/onnxruntime-1.21.0-cp312-cp312-macosx_13_0_universal2.whl", hash = "sha256:893d67c68ca9e7a58202fa8d96061ed86a5815b0925b5a97aef27b8ba246a20b", size = 33658780, upload_time = "2025-03-08T02:43:49.378Z" }, { url = "https://files.pythonhosted.org/packages/4a/b4/33ec675a8ac150478091262824413e5d4acc359e029af87f9152e7c1c092/onnxruntime-1.21.0-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:37b7445c920a96271a8dfa16855e258dc5599235b41c7bbde0d262d55bcc105f", size = 14159975, upload_time = "2025-03-08T02:44:09.196Z" }, { url = "https://files.pythonhosted.org/packages/8b/08/eead6895ed83b56711ca6c0d31d82f109401b9937558b425509e497d6fb4/onnxruntime-1.21.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9a04aafb802c1e5573ba4552f8babcb5021b041eb4cfa802c9b7644ca3510eca", size = 16019285, upload_time = "2025-03-08T02:44:11.706Z" }, - { url = "https://files.pythonhosted.org/packages/77/39/e83d56e3c215713b5263cb4d4f0c69e3964bba11634233d8ae04fc7e6bf3/onnxruntime-1.21.0-cp312-cp312-win_amd64.whl", hash = "sha256:7f801318476cd7003d636a5b392f7a37c08b6c8d2f829773f3c3887029e03f32", size = 11760975, upload_time = "2025-03-08T02:43:52.332Z" }, { url = "https://files.pythonhosted.org/packages/f2/25/93f65617b06c741a58eeac9e373c99df443b02a774f4cb6511889757c0da/onnxruntime-1.21.0-cp313-cp313-macosx_13_0_universal2.whl", hash = "sha256:85718cbde1c2912d3a03e3b3dc181b1480258a229c32378408cace7c450f7f23", size = 33659581, upload_time = "2025-03-08T02:43:54.745Z" }, { url = "https://files.pythonhosted.org/packages/f9/03/6b6829ee8344490ab5197f39a6824499ed097d1fc8c85b1f91c0e6767819/onnxruntime-1.21.0-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:94dff3a61538f3b7b0ea9a06bc99e1410e90509c76e3a746f039e417802a12ae", size = 14160534, upload_time = "2025-03-08T02:44:13.915Z" }, { url = "https://files.pythonhosted.org/packages/a6/81/e280ddf05f83ad5e0d066ef08e31515b17bd50bb52ef2ea713d9e455e67a/onnxruntime-1.21.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c1e704b0eda5f2bbbe84182437315eaec89a450b08854b5a7762c85d04a28a0a", size = 16018947, upload_time = "2025-03-08T02:44:16.447Z" }, - { url = "https://files.pythonhosted.org/packages/d3/ea/011dfc2536e46e2ea984d2c0256dc585ebb1352366dffdd98764f1f44ee4/onnxruntime-1.21.0-cp313-cp313-win_amd64.whl", hash = "sha256:19b630c6a8956ef97fb7c94948b17691167aa1aaf07b5f214fa66c3e4136c108", size = 11760731, upload_time = "2025-03-08T02:43:57.281Z" }, { url = "https://files.pythonhosted.org/packages/47/6b/a00f31322e91c610c7825377ef0cad884483c30d1370b896d57e7032e912/onnxruntime-1.21.0-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3995c4a2d81719623c58697b9510f8de9fa42a1da6b4474052797b0d712324fe", size = 14172215, upload_time = "2025-03-08T02:44:18.578Z" }, { url = "https://files.pythonhosted.org/packages/58/4b/98214f13ac1cd675dfc2713ba47b5722f55ce4fba526d2b2826f2682a42e/onnxruntime-1.21.0-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:36b18b8f39c0f84e783902112a0dd3c102466897f96d73bb83f6a6bff283a423", size = 15990612, upload_time = "2025-03-08T02:44:20.715Z" }, ] +[[package]] +name = "onnxruntime" +version = "1.22.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version < '3.11' and sys_platform == 'win32'", + "python_full_version == '3.11.*' and sys_platform == 'win32'", + "python_full_version >= '4.0' and sys_platform == 'win32'", + "python_full_version == '3.12.*' and sys_platform == 'win32'", + "python_full_version >= '3.13' and python_full_version < '4.0' and sys_platform == 'win32'", +] +dependencies = [ + { name = "coloredlogs", marker = "sys_platform == 'win32'" }, + { name = "flatbuffers", marker = "sys_platform == 'win32'" }, + { name = "numpy", marker = "sys_platform == 'win32'" }, + { name = "packaging", marker = "sys_platform == 'win32'" }, + { name = "protobuf", marker = "sys_platform == 'win32'" }, + { name = "sympy", marker = "sys_platform == 'win32'" }, +] +wheels = [ + { url = "https://files.pythonhosted.org/packages/6d/6b/8267490476e8d4dd1883632c7e46a4634384c7ff1c35ae44edc8ab0bb7a9/onnxruntime-1.22.0-cp310-cp310-win_amd64.whl", hash = "sha256:20bca6495d06925631e201f2b257cc37086752e8fe7b6c83a67c6509f4759bc9", size = 12689974, upload_time = "2025-05-12T21:26:09.704Z" }, + { url = "https://files.pythonhosted.org/packages/89/a5/1c6c10322201566015183b52ef011dfa932f5dd1b278de8d75c3b948411d/onnxruntime-1.22.0-cp311-cp311-win_amd64.whl", hash = "sha256:03d3ef7fb11adf154149d6e767e21057e0e577b947dd3f66190b212528e1db31", size = 12691517, upload_time = "2025-05-12T21:26:13.354Z" }, + { url = "https://files.pythonhosted.org/packages/36/b4/3f1c71ce1d3d21078a6a74c5483bfa2b07e41a8d2b8fb1e9993e6a26d8d3/onnxruntime-1.22.0-cp312-cp312-win_amd64.whl", hash = "sha256:c0d534a43d1264d1273c2d4f00a5a588fa98d21117a3345b7104fa0bbcaadb9a", size = 12692233, upload_time = "2025-05-12T21:26:16.963Z" }, + { url = "https://files.pythonhosted.org/packages/3e/89/2f64e250945fa87140fb917ba377d6d0e9122e029c8512f389a9b7f953f4/onnxruntime-1.22.0-cp313-cp313-win_amd64.whl", hash = "sha256:5a31d84ef82b4b05d794a4ce8ba37b0d9deb768fd580e36e17b39e0b4840253b", size = 12691777, upload_time = "2025-05-12T21:26:20.19Z" }, +] + [[package]] name = "onnxruntime-genai" version = "0.7.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "numpy", marker = "(python_full_version < '3.13' and sys_platform == 'darwin') or (python_full_version < '3.13' and sys_platform == 'linux')" }, - { name = "onnxruntime", marker = "(python_full_version < '3.13' and sys_platform == 'darwin') or (python_full_version < '3.13' and sys_platform == 'linux')" }, + { name = "onnxruntime", version = "1.21.0", source = { registry = "https://pypi.org/simple" }, marker = "(python_full_version < '3.13' and sys_platform == 'darwin') or (python_full_version < '3.13' and sys_platform == 'linux')" }, ] wheels = [ { url = "https://files.pythonhosted.org/packages/ef/47/ff222bb74a0725266cebfbca7bf24f0877b4e9abb1b38451173507d3c362/onnxruntime_genai-0.7.1-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:12dc0005dba08bee78ec5bae67624f9e92ce0dad8a6cab444b87d9a43236a514", size = 988999, upload_time = "2025-04-21T22:52:59.484Z" }, @@ -5588,7 +5642,7 @@ ollama = [ { name = "ollama", marker = "sys_platform == 'darwin' or sys_platform == 'linux' or sys_platform == 'win32'" }, ] onnx = [ - { name = "onnxruntime", marker = "sys_platform == 'win32'" }, + { name = "onnxruntime", version = "1.22.0", source = { registry = "https://pypi.org/simple" }, marker = "sys_platform == 'win32'" }, { name = "onnxruntime-genai", marker = "(python_full_version < '3.13' and sys_platform == 'darwin') or (python_full_version < '3.13' and sys_platform == 'linux')" }, ] pandas = [ @@ -5662,7 +5716,7 @@ requires-dist = [ { name = "defusedxml", specifier = "~=0.7" }, { name = "faiss-cpu", marker = "extra == 'faiss'", specifier = ">=1.10.0" }, { name = "flask-dapr", marker = "extra == 'dapr'", specifier = ">=1.14.0" }, - { name = "google-cloud-aiplatform", marker = "extra == 'google'", specifier = "==1.91.0" }, + { name = "google-cloud-aiplatform", marker = "extra == 'google'", specifier = "==1.93.0" }, { name = "google-generativeai", marker = "extra == 'google'", specifier = "~=0.8" }, { name = "ipykernel", marker = "extra == 'notebooks'", specifier = "~=6.29" }, { name = "jinja2", specifier = "~=3.1" }, @@ -5674,7 +5728,7 @@ requires-dist = [ { name = "numpy", marker = "python_full_version < '3.12'", specifier = ">=1.25.0" }, { name = "numpy", marker = "python_full_version >= '3.12'", specifier = ">=1.26.0" }, { name = "ollama", marker = "extra == 'ollama'", specifier = "~=0.4" }, - { name = "onnxruntime", marker = "sys_platform == 'win32' and extra == 'onnx'", specifier = "==1.21.0" }, + { name = "onnxruntime", marker = "sys_platform == 'win32' and extra == 'onnx'", specifier = "==1.22.0" }, { name = "onnxruntime-genai", marker = "python_full_version < '3.13' and sys_platform != 'win32' and extra == 'onnx'", specifier = "~=0.5" }, { name = "openai", specifier = ">=1.67" }, { name = "openapi-core", specifier = ">=0.18,<0.20" }, @@ -5693,7 +5747,7 @@ requires-dist = [ { name = "pymongo", marker = "extra == 'mongo'", specifier = ">=4.8.0,<4.13" }, { name = "pyodbc", marker = "extra == 'sql'", specifier = ">=5.2" }, { name = "qdrant-client", marker = "extra == 'qdrant'", specifier = "~=1.9" }, - { name = "redis", extras = ["hiredis"], marker = "extra == 'redis'", specifier = "~=5.0" }, + { name = "redis", extras = ["hiredis"], marker = "extra == 'redis'", specifier = ">=5,<7" }, { name = "redisvl", marker = "extra == 'redis'", specifier = "~=0.4" }, { name = "scipy", specifier = ">=1.15.1" }, { name = "sentence-transformers", marker = "extra == 'hugging-face'", specifier = ">=2.2,<5.0" }, From f119f8121ae751a10e4c401627dc7d093ec6d290 Mon Sep 17 00:00:00 2001 From: Evan Mattson Date: Thu, 22 May 2025 19:21:26 +0900 Subject: [PATCH 08/18] Updates --- .../agents/mixed_chat/mixed_chat_files.py | 2 +- .../agents/openai_assistant/README.md | 2 +- ...tant_declarative_with_existing_agent_id.py | 58 ++++--- .../concepts/processes/plan_and_execute.py | 5 +- .../step5_magentic.py | 6 +- .../openai_assistant/README.md | 5 +- .../openai_responses/step1_responses_agent.py | 5 +- ...step2_responses_agent_thread_management.py | 7 +- .../step3_responses_agent_plugins.py | 5 +- .../step4_responses_agent_web_search.py | 5 +- .../step5_responses_agent_file_search.py | 5 +- .../step6_responses_agent_vision.py | 5 +- ...tep7_responses_agent_structured_outputs.py | 5 +- .../test_azure_assistant_agent.py | 142 ++++++++++++++++++ .../test_openai_assistant_agent.py | 142 +++++++++++++++++- .../test_openai_responses_agent.py | 118 +++++++++++++++ 16 files changed, 459 insertions(+), 58 deletions(-) diff --git a/python/samples/concepts/agents/mixed_chat/mixed_chat_files.py b/python/samples/concepts/agents/mixed_chat/mixed_chat_files.py index 87d5bd7426ac..9580c829b631 100644 --- a/python/samples/concepts/agents/mixed_chat/mixed_chat_files.py +++ b/python/samples/concepts/agents/mixed_chat/mixed_chat_files.py @@ -34,7 +34,7 @@ async def main(): client = AzureAssistantAgent.create_client() # If desired, create using OpenAI resources - # client, model = OpenAIAssistantAgent.setup_resources() + # client = OpenAIAssistantAgent.create_client() # Load the text file as a FileObject with open(file_path, "rb") as file: diff --git a/python/samples/concepts/agents/openai_assistant/README.md b/python/samples/concepts/agents/openai_assistant/README.md index 37790bfa7733..632d1d8ae2a4 100644 --- a/python/samples/concepts/agents/openai_assistant/README.md +++ b/python/samples/concepts/agents/openai_assistant/README.md @@ -32,7 +32,7 @@ OpenAI Assistant Agents are created in the following way: from semantic_kernel.agents import OpenAIAssistantAgent # Create the client using OpenAI resources and configuration -client, model = OpenAIAssistantAgent.setup_resources() +client = OpenAIAssistantAgent.create_client() # Create the assistant definition definition = await client.beta.assistants.create( diff --git a/python/samples/concepts/agents/openai_assistant/openai_assistant_declarative_with_existing_agent_id.py b/python/samples/concepts/agents/openai_assistant/openai_assistant_declarative_with_existing_agent_id.py index 974127a1020c..aaff6ab53d2d 100644 --- a/python/samples/concepts/agents/openai_assistant/openai_assistant_declarative_with_existing_agent_id.py +++ b/python/samples/concepts/agents/openai_assistant/openai_assistant_declarative_with_existing_agent_id.py @@ -2,10 +2,8 @@ import asyncio -from azure.identity.aio import DefaultAzureCredential - -from semantic_kernel.agents import AzureAIAgent from semantic_kernel.agents.agent import AgentRegistry +from semantic_kernel.agents.open_ai.openai_assistant_agent import OpenAIAssistantAgent """ The following sample demonstrates how to create an OpenAI Assistant Agent based @@ -14,43 +12,41 @@ # Define the YAML string for the sample spec = """ -id: ${AzureAI:AgentId} -type: foundry_agent +id: ${OpenAI:AgentId} +type: openai_assistant instructions: You are helpful agent who always responds in French. """ async def main(): - async with ( - DefaultAzureCredential() as creds, - AzureAIAgent.create_client(credential=creds) as client, - ): - try: - # Create the AzureAI Agent from the YAML spec - # Note: the extras can be provided in the short-format (shown below) or - # in the long-format (as shown in the YAML spec, with the `AzureAI:` prefix). - # The short-format is used here for brevity - agent: AzureAIAgent = await AgentRegistry.create_from_yaml( - yaml_str=spec, - client=client, - extras={"AgentId": ""}, # Specify the existing agent ID - ) + client = OpenAIAssistantAgent.create_client() - # Define the task for the agent - TASK = "Why is the sky blue?" + try: + # Create the AzureAI Agent from the YAML spec + # Note: the extras can be provided in the short-format (shown below) or + # in the long-format (as shown in the YAML spec, with the `AzureAI:` prefix). + # The short-format is used here for brevity + agent: OpenAIAssistantAgent = await AgentRegistry.create_from_yaml( + yaml_str=spec, + client=client, + extras={"AgentId": ""}, # Specify the existing agent ID + ) - print(f"# User: '{TASK}'") + # Define the task for the agent + TASK = "Why is the sky blue?" - # Invoke the agent for the specified task - async for response in agent.invoke( - messages=TASK, - ): - print(f"# {response.name}: {response}") - finally: - # Cleanup: Delete the thread and agent - await client.agents.delete_agent(agent.id) + print(f"# User: '{TASK}'") - """ + # Invoke the agent for the specified task + async for response in agent.invoke( + messages=TASK, + ): + print(f"# {response.name}: {response}") + finally: + # Cleanup: Delete the thread and agent + await client.agents.delete_agent(agent.id) + + """ Sample output: # User: 'Why is the sky blue?' diff --git a/python/samples/concepts/processes/plan_and_execute.py b/python/samples/concepts/processes/plan_and_execute.py index c83e9207b82e..42f20a497c3b 100644 --- a/python/samples/concepts/processes/plan_and_execute.py +++ b/python/samples/concepts/processes/plan_and_execute.py @@ -9,6 +9,7 @@ from semantic_kernel import Kernel from semantic_kernel.agents import OpenAIResponsesAgent +from semantic_kernel.connectors.ai.open_ai import OpenAISettings from semantic_kernel.functions import kernel_function from semantic_kernel.processes import ProcessBuilder from semantic_kernel.processes.kernel_process import ( @@ -49,11 +50,11 @@ # 1) Helper to run OpenAI agent # async def run_openai_agent(instructions: str, prompt: str, agent_name: str = "GenericAgent") -> str: - client, model = OpenAIResponsesAgent.setup_resources() + client = OpenAIResponsesAgent.create_client() agent_tools = [OpenAIResponsesAgent.configure_web_search_tool()] agent = OpenAIResponsesAgent( - ai_model_id=model, + ai_model_id=OpenAISettings().responses_model_id, client=client, instructions=instructions, name=agent_name, diff --git a/python/samples/getting_started_with_agents/multi_agent_orchestration/step5_magentic.py b/python/samples/getting_started_with_agents/multi_agent_orchestration/step5_magentic.py index cfe6bbcaeb21..5f1a95e010af 100644 --- a/python/samples/getting_started_with_agents/multi_agent_orchestration/step5_magentic.py +++ b/python/samples/getting_started_with_agents/multi_agent_orchestration/step5_magentic.py @@ -10,7 +10,7 @@ StandardMagenticManager, ) from semantic_kernel.agents.runtime import InProcessRuntime -from semantic_kernel.connectors.ai.open_ai import OpenAIChatCompletion +from semantic_kernel.connectors.ai.open_ai import OpenAIChatCompletion, OpenAISettings from semantic_kernel.contents import ChatMessageContent """ @@ -47,10 +47,10 @@ async def agents() -> list[Agent]: ) # Create an OpenAI Assistant agent with code interpreter capability - client, model = OpenAIAssistantAgent.setup_resources() + client = OpenAIAssistantAgent.create_client() code_interpreter_tool, code_interpreter_tool_resources = OpenAIAssistantAgent.configure_code_interpreter_tool() definition = await client.beta.assistants.create( - model=model, + model=OpenAISettings().chat_model_id, name="CoderAgent", description="A helpful assistant that writes and executes code to process and analyze data.", instructions="You solve questions using code. Please provide detailed analysis and computation process.", diff --git a/python/samples/getting_started_with_agents/openai_assistant/README.md b/python/samples/getting_started_with_agents/openai_assistant/README.md index 6736ef483849..04baa2a66e9e 100644 --- a/python/samples/getting_started_with_agents/openai_assistant/README.md +++ b/python/samples/getting_started_with_agents/openai_assistant/README.md @@ -30,13 +30,14 @@ OpenAI Assistant Agents are created in the following way: ```python from semantic_kernel.agents import OpenAIAssistantAgent +from semantic_kernel.connectors.ai.open_ai import OpenAISettings # Create the client using OpenAI resources and configuration -client, model = OpenAIAssistantAgent.setup_resources() +client = OpenAIAssistantAgent.create_client() # Create the assistant definition definition = await client.beta.assistants.create( - model=model, + model=OpenAISettings().chat_model_id, instructions="", name="", ) diff --git a/python/samples/getting_started_with_agents/openai_responses/step1_responses_agent.py b/python/samples/getting_started_with_agents/openai_responses/step1_responses_agent.py index 8fd39c5b3ff1..036ceaf8532f 100644 --- a/python/samples/getting_started_with_agents/openai_responses/step1_responses_agent.py +++ b/python/samples/getting_started_with_agents/openai_responses/step1_responses_agent.py @@ -2,6 +2,7 @@ import asyncio from semantic_kernel.agents import AzureResponsesAgent +from semantic_kernel.connectors.ai.open_ai import AzureOpenAISettings """ The following sample demonstrates how to create an OpenAI Responses Agent using either @@ -28,11 +29,11 @@ async def main(): # 1. Create the client using Azure OpenAI resources and configuration - client, model = AzureResponsesAgent.setup_resources() + client = AzureResponsesAgent.create_client() # 2. Create a Semantic Kernel agent for the OpenAI Responses API agent = AzureResponsesAgent( - ai_model_id=model, + ai_model_id=AzureOpenAISettings().responses_deployment_name, client=client, instructions="Answer questions about the world in one sentence.", name="Expert", diff --git a/python/samples/getting_started_with_agents/openai_responses/step2_responses_agent_thread_management.py b/python/samples/getting_started_with_agents/openai_responses/step2_responses_agent_thread_management.py index f11da53a0680..c881cf558eb6 100644 --- a/python/samples/getting_started_with_agents/openai_responses/step2_responses_agent_thread_management.py +++ b/python/samples/getting_started_with_agents/openai_responses/step2_responses_agent_thread_management.py @@ -2,6 +2,7 @@ import asyncio from semantic_kernel.agents import AzureResponsesAgent +from semantic_kernel.connectors.ai.open_ai import AzureOpenAISettings """ The following sample demonstrates how to create an OpenAI Responses Agent. @@ -24,13 +25,11 @@ async def main(): # 1. Create the client using Azure OpenAI resources and configuration - client, model = AzureResponsesAgent.setup_resources() - - print(f"Using model: {model}") + client = AzureResponsesAgent.create_client() # 2. Create a Semantic Kernel agent for the OpenAI Responses API agent = AzureResponsesAgent( - ai_model_id=model, + ai_model_id=AzureOpenAISettings().responses_deployment_name, client=client, instructions="Answer questions about from the user.", name="Joker", diff --git a/python/samples/getting_started_with_agents/openai_responses/step3_responses_agent_plugins.py b/python/samples/getting_started_with_agents/openai_responses/step3_responses_agent_plugins.py index 03489ca3aa9c..a75922cf579f 100644 --- a/python/samples/getting_started_with_agents/openai_responses/step3_responses_agent_plugins.py +++ b/python/samples/getting_started_with_agents/openai_responses/step3_responses_agent_plugins.py @@ -3,6 +3,7 @@ from typing import Annotated from semantic_kernel.agents import AzureResponsesAgent +from semantic_kernel.connectors.ai.open_ai import AzureOpenAISettings from semantic_kernel.functions import kernel_function """ @@ -48,11 +49,11 @@ def get_item_price( async def main(): # 1. Create the client using Azure OpenAI resources and configuration - client, model = AzureResponsesAgent.setup_resources() + client = AzureResponsesAgent.create_client() # 2. Create a Semantic Kernel agent for the OpenAI Responses API agent = AzureResponsesAgent( - ai_model_id=model, + ai_model_id=AzureOpenAISettings().responses_deployment_name, client=client, instructions="Answer questions about the menu.", name="Host", diff --git a/python/samples/getting_started_with_agents/openai_responses/step4_responses_agent_web_search.py b/python/samples/getting_started_with_agents/openai_responses/step4_responses_agent_web_search.py index 711423d2e46f..b66f3d471c14 100644 --- a/python/samples/getting_started_with_agents/openai_responses/step4_responses_agent_web_search.py +++ b/python/samples/getting_started_with_agents/openai_responses/step4_responses_agent_web_search.py @@ -2,6 +2,7 @@ import asyncio from semantic_kernel.agents import OpenAIResponsesAgent +from semantic_kernel.connectors.ai.open_ai import OpenAISettings """ The following sample demonstrates how to create an OpenAI Responses Agent. @@ -25,13 +26,13 @@ async def main(): # 1. Create the client using OpenAI resources and configuration # Note: the Azure OpenAI Responses API does not yet support the web search tool. - client, model = OpenAIResponsesAgent.setup_resources() + client = OpenAIResponsesAgent.create_client() web_search_tool = OpenAIResponsesAgent.configure_web_search_tool() # 2. Create a Semantic Kernel agent for the OpenAI Responses API agent = OpenAIResponsesAgent( - ai_model_id=model, + ai_model_id=OpenAISettings().responses_model_id, client=client, instructions="Answer questions from the user about performing web searches for news.", name="NewsSearcher", diff --git a/python/samples/getting_started_with_agents/openai_responses/step5_responses_agent_file_search.py b/python/samples/getting_started_with_agents/openai_responses/step5_responses_agent_file_search.py index c7f57ed99935..c3cb6bb51657 100644 --- a/python/samples/getting_started_with_agents/openai_responses/step5_responses_agent_file_search.py +++ b/python/samples/getting_started_with_agents/openai_responses/step5_responses_agent_file_search.py @@ -3,6 +3,7 @@ import os from semantic_kernel.agents import AzureResponsesAgent +from semantic_kernel.connectors.ai.open_ai import AzureOpenAISettings """ The following sample demonstrates how to create an OpenAI Responses Agent. @@ -27,7 +28,7 @@ async def main(): # 1. Create the client using Azure OpenAI resources and configuration - client, model = AzureResponsesAgent.setup_resources() + client = AzureResponsesAgent.create_client() pdf_file_path = os.path.join( os.path.dirname(os.path.dirname(os.path.realpath(__file__))), "resources", "employees.pdf" @@ -45,7 +46,7 @@ async def main(): # 2. Create a Semantic Kernel agent for the OpenAI Responses API agent = AzureResponsesAgent( - ai_model_id=model, + ai_model_id=AzureOpenAISettings().responses_deployment_name, client=client, instructions="Find answers to the user's questions in the provided file.", name="FileSearch", diff --git a/python/samples/getting_started_with_agents/openai_responses/step6_responses_agent_vision.py b/python/samples/getting_started_with_agents/openai_responses/step6_responses_agent_vision.py index 6b36dc69cdd1..c1b5ef4b68c2 100644 --- a/python/samples/getting_started_with_agents/openai_responses/step6_responses_agent_vision.py +++ b/python/samples/getting_started_with_agents/openai_responses/step6_responses_agent_vision.py @@ -4,6 +4,7 @@ import os from semantic_kernel.agents import OpenAIResponsesAgent +from semantic_kernel.connectors.ai.open_ai import OpenAISettings from semantic_kernel.contents import ChatMessageContent from semantic_kernel.contents.image_content import ImageContent from semantic_kernel.contents.text_content import TextContent @@ -22,14 +23,14 @@ async def main(): # 1. Create the client using OpenAI resources and configuration - client, model = OpenAIResponsesAgent.setup_resources() + client = OpenAIResponsesAgent.create_client() # 2. Define a file path for an image that will be used in the conversation file_path = os.path.join(os.path.dirname(os.path.dirname(os.path.realpath(__file__))), "resources", "cat.jpg") # 3. Create a Semantic Kernel agent for the OpenAI Responses API agent = OpenAIResponsesAgent( - ai_model_id=model, + ai_model_id=OpenAISettings().responses_model_id, client=client, instructions="Answer questions about the provided images.", name="VisionAgent", diff --git a/python/samples/getting_started_with_agents/openai_responses/step7_responses_agent_structured_outputs.py b/python/samples/getting_started_with_agents/openai_responses/step7_responses_agent_structured_outputs.py index 33aabacafebc..623db831db95 100644 --- a/python/samples/getting_started_with_agents/openai_responses/step7_responses_agent_structured_outputs.py +++ b/python/samples/getting_started_with_agents/openai_responses/step7_responses_agent_structured_outputs.py @@ -6,6 +6,7 @@ from pydantic import BaseModel from semantic_kernel.agents import OpenAIResponsesAgent +from semantic_kernel.connectors.ai.open_ai import OpenAISettings """ The following sample demonstrates how to create an OpenAI Responses Agent. @@ -34,11 +35,11 @@ class Reasoning(BaseModel): async def main(): # 1. Create the client using OpenAI resources and configuration # Note: the Azure OpenAI Responses API does not yet support structured outputs. - client, model = OpenAIResponsesAgent.setup_resources() + client = OpenAIResponsesAgent.create_client() # 2. Create a Semantic Kernel agent for the OpenAI Responses API agent = OpenAIResponsesAgent( - ai_model_id=model, + ai_model_id=OpenAISettings().responses_model_id, client=client, instructions="Answer the user's questions.", name="StructuredOutputsAgent", diff --git a/python/tests/unit/agents/openai_assistant/test_azure_assistant_agent.py b/python/tests/unit/agents/openai_assistant/test_azure_assistant_agent.py index b8f5d7a83bc6..a6906ed0da74 100644 --- a/python/tests/unit/agents/openai_assistant/test_azure_assistant_agent.py +++ b/python/tests/unit/agents/openai_assistant/test_azure_assistant_agent.py @@ -13,6 +13,7 @@ from openai.types.beta.threads.text_content_block import TextContentBlock from pydantic import BaseModel, ValidationError +from semantic_kernel.agents.agent import AgentRegistry from semantic_kernel.agents.open_ai.azure_assistant_agent import AzureAssistantAgent from semantic_kernel.agents.open_ai.openai_assistant_agent import AssistantAgentThread from semantic_kernel.agents.open_ai.run_polling_options import RunPollingOptions @@ -26,6 +27,28 @@ from semantic_kernel.prompt_template.prompt_template_config import PromptTemplateConfig +@pytest.fixture +def mock_azure_openai_client_and_definition(): + client = AsyncMock(spec=AsyncOpenAI) + client.beta = MagicMock() + client.beta.assistants = MagicMock() + + definition = AsyncMock(spec=Assistant) + definition.id = "agent123" + definition.name = "DeclarativeAgent" + definition.description = "desc" + definition.instructions = "test agent" + definition.tools = [] + definition.model = "gpt-4o" + definition.temperature = 1.0 + definition.top_p = 1.0 + definition.metadata = {} + + client.beta.assistants.create = AsyncMock(return_value=definition) + + return client, definition + + class SamplePlugin: @kernel_function def test_plugin(self, *args, **kwargs): @@ -325,3 +348,122 @@ async def test_retrieve_agent_missing_chat_deployment_name_throws(kernel, azure_ endpoint="https://test_endpoint.com", default_headers={"user_agent": "test"}, ) + + +async def test_azure_assistant_agent_from_yaml_minimal( + azure_openai_unit_test_env, mock_azure_openai_client_and_definition +): + spec = """ +type: azure_openai_assistant +name: MinimalAgent +model: + id: ${AzureOpenAI:ChatModelId} + connection: + api_key: ${AzureOpenAI:ApiKey} + endpoint: ${AzureOpenAI:Endpoint} +""" + client, definition = mock_azure_openai_client_and_definition + definition.name = "MinimalAgent" + agent = await AgentRegistry.create_from_yaml(spec, client=client) + assert isinstance(agent, AzureAssistantAgent) + assert agent.name == "MinimalAgent" + assert agent.definition.model == "gpt-4o" + + +async def test_azure_assistant_agent_with_tools(azure_openai_unit_test_env, mock_azure_openai_client_and_definition): + spec = """ +type: azure_openai_assistant +name: CodeAgent +description: Uses code interpreter. +model: + id: ${AzureOpenAI:ChatModelId} + connection: + api_key: ${AzureOpenAI:ApiKey} + endpoint: ${AzureOpenAI:Endpoint} +tools: + - type: code_interpreter + options: + file_ids: + - ${AzureOpenAI:FileId1} +""" + client, definition = mock_azure_openai_client_and_definition + definition.name = "CodeAgent" + # Optionally update definition.tools if you want to check the tools parsing + definition.tools = [{"type": "code_interpreter", "options": {"file_ids": ["file-123"]}}] + agent = await AgentRegistry.create_from_yaml(spec, client=client, extras={"AzureOpenAI:FileId1": "file-123"}) + assert agent.name == "CodeAgent" + assert any(t["type"] == "code_interpreter" for t in agent.definition.tools) + + +async def test_azure_assistant_agent_with_inputs_outputs_template( + azure_openai_unit_test_env, mock_azure_openai_client_and_definition +): + spec = """ +type: azure_openai_assistant +name: StoryAgent +model: + id: ${AzureOpenAI:ChatModelId} + connection: + api_key: ${AzureOpenAI:ApiKey} +inputs: + topic: + description: The story topic. + required: true + default: AI + length: + description: The length of story. + required: true + default: 2 +outputs: + output1: + description: The story. +template: + format: semantic-kernel +""" + client, definition = mock_azure_openai_client_and_definition + definition.name = "StoryAgent" + agent: AzureAssistantAgent = await AgentRegistry.create_from_yaml(spec, client=client) + assert agent.name == "StoryAgent" + assert agent.prompt_template.prompt_template_config.template_format == "semantic-kernel" + + +async def test_azure_assistant_agent_from_dict_missing_type(): + data = {"name": "NoType"} + with pytest.raises(AgentInitializationException, match="Missing 'type'"): + await AgentRegistry.create_from_dict(data) + + +async def test_azure_assistant_agent_from_yaml_missing_required_fields(): + spec = """ +type: azure_openai_assistant +""" + with pytest.raises(AgentInitializationException): + await AgentRegistry.create_from_yaml(spec) + + +async def test_agent_from_file_success(tmp_path, azure_openai_unit_test_env, mock_azure_openai_client_and_definition): + file_path = tmp_path / "spec.yaml" + file_path.write_text( + """ +type: azure_openai_assistant +name: DeclarativeAgent +model: + id: ${AzureOpenAI:ChatModelId} + connection: + api_key: ${AzureOpenAI:ApiKey} +""", + encoding="utf-8", + ) + client, _ = mock_azure_openai_client_and_definition + agent = await AgentRegistry.create_from_file(str(file_path), client=client) + assert agent.name == "DeclarativeAgent" + assert isinstance(agent, AzureAssistantAgent) + + +async def test_azure_assistant_agent_from_yaml_invalid_type(): + spec = """ +type: not_registered +name: ShouldFail +""" + with pytest.raises(AgentInitializationException, match="not registered"): + await AgentRegistry.create_from_yaml(spec) diff --git a/python/tests/unit/agents/openai_assistant/test_openai_assistant_agent.py b/python/tests/unit/agents/openai_assistant/test_openai_assistant_agent.py index e670ff42961e..a46183af4eb6 100644 --- a/python/tests/unit/agents/openai_assistant/test_openai_assistant_agent.py +++ b/python/tests/unit/agents/openai_assistant/test_openai_assistant_agent.py @@ -1,13 +1,14 @@ # Copyright (c) Microsoft. All rights reserved. -from unittest.mock import AsyncMock, patch +from unittest.mock import AsyncMock, MagicMock, patch import pytest from openai import AsyncOpenAI +from openai.types.beta.assistant import Assistant from pydantic import BaseModel, ValidationError from semantic_kernel.agents import OpenAIAssistantAgent -from semantic_kernel.agents.agent import AgentResponseItem +from semantic_kernel.agents.agent import AgentRegistry, AgentResponseItem from semantic_kernel.agents.open_ai.openai_assistant_agent import AssistantAgentThread from semantic_kernel.agents.open_ai.run_polling_options import RunPollingOptions from semantic_kernel.contents.chat_history import ChatHistory @@ -24,6 +25,28 @@ from semantic_kernel.prompt_template.prompt_template_config import PromptTemplateConfig +@pytest.fixture +def mock_openai_client_and_definition(): + client = AsyncMock(spec=AsyncOpenAI) + client.beta = MagicMock() + client.beta.assistants = MagicMock() + + definition = AsyncMock(spec=Assistant) + definition.id = "agent123" + definition.name = "DeclarativeAgent" + definition.description = "desc" + definition.instructions = "test agent" + definition.tools = [] + definition.model = "gpt-4o" + definition.temperature = 1.0 + definition.top_p = 1.0 + definition.metadata = {} + + client.beta.assistants.create = AsyncMock(return_value=definition) + + return client, definition + + class SamplePlugin: @kernel_function def test_plugin(self, *args, **kwargs): @@ -361,3 +384,118 @@ async def test_open_ai_agent_missing_chat_deployment_name_throws(kernel, openai_ api_key="test_api_key", default_headers={"user_agent": "test"}, ) + + +async def test_openai_assistant_agent_from_yaml_minimal(openai_unit_test_env, mock_openai_client_and_definition): + spec = """ +type: openai_assistant +name: MinimalAgent +model: + id: ${OpenAI:ChatModelId} + connection: + api_key: ${OpenAI:ApiKey} +""" + client, definition = mock_openai_client_and_definition + definition.name = "MinimalAgent" + agent = await AgentRegistry.create_from_yaml(spec, client=client) + assert isinstance(agent, OpenAIAssistantAgent) + assert agent.name == "MinimalAgent" + assert agent.definition.model == "gpt-4o" + + +async def test_openai_assistant_agent_with_tools(openai_unit_test_env, mock_openai_client_and_definition): + spec = """ +type: openai_assistant +name: CodeAgent +description: Uses code interpreter. +model: + id: ${OpenAI:ChatModelId} + connection: + api_key: ${OpenAI:ApiKey} +tools: + - type: code_interpreter + options: + file_ids: + - ${OpenAI:FileId1} +""" + client, definition = mock_openai_client_and_definition + definition.name = "CodeAgent" + # Optionally update definition.tools if you want to check the tools parsing + definition.tools = [{"type": "code_interpreter", "options": {"file_ids": ["file-123"]}}] + agent = await AgentRegistry.create_from_yaml(spec, client=client, extras={"OpenAI:FileId1": "file-123"}) + assert agent.name == "CodeAgent" + assert any(t["type"] == "code_interpreter" for t in agent.definition.tools) + + +async def test_openai_assistant_agent_with_inputs_outputs_template( + openai_unit_test_env, mock_openai_client_and_definition +): + spec = """ +type: openai_assistant +name: StoryAgent +model: + id: ${OpenAI:ChatModelId} + connection: + api_key: ${OpenAI:ApiKey} +inputs: + topic: + description: The story topic. + required: true + default: AI + length: + description: The length of story. + required: true + default: 2 +outputs: + output1: + description: The story. +template: + format: semantic-kernel +""" + client, definition = mock_openai_client_and_definition + definition.name = "StoryAgent" + agent: OpenAIAssistantAgent = await AgentRegistry.create_from_yaml(spec, client=client) + assert agent.name == "StoryAgent" + assert agent.prompt_template.prompt_template_config.template_format == "semantic-kernel" + + +async def test_openai_assistant_agent_from_dict_missing_type(): + data = {"name": "NoType"} + with pytest.raises(AgentInitializationException, match="Missing 'type'"): + await AgentRegistry.create_from_dict(data) + + +async def test_openai_assistant_agent_from_yaml_missing_required_fields(): + spec = """ +type: openai_assistant +""" + with pytest.raises(AgentInitializationException): + await AgentRegistry.create_from_yaml(spec) + + +async def test_agent_from_file_success(tmp_path, openai_unit_test_env, mock_openai_client_and_definition): + file_path = tmp_path / "spec.yaml" + file_path.write_text( + """ +type: openai_assistant +name: DeclarativeAgent +model: + id: ${OpenAI:ChatModelId} + connection: + api_key: ${OpenAI:ApiKey} +""", + encoding="utf-8", + ) + client, _ = mock_openai_client_and_definition + agent = await AgentRegistry.create_from_file(str(file_path), client=client) + assert agent.name == "DeclarativeAgent" + assert isinstance(agent, OpenAIAssistantAgent) + + +async def test_openai_assistant_agent_from_yaml_invalid_type(): + spec = """ +type: not_registered +name: ShouldFail +""" + with pytest.raises(AgentInitializationException, match="not registered"): + await AgentRegistry.create_from_yaml(spec) diff --git a/python/tests/unit/agents/openai_responses/test_openai_responses_agent.py b/python/tests/unit/agents/openai_responses/test_openai_responses_agent.py index a13e9ba6e854..f9dc98685521 100644 --- a/python/tests/unit/agents/openai_responses/test_openai_responses_agent.py +++ b/python/tests/unit/agents/openai_responses/test_openai_responses_agent.py @@ -6,6 +6,7 @@ from openai import AsyncOpenAI from pydantic import BaseModel, ValidationError +from semantic_kernel.agents.agent import AgentRegistry from semantic_kernel.agents.open_ai.openai_responses_agent import OpenAIResponsesAgent, ResponsesAgentThread from semantic_kernel.agents.open_ai.run_polling_options import RunPollingOptions from semantic_kernel.contents.chat_message_content import ChatMessageContent @@ -247,3 +248,120 @@ async def test_open_ai_agent_missing_chat_deployment_name_throws(kernel, openai_ api_key="test_api_key", default_headers={"user_agent": "test"}, ) + + +async def test_openai_assistant_agent_from_yaml_minimal(openai_unit_test_env, mock_openai_client_and_definition): + spec = """ +type: openai_responses_agent +name: MinimalAgent +model: + id: ${OpenAI:ChatModelId} + connection: + api_key: ${OpenAI:ApiKey} +""" + client, definition = mock_openai_client_and_definition + definition.name = "MinimalAgent" + agent: OpenAIResponsesAgent = await AgentRegistry.create_from_yaml(spec, client=client) + assert isinstance(agent, OpenAIResponsesAgent) + assert agent.name == "MinimalAgent" + assert agent.definition.model == "gpt-4o" + + +async def test_openai_assistant_agent_with_tools(openai_unit_test_env, mock_openai_client_and_definition): + spec = """ +type: openai_responses_agent +name: CodeAgent +description: Uses code interpreter. +model: + id: ${OpenAI:ChatModelId} + connection: + api_key: ${OpenAI:ApiKey} +tools: + - type: code_interpreter + options: + file_ids: + - ${OpenAI:FileId1} +""" + client, definition = mock_openai_client_and_definition + definition.name = "CodeAgent" + # Optionally update definition.tools if you want to check the tools parsing + definition.tools = [{"type": "code_interpreter", "options": {"file_ids": ["file-123"]}}] + agent: OpenAIResponsesAgent = await AgentRegistry.create_from_yaml( + spec, client=client, extras={"OpenAI:FileId1": "file-123"} + ) + assert agent.name == "CodeAgent" + assert any(t["type"] == "code_interpreter" for t in agent.definition.tools) + + +async def test_openai_assistant_agent_with_inputs_outputs_template( + openai_unit_test_env, mock_openai_client_and_definition +): + spec = """ +type: openai_responses_agent +name: StoryAgent +model: + id: ${OpenAI:ChatModelId} + connection: + api_key: ${OpenAI:ApiKey} +inputs: + topic: + description: The story topic. + required: true + default: AI + length: + description: The length of story. + required: true + default: 2 +outputs: + output1: + description: The story. +template: + format: semantic-kernel +""" + client, definition = mock_openai_client_and_definition + definition.name = "StoryAgent" + agent: OpenAIResponsesAgent = await AgentRegistry.create_from_yaml(spec, client=client) + assert agent.name == "StoryAgent" + assert agent.prompt_template.prompt_template_config.template_format == "semantic-kernel" + + +async def test_openai_assistant_agent_from_dict_missing_type(): + data = {"name": "NoType"} + with pytest.raises(AgentInitializationException, match="Missing 'type'"): + await AgentRegistry.create_from_dict(data) + + +async def test_openai_assistant_agent_from_yaml_missing_required_fields(): + spec = """ +type: openai_responses_agent +""" + with pytest.raises(AgentInitializationException): + await AgentRegistry.create_from_yaml(spec) + + +async def test_agent_from_file_success(tmp_path, openai_unit_test_env, mock_openai_client_and_definition): + file_path = tmp_path / "spec.yaml" + file_path.write_text( + """ +type: openai_responses_agent +name: DeclarativeAgent +model: + id: ${OpenAI:ChatModelId} + connection: + api_key: ${OpenAI:ApiKey} +""", + encoding="utf-8", + ) + client, _ = mock_openai_client_and_definition + agent: OpenAIResponsesAgent = await AgentRegistry.create_from_file(str(file_path), client=client) + assert agent.name == "DeclarativeAgent" + assert isinstance(agent, OpenAIResponsesAgent) + + +async def test_openai_assistant_agent_from_yaml_invalid_type(): + spec = """ +type: not_registered +name: ShouldFail +""" + with pytest.raises(AgentInitializationException, match="not registered"): + await AgentRegistry.create_from_yaml(spec) From bb81c781273636dbb341dc9a26d003160e6504bf Mon Sep 17 00:00:00 2001 From: Evan Mattson Date: Thu, 22 May 2025 20:27:09 +0900 Subject: [PATCH 09/18] Cleanup --- python/samples/concepts/README.md | 16 +++ ..._assistant_declarative_code_interpreter.py | 4 +- ...penai_assistant_declarative_file_search.py | 4 +- ..._declarative_function_calling_from_file.py | 2 +- ...openai_assistant_declarative_templating.py | 4 +- ...tant_declarative_with_existing_agent_id.py | 4 +- ..._assistant_declarative_code_interpreter.py | 4 +- ...penai_assistant_declarative_file_search.py | 4 +- ..._declarative_function_calling_from_file.py | 2 +- ...openai_assistant_declarative_templating.py | 4 +- ...tant_declarative_with_existing_agent_id.py | 4 +- ...responses_agent_declarative_file_search.py | 19 ++-- ..._declarative_function_calling_from_file.py | 2 +- ..._responses_agent_declarative_templating.py | 6 +- ...responses_agent_declarative_file_search.py | 6 +- ..._declarative_function_calling_from_file.py | 2 +- ..._responses_agent_declarative_templating.py | 6 +- ..._responses_agent_declarative_web_search.py | 6 +- .../getting_started_with_agents/README.md | 2 + ...tive.py => step6_assistant_declarative.py} | 0 ...tep7_assistant_azure_openai_declarative.py | 98 ------------------- .../agents/open_ai/openai_responses_agent.py | 2 +- .../test_azure_assistant_agent.py | 1 - .../test_openai_assistant_agent.py | 1 - .../test_openai_responses_agent.py | 47 +++++---- 25 files changed, 83 insertions(+), 167 deletions(-) rename python/samples/getting_started_with_agents/openai_assistant/{step6_assistant_openai_declarative.py => step6_assistant_declarative.py} (100%) delete mode 100644 python/samples/getting_started_with_agents/openai_assistant/step7_assistant_azure_openai_declarative.py diff --git a/python/samples/concepts/README.md b/python/samples/concepts/README.md index a0a0488d870f..304aa6c1dc73 100644 --- a/python/samples/concepts/README.md +++ b/python/samples/concepts/README.md @@ -63,10 +63,20 @@ #### [OpenAI Assistant Agent](../../semantic_kernel/agents/open_ai/openai_assistant_agent.py) +- [Azure OpenAI Assistant Declarative Code Interpreter](./agents/openai_assistant/azure_openai_assistant_declarative_code_interpreter.py) +- [Azure OpenAI Assistant Declarative File Search](./agents/openai_assistant/azure_openai_assistant_declarative_file_search.py) +- [Azure OpenAI Assistant Declarative Function Calling From File](./agents/openai_assistant/azure_openai_assistant_declarative_function_calling_from_file.py) +- [Azure OpenAI Assistant Declarative Templating](./agents/openai_assistant/azure_openai_assistant_declarative_templating.py) +- [Azure OpenAI Assistant Declarative With Existing Agent ID](./agents/openai_assistant/azure_openai_assistant_declarative_with_existing_agent_id.py) - [OpenAI Assistant Auto Function Invocation Filter Streaming](./agents/openai_assistant/openai_assistant_auto_func_invocation_filter_streaming.py) - [OpenAI Assistant Auto Function Invocation Filter](./agents/openai_assistant/openai_assistant_auto_func_invocation_filter.py) - [OpenAI Assistant Chart Maker Streaming](./agents/openai_assistant/openai_assistant_chart_maker_streaming.py) - [OpenAI Assistant Chart Maker](./agents/openai_assistant/openai_assistant_chart_maker.py) +- [OpenAI Assistant Declarative Code Interpreter](./agents/openai_assistant/openai_assistant_declarative_code_interpreter.py) +- [OpenAI Assistant Declarative File Search](./agents/openai_assistant/openai_assistant_declarative_file_search.py) +- [OpenAI Assistant Declarative Function Calling From File](./agents/openai_assistant/openai_assistant_declarative_function_calling_from_file.py) +- [OpenAI Assistant Declarative Templating](./agents/openai_assistant/openai_assistant_declarative_templating.py) +- [OpenAI Assistant Declarative With Existing Agent ID](./agents/openai_assistant/openai_assistant_declarative_with_existing_agent_id.py) - [OpenAI Assistant File Manipulation Streaming](./agents/openai_assistant/openai_assistant_file_manipulation_streaming.py) - [OpenAI Assistant File Manipulation](./agents/openai_assistant/openai_assistant_file_manipulation.py) - [OpenAI Assistant Retrieval](./agents/openai_assistant/openai_assistant_retrieval.py) @@ -79,6 +89,12 @@ #### [OpenAI Responses Agent](../../semantic_kernel/agents/open_ai/openai_responses_agent.py) +- [Azure OpenAI Responses Agent Declarative File Search](./agents/openai_responses/azure_openai_responses_agent_declarative_file_search.py) +- [Azure OpenAI Responses Agent Declarative Function Calling From File](./agents/openai_responses/azure_openai_responses_agent_declarative_function_calling_from_file.py) +- [Azure OpenAI Responses Agent Declarative Templating](./agents/openai_responses/azure_openai_responses_agent_declarative_templating.py) +- [OpenAI Responses Agent Declarative File Search](./agents/openai_responses/openai_responses_agent_declarative_file_search.py) +- [OpenAI Responses Agent Declarative Function Calling From File](./agents/openai_responses/openai_responses_agent_declarative_function_calling_from_file.py) +- [OpenAI Responses Agent Declarative Web Search](./agents/openai_responses/openai_responses_agent_declarative_web_search.py) - [OpenAI Responses Message Callback Streaming](./agents/openai_responses/responses_agent_message_callback_streaming.py) - [OpenAI Responses Message Callback](./agents/openai_responses/responses_agent_message_callback.py) - [OpenAI Responses File Search Streaming](./agents/openai_responses/responses_agent_file_search_streaming.py) diff --git a/python/samples/concepts/agents/openai_assistant/azure_openai_assistant_declarative_code_interpreter.py b/python/samples/concepts/agents/openai_assistant/azure_openai_assistant_declarative_code_interpreter.py index 807fd085b54e..626914056243 100644 --- a/python/samples/concepts/agents/openai_assistant/azure_openai_assistant_declarative_code_interpreter.py +++ b/python/samples/concepts/agents/openai_assistant/azure_openai_assistant_declarative_code_interpreter.py @@ -48,9 +48,9 @@ async def main(): file = await client.files.create(file=file, purpose="assistants") try: - # Create the AzureAI Agent from the YAML spec + # Create the Assistant Agent from the YAML spec # Note: the extras can be provided in the short-format (shown below) or - # in the long-format (as shown in the YAML spec, with the `AzureAI:` prefix). + # in the long-format (as shown in the YAML spec, with the `AzureOpenAI:` prefix). # The short-format is used here for brevity agent: AzureAssistantAgent = await AgentRegistry.create_from_yaml( yaml_str=spec, diff --git a/python/samples/concepts/agents/openai_assistant/azure_openai_assistant_declarative_file_search.py b/python/samples/concepts/agents/openai_assistant/azure_openai_assistant_declarative_file_search.py index 31c04f5840ab..5d799466c6d0 100644 --- a/python/samples/concepts/agents/openai_assistant/azure_openai_assistant_declarative_file_search.py +++ b/python/samples/concepts/agents/openai_assistant/azure_openai_assistant_declarative_file_search.py @@ -55,9 +55,9 @@ async def main(): ) try: - # Create the AzureAI Agent from the YAML spec + # Create the Assistant Agent from the YAML spec # Note: the extras can be provided in the short-format (shown below) or - # in the long-format (as shown in the YAML spec, with the `AzureAI:` prefix). + # in the long-format (as shown in the YAML spec, with the `AzureOpenAI:` prefix). # The short-format is used here for brevity agent: AzureAssistantAgent = await AgentRegistry.create_from_yaml( yaml_str=spec, diff --git a/python/samples/concepts/agents/openai_assistant/azure_openai_assistant_declarative_function_calling_from_file.py b/python/samples/concepts/agents/openai_assistant/azure_openai_assistant_declarative_function_calling_from_file.py index 609e1a258137..40ab90f31e69 100644 --- a/python/samples/concepts/agents/openai_assistant/azure_openai_assistant_declarative_function_calling_from_file.py +++ b/python/samples/concepts/agents/openai_assistant/azure_openai_assistant_declarative_function_calling_from_file.py @@ -45,7 +45,7 @@ async def main(): "azure_assistant_spec.yaml", ) - # Create the AzureAI Agent from the YAML spec + # Create the Assistant Agent from the YAML spec agent: AzureAssistantAgent = await AgentRegistry.create_from_file( file_path, plugins=[MenuPlugin()], diff --git a/python/samples/concepts/agents/openai_assistant/azure_openai_assistant_declarative_templating.py b/python/samples/concepts/agents/openai_assistant/azure_openai_assistant_declarative_templating.py index 4fa9423ed84b..56149b1a6913 100644 --- a/python/samples/concepts/agents/openai_assistant/azure_openai_assistant_declarative_templating.py +++ b/python/samples/concepts/agents/openai_assistant/azure_openai_assistant_declarative_templating.py @@ -45,9 +45,9 @@ async def main(): client = AzureAssistantAgent.create_client() try: - # Create the AzureAI Agent from the YAML spec + # Create the Assistant Agent from the YAML spec # Note: the extras can be provided in the short-format (shown below) or - # in the long-format (as shown in the YAML spec, with the `AzureAI:` prefix). + # in the long-format (as shown in the YAML spec, with the `AzureOpenAI:` prefix). # The short-format is used here for brevity agent: AzureAssistantAgent = await AgentRegistry.create_from_yaml( yaml_str=spec, diff --git a/python/samples/concepts/agents/openai_assistant/azure_openai_assistant_declarative_with_existing_agent_id.py b/python/samples/concepts/agents/openai_assistant/azure_openai_assistant_declarative_with_existing_agent_id.py index ae2f25a74ab2..75d4c305ab94 100644 --- a/python/samples/concepts/agents/openai_assistant/azure_openai_assistant_declarative_with_existing_agent_id.py +++ b/python/samples/concepts/agents/openai_assistant/azure_openai_assistant_declarative_with_existing_agent_id.py @@ -20,9 +20,9 @@ async def main(): try: client = AzureAssistantAgent.create_client() - # Create the AzureAI Agent from the YAML spec + # Create the Assistant Agent from the YAML spec # Note: the extras can be provided in the short-format (shown below) or - # in the long-format (as shown in the YAML spec, with the `AzureAI:` prefix). + # in the long-format (as shown in the YAML spec, with the `AzureOpenAI:` prefix). # The short-format is used here for brevity agent: AzureAssistantAgent = await AgentRegistry.create_from_yaml( yaml_str=spec, diff --git a/python/samples/concepts/agents/openai_assistant/openai_assistant_declarative_code_interpreter.py b/python/samples/concepts/agents/openai_assistant/openai_assistant_declarative_code_interpreter.py index a89fc9c69679..3a51d92e0691 100644 --- a/python/samples/concepts/agents/openai_assistant/openai_assistant_declarative_code_interpreter.py +++ b/python/samples/concepts/agents/openai_assistant/openai_assistant_declarative_code_interpreter.py @@ -48,9 +48,9 @@ async def main(): file = await client.files.create(file=file, purpose="assistants") try: - # Create the AzureAI Agent from the YAML spec + # Create the Assistant Agent from the YAML spec # Note: the extras can be provided in the short-format (shown below) or - # in the long-format (as shown in the YAML spec, with the `AzureAI:` prefix). + # in the long-format (as shown in the YAML spec, with the `OpenAI:` prefix). # The short-format is used here for brevity agent: OpenAIAssistantAgent = await AgentRegistry.create_from_yaml( yaml_str=spec, diff --git a/python/samples/concepts/agents/openai_assistant/openai_assistant_declarative_file_search.py b/python/samples/concepts/agents/openai_assistant/openai_assistant_declarative_file_search.py index e06ae7ea63a4..5870d072fe15 100644 --- a/python/samples/concepts/agents/openai_assistant/openai_assistant_declarative_file_search.py +++ b/python/samples/concepts/agents/openai_assistant/openai_assistant_declarative_file_search.py @@ -55,9 +55,9 @@ async def main(): ) try: - # Create the AzureAI Agent from the YAML spec + # Create the Assistant Agent from the YAML spec # Note: the extras can be provided in the short-format (shown below) or - # in the long-format (as shown in the YAML spec, with the `AzureAI:` prefix). + # in the long-format (as shown in the YAML spec, with the `OpenAI:` prefix). # The short-format is used here for brevity agent: OpenAIAssistantAgent = await AgentRegistry.create_from_yaml( yaml_str=spec, diff --git a/python/samples/concepts/agents/openai_assistant/openai_assistant_declarative_function_calling_from_file.py b/python/samples/concepts/agents/openai_assistant/openai_assistant_declarative_function_calling_from_file.py index 2a9dad7d1a8f..08123523f0f0 100644 --- a/python/samples/concepts/agents/openai_assistant/openai_assistant_declarative_function_calling_from_file.py +++ b/python/samples/concepts/agents/openai_assistant/openai_assistant_declarative_function_calling_from_file.py @@ -45,7 +45,7 @@ async def main(): "openai_assistant_spec.yaml", ) - # Create the AzureAI Agent from the YAML spec + # Create the Assistant Agent from the YAML spec agent: OpenAIAssistantAgent = await AgentRegistry.create_from_file( file_path, plugins=[MenuPlugin()], diff --git a/python/samples/concepts/agents/openai_assistant/openai_assistant_declarative_templating.py b/python/samples/concepts/agents/openai_assistant/openai_assistant_declarative_templating.py index e514d5771aa2..9eceb95c7cc3 100644 --- a/python/samples/concepts/agents/openai_assistant/openai_assistant_declarative_templating.py +++ b/python/samples/concepts/agents/openai_assistant/openai_assistant_declarative_templating.py @@ -43,9 +43,9 @@ async def main(): client = OpenAIAssistantAgent.create_client() try: - # Create the AzureAI Agent from the YAML spec + # Create the Assistant Agent from the YAML spec # Note: the extras can be provided in the short-format (shown below) or - # in the long-format (as shown in the YAML spec, with the `AzureAI:` prefix). + # in the long-format (as shown in the YAML spec, with the `OpenAI:` prefix). # The short-format is used here for brevity agent: OpenAIAssistantAgent = await AgentRegistry.create_from_yaml( yaml_str=spec, diff --git a/python/samples/concepts/agents/openai_assistant/openai_assistant_declarative_with_existing_agent_id.py b/python/samples/concepts/agents/openai_assistant/openai_assistant_declarative_with_existing_agent_id.py index aaff6ab53d2d..130917e19341 100644 --- a/python/samples/concepts/agents/openai_assistant/openai_assistant_declarative_with_existing_agent_id.py +++ b/python/samples/concepts/agents/openai_assistant/openai_assistant_declarative_with_existing_agent_id.py @@ -22,9 +22,9 @@ async def main(): client = OpenAIAssistantAgent.create_client() try: - # Create the AzureAI Agent from the YAML spec + # Create the Assistant Agent from the YAML spec # Note: the extras can be provided in the short-format (shown below) or - # in the long-format (as shown in the YAML spec, with the `AzureAI:` prefix). + # in the long-format (as shown in the YAML spec, with the `OpenAI:` prefix). # The short-format is used here for brevity agent: OpenAIAssistantAgent = await AgentRegistry.create_from_yaml( yaml_str=spec, diff --git a/python/samples/concepts/agents/openai_responses/azure_openai_responses_agent_declarative_file_search.py b/python/samples/concepts/agents/openai_responses/azure_openai_responses_agent_declarative_file_search.py index 17403c35d81a..3d3438f72ff0 100644 --- a/python/samples/concepts/agents/openai_responses/azure_openai_responses_agent_declarative_file_search.py +++ b/python/samples/concepts/agents/openai_responses/azure_openai_responses_agent_declarative_file_search.py @@ -3,7 +3,7 @@ import asyncio import os -from semantic_kernel.agents import AzureAssistantAgent +from semantic_kernel.agents import AzureResponsesAgent from semantic_kernel.agents.agent import AgentRegistry """ @@ -35,8 +35,8 @@ async def main(): - # Setup the OpenAI Assistant client - client = AzureAssistantAgent.create_client() + # Setup the Azure OpenAI client + client = AzureResponsesAgent.create_client() # Read and upload the file to the OpenAI AI service pdf_file_path = os.path.join( @@ -45,24 +45,24 @@ async def main(): "file_search", "employees.pdf", ) - # Upload the pdf file to the assistant service + # Upload the pdf file to the server with open(pdf_file_path, "rb") as file: file = await client.files.create(file=file, purpose="assistants") vector_store = await client.vector_stores.create( - name="assistant_file_search", + name="responses_file_search", file_ids=[file.id], ) try: - # Create the AzureAI Agent from the YAML spec + # Create the Responses Agent from the YAML spec # Note: the extras can be provided in the short-format (shown below) or - # in the long-format (as shown in the YAML spec, with the `AzureAI:` prefix). + # in the long-format (as shown in the YAML spec, with the `AzureOpenAI:` prefix). # The short-format is used here for brevity - agent: AzureAssistantAgent = await AgentRegistry.create_from_yaml( + agent: AzureResponsesAgent = await AgentRegistry.create_from_yaml( yaml_str=spec, client=client, - extras={"OpenAI:VectorStoreId": vector_store.id}, + extras={"AzureOpenAI:VectorStoreId": vector_store.id}, ) # Define the task for the agent @@ -77,7 +77,6 @@ async def main(): print(f"# {response.name}: {response}") finally: # Cleanup: Delete the agent, vector store, and file - await client.beta.assistants.delete(agent.id) await client.vector_stores.delete(vector_store.id) await client.files.delete(file.id) diff --git a/python/samples/concepts/agents/openai_responses/azure_openai_responses_agent_declarative_function_calling_from_file.py b/python/samples/concepts/agents/openai_responses/azure_openai_responses_agent_declarative_function_calling_from_file.py index abf09bda840e..e0dfa7a8bcef 100644 --- a/python/samples/concepts/agents/openai_responses/azure_openai_responses_agent_declarative_function_calling_from_file.py +++ b/python/samples/concepts/agents/openai_responses/azure_openai_responses_agent_declarative_function_calling_from_file.py @@ -45,7 +45,7 @@ async def main(): "azure_assistant_spec.yaml", ) - # Create the AzureAI Agent from the YAML spec + # Create the Responses Agent from the YAML spec agent: AzureResponsesAgent = await AgentRegistry.create_from_file( file_path, plugins=[MenuPlugin()], diff --git a/python/samples/concepts/agents/openai_responses/azure_openai_responses_agent_declarative_templating.py b/python/samples/concepts/agents/openai_responses/azure_openai_responses_agent_declarative_templating.py index c2b27bbbca3e..8994e2b93748 100644 --- a/python/samples/concepts/agents/openai_responses/azure_openai_responses_agent_declarative_templating.py +++ b/python/samples/concepts/agents/openai_responses/azure_openai_responses_agent_declarative_templating.py @@ -41,13 +41,13 @@ async def main(): - # Setup the OpenAI Assistant client + # Setup the Azure OpenAI client client = AzureResponsesAgent.create_client() try: - # Create the AzureAI Agent from the YAML spec + # Create the Responses Agent from the YAML spec # Note: the extras can be provided in the short-format (shown below) or - # in the long-format (as shown in the YAML spec, with the `AzureAI:` prefix). + # in the long-format (as shown in the YAML spec, with the `AzureOpenAI:` prefix). # The short-format is used here for brevity agent: AzureResponsesAgent = await AgentRegistry.create_from_yaml( yaml_str=spec, diff --git a/python/samples/concepts/agents/openai_responses/openai_responses_agent_declarative_file_search.py b/python/samples/concepts/agents/openai_responses/openai_responses_agent_declarative_file_search.py index 8188462ac468..151da4016601 100644 --- a/python/samples/concepts/agents/openai_responses/openai_responses_agent_declarative_file_search.py +++ b/python/samples/concepts/agents/openai_responses/openai_responses_agent_declarative_file_search.py @@ -35,7 +35,7 @@ async def main(): - # Setup the OpenAI Assistant client + # Setup the OpenAI Responses client client = OpenAIResponsesAgent.create_client() # Read and upload the file to the OpenAI AI service @@ -55,9 +55,9 @@ async def main(): ) try: - # Create the AzureAI Agent from the YAML spec + # Create the Responses Agent from the YAML spec # Note: the extras can be provided in the short-format (shown below) or - # in the long-format (as shown in the YAML spec, with the `AzureAI:` prefix). + # in the long-format (as shown in the YAML spec, with the `OpenAI:` prefix). # The short-format is used here for brevity agent: OpenAIResponsesAgent = await AgentRegistry.create_from_yaml( yaml_str=spec, diff --git a/python/samples/concepts/agents/openai_responses/openai_responses_agent_declarative_function_calling_from_file.py b/python/samples/concepts/agents/openai_responses/openai_responses_agent_declarative_function_calling_from_file.py index e33b21a8fb3e..3851482f0324 100644 --- a/python/samples/concepts/agents/openai_responses/openai_responses_agent_declarative_function_calling_from_file.py +++ b/python/samples/concepts/agents/openai_responses/openai_responses_agent_declarative_function_calling_from_file.py @@ -45,7 +45,7 @@ async def main(): "openai_assistant_spec.yaml", ) - # Create the AzureAI Agent from the YAML spec + # Create the Responses Agent from the YAML spec agent: OpenAIResponsesAgent = await AgentRegistry.create_from_file( file_path, plugins=[MenuPlugin()], diff --git a/python/samples/concepts/agents/openai_responses/openai_responses_agent_declarative_templating.py b/python/samples/concepts/agents/openai_responses/openai_responses_agent_declarative_templating.py index cfbd57f67f15..a5dd392a679f 100644 --- a/python/samples/concepts/agents/openai_responses/openai_responses_agent_declarative_templating.py +++ b/python/samples/concepts/agents/openai_responses/openai_responses_agent_declarative_templating.py @@ -39,13 +39,13 @@ async def main(): - # Setup the OpenAI Assistant client + # Setup the OpenAI client client = OpenAIResponsesAgent.create_client() try: - # Create the AzureAI Agent from the YAML spec + # Create the Responses Agent from the YAML spec # Note: the extras can be provided in the short-format (shown below) or - # in the long-format (as shown in the YAML spec, with the `AzureAI:` prefix). + # in the long-format (as shown in the YAML spec, with the `OpenAI:` prefix). # The short-format is used here for brevity agent: OpenAIResponsesAgent = await AgentRegistry.create_from_yaml( yaml_str=spec, diff --git a/python/samples/concepts/agents/openai_responses/openai_responses_agent_declarative_web_search.py b/python/samples/concepts/agents/openai_responses/openai_responses_agent_declarative_web_search.py index db5d4e55ddc4..233f89ba7662 100644 --- a/python/samples/concepts/agents/openai_responses/openai_responses_agent_declarative_web_search.py +++ b/python/samples/concepts/agents/openai_responses/openai_responses_agent_declarative_web_search.py @@ -33,13 +33,13 @@ async def main(): - # Setup the OpenAI Assistant client + # Setup the OpenAI client client = OpenAIResponsesAgent.create_client() try: - # Create the AzureAI Agent from the YAML spec + # Create the Responses Agent from the YAML spec # Note: the extras can be provided in the short-format (shown below) or - # in the long-format (as shown in the YAML spec, with the `AzureAI:` prefix). + # in the long-format (as shown in the YAML spec, with the `OpenAI:` prefix). # The short-format is used here for brevity agent: OpenAIResponsesAgent = await AgentRegistry.create_from_yaml( yaml_str=spec, diff --git a/python/samples/getting_started_with_agents/README.md b/python/samples/getting_started_with_agents/README.md index fdc7e8aa5996..16091f64b026 100644 --- a/python/samples/getting_started_with_agents/README.md +++ b/python/samples/getting_started_with_agents/README.md @@ -59,6 +59,7 @@ Example|Description [step3_assistant_vision](../getting_started_with_agents/openai_assistant/step3_assistant_vision.py)|How to provide an image as input to an OpenAI Assistant agent. [step4_assistant_tool_code_interpreter](../getting_started_with_agents/openai_assistant/step4_assistant_tool_code_interpreter.py)|How to use the code-interpreter tool for an OpenAI Assistant agent. [step5_assistant_tool_file_search](../getting_started_with_agents/openai_assistant/step5_assistant_tool_file_search.py)|How to use the file-search tool for an OpenAI Assistant agent. +[step6_assistant](../getting_started_with_agents/openai_assistant/step6_assistant_declarative.py)|How to create an Assistant Agent from a declarative spec. ## OpenAI Responses Agent @@ -71,6 +72,7 @@ Example|Description [step5_responses_agent_file_search](../getting_started_with_agents/openai_responses/step5_responses_agent_file_search.py)|How to use the file-search tool with an OpenAI Responses agent. [step6_responses_agent_vision](../getting_started_with_agents/openai_responses/step6_responses_agent_vision.py)|How to provide an image as input to an OpenAI Responses agent. [step7_responses_agent_structured_outputs](../getting_started_with_agents/openai_responses/step7_responses_agent_structured_outputs.py)|How to use have an OpenAI Responses agent use structured outputs. +[step8_assistant](../getting_started_with_agents/openai_responses/step8_responses_agent_declarative.py)|How to create a Responses Agent from a declarative spec. ## Multi-Agent Orchestration diff --git a/python/samples/getting_started_with_agents/openai_assistant/step6_assistant_openai_declarative.py b/python/samples/getting_started_with_agents/openai_assistant/step6_assistant_declarative.py similarity index 100% rename from python/samples/getting_started_with_agents/openai_assistant/step6_assistant_openai_declarative.py rename to python/samples/getting_started_with_agents/openai_assistant/step6_assistant_declarative.py diff --git a/python/samples/getting_started_with_agents/openai_assistant/step7_assistant_azure_openai_declarative.py b/python/samples/getting_started_with_agents/openai_assistant/step7_assistant_azure_openai_declarative.py deleted file mode 100644 index 19f44d3dca0b..000000000000 --- a/python/samples/getting_started_with_agents/openai_assistant/step7_assistant_azure_openai_declarative.py +++ /dev/null @@ -1,98 +0,0 @@ -# Copyright (c) Microsoft. All rights reserved. -import asyncio -from typing import Annotated - -from semantic_kernel.agents import AgentRegistry, AzureAssistantAgent -from semantic_kernel.functions import kernel_function - -""" -The following sample demonstrates how to create an Azure OpenAI Assistant agent that -answers questions about a sample menu using a Semantic Kernel Plugin. The agent is created -using a yaml declarative spec. -""" - -# Simulate a conversation with the agent -USER_INPUTS = [ - "Hello", - "What is the special soup?", - "How much does that cost?", - "Thank you", -] - -# Define the YAML string for the sample -SPEC = """ -type: azure_openai_assistant -name: Host -instructions: Respond politely to the user's questions. -model: - id: ${AzureOpenAI:ChatModelId} -tools: - - id: MenuPlugin.get_specials - type: function - - id: MenuPlugin.get_item_price - type: function -""" - - -# Define a sample plugin for the sample -class MenuPlugin: - """A sample Menu Plugin used for the concept sample.""" - - @kernel_function(description="Provides a list of specials from the menu.") - def get_specials(self) -> Annotated[str, "Returns the specials from the menu."]: - return """ - Special Soup: Clam Chowder - Special Salad: Cobb Salad - Special Drink: Chai Tea - """ - - @kernel_function(description="Provides the price of the requested menu item.") - def get_item_price( - self, menu_item: Annotated[str, "The name of the menu item."] - ) -> Annotated[str, "Returns the price of the menu item."]: - return "$9.99" - - -async def main(): - # 1. Create the client using Azure OpenAI resources and configuration - client = AzureAssistantAgent.create_client() - - # 2. Create the assistant on the Azure OpenAI service - agent: AzureAssistantAgent = await AgentRegistry.create_from_yaml( - SPEC, - plugins=[MenuPlugin()], - client=client, - ) - - # 3. Create a thread for the agent - # If no thread is provided, a new thread will be - # created and returned with the initial response - thread = None - - try: - for user_input in USER_INPUTS: - print(f"# User: {user_input}") - # 4. Invoke the agent for the specified thread for response - async for response in agent.invoke( - messages=user_input, - thread=thread, - ): - print(f"# {response.name}: {response}") - thread = response.thread - finally: - # 5. Clean up the resources - await thread.delete() if thread else None - await agent.client.beta.assistants.delete(assistant_id=agent.id) - - """ - Sample Output: - - # User: Hello - # Agent: Hello! How can I assist you today? - # User: What is the special soup? - # ... - """ - - -if __name__ == "__main__": - asyncio.run(main()) diff --git a/python/semantic_kernel/agents/open_ai/openai_responses_agent.py b/python/semantic_kernel/agents/open_ai/openai_responses_agent.py index 830e307fceef..89c5cc0ecaac 100644 --- a/python/semantic_kernel/agents/open_ai/openai_responses_agent.py +++ b/python/semantic_kernel/agents/open_ai/openai_responses_agent.py @@ -586,7 +586,7 @@ def resolve_placeholders( raise AgentInitializationException(f"Expected OpenAISettings, got {type(settings).__name__}") field_mapping.update({ - "ChatModelId": cls._get_setting(getattr(settings, "chat_model_id", None)), + "ChatModelId": cls._get_setting(getattr(settings, "responses_model_id", None)), "AgentId": cls._get_setting(getattr(settings, "agent_id", None)), "ApiKey": cls._get_setting(getattr(settings, "api_key", None)), }) diff --git a/python/tests/unit/agents/openai_assistant/test_azure_assistant_agent.py b/python/tests/unit/agents/openai_assistant/test_azure_assistant_agent.py index a6906ed0da74..1642b4256f71 100644 --- a/python/tests/unit/agents/openai_assistant/test_azure_assistant_agent.py +++ b/python/tests/unit/agents/openai_assistant/test_azure_assistant_agent.py @@ -388,7 +388,6 @@ async def test_azure_assistant_agent_with_tools(azure_openai_unit_test_env, mock """ client, definition = mock_azure_openai_client_and_definition definition.name = "CodeAgent" - # Optionally update definition.tools if you want to check the tools parsing definition.tools = [{"type": "code_interpreter", "options": {"file_ids": ["file-123"]}}] agent = await AgentRegistry.create_from_yaml(spec, client=client, extras={"AzureOpenAI:FileId1": "file-123"}) assert agent.name == "CodeAgent" diff --git a/python/tests/unit/agents/openai_assistant/test_openai_assistant_agent.py b/python/tests/unit/agents/openai_assistant/test_openai_assistant_agent.py index a46183af4eb6..ad128f850216 100644 --- a/python/tests/unit/agents/openai_assistant/test_openai_assistant_agent.py +++ b/python/tests/unit/agents/openai_assistant/test_openai_assistant_agent.py @@ -420,7 +420,6 @@ async def test_openai_assistant_agent_with_tools(openai_unit_test_env, mock_open """ client, definition = mock_openai_client_and_definition definition.name = "CodeAgent" - # Optionally update definition.tools if you want to check the tools parsing definition.tools = [{"type": "code_interpreter", "options": {"file_ids": ["file-123"]}}] agent = await AgentRegistry.create_from_yaml(spec, client=client, extras={"OpenAI:FileId1": "file-123"}) assert agent.name == "CodeAgent" diff --git a/python/tests/unit/agents/openai_responses/test_openai_responses_agent.py b/python/tests/unit/agents/openai_responses/test_openai_responses_agent.py index f9dc98685521..e67bd6bd3912 100644 --- a/python/tests/unit/agents/openai_responses/test_openai_responses_agent.py +++ b/python/tests/unit/agents/openai_responses/test_openai_responses_agent.py @@ -19,6 +19,11 @@ from semantic_kernel.prompt_template.prompt_template_config import PromptTemplateConfig +@pytest.fixture +def mock_openai_client(): + return AsyncMock(spec=AsyncOpenAI) + + class SamplePlugin: @kernel_function def test_plugin(self, *args, **kwargs): @@ -250,7 +255,7 @@ async def test_open_ai_agent_missing_chat_deployment_name_throws(kernel, openai_ ) -async def test_openai_assistant_agent_from_yaml_minimal(openai_unit_test_env, mock_openai_client_and_definition): +async def test_openai_assistant_agent_from_yaml_minimal(openai_unit_test_env, mock_openai_client): spec = """ type: openai_responses_agent name: MinimalAgent @@ -259,43 +264,38 @@ async def test_openai_assistant_agent_from_yaml_minimal(openai_unit_test_env, mo connection: api_key: ${OpenAI:ApiKey} """ - client, definition = mock_openai_client_and_definition - definition.name = "MinimalAgent" + client = mock_openai_client agent: OpenAIResponsesAgent = await AgentRegistry.create_from_yaml(spec, client=client) assert isinstance(agent, OpenAIResponsesAgent) assert agent.name == "MinimalAgent" - assert agent.definition.model == "gpt-4o" + assert agent.ai_model_id == openai_unit_test_env.get("OPENAI_RESPONSES_MODEL_ID") -async def test_openai_assistant_agent_with_tools(openai_unit_test_env, mock_openai_client_and_definition): +async def test_openai_assistant_agent_with_tools(openai_unit_test_env, mock_openai_client): spec = """ type: openai_responses_agent -name: CodeAgent -description: Uses code interpreter. +name: FileSearchAgent +description: Uses file search. model: id: ${OpenAI:ChatModelId} connection: api_key: ${OpenAI:ApiKey} tools: - - type: code_interpreter + - type: file_search + description: File search for document retrieval. options: - file_ids: - - ${OpenAI:FileId1} + vector_store_ids: + - ${OpenAI:VectorStoreId} """ - client, definition = mock_openai_client_and_definition - definition.name = "CodeAgent" - # Optionally update definition.tools if you want to check the tools parsing - definition.tools = [{"type": "code_interpreter", "options": {"file_ids": ["file-123"]}}] + client = mock_openai_client agent: OpenAIResponsesAgent = await AgentRegistry.create_from_yaml( - spec, client=client, extras={"OpenAI:FileId1": "file-123"} + spec, client=client, extras={"OpenAI:VectorStoreId": "vector-store-123"} ) - assert agent.name == "CodeAgent" - assert any(t["type"] == "code_interpreter" for t in agent.definition.tools) + assert agent.name == "FileSearchAgent" + assert any(t["type"] == "file_search" for t in agent.tools) -async def test_openai_assistant_agent_with_inputs_outputs_template( - openai_unit_test_env, mock_openai_client_and_definition -): +async def test_openai_assistant_agent_with_inputs_outputs_template(openai_unit_test_env, mock_openai_client): spec = """ type: openai_responses_agent name: StoryAgent @@ -318,8 +318,7 @@ async def test_openai_assistant_agent_with_inputs_outputs_template( template: format: semantic-kernel """ - client, definition = mock_openai_client_and_definition - definition.name = "StoryAgent" + client = mock_openai_client agent: OpenAIResponsesAgent = await AgentRegistry.create_from_yaml(spec, client=client) assert agent.name == "StoryAgent" assert agent.prompt_template.prompt_template_config.template_format == "semantic-kernel" @@ -339,7 +338,7 @@ async def test_openai_assistant_agent_from_yaml_missing_required_fields(): await AgentRegistry.create_from_yaml(spec) -async def test_agent_from_file_success(tmp_path, openai_unit_test_env, mock_openai_client_and_definition): +async def test_agent_from_file_success(tmp_path, openai_unit_test_env, mock_openai_client): file_path = tmp_path / "spec.yaml" file_path.write_text( """ @@ -352,7 +351,7 @@ async def test_agent_from_file_success(tmp_path, openai_unit_test_env, mock_open """, encoding="utf-8", ) - client, _ = mock_openai_client_and_definition + client = mock_openai_client agent: OpenAIResponsesAgent = await AgentRegistry.create_from_file(str(file_path), client=client) assert agent.name == "DeclarativeAgent" assert isinstance(agent, OpenAIResponsesAgent) From be6fd367f3ae2e4c99d7d6656de9a9b18768170d Mon Sep 17 00:00:00 2001 From: Evan Mattson Date: Fri, 23 May 2025 11:28:22 +0900 Subject: [PATCH 10/18] Clean up naming --- ..._assistant_declarative_code_interpreter.py | 2 +- ...penai_assistant_declarative_file_search.py | 4 +- ..._declarative_function_calling_from_file.py | 15 ++++++ ...openai_assistant_declarative_templating.py | 19 +++----- ...tant_declarative_with_existing_agent_id.py | 2 +- ..._declarative_function_calling_from_file.py | 15 ++++++ ...openai_assistant_declarative_templating.py | 17 +++---- ...tant_declarative_with_existing_agent_id.py | 22 ++++----- ...responses_agent_declarative_file_search.py | 2 +- ..._declarative_function_calling_from_file.py | 20 ++++++-- ..._responses_agent_declarative_templating.py | 48 +++++++++---------- ...responses_agent_declarative_file_search.py | 2 +- ..._declarative_function_calling_from_file.py | 20 ++++++-- ..._responses_agent_declarative_templating.py | 48 +++++++++---------- ..._responses_agent_declarative_web_search.py | 32 ++++++------- .../azure_assistant_spec.yaml | 4 +- .../azure_responses_spec.yaml | 16 +++++++ .../openai_assistant_spec.yaml | 2 +- .../openai_responses_spec.yaml | 15 ++++++ .../step8_responses_agent_declarative.py | 2 +- .../agents/open_ai/azure_assistant_agent.py | 2 +- .../agents/open_ai/azure_responses_agent.py | 2 +- .../agents/open_ai/openai_responses_agent.py | 2 +- .../test_azure_assistant_agent.py | 10 ++-- .../test_openai_responses_agent.py | 10 ++-- 25 files changed, 204 insertions(+), 129 deletions(-) create mode 100644 python/samples/concepts/resources/declarative_spec/azure_responses_spec.yaml create mode 100644 python/samples/concepts/resources/declarative_spec/openai_responses_spec.yaml diff --git a/python/samples/concepts/agents/openai_assistant/azure_openai_assistant_declarative_code_interpreter.py b/python/samples/concepts/agents/openai_assistant/azure_openai_assistant_declarative_code_interpreter.py index 626914056243..9b69e0d09d66 100644 --- a/python/samples/concepts/agents/openai_assistant/azure_openai_assistant_declarative_code_interpreter.py +++ b/python/samples/concepts/agents/openai_assistant/azure_openai_assistant_declarative_code_interpreter.py @@ -15,7 +15,7 @@ # Define the YAML string for the sample spec = """ -type: azure_openai_assistant +type: azure_assistant name: CodeInterpreterAgent description: Agent with code interpreter tool. instructions: > diff --git a/python/samples/concepts/agents/openai_assistant/azure_openai_assistant_declarative_file_search.py b/python/samples/concepts/agents/openai_assistant/azure_openai_assistant_declarative_file_search.py index 5d799466c6d0..80851bc1338f 100644 --- a/python/samples/concepts/agents/openai_assistant/azure_openai_assistant_declarative_file_search.py +++ b/python/samples/concepts/agents/openai_assistant/azure_openai_assistant_declarative_file_search.py @@ -16,7 +16,7 @@ # Define the YAML string for the sample spec = """ -type: azure_openai_assistant +type: azure_assistant name: FileSearchAgent description: Agent with code interpreter tool. instructions: > @@ -62,7 +62,7 @@ async def main(): agent: AzureAssistantAgent = await AgentRegistry.create_from_yaml( yaml_str=spec, client=client, - extras={"OpenAI:VectorStoreId": vector_store.id}, + extras={"AzureOpenAI:VectorStoreId": vector_store.id}, ) # Define the task for the agent diff --git a/python/samples/concepts/agents/openai_assistant/azure_openai_assistant_declarative_function_calling_from_file.py b/python/samples/concepts/agents/openai_assistant/azure_openai_assistant_declarative_function_calling_from_file.py index 40ab90f31e69..3883de3cc5e9 100644 --- a/python/samples/concepts/agents/openai_assistant/azure_openai_assistant_declarative_function_calling_from_file.py +++ b/python/samples/concepts/agents/openai_assistant/azure_openai_assistant_declarative_function_calling_from_file.py @@ -80,6 +80,21 @@ async def main(): await client.beta.assistants.delete(agent.id) if agent else None await thread.delete() if thread else None + """ + Sample Output: + + # User: 'Hello' + # Host: Hi there! How can I assist you today? + # User: 'What is the special soup?' + # Host: The special soup is Clam Chowder. + # User: 'What is the special drink?' + # Host: The special drink is Chai Tea. + # User: 'How much is it?' + # Host: The Chai Tea costs $9.99. + # User: 'Thank you' + # Host: You're welcome! If you have any more questions, feel free to ask. + """ + if __name__ == "__main__": asyncio.run(main()) diff --git a/python/samples/concepts/agents/openai_assistant/azure_openai_assistant_declarative_templating.py b/python/samples/concepts/agents/openai_assistant/azure_openai_assistant_declarative_templating.py index 56149b1a6913..2684112bb7f1 100644 --- a/python/samples/concepts/agents/openai_assistant/azure_openai_assistant_declarative_templating.py +++ b/python/samples/concepts/agents/openai_assistant/azure_openai_assistant_declarative_templating.py @@ -15,7 +15,7 @@ # Define the YAML string for the sample spec = """ -type: azure_openai_assistant +type: azure_assistant name: StoryAgent description: An agent that generates a story about a topic. instructions: Tell a story about {{$topic}} that is {{$length}} sentences long. @@ -63,18 +63,13 @@ async def main(): # Cleanup: Delete the agent, vector store, and file await client.beta.assistants.delete(agent.id) - """ - Sample output: + """ + Sample output: - # User: 'Who can help me if I have a sales question?' - # FileSearchAgent: If you have a sales question, you may contact the following individuals: - - 1. **Hicran Bea** - Sales Manager - 2. **Mariam Jaslyn** - Sales Representative - 3. **Angelino Embla** - Sales Representative - - This information comes from the employee records【4:0†source】. - """ + # StoryAgent: Under the silvery moon, three mischievous cats tiptoed across the rooftop, chasing + shadows and sharing secret whispers. By dawn, they curled up together, purring softly, dreaming + of adventures yet to come. + """ if __name__ == "__main__": diff --git a/python/samples/concepts/agents/openai_assistant/azure_openai_assistant_declarative_with_existing_agent_id.py b/python/samples/concepts/agents/openai_assistant/azure_openai_assistant_declarative_with_existing_agent_id.py index 75d4c305ab94..106661e49cc4 100644 --- a/python/samples/concepts/agents/openai_assistant/azure_openai_assistant_declarative_with_existing_agent_id.py +++ b/python/samples/concepts/agents/openai_assistant/azure_openai_assistant_declarative_with_existing_agent_id.py @@ -12,7 +12,7 @@ # Define the YAML string for the sample spec = """ id: ${AzureOpenAI:AgentId} -type: azure_openai_assistant +type: azure_assistant instructions: You are helpful agent who always responds in French. """ diff --git a/python/samples/concepts/agents/openai_assistant/openai_assistant_declarative_function_calling_from_file.py b/python/samples/concepts/agents/openai_assistant/openai_assistant_declarative_function_calling_from_file.py index 08123523f0f0..5fdfaf3231ac 100644 --- a/python/samples/concepts/agents/openai_assistant/openai_assistant_declarative_function_calling_from_file.py +++ b/python/samples/concepts/agents/openai_assistant/openai_assistant_declarative_function_calling_from_file.py @@ -80,6 +80,21 @@ async def main(): await client.beta.assistants.delete(agent.id) if agent else None await thread.delete() if thread else None + """ + Sample Output: + + # User: 'Hello' + # Host: Hi there! How can I assist you today? + # User: 'What is the special soup?' + # Host: The special soup is Clam Chowder. + # User: 'What is the special drink?' + # Host: The special drink is Chai Tea. + # User: 'How much is it?' + # Host: The Chai Tea costs $9.99. + # User: 'Thank you' + # Host: You're welcome! If you have any more questions, feel free to ask. + """ + if __name__ == "__main__": asyncio.run(main()) diff --git a/python/samples/concepts/agents/openai_assistant/openai_assistant_declarative_templating.py b/python/samples/concepts/agents/openai_assistant/openai_assistant_declarative_templating.py index 9eceb95c7cc3..273a4cc0436a 100644 --- a/python/samples/concepts/agents/openai_assistant/openai_assistant_declarative_templating.py +++ b/python/samples/concepts/agents/openai_assistant/openai_assistant_declarative_templating.py @@ -61,18 +61,13 @@ async def main(): # Cleanup: Delete the agent, vector store, and file await client.beta.assistants.delete(agent.id) - """ - Sample output: + """ + Sample output: - # User: 'Who can help me if I have a sales question?' - # FileSearchAgent: If you have a sales question, you may contact the following individuals: - - 1. **Hicran Bea** - Sales Manager - 2. **Mariam Jaslyn** - Sales Representative - 3. **Angelino Embla** - Sales Representative - - This information comes from the employee records【4:0†source】. - """ + # StoryAgent: Under the silvery moon, three mischievous cats tiptoed across the rooftop, chasing + shadows and sharing secret whispers. By dawn, they curled up together, purring softly, dreaming + of adventures yet to come. + """ if __name__ == "__main__": diff --git a/python/samples/concepts/agents/openai_assistant/openai_assistant_declarative_with_existing_agent_id.py b/python/samples/concepts/agents/openai_assistant/openai_assistant_declarative_with_existing_agent_id.py index 130917e19341..5b8b8f3d4c62 100644 --- a/python/samples/concepts/agents/openai_assistant/openai_assistant_declarative_with_existing_agent_id.py +++ b/python/samples/concepts/agents/openai_assistant/openai_assistant_declarative_with_existing_agent_id.py @@ -47,19 +47,19 @@ async def main(): await client.agents.delete_agent(agent.id) """ - Sample output: + Sample output: - # User: 'Why is the sky blue?' - # WeatherAgent: Le ciel est bleu à cause d'un phénomène appelé **diffusion de Rayleigh**. La lumière du - Soleil est composée de toutes les couleurs du spectre visible, mais lorsqu'elle traverse l'atmosphère - terrestre, elle entre en contact avec les molécules d'air et les particules présentes. + # User: 'Why is the sky blue?' + # WeatherAgent: Le ciel est bleu à cause d'un phénomène appelé **diffusion de Rayleigh**. La lumière du + Soleil est composée de toutes les couleurs du spectre visible, mais lorsqu'elle traverse l'atmosphère + terrestre, elle entre en contact avec les molécules d'air et les particules présentes. - Les couleurs à courtes longueurs d'onde, comme le bleu et le violet, sont diffusées dans toutes les directions - beaucoup plus efficacement que les couleurs à longues longueurs d'onde, comme le rouge et l'orange. Bien que le - violet ait une longueur d'onde encore plus courte que le bleu, nos yeux sont moins sensibles à cette couleur, - et une partie du violet est également absorbée par la haute atmosphère. Ainsi, le bleu domine, donnant au ciel - sa couleur caractéristique. - """ + Les couleurs à courtes longueurs d'onde, comme le bleu et le violet, sont diffusées dans toutes les directions + beaucoup plus efficacement que les couleurs à longues longueurs d'onde, comme le rouge et l'orange. Bien que le + violet ait une longueur d'onde encore plus courte que le bleu, nos yeux sont moins sensibles à cette couleur, + et une partie du violet est également absorbée par la haute atmosphère. Ainsi, le bleu domine, donnant au ciel + sa couleur caractéristique. + """ if __name__ == "__main__": diff --git a/python/samples/concepts/agents/openai_responses/azure_openai_responses_agent_declarative_file_search.py b/python/samples/concepts/agents/openai_responses/azure_openai_responses_agent_declarative_file_search.py index 3d3438f72ff0..0aa5cde94092 100644 --- a/python/samples/concepts/agents/openai_responses/azure_openai_responses_agent_declarative_file_search.py +++ b/python/samples/concepts/agents/openai_responses/azure_openai_responses_agent_declarative_file_search.py @@ -16,7 +16,7 @@ # Define the YAML string for the sample spec = """ -type: azure_openai_responses_agent +type: azure_responses name: FileSearchAgent description: Agent with code interpreter tool. instructions: > diff --git a/python/samples/concepts/agents/openai_responses/azure_openai_responses_agent_declarative_function_calling_from_file.py b/python/samples/concepts/agents/openai_responses/azure_openai_responses_agent_declarative_function_calling_from_file.py index e0dfa7a8bcef..3c13ee775d65 100644 --- a/python/samples/concepts/agents/openai_responses/azure_openai_responses_agent_declarative_function_calling_from_file.py +++ b/python/samples/concepts/agents/openai_responses/azure_openai_responses_agent_declarative_function_calling_from_file.py @@ -42,7 +42,7 @@ async def main(): os.path.dirname(os.path.dirname(os.path.dirname(os.path.realpath(__file__)))), "resources", "declarative_spec", - "azure_assistant_spec.yaml", + "azure_resonses_spec.yaml", ) # Create the Responses Agent from the YAML spec @@ -76,10 +76,24 @@ async def main(): # Store the thread for the next iteration thread = response.thread finally: - # Cleanup: Delete the thread and agent - await client.beta.assistants.delete(agent.id) if agent else None + # Cleanup: Delete the thread await thread.delete() if thread else None + """ + Sample Output: + + # User: 'Hello' + # Host: Hi there! How can I assist you today? + # User: 'What is the special soup?' + # Host: The special soup is Clam Chowder. + # User: 'What is the special drink?' + # Host: The special drink is Chai Tea. + # User: 'How much is it?' + # Host: The Chai Tea costs $9.99. + # User: 'Thank you' + # Host: You're welcome! If you have any more questions, feel free to ask. + """ + if __name__ == "__main__": asyncio.run(main()) diff --git a/python/samples/concepts/agents/openai_responses/azure_openai_responses_agent_declarative_templating.py b/python/samples/concepts/agents/openai_responses/azure_openai_responses_agent_declarative_templating.py index 8994e2b93748..f21fd96bccd6 100644 --- a/python/samples/concepts/agents/openai_responses/azure_openai_responses_agent_declarative_templating.py +++ b/python/samples/concepts/agents/openai_responses/azure_openai_responses_agent_declarative_templating.py @@ -15,7 +15,7 @@ # Define the YAML string for the sample spec = """ -type: azure_openai_responses_agent +type: azure_responses name: StoryAgent description: An agent that generates a story about a topic. instructions: Tell a story about {{$topic}} that is {{$length}} sentences long. @@ -44,37 +44,35 @@ async def main(): # Setup the Azure OpenAI client client = AzureResponsesAgent.create_client() - try: - # Create the Responses Agent from the YAML spec - # Note: the extras can be provided in the short-format (shown below) or - # in the long-format (as shown in the YAML spec, with the `AzureOpenAI:` prefix). - # The short-format is used here for brevity - agent: AzureResponsesAgent = await AgentRegistry.create_from_yaml( - yaml_str=spec, - client=client, - ) + # Create the Responses Agent from the YAML spec + # Note: the extras can be provided in the short-format (shown below) or + # in the long-format (as shown in the YAML spec, with the `AzureOpenAI:` prefix). + # The short-format is used here for brevity + agent: AzureResponsesAgent = await AgentRegistry.create_from_yaml( + yaml_str=spec, + client=client, + ) + USER_INPUTS = ["Tell me a fun story."] + + # Invoke the agent for the specified task + for user_input in USER_INPUTS: + # Print the user input + print(f"# User: '{user_input}'") # Invoke the agent for the specified task async for response in agent.invoke( - messages=None, + messages=user_input, ): print(f"# {response.name}: {response}") - finally: - # Cleanup: Delete the agent, vector store, and file - await client.beta.assistants.delete(agent.id) - - """ - Sample output: - - # User: 'Who can help me if I have a sales question?' - # FileSearchAgent: If you have a sales question, you may contact the following individuals: - 1. **Hicran Bea** - Sales Manager - 2. **Mariam Jaslyn** - Sales Representative - 3. **Angelino Embla** - Sales Representative + """ + Sample output: - This information comes from the employee records【4:0†source】. - """ + # User: 'Tell me a fun story.' + # StoryAgent: Late at night, a mischievous cat named Whiskers tiptoed across the piano keys, + accidentally composing a tune so catchy that all the neighborhood felines gathered outside + to dance. By morning, the humans awoke to find a crowd of cats meowing for an encore performance. + """ if __name__ == "__main__": diff --git a/python/samples/concepts/agents/openai_responses/openai_responses_agent_declarative_file_search.py b/python/samples/concepts/agents/openai_responses/openai_responses_agent_declarative_file_search.py index 151da4016601..f6867516bc05 100644 --- a/python/samples/concepts/agents/openai_responses/openai_responses_agent_declarative_file_search.py +++ b/python/samples/concepts/agents/openai_responses/openai_responses_agent_declarative_file_search.py @@ -16,7 +16,7 @@ # Define the YAML string for the sample spec = """ -type: openai_responses_agent +type: openai_responses name: FileSearchAgent description: Agent with code interpreter tool. instructions: > diff --git a/python/samples/concepts/agents/openai_responses/openai_responses_agent_declarative_function_calling_from_file.py b/python/samples/concepts/agents/openai_responses/openai_responses_agent_declarative_function_calling_from_file.py index 3851482f0324..1a8a11ff42da 100644 --- a/python/samples/concepts/agents/openai_responses/openai_responses_agent_declarative_function_calling_from_file.py +++ b/python/samples/concepts/agents/openai_responses/openai_responses_agent_declarative_function_calling_from_file.py @@ -42,7 +42,7 @@ async def main(): os.path.dirname(os.path.dirname(os.path.dirname(os.path.realpath(__file__)))), "resources", "declarative_spec", - "openai_assistant_spec.yaml", + "openai_responses_spec.yaml", ) # Create the Responses Agent from the YAML spec @@ -76,10 +76,24 @@ async def main(): # Store the thread for the next iteration thread = response.thread finally: - # Cleanup: Delete the thread and agent - await client.beta.assistants.delete(agent.id) if agent else None + # Cleanup: Delete the thread await thread.delete() if thread else None + """ + Sample Output: + + # User: 'Hello' + # Host: Hi there! How can I assist you today? + # User: 'What is the special soup?' + # Host: The special soup is Clam Chowder. + # User: 'What is the special drink?' + # Host: The special drink is Chai Tea. + # User: 'How much is it?' + # Host: The Chai Tea costs $9.99. + # User: 'Thank you' + # Host: You're welcome! If you have any more questions, feel free to ask. + """ + if __name__ == "__main__": asyncio.run(main()) diff --git a/python/samples/concepts/agents/openai_responses/openai_responses_agent_declarative_templating.py b/python/samples/concepts/agents/openai_responses/openai_responses_agent_declarative_templating.py index a5dd392a679f..d825c6a45f40 100644 --- a/python/samples/concepts/agents/openai_responses/openai_responses_agent_declarative_templating.py +++ b/python/samples/concepts/agents/openai_responses/openai_responses_agent_declarative_templating.py @@ -15,7 +15,7 @@ # Define the YAML string for the sample spec = """ -type: openai_responses_agent +type: openai_responses name: StoryAgent description: An agent that generates a story about a topic. instructions: Tell a story about {{$topic}} that is {{$length}} sentences long. @@ -42,37 +42,35 @@ async def main(): # Setup the OpenAI client client = OpenAIResponsesAgent.create_client() - try: - # Create the Responses Agent from the YAML spec - # Note: the extras can be provided in the short-format (shown below) or - # in the long-format (as shown in the YAML spec, with the `OpenAI:` prefix). - # The short-format is used here for brevity - agent: OpenAIResponsesAgent = await AgentRegistry.create_from_yaml( - yaml_str=spec, - client=client, - ) + # Create the Responses Agent from the YAML spec + # Note: the extras can be provided in the short-format (shown below) or + # in the long-format (as shown in the YAML spec, with the `OpenAI:` prefix). + # The short-format is used here for brevity + agent: OpenAIResponsesAgent = await AgentRegistry.create_from_yaml( + yaml_str=spec, + client=client, + ) + USER_INPUTS = ["Tell me a fun story."] + + # Invoke the agent for the specified task + for user_input in USER_INPUTS: + # Print the user input + print(f"# User: '{user_input}'") # Invoke the agent for the specified task async for response in agent.invoke( - messages=None, + messages=user_input, ): print(f"# {response.name}: {response}") - finally: - # Cleanup: Delete the agent, vector store, and file - await client.beta.assistants.delete(agent.id) - - """ - Sample output: - - # User: 'Who can help me if I have a sales question?' - # FileSearchAgent: If you have a sales question, you may contact the following individuals: - 1. **Hicran Bea** - Sales Manager - 2. **Mariam Jaslyn** - Sales Representative - 3. **Angelino Embla** - Sales Representative + """ + Sample output: - This information comes from the employee records【4:0†source】. - """ + # User: 'Tell me a fun story.' + # StoryAgent: Late at night, a mischievous cat named Whiskers tiptoed across the piano keys, + accidentally composing a tune so catchy that all the neighborhood felines gathered outside + to dance. By morning, the humans awoke to find a crowd of cats meowing for an encore performance. + """ if __name__ == "__main__": diff --git a/python/samples/concepts/agents/openai_responses/openai_responses_agent_declarative_web_search.py b/python/samples/concepts/agents/openai_responses/openai_responses_agent_declarative_web_search.py index 233f89ba7662..cfcb1c81e050 100644 --- a/python/samples/concepts/agents/openai_responses/openai_responses_agent_declarative_web_search.py +++ b/python/samples/concepts/agents/openai_responses/openai_responses_agent_declarative_web_search.py @@ -15,7 +15,7 @@ # Define the YAML string for the sample spec = """ -type: openai_responses_agent +type: openai_responses name: WebSearchAgent description: Agent with web search tool. instructions: > @@ -65,25 +65,25 @@ async def main(): finally: await thread.delete() if thread else None - """ - Sample output: + """ + Sample output: - # User: 'Who won the 2025 NCAA basketball championship?' - # WebSearchAgent: The Florida Gators won the 2025 NCAA men's basketball championship, defeating the Houston - Cougars 65-63 on April 7, 2025, at the Alamodome in San Antonio, Texas. This victory marked Florida's - third national title and their first since 2007. ([reuters.com](https://www.reuters.com/sports/basketball/florida-beat-houston-claim-third-ncaa-mens-basketball-title-2025-04-08/?utm_source=openai)) + # User: 'Who won the 2025 NCAA basketball championship?' + # WebSearchAgent: The Florida Gators won the 2025 NCAA men's basketball championship, defeating the Houston + Cougars 65-63 on April 7, 2025, at the Alamodome in San Antonio, Texas. This victory marked Florida's + third national title and their first since 2007. ([reuters.com](https://www.reuters.com/sports/basketball/florida-beat-houston-claim-third-ncaa-mens-basketball-title-2025-04-08/?utm_source=openai)) - In the championship game, Florida overcame a 12-point deficit in the second half. Senior guard Walter Clayton - Jr. was instrumental in the comeback, scoring all 11 of his points in the second half and delivering a - crucial defensive stop in the final seconds to secure the win. Will Richard led the Gators with 18 points. ([apnews.com](https://apnews.com/article/74a9c790277595ce53ca130c5ec64429?utm_source=openai)) + In the championship game, Florida overcame a 12-point deficit in the second half. Senior guard Walter Clayton + Jr. was instrumental in the comeback, scoring all 11 of his points in the second half and delivering a + crucial defensive stop in the final seconds to secure the win. Will Richard led the Gators with 18 points. ([apnews.com](https://apnews.com/article/74a9c790277595ce53ca130c5ec64429?utm_source=openai)) - Head coach Todd Golden, in his third season, became the youngest coach to win the NCAA title since 1983. ([reuters.com](https://www.reuters.com/sports/basketball/florida-beat-houston-claim-third-ncaa-mens-basketball-title-2025-04-08/?utm_source=openai)) + Head coach Todd Golden, in his third season, became the youngest coach to win the NCAA title since 1983. ([reuters.com](https://www.reuters.com/sports/basketball/florida-beat-houston-claim-third-ncaa-mens-basketball-title-2025-04-08/?utm_source=openai)) - ## Florida Gators' 2025 NCAA Championship Victory: - - [Florida overcome Houston in massive comeback to claim third NCAA title](https://www.reuters.com/sports/basketball/florida-beat-houston-claim-third-ncaa-mens-basketball-title-2025-04-08/?utm_source=openai) - - [Walter Clayton Jr.'s defensive stop gives Florida its 3rd national title with 65-63 win over Houston](https://apnews.com/article/74a9c790277595ce53ca130c5ec64429?utm_source=openai) - - [Reports: National champion Florida sets White House visit](https://www.reuters.com/sports/reports-national-champion-florida-sets-white-house-visit-2025-05-18/?utm_source=openai) - """ + ## Florida Gators' 2025 NCAA Championship Victory: + - [Florida overcome Houston in massive comeback to claim third NCAA title](https://www.reuters.com/sports/basketball/florida-beat-houston-claim-third-ncaa-mens-basketball-title-2025-04-08/?utm_source=openai) + - [Walter Clayton Jr.'s defensive stop gives Florida its 3rd national title with 65-63 win over Houston](https://apnews.com/article/74a9c790277595ce53ca130c5ec64429?utm_source=openai) + - [Reports: National champion Florida sets White House visit](https://www.reuters.com/sports/reports-national-champion-florida-sets-white-house-visit-2025-05-18/?utm_source=openai) + """ if __name__ == "__main__": diff --git a/python/samples/concepts/resources/declarative_spec/azure_assistant_spec.yaml b/python/samples/concepts/resources/declarative_spec/azure_assistant_spec.yaml index 19bbfe9bc006..8cd6ae111397 100644 --- a/python/samples/concepts/resources/declarative_spec/azure_assistant_spec.yaml +++ b/python/samples/concepts/resources/declarative_spec/azure_assistant_spec.yaml @@ -1,5 +1,5 @@ -type: azure_openai_assistant -name: FunctionCallingAgent +type: azure_assistant +name: Host description: This agent uses the provided functions to answer questions about the menu. instructions: Use the provided functions to answer questions about the menu. model: diff --git a/python/samples/concepts/resources/declarative_spec/azure_responses_spec.yaml b/python/samples/concepts/resources/declarative_spec/azure_responses_spec.yaml new file mode 100644 index 000000000000..5833b67fce1f --- /dev/null +++ b/python/samples/concepts/resources/declarative_spec/azure_responses_spec.yaml @@ -0,0 +1,16 @@ +type: azure_responses +name: Host +description: This agent uses the provided functions to answer questions about the menu. +instructions: Use the provided functions to answer questions about the menu. +model: + id: ${AzureOpenAI:ChatModelId} + connection: + connection: + endpoint: ${AzureOpenAI:Endpoint} + options: + temperature: 0.4 +tools: + - id: MenuPlugin.get_specials + type: function + - id: MenuPlugin.get_item_price + type: function \ No newline at end of file diff --git a/python/samples/concepts/resources/declarative_spec/openai_assistant_spec.yaml b/python/samples/concepts/resources/declarative_spec/openai_assistant_spec.yaml index 0746fa2201fc..dbe61a80ad1a 100644 --- a/python/samples/concepts/resources/declarative_spec/openai_assistant_spec.yaml +++ b/python/samples/concepts/resources/declarative_spec/openai_assistant_spec.yaml @@ -1,5 +1,5 @@ type: openai_assistant -name: FunctionCallingAgent +name: Host description: This agent uses the provided functions to answer questions about the menu. instructions: Use the provided functions to answer questions about the menu. model: diff --git a/python/samples/concepts/resources/declarative_spec/openai_responses_spec.yaml b/python/samples/concepts/resources/declarative_spec/openai_responses_spec.yaml new file mode 100644 index 000000000000..fbf52f0ef29f --- /dev/null +++ b/python/samples/concepts/resources/declarative_spec/openai_responses_spec.yaml @@ -0,0 +1,15 @@ +type: openai_responses +name: Host +description: This agent uses the provided functions to answer questions about the menu. +instructions: Use the provided functions to answer questions about the menu. +model: + id: ${OpenAI:ChatModelId} + connection: + api_key: ${OpenAI:ApiKey} + options: + temperature: 0.4 +tools: + - id: MenuPlugin.get_specials + type: function + - id: MenuPlugin.get_item_price + type: function \ No newline at end of file diff --git a/python/samples/getting_started_with_agents/openai_responses/step8_responses_agent_declarative.py b/python/samples/getting_started_with_agents/openai_responses/step8_responses_agent_declarative.py index 8bc9ee4f9c3e..4e73e989ac3f 100644 --- a/python/samples/getting_started_with_agents/openai_responses/step8_responses_agent_declarative.py +++ b/python/samples/getting_started_with_agents/openai_responses/step8_responses_agent_declarative.py @@ -21,7 +21,7 @@ # Define the YAML string for the sample SPEC = """ -type: openai_responses_agent +type: openai_responses name: Host instructions: Respond politely to the user's questions. model: diff --git a/python/semantic_kernel/agents/open_ai/azure_assistant_agent.py b/python/semantic_kernel/agents/open_ai/azure_assistant_agent.py index 23e2fb4b4a9e..00934c8e8254 100644 --- a/python/semantic_kernel/agents/open_ai/azure_assistant_agent.py +++ b/python/semantic_kernel/agents/open_ai/azure_assistant_agent.py @@ -37,7 +37,7 @@ @release_candidate -@register_agent_type("azure_openai_assistant") +@register_agent_type("azure_assistant") class AzureAssistantAgent(OpenAIAssistantAgent): """An Azure Assistant Agent class that extends the OpenAI Assistant Agent class.""" diff --git a/python/semantic_kernel/agents/open_ai/azure_responses_agent.py b/python/semantic_kernel/agents/open_ai/azure_responses_agent.py index 465379a90f4b..99f00f356fa3 100644 --- a/python/semantic_kernel/agents/open_ai/azure_responses_agent.py +++ b/python/semantic_kernel/agents/open_ai/azure_responses_agent.py @@ -41,7 +41,7 @@ @experimental -@register_agent_type("azure_openai_responses_agent") +@register_agent_type("azure_responses") class AzureResponsesAgent(OpenAIResponsesAgent): """Azure Responses Agent class. diff --git a/python/semantic_kernel/agents/open_ai/openai_responses_agent.py b/python/semantic_kernel/agents/open_ai/openai_responses_agent.py index 89c5cc0ecaac..7f1133e1dca0 100644 --- a/python/semantic_kernel/agents/open_ai/openai_responses_agent.py +++ b/python/semantic_kernel/agents/open_ai/openai_responses_agent.py @@ -251,7 +251,7 @@ async def reduce(self) -> ChatHistory | None: @experimental -@register_agent_type("openai_responses_agent") +@register_agent_type("openai_responses") class OpenAIResponsesAgent(DeclarativeSpecMixin, Agent): """OpenAI Responses Agent class. diff --git a/python/tests/unit/agents/openai_assistant/test_azure_assistant_agent.py b/python/tests/unit/agents/openai_assistant/test_azure_assistant_agent.py index 1642b4256f71..10f0137f0461 100644 --- a/python/tests/unit/agents/openai_assistant/test_azure_assistant_agent.py +++ b/python/tests/unit/agents/openai_assistant/test_azure_assistant_agent.py @@ -354,7 +354,7 @@ async def test_azure_assistant_agent_from_yaml_minimal( azure_openai_unit_test_env, mock_azure_openai_client_and_definition ): spec = """ -type: azure_openai_assistant +type: azure_assistant name: MinimalAgent model: id: ${AzureOpenAI:ChatModelId} @@ -372,7 +372,7 @@ async def test_azure_assistant_agent_from_yaml_minimal( async def test_azure_assistant_agent_with_tools(azure_openai_unit_test_env, mock_azure_openai_client_and_definition): spec = """ -type: azure_openai_assistant +type: azure_assistant name: CodeAgent description: Uses code interpreter. model: @@ -398,7 +398,7 @@ async def test_azure_assistant_agent_with_inputs_outputs_template( azure_openai_unit_test_env, mock_azure_openai_client_and_definition ): spec = """ -type: azure_openai_assistant +type: azure_assistant name: StoryAgent model: id: ${AzureOpenAI:ChatModelId} @@ -434,7 +434,7 @@ async def test_azure_assistant_agent_from_dict_missing_type(): async def test_azure_assistant_agent_from_yaml_missing_required_fields(): spec = """ -type: azure_openai_assistant +type: azure_assistant """ with pytest.raises(AgentInitializationException): await AgentRegistry.create_from_yaml(spec) @@ -444,7 +444,7 @@ async def test_agent_from_file_success(tmp_path, azure_openai_unit_test_env, moc file_path = tmp_path / "spec.yaml" file_path.write_text( """ -type: azure_openai_assistant +type: azure_assistant name: DeclarativeAgent model: id: ${AzureOpenAI:ChatModelId} diff --git a/python/tests/unit/agents/openai_responses/test_openai_responses_agent.py b/python/tests/unit/agents/openai_responses/test_openai_responses_agent.py index e67bd6bd3912..7888e95c5187 100644 --- a/python/tests/unit/agents/openai_responses/test_openai_responses_agent.py +++ b/python/tests/unit/agents/openai_responses/test_openai_responses_agent.py @@ -257,7 +257,7 @@ async def test_open_ai_agent_missing_chat_deployment_name_throws(kernel, openai_ async def test_openai_assistant_agent_from_yaml_minimal(openai_unit_test_env, mock_openai_client): spec = """ -type: openai_responses_agent +type: openai_responses name: MinimalAgent model: id: ${OpenAI:ChatModelId} @@ -273,7 +273,7 @@ async def test_openai_assistant_agent_from_yaml_minimal(openai_unit_test_env, mo async def test_openai_assistant_agent_with_tools(openai_unit_test_env, mock_openai_client): spec = """ -type: openai_responses_agent +type: openai_responses name: FileSearchAgent description: Uses file search. model: @@ -297,7 +297,7 @@ async def test_openai_assistant_agent_with_tools(openai_unit_test_env, mock_open async def test_openai_assistant_agent_with_inputs_outputs_template(openai_unit_test_env, mock_openai_client): spec = """ -type: openai_responses_agent +type: openai_responses name: StoryAgent model: id: ${OpenAI:ChatModelId} @@ -332,7 +332,7 @@ async def test_openai_assistant_agent_from_dict_missing_type(): async def test_openai_assistant_agent_from_yaml_missing_required_fields(): spec = """ -type: openai_responses_agent +type: openai_responses """ with pytest.raises(AgentInitializationException): await AgentRegistry.create_from_yaml(spec) @@ -342,7 +342,7 @@ async def test_agent_from_file_success(tmp_path, openai_unit_test_env, mock_open file_path = tmp_path / "spec.yaml" file_path.write_text( """ -type: openai_responses_agent +type: openai_responses name: DeclarativeAgent model: id: ${OpenAI:ChatModelId} From 854d9bff1268bd1d43c1e5064490b1cd3d01bbbd Mon Sep 17 00:00:00 2001 From: Evan Mattson Date: Fri, 23 May 2025 11:48:57 +0900 Subject: [PATCH 11/18] Simplify imports, clean up samples --- .../azure_ai_agent_declarative_azure_ai_search.py | 3 +-- .../azure_ai_agent_declarative_bing_grounding.py | 3 +-- .../azure_ai_agent_declarative_code_interpreter.py | 3 +-- .../azure_ai_agent/azure_ai_agent_declarative_file_search.py | 3 +-- .../azure_ai_agent/azure_ai_agent_declarative_openapi.py | 3 +-- .../azure_ai_agent/azure_ai_agent_declarative_templating.py | 3 +-- .../azure_ai_agent_declarative_with_existing_agent_id.py | 3 +-- .../azure_openai_assistant_declarative_file_search.py | 3 +-- .../azure_openai_assistant_declarative_templating.py | 3 +-- .../openai_assistant_declarative_file_search.py | 3 +-- .../openai_assistant_declarative_function_calling_from_file.py | 2 +- .../openai_assistant_declarative_templating.py | 3 +-- .../openai_assistant_declarative_with_existing_agent_id.py | 3 +-- .../azure_openai_responses_agent_declarative_file_search.py | 3 +-- ...i_responses_agent_declarative_function_calling_from_file.py | 2 +- .../azure_openai_responses_agent_declarative_templating.py | 3 +-- .../openai_responses_agent_declarative_file_search.py | 3 +-- ...i_responses_agent_declarative_function_calling_from_file.py | 2 +- .../openai_responses_agent_declarative_templating.py | 3 +-- .../openai_responses_agent_declarative_web_search.py | 3 +-- .../unit/agents/openai_assistant/test_azure_assistant_agent.py | 2 +- .../agents/openai_assistant/test_openai_assistant_agent.py | 3 +-- .../agents/openai_responses/test_openai_responses_agent.py | 2 +- 23 files changed, 23 insertions(+), 41 deletions(-) diff --git a/python/samples/concepts/agents/azure_ai_agent/azure_ai_agent_declarative_azure_ai_search.py b/python/samples/concepts/agents/azure_ai_agent/azure_ai_agent_declarative_azure_ai_search.py index f65cd24867c4..17c9704b1d77 100644 --- a/python/samples/concepts/agents/azure_ai_agent/azure_ai_agent_declarative_azure_ai_search.py +++ b/python/samples/concepts/agents/azure_ai_agent/azure_ai_agent_declarative_azure_ai_search.py @@ -4,8 +4,7 @@ from azure.identity.aio import DefaultAzureCredential -from semantic_kernel.agents import AzureAIAgent, AzureAIAgentSettings -from semantic_kernel.agents.agent import AgentRegistry +from semantic_kernel.agents import AgentRegistry, AzureAIAgent, AzureAIAgentSettings from semantic_kernel.contents.chat_message_content import ChatMessageContent from semantic_kernel.contents.function_call_content import FunctionCallContent from semantic_kernel.contents.function_result_content import FunctionResultContent diff --git a/python/samples/concepts/agents/azure_ai_agent/azure_ai_agent_declarative_bing_grounding.py b/python/samples/concepts/agents/azure_ai_agent/azure_ai_agent_declarative_bing_grounding.py index e76a0fe8c225..7ae208f72c35 100644 --- a/python/samples/concepts/agents/azure_ai_agent/azure_ai_agent_declarative_bing_grounding.py +++ b/python/samples/concepts/agents/azure_ai_agent/azure_ai_agent_declarative_bing_grounding.py @@ -4,8 +4,7 @@ from azure.identity.aio import DefaultAzureCredential -from semantic_kernel.agents import AzureAIAgent, AzureAIAgentSettings -from semantic_kernel.agents.agent import AgentRegistry +from semantic_kernel.agents import AgentRegistry, AzureAIAgent, AzureAIAgentSettings """ The following sample demonstrates how to create an Azure AI agent that answers diff --git a/python/samples/concepts/agents/azure_ai_agent/azure_ai_agent_declarative_code_interpreter.py b/python/samples/concepts/agents/azure_ai_agent/azure_ai_agent_declarative_code_interpreter.py index c82eda7175a1..e9244610cd75 100644 --- a/python/samples/concepts/agents/azure_ai_agent/azure_ai_agent_declarative_code_interpreter.py +++ b/python/samples/concepts/agents/azure_ai_agent/azure_ai_agent_declarative_code_interpreter.py @@ -6,8 +6,7 @@ from azure.ai.agents.models import FilePurpose from azure.identity.aio import DefaultAzureCredential -from semantic_kernel.agents import AzureAIAgent, AzureAIAgentSettings -from semantic_kernel.agents.agent import AgentRegistry +from semantic_kernel.agents import AgentRegistry, AzureAIAgent, AzureAIAgentSettings """ The following sample demonstrates how to create an Azure AI agent that answers diff --git a/python/samples/concepts/agents/azure_ai_agent/azure_ai_agent_declarative_file_search.py b/python/samples/concepts/agents/azure_ai_agent/azure_ai_agent_declarative_file_search.py index 5249336abdce..87128dba7301 100644 --- a/python/samples/concepts/agents/azure_ai_agent/azure_ai_agent_declarative_file_search.py +++ b/python/samples/concepts/agents/azure_ai_agent/azure_ai_agent_declarative_file_search.py @@ -6,8 +6,7 @@ from azure.ai.agents.models import VectorStore from azure.identity.aio import DefaultAzureCredential -from semantic_kernel.agents import AzureAIAgent, AzureAIAgentSettings -from semantic_kernel.agents.agent import AgentRegistry +from semantic_kernel.agents import AgentRegistry, AzureAIAgent, AzureAIAgentSettings """ The following sample demonstrates how to create an Azure AI agent that answers diff --git a/python/samples/concepts/agents/azure_ai_agent/azure_ai_agent_declarative_openapi.py b/python/samples/concepts/agents/azure_ai_agent/azure_ai_agent_declarative_openapi.py index 5155cde27e19..2ce460e9e3a5 100644 --- a/python/samples/concepts/agents/azure_ai_agent/azure_ai_agent_declarative_openapi.py +++ b/python/samples/concepts/agents/azure_ai_agent/azure_ai_agent_declarative_openapi.py @@ -4,8 +4,7 @@ from azure.identity.aio import DefaultAzureCredential -from semantic_kernel.agents import AzureAIAgent, AzureAIAgentSettings -from semantic_kernel.agents.agent import AgentRegistry +from semantic_kernel.agents import AgentRegistry, AzureAIAgent, AzureAIAgentSettings """ The following sample demonstrates how to create an Azure AI agent that answers diff --git a/python/samples/concepts/agents/azure_ai_agent/azure_ai_agent_declarative_templating.py b/python/samples/concepts/agents/azure_ai_agent/azure_ai_agent_declarative_templating.py index 45731aff3f0e..080948988dea 100644 --- a/python/samples/concepts/agents/azure_ai_agent/azure_ai_agent_declarative_templating.py +++ b/python/samples/concepts/agents/azure_ai_agent/azure_ai_agent_declarative_templating.py @@ -4,8 +4,7 @@ from azure.identity.aio import DefaultAzureCredential -from semantic_kernel.agents import AzureAIAgent -from semantic_kernel.agents.agent import AgentRegistry +from semantic_kernel.agents import AgentRegistry, AzureAIAgent """ The following sample demonstrates how to create an Azure AI agent that answers diff --git a/python/samples/concepts/agents/azure_ai_agent/azure_ai_agent_declarative_with_existing_agent_id.py b/python/samples/concepts/agents/azure_ai_agent/azure_ai_agent_declarative_with_existing_agent_id.py index 1167e5f2ab16..6b14fe49aba2 100644 --- a/python/samples/concepts/agents/azure_ai_agent/azure_ai_agent_declarative_with_existing_agent_id.py +++ b/python/samples/concepts/agents/azure_ai_agent/azure_ai_agent_declarative_with_existing_agent_id.py @@ -4,8 +4,7 @@ from azure.identity.aio import DefaultAzureCredential -from semantic_kernel.agents import AzureAIAgent -from semantic_kernel.agents.agent import AgentRegistry +from semantic_kernel.agents import AgentRegistry, AzureAIAgent """ The following sample demonstrates how to create an Azure AI agent based diff --git a/python/samples/concepts/agents/openai_assistant/azure_openai_assistant_declarative_file_search.py b/python/samples/concepts/agents/openai_assistant/azure_openai_assistant_declarative_file_search.py index 80851bc1338f..66ec1b46e82e 100644 --- a/python/samples/concepts/agents/openai_assistant/azure_openai_assistant_declarative_file_search.py +++ b/python/samples/concepts/agents/openai_assistant/azure_openai_assistant_declarative_file_search.py @@ -3,8 +3,7 @@ import asyncio import os -from semantic_kernel.agents import AzureAssistantAgent -from semantic_kernel.agents.agent import AgentRegistry +from semantic_kernel.agents import AgentRegistry, AzureAssistantAgent """ The following sample demonstrates how to create an Azure Assistant Agent that answers diff --git a/python/samples/concepts/agents/openai_assistant/azure_openai_assistant_declarative_templating.py b/python/samples/concepts/agents/openai_assistant/azure_openai_assistant_declarative_templating.py index 2684112bb7f1..16d7704a0165 100644 --- a/python/samples/concepts/agents/openai_assistant/azure_openai_assistant_declarative_templating.py +++ b/python/samples/concepts/agents/openai_assistant/azure_openai_assistant_declarative_templating.py @@ -2,8 +2,7 @@ import asyncio -from semantic_kernel.agents import AzureAssistantAgent -from semantic_kernel.agents.agent import AgentRegistry +from semantic_kernel.agents import AgentRegistry, AzureAssistantAgent """ The following sample demonstrates how to create an Azure Assistant Agent that answers diff --git a/python/samples/concepts/agents/openai_assistant/openai_assistant_declarative_file_search.py b/python/samples/concepts/agents/openai_assistant/openai_assistant_declarative_file_search.py index 5870d072fe15..d82baa234b84 100644 --- a/python/samples/concepts/agents/openai_assistant/openai_assistant_declarative_file_search.py +++ b/python/samples/concepts/agents/openai_assistant/openai_assistant_declarative_file_search.py @@ -3,8 +3,7 @@ import asyncio import os -from semantic_kernel.agents import OpenAIAssistantAgent -from semantic_kernel.agents.agent import AgentRegistry +from semantic_kernel.agents import AgentRegistry, OpenAIAssistantAgent """ The following sample demonstrates how to create an OpenAI Assistant Agent that answers diff --git a/python/samples/concepts/agents/openai_assistant/openai_assistant_declarative_function_calling_from_file.py b/python/samples/concepts/agents/openai_assistant/openai_assistant_declarative_function_calling_from_file.py index 5fdfaf3231ac..30126c9d25f0 100644 --- a/python/samples/concepts/agents/openai_assistant/openai_assistant_declarative_function_calling_from_file.py +++ b/python/samples/concepts/agents/openai_assistant/openai_assistant_declarative_function_calling_from_file.py @@ -5,7 +5,7 @@ from typing import Annotated from semantic_kernel.agents import AgentRegistry, OpenAIAssistantAgent -from semantic_kernel.functions.kernel_function_decorator import kernel_function +from semantic_kernel.functions import kernel_function """ The following sample demonstrates how to create an OpenAI Assistant Agent that answers diff --git a/python/samples/concepts/agents/openai_assistant/openai_assistant_declarative_templating.py b/python/samples/concepts/agents/openai_assistant/openai_assistant_declarative_templating.py index 273a4cc0436a..80191ad486e4 100644 --- a/python/samples/concepts/agents/openai_assistant/openai_assistant_declarative_templating.py +++ b/python/samples/concepts/agents/openai_assistant/openai_assistant_declarative_templating.py @@ -2,8 +2,7 @@ import asyncio -from semantic_kernel.agents import OpenAIAssistantAgent -from semantic_kernel.agents.agent import AgentRegistry +from semantic_kernel.agents import AgentRegistry, OpenAIAssistantAgent """ The following sample demonstrates how to create an OpenAI Assistant Agent that answers diff --git a/python/samples/concepts/agents/openai_assistant/openai_assistant_declarative_with_existing_agent_id.py b/python/samples/concepts/agents/openai_assistant/openai_assistant_declarative_with_existing_agent_id.py index 5b8b8f3d4c62..7f945dc47f4a 100644 --- a/python/samples/concepts/agents/openai_assistant/openai_assistant_declarative_with_existing_agent_id.py +++ b/python/samples/concepts/agents/openai_assistant/openai_assistant_declarative_with_existing_agent_id.py @@ -2,8 +2,7 @@ import asyncio -from semantic_kernel.agents.agent import AgentRegistry -from semantic_kernel.agents.open_ai.openai_assistant_agent import OpenAIAssistantAgent +from semantic_kernel.agents import AgentRegistry, OpenAIAssistantAgent """ The following sample demonstrates how to create an OpenAI Assistant Agent based diff --git a/python/samples/concepts/agents/openai_responses/azure_openai_responses_agent_declarative_file_search.py b/python/samples/concepts/agents/openai_responses/azure_openai_responses_agent_declarative_file_search.py index 0aa5cde94092..53d8f4094dfb 100644 --- a/python/samples/concepts/agents/openai_responses/azure_openai_responses_agent_declarative_file_search.py +++ b/python/samples/concepts/agents/openai_responses/azure_openai_responses_agent_declarative_file_search.py @@ -3,8 +3,7 @@ import asyncio import os -from semantic_kernel.agents import AzureResponsesAgent -from semantic_kernel.agents.agent import AgentRegistry +from semantic_kernel.agents import AgentRegistry, AzureResponsesAgent """ The following sample demonstrates how to create an Azure AI agent that answers diff --git a/python/samples/concepts/agents/openai_responses/azure_openai_responses_agent_declarative_function_calling_from_file.py b/python/samples/concepts/agents/openai_responses/azure_openai_responses_agent_declarative_function_calling_from_file.py index 3c13ee775d65..f082f438f9e9 100644 --- a/python/samples/concepts/agents/openai_responses/azure_openai_responses_agent_declarative_function_calling_from_file.py +++ b/python/samples/concepts/agents/openai_responses/azure_openai_responses_agent_declarative_function_calling_from_file.py @@ -5,7 +5,7 @@ from typing import Annotated from semantic_kernel.agents import AgentRegistry, AzureResponsesAgent -from semantic_kernel.functions.kernel_function_decorator import kernel_function +from semantic_kernel.functions import kernel_function """ The following sample demonstrates how to create an Azure AI agent that answers diff --git a/python/samples/concepts/agents/openai_responses/azure_openai_responses_agent_declarative_templating.py b/python/samples/concepts/agents/openai_responses/azure_openai_responses_agent_declarative_templating.py index f21fd96bccd6..0a80c8266411 100644 --- a/python/samples/concepts/agents/openai_responses/azure_openai_responses_agent_declarative_templating.py +++ b/python/samples/concepts/agents/openai_responses/azure_openai_responses_agent_declarative_templating.py @@ -2,8 +2,7 @@ import asyncio -from semantic_kernel.agents import AzureResponsesAgent -from semantic_kernel.agents.agent import AgentRegistry +from semantic_kernel.agents import AgentRegistry, AzureResponsesAgent """ The following sample demonstrates how to create an Azure AI agent that answers diff --git a/python/samples/concepts/agents/openai_responses/openai_responses_agent_declarative_file_search.py b/python/samples/concepts/agents/openai_responses/openai_responses_agent_declarative_file_search.py index f6867516bc05..bb9d8a55b31c 100644 --- a/python/samples/concepts/agents/openai_responses/openai_responses_agent_declarative_file_search.py +++ b/python/samples/concepts/agents/openai_responses/openai_responses_agent_declarative_file_search.py @@ -3,8 +3,7 @@ import asyncio import os -from semantic_kernel.agents import OpenAIResponsesAgent -from semantic_kernel.agents.agent import AgentRegistry +from semantic_kernel.agents import AgentRegistry, OpenAIResponsesAgent """ The following sample demonstrates how to create an Azure AI agent that answers diff --git a/python/samples/concepts/agents/openai_responses/openai_responses_agent_declarative_function_calling_from_file.py b/python/samples/concepts/agents/openai_responses/openai_responses_agent_declarative_function_calling_from_file.py index 1a8a11ff42da..f62f12371182 100644 --- a/python/samples/concepts/agents/openai_responses/openai_responses_agent_declarative_function_calling_from_file.py +++ b/python/samples/concepts/agents/openai_responses/openai_responses_agent_declarative_function_calling_from_file.py @@ -5,7 +5,7 @@ from typing import Annotated from semantic_kernel.agents import AgentRegistry, OpenAIResponsesAgent -from semantic_kernel.functions.kernel_function_decorator import kernel_function +from semantic_kernel.functions import kernel_function """ The following sample demonstrates how to create an Azure AI agent that answers diff --git a/python/samples/concepts/agents/openai_responses/openai_responses_agent_declarative_templating.py b/python/samples/concepts/agents/openai_responses/openai_responses_agent_declarative_templating.py index d825c6a45f40..df040c8d89f5 100644 --- a/python/samples/concepts/agents/openai_responses/openai_responses_agent_declarative_templating.py +++ b/python/samples/concepts/agents/openai_responses/openai_responses_agent_declarative_templating.py @@ -2,8 +2,7 @@ import asyncio -from semantic_kernel.agents import OpenAIResponsesAgent -from semantic_kernel.agents.agent import AgentRegistry +from semantic_kernel.agents import AgentRegistry, OpenAIResponsesAgent """ The following sample demonstrates how to create an Azure AI agent that answers diff --git a/python/samples/concepts/agents/openai_responses/openai_responses_agent_declarative_web_search.py b/python/samples/concepts/agents/openai_responses/openai_responses_agent_declarative_web_search.py index cfcb1c81e050..e23b6d8c8658 100644 --- a/python/samples/concepts/agents/openai_responses/openai_responses_agent_declarative_web_search.py +++ b/python/samples/concepts/agents/openai_responses/openai_responses_agent_declarative_web_search.py @@ -2,8 +2,7 @@ import asyncio -from semantic_kernel.agents import OpenAIResponsesAgent -from semantic_kernel.agents.agent import AgentRegistry +from semantic_kernel.agents import AgentRegistry, OpenAIResponsesAgent """ The following sample demonstrates how to create an Azure AI agent that answers diff --git a/python/tests/unit/agents/openai_assistant/test_azure_assistant_agent.py b/python/tests/unit/agents/openai_assistant/test_azure_assistant_agent.py index 10f0137f0461..fba15003f99e 100644 --- a/python/tests/unit/agents/openai_assistant/test_azure_assistant_agent.py +++ b/python/tests/unit/agents/openai_assistant/test_azure_assistant_agent.py @@ -13,7 +13,7 @@ from openai.types.beta.threads.text_content_block import TextContentBlock from pydantic import BaseModel, ValidationError -from semantic_kernel.agents.agent import AgentRegistry +from semantic_kernel.agents import AgentRegistry from semantic_kernel.agents.open_ai.azure_assistant_agent import AzureAssistantAgent from semantic_kernel.agents.open_ai.openai_assistant_agent import AssistantAgentThread from semantic_kernel.agents.open_ai.run_polling_options import RunPollingOptions diff --git a/python/tests/unit/agents/openai_assistant/test_openai_assistant_agent.py b/python/tests/unit/agents/openai_assistant/test_openai_assistant_agent.py index ad128f850216..6423ebf39b74 100644 --- a/python/tests/unit/agents/openai_assistant/test_openai_assistant_agent.py +++ b/python/tests/unit/agents/openai_assistant/test_openai_assistant_agent.py @@ -7,8 +7,7 @@ from openai.types.beta.assistant import Assistant from pydantic import BaseModel, ValidationError -from semantic_kernel.agents import OpenAIAssistantAgent -from semantic_kernel.agents.agent import AgentRegistry, AgentResponseItem +from semantic_kernel.agents import AgentRegistry, AgentResponseItem, OpenAIAssistantAgent from semantic_kernel.agents.open_ai.openai_assistant_agent import AssistantAgentThread from semantic_kernel.agents.open_ai.run_polling_options import RunPollingOptions from semantic_kernel.contents.chat_history import ChatHistory diff --git a/python/tests/unit/agents/openai_responses/test_openai_responses_agent.py b/python/tests/unit/agents/openai_responses/test_openai_responses_agent.py index 7888e95c5187..d0674d223166 100644 --- a/python/tests/unit/agents/openai_responses/test_openai_responses_agent.py +++ b/python/tests/unit/agents/openai_responses/test_openai_responses_agent.py @@ -6,7 +6,7 @@ from openai import AsyncOpenAI from pydantic import BaseModel, ValidationError -from semantic_kernel.agents.agent import AgentRegistry +from semantic_kernel.agents import AgentRegistry from semantic_kernel.agents.open_ai.openai_responses_agent import OpenAIResponsesAgent, ResponsesAgentThread from semantic_kernel.agents.open_ai.run_polling_options import RunPollingOptions from semantic_kernel.contents.chat_message_content import ChatMessageContent From 8e6999a8f5bd3b78b9b57d26a43699e093727a5e Mon Sep 17 00:00:00 2001 From: Evan Mattson Date: Fri, 23 May 2025 11:49:02 +0900 Subject: [PATCH 12/18] Simplify imports, clean up samples --- python/semantic_kernel/agents/agent.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/python/semantic_kernel/agents/agent.py b/python/semantic_kernel/agents/agent.py index 6cf58cf53924..65ce45305356 100644 --- a/python/semantic_kernel/agents/agent.py +++ b/python/semantic_kernel/agents/agent.py @@ -774,6 +774,7 @@ async def create_from_dict( kernel: Kernel | None = None, plugins: list[KernelPlugin | object] | dict[str, KernelPlugin | object] | None = None, settings: "KernelBaseSettings | None" = None, + extras: dict[str, Any] | None = None, **kwargs, ) -> _TAgent: """Create a single agent instance from a dictionary. @@ -783,6 +784,7 @@ async def create_from_dict( kernel: The Kernel instance to use for tool resolution and agent initialization. plugins: The plugins to use for the agent. settings: The settings to use for the agent. + extras: Additional parameters to resolve placeholders in the YAML. **kwargs: Additional parameters passed to the agent constructor if required. Returns: @@ -814,7 +816,9 @@ async def create_from_dict( return await agent_cls.from_dict( data, kernel=kernel, + plugins=plugins, settings=settings, + extras=extras, **kwargs, ) @@ -987,9 +991,9 @@ def _normalize_spec_fields( if v.get("default") is not None } - # Step 1: Start with model options + # Start with model options arguments = KernelArguments(**model_options) - # Step 2: Update with input defaults (only if not already provided by model options) + # Update with input defaults (only if not already provided by model options) for k, v in input_defaults.items(): if k not in arguments: arguments[k] = v From 9305aee5e56fa94b774bff2cb7b963f0727a6a00 Mon Sep 17 00:00:00 2001 From: Evan Mattson Date: Fri, 23 May 2025 12:08:16 +0900 Subject: [PATCH 13/18] Fix typo --- ...ai_responses_agent_declarative_function_calling_from_file.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/python/samples/concepts/agents/openai_responses/azure_openai_responses_agent_declarative_function_calling_from_file.py b/python/samples/concepts/agents/openai_responses/azure_openai_responses_agent_declarative_function_calling_from_file.py index f082f438f9e9..48be2f91e40f 100644 --- a/python/samples/concepts/agents/openai_responses/azure_openai_responses_agent_declarative_function_calling_from_file.py +++ b/python/samples/concepts/agents/openai_responses/azure_openai_responses_agent_declarative_function_calling_from_file.py @@ -42,7 +42,7 @@ async def main(): os.path.dirname(os.path.dirname(os.path.dirname(os.path.realpath(__file__)))), "resources", "declarative_spec", - "azure_resonses_spec.yaml", + "azure_responses_spec.yaml", ) # Create the Responses Agent from the YAML spec From 3f04752dfcd870cecabd10f2959efa00ead97b71 Mon Sep 17 00:00:00 2001 From: Evan Mattson Date: Fri, 23 May 2025 13:29:37 +0900 Subject: [PATCH 14/18] PR Feedback --- .../azure_ai_agent_declarative_file_search.py | 10 +++------- .../azure_ai_agent_declarative_templating.py | 17 +++++++++-------- ..._openai_assistant_declarative_file_search.py | 5 ++--- ...e_openai_assistant_declarative_templating.py | 7 ++----- .../openai_assistant_declarative_templating.py | 5 +---- ...i_responses_agent_declarative_file_search.py | 10 +++------- ...nt_declarative_function_calling_from_file.py | 2 +- ...ai_responses_agent_declarative_templating.py | 7 ++----- ...i_responses_agent_declarative_file_search.py | 9 +++------ ...nt_declarative_function_calling_from_file.py | 2 +- ...ai_responses_agent_declarative_templating.py | 7 ++----- ...ai_responses_agent_declarative_web_search.py | 7 ++----- .../agents/open_ai/openai_assistant_agent.py | 2 +- 13 files changed, 32 insertions(+), 58 deletions(-) diff --git a/python/samples/concepts/agents/azure_ai_agent/azure_ai_agent_declarative_file_search.py b/python/samples/concepts/agents/azure_ai_agent/azure_ai_agent_declarative_file_search.py index 87128dba7301..fac0d72091c7 100644 --- a/python/samples/concepts/agents/azure_ai_agent/azure_ai_agent_declarative_file_search.py +++ b/python/samples/concepts/agents/azure_ai_agent/azure_ai_agent_declarative_file_search.py @@ -10,20 +10,16 @@ """ The following sample demonstrates how to create an Azure AI agent that answers -user questions using the file search tool. - -The agent is used to answer user questions that require file search to help ground -answers from the model. +user questions using the file search tool from a declarative spec. """ # Define the YAML string for the sample spec = """ type: foundry_agent name: FileSearchAgent -description: Agent with code interpreter tool. +description: Agent with file search tool. instructions: > - Use the code interpreter tool to answer questions that require code to be generated - and executed. + Use the file searh tool to answer questions from the user. model: id: ${AzureAI:ChatModelId} connection: diff --git a/python/samples/concepts/agents/azure_ai_agent/azure_ai_agent_declarative_templating.py b/python/samples/concepts/agents/azure_ai_agent/azure_ai_agent_declarative_templating.py index 080948988dea..521a4f6b85f2 100644 --- a/python/samples/concepts/agents/azure_ai_agent/azure_ai_agent_declarative_templating.py +++ b/python/samples/concepts/agents/azure_ai_agent/azure_ai_agent_declarative_templating.py @@ -7,11 +7,8 @@ from semantic_kernel.agents import AgentRegistry, AzureAIAgent """ -The following sample demonstrates how to create an Azure AI agent that answers -user questions using the file search tool. - -The agent is used to answer user questions that require file search to help ground -answers from the model. +The following sample demonstrates how to create an Azure AI Agent that invokes +a story generation task using a prompt template and a declarative spec. """ # Define the YAML string for the sample @@ -23,7 +20,7 @@ model: id: ${AzureAI:ChatModelId} connection: - connection_string: ${AzureAI:ConnectionString} + connection_string: ${AzureAI:Endpoint} inputs: topic: description: The topic of the story. @@ -62,9 +59,13 @@ async def main(): # Cleanup: Delete the agent, vector store, and file await client.agents.delete_agent(agent.id) - """ + """ + Sample output: - """ + # StoryAgent: Under the silvery moon, three mischievous cats tiptoed across the rooftop, chasing + shadows and sharing secret whispers. By dawn, they curled up together, purring softly, dreaming + of adventures yet to come. + """ if __name__ == "__main__": diff --git a/python/samples/concepts/agents/openai_assistant/azure_openai_assistant_declarative_file_search.py b/python/samples/concepts/agents/openai_assistant/azure_openai_assistant_declarative_file_search.py index 66ec1b46e82e..c88375722d1c 100644 --- a/python/samples/concepts/agents/openai_assistant/azure_openai_assistant_declarative_file_search.py +++ b/python/samples/concepts/agents/openai_assistant/azure_openai_assistant_declarative_file_search.py @@ -17,10 +17,9 @@ spec = """ type: azure_assistant name: FileSearchAgent -description: Agent with code interpreter tool. +description: Agent with file search tool. instructions: > - Use the code interpreter tool to answer questions that require code to be generated - and executed. + Use the file search tool to answer questions from the user. model: id: ${AzureOpenAI:ChatModelId} connection: diff --git a/python/samples/concepts/agents/openai_assistant/azure_openai_assistant_declarative_templating.py b/python/samples/concepts/agents/openai_assistant/azure_openai_assistant_declarative_templating.py index 16d7704a0165..16f25063cf09 100644 --- a/python/samples/concepts/agents/openai_assistant/azure_openai_assistant_declarative_templating.py +++ b/python/samples/concepts/agents/openai_assistant/azure_openai_assistant_declarative_templating.py @@ -5,11 +5,8 @@ from semantic_kernel.agents import AgentRegistry, AzureAssistantAgent """ -The following sample demonstrates how to create an Azure Assistant Agent that answers -user questions using the file search tool. - -The agent is used to answer user questions that require file search to help ground -answers from the model. +The following sample demonstrates how to create an Azure Assistant Agent that invokes +a story generation task using a prompt template and a declarative spec. """ # Define the YAML string for the sample diff --git a/python/samples/concepts/agents/openai_assistant/openai_assistant_declarative_templating.py b/python/samples/concepts/agents/openai_assistant/openai_assistant_declarative_templating.py index 80191ad486e4..c73483f47ca7 100644 --- a/python/samples/concepts/agents/openai_assistant/openai_assistant_declarative_templating.py +++ b/python/samples/concepts/agents/openai_assistant/openai_assistant_declarative_templating.py @@ -6,10 +6,7 @@ """ The following sample demonstrates how to create an OpenAI Assistant Agent that answers -user questions using the file search tool. - -The agent is used to answer user questions that require file search to help ground -answers from the model. +user questions using templating from a declarative spec. """ # Define the YAML string for the sample diff --git a/python/samples/concepts/agents/openai_responses/azure_openai_responses_agent_declarative_file_search.py b/python/samples/concepts/agents/openai_responses/azure_openai_responses_agent_declarative_file_search.py index 53d8f4094dfb..388c29b744c5 100644 --- a/python/samples/concepts/agents/openai_responses/azure_openai_responses_agent_declarative_file_search.py +++ b/python/samples/concepts/agents/openai_responses/azure_openai_responses_agent_declarative_file_search.py @@ -6,21 +6,17 @@ from semantic_kernel.agents import AgentRegistry, AzureResponsesAgent """ -The following sample demonstrates how to create an Azure AI agent that answers +The following sample demonstrates how to create an Azure Responses Agent that answers user questions using the file search tool. - -The agent is used to answer user questions that require file search to help ground -answers from the model. """ # Define the YAML string for the sample spec = """ type: azure_responses name: FileSearchAgent -description: Agent with code interpreter tool. +description: Agent with file search tool. instructions: > - Use the code interpreter tool to answer questions that require code to be generated - and executed. + Use the file search tool to answer questions from the user. model: id: ${AzureOpenAI:ChatModelId} connection: diff --git a/python/samples/concepts/agents/openai_responses/azure_openai_responses_agent_declarative_function_calling_from_file.py b/python/samples/concepts/agents/openai_responses/azure_openai_responses_agent_declarative_function_calling_from_file.py index 48be2f91e40f..ded950708bc0 100644 --- a/python/samples/concepts/agents/openai_responses/azure_openai_responses_agent_declarative_function_calling_from_file.py +++ b/python/samples/concepts/agents/openai_responses/azure_openai_responses_agent_declarative_function_calling_from_file.py @@ -8,7 +8,7 @@ from semantic_kernel.functions import kernel_function """ -The following sample demonstrates how to create an Azure AI agent that answers +The following sample demonstrates how to create an Azure Responses Agent that answers user questions. The sample shows how to load a declarative spec from a file. The plugins/functions must already exist in the kernel. They are not created declaratively via the spec. diff --git a/python/samples/concepts/agents/openai_responses/azure_openai_responses_agent_declarative_templating.py b/python/samples/concepts/agents/openai_responses/azure_openai_responses_agent_declarative_templating.py index 0a80c8266411..95a086eaf052 100644 --- a/python/samples/concepts/agents/openai_responses/azure_openai_responses_agent_declarative_templating.py +++ b/python/samples/concepts/agents/openai_responses/azure_openai_responses_agent_declarative_templating.py @@ -5,11 +5,8 @@ from semantic_kernel.agents import AgentRegistry, AzureResponsesAgent """ -The following sample demonstrates how to create an Azure AI agent that answers -user questions using the file search tool. - -The agent is used to answer user questions that require file search to help ground -answers from the model. +The following sample demonstrates how to create an Azure Responses Agent that invokes +a story generation task using a prompt template and a declarative spec. """ # Define the YAML string for the sample diff --git a/python/samples/concepts/agents/openai_responses/openai_responses_agent_declarative_file_search.py b/python/samples/concepts/agents/openai_responses/openai_responses_agent_declarative_file_search.py index bb9d8a55b31c..7410adc1a59b 100644 --- a/python/samples/concepts/agents/openai_responses/openai_responses_agent_declarative_file_search.py +++ b/python/samples/concepts/agents/openai_responses/openai_responses_agent_declarative_file_search.py @@ -6,18 +6,15 @@ from semantic_kernel.agents import AgentRegistry, OpenAIResponsesAgent """ -The following sample demonstrates how to create an Azure AI agent that answers -user questions using the file search tool. - -The agent is used to answer user questions that require file search to help ground -answers from the model. +The following sample demonstrates how to create an OpenAI Responses Agent that answers +user questions using the file search tool based on a declarative spec. """ # Define the YAML string for the sample spec = """ type: openai_responses name: FileSearchAgent -description: Agent with code interpreter tool. +description: Agent with file search tool. instructions: > Find answers to the user's questions in the provided file. model: diff --git a/python/samples/concepts/agents/openai_responses/openai_responses_agent_declarative_function_calling_from_file.py b/python/samples/concepts/agents/openai_responses/openai_responses_agent_declarative_function_calling_from_file.py index f62f12371182..ef9c3a1c05ef 100644 --- a/python/samples/concepts/agents/openai_responses/openai_responses_agent_declarative_function_calling_from_file.py +++ b/python/samples/concepts/agents/openai_responses/openai_responses_agent_declarative_function_calling_from_file.py @@ -8,7 +8,7 @@ from semantic_kernel.functions import kernel_function """ -The following sample demonstrates how to create an Azure AI agent that answers +The following sample demonstrates how to create an OpenAI Responses Agent that answers user questions. The sample shows how to load a declarative spec from a file. The plugins/functions must already exist in the kernel. They are not created declaratively via the spec. diff --git a/python/samples/concepts/agents/openai_responses/openai_responses_agent_declarative_templating.py b/python/samples/concepts/agents/openai_responses/openai_responses_agent_declarative_templating.py index df040c8d89f5..5304127413db 100644 --- a/python/samples/concepts/agents/openai_responses/openai_responses_agent_declarative_templating.py +++ b/python/samples/concepts/agents/openai_responses/openai_responses_agent_declarative_templating.py @@ -5,11 +5,8 @@ from semantic_kernel.agents import AgentRegistry, OpenAIResponsesAgent """ -The following sample demonstrates how to create an Azure AI agent that answers -user questions using the file search tool. - -The agent is used to answer user questions that require file search to help ground -answers from the model. +The following sample demonstrates how to create an OpenAI Responses Agent that invokes +a story generation task using a prompt template and a declarative spec. """ # Define the YAML string for the sample diff --git a/python/samples/concepts/agents/openai_responses/openai_responses_agent_declarative_web_search.py b/python/samples/concepts/agents/openai_responses/openai_responses_agent_declarative_web_search.py index e23b6d8c8658..bfb1278d3d7b 100644 --- a/python/samples/concepts/agents/openai_responses/openai_responses_agent_declarative_web_search.py +++ b/python/samples/concepts/agents/openai_responses/openai_responses_agent_declarative_web_search.py @@ -5,11 +5,8 @@ from semantic_kernel.agents import AgentRegistry, OpenAIResponsesAgent """ -The following sample demonstrates how to create an Azure AI agent that answers -user questions using the file search tool. - -The agent is used to answer user questions that require file search to help ground -answers from the model. +The following sample demonstrates how to create an OpenAI Responses Agent that answers +user questions using the web search tool based on a declarative spec. """ # Define the YAML string for the sample diff --git a/python/semantic_kernel/agents/open_ai/openai_assistant_agent.py b/python/semantic_kernel/agents/open_ai/openai_assistant_agent.py index 875fbbee7416..80412fb9a719 100644 --- a/python/semantic_kernel/agents/open_ai/openai_assistant_agent.py +++ b/python/semantic_kernel/agents/open_ai/openai_assistant_agent.py @@ -308,7 +308,7 @@ def __init__( @staticmethod @deprecated( - "setup_resources is deprecated. Use AzureAssistantAgent.create_client() instead. This method will be removed by 2025-06-15." # noqa: E501 + "setup_resources is deprecated. Use OpenAIAssistantAgent.create_client() instead. This method will be removed by 2025-06-15." # noqa: E501 ) def setup_resources( *, From 4d8ccc39e36cb92ab48b3e0d968345b84ed7a35d Mon Sep 17 00:00:00 2001 From: Evan Mattson Date: Fri, 23 May 2025 13:30:32 +0900 Subject: [PATCH 15/18] Fix typo --- .../azure_ai_agent/azure_ai_agent_declarative_file_search.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/python/samples/concepts/agents/azure_ai_agent/azure_ai_agent_declarative_file_search.py b/python/samples/concepts/agents/azure_ai_agent/azure_ai_agent_declarative_file_search.py index fac0d72091c7..57d09d71ac6d 100644 --- a/python/samples/concepts/agents/azure_ai_agent/azure_ai_agent_declarative_file_search.py +++ b/python/samples/concepts/agents/azure_ai_agent/azure_ai_agent_declarative_file_search.py @@ -19,7 +19,7 @@ name: FileSearchAgent description: Agent with file search tool. instructions: > - Use the file searh tool to answer questions from the user. + Use the file search tool to answer questions from the user. model: id: ${AzureAI:ChatModelId} connection: From 24a83d08e94bcbf59373c23275c1037ebdd4e6f4 Mon Sep 17 00:00:00 2001 From: Evan Mattson Date: Fri, 23 May 2025 14:48:33 +0900 Subject: [PATCH 16/18] Update sample doc string --- .../openai_assistant_declarative_templating.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/python/samples/concepts/agents/openai_assistant/openai_assistant_declarative_templating.py b/python/samples/concepts/agents/openai_assistant/openai_assistant_declarative_templating.py index c73483f47ca7..43c1ad9609f0 100644 --- a/python/samples/concepts/agents/openai_assistant/openai_assistant_declarative_templating.py +++ b/python/samples/concepts/agents/openai_assistant/openai_assistant_declarative_templating.py @@ -5,8 +5,8 @@ from semantic_kernel.agents import AgentRegistry, OpenAIAssistantAgent """ -The following sample demonstrates how to create an OpenAI Assistant Agent that answers -user questions using templating from a declarative spec. +The following sample demonstrates how to create an OpenAI Assistant Agent that invokes +a story generation task using a prompt template and a declarative spec. """ # Define the YAML string for the sample From b44e37bec02a6c17815d0d3587a1a199e54419e5 Mon Sep 17 00:00:00 2001 From: Evan Mattson Date: Mon, 26 May 2025 10:51:26 +0900 Subject: [PATCH 17/18] Resolve conflict with uv.lock --- python/uv.lock | 1864 +++++++++++++++++++++++------------------------- 1 file changed, 897 insertions(+), 967 deletions(-) diff --git a/python/uv.lock b/python/uv.lock index ef34aba16987..357b0cfbdcac 100644 --- a/python/uv.lock +++ b/python/uv.lock @@ -2,22 +2,21 @@ version = 1 revision = 2 requires-python = ">=3.10" resolution-markers = [ - "python_version < '0'", - "python_full_version < '3.11' and sys_platform == 'darwin'", - "python_full_version == '3.11.*' and sys_platform == 'darwin'", "python_full_version >= '4.0' and sys_platform == 'darwin'", - "python_full_version == '3.12.*' and sys_platform == 'darwin'", "python_full_version >= '3.13' and python_full_version < '4.0' and sys_platform == 'darwin'", - "python_full_version < '3.11' and sys_platform == 'linux'", - "python_full_version == '3.11.*' and sys_platform == 'linux'", + "python_full_version == '3.12.*' and sys_platform == 'darwin'", + "python_full_version == '3.11.*' and sys_platform == 'darwin'", + "python_full_version < '3.11' and sys_platform == 'darwin'", "python_full_version >= '4.0' and sys_platform == 'linux'", - "python_full_version == '3.12.*' and sys_platform == 'linux'", "python_full_version >= '3.13' and python_full_version < '4.0' and sys_platform == 'linux'", - "python_full_version < '3.11' and sys_platform == 'win32'", - "python_full_version == '3.11.*' and sys_platform == 'win32'", + "python_full_version == '3.12.*' and sys_platform == 'linux'", + "python_full_version == '3.11.*' and sys_platform == 'linux'", + "python_full_version < '3.11' and sys_platform == 'linux'", "python_full_version >= '4.0' and sys_platform == 'win32'", - "python_full_version == '3.12.*' and sys_platform == 'win32'", "python_full_version >= '3.13' and python_full_version < '4.0' and sys_platform == 'win32'", + "python_full_version == '3.12.*' and sys_platform == 'win32'", + "python_full_version == '3.11.*' and sys_platform == 'win32'", + "python_full_version < '3.11' and sys_platform == 'win32'", ] supported-markers = [ "sys_platform == 'darwin'", @@ -54,7 +53,7 @@ wheels = [ [[package]] name = "aiohttp" -version = "3.11.18" +version = "3.12.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "aiohappyeyeballs", marker = "sys_platform == 'darwin' or sys_platform == 'linux' or sys_platform == 'win32'" }, @@ -66,72 +65,76 @@ dependencies = [ { name = "propcache", marker = "sys_platform == 'darwin' or sys_platform == 'linux' or sys_platform == 'win32'" }, { name = "yarl", marker = "sys_platform == 'darwin' or sys_platform == 'linux' or sys_platform == 'win32'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/63/e7/fa1a8c00e2c54b05dc8cb5d1439f627f7c267874e3f7bb047146116020f9/aiohttp-3.11.18.tar.gz", hash = "sha256:ae856e1138612b7e412db63b7708735cff4d38d0399f6a5435d3dac2669f558a", size = 7678653, upload-time = "2025-04-21T09:43:09.191Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/c7/c3/e5f64af7e97a02f547020e6ff861595766bb5ecb37c7492fac9fe3c14f6c/aiohttp-3.11.18-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:96264854fedbea933a9ca4b7e0c745728f01380691687b7365d18d9e977179c4", size = 711703, upload-time = "2025-04-21T09:40:25.487Z" }, - { url = "https://files.pythonhosted.org/packages/5f/2f/53c26e96efa5fd01ebcfe1fefdfb7811f482bb21f4fa103d85eca4dcf888/aiohttp-3.11.18-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:9602044ff047043430452bc3a2089743fa85da829e6fc9ee0025351d66c332b6", size = 471348, upload-time = "2025-04-21T09:40:27.569Z" }, - { url = "https://files.pythonhosted.org/packages/80/47/dcc248464c9b101532ee7d254a46f6ed2c1fd3f4f0f794cf1f2358c0d45b/aiohttp-3.11.18-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:5691dc38750fcb96a33ceef89642f139aa315c8a193bbd42a0c33476fd4a1609", size = 457611, upload-time = "2025-04-21T09:40:28.978Z" }, - { url = "https://files.pythonhosted.org/packages/4c/ca/67d816ef075e8ac834b5f1f6b18e8db7d170f7aebaf76f1be462ea10cab0/aiohttp-3.11.18-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:554c918ec43f8480b47a5ca758e10e793bd7410b83701676a4782672d670da55", size = 1591976, upload-time = "2025-04-21T09:40:30.804Z" }, - { url = "https://files.pythonhosted.org/packages/46/00/0c120287aa51c744438d99e9aae9f8c55ca5b9911c42706966c91c9d68d6/aiohttp-3.11.18-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8a4076a2b3ba5b004b8cffca6afe18a3b2c5c9ef679b4d1e9859cf76295f8d4f", size = 1632819, upload-time = "2025-04-21T09:40:32.731Z" }, - { url = "https://files.pythonhosted.org/packages/54/a3/3923c9040cd4927dfee1aa017513701e35adcfc35d10729909688ecaa465/aiohttp-3.11.18-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:767a97e6900edd11c762be96d82d13a1d7c4fc4b329f054e88b57cdc21fded94", size = 1666567, upload-time = "2025-04-21T09:40:34.901Z" }, - { url = "https://files.pythonhosted.org/packages/e0/ab/40dacb15c0c58f7f17686ea67bc186e9f207341691bdb777d1d5ff4671d5/aiohttp-3.11.18-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f0ddc9337a0fb0e727785ad4f41163cc314376e82b31846d3835673786420ef1", size = 1594959, upload-time = "2025-04-21T09:40:36.714Z" }, - { url = "https://files.pythonhosted.org/packages/0d/98/d40c2b7c4a5483f9a16ef0adffce279ced3cc44522e84b6ba9e906be5168/aiohttp-3.11.18-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f414f37b244f2a97e79b98d48c5ff0789a0b4b4609b17d64fa81771ad780e415", size = 1538516, upload-time = "2025-04-21T09:40:38.263Z" }, - { url = "https://files.pythonhosted.org/packages/cf/10/e0bf3a03524faac45a710daa034e6f1878b24a1fef9c968ac8eb786ae657/aiohttp-3.11.18-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:fdb239f47328581e2ec7744ab5911f97afb10752332a6dd3d98e14e429e1a9e7", size = 1529037, upload-time = "2025-04-21T09:40:40.349Z" }, - { url = "https://files.pythonhosted.org/packages/ad/d6/5ff5282e00e4eb59c857844984cbc5628f933e2320792e19f93aff518f52/aiohttp-3.11.18-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:f2c50bad73ed629cc326cc0f75aed8ecfb013f88c5af116f33df556ed47143eb", size = 1546813, upload-time = "2025-04-21T09:40:42.106Z" }, - { url = "https://files.pythonhosted.org/packages/de/96/f1014f84101f9b9ad2d8acf3cc501426475f7f0cc62308ae5253e2fac9a7/aiohttp-3.11.18-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:0a8d8f20c39d3fa84d1c28cdb97f3111387e48209e224408e75f29c6f8e0861d", size = 1523852, upload-time = "2025-04-21T09:40:44.164Z" }, - { url = "https://files.pythonhosted.org/packages/a5/86/ec772c6838dd6bae3229065af671891496ac1834b252f305cee8152584b2/aiohttp-3.11.18-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:106032eaf9e62fd6bc6578c8b9e6dc4f5ed9a5c1c7fb2231010a1b4304393421", size = 1603766, upload-time = "2025-04-21T09:40:46.203Z" }, - { url = "https://files.pythonhosted.org/packages/84/38/31f85459c9402d409c1499284fc37a96f69afadce3cfac6a1b5ab048cbf1/aiohttp-3.11.18-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:b491e42183e8fcc9901d8dcd8ae644ff785590f1727f76ca86e731c61bfe6643", size = 1620647, upload-time = "2025-04-21T09:40:48.168Z" }, - { url = "https://files.pythonhosted.org/packages/31/2f/54aba0040764dd3d362fb37bd6aae9b3034fcae0b27f51b8a34864e48209/aiohttp-3.11.18-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:ad8c745ff9460a16b710e58e06a9dec11ebc0d8f4dd82091cefb579844d69868", size = 1559260, upload-time = "2025-04-21T09:40:50.219Z" }, - { url = "https://files.pythonhosted.org/packages/ca/d2/a05c7dd9e1b6948c1c5d04f1a8bcfd7e131923fa809bb87477d5c76f1517/aiohttp-3.11.18-cp310-cp310-win32.whl", hash = "sha256:8e57da93e24303a883146510a434f0faf2f1e7e659f3041abc4e3fb3f6702a9f", size = 418051, upload-time = "2025-04-21T09:40:52.272Z" }, - { url = "https://files.pythonhosted.org/packages/39/e2/796a6179e8abe267dfc84614a50291560a989d28acacbc5dab3bcd4cbec4/aiohttp-3.11.18-cp310-cp310-win_amd64.whl", hash = "sha256:cc93a4121d87d9f12739fc8fab0a95f78444e571ed63e40bfc78cd5abe700ac9", size = 442908, upload-time = "2025-04-21T09:40:54.345Z" }, - { url = "https://files.pythonhosted.org/packages/2f/10/fd9ee4f9e042818c3c2390054c08ccd34556a3cb209d83285616434cf93e/aiohttp-3.11.18-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:427fdc56ccb6901ff8088544bde47084845ea81591deb16f957897f0f0ba1be9", size = 712088, upload-time = "2025-04-21T09:40:55.776Z" }, - { url = "https://files.pythonhosted.org/packages/22/eb/6a77f055ca56f7aae2cd2a5607a3c9e7b9554f1497a069dcfcb52bfc9540/aiohttp-3.11.18-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:2c828b6d23b984255b85b9b04a5b963a74278b7356a7de84fda5e3b76866597b", size = 471450, upload-time = "2025-04-21T09:40:57.301Z" }, - { url = "https://files.pythonhosted.org/packages/78/dc/5f3c0d27c91abf0bb5d103e9c9b0ff059f60cf6031a5f06f456c90731f42/aiohttp-3.11.18-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:5c2eaa145bb36b33af1ff2860820ba0589e165be4ab63a49aebfd0981c173b66", size = 457836, upload-time = "2025-04-21T09:40:59.322Z" }, - { url = "https://files.pythonhosted.org/packages/49/7b/55b65af9ef48b9b811c91ff8b5b9de9650c71147f10523e278d297750bc8/aiohttp-3.11.18-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3d518ce32179f7e2096bf4e3e8438cf445f05fedd597f252de9f54c728574756", size = 1690978, upload-time = "2025-04-21T09:41:00.795Z" }, - { url = "https://files.pythonhosted.org/packages/a2/5a/3f8938c4f68ae400152b42742653477fc625d6bfe02e764f3521321c8442/aiohttp-3.11.18-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0700055a6e05c2f4711011a44364020d7a10fbbcd02fbf3e30e8f7e7fddc8717", size = 1745307, upload-time = "2025-04-21T09:41:02.89Z" }, - { url = "https://files.pythonhosted.org/packages/b4/42/89b694a293333ef6f771c62da022163bcf44fb03d4824372d88e3dc12530/aiohttp-3.11.18-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8bd1cde83e4684324e6ee19adfc25fd649d04078179890be7b29f76b501de8e4", size = 1780692, upload-time = "2025-04-21T09:41:04.461Z" }, - { url = "https://files.pythonhosted.org/packages/e2/ce/1a75384e01dd1bf546898b6062b1b5f7a59b6692ef802e4dd6db64fed264/aiohttp-3.11.18-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:73b8870fe1c9a201b8c0d12c94fe781b918664766728783241a79e0468427e4f", size = 1676934, upload-time = "2025-04-21T09:41:06.728Z" }, - { url = "https://files.pythonhosted.org/packages/a5/31/442483276e6c368ab5169797d9873b5875213cbcf7e74b95ad1c5003098a/aiohttp-3.11.18-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:25557982dd36b9e32c0a3357f30804e80790ec2c4d20ac6bcc598533e04c6361", size = 1621190, upload-time = "2025-04-21T09:41:08.293Z" }, - { url = "https://files.pythonhosted.org/packages/7b/83/90274bf12c079457966008a58831a99675265b6a34b505243e004b408934/aiohttp-3.11.18-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:7e889c9df381a2433802991288a61e5a19ceb4f61bd14f5c9fa165655dcb1fd1", size = 1658947, upload-time = "2025-04-21T09:41:11.054Z" }, - { url = "https://files.pythonhosted.org/packages/91/c1/da9cee47a0350b78fdc93670ebe7ad74103011d7778ab4c382ca4883098d/aiohttp-3.11.18-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:9ea345fda05bae217b6cce2acf3682ce3b13d0d16dd47d0de7080e5e21362421", size = 1654443, upload-time = "2025-04-21T09:41:13.213Z" }, - { url = "https://files.pythonhosted.org/packages/c9/f2/73cbe18dc25d624f79a09448adfc4972f82ed6088759ddcf783cd201956c/aiohttp-3.11.18-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:9f26545b9940c4b46f0a9388fd04ee3ad7064c4017b5a334dd450f616396590e", size = 1644169, upload-time = "2025-04-21T09:41:14.827Z" }, - { url = "https://files.pythonhosted.org/packages/5b/32/970b0a196c4dccb1b0cfa5b4dc3b20f63d76f1c608f41001a84b2fd23c3d/aiohttp-3.11.18-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:3a621d85e85dccabd700294494d7179ed1590b6d07a35709bb9bd608c7f5dd1d", size = 1728532, upload-time = "2025-04-21T09:41:17.168Z" }, - { url = "https://files.pythonhosted.org/packages/0b/50/b1dc810a41918d2ea9574e74125eb053063bc5e14aba2d98966f7d734da0/aiohttp-3.11.18-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:9c23fd8d08eb9c2af3faeedc8c56e134acdaf36e2117ee059d7defa655130e5f", size = 1750310, upload-time = "2025-04-21T09:41:19.353Z" }, - { url = "https://files.pythonhosted.org/packages/95/24/39271f5990b35ff32179cc95537e92499d3791ae82af7dcf562be785cd15/aiohttp-3.11.18-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:d9e6b0e519067caa4fd7fb72e3e8002d16a68e84e62e7291092a5433763dc0dd", size = 1691580, upload-time = "2025-04-21T09:41:21.868Z" }, - { url = "https://files.pythonhosted.org/packages/6b/78/75d0353feb77f041460564f12fe58e456436bbc00cbbf5d676dbf0038cc2/aiohttp-3.11.18-cp311-cp311-win32.whl", hash = "sha256:122f3e739f6607e5e4c6a2f8562a6f476192a682a52bda8b4c6d4254e1138f4d", size = 417565, upload-time = "2025-04-21T09:41:24.78Z" }, - { url = "https://files.pythonhosted.org/packages/ed/97/b912dcb654634a813f8518de359364dfc45976f822116e725dc80a688eee/aiohttp-3.11.18-cp311-cp311-win_amd64.whl", hash = "sha256:e6f3c0a3a1e73e88af384b2e8a0b9f4fb73245afd47589df2afcab6b638fa0e6", size = 443652, upload-time = "2025-04-21T09:41:26.48Z" }, - { url = "https://files.pythonhosted.org/packages/b5/d2/5bc436f42bf4745c55f33e1e6a2d69e77075d3e768e3d1a34f96ee5298aa/aiohttp-3.11.18-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:63d71eceb9cad35d47d71f78edac41fcd01ff10cacaa64e473d1aec13fa02df2", size = 706671, upload-time = "2025-04-21T09:41:28.021Z" }, - { url = "https://files.pythonhosted.org/packages/fe/d0/2dbabecc4e078c0474abb40536bbde717fb2e39962f41c5fc7a216b18ea7/aiohttp-3.11.18-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:d1929da615840969929e8878d7951b31afe0bac883d84418f92e5755d7b49508", size = 466169, upload-time = "2025-04-21T09:41:29.783Z" }, - { url = "https://files.pythonhosted.org/packages/70/84/19edcf0b22933932faa6e0be0d933a27bd173da02dc125b7354dff4d8da4/aiohttp-3.11.18-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:7d0aebeb2392f19b184e3fdd9e651b0e39cd0f195cdb93328bd124a1d455cd0e", size = 457554, upload-time = "2025-04-21T09:41:31.327Z" }, - { url = "https://files.pythonhosted.org/packages/32/d0/e8d1f034ae5624a0f21e4fb3feff79342ce631f3a4d26bd3e58b31ef033b/aiohttp-3.11.18-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3849ead845e8444f7331c284132ab314b4dac43bfae1e3cf350906d4fff4620f", size = 1690154, upload-time = "2025-04-21T09:41:33.541Z" }, - { url = "https://files.pythonhosted.org/packages/16/de/2f9dbe2ac6f38f8495562077131888e0d2897e3798a0ff3adda766b04a34/aiohttp-3.11.18-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5e8452ad6b2863709f8b3d615955aa0807bc093c34b8e25b3b52097fe421cb7f", size = 1733402, upload-time = "2025-04-21T09:41:35.634Z" }, - { url = "https://files.pythonhosted.org/packages/e0/04/bd2870e1e9aef990d14b6df2a695f17807baf5c85a4c187a492bda569571/aiohttp-3.11.18-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3b8d2b42073611c860a37f718b3d61ae8b4c2b124b2e776e2c10619d920350ec", size = 1783958, upload-time = "2025-04-21T09:41:37.456Z" }, - { url = "https://files.pythonhosted.org/packages/23/06/4203ffa2beb5bedb07f0da0f79b7d9039d1c33f522e0d1a2d5b6218e6f2e/aiohttp-3.11.18-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:40fbf91f6a0ac317c0a07eb328a1384941872f6761f2e6f7208b63c4cc0a7ff6", size = 1695288, upload-time = "2025-04-21T09:41:39.756Z" }, - { url = "https://files.pythonhosted.org/packages/30/b2/e2285dda065d9f29ab4b23d8bcc81eb881db512afb38a3f5247b191be36c/aiohttp-3.11.18-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:44ff5625413fec55216da5eaa011cf6b0a2ed67a565914a212a51aa3755b0009", size = 1618871, upload-time = "2025-04-21T09:41:41.972Z" }, - { url = "https://files.pythonhosted.org/packages/57/e0/88f2987885d4b646de2036f7296ebea9268fdbf27476da551c1a7c158bc0/aiohttp-3.11.18-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:7f33a92a2fde08e8c6b0c61815521324fc1612f397abf96eed86b8e31618fdb4", size = 1646262, upload-time = "2025-04-21T09:41:44.192Z" }, - { url = "https://files.pythonhosted.org/packages/e0/19/4d2da508b4c587e7472a032290b2981f7caeca82b4354e19ab3df2f51d56/aiohttp-3.11.18-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:11d5391946605f445ddafda5eab11caf310f90cdda1fd99865564e3164f5cff9", size = 1677431, upload-time = "2025-04-21T09:41:46.049Z" }, - { url = "https://files.pythonhosted.org/packages/eb/ae/047473ea50150a41440f3265f53db1738870b5a1e5406ece561ca61a3bf4/aiohttp-3.11.18-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:3cc314245deb311364884e44242e00c18b5896e4fe6d5f942e7ad7e4cb640adb", size = 1637430, upload-time = "2025-04-21T09:41:47.973Z" }, - { url = "https://files.pythonhosted.org/packages/11/32/c6d1e3748077ce7ee13745fae33e5cb1dac3e3b8f8787bf738a93c94a7d2/aiohttp-3.11.18-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:0f421843b0f70740772228b9e8093289924359d306530bcd3926f39acbe1adda", size = 1703342, upload-time = "2025-04-21T09:41:50.323Z" }, - { url = "https://files.pythonhosted.org/packages/c5/1d/a3b57bfdbe285f0d45572d6d8f534fd58761da3e9cbc3098372565005606/aiohttp-3.11.18-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:e220e7562467dc8d589e31c1acd13438d82c03d7f385c9cd41a3f6d1d15807c1", size = 1740600, upload-time = "2025-04-21T09:41:52.111Z" }, - { url = "https://files.pythonhosted.org/packages/a5/71/f9cd2fed33fa2b7ce4d412fb7876547abb821d5b5520787d159d0748321d/aiohttp-3.11.18-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ab2ef72f8605046115bc9aa8e9d14fd49086d405855f40b79ed9e5c1f9f4faea", size = 1695131, upload-time = "2025-04-21T09:41:53.94Z" }, - { url = "https://files.pythonhosted.org/packages/97/97/d1248cd6d02b9de6aa514793d0dcb20099f0ec47ae71a933290116c070c5/aiohttp-3.11.18-cp312-cp312-win32.whl", hash = "sha256:12a62691eb5aac58d65200c7ae94d73e8a65c331c3a86a2e9670927e94339ee8", size = 412442, upload-time = "2025-04-21T09:41:55.689Z" }, - { url = "https://files.pythonhosted.org/packages/33/9a/e34e65506e06427b111e19218a99abf627638a9703f4b8bcc3e3021277ed/aiohttp-3.11.18-cp312-cp312-win_amd64.whl", hash = "sha256:364329f319c499128fd5cd2d1c31c44f234c58f9b96cc57f743d16ec4f3238c8", size = 439444, upload-time = "2025-04-21T09:41:57.977Z" }, - { url = "https://files.pythonhosted.org/packages/0a/18/be8b5dd6b9cf1b2172301dbed28e8e5e878ee687c21947a6c81d6ceaa15d/aiohttp-3.11.18-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:474215ec618974054cf5dc465497ae9708543cbfc312c65212325d4212525811", size = 699833, upload-time = "2025-04-21T09:42:00.298Z" }, - { url = "https://files.pythonhosted.org/packages/0d/84/ecdc68e293110e6f6f6d7b57786a77555a85f70edd2b180fb1fafaff361a/aiohttp-3.11.18-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:6ced70adf03920d4e67c373fd692123e34d3ac81dfa1c27e45904a628567d804", size = 462774, upload-time = "2025-04-21T09:42:02.015Z" }, - { url = "https://files.pythonhosted.org/packages/d7/85/f07718cca55884dad83cc2433746384d267ee970e91f0dcc75c6d5544079/aiohttp-3.11.18-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:2d9f6c0152f8d71361905aaf9ed979259537981f47ad099c8b3d81e0319814bd", size = 454429, upload-time = "2025-04-21T09:42:03.728Z" }, - { url = "https://files.pythonhosted.org/packages/82/02/7f669c3d4d39810db8842c4e572ce4fe3b3a9b82945fdd64affea4c6947e/aiohttp-3.11.18-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a35197013ed929c0aed5c9096de1fc5a9d336914d73ab3f9df14741668c0616c", size = 1670283, upload-time = "2025-04-21T09:42:06.053Z" }, - { url = "https://files.pythonhosted.org/packages/ec/79/b82a12f67009b377b6c07a26bdd1b81dab7409fc2902d669dbfa79e5ac02/aiohttp-3.11.18-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:540b8a1f3a424f1af63e0af2d2853a759242a1769f9f1ab053996a392bd70118", size = 1717231, upload-time = "2025-04-21T09:42:07.953Z" }, - { url = "https://files.pythonhosted.org/packages/a6/38/d5a1f28c3904a840642b9a12c286ff41fc66dfa28b87e204b1f242dbd5e6/aiohttp-3.11.18-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f9e6710ebebfce2ba21cee6d91e7452d1125100f41b906fb5af3da8c78b764c1", size = 1769621, upload-time = "2025-04-21T09:42:09.855Z" }, - { url = "https://files.pythonhosted.org/packages/53/2d/deb3749ba293e716b5714dda06e257f123c5b8679072346b1eb28b766a0b/aiohttp-3.11.18-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f8af2ef3b4b652ff109f98087242e2ab974b2b2b496304063585e3d78de0b000", size = 1678667, upload-time = "2025-04-21T09:42:11.741Z" }, - { url = "https://files.pythonhosted.org/packages/b8/a8/04b6e11683a54e104b984bd19a9790eb1ae5f50968b601bb202d0406f0ff/aiohttp-3.11.18-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:28c3f975e5ae3dbcbe95b7e3dcd30e51da561a0a0f2cfbcdea30fc1308d72137", size = 1601592, upload-time = "2025-04-21T09:42:14.137Z" }, - { url = "https://files.pythonhosted.org/packages/5e/9d/c33305ae8370b789423623f0e073d09ac775cd9c831ac0f11338b81c16e0/aiohttp-3.11.18-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:c28875e316c7b4c3e745172d882d8a5c835b11018e33432d281211af35794a93", size = 1621679, upload-time = "2025-04-21T09:42:16.056Z" }, - { url = "https://files.pythonhosted.org/packages/56/45/8e9a27fff0538173d47ba60362823358f7a5f1653c6c30c613469f94150e/aiohttp-3.11.18-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:13cd38515568ae230e1ef6919e2e33da5d0f46862943fcda74e7e915096815f3", size = 1656878, upload-time = "2025-04-21T09:42:18.368Z" }, - { url = "https://files.pythonhosted.org/packages/84/5b/8c5378f10d7a5a46b10cb9161a3aac3eeae6dba54ec0f627fc4ddc4f2e72/aiohttp-3.11.18-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:0e2a92101efb9f4c2942252c69c63ddb26d20f46f540c239ccfa5af865197bb8", size = 1620509, upload-time = "2025-04-21T09:42:20.141Z" }, - { url = "https://files.pythonhosted.org/packages/9e/2f/99dee7bd91c62c5ff0aa3c55f4ae7e1bc99c6affef780d7777c60c5b3735/aiohttp-3.11.18-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:e6d3e32b8753c8d45ac550b11a1090dd66d110d4ef805ffe60fa61495360b3b2", size = 1680263, upload-time = "2025-04-21T09:42:21.993Z" }, - { url = "https://files.pythonhosted.org/packages/03/0a/378745e4ff88acb83e2d5c884a4fe993a6e9f04600a4560ce0e9b19936e3/aiohttp-3.11.18-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:ea4cf2488156e0f281f93cc2fd365025efcba3e2d217cbe3df2840f8c73db261", size = 1715014, upload-time = "2025-04-21T09:42:23.87Z" }, - { url = "https://files.pythonhosted.org/packages/f6/0b/b5524b3bb4b01e91bc4323aad0c2fcaebdf2f1b4d2eb22743948ba364958/aiohttp-3.11.18-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:9d4df95ad522c53f2b9ebc07f12ccd2cb15550941e11a5bbc5ddca2ca56316d7", size = 1666614, upload-time = "2025-04-21T09:42:25.764Z" }, - { url = "https://files.pythonhosted.org/packages/c7/b7/3d7b036d5a4ed5a4c704e0754afe2eef24a824dfab08e6efbffb0f6dd36a/aiohttp-3.11.18-cp313-cp313-win32.whl", hash = "sha256:cdd1bbaf1e61f0d94aced116d6e95fe25942f7a5f42382195fd9501089db5d78", size = 411358, upload-time = "2025-04-21T09:42:27.558Z" }, - { url = "https://files.pythonhosted.org/packages/1e/3c/143831b32cd23b5263a995b2a1794e10aa42f8a895aae5074c20fda36c07/aiohttp-3.11.18-cp313-cp313-win_amd64.whl", hash = "sha256:bdd619c27e44382cf642223f11cfd4d795161362a5a1fc1fa3940397bc89db01", size = 437658, upload-time = "2025-04-21T09:42:29.209Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/6a/61/d37b33a074ad867d1ecec9f03183e2b9fee067745cae17e73c264f556d57/aiohttp-3.12.0.tar.gz", hash = "sha256:e3f0a2b4d7fb16c0d584d9b8860f1e46d39f7d93372b25a6f80c10015a7acdab", size = 7762804, upload-time = "2025-05-24T22:33:33.318Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c5/6d/687b42743088d86de83653153d4ef2ddf77372ce46b9d404c8340b9fec00/aiohttp-3.12.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:91fca62b1a454a72c48345ad3af0327c87a7352598049fd9fd02b5c96deca456", size = 690021, upload-time = "2025-05-24T22:30:13.027Z" }, + { url = "https://files.pythonhosted.org/packages/66/6d/19bac9bdbaf0893005d61a25898147c781fa78c337d09d989a5216e6422e/aiohttp-3.12.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:4cd2ffa8cefce24305e573780d3d4a1bc8904bb76bc208509108bac04bc85c71", size = 466392, upload-time = "2025-05-24T22:30:15.44Z" }, + { url = "https://files.pythonhosted.org/packages/1c/0b/3c6327efc64d509b5de1fc9157aa4da555d22154ba21893dee9a169c70dd/aiohttp-3.12.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:b011907c9f024d9b2017a2c12ca8abea571b919ebd85d42f16bd91a716dc7de2", size = 454164, upload-time = "2025-05-24T22:30:17.852Z" }, + { url = "https://files.pythonhosted.org/packages/97/eb/d536fb2e07d497d6d1c489ed39918d14a444c4fd00557b1d86cf6816dc07/aiohttp-3.12.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d9c8db3b45fb114739bc3daae85ceb03b2bcb11f11f2d1eae25b00b989cd306a", size = 1636208, upload-time = "2025-05-24T22:30:19.838Z" }, + { url = "https://files.pythonhosted.org/packages/6d/d7/26760f0596731227cfa3db4f8dc76bda7283de9b6401a5584fcde30e0661/aiohttp-3.12.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:976607ee1790d2e6d1666f89f64afd9397af2647b5a99a84dc664a3ac715754f", size = 1610265, upload-time = "2025-05-24T22:30:21.704Z" }, + { url = "https://files.pythonhosted.org/packages/1a/bd/25a3189e2bacfffbf1099646856ffc1fe4479a2c98c90f3d7bc2c7161130/aiohttp-3.12.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e76898841d4e655ac5e7e2f1e146d9e56ee1ffd2ce2dd31b41ab23bcfb29b209", size = 1682672, upload-time = "2025-05-24T22:30:24.015Z" }, + { url = "https://files.pythonhosted.org/packages/69/00/7ef9722e9d4442ce155c6e6a08f6824f041384b04d92baa60096acb9b1df/aiohttp-3.12.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3ad61b28652898b25e7c8d42970b9f27f7eff068623704aad4424e2ee9409a80", size = 1724983, upload-time = "2025-05-24T22:30:25.997Z" }, + { url = "https://files.pythonhosted.org/packages/6b/c3/c6fa242e13281b06acf0a00b6b8a77f44fc28ba78924405508c7f9086ffc/aiohttp-3.12.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba8d85d36edc6698ef94cf8f7fcf5992cc2d9b639de67a1112799d5020c91a63", size = 1629649, upload-time = "2025-05-24T22:30:28.588Z" }, + { url = "https://files.pythonhosted.org/packages/9a/97/bed6b780aa8c7aa14d6676521634e81895e87fb2da1bbf2ae54772478d16/aiohttp-3.12.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5123488226a61df4a515dc3d5c3c0b578660ec3c22d2579599ce2e45335655db", size = 1569772, upload-time = "2025-05-24T22:30:31.084Z" }, + { url = "https://files.pythonhosted.org/packages/c8/df/b34c6b94aee4395268bf7d76ee18f9e45fd652a8bad2cfc5f9f0dc757b26/aiohttp-3.12.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:a03fb47a954df7fb0d587053e2feafdd5306828fc8a764b456775fc00d2d82a9", size = 1613621, upload-time = "2025-05-24T22:30:33.286Z" }, + { url = "https://files.pythonhosted.org/packages/97/df/3ce40545a00b2614a33ee1a99d12d4b06cfa090cfa1d06a7e0818309124f/aiohttp-3.12.0-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:bf9acc3914c921ea8fb0bcda3d07ece85d09eff035bd7c11cea826aa5dd827a5", size = 1624408, upload-time = "2025-05-24T22:30:35.703Z" }, + { url = "https://files.pythonhosted.org/packages/4c/9f/25bc921e20901787977e634ce0718637a3cc81e91c5776420c7673328f7c/aiohttp-3.12.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:c7cfb0b19e775143982e34a472f9da66067c22b66ce7a56e88f851752a467f15", size = 1599861, upload-time = "2025-05-24T22:30:38.179Z" }, + { url = "https://files.pythonhosted.org/packages/10/97/a656de02fb70db5819f2ab2bc9b7831b774220ed4c4098b5cdb87fcb78d9/aiohttp-3.12.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:2eba07f1de9a02920f34761c8b8e375f91fd98304a80ff0287f8e9e2804decf7", size = 1679447, upload-time = "2025-05-24T22:30:40.215Z" }, + { url = "https://files.pythonhosted.org/packages/ec/79/d77fe1eac6be73c8826cb3ddde134a5b2309b157e6e48875c3665b31242b/aiohttp-3.12.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:d46d99d028ad4a566f980bc8790099288824212c0f21a275d546be403cbcb7bc", size = 1702687, upload-time = "2025-05-24T22:30:42.584Z" }, + { url = "https://files.pythonhosted.org/packages/ac/18/29b1ec691bb172244b7619e72ac30814b6b5f6a07ec4b933ee9896bf9659/aiohttp-3.12.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:0bd190e4c418c1072563dd998ae118dfb588101f60c1af396e5cd42023f29259", size = 1631026, upload-time = "2025-05-24T22:30:44.982Z" }, + { url = "https://files.pythonhosted.org/packages/13/bc/299a2dbb9f92b6bd4c025ba39704c947e3b406ea65626aa817f9ff8bd087/aiohttp-3.12.0-cp310-cp310-win32.whl", hash = "sha256:709d823cc86d0c3ab4e9b449fefba47a1a8586fe65a00d5fbce393458be9da1c", size = 415301, upload-time = "2025-05-24T22:30:47.663Z" }, + { url = "https://files.pythonhosted.org/packages/0f/42/88b1162432dbb3e7a8776828d6a096d520f4046f836a2bbfdaa28cfffb1b/aiohttp-3.12.0-cp310-cp310-win_amd64.whl", hash = "sha256:a44b25ade659f8736b0f2c32cfd2b59449defad41c5f1e514b94a338c777226f", size = 438506, upload-time = "2025-05-24T22:30:49.554Z" }, + { url = "https://files.pythonhosted.org/packages/d9/8c/f2d1c0cb4b859185bb38369180785342ef0ba56328c8cb2a0b7c9ddf8651/aiohttp-3.12.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:38ab87bc3c2f2c3861438e537cbd6732d72b73f2b82ea9ba4b214b6aca170ad9", size = 697333, upload-time = "2025-05-24T22:30:51.888Z" }, + { url = "https://files.pythonhosted.org/packages/6e/d7/65d1de0140b952cc88683cf4f52fe0c29d5c617ee1c5a4b9b40ad43d67c8/aiohttp-3.12.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:8862c9b190854c0ff3f5a3f25abee9ed7641aee6eccdc81aed2c3d427623d3dc", size = 469618, upload-time = "2025-05-24T22:30:54.168Z" }, + { url = "https://files.pythonhosted.org/packages/35/49/4aaefdfa5aa74bc6276660175664eb6e1e654ae3befe5342abfcbf596ec7/aiohttp-3.12.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:8cd1eb1d5498cc541ce40946e148371e23efefcf48afdaa68f49328d2849f393", size = 457881, upload-time = "2025-05-24T22:30:56.616Z" }, + { url = "https://files.pythonhosted.org/packages/c2/c5/8eea63458cbf37e8b917cff62a0d5606c5df58b502cd00b03aaf57db6383/aiohttp-3.12.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:07b7e64a7c325e2d87523e1f8210bdba0e2e159703ad00f75bff336134d8490a", size = 1728063, upload-time = "2025-05-24T22:30:58.707Z" }, + { url = "https://files.pythonhosted.org/packages/9c/32/70b637ee15e3e72b6b028748a2a46bb555ae91311bf9c266db2e248922b2/aiohttp-3.12.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:1accf0a2270e1e05b453d1dd0f51f176148eec81306c39da39b7af5b29e1d56b", size = 1676733, upload-time = "2025-05-24T22:31:01.632Z" }, + { url = "https://files.pythonhosted.org/packages/ba/b0/146f27c6d1565d692c3c9d7ba20af6b794ad43984260ec733f024c26da5a/aiohttp-3.12.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8c3aaae0180d804b4fe95cee7fe03c2ff362828c5ebb7a8370132957104b6311", size = 1775525, upload-time = "2025-05-24T22:31:03.68Z" }, + { url = "https://files.pythonhosted.org/packages/10/1b/29707acfc556b9acb2471702623e3c2962569ae5df58e977b356825b65cd/aiohttp-3.12.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c0ab714799a6fd698715d9fc1d1a546a99288288939506fede60d133dc53328b", size = 1814571, upload-time = "2025-05-24T22:31:05.675Z" }, + { url = "https://files.pythonhosted.org/packages/da/96/ced0a23a2898aa97facc8aa7dc92e207541811de1c34f30cb4338f57dda1/aiohttp-3.12.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:02b33c67d7db1a4b2df28e5c1e4d8c025db8e4432b3d054db3ea695063cbfc52", size = 1717031, upload-time = "2025-05-24T22:31:07.761Z" }, + { url = "https://files.pythonhosted.org/packages/5f/8f/25760fca550eaaa8c3759f854eda95e3c3e373d942434939da823211c39e/aiohttp-3.12.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3718948668ae986d53bd2c443ffc82e6559de2bec1d66a215c1c5e059d80ff37", size = 1654106, upload-time = "2025-05-24T22:31:09.717Z" }, + { url = "https://files.pythonhosted.org/packages/ef/26/d81ed27b520c25b5b84102bd6ddbf16154d7b07d12097b3fdad7c5e5df3b/aiohttp-3.12.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:fc9f188d2b864f65b17cee23d7a1923285df0c7b978058b0e2006426700d4c93", size = 1702381, upload-time = "2025-05-24T22:31:11.812Z" }, + { url = "https://files.pythonhosted.org/packages/3d/51/c0e7dc789cdc7105803099c89e57d8dcfe4671600e3ec0f05ce1fb6954be/aiohttp-3.12.0-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:0851359eeb146690c19d368a1c86acf33dc17535ac8123e25a0eff5f5fa110e1", size = 1697542, upload-time = "2025-05-24T22:31:13.822Z" }, + { url = "https://files.pythonhosted.org/packages/8a/f4/83d9fff93bbb4b26aeb319bd007c63e87e37655bc63fdfb7b561c663b631/aiohttp-3.12.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:3fcc1ccd74c932ce6b6fad61e054baa23e6624db8f5a9ec462af023abe5c600d", size = 1677726, upload-time = "2025-05-24T22:31:15.865Z" }, + { url = "https://files.pythonhosted.org/packages/f7/54/7878850b0d764f82ac9629ca8dc4b44c21e2f771dd1aff51d9c336dd6a64/aiohttp-3.12.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:062eaf38763c6b22fcbd47a97ba06952ad7751ed7b054a690cddeed4f50547fe", size = 1771326, upload-time = "2025-05-24T22:31:17.989Z" }, + { url = "https://files.pythonhosted.org/packages/64/3c/f07536f9f5c9572d91260463e4d132ad225b07a34552a0d0b3f01b3988df/aiohttp-3.12.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:b19f964b9130d572f0fed752417446ff6622fd1288e8c7860824a0dd57cd8dd5", size = 1791787, upload-time = "2025-05-24T22:31:20.706Z" }, + { url = "https://files.pythonhosted.org/packages/7e/41/ac33993993b2b0b1e9082b99a72c2a18ab595d53f258aa33d8cdf6ee98cf/aiohttp-3.12.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:b210c1cdc7f1a45714d17510b7e049ca7b15766b66f8c278a2c73a6021bbc389", size = 1704843, upload-time = "2025-05-24T22:31:22.947Z" }, + { url = "https://files.pythonhosted.org/packages/6b/3c/b8396363eae9e77a2c605d826e549f2f5d1d79f77b12f17c655e7e3b6a2f/aiohttp-3.12.0-cp311-cp311-win32.whl", hash = "sha256:6859c7ecd01cbcc839476c7d9504a19bf334bbe45715df611d351103945a9d23", size = 414813, upload-time = "2025-05-24T22:31:25.03Z" }, + { url = "https://files.pythonhosted.org/packages/72/9f/d7bd0442c1af0efd9af493399db1eccafce8c5e47f1600b565e069eaaf99/aiohttp-3.12.0-cp311-cp311-win_amd64.whl", hash = "sha256:0159620f09dd338bab29e7136efd51c971462a5bb69dcdace39a2c581e87c4af", size = 439203, upload-time = "2025-05-24T22:31:27.047Z" }, + { url = "https://files.pythonhosted.org/packages/a4/83/5cf89e601d565ca18fa8792f5b7393f6f3d80fa26447ee4649232f83a6aa/aiohttp-3.12.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:71fe01ddea2673973f1958c3776da990106e33a02a4a5c708d4bb34717cae712", size = 688428, upload-time = "2025-05-24T22:31:29.505Z" }, + { url = "https://files.pythonhosted.org/packages/fc/f4/034d086f5dacd94063a6926d17c63094ba32dd4938954beb704a6f90d2a6/aiohttp-3.12.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:9ce499a7ea20925572d52f86cd42e16690f4db2ff56933710bf759cf1ec68212", size = 463055, upload-time = "2025-05-24T22:31:31.314Z" }, + { url = "https://files.pythonhosted.org/packages/9d/e4/47fccf8b5e6a174228a3e1df7f5c723c3f120e2da6f06cac8df05cac2aa2/aiohttp-3.12.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:75a7d00e20221b1bb8a04e14dba850596cdafeac10fb112ce7b6ef0ad1f9bd42", size = 455888, upload-time = "2025-05-24T22:31:33.238Z" }, + { url = "https://files.pythonhosted.org/packages/43/34/8b94b13b80f1a83fef87a4e324067f72e73a9713dae497de9eff0e5754ce/aiohttp-3.12.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9f9cb8f69371d50ba61f061065d440edcbebf00cb4ef2141465a9e753a00ecb9", size = 1702681, upload-time = "2025-05-24T22:31:35.724Z" }, + { url = "https://files.pythonhosted.org/packages/f5/aa/1e8b90fbe2bfb1684f4461dc70f05d4235bc7e962d39e0febe6bbeec68f3/aiohttp-3.12.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:037a53da5016e8fa33840ecddb2bdc20091d731e0fe866f4f9d9364a94504856", size = 1685327, upload-time = "2025-05-24T22:31:37.849Z" }, + { url = "https://files.pythonhosted.org/packages/4e/74/f9b801c9b250b9501d3ce28ce3e499cedf77035dfc4d74c7e5488a9980d7/aiohttp-3.12.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:851543bb8dd5db048c0b6a7454cae3fd0f618a592cbb70844ec0d548767b5763", size = 1740423, upload-time = "2025-05-24T22:31:40.189Z" }, + { url = "https://files.pythonhosted.org/packages/b4/24/e848b8493c5597cfd7814e3952e182cb91b3193adcea5967513844e99051/aiohttp-3.12.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2688fb204b07c2bffcb12795b6384ec051d927147e0ec542ba3518dd60a86f2f", size = 1786578, upload-time = "2025-05-24T22:31:43.006Z" }, + { url = "https://files.pythonhosted.org/packages/29/4e/63044dfa4176be5c795db24fdae7233acc1895794c544de9689438923acd/aiohttp-3.12.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9cbc8604c21a163ee492542b344a4f02797d48d38d335af47490d77c0e15d2ed", size = 1706017, upload-time = "2025-05-24T22:31:45.605Z" }, + { url = "https://files.pythonhosted.org/packages/aa/0e/2d7f4a0e6f22578b536fd1a22f3b1cf19b8f0f05a6feffcb6fd26ac97ddd/aiohttp-3.12.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:754d5fd1a47656592d3b11488652fba567d00c6492e9304ba59255dfee8b856f", size = 1621819, upload-time = "2025-05-24T22:31:47.752Z" }, + { url = "https://files.pythonhosted.org/packages/70/7e/8d2f3ed654b7a4d7c5c57eec88e2e01a610e16f4a851f033e37115a5c860/aiohttp-3.12.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:2a613da41e577256d13929bbb4a95cadb570aebeab3914a24fc0056ae843d3c7", size = 1682881, upload-time = "2025-05-24T22:31:49.947Z" }, + { url = "https://files.pythonhosted.org/packages/e1/a6/bffbecc2e53b63081a958b98291ef11e005c03bc8e353934c7e5ba2e3002/aiohttp-3.12.0-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:9c8f9e1de28529751345f1e55cb405f22ff09fb251a1bce7fc7e915d0ee49d1f", size = 1704334, upload-time = "2025-05-24T22:31:52.136Z" }, + { url = "https://files.pythonhosted.org/packages/36/78/4c420fbda62f50585b9537fca612b4c09af5c0f85419e87082f31440b8d5/aiohttp-3.12.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:32c1977f5354fef6b43b98ac830c87bddaafcfb6516c520e3241fef8f3e299e7", size = 1644986, upload-time = "2025-05-24T22:31:54.787Z" }, + { url = "https://files.pythonhosted.org/packages/b3/88/616f05549e083f7985fa5ca39f7b7ec2bb6921330f31891e164346ce415d/aiohttp-3.12.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:4ac3e360ab9c1b7893ae5c254a222986162bafa9f981fa85f09bad7b1527fed4", size = 1724548, upload-time = "2025-05-24T22:31:57.369Z" }, + { url = "https://files.pythonhosted.org/packages/44/a7/bbfc67803bbd7cc3b8b36e98dfabbf0cf3eedd66583a735a1d1ecba182b4/aiohttp-3.12.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:b3e62337e0a24925fefe638f8dd91be4324ac7f2bbbe9d8d0ae992bd35b2dc45", size = 1752523, upload-time = "2025-05-24T22:31:59.552Z" }, + { url = "https://files.pythonhosted.org/packages/86/69/b85b4a531669d20b5effcb7ff00dd515cd0530a51db5749de14b1fbc8a34/aiohttp-3.12.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:7285a756ba23e99f1a24cf41e8440f06a1d2cba595ee2cc1acb854e4262e2075", size = 1712132, upload-time = "2025-05-24T22:32:01.799Z" }, + { url = "https://files.pythonhosted.org/packages/0e/07/ae3b5ab96caadfa7f2d1e1718ececf9c0dcd05cd2338eb02a9a8de4c772a/aiohttp-3.12.0-cp312-cp312-win32.whl", hash = "sha256:b53cd833233a09d5a22481a7e936bfdce46845e3b09f1b936d383d5c14d39ba6", size = 409548, upload-time = "2025-05-24T22:32:03.957Z" }, + { url = "https://files.pythonhosted.org/packages/71/bc/e8ce9d8c298f6e5d8517a684eb616089c01c4c8185fec5376b19ac7b72c8/aiohttp-3.12.0-cp312-cp312-win_amd64.whl", hash = "sha256:68e4a94c3bf80e93340d4c9108f57b46b019ca88eddec18bf5c8e1ded463cbef", size = 435645, upload-time = "2025-05-24T22:32:05.88Z" }, + { url = "https://files.pythonhosted.org/packages/fd/7e/9d27424fadc63f89d9165e7865ecdcf49bd4ce03ed5f453e8fb1300c3ede/aiohttp-3.12.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:6ab223f5d0bd30f1b419addc4aef37f8d7723027e3d92393281cba97f8529209", size = 682843, upload-time = "2025-05-24T22:32:08.441Z" }, + { url = "https://files.pythonhosted.org/packages/9d/7e/d8f3b2efbd359138f81121d849c334b6df4bb91805a4e7380f175ea822cf/aiohttp-3.12.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:c5beab804eeff85cfae5c053e0d3bb7a7cdc2756ced50a586c56deb8b8ce16b9", size = 460508, upload-time = "2025-05-24T22:32:10.476Z" }, + { url = "https://files.pythonhosted.org/packages/90/a2/019f0e33b5d3f201f400075841a31db7014a175d6e805fb13c26d8ff85e2/aiohttp-3.12.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:bb157df65c18f4c84dd2a3b989975076d228866e6c4872220139c385bb0fea3b", size = 452808, upload-time = "2025-05-24T22:32:12.519Z" }, + { url = "https://files.pythonhosted.org/packages/01/29/54e623c3854326e54744996917919a033ce00313888aa5e5fe2348c8968c/aiohttp-3.12.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c9dff812b540fd31e08678fb1caed2498c294e0f75262829259588992ca59372", size = 1691620, upload-time = "2025-05-24T22:32:14.635Z" }, + { url = "https://files.pythonhosted.org/packages/f7/db/eef9360855d3d2218bc38c0a94781324fbb7361b168bc6ccba29d703bb7c/aiohttp-3.12.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:f4f06d93c08670b8deb6e965578c804eecd85450319f403ed5695e7105ca4f38", size = 1672885, upload-time = "2025-05-24T22:32:16.884Z" }, + { url = "https://files.pythonhosted.org/packages/a1/c7/ff6153b07cd03358eb0faa7fb5ecc319ec2cdccd9789bf25d2a6c580b653/aiohttp-3.12.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bc77ef0cd57e669f4835ccced3e374c14a9890ef5b99427c5712d965b1a3dca3", size = 1724952, upload-time = "2025-05-24T22:32:19.119Z" }, + { url = "https://files.pythonhosted.org/packages/b0/38/b6e7ac5234f0eda7763737460793cb478f0270f73adcf2037f0913c9bf9c/aiohttp-3.12.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:16acea48107e36eb672530b155be727d701658c8e0132f5c38919431063df1aa", size = 1774327, upload-time = "2025-05-24T22:32:21.884Z" }, + { url = "https://files.pythonhosted.org/packages/29/ec/a51e3fffd7538e7cc6376b2693c5f15365a542d42045c9345f8571962c3a/aiohttp-3.12.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8314272c09dfb3424a3015222b950ca4a0845165fa43528f079a67dd0d98bd56", size = 1696655, upload-time = "2025-05-24T22:32:24.46Z" }, + { url = "https://files.pythonhosted.org/packages/cd/f8/701e3869d04c6d1b908fcbcb6f41013a3400750c289a494500ed68fe5f5d/aiohttp-3.12.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c9b51e1f1fe9ef73e3dc23908586d7ea3aa928da1b44a38f0cb0c3f60cfcfa76", size = 1610360, upload-time = "2025-05-24T22:32:27.204Z" }, + { url = "https://files.pythonhosted.org/packages/5e/bc/1e36156c126ff0f1cd9af55a2e3bdd71842e4c76006fd6f16adec92f7c50/aiohttp-3.12.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:471858b4cb972205fbc46b9485d8d532092df0189dd681869616bbbc7192ead3", size = 1663384, upload-time = "2025-05-24T22:32:29.383Z" }, + { url = "https://files.pythonhosted.org/packages/71/b2/e79603df4a9916ecca3ef6605d66bc8dc9d1cf94be12b5b948e19eba4a7b/aiohttp-3.12.0-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:47d30f5fc30bd9dfe8875374aa05f566719d82e9026839dd5c59f281fb94d302", size = 1695049, upload-time = "2025-05-24T22:32:31.655Z" }, + { url = "https://files.pythonhosted.org/packages/31/26/6c91957dc52eb47845b5f03901e1162b412c77ac3c0e082b10cf6be7b3ba/aiohttp-3.12.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:1c4ae2aced91b2e879f16d4f0225c7733e007367403a195c2f72d9c01dac4b68", size = 1637644, upload-time = "2025-05-24T22:32:34.419Z" }, + { url = "https://files.pythonhosted.org/packages/da/9e/ee4b95390cf73ff3875d74e7661378115f763ff445e2d7a0c02f1916db3e/aiohttp-3.12.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:c2d61673e3eec7f703419ae430417ac84305095220af11524f9496f7c0b81dc6", size = 1713775, upload-time = "2025-05-24T22:32:36.718Z" }, + { url = "https://files.pythonhosted.org/packages/dd/83/69b8a5a32e48210ce3830ee11044245e283c89adb8e797414145ab1d1a4a/aiohttp-3.12.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:a08d1c18b588ddfd049f4ac082b9935ee68a3796dc7ad70c8317605a8bd7e298", size = 1747247, upload-time = "2025-05-24T22:32:39.115Z" }, + { url = "https://files.pythonhosted.org/packages/54/df/4c23861c97384a18a03233629ba423b2cdee450a0fb76354095fdd30cfe5/aiohttp-3.12.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:33bb4ab2c7b86bf0ef19d426afcc3e60f08415b8e46b9cdb67b632c1d48931a3", size = 1696137, upload-time = "2025-05-24T22:32:41.392Z" }, + { url = "https://files.pythonhosted.org/packages/92/27/e19dfbcfdbe5f000b2959c4cb1a93c32e8632a36b29b7a01d59251e14b5b/aiohttp-3.12.0-cp313-cp313-win32.whl", hash = "sha256:199bfe20aebba88c94113def5c5f7eb8abeca55caf4dab8060fa25f573f062e5", size = 408567, upload-time = "2025-05-24T22:32:44.132Z" }, + { url = "https://files.pythonhosted.org/packages/30/88/70f19c1c1714d2b4920a4e675fd5b92ff5162b55d20d04b5ba188f0d623b/aiohttp-3.12.0-cp313-cp313-win_amd64.whl", hash = "sha256:9c24ce9ccfe2c24e391bdd72f3d5ff9c42ed1f8b15f813cb4b4c22e0d5930433", size = 434504, upload-time = "2025-05-24T22:32:46.274Z" }, ] [[package]] @@ -189,7 +192,7 @@ wheels = [ [[package]] name = "anthropic" -version = "0.51.0" +version = "0.52.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "anyio", marker = "sys_platform == 'darwin' or sys_platform == 'linux' or sys_platform == 'win32'" }, @@ -200,9 +203,9 @@ dependencies = [ { name = "sniffio", marker = "sys_platform == 'darwin' or sys_platform == 'linux' or sys_platform == 'win32'" }, { name = "typing-extensions", marker = "sys_platform == 'darwin' or sys_platform == 'linux' or sys_platform == 'win32'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/63/4a/96f99a61ae299f9e5aa3e765d7342d95ab2e2ba5b69a3ffedb00ef779651/anthropic-0.51.0.tar.gz", hash = "sha256:6f824451277992af079554430d5b2c8ff5bc059cc2c968cdc3f06824437da201", size = 219063, upload-time = "2025-05-07T15:39:22.348Z" } +sdist = { url = "https://files.pythonhosted.org/packages/57/fd/8a9332f5baf352c272494a9d359863a53385a208954c1a7251a524071930/anthropic-0.52.0.tar.gz", hash = "sha256:f06bc924d7eb85f8a43fe587b875ff58b410d60251b7dc5f1387b322a35bd67b", size = 229372, upload-time = "2025-05-22T16:42:22.044Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/8c/6e/9637122c5f007103bd5a259f4250bd8f1533dd2473227670fd10a1457b62/anthropic-0.51.0-py3-none-any.whl", hash = "sha256:b8b47d482c9aa1f81b923555cebb687c2730309a20d01be554730c8302e0f62a", size = 263957, upload-time = "2025-05-07T15:39:20.82Z" }, + { url = "https://files.pythonhosted.org/packages/a0/43/172c0031654908bbac2a87d356fff4de1b4947a9b14b9658540b69416417/anthropic-0.52.0-py3-none-any.whl", hash = "sha256:c026daa164f0e3bde36ce9cbdd27f5f1419fff03306be1e138726f42e6a7810f", size = 286076, upload-time = "2025-05-22T16:42:20Z" }, ] [[package]] @@ -303,45 +306,46 @@ wheels = [ [[package]] name = "av" -version = "14.3.0" -source = { registry = "https://pypi.org/simple" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/88/c9/7b28af53ceb7ed80671657c3219de4da71ae5306843ecc0749b0f5bfb8dc/av-14.3.0-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:fb2fbd93685086c859748c147861dfb97ccf896dfbaa0141b8f15a1493d758e8", size = 20029577, upload-time = "2025-04-06T10:20:10.525Z" }, - { url = "https://files.pythonhosted.org/packages/b5/4a/e5bf3212db0ab6c2ca21dc87727a305614af4830fad58cae05e011aed273/av-14.3.0-cp310-cp310-macosx_12_0_x86_64.whl", hash = "sha256:187fa564b130ac15b6ea7124c289be7fa8687d8e121d69b3000225cbff6414b0", size = 23819523, upload-time = "2025-04-06T10:20:13.632Z" }, - { url = "https://files.pythonhosted.org/packages/f7/76/c1cf614263702606623685ac9b6d6ca50a2ae93f7d8aac9c8b52b7117260/av-14.3.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9c789487510e9630ce46610ecdb3b2271ec720b839282884c04950f3b8be65f2", size = 33053959, upload-time = "2025-04-06T10:20:16.377Z" }, - { url = "https://files.pythonhosted.org/packages/e5/4c/149eea76fe2eb7e637324f35588e28941212eff5bdc21a0aae7f50379525/av-14.3.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ca1711ef45fd711736125cb7e63e71dd9016127baae84c73cf0f08fb63d09a0b", size = 31699556, upload-time = "2025-04-06T10:20:19.27Z" }, - { url = "https://files.pythonhosted.org/packages/4c/86/292aa2aee50902d55ea8cb94e6d6112d20884b340a6d75f8521f671c8556/av-14.3.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c69df85a9eb5d70709578954839dfe09fa952b177666fe963c96a052031eaee", size = 34670935, upload-time = "2025-04-06T10:20:22.193Z" }, - { url = "https://files.pythonhosted.org/packages/85/f4/feeddb7712238aff51184f537f374809fbc29546e68a22f0ef34bfbeea55/av-14.3.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:bf000c608a15ae27c51c49142c3a2be0618bd7263cd804b1bfa30dd55460b3a0", size = 35716047, upload-time = "2025-04-06T10:20:25.499Z" }, - { url = "https://files.pythonhosted.org/packages/4b/12/45c8cdb863b4bd075e2382b91013bd8f15f8bb8bd8332d6dcab5739b9b1a/av-14.3.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:bc723464d8ee806b5ac5a3915244019080e22ed55283884c729b336806483a62", size = 34064482, upload-time = "2025-04-06T10:20:28.577Z" }, - { url = "https://files.pythonhosted.org/packages/96/57/cee24def34261f0bc7b7aed63424a54d1744e45df0c52b89412abda420a8/av-14.3.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:d8e36dea941f3e1e7f3791c758cf52c392472cf36c51da19fd7288ab94b5d0e2", size = 36688268, upload-time = "2025-04-06T10:20:31.846Z" }, - { url = "https://files.pythonhosted.org/packages/6e/31/047e25e2d52489819cf5d400cc66c0d6d70b3f603b3662c12f9bac1dafa2/av-14.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:18680276d534b327e108d08ab8b35da1500696a4f1ce9658c4324028cfb4641e", size = 27465841, upload-time = "2025-04-06T10:20:34.857Z" }, - { url = "https://files.pythonhosted.org/packages/a0/a1/97ea1de8f0818d13847c4534d3799e7b7cf1cfb3e1b8cda2bb4afbcebb76/av-14.3.0-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:c3c6aa31553de2578ca7424ce05803c0672525d0cef542495f47c5a923466dcc", size = 20014633, upload-time = "2025-04-06T10:20:37.339Z" }, - { url = "https://files.pythonhosted.org/packages/bc/88/6714076267b6ecb3b635c606d046ad8ec4838eb14bc717ee300d71323850/av-14.3.0-cp311-cp311-macosx_12_0_x86_64.whl", hash = "sha256:5bc930153f945f858c2aca98b8a4fa7265f93d6015729dbb6b780b58ce26325c", size = 23803761, upload-time = "2025-04-06T10:20:39.558Z" }, - { url = "https://files.pythonhosted.org/packages/c0/06/058499e504469daa8242c9646e84b7a557ba4bf57bdf3c555bec0d902085/av-14.3.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:943d46a1a93f1282abaeec0d1c62698104958865c30df9478f48a6aef7328eb8", size = 33578833, upload-time = "2025-04-06T10:20:42.356Z" }, - { url = "https://files.pythonhosted.org/packages/e8/b5/db140404e7c0ba3e07fe7ffd17e04e7762e8d96af7a65d89452baad743bf/av-14.3.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8485965f71c84f15cf597e5e5e1731e076d967fc519e074f6f7737a26f3fd89b", size = 32161538, upload-time = "2025-04-06T10:20:45.179Z" }, - { url = "https://files.pythonhosted.org/packages/2b/6a/b88bfb2cd832a410690d97c3ba917e4d01782ca635675ca5a93854530e6c/av-14.3.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b64f9410121548ca3ce4283d9f42dbaadfc2af508810bafea1f0fa745d2a9dee", size = 35209923, upload-time = "2025-04-06T10:20:47.873Z" }, - { url = "https://files.pythonhosted.org/packages/08/e0/d5b97c9f6ccfbda59410cccda0abbfd80a509f8b6f63a0c95a60b1ab4d1d/av-14.3.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:8de6a2b6964d68897249dd41cdb99ca21a59e2907f378dc7e56268a9b6b3a5a8", size = 36215727, upload-time = "2025-04-06T10:20:51.188Z" }, - { url = "https://files.pythonhosted.org/packages/4a/2f/1a151f94072b0bbc80ed0dc50b7264e384a6cedbaa52762308d1fd92aa33/av-14.3.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:5f901aaaf9f59119717ae37924ff81f9a4e2405177e5acf5176335b37dba41ba", size = 34493728, upload-time = "2025-04-06T10:20:54.006Z" }, - { url = "https://files.pythonhosted.org/packages/d0/68/65414390b4b8069947be20eac60ff28ae21a6d2a2b989f916828f3e2e6a2/av-14.3.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:655fe073fa0c97abada8991d362bdb2cc09b021666ca94b82820c64e11fd9f13", size = 37193276, upload-time = "2025-04-06T10:20:57.322Z" }, - { url = "https://files.pythonhosted.org/packages/6d/d8/c0cb086fa61c05183e48309885afef725b367f01c103d56695f359f9bf8e/av-14.3.0-cp311-cp311-win_amd64.whl", hash = "sha256:5135318ffa86241d5370b6d1711aedf6a0c9bea181e52d9eb69d545358183be5", size = 27460406, upload-time = "2025-04-06T10:21:00.746Z" }, - { url = "https://files.pythonhosted.org/packages/1b/ff/092b5bba046a9fd7324d9eee498683ee9e410715d21eff9d3db92dd14910/av-14.3.0-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:8250680e4e17c404008005b60937248712e9c621689bbc647577d8e2eaa00a66", size = 20004033, upload-time = "2025-04-06T10:21:03.346Z" }, - { url = "https://files.pythonhosted.org/packages/90/b8/fa4fb7d5f1c6299c2f691d527c47a717155acb9ff9f3c30358d7d50d60e1/av-14.3.0-cp312-cp312-macosx_12_0_x86_64.whl", hash = "sha256:349aa6ef529daaede95f37e9825c6e36fddb15906b27938d9e22dcdca2e1f648", size = 23804484, upload-time = "2025-04-06T10:21:05.656Z" }, - { url = "https://files.pythonhosted.org/packages/79/f3/230b2d05a918ed4f9390f8d7ca766250662e6200d77453852e85cd854291/av-14.3.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f953a9c999add37b953cb3ad4ef3744d3d4eee50ef1ffeb10cb1f2e6e2cbc088", size = 33727815, upload-time = "2025-04-06T10:21:08.399Z" }, - { url = "https://files.pythonhosted.org/packages/95/f8/593ab784116356e8eb00e1f1b3ab2383c59c1ef40d6bcf19be7cb4679237/av-14.3.0-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1eaefb47d2ee178adfcedb9a70678b1a340a6670262d06ffa476da9c7d315aef", size = 32307276, upload-time = "2025-04-06T10:21:13.34Z" }, - { url = "https://files.pythonhosted.org/packages/40/ff/2237657852dac32052b7401da6bc7fc23127dc7a1ccbb23d4c640c8ea95b/av-14.3.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7e3b7ca97af1eb3e41e7971a0eb75c1375f73b89ff54afb6d8bf431107160855", size = 35439982, upload-time = "2025-04-06T10:21:16.357Z" }, - { url = "https://files.pythonhosted.org/packages/01/f7/e4561cabd16e96a482609211eb8d260a720f222e28bdd80e3af0bbc560a6/av-14.3.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:e2a0404ac4bfa984528538fb7edeb4793091a5cc6883a473d13cb82c505b62e0", size = 36366758, upload-time = "2025-04-06T10:21:19.143Z" }, - { url = "https://files.pythonhosted.org/packages/ce/ee/7334ca271b71c394ef400a11b54b1d8d3eb28a40681b37c3a022d9dc59c8/av-14.3.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:2ceb45e998184231bcc99a14f91f4265d959e6b804fe9054728e9855214b2ad5", size = 34643022, upload-time = "2025-04-06T10:21:22.259Z" }, - { url = "https://files.pythonhosted.org/packages/db/4f/c692ee808a68aa2ec634a00ce084d3f68f28ab6ab7a847780974d780762d/av-14.3.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:f87df669f49d5202f3933dc94e606353f5c5f9a709a1c0823b3f6d6333560bd7", size = 37448043, upload-time = "2025-04-06T10:21:25.21Z" }, - { url = "https://files.pythonhosted.org/packages/84/7d/ed088731274746667e18951cc51d4e054bec941898b853e211df84d47745/av-14.3.0-cp312-cp312-win_amd64.whl", hash = "sha256:90ef006bc334fff31d5e839368bcd8c6345959749a980ce6f7a8a5fa2c8396e7", size = 27460903, upload-time = "2025-04-06T10:21:28.011Z" }, - { url = "https://files.pythonhosted.org/packages/e0/a0/d9bd6fea6b87ed15294eb2c5da5968e842a062b44e5e190d8cb7be26c333/av-14.3.0-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:0ec9ed764acbbcc590f30891abdb792c2917e13c91c407751f01ff3d2f957672", size = 19966774, upload-time = "2025-04-06T10:21:30.54Z" }, - { url = "https://files.pythonhosted.org/packages/40/92/69d2e596be108b47b83d115ab697f25f553a5449974de6ce4d1b37d313f9/av-14.3.0-cp313-cp313-macosx_12_0_x86_64.whl", hash = "sha256:5c886dcbc7d2f6b6c88e0bea061b268895265d1ec8593e1fd2c69c9795225b9d", size = 23768305, upload-time = "2025-04-06T10:21:32.883Z" }, - { url = "https://files.pythonhosted.org/packages/14/34/db18546592b5dffaa8066d3129001fe669a0340be7c324792c4bfae356c0/av-14.3.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:acfd2f6d66b3587131060cba58c007028784ba26d1615d43e0d4afdc37d5945a", size = 33424931, upload-time = "2025-04-06T10:21:35.579Z" }, - { url = "https://files.pythonhosted.org/packages/4d/6a/eef972ffae9b7e7edf2606b153cf210cb721fdf777e53790a5b0f19b85c2/av-14.3.0-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ffee262ea4bf016a3e48ce75716ca23adef89cf0d7a55618423fe63bc5986ac2", size = 32018105, upload-time = "2025-04-06T10:21:38.581Z" }, - { url = "https://files.pythonhosted.org/packages/60/9a/8eb6940d78a6d0b695719db3922dec4f3994ca1a0dc943db47720ca64d8f/av-14.3.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9d68e5dd7a1b7373bbdbd82fa85b97d5aed4441d145c3938ba1fe3d78637bb05", size = 35148084, upload-time = "2025-04-06T10:21:41.37Z" }, - { url = "https://files.pythonhosted.org/packages/19/63/fe614c11f43e06c6e04680a53ecd6252c6c074104c2c179ec7d47cc12a82/av-14.3.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:dd2d8fc3d514305fa979363298bf600fa7f48abfb827baa9baf1a49520291a62", size = 36089398, upload-time = "2025-04-06T10:21:44.666Z" }, - { url = "https://files.pythonhosted.org/packages/d0/d6/8cc3c644364199e564e0642674f68b0aeebedc18b6877460c22f7484f3ab/av-14.3.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:96d19099b3867fac67dfe2bb29fd15ef41f1f508d2ec711d1f081e505a9a8d04", size = 34356871, upload-time = "2025-04-06T10:21:47.836Z" }, - { url = "https://files.pythonhosted.org/packages/27/85/6327062a5bb61f96411c0f444a995dc6a7bf2d7189d9c896aa03b4e46028/av-14.3.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:15dc4a7c916620b733613661ceb7a186f141a0fc98608dfbafacdc794a7cd665", size = 37174375, upload-time = "2025-04-06T10:21:50.768Z" }, - { url = "https://files.pythonhosted.org/packages/5b/c0/44232f2e04358ecce33a1d9354f95683bb24262a788d008d8c9dafa3622d/av-14.3.0-cp313-cp313-win_amd64.whl", hash = "sha256:f930faa2e6f6a46d55bc67545b81f5b22bd52975679c1de0f871fc9f8ca95711", size = 27433259, upload-time = "2025-04-06T10:21:53.567Z" }, +version = "14.4.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/86/f6/0b473dab52dfdea05f28f3578b1c56b6c796ce85e76951bab7c4e38d5a74/av-14.4.0.tar.gz", hash = "sha256:3ecbf803a7fdf67229c0edada0830d6bfaea4d10bfb24f0c3f4e607cd1064b42", size = 3892203, upload-time = "2025-05-16T19:13:35.737Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/34/0f/cf6b888747cd1e10eafc4a28942e5b666417c03c39853818900bdaa86116/av-14.4.0-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:10219620699a65b9829cfa08784da2ed38371f1a223ab8f3523f440a24c8381c", size = 19979523, upload-time = "2025-05-16T19:08:59.751Z" }, + { url = "https://files.pythonhosted.org/packages/45/30/8f09ac71ad23344ff247f16a9229b36b1e2a36214fd56ba55df885e9bf85/av-14.4.0-cp310-cp310-macosx_12_0_x86_64.whl", hash = "sha256:8bac981fde1c05e231df9f73a06ed9febce1f03fb0f1320707ac2861bba2567f", size = 23765838, upload-time = "2025-05-16T19:09:02.362Z" }, + { url = "https://files.pythonhosted.org/packages/a2/57/e0c30ceb1e59e7b2b88c9cd6bf79a0a979128de19a94b300a700d3a7ca52/av-14.4.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cc634ed5bdeb362f0523b73693b079b540418d35d7f3003654f788ae6c317eef", size = 33122039, upload-time = "2025-05-16T19:09:04.729Z" }, + { url = "https://files.pythonhosted.org/packages/c6/a7/9b3064c49f2d2219ee1b895cc77fca18c84d6121b51c8ce6b7f618a2661b/av-14.4.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:23973ed5c5bec9565094d2b3643f10a6996707ddffa5252e112d578ad34aa9ae", size = 31758563, upload-time = "2025-05-16T19:09:07.679Z" }, + { url = "https://files.pythonhosted.org/packages/23/42/0eafe0de75de6a0db71add8e4ea51ebf090482bad3068f4a874c90fbd110/av-14.4.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0655f7207db6a211d7cedb8ac6a2f7ccc9c4b62290130e393a3fd99425247311", size = 34750358, upload-time = "2025-05-16T19:09:10.932Z" }, + { url = "https://files.pythonhosted.org/packages/75/33/5430ba9ad73036f2d69395d36f3d57b261c51db6f6542bcfc60087640bb7/av-14.4.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:1edaab73319bfefe53ee09c4b1cf7b141ea7e6678a0a1c62f7bac1e2c68ec4e7", size = 35793636, upload-time = "2025-05-16T19:09:13.726Z" }, + { url = "https://files.pythonhosted.org/packages/00/a9/d8c07f0ab69be05a4939719d7a31dc3e9fb112ee8ec6c9411a6c9c085f0a/av-14.4.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:b54838fa17c031ffd780df07b9962fac1be05220f3c28468f7fe49474f1bf8d2", size = 34123666, upload-time = "2025-05-16T19:09:16.968Z" }, + { url = "https://files.pythonhosted.org/packages/48/e1/2f2f607553f2ac6369e5fc814e77b41f9ceb285ce9d8c02c9ee034b8b6db/av-14.4.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:f4b59ac6c563b9b6197299944145958a8ec34710799fd851f1a889b0cbcd1059", size = 36756157, upload-time = "2025-05-16T19:09:21.447Z" }, + { url = "https://files.pythonhosted.org/packages/d7/f0/d653d4eaa7e68732f8c0013aee40f31ff0cd49e90fdec89cca6c193db207/av-14.4.0-cp310-cp310-win_amd64.whl", hash = "sha256:a0192a584fae9f6cedfac03c06d5bf246517cdf00c8779bc33414404796a526e", size = 27931039, upload-time = "2025-05-16T19:09:24.739Z" }, + { url = "https://files.pythonhosted.org/packages/18/8a/d57418b686ffd05fabd5a0a9cfa97e63b38c35d7101af00e87c51c8cc43c/av-14.4.0-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:5b21d5586a88b9fce0ab78e26bd1c38f8642f8e2aad5b35e619f4d202217c701", size = 19965048, upload-time = "2025-05-16T19:09:27.419Z" }, + { url = "https://files.pythonhosted.org/packages/f5/aa/3f878b0301efe587e9b07bb773dd6b47ef44ca09a3cffb4af50c08a170f3/av-14.4.0-cp311-cp311-macosx_12_0_x86_64.whl", hash = "sha256:cf8762d90b0f94a20c9f6e25a94f1757db5a256707964dfd0b1d4403e7a16835", size = 23750064, upload-time = "2025-05-16T19:09:30.012Z" }, + { url = "https://files.pythonhosted.org/packages/9a/b4/6fe94a31f9ed3a927daa72df67c7151968587106f30f9f8fcd792b186633/av-14.4.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c0ac9f08920c7bbe0795319689d901e27cb3d7870b9a0acae3f26fc9daa801a6", size = 33648775, upload-time = "2025-05-16T19:09:33.811Z" }, + { url = "https://files.pythonhosted.org/packages/6c/f3/7f3130753521d779450c935aec3f4beefc8d4645471159f27b54e896470c/av-14.4.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a56d9ad2afdb638ec0404e962dc570960aae7e08ae331ad7ff70fbe99a6cf40e", size = 32216915, upload-time = "2025-05-16T19:09:36.99Z" }, + { url = "https://files.pythonhosted.org/packages/f8/9a/8ffabfcafb42154b4b3a67d63f9b69e68fa8c34cb39ddd5cb813dd049ed4/av-14.4.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6bed513cbcb3437d0ae47743edc1f5b4a113c0b66cdd4e1aafc533abf5b2fbf2", size = 35287279, upload-time = "2025-05-16T19:09:39.711Z" }, + { url = "https://files.pythonhosted.org/packages/ad/11/7023ba0a2ca94a57aedf3114ab8cfcecb0819b50c30982a4c5be4d31df41/av-14.4.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d030c2d3647931e53d51f2f6e0fcf465263e7acf9ec6e4faa8dbfc77975318c3", size = 36294683, upload-time = "2025-05-16T19:09:42.668Z" }, + { url = "https://files.pythonhosted.org/packages/3d/fa/b8ac9636bd5034e2b899354468bef9f4dadb067420a16d8a493a514b7817/av-14.4.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:1cc21582a4f606271d8c2036ec7a6247df0831050306c55cf8a905701d0f0474", size = 34552391, upload-time = "2025-05-16T19:09:46.852Z" }, + { url = "https://files.pythonhosted.org/packages/fb/29/0db48079c207d1cba7a2783896db5aec3816e17de55942262c244dffbc0f/av-14.4.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:ce7c9cd452153d36f1b1478f904ed5f9ab191d76db873bdd3a597193290805d4", size = 37265250, upload-time = "2025-05-16T19:09:50.013Z" }, + { url = "https://files.pythonhosted.org/packages/1c/55/715858c3feb7efa4d667ce83a829c8e6ee3862e297fb2b568da3f968639d/av-14.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:fd261e31cc6b43ca722f80656c39934199d8f2eb391e0147e704b6226acebc29", size = 27925845, upload-time = "2025-05-16T19:09:52.663Z" }, + { url = "https://files.pythonhosted.org/packages/a6/75/b8641653780336c90ba89e5352cac0afa6256a86a150c7703c0b38851c6d/av-14.4.0-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:a53e682b239dd23b4e3bc9568cfb1168fc629ab01925fdb2e7556eb426339e94", size = 19954125, upload-time = "2025-05-16T19:09:54.909Z" }, + { url = "https://files.pythonhosted.org/packages/99/e6/37fe6fa5853a48d54d749526365780a63a4bc530be6abf2115e3a21e292a/av-14.4.0-cp312-cp312-macosx_12_0_x86_64.whl", hash = "sha256:5aa0b901751a32703fa938d2155d56ce3faf3630e4a48d238b35d2f7e49e5395", size = 23751479, upload-time = "2025-05-16T19:09:57.113Z" }, + { url = "https://files.pythonhosted.org/packages/f7/75/9a5f0e6bda5f513b62bafd1cff2b495441a8b07ab7fb7b8e62f0c0d1683f/av-14.4.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a3b316fed3597675fe2aacfed34e25fc9d5bb0196dc8c0b014ae5ed4adda48de", size = 33801401, upload-time = "2025-05-16T19:09:59.479Z" }, + { url = "https://files.pythonhosted.org/packages/6a/c9/e4df32a2ad1cb7f3a112d0ed610c5e43c89da80b63c60d60e3dc23793ec0/av-14.4.0-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a587b5c5014c3c0e16143a0f8d99874e46b5d0c50db6111aa0b54206b5687c81", size = 32364330, upload-time = "2025-05-16T19:10:02.111Z" }, + { url = "https://files.pythonhosted.org/packages/ca/f0/64e7444a41817fde49a07d0239c033f7e9280bec4a4bb4784f5c79af95e6/av-14.4.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:10d53f75e8ac1ec8877a551c0db32a83c0aaeae719d05285281eaaba211bbc30", size = 35519508, upload-time = "2025-05-16T19:10:05.008Z" }, + { url = "https://files.pythonhosted.org/packages/c2/a8/a370099daa9033a3b6f9b9bd815304b3d8396907a14d09845f27467ba138/av-14.4.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:c8558cfde79dd8fc92d97c70e0f0fa8c94c7a66f68ae73afdf58598f0fe5e10d", size = 36448593, upload-time = "2025-05-16T19:10:07.887Z" }, + { url = "https://files.pythonhosted.org/packages/27/bb/edb6ceff8fa7259cb6330c51dbfbc98dd1912bd6eb5f7bc05a4bb14a9d6e/av-14.4.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:455b6410dea0ab2d30234ffb28df7d62ca3cdf10708528e247bec3a4cdcced09", size = 34701485, upload-time = "2025-05-16T19:10:10.886Z" }, + { url = "https://files.pythonhosted.org/packages/a7/8a/957da1f581aa1faa9a5dfa8b47ca955edb47f2b76b949950933b457bfa1d/av-14.4.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:1661efbe9d975f927b8512d654704223d936f39016fad2ddab00aee7c40f412c", size = 37521981, upload-time = "2025-05-16T19:10:13.678Z" }, + { url = "https://files.pythonhosted.org/packages/28/76/3f1cf0568592f100fd68eb40ed8c491ce95ca3c1378cc2d4c1f6d1bd295d/av-14.4.0-cp312-cp312-win_amd64.whl", hash = "sha256:fbbeef1f421a3461086853d6464ad5526b56ffe8ccb0ab3fd0a1f121dfbf26ad", size = 27925944, upload-time = "2025-05-16T19:10:16.485Z" }, + { url = "https://files.pythonhosted.org/packages/12/4c/b0205f77352312ff457ecdf31723dbf4403b7a03fc1659075d6d32f23ef7/av-14.4.0-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:3d2aea7c602b105363903e4017103bc4b60336e7aff80e1c22e8b4ec09fd125f", size = 19917341, upload-time = "2025-05-16T19:10:18.826Z" }, + { url = "https://files.pythonhosted.org/packages/e1/c4/9e783bd7d47828e9c67f9c773c99de45c5ae01b3e942f1abf6cbaf530267/av-14.4.0-cp313-cp313-macosx_12_0_x86_64.whl", hash = "sha256:38c18f036aeb6dc9abf5e867d998c867f9ec93a5f722b60721fdffc123bbb2ae", size = 23715363, upload-time = "2025-05-16T19:10:21.42Z" }, + { url = "https://files.pythonhosted.org/packages/b5/26/b2b406a676864d06b1c591205782d8527e7c99e5bc51a09862c3576e0087/av-14.4.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:58c1e18c8be73b6eada2d9ec397852ec74ebe51938451bdf83644a807189d6c8", size = 33496968, upload-time = "2025-05-16T19:10:24.178Z" }, + { url = "https://files.pythonhosted.org/packages/89/09/0a032bbe30c7049fca243ec8cf01f4be49dd6e7f7b9c3c7f0cc13f83c9d3/av-14.4.0-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e4c32ff03a357feb030634f093089a73cb474b04efe7fbfba31f229cb2fab115", size = 32075498, upload-time = "2025-05-16T19:10:27.384Z" }, + { url = "https://files.pythonhosted.org/packages/0b/1f/0fee20f74c1f48086366e59dbd37fa0684cd0f3c782a65cbb719d26c7acd/av-14.4.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:af31d16ae25964a6a02e09cc132b9decd5ee493c5dcb21bcdf0d71b2d6adbd59", size = 35224910, upload-time = "2025-05-16T19:10:30.104Z" }, + { url = "https://files.pythonhosted.org/packages/9e/19/1c4a201c75a2a431a85a43fd15d1fad55a28c22d596461d861c8d70f9b92/av-14.4.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:e9fb297009e528f4851d25f3bb2781b2db18b59b10aed10240e947b77c582fb7", size = 36172918, upload-time = "2025-05-16T19:10:32.789Z" }, + { url = "https://files.pythonhosted.org/packages/00/48/26b7e5d911c807f5f017a285362470ba16f44e8ea46f8b09ab5e348dd15b/av-14.4.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:573314cb9eafec2827dc98c416c965330dc7508193adbccd281700d8673b9f0a", size = 34414492, upload-time = "2025-05-16T19:10:36.023Z" }, + { url = "https://files.pythonhosted.org/packages/6d/26/2f4badfa5b5b7b8f5f83d562b143a83ed940fa458eea4cad495ce95c9741/av-14.4.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:f82ab27ee57c3b80eb50a5293222307dfdc02f810ea41119078cfc85ea3cf9a8", size = 37245826, upload-time = "2025-05-16T19:10:39.562Z" }, + { url = "https://files.pythonhosted.org/packages/f4/02/88dbb6f5a05998b730d2e695b05060297af127ac4250efbe0739daa446d5/av-14.4.0-cp313-cp313-win_amd64.whl", hash = "sha256:9f682003bbcaac620b52f68ff0e85830fff165dea53949e217483a615993ca20", size = 27898395, upload-time = "2025-05-16T19:13:02.653Z" }, ] [[package]] @@ -591,30 +595,30 @@ wheels = [ [[package]] name = "boto3" -version = "1.38.17" +version = "1.38.23" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "botocore", marker = "sys_platform == 'darwin' or sys_platform == 'linux' or sys_platform == 'win32'" }, { name = "jmespath", marker = "sys_platform == 'darwin' or sys_platform == 'linux' or sys_platform == 'win32'" }, { name = "s3transfer", marker = "sys_platform == 'darwin' or sys_platform == 'linux' or sys_platform == 'win32'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/a5/dd/68ea8ab6dfbed46b75fcfe0bbd5ae19e4d3ef094b749ff8d944398e90f2d/boto3-1.38.17.tar.gz", hash = "sha256:6058feef976ece2878ad3555f39933e63d20d02e2bbd40610ab2926d4555710a", size = 111803, upload-time = "2025-05-15T19:35:17.029Z" } +sdist = { url = "https://files.pythonhosted.org/packages/40/73/3f67417985007b385adab61dd9d251cf82d409ce5397ec7d067274b09492/boto3-1.38.23.tar.gz", hash = "sha256:bcf73aca469add09e165b8793be18e7578db8d2604d82505ab13dc2495bad982", size = 111806, upload-time = "2025-05-23T19:25:26.212Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/ce/89/634155fb209f50fd98da1cb11480bcdf6ed8d8ab68800d91cdb2bf59a8af/boto3-1.38.17-py3-none-any.whl", hash = "sha256:9b56c98fe7acb6559c24dacd838989878c60f3df2fb8ca5f311128419fd9f953", size = 139937, upload-time = "2025-05-15T19:35:14.663Z" }, + { url = "https://files.pythonhosted.org/packages/e4/f5/9114596c6a4f5e4dade83fbdd271b9572367abdce73b9c7d27142e9e66c3/boto3-1.38.23-py3-none-any.whl", hash = "sha256:70ab8364f1f6f0a7e0eaf97f62fbdacf9c1e4cc1de330faf1c146ef9ab01e7d0", size = 139938, upload-time = "2025-05-23T19:25:24.158Z" }, ] [[package]] name = "botocore" -version = "1.38.17" +version = "1.38.23" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "jmespath", marker = "sys_platform == 'darwin' or sys_platform == 'linux' or sys_platform == 'win32'" }, { name = "python-dateutil", marker = "sys_platform == 'darwin' or sys_platform == 'linux' or sys_platform == 'win32'" }, { name = "urllib3", marker = "sys_platform == 'darwin' or sys_platform == 'linux' or sys_platform == 'win32'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/33/73/8b831403be00dbea152d4827929a5772f58e0413dd3e6b6d4b3592d88d39/botocore-1.38.17.tar.gz", hash = "sha256:f2db4c4bdcfbc41d78bfe73b9affe7d217c7840f8ce120cff815536969418b18", size = 13903448, upload-time = "2025-05-15T19:35:05.325Z" } +sdist = { url = "https://files.pythonhosted.org/packages/4d/d5/134a28a30cb1b0c9aa08ceb5d1a3e7afe956f7fa7abad2adda7c5c01d6a1/botocore-1.38.23.tar.gz", hash = "sha256:29685c91050a870c3809238dc5da1ac65a48a3a20b4bca46b6057dcb6b39c72a", size = 13908529, upload-time = "2025-05-23T19:25:15.199Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/01/fc/9c08db2e89055999e996fee3537cbbfb4ed8ebf0d4ab1b1045e1819b76d8/botocore-1.38.17-py3-none-any.whl", hash = "sha256:ec75cf02fbd3dbec18187085ce387761eab16afdccfd0774fd168db3689c6cb6", size = 13564514, upload-time = "2025-05-15T19:35:00.231Z" }, + { url = "https://files.pythonhosted.org/packages/ab/dd/e047894efa3a39509f8fcc103dd096999aa52907c969d195af6b0d8e282f/botocore-1.38.23-py3-none-any.whl", hash = "sha256:a7f818672f10d7a080c2c4558428011c3e0abc1039a047d27ac76ec846158457", size = 13567446, upload-time = "2025-05-23T19:25:10.795Z" }, ] [[package]] @@ -796,49 +800,23 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/ec/52/fec0262af470a157a557e46be1d52ecdaf1695cefd80bb62bb6a07cc4ea9/cheap_repr-0.5.2-py2.py3-none-any.whl", hash = "sha256:537ec1991bfee885c13c6d473afd110a408e039cde26882e95bf92761556ab6e", size = 12228, upload-time = "2024-08-10T14:08:05.965Z" }, ] -[[package]] -name = "chroma-hnswlib" -version = "0.7.6" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "numpy", marker = "sys_platform == 'darwin' or sys_platform == 'linux' or sys_platform == 'win32'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/73/09/10d57569e399ce9cbc5eee2134996581c957f63a9addfa6ca657daf006b8/chroma_hnswlib-0.7.6.tar.gz", hash = "sha256:4dce282543039681160259d29fcde6151cc9106c6461e0485f57cdccd83059b7", size = 32256, upload-time = "2024-07-22T20:19:29.259Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/a8/74/b9dde05ea8685d2f8c4681b517e61c7887e974f6272bb24ebc8f2105875b/chroma_hnswlib-0.7.6-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f35192fbbeadc8c0633f0a69c3d3e9f1a4eab3a46b65458bbcbcabdd9e895c36", size = 195821, upload-time = "2024-07-22T20:18:26.163Z" }, - { url = "https://files.pythonhosted.org/packages/fd/58/101bfa6bc41bc6cc55fbb5103c75462a7bf882e1704256eb4934df85b6a8/chroma_hnswlib-0.7.6-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6f007b608c96362b8f0c8b6b2ac94f67f83fcbabd857c378ae82007ec92f4d82", size = 183854, upload-time = "2024-07-22T20:18:27.6Z" }, - { url = "https://files.pythonhosted.org/packages/17/ff/95d49bb5ce134f10d6aa08d5f3bec624eaff945f0b17d8c3fce888b9a54a/chroma_hnswlib-0.7.6-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:456fd88fa0d14e6b385358515aef69fc89b3c2191706fd9aee62087b62aad09c", size = 2358774, upload-time = "2024-07-22T20:18:29.161Z" }, - { url = "https://files.pythonhosted.org/packages/3a/6d/27826180a54df80dbba8a4f338b022ba21c0c8af96fd08ff8510626dee8f/chroma_hnswlib-0.7.6-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5dfaae825499c2beaa3b75a12d7ec713b64226df72a5c4097203e3ed532680da", size = 2392739, upload-time = "2024-07-22T20:18:30.938Z" }, - { url = "https://files.pythonhosted.org/packages/d6/63/ee3e8b7a8f931918755faacf783093b61f32f59042769d9db615999c3de0/chroma_hnswlib-0.7.6-cp310-cp310-win_amd64.whl", hash = "sha256:2487201982241fb1581be26524145092c95902cb09fc2646ccfbc407de3328ec", size = 150955, upload-time = "2024-07-22T20:18:32.268Z" }, - { url = "https://files.pythonhosted.org/packages/f5/af/d15fdfed2a204c0f9467ad35084fbac894c755820b203e62f5dcba2d41f1/chroma_hnswlib-0.7.6-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:81181d54a2b1e4727369486a631f977ffc53c5533d26e3d366dda243fb0998ca", size = 196911, upload-time = "2024-07-22T20:18:33.46Z" }, - { url = "https://files.pythonhosted.org/packages/0d/19/aa6f2139f1ff7ad23a690ebf2a511b2594ab359915d7979f76f3213e46c4/chroma_hnswlib-0.7.6-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4b4ab4e11f1083dd0a11ee4f0e0b183ca9f0f2ed63ededba1935b13ce2b3606f", size = 185000, upload-time = "2024-07-22T20:18:36.16Z" }, - { url = "https://files.pythonhosted.org/packages/79/b1/1b269c750e985ec7d40b9bbe7d66d0a890e420525187786718e7f6b07913/chroma_hnswlib-0.7.6-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:53db45cd9173d95b4b0bdccb4dbff4c54a42b51420599c32267f3abbeb795170", size = 2377289, upload-time = "2024-07-22T20:18:37.761Z" }, - { url = "https://files.pythonhosted.org/packages/c7/2d/d5663e134436e5933bc63516a20b5edc08b4c1b1588b9680908a5f1afd04/chroma_hnswlib-0.7.6-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5c093f07a010b499c00a15bc9376036ee4800d335360570b14f7fe92badcdcf9", size = 2411755, upload-time = "2024-07-22T20:18:39.949Z" }, - { url = "https://files.pythonhosted.org/packages/3e/79/1bce519cf186112d6d5ce2985392a89528c6e1e9332d680bf752694a4cdf/chroma_hnswlib-0.7.6-cp311-cp311-win_amd64.whl", hash = "sha256:0540b0ac96e47d0aa39e88ea4714358ae05d64bbe6bf33c52f316c664190a6a3", size = 151888, upload-time = "2024-07-22T20:18:45.003Z" }, - { url = "https://files.pythonhosted.org/packages/93/ac/782b8d72de1c57b64fdf5cb94711540db99a92768d93d973174c62d45eb8/chroma_hnswlib-0.7.6-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:e87e9b616c281bfbe748d01705817c71211613c3b063021f7ed5e47173556cb7", size = 197804, upload-time = "2024-07-22T20:18:46.442Z" }, - { url = "https://files.pythonhosted.org/packages/32/4e/fd9ce0764228e9a98f6ff46af05e92804090b5557035968c5b4198bc7af9/chroma_hnswlib-0.7.6-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ec5ca25bc7b66d2ecbf14502b5729cde25f70945d22f2aaf523c2d747ea68912", size = 185421, upload-time = "2024-07-22T20:18:47.72Z" }, - { url = "https://files.pythonhosted.org/packages/d9/3d/b59a8dedebd82545d873235ef2d06f95be244dfece7ee4a1a6044f080b18/chroma_hnswlib-0.7.6-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:305ae491de9d5f3c51e8bd52d84fdf2545a4a2bc7af49765cda286b7bb30b1d4", size = 2389672, upload-time = "2024-07-22T20:18:49.583Z" }, - { url = "https://files.pythonhosted.org/packages/74/1e/80a033ea4466338824974a34f418e7b034a7748bf906f56466f5caa434b0/chroma_hnswlib-0.7.6-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:822ede968d25a2c88823ca078a58f92c9b5c4142e38c7c8b4c48178894a0a3c5", size = 2436986, upload-time = "2024-07-22T20:18:51.872Z" }, -] - [[package]] name = "chromadb" -version = "0.6.3" +version = "1.0.10" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "bcrypt", marker = "sys_platform == 'darwin' or sys_platform == 'linux' or sys_platform == 'win32'" }, { name = "build", marker = "sys_platform == 'darwin' or sys_platform == 'linux' or sys_platform == 'win32'" }, - { name = "chroma-hnswlib", marker = "sys_platform == 'darwin' or sys_platform == 'linux' or sys_platform == 'win32'" }, { name = "fastapi", marker = "sys_platform == 'darwin' or sys_platform == 'linux' or sys_platform == 'win32'" }, { name = "grpcio", version = "1.67.1", source = { registry = "https://pypi.org/simple" }, marker = "(python_full_version < '3.13' and sys_platform == 'darwin') or (python_full_version >= '4.0' and sys_platform == 'darwin') or (python_full_version < '3.13' and sys_platform == 'linux') or (python_full_version >= '4.0' and sys_platform == 'linux') or (python_full_version < '3.13' and sys_platform == 'win32') or (python_full_version >= '4.0' and sys_platform == 'win32')" }, { name = "grpcio", version = "1.71.0", source = { registry = "https://pypi.org/simple" }, marker = "(python_full_version >= '3.13' and python_full_version < '4.0' and sys_platform == 'darwin') or (python_full_version >= '3.13' and python_full_version < '4.0' and sys_platform == 'linux') or (python_full_version >= '3.13' and python_full_version < '4.0' and sys_platform == 'win32')" }, { name = "httpx", marker = "sys_platform == 'darwin' or sys_platform == 'linux' or sys_platform == 'win32'" }, { name = "importlib-resources", marker = "sys_platform == 'darwin' or sys_platform == 'linux' or sys_platform == 'win32'" }, + { name = "jsonschema", marker = "sys_platform == 'darwin' or sys_platform == 'linux' or sys_platform == 'win32'" }, { name = "kubernetes", marker = "sys_platform == 'darwin' or sys_platform == 'linux' or sys_platform == 'win32'" }, { name = "mmh3", marker = "sys_platform == 'darwin' or sys_platform == 'linux' or sys_platform == 'win32'" }, { name = "numpy", marker = "sys_platform == 'darwin' or sys_platform == 'linux' or sys_platform == 'win32'" }, - { name = "onnxruntime", version = "1.21.0", source = { registry = "https://pypi.org/simple" }, marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, - { name = "onnxruntime", version = "1.22.0", source = { registry = "https://pypi.org/simple" }, marker = "sys_platform == 'win32'" }, + { name = "onnxruntime", marker = "sys_platform == 'darwin' or sys_platform == 'linux' or sys_platform == 'win32'" }, { name = "opentelemetry-api", marker = "sys_platform == 'darwin' or sys_platform == 'linux' or sys_platform == 'win32'" }, { name = "opentelemetry-exporter-otlp-proto-grpc", marker = "sys_platform == 'darwin' or sys_platform == 'linux' or sys_platform == 'win32'" }, { name = "opentelemetry-instrumentation-fastapi", marker = "sys_platform == 'darwin' or sys_platform == 'linux' or sys_platform == 'win32'" }, @@ -857,9 +835,13 @@ dependencies = [ { name = "typing-extensions", marker = "sys_platform == 'darwin' or sys_platform == 'linux' or sys_platform == 'win32'" }, { name = "uvicorn", extra = ["standard"], marker = "sys_platform == 'darwin' or sys_platform == 'linux' or sys_platform == 'win32'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/39/cd/f0f2de3f466ff514fb6b58271c14f6d22198402bb5b71b8d890231265946/chromadb-0.6.3.tar.gz", hash = "sha256:c8f34c0b704b9108b04491480a36d42e894a960429f87c6516027b5481d59ed3", size = 29297929, upload-time = "2025-01-14T22:20:40.184Z" } +sdist = { url = "https://files.pythonhosted.org/packages/0a/fe/ae7ca5ef7c38b6a3e4e7d249b240d99f40f5266b562e8e9e62266c21196b/chromadb-1.0.10.tar.gz", hash = "sha256:171ba48283e579debed920279f33d340ded80d8986802c2472df40e00a1d68eb", size = 1200803, upload-time = "2025-05-22T00:36:32.025Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/28/8e/5c186c77bf749b6fe0528385e507e463f1667543328d76fd00a49e1a4e6a/chromadb-0.6.3-py3-none-any.whl", hash = "sha256:4851258489a3612b558488d98d09ae0fe0a28d5cad6bd1ba64b96fdc419dc0e5", size = 611129, upload-time = "2025-01-14T22:20:33.784Z" }, + { url = "https://files.pythonhosted.org/packages/ae/dd/fe223dace71e6d644947798c7ecd64d19624090afcbb334cb70e0e8801f9/chromadb-1.0.10-cp39-abi3-macosx_10_12_x86_64.whl", hash = "sha256:7e962123c27e85e9bf2112f6c60ffdaa0a4666502f205eadc34760284f4ca72f", size = 18300874, upload-time = "2025-05-22T00:36:29.417Z" }, + { url = "https://files.pythonhosted.org/packages/5e/da/95ae4f4313623aa517bc7b2d97e72d0ef5601d085598b09de66d676af8a9/chromadb-1.0.10-cp39-abi3-macosx_11_0_arm64.whl", hash = "sha256:81381e80a2cb74235816987ca601a8ebba467fae494b37c315efb1cb38c3ca9e", size = 17554400, upload-time = "2025-05-22T00:36:26.384Z" }, + { url = "https://files.pythonhosted.org/packages/73/d9/59f29c3bd55808b1d9861d36c49d3b4bfffe693382edc1d980d25f5dff38/chromadb-1.0.10-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9cca63ffa9316e3a1672ef8948e243dd3ae858559eda58eaf4826930f3a4faf5", size = 18073433, upload-time = "2025-05-22T00:36:20.422Z" }, + { url = "https://files.pythonhosted.org/packages/08/b6/75fb165801fcfa374610390528f2a5e5f0a79de8572f3533bff39001ce52/chromadb-1.0.10-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:44f498f734f7396a21bf244b304dbae0f5e6d60d81f2ec4311807e3f13df403e", size = 18981802, upload-time = "2025-05-22T00:36:23.369Z" }, + { url = "https://files.pythonhosted.org/packages/93/97/7ada7af95dad0d12c6d0f48fda2c9f806b1dc82f0c6d6dbd98a898e21517/chromadb-1.0.10-cp39-abi3-win_amd64.whl", hash = "sha256:a12b0fbded699b00ffb7bb72e6ddce574d8fad381e783dc7cef08fc1fe268b19", size = 18969769, upload-time = "2025-05-22T00:36:34.267Z" }, ] [[package]] @@ -876,14 +858,14 @@ wheels = [ [[package]] name = "cloudevents" -version = "1.11.0" +version = "1.11.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "deprecation", marker = "sys_platform == 'darwin' or sys_platform == 'linux' or sys_platform == 'win32'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/93/41/97a7448adf5888d394a22d491749fb55b1e06e95870bd9edc3d58889bb8a/cloudevents-1.11.0.tar.gz", hash = "sha256:5be990583e99f3b08af5a709460e20b25cb169270227957a20b47a6ec8635e66", size = 33670, upload-time = "2024-06-20T13:47:32.051Z" } +sdist = { url = "https://files.pythonhosted.org/packages/9b/12/1e2aee578c402cc547eadea8cd5a9c3be60c7601b81d19d342a259caeedf/cloudevents-1.11.1.tar.gz", hash = "sha256:9fa882aefe277f1295319f2945ac62a10daac783ccc3c3c431000774a61c99e3", size = 34377, upload-time = "2025-05-24T02:52:16.837Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/cf/0e/268a75b712e4dd504cff19e4b987942cd93532d1680009d6492c9d41bdac/cloudevents-1.11.0-py3-none-any.whl", hash = "sha256:77edb4f2b01f405c44ea77120c3213418dbc63d8859f98e9e85de875502b8a76", size = 55088, upload-time = "2024-06-20T13:47:30.066Z" }, + { url = "https://files.pythonhosted.org/packages/e7/79/8a2674f8171ded7366a55d8c710741ac6444c2ba7aa06317916592b784b6/cloudevents-1.11.1-py3-none-any.whl", hash = "sha256:74bc7739cda90c5fabaadeb3ee8995edb8faea3a6669775df8c26d368a9cfa71", size = 55760, upload-time = "2025-05-24T02:52:14.794Z" }, ] [[package]] @@ -921,62 +903,66 @@ wheels = [ [[package]] name = "coverage" -version = "7.8.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/19/4f/2251e65033ed2ce1e68f00f91a0294e0f80c80ae8c3ebbe2f12828c4cd53/coverage-7.8.0.tar.gz", hash = "sha256:7a3d62b3b03b4b6fd41a085f3574874cf946cb4604d2b4d3e8dca8cd570ca501", size = 811872, upload-time = "2025-03-30T20:36:45.376Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/78/01/1c5e6ee4ebaaa5e079db933a9a45f61172048c7efa06648445821a201084/coverage-7.8.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2931f66991175369859b5fd58529cd4b73582461877ecfd859b6549869287ffe", size = 211379, upload-time = "2025-03-30T20:34:53.904Z" }, - { url = "https://files.pythonhosted.org/packages/e9/16/a463389f5ff916963471f7c13585e5f38c6814607306b3cb4d6b4cf13384/coverage-7.8.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:52a523153c568d2c0ef8826f6cc23031dc86cffb8c6aeab92c4ff776e7951b28", size = 211814, upload-time = "2025-03-30T20:34:56.959Z" }, - { url = "https://files.pythonhosted.org/packages/b8/b1/77062b0393f54d79064dfb72d2da402657d7c569cfbc724d56ac0f9c67ed/coverage-7.8.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5c8a5c139aae4c35cbd7cadca1df02ea8cf28a911534fc1b0456acb0b14234f3", size = 240937, upload-time = "2025-03-30T20:34:58.751Z" }, - { url = "https://files.pythonhosted.org/packages/d7/54/c7b00a23150083c124e908c352db03bcd33375494a4beb0c6d79b35448b9/coverage-7.8.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5a26c0c795c3e0b63ec7da6efded5f0bc856d7c0b24b2ac84b4d1d7bc578d676", size = 238849, upload-time = "2025-03-30T20:35:00.521Z" }, - { url = "https://files.pythonhosted.org/packages/f7/ec/a6b7cfebd34e7b49f844788fda94713035372b5200c23088e3bbafb30970/coverage-7.8.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:821f7bcbaa84318287115d54becb1915eece6918136c6f91045bb84e2f88739d", size = 239986, upload-time = "2025-03-30T20:35:02.307Z" }, - { url = "https://files.pythonhosted.org/packages/21/8c/c965ecef8af54e6d9b11bfbba85d4f6a319399f5f724798498387f3209eb/coverage-7.8.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:a321c61477ff8ee705b8a5fed370b5710c56b3a52d17b983d9215861e37b642a", size = 239896, upload-time = "2025-03-30T20:35:04.141Z" }, - { url = "https://files.pythonhosted.org/packages/40/83/070550273fb4c480efa8381735969cb403fa8fd1626d74865bfaf9e4d903/coverage-7.8.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:ed2144b8a78f9d94d9515963ed273d620e07846acd5d4b0a642d4849e8d91a0c", size = 238613, upload-time = "2025-03-30T20:35:05.889Z" }, - { url = "https://files.pythonhosted.org/packages/07/76/fbb2540495b01d996d38e9f8897b861afed356be01160ab4e25471f4fed1/coverage-7.8.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:042e7841a26498fff7a37d6fda770d17519982f5b7d8bf5278d140b67b61095f", size = 238909, upload-time = "2025-03-30T20:35:07.76Z" }, - { url = "https://files.pythonhosted.org/packages/a3/7e/76d604db640b7d4a86e5dd730b73e96e12a8185f22b5d0799025121f4dcb/coverage-7.8.0-cp310-cp310-win32.whl", hash = "sha256:f9983d01d7705b2d1f7a95e10bbe4091fabc03a46881a256c2787637b087003f", size = 213948, upload-time = "2025-03-30T20:35:09.144Z" }, - { url = "https://files.pythonhosted.org/packages/5c/a7/f8ce4aafb4a12ab475b56c76a71a40f427740cf496c14e943ade72e25023/coverage-7.8.0-cp310-cp310-win_amd64.whl", hash = "sha256:5a570cd9bd20b85d1a0d7b009aaf6c110b52b5755c17be6962f8ccd65d1dbd23", size = 214844, upload-time = "2025-03-30T20:35:10.734Z" }, - { url = "https://files.pythonhosted.org/packages/2b/77/074d201adb8383addae5784cb8e2dac60bb62bfdf28b2b10f3a3af2fda47/coverage-7.8.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:e7ac22a0bb2c7c49f441f7a6d46c9c80d96e56f5a8bc6972529ed43c8b694e27", size = 211493, upload-time = "2025-03-30T20:35:12.286Z" }, - { url = "https://files.pythonhosted.org/packages/a9/89/7a8efe585750fe59b48d09f871f0e0c028a7b10722b2172dfe021fa2fdd4/coverage-7.8.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:bf13d564d310c156d1c8e53877baf2993fb3073b2fc9f69790ca6a732eb4bfea", size = 211921, upload-time = "2025-03-30T20:35:14.18Z" }, - { url = "https://files.pythonhosted.org/packages/e9/ef/96a90c31d08a3f40c49dbe897df4f1fd51fb6583821a1a1c5ee30cc8f680/coverage-7.8.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a5761c70c017c1b0d21b0815a920ffb94a670c8d5d409d9b38857874c21f70d7", size = 244556, upload-time = "2025-03-30T20:35:15.616Z" }, - { url = "https://files.pythonhosted.org/packages/89/97/dcd5c2ce72cee9d7b0ee8c89162c24972fb987a111b92d1a3d1d19100c61/coverage-7.8.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e5ff52d790c7e1628241ffbcaeb33e07d14b007b6eb00a19320c7b8a7024c040", size = 242245, upload-time = "2025-03-30T20:35:18.648Z" }, - { url = "https://files.pythonhosted.org/packages/b2/7b/b63cbb44096141ed435843bbb251558c8e05cc835c8da31ca6ffb26d44c0/coverage-7.8.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d39fc4817fd67b3915256af5dda75fd4ee10621a3d484524487e33416c6f3543", size = 244032, upload-time = "2025-03-30T20:35:20.131Z" }, - { url = "https://files.pythonhosted.org/packages/97/e3/7fa8c2c00a1ef530c2a42fa5df25a6971391f92739d83d67a4ee6dcf7a02/coverage-7.8.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:b44674870709017e4b4036e3d0d6c17f06a0e6d4436422e0ad29b882c40697d2", size = 243679, upload-time = "2025-03-30T20:35:21.636Z" }, - { url = "https://files.pythonhosted.org/packages/4f/b3/e0a59d8df9150c8a0c0841d55d6568f0a9195692136c44f3d21f1842c8f6/coverage-7.8.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:8f99eb72bf27cbb167b636eb1726f590c00e1ad375002230607a844d9e9a2318", size = 241852, upload-time = "2025-03-30T20:35:23.525Z" }, - { url = "https://files.pythonhosted.org/packages/9b/82/db347ccd57bcef150c173df2ade97976a8367a3be7160e303e43dd0c795f/coverage-7.8.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:b571bf5341ba8c6bc02e0baeaf3b061ab993bf372d982ae509807e7f112554e9", size = 242389, upload-time = "2025-03-30T20:35:25.09Z" }, - { url = "https://files.pythonhosted.org/packages/21/f6/3f7d7879ceb03923195d9ff294456241ed05815281f5254bc16ef71d6a20/coverage-7.8.0-cp311-cp311-win32.whl", hash = "sha256:e75a2ad7b647fd8046d58c3132d7eaf31b12d8a53c0e4b21fa9c4d23d6ee6d3c", size = 213997, upload-time = "2025-03-30T20:35:26.914Z" }, - { url = "https://files.pythonhosted.org/packages/28/87/021189643e18ecf045dbe1e2071b2747901f229df302de01c998eeadf146/coverage-7.8.0-cp311-cp311-win_amd64.whl", hash = "sha256:3043ba1c88b2139126fc72cb48574b90e2e0546d4c78b5299317f61b7f718b78", size = 214911, upload-time = "2025-03-30T20:35:28.498Z" }, - { url = "https://files.pythonhosted.org/packages/aa/12/4792669473297f7973518bec373a955e267deb4339286f882439b8535b39/coverage-7.8.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:bbb5cc845a0292e0c520656d19d7ce40e18d0e19b22cb3e0409135a575bf79fc", size = 211684, upload-time = "2025-03-30T20:35:29.959Z" }, - { url = "https://files.pythonhosted.org/packages/be/e1/2a4ec273894000ebedd789e8f2fc3813fcaf486074f87fd1c5b2cb1c0a2b/coverage-7.8.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:4dfd9a93db9e78666d178d4f08a5408aa3f2474ad4d0e0378ed5f2ef71640cb6", size = 211935, upload-time = "2025-03-30T20:35:31.912Z" }, - { url = "https://files.pythonhosted.org/packages/f8/3a/7b14f6e4372786709a361729164125f6b7caf4024ce02e596c4a69bccb89/coverage-7.8.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f017a61399f13aa6d1039f75cd467be388d157cd81f1a119b9d9a68ba6f2830d", size = 245994, upload-time = "2025-03-30T20:35:33.455Z" }, - { url = "https://files.pythonhosted.org/packages/54/80/039cc7f1f81dcbd01ea796d36d3797e60c106077e31fd1f526b85337d6a1/coverage-7.8.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0915742f4c82208ebf47a2b154a5334155ed9ef9fe6190674b8a46c2fb89cb05", size = 242885, upload-time = "2025-03-30T20:35:35.354Z" }, - { url = "https://files.pythonhosted.org/packages/10/e0/dc8355f992b6cc2f9dcd5ef6242b62a3f73264893bc09fbb08bfcab18eb4/coverage-7.8.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8a40fcf208e021eb14b0fac6bdb045c0e0cab53105f93ba0d03fd934c956143a", size = 245142, upload-time = "2025-03-30T20:35:37.121Z" }, - { url = "https://files.pythonhosted.org/packages/43/1b/33e313b22cf50f652becb94c6e7dae25d8f02e52e44db37a82de9ac357e8/coverage-7.8.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:a1f406a8e0995d654b2ad87c62caf6befa767885301f3b8f6f73e6f3c31ec3a6", size = 244906, upload-time = "2025-03-30T20:35:39.07Z" }, - { url = "https://files.pythonhosted.org/packages/05/08/c0a8048e942e7f918764ccc99503e2bccffba1c42568693ce6955860365e/coverage-7.8.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:77af0f6447a582fdc7de5e06fa3757a3ef87769fbb0fdbdeba78c23049140a47", size = 243124, upload-time = "2025-03-30T20:35:40.598Z" }, - { url = "https://files.pythonhosted.org/packages/5b/62/ea625b30623083c2aad645c9a6288ad9fc83d570f9adb913a2abdba562dd/coverage-7.8.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:f2d32f95922927186c6dbc8bc60df0d186b6edb828d299ab10898ef3f40052fe", size = 244317, upload-time = "2025-03-30T20:35:42.204Z" }, - { url = "https://files.pythonhosted.org/packages/62/cb/3871f13ee1130a6c8f020e2f71d9ed269e1e2124aa3374d2180ee451cee9/coverage-7.8.0-cp312-cp312-win32.whl", hash = "sha256:769773614e676f9d8e8a0980dd7740f09a6ea386d0f383db6821df07d0f08545", size = 214170, upload-time = "2025-03-30T20:35:44.216Z" }, - { url = "https://files.pythonhosted.org/packages/88/26/69fe1193ab0bfa1eb7a7c0149a066123611baba029ebb448500abd8143f9/coverage-7.8.0-cp312-cp312-win_amd64.whl", hash = "sha256:e5d2b9be5b0693cf21eb4ce0ec8d211efb43966f6657807f6859aab3814f946b", size = 214969, upload-time = "2025-03-30T20:35:45.797Z" }, - { url = "https://files.pythonhosted.org/packages/f3/21/87e9b97b568e223f3438d93072479c2f36cc9b3f6b9f7094b9d50232acc0/coverage-7.8.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:5ac46d0c2dd5820ce93943a501ac5f6548ea81594777ca585bf002aa8854cacd", size = 211708, upload-time = "2025-03-30T20:35:47.417Z" }, - { url = "https://files.pythonhosted.org/packages/75/be/882d08b28a0d19c9c4c2e8a1c6ebe1f79c9c839eb46d4fca3bd3b34562b9/coverage-7.8.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:771eb7587a0563ca5bb6f622b9ed7f9d07bd08900f7589b4febff05f469bea00", size = 211981, upload-time = "2025-03-30T20:35:49.002Z" }, - { url = "https://files.pythonhosted.org/packages/7a/1d/ce99612ebd58082fbe3f8c66f6d8d5694976c76a0d474503fa70633ec77f/coverage-7.8.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:42421e04069fb2cbcbca5a696c4050b84a43b05392679d4068acbe65449b5c64", size = 245495, upload-time = "2025-03-30T20:35:51.073Z" }, - { url = "https://files.pythonhosted.org/packages/dc/8d/6115abe97df98db6b2bd76aae395fcc941d039a7acd25f741312ced9a78f/coverage-7.8.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:554fec1199d93ab30adaa751db68acec2b41c5602ac944bb19187cb9a41a8067", size = 242538, upload-time = "2025-03-30T20:35:52.941Z" }, - { url = "https://files.pythonhosted.org/packages/cb/74/2f8cc196643b15bc096d60e073691dadb3dca48418f08bc78dd6e899383e/coverage-7.8.0-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5aaeb00761f985007b38cf463b1d160a14a22c34eb3f6a39d9ad6fc27cb73008", size = 244561, upload-time = "2025-03-30T20:35:54.658Z" }, - { url = "https://files.pythonhosted.org/packages/22/70/c10c77cd77970ac965734fe3419f2c98665f6e982744a9bfb0e749d298f4/coverage-7.8.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:581a40c7b94921fffd6457ffe532259813fc68eb2bdda60fa8cc343414ce3733", size = 244633, upload-time = "2025-03-30T20:35:56.221Z" }, - { url = "https://files.pythonhosted.org/packages/38/5a/4f7569d946a07c952688debee18c2bb9ab24f88027e3d71fd25dbc2f9dca/coverage-7.8.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:f319bae0321bc838e205bf9e5bc28f0a3165f30c203b610f17ab5552cff90323", size = 242712, upload-time = "2025-03-30T20:35:57.801Z" }, - { url = "https://files.pythonhosted.org/packages/bb/a1/03a43b33f50475a632a91ea8c127f7e35e53786dbe6781c25f19fd5a65f8/coverage-7.8.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:04bfec25a8ef1c5f41f5e7e5c842f6b615599ca8ba8391ec33a9290d9d2db3a3", size = 244000, upload-time = "2025-03-30T20:35:59.378Z" }, - { url = "https://files.pythonhosted.org/packages/6a/89/ab6c43b1788a3128e4d1b7b54214548dcad75a621f9d277b14d16a80d8a1/coverage-7.8.0-cp313-cp313-win32.whl", hash = "sha256:dd19608788b50eed889e13a5d71d832edc34fc9dfce606f66e8f9f917eef910d", size = 214195, upload-time = "2025-03-30T20:36:01.005Z" }, - { url = "https://files.pythonhosted.org/packages/12/12/6bf5f9a8b063d116bac536a7fb594fc35cb04981654cccb4bbfea5dcdfa0/coverage-7.8.0-cp313-cp313-win_amd64.whl", hash = "sha256:a9abbccd778d98e9c7e85038e35e91e67f5b520776781d9a1e2ee9d400869487", size = 214998, upload-time = "2025-03-30T20:36:03.006Z" }, - { url = "https://files.pythonhosted.org/packages/2a/e6/1e9df74ef7a1c983a9c7443dac8aac37a46f1939ae3499424622e72a6f78/coverage-7.8.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:18c5ae6d061ad5b3e7eef4363fb27a0576012a7447af48be6c75b88494c6cf25", size = 212541, upload-time = "2025-03-30T20:36:04.638Z" }, - { url = "https://files.pythonhosted.org/packages/04/51/c32174edb7ee49744e2e81c4b1414ac9df3dacfcb5b5f273b7f285ad43f6/coverage-7.8.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:95aa6ae391a22bbbce1b77ddac846c98c5473de0372ba5c463480043a07bff42", size = 212767, upload-time = "2025-03-30T20:36:06.503Z" }, - { url = "https://files.pythonhosted.org/packages/e9/8f/f454cbdb5212f13f29d4a7983db69169f1937e869a5142bce983ded52162/coverage-7.8.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e013b07ba1c748dacc2a80e69a46286ff145935f260eb8c72df7185bf048f502", size = 256997, upload-time = "2025-03-30T20:36:08.137Z" }, - { url = "https://files.pythonhosted.org/packages/e6/74/2bf9e78b321216d6ee90a81e5c22f912fc428442c830c4077b4a071db66f/coverage-7.8.0-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d766a4f0e5aa1ba056ec3496243150698dc0481902e2b8559314368717be82b1", size = 252708, upload-time = "2025-03-30T20:36:09.781Z" }, - { url = "https://files.pythonhosted.org/packages/92/4d/50d7eb1e9a6062bee6e2f92e78b0998848a972e9afad349b6cdde6fa9e32/coverage-7.8.0-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ad80e6b4a0c3cb6f10f29ae4c60e991f424e6b14219d46f1e7d442b938ee68a4", size = 255046, upload-time = "2025-03-30T20:36:11.409Z" }, - { url = "https://files.pythonhosted.org/packages/40/9e/71fb4e7402a07c4198ab44fc564d09d7d0ffca46a9fb7b0a7b929e7641bd/coverage-7.8.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:b87eb6fc9e1bb8f98892a2458781348fa37e6925f35bb6ceb9d4afd54ba36c73", size = 256139, upload-time = "2025-03-30T20:36:13.86Z" }, - { url = "https://files.pythonhosted.org/packages/49/1a/78d37f7a42b5beff027e807c2843185961fdae7fe23aad5a4837c93f9d25/coverage-7.8.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:d1ba00ae33be84066cfbe7361d4e04dec78445b2b88bdb734d0d1cbab916025a", size = 254307, upload-time = "2025-03-30T20:36:16.074Z" }, - { url = "https://files.pythonhosted.org/packages/58/e9/8fb8e0ff6bef5e170ee19d59ca694f9001b2ec085dc99b4f65c128bb3f9a/coverage-7.8.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:f3c38e4e5ccbdc9198aecc766cedbb134b2d89bf64533973678dfcf07effd883", size = 255116, upload-time = "2025-03-30T20:36:18.033Z" }, - { url = "https://files.pythonhosted.org/packages/56/b0/d968ecdbe6fe0a863de7169bbe9e8a476868959f3af24981f6a10d2b6924/coverage-7.8.0-cp313-cp313t-win32.whl", hash = "sha256:379fe315e206b14e21db5240f89dc0774bdd3e25c3c58c2c733c99eca96f1ada", size = 214909, upload-time = "2025-03-30T20:36:19.644Z" }, - { url = "https://files.pythonhosted.org/packages/87/e9/d6b7ef9fecf42dfb418d93544af47c940aa83056c49e6021a564aafbc91f/coverage-7.8.0-cp313-cp313t-win_amd64.whl", hash = "sha256:2e4b6b87bb0c846a9315e3ab4be2d52fac905100565f4b92f02c445c8799e257", size = 216068, upload-time = "2025-03-30T20:36:21.282Z" }, - { url = "https://files.pythonhosted.org/packages/c4/f1/1da77bb4c920aa30e82fa9b6ea065da3467977c2e5e032e38e66f1c57ffd/coverage-7.8.0-pp39.pp310.pp311-none-any.whl", hash = "sha256:b8194fb8e50d556d5849753de991d390c5a1edeeba50f68e3a9253fbd8bf8ccd", size = 203443, upload-time = "2025-03-30T20:36:41.959Z" }, - { url = "https://files.pythonhosted.org/packages/59/f1/4da7717f0063a222db253e7121bd6a56f6fb1ba439dcc36659088793347c/coverage-7.8.0-py3-none-any.whl", hash = "sha256:dbf364b4c5e7bae9250528167dfe40219b62e2d573c854d74be213e1e52069f7", size = 203435, upload-time = "2025-03-30T20:36:43.61Z" }, +version = "7.8.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ba/07/998afa4a0ecdf9b1981ae05415dad2d4e7716e1b1f00abbd91691ac09ac9/coverage-7.8.2.tar.gz", hash = "sha256:a886d531373a1f6ff9fad2a2ba4a045b68467b779ae729ee0b3b10ac20033b27", size = 812759, upload-time = "2025-05-23T11:39:57.856Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/26/6b/7dd06399a5c0b81007e3a6af0395cd60e6a30f959f8d407d3ee04642e896/coverage-7.8.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:bd8ec21e1443fd7a447881332f7ce9d35b8fbd2849e761bb290b584535636b0a", size = 211573, upload-time = "2025-05-23T11:37:47.207Z" }, + { url = "https://files.pythonhosted.org/packages/f0/df/2b24090820a0bac1412955fb1a4dade6bc3b8dcef7b899c277ffaf16916d/coverage-7.8.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:4c26c2396674816deaeae7ded0e2b42c26537280f8fe313335858ffff35019be", size = 212006, upload-time = "2025-05-23T11:37:50.289Z" }, + { url = "https://files.pythonhosted.org/packages/c5/c4/e4e3b998e116625562a872a342419652fa6ca73f464d9faf9f52f1aff427/coverage-7.8.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1aec326ed237e5880bfe69ad41616d333712c7937bcefc1343145e972938f9b3", size = 241128, upload-time = "2025-05-23T11:37:52.229Z" }, + { url = "https://files.pythonhosted.org/packages/b1/67/b28904afea3e87a895da850ba587439a61699bf4b73d04d0dfd99bbd33b4/coverage-7.8.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5e818796f71702d7a13e50c70de2a1924f729228580bcba1607cccf32eea46e6", size = 239026, upload-time = "2025-05-23T11:37:53.846Z" }, + { url = "https://files.pythonhosted.org/packages/8c/0f/47bf7c5630d81bc2cd52b9e13043685dbb7c79372a7f5857279cc442b37c/coverage-7.8.2-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:546e537d9e24efc765c9c891328f30f826e3e4808e31f5d0f87c4ba12bbd1622", size = 240172, upload-time = "2025-05-23T11:37:55.711Z" }, + { url = "https://files.pythonhosted.org/packages/ba/38/af3eb9d36d85abc881f5aaecf8209383dbe0fa4cac2d804c55d05c51cb04/coverage-7.8.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:ab9b09a2349f58e73f8ebc06fac546dd623e23b063e5398343c5270072e3201c", size = 240086, upload-time = "2025-05-23T11:37:57.724Z" }, + { url = "https://files.pythonhosted.org/packages/9e/64/c40c27c2573adeba0fe16faf39a8aa57368a1f2148865d6bb24c67eadb41/coverage-7.8.2-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:fd51355ab8a372d89fb0e6a31719e825cf8df8b6724bee942fb5b92c3f016ba3", size = 238792, upload-time = "2025-05-23T11:37:59.737Z" }, + { url = "https://files.pythonhosted.org/packages/8e/ab/b7c85146f15457671c1412afca7c25a5696d7625e7158002aa017e2d7e3c/coverage-7.8.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:0774df1e093acb6c9e4d58bce7f86656aeed6c132a16e2337692c12786b32404", size = 239096, upload-time = "2025-05-23T11:38:01.693Z" }, + { url = "https://files.pythonhosted.org/packages/d3/50/9446dad1310905fb1dc284d60d4320a5b25d4e3e33f9ea08b8d36e244e23/coverage-7.8.2-cp310-cp310-win32.whl", hash = "sha256:00f2e2f2e37f47e5f54423aeefd6c32a7dbcedc033fcd3928a4f4948e8b96af7", size = 214144, upload-time = "2025-05-23T11:38:03.68Z" }, + { url = "https://files.pythonhosted.org/packages/23/ed/792e66ad7b8b0df757db8d47af0c23659cdb5a65ef7ace8b111cacdbee89/coverage-7.8.2-cp310-cp310-win_amd64.whl", hash = "sha256:145b07bea229821d51811bf15eeab346c236d523838eda395ea969d120d13347", size = 215043, upload-time = "2025-05-23T11:38:05.217Z" }, + { url = "https://files.pythonhosted.org/packages/6a/4d/1ff618ee9f134d0de5cc1661582c21a65e06823f41caf801aadf18811a8e/coverage-7.8.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b99058eef42e6a8dcd135afb068b3d53aff3921ce699e127602efff9956457a9", size = 211692, upload-time = "2025-05-23T11:38:08.485Z" }, + { url = "https://files.pythonhosted.org/packages/96/fa/c3c1b476de96f2bc7a8ca01a9f1fcb51c01c6b60a9d2c3e66194b2bdb4af/coverage-7.8.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:5feb7f2c3e6ea94d3b877def0270dff0947b8d8c04cfa34a17be0a4dc1836879", size = 212115, upload-time = "2025-05-23T11:38:09.989Z" }, + { url = "https://files.pythonhosted.org/packages/f7/c2/5414c5a1b286c0f3881ae5adb49be1854ac5b7e99011501f81c8c1453065/coverage-7.8.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:670a13249b957bb9050fab12d86acef7bf8f6a879b9d1a883799276e0d4c674a", size = 244740, upload-time = "2025-05-23T11:38:11.947Z" }, + { url = "https://files.pythonhosted.org/packages/cd/46/1ae01912dfb06a642ef3dd9cf38ed4996fda8fe884dab8952da616f81a2b/coverage-7.8.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0bdc8bf760459a4a4187b452213e04d039990211f98644c7292adf1e471162b5", size = 242429, upload-time = "2025-05-23T11:38:13.955Z" }, + { url = "https://files.pythonhosted.org/packages/06/58/38c676aec594bfe2a87c7683942e5a30224791d8df99bcc8439fde140377/coverage-7.8.2-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:07a989c867986c2a75f158f03fdb413128aad29aca9d4dbce5fc755672d96f11", size = 244218, upload-time = "2025-05-23T11:38:15.631Z" }, + { url = "https://files.pythonhosted.org/packages/80/0c/95b1023e881ce45006d9abc250f76c6cdab7134a1c182d9713878dfefcb2/coverage-7.8.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:2db10dedeb619a771ef0e2949ccba7b75e33905de959c2643a4607bef2f3fb3a", size = 243865, upload-time = "2025-05-23T11:38:17.622Z" }, + { url = "https://files.pythonhosted.org/packages/57/37/0ae95989285a39e0839c959fe854a3ae46c06610439350d1ab860bf020ac/coverage-7.8.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:e6ea7dba4e92926b7b5f0990634b78ea02f208d04af520c73a7c876d5a8d36cb", size = 242038, upload-time = "2025-05-23T11:38:19.966Z" }, + { url = "https://files.pythonhosted.org/packages/4d/82/40e55f7c0eb5e97cc62cbd9d0746fd24e8caf57be5a408b87529416e0c70/coverage-7.8.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:ef2f22795a7aca99fc3c84393a55a53dd18ab8c93fb431004e4d8f0774150f54", size = 242567, upload-time = "2025-05-23T11:38:21.912Z" }, + { url = "https://files.pythonhosted.org/packages/f9/35/66a51adc273433a253989f0d9cc7aa6bcdb4855382cf0858200afe578861/coverage-7.8.2-cp311-cp311-win32.whl", hash = "sha256:641988828bc18a6368fe72355df5f1703e44411adbe49bba5644b941ce6f2e3a", size = 214194, upload-time = "2025-05-23T11:38:23.571Z" }, + { url = "https://files.pythonhosted.org/packages/f6/8f/a543121f9f5f150eae092b08428cb4e6b6d2d134152c3357b77659d2a605/coverage-7.8.2-cp311-cp311-win_amd64.whl", hash = "sha256:8ab4a51cb39dc1933ba627e0875046d150e88478dbe22ce145a68393e9652975", size = 215109, upload-time = "2025-05-23T11:38:25.137Z" }, + { url = "https://files.pythonhosted.org/packages/77/65/6cc84b68d4f35186463cd7ab1da1169e9abb59870c0f6a57ea6aba95f861/coverage-7.8.2-cp311-cp311-win_arm64.whl", hash = "sha256:8966a821e2083c74d88cca5b7dcccc0a3a888a596a04c0b9668a891de3a0cc53", size = 213521, upload-time = "2025-05-23T11:38:27.123Z" }, + { url = "https://files.pythonhosted.org/packages/8d/2a/1da1ada2e3044fcd4a3254fb3576e160b8fe5b36d705c8a31f793423f763/coverage-7.8.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:e2f6fe3654468d061942591aef56686131335b7a8325684eda85dacdf311356c", size = 211876, upload-time = "2025-05-23T11:38:29.01Z" }, + { url = "https://files.pythonhosted.org/packages/70/e9/3d715ffd5b6b17a8be80cd14a8917a002530a99943cc1939ad5bb2aa74b9/coverage-7.8.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:76090fab50610798cc05241bf83b603477c40ee87acd358b66196ab0ca44ffa1", size = 212130, upload-time = "2025-05-23T11:38:30.675Z" }, + { url = "https://files.pythonhosted.org/packages/a0/02/fdce62bb3c21649abfd91fbdcf041fb99be0d728ff00f3f9d54d97ed683e/coverage-7.8.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2bd0a0a5054be160777a7920b731a0570284db5142abaaf81bcbb282b8d99279", size = 246176, upload-time = "2025-05-23T11:38:32.395Z" }, + { url = "https://files.pythonhosted.org/packages/a7/52/decbbed61e03b6ffe85cd0fea360a5e04a5a98a7423f292aae62423b8557/coverage-7.8.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:da23ce9a3d356d0affe9c7036030b5c8f14556bd970c9b224f9c8205505e3b99", size = 243068, upload-time = "2025-05-23T11:38:33.989Z" }, + { url = "https://files.pythonhosted.org/packages/38/6c/d0e9c0cce18faef79a52778219a3c6ee8e336437da8eddd4ab3dbd8fadff/coverage-7.8.2-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c9392773cffeb8d7e042a7b15b82a414011e9d2b5fdbbd3f7e6a6b17d5e21b20", size = 245328, upload-time = "2025-05-23T11:38:35.568Z" }, + { url = "https://files.pythonhosted.org/packages/f0/70/f703b553a2f6b6c70568c7e398ed0789d47f953d67fbba36a327714a7bca/coverage-7.8.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:876cbfd0b09ce09d81585d266c07a32657beb3eaec896f39484b631555be0fe2", size = 245099, upload-time = "2025-05-23T11:38:37.627Z" }, + { url = "https://files.pythonhosted.org/packages/ec/fb/4cbb370dedae78460c3aacbdad9d249e853f3bc4ce5ff0e02b1983d03044/coverage-7.8.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:3da9b771c98977a13fbc3830f6caa85cae6c9c83911d24cb2d218e9394259c57", size = 243314, upload-time = "2025-05-23T11:38:39.238Z" }, + { url = "https://files.pythonhosted.org/packages/39/9f/1afbb2cb9c8699b8bc38afdce00a3b4644904e6a38c7bf9005386c9305ec/coverage-7.8.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:9a990f6510b3292686713bfef26d0049cd63b9c7bb17e0864f133cbfd2e6167f", size = 244489, upload-time = "2025-05-23T11:38:40.845Z" }, + { url = "https://files.pythonhosted.org/packages/79/fa/f3e7ec7d220bff14aba7a4786ae47043770cbdceeea1803083059c878837/coverage-7.8.2-cp312-cp312-win32.whl", hash = "sha256:bf8111cddd0f2b54d34e96613e7fbdd59a673f0cf5574b61134ae75b6f5a33b8", size = 214366, upload-time = "2025-05-23T11:38:43.551Z" }, + { url = "https://files.pythonhosted.org/packages/54/aa/9cbeade19b7e8e853e7ffc261df885d66bf3a782c71cba06c17df271f9e6/coverage-7.8.2-cp312-cp312-win_amd64.whl", hash = "sha256:86a323a275e9e44cdf228af9b71c5030861d4d2610886ab920d9945672a81223", size = 215165, upload-time = "2025-05-23T11:38:45.148Z" }, + { url = "https://files.pythonhosted.org/packages/c4/73/e2528bf1237d2448f882bbebaec5c3500ef07301816c5c63464b9da4d88a/coverage-7.8.2-cp312-cp312-win_arm64.whl", hash = "sha256:820157de3a589e992689ffcda8639fbabb313b323d26388d02e154164c57b07f", size = 213548, upload-time = "2025-05-23T11:38:46.74Z" }, + { url = "https://files.pythonhosted.org/packages/1a/93/eb6400a745ad3b265bac36e8077fdffcf0268bdbbb6c02b7220b624c9b31/coverage-7.8.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:ea561010914ec1c26ab4188aef8b1567272ef6de096312716f90e5baa79ef8ca", size = 211898, upload-time = "2025-05-23T11:38:49.066Z" }, + { url = "https://files.pythonhosted.org/packages/1b/7c/bdbf113f92683024406a1cd226a199e4200a2001fc85d6a6e7e299e60253/coverage-7.8.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:cb86337a4fcdd0e598ff2caeb513ac604d2f3da6d53df2c8e368e07ee38e277d", size = 212171, upload-time = "2025-05-23T11:38:51.207Z" }, + { url = "https://files.pythonhosted.org/packages/91/22/594513f9541a6b88eb0dba4d5da7d71596dadef6b17a12dc2c0e859818a9/coverage-7.8.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:26a4636ddb666971345541b59899e969f3b301143dd86b0ddbb570bd591f1e85", size = 245564, upload-time = "2025-05-23T11:38:52.857Z" }, + { url = "https://files.pythonhosted.org/packages/1f/f4/2860fd6abeebd9f2efcfe0fd376226938f22afc80c1943f363cd3c28421f/coverage-7.8.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5040536cf9b13fb033f76bcb5e1e5cb3b57c4807fef37db9e0ed129c6a094257", size = 242719, upload-time = "2025-05-23T11:38:54.529Z" }, + { url = "https://files.pythonhosted.org/packages/89/60/f5f50f61b6332451520e6cdc2401700c48310c64bc2dd34027a47d6ab4ca/coverage-7.8.2-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dc67994df9bcd7e0150a47ef41278b9e0a0ea187caba72414b71dc590b99a108", size = 244634, upload-time = "2025-05-23T11:38:57.326Z" }, + { url = "https://files.pythonhosted.org/packages/3b/70/7f4e919039ab7d944276c446b603eea84da29ebcf20984fb1fdf6e602028/coverage-7.8.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:6e6c86888fd076d9e0fe848af0a2142bf606044dc5ceee0aa9eddb56e26895a0", size = 244824, upload-time = "2025-05-23T11:38:59.421Z" }, + { url = "https://files.pythonhosted.org/packages/26/45/36297a4c0cea4de2b2c442fe32f60c3991056c59cdc3cdd5346fbb995c97/coverage-7.8.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:684ca9f58119b8e26bef860db33524ae0365601492e86ba0b71d513f525e7050", size = 242872, upload-time = "2025-05-23T11:39:01.049Z" }, + { url = "https://files.pythonhosted.org/packages/a4/71/e041f1b9420f7b786b1367fa2a375703889ef376e0d48de9f5723fb35f11/coverage-7.8.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:8165584ddedb49204c4e18da083913bdf6a982bfb558632a79bdaadcdafd0d48", size = 244179, upload-time = "2025-05-23T11:39:02.709Z" }, + { url = "https://files.pythonhosted.org/packages/bd/db/3c2bf49bdc9de76acf2491fc03130c4ffc51469ce2f6889d2640eb563d77/coverage-7.8.2-cp313-cp313-win32.whl", hash = "sha256:34759ee2c65362163699cc917bdb2a54114dd06d19bab860725f94ef45a3d9b7", size = 214393, upload-time = "2025-05-23T11:39:05.457Z" }, + { url = "https://files.pythonhosted.org/packages/c6/dc/947e75d47ebbb4b02d8babb1fad4ad381410d5bc9da7cfca80b7565ef401/coverage-7.8.2-cp313-cp313-win_amd64.whl", hash = "sha256:2f9bc608fbafaee40eb60a9a53dbfb90f53cc66d3d32c2849dc27cf5638a21e3", size = 215194, upload-time = "2025-05-23T11:39:07.171Z" }, + { url = "https://files.pythonhosted.org/packages/90/31/a980f7df8a37eaf0dc60f932507fda9656b3a03f0abf188474a0ea188d6d/coverage-7.8.2-cp313-cp313-win_arm64.whl", hash = "sha256:9fe449ee461a3b0c7105690419d0b0aba1232f4ff6d120a9e241e58a556733f7", size = 213580, upload-time = "2025-05-23T11:39:08.862Z" }, + { url = "https://files.pythonhosted.org/packages/8a/6a/25a37dd90f6c95f59355629417ebcb74e1c34e38bb1eddf6ca9b38b0fc53/coverage-7.8.2-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:8369a7c8ef66bded2b6484053749ff220dbf83cba84f3398c84c51a6f748a008", size = 212734, upload-time = "2025-05-23T11:39:11.109Z" }, + { url = "https://files.pythonhosted.org/packages/36/8b/3a728b3118988725f40950931abb09cd7f43b3c740f4640a59f1db60e372/coverage-7.8.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:159b81df53a5fcbc7d45dae3adad554fdbde9829a994e15227b3f9d816d00b36", size = 212959, upload-time = "2025-05-23T11:39:12.751Z" }, + { url = "https://files.pythonhosted.org/packages/53/3c/212d94e6add3a3c3f412d664aee452045ca17a066def8b9421673e9482c4/coverage-7.8.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e6fcbbd35a96192d042c691c9e0c49ef54bd7ed865846a3c9d624c30bb67ce46", size = 257024, upload-time = "2025-05-23T11:39:15.569Z" }, + { url = "https://files.pythonhosted.org/packages/a4/40/afc03f0883b1e51bbe804707aae62e29c4e8c8bbc365c75e3e4ddeee9ead/coverage-7.8.2-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:05364b9cc82f138cc86128dc4e2e1251c2981a2218bfcd556fe6b0fbaa3501be", size = 252867, upload-time = "2025-05-23T11:39:17.64Z" }, + { url = "https://files.pythonhosted.org/packages/18/a2/3699190e927b9439c6ded4998941a3c1d6fa99e14cb28d8536729537e307/coverage-7.8.2-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:46d532db4e5ff3979ce47d18e2fe8ecad283eeb7367726da0e5ef88e4fe64740", size = 255096, upload-time = "2025-05-23T11:39:19.328Z" }, + { url = "https://files.pythonhosted.org/packages/b4/06/16e3598b9466456b718eb3e789457d1a5b8bfb22e23b6e8bbc307df5daf0/coverage-7.8.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:4000a31c34932e7e4fa0381a3d6deb43dc0c8f458e3e7ea6502e6238e10be625", size = 256276, upload-time = "2025-05-23T11:39:21.077Z" }, + { url = "https://files.pythonhosted.org/packages/a7/d5/4b5a120d5d0223050a53d2783c049c311eea1709fa9de12d1c358e18b707/coverage-7.8.2-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:43ff5033d657cd51f83015c3b7a443287250dc14e69910577c3e03bd2e06f27b", size = 254478, upload-time = "2025-05-23T11:39:22.838Z" }, + { url = "https://files.pythonhosted.org/packages/ba/85/f9ecdb910ecdb282b121bfcaa32fa8ee8cbd7699f83330ee13ff9bbf1a85/coverage-7.8.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:94316e13f0981cbbba132c1f9f365cac1d26716aaac130866ca812006f662199", size = 255255, upload-time = "2025-05-23T11:39:24.644Z" }, + { url = "https://files.pythonhosted.org/packages/50/63/2d624ac7d7ccd4ebbd3c6a9eba9d7fc4491a1226071360d59dd84928ccb2/coverage-7.8.2-cp313-cp313t-win32.whl", hash = "sha256:3f5673888d3676d0a745c3d0e16da338c5eea300cb1f4ada9c872981265e76d8", size = 215109, upload-time = "2025-05-23T11:39:26.722Z" }, + { url = "https://files.pythonhosted.org/packages/22/5e/7053b71462e970e869111c1853afd642212568a350eba796deefdfbd0770/coverage-7.8.2-cp313-cp313t-win_amd64.whl", hash = "sha256:2c08b05ee8d7861e45dc5a2cc4195c8c66dca5ac613144eb6ebeaff2d502e73d", size = 216268, upload-time = "2025-05-23T11:39:28.429Z" }, + { url = "https://files.pythonhosted.org/packages/07/69/afa41aa34147655543dbe96994f8a246daf94b361ccf5edfd5df62ce066a/coverage-7.8.2-cp313-cp313t-win_arm64.whl", hash = "sha256:1e1448bb72b387755e1ff3ef1268a06617afd94188164960dba8d0245a46004b", size = 214071, upload-time = "2025-05-23T11:39:30.55Z" }, + { url = "https://files.pythonhosted.org/packages/69/2f/572b29496d8234e4a7773200dd835a0d32d9e171f2d974f3fe04a9dbc271/coverage-7.8.2-pp39.pp310.pp311-none-any.whl", hash = "sha256:ec455eedf3ba0bbdf8f5a570012617eb305c63cb9f03428d39bf544cb2b94837", size = 203636, upload-time = "2025-05-23T11:39:52.002Z" }, + { url = "https://files.pythonhosted.org/packages/a0/1a/0b9c32220ad694d66062f571cc5cedfa9997b64a591e8a500bb63de1bd40/coverage-7.8.2-py3-none-any.whl", hash = "sha256:726f32ee3713f7359696331a18daf0c3b3a70bb0ae71141b9d3c52be7c595e32", size = 203623, upload-time = "2025-05-23T11:39:53.846Z" }, ] [package.optional-dependencies] @@ -986,49 +972,49 @@ toml = [ [[package]] name = "cryptography" -version = "44.0.3" +version = "45.0.3" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "cffi", marker = "(platform_python_implementation != 'PyPy' and sys_platform == 'darwin') or (platform_python_implementation != 'PyPy' and sys_platform == 'linux') or (platform_python_implementation != 'PyPy' and sys_platform == 'win32')" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/53/d6/1411ab4d6108ab167d06254c5be517681f1e331f90edf1379895bcb87020/cryptography-44.0.3.tar.gz", hash = "sha256:fe19d8bc5536a91a24a8133328880a41831b6c5df54599a8417b62fe015d3053", size = 711096, upload-time = "2025-05-02T19:36:04.667Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/08/53/c776d80e9d26441bb3868457909b4e74dd9ccabd182e10b2b0ae7a07e265/cryptography-44.0.3-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:962bc30480a08d133e631e8dfd4783ab71cc9e33d5d7c1e192f0b7c06397bb88", size = 6670281, upload-time = "2025-05-02T19:34:50.665Z" }, - { url = "https://files.pythonhosted.org/packages/6a/06/af2cf8d56ef87c77319e9086601bef621bedf40f6f59069e1b6d1ec498c5/cryptography-44.0.3-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4ffc61e8f3bf5b60346d89cd3d37231019c17a081208dfbbd6e1605ba03fa137", size = 3959305, upload-time = "2025-05-02T19:34:53.042Z" }, - { url = "https://files.pythonhosted.org/packages/ae/01/80de3bec64627207d030f47bf3536889efee8913cd363e78ca9a09b13c8e/cryptography-44.0.3-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:58968d331425a6f9eedcee087f77fd3c927c88f55368f43ff7e0a19891f2642c", size = 4171040, upload-time = "2025-05-02T19:34:54.675Z" }, - { url = "https://files.pythonhosted.org/packages/bd/48/bb16b7541d207a19d9ae8b541c70037a05e473ddc72ccb1386524d4f023c/cryptography-44.0.3-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:e28d62e59a4dbd1d22e747f57d4f00c459af22181f0b2f787ea83f5a876d7c76", size = 3963411, upload-time = "2025-05-02T19:34:56.61Z" }, - { url = "https://files.pythonhosted.org/packages/42/b2/7d31f2af5591d217d71d37d044ef5412945a8a8e98d5a2a8ae4fd9cd4489/cryptography-44.0.3-cp37-abi3-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:af653022a0c25ef2e3ffb2c673a50e5a0d02fecc41608f4954176f1933b12359", size = 3689263, upload-time = "2025-05-02T19:34:58.591Z" }, - { url = "https://files.pythonhosted.org/packages/25/50/c0dfb9d87ae88ccc01aad8eb93e23cfbcea6a6a106a9b63a7b14c1f93c75/cryptography-44.0.3-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:157f1f3b8d941c2bd8f3ffee0af9b049c9665c39d3da9db2dc338feca5e98a43", size = 4196198, upload-time = "2025-05-02T19:35:00.988Z" }, - { url = "https://files.pythonhosted.org/packages/66/c9/55c6b8794a74da652690c898cb43906310a3e4e4f6ee0b5f8b3b3e70c441/cryptography-44.0.3-cp37-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:c6cd67722619e4d55fdb42ead64ed8843d64638e9c07f4011163e46bc512cf01", size = 3966502, upload-time = "2025-05-02T19:35:03.091Z" }, - { url = "https://files.pythonhosted.org/packages/b6/f7/7cb5488c682ca59a02a32ec5f975074084db4c983f849d47b7b67cc8697a/cryptography-44.0.3-cp37-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:b424563394c369a804ecbee9b06dfb34997f19d00b3518e39f83a5642618397d", size = 4196173, upload-time = "2025-05-02T19:35:05.018Z" }, - { url = "https://files.pythonhosted.org/packages/d2/0b/2f789a8403ae089b0b121f8f54f4a3e5228df756e2146efdf4a09a3d5083/cryptography-44.0.3-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:c91fc8e8fd78af553f98bc7f2a1d8db977334e4eea302a4bfd75b9461c2d8904", size = 4087713, upload-time = "2025-05-02T19:35:07.187Z" }, - { url = "https://files.pythonhosted.org/packages/1d/aa/330c13655f1af398fc154089295cf259252f0ba5df93b4bc9d9c7d7f843e/cryptography-44.0.3-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:25cd194c39fa5a0aa4169125ee27d1172097857b27109a45fadc59653ec06f44", size = 4299064, upload-time = "2025-05-02T19:35:08.879Z" }, - { url = "https://files.pythonhosted.org/packages/10/a8/8c540a421b44fd267a7d58a1fd5f072a552d72204a3f08194f98889de76d/cryptography-44.0.3-cp37-abi3-win32.whl", hash = "sha256:3be3f649d91cb182c3a6bd336de8b61a0a71965bd13d1a04a0e15b39c3d5809d", size = 2773887, upload-time = "2025-05-02T19:35:10.41Z" }, - { url = "https://files.pythonhosted.org/packages/b9/0d/c4b1657c39ead18d76bbd122da86bd95bdc4095413460d09544000a17d56/cryptography-44.0.3-cp37-abi3-win_amd64.whl", hash = "sha256:3883076d5c4cc56dbef0b898a74eb6992fdac29a7b9013870b34efe4ddb39a0d", size = 3209737, upload-time = "2025-05-02T19:35:12.12Z" }, - { url = "https://files.pythonhosted.org/packages/34/a3/ad08e0bcc34ad436013458d7528e83ac29910943cea42ad7dd4141a27bbb/cryptography-44.0.3-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:5639c2b16764c6f76eedf722dbad9a0914960d3489c0cc38694ddf9464f1bb2f", size = 6673501, upload-time = "2025-05-02T19:35:13.775Z" }, - { url = "https://files.pythonhosted.org/packages/b1/f0/7491d44bba8d28b464a5bc8cc709f25a51e3eac54c0a4444cf2473a57c37/cryptography-44.0.3-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f3ffef566ac88f75967d7abd852ed5f182da252d23fac11b4766da3957766759", size = 3960307, upload-time = "2025-05-02T19:35:15.917Z" }, - { url = "https://files.pythonhosted.org/packages/f7/c8/e5c5d0e1364d3346a5747cdcd7ecbb23ca87e6dea4f942a44e88be349f06/cryptography-44.0.3-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:192ed30fac1728f7587c6f4613c29c584abdc565d7417c13904708db10206645", size = 4170876, upload-time = "2025-05-02T19:35:18.138Z" }, - { url = "https://files.pythonhosted.org/packages/73/96/025cb26fc351d8c7d3a1c44e20cf9a01e9f7cf740353c9c7a17072e4b264/cryptography-44.0.3-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:7d5fe7195c27c32a64955740b949070f21cba664604291c298518d2e255931d2", size = 3964127, upload-time = "2025-05-02T19:35:19.864Z" }, - { url = "https://files.pythonhosted.org/packages/01/44/eb6522db7d9f84e8833ba3bf63313f8e257729cf3a8917379473fcfd6601/cryptography-44.0.3-cp39-abi3-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:3f07943aa4d7dad689e3bb1638ddc4944cc5e0921e3c227486daae0e31a05e54", size = 3689164, upload-time = "2025-05-02T19:35:21.449Z" }, - { url = "https://files.pythonhosted.org/packages/68/fb/d61a4defd0d6cee20b1b8a1ea8f5e25007e26aeb413ca53835f0cae2bcd1/cryptography-44.0.3-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:cb90f60e03d563ca2445099edf605c16ed1d5b15182d21831f58460c48bffb93", size = 4198081, upload-time = "2025-05-02T19:35:23.187Z" }, - { url = "https://files.pythonhosted.org/packages/1b/50/457f6911d36432a8811c3ab8bd5a6090e8d18ce655c22820994913dd06ea/cryptography-44.0.3-cp39-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:ab0b005721cc0039e885ac3503825661bd9810b15d4f374e473f8c89b7d5460c", size = 3967716, upload-time = "2025-05-02T19:35:25.426Z" }, - { url = "https://files.pythonhosted.org/packages/35/6e/dca39d553075980ccb631955c47b93d87d27f3596da8d48b1ae81463d915/cryptography-44.0.3-cp39-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:3bb0847e6363c037df8f6ede57d88eaf3410ca2267fb12275370a76f85786a6f", size = 4197398, upload-time = "2025-05-02T19:35:27.678Z" }, - { url = "https://files.pythonhosted.org/packages/9b/9d/d1f2fe681eabc682067c66a74addd46c887ebacf39038ba01f8860338d3d/cryptography-44.0.3-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:b0cc66c74c797e1db750aaa842ad5b8b78e14805a9b5d1348dc603612d3e3ff5", size = 4087900, upload-time = "2025-05-02T19:35:29.312Z" }, - { url = "https://files.pythonhosted.org/packages/c4/f5/3599e48c5464580b73b236aafb20973b953cd2e7b44c7c2533de1d888446/cryptography-44.0.3-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:6866df152b581f9429020320e5eb9794c8780e90f7ccb021940d7f50ee00ae0b", size = 4301067, upload-time = "2025-05-02T19:35:31.547Z" }, - { url = "https://files.pythonhosted.org/packages/a7/6c/d2c48c8137eb39d0c193274db5c04a75dab20d2f7c3f81a7dcc3a8897701/cryptography-44.0.3-cp39-abi3-win32.whl", hash = "sha256:c138abae3a12a94c75c10499f1cbae81294a6f983b3af066390adee73f433028", size = 2775467, upload-time = "2025-05-02T19:35:33.805Z" }, - { url = "https://files.pythonhosted.org/packages/c9/ad/51f212198681ea7b0deaaf8846ee10af99fba4e894f67b353524eab2bbe5/cryptography-44.0.3-cp39-abi3-win_amd64.whl", hash = "sha256:5d186f32e52e66994dce4f766884bcb9c68b8da62d61d9d215bfe5fb56d21334", size = 3210375, upload-time = "2025-05-02T19:35:35.369Z" }, - { url = "https://files.pythonhosted.org/packages/7f/10/abcf7418536df1eaba70e2cfc5c8a0ab07aa7aa02a5cbc6a78b9d8b4f121/cryptography-44.0.3-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:cad399780053fb383dc067475135e41c9fe7d901a97dd5d9c5dfb5611afc0d7d", size = 3393192, upload-time = "2025-05-02T19:35:37.468Z" }, - { url = "https://files.pythonhosted.org/packages/06/59/ecb3ef380f5891978f92a7f9120e2852b1df6f0a849c277b8ea45b865db2/cryptography-44.0.3-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:21a83f6f35b9cc656d71b5de8d519f566df01e660ac2578805ab245ffd8523f8", size = 3898419, upload-time = "2025-05-02T19:35:39.065Z" }, - { url = "https://files.pythonhosted.org/packages/bb/d0/35e2313dbb38cf793aa242182ad5bc5ef5c8fd4e5dbdc380b936c7d51169/cryptography-44.0.3-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:fc3c9babc1e1faefd62704bb46a69f359a9819eb0292e40df3fb6e3574715cd4", size = 4117892, upload-time = "2025-05-02T19:35:40.839Z" }, - { url = "https://files.pythonhosted.org/packages/dc/c8/31fb6e33b56c2c2100d76de3fd820afaa9d4d0b6aea1ccaf9aaf35dc7ce3/cryptography-44.0.3-pp310-pypy310_pp73-manylinux_2_34_aarch64.whl", hash = "sha256:e909df4053064a97f1e6565153ff8bb389af12c5c8d29c343308760890560aff", size = 3900855, upload-time = "2025-05-02T19:35:42.599Z" }, - { url = "https://files.pythonhosted.org/packages/43/2a/08cc2ec19e77f2a3cfa2337b429676406d4bb78ddd130a05c458e7b91d73/cryptography-44.0.3-pp310-pypy310_pp73-manylinux_2_34_x86_64.whl", hash = "sha256:dad80b45c22e05b259e33ddd458e9e2ba099c86ccf4e88db7bbab4b747b18d06", size = 4117619, upload-time = "2025-05-02T19:35:44.774Z" }, - { url = "https://files.pythonhosted.org/packages/02/68/fc3d3f84022a75f2ac4b1a1c0e5d6a0c2ea259e14cd4aae3e0e68e56483c/cryptography-44.0.3-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:479d92908277bed6e1a1c69b277734a7771c2b78633c224445b5c60a9f4bc1d9", size = 3136570, upload-time = "2025-05-02T19:35:46.94Z" }, - { url = "https://files.pythonhosted.org/packages/8d/4b/c11ad0b6c061902de5223892d680e89c06c7c4d606305eb8de56c5427ae6/cryptography-44.0.3-pp311-pypy311_pp73-macosx_10_9_x86_64.whl", hash = "sha256:896530bc9107b226f265effa7ef3f21270f18a2026bc09fed1ebd7b66ddf6375", size = 3390230, upload-time = "2025-05-02T19:35:49.062Z" }, - { url = "https://files.pythonhosted.org/packages/58/11/0a6bf45d53b9b2290ea3cec30e78b78e6ca29dc101e2e296872a0ffe1335/cryptography-44.0.3-pp311-pypy311_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:9b4d4a5dbee05a2c390bf212e78b99434efec37b17a4bff42f50285c5c8c9647", size = 3895216, upload-time = "2025-05-02T19:35:51.351Z" }, - { url = "https://files.pythonhosted.org/packages/0a/27/b28cdeb7270e957f0077a2c2bfad1b38f72f1f6d699679f97b816ca33642/cryptography-44.0.3-pp311-pypy311_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:02f55fb4f8b79c1221b0961488eaae21015b69b210e18c386b69de182ebb1259", size = 4115044, upload-time = "2025-05-02T19:35:53.044Z" }, - { url = "https://files.pythonhosted.org/packages/35/b0/ec4082d3793f03cb248881fecefc26015813199b88f33e3e990a43f79835/cryptography-44.0.3-pp311-pypy311_pp73-manylinux_2_34_aarch64.whl", hash = "sha256:dd3db61b8fe5be220eee484a17233287d0be6932d056cf5738225b9c05ef4fff", size = 3898034, upload-time = "2025-05-02T19:35:54.72Z" }, - { url = "https://files.pythonhosted.org/packages/0b/7f/adf62e0b8e8d04d50c9a91282a57628c00c54d4ae75e2b02a223bd1f2613/cryptography-44.0.3-pp311-pypy311_pp73-manylinux_2_34_x86_64.whl", hash = "sha256:978631ec51a6bbc0b7e58f23b68a8ce9e5f09721940933e9c217068388789fe5", size = 4114449, upload-time = "2025-05-02T19:35:57.139Z" }, - { url = "https://files.pythonhosted.org/packages/87/62/d69eb4a8ee231f4bf733a92caf9da13f1c81a44e874b1d4080c25ecbb723/cryptography-44.0.3-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:5d20cc348cca3a8aa7312f42ab953a56e15323800ca3ab0706b8cd452a3a056c", size = 3134369, upload-time = "2025-05-02T19:35:58.907Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/13/1f/9fa001e74a1993a9cadd2333bb889e50c66327b8594ac538ab8a04f915b7/cryptography-45.0.3.tar.gz", hash = "sha256:ec21313dd335c51d7877baf2972569f40a4291b76a0ce51391523ae358d05899", size = 744738, upload-time = "2025-05-25T14:17:24.777Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/82/b2/2345dc595998caa6f68adf84e8f8b50d18e9fc4638d32b22ea8daedd4b7a/cryptography-45.0.3-cp311-abi3-macosx_10_9_universal2.whl", hash = "sha256:7573d9eebaeceeb55285205dbbb8753ac1e962af3d9640791d12b36864065e71", size = 7056239, upload-time = "2025-05-25T14:16:12.22Z" }, + { url = "https://files.pythonhosted.org/packages/71/3d/ac361649a0bfffc105e2298b720d8b862330a767dab27c06adc2ddbef96a/cryptography-45.0.3-cp311-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d377dde61c5d67eb4311eace661c3efda46c62113ff56bf05e2d679e02aebb5b", size = 4205541, upload-time = "2025-05-25T14:16:14.333Z" }, + { url = "https://files.pythonhosted.org/packages/70/3e/c02a043750494d5c445f769e9c9f67e550d65060e0bfce52d91c1362693d/cryptography-45.0.3-cp311-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fae1e637f527750811588e4582988932c222f8251f7b7ea93739acb624e1487f", size = 4433275, upload-time = "2025-05-25T14:16:16.421Z" }, + { url = "https://files.pythonhosted.org/packages/40/7a/9af0bfd48784e80eef3eb6fd6fde96fe706b4fc156751ce1b2b965dada70/cryptography-45.0.3-cp311-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:ca932e11218bcc9ef812aa497cdf669484870ecbcf2d99b765d6c27a86000942", size = 4209173, upload-time = "2025-05-25T14:16:18.163Z" }, + { url = "https://files.pythonhosted.org/packages/31/5f/d6f8753c8708912df52e67969e80ef70b8e8897306cd9eb8b98201f8c184/cryptography-45.0.3-cp311-abi3-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:af3f92b1dc25621f5fad065288a44ac790c5798e986a34d393ab27d2b27fcff9", size = 3898150, upload-time = "2025-05-25T14:16:20.34Z" }, + { url = "https://files.pythonhosted.org/packages/8b/50/f256ab79c671fb066e47336706dc398c3b1e125f952e07d54ce82cf4011a/cryptography-45.0.3-cp311-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:2f8f8f0b73b885ddd7f3d8c2b2234a7d3ba49002b0223f58cfde1bedd9563c56", size = 4466473, upload-time = "2025-05-25T14:16:22.605Z" }, + { url = "https://files.pythonhosted.org/packages/62/e7/312428336bb2df0848d0768ab5a062e11a32d18139447a76dfc19ada8eed/cryptography-45.0.3-cp311-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:9cc80ce69032ffa528b5e16d217fa4d8d4bb7d6ba8659c1b4d74a1b0f4235fca", size = 4211890, upload-time = "2025-05-25T14:16:24.738Z" }, + { url = "https://files.pythonhosted.org/packages/e7/53/8a130e22c1e432b3c14896ec5eb7ac01fb53c6737e1d705df7e0efb647c6/cryptography-45.0.3-cp311-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:c824c9281cb628015bfc3c59335163d4ca0540d49de4582d6c2637312907e4b1", size = 4466300, upload-time = "2025-05-25T14:16:26.768Z" }, + { url = "https://files.pythonhosted.org/packages/ba/75/6bb6579688ef805fd16a053005fce93944cdade465fc92ef32bbc5c40681/cryptography-45.0.3-cp311-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:5833bb4355cb377ebd880457663a972cd044e7f49585aee39245c0d592904578", size = 4332483, upload-time = "2025-05-25T14:16:28.316Z" }, + { url = "https://files.pythonhosted.org/packages/2f/11/2538f4e1ce05c6c4f81f43c1ef2bd6de7ae5e24ee284460ff6c77e42ca77/cryptography-45.0.3-cp311-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:9bb5bf55dcb69f7067d80354d0a348368da907345a2c448b0babc4215ccd3497", size = 4573714, upload-time = "2025-05-25T14:16:30.474Z" }, + { url = "https://files.pythonhosted.org/packages/f5/bb/e86e9cf07f73a98d84a4084e8fd420b0e82330a901d9cac8149f994c3417/cryptography-45.0.3-cp311-abi3-win32.whl", hash = "sha256:3ad69eeb92a9de9421e1f6685e85a10fbcfb75c833b42cc9bc2ba9fb00da4710", size = 2934752, upload-time = "2025-05-25T14:16:32.204Z" }, + { url = "https://files.pythonhosted.org/packages/c7/75/063bc9ddc3d1c73e959054f1fc091b79572e716ef74d6caaa56e945b4af9/cryptography-45.0.3-cp311-abi3-win_amd64.whl", hash = "sha256:97787952246a77d77934d41b62fb1b6f3581d83f71b44796a4158d93b8f5c490", size = 3412465, upload-time = "2025-05-25T14:16:33.888Z" }, + { url = "https://files.pythonhosted.org/packages/71/9b/04ead6015229a9396890d7654ee35ef630860fb42dc9ff9ec27f72157952/cryptography-45.0.3-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:c92519d242703b675ccefd0f0562eb45e74d438e001f8ab52d628e885751fb06", size = 7031892, upload-time = "2025-05-25T14:16:36.214Z" }, + { url = "https://files.pythonhosted.org/packages/46/c7/c7d05d0e133a09fc677b8a87953815c522697bdf025e5cac13ba419e7240/cryptography-45.0.3-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c5edcb90da1843df85292ef3a313513766a78fbbb83f584a5a58fb001a5a9d57", size = 4196181, upload-time = "2025-05-25T14:16:37.934Z" }, + { url = "https://files.pythonhosted.org/packages/08/7a/6ad3aa796b18a683657cef930a986fac0045417e2dc428fd336cfc45ba52/cryptography-45.0.3-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:38deed72285c7ed699864f964a3f4cf11ab3fb38e8d39cfcd96710cd2b5bb716", size = 4423370, upload-time = "2025-05-25T14:16:39.502Z" }, + { url = "https://files.pythonhosted.org/packages/4f/58/ec1461bfcb393525f597ac6a10a63938d18775b7803324072974b41a926b/cryptography-45.0.3-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:5555365a50efe1f486eed6ac7062c33b97ccef409f5970a0b6f205a7cfab59c8", size = 4197839, upload-time = "2025-05-25T14:16:41.322Z" }, + { url = "https://files.pythonhosted.org/packages/d4/3d/5185b117c32ad4f40846f579369a80e710d6146c2baa8ce09d01612750db/cryptography-45.0.3-cp37-abi3-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:9e4253ed8f5948a3589b3caee7ad9a5bf218ffd16869c516535325fece163dcc", size = 3886324, upload-time = "2025-05-25T14:16:43.041Z" }, + { url = "https://files.pythonhosted.org/packages/67/85/caba91a57d291a2ad46e74016d1f83ac294f08128b26e2a81e9b4f2d2555/cryptography-45.0.3-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:cfd84777b4b6684955ce86156cfb5e08d75e80dc2585e10d69e47f014f0a5342", size = 4450447, upload-time = "2025-05-25T14:16:44.759Z" }, + { url = "https://files.pythonhosted.org/packages/ae/d1/164e3c9d559133a38279215c712b8ba38e77735d3412f37711b9f8f6f7e0/cryptography-45.0.3-cp37-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:a2b56de3417fd5f48773ad8e91abaa700b678dc7fe1e0c757e1ae340779acf7b", size = 4200576, upload-time = "2025-05-25T14:16:46.438Z" }, + { url = "https://files.pythonhosted.org/packages/71/7a/e002d5ce624ed46dfc32abe1deff32190f3ac47ede911789ee936f5a4255/cryptography-45.0.3-cp37-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:57a6500d459e8035e813bd8b51b671977fb149a8c95ed814989da682314d0782", size = 4450308, upload-time = "2025-05-25T14:16:48.228Z" }, + { url = "https://files.pythonhosted.org/packages/87/ad/3fbff9c28cf09b0a71e98af57d74f3662dea4a174b12acc493de00ea3f28/cryptography-45.0.3-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:f22af3c78abfbc7cbcdf2c55d23c3e022e1a462ee2481011d518c7fb9c9f3d65", size = 4325125, upload-time = "2025-05-25T14:16:49.844Z" }, + { url = "https://files.pythonhosted.org/packages/f5/b4/51417d0cc01802304c1984d76e9592f15e4801abd44ef7ba657060520bf0/cryptography-45.0.3-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:232954730c362638544758a8160c4ee1b832dc011d2c41a306ad8f7cccc5bb0b", size = 4560038, upload-time = "2025-05-25T14:16:51.398Z" }, + { url = "https://files.pythonhosted.org/packages/80/38/d572f6482d45789a7202fb87d052deb7a7b136bf17473ebff33536727a2c/cryptography-45.0.3-cp37-abi3-win32.whl", hash = "sha256:cb6ab89421bc90e0422aca911c69044c2912fc3debb19bb3c1bfe28ee3dff6ab", size = 2924070, upload-time = "2025-05-25T14:16:53.472Z" }, + { url = "https://files.pythonhosted.org/packages/91/5a/61f39c0ff4443651cc64e626fa97ad3099249152039952be8f344d6b0c86/cryptography-45.0.3-cp37-abi3-win_amd64.whl", hash = "sha256:d54ae41e6bd70ea23707843021c778f151ca258081586f0cfa31d936ae43d1b2", size = 3395005, upload-time = "2025-05-25T14:16:55.134Z" }, + { url = "https://files.pythonhosted.org/packages/1b/63/ce30cb7204e8440df2f0b251dc0464a26c55916610d1ba4aa912f838bcc8/cryptography-45.0.3-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:ed43d396f42028c1f47b5fec012e9e12631266e3825e95c00e3cf94d472dac49", size = 3578348, upload-time = "2025-05-25T14:16:56.792Z" }, + { url = "https://files.pythonhosted.org/packages/45/0b/87556d3337f5e93c37fda0a0b5d3e7b4f23670777ce8820fce7962a7ed22/cryptography-45.0.3-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:fed5aaca1750e46db870874c9c273cd5182a9e9deb16f06f7bdffdb5c2bde4b9", size = 4142867, upload-time = "2025-05-25T14:16:58.459Z" }, + { url = "https://files.pythonhosted.org/packages/72/ba/21356dd0bcb922b820211336e735989fe2cf0d8eaac206335a0906a5a38c/cryptography-45.0.3-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:00094838ecc7c6594171e8c8a9166124c1197b074cfca23645cee573910d76bc", size = 4385000, upload-time = "2025-05-25T14:17:00.656Z" }, + { url = "https://files.pythonhosted.org/packages/2f/2b/71c78d18b804c317b66283be55e20329de5cd7e1aec28e4c5fbbe21fd046/cryptography-45.0.3-pp310-pypy310_pp73-manylinux_2_34_aarch64.whl", hash = "sha256:92d5f428c1a0439b2040435a1d6bc1b26ebf0af88b093c3628913dd464d13fa1", size = 4144195, upload-time = "2025-05-25T14:17:02.782Z" }, + { url = "https://files.pythonhosted.org/packages/55/3e/9f9b468ea779b4dbfef6af224804abd93fbcb2c48605d7443b44aea77979/cryptography-45.0.3-pp310-pypy310_pp73-manylinux_2_34_x86_64.whl", hash = "sha256:ec64ee375b5aaa354b2b273c921144a660a511f9df8785e6d1c942967106438e", size = 4384540, upload-time = "2025-05-25T14:17:04.49Z" }, + { url = "https://files.pythonhosted.org/packages/97/f5/6e62d10cf29c50f8205c0dc9aec986dca40e8e3b41bf1a7878ea7b11e5ee/cryptography-45.0.3-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:71320fbefd05454ef2d457c481ba9a5b0e540f3753354fff6f780927c25d19b0", size = 3328796, upload-time = "2025-05-25T14:17:06.174Z" }, + { url = "https://files.pythonhosted.org/packages/e7/d4/58a246342093a66af8935d6aa59f790cbb4731adae3937b538d054bdc2f9/cryptography-45.0.3-pp311-pypy311_pp73-macosx_10_9_x86_64.whl", hash = "sha256:edd6d51869beb7f0d472e902ef231a9b7689508e83880ea16ca3311a00bf5ce7", size = 3589802, upload-time = "2025-05-25T14:17:07.792Z" }, + { url = "https://files.pythonhosted.org/packages/96/61/751ebea58c87b5be533c429f01996050a72c7283b59eee250275746632ea/cryptography-45.0.3-pp311-pypy311_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:555e5e2d3a53b4fabeca32835878b2818b3f23966a4efb0d566689777c5a12c8", size = 4146964, upload-time = "2025-05-25T14:17:09.538Z" }, + { url = "https://files.pythonhosted.org/packages/8d/01/28c90601b199964de383da0b740b5156f5d71a1da25e7194fdf793d373ef/cryptography-45.0.3-pp311-pypy311_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:25286aacb947286620a31f78f2ed1a32cded7be5d8b729ba3fb2c988457639e4", size = 4388103, upload-time = "2025-05-25T14:17:11.978Z" }, + { url = "https://files.pythonhosted.org/packages/3d/ec/cd892180b9e42897446ef35c62442f5b8b039c3d63a05f618aa87ec9ebb5/cryptography-45.0.3-pp311-pypy311_pp73-manylinux_2_34_aarch64.whl", hash = "sha256:050ce5209d5072472971e6efbfc8ec5a8f9a841de5a4db0ebd9c2e392cb81972", size = 4150031, upload-time = "2025-05-25T14:17:14.131Z" }, + { url = "https://files.pythonhosted.org/packages/db/d4/22628c2dedd99289960a682439c6d3aa248dff5215123ead94ac2d82f3f5/cryptography-45.0.3-pp311-pypy311_pp73-manylinux_2_34_x86_64.whl", hash = "sha256:dc10ec1e9f21f33420cc05214989544727e776286c1c16697178978327b95c9c", size = 4387389, upload-time = "2025-05-25T14:17:17.303Z" }, + { url = "https://files.pythonhosted.org/packages/39/ec/ba3961abbf8ecb79a3586a4ff0ee08c9d7a9938b4312fb2ae9b63f48a8ba/cryptography-45.0.3-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:9eda14f049d7f09c2e8fb411dda17dd6b16a3c76a1de5e249188a32aeb92de19", size = 3337432, upload-time = "2025-05-25T14:17:19.507Z" }, ] [[package]] @@ -1191,11 +1177,11 @@ wheels = [ [[package]] name = "durationpy" -version = "0.9" +version = "0.10" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/31/e9/f49c4e7fccb77fa5c43c2480e09a857a78b41e7331a75e128ed5df45c56b/durationpy-0.9.tar.gz", hash = "sha256:fd3feb0a69a0057d582ef643c355c40d2fa1c942191f914d12203b1a01ac722a", size = 3186, upload-time = "2024-10-02T17:59:00.873Z" } +sdist = { url = "https://files.pythonhosted.org/packages/9d/a4/e44218c2b394e31a6dd0d6b095c4e1f32d0be54c2a4b250032d717647bab/durationpy-0.10.tar.gz", hash = "sha256:1fa6893409a6e739c9c72334fc65cca1f355dbdd93405d30f726deb5bde42fba", size = 3335, upload-time = "2025-05-17T13:52:37.26Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/4c/a3/ac312faeceffd2d8f86bc6dcb5c401188ba5a01bc88e69bed97578a0dfcd/durationpy-0.9-py3-none-any.whl", hash = "sha256:e65359a7af5cedad07fb77a2dd3f390f8eb0b74cb845589fa6c057086834dd38", size = 3461, upload-time = "2024-10-02T17:58:59.349Z" }, + { url = "https://files.pythonhosted.org/packages/b0/0d/9feae160378a3553fa9a339b0e9c1a048e147a4127210e286ef18b730f03/durationpy-0.10-py3-none-any.whl", hash = "sha256:3b41e1b601234296b4fb368338fdcd3e13e0b4fb5b67345948f4f2bf9868b286", size = 3922, upload-time = "2025-05-17T13:52:36.463Z" }, ] [[package]] @@ -1284,16 +1270,16 @@ wheels = [ [[package]] name = "fastapi" -version = "0.115.12" +version = "0.115.9" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "pydantic", marker = "sys_platform == 'darwin' or sys_platform == 'linux' or sys_platform == 'win32'" }, { name = "starlette", marker = "sys_platform == 'darwin' or sys_platform == 'linux' or sys_platform == 'win32'" }, { name = "typing-extensions", marker = "sys_platform == 'darwin' or sys_platform == 'linux' or sys_platform == 'win32'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/f4/55/ae499352d82338331ca1e28c7f4a63bfd09479b16395dce38cf50a39e2c2/fastapi-0.115.12.tar.gz", hash = "sha256:1e2c2a2646905f9e83d32f04a3f86aff4a286669c6c950ca95b5fd68c2602681", size = 295236, upload-time = "2025-03-23T22:55:43.822Z" } +sdist = { url = "https://files.pythonhosted.org/packages/ab/dd/d854f85e70f7341b29e3fda754f2833aec197bd355f805238758e3bcd8ed/fastapi-0.115.9.tar.gz", hash = "sha256:9d7da3b196c5eed049bc769f9475cd55509a112fbe031c0ef2f53768ae68d13f", size = 293774, upload-time = "2025-02-27T16:43:43.149Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/50/b3/b51f09c2ba432a576fe63758bddc81f78f0c6309d9e5c10d194313bf021e/fastapi-0.115.12-py3-none-any.whl", hash = "sha256:e94613d6c05e27be7ffebdd6ea5f388112e5e430c8f7d6494a9d1d88d43e814d", size = 95164, upload-time = "2025-03-23T22:55:42.101Z" }, + { url = "https://files.pythonhosted.org/packages/32/b6/7517af5234378518f27ad35a7b24af9591bc500b8c1780929c1295999eb6/fastapi-0.115.9-py3-none-any.whl", hash = "sha256:4a439d7923e4de796bcc88b64e9754340fcd1574673cbd865ba8a99fe0d28c56", size = 94919, upload-time = "2025-02-27T16:43:40.537Z" }, ] [[package]] @@ -1461,11 +1447,11 @@ wheels = [ [[package]] name = "fsspec" -version = "2025.3.2" +version = "2025.5.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/45/d8/8425e6ba5fcec61a1d16e41b1b71d2bf9344f1fe48012c2b48b9620feae5/fsspec-2025.3.2.tar.gz", hash = "sha256:e52c77ef398680bbd6a98c0e628fbc469491282981209907bbc8aea76a04fdc6", size = 299281, upload-time = "2025-03-31T15:27:08.524Z" } +sdist = { url = "https://files.pythonhosted.org/packages/00/f7/27f15d41f0ed38e8fcc488584b57e902b331da7f7c6dcda53721b15838fc/fsspec-2025.5.1.tar.gz", hash = "sha256:2e55e47a540b91843b755e83ded97c6e897fa0942b11490113f09e9c443c2475", size = 303033, upload-time = "2025-05-24T12:03:23.792Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/44/4b/e0cfc1a6f17e990f3e64b7d941ddc4acdc7b19d6edd51abf495f32b1a9e4/fsspec-2025.3.2-py3-none-any.whl", hash = "sha256:2daf8dc3d1dfa65b6aa37748d112773a7a08416f6c70d96b264c96476ecaf711", size = 194435, upload-time = "2025-03-31T15:27:07.028Z" }, + { url = "https://files.pythonhosted.org/packages/bb/61/78c7b3851add1481b048b5fdc29067397a1784e2910592bc81bb3f608635/fsspec-2025.5.1-py3-none-any.whl", hash = "sha256:24d3a2e663d5fc735ab256263c4075f374a174c3410c0b25e5bd1970bceaa462", size = 199052, upload-time = "2025-05-24T12:03:21.66Z" }, ] [[package]] @@ -1508,7 +1494,7 @@ grpc = [ [[package]] name = "google-api-python-client" -version = "2.169.0" +version = "2.170.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "google-api-core", marker = "sys_platform == 'darwin' or sys_platform == 'linux' or sys_platform == 'win32'" }, @@ -1517,23 +1503,23 @@ dependencies = [ { name = "httplib2", marker = "sys_platform == 'darwin' or sys_platform == 'linux' or sys_platform == 'win32'" }, { name = "uritemplate", marker = "sys_platform == 'darwin' or sys_platform == 'linux' or sys_platform == 'win32'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/4f/e6/787c24738fc7c99de9289abe60bd64591800ae1cdf60db7b87e0e6ef9cdd/google_api_python_client-2.169.0.tar.gz", hash = "sha256:0585bb97bd5f5bf3ed8d4bf624593e4c5a14d06c811d1952b07a1f94b4d12c51", size = 12811341, upload-time = "2025-04-29T15:46:05.603Z" } +sdist = { url = "https://files.pythonhosted.org/packages/db/86/1bd09aea2664a46bc65713cb7876381ec8949a4b1e71be97dfc359c79781/google_api_python_client-2.170.0.tar.gz", hash = "sha256:75f3a1856f11418ea3723214e0abc59d9b217fd7ed43dcf743aab7f06ab9e2b1", size = 12971933, upload-time = "2025-05-22T20:39:52.802Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/2d/bd/6aa93c38756cc9fc63262e0dc3d3f1ff7241ce6f413a25ad6e4a9c98b473/google_api_python_client-2.169.0-py3-none-any.whl", hash = "sha256:dae3e882dc0e6f28e60cf09c1f13fedfd881db84f824dd418aa9e44def2fe00d", size = 13323742, upload-time = "2025-04-29T15:46:02.521Z" }, + { url = "https://files.pythonhosted.org/packages/ca/ab/928fb4551ce9c791de96b0681924d46de9a5b50931394fd19850383a08a1/google_api_python_client-2.170.0-py3-none-any.whl", hash = "sha256:7bf518a0527ad23322f070fa69f4f24053170d5c766821dc970ff0571ec22748", size = 13490660, upload-time = "2025-05-22T20:39:49.834Z" }, ] [[package]] name = "google-auth" -version = "2.40.1" +version = "2.40.2" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "cachetools", marker = "sys_platform == 'darwin' or sys_platform == 'linux' or sys_platform == 'win32'" }, { name = "pyasn1-modules", marker = "sys_platform == 'darwin' or sys_platform == 'linux' or sys_platform == 'win32'" }, { name = "rsa", marker = "sys_platform == 'darwin' or sys_platform == 'linux' or sys_platform == 'win32'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/94/a5/38c21d0e731bb716cffcf987bd9a3555cb95877ab4b616cfb96939933f20/google_auth-2.40.1.tar.gz", hash = "sha256:58f0e8416a9814c1d86c9b7f6acf6816b51aba167b2c76821965271bac275540", size = 280975, upload-time = "2025-05-07T01:04:55.3Z" } +sdist = { url = "https://files.pythonhosted.org/packages/66/84/f67f53c505a6b2c5da05c988e2a5483f5ba9eee4b1841d2e3ff22f547cd5/google_auth-2.40.2.tar.gz", hash = "sha256:a33cde547a2134273226fa4b853883559947ebe9207521f7afc707efbf690f58", size = 280990, upload-time = "2025-05-21T18:04:59.816Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/a1/b1/1272c6e80847ba5349f5ccb7574596393d1e222543f5003cb810865c3575/google_auth-2.40.1-py2.py3-none-any.whl", hash = "sha256:ed4cae4f5c46b41bae1d19c036e06f6c371926e97b19e816fc854eff811974ee", size = 216101, upload-time = "2025-05-07T01:04:53.612Z" }, + { url = "https://files.pythonhosted.org/packages/6a/c7/e2d82e6702e2a9e2311c138f8e1100f21d08aed0231290872b229ae57a86/google_auth-2.40.2-py2.py3-none-any.whl", hash = "sha256:f7e568d42eedfded58734f6a60c58321896a621f7c116c411550a4b4a13da90b", size = 216102, upload-time = "2025-05-21T18:04:57.547Z" }, ] [[package]] @@ -1568,14 +1554,14 @@ dependencies = [ { name = "shapely", marker = "sys_platform == 'darwin' or sys_platform == 'linux' or sys_platform == 'win32'" }, { name = "typing-extensions", marker = "sys_platform == 'darwin' or sys_platform == 'linux' or sys_platform == 'win32'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/e2/98/90b3ee5d18228189b34f5cf85aef775971bdf689ff72d1cbb109cab638d3/google_cloud_aiplatform-1.93.0.tar.gz", hash = "sha256:d9986916433668f07e5dca0b8101082ba58a7cedb6f58e91188b1f20dffa3dea", size = 9145814, upload_time = "2025-05-15T17:35:46.51Z" } +sdist = { url = "https://files.pythonhosted.org/packages/e2/98/90b3ee5d18228189b34f5cf85aef775971bdf689ff72d1cbb109cab638d3/google_cloud_aiplatform-1.93.0.tar.gz", hash = "sha256:d9986916433668f07e5dca0b8101082ba58a7cedb6f58e91188b1f20dffa3dea", size = 9145814, upload-time = "2025-05-15T17:35:46.51Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/66/a5/23a7a7df50041261638053237ecc32eae4987e4cf344258a873e69f9d350/google_cloud_aiplatform-1.93.0-py2.py3-none-any.whl", hash = "sha256:7fd4079b1de10db560ed9ab78ea33d6845e1f0b1b254f1c0029310a57daa63c3", size = 7634458, upload_time = "2025-05-15T17:35:43.072Z" }, + { url = "https://files.pythonhosted.org/packages/66/a5/23a7a7df50041261638053237ecc32eae4987e4cf344258a873e69f9d350/google_cloud_aiplatform-1.93.0-py2.py3-none-any.whl", hash = "sha256:7fd4079b1de10db560ed9ab78ea33d6845e1f0b1b254f1c0029310a57daa63c3", size = 7634458, upload-time = "2025-05-15T17:35:43.072Z" }, ] [[package]] name = "google-cloud-bigquery" -version = "3.32.0" +version = "3.33.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "google-api-core", extra = ["grpc"], marker = "sys_platform == 'darwin' or sys_platform == 'linux' or sys_platform == 'win32'" }, @@ -1586,9 +1572,9 @@ dependencies = [ { name = "python-dateutil", marker = "sys_platform == 'darwin' or sys_platform == 'linux' or sys_platform == 'win32'" }, { name = "requests", marker = "sys_platform == 'darwin' or sys_platform == 'linux' or sys_platform == 'win32'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/9f/cf/174ea37f0410f0702c3582c09bae45d6f43c6eabe2858ab5fb2a4319e15f/google_cloud_bigquery-3.32.0.tar.gz", hash = "sha256:f1c53d73a6d255c8cd0ca7a0c077d95224217427a4b7dcf9913ea0298a2961e8", size = 487055, upload-time = "2025-05-12T17:09:36.542Z" } +sdist = { url = "https://files.pythonhosted.org/packages/7a/f6/06c37501d4eeefa81ee7a8913cc2e8d404818cc611cb259edae740c75a68/google_cloud_bigquery-3.33.0.tar.gz", hash = "sha256:a5d306b277341bc308e6b9374c0f781d2382d81743764a4f28146c6dad60bbe2", size = 488885, upload-time = "2025-05-19T23:42:33.379Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/5e/c3/f3f6179f54e4b4ac2c6abaa8186054fd1d7d881676bb3caef9688e5fac3d/google_cloud_bigquery-3.32.0-py3-none-any.whl", hash = "sha256:ff38d21d70c4563d2473db288d2a9fe44f071d928bbad6d029ac9ba0b8a36b7a", size = 253121, upload-time = "2025-05-12T17:09:34.671Z" }, + { url = "https://files.pythonhosted.org/packages/e8/9e/7111b94311bbf8d7d4ff07a5bd962ad5b6a16bb52c7a15ae10c494a71b91/google_cloud_bigquery-3.33.0-py3-none-any.whl", hash = "sha256:7e98a3c383c3744e711fe85ce5507fda8c876d6d48b2f131e06bbd4aff87b064", size = 253481, upload-time = "2025-05-19T23:42:31.741Z" }, ] [[package]] @@ -1690,24 +1676,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/bc/31/30caa8d4ae987e47c5250fb6680588733863fd5b39cacb03ba1977c29bde/google_genai-1.16.1-py3-none-any.whl", hash = "sha256:6ae5d24282244f577ca4f0d95c09f75ab29e556602c9d3531b70161e34cd2a39", size = 196327, upload-time = "2025-05-20T01:05:24.831Z" }, ] -[[package]] -name = "google-genai" -version = "1.16.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "anyio", marker = "sys_platform == 'darwin' or sys_platform == 'linux' or sys_platform == 'win32'" }, - { name = "google-auth", marker = "sys_platform == 'darwin' or sys_platform == 'linux' or sys_platform == 'win32'" }, - { name = "httpx", marker = "sys_platform == 'darwin' or sys_platform == 'linux' or sys_platform == 'win32'" }, - { name = "pydantic", marker = "sys_platform == 'darwin' or sys_platform == 'linux' or sys_platform == 'win32'" }, - { name = "requests", marker = "sys_platform == 'darwin' or sys_platform == 'linux' or sys_platform == 'win32'" }, - { name = "typing-extensions", marker = "sys_platform == 'darwin' or sys_platform == 'linux' or sys_platform == 'win32'" }, - { name = "websockets", marker = "sys_platform == 'darwin' or sys_platform == 'linux' or sys_platform == 'win32'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/ca/1f/1a52736e87b4a22afef615de45e2f509fbfb55c09798620b0c3f394076ef/google_genai-1.16.1.tar.gz", hash = "sha256:4b4ed4ed781a9d61e5ce0fef1486dd3a5d7ff0a73bd76b9633d21e687ab998df", size = 194270, upload_time = "2025-05-20T01:05:26.717Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/bc/31/30caa8d4ae987e47c5250fb6680588733863fd5b39cacb03ba1977c29bde/google_genai-1.16.1-py3-none-any.whl", hash = "sha256:6ae5d24282244f577ca4f0d95c09f75ab29e556602c9d3531b70161e34cd2a39", size = 196327, upload_time = "2025-05-20T01:05:24.831Z" }, -] - [[package]] name = "google-generativeai" version = "0.8.5" @@ -1776,18 +1744,18 @@ name = "grpcio" version = "1.67.1" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "python_full_version < '3.11' and sys_platform == 'darwin'", - "python_full_version == '3.11.*' and sys_platform == 'darwin'", "python_full_version >= '4.0' and sys_platform == 'darwin'", "python_full_version == '3.12.*' and sys_platform == 'darwin'", - "python_full_version < '3.11' and sys_platform == 'linux'", - "python_full_version == '3.11.*' and sys_platform == 'linux'", + "python_full_version == '3.11.*' and sys_platform == 'darwin'", + "python_full_version < '3.11' and sys_platform == 'darwin'", "python_full_version >= '4.0' and sys_platform == 'linux'", "python_full_version == '3.12.*' and sys_platform == 'linux'", - "python_full_version < '3.11' and sys_platform == 'win32'", - "python_full_version == '3.11.*' and sys_platform == 'win32'", + "python_full_version == '3.11.*' and sys_platform == 'linux'", + "python_full_version < '3.11' and sys_platform == 'linux'", "python_full_version >= '4.0' and sys_platform == 'win32'", "python_full_version == '3.12.*' and sys_platform == 'win32'", + "python_full_version == '3.11.*' and sys_platform == 'win32'", + "python_full_version < '3.11' and sys_platform == 'win32'", ] sdist = { url = "https://files.pythonhosted.org/packages/20/53/d9282a66a5db45981499190b77790570617a604a38f3d103d0400974aeb5/grpcio-1.67.1.tar.gz", hash = "sha256:3dc2ed4cabea4dc14d5e708c2b426205956077cc5de419b4d4079315017e9732", size = 12580022, upload-time = "2024-10-29T06:30:07.787Z" } wheels = [ @@ -1984,77 +1952,92 @@ wheels = [ ] [[package]] -name = "hiredis" -version = "3.1.1" +name = "hf-xet" +version = "1.1.2" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/49/6f/a1b4749fa7d980f4d11e7f6da42658520fb9a92538844b2012427ad9aa06/hiredis-3.1.1.tar.gz", hash = "sha256:63f22cd7b441cbe13d24087b338e4e6a8f454f333cf35a6ed27ef13a60ca8b0b", size = 87898, upload-time = "2025-05-09T16:21:45.775Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/a9/ce/81e7eb40de108561a41f3262e64130c55c1aacd31f5fde90ab94606bec61/hiredis-3.1.1-cp310-cp310-macosx_10_15_universal2.whl", hash = "sha256:6154d5dea2f58542333ef5ffd6765bf36b223210168109a17167cc593dab9c69", size = 81264, upload-time = "2025-05-09T16:19:50.697Z" }, - { url = "https://files.pythonhosted.org/packages/ff/46/657739c935ec803b7d12c47c6b7df8cd7835f02ed43f407b31e255ccc0a8/hiredis-3.1.1-cp310-cp310-macosx_10_15_x86_64.whl", hash = "sha256:fe49dd39922075536f06aba35f346ad3517561f37e7fb18e247040f44e48c18e", size = 44612, upload-time = "2025-05-09T16:19:52.169Z" }, - { url = "https://files.pythonhosted.org/packages/0d/0b/ff550e597fbd25fe72e57d267776e10f374fb0eba4bcee05240aea5e79be/hiredis-3.1.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:03c6f4501d8559b838be0138e5e312dda17d0db2eebb5fbb741fdc9e73c21c4f", size = 42532, upload-time = "2025-05-09T16:19:53.337Z" }, - { url = "https://files.pythonhosted.org/packages/fa/8b/2eb7a8e1023789fbbe281e87baabc3b0b3af1685f83d72649ee6a862dd03/hiredis-3.1.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b865e5c6fba2eef0a60d9e49e70aa59f5809d762fe2a35aa48afe5a314bfa145", size = 167203, upload-time = "2025-05-09T16:19:54.195Z" }, - { url = "https://files.pythonhosted.org/packages/a3/e0/071a690753219068f465ecb9b2ccd536da312c33b5a0bee058a20267ff60/hiredis-3.1.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5fe7b283b8b1c38e97f8b810015c29af925f25e59fea02d903b2b17fb89c691f", size = 178138, upload-time = "2025-05-09T16:19:55.151Z" }, - { url = "https://files.pythonhosted.org/packages/f6/be/5e91374a5aa52147f337f3be4a9e99fe89dfe873527c49a871a6332be758/hiredis-3.1.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:85bcacc03fdf1435fcdd2610372435782580c3c0f4159633c1a4f4eadf3690c2", size = 167429, upload-time = "2025-05-09T16:19:56.884Z" }, - { url = "https://files.pythonhosted.org/packages/df/69/e5e0e3ef93df5c1d67d8c848379809d84ac28e4d09f7033d1c4c6e4d746e/hiredis-3.1.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:66a25a32a63374efac5242581e60364537777aba81714d5b49527b5a86be0169", size = 167569, upload-time = "2025-05-09T16:19:58.256Z" }, - { url = "https://files.pythonhosted.org/packages/d0/d5/92de178d900ba33adf7f7e7543d41914c3e43ad192f12eca110ac3497544/hiredis-3.1.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:20eeaadac0ad7b9390c4bd468954d79626be853c92e8df99158240f403817641", size = 163765, upload-time = "2025-05-09T16:19:59.161Z" }, - { url = "https://files.pythonhosted.org/packages/c1/ae/d1db87a45e010d4fab99f7cf5085fbbc1d03bbb04c2a990ee79a7b5dc1fd/hiredis-3.1.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:c02fae94b9a2b27bc6656217dd0df9ac6d5d8849e39ae8ceac2658fec1e0b6fe", size = 161479, upload-time = "2025-05-09T16:20:00.058Z" }, - { url = "https://files.pythonhosted.org/packages/cf/47/d672d0127a6cc5d7871b7984b3f19c11b34ef3d906d178ffa8d0fa54222a/hiredis-3.1.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:c70f18645749c339379b3c4e2be794b92e6011aae4ffcc462616e381d9031336", size = 160638, upload-time = "2025-05-09T16:20:01.135Z" }, - { url = "https://files.pythonhosted.org/packages/02/3c/ba5f59c2e082e4ca03ac78b5f290e99a3c648dde6d7d0b77a9a21e8370cb/hiredis-3.1.1-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:adf1cb0f7002aea80e3cbd5a76dceb4f419e52f6aba1b290ac924ca599960d42", size = 172526, upload-time = "2025-05-09T16:20:02.151Z" }, - { url = "https://files.pythonhosted.org/packages/ac/40/6c665f463e7991707d1ffb89980b2602b0658928428a0726eb5f5fbf73ab/hiredis-3.1.1-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:ed3fb25208535e6470b628f52dc7c4f3b2581d73cc2a162cc704dde26bbc89e5", size = 164705, upload-time = "2025-05-09T16:20:03.156Z" }, - { url = "https://files.pythonhosted.org/packages/59/05/0bf80b0103861b7499071f55d19f5fb06f52c961eeb5744cb68e7a52c1e0/hiredis-3.1.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:72320d24b9f22f0f086103a2dd33f4f1f1c4df70221c422507f67000d6329da8", size = 162608, upload-time = "2025-05-09T16:20:04.134Z" }, - { url = "https://files.pythonhosted.org/packages/f5/24/1cb537fdb83852a23a0d955ea234f25f1c001e39d8a625b4abb9a9c16620/hiredis-3.1.1-cp310-cp310-win32.whl", hash = "sha256:a5a6278f254d688099683672bec6ddf1bd3949e732780e8b118d43588152e452", size = 20059, upload-time = "2025-05-09T16:20:05.064Z" }, - { url = "https://files.pythonhosted.org/packages/dd/1d/e2bb5a5e2941a22e02bcb1c1397409a7be8b31aff76d8fc137e84857e3f6/hiredis-3.1.1-cp310-cp310-win_amd64.whl", hash = "sha256:3ee37cff4a3d35207e4c385a03be2adb9649df77eb9578afc4ab37825f1390c0", size = 21713, upload-time = "2025-05-09T16:20:05.896Z" }, - { url = "https://files.pythonhosted.org/packages/3b/89/ed8072ca29a52a01a6cf9c8d68141effc35a3a1d511dd6705f15a585fea0/hiredis-3.1.1-cp311-cp311-macosx_10_15_universal2.whl", hash = "sha256:80d98b1d21002c7045ef4c7bae9a41a7a5f6585d08c345850c32ec08d05bd8fe", size = 81254, upload-time = "2025-05-09T16:20:06.701Z" }, - { url = "https://files.pythonhosted.org/packages/64/90/65251dbbf742c6c8e19735f232d09e1f13fbd033e19d1397e1d46e8ac187/hiredis-3.1.1-cp311-cp311-macosx_10_15_x86_64.whl", hash = "sha256:9d943c754273fda5908b6c6f4c64c9dcdc4718bb96fa5c699e7fee687d713566", size = 44605, upload-time = "2025-05-09T16:20:09.072Z" }, - { url = "https://files.pythonhosted.org/packages/75/bd/28ecc23080e5b74d7bba977829bcd27eec3207809ee6b359594a4d33ab84/hiredis-3.1.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:6e0b02238141b685de2e8fcf361d79359a77ca9b440e566280e9dda875de03d1", size = 42535, upload-time = "2025-05-09T16:20:09.989Z" }, - { url = "https://files.pythonhosted.org/packages/bf/da/bed1270992cd1d1647de9e9cd4ee3902f4c21453de57ab5837e6183ca37f/hiredis-3.1.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2e2737844ca1c2477808f2612093c9fad68b42dd17fba1b348c95232cf895d84", size = 167838, upload-time = "2025-05-09T16:20:10.782Z" }, - { url = "https://files.pythonhosted.org/packages/3a/16/28ee85a8a5835259ae427eaf6427a00338651a695074e8a4af657165dc98/hiredis-3.1.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cf6c2ea105477a7ea837381255f884b60775a8f6b527d16416d0e2fc4dd107d6", size = 178703, upload-time = "2025-05-09T16:20:11.697Z" }, - { url = "https://files.pythonhosted.org/packages/e5/06/49292341ec3da3ffcd49a23a8fbca4f7a931c37ed00e1521136efcb3dd57/hiredis-3.1.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:32acf786b0e7117b1d8ffc8e5a1cfab57c73798658ed02228b5e9fa71fd4eaff", size = 168133, upload-time = "2025-05-09T16:20:12.723Z" }, - { url = "https://files.pythonhosted.org/packages/d7/ce/038d537b8c41caef11a9ee6815e4f1fcf59aab1f222ee48330eaa15d2b85/hiredis-3.1.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:98aeff9c038fd456e2e1a789abab775a1fcd1fd993170b1602f224e8fb8bc507", size = 168250, upload-time = "2025-05-09T16:20:13.699Z" }, - { url = "https://files.pythonhosted.org/packages/21/76/3a3da9911a9c98600c72095093629d4646cbcdb4ffc1f2519170a476c801/hiredis-3.1.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fb89a866e61c81ed2da3dc7eaee2b3e70d444aa350aa893321d637e77cda1790", size = 164082, upload-time = "2025-05-09T16:20:14.744Z" }, - { url = "https://files.pythonhosted.org/packages/ea/66/6043f47f5703152339b11d285ff621eb73d383861289df749d1b84563f0a/hiredis-3.1.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:ec1e10e02eaa8df9f43d6e4b3d201cfcc33d08d263f3f1ad59e8433bca4c25e8", size = 162011, upload-time = "2025-05-09T16:20:16.054Z" }, - { url = "https://files.pythonhosted.org/packages/1d/2d/84ffc08d64b1f5fb09502fe5b8e6557b864c669e330ab65e7f2dded1e741/hiredis-3.1.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:c32869095b412d401ad8358dbb4d8c50661a301237e55fa865c4de83d1a2b5f2", size = 161035, upload-time = "2025-05-09T16:20:17.035Z" }, - { url = "https://files.pythonhosted.org/packages/06/ff/636262e75da46b1e07ef0e5b27774572245bd20df97d3b409836ea40a3c4/hiredis-3.1.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:ef96546415a0ec22534ee5ce30ca5e0fefc1c1b9f69ded167748fa6b2da55a73", size = 172939, upload-time = "2025-05-09T16:20:17.962Z" }, - { url = "https://files.pythonhosted.org/packages/83/82/f157db3b867dff34d586948adfc48279ccc8011c2b2b49fb9a685c80da4e/hiredis-3.1.1-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:7bfbc714b3c48f62064e1ff031495c977d7554d9ff3d799bb3f8c40256af94bb", size = 165234, upload-time = "2025-05-09T16:20:18.902Z" }, - { url = "https://files.pythonhosted.org/packages/6a/5f/3ed30df0b6ac34b48ecbce8a7c633a05720b8d3b446d3ec518a947f8f60b/hiredis-3.1.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:f9bd0e4b5a0bd8c5c7137b2fb96eac1a36fca65ab822bfd7e7a712c5f7faf956", size = 163132, upload-time = "2025-05-09T16:20:19.929Z" }, - { url = "https://files.pythonhosted.org/packages/c1/71/d2e5ed355140178f61a84a102a6b4b30e80da355d86172fa1e14aa11d599/hiredis-3.1.1-cp311-cp311-win32.whl", hash = "sha256:de94a0fbdbf1436a94443be8ddf9357d3f6637a1a072a22442135eca634157cc", size = 20060, upload-time = "2025-05-09T16:20:20.91Z" }, - { url = "https://files.pythonhosted.org/packages/fe/9a/8ad1c43268fde062e717f5f16e7948c6fc31ae885a90061de79e77d01296/hiredis-3.1.1-cp311-cp311-win_amd64.whl", hash = "sha256:b60488f5ec1d9903b3b0ce744b76c570e82cb1b53d3045df74111a5d5bd2c134", size = 21721, upload-time = "2025-05-09T16:20:21.756Z" }, - { url = "https://files.pythonhosted.org/packages/22/22/b59206aa280f7cd8b6838393765da19648258c0f7d0a65513ea9ca83d373/hiredis-3.1.1-cp312-cp312-macosx_10_15_universal2.whl", hash = "sha256:b7c3e47b3eec883add6ff6d8dbcc314e7bacd73c5146e4587aa3610a1d59c1b0", size = 81402, upload-time = "2025-05-09T16:20:22.63Z" }, - { url = "https://files.pythonhosted.org/packages/4a/d2/9c889337dbd812a27725c84773db187f014482708aa21d1f4aac17afe805/hiredis-3.1.1-cp312-cp312-macosx_10_15_x86_64.whl", hash = "sha256:dba871b974ebd60258cf723a096a4170cc1241d9a32273513fc9da37410ff4a1", size = 44709, upload-time = "2025-05-09T16:20:23.452Z" }, - { url = "https://files.pythonhosted.org/packages/de/e3/66e4345a39fbc9efb81191ccba58debc18aae03fbec7048a59624284377b/hiredis-3.1.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2f444c482e817452ccb598140c6544c803480346f572e0b42fece391ed70ff26", size = 42606, upload-time = "2025-05-09T16:20:24.335Z" }, - { url = "https://files.pythonhosted.org/packages/dc/62/43f9b533bc1020814e0edab0b26ff473b63723a76fb4939c07f5693ba3a5/hiredis-3.1.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5c63a753a0ba0bb0bc92041682623cab843114a0cf87875cd9aca0ab0d833337", size = 170110, upload-time = "2025-05-09T16:20:25.189Z" }, - { url = "https://files.pythonhosted.org/packages/dd/6d/6d186f2c0faa486f2615c10f78d85969999118115564fe5efa7ba36c2cbe/hiredis-3.1.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:93f1981e0f54e74de525266a2dca3f9740ca2eed03227b4f86d1ae8ef887d37b", size = 181043, upload-time = "2025-05-09T16:20:26.157Z" }, - { url = "https://files.pythonhosted.org/packages/65/b0/75de93fe61a643638bbe8d8197d312a06e20ec64a92a2bcef1746e1deb68/hiredis-3.1.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e0e371c78b9e4715678ca17a59fc72c37483e53179c9a2d4babf85c383fc55c5", size = 170493, upload-time = "2025-05-09T16:20:27.169Z" }, - { url = "https://files.pythonhosted.org/packages/d9/bb/582df8cc41f0ab52c364eaf8ba0515a952c757d41d5f3e44d7b1bcc4eda4/hiredis-3.1.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d42cd753d4d85cf806037a01e4e6fa83c8db5b20b8d0cbfc2feec3daad2d563f", size = 171187, upload-time = "2025-05-09T16:20:28.164Z" }, - { url = "https://files.pythonhosted.org/packages/7a/46/46704ab52f3a334d5340d121f0692196059b31af27d1dde9279a79c897ba/hiredis-3.1.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:76b8f64de36c8607650c47951a1591996dcfe186ae158f88bac7e3976348cccc", size = 166707, upload-time = "2025-05-09T16:20:29.219Z" }, - { url = "https://files.pythonhosted.org/packages/1a/c2/50bbca04b21dd6bf208c429348230a0ef7d64091d3ee4ff2ad54fb204efe/hiredis-3.1.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:1a6f2e54bbad9e0831c5d88451676d7f116210f4f302055a84671ef69c5e935b", size = 164293, upload-time = "2025-05-09T16:20:30.317Z" }, - { url = "https://files.pythonhosted.org/packages/c1/07/157078368e4262c9029e8254f287ea851f95ec687dc78aed6d957b893af9/hiredis-3.1.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:8619f2a015dd8ba98214e76e7453bcdaaa8b04d81348369ad8975c1ff2792eb3", size = 163146, upload-time = "2025-05-09T16:20:31.772Z" }, - { url = "https://files.pythonhosted.org/packages/f6/1a/8bc58594b83fd4c94d8d531b061d8fc2af0a4659b5dd7bef5ad294f726d2/hiredis-3.1.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:1fd685aa1f9636da9548fa471abf37138033f1b4ec0d91f515ea5ed4d7d88b62", size = 175236, upload-time = "2025-05-09T16:20:32.742Z" }, - { url = "https://files.pythonhosted.org/packages/3a/b1/8f7fc62699b11adb453f91fc33bf738a8b73b38274bc392f24b9b2b1e2ff/hiredis-3.1.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:24b51d492b6628054eb4dce63eab0cadf483b87227fe6ee3b6de0038caed6544", size = 167789, upload-time = "2025-05-09T16:20:33.679Z" }, - { url = "https://files.pythonhosted.org/packages/f5/ab/35715b22dc1962bf6edf0dcde5fe62ca35221c81fe5b946a38e0da4d2f93/hiredis-3.1.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:0c7e43d3968000d75d97b2d24a6f1ee37d24b9a4472ba85f670e7d2d94c6b1f2", size = 165724, upload-time = "2025-05-09T16:20:34.624Z" }, - { url = "https://files.pythonhosted.org/packages/09/7f/345923dba3b9d6326accd20bddebe5a0a40abe28447581188a5da2c720eb/hiredis-3.1.1-cp312-cp312-win32.whl", hash = "sha256:b48578047c6bb3d0ea3ce37f0762e35e71d1f7cff8d940e2caa131359a12c5a7", size = 20191, upload-time = "2025-05-09T16:20:35.542Z" }, - { url = "https://files.pythonhosted.org/packages/92/f0/856832bf2558f35ea4db0d594176cf61b10dd6091d9029542362c29631d8/hiredis-3.1.1-cp312-cp312-win_amd64.whl", hash = "sha256:87b69e99301a33119cb31b19c6be7aed164c0df6b6343ba57b65deb23ae9251e", size = 21796, upload-time = "2025-05-09T16:20:36.294Z" }, - { url = "https://files.pythonhosted.org/packages/3e/93/7c9f61e8bd145f5933669c0d48ba8ed248b6ed2988beae039695378828b4/hiredis-3.1.1-cp313-cp313-macosx_10_15_universal2.whl", hash = "sha256:f22759efdb02f5e95884b1ad986574be86c7dd2ac4b05fe8e2b93826c6e680b3", size = 81404, upload-time = "2025-05-09T16:20:37.494Z" }, - { url = "https://files.pythonhosted.org/packages/29/76/8af1c24bd69d0c910281ddfeb603686220cdcb7e37d9df2eb39aaf31f5b0/hiredis-3.1.1-cp313-cp313-macosx_10_15_x86_64.whl", hash = "sha256:a9524a1f651e2d45eaf33865a0f412a0d1117f49661f09d8243a98c3d3f961a2", size = 44707, upload-time = "2025-05-09T16:20:38.445Z" }, - { url = "https://files.pythonhosted.org/packages/f6/a7/4d4dc0f420dafdd50bd7b22238da6ffd2e57de007b0f108da3c0936935c7/hiredis-3.1.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:0e6c9c6eb9929ca220002b28ce0976b1a90bb95ffcf08e6e2c51956d37a2318a", size = 42603, upload-time = "2025-05-09T16:20:39.329Z" }, - { url = "https://files.pythonhosted.org/packages/70/09/28b3a318e3e05060d814185855eacc0265ddfca8044c4ff7febe0f67e3ec/hiredis-3.1.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4614cc774bff82c2ed62f13facb732c03a8dc0c5e75cc276af61b5089c434898", size = 170379, upload-time = "2025-05-09T16:20:40.268Z" }, - { url = "https://files.pythonhosted.org/packages/47/a1/e85364f88b463cc4fd8c20c6f83977abeb8b7d0803f26b870231e9437e5c/hiredis-3.1.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:17e5ad9ed8d8913bdac6d567c9cf0c4f259e7950c3b318fe636ebb7383d3f16b", size = 181267, upload-time = "2025-05-09T16:20:41.305Z" }, - { url = "https://files.pythonhosted.org/packages/f7/cb/d7bd0a4387199aa206de2253ce1398547677c6a6895eee2e7e71625321c2/hiredis-3.1.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:340f3e9c33ae71e235a63770e339743254c91aba7b55d75a1ab6679e0d502aea", size = 170718, upload-time = "2025-05-09T16:20:42.334Z" }, - { url = "https://files.pythonhosted.org/packages/cd/48/00570c3e57767bb0935a862d22fd0300c5c491832648938dd7a1548bfc81/hiredis-3.1.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:56f2587e35a4f3f214d6f843e000af45422ebd81721a12add13108c1c4789332", size = 171387, upload-time = "2025-05-09T16:20:43.403Z" }, - { url = "https://files.pythonhosted.org/packages/46/e8/6993c834c783fd3d384943cea224e2c1e5cf37ab0895b0d89fa7f9acb339/hiredis-3.1.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dba00f102b4414a6b33f3aa0ab6192d78c515fc4939a14d9c87461262047883f", size = 166764, upload-time = "2025-05-09T16:20:44.448Z" }, - { url = "https://files.pythonhosted.org/packages/25/2a/e05816b03c151cb246c7ec9a35b840cdb3b27f89253224cfa7878633d79f/hiredis-3.1.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:4bf5711a5bdbc284c406c8e9dd9154b4d93a54ba758f417c8b8c01133997059c", size = 164521, upload-time = "2025-05-09T16:20:45.447Z" }, - { url = "https://files.pythonhosted.org/packages/cc/9a/1c7cab2e92b8be240cedc859f8b870a0eb28bc0b93e1bed5ef94e284bfa6/hiredis-3.1.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:434614076066704efae38a538a6e1dcea9678c3de030a6ec2fe72d475e2594de", size = 163467, upload-time = "2025-05-09T16:20:47.032Z" }, - { url = "https://files.pythonhosted.org/packages/d6/b4/b3654be50623bb8036058600b128596bd04e15b5566d5d1b16d90c09e1ee/hiredis-3.1.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:7db1567a8aef8594c81ad67ff597b8ac86aa1ead585b8e8b51d33e234b817d68", size = 175530, upload-time = "2025-05-09T16:20:48.005Z" }, - { url = "https://files.pythonhosted.org/packages/69/c6/196ea580a2deed300c392cf42e3dc94c0204b76f468ac462bbcefd9b259a/hiredis-3.1.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:64cd1f6b5cf2904e64445c3a5e765fcbf30c5a0f132051a3c8d4bd24fa2fa3fa", size = 168094, upload-time = "2025-05-09T16:20:49.049Z" }, - { url = "https://files.pythonhosted.org/packages/19/a0/d16e9ceab7fa83223b4513ab82dd6b5a3566d333ea69c88fc06e8227e1e1/hiredis-3.1.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:330246da5c5c33fd7cb25e87e17eabdb1f03678e652ea0c46861f4318fc56c29", size = 165983, upload-time = "2025-05-09T16:20:50.088Z" }, - { url = "https://files.pythonhosted.org/packages/f1/4b/16069d1eb3eb4991ac194d1a0822f41c1aff02e8c621bbc45dd696e57067/hiredis-3.1.1-cp313-cp313-win32.whl", hash = "sha256:a227a02b603583c84cb6791b48bc428339ebccd80befed8f00cac5584fc29ca4", size = 20193, upload-time = "2025-05-09T16:20:51.113Z" }, - { url = "https://files.pythonhosted.org/packages/76/3c/24fcad4f3db2eb99fa3aedf678f623784e536ce30fca42ccf2e5979f97e5/hiredis-3.1.1-cp313-cp313-win_amd64.whl", hash = "sha256:5fa133c6f0fb09bf5f7dd3d722934f2908d209be1adba5c64b5227c0e875e88c", size = 21804, upload-time = "2025-05-09T16:20:51.917Z" }, - { url = "https://files.pythonhosted.org/packages/f0/b0/62405b56facbb6a72bd010af391f3aa8efabf89bcea61e6ec19da5a9c09d/hiredis-3.1.1-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:c37f00064203ea8c17e06a51971511dda0ce826e5974ebe61cc6c7447cd16d30", size = 39792, upload-time = "2025-05-09T16:21:28.226Z" }, - { url = "https://files.pythonhosted.org/packages/4d/b4/f90de5d6f714b914027bb5b95d04e6c94b8d3fd75ae1bcad11a43b46a778/hiredis-3.1.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:e196647a34e82c5567b982184dff698a8655c9d2997ddd427a2ef542ef8b3864", size = 37213, upload-time = "2025-05-09T16:21:29.519Z" }, - { url = "https://files.pythonhosted.org/packages/28/cc/3e407e364040c1cc40b04aa231595348e26fd319df8e7576676b47568a40/hiredis-3.1.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c5851522b854a7ef9af1c0d5bda04ff1d97e5da28cd93eb332e051acce36d8e3", size = 47891, upload-time = "2025-05-09T16:21:30.815Z" }, - { url = "https://files.pythonhosted.org/packages/05/1d/94d29a3000b480a995e257e5aecf55151d82f7b4df897d6a0d2302ea0b50/hiredis-3.1.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4586570efa5c931a9dae47d0ea80968e058ad9a631364c474b316d0d62d54653", size = 48220, upload-time = "2025-05-09T16:21:31.761Z" }, - { url = "https://files.pythonhosted.org/packages/c4/09/fb9309b97339135a3727f678077e2001f125a5021bae07f3ecb75211a17d/hiredis-3.1.1-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:33c8b28c9949eb1849bc07e6b03591e43deb25cc244729fa2a53d9c6a9cdbdb0", size = 55589, upload-time = "2025-05-09T16:21:32.697Z" }, - { url = "https://files.pythonhosted.org/packages/28/b0/309f431c11b91c215985567b389b318dc73f8a42a8df9fe8519913afecbe/hiredis-3.1.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:dc0348c4f464020cc22f9733792d95fc4c09afecd1d3097eada500878133fa0e", size = 21806, upload-time = "2025-05-09T16:21:33.59Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/95/be/58f20728a5b445f8b064e74f0618897b3439f5ef90934da1916b9dfac76f/hf_xet-1.1.2.tar.gz", hash = "sha256:3712d6d4819d3976a1c18e36db9f503e296283f9363af818f50703506ed63da3", size = 467009, upload-time = "2025-05-16T20:44:34.944Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/45/ae/f1a63f75d9886f18a80220ba31a1c7b9c4752f03aae452f358f538c6a991/hf_xet-1.1.2-cp37-abi3-macosx_10_12_x86_64.whl", hash = "sha256:dfd1873fd648488c70735cb60f7728512bca0e459e61fcd107069143cd798469", size = 2642559, upload-time = "2025-05-16T20:44:30.217Z" }, + { url = "https://files.pythonhosted.org/packages/50/ab/d2c83ae18f1015d926defd5bfbe94c62d15e93f900e6a192e318ee947105/hf_xet-1.1.2-cp37-abi3-macosx_11_0_arm64.whl", hash = "sha256:29b584983b2d977c44157d9241dcf0fd50acde0b7bff8897fe4386912330090d", size = 2541360, upload-time = "2025-05-16T20:44:29.056Z" }, + { url = "https://files.pythonhosted.org/packages/9f/a7/693dc9f34f979e30a378125e2150a0b2d8d166e6d83ce3950eeb81e560aa/hf_xet-1.1.2-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6b29ac84298147fe9164cc55ad994ba47399f90b5d045b0b803b99cf5f06d8ec", size = 5183081, upload-time = "2025-05-16T20:44:27.505Z" }, + { url = "https://files.pythonhosted.org/packages/3d/23/c48607883f692a36c0a7735f47f98bad32dbe459a32d1568c0f21576985d/hf_xet-1.1.2-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:d921ba32615676e436a0d15e162331abc9ed43d440916b1d836dc27ce1546173", size = 5356100, upload-time = "2025-05-16T20:44:25.681Z" }, + { url = "https://files.pythonhosted.org/packages/eb/5b/b2316c7f1076da0582b52ea228f68bea95e243c388440d1dc80297c9d813/hf_xet-1.1.2-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:d9b03c34e13c44893ab6e8fea18ee8d2a6878c15328dd3aabedbdd83ee9f2ed3", size = 5647688, upload-time = "2025-05-16T20:44:31.867Z" }, + { url = "https://files.pythonhosted.org/packages/2c/98/e6995f0fa579929da7795c961f403f4ee84af36c625963f52741d56f242c/hf_xet-1.1.2-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:01b18608955b3d826307d37da8bd38b28a46cd2d9908b3a3655d1363274f941a", size = 5322627, upload-time = "2025-05-16T20:44:33.677Z" }, + { url = "https://files.pythonhosted.org/packages/59/40/8f1d5a44a64d8bf9e3c19576e789f716af54875b46daae65426714e75db1/hf_xet-1.1.2-cp37-abi3-win_amd64.whl", hash = "sha256:3562902c81299b09f3582ddfb324400c6a901a2f3bc854f83556495755f4954c", size = 2739542, upload-time = "2025-05-16T20:44:36.287Z" }, +] + +[[package]] +name = "hiredis" +version = "3.2.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f7/08/24b72f425b75e1de7442fb1740f69ca66d5820b9f9c0e2511ff9aadab3b7/hiredis-3.2.1.tar.gz", hash = "sha256:5a5f64479bf04dd829fe7029fad0ea043eac4023abc6e946668cbbec3493a78d", size = 89096, upload-time = "2025-05-23T11:41:57.227Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ce/12/e797b676d65b86d9ad56f434cb4548b1bd0ebf531cd2e36ef74c5cd46dcd/hiredis-3.2.1-cp310-cp310-macosx_10_15_universal2.whl", hash = "sha256:add17efcbae46c5a6a13b244ff0b4a8fa079602ceb62290095c941b42e9d5dec", size = 82441, upload-time = "2025-05-23T11:39:36.142Z" }, + { url = "https://files.pythonhosted.org/packages/d3/04/45783d5cf6e7430b1c67d64a7919ee45381e8b98d6d4578516579c5a4420/hiredis-3.2.1-cp310-cp310-macosx_10_15_x86_64.whl", hash = "sha256:5fe955cc4f66c57df1ae8e5caf4de2925d43b5efab4e40859662311d1bcc5f54", size = 45235, upload-time = "2025-05-23T11:39:37.49Z" }, + { url = "https://files.pythonhosted.org/packages/d5/97/7f50bad0b8213a3ee7780e295cd3d5e3db2839de2a6342b3c0ceeaf8e0af/hiredis-3.2.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:f9ad63cd9065820a43fb1efb8ed5ae85bb78f03ef5eb53f6bde47914708f5718", size = 43250, upload-time = "2025-05-23T11:39:38.518Z" }, + { url = "https://files.pythonhosted.org/packages/51/d0/38d4b5bf36bfd010fdfd460c53efc0aaef7c81d6c20f4041ca35e26a1e12/hiredis-3.2.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d8e7f9e5fdba08841d78d4e1450cae03a4dbed2eda8a4084673cafa5615ce24a", size = 168996, upload-time = "2025-05-23T11:39:39.563Z" }, + { url = "https://files.pythonhosted.org/packages/99/22/4e2e9fde2b2efcf9847a2442a21f404c4112c57cccd6a09e564524dd70f3/hiredis-3.2.1-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1dce2508eca5d4e47ef38bc7c0724cb45abcdb0089f95a2ef49baf52882979a8", size = 165508, upload-time = "2025-05-23T11:39:40.723Z" }, + { url = "https://files.pythonhosted.org/packages/98/d0/b05bc8d4f339abaa455a9e677fc5223e25cd97630e66a2da0ad25e67b131/hiredis-3.2.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:186428bf353e4819abae15aa2ad64c3f40499d596ede280fe328abb9e98e72ce", size = 180109, upload-time = "2025-05-23T11:39:41.865Z" }, + { url = "https://files.pythonhosted.org/packages/e3/ca/6df2cf488792ace30ee525a5444e12f432cc1da4acb47756ea5de265ea80/hiredis-3.2.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:74f2500d90a0494843aba7abcdc3e77f859c502e0892112d708c02e1dcae8f90", size = 169161, upload-time = "2025-05-23T11:39:43.432Z" }, + { url = "https://files.pythonhosted.org/packages/15/8b/afcef7a30bf5b94936264edb7daaf12a165f2b57007e384a57ac48411886/hiredis-3.2.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:32822a94d2fdd1da96c05b22fdeef6d145d8fdbd865ba2f273f45eb949e4a805", size = 169485, upload-time = "2025-05-23T11:39:45.008Z" }, + { url = "https://files.pythonhosted.org/packages/43/14/3443dee27bd20f2ac88a759b67b29e7f3756a9a38bbe8084de049dfc5cac/hiredis-3.2.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:ead809fb08dd4fdb5b4b6e2999c834e78c3b0c450a07c3ed88983964432d0c64", size = 163644, upload-time = "2025-05-23T11:39:46.755Z" }, + { url = "https://files.pythonhosted.org/packages/3f/24/8a3cee0f08071af0a9632ca81a057fe2b638e7b6956c9b5704a2049c1305/hiredis-3.2.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:b90fada20301c3a257e868dd6a4694febc089b2b6d893fa96a3fc6c1f9ab4340", size = 162180, upload-time = "2025-05-23T11:39:47.939Z" }, + { url = "https://files.pythonhosted.org/packages/bd/2c/34cb6e665535dce1cbb7077cb9cc608198f254050241b5e232d62393f6a7/hiredis-3.2.1-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:6d8bff53f526da3d9db86c8668011e4f7ca2958ee3a46c648edab6fe2cd1e709", size = 174369, upload-time = "2025-05-23T11:39:49.13Z" }, + { url = "https://files.pythonhosted.org/packages/f8/24/96702f71991d884412d7ac89577ad9caa28875e2e309f53751b8c5f969be/hiredis-3.2.1-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:043d929ae262d03e1db0f08616e14504a9119c1ff3de13d66f857d85cd45caff", size = 166511, upload-time = "2025-05-23T11:39:50.232Z" }, + { url = "https://files.pythonhosted.org/packages/de/d0/8d3753244bdea37ab1700db8eec220df8361d0e3f72b9b5314ce4a0471ac/hiredis-3.2.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:8d470fef39d02dbe5c541ec345cc4ffd7d2baec7d6e59c92bd9d9545dc221829", size = 164329, upload-time = "2025-05-23T11:39:51.365Z" }, + { url = "https://files.pythonhosted.org/packages/44/2e/28b5fffd2872e51182aec94992ff34641b6aab00c135e21da1d2f6c8c99b/hiredis-3.2.1-cp310-cp310-win32.whl", hash = "sha256:efa4c76c45cc8c42228c7989b279fa974580e053b5e6a4a834098b5324b9eafa", size = 20401, upload-time = "2025-05-23T11:39:52.4Z" }, + { url = "https://files.pythonhosted.org/packages/62/14/cbad8202ca7996686d51a779a552fb9d16a59c4fe60b68b076907a8a44f0/hiredis-3.2.1-cp310-cp310-win_amd64.whl", hash = "sha256:cbac5ec3a620b095c46ef3a8f1f06da9c86c1cdc411d44a5f538876c39a2b321", size = 22076, upload-time = "2025-05-23T11:39:53.229Z" }, + { url = "https://files.pythonhosted.org/packages/48/84/2ea9636f2ba0811d9eb3bebbbfa84f488238180ddab70c9cb7fa13419d78/hiredis-3.2.1-cp311-cp311-macosx_10_15_universal2.whl", hash = "sha256:e4ae0be44cab5e74e6e4c4a93d04784629a45e781ff483b136cc9e1b9c23975c", size = 82425, upload-time = "2025-05-23T11:39:54.135Z" }, + { url = "https://files.pythonhosted.org/packages/fc/24/b9ebf766a99998fda3975937afa4912e98de9d7f8d0b83f48096bdd961c1/hiredis-3.2.1-cp311-cp311-macosx_10_15_x86_64.whl", hash = "sha256:24647e84c9f552934eb60b7f3d2116f8b64a7020361da9369e558935ca45914d", size = 45231, upload-time = "2025-05-23T11:39:55.455Z" }, + { url = "https://files.pythonhosted.org/packages/68/4c/c009b4d9abeb964d607f0987561892d1589907f770b9e5617552b34a4a4d/hiredis-3.2.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:6fb3e92d1172da8decc5f836bf8b528c0fc9b6d449f1353e79ceeb9dc1801132", size = 43240, upload-time = "2025-05-23T11:39:57.8Z" }, + { url = "https://files.pythonhosted.org/packages/e9/83/d53f3ae9e4ac51b8a35afb7ccd68db871396ed1d7c8ba02ce2c30de0cf17/hiredis-3.2.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:38ba7a32e51e518b6b3e470142e52ed2674558e04d7d73d86eb19ebcb37d7d40", size = 169624, upload-time = "2025-05-23T11:40:00.055Z" }, + { url = "https://files.pythonhosted.org/packages/91/2f/f9f091526e22a45385d45f3870204dc78aee365b6fe32e679e65674da6a7/hiredis-3.2.1-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4fc632be73174891d6bb71480247e57b2fd8f572059f0a1153e4d0339e919779", size = 165799, upload-time = "2025-05-23T11:40:01.194Z" }, + { url = "https://files.pythonhosted.org/packages/1c/cc/e561274438cdb19794f0638136a5a99a9ca19affcb42679b12a78016b8ad/hiredis-3.2.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f03e6839ff21379ad3c195e0700fc9c209e7f344946dea0f8a6d7b5137a2a141", size = 180612, upload-time = "2025-05-23T11:40:02.385Z" }, + { url = "https://files.pythonhosted.org/packages/83/ba/a8a989f465191d55672e57aea2a331bfa3a74b5cbc6f590031c9e11f7491/hiredis-3.2.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:99983873e37c71bb71deb544670ff4f9d6920dab272aaf52365606d87a4d6c73", size = 169934, upload-time = "2025-05-23T11:40:03.524Z" }, + { url = "https://files.pythonhosted.org/packages/52/5f/1148e965df1c67b17bdcaef199f54aec3def0955d19660a39c6ee10a6f55/hiredis-3.2.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ffd982c419f48e3a57f592678c72474429465bb4bfc96472ec805f5d836523f0", size = 170074, upload-time = "2025-05-23T11:40:04.618Z" }, + { url = "https://files.pythonhosted.org/packages/43/5e/e6846ad159a938b539fb8d472e2e68cb6758d7c9454ea0520211f335ea72/hiredis-3.2.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:bc993f4aa4abc029347f309e722f122e05a3b8a0c279ae612849b5cc9dc69f2d", size = 164158, upload-time = "2025-05-23T11:40:05.653Z" }, + { url = "https://files.pythonhosted.org/packages/0a/a1/5891e0615f0993f194c1b51a65aaac063b0db318a70df001b28e49f0579d/hiredis-3.2.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:dde790d420081f18b5949227649ccb3ed991459df33279419a25fcae7f97cd92", size = 162591, upload-time = "2025-05-23T11:40:07.041Z" }, + { url = "https://files.pythonhosted.org/packages/d4/da/8bce52ca81716f53c1014f689aea4c170ba6411e6848f81a1bed1fc375eb/hiredis-3.2.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:b0c8cae7edbef860afcf3177b705aef43e10b5628f14d5baf0ec69668247d08d", size = 174808, upload-time = "2025-05-23T11:40:09.146Z" }, + { url = "https://files.pythonhosted.org/packages/84/91/fc1ef444ed4dc432b5da9b48e9bd23266c703528db7be19e2b608d67ba06/hiredis-3.2.1-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:e8a90eaca7e1ce7f175584f07a2cdbbcab13f4863f9f355d7895c4d28805f65b", size = 167060, upload-time = "2025-05-23T11:40:10.757Z" }, + { url = "https://files.pythonhosted.org/packages/66/ad/beebf73a5455f232b97e00564d1e8ad095d4c6e18858c60c6cfdd893ac1e/hiredis-3.2.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:476031958fa44e245e803827e0787d49740daa4de708fe514370293ce519893a", size = 164833, upload-time = "2025-05-23T11:40:12.001Z" }, + { url = "https://files.pythonhosted.org/packages/75/79/a9591bdc0148c0fbdf54cf6f3d449932d3b3b8779e87f33fa100a5a8088f/hiredis-3.2.1-cp311-cp311-win32.whl", hash = "sha256:eb3f5df2a9593b4b4b676dce3cea53b9c6969fc372875188589ddf2bafc7f624", size = 20402, upload-time = "2025-05-23T11:40:13.216Z" }, + { url = "https://files.pythonhosted.org/packages/9f/05/c93cc6fab31e3c01b671126c82f44372fb211facb8bd4571fd372f50898d/hiredis-3.2.1-cp311-cp311-win_amd64.whl", hash = "sha256:1402e763d8a9fdfcc103bbf8b2913971c0a3f7b8a73deacbda3dfe5f3a9d1e0b", size = 22085, upload-time = "2025-05-23T11:40:14.19Z" }, + { url = "https://files.pythonhosted.org/packages/60/a1/6da1578a22df1926497f7a3f6a3d2408fe1d1559f762c1640af5762a8eb6/hiredis-3.2.1-cp312-cp312-macosx_10_15_universal2.whl", hash = "sha256:3742d8b17e73c198cabeab11da35f2e2a81999d406f52c6275234592256bf8e8", size = 82627, upload-time = "2025-05-23T11:40:15.362Z" }, + { url = "https://files.pythonhosted.org/packages/6c/b1/1056558ca8dc330be5bb25162fe5f268fee71571c9a535153df9f871a073/hiredis-3.2.1-cp312-cp312-macosx_10_15_x86_64.whl", hash = "sha256:9c2f3176fb617a79f6cccf22cb7d2715e590acb534af6a82b41f8196ad59375d", size = 45404, upload-time = "2025-05-23T11:40:16.72Z" }, + { url = "https://files.pythonhosted.org/packages/58/4f/13d1fa1a6b02a99e9fed8f546396f2d598c3613c98e6c399a3284fa65361/hiredis-3.2.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:a8bd46189c7fa46174e02670dc44dfecb60f5bd4b67ed88cb050d8f1fd842f09", size = 43299, upload-time = "2025-05-23T11:40:17.697Z" }, + { url = "https://files.pythonhosted.org/packages/c0/25/ddfac123ba5a32eb1f0b40ba1b2ec98a599287f7439def8856c3c7e5dd0d/hiredis-3.2.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f86ee4488c8575b58139cdfdddeae17f91e9a893ffee20260822add443592e2f", size = 172194, upload-time = "2025-05-23T11:40:19.143Z" }, + { url = "https://files.pythonhosted.org/packages/2c/1e/443a3703ce570b631ca43494094fbaeb051578a0ebe4bfcefde351e1ba25/hiredis-3.2.1-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3717832f4a557b2fe7060b9d4a7900e5de287a15595e398c3f04df69019ca69d", size = 168429, upload-time = "2025-05-23T11:40:20.329Z" }, + { url = "https://files.pythonhosted.org/packages/3b/d6/0d8c6c706ed79b2298c001b5458c055615e3166533dcee3900e821a18a3e/hiredis-3.2.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e5cb12c21fb9e2403d28c4e6a38120164973342d34d08120f2d7009b66785644", size = 182967, upload-time = "2025-05-23T11:40:21.921Z" }, + { url = "https://files.pythonhosted.org/packages/da/68/da8dd231fbce858b5a20ab7d7bf558912cd125f08bac4c778865ef5fe2c2/hiredis-3.2.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:080fda1510bbd389af91f919c11a4f2aa4d92f0684afa4709236faa084a42cac", size = 172495, upload-time = "2025-05-23T11:40:23.105Z" }, + { url = "https://files.pythonhosted.org/packages/65/25/83a31420535e2778662caa95533d5c997011fa6a88331f0cdb22afea9ec3/hiredis-3.2.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1252e10a1f3273d1c6bf2021e461652c2e11b05b83e0915d6eb540ec7539afe2", size = 173142, upload-time = "2025-05-23T11:40:24.24Z" }, + { url = "https://files.pythonhosted.org/packages/41/d7/cb907348889eb75e2aa2e6b63e065b611459e0f21fe1e371a968e13f0d55/hiredis-3.2.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:d9e320e99ab7d2a30dc91ff6f745ba38d39b23f43d345cdee9881329d7b511d6", size = 166433, upload-time = "2025-05-23T11:40:25.287Z" }, + { url = "https://files.pythonhosted.org/packages/01/5d/7cbc69d82af7b29a95723d50f5261555ba3d024bfbdc414bdc3d23c0defb/hiredis-3.2.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:641668f385f16550fdd6fdc109b0af6988b94ba2acc06770a5e06a16e88f320c", size = 164883, upload-time = "2025-05-23T11:40:26.454Z" }, + { url = "https://files.pythonhosted.org/packages/f9/00/f995b1296b1d7e0247651347aa230f3225a9800e504fdf553cf7cd001cf7/hiredis-3.2.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:1e1f44208c39d6c345ff451f82f21e9eeda6fe9af4ac65972cc3eeb58d41f7cb", size = 177262, upload-time = "2025-05-23T11:40:27.576Z" }, + { url = "https://files.pythonhosted.org/packages/c5/f3/723a67d729e94764ce9e0d73fa5f72a0f87d3ce3c98c9a0b27cbf001cc79/hiredis-3.2.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:f882a0d6415fffe1ffcb09e6281d0ba8b1ece470e866612bbb24425bf76cf397", size = 169619, upload-time = "2025-05-23T11:40:29.671Z" }, + { url = "https://files.pythonhosted.org/packages/45/58/f69028df00fb1b223e221403f3be2059ae86031e7885f955d26236bdfc17/hiredis-3.2.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:b4e78719a0730ebffe335528531d154bc8867a246418f74ecd88adbc4d938c49", size = 167303, upload-time = "2025-05-23T11:40:30.902Z" }, + { url = "https://files.pythonhosted.org/packages/2b/7d/567411e65cce76cf265a9a4f837fd2ebc564bef6368dd42ac03f7a517c0a/hiredis-3.2.1-cp312-cp312-win32.whl", hash = "sha256:33c4604d9f79a13b84da79950a8255433fca7edaf292bbd3364fd620864ed7b2", size = 20551, upload-time = "2025-05-23T11:40:32.69Z" }, + { url = "https://files.pythonhosted.org/packages/90/74/b4c291eb4a4a874b3690ff9fc311a65d5292072556421b11b1d786e3e1d0/hiredis-3.2.1-cp312-cp312-win_amd64.whl", hash = "sha256:7b9749375bf9d171aab8813694f379f2cff0330d7424000f5e92890ad4932dc9", size = 22128, upload-time = "2025-05-23T11:40:33.686Z" }, + { url = "https://files.pythonhosted.org/packages/47/91/c07e737288e891c974277b9fa090f0a43c72ab6ccb5182117588f1c01269/hiredis-3.2.1-cp313-cp313-macosx_10_15_universal2.whl", hash = "sha256:7cabf7f1f06be221e1cbed1f34f00891a7bdfad05b23e4d315007dd42148f3d4", size = 82636, upload-time = "2025-05-23T11:40:35.035Z" }, + { url = "https://files.pythonhosted.org/packages/92/20/02cb1820360eda419bc17eb835eca976079e2b3e48aecc5de0666b79a54c/hiredis-3.2.1-cp313-cp313-macosx_10_15_x86_64.whl", hash = "sha256:db85cb86f8114c314d0ec6d8de25b060a2590b4713135240d568da4f7dea97ac", size = 45404, upload-time = "2025-05-23T11:40:36.113Z" }, + { url = "https://files.pythonhosted.org/packages/87/51/d30a4aadab8670ed9d40df4982bc06c891ee1da5cdd88d16a74e1ecbd520/hiredis-3.2.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:c9a592a49b7b8497e4e62c3ff40700d0c7f1a42d145b71e3e23c385df573c964", size = 43301, upload-time = "2025-05-23T11:40:37.557Z" }, + { url = "https://files.pythonhosted.org/packages/f7/7b/2c613e1bb5c2e2bac36e8befeefdd58b42816befb17e26ab600adfe337fb/hiredis-3.2.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0079ef1e03930b364556b78548e67236ab3def4e07e674f6adfc52944aa972dd", size = 172486, upload-time = "2025-05-23T11:40:38.659Z" }, + { url = "https://files.pythonhosted.org/packages/1e/df/8f2c4fcc28d6f5178b25ee1ba2157cc473f9908c16ce4b8e0bdd79e38b05/hiredis-3.2.1-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1d6a290ed45d9c14f4c50b6bda07afb60f270c69b5cb626fd23a4c2fde9e3da1", size = 168532, upload-time = "2025-05-23T11:40:39.843Z" }, + { url = "https://files.pythonhosted.org/packages/88/ae/d0864ffaa0461e29a6940a11c858daf78c99476c06ed531b41ad2255ec25/hiredis-3.2.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:79dd5fe8c0892769f82949adeb021342ca46871af26e26945eb55d044fcdf0d0", size = 183216, upload-time = "2025-05-23T11:40:41.005Z" }, + { url = "https://files.pythonhosted.org/packages/75/17/558e831b77692d73f5bcf8b493ab3eace9f11b0aa08839cdbb87995152c7/hiredis-3.2.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:998a82281a159f4aebbfd4fb45cfe24eb111145206df2951d95bc75327983b58", size = 172689, upload-time = "2025-05-23T11:40:42.153Z" }, + { url = "https://files.pythonhosted.org/packages/35/b9/4fccda21f930f08c5072ad51e825d85d457748138443d7b510afe77b8264/hiredis-3.2.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:41fc3cd52368ffe7c8e489fb83af5e99f86008ed7f9d9ba33b35fec54f215c0a", size = 173319, upload-time = "2025-05-23T11:40:43.328Z" }, + { url = "https://files.pythonhosted.org/packages/3d/8b/596d613588b0a3c58dfcf9a17edc6a886c4de6a3096e27c7142a94e2304d/hiredis-3.2.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:8d10df3575ce09b0fa54b8582f57039dcbdafde5de698923a33f601d2e2a246c", size = 166695, upload-time = "2025-05-23T11:40:44.453Z" }, + { url = "https://files.pythonhosted.org/packages/e7/5b/6a1c266e9f6627a8be1fa0d8622e35e35c76ae40cce6d1c78a7e6021184a/hiredis-3.2.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:1ab010d04be33735ad8e643a40af0d68a21d70a57b1d0bff9b6a66b28cca9dbf", size = 165181, upload-time = "2025-05-23T11:40:45.697Z" }, + { url = "https://files.pythonhosted.org/packages/6c/70/a9b91fa70d21763d9dfd1c27ddd378f130749a0ae4a0645552f754b3d1fc/hiredis-3.2.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:ec3b5f9ea34f70aaba3e061cbe1fa3556fea401d41f5af321b13e326792f3017", size = 177589, upload-time = "2025-05-23T11:40:46.903Z" }, + { url = "https://files.pythonhosted.org/packages/1a/c7/31bbb015156dc4441f6e19daa9598266a61445bf3f6e14c44292764638f6/hiredis-3.2.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:158dfb505fff6bffd17f823a56effc0c2a7a8bc4fb659d79a52782f22eefc697", size = 169883, upload-time = "2025-05-23T11:40:48.111Z" }, + { url = "https://files.pythonhosted.org/packages/89/44/cddc23379e0ce20ad7514b2adb2aa2c9b470ffb1ca0a2d8c020748962a22/hiredis-3.2.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:9d632cd0ddd7895081be76748e6fb9286f81d2a51c371b516541c6324f2fdac9", size = 167585, upload-time = "2025-05-23T11:40:49.208Z" }, + { url = "https://files.pythonhosted.org/packages/48/92/8fc9b981ed01fc2bbac463a203455cd493482b749801bb555ebac72923f1/hiredis-3.2.1-cp313-cp313-win32.whl", hash = "sha256:e9726d03e7df068bf755f6d1ecc61f7fc35c6b20363c7b1b96f39a14083df940", size = 20554, upload-time = "2025-05-23T11:40:50.314Z" }, + { url = "https://files.pythonhosted.org/packages/e1/6e/e76341d68aa717a705a2ee3be6da9f4122a0d1e3f3ad93a7104ed7a81bea/hiredis-3.2.1-cp313-cp313-win_amd64.whl", hash = "sha256:b5b1653ad7263a001f2e907e81a957d6087625f9700fa404f1a2268c0a4f9059", size = 22136, upload-time = "2025-05-23T11:40:51.497Z" }, + { url = "https://files.pythonhosted.org/packages/ed/f9/04a0a6c760d28e0b7d536646edacd6f5b4c979dd4c848621287bff5be9d0/hiredis-3.2.1-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:73913d2fa379e722d17ba52f21ce12dd578140941a08efd73e73b6fab1dea4d8", size = 40382, upload-time = "2025-05-23T11:41:34.425Z" }, + { url = "https://files.pythonhosted.org/packages/cd/1c/50fbce19cc5e393cf97a187462377d1c9441337684b3da1ed13ed0f20873/hiredis-3.2.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:15a3dff3eca31ecbf3d7d6d104cf1b318dc2b013bad3f4bdb2839cb9ea2e1584", size = 37760, upload-time = "2025-05-23T11:41:35.432Z" }, + { url = "https://files.pythonhosted.org/packages/5c/e6/d147636edf44e5267f9e4c3483cd8d6b027fd6cf008a003c932f5ff888f7/hiredis-3.2.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c78258032c2f9fc6f39fee7b07882ce26de281e09178266ce535992572132d95", size = 48738, upload-time = "2025-05-23T11:41:36.452Z" }, + { url = "https://files.pythonhosted.org/packages/97/b0/53c33900139149a9b85878c04748984987b62ee2583d452b4e4d578067a9/hiredis-3.2.1-pp310-pypy310_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:578d6a881e64e46db065256355594e680202c3bacf3270be3140057171d2c23e", size = 56254, upload-time = "2025-05-23T11:41:38.395Z" }, + { url = "https://files.pythonhosted.org/packages/9d/af/b49debecac06674a9ccb51353f497300199d6122a7612f56930872076147/hiredis-3.2.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8b7f34b170093c077c972b8cc0ceb15d8ff88ad0079751a8ae9733e94d77e733", size = 48905, upload-time = "2025-05-23T11:41:39.92Z" }, + { url = "https://files.pythonhosted.org/packages/c6/a2/5aacf68320bfaf531afac73f62f4fc55140742a4725bf04929671ca5d1cc/hiredis-3.2.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:291a18b228fc90f6720d178de2fac46522082c96330b4cc2d3dd8cb2c1cb2815", size = 22184, upload-time = "2025-05-23T11:41:41.196Z" }, ] [[package]] @@ -2158,20 +2141,21 @@ wheels = [ [[package]] name = "huggingface-hub" -version = "0.31.2" +version = "0.32.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "filelock", marker = "sys_platform == 'darwin' or sys_platform == 'linux' or sys_platform == 'win32'" }, { name = "fsspec", marker = "sys_platform == 'darwin' or sys_platform == 'linux' or sys_platform == 'win32'" }, + { name = "hf-xet", marker = "(platform_machine == 'aarch64' and sys_platform == 'darwin') or (platform_machine == 'amd64' and sys_platform == 'darwin') or (platform_machine == 'arm64' and sys_platform == 'darwin') or (platform_machine == 'x86_64' and sys_platform == 'darwin') or (platform_machine == 'aarch64' and sys_platform == 'linux') or (platform_machine == 'amd64' and sys_platform == 'linux') or (platform_machine == 'arm64' and sys_platform == 'linux') or (platform_machine == 'x86_64' and sys_platform == 'linux') or (platform_machine == 'aarch64' and sys_platform == 'win32') or (platform_machine == 'amd64' and sys_platform == 'win32') or (platform_machine == 'arm64' and sys_platform == 'win32') or (platform_machine == 'x86_64' and sys_platform == 'win32')" }, { name = "packaging", marker = "sys_platform == 'darwin' or sys_platform == 'linux' or sys_platform == 'win32'" }, { name = "pyyaml", marker = "sys_platform == 'darwin' or sys_platform == 'linux' or sys_platform == 'win32'" }, { name = "requests", marker = "sys_platform == 'darwin' or sys_platform == 'linux' or sys_platform == 'win32'" }, { name = "tqdm", marker = "sys_platform == 'darwin' or sys_platform == 'linux' or sys_platform == 'win32'" }, { name = "typing-extensions", marker = "sys_platform == 'darwin' or sys_platform == 'linux' or sys_platform == 'win32'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/3b/7b/09ab792c463975fcd0a81f459b5e900057dabbbc274ff253bb28d58ebfce/huggingface_hub-0.31.2.tar.gz", hash = "sha256:7053561376ed7f6ffdaecf09cc54d70dc784ac6315fa4bb9b93e19662b029675", size = 403025, upload-time = "2025-05-13T09:45:43.617Z" } +sdist = { url = "https://files.pythonhosted.org/packages/f4/ca/8ee27c56ab650d9d3ea095f0ba12ceb202bc8ba7362429dc76c25438df2f/huggingface_hub-0.32.0.tar.gz", hash = "sha256:dd66c9365ea43049ec9b939bdcdb21a0051e1bd70026fc50304e4fb1bb6a15ba", size = 422255, upload-time = "2025-05-23T12:12:13.885Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/83/81/a8fd9c226f7e3bc8918f1e456131717cb38e93f18ccc109bf3c8471e464f/huggingface_hub-0.31.2-py3-none-any.whl", hash = "sha256:8138cd52aa2326b4429bb00a4a1ba8538346b7b8a808cdce30acb6f1f1bdaeec", size = 484230, upload-time = "2025-05-13T09:45:41.977Z" }, + { url = "https://files.pythonhosted.org/packages/3a/60/90aae898b0a9f3cd65f50718c33b1f1dbfb1527d10db754e99e14e2b0a1d/huggingface_hub-0.32.0-py3-none-any.whl", hash = "sha256:e56e94109649ce6ebdb59b4e393ee3543ec0eca2eab4f41b269e1d885c88d08c", size = 509297, upload-time = "2025-05-23T12:12:11.871Z" }, ] [[package]] @@ -2197,11 +2181,11 @@ wheels = [ [[package]] name = "identify" -version = "2.6.10" +version = "2.6.12" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/0c/83/b6ea0334e2e7327084a46aaaf71f2146fc061a192d6518c0d020120cd0aa/identify-2.6.10.tar.gz", hash = "sha256:45e92fd704f3da71cc3880036633f48b4b7265fd4de2b57627cb157216eb7eb8", size = 99201, upload-time = "2025-04-19T15:10:38.32Z" } +sdist = { url = "https://files.pythonhosted.org/packages/a2/88/d193a27416618628a5eea64e3223acd800b40749a96ffb322a9b55a49ed1/identify-2.6.12.tar.gz", hash = "sha256:d8de45749f1efb108badef65ee8386f0f7bb19a7f26185f74de6367bffbaf0e6", size = 99254, upload-time = "2025-05-23T20:37:53.3Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/2b/d3/85feeba1d097b81a44bcffa6a0beab7b4dfffe78e82fc54978d3ac380736/identify-2.6.10-py2.py3-none-any.whl", hash = "sha256:5f34248f54136beed1a7ba6a6b5c4b6cf21ff495aac7c359e1ef831ae3b8ab25", size = 99101, upload-time = "2025-04-19T15:10:36.701Z" }, + { url = "https://files.pythonhosted.org/packages/7a/cd/18f8da995b658420625f7ef13f037be53ae04ec5ad33f9b718240dcfd48c/identify-2.6.12-py2.py3-none-any.whl", hash = "sha256:ad9672d5a72e0d2ff7c5c8809b62dfa60458626352fb0eb7b55e69bdc45334a2", size = 99145, upload-time = "2025-05-23T20:37:51.495Z" }, ] [[package]] @@ -2260,7 +2244,8 @@ dependencies = [ { name = "appnope", marker = "sys_platform == 'darwin'" }, { name = "comm", marker = "sys_platform == 'darwin' or sys_platform == 'linux' or sys_platform == 'win32'" }, { name = "debugpy", marker = "sys_platform == 'darwin' or sys_platform == 'linux' or sys_platform == 'win32'" }, - { name = "ipython", marker = "sys_platform == 'darwin' or sys_platform == 'linux' or sys_platform == 'win32'" }, + { name = "ipython", version = "8.36.0", source = { registry = "https://pypi.org/simple" }, marker = "(python_full_version < '3.11' and sys_platform == 'darwin') or (python_full_version < '3.11' and sys_platform == 'linux') or (python_full_version < '3.11' and sys_platform == 'win32')" }, + { name = "ipython", version = "9.2.0", source = { registry = "https://pypi.org/simple" }, marker = "(python_full_version >= '3.11' and sys_platform == 'darwin') or (python_full_version >= '3.11' and sys_platform == 'linux') or (python_full_version >= '3.11' and sys_platform == 'win32')" }, { name = "jupyter-client", marker = "sys_platform == 'darwin' or sys_platform == 'linux' or sys_platform == 'win32'" }, { name = "jupyter-core", marker = "sys_platform == 'darwin' or sys_platform == 'linux' or sys_platform == 'win32'" }, { name = "matplotlib-inline", marker = "sys_platform == 'darwin' or sys_platform == 'linux' or sys_platform == 'win32'" }, @@ -2280,24 +2265,77 @@ wheels = [ name = "ipython" version = "8.36.0" source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version < '3.11' and sys_platform == 'darwin'", + "python_full_version < '3.11' and sys_platform == 'linux'", + "python_full_version < '3.11' and sys_platform == 'win32'", +] dependencies = [ - { name = "colorama", marker = "sys_platform == 'win32'" }, - { name = "decorator", marker = "sys_platform == 'darwin' or sys_platform == 'linux' or sys_platform == 'win32'" }, + { name = "colorama", marker = "python_full_version < '3.11' and sys_platform == 'win32'" }, + { name = "decorator", marker = "(python_full_version < '3.11' and sys_platform == 'darwin') or (python_full_version < '3.11' and sys_platform == 'linux') or (python_full_version < '3.11' and sys_platform == 'win32')" }, { name = "exceptiongroup", marker = "(python_full_version < '3.11' and sys_platform == 'darwin') or (python_full_version < '3.11' and sys_platform == 'linux') or (python_full_version < '3.11' and sys_platform == 'win32')" }, - { name = "jedi", marker = "sys_platform == 'darwin' or sys_platform == 'linux' or sys_platform == 'win32'" }, - { name = "matplotlib-inline", marker = "sys_platform == 'darwin' or sys_platform == 'linux' or sys_platform == 'win32'" }, - { name = "pexpect", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, - { name = "prompt-toolkit", marker = "sys_platform == 'darwin' or sys_platform == 'linux' or sys_platform == 'win32'" }, - { name = "pygments", marker = "sys_platform == 'darwin' or sys_platform == 'linux' or sys_platform == 'win32'" }, - { name = "stack-data", marker = "sys_platform == 'darwin' or sys_platform == 'linux' or sys_platform == 'win32'" }, - { name = "traitlets", marker = "sys_platform == 'darwin' or sys_platform == 'linux' or sys_platform == 'win32'" }, - { name = "typing-extensions", marker = "(python_full_version < '3.12' and sys_platform == 'darwin') or (python_full_version < '3.12' and sys_platform == 'linux') or (python_full_version < '3.12' and sys_platform == 'win32')" }, + { name = "jedi", marker = "(python_full_version < '3.11' and sys_platform == 'darwin') or (python_full_version < '3.11' and sys_platform == 'linux') or (python_full_version < '3.11' and sys_platform == 'win32')" }, + { name = "matplotlib-inline", marker = "(python_full_version < '3.11' and sys_platform == 'darwin') or (python_full_version < '3.11' and sys_platform == 'linux') or (python_full_version < '3.11' and sys_platform == 'win32')" }, + { name = "pexpect", marker = "(python_full_version < '3.11' and sys_platform == 'darwin') or (python_full_version < '3.11' and sys_platform == 'linux')" }, + { name = "prompt-toolkit", marker = "(python_full_version < '3.11' and sys_platform == 'darwin') or (python_full_version < '3.11' and sys_platform == 'linux') or (python_full_version < '3.11' and sys_platform == 'win32')" }, + { name = "pygments", marker = "(python_full_version < '3.11' and sys_platform == 'darwin') or (python_full_version < '3.11' and sys_platform == 'linux') or (python_full_version < '3.11' and sys_platform == 'win32')" }, + { name = "stack-data", marker = "(python_full_version < '3.11' and sys_platform == 'darwin') or (python_full_version < '3.11' and sys_platform == 'linux') or (python_full_version < '3.11' and sys_platform == 'win32')" }, + { name = "traitlets", marker = "(python_full_version < '3.11' and sys_platform == 'darwin') or (python_full_version < '3.11' and sys_platform == 'linux') or (python_full_version < '3.11' and sys_platform == 'win32')" }, + { name = "typing-extensions", marker = "(python_full_version < '3.11' and sys_platform == 'darwin') or (python_full_version < '3.11' and sys_platform == 'linux') or (python_full_version < '3.11' and sys_platform == 'win32')" }, ] sdist = { url = "https://files.pythonhosted.org/packages/a2/9f/d9a73710df947b7804bd9d93509463fb3a89e0ddc99c9fcc67279cddbeb6/ipython-8.36.0.tar.gz", hash = "sha256:24658e9fe5c5c819455043235ba59cfffded4a35936eefceceab6b192f7092ff", size = 5604997, upload-time = "2025-04-25T18:03:38.031Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/d6/d7/c1c9f371790b3a181e343c4815a361e5a0cc7d90ef6642d64ba5d05de289/ipython-8.36.0-py3-none-any.whl", hash = "sha256:12b913914d010dcffa2711505ec8be4bf0180742d97f1e5175e51f22086428c1", size = 831074, upload-time = "2025-04-25T18:03:34.951Z" }, ] +[[package]] +name = "ipython" +version = "9.2.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '4.0' and sys_platform == 'darwin'", + "python_full_version >= '3.13' and python_full_version < '4.0' and sys_platform == 'darwin'", + "python_full_version == '3.12.*' and sys_platform == 'darwin'", + "python_full_version == '3.11.*' and sys_platform == 'darwin'", + "python_full_version >= '4.0' and sys_platform == 'linux'", + "python_full_version >= '3.13' and python_full_version < '4.0' and sys_platform == 'linux'", + "python_full_version == '3.12.*' and sys_platform == 'linux'", + "python_full_version == '3.11.*' and sys_platform == 'linux'", + "python_full_version >= '4.0' and sys_platform == 'win32'", + "python_full_version >= '3.13' and python_full_version < '4.0' and sys_platform == 'win32'", + "python_full_version == '3.12.*' and sys_platform == 'win32'", + "python_full_version == '3.11.*' and sys_platform == 'win32'", +] +dependencies = [ + { name = "colorama", marker = "python_full_version >= '3.11' and sys_platform == 'win32'" }, + { name = "decorator", marker = "(python_full_version >= '3.11' and sys_platform == 'darwin') or (python_full_version >= '3.11' and sys_platform == 'linux') or (python_full_version >= '3.11' and sys_platform == 'win32')" }, + { name = "ipython-pygments-lexers", marker = "(python_full_version >= '3.11' and sys_platform == 'darwin') or (python_full_version >= '3.11' and sys_platform == 'linux') or (python_full_version >= '3.11' and sys_platform == 'win32')" }, + { name = "jedi", marker = "(python_full_version >= '3.11' and sys_platform == 'darwin') or (python_full_version >= '3.11' and sys_platform == 'linux') or (python_full_version >= '3.11' and sys_platform == 'win32')" }, + { name = "matplotlib-inline", marker = "(python_full_version >= '3.11' and sys_platform == 'darwin') or (python_full_version >= '3.11' and sys_platform == 'linux') or (python_full_version >= '3.11' and sys_platform == 'win32')" }, + { name = "pexpect", marker = "(python_full_version >= '3.11' and sys_platform == 'darwin') or (python_full_version >= '3.11' and sys_platform == 'linux')" }, + { name = "prompt-toolkit", marker = "(python_full_version >= '3.11' and sys_platform == 'darwin') or (python_full_version >= '3.11' and sys_platform == 'linux') or (python_full_version >= '3.11' and sys_platform == 'win32')" }, + { name = "pygments", marker = "(python_full_version >= '3.11' and sys_platform == 'darwin') or (python_full_version >= '3.11' and sys_platform == 'linux') or (python_full_version >= '3.11' and sys_platform == 'win32')" }, + { name = "stack-data", marker = "(python_full_version >= '3.11' and sys_platform == 'darwin') or (python_full_version >= '3.11' and sys_platform == 'linux') or (python_full_version >= '3.11' and sys_platform == 'win32')" }, + { name = "traitlets", marker = "(python_full_version >= '3.11' and sys_platform == 'darwin') or (python_full_version >= '3.11' and sys_platform == 'linux') or (python_full_version >= '3.11' and sys_platform == 'win32')" }, + { name = "typing-extensions", marker = "(python_full_version == '3.11.*' and sys_platform == 'darwin') or (python_full_version == '3.11.*' and sys_platform == 'linux') or (python_full_version == '3.11.*' and sys_platform == 'win32')" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/9d/02/63a84444a7409b3c0acd1de9ffe524660e0e5d82ee473e78b45e5bfb64a4/ipython-9.2.0.tar.gz", hash = "sha256:62a9373dbc12f28f9feaf4700d052195bf89806279fc8ca11f3f54017d04751b", size = 4424394, upload-time = "2025-04-25T17:55:40.498Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/78/ce/5e897ee51b7d26ab4e47e5105e7368d40ce6cfae2367acdf3165396d50be/ipython-9.2.0-py3-none-any.whl", hash = "sha256:fef5e33c4a1ae0759e0bba5917c9db4eb8c53fee917b6a526bd973e1ca5159f6", size = 604277, upload-time = "2025-04-25T17:55:37.625Z" }, +] + +[[package]] +name = "ipython-pygments-lexers" +version = "1.1.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pygments", marker = "(python_full_version >= '3.11' and sys_platform == 'darwin') or (python_full_version >= '3.11' and sys_platform == 'linux') or (python_full_version >= '3.11' and sys_platform == 'win32')" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ef/4c/5dd1d8af08107f88c7f741ead7a40854b8ac24ddf9ae850afbcf698aa552/ipython_pygments_lexers-1.1.1.tar.gz", hash = "sha256:09c0138009e56b6854f9535736f4171d855c8c08a563a0dcd8022f78355c7e81", size = 8393, upload-time = "2025-01-17T11:24:34.505Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d9/33/1f075bf72b0b747cb3288d011319aaf64083cf2efef8354174e3ed4540e2/ipython_pygments_lexers-1.1.1-py3-none-any.whl", hash = "sha256:a9462224a505ade19a605f71f8fa63c2048833ce50abc86768a0d81d876dc81c", size = 8074, upload-time = "2025-01-17T11:24:33.271Z" }, +] + [[package]] name = "isodate" version = "0.7.2" @@ -2342,61 +2380,74 @@ wheels = [ [[package]] name = "jiter" -version = "0.9.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/1e/c2/e4562507f52f0af7036da125bb699602ead37a2332af0788f8e0a3417f36/jiter-0.9.0.tar.gz", hash = "sha256:aadba0964deb424daa24492abc3d229c60c4a31bfee205aedbf1acc7639d7893", size = 162604, upload-time = "2025-03-10T21:37:03.278Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/b0/82/39f7c9e67b3b0121f02a0b90d433626caa95a565c3d2449fea6bcfa3f5f5/jiter-0.9.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:816ec9b60fdfd1fec87da1d7ed46c66c44ffec37ab2ef7de5b147b2fce3fd5ad", size = 314540, upload-time = "2025-03-10T21:35:02.218Z" }, - { url = "https://files.pythonhosted.org/packages/01/07/7bf6022c5a152fca767cf5c086bb41f7c28f70cf33ad259d023b53c0b858/jiter-0.9.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9b1d3086f8a3ee0194ecf2008cf81286a5c3e540d977fa038ff23576c023c0ea", size = 321065, upload-time = "2025-03-10T21:35:04.274Z" }, - { url = "https://files.pythonhosted.org/packages/6c/b2/de3f3446ecba7c48f317568e111cc112613da36c7b29a6de45a1df365556/jiter-0.9.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1339f839b91ae30b37c409bf16ccd3dc453e8b8c3ed4bd1d6a567193651a4a51", size = 341664, upload-time = "2025-03-10T21:35:06.032Z" }, - { url = "https://files.pythonhosted.org/packages/13/cf/6485a4012af5d407689c91296105fcdb080a3538e0658d2abf679619c72f/jiter-0.9.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ffba79584b3b670fefae66ceb3a28822365d25b7bf811e030609a3d5b876f538", size = 364635, upload-time = "2025-03-10T21:35:07.749Z" }, - { url = "https://files.pythonhosted.org/packages/0d/f7/4a491c568f005553240b486f8e05c82547340572d5018ef79414b4449327/jiter-0.9.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5cfc7d0a8e899089d11f065e289cb5b2daf3d82fbe028f49b20d7b809193958d", size = 406288, upload-time = "2025-03-10T21:35:09.238Z" }, - { url = "https://files.pythonhosted.org/packages/d3/ca/f4263ecbce7f5e6bded8f52a9f1a66540b270c300b5c9f5353d163f9ac61/jiter-0.9.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e00a1a2bbfaaf237e13c3d1592356eab3e9015d7efd59359ac8b51eb56390a12", size = 397499, upload-time = "2025-03-10T21:35:12.463Z" }, - { url = "https://files.pythonhosted.org/packages/ac/a2/522039e522a10bac2f2194f50e183a49a360d5f63ebf46f6d890ef8aa3f9/jiter-0.9.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d1d9870561eb26b11448854dce0ff27a9a27cb616b632468cafc938de25e9e51", size = 352926, upload-time = "2025-03-10T21:35:13.85Z" }, - { url = "https://files.pythonhosted.org/packages/b1/67/306a5c5abc82f2e32bd47333a1c9799499c1c3a415f8dde19dbf876f00cb/jiter-0.9.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:9872aeff3f21e437651df378cb75aeb7043e5297261222b6441a620218b58708", size = 384506, upload-time = "2025-03-10T21:35:15.735Z" }, - { url = "https://files.pythonhosted.org/packages/0f/89/c12fe7b65a4fb74f6c0d7b5119576f1f16c79fc2953641f31b288fad8a04/jiter-0.9.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:1fd19112d1049bdd47f17bfbb44a2c0001061312dcf0e72765bfa8abd4aa30e5", size = 520621, upload-time = "2025-03-10T21:35:17.55Z" }, - { url = "https://files.pythonhosted.org/packages/c4/2b/d57900c5c06e6273fbaa76a19efa74dbc6e70c7427ab421bf0095dfe5d4a/jiter-0.9.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:6ef5da104664e526836070e4a23b5f68dec1cc673b60bf1edb1bfbe8a55d0678", size = 512613, upload-time = "2025-03-10T21:35:19.178Z" }, - { url = "https://files.pythonhosted.org/packages/89/05/d8b90bfb21e58097d5a4e0224f2940568366f68488a079ae77d4b2653500/jiter-0.9.0-cp310-cp310-win32.whl", hash = "sha256:cb12e6d65ebbefe5518de819f3eda53b73187b7089040b2d17f5b39001ff31c4", size = 206613, upload-time = "2025-03-10T21:35:21.039Z" }, - { url = "https://files.pythonhosted.org/packages/2c/1d/5767f23f88e4f885090d74bbd2755518050a63040c0f59aa059947035711/jiter-0.9.0-cp310-cp310-win_amd64.whl", hash = "sha256:c43ca669493626d8672be3b645dbb406ef25af3f4b6384cfd306da7eb2e70322", size = 208371, upload-time = "2025-03-10T21:35:22.536Z" }, - { url = "https://files.pythonhosted.org/packages/23/44/e241a043f114299254e44d7e777ead311da400517f179665e59611ab0ee4/jiter-0.9.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:6c4d99c71508912a7e556d631768dcdef43648a93660670986916b297f1c54af", size = 314654, upload-time = "2025-03-10T21:35:23.939Z" }, - { url = "https://files.pythonhosted.org/packages/fb/1b/a7e5e42db9fa262baaa9489d8d14ca93f8663e7f164ed5e9acc9f467fc00/jiter-0.9.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:8f60fb8ce7df529812bf6c625635a19d27f30806885139e367af93f6e734ef58", size = 320909, upload-time = "2025-03-10T21:35:26.127Z" }, - { url = "https://files.pythonhosted.org/packages/60/bf/8ebdfce77bc04b81abf2ea316e9c03b4a866a7d739cf355eae4d6fd9f6fe/jiter-0.9.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:51c4e1a4f8ea84d98b7b98912aa4290ac3d1eabfde8e3c34541fae30e9d1f08b", size = 341733, upload-time = "2025-03-10T21:35:27.94Z" }, - { url = "https://files.pythonhosted.org/packages/a8/4e/754ebce77cff9ab34d1d0fa0fe98f5d42590fd33622509a3ba6ec37ff466/jiter-0.9.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5f4c677c424dc76684fea3e7285a7a2a7493424bea89ac441045e6a1fb1d7b3b", size = 365097, upload-time = "2025-03-10T21:35:29.605Z" }, - { url = "https://files.pythonhosted.org/packages/32/2c/6019587e6f5844c612ae18ca892f4cd7b3d8bbf49461ed29e384a0f13d98/jiter-0.9.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2221176dfec87f3470b21e6abca056e6b04ce9bff72315cb0b243ca9e835a4b5", size = 406603, upload-time = "2025-03-10T21:35:31.696Z" }, - { url = "https://files.pythonhosted.org/packages/da/e9/c9e6546c817ab75a1a7dab6dcc698e62e375e1017113e8e983fccbd56115/jiter-0.9.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3c7adb66f899ffa25e3c92bfcb593391ee1947dbdd6a9a970e0d7e713237d572", size = 396625, upload-time = "2025-03-10T21:35:33.182Z" }, - { url = "https://files.pythonhosted.org/packages/be/bd/976b458add04271ebb5a255e992bd008546ea04bb4dcadc042a16279b4b4/jiter-0.9.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c98d27330fdfb77913c1097a7aab07f38ff2259048949f499c9901700789ac15", size = 351832, upload-time = "2025-03-10T21:35:35.394Z" }, - { url = "https://files.pythonhosted.org/packages/07/51/fe59e307aaebec9265dbad44d9d4381d030947e47b0f23531579b9a7c2df/jiter-0.9.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:eda3f8cc74df66892b1d06b5d41a71670c22d95a1ca2cbab73654745ce9d0419", size = 384590, upload-time = "2025-03-10T21:35:37.171Z" }, - { url = "https://files.pythonhosted.org/packages/db/55/5dcd2693794d8e6f4889389ff66ef3be557a77f8aeeca8973a97a7c00557/jiter-0.9.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:dd5ab5ddc11418dce28343123644a100f487eaccf1de27a459ab36d6cca31043", size = 520690, upload-time = "2025-03-10T21:35:38.717Z" }, - { url = "https://files.pythonhosted.org/packages/54/d5/9f51dc90985e9eb251fbbb747ab2b13b26601f16c595a7b8baba964043bd/jiter-0.9.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:42f8a68a69f047b310319ef8e2f52fdb2e7976fb3313ef27df495cf77bcad965", size = 512649, upload-time = "2025-03-10T21:35:40.157Z" }, - { url = "https://files.pythonhosted.org/packages/a6/e5/4e385945179bcf128fa10ad8dca9053d717cbe09e258110e39045c881fe5/jiter-0.9.0-cp311-cp311-win32.whl", hash = "sha256:a25519efb78a42254d59326ee417d6f5161b06f5da827d94cf521fed961b1ff2", size = 206920, upload-time = "2025-03-10T21:35:41.72Z" }, - { url = "https://files.pythonhosted.org/packages/4c/47/5e0b94c603d8e54dd1faab439b40b832c277d3b90743e7835879ab663757/jiter-0.9.0-cp311-cp311-win_amd64.whl", hash = "sha256:923b54afdd697dfd00d368b7ccad008cccfeb1efb4e621f32860c75e9f25edbd", size = 210119, upload-time = "2025-03-10T21:35:43.46Z" }, - { url = "https://files.pythonhosted.org/packages/af/d7/c55086103d6f29b694ec79156242304adf521577530d9031317ce5338c59/jiter-0.9.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:7b46249cfd6c48da28f89eb0be3f52d6fdb40ab88e2c66804f546674e539ec11", size = 309203, upload-time = "2025-03-10T21:35:44.852Z" }, - { url = "https://files.pythonhosted.org/packages/b0/01/f775dfee50beb420adfd6baf58d1c4d437de41c9b666ddf127c065e5a488/jiter-0.9.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:609cf3c78852f1189894383cf0b0b977665f54cb38788e3e6b941fa6d982c00e", size = 319678, upload-time = "2025-03-10T21:35:46.365Z" }, - { url = "https://files.pythonhosted.org/packages/ab/b8/09b73a793714726893e5d46d5c534a63709261af3d24444ad07885ce87cb/jiter-0.9.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d726a3890a54561e55a9c5faea1f7655eda7f105bd165067575ace6e65f80bb2", size = 341816, upload-time = "2025-03-10T21:35:47.856Z" }, - { url = "https://files.pythonhosted.org/packages/35/6f/b8f89ec5398b2b0d344257138182cc090302854ed63ed9c9051e9c673441/jiter-0.9.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2e89dc075c1fef8fa9be219e249f14040270dbc507df4215c324a1839522ea75", size = 364152, upload-time = "2025-03-10T21:35:49.397Z" }, - { url = "https://files.pythonhosted.org/packages/9b/ca/978cc3183113b8e4484cc7e210a9ad3c6614396e7abd5407ea8aa1458eef/jiter-0.9.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:04e8ffa3c353b1bc4134f96f167a2082494351e42888dfcf06e944f2729cbe1d", size = 406991, upload-time = "2025-03-10T21:35:50.745Z" }, - { url = "https://files.pythonhosted.org/packages/13/3a/72861883e11a36d6aa314b4922125f6ae90bdccc225cd96d24cc78a66385/jiter-0.9.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:203f28a72a05ae0e129b3ed1f75f56bc419d5f91dfacd057519a8bd137b00c42", size = 395824, upload-time = "2025-03-10T21:35:52.162Z" }, - { url = "https://files.pythonhosted.org/packages/87/67/22728a86ef53589c3720225778f7c5fdb617080e3deaed58b04789418212/jiter-0.9.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fca1a02ad60ec30bb230f65bc01f611c8608b02d269f998bc29cca8619a919dc", size = 351318, upload-time = "2025-03-10T21:35:53.566Z" }, - { url = "https://files.pythonhosted.org/packages/69/b9/f39728e2e2007276806d7a6609cda7fac44ffa28ca0d02c49a4f397cc0d9/jiter-0.9.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:237e5cee4d5d2659aaf91bbf8ec45052cc217d9446070699441a91b386ae27dc", size = 384591, upload-time = "2025-03-10T21:35:54.95Z" }, - { url = "https://files.pythonhosted.org/packages/eb/8f/8a708bc7fd87b8a5d861f1c118a995eccbe6d672fe10c9753e67362d0dd0/jiter-0.9.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:528b6b71745e7326eed73c53d4aa57e2a522242320b6f7d65b9c5af83cf49b6e", size = 520746, upload-time = "2025-03-10T21:35:56.444Z" }, - { url = "https://files.pythonhosted.org/packages/95/1e/65680c7488bd2365dbd2980adaf63c562d3d41d3faac192ebc7ef5b4ae25/jiter-0.9.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:9f48e86b57bc711eb5acdfd12b6cb580a59cc9a993f6e7dcb6d8b50522dcd50d", size = 512754, upload-time = "2025-03-10T21:35:58.789Z" }, - { url = "https://files.pythonhosted.org/packages/78/f3/fdc43547a9ee6e93c837685da704fb6da7dba311fc022e2766d5277dfde5/jiter-0.9.0-cp312-cp312-win32.whl", hash = "sha256:699edfde481e191d81f9cf6d2211debbfe4bd92f06410e7637dffb8dd5dfde06", size = 207075, upload-time = "2025-03-10T21:36:00.616Z" }, - { url = "https://files.pythonhosted.org/packages/cd/9d/742b289016d155f49028fe1bfbeb935c9bf0ffeefdf77daf4a63a42bb72b/jiter-0.9.0-cp312-cp312-win_amd64.whl", hash = "sha256:099500d07b43f61d8bd780466d429c45a7b25411b334c60ca875fa775f68ccb0", size = 207999, upload-time = "2025-03-10T21:36:02.366Z" }, - { url = "https://files.pythonhosted.org/packages/e7/1b/4cd165c362e8f2f520fdb43245e2b414f42a255921248b4f8b9c8d871ff1/jiter-0.9.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:2764891d3f3e8b18dce2cff24949153ee30c9239da7c00f032511091ba688ff7", size = 308197, upload-time = "2025-03-10T21:36:03.828Z" }, - { url = "https://files.pythonhosted.org/packages/13/aa/7a890dfe29c84c9a82064a9fe36079c7c0309c91b70c380dc138f9bea44a/jiter-0.9.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:387b22fbfd7a62418d5212b4638026d01723761c75c1c8232a8b8c37c2f1003b", size = 318160, upload-time = "2025-03-10T21:36:05.281Z" }, - { url = "https://files.pythonhosted.org/packages/6a/38/5888b43fc01102f733f085673c4f0be5a298f69808ec63de55051754e390/jiter-0.9.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:40d8da8629ccae3606c61d9184970423655fb4e33d03330bcdfe52d234d32f69", size = 341259, upload-time = "2025-03-10T21:36:06.716Z" }, - { url = "https://files.pythonhosted.org/packages/3d/5e/bbdbb63305bcc01006de683b6228cd061458b9b7bb9b8d9bc348a58e5dc2/jiter-0.9.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:a1be73d8982bdc278b7b9377426a4b44ceb5c7952073dd7488e4ae96b88e1103", size = 363730, upload-time = "2025-03-10T21:36:08.138Z" }, - { url = "https://files.pythonhosted.org/packages/75/85/53a3edc616992fe4af6814c25f91ee3b1e22f7678e979b6ea82d3bc0667e/jiter-0.9.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2228eaaaa111ec54b9e89f7481bffb3972e9059301a878d085b2b449fbbde635", size = 405126, upload-time = "2025-03-10T21:36:10.934Z" }, - { url = "https://files.pythonhosted.org/packages/ae/b3/1ee26b12b2693bd3f0b71d3188e4e5d817b12e3c630a09e099e0a89e28fa/jiter-0.9.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:11509bfecbc319459647d4ac3fd391d26fdf530dad00c13c4dadabf5b81f01a4", size = 393668, upload-time = "2025-03-10T21:36:12.468Z" }, - { url = "https://files.pythonhosted.org/packages/11/87/e084ce261950c1861773ab534d49127d1517b629478304d328493f980791/jiter-0.9.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3f22238da568be8bbd8e0650e12feeb2cfea15eda4f9fc271d3b362a4fa0604d", size = 352350, upload-time = "2025-03-10T21:36:14.148Z" }, - { url = "https://files.pythonhosted.org/packages/f0/06/7dca84b04987e9df563610aa0bc154ea176e50358af532ab40ffb87434df/jiter-0.9.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:17f5d55eb856597607562257c8e36c42bc87f16bef52ef7129b7da11afc779f3", size = 384204, upload-time = "2025-03-10T21:36:15.545Z" }, - { url = "https://files.pythonhosted.org/packages/16/2f/82e1c6020db72f397dd070eec0c85ebc4df7c88967bc86d3ce9864148f28/jiter-0.9.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:6a99bed9fbb02f5bed416d137944419a69aa4c423e44189bc49718859ea83bc5", size = 520322, upload-time = "2025-03-10T21:36:17.016Z" }, - { url = "https://files.pythonhosted.org/packages/36/fd/4f0cd3abe83ce208991ca61e7e5df915aa35b67f1c0633eb7cf2f2e88ec7/jiter-0.9.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:e057adb0cd1bd39606100be0eafe742de2de88c79df632955b9ab53a086b3c8d", size = 512184, upload-time = "2025-03-10T21:36:18.47Z" }, - { url = "https://files.pythonhosted.org/packages/a0/3c/8a56f6d547731a0b4410a2d9d16bf39c861046f91f57c98f7cab3d2aa9ce/jiter-0.9.0-cp313-cp313-win32.whl", hash = "sha256:f7e6850991f3940f62d387ccfa54d1a92bd4bb9f89690b53aea36b4364bcab53", size = 206504, upload-time = "2025-03-10T21:36:19.809Z" }, - { url = "https://files.pythonhosted.org/packages/f4/1c/0c996fd90639acda75ed7fa698ee5fd7d80243057185dc2f63d4c1c9f6b9/jiter-0.9.0-cp313-cp313-win_amd64.whl", hash = "sha256:c8ae3bf27cd1ac5e6e8b7a27487bf3ab5f82318211ec2e1346a5b058756361f7", size = 204943, upload-time = "2025-03-10T21:36:21.536Z" }, - { url = "https://files.pythonhosted.org/packages/78/0f/77a63ca7aa5fed9a1b9135af57e190d905bcd3702b36aca46a01090d39ad/jiter-0.9.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:f0b2827fb88dda2cbecbbc3e596ef08d69bda06c6f57930aec8e79505dc17001", size = 317281, upload-time = "2025-03-10T21:36:22.959Z" }, - { url = "https://files.pythonhosted.org/packages/f9/39/a3a1571712c2bf6ec4c657f0d66da114a63a2e32b7e4eb8e0b83295ee034/jiter-0.9.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:062b756ceb1d40b0b28f326cba26cfd575a4918415b036464a52f08632731e5a", size = 350273, upload-time = "2025-03-10T21:36:24.414Z" }, - { url = "https://files.pythonhosted.org/packages/ee/47/3729f00f35a696e68da15d64eb9283c330e776f3b5789bac7f2c0c4df209/jiter-0.9.0-cp313-cp313t-win_amd64.whl", hash = "sha256:6f7838bc467ab7e8ef9f387bd6de195c43bad82a569c1699cb822f6609dd4cdf", size = 206867, upload-time = "2025-03-10T21:36:25.843Z" }, +version = "0.10.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ee/9d/ae7ddb4b8ab3fb1b51faf4deb36cb48a4fbbd7cb36bad6a5fca4741306f7/jiter-0.10.0.tar.gz", hash = "sha256:07a7142c38aacc85194391108dc91b5b57093c978a9932bd86a36862759d9500", size = 162759, upload-time = "2025-05-18T19:04:59.73Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/be/7e/4011b5c77bec97cb2b572f566220364e3e21b51c48c5bd9c4a9c26b41b67/jiter-0.10.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:cd2fb72b02478f06a900a5782de2ef47e0396b3e1f7d5aba30daeb1fce66f303", size = 317215, upload-time = "2025-05-18T19:03:04.303Z" }, + { url = "https://files.pythonhosted.org/packages/8a/4f/144c1b57c39692efc7ea7d8e247acf28e47d0912800b34d0ad815f6b2824/jiter-0.10.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:32bb468e3af278f095d3fa5b90314728a6916d89ba3d0ffb726dd9bf7367285e", size = 322814, upload-time = "2025-05-18T19:03:06.433Z" }, + { url = "https://files.pythonhosted.org/packages/63/1f/db977336d332a9406c0b1f0b82be6f71f72526a806cbb2281baf201d38e3/jiter-0.10.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aa8b3e0068c26ddedc7abc6fac37da2d0af16b921e288a5a613f4b86f050354f", size = 345237, upload-time = "2025-05-18T19:03:07.833Z" }, + { url = "https://files.pythonhosted.org/packages/d7/1c/aa30a4a775e8a672ad7f21532bdbfb269f0706b39c6ff14e1f86bdd9e5ff/jiter-0.10.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:286299b74cc49e25cd42eea19b72aa82c515d2f2ee12d11392c56d8701f52224", size = 370999, upload-time = "2025-05-18T19:03:09.338Z" }, + { url = "https://files.pythonhosted.org/packages/35/df/f8257abc4207830cb18880781b5f5b716bad5b2a22fb4330cfd357407c5b/jiter-0.10.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6ed5649ceeaeffc28d87fb012d25a4cd356dcd53eff5acff1f0466b831dda2a7", size = 491109, upload-time = "2025-05-18T19:03:11.13Z" }, + { url = "https://files.pythonhosted.org/packages/06/76/9e1516fd7b4278aa13a2cc7f159e56befbea9aa65c71586305e7afa8b0b3/jiter-0.10.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b2ab0051160cb758a70716448908ef14ad476c3774bd03ddce075f3c1f90a3d6", size = 388608, upload-time = "2025-05-18T19:03:12.911Z" }, + { url = "https://files.pythonhosted.org/packages/6d/64/67750672b4354ca20ca18d3d1ccf2c62a072e8a2d452ac3cf8ced73571ef/jiter-0.10.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:03997d2f37f6b67d2f5c475da4412be584e1cec273c1cfc03d642c46db43f8cf", size = 352454, upload-time = "2025-05-18T19:03:14.741Z" }, + { url = "https://files.pythonhosted.org/packages/96/4d/5c4e36d48f169a54b53a305114be3efa2bbffd33b648cd1478a688f639c1/jiter-0.10.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:c404a99352d839fed80d6afd6c1d66071f3bacaaa5c4268983fc10f769112e90", size = 391833, upload-time = "2025-05-18T19:03:16.426Z" }, + { url = "https://files.pythonhosted.org/packages/0b/de/ce4a6166a78810bd83763d2fa13f85f73cbd3743a325469a4a9289af6dae/jiter-0.10.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:66e989410b6666d3ddb27a74c7e50d0829704ede652fd4c858e91f8d64b403d0", size = 523646, upload-time = "2025-05-18T19:03:17.704Z" }, + { url = "https://files.pythonhosted.org/packages/a2/a6/3bc9acce53466972964cf4ad85efecb94f9244539ab6da1107f7aed82934/jiter-0.10.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b532d3af9ef4f6374609a3bcb5e05a1951d3bf6190dc6b176fdb277c9bbf15ee", size = 514735, upload-time = "2025-05-18T19:03:19.44Z" }, + { url = "https://files.pythonhosted.org/packages/b4/d8/243c2ab8426a2a4dea85ba2a2ba43df379ccece2145320dfd4799b9633c5/jiter-0.10.0-cp310-cp310-win32.whl", hash = "sha256:da9be20b333970e28b72edc4dff63d4fec3398e05770fb3205f7fb460eb48dd4", size = 210747, upload-time = "2025-05-18T19:03:21.184Z" }, + { url = "https://files.pythonhosted.org/packages/37/7a/8021bd615ef7788b98fc76ff533eaac846322c170e93cbffa01979197a45/jiter-0.10.0-cp310-cp310-win_amd64.whl", hash = "sha256:f59e533afed0c5b0ac3eba20d2548c4a550336d8282ee69eb07b37ea526ee4e5", size = 207484, upload-time = "2025-05-18T19:03:23.046Z" }, + { url = "https://files.pythonhosted.org/packages/1b/dd/6cefc6bd68b1c3c979cecfa7029ab582b57690a31cd2f346c4d0ce7951b6/jiter-0.10.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:3bebe0c558e19902c96e99217e0b8e8b17d570906e72ed8a87170bc290b1e978", size = 317473, upload-time = "2025-05-18T19:03:25.942Z" }, + { url = "https://files.pythonhosted.org/packages/be/cf/fc33f5159ce132be1d8dd57251a1ec7a631c7df4bd11e1cd198308c6ae32/jiter-0.10.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:558cc7e44fd8e507a236bee6a02fa17199ba752874400a0ca6cd6e2196cdb7dc", size = 321971, upload-time = "2025-05-18T19:03:27.255Z" }, + { url = "https://files.pythonhosted.org/packages/68/a4/da3f150cf1d51f6c472616fb7650429c7ce053e0c962b41b68557fdf6379/jiter-0.10.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4d613e4b379a07d7c8453c5712ce7014e86c6ac93d990a0b8e7377e18505e98d", size = 345574, upload-time = "2025-05-18T19:03:28.63Z" }, + { url = "https://files.pythonhosted.org/packages/84/34/6e8d412e60ff06b186040e77da5f83bc158e9735759fcae65b37d681f28b/jiter-0.10.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f62cf8ba0618eda841b9bf61797f21c5ebd15a7a1e19daab76e4e4b498d515b2", size = 371028, upload-time = "2025-05-18T19:03:30.292Z" }, + { url = "https://files.pythonhosted.org/packages/fb/d9/9ee86173aae4576c35a2f50ae930d2ccb4c4c236f6cb9353267aa1d626b7/jiter-0.10.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:919d139cdfa8ae8945112398511cb7fca58a77382617d279556b344867a37e61", size = 491083, upload-time = "2025-05-18T19:03:31.654Z" }, + { url = "https://files.pythonhosted.org/packages/d9/2c/f955de55e74771493ac9e188b0f731524c6a995dffdcb8c255b89c6fb74b/jiter-0.10.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:13ddbc6ae311175a3b03bd8994881bc4635c923754932918e18da841632349db", size = 388821, upload-time = "2025-05-18T19:03:33.184Z" }, + { url = "https://files.pythonhosted.org/packages/81/5a/0e73541b6edd3f4aada586c24e50626c7815c561a7ba337d6a7eb0a915b4/jiter-0.10.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4c440ea003ad10927a30521a9062ce10b5479592e8a70da27f21eeb457b4a9c5", size = 352174, upload-time = "2025-05-18T19:03:34.965Z" }, + { url = "https://files.pythonhosted.org/packages/1c/c0/61eeec33b8c75b31cae42be14d44f9e6fe3ac15a4e58010256ac3abf3638/jiter-0.10.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:dc347c87944983481e138dea467c0551080c86b9d21de6ea9306efb12ca8f606", size = 391869, upload-time = "2025-05-18T19:03:36.436Z" }, + { url = "https://files.pythonhosted.org/packages/41/22/5beb5ee4ad4ef7d86f5ea5b4509f680a20706c4a7659e74344777efb7739/jiter-0.10.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:13252b58c1f4d8c5b63ab103c03d909e8e1e7842d302473f482915d95fefd605", size = 523741, upload-time = "2025-05-18T19:03:38.168Z" }, + { url = "https://files.pythonhosted.org/packages/ea/10/768e8818538e5817c637b0df52e54366ec4cebc3346108a4457ea7a98f32/jiter-0.10.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:7d1bbf3c465de4a24ab12fb7766a0003f6f9bce48b8b6a886158c4d569452dc5", size = 514527, upload-time = "2025-05-18T19:03:39.577Z" }, + { url = "https://files.pythonhosted.org/packages/73/6d/29b7c2dc76ce93cbedabfd842fc9096d01a0550c52692dfc33d3cc889815/jiter-0.10.0-cp311-cp311-win32.whl", hash = "sha256:db16e4848b7e826edca4ccdd5b145939758dadf0dc06e7007ad0e9cfb5928ae7", size = 210765, upload-time = "2025-05-18T19:03:41.271Z" }, + { url = "https://files.pythonhosted.org/packages/c2/c9/d394706deb4c660137caf13e33d05a031d734eb99c051142e039d8ceb794/jiter-0.10.0-cp311-cp311-win_amd64.whl", hash = "sha256:9c9c1d5f10e18909e993f9641f12fe1c77b3e9b533ee94ffa970acc14ded3812", size = 209234, upload-time = "2025-05-18T19:03:42.918Z" }, + { url = "https://files.pythonhosted.org/packages/6d/b5/348b3313c58f5fbfb2194eb4d07e46a35748ba6e5b3b3046143f3040bafa/jiter-0.10.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:1e274728e4a5345a6dde2d343c8da018b9d4bd4350f5a472fa91f66fda44911b", size = 312262, upload-time = "2025-05-18T19:03:44.637Z" }, + { url = "https://files.pythonhosted.org/packages/9c/4a/6a2397096162b21645162825f058d1709a02965606e537e3304b02742e9b/jiter-0.10.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:7202ae396446c988cb2a5feb33a543ab2165b786ac97f53b59aafb803fef0744", size = 320124, upload-time = "2025-05-18T19:03:46.341Z" }, + { url = "https://files.pythonhosted.org/packages/2a/85/1ce02cade7516b726dd88f59a4ee46914bf79d1676d1228ef2002ed2f1c9/jiter-0.10.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:23ba7722d6748b6920ed02a8f1726fb4b33e0fd2f3f621816a8b486c66410ab2", size = 345330, upload-time = "2025-05-18T19:03:47.596Z" }, + { url = "https://files.pythonhosted.org/packages/75/d0/bb6b4f209a77190ce10ea8d7e50bf3725fc16d3372d0a9f11985a2b23eff/jiter-0.10.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:371eab43c0a288537d30e1f0b193bc4eca90439fc08a022dd83e5e07500ed026", size = 369670, upload-time = "2025-05-18T19:03:49.334Z" }, + { url = "https://files.pythonhosted.org/packages/a0/f5/a61787da9b8847a601e6827fbc42ecb12be2c925ced3252c8ffcb56afcaf/jiter-0.10.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6c675736059020365cebc845a820214765162728b51ab1e03a1b7b3abb70f74c", size = 489057, upload-time = "2025-05-18T19:03:50.66Z" }, + { url = "https://files.pythonhosted.org/packages/12/e4/6f906272810a7b21406c760a53aadbe52e99ee070fc5c0cb191e316de30b/jiter-0.10.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0c5867d40ab716e4684858e4887489685968a47e3ba222e44cde6e4a2154f959", size = 389372, upload-time = "2025-05-18T19:03:51.98Z" }, + { url = "https://files.pythonhosted.org/packages/e2/ba/77013b0b8ba904bf3762f11e0129b8928bff7f978a81838dfcc958ad5728/jiter-0.10.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:395bb9a26111b60141757d874d27fdea01b17e8fac958b91c20128ba8f4acc8a", size = 352038, upload-time = "2025-05-18T19:03:53.703Z" }, + { url = "https://files.pythonhosted.org/packages/67/27/c62568e3ccb03368dbcc44a1ef3a423cb86778a4389e995125d3d1aaa0a4/jiter-0.10.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6842184aed5cdb07e0c7e20e5bdcfafe33515ee1741a6835353bb45fe5d1bd95", size = 391538, upload-time = "2025-05-18T19:03:55.046Z" }, + { url = "https://files.pythonhosted.org/packages/c0/72/0d6b7e31fc17a8fdce76164884edef0698ba556b8eb0af9546ae1a06b91d/jiter-0.10.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:62755d1bcea9876770d4df713d82606c8c1a3dca88ff39046b85a048566d56ea", size = 523557, upload-time = "2025-05-18T19:03:56.386Z" }, + { url = "https://files.pythonhosted.org/packages/2f/09/bc1661fbbcbeb6244bd2904ff3a06f340aa77a2b94e5a7373fd165960ea3/jiter-0.10.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:533efbce2cacec78d5ba73a41756beff8431dfa1694b6346ce7af3a12c42202b", size = 514202, upload-time = "2025-05-18T19:03:57.675Z" }, + { url = "https://files.pythonhosted.org/packages/1b/84/5a5d5400e9d4d54b8004c9673bbe4403928a00d28529ff35b19e9d176b19/jiter-0.10.0-cp312-cp312-win32.whl", hash = "sha256:8be921f0cadd245e981b964dfbcd6fd4bc4e254cdc069490416dd7a2632ecc01", size = 211781, upload-time = "2025-05-18T19:03:59.025Z" }, + { url = "https://files.pythonhosted.org/packages/9b/52/7ec47455e26f2d6e5f2ea4951a0652c06e5b995c291f723973ae9e724a65/jiter-0.10.0-cp312-cp312-win_amd64.whl", hash = "sha256:a7c7d785ae9dda68c2678532a5a1581347e9c15362ae9f6e68f3fdbfb64f2e49", size = 206176, upload-time = "2025-05-18T19:04:00.305Z" }, + { url = "https://files.pythonhosted.org/packages/2e/b0/279597e7a270e8d22623fea6c5d4eeac328e7d95c236ed51a2b884c54f70/jiter-0.10.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:e0588107ec8e11b6f5ef0e0d656fb2803ac6cf94a96b2b9fc675c0e3ab5e8644", size = 311617, upload-time = "2025-05-18T19:04:02.078Z" }, + { url = "https://files.pythonhosted.org/packages/91/e3/0916334936f356d605f54cc164af4060e3e7094364add445a3bc79335d46/jiter-0.10.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:cafc4628b616dc32530c20ee53d71589816cf385dd9449633e910d596b1f5c8a", size = 318947, upload-time = "2025-05-18T19:04:03.347Z" }, + { url = "https://files.pythonhosted.org/packages/6a/8e/fd94e8c02d0e94539b7d669a7ebbd2776e51f329bb2c84d4385e8063a2ad/jiter-0.10.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:520ef6d981172693786a49ff5b09eda72a42e539f14788124a07530f785c3ad6", size = 344618, upload-time = "2025-05-18T19:04:04.709Z" }, + { url = "https://files.pythonhosted.org/packages/6f/b0/f9f0a2ec42c6e9c2e61c327824687f1e2415b767e1089c1d9135f43816bd/jiter-0.10.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:554dedfd05937f8fc45d17ebdf298fe7e0c77458232bcb73d9fbbf4c6455f5b3", size = 368829, upload-time = "2025-05-18T19:04:06.912Z" }, + { url = "https://files.pythonhosted.org/packages/e8/57/5bbcd5331910595ad53b9fd0c610392ac68692176f05ae48d6ce5c852967/jiter-0.10.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5bc299da7789deacf95f64052d97f75c16d4fc8c4c214a22bf8d859a4288a1c2", size = 491034, upload-time = "2025-05-18T19:04:08.222Z" }, + { url = "https://files.pythonhosted.org/packages/9b/be/c393df00e6e6e9e623a73551774449f2f23b6ec6a502a3297aeeece2c65a/jiter-0.10.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5161e201172de298a8a1baad95eb85db4fb90e902353b1f6a41d64ea64644e25", size = 388529, upload-time = "2025-05-18T19:04:09.566Z" }, + { url = "https://files.pythonhosted.org/packages/42/3e/df2235c54d365434c7f150b986a6e35f41ebdc2f95acea3036d99613025d/jiter-0.10.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2e2227db6ba93cb3e2bf67c87e594adde0609f146344e8207e8730364db27041", size = 350671, upload-time = "2025-05-18T19:04:10.98Z" }, + { url = "https://files.pythonhosted.org/packages/c6/77/71b0b24cbcc28f55ab4dbfe029f9a5b73aeadaba677843fc6dc9ed2b1d0a/jiter-0.10.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:15acb267ea5e2c64515574b06a8bf393fbfee6a50eb1673614aa45f4613c0cca", size = 390864, upload-time = "2025-05-18T19:04:12.722Z" }, + { url = "https://files.pythonhosted.org/packages/6a/d3/ef774b6969b9b6178e1d1e7a89a3bd37d241f3d3ec5f8deb37bbd203714a/jiter-0.10.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:901b92f2e2947dc6dfcb52fd624453862e16665ea909a08398dde19c0731b7f4", size = 522989, upload-time = "2025-05-18T19:04:14.261Z" }, + { url = "https://files.pythonhosted.org/packages/0c/41/9becdb1d8dd5d854142f45a9d71949ed7e87a8e312b0bede2de849388cb9/jiter-0.10.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:d0cb9a125d5a3ec971a094a845eadde2db0de85b33c9f13eb94a0c63d463879e", size = 513495, upload-time = "2025-05-18T19:04:15.603Z" }, + { url = "https://files.pythonhosted.org/packages/9c/36/3468e5a18238bdedae7c4d19461265b5e9b8e288d3f86cd89d00cbb48686/jiter-0.10.0-cp313-cp313-win32.whl", hash = "sha256:48a403277ad1ee208fb930bdf91745e4d2d6e47253eedc96e2559d1e6527006d", size = 211289, upload-time = "2025-05-18T19:04:17.541Z" }, + { url = "https://files.pythonhosted.org/packages/7e/07/1c96b623128bcb913706e294adb5f768fb7baf8db5e1338ce7b4ee8c78ef/jiter-0.10.0-cp313-cp313-win_amd64.whl", hash = "sha256:75f9eb72ecb640619c29bf714e78c9c46c9c4eaafd644bf78577ede459f330d4", size = 205074, upload-time = "2025-05-18T19:04:19.21Z" }, + { url = "https://files.pythonhosted.org/packages/54/46/caa2c1342655f57d8f0f2519774c6d67132205909c65e9aa8255e1d7b4f4/jiter-0.10.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:28ed2a4c05a1f32ef0e1d24c2611330219fed727dae01789f4a335617634b1ca", size = 318225, upload-time = "2025-05-18T19:04:20.583Z" }, + { url = "https://files.pythonhosted.org/packages/43/84/c7d44c75767e18946219ba2d703a5a32ab37b0bc21886a97bc6062e4da42/jiter-0.10.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:14a4c418b1ec86a195f1ca69da8b23e8926c752b685af665ce30777233dfe070", size = 350235, upload-time = "2025-05-18T19:04:22.363Z" }, + { url = "https://files.pythonhosted.org/packages/01/16/f5a0135ccd968b480daad0e6ab34b0c7c5ba3bc447e5088152696140dcb3/jiter-0.10.0-cp313-cp313t-win_amd64.whl", hash = "sha256:d7bfed2fe1fe0e4dda6ef682cee888ba444b21e7a6553e03252e4feb6cf0adca", size = 207278, upload-time = "2025-05-18T19:04:23.627Z" }, + { url = "https://files.pythonhosted.org/packages/1c/9b/1d646da42c3de6c2188fdaa15bce8ecb22b635904fc68be025e21249ba44/jiter-0.10.0-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:5e9251a5e83fab8d87799d3e1a46cb4b7f2919b895c6f4483629ed2446f66522", size = 310866, upload-time = "2025-05-18T19:04:24.891Z" }, + { url = "https://files.pythonhosted.org/packages/ad/0e/26538b158e8a7c7987e94e7aeb2999e2e82b1f9d2e1f6e9874ddf71ebda0/jiter-0.10.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:023aa0204126fe5b87ccbcd75c8a0d0261b9abdbbf46d55e7ae9f8e22424eeb8", size = 318772, upload-time = "2025-05-18T19:04:26.161Z" }, + { url = "https://files.pythonhosted.org/packages/7b/fb/d302893151caa1c2636d6574d213e4b34e31fd077af6050a9c5cbb42f6fb/jiter-0.10.0-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3c189c4f1779c05f75fc17c0c1267594ed918996a231593a21a5ca5438445216", size = 344534, upload-time = "2025-05-18T19:04:27.495Z" }, + { url = "https://files.pythonhosted.org/packages/01/d8/5780b64a149d74e347c5128d82176eb1e3241b1391ac07935693466d6219/jiter-0.10.0-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:15720084d90d1098ca0229352607cd68256c76991f6b374af96f36920eae13c4", size = 369087, upload-time = "2025-05-18T19:04:28.896Z" }, + { url = "https://files.pythonhosted.org/packages/e8/5b/f235a1437445160e777544f3ade57544daf96ba7e96c1a5b24a6f7ac7004/jiter-0.10.0-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e4f2fb68e5f1cfee30e2b2a09549a00683e0fde4c6a2ab88c94072fc33cb7426", size = 490694, upload-time = "2025-05-18T19:04:30.183Z" }, + { url = "https://files.pythonhosted.org/packages/85/a9/9c3d4617caa2ff89cf61b41e83820c27ebb3f7b5fae8a72901e8cd6ff9be/jiter-0.10.0-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ce541693355fc6da424c08b7edf39a2895f58d6ea17d92cc2b168d20907dee12", size = 388992, upload-time = "2025-05-18T19:04:32.028Z" }, + { url = "https://files.pythonhosted.org/packages/68/b1/344fd14049ba5c94526540af7eb661871f9c54d5f5601ff41a959b9a0bbd/jiter-0.10.0-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:31c50c40272e189d50006ad5c73883caabb73d4e9748a688b216e85a9a9ca3b9", size = 351723, upload-time = "2025-05-18T19:04:33.467Z" }, + { url = "https://files.pythonhosted.org/packages/41/89/4c0e345041186f82a31aee7b9d4219a910df672b9fef26f129f0cda07a29/jiter-0.10.0-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:fa3402a2ff9815960e0372a47b75c76979d74402448509ccd49a275fa983ef8a", size = 392215, upload-time = "2025-05-18T19:04:34.827Z" }, + { url = "https://files.pythonhosted.org/packages/55/58/ee607863e18d3f895feb802154a2177d7e823a7103f000df182e0f718b38/jiter-0.10.0-cp314-cp314-musllinux_1_1_aarch64.whl", hash = "sha256:1956f934dca32d7bb647ea21d06d93ca40868b505c228556d3373cbd255ce853", size = 522762, upload-time = "2025-05-18T19:04:36.19Z" }, + { url = "https://files.pythonhosted.org/packages/15/d0/9123fb41825490d16929e73c212de9a42913d68324a8ce3c8476cae7ac9d/jiter-0.10.0-cp314-cp314-musllinux_1_1_x86_64.whl", hash = "sha256:fcedb049bdfc555e261d6f65a6abe1d5ad68825b7202ccb9692636c70fcced86", size = 513427, upload-time = "2025-05-18T19:04:37.544Z" }, + { url = "https://files.pythonhosted.org/packages/d8/b3/2bd02071c5a2430d0b70403a34411fc519c2f227da7b03da9ba6a956f931/jiter-0.10.0-cp314-cp314-win32.whl", hash = "sha256:ac509f7eccca54b2a29daeb516fb95b6f0bd0d0d8084efaf8ed5dfc7b9f0b357", size = 210127, upload-time = "2025-05-18T19:04:38.837Z" }, + { url = "https://files.pythonhosted.org/packages/03/0c/5fe86614ea050c3ecd728ab4035534387cd41e7c1855ef6c031f1ca93e3f/jiter-0.10.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:5ed975b83a2b8639356151cef5c0d597c68376fc4922b45d0eb384ac058cfa00", size = 318527, upload-time = "2025-05-18T19:04:40.612Z" }, + { url = "https://files.pythonhosted.org/packages/b3/4a/4175a563579e884192ba6e81725fc0448b042024419be8d83aa8a80a3f44/jiter-0.10.0-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3aa96f2abba33dc77f79b4cf791840230375f9534e5fac927ccceb58c5e604a5", size = 354213, upload-time = "2025-05-18T19:04:41.894Z" }, ] [[package]] @@ -2410,11 +2461,11 @@ wheels = [ [[package]] name = "joblib" -version = "1.5.0" +version = "1.5.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/30/08/8bd4a0250247861420a040b33ccf42f43c426ac91d99405374ef117e5872/joblib-1.5.0.tar.gz", hash = "sha256:d8757f955389a3dd7a23152e43bc297c2e0c2d3060056dad0feefc88a06939b5", size = 330234, upload-time = "2025-05-03T21:09:39.553Z" } +sdist = { url = "https://files.pythonhosted.org/packages/dc/fe/0f5a938c54105553436dbff7a61dc4fed4b1b2c98852f8833beaf4d5968f/joblib-1.5.1.tar.gz", hash = "sha256:f4f86e351f39fe3d0d32a9f2c3d8af1ee4cec285aafcb27003dda5205576b444", size = 330475, upload-time = "2025-05-23T12:04:37.097Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/da/d3/13ee227a148af1c693654932b8b0b02ed64af5e1f7406d56b088b57574cd/joblib-1.5.0-py3-none-any.whl", hash = "sha256:206144b320246485b712fc8cc51f017de58225fa8b414a1fe1764a7231aca491", size = 307682, upload-time = "2025-05-03T21:09:37.892Z" }, + { url = "https://files.pythonhosted.org/packages/7d/4f/1195bbac8e0c2acc5f740661631d8d750dc38d4a32b23ee5df3cde6f4e0d/joblib-1.5.1-py3-none-any.whl", hash = "sha256:4719a31f054c7d766948dcd83e9613686b27114f190f717cec7eaa2084f8a74a", size = 307746, upload-time = "2025-05-23T12:04:35.124Z" }, ] [[package]] @@ -2684,7 +2735,7 @@ wheels = [ [[package]] name = "mcp" -version = "1.9.0" +version = "1.9.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "anyio", marker = "sys_platform == 'darwin' or sys_platform == 'linux' or sys_platform == 'win32'" }, @@ -2697,9 +2748,9 @@ dependencies = [ { name = "starlette", marker = "sys_platform == 'darwin' or sys_platform == 'linux' or sys_platform == 'win32'" }, { name = "uvicorn", marker = "sys_platform == 'darwin' or sys_platform == 'linux' or sys_platform == 'win32'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/bc/8d/0f4468582e9e97b0a24604b585c651dfd2144300ecffd1c06a680f5c8861/mcp-1.9.0.tar.gz", hash = "sha256:905d8d208baf7e3e71d70c82803b89112e321581bcd2530f9de0fe4103d28749", size = 281432, upload-time = "2025-05-15T18:51:06.615Z" } +sdist = { url = "https://files.pythonhosted.org/packages/e7/bc/54aec2c334698cc575ca3b3481eed627125fb66544152fa1af927b1a495c/mcp-1.9.1.tar.gz", hash = "sha256:19879cd6dde3d763297617242888c2f695a95dfa854386a6a68676a646ce75e4", size = 316247, upload-time = "2025-05-22T15:52:21.26Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/a5/d5/22e36c95c83c80eb47c83f231095419cf57cf5cca5416f1c960032074c78/mcp-1.9.0-py3-none-any.whl", hash = "sha256:9dfb89c8c56f742da10a5910a1f64b0d2ac2c3ed2bd572ddb1cfab7f35957178", size = 125082, upload-time = "2025-05-15T18:51:04.916Z" }, + { url = "https://files.pythonhosted.org/packages/a6/c0/4ac795585a22a0a2d09cd2b1187b0252d2afcdebd01e10a68bbac4d34890/mcp-1.9.1-py3-none-any.whl", hash = "sha256:2900ded8ffafc3c8a7bfcfe8bc5204037e988e753ec398f371663e6a06ecd9a9", size = 130261, upload-time = "2025-05-22T15:52:19.702Z" }, ] [[package]] @@ -2737,7 +2788,7 @@ wheels = [ [[package]] name = "mistralai" -version = "1.7.0" +version = "1.7.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "eval-type-backport", marker = "sys_platform == 'darwin' or sys_platform == 'linux' or sys_platform == 'win32'" }, @@ -2746,9 +2797,9 @@ dependencies = [ { name = "python-dateutil", marker = "sys_platform == 'darwin' or sys_platform == 'linux' or sys_platform == 'win32'" }, { name = "typing-inspection", marker = "sys_platform == 'darwin' or sys_platform == 'linux' or sys_platform == 'win32'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/98/d0/11e0116a02aa88701422ccc048185ed8834754f3b94140bfad09620c9d11/mistralai-1.7.0.tar.gz", hash = "sha256:94e3eb23c1d3ed398a95352062fd8c92993cc3754ed18e9a35b60aa3db0bd103", size = 141981, upload-time = "2025-04-16T19:42:56.703Z" } +sdist = { url = "https://files.pythonhosted.org/packages/1d/34/b819d228f4df173c1bfd42936c2c749f41a13ae0796d03cd55f955426842/mistralai-1.7.1.tar.gz", hash = "sha256:a0cd4632c8aad6d8b90f77713c4049185626ac9b2a0d82484407beef1a9d16f3", size = 142373, upload-time = "2025-05-22T15:08:18.247Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/60/77/eb7519ddfccb6428ac430129e7b42cc662e710cb719f82c0ffe79ab50859/mistralai-1.7.0-py3-none-any.whl", hash = "sha256:e0e75ab8508598d69ae19b14d9d7e905db6259a2de3cf9204946a27e9bf81c5d", size = 301483, upload-time = "2025-04-16T19:42:55.434Z" }, + { url = "https://files.pythonhosted.org/packages/b3/ea/bc40e3c8cf6ac5672eae503601b1f8b766085a9cf07c2e45de4b0481c91f/mistralai-1.7.1-py3-none-any.whl", hash = "sha256:2ca97f9c2adac9509578e8b141a1875bee1d966a8dde4d90ffc05f1b904b0421", size = 302285, upload-time = "2025-05-22T15:08:16.718Z" }, ] [[package]] @@ -2767,16 +2818,8 @@ wheels = [ name = "ml-dtypes" version = "0.4.1" source = { registry = "https://pypi.org/simple" } -resolution-markers = [ - "python_full_version >= '4.0' and sys_platform == 'darwin'", - "python_full_version >= '3.13' and python_full_version < '4.0' and sys_platform == 'darwin'", - "python_full_version >= '4.0' and sys_platform == 'linux'", - "python_full_version >= '3.13' and python_full_version < '4.0' and sys_platform == 'linux'", - "python_full_version >= '4.0' and sys_platform == 'win32'", - "python_full_version >= '3.13' and python_full_version < '4.0' and sys_platform == 'win32'", -] dependencies = [ - { 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 = "numpy", marker = "sys_platform == 'darwin' or sys_platform == 'linux' or sys_platform == 'win32'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/fd/15/76f86faa0902836cc133939732f7611ace68cf54148487a99c539c272dc8/ml_dtypes-0.4.1.tar.gz", hash = "sha256:fad5f2de464fd09127e49b7fd1252b9006fb43d2edc1ff112d390c324af5ca7a", size = 692594, upload-time = "2024-09-13T19:07:11.624Z" } wheels = [ @@ -2794,47 +2837,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/ae/11/a742d3c31b2cc8557a48efdde53427fd5f9caa2fa3c9c27d826e78a66f51/ml_dtypes-0.4.1-cp312-cp312-win_amd64.whl", hash = "sha256:df0fb650d5c582a9e72bb5bd96cfebb2cdb889d89daff621c8fbc60295eba66c", size = 127462, upload-time = "2024-09-13T19:07:04.916Z" }, ] -[[package]] -name = "ml-dtypes" -version = "0.5.1" -source = { registry = "https://pypi.org/simple" } -resolution-markers = [ - "python_full_version < '3.11' and sys_platform == 'darwin'", - "python_full_version == '3.11.*' and sys_platform == 'darwin'", - "python_full_version == '3.12.*' and sys_platform == 'darwin'", - "python_full_version < '3.11' and sys_platform == 'linux'", - "python_full_version == '3.11.*' and sys_platform == 'linux'", - "python_full_version == '3.12.*' and sys_platform == 'linux'", - "python_full_version < '3.11' and sys_platform == 'win32'", - "python_full_version == '3.11.*' and sys_platform == 'win32'", - "python_full_version == '3.12.*' and sys_platform == 'win32'", -] -dependencies = [ - { 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')" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/32/49/6e67c334872d2c114df3020e579f3718c333198f8312290e09ec0216703a/ml_dtypes-0.5.1.tar.gz", hash = "sha256:ac5b58559bb84a95848ed6984eb8013249f90b6bab62aa5acbad876e256002c9", size = 698772, upload-time = "2025-01-07T03:34:55.613Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/f4/88/11ebdbc75445eeb5b6869b708a0d787d1ed812ff86c2170bbfb95febdce1/ml_dtypes-0.5.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:bd73f51957949069573ff783563486339a9285d72e2f36c18e0c1aa9ca7eb190", size = 671450, upload-time = "2025-01-07T03:33:52.724Z" }, - { url = "https://files.pythonhosted.org/packages/a4/a4/9321cae435d6140f9b0e7af8334456a854b60e3a9c6101280a16e3594965/ml_dtypes-0.5.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:810512e2eccdfc3b41eefa3a27402371a3411453a1efc7e9c000318196140fed", size = 4621075, upload-time = "2025-01-07T03:33:54.878Z" }, - { url = "https://files.pythonhosted.org/packages/16/d8/4502e12c6a10d42e13a552e8d97f20198e3cf82a0d1411ad50be56a5077c/ml_dtypes-0.5.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:141b2ea2f20bb10802ddca55d91fe21231ef49715cfc971998e8f2a9838f3dbe", size = 4738414, upload-time = "2025-01-07T03:33:57.709Z" }, - { url = "https://files.pythonhosted.org/packages/6b/7e/bc54ae885e4d702e60a4bf50aa9066ff35e9c66b5213d11091f6bffb3036/ml_dtypes-0.5.1-cp310-cp310-win_amd64.whl", hash = "sha256:26ebcc69d7b779c8f129393e99732961b5cc33fcff84090451f448c89b0e01b4", size = 209718, upload-time = "2025-01-07T03:34:00.585Z" }, - { url = "https://files.pythonhosted.org/packages/c9/fd/691335926126bb9beeb030b61a28f462773dcf16b8e8a2253b599013a303/ml_dtypes-0.5.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:023ce2f502efd4d6c1e0472cc58ce3640d051d40e71e27386bed33901e201327", size = 671448, upload-time = "2025-01-07T03:34:03.153Z" }, - { url = "https://files.pythonhosted.org/packages/ff/a6/63832d91f2feb250d865d069ba1a5d0c686b1f308d1c74ce9764472c5e22/ml_dtypes-0.5.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7000b6e4d8ef07542c05044ec5d8bbae1df083b3f56822c3da63993a113e716f", size = 4625792, upload-time = "2025-01-07T03:34:04.981Z" }, - { url = "https://files.pythonhosted.org/packages/cc/2a/5421fd3dbe6eef9b844cc9d05f568b9fb568503a2e51cb1eb4443d9fc56b/ml_dtypes-0.5.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c09526488c3a9e8b7a23a388d4974b670a9a3dd40c5c8a61db5593ce9b725bab", size = 4743893, upload-time = "2025-01-07T03:34:08.333Z" }, - { url = "https://files.pythonhosted.org/packages/60/30/d3f0fc9499a22801219679a7f3f8d59f1429943c6261f445fb4bfce20718/ml_dtypes-0.5.1-cp311-cp311-win_amd64.whl", hash = "sha256:15ad0f3b0323ce96c24637a88a6f44f6713c64032f27277b069f285c3cf66478", size = 209712, upload-time = "2025-01-07T03:34:12.182Z" }, - { url = "https://files.pythonhosted.org/packages/47/56/1bb21218e1e692506c220ffabd456af9733fba7aa1b14f73899979f4cc20/ml_dtypes-0.5.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:6f462f5eca22fb66d7ff9c4744a3db4463af06c49816c4b6ac89b16bfcdc592e", size = 670372, upload-time = "2025-01-07T03:34:15.258Z" }, - { url = "https://files.pythonhosted.org/packages/20/95/d8bd96a3b60e00bf31bd78ca4bdd2d6bbaf5acb09b42844432d719d34061/ml_dtypes-0.5.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6f76232163b5b9c34291b54621ee60417601e2e4802a188a0ea7157cd9b323f4", size = 4635946, upload-time = "2025-01-07T03:34:20.412Z" }, - { url = "https://files.pythonhosted.org/packages/08/57/5d58fad4124192b1be42f68bd0c0ddaa26e44a730ff8c9337adade2f5632/ml_dtypes-0.5.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ad4953c5eb9c25a56d11a913c2011d7e580a435ef5145f804d98efa14477d390", size = 4694804, upload-time = "2025-01-07T03:34:23.608Z" }, - { url = "https://files.pythonhosted.org/packages/38/bc/c4260e4a6c6bf684d0313308de1c860467275221d5e7daf69b3fcddfdd0b/ml_dtypes-0.5.1-cp312-cp312-win_amd64.whl", hash = "sha256:9626d0bca1fb387d5791ca36bacbba298c5ef554747b7ebeafefb4564fc83566", size = 210853, upload-time = "2025-01-07T03:34:26.027Z" }, - { url = "https://files.pythonhosted.org/packages/0f/92/bb6a3d18e16fddd18ce6d5f480e1919b33338c70e18cba831c6ae59812ee/ml_dtypes-0.5.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:12651420130ee7cc13059fc56dac6ad300c3af3848b802d475148c9defd27c23", size = 667696, upload-time = "2025-01-07T03:34:27.526Z" }, - { url = "https://files.pythonhosted.org/packages/6d/29/cfc89d842767e9a51146043b0fa18332c2b38f8831447e6cb1160e3c6102/ml_dtypes-0.5.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c9945669d3dadf8acb40ec2e57d38c985d8c285ea73af57fc5b09872c516106d", size = 4638365, upload-time = "2025-01-07T03:34:30.43Z" }, - { url = "https://files.pythonhosted.org/packages/be/26/adc36e3ea09603d9f6d114894e1c1b7b8e8a9ef6d0b031cc270c6624a37c/ml_dtypes-0.5.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf9975bda82a99dc935f2ae4c83846d86df8fd6ba179614acac8e686910851da", size = 4702722, upload-time = "2025-01-07T03:34:33.813Z" }, - { url = "https://files.pythonhosted.org/packages/da/8a/a2b9375c94077e5a488a624a195621407846f504068ce22ccf805c674156/ml_dtypes-0.5.1-cp313-cp313-win_amd64.whl", hash = "sha256:fd918d4e6a4e0c110e2e05be7a7814d10dc1b95872accbf6512b80a109b71ae1", size = 210850, upload-time = "2025-01-07T03:34:36.897Z" }, - { url = "https://files.pythonhosted.org/packages/52/38/703169100fdde27957f061d4d0ea3e00525775a09acaccf7e655d9609d55/ml_dtypes-0.5.1-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:05f23447a1c20ddf4dc7c2c661aa9ed93fcb2658f1017c204d1e758714dc28a8", size = 693043, upload-time = "2025-01-07T03:34:38.457Z" }, - { url = "https://files.pythonhosted.org/packages/28/ff/4e234c9c23e0d456f5da5a326c103bf890c746d93351524d987e41f438b3/ml_dtypes-0.5.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1b7fbe5571fdf28fd3aaab3ef4aafc847de9ebf263be959958c1ca58ec8eadf5", size = 4903946, upload-time = "2025-01-07T03:34:40.236Z" }, - { url = "https://files.pythonhosted.org/packages/b7/45/c1a1ccfdd02bc4173ca0f4a2d327683a27df85797b885eb1da1ca325b85c/ml_dtypes-0.5.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d13755f8e8445b3870114e5b6240facaa7cb0c3361e54beba3e07fa912a6e12b", size = 5052731, upload-time = "2025-01-07T03:34:45.308Z" }, -] - [[package]] name = "mmh3" version = "5.1.0" @@ -2965,99 +2967,99 @@ wheels = [ [[package]] name = "multidict" -version = "6.4.3" +version = "6.4.4" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "typing-extensions", marker = "(python_full_version < '3.11' and sys_platform == 'darwin') or (python_full_version < '3.11' and sys_platform == 'linux') or (python_full_version < '3.11' and sys_platform == 'win32')" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/da/2c/e367dfb4c6538614a0c9453e510d75d66099edf1c4e69da1b5ce691a1931/multidict-6.4.3.tar.gz", hash = "sha256:3ada0b058c9f213c5f95ba301f922d402ac234f1111a7d8fd70f1b99f3c281ec", size = 89372, upload-time = "2025-04-10T22:20:17.956Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/83/44/45e798d4cd1b5dfe41ddf36266c7aca6d954e3c7a8b0d599ad555ce2b4f8/multidict-6.4.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:32a998bd8a64ca48616eac5a8c1cc4fa38fb244a3facf2eeb14abe186e0f6cc5", size = 65822, upload-time = "2025-04-10T22:17:32.83Z" }, - { url = "https://files.pythonhosted.org/packages/10/fb/9ea024f928503f8c758f8463759d21958bf27b1f7a1103df73e5022e6a7c/multidict-6.4.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a54ec568f1fc7f3c313c2f3b16e5db346bf3660e1309746e7fccbbfded856188", size = 38706, upload-time = "2025-04-10T22:17:35.028Z" }, - { url = "https://files.pythonhosted.org/packages/6d/eb/7013316febca37414c0e1469fccadcb1a0e4315488f8f57ca5d29b384863/multidict-6.4.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a7be07e5df178430621c716a63151165684d3e9958f2bbfcb644246162007ab7", size = 37979, upload-time = "2025-04-10T22:17:36.626Z" }, - { url = "https://files.pythonhosted.org/packages/64/28/5a7bf4e7422613ea80f9ebc529d3845b20a422cfa94d4355504ac98047ee/multidict-6.4.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b128dbf1c939674a50dd0b28f12c244d90e5015e751a4f339a96c54f7275e291", size = 220233, upload-time = "2025-04-10T22:17:37.807Z" }, - { url = "https://files.pythonhosted.org/packages/52/05/b4c58850f71befde6a16548968b48331a155a80627750b150bb5962e4dea/multidict-6.4.3-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:b9cb19dfd83d35b6ff24a4022376ea6e45a2beba8ef3f0836b8a4b288b6ad685", size = 217762, upload-time = "2025-04-10T22:17:39.493Z" }, - { url = "https://files.pythonhosted.org/packages/99/a3/393e23bba1e9a00f95b3957acd8f5e3ee3446e78c550f593be25f9de0483/multidict-6.4.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3cf62f8e447ea2c1395afa289b332e49e13d07435369b6f4e41f887db65b40bf", size = 230699, upload-time = "2025-04-10T22:17:41.207Z" }, - { url = "https://files.pythonhosted.org/packages/9c/a7/52c63069eb1a079f824257bb8045d93e692fa2eb34d08323d1fdbdfc398a/multidict-6.4.3-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:909f7d43ff8f13d1adccb6a397094adc369d4da794407f8dd592c51cf0eae4b1", size = 226801, upload-time = "2025-04-10T22:17:42.62Z" }, - { url = "https://files.pythonhosted.org/packages/2c/e9/40d2b73e7d6574d91074d83477a990e3701affbe8b596010d4f5e6c7a6fa/multidict-6.4.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0bb8f8302fbc7122033df959e25777b0b7659b1fd6bcb9cb6bed76b5de67afef", size = 219833, upload-time = "2025-04-10T22:17:44.046Z" }, - { url = "https://files.pythonhosted.org/packages/e4/6a/0572b22fe63c632254f55a1c1cb7d29f644002b1d8731d6103a290edc754/multidict-6.4.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:224b79471b4f21169ea25ebc37ed6f058040c578e50ade532e2066562597b8a9", size = 212920, upload-time = "2025-04-10T22:17:45.48Z" }, - { url = "https://files.pythonhosted.org/packages/33/fe/c63735db9dece0053868b2d808bcc2592a83ce1830bc98243852a2b34d42/multidict-6.4.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:a7bd27f7ab3204f16967a6f899b3e8e9eb3362c0ab91f2ee659e0345445e0078", size = 225263, upload-time = "2025-04-10T22:17:47.203Z" }, - { url = "https://files.pythonhosted.org/packages/47/c2/2db296d64d41525110c27ed38fadd5eb571c6b936233e75a5ea61b14e337/multidict-6.4.3-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:99592bd3162e9c664671fd14e578a33bfdba487ea64bcb41d281286d3c870ad7", size = 214249, upload-time = "2025-04-10T22:17:48.95Z" }, - { url = "https://files.pythonhosted.org/packages/7e/74/8bc26e54c79f9a0f111350b1b28a9cacaaee53ecafccd53c90e59754d55a/multidict-6.4.3-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:a62d78a1c9072949018cdb05d3c533924ef8ac9bcb06cbf96f6d14772c5cd451", size = 221650, upload-time = "2025-04-10T22:17:50.265Z" }, - { url = "https://files.pythonhosted.org/packages/af/d7/2ce87606e3799d9a08a941f4c170930a9895886ea8bd0eca75c44baeebe3/multidict-6.4.3-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:3ccdde001578347e877ca4f629450973c510e88e8865d5aefbcb89b852ccc666", size = 231235, upload-time = "2025-04-10T22:17:51.579Z" }, - { url = "https://files.pythonhosted.org/packages/07/e1/d191a7ad3b90c613fc4b130d07a41c380e249767586148709b54d006ca17/multidict-6.4.3-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:eccb67b0e78aa2e38a04c5ecc13bab325a43e5159a181a9d1a6723db913cbb3c", size = 226056, upload-time = "2025-04-10T22:17:53.092Z" }, - { url = "https://files.pythonhosted.org/packages/24/05/a57490cf6a8d5854f4af2d17dfc54924f37fbb683986e133b76710a36079/multidict-6.4.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:8b6fcf6054fc4114a27aa865f8840ef3d675f9316e81868e0ad5866184a6cba5", size = 220014, upload-time = "2025-04-10T22:17:54.729Z" }, - { url = "https://files.pythonhosted.org/packages/5c/b1/be04fa9f08c684e9e27cca85b4ab94c10f017ec07c4c631af9c8c10bb275/multidict-6.4.3-cp310-cp310-win32.whl", hash = "sha256:f92c7f62d59373cd93bc9969d2da9b4b21f78283b1379ba012f7ee8127b3152e", size = 35042, upload-time = "2025-04-10T22:17:56.615Z" }, - { url = "https://files.pythonhosted.org/packages/d9/ca/8888f99892513001fa900eef11bafbf38ff3485109510487de009da85748/multidict-6.4.3-cp310-cp310-win_amd64.whl", hash = "sha256:b57e28dbc031d13916b946719f213c494a517b442d7b48b29443e79610acd887", size = 38506, upload-time = "2025-04-10T22:17:58.119Z" }, - { url = "https://files.pythonhosted.org/packages/16/e0/53cf7f27eda48fffa53cfd4502329ed29e00efb9e4ce41362cbf8aa54310/multidict-6.4.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:f6f19170197cc29baccd33ccc5b5d6a331058796485857cf34f7635aa25fb0cd", size = 65259, upload-time = "2025-04-10T22:17:59.632Z" }, - { url = "https://files.pythonhosted.org/packages/44/79/1dcd93ce7070cf01c2ee29f781c42b33c64fce20033808f1cc9ec8413d6e/multidict-6.4.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f2882bf27037eb687e49591690e5d491e677272964f9ec7bc2abbe09108bdfb8", size = 38451, upload-time = "2025-04-10T22:18:01.202Z" }, - { url = "https://files.pythonhosted.org/packages/f4/35/2292cf29ab5f0d0b3613fad1b75692148959d3834d806be1885ceb49a8ff/multidict-6.4.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:fbf226ac85f7d6b6b9ba77db4ec0704fde88463dc17717aec78ec3c8546c70ad", size = 37706, upload-time = "2025-04-10T22:18:02.276Z" }, - { url = "https://files.pythonhosted.org/packages/f6/d1/6b157110b2b187b5a608b37714acb15ee89ec773e3800315b0107ea648cd/multidict-6.4.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2e329114f82ad4b9dd291bef614ea8971ec119ecd0f54795109976de75c9a852", size = 226669, upload-time = "2025-04-10T22:18:03.436Z" }, - { url = "https://files.pythonhosted.org/packages/40/7f/61a476450651f177c5570e04bd55947f693077ba7804fe9717ee9ae8de04/multidict-6.4.3-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:1f4e0334d7a555c63f5c8952c57ab6f1c7b4f8c7f3442df689fc9f03df315c08", size = 223182, upload-time = "2025-04-10T22:18:04.922Z" }, - { url = "https://files.pythonhosted.org/packages/51/7b/eaf7502ac4824cdd8edcf5723e2e99f390c879866aec7b0c420267b53749/multidict-6.4.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:740915eb776617b57142ce0bb13b7596933496e2f798d3d15a20614adf30d229", size = 235025, upload-time = "2025-04-10T22:18:06.274Z" }, - { url = "https://files.pythonhosted.org/packages/3b/f6/facdbbd73c96b67a93652774edd5778ab1167854fa08ea35ad004b1b70ad/multidict-6.4.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:255dac25134d2b141c944b59a0d2f7211ca12a6d4779f7586a98b4b03ea80508", size = 231481, upload-time = "2025-04-10T22:18:07.742Z" }, - { url = "https://files.pythonhosted.org/packages/70/57/c008e861b3052405eebf921fd56a748322d8c44dcfcab164fffbccbdcdc4/multidict-6.4.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d4e8535bd4d741039b5aad4285ecd9b902ef9e224711f0b6afda6e38d7ac02c7", size = 223492, upload-time = "2025-04-10T22:18:09.095Z" }, - { url = "https://files.pythonhosted.org/packages/30/4d/7d8440d3a12a6ae5d6b202d6e7f2ac6ab026e04e99aaf1b73f18e6bc34bc/multidict-6.4.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:30c433a33be000dd968f5750722eaa0991037be0be4a9d453eba121774985bc8", size = 217279, upload-time = "2025-04-10T22:18:10.474Z" }, - { url = "https://files.pythonhosted.org/packages/7f/e7/bca0df4dd057597b94138d2d8af04eb3c27396a425b1b0a52e082f9be621/multidict-6.4.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:4eb33b0bdc50acd538f45041f5f19945a1f32b909b76d7b117c0c25d8063df56", size = 228733, upload-time = "2025-04-10T22:18:11.793Z" }, - { url = "https://files.pythonhosted.org/packages/88/f5/383827c3f1c38d7c92dbad00a8a041760228573b1c542fbf245c37bbca8a/multidict-6.4.3-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:75482f43465edefd8a5d72724887ccdcd0c83778ded8f0cb1e0594bf71736cc0", size = 218089, upload-time = "2025-04-10T22:18:13.153Z" }, - { url = "https://files.pythonhosted.org/packages/36/8a/a5174e8a7d8b94b4c8f9c1e2cf5d07451f41368ffe94d05fc957215b8e72/multidict-6.4.3-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:ce5b3082e86aee80b3925ab4928198450d8e5b6466e11501fe03ad2191c6d777", size = 225257, upload-time = "2025-04-10T22:18:14.654Z" }, - { url = "https://files.pythonhosted.org/packages/8c/76/1d4b7218f0fd00b8e5c90b88df2e45f8af127f652f4e41add947fa54c1c4/multidict-6.4.3-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:e413152e3212c4d39f82cf83c6f91be44bec9ddea950ce17af87fbf4e32ca6b2", size = 234728, upload-time = "2025-04-10T22:18:16.236Z" }, - { url = "https://files.pythonhosted.org/packages/64/44/18372a4f6273fc7ca25630d7bf9ae288cde64f29593a078bff450c7170b6/multidict-6.4.3-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:8aac2eeff69b71f229a405c0a4b61b54bade8e10163bc7b44fcd257949620618", size = 230087, upload-time = "2025-04-10T22:18:17.979Z" }, - { url = "https://files.pythonhosted.org/packages/0f/ae/28728c314a698d8a6d9491fcacc897077348ec28dd85884d09e64df8a855/multidict-6.4.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:ab583ac203af1d09034be41458feeab7863c0635c650a16f15771e1386abf2d7", size = 223137, upload-time = "2025-04-10T22:18:19.362Z" }, - { url = "https://files.pythonhosted.org/packages/22/50/785bb2b3fe16051bc91c70a06a919f26312da45c34db97fc87441d61e343/multidict-6.4.3-cp311-cp311-win32.whl", hash = "sha256:1b2019317726f41e81154df636a897de1bfe9228c3724a433894e44cd2512378", size = 34959, upload-time = "2025-04-10T22:18:20.728Z" }, - { url = "https://files.pythonhosted.org/packages/2f/63/2a22e099ae2f4d92897618c00c73a09a08a2a9aa14b12736965bf8d59fd3/multidict-6.4.3-cp311-cp311-win_amd64.whl", hash = "sha256:43173924fa93c7486402217fab99b60baf78d33806af299c56133a3755f69589", size = 38541, upload-time = "2025-04-10T22:18:22.001Z" }, - { url = "https://files.pythonhosted.org/packages/fc/bb/3abdaf8fe40e9226ce8a2ba5ecf332461f7beec478a455d6587159f1bf92/multidict-6.4.3-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:1f1c2f58f08b36f8475f3ec6f5aeb95270921d418bf18f90dffd6be5c7b0e676", size = 64019, upload-time = "2025-04-10T22:18:23.174Z" }, - { url = "https://files.pythonhosted.org/packages/7e/b5/1b2e8de8217d2e89db156625aa0fe4a6faad98972bfe07a7b8c10ef5dd6b/multidict-6.4.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:26ae9ad364fc61b936fb7bf4c9d8bd53f3a5b4417142cd0be5c509d6f767e2f1", size = 37925, upload-time = "2025-04-10T22:18:24.834Z" }, - { url = "https://files.pythonhosted.org/packages/b4/e2/3ca91c112644a395c8eae017144c907d173ea910c913ff8b62549dcf0bbf/multidict-6.4.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:659318c6c8a85f6ecfc06b4e57529e5a78dfdd697260cc81f683492ad7e9435a", size = 37008, upload-time = "2025-04-10T22:18:26.069Z" }, - { url = "https://files.pythonhosted.org/packages/60/23/79bc78146c7ac8d1ac766b2770ca2e07c2816058b8a3d5da6caed8148637/multidict-6.4.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e1eb72c741fd24d5a28242ce72bb61bc91f8451877131fa3fe930edb195f7054", size = 224374, upload-time = "2025-04-10T22:18:27.714Z" }, - { url = "https://files.pythonhosted.org/packages/86/35/77950ed9ebd09136003a85c1926ba42001ca5be14feb49710e4334ee199b/multidict-6.4.3-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:3cd06d88cb7398252284ee75c8db8e680aa0d321451132d0dba12bc995f0adcc", size = 230869, upload-time = "2025-04-10T22:18:29.162Z" }, - { url = "https://files.pythonhosted.org/packages/49/97/2a33c6e7d90bc116c636c14b2abab93d6521c0c052d24bfcc231cbf7f0e7/multidict-6.4.3-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4543d8dc6470a82fde92b035a92529317191ce993533c3c0c68f56811164ed07", size = 231949, upload-time = "2025-04-10T22:18:30.679Z" }, - { url = "https://files.pythonhosted.org/packages/56/ce/e9b5d9fcf854f61d6686ada7ff64893a7a5523b2a07da6f1265eaaea5151/multidict-6.4.3-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:30a3ebdc068c27e9d6081fca0e2c33fdf132ecea703a72ea216b81a66860adde", size = 231032, upload-time = "2025-04-10T22:18:32.146Z" }, - { url = "https://files.pythonhosted.org/packages/f0/ac/7ced59dcdfeddd03e601edb05adff0c66d81ed4a5160c443e44f2379eef0/multidict-6.4.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b038f10e23f277153f86f95c777ba1958bcd5993194fda26a1d06fae98b2f00c", size = 223517, upload-time = "2025-04-10T22:18:33.538Z" }, - { url = "https://files.pythonhosted.org/packages/db/e6/325ed9055ae4e085315193a1b58bdb4d7fc38ffcc1f4975cfca97d015e17/multidict-6.4.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c605a2b2dc14282b580454b9b5d14ebe0668381a3a26d0ac39daa0ca115eb2ae", size = 216291, upload-time = "2025-04-10T22:18:34.962Z" }, - { url = "https://files.pythonhosted.org/packages/fa/84/eeee6d477dd9dcb7691c3bb9d08df56017f5dd15c730bcc9383dcf201cf4/multidict-6.4.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:8bd2b875f4ca2bb527fe23e318ddd509b7df163407b0fb717df229041c6df5d3", size = 228982, upload-time = "2025-04-10T22:18:36.443Z" }, - { url = "https://files.pythonhosted.org/packages/82/94/4d1f3e74e7acf8b0c85db350e012dcc61701cd6668bc2440bb1ecb423c90/multidict-6.4.3-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:c2e98c840c9c8e65c0e04b40c6c5066c8632678cd50c8721fdbcd2e09f21a507", size = 226823, upload-time = "2025-04-10T22:18:37.924Z" }, - { url = "https://files.pythonhosted.org/packages/09/f0/1e54b95bda7cd01080e5732f9abb7b76ab5cc795b66605877caeb2197476/multidict-6.4.3-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:66eb80dd0ab36dbd559635e62fba3083a48a252633164857a1d1684f14326427", size = 222714, upload-time = "2025-04-10T22:18:39.807Z" }, - { url = "https://files.pythonhosted.org/packages/e7/a2/f6cbca875195bd65a3e53b37ab46486f3cc125bdeab20eefe5042afa31fb/multidict-6.4.3-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:c23831bdee0a2a3cf21be057b5e5326292f60472fb6c6f86392bbf0de70ba731", size = 233739, upload-time = "2025-04-10T22:18:41.341Z" }, - { url = "https://files.pythonhosted.org/packages/79/68/9891f4d2b8569554723ddd6154375295f789dc65809826c6fb96a06314fd/multidict-6.4.3-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:1535cec6443bfd80d028052e9d17ba6ff8a5a3534c51d285ba56c18af97e9713", size = 230809, upload-time = "2025-04-10T22:18:42.817Z" }, - { url = "https://files.pythonhosted.org/packages/e6/72/a7be29ba1e87e4fc5ceb44dabc7940b8005fd2436a332a23547709315f70/multidict-6.4.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:3b73e7227681f85d19dec46e5b881827cd354aabe46049e1a61d2f9aaa4e285a", size = 226934, upload-time = "2025-04-10T22:18:44.311Z" }, - { url = "https://files.pythonhosted.org/packages/12/c1/259386a9ad6840ff7afc686da96808b503d152ac4feb3a96c651dc4f5abf/multidict-6.4.3-cp312-cp312-win32.whl", hash = "sha256:8eac0c49df91b88bf91f818e0a24c1c46f3622978e2c27035bfdca98e0e18124", size = 35242, upload-time = "2025-04-10T22:18:46.193Z" }, - { url = "https://files.pythonhosted.org/packages/06/24/c8fdff4f924d37225dc0c56a28b1dca10728fc2233065fafeb27b4b125be/multidict-6.4.3-cp312-cp312-win_amd64.whl", hash = "sha256:11990b5c757d956cd1db7cb140be50a63216af32cd6506329c2c59d732d802db", size = 38635, upload-time = "2025-04-10T22:18:47.498Z" }, - { url = "https://files.pythonhosted.org/packages/6c/4b/86fd786d03915c6f49998cf10cd5fe6b6ac9e9a071cb40885d2e080fb90d/multidict-6.4.3-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:7a76534263d03ae0cfa721fea40fd2b5b9d17a6f85e98025931d41dc49504474", size = 63831, upload-time = "2025-04-10T22:18:48.748Z" }, - { url = "https://files.pythonhosted.org/packages/45/05/9b51fdf7aef2563340a93be0a663acba2c428c4daeaf3960d92d53a4a930/multidict-6.4.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:805031c2f599eee62ac579843555ed1ce389ae00c7e9f74c2a1b45e0564a88dd", size = 37888, upload-time = "2025-04-10T22:18:50.021Z" }, - { url = "https://files.pythonhosted.org/packages/0b/43/53fc25394386c911822419b522181227ca450cf57fea76e6188772a1bd91/multidict-6.4.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:c56c179839d5dcf51d565132185409d1d5dd8e614ba501eb79023a6cab25576b", size = 36852, upload-time = "2025-04-10T22:18:51.246Z" }, - { url = "https://files.pythonhosted.org/packages/8a/68/7b99c751e822467c94a235b810a2fd4047d4ecb91caef6b5c60116991c4b/multidict-6.4.3-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9c64f4ddb3886dd8ab71b68a7431ad4aa01a8fa5be5b11543b29674f29ca0ba3", size = 223644, upload-time = "2025-04-10T22:18:52.965Z" }, - { url = "https://files.pythonhosted.org/packages/80/1b/d458d791e4dd0f7e92596667784fbf99e5c8ba040affe1ca04f06b93ae92/multidict-6.4.3-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:3002a856367c0b41cad6784f5b8d3ab008eda194ed7864aaa58f65312e2abcac", size = 230446, upload-time = "2025-04-10T22:18:54.509Z" }, - { url = "https://files.pythonhosted.org/packages/e2/46/9793378d988905491a7806d8987862dc5a0bae8a622dd896c4008c7b226b/multidict-6.4.3-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3d75e621e7d887d539d6e1d789f0c64271c250276c333480a9e1de089611f790", size = 231070, upload-time = "2025-04-10T22:18:56.019Z" }, - { url = "https://files.pythonhosted.org/packages/a7/b8/b127d3e1f8dd2a5bf286b47b24567ae6363017292dc6dec44656e6246498/multidict-6.4.3-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:995015cf4a3c0d72cbf453b10a999b92c5629eaf3a0c3e1efb4b5c1f602253bb", size = 229956, upload-time = "2025-04-10T22:18:59.146Z" }, - { url = "https://files.pythonhosted.org/packages/0c/93/f70a4c35b103fcfe1443059a2bb7f66e5c35f2aea7804105ff214f566009/multidict-6.4.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a2b0fabae7939d09d7d16a711468c385272fa1b9b7fb0d37e51143585d8e72e0", size = 222599, upload-time = "2025-04-10T22:19:00.657Z" }, - { url = "https://files.pythonhosted.org/packages/63/8c/e28e0eb2fe34921d6aa32bfc4ac75b09570b4d6818cc95d25499fe08dc1d/multidict-6.4.3-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:61ed4d82f8a1e67eb9eb04f8587970d78fe7cddb4e4d6230b77eda23d27938f9", size = 216136, upload-time = "2025-04-10T22:19:02.244Z" }, - { url = "https://files.pythonhosted.org/packages/72/f5/fbc81f866585b05f89f99d108be5d6ad170e3b6c4d0723d1a2f6ba5fa918/multidict-6.4.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:062428944a8dc69df9fdc5d5fc6279421e5f9c75a9ee3f586f274ba7b05ab3c8", size = 228139, upload-time = "2025-04-10T22:19:04.151Z" }, - { url = "https://files.pythonhosted.org/packages/bb/ba/7d196bad6b85af2307d81f6979c36ed9665f49626f66d883d6c64d156f78/multidict-6.4.3-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:b90e27b4674e6c405ad6c64e515a505c6d113b832df52fdacb6b1ffd1fa9a1d1", size = 226251, upload-time = "2025-04-10T22:19:06.117Z" }, - { url = "https://files.pythonhosted.org/packages/cc/e2/fae46a370dce79d08b672422a33df721ec8b80105e0ea8d87215ff6b090d/multidict-6.4.3-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:7d50d4abf6729921e9613d98344b74241572b751c6b37feed75fb0c37bd5a817", size = 221868, upload-time = "2025-04-10T22:19:07.981Z" }, - { url = "https://files.pythonhosted.org/packages/26/20/bbc9a3dec19d5492f54a167f08546656e7aef75d181d3d82541463450e88/multidict-6.4.3-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:43fe10524fb0a0514be3954be53258e61d87341008ce4914f8e8b92bee6f875d", size = 233106, upload-time = "2025-04-10T22:19:09.5Z" }, - { url = "https://files.pythonhosted.org/packages/ee/8d/f30ae8f5ff7a2461177f4d8eb0d8f69f27fb6cfe276b54ec4fd5a282d918/multidict-6.4.3-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:236966ca6c472ea4e2d3f02f6673ebfd36ba3f23159c323f5a496869bc8e47c9", size = 230163, upload-time = "2025-04-10T22:19:11Z" }, - { url = "https://files.pythonhosted.org/packages/15/e9/2833f3c218d3c2179f3093f766940ded6b81a49d2e2f9c46ab240d23dfec/multidict-6.4.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:422a5ec315018e606473ba1f5431e064cf8b2a7468019233dcf8082fabad64c8", size = 225906, upload-time = "2025-04-10T22:19:12.875Z" }, - { url = "https://files.pythonhosted.org/packages/f1/31/6edab296ac369fd286b845fa5dd4c409e63bc4655ed8c9510fcb477e9ae9/multidict-6.4.3-cp313-cp313-win32.whl", hash = "sha256:f901a5aace8e8c25d78960dcc24c870c8d356660d3b49b93a78bf38eb682aac3", size = 35238, upload-time = "2025-04-10T22:19:14.41Z" }, - { url = "https://files.pythonhosted.org/packages/23/57/2c0167a1bffa30d9a1383c3dab99d8caae985defc8636934b5668830d2ef/multidict-6.4.3-cp313-cp313-win_amd64.whl", hash = "sha256:1c152c49e42277bc9a2f7b78bd5fa10b13e88d1b0328221e7aef89d5c60a99a5", size = 38799, upload-time = "2025-04-10T22:19:15.869Z" }, - { url = "https://files.pythonhosted.org/packages/c9/13/2ead63b9ab0d2b3080819268acb297bd66e238070aa8d42af12b08cbee1c/multidict-6.4.3-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:be8751869e28b9c0d368d94f5afcb4234db66fe8496144547b4b6d6a0645cfc6", size = 68642, upload-time = "2025-04-10T22:19:17.527Z" }, - { url = "https://files.pythonhosted.org/packages/85/45/f1a751e1eede30c23951e2ae274ce8fad738e8a3d5714be73e0a41b27b16/multidict-6.4.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:0d4b31f8a68dccbcd2c0ea04f0e014f1defc6b78f0eb8b35f2265e8716a6df0c", size = 40028, upload-time = "2025-04-10T22:19:19.465Z" }, - { url = "https://files.pythonhosted.org/packages/a7/29/fcc53e886a2cc5595cc4560df333cb9630257bda65003a7eb4e4e0d8f9c1/multidict-6.4.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:032efeab3049e37eef2ff91271884303becc9e54d740b492a93b7e7266e23756", size = 39424, upload-time = "2025-04-10T22:19:20.762Z" }, - { url = "https://files.pythonhosted.org/packages/f6/f0/056c81119d8b88703971f937b371795cab1407cd3c751482de5bfe1a04a9/multidict-6.4.3-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9e78006af1a7c8a8007e4f56629d7252668344442f66982368ac06522445e375", size = 226178, upload-time = "2025-04-10T22:19:22.17Z" }, - { url = "https://files.pythonhosted.org/packages/a3/79/3b7e5fea0aa80583d3a69c9d98b7913dfd4fbc341fb10bb2fb48d35a9c21/multidict-6.4.3-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:daeac9dd30cda8703c417e4fddccd7c4dc0c73421a0b54a7da2713be125846be", size = 222617, upload-time = "2025-04-10T22:19:23.773Z" }, - { url = "https://files.pythonhosted.org/packages/06/db/3ed012b163e376fc461e1d6a67de69b408339bc31dc83d39ae9ec3bf9578/multidict-6.4.3-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1f6f90700881438953eae443a9c6f8a509808bc3b185246992c4233ccee37fea", size = 227919, upload-time = "2025-04-10T22:19:25.35Z" }, - { url = "https://files.pythonhosted.org/packages/b1/db/0433c104bca380989bc04d3b841fc83e95ce0c89f680e9ea4251118b52b6/multidict-6.4.3-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f84627997008390dd15762128dcf73c3365f4ec0106739cde6c20a07ed198ec8", size = 226097, upload-time = "2025-04-10T22:19:27.183Z" }, - { url = "https://files.pythonhosted.org/packages/c2/95/910db2618175724dd254b7ae635b6cd8d2947a8b76b0376de7b96d814dab/multidict-6.4.3-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3307b48cd156153b117c0ea54890a3bdbf858a5b296ddd40dc3852e5f16e9b02", size = 220706, upload-time = "2025-04-10T22:19:28.882Z" }, - { url = "https://files.pythonhosted.org/packages/d1/af/aa176c6f5f1d901aac957d5258d5e22897fe13948d1e69063ae3d5d0ca01/multidict-6.4.3-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ead46b0fa1dcf5af503a46e9f1c2e80b5d95c6011526352fa5f42ea201526124", size = 211728, upload-time = "2025-04-10T22:19:30.481Z" }, - { url = "https://files.pythonhosted.org/packages/e7/42/d51cc5fc1527c3717d7f85137d6c79bb7a93cd214c26f1fc57523774dbb5/multidict-6.4.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:1748cb2743bedc339d63eb1bca314061568793acd603a6e37b09a326334c9f44", size = 226276, upload-time = "2025-04-10T22:19:32.454Z" }, - { url = "https://files.pythonhosted.org/packages/28/6b/d836dea45e0b8432343ba4acf9a8ecaa245da4c0960fb7ab45088a5e568a/multidict-6.4.3-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:acc9fa606f76fc111b4569348cc23a771cb52c61516dcc6bcef46d612edb483b", size = 212069, upload-time = "2025-04-10T22:19:34.17Z" }, - { url = "https://files.pythonhosted.org/packages/55/34/0ee1a7adb3560e18ee9289c6e5f7db54edc312b13e5c8263e88ea373d12c/multidict-6.4.3-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:31469d5832b5885adeb70982e531ce86f8c992334edd2f2254a10fa3182ac504", size = 217858, upload-time = "2025-04-10T22:19:35.879Z" }, - { url = "https://files.pythonhosted.org/packages/04/08/586d652c2f5acefe0cf4e658eedb4d71d4ba6dfd4f189bd81b400fc1bc6b/multidict-6.4.3-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:ba46b51b6e51b4ef7bfb84b82f5db0dc5e300fb222a8a13b8cd4111898a869cf", size = 226988, upload-time = "2025-04-10T22:19:37.434Z" }, - { url = "https://files.pythonhosted.org/packages/82/e3/cc59c7e2bc49d7f906fb4ffb6d9c3a3cf21b9f2dd9c96d05bef89c2b1fd1/multidict-6.4.3-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:389cfefb599edf3fcfd5f64c0410da686f90f5f5e2c4d84e14f6797a5a337af4", size = 220435, upload-time = "2025-04-10T22:19:39.005Z" }, - { url = "https://files.pythonhosted.org/packages/e0/32/5c3a556118aca9981d883f38c4b1bfae646f3627157f70f4068e5a648955/multidict-6.4.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:64bc2bbc5fba7b9db5c2c8d750824f41c6994e3882e6d73c903c2afa78d091e4", size = 221494, upload-time = "2025-04-10T22:19:41.447Z" }, - { url = "https://files.pythonhosted.org/packages/b9/3b/1599631f59024b75c4d6e3069f4502409970a336647502aaf6b62fb7ac98/multidict-6.4.3-cp313-cp313t-win32.whl", hash = "sha256:0ecdc12ea44bab2807d6b4a7e5eef25109ab1c82a8240d86d3c1fc9f3b72efd5", size = 41775, upload-time = "2025-04-10T22:19:43.707Z" }, - { url = "https://files.pythonhosted.org/packages/e8/4e/09301668d675d02ca8e8e1a3e6be046619e30403f5ada2ed5b080ae28d02/multidict-6.4.3-cp313-cp313t-win_amd64.whl", hash = "sha256:7146a8742ea71b5d7d955bffcef58a9e6e04efba704b52a460134fefd10a8208", size = 45946, upload-time = "2025-04-10T22:19:45.071Z" }, - { url = "https://files.pythonhosted.org/packages/96/10/7d526c8974f017f1e7ca584c71ee62a638e9334d8d33f27d7cdfc9ae79e4/multidict-6.4.3-py3-none-any.whl", hash = "sha256:59fe01ee8e2a1e8ceb3f6dbb216b09c8d9f4ef1c22c4fc825d045a147fa2ebc9", size = 10400, upload-time = "2025-04-10T22:20:16.445Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/91/2f/a3470242707058fe856fe59241eee5635d79087100b7042a867368863a27/multidict-6.4.4.tar.gz", hash = "sha256:69ee9e6ba214b5245031b76233dd95408a0fd57fdb019ddcc1ead4790932a8e8", size = 90183, upload-time = "2025-05-19T14:16:37.381Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1f/92/0926a5baafa164b5d0ade3cd7932be39310375d7e25c9d7ceca05cb26a45/multidict-6.4.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:8adee3ac041145ffe4488ea73fa0a622b464cc25340d98be76924d0cda8545ff", size = 66052, upload-time = "2025-05-19T14:13:49.944Z" }, + { url = "https://files.pythonhosted.org/packages/b2/54/8a857ae4f8f643ec444d91f419fdd49cc7a90a2ca0e42d86482b604b63bd/multidict-6.4.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b61e98c3e2a861035aaccd207da585bdcacef65fe01d7a0d07478efac005e028", size = 38867, upload-time = "2025-05-19T14:13:51.92Z" }, + { url = "https://files.pythonhosted.org/packages/9e/5f/63add9069f945c19bc8b217ea6b0f8a1ad9382eab374bb44fae4354b3baf/multidict-6.4.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:75493f28dbadecdbb59130e74fe935288813301a8554dc32f0c631b6bdcdf8b0", size = 38138, upload-time = "2025-05-19T14:13:53.778Z" }, + { url = "https://files.pythonhosted.org/packages/97/8b/fbd9c0fc13966efdb4a47f5bcffff67a4f2a3189fbeead5766eaa4250b20/multidict-6.4.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4ffc3c6a37e048b5395ee235e4a2a0d639c2349dffa32d9367a42fc20d399772", size = 220433, upload-time = "2025-05-19T14:13:55.346Z" }, + { url = "https://files.pythonhosted.org/packages/a9/c4/5132b2d75b3ea2daedb14d10f91028f09f74f5b4d373b242c1b8eec47571/multidict-6.4.4-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:87cb72263946b301570b0f63855569a24ee8758aaae2cd182aae7d95fbc92ca7", size = 218059, upload-time = "2025-05-19T14:13:56.993Z" }, + { url = "https://files.pythonhosted.org/packages/1a/70/f1e818c7a29b908e2d7b4fafb1d7939a41c64868e79de2982eea0a13193f/multidict-6.4.4-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9bbf7bd39822fd07e3609b6b4467af4c404dd2b88ee314837ad1830a7f4a8299", size = 231120, upload-time = "2025-05-19T14:13:58.333Z" }, + { url = "https://files.pythonhosted.org/packages/b4/7e/95a194d85f27d5ef9cbe48dff9ded722fc6d12fedf641ec6e1e680890be7/multidict-6.4.4-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d1f7cbd4f1f44ddf5fd86a8675b7679176eae770f2fc88115d6dddb6cefb59bc", size = 227457, upload-time = "2025-05-19T14:13:59.663Z" }, + { url = "https://files.pythonhosted.org/packages/25/2b/590ad220968d1babb42f265debe7be5c5c616df6c5688c995a06d8a9b025/multidict-6.4.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bb5ac9e5bfce0e6282e7f59ff7b7b9a74aa8e5c60d38186a4637f5aa764046ad", size = 219111, upload-time = "2025-05-19T14:14:01.019Z" }, + { url = "https://files.pythonhosted.org/packages/e0/f0/b07682b995d3fb5313f339b59d7de02db19ba0c02d1f77c27bdf8212d17c/multidict-6.4.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4efc31dfef8c4eeb95b6b17d799eedad88c4902daba39ce637e23a17ea078915", size = 213012, upload-time = "2025-05-19T14:14:02.396Z" }, + { url = "https://files.pythonhosted.org/packages/24/56/c77b5f36feef2ec92f1119756e468ac9c3eebc35aa8a4c9e51df664cbbc9/multidict-6.4.4-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:9fcad2945b1b91c29ef2b4050f590bfcb68d8ac8e0995a74e659aa57e8d78e01", size = 225408, upload-time = "2025-05-19T14:14:04.826Z" }, + { url = "https://files.pythonhosted.org/packages/cc/b3/e8189b82af9b198b47bc637766208fc917189eea91d674bad417e657bbdf/multidict-6.4.4-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:d877447e7368c7320832acb7159557e49b21ea10ffeb135c1077dbbc0816b598", size = 214396, upload-time = "2025-05-19T14:14:06.187Z" }, + { url = "https://files.pythonhosted.org/packages/20/e0/200d14c84e35ae13ee99fd65dc106e1a1acb87a301f15e906fc7d5b30c17/multidict-6.4.4-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:33a12ebac9f380714c298cbfd3e5b9c0c4e89c75fe612ae496512ee51028915f", size = 222237, upload-time = "2025-05-19T14:14:07.778Z" }, + { url = "https://files.pythonhosted.org/packages/13/f3/bb3df40045ca8262694a3245298732ff431dc781414a89a6a364ebac6840/multidict-6.4.4-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:0f14ea68d29b43a9bf37953881b1e3eb75b2739e896ba4a6aa4ad4c5b9ffa145", size = 231425, upload-time = "2025-05-19T14:14:09.516Z" }, + { url = "https://files.pythonhosted.org/packages/85/3b/538563dc18514384dac169bcba938753ad9ab4d4c8d49b55d6ae49fb2579/multidict-6.4.4-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:0327ad2c747a6600e4797d115d3c38a220fdb28e54983abe8964fd17e95ae83c", size = 226251, upload-time = "2025-05-19T14:14:10.82Z" }, + { url = "https://files.pythonhosted.org/packages/56/79/77e1a65513f09142358f1beb1d4cbc06898590b34a7de2e47023e3c5a3a2/multidict-6.4.4-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:d1a20707492db9719a05fc62ee215fd2c29b22b47c1b1ba347f9abc831e26683", size = 220363, upload-time = "2025-05-19T14:14:12.638Z" }, + { url = "https://files.pythonhosted.org/packages/16/57/67b0516c3e348f8daaa79c369b3de4359a19918320ab82e2e586a1c624ef/multidict-6.4.4-cp310-cp310-win32.whl", hash = "sha256:d83f18315b9fca5db2452d1881ef20f79593c4aa824095b62cb280019ef7aa3d", size = 35175, upload-time = "2025-05-19T14:14:14.805Z" }, + { url = "https://files.pythonhosted.org/packages/86/5a/4ed8fec642d113fa653777cda30ef67aa5c8a38303c091e24c521278a6c6/multidict-6.4.4-cp310-cp310-win_amd64.whl", hash = "sha256:9c17341ee04545fd962ae07330cb5a39977294c883485c8d74634669b1f7fe04", size = 38678, upload-time = "2025-05-19T14:14:16.949Z" }, + { url = "https://files.pythonhosted.org/packages/19/1b/4c6e638195851524a63972c5773c7737bea7e47b1ba402186a37773acee2/multidict-6.4.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:4f5f29794ac0e73d2a06ac03fd18870adc0135a9d384f4a306a951188ed02f95", size = 65515, upload-time = "2025-05-19T14:14:19.767Z" }, + { url = "https://files.pythonhosted.org/packages/25/d5/10e6bca9a44b8af3c7f920743e5fc0c2bcf8c11bf7a295d4cfe00b08fb46/multidict-6.4.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c04157266344158ebd57b7120d9b0b35812285d26d0e78193e17ef57bfe2979a", size = 38609, upload-time = "2025-05-19T14:14:21.538Z" }, + { url = "https://files.pythonhosted.org/packages/26/b4/91fead447ccff56247edc7f0535fbf140733ae25187a33621771ee598a18/multidict-6.4.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:bb61ffd3ab8310d93427e460f565322c44ef12769f51f77277b4abad7b6f7223", size = 37871, upload-time = "2025-05-19T14:14:22.666Z" }, + { url = "https://files.pythonhosted.org/packages/3b/37/cbc977cae59277e99d15bbda84cc53b5e0c4929ffd91d958347200a42ad0/multidict-6.4.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5e0ba18a9afd495f17c351d08ebbc4284e9c9f7971d715f196b79636a4d0de44", size = 226661, upload-time = "2025-05-19T14:14:24.124Z" }, + { url = "https://files.pythonhosted.org/packages/15/cd/7e0b57fbd4dc2fc105169c4ecce5be1a63970f23bb4ec8c721b67e11953d/multidict-6.4.4-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:9faf1b1dcaadf9f900d23a0e6d6c8eadd6a95795a0e57fcca73acce0eb912065", size = 223422, upload-time = "2025-05-19T14:14:25.437Z" }, + { url = "https://files.pythonhosted.org/packages/f1/01/1de268da121bac9f93242e30cd3286f6a819e5f0b8896511162d6ed4bf8d/multidict-6.4.4-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a4d1cb1327c6082c4fce4e2a438483390964c02213bc6b8d782cf782c9b1471f", size = 235447, upload-time = "2025-05-19T14:14:26.793Z" }, + { url = "https://files.pythonhosted.org/packages/d2/8c/8b9a5e4aaaf4f2de14e86181a3a3d7b105077f668b6a06f043ec794f684c/multidict-6.4.4-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:941f1bec2f5dbd51feeb40aea654c2747f811ab01bdd3422a48a4e4576b7d76a", size = 231455, upload-time = "2025-05-19T14:14:28.149Z" }, + { url = "https://files.pythonhosted.org/packages/35/db/e1817dcbaa10b319c412769cf999b1016890849245d38905b73e9c286862/multidict-6.4.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e5f8a146184da7ea12910a4cec51ef85e44f6268467fb489c3caf0cd512f29c2", size = 223666, upload-time = "2025-05-19T14:14:29.584Z" }, + { url = "https://files.pythonhosted.org/packages/4a/e1/66e8579290ade8a00e0126b3d9a93029033ffd84f0e697d457ed1814d0fc/multidict-6.4.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:232b7237e57ec3c09be97206bfb83a0aa1c5d7d377faa019c68a210fa35831f1", size = 217392, upload-time = "2025-05-19T14:14:30.961Z" }, + { url = "https://files.pythonhosted.org/packages/7b/6f/f8639326069c24a48c7747c2a5485d37847e142a3f741ff3340c88060a9a/multidict-6.4.4-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:55ae0721c1513e5e3210bca4fc98456b980b0c2c016679d3d723119b6b202c42", size = 228969, upload-time = "2025-05-19T14:14:32.672Z" }, + { url = "https://files.pythonhosted.org/packages/d2/c3/3d58182f76b960eeade51c89fcdce450f93379340457a328e132e2f8f9ed/multidict-6.4.4-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:51d662c072579f63137919d7bb8fc250655ce79f00c82ecf11cab678f335062e", size = 217433, upload-time = "2025-05-19T14:14:34.016Z" }, + { url = "https://files.pythonhosted.org/packages/e1/4b/f31a562906f3bd375f3d0e83ce314e4a660c01b16c2923e8229b53fba5d7/multidict-6.4.4-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:0e05c39962baa0bb19a6b210e9b1422c35c093b651d64246b6c2e1a7e242d9fd", size = 225418, upload-time = "2025-05-19T14:14:35.376Z" }, + { url = "https://files.pythonhosted.org/packages/99/89/78bb95c89c496d64b5798434a3deee21996114d4d2c28dd65850bf3a691e/multidict-6.4.4-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:d5b1cc3ab8c31d9ebf0faa6e3540fb91257590da330ffe6d2393d4208e638925", size = 235042, upload-time = "2025-05-19T14:14:36.723Z" }, + { url = "https://files.pythonhosted.org/packages/74/91/8780a6e5885a8770442a8f80db86a0887c4becca0e5a2282ba2cae702bc4/multidict-6.4.4-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:93ec84488a384cd7b8a29c2c7f467137d8a73f6fe38bb810ecf29d1ade011a7c", size = 230280, upload-time = "2025-05-19T14:14:38.194Z" }, + { url = "https://files.pythonhosted.org/packages/68/c1/fcf69cabd542eb6f4b892469e033567ee6991d361d77abdc55e3a0f48349/multidict-6.4.4-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:b308402608493638763abc95f9dc0030bbd6ac6aff784512e8ac3da73a88af08", size = 223322, upload-time = "2025-05-19T14:14:40.015Z" }, + { url = "https://files.pythonhosted.org/packages/b8/85/5b80bf4b83d8141bd763e1d99142a9cdfd0db83f0739b4797172a4508014/multidict-6.4.4-cp311-cp311-win32.whl", hash = "sha256:343892a27d1a04d6ae455ecece12904d242d299ada01633d94c4f431d68a8c49", size = 35070, upload-time = "2025-05-19T14:14:41.904Z" }, + { url = "https://files.pythonhosted.org/packages/09/66/0bed198ffd590ab86e001f7fa46b740d58cf8ff98c2f254e4a36bf8861ad/multidict-6.4.4-cp311-cp311-win_amd64.whl", hash = "sha256:73484a94f55359780c0f458bbd3c39cb9cf9c182552177d2136e828269dee529", size = 38667, upload-time = "2025-05-19T14:14:43.534Z" }, + { url = "https://files.pythonhosted.org/packages/d2/b5/5675377da23d60875fe7dae6be841787755878e315e2f517235f22f59e18/multidict-6.4.4-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:dc388f75a1c00000824bf28b7633e40854f4127ede80512b44c3cfeeea1839a2", size = 64293, upload-time = "2025-05-19T14:14:44.724Z" }, + { url = "https://files.pythonhosted.org/packages/34/a7/be384a482754bb8c95d2bbe91717bf7ccce6dc38c18569997a11f95aa554/multidict-6.4.4-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:98af87593a666f739d9dba5d0ae86e01b0e1a9cfcd2e30d2d361fbbbd1a9162d", size = 38096, upload-time = "2025-05-19T14:14:45.95Z" }, + { url = "https://files.pythonhosted.org/packages/66/6d/d59854bb4352306145bdfd1704d210731c1bb2c890bfee31fb7bbc1c4c7f/multidict-6.4.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:aff4cafea2d120327d55eadd6b7f1136a8e5a0ecf6fb3b6863e8aca32cd8e50a", size = 37214, upload-time = "2025-05-19T14:14:47.158Z" }, + { url = "https://files.pythonhosted.org/packages/99/e0/c29d9d462d7cfc5fc8f9bf24f9c6843b40e953c0b55e04eba2ad2cf54fba/multidict-6.4.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:169c4ba7858176b797fe551d6e99040c531c775d2d57b31bcf4de6d7a669847f", size = 224686, upload-time = "2025-05-19T14:14:48.366Z" }, + { url = "https://files.pythonhosted.org/packages/dc/4a/da99398d7fd8210d9de068f9a1b5f96dfaf67d51e3f2521f17cba4ee1012/multidict-6.4.4-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:b9eb4c59c54421a32b3273d4239865cb14ead53a606db066d7130ac80cc8ec93", size = 231061, upload-time = "2025-05-19T14:14:49.952Z" }, + { url = "https://files.pythonhosted.org/packages/21/f5/ac11add39a0f447ac89353e6ca46666847051103649831c08a2800a14455/multidict-6.4.4-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7cf3bd54c56aa16fdb40028d545eaa8d051402b61533c21e84046e05513d5780", size = 232412, upload-time = "2025-05-19T14:14:51.812Z" }, + { url = "https://files.pythonhosted.org/packages/d9/11/4b551e2110cded705a3c13a1d4b6a11f73891eb5a1c449f1b2b6259e58a6/multidict-6.4.4-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f682c42003c7264134bfe886376299db4cc0c6cd06a3295b41b347044bcb5482", size = 231563, upload-time = "2025-05-19T14:14:53.262Z" }, + { url = "https://files.pythonhosted.org/packages/4c/02/751530c19e78fe73b24c3da66618eda0aa0d7f6e7aa512e46483de6be210/multidict-6.4.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a920f9cf2abdf6e493c519492d892c362007f113c94da4c239ae88429835bad1", size = 223811, upload-time = "2025-05-19T14:14:55.232Z" }, + { url = "https://files.pythonhosted.org/packages/c7/cb/2be8a214643056289e51ca356026c7b2ce7225373e7a1f8c8715efee8988/multidict-6.4.4-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:530d86827a2df6504526106b4c104ba19044594f8722d3e87714e847c74a0275", size = 216524, upload-time = "2025-05-19T14:14:57.226Z" }, + { url = "https://files.pythonhosted.org/packages/19/f3/6d5011ec375c09081f5250af58de85f172bfcaafebff286d8089243c4bd4/multidict-6.4.4-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:ecde56ea2439b96ed8a8d826b50c57364612ddac0438c39e473fafad7ae1c23b", size = 229012, upload-time = "2025-05-19T14:14:58.597Z" }, + { url = "https://files.pythonhosted.org/packages/67/9c/ca510785df5cf0eaf5b2a8132d7d04c1ce058dcf2c16233e596ce37a7f8e/multidict-6.4.4-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:dc8c9736d8574b560634775ac0def6bdc1661fc63fa27ffdfc7264c565bcb4f2", size = 226765, upload-time = "2025-05-19T14:15:00.048Z" }, + { url = "https://files.pythonhosted.org/packages/36/c8/ca86019994e92a0f11e642bda31265854e6ea7b235642f0477e8c2e25c1f/multidict-6.4.4-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:7f3d3b3c34867579ea47cbd6c1f2ce23fbfd20a273b6f9e3177e256584f1eacc", size = 222888, upload-time = "2025-05-19T14:15:01.568Z" }, + { url = "https://files.pythonhosted.org/packages/c6/67/bc25a8e8bd522935379066950ec4e2277f9b236162a73548a2576d4b9587/multidict-6.4.4-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:87a728af265e08f96b6318ebe3c0f68b9335131f461efab2fc64cc84a44aa6ed", size = 234041, upload-time = "2025-05-19T14:15:03.759Z" }, + { url = "https://files.pythonhosted.org/packages/f1/a0/70c4c2d12857fccbe607b334b7ee28b6b5326c322ca8f73ee54e70d76484/multidict-6.4.4-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:9f193eeda1857f8e8d3079a4abd258f42ef4a4bc87388452ed1e1c4d2b0c8740", size = 231046, upload-time = "2025-05-19T14:15:05.698Z" }, + { url = "https://files.pythonhosted.org/packages/c1/0f/52954601d02d39742aab01d6b92f53c1dd38b2392248154c50797b4df7f1/multidict-6.4.4-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:be06e73c06415199200e9a2324a11252a3d62030319919cde5e6950ffeccf72e", size = 227106, upload-time = "2025-05-19T14:15:07.124Z" }, + { url = "https://files.pythonhosted.org/packages/af/24/679d83ec4379402d28721790dce818e5d6b9f94ce1323a556fb17fa9996c/multidict-6.4.4-cp312-cp312-win32.whl", hash = "sha256:622f26ea6a7e19b7c48dd9228071f571b2fbbd57a8cd71c061e848f281550e6b", size = 35351, upload-time = "2025-05-19T14:15:08.556Z" }, + { url = "https://files.pythonhosted.org/packages/52/ef/40d98bc5f986f61565f9b345f102409534e29da86a6454eb6b7c00225a13/multidict-6.4.4-cp312-cp312-win_amd64.whl", hash = "sha256:5e2bcda30d5009996ff439e02a9f2b5c3d64a20151d34898c000a6281faa3781", size = 38791, upload-time = "2025-05-19T14:15:09.825Z" }, + { url = "https://files.pythonhosted.org/packages/df/2a/e166d2ffbf4b10131b2d5b0e458f7cee7d986661caceae0de8753042d4b2/multidict-6.4.4-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:82ffabefc8d84c2742ad19c37f02cde5ec2a1ee172d19944d380f920a340e4b9", size = 64123, upload-time = "2025-05-19T14:15:11.044Z" }, + { url = "https://files.pythonhosted.org/packages/8c/96/e200e379ae5b6f95cbae472e0199ea98913f03d8c9a709f42612a432932c/multidict-6.4.4-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:6a2f58a66fe2c22615ad26156354005391e26a2f3721c3621504cd87c1ea87bf", size = 38049, upload-time = "2025-05-19T14:15:12.902Z" }, + { url = "https://files.pythonhosted.org/packages/75/fb/47afd17b83f6a8c7fa863c6d23ac5ba6a0e6145ed8a6bcc8da20b2b2c1d2/multidict-6.4.4-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:5883d6ee0fd9d8a48e9174df47540b7545909841ac82354c7ae4cbe9952603bd", size = 37078, upload-time = "2025-05-19T14:15:14.282Z" }, + { url = "https://files.pythonhosted.org/packages/fa/70/1af3143000eddfb19fd5ca5e78393985ed988ac493bb859800fe0914041f/multidict-6.4.4-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9abcf56a9511653fa1d052bfc55fbe53dbee8f34e68bd6a5a038731b0ca42d15", size = 224097, upload-time = "2025-05-19T14:15:15.566Z" }, + { url = "https://files.pythonhosted.org/packages/b1/39/d570c62b53d4fba844e0378ffbcd02ac25ca423d3235047013ba2f6f60f8/multidict-6.4.4-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:6ed5ae5605d4ad5a049fad2a28bb7193400700ce2f4ae484ab702d1e3749c3f9", size = 230768, upload-time = "2025-05-19T14:15:17.308Z" }, + { url = "https://files.pythonhosted.org/packages/fd/f8/ed88f2c4d06f752b015933055eb291d9bc184936903752c66f68fb3c95a7/multidict-6.4.4-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bbfcb60396f9bcfa63e017a180c3105b8c123a63e9d1428a36544e7d37ca9e20", size = 231331, upload-time = "2025-05-19T14:15:18.73Z" }, + { url = "https://files.pythonhosted.org/packages/9c/6f/8e07cffa32f483ab887b0d56bbd8747ac2c1acd00dc0af6fcf265f4a121e/multidict-6.4.4-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b0f1987787f5f1e2076b59692352ab29a955b09ccc433c1f6b8e8e18666f608b", size = 230169, upload-time = "2025-05-19T14:15:20.179Z" }, + { url = "https://files.pythonhosted.org/packages/e6/2b/5dcf173be15e42f330110875a2668ddfc208afc4229097312212dc9c1236/multidict-6.4.4-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1d0121ccce8c812047d8d43d691a1ad7641f72c4f730474878a5aeae1b8ead8c", size = 222947, upload-time = "2025-05-19T14:15:21.714Z" }, + { url = "https://files.pythonhosted.org/packages/39/75/4ddcbcebe5ebcd6faa770b629260d15840a5fc07ce8ad295a32e14993726/multidict-6.4.4-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:83ec4967114295b8afd120a8eec579920c882831a3e4c3331d591a8e5bfbbc0f", size = 215761, upload-time = "2025-05-19T14:15:23.242Z" }, + { url = "https://files.pythonhosted.org/packages/6a/c9/55e998ae45ff15c5608e384206aa71a11e1b7f48b64d166db400b14a3433/multidict-6.4.4-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:995f985e2e268deaf17867801b859a282e0448633f1310e3704b30616d269d69", size = 227605, upload-time = "2025-05-19T14:15:24.763Z" }, + { url = "https://files.pythonhosted.org/packages/04/49/c2404eac74497503c77071bd2e6f88c7e94092b8a07601536b8dbe99be50/multidict-6.4.4-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:d832c608f94b9f92a0ec8b7e949be7792a642b6e535fcf32f3e28fab69eeb046", size = 226144, upload-time = "2025-05-19T14:15:26.249Z" }, + { url = "https://files.pythonhosted.org/packages/62/c5/0cd0c3c6f18864c40846aa2252cd69d308699cb163e1c0d989ca301684da/multidict-6.4.4-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:d21c1212171cf7da703c5b0b7a0e85be23b720818aef502ad187d627316d5645", size = 221100, upload-time = "2025-05-19T14:15:28.303Z" }, + { url = "https://files.pythonhosted.org/packages/71/7b/f2f3887bea71739a046d601ef10e689528d4f911d84da873b6be9194ffea/multidict-6.4.4-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:cbebaa076aaecad3d4bb4c008ecc73b09274c952cf6a1b78ccfd689e51f5a5b0", size = 232731, upload-time = "2025-05-19T14:15:30.263Z" }, + { url = "https://files.pythonhosted.org/packages/e5/b3/d9de808349df97fa75ec1372758701b5800ebad3c46ae377ad63058fbcc6/multidict-6.4.4-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:c93a6fb06cc8e5d3628b2b5fda215a5db01e8f08fc15fadd65662d9b857acbe4", size = 229637, upload-time = "2025-05-19T14:15:33.337Z" }, + { url = "https://files.pythonhosted.org/packages/5e/57/13207c16b615eb4f1745b44806a96026ef8e1b694008a58226c2d8f5f0a5/multidict-6.4.4-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:8cd8f81f1310182362fb0c7898145ea9c9b08a71081c5963b40ee3e3cac589b1", size = 225594, upload-time = "2025-05-19T14:15:34.832Z" }, + { url = "https://files.pythonhosted.org/packages/3a/e4/d23bec2f70221604f5565000632c305fc8f25ba953e8ce2d8a18842b9841/multidict-6.4.4-cp313-cp313-win32.whl", hash = "sha256:3e9f1cd61a0ab857154205fb0b1f3d3ace88d27ebd1409ab7af5096e409614cd", size = 35359, upload-time = "2025-05-19T14:15:36.246Z" }, + { url = "https://files.pythonhosted.org/packages/a7/7a/cfe1a47632be861b627f46f642c1d031704cc1c0f5c0efbde2ad44aa34bd/multidict-6.4.4-cp313-cp313-win_amd64.whl", hash = "sha256:8ffb40b74400e4455785c2fa37eba434269149ec525fc8329858c862e4b35373", size = 38903, upload-time = "2025-05-19T14:15:37.507Z" }, + { url = "https://files.pythonhosted.org/packages/68/7b/15c259b0ab49938a0a1c8f3188572802704a779ddb294edc1b2a72252e7c/multidict-6.4.4-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:6a602151dbf177be2450ef38966f4be3467d41a86c6a845070d12e17c858a156", size = 68895, upload-time = "2025-05-19T14:15:38.856Z" }, + { url = "https://files.pythonhosted.org/packages/f1/7d/168b5b822bccd88142e0a3ce985858fea612404edd228698f5af691020c9/multidict-6.4.4-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:0d2b9712211b860d123815a80b859075d86a4d54787e247d7fbee9db6832cf1c", size = 40183, upload-time = "2025-05-19T14:15:40.197Z" }, + { url = "https://files.pythonhosted.org/packages/e0/b7/d4b8d98eb850ef28a4922ba508c31d90715fd9b9da3801a30cea2967130b/multidict-6.4.4-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:d2fa86af59f8fc1972e121ade052145f6da22758f6996a197d69bb52f8204e7e", size = 39592, upload-time = "2025-05-19T14:15:41.508Z" }, + { url = "https://files.pythonhosted.org/packages/18/28/a554678898a19583548e742080cf55d169733baf57efc48c2f0273a08583/multidict-6.4.4-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:50855d03e9e4d66eab6947ba688ffb714616f985838077bc4b490e769e48da51", size = 226071, upload-time = "2025-05-19T14:15:42.877Z" }, + { url = "https://files.pythonhosted.org/packages/ee/dc/7ba6c789d05c310e294f85329efac1bf5b450338d2542498db1491a264df/multidict-6.4.4-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:5bce06b83be23225be1905dcdb6b789064fae92499fbc458f59a8c0e68718601", size = 222597, upload-time = "2025-05-19T14:15:44.412Z" }, + { url = "https://files.pythonhosted.org/packages/24/4f/34eadbbf401b03768dba439be0fb94b0d187facae9142821a3d5599ccb3b/multidict-6.4.4-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:66ed0731f8e5dfd8369a883b6e564aca085fb9289aacabd9decd70568b9a30de", size = 228253, upload-time = "2025-05-19T14:15:46.474Z" }, + { url = "https://files.pythonhosted.org/packages/c0/e6/493225a3cdb0d8d80d43a94503fc313536a07dae54a3f030d279e629a2bc/multidict-6.4.4-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:329ae97fc2f56f44d91bc47fe0972b1f52d21c4b7a2ac97040da02577e2daca2", size = 226146, upload-time = "2025-05-19T14:15:48.003Z" }, + { url = "https://files.pythonhosted.org/packages/2f/70/e411a7254dc3bff6f7e6e004303b1b0591358e9f0b7c08639941e0de8bd6/multidict-6.4.4-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c27e5dcf520923d6474d98b96749e6805f7677e93aaaf62656005b8643f907ab", size = 220585, upload-time = "2025-05-19T14:15:49.546Z" }, + { url = "https://files.pythonhosted.org/packages/08/8f/beb3ae7406a619100d2b1fb0022c3bb55a8225ab53c5663648ba50dfcd56/multidict-6.4.4-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:058cc59b9e9b143cc56715e59e22941a5d868c322242278d28123a5d09cdf6b0", size = 212080, upload-time = "2025-05-19T14:15:51.151Z" }, + { url = "https://files.pythonhosted.org/packages/9c/ec/355124e9d3d01cf8edb072fd14947220f357e1c5bc79c88dff89297e9342/multidict-6.4.4-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:69133376bc9a03f8c47343d33f91f74a99c339e8b58cea90433d8e24bb298031", size = 226558, upload-time = "2025-05-19T14:15:52.665Z" }, + { url = "https://files.pythonhosted.org/packages/fd/22/d2b95cbebbc2ada3be3812ea9287dcc9712d7f1a012fad041770afddb2ad/multidict-6.4.4-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:d6b15c55721b1b115c5ba178c77104123745b1417527ad9641a4c5e2047450f0", size = 212168, upload-time = "2025-05-19T14:15:55.279Z" }, + { url = "https://files.pythonhosted.org/packages/4d/c5/62bfc0b2f9ce88326dbe7179f9824a939c6c7775b23b95de777267b9725c/multidict-6.4.4-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:a887b77f51d3d41e6e1a63cf3bc7ddf24de5939d9ff69441387dfefa58ac2e26", size = 217970, upload-time = "2025-05-19T14:15:56.806Z" }, + { url = "https://files.pythonhosted.org/packages/79/74/977cea1aadc43ff1c75d23bd5bc4768a8fac98c14e5878d6ee8d6bab743c/multidict-6.4.4-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:632a3bf8f1787f7ef7d3c2f68a7bde5be2f702906f8b5842ad6da9d974d0aab3", size = 226980, upload-time = "2025-05-19T14:15:58.313Z" }, + { url = "https://files.pythonhosted.org/packages/48/fc/cc4a1a2049df2eb84006607dc428ff237af38e0fcecfdb8a29ca47b1566c/multidict-6.4.4-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:a145c550900deb7540973c5cdb183b0d24bed6b80bf7bddf33ed8f569082535e", size = 220641, upload-time = "2025-05-19T14:15:59.866Z" }, + { url = "https://files.pythonhosted.org/packages/3b/6a/a7444d113ab918701988d4abdde373dbdfd2def7bd647207e2bf645c7eac/multidict-6.4.4-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:cc5d83c6619ca5c9672cb78b39ed8542f1975a803dee2cda114ff73cbb076edd", size = 221728, upload-time = "2025-05-19T14:16:01.535Z" }, + { url = "https://files.pythonhosted.org/packages/2b/b0/fdf4c73ad1c55e0f4dbbf2aa59dd37037334091f9a4961646d2b7ac91a86/multidict-6.4.4-cp313-cp313t-win32.whl", hash = "sha256:3312f63261b9df49be9d57aaa6abf53a6ad96d93b24f9cc16cf979956355ce6e", size = 41913, upload-time = "2025-05-19T14:16:03.199Z" }, + { url = "https://files.pythonhosted.org/packages/8e/92/27989ecca97e542c0d01d05a98a5ae12198a243a9ee12563a0313291511f/multidict-6.4.4-cp313-cp313t-win_amd64.whl", hash = "sha256:ba852168d814b2c73333073e1c7116d9395bea69575a01b0b3c89d2d5a87c8fb", size = 46112, upload-time = "2025-05-19T14:16:04.909Z" }, + { url = "https://files.pythonhosted.org/packages/84/5d/e17845bb0fa76334477d5de38654d27946d5b5d3695443987a094a71b440/multidict-6.4.4-py3-none-any.whl", hash = "sha256:bd4557071b561a8b3b6075c3ce93cf9bfb6182cb241805c3d66ced3b75eff4ac", size = 10481, upload-time = "2025-05-19T14:16:36.024Z" }, ] [[package]] @@ -3376,105 +3378,71 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/33/3f/164de150e983b3a16e8bf3d4355625e51a357e7b3b1deebe9cc1f7cb9af8/ollama-0.4.8-py3-none-any.whl", hash = "sha256:04312af2c5e72449aaebac4a2776f52ef010877c554103419d3f36066fe8af4c", size = 13325, upload-time = "2025-04-16T21:55:12.779Z" }, ] -[[package]] -name = "onnxruntime" -version = "1.21.0" -source = { registry = "https://pypi.org/simple" } -resolution-markers = [ - "python_full_version < '3.11' and sys_platform == 'darwin'", - "python_full_version == '3.11.*' and sys_platform == 'darwin'", - "python_full_version >= '4.0' and sys_platform == 'darwin'", - "python_full_version == '3.12.*' and sys_platform == 'darwin'", - "python_full_version >= '3.13' and python_full_version < '4.0' and sys_platform == 'darwin'", - "python_full_version < '3.11' and sys_platform == 'linux'", - "python_full_version == '3.11.*' and sys_platform == 'linux'", - "python_full_version >= '4.0' and sys_platform == 'linux'", - "python_full_version == '3.12.*' and sys_platform == 'linux'", - "python_full_version >= '3.13' and python_full_version < '4.0' and sys_platform == 'linux'", -] -dependencies = [ - { name = "coloredlogs", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, - { name = "flatbuffers", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, - { name = "numpy", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, - { name = "packaging", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, - { name = "protobuf", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, - { name = "sympy", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, -] -wheels = [ - { url = "https://files.pythonhosted.org/packages/a8/b5/433e46baf8f31a84684f9d3446d8683473706e2810b6171e19beed88ecb9/onnxruntime-1.21.0-cp310-cp310-macosx_13_0_universal2.whl", hash = "sha256:95513c9302bc8dd013d84148dcf3168e782a80cdbf1654eddc948a23147ccd3d", size = 33639595, upload_time = "2025-03-08T02:43:37.245Z" }, - { url = "https://files.pythonhosted.org/packages/23/78/1ec7358f9c9de82299cb99a1a48bdb871b4180533cfe5900e2ede102668e/onnxruntime-1.21.0-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:635d4ab13ae0f150dd4c6ff8206fd58f1c6600636ecc796f6f0c42e4c918585b", size = 14159036, upload_time = "2025-03-08T02:43:59.355Z" }, - { url = "https://files.pythonhosted.org/packages/eb/66/fcd3e1201f546c736b0050cb2e889296596ff7862f36bd17027fbef5f24d/onnxruntime-1.21.0-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7d06bfa0dd5512bd164f25a2bf594b2e7c9eabda6fc064b684924f3e81bdab1b", size = 16000047, upload_time = "2025-03-08T02:44:01.88Z" }, - { url = "https://files.pythonhosted.org/packages/df/34/fd780c62b3ec9268224ada4205a5256618553b8cc26d7205d3cf8aafde47/onnxruntime-1.21.0-cp311-cp311-macosx_13_0_universal2.whl", hash = "sha256:8e16f8a79df03919810852fb46ffcc916dc87a9e9c6540a58f20c914c575678c", size = 33644022, upload_time = "2025-03-08T02:43:43.412Z" }, - { url = "https://files.pythonhosted.org/packages/7b/df/622594b43d1a8644ac4d947f52e34a0e813b3d76a62af34667e343c34e98/onnxruntime-1.21.0-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7f9156cf6f8ee133d07a751e6518cf6f84ed37fbf8243156bd4a2c4ee6e073c8", size = 14159570, upload_time = "2025-03-08T02:44:04.343Z" }, - { url = "https://files.pythonhosted.org/packages/f9/49/1e916e8d1d957a1432c1662ef2e94f3e4afab31f6f1888fb80d4da374a5d/onnxruntime-1.21.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8a5d09815a9e209fa0cb20c2985b34ab4daeba7aea94d0f96b8751eb10403201", size = 16001965, upload_time = "2025-03-08T02:44:06.619Z" }, - { url = "https://files.pythonhosted.org/packages/ff/21/593c9bc56002a6d1ea7c2236f4a648e081ec37c8d51db2383a9e83a63325/onnxruntime-1.21.0-cp312-cp312-macosx_13_0_universal2.whl", hash = "sha256:893d67c68ca9e7a58202fa8d96061ed86a5815b0925b5a97aef27b8ba246a20b", size = 33658780, upload_time = "2025-03-08T02:43:49.378Z" }, - { url = "https://files.pythonhosted.org/packages/4a/b4/33ec675a8ac150478091262824413e5d4acc359e029af87f9152e7c1c092/onnxruntime-1.21.0-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:37b7445c920a96271a8dfa16855e258dc5599235b41c7bbde0d262d55bcc105f", size = 14159975, upload_time = "2025-03-08T02:44:09.196Z" }, - { url = "https://files.pythonhosted.org/packages/8b/08/eead6895ed83b56711ca6c0d31d82f109401b9937558b425509e497d6fb4/onnxruntime-1.21.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9a04aafb802c1e5573ba4552f8babcb5021b041eb4cfa802c9b7644ca3510eca", size = 16019285, upload_time = "2025-03-08T02:44:11.706Z" }, - { url = "https://files.pythonhosted.org/packages/f2/25/93f65617b06c741a58eeac9e373c99df443b02a774f4cb6511889757c0da/onnxruntime-1.21.0-cp313-cp313-macosx_13_0_universal2.whl", hash = "sha256:85718cbde1c2912d3a03e3b3dc181b1480258a229c32378408cace7c450f7f23", size = 33659581, upload_time = "2025-03-08T02:43:54.745Z" }, - { url = "https://files.pythonhosted.org/packages/f9/03/6b6829ee8344490ab5197f39a6824499ed097d1fc8c85b1f91c0e6767819/onnxruntime-1.21.0-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:94dff3a61538f3b7b0ea9a06bc99e1410e90509c76e3a746f039e417802a12ae", size = 14160534, upload_time = "2025-03-08T02:44:13.915Z" }, - { url = "https://files.pythonhosted.org/packages/a6/81/e280ddf05f83ad5e0d066ef08e31515b17bd50bb52ef2ea713d9e455e67a/onnxruntime-1.21.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c1e704b0eda5f2bbbe84182437315eaec89a450b08854b5a7762c85d04a28a0a", size = 16018947, upload_time = "2025-03-08T02:44:16.447Z" }, - { url = "https://files.pythonhosted.org/packages/47/6b/a00f31322e91c610c7825377ef0cad884483c30d1370b896d57e7032e912/onnxruntime-1.21.0-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3995c4a2d81719623c58697b9510f8de9fa42a1da6b4474052797b0d712324fe", size = 14172215, upload_time = "2025-03-08T02:44:18.578Z" }, - { url = "https://files.pythonhosted.org/packages/58/4b/98214f13ac1cd675dfc2713ba47b5722f55ce4fba526d2b2826f2682a42e/onnxruntime-1.21.0-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:36b18b8f39c0f84e783902112a0dd3c102466897f96d73bb83f6a6bff283a423", size = 15990612, upload_time = "2025-03-08T02:44:20.715Z" }, -] - [[package]] name = "onnxruntime" version = "1.22.0" source = { registry = "https://pypi.org/simple" } -resolution-markers = [ - "python_full_version < '3.11' and sys_platform == 'win32'", - "python_full_version == '3.11.*' and sys_platform == 'win32'", - "python_full_version >= '4.0' and sys_platform == 'win32'", - "python_full_version == '3.12.*' and sys_platform == 'win32'", - "python_full_version >= '3.13' and python_full_version < '4.0' and sys_platform == 'win32'", -] dependencies = [ - { name = "coloredlogs", marker = "sys_platform == 'win32'" }, - { name = "flatbuffers", marker = "sys_platform == 'win32'" }, - { name = "numpy", marker = "sys_platform == 'win32'" }, - { name = "packaging", marker = "sys_platform == 'win32'" }, - { name = "protobuf", marker = "sys_platform == 'win32'" }, - { name = "sympy", marker = "sys_platform == 'win32'" }, + { name = "coloredlogs", marker = "sys_platform == 'darwin' or sys_platform == 'linux' or sys_platform == 'win32'" }, + { name = "flatbuffers", marker = "sys_platform == 'darwin' or sys_platform == 'linux' or sys_platform == 'win32'" }, + { name = "numpy", marker = "sys_platform == 'darwin' or sys_platform == 'linux' or sys_platform == 'win32'" }, + { name = "packaging", marker = "sys_platform == 'darwin' or sys_platform == 'linux' or sys_platform == 'win32'" }, + { name = "protobuf", marker = "sys_platform == 'darwin' or sys_platform == 'linux' or sys_platform == 'win32'" }, + { name = "sympy", marker = "sys_platform == 'darwin' or sys_platform == 'linux' or sys_platform == 'win32'" }, ] wheels = [ - { url = "https://files.pythonhosted.org/packages/6d/6b/8267490476e8d4dd1883632c7e46a4634384c7ff1c35ae44edc8ab0bb7a9/onnxruntime-1.22.0-cp310-cp310-win_amd64.whl", hash = "sha256:20bca6495d06925631e201f2b257cc37086752e8fe7b6c83a67c6509f4759bc9", size = 12689974, upload_time = "2025-05-12T21:26:09.704Z" }, - { url = "https://files.pythonhosted.org/packages/89/a5/1c6c10322201566015183b52ef011dfa932f5dd1b278de8d75c3b948411d/onnxruntime-1.22.0-cp311-cp311-win_amd64.whl", hash = "sha256:03d3ef7fb11adf154149d6e767e21057e0e577b947dd3f66190b212528e1db31", size = 12691517, upload_time = "2025-05-12T21:26:13.354Z" }, - { url = "https://files.pythonhosted.org/packages/36/b4/3f1c71ce1d3d21078a6a74c5483bfa2b07e41a8d2b8fb1e9993e6a26d8d3/onnxruntime-1.22.0-cp312-cp312-win_amd64.whl", hash = "sha256:c0d534a43d1264d1273c2d4f00a5a588fa98d21117a3345b7104fa0bbcaadb9a", size = 12692233, upload_time = "2025-05-12T21:26:16.963Z" }, - { url = "https://files.pythonhosted.org/packages/3e/89/2f64e250945fa87140fb917ba377d6d0e9122e029c8512f389a9b7f953f4/onnxruntime-1.22.0-cp313-cp313-win_amd64.whl", hash = "sha256:5a31d84ef82b4b05d794a4ce8ba37b0d9deb768fd580e36e17b39e0b4840253b", size = 12691777, upload_time = "2025-05-12T21:26:20.19Z" }, + { url = "https://files.pythonhosted.org/packages/67/3c/c99b21646a782b89c33cffd96fdee02a81bc43f0cb651de84d58ec11e30e/onnxruntime-1.22.0-cp310-cp310-macosx_13_0_universal2.whl", hash = "sha256:85d8826cc8054e4d6bf07f779dc742a363c39094015bdad6a08b3c18cfe0ba8c", size = 34273493, upload-time = "2025-05-09T20:25:55.66Z" }, + { url = "https://files.pythonhosted.org/packages/54/ab/fd9a3b5285008c060618be92e475337fcfbf8689787953d37273f7b52ab0/onnxruntime-1.22.0-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:468c9502a12f6f49ec335c2febd22fdceecc1e4cc96dfc27e419ba237dff5aff", size = 14445346, upload-time = "2025-05-09T20:25:41.322Z" }, + { url = "https://files.pythonhosted.org/packages/1f/ca/a5625644bc079e04e3076a5ac1fb954d1e90309b8eb987a4f800732ffee6/onnxruntime-1.22.0-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:681fe356d853630a898ee05f01ddb95728c9a168c9460e8361d0a240c9b7cb97", size = 16392959, upload-time = "2025-05-09T20:26:09.047Z" }, + { url = "https://files.pythonhosted.org/packages/6d/6b/8267490476e8d4dd1883632c7e46a4634384c7ff1c35ae44edc8ab0bb7a9/onnxruntime-1.22.0-cp310-cp310-win_amd64.whl", hash = "sha256:20bca6495d06925631e201f2b257cc37086752e8fe7b6c83a67c6509f4759bc9", size = 12689974, upload-time = "2025-05-12T21:26:09.704Z" }, + { url = "https://files.pythonhosted.org/packages/7a/08/c008711d1b92ff1272f4fea0fbee57723171f161d42e5c680625535280af/onnxruntime-1.22.0-cp311-cp311-macosx_13_0_universal2.whl", hash = "sha256:8d6725c5b9a681d8fe72f2960c191a96c256367887d076b08466f52b4e0991df", size = 34282151, upload-time = "2025-05-09T20:25:59.246Z" }, + { url = "https://files.pythonhosted.org/packages/3e/8b/22989f6b59bc4ad1324f07a945c80b9ab825f0a581ad7a6064b93716d9b7/onnxruntime-1.22.0-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:fef17d665a917866d1f68f09edc98223b9a27e6cb167dec69da4c66484ad12fd", size = 14446302, upload-time = "2025-05-09T20:25:44.299Z" }, + { url = "https://files.pythonhosted.org/packages/7a/d5/aa83d084d05bc8f6cf8b74b499c77431ffd6b7075c761ec48ec0c161a47f/onnxruntime-1.22.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b978aa63a9a22095479c38371a9b359d4c15173cbb164eaad5f2cd27d666aa65", size = 16393496, upload-time = "2025-05-09T20:26:11.588Z" }, + { url = "https://files.pythonhosted.org/packages/89/a5/1c6c10322201566015183b52ef011dfa932f5dd1b278de8d75c3b948411d/onnxruntime-1.22.0-cp311-cp311-win_amd64.whl", hash = "sha256:03d3ef7fb11adf154149d6e767e21057e0e577b947dd3f66190b212528e1db31", size = 12691517, upload-time = "2025-05-12T21:26:13.354Z" }, + { url = "https://files.pythonhosted.org/packages/4d/de/9162872c6e502e9ac8c99a98a8738b2fab408123d11de55022ac4f92562a/onnxruntime-1.22.0-cp312-cp312-macosx_13_0_universal2.whl", hash = "sha256:f3c0380f53c1e72a41b3f4d6af2ccc01df2c17844072233442c3a7e74851ab97", size = 34298046, upload-time = "2025-05-09T20:26:02.399Z" }, + { url = "https://files.pythonhosted.org/packages/03/79/36f910cd9fc96b444b0e728bba14607016079786adf032dae61f7c63b4aa/onnxruntime-1.22.0-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c8601128eaef79b636152aea76ae6981b7c9fc81a618f584c15d78d42b310f1c", size = 14443220, upload-time = "2025-05-09T20:25:47.078Z" }, + { url = "https://files.pythonhosted.org/packages/8c/60/16d219b8868cc8e8e51a68519873bdb9f5f24af080b62e917a13fff9989b/onnxruntime-1.22.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6964a975731afc19dc3418fad8d4e08c48920144ff590149429a5ebe0d15fb3c", size = 16406377, upload-time = "2025-05-09T20:26:14.478Z" }, + { url = "https://files.pythonhosted.org/packages/36/b4/3f1c71ce1d3d21078a6a74c5483bfa2b07e41a8d2b8fb1e9993e6a26d8d3/onnxruntime-1.22.0-cp312-cp312-win_amd64.whl", hash = "sha256:c0d534a43d1264d1273c2d4f00a5a588fa98d21117a3345b7104fa0bbcaadb9a", size = 12692233, upload-time = "2025-05-12T21:26:16.963Z" }, + { url = "https://files.pythonhosted.org/packages/a9/65/5cb5018d5b0b7cba820d2c4a1d1b02d40df538d49138ba36a509457e4df6/onnxruntime-1.22.0-cp313-cp313-macosx_13_0_universal2.whl", hash = "sha256:fe7c051236aae16d8e2e9ffbfc1e115a0cc2450e873a9c4cb75c0cc96c1dae07", size = 34298715, upload-time = "2025-05-09T20:26:05.634Z" }, + { url = "https://files.pythonhosted.org/packages/e1/89/1dfe1b368831d1256b90b95cb8d11da8ab769febd5c8833ec85ec1f79d21/onnxruntime-1.22.0-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6a6bbed10bc5e770c04d422893d3045b81acbbadc9fb759a2cd1ca00993da919", size = 14443266, upload-time = "2025-05-09T20:25:49.479Z" }, + { url = "https://files.pythonhosted.org/packages/1e/70/342514ade3a33ad9dd505dcee96ff1f0e7be6d0e6e9c911fe0f1505abf42/onnxruntime-1.22.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9fe45ee3e756300fccfd8d61b91129a121d3d80e9d38e01f03ff1295badc32b8", size = 16406707, upload-time = "2025-05-09T20:26:17.454Z" }, + { url = "https://files.pythonhosted.org/packages/3e/89/2f64e250945fa87140fb917ba377d6d0e9122e029c8512f389a9b7f953f4/onnxruntime-1.22.0-cp313-cp313-win_amd64.whl", hash = "sha256:5a31d84ef82b4b05d794a4ce8ba37b0d9deb768fd580e36e17b39e0b4840253b", size = 12691777, upload-time = "2025-05-12T21:26:20.19Z" }, + { url = "https://files.pythonhosted.org/packages/9f/48/d61d5f1ed098161edd88c56cbac49207d7b7b149e613d2cd7e33176c63b3/onnxruntime-1.22.0-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0a2ac5bd9205d831541db4e508e586e764a74f14efdd3f89af7fd20e1bf4a1ed", size = 14454003, upload-time = "2025-05-09T20:25:52.287Z" }, + { url = "https://files.pythonhosted.org/packages/c3/16/873b955beda7bada5b0d798d3a601b2ff210e44ad5169f6d405b93892103/onnxruntime-1.22.0-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:64845709f9e8a2809e8e009bc4c8f73b788cee9c6619b7d9930344eae4c9cd36", size = 16427482, upload-time = "2025-05-09T20:26:20.376Z" }, ] [[package]] name = "onnxruntime-genai" -version = "0.7.1" +version = "0.8.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "numpy", marker = "(python_full_version < '3.13' and sys_platform == 'darwin') or (python_full_version < '3.13' and sys_platform == 'linux')" }, - { name = "onnxruntime", version = "1.21.0", source = { registry = "https://pypi.org/simple" }, marker = "(python_full_version < '3.13' and sys_platform == 'darwin') or (python_full_version < '3.13' and sys_platform == 'linux')" }, -] -wheels = [ - { url = "https://files.pythonhosted.org/packages/ef/47/ff222bb74a0725266cebfbca7bf24f0877b4e9abb1b38451173507d3c362/onnxruntime_genai-0.7.1-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:12dc0005dba08bee78ec5bae67624f9e92ce0dad8a6cab444b87d9a43236a514", size = 988999, upload-time = "2025-04-21T22:52:59.484Z" }, - { url = "https://files.pythonhosted.org/packages/35/9c/6036b39644d9c1e4fb6f314a1d97d489d80e909e63ed40e431bc232d7b87/onnxruntime_genai-0.7.1-cp310-cp310-macosx_12_0_x86_64.whl", hash = "sha256:62bb39be347250f36a9e2402d256b6a88f5b662d86cf5418951a9b874d277314", size = 1106705, upload-time = "2025-04-21T22:53:05.359Z" }, - { url = "https://files.pythonhosted.org/packages/db/da/422f4447439c96e8c9ea9eb3f2bad4eb482711a2d9e6760bc1b0fd5ea1e2/onnxruntime_genai-0.7.1-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0dde969928a3d1fd2296997c88264b14a93bdabc21531ae2ec42756f4cc9cc3e", size = 1743341, upload-time = "2025-04-21T22:52:42.575Z" }, - { url = "https://files.pythonhosted.org/packages/f6/08/98311c41917525434f31b2182edfb1262dc89b96dbc270d97e1123f9369e/onnxruntime_genai-0.7.1-cp310-cp310-win_amd64.whl", hash = "sha256:e4a684bbe2971b38bc0c4e8908276d898ca1fb3c336ca1c37545991b45427020", size = 919232, upload-time = "2025-04-21T22:53:15.883Z" }, - { url = "https://files.pythonhosted.org/packages/9d/28/99aeabe4a83f979dd49ea845eb4e63a1317182d9f2a06166fc892e4f20a4/onnxruntime_genai-0.7.1-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:9b872ec5a093f0bc6f4fc2e84946e65de49331c194bd2763b7fecde09265e8f3", size = 990239, upload-time = "2025-04-21T22:53:01.189Z" }, - { url = "https://files.pythonhosted.org/packages/4e/5c/0de3ac4c53351ff9d627c041eb6d56854ca658cbe30e1b9c128378142184/onnxruntime_genai-0.7.1-cp311-cp311-macosx_12_0_x86_64.whl", hash = "sha256:911a9ceec67ffff7f83f5e4d1d009d6aacd7238d3ac48532170d3720081d0f77", size = 1108450, upload-time = "2025-04-21T22:53:06.657Z" }, - { url = "https://files.pythonhosted.org/packages/c9/c8/c58a3480619b37f230dbc480de45faf8f6ba531296bd82adc1dfe2a9515c/onnxruntime_genai-0.7.1-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d85953eb8b900a690d0d33cfd2f09f0d11edf3f1c16343ec789b5c5b33e410fd", size = 1744730, upload-time = "2025-04-21T22:52:44.385Z" }, - { url = "https://files.pythonhosted.org/packages/aa/eb/a40cacec0911c9b472a20ec277030741d5822435ea6dd520aa049887e79d/onnxruntime_genai-0.7.1-cp311-cp311-win_amd64.whl", hash = "sha256:8f9b313fa800d25f60f759332cb80e6d37baa43fe5e46a9ce333e95f4ca16dd5", size = 920505, upload-time = "2025-04-21T22:53:17.564Z" }, - { url = "https://files.pythonhosted.org/packages/7e/44/04e758402ac97c94eb0653b41453edaab72626bc2b1aa10d8e5420f2d485/onnxruntime_genai-0.7.1-cp311-cp311-win_arm64.whl", hash = "sha256:04100fe07712eb8becc65881ff4490e421e87b6ec0b6b414581251b9f1d12fd3", size = 894553, upload-time = "2025-04-21T22:53:12.788Z" }, - { url = "https://files.pythonhosted.org/packages/c8/fa/6776850be8a0173f5d3df3026aa0a031e0e4b8712023633e2dca3e599129/onnxruntime_genai-0.7.1-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:480ec36799764352cc05e3c9dc9bc10f958faf4e83d1f69dcea4bd047cbf90fa", size = 990363, upload-time = "2025-04-21T22:53:02.897Z" }, - { url = "https://files.pythonhosted.org/packages/08/8b/550b04464e2586dac6444b4ebb08f14aae7475a3cc4ce9d55982f44369cf/onnxruntime_genai-0.7.1-cp312-cp312-macosx_12_0_x86_64.whl", hash = "sha256:ab350fd6a148a9ed11898f7f1b75c10303680ed23c728f0d9f1b4a9870aed6af", size = 1109628, upload-time = "2025-04-21T22:53:08.293Z" }, - { url = "https://files.pythonhosted.org/packages/9a/5c/d5e49136c2a26fdaa7b9712063a4ae201101258f7e10aad85ad53a775ed6/onnxruntime_genai-0.7.1-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:3785c1592ee1d44e46ec55760fd38f05ed3afb555d521d2d90e322189a999894", size = 1745228, upload-time = "2025-04-21T22:52:46.165Z" }, - { url = "https://files.pythonhosted.org/packages/10/9f/0a778c2e488b3ecb8995b40222a83c9fe9148a9771d7af954b577e1b7ed4/onnxruntime_genai-0.7.1-cp312-cp312-win_amd64.whl", hash = "sha256:a587ea1a71a7a4e59a8435c2c31ee2e4572125187c312d12bcdbab13df554a04", size = 920873, upload-time = "2025-04-21T22:53:18.857Z" }, - { url = "https://files.pythonhosted.org/packages/f9/75/7bc9b8795182d9d1097b25c2bbafafa8b4e5422ae297a7196b5864412ba0/onnxruntime_genai-0.7.1-cp312-cp312-win_arm64.whl", hash = "sha256:825a3336d20aaddfebaac162e209ce571f717feb1ab2ebc1101b3a405b30d58d", size = 894176, upload-time = "2025-04-21T22:53:14.498Z" }, - { url = "https://files.pythonhosted.org/packages/4f/68/17e35ab21bfd82e9d8fd27503c4b725400591b6af812e3c95a615a6f4add/onnxruntime_genai-0.7.1-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:56aed00de67a8e749d2eab5332bede996127416fc79a31ee4993ce35189e9450", size = 990486, upload-time = "2025-04-21T22:53:04.095Z" }, - { url = "https://files.pythonhosted.org/packages/a5/d6/46c83d9f23910d1b11c109c3f314242a066322fd28f28019b963bbd79674/onnxruntime_genai-0.7.1-cp313-cp313-macosx_12_0_x86_64.whl", hash = "sha256:229824c101d3f3ae92fd58e85d50879fa1b726f41184065e6379f33a731c78f3", size = 1109729, upload-time = "2025-04-21T22:53:10.222Z" }, - { url = "https://files.pythonhosted.org/packages/c9/93/d5354da877a3a1bf36a99f6741b4626ddac4cfa72b745307bfa7c900a39c/onnxruntime_genai-0.7.1-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c892a5efaf33c735c1effb227fc0759546cb7a26a8152f266c71ee2a6afa4273", size = 1745190, upload-time = "2025-04-21T22:52:47.981Z" }, - { url = "https://files.pythonhosted.org/packages/05/f6/b8aa7884ab2a5a48ecd9562d39a8f46ae0b82ad958c8c115f864ab3a7e19/onnxruntime_genai-0.7.1-cp313-cp313-win_amd64.whl", hash = "sha256:1b0d5ccbbf96033b46b67822dfd355e50682f781d3bb9ac72b6ef1236d66d131", size = 920868, upload-time = "2025-04-21T22:53:20.099Z" }, + { 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'" }, +] +wheels = [ + { url = "https://files.pythonhosted.org/packages/a7/d8/d91b7ea7bef3bae367382521fb592a3eccd19c0803aa5f01fbb3fad52291/onnxruntime_genai-0.8.0-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:7b167d68458e9f1da47cd7d93aea5eec520ec692e0817a8eece131a34470a9a5", size = 1217916, upload-time = "2025-05-17T22:50:03.237Z" }, + { url = "https://files.pythonhosted.org/packages/31/a6/4f9db21f1287607b8a41d459f3c7966b83a42ef3732de22c3488a97cafde/onnxruntime_genai-0.8.0-cp310-cp310-macosx_12_0_x86_64.whl", hash = "sha256:238e4cbd72ed2de78641196580ca87bc70378dea79a3c70bfbbdf3fce213fad6", size = 1354725, upload-time = "2025-05-17T22:50:09.636Z" }, + { url = "https://files.pythonhosted.org/packages/3c/94/0527f011e3013ed66f91d3b7f52a00ad5a2e0f2051aa2e9da5adf9e909a6/onnxruntime_genai-0.8.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:85f173de17a0a9b77749f90cf756f8fc0640e79675f8999d1d6c42be78bebe85", size = 8744277, upload-time = "2025-05-17T22:49:53.343Z" }, + { url = "https://files.pythonhosted.org/packages/6e/06/d44b94d9157ed76007348d4f0344ea0e6a88db15c5e980561b5363aeb56d/onnxruntime_genai-0.8.0-cp310-cp310-win_amd64.whl", hash = "sha256:989671901a334efd70d19b2b831dd3880bbe58ef92db457c29b3637518ed44d3", size = 2286316, upload-time = "2025-05-17T22:50:18.959Z" }, + { url = "https://files.pythonhosted.org/packages/ad/8a/daa887f8b6c4a39d6f164838d69f68933b2424f53a2eb9cabe75812c9f17/onnxruntime_genai-0.8.0-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:6a120e4fc507c7408f742190b3b221cfe80498f5beb7abc71cde212f6897e1d4", size = 1219293, upload-time = "2025-05-17T22:50:05.06Z" }, + { url = "https://files.pythonhosted.org/packages/a4/10/7c101b6dbf932d109bdf335c3e6cfc5fb4db7078834d7f6798e4d6c2ca5b/onnxruntime_genai-0.8.0-cp311-cp311-macosx_12_0_x86_64.whl", hash = "sha256:3dca06da02f7e1f85f4e8134415f4db7325d9797a34ea5d00f6d72b8161198f5", size = 1356444, upload-time = "2025-05-17T22:50:11.023Z" }, + { url = "https://files.pythonhosted.org/packages/9f/b6/de2a3ac47f7d67417d81901d657e3976558be50c9aa0e8dfe8e0d919af4f/onnxruntime_genai-0.8.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:6bd3a6283a6b05ac7e3fefd94afca01ee63074b8dcb2d98e175ad4aeb51ba838", size = 8745095, upload-time = "2025-05-17T22:49:56.688Z" }, + { url = "https://files.pythonhosted.org/packages/1e/24/fa3114d958c832248a40388e97ecd27e281be8528f8abbc45eaff016e96f/onnxruntime_genai-0.8.0-cp311-cp311-win_amd64.whl", hash = "sha256:eb734f04c3c75e14aea13e397fcc5535721888553eab459290c4566de1819fff", size = 2287663, upload-time = "2025-05-17T22:50:20.485Z" }, + { url = "https://files.pythonhosted.org/packages/36/72/471edbfa11c09a2dd807f8e80f1a98534164ecbe0c3e95bcddafa8daf76d/onnxruntime_genai-0.8.0-cp311-cp311-win_arm64.whl", hash = "sha256:25d9322c0180e65201e21e46f86f099fd009b81855fd6663f0782adc7b11f8ed", size = 2239347, upload-time = "2025-05-17T22:50:15.968Z" }, + { url = "https://files.pythonhosted.org/packages/6c/c7/1a5fa2a93e4bfa669aa8af81eac2490a42cdbe2c4c5495d3c053604a65b5/onnxruntime_genai-0.8.0-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:f0759ed03cd963e9fda544a9ffef164cfb61ba4d2276437effda18cab87bb617", size = 1219542, upload-time = "2025-05-17T22:50:06.811Z" }, + { url = "https://files.pythonhosted.org/packages/0a/82/7cbfa89e3d8fbc046088a0b4fcc3d65ea81ecb9d77a2cabb7db9d646689f/onnxruntime_genai-0.8.0-cp312-cp312-macosx_12_0_x86_64.whl", hash = "sha256:f68108c5bfafe4c576ec10d46465b36ef79b48210eaa41f32d4746b21abe3489", size = 1357539, upload-time = "2025-05-17T22:50:12.482Z" }, + { url = "https://files.pythonhosted.org/packages/91/c9/227157ef53531fbfeab62b76719c17b3338ee9f9a2eb0ce317afd2ddabfc/onnxruntime_genai-0.8.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:24d5a537896fb521e220d64e65d5bce839f857579b9f2042fbb7f1ce16466100", size = 8746367, upload-time = "2025-05-17T22:49:58.693Z" }, + { url = "https://files.pythonhosted.org/packages/14/ac/33f13358d9bd5dda1381d770a2b3af194563983b8400323190f7a4c4870f/onnxruntime_genai-0.8.0-cp312-cp312-win_amd64.whl", hash = "sha256:e6525ef359a3fbf61e0d0c324d92ea36004e801cd74f3170cf955ff60868d246", size = 2288533, upload-time = "2025-05-17T22:50:22.105Z" }, + { url = "https://files.pythonhosted.org/packages/77/7c/d68590ac3de41d93f6b88269276785efb58b91b56d03f735a7602b79afbb/onnxruntime_genai-0.8.0-cp312-cp312-win_arm64.whl", hash = "sha256:aef44082338d78f82e0bec1fa7336c260d2ee5119e72e13608605a3993f086c5", size = 2238538, upload-time = "2025-05-17T22:50:17.481Z" }, + { url = "https://files.pythonhosted.org/packages/dd/21/b017daefce94274581870726e277bf020b7e9281573fa2f077291c60f0d7/onnxruntime_genai-0.8.0-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:683f060ef2ab96425e992bea9cbb4b0d6cd6b0dafd832112527c5e25cc804ae7", size = 1219625, upload-time = "2025-05-17T22:50:08.181Z" }, + { url = "https://files.pythonhosted.org/packages/65/71/488c55a80708c76ccf48ba656ae1eccda30f7534233c9045779052d042ae/onnxruntime_genai-0.8.0-cp313-cp313-macosx_12_0_x86_64.whl", hash = "sha256:643d79e046a253b54c48b109ef59982bed5f12b3e4cfa6ef008e2762a286a76c", size = 1357665, upload-time = "2025-05-17T22:50:14.222Z" }, + { url = "https://files.pythonhosted.org/packages/d1/d9/98b8635f10d34aa34b6f9b9458dc3e79afdebfbe45c9ab5bfdae72e90879/onnxruntime_genai-0.8.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:9973ec980cda8095a0aefddc5039e0ee8aae30d4ef43344d955cd29bd7dec2a7", size = 8746737, upload-time = "2025-05-17T22:50:01.079Z" }, + { url = "https://files.pythonhosted.org/packages/37/e7/debfe8ad2658ddeb2997683b82d572f9d941ee277490ef6bbf3a546a23ab/onnxruntime_genai-0.8.0-cp313-cp313-win_amd64.whl", hash = "sha256:e263c5668c365c5b8b500829054c521018c9861b357fc086268d56846e810e21", size = 2288630, upload-time = "2025-05-17T22:50:23.522Z" }, ] [[package]] name = "openai" -version = "1.78.1" +version = "1.82.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "anyio", marker = "sys_platform == 'darwin' or sys_platform == 'linux' or sys_platform == 'win32'" }, @@ -3486,9 +3454,9 @@ dependencies = [ { name = "tqdm", marker = "sys_platform == 'darwin' or sys_platform == 'linux' or sys_platform == 'win32'" }, { name = "typing-extensions", marker = "sys_platform == 'darwin' or sys_platform == 'linux' or sys_platform == 'win32'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/a4/3f/4e5e7b0548a15eabc4a755c93cd5f9564887e3d2fd45b6ff531352e5859d/openai-1.78.1.tar.gz", hash = "sha256:8b26b364531b100df1b961d03560042e5f5be11301d7d49a6cd1a2b9af824dca", size = 442985, upload-time = "2025-05-12T09:59:51.098Z" } +sdist = { url = "https://files.pythonhosted.org/packages/3f/19/6b09bb3132f7e1a7a2291fd46fb33659bbccca041f863abd682e14ba86d7/openai-1.82.0.tar.gz", hash = "sha256:b0a009b9a58662d598d07e91e4219ab4b1e3d8ba2db3f173896a92b9b874d1a7", size = 461092, upload-time = "2025-05-22T20:08:07.282Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/3c/4c/3889bc332a6c743751eb78a4bada5761e50a8a847ff0e46c1bd23ce12362/openai-1.78.1-py3-none-any.whl", hash = "sha256:7368bf147ca499804cc408fe68cdb6866a060f38dec961bbc97b04f9d917907e", size = 680917, upload-time = "2025-05-12T09:59:48.948Z" }, + { url = "https://files.pythonhosted.org/packages/51/4b/a59464ee5f77822a81ee069b4021163a0174940a92685efc3cf8b4c443a3/openai-1.82.0-py3-none-any.whl", hash = "sha256:8c40647fea1816516cb3de5189775b30b5f4812777e40b8768f361f232b61b30", size = 720412, upload-time = "2025-05-22T20:08:05.637Z" }, ] [[package]] @@ -3542,32 +3510,32 @@ wheels = [ [[package]] name = "opentelemetry-api" -version = "1.33.0" +version = "1.33.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "deprecated", marker = "sys_platform == 'darwin' or sys_platform == 'linux' or sys_platform == 'win32'" }, { name = "importlib-metadata", marker = "sys_platform == 'darwin' or sys_platform == 'linux' or sys_platform == 'win32'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/70/ca/920a73b4a11cd271ba1c62f34dba27d7783996a6a7ac0bac7c83b230736d/opentelemetry_api-1.33.0.tar.gz", hash = "sha256:cc4380fd2e6da7dcb52a828ea81844ed1f4f2eb638ca3c816775109d93d58ced", size = 65000, upload-time = "2025-05-09T14:56:00.967Z" } +sdist = { url = "https://files.pythonhosted.org/packages/9a/8d/1f5a45fbcb9a7d87809d460f09dc3399e3fbd31d7f3e14888345e9d29951/opentelemetry_api-1.33.1.tar.gz", hash = "sha256:1c6055fc0a2d3f23a50c7e17e16ef75ad489345fd3df1f8b8af7c0bbf8a109e8", size = 65002, upload-time = "2025-05-16T18:52:41.146Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/e6/c4/26c7ec8e51c19632f42503dbabed286c261fb06f8f61ffd348690e36958a/opentelemetry_api-1.33.0-py3-none-any.whl", hash = "sha256:158df154f628e6615b65fdf6e59f99afabea7213e72c5809dd4adf06c0d997cd", size = 65772, upload-time = "2025-05-09T14:55:38.395Z" }, + { url = "https://files.pythonhosted.org/packages/05/44/4c45a34def3506122ae61ad684139f0bbc4e00c39555d4f7e20e0e001c8a/opentelemetry_api-1.33.1-py3-none-any.whl", hash = "sha256:4db83ebcf7ea93e64637ec6ee6fabee45c5cbe4abd9cf3da95c43828ddb50b83", size = 65771, upload-time = "2025-05-16T18:52:17.419Z" }, ] [[package]] name = "opentelemetry-exporter-otlp-proto-common" -version = "1.33.0" +version = "1.33.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "opentelemetry-proto", marker = "sys_platform == 'darwin' or sys_platform == 'linux' or sys_platform == 'win32'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/e2/31/70add0d54358ea5007f687b931a1f980e6c977299897cce763e968ffc4a5/opentelemetry_exporter_otlp_proto_common-1.33.0.tar.gz", hash = "sha256:2f43679dab68ce7708db18cb145b59a7e9184d46608ef037c9c22f47c5beb320", size = 20830, upload-time = "2025-05-09T14:56:03.176Z" } +sdist = { url = "https://files.pythonhosted.org/packages/7a/18/a1ec9dcb6713a48b4bdd10f1c1e4d5d2489d3912b80d2bcc059a9a842836/opentelemetry_exporter_otlp_proto_common-1.33.1.tar.gz", hash = "sha256:c57b3fa2d0595a21c4ed586f74f948d259d9949b58258f11edb398f246bec131", size = 20828, upload-time = "2025-05-16T18:52:43.795Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/15/ee/a8a2a0c965a8ac53d31a3d5b5582de16d27ece4108c152f42adeb11a6455/opentelemetry_exporter_otlp_proto_common-1.33.0-py3-none-any.whl", hash = "sha256:5c282fc752e4ebdf484c6af2f22d0af2048a5685400d59524e8a3dbcee315014", size = 18840, upload-time = "2025-05-09T14:55:42.378Z" }, + { url = "https://files.pythonhosted.org/packages/09/52/9bcb17e2c29c1194a28e521b9d3f2ced09028934c3c52a8205884c94b2df/opentelemetry_exporter_otlp_proto_common-1.33.1-py3-none-any.whl", hash = "sha256:b81c1de1ad349785e601d02715b2d29d6818aed2c809c20219f3d1f20b038c36", size = 18839, upload-time = "2025-05-16T18:52:22.447Z" }, ] [[package]] name = "opentelemetry-exporter-otlp-proto-grpc" -version = "1.33.0" +version = "1.33.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "deprecated", marker = "sys_platform == 'darwin' or sys_platform == 'linux' or sys_platform == 'win32'" }, @@ -3579,14 +3547,14 @@ dependencies = [ { name = "opentelemetry-proto", marker = "sys_platform == 'darwin' or sys_platform == 'linux' or sys_platform == 'win32'" }, { name = "opentelemetry-sdk", marker = "sys_platform == 'darwin' or sys_platform == 'linux' or sys_platform == 'win32'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/fc/86/13350f3a15800b6be90c3e2da98571e1421a50c06384cc2aad06a7266b20/opentelemetry_exporter_otlp_proto_grpc-1.33.0.tar.gz", hash = "sha256:99a2ec88f05ffa36897402820a73178cbc37dc3f9ebe2dbde6209be3303446f4", size = 22555, upload-time = "2025-05-09T14:56:03.812Z" } +sdist = { url = "https://files.pythonhosted.org/packages/d8/5f/75ef5a2a917bd0e6e7b83d3fb04c99236ee958f6352ba3019ea9109ae1a6/opentelemetry_exporter_otlp_proto_grpc-1.33.1.tar.gz", hash = "sha256:345696af8dc19785fac268c8063f3dc3d5e274c774b308c634f39d9c21955728", size = 22556, upload-time = "2025-05-16T18:52:44.76Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/6b/e5/c37dae2fbc8c2b5d99ab1c6a0196e25df2e3f9980d19140506862ace2dc5/opentelemetry_exporter_otlp_proto_grpc-1.33.0-py3-none-any.whl", hash = "sha256:04b11348a40f4c21958d704083445f9bbd32155e046ba9157133fa1bf864d2f2", size = 18592, upload-time = "2025-05-09T14:55:43.706Z" }, + { url = "https://files.pythonhosted.org/packages/ba/ec/6047e230bb6d092c304511315b13893b1c9d9260044dd1228c9d48b6ae0e/opentelemetry_exporter_otlp_proto_grpc-1.33.1-py3-none-any.whl", hash = "sha256:7e8da32c7552b756e75b4f9e9c768a61eb47dee60b6550b37af541858d669ce1", size = 18591, upload-time = "2025-05-16T18:52:23.772Z" }, ] [[package]] name = "opentelemetry-instrumentation" -version = "0.54b0" +version = "0.54b1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "opentelemetry-api", marker = "sys_platform == 'darwin' or sys_platform == 'linux' or sys_platform == 'win32'" }, @@ -3594,14 +3562,14 @@ dependencies = [ { name = "packaging", marker = "sys_platform == 'darwin' or sys_platform == 'linux' or sys_platform == 'win32'" }, { name = "wrapt", marker = "sys_platform == 'darwin' or sys_platform == 'linux' or sys_platform == 'win32'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/2b/00/00ab7ce770c419337e3286c29e59f979a05694aebf15a957bd17d7a0c2cb/opentelemetry_instrumentation-0.54b0.tar.gz", hash = "sha256:2949d0bbf2316eb5d928a5ef610d0a8a2c261ba80167d878abf6016e1c4ae7bb", size = 28434, upload-time = "2025-05-09T14:59:13.803Z" } +sdist = { url = "https://files.pythonhosted.org/packages/c3/fd/5756aea3fdc5651b572d8aef7d94d22a0a36e49c8b12fcb78cb905ba8896/opentelemetry_instrumentation-0.54b1.tar.gz", hash = "sha256:7658bf2ff914b02f246ec14779b66671508125c0e4227361e56b5ebf6cef0aec", size = 28436, upload-time = "2025-05-16T19:03:22.223Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/17/e9/426f4e5da65e2f8f53e7a8d2551bb56e49776cccf0b99cd99ab6295542cd/opentelemetry_instrumentation-0.54b0-py3-none-any.whl", hash = "sha256:1a502238f8af65625ad48800d268d467653e319d959e1732d3b3248916d21327", size = 31018, upload-time = "2025-05-09T14:58:13.019Z" }, + { url = "https://files.pythonhosted.org/packages/f4/89/0790abc5d9c4fc74bd3e03cb87afe2c820b1d1a112a723c1163ef32453ee/opentelemetry_instrumentation-0.54b1-py3-none-any.whl", hash = "sha256:a4ae45f4a90c78d7006c51524f57cd5aa1231aef031eae905ee34d5423f5b198", size = 31019, upload-time = "2025-05-16T19:02:15.611Z" }, ] [[package]] name = "opentelemetry-instrumentation-asgi" -version = "0.54b0" +version = "0.54b1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "asgiref", marker = "sys_platform == 'darwin' or sys_platform == 'linux' or sys_platform == 'win32'" }, @@ -3610,14 +3578,14 @@ dependencies = [ { name = "opentelemetry-semantic-conventions", marker = "sys_platform == 'darwin' or sys_platform == 'linux' or sys_platform == 'win32'" }, { name = "opentelemetry-util-http", marker = "sys_platform == 'darwin' or sys_platform == 'linux' or sys_platform == 'win32'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/71/19/2b773a0126ea27d1d5d29b1e134863aa7f769a3671aa1e1966633a0bc548/opentelemetry_instrumentation_asgi-0.54b0.tar.gz", hash = "sha256:4ac8d85d5cdd2bfd7329e3f763974c1761964f92f70537a77d3fe744989fc40b", size = 24231, upload-time = "2025-05-09T14:59:17.607Z" } +sdist = { url = "https://files.pythonhosted.org/packages/20/f7/a3377f9771947f4d3d59c96841d3909274f446c030dbe8e4af871695ddee/opentelemetry_instrumentation_asgi-0.54b1.tar.gz", hash = "sha256:ab4df9776b5f6d56a78413c2e8bbe44c90694c67c844a1297865dc1bd926ed3c", size = 24230, upload-time = "2025-05-16T19:03:30.234Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/a6/61/9298c94803d4dd335aa4b01e43a4dc953801ba1f48300e4bb69a44729db9/opentelemetry_instrumentation_asgi-0.54b0-py3-none-any.whl", hash = "sha256:f0147f007ce3bdc07b64c9eb18f5b2caa0e64598ed2a284ff00362fe9725233d", size = 16339, upload-time = "2025-05-09T14:58:21.868Z" }, + { url = "https://files.pythonhosted.org/packages/20/24/7a6f0ae79cae49927f528ecee2db55a5bddd87b550e310ce03451eae7491/opentelemetry_instrumentation_asgi-0.54b1-py3-none-any.whl", hash = "sha256:84674e822b89af563b283a5283c2ebb9ed585d1b80a1c27fb3ac20b562e9f9fc", size = 16338, upload-time = "2025-05-16T19:02:22.808Z" }, ] [[package]] name = "opentelemetry-instrumentation-fastapi" -version = "0.54b0" +version = "0.54b1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "opentelemetry-api", marker = "sys_platform == 'darwin' or sys_platform == 'linux' or sys_platform == 'win32'" }, @@ -3626,57 +3594,57 @@ dependencies = [ { name = "opentelemetry-semantic-conventions", marker = "sys_platform == 'darwin' or sys_platform == 'linux' or sys_platform == 'win32'" }, { name = "opentelemetry-util-http", marker = "sys_platform == 'darwin' or sys_platform == 'linux' or sys_platform == 'win32'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/ae/e7/b6e39b900027217b5fe3acd436f77a5e8265048cb8b23858bc6e5816ee1a/opentelemetry_instrumentation_fastapi-0.54b0.tar.gz", hash = "sha256:d90979b5325e42d1a39f3bacc475781d7c2e7276c15f97e567f8451a20194ef7", size = 19321, upload-time = "2025-05-09T14:59:28.697Z" } +sdist = { url = "https://files.pythonhosted.org/packages/98/3b/9a262cdc1a4defef0e52afebdde3e8add658cc6f922e39e9dcee0da98349/opentelemetry_instrumentation_fastapi-0.54b1.tar.gz", hash = "sha256:1fcad19cef0db7092339b571a59e6f3045c9b58b7fd4670183f7addc459d78df", size = 19325, upload-time = "2025-05-16T19:03:45.359Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/bd/62/a635471b91c8c33636ea4476565b0f4ce3e647ec85793f8d5888deefe658/opentelemetry_instrumentation_fastapi-0.54b0-py3-none-any.whl", hash = "sha256:2deeeb221e21ced4b0b12081605044170018720e7b25da5e198302e974dfe7ee", size = 12127, upload-time = "2025-05-09T14:58:38.999Z" }, + { url = "https://files.pythonhosted.org/packages/df/9c/6b2b0f9d6c5dea7528ae0bf4e461dd765b0ae35f13919cd452970bb0d0b3/opentelemetry_instrumentation_fastapi-0.54b1-py3-none-any.whl", hash = "sha256:fb247781cfa75fd09d3d8713c65e4a02bd1e869b00e2c322cc516d4b5429860c", size = 12125, upload-time = "2025-05-16T19:02:41.172Z" }, ] [[package]] name = "opentelemetry-proto" -version = "1.33.0" +version = "1.33.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "protobuf", marker = "sys_platform == 'darwin' or sys_platform == 'linux' or sys_platform == 'win32'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/cb/55/13a941b5fa0730875f2ef534cca8e09dd00142f4a4e1ab781f9825b212c4/opentelemetry_proto-1.33.0.tar.gz", hash = "sha256:ec5aa35486c990207ead2512a8d616d1b324928562c91dbc7e0cb9aa48c60b7b", size = 34362, upload-time = "2025-05-09T14:56:11.569Z" } +sdist = { url = "https://files.pythonhosted.org/packages/f6/dc/791f3d60a1ad8235930de23eea735ae1084be1c6f96fdadf38710662a7e5/opentelemetry_proto-1.33.1.tar.gz", hash = "sha256:9627b0a5c90753bf3920c398908307063e4458b287bb890e5c1d6fa11ad50b68", size = 34363, upload-time = "2025-05-16T18:52:52.141Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/8c/44/8f4029c09c7d4f275c7ed56af186ebd82af257a879266e9b3965f82ca09d/opentelemetry_proto-1.33.0-py3-none-any.whl", hash = "sha256:84a1d7daacac4aa0f24a5b1190a3e0619011dbff56f945fc2b6fc0a18f48b942", size = 55856, upload-time = "2025-05-09T14:55:55.513Z" }, + { url = "https://files.pythonhosted.org/packages/c4/29/48609f4c875c2b6c80930073c82dd1cafd36b6782244c01394007b528960/opentelemetry_proto-1.33.1-py3-none-any.whl", hash = "sha256:243d285d9f29663fc7ea91a7171fcc1ccbbfff43b48df0774fd64a37d98eda70", size = 55854, upload-time = "2025-05-16T18:52:36.269Z" }, ] [[package]] name = "opentelemetry-sdk" -version = "1.33.0" +version = "1.33.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "opentelemetry-api", marker = "sys_platform == 'darwin' or sys_platform == 'linux' or sys_platform == 'win32'" }, { name = "opentelemetry-semantic-conventions", marker = "sys_platform == 'darwin' or sys_platform == 'linux' or sys_platform == 'win32'" }, { name = "typing-extensions", marker = "sys_platform == 'darwin' or sys_platform == 'linux' or sys_platform == 'win32'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/37/0a/b7ae406175a2798a767e12db223e842911d9c398eea100c41c989afd2aa8/opentelemetry_sdk-1.33.0.tar.gz", hash = "sha256:a7fc56d1e07b218fcc316b24d21b59d3f1967b2ca22c217b05da3a26b797cc68", size = 161381, upload-time = "2025-05-09T14:56:12.347Z" } +sdist = { url = "https://files.pythonhosted.org/packages/67/12/909b98a7d9b110cce4b28d49b2e311797cffdce180371f35eba13a72dd00/opentelemetry_sdk-1.33.1.tar.gz", hash = "sha256:85b9fcf7c3d23506fbc9692fd210b8b025a1920535feec50bd54ce203d57a531", size = 161885, upload-time = "2025-05-16T18:52:52.832Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/b4/34/831f5d9ae9375c9ba2446cb3cc0be79d8d73b78f813c9567e1615c2624f6/opentelemetry_sdk-1.33.0-py3-none-any.whl", hash = "sha256:bed376b6d37fbf00688bb65edfee817dd01d48b8559212831437529a6066049a", size = 118861, upload-time = "2025-05-09T14:55:56.956Z" }, + { url = "https://files.pythonhosted.org/packages/df/8e/ae2d0742041e0bd7fe0d2dcc5e7cce51dcf7d3961a26072d5b43cc8fa2a7/opentelemetry_sdk-1.33.1-py3-none-any.whl", hash = "sha256:19ea73d9a01be29cacaa5d6c8ce0adc0b7f7b4d58cc52f923e4413609f670112", size = 118950, upload-time = "2025-05-16T18:52:37.297Z" }, ] [[package]] name = "opentelemetry-semantic-conventions" -version = "0.54b0" +version = "0.54b1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "deprecated", marker = "sys_platform == 'darwin' or sys_platform == 'linux' or sys_platform == 'win32'" }, { name = "opentelemetry-api", marker = "sys_platform == 'darwin' or sys_platform == 'linux' or sys_platform == 'win32'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/92/8c/bc970d1599ff40b7913c953a95195addf11c81a27cc85d5ed568e9f8c57f/opentelemetry_semantic_conventions-0.54b0.tar.gz", hash = "sha256:467b739977bdcb079af1af69f73632535cdb51099d5e3c5709a35d10fe02a9c9", size = 118646, upload-time = "2025-05-09T14:56:13.596Z" } +sdist = { url = "https://files.pythonhosted.org/packages/5b/2c/d7990fc1ffc82889d466e7cd680788ace44a26789809924813b164344393/opentelemetry_semantic_conventions-0.54b1.tar.gz", hash = "sha256:d1cecedae15d19bdaafca1e56b29a66aa286f50b5d08f036a145c7f3e9ef9cee", size = 118642, upload-time = "2025-05-16T18:52:53.962Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/c8/aa/f7c46c19aee189e0123ef7209eaafc417e242b2073485dfb40523d6d8612/opentelemetry_semantic_conventions-0.54b0-py3-none-any.whl", hash = "sha256:fad7c1cf8908fd449eb5cf9fbbeefb301acf4bc995101f85277899cec125d823", size = 194937, upload-time = "2025-05-09T14:55:58.562Z" }, + { url = "https://files.pythonhosted.org/packages/0a/80/08b1698c52ff76d96ba440bf15edc2f4bc0a279868778928e947c1004bdd/opentelemetry_semantic_conventions-0.54b1-py3-none-any.whl", hash = "sha256:29dab644a7e435b58d3a3918b58c333c92686236b30f7891d5e51f02933ca60d", size = 194938, upload-time = "2025-05-16T18:52:38.796Z" }, ] [[package]] name = "opentelemetry-util-http" -version = "0.54b0" +version = "0.54b1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/5e/14/51f18a82e858a06332e56fb523afbd5e5ff2dac5511a8c4ca64d163f15ca/opentelemetry_util_http-0.54b0.tar.gz", hash = "sha256:2b5fe7157928bdbde194d38df7cbd35a679631fe5b6c23b2c4a271229f7e42b5", size = 8041, upload-time = "2025-05-09T14:59:53.905Z" } +sdist = { url = "https://files.pythonhosted.org/packages/a8/9f/1d8a1d1f34b9f62f2b940b388bf07b8167a8067e70870055bd05db354e5c/opentelemetry_util_http-0.54b1.tar.gz", hash = "sha256:f0b66868c19fbaf9c9d4e11f4a7599fa15d5ea50b884967a26ccd9d72c7c9d15", size = 8044, upload-time = "2025-05-16T19:04:10.79Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/25/e0/b53c6af5f2a44c301290e7853829e5a3b195d1057a1ff24ab165f18f67ce/opentelemetry_util_http-0.54b0-py3-none-any.whl", hash = "sha256:40598360e08ee7f8ea563f40dee5e30b1c15be54615e11497aaf190930e94250", size = 7302, upload-time = "2025-05-09T14:59:10.374Z" }, + { url = "https://files.pythonhosted.org/packages/a4/ef/c5aa08abca6894792beed4c0405e85205b35b8e73d653571c9ff13a8e34e/opentelemetry_util_http-0.54b1-py3-none-any.whl", hash = "sha256:b1c91883f980344a1c3c486cffd47ae5c9c1dd7323f9cbe9fdb7cadb401c87c9", size = 7301, upload-time = "2025-05-16T19:03:18.18Z" }, ] [[package]] @@ -4015,7 +3983,7 @@ wheels = [ [[package]] name = "posthog" -version = "4.0.1" +version = "4.2.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "backoff", marker = "sys_platform == 'darwin' or sys_platform == 'linux' or sys_platform == 'win32'" }, @@ -4024,9 +3992,9 @@ dependencies = [ { name = "requests", marker = "sys_platform == 'darwin' or sys_platform == 'linux' or sys_platform == 'win32'" }, { name = "six", marker = "sys_platform == 'darwin' or sys_platform == 'linux' or sys_platform == 'win32'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/cf/6f/835a48728adb60b51dbe6bcc528480e38f1f80769a48704f687d83aefe7e/posthog-4.0.1.tar.gz", hash = "sha256:77e7ebfc6086972db421d3e05c91d5431b2b964865d33a9a32e55dd88da4bff8", size = 78040, upload-time = "2025-04-29T14:15:19.367Z" } +sdist = { url = "https://files.pythonhosted.org/packages/ce/5b/2e9890700b7b55a370edbfbe5948eae780d48af9b46ad06ea2e7970576f4/posthog-4.2.0.tar.gz", hash = "sha256:c4abc95de03294be005b3b7e8735e9d7abab88583da26262112bacce64b0c3b5", size = 80727, upload-time = "2025-05-23T23:23:55.943Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/cd/f0/8141c04bf105e7fe71b2803fe2193d74a127b447fd149b3e93711ca450c5/posthog-4.0.1-py2.py3-none-any.whl", hash = "sha256:0c76cbab3e5ab0096c4f591c0b536465478357270f926d11ff833c97984659d8", size = 92029, upload-time = "2025-04-29T14:15:18.13Z" }, + { url = "https://files.pythonhosted.org/packages/51/16/7b6c5844acee2d343d463ee0e3143cd8c7c48a6c0d079a2f7daf0c80b95c/posthog-4.2.0-py2.py3-none-any.whl", hash = "sha256:60c7066caac43e43e326e9196d8c1aadeafc8b0be9e5c108446e352711fa456b", size = 96692, upload-time = "2025-05-23T23:23:54.384Z" }, ] [[package]] @@ -4411,7 +4379,7 @@ wheels = [ [[package]] name = "pydantic" -version = "2.11.4" +version = "2.11.5" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "annotated-types", marker = "sys_platform == 'darwin' or sys_platform == 'linux' or sys_platform == 'win32'" }, @@ -4419,9 +4387,9 @@ dependencies = [ { name = "typing-extensions", marker = "sys_platform == 'darwin' or sys_platform == 'linux' or sys_platform == 'win32'" }, { name = "typing-inspection", marker = "sys_platform == 'darwin' or sys_platform == 'linux' or sys_platform == 'win32'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/77/ab/5250d56ad03884ab5efd07f734203943c8a8ab40d551e208af81d0257bf2/pydantic-2.11.4.tar.gz", hash = "sha256:32738d19d63a226a52eed76645a98ee07c1f410ee41d93b4afbfa85ed8111c2d", size = 786540, upload-time = "2025-04-29T20:38:55.02Z" } +sdist = { url = "https://files.pythonhosted.org/packages/f0/86/8ce9040065e8f924d642c58e4a344e33163a07f6b57f836d0d734e0ad3fb/pydantic-2.11.5.tar.gz", hash = "sha256:7f853db3d0ce78ce8bbb148c401c2cdd6431b3473c0cdff2755c7690952a7b7a", size = 787102, upload-time = "2025-05-22T21:18:08.761Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/e7/12/46b65f3534d099349e38ef6ec98b1a5a81f42536d17e0ba382c28c67ba67/pydantic-2.11.4-py3-none-any.whl", hash = "sha256:d9615eaa9ac5a063471da949c8fc16376a84afb5024688b3ff885693506764eb", size = 443900, upload-time = "2025-04-29T20:38:52.724Z" }, + { url = "https://files.pythonhosted.org/packages/b5/69/831ed22b38ff9b4b64b66569f0e5b7b97cf3638346eb95a2147fdb49ad5f/pydantic-2.11.5-py3-none-any.whl", hash = "sha256:f9c26ba06f9747749ca1e5c94d6a85cb84254577553c8785576fd38fa64dc0f7", size = 444229, upload-time = "2025-05-22T21:18:06.329Z" }, ] [[package]] @@ -4612,21 +4580,21 @@ wheels = [ [[package]] name = "pymilvus" -version = "2.5.8" +version = "2.5.10" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "python_full_version < '3.11' and sys_platform == 'darwin'", - "python_full_version == '3.11.*' and sys_platform == 'darwin'", "python_full_version >= '4.0' and sys_platform == 'darwin'", "python_full_version == '3.12.*' and sys_platform == 'darwin'", - "python_full_version < '3.11' and sys_platform == 'linux'", - "python_full_version == '3.11.*' and sys_platform == 'linux'", + "python_full_version == '3.11.*' and sys_platform == 'darwin'", + "python_full_version < '3.11' and sys_platform == 'darwin'", "python_full_version >= '4.0' and sys_platform == 'linux'", "python_full_version == '3.12.*' and sys_platform == 'linux'", - "python_full_version < '3.11' and sys_platform == 'win32'", - "python_full_version == '3.11.*' and sys_platform == 'win32'", + "python_full_version == '3.11.*' and sys_platform == 'linux'", + "python_full_version < '3.11' and sys_platform == 'linux'", "python_full_version >= '4.0' and sys_platform == 'win32'", "python_full_version == '3.12.*' and sys_platform == 'win32'", + "python_full_version == '3.11.*' and sys_platform == 'win32'", + "python_full_version < '3.11' and sys_platform == 'win32'", ] dependencies = [ { name = "grpcio", version = "1.67.1", source = { registry = "https://pypi.org/simple" }, marker = "(python_full_version < '3.13' and sys_platform == 'darwin') or (python_full_version >= '4.0' and sys_platform == 'darwin') or (python_full_version < '3.13' and sys_platform == 'linux') or (python_full_version >= '4.0' and sys_platform == 'linux') or (python_full_version < '3.13' and sys_platform == 'win32') or (python_full_version >= '4.0' and sys_platform == 'win32')" }, @@ -4637,9 +4605,9 @@ dependencies = [ { name = "setuptools", marker = "(python_full_version < '3.13' and sys_platform == 'darwin') or (python_full_version >= '4.0' and sys_platform == 'darwin') or (python_full_version < '3.13' and sys_platform == 'linux') or (python_full_version >= '4.0' and sys_platform == 'linux') or (python_full_version < '3.13' and sys_platform == 'win32') or (python_full_version >= '4.0' and sys_platform == 'win32')" }, { name = "ujson", marker = "(python_full_version < '3.13' and sys_platform == 'darwin') or (python_full_version >= '4.0' and sys_platform == 'darwin') or (python_full_version < '3.13' and sys_platform == 'linux') or (python_full_version >= '4.0' and sys_platform == 'linux') or (python_full_version < '3.13' and sys_platform == 'win32') or (python_full_version >= '4.0' and sys_platform == 'win32')" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/3b/64/3bc30ab75104a21b9622915b93ffe42f6d250d5d16113624407fcfd42a12/pymilvus-2.5.8.tar.gz", hash = "sha256:48923e7efeebcc366d32b644772796f60484e0ca1a5afc1606d21a10ed98133c", size = 1260355, upload-time = "2025-04-28T09:27:55.256Z" } +sdist = { url = "https://files.pythonhosted.org/packages/da/e2/88f126a08d8eefba7341e3eb323406a227146094aab7137a2b91d882e98d/pymilvus-2.5.10.tar.gz", hash = "sha256:cc44ad776aeab781ee4c4a4d334b73e746066ab2fb6722c5311f02efa6fc54a2", size = 1260364, upload-time = "2025-05-23T06:08:06.992Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/6f/96/2ce2a0b601d95e373897eb2334f83dba615bd5647b0e4908ff30959920d2/pymilvus-2.5.8-py3-none-any.whl", hash = "sha256:6f33c9e78c041373df6a94724c90ca83448fd231aa33d6298a7a84ed2a5a0236", size = 227647, upload-time = "2025-04-28T09:27:53.403Z" }, + { url = "https://files.pythonhosted.org/packages/b0/4b/847704930ad8ddd0d0975e9a3a5e3fe704f642debe97454135c2b9ee7081/pymilvus-2.5.10-py3-none-any.whl", hash = "sha256:7da540f93068871cda3941602c55227aeaafb66f2f0d9c05e8f9db783716b100", size = 227635, upload-time = "2025-05-23T06:08:05.397Z" }, ] [[package]] @@ -4732,15 +4700,15 @@ wheels = [ [[package]] name = "pyopenssl" -version = "25.0.0" +version = "25.1.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "cryptography", marker = "sys_platform == 'darwin' or sys_platform == 'linux' or sys_platform == 'win32'" }, { name = "typing-extensions", 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')" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/9f/26/e25b4a374b4639e0c235527bbe31c0524f26eda701d79456a7e1877f4cc5/pyopenssl-25.0.0.tar.gz", hash = "sha256:cd2cef799efa3936bb08e8ccb9433a575722b9dd986023f1cabc4ae64e9dac16", size = 179573, upload-time = "2025-01-12T17:22:48.897Z" } +sdist = { url = "https://files.pythonhosted.org/packages/04/8c/cd89ad05804f8e3c17dea8f178c3f40eeab5694c30e0c9f5bcd49f576fc3/pyopenssl-25.1.0.tar.gz", hash = "sha256:8d031884482e0c67ee92bf9a4d8cceb08d92aba7136432ffb0703c5280fc205b", size = 179937, upload-time = "2025-05-17T16:28:31.31Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/ca/d7/eb76863d2060dcbe7c7e6cccfd95ac02ea0b9acc37745a0d99ff6457aefb/pyOpenSSL-25.0.0-py3-none-any.whl", hash = "sha256:424c247065e46e76a37411b9ab1782541c23bb658bf003772c3405fbaa128e90", size = 56453, upload-time = "2025-01-12T17:22:43.44Z" }, + { url = "https://files.pythonhosted.org/packages/80/28/2659c02301b9500751f8d42f9a6632e1508aa5120de5e43042b8b30f8d5d/pyopenssl-25.1.0-py3-none-any.whl", hash = "sha256:2b11f239acc47ac2e5aca04fd7fa829800aeee22a2eb30d744572a157bd8a1ab", size = 56771, upload-time = "2025-05-17T16:28:29.197Z" }, ] [[package]] @@ -5036,58 +5004,21 @@ wheels = [ name = "qdrant-client" version = "1.12.1" source = { registry = "https://pypi.org/simple" } -resolution-markers = [ - "python_full_version >= '4.0' and sys_platform == 'darwin'", - "python_full_version >= '3.13' and python_full_version < '4.0' and sys_platform == 'darwin'", - "python_full_version >= '4.0' and sys_platform == 'linux'", - "python_full_version >= '3.13' and python_full_version < '4.0' and sys_platform == 'linux'", - "python_full_version >= '4.0' and sys_platform == 'win32'", - "python_full_version >= '3.13' and python_full_version < '4.0' and sys_platform == 'win32'", -] dependencies = [ - { name = "grpcio", version = "1.67.1", source = { registry = "https://pypi.org/simple" }, marker = "(python_full_version >= '4.0' and sys_platform == 'darwin') or (python_full_version >= '4.0' and sys_platform == 'linux') or (python_full_version >= '4.0' and sys_platform == 'win32')" }, + { name = "grpcio", version = "1.67.1", source = { registry = "https://pypi.org/simple" }, marker = "(python_full_version < '3.13' and sys_platform == 'darwin') or (python_full_version >= '4.0' and sys_platform == 'darwin') or (python_full_version < '3.13' and sys_platform == 'linux') or (python_full_version >= '4.0' and sys_platform == 'linux') or (python_full_version < '3.13' and sys_platform == 'win32') or (python_full_version >= '4.0' and sys_platform == 'win32')" }, { name = "grpcio", version = "1.71.0", source = { registry = "https://pypi.org/simple" }, marker = "(python_full_version >= '3.13' and python_full_version < '4.0' and sys_platform == 'darwin') or (python_full_version >= '3.13' and python_full_version < '4.0' and sys_platform == 'linux') or (python_full_version >= '3.13' and python_full_version < '4.0' and sys_platform == 'win32')" }, - { name = "grpcio-tools", 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 = "httpx", extra = ["http2"], 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 = "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 = "portalocker", 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 = "pydantic", 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 = "urllib3", 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 = "grpcio-tools", marker = "sys_platform == 'darwin' or sys_platform == 'linux' or sys_platform == 'win32'" }, + { name = "httpx", extra = ["http2"], marker = "sys_platform == 'darwin' or sys_platform == 'linux' or sys_platform == 'win32'" }, + { name = "numpy", marker = "sys_platform == 'darwin' or sys_platform == 'linux' or sys_platform == 'win32'" }, + { name = "portalocker", marker = "sys_platform == 'darwin' or sys_platform == 'linux' or sys_platform == 'win32'" }, + { name = "pydantic", marker = "sys_platform == 'darwin' or sys_platform == 'linux' or sys_platform == 'win32'" }, + { name = "urllib3", marker = "sys_platform == 'darwin' or sys_platform == 'linux' or sys_platform == 'win32'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/15/5e/ec560881e086f893947c8798949c72de5cfae9453fd05c2250f8dfeaa571/qdrant_client-1.12.1.tar.gz", hash = "sha256:35e8e646f75b7b883b3d2d0ee4c69c5301000bba41c82aa546e985db0f1aeb72", size = 237441, upload-time = "2024-10-29T17:31:09.698Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/68/c0/eef4fe9dad6d41333f7dc6567fa8144ffc1837c8a0edfc2317d50715335f/qdrant_client-1.12.1-py3-none-any.whl", hash = "sha256:b2d17ce18e9e767471368380dd3bbc4a0e3a0e2061fedc9af3542084b48451e0", size = 267171, upload-time = "2024-10-29T17:31:07.758Z" }, ] -[[package]] -name = "qdrant-client" -version = "1.14.2" -source = { registry = "https://pypi.org/simple" } -resolution-markers = [ - "python_full_version < '3.11' and sys_platform == 'darwin'", - "python_full_version == '3.11.*' and sys_platform == 'darwin'", - "python_full_version == '3.12.*' and sys_platform == 'darwin'", - "python_full_version < '3.11' and sys_platform == 'linux'", - "python_full_version == '3.11.*' and sys_platform == 'linux'", - "python_full_version == '3.12.*' and sys_platform == 'linux'", - "python_full_version < '3.11' and sys_platform == 'win32'", - "python_full_version == '3.11.*' and sys_platform == 'win32'", - "python_full_version == '3.12.*' and sys_platform == 'win32'", -] -dependencies = [ - { name = "grpcio", version = "1.67.1", source = { registry = "https://pypi.org/simple" }, 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 = "httpx", extra = ["http2"], 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 = "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 = "portalocker", 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 = "protobuf", 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 = "pydantic", 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 = "urllib3", 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')" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/00/80/b84c4c52106b6da291829d8ec632f58a5692d2772e8d3c1d3be4f9a47a2e/qdrant_client-1.14.2.tar.gz", hash = "sha256:da5cab4d367d099d1330b6f30d45aefc8bd76f8b8f9d8fa5d4f813501b93af0d", size = 285531, upload-time = "2025-04-24T14:44:43.307Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/e4/52/f49b0aa96253010f57cf80315edecec4f469e7a39c1ed92bf727fa290e57/qdrant_client-1.14.2-py3-none-any.whl", hash = "sha256:7c283b1f0e71db9c21b85d898fb395791caca2a6d56ee751da96d797b001410c", size = 327691, upload-time = "2025-04-24T14:44:41.794Z" }, -] - [[package]] name = "redis" version = "5.3.0" @@ -5112,8 +5043,7 @@ version = "0.6.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "jsonpath-ng", marker = "sys_platform == 'darwin' or sys_platform == 'linux' or sys_platform == 'win32'" }, - { name = "ml-dtypes", version = "0.4.1", source = { registry = "https://pypi.org/simple" }, 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 = "ml-dtypes", version = "0.5.1", source = { registry = "https://pypi.org/simple" }, 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 = "ml-dtypes", marker = "sys_platform == 'darwin' or sys_platform == 'linux' or sys_platform == 'win32'" }, { name = "numpy", marker = "sys_platform == 'darwin' or sys_platform == 'linux' or sys_platform == 'win32'" }, { name = "pydantic", marker = "sys_platform == 'darwin' or sys_platform == 'linux' or sys_platform == 'win32'" }, { name = "python-ulid", marker = "sys_platform == 'darwin' or sys_platform == 'linux' or sys_platform == 'win32'" }, @@ -5265,98 +5195,101 @@ wheels = [ [[package]] name = "rpds-py" -version = "0.25.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/96/d2/7bed8453e53f6c9dea7ff4c19ee980fd87be607b2caf023d62c6579e6c30/rpds_py-0.25.0.tar.gz", hash = "sha256:4d97661bf5848dd9e5eb7ded480deccf9d32ce2cd500b88a26acbf7bd2864985", size = 26822, upload-time = "2025-05-15T13:42:03.815Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/ad/07/c4ec43c36b68dcf9006481f731df018e5b0ad0c35dff529eb92af4e2764a/rpds_py-0.25.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:c146a24a8f0dc4a7846fb4640b88b3a68986585b8ce8397af15e66b7c5817439", size = 373212, upload-time = "2025-05-15T13:38:11.294Z" }, - { url = "https://files.pythonhosted.org/packages/89/ed/1ddadccc90840f7d7f7d71ef41e535ddd7facb15413963e0f3d6aa613fc9/rpds_py-0.25.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:77814c7a4e1dc43fba73aeb4c1ef0fe37d901f3aa869a4823de5ea843a283fd0", size = 358891, upload-time = "2025-05-15T13:38:13.822Z" }, - { url = "https://files.pythonhosted.org/packages/bb/36/ec715be797ab99b28a309fbeb39d493ecd2670c48312b23042737558a946/rpds_py-0.25.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5afbff2822016db3c696cb0c1432e6b1f0e34aa9280bc5184dc216812a24e70d", size = 388829, upload-time = "2025-05-15T13:38:15.411Z" }, - { url = "https://files.pythonhosted.org/packages/2b/c6/8a8c8563876f47f1e0c4da7d3d603ae87ceb2be51e0b4b1c2758b729fb37/rpds_py-0.25.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ffae52cd76837a5c16409359d236b1fced79e42e0792e8adf375095a5e855368", size = 392759, upload-time = "2025-05-15T13:38:17.321Z" }, - { url = "https://files.pythonhosted.org/packages/d4/42/303b5c18744406b9afa6a66740297d3e20a91ee0df46003da05bd14faa5d/rpds_py-0.25.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ddf9426b740a7047b2b0dddcba775211542e8053ce1e509a1759b665fe573508", size = 449645, upload-time = "2025-05-15T13:38:19.277Z" }, - { url = "https://files.pythonhosted.org/packages/18/9b/bb308301eddd3ea81b68b77426691f7476671dca40a45a54a2b178294109/rpds_py-0.25.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9cad834f1a8f51eb037c3c4dc72c884c9e1e0644d900e2d45aa76450e4aa6282", size = 444905, upload-time = "2025-05-15T13:38:21.195Z" }, - { url = "https://files.pythonhosted.org/packages/bf/03/d8a23a4610dc1ce7853bdb5c099de8050dae93cc8e7550ad6854073fbcb7/rpds_py-0.25.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c46bd76986e05689376d28fdc2b97d899576ce3e3aaa5a5f80f67a8300b26eb3", size = 386801, upload-time = "2025-05-15T13:38:22.752Z" }, - { url = "https://files.pythonhosted.org/packages/e7/85/3ea010f1fe8d64c44e3e5b6c60fa81db96752e7a0a8f86fe72cb02d72673/rpds_py-0.25.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f3353a2d7eb7d5e0af8a7ca9fc85a34ba12619119bcdee6b8a28a6373cda65ce", size = 419799, upload-time = "2025-05-15T13:38:24.276Z" }, - { url = "https://files.pythonhosted.org/packages/08/d4/ab18f94d77687facf39fabb58c81bb0c176d2e56d42b9198e954b9d1e5a0/rpds_py-0.25.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:fdc648d4e81eef5ac4bb35d731562dffc28358948410f3274d123320e125d613", size = 565732, upload-time = "2025-05-15T13:38:25.938Z" }, - { url = "https://files.pythonhosted.org/packages/e7/2d/c21b92fc82d7197a9616528fc3dca3efb7b297d5154be754497cfbccb019/rpds_py-0.25.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:098d446d76d26e394b440d73921b49c1c90274d46ccbaadf346b1b78f9fdd4b1", size = 591454, upload-time = "2025-05-15T13:38:27.88Z" }, - { url = "https://files.pythonhosted.org/packages/82/f4/e75a6cd71cecb418edd39746627a06665c44c72de05d2c77480851cfa759/rpds_py-0.25.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:c624c82e645f6b5465d08cdc802fb0cd53aa1478782fb2992b9e09f2c9426865", size = 557622, upload-time = "2025-05-15T13:38:29.418Z" }, - { url = "https://files.pythonhosted.org/packages/03/8a/ffb53d59ea1890471d2397efa2dd02df5292c40e123a97542d2bd2089a76/rpds_py-0.25.0-cp310-cp310-win32.whl", hash = "sha256:9d0041bd9e2d2ef803b32d84a0c8115d178132da5691346465953a2a966ba8ca", size = 219802, upload-time = "2025-05-15T13:38:31.33Z" }, - { url = "https://files.pythonhosted.org/packages/c5/d8/853d97fd9b9c192e54dc73bc864e348e34b642a9161f55c0adf08f06ca21/rpds_py-0.25.0-cp310-cp310-win_amd64.whl", hash = "sha256:d8b41195a6b03280ab00749a438fbce761e7acfd5381051a570239d752376f27", size = 231224, upload-time = "2025-05-15T13:38:33.148Z" }, - { url = "https://files.pythonhosted.org/packages/41/bb/505b4de3e7011fba218cfdf78bb80754194e9a5af469a96900923c535bf5/rpds_py-0.25.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:6587ece9f205097c62d0e3d3cb7c06991eb0083ab6a9cf48951ec49c2ab7183c", size = 373387, upload-time = "2025-05-15T13:38:34.624Z" }, - { url = "https://files.pythonhosted.org/packages/d6/5c/f2a9e4929cbe4162ccc126292f58558358607ded1f435148a83ea86f082c/rpds_py-0.25.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b0a5651e350997cebcdc23016dca26c4d1993d29015a535284da3159796e30b6", size = 359136, upload-time = "2025-05-15T13:38:36.302Z" }, - { url = "https://files.pythonhosted.org/packages/3e/df/7fcd34dc325b453066b7445d79ec15da2273c1365a3b2222ad16abaf475c/rpds_py-0.25.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3752a015db89ea3e9c04d5e185549be4aa29c1882150e094c614c0de8e788feb", size = 388972, upload-time = "2025-05-15T13:38:38.392Z" }, - { url = "https://files.pythonhosted.org/packages/6d/f3/76e0aefb6713951288b28070bd7cc9ccb2a2440d6bd425d4f23d28152260/rpds_py-0.25.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:a05b199c11d2f39c72de8c30668734b5d20974ad44b65324ea3e647a211f135d", size = 393360, upload-time = "2025-05-15T13:38:39.949Z" }, - { url = "https://files.pythonhosted.org/packages/c0/e1/9189e5f81a5209f61bbd35780f038c771a986da19995d8b89072d6f833e3/rpds_py-0.25.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2f91902fc0c95dd1fa6b30ebd2af83ace91e592f7fd6340a375588a9d4b9341b", size = 449744, upload-time = "2025-05-15T13:38:41.442Z" }, - { url = "https://files.pythonhosted.org/packages/6e/fe/7e9d920aeff117a5def4ef6f3cfbae84b504d9d6f3254104c7d8aeeea06a/rpds_py-0.25.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:98c729193e7abe498565266933c125780fb646e977e94289cadbb36e4eeeb370", size = 444403, upload-time = "2025-05-15T13:38:42.924Z" }, - { url = "https://files.pythonhosted.org/packages/24/61/c5485bfa5b7abd55af0c1fe5a7af98682f6b16207e4f980f40d73b84682c/rpds_py-0.25.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:36a7564deaac3f372e8b8b701eb982ea3113516e8e08cd87e3dc6ccf29bad14b", size = 387082, upload-time = "2025-05-15T13:38:44.735Z" }, - { url = "https://files.pythonhosted.org/packages/63/b0/a7cd764be9cd0f9425e5a817d41b202f64f524df22f9deb966b69079598a/rpds_py-0.25.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6b0c0f671a53c129ea48f9481e95532579cc489ab5a0ffe750c9020787181c48", size = 419891, upload-time = "2025-05-15T13:38:46.303Z" }, - { url = "https://files.pythonhosted.org/packages/2c/f0/2ee00623c5e8ab504457c681c3fcac3ea3ddc7e51733cc3f451ef1edce02/rpds_py-0.25.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d21408eaa157063f56e58ca50da27cad67c4395a85fb44cc7a31253ea4e58918", size = 565856, upload-time = "2025-05-15T13:38:53.212Z" }, - { url = "https://files.pythonhosted.org/packages/a1/88/9815253c416c9005973371001f15ba354bc04a7fc8bbb2ad602470d50fe4/rpds_py-0.25.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:a413674eb2bd2ecb2b93fcc928871b19f7220ee04bca4af3375c50a2b32b5a50", size = 591473, upload-time = "2025-05-15T13:38:54.774Z" }, - { url = "https://files.pythonhosted.org/packages/cd/7f/69a32888306e7b700aa7433ddf0c1c92a20bde31a94c63131b0dd5689f61/rpds_py-0.25.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:94f89161a3e358db33310a8a064852a6eb119ed1aa1a3dba927b4e5140e65d00", size = 557659, upload-time = "2025-05-15T13:38:56.909Z" }, - { url = "https://files.pythonhosted.org/packages/c1/60/d4edaea1f305c866970e940a31600e493920830a2d3712866b1ec2284c03/rpds_py-0.25.0-cp311-cp311-win32.whl", hash = "sha256:540cd89d256119845b7f8f56c4bb80cad280cab92d9ca473be49ea13e678fd44", size = 219592, upload-time = "2025-05-15T13:38:59.281Z" }, - { url = "https://files.pythonhosted.org/packages/5f/e8/c94eb1678b3cd51023ab855f8c2adcb28dfb2a51d045a1228fc306e09387/rpds_py-0.25.0-cp311-cp311-win_amd64.whl", hash = "sha256:2649ff19291928243f90c86e4dc9cd86c8c4c6a73c3693ba2e23bc2fbcd8338c", size = 231344, upload-time = "2025-05-15T13:39:00.7Z" }, - { url = "https://files.pythonhosted.org/packages/ee/b5/819fd819dd66a65951749a2a475a0b4455fa3ad0b4f84eba5a7d785ac07b/rpds_py-0.25.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:89260601d497fa5957c3e46f10b16cfa2a4808ad4dd46cddc0b997461923a7d9", size = 364544, upload-time = "2025-05-15T13:39:02.1Z" }, - { url = "https://files.pythonhosted.org/packages/bb/66/aea9c48e9f6d8f88b8ecf4ac7f6c6d742e005c33e0bdd46ce0d9f12aee27/rpds_py-0.25.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:637ec39f97e342a3f76af739eda96800549d92f3aa27a2170b6dcbdffd49f480", size = 350634, upload-time = "2025-05-15T13:39:03.524Z" }, - { url = "https://files.pythonhosted.org/packages/20/93/e5ee11a1b139f0064d82fff24265de881949e8be96453ec7cc26511e2216/rpds_py-0.25.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2bd08c82336412a39a598e5baccab2ee2d7bd54e9115c8b64f2febb45da5c368", size = 392993, upload-time = "2025-05-15T13:39:05.485Z" }, - { url = "https://files.pythonhosted.org/packages/3e/46/751eb56baa015486dd353d22dcc12252c69ad30845bd87322702431fe519/rpds_py-0.25.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:837fd066f974e5b98c69ac83ec594b79a2724a39a92a157b8651615e5032e530", size = 399671, upload-time = "2025-05-15T13:39:07.01Z" }, - { url = "https://files.pythonhosted.org/packages/90/8f/8c2fe58710e1af0d730173078365cfbea217af7a50e4d4c15d8c125c2bf5/rpds_py-0.25.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:653a066d2a4a332d4f8a11813e8124b643fa7b835b78468087a9898140469eee", size = 452889, upload-time = "2025-05-15T13:39:09.082Z" }, - { url = "https://files.pythonhosted.org/packages/e1/60/5192ddcde55bc19055994c19cb294fb62494fe3b19f707d3572311a06057/rpds_py-0.25.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:91a51499be506022b9f09facfc42f0c3a1c45969c0fc8f0bbebc8ff23ab9e531", size = 441069, upload-time = "2025-05-15T13:39:10.689Z" }, - { url = "https://files.pythonhosted.org/packages/c4/0e/0cbcef1144cd9ed9e30bbcbfb98a823904fefa12b8ebc1e5a0426d8d6a7e/rpds_py-0.25.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eb91471640390a82744b164f8a0be4d7c89d173b1170713f9639c6bad61e9e64", size = 391281, upload-time = "2025-05-15T13:39:12.22Z" }, - { url = "https://files.pythonhosted.org/packages/b9/e5/509a90ae0496af514c9f00fcbf8952cf3f9279e1c9a78738baa0e5c42b7a/rpds_py-0.25.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:28bd2969445acc2d6801a22f97a43134ae3cb18e7495d668bfaa8d82b8526cdc", size = 425308, upload-time = "2025-05-15T13:39:13.787Z" }, - { url = "https://files.pythonhosted.org/packages/e3/61/248102bcc5f3943f337693131a07ad36fac3915d66edcd7d7c74df0770d0/rpds_py-0.25.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:f933b35fa563f047896a70b69414dfb3952831817e4c4b3a6faa96737627f363", size = 570074, upload-time = "2025-05-15T13:39:15.488Z" }, - { url = "https://files.pythonhosted.org/packages/7d/a1/34d1286b1b655fd2219e56587862f4a894f98d025cde58ae7bf9ed3d54be/rpds_py-0.25.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:80b37b37525492250adc7cbca20ae7084f86eb3eb62414b624d2a400370853b1", size = 595438, upload-time = "2025-05-15T13:39:17.209Z" }, - { url = "https://files.pythonhosted.org/packages/be/4a/413b8f664ffdbfa3b711e03328212ee26db9c2710f8148bcb21f379fb9b5/rpds_py-0.25.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:864573b6440b770db5a8693547a8728d7fd32580d4903010a8eee0bb5b03b130", size = 561950, upload-time = "2025-05-15T13:39:18.78Z" }, - { url = "https://files.pythonhosted.org/packages/f5/25/7c1a6461b704b1408591d9c3739a0cfa05f08a9bf3afc3f5f8cd8a86f5d5/rpds_py-0.25.0-cp312-cp312-win32.whl", hash = "sha256:ad4a896896346adab86d52b31163c39d49e4e94c829494b96cc064bff82c5851", size = 222692, upload-time = "2025-05-15T13:39:22.916Z" }, - { url = "https://files.pythonhosted.org/packages/f2/43/891aeac02896d5a7eaa720c30cc2b960e6e5b9b6364db067a57a29597a99/rpds_py-0.25.0-cp312-cp312-win_amd64.whl", hash = "sha256:4fbec54cc42fa90ca69158d75f125febc4116b2d934e71c78f97de1388a8feb2", size = 235489, upload-time = "2025-05-15T13:39:24.43Z" }, - { url = "https://files.pythonhosted.org/packages/0d/d9/6534d5a9d00038261894551ee8043267f17c019e6c0df3c7d822fb5914f1/rpds_py-0.25.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:4e5fe366fa53bd6777cf5440245366705338587b2cf8d61348ddaad744eb591a", size = 364375, upload-time = "2025-05-15T13:39:25.878Z" }, - { url = "https://files.pythonhosted.org/packages/af/9d/f90c079635017cc50350cbbbf2c4fea7b2a75a24bea92211da1b0c52d55f/rpds_py-0.25.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:54f925ff8d4443b7cae23a5215954abbf4736a3404188bde53c4d744ac001d89", size = 350284, upload-time = "2025-05-15T13:39:27.336Z" }, - { url = "https://files.pythonhosted.org/packages/f9/04/b54c5b3abdccf03ca3ec3317bd68caaa7907a61fea063096ee08d128b6ed/rpds_py-0.25.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d58258a66255b2500ddaa4f33191ada5ec983a429c09eb151daf81efbb9aa115", size = 392107, upload-time = "2025-05-15T13:39:30.99Z" }, - { url = "https://files.pythonhosted.org/packages/aa/99/001bc3ab81c1798ee4c7bba7950134258d899e566d6839b6696b47248f71/rpds_py-0.25.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:8f3a57f08c558d0983a708bfe6d1265f47b5debff9b366b2f2091690fada055c", size = 398612, upload-time = "2025-05-15T13:39:32.505Z" }, - { url = "https://files.pythonhosted.org/packages/00/e1/e22893e1043938811a50c857a5780e0a4e2da02dd10ac041ecca1044906a/rpds_py-0.25.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b7d60d42f1b9571341ad2322e748f7a60f9847546cd801a3a0eb72a1b54c6519", size = 452190, upload-time = "2025-05-15T13:39:34.024Z" }, - { url = "https://files.pythonhosted.org/packages/fb/6c/7071e6d27e784ac33ab4ca048eb550b5fc4f381b29e9ba33254bc6e7eaf6/rpds_py-0.25.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a54b94b0e4de95aa92618906fb631779d9fde29b4bf659f482c354a3a79fd025", size = 440634, upload-time = "2025-05-15T13:39:36.048Z" }, - { url = "https://files.pythonhosted.org/packages/57/17/7343ea3ec906ee8c2b64a956d702de5067e0058b5d2869fbfb4b11625112/rpds_py-0.25.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:af1c2241919304cc2f90e7dcb3eb1c1df6fb4172dd338e629dd6410e48b3d1a0", size = 391000, upload-time = "2025-05-15T13:39:37.802Z" }, - { url = "https://files.pythonhosted.org/packages/2b/ad/9b3c3e950108073448834f0548077e598588efa413ba8dcc91e7ad6ff59d/rpds_py-0.25.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:7d34547810bfd61acf8a441e8a3651e7a919e8e8aed29850be14a1b05cfc6f41", size = 424621, upload-time = "2025-05-15T13:39:39.409Z" }, - { url = "https://files.pythonhosted.org/packages/57/06/bd99ca30a6e539c18c6175501c1dd7f9ef0640f7b1dc0b14b094785b509a/rpds_py-0.25.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:66568caacf18542f0cf213db7adf3de2da6ad58c7bf2c4fafec0d81ae557443b", size = 569529, upload-time = "2025-05-15T13:39:41.011Z" }, - { url = "https://files.pythonhosted.org/packages/c5/79/93381a25668466502adc082d3ce2a9ff35f8116e5e2711cedda0bfcfd699/rpds_py-0.25.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:e49e4c3e899c32884d7828c91d6c3aff08d2f18857f50f86cc91187c31a4ca58", size = 594638, upload-time = "2025-05-15T13:39:43.15Z" }, - { url = "https://files.pythonhosted.org/packages/91/ee/371ecc045d65af518e2210ad018892b1f7a7a21cd64661156b4d29dfd839/rpds_py-0.25.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:20af08b0b2d5b196a2bcb70becf0b97ec5af579cee0ae6750b08a2eea3b6c77d", size = 561413, upload-time = "2025-05-15T13:39:45.3Z" }, - { url = "https://files.pythonhosted.org/packages/34/c4/85e9853312b7e5de3c98f100280fbfd903e63936f49f6f11e4cd4eb53299/rpds_py-0.25.0-cp313-cp313-win32.whl", hash = "sha256:d3dc8d6ce8f001c80919bdb49d8b0b815185933a0b8e9cdeaea42b0b6f27eeb0", size = 222326, upload-time = "2025-05-15T13:39:46.777Z" }, - { url = "https://files.pythonhosted.org/packages/65/c6/ac744cc5752b6f291b2cf13e19cd7ea3cafe68922239a3b95f05f39287b7/rpds_py-0.25.0-cp313-cp313-win_amd64.whl", hash = "sha256:113d134dc5a8d2503630ca2707b58a1bf5b1b3c69b35c7dab8690ee650c111b8", size = 234772, upload-time = "2025-05-15T13:39:48.804Z" }, - { url = "https://files.pythonhosted.org/packages/4b/aa/dabab50a2fb321a12ffe4668087e5d0f9b06286ccb260d345bf01c79b07c/rpds_py-0.25.0-cp313-cp313t-macosx_10_12_x86_64.whl", hash = "sha256:6c72a4a8fab10bc96720ad40941bb471e3b1150fb8d62dab205d495511206cf1", size = 359693, upload-time = "2025-05-15T13:39:53.913Z" }, - { url = "https://files.pythonhosted.org/packages/11/3d/acda0095fe54ee6c553d222fb3d275506f8db4198b6a72a69eef826d63c1/rpds_py-0.25.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:bb979162323f3534dce84b59f86e689a0761a2a300e0212bfaedfa80d4eb8100", size = 345911, upload-time = "2025-05-15T13:39:55.623Z" }, - { url = "https://files.pythonhosted.org/packages/db/f3/fba9b387077f9b305fce27fe22bdb731b75bfe208ae005fd09a127eced05/rpds_py-0.25.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:35c8cb5dcf7d36d3adf2ae0730b60fb550a8feb6e432bee7ef84162a0d15714b", size = 387669, upload-time = "2025-05-15T13:39:57.103Z" }, - { url = "https://files.pythonhosted.org/packages/a2/a7/b8dbcdc9a8f1e96b5abc58bdfc22f2845178279694a9294fe4feb66ae330/rpds_py-0.25.0-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:673ba018df5ae5e7b6c9a021d51ffe39c0ae1daa0041611ed27a0bca634b2d2e", size = 392202, upload-time = "2025-05-15T13:39:59.456Z" }, - { url = "https://files.pythonhosted.org/packages/60/60/2d46ad24207114cdb341490387d5a77c845827ac03f2a37182a19d072738/rpds_py-0.25.0-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:16fb28d3a653f67c871a47c5ca0be17bce9fab8adb8bcf7bd09f3771b8c4d860", size = 450080, upload-time = "2025-05-15T13:40:01.131Z" }, - { url = "https://files.pythonhosted.org/packages/85/ae/b1966ca161942f2edf0b2c4fb448b88c19bdb37e982d0907c4b484eb0bbc/rpds_py-0.25.0-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:12a84c3851f9e68633d883c01347db3cb87e6160120a489f9c47162cd276b0a5", size = 438189, upload-time = "2025-05-15T13:40:02.816Z" }, - { url = "https://files.pythonhosted.org/packages/a8/b0/0a8bff40865e27fc8cd7bdf667958981794ccf5e7989890ae96c89112920/rpds_py-0.25.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6b5f457afffb45d3804728a54083e31fbaf460e902e3f7d063e56d0d0814301e", size = 387925, upload-time = "2025-05-15T13:40:04.523Z" }, - { url = "https://files.pythonhosted.org/packages/a5/5d/62abbc77e18f9e67556ead54c84a7c662f39236b7a41cf1a39a24bf5e79f/rpds_py-0.25.0-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:9442cbff21122e9a529b942811007d65eabe4182e7342d102caf119b229322c6", size = 417682, upload-time = "2025-05-15T13:40:06.879Z" }, - { url = "https://files.pythonhosted.org/packages/5d/eb/2f65e4332e3566d06c5ccad64441b1eaaf58a6c5999d533720f1f47d3118/rpds_py-0.25.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:383cf0d4288baf5a16812ed70d54ecb7f2064e255eb7fe42c38e926adeae4534", size = 565244, upload-time = "2025-05-15T13:40:08.598Z" }, - { url = "https://files.pythonhosted.org/packages/02/3a/ae5f68ab4879d6fbe3abec3139eab1664c3372d8b42864ab940a4940a61c/rpds_py-0.25.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:0dcdee07ebf76223092666c72a9552db276fbe46b98830ecd1bb836cc98adc81", size = 590459, upload-time = "2025-05-15T13:40:10.375Z" }, - { url = "https://files.pythonhosted.org/packages/c3/f6/ada6c3d9b803a9eb7bc9c8b3f3cebf7d779bbbb056cd7e3fc150e4c74c00/rpds_py-0.25.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:5bbfbd9c74c4dd74815bd532bf29bedea6d27d38f35ef46f9754172a14e4c655", size = 558335, upload-time = "2025-05-15T13:40:13.695Z" }, - { url = "https://files.pythonhosted.org/packages/68/9a/7d269e8f1bfe3143e699334ca0b578e16b37e6505bf10dca8c02aa8addc8/rpds_py-0.25.0-cp313-cp313t-win32.whl", hash = "sha256:90dbd2c42cb6463c07020695800ae8f347e7dbeff09da2975a988e467b624539", size = 218761, upload-time = "2025-05-15T13:40:16.043Z" }, - { url = "https://files.pythonhosted.org/packages/16/16/f5843b19b7bfd16d63b960cf4c646953010886cc62dd41b00854d77b0eed/rpds_py-0.25.0-cp313-cp313t-win_amd64.whl", hash = "sha256:8c2ad59c4342a176cb3e0d5753e1c911eabc95c210fc6d0e913c32bf560bf012", size = 232634, upload-time = "2025-05-15T13:40:17.633Z" }, - { url = "https://files.pythonhosted.org/packages/c8/bf/e2862b6cde99696440f70f71f34cfc5f883c6c93204d945220d223c94c3a/rpds_py-0.25.0-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:57e9616a2a9da08fe0994e37a0c6f578fbaf6d35911bcba31e99660542d60c45", size = 373739, upload-time = "2025-05-15T13:40:47.49Z" }, - { url = "https://files.pythonhosted.org/packages/1e/58/f419062ee1fdb4cddf790933e14b1620096e95ef924c0509eca83a6ce100/rpds_py-0.25.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:6d95521901896a90a858993bfa3ec0f9160d3d97e8c8fefc279b3306cdadfee0", size = 359440, upload-time = "2025-05-15T13:40:49.13Z" }, - { url = "https://files.pythonhosted.org/packages/b4/20/321cbc4d68b6fbb6f72d80438d1af4216b300a3dbff1e9a687625641e79a/rpds_py-0.25.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d33aef3914a5b49db12ed3f24d214ffa50caefc8f4b0c7c7b9485bd4b231a898", size = 389607, upload-time = "2025-05-15T13:40:52.406Z" }, - { url = "https://files.pythonhosted.org/packages/9d/d2/cda336d67bee9b936559245da63b21dd7d622220ceda231ecb6ae62e9379/rpds_py-0.25.0-pp310-pypy310_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:4acbe2349a3baac9cc212005b6cb4bbb7e5b34538886cde4f55dfc29173da1d6", size = 393540, upload-time = "2025-05-15T13:40:55.398Z" }, - { url = "https://files.pythonhosted.org/packages/65/14/f59bd89270a384349b3beb5c7fa636e20c0f719a55a227e6872236a68d71/rpds_py-0.25.0-pp310-pypy310_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9b75b5d3416b00d064a5e6f4814fdfb18a964a7cf38dc00b5c2c02fa30a7dd0b", size = 450675, upload-time = "2025-05-15T13:40:57.065Z" }, - { url = "https://files.pythonhosted.org/packages/49/52/7567da6cc8293bcf4572a895bdcb4fbd9b23f7c2ebbcf943b8a8caf78ff2/rpds_py-0.25.0-pp310-pypy310_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:542a6f1d0f400b9ce1facb3e30dd3dc84e4affc60353509b00a7bdcd064be91e", size = 444899, upload-time = "2025-05-15T13:40:59.384Z" }, - { url = "https://files.pythonhosted.org/packages/3a/8f/169498c962ea9752d809c9505dee23000a8370cc15bb6a88dcef6a58f3a8/rpds_py-0.25.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a60ba9d104f4e8496107b1cb86e45a68a16d13511dc3986e0780e9f85c2136f9", size = 387855, upload-time = "2025-05-15T13:41:01.027Z" }, - { url = "https://files.pythonhosted.org/packages/80/4c/05888641972cac3dbb17de60ee07cbcb85c80a462f3b0eb61d8cf8921ccf/rpds_py-0.25.0-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6065a489b7b284efb29d57adffae2b9b5e9403d3c8d95cfa04e04e024e6b4e77", size = 420539, upload-time = "2025-05-15T13:41:02.687Z" }, - { url = "https://files.pythonhosted.org/packages/56/f5/95d3a8cecb7f31ea4ce98096431cc93295543ba8dd5b23fe006b762fc16a/rpds_py-0.25.0-pp310-pypy310_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:6bcca4d0d24d8c37bfe0cafdaaf4346b6c516db21ccaad5c7fba0a0df818dfc9", size = 566610, upload-time = "2025-05-15T13:41:06.232Z" }, - { url = "https://files.pythonhosted.org/packages/2d/7a/cc8f2615df4bf97316aa03f7b5f1acccd9b2fa871a652e8a961b06486e9c/rpds_py-0.25.0-pp310-pypy310_pp73-musllinux_1_2_i686.whl", hash = "sha256:8155e21203161e5c78791fc049b99f0bbbf14d1d1839c8c93c8344957f9e8e1e", size = 591499, upload-time = "2025-05-15T13:41:07.956Z" }, - { url = "https://files.pythonhosted.org/packages/ad/5a/f6fb6a91ed0b8e5b7a4e27f8c959bfcfaad7b57341ef7d99e248165de188/rpds_py-0.25.0-pp310-pypy310_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:6a1eda14db1ac7a2ab4536dfe69e4d37fdd765e8e784ae4451e61582ebb76012", size = 558441, upload-time = "2025-05-15T13:41:09.656Z" }, - { url = "https://files.pythonhosted.org/packages/2f/97/40057d99358d7bf116eea1cb4ffe33e66294392d4ade3db6d3ee56817597/rpds_py-0.25.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:de34a7d1893be76cb015929690dce3bde29f4de08143da2e9ad1cedb11dbf80e", size = 231644, upload-time = "2025-05-15T13:41:12.762Z" }, - { url = "https://files.pythonhosted.org/packages/73/80/e28624a339aea0634da115fe520f44703cce2f0b07191fb010d606cd9839/rpds_py-0.25.0-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:0d63a86b457069d669c423f093db4900aa102f0e5a626973eff4db8355c0fd96", size = 374033, upload-time = "2025-05-15T13:41:14.668Z" }, - { url = "https://files.pythonhosted.org/packages/5c/5a/4d7eba630368fb7183bf18eb7d11090048e6e756dec1d71dc228815eb002/rpds_py-0.25.0-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:89bb2b20829270aca28b1e5481be8ee24cb9aa86e6c0c81cb4ada2112c9588c5", size = 359591, upload-time = "2025-05-15T13:41:16.436Z" }, - { url = "https://files.pythonhosted.org/packages/97/a7/7a9d5bdd68c3741ebe094861793fce58136455ef708e440f0aef1dd0fb50/rpds_py-0.25.0-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:83e103b48e63fd2b8a8e2b21ab5b5299a7146045626c2ed4011511ea8122d217", size = 389565, upload-time = "2025-05-15T13:41:19.266Z" }, - { url = "https://files.pythonhosted.org/packages/c7/1e/53e9f85d7c859122b46d60052473719b449d653ba8a125d62533dc7a72d6/rpds_py-0.25.0-pp311-pypy311_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:fccd24c080850715c58a80200d367bc62b4bff6c9fb84e9564da1ebcafea6418", size = 393572, upload-time = "2025-05-15T13:41:21.051Z" }, - { url = "https://files.pythonhosted.org/packages/02/a2/f2ea6864c782da253e433bd9538710fc501e41f7edda580b54bf498c203b/rpds_py-0.25.0-pp311-pypy311_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:12b42790c91e0041a98f0ec04244fb334696938793e785a5d4c7e56ca534d7da", size = 450905, upload-time = "2025-05-15T13:41:22.769Z" }, - { url = "https://files.pythonhosted.org/packages/65/75/45c1c8be90c909732d47a6b354c4b2c45c7d2e868c9da90dceb71a30938c/rpds_py-0.25.0-pp311-pypy311_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:bc907ea12216cfc5560148fc42459d86740fc739981c6feb94230dab09362679", size = 444337, upload-time = "2025-05-15T13:41:25.953Z" }, - { url = "https://files.pythonhosted.org/packages/d8/07/cff35d166814454dfe2cd5aec0960e717711ebb39e857ede5cdac65a3fa7/rpds_py-0.25.0-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1e11065b759c38c4945f8c9765ed2910e31fa5b2f7733401eb7d966f468367a2", size = 387925, upload-time = "2025-05-15T13:41:28.404Z" }, - { url = "https://files.pythonhosted.org/packages/8c/33/f5ddeb28300ab062985e389bb3974793bb07be37bf9ab0c2dff42dc6b1ea/rpds_py-0.25.0-pp311-pypy311_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:8abc1a3e29b599bf8bb5ad455256a757e8b0ed5621e7e48abe8209932dc6d11e", size = 420658, upload-time = "2025-05-15T13:41:30.097Z" }, - { url = "https://files.pythonhosted.org/packages/4d/ef/1806d0f8060a85c3561526f2019fbde5b082af07b99fc8aeea001acdf7ab/rpds_py-0.25.0-pp311-pypy311_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:cd36b71f9f3bf195b2dd9be5eafbfc9409e6c8007aebc38a4dc051f522008033", size = 566601, upload-time = "2025-05-15T13:41:33.47Z" }, - { url = "https://files.pythonhosted.org/packages/fd/75/de2e0a8de964cf7e8d5ed9b51e9be74e485d3a34d7f0ec27005c787ca96d/rpds_py-0.25.0-pp311-pypy311_pp73-musllinux_1_2_i686.whl", hash = "sha256:805a0dff0674baa3f360c21dcbc622ae544f2bb4753d87a4a56a1881252a477e", size = 591728, upload-time = "2025-05-15T13:41:35.312Z" }, - { url = "https://files.pythonhosted.org/packages/43/da/6bc93116657c720d0843ed4ed5b1c3c127ca56e6c048e9ebd402496f0649/rpds_py-0.25.0-pp311-pypy311_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:96742796f499ac23b59856db734e65b286d1214a0d9b57bcd7bece92d9201fa4", size = 558441, upload-time = "2025-05-15T13:41:38.029Z" }, +version = "0.25.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/8c/a6/60184b7fc00dd3ca80ac635dd5b8577d444c57e8e8742cecabfacb829921/rpds_py-0.25.1.tar.gz", hash = "sha256:8960b6dac09b62dac26e75d7e2c4a22efb835d827a7278c34f72b2b84fa160e3", size = 27304, upload-time = "2025-05-21T12:46:12.502Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/cb/09/e1158988e50905b7f8306487a576b52d32aa9a87f79f7ab24ee8db8b6c05/rpds_py-0.25.1-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:f4ad628b5174d5315761b67f212774a32f5bad5e61396d38108bd801c0a8f5d9", size = 373140, upload-time = "2025-05-21T12:42:38.834Z" }, + { url = "https://files.pythonhosted.org/packages/e0/4b/a284321fb3c45c02fc74187171504702b2934bfe16abab89713eedfe672e/rpds_py-0.25.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8c742af695f7525e559c16f1562cf2323db0e3f0fbdcabdf6865b095256b2d40", size = 358860, upload-time = "2025-05-21T12:42:41.394Z" }, + { url = "https://files.pythonhosted.org/packages/4e/46/8ac9811150c75edeae9fc6fa0e70376c19bc80f8e1f7716981433905912b/rpds_py-0.25.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:605ffe7769e24b1800b4d024d24034405d9404f0bc2f55b6db3362cd34145a6f", size = 386179, upload-time = "2025-05-21T12:42:43.213Z" }, + { url = "https://files.pythonhosted.org/packages/f3/ec/87eb42d83e859bce91dcf763eb9f2ab117142a49c9c3d17285440edb5b69/rpds_py-0.25.1-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ccc6f3ddef93243538be76f8e47045b4aad7a66a212cd3a0f23e34469473d36b", size = 400282, upload-time = "2025-05-21T12:42:44.92Z" }, + { url = "https://files.pythonhosted.org/packages/68/c8/2a38e0707d7919c8c78e1d582ab15cf1255b380bcb086ca265b73ed6db23/rpds_py-0.25.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f70316f760174ca04492b5ab01be631a8ae30cadab1d1081035136ba12738cfa", size = 521824, upload-time = "2025-05-21T12:42:46.856Z" }, + { url = "https://files.pythonhosted.org/packages/5e/2c/6a92790243569784dde84d144bfd12bd45102f4a1c897d76375076d730ab/rpds_py-0.25.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e1dafef8df605fdb46edcc0bf1573dea0d6d7b01ba87f85cd04dc855b2b4479e", size = 411644, upload-time = "2025-05-21T12:42:48.838Z" }, + { url = "https://files.pythonhosted.org/packages/eb/76/66b523ffc84cf47db56efe13ae7cf368dee2bacdec9d89b9baca5e2e6301/rpds_py-0.25.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0701942049095741a8aeb298a31b203e735d1c61f4423511d2b1a41dcd8a16da", size = 386955, upload-time = "2025-05-21T12:42:50.835Z" }, + { url = "https://files.pythonhosted.org/packages/b6/b9/a362d7522feaa24dc2b79847c6175daa1c642817f4a19dcd5c91d3e2c316/rpds_py-0.25.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e87798852ae0b37c88babb7f7bbbb3e3fecc562a1c340195b44c7e24d403e380", size = 421039, upload-time = "2025-05-21T12:42:52.348Z" }, + { url = "https://files.pythonhosted.org/packages/0f/c4/b5b6f70b4d719b6584716889fd3413102acf9729540ee76708d56a76fa97/rpds_py-0.25.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:3bcce0edc1488906c2d4c75c94c70a0417e83920dd4c88fec1078c94843a6ce9", size = 563290, upload-time = "2025-05-21T12:42:54.404Z" }, + { url = "https://files.pythonhosted.org/packages/87/a3/2e6e816615c12a8f8662c9d8583a12eb54c52557521ef218cbe3095a8afa/rpds_py-0.25.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:e2f6a2347d3440ae789505693a02836383426249d5293541cd712e07e7aecf54", size = 592089, upload-time = "2025-05-21T12:42:55.976Z" }, + { url = "https://files.pythonhosted.org/packages/c0/08/9b8e1050e36ce266135994e2c7ec06e1841f1c64da739daeb8afe9cb77a4/rpds_py-0.25.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:4fd52d3455a0aa997734f3835cbc4c9f32571345143960e7d7ebfe7b5fbfa3b2", size = 558400, upload-time = "2025-05-21T12:42:58.032Z" }, + { url = "https://files.pythonhosted.org/packages/f2/df/b40b8215560b8584baccd839ff5c1056f3c57120d79ac41bd26df196da7e/rpds_py-0.25.1-cp310-cp310-win32.whl", hash = "sha256:3f0b1798cae2bbbc9b9db44ee068c556d4737911ad53a4e5093d09d04b3bbc24", size = 219741, upload-time = "2025-05-21T12:42:59.479Z" }, + { url = "https://files.pythonhosted.org/packages/10/99/e4c58be18cf5d8b40b8acb4122bc895486230b08f978831b16a3916bd24d/rpds_py-0.25.1-cp310-cp310-win_amd64.whl", hash = "sha256:3ebd879ab996537fc510a2be58c59915b5dd63bccb06d1ef514fee787e05984a", size = 231553, upload-time = "2025-05-21T12:43:01.425Z" }, + { url = "https://files.pythonhosted.org/packages/95/e1/df13fe3ddbbea43567e07437f097863b20c99318ae1f58a0fe389f763738/rpds_py-0.25.1-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:5f048bbf18b1f9120685c6d6bb70cc1a52c8cc11bdd04e643d28d3be0baf666d", size = 373341, upload-time = "2025-05-21T12:43:02.978Z" }, + { url = "https://files.pythonhosted.org/packages/7a/58/deef4d30fcbcbfef3b6d82d17c64490d5c94585a2310544ce8e2d3024f83/rpds_py-0.25.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4fbb0dbba559959fcb5d0735a0f87cdbca9e95dac87982e9b95c0f8f7ad10255", size = 359111, upload-time = "2025-05-21T12:43:05.128Z" }, + { url = "https://files.pythonhosted.org/packages/bb/7e/39f1f4431b03e96ebaf159e29a0f82a77259d8f38b2dd474721eb3a8ac9b/rpds_py-0.25.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d4ca54b9cf9d80b4016a67a0193ebe0bcf29f6b0a96f09db942087e294d3d4c2", size = 386112, upload-time = "2025-05-21T12:43:07.13Z" }, + { url = "https://files.pythonhosted.org/packages/db/e7/847068a48d63aec2ae695a1646089620b3b03f8ccf9f02c122ebaf778f3c/rpds_py-0.25.1-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:1ee3e26eb83d39b886d2cb6e06ea701bba82ef30a0de044d34626ede51ec98b0", size = 400362, upload-time = "2025-05-21T12:43:08.693Z" }, + { url = "https://files.pythonhosted.org/packages/3b/3d/9441d5db4343d0cee759a7ab4d67420a476cebb032081763de934719727b/rpds_py-0.25.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:89706d0683c73a26f76a5315d893c051324d771196ae8b13e6ffa1ffaf5e574f", size = 522214, upload-time = "2025-05-21T12:43:10.694Z" }, + { url = "https://files.pythonhosted.org/packages/a2/ec/2cc5b30d95f9f1a432c79c7a2f65d85e52812a8f6cbf8768724571710786/rpds_py-0.25.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c2013ee878c76269c7b557a9a9c042335d732e89d482606990b70a839635feb7", size = 411491, upload-time = "2025-05-21T12:43:12.739Z" }, + { url = "https://files.pythonhosted.org/packages/dc/6c/44695c1f035077a017dd472b6a3253553780837af2fac9b6ac25f6a5cb4d/rpds_py-0.25.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:45e484db65e5380804afbec784522de84fa95e6bb92ef1bd3325d33d13efaebd", size = 386978, upload-time = "2025-05-21T12:43:14.25Z" }, + { url = "https://files.pythonhosted.org/packages/b1/74/b4357090bb1096db5392157b4e7ed8bb2417dc7799200fcbaee633a032c9/rpds_py-0.25.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:48d64155d02127c249695abb87d39f0faf410733428d499867606be138161d65", size = 420662, upload-time = "2025-05-21T12:43:15.8Z" }, + { url = "https://files.pythonhosted.org/packages/26/dd/8cadbebf47b96e59dfe8b35868e5c38a42272699324e95ed522da09d3a40/rpds_py-0.25.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:048893e902132fd6548a2e661fb38bf4896a89eea95ac5816cf443524a85556f", size = 563385, upload-time = "2025-05-21T12:43:17.78Z" }, + { url = "https://files.pythonhosted.org/packages/c3/ea/92960bb7f0e7a57a5ab233662f12152085c7dc0d5468534c65991a3d48c9/rpds_py-0.25.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:0317177b1e8691ab5879f4f33f4b6dc55ad3b344399e23df2e499de7b10a548d", size = 592047, upload-time = "2025-05-21T12:43:19.457Z" }, + { url = "https://files.pythonhosted.org/packages/61/ad/71aabc93df0d05dabcb4b0c749277881f8e74548582d96aa1bf24379493a/rpds_py-0.25.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:bffcf57826d77a4151962bf1701374e0fc87f536e56ec46f1abdd6a903354042", size = 557863, upload-time = "2025-05-21T12:43:21.69Z" }, + { url = "https://files.pythonhosted.org/packages/93/0f/89df0067c41f122b90b76f3660028a466eb287cbe38efec3ea70e637ca78/rpds_py-0.25.1-cp311-cp311-win32.whl", hash = "sha256:cda776f1967cb304816173b30994faaf2fd5bcb37e73118a47964a02c348e1bc", size = 219627, upload-time = "2025-05-21T12:43:23.311Z" }, + { url = "https://files.pythonhosted.org/packages/7c/8d/93b1a4c1baa903d0229374d9e7aa3466d751f1d65e268c52e6039c6e338e/rpds_py-0.25.1-cp311-cp311-win_amd64.whl", hash = "sha256:dc3c1ff0abc91444cd20ec643d0f805df9a3661fcacf9c95000329f3ddf268a4", size = 231603, upload-time = "2025-05-21T12:43:25.145Z" }, + { url = "https://files.pythonhosted.org/packages/cb/11/392605e5247bead2f23e6888e77229fbd714ac241ebbebb39a1e822c8815/rpds_py-0.25.1-cp311-cp311-win_arm64.whl", hash = "sha256:5a3ddb74b0985c4387719fc536faced33cadf2172769540c62e2a94b7b9be1c4", size = 223967, upload-time = "2025-05-21T12:43:26.566Z" }, + { url = "https://files.pythonhosted.org/packages/7f/81/28ab0408391b1dc57393653b6a0cf2014cc282cc2909e4615e63e58262be/rpds_py-0.25.1-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:b5ffe453cde61f73fea9430223c81d29e2fbf412a6073951102146c84e19e34c", size = 364647, upload-time = "2025-05-21T12:43:28.559Z" }, + { url = "https://files.pythonhosted.org/packages/2c/9a/7797f04cad0d5e56310e1238434f71fc6939d0bc517192a18bb99a72a95f/rpds_py-0.25.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:115874ae5e2fdcfc16b2aedc95b5eef4aebe91b28e7e21951eda8a5dc0d3461b", size = 350454, upload-time = "2025-05-21T12:43:30.615Z" }, + { url = "https://files.pythonhosted.org/packages/69/3c/93d2ef941b04898011e5d6eaa56a1acf46a3b4c9f4b3ad1bbcbafa0bee1f/rpds_py-0.25.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a714bf6e5e81b0e570d01f56e0c89c6375101b8463999ead3a93a5d2a4af91fa", size = 389665, upload-time = "2025-05-21T12:43:32.629Z" }, + { url = "https://files.pythonhosted.org/packages/c1/57/ad0e31e928751dde8903a11102559628d24173428a0f85e25e187defb2c1/rpds_py-0.25.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:35634369325906bcd01577da4c19e3b9541a15e99f31e91a02d010816b49bfda", size = 403873, upload-time = "2025-05-21T12:43:34.576Z" }, + { url = "https://files.pythonhosted.org/packages/16/ad/c0c652fa9bba778b4f54980a02962748479dc09632e1fd34e5282cf2556c/rpds_py-0.25.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d4cb2b3ddc16710548801c6fcc0cfcdeeff9dafbc983f77265877793f2660309", size = 525866, upload-time = "2025-05-21T12:43:36.123Z" }, + { url = "https://files.pythonhosted.org/packages/2a/39/3e1839bc527e6fcf48d5fec4770070f872cdee6c6fbc9b259932f4e88a38/rpds_py-0.25.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9ceca1cf097ed77e1a51f1dbc8d174d10cb5931c188a4505ff9f3e119dfe519b", size = 416886, upload-time = "2025-05-21T12:43:38.034Z" }, + { url = "https://files.pythonhosted.org/packages/7a/95/dd6b91cd4560da41df9d7030a038298a67d24f8ca38e150562644c829c48/rpds_py-0.25.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2c2cd1a4b0c2b8c5e31ffff50d09f39906fe351389ba143c195566056c13a7ea", size = 390666, upload-time = "2025-05-21T12:43:40.065Z" }, + { url = "https://files.pythonhosted.org/packages/64/48/1be88a820e7494ce0a15c2d390ccb7c52212370badabf128e6a7bb4cb802/rpds_py-0.25.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1de336a4b164c9188cb23f3703adb74a7623ab32d20090d0e9bf499a2203ad65", size = 425109, upload-time = "2025-05-21T12:43:42.263Z" }, + { url = "https://files.pythonhosted.org/packages/cf/07/3e2a17927ef6d7720b9949ec1b37d1e963b829ad0387f7af18d923d5cfa5/rpds_py-0.25.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:9fca84a15333e925dd59ce01da0ffe2ffe0d6e5d29a9eeba2148916d1824948c", size = 567244, upload-time = "2025-05-21T12:43:43.846Z" }, + { url = "https://files.pythonhosted.org/packages/d2/e5/76cf010998deccc4f95305d827847e2eae9c568099c06b405cf96384762b/rpds_py-0.25.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:88ec04afe0c59fa64e2f6ea0dd9657e04fc83e38de90f6de201954b4d4eb59bd", size = 596023, upload-time = "2025-05-21T12:43:45.932Z" }, + { url = "https://files.pythonhosted.org/packages/52/9a/df55efd84403736ba37a5a6377b70aad0fd1cb469a9109ee8a1e21299a1c/rpds_py-0.25.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:a8bd2f19e312ce3e1d2c635618e8a8d8132892bb746a7cf74780a489f0f6cdcb", size = 561634, upload-time = "2025-05-21T12:43:48.263Z" }, + { url = "https://files.pythonhosted.org/packages/ab/aa/dc3620dd8db84454aaf9374bd318f1aa02578bba5e567f5bf6b79492aca4/rpds_py-0.25.1-cp312-cp312-win32.whl", hash = "sha256:e5e2f7280d8d0d3ef06f3ec1b4fd598d386cc6f0721e54f09109a8132182fbfe", size = 222713, upload-time = "2025-05-21T12:43:49.897Z" }, + { url = "https://files.pythonhosted.org/packages/a3/7f/7cef485269a50ed5b4e9bae145f512d2a111ca638ae70cc101f661b4defd/rpds_py-0.25.1-cp312-cp312-win_amd64.whl", hash = "sha256:db58483f71c5db67d643857404da360dce3573031586034b7d59f245144cc192", size = 235280, upload-time = "2025-05-21T12:43:51.893Z" }, + { url = "https://files.pythonhosted.org/packages/99/f2/c2d64f6564f32af913bf5f3f7ae41c7c263c5ae4c4e8f1a17af8af66cd46/rpds_py-0.25.1-cp312-cp312-win_arm64.whl", hash = "sha256:6d50841c425d16faf3206ddbba44c21aa3310a0cebc3c1cdfc3e3f4f9f6f5728", size = 225399, upload-time = "2025-05-21T12:43:53.351Z" }, + { url = "https://files.pythonhosted.org/packages/2b/da/323848a2b62abe6a0fec16ebe199dc6889c5d0a332458da8985b2980dffe/rpds_py-0.25.1-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:659d87430a8c8c704d52d094f5ba6fa72ef13b4d385b7e542a08fc240cb4a559", size = 364498, upload-time = "2025-05-21T12:43:54.841Z" }, + { url = "https://files.pythonhosted.org/packages/1f/b4/4d3820f731c80fd0cd823b3e95b9963fec681ae45ba35b5281a42382c67d/rpds_py-0.25.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:68f6f060f0bbdfb0245267da014d3a6da9be127fe3e8cc4a68c6f833f8a23bb1", size = 350083, upload-time = "2025-05-21T12:43:56.428Z" }, + { url = "https://files.pythonhosted.org/packages/d5/b1/3a8ee1c9d480e8493619a437dec685d005f706b69253286f50f498cbdbcf/rpds_py-0.25.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:083a9513a33e0b92cf6e7a6366036c6bb43ea595332c1ab5c8ae329e4bcc0a9c", size = 389023, upload-time = "2025-05-21T12:43:57.995Z" }, + { url = "https://files.pythonhosted.org/packages/3b/31/17293edcfc934dc62c3bf74a0cb449ecd549531f956b72287203e6880b87/rpds_py-0.25.1-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:816568614ecb22b18a010c7a12559c19f6fe993526af88e95a76d5a60b8b75fb", size = 403283, upload-time = "2025-05-21T12:43:59.546Z" }, + { url = "https://files.pythonhosted.org/packages/d1/ca/e0f0bc1a75a8925024f343258c8ecbd8828f8997ea2ac71e02f67b6f5299/rpds_py-0.25.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3c6564c0947a7f52e4792983f8e6cf9bac140438ebf81f527a21d944f2fd0a40", size = 524634, upload-time = "2025-05-21T12:44:01.087Z" }, + { url = "https://files.pythonhosted.org/packages/3e/03/5d0be919037178fff33a6672ffc0afa04ea1cfcb61afd4119d1b5280ff0f/rpds_py-0.25.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5c4a128527fe415d73cf1f70a9a688d06130d5810be69f3b553bf7b45e8acf79", size = 416233, upload-time = "2025-05-21T12:44:02.604Z" }, + { url = "https://files.pythonhosted.org/packages/05/7c/8abb70f9017a231c6c961a8941403ed6557664c0913e1bf413cbdc039e75/rpds_py-0.25.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a49e1d7a4978ed554f095430b89ecc23f42014a50ac385eb0c4d163ce213c325", size = 390375, upload-time = "2025-05-21T12:44:04.162Z" }, + { url = "https://files.pythonhosted.org/packages/7a/ac/a87f339f0e066b9535074a9f403b9313fd3892d4a164d5d5f5875ac9f29f/rpds_py-0.25.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d74ec9bc0e2feb81d3f16946b005748119c0f52a153f6db6a29e8cd68636f295", size = 424537, upload-time = "2025-05-21T12:44:06.175Z" }, + { url = "https://files.pythonhosted.org/packages/1f/8f/8d5c1567eaf8c8afe98a838dd24de5013ce6e8f53a01bd47fe8bb06b5533/rpds_py-0.25.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:3af5b4cc10fa41e5bc64e5c198a1b2d2864337f8fcbb9a67e747e34002ce812b", size = 566425, upload-time = "2025-05-21T12:44:08.242Z" }, + { url = "https://files.pythonhosted.org/packages/95/33/03016a6be5663b389c8ab0bbbcca68d9e96af14faeff0a04affcb587e776/rpds_py-0.25.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:79dc317a5f1c51fd9c6a0c4f48209c6b8526d0524a6904fc1076476e79b00f98", size = 595197, upload-time = "2025-05-21T12:44:10.449Z" }, + { url = "https://files.pythonhosted.org/packages/33/8d/da9f4d3e208c82fda311bff0cf0a19579afceb77cf456e46c559a1c075ba/rpds_py-0.25.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:1521031351865e0181bc585147624d66b3b00a84109b57fcb7a779c3ec3772cd", size = 561244, upload-time = "2025-05-21T12:44:12.387Z" }, + { url = "https://files.pythonhosted.org/packages/e2/b3/39d5dcf7c5f742ecd6dbc88f6f84ae54184b92f5f387a4053be2107b17f1/rpds_py-0.25.1-cp313-cp313-win32.whl", hash = "sha256:5d473be2b13600b93a5675d78f59e63b51b1ba2d0476893415dfbb5477e65b31", size = 222254, upload-time = "2025-05-21T12:44:14.261Z" }, + { url = "https://files.pythonhosted.org/packages/5f/19/2d6772c8eeb8302c5f834e6d0dfd83935a884e7c5ce16340c7eaf89ce925/rpds_py-0.25.1-cp313-cp313-win_amd64.whl", hash = "sha256:a7b74e92a3b212390bdce1d93da9f6488c3878c1d434c5e751cbc202c5e09500", size = 234741, upload-time = "2025-05-21T12:44:16.236Z" }, + { url = "https://files.pythonhosted.org/packages/5b/5a/145ada26cfaf86018d0eb304fe55eafdd4f0b6b84530246bb4a7c4fb5c4b/rpds_py-0.25.1-cp313-cp313-win_arm64.whl", hash = "sha256:dd326a81afe332ede08eb39ab75b301d5676802cdffd3a8f287a5f0b694dc3f5", size = 224830, upload-time = "2025-05-21T12:44:17.749Z" }, + { url = "https://files.pythonhosted.org/packages/4b/ca/d435844829c384fd2c22754ff65889c5c556a675d2ed9eb0e148435c6690/rpds_py-0.25.1-cp313-cp313t-macosx_10_12_x86_64.whl", hash = "sha256:a58d1ed49a94d4183483a3ce0af22f20318d4a1434acee255d683ad90bf78129", size = 359668, upload-time = "2025-05-21T12:44:19.322Z" }, + { url = "https://files.pythonhosted.org/packages/1f/01/b056f21db3a09f89410d493d2f6614d87bb162499f98b649d1dbd2a81988/rpds_py-0.25.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:f251bf23deb8332823aef1da169d5d89fa84c89f67bdfb566c49dea1fccfd50d", size = 345649, upload-time = "2025-05-21T12:44:20.962Z" }, + { url = "https://files.pythonhosted.org/packages/e0/0f/e0d00dc991e3d40e03ca36383b44995126c36b3eafa0ccbbd19664709c88/rpds_py-0.25.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8dbd586bfa270c1103ece2109314dd423df1fa3d9719928b5d09e4840cec0d72", size = 384776, upload-time = "2025-05-21T12:44:22.516Z" }, + { url = "https://files.pythonhosted.org/packages/9f/a2/59374837f105f2ca79bde3c3cd1065b2f8c01678900924949f6392eab66d/rpds_py-0.25.1-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:6d273f136e912aa101a9274c3145dcbddbe4bac560e77e6d5b3c9f6e0ed06d34", size = 395131, upload-time = "2025-05-21T12:44:24.147Z" }, + { url = "https://files.pythonhosted.org/packages/9c/dc/48e8d84887627a0fe0bac53f0b4631e90976fd5d35fff8be66b8e4f3916b/rpds_py-0.25.1-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:666fa7b1bd0a3810a7f18f6d3a25ccd8866291fbbc3c9b912b917a6715874bb9", size = 520942, upload-time = "2025-05-21T12:44:25.915Z" }, + { url = "https://files.pythonhosted.org/packages/7c/f5/ee056966aeae401913d37befeeab57a4a43a4f00099e0a20297f17b8f00c/rpds_py-0.25.1-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:921954d7fbf3fccc7de8f717799304b14b6d9a45bbeec5a8d7408ccbf531faf5", size = 411330, upload-time = "2025-05-21T12:44:27.638Z" }, + { url = "https://files.pythonhosted.org/packages/ab/74/b2cffb46a097cefe5d17f94ede7a174184b9d158a0aeb195f39f2c0361e8/rpds_py-0.25.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f3d86373ff19ca0441ebeb696ef64cb58b8b5cbacffcda5a0ec2f3911732a194", size = 387339, upload-time = "2025-05-21T12:44:29.292Z" }, + { url = "https://files.pythonhosted.org/packages/7f/9a/0ff0b375dcb5161c2b7054e7d0b7575f1680127505945f5cabaac890bc07/rpds_py-0.25.1-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:c8980cde3bb8575e7c956a530f2c217c1d6aac453474bf3ea0f9c89868b531b6", size = 418077, upload-time = "2025-05-21T12:44:30.877Z" }, + { url = "https://files.pythonhosted.org/packages/0d/a1/fda629bf20d6b698ae84c7c840cfb0e9e4200f664fc96e1f456f00e4ad6e/rpds_py-0.25.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:8eb8c84ecea987a2523e057c0d950bcb3f789696c0499290b8d7b3107a719d78", size = 562441, upload-time = "2025-05-21T12:44:32.541Z" }, + { url = "https://files.pythonhosted.org/packages/20/15/ce4b5257f654132f326f4acd87268e1006cc071e2c59794c5bdf4bebbb51/rpds_py-0.25.1-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:e43a005671a9ed5a650f3bc39e4dbccd6d4326b24fb5ea8be5f3a43a6f576c72", size = 590750, upload-time = "2025-05-21T12:44:34.557Z" }, + { url = "https://files.pythonhosted.org/packages/fb/ab/e04bf58a8d375aeedb5268edcc835c6a660ebf79d4384d8e0889439448b0/rpds_py-0.25.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:58f77c60956501a4a627749a6dcb78dac522f249dd96b5c9f1c6af29bfacfb66", size = 558891, upload-time = "2025-05-21T12:44:37.358Z" }, + { url = "https://files.pythonhosted.org/packages/90/82/cb8c6028a6ef6cd2b7991e2e4ced01c854b6236ecf51e81b64b569c43d73/rpds_py-0.25.1-cp313-cp313t-win32.whl", hash = "sha256:2cb9e5b5e26fc02c8a4345048cd9998c2aca7c2712bd1b36da0c72ee969a3523", size = 218718, upload-time = "2025-05-21T12:44:38.969Z" }, + { url = "https://files.pythonhosted.org/packages/b6/97/5a4b59697111c89477d20ba8a44df9ca16b41e737fa569d5ae8bff99e650/rpds_py-0.25.1-cp313-cp313t-win_amd64.whl", hash = "sha256:401ca1c4a20cc0510d3435d89c069fe0a9ae2ee6495135ac46bdd49ec0495763", size = 232218, upload-time = "2025-05-21T12:44:40.512Z" }, + { url = "https://files.pythonhosted.org/packages/78/ff/566ce53529b12b4f10c0a348d316bd766970b7060b4fd50f888be3b3b281/rpds_py-0.25.1-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:b24bf3cd93d5b6ecfbedec73b15f143596c88ee249fa98cefa9a9dc9d92c6f28", size = 373931, upload-time = "2025-05-21T12:45:05.01Z" }, + { url = "https://files.pythonhosted.org/packages/83/5d/deba18503f7c7878e26aa696e97f051175788e19d5336b3b0e76d3ef9256/rpds_py-0.25.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:0eb90e94f43e5085623932b68840b6f379f26db7b5c2e6bcef3179bd83c9330f", size = 359074, upload-time = "2025-05-21T12:45:06.714Z" }, + { url = "https://files.pythonhosted.org/packages/0d/74/313415c5627644eb114df49c56a27edba4d40cfd7c92bd90212b3604ca84/rpds_py-0.25.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d50e4864498a9ab639d6d8854b25e80642bd362ff104312d9770b05d66e5fb13", size = 387255, upload-time = "2025-05-21T12:45:08.669Z" }, + { url = "https://files.pythonhosted.org/packages/8c/c8/c723298ed6338963d94e05c0f12793acc9b91d04ed7c4ba7508e534b7385/rpds_py-0.25.1-pp310-pypy310_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7c9409b47ba0650544b0bb3c188243b83654dfe55dcc173a86832314e1a6a35d", size = 400714, upload-time = "2025-05-21T12:45:10.39Z" }, + { url = "https://files.pythonhosted.org/packages/33/8a/51f1f6aa653c2e110ed482ef2ae94140d56c910378752a1b483af11019ee/rpds_py-0.25.1-pp310-pypy310_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:796ad874c89127c91970652a4ee8b00d56368b7e00d3477f4415fe78164c8000", size = 523105, upload-time = "2025-05-21T12:45:12.273Z" }, + { url = "https://files.pythonhosted.org/packages/c7/a4/7873d15c088ad3bff36910b29ceb0f178e4b3232c2adbe9198de68a41e63/rpds_py-0.25.1-pp310-pypy310_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:85608eb70a659bf4c1142b2781083d4b7c0c4e2c90eff11856a9754e965b2540", size = 411499, upload-time = "2025-05-21T12:45:13.95Z" }, + { url = "https://files.pythonhosted.org/packages/90/f3/0ce1437befe1410766d11d08239333ac1b2d940f8a64234ce48a7714669c/rpds_py-0.25.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c4feb9211d15d9160bc85fa72fed46432cdc143eb9cf6d5ca377335a921ac37b", size = 387918, upload-time = "2025-05-21T12:45:15.649Z" }, + { url = "https://files.pythonhosted.org/packages/94/d4/5551247988b2a3566afb8a9dba3f1d4a3eea47793fd83000276c1a6c726e/rpds_py-0.25.1-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ccfa689b9246c48947d31dd9d8b16d89a0ecc8e0e26ea5253068efb6c542b76e", size = 421705, upload-time = "2025-05-21T12:45:17.788Z" }, + { url = "https://files.pythonhosted.org/packages/b0/25/5960f28f847bf736cc7ee3c545a7e1d2f3b5edaf82c96fb616c2f5ed52d0/rpds_py-0.25.1-pp310-pypy310_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:3c5b317ecbd8226887994852e85de562f7177add602514d4ac40f87de3ae45a8", size = 564489, upload-time = "2025-05-21T12:45:19.466Z" }, + { url = "https://files.pythonhosted.org/packages/02/66/1c99884a0d44e8c2904d3c4ec302f995292d5dde892c3bf7685ac1930146/rpds_py-0.25.1-pp310-pypy310_pp73-musllinux_1_2_i686.whl", hash = "sha256:454601988aab2c6e8fd49e7634c65476b2b919647626208e376afcd22019eeb8", size = 592557, upload-time = "2025-05-21T12:45:21.362Z" }, + { url = "https://files.pythonhosted.org/packages/55/ae/4aeac84ebeffeac14abb05b3bb1d2f728d00adb55d3fb7b51c9fa772e760/rpds_py-0.25.1-pp310-pypy310_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:1c0c434a53714358532d13539272db75a5ed9df75a4a090a753ac7173ec14e11", size = 558691, upload-time = "2025-05-21T12:45:23.084Z" }, + { url = "https://files.pythonhosted.org/packages/41/b3/728a08ff6f5e06fe3bb9af2e770e9d5fd20141af45cff8dfc62da4b2d0b3/rpds_py-0.25.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:f73ce1512e04fbe2bc97836e89830d6b4314c171587a99688082d090f934d20a", size = 231651, upload-time = "2025-05-21T12:45:24.72Z" }, + { url = "https://files.pythonhosted.org/packages/49/74/48f3df0715a585cbf5d34919c9c757a4c92c1a9eba059f2d334e72471f70/rpds_py-0.25.1-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:ee86d81551ec68a5c25373c5643d343150cc54672b5e9a0cafc93c1870a53954", size = 374208, upload-time = "2025-05-21T12:45:26.306Z" }, + { url = "https://files.pythonhosted.org/packages/55/b0/9b01bb11ce01ec03d05e627249cc2c06039d6aa24ea5a22a39c312167c10/rpds_py-0.25.1-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:89c24300cd4a8e4a51e55c31a8ff3918e6651b241ee8876a42cc2b2a078533ba", size = 359262, upload-time = "2025-05-21T12:45:28.322Z" }, + { url = "https://files.pythonhosted.org/packages/a9/eb/5395621618f723ebd5116c53282052943a726dba111b49cd2071f785b665/rpds_py-0.25.1-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:771c16060ff4e79584dc48902a91ba79fd93eade3aa3a12d6d2a4aadaf7d542b", size = 387366, upload-time = "2025-05-21T12:45:30.42Z" }, + { url = "https://files.pythonhosted.org/packages/68/73/3d51442bdb246db619d75039a50ea1cf8b5b4ee250c3e5cd5c3af5981cd4/rpds_py-0.25.1-pp311-pypy311_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:785ffacd0ee61c3e60bdfde93baa6d7c10d86f15655bd706c89da08068dc5038", size = 400759, upload-time = "2025-05-21T12:45:32.516Z" }, + { url = "https://files.pythonhosted.org/packages/b7/4c/3a32d5955d7e6cb117314597bc0f2224efc798428318b13073efe306512a/rpds_py-0.25.1-pp311-pypy311_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2a40046a529cc15cef88ac5ab589f83f739e2d332cb4d7399072242400ed68c9", size = 523128, upload-time = "2025-05-21T12:45:34.396Z" }, + { url = "https://files.pythonhosted.org/packages/be/95/1ffccd3b0bb901ae60b1dd4b1be2ab98bb4eb834cd9b15199888f5702f7b/rpds_py-0.25.1-pp311-pypy311_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:85fc223d9c76cabe5d0bff82214459189720dc135db45f9f66aa7cffbf9ff6c1", size = 411597, upload-time = "2025-05-21T12:45:36.164Z" }, + { url = "https://files.pythonhosted.org/packages/ef/6d/6e6cd310180689db8b0d2de7f7d1eabf3fb013f239e156ae0d5a1a85c27f/rpds_py-0.25.1-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b0be9965f93c222fb9b4cc254235b3b2b215796c03ef5ee64f995b1b69af0762", size = 388053, upload-time = "2025-05-21T12:45:38.45Z" }, + { url = "https://files.pythonhosted.org/packages/4a/87/ec4186b1fe6365ced6fa470960e68fc7804bafbe7c0cf5a36237aa240efa/rpds_py-0.25.1-pp311-pypy311_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:8378fa4a940f3fb509c081e06cb7f7f2adae8cf46ef258b0e0ed7519facd573e", size = 421821, upload-time = "2025-05-21T12:45:40.732Z" }, + { url = "https://files.pythonhosted.org/packages/7a/60/84f821f6bf4e0e710acc5039d91f8f594fae0d93fc368704920d8971680d/rpds_py-0.25.1-pp311-pypy311_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:33358883a4490287e67a2c391dfaea4d9359860281db3292b6886bf0be3d8692", size = 564534, upload-time = "2025-05-21T12:45:42.672Z" }, + { url = "https://files.pythonhosted.org/packages/41/3a/bc654eb15d3b38f9330fe0f545016ba154d89cdabc6177b0295910cd0ebe/rpds_py-0.25.1-pp311-pypy311_pp73-musllinux_1_2_i686.whl", hash = "sha256:1d1fadd539298e70cac2f2cb36f5b8a65f742b9b9f1014dd4ea1f7785e2470bf", size = 592674, upload-time = "2025-05-21T12:45:44.533Z" }, + { url = "https://files.pythonhosted.org/packages/2e/ba/31239736f29e4dfc7a58a45955c5db852864c306131fd6320aea214d5437/rpds_py-0.25.1-pp311-pypy311_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:9a46c2fb2545e21181445515960006e85d22025bd2fe6db23e76daec6eb689fe", size = 558781, upload-time = "2025-05-21T12:45:46.281Z" }, ] [[package]] @@ -5373,14 +5306,14 @@ wheels = [ [[package]] name = "ruamel-yaml" -version = "0.18.10" +version = "0.18.11" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "ruamel-yaml-clib", marker = "(python_full_version < '3.13' and platform_python_implementation == 'CPython' and sys_platform == 'darwin') or (python_full_version < '3.13' and platform_python_implementation == 'CPython' and sys_platform == 'linux') or (python_full_version < '3.13' and platform_python_implementation == 'CPython' and sys_platform == 'win32')" }, + { name = "ruamel-yaml-clib", marker = "(python_full_version < '3.14' and platform_python_implementation == 'CPython' and sys_platform == 'darwin') or (python_full_version < '3.14' and platform_python_implementation == 'CPython' and sys_platform == 'linux') or (python_full_version < '3.14' and platform_python_implementation == 'CPython' and sys_platform == 'win32')" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/ea/46/f44d8be06b85bc7c4d8c95d658be2b68f27711f279bf9dd0612a5e4794f5/ruamel.yaml-0.18.10.tar.gz", hash = "sha256:20c86ab29ac2153f80a428e1254a8adf686d3383df04490514ca3b79a362db58", size = 143447, upload-time = "2025-01-06T14:08:51.334Z" } +sdist = { url = "https://files.pythonhosted.org/packages/9d/8f/dfbab2d5ec83da0605ab935fb43ffa8ab5828455e2c910b7314fdd18e0b8/ruamel.yaml-0.18.11.tar.gz", hash = "sha256:b586a3416676566ed45bf679a0909719f7ea7b58c03a9b6e03f905a1e2cd5076", size = 144299, upload-time = "2025-05-25T10:05:12.039Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/c2/36/dfc1ebc0081e6d39924a2cc53654497f967a084a436bb64402dfce4254d9/ruamel.yaml-0.18.10-py3-none-any.whl", hash = "sha256:30f22513ab2301b3d2b577adc121c6471f28734d3d9728581245f1e76468b4f1", size = 117729, upload-time = "2025-01-06T14:08:47.471Z" }, + { url = "https://files.pythonhosted.org/packages/2e/62/615a16ebbca43fd4434843e9d346d795a134d0a1ff46101c858d93c9778d/ruamel.yaml-0.18.11-py3-none-any.whl", hash = "sha256:eca06c9fce6ee3220845c4c54e58376586e041a6127e4d1958e12a3142084897", size = 118313, upload-time = "2025-05-25T10:05:08.323Z" }, ] [[package]] @@ -5429,39 +5362,39 @@ wheels = [ [[package]] name = "ruff" -version = "0.11.10" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/e8/4c/4a3c5a97faaae6b428b336dcca81d03ad04779f8072c267ad2bd860126bf/ruff-0.11.10.tar.gz", hash = "sha256:d522fb204b4959909ecac47da02830daec102eeb100fb50ea9554818d47a5fa6", size = 4165632, upload-time = "2025-05-15T14:08:56.76Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/2f/9f/596c628f8824a2ce4cd12b0f0b4c0629a62dfffc5d0f742c19a1d71be108/ruff-0.11.10-py3-none-linux_armv6l.whl", hash = "sha256:859a7bfa7bc8888abbea31ef8a2b411714e6a80f0d173c2a82f9041ed6b50f58", size = 10316243, upload-time = "2025-05-15T14:08:12.884Z" }, - { url = "https://files.pythonhosted.org/packages/3c/38/c1e0b77ab58b426f8c332c1d1d3432d9fc9a9ea622806e208220cb133c9e/ruff-0.11.10-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:968220a57e09ea5e4fd48ed1c646419961a0570727c7e069842edd018ee8afed", size = 11083636, upload-time = "2025-05-15T14:08:16.551Z" }, - { url = "https://files.pythonhosted.org/packages/23/41/b75e15961d6047d7fe1b13886e56e8413be8467a4e1be0a07f3b303cd65a/ruff-0.11.10-py3-none-macosx_11_0_arm64.whl", hash = "sha256:1067245bad978e7aa7b22f67113ecc6eb241dca0d9b696144256c3a879663bca", size = 10441624, upload-time = "2025-05-15T14:08:19.032Z" }, - { url = "https://files.pythonhosted.org/packages/b6/2c/e396b6703f131406db1811ea3d746f29d91b41bbd43ad572fea30da1435d/ruff-0.11.10-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f4854fd09c7aed5b1590e996a81aeff0c9ff51378b084eb5a0b9cd9518e6cff2", size = 10624358, upload-time = "2025-05-15T14:08:21.542Z" }, - { url = "https://files.pythonhosted.org/packages/bd/8c/ee6cca8bdaf0f9a3704796022851a33cd37d1340bceaf4f6e991eb164e2e/ruff-0.11.10-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:8b4564e9f99168c0f9195a0fd5fa5928004b33b377137f978055e40008a082c5", size = 10176850, upload-time = "2025-05-15T14:08:23.682Z" }, - { url = "https://files.pythonhosted.org/packages/e9/ce/4e27e131a434321b3b7c66512c3ee7505b446eb1c8a80777c023f7e876e6/ruff-0.11.10-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5b6a9cc5b62c03cc1fea0044ed8576379dbaf751d5503d718c973d5418483641", size = 11759787, upload-time = "2025-05-15T14:08:25.733Z" }, - { url = "https://files.pythonhosted.org/packages/58/de/1e2e77fc72adc7cf5b5123fd04a59ed329651d3eab9825674a9e640b100b/ruff-0.11.10-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:607ecbb6f03e44c9e0a93aedacb17b4eb4f3563d00e8b474298a201622677947", size = 12430479, upload-time = "2025-05-15T14:08:28.013Z" }, - { url = "https://files.pythonhosted.org/packages/07/ed/af0f2340f33b70d50121628ef175523cc4c37619e98d98748c85764c8d88/ruff-0.11.10-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7b3a522fa389402cd2137df9ddefe848f727250535c70dafa840badffb56b7a4", size = 11919760, upload-time = "2025-05-15T14:08:30.956Z" }, - { url = "https://files.pythonhosted.org/packages/24/09/d7b3d3226d535cb89234390f418d10e00a157b6c4a06dfbe723e9322cb7d/ruff-0.11.10-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2f071b0deed7e9245d5820dac235cbdd4ef99d7b12ff04c330a241ad3534319f", size = 14041747, upload-time = "2025-05-15T14:08:33.297Z" }, - { url = "https://files.pythonhosted.org/packages/62/b3/a63b4e91850e3f47f78795e6630ee9266cb6963de8f0191600289c2bb8f4/ruff-0.11.10-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4a60e3a0a617eafba1f2e4186d827759d65348fa53708ca547e384db28406a0b", size = 11550657, upload-time = "2025-05-15T14:08:35.639Z" }, - { url = "https://files.pythonhosted.org/packages/46/63/a4f95c241d79402ccdbdb1d823d156c89fbb36ebfc4289dce092e6c0aa8f/ruff-0.11.10-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:da8ec977eaa4b7bf75470fb575bea2cb41a0e07c7ea9d5a0a97d13dbca697bf2", size = 10489671, upload-time = "2025-05-15T14:08:38.437Z" }, - { url = "https://files.pythonhosted.org/packages/6a/9b/c2238bfebf1e473495659c523d50b1685258b6345d5ab0b418ca3f010cd7/ruff-0.11.10-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:ddf8967e08227d1bd95cc0851ef80d2ad9c7c0c5aab1eba31db49cf0a7b99523", size = 10160135, upload-time = "2025-05-15T14:08:41.247Z" }, - { url = "https://files.pythonhosted.org/packages/ba/ef/ba7251dd15206688dbfba7d413c0312e94df3b31b08f5d695580b755a899/ruff-0.11.10-py3-none-musllinux_1_2_i686.whl", hash = "sha256:5a94acf798a82db188f6f36575d80609072b032105d114b0f98661e1679c9125", size = 11170179, upload-time = "2025-05-15T14:08:43.762Z" }, - { url = "https://files.pythonhosted.org/packages/73/9f/5c336717293203ba275dbfa2ea16e49b29a9fd9a0ea8b6febfc17e133577/ruff-0.11.10-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:3afead355f1d16d95630df28d4ba17fb2cb9c8dfac8d21ced14984121f639bad", size = 11626021, upload-time = "2025-05-15T14:08:46.451Z" }, - { url = "https://files.pythonhosted.org/packages/d9/2b/162fa86d2639076667c9aa59196c020dc6d7023ac8f342416c2f5ec4bda0/ruff-0.11.10-py3-none-win32.whl", hash = "sha256:dc061a98d32a97211af7e7f3fa1d4ca2fcf919fb96c28f39551f35fc55bdbc19", size = 10494958, upload-time = "2025-05-15T14:08:49.601Z" }, - { url = "https://files.pythonhosted.org/packages/24/f3/66643d8f32f50a4b0d09a4832b7d919145ee2b944d43e604fbd7c144d175/ruff-0.11.10-py3-none-win_amd64.whl", hash = "sha256:5cc725fbb4d25b0f185cb42df07ab6b76c4489b4bfb740a175f3a59c70e8a224", size = 11650285, upload-time = "2025-05-15T14:08:52.392Z" }, - { url = "https://files.pythonhosted.org/packages/95/3a/2e8704d19f376c799748ff9cb041225c1d59f3e7711bc5596c8cfdc24925/ruff-0.11.10-py3-none-win_arm64.whl", hash = "sha256:ef69637b35fb8b210743926778d0e45e1bffa850a7c61e428c6b971549b5f5d1", size = 10765278, upload-time = "2025-05-15T14:08:54.56Z" }, +version = "0.11.11" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/b2/53/ae4857030d59286924a8bdb30d213d6ff22d8f0957e738d0289990091dd8/ruff-0.11.11.tar.gz", hash = "sha256:7774173cc7c1980e6bf67569ebb7085989a78a103922fb83ef3dfe230cd0687d", size = 4186707, upload-time = "2025-05-22T19:19:34.363Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b1/14/f2326676197bab099e2a24473158c21656fbf6a207c65f596ae15acb32b9/ruff-0.11.11-py3-none-linux_armv6l.whl", hash = "sha256:9924e5ae54125ed8958a4f7de320dab7380f6e9fa3195e3dc3b137c6842a0092", size = 10229049, upload-time = "2025-05-22T19:18:45.516Z" }, + { url = "https://files.pythonhosted.org/packages/9a/f3/bff7c92dd66c959e711688b2e0768e486bbca46b2f35ac319bb6cce04447/ruff-0.11.11-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:c8a93276393d91e952f790148eb226658dd275cddfde96c6ca304873f11d2ae4", size = 11053601, upload-time = "2025-05-22T19:18:49.269Z" }, + { url = "https://files.pythonhosted.org/packages/e2/38/8e1a3efd0ef9d8259346f986b77de0f62c7a5ff4a76563b6b39b68f793b9/ruff-0.11.11-py3-none-macosx_11_0_arm64.whl", hash = "sha256:d6e333dbe2e6ae84cdedefa943dfd6434753ad321764fd937eef9d6b62022bcd", size = 10367421, upload-time = "2025-05-22T19:18:51.754Z" }, + { url = "https://files.pythonhosted.org/packages/b4/50/557ad9dd4fb9d0bf524ec83a090a3932d284d1a8b48b5906b13b72800e5f/ruff-0.11.11-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7885d9a5e4c77b24e8c88aba8c80be9255fa22ab326019dac2356cff42089fc6", size = 10581980, upload-time = "2025-05-22T19:18:54.011Z" }, + { url = "https://files.pythonhosted.org/packages/c4/b2/e2ed82d6e2739ece94f1bdbbd1d81b712d3cdaf69f0a1d1f1a116b33f9ad/ruff-0.11.11-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:1b5ab797fcc09121ed82e9b12b6f27e34859e4227080a42d090881be888755d4", size = 10089241, upload-time = "2025-05-22T19:18:56.041Z" }, + { url = "https://files.pythonhosted.org/packages/3d/9f/b4539f037a5302c450d7c695c82f80e98e48d0d667ecc250e6bdeb49b5c3/ruff-0.11.11-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e231ff3132c1119ece836487a02785f099a43992b95c2f62847d29bace3c75ac", size = 11699398, upload-time = "2025-05-22T19:18:58.248Z" }, + { url = "https://files.pythonhosted.org/packages/61/fb/32e029d2c0b17df65e6eaa5ce7aea5fbeaed22dddd9fcfbbf5fe37c6e44e/ruff-0.11.11-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:a97c9babe1d4081037a90289986925726b802d180cca784ac8da2bbbc335f709", size = 12427955, upload-time = "2025-05-22T19:19:00.981Z" }, + { url = "https://files.pythonhosted.org/packages/6e/e3/160488dbb11f18c8121cfd588e38095ba779ae208292765972f7732bfd95/ruff-0.11.11-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d8c4ddcbe8a19f59f57fd814b8b117d4fcea9bee7c0492e6cf5fdc22cfa563c8", size = 12069803, upload-time = "2025-05-22T19:19:03.258Z" }, + { url = "https://files.pythonhosted.org/packages/ff/16/3b006a875f84b3d0bff24bef26b8b3591454903f6f754b3f0a318589dcc3/ruff-0.11.11-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6224076c344a7694c6fbbb70d4f2a7b730f6d47d2a9dc1e7f9d9bb583faf390b", size = 11242630, upload-time = "2025-05-22T19:19:05.871Z" }, + { url = "https://files.pythonhosted.org/packages/65/0d/0338bb8ac0b97175c2d533e9c8cdc127166de7eb16d028a43c5ab9e75abd/ruff-0.11.11-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:882821fcdf7ae8db7a951df1903d9cb032bbe838852e5fc3c2b6c3ab54e39875", size = 11507310, upload-time = "2025-05-22T19:19:08.584Z" }, + { url = "https://files.pythonhosted.org/packages/6f/bf/d7130eb26174ce9b02348b9f86d5874eafbf9f68e5152e15e8e0a392e4a3/ruff-0.11.11-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:dcec2d50756463d9df075a26a85a6affbc1b0148873da3997286caf1ce03cae1", size = 10441144, upload-time = "2025-05-22T19:19:13.621Z" }, + { url = "https://files.pythonhosted.org/packages/b3/f3/4be2453b258c092ff7b1761987cf0749e70ca1340cd1bfb4def08a70e8d8/ruff-0.11.11-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:99c28505ecbaeb6594701a74e395b187ee083ee26478c1a795d35084d53ebd81", size = 10081987, upload-time = "2025-05-22T19:19:15.821Z" }, + { url = "https://files.pythonhosted.org/packages/6c/6e/dfa4d2030c5b5c13db158219f2ec67bf333e8a7748dccf34cfa2a6ab9ebc/ruff-0.11.11-py3-none-musllinux_1_2_i686.whl", hash = "sha256:9263f9e5aa4ff1dec765e99810f1cc53f0c868c5329b69f13845f699fe74f639", size = 11073922, upload-time = "2025-05-22T19:19:18.104Z" }, + { url = "https://files.pythonhosted.org/packages/ff/f4/f7b0b0c3d32b593a20ed8010fa2c1a01f2ce91e79dda6119fcc51d26c67b/ruff-0.11.11-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:64ac6f885e3ecb2fdbb71de2701d4e34526651f1e8503af8fb30d4915a3fe345", size = 11568537, upload-time = "2025-05-22T19:19:20.889Z" }, + { url = "https://files.pythonhosted.org/packages/d2/46/0e892064d0adc18bcc81deed9aaa9942a27fd2cd9b1b7791111ce468c25f/ruff-0.11.11-py3-none-win32.whl", hash = "sha256:1adcb9a18802268aaa891ffb67b1c94cd70578f126637118e8099b8e4adcf112", size = 10536492, upload-time = "2025-05-22T19:19:23.642Z" }, + { url = "https://files.pythonhosted.org/packages/1b/d9/232e79459850b9f327e9f1dc9c047a2a38a6f9689e1ec30024841fc4416c/ruff-0.11.11-py3-none-win_amd64.whl", hash = "sha256:748b4bb245f11e91a04a4ff0f96e386711df0a30412b9fe0c74d5bdc0e4a531f", size = 11612562, upload-time = "2025-05-22T19:19:27.013Z" }, + { url = "https://files.pythonhosted.org/packages/ce/eb/09c132cff3cc30b2e7244191dcce69437352d6d6709c0adf374f3e6f476e/ruff-0.11.11-py3-none-win_arm64.whl", hash = "sha256:6c51f136c0364ab1b774767aa8b86331bd8e9d414e2d107db7a2189f35ea1f7b", size = 10735951, upload-time = "2025-05-22T19:19:30.043Z" }, ] [[package]] name = "s3transfer" -version = "0.12.0" +version = "0.13.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "botocore", marker = "sys_platform == 'darwin' or sys_platform == 'linux' or sys_platform == 'win32'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/fc/9e/73b14aed38ee1f62cd30ab93cd0072dec7fb01f3033d116875ae3e7b8b44/s3transfer-0.12.0.tar.gz", hash = "sha256:8ac58bc1989a3fdb7c7f3ee0918a66b160d038a147c7b5db1500930a607e9a1c", size = 149178, upload-time = "2025-04-22T21:08:09.787Z" } +sdist = { url = "https://files.pythonhosted.org/packages/ed/5d/9dcc100abc6711e8247af5aa561fc07c4a046f72f659c3adea9a449e191a/s3transfer-0.13.0.tar.gz", hash = "sha256:f5e6db74eb7776a37208001113ea7aa97695368242b364d73e91c981ac522177", size = 150232, upload-time = "2025-05-22T19:24:50.245Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/89/64/d2b49620039b82688aeebd510bd62ff4cdcdb86cbf650cc72ae42c5254a3/s3transfer-0.12.0-py3-none-any.whl", hash = "sha256:35b314d7d82865756edab59f7baebc6b477189e6ab4c53050e28c1de4d9cce18", size = 84773, upload-time = "2025-04-22T21:08:08.265Z" }, + { url = "https://files.pythonhosted.org/packages/18/17/22bf8155aa0ea2305eefa3a6402e040df7ebe512d1310165eda1e233c3f8/s3transfer-0.13.0-py3-none-any.whl", hash = "sha256:0148ef34d6dd964d0d8cf4311b2b21c474693e57c2e069ec708ce043d2b527be", size = 85152, upload-time = "2025-05-22T19:24:48.703Z" }, ] [[package]] @@ -5650,7 +5583,7 @@ mcp = [ milvus = [ { name = "milvus", marker = "sys_platform == 'darwin' or sys_platform == 'linux'" }, { name = "pymilvus", version = "2.4.9", source = { registry = "https://pypi.org/simple" }, marker = "(python_full_version >= '3.13' and python_full_version < '4.0' and sys_platform == 'darwin') or (python_full_version >= '3.13' and python_full_version < '4.0' and sys_platform == 'linux') or (python_full_version >= '3.13' and python_full_version < '4.0' and sys_platform == 'win32')" }, - { name = "pymilvus", version = "2.5.8", source = { registry = "https://pypi.org/simple" }, marker = "(python_full_version < '3.13' and sys_platform == 'darwin') or (python_full_version >= '4.0' and sys_platform == 'darwin') or (python_full_version < '3.13' and sys_platform == 'linux') or (python_full_version >= '4.0' and sys_platform == 'linux') or (python_full_version < '3.13' and sys_platform == 'win32') or (python_full_version >= '4.0' and sys_platform == 'win32')" }, + { name = "pymilvus", version = "2.5.10", source = { registry = "https://pypi.org/simple" }, marker = "(python_full_version < '3.13' and sys_platform == 'darwin') or (python_full_version >= '4.0' and sys_platform == 'darwin') or (python_full_version < '3.13' and sys_platform == 'linux') or (python_full_version >= '4.0' and sys_platform == 'linux') or (python_full_version < '3.13' and sys_platform == 'win32') or (python_full_version >= '4.0' and sys_platform == 'win32')" }, ] mistralai = [ { name = "mistralai", marker = "sys_platform == 'darwin' or sys_platform == 'linux' or sys_platform == 'win32'" }, @@ -5666,8 +5599,7 @@ ollama = [ { name = "ollama", marker = "sys_platform == 'darwin' or sys_platform == 'linux' or sys_platform == 'win32'" }, ] onnx = [ - { name = "onnxruntime", version = "1.22.0", source = { registry = "https://pypi.org/simple" }, marker = "sys_platform == 'win32'" }, - { name = "onnxruntime-genai", marker = "(python_full_version < '3.13' and sys_platform == 'darwin') or (python_full_version < '3.13' and sys_platform == 'linux')" }, + { name = "onnxruntime-genai", marker = "sys_platform == 'darwin' or sys_platform == 'linux' or sys_platform == 'win32'" }, ] pandas = [ { name = "pandas", marker = "sys_platform == 'darwin' or sys_platform == 'linux' or sys_platform == 'win32'" }, @@ -5679,8 +5611,7 @@ postgres = [ { name = "psycopg", extra = ["binary", "pool"], marker = "sys_platform == 'darwin' or sys_platform == 'linux' or sys_platform == 'win32'" }, ] qdrant = [ - { name = "qdrant-client", version = "1.12.1", source = { registry = "https://pypi.org/simple" }, 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 = "qdrant-client", version = "1.14.2", source = { registry = "https://pypi.org/simple" }, 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 = "qdrant-client", marker = "sys_platform == 'darwin' or sys_platform == 'linux' or sys_platform == 'win32'" }, ] realtime = [ { name = "aiortc", marker = "sys_platform == 'darwin' or sys_platform == 'linux' or sys_platform == 'win32'" }, @@ -5752,8 +5683,7 @@ requires-dist = [ { name = "numpy", marker = "python_full_version < '3.12'", specifier = ">=1.25.0" }, { name = "numpy", marker = "python_full_version >= '3.12'", specifier = ">=1.26.0" }, { name = "ollama", marker = "extra == 'ollama'", specifier = "~=0.4" }, - { name = "onnxruntime", marker = "sys_platform == 'win32' and extra == 'onnx'", specifier = "==1.22.0" }, - { name = "onnxruntime-genai", marker = "python_full_version < '3.13' and sys_platform != 'win32' and extra == 'onnx'", specifier = "~=0.5" }, + { name = "onnxruntime-genai", marker = "extra == 'onnx'", specifier = "~=0.7" }, { name = "openai", specifier = ">=1.67" }, { name = "openapi-core", specifier = ">=0.18,<0.20" }, { name = "opentelemetry-api", specifier = "~=1.24" }, @@ -5823,62 +5753,62 @@ wheels = [ [[package]] name = "setuptools" -version = "80.7.1" +version = "80.8.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/9e/8b/dc1773e8e5d07fd27c1632c45c1de856ac3dbf09c0147f782ca6d990cf15/setuptools-80.7.1.tar.gz", hash = "sha256:f6ffc5f0142b1bd8d0ca94ee91b30c0ca862ffd50826da1ea85258a06fd94552", size = 1319188, upload-time = "2025-05-15T02:41:00.955Z" } +sdist = { url = "https://files.pythonhosted.org/packages/8d/d2/ec1acaaff45caed5c2dedb33b67055ba9d4e96b091094df90762e60135fe/setuptools-80.8.0.tar.gz", hash = "sha256:49f7af965996f26d43c8ae34539c8d99c5042fbff34302ea151eaa9c207cd257", size = 1319720, upload-time = "2025-05-20T14:02:53.503Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/a1/18/0e835c3a557dc5faffc8f91092f62fc337c1dab1066715842e7a4b318ec4/setuptools-80.7.1-py3-none-any.whl", hash = "sha256:ca5cc1069b85dc23070a6628e6bcecb3292acac802399c7f8edc0100619f9009", size = 1200776, upload-time = "2025-05-15T02:40:58.887Z" }, + { url = "https://files.pythonhosted.org/packages/58/29/93c53c098d301132196c3238c312825324740851d77a8500a2462c0fd888/setuptools-80.8.0-py3-none-any.whl", hash = "sha256:95a60484590d24103af13b686121328cc2736bee85de8936383111e421b9edc0", size = 1201470, upload-time = "2025-05-20T14:02:51.348Z" }, ] [[package]] name = "shapely" -version = "2.1.0" +version = "2.1.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "numpy", marker = "sys_platform == 'darwin' or sys_platform == 'linux' or sys_platform == 'win32'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/fb/fe/3b0d2f828ffaceadcdcb51b75b9c62d98e62dd95ce575278de35f24a1c20/shapely-2.1.0.tar.gz", hash = "sha256:2cbe90e86fa8fc3ca8af6ffb00a77b246b918c7cf28677b7c21489b678f6b02e", size = 313617, upload-time = "2025-04-03T09:15:05.725Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/98/97/7027722bec6fba6fbfdb36ff987bc368f6cd01ff91d3815bce93439ef3f5/shapely-2.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d3e5c5e3864d4dc431dd85a8e5137ebd39c8ac287b009d3fa80a07017b29c940", size = 1826440, upload-time = "2025-04-03T09:13:56.755Z" }, - { url = "https://files.pythonhosted.org/packages/7e/de/d2ee50a66fcff3786a00b59b99b5bf3a7ec7bb1805e1c409a1c9c1817749/shapely-2.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d6eea89b16f5f3a064659126455d23fa3066bc3d6cd385c35214f06bf5871aa6", size = 1627651, upload-time = "2025-04-03T09:13:58.649Z" }, - { url = "https://files.pythonhosted.org/packages/54/c9/e0ead09661f58fb9ef65826ff6af7fa4386f9e52dc25ddd36cdd019235e2/shapely-2.1.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:183174ad0b21a81ee661f05e7c47aa92ebfae01814cd3cbe54adea7a4213f5f4", size = 2891260, upload-time = "2025-04-03T09:14:00.574Z" }, - { url = "https://files.pythonhosted.org/packages/16/6f/bcb800b2579b995bb61f429445b7328ae2336155964ca5f6c367ebd3fd17/shapely-2.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f239c1484af66bc14b81a76f2a8e0fada29d59010423253ff857d0ccefdaa93f", size = 3011154, upload-time = "2025-04-03T09:14:02.103Z" }, - { url = "https://files.pythonhosted.org/packages/c5/a0/8eeaf01fff142f092b64b53c425bd11a2c2a1564a30df283d9e8eb719fcf/shapely-2.1.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:6220a466d1475141dad0cd8065d2549a5c2ed3fa4e2e02fb8ea65d494cfd5b07", size = 3834153, upload-time = "2025-04-03T09:14:03.999Z" }, - { url = "https://files.pythonhosted.org/packages/7c/45/4a0b7e55731a410f44c4f8fbc61f484e04ec78eb6490d05576ff98efec59/shapely-2.1.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:4822d3ed3efb06145c34d29d5b56792f72b7d713300f603bfd5d825892c6f79f", size = 4017460, upload-time = "2025-04-03T09:14:05.894Z" }, - { url = "https://files.pythonhosted.org/packages/bf/75/c3f3e6f5d40b9bf9390aa47d7ec56b8d56e61a30487d76d7aa06f87b3308/shapely-2.1.0-cp310-cp310-win32.whl", hash = "sha256:ea51ddf3d3c60866dca746081b56c75f34ff1b01acbd4d44269071a673c735b9", size = 1527812, upload-time = "2025-04-03T09:14:07.528Z" }, - { url = "https://files.pythonhosted.org/packages/71/0a/2002b39da6935f361da9c6437e45e01f0ebac81f66c08c01da974227036c/shapely-2.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:a6f5e02e2cded9f4ec5709900a296c7f2cce5f8e9e9d80ba7d89ae2f4ed89d7b", size = 1707475, upload-time = "2025-04-03T09:14:08.964Z" }, - { url = "https://files.pythonhosted.org/packages/1c/37/ae448f06f363ff3dfe4bae890abd842c4e3e9edaf01245dbc9b97008c9e6/shapely-2.1.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c8323031ef7c1bdda7a92d5ddbc7b6b62702e73ba37e9a8ccc8da99ec2c0b87c", size = 1820974, upload-time = "2025-04-03T09:14:11.301Z" }, - { url = "https://files.pythonhosted.org/packages/78/da/ea2a898e93c6953c5eef353a0e1781a0013a1352f2b90aa9ab0b800e0c75/shapely-2.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4da7c6cd748d86ec6aace99ad17129d30954ccf5e73e9911cdb5f0fa9658b4f8", size = 1624137, upload-time = "2025-04-03T09:14:13.127Z" }, - { url = "https://files.pythonhosted.org/packages/64/4a/f903f82f0fabcd3f43ea2e8132cabda079119247330a9fe58018c39c4e22/shapely-2.1.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f0cdf85ff80831137067e7a237085a3ee72c225dba1b30beef87f7d396cf02b", size = 2957161, upload-time = "2025-04-03T09:14:15.031Z" }, - { url = "https://files.pythonhosted.org/packages/92/07/3e2738c542d73182066196b8ce99388cb537d19e300e428d50b1537e3b21/shapely-2.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:41f2be5d79aac39886f23000727cf02001aef3af8810176c29ee12cdc3ef3a50", size = 3078530, upload-time = "2025-04-03T09:14:16.562Z" }, - { url = "https://files.pythonhosted.org/packages/82/08/32210e63d8f8af9142d37c2433ece4846862cdac91a0fe66f040780a71bd/shapely-2.1.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:21a4515009f56d7a159cf5c2554264e82f56405b4721f9a422cb397237c5dca8", size = 3902208, upload-time = "2025-04-03T09:14:18.342Z" }, - { url = "https://files.pythonhosted.org/packages/19/0e/0abb5225f8a32fbdb615476637038a7d2db40c0af46d1bb3a08b869bee39/shapely-2.1.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:15cebc323cec2cb6b2eaa310fdfc621f6dbbfaf6bde336d13838fcea76c885a9", size = 4082863, upload-time = "2025-04-03T09:14:20.233Z" }, - { url = "https://files.pythonhosted.org/packages/f8/1b/7cd816fd388108c872ab7e2930180b02d0c34891213f361e4a66e5e032f2/shapely-2.1.0-cp311-cp311-win32.whl", hash = "sha256:cad51b7a5c8f82f5640472944a74f0f239123dde9a63042b3c5ea311739b7d20", size = 1527488, upload-time = "2025-04-03T09:14:21.597Z" }, - { url = "https://files.pythonhosted.org/packages/fd/28/7bb5b1944d4002d4b2f967762018500381c3b532f98e456bbda40c3ded68/shapely-2.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:d4005309dde8658e287ad9c435c81877f6a95a9419b932fa7a1f34b120f270ae", size = 1708311, upload-time = "2025-04-03T09:14:23.245Z" }, - { url = "https://files.pythonhosted.org/packages/4e/d1/6a9371ec39d3ef08e13225594e6c55b045209629afd9e6d403204507c2a8/shapely-2.1.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:53e7ee8bd8609cf12ee6dce01ea5affe676976cf7049315751d53d8db6d2b4b2", size = 1830732, upload-time = "2025-04-03T09:14:25.047Z" }, - { url = "https://files.pythonhosted.org/packages/32/87/799e3e48be7ce848c08509b94d2180f4ddb02e846e3c62d0af33da4d78d3/shapely-2.1.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:3cab20b665d26dbec0b380e15749bea720885a481fa7b1eedc88195d4a98cfa4", size = 1638404, upload-time = "2025-04-03T09:14:26.456Z" }, - { url = "https://files.pythonhosted.org/packages/85/00/6665d77f9dd09478ab0993b8bc31668aec4fd3e5f1ddd1b28dd5830e47be/shapely-2.1.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f4a38b39a09340273c3c92b3b9a374272a12cc7e468aeeea22c1c46217a03e5c", size = 2945316, upload-time = "2025-04-03T09:14:28.266Z" }, - { url = "https://files.pythonhosted.org/packages/34/49/738e07d10bbc67cae0dcfe5a484c6e518a517f4f90550dda2adf3a78b9f2/shapely-2.1.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:edaec656bdd9b71278b98e6f77c464b1c3b2daa9eace78012ff0f0b4b5b15b04", size = 3063099, upload-time = "2025-04-03T09:14:30.067Z" }, - { url = "https://files.pythonhosted.org/packages/88/b8/138098674559362ab29f152bff3b6630de423378fbb0324812742433a4ef/shapely-2.1.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:c8a732ddd9b25e7a54aa748e7df8fd704e23e5d5d35b7d376d80bffbfc376d04", size = 3887873, upload-time = "2025-04-03T09:14:31.912Z" }, - { url = "https://files.pythonhosted.org/packages/67/a8/fdae7c2db009244991d86f4d2ca09d2f5ccc9d41c312c3b1ee1404dc55da/shapely-2.1.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:9c93693ad8adfdc9138a5a2d42da02da94f728dd2e82d2f0f442f10e25027f5f", size = 4067004, upload-time = "2025-04-03T09:14:33.976Z" }, - { url = "https://files.pythonhosted.org/packages/ed/78/17e17d91b489019379df3ee1afc4bd39787b232aaa1d540f7d376f0280b7/shapely-2.1.0-cp312-cp312-win32.whl", hash = "sha256:d8ac6604eefe807e71a908524de23a37920133a1729fe3a4dfe0ed82c044cbf4", size = 1527366, upload-time = "2025-04-03T09:14:35.348Z" }, - { url = "https://files.pythonhosted.org/packages/b8/bd/9249bd6dda948441e25e4fb14cbbb5205146b0fff12c66b19331f1ff2141/shapely-2.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:f4f47e631aa4f9ec5576eac546eb3f38802e2f82aeb0552f9612cb9a14ece1db", size = 1708265, upload-time = "2025-04-03T09:14:36.878Z" }, - { url = "https://files.pythonhosted.org/packages/8d/77/4e368704b2193e74498473db4461d697cc6083c96f8039367e59009d78bd/shapely-2.1.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:b64423295b563f43a043eb786e7a03200ebe68698e36d2b4b1c39f31dfb50dfb", size = 1830029, upload-time = "2025-04-03T09:14:38.795Z" }, - { url = "https://files.pythonhosted.org/packages/71/3c/d888597bda680e4de987316b05ca9db07416fa29523beff64f846503302f/shapely-2.1.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:1b5578f45adc25b235b22d1ccb9a0348c8dc36f31983e57ea129a88f96f7b870", size = 1637999, upload-time = "2025-04-03T09:14:40.209Z" }, - { url = "https://files.pythonhosted.org/packages/03/8d/ee0e23b7ef88fba353c63a81f1f329c77f5703835db7b165e7c0b8b7f839/shapely-2.1.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d1a7e83d383b27f02b684e50ab7f34e511c92e33b6ca164a6a9065705dd64bcb", size = 2929348, upload-time = "2025-04-03T09:14:42.11Z" }, - { url = "https://files.pythonhosted.org/packages/d1/a7/5c9cb413e4e2ce52c16be717e94abd40ce91b1f8974624d5d56154c5d40b/shapely-2.1.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:942031eb4d8f7b3b22f43ba42c09c7aa3d843aa10d5cc1619fe816e923b66e55", size = 3048973, upload-time = "2025-04-03T09:14:43.841Z" }, - { url = "https://files.pythonhosted.org/packages/84/23/45b90c0bd2157b238490ca56ef2eedf959d3514c7d05475f497a2c88b6d9/shapely-2.1.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:d2843c456a2e5627ee6271800f07277c0d2652fb287bf66464571a057dbc00b3", size = 3873148, upload-time = "2025-04-03T09:14:45.924Z" }, - { url = "https://files.pythonhosted.org/packages/c0/bc/ed7d5d37f5395166042576f0c55a12d7e56102799464ba7ea3a72a38c769/shapely-2.1.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:8c4b17469b7f39a5e6a7cfea79f38ae08a275427f41fe8b48c372e1449147908", size = 4052655, upload-time = "2025-04-03T09:14:47.475Z" }, - { url = "https://files.pythonhosted.org/packages/c0/8f/a1dafbb10d20d1c569f2db3fb1235488f624dafe8469e8ce65356800ba31/shapely-2.1.0-cp313-cp313-win32.whl", hash = "sha256:30e967abd08fce49513d4187c01b19f139084019f33bec0673e8dbeb557c45e4", size = 1526600, upload-time = "2025-04-03T09:14:48.952Z" }, - { url = "https://files.pythonhosted.org/packages/e3/f0/9f8cdf2258d7aed742459cea51c70d184de92f5d2d6f5f7f1ded90a18c31/shapely-2.1.0-cp313-cp313-win_amd64.whl", hash = "sha256:1dc8d4364483a14aba4c844b7bd16a6fa3728887e2c33dfa1afa34a3cf4d08a5", size = 1707115, upload-time = "2025-04-03T09:14:50.445Z" }, - { url = "https://files.pythonhosted.org/packages/75/ed/32952df461753a65b3e5d24c8efb361d3a80aafaef0b70d419063f6f2c11/shapely-2.1.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:673e073fea099d1c82f666fb7ab0a00a77eff2999130a69357ce11941260d855", size = 1824847, upload-time = "2025-04-03T09:14:52.358Z" }, - { url = "https://files.pythonhosted.org/packages/ff/b9/2284de512af30b02f93ddcdd2e5c79834a3cf47fa3ca11b0f74396feb046/shapely-2.1.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:6d1513f915a56de67659fe2047c1ad5ff0f8cbff3519d1e74fced69c9cb0e7da", size = 1631035, upload-time = "2025-04-03T09:14:53.739Z" }, - { url = "https://files.pythonhosted.org/packages/35/16/a59f252a7e736b73008f10d0950ffeeb0d5953be7c0bdffd39a02a6ba310/shapely-2.1.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0d6a7043178890b9e028d80496ff4c79dc7629bff4d78a2f25323b661756bab8", size = 2968639, upload-time = "2025-04-03T09:14:55.674Z" }, - { url = "https://files.pythonhosted.org/packages/a5/0a/6a20eca7b0092cfa243117e8e145a58631a4833a0a519ec9b445172e83a0/shapely-2.1.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cb638378dc3d76f7e85b67d7e2bb1366811912430ac9247ac00c127c2b444cdc", size = 3055713, upload-time = "2025-04-03T09:14:57.564Z" }, - { url = "https://files.pythonhosted.org/packages/fb/44/eeb0c7583b1453d1cf7a319a1d738e08f98a5dc993fa1ef3c372983e4cb5/shapely-2.1.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:737124e87d91d616acf9a911f74ac55e05db02a43a6a7245b3d663817b876055", size = 3890478, upload-time = "2025-04-03T09:14:59.139Z" }, - { url = "https://files.pythonhosted.org/packages/5d/6e/37ff3c6af1d408cacb0a7d7bfea7b8ab163a5486e35acb08997eae9d8756/shapely-2.1.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:8e6c229e7bb87aae5df82fa00b6718987a43ec168cc5affe095cca59d233f314", size = 4036148, upload-time = "2025-04-03T09:15:01.328Z" }, - { url = "https://files.pythonhosted.org/packages/c8/6a/8c0b7de3aeb5014a23f06c5e9d3c7852ebcf0d6b00fe660b93261e310e24/shapely-2.1.0-cp313-cp313t-win32.whl", hash = "sha256:a9580bda119b1f42f955aa8e52382d5c73f7957e0203bc0c0c60084846f3db94", size = 1535993, upload-time = "2025-04-03T09:15:02.973Z" }, - { url = "https://files.pythonhosted.org/packages/a8/91/ae80359a58409d52e4d62c7eacc7eb3ddee4b9135f1db884b6a43cf2e174/shapely-2.1.0-cp313-cp313t-win_amd64.whl", hash = "sha256:e8ff4e5cfd799ba5b6f37b5d5527dbd85b4a47c65b6d459a03d0962d2a9d4d10", size = 1717777, upload-time = "2025-04-03T09:15:04.461Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/ca/3c/2da625233f4e605155926566c0e7ea8dda361877f48e8b1655e53456f252/shapely-2.1.1.tar.gz", hash = "sha256:500621967f2ffe9642454808009044c21e5b35db89ce69f8a2042c2ffd0e2772", size = 315422, upload-time = "2025-05-19T11:04:41.265Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/82/fa/f18025c95b86116dd8f1ec58cab078bd59ab51456b448136ca27463be533/shapely-2.1.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d8ccc872a632acb7bdcb69e5e78df27213f7efd195882668ffba5405497337c6", size = 1825117, upload-time = "2025-05-19T11:03:43.547Z" }, + { url = "https://files.pythonhosted.org/packages/c7/65/46b519555ee9fb851234288be7c78be11e6260995281071d13abf2c313d0/shapely-2.1.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:f24f2ecda1e6c091da64bcbef8dd121380948074875bd1b247b3d17e99407099", size = 1628541, upload-time = "2025-05-19T11:03:45.162Z" }, + { url = "https://files.pythonhosted.org/packages/29/51/0b158a261df94e33505eadfe737db9531f346dfa60850945ad25fd4162f1/shapely-2.1.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:45112a5be0b745b49e50f8829ce490eb67fefb0cea8d4f8ac5764bfedaa83d2d", size = 2948453, upload-time = "2025-05-19T11:03:46.681Z" }, + { url = "https://files.pythonhosted.org/packages/a9/4f/6c9bb4bd7b1a14d7051641b9b479ad2a643d5cbc382bcf5bd52fd0896974/shapely-2.1.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8c10ce6f11904d65e9bbb3e41e774903c944e20b3f0b282559885302f52f224a", size = 3057029, upload-time = "2025-05-19T11:03:48.346Z" }, + { url = "https://files.pythonhosted.org/packages/89/0b/ad1b0af491d753a83ea93138eee12a4597f763ae12727968d05934fe7c78/shapely-2.1.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:61168010dfe4e45f956ffbbaf080c88afce199ea81eb1f0ac43230065df320bd", size = 3894342, upload-time = "2025-05-19T11:03:49.602Z" }, + { url = "https://files.pythonhosted.org/packages/7d/96/73232c5de0b9fdf0ec7ddfc95c43aaf928740e87d9f168bff0e928d78c6d/shapely-2.1.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:cacf067cdff741cd5c56a21c52f54ece4e4dad9d311130493a791997da4a886b", size = 4056766, upload-time = "2025-05-19T11:03:51.252Z" }, + { url = "https://files.pythonhosted.org/packages/43/cc/eec3c01f754f5b3e0c47574b198f9deb70465579ad0dad0e1cef2ce9e103/shapely-2.1.1-cp310-cp310-win32.whl", hash = "sha256:23b8772c3b815e7790fb2eab75a0b3951f435bc0fce7bb146cb064f17d35ab4f", size = 1523744, upload-time = "2025-05-19T11:03:52.624Z" }, + { url = "https://files.pythonhosted.org/packages/50/fc/a7187e6dadb10b91e66a9e715d28105cde6489e1017cce476876185a43da/shapely-2.1.1-cp310-cp310-win_amd64.whl", hash = "sha256:2c7b2b6143abf4fa77851cef8ef690e03feade9a0d48acd6dc41d9e0e78d7ca6", size = 1703061, upload-time = "2025-05-19T11:03:54.695Z" }, + { url = "https://files.pythonhosted.org/packages/19/97/2df985b1e03f90c503796ad5ecd3d9ed305123b64d4ccb54616b30295b29/shapely-2.1.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:587a1aa72bc858fab9b8c20427b5f6027b7cbc92743b8e2c73b9de55aa71c7a7", size = 1819368, upload-time = "2025-05-19T11:03:55.937Z" }, + { url = "https://files.pythonhosted.org/packages/56/17/504518860370f0a28908b18864f43d72f03581e2b6680540ca668f07aa42/shapely-2.1.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:9fa5c53b0791a4b998f9ad84aad456c988600757a96b0a05e14bba10cebaaaea", size = 1625362, upload-time = "2025-05-19T11:03:57.06Z" }, + { url = "https://files.pythonhosted.org/packages/36/a1/9677337d729b79fce1ef3296aac6b8ef4743419086f669e8a8070eff8f40/shapely-2.1.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aabecd038841ab5310d23495253f01c2a82a3aedae5ab9ca489be214aa458aa7", size = 2999005, upload-time = "2025-05-19T11:03:58.692Z" }, + { url = "https://files.pythonhosted.org/packages/a2/17/e09357274699c6e012bbb5a8ea14765a4d5860bb658df1931c9f90d53bd3/shapely-2.1.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:586f6aee1edec04e16227517a866df3e9a2e43c1f635efc32978bb3dc9c63753", size = 3108489, upload-time = "2025-05-19T11:04:00.059Z" }, + { url = "https://files.pythonhosted.org/packages/17/5d/93a6c37c4b4e9955ad40834f42b17260ca74ecf36df2e81bb14d12221b90/shapely-2.1.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:b9878b9e37ad26c72aada8de0c9cfe418d9e2ff36992a1693b7f65a075b28647", size = 3945727, upload-time = "2025-05-19T11:04:01.786Z" }, + { url = "https://files.pythonhosted.org/packages/a3/1a/ad696648f16fd82dd6bfcca0b3b8fbafa7aacc13431c7fc4c9b49e481681/shapely-2.1.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:d9a531c48f289ba355e37b134e98e28c557ff13965d4653a5228d0f42a09aed0", size = 4109311, upload-time = "2025-05-19T11:04:03.134Z" }, + { url = "https://files.pythonhosted.org/packages/d4/38/150dd245beab179ec0d4472bf6799bf18f21b1efbef59ac87de3377dbf1c/shapely-2.1.1-cp311-cp311-win32.whl", hash = "sha256:4866de2673a971820c75c0167b1f1cd8fb76f2d641101c23d3ca021ad0449bab", size = 1522982, upload-time = "2025-05-19T11:04:05.217Z" }, + { url = "https://files.pythonhosted.org/packages/93/5b/842022c00fbb051083c1c85430f3bb55565b7fd2d775f4f398c0ba8052ce/shapely-2.1.1-cp311-cp311-win_amd64.whl", hash = "sha256:20a9d79958b3d6c70d8a886b250047ea32ff40489d7abb47d01498c704557a93", size = 1703872, upload-time = "2025-05-19T11:04:06.791Z" }, + { url = "https://files.pythonhosted.org/packages/fb/64/9544dc07dfe80a2d489060791300827c941c451e2910f7364b19607ea352/shapely-2.1.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:2827365b58bf98efb60affc94a8e01c56dd1995a80aabe4b701465d86dcbba43", size = 1833021, upload-time = "2025-05-19T11:04:08.022Z" }, + { url = "https://files.pythonhosted.org/packages/07/aa/fb5f545e72e89b6a0f04a0effda144f5be956c9c312c7d4e00dfddbddbcf/shapely-2.1.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:a9c551f7fa7f1e917af2347fe983f21f212863f1d04f08eece01e9c275903fad", size = 1643018, upload-time = "2025-05-19T11:04:09.343Z" }, + { url = "https://files.pythonhosted.org/packages/03/46/61e03edba81de729f09d880ce7ae5c1af873a0814206bbfb4402ab5c3388/shapely-2.1.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:78dec4d4fbe7b1db8dc36de3031767e7ece5911fb7782bc9e95c5cdec58fb1e9", size = 2986417, upload-time = "2025-05-19T11:04:10.56Z" }, + { url = "https://files.pythonhosted.org/packages/1f/1e/83ec268ab8254a446b4178b45616ab5822d7b9d2b7eb6e27cf0b82f45601/shapely-2.1.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:872d3c0a7b8b37da0e23d80496ec5973c4692920b90de9f502b5beb994bbaaef", size = 3098224, upload-time = "2025-05-19T11:04:11.903Z" }, + { url = "https://files.pythonhosted.org/packages/f1/44/0c21e7717c243e067c9ef8fa9126de24239f8345a5bba9280f7bb9935959/shapely-2.1.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:2e2b9125ebfbc28ecf5353511de62f75a8515ae9470521c9a693e4bb9fbe0cf1", size = 3925982, upload-time = "2025-05-19T11:04:13.224Z" }, + { url = "https://files.pythonhosted.org/packages/15/50/d3b4e15fefc103a0eb13d83bad5f65cd6e07a5d8b2ae920e767932a247d1/shapely-2.1.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:4b96cea171b3d7f6786976a0520f178c42792897653ecca0c5422fb1e6946e6d", size = 4089122, upload-time = "2025-05-19T11:04:14.477Z" }, + { url = "https://files.pythonhosted.org/packages/bd/05/9a68f27fc6110baeedeeebc14fd86e73fa38738c5b741302408fb6355577/shapely-2.1.1-cp312-cp312-win32.whl", hash = "sha256:39dca52201e02996df02e447f729da97cfb6ff41a03cb50f5547f19d02905af8", size = 1522437, upload-time = "2025-05-19T11:04:16.203Z" }, + { url = "https://files.pythonhosted.org/packages/bc/e9/a4560e12b9338842a1f82c9016d2543eaa084fce30a1ca11991143086b57/shapely-2.1.1-cp312-cp312-win_amd64.whl", hash = "sha256:13d643256f81d55a50013eff6321142781cf777eb6a9e207c2c9e6315ba6044a", size = 1703479, upload-time = "2025-05-19T11:04:18.497Z" }, + { url = "https://files.pythonhosted.org/packages/71/8e/2bc836437f4b84d62efc1faddce0d4e023a5d990bbddd3c78b2004ebc246/shapely-2.1.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:3004a644d9e89e26c20286d5fdc10f41b1744c48ce910bd1867fdff963fe6c48", size = 1832107, upload-time = "2025-05-19T11:04:19.736Z" }, + { url = "https://files.pythonhosted.org/packages/12/a2/12c7cae5b62d5d851c2db836eadd0986f63918a91976495861f7c492f4a9/shapely-2.1.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:1415146fa12d80a47d13cfad5310b3c8b9c2aa8c14a0c845c9d3d75e77cb54f6", size = 1642355, upload-time = "2025-05-19T11:04:21.035Z" }, + { url = "https://files.pythonhosted.org/packages/5b/7e/6d28b43d53fea56de69c744e34c2b999ed4042f7a811dc1bceb876071c95/shapely-2.1.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:21fcab88b7520820ec16d09d6bea68652ca13993c84dffc6129dc3607c95594c", size = 2968871, upload-time = "2025-05-19T11:04:22.167Z" }, + { url = "https://files.pythonhosted.org/packages/dd/87/1017c31e52370b2b79e4d29e07cbb590ab9e5e58cf7e2bdfe363765d6251/shapely-2.1.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e5ce6a5cc52c974b291237a96c08c5592e50f066871704fb5b12be2639d9026a", size = 3080830, upload-time = "2025-05-19T11:04:23.997Z" }, + { url = "https://files.pythonhosted.org/packages/1d/fe/f4a03d81abd96a6ce31c49cd8aaba970eaaa98e191bd1e4d43041e57ae5a/shapely-2.1.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:04e4c12a45a1d70aeb266618d8cf81a2de9c4df511b63e105b90bfdfb52146de", size = 3908961, upload-time = "2025-05-19T11:04:25.702Z" }, + { url = "https://files.pythonhosted.org/packages/ef/59/7605289a95a6844056a2017ab36d9b0cb9d6a3c3b5317c1f968c193031c9/shapely-2.1.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6ca74d851ca5264aae16c2b47e96735579686cb69fa93c4078070a0ec845b8d8", size = 4079623, upload-time = "2025-05-19T11:04:27.171Z" }, + { url = "https://files.pythonhosted.org/packages/bc/4d/9fea036eff2ef4059d30247128b2d67aaa5f0b25e9fc27e1d15cc1b84704/shapely-2.1.1-cp313-cp313-win32.whl", hash = "sha256:fd9130501bf42ffb7e0695b9ea17a27ae8ce68d50b56b6941c7f9b3d3453bc52", size = 1521916, upload-time = "2025-05-19T11:04:28.405Z" }, + { url = "https://files.pythonhosted.org/packages/12/d9/6d13b8957a17c95794f0c4dfb65ecd0957e6c7131a56ce18d135c1107a52/shapely-2.1.1-cp313-cp313-win_amd64.whl", hash = "sha256:ab8d878687b438a2f4c138ed1a80941c6ab0029e0f4c785ecfe114413b498a97", size = 1702746, upload-time = "2025-05-19T11:04:29.643Z" }, + { url = "https://files.pythonhosted.org/packages/60/36/b1452e3e7f35f5f6454d96f3be6e2bb87082720ff6c9437ecc215fa79be0/shapely-2.1.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:0c062384316a47f776305ed2fa22182717508ffdeb4a56d0ff4087a77b2a0f6d", size = 1833482, upload-time = "2025-05-19T11:04:30.852Z" }, + { url = "https://files.pythonhosted.org/packages/ce/ca/8e6f59be0718893eb3e478141285796a923636dc8f086f83e5b0ec0036d0/shapely-2.1.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:4ecf6c196b896e8f1360cc219ed4eee1c1e5f5883e505d449f263bd053fb8c05", size = 1642256, upload-time = "2025-05-19T11:04:32.068Z" }, + { url = "https://files.pythonhosted.org/packages/ab/78/0053aea449bb1d4503999525fec6232f049abcdc8df60d290416110de943/shapely-2.1.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fb00070b4c4860f6743c600285109c273cca5241e970ad56bb87bef0be1ea3a0", size = 3016614, upload-time = "2025-05-19T11:04:33.7Z" }, + { url = "https://files.pythonhosted.org/packages/ee/53/36f1b1de1dfafd1b457dcbafa785b298ce1b8a3e7026b79619e708a245d5/shapely-2.1.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d14a9afa5fa980fbe7bf63706fdfb8ff588f638f145a1d9dbc18374b5b7de913", size = 3093542, upload-time = "2025-05-19T11:04:34.952Z" }, + { url = "https://files.pythonhosted.org/packages/b9/bf/0619f37ceec6b924d84427c88835b61f27f43560239936ff88915c37da19/shapely-2.1.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:b640e390dabde790e3fb947198b466e63223e0a9ccd787da5f07bcb14756c28d", size = 3945961, upload-time = "2025-05-19T11:04:36.32Z" }, + { url = "https://files.pythonhosted.org/packages/93/c9/20ca4afeb572763b07a7997f00854cb9499df6af85929e93012b189d8917/shapely-2.1.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:69e08bf9697c1b73ec6aa70437db922bafcea7baca131c90c26d59491a9760f9", size = 4089514, upload-time = "2025-05-19T11:04:37.683Z" }, + { url = "https://files.pythonhosted.org/packages/33/6a/27036a5a560b80012a544366bceafd491e8abb94a8db14047b5346b5a749/shapely-2.1.1-cp313-cp313t-win32.whl", hash = "sha256:ef2d09d5a964cc90c2c18b03566cf918a61c248596998a0301d5b632beadb9db", size = 1540607, upload-time = "2025-05-19T11:04:38.925Z" }, + { url = "https://files.pythonhosted.org/packages/ea/f1/5e9b3ba5c7aa7ebfaf269657e728067d16a7c99401c7973ddf5f0cf121bd/shapely-2.1.1-cp313-cp313t-win_amd64.whl", hash = "sha256:8cb8f17c377260452e9d7720eeaf59082c5f8ea48cf104524d953e5d36d4bdb7", size = 1723061, upload-time = "2025-05-19T11:04:40.082Z" }, ] [[package]] @@ -6037,14 +5967,14 @@ wheels = [ [[package]] name = "starlette" -version = "0.46.2" +version = "0.45.3" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "anyio", marker = "sys_platform == 'darwin' or sys_platform == 'linux' or sys_platform == 'win32'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/ce/20/08dfcd9c983f6a6f4a1000d934b9e6d626cff8d2eeb77a89a68eef20a2b7/starlette-0.46.2.tar.gz", hash = "sha256:7f7361f34eed179294600af672f565727419830b54b7b084efe44bb82d2fccd5", size = 2580846, upload-time = "2025-04-13T13:56:17.942Z" } +sdist = { url = "https://files.pythonhosted.org/packages/ff/fb/2984a686808b89a6781526129a4b51266f678b2d2b97ab2d325e56116df8/starlette-0.45.3.tar.gz", hash = "sha256:2cbcba2a75806f8a41c722141486f37c28e30a0921c5f6fe4346cb0dcee1302f", size = 2574076, upload-time = "2025-01-24T11:17:36.535Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/8b/0c/9d30a4ebeb6db2b25a841afbb80f6ef9a854fc3b41be131d249a977b4959/starlette-0.46.2-py3-none-any.whl", hash = "sha256:595633ce89f8ffa71a015caed34a5b2dc1c0cdb3f0f1fbd1e69339cf2abeec35", size = 72037, upload-time = "2025-04-13T13:56:16.21Z" }, + { url = "https://files.pythonhosted.org/packages/d9/61/f2b52e107b1fc8944b33ef56bf6ac4ebbe16d91b94d2b87ce013bf63fb84/starlette-0.45.3-py3-none-any.whl", hash = "sha256:dfb6d332576f136ec740296c7e8bb8c8a7125044e7c6da30744718880cdd059d", size = 71507, upload-time = "2025-01-24T11:17:34.182Z" }, ] [[package]] @@ -6251,21 +6181,21 @@ wheels = [ [[package]] name = "tornado" -version = "6.5" +version = "6.5.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/63/c4/bb3bd68b1b3cd30abc6411469875e6d32004397ccc4a3230479f86f86a73/tornado-6.5.tar.gz", hash = "sha256:c70c0a26d5b2d85440e4debd14a8d0b463a0cf35d92d3af05f5f1ffa8675c826", size = 508968, upload-time = "2025-05-15T20:37:43.098Z" } +sdist = { url = "https://files.pythonhosted.org/packages/51/89/c72771c81d25d53fe33e3dca61c233b665b2780f21820ba6fd2c6793c12b/tornado-6.5.1.tar.gz", hash = "sha256:84ceece391e8eb9b2b95578db65e920d2a61070260594819589609ba9bc6308c", size = 509934, upload-time = "2025-05-22T18:15:38.788Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/b0/7c/6526062801e4becb5a7511079c0b0f170a80d929d312042d5b5c4afad464/tornado-6.5-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:f81067dad2e4443b015368b24e802d0083fecada4f0a4572fdb72fc06e54a9a6", size = 441204, upload-time = "2025-05-15T20:37:22.107Z" }, - { url = "https://files.pythonhosted.org/packages/3f/ff/53d49f869a390ce68d4f98306b6f9ad5765c114ab27ef47d7c9bd05d1191/tornado-6.5-cp39-abi3-macosx_10_9_x86_64.whl", hash = "sha256:9ac1cbe1db860b3cbb251e795c701c41d343f06a96049d6274e7c77559117e41", size = 439373, upload-time = "2025-05-15T20:37:24.476Z" }, - { url = "https://files.pythonhosted.org/packages/4a/62/fdd9b12b95e4e2b7b8c21dfc306b0960b20b741e588318c13918cf52b868/tornado-6.5-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7c625b9d03f1fb4d64149c47d0135227f0434ebb803e2008040eb92906b0105a", size = 442935, upload-time = "2025-05-15T20:37:26.638Z" }, - { url = "https://files.pythonhosted.org/packages/46/00/0094bd1538cb8579f7a97330cb77f40c9b8042c71fb040e5daae439be1ae/tornado-6.5-cp39-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9a0d8d2309faf015903080fb5bdd969ecf9aa5ff893290845cf3fd5b2dd101bc", size = 442282, upload-time = "2025-05-15T20:37:28.436Z" }, - { url = "https://files.pythonhosted.org/packages/d8/fa/23bb108afb8197a55edd333fe26a3dad9341ce441337aad95cd06b025594/tornado-6.5-cp39-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:03576ab51e9b1677e4cdaae620d6700d9823568b7939277e4690fe4085886c55", size = 442515, upload-time = "2025-05-15T20:37:30.051Z" }, - { url = "https://files.pythonhosted.org/packages/dc/f2/c4d43d830578111b1826cf831fdbb8b2a10e3c4fccc4b774b69d818eb231/tornado-6.5-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:ab75fe43d0e1b3a5e3ceddb2a611cb40090dd116a84fc216a07a298d9e000471", size = 443192, upload-time = "2025-05-15T20:37:31.832Z" }, - { url = "https://files.pythonhosted.org/packages/92/c5/932cc6941f88336d70744b3fda420b9cb18684c034293a1c430a766b2ad9/tornado-6.5-cp39-abi3-musllinux_1_2_i686.whl", hash = "sha256:119c03f440a832128820e87add8a175d211b7f36e7ee161c631780877c28f4fb", size = 442615, upload-time = "2025-05-15T20:37:33.883Z" }, - { url = "https://files.pythonhosted.org/packages/70/90/e831b7800ec9632d5eb6a0931b016b823efa963356cb1c215f035b6d5d2e/tornado-6.5-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:231f2193bb4c28db2bdee9e57bc6ca0cd491f345cd307c57d79613b058e807e0", size = 442592, upload-time = "2025-05-15T20:37:35.507Z" }, - { url = "https://files.pythonhosted.org/packages/71/ed/fe27371e79930559e9a90324727267ad5cf9479a2c897ff75ace1d3bec3d/tornado-6.5-cp39-abi3-win32.whl", hash = "sha256:fd20c816e31be1bbff1f7681f970bbbd0bb241c364220140228ba24242bcdc59", size = 443674, upload-time = "2025-05-15T20:37:37.617Z" }, - { url = "https://files.pythonhosted.org/packages/78/77/85fb3a93ef109f6de9a60acc6302f9761a3e7150a6c1b40e8a4a215db5fc/tornado-6.5-cp39-abi3-win_amd64.whl", hash = "sha256:007f036f7b661e899bd9ef3fa5f87eb2cb4d1b2e7d67368e778e140a2f101a7a", size = 444118, upload-time = "2025-05-15T20:37:39.174Z" }, - { url = "https://files.pythonhosted.org/packages/54/9a/3cc3969c733ddd4f5992b3d4ec15c9a2564192c7b1a239ba21c8f73f8af4/tornado-6.5-cp39-abi3-win_arm64.whl", hash = "sha256:542e380658dcec911215c4820654662810c06ad872eefe10def6a5e9b20e9633", size = 442874, upload-time = "2025-05-15T20:37:41.267Z" }, + { url = "https://files.pythonhosted.org/packages/77/89/f4532dee6843c9e0ebc4e28d4be04c67f54f60813e4bf73d595fe7567452/tornado-6.5.1-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:d50065ba7fd11d3bd41bcad0825227cc9a95154bad83239357094c36708001f7", size = 441948, upload-time = "2025-05-22T18:15:20.862Z" }, + { url = "https://files.pythonhosted.org/packages/15/9a/557406b62cffa395d18772e0cdcf03bed2fff03b374677348eef9f6a3792/tornado-6.5.1-cp39-abi3-macosx_10_9_x86_64.whl", hash = "sha256:9e9ca370f717997cb85606d074b0e5b247282cf5e2e1611568b8821afe0342d6", size = 440112, upload-time = "2025-05-22T18:15:22.591Z" }, + { url = "https://files.pythonhosted.org/packages/55/82/7721b7319013a3cf881f4dffa4f60ceff07b31b394e459984e7a36dc99ec/tornado-6.5.1-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b77e9dfa7ed69754a54c89d82ef746398be82f749df69c4d3abe75c4d1ff4888", size = 443672, upload-time = "2025-05-22T18:15:24.027Z" }, + { url = "https://files.pythonhosted.org/packages/7d/42/d11c4376e7d101171b94e03cef0cbce43e823ed6567ceda571f54cf6e3ce/tornado-6.5.1-cp39-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:253b76040ee3bab8bcf7ba9feb136436a3787208717a1fb9f2c16b744fba7331", size = 443019, upload-time = "2025-05-22T18:15:25.735Z" }, + { url = "https://files.pythonhosted.org/packages/7d/f7/0c48ba992d875521ac761e6e04b0a1750f8150ae42ea26df1852d6a98942/tornado-6.5.1-cp39-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:308473f4cc5a76227157cdf904de33ac268af770b2c5f05ca6c1161d82fdd95e", size = 443252, upload-time = "2025-05-22T18:15:27.499Z" }, + { url = "https://files.pythonhosted.org/packages/89/46/d8d7413d11987e316df4ad42e16023cd62666a3c0dfa1518ffa30b8df06c/tornado-6.5.1-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:caec6314ce8a81cf69bd89909f4b633b9f523834dc1a352021775d45e51d9401", size = 443930, upload-time = "2025-05-22T18:15:29.299Z" }, + { url = "https://files.pythonhosted.org/packages/78/b2/f8049221c96a06df89bed68260e8ca94beca5ea532ffc63b1175ad31f9cc/tornado-6.5.1-cp39-abi3-musllinux_1_2_i686.whl", hash = "sha256:13ce6e3396c24e2808774741331638ee6c2f50b114b97a55c5b442df65fd9692", size = 443351, upload-time = "2025-05-22T18:15:31.038Z" }, + { url = "https://files.pythonhosted.org/packages/76/ff/6a0079e65b326cc222a54720a748e04a4db246870c4da54ece4577bfa702/tornado-6.5.1-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:5cae6145f4cdf5ab24744526cc0f55a17d76f02c98f4cff9daa08ae9a217448a", size = 443328, upload-time = "2025-05-22T18:15:32.426Z" }, + { url = "https://files.pythonhosted.org/packages/49/18/e3f902a1d21f14035b5bc6246a8c0f51e0eef562ace3a2cea403c1fb7021/tornado-6.5.1-cp39-abi3-win32.whl", hash = "sha256:e0a36e1bc684dca10b1aa75a31df8bdfed656831489bc1e6a6ebed05dc1ec365", size = 444396, upload-time = "2025-05-22T18:15:34.205Z" }, + { url = "https://files.pythonhosted.org/packages/7b/09/6526e32bf1049ee7de3bebba81572673b19a2a8541f795d887e92af1a8bc/tornado-6.5.1-cp39-abi3-win_amd64.whl", hash = "sha256:908e7d64567cecd4c2b458075589a775063453aeb1d2a1853eedb806922f568b", size = 444840, upload-time = "2025-05-22T18:15:36.1Z" }, + { url = "https://files.pythonhosted.org/packages/55/a7/535c44c7bea4578e48281d83c615219f3ab19e6abc67625ef637c73987be/tornado-6.5.1-cp39-abi3-win_arm64.whl", hash = "sha256:02420a0eb7bf617257b9935e2b754d1b63897525d8a289c9d65690d580b4dcf7", size = 443596, upload-time = "2025-05-22T18:15:37.433Z" }, ] [[package]] @@ -6348,14 +6278,14 @@ wheels = [ [[package]] name = "types-cffi" -version = "1.17.0.20250516" +version = "1.17.0.20250523" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "types-setuptools", marker = "sys_platform == 'darwin' or sys_platform == 'linux' or sys_platform == 'win32'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/84/ca/1132e4250dfd60df63f5855f143dc3fd48dc63bb38a035e70c33cdea7a3b/types_cffi-1.17.0.20250516.tar.gz", hash = "sha256:f63c42ab07fd71f4ed218e2dea64f8714e71c585db5c6bdef9ea8f57cf99979b", size = 16806, upload-time = "2025-05-16T03:09:23.495Z" } +sdist = { url = "https://files.pythonhosted.org/packages/f7/5f/ac80a2f55757019e5d4809d17544569c47a623565258ca1a836ba951d53f/types_cffi-1.17.0.20250523.tar.gz", hash = "sha256:e7110f314c65590533adae1b30763be08ca71ad856a1ae3fe9b9d8664d49ec22", size = 16858, upload-time = "2025-05-23T03:05:40.983Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/d4/f0/3832bffac445c7e6668cd2c3e81dc6291cdff7438ffb6fc435550bcfa0e8/types_cffi-1.17.0.20250516-py3-none-any.whl", hash = "sha256:b5a7b61fa60114072900a1f25094d0ea3d4f398d060128583ef644bb686d027d", size = 20005, upload-time = "2025-05-16T03:09:22.631Z" }, + { url = "https://files.pythonhosted.org/packages/f1/86/e26e6ae4dfcbf6031b8422c22cf3a9eb2b6d127770406e7645b6248d8091/types_cffi-1.17.0.20250523-py3-none-any.whl", hash = "sha256:e98c549d8e191f6220e440f9f14315d6775a21a0e588c32c20476be885b2fad9", size = 20010, upload-time = "2025-05-23T03:05:39.136Z" }, ] [[package]] @@ -6395,11 +6325,11 @@ wheels = [ [[package]] name = "types-setuptools" -version = "80.7.0.20250516" +version = "80.8.0.20250521" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/38/b1/a52ff157d80464beabb2f0e86881eca28fbc2d519f67ad2f274ef2fe9724/types_setuptools-80.7.0.20250516.tar.gz", hash = "sha256:57274b58e05434de42088a86074c9e630e5786f759cf9cc1e3015e886297ca21", size = 41313, upload-time = "2025-05-16T03:08:01.658Z" } +sdist = { url = "https://files.pythonhosted.org/packages/e6/2e/947172e12515ff815979b78377b47c3c434df7097e02241f4c80b960d1a4/types_setuptools-80.8.0.20250521.tar.gz", hash = "sha256:7360b33b1ed3cda6e5a1f379701a61ec9dbee6e59e8bda072b88226157d8da80", size = 41323, upload-time = "2025-05-21T03:06:04.636Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/cf/64/179b136306127e755906d540558f1042ebae2e40744c0283a6e2b862a2a4/types_setuptools-80.7.0.20250516-py3-none-any.whl", hash = "sha256:c1da6c11698139c8307c6df5987592df940e956912c204e42d844ba821dd2741", size = 63262, upload-time = "2025-05-16T03:08:00.537Z" }, + { url = "https://files.pythonhosted.org/packages/63/90/2f8173ea068e673a2cffeac9c96de37da6c5a5e1deaa4289834e882236f3/types_setuptools-80.8.0.20250521-py3-none-any.whl", hash = "sha256:737cd1f54aade1f68fece1381871ea563b622b3ff28393ad65a9d4ed30d6454e", size = 63261, upload-time = "2025-05-21T03:06:03.025Z" }, ] [[package]] @@ -6413,14 +6343,14 @@ wheels = [ [[package]] name = "typing-inspection" -version = "0.4.0" +version = "0.4.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "typing-extensions", marker = "sys_platform == 'darwin' or sys_platform == 'linux' or sys_platform == 'win32'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/82/5c/e6082df02e215b846b4b8c0b887a64d7d08ffaba30605502639d44c06b82/typing_inspection-0.4.0.tar.gz", hash = "sha256:9765c87de36671694a67904bf2c96e395be9c6439bb6c87b5142569dcdd65122", size = 76222, upload-time = "2025-02-25T17:27:59.638Z" } +sdist = { url = "https://files.pythonhosted.org/packages/f8/b1/0c11f5058406b3af7609f121aaa6b609744687f1d158b3c3a5bf4cc94238/typing_inspection-0.4.1.tar.gz", hash = "sha256:6ae134cc0203c33377d43188d4064e9b357dba58cff3185f22924610e70a9d28", size = 75726, upload-time = "2025-05-21T18:55:23.885Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/31/08/aa4fdfb71f7de5176385bd9e90852eaf6b5d622735020ad600f2bab54385/typing_inspection-0.4.0-py3-none-any.whl", hash = "sha256:50e72559fcd2a6367a19f7a7e610e6afcb9fac940c650290eed893d61386832f", size = 14125, upload-time = "2025-02-25T17:27:57.754Z" }, + { url = "https://files.pythonhosted.org/packages/17/69/cd203477f944c353c31bade965f880aa1061fd6bf05ded0726ca845b6ff7/typing_inspection-0.4.1-py3-none-any.whl", hash = "sha256:389055682238f53b04f7badcb49b989835495a96700ced5dab2d8feae4b26f51", size = 14552, upload-time = "2025-05-21T18:55:22.152Z" }, ] [[package]] @@ -6708,7 +6638,7 @@ wheels = [ [[package]] name = "weaviate-client" -version = "4.14.3" +version = "4.14.4" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "authlib", marker = "sys_platform == 'darwin' or sys_platform == 'linux' or sys_platform == 'win32'" }, @@ -6721,9 +6651,9 @@ dependencies = [ { name = "pydantic", marker = "sys_platform == 'darwin' or sys_platform == 'linux' or sys_platform == 'win32'" }, { name = "validators", marker = "sys_platform == 'darwin' or sys_platform == 'linux' or sys_platform == 'win32'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/ce/e5/cfb31bcfa3c8010785ee93b5d81fd1235bd085bfc9d73bd2f598e68f0fe9/weaviate_client-4.14.3.tar.gz", hash = "sha256:b21f8d0335eaf25aab3867eba0f621c8a89b8dfdadd27d11e2cb1f5a257c5f4c", size = 663320, upload-time = "2025-05-12T10:28:18.81Z" } +sdist = { url = "https://files.pythonhosted.org/packages/2d/c3/ce01b557855a79877d4aa36173fb94cdde1df8aa2a8458180d5e9762159a/weaviate_client-4.14.4.tar.gz", hash = "sha256:d149f11793d33e45a8e77d33cfbb92227a87509d2e1a6a51a617220bb22a6d0a", size = 664038, upload-time = "2025-05-19T15:36:28.817Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/2d/a2/bf731769116e998e0becc5289179bb65fb0d1596cf5cf649fd6f0360e90e/weaviate_client-4.14.3-py3-none-any.whl", hash = "sha256:7e395fd759859e3ec39e29183a62a99150a9c4b25a0ceb3f5a9a66741da1c7e8", size = 436652, upload-time = "2025-05-12T10:28:17.115Z" }, + { url = "https://files.pythonhosted.org/packages/98/19/def7550b7134d63b31b4426e4943caead74faf8cac34f788dae57a6f9f45/weaviate_client-4.14.4-py3-none-any.whl", hash = "sha256:73151ef3c6a05c976c30485e34d549d1936ed82d5036f8b1d7c95f5c5ace15d5", size = 437012, upload-time = "2025-05-19T15:36:26.917Z" }, ] [[package]] From d890e7d30207871cc432ac65c90408f86c7c223e Mon Sep 17 00:00:00 2001 From: Evan Mattson Date: Mon, 26 May 2025 11:34:24 +0900 Subject: [PATCH 18/18] Fix typing for new openai pkg --- .../agents/open_ai/responses_agent_thread_actions.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/python/semantic_kernel/agents/open_ai/responses_agent_thread_actions.py b/python/semantic_kernel/agents/open_ai/responses_agent_thread_actions.py index 2aea939f6026..9e40c2f68ec3 100644 --- a/python/semantic_kernel/agents/open_ai/responses_agent_thread_actions.py +++ b/python/semantic_kernel/agents/open_ai/responses_agent_thread_actions.py @@ -789,7 +789,7 @@ def _create_response_message_content_for_response_item( name=name, role=AuthorRole(role_str), items=items, - status=Status(response.status), + status=Status(response.status) if hasattr(response, "status") else None, ) @classmethod @@ -812,7 +812,7 @@ def _create_output_item_done( metadata=metadata, role=AuthorRole(role_str), items=items, - status=Status(response.status), + status=Status(response.status) if hasattr(response, "status") else None, ) @classmethod