From 2c4a78094a671009eba112366f955d7bb85d77f3 Mon Sep 17 00:00:00 2001 From: Danny Avila Date: Sun, 3 May 2026 23:01:23 -0400 Subject: [PATCH] =?UTF-8?q?=F0=9F=9B=82=20refactor:=20Avoid=20Default=20Ta?= =?UTF-8?q?vily=20Safe=20Search=20(#12939)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- librechat.example.yaml | 2 +- packages/api/src/web/web.spec.ts | 2 ++ packages/api/src/web/web.ts | 15 +++++++++------ 3 files changed, 12 insertions(+), 7 deletions(-) diff --git a/librechat.example.yaml b/librechat.example.yaml index 98de2c6541..1b8fa43ee8 100644 --- a/librechat.example.yaml +++ b/librechat.example.yaml @@ -651,7 +651,7 @@ endpoints: # # includeImages: true # Include images in results # # includeFavicon: true # Include favicon URL for each result # # chunksPerSource: 3 # Chunks per source, only with 'advanced' depth (1-3) -# # safeSearch: false # Override Tavily safe search filtering +# # safeSearch: false # Override Tavily safe_search filtering (true is enterprise-only) # # includeDomains: # Restrict search to specific domains (max 300) # # - 'example.com' # # - 'docs.example.com' diff --git a/packages/api/src/web/web.spec.ts b/packages/api/src/web/web.spec.ts index 81f9a087b4..6bd184f58e 100644 --- a/packages/api/src/web/web.spec.ts +++ b/packages/api/src/web/web.spec.ts @@ -129,6 +129,7 @@ describe('web.ts', () => { expect(result.authResult).toHaveProperty('searchProvider', 'serper'); expect(result.authResult).toHaveProperty('scraperProvider', 'firecrawl'); expect(['jina', 'cohere']).toContain(result.authResult.rerankerType as string); + expect(result.authResult.safeSearch).toBe(SafeSearchTypes.MODERATE); }); it('should return authenticated=false when a required category is not authenticated', async () => { @@ -774,6 +775,7 @@ describe('web.ts', () => { expect(result.authResult.tavilyApiKey).toBe('tavily-api-key'); expect(result.authResult.tavilySearchUrl).toBe('https://api.tavily.com/search'); expect(result.authResult.tavilySearchOptions).toEqual(webSearchConfig.tavilySearchOptions); + expect(result.authResult.safeSearch).toBeUndefined(); }); it('should fail authentication when Tavily search API key is missing', async () => { diff --git a/packages/api/src/web/web.ts b/packages/api/src/web/web.ts index 59d071a8d7..b73e846a57 100644 --- a/packages/api/src/web/web.ts +++ b/packages/api/src/web/web.ts @@ -2,14 +2,14 @@ import { AuthType, SafeSearchTypes, SearchCategories, + SearchProviders, + ScraperProviders, extractVariableName, } from 'librechat-data-provider'; import { webSearchAuth } from '@librechat/data-schemas'; import type { RerankerTypes, TCustomConfig, - SearchProviders, - ScraperProviders, TWebSearchConfig, } from 'librechat-data-provider'; import type { TWebSearchKeys, TWebSearchCategories } from '@librechat/data-schemas'; @@ -248,15 +248,18 @@ export async function loadWebSearchAuth({ } const scraperProvider = - authResult.scraperProvider ?? webSearchConfig?.scraperProvider ?? 'firecrawl'; + authResult.scraperProvider ?? webSearchConfig?.scraperProvider ?? ScraperProviders.FIRECRAWL; let scraperOptionsTimeout: number | undefined; - if (scraperProvider === 'tavily') { + if (scraperProvider === ScraperProviders.TAVILY) { scraperOptionsTimeout = webSearchConfig?.tavilyScraperOptions?.timeout; - } else if (scraperProvider === 'firecrawl') { + } else if (scraperProvider === ScraperProviders.FIRECRAWL) { scraperOptionsTimeout = webSearchConfig?.firecrawlOptions?.timeout; } - authResult.safeSearch = webSearchConfig?.safeSearch ?? SafeSearchTypes.MODERATE; + const searchProvider = authResult.searchProvider ?? webSearchConfig?.searchProvider; + if (searchProvider !== SearchProviders.TAVILY) { + authResult.safeSearch = webSearchConfig?.safeSearch ?? SafeSearchTypes.MODERATE; + } authResult.scraperTimeout = webSearchConfig?.scraperTimeout ?? scraperOptionsTimeout ?? 7500; authResult.firecrawlOptions = webSearchConfig?.firecrawlOptions; authResult.tavilySearchOptions = webSearchConfig?.tavilySearchOptions;