diff --git a/src/renderer/src/pages/home/Inputbar/WebSearchButton.tsx b/src/renderer/src/pages/home/Inputbar/WebSearchButton.tsx index 70b25084d5..3d84ef690a 100644 --- a/src/renderer/src/pages/home/Inputbar/WebSearchButton.tsx +++ b/src/renderer/src/pages/home/Inputbar/WebSearchButton.tsx @@ -28,48 +28,62 @@ const WebSearchButton: FC = ({ ref, assistant, ToolbarButton }) => { const { providers } = useWebSearchProviders() const { updateAssistant } = useAssistant(assistant.id) + // 注意:assistant.enableWebSearch 有不同的语义 + /** 表示是否启用网络搜索 */ const enableWebSearch = assistant?.webSearchProviderId || assistant.enableWebSearch const WebSearchIcon = useCallback( - ({ pid, size = 18 }: { pid?: WebSearchProviderId; size?: number }) => { - const iconColor = enableWebSearch ? 'var(--color-primary)' : 'var(--color-icon)' - + ({ pid, size = 18, color }: { pid?: WebSearchProviderId; size?: number; color?: string }) => { switch (pid) { case 'bocha': - return + return case 'exa': // size微调,视觉上和其他图标平衡一些 - return + return case 'tavily': - return + return case 'searxng': - return + return case 'local-baidu': - return + return case 'local-bing': - return + return case 'local-google': - return + return default: - return + return } }, [enableWebSearch] ) - const updateSelectedWebSearchProvider = useCallback( + const updateWebSearchProvider = useCallback( async (providerId?: WebSearchProvider['id']) => { // TODO: updateAssistant有性能问题,会导致关闭快捷面板卡顿 - const currentWebSearchProviderId = assistant.webSearchProviderId - const newWebSearchProviderId = currentWebSearchProviderId === providerId ? undefined : providerId startTransition(() => { - updateAssistant({ ...assistant, webSearchProviderId: newWebSearchProviderId, enableWebSearch: false }) + updateAssistant({ + ...assistant, + webSearchProviderId: providerId, + enableWebSearch: false + }) }) }, [assistant, updateAssistant] ) - const updateSelectedWebSearchBuiltin = useCallback(async () => { + const updateQuickPanelItem = useCallback( + async (providerId?: WebSearchProvider['id']) => { + // TODO: updateAssistant有性能问题,会导致关闭快捷面板卡顿 + if (providerId === assistant.webSearchProviderId) { + updateWebSearchProvider(undefined) + } else { + updateWebSearchProvider(providerId) + } + }, + [assistant.webSearchProviderId, updateWebSearchProvider] + ) + + const updateToModelBuiltinWebSearch = useCallback(async () => { // TODO: updateAssistant有性能问题,会导致关闭快捷面板卡顿 startTransition(() => { updateAssistant({ ...assistant, webSearchProviderId: undefined, enableWebSearch: !assistant.enableWebSearch }) @@ -90,7 +104,7 @@ const WebSearchButton: FC = ({ ref, assistant, ToolbarButton }) => { icon: , isSelected: p.id === assistant?.webSearchProviderId, disabled: !WebSearchService.isWebSearchEnabled(p.id), - action: () => updateSelectedWebSearchProvider(p.id) + action: () => updateQuickPanelItem(p.id) })) .filter((o) => !o.disabled) @@ -103,7 +117,7 @@ const WebSearchButton: FC = ({ ref, assistant, ToolbarButton }) => { icon: , isSelected: assistant.enableWebSearch, disabled: !isWebSearchModelEnabled, - action: () => updateSelectedWebSearchBuiltin() + action: () => updateToModelBuiltinWebSearch() }) } @@ -115,36 +129,18 @@ const WebSearchButton: FC = ({ ref, assistant, ToolbarButton }) => { assistant?.webSearchProviderId, providers, t, - updateSelectedWebSearchBuiltin, - updateSelectedWebSearchProvider + updateQuickPanelItem, + updateToModelBuiltinWebSearch ]) const openQuickPanel = useCallback(() => { - if (assistant.webSearchProviderId) { - updateSelectedWebSearchProvider(undefined) - return - } - - if (assistant.enableWebSearch) { - updateSelectedWebSearchBuiltin() - return - } - quickPanel.open({ title: t('chat.input.web_search.label'), list: providerItems, symbol: '?', pageSize: 9 }) - }, [ - assistant.webSearchProviderId, - assistant.enableWebSearch, - quickPanel, - t, - providerItems, - updateSelectedWebSearchProvider, - updateSelectedWebSearchBuiltin - ]) + }, [quickPanel, t, providerItems]) const handleOpenQuickPanel = useCallback(() => { if (quickPanel.isVisible && quickPanel.symbol === '?') { @@ -154,18 +150,28 @@ const WebSearchButton: FC = ({ ref, assistant, ToolbarButton }) => { } }, [openQuickPanel, quickPanel]) + const onClick = useCallback(() => { + if (enableWebSearch) { + updateWebSearchProvider(undefined) + } else { + handleOpenQuickPanel() + } + }, [enableWebSearch, handleOpenQuickPanel, updateWebSearchProvider]) + useImperativeHandle(ref, () => ({ openQuickPanel })) + const color = enableWebSearch ? 'var(--color-primary)' : 'var(--color-icon)' + return ( - - + + ) diff --git a/src/renderer/src/services/ApiService.ts b/src/renderer/src/services/ApiService.ts index e6d2c5655c..415b704225 100644 --- a/src/renderer/src/services/ApiService.ts +++ b/src/renderer/src/services/ApiService.ts @@ -477,8 +477,9 @@ export async function fetchChatCompletion({ assistant.settings?.reasoning_effort !== undefined) || (isReasoningModel(model) && (!isSupportedThinkingTokenModel(model) || !isSupportedReasoningEffortModel(model))) + // NOTE:assistant.enableWebSearch 的语义是是否启用模型内置搜索功能 const enableWebSearch = - (assistant.enableWebSearch && isWebSearchModel(model)) || + (assistant.webSearchProviderId && isWebSearchModel(model)) || isOpenRouterBuiltInWebSearchModel(model) || model.id.includes('sonar') || false