From c8ff8a593d8d665e2cc53f4e1a41ef4d4dbe7b50 Mon Sep 17 00:00:00 2001 From: HughhhhCoder Date: Fri, 4 Sep 2026 10:41:14 +0800 Subject: [PATCH 1/3] fix(types): allow missing find-in-page URLs --- api_reference/openapi.transformed.yml | 2 -- .../beta/beta_response_function_web_search.py | 2 +- ...beta_response_function_web_search_param.py | 2 +- .../responses/response_function_web_search.py | 2 +- .../response_function_web_search_param.py | 2 +- tests/lib/responses/test_responses.py | 24 +++++++++++++++++-- 6 files changed, 26 insertions(+), 8 deletions(-) diff --git a/api_reference/openapi.transformed.yml b/api_reference/openapi.transformed.yml index db232b77d4..8d3089537d 100644 --- a/api_reference/openapi.transformed.yml +++ b/api_reference/openapi.transformed.yml @@ -60845,7 +60845,6 @@ components: The pattern or text to search for within the page. required: - type - - url - pattern WebSearchActionOpenPage: type: object @@ -72435,7 +72434,6 @@ components: The pattern or text to search for within the page. required: - type - - url - pattern BetaWebSearchActionOpenPage: type: object 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..1ee444be41 100644 --- a/src/openai/types/beta/beta_response_function_web_search.py +++ b/src/openai/types/beta/beta_response_function_web_search.py @@ -62,7 +62,7 @@ class ActionFindInPage(BaseModel): type: Literal["find_in_page"] """The action type.""" - url: str + url: Optional[str] = None """The URL of the page searched for the pattern.""" 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..46a05f9fef 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,7 +63,7 @@ class ActionFindInPage(TypedDict, total=False): type: Required[Literal["find_in_page"]] """The action type.""" - url: Required[str] + url: str """The URL of the page searched for the pattern.""" diff --git a/src/openai/types/responses/response_function_web_search.py b/src/openai/types/responses/response_function_web_search.py index 44c6dd7a99..334558213c 100644 --- a/src/openai/types/responses/response_function_web_search.py +++ b/src/openai/types/responses/response_function_web_search.py @@ -61,7 +61,7 @@ class ActionFind(BaseModel): type: Literal["find_in_page"] """The action type.""" - url: str + url: Optional[str] = None """The URL of the page searched for the pattern.""" 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..fe9419957f 100644 --- a/src/openai/types/responses/response_function_web_search_param.py +++ b/src/openai/types/responses/response_function_web_search_param.py @@ -62,7 +62,7 @@ class ActionFind(TypedDict, total=False): type: Required[Literal["find_in_page"]] """The action type.""" - url: Required[str] + url: str """The URL of the page searched for the pattern.""" diff --git a/tests/lib/responses/test_responses.py b/tests/lib/responses/test_responses.py index c970c53a77..8028fb67c4 100644 --- a/tests/lib/responses/test_responses.py +++ b/tests/lib/responses/test_responses.py @@ -9,8 +9,9 @@ from tests.respx2 import MockRouter from openai._types import omit from openai._utils import assert_signatures_in_sync -from openai._models import construct_type_unchecked -from openai.types.responses import Response +from openai._models import BaseModel, construct_type_unchecked +from openai.types.beta import BetaResponseFunctionWebSearch +from openai.types.responses import Response, ResponseFunctionWebSearch from openai.lib._parsing._responses import parse_response from ...conftest import base_url @@ -72,6 +73,25 @@ def test_parse_response_preserves_program_items(item: dict[str, object]) -> None assert parsed.output[0].to_dict() == item +@pytest.mark.parametrize( + "response_model", + [ResponseFunctionWebSearch, BetaResponseFunctionWebSearch], + ids=["responses", "beta"], +) +def test_find_in_page_action_allows_missing_url(response_model: type[BaseModel]) -> None: + response = response_model.model_validate( + { + "id": "ws_redacted", + "type": "web_search_call", + "status": "completed", + "action": {"type": "find_in_page", "pattern": "og:image"}, + } + ) + + assert response.action.type == "find_in_page" + assert getattr(response.action, "url", None) is None + + @pytest.mark.parametrize("sync", [True, False], ids=["sync", "async"]) def test_stream_method_definition_in_sync(sync: bool, client: OpenAI, async_client: AsyncOpenAI) -> None: checking_client: OpenAI | AsyncOpenAI = client if sync else async_client From 573e80ca93e2626013b7762f38d8057cb7f10ed7 Mon Sep 17 00:00:00 2001 From: HughhhhCoder Date: Fri, 4 Sep 2026 20:35:55 +0800 Subject: [PATCH 2/3] fix(types): keep find-in-page regression compatible --- .castiron.stats.yml | 2 +- tests/lib/responses/test_responses.py | 6 ++++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/.castiron.stats.yml b/.castiron.stats.yml index cd4b0eee15..60be647331 100644 --- a/.castiron.stats.yml +++ b/.castiron.stats.yml @@ -1,7 +1,7 @@ schema_version: 1 generation_id: 08cffa97-63b1-4ab3-b3e4-9d438f45458f openapi_spec_hash: fcdb9c99a509f5ea8b90d7abbf1dab2f -openapi_transformed_spec_hash: dd244f7dd3ab9d18dc2c34970a39505f +openapi_transformed_spec_hash: b89149adbcfe03e6539e15400d412b14 config_hash: 81fd1039eb373628d87269f065d30a69 codegen_sha: fb6674883ea2eed44fa6db1f16b106ee84b4c9e5 codegen_hash: d68cd064823d9541b5d0874c92142d2691f7943452d9142c205b4cead3798785 diff --git a/tests/lib/responses/test_responses.py b/tests/lib/responses/test_responses.py index 8028fb67c4..3828ac17b6 100644 --- a/tests/lib/responses/test_responses.py +++ b/tests/lib/responses/test_responses.py @@ -9,6 +9,7 @@ from tests.respx2 import MockRouter from openai._types import omit from openai._utils import assert_signatures_in_sync +from openai._compat import parse_obj from openai._models import BaseModel, construct_type_unchecked from openai.types.beta import BetaResponseFunctionWebSearch from openai.types.responses import Response, ResponseFunctionWebSearch @@ -79,13 +80,14 @@ def test_parse_response_preserves_program_items(item: dict[str, object]) -> None ids=["responses", "beta"], ) def test_find_in_page_action_allows_missing_url(response_model: type[BaseModel]) -> None: - response = response_model.model_validate( + response = parse_obj( + response_model, { "id": "ws_redacted", "type": "web_search_call", "status": "completed", "action": {"type": "find_in_page", "pattern": "og:image"}, - } + }, ) assert response.action.type == "find_in_page" From 827e7a64659da96e3e01071dbc01773aece752c0 Mon Sep 17 00:00:00 2001 From: HughhhhCoder Date: Fri, 4 Sep 2026 20:48:20 +0800 Subject: [PATCH 3/3] fix(types): avoid ungenerated spec metadata --- .castiron.stats.yml | 2 +- api_reference/openapi.transformed.yml | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/.castiron.stats.yml b/.castiron.stats.yml index 60be647331..cd4b0eee15 100644 --- a/.castiron.stats.yml +++ b/.castiron.stats.yml @@ -1,7 +1,7 @@ schema_version: 1 generation_id: 08cffa97-63b1-4ab3-b3e4-9d438f45458f openapi_spec_hash: fcdb9c99a509f5ea8b90d7abbf1dab2f -openapi_transformed_spec_hash: b89149adbcfe03e6539e15400d412b14 +openapi_transformed_spec_hash: dd244f7dd3ab9d18dc2c34970a39505f config_hash: 81fd1039eb373628d87269f065d30a69 codegen_sha: fb6674883ea2eed44fa6db1f16b106ee84b4c9e5 codegen_hash: d68cd064823d9541b5d0874c92142d2691f7943452d9142c205b4cead3798785 diff --git a/api_reference/openapi.transformed.yml b/api_reference/openapi.transformed.yml index fe66f78ae7..e03e89a485 100644 --- a/api_reference/openapi.transformed.yml +++ b/api_reference/openapi.transformed.yml @@ -60845,6 +60845,7 @@ components: The pattern or text to search for within the page. required: - type + - url - pattern WebSearchActionOpenPage: type: object @@ -72432,6 +72433,7 @@ components: The pattern or text to search for within the page. required: - type + - url - pattern BetaWebSearchActionOpenPage: type: object