Browse Source

Merge pull request #2140 from cheahjs/feat/model-config

feat: configurable model name, description and vision capability
Timothy Jaeryang Baek 11 months ago
parent
commit
f34fd3fbe1
56 changed files with 1314 additions and 127 deletions
  1. 19 2
      backend/apps/litellm/main.py
  2. 11 1
      backend/apps/ollama/main.py
  3. 12 2
      backend/apps/openai/main.py
  4. 12 0
      backend/apps/web/internal/db.py
  5. 55 0
      backend/apps/web/internal/migrations/009_add_models.py
  6. 136 0
      backend/apps/web/models/models.py
  7. 31 2
      backend/main.py
  8. 74 0
      src/lib/apis/index.ts
  9. 2 1
      src/lib/apis/litellm/index.ts
  10. 6 1
      src/lib/apis/openai/index.ts
  11. 1 1
      src/lib/components/admin/Settings/Users.svelte
  12. 81 63
      src/lib/components/chat/Chat.svelte
  13. 92 9
      src/lib/components/chat/MessageInput.svelte
  14. 5 3
      src/lib/components/chat/MessageInput/Models.svelte
  15. 1 1
      src/lib/components/chat/Messages/ResponseMessage.svelte
  16. 1 1
      src/lib/components/chat/ModelSelector.svelte
  17. 39 6
      src/lib/components/chat/ModelSelector/Selector.svelte
  18. 5 2
      src/lib/components/chat/Settings/Interface.svelte
  19. 251 20
      src/lib/components/chat/Settings/Models.svelte
  20. 2 1
      src/lib/components/common/Tooltip.svelte
  21. 4 1
      src/lib/components/documents/Settings/General.svelte
  22. 1 1
      src/lib/components/workspace/Playground.svelte
  23. 14 0
      src/lib/i18n/locales/ar-BH/translation.json
  24. 14 0
      src/lib/i18n/locales/bg-BG/translation.json
  25. 14 0
      src/lib/i18n/locales/bn-BD/translation.json
  26. 14 0
      src/lib/i18n/locales/ca-ES/translation.json
  27. 14 0
      src/lib/i18n/locales/de-DE/translation.json
  28. 14 0
      src/lib/i18n/locales/dg-DG/translation.json
  29. 14 0
      src/lib/i18n/locales/en-GB/translation.json
  30. 14 0
      src/lib/i18n/locales/en-US/translation.json
  31. 14 0
      src/lib/i18n/locales/es-ES/translation.json
  32. 14 0
      src/lib/i18n/locales/fa-IR/translation.json
  33. 14 0
      src/lib/i18n/locales/fi-FI/translation.json
  34. 14 0
      src/lib/i18n/locales/fr-CA/translation.json
  35. 14 0
      src/lib/i18n/locales/fr-FR/translation.json
  36. 14 0
      src/lib/i18n/locales/he-IL/translation.json
  37. 14 0
      src/lib/i18n/locales/hi-IN/translation.json
  38. 14 0
      src/lib/i18n/locales/hr-HR/translation.json
  39. 14 0
      src/lib/i18n/locales/it-IT/translation.json
  40. 14 0
      src/lib/i18n/locales/ja-JP/translation.json
  41. 14 0
      src/lib/i18n/locales/ka-GE/translation.json
  42. 14 0
      src/lib/i18n/locales/ko-KR/translation.json
  43. 14 0
      src/lib/i18n/locales/nl-NL/translation.json
  44. 14 0
      src/lib/i18n/locales/pa-IN/translation.json
  45. 14 0
      src/lib/i18n/locales/pl-PL/translation.json
  46. 14 0
      src/lib/i18n/locales/pt-BR/translation.json
  47. 14 0
      src/lib/i18n/locales/pt-PT/translation.json
  48. 14 0
      src/lib/i18n/locales/ru-RU/translation.json
  49. 14 0
      src/lib/i18n/locales/sr-RS/translation.json
  50. 14 0
      src/lib/i18n/locales/sv-SE/translation.json
  51. 14 0
      src/lib/i18n/locales/tr-TR/translation.json
  52. 14 0
      src/lib/i18n/locales/uk-UA/translation.json
  53. 14 0
      src/lib/i18n/locales/vi-VN/translation.json
  54. 14 0
      src/lib/i18n/locales/zh-CN/translation.json
  55. 14 0
      src/lib/i18n/locales/zh-TW/translation.json
  56. 11 9
      src/lib/stores/index.ts

+ 19 - 2
backend/apps/litellm/main.py

@@ -18,8 +18,9 @@ import requests
 from pydantic import BaseModel, ConfigDict
 from typing import Optional, List
 
+from apps.web.models.models import Models
 from utils.utils import get_verified_user, get_current_user, get_admin_user
-from config import SRC_LOG_LEVELS, ENV
+from config import SRC_LOG_LEVELS
 from constants import MESSAGES
 
 import os
@@ -77,7 +78,7 @@ with open(LITELLM_CONFIG_DIR, "r") as file:
 
 app.state.ENABLE_MODEL_FILTER = ENABLE_MODEL_FILTER.value
 app.state.MODEL_FILTER_LIST = MODEL_FILTER_LIST.value
-
+app.state.MODEL_CONFIG = Models.get_all_models()
 
 app.state.ENABLE = ENABLE_LITELLM
 app.state.CONFIG = litellm_config
@@ -241,6 +242,8 @@ async def get_models(user=Depends(get_current_user)):
                         )
                     )
 
+            for model in data["data"]:
+                add_custom_info_to_model(model)
             return data
         except Exception as e:
 
@@ -261,6 +264,14 @@ async def get_models(user=Depends(get_current_user)):
                         "object": "model",
                         "created": int(time.time()),
                         "owned_by": "openai",
+                        "custom_info": next(
+                            (
+                                item
+                                for item in app.state.MODEL_CONFIG
+                                if item.id == model["model_name"]
+                            ),
+                            None,
+                        ),
                     }
                     for model in app.state.CONFIG["model_list"]
                 ],
@@ -273,6 +284,12 @@ async def get_models(user=Depends(get_current_user)):
         }
 
 
+def add_custom_info_to_model(model: dict):
+    model["custom_info"] = next(
+        (item for item in app.state.MODEL_CONFIG if item.id == model["id"]), None
+    )
+
+
 @app.get("/model/info")
 async def get_model_list(user=Depends(get_admin_user)):
     return {"data": app.state.CONFIG["model_list"]}

+ 11 - 1
backend/apps/ollama/main.py

@@ -29,7 +29,7 @@ import time
 from urllib.parse import urlparse
 from typing import Optional, List, Union
 
-
+from apps.web.models.models import Models
 from apps.web.models.users import Users
 from constants import ERROR_MESSAGES
 from utils.utils import (
@@ -67,6 +67,7 @@ app.state.config = AppConfig()
 
 app.state.config.ENABLE_MODEL_FILTER = ENABLE_MODEL_FILTER
 app.state.config.MODEL_FILTER_LIST = MODEL_FILTER_LIST
+app.state.MODEL_CONFIG = Models.get_all_models()
 
 
 app.state.config.ENABLE_OLLAMA_API = ENABLE_OLLAMA_API
@@ -191,12 +192,21 @@ async def get_all_models():
 
     else:
         models = {"models": []}
+        
+    for model in models["models"]:
+        add_custom_info_to_model(model)
 
     app.state.MODELS = {model["model"]: model for model in models["models"]}
 
     return models
 
 
+def add_custom_info_to_model(model: dict):
+    model["custom_info"] = next(
+        (item for item in app.state.MODEL_CONFIG if item.id == model["model"]), None
+    )
+
+
 @app.get("/api/tags")
 @app.get("/api/tags/{url_idx}")
 async def get_ollama_tags(

+ 12 - 2
backend/apps/openai/main.py

@@ -10,7 +10,7 @@ import logging
 
 from pydantic import BaseModel
 
-
+from apps.web.models.models import Models
 from apps.web.models.users import Users
 from constants import ERROR_MESSAGES
 from utils.utils import (
@@ -52,6 +52,7 @@ app.state.config = AppConfig()
 
 app.state.config.ENABLE_MODEL_FILTER = ENABLE_MODEL_FILTER
 app.state.config.MODEL_FILTER_LIST = MODEL_FILTER_LIST
+app.state.MODEL_CONFIG = Models.get_all_models()
 
 
 app.state.config.ENABLE_OPENAI_API = ENABLE_OPENAI_API
@@ -249,10 +250,19 @@ async def get_all_models():
             )
         }
 
+        for model in models["data"]:
+            add_custom_info_to_model(model)
+
         log.info(f"models: {models}")
         app.state.MODELS = {model["id"]: model for model in models["data"]}
 
-        return models
+    return models
+
+
+def add_custom_info_to_model(model: dict):
+    model["custom_info"] = next(
+        (item for item in app.state.MODEL_CONFIG if item.id == model["id"]), None
+    )
 
 
 @app.get("/models")

+ 12 - 0
backend/apps/web/internal/db.py

@@ -1,3 +1,5 @@
+import json
+
 from peewee import *
 from peewee_migrate import Router
 from playhouse.db_url import connect
@@ -8,6 +10,16 @@ import logging
 log = logging.getLogger(__name__)
 log.setLevel(SRC_LOG_LEVELS["DB"])
 
+
+class JSONField(TextField):
+    def db_value(self, value):
+        return json.dumps(value)
+
+    def python_value(self, value):
+        if value is not None:
+            return json.loads(value)
+
+
 # Check if the file exists
 if os.path.exists(f"{DATA_DIR}/ollama.db"):
     # Rename the file

+ 55 - 0
backend/apps/web/internal/migrations/009_add_models.py

@@ -0,0 +1,55 @@
+"""Peewee migrations -- 009_add_models.py.
+
+Some examples (model - class or model name)::
+
+    > Model = migrator.orm['table_name']            # Return model in current state by name
+    > Model = migrator.ModelClass                   # Return model in current state by name
+
+    > migrator.sql(sql)                             # Run custom SQL
+    > migrator.run(func, *args, **kwargs)           # Run python function with the given args
+    > migrator.create_model(Model)                  # Create a model (could be used as decorator)
+    > migrator.remove_model(model, cascade=True)    # Remove a model
+    > migrator.add_fields(model, **fields)          # Add fields to a model
+    > migrator.change_fields(model, **fields)       # Change fields
+    > migrator.remove_fields(model, *field_names, cascade=True)
+    > migrator.rename_field(model, old_field_name, new_field_name)
+    > migrator.rename_table(model, new_table_name)
+    > migrator.add_index(model, *col_names, unique=False)
+    > migrator.add_not_null(model, *field_names)
+    > migrator.add_default(model, field_name, default)
+    > migrator.add_constraint(model, name, sql)
+    > migrator.drop_index(model, *col_names)
+    > migrator.drop_not_null(model, *field_names)
+    > migrator.drop_constraints(model, *constraints)
+
+"""
+
+from contextlib import suppress
+
+import peewee as pw
+from peewee_migrate import Migrator
+
+
+with suppress(ImportError):
+    import playhouse.postgres_ext as pw_pext
+
+
+def migrate(migrator: Migrator, database: pw.Database, *, fake=False):
+    """Write your migrations here."""
+
+    @migrator.create_model
+    class Model(pw.Model):
+        id = pw.TextField(unique=True)
+        meta = pw.TextField()
+        base_model_id = pw.TextField(null=True)
+        name = pw.TextField()
+        params = pw.TextField()
+
+        class Meta:
+            table_name = "model"
+
+
+def rollback(migrator: Migrator, database: pw.Database, *, fake=False):
+    """Write your rollback migrations here."""
+
+    migrator.remove_model("model")

+ 136 - 0
backend/apps/web/models/models.py

@@ -0,0 +1,136 @@
+import json
+import logging
+from typing import Optional
+
+import peewee as pw
+from playhouse.shortcuts import model_to_dict
+from pydantic import BaseModel
+
+from apps.web.internal.db import DB, JSONField
+
+from config import SRC_LOG_LEVELS
+
+log = logging.getLogger(__name__)
+log.setLevel(SRC_LOG_LEVELS["MODELS"])
+
+
+####################
+# Models DB Schema
+####################
+
+
+# ModelParams is a model for the data stored in the params field of the Model table
+# It isn't currently used in the backend, but it's here as a reference
+class ModelParams(BaseModel):
+    pass
+
+
+# ModelMeta is a model for the data stored in the meta field of the Model table
+# It isn't currently used in the backend, but it's here as a reference
+class ModelMeta(BaseModel):
+    description: str
+    """
+        User-facing description of the model.
+    """
+
+    vision_capable: bool
+    """
+        A flag indicating if the model is capable of vision and thus image inputs
+    """
+
+
+class Model(pw.Model):
+    id = pw.TextField(unique=True)
+    """
+        The model's id as used in the API. If set to an existing model, it will override the model.
+    """
+
+    meta = JSONField()
+    """
+        Holds a JSON encoded blob of metadata, see `ModelMeta`.
+    """
+
+    base_model_id = pw.TextField(null=True)
+    """
+        An optional pointer to the actual model that should be used when proxying requests.
+        Currently unused - but will be used to support Modelfile like behaviour in the future
+    """
+
+    name = pw.TextField()
+    """
+        The human-readable display name of the model.
+    """
+
+    params = JSONField()
+    """
+        Holds a JSON encoded blob of parameters, see `ModelParams`.
+    """
+
+    class Meta:
+        database = DB
+
+
+class ModelModel(BaseModel):
+    id: str
+    meta: ModelMeta
+    base_model_id: Optional[str] = None
+    name: str
+    params: ModelParams
+
+
+####################
+# Forms
+####################
+
+
+class ModelsTable:
+
+    def __init__(
+        self,
+        db: pw.SqliteDatabase | pw.PostgresqlDatabase,
+    ):
+        self.db = db
+        self.db.create_tables([Model])
+
+    def get_all_models(self) -> list[ModelModel]:
+        return [ModelModel(**model_to_dict(model)) for model in Model.select()]
+
+    def update_all_models(self, models: list[ModelModel]) -> bool:
+        try:
+            with self.db.atomic():
+                # Fetch current models from the database
+                current_models = self.get_all_models()
+                current_model_dict = {model.id: model for model in current_models}
+
+                # Create a set of model IDs from the current models and the new models
+                current_model_keys = set(current_model_dict.keys())
+                new_model_keys = set(model.id for model in models)
+
+                # Determine which models need to be created, updated, or deleted
+                models_to_create = [
+                    model for model in models if model.id not in current_model_keys
+                ]
+                models_to_update = [
+                    model for model in models if model.id in current_model_keys
+                ]
+                models_to_delete = current_model_keys - new_model_keys
+
+                # Perform the necessary database operations
+                for model in models_to_create:
+                    Model.create(**model.model_dump())
+
+                for model in models_to_update:
+                    Model.update(**model.model_dump()).where(
+                        Model.id == model.id
+                    ).execute()
+
+                for model_id, model_source in models_to_delete:
+                    Model.delete().where(Model.id == model_id).execute()
+
+            return True
+        except Exception as e:
+            log.exception(e)
+            return False
+
+
+Models = ModelsTable(DB)

+ 31 - 2
backend/main.py

@@ -36,9 +36,9 @@ from apps.web.main import app as webui_app
 
 import asyncio
 from pydantic import BaseModel
-from typing import List
-
+from typing import List, Optional
 
+from apps.web.models.models import Models, ModelModel
 from utils.utils import get_admin_user
 from apps.rag.utils import rag_messages
 
@@ -113,6 +113,8 @@ app.state.config = AppConfig()
 app.state.config.ENABLE_MODEL_FILTER = ENABLE_MODEL_FILTER
 app.state.config.MODEL_FILTER_LIST = MODEL_FILTER_LIST
 
+app.state.MODEL_CONFIG = Models.get_all_models()
+
 app.state.config.WEBHOOK_URL = WEBHOOK_URL
 
 origins = ["*"]
@@ -318,6 +320,33 @@ async def update_model_filter_config(
     }
 
 
+class SetModelConfigForm(BaseModel):
+    models: List[ModelModel]
+
+
+@app.post("/api/config/models")
+async def update_model_config(
+    form_data: SetModelConfigForm, user=Depends(get_admin_user)
+):
+    if not Models.update_all_models(form_data.models):
+        raise HTTPException(
+            status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
+            detail=ERROR_MESSAGES.DEFAULT("Failed to update model config"),
+        )
+
+    ollama_app.state.MODEL_CONFIG = form_data.models
+    openai_app.state.MODEL_CONFIG = form_data.models
+    litellm_app.state.MODEL_CONFIG = form_data.models
+    app.state.MODEL_CONFIG = form_data.models
+
+    return {"models": app.state.MODEL_CONFIG}
+
+
+@app.get("/api/config/models")
+async def get_model_config(user=Depends(get_admin_user)):
+    return {"models": app.state.MODEL_CONFIG}
+
+
 @app.get("/api/webhook")
 async def get_webhook_url(user=Depends(get_admin_user)):
     return {

+ 74 - 0
src/lib/apis/index.ts

@@ -196,3 +196,77 @@ export const updateWebhookUrl = async (token: string, url: string) => {
 
 	return res.url;
 };
+
+export const getModelConfig = async (token: string): Promise<GlobalModelConfig> => {
+	let error = null;
+
+	const res = await fetch(`${WEBUI_BASE_URL}/api/config/models`, {
+		method: 'GET',
+		headers: {
+			'Content-Type': 'application/json',
+			Authorization: `Bearer ${token}`
+		}
+	})
+		.then(async (res) => {
+			if (!res.ok) throw await res.json();
+			return res.json();
+		})
+		.catch((err) => {
+			console.log(err);
+			error = err;
+			return null;
+		});
+
+	if (error) {
+		throw error;
+	}
+
+	return res.models;
+};
+
+export interface ModelConfig {
+	id: string;
+	name: string;
+	meta: ModelMeta;
+	base_model_id?: string;
+	params: ModelParams;
+}
+
+export interface ModelMeta {
+	description?: string;
+	vision_capable?: boolean;
+}
+
+export interface ModelParams {}
+
+export type GlobalModelConfig = ModelConfig[];
+
+export const updateModelConfig = async (token: string, config: GlobalModelConfig) => {
+	let error = null;
+
+	const res = await fetch(`${WEBUI_BASE_URL}/api/config/models`, {
+		method: 'POST',
+		headers: {
+			'Content-Type': 'application/json',
+			Authorization: `Bearer ${token}`
+		},
+		body: JSON.stringify({
+			models: config
+		})
+	})
+		.then(async (res) => {
+			if (!res.ok) throw await res.json();
+			return res.json();
+		})
+		.catch((err) => {
+			console.log(err);
+			error = err;
+			return null;
+		});
+
+	if (error) {
+		throw error;
+	}
+
+	return res;
+};

+ 2 - 1
src/lib/apis/litellm/index.ts

@@ -33,7 +33,8 @@ export const getLiteLLMModels = async (token: string = '') => {
 					id: model.id,
 					name: model.name ?? model.id,
 					external: true,
-					source: 'LiteLLM'
+					source: 'LiteLLM',
+					custom_info: model.custom_info
 				}))
 				.sort((a, b) => {
 					return a.name.localeCompare(b.name);

+ 6 - 1
src/lib/apis/openai/index.ts

@@ -230,7 +230,12 @@ export const getOpenAIModels = async (token: string = '') => {
 
 	return models
 		? models
-				.map((model) => ({ id: model.id, name: model.name ?? model.id, external: true }))
+				.map((model) => ({
+					id: model.id,
+					name: model.name ?? model.id,
+					external: true,
+					custom_info: model.custom_info
+				}))
 				.sort((a, b) => {
 					return a.name.localeCompare(b.name);
 				})

+ 1 - 1
src/lib/components/admin/Settings/Users.svelte

@@ -125,7 +125,7 @@
 												<option value="" disabled selected>{$i18n.t('Select a model')}</option>
 												{#each $models.filter((model) => model.id) as model}
 													<option value={model.id} class="bg-gray-100 dark:bg-gray-700"
-														>{model.name}</option
+														>{model.custom_info?.name ?? model.name}</option
 													>
 												{/each}
 											</select>

+ 81 - 63
src/lib/components/chat/Chat.svelte

@@ -10,6 +10,7 @@
 		chatId,
 		chats,
 		config,
+		type Model,
 		modelfiles,
 		models,
 		settings,
@@ -60,7 +61,7 @@
 	let showModelSelector = true;
 
 	let selectedModels = [''];
-	let atSelectedModel = '';
+	let atSelectedModel: Model | undefined;
 
 	let selectedModelfile = null;
 	$: selectedModelfile =
@@ -328,75 +329,91 @@
 		const _chatId = JSON.parse(JSON.stringify($chatId));
 
 		await Promise.all(
-			(modelId ? [modelId] : atSelectedModel !== '' ? [atSelectedModel.id] : selectedModels).map(
-				async (modelId) => {
-					console.log('modelId', modelId);
-					const model = $models.filter((m) => m.id === modelId).at(0);
-
-					if (model) {
-						// Create response message
-						let responseMessageId = uuidv4();
-						let responseMessage = {
-							parentId: parentId,
-							id: responseMessageId,
-							childrenIds: [],
-							role: 'assistant',
-							content: '',
-							model: model.id,
-							userContext: null,
-							timestamp: Math.floor(Date.now() / 1000) // Unix epoch
-						};
-
-						// Add message to history and Set currentId to messageId
-						history.messages[responseMessageId] = responseMessage;
-						history.currentId = responseMessageId;
-
-						// Append messageId to childrenIds of parent message
-						if (parentId !== null) {
-							history.messages[parentId].childrenIds = [
-								...history.messages[parentId].childrenIds,
-								responseMessageId
-							];
-						}
-
-						await tick();
+			(modelId
+				? [modelId]
+				: atSelectedModel !== undefined
+				? [atSelectedModel.id]
+				: selectedModels
+			).map(async (modelId) => {
+				console.log('modelId', modelId);
+				const model = $models.filter((m) => m.id === modelId).at(0);
+
+				if (model) {
+					// If there are image files, check if model is vision capable
+					const hasImages = messages.some((message) =>
+						message.files?.some((file) => file.type === 'image')
+					);
+					if (hasImages && !(model.custom_info?.meta.vision_capable ?? true)) {
+						toast.error(
+							$i18n.t('Model {{modelName}} is not vision capable', {
+								modelName: model.custom_info?.name ?? model.name ?? model.id
+							})
+						);
+					}
 
-						let userContext = null;
-						if ($settings?.memory ?? false) {
-							if (userContext === null) {
-								const res = await queryMemory(localStorage.token, prompt).catch((error) => {
-									toast.error(error);
-									return null;
-								});
-
-								if (res) {
-									if (res.documents[0].length > 0) {
-										userContext = res.documents.reduce((acc, doc, index) => {
-											const createdAtTimestamp = res.metadatas[index][0].created_at;
-											const createdAtDate = new Date(createdAtTimestamp * 1000)
-												.toISOString()
-												.split('T')[0];
-											acc.push(`${index + 1}. [${createdAtDate}]. ${doc[0]}`);
-											return acc;
-										}, []);
-									}
+					// Create response message
+					let responseMessageId = uuidv4();
+					let responseMessage = {
+						parentId: parentId,
+						id: responseMessageId,
+						childrenIds: [],
+						role: 'assistant',
+						content: '',
+						model: model.id,
+						modelName: model.custom_info?.name ?? model.name ?? model.id,
+						userContext: null,
+						timestamp: Math.floor(Date.now() / 1000) // Unix epoch
+					};
+
+					// Add message to history and Set currentId to messageId
+					history.messages[responseMessageId] = responseMessage;
+					history.currentId = responseMessageId;
+
+					// Append messageId to childrenIds of parent message
+					if (parentId !== null) {
+						history.messages[parentId].childrenIds = [
+							...history.messages[parentId].childrenIds,
+							responseMessageId
+						];
+					}
 
-									console.log(userContext);
+					await tick();
+
+					let userContext = null;
+					if ($settings?.memory ?? false) {
+						if (userContext === null) {
+							const res = await queryMemory(localStorage.token, prompt).catch((error) => {
+								toast.error(error);
+								return null;
+							});
+
+							if (res) {
+								if (res.documents[0].length > 0) {
+									userContext = res.documents.reduce((acc, doc, index) => {
+										const createdAtTimestamp = res.metadatas[index][0].created_at;
+										const createdAtDate = new Date(createdAtTimestamp * 1000)
+											.toISOString()
+											.split('T')[0];
+										acc.push(`${index + 1}. [${createdAtDate}]. ${doc[0]}`);
+										return acc;
+									}, []);
 								}
+
+								console.log(userContext);
 							}
 						}
-						responseMessage.userContext = userContext;
+					}
+					responseMessage.userContext = userContext;
 
-						if (model?.external) {
-							await sendPromptOpenAI(model, prompt, responseMessageId, _chatId);
-						} else if (model) {
-							await sendPromptOllama(model, prompt, responseMessageId, _chatId);
-						}
-					} else {
-						toast.error($i18n.t(`Model {{modelId}} not found`, { modelId }));
+					if (model?.external) {
+						await sendPromptOpenAI(model, prompt, responseMessageId, _chatId);
+					} else if (model) {
+						await sendPromptOllama(model, prompt, responseMessageId, _chatId);
 					}
+				} else {
+					toast.error($i18n.t(`Model {{modelId}} not found`, { modelId }));
 				}
-			)
+			})
 		);
 
 		await chats.set(await getChatList(localStorage.token));
@@ -855,7 +872,7 @@
 		responseMessage.error = true;
 		responseMessage.content =
 			$i18n.t(`Uh-oh! There was an issue connecting to {{provider}}.`, {
-				provider: model.name ?? model.id
+				provider: model.custom_info?.name ?? model.name ?? model.id
 			}) +
 			'\n' +
 			errorMessage;
@@ -1049,6 +1066,7 @@
 		bind:prompt
 		bind:autoScroll
 		bind:selectedModel={atSelectedModel}
+		{selectedModels}
 		{messages}
 		{submitPrompt}
 		{stopResponse}

+ 92 - 9
src/lib/components/chat/MessageInput.svelte

@@ -1,7 +1,7 @@
 <script lang="ts">
 	import { toast } from 'svelte-sonner';
 	import { onMount, tick, getContext } from 'svelte';
-	import { mobile, modelfiles, settings, showSidebar } from '$lib/stores';
+	import { type Model, mobile, modelfiles, settings, showSidebar, models } from '$lib/stores';
 	import { blobToFile, calculateSHA256, findWordIndices } from '$lib/utils';
 
 	import {
@@ -27,7 +27,8 @@
 	export let stopResponse: Function;
 
 	export let autoScroll = true;
-	export let selectedModel = '';
+	export let selectedAtModel: Model | undefined;
+	export let selectedModels: [''];
 
 	let chatTextAreaElement: HTMLTextAreaElement;
 	let filesInputElement;
@@ -52,6 +53,8 @@
 
 	let speechRecognition;
 
+	let visionCapableState = 'all';
+
 	$: if (prompt) {
 		if (chatTextAreaElement) {
 			chatTextAreaElement.style.height = '';
@@ -59,6 +62,20 @@
 		}
 	}
 
+	$: {
+		if (selectedAtModel || selectedModels) {
+			visionCapableState = checkModelsAreVisionCapable();
+			if (visionCapableState === 'none') {
+				// Remove all image files
+				const fileCount = files.length;
+				files = files.filter((file) => file.type != 'image');
+				if (files.length < fileCount) {
+					toast.warning($i18n.t('All selected models do not support image input, removed images'));
+				}
+			}
+		}
+	}
+
 	let mediaRecorder;
 	let audioChunks = [];
 	let isRecording = false;
@@ -326,6 +343,35 @@
 		}
 	};
 
+	const checkModelsAreVisionCapable = () => {
+		let modelsToCheck = [];
+		if (selectedAtModel !== undefined) {
+			modelsToCheck = [selectedAtModel.id];
+		} else {
+			modelsToCheck = selectedModels;
+		}
+		if (modelsToCheck.length == 0 || modelsToCheck[0] == '') {
+			return 'all';
+		}
+		let visionCapableCount = 0;
+		for (const modelName of modelsToCheck) {
+			const model = $models.find((m) => m.id === modelName);
+			if (!model) {
+				continue;
+			}
+			if (model.custom_info?.meta.vision_capable ?? true) {
+				visionCapableCount++;
+			}
+		}
+		if (visionCapableCount == modelsToCheck.length) {
+			return 'all';
+		} else if (visionCapableCount == 0) {
+			return 'none';
+		} else {
+			return 'some';
+		}
+	};
+
 	onMount(() => {
 		window.setTimeout(() => chatTextAreaElement?.focus(), 0);
 
@@ -358,6 +404,10 @@
 					inputFiles.forEach((file) => {
 						console.log(file, file.name.split('.').at(-1));
 						if (['image/gif', 'image/webp', 'image/jpeg', 'image/png'].includes(file['type'])) {
+							if (visionCapableState == 'none') {
+								toast.error($i18n.t('Selected models do not support image inputs'));
+								return;
+							}
 							let reader = new FileReader();
 							reader.onload = (event) => {
 								files = [
@@ -494,12 +544,12 @@
 						bind:chatInputPlaceholder
 						{messages}
 						on:select={(e) => {
-							selectedModel = e.detail;
+							selectedAtModel = e.detail;
 							chatTextAreaElement?.focus();
 						}}
 					/>
 
-					{#if selectedModel !== ''}
+					{#if selectedAtModel !== undefined}
 						<div
 							class="px-3 py-2.5 text-left w-full flex justify-between items-center absolute bottom-0 left-0 right-0 bg-gradient-to-t from-50% from-white dark:from-gray-900"
 						>
@@ -508,21 +558,23 @@
 									crossorigin="anonymous"
 									alt="model profile"
 									class="size-5 max-w-[28px] object-cover rounded-full"
-									src={$modelfiles.find((modelfile) => modelfile.tagName === selectedModel.id)
+									src={$modelfiles.find((modelfile) => modelfile.tagName === selectedAtModel.id)
 										?.imageUrl ??
 										($i18n.language === 'dg-DG'
 											? `/doge.png`
 											: `${WEBUI_BASE_URL}/static/favicon.png`)}
 								/>
 								<div>
-									Talking to <span class=" font-medium">{selectedModel.name} </span>
+									Talking to <span class=" font-medium"
+										>{selectedAtModel.custom_info?.name ?? selectedAtModel.name}
+									</span>
 								</div>
 							</div>
 							<div>
 								<button
 									class="flex items-center"
 									on:click={() => {
-										selectedModel = '';
+										selectedAtModel = undefined;
 									}}
 								>
 									<XMark />
@@ -550,6 +602,12 @@
 									if (
 										['image/gif', 'image/webp', 'image/jpeg', 'image/png'].includes(file['type'])
 									) {
+										if (visionCapableState === 'none') {
+											toast.error($i18n.t('Selected models do not support image inputs'));
+											inputFiles = null;
+											filesInputElement.value = '';
+											return;
+										}
 										let reader = new FileReader();
 										reader.onload = (event) => {
 											files = [
@@ -597,7 +655,32 @@
 								{#each files as file, fileIdx}
 									<div class=" relative group">
 										{#if file.type === 'image'}
-											<img src={file.url} alt="input" class=" h-16 w-16 rounded-xl object-cover" />
+											<div class="relative">
+												<img
+													src={file.url}
+													alt="input"
+													class=" h-16 w-16 rounded-xl object-cover"
+												/>
+												{#if visionCapableState === 'some'}
+													<Tooltip
+														className=" absolute top-0 left-0"
+														content={$i18n.t('A selected model does not support image input')}
+													>
+														<svg
+															xmlns="http://www.w3.org/2000/svg"
+															viewBox="0 0 24 24"
+															fill="currentColor"
+															class="w-6 h-6 fill-yellow-300"
+														>
+															<path
+																fill-rule="evenodd"
+																d="M9.401 3.003c1.155-2 4.043-2 5.197 0l7.355 12.748c1.154 2-.29 4.5-2.599 4.5H4.645c-2.309 0-3.752-2.5-2.598-4.5L9.4 3.003ZM12 8.25a.75.75 0 0 1 .75.75v3.75a.75.75 0 0 1-1.5 0V9a.75.75 0 0 1 .75-.75Zm0 8.25a.75.75 0 1 0 0-1.5.75.75 0 0 0 0 1.5Z"
+																clip-rule="evenodd"
+															/>
+														</svg>
+													</Tooltip>
+												{/if}
+											</div>
 										{:else if file.type === 'doc'}
 											<div
 												class="h-16 w-[15rem] flex items-center space-x-3 px-2.5 dark:bg-gray-600 rounded-xl border border-gray-200 dark:border-none"
@@ -883,7 +966,7 @@
 
 									if (e.key === 'Escape') {
 										console.log('Escape');
-										selectedModel = '';
+										selectedAtModel = undefined;
 									}
 								}}
 								rows="1"

+ 5 - 3
src/lib/components/chat/MessageInput/Models.svelte

@@ -21,8 +21,10 @@
 	let filteredModels = [];
 
 	$: filteredModels = $models
-		.filter((p) => p.name.includes(prompt.split(' ')?.at(0)?.substring(1) ?? ''))
-		.sort((a, b) => a.name.localeCompare(b.name));
+		.filter((p) =>
+			(p.custom_info?.name ?? p.name).includes(prompt.split(' ')?.at(0)?.substring(1) ?? '')
+		)
+		.sort((a, b) => (a.custom_info?.name ?? a.name).localeCompare(b.custom_info?.name ?? b.name));
 
 	$: if (prompt) {
 		selectedIdx = 0;
@@ -156,7 +158,7 @@
 								on:focus={() => {}}
 							>
 								<div class=" font-medium text-black line-clamp-1">
-									{model.name}
+									{model.custom_info?.name ?? model.name}
 								</div>
 
 								<!-- <div class=" text-xs text-gray-600 line-clamp-1">

+ 1 - 1
src/lib/components/chat/Messages/ResponseMessage.svelte

@@ -347,7 +347,7 @@
 				{#if message.model in modelfiles}
 					{modelfiles[message.model]?.title}
 				{:else}
-					{message.model ? ` ${message.model}` : ''}
+					{message.modelName ? ` ${message.modelName}` : message.model ? ` ${message.model}` : ''}
 				{/if}
 
 				{#if message.timestamp}

+ 1 - 1
src/lib/components/chat/ModelSelector.svelte

@@ -49,7 +49,7 @@
 							.filter((model) => model.name !== 'hr')
 							.map((model) => ({
 								value: model.id,
-								label: model.name,
+								label: model.custom_info?.name ?? model.name,
 								info: model
 							}))}
 						bind:value={selectedModel}

+ 39 - 6
src/lib/components/chat/ModelSelector/Selector.svelte

@@ -12,7 +12,12 @@
 
 	import { user, MODEL_DOWNLOAD_POOL, models, mobile } from '$lib/stores';
 	import { toast } from 'svelte-sonner';
-	import { capitalizeFirstLetter, getModels, splitStream } from '$lib/utils';
+	import {
+		capitalizeFirstLetter,
+		getModels,
+		sanitizeResponseContent,
+		splitStream
+	} from '$lib/utils';
 	import Tooltip from '$lib/components/common/Tooltip.svelte';
 
 	const i18n = getContext('i18n');
@@ -23,7 +28,12 @@
 	export let searchEnabled = true;
 	export let searchPlaceholder = $i18n.t('Search a model');
 
-	export let items = [{ value: 'mango', label: 'Mango' }];
+	export let items: {
+		label: string;
+		value: string;
+		// eslint-disable-next-line @typescript-eslint/no-explicit-any
+		[key: string]: any;
+	} = [];
 
 	export let className = 'w-[30rem]';
 
@@ -250,8 +260,8 @@
 							<!-- {JSON.stringify(item.info)} -->
 
 							{#if item.info.external}
-								<Tooltip content={item.info?.source ?? 'External'}>
-									<div class=" mr-2">
+								<Tooltip content={`${item.info?.source ?? 'External'}`}>
+									<div class="">
 										<svg
 											xmlns="http://www.w3.org/2000/svg"
 											viewBox="0 0 16 16"
@@ -279,7 +289,7 @@
 											: ''
 									}${item.info.size ? `(${(item.info.size / 1024 ** 3).toFixed(1)}GB)` : ''}`}
 								>
-									<div class=" mr-2">
+									<div class="">
 										<svg
 											xmlns="http://www.w3.org/2000/svg"
 											fill="none"
@@ -297,8 +307,31 @@
 									</div>
 								</Tooltip>
 							{/if}
+							{#if item.info?.custom_info?.meta.description}
+								<Tooltip
+									content={`${sanitizeResponseContent(
+										item.info.custom_info?.meta.description
+									).replaceAll('\n', '<br>')}`}
+								>
+									<div class="">
+										<svg
+											xmlns="http://www.w3.org/2000/svg"
+											fill="none"
+											viewBox="0 0 24 24"
+											stroke-width="1.5"
+											stroke="currentColor"
+											class="w-4 h-4"
+										>
+											<path
+												stroke-linecap="round"
+												stroke-linejoin="round"
+												d="M9.879 7.519c1.171-1.025 3.071-1.025 4.242 0 1.172 1.025 1.172 2.687 0 3.712-.203.179-.43.326-.67.442-.745.361-1.45.999-1.45 1.827v.75M21 12a9 9 0 1 1-18 0 9 9 0 0 1 18 0Zm-9 5.25h.008v.008H12v-.008Z"
+											/>
+										</svg>
+									</div>
+								</Tooltip>
+							{/if}
 						</div>
-
 						{#if value === item.value}
 							<div class="ml-auto">
 								<Check />

+ 5 - 2
src/lib/components/chat/Settings/Interface.svelte

@@ -298,7 +298,10 @@
 						{#each $models as model}
 							{#if model.size != null}
 								<option value={model.name} class="bg-gray-100 dark:bg-gray-700">
-									{model.name + ' (' + (model.size / 1024 ** 3).toFixed(1) + ' GB)'}
+									{(model.custom_info?.name ?? model.name) +
+										' (' +
+										(model.size / 1024 ** 3).toFixed(1) +
+										' GB)'}
 								</option>
 							{/if}
 						{/each}
@@ -316,7 +319,7 @@
 						{#each $models as model}
 							{#if model.name !== 'hr'}
 								<option value={model.name} class="bg-gray-100 dark:bg-gray-700">
-									{model.name}
+									{model.custom_info?.name ?? model.name}
 								</option>
 							{/if}
 						{/each}

+ 251 - 20
src/lib/components/chat/Settings/Models.svelte

@@ -13,10 +13,11 @@
 		uploadModel
 	} from '$lib/apis/ollama';
 	import { WEBUI_API_BASE_URL, WEBUI_BASE_URL } from '$lib/constants';
-	import { WEBUI_NAME, models, MODEL_DOWNLOAD_POOL, user } from '$lib/stores';
+	import { WEBUI_NAME, models, MODEL_DOWNLOAD_POOL, user, config } from '$lib/stores';
 	import { splitStream } from '$lib/utils';
 	import { onMount, getContext } from 'svelte';
 	import { addLiteLLMModel, deleteLiteLLMModel, getLiteLLMModelInfo } from '$lib/apis/litellm';
+	import { getModelConfig, type GlobalModelConfig, updateModelConfig } from '$lib/apis';
 	import Tooltip from '$lib/components/common/Tooltip.svelte';
 
 	const i18n = getContext('i18n');
@@ -67,6 +68,23 @@
 
 	let deleteModelTag = '';
 
+	// Model configuration
+	let modelConfig: GlobalModelConfig;
+	let showModelInfo = false;
+	let selectedModelId = '';
+	let modelName = '';
+	let modelDescription = '';
+	let modelIsVisionCapable = false;
+
+	const onModelInfoIdChange = () => {
+		const model = $models.find((m) => m.id === selectedModelId);
+		if (model) {
+			modelName = model.custom_info?.name ?? model.name;
+			modelDescription = model.custom_info?.meta.description ?? '';
+			modelIsVisionCapable = model.custom_info?.meta.vision_capable ?? false;
+		}
+	};
+
 	const updateModelsHandler = async () => {
 		for (const model of $models.filter(
 			(m) =>
@@ -492,18 +510,79 @@
 		models.set(await getModels());
 	};
 
-	onMount(async () => {
-		OLLAMA_URLS = await getOllamaUrls(localStorage.token).catch((error) => {
-			toast.error(error);
-			return [];
+	const addModelInfoHandler = async () => {
+		if (!selectedModelId) {
+			return;
+		}
+		let model = $models.find((m) => m.id === selectedModelId);
+		if (!model) {
+			return;
+		}
+		// Remove any existing config
+		modelConfig = modelConfig.filter(
+			(m) => !(m.id === selectedModelId)
+		);
+		// Add new config
+		modelConfig.push({
+			id: selectedModelId,
+			name: modelName,
+			params: {},
+			meta: {
+				description: modelDescription,
+				vision_capable: modelIsVisionCapable
+			}
 		});
+		await updateModelConfig(localStorage.token, modelConfig);
+		toast.success(
+			$i18n.t('Model info for {{modelName}} added successfully', { modelName: selectedModelId })
+		);
+		models.set(await getModels());
+	};
 
-		if (OLLAMA_URLS.length > 0) {
-			selectedOllamaUrlIdx = 0;
+	const deleteModelInfoHandler = async () => {
+		if (!selectedModelId) {
+			return;
+		}
+		let model = $models.find((m) => m.id === selectedModelId);
+		if (!model) {
+			return;
 		}
+		modelConfig = modelConfig.filter(
+			(m) => !(m.id === selectedModelId)
+		);
+		await updateModelConfig(localStorage.token, modelConfig);
+		toast.success(
+			$i18n.t('Model info for {{modelName}} deleted successfully', { modelName: selectedModelId })
+		);
+		models.set(await getModels());
+	};
 
-		ollamaVersion = await getOllamaVersion(localStorage.token).catch((error) => false);
-		liteLLMModelInfo = await getLiteLLMModelInfo(localStorage.token);
+	const toggleIsVisionCapable = () => {
+		modelIsVisionCapable = !modelIsVisionCapable;
+	};
+
+	onMount(async () => {
+		await Promise.all([
+			(async () => {
+				OLLAMA_URLS = await getOllamaUrls(localStorage.token).catch((error) => {
+					toast.error(error);
+					return [];
+				});
+
+				if (OLLAMA_URLS.length > 0) {
+					selectedOllamaUrlIdx = 0;
+				}
+			})(),
+			(async () => {
+				liteLLMModelInfo = await getLiteLLMModelInfo(localStorage.token);
+			})(),
+			(async () => {
+				modelConfig = await getModelConfig(localStorage.token);
+			})(),
+			(async () => {
+				ollamaVersion = await getOllamaVersion(localStorage.token).catch((error) => false);
+			})()
+		]);
 	});
 </script>
 
@@ -587,24 +666,28 @@
 											viewBox="0 0 24 24"
 											fill="currentColor"
 											xmlns="http://www.w3.org/2000/svg"
-											><style>
+										>
+											<style>
 												.spinner_ajPY {
 													transform-origin: center;
 													animation: spinner_AtaB 0.75s infinite linear;
 												}
+
 												@keyframes spinner_AtaB {
 													100% {
 														transform: rotate(360deg);
 													}
 												}
-											</style><path
+											</style>
+											<path
 												d="M12,1A11,11,0,1,0,23,12,11,11,0,0,0,12,1Zm0,19a8,8,0,1,1,8-8A8,8,0,0,1,12,20Z"
 												opacity=".25"
-											/><path
+											/>
+											<path
 												d="M10.14,1.16a11,11,0,0,0-9,8.92A1.59,1.59,0,0,0,2.46,12,1.52,1.52,0,0,0,4.11,10.7a8,8,0,0,1,6.66-6.61A1.42,1.42,0,0,0,12,2.69h0A1.57,1.57,0,0,0,10.14,1.16Z"
 												class="spinner_ajPY"
-											/></svg
-										>
+											/>
+										</svg>
 									</div>
 								{:else}
 									<svg
@@ -705,7 +788,10 @@
 									{/if}
 									{#each $models.filter((m) => m.size != null && (selectedOllamaUrlIdx === null ? true : (m?.urls ?? []).includes(selectedOllamaUrlIdx))) as model}
 										<option value={model.name} class="bg-gray-100 dark:bg-gray-700"
-											>{model.name + ' (' + (model.size / 1024 ** 3).toFixed(1) + ' GB)'}</option
+											>{(model.custom_info?.name ?? model.name) +
+												' (' +
+												(model.size / 1024 ** 3).toFixed(1) +
+												' GB)'}</option
 										>
 									{/each}
 								</select>
@@ -833,24 +919,28 @@
 													viewBox="0 0 24 24"
 													fill="currentColor"
 													xmlns="http://www.w3.org/2000/svg"
-													><style>
+												>
+													<style>
 														.spinner_ajPY {
 															transform-origin: center;
 															animation: spinner_AtaB 0.75s infinite linear;
 														}
+
 														@keyframes spinner_AtaB {
 															100% {
 																transform: rotate(360deg);
 															}
 														}
-													</style><path
+													</style>
+													<path
 														d="M12,1A11,11,0,1,0,23,12,11,11,0,0,0,12,1Zm0,19a8,8,0,1,1,8-8A8,8,0,0,1,12,20Z"
 														opacity=".25"
-													/><path
+													/>
+													<path
 														d="M10.14,1.16a11,11,0,0,0-9,8.92A1.59,1.59,0,0,0,2.46,12,1.52,1.52,0,0,0,4.11,10.7a8,8,0,0,1,6.66-6.61A1.42,1.42,0,0,0,12,2.69h0A1.57,1.57,0,0,0,10.14,1.16Z"
 														class="spinner_ajPY"
-													/></svg
-												>
+													/>
+												</svg>
 											</div>
 										{:else}
 											<svg
@@ -932,6 +1022,7 @@
 			<hr class=" dark:border-gray-700 my-2" />
 		{/if}
 
+		<!--TODO: Hide LiteLLM options when ENABLE_LITELLM=false-->
 		<div class=" space-y-3">
 			<div class="mt-2 space-y-3 pr-1.5">
 				<div>
@@ -1126,6 +1217,146 @@
 					{/if}
 				</div>
 			</div>
+			<hr class=" dark:border-gray-700 my-2" />
+		</div>
+
+		<div class=" space-y-3">
+			<div class="mt-2 space-y-3 pr-1.5">
+				<div>
+					<div class="mb-2">
+						<div class="flex justify-between items-center text-xs">
+							<div class=" text-sm font-medium">{$i18n.t('Manage Model Information')}</div>
+							<button
+								class=" text-xs font-medium text-gray-500"
+								type="button"
+								on:click={() => {
+									showModelInfo = !showModelInfo;
+								}}>{showModelInfo ? $i18n.t('Hide') : $i18n.t('Show')}</button
+							>
+						</div>
+					</div>
+
+					{#if showModelInfo}
+						<div>
+							<div class="flex justify-between items-center text-xs">
+								<div class=" text-sm font-medium">{$i18n.t('Current Models')}</div>
+							</div>
+
+							<div class="flex gap-2">
+								<div class="flex-1 pb-1">
+									<select
+										class="w-full rounded-lg py-2 px-4 text-sm dark:text-gray-300 dark:bg-gray-850 outline-none"
+										bind:value={selectedModelId}
+										on:change={onModelInfoIdChange}
+									>
+										{#if !selectedModelId}
+											<option value="" disabled selected>{$i18n.t('Select a model')}</option>
+										{/if}
+										{#each $models as model}
+											<option value={model.id} class="bg-gray-100 dark:bg-gray-700"
+												>{'details' in model
+													? 'Ollama'
+													: model.source === 'LiteLLM'
+													? 'LiteLLM'
+													: 'OpenAI'}: {model.name}{`${
+													model.custom_info?.name ? ' - ' + model.custom_info?.name : ''
+												}`}</option
+											>
+										{/each}
+									</select>
+								</div>
+								<button
+									class="px-2.5 bg-gray-100 hover:bg-gray-200 text-gray-800 dark:bg-gray-850 dark:hover:bg-gray-800 dark:text-gray-100 rounded-lg transition"
+									on:click={() => {
+										deleteModelInfoHandler();
+									}}
+								>
+									<svg
+										xmlns="http://www.w3.org/2000/svg"
+										viewBox="0 0 16 16"
+										fill="currentColor"
+										class="w-4 h-4"
+									>
+										<path
+											fill-rule="evenodd"
+											d="M5 3.25V4H2.75a.75.75 0 0 0 0 1.5h.3l.815 8.15A1.5 1.5 0 0 0 5.357 15h5.285a1.5 1.5 0 0 0 1.493-1.35l.815-8.15h.3a.75.75 0 0 0 0-1.5H11v-.75A2.25 2.25 0 0 0 8.75 1h-1.5A2.25 2.25 0 0 0 5 3.25Zm2.25-.75a.75.75 0 0 0-.75.75V4h3v-.75a.75.75 0 0 0-.75-.75h-1.5ZM6.05 6a.75.75 0 0 1 .787.713l.275 5.5a.75.75 0 0 1-1.498.075l-.275-5.5A.75.75 0 0 1 6.05 6Zm3.9 0a.75.75 0 0 1 .712.787l-.275 5.5a.75.75 0 0 1-1.498-.075l.275-5.5a.75.75 0 0 1 .786-.711Z"
+											clip-rule="evenodd"
+										/>
+									</svg>
+								</button>
+							</div>
+
+							{#if selectedModelId}
+								<div>
+									<div class=" mb-1.5 text-sm font-medium">{$i18n.t('Model Display Name')}</div>
+									<div class="flex w-full mb-1.5">
+										<div class="flex-1 mr-2">
+											<input
+												class="w-full rounded-lg py-2 px-4 text-sm dark:text-gray-300 dark:bg-gray-850 outline-none"
+												placeholder={$i18n.t('Enter Model Display Name')}
+												bind:value={modelName}
+												autocomplete="off"
+											/>
+										</div>
+
+										<button
+											class="px-2.5 bg-gray-100 hover:bg-gray-200 text-gray-800 dark:bg-gray-850 dark:hover:bg-gray-800 dark:text-gray-100 rounded-lg transition"
+											on:click={() => {
+												addModelInfoHandler();
+											}}
+										>
+											<svg
+												xmlns="http://www.w3.org/2000/svg"
+												viewBox="0 0 16 16"
+												fill="currentColor"
+												class="w-4 h-4"
+											>
+												<path
+													d="M8.75 3.75a.75.75 0 0 0-1.5 0v3.5h-3.5a.75.75 0 0 0 0 1.5h3.5v3.5a.75.75 0 0 0 1.5 0v-3.5h3.5a.75.75 0 0 0 0-1.5h-3.5v-3.5Z"
+												/>
+											</svg>
+										</button>
+									</div>
+								</div>
+
+								<div>
+									<div class=" mb-1.5 text-sm font-medium">{$i18n.t('Model Description')}</div>
+
+									<div class="flex w-full">
+										<div class="flex-1">
+											<textarea
+												class="px-3 py-1.5 text-sm w-full bg-transparent border dark:border-gray-600 outline-none rounded-lg -mb-1"
+												rows="2"
+												bind:value={modelDescription}
+											/>
+										</div>
+									</div>
+								</div>
+
+								<div class="py-0.5 flex w-full justify-between">
+									<div class=" self-center text-sm font-medium">
+										{$i18n.t('Is Model Vision Capable')}
+									</div>
+
+									<button
+										class="p-1 px-3sm flex rounded transition"
+										on:click={() => {
+											toggleIsVisionCapable();
+										}}
+										type="button"
+									>
+										{#if modelIsVisionCapable === true}
+											<span class="ml-2 self-center">{$i18n.t('Yes')}</span>
+										{:else}
+											<span class="ml-2 self-center">{$i18n.t('No')}</span>
+										{/if}
+									</button>
+								</div>
+							{/if}
+						</div>
+					{/if}
+				</div>
+			</div>
 		</div>
 	</div>
 </div>

+ 2 - 1
src/lib/components/common/Tooltip.svelte

@@ -5,6 +5,7 @@
 	export let placement = 'top';
 	export let content = `I'm a tooltip!`;
 	export let touch = true;
+	export let className = 'flex';
 
 	let tooltipElement;
 	let tooltipInstance;
@@ -29,6 +30,6 @@
 	});
 </script>
 
-<div bind:this={tooltipElement} aria-label={content} class="flex">
+<div bind:this={tooltipElement} aria-label={content} class={className}>
 	<slot />
 </div>

+ 4 - 1
src/lib/components/documents/Settings/General.svelte

@@ -323,7 +323,10 @@
 							{/if}
 							{#each $models.filter((m) => m.id && !m.external) as model}
 								<option value={model.name} class="bg-gray-100 dark:bg-gray-700"
-									>{model.name + ' (' + (model.size / 1024 ** 3).toFixed(1) + ' GB)'}</option
+									>{(model.custom_info?.name ?? model.name) +
+										' (' +
+										(model.size / 1024 ** 3).toFixed(1) +
+										' GB)'}</option
 								>
 							{/each}
 						</select>

+ 1 - 1
src/lib/components/workspace/Playground.svelte

@@ -325,7 +325,7 @@
 										.filter((model) => model.name !== 'hr')
 										.map((model) => ({
 											value: model.id,
-											label: model.name,
+											label: model.custom_info?.name ?? model.name,
 											info: model
 										}))}
 									bind:value={selectedModelId}

+ 14 - 0
src/lib/i18n/locales/ar-BH/translation.json

@@ -6,6 +6,7 @@
 	"{{modelName}} is thinking...": "{{modelName}} ...يفكر",
 	"{{user}}'s Chats": "دردشات {{user}}",
 	"{{webUIName}} Backend Required": "{{webUIName}} مطلوب",
+	"A selected model does not support image input": "",
 	"a user": "مستخدم",
 	"About": "عن",
 	"Account": "الحساب",
@@ -31,6 +32,7 @@
 	"Advanced Parameters": "التعليمات المتقدمة",
 	"all": "الكل",
 	"All Documents": "جميع الملفات",
+	"All selected models do not support image input, removed images": "",
 	"All Users": "جميع المستخدمين",
 	"Allow": "يسمح",
 	"Allow Chat Deletion": "يستطيع حذف المحادثات",
@@ -115,6 +117,7 @@
 	"Created at": "أنشئت في",
 	"Created At": "أنشئت من",
 	"Current Model": "الموديل المختار",
+	"Current Models": "",
 	"Current Password": "كلمة السر الحالية",
 	"Custom": "مخصص",
 	"Customize Ollama models for a specific purpose": "تخصيص الموديل Ollama لغرض محدد",
@@ -181,6 +184,7 @@
 	"Enter LiteLLM API RPM (litellm_params.rpm)": "أدخل LiteLLM API RPM (litllm_params.rpm)",
 	"Enter LiteLLM Model (litellm_params.model)": "أدخل LiteLLM الموديل (litellm_params.model)",
 	"Enter Max Tokens (litellm_params.max_tokens)": "أدخل أكثر Tokens (litellm_params.max_tokens)",
+	"Enter Model Display Name": "",
 	"Enter model tag (e.g. {{modelTag}})": "(e.g. {{modelTag}}) أدخل الموديل تاق",
 	"Enter Number of Steps (e.g. 50)": "(e.g. 50) أدخل عدد الخطوات",
 	"Enter Score": "أدخل النتيجة",
@@ -235,6 +239,7 @@
 	"Input commands": "إدخال الأوامر",
 	"Interface": "واجهه المستخدم",
 	"Invalid Tag": "تاق غير صالحة",
+	"Is Model Vision Capable": "",
 	"January": "يناير",
 	"join our Discord for help.": "انضم إلى Discord للحصول على المساعدة.",
 	"JSON": "JSON",
@@ -253,6 +258,7 @@
 	"Made by OpenWebUI Community": "OpenWebUI تم إنشاؤه بواسطة مجتمع ",
 	"Make sure to enclose them with": "تأكد من إرفاقها",
 	"Manage LiteLLM Models": "LiteLLM إدارة نماذج ",
+	"Manage Model Information": "",
 	"Manage Models": "إدارة النماذج",
 	"Manage Ollama Models": "Ollama إدارة موديلات ",
 	"March": "مارس",
@@ -272,7 +278,12 @@
 	"Model '{{modelTag}}' is already in queue for downloading.": "النموذج '{{modelTag}}' موجود بالفعل في قائمة الانتظار للتحميل",
 	"Model {{modelId}} not found": "لم يتم العثور على النموذج {{modelId}}.",
 	"Model {{modelName}} already exists.": "موجود {{modelName}} موديل بالفعل",
+	"Model {{modelName}} is not vision capable": "",
+	"Model Description": "",
+	"Model Display Name": "",
 	"Model filesystem path detected. Model shortname is required for update, cannot continue.": "تم اكتشاف مسار نظام الملفات النموذجي. الاسم المختصر للنموذج مطلوب للتحديث، ولا يمكن الاستمرار.",
+	"Model info for {{modelName}} added successfully": "",
+	"Model info for {{modelName}} deleted successfully": "",
 	"Model Name": "أسم الموديل",
 	"Model not selected": "لم تختار موديل",
 	"Model Tag Name": "أسم التاق للموديل",
@@ -289,6 +300,7 @@
 	"Name your modelfile": "قم بتسمية ملف النموذج الخاص بك",
 	"New Chat": "دردشة جديدة",
 	"New Password": "كلمة المرور الجديدة",
+	"No": "",
 	"No results found": "لا توجد نتايج",
 	"No source available": "لا يوجد مصدر متاح",
 	"Not factually correct": "ليس صحيحا من حيث الواقع",
@@ -385,6 +397,7 @@
 	"Select a model": "أختار الموديل",
 	"Select an Ollama instance": "أختار سيرفر ",
 	"Select model": " أختار موديل",
+	"Selected models do not support image inputs": "",
 	"Send": "تم",
 	"Send a Message": "يُرجى إدخال طلبك هنا",
 	"Send message": "يُرجى إدخال طلبك هنا.",
@@ -492,6 +505,7 @@
 	"Workspace": "مساحة العمل",
 	"Write a prompt suggestion (e.g. Who are you?)": "اكتب اقتراحًا سريعًا (على سبيل المثال، من أنت؟)",
 	"Write a summary in 50 words that summarizes [topic or keyword].": "اكتب ملخصًا في 50 كلمة يلخص [الموضوع أو الكلمة الرئيسية]",
+	"Yes": "",
 	"Yesterday": "أمس",
 	"You": "انت",
 	"You have no archived conversations.": "لا تملك محادثات محفوظه",

+ 14 - 0
src/lib/i18n/locales/bg-BG/translation.json

@@ -6,6 +6,7 @@
 	"{{modelName}} is thinking...": "{{modelName}} мисли ...",
 	"{{user}}'s Chats": "{{user}}'s чатове",
 	"{{webUIName}} Backend Required": "{{webUIName}} Изисква се Бекенд",
+	"A selected model does not support image input": "",
 	"a user": "потребител",
 	"About": "Относно",
 	"Account": "Акаунт",
@@ -31,6 +32,7 @@
 	"Advanced Parameters": "Разширени Параметри",
 	"all": "всички",
 	"All Documents": "Всички Документи",
+	"All selected models do not support image input, removed images": "",
 	"All Users": "Всички Потребители",
 	"Allow": "Позволи",
 	"Allow Chat Deletion": "Позволи Изтриване на Чат",
@@ -115,6 +117,7 @@
 	"Created at": "Създадено на",
 	"Created At": "Създадено на",
 	"Current Model": "Текущ модел",
+	"Current Models": "",
 	"Current Password": "Текуща Парола",
 	"Custom": "Персонализиран",
 	"Customize Ollama models for a specific purpose": "Персонализиране на Ollama моделите за конкретна цел",
@@ -181,6 +184,7 @@
 	"Enter LiteLLM API RPM (litellm_params.rpm)": "Въведете LiteLLM API RPM (litellm_params.rpm)",
 	"Enter LiteLLM Model (litellm_params.model)": "Въведете LiteLLM Model (litellm_params.model)",
 	"Enter Max Tokens (litellm_params.max_tokens)": "Въведете Max Tokens (litellm_params.max_tokens)",
+	"Enter Model Display Name": "",
 	"Enter model tag (e.g. {{modelTag}})": "Въведете таг на модел (напр. {{modelTag}})",
 	"Enter Number of Steps (e.g. 50)": "Въведете брой стъпки (напр. 50)",
 	"Enter Score": "Въведете оценка",
@@ -235,6 +239,7 @@
 	"Input commands": "Въведете команди",
 	"Interface": "Интерфейс",
 	"Invalid Tag": "Невалиден тег",
+	"Is Model Vision Capable": "",
 	"January": "Януари",
 	"join our Discord for help.": "свържете се с нашия Discord за помощ.",
 	"JSON": "JSON",
@@ -253,6 +258,7 @@
 	"Made by OpenWebUI Community": "Направено от OpenWebUI общността",
 	"Make sure to enclose them with": "Уверете се, че са заключени с",
 	"Manage LiteLLM Models": "Управление на LiteLLM Моделите",
+	"Manage Model Information": "",
 	"Manage Models": "Управление на Моделите",
 	"Manage Ollama Models": "Управление на Ollama Моделите",
 	"March": "Март",
@@ -272,7 +278,12 @@
 	"Model '{{modelTag}}' is already in queue for downloading.": "Моделът '{{modelTag}}' е вече в очакване за сваляне.",
 	"Model {{modelId}} not found": "Моделът {{modelId}} не е намерен",
 	"Model {{modelName}} already exists.": "Моделът {{modelName}} вече съществува.",
+	"Model {{modelName}} is not vision capable": "",
+	"Model Description": "",
+	"Model Display Name": "",
 	"Model filesystem path detected. Model shortname is required for update, cannot continue.": "Открит е път до файловата система на модела. За актуализацията се изисква съкратено име на модела, не може да продължи.",
+	"Model info for {{modelName}} added successfully": "",
+	"Model info for {{modelName}} deleted successfully": "",
 	"Model Name": "Име на модел",
 	"Model not selected": "Не е избран модел",
 	"Model Tag Name": "Име на таг на модел",
@@ -289,6 +300,7 @@
 	"Name your modelfile": "Име на модфайла",
 	"New Chat": "Нов чат",
 	"New Password": "Нова парола",
+	"No": "",
 	"No results found": "Няма намерени резултати",
 	"No source available": "Няма наличен източник",
 	"Not factually correct": "Не е фактологически правилно",
@@ -385,6 +397,7 @@
 	"Select a model": "Изберете модел",
 	"Select an Ollama instance": "Изберете Ollama инстанция",
 	"Select model": "Изберете модел",
+	"Selected models do not support image inputs": "",
 	"Send": "Изпрати",
 	"Send a Message": "Изпращане на Съобщение",
 	"Send message": "Изпращане на съобщение",
@@ -492,6 +505,7 @@
 	"Workspace": "Работно пространство",
 	"Write a prompt suggestion (e.g. Who are you?)": "Напиши предложение за промпт (напр. Кой сте вие?)",
 	"Write a summary in 50 words that summarizes [topic or keyword].": "Напиши описание в 50 знака, което описва [тема или ключова дума].",
+	"Yes": "",
 	"Yesterday": "вчера",
 	"You": "вие",
 	"You have no archived conversations.": "Нямате архивирани разговори.",

+ 14 - 0
src/lib/i18n/locales/bn-BD/translation.json

@@ -6,6 +6,7 @@
 	"{{modelName}} is thinking...": "{{modelName}} চিন্তা করছে...",
 	"{{user}}'s Chats": "{{user}}র চ্যাটস",
 	"{{webUIName}} Backend Required": "{{webUIName}} ব্যাকএন্ড আবশ্যক",
+	"A selected model does not support image input": "",
 	"a user": "একজন ব্যাবহারকারী",
 	"About": "সম্পর্কে",
 	"Account": "একাউন্ট",
@@ -31,6 +32,7 @@
 	"Advanced Parameters": "এডভান্সড প্যারামিটার্স",
 	"all": "সব",
 	"All Documents": "সব ডকুমেন্ট",
+	"All selected models do not support image input, removed images": "",
 	"All Users": "সব ইউজার",
 	"Allow": "অনুমোদন",
 	"Allow Chat Deletion": "চ্যাট ডিলিট করতে দিন",
@@ -115,6 +117,7 @@
 	"Created at": "নির্মানকাল",
 	"Created At": "নির্মানকাল",
 	"Current Model": "বর্তমান মডেল",
+	"Current Models": "",
 	"Current Password": "বর্তমান পাসওয়ার্ড",
 	"Custom": "কাস্টম",
 	"Customize Ollama models for a specific purpose": "নির্দিষ্ট উদ্দেশ্যে Ollama মডেল পরিবর্তন করুন",
@@ -181,6 +184,7 @@
 	"Enter LiteLLM API RPM (litellm_params.rpm)": "LiteLLM এপিআই RPM দিন (litellm_params.rpm)",
 	"Enter LiteLLM Model (litellm_params.model)": "LiteLLM মডেল দিন (litellm_params.model)",
 	"Enter Max Tokens (litellm_params.max_tokens)": "সর্বোচ্চ টোকেন সংখ্যা দিন (litellm_params.max_tokens)",
+	"Enter Model Display Name": "",
 	"Enter model tag (e.g. {{modelTag}})": "মডেল ট্যাগ লিখুন (e.g. {{modelTag}})",
 	"Enter Number of Steps (e.g. 50)": "ধাপের সংখ্যা দিন (যেমন: 50)",
 	"Enter Score": "স্কোর দিন",
@@ -235,6 +239,7 @@
 	"Input commands": "ইনপুট কমান্ডস",
 	"Interface": "ইন্টারফেস",
 	"Invalid Tag": "অবৈধ ট্যাগ",
+	"Is Model Vision Capable": "",
 	"January": "জানুয়ারী",
 	"join our Discord for help.": "সাহায্যের জন্য আমাদের Discord-এ যুক্ত হোন",
 	"JSON": "JSON",
@@ -253,6 +258,7 @@
 	"Made by OpenWebUI Community": "OpenWebUI কমিউনিটিকর্তৃক নির্মিত",
 	"Make sure to enclose them with": "এটা দিয়ে বন্ধনী দিতে ভুলবেন না",
 	"Manage LiteLLM Models": "LiteLLM মডেল ব্যবস্থাপনা করুন",
+	"Manage Model Information": "",
 	"Manage Models": "মডেলসমূহ ব্যবস্থাপনা করুন",
 	"Manage Ollama Models": "Ollama মডেলসূহ ব্যবস্থাপনা করুন",
 	"March": "মার্চ",
@@ -272,7 +278,12 @@
 	"Model '{{modelTag}}' is already in queue for downloading.": "{{modelTag}} ডাউনলোডের জন্য আগে থেকেই অপেক্ষমান আছে।",
 	"Model {{modelId}} not found": "{{modelId}} মডেল পাওয়া যায়নি",
 	"Model {{modelName}} already exists.": "{{modelName}} মডেল আগে থেকেই আছে",
+	"Model {{modelName}} is not vision capable": "",
+	"Model Description": "",
+	"Model Display Name": "",
 	"Model filesystem path detected. Model shortname is required for update, cannot continue.": "মডেল ফাইলসিস্টেম পাথ পাওয়া গেছে। আপডেটের জন্য মডেলের শর্টনেম আবশ্যক, এগিয়ে যাওয়া যাচ্ছে না।",
+	"Model info for {{modelName}} added successfully": "",
+	"Model info for {{modelName}} deleted successfully": "",
 	"Model Name": "মডেলের নাম",
 	"Model not selected": "মডেল নির্বাচন করা হয়নি",
 	"Model Tag Name": "মডেলের ট্যাগ নাম",
@@ -289,6 +300,7 @@
 	"Name your modelfile": "আপনার মডেলফাইলের নাম দিন",
 	"New Chat": "নতুন চ্যাট",
 	"New Password": "নতুন পাসওয়ার্ড",
+	"No": "",
 	"No results found": "কোন ফলাফল পাওয়া যায়নি",
 	"No source available": "কোন উৎস পাওয়া যায়নি",
 	"Not factually correct": "তথ্যগত দিক থেকে সঠিক নয়",
@@ -385,6 +397,7 @@
 	"Select a model": "একটি মডেল নির্বাচন করুন",
 	"Select an Ollama instance": "একটি Ollama ইন্সট্যান্স নির্বাচন করুন",
 	"Select model": "মডেল নির্বাচন করুন",
+	"Selected models do not support image inputs": "",
 	"Send": "পাঠান",
 	"Send a Message": "একটি মেসেজ পাঠান",
 	"Send message": "মেসেজ পাঠান",
@@ -492,6 +505,7 @@
 	"Workspace": "ওয়ার্কস্পেস",
 	"Write a prompt suggestion (e.g. Who are you?)": "একটি প্রম্পট সাজেশন লিখুন (যেমন Who are you?)",
 	"Write a summary in 50 words that summarizes [topic or keyword].": "৫০ শব্দের মধ্যে [topic or keyword] এর একটি সারসংক্ষেপ লিখুন।",
+	"Yes": "",
 	"Yesterday": "আগামী",
 	"You": "আপনি",
 	"You have no archived conversations.": "আপনার কোনও আর্কাইভ করা কথোপকথন নেই।",

+ 14 - 0
src/lib/i18n/locales/ca-ES/translation.json

@@ -6,6 +6,7 @@
 	"{{modelName}} is thinking...": "{{modelName}} està pensant...",
 	"{{user}}'s Chats": "{{user}}'s Chats",
 	"{{webUIName}} Backend Required": "Es requereix Backend de {{webUIName}}",
+	"A selected model does not support image input": "",
 	"a user": "un usuari",
 	"About": "Sobre",
 	"Account": "Compte",
@@ -31,6 +32,7 @@
 	"Advanced Parameters": "Paràmetres Avançats",
 	"all": "tots",
 	"All Documents": "Tots els Documents",
+	"All selected models do not support image input, removed images": "",
 	"All Users": "Tots els Usuaris",
 	"Allow": "Permet",
 	"Allow Chat Deletion": "Permet la Supressió del Xat",
@@ -115,6 +117,7 @@
 	"Created at": "Creat el",
 	"Created At": "Creat el",
 	"Current Model": "Model Actual",
+	"Current Models": "",
 	"Current Password": "Contrasenya Actual",
 	"Custom": "Personalitzat",
 	"Customize Ollama models for a specific purpose": "Personalitza els models Ollama per a un propòsit específic",
@@ -181,6 +184,7 @@
 	"Enter LiteLLM API RPM (litellm_params.rpm)": "Introdueix RPM de LiteLLM API (litellm_params.rpm)",
 	"Enter LiteLLM Model (litellm_params.model)": "Introdueix el Model de LiteLLM (litellm_params.model)",
 	"Enter Max Tokens (litellm_params.max_tokens)": "Introdueix el Màxim de Tokens (litellm_params.max_tokens)",
+	"Enter Model Display Name": "",
 	"Enter model tag (e.g. {{modelTag}})": "Introdueix l'etiqueta del model (p. ex. {{modelTag}})",
 	"Enter Number of Steps (e.g. 50)": "Introdueix el Nombre de Passos (p. ex. 50)",
 	"Enter Score": "Introdueix el Puntuació",
@@ -235,6 +239,7 @@
 	"Input commands": "Entra ordres",
 	"Interface": "Interfície",
 	"Invalid Tag": "Etiqueta Inválida",
+	"Is Model Vision Capable": "",
 	"January": "Gener",
 	"join our Discord for help.": "uneix-te al nostre Discord per ajuda.",
 	"JSON": "JSON",
@@ -253,6 +258,7 @@
 	"Made by OpenWebUI Community": "Creat per la Comunitat OpenWebUI",
 	"Make sure to enclose them with": "Assegura't d'envoltar-los amb",
 	"Manage LiteLLM Models": "Gestiona Models LiteLLM",
+	"Manage Model Information": "",
 	"Manage Models": "Gestiona Models",
 	"Manage Ollama Models": "Gestiona Models Ollama",
 	"March": "Març",
@@ -272,7 +278,12 @@
 	"Model '{{modelTag}}' is already in queue for downloading.": "El model '{{modelTag}}' ja està en cua per ser descarregat.",
 	"Model {{modelId}} not found": "Model {{modelId}} no trobat",
 	"Model {{modelName}} already exists.": "El model {{modelName}} ja existeix.",
+	"Model {{modelName}} is not vision capable": "",
+	"Model Description": "",
+	"Model Display Name": "",
 	"Model filesystem path detected. Model shortname is required for update, cannot continue.": "S'ha detectat el camí del sistema de fitxers del model. És necessari un nom curt del model per a actualitzar, no es pot continuar.",
+	"Model info for {{modelName}} added successfully": "",
+	"Model info for {{modelName}} deleted successfully": "",
 	"Model Name": "Nom del Model",
 	"Model not selected": "Model no seleccionat",
 	"Model Tag Name": "Nom de l'Etiqueta del Model",
@@ -289,6 +300,7 @@
 	"Name your modelfile": "Nomena el teu fitxer de model",
 	"New Chat": "Xat Nou",
 	"New Password": "Nova Contrasenya",
+	"No": "",
 	"No results found": "No s'han trobat resultats",
 	"No source available": "Sense font disponible",
 	"Not factually correct": "No està clarament correcte",
@@ -385,6 +397,7 @@
 	"Select a model": "Selecciona un model",
 	"Select an Ollama instance": "Selecciona una instància d'Ollama",
 	"Select model": "Selecciona un model",
+	"Selected models do not support image inputs": "",
 	"Send": "Envia",
 	"Send a Message": "Envia un Missatge",
 	"Send message": "Envia missatge",
@@ -492,6 +505,7 @@
 	"Workspace": "Treball",
 	"Write a prompt suggestion (e.g. Who are you?)": "Escriu una suggerència de prompt (p. ex. Qui ets tu?)",
 	"Write a summary in 50 words that summarizes [topic or keyword].": "Escriu un resum en 50 paraules que resumeixi [tema o paraula clau].",
+	"Yes": "",
 	"Yesterday": "Ayer",
 	"You": "Tu",
 	"You have no archived conversations.": "No tens converses arxivades.",

+ 14 - 0
src/lib/i18n/locales/de-DE/translation.json

@@ -6,6 +6,7 @@
 	"{{modelName}} is thinking...": "{{modelName}} denkt nach...",
 	"{{user}}'s Chats": "{{user}}s Chats",
 	"{{webUIName}} Backend Required": "{{webUIName}}-Backend erforderlich",
+	"A selected model does not support image input": "",
 	"a user": "ein Benutzer",
 	"About": "Über",
 	"Account": "Account",
@@ -31,6 +32,7 @@
 	"Advanced Parameters": "Erweiterte Parameter",
 	"all": "Alle",
 	"All Documents": "Alle Dokumente",
+	"All selected models do not support image input, removed images": "",
 	"All Users": "Alle Benutzer",
 	"Allow": "Erlauben",
 	"Allow Chat Deletion": "Chat Löschung erlauben",
@@ -115,6 +117,7 @@
 	"Created at": "Erstellt am",
 	"Created At": "Erstellt am",
 	"Current Model": "Aktuelles Modell",
+	"Current Models": "",
 	"Current Password": "Aktuelles Passwort",
 	"Custom": "Benutzerdefiniert",
 	"Customize Ollama models for a specific purpose": "Ollama-Modelle für einen bestimmten Zweck anpassen",
@@ -181,6 +184,7 @@
 	"Enter LiteLLM API RPM (litellm_params.rpm)": "Gib die LiteLLM API RPM ein (litellm_params.rpm)",
 	"Enter LiteLLM Model (litellm_params.model)": "Gib das LiteLLM Model ein (litellm_params.model)",
 	"Enter Max Tokens (litellm_params.max_tokens)": "Gib die maximalen Token ein (litellm_params.max_tokens) an",
+	"Enter Model Display Name": "",
 	"Enter model tag (e.g. {{modelTag}})": "Gib den Model-Tag ein",
 	"Enter Number of Steps (e.g. 50)": "Gib die Anzahl an Schritten ein (z.B. 50)",
 	"Enter Score": "Score eingeben",
@@ -235,6 +239,7 @@
 	"Input commands": "Eingabebefehle",
 	"Interface": "Benutzeroberfläche",
 	"Invalid Tag": "Ungültiger Tag",
+	"Is Model Vision Capable": "",
 	"January": "Januar",
 	"join our Discord for help.": "Trete unserem Discord bei, um Hilfe zu erhalten.",
 	"JSON": "JSON",
@@ -253,6 +258,7 @@
 	"Made by OpenWebUI Community": "Von der OpenWebUI-Community",
 	"Make sure to enclose them with": "Formatiere deine Variablen mit:",
 	"Manage LiteLLM Models": "LiteLLM-Modelle verwalten",
+	"Manage Model Information": "",
 	"Manage Models": "Modelle verwalten",
 	"Manage Ollama Models": "Ollama-Modelle verwalten",
 	"March": "März",
@@ -272,7 +278,12 @@
 	"Model '{{modelTag}}' is already in queue for downloading.": "Modell '{{modelTag}}' befindet sich bereits in der Warteschlange zum Herunterladen.",
 	"Model {{modelId}} not found": "Modell {{modelId}} nicht gefunden",
 	"Model {{modelName}} already exists.": "Modell {{modelName}} existiert bereits.",
+	"Model {{modelName}} is not vision capable": "",
+	"Model Description": "",
+	"Model Display Name": "",
 	"Model filesystem path detected. Model shortname is required for update, cannot continue.": "Modell-Dateisystempfad erkannt. Modellkurzname ist für das Update erforderlich, Fortsetzung nicht möglich.",
+	"Model info for {{modelName}} added successfully": "",
+	"Model info for {{modelName}} deleted successfully": "",
 	"Model Name": "Modellname",
 	"Model not selected": "Modell nicht ausgewählt",
 	"Model Tag Name": "Modell-Tag-Name",
@@ -289,6 +300,7 @@
 	"Name your modelfile": "Benenne dein modelfile",
 	"New Chat": "Neuer Chat",
 	"New Password": "Neues Passwort",
+	"No": "",
 	"No results found": "Keine Ergebnisse gefunden",
 	"No source available": "Keine Quelle verfügbar.",
 	"Not factually correct": "Nicht sachlich korrekt.",
@@ -385,6 +397,7 @@
 	"Select a model": "Ein Modell auswählen",
 	"Select an Ollama instance": "Eine Ollama Instanz auswählen",
 	"Select model": "Modell auswählen",
+	"Selected models do not support image inputs": "",
 	"Send": "Senden",
 	"Send a Message": "Eine Nachricht senden",
 	"Send message": "Nachricht senden",
@@ -492,6 +505,7 @@
 	"Workspace": "Arbeitsbereich",
 	"Write a prompt suggestion (e.g. Who are you?)": "Gebe einen Prompt-Vorschlag ein (z.B. Wer bist du?)",
 	"Write a summary in 50 words that summarizes [topic or keyword].": "Schreibe eine kurze Zusammenfassung in 50 Wörtern, die [Thema oder Schlüsselwort] zusammenfasst.",
+	"Yes": "",
 	"Yesterday": "Gestern",
 	"You": "Du",
 	"You have no archived conversations.": "Du hast keine archivierten Unterhaltungen.",

+ 14 - 0
src/lib/i18n/locales/dg-DG/translation.json

@@ -6,6 +6,7 @@
 	"{{modelName}} is thinking...": "{{modelName}} is thinkin'...",
 	"{{user}}'s Chats": "",
 	"{{webUIName}} Backend Required": "{{webUIName}} Backend Much Required",
+	"A selected model does not support image input": "",
 	"a user": "such user",
 	"About": "Much About",
 	"Account": "Account",
@@ -31,6 +32,7 @@
 	"Advanced Parameters": "Advanced Parameters",
 	"all": "all",
 	"All Documents": "",
+	"All selected models do not support image input, removed images": "",
 	"All Users": "All Users",
 	"Allow": "Allow",
 	"Allow Chat Deletion": "Allow Delete Chats",
@@ -115,6 +117,7 @@
 	"Created at": "Created at",
 	"Created At": "",
 	"Current Model": "Current Model",
+	"Current Models": "",
 	"Current Password": "Current Password",
 	"Custom": "Custom",
 	"Customize Ollama models for a specific purpose": "Customize Ollama models for purpose",
@@ -181,6 +184,7 @@
 	"Enter LiteLLM API RPM (litellm_params.rpm)": "Enter RPM of LiteLLM API (litellm_params.rpm)",
 	"Enter LiteLLM Model (litellm_params.model)": "Enter Model of LiteLLM (litellm_params.model)",
 	"Enter Max Tokens (litellm_params.max_tokens)": "Enter Maximum Tokens (litellm_params.max_tokens)",
+	"Enter Model Display Name": "",
 	"Enter model tag (e.g. {{modelTag}})": "Enter model doge tag (e.g. {{modelTag}})",
 	"Enter Number of Steps (e.g. 50)": "Enter Number of Steps (e.g. 50)",
 	"Enter Score": "",
@@ -235,6 +239,7 @@
 	"Input commands": "Input commands",
 	"Interface": "Interface",
 	"Invalid Tag": "",
+	"Is Model Vision Capable": "",
 	"January": "",
 	"join our Discord for help.": "join our Discord for help.",
 	"JSON": "JSON",
@@ -253,6 +258,7 @@
 	"Made by OpenWebUI Community": "Made by OpenWebUI Community",
 	"Make sure to enclose them with": "Make sure to enclose them with",
 	"Manage LiteLLM Models": "Manage LiteLLM Models",
+	"Manage Model Information": "",
 	"Manage Models": "Manage Wowdels",
 	"Manage Ollama Models": "Manage Ollama Wowdels",
 	"March": "",
@@ -272,7 +278,12 @@
 	"Model '{{modelTag}}' is already in queue for downloading.": "Model '{{modelTag}}' is already in queue for downloading.",
 	"Model {{modelId}} not found": "Model {{modelId}} not found",
 	"Model {{modelName}} already exists.": "Model {{modelName}} already exists.",
+	"Model {{modelName}} is not vision capable": "",
+	"Model Description": "",
+	"Model Display Name": "",
 	"Model filesystem path detected. Model shortname is required for update, cannot continue.": "Model filesystem bark detected. Model shortname is required for update, cannot continue.",
+	"Model info for {{modelName}} added successfully": "",
+	"Model info for {{modelName}} deleted successfully": "",
 	"Model Name": "Wowdel Name",
 	"Model not selected": "Model not selected",
 	"Model Tag Name": "Wowdel Tag Name",
@@ -289,6 +300,7 @@
 	"Name your modelfile": "Name your modelfile",
 	"New Chat": "New Bark",
 	"New Password": "New Barkword",
+	"No": "",
 	"No results found": "",
 	"No source available": "No source available",
 	"Not factually correct": "",
@@ -385,6 +397,7 @@
 	"Select a model": "Select a model much choice",
 	"Select an Ollama instance": "Select an Ollama instance very choose",
 	"Select model": "Select model much choice",
+	"Selected models do not support image inputs": "",
 	"Send": "",
 	"Send a Message": "Send a Message much message",
 	"Send message": "Send message very send",
@@ -492,6 +505,7 @@
 	"Workspace": "",
 	"Write a prompt suggestion (e.g. Who are you?)": "Write a prompt suggestion (e.g. Who are you?) much suggest",
 	"Write a summary in 50 words that summarizes [topic or keyword].": "Write a summary in 50 words that summarizes [topic or keyword]. Much summarize.",
+	"Yes": "",
 	"Yesterday": "",
 	"You": "",
 	"You have no archived conversations.": "",

+ 14 - 0
src/lib/i18n/locales/en-GB/translation.json

@@ -6,6 +6,7 @@
 	"{{modelName}} is thinking...": "",
 	"{{user}}'s Chats": "",
 	"{{webUIName}} Backend Required": "",
+	"A selected model does not support image input": "",
 	"a user": "",
 	"About": "",
 	"Account": "",
@@ -31,6 +32,7 @@
 	"Advanced Parameters": "",
 	"all": "",
 	"All Documents": "",
+	"All selected models do not support image input, removed images": "",
 	"All Users": "",
 	"Allow": "",
 	"Allow Chat Deletion": "",
@@ -115,6 +117,7 @@
 	"Created at": "",
 	"Created At": "",
 	"Current Model": "",
+	"Current Models": "",
 	"Current Password": "",
 	"Custom": "",
 	"Customize Ollama models for a specific purpose": "",
@@ -181,6 +184,7 @@
 	"Enter LiteLLM API RPM (litellm_params.rpm)": "",
 	"Enter LiteLLM Model (litellm_params.model)": "",
 	"Enter Max Tokens (litellm_params.max_tokens)": "",
+	"Enter Model Display Name": "",
 	"Enter model tag (e.g. {{modelTag}})": "",
 	"Enter Number of Steps (e.g. 50)": "",
 	"Enter Score": "",
@@ -235,6 +239,7 @@
 	"Input commands": "",
 	"Interface": "",
 	"Invalid Tag": "",
+	"Is Model Vision Capable": "",
 	"January": "",
 	"join our Discord for help.": "",
 	"JSON": "",
@@ -253,6 +258,7 @@
 	"Made by OpenWebUI Community": "",
 	"Make sure to enclose them with": "",
 	"Manage LiteLLM Models": "",
+	"Manage Model Information": "",
 	"Manage Models": "",
 	"Manage Ollama Models": "",
 	"March": "",
@@ -272,7 +278,12 @@
 	"Model '{{modelTag}}' is already in queue for downloading.": "",
 	"Model {{modelId}} not found": "",
 	"Model {{modelName}} already exists.": "",
+	"Model {{modelName}} is not vision capable": "",
+	"Model Description": "",
+	"Model Display Name": "",
 	"Model filesystem path detected. Model shortname is required for update, cannot continue.": "",
+	"Model info for {{modelName}} added successfully": "",
+	"Model info for {{modelName}} deleted successfully": "",
 	"Model Name": "",
 	"Model not selected": "",
 	"Model Tag Name": "",
@@ -289,6 +300,7 @@
 	"Name your modelfile": "",
 	"New Chat": "",
 	"New Password": "",
+	"No": "",
 	"No results found": "",
 	"No source available": "",
 	"Not factually correct": "",
@@ -385,6 +397,7 @@
 	"Select a model": "",
 	"Select an Ollama instance": "",
 	"Select model": "",
+	"Selected models do not support image inputs": "",
 	"Send": "",
 	"Send a Message": "",
 	"Send message": "",
@@ -492,6 +505,7 @@
 	"Workspace": "",
 	"Write a prompt suggestion (e.g. Who are you?)": "",
 	"Write a summary in 50 words that summarizes [topic or keyword].": "",
+	"Yes": "",
 	"Yesterday": "",
 	"You": "",
 	"You have no archived conversations.": "",

+ 14 - 0
src/lib/i18n/locales/en-US/translation.json

@@ -6,6 +6,7 @@
 	"{{modelName}} is thinking...": "",
 	"{{user}}'s Chats": "",
 	"{{webUIName}} Backend Required": "",
+	"A selected model does not support image input": "",
 	"a user": "",
 	"About": "",
 	"Account": "",
@@ -31,6 +32,7 @@
 	"Advanced Parameters": "",
 	"all": "",
 	"All Documents": "",
+	"All selected models do not support image input, removed images": "",
 	"All Users": "",
 	"Allow": "",
 	"Allow Chat Deletion": "",
@@ -115,6 +117,7 @@
 	"Created at": "",
 	"Created At": "",
 	"Current Model": "",
+	"Current Models": "",
 	"Current Password": "",
 	"Custom": "",
 	"Customize Ollama models for a specific purpose": "",
@@ -181,6 +184,7 @@
 	"Enter LiteLLM API RPM (litellm_params.rpm)": "",
 	"Enter LiteLLM Model (litellm_params.model)": "",
 	"Enter Max Tokens (litellm_params.max_tokens)": "",
+	"Enter Model Display Name": "",
 	"Enter model tag (e.g. {{modelTag}})": "",
 	"Enter Number of Steps (e.g. 50)": "",
 	"Enter Score": "",
@@ -235,6 +239,7 @@
 	"Input commands": "",
 	"Interface": "",
 	"Invalid Tag": "",
+	"Is Model Vision Capable": "",
 	"January": "",
 	"join our Discord for help.": "",
 	"JSON": "",
@@ -253,6 +258,7 @@
 	"Made by OpenWebUI Community": "",
 	"Make sure to enclose them with": "",
 	"Manage LiteLLM Models": "",
+	"Manage Model Information": "",
 	"Manage Models": "",
 	"Manage Ollama Models": "",
 	"March": "",
@@ -272,7 +278,12 @@
 	"Model '{{modelTag}}' is already in queue for downloading.": "",
 	"Model {{modelId}} not found": "",
 	"Model {{modelName}} already exists.": "",
+	"Model {{modelName}} is not vision capable": "",
+	"Model Description": "",
+	"Model Display Name": "",
 	"Model filesystem path detected. Model shortname is required for update, cannot continue.": "",
+	"Model info for {{modelName}} added successfully": "",
+	"Model info for {{modelName}} deleted successfully": "",
 	"Model Name": "",
 	"Model not selected": "",
 	"Model Tag Name": "",
@@ -289,6 +300,7 @@
 	"Name your modelfile": "",
 	"New Chat": "",
 	"New Password": "",
+	"No": "",
 	"No results found": "",
 	"No source available": "",
 	"Not factually correct": "",
@@ -385,6 +397,7 @@
 	"Select a model": "",
 	"Select an Ollama instance": "",
 	"Select model": "",
+	"Selected models do not support image inputs": "",
 	"Send": "",
 	"Send a Message": "",
 	"Send message": "",
@@ -492,6 +505,7 @@
 	"Workspace": "",
 	"Write a prompt suggestion (e.g. Who are you?)": "",
 	"Write a summary in 50 words that summarizes [topic or keyword].": "",
+	"Yes": "",
 	"Yesterday": "",
 	"You": "",
 	"You have no archived conversations.": "",

+ 14 - 0
src/lib/i18n/locales/es-ES/translation.json

@@ -6,6 +6,7 @@
 	"{{modelName}} is thinking...": "{{modelName}} está pensando...",
 	"{{user}}'s Chats": "{{user}}'s Chats",
 	"{{webUIName}} Backend Required": "{{webUIName}} Servidor Requerido",
+	"A selected model does not support image input": "",
 	"a user": "un usuario",
 	"About": "Sobre nosotros",
 	"Account": "Cuenta",
@@ -31,6 +32,7 @@
 	"Advanced Parameters": "Parámetros Avanzados",
 	"all": "todo",
 	"All Documents": "Todos los Documentos",
+	"All selected models do not support image input, removed images": "",
 	"All Users": "Todos los Usuarios",
 	"Allow": "Permitir",
 	"Allow Chat Deletion": "Permitir Borrar Chats",
@@ -115,6 +117,7 @@
 	"Created at": "Creado en",
 	"Created At": "Creado en",
 	"Current Model": "Modelo Actual",
+	"Current Models": "",
 	"Current Password": "Contraseña Actual",
 	"Custom": "Personalizado",
 	"Customize Ollama models for a specific purpose": "Personaliza los modelos de Ollama para un propósito específico",
@@ -181,6 +184,7 @@
 	"Enter LiteLLM API RPM (litellm_params.rpm)": "Ingrese el RPM de la API LiteLLM (litellm_params.rpm)",
 	"Enter LiteLLM Model (litellm_params.model)": "Ingrese el modelo LiteLLM (litellm_params.model)",
 	"Enter Max Tokens (litellm_params.max_tokens)": "Ingrese tokens máximos (litellm_params.max_tokens)",
+	"Enter Model Display Name": "",
 	"Enter model tag (e.g. {{modelTag}})": "Ingrese la etiqueta del modelo (p.ej. {{modelTag}})",
 	"Enter Number of Steps (e.g. 50)": "Ingrese el número de pasos (p.ej., 50)",
 	"Enter Score": "Ingrese la puntuación",
@@ -235,6 +239,7 @@
 	"Input commands": "Ingresar comandos",
 	"Interface": "Interfaz",
 	"Invalid Tag": "Etiqueta Inválida",
+	"Is Model Vision Capable": "",
 	"January": "Enero",
 	"join our Discord for help.": "Únase a nuestro Discord para obtener ayuda.",
 	"JSON": "JSON",
@@ -253,6 +258,7 @@
 	"Made by OpenWebUI Community": "Hecho por la comunidad de OpenWebUI",
 	"Make sure to enclose them with": "Asegúrese de adjuntarlos con",
 	"Manage LiteLLM Models": "Administrar Modelos LiteLLM",
+	"Manage Model Information": "",
 	"Manage Models": "Administrar Modelos",
 	"Manage Ollama Models": "Administrar Modelos Ollama",
 	"March": "Marzo",
@@ -272,7 +278,12 @@
 	"Model '{{modelTag}}' is already in queue for downloading.": "El modelo '{{modelTag}}' ya está en cola para descargar.",
 	"Model {{modelId}} not found": "El modelo {{modelId}} no fue encontrado",
 	"Model {{modelName}} already exists.": "El modelo {{modelName}} ya existe.",
+	"Model {{modelName}} is not vision capable": "",
+	"Model Description": "",
+	"Model Display Name": "",
 	"Model filesystem path detected. Model shortname is required for update, cannot continue.": "Se detectó la ruta del sistema de archivos del modelo. Se requiere el nombre corto del modelo para la actualización, no se puede continuar.",
+	"Model info for {{modelName}} added successfully": "",
+	"Model info for {{modelName}} deleted successfully": "",
 	"Model Name": "Nombre del modelo",
 	"Model not selected": "Modelo no seleccionado",
 	"Model Tag Name": "Nombre de la etiqueta del modelo",
@@ -289,6 +300,7 @@
 	"Name your modelfile": "Nombra tu modelfile",
 	"New Chat": "Nuevo Chat",
 	"New Password": "Nueva Contraseña",
+	"No": "",
 	"No results found": "No se han encontrado resultados",
 	"No source available": "No hay fuente disponible",
 	"Not factually correct": "No es correcto en todos los aspectos",
@@ -385,6 +397,7 @@
 	"Select a model": "Selecciona un modelo",
 	"Select an Ollama instance": "Seleccione una instancia de Ollama",
 	"Select model": "Selecciona un modelo",
+	"Selected models do not support image inputs": "",
 	"Send": "Enviar",
 	"Send a Message": "Enviar un Mensaje",
 	"Send message": "Enviar Mensaje",
@@ -492,6 +505,7 @@
 	"Workspace": "Espacio de trabajo",
 	"Write a prompt suggestion (e.g. Who are you?)": "Escribe una sugerencia para un prompt (por ejemplo, ¿quién eres?)",
 	"Write a summary in 50 words that summarizes [topic or keyword].": "Escribe un resumen en 50 palabras que resuma [tema o palabra clave].",
+	"Yes": "",
 	"Yesterday": "Ayer",
 	"You": "Usted",
 	"You have no archived conversations.": "No tiene conversaciones archivadas.",

+ 14 - 0
src/lib/i18n/locales/fa-IR/translation.json

@@ -6,6 +6,7 @@
 	"{{modelName}} is thinking...": "{{modelName}} در حال فکر کردن است...",
 	"{{user}}'s Chats": "{{user}} چت ها",
 	"{{webUIName}} Backend Required": "بکند {{webUIName}} نیاز است.",
+	"A selected model does not support image input": "",
 	"a user": "یک کاربر",
 	"About": "درباره",
 	"Account": "حساب کاربری",
@@ -31,6 +32,7 @@
 	"Advanced Parameters": "پارامترهای پیشرفته",
 	"all": "همه",
 	"All Documents": "تمام سند ها",
+	"All selected models do not support image input, removed images": "",
 	"All Users": "همه کاربران",
 	"Allow": "اجازه دادن",
 	"Allow Chat Deletion": "اجازه حذف گپ",
@@ -115,6 +117,7 @@
 	"Created at": "ایجاد شده در",
 	"Created At": "ایجاد شده در",
 	"Current Model": "مدل فعلی",
+	"Current Models": "",
 	"Current Password": "رمز عبور فعلی",
 	"Custom": "دلخواه",
 	"Customize Ollama models for a specific purpose": "مدل های اولاما را برای یک هدف خاص سفارشی کنید",
@@ -181,6 +184,7 @@
 	"Enter LiteLLM API RPM (litellm_params.rpm)": "RPM API مربوط به LiteLLM را وارد کنید (litellm_params.rpm)",
 	"Enter LiteLLM Model (litellm_params.model)": "مدل مربوط به LiteLLM را وارد کنید (litellm_params.model)",
 	"Enter Max Tokens (litellm_params.max_tokens)": "حداکثر تعداد توکن را وارد کنید (litellm_params.max_tokens)",
+	"Enter Model Display Name": "",
 	"Enter model tag (e.g. {{modelTag}})": "تگ مدل را وارد کنید (مثلا {{modelTag}})",
 	"Enter Number of Steps (e.g. 50)": "تعداد گام ها را وارد کنید (مثال: 50)",
 	"Enter Score": "امتیاز را وارد کنید",
@@ -235,6 +239,7 @@
 	"Input commands": "ورودی دستورات",
 	"Interface": "رابط",
 	"Invalid Tag": "تگ نامعتبر",
+	"Is Model Vision Capable": "",
 	"January": "ژانویه",
 	"join our Discord for help.": "برای کمک به دیسکورد ما بپیوندید.",
 	"JSON": "JSON",
@@ -253,6 +258,7 @@
 	"Made by OpenWebUI Community": "ساخته شده توسط OpenWebUI Community",
 	"Make sure to enclose them with": "مطمئن شوید که آنها را با این محصور کنید:",
 	"Manage LiteLLM Models": "Manage LiteLLM Models",
+	"Manage Model Information": "",
 	"Manage Models": "مدیریت مدل\u200cها",
 	"Manage Ollama Models": "مدیریت مدل\u200cهای اولاما",
 	"March": "مارچ",
@@ -272,7 +278,12 @@
 	"Model '{{modelTag}}' is already in queue for downloading.": "مدل '{{modelTag}}' در حال حاضر در صف برای دانلود است.",
 	"Model {{modelId}} not found": "مدل {{modelId}} یافت نشد",
 	"Model {{modelName}} already exists.": "مدل {{modelName}} در حال حاضر وجود دارد.",
+	"Model {{modelName}} is not vision capable": "",
+	"Model Description": "",
+	"Model Display Name": "",
 	"Model filesystem path detected. Model shortname is required for update, cannot continue.": "مسیر فایل سیستم مدل یافت شد. برای بروزرسانی نیاز است نام کوتاه مدل وجود داشته باشد.",
+	"Model info for {{modelName}} added successfully": "",
+	"Model info for {{modelName}} deleted successfully": "",
 	"Model Name": "نام مدل",
 	"Model not selected": "مدل انتخاب نشده",
 	"Model Tag Name": "نام تگ مدل",
@@ -289,6 +300,7 @@
 	"Name your modelfile": "فایل مدل را نام\u200cگذاری کنید",
 	"New Chat": "گپ جدید",
 	"New Password": "رمز عبور جدید",
+	"No": "",
 	"No results found": "نتیجه\u200cای یافت نشد",
 	"No source available": "منبعی در دسترس نیست",
 	"Not factually correct": "اشتباهی فکری نیست",
@@ -385,6 +397,7 @@
 	"Select a model": "انتخاب یک مدل",
 	"Select an Ollama instance": "انتخاب یک نمونه از اولاما",
 	"Select model": "انتخاب یک مدل",
+	"Selected models do not support image inputs": "",
 	"Send": "ارسال",
 	"Send a Message": "ارسال یک پیام",
 	"Send message": "ارسال پیام",
@@ -492,6 +505,7 @@
 	"Workspace": "محیط کار",
 	"Write a prompt suggestion (e.g. Who are you?)": "یک پیشنهاد پرامپت بنویسید (مثلاً شما کی هستید؟)",
 	"Write a summary in 50 words that summarizes [topic or keyword].": "خلاصه ای در 50 کلمه بنویسید که [موضوع یا کلمه کلیدی] را خلاصه کند.",
+	"Yes": "",
 	"Yesterday": "دیروز",
 	"You": "شما",
 	"You have no archived conversations.": "شما هیچ گفتگوی ذخیره شده ندارید.",

+ 14 - 0
src/lib/i18n/locales/fi-FI/translation.json

@@ -6,6 +6,7 @@
 	"{{modelName}} is thinking...": "{{modelName}} miettii...",
 	"{{user}}'s Chats": "{{user}}:n keskustelut",
 	"{{webUIName}} Backend Required": "{{webUIName}} backend vaaditaan",
+	"A selected model does not support image input": "",
 	"a user": "käyttäjä",
 	"About": "Tietoja",
 	"Account": "Tili",
@@ -31,6 +32,7 @@
 	"Advanced Parameters": "Edistyneet parametrit",
 	"all": "kaikki",
 	"All Documents": "Kaikki asiakirjat",
+	"All selected models do not support image input, removed images": "",
 	"All Users": "Kaikki käyttäjät",
 	"Allow": "Salli",
 	"Allow Chat Deletion": "Salli keskustelujen poisto",
@@ -115,6 +117,7 @@
 	"Created at": "Luotu",
 	"Created At": "Luotu",
 	"Current Model": "Nykyinen malli",
+	"Current Models": "",
 	"Current Password": "Nykyinen salasana",
 	"Custom": "Mukautettu",
 	"Customize Ollama models for a specific purpose": "Mukauta Ollama-malleja tiettyyn tarkoitukseen",
@@ -181,6 +184,7 @@
 	"Enter LiteLLM API RPM (litellm_params.rpm)": "Syötä LiteLLM-APIn RPM (litellm_params.rpm)",
 	"Enter LiteLLM Model (litellm_params.model)": "Syötä LiteLLM-malli (litellm_params.model)",
 	"Enter Max Tokens (litellm_params.max_tokens)": "Syötä maksimitokenit (litellm_params.max_tokens)",
+	"Enter Model Display Name": "",
 	"Enter model tag (e.g. {{modelTag}})": "Syötä mallitagi (esim. {{modelTag}})",
 	"Enter Number of Steps (e.g. 50)": "Syötä askelien määrä (esim. 50)",
 	"Enter Score": "Syötä pisteet",
@@ -235,6 +239,7 @@
 	"Input commands": "Syötä komennot",
 	"Interface": "Käyttöliittymä",
 	"Invalid Tag": "Virheellinen tagi",
+	"Is Model Vision Capable": "",
 	"January": "tammikuu",
 	"join our Discord for help.": "liity Discordiimme saadaksesi apua.",
 	"JSON": "JSON",
@@ -253,6 +258,7 @@
 	"Made by OpenWebUI Community": "Tehnyt OpenWebUI-yhteisö",
 	"Make sure to enclose them with": "Varmista, että suljet ne",
 	"Manage LiteLLM Models": "Hallitse LiteLLM-malleja",
+	"Manage Model Information": "",
 	"Manage Models": "Hallitse malleja",
 	"Manage Ollama Models": "Hallitse Ollama-malleja",
 	"March": "maaliskuu",
@@ -272,7 +278,12 @@
 	"Model '{{modelTag}}' is already in queue for downloading.": "Malli '{{modelTag}}' on jo jonossa ladattavaksi.",
 	"Model {{modelId}} not found": "Mallia {{modelId}} ei löytynyt",
 	"Model {{modelName}} already exists.": "Malli {{modelName}} on jo olemassa.",
+	"Model {{modelName}} is not vision capable": "",
+	"Model Description": "",
+	"Model Display Name": "",
 	"Model filesystem path detected. Model shortname is required for update, cannot continue.": "Mallin tiedostojärjestelmäpolku havaittu. Mallin lyhytnimi vaaditaan päivitykseen, ei voi jatkaa.",
+	"Model info for {{modelName}} added successfully": "",
+	"Model info for {{modelName}} deleted successfully": "",
 	"Model Name": "Mallin nimi",
 	"Model not selected": "Mallia ei valittu",
 	"Model Tag Name": "Mallitagin nimi",
@@ -289,6 +300,7 @@
 	"Name your modelfile": "Nimeä mallitiedostosi",
 	"New Chat": "Uusi keskustelu",
 	"New Password": "Uusi salasana",
+	"No": "",
 	"No results found": "Ei tuloksia",
 	"No source available": "Ei lähdettä saatavilla",
 	"Not factually correct": "Ei faktisesti oikein",
@@ -385,6 +397,7 @@
 	"Select a model": "Valitse malli",
 	"Select an Ollama instance": "Valitse Ollama-instanssi",
 	"Select model": "Valitse malli",
+	"Selected models do not support image inputs": "",
 	"Send": "Lähetä",
 	"Send a Message": "Lähetä viesti",
 	"Send message": "Lähetä viesti",
@@ -492,6 +505,7 @@
 	"Workspace": "Työtilat",
 	"Write a prompt suggestion (e.g. Who are you?)": "Kirjoita ehdotettu kehote (esim. Kuka olet?)",
 	"Write a summary in 50 words that summarizes [topic or keyword].": "Kirjoita 50 sanan yhteenveto, joka tiivistää [aihe tai avainsana].",
+	"Yes": "",
 	"Yesterday": "Eilen",
 	"You": "Sinä",
 	"You have no archived conversations.": "Sinulla ei ole arkistoituja keskusteluja.",

+ 14 - 0
src/lib/i18n/locales/fr-CA/translation.json

@@ -6,6 +6,7 @@
 	"{{modelName}} is thinking...": "{{modelName}} réfléchit...",
 	"{{user}}'s Chats": "{{user}}'s Chats",
 	"{{webUIName}} Backend Required": "Backend {{webUIName}} requis",
+	"A selected model does not support image input": "",
 	"a user": "un utilisateur",
 	"About": "À propos",
 	"Account": "Compte",
@@ -31,6 +32,7 @@
 	"Advanced Parameters": "Paramètres avancés",
 	"all": "tous",
 	"All Documents": "Tous les documents",
+	"All selected models do not support image input, removed images": "",
 	"All Users": "Tous les utilisateurs",
 	"Allow": "Autoriser",
 	"Allow Chat Deletion": "Autoriser la suppression des discussions",
@@ -115,6 +117,7 @@
 	"Created at": "Créé le",
 	"Created At": "Créé le",
 	"Current Model": "Modèle actuel",
+	"Current Models": "",
 	"Current Password": "Mot de passe actuel",
 	"Custom": "Personnalisé",
 	"Customize Ollama models for a specific purpose": "Personnaliser les modèles Ollama pour un objectif spécifique",
@@ -181,6 +184,7 @@
 	"Enter LiteLLM API RPM (litellm_params.rpm)": "Entrez le RPM de l'API LiteLLM (litellm_params.rpm)",
 	"Enter LiteLLM Model (litellm_params.model)": "Entrez le modèle LiteLLM (litellm_params.model)",
 	"Enter Max Tokens (litellm_params.max_tokens)": "Entrez le nombre max de tokens (litellm_params.max_tokens)",
+	"Enter Model Display Name": "",
 	"Enter model tag (e.g. {{modelTag}})": "Entrez le tag du modèle (p. ex. {{modelTag}})",
 	"Enter Number of Steps (e.g. 50)": "Entrez le nombre d'étapes (p. ex. 50)",
 	"Enter Score": "Entrez le score",
@@ -235,6 +239,7 @@
 	"Input commands": "Entrez des commandes d'entrée",
 	"Interface": "Interface",
 	"Invalid Tag": "Tag invalide",
+	"Is Model Vision Capable": "",
 	"January": "Janvier",
 	"join our Discord for help.": "rejoignez notre Discord pour obtenir de l'aide.",
 	"JSON": "JSON",
@@ -253,6 +258,7 @@
 	"Made by OpenWebUI Community": "Réalisé par la communauté OpenWebUI",
 	"Make sure to enclose them with": "Assurez-vous de les entourer avec",
 	"Manage LiteLLM Models": "Gérer les modèles LiteLLM",
+	"Manage Model Information": "",
 	"Manage Models": "Gérer les modèles",
 	"Manage Ollama Models": "Gérer les modèles Ollama",
 	"March": "Mars",
@@ -272,7 +278,12 @@
 	"Model '{{modelTag}}' is already in queue for downloading.": "Le modèle '{{modelTag}}' est déjà dans la file d'attente pour le téléchargement.",
 	"Model {{modelId}} not found": "Modèle {{modelId}} non trouvé",
 	"Model {{modelName}} already exists.": "Le modèle {{modelName}} existe déjà.",
+	"Model {{modelName}} is not vision capable": "",
+	"Model Description": "",
+	"Model Display Name": "",
 	"Model filesystem path detected. Model shortname is required for update, cannot continue.": "Le chemin du système de fichiers du modèle a été détecté. Le nom court du modèle est nécessaire pour la mise à jour, impossible de continuer.",
+	"Model info for {{modelName}} added successfully": "",
+	"Model info for {{modelName}} deleted successfully": "",
 	"Model Name": "Nom du modèle",
 	"Model not selected": "Modèle non sélectionné",
 	"Model Tag Name": "Nom de tag du modèle",
@@ -289,6 +300,7 @@
 	"Name your modelfile": "Nommez votre fichier de modèle",
 	"New Chat": "Nouvelle discussion",
 	"New Password": "Nouveau mot de passe",
+	"No": "",
 	"No results found": "Aucun résultat trouvé",
 	"No source available": "Aucune source disponible",
 	"Not factually correct": "Non, pas exactement correct",
@@ -385,6 +397,7 @@
 	"Select a model": "Sélectionnez un modèle",
 	"Select an Ollama instance": "Sélectionner une instance Ollama",
 	"Select model": "Sélectionnez un modèle",
+	"Selected models do not support image inputs": "",
 	"Send": "Envoyer",
 	"Send a Message": "Envoyer un message",
 	"Send message": "Envoyer un message",
@@ -492,6 +505,7 @@
 	"Workspace": "Espace de travail",
 	"Write a prompt suggestion (e.g. Who are you?)": "Rédigez une suggestion de prompt (p. ex. Qui êtes-vous ?)",
 	"Write a summary in 50 words that summarizes [topic or keyword].": "Rédigez un résumé en 50 mots qui résume [sujet ou mot-clé].",
+	"Yes": "",
 	"Yesterday": "hier",
 	"You": "Vous",
 	"You have no archived conversations.": "Vous n'avez aucune conversation archivée.",

+ 14 - 0
src/lib/i18n/locales/fr-FR/translation.json

@@ -6,6 +6,7 @@
 	"{{modelName}} is thinking...": "{{modelName}} réfléchit...",
 	"{{user}}'s Chats": "{{user}}'s Chats",
 	"{{webUIName}} Backend Required": "Backend {{webUIName}} requis",
+	"A selected model does not support image input": "",
 	"a user": "un utilisateur",
 	"About": "À propos",
 	"Account": "Compte",
@@ -31,6 +32,7 @@
 	"Advanced Parameters": "Paramètres avancés",
 	"all": "tous",
 	"All Documents": "Tous les documents",
+	"All selected models do not support image input, removed images": "",
 	"All Users": "Tous les utilisateurs",
 	"Allow": "Autoriser",
 	"Allow Chat Deletion": "Autoriser la suppression du chat",
@@ -115,6 +117,7 @@
 	"Created at": "Créé le",
 	"Created At": "Créé le",
 	"Current Model": "Modèle actuel",
+	"Current Models": "",
 	"Current Password": "Mot de passe actuel",
 	"Custom": "Personnalisé",
 	"Customize Ollama models for a specific purpose": "Personnaliser les modèles Ollama pour un objectif spécifique",
@@ -181,6 +184,7 @@
 	"Enter LiteLLM API RPM (litellm_params.rpm)": "Entrez le RPM de l'API LiteLLM (litellm_params.rpm)",
 	"Enter LiteLLM Model (litellm_params.model)": "Entrez le modèle LiteLLM (litellm_params.model)",
 	"Enter Max Tokens (litellm_params.max_tokens)": "Entrez le nombre max de tokens (litellm_params.max_tokens)",
+	"Enter Model Display Name": "",
 	"Enter model tag (e.g. {{modelTag}})": "Entrez le tag du modèle (p. ex. {{modelTag}})",
 	"Enter Number of Steps (e.g. 50)": "Entrez le nombre d'étapes (p. ex. 50)",
 	"Enter Score": "Entrez le score",
@@ -235,6 +239,7 @@
 	"Input commands": "Entrez les commandes d'entrée",
 	"Interface": "Interface",
 	"Invalid Tag": "Tag invalide",
+	"Is Model Vision Capable": "",
 	"January": "Janvier",
 	"join our Discord for help.": "rejoignez notre Discord pour obtenir de l'aide.",
 	"JSON": "JSON",
@@ -253,6 +258,7 @@
 	"Made by OpenWebUI Community": "Réalisé par la communauté OpenWebUI",
 	"Make sure to enclose them with": "Assurez-vous de les entourer avec",
 	"Manage LiteLLM Models": "Gérer les modèles LiteLLM",
+	"Manage Model Information": "",
 	"Manage Models": "Gérer les modèles",
 	"Manage Ollama Models": "Gérer les modèles Ollama",
 	"March": "Mars",
@@ -272,7 +278,12 @@
 	"Model '{{modelTag}}' is already in queue for downloading.": "Le modèle '{{modelTag}}' est déjà dans la file d'attente pour le téléchargement.",
 	"Model {{modelId}} not found": "Modèle {{modelId}} non trouvé",
 	"Model {{modelName}} already exists.": "Le modèle {{modelName}} existe déjà.",
+	"Model {{modelName}} is not vision capable": "",
+	"Model Description": "",
+	"Model Display Name": "",
 	"Model filesystem path detected. Model shortname is required for update, cannot continue.": "Le chemin du système de fichiers du modèle a été détecté. Le nom court du modèle est nécessaire pour la mise à jour, impossible de continuer.",
+	"Model info for {{modelName}} added successfully": "",
+	"Model info for {{modelName}} deleted successfully": "",
 	"Model Name": "Nom du modèle",
 	"Model not selected": "Modèle non sélectionné",
 	"Model Tag Name": "Nom de tag du modèle",
@@ -289,6 +300,7 @@
 	"Name your modelfile": "Nommez votre fichier de modèle",
 	"New Chat": "Nouveau chat",
 	"New Password": "Nouveau mot de passe",
+	"No": "",
 	"No results found": "Aucun résultat trouvé",
 	"No source available": "Aucune source disponible",
 	"Not factually correct": "Non, pas exactement correct",
@@ -385,6 +397,7 @@
 	"Select a model": "Sélectionner un modèle",
 	"Select an Ollama instance": "Sélectionner une instance Ollama",
 	"Select model": "Sélectionner un modèle",
+	"Selected models do not support image inputs": "",
 	"Send": "Envoyer",
 	"Send a Message": "Envoyer un message",
 	"Send message": "Envoyer un message",
@@ -492,6 +505,7 @@
 	"Workspace": "Espace de travail",
 	"Write a prompt suggestion (e.g. Who are you?)": "Écrivez un prompt (e.x. Qui est-tu ?)",
 	"Write a summary in 50 words that summarizes [topic or keyword].": "Ecrivez un résumé en 50 mots [sujet ou mot-clé]",
+	"Yes": "",
 	"Yesterday": "hier",
 	"You": "Vous",
 	"You have no archived conversations.": "Vous n'avez aucune conversation archivée.",

+ 14 - 0
src/lib/i18n/locales/he-IL/translation.json

@@ -6,6 +6,7 @@
 	"{{modelName}} is thinking...": "{{modelName}} חושב...",
 	"{{user}}'s Chats": "צ'אטים של {{user}}",
 	"{{webUIName}} Backend Required": "נדרש Backend של {{webUIName}}",
+	"A selected model does not support image input": "",
 	"a user": "משתמש",
 	"About": "אודות",
 	"Account": "חשבון",
@@ -31,6 +32,7 @@
 	"Advanced Parameters": "פרמטרים מתקדמים",
 	"all": "הכל",
 	"All Documents": "כל המסמכים",
+	"All selected models do not support image input, removed images": "",
 	"All Users": "כל המשתמשים",
 	"Allow": "אפשר",
 	"Allow Chat Deletion": "אפשר מחיקת צ'אט",
@@ -115,6 +117,7 @@
 	"Created at": "נוצר ב",
 	"Created At": "נוצר ב",
 	"Current Model": "המודל הנוכחי",
+	"Current Models": "",
 	"Current Password": "הסיסמה הנוכחית",
 	"Custom": "מותאם אישית",
 	"Customize Ollama models for a specific purpose": "התאמה אישית של מודלים של Ollama למטרה מסוימת",
@@ -181,6 +184,7 @@
 	"Enter LiteLLM API RPM (litellm_params.rpm)": "הזן RPM של API של LiteLLM (litellm_params.rpm)",
 	"Enter LiteLLM Model (litellm_params.model)": "הזן מודל LiteLLM (litellm_params.model)",
 	"Enter Max Tokens (litellm_params.max_tokens)": "הזן מספר מקסימלי של טוקנים (litellm_params.max_tokens)",
+	"Enter Model Display Name": "",
 	"Enter model tag (e.g. {{modelTag}})": "הזן תג מודל (למשל {{modelTag}})",
 	"Enter Number of Steps (e.g. 50)": "הזן מספר שלבים (למשל 50)",
 	"Enter Score": "הזן ציון",
@@ -235,6 +239,7 @@
 	"Input commands": "פקודות קלט",
 	"Interface": "ממשק",
 	"Invalid Tag": "תג לא חוקי",
+	"Is Model Vision Capable": "",
 	"January": "ינואר",
 	"join our Discord for help.": "הצטרף ל-Discord שלנו לעזרה.",
 	"JSON": "JSON",
@@ -253,6 +258,7 @@
 	"Made by OpenWebUI Community": "נוצר על ידי קהילת OpenWebUI",
 	"Make sure to enclose them with": "ודא להקיף אותם עם",
 	"Manage LiteLLM Models": "נהל מודלים של LiteLLM",
+	"Manage Model Information": "",
 	"Manage Models": "נהל מודלים",
 	"Manage Ollama Models": "נהל מודלים של Ollama",
 	"March": "מרץ",
@@ -272,7 +278,12 @@
 	"Model '{{modelTag}}' is already in queue for downloading.": "המודל '{{modelTag}}' כבר בתור להורדה.",
 	"Model {{modelId}} not found": "המודל {{modelId}} לא נמצא",
 	"Model {{modelName}} already exists.": "המודל {{modelName}} כבר קיים.",
+	"Model {{modelName}} is not vision capable": "",
+	"Model Description": "",
+	"Model Display Name": "",
 	"Model filesystem path detected. Model shortname is required for update, cannot continue.": "נתיב מערכת הקבצים של המודל זוהה. נדרש שם קצר של המודל לעדכון, לא ניתן להמשיך.",
+	"Model info for {{modelName}} added successfully": "",
+	"Model info for {{modelName}} deleted successfully": "",
 	"Model Name": "שם המודל",
 	"Model not selected": "לא נבחר מודל",
 	"Model Tag Name": "שם תג המודל",
@@ -289,6 +300,7 @@
 	"Name your modelfile": "תן שם לקובץ המודל שלך",
 	"New Chat": "צ'אט חדש",
 	"New Password": "סיסמה חדשה",
+	"No": "",
 	"No results found": "לא נמצאו תוצאות",
 	"No source available": "אין מקור זמין",
 	"Not factually correct": "לא נכון מבחינה עובדתית",
@@ -385,6 +397,7 @@
 	"Select a model": "בחר מודל",
 	"Select an Ollama instance": "בחר מופע של Ollama",
 	"Select model": "בחר מודל",
+	"Selected models do not support image inputs": "",
 	"Send": "שלח",
 	"Send a Message": "שלח הודעה",
 	"Send message": "שלח הודעה",
@@ -492,6 +505,7 @@
 	"Workspace": "סביבה",
 	"Write a prompt suggestion (e.g. Who are you?)": "כתוב הצעה מהירה (למשל, מי אתה?)",
 	"Write a summary in 50 words that summarizes [topic or keyword].": "כתוב סיכום ב-50 מילים שמסכם [נושא או מילת מפתח].",
+	"Yes": "",
 	"Yesterday": "אתמול",
 	"You": "אתה",
 	"You have no archived conversations.": "אין לך שיחות בארכיון.",

+ 14 - 0
src/lib/i18n/locales/hi-IN/translation.json

@@ -6,6 +6,7 @@
 	"{{modelName}} is thinking...": "{{modelName}} सोच रहा है...",
 	"{{user}}'s Chats": "{{user}} की चैट",
 	"{{webUIName}} Backend Required": "{{webUIName}} बैकएंड आवश्यक",
+	"A selected model does not support image input": "",
 	"a user": "एक उपयोगकर्ता",
 	"About": "हमारे बारे में",
 	"Account": "खाता",
@@ -31,6 +32,7 @@
 	"Advanced Parameters": "उन्नत पैरामीटर",
 	"all": "सभी",
 	"All Documents": "सभी डॉक्यूमेंट्स",
+	"All selected models do not support image input, removed images": "",
 	"All Users": "सभी उपयोगकर्ता",
 	"Allow": "अनुमति दें",
 	"Allow Chat Deletion": "चैट हटाने की अनुमति दें",
@@ -115,6 +117,7 @@
 	"Created at": "किस समय बनाया गया",
 	"Created At": "किस समय बनाया गया",
 	"Current Model": "वर्तमान मॉडल",
+	"Current Models": "",
 	"Current Password": "वर्तमान पासवर्ड",
 	"Custom": "कस्टम संस्करण",
 	"Customize Ollama models for a specific purpose": "किसी विशिष्ट उद्देश्य के लिए ओलामा मॉडल को अनुकूलित करें",
@@ -181,6 +184,7 @@
 	"Enter LiteLLM API RPM (litellm_params.rpm)": "LiteLLM API RPM दर्ज करें (litellm_params.rpm) ",
 	"Enter LiteLLM Model (litellm_params.model)": "LiteLLM Model दर्ज करें (litellm_params.model)",
 	"Enter Max Tokens (litellm_params.max_tokens)": "Max Tokens दर्ज करें (litellm_params.max_tokens)",
+	"Enter Model Display Name": "",
 	"Enter model tag (e.g. {{modelTag}})": "Model tag दर्ज करें (उदा. {{modelTag}})",
 	"Enter Number of Steps (e.g. 50)": "चरणों की संख्या दर्ज करें (उदा. 50)",
 	"Enter Score": "स्कोर दर्ज करें",
@@ -235,6 +239,7 @@
 	"Input commands": "इनपुट क命",
 	"Interface": "इंटरफेस",
 	"Invalid Tag": "अवैध टैग",
+	"Is Model Vision Capable": "",
 	"January": "जनवरी",
 	"join our Discord for help.": "मदद के लिए हमारे डिस्कोर्ड में शामिल हों।",
 	"JSON": "ज्ञान प्रकार",
@@ -253,6 +258,7 @@
 	"Made by OpenWebUI Community": "OpenWebUI समुदाय द्वारा निर्मित",
 	"Make sure to enclose them with": "उन्हें संलग्न करना सुनिश्चित करें",
 	"Manage LiteLLM Models": "LiteLLM मॉडल प्रबंधित करें",
+	"Manage Model Information": "",
 	"Manage Models": "मॉडल प्रबंधित करें",
 	"Manage Ollama Models": "Ollama मॉडल प्रबंधित करें",
 	"March": "मार्च",
@@ -272,7 +278,12 @@
 	"Model '{{modelTag}}' is already in queue for downloading.": "मॉडल '{{modelTag}}' पहले से ही डाउनलोड करने के लिए कतार में है।",
 	"Model {{modelId}} not found": "मॉडल {{modelId}} नहीं मिला",
 	"Model {{modelName}} already exists.": "मॉडल {{modelName}} पहले से मौजूद है।",
+	"Model {{modelName}} is not vision capable": "",
+	"Model Description": "",
+	"Model Display Name": "",
 	"Model filesystem path detected. Model shortname is required for update, cannot continue.": "मॉडल फ़ाइल सिस्टम पथ का पता चला. अद्यतन के लिए मॉडल संक्षिप्त नाम आवश्यक है, जारी नहीं रखा जा सकता।",
+	"Model info for {{modelName}} added successfully": "",
+	"Model info for {{modelName}} deleted successfully": "",
 	"Model Name": "मॉडल नाम",
 	"Model not selected": "मॉडल चयनित नहीं है",
 	"Model Tag Name": "मॉडल टैग नाम",
@@ -289,6 +300,7 @@
 	"Name your modelfile": "अपनी मॉडलफ़ाइल को नाम दें",
 	"New Chat": "नई चैट",
 	"New Password": "नया पासवर्ड",
+	"No": "",
 	"No results found": "कोई परिणाम नहीं मिला",
 	"No source available": "कोई स्रोत उपलब्ध नहीं है",
 	"Not factually correct": "तथ्यात्मक रूप से सही नहीं है",
@@ -385,6 +397,7 @@
 	"Select a model": "एक मॉडल चुनें",
 	"Select an Ollama instance": "एक Ollama Instance चुनें",
 	"Select model": "मॉडल चुनें",
+	"Selected models do not support image inputs": "",
 	"Send": "भेज",
 	"Send a Message": "एक संदेश भेजो",
 	"Send message": "मेसेज भेजें",
@@ -492,6 +505,7 @@
 	"Workspace": "वर्कस्पेस",
 	"Write a prompt suggestion (e.g. Who are you?)": "एक त्वरित सुझाव लिखें (जैसे कि आप कौन हैं?)",
 	"Write a summary in 50 words that summarizes [topic or keyword].": "50 शब्दों में एक सारांश लिखें जो [विषय या कीवर्ड] का सारांश प्रस्तुत करता हो।",
+	"Yes": "",
 	"Yesterday": "कल",
 	"You": "आप",
 	"You have no archived conversations.": "आपको कोई अंकित चैट नहीं है।",

+ 14 - 0
src/lib/i18n/locales/hr-HR/translation.json

@@ -6,6 +6,7 @@
 	"{{modelName}} is thinking...": "{{modelName}} razmišlja...",
 	"{{user}}'s Chats": "Razgovori korisnika {{user}}",
 	"{{webUIName}} Backend Required": "{{webUIName}} Backend je potreban",
+	"A selected model does not support image input": "",
 	"a user": "korisnik",
 	"About": "O aplikaciji",
 	"Account": "Račun",
@@ -31,6 +32,7 @@
 	"Advanced Parameters": "Napredni parametri",
 	"all": "sve",
 	"All Documents": "Svi dokumenti",
+	"All selected models do not support image input, removed images": "",
 	"All Users": "Svi korisnici",
 	"Allow": "Dopusti",
 	"Allow Chat Deletion": "Dopusti brisanje razgovora",
@@ -115,6 +117,7 @@
 	"Created at": "Stvoreno",
 	"Created At": "Stvoreno",
 	"Current Model": "Trenutni model",
+	"Current Models": "",
 	"Current Password": "Trenutna lozinka",
 	"Custom": "Prilagođeno",
 	"Customize Ollama models for a specific purpose": "Prilagodite Ollama modele za specifičnu svrhu",
@@ -181,6 +184,7 @@
 	"Enter LiteLLM API RPM (litellm_params.rpm)": "Unesite LiteLLM API RPM (litellm_params.rpm)",
 	"Enter LiteLLM Model (litellm_params.model)": "Unesite LiteLLM model (litellm_params.model)",
 	"Enter Max Tokens (litellm_params.max_tokens)": "Unesite maksimalan broj tokena (litellm_params.max_tokens)",
+	"Enter Model Display Name": "",
 	"Enter model tag (e.g. {{modelTag}})": "Unesite oznaku modela (npr. {{modelTag}})",
 	"Enter Number of Steps (e.g. 50)": "Unesite broj koraka (npr. 50)",
 	"Enter Score": "Unesite ocjenu",
@@ -235,6 +239,7 @@
 	"Input commands": "Unos naredbi",
 	"Interface": "Sučelje",
 	"Invalid Tag": "Nevažeća oznaka",
+	"Is Model Vision Capable": "",
 	"January": "Siječanj",
 	"join our Discord for help.": "pridružite se našem Discordu za pomoć.",
 	"JSON": "JSON",
@@ -253,6 +258,7 @@
 	"Made by OpenWebUI Community": "Izradio OpenWebUI Community",
 	"Make sure to enclose them with": "Provjerite da ih zatvorite s",
 	"Manage LiteLLM Models": "Upravljajte LiteLLM modelima",
+	"Manage Model Information": "",
 	"Manage Models": "Upravljanje modelima",
 	"Manage Ollama Models": "Upravljanje Ollama modelima",
 	"March": "Ožujak",
@@ -272,7 +278,12 @@
 	"Model '{{modelTag}}' is already in queue for downloading.": "Model '{{modelTag}}' je već u redu za preuzimanje.",
 	"Model {{modelId}} not found": "Model {{modelId}} nije pronađen",
 	"Model {{modelName}} already exists.": "Model {{modelName}} već postoji.",
+	"Model {{modelName}} is not vision capable": "",
+	"Model Description": "",
+	"Model Display Name": "",
 	"Model filesystem path detected. Model shortname is required for update, cannot continue.": "Otkriven put datotečnog sustava modela. Kratko ime modela je potrebno za ažuriranje, nije moguće nastaviti.",
+	"Model info for {{modelName}} added successfully": "",
+	"Model info for {{modelName}} deleted successfully": "",
 	"Model Name": "Naziv modela",
 	"Model not selected": "Model nije odabran",
 	"Model Tag Name": "Naziv oznake modela",
@@ -289,6 +300,7 @@
 	"Name your modelfile": "Nazovite svoju datoteku modela",
 	"New Chat": "Novi razgovor",
 	"New Password": "Nova lozinka",
+	"No": "",
 	"No results found": "Nema rezultata",
 	"No source available": "Nema dostupnog izvora",
 	"Not factually correct": "Nije činjenično točno",
@@ -385,6 +397,7 @@
 	"Select a model": "Odaberite model",
 	"Select an Ollama instance": "Odaberite Ollama instancu",
 	"Select model": "Odaberite model",
+	"Selected models do not support image inputs": "",
 	"Send": "Pošalji",
 	"Send a Message": "Pošaljite poruku",
 	"Send message": "Pošalji poruku",
@@ -492,6 +505,7 @@
 	"Workspace": "Radna ploča",
 	"Write a prompt suggestion (e.g. Who are you?)": "Napišite prijedlog prompta (npr. Tko si ti?)",
 	"Write a summary in 50 words that summarizes [topic or keyword].": "Napišite sažetak u 50 riječi koji sažima [temu ili ključnu riječ].",
+	"Yes": "",
 	"Yesterday": "Jučer",
 	"You": "Vi",
 	"You have no archived conversations.": "Nemate arhiviranih razgovora.",

+ 14 - 0
src/lib/i18n/locales/it-IT/translation.json

@@ -6,6 +6,7 @@
 	"{{modelName}} is thinking...": "{{modelName}} sta pensando...",
 	"{{user}}'s Chats": "{{user}} Chat",
 	"{{webUIName}} Backend Required": "{{webUIName}} Backend richiesto",
+	"A selected model does not support image input": "",
 	"a user": "un utente",
 	"About": "Informazioni",
 	"Account": "Account",
@@ -31,6 +32,7 @@
 	"Advanced Parameters": "Parametri avanzati",
 	"all": "tutti",
 	"All Documents": "Tutti i documenti",
+	"All selected models do not support image input, removed images": "",
 	"All Users": "Tutti gli utenti",
 	"Allow": "Consenti",
 	"Allow Chat Deletion": "Consenti l'eliminazione della chat",
@@ -115,6 +117,7 @@
 	"Created at": "Creato il",
 	"Created At": "Creato il",
 	"Current Model": "Modello corrente",
+	"Current Models": "",
 	"Current Password": "Password corrente",
 	"Custom": "Personalizzato",
 	"Customize Ollama models for a specific purpose": "Personalizza i modelli Ollama per uno scopo specifico",
@@ -181,6 +184,7 @@
 	"Enter LiteLLM API RPM (litellm_params.rpm)": "Inserisci LiteLLM API RPM (litellm_params.rpm)",
 	"Enter LiteLLM Model (litellm_params.model)": "Inserisci il modello LiteLLM (litellm_params.model)",
 	"Enter Max Tokens (litellm_params.max_tokens)": "Inserisci Max Tokens (litellm_params.max_tokens)",
+	"Enter Model Display Name": "",
 	"Enter model tag (e.g. {{modelTag}})": "Inserisci il tag del modello (ad esempio {{modelTag}})",
 	"Enter Number of Steps (e.g. 50)": "Inserisci il numero di passaggi (ad esempio 50)",
 	"Enter Score": "Inserisci il punteggio",
@@ -235,6 +239,7 @@
 	"Input commands": "Comandi di input",
 	"Interface": "Interfaccia",
 	"Invalid Tag": "Tag non valido",
+	"Is Model Vision Capable": "",
 	"January": "Gennaio",
 	"join our Discord for help.": "unisciti al nostro Discord per ricevere aiuto.",
 	"JSON": "JSON",
@@ -253,6 +258,7 @@
 	"Made by OpenWebUI Community": "Realizzato dalla comunità OpenWebUI",
 	"Make sure to enclose them with": "Assicurati di racchiuderli con",
 	"Manage LiteLLM Models": "Gestisci modelli LiteLLM",
+	"Manage Model Information": "",
 	"Manage Models": "Gestisci modelli",
 	"Manage Ollama Models": "Gestisci modelli Ollama",
 	"March": "Marzo",
@@ -272,7 +278,12 @@
 	"Model '{{modelTag}}' is already in queue for downloading.": "Il modello '{{modelTag}}' è già in coda per il download.",
 	"Model {{modelId}} not found": "Modello {{modelId}} non trovato",
 	"Model {{modelName}} already exists.": "Il modello {{modelName}} esiste già.",
+	"Model {{modelName}} is not vision capable": "",
+	"Model Description": "",
+	"Model Display Name": "",
 	"Model filesystem path detected. Model shortname is required for update, cannot continue.": "Percorso del filesystem del modello rilevato. Il nome breve del modello è richiesto per l'aggiornamento, impossibile continuare.",
+	"Model info for {{modelName}} added successfully": "",
+	"Model info for {{modelName}} deleted successfully": "",
 	"Model Name": "Nome modello",
 	"Model not selected": "Modello non selezionato",
 	"Model Tag Name": "Nome tag del modello",
@@ -289,6 +300,7 @@
 	"Name your modelfile": "Assegna un nome al tuo file modello",
 	"New Chat": "Nuova chat",
 	"New Password": "Nuova password",
+	"No": "",
 	"No results found": "Nessun risultato trovato",
 	"No source available": "Nessuna fonte disponibile",
 	"Not factually correct": "Non corretto dal punto di vista fattuale",
@@ -385,6 +397,7 @@
 	"Select a model": "Seleziona un modello",
 	"Select an Ollama instance": "Seleziona un'istanza Ollama",
 	"Select model": "Seleziona modello",
+	"Selected models do not support image inputs": "",
 	"Send": "Invia",
 	"Send a Message": "Invia un messaggio",
 	"Send message": "Invia messaggio",
@@ -492,6 +505,7 @@
 	"Workspace": "Area di lavoro",
 	"Write a prompt suggestion (e.g. Who are you?)": "Scrivi un suggerimento per il prompt (ad esempio Chi sei?)",
 	"Write a summary in 50 words that summarizes [topic or keyword].": "Scrivi un riassunto in 50 parole che riassume [argomento o parola chiave].",
+	"Yes": "",
 	"Yesterday": "Ieri",
 	"You": "Tu",
 	"You have no archived conversations.": "Non hai conversazioni archiviate.",

+ 14 - 0
src/lib/i18n/locales/ja-JP/translation.json

@@ -6,6 +6,7 @@
 	"{{modelName}} is thinking...": "{{modelName}} は思考中です...",
 	"{{user}}'s Chats": "{{user}} のチャット",
 	"{{webUIName}} Backend Required": "{{webUIName}} バックエンドが必要です",
+	"A selected model does not support image input": "",
 	"a user": "ユーザー",
 	"About": "概要",
 	"Account": "アカウント",
@@ -31,6 +32,7 @@
 	"Advanced Parameters": "詳細パラメーター",
 	"all": "すべて",
 	"All Documents": "全てのドキュメント",
+	"All selected models do not support image input, removed images": "",
 	"All Users": "すべてのユーザー",
 	"Allow": "許可",
 	"Allow Chat Deletion": "チャットの削除を許可",
@@ -115,6 +117,7 @@
 	"Created at": "作成日時",
 	"Created At": "作成日時",
 	"Current Model": "現在のモデル",
+	"Current Models": "",
 	"Current Password": "現在のパスワード",
 	"Custom": "カスタム",
 	"Customize Ollama models for a specific purpose": "特定の目的に合わせて Ollama モデルをカスタマイズ",
@@ -181,6 +184,7 @@
 	"Enter LiteLLM API RPM (litellm_params.rpm)": "LiteLLM API RPM を入力してください (litellm_params.rpm)",
 	"Enter LiteLLM Model (litellm_params.model)": "LiteLLM モデルを入力してください (litellm_params.model)",
 	"Enter Max Tokens (litellm_params.max_tokens)": "最大トークン数を入力してください (litellm_params.max_tokens)",
+	"Enter Model Display Name": "",
 	"Enter model tag (e.g. {{modelTag}})": "モデルタグを入力してください (例: {{modelTag}})",
 	"Enter Number of Steps (e.g. 50)": "ステップ数を入力してください (例: 50)",
 	"Enter Score": "スコアを入力してください",
@@ -235,6 +239,7 @@
 	"Input commands": "入力コマンド",
 	"Interface": "インターフェース",
 	"Invalid Tag": "無効なタグ",
+	"Is Model Vision Capable": "",
 	"January": "1月",
 	"join our Discord for help.": "ヘルプについては、Discord に参加してください。",
 	"JSON": "JSON",
@@ -253,6 +258,7 @@
 	"Made by OpenWebUI Community": "OpenWebUI コミュニティによって作成",
 	"Make sure to enclose them with": "必ず次で囲んでください",
 	"Manage LiteLLM Models": "LiteLLM モデルを管理",
+	"Manage Model Information": "",
 	"Manage Models": "モデルを管理",
 	"Manage Ollama Models": "Ollama モデルを管理",
 	"March": "3月",
@@ -272,7 +278,12 @@
 	"Model '{{modelTag}}' is already in queue for downloading.": "モデル '{{modelTag}}' はすでにダウンロード待ち行列に入っています。",
 	"Model {{modelId}} not found": "モデル {{modelId}} が見つかりません",
 	"Model {{modelName}} already exists.": "モデル {{modelName}} はすでに存在します。",
+	"Model {{modelName}} is not vision capable": "",
+	"Model Description": "",
+	"Model Display Name": "",
 	"Model filesystem path detected. Model shortname is required for update, cannot continue.": "モデルファイルシステムパスが検出されました。モデルの短縮名が必要です。更新できません。",
+	"Model info for {{modelName}} added successfully": "",
+	"Model info for {{modelName}} deleted successfully": "",
 	"Model Name": "モデル名",
 	"Model not selected": "モデルが選択されていません",
 	"Model Tag Name": "モデルタグ名",
@@ -289,6 +300,7 @@
 	"Name your modelfile": "モデルファイルに名前を付ける",
 	"New Chat": "新しいチャット",
 	"New Password": "新しいパスワード",
+	"No": "",
 	"No results found": "結果が見つかりません",
 	"No source available": "使用可能なソースがありません",
 	"Not factually correct": "実事上正しくない",
@@ -385,6 +397,7 @@
 	"Select a model": "モデルを選択",
 	"Select an Ollama instance": "Ollama インスタンスを選択",
 	"Select model": "モデルを選択",
+	"Selected models do not support image inputs": "",
 	"Send": "送信",
 	"Send a Message": "メッセージを送信",
 	"Send message": "メッセージを送信",
@@ -492,6 +505,7 @@
 	"Workspace": "ワークスペース",
 	"Write a prompt suggestion (e.g. Who are you?)": "プロンプトの提案を書いてください (例: あなたは誰ですか?)",
 	"Write a summary in 50 words that summarizes [topic or keyword].": "[トピックまたはキーワード] を要約する 50 語の概要を書いてください。",
+	"Yes": "",
 	"Yesterday": "昨日",
 	"You": "あなた",
 	"You have no archived conversations.": "これまでにアーカイブされた会話はありません。",

+ 14 - 0
src/lib/i18n/locales/ka-GE/translation.json

@@ -6,6 +6,7 @@
 	"{{modelName}} is thinking...": "{{modelName}} ფიქრობს...",
 	"{{user}}'s Chats": "{{user}}-ის ჩათები",
 	"{{webUIName}} Backend Required": "{{webUIName}} საჭიროა ბექენდი",
+	"A selected model does not support image input": "",
 	"a user": "მომხმარებელი",
 	"About": "შესახებ",
 	"Account": "ანგარიში",
@@ -31,6 +32,7 @@
 	"Advanced Parameters": "დამატებითი პარამეტრები",
 	"all": "ყველა",
 	"All Documents": "ყველა დოკუმენტი",
+	"All selected models do not support image input, removed images": "",
 	"All Users": "ყველა მომხმარებელი",
 	"Allow": "ნების დართვა",
 	"Allow Chat Deletion": "მიმოწერის წაშლის დაშვება",
@@ -115,6 +117,7 @@
 	"Created at": "შექმნილია",
 	"Created At": "შექმნილია",
 	"Current Model": "მიმდინარე მოდელი",
+	"Current Models": "",
 	"Current Password": "მიმდინარე პაროლი",
 	"Custom": "საკუთარი",
 	"Customize Ollama models for a specific purpose": "Ollama მოდელების დამუშავება სპეციფიური დანიშნულებისთვის",
@@ -181,6 +184,7 @@
 	"Enter LiteLLM API RPM (litellm_params.rpm)": "შეიყვანეთ LiteLLM API RPM (litellm_params.rpm)",
 	"Enter LiteLLM Model (litellm_params.model)": "შეიყვანეთ LiteLLM მოდელი (litellm_params.model)",
 	"Enter Max Tokens (litellm_params.max_tokens)": "შეიყვანეთ მაქსიმალური ტოკენები (litellm_params.max_tokens)",
+	"Enter Model Display Name": "",
 	"Enter model tag (e.g. {{modelTag}})": "შეიყვანეთ მოდელის ტეგი (მაგ. {{modelTag}})",
 	"Enter Number of Steps (e.g. 50)": "შეიყვანეთ ნაბიჯების რაოდენობა (მაგ. 50)",
 	"Enter Score": "შეიყვანეთ ქულა",
@@ -235,6 +239,7 @@
 	"Input commands": "შეყვანით ბრძანებებს",
 	"Interface": "ინტერფეისი",
 	"Invalid Tag": "არასწორი ტეგი",
+	"Is Model Vision Capable": "",
 	"January": "იანვარი",
 	"join our Discord for help.": "შეუერთდით ჩვენს Discord-ს დახმარებისთვის",
 	"JSON": "JSON",
@@ -253,6 +258,7 @@
 	"Made by OpenWebUI Community": "დამზადებულია OpenWebUI საზოგადოების მიერ",
 	"Make sure to enclose them with": "დარწმუნდით, რომ დაურთეთ ისინი",
 	"Manage LiteLLM Models": "LiteLLM მოდელების მართვა",
+	"Manage Model Information": "",
 	"Manage Models": "მოდელების მართვა",
 	"Manage Ollama Models": "Ollama მოდელების მართვა",
 	"March": "მარტივი",
@@ -272,7 +278,12 @@
 	"Model '{{modelTag}}' is already in queue for downloading.": "მოდელი „{{modelTag}}“ უკვე ჩამოტვირთვის რიგშია.",
 	"Model {{modelId}} not found": "მოდელი {{modelId}} ვერ მოიძებნა",
 	"Model {{modelName}} already exists.": "მოდელი {{modelName}} უკვე არსებობს.",
+	"Model {{modelName}} is not vision capable": "",
+	"Model Description": "",
+	"Model Display Name": "",
 	"Model filesystem path detected. Model shortname is required for update, cannot continue.": "აღმოჩენილია მოდელის ფაილური სისტემის გზა. განახლებისთვის საჭიროა მოდელის მოკლე სახელი, გაგრძელება შეუძლებელია.",
+	"Model info for {{modelName}} added successfully": "",
+	"Model info for {{modelName}} deleted successfully": "",
 	"Model Name": "მოდელის სახელი",
 	"Model not selected": "მოდელი არ არის არჩეული",
 	"Model Tag Name": "მოდელის ტეგის სახელი",
@@ -289,6 +300,7 @@
 	"Name your modelfile": "თქვენი მოდელური ფაილის სახელი",
 	"New Chat": "ახალი მიმოწერა",
 	"New Password": "ახალი პაროლი",
+	"No": "",
 	"No results found": "ჩვენ ვერ პოულობით ნაპოვნი ჩაწერები",
 	"No source available": "წყარო არ არის ხელმისაწვდომი",
 	"Not factually correct": "არ ვეთანხმები პირდაპირ ვერც ვეთანხმები",
@@ -385,6 +397,7 @@
 	"Select a model": "მოდელის არჩევა",
 	"Select an Ollama instance": "Ollama ინსტანსის არჩევა",
 	"Select model": "მოდელის არჩევა",
+	"Selected models do not support image inputs": "",
 	"Send": "გაგზავნა",
 	"Send a Message": "შეტყობინების გაგზავნა",
 	"Send message": "შეტყობინების გაგზავნა",
@@ -492,6 +505,7 @@
 	"Workspace": "ვულერი",
 	"Write a prompt suggestion (e.g. Who are you?)": "დაწერეთ მოკლე წინადადება (მაგ. ვინ ხარ?",
 	"Write a summary in 50 words that summarizes [topic or keyword].": "დაწერეთ რეზიუმე 50 სიტყვით, რომელიც აჯამებს [თემას ან საკვანძო სიტყვას].",
+	"Yes": "",
 	"Yesterday": "აღდგენა",
 	"You": "ჩემი",
 	"You have no archived conversations.": "არ ხართ არქივირებული განხილვები.",

+ 14 - 0
src/lib/i18n/locales/ko-KR/translation.json

@@ -6,6 +6,7 @@
 	"{{modelName}} is thinking...": "{{modelName}} 이(가) 생각중입니다....",
 	"{{user}}'s Chats": "{{user}}의 채팅",
 	"{{webUIName}} Backend Required": "{{webUIName}} 백엔드가 필요합니다.",
+	"A selected model does not support image input": "",
 	"a user": "사용자",
 	"About": "소개",
 	"Account": "계정",
@@ -31,6 +32,7 @@
 	"Advanced Parameters": "고급 매개변수",
 	"all": "모두",
 	"All Documents": "모든 문서",
+	"All selected models do not support image input, removed images": "",
 	"All Users": "모든 사용자",
 	"Allow": "허용",
 	"Allow Chat Deletion": "채팅 삭제 허용",
@@ -115,6 +117,7 @@
 	"Created at": "생성일",
 	"Created At": "생성일",
 	"Current Model": "현재 모델",
+	"Current Models": "",
 	"Current Password": "현재 비밀번호",
 	"Custom": "사용자 정의",
 	"Customize Ollama models for a specific purpose": "특정 목적으로 Ollama 모델 사용자 정의",
@@ -181,6 +184,7 @@
 	"Enter LiteLLM API RPM (litellm_params.rpm)": "LiteLLM API RPM 입력(litellm_params.rpm)",
 	"Enter LiteLLM Model (litellm_params.model)": "LiteLLM 모델 입력(litellm_params.model)",
 	"Enter Max Tokens (litellm_params.max_tokens)": "최대 토큰 수 입력(litellm_params.max_tokens)",
+	"Enter Model Display Name": "",
 	"Enter model tag (e.g. {{modelTag}})": "모델 태그 입력(예: {{modelTag}})",
 	"Enter Number of Steps (e.g. 50)": "단계 수 입력(예: 50)",
 	"Enter Score": "점수 입력",
@@ -235,6 +239,7 @@
 	"Input commands": "입력 명령",
 	"Interface": "인터페이스",
 	"Invalid Tag": "잘못된 태그",
+	"Is Model Vision Capable": "",
 	"January": "1월",
 	"join our Discord for help.": "도움말을 보려면 Discord에 가입하세요.",
 	"JSON": "JSON",
@@ -253,6 +258,7 @@
 	"Made by OpenWebUI Community": "OpenWebUI 커뮤니티에서 제작",
 	"Make sure to enclose them with": "다음으로 묶는 것을 잊지 마세요:",
 	"Manage LiteLLM Models": "LiteLLM 모델 관리",
+	"Manage Model Information": "",
 	"Manage Models": "모델 관리",
 	"Manage Ollama Models": "Ollama 모델 관리",
 	"March": "3월",
@@ -272,7 +278,12 @@
 	"Model '{{modelTag}}' is already in queue for downloading.": "모델 '{{modelTag}}'이(가) 이미 다운로드 대기열에 있습니다.",
 	"Model {{modelId}} not found": "모델 {{modelId}}를 찾을 수 없습니다.",
 	"Model {{modelName}} already exists.": "모델 {{modelName}}이(가) 이미 존재합니다.",
+	"Model {{modelName}} is not vision capable": "",
+	"Model Description": "",
+	"Model Display Name": "",
 	"Model filesystem path detected. Model shortname is required for update, cannot continue.": "모델 파일 시스템 경로가 감지되었습니다. 업데이트하려면 모델 단축 이름이 필요하며 계속할 수 없습니다.",
+	"Model info for {{modelName}} added successfully": "",
+	"Model info for {{modelName}} deleted successfully": "",
 	"Model Name": "모델 이름",
 	"Model not selected": "모델이 선택되지 않았습니다.",
 	"Model Tag Name": "모델 태그 이름",
@@ -289,6 +300,7 @@
 	"Name your modelfile": "모델파일 이름 지정",
 	"New Chat": "새 채팅",
 	"New Password": "새 비밀번호",
+	"No": "",
 	"No results found": "결과 없음",
 	"No source available": "사용 가능한 소스 없음",
 	"Not factually correct": "사실상 맞지 않음",
@@ -385,6 +397,7 @@
 	"Select a model": "모델 선택",
 	"Select an Ollama instance": "Ollama 인스턴스 선택",
 	"Select model": "모델 선택",
+	"Selected models do not support image inputs": "",
 	"Send": "보내기",
 	"Send a Message": "메시지 보내기",
 	"Send message": "메시지 보내기",
@@ -492,6 +505,7 @@
 	"Workspace": "워크스페이스",
 	"Write a prompt suggestion (e.g. Who are you?)": "프롬프트 제안 작성 (예: 당신은 누구인가요?)",
 	"Write a summary in 50 words that summarizes [topic or keyword].": "[주제 또는 키워드]에 대한 50단어 요약문 작성.",
+	"Yes": "",
 	"Yesterday": "어제",
 	"You": "당신",
 	"You have no archived conversations.": "채팅을 아카이브한 적이 없습니다.",

+ 14 - 0
src/lib/i18n/locales/nl-NL/translation.json

@@ -6,6 +6,7 @@
 	"{{modelName}} is thinking...": "{{modelName}} is aan het denken...",
 	"{{user}}'s Chats": "{{user}}'s Chats",
 	"{{webUIName}} Backend Required": "{{webUIName}} Backend Verlpicht",
+	"A selected model does not support image input": "",
 	"a user": "een gebruiker",
 	"About": "Over",
 	"Account": "Account",
@@ -31,6 +32,7 @@
 	"Advanced Parameters": "Geavanceerde Parameters",
 	"all": "alle",
 	"All Documents": "Alle Documenten",
+	"All selected models do not support image input, removed images": "",
 	"All Users": "Alle Gebruikers",
 	"Allow": "Toestaan",
 	"Allow Chat Deletion": "Sta Chat Verwijdering toe",
@@ -115,6 +117,7 @@
 	"Created at": "Gemaakt op",
 	"Created At": "Gemaakt op",
 	"Current Model": "Huidig Model",
+	"Current Models": "",
 	"Current Password": "Huidig Wachtwoord",
 	"Custom": "Aangepast",
 	"Customize Ollama models for a specific purpose": "Pas Ollama modellen aan voor een specifiek doel",
@@ -181,6 +184,7 @@
 	"Enter LiteLLM API RPM (litellm_params.rpm)": "Voeg LiteLLM API RPM toe (litellm_params.rpm)",
 	"Enter LiteLLM Model (litellm_params.model)": "Voeg LiteLLM Model toe (litellm_params.model)",
 	"Enter Max Tokens (litellm_params.max_tokens)": "Voeg maximum aantal tokens toe (litellm_params.max_tokens)",
+	"Enter Model Display Name": "",
 	"Enter model tag (e.g. {{modelTag}})": "Voeg model tag toe (Bijv. {{modelTag}})",
 	"Enter Number of Steps (e.g. 50)": "Voeg aantal stappen toe (Bijv. 50)",
 	"Enter Score": "Voeg score toe",
@@ -235,6 +239,7 @@
 	"Input commands": "Voer commando's in",
 	"Interface": "Interface",
 	"Invalid Tag": "Ongeldige Tag",
+	"Is Model Vision Capable": "",
 	"January": "Januari",
 	"join our Discord for help.": "join onze Discord voor hulp.",
 	"JSON": "JSON",
@@ -253,6 +258,7 @@
 	"Made by OpenWebUI Community": "Gemaakt door OpenWebUI Community",
 	"Make sure to enclose them with": "Zorg ervoor dat je ze omringt met",
 	"Manage LiteLLM Models": "Beheer LiteLLM Modellen",
+	"Manage Model Information": "",
 	"Manage Models": "Beheer Modellen",
 	"Manage Ollama Models": "Beheer Ollama Modellen",
 	"March": "Maart",
@@ -272,7 +278,12 @@
 	"Model '{{modelTag}}' is already in queue for downloading.": "Model '{{modelTag}}' staat al in de wachtrij voor downloaden.",
 	"Model {{modelId}} not found": "Model {{modelId}} niet gevonden",
 	"Model {{modelName}} already exists.": "Model {{modelName}} bestaat al.",
+	"Model {{modelName}} is not vision capable": "",
+	"Model Description": "",
+	"Model Display Name": "",
 	"Model filesystem path detected. Model shortname is required for update, cannot continue.": "Model filesystem path gedetecteerd. Model shortname is vereist voor update, kan niet doorgaan.",
+	"Model info for {{modelName}} added successfully": "",
+	"Model info for {{modelName}} deleted successfully": "",
 	"Model Name": "Model Naam",
 	"Model not selected": "Model niet geselecteerd",
 	"Model Tag Name": "Model Tag Naam",
@@ -289,6 +300,7 @@
 	"Name your modelfile": "Benoem je modelfile",
 	"New Chat": "Nieuwe Chat",
 	"New Password": "Nieuw Wachtwoord",
+	"No": "",
 	"No results found": "Geen resultaten gevonden",
 	"No source available": "Geen bron beschikbaar",
 	"Not factually correct": "Feitelijk niet juist",
@@ -385,6 +397,7 @@
 	"Select a model": "Selecteer een model",
 	"Select an Ollama instance": "Selecteer een Ollama instantie",
 	"Select model": "Selecteer een model",
+	"Selected models do not support image inputs": "",
 	"Send": "Verzenden",
 	"Send a Message": "Stuur een Bericht",
 	"Send message": "Stuur bericht",
@@ -492,6 +505,7 @@
 	"Workspace": "Werkruimte",
 	"Write a prompt suggestion (e.g. Who are you?)": "Schrijf een prompt suggestie (bijv. Wie ben je?)",
 	"Write a summary in 50 words that summarizes [topic or keyword].": "Schrijf een samenvatting in 50 woorden die [onderwerp of trefwoord] samenvat.",
+	"Yes": "",
 	"Yesterday": "gisteren",
 	"You": "U",
 	"You have no archived conversations.": "U heeft geen gearchiveerde gesprekken.",

+ 14 - 0
src/lib/i18n/locales/pa-IN/translation.json

@@ -6,6 +6,7 @@
 	"{{modelName}} is thinking...": "{{modelName}} ਸੋਚ ਰਿਹਾ ਹੈ...",
 	"{{user}}'s Chats": "{{user}} ਦੀਆਂ ਗੱਲਾਂ",
 	"{{webUIName}} Backend Required": "{{webUIName}} ਬੈਕਐਂਡ ਲੋੜੀਂਦਾ ਹੈ",
+	"A selected model does not support image input": "",
 	"a user": "ਇੱਕ ਉਪਭੋਗਤਾ",
 	"About": "ਬਾਰੇ",
 	"Account": "ਖਾਤਾ",
@@ -31,6 +32,7 @@
 	"Advanced Parameters": "ਉੱਚ ਸਤਰ ਦੇ ਪੈਰਾਮੀਟਰ",
 	"all": "ਸਾਰੇ",
 	"All Documents": "ਸਾਰੇ ਡਾਕੂਮੈਂਟ",
+	"All selected models do not support image input, removed images": "",
 	"All Users": "ਸਾਰੇ ਉਪਭੋਗਤਾ",
 	"Allow": "ਅਨੁਮਤੀ",
 	"Allow Chat Deletion": "ਗੱਲਬਾਤ ਮਿਟਾਉਣ ਦੀ ਆਗਿਆ ਦਿਓ",
@@ -115,6 +117,7 @@
 	"Created at": "ਤੇ ਬਣਾਇਆ ਗਿਆ",
 	"Created At": "ਤੇ ਬਣਾਇਆ ਗਿਆ",
 	"Current Model": "ਮੌਜੂਦਾ ਮਾਡਲ",
+	"Current Models": "",
 	"Current Password": "ਮੌਜੂਦਾ ਪਾਸਵਰਡ",
 	"Custom": "ਕਸਟਮ",
 	"Customize Ollama models for a specific purpose": "ਇੱਕ ਖਾਸ ਉਦੇਸ਼ ਲਈ ਓਲਾਮਾ ਮਾਡਲਾਂ ਨੂੰ ਕਸਟਮਾਈਜ਼ ਕਰੋ",
@@ -181,6 +184,7 @@
 	"Enter LiteLLM API RPM (litellm_params.rpm)": "LiteLLM API RPM (litellm_params.rpm) ਦਰਜ ਕਰੋ",
 	"Enter LiteLLM Model (litellm_params.model)": "LiteLLM ਮਾਡਲ (litellm_params.model) ਦਰਜ ਕਰੋ",
 	"Enter Max Tokens (litellm_params.max_tokens)": "ਅਧਿਕਤਮ ਟੋਕਨ ਦਰਜ ਕਰੋ (litellm_params.max_tokens)",
+	"Enter Model Display Name": "",
 	"Enter model tag (e.g. {{modelTag}})": "ਮਾਡਲ ਟੈਗ ਦਰਜ ਕਰੋ (ਉਦਾਹਰਣ ਲਈ {{modelTag}})",
 	"Enter Number of Steps (e.g. 50)": "ਕਦਮਾਂ ਦੀ ਗਿਣਤੀ ਦਰਜ ਕਰੋ (ਉਦਾਹਰਣ ਲਈ 50)",
 	"Enter Score": "ਸਕੋਰ ਦਰਜ ਕਰੋ",
@@ -235,6 +239,7 @@
 	"Input commands": "ਇਨਪੁਟ ਕਮਾਂਡਾਂ",
 	"Interface": "ਇੰਟਰਫੇਸ",
 	"Invalid Tag": "ਗਲਤ ਟੈਗ",
+	"Is Model Vision Capable": "",
 	"January": "ਜਨਵਰੀ",
 	"join our Discord for help.": "ਮਦਦ ਲਈ ਸਾਡੇ ਡਿਸਕੋਰਡ ਵਿੱਚ ਸ਼ਾਮਲ ਹੋਵੋ।",
 	"JSON": "JSON",
@@ -253,6 +258,7 @@
 	"Made by OpenWebUI Community": "ਓਪਨਵੈਬਯੂਆਈ ਕਮਿਊਨਿਟੀ ਦੁਆਰਾ ਬਣਾਇਆ ਗਿਆ",
 	"Make sure to enclose them with": "ਸੁਨਿਸ਼ਚਿਤ ਕਰੋ ਕਿ ਉਨ੍ਹਾਂ ਨੂੰ ਘੇਰੋ",
 	"Manage LiteLLM Models": "LiteLLM ਮਾਡਲਾਂ ਦਾ ਪ੍ਰਬੰਧਨ ਕਰੋ",
+	"Manage Model Information": "",
 	"Manage Models": "ਮਾਡਲਾਂ ਦਾ ਪ੍ਰਬੰਧਨ ਕਰੋ",
 	"Manage Ollama Models": "ਓਲਾਮਾ ਮਾਡਲਾਂ ਦਾ ਪ੍ਰਬੰਧਨ ਕਰੋ",
 	"March": "ਮਾਰਚ",
@@ -272,7 +278,12 @@
 	"Model '{{modelTag}}' is already in queue for downloading.": "ਮਾਡਲ '{{modelTag}}' ਪਹਿਲਾਂ ਹੀ ਡਾਊਨਲੋਡ ਲਈ ਕਤਾਰ ਵਿੱਚ ਹੈ।",
 	"Model {{modelId}} not found": "ਮਾਡਲ {{modelId}} ਨਹੀਂ ਮਿਲਿਆ",
 	"Model {{modelName}} already exists.": "ਮਾਡਲ {{modelName}} ਪਹਿਲਾਂ ਹੀ ਮੌਜੂਦ ਹੈ।",
+	"Model {{modelName}} is not vision capable": "",
+	"Model Description": "",
+	"Model Display Name": "",
 	"Model filesystem path detected. Model shortname is required for update, cannot continue.": "ਮਾਡਲ ਫਾਈਲਸਿਸਟਮ ਪੱਥ ਪਾਇਆ ਗਿਆ। ਅੱਪਡੇਟ ਲਈ ਮਾਡਲ ਸ਼ੌਰਟਨੇਮ ਦੀ ਲੋੜ ਹੈ, ਜਾਰੀ ਨਹੀਂ ਰੱਖ ਸਕਦੇ।",
+	"Model info for {{modelName}} added successfully": "",
+	"Model info for {{modelName}} deleted successfully": "",
 	"Model Name": "ਮਾਡਲ ਨਾਮ",
 	"Model not selected": "ਮਾਡਲ ਚੁਣਿਆ ਨਹੀਂ ਗਿਆ",
 	"Model Tag Name": "ਮਾਡਲ ਟੈਗ ਨਾਮ",
@@ -289,6 +300,7 @@
 	"Name your modelfile": "ਆਪਣੀ ਮਾਡਲਫਾਈਲ ਦਾ ਨਾਮ ਰੱਖੋ",
 	"New Chat": "ਨਵੀਂ ਗੱਲਬਾਤ",
 	"New Password": "ਨਵਾਂ ਪਾਸਵਰਡ",
+	"No": "",
 	"No results found": "ਕੋਈ ਨਤੀਜੇ ਨਹੀਂ ਮਿਲੇ",
 	"No source available": "ਕੋਈ ਸਰੋਤ ਉਪਲਬਧ ਨਹੀਂ",
 	"Not factually correct": "ਤੱਥਕ ਰੂਪ ਵਿੱਚ ਸਹੀ ਨਹੀਂ",
@@ -385,6 +397,7 @@
 	"Select a model": "ਇੱਕ ਮਾਡਲ ਚੁਣੋ",
 	"Select an Ollama instance": "ਇੱਕ ਓਲਾਮਾ ਇੰਸਟੈਂਸ ਚੁਣੋ",
 	"Select model": "ਮਾਡਲ ਚੁਣੋ",
+	"Selected models do not support image inputs": "",
 	"Send": "ਭੇਜੋ",
 	"Send a Message": "ਇੱਕ ਸੁਨੇਹਾ ਭੇਜੋ",
 	"Send message": "ਸੁਨੇਹਾ ਭੇਜੋ",
@@ -492,6 +505,7 @@
 	"Workspace": "ਕਾਰਜਸਥਲ",
 	"Write a prompt suggestion (e.g. Who are you?)": "ਇੱਕ ਪ੍ਰੰਪਟ ਸੁਝਾਅ ਲਿਖੋ (ਉਦਾਹਰਣ ਲਈ ਤੁਸੀਂ ਕੌਣ ਹੋ?)",
 	"Write a summary in 50 words that summarizes [topic or keyword].": "50 ਸ਼ਬਦਾਂ ਵਿੱਚ ਇੱਕ ਸੰਖੇਪ ਲਿਖੋ ਜੋ [ਵਿਸ਼ਾ ਜਾਂ ਕੁੰਜੀ ਸ਼ਬਦ] ਨੂੰ ਸੰਖੇਪ ਕਰਦਾ ਹੈ।",
+	"Yes": "",
 	"Yesterday": "ਕੱਲ੍ਹ",
 	"You": "ਤੁਸੀਂ",
 	"You have no archived conversations.": "ਤੁਹਾਡੇ ਕੋਲ ਕੋਈ ਆਰਕਾਈਵ ਕੀਤੀਆਂ ਗੱਲਾਂ ਨਹੀਂ ਹਨ।",

+ 14 - 0
src/lib/i18n/locales/pl-PL/translation.json

@@ -6,6 +6,7 @@
 	"{{modelName}} is thinking...": "{{modelName}} myśli...",
 	"{{user}}'s Chats": "{{user}} - czaty",
 	"{{webUIName}} Backend Required": "Backend {{webUIName}} wymagane",
+	"A selected model does not support image input": "",
 	"a user": "użytkownik",
 	"About": "O nas",
 	"Account": "Konto",
@@ -31,6 +32,7 @@
 	"Advanced Parameters": "Zaawansowane parametry",
 	"all": "wszyscy",
 	"All Documents": "Wszystkie dokumenty",
+	"All selected models do not support image input, removed images": "",
 	"All Users": "Wszyscy użytkownicy",
 	"Allow": "Pozwól",
 	"Allow Chat Deletion": "Pozwól na usuwanie czatu",
@@ -115,6 +117,7 @@
 	"Created at": "Utworzono o",
 	"Created At": "Utworzono o",
 	"Current Model": "Bieżący model",
+	"Current Models": "",
 	"Current Password": "Bieżące hasło",
 	"Custom": "Niestandardowy",
 	"Customize Ollama models for a specific purpose": "Dostosuj modele Ollama do określonego celu",
@@ -181,6 +184,7 @@
 	"Enter LiteLLM API RPM (litellm_params.rpm)": "Wprowadź API LiteLLM RPM(litellm_params.rpm)",
 	"Enter LiteLLM Model (litellm_params.model)": "Wprowadź model LiteLLM (litellm_params.model)",
 	"Enter Max Tokens (litellm_params.max_tokens)": "Wprowadź maksymalną liczbę tokenów (litellm_params.max_tokens)",
+	"Enter Model Display Name": "",
 	"Enter model tag (e.g. {{modelTag}})": "Wprowadź tag modelu (np. {{modelTag}})",
 	"Enter Number of Steps (e.g. 50)": "Wprowadź liczbę kroków (np. 50)",
 	"Enter Score": "Wprowadź wynik",
@@ -235,6 +239,7 @@
 	"Input commands": "Wprowadź komendy",
 	"Interface": "Interfejs",
 	"Invalid Tag": "Nieprawidłowy tag",
+	"Is Model Vision Capable": "",
 	"January": "Styczeń",
 	"join our Discord for help.": "Dołącz do naszego Discorda po pomoc.",
 	"JSON": "JSON",
@@ -253,6 +258,7 @@
 	"Made by OpenWebUI Community": "Stworzone przez społeczność OpenWebUI",
 	"Make sure to enclose them with": "Upewnij się, że są one zamknięte w",
 	"Manage LiteLLM Models": "Zarządzaj modelami LiteLLM",
+	"Manage Model Information": "",
 	"Manage Models": "Zarządzaj modelami",
 	"Manage Ollama Models": "Zarządzaj modelami Ollama",
 	"March": "Marzec",
@@ -272,7 +278,12 @@
 	"Model '{{modelTag}}' is already in queue for downloading.": "Model '{{modelTag}}' jest już w kolejce do pobrania.",
 	"Model {{modelId}} not found": "Model {{modelId}} nie został znaleziony",
 	"Model {{modelName}} already exists.": "Model {{modelName}} już istnieje.",
+	"Model {{modelName}} is not vision capable": "",
+	"Model Description": "",
+	"Model Display Name": "",
 	"Model filesystem path detected. Model shortname is required for update, cannot continue.": "Wykryto ścieżkę systemu plików modelu. Wymagana jest krótka nazwa modelu do aktualizacji, nie można kontynuować.",
+	"Model info for {{modelName}} added successfully": "",
+	"Model info for {{modelName}} deleted successfully": "",
 	"Model Name": "Nazwa modelu",
 	"Model not selected": "Model nie został wybrany",
 	"Model Tag Name": "Nazwa tagu modelu",
@@ -289,6 +300,7 @@
 	"Name your modelfile": "Nadaj nazwę swojemu plikowi modelu",
 	"New Chat": "Nowy czat",
 	"New Password": "Nowe hasło",
+	"No": "",
 	"No results found": "Nie znaleziono rezultatów",
 	"No source available": "Źródło nie dostępne",
 	"Not factually correct": "Nie zgodne z faktami",
@@ -385,6 +397,7 @@
 	"Select a model": "Wybierz model",
 	"Select an Ollama instance": "Wybierz instancję Ollama",
 	"Select model": "Wybierz model",
+	"Selected models do not support image inputs": "",
 	"Send": "Wyślij",
 	"Send a Message": "Wyślij Wiadomość",
 	"Send message": "Wyślij wiadomość",
@@ -492,6 +505,7 @@
 	"Workspace": "Obszar roboczy",
 	"Write a prompt suggestion (e.g. Who are you?)": "Napisz sugestię do polecenia (np. Kim jesteś?)",
 	"Write a summary in 50 words that summarizes [topic or keyword].": "Napisz podsumowanie w 50 słowach, które podsumowuje [temat lub słowo kluczowe].",
+	"Yes": "",
 	"Yesterday": "Wczoraj",
 	"You": "Ty",
 	"You have no archived conversations.": "Nie masz zarchiwizowanych rozmów.",

+ 14 - 0
src/lib/i18n/locales/pt-BR/translation.json

@@ -6,6 +6,7 @@
 	"{{modelName}} is thinking...": "{{modelName}} está pensando...",
 	"{{user}}'s Chats": "{{user}}'s Chats",
 	"{{webUIName}} Backend Required": "{{webUIName}} Backend Necessário",
+	"A selected model does not support image input": "",
 	"a user": "um usuário",
 	"About": "Sobre",
 	"Account": "Conta",
@@ -31,6 +32,7 @@
 	"Advanced Parameters": "Parâmetros Avançados",
 	"all": "todos",
 	"All Documents": "Todos os Documentos",
+	"All selected models do not support image input, removed images": "",
 	"All Users": "Todos os Usuários",
 	"Allow": "Permitir",
 	"Allow Chat Deletion": "Permitir Exclusão de Bate-papo",
@@ -115,6 +117,7 @@
 	"Created at": "Criado em",
 	"Created At": "Criado em",
 	"Current Model": "Modelo Atual",
+	"Current Models": "",
 	"Current Password": "Senha Atual",
 	"Custom": "Personalizado",
 	"Customize Ollama models for a specific purpose": "Personalize os modelos Ollama para um propósito específico",
@@ -181,6 +184,7 @@
 	"Enter LiteLLM API RPM (litellm_params.rpm)": "Digite o RPM da API LiteLLM (litellm_params.rpm)",
 	"Enter LiteLLM Model (litellm_params.model)": "Digite o Modelo LiteLLM (litellm_params.model)",
 	"Enter Max Tokens (litellm_params.max_tokens)": "Digite o Máximo de Tokens (litellm_params.max_tokens)",
+	"Enter Model Display Name": "",
 	"Enter model tag (e.g. {{modelTag}})": "Digite a tag do modelo (por exemplo, {{modelTag}})",
 	"Enter Number of Steps (e.g. 50)": "Digite o Número de Etapas (por exemplo, 50)",
 	"Enter Score": "Digite a Pontuação",
@@ -235,6 +239,7 @@
 	"Input commands": "Comandos de entrada",
 	"Interface": "Interface",
 	"Invalid Tag": "Etiqueta Inválida",
+	"Is Model Vision Capable": "",
 	"January": "Janeiro",
 	"join our Discord for help.": "junte-se ao nosso Discord para obter ajuda.",
 	"JSON": "JSON",
@@ -253,6 +258,7 @@
 	"Made by OpenWebUI Community": "Feito pela Comunidade OpenWebUI",
 	"Make sure to enclose them with": "Certifique-se de colocá-los entre",
 	"Manage LiteLLM Models": "Gerenciar Modelos LiteLLM",
+	"Manage Model Information": "",
 	"Manage Models": "Gerenciar Modelos",
 	"Manage Ollama Models": "Gerenciar Modelos Ollama",
 	"March": "Março",
@@ -272,7 +278,12 @@
 	"Model '{{modelTag}}' is already in queue for downloading.": "O modelo '{{modelTag}}' já está na fila para download.",
 	"Model {{modelId}} not found": "Modelo {{modelId}} não encontrado",
 	"Model {{modelName}} already exists.": "O modelo {{modelName}} já existe.",
+	"Model {{modelName}} is not vision capable": "",
+	"Model Description": "",
+	"Model Display Name": "",
 	"Model filesystem path detected. Model shortname is required for update, cannot continue.": "Otkrivena putanja datoteke modela. Skraćeno ime modela je potrebno za ažuriranje, ne može se nastaviti.",
+	"Model info for {{modelName}} added successfully": "",
+	"Model info for {{modelName}} deleted successfully": "",
 	"Model Name": "Nome do Modelo",
 	"Model not selected": "Modelo não selecionado",
 	"Model Tag Name": "Nome da Tag do Modelo",
@@ -289,6 +300,7 @@
 	"Name your modelfile": "Nomeie seu arquivo de modelo",
 	"New Chat": "Novo Bate-papo",
 	"New Password": "Nova Senha",
+	"No": "",
 	"No results found": "Nenhum resultado encontrado",
 	"No source available": "Nenhuma fonte disponível",
 	"Not factually correct": "Não é correto em termos factuais",
@@ -385,6 +397,7 @@
 	"Select a model": "Selecione um modelo",
 	"Select an Ollama instance": "Selecione uma instância Ollama",
 	"Select model": "Selecione um modelo",
+	"Selected models do not support image inputs": "",
 	"Send": "Enviar",
 	"Send a Message": "Enviar uma Mensagem",
 	"Send message": "Enviar mensagem",
@@ -492,6 +505,7 @@
 	"Workspace": "Espaço de trabalho",
 	"Write a prompt suggestion (e.g. Who are you?)": "Escreva uma sugestão de prompt (por exemplo, Quem é você?)",
 	"Write a summary in 50 words that summarizes [topic or keyword].": "Escreva um resumo em 50 palavras que resuma [tópico ou palavra-chave].",
+	"Yes": "",
 	"Yesterday": "Ontem",
 	"You": "Você",
 	"You have no archived conversations.": "Você não tem conversas arquivadas.",

+ 14 - 0
src/lib/i18n/locales/pt-PT/translation.json

@@ -6,6 +6,7 @@
 	"{{modelName}} is thinking...": "{{modelName}} está pensando...",
 	"{{user}}'s Chats": "{{user}}'s Chats",
 	"{{webUIName}} Backend Required": "{{webUIName}} Backend Necessário",
+	"A selected model does not support image input": "",
 	"a user": "um usuário",
 	"About": "Sobre",
 	"Account": "Conta",
@@ -31,6 +32,7 @@
 	"Advanced Parameters": "Parâmetros Avançados",
 	"all": "todos",
 	"All Documents": "Todos os Documentos",
+	"All selected models do not support image input, removed images": "",
 	"All Users": "Todos os Usuários",
 	"Allow": "Permitir",
 	"Allow Chat Deletion": "Permitir Exclusão de Bate-papo",
@@ -115,6 +117,7 @@
 	"Created at": "Criado em",
 	"Created At": "Criado em",
 	"Current Model": "Modelo Atual",
+	"Current Models": "",
 	"Current Password": "Senha Atual",
 	"Custom": "Personalizado",
 	"Customize Ollama models for a specific purpose": "Personalize os modelos Ollama para um propósito específico",
@@ -181,6 +184,7 @@
 	"Enter LiteLLM API RPM (litellm_params.rpm)": "Digite o RPM da API LiteLLM (litellm_params.rpm)",
 	"Enter LiteLLM Model (litellm_params.model)": "Digite o Modelo LiteLLM (litellm_params.model)",
 	"Enter Max Tokens (litellm_params.max_tokens)": "Digite o Máximo de Tokens (litellm_params.max_tokens)",
+	"Enter Model Display Name": "",
 	"Enter model tag (e.g. {{modelTag}})": "Digite a tag do modelo (por exemplo, {{modelTag}})",
 	"Enter Number of Steps (e.g. 50)": "Digite o Número de Etapas (por exemplo, 50)",
 	"Enter Score": "Digite a Pontuação",
@@ -235,6 +239,7 @@
 	"Input commands": "Comandos de entrada",
 	"Interface": "Interface",
 	"Invalid Tag": "Etiqueta Inválida",
+	"Is Model Vision Capable": "",
 	"January": "Janeiro",
 	"join our Discord for help.": "junte-se ao nosso Discord para obter ajuda.",
 	"JSON": "JSON",
@@ -253,6 +258,7 @@
 	"Made by OpenWebUI Community": "Feito pela Comunidade OpenWebUI",
 	"Make sure to enclose them with": "Certifique-se de colocá-los entre",
 	"Manage LiteLLM Models": "Gerenciar Modelos LiteLLM",
+	"Manage Model Information": "",
 	"Manage Models": "Gerenciar Modelos",
 	"Manage Ollama Models": "Gerenciar Modelos Ollama",
 	"March": "Março",
@@ -272,7 +278,12 @@
 	"Model '{{modelTag}}' is already in queue for downloading.": "O modelo '{{modelTag}}' já está na fila para download.",
 	"Model {{modelId}} not found": "Modelo {{modelId}} não encontrado",
 	"Model {{modelName}} already exists.": "O modelo {{modelName}} já existe.",
+	"Model {{modelName}} is not vision capable": "",
+	"Model Description": "",
+	"Model Display Name": "",
 	"Model filesystem path detected. Model shortname is required for update, cannot continue.": "Caminho do sistema de arquivos do modelo detectado. É necessário o nome curto do modelo para atualização, não é possível continuar.",
+	"Model info for {{modelName}} added successfully": "",
+	"Model info for {{modelName}} deleted successfully": "",
 	"Model Name": "Nome do Modelo",
 	"Model not selected": "Modelo não selecionado",
 	"Model Tag Name": "Nome da Tag do Modelo",
@@ -289,6 +300,7 @@
 	"Name your modelfile": "Nomeie seu arquivo de modelo",
 	"New Chat": "Novo Bate-papo",
 	"New Password": "Nova Senha",
+	"No": "",
 	"No results found": "Nenhum resultado encontrado",
 	"No source available": "Nenhuma fonte disponível",
 	"Not factually correct": "Não é correto em termos factuais",
@@ -385,6 +397,7 @@
 	"Select a model": "Selecione um modelo",
 	"Select an Ollama instance": "Selecione uma instância Ollama",
 	"Select model": "Selecione um modelo",
+	"Selected models do not support image inputs": "",
 	"Send": "Enviar",
 	"Send a Message": "Enviar uma Mensagem",
 	"Send message": "Enviar mensagem",
@@ -492,6 +505,7 @@
 	"Workspace": "Espaço de Trabalho",
 	"Write a prompt suggestion (e.g. Who are you?)": "Escreva uma sugestão de prompt (por exemplo, Quem é você?)",
 	"Write a summary in 50 words that summarizes [topic or keyword].": "Escreva um resumo em 50 palavras que resuma [tópico ou palavra-chave].",
+	"Yes": "",
 	"Yesterday": "Ontem",
 	"You": "Você",
 	"You have no archived conversations.": "Você não tem bate-papos arquivados.",

+ 14 - 0
src/lib/i18n/locales/ru-RU/translation.json

@@ -6,6 +6,7 @@
 	"{{modelName}} is thinking...": "{{modelName}} думает...",
 	"{{user}}'s Chats": "{{user}} чаты",
 	"{{webUIName}} Backend Required": "{{webUIName}} бэкенд требуемый",
+	"A selected model does not support image input": "",
 	"a user": "пользователь",
 	"About": "Об",
 	"Account": "Аккаунт",
@@ -31,6 +32,7 @@
 	"Advanced Parameters": "Расширенные Параметры",
 	"all": "всё",
 	"All Documents": "Все документы",
+	"All selected models do not support image input, removed images": "",
 	"All Users": "Все пользователи",
 	"Allow": "Разрешить",
 	"Allow Chat Deletion": "Дозволять удаление чат",
@@ -115,6 +117,7 @@
 	"Created at": "Создано в",
 	"Created At": "Создано в",
 	"Current Model": "Текущая модель",
+	"Current Models": "",
 	"Current Password": "Текущий пароль",
 	"Custom": "Пользовательский",
 	"Customize Ollama models for a specific purpose": "Настроить модели Ollama для конкретной цели",
@@ -181,6 +184,7 @@
 	"Enter LiteLLM API RPM (litellm_params.rpm)": "Введите RPM API LiteLLM (litellm_params.rpm)",
 	"Enter LiteLLM Model (litellm_params.model)": "Введите модель LiteLLM (litellm_params.model)",
 	"Enter Max Tokens (litellm_params.max_tokens)": "Введите максимальное количество токенов (litellm_params.max_tokens)",
+	"Enter Model Display Name": "",
 	"Enter model tag (e.g. {{modelTag}})": "Введите тег модели (например, {{modelTag}})",
 	"Enter Number of Steps (e.g. 50)": "Введите количество шагов (например, 50)",
 	"Enter Score": "Введите оценку",
@@ -235,6 +239,7 @@
 	"Input commands": "Введите команды",
 	"Interface": "Интерфейс",
 	"Invalid Tag": "Недопустимый тег",
+	"Is Model Vision Capable": "",
 	"January": "Январь",
 	"join our Discord for help.": "присоединяйтесь к нашему Discord для помощи.",
 	"JSON": "JSON",
@@ -253,6 +258,7 @@
 	"Made by OpenWebUI Community": "Сделано сообществом OpenWebUI",
 	"Make sure to enclose them with": "Убедитесь, что они заключены в",
 	"Manage LiteLLM Models": "Управление моделями LiteLLM",
+	"Manage Model Information": "",
 	"Manage Models": "Управление моделями",
 	"Manage Ollama Models": "Управление моделями Ollama",
 	"March": "Март",
@@ -272,7 +278,12 @@
 	"Model '{{modelTag}}' is already in queue for downloading.": "Модель '{{modelTag}}' уже находится в очереди на загрузку.",
 	"Model {{modelId}} not found": "Модель {{modelId}} не найдена",
 	"Model {{modelName}} already exists.": "Модель {{modelName}} уже существует.",
+	"Model {{modelName}} is not vision capable": "",
+	"Model Description": "",
+	"Model Display Name": "",
 	"Model filesystem path detected. Model shortname is required for update, cannot continue.": "Модель файловой системы обнаружена. Требуется имя тега модели для обновления, не удается продолжить.",
+	"Model info for {{modelName}} added successfully": "",
+	"Model info for {{modelName}} deleted successfully": "",
 	"Model Name": "Имя модели",
 	"Model not selected": "Модель не выбрана",
 	"Model Tag Name": "Имя тега модели",
@@ -289,6 +300,7 @@
 	"Name your modelfile": "Назовите свой файл модели",
 	"New Chat": "Новый чат",
 	"New Password": "Новый пароль",
+	"No": "",
 	"No results found": "Результатов не найдено",
 	"No source available": "Нет доступных источников",
 	"Not factually correct": "Не фактически правильно",
@@ -385,6 +397,7 @@
 	"Select a model": "Выберите модель",
 	"Select an Ollama instance": "Выберите экземпляр Ollama",
 	"Select model": "Выберите модель",
+	"Selected models do not support image inputs": "",
 	"Send": "Отправить",
 	"Send a Message": "Отправить сообщение",
 	"Send message": "Отправить сообщение",
@@ -492,6 +505,7 @@
 	"Workspace": "Рабочая область",
 	"Write a prompt suggestion (e.g. Who are you?)": "Напишите предложение промпта (например, Кто вы?)",
 	"Write a summary in 50 words that summarizes [topic or keyword].": "Напишите резюме в 50 словах, которое кратко описывает [тему или ключевое слово].",
+	"Yes": "",
 	"Yesterday": "Вчера",
 	"You": "Вы",
 	"You have no archived conversations.": "У вас нет архивированных бесед.",

+ 14 - 0
src/lib/i18n/locales/sr-RS/translation.json

@@ -6,6 +6,7 @@
 	"{{modelName}} is thinking...": "{{modelName}} размишља...",
 	"{{user}}'s Chats": "Ћаскања корисника {{user}}",
 	"{{webUIName}} Backend Required": "Захтева се {{webUIName}} позадинац",
+	"A selected model does not support image input": "",
 	"a user": "корисник",
 	"About": "О нама",
 	"Account": "Налог",
@@ -31,6 +32,7 @@
 	"Advanced Parameters": "Напредни параметри",
 	"all": "сви",
 	"All Documents": "Сви документи",
+	"All selected models do not support image input, removed images": "",
 	"All Users": "Сви корисници",
 	"Allow": "Дозволи",
 	"Allow Chat Deletion": "Дозволи брисање ћаскања",
@@ -115,6 +117,7 @@
 	"Created at": "Направљено у",
 	"Created At": "Направљено у",
 	"Current Model": "Тренутни модел",
+	"Current Models": "",
 	"Current Password": "Тренутна лозинка",
 	"Custom": "Прилагођено",
 	"Customize Ollama models for a specific purpose": "Прилагоди Ollama моделе за специфичну намену",
@@ -181,6 +184,7 @@
 	"Enter LiteLLM API RPM (litellm_params.rpm)": "Унесите LiteLLM API RPM (litellm_params.rpm)",
 	"Enter LiteLLM Model (litellm_params.model)": "Унесите LiteLLM модел (litellm_params.model)",
 	"Enter Max Tokens (litellm_params.max_tokens)": "Унесите највећи број жетона (litellm_params.max_tokens)",
+	"Enter Model Display Name": "",
 	"Enter model tag (e.g. {{modelTag}})": "Унесите ознаку модела (нпр. {{modelTag}})",
 	"Enter Number of Steps (e.g. 50)": "Унесите број корака (нпр. 50)",
 	"Enter Score": "Унесите резултат",
@@ -235,6 +239,7 @@
 	"Input commands": "Унеси наредбе",
 	"Interface": "Изглед",
 	"Invalid Tag": "Неисправна ознака",
+	"Is Model Vision Capable": "",
 	"January": "Јануар",
 	"join our Discord for help.": "придружите се нашем Дискорду за помоћ.",
 	"JSON": "JSON",
@@ -253,6 +258,7 @@
 	"Made by OpenWebUI Community": "Израдила OpenWebUI заједница",
 	"Make sure to enclose them with": "Уверите се да их затворите са",
 	"Manage LiteLLM Models": "Управљај LiteLLM моделима",
+	"Manage Model Information": "",
 	"Manage Models": "Управљај моделима",
 	"Manage Ollama Models": "Управљај Ollama моделима",
 	"March": "Март",
@@ -272,7 +278,12 @@
 	"Model '{{modelTag}}' is already in queue for downloading.": "Модел „{{modelTag}}“ је већ у реду за преузимање.",
 	"Model {{modelId}} not found": "Модел {{modelId}} није пронађен",
 	"Model {{modelName}} already exists.": "Модел {{modelName}} већ постоји.",
+	"Model {{modelName}} is not vision capable": "",
+	"Model Description": "",
+	"Model Display Name": "",
 	"Model filesystem path detected. Model shortname is required for update, cannot continue.": "Откривена путања система датотека модела. За ажурирање је потребан кратак назив модела, не може се наставити.",
+	"Model info for {{modelName}} added successfully": "",
+	"Model info for {{modelName}} deleted successfully": "",
 	"Model Name": "Назив модела",
 	"Model not selected": "Модел није изабран",
 	"Model Tag Name": "Назив ознаке модела",
@@ -289,6 +300,7 @@
 	"Name your modelfile": "Назовите вашу модел-датотеку",
 	"New Chat": "Ново ћаскање",
 	"New Password": "Нова лозинка",
+	"No": "",
 	"No results found": "Нема резултата",
 	"No source available": "Нема доступног извора",
 	"Not factually correct": "Није чињенично тачно",
@@ -385,6 +397,7 @@
 	"Select a model": "Изабери модел",
 	"Select an Ollama instance": "Изабери Ollama инстанцу",
 	"Select model": "Изабери модел",
+	"Selected models do not support image inputs": "",
 	"Send": "Пошаљи",
 	"Send a Message": "Пошаљи поруку",
 	"Send message": "Пошаљи поруку",
@@ -492,6 +505,7 @@
 	"Workspace": "Радни простор",
 	"Write a prompt suggestion (e.g. Who are you?)": "Напишите предлог упита (нпр. „ко си ти?“)",
 	"Write a summary in 50 words that summarizes [topic or keyword].": "Напишите сажетак у 50 речи који резимира [тему или кључну реч].",
+	"Yes": "",
 	"Yesterday": "Јуче",
 	"You": "Ти",
 	"You have no archived conversations.": "Немате архивиране разговоре.",

+ 14 - 0
src/lib/i18n/locales/sv-SE/translation.json

@@ -6,6 +6,7 @@
 	"{{modelName}} is thinking...": "{{modelName}} tänker...",
 	"{{user}}'s Chats": "{{user}}s Chats",
 	"{{webUIName}} Backend Required": "{{webUIName}} Backend krävs",
+	"A selected model does not support image input": "",
 	"a user": "en användare",
 	"About": "Om",
 	"Account": "Konto",
@@ -31,6 +32,7 @@
 	"Advanced Parameters": "Avancerade parametrar",
 	"all": "alla",
 	"All Documents": "Alla dokument",
+	"All selected models do not support image input, removed images": "",
 	"All Users": "Alla användare",
 	"Allow": "Tillåt",
 	"Allow Chat Deletion": "Tillåt chattborttagning",
@@ -115,6 +117,7 @@
 	"Created at": "Skapad",
 	"Created At": "Skapad",
 	"Current Model": "Aktuell modell",
+	"Current Models": "",
 	"Current Password": "Nuvarande lösenord",
 	"Custom": "Anpassad",
 	"Customize Ollama models for a specific purpose": "Anpassa Ollama-modeller för ett specifikt ändamål",
@@ -181,6 +184,7 @@
 	"Enter LiteLLM API RPM (litellm_params.rpm)": "Ange LiteLLM API RPM (litellm_params.rpm)",
 	"Enter LiteLLM Model (litellm_params.model)": "Ange LiteLLM-modell (litellm_params.model)",
 	"Enter Max Tokens (litellm_params.max_tokens)": "Ange max antal tokens (litellm_params.max_tokens)",
+	"Enter Model Display Name": "",
 	"Enter model tag (e.g. {{modelTag}})": "Ange modelltagg (t.ex. {{modelTag}})",
 	"Enter Number of Steps (e.g. 50)": "Ange antal steg (t.ex. 50)",
 	"Enter Score": "Ange poäng",
@@ -235,6 +239,7 @@
 	"Input commands": "Indatakommandon",
 	"Interface": "Gränssnitt",
 	"Invalid Tag": "Ogiltig tagg",
+	"Is Model Vision Capable": "",
 	"January": "januar",
 	"join our Discord for help.": "gå med i vår Discord för hjälp.",
 	"JSON": "JSON",
@@ -253,6 +258,7 @@
 	"Made by OpenWebUI Community": "Skapad av OpenWebUI Community",
 	"Make sure to enclose them with": "Se till att bifoga dem med",
 	"Manage LiteLLM Models": "Hantera LiteLLM-modeller",
+	"Manage Model Information": "",
 	"Manage Models": "Hantera modeller",
 	"Manage Ollama Models": "Hantera Ollama-modeller",
 	"March": "mars",
@@ -272,7 +278,12 @@
 	"Model '{{modelTag}}' is already in queue for downloading.": "Modellen '{{modelTag}}' är redan i kö för nedladdning.",
 	"Model {{modelId}} not found": "Modell {{modelId}} hittades inte",
 	"Model {{modelName}} already exists.": "Modellen {{modelName}} finns redan.",
+	"Model {{modelName}} is not vision capable": "",
+	"Model Description": "",
+	"Model Display Name": "",
 	"Model filesystem path detected. Model shortname is required for update, cannot continue.": "Modellens filsystemväg upptäckt. Modellens kortnamn krävs för uppdatering, kan inte fortsätta.",
+	"Model info for {{modelName}} added successfully": "",
+	"Model info for {{modelName}} deleted successfully": "",
 	"Model Name": "Modellnamn",
 	"Model not selected": "Modell inte vald",
 	"Model Tag Name": "Modelltaggnamn",
@@ -289,6 +300,7 @@
 	"Name your modelfile": "Namnge din modelfil",
 	"New Chat": "Ny chatt",
 	"New Password": "Nytt lösenord",
+	"No": "",
 	"No results found": "Inga resultat hittades",
 	"No source available": "Ingen tilgjengelig kilde",
 	"Not factually correct": "Inte faktiskt korrekt",
@@ -385,6 +397,7 @@
 	"Select a model": "Välj en modell",
 	"Select an Ollama instance": "Välj en Ollama-instans",
 	"Select model": "Välj en modell",
+	"Selected models do not support image inputs": "",
 	"Send": "Skicka",
 	"Send a Message": "Skicka ett meddelande",
 	"Send message": "Skicka meddelande",
@@ -492,6 +505,7 @@
 	"Workspace": "arbetsyta",
 	"Write a prompt suggestion (e.g. Who are you?)": "Skriv ett förslag (t.ex. Vem är du?)",
 	"Write a summary in 50 words that summarizes [topic or keyword].": "Skriv en sammanfattning på 50 ord som sammanfattar [ämne eller nyckelord].",
+	"Yes": "",
 	"Yesterday": "Igenom",
 	"You": "du",
 	"You have no archived conversations.": "Du har inga arkiverade konversationer.",

+ 14 - 0
src/lib/i18n/locales/tr-TR/translation.json

@@ -6,6 +6,7 @@
 	"{{modelName}} is thinking...": "{{modelName}} düşünüyor...",
 	"{{user}}'s Chats": "{{user}} Sohbetleri",
 	"{{webUIName}} Backend Required": "{{webUIName}} Arkayüz Gerekli",
+	"A selected model does not support image input": "",
 	"a user": "bir kullanıcı",
 	"About": "Hakkında",
 	"Account": "Hesap",
@@ -31,6 +32,7 @@
 	"Advanced Parameters": "Gelişmiş Parametreler",
 	"all": "tümü",
 	"All Documents": "Tüm Belgeler",
+	"All selected models do not support image input, removed images": "",
 	"All Users": "Tüm Kullanıcılar",
 	"Allow": "İzin ver",
 	"Allow Chat Deletion": "Sohbet Silmeye İzin Ver",
@@ -115,6 +117,7 @@
 	"Created at": "Oluşturulma tarihi",
 	"Created At": "Şu Tarihte Oluşturuldu:",
 	"Current Model": "Mevcut Model",
+	"Current Models": "",
 	"Current Password": "Mevcut Parola",
 	"Custom": "Özel",
 	"Customize Ollama models for a specific purpose": "Ollama modellerini belirli bir amaç için özelleştirin",
@@ -181,6 +184,7 @@
 	"Enter LiteLLM API RPM (litellm_params.rpm)": "LiteLLM API RPM'ini Girin (litellm_params.rpm)",
 	"Enter LiteLLM Model (litellm_params.model)": "LiteLLM Modelini Girin (litellm_params.model)",
 	"Enter Max Tokens (litellm_params.max_tokens)": "Maksimum Token Sayısını Girin (litellm_params.max_tokens)",
+	"Enter Model Display Name": "",
 	"Enter model tag (e.g. {{modelTag}})": "Model etiketini girin (örn. {{modelTag}})",
 	"Enter Number of Steps (e.g. 50)": "Adım Sayısını Girin (örn. 50)",
 	"Enter Score": "Skoru Girin",
@@ -235,6 +239,7 @@
 	"Input commands": "Giriş komutları",
 	"Interface": "Arayüz",
 	"Invalid Tag": "Geçersiz etiket",
+	"Is Model Vision Capable": "",
 	"January": "Ocak",
 	"join our Discord for help.": "yardım için Discord'umuza katılın.",
 	"JSON": "JSON",
@@ -253,6 +258,7 @@
 	"Made by OpenWebUI Community": "OpenWebUI Topluluğu tarafından yapılmıştır",
 	"Make sure to enclose them with": "Değişkenlerinizi şu şekilde biçimlendirin:",
 	"Manage LiteLLM Models": "LiteLLM Modellerini Yönet",
+	"Manage Model Information": "",
 	"Manage Models": "Modelleri Yönet",
 	"Manage Ollama Models": "Ollama Modellerini Yönet",
 	"March": "Mart",
@@ -272,7 +278,12 @@
 	"Model '{{modelTag}}' is already in queue for downloading.": "'{{modelTag}}' zaten indirme sırasında.",
 	"Model {{modelId}} not found": "{{modelId}} bulunamadı",
 	"Model {{modelName}} already exists.": "{{modelName}} zaten mevcut.",
+	"Model {{modelName}} is not vision capable": "",
+	"Model Description": "",
+	"Model Display Name": "",
 	"Model filesystem path detected. Model shortname is required for update, cannot continue.": "Model dosya sistemi yolu algılandı. Güncelleme için model kısa adı gerekli, devam edilemiyor.",
+	"Model info for {{modelName}} added successfully": "",
+	"Model info for {{modelName}} deleted successfully": "",
 	"Model Name": "Model Adı",
 	"Model not selected": "Model seçilmedi",
 	"Model Tag Name": "Model Etiket Adı",
@@ -289,6 +300,7 @@
 	"Name your modelfile": "Model dosyanıza ad verin",
 	"New Chat": "Yeni Sohbet",
 	"New Password": "Yeni Parola",
+	"No": "",
 	"No results found": "Sonuç bulunamadı",
 	"No source available": "Kaynak mevcut değil",
 	"Not factually correct": "Gerçeklere göre doğru değil",
@@ -385,6 +397,7 @@
 	"Select a model": "Bir model seç",
 	"Select an Ollama instance": "Bir Ollama örneği seçin",
 	"Select model": "Model seç",
+	"Selected models do not support image inputs": "",
 	"Send": "Gönder",
 	"Send a Message": "Bir Mesaj Gönder",
 	"Send message": "Mesaj gönder",
@@ -492,6 +505,7 @@
 	"Workspace": "Çalışma Alanı",
 	"Write a prompt suggestion (e.g. Who are you?)": "Bir prompt önerisi yazın (örn. Sen kimsin?)",
 	"Write a summary in 50 words that summarizes [topic or keyword].": "[Konuyu veya anahtar kelimeyi] özetleyen 50 kelimelik bir özet yazın.",
+	"Yes": "",
 	"Yesterday": "Dün",
 	"You": "Sen",
 	"You have no archived conversations.": "Arşivlenmiş sohbetleriniz yok.",

+ 14 - 0
src/lib/i18n/locales/uk-UA/translation.json

@@ -6,6 +6,7 @@
 	"{{modelName}} is thinking...": "{{modelName}} думає...",
 	"{{user}}'s Chats": "Чати {{user}}а",
 	"{{webUIName}} Backend Required": "Необхідно підключення бекенду {{webUIName}}",
+	"A selected model does not support image input": "",
 	"a user": "користувача",
 	"About": "Про програму",
 	"Account": "Обліковий запис",
@@ -31,6 +32,7 @@
 	"Advanced Parameters": "Розширені параметри",
 	"all": "всі",
 	"All Documents": "Усі документи",
+	"All selected models do not support image input, removed images": "",
 	"All Users": "Всі користувачі",
 	"Allow": "Дозволити",
 	"Allow Chat Deletion": "Дозволити видалення чату",
@@ -115,6 +117,7 @@
 	"Created at": "Створено у",
 	"Created At": "Створено у",
 	"Current Model": "Поточна модель",
+	"Current Models": "",
 	"Current Password": "Поточний пароль",
 	"Custom": "Налаштувати",
 	"Customize Ollama models for a specific purpose": "Налаштувати моделі Ollama для конкретної мети",
@@ -181,6 +184,7 @@
 	"Enter LiteLLM API RPM (litellm_params.rpm)": "Введіть RPM API LiteLLM (litellm_params.rpm)",
 	"Enter LiteLLM Model (litellm_params.model)": "Введіть модель LiteLLM (litellm_params.model)",
 	"Enter Max Tokens (litellm_params.max_tokens)": "Введіть максимальну кількість токенів (litellm_params.max_tokens)",
+	"Enter Model Display Name": "",
 	"Enter model tag (e.g. {{modelTag}})": "Введіть тег моделі (напр., {{modelTag}})",
 	"Enter Number of Steps (e.g. 50)": "Введіть кількість кроків (напр., 50)",
 	"Enter Score": "Введіть бал",
@@ -235,6 +239,7 @@
 	"Input commands": "Команди вводу",
 	"Interface": "Інтерфейс",
 	"Invalid Tag": "Недійсний тег",
+	"Is Model Vision Capable": "",
 	"January": "Січень",
 	"join our Discord for help.": "приєднуйтеся до нашого Discord для допомоги.",
 	"JSON": "JSON",
@@ -253,6 +258,7 @@
 	"Made by OpenWebUI Community": "Зроблено спільнотою OpenWebUI",
 	"Make sure to enclose them with": "Переконайтеся, що вони закриті",
 	"Manage LiteLLM Models": "Керування моделями LiteLLM",
+	"Manage Model Information": "",
 	"Manage Models": "Керування моделями",
 	"Manage Ollama Models": "Керування моделями Ollama",
 	"March": "Березень",
@@ -272,7 +278,12 @@
 	"Model '{{modelTag}}' is already in queue for downloading.": "Модель '{{modelTag}}' вже знаходиться в черзі на завантаження.",
 	"Model {{modelId}} not found": "Модель {{modelId}} не знайдено",
 	"Model {{modelName}} already exists.": "Модель {{modelName}} вже існує.",
+	"Model {{modelName}} is not vision capable": "",
+	"Model Description": "",
+	"Model Display Name": "",
 	"Model filesystem path detected. Model shortname is required for update, cannot continue.": "Виявлено шлях до файлової системи моделі. Для оновлення потрібно вказати коротке ім'я моделі, не вдасться продовжити.",
+	"Model info for {{modelName}} added successfully": "",
+	"Model info for {{modelName}} deleted successfully": "",
 	"Model Name": "Назва моделі",
 	"Model not selected": "Модель не вибрана",
 	"Model Tag Name": "Ім'я тегу моделі",
@@ -289,6 +300,7 @@
 	"Name your modelfile": "Назвіть свій файл моделі",
 	"New Chat": "Новий чат",
 	"New Password": "Новий пароль",
+	"No": "",
 	"No results found": "Не знайдено жодного результату",
 	"No source available": "Джерело не доступне",
 	"Not factually correct": "Не відповідає дійсності",
@@ -385,6 +397,7 @@
 	"Select a model": "Виберіть модель",
 	"Select an Ollama instance": "Виберіть екземпляр Ollama",
 	"Select model": "Вибрати модель",
+	"Selected models do not support image inputs": "",
 	"Send": "Надіслати",
 	"Send a Message": "Надіслати повідомлення",
 	"Send message": "Надіслати повідомлення",
@@ -492,6 +505,7 @@
 	"Workspace": "Робочий простір",
 	"Write a prompt suggestion (e.g. Who are you?)": "Напишіть промт (напр., Хто ти?)",
 	"Write a summary in 50 words that summarizes [topic or keyword].": "Напишіть стислий зміст у 50 слів, який узагальнює [тема або ключове слово].",
+	"Yes": "",
 	"Yesterday": "Вчора",
 	"You": "Ви",
 	"You have no archived conversations.": "У вас немає архівованих розмов.",

+ 14 - 0
src/lib/i18n/locales/vi-VN/translation.json

@@ -6,6 +6,7 @@
 	"{{modelName}} is thinking...": "{{modelName}} đang suy nghĩ...",
 	"{{user}}'s Chats": "{{user}}'s Chats",
 	"{{webUIName}} Backend Required": "{{webUIName}} Yêu cầu Backend",
+	"A selected model does not support image input": "",
 	"a user": "người sử dụng",
 	"About": "Giới thiệu",
 	"Account": "Tài khoản",
@@ -31,6 +32,7 @@
 	"Advanced Parameters": "Các tham số Nâng cao",
 	"all": "tất cả",
 	"All Documents": "Tất cả tài liệu",
+	"All selected models do not support image input, removed images": "",
 	"All Users": "Danh sách người sử dụng",
 	"Allow": "Cho phép",
 	"Allow Chat Deletion": "Cho phép Xóa nội dung chat",
@@ -115,6 +117,7 @@
 	"Created at": "Được tạo vào lúc",
 	"Created At": "Tạo lúc",
 	"Current Model": "Mô hình hiện tại",
+	"Current Models": "",
 	"Current Password": "Mật khẩu hiện tại",
 	"Custom": "Tùy chỉnh",
 	"Customize Ollama models for a specific purpose": "Tùy chỉnh các mô hình dựa trên Ollama cho một mục đích cụ thể",
@@ -181,6 +184,7 @@
 	"Enter LiteLLM API RPM (litellm_params.rpm)": "Nhập RPM API LiteLLM (litellm_params.rpm)",
 	"Enter LiteLLM Model (litellm_params.model)": "Nhập Mô hình LiteLLM (litellm_params.model)",
 	"Enter Max Tokens (litellm_params.max_tokens)": "Nhập Số Token Tối đa (litellm_params.max_tokens)",
+	"Enter Model Display Name": "",
 	"Enter model tag (e.g. {{modelTag}})": "Nhập thẻ mô hình (vd: {{modelTag}})",
 	"Enter Number of Steps (e.g. 50)": "Nhập số Steps (vd: 50)",
 	"Enter Score": "Nhập Score",
@@ -235,6 +239,7 @@
 	"Input commands": "Nhập các câu lệnh",
 	"Interface": "Giao diện",
 	"Invalid Tag": "Tag không hợp lệ",
+	"Is Model Vision Capable": "",
 	"January": "Tháng 1",
 	"join our Discord for help.": "tham gia Discord của chúng tôi để được trợ giúp.",
 	"JSON": "JSON",
@@ -253,6 +258,7 @@
 	"Made by OpenWebUI Community": "Được tạo bởi Cộng đồng OpenWebUI",
 	"Make sure to enclose them with": "Hãy chắc chắn bao quanh chúng bằng",
 	"Manage LiteLLM Models": "Quản lý mô hình với LiteLLM",
+	"Manage Model Information": "",
 	"Manage Models": "Quản lý mô hình",
 	"Manage Ollama Models": "Quản lý mô hình với Ollama",
 	"March": "Tháng 3",
@@ -272,7 +278,12 @@
 	"Model '{{modelTag}}' is already in queue for downloading.": "Mô hình '{{modelTag}}' đã có trong hàng đợi để tải xuống.",
 	"Model {{modelId}} not found": "Không tìm thấy Mô hình {{modelId}}",
 	"Model {{modelName}} already exists.": "Mô hình {{modelName}} đã tồn tại.",
+	"Model {{modelName}} is not vision capable": "",
+	"Model Description": "",
+	"Model Display Name": "",
 	"Model filesystem path detected. Model shortname is required for update, cannot continue.": "Đường dẫn hệ thống tệp mô hình được phát hiện. Tên viết tắt mô hình là bắt buộc để cập nhật, không thể tiếp tục.",
+	"Model info for {{modelName}} added successfully": "",
+	"Model info for {{modelName}} deleted successfully": "",
 	"Model Name": "Tên Mô hình",
 	"Model not selected": "Chưa chọn Mô hình",
 	"Model Tag Name": "Tên thẻ Mô hình",
@@ -289,6 +300,7 @@
 	"Name your modelfile": "Đặt tên cho tệp mô hình của bạn",
 	"New Chat": "Tạo cuộc trò chuyện mới",
 	"New Password": "Mật khẩu mới",
+	"No": "",
 	"No results found": "Không tìm thấy kết quả",
 	"No source available": "Không có nguồn",
 	"Not factually correct": "Không chính xác so với thực tế",
@@ -385,6 +397,7 @@
 	"Select a model": "Chọn mô hình",
 	"Select an Ollama instance": "Chọn một thực thể Ollama",
 	"Select model": "Chọn model",
+	"Selected models do not support image inputs": "",
 	"Send": "Gửi",
 	"Send a Message": "Gửi yêu cầu",
 	"Send message": "Gửi yêu cầu",
@@ -492,6 +505,7 @@
 	"Workspace": "Workspace",
 	"Write a prompt suggestion (e.g. Who are you?)": "Hãy viết một prompt (vd: Bạn là ai?)",
 	"Write a summary in 50 words that summarizes [topic or keyword].": "Viết một tóm tắt trong vòng 50 từ cho [chủ đề hoặc từ khóa].",
+	"Yes": "",
 	"Yesterday": "Hôm qua",
 	"You": "Bạn",
 	"You have no archived conversations.": "Bạn chưa lưu trữ một nội dung chat nào",

+ 14 - 0
src/lib/i18n/locales/zh-CN/translation.json

@@ -6,6 +6,7 @@
 	"{{modelName}} is thinking...": "{{modelName}} 正在思考...",
 	"{{user}}'s Chats": "{{user}} 的聊天记录",
 	"{{webUIName}} Backend Required": "需要 {{webUIName}} 后端",
+	"A selected model does not support image input": "",
 	"a user": "用户",
 	"About": "关于",
 	"Account": "账户",
@@ -31,6 +32,7 @@
 	"Advanced Parameters": "高级参数",
 	"all": "所有",
 	"All Documents": "所有文档",
+	"All selected models do not support image input, removed images": "",
 	"All Users": "所有用户",
 	"Allow": "允许",
 	"Allow Chat Deletion": "允许删除聊天记录",
@@ -115,6 +117,7 @@
 	"Created at": "创建于",
 	"Created At": "创建于",
 	"Current Model": "当前模型",
+	"Current Models": "",
 	"Current Password": "当前密码",
 	"Custom": "自定义",
 	"Customize Ollama models for a specific purpose": "定制特定用途的 Ollama 模型",
@@ -181,6 +184,7 @@
 	"Enter LiteLLM API RPM (litellm_params.rpm)": "输入 LiteLLM API 速率限制 (litellm_params.rpm)",
 	"Enter LiteLLM Model (litellm_params.model)": "输入 LiteLLM 模型 (litellm_params.model)",
 	"Enter Max Tokens (litellm_params.max_tokens)": "输入模型的 Max Tokens (litellm_params.max_tokens)",
+	"Enter Model Display Name": "",
 	"Enter model tag (e.g. {{modelTag}})": "输入模型标签 (例如{{modelTag}})",
 	"Enter Number of Steps (e.g. 50)": "输入步数 (例如 50)",
 	"Enter Score": "输入分",
@@ -235,6 +239,7 @@
 	"Input commands": "输入命令",
 	"Interface": "界面",
 	"Invalid Tag": "无效标签",
+	"Is Model Vision Capable": "",
 	"January": "一月",
 	"join our Discord for help.": "加入我们的 Discord 寻求帮助。",
 	"JSON": "JSON",
@@ -253,6 +258,7 @@
 	"Made by OpenWebUI Community": "由 OpenWebUI 社区制作",
 	"Make sure to enclose them with": "确保将它们包含在内",
 	"Manage LiteLLM Models": "管理 LiteLLM 模型",
+	"Manage Model Information": "",
 	"Manage Models": "管理模型",
 	"Manage Ollama Models": "管理 Ollama 模型",
 	"March": "三月",
@@ -272,7 +278,12 @@
 	"Model '{{modelTag}}' is already in queue for downloading.": "模型'{{modelTag}}'已在下载队列中。",
 	"Model {{modelId}} not found": "未找到模型{{modelId}}",
 	"Model {{modelName}} already exists.": "模型{{modelName}}已存在。",
+	"Model {{modelName}} is not vision capable": "",
+	"Model Description": "",
+	"Model Display Name": "",
 	"Model filesystem path detected. Model shortname is required for update, cannot continue.": "检测到模型文件系统路径。模型简名是更新所必需的,无法继续。",
+	"Model info for {{modelName}} added successfully": "",
+	"Model info for {{modelName}} deleted successfully": "",
 	"Model Name": "模型名称",
 	"Model not selected": "未选择模型",
 	"Model Tag Name": "模型标签名称",
@@ -289,6 +300,7 @@
 	"Name your modelfile": "命名你的模型文件",
 	"New Chat": "新聊天",
 	"New Password": "新密码",
+	"No": "",
 	"No results found": "未找到结果",
 	"No source available": "没有可用来源",
 	"Not factually correct": "与事实不符",
@@ -385,6 +397,7 @@
 	"Select a model": "选择一个模型",
 	"Select an Ollama instance": "选择一个 Ollama 实例",
 	"Select model": "选择模型",
+	"Selected models do not support image inputs": "",
 	"Send": "发送",
 	"Send a Message": "发送消息",
 	"Send message": "发送消息",
@@ -492,6 +505,7 @@
 	"Workspace": "工作空间",
 	"Write a prompt suggestion (e.g. Who are you?)": "写一个提示建议(例如:你是谁?)",
 	"Write a summary in 50 words that summarizes [topic or keyword].": "用 50 个字写一个总结 [主题或关键词]。",
+	"Yes": "",
 	"Yesterday": "昨天",
 	"You": "你",
 	"You have no archived conversations.": "你没有存档的对话。",

+ 14 - 0
src/lib/i18n/locales/zh-TW/translation.json

@@ -6,6 +6,7 @@
 	"{{modelName}} is thinking...": "{{modelName}} 正在思考...",
 	"{{user}}'s Chats": "{{user}} 的聊天",
 	"{{webUIName}} Backend Required": "需要 {{webUIName}} 後台",
+	"A selected model does not support image input": "",
 	"a user": "使用者",
 	"About": "關於",
 	"Account": "帳號",
@@ -31,6 +32,7 @@
 	"Advanced Parameters": "進階參數",
 	"all": "所有",
 	"All Documents": "所有文件",
+	"All selected models do not support image input, removed images": "",
 	"All Users": "所有使用者",
 	"Allow": "允許",
 	"Allow Chat Deletion": "允許刪除聊天紀錄",
@@ -115,6 +117,7 @@
 	"Created at": "建立於",
 	"Created At": "建立於",
 	"Current Model": "目前模型",
+	"Current Models": "",
 	"Current Password": "目前密碼",
 	"Custom": "自訂",
 	"Customize Ollama models for a specific purpose": "定制特定用途的 Ollama 模型",
@@ -181,6 +184,7 @@
 	"Enter LiteLLM API RPM (litellm_params.rpm)": "輸入 LiteLLM API RPM(litellm_params.rpm)",
 	"Enter LiteLLM Model (litellm_params.model)": "輸入 LiteLLM 模型(litellm_params.model)",
 	"Enter Max Tokens (litellm_params.max_tokens)": "輸入最大 Token 數(litellm_params.max_tokens)",
+	"Enter Model Display Name": "",
 	"Enter model tag (e.g. {{modelTag}})": "輸入模型標籤(例如 {{modelTag}})",
 	"Enter Number of Steps (e.g. 50)": "輸入步數(例如 50)",
 	"Enter Score": "輸入分數",
@@ -235,6 +239,7 @@
 	"Input commands": "輸入命令",
 	"Interface": "介面",
 	"Invalid Tag": "無效標籤",
+	"Is Model Vision Capable": "",
 	"January": "1月",
 	"join our Discord for help.": "加入我們的 Discord 尋找幫助。",
 	"JSON": "JSON",
@@ -253,6 +258,7 @@
 	"Made by OpenWebUI Community": "由 OpenWebUI 社區製作",
 	"Make sure to enclose them with": "請確保變數有被以下符號框住:",
 	"Manage LiteLLM Models": "管理 LiteLLM 模型",
+	"Manage Model Information": "",
 	"Manage Models": "管理模組",
 	"Manage Ollama Models": "管理 Ollama 模型",
 	"March": "3月",
@@ -272,7 +278,12 @@
 	"Model '{{modelTag}}' is already in queue for downloading.": "'{{modelTag}}' 模型已經在下載佇列中。",
 	"Model {{modelId}} not found": "找不到 {{modelId}} 模型",
 	"Model {{modelName}} already exists.": "模型 {{modelName}} 已存在。",
+	"Model {{modelName}} is not vision capable": "",
+	"Model Description": "",
+	"Model Display Name": "",
 	"Model filesystem path detected. Model shortname is required for update, cannot continue.": "模型文件系統路徑已檢測。需要更新模型短名,無法繼續。",
+	"Model info for {{modelName}} added successfully": "",
+	"Model info for {{modelName}} deleted successfully": "",
 	"Model Name": "模型名稱",
 	"Model not selected": "未選擇模型",
 	"Model Tag Name": "模型標籤",
@@ -289,6 +300,7 @@
 	"Name your modelfile": "命名你的 Modelfile",
 	"New Chat": "新增聊天",
 	"New Password": "新密碼",
+	"No": "",
 	"No results found": "沒有找到結果",
 	"No source available": "沒有可用的來源",
 	"Not factually correct": "與真實資訊不相符",
@@ -385,6 +397,7 @@
 	"Select a model": "選擇一個模型",
 	"Select an Ollama instance": "選擇 Ollama 實例",
 	"Select model": "選擇模型",
+	"Selected models do not support image inputs": "",
 	"Send": "傳送",
 	"Send a Message": "傳送訊息",
 	"Send message": "傳送訊息",
@@ -492,6 +505,7 @@
 	"Workspace": "工作區",
 	"Write a prompt suggestion (e.g. Who are you?)": "寫一個提示詞建議(例如:你是誰?)",
 	"Write a summary in 50 words that summarizes [topic or keyword].": "寫一個 50 字的摘要來概括 [主題或關鍵詞]。",
+	"Yes": "",
 	"Yesterday": "昨天",
 	"You": "你",
 	"You have no archived conversations.": "你沒有任何已封存的對話",

+ 11 - 9
src/lib/stores/index.ts

@@ -1,5 +1,6 @@
 import { APP_NAME } from '$lib/constants';
 import { type Writable, writable } from 'svelte/store';
+import type { GlobalModelConfig, ModelConfig } from '$lib/apis';
 
 // Backend
 export const WEBUI_NAME = writable(APP_NAME);
@@ -42,27 +43,27 @@ export const showSettings = writable(false);
 export const showArchivedChats = writable(false);
 export const showChangelog = writable(false);
 
-type Model = OpenAIModel | OllamaModel;
+export type Model = OpenAIModel | OllamaModel;
 
-type OpenAIModel = {
+type BaseModel = {
 	id: string;
 	name: string;
-	external: boolean;
-	source?: string;
+	custom_info?: ModelConfig;
 };
 
-type OllamaModel = {
-	id: string;
-	name: string;
+export interface OpenAIModel extends BaseModel {
+	external: boolean;
+	source?: string;
+}
 
-	// Ollama specific fields
+export interface OllamaModel extends BaseModel {
 	details: OllamaModelDetails;
 	size: number;
 	description: string;
 	model: string;
 	modified_at: string;
 	digest: string;
-};
+}
 
 type OllamaModelDetails = {
 	parent_model: string;
@@ -133,6 +134,7 @@ type Config = {
 	default_models?: string[];
 	default_prompt_suggestions?: PromptSuggestion[];
 	trusted_header_auth?: boolean;
+	model_config?: GlobalModelConfig;
 };
 
 type PromptSuggestion = {