diff --git a/python/packages/bedrock/agent_framework_bedrock/_chat_client.py b/python/packages/bedrock/agent_framework_bedrock/_chat_client.py index cb8545f9a3..2fd7887721 100644 --- a/python/packages/bedrock/agent_framework_bedrock/_chat_client.py +++ b/python/packages/bedrock/agent_framework_bedrock/_chat_client.py @@ -795,10 +795,7 @@ def _prepare_output_config(self, response_format: Any | None) -> dict[str, Any] schema = copy.deepcopy(schema_src) else: if not isinstance(response_format, type) or not issubclass(response_format, BaseModel): - raise TypeError( - "response_format must be None, a dict JSON schema, " - "or a Pydantic BaseModel subclass." - ) + raise TypeError("response_format must be None, a dict JSON schema, or a Pydantic BaseModel subclass.") # response_format is a Pydantic model class schema = response_format.model_json_schema() name = response_format.__name__ @@ -817,9 +814,7 @@ def _prepare_output_config(self, response_format: Any | None) -> dict[str, Any] return { "textFormat": { "type": "json_schema", - "structure": { - "jsonSchema": json_schema - }, + "structure": {"jsonSchema": json_schema}, } } @@ -840,9 +835,7 @@ def walk(node: Any) -> None: if node_id in visited: return visited.add(node_id) - if node.get("type") == "object" or ( - "properties" in node and "type" not in node - ): + if node.get("type") == "object" or ("properties" in node and "type" not in node): existing = node.get("additionalProperties") if existing is None or existing is True: node["additionalProperties"] = False diff --git a/python/packages/bedrock/tests/test_bedrock_structured_output.py b/python/packages/bedrock/tests/test_bedrock_structured_output.py index 8df04b5e75..7b39f67d69 100644 --- a/python/packages/bedrock/tests/test_bedrock_structured_output.py +++ b/python/packages/bedrock/tests/test_bedrock_structured_output.py @@ -238,6 +238,7 @@ async def test_chat_response_value_populated_streaming() -> None: async def test_unsupported_model_validation_exception() -> None: """When a model doesn't support outputConfig, a clear error should be raised.""" + class _FailingStubBedrockRuntime: def converse(self, **kwargs: Any) -> dict[str, Any]: # Simulate botocore ClientError for ValidationException diff --git a/python/packages/foundry/agent_framework_foundry/_agent.py b/python/packages/foundry/agent_framework_foundry/_agent.py index 1e1157d05a..01005ca79c 100644 --- a/python/packages/foundry/agent_framework_foundry/_agent.py +++ b/python/packages/foundry/agent_framework_foundry/_agent.py @@ -191,6 +191,7 @@ def __init__( compaction_strategy: CompactionStrategy | None = None, tokenizer: TokenizerProtocol | None = None, additional_properties: dict[str, Any] | None = None, + timeout: float | None = None, ) -> None: """Initialize a raw Foundry Agent client. @@ -211,6 +212,8 @@ def __init__( compaction_strategy: Optional per-client compaction override. tokenizer: Optional tokenizer for compaction strategies. additional_properties: Additional properties stored on the client instance. + timeout: HTTP timeout in seconds for requests. When not provided, the + OpenAI SDK default is used (connect: 5s, total: 600s). """ settings = load_settings( FoundryAgentSettings, @@ -260,8 +263,11 @@ def __init__( openai_client_kwargs["default_headers"] = dict(default_headers) if allow_preview: openai_client_kwargs["agent_name"] = self.agent_name + openai_client = self.project_client.get_openai_client(**openai_client_kwargs) + if timeout is not None: + openai_client = openai_client.with_options(timeout=timeout) super().__init__( - async_client=self.project_client.get_openai_client(**openai_client_kwargs), + async_client=openai_client, default_headers=default_headers, instruction_role=instruction_role, compaction_strategy=compaction_strategy, @@ -537,6 +543,7 @@ def __init__( additional_properties: dict[str, Any] | None = None, middleware: (Sequence[ChatAndFunctionMiddlewareTypes] | None) = None, function_invocation_configuration: FunctionInvocationConfiguration | None = None, + timeout: float | None = None, ) -> None: """Initialize a Foundry Agent client with full middleware support. @@ -556,6 +563,8 @@ def __init__( additional_properties: Additional properties stored on the client instance. middleware: Optional sequence of middleware. function_invocation_configuration: Optional function invocation configuration. + timeout: HTTP timeout in seconds for requests. When not provided, the + OpenAI SDK default is used (connect: 5s, total: 600s). """ super().__init__( project_endpoint=project_endpoint, @@ -573,6 +582,7 @@ def __init__( additional_properties=additional_properties, middleware=middleware, function_invocation_configuration=function_invocation_configuration, + timeout=timeout, ) @@ -625,6 +635,7 @@ def __init__( compaction_strategy: CompactionStrategy | None = None, tokenizer: TokenizerProtocol | None = None, additional_properties: Mapping[str, Any] | None = None, + timeout: float | None = None, ) -> None: """Initialize a Foundry Agent. @@ -657,6 +668,8 @@ def __init__( compaction_strategy: Optional agent-level in-run compaction override. tokenizer: Optional agent-level tokenizer override. additional_properties: Additional properties stored on the local agent wrapper. + timeout: HTTP timeout in seconds for requests. When not provided, the + OpenAI SDK default is used (connect: 5s, total: 600s). """ # Create the client actual_client_type = client_type or _FoundryAgentChatClient @@ -675,6 +688,7 @@ def __init__( "default_headers": default_headers, "env_file_path": env_file_path, "env_file_encoding": env_file_encoding, + "timeout": timeout, } if function_invocation_configuration is not None: if not issubclass(actual_client_type, FunctionInvocationLayer): @@ -912,6 +926,7 @@ def __init__( compaction_strategy: CompactionStrategy | None = None, tokenizer: TokenizerProtocol | None = None, additional_properties: Mapping[str, Any] | None = None, + timeout: float | None = None, ) -> None: """Initialize a Foundry Agent with full middleware and telemetry. @@ -958,6 +973,8 @@ def __init__( compaction_strategy: Optional agent-level in-run compaction override. tokenizer: Optional agent-level tokenizer override. additional_properties: Additional properties stored on the local agent wrapper. + timeout: HTTP timeout in seconds for requests. When not provided, the + OpenAI SDK default is used (connect: 5s, total: 600s). """ super().__init__( project_endpoint=project_endpoint, @@ -983,4 +1000,5 @@ def __init__( compaction_strategy=compaction_strategy, tokenizer=tokenizer, additional_properties=additional_properties, + timeout=timeout, ) diff --git a/python/packages/foundry/tests/foundry/test_foundry_agent.py b/python/packages/foundry/tests/foundry/test_foundry_agent.py index 44bc744f64..a9da5f4011 100644 --- a/python/packages/foundry/tests/foundry/test_foundry_agent.py +++ b/python/packages/foundry/tests/foundry/test_foundry_agent.py @@ -109,9 +109,67 @@ def test_raw_foundry_agent_chat_client_init_uses_explicit_parameters() -> None: assert "compaction_strategy" in signature.parameters assert "tokenizer" in signature.parameters assert "additional_properties" in signature.parameters + assert "timeout" in signature.parameters assert all(parameter.kind != inspect.Parameter.VAR_KEYWORD for parameter in signature.parameters.values()) +def test_raw_foundry_agent_chat_client_init_applies_timeout_to_openai_client() -> None: + """Test that timeout is applied via with_options without mutating the shared OpenAI client.""" + + mock_project = MagicMock() + openai_client_mock = MagicMock() + openai_client_mock.timeout = 5.0 + mock_project.get_openai_client.return_value = openai_client_mock + + client = RawFoundryAgentChatClient( + project_client=mock_project, + agent_name="test-agent", + timeout=60.0, + ) + + openai_client_mock.with_options.assert_called_once_with(timeout=60.0) + assert openai_client_mock.timeout == 5.0, "Original shared client must not be mutated" + assert client.client is openai_client_mock.with_options.return_value + + +def test_raw_foundry_agent_chat_client_init_timeout_none_leaves_client_unchanged() -> None: + """Test that timeout=None does not call with_options and leaves the shared client intact.""" + + mock_project = MagicMock() + openai_client_mock = MagicMock() + openai_client_mock.timeout = 5.0 + mock_project.get_openai_client.return_value = openai_client_mock + + RawFoundryAgentChatClient( + project_client=mock_project, + agent_name="test-agent", + timeout=None, + ) + + openai_client_mock.with_options.assert_not_called() + assert openai_client_mock.timeout == 5.0 + + +def test_raw_foundry_agent_chat_client_init_applies_timeout_with_preview_enabled() -> None: + """Test that timeout uses with_options even when allow_preview=True (hosted agent path).""" + + mock_project = MagicMock() + openai_client_mock = MagicMock() + openai_client_mock.timeout = 5.0 + mock_project.get_openai_client.return_value = openai_client_mock + + client = RawFoundryAgentChatClient( + project_client=mock_project, + agent_name="hosted-agent", + allow_preview=True, + timeout=120.0, + ) + + openai_client_mock.with_options.assert_called_once_with(timeout=120.0) + assert openai_client_mock.timeout == 5.0, "Original shared client must not be mutated" + assert client.client is openai_client_mock.with_options.return_value + + def test_raw_foundry_agent_chat_client_as_agent_preserves_client_type() -> None: """Test that as_agent() wraps the client in FoundryAgent using the same client class.""" @@ -486,9 +544,29 @@ def test_foundry_agent_chat_client_init_uses_explicit_parameters() -> None: assert "compaction_strategy" in signature.parameters assert "tokenizer" in signature.parameters assert "additional_properties" in signature.parameters + assert "timeout" in signature.parameters assert all(parameter.kind != inspect.Parameter.VAR_KEYWORD for parameter in signature.parameters.values()) +def test_foundry_agent_chat_client_init_propagates_timeout() -> None: + """Test that _FoundryAgentChatClient calls with_options instead of mutating the shared client.""" + + mock_project = MagicMock() + openai_client_mock = MagicMock() + openai_client_mock.timeout = 5.0 + mock_project.get_openai_client.return_value = openai_client_mock + + client = _FoundryAgentChatClient( + project_client=mock_project, + agent_name="test-agent", + timeout=45.0, + ) + + openai_client_mock.with_options.assert_called_once_with(timeout=45.0) + assert openai_client_mock.timeout == 5.0, "Original shared client must not be mutated" + assert client.client is openai_client_mock.with_options.return_value + + def test_raw_foundry_agent_init_creates_client() -> None: """Test that RawFoundryAgent creates a client internally.""" @@ -563,6 +641,7 @@ def test_raw_foundry_agent_init_uses_explicit_parameters() -> None: assert "compaction_strategy" in signature.parameters assert "tokenizer" in signature.parameters assert "additional_properties" in signature.parameters + assert "timeout" in signature.parameters assert all(parameter.kind != inspect.Parameter.VAR_KEYWORD for parameter in signature.parameters.values()) @@ -575,9 +654,47 @@ def test_foundry_agent_init_uses_explicit_parameters() -> None: assert "compaction_strategy" in signature.parameters assert "tokenizer" in signature.parameters assert "additional_properties" in signature.parameters + assert "timeout" in signature.parameters assert all(parameter.kind != inspect.Parameter.VAR_KEYWORD for parameter in signature.parameters.values()) +def test_foundry_agent_init_propagates_timeout_to_openai_client() -> None: + """Test that FoundryAgent uses with_options instead of mutating the shared OpenAI client.""" + + mock_project = MagicMock() + openai_client_mock = MagicMock() + openai_client_mock.timeout = 5.0 + mock_project.get_openai_client.return_value = openai_client_mock + + agent = FoundryAgent( + project_client=mock_project, + agent_name="test-agent", + timeout=90.0, + ) + + openai_client_mock.with_options.assert_called_once_with(timeout=90.0) + assert openai_client_mock.timeout == 5.0, "Original shared client must not be mutated" + assert agent.client.client is openai_client_mock.with_options.return_value + + +def test_foundry_agent_init_timeout_none_leaves_client_default() -> None: + """Test that FoundryAgent with timeout=None does not call with_options or mutate the client.""" + + mock_project = MagicMock() + openai_client_mock = MagicMock() + openai_client_mock.timeout = 5.0 + mock_project.get_openai_client.return_value = openai_client_mock + + FoundryAgent( + project_client=mock_project, + agent_name="test-agent", + timeout=None, + ) + + openai_client_mock.with_options.assert_not_called() + assert openai_client_mock.timeout == 5.0 + + def test_raw_foundry_agent_init_rejects_invalid_client_type() -> None: """Test that invalid client_type raises TypeError.""" diff --git a/python/packages/foundry_hosting/tests/test_responses.py b/python/packages/foundry_hosting/tests/test_responses.py index 0bfff345a7..9c65a9ea42 100644 --- a/python/packages/foundry_hosting/tests/test_responses.py +++ b/python/packages/foundry_hosting/tests/test_responses.py @@ -2118,15 +2118,11 @@ async def test_hosted_mcp_call_round_trip_does_not_orphan_function_call_output(s assert resp2.json()["status"] == "completed" second_call_messages = agent.run.call_args_list[1].kwargs["messages"] - mcp_call_contents = [ - c for m in second_call_messages for c in m.contents if c.type == "mcp_server_tool_call" - ] + mcp_call_contents = [c for m in second_call_messages for c in m.contents if c.type == "mcp_server_tool_call"] mcp_result_contents = [ c for m in second_call_messages for c in m.contents if c.type == "mcp_server_tool_result" ] - function_result_contents = [ - c for m in second_call_messages for c in m.contents if c.type == "function_result" - ] + function_result_contents = [c for m in second_call_messages for c in m.contents if c.type == "function_result"] assert len(mcp_call_contents) >= 1 assert len(mcp_result_contents) >= 1 diff --git a/python/packages/openai/agent_framework_openai/_chat_client.py b/python/packages/openai/agent_framework_openai/_chat_client.py index 261554fba3..378df3b3c4 100644 --- a/python/packages/openai/agent_framework_openai/_chat_client.py +++ b/python/packages/openai/agent_framework_openai/_chat_client.py @@ -385,6 +385,7 @@ def __init__( additional_properties: dict[str, Any] | None = None, env_file_path: str | None = None, env_file_encoding: str | None = None, + timeout: float | None = None, ) -> None: """Initialize a raw OpenAI Chat client. @@ -406,6 +407,7 @@ def __init__( env_file_path: Optional ``.env`` file that is checked before the process environment for ``OPENAI_*`` values. env_file_encoding: Encoding for the ``.env`` file. + timeout: Optional timeout in seconds for requests. """ ... @@ -427,6 +429,7 @@ def __init__( additional_properties: dict[str, Any] | None = None, env_file_path: str | None = None, env_file_encoding: str | None = None, + timeout: float | None = None, ) -> None: """Initialize a raw OpenAI Chat client. @@ -455,6 +458,7 @@ def __init__( env_file_path: Optional ``.env`` file that is checked before process environment variables for ``AZURE_OPENAI_*`` values. env_file_encoding: Encoding for the ``.env`` file. + timeout: Optional timeout in seconds for requests. """ ... @@ -476,6 +480,7 @@ def __init__( additional_properties: dict[str, Any] | None = None, env_file_path: str | None = None, env_file_encoding: str | None = None, + timeout: float | None = None, ) -> None: """Initialize a raw OpenAI Chat client. @@ -511,6 +516,8 @@ def __init__( variables. The same file is used for both ``OPENAI_*`` and ``AZURE_OPENAI_*`` lookups. env_file_encoding: Encoding for the ``.env`` file. + timeout: HTTP timeout in seconds for requests. When not provided, the + OpenAI SDK default is used (connect: 5s, total: 600s). Notes: Environment resolution and routing precedence are: @@ -541,6 +548,7 @@ def __init__( openai_model_fields=("chat_model", "model"), azure_model_fields=("chat_model", "model"), responses_mode=True, + timeout=timeout, ) self.client = client diff --git a/python/packages/openai/agent_framework_openai/_shared.py b/python/packages/openai/agent_framework_openai/_shared.py index 7fb12ad14e..894ee3b612 100644 --- a/python/packages/openai/agent_framework_openai/_shared.py +++ b/python/packages/openai/agent_framework_openai/_shared.py @@ -162,6 +162,7 @@ def load_openai_service_settings( openai_model_fields: Sequence[OpenAIModelSettingName] = ("model",), azure_model_fields: Sequence[OpenAIModelSettingName] = ("model",), responses_mode: bool = False, + timeout: float | None = None, ) -> tuple[dict[str, Any], AsyncOpenAI, bool]: """Load OpenAI settings, including Azure OpenAI model aliases. @@ -218,6 +219,8 @@ def load_openai_service_settings( } if base_url := openai_settings.get("base_url"): client_args["base_url"] = base_url + if timeout is not None: + client_args["timeout"] = timeout return openai_settings, AsyncOpenAI(**client_args), False # type: ignore[return-value] checked_openai = True azure_settings = load_settings( @@ -299,8 +302,12 @@ def load_openai_service_settings( openai_args["api_key"] = _ensure_async_token_provider(client_args["azure_ad_token_provider"]) elif "api_key" in client_args: openai_args["api_key"] = client_args["api_key"] + if timeout is not None: + openai_args["timeout"] = timeout return azure_settings, AsyncOpenAI(**openai_args), True # type: ignore[return-value] + if timeout is not None: + client_args["timeout"] = timeout return azure_settings, AsyncAzureOpenAI(**client_args), True # type: ignore[return-value] diff --git a/python/packages/openai/tests/openai/test_openai_chat_client.py b/python/packages/openai/tests/openai/test_openai_chat_client.py index e604742e7e..099796574d 100644 --- a/python/packages/openai/tests/openai/test_openai_chat_client.py +++ b/python/packages/openai/tests/openai/test_openai_chat_client.py @@ -36,7 +36,7 @@ ChatClientInvalidRequestException, SettingNotFoundError, ) -from openai import BadRequestError +from openai import AsyncOpenAI, BadRequestError from openai.types.responses.response_reasoning_item import Summary from openai.types.responses.response_reasoning_summary_text_delta_event import ( ResponseReasoningSummaryTextDeltaEvent, @@ -55,7 +55,7 @@ from pytest import param from agent_framework_openai import OpenAIChatClient -from agent_framework_openai._chat_client import OPENAI_LOCAL_SHELL_CALL_ITEM_ID_KEY +from agent_framework_openai._chat_client import OPENAI_LOCAL_SHELL_CALL_ITEM_ID_KEY, RawOpenAIChatClient from agent_framework_openai._exceptions import OpenAIContentFilterException skip_if_openai_integration_tests_disabled = pytest.mark.skipif( @@ -194,6 +194,26 @@ def test_init_uses_explicit_parameters() -> None: assert all(parameter.kind != inspect.Parameter.VAR_KEYWORD for parameter in signature.parameters.values()) +def test_raw_openai_chat_client_init_uses_explicit_parameters() -> None: + signature = inspect.signature(RawOpenAIChatClient.__init__) + + assert "additional_properties" in signature.parameters + assert "compaction_strategy" in signature.parameters + assert "tokenizer" in signature.parameters + assert "timeout" in signature.parameters + assert all(parameter.kind != inspect.Parameter.VAR_KEYWORD for parameter in signature.parameters.values()) + + +def test_raw_openai_chat_client_accepts_preconfigured_client_with_timeout() -> None: + """Test that timeout is accepted without error when async_client is pre-provided.""" + + mock_client = MagicMock(spec=AsyncOpenAI) + mock_client.timeout = 5.0 + + client = RawOpenAIChatClient(async_client=mock_client, timeout=30.0) + assert client is not None + + def test_openai_chat_client_supports_all_tool_protocols() -> None: assert isinstance(OpenAIChatClient, SupportsCodeInterpreterTool) assert isinstance(OpenAIChatClient, SupportsWebSearchTool) diff --git a/python/uv.lock b/python/uv.lock index 5e4ae35369..f464a44d9e 100644 --- a/python/uv.lock +++ b/python/uv.lock @@ -562,7 +562,7 @@ requires-dist = [ { name = "agent-framework-core", editable = "packages/core" }, { name = "azure-ai-agentserver-core", specifier = ">=2.0.0b3,<3" }, { name = "azure-ai-agentserver-invocations", specifier = ">=1.0.0b3,<2" }, - { name = "azure-ai-agentserver-responses", specifier = ">=1.0.0b5,<2" }, + { name = "azure-ai-agentserver-responses", specifier = ">=1.0.0b7,<2" }, ] [[package]] @@ -1171,19 +1171,18 @@ wheels = [ [[package]] name = "azure-ai-agentserver-core" -version = "2.0.0b3" +version = "2.0.0b5" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "azure-monitor-opentelemetry-exporter", marker = "sys_platform == 'darwin' or sys_platform == 'linux' or sys_platform == 'win32'" }, { name = "hypercorn", marker = "sys_platform == 'darwin' or sys_platform == 'linux' or sys_platform == 'win32'" }, + { name = "microsoft-opentelemetry", 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-sdk", 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'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/84/29/1a9606d5252b02d77070a1b633dd0c26fe65a0f4a0fb0cfdaa751e2ed458/azure_ai_agentserver_core-2.0.0b3.tar.gz", hash = "sha256:e295b19a65d53c513929f52f0862bbb815cc9e9fc29d2a2825452f3136260123", size = 42573, upload-time = "2026-04-23T04:13:16.717Z" } +sdist = { url = "https://files.pythonhosted.org/packages/a5/06/7c88b6506d26ee625a967cef762e6a155ed7ab8812f3f1e45ec1a950b8ae/azure_ai_agentserver_core-2.0.0b5.tar.gz", hash = "sha256:f03dc737351e5d847e9fc18c5b78b261436de368f1317a0c29957cc2179c37d1", size = 46273, upload-time = "2026-05-25T12:48:01.739Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/7f/9b/1fc87c05b55821f33c46c5e8a3b97a573aa2fc4bff387e75cca1a87800b4/azure_ai_agentserver_core-2.0.0b3-py3-none-any.whl", hash = "sha256:5ef921eb9fd9c0f15682fe930320fae50dccfa915d7518f9a16d99014bbcb3cb", size = 29127, upload-time = "2026-04-23T04:13:17.976Z" }, + { url = "https://files.pythonhosted.org/packages/68/80/a43a269601512793b220c36dc0864b44d806b969dbfe14f1ecc3b5f5202b/azure_ai_agentserver_core-2.0.0b5-py3-none-any.whl", hash = "sha256:0d00c298892e2ff466b32235d5d9c55b57054f0e8fcedb0726eacd7684e1aa89", size = 31521, upload-time = "2026-05-25T12:48:03.072Z" }, ] [[package]] @@ -1200,7 +1199,7 @@ wheels = [ [[package]] name = "azure-ai-agentserver-responses" -version = "1.0.0b5" +version = "1.0.0b7" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "aiohttp", marker = "sys_platform == 'darwin' or sys_platform == 'linux' or sys_platform == 'win32'" }, @@ -1208,9 +1207,9 @@ dependencies = [ { name = "azure-core", marker = "sys_platform == 'darwin' or sys_platform == 'linux' or sys_platform == 'win32'" }, { name = "isodate", marker = "sys_platform == 'darwin' or sys_platform == 'linux' or sys_platform == 'win32'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/e6/27/3ecb7fe704ff8764199bfbe4cc1e584a520a9affe042470d9d50b6e1e73a/azure_ai_agentserver_responses-1.0.0b5.tar.gz", hash = "sha256:0b627b810359c792ea7b6fa6782abaf6df32d9bc9e5a569ad722afcffd0ce8d9", size = 410908, upload-time = "2026-04-23T04:31:15.414Z" } +sdist = { url = "https://files.pythonhosted.org/packages/f1/53/febb6f3453f5dc1e0b6dc47d4e5198b64605d1f83c847255946f74bc300e/azure_ai_agentserver_responses-1.0.0b7.tar.gz", hash = "sha256:2f67cdfc0219cb0ab86800dadb1cfdb40ab4aa0413dae7ffa5ea4ea84eec3eb0", size = 419032, upload-time = "2026-05-25T12:48:38.81Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/44/91/1e5c0d7ce95ca8b022e69e4ca6b23e413fc2d57f0191429c4633e02213d2/azure_ai_agentserver_responses-1.0.0b5-py3-none-any.whl", hash = "sha256:4c2a6ab56e71eeb330aa52b7cb2cc71b8ec6b5bbe0e7dc84310f2c7fbda393a3", size = 268362, upload-time = "2026-04-23T04:31:17.014Z" }, + { url = "https://files.pythonhosted.org/packages/b3/94/48825357e009f7db3b6b5d0a9344a7ab3304e32f06f50328b2393e3b06cb/azure_ai_agentserver_responses-1.0.0b7-py3-none-any.whl", hash = "sha256:efb5271f24a297bacde9769359308e54e870f66ad4d3b4826ae97a77e40e94d4", size = 268063, upload-time = "2026-05-25T12:48:40.817Z" }, ] [[package]] @@ -3887,6 +3886,41 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/f0/1b/543ddaa2daf8593911a02a07a6a78366d4a6a0053ec86a557c19fa97b60e/microsoft_agents_hosting_core-0.3.1-py3-none-any.whl", hash = "sha256:a4b41556b15321b74f539c5a0a89f70955459b7ec57e9e4b24e61bba27f1cbbc", size = 94573, upload-time = "2025-09-09T23:19:53.855Z" }, ] +[[package]] +name = "microsoft-opentelemetry" +version = "1.3.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "aiohttp", marker = "sys_platform == 'darwin' or sys_platform == 'linux' or sys_platform == 'win32'" }, + { name = "azure-core", marker = "sys_platform == 'darwin' or sys_platform == 'linux' or sys_platform == 'win32'" }, + { name = "azure-core-tracing-opentelemetry", marker = "sys_platform == 'darwin' or sys_platform == 'linux' or sys_platform == 'win32'" }, + { name = "azure-monitor-opentelemetry-exporter", 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-http", marker = "sys_platform == 'darwin' or sys_platform == 'linux' or sys_platform == 'win32'" }, + { name = "opentelemetry-instrumentation", marker = "sys_platform == 'darwin' or sys_platform == 'linux' or sys_platform == 'win32'" }, + { name = "opentelemetry-instrumentation-django", 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'" }, + { name = "opentelemetry-instrumentation-flask", marker = "sys_platform == 'darwin' or sys_platform == 'linux' or sys_platform == 'win32'" }, + { name = "opentelemetry-instrumentation-httpx", marker = "sys_platform == 'darwin' or sys_platform == 'linux' or sys_platform == 'win32'" }, + { name = "opentelemetry-instrumentation-logging", marker = "sys_platform == 'darwin' or sys_platform == 'linux' or sys_platform == 'win32'" }, + { name = "opentelemetry-instrumentation-openai-agents-v2", marker = "sys_platform == 'darwin' or sys_platform == 'linux' or sys_platform == 'win32'" }, + { name = "opentelemetry-instrumentation-openai-v2", marker = "sys_platform == 'darwin' or sys_platform == 'linux' or sys_platform == 'win32'" }, + { name = "opentelemetry-instrumentation-psycopg2", marker = "sys_platform == 'darwin' or sys_platform == 'linux' or sys_platform == 'win32'" }, + { name = "opentelemetry-instrumentation-requests", marker = "sys_platform == 'darwin' or sys_platform == 'linux' or sys_platform == 'win32'" }, + { name = "opentelemetry-instrumentation-urllib", marker = "sys_platform == 'darwin' or sys_platform == 'linux' or sys_platform == 'win32'" }, + { name = "opentelemetry-instrumentation-urllib3", marker = "sys_platform == 'darwin' or sys_platform == 'linux' or sys_platform == 'win32'" }, + { name = "opentelemetry-resource-detector-azure", 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'" }, + { name = "opentelemetry-util-genai", marker = "sys_platform == 'darwin' or sys_platform == 'linux' or sys_platform == 'win32'" }, + { name = "pyjwt", 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 = "wrapt", marker = "sys_platform == 'darwin' or sys_platform == 'linux' or sys_platform == 'win32'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/a2/cf/74885d07d38e225b84b63a8a2720de846e518fe4c7e89457f4c150a9c7d5/microsoft_opentelemetry-1.3.2.tar.gz", hash = "sha256:d36f31731740170624b53f370358a9700f503bb4f9bd25c7f81c0c88c66f511c", size = 178031, upload-time = "2026-05-29T22:05:53.442Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/22/8d/6960be61c8fe236fef730b0cae1d97a1898f62355b2d6679ef46abe1e4be/microsoft_opentelemetry-1.3.2-py3-none-any.whl", hash = "sha256:65292474ce7efee115f671457188e92edc4a8d432fad163e49e504155be66ae5", size = 198419, upload-time = "2026-05-29T22:05:54.849Z" }, +] + [[package]] name = "mistralai" version = "2.4.2" @@ -4633,6 +4667,22 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/3e/41/619f3530324a58491f2d20f216a10dd7393629b29db4610dda642a27f4ed/opentelemetry_instrumentation_flask-0.61b0-py3-none-any.whl", hash = "sha256:e8ce474d7ce543bfbbb3e93f8a6f8263348af9d7b45502f387420cf3afa71253", size = 15996, upload-time = "2026-03-04T14:19:31.304Z" }, ] +[[package]] +name = "opentelemetry-instrumentation-httpx" +version = "0.61b0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "opentelemetry-api", marker = "sys_platform == 'darwin' or sys_platform == 'linux' or sys_platform == 'win32'" }, + { name = "opentelemetry-instrumentation", 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 = "opentelemetry-util-http", 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/cd/2a/e2becd55e33c29d1d9ef76e2579040ed1951cb33bacba259f6aff2fdd2a6/opentelemetry_instrumentation_httpx-0.61b0.tar.gz", hash = "sha256:6569ec097946c5551c2a4252f74c98666addd1bf047c1dde6b4ef426719ff8dd", size = 24104, upload-time = "2026-03-04T14:20:34.752Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/af/88/dde310dce56e2d85cf1a09507f5888544955309edc4b8d22971d6d3d1417/opentelemetry_instrumentation_httpx-0.61b0-py3-none-any.whl", hash = "sha256:dee05c93a6593a5dc3ae5d9d5c01df8b4e2c5d02e49275e5558534ee46343d5e", size = 17198, upload-time = "2026-03-04T14:19:33.585Z" }, +] + [[package]] name = "opentelemetry-instrumentation-logging" version = "0.61b0" @@ -4646,6 +4696,35 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/e0/0e/2137db5239cc5e564495549a4d11488a7af9b48fc76520a0eea20e69ddae/opentelemetry_instrumentation_logging-0.61b0-py3-none-any.whl", hash = "sha256:6d87e5ded6a0128d775d41511f8380910a1b610671081d16efb05ac3711c0074", size = 17076, upload-time = "2026-03-04T14:19:36.765Z" }, ] +[[package]] +name = "opentelemetry-instrumentation-openai-agents-v2" +version = "0.1.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "opentelemetry-api", marker = "sys_platform == 'darwin' or sys_platform == 'linux' or sys_platform == 'win32'" }, + { name = "opentelemetry-instrumentation", 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 = "opentelemetry-util-genai", marker = "sys_platform == 'darwin' or sys_platform == 'linux' or sys_platform == 'win32'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/00/15/b6a303454d2800d772cdebc490c1d598d06d0e541619db80195eb9ea85c6/opentelemetry_instrumentation_openai_agents_v2-0.1.0.tar.gz", hash = "sha256:1033f4b261ce07f65d197ac0e9c499302c805eae987a6cc4e7f99bb279363477", size = 22423, upload-time = "2025-10-15T19:04:59.912Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/cd/0a/b6f47734e1d7f936cbc52ef8e673d3e08d9c3c8a13d9549c03f978758076/opentelemetry_instrumentation_openai_agents_v2-0.1.0-py3-none-any.whl", hash = "sha256:e4e3dfba32bd6eeee0624eca9be54341ab7cc4f7a3bb895354f2f9d6f7afe2f3", size = 25002, upload-time = "2025-10-15T19:04:58.562Z" }, +] + +[[package]] +name = "opentelemetry-instrumentation-openai-v2" +version = "2.3b0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "opentelemetry-api", marker = "sys_platform == 'darwin' or sys_platform == 'linux' or sys_platform == 'win32'" }, + { name = "opentelemetry-instrumentation", 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'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/38/4e/21f8cd16ccb471dd217ed85eb817796a10c4f2718ae2c91e752a57180cf0/opentelemetry_instrumentation_openai_v2-2.3b0.tar.gz", hash = "sha256:5de9d70cc9536eea1fe48ea016e0c5f25735fa9a13709076a64b20657fadb6ba", size = 170838, upload-time = "2025-12-24T13:20:58.33Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f0/02/7ff0a9282520592772a356dd39d1559f3726610ccc3854a2f598b756c66f/opentelemetry_instrumentation_openai_v2-2.3b0-py3-none-any.whl", hash = "sha256:c6aca87be0da0289ea1d8167fea4b0f227ea5ef0e90496e2822121e47340d36a", size = 18053, upload-time = "2025-12-24T13:20:57.233Z" }, +] + [[package]] name = "opentelemetry-instrumentation-psycopg2" version = "0.61b0" @@ -4772,6 +4851,20 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/b2/37/cc6a55e448deaa9b27377d087da8615a3416d8ad523d5960b78dbeadd02a/opentelemetry_semantic_conventions-0.61b0-py3-none-any.whl", hash = "sha256:fa530a96be229795f8cef353739b618148b0fe2b4b3f005e60e262926c4d38e2", size = 231621, upload-time = "2026-03-04T14:17:19.33Z" }, ] +[[package]] +name = "opentelemetry-util-genai" +version = "0.3b0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "opentelemetry-api", marker = "sys_platform == 'darwin' or sys_platform == 'linux' or sys_platform == 'win32'" }, + { name = "opentelemetry-instrumentation", 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'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/a2/d8/4dd2fb622d26ec45b10ef63eb87fd512f5d7467c7bd35ce390629bd6dff8/opentelemetry_util_genai-0.3b0.tar.gz", hash = "sha256:83e127789a9ad615b8ca65f05fc36955a67ce257b06142bfd46159a3b7ed73d3", size = 31800, upload-time = "2026-02-20T16:16:14.807Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/18/e5/fada54909e445d7b4007f8b96221d571999efeab9446f3127cc1cebe5e07/opentelemetry_util_genai-0.3b0-py3-none-any.whl", hash = "sha256:ebc2b01bcb891ddc7218452470d189d3321cd742653299ff8e7de45debcfb986", size = 28426, upload-time = "2026-02-20T16:16:12.027Z" }, +] + [[package]] name = "opentelemetry-util-http" version = "0.61b0"