diff --git a/src/lib/components/chat/MessageInput.svelte b/src/lib/components/chat/MessageInput.svelte index ffe959fc4e..0364870da9 100644 --- a/src/lib/components/chat/MessageInput.svelte +++ b/src/lib/components/chat/MessageInput.svelte @@ -469,40 +469,62 @@ let user = null; export let placeholder = ''; - let visionCapableModels = []; - $: visionCapableModels = (atSelectedModel?.id ? [atSelectedModel.id] : selectedModels).filter( - (model) => $models.find((m) => m.id === model)?.info?.meta?.capabilities?.vision ?? true + type ModelCapability = + | 'vision' + | 'file_upload' + | 'web_search' + | 'image_generation' + | 'code_interpreter' + | 'terminal'; + type ModelCapabilitiesById = Record>>; + + let modelCapabilitiesById: ModelCapabilitiesById = {}; + $: modelCapabilitiesById = Object.fromEntries( + ($models ?? []).map((model) => [model.id, model.info?.meta?.capabilities ?? {}]) ); + const getCapableModelIds = ( + modelIds: string[], + capability: ModelCapability, + capabilitiesById: ModelCapabilitiesById + ) => modelIds.filter((id) => capabilitiesById[id]?.[capability] ?? true); + + let visionCapableModels = []; + $: visionCapableModels = getCapableModelIds(selectedModelIds, 'vision', modelCapabilitiesById); + let fileUploadCapableModels = []; - $: fileUploadCapableModels = (atSelectedModel?.id ? [atSelectedModel.id] : selectedModels).filter( - (model) => $models.find((m) => m.id === model)?.info?.meta?.capabilities?.file_upload ?? true + $: fileUploadCapableModels = getCapableModelIds( + selectedModelIds, + 'file_upload', + modelCapabilitiesById ); let webSearchCapableModels = []; - $: webSearchCapableModels = (atSelectedModel?.id ? [atSelectedModel.id] : selectedModels).filter( - (model) => $models.find((m) => m.id === model)?.info?.meta?.capabilities?.web_search ?? true + $: webSearchCapableModels = getCapableModelIds( + selectedModelIds, + 'web_search', + modelCapabilitiesById ); let imageGenerationCapableModels = []; - $: imageGenerationCapableModels = ( - atSelectedModel?.id ? [atSelectedModel.id] : selectedModels - ).filter( - (model) => - $models.find((m) => m.id === model)?.info?.meta?.capabilities?.image_generation ?? true + $: imageGenerationCapableModels = getCapableModelIds( + selectedModelIds, + 'image_generation', + modelCapabilitiesById ); let codeInterpreterCapableModels = []; - $: codeInterpreterCapableModels = ( - atSelectedModel?.id ? [atSelectedModel.id] : selectedModels - ).filter( - (model) => - $models.find((m) => m.id === model)?.info?.meta?.capabilities?.code_interpreter ?? true + $: codeInterpreterCapableModels = getCapableModelIds( + selectedModelIds, + 'code_interpreter', + modelCapabilitiesById ); let terminalCapableModels = []; - $: terminalCapableModels = (atSelectedModel?.id ? [atSelectedModel.id] : selectedModels).filter( - (model) => $models.find((m) => m.id === model)?.info?.meta?.capabilities?.terminal ?? true + $: terminalCapableModels = getCapableModelIds( + selectedModelIds, + 'terminal', + modelCapabilitiesById ); let toggleFilters = []; @@ -518,23 +540,20 @@ let showWebSearchButton = false; $: showWebSearchButton = - (atSelectedModel?.id ? [atSelectedModel.id] : selectedModels).length === - webSearchCapableModels.length && + selectedModelIds.length === webSearchCapableModels.length && $config?.features?.enable_web_search && ($_user.role === 'admin' || $_user?.permissions?.features?.web_search); let showImageGenerationButton = false; $: showImageGenerationButton = - (atSelectedModel?.id ? [atSelectedModel.id] : selectedModels).length === - imageGenerationCapableModels.length && + selectedModelIds.length === imageGenerationCapableModels.length && $config?.features?.enable_image_generation && ($_user.role === 'admin' || $_user?.permissions?.features?.image_generation); let showCodeInterpreterButton = false; $: showCodeInterpreterButton = !$selectedTerminalId && - (atSelectedModel?.id ? [atSelectedModel.id] : selectedModels).length === - codeInterpreterCapableModels.length && + selectedModelIds.length === codeInterpreterCapableModels.length && $config?.features?.enable_code_interpreter && ($_user.role === 'admin' || $_user?.permissions?.features?.code_interpreter); @@ -600,7 +619,7 @@ return null; } - if (fileUploadCapableModels.length !== selectedModels.length) { + if (fileUploadCapableModels.length !== selectedModelIds.length) { toast.error($i18n.t('Model(s) do not support file upload')); return null; } @@ -1340,11 +1359,11 @@ alt="" imageClassName=" size-10 rounded-xl object-cover" /> - {#if atSelectedModel ? visionCapableModels.length === 0 : selectedModels.length !== visionCapableModels.length} + {#if selectedModelIds.length !== visionCapableModels.length} !visionCapableModels.includes(id)) .join(', ') })} @@ -1617,7 +1636,7 @@
- {#if chat.user_id && chat.owner_name} + {#if showOwnerInfo && chat.user_id && chat.owner_name} {/if} diff --git a/src/lib/components/chat/Placeholder/FolderPlaceholder.svelte b/src/lib/components/chat/Placeholder/FolderPlaceholder.svelte index 52d9307873..f89c40dc2e 100644 --- a/src/lib/components/chat/Placeholder/FolderPlaceholder.svelte +++ b/src/lib/components/chat/Placeholder/FolderPlaceholder.svelte @@ -24,6 +24,12 @@ let chatListLoading = false; let allChatsLoaded = false; + $: showOwnerInfo = Boolean( + folder?.shared || + (folder?.user_id && folder.user_id !== $user?.id) || + (folder?.access_grants?.length ?? 0) > 0 + ); + const loadChats = async () => { // getSharedFolderChats returns all users' chats in one shot; no pagination allChatsLoaded = true; @@ -96,7 +102,13 @@ {:else if selectedTab === 'chats'} {#if chats !== null} - + {:else}
diff --git a/src/lib/components/layout/Sidebar/ChatItem.svelte b/src/lib/components/layout/Sidebar/ChatItem.svelte index dd556b28d7..2dd5def8e1 100644 --- a/src/lib/components/layout/Sidebar/ChatItem.svelte +++ b/src/lib/components/layout/Sidebar/ChatItem.svelte @@ -540,7 +540,7 @@ {/if}