diff --git a/python/packages/main/agent_framework/_agents.py b/python/packages/main/agent_framework/_agents.py index e3ad98e0b9..7b22ba0c64 100644 --- a/python/packages/main/agent_framework/_agents.py +++ b/python/packages/main/agent_framework/_agents.py @@ -203,11 +203,9 @@ class ChatClientAgent(AgentBase): temperature: float | None = None, tool_choice: ChatToolMode | Literal["auto", "required", "none"] | dict[str, Any] | None = "auto", tools: AITool - | list[AITool] | Callable[..., Any] - | list[Callable[..., Any]] | MutableMapping[str, Any] - | list[MutableMapping[str, Any]] + | list[AITool | Callable[..., Any] | MutableMapping[str, Any]] | None = None, top_p: float | None = None, user: str | None = None, @@ -386,7 +384,7 @@ class ChatClientAgent(AgentBase): agent_name = self._get_agent_name() # Resolve final tool list (runtime provided tools + local MCP server tools) - final_tools: list[AITool | dict[str, Any] | Callable[..., Any]] = [] + final_tools: list[AITool | Callable[..., Any] | dict[str, Any]] = [] # Normalize tools argument to a list without mutating the original parameter normalized_tools = [] if tools is None else tools if isinstance(tools, list) else [tools] for tool in normalized_tools: @@ -462,11 +460,9 @@ class ChatClientAgent(AgentBase): temperature: float | None = None, tool_choice: ChatToolMode | Literal["auto", "required", "none"] | dict[str, Any] | None = None, tools: AITool - | list[AITool] | Callable[..., Any] - | list[Callable[..., Any]] | MutableMapping[str, Any] - | list[MutableMapping[str, Any]] + | list[AITool | Callable[..., Any] | MutableMapping[str, Any]] | None = None, top_p: float | None = None, user: str | None = None, diff --git a/python/packages/main/agent_framework/_clients.py b/python/packages/main/agent_framework/_clients.py index 7fb24afc47..3fbd66fccb 100644 --- a/python/packages/main/agent_framework/_clients.py +++ b/python/packages/main/agent_framework/_clients.py @@ -271,11 +271,9 @@ class ChatClient(Protocol): temperature: float | None = None, tool_choice: ChatToolMode | Literal["auto", "required", "none"] | dict[str, Any] | None = "auto", tools: AITool - | list[AITool] | Callable[..., Any] - | list[Callable[..., Any]] | MutableMapping[str, Any] - | list[MutableMapping[str, Any]] + | list[AITool | Callable[..., Any] | MutableMapping[str, Any]] | None = None, top_p: float | None = None, user: str | None = None, @@ -330,11 +328,9 @@ class ChatClient(Protocol): temperature: float | None = None, tool_choice: ChatToolMode | Literal["auto", "required", "none"] | dict[str, Any] | None = "auto", tools: AITool - | list[AITool] | Callable[..., Any] - | list[Callable[..., Any]] | MutableMapping[str, Any] - | list[MutableMapping[str, Any]] + | list[AITool | Callable[..., Any] | MutableMapping[str, Any]] | None = None, top_p: float | None = None, user: str | None = None, @@ -462,11 +458,9 @@ class ChatClientBase(AFBaseModel, ABC): temperature: float | None = None, tool_choice: ChatToolMode | Literal["auto", "required", "none"] | dict[str, Any] | None = "auto", tools: AITool - | list[AITool] | Callable[..., Any] - | list[Callable[..., Any]] | MutableMapping[str, Any] - | list[MutableMapping[str, Any]] + | list[AITool | Callable[..., Any] | MutableMapping[str, Any]] | None = None, top_p: float | None = None, user: str | None = None, @@ -544,11 +538,9 @@ class ChatClientBase(AFBaseModel, ABC): temperature: float | None = None, tool_choice: ChatToolMode | Literal["auto", "required", "none"] | dict[str, Any] | None = "auto", tools: AITool - | list[AITool] | Callable[..., Any] - | list[Callable[..., Any]] | MutableMapping[str, Any] - | list[MutableMapping[str, Any]] + | list[AITool | Callable[..., Any] | MutableMapping[str, Any]] | None = None, top_p: float | None = None, user: str | None = None, @@ -642,11 +634,9 @@ class ChatClientBase(AFBaseModel, ABC): name: str | None = None, instructions: str | None = None, tools: AITool - | list[AITool] | Callable[..., Any] - | list[Callable[..., Any]] | MutableMapping[str, Any] - | list[MutableMapping[str, Any]] + | list[AITool | Callable[..., Any] | MutableMapping[str, Any]] | None = None, chat_message_store_factory: Callable[[], ChatMessageStore] | None = None, **kwargs: Any, diff --git a/python/packages/main/agent_framework/_types.py b/python/packages/main/agent_framework/_types.py index 4b19347450..73d18789f1 100644 --- a/python/packages/main/agent_framework/_types.py +++ b/python/packages/main/agent_framework/_types.py @@ -1719,11 +1719,9 @@ class ChatOptions(AFBaseModel): cls, tools: ( AITool - | list[AITool] | Callable[..., Any] - | list[Callable[..., Any]] | MutableMapping[str, Any] - | list[MutableMapping[str, Any]] + | list[AITool | Callable[..., Any] | MutableMapping[str, Any]] | None ), ) -> list[AITool | MutableMapping[str, Any]] | None: diff --git a/python/packages/main/agent_framework/openai/_chat_client.py b/python/packages/main/agent_framework/openai/_chat_client.py index 035c32ef09..fc39863028 100644 --- a/python/packages/main/agent_framework/openai/_chat_client.py +++ b/python/packages/main/agent_framework/openai/_chat_client.py @@ -15,11 +15,9 @@ from openai.types.chat.chat_completion_chunk import Choice as ChunkChoice from openai.types.chat.chat_completion_message_custom_tool_call import ChatCompletionMessageCustomToolCall from pydantic import BaseModel, SecretStr, ValidationError -from agent_framework import AIFunction, AITool, UsageContent - from .._clients import ChatClientBase, use_tool_calling from .._logging import get_logger -from .._tools import HostedWebSearchTool +from .._tools import AIFunction, AITool, HostedWebSearchTool from .._types import ( AIContents, ChatFinishReason, @@ -31,6 +29,7 @@ from .._types import ( FunctionCallContent, FunctionResultContent, TextContent, + UsageContent, UsageDetails, ) from ..exceptions import ( diff --git a/python/packages/main/agent_framework/openai/_responses_client.py b/python/packages/main/agent_framework/openai/_responses_client.py index beac279905..e7125e5803 100644 --- a/python/packages/main/agent_framework/openai/_responses_client.py +++ b/python/packages/main/agent_framework/openai/_responses_client.py @@ -31,8 +31,6 @@ from openai.types.responses.web_search_tool_param import UserLocation as WebSear from openai.types.responses.web_search_tool_param import WebSearchToolParam from pydantic import BaseModel, SecretStr, ValidationError -from agent_framework import DataContent, TextReasoningContent, UriContent, UsageContent - from .._clients import ChatClientBase, use_tool_calling from .._logging import get_logger from .._tools import AIFunction, AITool, HostedCodeInterpreterTool, HostedFileSearchTool, HostedWebSearchTool @@ -44,12 +42,16 @@ from .._types import ( ChatResponseUpdate, ChatRole, CitationAnnotation, + DataContent, FunctionCallContent, FunctionResultContent, HostedFileContent, HostedVectorStoreContent, TextContent, + TextReasoningContent, TextSpanRegion, + UriContent, + UsageContent, UsageDetails, ) from ..exceptions import ( @@ -109,11 +111,9 @@ class OpenAIResponsesClientBase(OpenAIHandler, ChatClientBase): temperature: float | None = None, tool_choice: "ChatToolMode" | Literal["auto", "required", "none"] | dict[str, Any] | None = "auto", tools: AITool - | list[AITool] | Callable[..., Any] - | list[Callable[..., Any]] | MutableMapping[str, Any] - | list[MutableMapping[str, Any]] + | list[AITool | Callable[..., Any] | MutableMapping[str, Any]] | None = None, top_p: float | None = None, user: str | None = None, @@ -201,11 +201,9 @@ class OpenAIResponsesClientBase(OpenAIHandler, ChatClientBase): temperature: float | None = None, tool_choice: "ChatToolMode" | Literal["auto", "required", "none"] | dict[str, Any] | None = "auto", tools: AITool - | list[AITool] | Callable[..., Any] - | list[Callable[..., Any]] | MutableMapping[str, Any] - | list[MutableMapping[str, Any]] + | list[AITool | Callable[..., Any] | MutableMapping[str, Any]] | None = None, top_p: float | None = None, user: str | None = None, diff --git a/python/uv.lock b/python/uv.lock index 3234242cb9..1f995f10f7 100644 --- a/python/uv.lock +++ b/python/uv.lock @@ -1,5 +1,5 @@ version = 1 -revision = 2 +revision = 3 requires-python = ">=3.10" resolution-markers = [ "python_full_version >= '3.11' and sys_platform == 'darwin'", @@ -58,6 +58,9 @@ azure = [ foundry = [ { name = "agent-framework-foundry", marker = "sys_platform == 'darwin' or sys_platform == 'linux' or sys_platform == 'win32'" }, ] +runtime = [ + { name = "agent-framework-runtime", marker = "sys_platform == 'darwin' or sys_platform == 'linux' or sys_platform == 'win32'" }, +] workflow = [ { name = "agent-framework-workflow", marker = "sys_platform == 'darwin' or sys_platform == 'linux' or sys_platform == 'win32'" }, ] @@ -66,6 +69,7 @@ workflow = [ requires-dist = [ { name = "agent-framework-azure", marker = "extra == 'azure'", editable = "packages/azure" }, { name = "agent-framework-foundry", marker = "extra == 'foundry'", editable = "packages/foundry" }, + { name = "agent-framework-runtime", marker = "extra == 'runtime'", editable = "packages/runtime" }, { name = "agent-framework-workflow", marker = "extra == 'workflow'", editable = "packages/workflow" }, { name = "mcp", specifier = ">=1.12" }, { name = "openai", specifier = ">=1.103.0" }, @@ -75,7 +79,7 @@ requires-dist = [ { name = "pydantic-settings", specifier = ">=2.10.1" }, { name = "typing-extensions", specifier = ">=4.14.0" }, ] -provides-extras = ["azure", "foundry", "workflow"] +provides-extras = ["azure", "foundry", "workflow", "runtime"] [[package]] name = "agent-framework-azure" @@ -2624,7 +2628,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/b5/89/06600980aefcc535c758414da969f37a5194ea4cdb73b745223f6af3acfb/pyzmq-27.0.2-cp312-abi3-win_amd64.whl", hash = "sha256:734be4f44efba0aa69bf5f015ed13eb69ff29bf0d17ea1e21588b095a3147b8e", size = 619281, upload-time = "2025-08-21T04:21:39.909Z" }, { url = "https://files.pythonhosted.org/packages/30/84/df8a5c089552d17c9941d1aea4314b606edf1b1622361dae89aacedc6467/pyzmq-27.0.2-cp312-abi3-win_arm64.whl", hash = "sha256:41f0bd56d9279392810950feb2785a419c2920bbf007fdaaa7f4a07332ae492d", size = 552680, upload-time = "2025-08-21T04:21:41.571Z" }, { url = "https://files.pythonhosted.org/packages/b4/7b/b79e976508517ab80dc800f7021ef1fb602a6d55e4caa2d47fb3dca5d8b6/pyzmq-27.0.2-cp313-cp313-android_24_arm64_v8a.whl", hash = "sha256:7f01118133427cd7f34ee133b5098e2af5f70303fa7519785c007bca5aa6f96a", size = 1122259, upload-time = "2025-08-21T04:21:43.063Z" }, - { url = "https://files.pythonhosted.org/packages/2b/1c/777217b9940ebcb7e71c924184ca5f31e410580a58d9fd93798589f0d31c/pyzmq-27.0.2-cp313-cp313-android_24_x86_64.whl", hash = "sha256:e4b860edf6379a7234ccbb19b4ed2c57e3ff569c3414fadfb49ae72b61a8ef07", size = 1156113, upload-time = "2025-08-21T04:21:44.566Z" }, { url = "https://files.pythonhosted.org/packages/59/7d/654657a4c6435f41538182e71b61eac386a789a2bbb6f30171915253a9a7/pyzmq-27.0.2-cp313-cp313t-macosx_10_15_universal2.whl", hash = "sha256:cb77923ea163156da14295c941930bd525df0d29c96c1ec2fe3c3806b1e17cb3", size = 1341437, upload-time = "2025-08-21T04:21:46.019Z" }, { url = "https://files.pythonhosted.org/packages/20/a0/5ed7710037f9c096017adc748bcb1698674a2d297f8b9422d38816f7b56a/pyzmq-27.0.2-cp313-cp313t-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:61678b7407b04df8f9423f188156355dc94d0fb52d360ae79d02ed7e0d431eea", size = 897888, upload-time = "2025-08-21T04:21:47.362Z" }, { url = "https://files.pythonhosted.org/packages/2c/8a/6e4699a60931c17e7406641d201d7f2c121e2a38979bc83226a6d8f1ba32/pyzmq-27.0.2-cp313-cp313t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e3c824b70925963bdc8e39a642672c15ffaa67e7d4b491f64662dd56d6271263", size = 660727, upload-time = "2025-08-21T04:21:48.734Z" },