From e023e5bc441965396732092fc3f55b710e2c7259 Mon Sep 17 00:00:00 2001 From: litongjava <litongjava@qq.com> Date: Sun, 2 Feb 2025 15:10:15 -1000 Subject: [PATCH 01/18] change default theme to light --- ui/components/theme/Provider.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ui/components/theme/Provider.tsx b/ui/components/theme/Provider.tsx index 43e2714..a02f08d 100644 --- a/ui/components/theme/Provider.tsx +++ b/ui/components/theme/Provider.tsx @@ -7,7 +7,7 @@ const ThemeProviderComponent = ({ children: React.ReactNode; }) => { return ( - <ThemeProvider attribute="class" enableSystem={false} defaultTheme="dark"> + <ThemeProvider attribute="class" enableSystem={false} defaultTheme="light"> {children} </ThemeProvider> ); From ee659d9e13fa193f8ec8b52ef5bccefddaef57bf Mon Sep 17 00:00:00 2001 From: litongjava <litongjava@qq.com> Date: Sun, 2 Feb 2025 15:13:27 -1000 Subject: [PATCH 02/18] add mcId --- ui/components/ChatWindow.tsx | 63 +++++++++++++++++++++++++++--------- ui/lib/mcid.ts | 38 ++++++++++++++++++++++ 2 files changed, 85 insertions(+), 16 deletions(-) create mode 100644 ui/lib/mcid.ts diff --git a/ui/components/ChatWindow.tsx b/ui/components/ChatWindow.tsx index b26573f..f37375c 100644 --- a/ui/components/ChatWindow.tsx +++ b/ui/components/ChatWindow.tsx @@ -1,17 +1,18 @@ 'use client'; -import { useEffect, useRef, useState } from 'react'; -import { Document } from '@langchain/core/documents'; +import {useEffect, useRef, useState} from 'react'; +import {Document} from '@langchain/core/documents'; import Navbar from './Navbar'; import Chat from './Chat'; import EmptyChat from './EmptyChat'; import crypto from 'crypto'; -import { toast } from 'sonner'; -import { useSearchParams } from 'next/navigation'; -import { getSuggestions } from '@/lib/actions'; -import { Settings } from 'lucide-react'; +import {toast} from 'sonner'; +import {useSearchParams} from 'next/navigation'; +import {getSuggestions} from '@/lib/actions'; +import {Settings} from 'lucide-react'; import SettingsDialog from './SettingsDialog'; import NextError from 'next/error'; +import {Mcid} from "@/lib/mcid"; export type Message = { messageId: string; @@ -140,7 +141,7 @@ const useSocket = ( if ( Object.keys(chatModelProviders).length > 0 && (((!openAIBaseURL || !openAIPIKey) && - chatModelProvider === 'custom_openai') || + chatModelProvider === 'custom_openai') || !chatModelProviders[chatModelProvider]) ) { const chatModelProvidersKeys = Object.keys(chatModelProviders); @@ -173,7 +174,7 @@ const useSocket = ( Object.keys(chatModelProviders[chatModelProvider]).length > 0 ? chatModelProvider : Object.keys(chatModelProviders)[0] - ], + ], )[0]; localStorage.setItem('chatModel', chatModel); } @@ -382,10 +383,10 @@ const loadMessages = async ( setIsMessagesLoaded(true); }; -const ChatWindow = ({ id }: { id?: string }) => { +const ChatWindow = ({id}: { id?: string }) => { const searchParams = useSearchParams(); const initialMessage = searchParams.get('q'); - + const [userId, setUserId] = useState<string | undefined>(); const [chatId, setChatId] = useState<string | undefined>(id); const [newChatCreated, setNewChatCreated] = useState(false); @@ -417,6 +418,36 @@ const ChatWindow = ({ id }: { id?: string }) => { const [isSettingsOpen, setIsSettingsOpen] = useState(false); + useEffect(() => { + const initializeUserId = () => { + try { + // 从 localStorage 读取现有用户 ID + const storedUserId = localStorage.getItem('userId'); + + if (storedUserId) { + setUserId(storedUserId); + console.debug('Using existing user ID:', storedUserId); + } else { + // 生成新的 MCID + const newUserId = new Mcid().generate().toString(); // 转换为字符串 + + // 存储到 localStorage + localStorage.setItem('userId', newUserId); + setUserId(newUserId); + console.debug('Generated new user ID:', newUserId); + } + } catch (error) { + console.error('Error initializing user ID:', error); + // 生成随机 ID 作为 fallback + const fallbackId = crypto.randomBytes(20).toString('hex'); + localStorage.setItem('userId', fallbackId); + setUserId(fallbackId); + } + }; + + initializeUserId(); + }, []); // 空依赖数组确保只运行一次 + useEffect(() => { if ( chatId && @@ -465,7 +496,7 @@ const ChatWindow = ({ id }: { id?: string }) => { } else { setIsReady(false); } - }, [isMessagesLoaded, isWSReady]); + }, [isMessagesLoaded, isWSReady, userId]); const sendMessage = async (message: string, messageId?: string) => { if (loading) return; @@ -556,7 +587,7 @@ const ChatWindow = ({ id }: { id?: string }) => { setMessages((prev) => prev.map((message) => { if (message.messageId === data.messageId) { - return { ...message, content: message.content + data.data }; + return {...message, content: message.content + data.data}; } return message; @@ -589,7 +620,7 @@ const ChatWindow = ({ id }: { id?: string }) => { setMessages((prev) => prev.map((msg) => { if (msg.messageId === lastMsg.messageId) { - return { ...msg, suggestions: suggestions }; + return {...msg, suggestions: suggestions}; } return msg; }), @@ -639,19 +670,19 @@ const ChatWindow = ({ id }: { id?: string }) => { Failed to connect to the server. Please try again later. </p> </div> - <SettingsDialog isOpen={isSettingsOpen} setIsOpen={setIsSettingsOpen} /> + <SettingsDialog isOpen={isSettingsOpen} setIsOpen={setIsSettingsOpen}/> </div> ); } return isReady ? ( notFound ? ( - <NextError statusCode={404} /> + <NextError statusCode={404}/> ) : ( <div> {messages.length > 0 ? ( <> - <Navbar chatId={chatId!} messages={messages} /> + <Navbar chatId={chatId!} messages={messages}/> <Chat loading={loading} messages={messages} diff --git a/ui/lib/mcid.ts b/ui/lib/mcid.ts new file mode 100644 index 0000000..1a0d0d3 --- /dev/null +++ b/ui/lib/mcid.ts @@ -0,0 +1,38 @@ +// utils/mcid.ts +export class Mcid { + private lastTimestamp = -1; + private sequence = 0; + + constructor(private readonly machineId: number = 0) { + if (machineId < 0 || machineId > 255) { + throw new Error('Machine ID must be between 0 and 255'); + } + } + + generate(): number { + let now = Date.now(); + + if (now < this.lastTimestamp) { + throw new Error('Clock moved backwards'); + } + + if (now === this.lastTimestamp) { + this.sequence = (this.sequence + 1) & 0xf; + if (this.sequence === 0) { + while (now <= this.lastTimestamp) { + now = Date.now(); + } + } + } else { + this.sequence = 0; + } + + this.lastTimestamp = now; + + return ( + (now * 0x1000) + // 时间戳左移 12 位 + (this.machineId * 16) + // 机器 ID 左移 4 位 + this.sequence // 序列号 + ); + } +} From 1a8f59e92b4b0d20806e9aae3f4f8c934608ecbd Mon Sep 17 00:00:00 2001 From: litongjava <litongjava@qq.com> Date: Sun, 2 Feb 2025 15:38:24 -1000 Subject: [PATCH 03/18] add userId --- ui/components/ChatWindow.tsx | 8 ++++++-- ui/components/EmptyChat.tsx | 6 ++++++ ui/components/EmptyChatMessageInput.tsx | 6 +++++- 3 files changed, 17 insertions(+), 3 deletions(-) diff --git a/ui/components/ChatWindow.tsx b/ui/components/ChatWindow.tsx index f37375c..2e0505c 100644 --- a/ui/components/ChatWindow.tsx +++ b/ui/components/ChatWindow.tsx @@ -411,6 +411,7 @@ const ChatWindow = ({id}: { id?: string }) => { const [focusMode, setFocusMode] = useState('webSearch'); const [optimizationMode, setOptimizationMode] = useState('speed'); + const [copilotEnabled, setCopilotEnabled] = useState(true); const [isMessagesLoaded, setIsMessagesLoaded] = useState(false); @@ -468,7 +469,7 @@ const ChatWindow = ({id}: { id?: string }) => { } else if (!chatId) { setNewChatCreated(true); setIsMessagesLoaded(true); - setChatId(crypto.randomBytes(20).toString('hex')); + setChatId(new Mcid().generate().toString()); } // eslint-disable-next-line react-hooks/exhaustive-deps }, []); @@ -512,11 +513,12 @@ const ChatWindow = ({id}: { id?: string }) => { let recievedMessage = ''; let added = false; - messageId = messageId ?? crypto.randomBytes(7).toString('hex'); + messageId = messageId ?? new Mcid().generate().toString(); ws.send( JSON.stringify({ type: 'message', + useerId:userId, message: { messageId: messageId, chatId: chatId!, @@ -699,6 +701,8 @@ const ChatWindow = ({id}: { id?: string }) => { <EmptyChat sendMessage={sendMessage} focusMode={focusMode} + copilotEnabled={copilotEnabled} + setCopilotEnabled={setCopilotEnabled} setFocusMode={setFocusMode} optimizationMode={optimizationMode} setOptimizationMode={setOptimizationMode} diff --git a/ui/components/EmptyChat.tsx b/ui/components/EmptyChat.tsx index c47c301..0acd4ea 100644 --- a/ui/components/EmptyChat.tsx +++ b/ui/components/EmptyChat.tsx @@ -8,6 +8,8 @@ const EmptyChat = ({ sendMessage, focusMode, setFocusMode, + copilotEnabled, + setCopilotEnabled, optimizationMode, setOptimizationMode, fileIds, @@ -18,6 +20,8 @@ const EmptyChat = ({ sendMessage: (message: string) => void; focusMode: string; setFocusMode: (mode: string) => void; + copilotEnabled: boolean; + setCopilotEnabled: (enabled: boolean) => void; optimizationMode: string; setOptimizationMode: (mode: string) => void; fileIds: string[]; @@ -44,6 +48,8 @@ const EmptyChat = ({ sendMessage={sendMessage} focusMode={focusMode} setFocusMode={setFocusMode} + copilotEnabled={copilotEnabled} + setCopilotEnabled={setCopilotEnabled} optimizationMode={optimizationMode} setOptimizationMode={setOptimizationMode} fileIds={fileIds} diff --git a/ui/components/EmptyChatMessageInput.tsx b/ui/components/EmptyChatMessageInput.tsx index 43d1e28..195b8d3 100644 --- a/ui/components/EmptyChatMessageInput.tsx +++ b/ui/components/EmptyChatMessageInput.tsx @@ -11,6 +11,8 @@ const EmptyChatMessageInput = ({ sendMessage, focusMode, setFocusMode, + copilotEnabled, + setCopilotEnabled, optimizationMode, setOptimizationMode, fileIds, @@ -23,12 +25,13 @@ const EmptyChatMessageInput = ({ setFocusMode: (mode: string) => void; optimizationMode: string; setOptimizationMode: (mode: string) => void; + copilotEnabled:boolean + setCopilotEnabled:(mode: boolean) => void; fileIds: string[]; setFileIds: (fileIds: string[]) => void; files: File[]; setFiles: (files: File[]) => void; }) => { - const [copilotEnabled, setCopilotEnabled] = useState(false); const [message, setMessage] = useState(''); const inputRef = useRef<HTMLTextAreaElement | null>(null); @@ -94,6 +97,7 @@ const EmptyChatMessageInput = ({ /> </div> <div className="flex flex-row items-center space-x-1 sm:space-x-4"> + <CopilotToggle setCopilotEnabled={setCopilotEnabled} copilotEnabled={copilotEnabled}/> <Optimization optimizationMode={optimizationMode} setOptimizationMode={setOptimizationMode} From f714645b0c61cc2a95bc1eb04653cc0c07ab99f7 Mon Sep 17 00:00:00 2001 From: litongjava <litongjava@qq.com> Date: Sun, 2 Feb 2025 15:42:08 -1000 Subject: [PATCH 04/18] update fallbackId --- ui/components/ChatWindow.tsx | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/ui/components/ChatWindow.tsx b/ui/components/ChatWindow.tsx index 2e0505c..1be4ec5 100644 --- a/ui/components/ChatWindow.tsx +++ b/ui/components/ChatWindow.tsx @@ -429,25 +429,22 @@ const ChatWindow = ({id}: { id?: string }) => { setUserId(storedUserId); console.debug('Using existing user ID:', storedUserId); } else { - // 生成新的 MCID const newUserId = new Mcid().generate().toString(); // 转换为字符串 - // 存储到 localStorage localStorage.setItem('userId', newUserId); setUserId(newUserId); console.debug('Generated new user ID:', newUserId); } } catch (error) { console.error('Error initializing user ID:', error); - // 生成随机 ID 作为 fallback - const fallbackId = crypto.randomBytes(20).toString('hex'); + const fallbackId = "1234567890"; localStorage.setItem('userId', fallbackId); setUserId(fallbackId); } }; initializeUserId(); - }, []); // 空依赖数组确保只运行一次 + }, []); useEffect(() => { if ( From 969f01e2757527a650a5c75a828726b5f91ec3c5 Mon Sep 17 00:00:00 2001 From: litongjava <litongjava@qq.com> Date: Sun, 2 Feb 2025 16:04:59 -1000 Subject: [PATCH 05/18] crrect userId --- ui/components/ChatWindow.tsx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/ui/components/ChatWindow.tsx b/ui/components/ChatWindow.tsx index 1be4ec5..8e18b03 100644 --- a/ui/components/ChatWindow.tsx +++ b/ui/components/ChatWindow.tsx @@ -515,7 +515,7 @@ const ChatWindow = ({id}: { id?: string }) => { ws.send( JSON.stringify({ type: 'message', - useerId:userId, + userId:userId, message: { messageId: messageId, chatId: chatId!, @@ -523,6 +523,7 @@ const ChatWindow = ({id}: { id?: string }) => { }, files: fileIds, focusMode: focusMode, + copilotEnabled: copilotEnabled, optimizationMode: optimizationMode, history: [...chatHistory, ['human', message]], }), From 5f672eaa66f006dd903823c82c1758399391af72 Mon Sep 17 00:00:00 2001 From: litongjava <litongjava@qq.com> Date: Sun, 2 Feb 2025 16:09:59 -1000 Subject: [PATCH 06/18] remove userId --- ui/components/ChatWindow.tsx | 2 +- ui/lib/mcid.ts | 4 +--- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/ui/components/ChatWindow.tsx b/ui/components/ChatWindow.tsx index 8e18b03..95a81e8 100644 --- a/ui/components/ChatWindow.tsx +++ b/ui/components/ChatWindow.tsx @@ -429,7 +429,7 @@ const ChatWindow = ({id}: { id?: string }) => { setUserId(storedUserId); console.debug('Using existing user ID:', storedUserId); } else { - const newUserId = new Mcid().generate().toString(); // 转换为字符串 + const newUserId = new Mcid().generate().toString(); localStorage.setItem('userId', newUserId); setUserId(newUserId); diff --git a/ui/lib/mcid.ts b/ui/lib/mcid.ts index 1a0d0d3..77d7f65 100644 --- a/ui/lib/mcid.ts +++ b/ui/lib/mcid.ts @@ -30,9 +30,7 @@ export class Mcid { this.lastTimestamp = now; return ( - (now * 0x1000) + // 时间戳左移 12 位 - (this.machineId * 16) + // 机器 ID 左移 4 位 - this.sequence // 序列号 + (now * 0x1000) + (this.machineId * 16) + this.sequence ); } } From 7733b663d437a3ec478a94813afdf75a8434f1bc Mon Sep 17 00:00:00 2001 From: litongjava <litongjava@qq.com> Date: Sun, 2 Feb 2025 16:38:57 -1000 Subject: [PATCH 07/18] add math and translator --- ui/components/EmptyChatMessageInput.tsx | 4 +-- ui/components/MessageInputActions/Focus.tsx | 31 +++++++++++++++++---- 2 files changed, 27 insertions(+), 8 deletions(-) diff --git a/ui/components/EmptyChatMessageInput.tsx b/ui/components/EmptyChatMessageInput.tsx index 195b8d3..efa0fd8 100644 --- a/ui/components/EmptyChatMessageInput.tsx +++ b/ui/components/EmptyChatMessageInput.tsx @@ -11,8 +11,8 @@ const EmptyChatMessageInput = ({ sendMessage, focusMode, setFocusMode, - copilotEnabled, - setCopilotEnabled, + copilotEnabled, + setCopilotEnabled, optimizationMode, setOptimizationMode, fileIds, diff --git a/ui/components/MessageInputActions/Focus.tsx b/ui/components/MessageInputActions/Focus.tsx index 613078b..b72e19f 100644 --- a/ui/components/MessageInputActions/Focus.tsx +++ b/ui/components/MessageInputActions/Focus.tsx @@ -1,5 +1,5 @@ import { - BadgePercent, + BadgePercent, Calculator, ChevronDown, Globe, Pencil, @@ -13,7 +13,7 @@ import { PopoverPanel, Transition, } from '@headlessui/react'; -import { SiReddit, SiYoutube } from '@icons-pack/react-simple-icons'; +import {SiGoogletranslate, SiReddit, SiYoutube} from '@icons-pack/react-simple-icons'; import { Fragment } from 'react'; const focusModes = [ @@ -29,6 +29,12 @@ const focusModes = [ description: 'Search in published academic papers', icon: <SwatchBook size={20} />, }, + { + key: 'wolframAlphaSearch', + title: 'Wolfram Alpha', + description: 'Computational knowledge engine', + icon: <BadgePercent size={20} />, + }, { key: 'writingAssistant', title: 'Writing', @@ -36,11 +42,24 @@ const focusModes = [ icon: <Pencil size={16} />, }, { - key: 'wolframAlphaSearch', - title: 'Wolfram Alpha', - description: 'Computational knowledge engine', - icon: <BadgePercent size={20} />, + key: 'mathAssistant', + title: 'Math', + description: 'Chat without searching the web', + icon: <Calculator size={25} />, }, + { + key: 'translator', + title: 'Trasnlator', + description: 'Chat without searching the web', + icon: ( + <SiGoogletranslate + className="h-5 w-auto mr-0.5" + onPointerEnterCapture={undefined} + onPointerLeaveCapture={undefined} + /> + ), + }, + { key: 'youtubeSearch', title: 'Youtube', From 144bf81533cb20569f2d5e1f351eb6cdfb81fe18 Mon Sep 17 00:00:00 2001 From: litongjava <litongjava@qq.com> Date: Sun, 2 Feb 2025 16:53:40 -1000 Subject: [PATCH 08/18] add DeepSeek --- ui/assets/DeepSeekIcon.tsx | 20 ++++++++++++++++++++ ui/assets/deepseek.svg | 1 + ui/components/MessageInputActions/Focus.tsx | 9 +++++++++ 3 files changed, 30 insertions(+) create mode 100644 ui/assets/DeepSeekIcon.tsx create mode 100644 ui/assets/deepseek.svg diff --git a/ui/assets/DeepSeekIcon.tsx b/ui/assets/DeepSeekIcon.tsx new file mode 100644 index 0000000..0c761db --- /dev/null +++ b/ui/assets/DeepSeekIcon.tsx @@ -0,0 +1,20 @@ +import React from 'react'; + +const DeepSeekIcon = (props: React.JSX.IntrinsicAttributes & React.SVGProps<SVGSVGElement>) => ( + <svg + viewBox="0 0 30 30" + fill="none" + xmlns="http://www.w3.org/2000/svg" + xmlnsXlink="http://www.w3.org/1999/xlink" + {...props} + > + <path + id="path" + d="M27.501 8.46875C27.249 8.3457 27.1406 8.58008 26.9932 8.69922C26.9434 8.73828 26.9004 8.78906 26.8584 8.83398C26.4902 9.22852 26.0605 9.48633 25.5 9.45508C24.6787 9.41016 23.9785 9.66797 23.3594 10.2969C23.2275 9.52148 22.79 9.05859 22.125 8.76172C21.7764 8.60742 21.4238 8.45312 21.1807 8.11719C21.0098 7.87891 20.9639 7.61328 20.8779 7.35156C20.8242 7.19336 20.7695 7.03125 20.5879 7.00391C20.3906 6.97266 20.3135 7.13867 20.2363 7.27734C19.9258 7.84375 19.8066 8.46875 19.8174 9.10156C19.8447 10.5234 20.4453 11.6562 21.6367 12.4629C21.7725 12.5547 21.8076 12.6484 21.7646 12.7832C21.6836 13.0605 21.5869 13.3301 21.501 13.6074C21.4473 13.7852 21.3662 13.8242 21.1768 13.7461C20.5225 13.4727 19.957 13.0684 19.458 12.5781C18.6104 11.7578 17.8438 10.8516 16.8877 10.1426C16.6631 9.97656 16.4395 9.82227 16.207 9.67578C15.2314 8.72656 16.335 7.94727 16.5898 7.85547C16.8574 7.75977 16.6826 7.42773 15.8193 7.43164C14.957 7.43555 14.167 7.72461 13.1611 8.10938C13.0137 8.16797 12.8594 8.21094 12.7002 8.24414C11.7871 8.07227 10.8389 8.0332 9.84766 8.14453C7.98242 8.35352 6.49219 9.23633 5.39648 10.7441C4.08105 12.5547 3.77148 14.6133 4.15039 16.7617C4.54883 19.0234 5.70215 20.8984 7.47559 22.3633C9.31348 23.8809 11.4307 24.625 13.8457 24.4824C15.3125 24.3984 16.9463 24.2012 18.7881 22.6406C19.2529 22.8711 19.7402 22.9629 20.5498 23.0332C21.1729 23.0918 21.7725 23.002 22.2373 22.9062C22.9648 22.752 22.9141 22.0781 22.6514 21.9531C20.5186 20.959 20.9863 21.3633 20.5605 21.0371C21.6445 19.752 23.2783 18.418 23.917 14.0977C23.9668 13.7539 23.9238 13.5391 23.917 13.2598C23.9131 13.0918 23.9512 13.0254 24.1445 13.0059C24.6787 12.9453 25.1973 12.7988 25.6738 12.5352C27.0557 11.7793 27.6123 10.5391 27.7441 9.05078C27.7637 8.82422 27.7402 8.58789 27.501 8.46875ZM15.46 21.8613C13.3926 20.2344 12.3906 19.6992 11.9766 19.7227C11.5898 19.7441 11.6592 20.1875 11.7441 20.4766C11.833 20.7617 11.9492 20.959 12.1123 21.209C12.2246 21.375 12.3018 21.623 12 21.8066C11.334 22.2207 10.1768 21.668 10.1221 21.6406C8.77539 20.8477 7.64941 19.7988 6.85547 18.3652C6.08984 16.9844 5.64453 15.5039 5.57129 13.9238C5.55176 13.541 5.66406 13.4062 6.04297 13.3379C6.54199 13.2461 7.05762 13.2266 7.55664 13.2988C9.66602 13.6074 11.4619 14.5527 12.9668 16.0469C13.8262 16.9004 14.4766 17.918 15.1465 18.9121C15.8584 19.9688 16.625 20.9746 17.6006 21.7988C17.9443 22.0879 18.2197 22.3086 18.4824 22.4707C17.6895 22.5586 16.3652 22.5781 15.46 21.8613ZM16.4502 15.4805C16.4502 15.3105 16.5859 15.1758 16.7568 15.1758C16.7949 15.1758 16.8301 15.1836 16.8613 15.1953C16.9033 15.2109 16.9424 15.2344 16.9727 15.2695C17.0273 15.3223 17.0586 15.4004 17.0586 15.4805C17.0586 15.6504 16.9229 15.7852 16.7529 15.7852C16.582 15.7852 16.4502 15.6504 16.4502 15.4805ZM19.5273 17.0625C19.3301 17.1426 19.1328 17.2129 18.9434 17.2207C18.6494 17.2344 18.3281 17.1152 18.1533 16.9688C17.8828 16.7422 17.6895 16.6152 17.6074 16.2168C17.5732 16.0469 17.5928 15.7852 17.623 15.6348C17.6934 15.3105 17.6152 15.1035 17.3877 14.9141C17.2012 14.7598 16.9658 14.7188 16.7061 14.7188C16.6094 14.7188 16.5205 14.6758 16.4541 14.6406C16.3457 14.5859 16.2568 14.4512 16.3418 14.2852C16.3691 14.2324 16.501 14.1016 16.5322 14.0781C16.8838 13.877 17.29 13.9434 17.666 14.0938C18.0146 14.2363 18.2773 14.498 18.6562 14.8672C19.0439 15.3145 19.1133 15.4395 19.334 15.7734C19.5078 16.0371 19.667 16.3066 19.7754 16.6152C19.8408 16.8066 19.7559 16.9648 19.5273 17.0625Z" + fillRule="nonzero" + fill="#4D6BFE" + /> + </svg> +); + +export default DeepSeekIcon; diff --git a/ui/assets/deepseek.svg b/ui/assets/deepseek.svg new file mode 100644 index 0000000..3dcf249 --- /dev/null +++ b/ui/assets/deepseek.svg @@ -0,0 +1 @@ +<svg viewBox="0 0 30 30" fill="none" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><path id="path" d="M27.501 8.46875C27.249 8.3457 27.1406 8.58008 26.9932 8.69922C26.9434 8.73828 26.9004 8.78906 26.8584 8.83398C26.4902 9.22852 26.0605 9.48633 25.5 9.45508C24.6787 9.41016 23.9785 9.66797 23.3594 10.2969C23.2275 9.52148 22.79 9.05859 22.125 8.76172C21.7764 8.60742 21.4238 8.45312 21.1807 8.11719C21.0098 7.87891 20.9639 7.61328 20.8779 7.35156C20.8242 7.19336 20.7695 7.03125 20.5879 7.00391C20.3906 6.97266 20.3135 7.13867 20.2363 7.27734C19.9258 7.84375 19.8066 8.46875 19.8174 9.10156C19.8447 10.5234 20.4453 11.6562 21.6367 12.4629C21.7725 12.5547 21.8076 12.6484 21.7646 12.7832C21.6836 13.0605 21.5869 13.3301 21.501 13.6074C21.4473 13.7852 21.3662 13.8242 21.1768 13.7461C20.5225 13.4727 19.957 13.0684 19.458 12.5781C18.6104 11.7578 17.8438 10.8516 16.8877 10.1426C16.6631 9.97656 16.4395 9.82227 16.207 9.67578C15.2314 8.72656 16.335 7.94727 16.5898 7.85547C16.8574 7.75977 16.6826 7.42773 15.8193 7.43164C14.957 7.43555 14.167 7.72461 13.1611 8.10938C13.0137 8.16797 12.8594 8.21094 12.7002 8.24414C11.7871 8.07227 10.8389 8.0332 9.84766 8.14453C7.98242 8.35352 6.49219 9.23633 5.39648 10.7441C4.08105 12.5547 3.77148 14.6133 4.15039 16.7617C4.54883 19.0234 5.70215 20.8984 7.47559 22.3633C9.31348 23.8809 11.4307 24.625 13.8457 24.4824C15.3125 24.3984 16.9463 24.2012 18.7881 22.6406C19.2529 22.8711 19.7402 22.9629 20.5498 23.0332C21.1729 23.0918 21.7725 23.002 22.2373 22.9062C22.9648 22.752 22.9141 22.0781 22.6514 21.9531C20.5186 20.959 20.9863 21.3633 20.5605 21.0371C21.6445 19.752 23.2783 18.418 23.917 14.0977C23.9668 13.7539 23.9238 13.5391 23.917 13.2598C23.9131 13.0918 23.9512 13.0254 24.1445 13.0059C24.6787 12.9453 25.1973 12.7988 25.6738 12.5352C27.0557 11.7793 27.6123 10.5391 27.7441 9.05078C27.7637 8.82422 27.7402 8.58789 27.501 8.46875ZM15.46 21.8613C13.3926 20.2344 12.3906 19.6992 11.9766 19.7227C11.5898 19.7441 11.6592 20.1875 11.7441 20.4766C11.833 20.7617 11.9492 20.959 12.1123 21.209C12.2246 21.375 12.3018 21.623 12 21.8066C11.334 22.2207 10.1768 21.668 10.1221 21.6406C8.77539 20.8477 7.64941 19.7988 6.85547 18.3652C6.08984 16.9844 5.64453 15.5039 5.57129 13.9238C5.55176 13.541 5.66406 13.4062 6.04297 13.3379C6.54199 13.2461 7.05762 13.2266 7.55664 13.2988C9.66602 13.6074 11.4619 14.5527 12.9668 16.0469C13.8262 16.9004 14.4766 17.918 15.1465 18.9121C15.8584 19.9688 16.625 20.9746 17.6006 21.7988C17.9443 22.0879 18.2197 22.3086 18.4824 22.4707C17.6895 22.5586 16.3652 22.5781 15.46 21.8613ZM16.4502 15.4805C16.4502 15.3105 16.5859 15.1758 16.7568 15.1758C16.7949 15.1758 16.8301 15.1836 16.8613 15.1953C16.9033 15.2109 16.9424 15.2344 16.9727 15.2695C17.0273 15.3223 17.0586 15.4004 17.0586 15.4805C17.0586 15.6504 16.9229 15.7852 16.7529 15.7852C16.582 15.7852 16.4502 15.6504 16.4502 15.4805ZM19.5273 17.0625C19.3301 17.1426 19.1328 17.2129 18.9434 17.2207C18.6494 17.2344 18.3281 17.1152 18.1533 16.9688C17.8828 16.7422 17.6895 16.6152 17.6074 16.2168C17.5732 16.0469 17.5928 15.7852 17.623 15.6348C17.6934 15.3105 17.6152 15.1035 17.3877 14.9141C17.2012 14.7598 16.9658 14.7188 16.7061 14.7188C16.6094 14.7188 16.5205 14.6758 16.4541 14.6406C16.3457 14.5859 16.2568 14.4512 16.3418 14.2852C16.3691 14.2324 16.501 14.1016 16.5322 14.0781C16.8838 13.877 17.29 13.9434 17.666 14.0938C18.0146 14.2363 18.2773 14.498 18.6562 14.8672C19.0439 15.3145 19.1133 15.4395 19.334 15.7734C19.5078 16.0371 19.667 16.3066 19.7754 16.6152C19.8408 16.8066 19.7559 16.9648 19.5273 17.0625Z" fill-rule="nonzero" fill="#4D6BFE"></path></svg> \ No newline at end of file diff --git a/ui/components/MessageInputActions/Focus.tsx b/ui/components/MessageInputActions/Focus.tsx index b72e19f..49f7641 100644 --- a/ui/components/MessageInputActions/Focus.tsx +++ b/ui/components/MessageInputActions/Focus.tsx @@ -15,6 +15,7 @@ import { } from '@headlessui/react'; import {SiGoogletranslate, SiReddit, SiYoutube} from '@icons-pack/react-simple-icons'; import { Fragment } from 'react'; +import DeepSeekIcon from "@/assets/DeepSeekIcon"; const focusModes = [ { @@ -84,6 +85,14 @@ const focusModes = [ /> ), }, + { + key: 'deepSeek', + title: 'DeepSeek', + description: 'Chat with DeepSeek', + icon: ( + <DeepSeekIcon className="h-8 w-auto mr-0.5" /> + ), + }, ]; const Focus = ({ From 66b48146a345008d7fca29ed1b7f74aaaaa6a4cd Mon Sep 17 00:00:00 2001 From: litongjava <litongjava@qq.com> Date: Sun, 2 Feb 2025 16:54:31 -1000 Subject: [PATCH 09/18] change to search --- ui/components/MessageInputActions/Focus.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ui/components/MessageInputActions/Focus.tsx b/ui/components/MessageInputActions/Focus.tsx index 49f7641..31c0f2f 100644 --- a/ui/components/MessageInputActions/Focus.tsx +++ b/ui/components/MessageInputActions/Focus.tsx @@ -20,7 +20,7 @@ import DeepSeekIcon from "@/assets/DeepSeekIcon"; const focusModes = [ { key: 'webSearch', - title: 'All', + title: 'Search', description: 'Searches across all of the internet', icon: <Globe size={20} />, }, From 3558dc2ed28268e86f5e1fe549c039be3f321075 Mon Sep 17 00:00:00 2001 From: litongjava <litongjava@qq.com> Date: Mon, 3 Feb 2025 00:17:55 -1000 Subject: [PATCH 10/18] fetch chats with userid --- ui/app/library/page.tsx | 20 ++++++++++---------- ui/components/ChatWindow.tsx | 2 +- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/ui/app/library/page.tsx b/ui/app/library/page.tsx index 379596c..76652c5 100644 --- a/ui/app/library/page.tsx +++ b/ui/app/library/page.tsx @@ -1,10 +1,10 @@ 'use client'; import DeleteChat from '@/components/DeleteChat'; -import { cn, formatTimeDifference } from '@/lib/utils'; -import { BookOpenText, ClockIcon, Delete, ScanEye } from 'lucide-react'; +import {cn, formatTimeDifference} from '@/lib/utils'; +import {BookOpenText, ClockIcon, Delete, ScanEye} from 'lucide-react'; import Link from 'next/link'; -import { useEffect, useState } from 'react'; +import {useEffect, useState} from 'react'; export interface Chat { id: string; @@ -20,8 +20,8 @@ const Page = () => { useEffect(() => { const fetchChats = async () => { setLoading(true); - - const res = await fetch(`${process.env.NEXT_PUBLIC_API_URL}/chats`, { + let userId = localStorage.getItem("userId"); + const res = await fetch(`${process.env.NEXT_PUBLIC_API_URL}/chats?userId=` + userId, { method: 'GET', headers: { 'Content-Type': 'application/json', @@ -60,19 +60,19 @@ const Page = () => { <div> <div className="flex flex-col pt-4"> <div className="flex items-center"> - <BookOpenText /> + <BookOpenText/> <h1 className="text-3xl font-medium p-2">Library</h1> </div> - <hr className="border-t border-[#2B2C2C] my-4 w-full" /> + <hr className="border-t border-[#2B2C2C] my-4 w-full"/> </div> - {chats.length === 0 && ( + {chats && chats.length === 0 && ( <div className="flex flex-row items-center justify-center min-h-screen"> <p className="text-black/70 dark:text-white/70 text-sm"> No chats found. </p> </div> )} - {chats.length > 0 && ( + {chats && chats.length > 0 && ( <div className="flex flex-col pb-20 lg:pb-2"> {chats.map((chat, i) => ( <div @@ -92,7 +92,7 @@ const Page = () => { </Link> <div className="flex flex-row items-center justify-between w-full"> <div className="flex flex-row items-center space-x-1 lg:space-x-1.5 text-black/70 dark:text-white/70"> - <ClockIcon size={15} /> + <ClockIcon size={15}/> <p className="text-xs"> {formatTimeDifference(new Date(), chat.createdAt)} Ago </p> diff --git a/ui/components/ChatWindow.tsx b/ui/components/ChatWindow.tsx index 95a81e8..c4c4bd8 100644 --- a/ui/components/ChatWindow.tsx +++ b/ui/components/ChatWindow.tsx @@ -525,7 +525,7 @@ const ChatWindow = ({id}: { id?: string }) => { focusMode: focusMode, copilotEnabled: copilotEnabled, optimizationMode: optimizationMode, - history: [...chatHistory, ['human', message]], + history: [], }), ); From 311f0e08798ab85da836eb343ff6176f79eecf7f Mon Sep 17 00:00:00 2001 From: litongjava <litongjava@qq.com> Date: Mon, 3 Feb 2025 01:27:27 -1000 Subject: [PATCH 11/18] fix bug: file --- ui/components/ChatWindow.tsx | 4 ++-- ui/components/MessageInputActions/AttachSmall.tsx | 2 +- ui/components/MessageInputActions/Focus.tsx | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/ui/components/ChatWindow.tsx b/ui/components/ChatWindow.tsx index c4c4bd8..0707457 100644 --- a/ui/components/ChatWindow.tsx +++ b/ui/components/ChatWindow.tsx @@ -367,7 +367,7 @@ const loadMessages = async ( document.title = messages[0].content; - const files = data.chat.files.map((file: any) => { + const files = data.chat.files && data.chat.files.map((file: any) => { return { fileName: file.name, fileExtension: file.name.split('.').pop(), @@ -376,7 +376,7 @@ const loadMessages = async ( }); setFiles(files); - setFileIds(files.map((file: File) => file.fileId)); + setFileIds(files && files.map((file: File) => file.fileId)); setChatHistory(history); setFocusMode(data.chat.focusMode); diff --git a/ui/components/MessageInputActions/AttachSmall.tsx b/ui/components/MessageInputActions/AttachSmall.tsx index 3514a58..1bce1b9 100644 --- a/ui/components/MessageInputActions/AttachSmall.tsx +++ b/ui/components/MessageInputActions/AttachSmall.tsx @@ -55,7 +55,7 @@ const AttachSmall = ({ <div className="flex flex-row items-center justify-between space-x-1 p-1"> <LoaderCircle size={20} className="text-sky-400 animate-spin" /> </div> - ) : files.length > 0 ? ( + ) : files && files.length > 0 ? ( <Popover className="max-w-[15rem] md:max-w-md lg:max-w-lg"> <PopoverButton type="button" diff --git a/ui/components/MessageInputActions/Focus.tsx b/ui/components/MessageInputActions/Focus.tsx index 31c0f2f..7857207 100644 --- a/ui/components/MessageInputActions/Focus.tsx +++ b/ui/components/MessageInputActions/Focus.tsx @@ -50,7 +50,7 @@ const focusModes = [ }, { key: 'translator', - title: 'Trasnlator', + title: 'Translator', description: 'Chat without searching the web', icon: ( <SiGoogletranslate From c3d56e5d66a5707bd251f9bcd7703f116fc480dc Mon Sep 17 00:00:00 2001 From: litongjava <litongjava@qq.com> Date: Mon, 3 Feb 2025 08:48:19 -1000 Subject: [PATCH 12/18] feat: remove speed and show focus mode --- ui/app/page.tsx | 4 ++-- ui/components/EmptyChatMessageInput.tsx | 13 +++++++------ ui/components/MessageInputActions/Focus.tsx | 4 ++-- 3 files changed, 11 insertions(+), 10 deletions(-) diff --git a/ui/app/page.tsx b/ui/app/page.tsx index e18aca9..9666183 100644 --- a/ui/app/page.tsx +++ b/ui/app/page.tsx @@ -3,8 +3,8 @@ import { Metadata } from 'next'; import { Suspense } from 'react'; export const metadata: Metadata = { - title: 'Chat - Perplexica', - description: 'Chat with the internet, chat with Perplexica.', + title: 'MyCounsellor Ai Serach Eengine - Searching Thking with Gemini', + description: 'Chat with the internet, chat with MyCounsellor.', }; const Home = () => { diff --git a/ui/components/EmptyChatMessageInput.tsx b/ui/components/EmptyChatMessageInput.tsx index efa0fd8..36be1c3 100644 --- a/ui/components/EmptyChatMessageInput.tsx +++ b/ui/components/EmptyChatMessageInput.tsx @@ -88,6 +88,8 @@ const EmptyChatMessageInput = ({ <div className="flex flex-row items-center justify-between mt-4"> <div className="flex flex-row items-center space-x-2 lg:space-x-4"> <Focus focusMode={focusMode} setFocusMode={setFocusMode} /> + </div> + <div className="flex flex-row items-center space-x-1 sm:space-x-4"> <Attach fileIds={fileIds} setFileIds={setFileIds} @@ -95,13 +97,12 @@ const EmptyChatMessageInput = ({ setFiles={setFiles} showText /> - </div> - <div className="flex flex-row items-center space-x-1 sm:space-x-4"> + <CopilotToggle setCopilotEnabled={setCopilotEnabled} copilotEnabled={copilotEnabled}/> - <Optimization - optimizationMode={optimizationMode} - setOptimizationMode={setOptimizationMode} - /> + {/*<Optimization*/} + {/* optimizationMode={optimizationMode}*/} + {/* setOptimizationMode={setOptimizationMode}*/} + {/*/>*/} <button disabled={message.trim().length === 0} className="bg-[#24A0ED] text-white disabled:text-black/50 dark:disabled:text-white/50 disabled:bg-[#e0e0dc] dark:disabled:bg-[#ececec21] hover:bg-opacity-85 transition duration-100 rounded-full p-2" diff --git a/ui/components/MessageInputActions/Focus.tsx b/ui/components/MessageInputActions/Focus.tsx index 7857207..3ec0226 100644 --- a/ui/components/MessageInputActions/Focus.tsx +++ b/ui/components/MessageInputActions/Focus.tsx @@ -111,7 +111,7 @@ const Focus = ({ {focusMode !== 'webSearch' ? ( <div className="flex flex-row items-center space-x-1"> {focusModes.find((mode) => mode.key === focusMode)?.icon} - <p className="text-xs font-medium hidden lg:block"> + <p className="text-xs font-medium"> {focusModes.find((mode) => mode.key === focusMode)?.title} </p> <ChevronDown size={20} className="-translate-x-1" /> @@ -119,7 +119,7 @@ const Focus = ({ ) : ( <div className="flex flex-row items-center space-x-1"> <ScanEye size={20} /> - <p className="text-xs font-medium hidden lg:block">Focus</p> + <p className="text-xs font-medium">Focus</p> </div> )} </PopoverButton> From c8a75efa274b6f948f05054a6ed2acc7c5405b4a Mon Sep 17 00:00:00 2001 From: litongjava <litongjava@qq.com> Date: Mon, 3 Feb 2025 09:10:38 -1000 Subject: [PATCH 13/18] feat: keep fouce model --- ui/components/ChatWindow.tsx | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/ui/components/ChatWindow.tsx b/ui/components/ChatWindow.tsx index 0707457..ec8e3e6 100644 --- a/ui/components/ChatWindow.tsx +++ b/ui/components/ChatWindow.tsx @@ -5,7 +5,6 @@ import {Document} from '@langchain/core/documents'; import Navbar from './Navbar'; import Chat from './Chat'; import EmptyChat from './EmptyChat'; -import crypto from 'crypto'; import {toast} from 'sonner'; import {useSearchParams} from 'next/navigation'; import {getSuggestions} from '@/lib/actions'; @@ -481,6 +480,18 @@ const ChatWindow = ({id}: { id?: string }) => { // eslint-disable-next-line react-hooks/exhaustive-deps }, []); + useEffect(() => { + const savedFocusMode = localStorage.getItem('focusMode'); + if (savedFocusMode) { + setFocusMode(savedFocusMode); + } + }, [setFocusMode]); + + const handleFocusModeChange = (mode: string) => { + localStorage.setItem('focusMode', mode); + setFocusMode(mode); + }; + const messagesRef = useRef<Message[]>([]); useEffect(() => { @@ -515,7 +526,7 @@ const ChatWindow = ({id}: { id?: string }) => { ws.send( JSON.stringify({ type: 'message', - userId:userId, + userId: userId, message: { messageId: messageId, chatId: chatId!, @@ -701,7 +712,7 @@ const ChatWindow = ({id}: { id?: string }) => { focusMode={focusMode} copilotEnabled={copilotEnabled} setCopilotEnabled={setCopilotEnabled} - setFocusMode={setFocusMode} + setFocusMode={handleFocusModeChange} optimizationMode={optimizationMode} setOptimizationMode={setOptimizationMode} fileIds={fileIds} From 15f64a0ef070e1f5e924116a4ca84b6f983fb514 Mon Sep 17 00:00:00 2001 From: litongjava <litongjava@qq.com> Date: Mon, 3 Feb 2025 14:35:02 -1000 Subject: [PATCH 14/18] feat: move up of empty chat --- ui/components/EmptyChat.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ui/components/EmptyChat.tsx b/ui/components/EmptyChat.tsx index 0acd4ea..51ed0a2 100644 --- a/ui/components/EmptyChat.tsx +++ b/ui/components/EmptyChat.tsx @@ -40,8 +40,8 @@ const EmptyChat = ({ onClick={() => setIsSettingsOpen(true)} /> </div> - <div className="flex flex-col items-center justify-center min-h-screen max-w-screen-sm mx-auto p-2 space-y-8"> - <h2 className="text-black/70 dark:text-white/70 text-3xl font-medium -mt-8"> + <div className="flex flex-col items-center max-w-screen-sm mx-auto p-2 pt-16 mt-16 space-y-8"> + <h2 className="text-black/70 dark:text-white/70 text-5xl font-medium -mt-8"> Research begins here. </h2> <EmptyChatMessageInput From c2f4fb1dc942994769dc9ebac9f97107bc202325 Mon Sep 17 00:00:00 2001 From: litongjava <litongjava@qq.com> Date: Mon, 3 Feb 2025 14:45:45 -1000 Subject: [PATCH 15/18] feat: show deepseek --- ui/components/MessageInputActions/Focus.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ui/components/MessageInputActions/Focus.tsx b/ui/components/MessageInputActions/Focus.tsx index 3ec0226..de4cece 100644 --- a/ui/components/MessageInputActions/Focus.tsx +++ b/ui/components/MessageInputActions/Focus.tsx @@ -133,7 +133,7 @@ const Focus = ({ leaveTo="opacity-0 translate-y-1" > <PopoverPanel className="absolute z-10 w-64 md:w-[500px] left-0"> - <div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-2 bg-light-primary dark:bg-dark-primary border rounded-lg border-light-200 dark:border-dark-200 w-full p-4 max-h-[200px] md:max-h-none overflow-y-auto"> + <div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-2 bg-light-primary dark:bg-dark-primary border rounded-lg border-light-200 dark:border-dark-200 w-full p-4 max-h-[calc(100vh-6rem)] md:max-h-none overflow-y-auto pb-20"> {focusModes.map((mode, i) => ( <PopoverButton onClick={() => setFocusMode(mode.key)} From 4dc5857b17fd0d1c0e4b3d622594e610ddc58495 Mon Sep 17 00:00:00 2001 From: litongjava <litongjava@qq.com> Date: Mon, 3 Feb 2025 15:00:06 -1000 Subject: [PATCH 16/18] feat: add copilotEnabled and setCopilotEnabled to MesageInput --- ui/components/Chat.tsx | 6 ++++++ ui/components/ChatWindow.tsx | 2 ++ ui/components/MessageInput.tsx | 6 +++++- 3 files changed, 13 insertions(+), 1 deletion(-) diff --git a/ui/components/Chat.tsx b/ui/components/Chat.tsx index 81aa32f..a3caf8a 100644 --- a/ui/components/Chat.tsx +++ b/ui/components/Chat.tsx @@ -16,6 +16,8 @@ const Chat = ({ setFileIds, files, setFiles, + copilotEnabled, + setCopilotEnabled, }: { messages: Message[]; sendMessage: (message: string) => void; @@ -26,6 +28,8 @@ const Chat = ({ setFileIds: (fileIds: string[]) => void; files: File[]; setFiles: (files: File[]) => void; + copilotEnabled:boolean + setCopilotEnabled:(mode: boolean) => void; }) => { const [dividerWidth, setDividerWidth] = useState(0); const dividerRef = useRef<HTMLDivElement | null>(null); @@ -93,6 +97,8 @@ const Chat = ({ setFileIds={setFileIds} files={files} setFiles={setFiles} + copilotEnabled={copilotEnabled} + setCopilotEnabled={setCopilotEnabled} /> </div> )} diff --git a/ui/components/ChatWindow.tsx b/ui/components/ChatWindow.tsx index ec8e3e6..4808f49 100644 --- a/ui/components/ChatWindow.tsx +++ b/ui/components/ChatWindow.tsx @@ -704,6 +704,8 @@ const ChatWindow = ({id}: { id?: string }) => { setFileIds={setFileIds} files={files} setFiles={setFiles} + copilotEnabled={copilotEnabled} + setCopilotEnabled={setCopilotEnabled} /> </> ) : ( diff --git a/ui/components/MessageInput.tsx b/ui/components/MessageInput.tsx index b6b1d96..f1888c5 100644 --- a/ui/components/MessageInput.tsx +++ b/ui/components/MessageInput.tsx @@ -14,6 +14,8 @@ const MessageInput = ({ setFileIds, files, setFiles, + copilotEnabled, + setCopilotEnabled, }: { sendMessage: (message: string) => void; loading: boolean; @@ -21,8 +23,10 @@ const MessageInput = ({ setFileIds: (fileIds: string[]) => void; files: File[]; setFiles: (files: File[]) => void; + copilotEnabled:boolean + setCopilotEnabled:(mode: boolean) => void; + }) => { - const [copilotEnabled, setCopilotEnabled] = useState(false); const [message, setMessage] = useState(''); const [textareaRows, setTextareaRows] = useState(1); const [mode, setMode] = useState<'multi' | 'single'>('single'); From 3afa826fb96e969279a2036401ef9a7e9767bd7f Mon Sep 17 00:00:00 2001 From: litongjava <litongjava@qq.com> Date: Tue, 4 Feb 2025 19:15:54 -1000 Subject: [PATCH 17/18] feat: add sources of user --- ui/components/ChatWindow.tsx | 2 +- ui/components/MessageBox.tsx | 69 +++++++++++++++++++++++------------- 2 files changed, 45 insertions(+), 26 deletions(-) diff --git a/ui/components/ChatWindow.tsx b/ui/components/ChatWindow.tsx index 4808f49..54c4b49 100644 --- a/ui/components/ChatWindow.tsx +++ b/ui/components/ChatWindow.tsx @@ -352,7 +352,7 @@ const loadMessages = async ( const messages = data.messages.map((msg: any) => { return { ...msg, - ...JSON.parse(msg.metadata), + // ...JSON.parse(msg.metadata), }; }) as Message[]; diff --git a/ui/components/MessageBox.tsx b/ui/components/MessageBox.tsx index f23127c..64cbe2a 100644 --- a/ui/components/MessageBox.tsx +++ b/ui/components/MessageBox.tsx @@ -1,9 +1,9 @@ 'use client'; /* eslint-disable @next/next/no-img-element */ -import React, { MutableRefObject, useEffect, useState } from 'react'; -import { Message } from './ChatWindow'; -import { cn } from '@/lib/utils'; +import React, {MutableRefObject, useEffect, useState} from 'react'; +import {Message} from './ChatWindow'; +import {cn} from '@/lib/utils'; import { BookCopy, Disc3, @@ -18,18 +18,18 @@ import Rewrite from './MessageActions/Rewrite'; import MessageSources from './MessageSources'; import SearchImages from './SearchImages'; import SearchVideos from './SearchVideos'; -import { useSpeech } from 'react-text-to-speech'; +import {useSpeech} from 'react-text-to-speech'; const MessageBox = ({ - message, - messageIndex, - history, - loading, - dividerRef, - isLast, - rewrite, - sendMessage, -}: { + message, + messageIndex, + history, + loading, + dividerRef, + isLast, + rewrite, + sendMessage, + }: { message: Message; messageIndex: number; history: Message[]; @@ -63,7 +63,7 @@ const MessageBox = ({ setParsedMessage(message.content); }, [message.content, message.sources, message.role]); - const { speechStatus, start, stop } = useSpeech({ text: speechMessage }); + const {speechStatus, start, stop} = useSpeech({text: speechMessage}); return ( <div> @@ -72,6 +72,23 @@ const MessageBox = ({ <h2 className="text-black dark:text-white font-medium text-3xl lg:w-9/12"> {message.content} </h2> + <div + ref={dividerRef} + className="flex flex-col space-y-6 w-full lg:w-9/12" + > + + {message.sources && message.sources.length > 0 && ( + <div className="flex flex-col space-y-2"> + <div className="flex flex-row items-center space-x-2"> + <BookCopy className="text-black dark:text-white" size={20}/> + <h3 className="text-black dark:text-white font-medium text-xl"> + Sources + </h3> + </div> + <MessageSources sources={message.sources}/> + </div> + )} + </div> </div> )} @@ -84,12 +101,12 @@ const MessageBox = ({ {message.sources && message.sources.length > 0 && ( <div className="flex flex-col space-y-2"> <div className="flex flex-row items-center space-x-2"> - <BookCopy className="text-black dark:text-white" size={20} /> + <BookCopy className="text-black dark:text-white" size={20}/> <h3 className="text-black dark:text-white font-medium text-xl"> Sources </h3> </div> - <MessageSources sources={message.sources} /> + <MessageSources sources={message.sources}/> </div> )} <div className="flex flex-col space-y-2"> @@ -114,15 +131,16 @@ const MessageBox = ({ {parsedMessage} </Markdown> {loading && isLast ? null : ( - <div className="flex flex-row items-center justify-between w-full text-black dark:text-white py-4 -mx-2"> + <div + className="flex flex-row items-center justify-between w-full text-black dark:text-white py-4 -mx-2"> <div className="flex flex-row items-center space-x-1"> {/* <button className="p-2 text-black/70 dark:text-white/70 rounded-xl hover:bg-light-secondary dark:hover:bg-dark-secondary transition duration-200 hover:text-black text-black dark:hover:text-white"> <Share size={18} /> </button> */} - <Rewrite rewrite={rewrite} messageId={message.messageId} /> + <Rewrite rewrite={rewrite} messageId={message.messageId}/> </div> <div className="flex flex-row items-center space-x-1"> - <Copy initialMessage={message.content} message={message} /> + <Copy initialMessage={message.content} message={message}/> <button onClick={() => { if (speechStatus === 'started') { @@ -134,9 +152,9 @@ const MessageBox = ({ className="p-2 text-black/70 dark:text-white/70 rounded-xl hover:bg-light-secondary dark:hover:bg-dark-secondary transition duration-200 hover:text-black dark:hover:text-white" > {speechStatus === 'started' ? ( - <StopCircle size={18} /> + <StopCircle size={18}/> ) : ( - <Volume2 size={18} /> + <Volume2 size={18}/> )} </button> </div> @@ -148,10 +166,10 @@ const MessageBox = ({ message.role === 'assistant' && !loading && ( <> - <div className="h-px w-full bg-light-secondary dark:bg-dark-secondary" /> + <div className="h-px w-full bg-light-secondary dark:bg-dark-secondary"/> <div className="flex flex-col space-y-3 text-black dark:text-white"> <div className="flex flex-row items-center space-x-2 mt-4"> - <Layers3 /> + <Layers3/> <h3 className="text-xl font-medium">Related</h3> </div> <div className="flex flex-col space-y-3"> @@ -160,7 +178,7 @@ const MessageBox = ({ className="flex flex-col space-y-3 text-sm" key={i} > - <div className="h-px w-full bg-light-secondary dark:bg-dark-secondary" /> + <div className="h-px w-full bg-light-secondary dark:bg-dark-secondary"/> <div onClick={() => { sendMessage(suggestion); @@ -183,7 +201,8 @@ const MessageBox = ({ )} </div> </div> - <div className="lg:sticky lg:top-20 flex flex-col items-center space-y-3 w-full lg:w-3/12 z-30 h-full pb-4"> + <div + className="lg:sticky lg:top-20 flex flex-col items-center space-y-3 w-full lg:w-3/12 z-30 h-full pb-4"> <SearchImages query={history[messageIndex - 1].content} chatHistory={history.slice(0, messageIndex - 1)} From 32ce39437fbde84404a9d87b892ee2bc7917e320 Mon Sep 17 00:00:00 2001 From: litongjava <litongjava@qq.com> Date: Tue, 4 Feb 2025 22:58:28 -1000 Subject: [PATCH 18/18] feat: enable quality --- ui/components/ChatWindow.tsx | 14 +++++++++++++- ui/components/EmptyChatMessageInput.tsx | 7 ++----- ui/components/MessageInputActions/Optimization.tsx | 12 +++++------- 3 files changed, 20 insertions(+), 13 deletions(-) diff --git a/ui/components/ChatWindow.tsx b/ui/components/ChatWindow.tsx index 54c4b49..27e23b6 100644 --- a/ui/components/ChatWindow.tsx +++ b/ui/components/ChatWindow.tsx @@ -492,6 +492,18 @@ const ChatWindow = ({id}: { id?: string }) => { setFocusMode(mode); }; + useEffect(() => { + const mode = localStorage.getItem('optimizationMode'); + if (mode) { + setOptimizationMode(mode); + } + }, [setOptimizationMode]); + + const handleOptimizationModeChange = (mode: string) => { + localStorage.setItem('optimizationMode', mode); + setOptimizationMode(mode); + }; + const messagesRef = useRef<Message[]>([]); useEffect(() => { @@ -716,7 +728,7 @@ const ChatWindow = ({id}: { id?: string }) => { setCopilotEnabled={setCopilotEnabled} setFocusMode={handleFocusModeChange} optimizationMode={optimizationMode} - setOptimizationMode={setOptimizationMode} + setOptimizationMode={handleOptimizationModeChange} fileIds={fileIds} setFileIds={setFileIds} files={files} diff --git a/ui/components/EmptyChatMessageInput.tsx b/ui/components/EmptyChatMessageInput.tsx index 36be1c3..96be337 100644 --- a/ui/components/EmptyChatMessageInput.tsx +++ b/ui/components/EmptyChatMessageInput.tsx @@ -98,11 +98,8 @@ const EmptyChatMessageInput = ({ showText /> - <CopilotToggle setCopilotEnabled={setCopilotEnabled} copilotEnabled={copilotEnabled}/> - {/*<Optimization*/} - {/* optimizationMode={optimizationMode}*/} - {/* setOptimizationMode={setOptimizationMode}*/} - {/*/>*/} + {/*<CopilotToggle setCopilotEnabled={setCopilotEnabled} copilotEnabled={copilotEnabled}/>*/} + <Optimization optimizationMode={optimizationMode} setOptimizationMode={setOptimizationMode}/> <button disabled={message.trim().length === 0} className="bg-[#24A0ED] text-white disabled:text-black/50 dark:disabled:text-white/50 disabled:bg-[#e0e0dc] dark:disabled:bg-[#ececec21] hover:bg-opacity-85 transition duration-100 rounded-full p-2" diff --git a/ui/components/MessageInputActions/Optimization.tsx b/ui/components/MessageInputActions/Optimization.tsx index ac8a7b0..465129f 100644 --- a/ui/components/MessageInputActions/Optimization.tsx +++ b/ui/components/MessageInputActions/Optimization.tsx @@ -23,7 +23,7 @@ const OptimizationModes = [ }, { key: 'quality', - title: 'Quality (Soon)', + title: 'Quality', description: 'Get the most thorough and accurate answer', icon: ( <Star @@ -49,13 +49,11 @@ const Optimization = ({ > <div className="flex flex-row items-center space-x-1"> { - OptimizationModes.find((mode) => mode.key === optimizationMode) - ?.icon + OptimizationModes.find((mode) => mode.key === optimizationMode)?.icon } <p className="text-xs font-medium"> { - OptimizationModes.find((mode) => mode.key === optimizationMode) - ?.title + OptimizationModes.find((mode) => mode.key === optimizationMode)?.title } </p> <ChevronDown size={20} /> @@ -76,13 +74,13 @@ const Optimization = ({ <PopoverButton onClick={() => setOptimizationMode(mode.key)} key={i} - disabled={mode.key === 'quality'} + disabled={mode.key === 'quality1'} className={cn( 'p-2 rounded-lg flex flex-col items-start justify-start text-start space-y-1 duration-200 cursor-pointer transition', optimizationMode === mode.key ? 'bg-light-secondary dark:bg-dark-secondary' : 'hover:bg-light-secondary dark:hover:bg-dark-secondary', - mode.key === 'quality' && 'opacity-50 cursor-not-allowed', + mode.key === 'quality1' && 'opacity-50 cursor-not-allowed', )} > <div className="flex flex-row items-center space-x-1 text-black dark:text-white">