From 984de0d5d3af3bfd741919b3b530c89e5ca7e482 Mon Sep 17 00:00:00 2001 From: Sylvester Kaczmarek <16242628+sylvesterkaczmarek@users.noreply.github.com> Date: Thu, 3 Sep 2026 21:28:11 +0100 Subject: [PATCH 1/8] fix: allow find_in_page actions without url --- src/openai/types/responses/response_function_web_search.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/openai/types/responses/response_function_web_search.py b/src/openai/types/responses/response_function_web_search.py index 44c6dd7a99..667441452e 100644 --- a/src/openai/types/responses/response_function_web_search.py +++ b/src/openai/types/responses/response_function_web_search.py @@ -61,8 +61,8 @@ class ActionFind(BaseModel): type: Literal["find_in_page"] """The action type.""" - url: str - """The URL of the page searched for the pattern.""" + url: Optional[str] = None + """The URL of the page searched for the pattern, when provided.""" Action: TypeAlias = Annotated[Union[ActionSearch, ActionOpenPage, ActionFind], PropertyInfo(discriminator="type")] From e414103c9351d90390e1623653bd67bdeff3cca1 Mon Sep 17 00:00:00 2001 From: Sylvester Kaczmarek <16242628+sylvesterkaczmarek@users.noreply.github.com> Date: Thu, 3 Sep 2026 21:28:33 +0100 Subject: [PATCH 2/8] fix: make find_in_page url optional in params --- .../types/responses/response_function_web_search_param.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/openai/types/responses/response_function_web_search_param.py b/src/openai/types/responses/response_function_web_search_param.py index 122ea72ad0..70d5763c21 100644 --- a/src/openai/types/responses/response_function_web_search_param.py +++ b/src/openai/types/responses/response_function_web_search_param.py @@ -62,8 +62,8 @@ class ActionFind(TypedDict, total=False): type: Required[Literal["find_in_page"]] """The action type.""" - url: Required[str] - """The URL of the page searched for the pattern.""" + url: Optional[str] + """The URL of the page searched for the pattern, when provided.""" Action: TypeAlias = Union[ActionSearch, ActionOpenPage, ActionFind] From 1833cd06de87b894df707bbdceb77dd18e33cd8d Mon Sep 17 00:00:00 2001 From: Sylvester Kaczmarek <16242628+sylvesterkaczmarek@users.noreply.github.com> Date: Thu, 3 Sep 2026 21:28:45 +0100 Subject: [PATCH 3/8] test: cover find_in_page without url --- tests/test_web_search_action_types.py | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 tests/test_web_search_action_types.py diff --git a/tests/test_web_search_action_types.py b/tests/test_web_search_action_types.py new file mode 100644 index 0000000000..d5ec3997e9 --- /dev/null +++ b/tests/test_web_search_action_types.py @@ -0,0 +1,17 @@ +from openai.types.responses.response_function_web_search import ResponseFunctionWebSearch +from openai.types.responses.response_function_web_search_param import ActionFind as ActionFindParam + + +def test_find_in_page_action_allows_missing_url() -> None: + item = ResponseFunctionWebSearch.model_validate( + { + "id": "ws_test", + "type": "web_search_call", + "status": "completed", + "action": {"type": "find_in_page", "pattern": "og:image"}, + } + ) + + assert item.action.type == "find_in_page" + assert item.action.url is None + assert "url" not in ActionFindParam.__required_keys__ From 914a0e49bbf153a237da0d05131c6ae3457e06ac Mon Sep 17 00:00:00 2001 From: Sylvester Kaczmarek <16242628+sylvesterkaczmarek@users.noreply.github.com> Date: Thu, 3 Sep 2026 21:36:39 +0100 Subject: [PATCH 4/8] fix: allow beta find_in_page actions without url --- src/openai/types/beta/beta_response_function_web_search.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/openai/types/beta/beta_response_function_web_search.py b/src/openai/types/beta/beta_response_function_web_search.py index af57015543..dc22916303 100644 --- a/src/openai/types/beta/beta_response_function_web_search.py +++ b/src/openai/types/beta/beta_response_function_web_search.py @@ -62,8 +62,8 @@ class ActionFindInPage(BaseModel): type: Literal["find_in_page"] """The action type.""" - url: str - """The URL of the page searched for the pattern.""" + url: Optional[str] = None + """The URL of the page searched for the pattern, when provided.""" Action: TypeAlias = Annotated[Union[ActionSearch, ActionOpenPage, ActionFindInPage], PropertyInfo(discriminator="type")] From aed30fffe2857fe679108359898f27bf21602717 Mon Sep 17 00:00:00 2001 From: Sylvester Kaczmarek <16242628+sylvesterkaczmarek@users.noreply.github.com> Date: Thu, 3 Sep 2026 21:36:57 +0100 Subject: [PATCH 5/8] fix: make beta find_in_page url optional in params --- .../types/beta/beta_response_function_web_search_param.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/openai/types/beta/beta_response_function_web_search_param.py b/src/openai/types/beta/beta_response_function_web_search_param.py index 8c8a92c684..e5e2fab50a 100644 --- a/src/openai/types/beta/beta_response_function_web_search_param.py +++ b/src/openai/types/beta/beta_response_function_web_search_param.py @@ -63,8 +63,8 @@ class ActionFindInPage(TypedDict, total=False): type: Required[Literal["find_in_page"]] """The action type.""" - url: Required[str] - """The URL of the page searched for the pattern.""" + url: Optional[str] + """The URL of the page searched for the pattern, when provided.""" Action: TypeAlias = Union[ActionSearch, ActionOpenPage, ActionFindInPage] From e6002086355858e07a945a8fe026aeb89153ac4e Mon Sep 17 00:00:00 2001 From: Sylvester Kaczmarek <16242628+sylvesterkaczmarek@users.noreply.github.com> Date: Thu, 3 Sep 2026 21:37:16 +0100 Subject: [PATCH 6/8] test: cover stable and beta find_in_page without url --- tests/test_web_search_action_types.py | 28 +++++++++++++++++++-------- 1 file changed, 20 insertions(+), 8 deletions(-) diff --git a/tests/test_web_search_action_types.py b/tests/test_web_search_action_types.py index d5ec3997e9..7f8888546c 100644 --- a/tests/test_web_search_action_types.py +++ b/tests/test_web_search_action_types.py @@ -1,17 +1,29 @@ +from openai.types.beta.beta_response_function_web_search import BetaResponseFunctionWebSearch +from openai.types.beta.beta_response_function_web_search_param import ActionFindInPage as BetaActionFindParam from openai.types.responses.response_function_web_search import ResponseFunctionWebSearch from openai.types.responses.response_function_web_search_param import ActionFind as ActionFindParam +def _find_payload() -> dict[str, object]: + return { + "id": "ws_test", + "type": "web_search_call", + "status": "completed", + "action": {"type": "find_in_page", "pattern": "og:image"}, + } + + def test_find_in_page_action_allows_missing_url() -> None: - item = ResponseFunctionWebSearch.model_validate( - { - "id": "ws_test", - "type": "web_search_call", - "status": "completed", - "action": {"type": "find_in_page", "pattern": "og:image"}, - } - ) + item = ResponseFunctionWebSearch.model_validate(_find_payload()) assert item.action.type == "find_in_page" assert item.action.url is None assert "url" not in ActionFindParam.__required_keys__ + + +def test_beta_find_in_page_action_allows_missing_url() -> None: + item = BetaResponseFunctionWebSearch.model_validate(_find_payload()) + + assert item.action.type == "find_in_page" + assert item.action.url is None + assert "url" not in BetaActionFindParam.__required_keys__ From 45522f97a98fd2fcb8042bb7c62226c9ff423ff7 Mon Sep 17 00:00:00 2001 From: Sylvester Kaczmarek <16242628+sylvesterkaczmarek@users.noreply.github.com> Date: Thu, 3 Sep 2026 23:57:25 +0100 Subject: [PATCH 7/8] test: support pydantic v1 web search validation --- tests/test_web_search_action_types.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/tests/test_web_search_action_types.py b/tests/test_web_search_action_types.py index 7f8888546c..1d7f7be717 100644 --- a/tests/test_web_search_action_types.py +++ b/tests/test_web_search_action_types.py @@ -1,6 +1,7 @@ +from openai._compat import model_parse from openai.types.beta.beta_response_function_web_search import BetaResponseFunctionWebSearch -from openai.types.beta.beta_response_function_web_search_param import ActionFindInPage as BetaActionFindParam from openai.types.responses.response_function_web_search import ResponseFunctionWebSearch +from openai.types.beta.beta_response_function_web_search_param import ActionFindInPage as BetaActionFindParam from openai.types.responses.response_function_web_search_param import ActionFind as ActionFindParam @@ -14,7 +15,7 @@ def _find_payload() -> dict[str, object]: def test_find_in_page_action_allows_missing_url() -> None: - item = ResponseFunctionWebSearch.model_validate(_find_payload()) + item = model_parse(ResponseFunctionWebSearch, _find_payload()) assert item.action.type == "find_in_page" assert item.action.url is None @@ -22,7 +23,7 @@ def test_find_in_page_action_allows_missing_url() -> None: def test_beta_find_in_page_action_allows_missing_url() -> None: - item = BetaResponseFunctionWebSearch.model_validate(_find_payload()) + item = model_parse(BetaResponseFunctionWebSearch, _find_payload()) assert item.action.type == "find_in_page" assert item.action.url is None From c441096ececf382258e550340bb853aebf173cd3 Mon Sep 17 00:00:00 2001 From: Sylvester Kaczmarek <16242628+sylvesterkaczmarek@users.noreply.github.com> Date: Thu, 3 Sep 2026 23:57:40 +0100 Subject: [PATCH 8/8] style: sort web search regression imports --- tests/test_web_search_action_types.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_web_search_action_types.py b/tests/test_web_search_action_types.py index 1d7f7be717..bbee37ae93 100644 --- a/tests/test_web_search_action_types.py +++ b/tests/test_web_search_action_types.py @@ -1,7 +1,7 @@ from openai._compat import model_parse from openai.types.beta.beta_response_function_web_search import BetaResponseFunctionWebSearch -from openai.types.responses.response_function_web_search import ResponseFunctionWebSearch from openai.types.beta.beta_response_function_web_search_param import ActionFindInPage as BetaActionFindParam +from openai.types.responses.response_function_web_search import ResponseFunctionWebSearch from openai.types.responses.response_function_web_search_param import ActionFind as ActionFindParam