From 544c3f6801f0587407751263fffab7bfd4dacb6b Mon Sep 17 00:00:00 2001 From: Paul Tran-Van Date: Tue, 24 Mar 2026 16:03:39 +0100 Subject: [PATCH 1/2] feat: Add websearch toggle to AI chat input Add an optional websearch feature to RAG search. When enabled, the search will leverage user document and perform web search to combine sources. This feature is hidden behind a `cozy.assistant.websearch.enabled` flag --- .../src/components/AssistantProvider.d.ts | 2 + .../src/components/AssistantProvider.jsx | 8 ++- .../Conversations/ConversationBar.jsx | 57 ++++++++++++------- .../Conversations/ConversationComposer.jsx | 9 ++- .../Conversations/WebsearchButton.jsx | 37 ++++++++++++ .../CozyAssistantRuntimeProvider.tsx | 8 +-- .../adapters/CozyRealtimeChatAdapter.ts | 15 ++++- packages/cozy-search/src/locales/en.json | 3 + packages/cozy-search/src/locales/fr.json | 3 + 9 files changed, 111 insertions(+), 31 deletions(-) create mode 100644 packages/cozy-search/src/components/Conversations/WebsearchButton.jsx diff --git a/packages/cozy-search/src/components/AssistantProvider.d.ts b/packages/cozy-search/src/components/AssistantProvider.d.ts index 67773756c7..9d158bf47c 100644 --- a/packages/cozy-search/src/components/AssistantProvider.d.ts +++ b/packages/cozy-search/src/components/AssistantProvider.d.ts @@ -25,6 +25,8 @@ export interface AssistantContextValue { setSelectedTwakeKnowledge: React.Dispatch< React.SetStateAction > + websearchEnabled: boolean + setWebsearchEnabled: React.Dispatch> } export function useAssistant(): AssistantContextValue diff --git a/packages/cozy-search/src/components/AssistantProvider.jsx b/packages/cozy-search/src/components/AssistantProvider.jsx index b9cb2b6ff1..523e76e9a1 100644 --- a/packages/cozy-search/src/components/AssistantProvider.jsx +++ b/packages/cozy-search/src/components/AssistantProvider.jsx @@ -32,6 +32,7 @@ const AssistantProvider = ({ children }) => { chat: [] }) const [openedKnowledgePanel, setOpenedKnowledgePanel] = useState(null) + const [websearchEnabled, setWebsearchEnabled] = useState(false) const value = useMemo( () => ({ @@ -50,7 +51,9 @@ const AssistantProvider = ({ children }) => { setSelectedAssistantId, setIsOpenSearchConversation, setOpenedKnowledgePanel, - setSelectedTwakeKnowledge + setSelectedTwakeKnowledge, + websearchEnabled, + setWebsearchEnabled }), [ isOpenCreateAssistant, @@ -60,7 +63,8 @@ const AssistantProvider = ({ children }) => { selectedAssistantId, isOpenSearchConversation, openedKnowledgePanel, - selectedTwakeKnowledge + selectedTwakeKnowledge, + websearchEnabled ] ) diff --git a/packages/cozy-search/src/components/Conversations/ConversationBar.jsx b/packages/cozy-search/src/components/Conversations/ConversationBar.jsx index fe73208e51..3c0d8e03bd 100644 --- a/packages/cozy-search/src/components/Conversations/ConversationBar.jsx +++ b/packages/cozy-search/src/components/Conversations/ConversationBar.jsx @@ -12,6 +12,7 @@ import useEventListener from 'cozy-ui/transpiled/react/hooks/useEventListener' import { useBreakpoints } from 'cozy-ui/transpiled/react/providers/Breakpoints' import { useI18n } from 'twake-i18n' +import WebsearchButton from './WebsearchButton' import styles from './styles.styl' const ConversationBar = ({ @@ -21,6 +22,8 @@ const ConversationBar = ({ onKeyDown, onSend, onCancel, + websearchEnabled, + onToggleWebsearch, ...props }) => { const { t } = useI18n() @@ -74,29 +77,39 @@ const ConversationBar = ({ }, autoFocus: !isMobile, inputComponent: ComposerPrimitive.Input, - endAdornment: isRunning ? ( - -