cherry-studio/src/renderer/src/services/WebSearchService.ts
SuYao 7a917168e0 feat(websearch): add overwrite functionality for search service (#4530)
* feat(websearch): add overwrite functionality for search service

- Introduced new settings to allow users to override the default search service.
- Updated localization files for English, Japanese, Russian, Simplified Chinese, and Traditional Chinese to include new overwrite options and tooltips.
- Modified relevant components and services to support the new overwrite feature in the web search settings.

* feat(websearch): enhance web search model integration

* chore(websearch): unnecessary return
2025-04-08 20:07:00 +08:00

131 lines
3.8 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import WebSearchEngineProvider from '@renderer/providers/WebSearchProvider'
import store from '@renderer/store'
import { setDefaultProvider, WebSearchState } from '@renderer/store/websearch'
import { WebSearchProvider, WebSearchResponse } from '@renderer/types'
import { hasObjectKey } from '@renderer/utils'
import dayjs from 'dayjs'
/**
* 提供网络搜索相关功能的服务类
*/
class WebSearchService {
/**
* 获取当前存储的网络搜索状态
* @private
* @returns 网络搜索状态
*/
private getWebSearchState(): WebSearchState {
return store.getState().websearch
}
/**
* 检查网络搜索功能是否启用
* @public
* @returns 如果默认搜索提供商已启用则返回true否则返回false
*/
public isWebSearchEnabled(): boolean {
const { defaultProvider, providers } = this.getWebSearchState()
const provider = providers.find((provider) => provider.id === defaultProvider)
if (!provider) {
return false
}
if (hasObjectKey(provider, 'apiKey')) {
return provider.apiKey !== ''
}
if (hasObjectKey(provider, 'apiHost')) {
return provider.apiHost !== ''
}
return false
}
/**
* 检查是否启用搜索增强模式
* @public
* @returns 如果启用搜索增强模式则返回true否则返回false
*/
public isEnhanceModeEnabled(): boolean {
const { enhanceMode } = this.getWebSearchState()
return enhanceMode
}
/**
* 检查是否启用覆盖搜索
* @public
* @returns 如果启用覆盖搜索则返回true否则返回false
*/
public isOverwriteEnabled(): boolean {
const { overwrite } = this.getWebSearchState()
return overwrite
}
/**
* 获取当前默认的网络搜索提供商
* @public
* @returns 网络搜索提供商
* @throws 如果找不到默认提供商则抛出错误
*/
public getWebSearchProvider(): WebSearchProvider {
const { defaultProvider, providers } = this.getWebSearchState()
let provider = providers.find((provider) => provider.id === defaultProvider)
if (!provider) {
provider = providers[0]
if (provider) {
// 可选:自动更新默认提供商
store.dispatch(setDefaultProvider(provider.id))
} else {
throw new Error(`No web search providers available`)
}
}
return provider
}
/**
* 使用指定的提供商执行网络搜索
* @public
* @param provider 搜索提供商
* @param query 搜索查询
* @returns 搜索响应
*/
public async search(provider: WebSearchProvider, query: string): Promise<WebSearchResponse> {
const { searchWithTime, maxResults, excludeDomains } = this.getWebSearchState()
const webSearchEngine = new WebSearchEngineProvider(provider)
let formattedQuery = query
if (searchWithTime) {
formattedQuery = `today is ${dayjs().format('YYYY-MM-DD')} \r\n ${query}`
}
try {
return await webSearchEngine.search(formattedQuery, maxResults, excludeDomains)
} catch (error) {
console.error('Search failed:', error)
throw new Error(`Search failed: ${error instanceof Error ? error.message : 'Unknown error'}`)
}
}
/**
* 检查搜索提供商是否正常工作
* @public
* @param provider 要检查的搜索提供商
* @returns 如果提供商可用返回true否则返回false
*/
public async checkSearch(provider: WebSearchProvider): Promise<{ valid: boolean; error?: any }> {
try {
const response = await this.search(provider, 'test query')
console.log('Search response:', response)
// 优化的判断条件:检查结果是否有效且没有错误
return { valid: response.results !== undefined, error: undefined }
} catch (error) {
return { valid: false, error }
}
}
}
export default new WebSearchService()