cherry-studio/src/renderer/src/store/websearch.ts
LiuVaayne c8fc4b85e6 feat(search): support using google as default search provider (#4569)
* feat(websearch): implement search window functionality and enhance search service

* feat(DefaultProvider): integrate @mozilla/readability for improved content parsing

* Add LocalSearchProvider for web page scraping

AI: Change `provider` from private to protected in BaseWebSearchProvider and implement LocalSearchProvider for web searching with browser-based content extraction.

* Add web search provider management features

Implement addWebSearchProvider function to prevent duplicates,
automatically load default providers on initialization, fix
LocalSearchProvider implementation, and update local provider
identification logic.

* Improve web search with specialized search engine parsers

Add dedicated parsers for Google, Bing, and Baidu search results,
replacing the generic URL extraction approach. Enhance page loading
with proper wait mechanisms and window cleanup. Remove DuckDuckGo
provider as it's no longer supported.

* Simplify DefaultProvider to unimplemented placeholder

* Remove default search engine from initial state

* Improve web search providers config and display

Add configuration for local search providers, remove empty apiKey fields,
and enhance the UI by sorting providers alphabetically and showing
whether they require an API key.

* Add stderr logging for MCP servers

* Make search window initially hidden
2025-04-10 12:29:09 +08:00

124 lines
3.3 KiB
TypeScript

import { createSlice, PayloadAction } from '@reduxjs/toolkit'
import type { WebSearchProvider } from '@renderer/types'
export interface WebSearchState {
// 默认搜索提供商的ID
defaultProvider: string
// 所有可用的搜索提供商列表
providers: WebSearchProvider[]
// 是否在搜索查询中添加当前日期
searchWithTime: boolean
// 搜索结果的最大数量
maxResults: number
// 要排除的域名列表
excludeDomains: string[]
// 是否启用搜索增强模式
enhanceMode: boolean
// 是否覆盖服务商搜索
overwrite: boolean
}
const initialState: WebSearchState = {
defaultProvider: '',
providers: [
{
id: 'tavily',
name: 'Tavily',
apiKey: ''
},
{
id: 'searxng',
name: 'Searxng',
apiHost: ''
},
{
id: 'exa',
name: 'Exa',
apiKey: ''
},
{
id: 'local-google',
name: 'Google',
url: 'https://www.google.com/search?q=%s'
},
{
id: 'local-bing',
name: 'Bing',
url: 'https://cn.bing.com/search?q=%s&ensearch=1'
},
{
id: 'local-baidu',
name: 'Baidu',
url: 'https://www.baidu.com/s?wd=%s'
}
],
searchWithTime: true,
maxResults: 5,
excludeDomains: [],
enhanceMode: false,
overwrite: false
}
export const defaultWebSearchProviders = initialState.providers
const websearchSlice = createSlice({
name: 'websearch',
initialState,
reducers: {
setDefaultProvider: (state, action: PayloadAction<string>) => {
state.defaultProvider = action.payload
},
setWebSearchProviders: (state, action: PayloadAction<WebSearchProvider[]>) => {
state.providers = action.payload
},
updateWebSearchProviders: (state, action: PayloadAction<WebSearchProvider[]>) => {
state.providers = action.payload
},
updateWebSearchProvider: (state, action: PayloadAction<WebSearchProvider>) => {
const index = state.providers.findIndex((provider) => provider.id === action.payload.id)
if (index !== -1) {
state.providers[index] = action.payload
}
},
setSearchWithTime: (state, action: PayloadAction<boolean>) => {
state.searchWithTime = action.payload
},
setMaxResult: (state, action: PayloadAction<number>) => {
state.maxResults = action.payload
},
setExcludeDomains: (state, action: PayloadAction<string[]>) => {
state.excludeDomains = action.payload
},
setEnhanceMode: (state, action: PayloadAction<boolean>) => {
state.enhanceMode = action.payload
},
setOverwrite: (state, action: PayloadAction<boolean>) => {
state.overwrite = action.payload
},
addWebSearchProvider: (state, action: PayloadAction<WebSearchProvider>) => {
// Check if provider with same ID already exists
const exists = state.providers.some((provider) => provider.id === action.payload.id)
if (!exists) {
// Add the new provider to the array
state.providers.push(action.payload)
}
}
}
})
export const {
setWebSearchProviders,
updateWebSearchProvider,
updateWebSearchProviders,
setDefaultProvider,
setSearchWithTime,
setExcludeDomains,
setMaxResult,
setEnhanceMode,
setOverwrite,
addWebSearchProvider
} = websearchSlice.actions
export default websearchSlice.reducer