From 907a919b55679d19bdaab5c29d3416e7f8e4b3ee Mon Sep 17 00:00:00 2001 From: Aayush Kapoor Date: Wed, 26 Nov 2025 23:50:07 -0500 Subject: [PATCH 1/7] repro example --- .../src/generate-text/9308-repro-azure.ts | 33 +++++++++++++++++++ 1 file changed, 33 insertions(+) create mode 100644 examples/ai-core/src/generate-text/9308-repro-azure.ts diff --git a/examples/ai-core/src/generate-text/9308-repro-azure.ts b/examples/ai-core/src/generate-text/9308-repro-azure.ts new file mode 100644 index 000000000000..4a895083696d --- /dev/null +++ b/examples/ai-core/src/generate-text/9308-repro-azure.ts @@ -0,0 +1,33 @@ +import { azure } from '@ai-sdk/azure'; +import { openai } from '@ai-sdk/openai'; +import { generateText } from 'ai'; +import 'dotenv/config'; + +async function main() { + const { text, usage } = await generateText({ + model: azure('gpt-5.1-codex'), // use your own deployment + temperature: 1, + tools: { + web_search: azure.tools.webSearchPreview({}), + }, + providerOptions: { + openai: { + reasoningEffort: 'high', + maxCompletionTokens: 32_000, + }, + }, + messages: [ + { + role: 'user', + content: + "Make a static website for today's stock news, use web search and make sure to use open_page", + }, + ], + }); + + console.log(text); + console.log(); + console.log('Usage:', usage); +} + +main().catch(console.error); From dfb957973c4e972f3179eae9adc3bebb8641db0f Mon Sep 17 00:00:00 2001 From: Aayush Kapoor Date: Wed, 26 Nov 2025 23:50:49 -0500 Subject: [PATCH 2/7] fix for bug --- .../openai/src/responses/openai-responses-api.ts | 12 ++++++------ packages/openai/src/tool/web-search-preview.ts | 12 ++++++------ packages/openai/src/tool/web-search.ts | 12 ++++++------ 3 files changed, 18 insertions(+), 18 deletions(-) diff --git a/packages/openai/src/responses/openai-responses-api.ts b/packages/openai/src/responses/openai-responses-api.ts index 43000e64154d..c31f7634e0e4 100644 --- a/packages/openai/src/responses/openai-responses-api.ts +++ b/packages/openai/src/responses/openai-responses-api.ts @@ -429,12 +429,12 @@ export const openaiResponsesChunkSchema = lazySchema(() => }), z.object({ type: z.literal('open_page'), - url: z.string(), + url: z.string().nullish(), }), z.object({ type: z.literal('find'), - url: z.string(), - pattern: z.string(), + url: z.string().nullish(), + pattern: z.string().nullish(), }), ]), }), @@ -740,12 +740,12 @@ export const openaiResponsesResponseSchema = lazySchema(() => }), z.object({ type: z.literal('open_page'), - url: z.string(), + url: z.string().nullish(), }), z.object({ type: z.literal('find'), - url: z.string(), - pattern: z.string(), + url: z.string().nullish(), + pattern: z.string().nullish(), }), ]), }), diff --git a/packages/openai/src/tool/web-search-preview.ts b/packages/openai/src/tool/web-search-preview.ts index 543e23779255..8ff004ea416e 100644 --- a/packages/openai/src/tool/web-search-preview.ts +++ b/packages/openai/src/tool/web-search-preview.ts @@ -36,12 +36,12 @@ const webSearchPreviewOutputSchema = lazySchema(() => }), z.object({ type: z.literal('openPage'), - url: z.string(), + url: z.string().nullish(), }), z.object({ type: z.literal('find'), - url: z.string(), - pattern: z.string(), + url: z.string().nullish(), + pattern: z.string().nullish(), }), ]), }), @@ -79,7 +79,7 @@ export const webSearchPreview = /** * The URL opened by the model. */ - url: string; + url?: string | null; } | { /** @@ -90,12 +90,12 @@ export const webSearchPreview = /** * The URL of the page searched for the pattern. */ - url: string; + url?: string | null; /** * The pattern or text to search for within the page. */ - pattern: string; + pattern?: string | null; }; }, { diff --git a/packages/openai/src/tool/web-search.ts b/packages/openai/src/tool/web-search.ts index 5662f2941be6..a9ec0da26961 100644 --- a/packages/openai/src/tool/web-search.ts +++ b/packages/openai/src/tool/web-search.ts @@ -38,12 +38,12 @@ export const webSearchOutputSchema = lazySchema(() => }), z.object({ type: z.literal('openPage'), - url: z.string(), + url: z.string().nullish(), }), z.object({ type: z.literal('find'), - url: z.string(), - pattern: z.string(), + url: z.string().nullish(), + pattern: z.string().nullish(), }), ]), sources: z @@ -89,7 +89,7 @@ export const webSearchToolFactory = /** * The URL opened by the model. */ - url: string; + url?: string | null; } | { /** @@ -100,12 +100,12 @@ export const webSearchToolFactory = /** * The URL of the page searched for the pattern. */ - url: string; + url?: string | null; /** * The pattern or text to search for within the page. */ - pattern: string; + pattern?: string | null; }; /** From 828fa29e36b848ea577e7616e7969c6501f44ed9 Mon Sep 17 00:00:00 2001 From: Aayush Kapoor Date: Wed, 26 Nov 2025 23:51:01 -0500 Subject: [PATCH 3/7] type check --- .../components/tool/azure-web-search-preview-view.tsx | 4 ++-- .../next-openai/components/tool/openai-web-search-view.tsx | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/examples/next-openai/components/tool/azure-web-search-preview-view.tsx b/examples/next-openai/components/tool/azure-web-search-preview-view.tsx index 0d977a1736d7..7004ef0f8a03 100644 --- a/examples/next-openai/components/tool/azure-web-search-preview-view.tsx +++ b/examples/next-openai/components/tool/azure-web-search-preview-view.tsx @@ -52,7 +52,7 @@ export default function AzureWebSearchPreviewView({
URL:{' '} In URL:{' '} URL:{' '} In URL:{' '} Date: Tue, 2 Dec 2025 13:06:56 -0500 Subject: [PATCH 4/7] delete example --- .../src/generate-text/9308-repro-azure.ts | 33 ------------------- 1 file changed, 33 deletions(-) delete mode 100644 examples/ai-core/src/generate-text/9308-repro-azure.ts diff --git a/examples/ai-core/src/generate-text/9308-repro-azure.ts b/examples/ai-core/src/generate-text/9308-repro-azure.ts deleted file mode 100644 index 4a895083696d..000000000000 --- a/examples/ai-core/src/generate-text/9308-repro-azure.ts +++ /dev/null @@ -1,33 +0,0 @@ -import { azure } from '@ai-sdk/azure'; -import { openai } from '@ai-sdk/openai'; -import { generateText } from 'ai'; -import 'dotenv/config'; - -async function main() { - const { text, usage } = await generateText({ - model: azure('gpt-5.1-codex'), // use your own deployment - temperature: 1, - tools: { - web_search: azure.tools.webSearchPreview({}), - }, - providerOptions: { - openai: { - reasoningEffort: 'high', - maxCompletionTokens: 32_000, - }, - }, - messages: [ - { - role: 'user', - content: - "Make a static website for today's stock news, use web search and make sure to use open_page", - }, - ], - }); - - console.log(text); - console.log(); - console.log('Usage:', usage); -} - -main().catch(console.error); From 9ef6676c373e74550b8f4cb6f8d5f78637131f66 Mon Sep 17 00:00:00 2001 From: Aayush Kapoor Date: Tue, 2 Dec 2025 13:07:34 -0500 Subject: [PATCH 5/7] cs --- .changeset/shiny-llamas-behave.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/shiny-llamas-behave.md diff --git a/.changeset/shiny-llamas-behave.md b/.changeset/shiny-llamas-behave.md new file mode 100644 index 000000000000..d5cdb4bd5052 --- /dev/null +++ b/.changeset/shiny-llamas-behave.md @@ -0,0 +1,5 @@ +--- +'@ai-sdk/openai': patch +--- + +fix(openai): allow open_page action type url to be nullish From 68fc309cea042d1e75f943b93397ff777ee046fa Mon Sep 17 00:00:00 2001 From: Aayush Kapoor Date: Tue, 2 Dec 2025 13:53:00 -0500 Subject: [PATCH 6/7] rm url span --- .../tool/azure-web-search-preview-view.tsx | 22 ------------------- .../tool/openai-web-search-view.tsx | 22 ------------------- 2 files changed, 44 deletions(-) diff --git a/examples/next-openai/components/tool/azure-web-search-preview-view.tsx b/examples/next-openai/components/tool/azure-web-search-preview-view.tsx index 7004ef0f8a03..0c149b146e1d 100644 --- a/examples/next-openai/components/tool/azure-web-search-preview-view.tsx +++ b/examples/next-openai/components/tool/azure-web-search-preview-view.tsx @@ -49,17 +49,6 @@ export default function AzureWebSearchPreviewView({ Opened a page
-
- URL:{' '} - - {output.action.url} - -
); case 'find': @@ -77,17 +66,6 @@ export default function AzureWebSearchPreviewView({ {output.action.pattern} -
- In URL:{' '} - - {output.action.url} - -
); } diff --git a/examples/next-openai/components/tool/openai-web-search-view.tsx b/examples/next-openai/components/tool/openai-web-search-view.tsx index d673eaab13c5..d42e5e9faf25 100644 --- a/examples/next-openai/components/tool/openai-web-search-view.tsx +++ b/examples/next-openai/components/tool/openai-web-search-view.tsx @@ -74,17 +74,6 @@ export default function OpenAIWebSearchView({ Opened a page -
- URL:{' '} - - {output.action.url} - -
); case 'find': @@ -102,17 +91,6 @@ export default function OpenAIWebSearchView({ {output.action.pattern} -
- In URL:{' '} - - {output.action.url} - -
); } From d139bb17db64c13697f4532a33e6d2b12e1ef852 Mon Sep 17 00:00:00 2001 From: Aayush Kapoor Date: Wed, 3 Dec 2025 11:45:13 -0500 Subject: [PATCH 7/7] conditional check --- .../tool/azure-web-search-preview-view.tsx | 26 +++++++++++++++++++ .../tool/openai-web-search-view.tsx | 26 +++++++++++++++++++ 2 files changed, 52 insertions(+) diff --git a/examples/next-openai/components/tool/azure-web-search-preview-view.tsx b/examples/next-openai/components/tool/azure-web-search-preview-view.tsx index 0c149b146e1d..f5ae56afefc0 100644 --- a/examples/next-openai/components/tool/azure-web-search-preview-view.tsx +++ b/examples/next-openai/components/tool/azure-web-search-preview-view.tsx @@ -49,6 +49,19 @@ export default function AzureWebSearchPreviewView({ Opened a page + {output.action.url && ( +
+ URL:{' '} + + {output.action.url} + +
+ )} ); case 'find': @@ -60,6 +73,19 @@ export default function AzureWebSearchPreviewView({ Searched for pattern in page + {output.action.url && ( +
+ URL:{' '} + + {output.action.url} + +
+ )}
Pattern:{' '} diff --git a/examples/next-openai/components/tool/openai-web-search-view.tsx b/examples/next-openai/components/tool/openai-web-search-view.tsx index d42e5e9faf25..63df722368d6 100644 --- a/examples/next-openai/components/tool/openai-web-search-view.tsx +++ b/examples/next-openai/components/tool/openai-web-search-view.tsx @@ -74,6 +74,19 @@ export default function OpenAIWebSearchView({ Opened a page
+ {output.action.url && ( +
+ URL:{' '} + + {output.action.url} + +
+ )} ); case 'find': @@ -85,6 +98,19 @@ export default function OpenAIWebSearchView({ Searched for pattern in page + {output.action.url && ( +
+ URL:{' '} + + {output.action.url} + +
+ )}
Pattern:{' '}