diff --git a/api/apps/sdk/session.py b/api/apps/sdk/session.py index 36b407cea..0468381d3 100644 --- a/api/apps/sdk/session.py +++ b/api/apps/sdk/session.py @@ -934,6 +934,7 @@ async def chatbots_inputs(dialog_id): "title": dialog.name, "avatar": dialog.icon, "prologue": dialog.prompt_config.get("prologue", ""), + "has_tavily_key": bool(dialog.prompt_config.get("tavily_api_key", "").strip()), } ) diff --git a/web/src/components/floating-chat-widget.tsx b/web/src/components/floating-chat-widget.tsx index c63695031..14b85018d 100644 --- a/web/src/components/floating-chat-widget.tsx +++ b/web/src/components/floating-chat-widget.tsx @@ -268,7 +268,7 @@ const FloatingChatWidget = () => { // Wait for state to update, then send setTimeout(() => { - handlePressEnter({ enableThinking: false }); + handlePressEnter({ enableThinking: false, enableInternet: false }); // Clear our local input after sending setInputValue(''); }, 50); diff --git a/web/src/components/message-input/next.tsx b/web/src/components/message-input/next.tsx index 20f8e88db..972f7eb3e 100644 --- a/web/src/components/message-input/next.tsx +++ b/web/src/components/message-input/next.tsx @@ -16,7 +16,15 @@ import { Button } from '@/components/ui/button'; import { Textarea } from '@/components/ui/textarea'; import { cn } from '@/lib/utils'; import { t } from 'i18next'; -import { CircleStop, Paperclip, Send, Upload, X } from 'lucide-react'; +import { + Atom, + CircleStop, + Globe, + Paperclip, + Send, + Upload, + X, +} from 'lucide-react'; import * as React from 'react'; import { useCallback, useEffect, useState } from 'react'; import { toast } from 'sonner'; @@ -32,13 +40,20 @@ interface NextMessageInputProps { isShared?: boolean; showUploadIcon?: boolean; isUploading?: boolean; - onPressEnter({ enableThinking }: { enableThinking: boolean }): void; + onPressEnter({ + enableThinking, + enableInternet, + }: { + enableThinking: boolean; + enableInternet: boolean; + }): void; onInputChange: React.ChangeEventHandler; createConversationBeforeUploadDocument?(message: string): Promise; stopOutputMessage?(): void; onUpload?: NonNullable; removeFile?(file: File): void; showReasoning?: boolean; + showInternet?: boolean; } export type NextMessageInputOnPressEnterParameter = Parameters< @@ -58,6 +73,7 @@ export function NextMessageInput({ onPressEnter, removeFile, showReasoning = false, + showInternet = false, }: NextMessageInputProps) { const [files, setFiles] = React.useState([]); const [audioInputValue, setAudioInputValue] = React.useState( @@ -65,11 +81,23 @@ export function NextMessageInput({ ); const [enableThinking, setEnableThinking] = useState(false); + const [enableInternet, setEnableInternet] = useState(false); const handleThinkingToggle = useCallback(() => { setEnableThinking((prev) => !prev); }, []); + const handleInternetToggle = useCallback(() => { + setEnableInternet((prev) => !prev); + }, []); + + const pressEnter = useCallback(() => { + onPressEnter({ + enableThinking, + enableInternet: showInternet ? enableInternet : false, + }); + }, [onPressEnter, enableThinking, enableInternet, showInternet]); + useEffect(() => { if (audioInputValue !== null) { onInputChange({ @@ -77,11 +105,19 @@ export function NextMessageInput({ } as React.ChangeEvent); setTimeout(() => { - onPressEnter({ enableThinking }); + pressEnter(); setAudioInputValue(null); }, 0); } - }, [audioInputValue, onInputChange, onPressEnter, enableThinking]); + }, [ + audioInputValue, + onInputChange, + onPressEnter, + enableThinking, + enableInternet, + showInternet, + pressEnter, + ]); const onFileReject = React.useCallback((file: File, message: string) => { toast(message, { @@ -91,9 +127,9 @@ export function NextMessageInput({ const submit = React.useCallback(() => { if (isUploading) return; - onPressEnter({ enableThinking }); + pressEnter(); setFiles([]); - }, [isUploading, onPressEnter, enableThinking]); + }, [isUploading, pressEnter]); const handleKeyDown = (e: React.KeyboardEvent) => { if (e.key === 'Enter' && !e.shiftKey) { @@ -205,9 +241,25 @@ export function NextMessageInput({ )} onClick={handleThinkingToggle} > + Thinking )} + {showInternet && ( + + )} {sendLoading ? (