diff --git a/src/lib/components/chat/MessageInput.svelte b/src/lib/components/chat/MessageInput.svelte index 39aaeeb32..9ee9bf606 100644 --- a/src/lib/components/chat/MessageInput.svelte +++ b/src/lib/components/chat/MessageInput.svelte @@ -116,12 +116,33 @@ export let placeholder = ''; let visionCapableModels = []; - $: visionCapableModels = [...(atSelectedModel ? [atSelectedModel] : selectedModels)].filter( + $: visionCapableModels = (atSelectedModel?.id ? [atSelectedModel.id] : selectedModels).filter( (model) => $models.find((m) => m.id === model)?.info?.meta?.capabilities?.vision ?? true ); + let webSearchCapableModels = []; + $: webSearchCapableModels = (atSelectedModel?.id ? [atSelectedModel.id] : selectedModels).filter( + (model) => $models.find((m) => m.id === model)?.info?.meta?.capabilities?.web_search ?? true + ); + + let imageGenerationCapableModels = []; + $: imageGenerationCapableModels = ( + atSelectedModel?.id ? [atSelectedModel.id] : selectedModels + ).filter( + (model) => + $models.find((m) => m.id === model)?.info?.meta?.capabilities?.image_generation ?? true + ); + + let codeInterpreterCapableModels = []; + $: codeInterpreterCapableModels = ( + atSelectedModel?.id ? [atSelectedModel.id] : selectedModels + ).filter( + (model) => + $models.find((m) => m.id === model)?.info?.meta?.capabilities?.code_interpreter ?? true + ); + let toggleFilters = []; - $: toggleFilters = (atSelectedModel?.id || selectedModels) + $: toggleFilters = (atSelectedModel?.id ? [atSelectedModel.id] : selectedModels) .map((id) => ($models.find((model) => model.id === id) || {})?.filters ?? []) .reduce((acc, filters) => acc.filter((f1) => filters.some((f2) => f2.id === f1.id))); @@ -879,7 +900,7 @@ console.log(userMessageElement); - userMessageElement.scrollIntoView({ block: 'center' }); + userMessageElement?.scrollIntoView({ block: 'center' }); editButton?.click(); } @@ -1196,7 +1217,7 @@ {/each} - {#if $config?.features?.enable_web_search && ($_user.role === 'admin' || $_user?.permissions?.features?.web_search)} + {#if (atSelectedModel?.id ? [atSelectedModel.id] : selectedModels).length === webSearchCapableModels.length && $config?.features?.enable_web_search && ($_user.role === 'admin' || $_user?.permissions?.features?.web_search)} (webSearchEnabled = !webSearchEnabled)} @@ -1215,7 +1236,7 @@ {/if} - {#if $config?.features?.enable_image_generation && ($_user.role === 'admin' || $_user?.permissions?.features?.image_generation)} + {#if (atSelectedModel?.id ? [atSelectedModel.id] : selectedModels).length === imageGenerationCapableModels.length && $config?.features?.enable_image_generation && ($_user.role === 'admin' || $_user?.permissions?.features?.image_generation)} @@ -1234,7 +1255,7 @@ {/if} - {#if $config?.features?.enable_code_interpreter && ($_user.role === 'admin' || $_user?.permissions?.features?.code_interpreter)} + {#if (atSelectedModel?.id ? [atSelectedModel.id] : selectedModels).length === codeInterpreterCapableModels.length && $config?.features?.enable_code_interpreter && ($_user.role === 'admin' || $_user?.permissions?.features?.code_interpreter)} diff --git a/src/lib/components/workspace/Models/Capabilities.svelte b/src/lib/components/workspace/Models/Capabilities.svelte index 56a6cf4d6..baf9cd915 100644 --- a/src/lib/components/workspace/Models/Capabilities.svelte +++ b/src/lib/components/workspace/Models/Capabilities.svelte @@ -7,15 +7,39 @@ const i18n = getContext('i18n'); const capabilityLabels = { - vision: $i18n.t('Model accepts image inputs'), - usage: $i18n.t( - 'Sends `stream_options: { include_usage: true }` in the request.\nSupported providers will return token usage information in the response when set.' - ), - citations: $i18n.t('Displays citations in the response') + vision: { + label: $i18n.t('Vision'), + description: $i18n.t('Model accepts image inputs') + }, + web_search: { + label: $i18n.t('Web Search'), + description: $i18n.t('Model can search the web for information') + }, + image_generation: { + label: $i18n.t('Image Generation'), + description: $i18n.t('Model can generate images based on text prompts') + }, + code_interpreter: { + label: $i18n.t('Code Interpreter'), + description: $i18n.t('Model can execute code and perform calculations') + }, + usage: { + label: $i18n.t('Usage'), + description: $i18n.t( + 'Sends `stream_options: { include_usage: true }` in the request.\nSupported providers will return token usage information in the response when set.' + ) + }, + citations: { + label: $i18n.t('Citations'), + description: $i18n.t('Displays citations in the response') + } }; export let capabilities: { vision?: boolean; + web_search?: boolean; + image_generation?: boolean; + code_interpreter?: boolean; usage?: boolean; citations?: boolean; } = {}; @@ -36,8 +60,8 @@ /> - - {$i18n.t(capability)} + + {$i18n.t(capabilityLabels[capability].label)} diff --git a/src/lib/components/workspace/Models/ModelEditor.svelte b/src/lib/components/workspace/Models/ModelEditor.svelte index 6b348a57f..c8934eb00 100644 --- a/src/lib/components/workspace/Models/ModelEditor.svelte +++ b/src/lib/components/workspace/Models/ModelEditor.svelte @@ -77,9 +77,11 @@ }; let capabilities = { vision: true, + web_search: true, + image_generation: true, + code_interpreter: true, citations: true, - usage: undefined, - reasoning: false + usage: undefined }; let knowledge = [];