diff --git a/web/src/components/large-model-form-field.tsx b/web/src/components/large-model-form-field.tsx index 5647c6864..a37ae6f47 100644 --- a/web/src/components/large-model-form-field.tsx +++ b/web/src/components/large-model-form-field.tsx @@ -96,3 +96,22 @@ export function LargeModelFormField() { ); } + +export function LargeModelFormFieldWithoutFilter() { + const form = useFormContext(); + + return ( + ( + + + + + + + )} + /> + ); +} diff --git a/web/src/components/llm-setting-items/next.tsx b/web/src/components/llm-setting-items/next.tsx index 51a332dd4..64c837393 100644 --- a/web/src/components/llm-setting-items/next.tsx +++ b/web/src/components/llm-setting-items/next.tsx @@ -78,7 +78,6 @@ export function LlmSettingFieldItems({ {t('model')} diff --git a/web/src/pages/next-chats/chat/chat-box/multiple-chat-box.tsx b/web/src/pages/next-chats/chat/chat-box/multiple-chat-box.tsx index d03b64a3b..4d7b4b411 100644 --- a/web/src/pages/next-chats/chat/chat-box/multiple-chat-box.tsx +++ b/web/src/pages/next-chats/chat/chat-box/multiple-chat-box.tsx @@ -2,6 +2,11 @@ import { NextMessageInput } from '@/components/message-input/next'; import MessageItem from '@/components/message-item'; import { Button } from '@/components/ui/button'; import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card'; +import { + Tooltip, + TooltipContent, + TooltipTrigger, +} from '@/components/ui/tooltip'; import { MessageType } from '@/constants/chat'; import { useFetchConversation, @@ -10,7 +15,7 @@ import { } from '@/hooks/use-chat-request'; import { useFetchUserInfo } from '@/hooks/user-setting-hooks'; import { buildMessageUuidWithRole } from '@/utils/chat'; -import { Trash2 } from 'lucide-react'; +import { ListCheck, Plus, Trash2 } from 'lucide-react'; import { useCallback } from 'react'; import { useGetSendButtonDisabled, @@ -19,19 +24,30 @@ import { import { useCreateConversationBeforeUploadDocument } from '../../hooks/use-create-conversation'; import { useSendMessage } from '../../hooks/use-send-chat-message'; import { buildMessageItemReference } from '../../utils'; +import { LLMSelectForm } from '../llm-select-form'; import { useAddChatBox } from '../use-add-box'; type MultipleChatBoxProps = { controller: AbortController; chatBoxIds: string[]; -} & Pick, 'removeChatBox'>; - -type ChatCardProps = { id: string } & Pick< - MultipleChatBoxProps, - 'controller' | 'removeChatBox' +} & Pick< + ReturnType, + 'removeChatBox' | 'addChatBox' | 'chatBoxIds' >; -function ChatCard({ controller, removeChatBox, id }: ChatCardProps) { +type ChatCardProps = { id: string; idx: number } & Pick< + MultipleChatBoxProps, + 'controller' | 'removeChatBox' | 'addChatBox' | 'chatBoxIds' +>; + +function ChatCard({ + controller, + removeChatBox, + id, + idx, + addChatBox, + chatBoxIds, +}: ChatCardProps) { const { value, // scrollRef, @@ -49,6 +65,8 @@ function ChatCard({ controller, removeChatBox, id }: ChatCardProps) { const { data: currentDialog } = useFetchDialog(); const { data: conversation } = useFetchConversation(); + const isLatestChat = idx === chatBoxIds.length - 1; + const handleRemoveChatBox = useCallback(() => { removeChatBox(id); }, [id, removeChatBox]); @@ -57,15 +75,31 @@ function ChatCard({ controller, removeChatBox, id }: ChatCardProps) { -
- Card Title - +
+ {idx + 1} + +
+
+ + + + + +

Apply model configs

+
+
+ {!isLatestChat || chatBoxIds.length === 3 ? ( + + ) : ( + + )}
- @@ -111,6 +145,7 @@ export function MultipleChatBox({ controller, chatBoxIds, removeChatBox, + addChatBox, }: MultipleChatBoxProps) { const { value, @@ -125,31 +160,37 @@ export function MultipleChatBox({ const { conversationId } = useGetChatSearchParams(); const disabled = useGetSendButtonDisabled(); const sendDisabled = useSendButtonDisabled(value); + return ( -
-
- {chatBoxIds.map((id) => ( +
+
+ {chatBoxIds.map((id, idx) => ( ))}
- +
+ +
); } diff --git a/web/src/pages/next-chats/chat/index.tsx b/web/src/pages/next-chats/chat/index.tsx index 8860bb791..195736698 100644 --- a/web/src/pages/next-chats/chat/index.tsx +++ b/web/src/pages/next-chats/chat/index.tsx @@ -11,21 +11,25 @@ import { Button } from '@/components/ui/button'; import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card'; import { useSetModalState } from '@/hooks/common-hooks'; import { useNavigatePage } from '@/hooks/logic-hooks/navigate-hooks'; -import { useFetchDialog } from '@/hooks/use-chat-request'; +import { useFetchConversation, useFetchDialog } from '@/hooks/use-chat-request'; import { cn } from '@/lib/utils'; -import { Plus } from 'lucide-react'; +import { ArrowUpRight, LogOut } from 'lucide-react'; import { useTranslation } from 'react-i18next'; import { useHandleClickConversationCard } from '../hooks/use-click-card'; import { ChatSettings } from './app-settings/chat-settings'; import { MultipleChatBox } from './chat-box/multiple-chat-box'; import { SingleChatBox } from './chat-box/single-chat-box'; +import { LLMSelectForm } from './llm-select-form'; import { Sessions } from './sessions'; import { useAddChatBox } from './use-add-box'; +import { useSwitchDebugMode } from './use-switch-debug-mode'; export default function Chat() { const { navigateToChatList } = useNavigatePage(); const { data } = useFetchDialog(); const { t } = useTranslation(); + const { data: conversation } = useFetchConversation(); + const { handleConversationCardClick, controller } = useHandleClickConversationCard(); const { visible: settingVisible, switchVisible: switchSettingVisible } = @@ -38,6 +42,29 @@ export default function Chat() { hasThreeChatBox, } = useAddChatBox(); + const { isDebugMode, switchDebugMode } = useSwitchDebugMode(); + + if (isDebugMode) { + return ( +
+
+ + Multiple Models ({chatBoxIds.length}/3) + + +
+ +
+ ); + } + return (
@@ -57,6 +84,7 @@ export default function Chat() {
@@ -67,32 +95,23 @@ export default function Chat() { - -
- Card Title - + +
+ {conversation.name} +
+
- {hasSingleChatBox ? ( - - ) : ( - - )} + {settingVisible && ( diff --git a/web/src/pages/next-chats/chat/llm-select-form.tsx b/web/src/pages/next-chats/chat/llm-select-form.tsx new file mode 100644 index 000000000..fce44749d --- /dev/null +++ b/web/src/pages/next-chats/chat/llm-select-form.tsx @@ -0,0 +1,23 @@ +import { LargeModelFormFieldWithoutFilter } from '@/components/large-model-form-field'; +import { LlmSettingSchema } from '@/components/llm-setting-items/next'; +import { Form } from '@/components/ui/form'; +import { zodResolver } from '@hookform/resolvers/zod'; +import { useForm } from 'react-hook-form'; +import { z } from 'zod'; + +export function LLMSelectForm() { + const FormSchema = z.object(LlmSettingSchema); + + const form = useForm>({ + resolver: zodResolver(FormSchema), + defaultValues: { + llm_id: '', + }, + }); + + return ( +
+ +
+ ); +} diff --git a/web/src/pages/next-chats/chat/sessions.tsx b/web/src/pages/next-chats/chat/sessions.tsx index 6562f8b50..a8a54c94b 100644 --- a/web/src/pages/next-chats/chat/sessions.tsx +++ b/web/src/pages/next-chats/chat/sessions.tsx @@ -17,8 +17,9 @@ import { useSelectDerivedConversationList } from '../hooks/use-select-conversati type SessionProps = Pick< ReturnType, 'handleConversationCardClick' -> & { switchSettingVisible(): void }; +> & { switchSettingVisible(): void; hasSingleChatBox: boolean }; export function Sessions({ + hasSingleChatBox, handleConversationCardClick, switchSettingVisible, }: SessionProps) { @@ -91,7 +92,11 @@ export function Sessions({ ))}
-
diff --git a/web/src/pages/next-chats/chat/use-switch-debug-mode.ts b/web/src/pages/next-chats/chat/use-switch-debug-mode.ts new file mode 100644 index 000000000..3966a564a --- /dev/null +++ b/web/src/pages/next-chats/chat/use-switch-debug-mode.ts @@ -0,0 +1,14 @@ +import { useCallback, useState } from 'react'; + +export function useSwitchDebugMode() { + const [isDebugMode, setIsDebugMode] = useState(false); + + const switchDebugMode = useCallback(() => { + setIsDebugMode(!isDebugMode); + }, [isDebugMode]); + + return { + isDebugMode, + switchDebugMode, + }; +}