From 5887ceb7959037ad4aefdd48dce0f0e4fb0b0add Mon Sep 17 00:00:00 2001 From: Kazuhiro Sera Date: Thu, 28 Aug 2025 10:04:54 +0900 Subject: [PATCH 1/3] Fix #393 add domain filtering and sources to web search tool --- examples/docs/package.json | 1 - examples/tools/package.json | 1 + examples/tools/web-search-filters.ts | 58 +++++++++++++++++++ packages/agents-core/package.json | 2 +- packages/agents-core/src/metadata.ts | 2 +- packages/agents-openai/package.json | 2 +- packages/agents-openai/src/metadata.ts | 2 +- .../agents-openai/src/openaiResponsesModel.ts | 18 +++++- packages/agents-openai/src/tools.ts | 22 +++++-- .../agents-openai/src/types/providerData.ts | 7 ++- .../test/openaiResponsesModel.helpers.test.ts | 5 +- packages/agents-openai/test/tools.test.ts | 2 +- packages/agents/package.json | 2 +- packages/agents/src/metadata.ts | 2 +- pnpm-lock.yaml | 21 +++---- 15 files changed, 118 insertions(+), 29 deletions(-) create mode 100644 examples/tools/web-search-filters.ts diff --git a/examples/docs/package.json b/examples/docs/package.json index 77dc00ad..9f26c069 100644 --- a/examples/docs/package.json +++ b/examples/docs/package.json @@ -7,7 +7,6 @@ "@openai/agents-core": "workspace:*", "@openai/agents-extensions": "workspace:*", "@openai/agents-realtime": "workspace:*", - "openai": "^5.12.2", "server-only": "^0.0.1", "zod": "^3.25.40" }, diff --git a/examples/tools/package.json b/examples/tools/package.json index 9a1f4c10..92e41785 100644 --- a/examples/tools/package.json +++ b/examples/tools/package.json @@ -11,6 +11,7 @@ "start:computer-use": "tsx computer-use.ts", "start:file-search": "tsx file-search.ts", "start:web-search": "tsx web-search.ts", + "start:web-search-filters": "tsx web-search-filters.ts", "start:code-interpreter": "tsx code-interpreter.ts", "start:image-generation": "tsx image-generation.ts" } diff --git a/examples/tools/web-search-filters.ts b/examples/tools/web-search-filters.ts new file mode 100644 index 00000000..9d0af62e --- /dev/null +++ b/examples/tools/web-search-filters.ts @@ -0,0 +1,58 @@ +import { Agent, run, webSearchTool, withTrace } from '@openai/agents'; + +async function main() { + const agent = new Agent({ + name: 'OAI website searcher', + model: 'gpt-5-nano', + instructions: + 'You are a helpful agent that can search openai.com resources.', + tools: [ + webSearchTool({ + // https://platform.openai.com/docs/guides/tools-web-search?api-mode=responses#domain-filtering + filters: { + allowedDomains: [ + 'openai.com', + 'developer.openai.com', + 'platform.openai.com', + 'help.openai.com', + ], + }, + searchContextSize: 'medium', + }), + ], + modelSettings: { + providerData: { + reasoning: { effort: 'low' }, + text: { verbosity: 'low' }, + // https://platform.openai.com/docs/guides/tools-web-search?api-mode=responses#sources + include: ['web_search_call.action.sources'], + }, + }, + }); + + await withTrace('OpenAI website search example', async () => { + const today = new Date().toISOString().split('T')[0]; + const query = `Write a summary of the latest OpenAI Platform updates for developers in the last few weeks (today is ${today}).`; + const result = await run(agent, query); + console.log('\n----- Sources -----\n'); + for (const item of result.history) { + if ( + item.type === 'hosted_tool_call' && + item.name === 'web_search_call' && + item.providerData?.action?.sources + ) { + console.log( + JSON.stringify( + item.providerData.action.sources.map((s: any) => s.url), + null, + 2, + ), + ); + } + } + console.log('\n----- Final Output -----\n'); + console.log(result.finalOutput); + }); +} + +main().catch(console.error); diff --git a/packages/agents-core/package.json b/packages/agents-core/package.json index c2e73881..086aec2e 100644 --- a/packages/agents-core/package.json +++ b/packages/agents-core/package.json @@ -70,7 +70,7 @@ "@modelcontextprotocol/sdk": "^1.17.2" }, "dependencies": { - "openai": "^5.12.2", + "openai": "^5.16.0", "debug": "^4.4.0" }, "peerDependencies": { diff --git a/packages/agents-core/src/metadata.ts b/packages/agents-core/src/metadata.ts index 308f5f83..0b1da2c8 100644 --- a/packages/agents-core/src/metadata.ts +++ b/packages/agents-core/src/metadata.ts @@ -6,7 +6,7 @@ export const METADATA = { "version": "0.0.17", "versions": { "@openai/agents-core": "0.0.17", - "openai": "^5.12.2" + "openai": "^5.16.0" } }; diff --git a/packages/agents-openai/package.json b/packages/agents-openai/package.json index b018df73..1fe99327 100644 --- a/packages/agents-openai/package.json +++ b/packages/agents-openai/package.json @@ -17,7 +17,7 @@ "dependencies": { "@openai/agents-core": "workspace:*", "debug": "^4.4.0", - "openai": "^5.12.2" + "openai": "^5.16.0" }, "scripts": { "prebuild": "tsx ../../scripts/embedMeta.ts", diff --git a/packages/agents-openai/src/metadata.ts b/packages/agents-openai/src/metadata.ts index f3566950..195d6d14 100644 --- a/packages/agents-openai/src/metadata.ts +++ b/packages/agents-openai/src/metadata.ts @@ -7,7 +7,7 @@ export const METADATA = { "versions": { "@openai/agents-openai": "0.0.17", "@openai/agents-core": "workspace:*", - "openai": "^5.12.2" + "openai": "^5.16.0" } }; diff --git a/packages/agents-openai/src/openaiResponsesModel.ts b/packages/agents-openai/src/openaiResponsesModel.ts index e2173897..cc5e1e1b 100644 --- a/packages/agents-openai/src/openaiResponsesModel.ts +++ b/packages/agents-openai/src/openaiResponsesModel.ts @@ -36,10 +36,16 @@ import { import { camelOrSnakeToSnakeCase } from './utils/providerData'; import { ProviderData } from '@openai/agents-core/types'; -type ToolChoice = ToolChoiceOptions | ToolChoiceTypes | ToolChoiceFunction; +type ToolChoice = + | ToolChoiceOptions + | ToolChoiceTypes + // TOOD: remove this once the underlying ToolChoiceTypes include this + | { type: 'web_search' } + | ToolChoiceFunction; const HostedToolChoice = z.enum([ 'file_search', + 'web_search', 'web_search_preview', 'computer_use_preview', 'code_interpreter', @@ -137,6 +143,16 @@ function converTool<_TContext = unknown>( }; } else if (tool.type === 'hosted_tool') { if (tool.providerData?.type === 'web_search') { + return { + tool: { + type: 'web_search', + user_location: tool.providerData.user_location, + filters: tool.providerData.filters, + search_context_size: tool.providerData.search_context_size, + }, + include: undefined, + }; + } else if (tool.providerData?.type === 'web_search_preview') { return { tool: { type: 'web_search_preview', diff --git a/packages/agents-openai/src/tools.ts b/packages/agents-openai/src/tools.ts index deb1dbf5..8d1b12e9 100644 --- a/packages/agents-openai/src/tools.ts +++ b/packages/agents-openai/src/tools.ts @@ -29,16 +29,25 @@ export const ImageGenerationStatus = z /** * The built-in Web search tool + * + * see https://platform.openai.com/docs/guides/tools-web-search?api-mode=responses */ export type WebSearchTool = { type: 'web_search'; - name?: 'web_search_preview' | string; + name?: 'web_search' | 'web_search_preview' | string; /** * Optional location for the search. Lets you customize results to be relevant to a location. */ - userLocation?: OpenAI.Responses.WebSearchTool.UserLocation; + userLocation?: OpenAI.Responses.Tool.WebSearchTool.UserLocation; + + /** + * Optional filters for the search. + */ + filters?: { allowedDomains?: Array | null }; + /** - * The amount of context to use for the search. + * High level guidance for the amount of context window space to use for the + * search. One of `low`, `medium`, or `high`. `medium` is the default. */ searchContextSize: 'low' | 'medium' | 'high'; }; @@ -53,13 +62,16 @@ export function webSearchTool( ): HostedTool { const providerData: ProviderData.WebSearchTool = { type: 'web_search', - name: options.name ?? 'web_search_preview', + name: options.name ?? 'web_search', user_location: options.userLocation, + filters: options.filters?.allowedDomains + ? { allowed_domains: options.filters.allowedDomains } + : undefined, search_context_size: options.searchContextSize ?? 'medium', }; return { type: 'hosted_tool', - name: options.name ?? 'web_search_preview', + name: options.name ?? 'web_search', providerData, }; } diff --git a/packages/agents-openai/src/types/providerData.ts b/packages/agents-openai/src/types/providerData.ts index 73f8f8ff..531aac18 100644 --- a/packages/agents-openai/src/types/providerData.ts +++ b/packages/agents-openai/src/types/providerData.ts @@ -1,8 +1,11 @@ import OpenAI from 'openai'; -export type WebSearchTool = Omit & { +export type WebSearchTool = Omit< + OpenAI.Responses.Tool.WebSearchTool, + 'type' +> & { type: 'web_search'; - name: 'web_search_preview' | string; + name: 'web_search' | 'web_search_preview' | string; }; export type FileSearchTool = Omit & { diff --git a/packages/agents-openai/test/openaiResponsesModel.helpers.test.ts b/packages/agents-openai/test/openaiResponsesModel.helpers.test.ts index 97afaec1..012eaafd 100644 --- a/packages/agents-openai/test/openaiResponsesModel.helpers.test.ts +++ b/packages/agents-openai/test/openaiResponsesModel.helpers.test.ts @@ -16,6 +16,9 @@ describe('getToolChoice', () => { it('handles hosted tool choices', () => { expect(getToolChoice('file_search')).toEqual({ type: 'file_search' }); + expect(getToolChoice('web_search')).toEqual({ + type: 'web_search', + }); expect(getToolChoice('web_search_preview')).toEqual({ type: 'web_search_preview', }); @@ -77,7 +80,7 @@ describe('converTool', () => { }, } as any); expect(web.tool).toEqual({ - type: 'web_search_preview', + type: 'web_search', user_location: {}, search_context_size: 'low', }); diff --git a/packages/agents-openai/test/tools.test.ts b/packages/agents-openai/test/tools.test.ts index a2c8ad94..e2c7f31f 100644 --- a/packages/agents-openai/test/tools.test.ts +++ b/packages/agents-openai/test/tools.test.ts @@ -8,7 +8,7 @@ describe('Tool', () => { }); expect(t).toBeDefined(); expect(t.type).toBe('hosted_tool'); - expect(t.name).toBe('web_search_preview'); + expect(t.name).toBe('web_search'); }); it('fileSearchTool', () => { diff --git a/packages/agents/package.json b/packages/agents/package.json index d79d6eca..9f16526d 100644 --- a/packages/agents/package.json +++ b/packages/agents/package.json @@ -34,7 +34,7 @@ "@openai/agents-openai": "workspace:*", "@openai/agents-realtime": "workspace:*", "debug": "^4.4.0", - "openai": "^5.12.2" + "openai": "^5.16.0" }, "keywords": [ "openai", diff --git a/packages/agents/src/metadata.ts b/packages/agents/src/metadata.ts index c1c86a6f..5bdcedd2 100644 --- a/packages/agents/src/metadata.ts +++ b/packages/agents/src/metadata.ts @@ -9,7 +9,7 @@ export const METADATA = { "@openai/agents-core": "workspace:*", "@openai/agents-openai": "workspace:*", "@openai/agents-realtime": "workspace:*", - "openai": "^5.12.2" + "openai": "^5.16.0" } }; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 83806938..19cdc429 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -198,9 +198,6 @@ importers: '@openai/agents-realtime': specifier: workspace:* version: link:../../packages/agents-realtime - openai: - specifier: ^5.12.2 - version: 5.12.2(ws@8.18.2)(zod@3.25.62) server-only: specifier: ^0.0.1 version: 0.0.1 @@ -452,8 +449,8 @@ importers: specifier: ^4.4.0 version: 4.4.1 openai: - specifier: ^5.12.2 - version: 5.12.2(ws@8.18.2)(zod@3.25.62) + specifier: ^5.16.0 + version: 5.16.0(ws@8.18.2)(zod@3.25.62) devDependencies: '@types/debug': specifier: ^4.1.12 @@ -468,8 +465,8 @@ importers: specifier: ^4.4.0 version: 4.4.1 openai: - specifier: ^5.12.2 - version: 5.12.2(ws@8.18.2)(zod@3.25.62) + specifier: ^5.16.0 + version: 5.16.0(ws@8.18.2)(zod@3.25.62) devDependencies: '@types/debug': specifier: ^4.1.12 @@ -516,8 +513,8 @@ importers: specifier: ^4.4.0 version: 4.4.1 openai: - specifier: ^5.12.2 - version: 5.12.2(ws@8.18.2)(zod@3.25.62) + specifier: ^5.16.0 + version: 5.16.0(ws@8.18.2)(zod@3.25.62) devDependencies: '@ai-sdk/provider': specifier: ^1.1.3 @@ -4766,8 +4763,8 @@ packages: oniguruma-to-es@4.3.3: resolution: {integrity: sha512-rPiZhzC3wXwE59YQMRDodUwwT9FZ9nNBwQQfsd1wfdtlKEyCdRV0avrTcSZ5xlIvGRVPd/cx6ZN45ECmS39xvg==} - openai@5.12.2: - resolution: {integrity: sha512-xqzHHQch5Tws5PcKR2xsZGX9xtch+JQFz5zb14dGqlshmmDAFBFEWmeIpf7wVqWV+w7Emj7jRgkNJakyKE0tYQ==} + openai@5.16.0: + resolution: {integrity: sha512-hoEH8ZNvg1HXjU9mp88L/ZH8O082Z8r6FHCXGiWAzVRrEv443aI57qhch4snu07yQydj+AUAWLenAiBXhu89Tw==} hasBin: true peerDependencies: ws: ^8.18.0 @@ -11082,7 +11079,7 @@ snapshots: regex: 6.0.1 regex-recursion: 6.0.2 - openai@5.12.2(ws@8.18.2)(zod@3.25.62): + openai@5.16.0(ws@8.18.2)(zod@3.25.62): optionalDependencies: ws: 8.18.2 zod: 3.25.62 From 84afd035f862184bddf897bea7c876720160ce55 Mon Sep 17 00:00:00 2001 From: Kazuhiro Sera Date: Thu, 28 Aug 2025 10:07:21 +0900 Subject: [PATCH 2/3] Add changeset --- .changeset/two-hotels-do.md | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 .changeset/two-hotels-do.md diff --git a/.changeset/two-hotels-do.md b/.changeset/two-hotels-do.md new file mode 100644 index 00000000..e54553ab --- /dev/null +++ b/.changeset/two-hotels-do.md @@ -0,0 +1,7 @@ +--- +'@openai/agents-openai': patch +'@openai/agents-core': patch +'@openai/agents': patch +--- + +Fix #393 add domain filtering and sources to web search tool & upgrade openai package to the latest version From 1ced6babf7a688aa812be4080066b9020f190a76 Mon Sep 17 00:00:00 2001 From: Kazuhiro Sera Date: Thu, 28 Aug 2025 14:58:55 +0900 Subject: [PATCH 3/3] Update .changeset/two-hotels-do.md --- .changeset/two-hotels-do.md | 1 - 1 file changed, 1 deletion(-) diff --git a/.changeset/two-hotels-do.md b/.changeset/two-hotels-do.md index e54553ab..f948983c 100644 --- a/.changeset/two-hotels-do.md +++ b/.changeset/two-hotels-do.md @@ -1,7 +1,6 @@ --- '@openai/agents-openai': patch '@openai/agents-core': patch -'@openai/agents': patch --- Fix #393 add domain filtering and sources to web search tool & upgrade openai package to the latest version