Merge pull request #5032 from menloresearch/chore/model-loading

chore: model loading and truncate dropdown assiatant title
This commit is contained in:
Faisal Amir 2025-05-20 12:44:51 +07:00 committed by GitHub
commit 76827d42f5
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
5 changed files with 20 additions and 16 deletions

View File

@ -10,7 +10,6 @@ import {
IconPaperclip, IconPaperclip,
IconWorld, IconWorld,
IconAtom, IconAtom,
IconMicrophone,
IconEye, IconEye,
IconTool, IconTool,
IconCodeCircle2, IconCodeCircle2,
@ -29,6 +28,7 @@ import { SystemEvent } from '@/types/events'
import { getTools } from '@/services/mcp' import { getTools } from '@/services/mcp'
import { useChat } from '@/hooks/useChat' import { useChat } from '@/hooks/useChat'
import DropdownModelProvider from '@/containers/DropdownModelProvider' import DropdownModelProvider from '@/containers/DropdownModelProvider'
import { ModelLoader } from '@/containers/loaders/ModelLoader'
type ChatInputProps = { type ChatInputProps = {
className?: string className?: string
@ -44,7 +44,8 @@ const ChatInput = ({
const textareaRef = useRef<HTMLTextAreaElement>(null) const textareaRef = useRef<HTMLTextAreaElement>(null)
const [isFocused, setIsFocused] = useState(false) const [isFocused, setIsFocused] = useState(false)
const [rows, setRows] = useState(1) const [rows, setRows] = useState(1)
const { streamingContent, updateTools, abortControllers } = useAppState() const { streamingContent, updateTools, abortControllers, loadingModel } =
useAppState()
const { prompt, setPrompt } = usePrompt() const { prompt, setPrompt } = usePrompt()
const { t } = useTranslation() const { t } = useTranslation()
const { spellCheckChatInput } = useGeneralSetting() const { spellCheckChatInput } = useGeneralSetting()
@ -53,6 +54,8 @@ const ChatInput = ({
const { selectedModel } = useModelProvider() const { selectedModel } = useModelProvider()
const { sendMessage } = useChat() const { sendMessage } = useChat()
console.log(model)
useEffect(() => { useEffect(() => {
const handleFocusIn = () => { const handleFocusIn = () => {
if (document.activeElement === textareaRef.current) { if (document.activeElement === textareaRef.current) {
@ -173,17 +176,21 @@ const ChatInput = ({
streamingContent && 'opacity-50 pointer-events-none' streamingContent && 'opacity-50 pointer-events-none'
)} )}
> >
{model?.provider === 'llama.cpp' && loadingModel ? (
<ModelLoader />
) : (
<DropdownModelProvider model={model} /> <DropdownModelProvider model={model} />
)}
{/* File attachment - always available */} {/* File attachment - always available */}
<div className="h-6 p-1 flex items-center justify-center rounded-sm hover:bg-main-view-fg/10 transition-all duration-200 ease-in-out gap-1"> <div className="h-6 p-1 flex items-center justify-center rounded-sm hover:bg-main-view-fg/10 transition-all duration-200 ease-in-out gap-1">
<IconPaperclip size={18} className="text-main-view-fg/50" /> <IconPaperclip size={18} className="text-main-view-fg/50" />
</div> </div>
{/* Microphone - always available */} {/* Microphone - always available - Temp Hide */}
<div className="h-6 p-1 flex items-center justify-center rounded-sm hover:bg-main-view-fg/10 transition-all duration-200 ease-in-out gap-1"> {/* <div className="h-6 p-1 flex items-center justify-center rounded-sm hover:bg-main-view-fg/10 transition-all duration-200 ease-in-out gap-1">
<IconMicrophone size={18} className="text-main-view-fg/50" /> <IconMicrophone size={18} className="text-main-view-fg/50" />
</div> </div> */}
{selectedModel?.capabilities?.includes('vision') && ( {selectedModel?.capabilities?.includes('vision') && (
<div className="h-6 p-1 flex items-center justify-center rounded-sm hover:bg-main-view-fg/10 transition-all duration-200 ease-in-out gap-1"> <div className="h-6 p-1 flex items-center justify-center rounded-sm hover:bg-main-view-fg/10 transition-all duration-200 ease-in-out gap-1">

View File

@ -41,7 +41,7 @@ const DropdownAssistant = () => {
</button> </button>
</DropdownMenuTrigger> </DropdownMenuTrigger>
<div <div
className="size-5 cursor-pointer relative z-10 flex items-center justify-center rounded hover:bg-main-view-fg/10 transition-all duration-200 ease-in-out" className="size-5 cursor-pointer relative z-10 flex items-center justify-center rounded hover:bg-main-view-fg/10 transition-all duration-200 ease-in-out "
onClick={() => { onClick={() => {
console.log('edit clicked', selectedAssistant) console.log('edit clicked', selectedAssistant)
if (selectedAssistant) { if (selectedAssistant) {
@ -64,7 +64,7 @@ const DropdownAssistant = () => {
align="start" align="start"
> >
{assistants.map((assistant) => ( {assistants.map((assistant) => (
<div className="relative" key={assistant.id}> <div className="relative pr-6" key={assistant.id}>
<DropdownMenuItem className="flex justify-between items-center"> <DropdownMenuItem className="flex justify-between items-center">
<span <span
className="truncate text-main-view-fg/70 flex-1 cursor-pointer" className="truncate text-main-view-fg/70 flex-1 cursor-pointer"
@ -76,7 +76,7 @@ const DropdownAssistant = () => {
{assistant.name} {assistant.name}
</span> </span>
</DropdownMenuItem> </DropdownMenuItem>
<div className="absolute top-1/2 -translate-y-1/2 right-2"> <div className="absolute top-1/2 -translate-y-1/2 right-1">
<div className="size-5 text-main-view-fg/50 cursor-pointer relative z-10 flex items-center justify-center rounded hover:bg-main-view-fg/10 transition-all duration-200 ease-in-out"> <div className="size-5 text-main-view-fg/50 cursor-pointer relative z-10 flex items-center justify-center rounded hover:bg-main-view-fg/10 transition-all duration-200 ease-in-out">
<IconSettings <IconSettings
size={16} size={16}

View File

@ -48,7 +48,7 @@ const mainMenus = [
route: route.home, route: route.home,
}, },
{ {
title: 'Assistant', title: 'Assistants',
icon: IconClipboardSmileFilled, icon: IconClipboardSmileFilled,
route: route.assistant, route: route.assistant,
}, },

View File

@ -56,7 +56,7 @@ function Assistant() {
return ( return (
<div className="flex h-full flex-col flex-justify-center"> <div className="flex h-full flex-col flex-justify-center">
<HeaderPage> <HeaderPage>
<span>Assistant</span> <span>Assistants</span>
</HeaderPage> </HeaderPage>
<div className="h-full p-4 overflow-y-auto"> <div className="h-full p-4 overflow-y-auto">
<div className="grid grid-cols-3 gap-4"> <div className="grid grid-cols-3 gap-4">

View File

@ -11,7 +11,7 @@ import ChatInput from '@/containers/ChatInput'
import { useShallow } from 'zustand/react/shallow' import { useShallow } from 'zustand/react/shallow'
import { ThreadContent } from '@/containers/ThreadContent' import { ThreadContent } from '@/containers/ThreadContent'
import { StreamingContent } from '@/containers/StreamingContent' import { StreamingContent } from '@/containers/StreamingContent'
import { ModelLoader } from '@/containers/loaders/ModelLoader'
import { useMessages } from '@/hooks/useMessages' import { useMessages } from '@/hooks/useMessages'
import { fetchMessages } from '@/services/messages' import { fetchMessages } from '@/services/messages'
import { useAppState } from '@/hooks/useAppState' import { useAppState } from '@/hooks/useAppState'
@ -31,7 +31,7 @@ function ThreadDetail() {
const { currentThreadId, getThreadById, setCurrentThreadId } = useThreads() const { currentThreadId, getThreadById, setCurrentThreadId } = useThreads()
const { setCurrentAssistant, assistants } = useAssistant() const { setCurrentAssistant, assistants } = useAssistant()
const { setMessages } = useMessages() const { setMessages } = useMessages()
const { streamingContent, loadingModel } = useAppState() const { streamingContent } = useAppState()
const { messages } = useMessages( const { messages } = useMessages(
useShallow((state) => ({ useShallow((state) => ({
@ -172,9 +172,6 @@ function ThreadDetail() {
<div className="flex items-center justify-between w-full pr-2"> <div className="flex items-center justify-between w-full pr-2">
<DropdownAssistant /> <DropdownAssistant />
</div> </div>
{thread?.model?.provider === 'llama.cpp' && loadingModel && (
<ModelLoader />
)}
</HeaderPage> </HeaderPage>
<div className="flex flex-col h-[calc(100%-40px)] "> <div className="flex flex-col h-[calc(100%-40px)] ">
<div <div