Quellcode durchsuchen

Merge remote-tracking branch 'upstream/dev' into feat/backend-web-search

Jun Siang Cheah vor 11 Monaten
Ursprung
Commit
b1265c9c34
89 geänderte Dateien mit 3676 neuen und 3765 gelöschten Zeilen
  1. 11 2
      backend/apps/litellm/main.py
  2. 150 26
      backend/apps/ollama/main.py
  3. 86 28
      backend/apps/openai/main.py
  4. 12 0
      backend/apps/web/internal/db.py
  5. 61 0
      backend/apps/web/internal/migrations/009_add_models.py
  6. 130 0
      backend/apps/web/internal/migrations/010_migrate_modelfiles_to_models.py
  7. 5 3
      backend/apps/web/main.py
  8. 8 0
      backend/apps/web/models/modelfiles.py
  9. 179 0
      backend/apps/web/models/models.py
  10. 0 124
      backend/apps/web/routers/modelfiles.py
  11. 108 0
      backend/apps/web/routers/models.py
  12. 2 0
      backend/constants.py
  13. 104 6
      backend/main.py
  14. 74 0
      backend/utils/misc.py
  15. 10 0
      backend/utils/models.py
  16. 123 0
      src/lib/apis/index.ts
  17. 2 1
      src/lib/apis/litellm/index.ts
  18. 17 32
      src/lib/apis/models/index.ts
  19. 6 1
      src/lib/apis/openai/index.ts
  20. 109 113
      src/lib/components/chat/Chat.svelte
  21. 60 13
      src/lib/components/chat/MessageInput.svelte
  22. 2 8
      src/lib/components/chat/Messages.svelte
  23. 54 53
      src/lib/components/chat/Messages/CodeBlock.svelte
  24. 0 3
      src/lib/components/chat/Messages/CompareMessages.svelte
  25. 36 37
      src/lib/components/chat/Messages/Placeholder.svelte
  26. 8 10
      src/lib/components/chat/Messages/ResponseMessage.svelte
  27. 4 9
      src/lib/components/chat/Messages/UserMessage.svelte
  28. 5 7
      src/lib/components/chat/ModelSelector.svelte
  29. 43 18
      src/lib/components/chat/ModelSelector/Selector.svelte
  30. 0 155
      src/lib/components/chat/Settings/Advanced.svelte
  31. 177 97
      src/lib/components/chat/Settings/Advanced/AdvancedParams.svelte
  32. 28 27
      src/lib/components/chat/Settings/General.svelte
  33. 37 287
      src/lib/components/chat/Settings/Models.svelte
  34. 1 1
      src/lib/components/chat/SettingsModal.svelte
  35. 2 4
      src/lib/components/chat/ShareChatModal.svelte
  36. 1 0
      src/lib/components/common/Checkbox.svelte
  37. 2 1
      src/lib/components/common/Tooltip.svelte
  38. 0 1
      src/lib/components/layout/Navbar.svelte
  39. 73 92
      src/lib/components/workspace/Models.svelte
  40. 5 7
      src/lib/components/workspace/Playground.svelte
  41. 1 1
      src/lib/constants.ts
  42. 23 37
      src/lib/i18n/locales/ar-BH/translation.json
  43. 23 37
      src/lib/i18n/locales/bg-BG/translation.json
  44. 23 37
      src/lib/i18n/locales/bn-BD/translation.json
  45. 23 37
      src/lib/i18n/locales/ca-ES/translation.json
  46. 23 37
      src/lib/i18n/locales/ceb-PH/translation.json
  47. 23 37
      src/lib/i18n/locales/de-DE/translation.json
  48. 23 37
      src/lib/i18n/locales/dg-DG/translation.json
  49. 23 37
      src/lib/i18n/locales/en-GB/translation.json
  50. 23 37
      src/lib/i18n/locales/en-US/translation.json
  51. 23 37
      src/lib/i18n/locales/es-ES/translation.json
  52. 23 37
      src/lib/i18n/locales/fa-IR/translation.json
  53. 23 37
      src/lib/i18n/locales/fi-FI/translation.json
  54. 23 37
      src/lib/i18n/locales/fr-CA/translation.json
  55. 23 37
      src/lib/i18n/locales/fr-FR/translation.json
  56. 23 37
      src/lib/i18n/locales/he-IL/translation.json
  57. 23 37
      src/lib/i18n/locales/hi-IN/translation.json
  58. 23 37
      src/lib/i18n/locales/hr-HR/translation.json
  59. 23 37
      src/lib/i18n/locales/it-IT/translation.json
  60. 23 37
      src/lib/i18n/locales/ja-JP/translation.json
  61. 23 37
      src/lib/i18n/locales/ka-GE/translation.json
  62. 23 37
      src/lib/i18n/locales/ko-KR/translation.json
  63. 23 37
      src/lib/i18n/locales/nl-NL/translation.json
  64. 23 37
      src/lib/i18n/locales/pa-IN/translation.json
  65. 23 37
      src/lib/i18n/locales/pl-PL/translation.json
  66. 23 37
      src/lib/i18n/locales/pt-BR/translation.json
  67. 23 37
      src/lib/i18n/locales/pt-PT/translation.json
  68. 23 37
      src/lib/i18n/locales/ru-RU/translation.json
  69. 23 37
      src/lib/i18n/locales/sr-RS/translation.json
  70. 23 37
      src/lib/i18n/locales/sv-SE/translation.json
  71. 23 37
      src/lib/i18n/locales/tr-TR/translation.json
  72. 23 37
      src/lib/i18n/locales/uk-UA/translation.json
  73. 23 37
      src/lib/i18n/locales/vi-VN/translation.json
  74. 23 37
      src/lib/i18n/locales/zh-CN/translation.json
  75. 23 37
      src/lib/i18n/locales/zh-TW/translation.json
  76. 10 8
      src/lib/stores/index.ts
  77. 0 24
      src/lib/utils/index.ts
  78. 3 28
      src/routes/(app)/+layout.svelte
  79. 2 2
      src/routes/(app)/workspace/+layout.svelte
  80. 1 1
      src/routes/(app)/workspace/+page.svelte
  81. 0 5
      src/routes/(app)/workspace/modelfiles/+page.svelte
  82. 0 721
      src/routes/(app)/workspace/modelfiles/create/+page.svelte
  83. 0 507
      src/routes/(app)/workspace/modelfiles/edit/+page.svelte
  84. 5 0
      src/routes/(app)/workspace/models/+page.svelte
  85. 576 0
      src/routes/(app)/workspace/models/create/+page.svelte
  86. 555 0
      src/routes/(app)/workspace/models/edit/+page.svelte
  87. 0 27
      src/routes/modelfiles/create/+page.svelte
  88. 3 17
      src/routes/s/[id]/+page.svelte
  89. 3 0
      vite.config.ts

+ 11 - 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
@@ -261,6 +262,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"]
                 ],

+ 150 - 26
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 (
@@ -39,6 +39,8 @@ from utils.utils import (
     get_admin_user,
 )
 
+from utils.models import get_model_id_from_custom_model_id
+
 
 from config import (
     SRC_LOG_LEVELS,
@@ -68,7 +70,6 @@ app.state.config = AppConfig()
 app.state.config.ENABLE_MODEL_FILTER = ENABLE_MODEL_FILTER
 app.state.config.MODEL_FILTER_LIST = MODEL_FILTER_LIST
 
-
 app.state.config.ENABLE_OLLAMA_API = ENABLE_OLLAMA_API
 app.state.config.OLLAMA_BASE_URLS = OLLAMA_BASE_URLS
 app.state.MODELS = {}
@@ -875,14 +876,93 @@ async def generate_chat_completion(
     user=Depends(get_verified_user),
 ):
 
-    if url_idx == None:
-        model = form_data.model
+    log.debug(
+        "form_data.model_dump_json(exclude_none=True).encode(): {0} ".format(
+            form_data.model_dump_json(exclude_none=True).encode()
+        )
+    )
 
-        if ":" not in model:
-            model = f"{model}:latest"
+    payload = {
+        **form_data.model_dump(exclude_none=True),
+    }
 
-        if model in app.state.MODELS:
-            url_idx = random.choice(app.state.MODELS[model]["urls"])
+    model_id = form_data.model
+    model_info = Models.get_model_by_id(model_id)
+
+    if model_info:
+        print(model_info)
+        if model_info.base_model_id:
+            payload["model"] = model_info.base_model_id
+
+        model_info.params = model_info.params.model_dump()
+
+        if model_info.params:
+            payload["options"] = {}
+
+            payload["options"]["mirostat"] = model_info.params.get("mirostat", None)
+            payload["options"]["mirostat_eta"] = model_info.params.get(
+                "mirostat_eta", None
+            )
+            payload["options"]["mirostat_tau"] = model_info.params.get(
+                "mirostat_tau", None
+            )
+            payload["options"]["num_ctx"] = model_info.params.get("num_ctx", None)
+
+            payload["options"]["repeat_last_n"] = model_info.params.get(
+                "repeat_last_n", None
+            )
+            payload["options"]["repeat_penalty"] = model_info.params.get(
+                "frequency_penalty", None
+            )
+
+            payload["options"]["temperature"] = model_info.params.get(
+                "temperature", None
+            )
+            payload["options"]["seed"] = model_info.params.get("seed", None)
+
+            payload["options"]["stop"] = (
+                [
+                    bytes(stop, "utf-8").decode("unicode_escape")
+                    for stop in model_info.params["stop"]
+                ]
+                if model_info.params.get("stop", None)
+                else None
+            )
+
+            payload["options"]["tfs_z"] = model_info.params.get("tfs_z", None)
+
+            payload["options"]["num_predict"] = model_info.params.get(
+                "max_tokens", None
+            )
+            payload["options"]["top_k"] = model_info.params.get("top_k", None)
+
+            payload["options"]["top_p"] = model_info.params.get("top_p", None)
+
+        if model_info.params.get("system", None):
+            # Check if the payload already has a system message
+            # If not, add a system message to the payload
+            if payload.get("messages"):
+                for message in payload["messages"]:
+                    if message.get("role") == "system":
+                        message["content"] = (
+                            model_info.params.get("system", None) + message["content"]
+                        )
+                        break
+                else:
+                    payload["messages"].insert(
+                        0,
+                        {
+                            "role": "system",
+                            "content": model_info.params.get("system", None),
+                        },
+                    )
+
+    if url_idx == None:
+        if ":" not in payload["model"]:
+            payload["model"] = f"{payload['model']}:latest"
+
+        if payload["model"] in app.state.MODELS:
+            url_idx = random.choice(app.state.MODELS[payload["model"]]["urls"])
         else:
             raise HTTPException(
                 status_code=400,
@@ -892,16 +972,12 @@ async def generate_chat_completion(
     url = app.state.config.OLLAMA_BASE_URLS[url_idx]
     log.info(f"url: {url}")
 
-    r = None
+    print(payload)
 
-    log.debug(
-        "form_data.model_dump_json(exclude_none=True).encode(): {0} ".format(
-            form_data.model_dump_json(exclude_none=True).encode()
-        )
-    )
+    r = None
 
     def get_request():
-        nonlocal form_data
+        nonlocal payload
         nonlocal r
 
         request_id = str(uuid.uuid4())
@@ -910,7 +986,7 @@ async def generate_chat_completion(
 
             def stream_content():
                 try:
-                    if form_data.stream:
+                    if payload.get("stream", None):
                         yield json.dumps({"id": request_id, "done": False}) + "\n"
 
                     for chunk in r.iter_content(chunk_size=8192):
@@ -928,7 +1004,7 @@ async def generate_chat_completion(
             r = requests.request(
                 method="POST",
                 url=f"{url}/api/chat",
-                data=form_data.model_dump_json(exclude_none=True).encode(),
+                data=json.dumps(payload),
                 stream=True,
             )
 
@@ -984,14 +1060,62 @@ async def generate_openai_chat_completion(
     user=Depends(get_verified_user),
 ):
 
-    if url_idx == None:
-        model = form_data.model
+    payload = {
+        **form_data.model_dump(exclude_none=True),
+    }
 
-        if ":" not in model:
-            model = f"{model}:latest"
+    model_id = form_data.model
+    model_info = Models.get_model_by_id(model_id)
 
-        if model in app.state.MODELS:
-            url_idx = random.choice(app.state.MODELS[model]["urls"])
+    if model_info:
+        print(model_info)
+        if model_info.base_model_id:
+            payload["model"] = model_info.base_model_id
+
+        model_info.params = model_info.params.model_dump()
+
+        if model_info.params:
+            payload["temperature"] = model_info.params.get("temperature", None)
+            payload["top_p"] = model_info.params.get("top_p", None)
+            payload["max_tokens"] = model_info.params.get("max_tokens", None)
+            payload["frequency_penalty"] = model_info.params.get(
+                "frequency_penalty", None
+            )
+            payload["seed"] = model_info.params.get("seed", None)
+            payload["stop"] = (
+                [
+                    bytes(stop, "utf-8").decode("unicode_escape")
+                    for stop in model_info.params["stop"]
+                ]
+                if model_info.params.get("stop", None)
+                else None
+            )
+
+        if model_info.params.get("system", None):
+            # Check if the payload already has a system message
+            # If not, add a system message to the payload
+            if payload.get("messages"):
+                for message in payload["messages"]:
+                    if message.get("role") == "system":
+                        message["content"] = (
+                            model_info.params.get("system", None) + message["content"]
+                        )
+                        break
+                else:
+                    payload["messages"].insert(
+                        0,
+                        {
+                            "role": "system",
+                            "content": model_info.params.get("system", None),
+                        },
+                    )
+
+    if url_idx == None:
+        if ":" not in payload["model"]:
+            payload["model"] = f"{payload['model']}:latest"
+
+        if payload["model"] in app.state.MODELS:
+            url_idx = random.choice(app.state.MODELS[payload["model"]]["urls"])
         else:
             raise HTTPException(
                 status_code=400,
@@ -1004,7 +1128,7 @@ async def generate_openai_chat_completion(
     r = None
 
     def get_request():
-        nonlocal form_data
+        nonlocal payload
         nonlocal r
 
         request_id = str(uuid.uuid4())
@@ -1013,7 +1137,7 @@ async def generate_openai_chat_completion(
 
             def stream_content():
                 try:
-                    if form_data.stream:
+                    if payload.get("stream"):
                         yield json.dumps(
                             {"request_id": request_id, "done": False}
                         ) + "\n"
@@ -1033,7 +1157,7 @@ async def generate_openai_chat_completion(
             r = requests.request(
                 method="POST",
                 url=f"{url}/v1/chat/completions",
-                data=form_data.model_dump_json(exclude_none=True).encode(),
+                data=json.dumps(payload),
                 stream=True,
             )
 

+ 86 - 28
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 (
@@ -53,7 +53,6 @@ app.state.config = AppConfig()
 app.state.config.ENABLE_MODEL_FILTER = ENABLE_MODEL_FILTER
 app.state.config.MODEL_FILTER_LIST = MODEL_FILTER_LIST
 
-
 app.state.config.ENABLE_OPENAI_API = ENABLE_OPENAI_API
 app.state.config.OPENAI_API_BASE_URLS = OPENAI_API_BASE_URLS
 app.state.config.OPENAI_API_KEYS = OPENAI_API_KEYS
@@ -206,7 +205,13 @@ def merge_models_lists(model_lists):
         if models is not None and "error" not in models:
             merged_list.extend(
                 [
-                    {**model, "urlIdx": idx}
+                    {
+                        **model,
+                        "name": model.get("name", model["id"]),
+                        "owned_by": "openai",
+                        "openai": model,
+                        "urlIdx": idx,
+                    }
                     for model in models
                     if "api.openai.com"
                     not in app.state.config.OPENAI_API_BASE_URLS[idx]
@@ -252,7 +257,7 @@ async def get_all_models():
         log.info(f"models: {models}")
         app.state.MODELS = {model["id"]: model for model in models["data"]}
 
-        return models
+    return models
 
 
 @app.get("/models")
@@ -306,44 +311,97 @@ async def get_models(url_idx: Optional[int] = None, user=Depends(get_current_use
 @app.api_route("/{path:path}", methods=["GET", "POST", "PUT", "DELETE"])
 async def proxy(path: str, request: Request, user=Depends(get_verified_user)):
     idx = 0
-    pipeline = False
 
     body = await request.body()
     # TODO: Remove below after gpt-4-vision fix from Open AI
     # Try to decode the body of the request from bytes to a UTF-8 string (Require add max_token to fix gpt-4-vision)
+
+    payload = None
+
     try:
-        body = body.decode("utf-8")
-        body = json.loads(body)
+        if "chat/completions" in path:
+            body = body.decode("utf-8")
+            body = json.loads(body)
 
-        model = app.state.MODELS[body.get("model")]
+            payload = {**body}
 
-        idx = model["urlIdx"]
+            model_id = body.get("model")
+            model_info = Models.get_model_by_id(model_id)
 
-        if "pipeline" in model:
-            pipeline = model.get("pipeline")
+            if model_info:
+                print(model_info)
+                if model_info.base_model_id:
+                    payload["model"] = model_info.base_model_id
 
-        if pipeline:
-            body["user"] = {"name": user.name, "id": user.id}
+                model_info.params = model_info.params.model_dump()
 
-        # Check if the model is "gpt-4-vision-preview" and set "max_tokens" to 4000
-        # This is a workaround until OpenAI fixes the issue with this model
-        if body.get("model") == "gpt-4-vision-preview":
-            if "max_tokens" not in body:
-                body["max_tokens"] = 4000
-            log.debug("Modified body_dict:", body)
+                if model_info.params:
+                    payload["temperature"] = model_info.params.get("temperature", None)
+                    payload["top_p"] = model_info.params.get("top_p", None)
+                    payload["max_tokens"] = model_info.params.get("max_tokens", None)
+                    payload["frequency_penalty"] = model_info.params.get(
+                        "frequency_penalty", None
+                    )
+                    payload["seed"] = model_info.params.get("seed", None)
+                    payload["stop"] = (
+                        [
+                            bytes(stop, "utf-8").decode("unicode_escape")
+                            for stop in model_info.params["stop"]
+                        ]
+                        if model_info.params.get("stop", None)
+                        else None
+                    )
+
+                if model_info.params.get("system", None):
+                    # Check if the payload already has a system message
+                    # If not, add a system message to the payload
+                    if payload.get("messages"):
+                        for message in payload["messages"]:
+                            if message.get("role") == "system":
+                                message["content"] = (
+                                    model_info.params.get("system", None)
+                                    + message["content"]
+                                )
+                                break
+                        else:
+                            payload["messages"].insert(
+                                0,
+                                {
+                                    "role": "system",
+                                    "content": model_info.params.get("system", None),
+                                },
+                            )
+            else:
+                pass
+
+            print(app.state.MODELS)
+            model = app.state.MODELS[payload.get("model")]
+
+            idx = model["urlIdx"]
+
+            if "pipeline" in model and model.get("pipeline"):
+                payload["user"] = {"name": user.name, "id": user.id}
+                payload["title"] = (
+                    True
+                    if payload["stream"] == False and payload["max_tokens"] == 50
+                    else False
+                )
 
-        # Fix for ChatGPT calls failing because the num_ctx key is in body
-        if "num_ctx" in body:
-            # If 'num_ctx' is in the dictionary, delete it
-            # Leaving it there generates an error with the
-            # OpenAI API (Feb 2024)
-            del body["num_ctx"]
+            # Check if the model is "gpt-4-vision-preview" and set "max_tokens" to 4000
+            # This is a workaround until OpenAI fixes the issue with this model
+            if payload.get("model") == "gpt-4-vision-preview":
+                if "max_tokens" not in payload:
+                    payload["max_tokens"] = 4000
+                log.debug("Modified payload:", payload)
+
+            # Convert the modified body back to JSON
+            payload = json.dumps(payload)
 
-        # Convert the modified body back to JSON
-        body = json.dumps(body)
     except json.JSONDecodeError as e:
         log.error("Error loading request body into a dictionary:", e)
 
+    print(payload)
+
     url = app.state.config.OPENAI_API_BASE_URLS[idx]
     key = app.state.config.OPENAI_API_KEYS[idx]
 
@@ -362,7 +420,7 @@ async def proxy(path: str, request: Request, user=Depends(get_verified_user)):
         r = requests.request(
             method=request.method,
             url=target_url,
-            data=body,
+            data=payload if payload else body,
             headers=headers,
             stream=True,
         )

+ 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

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

@@ -0,0 +1,61 @@
+"""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)
+        user_id = pw.TextField()
+        base_model_id = pw.TextField(null=True)
+
+        name = pw.TextField()
+
+        meta = pw.TextField()
+        params = pw.TextField()
+
+        created_at = pw.BigIntegerField(null=False)
+        updated_at = pw.BigIntegerField(null=False)
+
+        class Meta:
+            table_name = "model"
+
+
+def rollback(migrator: Migrator, database: pw.Database, *, fake=False):
+    """Write your rollback migrations here."""
+
+    migrator.remove_model("model")

+ 130 - 0
backend/apps/web/internal/migrations/010_migrate_modelfiles_to_models.py

@@ -0,0 +1,130 @@
+"""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
+import json
+
+from utils.misc import parse_ollama_modelfile
+
+with suppress(ImportError):
+    import playhouse.postgres_ext as pw_pext
+
+
+def migrate(migrator: Migrator, database: pw.Database, *, fake=False):
+    """Write your migrations here."""
+
+    # Fetch data from 'modelfile' table and insert into 'model' table
+    migrate_modelfile_to_model(migrator, database)
+    # Drop the 'modelfile' table
+    migrator.remove_model("modelfile")
+
+
+def migrate_modelfile_to_model(migrator: Migrator, database: pw.Database):
+    ModelFile = migrator.orm["modelfile"]
+    Model = migrator.orm["model"]
+
+    modelfiles = ModelFile.select()
+
+    for modelfile in modelfiles:
+        # Extract and transform data in Python
+
+        modelfile.modelfile = json.loads(modelfile.modelfile)
+        meta = json.dumps(
+            {
+                "description": modelfile.modelfile.get("desc"),
+                "profile_image_url": modelfile.modelfile.get("imageUrl"),
+                "ollama": {"modelfile": modelfile.modelfile.get("content")},
+                "suggestion_prompts": modelfile.modelfile.get("suggestionPrompts"),
+                "categories": modelfile.modelfile.get("categories"),
+                "user": {**modelfile.modelfile.get("user", {}), "community": True},
+            }
+        )
+
+        info = parse_ollama_modelfile(modelfile.modelfile.get("content"))
+
+        # Insert the processed data into the 'model' table
+        Model.create(
+            id=f"ollama-{modelfile.tag_name}",
+            user_id=modelfile.user_id,
+            base_model_id=info.get("base_model_id"),
+            name=modelfile.modelfile.get("title"),
+            meta=meta,
+            params=json.dumps(info.get("params", {})),
+            created_at=modelfile.timestamp,
+            updated_at=modelfile.timestamp,
+        )
+
+
+def rollback(migrator: Migrator, database: pw.Database, *, fake=False):
+    """Write your rollback migrations here."""
+
+    recreate_modelfile_table(migrator, database)
+    move_data_back_to_modelfile(migrator, database)
+    migrator.remove_model("model")
+
+
+def recreate_modelfile_table(migrator: Migrator, database: pw.Database):
+    query = """
+    CREATE TABLE IF NOT EXISTS modelfile (
+        user_id TEXT,
+        tag_name TEXT,
+        modelfile JSON,
+        timestamp BIGINT
+    )
+    """
+    migrator.sql(query)
+
+
+def move_data_back_to_modelfile(migrator: Migrator, database: pw.Database):
+    Model = migrator.orm["model"]
+    Modelfile = migrator.orm["modelfile"]
+
+    models = Model.select()
+
+    for model in models:
+        # Extract and transform data in Python
+        meta = json.loads(model.meta)
+
+        modelfile_data = {
+            "title": model.name,
+            "desc": meta.get("description"),
+            "imageUrl": meta.get("profile_image_url"),
+            "content": meta.get("ollama", {}).get("modelfile"),
+            "suggestionPrompts": meta.get("suggestion_prompts"),
+            "categories": meta.get("categories"),
+            "user": {k: v for k, v in meta.get("user", {}).items() if k != "community"},
+        }
+
+        # Insert the processed data back into the 'modelfile' table
+        Modelfile.create(
+            user_id=model.user_id,
+            tag_name=model.id,
+            modelfile=modelfile_data,
+            timestamp=model.created_at,
+        )

+ 5 - 3
backend/apps/web/main.py

@@ -6,7 +6,7 @@ from apps.web.routers import (
     users,
     chats,
     documents,
-    modelfiles,
+    models,
     prompts,
     configs,
     memories,
@@ -40,6 +40,9 @@ app.state.config.DEFAULT_PROMPT_SUGGESTIONS = DEFAULT_PROMPT_SUGGESTIONS
 app.state.config.DEFAULT_USER_ROLE = DEFAULT_USER_ROLE
 app.state.config.USER_PERMISSIONS = USER_PERMISSIONS
 app.state.config.WEBHOOK_URL = WEBHOOK_URL
+
+
+app.state.MODELS = {}
 app.state.AUTH_TRUSTED_EMAIL_HEADER = WEBUI_AUTH_TRUSTED_EMAIL_HEADER
 
 
@@ -56,11 +59,10 @@ app.include_router(users.router, prefix="/users", tags=["users"])
 app.include_router(chats.router, prefix="/chats", tags=["chats"])
 
 app.include_router(documents.router, prefix="/documents", tags=["documents"])
-app.include_router(modelfiles.router, prefix="/modelfiles", tags=["modelfiles"])
+app.include_router(models.router, prefix="/models", tags=["models"])
 app.include_router(prompts.router, prefix="/prompts", tags=["prompts"])
 app.include_router(memories.router, prefix="/memories", tags=["memories"])
 
-
 app.include_router(configs.router, prefix="/configs", tags=["configs"])
 app.include_router(utils.router, prefix="/utils", tags=["utils"])
 

+ 8 - 0
backend/apps/web/models/modelfiles.py

@@ -1,3 +1,11 @@
+################################################################################
+#                              DEPRECATION NOTICE                              #
+#                                                                              #
+# This file has been deprecated since version 0.2.0.                           #
+#                                                                              #
+################################################################################
+
+
 from pydantic import BaseModel
 from peewee import *
 from playhouse.shortcuts import model_to_dict

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

@@ -0,0 +1,179 @@
+import json
+import logging
+from typing import Optional
+
+import peewee as pw
+from peewee import *
+
+from playhouse.shortcuts import model_to_dict
+from pydantic import BaseModel, ConfigDict
+
+from apps.web.internal.db import DB, JSONField
+
+from typing import List, Union, Optional
+from config import SRC_LOG_LEVELS
+
+import time
+
+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
+class ModelParams(BaseModel):
+    model_config = ConfigDict(extra="allow")
+    pass
+
+
+# ModelMeta is a model for the data stored in the meta field of the Model table
+class ModelMeta(BaseModel):
+    profile_image_url: Optional[str] = "/favicon.png"
+
+    description: Optional[str] = None
+    """
+        User-facing description of the model.
+    """
+
+    capabilities: Optional[dict] = None
+
+    model_config = ConfigDict(extra="allow")
+
+    pass
+
+
+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.
+    """
+    user_id = pw.TextField()
+
+    base_model_id = pw.TextField(null=True)
+    """
+        An optional pointer to the actual model that should be used when proxying requests.
+    """
+
+    name = pw.TextField()
+    """
+        The human-readable display name of the model.
+    """
+
+    params = JSONField()
+    """
+        Holds a JSON encoded blob of parameters, see `ModelParams`.
+    """
+
+    meta = JSONField()
+    """
+        Holds a JSON encoded blob of metadata, see `ModelMeta`.
+    """
+
+    updated_at = BigIntegerField()
+    created_at = BigIntegerField()
+
+    class Meta:
+        database = DB
+
+
+class ModelModel(BaseModel):
+    id: str
+    user_id: str
+    base_model_id: Optional[str] = None
+
+    name: str
+    params: ModelParams
+    meta: ModelMeta
+
+    updated_at: int  # timestamp in epoch
+    created_at: int  # timestamp in epoch
+
+
+####################
+# Forms
+####################
+
+
+class ModelResponse(BaseModel):
+    id: str
+    name: str
+    meta: ModelMeta
+    updated_at: int  # timestamp in epoch
+    created_at: int  # timestamp in epoch
+
+
+class ModelForm(BaseModel):
+    id: str
+    base_model_id: Optional[str] = None
+    name: str
+    meta: ModelMeta
+    params: ModelParams
+
+
+class ModelsTable:
+    def __init__(
+        self,
+        db: pw.SqliteDatabase | pw.PostgresqlDatabase,
+    ):
+        self.db = db
+        self.db.create_tables([Model])
+
+    def insert_new_model(
+        self, form_data: ModelForm, user_id: str
+    ) -> Optional[ModelModel]:
+        model = ModelModel(
+            **{
+                **form_data.model_dump(),
+                "user_id": user_id,
+                "created_at": int(time.time()),
+                "updated_at": int(time.time()),
+            }
+        )
+        try:
+            result = Model.create(**model.model_dump())
+
+            if result:
+                return model
+            else:
+                return None
+        except Exception as e:
+            print(e)
+            return None
+
+    def get_all_models(self) -> List[ModelModel]:
+        return [ModelModel(**model_to_dict(model)) for model in Model.select()]
+
+    def get_model_by_id(self, id: str) -> Optional[ModelModel]:
+        try:
+            model = Model.get(Model.id == id)
+            return ModelModel(**model_to_dict(model))
+        except:
+            return None
+
+    def update_model_by_id(self, id: str, model: ModelForm) -> Optional[ModelModel]:
+        try:
+            # update only the fields that are present in the model
+            query = Model.update(**model.model_dump()).where(Model.id == id)
+            query.execute()
+
+            model = Model.get(Model.id == id)
+            return ModelModel(**model_to_dict(model))
+        except Exception as e:
+            print(e)
+
+            return None
+
+    def delete_model_by_id(self, id: str) -> bool:
+        try:
+            query = Model.delete().where(Model.id == id)
+            query.execute()
+            return True
+        except:
+            return False
+
+
+Models = ModelsTable(DB)

+ 0 - 124
backend/apps/web/routers/modelfiles.py

@@ -1,124 +0,0 @@
-from fastapi import Depends, FastAPI, HTTPException, status
-from datetime import datetime, timedelta
-from typing import List, Union, Optional
-
-from fastapi import APIRouter
-from pydantic import BaseModel
-import json
-from apps.web.models.modelfiles import (
-    Modelfiles,
-    ModelfileForm,
-    ModelfileTagNameForm,
-    ModelfileUpdateForm,
-    ModelfileResponse,
-)
-
-from utils.utils import get_current_user, get_admin_user
-from constants import ERROR_MESSAGES
-
-router = APIRouter()
-
-############################
-# GetModelfiles
-############################
-
-
-@router.get("/", response_model=List[ModelfileResponse])
-async def get_modelfiles(
-    skip: int = 0, limit: int = 50, user=Depends(get_current_user)
-):
-    return Modelfiles.get_modelfiles(skip, limit)
-
-
-############################
-# CreateNewModelfile
-############################
-
-
-@router.post("/create", response_model=Optional[ModelfileResponse])
-async def create_new_modelfile(form_data: ModelfileForm, user=Depends(get_admin_user)):
-    modelfile = Modelfiles.insert_new_modelfile(user.id, form_data)
-
-    if modelfile:
-        return ModelfileResponse(
-            **{
-                **modelfile.model_dump(),
-                "modelfile": json.loads(modelfile.modelfile),
-            }
-        )
-    else:
-        raise HTTPException(
-            status_code=status.HTTP_401_UNAUTHORIZED,
-            detail=ERROR_MESSAGES.DEFAULT(),
-        )
-
-
-############################
-# GetModelfileByTagName
-############################
-
-
-@router.post("/", response_model=Optional[ModelfileResponse])
-async def get_modelfile_by_tag_name(
-    form_data: ModelfileTagNameForm, user=Depends(get_current_user)
-):
-    modelfile = Modelfiles.get_modelfile_by_tag_name(form_data.tag_name)
-
-    if modelfile:
-        return ModelfileResponse(
-            **{
-                **modelfile.model_dump(),
-                "modelfile": json.loads(modelfile.modelfile),
-            }
-        )
-    else:
-        raise HTTPException(
-            status_code=status.HTTP_401_UNAUTHORIZED,
-            detail=ERROR_MESSAGES.NOT_FOUND,
-        )
-
-
-############################
-# UpdateModelfileByTagName
-############################
-
-
-@router.post("/update", response_model=Optional[ModelfileResponse])
-async def update_modelfile_by_tag_name(
-    form_data: ModelfileUpdateForm, user=Depends(get_admin_user)
-):
-    modelfile = Modelfiles.get_modelfile_by_tag_name(form_data.tag_name)
-    if modelfile:
-        updated_modelfile = {
-            **json.loads(modelfile.modelfile),
-            **form_data.modelfile,
-        }
-
-        modelfile = Modelfiles.update_modelfile_by_tag_name(
-            form_data.tag_name, updated_modelfile
-        )
-
-        return ModelfileResponse(
-            **{
-                **modelfile.model_dump(),
-                "modelfile": json.loads(modelfile.modelfile),
-            }
-        )
-    else:
-        raise HTTPException(
-            status_code=status.HTTP_401_UNAUTHORIZED,
-            detail=ERROR_MESSAGES.ACCESS_PROHIBITED,
-        )
-
-
-############################
-# DeleteModelfileByTagName
-############################
-
-
-@router.delete("/delete", response_model=bool)
-async def delete_modelfile_by_tag_name(
-    form_data: ModelfileTagNameForm, user=Depends(get_admin_user)
-):
-    result = Modelfiles.delete_modelfile_by_tag_name(form_data.tag_name)
-    return result

+ 108 - 0
backend/apps/web/routers/models.py

@@ -0,0 +1,108 @@
+from fastapi import Depends, FastAPI, HTTPException, status, Request
+from datetime import datetime, timedelta
+from typing import List, Union, Optional
+
+from fastapi import APIRouter
+from pydantic import BaseModel
+import json
+from apps.web.models.models import Models, ModelModel, ModelForm, ModelResponse
+
+from utils.utils import get_verified_user, get_admin_user
+from constants import ERROR_MESSAGES
+
+router = APIRouter()
+
+###########################
+# getModels
+###########################
+
+
+@router.get("/", response_model=List[ModelResponse])
+async def get_models(user=Depends(get_verified_user)):
+    return Models.get_all_models()
+
+
+############################
+# AddNewModel
+############################
+
+
+@router.post("/add", response_model=Optional[ModelModel])
+async def add_new_model(
+    request: Request, form_data: ModelForm, user=Depends(get_admin_user)
+):
+    if form_data.id in request.app.state.MODELS:
+        raise HTTPException(
+            status_code=status.HTTP_401_UNAUTHORIZED,
+            detail=ERROR_MESSAGES.MODEL_ID_TAKEN,
+        )
+    else:
+        model = Models.insert_new_model(form_data, user.id)
+
+        if model:
+            return model
+        else:
+            raise HTTPException(
+                status_code=status.HTTP_401_UNAUTHORIZED,
+                detail=ERROR_MESSAGES.DEFAULT(),
+            )
+
+
+############################
+# GetModelById
+############################
+
+
+@router.get("/{id}", response_model=Optional[ModelModel])
+async def get_model_by_id(id: str, user=Depends(get_verified_user)):
+    model = Models.get_model_by_id(id)
+
+    if model:
+        return model
+    else:
+        raise HTTPException(
+            status_code=status.HTTP_401_UNAUTHORIZED,
+            detail=ERROR_MESSAGES.NOT_FOUND,
+        )
+
+
+############################
+# UpdateModelById
+############################
+
+
+@router.post("/{id}/update", response_model=Optional[ModelModel])
+async def update_model_by_id(
+    request: Request, id: str, form_data: ModelForm, user=Depends(get_admin_user)
+):
+    model = Models.get_model_by_id(id)
+    if model:
+        model = Models.update_model_by_id(id, form_data)
+        return model
+    else:
+        if form_data.id in request.app.state.MODELS:
+            model = Models.insert_new_model(form_data, user.id)
+            print(model)
+            if model:
+                return model
+            else:
+                raise HTTPException(
+                    status_code=status.HTTP_401_UNAUTHORIZED,
+                    detail=ERROR_MESSAGES.DEFAULT(),
+                )
+        else:
+            raise HTTPException(
+                status_code=status.HTTP_401_UNAUTHORIZED,
+                detail=ERROR_MESSAGES.DEFAULT(),
+            )
+
+
+############################
+# DeleteModelById
+############################
+
+
+@router.delete("/{id}/delete", response_model=bool)
+async def delete_model_by_id(id: str, user=Depends(get_admin_user)):
+    result = Models.delete_model_by_id(id)
+    return result

+ 2 - 0
backend/constants.py

@@ -32,6 +32,8 @@ class ERROR_MESSAGES(str, Enum):
     COMMAND_TAKEN = "Uh-oh! This command is already registered. Please choose another command string."
     FILE_EXISTS = "Uh-oh! This file is already registered. Please choose another file."
 
+    MODEL_ID_TAKEN = "Uh-oh! This model id is already registered. Please choose another model id string."
+
     NAME_TAG_TAKEN = "Uh-oh! This name tag is already registered. Please choose another name tag string."
     INVALID_TOKEN = (
         "Your session has expired or the token is invalid. Please sign in again."

+ 104 - 6
backend/main.py

@@ -19,8 +19,8 @@ from starlette.exceptions import HTTPException as StarletteHTTPException
 from starlette.middleware.base import BaseHTTPMiddleware
 from starlette.responses import StreamingResponse, Response
 
-from apps.ollama.main import app as ollama_app
-from apps.openai.main import app as openai_app
+from apps.ollama.main import app as ollama_app, get_all_models as get_ollama_models
+from apps.openai.main import app as openai_app, get_all_models as get_openai_models
 
 from apps.litellm.main import (
     app as litellm_app,
@@ -36,10 +36,10 @@ 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 utils.utils import get_admin_user
+from apps.web.models.models import Models, ModelModel
+from utils.utils import get_admin_user, get_verified_user
 from apps.rag.utils import rag_messages
 
 from config import (
@@ -53,6 +53,8 @@ from config import (
     FRONTEND_BUILD_DIR,
     CACHE_DIR,
     STATIC_DIR,
+    ENABLE_OPENAI_API,
+    ENABLE_OLLAMA_API,
     ENABLE_LITELLM,
     ENABLE_MODEL_FILTER,
     MODEL_FILTER_LIST,
@@ -111,11 +113,19 @@ app = FastAPI(
 )
 
 app.state.config = AppConfig()
+
+app.state.config.ENABLE_OPENAI_API = ENABLE_OPENAI_API
+app.state.config.ENABLE_OLLAMA_API = ENABLE_OLLAMA_API
+
 app.state.config.ENABLE_MODEL_FILTER = ENABLE_MODEL_FILTER
 app.state.config.MODEL_FILTER_LIST = MODEL_FILTER_LIST
 
+
 app.state.config.WEBHOOK_URL = WEBHOOK_URL
 
+
+app.state.MODELS = {}
+
 origins = ["*"]
 
 
@@ -232,6 +242,11 @@ app.add_middleware(
 
 @app.middleware("http")
 async def check_url(request: Request, call_next):
+    if len(app.state.MODELS) == 0:
+        await get_all_models()
+    else:
+        pass
+
     start_time = int(time.time())
     response = await call_next(request)
     process_time = int(time.time()) - start_time
@@ -248,9 +263,11 @@ async def update_embedding_function(request: Request, call_next):
     return response
 
 
+# TODO: Deprecate LiteLLM
 app.mount("/litellm/api", litellm_app)
+
 app.mount("/ollama", ollama_app)
-app.mount("/openai/api", openai_app)
+app.mount("/openai", openai_app)
 
 app.mount("/images/api/v1", images_app)
 app.mount("/audio/api/v1", audio_app)
@@ -261,6 +278,87 @@ app.mount("/api/v1", webui_app)
 webui_app.state.EMBEDDING_FUNCTION = rag_app.state.EMBEDDING_FUNCTION
 
 
+async def get_all_models():
+    openai_models = []
+    ollama_models = []
+
+    if app.state.config.ENABLE_OPENAI_API:
+        openai_models = await get_openai_models()
+
+        openai_models = openai_models["data"]
+
+    if app.state.config.ENABLE_OLLAMA_API:
+        ollama_models = await get_ollama_models()
+
+        ollama_models = [
+            {
+                "id": model["model"],
+                "name": model["name"],
+                "object": "model",
+                "created": int(time.time()),
+                "owned_by": "ollama",
+                "ollama": model,
+            }
+            for model in ollama_models["models"]
+        ]
+
+    models = openai_models + ollama_models
+    custom_models = Models.get_all_models()
+
+    for custom_model in custom_models:
+        if custom_model.base_model_id == None:
+            for model in models:
+                if (
+                    custom_model.id == model["id"]
+                    or custom_model.id == model["id"].split(":")[0]
+                ):
+                    model["name"] = custom_model.name
+                    model["info"] = custom_model.model_dump()
+        else:
+            owned_by = "openai"
+            for model in models:
+                if (
+                    custom_model.base_model_id == model["id"]
+                    or custom_model.base_model_id == model["id"].split(":")[0]
+                ):
+                    owned_by = model["owned_by"]
+                    break
+
+            models.append(
+                {
+                    "id": custom_model.id,
+                    "name": custom_model.name,
+                    "object": "model",
+                    "created": custom_model.created_at,
+                    "owned_by": owned_by,
+                    "info": custom_model.model_dump(),
+                    "preset": True,
+                }
+            )
+
+    app.state.MODELS = {model["id"]: model for model in models}
+
+    webui_app.state.MODELS = app.state.MODELS
+
+    return models
+
+
+@app.get("/api/models")
+async def get_models(user=Depends(get_verified_user)):
+    models = await get_all_models()
+    if app.state.config.ENABLE_MODEL_FILTER:
+        if user.role == "user":
+            models = list(
+                filter(
+                    lambda model: model["id"] in app.state.config.MODEL_FILTER_LIST,
+                    models,
+                )
+            )
+            return {"data": models}
+
+    return {"data": models}
+
+
 @app.get("/api/config")
 async def get_app_config():
     # Checking and Handling the Absence of 'ui' in CONFIG_DATA

+ 74 - 0
backend/utils/misc.py

@@ -1,5 +1,6 @@
 from pathlib import Path
 import hashlib
+import json
 import re
 from datetime import timedelta
 from typing import Optional
@@ -110,3 +111,76 @@ def parse_duration(duration: str) -> Optional[timedelta]:
             total_duration += timedelta(weeks=number)
 
     return total_duration
+
+
+def parse_ollama_modelfile(model_text):
+    parameters_meta = {
+        "mirostat": int,
+        "mirostat_eta": float,
+        "mirostat_tau": float,
+        "num_ctx": int,
+        "repeat_last_n": int,
+        "repeat_penalty": float,
+        "temperature": float,
+        "seed": int,
+        "stop": str,
+        "tfs_z": float,
+        "num_predict": int,
+        "top_k": int,
+        "top_p": float,
+    }
+
+    data = {"base_model_id": None, "params": {}}
+
+    # Parse base model
+    base_model_match = re.search(
+        r"^FROM\s+(\w+)", model_text, re.MULTILINE | re.IGNORECASE
+    )
+    if base_model_match:
+        data["base_model_id"] = base_model_match.group(1)
+
+    # Parse template
+    template_match = re.search(
+        r'TEMPLATE\s+"""(.+?)"""', model_text, re.DOTALL | re.IGNORECASE
+    )
+    if template_match:
+        data["params"] = {"template": template_match.group(1).strip()}
+
+    # Parse stops
+    stops = re.findall(r'PARAMETER stop "(.*?)"', model_text, re.IGNORECASE)
+    if stops:
+        data["params"]["stop"] = stops
+
+    # Parse other parameters from the provided list
+    for param, param_type in parameters_meta.items():
+        param_match = re.search(rf"PARAMETER {param} (.+)", model_text, re.IGNORECASE)
+        if param_match:
+            value = param_match.group(1)
+            if param_type == int:
+                value = int(value)
+            elif param_type == float:
+                value = float(value)
+            data["params"][param] = value
+
+    # Parse adapter
+    adapter_match = re.search(r"ADAPTER (.+)", model_text, re.IGNORECASE)
+    if adapter_match:
+        data["params"]["adapter"] = adapter_match.group(1)
+
+    # Parse system description
+    system_desc_match = re.search(
+        r'SYSTEM\s+"""(.+?)"""', model_text, re.DOTALL | re.IGNORECASE
+    )
+    if system_desc_match:
+        data["params"]["system"] = system_desc_match.group(1).strip()
+
+    # Parse messages
+    messages = []
+    message_matches = re.findall(r"MESSAGE (\w+) (.+)", model_text, re.IGNORECASE)
+    for role, content in message_matches:
+        messages.append({"role": role, "content": content})
+
+    if messages:
+        data["params"]["messages"] = messages
+
+    return data

+ 10 - 0
backend/utils/models.py

@@ -0,0 +1,10 @@
+from apps.web.models.models import Models, ModelModel, ModelForm, ModelResponse
+
+
+def get_model_id_from_custom_model_id(id: str):
+    model = Models.get_model_by_id(id)
+
+    if model:
+        return model.id
+    else:
+        return id

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

@@ -1,5 +1,54 @@
 import { WEBUI_BASE_URL } from '$lib/constants';
 
+export const getModels = async (token: string = '') => {
+	let error = null;
+
+	const res = await fetch(`${WEBUI_BASE_URL}/api/models`, {
+		method: 'GET',
+		headers: {
+			Accept: 'application/json',
+			'Content-Type': 'application/json',
+			...(token && { 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;
+	}
+
+	let models = res?.data ?? [];
+
+	models = models
+		.filter((models) => models)
+		.sort((a, b) => {
+			// Compare case-insensitively
+			const lowerA = a.name.toLowerCase();
+			const lowerB = b.name.toLowerCase();
+
+			if (lowerA < lowerB) return -1;
+			if (lowerA > lowerB) return 1;
+
+			// If same case-insensitively, sort by original strings,
+			// lowercase will come before uppercase due to ASCII values
+			if (a < b) return -1;
+			if (a > b) return 1;
+
+			return 0; // They are equal
+		});
+
+	console.log(models);
+	return models;
+};
+
 export const getBackendConfig = async () => {
 	let error = null;
 
@@ -196,3 +245,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;
+	capabilities?: object;
+}
+
+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);

+ 17 - 32
src/lib/apis/modelfiles/index.ts → src/lib/apis/models/index.ts

@@ -1,18 +1,16 @@
 import { WEBUI_API_BASE_URL } from '$lib/constants';
 
-export const createNewModelfile = async (token: string, modelfile: object) => {
+export const addNewModel = async (token: string, model: object) => {
 	let error = null;
 
-	const res = await fetch(`${WEBUI_API_BASE_URL}/modelfiles/create`, {
+	const res = await fetch(`${WEBUI_API_BASE_URL}/models/add`, {
 		method: 'POST',
 		headers: {
 			Accept: 'application/json',
 			'Content-Type': 'application/json',
 			authorization: `Bearer ${token}`
 		},
-		body: JSON.stringify({
-			modelfile: modelfile
-		})
+		body: JSON.stringify(model)
 	})
 		.then(async (res) => {
 			if (!res.ok) throw await res.json();
@@ -31,10 +29,10 @@ export const createNewModelfile = async (token: string, modelfile: object) => {
 	return res;
 };
 
-export const getModelfiles = async (token: string = '') => {
+export const getModelInfos = async (token: string = '') => {
 	let error = null;
 
-	const res = await fetch(`${WEBUI_API_BASE_URL}/modelfiles/`, {
+	const res = await fetch(`${WEBUI_API_BASE_URL}/models/`, {
 		method: 'GET',
 		headers: {
 			Accept: 'application/json',
@@ -59,22 +57,19 @@ export const getModelfiles = async (token: string = '') => {
 		throw error;
 	}
 
-	return res.map((modelfile) => modelfile.modelfile);
+	return res;
 };
 
-export const getModelfileByTagName = async (token: string, tagName: string) => {
+export const getModelById = async (token: string, id: string) => {
 	let error = null;
 
-	const res = await fetch(`${WEBUI_API_BASE_URL}/modelfiles/`, {
-		method: 'POST',
+	const res = await fetch(`${WEBUI_API_BASE_URL}/models/${id}`, {
+		method: 'GET',
 		headers: {
 			Accept: 'application/json',
 			'Content-Type': 'application/json',
 			authorization: `Bearer ${token}`
-		},
-		body: JSON.stringify({
-			tag_name: tagName
-		})
+		}
 	})
 		.then(async (res) => {
 			if (!res.ok) throw await res.json();
@@ -94,27 +89,20 @@ export const getModelfileByTagName = async (token: string, tagName: string) => {
 		throw error;
 	}
 
-	return res.modelfile;
+	return res;
 };
 
-export const updateModelfileByTagName = async (
-	token: string,
-	tagName: string,
-	modelfile: object
-) => {
+export const updateModelById = async (token: string, id: string, model: object) => {
 	let error = null;
 
-	const res = await fetch(`${WEBUI_API_BASE_URL}/modelfiles/update`, {
+	const res = await fetch(`${WEBUI_API_BASE_URL}/models/${id}/update`, {
 		method: 'POST',
 		headers: {
 			Accept: 'application/json',
 			'Content-Type': 'application/json',
 			authorization: `Bearer ${token}`
 		},
-		body: JSON.stringify({
-			tag_name: tagName,
-			modelfile: modelfile
-		})
+		body: JSON.stringify(model)
 	})
 		.then(async (res) => {
 			if (!res.ok) throw await res.json();
@@ -137,19 +125,16 @@ export const updateModelfileByTagName = async (
 	return res;
 };
 
-export const deleteModelfileByTagName = async (token: string, tagName: string) => {
+export const deleteModelById = async (token: string, id: string) => {
 	let error = null;
 
-	const res = await fetch(`${WEBUI_API_BASE_URL}/modelfiles/delete`, {
+	const res = await fetch(`${WEBUI_API_BASE_URL}/models/${id}/delete`, {
 		method: 'DELETE',
 		headers: {
 			Accept: 'application/json',
 			'Content-Type': 'application/json',
 			authorization: `Bearer ${token}`
-		},
-		body: JSON.stringify({
-			tag_name: tagName
-		})
+		}
 	})
 		.then(async (res) => {
 			if (!res.ok) throw await res.json();

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

@@ -231,7 +231,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);
 				})

+ 109 - 113
src/lib/components/chat/Chat.svelte

@@ -10,7 +10,7 @@
 		chatId,
 		chats,
 		config,
-		modelfiles,
+		type Model,
 		models,
 		settings,
 		showSidebar,
@@ -65,28 +65,10 @@
 	let showModelSelector = true;
 
 	let selectedModels = [''];
-	let atSelectedModel = '';
+	let atSelectedModel: Model | undefined;
 
 	let useWebSearch = false;
 
-	let selectedModelfile = null;
-	$: selectedModelfile =
-		selectedModels.length === 1 &&
-		$modelfiles.filter((modelfile) => modelfile.tagName === selectedModels[0]).length > 0
-			? $modelfiles.filter((modelfile) => modelfile.tagName === selectedModels[0])[0]
-			: null;
-
-	let selectedModelfiles = {};
-	$: selectedModelfiles = selectedModels.reduce((a, tagName, i, arr) => {
-		const modelfile =
-			$modelfiles.filter((modelfile) => modelfile.tagName === tagName)?.at(0) ?? undefined;
-
-		return {
-			...a,
-			...(modelfile && { [tagName]: modelfile })
-		};
-	}, {});
-
 	let chat = null;
 	let tags = [];
 
@@ -171,6 +153,7 @@
 
 		if ($page.url.searchParams.get('q')) {
 			prompt = $page.url.searchParams.get('q') ?? '';
+
 			if (prompt) {
 				await tick();
 				submitPrompt(prompt);
@@ -218,7 +201,7 @@
 				await settings.set({
 					..._settings,
 					system: chatContent.system ?? _settings.system,
-					options: chatContent.options ?? _settings.options
+					params: chatContent.options ?? _settings.params
 				});
 				autoScroll = true;
 				await tick();
@@ -307,7 +290,7 @@
 						models: selectedModels,
 						system: $settings.system ?? undefined,
 						options: {
-							...($settings.options ?? {})
+							...($settings.params ?? {})
 						},
 						messages: messages,
 						history: history,
@@ -324,6 +307,7 @@
 
 			// Reset chat input textarea
 			prompt = '';
+			document.getElementById('chat-textarea').style.height = '';
 			files = [];
 
 			// Send prompt
@@ -335,79 +319,96 @@
 		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
-							];
-						}
+			(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')
+					);
 
-						await tick();
+					if (hasImages && !(model.info?.meta?.capabilities?.vision ?? true)) {
+						toast.error(
+							$i18n.t('Model {{modelName}} is not vision capable', {
+								modelName: 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.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 (useWebSearch) {
-							await runWebSearchForPrompt(model.id, parentId, responseMessageId);
-						}
+					if (useWebSearch) {
+						await runWebSearchForPrompt(model.id, parentId, responseMessageId);
+					}
 
-						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?.owned_by === 'openai') {
+						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));
@@ -476,7 +477,7 @@
 				// Prepare the base message object
 				const baseMessage = {
 					role: message.role,
-					content: arr.length - 2 !== idx ? message.content : message?.raContent ?? message.content
+					content: message.content
 				};
 
 				// Extract and format image URLs if any exist
@@ -488,7 +489,6 @@
 				if (imageUrls && imageUrls.length > 0 && message.role === 'user') {
 					baseMessage.images = imageUrls;
 				}
-
 				return baseMessage;
 			});
 
@@ -519,13 +519,15 @@
 			model: model,
 			messages: messagesBody,
 			options: {
-				...($settings.options ?? {}),
+				...($settings.params ?? {}),
 				stop:
-					$settings?.options?.stop ?? undefined
-						? $settings.options.stop.map((str) =>
+					$settings?.params?.stop ?? undefined
+						? $settings.params.stop.map((str) =>
 								decodeURIComponent(JSON.parse('"' + str.replace(/\"/g, '\\"') + '"'))
 						  )
-						: undefined
+						: undefined,
+				num_predict: $settings?.params?.max_tokens ?? undefined,
+				repeat_penalty: $settings?.params?.frequency_penalty ?? undefined
 			},
 			format: $settings.requestFormat ?? undefined,
 			keep_alive: $settings.keepAlive ?? undefined,
@@ -651,7 +653,8 @@
 				if ($settings.saveChatHistory ?? true) {
 					chat = await updateChatById(localStorage.token, _chatId, {
 						messages: messages,
-						history: history
+						history: history,
+						models: selectedModels
 					});
 					await chats.set(await getChatList(localStorage.token));
 				}
@@ -762,18 +765,17 @@
 												: message?.raContent ?? message.content
 								  })
 						})),
-					seed: $settings?.options?.seed ?? undefined,
+					seed: $settings?.params?.seed ?? undefined,
 					stop:
-						$settings?.options?.stop ?? undefined
-							? $settings.options.stop.map((str) =>
+						$settings?.params?.stop ?? undefined
+							? $settings.params.stop.map((str) =>
 									decodeURIComponent(JSON.parse('"' + str.replace(/\"/g, '\\"') + '"'))
 							  )
 							: undefined,
-					temperature: $settings?.options?.temperature ?? undefined,
-					top_p: $settings?.options?.top_p ?? undefined,
-					num_ctx: $settings?.options?.num_ctx ?? undefined,
-					frequency_penalty: $settings?.options?.repeat_penalty ?? undefined,
-					max_tokens: $settings?.options?.num_predict ?? undefined,
+					temperature: $settings?.params?.temperature ?? undefined,
+					top_p: $settings?.params?.top_p ?? undefined,
+					frequency_penalty: $settings?.params?.frequency_penalty ?? undefined,
+					max_tokens: $settings?.params?.max_tokens ?? undefined,
 					docs: docs.length > 0 ? docs : undefined,
 					citations: docs.length > 0
 				},
@@ -843,6 +845,7 @@
 				if ($chatId == _chatId) {
 					if ($settings.saveChatHistory ?? true) {
 						chat = await updateChatById(localStorage.token, _chatId, {
+							models: selectedModels,
 							messages: messages,
 							history: history
 						});
@@ -981,10 +984,8 @@
 					) + ' {{prompt}}',
 				titleModelId,
 				userPrompt,
-				titleModel?.external ?? false
-					? titleModel?.source?.toLowerCase() === 'litellm'
-						? `${LITELLM_API_BASE_URL}/v1`
-						: `${OPENAI_API_BASE_URL}`
+				titleModel?.owned_by === 'openai' ?? false
+					? `${OPENAI_API_BASE_URL}`
 					: `${OLLAMA_API_BASE_URL}/v1`
 			);
 
@@ -1011,10 +1012,8 @@
 			taskModelId,
 			previousMessages,
 			userPrompt,
-			taskModel?.external ?? false
-				? taskModel?.source?.toLowerCase() === 'litellm'
-					? `${LITELLM_API_BASE_URL}/v1`
-					: `${OPENAI_API_BASE_URL}`
+			taskModel?.owned_by === 'openai' ?? false
+				? `${OPENAI_API_BASE_URL}`
 				: `${OLLAMA_API_BASE_URL}/v1`
 		);
 	};
@@ -1096,16 +1095,12 @@
 					<Messages
 						chatId={$chatId}
 						{selectedModels}
-						{selectedModelfiles}
 						{processing}
 						bind:history
 						bind:messages
 						bind:autoScroll
 						bind:prompt
 						bottomPadding={files.length > 0}
-						suggestionPrompts={chatIdProp
-							? []
-							: selectedModelfile?.suggestionPrompts ?? $config.default_prompt_suggestions}
 						{sendPrompt}
 						{continueGeneration}
 						{regenerateResponse}
@@ -1119,8 +1114,9 @@
 		bind:files
 		bind:prompt
 		bind:autoScroll
-		bind:selectedModel={atSelectedModel}
 		bind:useWebSearch
+		bind:atSelectedModel
+		{selectedModels}
 		{messages}
 		{submitPrompt}
 		{stopResponse}

+ 60 - 13
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, settings, showSidebar, models } from '$lib/stores';
 	import { blobToFile, calculateSHA256, findWordIndices } from '$lib/utils';
 
 	import {
@@ -27,7 +27,9 @@
 	export let stopResponse: Function;
 
 	export let autoScroll = true;
-	export let selectedModel = '';
+
+	export let atSelectedModel: Model | undefined;
+	export let selectedModels: [''];
 
 	let chatTextAreaElement: HTMLTextAreaElement;
 	let filesInputElement;
@@ -55,6 +57,11 @@
 
 	let speechRecognition;
 
+	let visionCapableModels = [];
+	$: visionCapableModels = [...(atSelectedModel ? [atSelectedModel] : selectedModels)].filter(
+		(model) => $models.find((m) => m.id === model)?.info?.meta?.capabilities?.vision ?? true
+	);
+
 	$: if (prompt) {
 		if (chatTextAreaElement) {
 			chatTextAreaElement.style.height = '';
@@ -361,6 +368,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 (visionCapableModels.length === 0) {
+								toast.error($i18n.t('Selected model(s) do not support image inputs'));
+								return;
+							}
 							let reader = new FileReader();
 							reader.onload = (event) => {
 								files = [
@@ -432,8 +443,8 @@
 
 <div class="fixed bottom-0 {$showSidebar ? 'left-0 md:left-[260px]' : 'left-0'} right-0">
 	<div class="w-full">
-		<div class="px-2.5 md:px-16 -mb-0.5 mx-auto inset-x-0 bg-transparent flex justify-center">
-			<div class="flex flex-col max-w-5xl w-full">
+		<div class=" -mb-0.5 mx-auto inset-x-0 bg-transparent flex justify-center">
+			<div class="flex flex-col max-w-6xl px-2.5 md:px-6 w-full">
 				<div class="relative">
 					{#if autoScroll === false && messages.length > 0}
 						<div class=" absolute -top-12 left-0 right-0 flex justify-center z-30">
@@ -497,12 +508,12 @@
 						bind:chatInputPlaceholder
 						{messages}
 						on:select={(e) => {
-							selectedModel = e.detail;
+							atSelectedModel = e.detail;
 							chatTextAreaElement?.focus();
 						}}
 					/>
 
-					{#if selectedModel !== ''}
+					{#if atSelectedModel !== 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"
 						>
@@ -511,21 +522,21 @@
 									crossorigin="anonymous"
 									alt="model profile"
 									class="size-5 max-w-[28px] object-cover rounded-full"
-									src={$modelfiles.find((modelfile) => modelfile.tagName === selectedModel.id)
-										?.imageUrl ??
+									src={$models.find((model) => model.id === atSelectedModel.id)?.info?.meta
+										?.profile_image_url ??
 										($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">{atSelectedModel.name}</span>
 								</div>
 							</div>
 							<div>
 								<button
 									class="flex items-center"
 									on:click={() => {
-										selectedModel = '';
+										atSelectedModel = undefined;
 									}}
 								>
 									<XMark />
@@ -538,7 +549,7 @@
 		</div>
 
 		<div class="bg-white dark:bg-gray-900">
-			<div class="max-w-6xl px-2.5 md:px-16 mx-auto inset-x-0">
+			<div class="max-w-6xl px-2.5 md:px-6 mx-auto inset-x-0">
 				<div class=" pb-2">
 					<input
 						bind:this={filesInputElement}
@@ -553,6 +564,12 @@
 									if (
 										['image/gif', 'image/webp', 'image/jpeg', 'image/png'].includes(file['type'])
 									) {
+										if (visionCapableModels.length === 0) {
+											toast.error($i18n.t('Selected model(s) do not support image inputs'));
+											inputFiles = null;
+											filesInputElement.value = '';
+											return;
+										}
 										let reader = new FileReader();
 										reader.onload = (event) => {
 											files = [
@@ -592,6 +609,7 @@
 						dir={$settings?.chatDirection ?? 'LTR'}
 						class=" flex flex-col relative w-full rounded-3xl px-1.5 bg-gray-50 dark:bg-gray-850 dark:text-gray-100"
 						on:submit|preventDefault={() => {
+							// check if selectedModels support image input
 							submitPrompt(prompt, user);
 						}}
 					>
@@ -600,7 +618,36 @@
 								{#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 atSelectedModel ? visionCapableModels.length === 0 : selectedModels.length !== visionCapableModels.length}
+													<Tooltip
+														className=" absolute top-1 left-1"
+														content={$i18n.t('{{ models }}', {
+															models: [...(atSelectedModel ? [atSelectedModel] : selectedModels)]
+																.filter((id) => !visionCapableModels.includes(id))
+																.join(', ')
+														})}
+													>
+														<svg
+															xmlns="http://www.w3.org/2000/svg"
+															viewBox="0 0 24 24"
+															fill="currentColor"
+															class="size-4 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"
@@ -886,7 +933,7 @@
 
 									if (e.key === 'Escape') {
 										console.log('Escape');
-										selectedModel = '';
+										atSelectedModel = undefined;
 									}
 								}}
 								rows="1"

+ 2 - 8
src/lib/components/chat/Messages.svelte

@@ -1,7 +1,7 @@
 <script lang="ts">
 	import { v4 as uuidv4 } from 'uuid';
 
-	import { chats, config, modelfiles, settings, user as _user, mobile } from '$lib/stores';
+	import { chats, config, settings, user as _user, mobile } from '$lib/stores';
 	import { tick, getContext } from 'svelte';
 
 	import { toast } from 'svelte-sonner';
@@ -26,7 +26,6 @@
 
 	export let user = $_user;
 	export let prompt;
-	export let suggestionPrompts = [];
 	export let processing = '';
 	export let bottomPadding = false;
 	export let autoScroll;
@@ -34,7 +33,6 @@
 	export let messages = [];
 
 	export let selectedModels;
-	export let selectedModelfiles = [];
 
 	$: if (autoScroll && bottomPadding) {
 		(async () => {
@@ -247,9 +245,7 @@
 <div class="h-full flex mb-16">
 	{#if messages.length == 0}
 		<Placeholder
-			models={selectedModels}
-			modelfiles={selectedModelfiles}
-			{suggestionPrompts}
+			modelIds={selectedModels}
 			submitPrompt={async (p) => {
 				let text = p;
 
@@ -316,7 +312,6 @@
 								{#key message.id}
 									<ResponseMessage
 										{message}
-										modelfiles={selectedModelfiles}
 										siblings={history.messages[message.parentId]?.childrenIds ?? []}
 										isLastMessage={messageIdx + 1 === messages.length}
 										{readOnly}
@@ -348,7 +343,6 @@
 										{chatId}
 										parentMessage={history.messages[message.parentId]}
 										{messageIdx}
-										{selectedModelfiles}
 										{updateChatMessages}
 										{confirmEditResponseMessage}
 										{rateMessage}

+ 54 - 53
src/lib/components/chat/Messages/CodeBlock.svelte

@@ -4,7 +4,7 @@
 	import hljs from 'highlight.js';
 	import 'highlight.js/styles/github-dark.min.css';
 	import { loadPyodide } from 'pyodide';
-	import { tick } from 'svelte';
+	import { onMount, tick } from 'svelte';
 	import PyodideWorker from '$lib/workers/pyodide.worker?worker';
 
 	export let id = '';
@@ -12,6 +12,7 @@
 	export let lang = '';
 	export let code = '';
 
+	let highlightedCode = null;
 	let executing = false;
 
 	let stdout = null;
@@ -202,60 +203,60 @@ __builtins__.input = input`);
 		};
 	};
 
-	$: highlightedCode = code ? hljs.highlightAuto(code, hljs.getLanguage(lang)?.aliases).value : '';
+	$: if (code) {
+		highlightedCode = hljs.highlightAuto(code, hljs.getLanguage(lang)?.aliases).value || code;
+	}
 </script>
 
-{#if code}
-	<div class="mb-4" dir="ltr">
-		<div
-			class="flex justify-between bg-[#202123] text-white text-xs px-4 pt-1 pb-0.5 rounded-t-lg overflow-x-auto"
-		>
-			<div class="p-1">{@html lang}</div>
-
-			<div class="flex items-center">
-				{#if lang === 'python' || (lang === '' && checkPythonCode(code))}
-					{#if executing}
-						<div class="copy-code-button bg-none border-none p-1 cursor-not-allowed">Running</div>
-					{:else}
-						<button
-							class="copy-code-button bg-none border-none p-1"
-							on:click={() => {
-								executePython(code);
-							}}>Run</button
-						>
-					{/if}
+<div class="mb-4" dir="ltr">
+	<div
+		class="flex justify-between bg-[#202123] text-white text-xs px-4 pt-1 pb-0.5 rounded-t-lg overflow-x-auto"
+	>
+		<div class="p-1">{@html lang}</div>
+
+		<div class="flex items-center">
+			{#if lang === 'python' || (lang === '' && checkPythonCode(code))}
+				{#if executing}
+					<div class="copy-code-button bg-none border-none p-1 cursor-not-allowed">Running</div>
+				{:else}
+					<button
+						class="copy-code-button bg-none border-none p-1"
+						on:click={() => {
+							executePython(code);
+						}}>Run</button
+					>
 				{/if}
-				<button class="copy-code-button bg-none border-none p-1" on:click={copyCode}
-					>{copied ? 'Copied' : 'Copy Code'}</button
-				>
-			</div>
+			{/if}
+			<button class="copy-code-button bg-none border-none p-1" on:click={copyCode}
+				>{copied ? 'Copied' : 'Copy Code'}</button
+			>
 		</div>
-
-		<pre
-			class=" hljs p-4 px-5 overflow-x-auto"
-			style="border-top-left-radius: 0px; border-top-right-radius: 0px; {(executing ||
-				stdout ||
-				stderr ||
-				result) &&
-				'border-bottom-left-radius: 0px; border-bottom-right-radius: 0px;'}"><code
-				class="language-{lang} rounded-t-none whitespace-pre">{@html highlightedCode || code}</code
-			></pre>
-
-		<div
-			id="plt-canvas-{id}"
-			class="bg-[#202123] text-white max-w-full overflow-x-auto scrollbar-hidden"
-		/>
-
-		{#if executing}
-			<div class="bg-[#202123] text-white px-4 py-4 rounded-b-lg">
-				<div class=" text-gray-500 text-xs mb-1">STDOUT/STDERR</div>
-				<div class="text-sm">Running...</div>
-			</div>
-		{:else if stdout || stderr || result}
-			<div class="bg-[#202123] text-white px-4 py-4 rounded-b-lg">
-				<div class=" text-gray-500 text-xs mb-1">STDOUT/STDERR</div>
-				<div class="text-sm">{stdout || stderr || result}</div>
-			</div>
-		{/if}
 	</div>
-{/if}
+
+	<pre
+		class=" hljs p-4 px-5 overflow-x-auto"
+		style="border-top-left-radius: 0px; border-top-right-radius: 0px; {(executing ||
+			stdout ||
+			stderr ||
+			result) &&
+			'border-bottom-left-radius: 0px; border-bottom-right-radius: 0px;'}"><code
+			class="language-{lang} rounded-t-none whitespace-pre">{@html highlightedCode || code}</code
+		></pre>
+
+	<div
+		id="plt-canvas-{id}"
+		class="bg-[#202123] text-white max-w-full overflow-x-auto scrollbar-hidden"
+	/>
+
+	{#if executing}
+		<div class="bg-[#202123] text-white px-4 py-4 rounded-b-lg">
+			<div class=" text-gray-500 text-xs mb-1">STDOUT/STDERR</div>
+			<div class="text-sm">Running...</div>
+		</div>
+	{:else if stdout || stderr || result}
+		<div class="bg-[#202123] text-white px-4 py-4 rounded-b-lg">
+			<div class=" text-gray-500 text-xs mb-1">STDOUT/STDERR</div>
+			<div class="text-sm">{stdout || stderr || result}</div>
+		</div>
+	{/if}
+</div>

+ 0 - 3
src/lib/components/chat/Messages/CompareMessages.svelte

@@ -13,8 +13,6 @@
 
 	export let parentMessage;
 
-	export let selectedModelfiles;
-
 	export let updateChatMessages: Function;
 	export let confirmEditResponseMessage: Function;
 	export let rateMessage: Function;
@@ -130,7 +128,6 @@
 				>
 					<ResponseMessage
 						message={groupedMessages[model].messages[groupedMessagesIdx[model]]}
-						modelfiles={selectedModelfiles}
 						siblings={groupedMessages[model].messages.map((m) => m.id)}
 						isLastMessage={true}
 						{updateChatMessages}

+ 36 - 37
src/lib/components/chat/Messages/Placeholder.svelte

@@ -1,6 +1,6 @@
 <script lang="ts">
 	import { WEBUI_BASE_URL } from '$lib/constants';
-	import { user } from '$lib/stores';
+	import { config, user, models as _models } from '$lib/stores';
 	import { onMount, getContext } from 'svelte';
 
 	import { blur, fade } from 'svelte/transition';
@@ -9,23 +9,20 @@
 
 	const i18n = getContext('i18n');
 
+	export let modelIds = [];
 	export let models = [];
-	export let modelfiles = [];
 
 	export let submitPrompt;
-	export let suggestionPrompts;
 
 	let mounted = false;
-	let modelfile = null;
 	let selectedModelIdx = 0;
 
-	$: modelfile =
-		models[selectedModelIdx] in modelfiles ? modelfiles[models[selectedModelIdx]] : null;
-
-	$: if (models.length > 0) {
+	$: if (modelIds.length > 0) {
 		selectedModelIdx = models.length - 1;
 	}
 
+	$: models = modelIds.map((id) => $_models.find((m) => m.id === id));
+
 	onMount(() => {
 		mounted = true;
 	});
@@ -41,25 +38,14 @@
 							selectedModelIdx = modelIdx;
 						}}
 					>
-						{#if model in modelfiles}
-							<img
-								crossorigin="anonymous"
-								src={modelfiles[model]?.imageUrl ?? `${WEBUI_BASE_URL}/static/favicon.png`}
-								alt="modelfile"
-								class=" size-[2.7rem] rounded-full border-[1px] border-gray-200 dark:border-none"
-								draggable="false"
-							/>
-						{:else}
-							<img
-								crossorigin="anonymous"
-								src={$i18n.language === 'dg-DG'
-									? `/doge.png`
-									: `${WEBUI_BASE_URL}/static/favicon.png`}
-								class=" size-[2.7rem] rounded-full border-[1px] border-gray-200 dark:border-none"
-								alt="logo"
-								draggable="false"
-							/>
-						{/if}
+						<img
+							crossorigin="anonymous"
+							src={model?.info?.meta?.profile_image_url ??
+								($i18n.language === 'dg-DG' ? `/doge.png` : `${WEBUI_BASE_URL}/static/favicon.png`)}
+							class=" size-[2.7rem] rounded-full border-[1px] border-gray-200 dark:border-none"
+							alt="logo"
+							draggable="false"
+						/>
 					</button>
 				{/each}
 			</div>
@@ -70,23 +56,32 @@
 		>
 			<div>
 				<div class=" capitalize line-clamp-1" in:fade={{ duration: 200 }}>
-					{#if modelfile}
-						{modelfile.title}
+					{#if models[selectedModelIdx]?.info}
+						{models[selectedModelIdx]?.info?.name}
 					{:else}
 						{$i18n.t('Hello, {{name}}', { name: $user.name })}
 					{/if}
 				</div>
 
 				<div in:fade={{ duration: 200, delay: 200 }}>
-					{#if modelfile}
-						<div class="mt-0.5 text-base font-normal text-gray-500 dark:text-gray-400">
-							{modelfile.desc}
+					{#if models[selectedModelIdx]?.info}
+						<div class="mt-0.5 text-base font-normal text-gray-500 dark:text-gray-400 line-clamp-3">
+							{models[selectedModelIdx]?.info?.meta?.description}
 						</div>
-						{#if modelfile.user}
+						{#if models[selectedModelIdx]?.info?.meta?.user}
 							<div class="mt-0.5 text-sm font-normal text-gray-400 dark:text-gray-500">
-								By <a href="https://openwebui.com/m/{modelfile.user.username}"
-									>{modelfile.user.name ? modelfile.user.name : `@${modelfile.user.username}`}</a
-								>
+								By
+								{#if models[selectedModelIdx]?.info?.meta?.user.community}
+									<a
+										href="https://openwebui.com/m/{models[selectedModelIdx]?.info?.meta?.user
+											.username}"
+										>{models[selectedModelIdx]?.info?.meta?.user.name
+											? models[selectedModelIdx]?.info?.meta?.user.name
+											: `@${models[selectedModelIdx]?.info?.meta?.user.username}`}</a
+									>
+								{:else}
+									{models[selectedModelIdx]?.info?.meta?.user.name}
+								{/if}
 							</div>
 						{/if}
 					{:else}
@@ -99,7 +94,11 @@
 		</div>
 
 		<div class=" w-full" in:fade={{ duration: 200, delay: 300 }}>
-			<Suggestions {suggestionPrompts} {submitPrompt} />
+			<Suggestions
+				suggestionPrompts={models[selectedModelIdx]?.info?.meta?.suggestion_prompts ??
+					$config.default_prompt_suggestions}
+				{submitPrompt}
+			/>
 		</div>
 	</div>
 {/key}

+ 8 - 10
src/lib/components/chat/Messages/ResponseMessage.svelte

@@ -14,7 +14,7 @@
 
 	const dispatch = createEventDispatcher();
 
-	import { config, settings } from '$lib/stores';
+	import { config, models, settings } from '$lib/stores';
 	import { synthesizeOpenAISpeech } from '$lib/apis/audio';
 	import { imageGenerations } from '$lib/apis/images';
 	import {
@@ -34,7 +34,6 @@
 	import RateComment from './RateComment.svelte';
 	import CitationsModal from '$lib/components/chat/Messages/CitationsModal.svelte';
 
-	export let modelfiles = [];
 	export let message;
 	export let siblings;
 
@@ -52,6 +51,9 @@
 	export let continueGeneration: Function;
 	export let regenerateResponse: Function;
 
+	let model = null;
+	$: model = $models.find((m) => m.id === message.model);
+
 	let edit = false;
 	let editedContent = '';
 	let editTextAreaElement: HTMLTextAreaElement;
@@ -338,17 +340,13 @@
 		dir={$settings.chatDirection}
 	>
 		<ProfileImage
-			src={modelfiles[message.model]?.imageUrl ??
+			src={model?.info?.meta?.profile_image_url ??
 				($i18n.language === 'dg-DG' ? `/doge.png` : `${WEBUI_BASE_URL}/static/favicon.png`)}
 		/>
 
 		<div class="w-full overflow-hidden pl-1">
 			<Name>
-				{#if message.model in modelfiles}
-					{modelfiles[message.model]?.title}
-				{:else}
-					{message.model ? ` ${message.model}` : ''}
-				{/if}
+				{model?.name ?? message.model}
 
 				{#if message.timestamp}
 					<span
@@ -541,8 +539,8 @@
 									{#if token.type === 'code'}
 										<CodeBlock
 											id={`${message.id}-${tokenIdx}`}
-											lang={token.lang}
-											code={revertSanitizedResponseContent(token.text)}
+											lang={token?.lang ?? ''}
+											code={revertSanitizedResponseContent(token?.text ?? '')}
 										/>
 									{:else}
 										{@html marked.parse(token.raw, {

+ 4 - 9
src/lib/components/chat/Messages/UserMessage.svelte

@@ -4,7 +4,7 @@
 	import { tick, createEventDispatcher, getContext } from 'svelte';
 	import Name from './Name.svelte';
 	import ProfileImage from './ProfileImage.svelte';
-	import { modelfiles, settings } from '$lib/stores';
+	import { models, settings } from '$lib/stores';
 	import Tooltip from '$lib/components/common/Tooltip.svelte';
 
 	import { user as _user } from '$lib/stores';
@@ -60,8 +60,7 @@
 	{#if !($settings?.chatBubble ?? true)}
 		<ProfileImage
 			src={message.user
-				? $modelfiles.find((modelfile) => modelfile.tagName === message.user)?.imageUrl ??
-				  '/user.png'
+				? $models.find((m) => m.id === message.user)?.info?.meta?.profile_image_url ?? '/user.png'
 				: user?.profile_image_url ?? '/user.png'}
 		/>
 	{/if}
@@ -70,12 +69,8 @@
 			<div>
 				<Name>
 					{#if message.user}
-						{#if $modelfiles.map((modelfile) => modelfile.tagName).includes(message.user)}
-							{$modelfiles.find((modelfile) => modelfile.tagName === message.user)?.title}
-						{:else}
-							{$i18n.t('You')}
-							<span class=" text-gray-500 text-sm font-medium">{message?.user ?? ''}</span>
-						{/if}
+						{$i18n.t('You')}
+						<span class=" text-gray-500 text-sm font-medium">{message?.user ?? ''}</span>
 					{:else if $settings.showUsername || $_user.name !== user.name}
 						{user.name}
 					{:else}

+ 5 - 7
src/lib/components/chat/ModelSelector.svelte

@@ -45,13 +45,11 @@
 				<div class="mr-1 max-w-full">
 					<Selector
 						placeholder={$i18n.t('Select a model')}
-						items={$models
-							.filter((model) => model.name !== 'hr')
-							.map((model) => ({
-								value: model.id,
-								label: model.name,
-								info: model
-							}))}
+						items={$models.map((model) => ({
+							value: model.id,
+							label: model.name,
+							model: model
+						}))}
 						bind:value={selectedModel}
 					/>
 				</div>

+ 43 - 18
src/lib/components/chat/ModelSelector/Selector.svelte

@@ -12,7 +12,9 @@
 
 	import { user, MODEL_DOWNLOAD_POOL, models, mobile } from '$lib/stores';
 	import { toast } from 'svelte-sonner';
-	import { capitalizeFirstLetter, getModels, splitStream } from '$lib/utils';
+	import { capitalizeFirstLetter, sanitizeResponseContent, splitStream } from '$lib/utils';
+	import { getModels } from '$lib/apis';
+
 	import Tooltip from '$lib/components/common/Tooltip.svelte';
 
 	const i18n = getContext('i18n');
@@ -23,7 +25,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]';
 
@@ -239,19 +246,37 @@
 						}}
 					>
 						<div class="flex items-center gap-2">
-							<div class="line-clamp-1">
-								{item.label}
-
-								<span class=" text-xs font-medium text-gray-600 dark:text-gray-400"
-									>{item.info?.details?.parameter_size ?? ''}</span
-								>
+							<div class="flex items-center">
+								<div class="line-clamp-1">
+									{item.label}
+								</div>
+								{#if item.model.owned_by === 'ollama' && (item.model.ollama?.details?.parameter_size ?? '') !== ''}
+									<div class="flex ml-1 items-center">
+										<Tooltip
+											content={`${
+												item.model.ollama?.details?.quantization_level
+													? item.model.ollama?.details?.quantization_level + ' '
+													: ''
+											}${
+												item.model.ollama?.size
+													? `(${(item.model.ollama?.size / 1024 ** 3).toFixed(1)}GB)`
+													: ''
+											}`}
+											className="self-end"
+										>
+											<span class=" text-xs font-medium text-gray-600 dark:text-gray-400"
+												>{item.model.ollama?.details?.parameter_size ?? ''}</span
+											>
+										</Tooltip>
+									</div>
+								{/if}
 							</div>
 
 							<!-- {JSON.stringify(item.info)} -->
 
-							{#if item.info.external}
-								<Tooltip content={item.info?.source ?? 'External'}>
-									<div class=" mr-2">
+							{#if item.model.owned_by === 'openai'}
+								<Tooltip content={`${'External'}`}>
+									<div class="">
 										<svg
 											xmlns="http://www.w3.org/2000/svg"
 											viewBox="0 0 16 16"
@@ -271,15 +296,15 @@
 										</svg>
 									</div>
 								</Tooltip>
-							{:else}
+							{/if}
+
+							{#if item.model?.info?.meta?.description}
 								<Tooltip
-									content={`${
-										item.info?.details?.quantization_level
-											? item.info?.details?.quantization_level + ' '
-											: ''
-									}${item.info.size ? `(${(item.info.size / 1024 ** 3).toFixed(1)}GB)` : ''}`}
+									content={`${sanitizeResponseContent(
+										item.model?.info?.meta?.description
+									).replaceAll('\n', '<br>')}`}
 								>
-									<div class=" mr-2">
+									<div class="">
 										<svg
 											xmlns="http://www.w3.org/2000/svg"
 											fill="none"

+ 0 - 155
src/lib/components/chat/Settings/Advanced.svelte

@@ -1,155 +0,0 @@
-<script lang="ts">
-	import { createEventDispatcher, onMount, getContext } from 'svelte';
-	import AdvancedParams from './Advanced/AdvancedParams.svelte';
-
-	const i18n = getContext('i18n');
-	const dispatch = createEventDispatcher();
-
-	export let saveSettings: Function;
-
-	// Advanced
-	let requestFormat = '';
-	let keepAlive = null;
-
-	let options = {
-		// Advanced
-		seed: 0,
-		temperature: '',
-		repeat_penalty: '',
-		repeat_last_n: '',
-		mirostat: '',
-		mirostat_eta: '',
-		mirostat_tau: '',
-		top_k: '',
-		top_p: '',
-		stop: '',
-		tfs_z: '',
-		num_ctx: '',
-		num_predict: ''
-	};
-
-	const toggleRequestFormat = async () => {
-		if (requestFormat === '') {
-			requestFormat = 'json';
-		} else {
-			requestFormat = '';
-		}
-
-		saveSettings({ requestFormat: requestFormat !== '' ? requestFormat : undefined });
-	};
-
-	onMount(() => {
-		let settings = JSON.parse(localStorage.getItem('settings') ?? '{}');
-
-		requestFormat = settings.requestFormat ?? '';
-		keepAlive = settings.keepAlive ?? null;
-
-		options.seed = settings.seed ?? 0;
-		options.temperature = settings.temperature ?? '';
-		options.repeat_penalty = settings.repeat_penalty ?? '';
-		options.top_k = settings.top_k ?? '';
-		options.top_p = settings.top_p ?? '';
-		options.num_ctx = settings.num_ctx ?? '';
-		options = { ...options, ...settings.options };
-		options.stop = (settings?.options?.stop ?? []).join(',');
-	});
-</script>
-
-<div class="flex flex-col h-full justify-between text-sm">
-	<div class=" space-y-3 pr-1.5 overflow-y-scroll max-h-80">
-		<div class=" text-sm font-medium">{$i18n.t('Parameters')}</div>
-
-		<AdvancedParams bind:options />
-		<hr class=" dark:border-gray-700" />
-
-		<div class=" py-1 w-full justify-between">
-			<div class="flex w-full justify-between">
-				<div class=" self-center text-xs font-medium">{$i18n.t('Keep Alive')}</div>
-
-				<button
-					class="p-1 px-3 text-xs flex rounded transition"
-					type="button"
-					on:click={() => {
-						keepAlive = keepAlive === null ? '5m' : null;
-					}}
-				>
-					{#if keepAlive === null}
-						<span class="ml-2 self-center">{$i18n.t('Default')}</span>
-					{:else}
-						<span class="ml-2 self-center">{$i18n.t('Custom')}</span>
-					{/if}
-				</button>
-			</div>
-
-			{#if keepAlive !== null}
-				<div class="flex mt-1 space-x-2">
-					<input
-						class="w-full rounded-lg py-2 px-4 text-sm dark:text-gray-300 dark:bg-gray-850 outline-none"
-						type="text"
-						placeholder={$i18n.t("e.g. '30s','10m'. Valid time units are 's', 'm', 'h'.")}
-						bind:value={keepAlive}
-					/>
-				</div>
-			{/if}
-		</div>
-
-		<div>
-			<div class=" py-1 flex w-full justify-between">
-				<div class=" self-center text-sm font-medium">{$i18n.t('Request Mode')}</div>
-
-				<button
-					class="p-1 px-3 text-xs flex rounded transition"
-					on:click={() => {
-						toggleRequestFormat();
-					}}
-				>
-					{#if requestFormat === ''}
-						<span class="ml-2 self-center"> {$i18n.t('Default')} </span>
-					{:else if requestFormat === 'json'}
-						<!-- <svg
-                            xmlns="http://www.w3.org/2000/svg"
-                            viewBox="0 0 20 20"
-                            fill="currentColor"
-                            class="w-4 h-4 self-center"
-                        >
-                            <path
-                                d="M10 2a.75.75 0 01.75.75v1.5a.75.75 0 01-1.5 0v-1.5A.75.75 0 0110 2zM10 15a.75.75 0 01.75.75v1.5a.75.75 0 01-1.5 0v-1.5A.75.75 0 0110 15zM10 7a3 3 0 100 6 3 3 0 000-6zM15.657 5.404a.75.75 0 10-1.06-1.06l-1.061 1.06a.75.75 0 001.06 1.06l1.06-1.06zM6.464 14.596a.75.75 0 10-1.06-1.06l-1.06 1.06a.75.75 0 001.06 1.06l1.06-1.06zM18 10a.75.75 0 01-.75.75h-1.5a.75.75 0 010-1.5h1.5A.75.75 0 0118 10zM5 10a.75.75 0 01-.75.75h-1.5a.75.75 0 010-1.5h1.5A.75.75 0 015 10zM14.596 15.657a.75.75 0 001.06-1.06l-1.06-1.061a.75.75 0 10-1.06 1.06l1.06 1.06zM5.404 6.464a.75.75 0 001.06-1.06l-1.06-1.06a.75.75 0 10-1.061 1.06l1.06 1.06z"
-                            />
-                        </svg> -->
-						<span class="ml-2 self-center">{$i18n.t('JSON')}</span>
-					{/if}
-				</button>
-			</div>
-		</div>
-	</div>
-
-	<div class="flex justify-end pt-3 text-sm font-medium">
-		<button
-			class=" px-4 py-2 bg-emerald-700 hover:bg-emerald-800 text-gray-100 transition rounded-lg"
-			on:click={() => {
-				saveSettings({
-					options: {
-						seed: (options.seed !== 0 ? options.seed : undefined) ?? undefined,
-						stop: options.stop !== '' ? options.stop.split(',').filter((e) => e) : undefined,
-						temperature: options.temperature !== '' ? options.temperature : undefined,
-						repeat_penalty: options.repeat_penalty !== '' ? options.repeat_penalty : undefined,
-						repeat_last_n: options.repeat_last_n !== '' ? options.repeat_last_n : undefined,
-						mirostat: options.mirostat !== '' ? options.mirostat : undefined,
-						mirostat_eta: options.mirostat_eta !== '' ? options.mirostat_eta : undefined,
-						mirostat_tau: options.mirostat_tau !== '' ? options.mirostat_tau : undefined,
-						top_k: options.top_k !== '' ? options.top_k : undefined,
-						top_p: options.top_p !== '' ? options.top_p : undefined,
-						tfs_z: options.tfs_z !== '' ? options.tfs_z : undefined,
-						num_ctx: options.num_ctx !== '' ? options.num_ctx : undefined,
-						num_predict: options.num_predict !== '' ? options.num_predict : undefined
-					},
-					keepAlive: keepAlive ? (isNaN(keepAlive) ? keepAlive : parseInt(keepAlive)) : undefined
-				});
-
-				dispatch('save');
-			}}
-		>
-			{$i18n.t('Save')}
-		</button>
-	</div>
-</div>

+ 177 - 97
src/lib/components/chat/Settings/Advanced/AdvancedParams.svelte

@@ -1,14 +1,16 @@
 <script lang="ts">
-	import { getContext } from 'svelte';
+	import { getContext, createEventDispatcher } from 'svelte';
+
+	const dispatch = createEventDispatcher();
 
 	const i18n = getContext('i18n');
 
-	export let options = {
+	export let params = {
 		// Advanced
 		seed: 0,
-		stop: '',
+		stop: null,
 		temperature: '',
-		repeat_penalty: '',
+		frequency_penalty: '',
 		repeat_last_n: '',
 		mirostat: '',
 		mirostat_eta: '',
@@ -17,40 +19,86 @@
 		top_p: '',
 		tfs_z: '',
 		num_ctx: '',
-		num_predict: ''
+		max_tokens: '',
+		template: null
 	};
+
+	let customFieldName = '';
+	let customFieldValue = '';
+
+	$: if (params) {
+		dispatch('change', params);
+	}
 </script>
 
-<div class=" space-y-3 text-xs">
-	<div>
-		<div class=" py-0.5 flex w-full justify-between">
-			<div class=" w-20 text-xs font-medium self-center">{$i18n.t('Seed')}</div>
-			<div class=" flex-1 self-center">
-				<input
-					class="w-full rounded-lg py-2 px-4 text-sm dark:text-gray-300 dark:bg-gray-850 outline-none"
-					type="number"
-					placeholder="Enter Seed"
-					bind:value={options.seed}
-					autocomplete="off"
-					min="0"
-				/>
-			</div>
+<div class=" space-y-1 text-xs">
+	<div class=" py-0.5 w-full justify-between">
+		<div class="flex w-full justify-between">
+			<div class=" self-center text-xs font-medium">{$i18n.t('Seed')}</div>
+
+			<button
+				class="p-1 px-3 text-xs flex rounded transition"
+				type="button"
+				on:click={() => {
+					params.seed = (params?.seed ?? null) === null ? 0 : null;
+				}}
+			>
+				{#if (params?.seed ?? null) === null}
+					<span class="ml-2 self-center"> {$i18n.t('Default')} </span>
+				{:else}
+					<span class="ml-2 self-center"> {$i18n.t('Custom')} </span>
+				{/if}
+			</button>
 		</div>
-	</div>
 
-	<div>
-		<div class=" py-0.5 flex w-full justify-between">
-			<div class=" w-20 text-xs font-medium self-center">{$i18n.t('Stop Sequence')}</div>
-			<div class=" flex-1 self-center">
-				<input
-					class="w-full rounded-lg py-2 px-4 text-sm dark:text-gray-300 dark:bg-gray-850 outline-none"
-					type="text"
-					placeholder={$i18n.t('Enter stop sequence')}
-					bind:value={options.stop}
-					autocomplete="off"
-				/>
+		{#if (params?.seed ?? null) !== null}
+			<div class="flex mt-0.5 space-x-2">
+				<div class=" flex-1">
+					<input
+						class="w-full rounded-lg py-2 px-4 text-sm dark:text-gray-300 dark:bg-gray-850 outline-none"
+						type="number"
+						placeholder="Enter Seed"
+						bind:value={params.seed}
+						autocomplete="off"
+						min="0"
+					/>
+				</div>
 			</div>
+		{/if}
+	</div>
+
+	<div class=" py-0.5 w-full justify-between">
+		<div class="flex w-full justify-between">
+			<div class=" self-center text-xs font-medium">{$i18n.t('Stop Sequence')}</div>
+
+			<button
+				class="p-1 px-3 text-xs flex rounded transition"
+				type="button"
+				on:click={() => {
+					params.stop = (params?.stop ?? null) === null ? '' : null;
+				}}
+			>
+				{#if (params?.stop ?? null) === null}
+					<span class="ml-2 self-center"> {$i18n.t('Default')} </span>
+				{:else}
+					<span class="ml-2 self-center"> {$i18n.t('Custom')} </span>
+				{/if}
+			</button>
 		</div>
+
+		{#if (params?.stop ?? null) !== null}
+			<div class="flex mt-0.5 space-x-2">
+				<div class=" flex-1">
+					<input
+						class="w-full rounded-lg py-2 px-4 text-sm dark:text-gray-300 dark:bg-gray-850 outline-none"
+						type="text"
+						placeholder={$i18n.t('Enter stop sequence')}
+						bind:value={params.stop}
+						autocomplete="off"
+					/>
+				</div>
+			</div>
+		{/if}
 	</div>
 
 	<div class=" py-0.5 w-full justify-between">
@@ -61,10 +109,10 @@
 				class="p-1 px-3 text-xs flex rounded transition"
 				type="button"
 				on:click={() => {
-					options.temperature = options.temperature === '' ? 0.8 : '';
+					params.temperature = (params?.temperature ?? '') === '' ? 0.8 : '';
 				}}
 			>
-				{#if options.temperature === ''}
+				{#if (params?.temperature ?? '') === ''}
 					<span class="ml-2 self-center"> {$i18n.t('Default')} </span>
 				{:else}
 					<span class="ml-2 self-center"> {$i18n.t('Custom')} </span>
@@ -72,7 +120,7 @@
 			</button>
 		</div>
 
-		{#if options.temperature !== ''}
+		{#if (params?.temperature ?? '') !== ''}
 			<div class="flex mt-0.5 space-x-2">
 				<div class=" flex-1">
 					<input
@@ -81,13 +129,13 @@
 						min="0"
 						max="1"
 						step="0.05"
-						bind:value={options.temperature}
+						bind:value={params.temperature}
 						class="w-full h-2 rounded-lg appearance-none cursor-pointer dark:bg-gray-700"
 					/>
 				</div>
 				<div>
 					<input
-						bind:value={options.temperature}
+						bind:value={params.temperature}
 						type="number"
 						class=" bg-transparent text-center w-14"
 						min="0"
@@ -107,18 +155,18 @@
 				class="p-1 px-3 text-xs flex rounded transition"
 				type="button"
 				on:click={() => {
-					options.mirostat = options.mirostat === '' ? 0 : '';
+					params.mirostat = (params?.mirostat ?? '') === '' ? 0 : '';
 				}}
 			>
-				{#if options.mirostat === ''}
+				{#if (params?.mirostat ?? '') === ''}
 					<span class="ml-2 self-center">{$i18n.t('Default')}</span>
 				{:else}
-					<span class="ml-2 self-center">{$i18n.t('Default')}</span>
+					<span class="ml-2 self-center">{$i18n.t('Custom')}</span>
 				{/if}
 			</button>
 		</div>
 
-		{#if options.mirostat !== ''}
+		{#if (params?.mirostat ?? '') !== ''}
 			<div class="flex mt-0.5 space-x-2">
 				<div class=" flex-1">
 					<input
@@ -127,13 +175,13 @@
 						min="0"
 						max="2"
 						step="1"
-						bind:value={options.mirostat}
+						bind:value={params.mirostat}
 						class="w-full h-2 rounded-lg appearance-none cursor-pointer dark:bg-gray-700"
 					/>
 				</div>
 				<div>
 					<input
-						bind:value={options.mirostat}
+						bind:value={params.mirostat}
 						type="number"
 						class=" bg-transparent text-center w-14"
 						min="0"
@@ -153,18 +201,18 @@
 				class="p-1 px-3 text-xs flex rounded transition"
 				type="button"
 				on:click={() => {
-					options.mirostat_eta = options.mirostat_eta === '' ? 0.1 : '';
+					params.mirostat_eta = (params?.mirostat_eta ?? '') === '' ? 0.1 : '';
 				}}
 			>
-				{#if options.mirostat_eta === ''}
+				{#if (params?.mirostat_eta ?? '') === ''}
 					<span class="ml-2 self-center">{$i18n.t('Default')}</span>
 				{:else}
-					<span class="ml-2 self-center">{$i18n.t('Default')}</span>
+					<span class="ml-2 self-center">{$i18n.t('Custom')}</span>
 				{/if}
 			</button>
 		</div>
 
-		{#if options.mirostat_eta !== ''}
+		{#if (params?.mirostat_eta ?? '') !== ''}
 			<div class="flex mt-0.5 space-x-2">
 				<div class=" flex-1">
 					<input
@@ -173,13 +221,13 @@
 						min="0"
 						max="1"
 						step="0.05"
-						bind:value={options.mirostat_eta}
+						bind:value={params.mirostat_eta}
 						class="w-full h-2 rounded-lg appearance-none cursor-pointer dark:bg-gray-700"
 					/>
 				</div>
 				<div>
 					<input
-						bind:value={options.mirostat_eta}
+						bind:value={params.mirostat_eta}
 						type="number"
 						class=" bg-transparent text-center w-14"
 						min="0"
@@ -199,10 +247,10 @@
 				class="p-1 px-3 text-xs flex rounded transition"
 				type="button"
 				on:click={() => {
-					options.mirostat_tau = options.mirostat_tau === '' ? 5.0 : '';
+					params.mirostat_tau = (params?.mirostat_tau ?? '') === '' ? 5.0 : '';
 				}}
 			>
-				{#if options.mirostat_tau === ''}
+				{#if (params?.mirostat_tau ?? '') === ''}
 					<span class="ml-2 self-center">{$i18n.t('Default')}</span>
 				{:else}
 					<span class="ml-2 self-center">{$i18n.t('Custom')}</span>
@@ -210,7 +258,7 @@
 			</button>
 		</div>
 
-		{#if options.mirostat_tau !== ''}
+		{#if (params?.mirostat_tau ?? '') !== ''}
 			<div class="flex mt-0.5 space-x-2">
 				<div class=" flex-1">
 					<input
@@ -219,13 +267,13 @@
 						min="0"
 						max="10"
 						step="0.5"
-						bind:value={options.mirostat_tau}
+						bind:value={params.mirostat_tau}
 						class="w-full h-2 rounded-lg appearance-none cursor-pointer dark:bg-gray-700"
 					/>
 				</div>
 				<div>
 					<input
-						bind:value={options.mirostat_tau}
+						bind:value={params.mirostat_tau}
 						type="number"
 						class=" bg-transparent text-center w-14"
 						min="0"
@@ -245,18 +293,18 @@
 				class="p-1 px-3 text-xs flex rounded transition"
 				type="button"
 				on:click={() => {
-					options.top_k = options.top_k === '' ? 40 : '';
+					params.top_k = (params?.top_k ?? '') === '' ? 40 : '';
 				}}
 			>
-				{#if options.top_k === ''}
+				{#if (params?.top_k ?? '') === ''}
 					<span class="ml-2 self-center">{$i18n.t('Default')}</span>
 				{:else}
-					<span class="ml-2 self-center">{$i18n.t('Default')}</span>
+					<span class="ml-2 self-center">{$i18n.t('Custom')}</span>
 				{/if}
 			</button>
 		</div>
 
-		{#if options.top_k !== ''}
+		{#if (params?.top_k ?? '') !== ''}
 			<div class="flex mt-0.5 space-x-2">
 				<div class=" flex-1">
 					<input
@@ -265,13 +313,13 @@
 						min="0"
 						max="100"
 						step="0.5"
-						bind:value={options.top_k}
+						bind:value={params.top_k}
 						class="w-full h-2 rounded-lg appearance-none cursor-pointer dark:bg-gray-700"
 					/>
 				</div>
 				<div>
 					<input
-						bind:value={options.top_k}
+						bind:value={params.top_k}
 						type="number"
 						class=" bg-transparent text-center w-14"
 						min="0"
@@ -291,18 +339,18 @@
 				class="p-1 px-3 text-xs flex rounded transition"
 				type="button"
 				on:click={() => {
-					options.top_p = options.top_p === '' ? 0.9 : '';
+					params.top_p = (params?.top_p ?? '') === '' ? 0.9 : '';
 				}}
 			>
-				{#if options.top_p === ''}
+				{#if (params?.top_p ?? '') === ''}
 					<span class="ml-2 self-center">{$i18n.t('Default')}</span>
 				{:else}
-					<span class="ml-2 self-center">{$i18n.t('Default')}</span>
+					<span class="ml-2 self-center">{$i18n.t('Custom')}</span>
 				{/if}
 			</button>
 		</div>
 
-		{#if options.top_p !== ''}
+		{#if (params?.top_p ?? '') !== ''}
 			<div class="flex mt-0.5 space-x-2">
 				<div class=" flex-1">
 					<input
@@ -311,13 +359,13 @@
 						min="0"
 						max="1"
 						step="0.05"
-						bind:value={options.top_p}
+						bind:value={params.top_p}
 						class="w-full h-2 rounded-lg appearance-none cursor-pointer dark:bg-gray-700"
 					/>
 				</div>
 				<div>
 					<input
-						bind:value={options.top_p}
+						bind:value={params.top_p}
 						type="number"
 						class=" bg-transparent text-center w-14"
 						min="0"
@@ -331,24 +379,24 @@
 
 	<div class=" py-0.5 w-full justify-between">
 		<div class="flex w-full justify-between">
-			<div class=" self-center text-xs font-medium">{$i18n.t('Repeat Penalty')}</div>
+			<div class=" self-center text-xs font-medium">{$i18n.t('Frequencey Penalty')}</div>
 
 			<button
 				class="p-1 px-3 text-xs flex rounded transition"
 				type="button"
 				on:click={() => {
-					options.repeat_penalty = options.repeat_penalty === '' ? 1.1 : '';
+					params.frequency_penalty = (params?.frequency_penalty ?? '') === '' ? 1.1 : '';
 				}}
 			>
-				{#if options.repeat_penalty === ''}
+				{#if (params?.frequency_penalty ?? '') === ''}
 					<span class="ml-2 self-center">{$i18n.t('Default')}</span>
 				{:else}
-					<span class="ml-2 self-center">{$i18n.t('Default')}</span>
+					<span class="ml-2 self-center">{$i18n.t('Custom')}</span>
 				{/if}
 			</button>
 		</div>
 
-		{#if options.repeat_penalty !== ''}
+		{#if (params?.frequency_penalty ?? '') !== ''}
 			<div class="flex mt-0.5 space-x-2">
 				<div class=" flex-1">
 					<input
@@ -357,13 +405,13 @@
 						min="0"
 						max="2"
 						step="0.05"
-						bind:value={options.repeat_penalty}
+						bind:value={params.frequency_penalty}
 						class="w-full h-2 rounded-lg appearance-none cursor-pointer dark:bg-gray-700"
 					/>
 				</div>
 				<div>
 					<input
-						bind:value={options.repeat_penalty}
+						bind:value={params.frequency_penalty}
 						type="number"
 						class=" bg-transparent text-center w-14"
 						min="0"
@@ -383,18 +431,18 @@
 				class="p-1 px-3 text-xs flex rounded transition"
 				type="button"
 				on:click={() => {
-					options.repeat_last_n = options.repeat_last_n === '' ? 64 : '';
+					params.repeat_last_n = (params?.repeat_last_n ?? '') === '' ? 64 : '';
 				}}
 			>
-				{#if options.repeat_last_n === ''}
+				{#if (params?.repeat_last_n ?? '') === ''}
 					<span class="ml-2 self-center">{$i18n.t('Default')}</span>
 				{:else}
-					<span class="ml-2 self-center">{$i18n.t('Default')}</span>
+					<span class="ml-2 self-center">{$i18n.t('Custom')}</span>
 				{/if}
 			</button>
 		</div>
 
-		{#if options.repeat_last_n !== ''}
+		{#if (params?.repeat_last_n ?? '') !== ''}
 			<div class="flex mt-0.5 space-x-2">
 				<div class=" flex-1">
 					<input
@@ -403,13 +451,13 @@
 						min="-1"
 						max="128"
 						step="1"
-						bind:value={options.repeat_last_n}
+						bind:value={params.repeat_last_n}
 						class="w-full h-2 rounded-lg appearance-none cursor-pointer dark:bg-gray-700"
 					/>
 				</div>
 				<div>
 					<input
-						bind:value={options.repeat_last_n}
+						bind:value={params.repeat_last_n}
 						type="number"
 						class=" bg-transparent text-center w-14"
 						min="-1"
@@ -429,18 +477,18 @@
 				class="p-1 px-3 text-xs flex rounded transition"
 				type="button"
 				on:click={() => {
-					options.tfs_z = options.tfs_z === '' ? 1 : '';
+					params.tfs_z = (params?.tfs_z ?? '') === '' ? 1 : '';
 				}}
 			>
-				{#if options.tfs_z === ''}
+				{#if (params?.tfs_z ?? '') === ''}
 					<span class="ml-2 self-center">{$i18n.t('Default')}</span>
 				{:else}
-					<span class="ml-2 self-center">{$i18n.t('Default')}</span>
+					<span class="ml-2 self-center">{$i18n.t('Custom')}</span>
 				{/if}
 			</button>
 		</div>
 
-		{#if options.tfs_z !== ''}
+		{#if (params?.tfs_z ?? '') !== ''}
 			<div class="flex mt-0.5 space-x-2">
 				<div class=" flex-1">
 					<input
@@ -449,13 +497,13 @@
 						min="0"
 						max="2"
 						step="0.05"
-						bind:value={options.tfs_z}
+						bind:value={params.tfs_z}
 						class="w-full h-2 rounded-lg appearance-none cursor-pointer dark:bg-gray-700"
 					/>
 				</div>
 				<div>
 					<input
-						bind:value={options.tfs_z}
+						bind:value={params.tfs_z}
 						type="number"
 						class=" bg-transparent text-center w-14"
 						min="0"
@@ -475,18 +523,18 @@
 				class="p-1 px-3 text-xs flex rounded transition"
 				type="button"
 				on:click={() => {
-					options.num_ctx = options.num_ctx === '' ? 2048 : '';
+					params.num_ctx = (params?.num_ctx ?? '') === '' ? 2048 : '';
 				}}
 			>
-				{#if options.num_ctx === ''}
+				{#if (params?.num_ctx ?? '') === ''}
 					<span class="ml-2 self-center">{$i18n.t('Default')}</span>
 				{:else}
-					<span class="ml-2 self-center">{$i18n.t('Default')}</span>
+					<span class="ml-2 self-center">{$i18n.t('Custom')}</span>
 				{/if}
 			</button>
 		</div>
 
-		{#if options.num_ctx !== ''}
+		{#if (params?.num_ctx ?? '') !== ''}
 			<div class="flex mt-0.5 space-x-2">
 				<div class=" flex-1">
 					<input
@@ -495,13 +543,13 @@
 						min="-1"
 						max="10240000"
 						step="1"
-						bind:value={options.num_ctx}
+						bind:value={params.num_ctx}
 						class="w-full h-2 rounded-lg appearance-none cursor-pointer dark:bg-gray-700"
 					/>
 				</div>
 				<div class="">
 					<input
-						bind:value={options.num_ctx}
+						bind:value={params.num_ctx}
 						type="number"
 						class=" bg-transparent text-center w-14"
 						min="-1"
@@ -513,24 +561,24 @@
 	</div>
 	<div class=" py-0.5 w-full justify-between">
 		<div class="flex w-full justify-between">
-			<div class=" self-center text-xs font-medium">{$i18n.t('Max Tokens')}</div>
+			<div class=" self-center text-xs font-medium">{$i18n.t('Max Tokens (num_predict)')}</div>
 
 			<button
 				class="p-1 px-3 text-xs flex rounded transition"
 				type="button"
 				on:click={() => {
-					options.num_predict = options.num_predict === '' ? 128 : '';
+					params.max_tokens = (params?.max_tokens ?? '') === '' ? 128 : '';
 				}}
 			>
-				{#if options.num_predict === ''}
+				{#if (params?.max_tokens ?? '') === ''}
 					<span class="ml-2 self-center">{$i18n.t('Default')}</span>
 				{:else}
-					<span class="ml-2 self-center">{$i18n.t('Default')}</span>
+					<span class="ml-2 self-center">{$i18n.t('Custom')}</span>
 				{/if}
 			</button>
 		</div>
 
-		{#if options.num_predict !== ''}
+		{#if (params?.max_tokens ?? '') !== ''}
 			<div class="flex mt-0.5 space-x-2">
 				<div class=" flex-1">
 					<input
@@ -539,13 +587,13 @@
 						min="-2"
 						max="16000"
 						step="1"
-						bind:value={options.num_predict}
+						bind:value={params.max_tokens}
 						class="w-full h-2 rounded-lg appearance-none cursor-pointer dark:bg-gray-700"
 					/>
 				</div>
 				<div class="">
 					<input
-						bind:value={options.num_predict}
+						bind:value={params.max_tokens}
 						type="number"
 						class=" bg-transparent text-center w-14"
 						min="-2"
@@ -556,4 +604,36 @@
 			</div>
 		{/if}
 	</div>
+	<div class=" py-0.5 w-full justify-between">
+		<div class="flex w-full justify-between">
+			<div class=" self-center text-xs font-medium">{$i18n.t('Template')}</div>
+
+			<button
+				class="p-1 px-3 text-xs flex rounded transition"
+				type="button"
+				on:click={() => {
+					params.template = (params?.template ?? null) === null ? '' : null;
+				}}
+			>
+				{#if (params?.template ?? null) === null}
+					<span class="ml-2 self-center">{$i18n.t('Default')}</span>
+				{:else}
+					<span class="ml-2 self-center">{$i18n.t('Custom')}</span>
+				{/if}
+			</button>
+		</div>
+
+		{#if (params?.template ?? null) !== null}
+			<div class="flex mt-0.5 space-x-2">
+				<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"
+						placeholder="Write your model template content here"
+						rows="4"
+						bind:value={params.template}
+					/>
+				</div>
+			</div>
+		{/if}
+	</div>
 </div>

+ 28 - 27
src/lib/components/chat/Settings/General.svelte

@@ -41,21 +41,21 @@
 	let requestFormat = '';
 	let keepAlive = null;
 
-	let options = {
+	let params = {
 		// Advanced
 		seed: 0,
 		temperature: '',
-		repeat_penalty: '',
+		frequency_penalty: '',
 		repeat_last_n: '',
 		mirostat: '',
 		mirostat_eta: '',
 		mirostat_tau: '',
 		top_k: '',
 		top_p: '',
-		stop: '',
+		stop: null,
 		tfs_z: '',
 		num_ctx: '',
-		num_predict: ''
+		max_tokens: ''
 	};
 
 	const toggleRequestFormat = async () => {
@@ -80,14 +80,14 @@
 		requestFormat = settings.requestFormat ?? '';
 		keepAlive = settings.keepAlive ?? null;
 
-		options.seed = settings.seed ?? 0;
-		options.temperature = settings.temperature ?? '';
-		options.repeat_penalty = settings.repeat_penalty ?? '';
-		options.top_k = settings.top_k ?? '';
-		options.top_p = settings.top_p ?? '';
-		options.num_ctx = settings.num_ctx ?? '';
-		options = { ...options, ...settings.options };
-		options.stop = (settings?.options?.stop ?? []).join(',');
+		params.seed = settings.seed ?? 0;
+		params.temperature = settings.temperature ?? '';
+		params.frequency_penalty = settings.frequency_penalty ?? '';
+		params.top_k = settings.top_k ?? '';
+		params.top_p = settings.top_p ?? '';
+		params.num_ctx = settings.num_ctx ?? '';
+		params = { ...params, ...settings.params };
+		params.stop = settings?.params?.stop ? (settings?.params?.stop ?? []).join(',') : null;
 	});
 
 	const applyTheme = (_theme: string) => {
@@ -228,7 +228,7 @@
 			</div>
 
 			{#if showAdvanced}
-				<AdvancedParams bind:options />
+				<AdvancedParams bind:params />
 				<hr class=" dark:border-gray-700" />
 
 				<div class=" py-1 w-full justify-between">
@@ -300,20 +300,21 @@
 			on:click={() => {
 				saveSettings({
 					system: system !== '' ? system : undefined,
-					options: {
-						seed: (options.seed !== 0 ? options.seed : undefined) ?? undefined,
-						stop: options.stop !== '' ? options.stop.split(',').filter((e) => e) : undefined,
-						temperature: options.temperature !== '' ? options.temperature : undefined,
-						repeat_penalty: options.repeat_penalty !== '' ? options.repeat_penalty : undefined,
-						repeat_last_n: options.repeat_last_n !== '' ? options.repeat_last_n : undefined,
-						mirostat: options.mirostat !== '' ? options.mirostat : undefined,
-						mirostat_eta: options.mirostat_eta !== '' ? options.mirostat_eta : undefined,
-						mirostat_tau: options.mirostat_tau !== '' ? options.mirostat_tau : undefined,
-						top_k: options.top_k !== '' ? options.top_k : undefined,
-						top_p: options.top_p !== '' ? options.top_p : undefined,
-						tfs_z: options.tfs_z !== '' ? options.tfs_z : undefined,
-						num_ctx: options.num_ctx !== '' ? options.num_ctx : undefined,
-						num_predict: options.num_predict !== '' ? options.num_predict : undefined
+					params: {
+						seed: (params.seed !== 0 ? params.seed : undefined) ?? undefined,
+						stop: params.stop !== null ? params.stop.split(',').filter((e) => e) : undefined,
+						temperature: params.temperature !== '' ? params.temperature : undefined,
+						frequency_penalty:
+							params.frequency_penalty !== '' ? params.frequency_penalty : undefined,
+						repeat_last_n: params.repeat_last_n !== '' ? params.repeat_last_n : undefined,
+						mirostat: params.mirostat !== '' ? params.mirostat : undefined,
+						mirostat_eta: params.mirostat_eta !== '' ? params.mirostat_eta : undefined,
+						mirostat_tau: params.mirostat_tau !== '' ? params.mirostat_tau : undefined,
+						top_k: params.top_k !== '' ? params.top_k : undefined,
+						top_p: params.top_p !== '' ? params.top_p : undefined,
+						tfs_z: params.tfs_z !== '' ? params.tfs_z : undefined,
+						num_ctx: params.num_ctx !== '' ? params.num_ctx : undefined,
+						max_tokens: params.max_tokens !== '' ? params.max_tokens : undefined
 					},
 					keepAlive: keepAlive ? (isNaN(keepAlive) ? keepAlive : parseInt(keepAlive)) : undefined
 				});

+ 37 - 287
src/lib/components/chat/Settings/Models.svelte

@@ -1,5 +1,4 @@
 <script lang="ts">
-	import queue from 'async/queue';
 	import { toast } from 'svelte-sonner';
 
 	import {
@@ -12,32 +11,19 @@
 		cancelOllamaRequest,
 		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 Tooltip from '$lib/components/common/Tooltip.svelte';
 
 	const i18n = getContext('i18n');
 
 	export let getModels: Function;
 
-	let showLiteLLM = false;
-	let showLiteLLMParams = false;
 	let modelUploadInputElement: HTMLInputElement;
-	let liteLLMModelInfo = [];
-
-	let liteLLMModel = '';
-	let liteLLMModelName = '';
-	let liteLLMAPIBase = '';
-	let liteLLMAPIKey = '';
-	let liteLLMRPM = '';
-	let liteLLMMaxTokens = '';
-
-	let deleteLiteLLMModelName = '';
-
-	$: liteLLMModelName = liteLLMModel;
 
 	// Models
 
@@ -439,71 +425,22 @@
 		}
 	};
 
-	const addLiteLLMModelHandler = async () => {
-		if (!liteLLMModelInfo.find((info) => info.model_name === liteLLMModelName)) {
-			const res = await addLiteLLMModel(localStorage.token, {
-				name: liteLLMModelName,
-				model: liteLLMModel,
-				api_base: liteLLMAPIBase,
-				api_key: liteLLMAPIKey,
-				rpm: liteLLMRPM,
-				max_tokens: liteLLMMaxTokens
-			}).catch((error) => {
-				toast.error(error);
-				return null;
-			});
-
-			if (res) {
-				if (res.message) {
-					toast.success(res.message);
-				}
-			}
-		} else {
-			toast.error($i18n.t(`Model {{modelName}} already exists.`, { modelName: liteLLMModelName }));
-		}
-
-		liteLLMModelName = '';
-		liteLLMModel = '';
-		liteLLMAPIBase = '';
-		liteLLMAPIKey = '';
-		liteLLMRPM = '';
-		liteLLMMaxTokens = '';
-
-		liteLLMModelInfo = await getLiteLLMModelInfo(localStorage.token);
-		models.set(await getModels());
-	};
-
-	const deleteLiteLLMModelHandler = async () => {
-		const res = await deleteLiteLLMModel(localStorage.token, deleteLiteLLMModelName).catch(
-			(error) => {
-				toast.error(error);
-				return null;
-			}
-		);
-
-		if (res) {
-			if (res.message) {
-				toast.success(res.message);
-			}
-		}
-
-		deleteLiteLLMModelName = '';
-		liteLLMModelInfo = await getLiteLLMModelInfo(localStorage.token);
-		models.set(await getModels());
-	};
-
 	onMount(async () => {
-		OLLAMA_URLS = await getOllamaUrls(localStorage.token).catch((error) => {
-			toast.error(error);
-			return [];
-		});
-
-		if (OLLAMA_URLS.length > 0) {
-			selectedOllamaUrlIdx = 0;
-		}
+		await Promise.all([
+			(async () => {
+				OLLAMA_URLS = await getOllamaUrls(localStorage.token).catch((error) => {
+					toast.error(error);
+					return [];
+				});
 
-		ollamaVersion = await getOllamaVersion(localStorage.token).catch((error) => false);
-		liteLLMModelInfo = await getLiteLLMModelInfo(localStorage.token);
+				if (OLLAMA_URLS.length > 0) {
+					selectedOllamaUrlIdx = 0;
+				}
+			})(),
+			(async () => {
+				ollamaVersion = await getOllamaVersion(localStorage.token).catch((error) => false);
+			})()
+		]);
 	});
 </script>
 
@@ -587,24 +524,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
@@ -833,24 +774,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
@@ -929,203 +874,8 @@
 					{/if}
 				</div>
 			</div>
-			<hr class=" dark:border-gray-700 my-2" />
+		{:else}
+			<div>Ollama Not Detected</div>
 		{/if}
-
-		<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 LiteLLM Models')}</div>
-							<button
-								class=" text-xs font-medium text-gray-500"
-								type="button"
-								on:click={() => {
-									showLiteLLM = !showLiteLLM;
-								}}>{showLiteLLM ? $i18n.t('Hide') : $i18n.t('Show')}</button
-							>
-						</div>
-					</div>
-
-					{#if showLiteLLM}
-						<div>
-							<div class="flex justify-between items-center text-xs">
-								<div class=" text-sm font-medium">{$i18n.t('Add a model')}</div>
-								<button
-									class=" text-xs font-medium text-gray-500"
-									type="button"
-									on:click={() => {
-										showLiteLLMParams = !showLiteLLMParams;
-									}}
-									>{showLiteLLMParams
-										? $i18n.t('Hide Additional Params')
-										: $i18n.t('Show Additional Params')}</button
-								>
-							</div>
-						</div>
-
-						<div class="my-2 space-y-2">
-							<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 LiteLLM Model (litellm_params.model)')}
-										bind:value={liteLLMModel}
-										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={() => {
-										addLiteLLMModelHandler();
-									}}
-								>
-									<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>
-
-							{#if showLiteLLMParams}
-								<div>
-									<div class=" mb-1.5 text-sm font-medium">{$i18n.t('Model Name')}</div>
-									<div class="flex w-full">
-										<div class="flex-1">
-											<input
-												class="w-full rounded-lg py-2 px-4 text-sm dark:text-gray-300 dark:bg-gray-850 outline-none"
-												placeholder="Enter Model Name (model_name)"
-												bind:value={liteLLMModelName}
-												autocomplete="off"
-											/>
-										</div>
-									</div>
-								</div>
-
-								<div>
-									<div class=" mb-1.5 text-sm font-medium">{$i18n.t('API Base URL')}</div>
-									<div class="flex w-full">
-										<div class="flex-1">
-											<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 LiteLLM API Base URL (litellm_params.api_base)'
-												)}
-												bind:value={liteLLMAPIBase}
-												autocomplete="off"
-											/>
-										</div>
-									</div>
-								</div>
-
-								<div>
-									<div class=" mb-1.5 text-sm font-medium">{$i18n.t('API Key')}</div>
-									<div class="flex w-full">
-										<div class="flex-1">
-											<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 LiteLLM API Key (litellm_params.api_key)')}
-												bind:value={liteLLMAPIKey}
-												autocomplete="off"
-											/>
-										</div>
-									</div>
-								</div>
-
-								<div>
-									<div class="mb-1.5 text-sm font-medium">{$i18n.t('API RPM')}</div>
-									<div class="flex w-full">
-										<div class="flex-1">
-											<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 LiteLLM API RPM (litellm_params.rpm)')}
-												bind:value={liteLLMRPM}
-												autocomplete="off"
-											/>
-										</div>
-									</div>
-								</div>
-
-								<div>
-									<div class="mb-1.5 text-sm font-medium">{$i18n.t('Max Tokens')}</div>
-									<div class="flex w-full">
-										<div class="flex-1">
-											<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 Max Tokens (litellm_params.max_tokens)')}
-												bind:value={liteLLMMaxTokens}
-												type="number"
-												min="1"
-												autocomplete="off"
-											/>
-										</div>
-									</div>
-								</div>
-							{/if}
-						</div>
-
-						<div class="mb-2 text-xs text-gray-400 dark:text-gray-500">
-							{$i18n.t('Not sure what to add?')}
-							<a
-								class=" text-gray-300 font-medium underline"
-								href="https://litellm.vercel.app/docs/proxy/configs#quick-start"
-								target="_blank"
-							>
-								{$i18n.t('Click here for help.')}
-							</a>
-						</div>
-
-						<div>
-							<div class=" mb-2.5 text-sm font-medium">{$i18n.t('Delete a model')}</div>
-							<div class="flex w-full">
-								<div class="flex-1 mr-2">
-									<select
-										class="w-full rounded-lg py-2 px-4 text-sm dark:text-gray-300 dark:bg-gray-850 outline-none"
-										bind:value={deleteLiteLLMModelName}
-										placeholder={$i18n.t('Select a model')}
-									>
-										{#if !deleteLiteLLMModelName}
-											<option value="" disabled selected>{$i18n.t('Select a model')}</option>
-										{/if}
-										{#each liteLLMModelInfo as model}
-											<option value={model.model_name} class="bg-gray-100 dark:bg-gray-700"
-												>{model.model_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={() => {
-										deleteLiteLLMModelHandler();
-									}}
-								>
-									<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>
-						</div>
-					{/if}
-				</div>
-			</div>
-		</div>
 	</div>
 </div>

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

@@ -3,7 +3,7 @@
 	import { toast } from 'svelte-sonner';
 	import { models, settings, user } from '$lib/stores';
 
-	import { getModels as _getModels } from '$lib/utils';
+	import { getModels as _getModels } from '$lib/apis';
 
 	import Modal from '../common/Modal.svelte';
 	import Account from './Settings/Account.svelte';

+ 2 - 4
src/lib/components/chat/ShareChatModal.svelte

@@ -1,9 +1,9 @@
 <script lang="ts">
 	import { getContext, onMount } from 'svelte';
+	import { models } from '$lib/stores';
 
 	import { toast } from 'svelte-sonner';
 	import { deleteSharedChatById, getChatById, shareChatById } from '$lib/apis/chats';
-	import { modelfiles } from '$lib/stores';
 	import { copyToClipboard } from '$lib/utils';
 
 	import Modal from '../common/Modal.svelte';
@@ -43,9 +43,7 @@
 					tab.postMessage(
 						JSON.stringify({
 							chat: _chat,
-							modelfiles: $modelfiles.filter((modelfile) =>
-								_chat.models.includes(modelfile.tagName)
-							)
+							models: $models.filter((m) => _chat.models.includes(m.id))
 						}),
 						'*'
 					);

+ 1 - 0
src/lib/components/common/Checkbox.svelte

@@ -29,6 +29,7 @@
 			dispatch('change', _state);
 		}
 	}}
+	type="button"
 >
 	<div class="top-0 left-0 absolute w-full flex justify-center">
 		{#if _state === 'checked'}

+ 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>

+ 0 - 1
src/lib/components/layout/Navbar.svelte

@@ -6,7 +6,6 @@
 		WEBUI_NAME,
 		chatId,
 		mobile,
-		modelfiles,
 		settings,
 		showArchivedChats,
 		showSettings,

+ 73 - 92
src/lib/components/workspace/Modelfiles.svelte → src/lib/components/workspace/Models.svelte

@@ -5,67 +5,82 @@
 
 	import { onMount, getContext } from 'svelte';
 
-	import { WEBUI_NAME, modelfiles, settings, user } from '$lib/stores';
-	import { createModel, deleteModel } from '$lib/apis/ollama';
-	import {
-		createNewModelfile,
-		deleteModelfileByTagName,
-		getModelfiles
-	} from '$lib/apis/modelfiles';
+	import { WEBUI_NAME, modelfiles, models, settings, user } from '$lib/stores';
+	import { addNewModel, deleteModelById, getModelInfos } from '$lib/apis/models';
+
+	import { deleteModel } from '$lib/apis/ollama';
 	import { goto } from '$app/navigation';
 
+	import { getModels } from '$lib/apis';
+
 	const i18n = getContext('i18n');
 
 	let localModelfiles = [];
-	let importFiles;
-	let modelfilesImportInputElement: HTMLInputElement;
-	const deleteModelHandler = async (tagName) => {
-		let success = null;
 
-		success = await deleteModel(localStorage.token, tagName).catch((err) => {
-			toast.error(err);
+	let importFiles;
+	let modelsImportInputElement: HTMLInputElement;
+
+	const deleteModelHandler = async (model) => {
+		console.log(model.info);
+		if (!model?.info) {
+			toast.error(
+				$i18n.t('{{ owner }}: You cannot delete a base model', {
+					owner: model.owned_by.toUpperCase()
+				})
+			);
 			return null;
-		});
+		}
 
-		if (success) {
-			toast.success($i18n.t(`Deleted {{tagName}}`, { tagName }));
+		const res = await deleteModelById(localStorage.token, model.id);
+
+		if (res) {
+			toast.success($i18n.t(`Deleted {{name}}`, { name: model.id }));
 		}
 
-		return success;
+		await models.set(await getModels(localStorage.token));
 	};
 
-	const deleteModelfile = async (tagName) => {
-		await deleteModelHandler(tagName);
-		await deleteModelfileByTagName(localStorage.token, tagName);
-		await modelfiles.set(await getModelfiles(localStorage.token));
+	const cloneModelHandler = async (model) => {
+		if ((model?.info?.base_model_id ?? null) === null) {
+			toast.error($i18n.t('You cannot clone a base model'));
+			return;
+		} else {
+			sessionStorage.model = JSON.stringify({
+				...model,
+				id: `${model.id}-clone`,
+				name: `${model.name} (Clone)`
+			});
+			goto('/workspace/models/create');
+		}
 	};
 
-	const shareModelfile = async (modelfile) => {
+	const shareModelHandler = async (model) => {
 		toast.success($i18n.t('Redirecting you to OpenWebUI Community'));
 
 		const url = 'https://openwebui.com';
 
-		const tab = await window.open(`${url}/modelfiles/create`, '_blank');
+		const tab = await window.open(`${url}/models/create`, '_blank');
 		window.addEventListener(
 			'message',
 			(event) => {
 				if (event.origin !== url) return;
 				if (event.data === 'loaded') {
-					tab.postMessage(JSON.stringify(modelfile), '*');
+					tab.postMessage(JSON.stringify(model), '*');
 				}
 			},
 			false
 		);
 	};
 
-	const saveModelfiles = async (modelfiles) => {
-		let blob = new Blob([JSON.stringify(modelfiles)], {
+	const downloadModels = async (models) => {
+		let blob = new Blob([JSON.stringify(models)], {
 			type: 'application/json'
 		});
-		saveAs(blob, `modelfiles-export-${Date.now()}.json`);
+		saveAs(blob, `models-export-${Date.now()}.json`);
 	};
 
 	onMount(() => {
+		// Legacy code to sync localModelfiles with models
 		localModelfiles = JSON.parse(localStorage.getItem('modelfiles') ?? '[]');
 
 		if (localModelfiles) {
@@ -76,13 +91,13 @@
 
 <svelte:head>
 	<title>
-		{$i18n.t('Modelfiles')} | {$WEBUI_NAME}
+		{$i18n.t('Models')} | {$WEBUI_NAME}
 	</title>
 </svelte:head>
 
-<div class=" text-lg font-semibold mb-3">{$i18n.t('Modelfiles')}</div>
+<div class=" text-lg font-semibold mb-3">{$i18n.t('Models')}</div>
 
-<a class=" flex space-x-4 cursor-pointer w-full mb-2 px-3 py-2" href="/workspace/modelfiles/create">
+<a class=" flex space-x-4 cursor-pointer w-full mb-2 px-3 py-2" href="/workspace/models/create">
 	<div class=" self-center w-10">
 		<div
 			class="w-full h-10 flex justify-center rounded-full bg-transparent dark:bg-gray-700 border border-dashed border-gray-200"
@@ -98,26 +113,26 @@
 	</div>
 
 	<div class=" self-center">
-		<div class=" font-bold">{$i18n.t('Create a modelfile')}</div>
-		<div class=" text-sm">{$i18n.t('Customize Ollama models for a specific purpose')}</div>
+		<div class=" font-bold">{$i18n.t('Create a model')}</div>
+		<div class=" text-sm">{$i18n.t('Customize models for a specific purpose')}</div>
 	</div>
 </a>
 
 <hr class=" dark:border-gray-850" />
 
 <div class=" my-2 mb-5">
-	{#each $modelfiles as modelfile}
+	{#each $models as model}
 		<div
 			class=" flex space-x-4 cursor-pointer w-full px-3 py-2 dark:hover:bg-white/5 hover:bg-black/5 rounded-xl"
 		>
 			<a
 				class=" flex flex-1 space-x-4 cursor-pointer w-full"
-				href={`/?models=${encodeURIComponent(modelfile.tagName)}`}
+				href={`/?models=${encodeURIComponent(model.id)}`}
 			>
 				<div class=" self-center w-10">
 					<div class=" rounded-full bg-stone-700">
 						<img
-							src={modelfile.imageUrl ?? '/user.png'}
+							src={model?.info?.meta?.profile_image_url ?? '/favicon.png'}
 							alt="modelfile profile"
 							class=" rounded-full w-full h-auto object-cover"
 						/>
@@ -125,9 +140,9 @@
 				</div>
 
 				<div class=" flex-1 self-center">
-					<div class=" font-bold capitalize">{modelfile.title}</div>
+					<div class=" font-bold line-clamp-1">{model.name}</div>
 					<div class=" text-sm overflow-hidden text-ellipsis line-clamp-1">
-						{modelfile.desc}
+						{!!model?.info?.meta?.description ? model?.info?.meta?.description : model.id}
 					</div>
 				</div>
 			</a>
@@ -135,7 +150,7 @@
 				<a
 					class="self-center w-fit text-sm px-2 py-2 dark:text-gray-300 dark:hover:text-white hover:bg-black/5 dark:hover:bg-white/5 rounded-xl"
 					type="button"
-					href={`/workspace/modelfiles/edit?tag=${encodeURIComponent(modelfile.tagName)}`}
+					href={`/workspace/models/edit?id=${encodeURIComponent(model.id)}`}
 				>
 					<svg
 						xmlns="http://www.w3.org/2000/svg"
@@ -157,9 +172,7 @@
 					class="self-center w-fit text-sm px-2 py-2 dark:text-gray-300 dark:hover:text-white hover:bg-black/5 dark:hover:bg-white/5 rounded-xl"
 					type="button"
 					on:click={() => {
-						// console.log(modelfile);
-						sessionStorage.modelfile = JSON.stringify(modelfile);
-						goto('/workspace/modelfiles/create');
+						cloneModelHandler(model);
 					}}
 				>
 					<svg
@@ -182,7 +195,7 @@
 					class="self-center w-fit text-sm px-2 py-2 dark:text-gray-300 dark:hover:text-white hover:bg-black/5 dark:hover:bg-white/5 rounded-xl"
 					type="button"
 					on:click={() => {
-						shareModelfile(modelfile);
+						shareModelHandler(model);
 					}}
 				>
 					<svg
@@ -205,7 +218,7 @@
 					class="self-center w-fit text-sm px-2 py-2 dark:text-gray-300 dark:hover:text-white hover:bg-black/5 dark:hover:bg-white/5 rounded-xl"
 					type="button"
 					on:click={() => {
-						deleteModelfile(modelfile.tagName);
+						deleteModelHandler(model);
 					}}
 				>
 					<svg
@@ -231,8 +244,8 @@
 <div class=" flex justify-end w-full mb-3">
 	<div class="flex space-x-1">
 		<input
-			id="modelfiles-import-input"
-			bind:this={modelfilesImportInputElement}
+			id="models-import-input"
+			bind:this={modelsImportInputElement}
 			bind:files={importFiles}
 			type="file"
 			accept=".json"
@@ -242,16 +255,18 @@
 
 				let reader = new FileReader();
 				reader.onload = async (event) => {
-					let savedModelfiles = JSON.parse(event.target.result);
-					console.log(savedModelfiles);
+					let savedModels = JSON.parse(event.target.result);
+					console.log(savedModels);
 
-					for (const modelfile of savedModelfiles) {
-						await createNewModelfile(localStorage.token, modelfile).catch((error) => {
-							return null;
-						});
+					for (const model of savedModels) {
+						if (model?.info ?? false) {
+							await addNewModel(localStorage.token, model.info).catch((error) => {
+								return null;
+							});
+						}
 					}
 
-					await modelfiles.set(await getModelfiles(localStorage.token));
+					await models.set(await getModels(localStorage.token));
 				};
 
 				reader.readAsText(importFiles[0]);
@@ -261,10 +276,10 @@
 		<button
 			class="flex text-xs items-center space-x-1 px-3 py-1.5 rounded-xl bg-gray-50 hover:bg-gray-100 dark:bg-gray-800 dark:hover:bg-gray-700 dark:text-gray-200 transition"
 			on:click={() => {
-				modelfilesImportInputElement.click();
+				modelsImportInputElement.click();
 			}}
 		>
-			<div class=" self-center mr-2 font-medium">{$i18n.t('Import Modelfiles')}</div>
+			<div class=" self-center mr-2 font-medium">{$i18n.t('Import Models')}</div>
 
 			<div class=" self-center">
 				<svg
@@ -285,10 +300,10 @@
 		<button
 			class="flex text-xs items-center space-x-1 px-3 py-1.5 rounded-xl bg-gray-50 hover:bg-gray-100 dark:bg-gray-800 dark:hover:bg-gray-700 dark:text-gray-200 transition"
 			on:click={async () => {
-				saveModelfiles($modelfiles);
+				downloadModels($models);
 			}}
 		>
-			<div class=" self-center mr-2 font-medium">{$i18n.t('Export Modelfiles')}</div>
+			<div class=" self-center mr-2 font-medium">{$i18n.t('Export Models')}</div>
 
 			<div class=" self-center">
 				<svg
@@ -314,47 +329,13 @@
 			</div>
 
 			<div class="flex space-x-1">
-				<button
-					class="self-center w-fit text-sm px-3 py-1 border dark:border-gray-600 rounded-xl flex"
-					on:click={async () => {
-						for (const modelfile of localModelfiles) {
-							await createNewModelfile(localStorage.token, modelfile).catch((error) => {
-								return null;
-							});
-						}
-
-						saveModelfiles(localModelfiles);
-						localStorage.removeItem('modelfiles');
-						localModelfiles = JSON.parse(localStorage.getItem('modelfiles') ?? '[]');
-						await modelfiles.set(await getModelfiles(localStorage.token));
-					}}
-				>
-					<div class=" self-center mr-2 font-medium">{$i18n.t('Sync All')}</div>
-
-					<div class=" self-center">
-						<svg
-							xmlns="http://www.w3.org/2000/svg"
-							viewBox="0 0 16 16"
-							fill="currentColor"
-							class="w-3.5 h-3.5"
-						>
-							<path
-								fill-rule="evenodd"
-								d="M13.836 2.477a.75.75 0 0 1 .75.75v3.182a.75.75 0 0 1-.75.75h-3.182a.75.75 0 0 1 0-1.5h1.37l-.84-.841a4.5 4.5 0 0 0-7.08.932.75.75 0 0 1-1.3-.75 6 6 0 0 1 9.44-1.242l.842.84V3.227a.75.75 0 0 1 .75-.75Zm-.911 7.5A.75.75 0 0 1 13.199 11a6 6 0 0 1-9.44 1.241l-.84-.84v1.371a.75.75 0 0 1-1.5 0V9.591a.75.75 0 0 1 .75-.75H5.35a.75.75 0 0 1 0 1.5H3.98l.841.841a4.5 4.5 0 0 0 7.08-.932.75.75 0 0 1 1.025-.273Z"
-								clip-rule="evenodd"
-							/>
-						</svg>
-					</div>
-				</button>
-
 				<button
 					class="self-center w-fit text-sm p-1.5 border dark:border-gray-600 rounded-xl flex"
 					on:click={async () => {
-						saveModelfiles(localModelfiles);
+						downloadModels(localModelfiles);
 
 						localStorage.removeItem('modelfiles');
 						localModelfiles = JSON.parse(localStorage.getItem('modelfiles') ?? '[]');
-						await modelfiles.set(await getModelfiles(localStorage.token));
 					}}
 				>
 					<div class=" self-center">
@@ -402,7 +383,7 @@
 		</div>
 
 		<div class=" self-center">
-			<div class=" font-bold">{$i18n.t('Discover a modelfile')}</div>
+			<div class=" font-bold">{$i18n.t('Discover a model')}</div>
 			<div class=" text-sm">{$i18n.t('Discover, download, and explore model presets')}</div>
 		</div>
 	</a>

+ 5 - 7
src/lib/components/workspace/Playground.svelte

@@ -321,13 +321,11 @@
 							<div class="max-w-full">
 								<Selector
 									placeholder={$i18n.t('Select a model')}
-									items={$models
-										.filter((model) => model.name !== 'hr')
-										.map((model) => ({
-											value: model.id,
-											label: model.name,
-											info: model
-										}))}
+									items={$models.map((model) => ({
+										value: model.id,
+										label: model.name,
+										model: model
+									}))}
 									bind:value={selectedModelId}
 								/>
 							</div>

+ 1 - 1
src/lib/constants.ts

@@ -8,7 +8,7 @@ export const WEBUI_API_BASE_URL = `${WEBUI_BASE_URL}/api/v1`;
 
 export const LITELLM_API_BASE_URL = `${WEBUI_BASE_URL}/litellm/api`;
 export const OLLAMA_API_BASE_URL = `${WEBUI_BASE_URL}/ollama`;
-export const OPENAI_API_BASE_URL = `${WEBUI_BASE_URL}/openai/api`;
+export const OPENAI_API_BASE_URL = `${WEBUI_BASE_URL}/openai`;
 export const AUDIO_API_BASE_URL = `${WEBUI_BASE_URL}/audio/api/v1`;
 export const IMAGES_API_BASE_URL = `${WEBUI_BASE_URL}/images/api/v1`;
 export const RAG_API_BASE_URL = `${WEBUI_BASE_URL}/rag/api/v1`;

+ 23 - 37
src/lib/i18n/locales/ar-BH/translation.json

@@ -3,6 +3,8 @@
 	"(Beta)": "(تجريبي)",
 	"(e.g. `sh webui.sh --api`)": "( `sh webui.sh --api`مثال)",
 	"(latest)": "(الأخير)",
+	"{{ models }}": "",
+	"{{ owner }}: You cannot delete a base model": "",
 	"{{modelName}} is thinking...": "{{modelName}} ...يفكر",
 	"{{user}}'s Chats": "دردشات {{user}}",
 	"{{webUIName}} Backend Required": "{{webUIName}} مطلوب",
@@ -12,9 +14,8 @@
 	"Account": "الحساب",
 	"Accurate information": "معلومات دقيقة",
 	"Add": "أضف",
-	"Add a model": "أضف موديل",
-	"Add a model tag name": "ضع علامة للأسم الموديل",
-	"Add a short description about what this modelfile does": "أضف وصفًا قصيرًا حول ما يفعله ملف الموديل هذا",
+	"Add a model id": "",
+	"Add a short description about what this model does": "",
 	"Add a short title for this prompt": "أضف عنوانًا قصيرًا لبداء المحادثة",
 	"Add a tag": "أضافة تاق",
 	"Add custom prompt": "أضافة مطالبة مخصصه",
@@ -30,6 +31,7 @@
 	"Admin Panel": "لوحة التحكم",
 	"Admin Settings": "اعدادات المشرف",
 	"Advanced Parameters": "التعليمات المتقدمة",
+	"Advanced Params": "",
 	"all": "الكل",
 	"All Documents": "جميع الملفات",
 	"All Users": "جميع المستخدمين",
@@ -44,7 +46,6 @@
 	"API Key": "API مفتاح",
 	"API Key created.": "API تم أنشاء المفتاح",
 	"API keys": "مفاتيح واجهة برمجة التطبيقات",
-	"API RPM": "API RPM",
 	"April": "أبريل",
 	"Archive": "الأرشيف",
 	"Archived Chats": "الأرشيف المحادثات",
@@ -61,12 +62,12 @@
 	"available!": "متاح",
 	"Back": "خلف",
 	"Bad Response": "استجابة خطاء",
+	"Base Model (From)": "",
 	"before": "قبل",
 	"Being lazy": "كون كسول",
-	"Builder Mode": "بناء الموديل",
 	"Bypass SSL verification for Websites": "تجاوز التحقق من SSL للموقع",
 	"Cancel": "اللغاء",
-	"Categories": "التصنيفات",
+	"Capabilities": "",
 	"Change Password": "تغير الباسورد",
 	"Chat": "المحادثة",
 	"Chat Bubble UI": "UI الدردشة",
@@ -84,7 +85,6 @@
 	"Citation": "اقتباس",
 	"Click here for help.": "أضغط هنا للمساعدة",
 	"Click here to": "أضغط هنا الانتقال",
-	"Click here to check other modelfiles.": "انقر هنا للتحقق من ملفات الموديلات الأخرى",
 	"Click here to select": "أضغط هنا للاختيار",
 	"Click here to select a csv file.": "أضغط هنا للاختيار ملف csv",
 	"Click here to select documents.": "انقر هنا لاختيار المستندات",
@@ -109,7 +109,7 @@
 	"Copy Link": "أنسخ الرابط",
 	"Copying to clipboard was successful!": "تم النسخ إلى الحافظة بنجاح",
 	"Create a concise, 3-5 word phrase as a header for the following query, strictly adhering to the 3-5 word limit and avoiding the use of the word 'title':": "قم بإنشاء عبارة موجزة مكونة من 3-5 كلمات كرأس للاستعلام التالي، مع الالتزام الصارم بالحد الأقصى لعدد الكلمات الذي يتراوح بين 3-5 كلمات وتجنب استخدام الكلمة 'عنوان':",
-	"Create a modelfile": "إنشاء ملف نموذجي",
+	"Create a model": "",
 	"Create Account": "إنشاء حساب",
 	"Create new key": "عمل مفتاح جديد",
 	"Create new secret key": "عمل سر جديد",
@@ -118,7 +118,7 @@
 	"Current Model": "الموديل المختار",
 	"Current Password": "كلمة السر الحالية",
 	"Custom": "مخصص",
-	"Customize Ollama models for a specific purpose": "تخصيص الموديل Ollama لغرض محدد",
+	"Customize models for a specific purpose": "",
 	"Dark": "مظلم",
 	"Dashboard": "لوحة التحكم",
 	"Database": "قاعدة البيانات",
@@ -139,11 +139,11 @@
 	"delete this link": "أحذف هذا الرابط",
 	"Delete User": "حذف المستخدم",
 	"Deleted {{deleteModelTag}}": "{{deleteModelTag}} حذف",
-	"Deleted {{tagName}}": "{{tagName}} حذف",
+	"Deleted {{name}}": "",
 	"Description": "وصف",
 	"Didn't fully follow instructions": "لم أتبع التعليمات بشكل كامل",
 	"Disabled": "تعطيل",
-	"Discover a modelfile": "اكتشاف ملف نموذجي",
+	"Discover a model": "",
 	"Discover a prompt": "اكتشاف موجه",
 	"Discover, download, and explore custom prompts": "اكتشاف وتنزيل واستكشاف المطالبات المخصصة",
 	"Discover, download, and explore model presets": "اكتشاف وتنزيل واستكشاف الإعدادات المسبقة للنموذج",
@@ -177,11 +177,6 @@
 	"Enter Chunk Size": "أدخل Chunk الحجم",
 	"Enter Image Size (e.g. 512x512)": "(e.g. 512x512) أدخل حجم الصورة ",
 	"Enter language codes": "أدخل كود اللغة",
-	"Enter LiteLLM API Base URL (litellm_params.api_base)": "أدخل عنوان URL الأساسي لواجهة برمجة تطبيقات LiteLLM (litellm_params.api_base)",
-	"Enter LiteLLM API Key (litellm_params.api_key)": "أدخل مفتاح LiteLLM API (litellm_params.api_key)",
-	"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 tag (e.g. {{modelTag}})": "(e.g. {{modelTag}}) أدخل الموديل تاق",
 	"Enter Number of Steps (e.g. 50)": "(e.g. 50) أدخل عدد الخطوات",
 	"Enter Score": "أدخل النتيجة",
@@ -197,7 +192,7 @@
 	"Export All Chats (All Users)": "تصدير جميع الدردشات (جميع المستخدمين)",
 	"Export Chats": "تصدير جميع الدردشات",
 	"Export Documents Mapping": "تصدير وثائق الخرائط",
-	"Export Modelfiles": "تصدير ملفات النماذج",
+	"Export Models": "",
 	"Export Prompts": "مطالبات التصدير",
 	"Failed to create API Key.": "فشل في إنشاء مفتاح API.",
 	"Failed to read clipboard contents": "فشل في قراءة محتويات الحافظة",
@@ -210,7 +205,7 @@
 	"Focus chat input": "التركيز على إدخال الدردشة",
 	"Followed instructions perfectly": "اتبعت التعليمات على أكمل وجه",
 	"Format your variables using square brackets like this:": "قم بتنسيق المتغيرات الخاصة بك باستخدام الأقواس المربعة مثل هذا:",
-	"From (Base Model)": "من (الموديل الافتراضي)",
+	"Frequencey Penalty": "",
 	"Full Screen Mode": "وضع ملء الشاشة",
 	"General": "عام",
 	"General Settings": "الاعدادات العامة",
@@ -222,7 +217,6 @@
 	"Hello, {{name}}": " {{name}} مرحبا",
 	"Help": "مساعدة",
 	"Hide": "أخفاء",
-	"Hide Additional Params": "إخفاء المعلمات الإضافية",
 	"How can I help you today?": "كيف استطيع مساعدتك اليوم؟",
 	"Hybrid Search": "البحث الهجين",
 	"Image Generation (Experimental)": "توليد الصور (تجريبي)",
@@ -231,7 +225,7 @@
 	"Images": "الصور",
 	"Import Chats": "استيراد الدردشات",
 	"Import Documents Mapping": "استيراد خرائط المستندات",
-	"Import Modelfiles": "استيراد ملفات النماذج",
+	"Import Models": "",
 	"Import Prompts": "مطالبات الاستيراد",
 	"Include `--api` flag when running stable-diffusion-webui": "قم بتضمين علامة `-api` عند تشغيل Stable-diffusion-webui",
 	"Input commands": "إدخال الأوامر",
@@ -240,6 +234,7 @@
 	"January": "يناير",
 	"join our Discord for help.": "انضم إلى Discord للحصول على المساعدة.",
 	"JSON": "JSON",
+	"JSON Preview": "",
 	"July": "يوليو",
 	"June": "يونيو",
 	"JWT Expiration": "JWT تجريبي",
@@ -254,11 +249,10 @@
 	"LTR": "من جهة اليسار إلى اليمين",
 	"Made by OpenWebUI Community": "OpenWebUI تم إنشاؤه بواسطة مجتمع ",
 	"Make sure to enclose them with": "تأكد من إرفاقها",
-	"Manage LiteLLM Models": "LiteLLM إدارة نماذج ",
 	"Manage Models": "إدارة النماذج",
 	"Manage Ollama Models": "Ollama إدارة موديلات ",
 	"March": "مارس",
-	"Max Tokens": "Max Tokens",
+	"Max Tokens (num_predict)": "",
 	"Maximum of 3 models can be downloaded simultaneously. Please try again later.": "يمكن تنزيل 3 نماذج كحد أقصى في وقت واحد. الرجاء معاودة المحاولة في وقت لاحق.",
 	"May": "مايو",
 	"Memories accessible by LLMs will be shown here.": "",
@@ -273,22 +267,19 @@
 	"Model '{{modelName}}' has been successfully downloaded.": "تم تحميل النموذج '{{modelName}}' بنجاح",
 	"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 filesystem path detected. Model shortname is required for update, cannot continue.": "تم اكتشاف مسار نظام الملفات النموذجي. الاسم المختصر للنموذج مطلوب للتحديث، ولا يمكن الاستمرار.",
-	"Model Name": "أسم الموديل",
+	"Model ID": "",
 	"Model not selected": "لم تختار موديل",
-	"Model Tag Name": "أسم التاق للموديل",
+	"Model Params": "",
 	"Model Whitelisting": "القائمة البيضاء للموديل",
 	"Model(s) Whitelisted": "القائمة البيضاء الموديل",
-	"Modelfile": "ملف نموذجي",
-	"Modelfile Advanced Settings": "الإعدادات المتقدمة لملف النموذج",
 	"Modelfile Content": "محتوى الملف النموذجي",
-	"Modelfiles": "ملفات الموديل",
 	"Models": "الموديلات",
 	"More": "المزيد",
 	"Name": "الأسم",
 	"Name Tag": "أسم التاق",
-	"Name your modelfile": "قم بتسمية ملف النموذج الخاص بك",
+	"Name your model": "",
 	"New Chat": "دردشة جديدة",
 	"New Password": "كلمة المرور الجديدة",
 	"No results found": "لا توجد نتايج",
@@ -296,8 +287,6 @@
 	"No search results found": "",
 	"No source available": "لا يوجد مصدر متاح",
 	"Not factually correct": "ليس صحيحا من حيث الواقع",
-	"Not sure what to add?": "لست متأكدا ما يجب إضافته؟",
-	"Not sure what to write? Switch to": "لست متأكدا ماذا أكتب؟ التبديل إلى",
 	"Note: If you set a minimum score, the search will only return documents with a score greater than or equal to the minimum score.": "ملاحظة: إذا قمت بتعيين الحد الأدنى من النقاط، فلن يؤدي البحث إلا إلى إرجاع المستندات التي لها نقاط أكبر من أو تساوي الحد الأدنى من النقاط.",
 	"Notifications": "إشعارات",
 	"November": "نوفمبر",
@@ -326,7 +315,6 @@
 	"or": "أو",
 	"Other": "آخر",
 	"Overview": "عرض",
-	"Parameters": "Parameters",
 	"Password": "الباسورد",
 	"PDF document (.pdf)": "PDF ملف (.pdf)",
 	"PDF Extract Images (OCR)": "PDF أستخرج الصور (OCR)",
@@ -346,10 +334,8 @@
 	"Prompts": "مطالبات",
 	"Pull \"{{searchValue}}\" from Ollama.com": "Ollama.com \"{{searchValue}}\" أسحب من ",
 	"Pull a model from Ollama.com": "Ollama.com سحب الموديل من ",
-	"Pull Progress": "سحب التقدم",
 	"Query Params": "Query Params",
 	"RAG Template": "RAG تنمبلت",
-	"Raw Format": "Raw فورمات",
 	"Read Aloud": "أقراء لي",
 	"Record voice": "سجل صوت",
 	"Redirecting you to OpenWebUI Community": "OpenWebUI إعادة توجيهك إلى مجتمع ",
@@ -360,7 +346,6 @@
 	"Remove Model": "حذف الموديل",
 	"Rename": "إعادة تسمية",
 	"Repeat Last N": "N كرر آخر",
-	"Repeat Penalty": "كرر المخالفة",
 	"Request Mode": "وضع الطلب",
 	"Reranking Model": "إعادة تقييم النموذج",
 	"Reranking model disabled": "تم تعطيل نموذج إعادة الترتيب",
@@ -387,10 +372,12 @@
 	"See readme.md for instructions": "readme.md للحصول على التعليمات",
 	"See what's new": "ما الجديد",
 	"Seed": "Seed",
+	"Select a base model": "",
 	"Select a mode": "أختار موديل",
 	"Select a model": "أختار الموديل",
 	"Select an Ollama instance": "أختار سيرفر ",
 	"Select model": " أختار موديل",
+	"Selected model(s) do not support image inputs": "",
 	"Send": "تم",
 	"Send a Message": "يُرجى إدخال طلبك هنا",
 	"Send message": "يُرجى إدخال طلبك هنا.",
@@ -412,7 +399,6 @@
 	"Share to OpenWebUI Community": "OpenWebUI شارك في مجتمع",
 	"short-summary": "ملخص قصير",
 	"Show": "عرض",
-	"Show Additional Params": "إظهار المعلمات الإضافية",
 	"Show shortcuts": "إظهار الاختصارات",
 	"Showcased creativity": "أظهر الإبداع",
 	"sidebar": "الشريط الجانبي",
@@ -431,7 +417,6 @@
 	"Success": "نجاح",
 	"Successfully updated.": "تم التحديث بنجاح",
 	"Suggested": "مقترحات",
-	"Sync All": "مزامنة الكل",
 	"System": "النظام",
 	"System Prompt": "محادثة النظام",
 	"Tags": "الوسوم",
@@ -502,6 +487,7 @@
 	"Write a summary in 50 words that summarizes [topic or keyword].": "اكتب ملخصًا في 50 كلمة يلخص [الموضوع أو الكلمة الرئيسية]",
 	"Yesterday": "أمس",
 	"You": "انت",
+	"You cannot clone a base model": "",
 	"You have no archived conversations.": "لا تملك محادثات محفوظه",
 	"You have shared this chat": "تم مشاركة هذه المحادثة",
 	"You're a helpful assistant.": "مساعدك المفيد هنا",

+ 23 - 37
src/lib/i18n/locales/bg-BG/translation.json

@@ -3,6 +3,8 @@
 	"(Beta)": "(Бета)",
 	"(e.g. `sh webui.sh --api`)": "(например `sh webui.sh --api`)",
 	"(latest)": "(последна)",
+	"{{ models }}": "",
+	"{{ owner }}: You cannot delete a base model": "",
 	"{{modelName}} is thinking...": "{{modelName}} мисли ...",
 	"{{user}}'s Chats": "{{user}}'s чатове",
 	"{{webUIName}} Backend Required": "{{webUIName}} Изисква се Бекенд",
@@ -12,9 +14,8 @@
 	"Account": "Акаунт",
 	"Accurate information": "Точни информация",
 	"Add": "Добавяне",
-	"Add a model": "Добавяне на модел",
-	"Add a model tag name": "Добавяне на име на таг за модел",
-	"Add a short description about what this modelfile does": "Добавяне на кратко описание за това какво прави този модфайл",
+	"Add a model id": "",
+	"Add a short description about what this model does": "",
 	"Add a short title for this prompt": "Добавяне на кратко заглавие за този промпт",
 	"Add a tag": "Добавяне на таг",
 	"Add custom prompt": "Добавяне на собствен промпт",
@@ -30,6 +31,7 @@
 	"Admin Panel": "Панел на Администратор",
 	"Admin Settings": "Настройки на Администратор",
 	"Advanced Parameters": "Разширени Параметри",
+	"Advanced Params": "",
 	"all": "всички",
 	"All Documents": "Всички Документи",
 	"All Users": "Всички Потребители",
@@ -44,7 +46,6 @@
 	"API Key": "API Ключ",
 	"API Key created.": "API Ключ създаден.",
 	"API keys": "API Ключове",
-	"API RPM": "API RPM",
 	"April": "Април",
 	"Archive": "Архивирани Чатове",
 	"Archived Chats": "Архивирани Чатове",
@@ -61,12 +62,12 @@
 	"available!": "наличен!",
 	"Back": "Назад",
 	"Bad Response": "Невалиден отговор от API",
+	"Base Model (From)": "",
 	"before": "преди",
 	"Being lazy": "Да бъдеш мързелив",
-	"Builder Mode": "Режим на Създаване",
 	"Bypass SSL verification for Websites": "Изключване на SSL проверката за сайтове",
 	"Cancel": "Отказ",
-	"Categories": "Категории",
+	"Capabilities": "",
 	"Change Password": "Промяна на Парола",
 	"Chat": "Чат",
 	"Chat Bubble UI": "UI за чат бублон",
@@ -84,7 +85,6 @@
 	"Citation": "Цитат",
 	"Click here for help.": "Натиснете тук за помощ.",
 	"Click here to": "Натиснете тук за",
-	"Click here to check other modelfiles.": "Натиснете тук за проверка на други моделфайлове.",
 	"Click here to select": "Натиснете тук, за да изберете",
 	"Click here to select a csv file.": "Натиснете тук, за да изберете csv файл.",
 	"Click here to select documents.": "Натиснете тук, за да изберете документи.",
@@ -109,7 +109,7 @@
 	"Copy Link": "Копиране на връзка",
 	"Copying to clipboard was successful!": "Копирането в клипборда беше успешно!",
 	"Create a concise, 3-5 word phrase as a header for the following query, strictly adhering to the 3-5 word limit and avoiding the use of the word 'title':": "Създайте кратка фраза от 3-5 думи като заглавие за следващото запитване, като стриктно спазвате ограничението от 3-5 думи и избягвате използването на думата 'заглавие':",
-	"Create a modelfile": "Създаване на модфайл",
+	"Create a model": "",
 	"Create Account": "Създаване на Акаунт",
 	"Create new key": "Създаване на нов ключ",
 	"Create new secret key": "Създаване на нов секретен ключ",
@@ -118,7 +118,7 @@
 	"Current Model": "Текущ модел",
 	"Current Password": "Текуща Парола",
 	"Custom": "Персонализиран",
-	"Customize Ollama models for a specific purpose": "Персонализиране на Ollama моделите за конкретна цел",
+	"Customize models for a specific purpose": "",
 	"Dark": "Тъмен",
 	"Dashboard": "Панел",
 	"Database": "База данни",
@@ -139,11 +139,11 @@
 	"delete this link": "Изтриване на този линк",
 	"Delete User": "Изтриване на потребител",
 	"Deleted {{deleteModelTag}}": "Изтрито {{deleteModelTag}}",
-	"Deleted {{tagName}}": "Изтрито {{tagName}}",
+	"Deleted {{name}}": "",
 	"Description": "Описание",
 	"Didn't fully follow instructions": "Не следва инструкциите",
 	"Disabled": "Деактивиран",
-	"Discover a modelfile": "Откриване на модфайл",
+	"Discover a model": "",
 	"Discover a prompt": "Откриване на промпт",
 	"Discover, download, and explore custom prompts": "Откриване, сваляне и преглед на персонализирани промптове",
 	"Discover, download, and explore model presets": "Откриване, сваляне и преглед на пресетове на модели",
@@ -177,11 +177,6 @@
 	"Enter Chunk Size": "Въведете Chunk Size",
 	"Enter Image Size (e.g. 512x512)": "Въведете размер на изображението (напр. 512x512)",
 	"Enter language codes": "Въведете кодове на езика",
-	"Enter LiteLLM API Base URL (litellm_params.api_base)": "Въведете LiteLLM API Base URL (litellm_params.api_base)",
-	"Enter LiteLLM API Key (litellm_params.api_key)": "Въведете LiteLLM API Key (litellm_params.api_key)",
-	"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 tag (e.g. {{modelTag}})": "Въведете таг на модел (напр. {{modelTag}})",
 	"Enter Number of Steps (e.g. 50)": "Въведете брой стъпки (напр. 50)",
 	"Enter Score": "Въведете оценка",
@@ -197,7 +192,7 @@
 	"Export All Chats (All Users)": "Експортване на всички чатове (За всички потребители)",
 	"Export Chats": "Експортване на чатове",
 	"Export Documents Mapping": "Експортване на документен мапинг",
-	"Export Modelfiles": "Експортване на модфайлове",
+	"Export Models": "",
 	"Export Prompts": "Експортване на промптове",
 	"Failed to create API Key.": "Неуспешно създаване на API ключ.",
 	"Failed to read clipboard contents": "Грешка при четене на съдържанието от клипборда",
@@ -210,7 +205,7 @@
 	"Focus chat input": "Фокусиране на чат вход",
 	"Followed instructions perfectly": "Следвайте инструкциите перфектно",
 	"Format your variables using square brackets like this:": "Форматирайте вашите променливи, като използвате квадратни скоби, както следва:",
-	"From (Base Model)": "От (Базов модел)",
+	"Frequencey Penalty": "",
 	"Full Screen Mode": "На Цял екран",
 	"General": "Основни",
 	"General Settings": "Основни Настройки",
@@ -222,7 +217,6 @@
 	"Hello, {{name}}": "Здравей, {{name}}",
 	"Help": "Помощ",
 	"Hide": "Скрий",
-	"Hide Additional Params": "Скрий допълнителни параметри",
 	"How can I help you today?": "Как мога да ви помогна днес?",
 	"Hybrid Search": "Hybrid Search",
 	"Image Generation (Experimental)": "Генерация на изображения (Експериментално)",
@@ -231,7 +225,7 @@
 	"Images": "Изображения",
 	"Import Chats": "Импортване на чатове",
 	"Import Documents Mapping": "Импортване на документен мапинг",
-	"Import Modelfiles": "Импортване на модфайлове",
+	"Import Models": "",
 	"Import Prompts": "Импортване на промптове",
 	"Include `--api` flag when running stable-diffusion-webui": "Включете флага `--api`, когато стартирате stable-diffusion-webui",
 	"Input commands": "Въведете команди",
@@ -240,6 +234,7 @@
 	"January": "Януари",
 	"join our Discord for help.": "свържете се с нашия Discord за помощ.",
 	"JSON": "JSON",
+	"JSON Preview": "",
 	"July": "Июл",
 	"June": "Июн",
 	"JWT Expiration": "JWT Expiration",
@@ -254,11 +249,10 @@
 	"LTR": "LTR",
 	"Made by OpenWebUI Community": "Направено от OpenWebUI общността",
 	"Make sure to enclose them with": "Уверете се, че са заключени с",
-	"Manage LiteLLM Models": "Управление на LiteLLM Моделите",
 	"Manage Models": "Управление на Моделите",
 	"Manage Ollama Models": "Управление на Ollama Моделите",
 	"March": "Март",
-	"Max Tokens": "Max Tokens",
+	"Max Tokens (num_predict)": "",
 	"Maximum of 3 models can be downloaded simultaneously. Please try again later.": "Максимум 3 модели могат да бъдат сваляни едновременно. Моля, опитайте отново по-късно.",
 	"May": "Май",
 	"Memories accessible by LLMs will be shown here.": "Мемории достъпни от LLMs ще бъдат показани тук.",
@@ -273,22 +267,19 @@
 	"Model '{{modelName}}' has been successfully downloaded.": "Моделът '{{modelName}}' беше успешно свален.",
 	"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 filesystem path detected. Model shortname is required for update, cannot continue.": "Открит е път до файловата система на модела. За актуализацията се изисква съкратено име на модела, не може да продължи.",
-	"Model Name": "Име на модел",
+	"Model ID": "",
 	"Model not selected": "Не е избран модел",
-	"Model Tag Name": "Име на таг на модел",
+	"Model Params": "",
 	"Model Whitelisting": "Модел Whitelisting",
 	"Model(s) Whitelisted": "Модели Whitelisted",
-	"Modelfile": "Модфайл",
-	"Modelfile Advanced Settings": "Разширени настройки на модфайл",
 	"Modelfile Content": "Съдържание на модфайл",
-	"Modelfiles": "Модфайлове",
 	"Models": "Модели",
 	"More": "Повече",
 	"Name": "Име",
 	"Name Tag": "Име Таг",
-	"Name your modelfile": "Име на модфайла",
+	"Name your model": "",
 	"New Chat": "Нов чат",
 	"New Password": "Нова парола",
 	"No results found": "Няма намерени резултати",
@@ -296,8 +287,6 @@
 	"No search results found": "",
 	"No source available": "Няма наличен източник",
 	"Not factually correct": "Не е фактологически правилно",
-	"Not sure what to add?": "Не сте сигурни, какво да добавите?",
-	"Not sure what to write? Switch to": "Не сте сигурни, какво да напишете? Превключете към",
 	"Note: If you set a minimum score, the search will only return documents with a score greater than or equal to the minimum score.": "Забележка: Ако зададете минимален резултат, търсенето ще върне само документи с резултат, по-голям или равен на минималния резултат.",
 	"Notifications": "Десктоп Известия",
 	"November": "Ноември",
@@ -326,7 +315,6 @@
 	"or": "или",
 	"Other": "Other",
 	"Overview": "Обзор",
-	"Parameters": "Параметри",
 	"Password": "Парола",
 	"PDF document (.pdf)": "PDF документ (.pdf)",
 	"PDF Extract Images (OCR)": "PDF Extract Images (OCR)",
@@ -346,10 +334,8 @@
 	"Prompts": "Промптове",
 	"Pull \"{{searchValue}}\" from Ollama.com": "Извади \"{{searchValue}}\" от Ollama.com",
 	"Pull a model from Ollama.com": "Издърпайте модел от Ollama.com",
-	"Pull Progress": "Прогрес на издърпването",
 	"Query Params": "Query Параметри",
 	"RAG Template": "RAG Шаблон",
-	"Raw Format": "Raw Формат",
 	"Read Aloud": "Прочети на Голос",
 	"Record voice": "Записване на глас",
 	"Redirecting you to OpenWebUI Community": "Пренасочване към OpenWebUI общността",
@@ -360,7 +346,6 @@
 	"Remove Model": "Изтриване на модела",
 	"Rename": "Преименуване",
 	"Repeat Last N": "Repeat Last N",
-	"Repeat Penalty": "Repeat Penalty",
 	"Request Mode": "Request Mode",
 	"Reranking Model": "Reranking Model",
 	"Reranking model disabled": "Reranking model disabled",
@@ -387,10 +372,12 @@
 	"See readme.md for instructions": "Виж readme.md за инструкции",
 	"See what's new": "Виж какво е новото",
 	"Seed": "Seed",
+	"Select a base model": "",
 	"Select a mode": "Изберете режим",
 	"Select a model": "Изберете модел",
 	"Select an Ollama instance": "Изберете Ollama инстанция",
 	"Select model": "Изберете модел",
+	"Selected model(s) do not support image inputs": "",
 	"Send": "Изпрати",
 	"Send a Message": "Изпращане на Съобщение",
 	"Send message": "Изпращане на съобщение",
@@ -412,7 +399,6 @@
 	"Share to OpenWebUI Community": "Споделите с OpenWebUI Общността",
 	"short-summary": "short-summary",
 	"Show": "Покажи",
-	"Show Additional Params": "Покажи допълнителни параметри",
 	"Show shortcuts": "Покажи",
 	"Showcased creativity": "Показана креативност",
 	"sidebar": "sidebar",
@@ -431,7 +417,6 @@
 	"Success": "Успех",
 	"Successfully updated.": "Успешно обновено.",
 	"Suggested": "Препоръчано",
-	"Sync All": "Синхронизиране на всички",
 	"System": "Система",
 	"System Prompt": "Системен Промпт",
 	"Tags": "Тагове",
@@ -502,6 +487,7 @@
 	"Write a summary in 50 words that summarizes [topic or keyword].": "Напиши описание в 50 знака, което описва [тема или ключова дума].",
 	"Yesterday": "вчера",
 	"You": "вие",
+	"You cannot clone a base model": "",
 	"You have no archived conversations.": "Нямате архивирани разговори.",
 	"You have shared this chat": "Вие сте споделели този чат",
 	"You're a helpful assistant.": "Вие сте полезен асистент.",

+ 23 - 37
src/lib/i18n/locales/bn-BD/translation.json

@@ -3,6 +3,8 @@
 	"(Beta)": "(পরিক্ষামূলক)",
 	"(e.g. `sh webui.sh --api`)": "(যেমন `sh webui.sh --api`)",
 	"(latest)": "(সর্বশেষ)",
+	"{{ models }}": "",
+	"{{ owner }}: You cannot delete a base model": "",
 	"{{modelName}} is thinking...": "{{modelName}} চিন্তা করছে...",
 	"{{user}}'s Chats": "{{user}}র চ্যাটস",
 	"{{webUIName}} Backend Required": "{{webUIName}} ব্যাকএন্ড আবশ্যক",
@@ -12,9 +14,8 @@
 	"Account": "একাউন্ট",
 	"Accurate information": "সঠিক তথ্য",
 	"Add": "যোগ করুন",
-	"Add a model": "একটি মডেল যোগ করুন",
-	"Add a model tag name": "একটি মডেল ট্যাগ যোগ করুন",
-	"Add a short description about what this modelfile does": "এই মডেলফাইলটির সম্পর্কে সংক্ষিপ্ত বিবরণ যোগ করুন",
+	"Add a model id": "",
+	"Add a short description about what this model does": "",
 	"Add a short title for this prompt": "এই প্রম্পটের জন্য একটি সংক্ষিপ্ত টাইটেল যোগ করুন",
 	"Add a tag": "একটি ট্যাগ যোগ করুন",
 	"Add custom prompt": "একটি কাস্টম প্রম্পট যোগ করুন",
@@ -30,6 +31,7 @@
 	"Admin Panel": "এডমিন প্যানেল",
 	"Admin Settings": "এডমিন সেটিংস",
 	"Advanced Parameters": "এডভান্সড প্যারামিটার্স",
+	"Advanced Params": "",
 	"all": "সব",
 	"All Documents": "সব ডকুমেন্ট",
 	"All Users": "সব ইউজার",
@@ -44,7 +46,6 @@
 	"API Key": "এপিআই কোড",
 	"API Key created.": "একটি এপিআই কোড তৈরি করা হয়েছে.",
 	"API keys": "এপিআই কোডস",
-	"API RPM": "এপিআই আরপিএম",
 	"April": "আপ্রিল",
 	"Archive": "আর্কাইভ",
 	"Archived Chats": "চ্যাট ইতিহাস সংরক্ষণাগার",
@@ -61,12 +62,12 @@
 	"available!": "উপলব্ধ!",
 	"Back": "পেছনে",
 	"Bad Response": "খারাপ প্রতিক্রিয়া",
+	"Base Model (From)": "",
 	"before": "পূর্ববর্তী",
 	"Being lazy": "অলস হওয়া",
-	"Builder Mode": "বিল্ডার মোড",
 	"Bypass SSL verification for Websites": "ওয়েবসাইটের জন্য SSL যাচাই বাতিল করুন",
 	"Cancel": "বাতিল",
-	"Categories": "ক্যাটাগরিসমূহ",
+	"Capabilities": "",
 	"Change Password": "পাসওয়ার্ড পরিবর্তন করুন",
 	"Chat": "চ্যাট",
 	"Chat Bubble UI": "চ্যাট বাবল UI",
@@ -84,7 +85,6 @@
 	"Citation": "উদ্ধৃতি",
 	"Click here for help.": "সাহায্যের জন্য এখানে ক্লিক করুন",
 	"Click here to": "এখানে ক্লিক করুন",
-	"Click here to check other modelfiles.": "অন্যান্য মডেলফাইল চেক করার জন্য এখানে ক্লিক করুন",
 	"Click here to select": "নির্বাচন করার জন্য এখানে ক্লিক করুন",
 	"Click here to select a csv file.": "একটি csv ফাইল নির্বাচন করার জন্য এখানে ক্লিক করুন",
 	"Click here to select documents.": "ডকুমেন্টগুলো নির্বাচন করার জন্য এখানে ক্লিক করুন",
@@ -109,7 +109,7 @@
 	"Copy Link": "লিংক কপি করুন",
 	"Copying to clipboard was successful!": "ক্লিপবোর্ডে কপি করা সফল হয়েছে",
 	"Create a concise, 3-5 word phrase as a header for the following query, strictly adhering to the 3-5 word limit and avoiding the use of the word 'title':": "'title' শব্দটি ব্যবহার না করে নিম্মোক্ত অনুসন্ধানের জন্য সংক্ষেপে সর্বোচ্চ ৩-৫ শব্দের একটি হেডার তৈরি করুন",
-	"Create a modelfile": "একটি মডেলফাইল তৈরি করুন",
+	"Create a model": "",
 	"Create Account": "একাউন্ট তৈরি করুন",
 	"Create new key": "একটি নতুন কী তৈরি করুন",
 	"Create new secret key": "একটি নতুন সিক্রেট কী তৈরি করুন",
@@ -118,7 +118,7 @@
 	"Current Model": "বর্তমান মডেল",
 	"Current Password": "বর্তমান পাসওয়ার্ড",
 	"Custom": "কাস্টম",
-	"Customize Ollama models for a specific purpose": "নির্দিষ্ট উদ্দেশ্যে Ollama মডেল পরিবর্তন করুন",
+	"Customize models for a specific purpose": "",
 	"Dark": "ডার্ক",
 	"Dashboard": "ড্যাশবোর্ড",
 	"Database": "ডেটাবেজ",
@@ -139,11 +139,11 @@
 	"delete this link": "এই লিংক মুছে ফেলুন",
 	"Delete User": "ইউজার মুছে ফেলুন",
 	"Deleted {{deleteModelTag}}": "{{deleteModelTag}} মুছে ফেলা হয়েছে",
-	"Deleted {{tagName}}": "{{tagName}} মুছে ফেলা হয়েছে",
+	"Deleted {{name}}": "",
 	"Description": "বিবরণ",
 	"Didn't fully follow instructions": "ইনস্ট্রাকশন সম্পূর্ণ অনুসরণ করা হয়নি",
 	"Disabled": "অক্ষম",
-	"Discover a modelfile": "একটি মডেলফাইল খুঁজে বের করুন",
+	"Discover a model": "",
 	"Discover a prompt": "একটি প্রম্পট খুঁজে বের করুন",
 	"Discover, download, and explore custom prompts": "কাস্টম প্রম্পটগুলো আবিস্কার, ডাউনলোড এবং এক্সপ্লোর করুন",
 	"Discover, download, and explore model presets": "মডেল প্রিসেটগুলো আবিস্কার, ডাউনলোড এবং এক্সপ্লোর করুন",
@@ -177,11 +177,6 @@
 	"Enter Chunk Size": "চাংক সাইজ লিখুন",
 	"Enter Image Size (e.g. 512x512)": "ছবির মাপ লিখুন (যেমন 512x512)",
 	"Enter language codes": "ল্যাঙ্গুয়েজ কোড লিখুন",
-	"Enter LiteLLM API Base URL (litellm_params.api_base)": "LiteLLM এপিআই বেজ ইউআরএল লিখুন (litellm_params.api_base)",
-	"Enter LiteLLM API Key (litellm_params.api_key)": "LiteLLM এপিআই কোড লিখুন (litellm_params.api_key)",
-	"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 tag (e.g. {{modelTag}})": "মডেল ট্যাগ লিখুন (e.g. {{modelTag}})",
 	"Enter Number of Steps (e.g. 50)": "ধাপের সংখ্যা দিন (যেমন: 50)",
 	"Enter Score": "স্কোর দিন",
@@ -197,7 +192,7 @@
 	"Export All Chats (All Users)": "সব চ্যাট এক্সপোর্ট করুন (সব ইউজারের)",
 	"Export Chats": "চ্যাটগুলো এক্সপোর্ট করুন",
 	"Export Documents Mapping": "ডকুমেন্টসমূহ ম্যাপিং এক্সপোর্ট করুন",
-	"Export Modelfiles": "মডেলফাইলগুলো এক্সপোর্ট করুন",
+	"Export Models": "",
 	"Export Prompts": "প্রম্পটগুলো একপোর্ট করুন",
 	"Failed to create API Key.": "API Key তৈরি করা যায়নি।",
 	"Failed to read clipboard contents": "ক্লিপবোর্ডের বিষয়বস্তু পড়া সম্ভব হয়নি",
@@ -210,7 +205,7 @@
 	"Focus chat input": "চ্যাট ইনপুট ফোকাস করুন",
 	"Followed instructions perfectly": "নির্দেশাবলী নিখুঁতভাবে অনুসরণ করা হয়েছে",
 	"Format your variables using square brackets like this:": "আপনার ভেরিয়বলগুলো এভাবে স্কয়ার ব্রাকেটের মাধ্যমে সাজান",
-	"From (Base Model)": "উৎস (বেজ মডেল)",
+	"Frequencey Penalty": "",
 	"Full Screen Mode": "ফুলস্ক্রিন মোড",
 	"General": "সাধারণ",
 	"General Settings": "সাধারণ সেটিংসমূহ",
@@ -222,7 +217,6 @@
 	"Hello, {{name}}": "হ্যালো, {{name}}",
 	"Help": "সহায়তা",
 	"Hide": "লুকান",
-	"Hide Additional Params": "অতিরিক্ত প্যারামিটাগুলো লুকান",
 	"How can I help you today?": "আপনাকে আজ কিভাবে সাহায্য করতে পারি?",
 	"Hybrid Search": "হাইব্রিড অনুসন্ধান",
 	"Image Generation (Experimental)": "ইমেজ জেনারেশন (পরিক্ষামূলক)",
@@ -231,7 +225,7 @@
 	"Images": "ছবিসমূহ",
 	"Import Chats": "চ্যাটগুলি ইমপোর্ট করুন",
 	"Import Documents Mapping": "ডকুমেন্টসমূহ ম্যাপিং ইমপোর্ট করুন",
-	"Import Modelfiles": "মডেলফাইলগুলো ইমপোর্ট করুন",
+	"Import Models": "",
 	"Import Prompts": "প্রম্পটগুলো ইমপোর্ট করুন",
 	"Include `--api` flag when running stable-diffusion-webui": "stable-diffusion-webui চালু করার সময় `--api` ফ্ল্যাগ সংযুক্ত করুন",
 	"Input commands": "ইনপুট কমান্ডস",
@@ -240,6 +234,7 @@
 	"January": "জানুয়ারী",
 	"join our Discord for help.": "সাহায্যের জন্য আমাদের Discord-এ যুক্ত হোন",
 	"JSON": "JSON",
+	"JSON Preview": "",
 	"July": "জুলাই",
 	"June": "জুন",
 	"JWT Expiration": "JWT-র মেয়াদ",
@@ -254,11 +249,10 @@
 	"LTR": "LTR",
 	"Made by OpenWebUI Community": "OpenWebUI কমিউনিটিকর্তৃক নির্মিত",
 	"Make sure to enclose them with": "এটা দিয়ে বন্ধনী দিতে ভুলবেন না",
-	"Manage LiteLLM Models": "LiteLLM মডেল ব্যবস্থাপনা করুন",
 	"Manage Models": "মডেলসমূহ ব্যবস্থাপনা করুন",
 	"Manage Ollama Models": "Ollama মডেলসূহ ব্যবস্থাপনা করুন",
 	"March": "মার্চ",
-	"Max Tokens": "সর্বোচ্চ টোকন",
+	"Max Tokens (num_predict)": "",
 	"Maximum of 3 models can be downloaded simultaneously. Please try again later.": "একসঙ্গে সর্বোচ্চ তিনটি মডেল ডাউনলোড করা যায়। দয়া করে পরে আবার চেষ্টা করুন।",
 	"May": "মে",
 	"Memories accessible by LLMs will be shown here.": "LLMs দ্বারা অ্যাক্সেসযোগ্য মেমোরিগুলি এখানে দেখানো হবে।",
@@ -273,22 +267,19 @@
 	"Model '{{modelName}}' has been successfully downloaded.": "'{{modelName}}' মডেল সফলভাবে ডাউনলোড হয়েছে।",
 	"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 filesystem path detected. Model shortname is required for update, cannot continue.": "মডেল ফাইলসিস্টেম পাথ পাওয়া গেছে। আপডেটের জন্য মডেলের শর্টনেম আবশ্যক, এগিয়ে যাওয়া যাচ্ছে না।",
-	"Model Name": "মডেলের নাম",
+	"Model ID": "",
 	"Model not selected": "মডেল নির্বাচন করা হয়নি",
-	"Model Tag Name": "মডেলের ট্যাগ নাম",
+	"Model Params": "",
 	"Model Whitelisting": "মডেল হোয়াইটলিস্টিং",
 	"Model(s) Whitelisted": "হোয়াইটলিস্টেড মডেল(সমূহ)",
-	"Modelfile": "মডেলফাইল",
-	"Modelfile Advanced Settings": "মডেলফাইল এডভান্সড সেটিসমূহ",
 	"Modelfile Content": "মডেলফাইল কনটেন্ট",
-	"Modelfiles": "মডেলফাইলসমূহ",
 	"Models": "মডেলসমূহ",
 	"More": "আরো",
 	"Name": "নাম",
 	"Name Tag": "নামের ট্যাগ",
-	"Name your modelfile": "আপনার মডেলফাইলের নাম দিন",
+	"Name your model": "",
 	"New Chat": "নতুন চ্যাট",
 	"New Password": "নতুন পাসওয়ার্ড",
 	"No results found": "কোন ফলাফল পাওয়া যায়নি",
@@ -296,8 +287,6 @@
 	"No search results found": "",
 	"No source available": "কোন উৎস পাওয়া যায়নি",
 	"Not factually correct": "তথ্যগত দিক থেকে সঠিক নয়",
-	"Not sure what to add?": "কী যুক্ত করতে হবে নিশ্চিত না?",
-	"Not sure what to write? Switch to": "কী লিখতে হবে নিশ্চিত না? পরিবর্তন করুন:",
 	"Note: If you set a minimum score, the search will only return documents with a score greater than or equal to the minimum score.": "দ্রষ্টব্য: আপনি যদি ন্যূনতম স্কোর সেট করেন তবে অনুসন্ধানটি কেবলমাত্র ন্যূনতম স্কোরের চেয়ে বেশি বা সমান স্কোর সহ নথিগুলি ফেরত দেবে।",
 	"Notifications": "নোটিফিকেশনসমূহ",
 	"November": "নভেম্বর",
@@ -326,7 +315,6 @@
 	"or": "অথবা",
 	"Other": "অন্যান্য",
 	"Overview": "বিবরণ",
-	"Parameters": "প্যারামিটারসমূহ",
 	"Password": "পাসওয়ার্ড",
 	"PDF document (.pdf)": "PDF ডকুমেন্ট (.pdf)",
 	"PDF Extract Images (OCR)": "পিডিএফ এর ছবি থেকে লেখা বের করুন (OCR)",
@@ -346,10 +334,8 @@
 	"Prompts": "প্রম্পটসমূহ",
 	"Pull \"{{searchValue}}\" from Ollama.com": "Ollama.com থেকে \"{{searchValue}}\" টানুন",
 	"Pull a model from Ollama.com": "Ollama.com থেকে একটি টেনে আনুন আনুন",
-	"Pull Progress": "Pull চলমান",
 	"Query Params": "Query প্যারামিটারসমূহ",
 	"RAG Template": "RAG টেম্পলেট",
-	"Raw Format": "Raw ফরম্যাট",
 	"Read Aloud": "পড়াশোনা করুন",
 	"Record voice": "ভয়েস রেকর্ড করুন",
 	"Redirecting you to OpenWebUI Community": "আপনাকে OpenWebUI কমিউনিটিতে পাঠানো হচ্ছে",
@@ -360,7 +346,6 @@
 	"Remove Model": "মডেল রিমুভ করুন",
 	"Rename": "রেনেম",
 	"Repeat Last N": "রিপিট Last N",
-	"Repeat Penalty": "রিপিট প্যানাল্টি",
 	"Request Mode": "রিকোয়েস্ট মোড",
 	"Reranking Model": "রির্যাক্টিং মডেল",
 	"Reranking model disabled": "রির্যাক্টিং মডেল নিষ্ক্রিয় করা",
@@ -387,10 +372,12 @@
 	"See readme.md for instructions": "নির্দেশিকার জন্য readme.md দেখুন",
 	"See what's new": "নতুন কী আছে দেখুন",
 	"Seed": "সীড",
+	"Select a base model": "",
 	"Select a mode": "একটি মডেল নির্বাচন করুন",
 	"Select a model": "একটি মডেল নির্বাচন করুন",
 	"Select an Ollama instance": "একটি Ollama ইন্সট্যান্স নির্বাচন করুন",
 	"Select model": "মডেল নির্বাচন করুন",
+	"Selected model(s) do not support image inputs": "",
 	"Send": "পাঠান",
 	"Send a Message": "একটি মেসেজ পাঠান",
 	"Send message": "মেসেজ পাঠান",
@@ -412,7 +399,6 @@
 	"Share to OpenWebUI Community": "OpenWebUI কমিউনিটিতে শেয়ার করুন",
 	"short-summary": "সংক্ষিপ্ত বিবরণ",
 	"Show": "দেখান",
-	"Show Additional Params": "অতিরিক্ত প্যারামিটারগুলো দেখান",
 	"Show shortcuts": "শর্টকাটগুলো দেখান",
 	"Showcased creativity": "সৃজনশীলতা প্রদর্শন",
 	"sidebar": "সাইডবার",
@@ -431,7 +417,6 @@
 	"Success": "সফল",
 	"Successfully updated.": "সফলভাবে আপডেট হয়েছে",
 	"Suggested": "প্রস্তাবিত",
-	"Sync All": "সব সিংক্রোনাইজ করুন",
 	"System": "সিস্টেম",
 	"System Prompt": "সিস্টেম প্রম্পট",
 	"Tags": "ট্যাগসমূহ",
@@ -502,6 +487,7 @@
 	"Write a summary in 50 words that summarizes [topic or keyword].": "৫০ শব্দের মধ্যে [topic or keyword] এর একটি সারসংক্ষেপ লিখুন।",
 	"Yesterday": "আগামী",
 	"You": "আপনি",
+	"You cannot clone a base model": "",
 	"You have no archived conversations.": "আপনার কোনও আর্কাইভ করা কথোপকথন নেই।",
 	"You have shared this chat": "আপনি এই চ্যাটটি শেয়ার করেছেন",
 	"You're a helpful assistant.": "আপনি একজন উপকারী এসিস্ট্যান্ট",

+ 23 - 37
src/lib/i18n/locales/ca-ES/translation.json

@@ -3,6 +3,8 @@
 	"(Beta)": "(Beta)",
 	"(e.g. `sh webui.sh --api`)": "(p. ex. `sh webui.sh --api`)",
 	"(latest)": "(últim)",
+	"{{ models }}": "",
+	"{{ owner }}: You cannot delete a base model": "",
 	"{{modelName}} is thinking...": "{{modelName}} està pensant...",
 	"{{user}}'s Chats": "{{user}}'s Chats",
 	"{{webUIName}} Backend Required": "Es requereix Backend de {{webUIName}}",
@@ -12,9 +14,8 @@
 	"Account": "Compte",
 	"Accurate information": "Informació precisa",
 	"Add": "Afegir",
-	"Add a model": "Afegeix un model",
-	"Add a model tag name": "Afegeix un nom d'etiqueta de model",
-	"Add a short description about what this modelfile does": "Afegeix una descripció curta del que fa aquest arxiu de model",
+	"Add a model id": "",
+	"Add a short description about what this model does": "",
 	"Add a short title for this prompt": "Afegeix un títol curt per aquest prompt",
 	"Add a tag": "Afegeix una etiqueta",
 	"Add custom prompt": "Afegir un prompt personalitzat",
@@ -30,6 +31,7 @@
 	"Admin Panel": "Panell d'Administració",
 	"Admin Settings": "Configuració d'Administració",
 	"Advanced Parameters": "Paràmetres Avançats",
+	"Advanced Params": "",
 	"all": "tots",
 	"All Documents": "Tots els Documents",
 	"All Users": "Tots els Usuaris",
@@ -44,7 +46,6 @@
 	"API Key": "Clau de l'API",
 	"API Key created.": "Clau de l'API creada.",
 	"API keys": "Claus de l'API",
-	"API RPM": "RPM de l'API",
 	"April": "Abril",
 	"Archive": "Arxiu",
 	"Archived Chats": "Arxiu d'historial de xat",
@@ -61,12 +62,12 @@
 	"available!": "disponible!",
 	"Back": "Enrere",
 	"Bad Response": "Resposta Erroni",
+	"Base Model (From)": "",
 	"before": "abans",
 	"Being lazy": "Ser l'estupidez",
-	"Builder Mode": "Mode Constructor",
 	"Bypass SSL verification for Websites": "Desactivar la verificació SSL per a l'accés a l'Internet",
 	"Cancel": "Cancel·la",
-	"Categories": "Categories",
+	"Capabilities": "",
 	"Change Password": "Canvia la Contrasenya",
 	"Chat": "Xat",
 	"Chat Bubble UI": "Chat Bubble UI",
@@ -84,7 +85,6 @@
 	"Citation": "Citació",
 	"Click here for help.": "Fes clic aquí per ajuda.",
 	"Click here to": "Fes clic aquí per",
-	"Click here to check other modelfiles.": "Fes clic aquí per comprovar altres fitxers de model.",
 	"Click here to select": "Fes clic aquí per seleccionar",
 	"Click here to select a csv file.": "Fes clic aquí per seleccionar un fitxer csv.",
 	"Click here to select documents.": "Fes clic aquí per seleccionar documents.",
@@ -109,7 +109,7 @@
 	"Copy Link": "Copiar l'enllaç",
 	"Copying to clipboard was successful!": "La còpia al porta-retalls ha estat exitosa!",
 	"Create a concise, 3-5 word phrase as a header for the following query, strictly adhering to the 3-5 word limit and avoiding the use of the word 'title':": "Crea una frase concisa de 3-5 paraules com a capçalera per a la següent consulta, seguint estrictament el límit de 3-5 paraules i evitant l'ús de la paraula 'títol':",
-	"Create a modelfile": "Crea un fitxer de model",
+	"Create a model": "",
 	"Create Account": "Crea un Compte",
 	"Create new key": "Crea una nova clau",
 	"Create new secret key": "Crea una nova clau secreta",
@@ -118,7 +118,7 @@
 	"Current Model": "Model Actual",
 	"Current Password": "Contrasenya Actual",
 	"Custom": "Personalitzat",
-	"Customize Ollama models for a specific purpose": "Personalitza els models Ollama per a un propòsit específic",
+	"Customize models for a specific purpose": "",
 	"Dark": "Fosc",
 	"Dashboard": "Tauler",
 	"Database": "Base de Dades",
@@ -139,11 +139,11 @@
 	"delete this link": "Esborra aquest enllaç",
 	"Delete User": "Esborra Usuari",
 	"Deleted {{deleteModelTag}}": "Esborrat {{deleteModelTag}}",
-	"Deleted {{tagName}}": "Esborrat {{tagName}}",
+	"Deleted {{name}}": "",
 	"Description": "Descripció",
 	"Didn't fully follow instructions": "No s'ha completat els instruccions",
 	"Disabled": "Desactivat",
-	"Discover a modelfile": "Descobreix un fitxer de model",
+	"Discover a model": "",
 	"Discover a prompt": "Descobreix un prompt",
 	"Discover, download, and explore custom prompts": "Descobreix, descarrega i explora prompts personalitzats",
 	"Discover, download, and explore model presets": "Descobreix, descarrega i explora presets de models",
@@ -177,11 +177,6 @@
 	"Enter Chunk Size": "Introdueix la Mida del Bloc",
 	"Enter Image Size (e.g. 512x512)": "Introdueix la Mida de la Imatge (p. ex. 512x512)",
 	"Enter language codes": "Introdueix els codis de llenguatge",
-	"Enter LiteLLM API Base URL (litellm_params.api_base)": "Introdueix l'URL Base de LiteLLM API (litellm_params.api_base)",
-	"Enter LiteLLM API Key (litellm_params.api_key)": "Introdueix la Clau de LiteLLM API (litellm_params.api_key)",
-	"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 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ó",
@@ -197,7 +192,7 @@
 	"Export All Chats (All Users)": "Exporta Tots els Xats (Tots els Usuaris)",
 	"Export Chats": "Exporta Xats",
 	"Export Documents Mapping": "Exporta el Mapatge de Documents",
-	"Export Modelfiles": "Exporta Fitxers de Model",
+	"Export Models": "",
 	"Export Prompts": "Exporta Prompts",
 	"Failed to create API Key.": "No s'ha pogut crear la clau d'API.",
 	"Failed to read clipboard contents": "No s'ha pogut llegir el contingut del porta-retalls",
@@ -210,7 +205,7 @@
 	"Focus chat input": "Enfoca l'entrada del xat",
 	"Followed instructions perfectly": "Siguiu les instruccions perfeicte",
 	"Format your variables using square brackets like this:": "Formata les teves variables utilitzant claudàtors així:",
-	"From (Base Model)": "Des de (Model Base)",
+	"Frequencey Penalty": "",
 	"Full Screen Mode": "Mode de Pantalla Completa",
 	"General": "General",
 	"General Settings": "Configuració General",
@@ -222,7 +217,6 @@
 	"Hello, {{name}}": "Hola, {{name}}",
 	"Help": "Ajuda",
 	"Hide": "Amaga",
-	"Hide Additional Params": "Amaga Paràmetres Addicionals",
 	"How can I help you today?": "Com et puc ajudar avui?",
 	"Hybrid Search": "Cerca Hibrida",
 	"Image Generation (Experimental)": "Generació d'Imatges (Experimental)",
@@ -231,7 +225,7 @@
 	"Images": "Imatges",
 	"Import Chats": "Importa Xats",
 	"Import Documents Mapping": "Importa el Mapa de Documents",
-	"Import Modelfiles": "Importa Fitxers de Model",
+	"Import Models": "",
 	"Import Prompts": "Importa Prompts",
 	"Include `--api` flag when running stable-diffusion-webui": "Inclou la bandera `--api` quan executis stable-diffusion-webui",
 	"Input commands": "Entra ordres",
@@ -240,6 +234,7 @@
 	"January": "Gener",
 	"join our Discord for help.": "uneix-te al nostre Discord per ajuda.",
 	"JSON": "JSON",
+	"JSON Preview": "",
 	"July": "Juliol",
 	"June": "Juny",
 	"JWT Expiration": "Expiració de JWT",
@@ -254,11 +249,10 @@
 	"LTR": "LTR",
 	"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 Models": "Gestiona Models",
 	"Manage Ollama Models": "Gestiona Models Ollama",
 	"March": "Març",
-	"Max Tokens": "Màxim de Tokens",
+	"Max Tokens (num_predict)": "",
 	"Maximum of 3 models can be downloaded simultaneously. Please try again later.": "Es poden descarregar un màxim de 3 models simultàniament. Si us plau, prova-ho més tard.",
 	"May": "Maig",
 	"Memories accessible by LLMs will be shown here.": "Els memòries accessible per a LLMs es mostraran aquí.",
@@ -273,22 +267,19 @@
 	"Model '{{modelName}}' has been successfully downloaded.": "El model '{{modelName}}' s'ha descarregat amb èxit.",
 	"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 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 Name": "Nom del Model",
+	"Model ID": "",
 	"Model not selected": "Model no seleccionat",
-	"Model Tag Name": "Nom de l'Etiqueta del Model",
+	"Model Params": "",
 	"Model Whitelisting": "Llista Blanca de Models",
 	"Model(s) Whitelisted": "Model(s) a la Llista Blanca",
-	"Modelfile": "Fitxer de Model",
-	"Modelfile Advanced Settings": "Configuració Avançada de Fitxers de Model",
 	"Modelfile Content": "Contingut del Fitxer de Model",
-	"Modelfiles": "Fitxers de Model",
 	"Models": "Models",
 	"More": "Més",
 	"Name": "Nom",
 	"Name Tag": "Etiqueta de Nom",
-	"Name your modelfile": "Nomena el teu fitxer de model",
+	"Name your model": "",
 	"New Chat": "Xat Nou",
 	"New Password": "Nova Contrasenya",
 	"No results found": "No s'han trobat resultats",
@@ -296,8 +287,6 @@
 	"No search results found": "",
 	"No source available": "Sense font disponible",
 	"Not factually correct": "No està clarament correcte",
-	"Not sure what to add?": "No estàs segur del que afegir?",
-	"Not sure what to write? Switch to": "No estàs segur del que escriure? Canvia a",
 	"Note: If you set a minimum score, the search will only return documents with a score greater than or equal to the minimum score.": "Nota: Si establiscs una puntuació mínima, la cerca només retornarà documents amb una puntuació major o igual a la puntuació mínima.",
 	"Notifications": "Notificacions d'Escriptori",
 	"November": "Novembre",
@@ -326,7 +315,6 @@
 	"or": "o",
 	"Other": "Altres",
 	"Overview": "Visió general",
-	"Parameters": "Paràmetres",
 	"Password": "Contrasenya",
 	"PDF document (.pdf)": "Document PDF (.pdf)",
 	"PDF Extract Images (OCR)": "Extreu Imatges de PDF (OCR)",
@@ -346,10 +334,8 @@
 	"Prompts": "Prompts",
 	"Pull \"{{searchValue}}\" from Ollama.com": "Treu \"{{searchValue}}\" de Ollama.com",
 	"Pull a model from Ollama.com": "Treu un model d'Ollama.com",
-	"Pull Progress": "Progrés de Tracció",
 	"Query Params": "Paràmetres de Consulta",
 	"RAG Template": "Plantilla RAG",
-	"Raw Format": "Format Brut",
 	"Read Aloud": "Llegiu al voltant",
 	"Record voice": "Enregistra veu",
 	"Redirecting you to OpenWebUI Community": "Redirigint-te a la Comunitat OpenWebUI",
@@ -360,7 +346,6 @@
 	"Remove Model": "Elimina Model",
 	"Rename": "Canvia el nom",
 	"Repeat Last N": "Repeteix Últim N",
-	"Repeat Penalty": "Penalització de Repetició",
 	"Request Mode": "Mode de Sol·licitud",
 	"Reranking Model": "Model de Reranking desactivat",
 	"Reranking model disabled": "Model de Reranking desactivat",
@@ -387,10 +372,12 @@
 	"See readme.md for instructions": "Consulta el readme.md per a instruccions",
 	"See what's new": "Veure novetats",
 	"Seed": "Llavor",
+	"Select a base model": "",
 	"Select a mode": "Selecciona un mode",
 	"Select a model": "Selecciona un model",
 	"Select an Ollama instance": "Selecciona una instància d'Ollama",
 	"Select model": "Selecciona un model",
+	"Selected model(s) do not support image inputs": "",
 	"Send": "Envia",
 	"Send a Message": "Envia un Missatge",
 	"Send message": "Envia missatge",
@@ -412,7 +399,6 @@
 	"Share to OpenWebUI Community": "Comparteix amb la Comunitat OpenWebUI",
 	"short-summary": "resum curt",
 	"Show": "Mostra",
-	"Show Additional Params": "Mostra Paràmetres Addicionals",
 	"Show shortcuts": "Mostra dreceres",
 	"Showcased creativity": "Mostra la creativitat",
 	"sidebar": "barra lateral",
@@ -431,7 +417,6 @@
 	"Success": "Èxit",
 	"Successfully updated.": "Actualitzat amb èxit.",
 	"Suggested": "Suggerit",
-	"Sync All": "Sincronitza Tot",
 	"System": "Sistema",
 	"System Prompt": "Prompt del Sistema",
 	"Tags": "Etiquetes",
@@ -502,6 +487,7 @@
 	"Write a summary in 50 words that summarizes [topic or keyword].": "Escriu un resum en 50 paraules que resumeixi [tema o paraula clau].",
 	"Yesterday": "Ayer",
 	"You": "Tu",
+	"You cannot clone a base model": "",
 	"You have no archived conversations.": "No tens converses arxivades.",
 	"You have shared this chat": "Has compartit aquest xat",
 	"You're a helpful assistant.": "Ets un assistent útil.",

+ 23 - 37
src/lib/i18n/locales/ceb-PH/translation.json

@@ -3,6 +3,8 @@
 	"(Beta)": "(Beta)",
 	"(e.g. `sh webui.sh --api`)": "(pananglitan `sh webui.sh --api`)",
 	"(latest)": "",
+	"{{ models }}": "",
+	"{{ owner }}: You cannot delete a base model": "",
 	"{{modelName}} is thinking...": "{{modelName}} hunahunaa...",
 	"{{user}}'s Chats": "",
 	"{{webUIName}} Backend Required": "Backend {{webUIName}} gikinahanglan",
@@ -12,9 +14,8 @@
 	"Account": "Account",
 	"Accurate information": "",
 	"Add": "",
-	"Add a model": "Pagdugang ug template",
-	"Add a model tag name": "Pagdugang usa ka ngalan sa tag alang sa template",
-	"Add a short description about what this modelfile does": "Pagdugang usa ka mubo nga paghulagway kung unsa ang gibuhat sa kini nga template file",
+	"Add a model id": "",
+	"Add a short description about what this model does": "",
 	"Add a short title for this prompt": "Pagdugang og usa ka mubo nga titulo alang niini nga prompt",
 	"Add a tag": "Pagdugang og tag",
 	"Add custom prompt": "Pagdugang og custom prompt",
@@ -30,6 +31,7 @@
 	"Admin Panel": "Admin Panel",
 	"Admin Settings": "Mga setting sa administratibo",
 	"Advanced Parameters": "advanced settings",
+	"Advanced Params": "",
 	"all": "tanan",
 	"All Documents": "",
 	"All Users": "Ang tanan nga mga tiggamit",
@@ -44,7 +46,6 @@
 	"API Key": "yawe sa API",
 	"API Key created.": "",
 	"API keys": "",
-	"API RPM": "RPM API",
 	"April": "",
 	"Archive": "",
 	"Archived Chats": "pagrekord sa chat",
@@ -61,12 +62,12 @@
 	"available!": "magamit!",
 	"Back": "Balik",
 	"Bad Response": "",
+	"Base Model (From)": "",
 	"before": "",
 	"Being lazy": "",
-	"Builder Mode": "Mode sa Magtutukod",
 	"Bypass SSL verification for Websites": "",
 	"Cancel": "Pagkanselar",
-	"Categories": "Mga kategoriya",
+	"Capabilities": "",
 	"Change Password": "Usba ang password",
 	"Chat": "Panaghisgot",
 	"Chat Bubble UI": "",
@@ -84,7 +85,6 @@
 	"Citation": "Mga kinutlo",
 	"Click here for help.": "I-klik dinhi alang sa tabang.",
 	"Click here to": "",
-	"Click here to check other modelfiles.": "Pag-klik dinhi aron susihon ang ubang mga file sa template.",
 	"Click here to select": "I-klik dinhi aron makapili",
 	"Click here to select a csv file.": "",
 	"Click here to select documents.": "Pag-klik dinhi aron mapili ang mga dokumento.",
@@ -109,7 +109,7 @@
 	"Copy Link": "",
 	"Copying to clipboard was successful!": "Ang pagkopya sa clipboard malampuson!",
 	"Create a concise, 3-5 word phrase as a header for the following query, strictly adhering to the 3-5 word limit and avoiding the use of the word 'title':": "Paghimo og mugbo nga 3-5 ka pulong nga sentence isip usa ka ulohan alang sa mosunod nga pangutana, hugot nga pagsunod sa 3-5 ka pulong nga limitasyon ug paglikay sa paggamit sa pulong nga 'titulo':",
-	"Create a modelfile": "Paghimo ug template file",
+	"Create a model": "",
 	"Create Account": "Paghimo og account",
 	"Create new key": "",
 	"Create new secret key": "",
@@ -118,7 +118,7 @@
 	"Current Model": "Kasamtangang modelo",
 	"Current Password": "Kasamtangang Password",
 	"Custom": "Custom",
-	"Customize Ollama models for a specific purpose": "Ipasibo ang mga template sa Ollama alang sa usa ka piho nga katuyoan",
+	"Customize models for a specific purpose": "",
 	"Dark": "Ngitngit",
 	"Dashboard": "",
 	"Database": "Database",
@@ -139,11 +139,11 @@
 	"delete this link": "",
 	"Delete User": "",
 	"Deleted {{deleteModelTag}}": "{{deleteModelTag}} gipapas",
-	"Deleted {{tagName}}": "",
+	"Deleted {{name}}": "",
 	"Description": "Deskripsyon",
 	"Didn't fully follow instructions": "",
 	"Disabled": "Nabaldado",
-	"Discover a modelfile": "Pagdiskobre ug template file",
+	"Discover a model": "",
 	"Discover a prompt": "Pagkaplag usa ka prompt",
 	"Discover, download, and explore custom prompts": "Pagdiskubre, pag-download ug pagsuhid sa mga naandan nga pag-aghat",
 	"Discover, download, and explore model presets": "Pagdiskobre, pag-download, ug pagsuhid sa mga preset sa template",
@@ -177,11 +177,6 @@
 	"Enter Chunk Size": "Isulod ang block size",
 	"Enter Image Size (e.g. 512x512)": "Pagsulod sa gidak-on sa hulagway (pananglitan 512x512)",
 	"Enter language codes": "",
-	"Enter LiteLLM API Base URL (litellm_params.api_base)": "Pagsulod sa LiteLLM API base URL (litelm_params.api_base)",
-	"Enter LiteLLM API Key (litellm_params.api_key)": "Isulod ang LiteLLM API key (litelm_params.api_key)",
-	"Enter LiteLLM API RPM (litellm_params.rpm)": "Isulod ang LiteLLM API RPM (litelm_params.rpm)",
-	"Enter LiteLLM Model (litellm_params.model)": "Pagsulod sa LiteLLM nga modelo (litelm_params.model)",
-	"Enter Max Tokens (litellm_params.max_tokens)": "Pagsulod sa max nga gidaghanon sa mga token (litelm_params.max_tokens)",
 	"Enter model tag (e.g. {{modelTag}})": "Pagsulod sa template tag (e.g. {{modelTag}})",
 	"Enter Number of Steps (e.g. 50)": "Pagsulod sa gidaghanon sa mga lakang (e.g. 50)",
 	"Enter Score": "",
@@ -197,7 +192,7 @@
 	"Export All Chats (All Users)": "I-export ang tanan nga mga chat (Tanan nga tiggamit)",
 	"Export Chats": "I-export ang mga chat",
 	"Export Documents Mapping": "I-export ang pagmapa sa dokumento",
-	"Export Modelfiles": "I-export ang mga file sa modelo",
+	"Export Models": "",
 	"Export Prompts": "Export prompts",
 	"Failed to create API Key.": "",
 	"Failed to read clipboard contents": "Napakyas sa pagbasa sa sulod sa clipboard",
@@ -210,7 +205,7 @@
 	"Focus chat input": "Pag-focus sa entry sa diskusyon",
 	"Followed instructions perfectly": "",
 	"Format your variables using square brackets like this:": "I-format ang imong mga variable gamit ang square brackets sama niini:",
-	"From (Base Model)": "Gikan sa (Basic nga modelo)",
+	"Frequencey Penalty": "",
 	"Full Screen Mode": "Full screen mode",
 	"General": "Heneral",
 	"General Settings": "kinatibuk-ang mga setting",
@@ -222,7 +217,6 @@
 	"Hello, {{name}}": "Maayong buntag, {{name}}",
 	"Help": "",
 	"Hide": "Tagoa",
-	"Hide Additional Params": "Tagoa ang dugang nga mga setting",
 	"How can I help you today?": "Unsaon nako pagtabang kanimo karon?",
 	"Hybrid Search": "",
 	"Image Generation (Experimental)": "Pagmugna og hulagway (Eksperimento)",
@@ -231,7 +225,7 @@
 	"Images": "Mga hulagway",
 	"Import Chats": "Import nga mga chat",
 	"Import Documents Mapping": "Import nga pagmapa sa dokumento",
-	"Import Modelfiles": "Import nga mga file sa modelo",
+	"Import Models": "",
 	"Import Prompts": "Import prompt",
 	"Include `--api` flag when running stable-diffusion-webui": "Iapil ang `--api` nga bandila kung nagdagan nga stable-diffusion-webui",
 	"Input commands": "Pagsulod sa input commands",
@@ -240,6 +234,7 @@
 	"January": "",
 	"join our Discord for help.": "Apil sa among Discord alang sa tabang.",
 	"JSON": "JSON",
+	"JSON Preview": "",
 	"July": "",
 	"June": "",
 	"JWT Expiration": "Pag-expire sa JWT",
@@ -254,11 +249,10 @@
 	"LTR": "",
 	"Made by OpenWebUI Community": "Gihimo sa komunidad sa OpenWebUI",
 	"Make sure to enclose them with": "Siguruha nga palibutan sila",
-	"Manage LiteLLM Models": "Pagdumala sa mga modelo sa LiteLLM",
 	"Manage Models": "Pagdumala sa mga templates",
 	"Manage Ollama Models": "Pagdumala sa mga modelo sa Ollama",
 	"March": "",
-	"Max Tokens": "Maximum nga mga token",
+	"Max Tokens (num_predict)": "",
 	"Maximum of 3 models can be downloaded simultaneously. Please try again later.": "Ang labing taas nga 3 nga mga disenyo mahimong ma-download nga dungan. ",
 	"May": "",
 	"Memories accessible by LLMs will be shown here.": "",
@@ -273,22 +267,19 @@
 	"Model '{{modelName}}' has been successfully downloaded.": "Ang modelo'{{modelName}}' malampuson nga na-download.",
 	"Model '{{modelTag}}' is already in queue for downloading.": "Ang modelo'{{modelTag}}' naa na sa pila para ma-download.",
 	"Model {{modelId}} not found": "Modelo {{modelId}} wala makit-an",
-	"Model {{modelName}} already exists.": "Ang modelo {{modelName}} Anaa na.",
+	"Model {{modelName}} is not vision capable": "",
 	"Model filesystem path detected. Model shortname is required for update, cannot continue.": "",
-	"Model Name": "Ngalan sa Modelo",
+	"Model ID": "",
 	"Model not selected": "Wala gipili ang modelo",
-	"Model Tag Name": "Ngalan sa tag sa modelo",
+	"Model Params": "",
 	"Model Whitelisting": "Whitelist sa modelo",
 	"Model(s) Whitelisted": "Gi-whitelist nga (mga) modelo",
-	"Modelfile": "File sa template",
-	"Modelfile Advanced Settings": "Advanced nga template file setting",
 	"Modelfile Content": "Mga sulod sa template file",
-	"Modelfiles": "Mga file sa modelo",
 	"Models": "Mga modelo",
 	"More": "",
 	"Name": "Ngalan",
 	"Name Tag": "Tag sa ngalan",
-	"Name your modelfile": "Ngalan ang imong template file",
+	"Name your model": "",
 	"New Chat": "Bag-ong diskusyon",
 	"New Password": "Bag-ong Password",
 	"No results found": "",
@@ -296,8 +287,6 @@
 	"No search results found": "",
 	"No source available": "Walay tinubdan nga anaa",
 	"Not factually correct": "",
-	"Not sure what to add?": "Dili sigurado kung unsa ang idugang?",
-	"Not sure what to write? Switch to": "Dili sigurado kung unsa ang isulat? ",
 	"Note: If you set a minimum score, the search will only return documents with a score greater than or equal to the minimum score.": "",
 	"Notifications": "Mga pahibalo sa desktop",
 	"November": "",
@@ -326,7 +315,6 @@
 	"or": "O",
 	"Other": "",
 	"Overview": "",
-	"Parameters": "Mga setting",
 	"Password": "Password",
 	"PDF document (.pdf)": "",
 	"PDF Extract Images (OCR)": "PDF Image Extraction (OCR)",
@@ -346,10 +334,8 @@
 	"Prompts": "Mga aghat",
 	"Pull \"{{searchValue}}\" from Ollama.com": "",
 	"Pull a model from Ollama.com": "Pagkuha ug template gikan sa Ollama.com",
-	"Pull Progress": "Pag-uswag sa pag-download",
 	"Query Params": "Mga parameter sa pangutana",
 	"RAG Template": "RAG nga modelo",
-	"Raw Format": "Hilaw nga pormat",
 	"Read Aloud": "",
 	"Record voice": "Irekord ang tingog",
 	"Redirecting you to OpenWebUI Community": "Gi-redirect ka sa komunidad sa OpenWebUI",
@@ -360,7 +346,6 @@
 	"Remove Model": "",
 	"Rename": "",
 	"Repeat Last N": "Balika ang katapusang N",
-	"Repeat Penalty": "Balika ang silot",
 	"Request Mode": "Query mode",
 	"Reranking Model": "",
 	"Reranking model disabled": "",
@@ -387,10 +372,12 @@
 	"See readme.md for instructions": "Tan-awa ang readme.md alang sa mga panudlo",
 	"See what's new": "Tan-awa unsay bag-o",
 	"Seed": "Binhi",
+	"Select a base model": "",
 	"Select a mode": "Pagpili og mode",
 	"Select a model": "Pagpili og modelo",
 	"Select an Ollama instance": "Pagpili usa ka pananglitan sa Ollama",
 	"Select model": "Pagpili og modelo",
+	"Selected model(s) do not support image inputs": "",
 	"Send": "",
 	"Send a Message": "Magpadala ug mensahe",
 	"Send message": "Magpadala ug mensahe",
@@ -412,7 +399,6 @@
 	"Share to OpenWebUI Community": "Ipakigbahin sa komunidad sa OpenWebUI",
 	"short-summary": "mubo nga summary",
 	"Show": "Pagpakita",
-	"Show Additional Params": "Ipakita ang dugang nga mga setting",
 	"Show shortcuts": "Ipakita ang mga shortcut",
 	"Showcased creativity": "",
 	"sidebar": "lateral bar",
@@ -431,7 +417,6 @@
 	"Success": "Kalampusan",
 	"Successfully updated.": "Malampuson nga na-update.",
 	"Suggested": "",
-	"Sync All": "I-synchronize ang tanan",
 	"System": "Sistema",
 	"System Prompt": "Madasig nga Sistema",
 	"Tags": "Mga tag",
@@ -502,6 +487,7 @@
 	"Write a summary in 50 words that summarizes [topic or keyword].": "Pagsulat og 50 ka pulong nga summary nga nagsumaryo [topic o keyword].",
 	"Yesterday": "",
 	"You": "",
+	"You cannot clone a base model": "",
 	"You have no archived conversations.": "",
 	"You have shared this chat": "",
 	"You're a helpful assistant.": "Usa ka ka mapuslanon nga katabang",

+ 23 - 37
src/lib/i18n/locales/de-DE/translation.json

@@ -3,6 +3,8 @@
 	"(Beta)": "(Beta)",
 	"(e.g. `sh webui.sh --api`)": "(z.B. `sh webui.sh --api`)",
 	"(latest)": "(neueste)",
+	"{{ models }}": "",
+	"{{ owner }}: You cannot delete a base model": "",
 	"{{modelName}} is thinking...": "{{modelName}} denkt nach...",
 	"{{user}}'s Chats": "{{user}}s Chats",
 	"{{webUIName}} Backend Required": "{{webUIName}}-Backend erforderlich",
@@ -12,9 +14,8 @@
 	"Account": "Account",
 	"Accurate information": "Genaue Information",
 	"Add": "Hinzufügen",
-	"Add a model": "Füge ein Modell hinzu",
-	"Add a model tag name": "Benenne deinen Modell-Tag",
-	"Add a short description about what this modelfile does": "Füge eine kurze Beschreibung hinzu, was dieses Modelfile kann",
+	"Add a model id": "",
+	"Add a short description about what this model does": "",
 	"Add a short title for this prompt": "Füge einen kurzen Titel für diesen Prompt hinzu",
 	"Add a tag": "benenne",
 	"Add custom prompt": "Eigenen Prompt hinzufügen",
@@ -30,6 +31,7 @@
 	"Admin Panel": "Admin Panel",
 	"Admin Settings": "Admin Einstellungen",
 	"Advanced Parameters": "Erweiterte Parameter",
+	"Advanced Params": "",
 	"all": "Alle",
 	"All Documents": "Alle Dokumente",
 	"All Users": "Alle Benutzer",
@@ -44,7 +46,6 @@
 	"API Key": "API Key",
 	"API Key created.": "API Key erstellt",
 	"API keys": "API Schlüssel",
-	"API RPM": "API RPM",
 	"April": "April",
 	"Archive": "Archivieren",
 	"Archived Chats": "Archivierte Chats",
@@ -61,12 +62,12 @@
 	"available!": "verfügbar!",
 	"Back": "Zurück",
 	"Bad Response": "Schlechte Antwort",
+	"Base Model (From)": "",
 	"before": "bereits geteilt",
 	"Being lazy": "Faul sein",
-	"Builder Mode": "Builder Modus",
 	"Bypass SSL verification for Websites": "Bypass SSL-Verifizierung für Websites",
 	"Cancel": "Abbrechen",
-	"Categories": "Kategorien",
+	"Capabilities": "",
 	"Change Password": "Passwort ändern",
 	"Chat": "Chat",
 	"Chat Bubble UI": "Chat Bubble UI",
@@ -84,7 +85,6 @@
 	"Citation": "Zitate",
 	"Click here for help.": "Klicke hier für Hilfe.",
 	"Click here to": "Klicke hier, um",
-	"Click here to check other modelfiles.": "Klicke hier, um andere Modelfiles zu überprüfen.",
 	"Click here to select": "Klicke hier um auszuwählen",
 	"Click here to select a csv file.": "Klicke hier um eine CSV-Datei auszuwählen.",
 	"Click here to select documents.": "Klicke hier um Dokumente auszuwählen",
@@ -109,7 +109,7 @@
 	"Copy Link": "Link kopieren",
 	"Copying to clipboard was successful!": "Das Kopieren in die Zwischenablage war erfolgreich!",
 	"Create a concise, 3-5 word phrase as a header for the following query, strictly adhering to the 3-5 word limit and avoiding the use of the word 'title':": "Erstelle einen prägnanten Satz mit 3-5 Wörtern als Überschrift für die folgende Abfrage. Halte dich dabei strikt an die 3-5-Wort-Grenze und vermeide die Verwendung des Wortes Titel:",
-	"Create a modelfile": "Modelfiles erstellen",
+	"Create a model": "",
 	"Create Account": "Konto erstellen",
 	"Create new key": "Neuen Schlüssel erstellen",
 	"Create new secret key": "Neuen API Schlüssel erstellen",
@@ -118,7 +118,7 @@
 	"Current Model": "Aktuelles Modell",
 	"Current Password": "Aktuelles Passwort",
 	"Custom": "Benutzerdefiniert",
-	"Customize Ollama models for a specific purpose": "Ollama-Modelle für einen bestimmten Zweck anpassen",
+	"Customize models for a specific purpose": "",
 	"Dark": "Dunkel",
 	"Dashboard": "Dashboard",
 	"Database": "Datenbank",
@@ -139,11 +139,11 @@
 	"delete this link": "diesen Link zu löschen",
 	"Delete User": "Benutzer löschen",
 	"Deleted {{deleteModelTag}}": "{{deleteModelTag}} gelöscht",
-	"Deleted {{tagName}}": "{{tagName}} gelöscht",
+	"Deleted {{name}}": "",
 	"Description": "Beschreibung",
 	"Didn't fully follow instructions": "Nicht genau den Answeisungen gefolgt",
 	"Disabled": "Deaktiviert",
-	"Discover a modelfile": "Ein Modelfile entdecken",
+	"Discover a model": "",
 	"Discover a prompt": "Einen Prompt entdecken",
 	"Discover, download, and explore custom prompts": "Benutzerdefinierte Prompts entdecken, herunterladen und erkunden",
 	"Discover, download, and explore model presets": "Modellvorgaben entdecken, herunterladen und erkunden",
@@ -177,11 +177,6 @@
 	"Enter Chunk Size": "Gib die Chunk Size ein",
 	"Enter Image Size (e.g. 512x512)": "Gib die Bildgröße ein (z.B. 512x512)",
 	"Enter language codes": "Geben Sie die Sprachcodes ein",
-	"Enter LiteLLM API Base URL (litellm_params.api_base)": "Gib die LiteLLM API BASE URL ein (litellm_params.api_base)",
-	"Enter LiteLLM API Key (litellm_params.api_key)": "Gib den LiteLLM API Key ein (litellm_params.api_key)",
-	"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 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",
@@ -197,7 +192,7 @@
 	"Export All Chats (All Users)": "Alle Chats exportieren (alle Benutzer)",
 	"Export Chats": "Chats exportieren",
 	"Export Documents Mapping": "Dokumentenmapping exportieren",
-	"Export Modelfiles": "Modelfiles exportieren",
+	"Export Models": "",
 	"Export Prompts": "Prompts exportieren",
 	"Failed to create API Key.": "API Key erstellen fehlgeschlagen",
 	"Failed to read clipboard contents": "Fehler beim Lesen des Zwischenablageninhalts",
@@ -210,7 +205,7 @@
 	"Focus chat input": "Chat-Eingabe fokussieren",
 	"Followed instructions perfectly": "Anweisungen perfekt befolgt",
 	"Format your variables using square brackets like this:": "Formatiere deine Variablen mit eckigen Klammern wie folgt:",
-	"From (Base Model)": "Von (Basismodell)",
+	"Frequencey Penalty": "",
 	"Full Screen Mode": "Vollbildmodus",
 	"General": "Allgemein",
 	"General Settings": "Allgemeine Einstellungen",
@@ -222,7 +217,6 @@
 	"Hello, {{name}}": "Hallo, {{name}}",
 	"Help": "Hilfe",
 	"Hide": "Verbergen",
-	"Hide Additional Params": "Verstecke zusätzliche Parameter",
 	"How can I help you today?": "Wie kann ich dir heute helfen?",
 	"Hybrid Search": "Hybride Suche",
 	"Image Generation (Experimental)": "Bildgenerierung (experimentell)",
@@ -231,7 +225,7 @@
 	"Images": "Bilder",
 	"Import Chats": "Chats importieren",
 	"Import Documents Mapping": "Dokumentenmapping importieren",
-	"Import Modelfiles": "Modelfiles importieren",
+	"Import Models": "",
 	"Import Prompts": "Prompts importieren",
 	"Include `--api` flag when running stable-diffusion-webui": "Füge das `--api`-Flag hinzu, wenn du stable-diffusion-webui nutzt",
 	"Input commands": "Eingabebefehle",
@@ -240,6 +234,7 @@
 	"January": "Januar",
 	"join our Discord for help.": "Trete unserem Discord bei, um Hilfe zu erhalten.",
 	"JSON": "JSON",
+	"JSON Preview": "",
 	"July": "Juli",
 	"June": "Juni",
 	"JWT Expiration": "JWT-Ablauf",
@@ -254,11 +249,10 @@
 	"LTR": "LTR",
 	"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 Models": "Modelle verwalten",
 	"Manage Ollama Models": "Ollama-Modelle verwalten",
 	"March": "März",
-	"Max Tokens": "Maximale Tokens",
+	"Max Tokens (num_predict)": "",
 	"Maximum of 3 models can be downloaded simultaneously. Please try again later.": "Es können maximal 3 Modelle gleichzeitig heruntergeladen werden. Bitte versuche es später erneut.",
 	"May": "Mai",
 	"Memories accessible by LLMs will be shown here.": "Memories, die von LLMs zugänglich sind, werden hier angezeigt.",
@@ -273,22 +267,19 @@
 	"Model '{{modelName}}' has been successfully downloaded.": "Modell '{{modelName}}' wurde erfolgreich heruntergeladen.",
 	"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 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 Name": "Modellname",
+	"Model ID": "",
 	"Model not selected": "Modell nicht ausgewählt",
-	"Model Tag Name": "Modell-Tag-Name",
+	"Model Params": "",
 	"Model Whitelisting": "Modell-Whitelisting",
 	"Model(s) Whitelisted": "Modell(e) auf der Whitelist",
-	"Modelfile": "Modelfiles",
-	"Modelfile Advanced Settings": "Erweiterte Modelfileseinstellungen",
 	"Modelfile Content": "Modelfile Content",
-	"Modelfiles": "Modelfiles",
 	"Models": "Modelle",
 	"More": "Mehr",
 	"Name": "Name",
 	"Name Tag": "Namens-Tag",
-	"Name your modelfile": "Benenne dein modelfile",
+	"Name your model": "",
 	"New Chat": "Neuer Chat",
 	"New Password": "Neues Passwort",
 	"No results found": "Keine Ergebnisse gefunden",
@@ -296,8 +287,6 @@
 	"No search results found": "",
 	"No source available": "Keine Quelle verfügbar.",
 	"Not factually correct": "Nicht sachlich korrekt.",
-	"Not sure what to add?": "Nicht sicher, was hinzugefügt werden soll?",
-	"Not sure what to write? Switch to": "Nicht sicher, was du schreiben sollst? Wechsel zu",
 	"Note: If you set a minimum score, the search will only return documents with a score greater than or equal to the minimum score.": "Hinweis: Wenn du einen Mindestscore festlegst, wird die Suche nur Dokumente zurückgeben, deren Score größer oder gleich dem Mindestscore ist.",
 	"Notifications": "Desktop-Benachrichtigungen",
 	"November": "November",
@@ -326,7 +315,6 @@
 	"or": "oder",
 	"Other": "Andere",
 	"Overview": "Übersicht",
-	"Parameters": "Parameter",
 	"Password": "Passwort",
 	"PDF document (.pdf)": "PDF-Dokument (.pdf)",
 	"PDF Extract Images (OCR)": "Text von Bildern aus PDFs extrahieren (OCR)",
@@ -346,10 +334,8 @@
 	"Prompts": "Prompts",
 	"Pull \"{{searchValue}}\" from Ollama.com": "\"{{searchValue}}\" von Ollama.com herunterladen",
 	"Pull a model from Ollama.com": "Ein Modell von Ollama.com abrufen",
-	"Pull Progress": "Fortschritt abrufen",
 	"Query Params": "Query Parameter",
 	"RAG Template": "RAG-Vorlage",
-	"Raw Format": "Rohformat",
 	"Read Aloud": "Vorlesen",
 	"Record voice": "Stimme aufnehmen",
 	"Redirecting you to OpenWebUI Community": "Du wirst zur OpenWebUI-Community weitergeleitet",
@@ -360,7 +346,6 @@
 	"Remove Model": "Modell entfernen",
 	"Rename": "Umbenennen",
 	"Repeat Last N": "Repeat Last N",
-	"Repeat Penalty": "Repeat Penalty",
 	"Request Mode": "Request-Modus",
 	"Reranking Model": "Reranking Modell",
 	"Reranking model disabled": "Rranking Modell deaktiviert",
@@ -387,10 +372,12 @@
 	"See readme.md for instructions": "Anleitung in readme.md anzeigen",
 	"See what's new": "Was gibt's Neues",
 	"Seed": "Seed",
+	"Select a base model": "",
 	"Select a mode": "Einen Modus auswählen",
 	"Select a model": "Ein Modell auswählen",
 	"Select an Ollama instance": "Eine Ollama Instanz auswählen",
 	"Select model": "Modell auswählen",
+	"Selected model(s) do not support image inputs": "",
 	"Send": "Senden",
 	"Send a Message": "Eine Nachricht senden",
 	"Send message": "Nachricht senden",
@@ -412,7 +399,6 @@
 	"Share to OpenWebUI Community": "Mit OpenWebUI Community teilen",
 	"short-summary": "kurze-zusammenfassung",
 	"Show": "Anzeigen",
-	"Show Additional Params": "Zusätzliche Parameter anzeigen",
 	"Show shortcuts": "Verknüpfungen anzeigen",
 	"Showcased creativity": "Kreativität zur Schau gestellt",
 	"sidebar": "Seitenleiste",
@@ -431,7 +417,6 @@
 	"Success": "Erfolg",
 	"Successfully updated.": "Erfolgreich aktualisiert.",
 	"Suggested": "Vorgeschlagen",
-	"Sync All": "Alles synchronisieren",
 	"System": "System",
 	"System Prompt": "System-Prompt",
 	"Tags": "Tags",
@@ -502,6 +487,7 @@
 	"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.",
 	"Yesterday": "Gestern",
 	"You": "Du",
+	"You cannot clone a base model": "",
 	"You have no archived conversations.": "Du hast keine archivierten Unterhaltungen.",
 	"You have shared this chat": "Du hast diesen Chat",
 	"You're a helpful assistant.": "Du bist ein hilfreicher Assistent.",

+ 23 - 37
src/lib/i18n/locales/dg-DG/translation.json

@@ -3,6 +3,8 @@
 	"(Beta)": "(Beta)",
 	"(e.g. `sh webui.sh --api`)": "(such e.g. `sh webui.sh --api`)",
 	"(latest)": "(much latest)",
+	"{{ models }}": "",
+	"{{ owner }}: You cannot delete a base model": "",
 	"{{modelName}} is thinking...": "{{modelName}} is thinkin'...",
 	"{{user}}'s Chats": "",
 	"{{webUIName}} Backend Required": "{{webUIName}} Backend Much Required",
@@ -12,9 +14,8 @@
 	"Account": "Account",
 	"Accurate information": "",
 	"Add": "",
-	"Add a model": "Add a model",
-	"Add a model tag name": "Add a model tag name",
-	"Add a short description about what this modelfile does": "Add short description about what this modelfile does",
+	"Add a model id": "",
+	"Add a short description about what this model does": "",
 	"Add a short title for this prompt": "Add short title for this prompt",
 	"Add a tag": "Add such tag",
 	"Add custom prompt": "",
@@ -30,6 +31,7 @@
 	"Admin Panel": "Admin Panel",
 	"Admin Settings": "Admin Settings",
 	"Advanced Parameters": "Advanced Parameters",
+	"Advanced Params": "",
 	"all": "all",
 	"All Documents": "",
 	"All Users": "All Users",
@@ -44,7 +46,6 @@
 	"API Key": "API Key",
 	"API Key created.": "",
 	"API keys": "",
-	"API RPM": "API RPM",
 	"April": "",
 	"Archive": "",
 	"Archived Chats": "",
@@ -61,12 +62,12 @@
 	"available!": "available! So excite!",
 	"Back": "Back",
 	"Bad Response": "",
+	"Base Model (From)": "",
 	"before": "",
 	"Being lazy": "",
-	"Builder Mode": "Builder Mode",
 	"Bypass SSL verification for Websites": "",
 	"Cancel": "Cancel",
-	"Categories": "Categories",
+	"Capabilities": "",
 	"Change Password": "Change Password",
 	"Chat": "Chat",
 	"Chat Bubble UI": "",
@@ -84,7 +85,6 @@
 	"Citation": "",
 	"Click here for help.": "Click for help. Much assist.",
 	"Click here to": "",
-	"Click here to check other modelfiles.": "Click to check other modelfiles.",
 	"Click here to select": "Click to select",
 	"Click here to select a csv file.": "",
 	"Click here to select documents.": "Click to select documents",
@@ -109,7 +109,7 @@
 	"Copy Link": "",
 	"Copying to clipboard was successful!": "Copying to clipboard was success! Very success!",
 	"Create a concise, 3-5 word phrase as a header for the following query, strictly adhering to the 3-5 word limit and avoiding the use of the word 'title':": "Create short phrase, 3-5 word, as header for query, much strict, avoid 'title':",
-	"Create a modelfile": "Create modelfile",
+	"Create a model": "",
 	"Create Account": "Create Account",
 	"Create new key": "",
 	"Create new secret key": "",
@@ -118,7 +118,7 @@
 	"Current Model": "Current Model",
 	"Current Password": "Current Password",
 	"Custom": "Custom",
-	"Customize Ollama models for a specific purpose": "Customize Ollama models for purpose",
+	"Customize models for a specific purpose": "",
 	"Dark": "Dark",
 	"Dashboard": "",
 	"Database": "Database",
@@ -139,11 +139,11 @@
 	"delete this link": "",
 	"Delete User": "",
 	"Deleted {{deleteModelTag}}": "Deleted {{deleteModelTag}}",
-	"Deleted {{tagName}}": "",
+	"Deleted {{name}}": "",
 	"Description": "Description",
 	"Didn't fully follow instructions": "",
 	"Disabled": "Disabled",
-	"Discover a modelfile": "Discover modelfile",
+	"Discover a model": "",
 	"Discover a prompt": "Discover a prompt",
 	"Discover, download, and explore custom prompts": "Discover, download, and explore custom prompts",
 	"Discover, download, and explore model presets": "Discover, download, and explore model presets",
@@ -177,11 +177,6 @@
 	"Enter Chunk Size": "Enter Size of Chunk",
 	"Enter Image Size (e.g. 512x512)": "Enter Size of Wow (e.g. 512x512)",
 	"Enter language codes": "",
-	"Enter LiteLLM API Base URL (litellm_params.api_base)": "Enter Base URL of LiteLLM API (litellm_params.api_base)",
-	"Enter LiteLLM API Key (litellm_params.api_key)": "Enter API Bark of LiteLLM (litellm_params.api_key)",
-	"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 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": "",
@@ -197,7 +192,7 @@
 	"Export All Chats (All Users)": "Export All Chats (All Doggos)",
 	"Export Chats": "Export Barks",
 	"Export Documents Mapping": "Export Mappings of Dogos",
-	"Export Modelfiles": "Export Modelfiles",
+	"Export Models": "",
 	"Export Prompts": "Export Promptos",
 	"Failed to create API Key.": "",
 	"Failed to read clipboard contents": "Failed to read clipboard borks",
@@ -210,7 +205,7 @@
 	"Focus chat input": "Focus chat bork",
 	"Followed instructions perfectly": "",
 	"Format your variables using square brackets like this:": "Format variables using square brackets like wow:",
-	"From (Base Model)": "From (Base Wow)",
+	"Frequencey Penalty": "",
 	"Full Screen Mode": "Much Full Bark Mode",
 	"General": "Woweral",
 	"General Settings": "General Doge Settings",
@@ -222,7 +217,6 @@
 	"Hello, {{name}}": "Much helo, {{name}}",
 	"Help": "",
 	"Hide": "Hide",
-	"Hide Additional Params": "Hide Extra Barkos",
 	"How can I help you today?": "How can I halp u today?",
 	"Hybrid Search": "",
 	"Image Generation (Experimental)": "Image Wow (Much Experiment)",
@@ -231,7 +225,7 @@
 	"Images": "Wowmages",
 	"Import Chats": "Import Barks",
 	"Import Documents Mapping": "Import Doge Mapping",
-	"Import Modelfiles": "Import Modelfiles",
+	"Import Models": "",
 	"Import Prompts": "Import Promptos",
 	"Include `--api` flag when running stable-diffusion-webui": "Include `--api` flag when running stable-diffusion-webui",
 	"Input commands": "Input commands",
@@ -240,6 +234,7 @@
 	"January": "",
 	"join our Discord for help.": "join our Discord for help.",
 	"JSON": "JSON",
+	"JSON Preview": "",
 	"July": "",
 	"June": "",
 	"JWT Expiration": "JWT Expire",
@@ -254,11 +249,10 @@
 	"LTR": "",
 	"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 Models": "Manage Wowdels",
 	"Manage Ollama Models": "Manage Ollama Wowdels",
 	"March": "",
-	"Max Tokens": "Max Tokens",
+	"Max Tokens (num_predict)": "",
 	"Maximum of 3 models can be downloaded simultaneously. Please try again later.": "Maximum of 3 models can be downloaded simultaneously. Please try again later.",
 	"May": "",
 	"Memories accessible by LLMs will be shown here.": "",
@@ -273,22 +267,19 @@
 	"Model '{{modelName}}' has been successfully downloaded.": "Model '{{modelName}}' has been successfully downloaded.",
 	"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 filesystem path detected. Model shortname is required for update, cannot continue.": "Model filesystem bark detected. Model shortname is required for update, cannot continue.",
-	"Model Name": "Wowdel Name",
+	"Model ID": "",
 	"Model not selected": "Model not selected",
-	"Model Tag Name": "Wowdel Tag Name",
+	"Model Params": "",
 	"Model Whitelisting": "Wowdel Whitelisting",
 	"Model(s) Whitelisted": "Wowdel(s) Whitelisted",
-	"Modelfile": "Modelfile",
-	"Modelfile Advanced Settings": "Modelfile Wow Settings",
 	"Modelfile Content": "Modelfile Content",
-	"Modelfiles": "Modelfiles",
 	"Models": "Wowdels",
 	"More": "",
 	"Name": "Name",
 	"Name Tag": "Name Tag",
-	"Name your modelfile": "Name your modelfile",
+	"Name your model": "",
 	"New Chat": "New Bark",
 	"New Password": "New Barkword",
 	"No results found": "",
@@ -296,8 +287,6 @@
 	"No search results found": "",
 	"No source available": "No source available",
 	"Not factually correct": "",
-	"Not sure what to add?": "Not sure what to add?",
-	"Not sure what to write? Switch to": "Not sure what to write? Switch to",
 	"Note: If you set a minimum score, the search will only return documents with a score greater than or equal to the minimum score.": "",
 	"Notifications": "Notifications",
 	"November": "",
@@ -326,7 +315,6 @@
 	"or": "or",
 	"Other": "",
 	"Overview": "",
-	"Parameters": "Parametos",
 	"Password": "Barkword",
 	"PDF document (.pdf)": "",
 	"PDF Extract Images (OCR)": "PDF Extract Wowmages (OCR)",
@@ -346,10 +334,8 @@
 	"Prompts": "Promptos",
 	"Pull \"{{searchValue}}\" from Ollama.com": "",
 	"Pull a model from Ollama.com": "Pull a wowdel from Ollama.com",
-	"Pull Progress": "Pull Progress",
 	"Query Params": "Query Bark",
 	"RAG Template": "RAG Template",
-	"Raw Format": "Raw Wowmat",
 	"Read Aloud": "",
 	"Record voice": "Record Bark",
 	"Redirecting you to OpenWebUI Community": "Redirecting you to OpenWebUI Community",
@@ -360,7 +346,6 @@
 	"Remove Model": "",
 	"Rename": "",
 	"Repeat Last N": "Repeat Last N",
-	"Repeat Penalty": "Repeat Penalty",
 	"Request Mode": "Request Bark",
 	"Reranking Model": "",
 	"Reranking model disabled": "",
@@ -387,10 +372,12 @@
 	"See readme.md for instructions": "See readme.md for instructions wow",
 	"See what's new": "See what's new so amaze",
 	"Seed": "Seed very plant",
+	"Select a base model": "",
 	"Select a mode": "Select a mode very choose",
 	"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 model(s) do not support image inputs": "",
 	"Send": "",
 	"Send a Message": "Send a Message much message",
 	"Send message": "Send message very send",
@@ -412,7 +399,6 @@
 	"Share to OpenWebUI Community": "Share to OpenWebUI Community much community",
 	"short-summary": "short-summary so short",
 	"Show": "Show much show",
-	"Show Additional Params": "Show Additional Params very many params",
 	"Show shortcuts": "Show shortcuts much shortcut",
 	"Showcased creativity": "",
 	"sidebar": "sidebar much side",
@@ -431,7 +417,6 @@
 	"Success": "Success very success",
 	"Successfully updated.": "Successfully updated. Very updated.",
 	"Suggested": "",
-	"Sync All": "Sync All much sync",
 	"System": "System very system",
 	"System Prompt": "System Prompt much prompt",
 	"Tags": "Tags very tags",
@@ -502,6 +487,7 @@
 	"Write a summary in 50 words that summarizes [topic or keyword].": "Write a summary in 50 words that summarizes [topic or keyword]. Much summarize.",
 	"Yesterday": "",
 	"You": "",
+	"You cannot clone a base model": "",
 	"You have no archived conversations.": "",
 	"You have shared this chat": "",
 	"You're a helpful assistant.": "You're a helpful assistant. Much helpful.",

+ 23 - 37
src/lib/i18n/locales/en-GB/translation.json

@@ -3,6 +3,8 @@
 	"(Beta)": "",
 	"(e.g. `sh webui.sh --api`)": "",
 	"(latest)": "",
+	"{{ models }}": "",
+	"{{ owner }}: You cannot delete a base model": "",
 	"{{modelName}} is thinking...": "",
 	"{{user}}'s Chats": "",
 	"{{webUIName}} Backend Required": "",
@@ -12,9 +14,8 @@
 	"Account": "",
 	"Accurate information": "",
 	"Add": "",
-	"Add a model": "",
-	"Add a model tag name": "",
-	"Add a short description about what this modelfile does": "",
+	"Add a model id": "",
+	"Add a short description about what this model does": "",
 	"Add a short title for this prompt": "",
 	"Add a tag": "",
 	"Add custom prompt": "",
@@ -30,6 +31,7 @@
 	"Admin Panel": "",
 	"Admin Settings": "",
 	"Advanced Parameters": "",
+	"Advanced Params": "",
 	"all": "",
 	"All Documents": "",
 	"All Users": "",
@@ -44,7 +46,6 @@
 	"API Key": "",
 	"API Key created.": "",
 	"API keys": "",
-	"API RPM": "",
 	"April": "",
 	"Archive": "",
 	"Archived Chats": "",
@@ -61,12 +62,12 @@
 	"available!": "",
 	"Back": "",
 	"Bad Response": "",
+	"Base Model (From)": "",
 	"before": "",
 	"Being lazy": "",
-	"Builder Mode": "",
 	"Bypass SSL verification for Websites": "",
 	"Cancel": "",
-	"Categories": "",
+	"Capabilities": "",
 	"Change Password": "",
 	"Chat": "",
 	"Chat Bubble UI": "",
@@ -84,7 +85,6 @@
 	"Citation": "",
 	"Click here for help.": "",
 	"Click here to": "",
-	"Click here to check other modelfiles.": "",
 	"Click here to select": "",
 	"Click here to select a csv file.": "",
 	"Click here to select documents.": "",
@@ -109,7 +109,7 @@
 	"Copy Link": "",
 	"Copying to clipboard was successful!": "",
 	"Create a concise, 3-5 word phrase as a header for the following query, strictly adhering to the 3-5 word limit and avoiding the use of the word 'title':": "",
-	"Create a modelfile": "",
+	"Create a model": "",
 	"Create Account": "",
 	"Create new key": "",
 	"Create new secret key": "",
@@ -118,7 +118,7 @@
 	"Current Model": "",
 	"Current Password": "",
 	"Custom": "",
-	"Customize Ollama models for a specific purpose": "",
+	"Customize models for a specific purpose": "",
 	"Dark": "",
 	"Dashboard": "",
 	"Database": "",
@@ -139,11 +139,11 @@
 	"delete this link": "",
 	"Delete User": "",
 	"Deleted {{deleteModelTag}}": "",
-	"Deleted {{tagName}}": "",
+	"Deleted {{name}}": "",
 	"Description": "",
 	"Didn't fully follow instructions": "",
 	"Disabled": "",
-	"Discover a modelfile": "",
+	"Discover a model": "",
 	"Discover a prompt": "",
 	"Discover, download, and explore custom prompts": "",
 	"Discover, download, and explore model presets": "",
@@ -177,11 +177,6 @@
 	"Enter Chunk Size": "",
 	"Enter Image Size (e.g. 512x512)": "",
 	"Enter language codes": "",
-	"Enter LiteLLM API Base URL (litellm_params.api_base)": "",
-	"Enter LiteLLM API Key (litellm_params.api_key)": "",
-	"Enter LiteLLM API RPM (litellm_params.rpm)": "",
-	"Enter LiteLLM Model (litellm_params.model)": "",
-	"Enter Max Tokens (litellm_params.max_tokens)": "",
 	"Enter model tag (e.g. {{modelTag}})": "",
 	"Enter Number of Steps (e.g. 50)": "",
 	"Enter Score": "",
@@ -197,7 +192,7 @@
 	"Export All Chats (All Users)": "",
 	"Export Chats": "",
 	"Export Documents Mapping": "",
-	"Export Modelfiles": "",
+	"Export Models": "",
 	"Export Prompts": "",
 	"Failed to create API Key.": "",
 	"Failed to read clipboard contents": "",
@@ -210,7 +205,7 @@
 	"Focus chat input": "",
 	"Followed instructions perfectly": "",
 	"Format your variables using square brackets like this:": "",
-	"From (Base Model)": "",
+	"Frequencey Penalty": "",
 	"Full Screen Mode": "",
 	"General": "",
 	"General Settings": "",
@@ -222,7 +217,6 @@
 	"Hello, {{name}}": "",
 	"Help": "",
 	"Hide": "",
-	"Hide Additional Params": "",
 	"How can I help you today?": "",
 	"Hybrid Search": "",
 	"Image Generation (Experimental)": "",
@@ -231,7 +225,7 @@
 	"Images": "",
 	"Import Chats": "",
 	"Import Documents Mapping": "",
-	"Import Modelfiles": "",
+	"Import Models": "",
 	"Import Prompts": "",
 	"Include `--api` flag when running stable-diffusion-webui": "",
 	"Input commands": "",
@@ -240,6 +234,7 @@
 	"January": "",
 	"join our Discord for help.": "",
 	"JSON": "",
+	"JSON Preview": "",
 	"July": "",
 	"June": "",
 	"JWT Expiration": "",
@@ -254,11 +249,10 @@
 	"LTR": "",
 	"Made by OpenWebUI Community": "",
 	"Make sure to enclose them with": "",
-	"Manage LiteLLM Models": "",
 	"Manage Models": "",
 	"Manage Ollama Models": "",
 	"March": "",
-	"Max Tokens": "",
+	"Max Tokens (num_predict)": "",
 	"Maximum of 3 models can be downloaded simultaneously. Please try again later.": "",
 	"May": "",
 	"Memories accessible by LLMs will be shown here.": "",
@@ -273,22 +267,19 @@
 	"Model '{{modelName}}' has been successfully downloaded.": "",
 	"Model '{{modelTag}}' is already in queue for downloading.": "",
 	"Model {{modelId}} not found": "",
-	"Model {{modelName}} already exists.": "",
+	"Model {{modelName}} is not vision capable": "",
 	"Model filesystem path detected. Model shortname is required for update, cannot continue.": "",
-	"Model Name": "",
+	"Model ID": "",
 	"Model not selected": "",
-	"Model Tag Name": "",
+	"Model Params": "",
 	"Model Whitelisting": "",
 	"Model(s) Whitelisted": "",
-	"Modelfile": "",
-	"Modelfile Advanced Settings": "",
 	"Modelfile Content": "",
-	"Modelfiles": "",
 	"Models": "",
 	"More": "",
 	"Name": "",
 	"Name Tag": "",
-	"Name your modelfile": "",
+	"Name your model": "",
 	"New Chat": "",
 	"New Password": "",
 	"No results found": "",
@@ -296,8 +287,6 @@
 	"No search results found": "",
 	"No source available": "",
 	"Not factually correct": "",
-	"Not sure what to add?": "",
-	"Not sure what to write? Switch to": "",
 	"Note: If you set a minimum score, the search will only return documents with a score greater than or equal to the minimum score.": "",
 	"Notifications": "",
 	"November": "",
@@ -326,7 +315,6 @@
 	"or": "",
 	"Other": "",
 	"Overview": "",
-	"Parameters": "",
 	"Password": "",
 	"PDF document (.pdf)": "",
 	"PDF Extract Images (OCR)": "",
@@ -346,10 +334,8 @@
 	"Prompts": "",
 	"Pull \"{{searchValue}}\" from Ollama.com": "",
 	"Pull a model from Ollama.com": "",
-	"Pull Progress": "",
 	"Query Params": "",
 	"RAG Template": "",
-	"Raw Format": "",
 	"Read Aloud": "",
 	"Record voice": "",
 	"Redirecting you to OpenWebUI Community": "",
@@ -360,7 +346,6 @@
 	"Remove Model": "",
 	"Rename": "",
 	"Repeat Last N": "",
-	"Repeat Penalty": "",
 	"Request Mode": "",
 	"Reranking Model": "",
 	"Reranking model disabled": "",
@@ -387,10 +372,12 @@
 	"See readme.md for instructions": "",
 	"See what's new": "",
 	"Seed": "",
+	"Select a base model": "",
 	"Select a mode": "",
 	"Select a model": "",
 	"Select an Ollama instance": "",
 	"Select model": "",
+	"Selected model(s) do not support image inputs": "",
 	"Send": "",
 	"Send a Message": "",
 	"Send message": "",
@@ -412,7 +399,6 @@
 	"Share to OpenWebUI Community": "",
 	"short-summary": "",
 	"Show": "",
-	"Show Additional Params": "",
 	"Show shortcuts": "",
 	"Showcased creativity": "",
 	"sidebar": "",
@@ -431,7 +417,6 @@
 	"Success": "",
 	"Successfully updated.": "",
 	"Suggested": "",
-	"Sync All": "",
 	"System": "",
 	"System Prompt": "",
 	"Tags": "",
@@ -502,6 +487,7 @@
 	"Write a summary in 50 words that summarizes [topic or keyword].": "",
 	"Yesterday": "",
 	"You": "",
+	"You cannot clone a base model": "",
 	"You have no archived conversations.": "",
 	"You have shared this chat": "",
 	"You're a helpful assistant.": "",

+ 23 - 37
src/lib/i18n/locales/en-US/translation.json

@@ -3,6 +3,8 @@
 	"(Beta)": "",
 	"(e.g. `sh webui.sh --api`)": "",
 	"(latest)": "",
+	"{{ models }}": "",
+	"{{ owner }}: You cannot delete a base model": "",
 	"{{modelName}} is thinking...": "",
 	"{{user}}'s Chats": "",
 	"{{webUIName}} Backend Required": "",
@@ -12,9 +14,8 @@
 	"Account": "",
 	"Accurate information": "",
 	"Add": "",
-	"Add a model": "",
-	"Add a model tag name": "",
-	"Add a short description about what this modelfile does": "",
+	"Add a model id": "",
+	"Add a short description about what this model does": "",
 	"Add a short title for this prompt": "",
 	"Add a tag": "",
 	"Add custom prompt": "",
@@ -30,6 +31,7 @@
 	"Admin Panel": "",
 	"Admin Settings": "",
 	"Advanced Parameters": "",
+	"Advanced Params": "",
 	"all": "",
 	"All Documents": "",
 	"All Users": "",
@@ -44,7 +46,6 @@
 	"API Key": "",
 	"API Key created.": "",
 	"API keys": "",
-	"API RPM": "",
 	"April": "",
 	"Archive": "",
 	"Archived Chats": "",
@@ -61,12 +62,12 @@
 	"available!": "",
 	"Back": "",
 	"Bad Response": "",
+	"Base Model (From)": "",
 	"before": "",
 	"Being lazy": "",
-	"Builder Mode": "",
 	"Bypass SSL verification for Websites": "",
 	"Cancel": "",
-	"Categories": "",
+	"Capabilities": "",
 	"Change Password": "",
 	"Chat": "",
 	"Chat Bubble UI": "",
@@ -84,7 +85,6 @@
 	"Citation": "",
 	"Click here for help.": "",
 	"Click here to": "",
-	"Click here to check other modelfiles.": "",
 	"Click here to select": "",
 	"Click here to select a csv file.": "",
 	"Click here to select documents.": "",
@@ -109,7 +109,7 @@
 	"Copy Link": "",
 	"Copying to clipboard was successful!": "",
 	"Create a concise, 3-5 word phrase as a header for the following query, strictly adhering to the 3-5 word limit and avoiding the use of the word 'title':": "",
-	"Create a modelfile": "",
+	"Create a model": "",
 	"Create Account": "",
 	"Create new key": "",
 	"Create new secret key": "",
@@ -118,7 +118,7 @@
 	"Current Model": "",
 	"Current Password": "",
 	"Custom": "",
-	"Customize Ollama models for a specific purpose": "",
+	"Customize models for a specific purpose": "",
 	"Dark": "",
 	"Dashboard": "",
 	"Database": "",
@@ -139,11 +139,11 @@
 	"delete this link": "",
 	"Delete User": "",
 	"Deleted {{deleteModelTag}}": "",
-	"Deleted {{tagName}}": "",
+	"Deleted {{name}}": "",
 	"Description": "",
 	"Didn't fully follow instructions": "",
 	"Disabled": "",
-	"Discover a modelfile": "",
+	"Discover a model": "",
 	"Discover a prompt": "",
 	"Discover, download, and explore custom prompts": "",
 	"Discover, download, and explore model presets": "",
@@ -177,11 +177,6 @@
 	"Enter Chunk Size": "",
 	"Enter Image Size (e.g. 512x512)": "",
 	"Enter language codes": "",
-	"Enter LiteLLM API Base URL (litellm_params.api_base)": "",
-	"Enter LiteLLM API Key (litellm_params.api_key)": "",
-	"Enter LiteLLM API RPM (litellm_params.rpm)": "",
-	"Enter LiteLLM Model (litellm_params.model)": "",
-	"Enter Max Tokens (litellm_params.max_tokens)": "",
 	"Enter model tag (e.g. {{modelTag}})": "",
 	"Enter Number of Steps (e.g. 50)": "",
 	"Enter Score": "",
@@ -197,7 +192,7 @@
 	"Export All Chats (All Users)": "",
 	"Export Chats": "",
 	"Export Documents Mapping": "",
-	"Export Modelfiles": "",
+	"Export Models": "",
 	"Export Prompts": "",
 	"Failed to create API Key.": "",
 	"Failed to read clipboard contents": "",
@@ -210,7 +205,7 @@
 	"Focus chat input": "",
 	"Followed instructions perfectly": "",
 	"Format your variables using square brackets like this:": "",
-	"From (Base Model)": "",
+	"Frequencey Penalty": "",
 	"Full Screen Mode": "",
 	"General": "",
 	"General Settings": "",
@@ -222,7 +217,6 @@
 	"Hello, {{name}}": "",
 	"Help": "",
 	"Hide": "",
-	"Hide Additional Params": "",
 	"How can I help you today?": "",
 	"Hybrid Search": "",
 	"Image Generation (Experimental)": "",
@@ -231,7 +225,7 @@
 	"Images": "",
 	"Import Chats": "",
 	"Import Documents Mapping": "",
-	"Import Modelfiles": "",
+	"Import Models": "",
 	"Import Prompts": "",
 	"Include `--api` flag when running stable-diffusion-webui": "",
 	"Input commands": "",
@@ -240,6 +234,7 @@
 	"January": "",
 	"join our Discord for help.": "",
 	"JSON": "",
+	"JSON Preview": "",
 	"July": "",
 	"June": "",
 	"JWT Expiration": "",
@@ -254,11 +249,10 @@
 	"LTR": "",
 	"Made by OpenWebUI Community": "",
 	"Make sure to enclose them with": "",
-	"Manage LiteLLM Models": "",
 	"Manage Models": "",
 	"Manage Ollama Models": "",
 	"March": "",
-	"Max Tokens": "",
+	"Max Tokens (num_predict)": "",
 	"Maximum of 3 models can be downloaded simultaneously. Please try again later.": "",
 	"May": "",
 	"Memories accessible by LLMs will be shown here.": "",
@@ -273,22 +267,19 @@
 	"Model '{{modelName}}' has been successfully downloaded.": "",
 	"Model '{{modelTag}}' is already in queue for downloading.": "",
 	"Model {{modelId}} not found": "",
-	"Model {{modelName}} already exists.": "",
+	"Model {{modelName}} is not vision capable": "",
 	"Model filesystem path detected. Model shortname is required for update, cannot continue.": "",
-	"Model Name": "",
+	"Model ID": "",
 	"Model not selected": "",
-	"Model Tag Name": "",
+	"Model Params": "",
 	"Model Whitelisting": "",
 	"Model(s) Whitelisted": "",
-	"Modelfile": "",
-	"Modelfile Advanced Settings": "",
 	"Modelfile Content": "",
-	"Modelfiles": "",
 	"Models": "",
 	"More": "",
 	"Name": "",
 	"Name Tag": "",
-	"Name your modelfile": "",
+	"Name your model": "",
 	"New Chat": "",
 	"New Password": "",
 	"No results found": "",
@@ -296,8 +287,6 @@
 	"No search results found": "",
 	"No source available": "",
 	"Not factually correct": "",
-	"Not sure what to add?": "",
-	"Not sure what to write? Switch to": "",
 	"Note: If you set a minimum score, the search will only return documents with a score greater than or equal to the minimum score.": "",
 	"Notifications": "",
 	"November": "",
@@ -326,7 +315,6 @@
 	"or": "",
 	"Other": "",
 	"Overview": "",
-	"Parameters": "",
 	"Password": "",
 	"PDF document (.pdf)": "",
 	"PDF Extract Images (OCR)": "",
@@ -346,10 +334,8 @@
 	"Prompts": "",
 	"Pull \"{{searchValue}}\" from Ollama.com": "",
 	"Pull a model from Ollama.com": "",
-	"Pull Progress": "",
 	"Query Params": "",
 	"RAG Template": "",
-	"Raw Format": "",
 	"Read Aloud": "",
 	"Record voice": "",
 	"Redirecting you to OpenWebUI Community": "",
@@ -360,7 +346,6 @@
 	"Remove Model": "",
 	"Rename": "",
 	"Repeat Last N": "",
-	"Repeat Penalty": "",
 	"Request Mode": "",
 	"Reranking Model": "",
 	"Reranking model disabled": "",
@@ -387,10 +372,12 @@
 	"See readme.md for instructions": "",
 	"See what's new": "",
 	"Seed": "",
+	"Select a base model": "",
 	"Select a mode": "",
 	"Select a model": "",
 	"Select an Ollama instance": "",
 	"Select model": "",
+	"Selected model(s) do not support image inputs": "",
 	"Send": "",
 	"Send a Message": "",
 	"Send message": "",
@@ -412,7 +399,6 @@
 	"Share to OpenWebUI Community": "",
 	"short-summary": "",
 	"Show": "",
-	"Show Additional Params": "",
 	"Show shortcuts": "",
 	"Showcased creativity": "",
 	"sidebar": "",
@@ -431,7 +417,6 @@
 	"Success": "",
 	"Successfully updated.": "",
 	"Suggested": "",
-	"Sync All": "",
 	"System": "",
 	"System Prompt": "",
 	"Tags": "",
@@ -502,6 +487,7 @@
 	"Write a summary in 50 words that summarizes [topic or keyword].": "",
 	"Yesterday": "",
 	"You": "",
+	"You cannot clone a base model": "",
 	"You have no archived conversations.": "",
 	"You have shared this chat": "",
 	"You're a helpful assistant.": "",

+ 23 - 37
src/lib/i18n/locales/es-ES/translation.json

@@ -3,6 +3,8 @@
 	"(Beta)": "(Beta)",
 	"(e.g. `sh webui.sh --api`)": "(p.ej. `sh webui.sh --api`)",
 	"(latest)": "(latest)",
+	"{{ models }}": "",
+	"{{ owner }}: You cannot delete a base model": "",
 	"{{modelName}} is thinking...": "{{modelName}} está pensando...",
 	"{{user}}'s Chats": "{{user}}'s Chats",
 	"{{webUIName}} Backend Required": "{{webUIName}} Servidor Requerido",
@@ -12,9 +14,8 @@
 	"Account": "Cuenta",
 	"Accurate information": "Información precisa",
 	"Add": "Agregar",
-	"Add a model": "Agregar un modelo",
-	"Add a model tag name": "Agregar un nombre de etiqueta de modelo",
-	"Add a short description about what this modelfile does": "Agregue una descripción corta de lo que este modelfile hace",
+	"Add a model id": "",
+	"Add a short description about what this model does": "",
 	"Add a short title for this prompt": "Agregue un título corto para este Prompt",
 	"Add a tag": "Agregar una etiqueta",
 	"Add custom prompt": "Agregar un prompt personalizado",
@@ -30,6 +31,7 @@
 	"Admin Panel": "Panel de Administración",
 	"Admin Settings": "Configuración de Administrador",
 	"Advanced Parameters": "Parámetros Avanzados",
+	"Advanced Params": "",
 	"all": "todo",
 	"All Documents": "Todos los Documentos",
 	"All Users": "Todos los Usuarios",
@@ -44,7 +46,6 @@
 	"API Key": "Clave de la API ",
 	"API Key created.": "Clave de la API creada.",
 	"API keys": "Claves de la API",
-	"API RPM": "RPM de la API",
 	"April": "Abril",
 	"Archive": "Archivar",
 	"Archived Chats": "Chats archivados",
@@ -61,12 +62,12 @@
 	"available!": "¡disponible!",
 	"Back": "Volver",
 	"Bad Response": "Respuesta incorrecta",
+	"Base Model (From)": "",
 	"before": "antes",
 	"Being lazy": "Ser perezoso",
-	"Builder Mode": "Modo de Constructor",
 	"Bypass SSL verification for Websites": "Desactivar la verificación SSL para sitios web",
 	"Cancel": "Cancelar",
-	"Categories": "Categorías",
+	"Capabilities": "",
 	"Change Password": "Cambia la Contraseña",
 	"Chat": "Chat",
 	"Chat Bubble UI": "Burbuja de chat UI",
@@ -84,7 +85,6 @@
 	"Citation": "Cita",
 	"Click here for help.": "Presiona aquí para obtener ayuda.",
 	"Click here to": "Presiona aquí para",
-	"Click here to check other modelfiles.": "Presiona aquí para consultar otros modelfiles.",
 	"Click here to select": "Presiona aquí para seleccionar",
 	"Click here to select a csv file.": "Presiona aquí para seleccionar un archivo csv.",
 	"Click here to select documents.": "Presiona aquí para seleccionar documentos",
@@ -109,7 +109,7 @@
 	"Copy Link": "Copiar enlace",
 	"Copying to clipboard was successful!": "¡La copia al portapapeles se ha realizado correctamente!",
 	"Create a concise, 3-5 word phrase as a header for the following query, strictly adhering to the 3-5 word limit and avoiding the use of the word 'title':": "Cree una frase concisa de 3 a 5 palabras como encabezado para la siguiente consulta, respetando estrictamente el límite de 3 a 5 palabras y evitando el uso de la palabra 'título':",
-	"Create a modelfile": "Crea un modelfile",
+	"Create a model": "",
 	"Create Account": "Crear una cuenta",
 	"Create new key": "Crear una nueva clave",
 	"Create new secret key": "Crear una nueva clave secreta",
@@ -118,7 +118,7 @@
 	"Current Model": "Modelo Actual",
 	"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",
+	"Customize models for a specific purpose": "",
 	"Dark": "Oscuro",
 	"Dashboard": "Tablero",
 	"Database": "Base de datos",
@@ -139,11 +139,11 @@
 	"delete this link": "Borrar este enlace",
 	"Delete User": "Borrar Usuario",
 	"Deleted {{deleteModelTag}}": "Se borró {{deleteModelTag}}",
-	"Deleted {{tagName}}": "Se borró {{tagName}}",
+	"Deleted {{name}}": "",
 	"Description": "Descripción",
 	"Didn't fully follow instructions": "No siguió las instrucciones",
 	"Disabled": "Desactivado",
-	"Discover a modelfile": "Descubre un modelfile",
+	"Discover a model": "",
 	"Discover a prompt": "Descubre un Prompt",
 	"Discover, download, and explore custom prompts": "Descubre, descarga, y explora Prompts personalizados",
 	"Discover, download, and explore model presets": "Descubre, descarga y explora ajustes preestablecidos de modelos",
@@ -177,11 +177,6 @@
 	"Enter Chunk Size": "Ingrese el tamaño del fragmento",
 	"Enter Image Size (e.g. 512x512)": "Ingrese el tamaño de la imagen (p.ej. 512x512)",
 	"Enter language codes": "Ingrese códigos de idioma",
-	"Enter LiteLLM API Base URL (litellm_params.api_base)": "Ingrese la URL base de la API LiteLLM (litellm_params.api_base)",
-	"Enter LiteLLM API Key (litellm_params.api_key)": "Ingrese la clave API LiteLLM (litellm_params.api_key)",
-	"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 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",
@@ -197,7 +192,7 @@
 	"Export All Chats (All Users)": "Exportar todos los chats (Todos los usuarios)",
 	"Export Chats": "Exportar Chats",
 	"Export Documents Mapping": "Exportar el mapeo de documentos",
-	"Export Modelfiles": "Exportar Modelfiles",
+	"Export Models": "",
 	"Export Prompts": "Exportar Prompts",
 	"Failed to create API Key.": "No se pudo crear la clave API.",
 	"Failed to read clipboard contents": "No se pudo leer el contenido del portapapeles",
@@ -210,7 +205,7 @@
 	"Focus chat input": "Enfoca la entrada del chat",
 	"Followed instructions perfectly": "Siguió las instrucciones perfectamente",
 	"Format your variables using square brackets like this:": "Formatea tus variables usando corchetes de la siguiente manera:",
-	"From (Base Model)": "Desde (Modelo Base)",
+	"Frequencey Penalty": "",
 	"Full Screen Mode": "Modo de Pantalla Completa",
 	"General": "General",
 	"General Settings": "Opciones Generales",
@@ -222,7 +217,6 @@
 	"Hello, {{name}}": "Hola, {{name}}",
 	"Help": "Ayuda",
 	"Hide": "Esconder",
-	"Hide Additional Params": "Esconde los Parámetros Adicionales",
 	"How can I help you today?": "¿Cómo puedo ayudarte hoy?",
 	"Hybrid Search": "Búsqueda Híbrida",
 	"Image Generation (Experimental)": "Generación de imágenes (experimental)",
@@ -231,7 +225,7 @@
 	"Images": "Imágenes",
 	"Import Chats": "Importar chats",
 	"Import Documents Mapping": "Importar Mapeo de Documentos",
-	"Import Modelfiles": "Importar Modelfiles",
+	"Import Models": "",
 	"Import Prompts": "Importar Prompts",
 	"Include `--api` flag when running stable-diffusion-webui": "Incluir el indicador `--api` al ejecutar stable-diffusion-webui",
 	"Input commands": "Ingresar comandos",
@@ -240,6 +234,7 @@
 	"January": "Enero",
 	"join our Discord for help.": "Únase a nuestro Discord para obtener ayuda.",
 	"JSON": "JSON",
+	"JSON Preview": "",
 	"July": "Julio",
 	"June": "Junio",
 	"JWT Expiration": "Expiración del JWT",
@@ -254,11 +249,10 @@
 	"LTR": "LTR",
 	"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 Models": "Administrar Modelos",
 	"Manage Ollama Models": "Administrar Modelos Ollama",
 	"March": "Marzo",
-	"Max Tokens": "Máximo de Tokens",
+	"Max Tokens (num_predict)": "",
 	"Maximum of 3 models can be downloaded simultaneously. Please try again later.": "Se pueden descargar un máximo de 3 modelos simultáneamente. Por favor, inténtelo de nuevo más tarde.",
 	"May": "Mayo",
 	"Memories accessible by LLMs will be shown here.": "Las memorias accesibles por los LLMs se mostrarán aquí.",
@@ -273,22 +267,19 @@
 	"Model '{{modelName}}' has been successfully downloaded.": "El modelo '{{modelName}}' se ha descargado correctamente.",
 	"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 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 Name": "Nombre del modelo",
+	"Model ID": "",
 	"Model not selected": "Modelo no seleccionado",
-	"Model Tag Name": "Nombre de la etiqueta del modelo",
+	"Model Params": "",
 	"Model Whitelisting": "Listado de Modelos habilitados",
 	"Model(s) Whitelisted": "Modelo(s) habilitados",
-	"Modelfile": "Modelfile",
-	"Modelfile Advanced Settings": "Opciones avanzadas del Modelfile",
 	"Modelfile Content": "Contenido del Modelfile",
-	"Modelfiles": "Modelfiles",
 	"Models": "Modelos",
 	"More": "Más",
 	"Name": "Nombre",
 	"Name Tag": "Nombre de etiqueta",
-	"Name your modelfile": "Nombra tu modelfile",
+	"Name your model": "",
 	"New Chat": "Nuevo Chat",
 	"New Password": "Nueva Contraseña",
 	"No results found": "No se han encontrado resultados",
@@ -296,8 +287,6 @@
 	"No search results found": "",
 	"No source available": "No hay fuente disponible",
 	"Not factually correct": "No es correcto en todos los aspectos",
-	"Not sure what to add?": "¿No sabes qué añadir?",
-	"Not sure what to write? Switch to": "¿No sabes qué escribir? Cambia a",
 	"Note: If you set a minimum score, the search will only return documents with a score greater than or equal to the minimum score.": "Nota: Si estableces una puntuación mínima, la búsqueda sólo devolverá documentos con una puntuación mayor o igual a la puntuación mínima.",
 	"Notifications": "Notificaciones",
 	"November": "Noviembre",
@@ -326,7 +315,6 @@
 	"or": "o",
 	"Other": "Otro",
 	"Overview": "Resumen",
-	"Parameters": "Parámetros",
 	"Password": "Contraseña",
 	"PDF document (.pdf)": "PDF document (.pdf)",
 	"PDF Extract Images (OCR)": "Extraer imágenes de PDF (OCR)",
@@ -346,10 +334,8 @@
 	"Prompts": "Prompts",
 	"Pull \"{{searchValue}}\" from Ollama.com": "Extraer \"{{searchValue}}\" de Ollama.com",
 	"Pull a model from Ollama.com": "Obtener un modelo de Ollama.com",
-	"Pull Progress": "Progreso de extracción",
 	"Query Params": "Parámetros de consulta",
 	"RAG Template": "Plantilla de RAG",
-	"Raw Format": "Formato sin procesar",
 	"Read Aloud": "Leer al oído",
 	"Record voice": "Grabar voz",
 	"Redirecting you to OpenWebUI Community": "Redireccionándote a la comunidad OpenWebUI",
@@ -360,7 +346,6 @@
 	"Remove Model": "Eliminar modelo",
 	"Rename": "Renombrar",
 	"Repeat Last N": "Repetir las últimas N",
-	"Repeat Penalty": "Penalidad de repetición",
 	"Request Mode": "Modo de petición",
 	"Reranking Model": "Modelo de reranking",
 	"Reranking model disabled": "Modelo de reranking deshabilitado",
@@ -387,10 +372,12 @@
 	"See readme.md for instructions": "Vea el readme.md para instrucciones",
 	"See what's new": "Ver las novedades",
 	"Seed": "Seed",
+	"Select a base model": "",
 	"Select a mode": "Selecciona un modo",
 	"Select a model": "Selecciona un modelo",
 	"Select an Ollama instance": "Seleccione una instancia de Ollama",
 	"Select model": "Selecciona un modelo",
+	"Selected model(s) do not support image inputs": "",
 	"Send": "Enviar",
 	"Send a Message": "Enviar un Mensaje",
 	"Send message": "Enviar Mensaje",
@@ -412,7 +399,6 @@
 	"Share to OpenWebUI Community": "Compartir con la comunidad OpenWebUI",
 	"short-summary": "resumen-corto",
 	"Show": "Mostrar",
-	"Show Additional Params": "Mostrar parámetros adicionales",
 	"Show shortcuts": "Mostrar atajos",
 	"Showcased creativity": "Mostrar creatividad",
 	"sidebar": "barra lateral",
@@ -431,7 +417,6 @@
 	"Success": "Éxito",
 	"Successfully updated.": "Actualizado exitosamente.",
 	"Suggested": "Sugerido",
-	"Sync All": "Sincronizar todo",
 	"System": "Sistema",
 	"System Prompt": "Prompt del sistema",
 	"Tags": "Etiquetas",
@@ -502,6 +487,7 @@
 	"Write a summary in 50 words that summarizes [topic or keyword].": "Escribe un resumen en 50 palabras que resuma [tema o palabra clave].",
 	"Yesterday": "Ayer",
 	"You": "Usted",
+	"You cannot clone a base model": "",
 	"You have no archived conversations.": "No tiene conversaciones archivadas.",
 	"You have shared this chat": "Usted ha compartido esta conversación",
 	"You're a helpful assistant.": "Usted es un asistente útil.",

+ 23 - 37
src/lib/i18n/locales/fa-IR/translation.json

@@ -3,6 +3,8 @@
 	"(Beta)": "(بتا)",
 	"(e.g. `sh webui.sh --api`)": "(e.g. `sh webui.sh --api`)",
 	"(latest)": "(آخرین)",
+	"{{ models }}": "",
+	"{{ owner }}: You cannot delete a base model": "",
 	"{{modelName}} is thinking...": "{{modelName}} در حال فکر کردن است...",
 	"{{user}}'s Chats": "{{user}} چت ها",
 	"{{webUIName}} Backend Required": "بکند {{webUIName}} نیاز است.",
@@ -12,9 +14,8 @@
 	"Account": "حساب کاربری",
 	"Accurate information": "اطلاعات دقیق",
 	"Add": "اضافه کردن",
-	"Add a model": "اضافه کردن یک مدل",
-	"Add a model tag name": "اضافه کردن یک نام تگ برای مدل",
-	"Add a short description about what this modelfile does": "توضیح کوتاهی در مورد کاری که این فایل\u200cمدل انجام می دهد اضافه کنید",
+	"Add a model id": "",
+	"Add a short description about what this model does": "",
 	"Add a short title for this prompt": "یک عنوان کوتاه برای این درخواست اضافه کنید",
 	"Add a tag": "اضافه کردن یک تگ",
 	"Add custom prompt": "اضافه کردن یک درخواست سفارشی",
@@ -30,6 +31,7 @@
 	"Admin Panel": "پنل مدیریت",
 	"Admin Settings": "تنظیمات مدیریت",
 	"Advanced Parameters": "پارامترهای پیشرفته",
+	"Advanced Params": "",
 	"all": "همه",
 	"All Documents": "تمام سند ها",
 	"All Users": "همه کاربران",
@@ -44,7 +46,6 @@
 	"API Key": "API Key",
 	"API Key created.": "API Key created.",
 	"API keys": "API keys",
-	"API RPM": "API RPM",
 	"April": "ژوئن",
 	"Archive": "آرشیو",
 	"Archived Chats": "آرشیو تاریخچه چت",
@@ -61,12 +62,12 @@
 	"available!": "در دسترس!",
 	"Back": "بازگشت",
 	"Bad Response": "پاسخ خوب نیست",
+	"Base Model (From)": "",
 	"before": "قبل",
 	"Being lazy": "حالت سازنده",
-	"Builder Mode": "حالت سازنده",
 	"Bypass SSL verification for Websites": "عبور از تأیید SSL برای وب سایت ها",
 	"Cancel": "لغو",
-	"Categories": "دسته\u200cبندی\u200cها",
+	"Capabilities": "",
 	"Change Password": "تغییر رمز عبور",
 	"Chat": "گپ",
 	"Chat Bubble UI": "UI\u200cی\u200c گفتگو\u200c",
@@ -84,7 +85,6 @@
 	"Citation": "استناد",
 	"Click here for help.": "برای کمک اینجا را کلیک کنید.",
 	"Click here to": "برای کمک اینجا را کلیک کنید.",
-	"Click here to check other modelfiles.": "برای بررسی سایر فایل\u200cهای مدل اینجا را کلیک کنید.",
 	"Click here to select": "برای انتخاب اینجا کلیک کنید",
 	"Click here to select a csv file.": "برای انتخاب یک فایل csv اینجا را کلیک کنید.",
 	"Click here to select documents.": "برای انتخاب اسناد اینجا را کلیک کنید.",
@@ -109,7 +109,7 @@
 	"Copy Link": "کپی لینک",
 	"Copying to clipboard was successful!": "کپی کردن در کلیپ بورد با موفقیت انجام شد!",
 	"Create a concise, 3-5 word phrase as a header for the following query, strictly adhering to the 3-5 word limit and avoiding the use of the word 'title':": "یک عبارت مختصر و ۳ تا ۵ کلمه ای را به عنوان سرفصل برای پرس و جو زیر ایجاد کنید، به شدت محدودیت ۳-۵ کلمه را رعایت کنید و از استفاده از کلمه 'عنوان' خودداری کنید:",
-	"Create a modelfile": "ایجاد یک فایل مدل",
+	"Create a model": "",
 	"Create Account": "ساخت حساب کاربری",
 	"Create new key": "ساخت کلید جدید",
 	"Create new secret key": "ساخت کلید gehez جدید",
@@ -118,7 +118,7 @@
 	"Current Model": "مدل فعلی",
 	"Current Password": "رمز عبور فعلی",
 	"Custom": "دلخواه",
-	"Customize Ollama models for a specific purpose": "مدل های اولاما را برای یک هدف خاص سفارشی کنید",
+	"Customize models for a specific purpose": "",
 	"Dark": "تیره",
 	"Dashboard": "داشبورد",
 	"Database": "پایگاه داده",
@@ -139,11 +139,11 @@
 	"delete this link": "حذف این لینک",
 	"Delete User": "حذف کاربر",
 	"Deleted {{deleteModelTag}}": "{{deleteModelTag}} پاک شد",
-	"Deleted {{tagName}}": "{{tagName}} پاک شد",
+	"Deleted {{name}}": "",
 	"Description": "توضیحات",
 	"Didn't fully follow instructions": "نمی تواند دستورالعمل را کامل پیگیری کند",
 	"Disabled": "غیرفعال",
-	"Discover a modelfile": "فایل مدل را کشف کنید",
+	"Discover a model": "",
 	"Discover a prompt": "یک اعلان را کشف کنید",
 	"Discover, download, and explore custom prompts": "پرامپت\u200cهای سفارشی را کشف، دانلود و کاوش کنید",
 	"Discover, download, and explore model presets": "پیش تنظیمات مدل را کشف، دانلود و کاوش کنید",
@@ -177,11 +177,6 @@
 	"Enter Chunk Size": "مقدار Chunk Size را وارد کنید",
 	"Enter Image Size (e.g. 512x512)": "اندازه تصویر را وارد کنید (مثال: 512x512)",
 	"Enter language codes": "کد زبان را وارد کنید",
-	"Enter LiteLLM API Base URL (litellm_params.api_base)": "URL پایه مربوط به LiteLLM API را وارد کنید (litellm_params.api_base)",
-	"Enter LiteLLM API Key (litellm_params.api_key)": "کلید API مربوط به LiteLLM را وارد کنید (litellm_params.api_key)",
-	"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 tag (e.g. {{modelTag}})": "تگ مدل را وارد کنید (مثلا {{modelTag}})",
 	"Enter Number of Steps (e.g. 50)": "تعداد گام ها را وارد کنید (مثال: 50)",
 	"Enter Score": "امتیاز را وارد کنید",
@@ -197,7 +192,7 @@
 	"Export All Chats (All Users)": "اکسپورت از همه گپ\u200cها(همه کاربران)",
 	"Export Chats": "اکسپورت از گپ\u200cها",
 	"Export Documents Mapping": "اکسپورت از نگاشت اسناد",
-	"Export Modelfiles": "اکسپورت از فایل\u200cهای مدل",
+	"Export Models": "",
 	"Export Prompts": "اکسپورت از پرامپت\u200cها",
 	"Failed to create API Key.": "ایجاد کلید API با خطا مواجه شد.",
 	"Failed to read clipboard contents": "خواندن محتوای کلیپ بورد ناموفق بود",
@@ -210,7 +205,7 @@
 	"Focus chat input": "فوکوس کردن ورودی گپ",
 	"Followed instructions perfectly": "دستورالعمل ها را کاملا دنبال کرد",
 	"Format your variables using square brackets like this:": "متغیرهای خود را با استفاده از براکت مربع به شکل زیر قالب بندی کنید:",
-	"From (Base Model)": "از (مدل پایه)",
+	"Frequencey Penalty": "",
 	"Full Screen Mode": "حالت تمام صفحه",
 	"General": "عمومی",
 	"General Settings": "تنظیمات عمومی",
@@ -222,7 +217,6 @@
 	"Hello, {{name}}": "سلام، {{name}}",
 	"Help": "کمک",
 	"Hide": "پنهان",
-	"Hide Additional Params": "پنهان کردن پارامترهای اضافه",
 	"How can I help you today?": "امروز چطور می توانم کمک تان کنم؟",
 	"Hybrid Search": "جستجوی همزمان",
 	"Image Generation (Experimental)": "تولید تصویر (آزمایشی)",
@@ -231,7 +225,7 @@
 	"Images": "تصاویر",
 	"Import Chats": "ایمپورت گپ\u200cها",
 	"Import Documents Mapping": "ایمپورت نگاشت اسناد",
-	"Import Modelfiles": "ایمپورت فایل\u200cهای مدل",
+	"Import Models": "",
 	"Import Prompts": "ایمپورت پرامپت\u200cها",
 	"Include `--api` flag when running stable-diffusion-webui": "فلگ `--api` را هنکام اجرای stable-diffusion-webui استفاده کنید.",
 	"Input commands": "ورودی دستورات",
@@ -240,6 +234,7 @@
 	"January": "ژانویه",
 	"join our Discord for help.": "برای کمک به دیسکورد ما بپیوندید.",
 	"JSON": "JSON",
+	"JSON Preview": "",
 	"July": "ژوئن",
 	"June": "جولای",
 	"JWT Expiration": "JWT انقضای",
@@ -254,11 +249,10 @@
 	"LTR": "LTR",
 	"Made by OpenWebUI Community": "ساخته شده توسط OpenWebUI Community",
 	"Make sure to enclose them with": "مطمئن شوید که آنها را با این محصور کنید:",
-	"Manage LiteLLM Models": "Manage LiteLLM Models",
 	"Manage Models": "مدیریت مدل\u200cها",
 	"Manage Ollama Models": "مدیریت مدل\u200cهای اولاما",
 	"March": "مارچ",
-	"Max Tokens": "حداکثر توکن",
+	"Max Tokens (num_predict)": "",
 	"Maximum of 3 models can be downloaded simultaneously. Please try again later.": "حداکثر 3 مدل را می توان به طور همزمان دانلود کرد. لطفاً بعداً دوباره امتحان کنید.",
 	"May": "ماهی",
 	"Memories accessible by LLMs will be shown here.": "حافظه های دسترسی به LLMs در اینجا نمایش داده می شوند.",
@@ -273,22 +267,19 @@
 	"Model '{{modelName}}' has been successfully downloaded.": "مدل '{{modelName}}' با موفقیت دانلود شد.",
 	"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 filesystem path detected. Model shortname is required for update, cannot continue.": "مسیر فایل سیستم مدل یافت شد. برای بروزرسانی نیاز است نام کوتاه مدل وجود داشته باشد.",
-	"Model Name": "نام مدل",
+	"Model ID": "",
 	"Model not selected": "مدل انتخاب نشده",
-	"Model Tag Name": "نام تگ مدل",
+	"Model Params": "",
 	"Model Whitelisting": "لیست سفید مدل",
 	"Model(s) Whitelisted": "مدل در لیست سفید ثبت شد",
-	"Modelfile": "فایل مدل",
-	"Modelfile Advanced Settings": "تنظیمات پیشرفته فایل\u200cمدل",
 	"Modelfile Content": "محتویات فایل مدل",
-	"Modelfiles": "فایل\u200cهای مدل",
 	"Models": "مدل\u200cها",
 	"More": "بیشتر",
 	"Name": "نام",
 	"Name Tag": "نام تگ",
-	"Name your modelfile": "فایل مدل را نام\u200cگذاری کنید",
+	"Name your model": "",
 	"New Chat": "گپ جدید",
 	"New Password": "رمز عبور جدید",
 	"No results found": "نتیجه\u200cای یافت نشد",
@@ -296,8 +287,6 @@
 	"No search results found": "",
 	"No source available": "منبعی در دسترس نیست",
 	"Not factually correct": "اشتباهی فکری نیست",
-	"Not sure what to add?": "مطمئن نیستید چه چیزی را اضافه کنید؟",
-	"Not sure what to write? Switch to": "مطمئن نیستید چه بنویسید؟ تغییر به",
 	"Note: If you set a minimum score, the search will only return documents with a score greater than or equal to the minimum score.": "",
 	"Notifications": "اعلان",
 	"November": "نوامبر",
@@ -326,7 +315,6 @@
 	"or": "روشن",
 	"Other": "دیگر",
 	"Overview": "نمای کلی",
-	"Parameters": "پارامترها",
 	"Password": "رمز عبور",
 	"PDF document (.pdf)": "PDF سند (.pdf)",
 	"PDF Extract Images (OCR)": "استخراج تصاویر از PDF (OCR)",
@@ -346,10 +334,8 @@
 	"Prompts": "پرامپت\u200cها",
 	"Pull \"{{searchValue}}\" from Ollama.com": "بازگرداندن \"{{searchValue}}\" از Ollama.com",
 	"Pull a model from Ollama.com": "دریافت یک مدل از Ollama.com",
-	"Pull Progress": "پیشرفت دریافت",
 	"Query Params": "پارامترهای پرس و جو",
 	"RAG Template": "RAG الگوی",
-	"Raw Format": "فرمت خام",
 	"Read Aloud": "خواندن به صورت صوتی",
 	"Record voice": "ضبط صدا",
 	"Redirecting you to OpenWebUI Community": "در حال هدایت به OpenWebUI Community",
@@ -360,7 +346,6 @@
 	"Remove Model": "حذف مدل",
 	"Rename": "تغییر نام",
 	"Repeat Last N": "Repeat Last N",
-	"Repeat Penalty": "Repeat Penalty",
 	"Request Mode": "حالت درخواست",
 	"Reranking Model": "مدل ری\u200cشناسی مجدد غیرفعال است",
 	"Reranking model disabled": "مدل ری\u200cشناسی مجدد غیرفعال است",
@@ -387,10 +372,12 @@
 	"See readme.md for instructions": "برای مشاهده دستورالعمل\u200cها به readme.md مراجعه کنید",
 	"See what's new": "ببینید موارد جدید چه بوده",
 	"Seed": "Seed",
+	"Select a base model": "",
 	"Select a mode": "یک حالت انتخاب کنید",
 	"Select a model": "انتخاب یک مدل",
 	"Select an Ollama instance": "انتخاب یک نمونه از اولاما",
 	"Select model": "انتخاب یک مدل",
+	"Selected model(s) do not support image inputs": "",
 	"Send": "ارسال",
 	"Send a Message": "ارسال یک پیام",
 	"Send message": "ارسال پیام",
@@ -412,7 +399,6 @@
 	"Share to OpenWebUI Community": "اشتراک گذاری با OpenWebUI Community",
 	"short-summary": "خلاصه کوتاه",
 	"Show": "نمایش",
-	"Show Additional Params": "نمایش پارامترهای اضافه",
 	"Show shortcuts": "نمایش میانبرها",
 	"Showcased creativity": "ایده\u200cآفرینی",
 	"sidebar": "نوار کناری",
@@ -431,7 +417,6 @@
 	"Success": "موفقیت",
 	"Successfully updated.": "با موفقیت به روز شد",
 	"Suggested": "پیشنهادی",
-	"Sync All": "همگام سازی همه",
 	"System": "سیستم",
 	"System Prompt": "پرامپت سیستم",
 	"Tags": "تگ\u200cها",
@@ -502,6 +487,7 @@
 	"Write a summary in 50 words that summarizes [topic or keyword].": "خلاصه ای در 50 کلمه بنویسید که [موضوع یا کلمه کلیدی] را خلاصه کند.",
 	"Yesterday": "دیروز",
 	"You": "شما",
+	"You cannot clone a base model": "",
 	"You have no archived conversations.": "شما هیچ گفتگوی ذخیره شده ندارید.",
 	"You have shared this chat": "شما این گفتگو را به اشتراک گذاشته اید",
 	"You're a helpful assistant.": "تو یک دستیار سودمند هستی.",

+ 23 - 37
src/lib/i18n/locales/fi-FI/translation.json

@@ -3,6 +3,8 @@
 	"(Beta)": "(Beta)",
 	"(e.g. `sh webui.sh --api`)": "(esim. `sh webui.sh --api`)",
 	"(latest)": "(uusin)",
+	"{{ models }}": "",
+	"{{ owner }}: You cannot delete a base model": "",
 	"{{modelName}} is thinking...": "{{modelName}} miettii...",
 	"{{user}}'s Chats": "{{user}}:n keskustelut",
 	"{{webUIName}} Backend Required": "{{webUIName}} backend vaaditaan",
@@ -12,9 +14,8 @@
 	"Account": "Tili",
 	"Accurate information": "Tarkkaa tietoa",
 	"Add": "Lisää",
-	"Add a model": "Lisää malli",
-	"Add a model tag name": "Lisää mallitagi",
-	"Add a short description about what this modelfile does": "Lisää lyhyt kuvaus siitä, mitä tämä mallitiedosto tekee",
+	"Add a model id": "",
+	"Add a short description about what this model does": "",
 	"Add a short title for this prompt": "Lisää lyhyt otsikko tälle kehotteelle",
 	"Add a tag": "Lisää tagi",
 	"Add custom prompt": "Lisää mukautettu kehote",
@@ -30,6 +31,7 @@
 	"Admin Panel": "Hallintapaneeli",
 	"Admin Settings": "Hallinta-asetukset",
 	"Advanced Parameters": "Edistyneet parametrit",
+	"Advanced Params": "",
 	"all": "kaikki",
 	"All Documents": "Kaikki asiakirjat",
 	"All Users": "Kaikki käyttäjät",
@@ -44,7 +46,6 @@
 	"API Key": "API-avain",
 	"API Key created.": "API-avain luotu.",
 	"API keys": "API-avaimet",
-	"API RPM": "API RPM",
 	"April": "huhtikuu",
 	"Archive": "Arkisto",
 	"Archived Chats": "Arkistoidut keskustelut",
@@ -61,12 +62,12 @@
 	"available!": "saatavilla!",
 	"Back": "Takaisin",
 	"Bad Response": "Epäkelpo vastaus",
+	"Base Model (From)": "",
 	"before": "ennen",
 	"Being lazy": "Oli laiska",
-	"Builder Mode": "Rakentajan tila",
 	"Bypass SSL verification for Websites": "Ohita SSL-varmennus verkkosivustoille",
 	"Cancel": "Peruuta",
-	"Categories": "Kategoriat",
+	"Capabilities": "",
 	"Change Password": "Vaihda salasana",
 	"Chat": "Keskustelu",
 	"Chat Bubble UI": "Keskustelu-pallojen käyttöliittymä",
@@ -84,7 +85,6 @@
 	"Citation": "Sitaatti",
 	"Click here for help.": "Klikkaa tästä saadaksesi apua.",
 	"Click here to": "Klikkaa tästä",
-	"Click here to check other modelfiles.": "Klikkaa tästä nähdäksesi muita mallitiedostoja.",
 	"Click here to select": "Klikkaa tästä valitaksesi",
 	"Click here to select a csv file.": "Klikkaa tästä valitaksesi CSV-tiedosto.",
 	"Click here to select documents.": "Klikkaa tästä valitaksesi asiakirjoja.",
@@ -109,7 +109,7 @@
 	"Copy Link": "Kopioi linkki",
 	"Copying to clipboard was successful!": "Kopioiminen leikepöydälle onnistui!",
 	"Create a concise, 3-5 word phrase as a header for the following query, strictly adhering to the 3-5 word limit and avoiding the use of the word 'title':": "Luo tiivis, 3-5 sanan lause otsikoksi seuraavalle kyselylle, noudattaen tiukasti 3-5 sanan rajoitusta ja välttäen sanan 'otsikko' käyttöä:",
-	"Create a modelfile": "Luo mallitiedosto",
+	"Create a model": "",
 	"Create Account": "Luo tili",
 	"Create new key": "Luo uusi avain",
 	"Create new secret key": "Luo uusi salainen avain",
@@ -118,7 +118,7 @@
 	"Current Model": "Nykyinen malli",
 	"Current Password": "Nykyinen salasana",
 	"Custom": "Mukautettu",
-	"Customize Ollama models for a specific purpose": "Mukauta Ollama-malleja tiettyyn tarkoitukseen",
+	"Customize models for a specific purpose": "",
 	"Dark": "Tumma",
 	"Dashboard": "Kojelauta",
 	"Database": "Tietokanta",
@@ -139,11 +139,11 @@
 	"delete this link": "poista tämä linkki",
 	"Delete User": "Poista käyttäjä",
 	"Deleted {{deleteModelTag}}": "Poistettu {{deleteModelTag}}",
-	"Deleted {{tagName}}": "Poistettu {{tagName}}",
+	"Deleted {{name}}": "",
 	"Description": "Kuvaus",
 	"Didn't fully follow instructions": "Ei noudattanut ohjeita täysin",
 	"Disabled": "Poistettu käytöstä",
-	"Discover a modelfile": "Löydä mallitiedosto",
+	"Discover a model": "",
 	"Discover a prompt": "Löydä kehote",
 	"Discover, download, and explore custom prompts": "Löydä ja lataa mukautettuja kehotteita",
 	"Discover, download, and explore model presets": "Löydä ja lataa mallien esiasetuksia",
@@ -177,11 +177,6 @@
 	"Enter Chunk Size": "Syötä osien koko",
 	"Enter Image Size (e.g. 512x512)": "Syötä kuvan koko (esim. 512x512)",
 	"Enter language codes": "Syötä kielikoodit",
-	"Enter LiteLLM API Base URL (litellm_params.api_base)": "Syötä LiteLLM-APIn perus-URL (litellm_params.api_base)",
-	"Enter LiteLLM API Key (litellm_params.api_key)": "Syötä LiteLLM-APIn avain (litellm_params.api_key)",
-	"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 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",
@@ -197,7 +192,7 @@
 	"Export All Chats (All Users)": "Vie kaikki keskustelut (kaikki käyttäjät)",
 	"Export Chats": "Vie keskustelut",
 	"Export Documents Mapping": "Vie asiakirjakartoitus",
-	"Export Modelfiles": "Vie mallitiedostot",
+	"Export Models": "",
 	"Export Prompts": "Vie kehotteet",
 	"Failed to create API Key.": "API-avaimen luonti epäonnistui.",
 	"Failed to read clipboard contents": "Leikepöydän sisällön lukeminen epäonnistui",
@@ -210,7 +205,7 @@
 	"Focus chat input": "Fokusoi syöttökenttään",
 	"Followed instructions perfectly": "Noudatti ohjeita täydellisesti",
 	"Format your variables using square brackets like this:": "Muotoile muuttujat hakasulkeilla näin:",
-	"From (Base Model)": "Lähde (perusmalli)",
+	"Frequencey Penalty": "",
 	"Full Screen Mode": "Koko näytön tila",
 	"General": "Yleinen",
 	"General Settings": "Yleisasetukset",
@@ -222,7 +217,6 @@
 	"Hello, {{name}}": "Terve, {{name}}",
 	"Help": "Apua",
 	"Hide": "Piilota",
-	"Hide Additional Params": "Piilota lisäparametrit",
 	"How can I help you today?": "Kuinka voin auttaa tänään?",
 	"Hybrid Search": "Hybridihaku",
 	"Image Generation (Experimental)": "Kuvagenerointi (kokeellinen)",
@@ -231,7 +225,7 @@
 	"Images": "Kuvat",
 	"Import Chats": "Tuo keskustelut",
 	"Import Documents Mapping": "Tuo asiakirjakartoitus",
-	"Import Modelfiles": "Tuo mallitiedostoja",
+	"Import Models": "",
 	"Import Prompts": "Tuo kehotteita",
 	"Include `--api` flag when running stable-diffusion-webui": "Sisällytä `--api`-parametri suorittaessasi stable-diffusion-webui",
 	"Input commands": "Syötä komennot",
@@ -240,6 +234,7 @@
 	"January": "tammikuu",
 	"join our Discord for help.": "liity Discordiimme saadaksesi apua.",
 	"JSON": "JSON",
+	"JSON Preview": "",
 	"July": "heinäkuu",
 	"June": "kesäkuu",
 	"JWT Expiration": "JWT:n vanheneminen",
@@ -254,11 +249,10 @@
 	"LTR": "LTR",
 	"Made by OpenWebUI Community": "Tehnyt OpenWebUI-yhteisö",
 	"Make sure to enclose them with": "Varmista, että suljet ne",
-	"Manage LiteLLM Models": "Hallitse LiteLLM-malleja",
 	"Manage Models": "Hallitse malleja",
 	"Manage Ollama Models": "Hallitse Ollama-malleja",
 	"March": "maaliskuu",
-	"Max Tokens": "Maksimitokenit",
+	"Max Tokens (num_predict)": "",
 	"Maximum of 3 models can be downloaded simultaneously. Please try again later.": "Enintään 3 mallia voidaan ladata samanaikaisesti. Yritä myöhemmin uudelleen.",
 	"May": "toukokuu",
 	"Memories accessible by LLMs will be shown here.": "Muistitiedostot, joita LLM-ohjelmat käyttävät, näkyvät tässä.",
@@ -273,22 +267,19 @@
 	"Model '{{modelName}}' has been successfully downloaded.": "Malli '{{modelName}}' ladattiin onnistuneesti.",
 	"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 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 Name": "Mallin nimi",
+	"Model ID": "",
 	"Model not selected": "Mallia ei valittu",
-	"Model Tag Name": "Mallitagin nimi",
+	"Model Params": "",
 	"Model Whitelisting": "Mallin sallimislista",
 	"Model(s) Whitelisted": "Malli(t) sallittu",
-	"Modelfile": "Mallitiedosto",
-	"Modelfile Advanced Settings": "Mallitiedoston edistyneet asetukset",
 	"Modelfile Content": "Mallitiedoston sisältö",
-	"Modelfiles": "Mallitiedostot",
 	"Models": "Mallit",
 	"More": "Lisää",
 	"Name": "Nimi",
 	"Name Tag": "Nimitagi",
-	"Name your modelfile": "Nimeä mallitiedostosi",
+	"Name your model": "",
 	"New Chat": "Uusi keskustelu",
 	"New Password": "Uusi salasana",
 	"No results found": "Ei tuloksia",
@@ -296,8 +287,6 @@
 	"No search results found": "",
 	"No source available": "Ei lähdettä saatavilla",
 	"Not factually correct": "Ei faktisesti oikein",
-	"Not sure what to add?": "Etkö ole varma, mitä lisätä?",
-	"Not sure what to write? Switch to": "Et ole varma, mitä kirjoittaa? Vaihda",
 	"Note: If you set a minimum score, the search will only return documents with a score greater than or equal to the minimum score.": "Huom: Jos asetat vähimmäispisteet, haku palauttaa vain asiakirjat, joiden pisteet ovat suurempia tai yhtä suuria kuin vähimmäispistemäärä.",
 	"Notifications": "Ilmoitukset",
 	"November": "marraskuu",
@@ -326,7 +315,6 @@
 	"or": "tai",
 	"Other": "Muu",
 	"Overview": "Yleiskatsaus",
-	"Parameters": "Parametrit",
 	"Password": "Salasana",
 	"PDF document (.pdf)": "PDF-tiedosto (.pdf)",
 	"PDF Extract Images (OCR)": "PDF-tiedoston kuvien erottelu (OCR)",
@@ -346,10 +334,8 @@
 	"Prompts": "Kehotteet",
 	"Pull \"{{searchValue}}\" from Ollama.com": "Lataa \"{{searchValue}}\" Ollama.comista",
 	"Pull a model from Ollama.com": "Lataa malli Ollama.comista",
-	"Pull Progress": "Latauksen eteneminen",
 	"Query Params": "Kyselyparametrit",
 	"RAG Template": "RAG-malline",
-	"Raw Format": "Raaka muoto",
 	"Read Aloud": "Lue ääneen",
 	"Record voice": "Nauhoita ääni",
 	"Redirecting you to OpenWebUI Community": "Ohjataan sinut OpenWebUI-yhteisöön",
@@ -360,7 +346,6 @@
 	"Remove Model": "Poista malli",
 	"Rename": "Nimeä uudelleen",
 	"Repeat Last N": "Viimeinen N -toisto",
-	"Repeat Penalty": "Toistosakko",
 	"Request Mode": "Pyyntötila",
 	"Reranking Model": "Uudelleenpisteytysmalli",
 	"Reranking model disabled": "Uudelleenpisteytysmalli poistettu käytöstä",
@@ -387,10 +372,12 @@
 	"See readme.md for instructions": "Katso lisää ohjeita readme.md:stä",
 	"See what's new": "Katso, mitä uutta",
 	"Seed": "Siemen",
+	"Select a base model": "",
 	"Select a mode": "Valitse tila",
 	"Select a model": "Valitse malli",
 	"Select an Ollama instance": "Valitse Ollama-instanssi",
 	"Select model": "Valitse malli",
+	"Selected model(s) do not support image inputs": "",
 	"Send": "Lähetä",
 	"Send a Message": "Lähetä viesti",
 	"Send message": "Lähetä viesti",
@@ -412,7 +399,6 @@
 	"Share to OpenWebUI Community": "Jaa OpenWebUI-yhteisöön",
 	"short-summary": "lyhyt-yhteenveto",
 	"Show": "Näytä",
-	"Show Additional Params": "Näytä lisäparametrit",
 	"Show shortcuts": "Näytä pikanäppäimet",
 	"Showcased creativity": "Näytti luovuutta",
 	"sidebar": "sivupalkki",
@@ -431,7 +417,6 @@
 	"Success": "Onnistui",
 	"Successfully updated.": "Päivitetty onnistuneesti.",
 	"Suggested": "Suositeltu",
-	"Sync All": "Synkronoi kaikki",
 	"System": "Järjestelmä",
 	"System Prompt": "Järjestelmäkehote",
 	"Tags": "Tagit",
@@ -502,6 +487,7 @@
 	"Write a summary in 50 words that summarizes [topic or keyword].": "Kirjoita 50 sanan yhteenveto, joka tiivistää [aihe tai avainsana].",
 	"Yesterday": "Eilen",
 	"You": "Sinä",
+	"You cannot clone a base model": "",
 	"You have no archived conversations.": "Sinulla ei ole arkistoituja keskusteluja.",
 	"You have shared this chat": "Olet jakanut tämän keskustelun",
 	"You're a helpful assistant.": "Olet avulias apulainen.",

+ 23 - 37
src/lib/i18n/locales/fr-CA/translation.json

@@ -3,6 +3,8 @@
 	"(Beta)": "(Bêta)",
 	"(e.g. `sh webui.sh --api`)": "(par ex. `sh webui.sh --api`)",
 	"(latest)": "(dernière)",
+	"{{ models }}": "",
+	"{{ owner }}: You cannot delete a base model": "",
 	"{{modelName}} is thinking...": "{{modelName}} réfléchit...",
 	"{{user}}'s Chats": "{{user}}'s Chats",
 	"{{webUIName}} Backend Required": "Backend {{webUIName}} requis",
@@ -12,9 +14,8 @@
 	"Account": "Compte",
 	"Accurate information": "Information précise",
 	"Add": "Ajouter",
-	"Add a model": "Ajouter un modèle",
-	"Add a model tag name": "Ajouter un nom de tag pour le modèle",
-	"Add a short description about what this modelfile does": "Ajouter une courte description de ce que fait ce fichier de modèle",
+	"Add a model id": "",
+	"Add a short description about what this model does": "",
 	"Add a short title for this prompt": "Ajouter un court titre pour ce prompt",
 	"Add a tag": "Ajouter un tag",
 	"Add custom prompt": "Ajouter un prompt personnalisé",
@@ -30,6 +31,7 @@
 	"Admin Panel": "Panneau d'administration",
 	"Admin Settings": "Paramètres d'administration",
 	"Advanced Parameters": "Paramètres avancés",
+	"Advanced Params": "",
 	"all": "tous",
 	"All Documents": "Tous les documents",
 	"All Users": "Tous les utilisateurs",
@@ -44,7 +46,6 @@
 	"API Key": "Clé API",
 	"API Key created.": "Clé API créée.",
 	"API keys": "Clés API",
-	"API RPM": "RPM API",
 	"April": "Avril",
 	"Archive": "Archiver",
 	"Archived Chats": "enregistrement du chat",
@@ -61,12 +62,12 @@
 	"available!": "disponible !",
 	"Back": "Retour",
 	"Bad Response": "Mauvaise réponse",
+	"Base Model (From)": "",
 	"before": "avant",
 	"Being lazy": "En manque de temps",
-	"Builder Mode": "Mode Constructeur",
 	"Bypass SSL verification for Websites": "Parcourir la vérification SSL pour les sites Web",
 	"Cancel": "Annuler",
-	"Categories": "Catégories",
+	"Capabilities": "",
 	"Change Password": "Changer le mot de passe",
 	"Chat": "Discussion",
 	"Chat Bubble UI": "Bubble UI de discussion",
@@ -84,7 +85,6 @@
 	"Citation": "Citations",
 	"Click here for help.": "Cliquez ici pour de l'aide.",
 	"Click here to": "Cliquez ici pour",
-	"Click here to check other modelfiles.": "Cliquez ici pour vérifier d'autres fichiers de modèle.",
 	"Click here to select": "Cliquez ici pour sélectionner",
 	"Click here to select a csv file.": "Cliquez ici pour sélectionner un fichier csv.",
 	"Click here to select documents.": "Cliquez ici pour sélectionner des documents.",
@@ -109,7 +109,7 @@
 	"Copy Link": "Copier le lien",
 	"Copying to clipboard was successful!": "La copie dans le presse-papiers a réussi !",
 	"Create a concise, 3-5 word phrase as a header for the following query, strictly adhering to the 3-5 word limit and avoiding the use of the word 'title':": "Créez une phrase concise de 3 à 5 mots comme en-tête pour la requête suivante, en respectant strictement la limite de 3 à 5 mots et en évitant l'utilisation du mot 'titre' :",
-	"Create a modelfile": "Créer un fichier de modèle",
+	"Create a model": "",
 	"Create Account": "Créer un compte",
 	"Create new key": "Créer une nouvelle clé",
 	"Create new secret key": "Créer une nouvelle clé secrète",
@@ -118,7 +118,7 @@
 	"Current Model": "Modèle actuel",
 	"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",
+	"Customize models for a specific purpose": "",
 	"Dark": "Sombre",
 	"Dashboard": "Tableau de bord",
 	"Database": "Base de données",
@@ -139,11 +139,11 @@
 	"delete this link": "supprimer ce lien",
 	"Delete User": "Supprimer l'utilisateur",
 	"Deleted {{deleteModelTag}}": "{{deleteModelTag}} supprimé",
-	"Deleted {{tagName}}": "{{tagName}} supprimé",
+	"Deleted {{name}}": "",
 	"Description": "Description",
 	"Didn't fully follow instructions": "Ne suit pas les instructions",
 	"Disabled": "Désactivé",
-	"Discover a modelfile": "Découvrir un fichier de modèle",
+	"Discover a model": "",
 	"Discover a prompt": "Découvrir un prompt",
 	"Discover, download, and explore custom prompts": "Découvrir, télécharger et explorer des prompts personnalisés",
 	"Discover, download, and explore model presets": "Découvrir, télécharger et explorer des préconfigurations de modèles",
@@ -177,11 +177,6 @@
 	"Enter Chunk Size": "Entrez la taille du bloc",
 	"Enter Image Size (e.g. 512x512)": "Entrez la taille de l'image (p. ex. 512x512)",
 	"Enter language codes": "Entrez les codes de langue",
-	"Enter LiteLLM API Base URL (litellm_params.api_base)": "Entrez l'URL de base de l'API LiteLLM (litellm_params.api_base)",
-	"Enter LiteLLM API Key (litellm_params.api_key)": "Entrez la clé API LiteLLM (litellm_params.api_key)",
-	"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 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",
@@ -197,7 +192,7 @@
 	"Export All Chats (All Users)": "Exporter toutes les discussions (Tous les utilisateurs)",
 	"Export Chats": "Exporter les discussions",
 	"Export Documents Mapping": "Exporter le mappage des documents",
-	"Export Modelfiles": "Exporter les fichiers de modèle",
+	"Export Models": "",
 	"Export Prompts": "Exporter les prompts",
 	"Failed to create API Key.": "Impossible de créer la clé API.",
 	"Failed to read clipboard contents": "Échec de la lecture du contenu du presse-papiers",
@@ -210,7 +205,7 @@
 	"Focus chat input": "Se concentrer sur l'entrée de la discussion",
 	"Followed instructions perfectly": "Suivi des instructions parfaitement",
 	"Format your variables using square brackets like this:": "Formatez vos variables en utilisant des crochets comme ceci :",
-	"From (Base Model)": "De (Modèle de base)",
+	"Frequencey Penalty": "",
 	"Full Screen Mode": "Mode plein écran",
 	"General": "Général",
 	"General Settings": "Paramètres généraux",
@@ -222,7 +217,6 @@
 	"Hello, {{name}}": "Bonjour, {{name}}",
 	"Help": "Aide",
 	"Hide": "Cacher",
-	"Hide Additional Params": "Cacher les paramètres supplémentaires",
 	"How can I help you today?": "Comment puis-je vous aider aujourd'hui ?",
 	"Hybrid Search": "Recherche hybride",
 	"Image Generation (Experimental)": "Génération d'image (Expérimental)",
@@ -231,7 +225,7 @@
 	"Images": "Images",
 	"Import Chats": "Importer les discussions",
 	"Import Documents Mapping": "Importer le mappage des documents",
-	"Import Modelfiles": "Importer les fichiers de modèle",
+	"Import Models": "",
 	"Import Prompts": "Importer les prompts",
 	"Include `--api` flag when running stable-diffusion-webui": "Inclure l'indicateur `--api` lors de l'exécution de stable-diffusion-webui",
 	"Input commands": "Entrez des commandes d'entrée",
@@ -240,6 +234,7 @@
 	"January": "Janvier",
 	"join our Discord for help.": "rejoignez notre Discord pour obtenir de l'aide.",
 	"JSON": "JSON",
+	"JSON Preview": "",
 	"July": "Juillet",
 	"June": "Juin",
 	"JWT Expiration": "Expiration du JWT",
@@ -254,11 +249,10 @@
 	"LTR": "LTR",
 	"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 Models": "Gérer les modèles",
 	"Manage Ollama Models": "Gérer les modèles Ollama",
 	"March": "Mars",
-	"Max Tokens": "Tokens maximaux",
+	"Max Tokens (num_predict)": "",
 	"Maximum of 3 models can be downloaded simultaneously. Please try again later.": "Un maximum de 3 modèles peut être téléchargé simultanément. Veuillez réessayer plus tard.",
 	"May": "Mai",
 	"Memories accessible by LLMs will be shown here.": "Les mémoires accessibles par les LLM seront affichées ici.",
@@ -273,22 +267,19 @@
 	"Model '{{modelName}}' has been successfully downloaded.": "Le modèle '{{modelName}}' a été téléchargé avec succès.",
 	"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 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 Name": "Nom du modèle",
+	"Model ID": "",
 	"Model not selected": "Modèle non sélectionné",
-	"Model Tag Name": "Nom de tag du modèle",
+	"Model Params": "",
 	"Model Whitelisting": "Liste blanche de modèle",
 	"Model(s) Whitelisted": "Modèle(s) sur liste blanche",
-	"Modelfile": "Fichier de modèle",
-	"Modelfile Advanced Settings": "Paramètres avancés du fichier de modèle",
 	"Modelfile Content": "Contenu du fichier de modèle",
-	"Modelfiles": "Fichiers de modèle",
 	"Models": "Modèles",
 	"More": "Plus",
 	"Name": "Nom",
 	"Name Tag": "Tag de nom",
-	"Name your modelfile": "Nommez votre fichier de modèle",
+	"Name your model": "",
 	"New Chat": "Nouvelle discussion",
 	"New Password": "Nouveau mot de passe",
 	"No results found": "Aucun résultat trouvé",
@@ -296,8 +287,6 @@
 	"No search results found": "",
 	"No source available": "Aucune source disponible",
 	"Not factually correct": "Non, pas exactement correct",
-	"Not sure what to add?": "Pas sûr de quoi ajouter ?",
-	"Not sure what to write? Switch to": "Pas sûr de quoi écrire ? Changez pour",
 	"Note: If you set a minimum score, the search will only return documents with a score greater than or equal to the minimum score.": "Note: Si vous définissez un score minimum, la recherche ne retournera que les documents avec un score supérieur ou égal au score minimum.",
 	"Notifications": "Notifications de bureau",
 	"November": "Novembre",
@@ -326,7 +315,6 @@
 	"or": "ou",
 	"Other": "Autre",
 	"Overview": "Aperçu",
-	"Parameters": "Paramètres",
 	"Password": "Mot de passe",
 	"PDF document (.pdf)": "Document PDF (.pdf)",
 	"PDF Extract Images (OCR)": "Extraction d'images PDF (OCR)",
@@ -346,10 +334,8 @@
 	"Prompts": "Prompts",
 	"Pull \"{{searchValue}}\" from Ollama.com": "Tirer \"{{searchValue}}\" de Ollama.com",
 	"Pull a model from Ollama.com": "Tirer un modèle de Ollama.com",
-	"Pull Progress": "Progression du téléchargement",
 	"Query Params": "Paramètres de requête",
 	"RAG Template": "Modèle RAG",
-	"Raw Format": "Format brut",
 	"Read Aloud": "Lire à l'échelle",
 	"Record voice": "Enregistrer la voix",
 	"Redirecting you to OpenWebUI Community": "Vous redirige vers la communauté OpenWebUI",
@@ -360,7 +346,6 @@
 	"Remove Model": "Supprimer le modèle",
 	"Rename": "Renommer",
 	"Repeat Last N": "Répéter les N derniers",
-	"Repeat Penalty": "Pénalité de répétition",
 	"Request Mode": "Mode de requête",
 	"Reranking Model": "Modèle de reranking",
 	"Reranking model disabled": "Modèle de reranking désactivé",
@@ -387,10 +372,12 @@
 	"See readme.md for instructions": "Voir readme.md pour les instructions",
 	"See what's new": "Voir les nouveautés",
 	"Seed": "Graine",
+	"Select a base model": "",
 	"Select a mode": "Sélectionnez un mode",
 	"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 model(s) do not support image inputs": "",
 	"Send": "Envoyer",
 	"Send a Message": "Envoyer un message",
 	"Send message": "Envoyer un message",
@@ -412,7 +399,6 @@
 	"Share to OpenWebUI Community": "Partager avec la communauté OpenWebUI",
 	"short-summary": "résumé court",
 	"Show": "Afficher",
-	"Show Additional Params": "Afficher les paramètres supplémentaires",
 	"Show shortcuts": "Afficher les raccourcis",
 	"Showcased creativity": "Créativité affichée",
 	"sidebar": "barre latérale",
@@ -431,7 +417,6 @@
 	"Success": "Succès",
 	"Successfully updated.": "Mis à jour avec succès.",
 	"Suggested": "Suggéré",
-	"Sync All": "Synchroniser tout",
 	"System": "Système",
 	"System Prompt": "Prompt Système",
 	"Tags": "Tags",
@@ -502,6 +487,7 @@
 	"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é].",
 	"Yesterday": "hier",
 	"You": "Vous",
+	"You cannot clone a base model": "",
 	"You have no archived conversations.": "Vous n'avez aucune conversation archivée.",
 	"You have shared this chat": "Vous avez partagé cette conversation",
 	"You're a helpful assistant.": "Vous êtes un assistant utile",

+ 23 - 37
src/lib/i18n/locales/fr-FR/translation.json

@@ -3,6 +3,8 @@
 	"(Beta)": "(Bêta)",
 	"(e.g. `sh webui.sh --api`)": "(par ex. `sh webui.sh --api`)",
 	"(latest)": "(dernière)",
+	"{{ models }}": "",
+	"{{ owner }}: You cannot delete a base model": "",
 	"{{modelName}} is thinking...": "{{modelName}} réfléchit...",
 	"{{user}}'s Chats": "{{user}}'s Chats",
 	"{{webUIName}} Backend Required": "Backend {{webUIName}} requis",
@@ -12,9 +14,8 @@
 	"Account": "Compte",
 	"Accurate information": "Information précise",
 	"Add": "Ajouter",
-	"Add a model": "Ajouter un modèle",
-	"Add a model tag name": "Ajouter un nom de tag pour le modèle",
-	"Add a short description about what this modelfile does": "Ajouter une courte description de ce que fait ce fichier de modèle",
+	"Add a model id": "",
+	"Add a short description about what this model does": "",
 	"Add a short title for this prompt": "Ajouter un court titre pour ce prompt",
 	"Add a tag": "Ajouter un tag",
 	"Add custom prompt": "Ajouter un prompt personnalisé",
@@ -30,6 +31,7 @@
 	"Admin Panel": "Panneau d'administration",
 	"Admin Settings": "Paramètres d'administration",
 	"Advanced Parameters": "Paramètres avancés",
+	"Advanced Params": "",
 	"all": "tous",
 	"All Documents": "Tous les documents",
 	"All Users": "Tous les utilisateurs",
@@ -44,7 +46,6 @@
 	"API Key": "Clé API",
 	"API Key created.": "Clé API créée.",
 	"API keys": "Clés API",
-	"API RPM": "RPM API",
 	"April": "Avril",
 	"Archive": "Archiver",
 	"Archived Chats": "enregistrement du chat",
@@ -61,12 +62,12 @@
 	"available!": "disponible !",
 	"Back": "Retour",
 	"Bad Response": "Mauvaise réponse",
+	"Base Model (From)": "",
 	"before": "avant",
 	"Being lazy": "En manque de temps",
-	"Builder Mode": "Mode Constructeur",
 	"Bypass SSL verification for Websites": "Parcourir la vérification SSL pour les sites Web",
 	"Cancel": "Annuler",
-	"Categories": "Catégories",
+	"Capabilities": "",
 	"Change Password": "Changer le mot de passe",
 	"Chat": "Chat",
 	"Chat Bubble UI": "Chat Bubble UI",
@@ -84,7 +85,6 @@
 	"Citation": "Citations",
 	"Click here for help.": "Cliquez ici pour de l'aide.",
 	"Click here to": "Cliquez ici pour",
-	"Click here to check other modelfiles.": "Cliquez ici pour vérifier d'autres fichiers de modèle.",
 	"Click here to select": "Cliquez ici pour sélectionner",
 	"Click here to select a csv file.": "Cliquez ici pour sélectionner un fichier csv.",
 	"Click here to select documents.": "Cliquez ici pour sélectionner des documents.",
@@ -109,7 +109,7 @@
 	"Copy Link": "Copier le lien",
 	"Copying to clipboard was successful!": "La copie dans le presse-papiers a réussi !",
 	"Create a concise, 3-5 word phrase as a header for the following query, strictly adhering to the 3-5 word limit and avoiding the use of the word 'title':": "Créez une phrase concise de 3-5 mots comme en-tête pour la requête suivante, en respectant strictement la limite de 3-5 mots et en évitant l'utilisation du mot 'titre' :",
-	"Create a modelfile": "Créer un fichier de modèle",
+	"Create a model": "",
 	"Create Account": "Créer un compte",
 	"Create new key": "Créer une nouvelle clé",
 	"Create new secret key": "Créer une nouvelle clé secrète",
@@ -118,7 +118,7 @@
 	"Current Model": "Modèle actuel",
 	"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",
+	"Customize models for a specific purpose": "",
 	"Dark": "Sombre",
 	"Dashboard": "Tableau de bord",
 	"Database": "Base de données",
@@ -139,11 +139,11 @@
 	"delete this link": "supprimer ce lien",
 	"Delete User": "Supprimer l'utilisateur",
 	"Deleted {{deleteModelTag}}": "{{deleteModelTag}} supprimé",
-	"Deleted {{tagName}}": "{{tagName}} supprimé",
+	"Deleted {{name}}": "",
 	"Description": "Description",
 	"Didn't fully follow instructions": "Ne suit pas les instructions",
 	"Disabled": "Désactivé",
-	"Discover a modelfile": "Découvrir un fichier de modèle",
+	"Discover a model": "",
 	"Discover a prompt": "Découvrir un prompt",
 	"Discover, download, and explore custom prompts": "Découvrir, télécharger et explorer des prompts personnalisés",
 	"Discover, download, and explore model presets": "Découvrir, télécharger et explorer des préconfigurations de modèles",
@@ -177,11 +177,6 @@
 	"Enter Chunk Size": "Entrez la taille du bloc",
 	"Enter Image Size (e.g. 512x512)": "Entrez la taille de l'image (p. ex. 512x512)",
 	"Enter language codes": "Entrez les codes de langue",
-	"Enter LiteLLM API Base URL (litellm_params.api_base)": "Entrez l'URL de base de l'API LiteLLM (litellm_params.api_base)",
-	"Enter LiteLLM API Key (litellm_params.api_key)": "Entrez la clé API LiteLLM (litellm_params.api_key)",
-	"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 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",
@@ -197,7 +192,7 @@
 	"Export All Chats (All Users)": "Exporter tous les chats (tous les utilisateurs)",
 	"Export Chats": "Exporter les chats",
 	"Export Documents Mapping": "Exporter la correspondance des documents",
-	"Export Modelfiles": "Exporter les fichiers de modèle",
+	"Export Models": "",
 	"Export Prompts": "Exporter les prompts",
 	"Failed to create API Key.": "Impossible de créer la clé API.",
 	"Failed to read clipboard contents": "Échec de la lecture du contenu du presse-papiers",
@@ -210,7 +205,7 @@
 	"Focus chat input": "Concentrer sur l'entrée du chat",
 	"Followed instructions perfectly": "Suivi des instructions parfaitement",
 	"Format your variables using square brackets like this:": "Formatez vos variables en utilisant des crochets comme ceci :",
-	"From (Base Model)": "De (Modèle de base)",
+	"Frequencey Penalty": "",
 	"Full Screen Mode": "Mode plein écran",
 	"General": "Général",
 	"General Settings": "Paramètres généraux",
@@ -222,7 +217,6 @@
 	"Hello, {{name}}": "Bonjour, {{name}}",
 	"Help": "Aide",
 	"Hide": "Cacher",
-	"Hide Additional Params": "Hide additional params",
 	"How can I help you today?": "Comment puis-je vous aider aujourd'hui ?",
 	"Hybrid Search": "Recherche hybride",
 	"Image Generation (Experimental)": "Génération d'image (Expérimental)",
@@ -231,7 +225,7 @@
 	"Images": "Images",
 	"Import Chats": "Importer les chats",
 	"Import Documents Mapping": "Importer la correspondance des documents",
-	"Import Modelfiles": "Importer les fichiers de modèle",
+	"Import Models": "",
 	"Import Prompts": "Importer les prompts",
 	"Include `--api` flag when running stable-diffusion-webui": "Inclure le drapeau `--api` lors de l'exécution de stable-diffusion-webui",
 	"Input commands": "Entrez les commandes d'entrée",
@@ -240,6 +234,7 @@
 	"January": "Janvier",
 	"join our Discord for help.": "rejoignez notre Discord pour obtenir de l'aide.",
 	"JSON": "JSON",
+	"JSON Preview": "",
 	"July": "Juillet",
 	"June": "Juin",
 	"JWT Expiration": "Expiration JWT",
@@ -254,11 +249,10 @@
 	"LTR": "LTR",
 	"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 Models": "Gérer les modèles",
 	"Manage Ollama Models": "Gérer les modèles Ollama",
 	"March": "Mars",
-	"Max Tokens": "Tokens maximaux",
+	"Max Tokens (num_predict)": "",
 	"Maximum of 3 models can be downloaded simultaneously. Please try again later.": "Un maximum de 3 modèles peut être téléchargé simultanément. Veuillez réessayer plus tard.",
 	"May": "Mai",
 	"Memories accessible by LLMs will be shown here.": "Les mémoires accessibles par les LLM seront affichées ici.",
@@ -273,22 +267,19 @@
 	"Model '{{modelName}}' has been successfully downloaded.": "Le modèle '{{modelName}}' a été téléchargé avec succès.",
 	"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 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 Name": "Nom du modèle",
+	"Model ID": "",
 	"Model not selected": "Modèle non sélectionné",
-	"Model Tag Name": "Nom de tag du modèle",
+	"Model Params": "",
 	"Model Whitelisting": "Liste blanche de modèle",
 	"Model(s) Whitelisted": "Modèle(s) sur liste blanche",
-	"Modelfile": "Fichier de modèle",
-	"Modelfile Advanced Settings": "Paramètres avancés du fichier de modèle",
 	"Modelfile Content": "Contenu du fichier de modèle",
-	"Modelfiles": "Fichiers de modèle",
 	"Models": "Modèles",
 	"More": "Plus",
 	"Name": "Nom",
 	"Name Tag": "Tag de nom",
-	"Name your modelfile": "Nommez votre fichier de modèle",
+	"Name your model": "",
 	"New Chat": "Nouveau chat",
 	"New Password": "Nouveau mot de passe",
 	"No results found": "Aucun résultat trouvé",
@@ -296,8 +287,6 @@
 	"No search results found": "",
 	"No source available": "Aucune source disponible",
 	"Not factually correct": "Non, pas exactement correct",
-	"Not sure what to add?": "Vous ne savez pas quoi ajouter ?",
-	"Not sure what to write? Switch to": "Vous ne savez pas quoi écrire ? Basculer vers",
 	"Note: If you set a minimum score, the search will only return documents with a score greater than or equal to the minimum score.": "Note: Si vous définissez un score minimum, la recherche ne retournera que les documents avec un score supérieur ou égal au score minimum.",
 	"Notifications": "Notifications de bureau",
 	"November": "Novembre",
@@ -326,7 +315,6 @@
 	"or": "ou",
 	"Other": "Autre",
 	"Overview": "Aperçu",
-	"Parameters": "Paramètres",
 	"Password": "Mot de passe",
 	"PDF document (.pdf)": "Document PDF (.pdf)",
 	"PDF Extract Images (OCR)": "Extraction d'images PDF (OCR)",
@@ -346,10 +334,8 @@
 	"Prompts": "Prompts",
 	"Pull \"{{searchValue}}\" from Ollama.com": "Tirer \"{{searchValue}}\" de Ollama.com",
 	"Pull a model from Ollama.com": "Tirer un modèle de Ollama.com",
-	"Pull Progress": "Progression du tirage",
 	"Query Params": "Paramètres de requête",
 	"RAG Template": "Modèle RAG",
-	"Raw Format": "Format brut",
 	"Read Aloud": "Lire à l'oreille",
 	"Record voice": "Enregistrer la voix",
 	"Redirecting you to OpenWebUI Community": "Vous redirige vers la communauté OpenWebUI",
@@ -360,7 +346,6 @@
 	"Remove Model": "Supprimer le modèle",
 	"Rename": "Renommer",
 	"Repeat Last N": "Répéter les derniers N",
-	"Repeat Penalty": "Pénalité de répétition",
 	"Request Mode": "Mode de demande",
 	"Reranking Model": "Modèle de reranking",
 	"Reranking model disabled": "Modèle de reranking désactivé",
@@ -387,10 +372,12 @@
 	"See readme.md for instructions": "Voir readme.md pour les instructions",
 	"See what's new": "Voir les nouveautés",
 	"Seed": "Graine",
+	"Select a base model": "",
 	"Select a mode": "Sélectionnez un mode",
 	"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 model(s) do not support image inputs": "",
 	"Send": "Envoyer",
 	"Send a Message": "Envoyer un message",
 	"Send message": "Envoyer un message",
@@ -412,7 +399,6 @@
 	"Share to OpenWebUI Community": "Partager avec la communauté OpenWebUI",
 	"short-summary": "résumé court",
 	"Show": "Montrer",
-	"Show Additional Params": "Afficher les paramètres supplémentaires",
 	"Show shortcuts": "Afficher les raccourcis",
 	"Showcased creativity": "Créativité affichée",
 	"sidebar": "barre latérale",
@@ -431,7 +417,6 @@
 	"Success": "Succès",
 	"Successfully updated.": "Mis à jour avec succès.",
 	"Suggested": "Suggéré",
-	"Sync All": "Synchroniser tout",
 	"System": "Système",
 	"System Prompt": "Invite de système",
 	"Tags": "Tags",
@@ -502,6 +487,7 @@
 	"Write a summary in 50 words that summarizes [topic or keyword].": "Ecrivez un résumé en 50 mots [sujet ou mot-clé]",
 	"Yesterday": "hier",
 	"You": "Vous",
+	"You cannot clone a base model": "",
 	"You have no archived conversations.": "Vous n'avez aucune conversation archivée.",
 	"You have shared this chat": "Vous avez partagé cette conversation.",
 	"You're a helpful assistant.": "Vous êtes un assistant utile",

+ 23 - 37
src/lib/i18n/locales/he-IL/translation.json

@@ -3,6 +3,8 @@
 	"(Beta)": "(בטא)",
 	"(e.g. `sh webui.sh --api`)": "(למשל `sh webui.sh --api`)",
 	"(latest)": "(האחרון)",
+	"{{ models }}": "",
+	"{{ owner }}: You cannot delete a base model": "",
 	"{{modelName}} is thinking...": "{{modelName}} חושב...",
 	"{{user}}'s Chats": "צ'אטים של {{user}}",
 	"{{webUIName}} Backend Required": "נדרש Backend של {{webUIName}}",
@@ -12,9 +14,8 @@
 	"Account": "חשבון",
 	"Accurate information": "מידע מדויק",
 	"Add": "הוסף",
-	"Add a model": "הוסף מודל",
-	"Add a model tag name": "הוסף שם תג למודל",
-	"Add a short description about what this modelfile does": "הוסף תיאור קצר על מה שהקובץ מודל עושה",
+	"Add a model id": "",
+	"Add a short description about what this model does": "",
 	"Add a short title for this prompt": "הוסף כותרת קצרה לפקודה זו",
 	"Add a tag": "הוסף תג",
 	"Add custom prompt": "הוסף פקודה מותאמת אישית",
@@ -30,6 +31,7 @@
 	"Admin Panel": "לוח בקרה למנהל",
 	"Admin Settings": "הגדרות מנהל",
 	"Advanced Parameters": "פרמטרים מתקדמים",
+	"Advanced Params": "",
 	"all": "הכל",
 	"All Documents": "כל המסמכים",
 	"All Users": "כל המשתמשים",
@@ -44,7 +46,6 @@
 	"API Key": "מפתח API",
 	"API Key created.": "מפתח API נוצר.",
 	"API keys": "מפתחות API",
-	"API RPM": "RPM של API",
 	"April": "אפריל",
 	"Archive": "ארכיון",
 	"Archived Chats": "צ'אטים מאורכבים",
@@ -61,12 +62,12 @@
 	"available!": "זמין!",
 	"Back": "חזור",
 	"Bad Response": "תגובה שגויה",
+	"Base Model (From)": "",
 	"before": "לפני",
 	"Being lazy": "להיות עצלן",
-	"Builder Mode": "מצב בונה",
 	"Bypass SSL verification for Websites": "עקוף אימות SSL עבור אתרים",
 	"Cancel": "בטל",
-	"Categories": "קטגוריות",
+	"Capabilities": "",
 	"Change Password": "שנה סיסמה",
 	"Chat": "צ'אט",
 	"Chat Bubble UI": "UI של תיבת הדיבור",
@@ -84,7 +85,6 @@
 	"Citation": "ציטוט",
 	"Click here for help.": "לחץ כאן לעזרה.",
 	"Click here to": "לחץ כאן כדי",
-	"Click here to check other modelfiles.": "לחץ כאן לבדיקת קבצי מודלים אחרים.",
 	"Click here to select": "לחץ כאן לבחירה",
 	"Click here to select a csv file.": "לחץ כאן לבחירת קובץ csv.",
 	"Click here to select documents.": "לחץ כאן לבחירת מסמכים.",
@@ -109,7 +109,7 @@
 	"Copy Link": "העתק קישור",
 	"Copying to clipboard was successful!": "ההעתקה ללוח הייתה מוצלחת!",
 	"Create a concise, 3-5 word phrase as a header for the following query, strictly adhering to the 3-5 word limit and avoiding the use of the word 'title':": "צור ביטוי תמציתי של 3-5 מילים ככותרת לשאילתה הבאה, תוך שמירה מדויקת על מגבלת 3-5 המילים והימנעות משימוש במילה 'כותרת':",
-	"Create a modelfile": "צור קובץ מודל",
+	"Create a model": "",
 	"Create Account": "צור חשבון",
 	"Create new key": "צור מפתח חדש",
 	"Create new secret key": "צור מפתח סודי חדש",
@@ -118,7 +118,7 @@
 	"Current Model": "המודל הנוכחי",
 	"Current Password": "הסיסמה הנוכחית",
 	"Custom": "מותאם אישית",
-	"Customize Ollama models for a specific purpose": "התאמה אישית של מודלים של Ollama למטרה מסוימת",
+	"Customize models for a specific purpose": "",
 	"Dark": "כהה",
 	"Dashboard": "לוח בקרה",
 	"Database": "מסד נתונים",
@@ -139,11 +139,11 @@
 	"delete this link": "מחק את הקישור הזה",
 	"Delete User": "מחק משתמש",
 	"Deleted {{deleteModelTag}}": "נמחק {{deleteModelTag}}",
-	"Deleted {{tagName}}": "נמחק {{tagName}}",
+	"Deleted {{name}}": "",
 	"Description": "תיאור",
 	"Didn't fully follow instructions": "לא עקב אחרי ההוראות באופן מלא",
 	"Disabled": "מושבת",
-	"Discover a modelfile": "גלה קובץ מודל",
+	"Discover a model": "",
 	"Discover a prompt": "גלה פקודה",
 	"Discover, download, and explore custom prompts": "גלה, הורד, וחקור פקודות מותאמות אישית",
 	"Discover, download, and explore model presets": "גלה, הורד, וחקור הגדרות מודל מוגדרות מראש",
@@ -177,11 +177,6 @@
 	"Enter Chunk Size": "הזן גודל נתונים",
 	"Enter Image Size (e.g. 512x512)": "הזן גודל תמונה (למשל 512x512)",
 	"Enter language codes": "הזן קודי שפה",
-	"Enter LiteLLM API Base URL (litellm_params.api_base)": "הזן כתובת URL בסיסית ל-API של LiteLLM (litellm_params.api_base)",
-	"Enter LiteLLM API Key (litellm_params.api_key)": "הזן מפתח API של LiteLLM (litellm_params.api_key)",
-	"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 tag (e.g. {{modelTag}})": "הזן תג מודל (למשל {{modelTag}})",
 	"Enter Number of Steps (e.g. 50)": "הזן מספר שלבים (למשל 50)",
 	"Enter Score": "הזן ציון",
@@ -197,7 +192,7 @@
 	"Export All Chats (All Users)": "ייצוא כל הצ'אטים (כל המשתמשים)",
 	"Export Chats": "ייצוא צ'אטים",
 	"Export Documents Mapping": "ייצוא מיפוי מסמכים",
-	"Export Modelfiles": "ייצוא קבצי מודלים",
+	"Export Models": "",
 	"Export Prompts": "ייצוא פקודות",
 	"Failed to create API Key.": "יצירת מפתח API נכשלה.",
 	"Failed to read clipboard contents": "קריאת תוכן הלוח נכשלה",
@@ -210,7 +205,7 @@
 	"Focus chat input": "מיקוד הקלט לצ'אט",
 	"Followed instructions perfectly": "עקב אחר ההוראות במושלמות",
 	"Format your variables using square brackets like this:": "עצב את המשתנים שלך באמצעות סוגריים מרובעים כך:",
-	"From (Base Model)": "מ (מודל בסיס)",
+	"Frequencey Penalty": "",
 	"Full Screen Mode": "מצב מסך מלא",
 	"General": "כללי",
 	"General Settings": "הגדרות כלליות",
@@ -222,7 +217,6 @@
 	"Hello, {{name}}": "שלום, {{name}}",
 	"Help": "עזרה",
 	"Hide": "הסתר",
-	"Hide Additional Params": "הסתר פרמטרים נוספים",
 	"How can I help you today?": "כיצד אוכל לעזור לך היום?",
 	"Hybrid Search": "חיפוש היברידי",
 	"Image Generation (Experimental)": "יצירת תמונות (ניסיוני)",
@@ -231,7 +225,7 @@
 	"Images": "תמונות",
 	"Import Chats": "יבוא צ'אטים",
 	"Import Documents Mapping": "יבוא מיפוי מסמכים",
-	"Import Modelfiles": "יבוא קבצי מודלים",
+	"Import Models": "",
 	"Import Prompts": "יבוא פקודות",
 	"Include `--api` flag when running stable-diffusion-webui": "כלול את הדגל `--api` בעת הרצת stable-diffusion-webui",
 	"Input commands": "פקודות קלט",
@@ -240,6 +234,7 @@
 	"January": "ינואר",
 	"join our Discord for help.": "הצטרף ל-Discord שלנו לעזרה.",
 	"JSON": "JSON",
+	"JSON Preview": "",
 	"July": "יולי",
 	"June": "יוני",
 	"JWT Expiration": "תפוגת JWT",
@@ -254,11 +249,10 @@
 	"LTR": "LTR",
 	"Made by OpenWebUI Community": "נוצר על ידי קהילת OpenWebUI",
 	"Make sure to enclose them with": "ודא להקיף אותם עם",
-	"Manage LiteLLM Models": "נהל מודלים של LiteLLM",
 	"Manage Models": "נהל מודלים",
 	"Manage Ollama Models": "נהל מודלים של Ollama",
 	"March": "מרץ",
-	"Max Tokens": "מקסימום טוקנים",
+	"Max Tokens (num_predict)": "",
 	"Maximum of 3 models can be downloaded simultaneously. Please try again later.": "ניתן להוריד מקסימום 3 מודלים בו זמנית. אנא נסה שוב מאוחר יותר.",
 	"May": "מאי",
 	"Memories accessible by LLMs will be shown here.": "מזכירים נגישים על ידי LLMs יוצגו כאן.",
@@ -273,22 +267,19 @@
 	"Model '{{modelName}}' has been successfully downloaded.": "המודל '{{modelName}}' הורד בהצלחה.",
 	"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 filesystem path detected. Model shortname is required for update, cannot continue.": "נתיב מערכת הקבצים של המודל זוהה. נדרש שם קצר של המודל לעדכון, לא ניתן להמשיך.",
-	"Model Name": "שם המודל",
+	"Model ID": "",
 	"Model not selected": "לא נבחר מודל",
-	"Model Tag Name": "שם תג המודל",
+	"Model Params": "",
 	"Model Whitelisting": "רישום לבן של מודלים",
 	"Model(s) Whitelisted": "מודלים שנכללו ברשימה הלבנה",
-	"Modelfile": "קובץ מודל",
-	"Modelfile Advanced Settings": "הגדרות מתקדמות לקובץ מודל",
 	"Modelfile Content": "תוכן קובץ מודל",
-	"Modelfiles": "קבצי מודל",
 	"Models": "מודלים",
 	"More": "עוד",
 	"Name": "שם",
 	"Name Tag": "תג שם",
-	"Name your modelfile": "תן שם לקובץ המודל שלך",
+	"Name your model": "",
 	"New Chat": "צ'אט חדש",
 	"New Password": "סיסמה חדשה",
 	"No results found": "לא נמצאו תוצאות",
@@ -296,8 +287,6 @@
 	"No search results found": "",
 	"No source available": "אין מקור זמין",
 	"Not factually correct": "לא נכון מבחינה עובדתית",
-	"Not sure what to add?": "לא בטוח מה להוסיף?",
-	"Not sure what to write? Switch to": "לא בטוח מה לכתוב? החלף ל",
 	"Note: If you set a minimum score, the search will only return documents with a score greater than or equal to the minimum score.": "הערה: אם תקבע ציון מינימלי, החיפוש יחזיר רק מסמכים עם ציון שגבוה או שווה לציון המינימלי.",
 	"Notifications": "התראות",
 	"November": "נובמבר",
@@ -326,7 +315,6 @@
 	"or": "או",
 	"Other": "אחר",
 	"Overview": "סקירה כללית",
-	"Parameters": "פרמטרים",
 	"Password": "סיסמה",
 	"PDF document (.pdf)": "מסמך PDF (.pdf)",
 	"PDF Extract Images (OCR)": "חילוץ תמונות מ-PDF (OCR)",
@@ -346,10 +334,8 @@
 	"Prompts": "פקודות",
 	"Pull \"{{searchValue}}\" from Ollama.com": "משוך \"{{searchValue}}\" מ-Ollama.com",
 	"Pull a model from Ollama.com": "משוך מודל מ-Ollama.com",
-	"Pull Progress": "משוך התקדמות",
 	"Query Params": "פרמטרי שאילתה",
 	"RAG Template": "תבנית RAG",
-	"Raw Format": "פורמט גולמי",
 	"Read Aloud": "קרא בקול",
 	"Record voice": "הקלט קול",
 	"Redirecting you to OpenWebUI Community": "מפנה אותך לקהילת OpenWebUI",
@@ -360,7 +346,6 @@
 	"Remove Model": "הסר מודל",
 	"Rename": "שנה שם",
 	"Repeat Last N": "חזור על ה-N האחרונים",
-	"Repeat Penalty": "עונש חזרה",
 	"Request Mode": "מצב בקשה",
 	"Reranking Model": "מודל דירוג מחדש",
 	"Reranking model disabled": "מודל דירוג מחדש מושבת",
@@ -387,10 +372,12 @@
 	"See readme.md for instructions": "ראה את readme.md להוראות",
 	"See what's new": "ראה מה חדש",
 	"Seed": "זרע",
+	"Select a base model": "",
 	"Select a mode": "בחר מצב",
 	"Select a model": "בחר מודל",
 	"Select an Ollama instance": "בחר מופע של Ollama",
 	"Select model": "בחר מודל",
+	"Selected model(s) do not support image inputs": "",
 	"Send": "שלח",
 	"Send a Message": "שלח הודעה",
 	"Send message": "שלח הודעה",
@@ -412,7 +399,6 @@
 	"Share to OpenWebUI Community": "שתף לקהילת OpenWebUI",
 	"short-summary": "סיכום קצר",
 	"Show": "הצג",
-	"Show Additional Params": "הצג פרמטרים נוספים",
 	"Show shortcuts": "הצג קיצורי דרך",
 	"Showcased creativity": "הצגת יצירתיות",
 	"sidebar": "סרגל צד",
@@ -431,7 +417,6 @@
 	"Success": "הצלחה",
 	"Successfully updated.": "עדכון הצלחה.",
 	"Suggested": "מומלץ",
-	"Sync All": "סנכרן הכל",
 	"System": "מערכת",
 	"System Prompt": "תגובת מערכת",
 	"Tags": "תגיות",
@@ -502,6 +487,7 @@
 	"Write a summary in 50 words that summarizes [topic or keyword].": "כתוב סיכום ב-50 מילים שמסכם [נושא או מילת מפתח].",
 	"Yesterday": "אתמול",
 	"You": "אתה",
+	"You cannot clone a base model": "",
 	"You have no archived conversations.": "אין לך שיחות בארכיון.",
 	"You have shared this chat": "שיתפת את השיחה הזו",
 	"You're a helpful assistant.": "אתה עוזר מועיל.",

+ 23 - 37
src/lib/i18n/locales/hi-IN/translation.json

@@ -3,6 +3,8 @@
 	"(Beta)": "(Beta)",
 	"(e.g. `sh webui.sh --api`)": "(e.g. `sh webui.sh --api`)",
 	"(latest)": "(latest)",
+	"{{ models }}": "",
+	"{{ owner }}: You cannot delete a base model": "",
 	"{{modelName}} is thinking...": "{{modelName}} सोच रहा है...",
 	"{{user}}'s Chats": "{{user}} की चैट",
 	"{{webUIName}} Backend Required": "{{webUIName}} बैकएंड आवश्यक",
@@ -12,9 +14,8 @@
 	"Account": "खाता",
 	"Accurate information": "सटीक जानकारी",
 	"Add": "जोड़ें",
-	"Add a model": "एक मॉडल जोड़ें",
-	"Add a model tag name": "एक मॉडल टैग नाम जोड़ें",
-	"Add a short description about what this modelfile does": "यह मॉडलफ़ाइल क्या करती है इसके बारे में एक संक्षिप्त विवरण जोड़ें",
+	"Add a model id": "",
+	"Add a short description about what this model does": "",
 	"Add a short title for this prompt": "इस संकेत के लिए एक संक्षिप्त शीर्षक जोड़ें",
 	"Add a tag": "एक टैग जोड़े",
 	"Add custom prompt": "अनुकूल संकेत जोड़ें",
@@ -30,6 +31,7 @@
 	"Admin Panel": "व्यवस्थापक पैनल",
 	"Admin Settings": "व्यवस्थापक सेटिंग्स",
 	"Advanced Parameters": "उन्नत पैरामीटर",
+	"Advanced Params": "",
 	"all": "सभी",
 	"All Documents": "सभी डॉक्यूमेंट्स",
 	"All Users": "सभी उपयोगकर्ता",
@@ -44,7 +46,6 @@
 	"API Key": "एपीआई कुंजी",
 	"API Key created.": "एपीआई कुंजी बनाई गई",
 	"API keys": "एपीआई कुंजियाँ",
-	"API RPM": "एपीआई रीपीएम",
 	"April": "अप्रैल",
 	"Archive": "पुरालेख",
 	"Archived Chats": "संग्रहीत चैट",
@@ -61,12 +62,12 @@
 	"available!": "उपलब्ध!",
 	"Back": "पीछे",
 	"Bad Response": "ख़राब प्रतिक्रिया",
+	"Base Model (From)": "",
 	"before": "पहले",
 	"Being lazy": "आलसी होना",
-	"Builder Mode": "बिल्डर मोड",
 	"Bypass SSL verification for Websites": "वेबसाइटों के लिए SSL सुनिश्चिती को छोड़ें",
 	"Cancel": "रद्द करें",
-	"Categories": "श्रेणियाँ",
+	"Capabilities": "",
 	"Change Password": "पासवर्ड बदलें",
 	"Chat": "चैट करें",
 	"Chat Bubble UI": "चैट बॉली",
@@ -84,7 +85,6 @@
 	"Citation": "उद्धरण",
 	"Click here for help.": "सहायता के लिए यहां क्लिक करें।",
 	"Click here to": "यहां क्लिक करें",
-	"Click here to check other modelfiles.": "अन्य मॉडल फ़ाइलों की जांच के लिए यहां क्लिक करें।",
 	"Click here to select": "चयन करने के लिए यहां क्लिक करें।",
 	"Click here to select a csv file.": "सीएसवी फ़ाइल का चयन करने के लिए यहां क्लिक करें।",
 	"Click here to select documents.": "दस्तावेज़ चुनने के लिए यहां क्लिक करें।",
@@ -109,7 +109,7 @@
 	"Copy Link": "लिंक को कॉपी करें",
 	"Copying to clipboard was successful!": "क्लिपबोर्ड पर कॉपी बनाना सफल रहा!",
 	"Create a concise, 3-5 word phrase as a header for the following query, strictly adhering to the 3-5 word limit and avoiding the use of the word 'title':": "निम्नलिखित क्वेरी के लिए हेडर के रूप में एक संक्षिप्त, 3-5 शब्द वाक्यांश बनाएं, 3-5 शब्द सीमा का सख्ती से पालन करें और 'शीर्षक' शब्द के उपयोग से बचें:",
-	"Create a modelfile": "एक मॉडल फ़ाइल बनाएं",
+	"Create a model": "",
 	"Create Account": "खाता बनाएं",
 	"Create new key": "नया क्रिप्टोग्राफिक क्षेत्र बनाएं",
 	"Create new secret key": "नया क्रिप्टोग्राफिक क्षेत्र बनाएं",
@@ -118,7 +118,7 @@
 	"Current Model": "वर्तमान मॉडल",
 	"Current Password": "वर्तमान पासवर्ड",
 	"Custom": "कस्टम संस्करण",
-	"Customize Ollama models for a specific purpose": "किसी विशिष्ट उद्देश्य के लिए ओलामा मॉडल को अनुकूलित करें",
+	"Customize models for a specific purpose": "",
 	"Dark": "डार्क",
 	"Dashboard": "डैशबोर्ड",
 	"Database": "डेटाबेस",
@@ -139,11 +139,11 @@
 	"delete this link": "इस लिंक को हटाएं",
 	"Delete User": "उपभोक्ता मिटायें",
 	"Deleted {{deleteModelTag}}": "{{deleteModelTag}} हटा दिया गया",
-	"Deleted {{tagName}}": "{{tagName}} हटा दिया गया",
+	"Deleted {{name}}": "",
 	"Description": "विवरण",
 	"Didn't fully follow instructions": "निर्देशों का पूरी तरह से पालन नहीं किया",
 	"Disabled": "अक्षरण",
-	"Discover a modelfile": "मॉडल फ़ाइल खोजें",
+	"Discover a model": "",
 	"Discover a prompt": "प्रॉम्प्ट खोजें",
 	"Discover, download, and explore custom prompts": "कस्टम प्रॉम्प्ट को खोजें, डाउनलोड करें और एक्सप्लोर करें",
 	"Discover, download, and explore model presets": "मॉडल प्रीसेट खोजें, डाउनलोड करें और एक्सप्लोर करें",
@@ -177,11 +177,6 @@
 	"Enter Chunk Size": "खंड आकार दर्ज करें",
 	"Enter Image Size (e.g. 512x512)": "छवि का आकार दर्ज करें (उदा. 512x512)",
 	"Enter language codes": "भाषा कोड दर्ज करें",
-	"Enter LiteLLM API Base URL (litellm_params.api_base)": "LiteLLM API Base URL दर्ज करें (litellm_params.api_base)",
-	"Enter LiteLLM API Key (litellm_params.api_key)": "LiteLLM API Key दर्ज करें (litellm_params.api_key)",
-	"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 tag (e.g. {{modelTag}})": "Model tag दर्ज करें (उदा. {{modelTag}})",
 	"Enter Number of Steps (e.g. 50)": "चरणों की संख्या दर्ज करें (उदा. 50)",
 	"Enter Score": "स्कोर दर्ज करें",
@@ -197,7 +192,7 @@
 	"Export All Chats (All Users)": "सभी चैट निर्यात करें (सभी उपयोगकर्ताओं की)",
 	"Export Chats": "चैट निर्यात करें",
 	"Export Documents Mapping": "निर्यात दस्तावेज़ मैपिंग",
-	"Export Modelfiles": "मॉडल फ़ाइलें निर्यात करें",
+	"Export Models": "",
 	"Export Prompts": "प्रॉम्प्ट निर्यात करें",
 	"Failed to create API Key.": "एपीआई कुंजी बनाने में विफल.",
 	"Failed to read clipboard contents": "क्लिपबोर्ड सामग्री पढ़ने में विफल",
@@ -210,7 +205,7 @@
 	"Focus chat input": "चैट इनपुट पर फ़ोकस करें",
 	"Followed instructions perfectly": "निर्देशों का पूर्णतः पालन किया",
 	"Format your variables using square brackets like this:": "वर्गाकार कोष्ठकों का उपयोग करके अपने चरों को इस प्रकार प्रारूपित करें :",
-	"From (Base Model)": "(बेस मॉडल) से ",
+	"Frequencey Penalty": "",
 	"Full Screen Mode": "पूर्ण स्क्रीन मोड",
 	"General": "सामान्य",
 	"General Settings": "सामान्य सेटिंग्स",
@@ -222,7 +217,6 @@
 	"Hello, {{name}}": "नमस्ते, {{name}}",
 	"Help": "मदद",
 	"Hide": "छुपाएं",
-	"Hide Additional Params": "अतिरिक्त पैरामीटर छिपाएँ",
 	"How can I help you today?": "आज मैं आपकी कैसे मदद कर सकता हूँ?",
 	"Hybrid Search": "हाइब्रिड खोज",
 	"Image Generation (Experimental)": "छवि निर्माण (प्रायोगिक)",
@@ -231,7 +225,7 @@
 	"Images": "इमेजिस",
 	"Import Chats": "चैट आयात करें",
 	"Import Documents Mapping": "दस्तावेज़ मैपिंग आयात करें",
-	"Import Modelfiles": "मॉडल फ़ाइलें आयात करें",
+	"Import Models": "",
 	"Import Prompts": "प्रॉम्प्ट आयात करें",
 	"Include `--api` flag when running stable-diffusion-webui": "stable-diffusion-webui चलाते समय `--api` ध्वज शामिल करें",
 	"Input commands": "इनपुट क命",
@@ -240,6 +234,7 @@
 	"January": "जनवरी",
 	"join our Discord for help.": "मदद के लिए हमारे डिस्कोर्ड में शामिल हों।",
 	"JSON": "ज्ञान प्रकार",
+	"JSON Preview": "",
 	"July": "जुलाई",
 	"June": "जुन",
 	"JWT Expiration": "JWT समाप्ति",
@@ -254,11 +249,10 @@
 	"LTR": "LTR",
 	"Made by OpenWebUI Community": "OpenWebUI समुदाय द्वारा निर्मित",
 	"Make sure to enclose them with": "उन्हें संलग्न करना सुनिश्चित करें",
-	"Manage LiteLLM Models": "LiteLLM मॉडल प्रबंधित करें",
 	"Manage Models": "मॉडल प्रबंधित करें",
 	"Manage Ollama Models": "Ollama मॉडल प्रबंधित करें",
 	"March": "मार्च",
-	"Max Tokens": "अधिकतम टोकन",
+	"Max Tokens (num_predict)": "",
 	"Maximum of 3 models can be downloaded simultaneously. Please try again later.": "अधिकतम 3 मॉडल एक साथ डाउनलोड किये जा सकते हैं। कृपया बाद में पुन: प्रयास करें।",
 	"May": "मेई",
 	"Memories accessible by LLMs will be shown here.": "एलएलएम द्वारा सुलभ यादें यहां दिखाई जाएंगी।",
@@ -273,22 +267,19 @@
 	"Model '{{modelName}}' has been successfully downloaded.": "मॉडल '{{modelName}}' सफलतापूर्वक डाउनलोड हो गया है।",
 	"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 filesystem path detected. Model shortname is required for update, cannot continue.": "मॉडल फ़ाइल सिस्टम पथ का पता चला. अद्यतन के लिए मॉडल संक्षिप्त नाम आवश्यक है, जारी नहीं रखा जा सकता।",
-	"Model Name": "मॉडल नाम",
+	"Model ID": "",
 	"Model not selected": "मॉडल चयनित नहीं है",
-	"Model Tag Name": "मॉडल टैग नाम",
+	"Model Params": "",
 	"Model Whitelisting": "मॉडल श्वेतसूचीकरण करें",
 	"Model(s) Whitelisted": "मॉडल श्वेतसूची में है",
-	"Modelfile": "मॉडल फ़ाइल",
-	"Modelfile Advanced Settings": "मॉडल फ़ाइल उन्नत सेटिंग्स",
 	"Modelfile Content": "मॉडल फ़ाइल सामग्री",
-	"Modelfiles": "मॉडल फ़ाइलें",
 	"Models": "सभी मॉडल",
 	"More": "और..",
 	"Name": "नाम",
 	"Name Tag": "नाम टैग",
-	"Name your modelfile": "अपनी मॉडलफ़ाइल को नाम दें",
+	"Name your model": "",
 	"New Chat": "नई चैट",
 	"New Password": "नया पासवर्ड",
 	"No results found": "कोई परिणाम नहीं मिला",
@@ -296,8 +287,6 @@
 	"No search results found": "",
 	"No source available": "कोई स्रोत उपलब्ध नहीं है",
 	"Not factually correct": "तथ्यात्मक रूप से सही नहीं है",
-	"Not sure what to add?": "निश्चित नहीं कि क्या जोड़ें?",
-	"Not sure what to write? Switch to": "मैं आश्वस्त नहीं हूं कि क्या लिखना है? स्विच करें",
 	"Note: If you set a minimum score, the search will only return documents with a score greater than or equal to the minimum score.": "ध्यान दें: यदि आप न्यूनतम स्कोर निर्धारित करते हैं, तो खोज केवल न्यूनतम स्कोर से अधिक या उसके बराबर स्कोर वाले दस्तावेज़ वापस लाएगी।",
 	"Notifications": "सूचनाएं",
 	"November": "नवंबर",
@@ -326,7 +315,6 @@
 	"or": "या",
 	"Other": "अन्य",
 	"Overview": "अवलोकन",
-	"Parameters": "पैरामीटर",
 	"Password": "पासवर्ड",
 	"PDF document (.pdf)": "PDF दस्तावेज़ (.pdf)",
 	"PDF Extract Images (OCR)": "PDF छवियाँ निकालें (OCR)",
@@ -346,10 +334,8 @@
 	"Prompts": "प्रॉम्प्ट",
 	"Pull \"{{searchValue}}\" from Ollama.com": "\"{{searchValue}}\" को Ollama.com से खींचें",
 	"Pull a model from Ollama.com": "Ollama.com से एक मॉडल खींचें",
-	"Pull Progress": "प्रगति खींचें",
 	"Query Params": "क्वेरी पैरामीटर",
 	"RAG Template": "RAG टेम्पलेट",
-	"Raw Format": "कच्चा प्रारूप",
 	"Read Aloud": "जोर से पढ़ें",
 	"Record voice": "आवाज रिकॉर्ड करना",
 	"Redirecting you to OpenWebUI Community": "आपको OpenWebUI समुदाय पर पुनर्निर्देशित किया जा रहा है",
@@ -360,7 +346,6 @@
 	"Remove Model": "मोडेल हटाएँ",
 	"Rename": "नाम बदलें",
 	"Repeat Last N": "अंतिम N दोहराएँ",
-	"Repeat Penalty": "पुन: दंड",
 	"Request Mode": "अनुरोध मोड",
 	"Reranking Model": "रीरैकिंग मोड",
 	"Reranking model disabled": "पुनर्रैंकिंग मॉडल अक्षम किया गया",
@@ -387,10 +372,12 @@
 	"See readme.md for instructions": "निर्देशों के लिए readme.md देखें",
 	"See what's new": "देखें, क्या नया है",
 	"Seed": "सीड्\u200c",
+	"Select a base model": "",
 	"Select a mode": "एक मोड चुनें",
 	"Select a model": "एक मॉडल चुनें",
 	"Select an Ollama instance": "एक Ollama Instance चुनें",
 	"Select model": "मॉडल चुनें",
+	"Selected model(s) do not support image inputs": "",
 	"Send": "भेज",
 	"Send a Message": "एक संदेश भेजो",
 	"Send message": "मेसेज भेजें",
@@ -412,7 +399,6 @@
 	"Share to OpenWebUI Community": "OpenWebUI समुदाय में साझा करें",
 	"short-summary": "संक्षिप्त सारांश",
 	"Show": "दिखाओ",
-	"Show Additional Params": "अतिरिक्त पैरामीटर दिखाएँ",
 	"Show shortcuts": "शॉर्टकट दिखाएँ",
 	"Showcased creativity": "रचनात्मकता का प्रदर्शन किया",
 	"sidebar": "साइड बार",
@@ -431,7 +417,6 @@
 	"Success": "संपन्न",
 	"Successfully updated.": "सफलतापूर्वक उत्परिवर्तित।",
 	"Suggested": "सुझावी",
-	"Sync All": "सभी को सिंक करें",
 	"System": "सिस्टम",
 	"System Prompt": "सिस्टम प्रॉम्प्ट",
 	"Tags": "टैग",
@@ -502,6 +487,7 @@
 	"Write a summary in 50 words that summarizes [topic or keyword].": "50 शब्दों में एक सारांश लिखें जो [विषय या कीवर्ड] का सारांश प्रस्तुत करता हो।",
 	"Yesterday": "कल",
 	"You": "आप",
+	"You cannot clone a base model": "",
 	"You have no archived conversations.": "आपको कोई अंकित चैट नहीं है।",
 	"You have shared this chat": "आपने इस चैट को शेयर किया है",
 	"You're a helpful assistant.": "आप एक सहायक सहायक हैं",

+ 23 - 37
src/lib/i18n/locales/hr-HR/translation.json

@@ -3,6 +3,8 @@
 	"(Beta)": "(Beta)",
 	"(e.g. `sh webui.sh --api`)": "(npr. `sh webui.sh --api`)",
 	"(latest)": "(najnovije)",
+	"{{ models }}": "",
+	"{{ owner }}: You cannot delete a base model": "",
 	"{{modelName}} is thinking...": "{{modelName}} razmišlja...",
 	"{{user}}'s Chats": "Razgovori korisnika {{user}}",
 	"{{webUIName}} Backend Required": "{{webUIName}} Backend je potreban",
@@ -12,9 +14,8 @@
 	"Account": "Račun",
 	"Accurate information": "Točne informacije",
 	"Add": "Dodaj",
-	"Add a model": "Dodaj model",
-	"Add a model tag name": "Dodaj oznaku modela",
-	"Add a short description about what this modelfile does": "Dodajte kratak opis što ova datoteka modela radi",
+	"Add a model id": "",
+	"Add a short description about what this model does": "",
 	"Add a short title for this prompt": "Dodajte kratki naslov za ovaj prompt",
 	"Add a tag": "Dodaj oznaku",
 	"Add custom prompt": "Dodaj prilagođeni prompt",
@@ -30,6 +31,7 @@
 	"Admin Panel": "Administratorska ploča",
 	"Admin Settings": "Administratorske postavke",
 	"Advanced Parameters": "Napredni parametri",
+	"Advanced Params": "",
 	"all": "sve",
 	"All Documents": "Svi dokumenti",
 	"All Users": "Svi korisnici",
@@ -44,7 +46,6 @@
 	"API Key": "API ključ",
 	"API Key created.": "API ključ je stvoren.",
 	"API keys": "API ključevi",
-	"API RPM": "API RPM",
 	"April": "Travanj",
 	"Archive": "Arhiva",
 	"Archived Chats": "Arhivirani razgovori",
@@ -61,12 +62,12 @@
 	"available!": "dostupno!",
 	"Back": "Natrag",
 	"Bad Response": "Loš odgovor",
+	"Base Model (From)": "",
 	"before": "prije",
 	"Being lazy": "Biti lijen",
-	"Builder Mode": "Način graditelja",
 	"Bypass SSL verification for Websites": "Zaobiđi SSL provjeru za web stranice",
 	"Cancel": "Otkaži",
-	"Categories": "Kategorije",
+	"Capabilities": "",
 	"Change Password": "Promijeni lozinku",
 	"Chat": "Razgovor",
 	"Chat Bubble UI": "Razgovor - Bubble UI",
@@ -84,7 +85,6 @@
 	"Citation": "Citiranje",
 	"Click here for help.": "Kliknite ovdje za pomoć.",
 	"Click here to": "Kliknite ovdje za",
-	"Click here to check other modelfiles.": "Kliknite ovdje da provjerite druge datoteke modela.",
 	"Click here to select": "Kliknite ovdje za odabir",
 	"Click here to select a csv file.": "Kliknite ovdje da odaberete csv datoteku.",
 	"Click here to select documents.": "Kliknite ovdje da odaberete dokumente.",
@@ -109,7 +109,7 @@
 	"Copy Link": "Kopiraj vezu",
 	"Copying to clipboard was successful!": "Kopiranje u međuspremnik je uspješno!",
 	"Create a concise, 3-5 word phrase as a header for the following query, strictly adhering to the 3-5 word limit and avoiding the use of the word 'title':": "Stvorite sažetu frazu od 3-5 riječi kao naslov za sljedeći upit, strogo se pridržavajući ograničenja od 3-5 riječi i izbjegavajući upotrebu riječi 'naslov':",
-	"Create a modelfile": "Stvorite datoteku modela",
+	"Create a model": "",
 	"Create Account": "Stvori račun",
 	"Create new key": "Stvori novi ključ",
 	"Create new secret key": "Stvori novi tajni ključ",
@@ -118,7 +118,7 @@
 	"Current Model": "Trenutni model",
 	"Current Password": "Trenutna lozinka",
 	"Custom": "Prilagođeno",
-	"Customize Ollama models for a specific purpose": "Prilagodite Ollama modele za specifičnu svrhu",
+	"Customize models for a specific purpose": "",
 	"Dark": "Tamno",
 	"Dashboard": "Nadzorna ploča",
 	"Database": "Baza podataka",
@@ -139,11 +139,11 @@
 	"delete this link": "izbriši ovu vezu",
 	"Delete User": "Izbriši korisnika",
 	"Deleted {{deleteModelTag}}": "Izbrisan {{deleteModelTag}}",
-	"Deleted {{tagName}}": "Izbrisan {{tagName}}",
+	"Deleted {{name}}": "",
 	"Description": "Opis",
 	"Didn't fully follow instructions": "Nije u potpunosti slijedio upute",
 	"Disabled": "Onemogućeno",
-	"Discover a modelfile": "Otkrijte datoteku modela",
+	"Discover a model": "",
 	"Discover a prompt": "Otkrijte prompt",
 	"Discover, download, and explore custom prompts": "Otkrijte, preuzmite i istražite prilagođene prompte",
 	"Discover, download, and explore model presets": "Otkrijte, preuzmite i istražite unaprijed postavljene modele",
@@ -177,11 +177,6 @@
 	"Enter Chunk Size": "Unesite veličinu dijela",
 	"Enter Image Size (e.g. 512x512)": "Unesite veličinu slike (npr. 512x512)",
 	"Enter language codes": "Unesite kodove jezika",
-	"Enter LiteLLM API Base URL (litellm_params.api_base)": "Unesite osnovni URL LiteLLM API-ja (litellm_params.api_base)",
-	"Enter LiteLLM API Key (litellm_params.api_key)": "Unesite ključ LiteLLM API-ja (litellm_params.api_key)",
-	"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 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",
@@ -197,7 +192,7 @@
 	"Export All Chats (All Users)": "Izvoz svih razgovora (svi korisnici)",
 	"Export Chats": "Izvoz razgovora",
 	"Export Documents Mapping": "Izvoz mapiranja dokumenata",
-	"Export Modelfiles": "Izvoz datoteka modela",
+	"Export Models": "",
 	"Export Prompts": "Izvoz prompta",
 	"Failed to create API Key.": "Neuspješno stvaranje API ključa.",
 	"Failed to read clipboard contents": "Neuspješno čitanje sadržaja međuspremnika",
@@ -210,7 +205,7 @@
 	"Focus chat input": "Fokusiraj unos razgovora",
 	"Followed instructions perfectly": "Savršeno slijedio upute",
 	"Format your variables using square brackets like this:": "Formatirajte svoje varijable pomoću uglatih zagrada ovako:",
-	"From (Base Model)": "Od (osnovni model)",
+	"Frequencey Penalty": "",
 	"Full Screen Mode": "Način cijelog zaslona",
 	"General": "Općenito",
 	"General Settings": "Opće postavke",
@@ -222,7 +217,6 @@
 	"Hello, {{name}}": "Bok, {{name}}",
 	"Help": "Pomoć",
 	"Hide": "Sakrij",
-	"Hide Additional Params": "Sakrij dodatne parametre",
 	"How can I help you today?": "Kako vam mogu pomoći danas?",
 	"Hybrid Search": "Hibridna pretraga",
 	"Image Generation (Experimental)": "Generiranje slika (eksperimentalno)",
@@ -231,7 +225,7 @@
 	"Images": "Slike",
 	"Import Chats": "Uvoz razgovora",
 	"Import Documents Mapping": "Uvoz mapiranja dokumenata",
-	"Import Modelfiles": "Uvoz datoteka modela",
+	"Import Models": "",
 	"Import Prompts": "Uvoz prompta",
 	"Include `--api` flag when running stable-diffusion-webui": "Uključite zastavicu `--api` prilikom pokretanja stable-diffusion-webui",
 	"Input commands": "Unos naredbi",
@@ -240,6 +234,7 @@
 	"January": "Siječanj",
 	"join our Discord for help.": "pridružite se našem Discordu za pomoć.",
 	"JSON": "JSON",
+	"JSON Preview": "",
 	"July": "Srpanj",
 	"June": "Lipanj",
 	"JWT Expiration": "Isticanje JWT-a",
@@ -254,11 +249,10 @@
 	"LTR": "LTR",
 	"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 Models": "Upravljanje modelima",
 	"Manage Ollama Models": "Upravljanje Ollama modelima",
 	"March": "Ožujak",
-	"Max Tokens": "Maksimalni tokeni",
+	"Max Tokens (num_predict)": "",
 	"Maximum of 3 models can be downloaded simultaneously. Please try again later.": "Maksimalno 3 modela se mogu preuzeti istovremeno. Pokušajte ponovo kasnije.",
 	"May": "Svibanj",
 	"Memories accessible by LLMs will be shown here.": "Ovdje će biti prikazana memorija kojoj mogu pristupiti LLM-ovi.",
@@ -273,22 +267,19 @@
 	"Model '{{modelName}}' has been successfully downloaded.": "Model '{{modelName}}' je uspješno preuzet.",
 	"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 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 Name": "Naziv modela",
+	"Model ID": "",
 	"Model not selected": "Model nije odabran",
-	"Model Tag Name": "Naziv oznake modela",
+	"Model Params": "",
 	"Model Whitelisting": "Bijela lista modela",
 	"Model(s) Whitelisted": "Model(i) na bijeloj listi",
-	"Modelfile": "Datoteka modela",
-	"Modelfile Advanced Settings": "Napredne postavke datoteke modela",
 	"Modelfile Content": "Sadržaj datoteke modela",
-	"Modelfiles": "Datoteke modela",
 	"Models": "Modeli",
 	"More": "Više",
 	"Name": "Ime",
 	"Name Tag": "Naziv oznake",
-	"Name your modelfile": "Nazovite svoju datoteku modela",
+	"Name your model": "",
 	"New Chat": "Novi razgovor",
 	"New Password": "Nova lozinka",
 	"No results found": "Nema rezultata",
@@ -296,8 +287,6 @@
 	"No search results found": "",
 	"No source available": "Nema dostupnog izvora",
 	"Not factually correct": "Nije činjenično točno",
-	"Not sure what to add?": "Niste sigurni što dodati?",
-	"Not sure what to write? Switch to": "Niste sigurni što napisati? Prebacite se na",
 	"Note: If you set a minimum score, the search will only return documents with a score greater than or equal to the minimum score.": "Napomena: Ako postavite minimalnu ocjenu, pretraga će vratiti samo dokumente s ocjenom većom ili jednakom minimalnoj ocjeni.",
 	"Notifications": "Obavijesti",
 	"November": "Studeni",
@@ -326,7 +315,6 @@
 	"or": "ili",
 	"Other": "Ostalo",
 	"Overview": "Pregled",
-	"Parameters": "Parametri",
 	"Password": "Lozinka",
 	"PDF document (.pdf)": "PDF dokument (.pdf)",
 	"PDF Extract Images (OCR)": "PDF izdvajanje slika (OCR)",
@@ -346,10 +334,8 @@
 	"Prompts": "Prompti",
 	"Pull \"{{searchValue}}\" from Ollama.com": "Povucite \"{{searchValue}}\" s Ollama.com",
 	"Pull a model from Ollama.com": "Povucite model s Ollama.com",
-	"Pull Progress": "Napredak povlačenja",
 	"Query Params": "Parametri upita",
 	"RAG Template": "RAG predložak",
-	"Raw Format": "Neobrađeni format",
 	"Read Aloud": "Čitaj naglas",
 	"Record voice": "Snimanje glasa",
 	"Redirecting you to OpenWebUI Community": "Preusmjeravanje na OpenWebUI zajednicu",
@@ -360,7 +346,6 @@
 	"Remove Model": "Ukloni model",
 	"Rename": "Preimenuj",
 	"Repeat Last N": "Ponovi zadnjih N",
-	"Repeat Penalty": "Kazna za ponavljanje",
 	"Request Mode": "Način zahtjeva",
 	"Reranking Model": "Model za ponovno rangiranje",
 	"Reranking model disabled": "Model za ponovno rangiranje onemogućen",
@@ -387,10 +372,12 @@
 	"See readme.md for instructions": "Pogledajte readme.md za upute",
 	"See what's new": "Pogledajte što je novo",
 	"Seed": "Sjeme",
+	"Select a base model": "",
 	"Select a mode": "Odaberite način",
 	"Select a model": "Odaberite model",
 	"Select an Ollama instance": "Odaberite Ollama instancu",
 	"Select model": "Odaberite model",
+	"Selected model(s) do not support image inputs": "",
 	"Send": "Pošalji",
 	"Send a Message": "Pošaljite poruku",
 	"Send message": "Pošalji poruku",
@@ -412,7 +399,6 @@
 	"Share to OpenWebUI Community": "Podijeli u OpenWebUI zajednici",
 	"short-summary": "kratki sažetak",
 	"Show": "Pokaži",
-	"Show Additional Params": "Pokaži dodatne parametre",
 	"Show shortcuts": "Pokaži prečace",
 	"Showcased creativity": "Prikazana kreativnost",
 	"sidebar": "bočna traka",
@@ -431,7 +417,6 @@
 	"Success": "Uspjeh",
 	"Successfully updated.": "Uspješno ažurirano.",
 	"Suggested": "Predloženo",
-	"Sync All": "Sinkroniziraj sve",
 	"System": "Sustav",
 	"System Prompt": "Sistemski prompt",
 	"Tags": "Oznake",
@@ -502,6 +487,7 @@
 	"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č].",
 	"Yesterday": "Jučer",
 	"You": "Vi",
+	"You cannot clone a base model": "",
 	"You have no archived conversations.": "Nemate arhiviranih razgovora.",
 	"You have shared this chat": "Podijelili ste ovaj razgovor",
 	"You're a helpful assistant.": "Vi ste korisni asistent.",

+ 23 - 37
src/lib/i18n/locales/it-IT/translation.json

@@ -3,6 +3,8 @@
 	"(Beta)": "(Beta)",
 	"(e.g. `sh webui.sh --api`)": "(p.e. `sh webui.sh --api`)",
 	"(latest)": "(ultima)",
+	"{{ models }}": "",
+	"{{ owner }}: You cannot delete a base model": "",
 	"{{modelName}} is thinking...": "{{modelName}} sta pensando...",
 	"{{user}}'s Chats": "{{user}} Chat",
 	"{{webUIName}} Backend Required": "{{webUIName}} Backend richiesto",
@@ -12,9 +14,8 @@
 	"Account": "Account",
 	"Accurate information": "Informazioni accurate",
 	"Add": "Aggiungi",
-	"Add a model": "Aggiungi un modello",
-	"Add a model tag name": "Aggiungi un nome tag del modello",
-	"Add a short description about what this modelfile does": "Aggiungi una breve descrizione di ciò che fa questo file modello",
+	"Add a model id": "",
+	"Add a short description about what this model does": "",
 	"Add a short title for this prompt": "Aggiungi un titolo breve per questo prompt",
 	"Add a tag": "Aggiungi un tag",
 	"Add custom prompt": "Aggiungi un prompt custom",
@@ -30,6 +31,7 @@
 	"Admin Panel": "Pannello di amministrazione",
 	"Admin Settings": "Impostazioni amministratore",
 	"Advanced Parameters": "Parametri avanzati",
+	"Advanced Params": "",
 	"all": "tutti",
 	"All Documents": "Tutti i documenti",
 	"All Users": "Tutti gli utenti",
@@ -44,7 +46,6 @@
 	"API Key": "Chiave API",
 	"API Key created.": "Chiave API creata.",
 	"API keys": "Chiavi API",
-	"API RPM": "API RPM",
 	"April": "Aprile",
 	"Archive": "Archivio",
 	"Archived Chats": "Chat archiviate",
@@ -61,12 +62,12 @@
 	"available!": "disponibile!",
 	"Back": "Indietro",
 	"Bad Response": "Risposta non valida",
+	"Base Model (From)": "",
 	"before": "prima",
 	"Being lazy": "Essere pigri",
-	"Builder Mode": "Modalità costruttore",
 	"Bypass SSL verification for Websites": "Aggira la verifica SSL per i siti web",
 	"Cancel": "Annulla",
-	"Categories": "Categorie",
+	"Capabilities": "",
 	"Change Password": "Cambia password",
 	"Chat": "Chat",
 	"Chat Bubble UI": "UI bolle chat",
@@ -84,7 +85,6 @@
 	"Citation": "Citazione",
 	"Click here for help.": "Clicca qui per aiuto.",
 	"Click here to": "Clicca qui per",
-	"Click here to check other modelfiles.": "Clicca qui per controllare altri file modello.",
 	"Click here to select": "Clicca qui per selezionare",
 	"Click here to select a csv file.": "Clicca qui per selezionare un file csv.",
 	"Click here to select documents.": "Clicca qui per selezionare i documenti.",
@@ -109,7 +109,7 @@
 	"Copy Link": "Copia link",
 	"Copying to clipboard was successful!": "Copia negli appunti riuscita!",
 	"Create a concise, 3-5 word phrase as a header for the following query, strictly adhering to the 3-5 word limit and avoiding the use of the word 'title':": "Crea una frase concisa di 3-5 parole come intestazione per la seguente query, aderendo rigorosamente al limite di 3-5 parole ed evitando l'uso della parola 'titolo':",
-	"Create a modelfile": "Crea un file modello",
+	"Create a model": "",
 	"Create Account": "Crea account",
 	"Create new key": "Crea nuova chiave",
 	"Create new secret key": "Crea nuova chiave segreta",
@@ -118,7 +118,7 @@
 	"Current Model": "Modello corrente",
 	"Current Password": "Password corrente",
 	"Custom": "Personalizzato",
-	"Customize Ollama models for a specific purpose": "Personalizza i modelli Ollama per uno scopo specifico",
+	"Customize models for a specific purpose": "",
 	"Dark": "Scuro",
 	"Dashboard": "Pannello di controllo",
 	"Database": "Database",
@@ -139,11 +139,11 @@
 	"delete this link": "elimina questo link",
 	"Delete User": "Elimina utente",
 	"Deleted {{deleteModelTag}}": "Eliminato {{deleteModelTag}}",
-	"Deleted {{tagName}}": "Eliminato {{tagName}}",
+	"Deleted {{name}}": "",
 	"Description": "Descrizione",
 	"Didn't fully follow instructions": "Non ha seguito completamente le istruzioni",
 	"Disabled": "Disabilitato",
-	"Discover a modelfile": "Scopri un file modello",
+	"Discover a model": "",
 	"Discover a prompt": "Scopri un prompt",
 	"Discover, download, and explore custom prompts": "Scopri, scarica ed esplora prompt personalizzati",
 	"Discover, download, and explore model presets": "Scopri, scarica ed esplora i preset del modello",
@@ -177,11 +177,6 @@
 	"Enter Chunk Size": "Inserisci la dimensione chunk",
 	"Enter Image Size (e.g. 512x512)": "Inserisci la dimensione dell'immagine (ad esempio 512x512)",
 	"Enter language codes": "Inserisci i codici lingua",
-	"Enter LiteLLM API Base URL (litellm_params.api_base)": "Inserisci l'URL base dell'API LiteLLM (litellm_params.api_base)",
-	"Enter LiteLLM API Key (litellm_params.api_key)": "Inserisci la chiave API LiteLLM (litellm_params.api_key)",
-	"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 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",
@@ -197,7 +192,7 @@
 	"Export All Chats (All Users)": "Esporta tutte le chat (tutti gli utenti)",
 	"Export Chats": "Esporta chat",
 	"Export Documents Mapping": "Esporta mappatura documenti",
-	"Export Modelfiles": "Esporta file modello",
+	"Export Models": "",
 	"Export Prompts": "Esporta prompt",
 	"Failed to create API Key.": "Impossibile creare la chiave API.",
 	"Failed to read clipboard contents": "Impossibile leggere il contenuto degli appunti",
@@ -210,7 +205,7 @@
 	"Focus chat input": "Metti a fuoco l'input della chat",
 	"Followed instructions perfectly": "Ha seguito le istruzioni alla perfezione",
 	"Format your variables using square brackets like this:": "Formatta le tue variabili usando parentesi quadre come questa:",
-	"From (Base Model)": "Da (modello base)",
+	"Frequencey Penalty": "",
 	"Full Screen Mode": "Modalità a schermo intero",
 	"General": "Generale",
 	"General Settings": "Impostazioni generali",
@@ -222,7 +217,6 @@
 	"Hello, {{name}}": "Ciao, {{name}}",
 	"Help": "Aiuto",
 	"Hide": "Nascondi",
-	"Hide Additional Params": "Nascondi parametri aggiuntivi",
 	"How can I help you today?": "Come posso aiutarti oggi?",
 	"Hybrid Search": "Ricerca ibrida",
 	"Image Generation (Experimental)": "Generazione di immagini (sperimentale)",
@@ -231,7 +225,7 @@
 	"Images": "Immagini",
 	"Import Chats": "Importa chat",
 	"Import Documents Mapping": "Importa mappatura documenti",
-	"Import Modelfiles": "Importa file modello",
+	"Import Models": "",
 	"Import Prompts": "Importa prompt",
 	"Include `--api` flag when running stable-diffusion-webui": "Includi il flag `--api` quando esegui stable-diffusion-webui",
 	"Input commands": "Comandi di input",
@@ -240,6 +234,7 @@
 	"January": "Gennaio",
 	"join our Discord for help.": "unisciti al nostro Discord per ricevere aiuto.",
 	"JSON": "JSON",
+	"JSON Preview": "",
 	"July": "Luglio",
 	"June": "Giugno",
 	"JWT Expiration": "Scadenza JWT",
@@ -254,11 +249,10 @@
 	"LTR": "LTR",
 	"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 Models": "Gestisci modelli",
 	"Manage Ollama Models": "Gestisci modelli Ollama",
 	"March": "Marzo",
-	"Max Tokens": "Max token",
+	"Max Tokens (num_predict)": "",
 	"Maximum of 3 models can be downloaded simultaneously. Please try again later.": "È possibile scaricare un massimo di 3 modelli contemporaneamente. Riprova più tardi.",
 	"May": "Maggio",
 	"Memories accessible by LLMs will be shown here.": "I memori accessibili ai LLM saranno mostrati qui.",
@@ -273,22 +267,19 @@
 	"Model '{{modelName}}' has been successfully downloaded.": "Il modello '{{modelName}}' è stato scaricato con successo.",
 	"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 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 Name": "Nome modello",
+	"Model ID": "",
 	"Model not selected": "Modello non selezionato",
-	"Model Tag Name": "Nome tag del modello",
+	"Model Params": "",
 	"Model Whitelisting": "Whitelisting del modello",
 	"Model(s) Whitelisted": "Modello/i in whitelist",
-	"Modelfile": "File modello",
-	"Modelfile Advanced Settings": "Impostazioni avanzate del file modello",
 	"Modelfile Content": "Contenuto del file modello",
-	"Modelfiles": "File modello",
 	"Models": "Modelli",
 	"More": "Altro",
 	"Name": "Nome",
 	"Name Tag": "Nome tag",
-	"Name your modelfile": "Assegna un nome al tuo file modello",
+	"Name your model": "",
 	"New Chat": "Nuova chat",
 	"New Password": "Nuova password",
 	"No results found": "Nessun risultato trovato",
@@ -296,8 +287,6 @@
 	"No search results found": "",
 	"No source available": "Nessuna fonte disponibile",
 	"Not factually correct": "Non corretto dal punto di vista fattuale",
-	"Not sure what to add?": "Non sei sicuro di cosa aggiungere?",
-	"Not sure what to write? Switch to": "Non sei sicuro di cosa scrivere? Passa a",
 	"Note: If you set a minimum score, the search will only return documents with a score greater than or equal to the minimum score.": "Nota: se imposti un punteggio minimo, la ricerca restituirà solo i documenti con un punteggio maggiore o uguale al punteggio minimo.",
 	"Notifications": "Notifiche desktop",
 	"November": "Novembre",
@@ -326,7 +315,6 @@
 	"or": "o",
 	"Other": "Altro",
 	"Overview": "Panoramica",
-	"Parameters": "Parametri",
 	"Password": "Password",
 	"PDF document (.pdf)": "Documento PDF (.pdf)",
 	"PDF Extract Images (OCR)": "Estrazione immagini PDF (OCR)",
@@ -346,10 +334,8 @@
 	"Prompts": "Prompt",
 	"Pull \"{{searchValue}}\" from Ollama.com": "Estrai \"{{searchValue}}\" da Ollama.com",
 	"Pull a model from Ollama.com": "Estrai un modello da Ollama.com",
-	"Pull Progress": "Avanzamento estrazione",
 	"Query Params": "Parametri query",
 	"RAG Template": "Modello RAG",
-	"Raw Format": "Formato raw",
 	"Read Aloud": "Leggi ad alta voce",
 	"Record voice": "Registra voce",
 	"Redirecting you to OpenWebUI Community": "Reindirizzamento alla comunità OpenWebUI",
@@ -360,7 +346,6 @@
 	"Remove Model": "Rimuovi modello",
 	"Rename": "Rinomina",
 	"Repeat Last N": "Ripeti ultimi N",
-	"Repeat Penalty": "Penalità di ripetizione",
 	"Request Mode": "Modalità richiesta",
 	"Reranking Model": "Modello di riclassificazione",
 	"Reranking model disabled": "Modello di riclassificazione disabilitato",
@@ -387,10 +372,12 @@
 	"See readme.md for instructions": "Vedi readme.md per le istruzioni",
 	"See what's new": "Guarda le novità",
 	"Seed": "Seme",
+	"Select a base model": "",
 	"Select a mode": "Seleziona una modalità",
 	"Select a model": "Seleziona un modello",
 	"Select an Ollama instance": "Seleziona un'istanza Ollama",
 	"Select model": "Seleziona modello",
+	"Selected model(s) do not support image inputs": "",
 	"Send": "Invia",
 	"Send a Message": "Invia un messaggio",
 	"Send message": "Invia messaggio",
@@ -412,7 +399,6 @@
 	"Share to OpenWebUI Community": "Condividi con la comunità OpenWebUI",
 	"short-summary": "riassunto-breve",
 	"Show": "Mostra",
-	"Show Additional Params": "Mostra parametri aggiuntivi",
 	"Show shortcuts": "Mostra",
 	"Showcased creativity": "Creatività messa in mostra",
 	"sidebar": "barra laterale",
@@ -431,7 +417,6 @@
 	"Success": "Successo",
 	"Successfully updated.": "Aggiornato con successo.",
 	"Suggested": "Suggerito",
-	"Sync All": "Sincronizza tutto",
 	"System": "Sistema",
 	"System Prompt": "Prompt di sistema",
 	"Tags": "Tag",
@@ -502,6 +487,7 @@
 	"Write a summary in 50 words that summarizes [topic or keyword].": "Scrivi un riassunto in 50 parole che riassume [argomento o parola chiave].",
 	"Yesterday": "Ieri",
 	"You": "Tu",
+	"You cannot clone a base model": "",
 	"You have no archived conversations.": "Non hai conversazioni archiviate.",
 	"You have shared this chat": "Hai condiviso questa chat",
 	"You're a helpful assistant.": "Sei un assistente utile.",

+ 23 - 37
src/lib/i18n/locales/ja-JP/translation.json

@@ -3,6 +3,8 @@
 	"(Beta)": "(ベータ版)",
 	"(e.g. `sh webui.sh --api`)": "(例: `sh webui.sh --api`)",
 	"(latest)": "(最新)",
+	"{{ models }}": "",
+	"{{ owner }}: You cannot delete a base model": "",
 	"{{modelName}} is thinking...": "{{modelName}} は思考中です...",
 	"{{user}}'s Chats": "{{user}} のチャット",
 	"{{webUIName}} Backend Required": "{{webUIName}} バックエンドが必要です",
@@ -12,9 +14,8 @@
 	"Account": "アカウント",
 	"Accurate information": "情報の正確性",
 	"Add": "追加",
-	"Add a model": "モデルを追加",
-	"Add a model tag name": "モデルタグ名を追加",
-	"Add a short description about what this modelfile does": "このモデルファイルの機能に関する簡単な説明を追加",
+	"Add a model id": "",
+	"Add a short description about what this model does": "",
 	"Add a short title for this prompt": "このプロンプトの短いタイトルを追加",
 	"Add a tag": "タグを追加",
 	"Add custom prompt": "カスタムプロンプトを追加",
@@ -30,6 +31,7 @@
 	"Admin Panel": "管理者パネル",
 	"Admin Settings": "管理者設定",
 	"Advanced Parameters": "詳細パラメーター",
+	"Advanced Params": "",
 	"all": "すべて",
 	"All Documents": "全てのドキュメント",
 	"All Users": "すべてのユーザー",
@@ -44,7 +46,6 @@
 	"API Key": "API キー",
 	"API Key created.": "API キーが作成されました。",
 	"API keys": "API キー",
-	"API RPM": "API RPM",
 	"April": "4月",
 	"Archive": "アーカイブ",
 	"Archived Chats": "チャット記録",
@@ -61,12 +62,12 @@
 	"available!": "利用可能!",
 	"Back": "戻る",
 	"Bad Response": "応答が悪い",
+	"Base Model (From)": "",
 	"before": "より前",
 	"Being lazy": "怠惰な",
-	"Builder Mode": "ビルダーモード",
 	"Bypass SSL verification for Websites": "SSL 検証をバイパスする",
 	"Cancel": "キャンセル",
-	"Categories": "カテゴリ",
+	"Capabilities": "",
 	"Change Password": "パスワードを変更",
 	"Chat": "チャット",
 	"Chat Bubble UI": "チャットバブルUI",
@@ -84,7 +85,6 @@
 	"Citation": "引用文",
 	"Click here for help.": "ヘルプについてはここをクリックしてください。",
 	"Click here to": "ここをクリックして",
-	"Click here to check other modelfiles.": "他のモデルファイルを確認するにはここをクリックしてください。",
 	"Click here to select": "選択するにはここをクリックしてください",
 	"Click here to select a csv file.": "CSVファイルを選択するにはここをクリックしてください。",
 	"Click here to select documents.": "ドキュメントを選択するにはここをクリックしてください。",
@@ -109,7 +109,7 @@
 	"Copy Link": "リンクをコピー",
 	"Copying to clipboard was successful!": "クリップボードへのコピーが成功しました!",
 	"Create a concise, 3-5 word phrase as a header for the following query, strictly adhering to the 3-5 word limit and avoiding the use of the word 'title':": "次のクエリの見出しとして、3〜5語の簡潔なフレーズを作成してください。3〜5語の制限を厳守し、「タイトル」という単語の使用を避けてください。",
-	"Create a modelfile": "モデルファイルを作成",
+	"Create a model": "",
 	"Create Account": "アカウントを作成",
 	"Create new key": "新しいキーを作成",
 	"Create new secret key": "新しいシークレットキーを作成",
@@ -118,7 +118,7 @@
 	"Current Model": "現在のモデル",
 	"Current Password": "現在のパスワード",
 	"Custom": "カスタム",
-	"Customize Ollama models for a specific purpose": "特定の目的に合わせて Ollama モデルをカスタマイズ",
+	"Customize models for a specific purpose": "",
 	"Dark": "ダーク",
 	"Dashboard": "ダッシュボード",
 	"Database": "データベース",
@@ -139,11 +139,11 @@
 	"delete this link": "このリンクを削除します",
 	"Delete User": "ユーザーを削除",
 	"Deleted {{deleteModelTag}}": "{{deleteModelTag}} を削除しました",
-	"Deleted {{tagName}}": "{{tagName}} を削除しました",
+	"Deleted {{name}}": "",
 	"Description": "説明",
 	"Didn't fully follow instructions": "説明に沿って操作していませんでした",
 	"Disabled": "無効",
-	"Discover a modelfile": "モデルファイルを見つける",
+	"Discover a model": "",
 	"Discover a prompt": "プロンプトを見つける",
 	"Discover, download, and explore custom prompts": "カスタムプロンプトを見つけて、ダウンロードして、探索",
 	"Discover, download, and explore model presets": "モデルプリセットを見つけて、ダウンロードして、探索",
@@ -177,11 +177,6 @@
 	"Enter Chunk Size": "チャンクサイズを入力してください",
 	"Enter Image Size (e.g. 512x512)": "画像サイズを入力してください (例: 512x512)",
 	"Enter language codes": "言語コードを入力してください",
-	"Enter LiteLLM API Base URL (litellm_params.api_base)": "LiteLLM API ベース URL を入力してください (litellm_params.api_base)",
-	"Enter LiteLLM API Key (litellm_params.api_key)": "LiteLLM API キーを入力してください (litellm_params.api_key)",
-	"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 tag (e.g. {{modelTag}})": "モデルタグを入力してください (例: {{modelTag}})",
 	"Enter Number of Steps (e.g. 50)": "ステップ数を入力してください (例: 50)",
 	"Enter Score": "スコアを入力してください",
@@ -197,7 +192,7 @@
 	"Export All Chats (All Users)": "すべてのチャットをエクスポート (すべてのユーザー)",
 	"Export Chats": "チャットをエクスポート",
 	"Export Documents Mapping": "ドキュメントマッピングをエクスポート",
-	"Export Modelfiles": "モデルファイルをエクスポート",
+	"Export Models": "",
 	"Export Prompts": "プロンプトをエクスポート",
 	"Failed to create API Key.": "APIキーの作成に失敗しました。",
 	"Failed to read clipboard contents": "クリップボードの内容を読み取れませんでした",
@@ -210,7 +205,7 @@
 	"Focus chat input": "チャット入力をフォーカス",
 	"Followed instructions perfectly": "完全に指示に従った",
 	"Format your variables using square brackets like this:": "次のように角括弧を使用して変数をフォーマットします。",
-	"From (Base Model)": "From (ベースモデル)",
+	"Frequencey Penalty": "",
 	"Full Screen Mode": "フルスクリーンモード",
 	"General": "一般",
 	"General Settings": "一般設定",
@@ -222,7 +217,6 @@
 	"Hello, {{name}}": "こんにちは、{{name}} さん",
 	"Help": "ヘルプ",
 	"Hide": "非表示",
-	"Hide Additional Params": "追加パラメーターを非表示",
 	"How can I help you today?": "今日はどのようにお手伝いしましょうか?",
 	"Hybrid Search": "ブリッジ検索",
 	"Image Generation (Experimental)": "画像生成 (実験的)",
@@ -231,7 +225,7 @@
 	"Images": "画像",
 	"Import Chats": "チャットをインポート",
 	"Import Documents Mapping": "ドキュメントマッピングをインポート",
-	"Import Modelfiles": "モデルファイルをインポート",
+	"Import Models": "",
 	"Import Prompts": "プロンプトをインポート",
 	"Include `--api` flag when running stable-diffusion-webui": "stable-diffusion-webuiを実行する際に`--api`フラグを含める",
 	"Input commands": "入力コマンド",
@@ -240,6 +234,7 @@
 	"January": "1月",
 	"join our Discord for help.": "ヘルプについては、Discord に参加してください。",
 	"JSON": "JSON",
+	"JSON Preview": "",
 	"July": "7月",
 	"June": "6月",
 	"JWT Expiration": "JWT 有効期限",
@@ -254,11 +249,10 @@
 	"LTR": "LTR",
 	"Made by OpenWebUI Community": "OpenWebUI コミュニティによって作成",
 	"Make sure to enclose them with": "必ず次で囲んでください",
-	"Manage LiteLLM Models": "LiteLLM モデルを管理",
 	"Manage Models": "モデルを管理",
 	"Manage Ollama Models": "Ollama モデルを管理",
 	"March": "3月",
-	"Max Tokens": "最大トークン数",
+	"Max Tokens (num_predict)": "",
 	"Maximum of 3 models can be downloaded simultaneously. Please try again later.": "同時にダウンロードできるモデルは最大 3 つです。後でもう一度お試しください。",
 	"May": "5月",
 	"Memories accessible by LLMs will be shown here.": "LLM がアクセスできるメモリはここに表示されます。",
@@ -273,22 +267,19 @@
 	"Model '{{modelName}}' has been successfully downloaded.": "モデル '{{modelName}}' が正常にダウンロードされました。",
 	"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 filesystem path detected. Model shortname is required for update, cannot continue.": "モデルファイルシステムパスが検出されました。モデルの短縮名が必要です。更新できません。",
-	"Model Name": "モデル名",
+	"Model ID": "",
 	"Model not selected": "モデルが選択されていません",
-	"Model Tag Name": "モデルタグ名",
+	"Model Params": "",
 	"Model Whitelisting": "モデルホワイトリスト",
 	"Model(s) Whitelisted": "ホワイトリストに登録されたモデル",
-	"Modelfile": "モデルファイル",
-	"Modelfile Advanced Settings": "モデルファイルの詳細設定",
 	"Modelfile Content": "モデルファイルの内容",
-	"Modelfiles": "モデルファイル",
 	"Models": "モデル",
 	"More": "もっと見る",
 	"Name": "名前",
 	"Name Tag": "名前タグ",
-	"Name your modelfile": "モデルファイルに名前を付ける",
+	"Name your model": "",
 	"New Chat": "新しいチャット",
 	"New Password": "新しいパスワード",
 	"No results found": "結果が見つかりません",
@@ -296,8 +287,6 @@
 	"No search results found": "",
 	"No source available": "使用可能なソースがありません",
 	"Not factually correct": "実事上正しくない",
-	"Not sure what to add?": "何を追加すればよいかわからない?",
-	"Not sure what to write? Switch to": "何を書けばよいかわからない? 次に切り替える",
 	"Note: If you set a minimum score, the search will only return documents with a score greater than or equal to the minimum score.": "注意:最小スコアを設定した場合、検索は最小スコア以上のスコアを持つドキュメントのみを返します。",
 	"Notifications": "デスクトップ通知",
 	"November": "11月",
@@ -326,7 +315,6 @@
 	"or": "または",
 	"Other": "その他",
 	"Overview": "概要",
-	"Parameters": "パラメーター",
 	"Password": "パスワード",
 	"PDF document (.pdf)": "PDF ドキュメント (.pdf)",
 	"PDF Extract Images (OCR)": "PDF 画像抽出 (OCR)",
@@ -346,10 +334,8 @@
 	"Prompts": "プロンプト",
 	"Pull \"{{searchValue}}\" from Ollama.com": "Ollama.com から \"{{searchValue}}\" をプル",
 	"Pull a model from Ollama.com": "Ollama.com からモデルをプル",
-	"Pull Progress": "プルの進行状況",
 	"Query Params": "クエリパラメーター",
 	"RAG Template": "RAG テンプレート",
-	"Raw Format": "Raw 形式",
 	"Read Aloud": "読み上げ",
 	"Record voice": "音声を録音",
 	"Redirecting you to OpenWebUI Community": "OpenWebUI コミュニティにリダイレクトしています",
@@ -360,7 +346,6 @@
 	"Remove Model": "モデルを削除",
 	"Rename": "名前を変更",
 	"Repeat Last N": "最後の N を繰り返す",
-	"Repeat Penalty": "繰り返しペナルティ",
 	"Request Mode": "リクエストモード",
 	"Reranking Model": "モデルの再ランキング",
 	"Reranking model disabled": "再ランキングモデルが無効です",
@@ -387,10 +372,12 @@
 	"See readme.md for instructions": "手順については readme.md を参照してください",
 	"See what's new": "新機能を見る",
 	"Seed": "シード",
+	"Select a base model": "",
 	"Select a mode": "モードを選択",
 	"Select a model": "モデルを選択",
 	"Select an Ollama instance": "Ollama インスタンスを選択",
 	"Select model": "モデルを選択",
+	"Selected model(s) do not support image inputs": "",
 	"Send": "送信",
 	"Send a Message": "メッセージを送信",
 	"Send message": "メッセージを送信",
@@ -412,7 +399,6 @@
 	"Share to OpenWebUI Community": "OpenWebUI コミュニティに共有",
 	"short-summary": "short-summary",
 	"Show": "表示",
-	"Show Additional Params": "追加パラメーターを表示",
 	"Show shortcuts": "表示",
 	"Showcased creativity": "創造性を披露",
 	"sidebar": "サイドバー",
@@ -431,7 +417,6 @@
 	"Success": "成功",
 	"Successfully updated.": "正常に更新されました。",
 	"Suggested": "提案",
-	"Sync All": "すべてを同期",
 	"System": "システム",
 	"System Prompt": "システムプロンプト",
 	"Tags": "タグ",
@@ -502,6 +487,7 @@
 	"Write a summary in 50 words that summarizes [topic or keyword].": "[トピックまたはキーワード] を要約する 50 語の概要を書いてください。",
 	"Yesterday": "昨日",
 	"You": "あなた",
+	"You cannot clone a base model": "",
 	"You have no archived conversations.": "これまでにアーカイブされた会話はありません。",
 	"You have shared this chat": "このチャットを共有しました",
 	"You're a helpful assistant.": "あなたは役に立つアシスタントです。",

+ 23 - 37
src/lib/i18n/locales/ka-GE/translation.json

@@ -3,6 +3,8 @@
 	"(Beta)": "(ბეტა)",
 	"(e.g. `sh webui.sh --api`)": "(მაგ. `sh webui.sh --api`)",
 	"(latest)": "(უახლესი)",
+	"{{ models }}": "",
+	"{{ owner }}: You cannot delete a base model": "",
 	"{{modelName}} is thinking...": "{{modelName}} ფიქრობს...",
 	"{{user}}'s Chats": "{{user}}-ის ჩათები",
 	"{{webUIName}} Backend Required": "{{webUIName}} საჭიროა ბექენდი",
@@ -12,9 +14,8 @@
 	"Account": "ანგარიში",
 	"Accurate information": "დიდი ინფორმაცია",
 	"Add": "დამატება",
-	"Add a model": "მოდელის დამატება",
-	"Add a model tag name": "მოდელის ტეგის სახელის დამატება",
-	"Add a short description about what this modelfile does": "დაამატე მოკლე აღწერა იმის შესახებ, თუ რას აკეთებს ეს მოდელური ფაილი",
+	"Add a model id": "",
+	"Add a short description about what this model does": "",
 	"Add a short title for this prompt": "დაამატე მოკლე სათაური ამ მოთხოვნისთვის",
 	"Add a tag": "დაამატე ტეგი",
 	"Add custom prompt": "პირველადი მოთხოვნის დამატება",
@@ -30,6 +31,7 @@
 	"Admin Panel": "ადმინ პანელი",
 	"Admin Settings": "ადმინისტრატორის ხელსაწყოები",
 	"Advanced Parameters": "დამატებითი პარამეტრები",
+	"Advanced Params": "",
 	"all": "ყველა",
 	"All Documents": "ყველა დოკუმენტი",
 	"All Users": "ყველა მომხმარებელი",
@@ -44,7 +46,6 @@
 	"API Key": "API გასაღები",
 	"API Key created.": "API გასაღები შექმნილია.",
 	"API keys": "API გასაღები",
-	"API RPM": "API RPM",
 	"April": "აპრილი",
 	"Archive": "არქივი",
 	"Archived Chats": "ჩატის ისტორიის არქივი",
@@ -61,12 +62,12 @@
 	"available!": "ხელმისაწვდომია!",
 	"Back": "უკან",
 	"Bad Response": "ხარვეზი",
+	"Base Model (From)": "",
 	"before": "ადგილზე",
 	"Being lazy": "ჩაიტყვევა",
-	"Builder Mode": "მოდელის შექმნა",
 	"Bypass SSL verification for Websites": "SSL-ის ვერიფიკაციის გააუქმება ვებსაიტებზე",
 	"Cancel": "გაუქმება",
-	"Categories": "კატეგორიები",
+	"Capabilities": "",
 	"Change Password": "პაროლის შეცვლა",
 	"Chat": "მიმოწერა",
 	"Chat Bubble UI": "ჩატის ბულბი",
@@ -84,7 +85,6 @@
 	"Citation": "ციტატა",
 	"Click here for help.": "დახმარებისთვის, დააკლიკე აქ",
 	"Click here to": "დააკლიკე აქ",
-	"Click here to check other modelfiles.": "სხვა მოდელური ფაილების სანახავად, დააკლიკე აქ",
 	"Click here to select": "ასარჩევად, დააკლიკე აქ",
 	"Click here to select a csv file.": "ასარჩევად, დააკლიკე აქ",
 	"Click here to select documents.": "დოკუმენტების ასარჩევად, დააკლიკე აქ",
@@ -109,7 +109,7 @@
 	"Copy Link": "კოპირება",
 	"Copying to clipboard was successful!": "კლავიატურაზე კოპირება წარმატებით დასრულდა",
 	"Create a concise, 3-5 word phrase as a header for the following query, strictly adhering to the 3-5 word limit and avoiding the use of the word 'title':": "შექმენით მოკლე, 3-5 სიტყვიანი ფრაზა, როგორც სათაური თქვენი შემდეგი შეკითხვისთვის, მკაცრად დაიცავით 3-5 სიტყვის ლიმიტი და მოერიდეთ გამოიყენოთ სიტყვა „სათაური“.",
-	"Create a modelfile": "მოდელური ფაილის შექმნა",
+	"Create a model": "",
 	"Create Account": "ანგარიშის შექმნა",
 	"Create new key": "პირადი ღირებულბრის შექმნა",
 	"Create new secret key": "პირადი ღირებულბრის შექმნა",
@@ -118,7 +118,7 @@
 	"Current Model": "მიმდინარე მოდელი",
 	"Current Password": "მიმდინარე პაროლი",
 	"Custom": "საკუთარი",
-	"Customize Ollama models for a specific purpose": "Ollama მოდელების დამუშავება სპეციფიური დანიშნულებისთვის",
+	"Customize models for a specific purpose": "",
 	"Dark": "მუქი",
 	"Dashboard": "პანელი",
 	"Database": "მონაცემთა ბაზა",
@@ -139,11 +139,11 @@
 	"delete this link": "ბმულის წაშლა",
 	"Delete User": "მომხმარებლის წაშლა",
 	"Deleted {{deleteModelTag}}": "{{deleteModelTag}} წაშლილია",
-	"Deleted {{tagName}}": "{{tagName}} წაშლილია",
+	"Deleted {{name}}": "",
 	"Description": "აღწერა",
 	"Didn't fully follow instructions": "ვერ ყველა ინფორმაციისთვის ვერ ხელახლა ჩაწერე",
 	"Disabled": "გაუქმებულია",
-	"Discover a modelfile": "აღმოაჩინეთ მოდელური ფაილი",
+	"Discover a model": "",
 	"Discover a prompt": "აღმოაჩინეთ მოთხოვნა",
 	"Discover, download, and explore custom prompts": "აღმოაჩინეთ, ჩამოტვირთეთ და შეისწავლეთ მორგებული მოთხოვნები",
 	"Discover, download, and explore model presets": "აღმოაჩინეთ, ჩამოტვირთეთ და შეისწავლეთ მოდელის წინასწარ პარამეტრები",
@@ -177,11 +177,6 @@
 	"Enter Chunk Size": "შეიყვანე ბლოკის ზომა",
 	"Enter Image Size (e.g. 512x512)": "შეიყვანეთ სურათის ზომა (მაგ. 512x512)",
 	"Enter language codes": "შეიყვანეთ ენის კოდი",
-	"Enter LiteLLM API Base URL (litellm_params.api_base)": "შეიყვანეთ LiteLLM API ბაზის მისამართი (litellm_params.api_base)",
-	"Enter LiteLLM API Key (litellm_params.api_key)": "შეიყვანეთ LiteLLM API გასაღები (litellm_params.api_key)",
-	"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 tag (e.g. {{modelTag}})": "შეიყვანეთ მოდელის ტეგი (მაგ. {{modelTag}})",
 	"Enter Number of Steps (e.g. 50)": "შეიყვანეთ ნაბიჯების რაოდენობა (მაგ. 50)",
 	"Enter Score": "შეიყვანეთ ქულა",
@@ -197,7 +192,7 @@
 	"Export All Chats (All Users)": "ექსპორტი ყველა ჩათი (ყველა მომხმარებელი)",
 	"Export Chats": "მიმოწერის ექსპორტირება",
 	"Export Documents Mapping": "დოკუმენტების კავშირის ექსპორტი",
-	"Export Modelfiles": "მოდელური ფაილების ექსპორტი",
+	"Export Models": "",
 	"Export Prompts": "მოთხოვნების ექსპორტი",
 	"Failed to create API Key.": "API ღილაკის შექმნა ვერ მოხერხდა.",
 	"Failed to read clipboard contents": "ბუფერში შიგთავსის წაკითხვა ვერ მოხერხდა",
@@ -210,7 +205,7 @@
 	"Focus chat input": "ჩეთის შეყვანის ფოკუსი",
 	"Followed instructions perfectly": "ყველა ინსტრუქცია უზრუნველყოფა",
 	"Format your variables using square brackets like this:": "დააფორმატეთ თქვენი ცვლადები კვადრატული ფრჩხილების გამოყენებით:",
-	"From (Base Model)": "(საბაზო მოდელი) დან",
+	"Frequencey Penalty": "",
 	"Full Screen Mode": "Სრული ეკრანის რეჟიმი",
 	"General": "ზოგადი",
 	"General Settings": "ზოგადი პარამეტრები",
@@ -222,7 +217,6 @@
 	"Hello, {{name}}": "გამარჯობა, {{name}}",
 	"Help": "დახმარება",
 	"Hide": "დამალვა",
-	"Hide Additional Params": "დამატებითი პარამეტრების დამალვა",
 	"How can I help you today?": "როგორ შემიძლია დაგეხმარო დღეს?",
 	"Hybrid Search": "ჰიბრიდური ძებნა",
 	"Image Generation (Experimental)": "სურათების გენერაცია (ექსპერიმენტული)",
@@ -231,7 +225,7 @@
 	"Images": "სურათები",
 	"Import Chats": "მიმოწერების იმპორტი",
 	"Import Documents Mapping": "დოკუმენტების კავშირის იმპორტი",
-	"Import Modelfiles": "მოდელური ფაილების იმპორტი",
+	"Import Models": "",
 	"Import Prompts": "მოთხოვნების იმპორტი",
 	"Include `--api` flag when running stable-diffusion-webui": "ჩართეთ `--api` დროშა stable-diffusion-webui-ის გაშვებისას",
 	"Input commands": "შეყვანით ბრძანებებს",
@@ -240,6 +234,7 @@
 	"January": "იანვარი",
 	"join our Discord for help.": "შეუერთდით ჩვენს Discord-ს დახმარებისთვის",
 	"JSON": "JSON",
+	"JSON Preview": "",
 	"July": "ივნისი",
 	"June": "ივლა",
 	"JWT Expiration": "JWT-ის ვადა",
@@ -254,11 +249,10 @@
 	"LTR": "LTR",
 	"Made by OpenWebUI Community": "დამზადებულია OpenWebUI საზოგადოების მიერ",
 	"Make sure to enclose them with": "დარწმუნდით, რომ დაურთეთ ისინი",
-	"Manage LiteLLM Models": "LiteLLM მოდელების მართვა",
 	"Manage Models": "მოდელების მართვა",
 	"Manage Ollama Models": "Ollama მოდელების მართვა",
 	"March": "მარტივი",
-	"Max Tokens": "მაქსიმალური ტოკენები",
+	"Max Tokens (num_predict)": "",
 	"Maximum of 3 models can be downloaded simultaneously. Please try again later.": "მაქსიმუმ 3 მოდელის ჩამოტვირთვა შესაძლებელია ერთდროულად. Გთხოვთ სცადოთ მოგვიანებით.",
 	"May": "მაი",
 	"Memories accessible by LLMs will be shown here.": "ლლმ-ს აქვს ხელმისაწვდომი მემორიები აქ იქნება.",
@@ -273,22 +267,19 @@
 	"Model '{{modelName}}' has been successfully downloaded.": "მოდელი „{{modelName}}“ წარმატებით ჩამოიტვირთა.",
 	"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 filesystem path detected. Model shortname is required for update, cannot continue.": "აღმოჩენილია მოდელის ფაილური სისტემის გზა. განახლებისთვის საჭიროა მოდელის მოკლე სახელი, გაგრძელება შეუძლებელია.",
-	"Model Name": "მოდელის სახელი",
+	"Model ID": "",
 	"Model not selected": "მოდელი არ არის არჩეული",
-	"Model Tag Name": "მოდელის ტეგის სახელი",
+	"Model Params": "",
 	"Model Whitelisting": "მოდელის თეთრ სიაში შეყვანა",
 	"Model(s) Whitelisted": "მოდელ(ებ)ი თეთრ სიაშია",
-	"Modelfile": "მოდელური ფაილი",
-	"Modelfile Advanced Settings": "მოდელური ფაილის პარამეტრები",
 	"Modelfile Content": "მოდელური ფაილის კონტენტი",
-	"Modelfiles": "მოდელური ფაილები",
 	"Models": "მოდელები",
 	"More": "ვრცლად",
 	"Name": "სახელი",
 	"Name Tag": "სახელის ტეგი",
-	"Name your modelfile": "თქვენი მოდელური ფაილის სახელი",
+	"Name your model": "",
 	"New Chat": "ახალი მიმოწერა",
 	"New Password": "ახალი პაროლი",
 	"No results found": "ჩვენ ვერ პოულობით ნაპოვნი ჩაწერები",
@@ -296,8 +287,6 @@
 	"No search results found": "",
 	"No source available": "წყარო არ არის ხელმისაწვდომი",
 	"Not factually correct": "არ ვეთანხმები პირდაპირ ვერც ვეთანხმები",
-	"Not sure what to add?": "არ იცი რა დაამატო?",
-	"Not sure what to write? Switch to": "არ იცით რა დაწეროთ? გადადით:",
 	"Note: If you set a minimum score, the search will only return documents with a score greater than or equal to the minimum score.": "შენიშვნა: თუ თქვენ დააყენებთ მინიმალურ ქულას, ძებნა დააბრუნებს მხოლოდ დოკუმენტებს მინიმალური ქულის მეტი ან ტოლი ქულით.",
 	"Notifications": "შეტყობინება",
 	"November": "ნოემბერი",
@@ -326,7 +315,6 @@
 	"or": "ან",
 	"Other": "სხვა",
 	"Overview": "ოვერვიუ",
-	"Parameters": "პარამეტრები",
 	"Password": "პაროლი",
 	"PDF document (.pdf)": "PDF დოკუმენტი (.pdf)",
 	"PDF Extract Images (OCR)": "PDF იდან ამოღებული სურათები (OCR)",
@@ -346,10 +334,8 @@
 	"Prompts": "მოთხოვნები",
 	"Pull \"{{searchValue}}\" from Ollama.com": "ჩაიამოვეთ \"{{searchValue}}\" Ollama.com-იდან",
 	"Pull a model from Ollama.com": "Ollama.com იდან მოდელის გადაწერა ",
-	"Pull Progress": "პროგრესის გადაწერა",
 	"Query Params": "პარამეტრების ძიება",
 	"RAG Template": "RAG შაბლონი",
-	"Raw Format": "საწყისი ფორმატი",
 	"Read Aloud": "ხმის ჩაწერა",
 	"Record voice": "ხმის ჩაწერა",
 	"Redirecting you to OpenWebUI Community": "გადამისამართდებით OpenWebUI საზოგადოებაში",
@@ -360,7 +346,6 @@
 	"Remove Model": "პოპულარობის რაოდენობა",
 	"Rename": "პოპულარობის რაოდენობა",
 	"Repeat Last N": "გაიმეორეთ ბოლო N",
-	"Repeat Penalty": "გაიმეორეთ პენალტი",
 	"Request Mode": "მოთხოვნის რეჟიმი",
 	"Reranking Model": "რექვექტირება",
 	"Reranking model disabled": "რექვექტირება არაა ჩართული",
@@ -387,10 +372,12 @@
 	"See readme.md for instructions": "იხილეთ readme.md ინსტრუქციებისთვის",
 	"See what's new": "სიახლეების ნახვა",
 	"Seed": "სიდი",
+	"Select a base model": "",
 	"Select a mode": "რეჟიმის არჩევა",
 	"Select a model": "მოდელის არჩევა",
 	"Select an Ollama instance": "Ollama ინსტანსის არჩევა",
 	"Select model": "მოდელის არჩევა",
+	"Selected model(s) do not support image inputs": "",
 	"Send": "გაგზავნა",
 	"Send a Message": "შეტყობინების გაგზავნა",
 	"Send message": "შეტყობინების გაგზავნა",
@@ -412,7 +399,6 @@
 	"Share to OpenWebUI Community": "გააზიარე OpenWebUI საზოგადოებაში ",
 	"short-summary": "მოკლე შინაარსი",
 	"Show": "ჩვენება",
-	"Show Additional Params": "დამატებითი პარამეტრების ჩვენება",
 	"Show shortcuts": "მალსახმობების ჩვენება",
 	"Showcased creativity": "ჩვენებული ქონება",
 	"sidebar": "საიდბარი",
@@ -431,7 +417,6 @@
 	"Success": "წარმატება",
 	"Successfully updated.": "წარმატებით განახლდა",
 	"Suggested": "პირდაპირ პოპულარული",
-	"Sync All": "სინქრონიზაცია",
 	"System": "სისტემა",
 	"System Prompt": "სისტემური მოთხოვნა",
 	"Tags": "ტეგები",
@@ -502,6 +487,7 @@
 	"Write a summary in 50 words that summarizes [topic or keyword].": "დაწერეთ რეზიუმე 50 სიტყვით, რომელიც აჯამებს [თემას ან საკვანძო სიტყვას].",
 	"Yesterday": "აღდგენა",
 	"You": "ჩემი",
+	"You cannot clone a base model": "",
 	"You have no archived conversations.": "არ ხართ არქივირებული განხილვები.",
 	"You have shared this chat": "ამ ჩატის გააგზავნა",
 	"You're a helpful assistant.": "თქვენ სასარგებლო ასისტენტი ხართ.",

+ 23 - 37
src/lib/i18n/locales/ko-KR/translation.json

@@ -3,6 +3,8 @@
 	"(Beta)": "(Beta)",
 	"(e.g. `sh webui.sh --api`)": "(예: `sh webui.sh --api`)",
 	"(latest)": "(latest)",
+	"{{ models }}": "",
+	"{{ owner }}: You cannot delete a base model": "",
 	"{{modelName}} is thinking...": "{{modelName}} 이(가) 생각중입니다....",
 	"{{user}}'s Chats": "{{user}}의 채팅",
 	"{{webUIName}} Backend Required": "{{webUIName}} 백엔드가 필요합니다.",
@@ -12,9 +14,8 @@
 	"Account": "계정",
 	"Accurate information": "정확한 정보",
 	"Add": "추가",
-	"Add a model": "모델 추가",
-	"Add a model tag name": "모델 태그명 추가",
-	"Add a short description about what this modelfile does": "이 모델파일이 하는 일에 대한 간단한 설명 추가",
+	"Add a model id": "",
+	"Add a short description about what this model does": "",
 	"Add a short title for this prompt": "이 프롬프트에 대한 간단한 제목 추가",
 	"Add a tag": "태그 추가",
 	"Add custom prompt": "프롬프트 추가",
@@ -30,6 +31,7 @@
 	"Admin Panel": "관리자 패널",
 	"Admin Settings": "관리자 설정",
 	"Advanced Parameters": "고급 매개변수",
+	"Advanced Params": "",
 	"all": "모두",
 	"All Documents": "모든 문서",
 	"All Users": "모든 사용자",
@@ -44,7 +46,6 @@
 	"API Key": "API키",
 	"API Key created.": "API 키가 생성되었습니다.",
 	"API keys": "API 키",
-	"API RPM": "API RPM",
 	"April": "4월",
 	"Archive": "아카이브",
 	"Archived Chats": "채팅 기록 아카이브",
@@ -61,12 +62,12 @@
 	"available!": "사용 가능!",
 	"Back": "뒤로가기",
 	"Bad Response": "응답이 좋지 않습니다.",
+	"Base Model (From)": "",
 	"before": "이전",
 	"Being lazy": "게으름 피우기",
-	"Builder Mode": "빌더 모드",
 	"Bypass SSL verification for Websites": "SSL 검증을 무시하려면 웹 사이트를 선택하세요.",
 	"Cancel": "취소",
-	"Categories": "분류",
+	"Capabilities": "",
 	"Change Password": "비밀번호 변경",
 	"Chat": "채팅",
 	"Chat Bubble UI": "채팅 버블 UI",
@@ -84,7 +85,6 @@
 	"Citation": "인용",
 	"Click here for help.": "도움말을 보려면 여기를 클릭하세요.",
 	"Click here to": "여기를 클릭하면",
-	"Click here to check other modelfiles.": "다른 모델파일을 확인하려면 여기를 클릭하세요.",
 	"Click here to select": "선택하려면 여기를 클릭하세요.",
 	"Click here to select a csv file.": "csv 파일을 선택하려면 여기를 클릭하세요.",
 	"Click here to select documents.": "문서를 선택하려면 여기를 클릭하세요.",
@@ -109,7 +109,7 @@
 	"Copy Link": "링크 복사",
 	"Copying to clipboard was successful!": "클립보드에 복사되었습니다!",
 	"Create a concise, 3-5 word phrase as a header for the following query, strictly adhering to the 3-5 word limit and avoiding the use of the word 'title':": "다음 질문에 대한 제목으로 간결한 3-5 단어 문구를 만드되 3-5 단어 제한을 엄격히 준수하고 'title' 단어 사용을 피하세요:",
-	"Create a modelfile": "모델파일 만들기",
+	"Create a model": "",
 	"Create Account": "계정 만들기",
 	"Create new key": "새 키 만들기",
 	"Create new secret key": "새 비밀 키 만들기",
@@ -118,7 +118,7 @@
 	"Current Model": "현재 모델",
 	"Current Password": "현재 비밀번호",
 	"Custom": "사용자 정의",
-	"Customize Ollama models for a specific purpose": "특정 목적으로 Ollama 모델 사용자 정의",
+	"Customize models for a specific purpose": "",
 	"Dark": "어두운",
 	"Dashboard": "대시보드",
 	"Database": "데이터베이스",
@@ -139,11 +139,11 @@
 	"delete this link": "이 링크를 삭제합니다.",
 	"Delete User": "사용자 삭제",
 	"Deleted {{deleteModelTag}}": "{{deleteModelTag}} 삭제됨",
-	"Deleted {{tagName}}": "{{tagName}} 삭제됨",
+	"Deleted {{name}}": "",
 	"Description": "설명",
 	"Didn't fully follow instructions": "완전히 지침을 따르지 않음",
 	"Disabled": "비활성화",
-	"Discover a modelfile": "모델파일 검색",
+	"Discover a model": "",
 	"Discover a prompt": "프롬프트 검색",
 	"Discover, download, and explore custom prompts": "사용자 정의 프롬프트 검색, 다운로드 및 탐색",
 	"Discover, download, and explore model presets": "모델 사전 설정 검색, 다운로드 및 탐색",
@@ -177,11 +177,6 @@
 	"Enter Chunk Size": "청크 크기 입력",
 	"Enter Image Size (e.g. 512x512)": "이미지 크기 입력(예: 512x512)",
 	"Enter language codes": "언어 코드 입력",
-	"Enter LiteLLM API Base URL (litellm_params.api_base)": "LiteLLM API 기본 URL 입력(litellm_params.api_base)",
-	"Enter LiteLLM API Key (litellm_params.api_key)": "LiteLLM API 키 입력(litellm_params.api_key)",
-	"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 tag (e.g. {{modelTag}})": "모델 태그 입력(예: {{modelTag}})",
 	"Enter Number of Steps (e.g. 50)": "단계 수 입력(예: 50)",
 	"Enter Score": "점수 입력",
@@ -197,7 +192,7 @@
 	"Export All Chats (All Users)": "모든 채팅 내보내기 (모든 사용자)",
 	"Export Chats": "채팅 내보내기",
 	"Export Documents Mapping": "문서 매핑 내보내기",
-	"Export Modelfiles": "모델파일 내보내기",
+	"Export Models": "",
 	"Export Prompts": "프롬프트 내보내기",
 	"Failed to create API Key.": "API 키 생성에 실패했습니다.",
 	"Failed to read clipboard contents": "클립보드 내용을 읽는 데 실패했습니다.",
@@ -210,7 +205,7 @@
 	"Focus chat input": "채팅 입력 포커스",
 	"Followed instructions perfectly": "명령을 완벽히 따름",
 	"Format your variables using square brackets like this:": "이렇게 대괄호를 사용하여 변수를 형식화하세요:",
-	"From (Base Model)": "출처(기본 모델)",
+	"Frequencey Penalty": "",
 	"Full Screen Mode": "전체 화면 모드",
 	"General": "일반",
 	"General Settings": "일반 설정",
@@ -222,7 +217,6 @@
 	"Hello, {{name}}": "안녕하세요, {{name}}",
 	"Help": "도움말",
 	"Hide": "숨기기",
-	"Hide Additional Params": "추가 매개변수 숨기기",
 	"How can I help you today?": "오늘 어떻게 도와드릴까요?",
 	"Hybrid Search": "혼합 검색",
 	"Image Generation (Experimental)": "이미지 생성(실험적)",
@@ -231,7 +225,7 @@
 	"Images": "이미지",
 	"Import Chats": "채팅 가져오기",
 	"Import Documents Mapping": "문서 매핑 가져오기",
-	"Import Modelfiles": "모델파일 가져오기",
+	"Import Models": "",
 	"Import Prompts": "프롬프트 가져오기",
 	"Include `--api` flag when running stable-diffusion-webui": "stable-diffusion-webui를 실행할 때 '--api' 플래그 포함",
 	"Input commands": "입력 명령",
@@ -240,6 +234,7 @@
 	"January": "1월",
 	"join our Discord for help.": "도움말을 보려면 Discord에 가입하세요.",
 	"JSON": "JSON",
+	"JSON Preview": "",
 	"July": "7월",
 	"June": "6월",
 	"JWT Expiration": "JWT 만료",
@@ -254,11 +249,10 @@
 	"LTR": "LTR",
 	"Made by OpenWebUI Community": "OpenWebUI 커뮤니티에서 제작",
 	"Make sure to enclose them with": "다음으로 묶는 것을 잊지 마세요:",
-	"Manage LiteLLM Models": "LiteLLM 모델 관리",
 	"Manage Models": "모델 관리",
 	"Manage Ollama Models": "Ollama 모델 관리",
 	"March": "3월",
-	"Max Tokens": "최대 토큰 수",
+	"Max Tokens (num_predict)": "",
 	"Maximum of 3 models can be downloaded simultaneously. Please try again later.": "최대 3개의 모델을 동시에 다운로드할 수 있습니다. 나중에 다시 시도하세요.",
 	"May": "5월",
 	"Memories accessible by LLMs will be shown here.": "LLM에서 액세스할 수 있는 메모리는 여기에 표시됩니다.",
@@ -273,22 +267,19 @@
 	"Model '{{modelName}}' has been successfully downloaded.": "모델 '{{modelName}}'이(가) 성공적으로 다운로드되었습니다.",
 	"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 filesystem path detected. Model shortname is required for update, cannot continue.": "모델 파일 시스템 경로가 감지되었습니다. 업데이트하려면 모델 단축 이름이 필요하며 계속할 수 없습니다.",
-	"Model Name": "모델 이름",
+	"Model ID": "",
 	"Model not selected": "모델이 선택되지 않았습니다.",
-	"Model Tag Name": "모델 태그 이름",
+	"Model Params": "",
 	"Model Whitelisting": "모델 허용 목록",
 	"Model(s) Whitelisted": "허용된 모델",
-	"Modelfile": "모델파일",
-	"Modelfile Advanced Settings": "모델파일 고급 설정",
 	"Modelfile Content": "모델파일 내용",
-	"Modelfiles": "모델파일",
 	"Models": "모델",
 	"More": "더보기",
 	"Name": "이름",
 	"Name Tag": "이름 태그",
-	"Name your modelfile": "모델파일 이름 지정",
+	"Name your model": "",
 	"New Chat": "새 채팅",
 	"New Password": "새 비밀번호",
 	"No results found": "결과 없음",
@@ -296,8 +287,6 @@
 	"No search results found": "",
 	"No source available": "사용 가능한 소스 없음",
 	"Not factually correct": "사실상 맞지 않음",
-	"Not sure what to add?": "추가할 것이 궁금하세요?",
-	"Not sure what to write? Switch to": "무엇을 쓸지 모르겠나요? 전환하세요.",
 	"Note: If you set a minimum score, the search will only return documents with a score greater than or equal to the minimum score.": "참고: 최소 점수를 설정하면 검색 결과는 최소 점수 이상의 점수를 가진 문서만 반환됩니다.",
 	"Notifications": "알림",
 	"November": "11월",
@@ -326,7 +315,6 @@
 	"or": "또는",
 	"Other": "기타",
 	"Overview": "개요",
-	"Parameters": "매개변수",
 	"Password": "비밀번호",
 	"PDF document (.pdf)": "PDF 문서 (.pdf)",
 	"PDF Extract Images (OCR)": "PDF에서 이미지 추출 (OCR)",
@@ -346,10 +334,8 @@
 	"Prompts": "프롬프트",
 	"Pull \"{{searchValue}}\" from Ollama.com": "Ollama.com에서 \"{{searchValue}}\" 가져오기",
 	"Pull a model from Ollama.com": "Ollama.com에서 모델 가져오기",
-	"Pull Progress": "가져오기 진행 상황",
 	"Query Params": "쿼리 매개변수",
 	"RAG Template": "RAG 템플릿",
-	"Raw Format": "Raw 형식",
 	"Read Aloud": "읽어주기",
 	"Record voice": "음성 녹음",
 	"Redirecting you to OpenWebUI Community": "OpenWebUI 커뮤니티로 리디렉션하는 중",
@@ -360,7 +346,6 @@
 	"Remove Model": "모델 삭제",
 	"Rename": "이름 변경",
 	"Repeat Last N": "마지막 N 반복",
-	"Repeat Penalty": "반복 패널티",
 	"Request Mode": "요청 모드",
 	"Reranking Model": "랭킹 모델 재설정",
 	"Reranking model disabled": "랭킹 모델 재설정 비활성화",
@@ -387,10 +372,12 @@
 	"See readme.md for instructions": "설명은 readme.md를 참조하세요.",
 	"See what's new": "새로운 기능 보기",
 	"Seed": "시드",
+	"Select a base model": "",
 	"Select a mode": "모드 선택",
 	"Select a model": "모델 선택",
 	"Select an Ollama instance": "Ollama 인스턴스 선택",
 	"Select model": "모델 선택",
+	"Selected model(s) do not support image inputs": "",
 	"Send": "보내기",
 	"Send a Message": "메시지 보내기",
 	"Send message": "메시지 보내기",
@@ -412,7 +399,6 @@
 	"Share to OpenWebUI Community": "OpenWebUI 커뮤니티에 공유",
 	"short-summary": "간단한 요약",
 	"Show": "보이기",
-	"Show Additional Params": "추가 매개변수 보기",
 	"Show shortcuts": "단축키 보기",
 	"Showcased creativity": "쇼케이스된 창의성",
 	"sidebar": "사이드바",
@@ -431,7 +417,6 @@
 	"Success": "성공",
 	"Successfully updated.": "성공적으로 업데이트되었습니다.",
 	"Suggested": "제안",
-	"Sync All": "모두 동기화",
 	"System": "시스템",
 	"System Prompt": "시스템 프롬프트",
 	"Tags": "Tags",
@@ -502,6 +487,7 @@
 	"Write a summary in 50 words that summarizes [topic or keyword].": "[주제 또는 키워드]에 대한 50단어 요약문 작성.",
 	"Yesterday": "어제",
 	"You": "당신",
+	"You cannot clone a base model": "",
 	"You have no archived conversations.": "채팅을 아카이브한 적이 없습니다.",
 	"You have shared this chat": "이 채팅을 공유했습니다.",
 	"You're a helpful assistant.": "당신은 유용한 어시스턴트입니다.",

+ 23 - 37
src/lib/i18n/locales/nl-NL/translation.json

@@ -3,6 +3,8 @@
 	"(Beta)": "(Beta)",
 	"(e.g. `sh webui.sh --api`)": "(e.g. `sh webui.sh --api`)",
 	"(latest)": "(nieuwste)",
+	"{{ models }}": "",
+	"{{ owner }}: You cannot delete a base model": "",
 	"{{modelName}} is thinking...": "{{modelName}} is aan het denken...",
 	"{{user}}'s Chats": "{{user}}'s Chats",
 	"{{webUIName}} Backend Required": "{{webUIName}} Backend Verlpicht",
@@ -12,9 +14,8 @@
 	"Account": "Account",
 	"Accurate information": "Accurate informatie",
 	"Add": "Toevoegen",
-	"Add a model": "Voeg een model toe",
-	"Add a model tag name": "Voeg een model tag naam toe",
-	"Add a short description about what this modelfile does": "Voeg een korte beschrijving toe over wat dit modelfile doet",
+	"Add a model id": "",
+	"Add a short description about what this model does": "",
 	"Add a short title for this prompt": "Voeg een korte titel toe voor deze prompt",
 	"Add a tag": "Voeg een tag toe",
 	"Add custom prompt": "Voeg een aangepaste prompt toe",
@@ -30,6 +31,7 @@
 	"Admin Panel": "Administratieve Paneel",
 	"Admin Settings": "Administratieve Settings",
 	"Advanced Parameters": "Geavanceerde Parameters",
+	"Advanced Params": "",
 	"all": "alle",
 	"All Documents": "Alle Documenten",
 	"All Users": "Alle Gebruikers",
@@ -44,7 +46,6 @@
 	"API Key": "API Key",
 	"API Key created.": "API Key gemaakt.",
 	"API keys": "API keys",
-	"API RPM": "API RPM",
 	"April": "April",
 	"Archive": "Archief",
 	"Archived Chats": "chatrecord",
@@ -61,12 +62,12 @@
 	"available!": "beschikbaar!",
 	"Back": "Terug",
 	"Bad Response": "Ongeldig antwoord",
+	"Base Model (From)": "",
 	"before": "voor",
 	"Being lazy": "Lustig zijn",
-	"Builder Mode": "Bouwer Modus",
 	"Bypass SSL verification for Websites": "SSL-verificatie omzeilen voor websites",
 	"Cancel": "Annuleren",
-	"Categories": "Categorieën",
+	"Capabilities": "",
 	"Change Password": "Wijzig Wachtwoord",
 	"Chat": "Chat",
 	"Chat Bubble UI": "Chat Bubble UI",
@@ -84,7 +85,6 @@
 	"Citation": "Citaat",
 	"Click here for help.": "Klik hier voor hulp.",
 	"Click here to": "Klik hier om",
-	"Click here to check other modelfiles.": "Klik hier om andere modelfiles te controleren.",
 	"Click here to select": "Klik hier om te selecteren",
 	"Click here to select a csv file.": "Klik hier om een csv file te selecteren.",
 	"Click here to select documents.": "Klik hier om documenten te selecteren",
@@ -109,7 +109,7 @@
 	"Copy Link": "Kopieer Link",
 	"Copying to clipboard was successful!": "Kopiëren naar klembord was succesvol!",
 	"Create a concise, 3-5 word phrase as a header for the following query, strictly adhering to the 3-5 word limit and avoiding the use of the word 'title':": "Maak een beknopte, 3-5 woorden tellende zin als kop voor de volgende query, strikt aanhoudend aan de 3-5 woorden limiet en het vermijden van het gebruik van het woord 'titel':",
-	"Create a modelfile": "Maak een modelfile",
+	"Create a model": "",
 	"Create Account": "Maak Account",
 	"Create new key": "Maak nieuwe sleutel",
 	"Create new secret key": "Maak nieuwe geheim sleutel",
@@ -118,7 +118,7 @@
 	"Current Model": "Huidig Model",
 	"Current Password": "Huidig Wachtwoord",
 	"Custom": "Aangepast",
-	"Customize Ollama models for a specific purpose": "Pas Ollama modellen aan voor een specifiek doel",
+	"Customize models for a specific purpose": "",
 	"Dark": "Donker",
 	"Dashboard": "Dashboard",
 	"Database": "Database",
@@ -139,11 +139,11 @@
 	"delete this link": "verwijder deze link",
 	"Delete User": "Verwijder Gebruiker",
 	"Deleted {{deleteModelTag}}": "{{deleteModelTag}} is verwijderd",
-	"Deleted {{tagName}}": "{{tagName}} is verwijderd",
+	"Deleted {{name}}": "",
 	"Description": "Beschrijving",
 	"Didn't fully follow instructions": "Ik heb niet alle instructies volgt",
 	"Disabled": "Uitgeschakeld",
-	"Discover a modelfile": "Ontdek een modelfile",
+	"Discover a model": "",
 	"Discover a prompt": "Ontdek een prompt",
 	"Discover, download, and explore custom prompts": "Ontdek, download en verken aangepaste prompts",
 	"Discover, download, and explore model presets": "Ontdek, download en verken model presets",
@@ -177,11 +177,6 @@
 	"Enter Chunk Size": "Voeg Chunk Size toe",
 	"Enter Image Size (e.g. 512x512)": "Voeg afbeelding formaat toe (Bijv. 512x512)",
 	"Enter language codes": "Voeg taal codes toe",
-	"Enter LiteLLM API Base URL (litellm_params.api_base)": "Voeg LiteLLM API Base URL toe (litellm_params.api_base)",
-	"Enter LiteLLM API Key (litellm_params.api_key)": "Voeg LiteLLM API Sleutel toe (litellm_params.api_key)",
-	"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 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",
@@ -197,7 +192,7 @@
 	"Export All Chats (All Users)": "Exporteer Alle Chats (Alle Gebruikers)",
 	"Export Chats": "Exporteer Chats",
 	"Export Documents Mapping": "Exporteer Documenten Mapping",
-	"Export Modelfiles": "Exporteer Modelfiles",
+	"Export Models": "",
 	"Export Prompts": "Exporteer Prompts",
 	"Failed to create API Key.": "Kan API Key niet aanmaken.",
 	"Failed to read clipboard contents": "Kan klembord inhoud niet lezen",
@@ -210,7 +205,7 @@
 	"Focus chat input": "Focus chat input",
 	"Followed instructions perfectly": "Volgde instructies perfect",
 	"Format your variables using square brackets like this:": "Formatteer je variabelen met vierkante haken zoals dit:",
-	"From (Base Model)": "Van (Basis Model)",
+	"Frequencey Penalty": "",
 	"Full Screen Mode": "Volledig Scherm Modus",
 	"General": "Algemeen",
 	"General Settings": "Algemene Instellingen",
@@ -222,7 +217,6 @@
 	"Hello, {{name}}": "Hallo, {{name}}",
 	"Help": "Help",
 	"Hide": "Verberg",
-	"Hide Additional Params": "Verberg Extra Params",
 	"How can I help you today?": "Hoe kan ik je vandaag helpen?",
 	"Hybrid Search": "Hybride Zoeken",
 	"Image Generation (Experimental)": "Afbeelding Generatie (Experimenteel)",
@@ -231,7 +225,7 @@
 	"Images": "Afbeeldingen",
 	"Import Chats": "Importeer Chats",
 	"Import Documents Mapping": "Importeer Documenten Mapping",
-	"Import Modelfiles": "Importeer Modelfiles",
+	"Import Models": "",
 	"Import Prompts": "Importeer Prompts",
 	"Include `--api` flag when running stable-diffusion-webui": "Voeg `--api` vlag toe bij het uitvoeren van stable-diffusion-webui",
 	"Input commands": "Voer commando's in",
@@ -240,6 +234,7 @@
 	"January": "Januari",
 	"join our Discord for help.": "join onze Discord voor hulp.",
 	"JSON": "JSON",
+	"JSON Preview": "",
 	"July": "Juli",
 	"June": "Juni",
 	"JWT Expiration": "JWT Expiration",
@@ -254,11 +249,10 @@
 	"LTR": "LTR",
 	"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 Models": "Beheer Modellen",
 	"Manage Ollama Models": "Beheer Ollama Modellen",
 	"March": "Maart",
-	"Max Tokens": "Max Tokens",
+	"Max Tokens (num_predict)": "",
 	"Maximum of 3 models can be downloaded simultaneously. Please try again later.": "Maximaal 3 modellen kunnen tegelijkertijd worden gedownload. Probeer het later opnieuw.",
 	"May": "Mei",
 	"Memories accessible by LLMs will be shown here.": "Geheugen toegankelijk voor LLMs wordt hier getoond.",
@@ -273,22 +267,19 @@
 	"Model '{{modelName}}' has been successfully downloaded.": "Model '{{modelName}}' is succesvol gedownload.",
 	"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 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 Name": "Model Naam",
+	"Model ID": "",
 	"Model not selected": "Model niet geselecteerd",
-	"Model Tag Name": "Model Tag Naam",
+	"Model Params": "",
 	"Model Whitelisting": "Model Whitelisting",
 	"Model(s) Whitelisted": "Model(len) zijn ge-whitelist",
-	"Modelfile": "Modelfile",
-	"Modelfile Advanced Settings": "Modelfile Geavanceerde Instellingen",
 	"Modelfile Content": "Modelfile Inhoud",
-	"Modelfiles": "Modelfiles",
 	"Models": "Modellen",
 	"More": "Meer",
 	"Name": "Naam",
 	"Name Tag": "Naam Tag",
-	"Name your modelfile": "Benoem je modelfile",
+	"Name your model": "",
 	"New Chat": "Nieuwe Chat",
 	"New Password": "Nieuw Wachtwoord",
 	"No results found": "Geen resultaten gevonden",
@@ -296,8 +287,6 @@
 	"No search results found": "",
 	"No source available": "Geen bron beschikbaar",
 	"Not factually correct": "Feitelijk niet juist",
-	"Not sure what to add?": "Niet zeker wat toe te voegen?",
-	"Not sure what to write? Switch to": "Niet zeker wat te schrijven? Schakel over naar",
 	"Note: If you set a minimum score, the search will only return documents with a score greater than or equal to the minimum score.": "Opmerking: Als u een minimumscore instelt, levert de zoekopdracht alleen documenten op met een score groter dan of gelijk aan de minimumscore.",
 	"Notifications": "Desktop Notificaties",
 	"November": "November",
@@ -326,7 +315,6 @@
 	"or": "of",
 	"Other": "Andere",
 	"Overview": "Overzicht",
-	"Parameters": "Parameters",
 	"Password": "Wachtwoord",
 	"PDF document (.pdf)": "PDF document (.pdf)",
 	"PDF Extract Images (OCR)": "PDF Extract Afbeeldingen (OCR)",
@@ -346,10 +334,8 @@
 	"Prompts": "Prompts",
 	"Pull \"{{searchValue}}\" from Ollama.com": "Haal \"{{searchValue}}\" uit Ollama.com",
 	"Pull a model from Ollama.com": "Haal een model van Ollama.com",
-	"Pull Progress": "Haal Voortgang op",
 	"Query Params": "Query Params",
 	"RAG Template": "RAG Template",
-	"Raw Format": "Raw Formaat",
 	"Read Aloud": "Voorlezen",
 	"Record voice": "Neem stem op",
 	"Redirecting you to OpenWebUI Community": "Je wordt doorgestuurd naar OpenWebUI Community",
@@ -360,7 +346,6 @@
 	"Remove Model": "Verwijder Model",
 	"Rename": "Hervatten",
 	"Repeat Last N": "Herhaal Laatste N",
-	"Repeat Penalty": "Herhaal Straf",
 	"Request Mode": "Request Modus",
 	"Reranking Model": "Reranking Model",
 	"Reranking model disabled": "Reranking model uitgeschakeld",
@@ -387,10 +372,12 @@
 	"See readme.md for instructions": "Zie readme.md voor instructies",
 	"See what's new": "Zie wat er nieuw is",
 	"Seed": "Seed",
+	"Select a base model": "",
 	"Select a mode": "Selecteer een modus",
 	"Select a model": "Selecteer een model",
 	"Select an Ollama instance": "Selecteer een Ollama instantie",
 	"Select model": "Selecteer een model",
+	"Selected model(s) do not support image inputs": "",
 	"Send": "Verzenden",
 	"Send a Message": "Stuur een Bericht",
 	"Send message": "Stuur bericht",
@@ -412,7 +399,6 @@
 	"Share to OpenWebUI Community": "Deel naar OpenWebUI Community",
 	"short-summary": "korte-samenvatting",
 	"Show": "Toon",
-	"Show Additional Params": "Toon Extra Params",
 	"Show shortcuts": "Toon snelkoppelingen",
 	"Showcased creativity": "Tooncase creativiteit",
 	"sidebar": "sidebar",
@@ -431,7 +417,6 @@
 	"Success": "Succes",
 	"Successfully updated.": "Succesvol bijgewerkt.",
 	"Suggested": "Suggestie",
-	"Sync All": "Synchroniseer Alles",
 	"System": "Systeem",
 	"System Prompt": "Systeem Prompt",
 	"Tags": "Tags",
@@ -502,6 +487,7 @@
 	"Write a summary in 50 words that summarizes [topic or keyword].": "Schrijf een samenvatting in 50 woorden die [onderwerp of trefwoord] samenvat.",
 	"Yesterday": "gisteren",
 	"You": "U",
+	"You cannot clone a base model": "",
 	"You have no archived conversations.": "U heeft geen gearchiveerde gesprekken.",
 	"You have shared this chat": "U heeft dit gesprek gedeeld",
 	"You're a helpful assistant.": "Jij bent een behulpzame assistent.",

+ 23 - 37
src/lib/i18n/locales/pa-IN/translation.json

@@ -3,6 +3,8 @@
 	"(Beta)": "(ਬੀਟਾ)",
 	"(e.g. `sh webui.sh --api`)": "(ਉਦਾਹਰਣ ਦੇ ਤੌਰ ਤੇ `sh webui.sh --api`)",
 	"(latest)": "(ਤਾਜ਼ਾ)",
+	"{{ models }}": "",
+	"{{ owner }}: You cannot delete a base model": "",
 	"{{modelName}} is thinking...": "{{modelName}} ਸੋਚ ਰਿਹਾ ਹੈ...",
 	"{{user}}'s Chats": "{{user}} ਦੀਆਂ ਗੱਲਾਂ",
 	"{{webUIName}} Backend Required": "{{webUIName}} ਬੈਕਐਂਡ ਲੋੜੀਂਦਾ ਹੈ",
@@ -12,9 +14,8 @@
 	"Account": "ਖਾਤਾ",
 	"Accurate information": "ਸਹੀ ਜਾਣਕਾਰੀ",
 	"Add": "ਸ਼ਾਮਲ ਕਰੋ",
-	"Add a model": "ਇੱਕ ਮਾਡਲ ਸ਼ਾਮਲ ਕਰੋ",
-	"Add a model tag name": "ਇੱਕ ਮਾਡਲ ਟੈਗ ਨਾਮ ਸ਼ਾਮਲ ਕਰੋ",
-	"Add a short description about what this modelfile does": "ਇਸ ਮਾਡਲਫਾਈਲ ਦੇ ਕੀ ਕਰਨ ਬਾਰੇ ਇੱਕ ਛੋਟੀ ਵਰਣਨਾ ਸ਼ਾਮਲ ਕਰੋ",
+	"Add a model id": "",
+	"Add a short description about what this model does": "",
 	"Add a short title for this prompt": "ਇਸ ਪ੍ਰੰਪਟ ਲਈ ਇੱਕ ਛੋਟਾ ਸਿਰਲੇਖ ਸ਼ਾਮਲ ਕਰੋ",
 	"Add a tag": "ਇੱਕ ਟੈਗ ਸ਼ਾਮਲ ਕਰੋ",
 	"Add custom prompt": "ਕਸਟਮ ਪ੍ਰੰਪਟ ਸ਼ਾਮਲ ਕਰੋ",
@@ -30,6 +31,7 @@
 	"Admin Panel": "ਪ੍ਰਬੰਧਕ ਪੈਨਲ",
 	"Admin Settings": "ਪ੍ਰਬੰਧਕ ਸੈਟਿੰਗਾਂ",
 	"Advanced Parameters": "ਉੱਚ ਸਤਰ ਦੇ ਪੈਰਾਮੀਟਰ",
+	"Advanced Params": "",
 	"all": "ਸਾਰੇ",
 	"All Documents": "ਸਾਰੇ ਡਾਕੂਮੈਂਟ",
 	"All Users": "ਸਾਰੇ ਉਪਭੋਗਤਾ",
@@ -44,7 +46,6 @@
 	"API Key": "API ਕੁੰਜੀ",
 	"API Key created.": "API ਕੁੰਜੀ ਬਣਾਈ ਗਈ।",
 	"API keys": "API ਕੁੰਜੀਆਂ",
-	"API RPM": "API RPM",
 	"April": "ਅਪ੍ਰੈਲ",
 	"Archive": "ਆਰਕਾਈਵ",
 	"Archived Chats": "ਆਰਕਾਈਵ ਕੀਤੀਆਂ ਗੱਲਾਂ",
@@ -61,12 +62,12 @@
 	"available!": "ਉਪਲਬਧ ਹੈ!",
 	"Back": "ਵਾਪਸ",
 	"Bad Response": "ਖਰਾਬ ਜਵਾਬ",
+	"Base Model (From)": "",
 	"before": "ਪਹਿਲਾਂ",
 	"Being lazy": "ਆਲਸੀ ਹੋਣਾ",
-	"Builder Mode": "ਬਿਲਡਰ ਮੋਡ",
 	"Bypass SSL verification for Websites": "ਵੈਬਸਾਈਟਾਂ ਲਈ SSL ਪ੍ਰਮਾਣਿਕਤਾ ਨੂੰ ਬਾਈਪਾਸ ਕਰੋ",
 	"Cancel": "ਰੱਦ ਕਰੋ",
-	"Categories": "ਸ਼੍ਰੇਣੀਆਂ",
+	"Capabilities": "",
 	"Change Password": "ਪਾਸਵਰਡ ਬਦਲੋ",
 	"Chat": "ਗੱਲਬਾਤ",
 	"Chat Bubble UI": "ਗੱਲਬਾਤ ਬਬਲ UI",
@@ -84,7 +85,6 @@
 	"Citation": "ਹਵਾਲਾ",
 	"Click here for help.": "ਮਦਦ ਲਈ ਇੱਥੇ ਕਲਿੱਕ ਕਰੋ।",
 	"Click here to": "ਇੱਥੇ ਕਲਿੱਕ ਕਰੋ",
-	"Click here to check other modelfiles.": "ਹੋਰ ਮਾਡਲਫਾਈਲਾਂ ਦੀ ਜਾਂਚ ਕਰਨ ਲਈ ਇੱਥੇ ਕਲਿੱਕ ਕਰੋ।",
 	"Click here to select": "ਚੁਣਨ ਲਈ ਇੱਥੇ ਕਲਿੱਕ ਕਰੋ",
 	"Click here to select a csv file.": "CSV ਫਾਈਲ ਚੁਣਨ ਲਈ ਇੱਥੇ ਕਲਿੱਕ ਕਰੋ।",
 	"Click here to select documents.": "ਡਾਕੂਮੈਂਟ ਚੁਣਨ ਲਈ ਇੱਥੇ ਕਲਿੱਕ ਕਰੋ।",
@@ -109,7 +109,7 @@
 	"Copy Link": "ਲਿੰਕ ਕਾਪੀ ਕਰੋ",
 	"Copying to clipboard was successful!": "ਕਲਿੱਪਬੋਰਡ 'ਤੇ ਕਾਪੀ ਕਰਨਾ ਸਫਲ ਰਿਹਾ!",
 	"Create a concise, 3-5 word phrase as a header for the following query, strictly adhering to the 3-5 word limit and avoiding the use of the word 'title':": "ਹੇਠਾਂ ਦਿੱਤੀ ਪੁੱਛਗਿੱਛ ਲਈ ਇੱਕ ਛੋਟਾ, 3-5 ਸ਼ਬਦਾਂ ਦਾ ਵਾਕ ਬਣਾਓ, 3-5 ਸ਼ਬਦਾਂ ਦੀ ਸੀਮਾ ਦਾ ਪਾਲਣ ਕਰਦੇ ਹੋਏ ਅਤੇ 'ਸਿਰਲੇਖ' ਸ਼ਬਦ ਦੇ ਇਸਤੇਮਾਲ ਤੋਂ ਬਚਦੇ ਹੋਏ:",
-	"Create a modelfile": "ਇੱਕ ਮਾਡਲਫਾਈਲ ਬਣਾਓ",
+	"Create a model": "",
 	"Create Account": "ਖਾਤਾ ਬਣਾਓ",
 	"Create new key": "ਨਵੀਂ ਕੁੰਜੀ ਬਣਾਓ",
 	"Create new secret key": "ਨਵੀਂ ਗੁਪਤ ਕੁੰਜੀ ਬਣਾਓ",
@@ -118,7 +118,7 @@
 	"Current Model": "ਮੌਜੂਦਾ ਮਾਡਲ",
 	"Current Password": "ਮੌਜੂਦਾ ਪਾਸਵਰਡ",
 	"Custom": "ਕਸਟਮ",
-	"Customize Ollama models for a specific purpose": "ਇੱਕ ਖਾਸ ਉਦੇਸ਼ ਲਈ ਓਲਾਮਾ ਮਾਡਲਾਂ ਨੂੰ ਕਸਟਮਾਈਜ਼ ਕਰੋ",
+	"Customize models for a specific purpose": "",
 	"Dark": "ਗੂੜ੍ਹਾ",
 	"Dashboard": "ਡੈਸ਼ਬੋਰਡ",
 	"Database": "ਡਾਟਾਬੇਸ",
@@ -139,11 +139,11 @@
 	"delete this link": "ਇਸ ਲਿੰਕ ਨੂੰ ਮਿਟਾਓ",
 	"Delete User": "ਉਪਭੋਗਤਾ ਮਿਟਾਓ",
 	"Deleted {{deleteModelTag}}": "{{deleteModelTag}} ਮਿਟਾਇਆ ਗਿਆ",
-	"Deleted {{tagName}}": "{{tagName}} ਮਿਟਾਇਆ ਗਿਆ",
+	"Deleted {{name}}": "",
 	"Description": "ਵਰਣਨਾ",
 	"Didn't fully follow instructions": "ਹਦਾਇਤਾਂ ਨੂੰ ਪੂਰੀ ਤਰ੍ਹਾਂ ਫਾਲੋ ਨਹੀਂ ਕੀਤਾ",
 	"Disabled": "ਅਯੋਗ",
-	"Discover a modelfile": "ਇੱਕ ਮਾਡਲਫਾਈਲ ਖੋਜੋ",
+	"Discover a model": "",
 	"Discover a prompt": "ਇੱਕ ਪ੍ਰੰਪਟ ਖੋਜੋ",
 	"Discover, download, and explore custom prompts": "ਕਸਟਮ ਪ੍ਰੰਪਟਾਂ ਨੂੰ ਖੋਜੋ, ਡਾਊਨਲੋਡ ਕਰੋ ਅਤੇ ਪੜਚੋਲ ਕਰੋ",
 	"Discover, download, and explore model presets": "ਮਾਡਲ ਪ੍ਰੀਸੈਟਾਂ ਨੂੰ ਖੋਜੋ, ਡਾਊਨਲੋਡ ਕਰੋ ਅਤੇ ਪੜਚੋਲ ਕਰੋ",
@@ -177,11 +177,6 @@
 	"Enter Chunk Size": "ਚੰਕ ਆਕਾਰ ਦਰਜ ਕਰੋ",
 	"Enter Image Size (e.g. 512x512)": "ਚਿੱਤਰ ਆਕਾਰ ਦਰਜ ਕਰੋ (ਉਦਾਹਰਣ ਲਈ 512x512)",
 	"Enter language codes": "ਭਾਸ਼ਾ ਕੋਡ ਦਰਜ ਕਰੋ",
-	"Enter LiteLLM API Base URL (litellm_params.api_base)": "LiteLLM API ਬੇਸ URL (litellm_params.api_base) ਦਰਜ ਕਰੋ",
-	"Enter LiteLLM API Key (litellm_params.api_key)": "LiteLLM API ਕੁੰਜੀ (litellm_params.api_key) ਦਰਜ ਕਰੋ",
-	"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 tag (e.g. {{modelTag}})": "ਮਾਡਲ ਟੈਗ ਦਰਜ ਕਰੋ (ਉਦਾਹਰਣ ਲਈ {{modelTag}})",
 	"Enter Number of Steps (e.g. 50)": "ਕਦਮਾਂ ਦੀ ਗਿਣਤੀ ਦਰਜ ਕਰੋ (ਉਦਾਹਰਣ ਲਈ 50)",
 	"Enter Score": "ਸਕੋਰ ਦਰਜ ਕਰੋ",
@@ -197,7 +192,7 @@
 	"Export All Chats (All Users)": "ਸਾਰੀਆਂ ਗੱਲਾਂ ਨਿਰਯਾਤ ਕਰੋ (ਸਾਰੇ ਉਪਭੋਗਤਾ)",
 	"Export Chats": "ਗੱਲਾਂ ਨਿਰਯਾਤ ਕਰੋ",
 	"Export Documents Mapping": "ਡਾਕੂਮੈਂਟ ਮੈਪਿੰਗ ਨਿਰਯਾਤ ਕਰੋ",
-	"Export Modelfiles": "ਮਾਡਲਫਾਈਲਾਂ ਨਿਰਯਾਤ ਕਰੋ",
+	"Export Models": "",
 	"Export Prompts": "ਪ੍ਰੰਪਟ ਨਿਰਯਾਤ ਕਰੋ",
 	"Failed to create API Key.": "API ਕੁੰਜੀ ਬਣਾਉਣ ਵਿੱਚ ਅਸਫਲ।",
 	"Failed to read clipboard contents": "ਕਲਿੱਪਬੋਰਡ ਸਮੱਗਰੀ ਪੜ੍ਹਣ ਵਿੱਚ ਅਸਫਲ",
@@ -210,7 +205,7 @@
 	"Focus chat input": "ਗੱਲਬਾਤ ਇਨਪੁਟ 'ਤੇ ਧਿਆਨ ਦਿਓ",
 	"Followed instructions perfectly": "ਹਦਾਇਤਾਂ ਨੂੰ ਬਿਲਕੁਲ ਫਾਲੋ ਕੀਤਾ",
 	"Format your variables using square brackets like this:": "ਤੁਹਾਡੀਆਂ ਵੈਰੀਏਬਲਾਂ ਨੂੰ ਇਸ ਤਰ੍ਹਾਂ ਵਰਤੋਂ: [ ]",
-	"From (Base Model)": "ਤੋਂ (ਮੂਲ ਮਾਡਲ)",
+	"Frequencey Penalty": "",
 	"Full Screen Mode": "ਪੂਰੀ ਸਕਰੀਨ ਮੋਡ",
 	"General": "ਆਮ",
 	"General Settings": "ਆਮ ਸੈਟਿੰਗਾਂ",
@@ -222,7 +217,6 @@
 	"Hello, {{name}}": "ਸਤ ਸ੍ਰੀ ਅਕਾਲ, {{name}}",
 	"Help": "ਮਦਦ",
 	"Hide": "ਲੁਕਾਓ",
-	"Hide Additional Params": "ਵਾਧੂ ਪੈਰਾਮੀਟਰ ਲੁਕਾਓ",
 	"How can I help you today?": "ਮੈਂ ਅੱਜ ਤੁਹਾਡੀ ਕਿਵੇਂ ਮਦਦ ਕਰ ਸਕਦਾ ਹਾਂ?",
 	"Hybrid Search": "ਹਾਈਬ੍ਰਿਡ ਖੋਜ",
 	"Image Generation (Experimental)": "ਚਿੱਤਰ ਜਨਰੇਸ਼ਨ (ਪਰਮਾਣੂਕ੍ਰਿਤ)",
@@ -231,7 +225,7 @@
 	"Images": "ਚਿੱਤਰ",
 	"Import Chats": "ਗੱਲਾਂ ਆਯਾਤ ਕਰੋ",
 	"Import Documents Mapping": "ਡਾਕੂਮੈਂਟ ਮੈਪਿੰਗ ਆਯਾਤ ਕਰੋ",
-	"Import Modelfiles": "ਮਾਡਲਫਾਈਲਾਂ ਆਯਾਤ ਕਰੋ",
+	"Import Models": "",
 	"Import Prompts": "ਪ੍ਰੰਪਟ ਆਯਾਤ ਕਰੋ",
 	"Include `--api` flag when running stable-diffusion-webui": "ਸਟੇਬਲ-ਡਿਫਿਊਸ਼ਨ-ਵੈਬਯੂਆਈ ਚਲਾਉਣ ਸਮੇਂ `--api` ਝੰਡਾ ਸ਼ਾਮਲ ਕਰੋ",
 	"Input commands": "ਇਨਪੁਟ ਕਮਾਂਡਾਂ",
@@ -240,6 +234,7 @@
 	"January": "ਜਨਵਰੀ",
 	"join our Discord for help.": "ਮਦਦ ਲਈ ਸਾਡੇ ਡਿਸਕੋਰਡ ਵਿੱਚ ਸ਼ਾਮਲ ਹੋਵੋ।",
 	"JSON": "JSON",
+	"JSON Preview": "",
 	"July": "ਜੁਲਾਈ",
 	"June": "ਜੂਨ",
 	"JWT Expiration": "JWT ਮਿਆਦ ਖਤਮ",
@@ -254,11 +249,10 @@
 	"LTR": "LTR",
 	"Made by OpenWebUI Community": "ਓਪਨਵੈਬਯੂਆਈ ਕਮਿਊਨਿਟੀ ਦੁਆਰਾ ਬਣਾਇਆ ਗਿਆ",
 	"Make sure to enclose them with": "ਸੁਨਿਸ਼ਚਿਤ ਕਰੋ ਕਿ ਉਨ੍ਹਾਂ ਨੂੰ ਘੇਰੋ",
-	"Manage LiteLLM Models": "LiteLLM ਮਾਡਲਾਂ ਦਾ ਪ੍ਰਬੰਧਨ ਕਰੋ",
 	"Manage Models": "ਮਾਡਲਾਂ ਦਾ ਪ੍ਰਬੰਧਨ ਕਰੋ",
 	"Manage Ollama Models": "ਓਲਾਮਾ ਮਾਡਲਾਂ ਦਾ ਪ੍ਰਬੰਧਨ ਕਰੋ",
 	"March": "ਮਾਰਚ",
-	"Max Tokens": "ਅਧਿਕਤਮ ਟੋਕਨ",
+	"Max Tokens (num_predict)": "",
 	"Maximum of 3 models can be downloaded simultaneously. Please try again later.": "ਇੱਕ ਸਮੇਂ ਵਿੱਚ ਵੱਧ ਤੋਂ ਵੱਧ 3 ਮਾਡਲ ਡਾਊਨਲੋਡ ਕੀਤੇ ਜਾ ਸਕਦੇ ਹਨ। ਕਿਰਪਾ ਕਰਕੇ ਬਾਅਦ ਵਿੱਚ ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ।",
 	"May": "ਮਈ",
 	"Memories accessible by LLMs will be shown here.": "LLMs ਲਈ ਸਮਰੱਥ ਕਾਰਨ ਇੱਕ ਸੂਚਨਾ ਨੂੰ ਸ਼ਾਮਲ ਕੀਤਾ ਗਿਆ ਹੈ।",
@@ -273,22 +267,19 @@
 	"Model '{{modelName}}' has been successfully downloaded.": "ਮਾਡਲ '{{modelName}}' ਸਫਲਤਾਪੂਰਵਕ ਡਾਊਨਲੋਡ ਕੀਤਾ ਗਿਆ ਹੈ।",
 	"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 filesystem path detected. Model shortname is required for update, cannot continue.": "ਮਾਡਲ ਫਾਈਲਸਿਸਟਮ ਪੱਥ ਪਾਇਆ ਗਿਆ। ਅੱਪਡੇਟ ਲਈ ਮਾਡਲ ਸ਼ੌਰਟਨੇਮ ਦੀ ਲੋੜ ਹੈ, ਜਾਰੀ ਨਹੀਂ ਰੱਖ ਸਕਦੇ।",
-	"Model Name": "ਮਾਡਲ ਨਾਮ",
+	"Model ID": "",
 	"Model not selected": "ਮਾਡਲ ਚੁਣਿਆ ਨਹੀਂ ਗਿਆ",
-	"Model Tag Name": "ਮਾਡਲ ਟੈਗ ਨਾਮ",
+	"Model Params": "",
 	"Model Whitelisting": "ਮਾਡਲ ਵ੍ਹਾਈਟਲਿਸਟਿੰਗ",
 	"Model(s) Whitelisted": "ਮਾਡਲ(ਜ਼) ਵ੍ਹਾਈਟਲਿਸਟ ਕੀਤਾ ਗਿਆ",
-	"Modelfile": "ਮਾਡਲਫਾਈਲ",
-	"Modelfile Advanced Settings": "ਮਾਡਲਫਾਈਲ ਉੱਚ ਸਤਰ ਦੀਆਂ ਸੈਟਿੰਗਾਂ",
 	"Modelfile Content": "ਮਾਡਲਫਾਈਲ ਸਮੱਗਰੀ",
-	"Modelfiles": "ਮਾਡਲਫਾਈਲਾਂ",
 	"Models": "ਮਾਡਲ",
 	"More": "ਹੋਰ",
 	"Name": "ਨਾਮ",
 	"Name Tag": "ਨਾਮ ਟੈਗ",
-	"Name your modelfile": "ਆਪਣੀ ਮਾਡਲਫਾਈਲ ਦਾ ਨਾਮ ਰੱਖੋ",
+	"Name your model": "",
 	"New Chat": "ਨਵੀਂ ਗੱਲਬਾਤ",
 	"New Password": "ਨਵਾਂ ਪਾਸਵਰਡ",
 	"No results found": "ਕੋਈ ਨਤੀਜੇ ਨਹੀਂ ਮਿਲੇ",
@@ -296,8 +287,6 @@
 	"No search results found": "",
 	"No source available": "ਕੋਈ ਸਰੋਤ ਉਪਲਬਧ ਨਹੀਂ",
 	"Not factually correct": "ਤੱਥਕ ਰੂਪ ਵਿੱਚ ਸਹੀ ਨਹੀਂ",
-	"Not sure what to add?": "ਕੀ ਸ਼ਾਮਲ ਕਰਨਾ ਹੈ ਇਹ ਯਕੀਨੀ ਨਹੀਂ?",
-	"Not sure what to write? Switch to": "ਕੀ ਲਿਖਣਾ ਹੈ ਇਹ ਯਕੀਨੀ ਨਹੀਂ? ਬਦਲੋ",
 	"Note: If you set a minimum score, the search will only return documents with a score greater than or equal to the minimum score.": "ਨੋਟ: ਜੇ ਤੁਸੀਂ ਘੱਟੋ-ਘੱਟ ਸਕੋਰ ਸੈੱਟ ਕਰਦੇ ਹੋ, ਤਾਂ ਖੋਜ ਸਿਰਫ਼ ਉਹੀ ਡਾਕੂਮੈਂਟ ਵਾਪਸ ਕਰੇਗੀ ਜਿਨ੍ਹਾਂ ਦਾ ਸਕੋਰ ਘੱਟੋ-ਘੱਟ ਸਕੋਰ ਦੇ ਬਰਾਬਰ ਜਾਂ ਵੱਧ ਹੋਵੇ।",
 	"Notifications": "ਸੂਚਨਾਵਾਂ",
 	"November": "ਨਵੰਬਰ",
@@ -326,7 +315,6 @@
 	"or": "ਜਾਂ",
 	"Other": "ਹੋਰ",
 	"Overview": "ਸੰਖੇਪ",
-	"Parameters": "ਪੈਰਾਮੀਟਰ",
 	"Password": "ਪਾਸਵਰਡ",
 	"PDF document (.pdf)": "PDF ਡਾਕੂਮੈਂਟ (.pdf)",
 	"PDF Extract Images (OCR)": "PDF ਚਿੱਤਰ ਕੱਢੋ (OCR)",
@@ -346,10 +334,8 @@
 	"Prompts": "ਪ੍ਰੰਪਟ",
 	"Pull \"{{searchValue}}\" from Ollama.com": "ਓਲਾਮਾ.ਕਾਮ ਤੋਂ \"{{searchValue}}\" ਖਿੱਚੋ",
 	"Pull a model from Ollama.com": "ਓਲਾਮਾ.ਕਾਮ ਤੋਂ ਇੱਕ ਮਾਡਲ ਖਿੱਚੋ",
-	"Pull Progress": "ਪ੍ਰਗਤੀ ਖਿੱਚੋ",
 	"Query Params": "ਪ੍ਰਸ਼ਨ ਪੈਰਾਮੀਟਰ",
 	"RAG Template": "RAG ਟੈਮਪਲੇਟ",
-	"Raw Format": "ਕੱਚਾ ਫਾਰਮੈਟ",
 	"Read Aloud": "ਜੋਰ ਨਾਲ ਪੜ੍ਹੋ",
 	"Record voice": "ਆਵਾਜ਼ ਰਿਕਾਰਡ ਕਰੋ",
 	"Redirecting you to OpenWebUI Community": "ਤੁਹਾਨੂੰ ਓਪਨਵੈਬਯੂਆਈ ਕਮਿਊਨਿਟੀ ਵੱਲ ਰੀਡਾਇਰੈਕਟ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ",
@@ -360,7 +346,6 @@
 	"Remove Model": "ਮਾਡਲ ਹਟਾਓ",
 	"Rename": "ਨਾਮ ਬਦਲੋ",
 	"Repeat Last N": "ਆਖਰੀ N ਨੂੰ ਦੁਹਰਾਓ",
-	"Repeat Penalty": "ਪੈਨਲਟੀ ਦੁਹਰਾਓ",
 	"Request Mode": "ਬੇਨਤੀ ਮੋਡ",
 	"Reranking Model": "ਮਾਡਲ ਮੁੜ ਰੈਂਕਿੰਗ",
 	"Reranking model disabled": "ਮਾਡਲ ਮੁੜ ਰੈਂਕਿੰਗ ਅਯੋਗ ਕੀਤਾ ਗਿਆ",
@@ -387,10 +372,12 @@
 	"See readme.md for instructions": "ਹਦਾਇਤਾਂ ਲਈ readme.md ਵੇਖੋ",
 	"See what's new": "ਨਵਾਂ ਕੀ ਹੈ ਵੇਖੋ",
 	"Seed": "ਬੀਜ",
+	"Select a base model": "",
 	"Select a mode": "ਇੱਕ ਮੋਡ ਚੁਣੋ",
 	"Select a model": "ਇੱਕ ਮਾਡਲ ਚੁਣੋ",
 	"Select an Ollama instance": "ਇੱਕ ਓਲਾਮਾ ਇੰਸਟੈਂਸ ਚੁਣੋ",
 	"Select model": "ਮਾਡਲ ਚੁਣੋ",
+	"Selected model(s) do not support image inputs": "",
 	"Send": "ਭੇਜੋ",
 	"Send a Message": "ਇੱਕ ਸੁਨੇਹਾ ਭੇਜੋ",
 	"Send message": "ਸੁਨੇਹਾ ਭੇਜੋ",
@@ -412,7 +399,6 @@
 	"Share to OpenWebUI Community": "ਓਪਨਵੈਬਯੂਆਈ ਕਮਿਊਨਿਟੀ ਨਾਲ ਸਾਂਝਾ ਕਰੋ",
 	"short-summary": "ਛੋਟੀ-ਸੰਖੇਪ",
 	"Show": "ਦਿਖਾਓ",
-	"Show Additional Params": "ਵਾਧੂ ਪੈਰਾਮੀਟਰ ਦਿਖਾਓ",
 	"Show shortcuts": "ਸ਼ਾਰਟਕਟ ਦਿਖਾਓ",
 	"Showcased creativity": "ਸਿਰਜਣਾਤਮਕਤਾ ਦਿਖਾਈ",
 	"sidebar": "ਸਾਈਡਬਾਰ",
@@ -431,7 +417,6 @@
 	"Success": "ਸਫਲਤਾ",
 	"Successfully updated.": "ਸਫਲਤਾਪੂਰਵਕ ਅੱਪਡੇਟ ਕੀਤਾ ਗਿਆ।",
 	"Suggested": "ਸੁਝਾਇਆ ਗਿਆ",
-	"Sync All": "ਸਾਰੇ ਸਿੰਕ ਕਰੋ",
 	"System": "ਸਿਸਟਮ",
 	"System Prompt": "ਸਿਸਟਮ ਪ੍ਰੰਪਟ",
 	"Tags": "ਟੈਗ",
@@ -502,6 +487,7 @@
 	"Write a summary in 50 words that summarizes [topic or keyword].": "50 ਸ਼ਬਦਾਂ ਵਿੱਚ ਇੱਕ ਸੰਖੇਪ ਲਿਖੋ ਜੋ [ਵਿਸ਼ਾ ਜਾਂ ਕੁੰਜੀ ਸ਼ਬਦ] ਨੂੰ ਸੰਖੇਪ ਕਰਦਾ ਹੈ।",
 	"Yesterday": "ਕੱਲ੍ਹ",
 	"You": "ਤੁਸੀਂ",
+	"You cannot clone a base model": "",
 	"You have no archived conversations.": "ਤੁਹਾਡੇ ਕੋਲ ਕੋਈ ਆਰਕਾਈਵ ਕੀਤੀਆਂ ਗੱਲਾਂ ਨਹੀਂ ਹਨ।",
 	"You have shared this chat": "ਤੁਸੀਂ ਇਹ ਗੱਲਬਾਤ ਸਾਂਝੀ ਕੀਤੀ ਹੈ",
 	"You're a helpful assistant.": "ਤੁਸੀਂ ਇੱਕ ਮਦਦਗਾਰ ਸਹਾਇਕ ਹੋ।",

+ 23 - 37
src/lib/i18n/locales/pl-PL/translation.json

@@ -3,6 +3,8 @@
 	"(Beta)": "(Beta)",
 	"(e.g. `sh webui.sh --api`)": "(np. `sh webui.sh --api`)",
 	"(latest)": "(najnowszy)",
+	"{{ models }}": "",
+	"{{ owner }}: You cannot delete a base model": "",
 	"{{modelName}} is thinking...": "{{modelName}} myśli...",
 	"{{user}}'s Chats": "{{user}} - czaty",
 	"{{webUIName}} Backend Required": "Backend {{webUIName}} wymagane",
@@ -12,9 +14,8 @@
 	"Account": "Konto",
 	"Accurate information": "Dokładna informacja",
 	"Add": "Dodaj",
-	"Add a model": "Dodaj model",
-	"Add a model tag name": "Dodaj nazwę tagu modelu",
-	"Add a short description about what this modelfile does": "Dodaj krótki opis tego, co robi ten plik modelu",
+	"Add a model id": "",
+	"Add a short description about what this model does": "",
 	"Add a short title for this prompt": "Dodaj krótki tytuł tego polecenia",
 	"Add a tag": "Dodaj tag",
 	"Add custom prompt": "Dodaj własne polecenie",
@@ -30,6 +31,7 @@
 	"Admin Panel": "Panel administracyjny",
 	"Admin Settings": "Ustawienia administratora",
 	"Advanced Parameters": "Zaawansowane parametry",
+	"Advanced Params": "",
 	"all": "wszyscy",
 	"All Documents": "Wszystkie dokumenty",
 	"All Users": "Wszyscy użytkownicy",
@@ -44,7 +46,6 @@
 	"API Key": "Klucz API",
 	"API Key created.": "Klucz API utworzony.",
 	"API keys": "Klucze API",
-	"API RPM": "Pakiet API RPM",
 	"April": "Kwiecień",
 	"Archive": "Archiwum",
 	"Archived Chats": "Zarchiwizowane czaty",
@@ -61,12 +62,12 @@
 	"available!": "dostępny!",
 	"Back": "Wstecz",
 	"Bad Response": "Zła odpowiedź",
+	"Base Model (From)": "",
 	"before": "przed",
 	"Being lazy": "Jest leniwy",
-	"Builder Mode": "Tryb budowniczego",
 	"Bypass SSL verification for Websites": "Pomiń weryfikację SSL dla stron webowych",
 	"Cancel": "Anuluj",
-	"Categories": "Kategorie",
+	"Capabilities": "",
 	"Change Password": "Zmień hasło",
 	"Chat": "Czat",
 	"Chat Bubble UI": "Bąbelki czatu",
@@ -84,7 +85,6 @@
 	"Citation": "Cytat",
 	"Click here for help.": "Kliknij tutaj, aby uzyskać pomoc.",
 	"Click here to": "Kliknij tutaj, żeby",
-	"Click here to check other modelfiles.": "Kliknij tutaj, aby sprawdzić inne pliki modelowe.",
 	"Click here to select": "Kliknij tutaj, aby wybrać",
 	"Click here to select a csv file.": "Kliknij tutaj, żeby wybrać plik CSV",
 	"Click here to select documents.": "Kliknij tutaj, aby wybrać dokumenty.",
@@ -109,7 +109,7 @@
 	"Copy Link": "Kopiuj link",
 	"Copying to clipboard was successful!": "Kopiowanie do schowka zakończone powodzeniem!",
 	"Create a concise, 3-5 word phrase as a header for the following query, strictly adhering to the 3-5 word limit and avoiding the use of the word 'title':": "Utwórz zwięzłą frazę składającą się z 3-5 słów jako nagłówek dla następującego zapytania, ściśle przestrzegając limitu od 3 do 5 słów i unikając użycia słowa 'tytuł':",
-	"Create a modelfile": "Utwórz plik modelu",
+	"Create a model": "",
 	"Create Account": "Utwórz konto",
 	"Create new key": "Utwórz nowy klucz",
 	"Create new secret key": "Utwórz nowy klucz bezpieczeństwa",
@@ -118,7 +118,7 @@
 	"Current Model": "Bieżący model",
 	"Current Password": "Bieżące hasło",
 	"Custom": "Niestandardowy",
-	"Customize Ollama models for a specific purpose": "Dostosuj modele Ollama do określonego celu",
+	"Customize models for a specific purpose": "",
 	"Dark": "Ciemny",
 	"Dashboard": "Dashboard",
 	"Database": "Baza danych",
@@ -139,11 +139,11 @@
 	"delete this link": "usuń ten link",
 	"Delete User": "Usuń użytkownika",
 	"Deleted {{deleteModelTag}}": "Usunięto {{deleteModelTag}}",
-	"Deleted {{tagName}}": "Usunięto {{tagName}}",
+	"Deleted {{name}}": "",
 	"Description": "Opis",
 	"Didn't fully follow instructions": "Nie postępował zgodnie z instrukcjami",
 	"Disabled": "Wyłączone",
-	"Discover a modelfile": "Odkryj plik modelu",
+	"Discover a model": "",
 	"Discover a prompt": "Odkryj prompt",
 	"Discover, download, and explore custom prompts": "Odkryj, pobierz i eksploruj niestandardowe prompty",
 	"Discover, download, and explore model presets": "Odkryj, pobierz i eksploruj ustawienia modeli",
@@ -177,11 +177,6 @@
 	"Enter Chunk Size": "Wprowadź rozmiar bloku",
 	"Enter Image Size (e.g. 512x512)": "Wprowadź rozmiar obrazu (np. 512x512)",
 	"Enter language codes": "Wprowadź kody języków",
-	"Enter LiteLLM API Base URL (litellm_params.api_base)": "Wprowadź bazowy adres URL LiteLLM API (litellm_params.api_base)",
-	"Enter LiteLLM API Key (litellm_params.api_key)": "Wprowadź klucz API LiteLLM (litellm_params.api_key)",
-	"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 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",
@@ -197,7 +192,7 @@
 	"Export All Chats (All Users)": "Eksportuj wszystkie czaty (wszyscy użytkownicy)",
 	"Export Chats": "Eksportuj czaty",
 	"Export Documents Mapping": "Eksportuj mapowanie dokumentów",
-	"Export Modelfiles": "Eksportuj pliki modeli",
+	"Export Models": "",
 	"Export Prompts": "Eksportuj prompty",
 	"Failed to create API Key.": "Nie udało się utworzyć klucza API.",
 	"Failed to read clipboard contents": "Nie udało się odczytać zawartości schowka",
@@ -210,7 +205,7 @@
 	"Focus chat input": "Skoncentruj na czacie",
 	"Followed instructions perfectly": "Postępował z idealnie według instrukcji",
 	"Format your variables using square brackets like this:": "Formatuj swoje zmienne, używając nawiasów kwadratowych, np.",
-	"From (Base Model)": "Z (Model Podstawowy)",
+	"Frequencey Penalty": "",
 	"Full Screen Mode": "Tryb pełnoekranowy",
 	"General": "Ogólne",
 	"General Settings": "Ogólne ustawienia",
@@ -222,7 +217,6 @@
 	"Hello, {{name}}": "Witaj, {{name}}",
 	"Help": "Pomoc",
 	"Hide": "Ukryj",
-	"Hide Additional Params": "Ukryj dodatkowe parametry",
 	"How can I help you today?": "Jak mogę Ci dzisiaj pomóc?",
 	"Hybrid Search": "Szukanie hybrydowe",
 	"Image Generation (Experimental)": "Generowanie obrazu (eksperymentalne)",
@@ -231,7 +225,7 @@
 	"Images": "Obrazy",
 	"Import Chats": "Importuj czaty",
 	"Import Documents Mapping": "Importuj mapowanie dokumentów",
-	"Import Modelfiles": "Importuj pliki modeli",
+	"Import Models": "",
 	"Import Prompts": "Importuj prompty",
 	"Include `--api` flag when running stable-diffusion-webui": "Dołącz flagę `--api` podczas uruchamiania stable-diffusion-webui",
 	"Input commands": "Wprowadź komendy",
@@ -240,6 +234,7 @@
 	"January": "Styczeń",
 	"join our Discord for help.": "Dołącz do naszego Discorda po pomoc.",
 	"JSON": "JSON",
+	"JSON Preview": "",
 	"July": "Lipiec",
 	"June": "Czerwiec",
 	"JWT Expiration": "Wygaśnięcie JWT",
@@ -254,11 +249,10 @@
 	"LTR": "LTR",
 	"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 Models": "Zarządzaj modelami",
 	"Manage Ollama Models": "Zarządzaj modelami Ollama",
 	"March": "Marzec",
-	"Max Tokens": "Maksymalna liczba tokenów",
+	"Max Tokens (num_predict)": "",
 	"Maximum of 3 models can be downloaded simultaneously. Please try again later.": "Maksymalnie 3 modele można pobierać jednocześnie. Spróbuj ponownie później.",
 	"May": "Maj",
 	"Memories accessible by LLMs will be shown here.": "Pamięci używane przez LLM będą tutaj widoczne.",
@@ -273,22 +267,19 @@
 	"Model '{{modelName}}' has been successfully downloaded.": "Model '{{modelName}}' został pomyślnie pobrany.",
 	"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 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 Name": "Nazwa modelu",
+	"Model ID": "",
 	"Model not selected": "Model nie został wybrany",
-	"Model Tag Name": "Nazwa tagu modelu",
+	"Model Params": "",
 	"Model Whitelisting": "Whitelisting modelu",
 	"Model(s) Whitelisted": "Model(e) dodane do listy białej",
-	"Modelfile": "Plik modelu",
-	"Modelfile Advanced Settings": "Zaawansowane ustawienia pliku modelu",
 	"Modelfile Content": "Zawartość pliku modelu",
-	"Modelfiles": "Pliki modeli",
 	"Models": "Modele",
 	"More": "Więcej",
 	"Name": "Nazwa",
 	"Name Tag": "Etykieta nazwy",
-	"Name your modelfile": "Nadaj nazwę swojemu plikowi modelu",
+	"Name your model": "",
 	"New Chat": "Nowy czat",
 	"New Password": "Nowe hasło",
 	"No results found": "Nie znaleziono rezultatów",
@@ -296,8 +287,6 @@
 	"No search results found": "",
 	"No source available": "Źródło nie dostępne",
 	"Not factually correct": "Nie zgodne z faktami",
-	"Not sure what to add?": "Nie wiesz, co dodać?",
-	"Not sure what to write? Switch to": "Nie wiesz, co napisać? Przełącz się na",
 	"Note: If you set a minimum score, the search will only return documents with a score greater than or equal to the minimum score.": "Uwaga: Jeśli ustawisz minimalny wynik, szukanie zwróci jedynie dokumenty z wynikiem większym lub równym minimalnemu.",
 	"Notifications": "Powiadomienia",
 	"November": "Listopad",
@@ -326,7 +315,6 @@
 	"or": "lub",
 	"Other": "Inne",
 	"Overview": "Przegląd",
-	"Parameters": "Parametry",
 	"Password": "Hasło",
 	"PDF document (.pdf)": "Dokument PDF (.pdf)",
 	"PDF Extract Images (OCR)": "PDF Wyodrębnij obrazy (OCR)",
@@ -346,10 +334,8 @@
 	"Prompts": "Prompty",
 	"Pull \"{{searchValue}}\" from Ollama.com": "Pobierz \"{{searchValue}}\" z Ollama.com",
 	"Pull a model from Ollama.com": "Pobierz model z Ollama.com",
-	"Pull Progress": "Postęp pobierania",
 	"Query Params": "Parametry zapytania",
 	"RAG Template": "Szablon RAG",
-	"Raw Format": "Format bez obróbki",
 	"Read Aloud": "Czytaj na głos",
 	"Record voice": "Nagraj głos",
 	"Redirecting you to OpenWebUI Community": "Przekierowujemy Cię do społeczności OpenWebUI",
@@ -360,7 +346,6 @@
 	"Remove Model": "Usuń model",
 	"Rename": "ZMień nazwę",
 	"Repeat Last N": "Powtórz ostatnie N",
-	"Repeat Penalty": "Kara za powtórzenie",
 	"Request Mode": "Tryb żądania",
 	"Reranking Model": "Zmiana rankingu modelu",
 	"Reranking model disabled": "Zmiana rankingu modelu zablokowana",
@@ -387,10 +372,12 @@
 	"See readme.md for instructions": "Zajrzyj do readme.md po instrukcje",
 	"See what's new": "Zobacz co nowego",
 	"Seed": "Seed",
+	"Select a base model": "",
 	"Select a mode": "Wybierz tryb",
 	"Select a model": "Wybierz model",
 	"Select an Ollama instance": "Wybierz instancję Ollama",
 	"Select model": "Wybierz model",
+	"Selected model(s) do not support image inputs": "",
 	"Send": "Wyślij",
 	"Send a Message": "Wyślij Wiadomość",
 	"Send message": "Wyślij wiadomość",
@@ -412,7 +399,6 @@
 	"Share to OpenWebUI Community": "Dziel się z społecznością OpenWebUI",
 	"short-summary": "Krótkie podsumowanie",
 	"Show": "Pokaż",
-	"Show Additional Params": "Pokaż dodatkowe parametry",
 	"Show shortcuts": "Pokaż skróty",
 	"Showcased creativity": "Pokaz kreatywności",
 	"sidebar": "Panel boczny",
@@ -431,7 +417,6 @@
 	"Success": "Sukces",
 	"Successfully updated.": "Pomyślnie zaktualizowano.",
 	"Suggested": "Sugerowane",
-	"Sync All": "Synchronizuj wszystko",
 	"System": "System",
 	"System Prompt": "Prompt systemowy",
 	"Tags": "Tagi",
@@ -502,6 +487,7 @@
 	"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].",
 	"Yesterday": "Wczoraj",
 	"You": "Ty",
+	"You cannot clone a base model": "",
 	"You have no archived conversations.": "Nie masz zarchiwizowanych rozmów.",
 	"You have shared this chat": "Udostępniłeś ten czat",
 	"You're a helpful assistant.": "Jesteś pomocnym asystentem.",

+ 23 - 37
src/lib/i18n/locales/pt-BR/translation.json

@@ -3,6 +3,8 @@
 	"(Beta)": "(Beta)",
 	"(e.g. `sh webui.sh --api`)": "(por exemplo, `sh webui.sh --api`)",
 	"(latest)": "(mais recente)",
+	"{{ models }}": "",
+	"{{ owner }}: You cannot delete a base model": "",
 	"{{modelName}} is thinking...": "{{modelName}} está pensando...",
 	"{{user}}'s Chats": "{{user}}'s Chats",
 	"{{webUIName}} Backend Required": "{{webUIName}} Backend Necessário",
@@ -12,9 +14,8 @@
 	"Account": "Conta",
 	"Accurate information": "Informações precisas",
 	"Add": "Adicionar",
-	"Add a model": "Adicionar um modelo",
-	"Add a model tag name": "Adicionar um nome de tag de modelo",
-	"Add a short description about what this modelfile does": "Adicione uma breve descrição sobre o que este arquivo de modelo faz",
+	"Add a model id": "",
+	"Add a short description about what this model does": "",
 	"Add a short title for this prompt": "Adicione um título curto para este prompt",
 	"Add a tag": "Adicionar uma tag",
 	"Add custom prompt": "Adicionar prompt personalizado",
@@ -30,6 +31,7 @@
 	"Admin Panel": "Painel do Administrador",
 	"Admin Settings": "Configurações do Administrador",
 	"Advanced Parameters": "Parâmetros Avançados",
+	"Advanced Params": "",
 	"all": "todos",
 	"All Documents": "Todos os Documentos",
 	"All Users": "Todos os Usuários",
@@ -44,7 +46,6 @@
 	"API Key": "Chave da API",
 	"API Key created.": "Chave da API criada.",
 	"API keys": "Chaves da API",
-	"API RPM": "API RPM",
 	"April": "Abril",
 	"Archive": "Arquivo",
 	"Archived Chats": "Bate-papos arquivados",
@@ -61,12 +62,12 @@
 	"available!": "disponível!",
 	"Back": "Voltar",
 	"Bad Response": "Resposta ruim",
+	"Base Model (From)": "",
 	"before": "antes",
 	"Being lazy": "Ser preguiçoso",
-	"Builder Mode": "Modo de Construtor",
 	"Bypass SSL verification for Websites": "Ignorar verificação SSL para sites",
 	"Cancel": "Cancelar",
-	"Categories": "Categorias",
+	"Capabilities": "",
 	"Change Password": "Alterar Senha",
 	"Chat": "Bate-papo",
 	"Chat Bubble UI": "UI de Bala de Bate-papo",
@@ -84,7 +85,6 @@
 	"Citation": "Citação",
 	"Click here for help.": "Clique aqui para obter ajuda.",
 	"Click here to": "Clique aqui para",
-	"Click here to check other modelfiles.": "Clique aqui para verificar outros arquivos de modelo.",
 	"Click here to select": "Clique aqui para selecionar",
 	"Click here to select a csv file.": "Clique aqui para selecionar um arquivo csv.",
 	"Click here to select documents.": "Clique aqui para selecionar documentos.",
@@ -109,7 +109,7 @@
 	"Copy Link": "Copiar link",
 	"Copying to clipboard was successful!": "Cópia para a área de transferência bem-sucedida!",
 	"Create a concise, 3-5 word phrase as a header for the following query, strictly adhering to the 3-5 word limit and avoiding the use of the word 'title':": "Crie uma frase concisa de 3 a 5 palavras como cabeçalho para a seguinte consulta, aderindo estritamente ao limite de 3 a 5 palavras e evitando o uso da palavra 'título':",
-	"Create a modelfile": "Criar um arquivo de modelo",
+	"Create a model": "",
 	"Create Account": "Criar Conta",
 	"Create new key": "Criar nova chave",
 	"Create new secret key": "Criar nova chave secreta",
@@ -118,7 +118,7 @@
 	"Current Model": "Modelo Atual",
 	"Current Password": "Senha Atual",
 	"Custom": "Personalizado",
-	"Customize Ollama models for a specific purpose": "Personalize os modelos Ollama para um propósito específico",
+	"Customize models for a specific purpose": "",
 	"Dark": "Escuro",
 	"Dashboard": "Painel",
 	"Database": "Banco de dados",
@@ -139,11 +139,11 @@
 	"delete this link": "excluir este link",
 	"Delete User": "Excluir Usuário",
 	"Deleted {{deleteModelTag}}": "{{deleteModelTag}} excluído",
-	"Deleted {{tagName}}": "{{tagName}} excluído",
+	"Deleted {{name}}": "",
 	"Description": "Descrição",
 	"Didn't fully follow instructions": "Não seguiu instruções com precisão",
 	"Disabled": "Desativado",
-	"Discover a modelfile": "Descobrir um arquivo de modelo",
+	"Discover a model": "",
 	"Discover a prompt": "Descobrir um prompt",
 	"Discover, download, and explore custom prompts": "Descubra, baixe e explore prompts personalizados",
 	"Discover, download, and explore model presets": "Descubra, baixe e explore predefinições de modelo",
@@ -177,11 +177,6 @@
 	"Enter Chunk Size": "Digite o Tamanho do Fragmento",
 	"Enter Image Size (e.g. 512x512)": "Digite o Tamanho da Imagem (por exemplo, 512x512)",
 	"Enter language codes": "Digite os códigos de idioma",
-	"Enter LiteLLM API Base URL (litellm_params.api_base)": "Digite a URL Base da API LiteLLM (litellm_params.api_base)",
-	"Enter LiteLLM API Key (litellm_params.api_key)": "Digite a Chave da API LiteLLM (litellm_params.api_key)",
-	"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 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",
@@ -197,7 +192,7 @@
 	"Export All Chats (All Users)": "Exportar Todos os Bate-papos (Todos os Usuários)",
 	"Export Chats": "Exportar Bate-papos",
 	"Export Documents Mapping": "Exportar Mapeamento de Documentos",
-	"Export Modelfiles": "Exportar Arquivos de Modelo",
+	"Export Models": "",
 	"Export Prompts": "Exportar Prompts",
 	"Failed to create API Key.": "Falha ao criar a Chave da API.",
 	"Failed to read clipboard contents": "Falha ao ler o conteúdo da área de transferência",
@@ -210,7 +205,7 @@
 	"Focus chat input": "Focar entrada de bate-papo",
 	"Followed instructions perfectly": "Seguiu instruções perfeitamente",
 	"Format your variables using square brackets like this:": "Formate suas variáveis usando colchetes como este:",
-	"From (Base Model)": "De (Modelo Base)",
+	"Frequencey Penalty": "",
 	"Full Screen Mode": "Modo de Tela Cheia",
 	"General": "Geral",
 	"General Settings": "Configurações Gerais",
@@ -222,7 +217,6 @@
 	"Hello, {{name}}": "Olá, {{name}}",
 	"Help": "Ajuda",
 	"Hide": "Ocultar",
-	"Hide Additional Params": "Ocultar Parâmetros Adicionais",
 	"How can I help you today?": "Como posso ajudá-lo hoje?",
 	"Hybrid Search": "Pesquisa Híbrida",
 	"Image Generation (Experimental)": "Geração de Imagens (Experimental)",
@@ -231,7 +225,7 @@
 	"Images": "Imagens",
 	"Import Chats": "Importar Bate-papos",
 	"Import Documents Mapping": "Importar Mapeamento de Documentos",
-	"Import Modelfiles": "Importar Arquivos de Modelo",
+	"Import Models": "",
 	"Import Prompts": "Importar Prompts",
 	"Include `--api` flag when running stable-diffusion-webui": "Inclua a flag `--api` ao executar stable-diffusion-webui",
 	"Input commands": "Comandos de entrada",
@@ -240,6 +234,7 @@
 	"January": "Janeiro",
 	"join our Discord for help.": "junte-se ao nosso Discord para obter ajuda.",
 	"JSON": "JSON",
+	"JSON Preview": "",
 	"July": "Julho",
 	"June": "Junho",
 	"JWT Expiration": "Expiração JWT",
@@ -254,11 +249,10 @@
 	"LTR": "LTR",
 	"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 Models": "Gerenciar Modelos",
 	"Manage Ollama Models": "Gerenciar Modelos Ollama",
 	"March": "Março",
-	"Max Tokens": "Máximo de Tokens",
+	"Max Tokens (num_predict)": "",
 	"Maximum of 3 models can be downloaded simultaneously. Please try again later.": "Máximo de 3 modelos podem ser baixados simultaneamente. Tente novamente mais tarde.",
 	"May": "Maio",
 	"Memories accessible by LLMs will be shown here.": "Memórias acessíveis por LLMs serão mostradas aqui.",
@@ -273,22 +267,19 @@
 	"Model '{{modelName}}' has been successfully downloaded.": "O modelo '{{modelName}}' foi baixado com sucesso.",
 	"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 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 Name": "Nome do Modelo",
+	"Model ID": "",
 	"Model not selected": "Modelo não selecionado",
-	"Model Tag Name": "Nome da Tag do Modelo",
+	"Model Params": "",
 	"Model Whitelisting": "Lista de Permissões de Modelo",
 	"Model(s) Whitelisted": "Modelo(s) na Lista de Permissões",
-	"Modelfile": "Arquivo de Modelo",
-	"Modelfile Advanced Settings": "Configurações Avançadas do Arquivo de Modelo",
 	"Modelfile Content": "Conteúdo do Arquivo de Modelo",
-	"Modelfiles": "Arquivos de Modelo",
 	"Models": "Modelos",
 	"More": "Mais",
 	"Name": "Nome",
 	"Name Tag": "Nome da Tag",
-	"Name your modelfile": "Nomeie seu arquivo de modelo",
+	"Name your model": "",
 	"New Chat": "Novo Bate-papo",
 	"New Password": "Nova Senha",
 	"No results found": "Nenhum resultado encontrado",
@@ -296,8 +287,6 @@
 	"No search results found": "",
 	"No source available": "Nenhuma fonte disponível",
 	"Not factually correct": "Não é correto em termos factuais",
-	"Not sure what to add?": "Não tem certeza do que adicionar?",
-	"Not sure what to write? Switch to": "Não tem certeza do que escrever? Mude para",
 	"Note: If you set a minimum score, the search will only return documents with a score greater than or equal to the minimum score.": "Nota: Se você definir uma pontuação mínima, a pesquisa só retornará documentos com uma pontuação maior ou igual à pontuação mínima.",
 	"Notifications": "Notificações da Área de Trabalho",
 	"November": "Novembro",
@@ -326,7 +315,6 @@
 	"or": "ou",
 	"Other": "Outro",
 	"Overview": "Visão Geral",
-	"Parameters": "Parâmetros",
 	"Password": "Senha",
 	"PDF document (.pdf)": "Documento PDF (.pdf)",
 	"PDF Extract Images (OCR)": "Extrair Imagens de PDF (OCR)",
@@ -346,10 +334,8 @@
 	"Prompts": "Prompts",
 	"Pull \"{{searchValue}}\" from Ollama.com": "Extrair \"{{searchValue}}\" do Ollama.com",
 	"Pull a model from Ollama.com": "Extrair um modelo do Ollama.com",
-	"Pull Progress": "Progresso da Extração",
 	"Query Params": "Parâmetros de Consulta",
 	"RAG Template": "Modelo RAG",
-	"Raw Format": "Formato Bruto",
 	"Read Aloud": "Ler em Voz Alta",
 	"Record voice": "Gravar voz",
 	"Redirecting you to OpenWebUI Community": "Redirecionando você para a Comunidade OpenWebUI",
@@ -360,7 +346,6 @@
 	"Remove Model": "Remover Modelo",
 	"Rename": "Renomear",
 	"Repeat Last N": "Repetir Últimos N",
-	"Repeat Penalty": "Penalidade de Repetição",
 	"Request Mode": "Modo de Solicitação",
 	"Reranking Model": "Modelo de Reranking",
 	"Reranking model disabled": "Modelo de Reranking desativado",
@@ -387,10 +372,12 @@
 	"See readme.md for instructions": "Consulte readme.md para obter instruções",
 	"See what's new": "Veja o que há de novo",
 	"Seed": "Semente",
+	"Select a base model": "",
 	"Select a mode": "Selecione um modo",
 	"Select a model": "Selecione um modelo",
 	"Select an Ollama instance": "Selecione uma instância Ollama",
 	"Select model": "Selecione um modelo",
+	"Selected model(s) do not support image inputs": "",
 	"Send": "Enviar",
 	"Send a Message": "Enviar uma Mensagem",
 	"Send message": "Enviar mensagem",
@@ -412,7 +399,6 @@
 	"Share to OpenWebUI Community": "Compartilhar com a Comunidade OpenWebUI",
 	"short-summary": "resumo-curto",
 	"Show": "Mostrar",
-	"Show Additional Params": "Mostrar Parâmetros Adicionais",
 	"Show shortcuts": "Mostrar",
 	"Showcased creativity": "Criatividade Exibida",
 	"sidebar": "barra lateral",
@@ -431,7 +417,6 @@
 	"Success": "Sucesso",
 	"Successfully updated.": "Atualizado com sucesso.",
 	"Suggested": "Sugerido",
-	"Sync All": "Sincronizar Tudo",
 	"System": "Sistema",
 	"System Prompt": "Prompt do Sistema",
 	"Tags": "Tags",
@@ -502,6 +487,7 @@
 	"Write a summary in 50 words that summarizes [topic or keyword].": "Escreva um resumo em 50 palavras que resuma [tópico ou palavra-chave].",
 	"Yesterday": "Ontem",
 	"You": "Você",
+	"You cannot clone a base model": "",
 	"You have no archived conversations.": "Você não tem conversas arquivadas.",
 	"You have shared this chat": "Você compartilhou esta conversa",
 	"You're a helpful assistant.": "Você é um assistente útil.",

+ 23 - 37
src/lib/i18n/locales/pt-PT/translation.json

@@ -3,6 +3,8 @@
 	"(Beta)": "(Beta)",
 	"(e.g. `sh webui.sh --api`)": "(por exemplo, `sh webui.sh --api`)",
 	"(latest)": "(mais recente)",
+	"{{ models }}": "",
+	"{{ owner }}: You cannot delete a base model": "",
 	"{{modelName}} is thinking...": "{{modelName}} está pensando...",
 	"{{user}}'s Chats": "{{user}}'s Chats",
 	"{{webUIName}} Backend Required": "{{webUIName}} Backend Necessário",
@@ -12,9 +14,8 @@
 	"Account": "Conta",
 	"Accurate information": "Informações precisas",
 	"Add": "Adicionar",
-	"Add a model": "Adicionar um modelo",
-	"Add a model tag name": "Adicionar um nome de tag de modelo",
-	"Add a short description about what this modelfile does": "Adicione uma breve descrição sobre o que este arquivo de modelo faz",
+	"Add a model id": "",
+	"Add a short description about what this model does": "",
 	"Add a short title for this prompt": "Adicione um título curto para este prompt",
 	"Add a tag": "Adicionar uma tag",
 	"Add custom prompt": "Adicionar um prompt curto",
@@ -30,6 +31,7 @@
 	"Admin Panel": "Painel do Administrador",
 	"Admin Settings": "Configurações do Administrador",
 	"Advanced Parameters": "Parâmetros Avançados",
+	"Advanced Params": "",
 	"all": "todos",
 	"All Documents": "Todos os Documentos",
 	"All Users": "Todos os Usuários",
@@ -44,7 +46,6 @@
 	"API Key": "Chave da API",
 	"API Key created.": "Chave da API criada.",
 	"API keys": "Chaves da API",
-	"API RPM": "API RPM",
 	"April": "Abril",
 	"Archive": "Arquivo",
 	"Archived Chats": "Bate-papos arquivados",
@@ -61,12 +62,12 @@
 	"available!": "disponível!",
 	"Back": "Voltar",
 	"Bad Response": "Resposta ruim",
+	"Base Model (From)": "",
 	"before": "antes",
 	"Being lazy": "Ser preguiçoso",
-	"Builder Mode": "Modo de Construtor",
 	"Bypass SSL verification for Websites": "Ignorar verificação SSL para sites",
 	"Cancel": "Cancelar",
-	"Categories": "Categorias",
+	"Capabilities": "",
 	"Change Password": "Alterar Senha",
 	"Chat": "Bate-papo",
 	"Chat Bubble UI": "UI de Bala de Bate-papo",
@@ -84,7 +85,6 @@
 	"Citation": "Citação",
 	"Click here for help.": "Clique aqui para obter ajuda.",
 	"Click here to": "Clique aqui para",
-	"Click here to check other modelfiles.": "Clique aqui para verificar outros arquivos de modelo.",
 	"Click here to select": "Clique aqui para selecionar",
 	"Click here to select a csv file.": "Clique aqui para selecionar um arquivo csv.",
 	"Click here to select documents.": "Clique aqui para selecionar documentos.",
@@ -109,7 +109,7 @@
 	"Copy Link": "Copiar link",
 	"Copying to clipboard was successful!": "Cópia para a área de transferência bem-sucedida!",
 	"Create a concise, 3-5 word phrase as a header for the following query, strictly adhering to the 3-5 word limit and avoiding the use of the word 'title':": "Crie uma frase concisa de 3 a 5 palavras como cabeçalho para a seguinte consulta, aderindo estritamente ao limite de 3 a 5 palavras e evitando o uso da palavra 'título':",
-	"Create a modelfile": "Criar um arquivo de modelo",
+	"Create a model": "",
 	"Create Account": "Criar Conta",
 	"Create new key": "Criar nova chave",
 	"Create new secret key": "Criar nova chave secreta",
@@ -118,7 +118,7 @@
 	"Current Model": "Modelo Atual",
 	"Current Password": "Senha Atual",
 	"Custom": "Personalizado",
-	"Customize Ollama models for a specific purpose": "Personalize os modelos Ollama para um propósito específico",
+	"Customize models for a specific purpose": "",
 	"Dark": "Escuro",
 	"Dashboard": "Painel",
 	"Database": "Banco de dados",
@@ -139,11 +139,11 @@
 	"delete this link": "excluir este link",
 	"Delete User": "Excluir Usuário",
 	"Deleted {{deleteModelTag}}": "{{deleteModelTag}} excluído",
-	"Deleted {{tagName}}": "{{tagName}} excluído",
+	"Deleted {{name}}": "",
 	"Description": "Descrição",
 	"Didn't fully follow instructions": "Não seguiu instruções com precisão",
 	"Disabled": "Desativado",
-	"Discover a modelfile": "Descobrir um arquivo de modelo",
+	"Discover a model": "",
 	"Discover a prompt": "Descobrir um prompt",
 	"Discover, download, and explore custom prompts": "Descubra, baixe e explore prompts personalizados",
 	"Discover, download, and explore model presets": "Descubra, baixe e explore predefinições de modelo",
@@ -177,11 +177,6 @@
 	"Enter Chunk Size": "Digite o Tamanho do Fragmento",
 	"Enter Image Size (e.g. 512x512)": "Digite o Tamanho da Imagem (por exemplo, 512x512)",
 	"Enter language codes": "Digite os códigos de idioma",
-	"Enter LiteLLM API Base URL (litellm_params.api_base)": "Digite a URL Base da API LiteLLM (litellm_params.api_base)",
-	"Enter LiteLLM API Key (litellm_params.api_key)": "Digite a Chave da API LiteLLM (litellm_params.api_key)",
-	"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 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",
@@ -197,7 +192,7 @@
 	"Export All Chats (All Users)": "Exportar Todos os Bate-papos (Todos os Usuários)",
 	"Export Chats": "Exportar Bate-papos",
 	"Export Documents Mapping": "Exportar Mapeamento de Documentos",
-	"Export Modelfiles": "Exportar Arquivos de Modelo",
+	"Export Models": "",
 	"Export Prompts": "Exportar Prompts",
 	"Failed to create API Key.": "Falha ao criar a Chave da API.",
 	"Failed to read clipboard contents": "Falha ao ler o conteúdo da área de transferência",
@@ -210,7 +205,7 @@
 	"Focus chat input": "Focar entrada de bate-papo",
 	"Followed instructions perfectly": "Seguiu instruções perfeitamente",
 	"Format your variables using square brackets like this:": "Formate suas variáveis usando colchetes como este:",
-	"From (Base Model)": "De (Modelo Base)",
+	"Frequencey Penalty": "",
 	"Full Screen Mode": "Modo de Tela Cheia",
 	"General": "Geral",
 	"General Settings": "Configurações Gerais",
@@ -222,7 +217,6 @@
 	"Hello, {{name}}": "Olá, {{name}}",
 	"Help": "Help",
 	"Hide": "Ocultar",
-	"Hide Additional Params": "Ocultar Parâmetros Adicionais",
 	"How can I help you today?": "Como posso ajudá-lo hoje?",
 	"Hybrid Search": "Pesquisa Híbrida",
 	"Image Generation (Experimental)": "Geração de Imagens (Experimental)",
@@ -231,7 +225,7 @@
 	"Images": "Imagens",
 	"Import Chats": "Importar Bate-papos",
 	"Import Documents Mapping": "Importar Mapeamento de Documentos",
-	"Import Modelfiles": "Importar Arquivos de Modelo",
+	"Import Models": "",
 	"Import Prompts": "Importar Prompts",
 	"Include `--api` flag when running stable-diffusion-webui": "Inclua a flag `--api` ao executar stable-diffusion-webui",
 	"Input commands": "Comandos de entrada",
@@ -240,6 +234,7 @@
 	"January": "Janeiro",
 	"join our Discord for help.": "junte-se ao nosso Discord para obter ajuda.",
 	"JSON": "JSON",
+	"JSON Preview": "",
 	"July": "Julho",
 	"June": "Junho",
 	"JWT Expiration": "Expiração JWT",
@@ -254,11 +249,10 @@
 	"LTR": "LTR",
 	"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 Models": "Gerenciar Modelos",
 	"Manage Ollama Models": "Gerenciar Modelos Ollama",
 	"March": "Março",
-	"Max Tokens": "Máximo de Tokens",
+	"Max Tokens (num_predict)": "",
 	"Maximum of 3 models can be downloaded simultaneously. Please try again later.": "Máximo de 3 modelos podem ser baixados simultaneamente. Tente novamente mais tarde.",
 	"May": "Maio",
 	"Memories accessible by LLMs will be shown here.": "Memórias acessíveis por LLMs serão mostradas aqui.",
@@ -273,22 +267,19 @@
 	"Model '{{modelName}}' has been successfully downloaded.": "O modelo '{{modelName}}' foi baixado com sucesso.",
 	"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 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 Name": "Nome do Modelo",
+	"Model ID": "",
 	"Model not selected": "Modelo não selecionado",
-	"Model Tag Name": "Nome da Tag do Modelo",
+	"Model Params": "",
 	"Model Whitelisting": "Lista de Permissões de Modelo",
 	"Model(s) Whitelisted": "Modelo(s) na Lista de Permissões",
-	"Modelfile": "Arquivo de Modelo",
-	"Modelfile Advanced Settings": "Configurações Avançadas do Arquivo de Modelo",
 	"Modelfile Content": "Conteúdo do Arquivo de Modelo",
-	"Modelfiles": "Arquivos de Modelo",
 	"Models": "Modelos",
 	"More": "Mais",
 	"Name": "Nome",
 	"Name Tag": "Tag de Nome",
-	"Name your modelfile": "Nomeie seu arquivo de modelo",
+	"Name your model": "",
 	"New Chat": "Novo Bate-papo",
 	"New Password": "Nova Senha",
 	"No results found": "Nenhum resultado encontrado",
@@ -296,8 +287,6 @@
 	"No search results found": "",
 	"No source available": "Nenhuma fonte disponível",
 	"Not factually correct": "Não é correto em termos factuais",
-	"Not sure what to add?": "Não tem certeza do que adicionar?",
-	"Not sure what to write? Switch to": "Não tem certeza do que escrever? Mude para",
 	"Note: If you set a minimum score, the search will only return documents with a score greater than or equal to the minimum score.": "Nota: Se você definir uma pontuação mínima, a pesquisa só retornará documentos com uma pontuação maior ou igual à pontuação mínima.",
 	"Notifications": "Notificações da Área de Trabalho",
 	"November": "Novembro",
@@ -326,7 +315,6 @@
 	"or": "ou",
 	"Other": "Outro",
 	"Overview": "Visão Geral",
-	"Parameters": "Parâmetros",
 	"Password": "Senha",
 	"PDF document (.pdf)": "Documento PDF (.pdf)",
 	"PDF Extract Images (OCR)": "Extrair Imagens de PDF (OCR)",
@@ -346,10 +334,8 @@
 	"Prompts": "Prompts",
 	"Pull \"{{searchValue}}\" from Ollama.com": "Extrair \"{{searchValue}}\" do Ollama.com",
 	"Pull a model from Ollama.com": "Extrair um modelo do Ollama.com",
-	"Pull Progress": "Progresso da Extração",
 	"Query Params": "Parâmetros de Consulta",
 	"RAG Template": "Modelo RAG",
-	"Raw Format": "Formato Bruto",
 	"Read Aloud": "Ler em Voz Alta",
 	"Record voice": "Gravar voz",
 	"Redirecting you to OpenWebUI Community": "Redirecionando você para a Comunidade OpenWebUI",
@@ -360,7 +346,6 @@
 	"Remove Model": "Remover Modelo",
 	"Rename": "Renomear",
 	"Repeat Last N": "Repetir Últimos N",
-	"Repeat Penalty": "Penalidade de Repetição",
 	"Request Mode": "Modo de Solicitação",
 	"Reranking Model": "Modelo de Reranking",
 	"Reranking model disabled": "Modelo de Reranking desativado",
@@ -387,10 +372,12 @@
 	"See readme.md for instructions": "Consulte readme.md para obter instruções",
 	"See what's new": "Veja o que há de novo",
 	"Seed": "Semente",
+	"Select a base model": "",
 	"Select a mode": "Selecione um modo",
 	"Select a model": "Selecione um modelo",
 	"Select an Ollama instance": "Selecione uma instância Ollama",
 	"Select model": "Selecione um modelo",
+	"Selected model(s) do not support image inputs": "",
 	"Send": "Enviar",
 	"Send a Message": "Enviar uma Mensagem",
 	"Send message": "Enviar mensagem",
@@ -412,7 +399,6 @@
 	"Share to OpenWebUI Community": "Compartilhar com a Comunidade OpenWebUI",
 	"short-summary": "resumo-curto",
 	"Show": "Mostrar",
-	"Show Additional Params": "Mostrar Parâmetros Adicionais",
 	"Show shortcuts": "Mostrar",
 	"Showcased creativity": "Criatividade Exibida",
 	"sidebar": "barra lateral",
@@ -431,7 +417,6 @@
 	"Success": "Sucesso",
 	"Successfully updated.": "Atualizado com sucesso.",
 	"Suggested": "Sugerido",
-	"Sync All": "Sincronizar Tudo",
 	"System": "Sistema",
 	"System Prompt": "Prompt do Sistema",
 	"Tags": "Tags",
@@ -502,6 +487,7 @@
 	"Write a summary in 50 words that summarizes [topic or keyword].": "Escreva um resumo em 50 palavras que resuma [tópico ou palavra-chave].",
 	"Yesterday": "Ontem",
 	"You": "Você",
+	"You cannot clone a base model": "",
 	"You have no archived conversations.": "Você não tem bate-papos arquivados.",
 	"You have shared this chat": "Você compartilhou este bate-papo",
 	"You're a helpful assistant.": "Você é um assistente útil.",

+ 23 - 37
src/lib/i18n/locales/ru-RU/translation.json

@@ -3,6 +3,8 @@
 	"(Beta)": "(бета)",
 	"(e.g. `sh webui.sh --api`)": "(например: `sh webui.sh --api`)",
 	"(latest)": "(последний)",
+	"{{ models }}": "",
+	"{{ owner }}: You cannot delete a base model": "",
 	"{{modelName}} is thinking...": "{{modelName}} думает...",
 	"{{user}}'s Chats": "{{user}} чаты",
 	"{{webUIName}} Backend Required": "{{webUIName}} бэкенд требуемый",
@@ -12,9 +14,8 @@
 	"Account": "Аккаунт",
 	"Accurate information": "Точная информация",
 	"Add": "Добавить",
-	"Add a model": "Добавьте модель",
-	"Add a model tag name": "Добавьте имя тэга модели",
-	"Add a short description about what this modelfile does": "Добавьте краткое описание, что делает этот моделфайл",
+	"Add a model id": "",
+	"Add a short description about what this model does": "",
 	"Add a short title for this prompt": "Добавьте краткий заголовок для этого ввода",
 	"Add a tag": "Добавьте тэг",
 	"Add custom prompt": "Добавьте пользовательский ввод",
@@ -30,6 +31,7 @@
 	"Admin Panel": "Панель админ",
 	"Admin Settings": "Настройки админ",
 	"Advanced Parameters": "Расширенные Параметры",
+	"Advanced Params": "",
 	"all": "всё",
 	"All Documents": "Все документы",
 	"All Users": "Все пользователи",
@@ -44,7 +46,6 @@
 	"API Key": "Ключ API",
 	"API Key created.": "Ключ API создан.",
 	"API keys": "Ключи API",
-	"API RPM": "API RPM",
 	"April": "Апрель",
 	"Archive": "Архив",
 	"Archived Chats": "запис на чат",
@@ -61,12 +62,12 @@
 	"available!": "доступный!",
 	"Back": "Назад",
 	"Bad Response": "Недопустимый ответ",
+	"Base Model (From)": "",
 	"before": "до",
 	"Being lazy": "ленивый",
-	"Builder Mode": "Режим конструктор",
 	"Bypass SSL verification for Websites": "",
 	"Cancel": "Аннулировать",
-	"Categories": "Категории",
+	"Capabilities": "",
 	"Change Password": "Изменить пароль",
 	"Chat": "Чат",
 	"Chat Bubble UI": "Bubble UI чат",
@@ -84,7 +85,6 @@
 	"Citation": "Цитата",
 	"Click here for help.": "Нажмите здесь для помощи.",
 	"Click here to": "Нажмите здесь чтобы",
-	"Click here to check other modelfiles.": "Нажмите тут чтобы проверить другие файлы моделей.",
 	"Click here to select": "Нажмите тут чтобы выберите",
 	"Click here to select a csv file.": "Нажмите здесь чтобы выбрать файл csv.",
 	"Click here to select documents.": "Нажмите здесь чтобы выберите документы.",
@@ -109,7 +109,7 @@
 	"Copy Link": "Копировать ссылку",
 	"Copying to clipboard was successful!": "Копирование в буфер обмена прошло успешно!",
 	"Create a concise, 3-5 word phrase as a header for the following query, strictly adhering to the 3-5 word limit and avoiding the use of the word 'title':": "",
-	"Create a modelfile": "Создать модельный файл",
+	"Create a model": "",
 	"Create Account": "Создать аккаунт",
 	"Create new key": "Создать новый ключ",
 	"Create new secret key": "Создать новый секретный ключ",
@@ -118,7 +118,7 @@
 	"Current Model": "Текущая модель",
 	"Current Password": "Текущий пароль",
 	"Custom": "Пользовательский",
-	"Customize Ollama models for a specific purpose": "Настроить модели Ollama для конкретной цели",
+	"Customize models for a specific purpose": "",
 	"Dark": "Тёмный",
 	"Dashboard": "Панель управления",
 	"Database": "База данных",
@@ -139,11 +139,11 @@
 	"delete this link": "удалить эту ссылку",
 	"Delete User": "Удалить пользователя",
 	"Deleted {{deleteModelTag}}": "Удалено {{deleteModelTag}}",
-	"Deleted {{tagName}}": "Удалено {{tagName}}",
+	"Deleted {{name}}": "",
 	"Description": "Описание",
 	"Didn't fully follow instructions": "Не полностью следул инструкциям",
 	"Disabled": "Отключено",
-	"Discover a modelfile": "Найти файл модели",
+	"Discover a model": "",
 	"Discover a prompt": "Найти промт",
 	"Discover, download, and explore custom prompts": "Находите, загружайте и исследуйте настраиваемые промты",
 	"Discover, download, and explore model presets": "Находите, загружайте и исследуйте предустановки модели",
@@ -177,11 +177,6 @@
 	"Enter Chunk Size": "Введите размер фрагмента",
 	"Enter Image Size (e.g. 512x512)": "Введите размер изображения (например, 512x512)",
 	"Enter language codes": "Введите коды языков",
-	"Enter LiteLLM API Base URL (litellm_params.api_base)": "Введите базовый URL API LiteLLM (litellm_params.api_base)",
-	"Enter LiteLLM API Key (litellm_params.api_key)": "Введите ключ API LiteLLM (litellm_params.api_key)",
-	"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 tag (e.g. {{modelTag}})": "Введите тег модели (например, {{modelTag}})",
 	"Enter Number of Steps (e.g. 50)": "Введите количество шагов (например, 50)",
 	"Enter Score": "Введите оценку",
@@ -197,7 +192,7 @@
 	"Export All Chats (All Users)": "Экспортировать все чаты (все пользователи)",
 	"Export Chats": "Экспортировать чаты",
 	"Export Documents Mapping": "Экспортировать отображение документов",
-	"Export Modelfiles": "Экспортировать файлы модели",
+	"Export Models": "",
 	"Export Prompts": "Экспортировать промты",
 	"Failed to create API Key.": "Не удалось создать ключ API.",
 	"Failed to read clipboard contents": "Не удалось прочитать содержимое буфера обмена",
@@ -210,7 +205,7 @@
 	"Focus chat input": "Фокус ввода чата",
 	"Followed instructions perfectly": "Учитывая инструкции идеально",
 	"Format your variables using square brackets like this:": "Форматируйте ваши переменные, используя квадратные скобки, как здесь:",
-	"From (Base Model)": "Из (базой модель)",
+	"Frequencey Penalty": "",
 	"Full Screen Mode": "Полноэкранный режим",
 	"General": "Общее",
 	"General Settings": "Общие настройки",
@@ -222,7 +217,6 @@
 	"Hello, {{name}}": "Привет, {{name}}",
 	"Help": "Помощь",
 	"Hide": "Скрыть",
-	"Hide Additional Params": "Скрыть дополнительные параметры",
 	"How can I help you today?": "Чем я могу помочь вам сегодня?",
 	"Hybrid Search": "Гибридная поисковая система",
 	"Image Generation (Experimental)": "Генерация изображений (Экспериментально)",
@@ -231,7 +225,7 @@
 	"Images": "Изображения",
 	"Import Chats": "Импорт чатов",
 	"Import Documents Mapping": "Импорт сопоставления документов",
-	"Import Modelfiles": "Импорт файлов модели",
+	"Import Models": "",
 	"Import Prompts": "Импорт подсказок",
 	"Include `--api` flag when running stable-diffusion-webui": "Добавьте флаг `--api` при запуске stable-diffusion-webui",
 	"Input commands": "Введите команды",
@@ -240,6 +234,7 @@
 	"January": "Январь",
 	"join our Discord for help.": "присоединяйтесь к нашему Discord для помощи.",
 	"JSON": "JSON",
+	"JSON Preview": "",
 	"July": "Июль",
 	"June": "Июнь",
 	"JWT Expiration": "Истечение срока JWT",
@@ -254,11 +249,10 @@
 	"LTR": "LTR",
 	"Made by OpenWebUI Community": "Сделано сообществом OpenWebUI",
 	"Make sure to enclose them with": "Убедитесь, что они заключены в",
-	"Manage LiteLLM Models": "Управление моделями LiteLLM",
 	"Manage Models": "Управление моделями",
 	"Manage Ollama Models": "Управление моделями Ollama",
 	"March": "Март",
-	"Max Tokens": "Максимальное количество токенов",
+	"Max Tokens (num_predict)": "",
 	"Maximum of 3 models can be downloaded simultaneously. Please try again later.": "Максимальное количество моделей для загрузки одновременно - 3. Пожалуйста, попробуйте позже.",
 	"May": "Май",
 	"Memories accessible by LLMs will be shown here.": "Мемории, доступные LLMs, будут отображаться здесь.",
@@ -273,22 +267,19 @@
 	"Model '{{modelName}}' has been successfully downloaded.": "Модель '{{modelName}}' успешно загружена.",
 	"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 filesystem path detected. Model shortname is required for update, cannot continue.": "Модель файловой системы обнаружена. Требуется имя тега модели для обновления, не удается продолжить.",
-	"Model Name": "Имя модели",
+	"Model ID": "",
 	"Model not selected": "Модель не выбрана",
-	"Model Tag Name": "Имя тега модели",
+	"Model Params": "",
 	"Model Whitelisting": "Включение модели в белый список",
 	"Model(s) Whitelisted": "Модель(и) включены в белый список",
-	"Modelfile": "Файл модели",
-	"Modelfile Advanced Settings": "Дополнительные настройки файла модели",
 	"Modelfile Content": "Содержимое файла модели",
-	"Modelfiles": "Файлы моделей",
 	"Models": "Модели",
 	"More": "Более",
 	"Name": "Имя",
 	"Name Tag": "Имя тега",
-	"Name your modelfile": "Назовите свой файл модели",
+	"Name your model": "",
 	"New Chat": "Новый чат",
 	"New Password": "Новый пароль",
 	"No results found": "Результатов не найдено",
@@ -296,8 +287,6 @@
 	"No search results found": "",
 	"No source available": "Нет доступных источников",
 	"Not factually correct": "Не фактически правильно",
-	"Not sure what to add?": "Не уверены, что добавить?",
-	"Not sure what to write? Switch to": "Не уверены, что написать? Переключитесь на",
 	"Note: If you set a minimum score, the search will only return documents with a score greater than or equal to the minimum score.": "Обратите внимание: Если вы установите минимальный балл, поиск будет возвращать только документы с баллом больше или равным минимальному баллу.",
 	"Notifications": "Уведомления на рабочем столе",
 	"November": "Ноябрь",
@@ -326,7 +315,6 @@
 	"or": "или",
 	"Other": "Прочее",
 	"Overview": "Обзор",
-	"Parameters": "Параметры",
 	"Password": "Пароль",
 	"PDF document (.pdf)": "PDF-документ (.pdf)",
 	"PDF Extract Images (OCR)": "Извлечение изображений из PDF (OCR)",
@@ -346,10 +334,8 @@
 	"Prompts": "Промпты",
 	"Pull \"{{searchValue}}\" from Ollama.com": "Загрузить модель из Ollama.com",
 	"Pull a model from Ollama.com": "Загрузить модель с Ollama.com",
-	"Pull Progress": "Прогресс загрузки",
 	"Query Params": "Параметры запроса",
 	"RAG Template": "Шаблон RAG",
-	"Raw Format": "Сырой формат",
 	"Read Aloud": "Прочитать вслух",
 	"Record voice": "Записать голос",
 	"Redirecting you to OpenWebUI Community": "Перенаправляем вас в сообщество OpenWebUI",
@@ -360,7 +346,6 @@
 	"Remove Model": "Удалить модель",
 	"Rename": "Переименовать",
 	"Repeat Last N": "Повторить последние N",
-	"Repeat Penalty": "Штраф за повтор",
 	"Request Mode": "Режим запроса",
 	"Reranking Model": "Reranking модель",
 	"Reranking model disabled": "Модель реранжирования отключена",
@@ -387,10 +372,12 @@
 	"See readme.md for instructions": "Смотрите readme.md для инструкций",
 	"See what's new": "Посмотреть, что нового",
 	"Seed": "Сид",
+	"Select a base model": "",
 	"Select a mode": "Выберите режим",
 	"Select a model": "Выберите модель",
 	"Select an Ollama instance": "Выберите экземпляр Ollama",
 	"Select model": "Выберите модель",
+	"Selected model(s) do not support image inputs": "",
 	"Send": "Отправить",
 	"Send a Message": "Отправить сообщение",
 	"Send message": "Отправить сообщение",
@@ -412,7 +399,6 @@
 	"Share to OpenWebUI Community": "Поделиться с сообществом OpenWebUI",
 	"short-summary": "краткое описание",
 	"Show": "Показать",
-	"Show Additional Params": "Показать дополнительные параметры",
 	"Show shortcuts": "Показать клавиатурные сокращения",
 	"Showcased creativity": "Показать творчество",
 	"sidebar": "боковая панель",
@@ -431,7 +417,6 @@
 	"Success": "Успех",
 	"Successfully updated.": "Успешно обновлено.",
 	"Suggested": "Предложено",
-	"Sync All": "Синхронизировать все",
 	"System": "Система",
 	"System Prompt": "Системный промпт",
 	"Tags": "Теги",
@@ -502,6 +487,7 @@
 	"Write a summary in 50 words that summarizes [topic or keyword].": "Напишите резюме в 50 словах, которое кратко описывает [тему или ключевое слово].",
 	"Yesterday": "Вчера",
 	"You": "Вы",
+	"You cannot clone a base model": "",
 	"You have no archived conversations.": "У вас нет архивированных бесед.",
 	"You have shared this chat": "Вы поделились этим чатом",
 	"You're a helpful assistant.": "Вы полезный ассистент.",

+ 23 - 37
src/lib/i18n/locales/sr-RS/translation.json

@@ -3,6 +3,8 @@
 	"(Beta)": "(бета)",
 	"(e.g. `sh webui.sh --api`)": "(нпр. `sh webui.sh --api`)",
 	"(latest)": "(најновије)",
+	"{{ models }}": "",
+	"{{ owner }}: You cannot delete a base model": "",
 	"{{modelName}} is thinking...": "{{modelName}} размишља...",
 	"{{user}}'s Chats": "Ћаскања корисника {{user}}",
 	"{{webUIName}} Backend Required": "Захтева се {{webUIName}} позадинац",
@@ -12,9 +14,8 @@
 	"Account": "Налог",
 	"Accurate information": "Прецизне информације",
 	"Add": "Додај",
-	"Add a model": "Додај модел",
-	"Add a model tag name": "Додај ознаку модела",
-	"Add a short description about what this modelfile does": "Додај кратак опис ове модел-датотеке",
+	"Add a model id": "",
+	"Add a short description about what this model does": "",
 	"Add a short title for this prompt": "Додај кратак наслов за овај упит",
 	"Add a tag": "Додај ознаку",
 	"Add custom prompt": "Додај прилагођен упит",
@@ -30,6 +31,7 @@
 	"Admin Panel": "Админ табла",
 	"Admin Settings": "Админ подешавања",
 	"Advanced Parameters": "Напредни параметри",
+	"Advanced Params": "",
 	"all": "сви",
 	"All Documents": "Сви документи",
 	"All Users": "Сви корисници",
@@ -44,7 +46,6 @@
 	"API Key": "API кључ",
 	"API Key created.": "API кључ направљен.",
 	"API keys": "API кључеви",
-	"API RPM": "API RPM",
 	"April": "Април",
 	"Archive": "Архива",
 	"Archived Chats": "Архивирана ћаскања",
@@ -61,12 +62,12 @@
 	"available!": "доступно!",
 	"Back": "Назад",
 	"Bad Response": "Лош одговор",
+	"Base Model (From)": "",
 	"before": "пре",
 	"Being lazy": "Бити лењ",
-	"Builder Mode": "Режим градитеља",
 	"Bypass SSL verification for Websites": "Заобиђи SSL потврђивање за веб странице",
 	"Cancel": "Откажи",
-	"Categories": "Категорије",
+	"Capabilities": "",
 	"Change Password": "Промени лозинку",
 	"Chat": "Ћаскање",
 	"Chat Bubble UI": "Интерфејс балона ћаскања",
@@ -84,7 +85,6 @@
 	"Citation": "Цитат",
 	"Click here for help.": "Кликните овде за помоћ.",
 	"Click here to": "Кликните овде да",
-	"Click here to check other modelfiles.": "Кликните овде да проверите друге модел-датотеке.",
 	"Click here to select": "Кликните овде да изаберете",
 	"Click here to select a csv file.": "Кликните овде да изаберете csv датотеку.",
 	"Click here to select documents.": "Кликните овде да изаберете документе.",
@@ -109,7 +109,7 @@
 	"Copy Link": "Копирај везу",
 	"Copying to clipboard was successful!": "Успешно копирање у оставу!",
 	"Create a concise, 3-5 word phrase as a header for the following query, strictly adhering to the 3-5 word limit and avoiding the use of the word 'title':": "Направи сажету фразу од 3 до 5 речи као наслов за следећи упит, строго се придржавајући ограничења од 3-5 речи и избегавајући коришћење речи „наслов“:",
-	"Create a modelfile": "Направи модел-датотеку",
+	"Create a model": "",
 	"Create Account": "Направи налог",
 	"Create new key": "Направи нови кључ",
 	"Create new secret key": "Направи нови тајни кључ",
@@ -118,7 +118,7 @@
 	"Current Model": "Тренутни модел",
 	"Current Password": "Тренутна лозинка",
 	"Custom": "Прилагођено",
-	"Customize Ollama models for a specific purpose": "Прилагоди Ollama моделе за специфичну намену",
+	"Customize models for a specific purpose": "",
 	"Dark": "Тамна",
 	"Dashboard": "Контролна табла",
 	"Database": "База података",
@@ -139,11 +139,11 @@
 	"delete this link": "обриши ову везу",
 	"Delete User": "Обриши корисника",
 	"Deleted {{deleteModelTag}}": "Обрисано {{deleteModelTag}}",
-	"Deleted {{tagName}}": "Обрисано {{tagName}}",
+	"Deleted {{name}}": "",
 	"Description": "Опис",
 	"Didn't fully follow instructions": "Упутства нису праћена у потпуности",
 	"Disabled": "Онемогућено",
-	"Discover a modelfile": "Откриј модел-датотеку",
+	"Discover a model": "",
 	"Discover a prompt": "Откриј упит",
 	"Discover, download, and explore custom prompts": "Откријте, преузмите и истражите прилагођене упите",
 	"Discover, download, and explore model presets": "Откријте, преузмите и истражите образце модела",
@@ -177,11 +177,6 @@
 	"Enter Chunk Size": "Унесите величину дела",
 	"Enter Image Size (e.g. 512x512)": "Унесите величину слике (нпр. 512x512)",
 	"Enter language codes": "Унесите кодове језика",
-	"Enter LiteLLM API Base URL (litellm_params.api_base)": "Унесите основни URL LiteLLM API (litellm_params.api_base)",
-	"Enter LiteLLM API Key (litellm_params.api_key)": "Унесите LiteLLM API кључ (litellm_params.api_key)",
-	"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 tag (e.g. {{modelTag}})": "Унесите ознаку модела (нпр. {{modelTag}})",
 	"Enter Number of Steps (e.g. 50)": "Унесите број корака (нпр. 50)",
 	"Enter Score": "Унесите резултат",
@@ -197,7 +192,7 @@
 	"Export All Chats (All Users)": "Извези сва ћаскања (сви корисници)",
 	"Export Chats": "Извези ћаскања",
 	"Export Documents Mapping": "Извези мапирање докумената",
-	"Export Modelfiles": "Извези модел-датотеке",
+	"Export Models": "",
 	"Export Prompts": "Извези упите",
 	"Failed to create API Key.": "Неуспешно стварање API кључа.",
 	"Failed to read clipboard contents": "Неуспешно читање садржаја оставе",
@@ -210,7 +205,7 @@
 	"Focus chat input": "Усредсредите унос ћаскања",
 	"Followed instructions perfectly": "Упутства су савршено праћена",
 	"Format your variables using square brackets like this:": "Форматирајте ваше променљиве користећи угластe заграде овако:",
-	"From (Base Model)": "Од (основни модел)",
+	"Frequencey Penalty": "",
 	"Full Screen Mode": "Режим целог екрана",
 	"General": "Опште",
 	"General Settings": "Општа подешавања",
@@ -222,7 +217,6 @@
 	"Hello, {{name}}": "Здраво, {{name}}",
 	"Help": "Помоћ",
 	"Hide": "Сакриј",
-	"Hide Additional Params": "Сакриј додатне параметре",
 	"How can I help you today?": "Како могу да вам помогнем данас?",
 	"Hybrid Search": "Хибридна претрага",
 	"Image Generation (Experimental)": "Стварање слика (експериментално)",
@@ -231,7 +225,7 @@
 	"Images": "Слике",
 	"Import Chats": "Увези ћаскања",
 	"Import Documents Mapping": "Увези мапирање докумената",
-	"Import Modelfiles": "Увези модел-датотеке",
+	"Import Models": "",
 	"Import Prompts": "Увези упите",
 	"Include `--api` flag when running stable-diffusion-webui": "Укључи `--api` заставицу при покретању stable-diffusion-webui",
 	"Input commands": "Унеси наредбе",
@@ -240,6 +234,7 @@
 	"January": "Јануар",
 	"join our Discord for help.": "придружите се нашем Дискорду за помоћ.",
 	"JSON": "JSON",
+	"JSON Preview": "",
 	"July": "Јул",
 	"June": "Јун",
 	"JWT Expiration": "Истек JWT-а",
@@ -254,11 +249,10 @@
 	"LTR": "ЛНД",
 	"Made by OpenWebUI Community": "Израдила OpenWebUI заједница",
 	"Make sure to enclose them with": "Уверите се да их затворите са",
-	"Manage LiteLLM Models": "Управљај LiteLLM моделима",
 	"Manage Models": "Управљај моделима",
 	"Manage Ollama Models": "Управљај Ollama моделима",
 	"March": "Март",
-	"Max Tokens": "Највише жетона",
+	"Max Tokens (num_predict)": "",
 	"Maximum of 3 models can be downloaded simultaneously. Please try again later.": "Највише 3 модела могу бити преузета истовремено. Покушајте поново касније.",
 	"May": "Мај",
 	"Memories accessible by LLMs will be shown here.": "Памћења које ће бити појављена од овог LLM-а ће бити приказана овде.",
@@ -273,22 +267,19 @@
 	"Model '{{modelName}}' has been successfully downloaded.": "Модел „{{modelName}}“ је успешно преузет.",
 	"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 filesystem path detected. Model shortname is required for update, cannot continue.": "Откривена путања система датотека модела. За ажурирање је потребан кратак назив модела, не може се наставити.",
-	"Model Name": "Назив модела",
+	"Model ID": "",
 	"Model not selected": "Модел није изабран",
-	"Model Tag Name": "Назив ознаке модела",
+	"Model Params": "",
 	"Model Whitelisting": "Бели списак модела",
 	"Model(s) Whitelisted": "Модел(и) на белом списку",
-	"Modelfile": "Модел-датотека",
-	"Modelfile Advanced Settings": "Напредна подешавања модел-датотеке",
 	"Modelfile Content": "Садржај модел-датотеке",
-	"Modelfiles": "Модел-датотеке",
 	"Models": "Модели",
 	"More": "Више",
 	"Name": "Име",
 	"Name Tag": "Назив ознаке",
-	"Name your modelfile": "Назовите вашу модел-датотеку",
+	"Name your model": "",
 	"New Chat": "Ново ћаскање",
 	"New Password": "Нова лозинка",
 	"No results found": "Нема резултата",
@@ -296,8 +287,6 @@
 	"No search results found": "",
 	"No source available": "Нема доступног извора",
 	"Not factually correct": "Није чињенично тачно",
-	"Not sure what to add?": "Нисте сигурни шта да додате?",
-	"Not sure what to write? Switch to": "Нисте сигурни шта да напишете? Пребаците се на",
 	"Note: If you set a minimum score, the search will only return documents with a score greater than or equal to the minimum score.": "Напомена: ако подесите најмањи резултат, претрага ће вратити само документе са резултатом већим или једнаким најмањем резултату.",
 	"Notifications": "Обавештења",
 	"November": "Новембар",
@@ -326,7 +315,6 @@
 	"or": "или",
 	"Other": "Остало",
 	"Overview": "Преглед",
-	"Parameters": "Параметри",
 	"Password": "Лозинка",
 	"PDF document (.pdf)": "PDF документ (.pdf)",
 	"PDF Extract Images (OCR)": "Извлачење PDF слика (OCR)",
@@ -346,10 +334,8 @@
 	"Prompts": "Упити",
 	"Pull \"{{searchValue}}\" from Ollama.com": "Повуците \"{{searchValue}}\" са Ollama.com",
 	"Pull a model from Ollama.com": "Повуците модел са Ollama.com",
-	"Pull Progress": "Напредак повлачења",
 	"Query Params": "Параметри упита",
 	"RAG Template": "RAG шаблон",
-	"Raw Format": "Сирови формат",
 	"Read Aloud": "Прочитај наглас",
 	"Record voice": "Сними глас",
 	"Redirecting you to OpenWebUI Community": "Преусмеравање на OpenWebUI заједницу",
@@ -360,7 +346,6 @@
 	"Remove Model": "Уклони модел",
 	"Rename": "Преименуј",
 	"Repeat Last N": "Понови последњих N",
-	"Repeat Penalty": "Казна за понављање",
 	"Request Mode": "Режим захтева",
 	"Reranking Model": "Модел поновног рангирања",
 	"Reranking model disabled": "Модел поновног рангирања онемогућен",
@@ -387,10 +372,12 @@
 	"See readme.md for instructions": "Погледај readme.md за упутства",
 	"See what's new": "Погледај шта је ново",
 	"Seed": "Семе",
+	"Select a base model": "",
 	"Select a mode": "Изабери режим",
 	"Select a model": "Изабери модел",
 	"Select an Ollama instance": "Изабери Ollama инстанцу",
 	"Select model": "Изабери модел",
+	"Selected model(s) do not support image inputs": "",
 	"Send": "Пошаљи",
 	"Send a Message": "Пошаљи поруку",
 	"Send message": "Пошаљи поруку",
@@ -412,7 +399,6 @@
 	"Share to OpenWebUI Community": "Подели са OpenWebUI заједницом",
 	"short-summary": "кратак сажетак",
 	"Show": "Прикажи",
-	"Show Additional Params": "Прикажи додатне параметре",
 	"Show shortcuts": "Прикажи пречице",
 	"Showcased creativity": "Приказана креативност",
 	"sidebar": "бочна трака",
@@ -431,7 +417,6 @@
 	"Success": "Успех",
 	"Successfully updated.": "Успешно ажурирано.",
 	"Suggested": "Предложено",
-	"Sync All": "Усклади све",
 	"System": "Систем",
 	"System Prompt": "Системски упит",
 	"Tags": "Ознаке",
@@ -502,6 +487,7 @@
 	"Write a summary in 50 words that summarizes [topic or keyword].": "Напишите сажетак у 50 речи који резимира [тему или кључну реч].",
 	"Yesterday": "Јуче",
 	"You": "Ти",
+	"You cannot clone a base model": "",
 	"You have no archived conversations.": "Немате архивиране разговоре.",
 	"You have shared this chat": "Поделили сте ово ћаскање",
 	"You're a helpful assistant.": "Ти си користан помоћник.",

+ 23 - 37
src/lib/i18n/locales/sv-SE/translation.json

@@ -3,6 +3,8 @@
 	"(Beta)": "(Beta)",
 	"(e.g. `sh webui.sh --api`)": "(t.ex. `sh webui.sh --api`)",
 	"(latest)": "(senaste)",
+	"{{ models }}": "",
+	"{{ owner }}: You cannot delete a base model": "",
 	"{{modelName}} is thinking...": "{{modelName}} tänker...",
 	"{{user}}'s Chats": "{{user}}s Chats",
 	"{{webUIName}} Backend Required": "{{webUIName}} Backend krävs",
@@ -12,9 +14,8 @@
 	"Account": "Konto",
 	"Accurate information": "Exakt information",
 	"Add": "Lägg till",
-	"Add a model": "Lägg till en modell",
-	"Add a model tag name": "Lägg till ett modellnamn",
-	"Add a short description about what this modelfile does": "Lägg till en kort beskrivning av vad den här modelfilen gör",
+	"Add a model id": "",
+	"Add a short description about what this model does": "",
 	"Add a short title for this prompt": "Lägg till en kort titel för denna prompt",
 	"Add a tag": "Lägg till en tagg",
 	"Add custom prompt": "Lägg till en anpassad prompt",
@@ -30,6 +31,7 @@
 	"Admin Panel": "Administrationspanel",
 	"Admin Settings": "Administratörsinställningar",
 	"Advanced Parameters": "Avancerade parametrar",
+	"Advanced Params": "",
 	"all": "alla",
 	"All Documents": "Alla dokument",
 	"All Users": "Alla användare",
@@ -44,7 +46,6 @@
 	"API Key": "API-nyckel",
 	"API Key created.": "API-nyckel skapad.",
 	"API keys": "API-nycklar",
-	"API RPM": "API RPM",
 	"April": "April",
 	"Archive": "Arkiv",
 	"Archived Chats": "Arkiverade chattar",
@@ -61,12 +62,12 @@
 	"available!": "tillgänglig!",
 	"Back": "Tillbaka",
 	"Bad Response": "Felaktig respons",
+	"Base Model (From)": "",
 	"before": "før",
 	"Being lazy": "Lägg till",
-	"Builder Mode": "Byggarläge",
 	"Bypass SSL verification for Websites": "Kringgå SSL-verifiering för webbplatser",
 	"Cancel": "Avbryt",
-	"Categories": "Kategorier",
+	"Capabilities": "",
 	"Change Password": "Ändra lösenord",
 	"Chat": "Chatt",
 	"Chat Bubble UI": "Chatbubblar UI",
@@ -84,7 +85,6 @@
 	"Citation": "Citat",
 	"Click here for help.": "Klicka här för hjälp.",
 	"Click here to": "Klicka här för att",
-	"Click here to check other modelfiles.": "Klicka här för att kontrollera andra modelfiler.",
 	"Click here to select": "Klicka här för att välja",
 	"Click here to select a csv file.": "Klicka här för att välja en csv-fil.",
 	"Click here to select documents.": "Klicka här för att välja dokument.",
@@ -109,7 +109,7 @@
 	"Copy Link": "Kopiera länk",
 	"Copying to clipboard was successful!": "Kopiering till urklipp lyckades!",
 	"Create a concise, 3-5 word phrase as a header for the following query, strictly adhering to the 3-5 word limit and avoiding the use of the word 'title':": "Skapa en kort, 3-5 ords fras som rubrik för följande fråga, strikt följa 3-5 ordsgränsen och undvika användning av ordet 'titel':",
-	"Create a modelfile": "Skapa en modelfil",
+	"Create a model": "",
 	"Create Account": "Skapa konto",
 	"Create new key": "Skapa ny nyckel",
 	"Create new secret key": "Skapa ny hemlig nyckel",
@@ -118,7 +118,7 @@
 	"Current Model": "Aktuell modell",
 	"Current Password": "Nuvarande lösenord",
 	"Custom": "Anpassad",
-	"Customize Ollama models for a specific purpose": "Anpassa Ollama-modeller för ett specifikt ändamål",
+	"Customize models for a specific purpose": "",
 	"Dark": "Mörk",
 	"Dashboard": "Instrumentbräda",
 	"Database": "Databas",
@@ -139,11 +139,11 @@
 	"delete this link": "radera denna länk",
 	"Delete User": "Radera användare",
 	"Deleted {{deleteModelTag}}": "Raderad {{deleteModelTag}}",
-	"Deleted {{tagName}}": "Raderad {{tagName}}",
+	"Deleted {{name}}": "",
 	"Description": "Beskrivning",
 	"Didn't fully follow instructions": "Följde inte instruktionerna",
 	"Disabled": "Inaktiverad",
-	"Discover a modelfile": "Upptäck en modelfil",
+	"Discover a model": "",
 	"Discover a prompt": "Upptäck en prompt",
 	"Discover, download, and explore custom prompts": "Upptäck, ladda ner och utforska anpassade prompts",
 	"Discover, download, and explore model presets": "Upptäck, ladda ner och utforska modellförinställningar",
@@ -177,11 +177,6 @@
 	"Enter Chunk Size": "Ange Chunk-storlek",
 	"Enter Image Size (e.g. 512x512)": "Ange bildstorlek (t.ex. 512x512)",
 	"Enter language codes": "Skriv språkkoder",
-	"Enter LiteLLM API Base URL (litellm_params.api_base)": "Ange LiteLLM API-bas-URL (litellm_params.api_base)",
-	"Enter LiteLLM API Key (litellm_params.api_key)": "Ange LiteLLM API-nyckel (litellm_params.api_key)",
-	"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 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",
@@ -197,7 +192,7 @@
 	"Export All Chats (All Users)": "Exportera alla chattar (alla användare)",
 	"Export Chats": "Exportera chattar",
 	"Export Documents Mapping": "Exportera dokumentmappning",
-	"Export Modelfiles": "Exportera modelfiler",
+	"Export Models": "",
 	"Export Prompts": "Exportera prompts",
 	"Failed to create API Key.": "Misslyckades med att skapa API-nyckel.",
 	"Failed to read clipboard contents": "Misslyckades med att läsa urklippsinnehåll",
@@ -210,7 +205,7 @@
 	"Focus chat input": "Fokusera chattindata",
 	"Followed instructions perfectly": "Följde instruktionerna perfekt",
 	"Format your variables using square brackets like this:": "Formatera dina variabler med hakparenteser så här:",
-	"From (Base Model)": "Från (basmodell)",
+	"Frequencey Penalty": "",
 	"Full Screen Mode": "Helskärmsläge",
 	"General": "Allmän",
 	"General Settings": "Allmänna inställningar",
@@ -222,7 +217,6 @@
 	"Hello, {{name}}": "Hej, {{name}}",
 	"Help": "Hjelp",
 	"Hide": "Dölj",
-	"Hide Additional Params": "Dölj ytterligare parametrar",
 	"How can I help you today?": "Hur kan jag hjälpa dig idag?",
 	"Hybrid Search": "Hybrid sökning",
 	"Image Generation (Experimental)": "Bildgenerering (experimentell)",
@@ -231,7 +225,7 @@
 	"Images": "Bilder",
 	"Import Chats": "Importera chattar",
 	"Import Documents Mapping": "Importera dokumentmappning",
-	"Import Modelfiles": "Importera modelfiler",
+	"Import Models": "",
 	"Import Prompts": "Importera prompts",
 	"Include `--api` flag when running stable-diffusion-webui": "Inkludera `--api`-flagga när du kör stabil-diffusion-webui",
 	"Input commands": "Indatakommandon",
@@ -240,6 +234,7 @@
 	"January": "januar",
 	"join our Discord for help.": "gå med i vår Discord för hjälp.",
 	"JSON": "JSON",
+	"JSON Preview": "",
 	"July": "juli",
 	"June": "juni",
 	"JWT Expiration": "JWT-utgång",
@@ -254,11 +249,10 @@
 	"LTR": "LTR",
 	"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 Models": "Hantera modeller",
 	"Manage Ollama Models": "Hantera Ollama-modeller",
 	"March": "mars",
-	"Max Tokens": "Max antal tokens",
+	"Max Tokens (num_predict)": "",
 	"Maximum of 3 models can be downloaded simultaneously. Please try again later.": "Högst 3 modeller kan laddas ner samtidigt. Vänligen försök igen senare.",
 	"May": "mai",
 	"Memories accessible by LLMs will be shown here.": "Minnen som kan komma ihåg av LLM:er kommer att visas här.",
@@ -273,22 +267,19 @@
 	"Model '{{modelName}}' has been successfully downloaded.": "Modellen '{{modelName}}' har laddats ner framgångsrikt.",
 	"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 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 Name": "Modellnamn",
+	"Model ID": "",
 	"Model not selected": "Modell inte vald",
-	"Model Tag Name": "Modelltaggnamn",
+	"Model Params": "",
 	"Model Whitelisting": "Modellens vitlista",
 	"Model(s) Whitelisted": "Modell(er) vitlistade",
-	"Modelfile": "Modelfil",
-	"Modelfile Advanced Settings": "Modelfilens avancerade inställningar",
 	"Modelfile Content": "Modelfilens innehåll",
-	"Modelfiles": "Modelfiler",
 	"Models": "Modeller",
 	"More": "Mer",
 	"Name": "Namn",
 	"Name Tag": "Namntag",
-	"Name your modelfile": "Namnge din modelfil",
+	"Name your model": "",
 	"New Chat": "Ny chatt",
 	"New Password": "Nytt lösenord",
 	"No results found": "Inga resultat hittades",
@@ -296,8 +287,6 @@
 	"No search results found": "",
 	"No source available": "Ingen tilgjengelig kilde",
 	"Not factually correct": "Inte faktiskt korrekt",
-	"Not sure what to add?": "Inte säker på vad du ska lägga till?",
-	"Not sure what to write? Switch to": "Inte säker på vad du ska skriva? Växla till",
 	"Note: If you set a minimum score, the search will only return documents with a score greater than or equal to the minimum score.": "Merk: Hvis du angir en minimumspoengsum, returnerer søket bare dokumenter med en poengsum som er større enn eller lik minimumspoengsummen.",
 	"Notifications": "Notifikationer",
 	"November": "november",
@@ -326,7 +315,6 @@
 	"or": "eller",
 	"Other": "Andra",
 	"Overview": "Översikt",
-	"Parameters": "Parametrar",
 	"Password": "Lösenord",
 	"PDF document (.pdf)": "PDF-dokument (.pdf)",
 	"PDF Extract Images (OCR)": "PDF Extrahera bilder (OCR)",
@@ -346,10 +334,8 @@
 	"Prompts": "Prompts",
 	"Pull \"{{searchValue}}\" from Ollama.com": "Dra \"{{searchValue}}\" från Ollama.com",
 	"Pull a model from Ollama.com": "Dra en modell från Ollama.com",
-	"Pull Progress": "Dra framsteg",
 	"Query Params": "Frågeparametrar",
 	"RAG Template": "RAG-mall",
-	"Raw Format": "Råformat",
 	"Read Aloud": "Läs igenom",
 	"Record voice": "Spela in röst",
 	"Redirecting you to OpenWebUI Community": "Omdirigerar dig till OpenWebUI Community",
@@ -360,7 +346,6 @@
 	"Remove Model": "Ta bort modell",
 	"Rename": "Byt namn",
 	"Repeat Last N": "Upprepa senaste N",
-	"Repeat Penalty": "Upprepa straff",
 	"Request Mode": "Begär läge",
 	"Reranking Model": "Reranking modell",
 	"Reranking model disabled": "Reranking modell inaktiverad",
@@ -387,10 +372,12 @@
 	"See readme.md for instructions": "Se readme.md för instruktioner",
 	"See what's new": "Se vad som är nytt",
 	"Seed": "Seed",
+	"Select a base model": "",
 	"Select a mode": "Välj ett läge",
 	"Select a model": "Välj en modell",
 	"Select an Ollama instance": "Välj en Ollama-instans",
 	"Select model": "Välj en modell",
+	"Selected model(s) do not support image inputs": "",
 	"Send": "Skicka",
 	"Send a Message": "Skicka ett meddelande",
 	"Send message": "Skicka meddelande",
@@ -412,7 +399,6 @@
 	"Share to OpenWebUI Community": "Dela till OpenWebUI Community",
 	"short-summary": "kort sammanfattning",
 	"Show": "Visa",
-	"Show Additional Params": "Visa ytterligare parametrar",
 	"Show shortcuts": "Visa genvägar",
 	"Showcased creativity": "Visuell kreativitet",
 	"sidebar": "sidofält",
@@ -431,7 +417,6 @@
 	"Success": "Framgång",
 	"Successfully updated.": "Uppdaterades framgångsrikt.",
 	"Suggested": "Föreslagen",
-	"Sync All": "Synkronisera allt",
 	"System": "System",
 	"System Prompt": "Systemprompt",
 	"Tags": "Taggar",
@@ -502,6 +487,7 @@
 	"Write a summary in 50 words that summarizes [topic or keyword].": "Skriv en sammanfattning på 50 ord som sammanfattar [ämne eller nyckelord].",
 	"Yesterday": "Igenom",
 	"You": "du",
+	"You cannot clone a base model": "",
 	"You have no archived conversations.": "Du har inga arkiverade konversationer.",
 	"You have shared this chat": "Du har delat denna chatt",
 	"You're a helpful assistant.": "Du är en hjälpsam assistent.",

+ 23 - 37
src/lib/i18n/locales/tr-TR/translation.json

@@ -3,6 +3,8 @@
 	"(Beta)": "(Beta)",
 	"(e.g. `sh webui.sh --api`)": "(örn. `sh webui.sh --api`)",
 	"(latest)": "(en son)",
+	"{{ models }}": "",
+	"{{ owner }}: You cannot delete a base model": "",
 	"{{modelName}} is thinking...": "{{modelName}} düşünüyor...",
 	"{{user}}'s Chats": "{{user}} Sohbetleri",
 	"{{webUIName}} Backend Required": "{{webUIName}} Arkayüz Gerekli",
@@ -12,9 +14,8 @@
 	"Account": "Hesap",
 	"Accurate information": "Doğru bilgi",
 	"Add": "Ekle",
-	"Add a model": "Bir model ekleyin",
-	"Add a model tag name": "Bir model etiket adı ekleyin",
-	"Add a short description about what this modelfile does": "Bu model dosyasının ne yaptığı hakkında kısa bir açıklama ekleyin",
+	"Add a model id": "",
+	"Add a short description about what this model does": "",
 	"Add a short title for this prompt": "Bu prompt için kısa bir başlık ekleyin",
 	"Add a tag": "Bir etiket ekleyin",
 	"Add custom prompt": "Özel prompt ekle",
@@ -30,6 +31,7 @@
 	"Admin Panel": "Yönetici Paneli",
 	"Admin Settings": "Yönetici Ayarları",
 	"Advanced Parameters": "Gelişmiş Parametreler",
+	"Advanced Params": "",
 	"all": "tümü",
 	"All Documents": "Tüm Belgeler",
 	"All Users": "Tüm Kullanıcılar",
@@ -44,7 +46,6 @@
 	"API Key": "API Anahtarı",
 	"API Key created.": "API Anahtarı oluşturuldu.",
 	"API keys": "API anahtarları",
-	"API RPM": "API RPM",
 	"April": "Nisan",
 	"Archive": "Arşiv",
 	"Archived Chats": "Arşivlenmiş Sohbetler",
@@ -61,12 +62,12 @@
 	"available!": "mevcut!",
 	"Back": "Geri",
 	"Bad Response": "Kötü Yanıt",
+	"Base Model (From)": "",
 	"before": "önce",
 	"Being lazy": "Tembelleşiyor",
-	"Builder Mode": "Oluşturucu Modu",
 	"Bypass SSL verification for Websites": "Web Siteleri için SSL doğrulamasını atlayın",
 	"Cancel": "İptal",
-	"Categories": "Kategoriler",
+	"Capabilities": "",
 	"Change Password": "Parola Değiştir",
 	"Chat": "Sohbet",
 	"Chat Bubble UI": "Sohbet Balonu UI",
@@ -84,7 +85,6 @@
 	"Citation": "Alıntı",
 	"Click here for help.": "Yardım için buraya tıklayın.",
 	"Click here to": "Şunu yapmak için buraya tıklayın:",
-	"Click here to check other modelfiles.": "Diğer model dosyalarını kontrol etmek için buraya tıklayın.",
 	"Click here to select": "Seçmek için buraya tıklayın",
 	"Click here to select a csv file.": "Bir CSV dosyası seçmek için buraya tıklayın.",
 	"Click here to select documents.": "Belgeleri seçmek için buraya tıklayın.",
@@ -109,7 +109,7 @@
 	"Copy Link": "Bağlantıyı Kopyala",
 	"Copying to clipboard was successful!": "Panoya kopyalama başarılı!",
 	"Create a concise, 3-5 word phrase as a header for the following query, strictly adhering to the 3-5 word limit and avoiding the use of the word 'title':": "Aşağıdaki sorgu için başlık olarak 3-5 kelimelik kısa ve öz bir ifade oluşturun, 3-5 kelime sınırına kesinlikle uyun ve 'başlık' kelimesini kullanmaktan kaçının:",
-	"Create a modelfile": "Bir model dosyası oluştur",
+	"Create a model": "",
 	"Create Account": "Hesap Oluştur",
 	"Create new key": "Yeni anahtar oluştur",
 	"Create new secret key": "Yeni gizli anahtar oluştur",
@@ -118,7 +118,7 @@
 	"Current Model": "Mevcut Model",
 	"Current Password": "Mevcut Parola",
 	"Custom": "Özel",
-	"Customize Ollama models for a specific purpose": "Ollama modellerini belirli bir amaç için özelleştirin",
+	"Customize models for a specific purpose": "",
 	"Dark": "Koyu",
 	"Dashboard": "Panel",
 	"Database": "Veritabanı",
@@ -139,11 +139,11 @@
 	"delete this link": "bu bağlantıyı sil",
 	"Delete User": "Kullanıcıyı Sil",
 	"Deleted {{deleteModelTag}}": "{{deleteModelTag}} silindi",
-	"Deleted {{tagName}}": "{{tagName}} silindi",
+	"Deleted {{name}}": "",
 	"Description": "Açıklama",
 	"Didn't fully follow instructions": "Talimatları tam olarak takip etmedi",
 	"Disabled": "Devre Dışı",
-	"Discover a modelfile": "Bir model dosyası keşfedin",
+	"Discover a model": "",
 	"Discover a prompt": "Bir prompt keşfedin",
 	"Discover, download, and explore custom prompts": "Özel promptları keşfedin, indirin ve inceleyin",
 	"Discover, download, and explore model presets": "Model ön ayarlarını keşfedin, indirin ve inceleyin",
@@ -177,11 +177,6 @@
 	"Enter Chunk Size": "Chunk Boyutunu Girin",
 	"Enter Image Size (e.g. 512x512)": "Görüntü Boyutunu Girin (örn. 512x512)",
 	"Enter language codes": "Dil kodlarını girin",
-	"Enter LiteLLM API Base URL (litellm_params.api_base)": "LiteLLM API Ana URL'sini Girin (litellm_params.api_base)",
-	"Enter LiteLLM API Key (litellm_params.api_key)": "LiteLLM API Anahtarını Girin (litellm_params.api_key)",
-	"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 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",
@@ -197,7 +192,7 @@
 	"Export All Chats (All Users)": "Tüm Sohbetleri Dışa Aktar (Tüm Kullanıcılar)",
 	"Export Chats": "Sohbetleri Dışa Aktar",
 	"Export Documents Mapping": "Belge Eşlemesini Dışa Aktar",
-	"Export Modelfiles": "Model Dosyalarını Dışa Aktar",
+	"Export Models": "",
 	"Export Prompts": "Promptları Dışa Aktar",
 	"Failed to create API Key.": "API Anahtarı oluşturulamadı.",
 	"Failed to read clipboard contents": "Pano içeriği okunamadı",
@@ -210,7 +205,7 @@
 	"Focus chat input": "Sohbet girişine odaklan",
 	"Followed instructions perfectly": "Talimatları mükemmel şekilde takip etti",
 	"Format your variables using square brackets like this:": "Değişkenlerinizi şu şekilde kare parantezlerle biçimlendirin:",
-	"From (Base Model)": "(Temel Model)'den",
+	"Frequencey Penalty": "",
 	"Full Screen Mode": "Tam Ekran Modu",
 	"General": "Genel",
 	"General Settings": "Genel Ayarlar",
@@ -222,7 +217,6 @@
 	"Hello, {{name}}": "Merhaba, {{name}}",
 	"Help": "Yardım",
 	"Hide": "Gizle",
-	"Hide Additional Params": "Ek Parametreleri Gizle",
 	"How can I help you today?": "Bugün size nasıl yardımcı olabilirim?",
 	"Hybrid Search": "Karma Arama",
 	"Image Generation (Experimental)": "Görüntü Oluşturma (Deneysel)",
@@ -231,7 +225,7 @@
 	"Images": "Görüntüler",
 	"Import Chats": "Sohbetleri İçe Aktar",
 	"Import Documents Mapping": "Belge Eşlemesini İçe Aktar",
-	"Import Modelfiles": "Model Dosyalarını İçe Aktar",
+	"Import Models": "",
 	"Import Prompts": "Promptları İçe Aktar",
 	"Include `--api` flag when running stable-diffusion-webui": "stable-diffusion-webui çalıştırılırken `--api` bayrağını dahil edin",
 	"Input commands": "Giriş komutları",
@@ -240,6 +234,7 @@
 	"January": "Ocak",
 	"join our Discord for help.": "yardım için Discord'umuza katılın.",
 	"JSON": "JSON",
+	"JSON Preview": "",
 	"July": "Temmuz",
 	"June": "Haziran",
 	"JWT Expiration": "JWT Bitişi",
@@ -254,11 +249,10 @@
 	"LTR": "LTR",
 	"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 Models": "Modelleri Yönet",
 	"Manage Ollama Models": "Ollama Modellerini Yönet",
 	"March": "Mart",
-	"Max Tokens": "Maksimum Token",
+	"Max Tokens (num_predict)": "",
 	"Maximum of 3 models can be downloaded simultaneously. Please try again later.": "Aynı anda en fazla 3 model indirilebilir. Lütfen daha sonra tekrar deneyin.",
 	"May": "Mayıs",
 	"Memories accessible by LLMs will be shown here.": "LLM'ler tarafından erişilebilecek hatalar burada gösterilecektir.",
@@ -273,22 +267,19 @@
 	"Model '{{modelName}}' has been successfully downloaded.": "'{{modelName}}' başarıyla indirildi.",
 	"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 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 Name": "Model Adı",
+	"Model ID": "",
 	"Model not selected": "Model seçilmedi",
-	"Model Tag Name": "Model Etiket Adı",
+	"Model Params": "",
 	"Model Whitelisting": "Model Beyaz Listeye Alma",
 	"Model(s) Whitelisted": "Model(ler) Beyaz Listeye Alındı",
-	"Modelfile": "Model Dosyası",
-	"Modelfile Advanced Settings": "Model Dosyası Gelişmiş Ayarları",
 	"Modelfile Content": "Model Dosyası İçeriği",
-	"Modelfiles": "Model Dosyaları",
 	"Models": "Modeller",
 	"More": "Daha Fazla",
 	"Name": "Ad",
 	"Name Tag": "Ad Etiketi",
-	"Name your modelfile": "Model dosyanıza ad verin",
+	"Name your model": "",
 	"New Chat": "Yeni Sohbet",
 	"New Password": "Yeni Parola",
 	"No results found": "Sonuç bulunamadı",
@@ -296,8 +287,6 @@
 	"No search results found": "",
 	"No source available": "Kaynak mevcut değil",
 	"Not factually correct": "Gerçeklere göre doğru değil",
-	"Not sure what to add?": "Ne ekleyeceğinizden emin değil misiniz?",
-	"Not sure what to write? Switch to": "Ne yazacağınızdan emin değil misiniz? Şuraya geçin",
 	"Note: If you set a minimum score, the search will only return documents with a score greater than or equal to the minimum score.": "Not: Minimum bir skor belirlerseniz, arama yalnızca minimum skora eşit veya daha yüksek bir skora sahip belgeleri getirecektir.",
 	"Notifications": "Bildirimler",
 	"November": "Kasım",
@@ -326,7 +315,6 @@
 	"or": "veya",
 	"Other": "Diğer",
 	"Overview": "Genel Bakış",
-	"Parameters": "Parametreler",
 	"Password": "Parola",
 	"PDF document (.pdf)": "PDF belgesi (.pdf)",
 	"PDF Extract Images (OCR)": "PDF Görüntülerini Çıkart (OCR)",
@@ -346,10 +334,8 @@
 	"Prompts": "Promptlar",
 	"Pull \"{{searchValue}}\" from Ollama.com": "Ollama.com'dan \"{{searchValue}}\" çekin",
 	"Pull a model from Ollama.com": "Ollama.com'dan bir model çekin",
-	"Pull Progress": "Çekme İlerlemesi",
 	"Query Params": "Sorgu Parametreleri",
 	"RAG Template": "RAG Şablonu",
-	"Raw Format": "Ham Format",
 	"Read Aloud": "Sesli Oku",
 	"Record voice": "Ses kaydı yap",
 	"Redirecting you to OpenWebUI Community": "OpenWebUI Topluluğuna yönlendiriliyorsunuz",
@@ -360,7 +346,6 @@
 	"Remove Model": "Modeli Kaldır",
 	"Rename": "Yeniden Adlandır",
 	"Repeat Last N": "Son N'yi Tekrar Et",
-	"Repeat Penalty": "Tekrar Cezası",
 	"Request Mode": "İstek Modu",
 	"Reranking Model": "Yeniden Sıralama Modeli",
 	"Reranking model disabled": "Yeniden sıralama modeli devre dışı bırakıldı",
@@ -387,10 +372,12 @@
 	"See readme.md for instructions": "Yönergeler için readme.md dosyasına bakın",
 	"See what's new": "Yeniliklere göz atın",
 	"Seed": "Seed",
+	"Select a base model": "",
 	"Select a mode": "Bir mod seç",
 	"Select a model": "Bir model seç",
 	"Select an Ollama instance": "Bir Ollama örneği seçin",
 	"Select model": "Model seç",
+	"Selected model(s) do not support image inputs": "",
 	"Send": "Gönder",
 	"Send a Message": "Bir Mesaj Gönder",
 	"Send message": "Mesaj gönder",
@@ -412,7 +399,6 @@
 	"Share to OpenWebUI Community": "OpenWebUI Topluluğu ile Paylaş",
 	"short-summary": "kısa-özet",
 	"Show": "Göster",
-	"Show Additional Params": "Ek Parametreleri Göster",
 	"Show shortcuts": "Kısayolları göster",
 	"Showcased creativity": "Sergilenen yaratıcılık",
 	"sidebar": "kenar çubuğu",
@@ -431,7 +417,6 @@
 	"Success": "Başarılı",
 	"Successfully updated.": "Başarıyla güncellendi.",
 	"Suggested": "Önerilen",
-	"Sync All": "Tümünü Senkronize Et",
 	"System": "Sistem",
 	"System Prompt": "Sistem Promptu",
 	"Tags": "Etiketler",
@@ -502,6 +487,7 @@
 	"Write a summary in 50 words that summarizes [topic or keyword].": "[Konuyu veya anahtar kelimeyi] özetleyen 50 kelimelik bir özet yazın.",
 	"Yesterday": "Dün",
 	"You": "Sen",
+	"You cannot clone a base model": "",
 	"You have no archived conversations.": "Arşivlenmiş sohbetleriniz yok.",
 	"You have shared this chat": "Bu sohbeti paylaştınız",
 	"You're a helpful assistant.": "Sen yardımcı bir asistansın.",

+ 23 - 37
src/lib/i18n/locales/uk-UA/translation.json

@@ -3,6 +3,8 @@
 	"(Beta)": "(Beta)",
 	"(e.g. `sh webui.sh --api`)": "(e.g. `sh webui.sh --api`)",
 	"(latest)": "(остання)",
+	"{{ models }}": "",
+	"{{ owner }}: You cannot delete a base model": "",
 	"{{modelName}} is thinking...": "{{modelName}} думає...",
 	"{{user}}'s Chats": "Чати {{user}}а",
 	"{{webUIName}} Backend Required": "Необхідно підключення бекенду {{webUIName}}",
@@ -12,9 +14,8 @@
 	"Account": "Обліковий запис",
 	"Accurate information": "Точна інформація",
 	"Add": "Додати",
-	"Add a model": "Додати модель",
-	"Add a model tag name": "Додати ім'я тегу моделі",
-	"Add a short description about what this modelfile does": "Додати короткий опис того, що робить цей файл моделі",
+	"Add a model id": "",
+	"Add a short description about what this model does": "",
 	"Add a short title for this prompt": "Додати коротку назву для цього промту",
 	"Add a tag": "Додайте тег",
 	"Add custom prompt": "Додати користувацьку підказку",
@@ -30,6 +31,7 @@
 	"Admin Panel": "Панель адміністратора",
 	"Admin Settings": "Налаштування адміністратора",
 	"Advanced Parameters": "Розширені параметри",
+	"Advanced Params": "",
 	"all": "всі",
 	"All Documents": "Усі документи",
 	"All Users": "Всі користувачі",
@@ -44,7 +46,6 @@
 	"API Key": "Ключ API",
 	"API Key created.": "Ключ API створено.",
 	"API keys": "Ключі API",
-	"API RPM": "API RPM",
 	"April": "Квітень",
 	"Archive": "Архів",
 	"Archived Chats": "Архівовані чати",
@@ -61,12 +62,12 @@
 	"available!": "доступно!",
 	"Back": "Назад",
 	"Bad Response": "Неправильна відповідь",
+	"Base Model (From)": "",
 	"before": "до того, як",
 	"Being lazy": "Не поспішати",
-	"Builder Mode": "Режим конструктора",
 	"Bypass SSL verification for Websites": "Обхід SSL-перевірки для веб-сайтів",
 	"Cancel": "Скасувати",
-	"Categories": "Категорії",
+	"Capabilities": "",
 	"Change Password": "Змінити пароль",
 	"Chat": "Чат",
 	"Chat Bubble UI": "Бульбашковий UI чату",
@@ -84,7 +85,6 @@
 	"Citation": "Цитування",
 	"Click here for help.": "Клацніть тут, щоб отримати допомогу.",
 	"Click here to": "Натисніть тут, щоб",
-	"Click here to check other modelfiles.": "Клацніть тут, щоб перевірити інші файли моделей.",
 	"Click here to select": "Натисніть тут, щоб вибрати",
 	"Click here to select a csv file.": "Натисніть тут, щоб вибрати csv-файл.",
 	"Click here to select documents.": "Натисніть тут, щоб вибрати документи.",
@@ -109,7 +109,7 @@
 	"Copy Link": "Копіювати посилання",
 	"Copying to clipboard was successful!": "Копіювання в буфер обміну виконано успішно!",
 	"Create a concise, 3-5 word phrase as a header for the following query, strictly adhering to the 3-5 word limit and avoiding the use of the word 'title':": "Create a concise, 3-5 word phrase as a header for the following query, strictly adhering to the 3-5 word limit and avoiding the use of the word 'title':",
-	"Create a modelfile": "Створити файл моделі",
+	"Create a model": "",
 	"Create Account": "Створити обліковий запис",
 	"Create new key": "Створити новий ключ",
 	"Create new secret key": "Створити новий секретний ключ",
@@ -118,7 +118,7 @@
 	"Current Model": "Поточна модель",
 	"Current Password": "Поточний пароль",
 	"Custom": "Налаштувати",
-	"Customize Ollama models for a specific purpose": "Налаштувати моделі Ollama для конкретної мети",
+	"Customize models for a specific purpose": "",
 	"Dark": "Темна",
 	"Dashboard": "Панель управління",
 	"Database": "База даних",
@@ -139,11 +139,11 @@
 	"delete this link": "видалити це посилання",
 	"Delete User": "Видалити користувача",
 	"Deleted {{deleteModelTag}}": "Видалено {{deleteModelTag}}",
-	"Deleted {{tagName}}": "Видалено {{tagName}}",
+	"Deleted {{name}}": "",
 	"Description": "Опис",
 	"Didn't fully follow instructions": "Не повністю дотримувалися інструкцій",
 	"Disabled": "Вимкнено",
-	"Discover a modelfile": "Знайти файл моделі",
+	"Discover a model": "",
 	"Discover a prompt": "Знайти промт",
 	"Discover, download, and explore custom prompts": "Знайдіть, завантажте та досліджуйте налаштовані промти",
 	"Discover, download, and explore model presets": "Знайдіть, завантажте та досліджуйте налаштовані налаштування моделі",
@@ -177,11 +177,6 @@
 	"Enter Chunk Size": "Введіть розмір фрагменту",
 	"Enter Image Size (e.g. 512x512)": "Введіть розмір зображення (напр., 512x512)",
 	"Enter language codes": "Введіть мовні коди",
-	"Enter LiteLLM API Base URL (litellm_params.api_base)": "Введіть URL-адресу API LiteLLM (litellm_params.api_base)",
-	"Enter LiteLLM API Key (litellm_params.api_key)": "Введіть ключ API LiteLLM (litellm_params.api_key)",
-	"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 tag (e.g. {{modelTag}})": "Введіть тег моделі (напр., {{modelTag}})",
 	"Enter Number of Steps (e.g. 50)": "Введіть кількість кроків (напр., 50)",
 	"Enter Score": "Введіть бал",
@@ -197,7 +192,7 @@
 	"Export All Chats (All Users)": "Експортувати всі чати (всі користувачі)",
 	"Export Chats": "Експортувати чати",
 	"Export Documents Mapping": "Експортувати відображення документів",
-	"Export Modelfiles": "Експортувати файл моделі",
+	"Export Models": "",
 	"Export Prompts": "Експортувати промти",
 	"Failed to create API Key.": "Не вдалося створити API ключ.",
 	"Failed to read clipboard contents": "Не вдалося прочитати вміст буфера обміну",
@@ -210,7 +205,7 @@
 	"Focus chat input": "Фокус вводу чату",
 	"Followed instructions perfectly": "Бездоганно дотримувався інструкцій",
 	"Format your variables using square brackets like this:": "Форматуйте свої змінні квадратними дужками так:",
-	"From (Base Model)": "Від (базова модель)",
+	"Frequencey Penalty": "",
 	"Full Screen Mode": "Режим повного екрану",
 	"General": "Загальні",
 	"General Settings": "Загальні налаштування",
@@ -222,7 +217,6 @@
 	"Hello, {{name}}": "Привіт, {{name}}",
 	"Help": "Допоможіть",
 	"Hide": "Приховати",
-	"Hide Additional Params": "Приховати додаткові параметри",
 	"How can I help you today?": "Чим я можу допомогти вам сьогодні?",
 	"Hybrid Search": "Гібридний пошук",
 	"Image Generation (Experimental)": "Генерування зображень (експериментально)",
@@ -231,7 +225,7 @@
 	"Images": "Зображення",
 	"Import Chats": "Імпортувати чати",
 	"Import Documents Mapping": "Імпортувати відображення документів",
-	"Import Modelfiles": "Імпортувати файл моделі",
+	"Import Models": "",
 	"Import Prompts": "Імпортувати промти",
 	"Include `--api` flag when running stable-diffusion-webui": "Включіть прапор `--api` при запуску stable-diffusion-webui",
 	"Input commands": "Команди вводу",
@@ -240,6 +234,7 @@
 	"January": "Січень",
 	"join our Discord for help.": "приєднуйтеся до нашого Discord для допомоги.",
 	"JSON": "JSON",
+	"JSON Preview": "",
 	"July": "Липень",
 	"June": "Червень",
 	"JWT Expiration": "Термін дії JWT",
@@ -254,11 +249,10 @@
 	"LTR": "LTR",
 	"Made by OpenWebUI Community": "Зроблено спільнотою OpenWebUI",
 	"Make sure to enclose them with": "Переконайтеся, що вони закриті",
-	"Manage LiteLLM Models": "Керування моделями LiteLLM",
 	"Manage Models": "Керування моделями",
 	"Manage Ollama Models": "Керування моделями Ollama",
 	"March": "Березень",
-	"Max Tokens": "Максимальна кількість токенів",
+	"Max Tokens (num_predict)": "",
 	"Maximum of 3 models can be downloaded simultaneously. Please try again later.": "Максимум 3 моделі можна завантажити одночасно. Будь ласка, спробуйте пізніше.",
 	"May": "Травень",
 	"Memories accessible by LLMs will be shown here.": "Пам'ять, яка доступна LLM, буде показана тут.",
@@ -273,22 +267,19 @@
 	"Model '{{modelName}}' has been successfully downloaded.": "Модель '{{modelName}}' успішно завантажено.",
 	"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 filesystem path detected. Model shortname is required for update, cannot continue.": "Виявлено шлях до файлової системи моделі. Для оновлення потрібно вказати коротке ім'я моделі, не вдасться продовжити.",
-	"Model Name": "Назва моделі",
+	"Model ID": "",
 	"Model not selected": "Модель не вибрана",
-	"Model Tag Name": "Ім'я тегу моделі",
+	"Model Params": "",
 	"Model Whitelisting": "Модель білого списку",
 	"Model(s) Whitelisted": "Модель(і) білого списку",
-	"Modelfile": "Файли моделі",
-	"Modelfile Advanced Settings": "Додаткові налаштування файлу моделі",
 	"Modelfile Content": "Вміст файлу моделі",
-	"Modelfiles": "Файли моделей",
 	"Models": "Моделі",
 	"More": "Більше",
 	"Name": "Ім'я",
 	"Name Tag": "Назва тегу",
-	"Name your modelfile": "Назвіть свій файл моделі",
+	"Name your model": "",
 	"New Chat": "Новий чат",
 	"New Password": "Новий пароль",
 	"No results found": "Не знайдено жодного результату",
@@ -296,8 +287,6 @@
 	"No search results found": "",
 	"No source available": "Джерело не доступне",
 	"Not factually correct": "Не відповідає дійсності",
-	"Not sure what to add?": "Не впевнений, що додати?",
-	"Not sure what to write? Switch to": "Не впевнений, що писати? Переключитися на",
 	"Note: If you set a minimum score, the search will only return documents with a score greater than or equal to the minimum score.": "Примітка: Якщо ви встановите мінімальну кількість балів, пошук поверне лише документи з кількістю балів, більшою або рівною мінімальній кількості балів.",
 	"Notifications": "Сповіщення",
 	"November": "Листопад",
@@ -326,7 +315,6 @@
 	"or": "або",
 	"Other": "Інше",
 	"Overview": "Огляд",
-	"Parameters": "Параметри",
 	"Password": "Пароль",
 	"PDF document (.pdf)": "PDF документ (.pdf)",
 	"PDF Extract Images (OCR)": "Розпізнавання зображень з PDF (OCR)",
@@ -346,10 +334,8 @@
 	"Prompts": "Промти",
 	"Pull \"{{searchValue}}\" from Ollama.com": "Завантажити \"{{searchValue}}\" з Ollama.com»",
 	"Pull a model from Ollama.com": "Завантажити модель з Ollama.com",
-	"Pull Progress": "Прогрес завантаження",
 	"Query Params": "Параметри запиту",
 	"RAG Template": "Шаблон RAG",
-	"Raw Format": "Необроблений формат",
 	"Read Aloud": "Читати вголос",
 	"Record voice": "Записати голос",
 	"Redirecting you to OpenWebUI Community": "Перенаправляємо вас до спільноти OpenWebUI",
@@ -360,7 +346,6 @@
 	"Remove Model": "Видалити модель",
 	"Rename": "Перейменувати",
 	"Repeat Last N": "Повторити останні N",
-	"Repeat Penalty": "Штраф за повторення",
 	"Request Mode": "Режим запиту",
 	"Reranking Model": "Модель переранжування",
 	"Reranking model disabled": "Модель переранжування вимкнена",
@@ -387,10 +372,12 @@
 	"See readme.md for instructions": "Див. readme.md для інструкцій",
 	"See what's new": "Подивіться, що нового",
 	"Seed": "Сід",
+	"Select a base model": "",
 	"Select a mode": "Оберіть режим",
 	"Select a model": "Виберіть модель",
 	"Select an Ollama instance": "Виберіть екземпляр Ollama",
 	"Select model": "Вибрати модель",
+	"Selected model(s) do not support image inputs": "",
 	"Send": "Надіслати",
 	"Send a Message": "Надіслати повідомлення",
 	"Send message": "Надіслати повідомлення",
@@ -412,7 +399,6 @@
 	"Share to OpenWebUI Community": "Поділитися зі спільнотою OpenWebUI",
 	"short-summary": "короткий зміст",
 	"Show": "Показати",
-	"Show Additional Params": "Показати додаткові параметри",
 	"Show shortcuts": "Показати клавіатурні скорочення",
 	"Showcased creativity": "Продемонстрований креатив",
 	"sidebar": "бокова панель",
@@ -431,7 +417,6 @@
 	"Success": "Успіх",
 	"Successfully updated.": "Успішно оновлено.",
 	"Suggested": "Запропоновано",
-	"Sync All": "Синхронізувати все",
 	"System": "Система",
 	"System Prompt": "Системний промт",
 	"Tags": "Теги",
@@ -502,6 +487,7 @@
 	"Write a summary in 50 words that summarizes [topic or keyword].": "Напишіть стислий зміст у 50 слів, який узагальнює [тема або ключове слово].",
 	"Yesterday": "Вчора",
 	"You": "Ви",
+	"You cannot clone a base model": "",
 	"You have no archived conversations.": "У вас немає архівованих розмов.",
 	"You have shared this chat": "Ви поділилися цим чатом",
 	"You're a helpful assistant.": "Ви корисний асистент.",

+ 23 - 37
src/lib/i18n/locales/vi-VN/translation.json

@@ -3,6 +3,8 @@
 	"(Beta)": "(Beta)",
 	"(e.g. `sh webui.sh --api`)": "(vd: `sh webui.sh --api`)",
 	"(latest)": "(mới nhất)",
+	"{{ models }}": "",
+	"{{ owner }}: You cannot delete a base model": "",
 	"{{modelName}} is thinking...": "{{modelName}} đang suy nghĩ...",
 	"{{user}}'s Chats": "{{user}}'s Chats",
 	"{{webUIName}} Backend Required": "{{webUIName}} Yêu cầu Backend",
@@ -12,9 +14,8 @@
 	"Account": "Tài khoản",
 	"Accurate information": "Thông tin chính xác",
 	"Add": "Thêm",
-	"Add a model": "Thêm mô hình",
-	"Add a model tag name": "Thêm tên thẻ mô hình (tag)",
-	"Add a short description about what this modelfile does": "Thêm mô tả ngắn về việc tệp mô tả mô hình (modelfile) này làm gì",
+	"Add a model id": "",
+	"Add a short description about what this model does": "",
 	"Add a short title for this prompt": "Thêm tiêu đề ngắn cho prompt này",
 	"Add a tag": "Thêm thẻ (tag)",
 	"Add custom prompt": "Thêm prompt tùy chỉnh",
@@ -30,6 +31,7 @@
 	"Admin Panel": "Trang Quản trị",
 	"Admin Settings": "Cài đặt hệ thống",
 	"Advanced Parameters": "Các tham số Nâng cao",
+	"Advanced Params": "",
 	"all": "tất cả",
 	"All Documents": "Tất cả tài liệu",
 	"All Users": "Danh sách người sử dụng",
@@ -44,7 +46,6 @@
 	"API Key": "API Key",
 	"API Key created.": "Khóa API đã tạo",
 	"API keys": "API Keys",
-	"API RPM": "API RPM",
 	"April": "Tháng 4",
 	"Archive": "Lưu trữ",
 	"Archived Chats": "bản ghi trò chuyện",
@@ -61,12 +62,12 @@
 	"available!": "có sẵn!",
 	"Back": "Quay lại",
 	"Bad Response": "Trả lời KHÔNG tốt",
+	"Base Model (From)": "",
 	"before": "trước",
 	"Being lazy": "Lười biếng",
-	"Builder Mode": "Chế độ Builder",
 	"Bypass SSL verification for Websites": "Bỏ qua xác thực SSL cho các trang web",
 	"Cancel": "Hủy bỏ",
-	"Categories": "Danh mục",
+	"Capabilities": "",
 	"Change Password": "Đổi Mật khẩu",
 	"Chat": "Trò chuyện",
 	"Chat Bubble UI": "Bảng chat",
@@ -84,7 +85,6 @@
 	"Citation": "Trích dẫn",
 	"Click here for help.": "Bấm vào đây để được trợ giúp.",
 	"Click here to": "Nhấn vào đây để",
-	"Click here to check other modelfiles.": "Bấm vào đây để kiểm tra các tệp mô tả mô hình (modelfiles) khác.",
 	"Click here to select": "Bấm vào đây để chọn",
 	"Click here to select a csv file.": "Nhấn vào đây để chọn tệp csv",
 	"Click here to select documents.": "Bấm vào đây để chọn tài liệu.",
@@ -109,7 +109,7 @@
 	"Copy Link": "Sao chép link",
 	"Copying to clipboard was successful!": "Sao chép vào clipboard thành công!",
 	"Create a concise, 3-5 word phrase as a header for the following query, strictly adhering to the 3-5 word limit and avoiding the use of the word 'title':": "Tạo một cụm từ súc tích, 3-5 từ làm tiêu đề cho truy vấn sau, tuân thủ nghiêm ngặt giới hạn 3-5 từ và tránh sử dụng từ 'tiêu đề':",
-	"Create a modelfile": "Tạo tệp mô tả cho mô hình",
+	"Create a model": "",
 	"Create Account": "Tạo Tài khoản",
 	"Create new key": "Tạo key mới",
 	"Create new secret key": "Tạo key bí mật mới",
@@ -118,7 +118,7 @@
 	"Current Model": "Mô hình hiện tại",
 	"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ể",
+	"Customize models for a specific purpose": "",
 	"Dark": "Tối",
 	"Dashboard": "Trang tổng quan",
 	"Database": "Cơ sở dữ liệu",
@@ -139,11 +139,11 @@
 	"delete this link": "Xóa link này",
 	"Delete User": "Xóa người dùng",
 	"Deleted {{deleteModelTag}}": "Đã xóa {{deleteModelTag}}",
-	"Deleted {{tagName}}": "Xóa {{tagName}}",
+	"Deleted {{name}}": "",
 	"Description": "Mô tả",
 	"Didn't fully follow instructions": "Không tuân theo chỉ dẫn một cách đầy đủ",
 	"Disabled": "Đã vô hiệu hóa",
-	"Discover a modelfile": "Khám phá thêm các mô hình mới",
+	"Discover a model": "",
 	"Discover a prompt": "Khám phá thêm prompt mới",
 	"Discover, download, and explore custom prompts": "Tìm kiếm, tải về và khám phá thêm các prompt tùy chỉnh",
 	"Discover, download, and explore model presets": "Tìm kiếm, tải về và khám phá thêm các thiết lập mô hình sẵn",
@@ -177,11 +177,6 @@
 	"Enter Chunk Size": "Nhập Kích thước Chunk",
 	"Enter Image Size (e.g. 512x512)": "Nhập Kích thước ảnh (vd: 512x512)",
 	"Enter language codes": "Nhập mã ngôn ngữ",
-	"Enter LiteLLM API Base URL (litellm_params.api_base)": "Nhập URL Cơ bản API LiteLLM (litellm_params.api_base)",
-	"Enter LiteLLM API Key (litellm_params.api_key)": "Nhập Khóa API LiteLLM (litellm_params.api_key)",
-	"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 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",
@@ -197,7 +192,7 @@
 	"Export All Chats (All Users)": "Tải về tất cả nội dung chat (tất cả mọi người)",
 	"Export Chats": "Tải nội dung chat về máy",
 	"Export Documents Mapping": "Tải cấu trúc tài liệu về máy",
-	"Export Modelfiles": "Tải tệp mô tả về máy",
+	"Export Models": "",
 	"Export Prompts": "Tải các prompt về máy",
 	"Failed to create API Key.": "Lỗi khởi tạo API Key",
 	"Failed to read clipboard contents": "Không thể đọc nội dung clipboard",
@@ -210,7 +205,7 @@
 	"Focus chat input": "Tập trung vào nội dung chat",
 	"Followed instructions perfectly": "Tuân theo chỉ dẫn một cách hoàn hảo",
 	"Format your variables using square brackets like this:": "Định dạng các biến của bạn bằng cách sử dụng dấu ngoặc vuông như thế này:",
-	"From (Base Model)": "Từ (Base Model)",
+	"Frequencey Penalty": "",
 	"Full Screen Mode": "Chế độ Toàn màn hình",
 	"General": "Cài đặt chung",
 	"General Settings": "Cấu hình chung",
@@ -222,7 +217,6 @@
 	"Hello, {{name}}": "Xin chào, {{name}}",
 	"Help": "Trợ giúp",
 	"Hide": "Ẩn",
-	"Hide Additional Params": "Ẩn Các tham số bổ sung",
 	"How can I help you today?": "Tôi có thể giúp gì cho bạn hôm nay?",
 	"Hybrid Search": "Tìm kiếm Hybrid",
 	"Image Generation (Experimental)": "Tạo ảnh (thử nghiệm)",
@@ -231,7 +225,7 @@
 	"Images": "Hình ảnh",
 	"Import Chats": "Nạp lại nội dung chat",
 	"Import Documents Mapping": "Nạp cấu trúc tài liệu",
-	"Import Modelfiles": "Nạp tệp mô tả",
+	"Import Models": "",
 	"Import Prompts": "Nạp các prompt lên hệ thống",
 	"Include `--api` flag when running stable-diffusion-webui": "Bao gồm flag `--api` khi chạy stable-diffusion-webui",
 	"Input commands": "Nhập các câu lệnh",
@@ -240,6 +234,7 @@
 	"January": "Tháng 1",
 	"join our Discord for help.": "tham gia Discord của chúng tôi để được trợ giúp.",
 	"JSON": "JSON",
+	"JSON Preview": "",
 	"July": "Tháng 7",
 	"June": "Tháng 6",
 	"JWT Expiration": "JWT Hết hạn",
@@ -254,11 +249,10 @@
 	"LTR": "LTR",
 	"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 Models": "Quản lý mô hình",
 	"Manage Ollama Models": "Quản lý mô hình với Ollama",
 	"March": "Tháng 3",
-	"Max Tokens": "Max Tokens",
+	"Max Tokens (num_predict)": "",
 	"Maximum of 3 models can be downloaded simultaneously. Please try again later.": "Tối đa 3 mô hình có thể được tải xuống cùng lúc. Vui lòng thử lại sau.",
 	"May": "Tháng 5",
 	"Memories accessible by LLMs will be shown here.": "Memory có thể truy cập bởi LLMs sẽ hiển thị ở đây.",
@@ -273,22 +267,19 @@
 	"Model '{{modelName}}' has been successfully downloaded.": "Mô hình '{{modelName}}' đã được tải xuống thành công.",
 	"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 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 Name": "Tên Mô hình",
+	"Model ID": "",
 	"Model not selected": "Chưa chọn Mô hình",
-	"Model Tag Name": "Tên thẻ Mô hình",
+	"Model Params": "",
 	"Model Whitelisting": "Whitelist mô hình",
 	"Model(s) Whitelisted": "các mô hình được cho vào danh sách Whitelist",
-	"Modelfile": "Tệp Mô hình",
-	"Modelfile Advanced Settings": "Cài đặt Nâng cao Tệp Mô hình",
 	"Modelfile Content": "Nội dung Tệp Mô hình",
-	"Modelfiles": "Tệp Mô hình",
 	"Models": "Mô hình",
 	"More": "Thêm",
 	"Name": "Tên",
 	"Name Tag": "Tên Thẻ",
-	"Name your modelfile": "Đặt tên cho tệp mô hình của bạn",
+	"Name your model": "",
 	"New Chat": "Tạo cuộc trò chuyện mới",
 	"New Password": "Mật khẩu mới",
 	"No results found": "Không tìm thấy kết quả",
@@ -296,8 +287,6 @@
 	"No search results found": "",
 	"No source available": "Không có nguồn",
 	"Not factually correct": "Không chính xác so với thực tế",
-	"Not sure what to add?": "Không chắc phải thêm gì?",
-	"Not sure what to write? Switch to": "Không chắc phải viết gì? Chuyển sang",
 	"Note: If you set a minimum score, the search will only return documents with a score greater than or equal to the minimum score.": "Lưu ý: Nếu bạn đặt điểm (Score) tối thiểu thì tìm kiếm sẽ chỉ trả về những tài liệu có điểm lớn hơn hoặc bằng điểm tối thiểu.",
 	"Notifications": "Thông báo trên máy tính (Notification)",
 	"November": "Tháng 11",
@@ -326,7 +315,6 @@
 	"or": "hoặc",
 	"Other": "Khác",
 	"Overview": "Tổng quan",
-	"Parameters": "Tham số",
 	"Password": "Mật khẩu",
 	"PDF document (.pdf)": "Tập tin PDF (.pdf)",
 	"PDF Extract Images (OCR)": "Trích xuất ảnh từ PDF (OCR)",
@@ -346,10 +334,8 @@
 	"Prompts": "Prompt",
 	"Pull \"{{searchValue}}\" from Ollama.com": "Tải \"{{searchValue}}\" từ Ollama.com",
 	"Pull a model from Ollama.com": "Tải mô hình từ Ollama.com",
-	"Pull Progress": "Tiến trình Tải xuống",
 	"Query Params": "Tham số Truy vấn",
 	"RAG Template": "Mẫu prompt cho RAG",
-	"Raw Format": "Raw Format",
 	"Read Aloud": "Đọc ra loa",
 	"Record voice": "Ghi âm",
 	"Redirecting you to OpenWebUI Community": "Đang chuyển hướng bạn đến Cộng đồng OpenWebUI",
@@ -360,7 +346,6 @@
 	"Remove Model": "Xóa model",
 	"Rename": "Đổi tên",
 	"Repeat Last N": "Repeat Last N",
-	"Repeat Penalty": "Repeat Penalty",
 	"Request Mode": "Request Mode",
 	"Reranking Model": "Reranking Model",
 	"Reranking model disabled": "Reranking model disabled",
@@ -387,10 +372,12 @@
 	"See readme.md for instructions": "Xem readme.md để biết hướng dẫn",
 	"See what's new": "Xem những cập nhật mới",
 	"Seed": "Seed",
+	"Select a base model": "",
 	"Select a mode": "Chọn một chế độ",
 	"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 model(s) 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",
@@ -412,7 +399,6 @@
 	"Share to OpenWebUI Community": "Chia sẻ đến Cộng đồng OpenWebUI",
 	"short-summary": "tóm tắt ngắn",
 	"Show": "Hiển thị",
-	"Show Additional Params": "Hiển thị Tham số Bổ sung",
 	"Show shortcuts": "Hiển thị phím tắt",
 	"Showcased creativity": "Thể hiện sự sáng tạo",
 	"sidebar": "thanh bên",
@@ -431,7 +417,6 @@
 	"Success": "Thành công",
 	"Successfully updated.": "Đã cập nhật thành công.",
 	"Suggested": "Gợi ý một số mẫu prompt",
-	"Sync All": "Đồng bộ hóa Tất cả",
 	"System": "Hệ thống",
 	"System Prompt": "Prompt Hệ thống (System Prompt)",
 	"Tags": "Thẻ",
@@ -502,6 +487,7 @@
 	"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].",
 	"Yesterday": "Hôm qua",
 	"You": "Bạn",
+	"You cannot clone a base model": "",
 	"You have no archived conversations.": "Bạn chưa lưu trữ một nội dung chat nào",
 	"You have shared this chat": "Bạn vừa chia sẻ chat này",
 	"You're a helpful assistant.": "Bạn là một trợ lý hữu ích.",

+ 23 - 37
src/lib/i18n/locales/zh-CN/translation.json

@@ -3,6 +3,8 @@
 	"(Beta)": "(测试版)",
 	"(e.g. `sh webui.sh --api`)": "(例如 `sh webui.sh --api`)",
 	"(latest)": "(最新版)",
+	"{{ models }}": "",
+	"{{ owner }}: You cannot delete a base model": "",
 	"{{modelName}} is thinking...": "{{modelName}} 正在思考...",
 	"{{user}}'s Chats": "{{user}} 的聊天记录",
 	"{{webUIName}} Backend Required": "需要 {{webUIName}} 后端",
@@ -12,9 +14,8 @@
 	"Account": "账户",
 	"Accurate information": "准确信息",
 	"Add": "添加",
-	"Add a model": "添加模型",
-	"Add a model tag name": "添加模型标签名称",
-	"Add a short description about what this modelfile does": "为这个模型文件添加一段简短的描述",
+	"Add a model id": "",
+	"Add a short description about what this model does": "",
 	"Add a short title for this prompt": "为这个提示词添加一个简短的标题",
 	"Add a tag": "添加标签",
 	"Add custom prompt": "添加自定义提示词",
@@ -30,6 +31,7 @@
 	"Admin Panel": "管理员面板",
 	"Admin Settings": "管理员设置",
 	"Advanced Parameters": "高级参数",
+	"Advanced Params": "",
 	"all": "所有",
 	"All Documents": "所有文档",
 	"All Users": "所有用户",
@@ -44,7 +46,6 @@
 	"API Key": "API 密钥",
 	"API Key created.": "API 密钥已创建。",
 	"API keys": "API 密钥",
-	"API RPM": "API RPM",
 	"April": "四月",
 	"Archive": "存档",
 	"Archived Chats": "聊天记录存档",
@@ -61,12 +62,12 @@
 	"available!": "可用!",
 	"Back": "返回",
 	"Bad Response": "不良响应",
+	"Base Model (From)": "",
 	"before": "之前",
 	"Being lazy": "懒惰",
-	"Builder Mode": "构建模式",
 	"Bypass SSL verification for Websites": "绕过网站的 SSL 验证",
 	"Cancel": "取消",
-	"Categories": "分类",
+	"Capabilities": "",
 	"Change Password": "更改密码",
 	"Chat": "聊天",
 	"Chat Bubble UI": "聊天气泡 UI",
@@ -84,7 +85,6 @@
 	"Citation": "引文",
 	"Click here for help.": "点击这里获取帮助。",
 	"Click here to": "单击此处",
-	"Click here to check other modelfiles.": "点击这里检查其他模型文件。",
 	"Click here to select": "点击这里选择",
 	"Click here to select a csv file.": "单击此处选择 csv 文件。",
 	"Click here to select documents.": "点击这里选择文档。",
@@ -109,7 +109,7 @@
 	"Copy Link": "复制链接",
 	"Copying to clipboard was successful!": "复制到剪贴板成功!",
 	"Create a concise, 3-5 word phrase as a header for the following query, strictly adhering to the 3-5 word limit and avoiding the use of the word 'title':": "为以下查询创建一个简洁的、3-5 个词的短语作为标题,严格遵守 3-5 个词的限制并避免使用“标题”一词:",
-	"Create a modelfile": "创建模型文件",
+	"Create a model": "",
 	"Create Account": "创建账户",
 	"Create new key": "创建新密钥",
 	"Create new secret key": "创建新安全密钥",
@@ -118,7 +118,7 @@
 	"Current Model": "当前模型",
 	"Current Password": "当前密码",
 	"Custom": "自定义",
-	"Customize Ollama models for a specific purpose": "定制特定用途的 Ollama 模型",
+	"Customize models for a specific purpose": "",
 	"Dark": "暗色",
 	"Dashboard": "仪表盘",
 	"Database": "数据库",
@@ -139,11 +139,11 @@
 	"delete this link": "删除这个链接",
 	"Delete User": "删除用户",
 	"Deleted {{deleteModelTag}}": "已删除{{deleteModelTag}}",
-	"Deleted {{tagName}}": "已删除 {{tagName}}",
+	"Deleted {{name}}": "",
 	"Description": "描述",
 	"Didn't fully follow instructions": "没有完全遵循指示",
 	"Disabled": "禁用",
-	"Discover a modelfile": "探索模型文件",
+	"Discover a model": "",
 	"Discover a prompt": "探索提示词",
 	"Discover, download, and explore custom prompts": "发现、下载并探索自定义提示词",
 	"Discover, download, and explore model presets": "发现、下载并探索模型预设",
@@ -177,11 +177,6 @@
 	"Enter Chunk Size": "输入块大小 (Chunk Size)",
 	"Enter Image Size (e.g. 512x512)": "输入图片大小 (例如 512x512)",
 	"Enter language codes": "输入语言代码",
-	"Enter LiteLLM API Base URL (litellm_params.api_base)": "输入 LiteLLM API 基本 URL (litellm_params.api_base)",
-	"Enter LiteLLM API Key (litellm_params.api_key)": "输入 LiteLLM API 密匙 (litellm_params.api_key)",
-	"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 tag (e.g. {{modelTag}})": "输入模型标签 (例如{{modelTag}})",
 	"Enter Number of Steps (e.g. 50)": "输入步数 (例如 50)",
 	"Enter Score": "输入分",
@@ -197,7 +192,7 @@
 	"Export All Chats (All Users)": "导出所有聊天(所有用户)",
 	"Export Chats": "导出聊天",
 	"Export Documents Mapping": "导出文档映射",
-	"Export Modelfiles": "导出模型文件",
+	"Export Models": "",
 	"Export Prompts": "导出提示词",
 	"Failed to create API Key.": "无法创建 API 密钥。",
 	"Failed to read clipboard contents": "无法读取剪贴板内容",
@@ -210,7 +205,7 @@
 	"Focus chat input": "聚焦聊天输入",
 	"Followed instructions perfectly": "完全遵循说明",
 	"Format your variables using square brackets like this:": "使用这样的方括号格式化你的变量:",
-	"From (Base Model)": "来自(基础模型)",
+	"Frequencey Penalty": "",
 	"Full Screen Mode": "全屏模式",
 	"General": "通用",
 	"General Settings": "通用设置",
@@ -222,7 +217,6 @@
 	"Hello, {{name}}": "你好,{{name}}",
 	"Help": "帮助",
 	"Hide": "隐藏",
-	"Hide Additional Params": "隐藏额外参数",
 	"How can I help you today?": "我今天能帮你做什么?",
 	"Hybrid Search": "混合搜索",
 	"Image Generation (Experimental)": "图像生成(实验性)",
@@ -231,7 +225,7 @@
 	"Images": "图像",
 	"Import Chats": "导入聊天",
 	"Import Documents Mapping": "导入文档映射",
-	"Import Modelfiles": "导入模型文件",
+	"Import Models": "",
 	"Import Prompts": "导入提示",
 	"Include `--api` flag when running stable-diffusion-webui": "运行 stable-diffusion-webui 时包含 `--api` 标志",
 	"Input commands": "输入命令",
@@ -240,6 +234,7 @@
 	"January": "一月",
 	"join our Discord for help.": "加入我们的 Discord 寻求帮助。",
 	"JSON": "JSON",
+	"JSON Preview": "",
 	"July": "七月",
 	"June": "六月",
 	"JWT Expiration": "JWT 过期",
@@ -254,11 +249,10 @@
 	"LTR": "LTR",
 	"Made by OpenWebUI Community": "由 OpenWebUI 社区制作",
 	"Make sure to enclose them with": "确保将它们包含在内",
-	"Manage LiteLLM Models": "管理 LiteLLM 模型",
 	"Manage Models": "管理模型",
 	"Manage Ollama Models": "管理 Ollama 模型",
 	"March": "三月",
-	"Max Tokens": "最大令牌数",
+	"Max Tokens (num_predict)": "",
 	"Maximum of 3 models can be downloaded simultaneously. Please try again later.": "最多可以同时下载 3 个模型,请稍后重试。",
 	"May": "五月",
 	"Memories accessible by LLMs will be shown here.": "LLMs 可以访问的记忆将显示在这里。",
@@ -273,22 +267,19 @@
 	"Model '{{modelName}}' has been successfully downloaded.": "模型'{{modelName}}'已成功下载。",
 	"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 filesystem path detected. Model shortname is required for update, cannot continue.": "检测到模型文件系统路径。模型简名是更新所必需的,无法继续。",
-	"Model Name": "模型名称",
+	"Model ID": "",
 	"Model not selected": "未选择模型",
-	"Model Tag Name": "模型标签名称",
+	"Model Params": "",
 	"Model Whitelisting": "白名单模型",
 	"Model(s) Whitelisted": "模型已加入白名单",
-	"Modelfile": "模型文件",
-	"Modelfile Advanced Settings": "模型文件高级设置",
 	"Modelfile Content": "模型文件内容",
-	"Modelfiles": "模型文件",
 	"Models": "模型",
 	"More": "更多",
 	"Name": "名称",
 	"Name Tag": "名称标签",
-	"Name your modelfile": "命名你的模型文件",
+	"Name your model": "",
 	"New Chat": "新聊天",
 	"New Password": "新密码",
 	"No results found": "未找到结果",
@@ -296,8 +287,6 @@
 	"No search results found": "",
 	"No source available": "没有可用来源",
 	"Not factually correct": "与事实不符",
-	"Not sure what to add?": "不确定要添加什么?",
-	"Not sure what to write? Switch to": "不确定写什么?切换到",
 	"Note: If you set a minimum score, the search will only return documents with a score greater than or equal to the minimum score.": "注意:如果设置了最低分数,搜索只会返回分数大于或等于最低分数的文档。",
 	"Notifications": "桌面通知",
 	"November": "十一月",
@@ -326,7 +315,6 @@
 	"or": "或",
 	"Other": "其他",
 	"Overview": "概述",
-	"Parameters": "参数",
 	"Password": "密码",
 	"PDF document (.pdf)": "PDF 文档 (.pdf)",
 	"PDF Extract Images (OCR)": "PDF 图像处理 (使用 OCR)",
@@ -346,10 +334,8 @@
 	"Prompts": "提示词",
 	"Pull \"{{searchValue}}\" from Ollama.com": "从 Ollama.com 拉取 \"{{searchValue}}\"",
 	"Pull a model from Ollama.com": "从 Ollama.com 拉取一个模型",
-	"Pull Progress": "拉取进度",
 	"Query Params": "查询参数",
 	"RAG Template": "RAG 模板",
-	"Raw Format": "原始格式",
 	"Read Aloud": "朗读",
 	"Record voice": "录音",
 	"Redirecting you to OpenWebUI Community": "正在将您重定向到 OpenWebUI 社区",
@@ -360,7 +346,6 @@
 	"Remove Model": "移除模型",
 	"Rename": "重命名",
 	"Repeat Last N": "重复最后 N 次",
-	"Repeat Penalty": "重复惩罚",
 	"Request Mode": "请求模式",
 	"Reranking Model": "重排模型",
 	"Reranking model disabled": "重排模型已禁用",
@@ -387,10 +372,12 @@
 	"See readme.md for instructions": "查看 readme.md 以获取说明",
 	"See what's new": "查看最新内容",
 	"Seed": "种子",
+	"Select a base model": "",
 	"Select a mode": "选择一个模式",
 	"Select a model": "选择一个模型",
 	"Select an Ollama instance": "选择一个 Ollama 实例",
 	"Select model": "选择模型",
+	"Selected model(s) do not support image inputs": "",
 	"Send": "发送",
 	"Send a Message": "发送消息",
 	"Send message": "发送消息",
@@ -412,7 +399,6 @@
 	"Share to OpenWebUI Community": "分享到 OpenWebUI 社区",
 	"short-summary": "简短总结",
 	"Show": "显示",
-	"Show Additional Params": "显示额外参数",
 	"Show shortcuts": "显示快捷方式",
 	"Showcased creativity": "展示创意",
 	"sidebar": "侧边栏",
@@ -431,7 +417,6 @@
 	"Success": "成功",
 	"Successfully updated.": "成功更新。",
 	"Suggested": "建议",
-	"Sync All": "同步所有",
 	"System": "系统",
 	"System Prompt": "系统提示",
 	"Tags": "标签",
@@ -502,6 +487,7 @@
 	"Write a summary in 50 words that summarizes [topic or keyword].": "用 50 个字写一个总结 [主题或关键词]。",
 	"Yesterday": "昨天",
 	"You": "你",
+	"You cannot clone a base model": "",
 	"You have no archived conversations.": "你没有存档的对话。",
 	"You have shared this chat": "你分享了这次聊天",
 	"You're a helpful assistant.": "你是一个有帮助的助手。",

+ 23 - 37
src/lib/i18n/locales/zh-TW/translation.json

@@ -3,6 +3,8 @@
 	"(Beta)": "(測試版)",
 	"(e.g. `sh webui.sh --api`)": "(例如 `sh webui.sh --api`)",
 	"(latest)": "(最新版)",
+	"{{ models }}": "",
+	"{{ owner }}: You cannot delete a base model": "",
 	"{{modelName}} is thinking...": "{{modelName}} 正在思考...",
 	"{{user}}'s Chats": "{{user}} 的聊天",
 	"{{webUIName}} Backend Required": "需要 {{webUIName}} 後台",
@@ -12,9 +14,8 @@
 	"Account": "帳號",
 	"Accurate information": "準確信息",
 	"Add": "新增",
-	"Add a model": "新增模型",
-	"Add a model tag name": "新增模型標籤",
-	"Add a short description about what this modelfile does": "為這個 Modelfile 添加一段簡短的描述",
+	"Add a model id": "",
+	"Add a short description about what this model does": "",
 	"Add a short title for this prompt": "為這個提示詞添加一個簡短的標題",
 	"Add a tag": "新增標籤",
 	"Add custom prompt": "新增自定義提示詞",
@@ -30,6 +31,7 @@
 	"Admin Panel": "管理員控制台",
 	"Admin Settings": "管理設定",
 	"Advanced Parameters": "進階參數",
+	"Advanced Params": "",
 	"all": "所有",
 	"All Documents": "所有文件",
 	"All Users": "所有使用者",
@@ -44,7 +46,6 @@
 	"API Key": "API Key",
 	"API Key created.": "API Key",
 	"API keys": "API Keys",
-	"API RPM": "API RPM",
 	"April": "4月",
 	"Archive": "存檔",
 	"Archived Chats": "聊天記錄存檔",
@@ -61,12 +62,12 @@
 	"available!": "可以使用!",
 	"Back": "返回",
 	"Bad Response": "錯誤回應",
+	"Base Model (From)": "",
 	"before": "前",
 	"Being lazy": "懶人模式",
-	"Builder Mode": "建構模式",
 	"Bypass SSL verification for Websites": "跳過 SSL 驗證",
 	"Cancel": "取消",
-	"Categories": "分類",
+	"Capabilities": "",
 	"Change Password": "修改密碼",
 	"Chat": "聊天",
 	"Chat Bubble UI": "聊天氣泡介面",
@@ -84,7 +85,6 @@
 	"Citation": "引文",
 	"Click here for help.": "點擊這裡尋找幫助。",
 	"Click here to": "點擊這裡",
-	"Click here to check other modelfiles.": "點擊這裡檢查其他 Modelfiles。",
 	"Click here to select": "點擊這裡選擇",
 	"Click here to select a csv file.": "點擊這裡選擇 csv 檔案。",
 	"Click here to select documents.": "點擊這裡選擇文件。",
@@ -109,7 +109,7 @@
 	"Copy Link": "複製連結",
 	"Copying to clipboard was successful!": "成功複製到剪貼簿!",
 	"Create a concise, 3-5 word phrase as a header for the following query, strictly adhering to the 3-5 word limit and avoiding the use of the word 'title':": "為以下的查詢建立一個簡潔、3-5 個詞的短語作為標題,嚴格遵守 3-5 個詞的限制,避免使用「標題」這個詞:",
-	"Create a modelfile": "建立 Modelfile",
+	"Create a model": "",
 	"Create Account": "建立帳號",
 	"Create new key": "建立新密鑰",
 	"Create new secret key": "建立新密鑰",
@@ -118,7 +118,7 @@
 	"Current Model": "目前模型",
 	"Current Password": "目前密碼",
 	"Custom": "自訂",
-	"Customize Ollama models for a specific purpose": "定制特定用途的 Ollama 模型",
+	"Customize models for a specific purpose": "",
 	"Dark": "暗色",
 	"Dashboard": "儀表板",
 	"Database": "資料庫",
@@ -139,11 +139,11 @@
 	"delete this link": "刪除此連結",
 	"Delete User": "刪除用戶",
 	"Deleted {{deleteModelTag}}": "已刪除 {{deleteModelTag}}",
-	"Deleted {{tagName}}": "已刪除 {{tagName}}",
+	"Deleted {{name}}": "",
 	"Description": "描述",
 	"Didn't fully follow instructions": "無法完全遵循指示",
 	"Disabled": "已停用",
-	"Discover a modelfile": "發現新 Modelfile",
+	"Discover a model": "",
 	"Discover a prompt": "發現新提示詞",
 	"Discover, download, and explore custom prompts": "發現、下載並探索他人設置的提示詞",
 	"Discover, download, and explore model presets": "發現、下載並探索他人設置的模型",
@@ -177,11 +177,6 @@
 	"Enter Chunk Size": "輸入 Chunk 大小",
 	"Enter Image Size (e.g. 512x512)": "輸入圖片大小(例如 512x512)",
 	"Enter language codes": "輸入語言代碼",
-	"Enter LiteLLM API Base URL (litellm_params.api_base)": "輸入 LiteLLM API 基本 URL(litellm_params.api_base)",
-	"Enter LiteLLM API Key (litellm_params.api_key)": "輸入 LiteLLM API 金鑰(litellm_params.api_key)",
-	"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 tag (e.g. {{modelTag}})": "輸入模型標籤(例如 {{modelTag}})",
 	"Enter Number of Steps (e.g. 50)": "輸入步數(例如 50)",
 	"Enter Score": "輸入分數",
@@ -197,7 +192,7 @@
 	"Export All Chats (All Users)": "匯出所有聊天紀錄(所有使用者)",
 	"Export Chats": "匯出聊天紀錄",
 	"Export Documents Mapping": "匯出文件映射",
-	"Export Modelfiles": "匯出 Modelfiles",
+	"Export Models": "",
 	"Export Prompts": "匯出提示詞",
 	"Failed to create API Key.": "無法創建 API 金鑰。",
 	"Failed to read clipboard contents": "無法讀取剪貼簿內容",
@@ -210,7 +205,7 @@
 	"Focus chat input": "聚焦聊天輸入框",
 	"Followed instructions perfectly": "完全遵循指示",
 	"Format your variables using square brackets like this:": "像這樣使用方括號來格式化你的變數:",
-	"From (Base Model)": "來自(基礎模型)",
+	"Frequencey Penalty": "",
 	"Full Screen Mode": "全螢幕模式",
 	"General": "常用",
 	"General Settings": "常用設定",
@@ -222,7 +217,6 @@
 	"Hello, {{name}}": "你好,{{name}}",
 	"Help": "幫助",
 	"Hide": "隱藏",
-	"Hide Additional Params": "隱藏額外參數",
 	"How can I help you today?": "今天能為你做什麼?",
 	"Hybrid Search": "混合搜索",
 	"Image Generation (Experimental)": "圖像生成(實驗功能)",
@@ -231,7 +225,7 @@
 	"Images": "圖片",
 	"Import Chats": "匯入聊天紀錄",
 	"Import Documents Mapping": "匯入文件映射",
-	"Import Modelfiles": "匯入 Modelfiles",
+	"Import Models": "",
 	"Import Prompts": "匯入提示詞",
 	"Include `--api` flag when running stable-diffusion-webui": "在運行 stable-diffusion-webui 時加上 `--api` 標誌",
 	"Input commands": "輸入命令",
@@ -240,6 +234,7 @@
 	"January": "1月",
 	"join our Discord for help.": "加入我們的 Discord 尋找幫助。",
 	"JSON": "JSON",
+	"JSON Preview": "",
 	"July": "7月",
 	"June": "6月",
 	"JWT Expiration": "JWT 過期時間",
@@ -254,11 +249,10 @@
 	"LTR": "LTR",
 	"Made by OpenWebUI Community": "由 OpenWebUI 社區製作",
 	"Make sure to enclose them with": "請確保變數有被以下符號框住:",
-	"Manage LiteLLM Models": "管理 LiteLLM 模型",
 	"Manage Models": "管理模組",
 	"Manage Ollama Models": "管理 Ollama 模型",
 	"March": "3月",
-	"Max Tokens": "最大 Token 數",
+	"Max Tokens (num_predict)": "",
 	"Maximum of 3 models can be downloaded simultaneously. Please try again later.": "最多可以同時下載 3 個模型。請稍後再試。",
 	"May": "5月",
 	"Memories accessible by LLMs will be shown here.": "LLM 記憶將會顯示在此處。",
@@ -273,22 +267,19 @@
 	"Model '{{modelName}}' has been successfully downloaded.": "'{{modelName}}' 模型已成功下載。",
 	"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 filesystem path detected. Model shortname is required for update, cannot continue.": "模型文件系統路徑已檢測。需要更新模型短名,無法繼續。",
-	"Model Name": "模型名稱",
+	"Model ID": "",
 	"Model not selected": "未選擇模型",
-	"Model Tag Name": "模型標籤",
+	"Model Params": "",
 	"Model Whitelisting": "白名單模型",
 	"Model(s) Whitelisted": "模型已加入白名單",
-	"Modelfile": "Modelfile",
-	"Modelfile Advanced Settings": "Modelfile 進階設定",
 	"Modelfile Content": "Modelfile 內容",
-	"Modelfiles": "Modelfiles",
 	"Models": "模型",
 	"More": "更多",
 	"Name": "名稱",
 	"Name Tag": "名稱標籤",
-	"Name your modelfile": "命名你的 Modelfile",
+	"Name your model": "",
 	"New Chat": "新增聊天",
 	"New Password": "新密碼",
 	"No results found": "沒有找到結果",
@@ -296,8 +287,6 @@
 	"No search results found": "",
 	"No source available": "沒有可用的來源",
 	"Not factually correct": "與真實資訊不相符",
-	"Not sure what to add?": "不確定要新增什麼嗎?",
-	"Not sure what to write? Switch to": "不確定要寫什麼?切換到",
 	"Note: If you set a minimum score, the search will only return documents with a score greater than or equal to the minimum score.": "註:如果設置最低分數,則搜索將只返回分數大於或等於最低分數的文檔。",
 	"Notifications": "桌面通知",
 	"November": "11月",
@@ -326,7 +315,6 @@
 	"or": "或",
 	"Other": "其他",
 	"Overview": "總覽",
-	"Parameters": "參數",
 	"Password": "密碼",
 	"PDF document (.pdf)": "PDF 文件 (.pdf)",
 	"PDF Extract Images (OCR)": "PDF 圖像擷取(OCR 光學文字辨識)",
@@ -346,10 +334,8 @@
 	"Prompts": "提示詞",
 	"Pull \"{{searchValue}}\" from Ollama.com": "從 Ollama.com 下載 \"{{searchValue}}\"",
 	"Pull a model from Ollama.com": "從 Ollama.com 下載模型",
-	"Pull Progress": "下載進度",
 	"Query Params": "查詢參數",
 	"RAG Template": "RAG 範例",
-	"Raw Format": "原始格式",
 	"Read Aloud": "讀出",
 	"Record voice": "錄音",
 	"Redirecting you to OpenWebUI Community": "將你重新導向到 OpenWebUI 社群",
@@ -360,7 +346,6 @@
 	"Remove Model": "移除模型",
 	"Rename": "重命名",
 	"Repeat Last N": "重複最後 N 次",
-	"Repeat Penalty": "重複懲罰",
 	"Request Mode": "請求模式",
 	"Reranking Model": "重新排序模型",
 	"Reranking model disabled": "重新排序模型已禁用",
@@ -387,10 +372,12 @@
 	"See readme.md for instructions": "查看 readme.md 獲取指南",
 	"See what's new": "查看最新內容",
 	"Seed": "種子",
+	"Select a base model": "",
 	"Select a mode": "選擇模式",
 	"Select a model": "選擇一個模型",
 	"Select an Ollama instance": "選擇 Ollama 實例",
 	"Select model": "選擇模型",
+	"Selected model(s) do not support image inputs": "",
 	"Send": "傳送",
 	"Send a Message": "傳送訊息",
 	"Send message": "傳送訊息",
@@ -412,7 +399,6 @@
 	"Share to OpenWebUI Community": "分享到 OpenWebUI 社群",
 	"short-summary": "簡短摘要",
 	"Show": "顯示",
-	"Show Additional Params": "顯示額外參數",
 	"Show shortcuts": "顯示快速鍵",
 	"Showcased creativity": "展示創造性",
 	"sidebar": "側邊欄",
@@ -431,7 +417,6 @@
 	"Success": "成功",
 	"Successfully updated.": "更新成功。",
 	"Suggested": "建議",
-	"Sync All": "全部同步",
 	"System": "系統",
 	"System Prompt": "系統提示詞",
 	"Tags": "標籤",
@@ -502,6 +487,7 @@
 	"Write a summary in 50 words that summarizes [topic or keyword].": "寫一個 50 字的摘要來概括 [主題或關鍵詞]。",
 	"Yesterday": "昨天",
 	"You": "你",
+	"You cannot clone a base model": "",
 	"You have no archived conversations.": "你沒有任何已封存的對話",
 	"You have shared this chat": "你已分享此聊天",
 	"You're a helpful assistant.": "你是一位善於協助他人的助手。",

+ 10 - 8
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);
@@ -44,25 +45,25 @@ export const showChangelog = writable(false);
 
 export type Model = OpenAIModel | OllamaModel;
 
-type OpenAIModel = {
+type BaseModel = {
 	id: string;
 	name: string;
-	external: boolean;
-	source?: string;
+	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;
 	websearch?: boolean;
 };
 

+ 0 - 24
src/lib/utils/index.ts

@@ -1,29 +1,5 @@
 import { v4 as uuidv4 } from 'uuid';
 import sha256 from 'js-sha256';
-import { getOllamaModels } from '$lib/apis/ollama';
-import { getOpenAIModels } from '$lib/apis/openai';
-import { getLiteLLMModels } from '$lib/apis/litellm';
-
-export const getModels = async (token: string) => {
-	let models = await Promise.all([
-		getOllamaModels(token).catch((error) => {
-			console.log(error);
-			return null;
-		}),
-		getOpenAIModels(token).catch((error) => {
-			console.log(error);
-			return null;
-		}),
-		getLiteLLMModels(token).catch((error) => {
-			console.log(error);
-			return null;
-		})
-	]);
-
-	models = models.filter((models) => models).reduce((a, e, i, arr) => a.concat(e), []);
-
-	return models;
-};
 
 //////////////////////////
 // Helper functions

+ 3 - 28
src/routes/(app)/+layout.svelte

@@ -7,9 +7,8 @@
 
 	import { goto } from '$app/navigation';
 
-	import { getModels as _getModels } from '$lib/utils';
+	import { getModels as _getModels } from '$lib/apis';
 	import { getOllamaVersion } from '$lib/apis/ollama';
-	import { getModelfiles } from '$lib/apis/modelfiles';
 	import { getPrompts } from '$lib/apis/prompts';
 
 	import { getDocs } from '$lib/apis/documents';
@@ -20,7 +19,6 @@
 		showSettings,
 		settings,
 		models,
-		modelfiles,
 		prompts,
 		documents,
 		tags,
@@ -50,21 +48,6 @@
 		return _getModels(localStorage.token);
 	};
 
-	const setOllamaVersion = async (version: string = '') => {
-		if (version === '') {
-			version = await getOllamaVersion(localStorage.token).catch((error) => {
-				return '';
-			});
-		}
-
-		ollamaVersion = version;
-
-		console.log(ollamaVersion);
-		if (compareVersion(REQUIRED_OLLAMA_VERSION, ollamaVersion)) {
-			toast.error(`Ollama Version: ${ollamaVersion !== '' ? ollamaVersion : 'Not Detected'}`);
-		}
-	};
-
 	onMount(async () => {
 		if ($user === undefined) {
 			await goto('/auth');
@@ -93,9 +76,6 @@
 				(async () => {
 					models.set(await getModels());
 				})(),
-				(async () => {
-					modelfiles.set(await getModelfiles(localStorage.token));
-				})(),
 				(async () => {
 					prompts.set(await getPrompts(localStorage.token));
 				})(),
@@ -107,11 +87,6 @@
 				})()
 			]);
 
-			modelfiles.subscribe(async () => {
-				// should fetch models
-				models.set(await getModels());
-			});
-
 			document.addEventListener('keydown', function (event) {
 				const isCtrlPressed = event.ctrlKey || event.metaKey; // metaKey is for Cmd key on Mac
 				// Check if the Shift key is pressed
@@ -188,12 +163,12 @@
 	});
 </script>
 
-<div class=" hidden lg:flex fixed bottom-0 right-0 px-3 py-3 z-10">
+<div class=" hidden lg:flex fixed bottom-0 right-0 px-2 py-2 z-10">
 	<Tooltip content={$i18n.t('Help')} placement="left">
 		<button
 			id="show-shortcuts-button"
 			bind:this={showShortcutsButtonElement}
-			class="text-gray-600 dark:text-gray-300 bg-gray-300/20 w-6 h-6 flex items-center justify-center text-xs rounded-full"
+			class="text-gray-600 dark:text-gray-300 bg-gray-300/20 size-5 flex items-center justify-center text-[0.7rem] rounded-full"
 			on:click={() => {
 				showShortcuts = !showShortcuts;
 			}}

+ 2 - 2
src/routes/(app)/workspace/+layout.svelte

@@ -39,10 +39,10 @@
 			class="flex scrollbar-none overflow-x-auto w-fit text-center text-sm font-medium rounded-xl bg-transparent/10 p-1"
 		>
 			<a
-				class="min-w-fit rounded-lg p-1.5 px-3 {$page.url.pathname.includes('/workspace/modelfiles')
+				class="min-w-fit rounded-lg p-1.5 px-3 {$page.url.pathname.includes('/workspace/models')
 					? 'bg-gray-50 dark:bg-gray-850'
 					: ''} transition"
-				href="/workspace/modelfiles">{$i18n.t('Modelfiles')}</a
+				href="/workspace/models">{$i18n.t('Models')}</a
 			>
 
 			<a

+ 1 - 1
src/routes/(app)/workspace/+page.svelte

@@ -3,6 +3,6 @@
 	import { onMount } from 'svelte';
 
 	onMount(() => {
-		goto('/workspace/modelfiles');
+		goto('/workspace/models');
 	});
 </script>

+ 0 - 5
src/routes/(app)/workspace/modelfiles/+page.svelte

@@ -1,5 +0,0 @@
-<script>
-	import Modelfiles from '$lib/components/workspace/Modelfiles.svelte';
-</script>
-
-<Modelfiles />

+ 0 - 721
src/routes/(app)/workspace/modelfiles/create/+page.svelte

@@ -1,721 +0,0 @@
-<script>
-	import { v4 as uuidv4 } from 'uuid';
-	import { toast } from 'svelte-sonner';
-	import { goto } from '$app/navigation';
-	import { settings, user, config, modelfiles, models } from '$lib/stores';
-
-	import AdvancedParams from '$lib/components/chat/Settings/Advanced/AdvancedParams.svelte';
-	import { splitStream } from '$lib/utils';
-	import { onMount, tick, getContext } from 'svelte';
-	import { createModel } from '$lib/apis/ollama';
-	import { createNewModelfile, getModelfileByTagName, getModelfiles } from '$lib/apis/modelfiles';
-
-	const i18n = getContext('i18n');
-
-	let loading = false;
-
-	let filesInputElement;
-	let inputFiles;
-	let imageUrl = null;
-	let digest = '';
-	let pullProgress = null;
-	let success = false;
-
-	// ///////////
-	// Modelfile
-	// ///////////
-
-	let title = '';
-	let tagName = '';
-	let desc = '';
-
-	let raw = true;
-	let advanced = false;
-
-	// Raw Mode
-	let content = '';
-
-	// Builder Mode
-	let model = '';
-	let system = '';
-	let template = '';
-	let options = {
-		// Advanced
-		seed: 0,
-		stop: '',
-		temperature: '',
-		repeat_penalty: '',
-		repeat_last_n: '',
-		mirostat: '',
-		mirostat_eta: '',
-		mirostat_tau: '',
-		top_k: '',
-		top_p: '',
-		tfs_z: '',
-		num_ctx: '',
-		num_predict: ''
-	};
-
-	let modelfileCreator = null;
-
-	$: tagName = title !== '' ? `${title.replace(/\s+/g, '-').toLowerCase()}:latest` : '';
-
-	$: if (!raw) {
-		content = `FROM ${model}
-${template !== '' ? `TEMPLATE """${template}"""` : ''}
-${options.seed !== 0 ? `PARAMETER seed ${options.seed}` : ''}
-${options.stop !== '' ? `PARAMETER stop ${options.stop}` : ''}
-${options.temperature !== '' ? `PARAMETER temperature ${options.temperature}` : ''}
-${options.repeat_penalty !== '' ? `PARAMETER repeat_penalty ${options.repeat_penalty}` : ''}
-${options.repeat_last_n !== '' ? `PARAMETER repeat_last_n ${options.repeat_last_n}` : ''}
-${options.mirostat !== '' ? `PARAMETER mirostat ${options.mirostat}` : ''}
-${options.mirostat_eta !== '' ? `PARAMETER mirostat_eta ${options.mirostat_eta}` : ''}
-${options.mirostat_tau !== '' ? `PARAMETER mirostat_tau ${options.mirostat_tau}` : ''}
-${options.top_k !== '' ? `PARAMETER top_k ${options.top_k}` : ''}
-${options.top_p !== '' ? `PARAMETER top_p ${options.top_p}` : ''}
-${options.tfs_z !== '' ? `PARAMETER tfs_z ${options.tfs_z}` : ''}
-${options.num_ctx !== '' ? `PARAMETER num_ctx ${options.num_ctx}` : ''}
-${options.num_predict !== '' ? `PARAMETER num_predict ${options.num_predict}` : ''}
-SYSTEM """${system}"""`.replace(/^\s*\n/gm, '');
-	}
-
-	let suggestions = [
-		{
-			content: ''
-		}
-	];
-
-	let categories = {
-		character: false,
-		assistant: false,
-		writing: false,
-		productivity: false,
-		programming: false,
-		'data analysis': false,
-		lifestyle: false,
-		education: false,
-		business: false
-	};
-
-	const saveModelfile = async (modelfile) => {
-		await createNewModelfile(localStorage.token, modelfile);
-		await modelfiles.set(await getModelfiles(localStorage.token));
-	};
-
-	const submitHandler = async () => {
-		loading = true;
-
-		if (Object.keys(categories).filter((category) => categories[category]).length == 0) {
-			toast.error(
-				'Uh-oh! It looks like you missed selecting a category. Please choose one to complete your modelfile.'
-			);
-			loading = false;
-			success = false;
-			return success;
-		}
-
-		if (
-			$models.map((model) => model.name).includes(tagName) ||
-			(await getModelfileByTagName(localStorage.token, tagName).catch(() => false))
-		) {
-			toast.error(
-				`Uh-oh! It looks like you already have a model named '${tagName}'. Please choose a different name to complete your modelfile.`
-			);
-			loading = false;
-			success = false;
-			return success;
-		}
-
-		if (
-			title !== '' &&
-			desc !== '' &&
-			content !== '' &&
-			Object.keys(categories).filter((category) => categories[category]).length > 0 &&
-			!$models.includes(tagName)
-		) {
-			const res = await createModel(localStorage.token, tagName, content);
-
-			if (res) {
-				const reader = res.body
-					.pipeThrough(new TextDecoderStream())
-					.pipeThrough(splitStream('\n'))
-					.getReader();
-
-				while (true) {
-					const { value, done } = await reader.read();
-					if (done) break;
-
-					try {
-						let lines = value.split('\n');
-
-						for (const line of lines) {
-							if (line !== '') {
-								console.log(line);
-								let data = JSON.parse(line);
-								console.log(data);
-
-								if (data.error) {
-									throw data.error;
-								}
-								if (data.detail) {
-									throw data.detail;
-								}
-
-								if (data.status) {
-									if (
-										!data.digest &&
-										!data.status.includes('writing') &&
-										!data.status.includes('sha256')
-									) {
-										toast.success(data.status);
-
-										if (data.status === 'success') {
-											success = true;
-										}
-									} else {
-										if (data.digest) {
-											digest = data.digest;
-
-											if (data.completed) {
-												pullProgress = Math.round((data.completed / data.total) * 1000) / 10;
-											} else {
-												pullProgress = 100;
-											}
-										}
-									}
-								}
-							}
-						}
-					} catch (error) {
-						console.log(error);
-						toast.error(error);
-					}
-				}
-			}
-
-			if (success) {
-				await saveModelfile({
-					tagName: tagName,
-					imageUrl: imageUrl,
-					title: title,
-					desc: desc,
-					content: content,
-					suggestionPrompts: suggestions.filter((prompt) => prompt.content !== ''),
-					categories: Object.keys(categories).filter((category) => categories[category]),
-					user: modelfileCreator !== null ? modelfileCreator : undefined
-				});
-				await goto('/workspace/modelfiles');
-			}
-		}
-		loading = false;
-		success = false;
-	};
-
-	onMount(async () => {
-		window.addEventListener('message', async (event) => {
-			if (
-				![
-					'https://ollamahub.com',
-					'https://www.ollamahub.com',
-					'https://openwebui.com',
-					'https://www.openwebui.com',
-					'http://localhost:5173'
-				].includes(event.origin)
-			)
-				return;
-			const modelfile = JSON.parse(event.data);
-			console.log(modelfile);
-
-			imageUrl = modelfile.imageUrl;
-			title = modelfile.title;
-			await tick();
-			tagName = `${modelfile.user.username === 'hub' ? '' : `hub/`}${modelfile.user.username}/${
-				modelfile.tagName
-			}`;
-			desc = modelfile.desc;
-			content = modelfile.content;
-			suggestions =
-				modelfile.suggestionPrompts.length != 0
-					? modelfile.suggestionPrompts
-					: [
-							{
-								content: ''
-							}
-					  ];
-
-			modelfileCreator = {
-				username: modelfile.user.username,
-				name: modelfile.user.name
-			};
-			for (const category of modelfile.categories) {
-				categories[category.toLowerCase()] = true;
-			}
-		});
-
-		if (window.opener ?? false) {
-			window.opener.postMessage('loaded', '*');
-		}
-
-		if (sessionStorage.modelfile) {
-			const modelfile = JSON.parse(sessionStorage.modelfile);
-			console.log(modelfile);
-			imageUrl = modelfile.imageUrl;
-			title = modelfile.title;
-			await tick();
-			tagName = modelfile.tagName;
-			desc = modelfile.desc;
-			content = modelfile.content;
-			suggestions =
-				modelfile.suggestionPrompts.length != 0
-					? modelfile.suggestionPrompts
-					: [
-							{
-								content: ''
-							}
-					  ];
-
-			for (const category of modelfile.categories) {
-				categories[category.toLowerCase()] = true;
-			}
-
-			sessionStorage.removeItem('modelfile');
-		}
-	});
-</script>
-
-<div class="w-full max-h-full">
-	<input
-		bind:this={filesInputElement}
-		bind:files={inputFiles}
-		type="file"
-		hidden
-		accept="image/*"
-		on:change={() => {
-			let reader = new FileReader();
-			reader.onload = (event) => {
-				let originalImageUrl = `${event.target.result}`;
-
-				const img = new Image();
-				img.src = originalImageUrl;
-
-				img.onload = function () {
-					const canvas = document.createElement('canvas');
-					const ctx = canvas.getContext('2d');
-
-					// Calculate the aspect ratio of the image
-					const aspectRatio = img.width / img.height;
-
-					// Calculate the new width and height to fit within 100x100
-					let newWidth, newHeight;
-					if (aspectRatio > 1) {
-						newWidth = 100 * aspectRatio;
-						newHeight = 100;
-					} else {
-						newWidth = 100;
-						newHeight = 100 / aspectRatio;
-					}
-
-					// Set the canvas size
-					canvas.width = 100;
-					canvas.height = 100;
-
-					// Calculate the position to center the image
-					const offsetX = (100 - newWidth) / 2;
-					const offsetY = (100 - newHeight) / 2;
-
-					// Draw the image on the canvas
-					ctx.drawImage(img, offsetX, offsetY, newWidth, newHeight);
-
-					// Get the base64 representation of the compressed image
-					const compressedSrc = canvas.toDataURL('image/jpeg');
-
-					// Display the compressed image
-					imageUrl = compressedSrc;
-
-					inputFiles = null;
-				};
-			};
-
-			if (
-				inputFiles &&
-				inputFiles.length > 0 &&
-				['image/gif', 'image/webp', 'image/jpeg', 'image/png'].includes(inputFiles[0]['type'])
-			) {
-				reader.readAsDataURL(inputFiles[0]);
-			} else {
-				console.log(`Unsupported File Type '${inputFiles[0]['type']}'.`);
-				inputFiles = null;
-			}
-		}}
-	/>
-
-	<button
-		class="flex space-x-1"
-		on:click={() => {
-			history.back();
-		}}
-	>
-		<div class=" self-center">
-			<svg
-				xmlns="http://www.w3.org/2000/svg"
-				viewBox="0 0 20 20"
-				fill="currentColor"
-				class="w-4 h-4"
-			>
-				<path
-					fill-rule="evenodd"
-					d="M17 10a.75.75 0 01-.75.75H5.612l4.158 3.96a.75.75 0 11-1.04 1.08l-5.5-5.25a.75.75 0 010-1.08l5.5-5.25a.75.75 0 111.04 1.08L5.612 9.25H16.25A.75.75 0 0117 10z"
-					clip-rule="evenodd"
-				/>
-			</svg>
-		</div>
-		<div class=" self-center font-medium text-sm">{$i18n.t('Back')}</div>
-	</button>
-	<!-- <hr class="my-3 dark:border-gray-700" /> -->
-
-	<form
-		class="flex flex-col max-w-2xl mx-auto mt-4 mb-10"
-		on:submit|preventDefault={() => {
-			submitHandler();
-		}}
-	>
-		<div class="flex justify-center my-4">
-			<div class="self-center">
-				<button
-					class=" {imageUrl
-						? ''
-						: 'p-6'} rounded-full dark:bg-gray-700 border border-dashed border-gray-200"
-					type="button"
-					on:click={() => {
-						filesInputElement.click();
-					}}
-				>
-					{#if imageUrl}
-						<img
-							src={imageUrl}
-							alt="modelfile profile"
-							class=" rounded-full w-20 h-20 object-cover"
-						/>
-					{:else}
-						<svg
-							xmlns="http://www.w3.org/2000/svg"
-							viewBox="0 0 24 24"
-							fill="currentColor"
-							class="w-8"
-						>
-							<path
-								fill-rule="evenodd"
-								d="M12 3.75a.75.75 0 01.75.75v6.75h6.75a.75.75 0 010 1.5h-6.75v6.75a.75.75 0 01-1.5 0v-6.75H4.5a.75.75 0 010-1.5h6.75V4.5a.75.75 0 01.75-.75z"
-								clip-rule="evenodd"
-							/>
-						</svg>
-					{/if}
-				</button>
-			</div>
-		</div>
-
-		<div class="my-2 flex space-x-2">
-			<div class="flex-1">
-				<div class=" text-sm font-semibold mb-2">{$i18n.t('Name')}*</div>
-
-				<div>
-					<input
-						class="px-3 py-1.5 text-sm w-full bg-transparent border dark:border-gray-600 outline-none rounded-lg"
-						placeholder={$i18n.t('Name your modelfile')}
-						bind:value={title}
-						required
-					/>
-				</div>
-			</div>
-
-			<div class="flex-1">
-				<div class=" text-sm font-semibold mb-2">{$i18n.t('Model Tag Name')}*</div>
-
-				<div>
-					<input
-						class="px-3 py-1.5 text-sm w-full bg-transparent border dark:border-gray-600 outline-none rounded-lg"
-						placeholder={$i18n.t('Add a model tag name')}
-						bind:value={tagName}
-						required
-					/>
-				</div>
-			</div>
-		</div>
-
-		<div class="my-2">
-			<div class=" text-sm font-semibold mb-2">{$i18n.t('Description')}*</div>
-
-			<div>
-				<input
-					class="px-3 py-1.5 text-sm w-full bg-transparent border dark:border-gray-600 outline-none rounded-lg"
-					placeholder={$i18n.t('Add a short description about what this modelfile does')}
-					bind:value={desc}
-					required
-				/>
-			</div>
-		</div>
-
-		<div class="my-2">
-			<div class="flex w-full justify-between">
-				<div class=" self-center text-sm font-semibold">{$i18n.t('Modelfile')}</div>
-
-				<button
-					class="p-1 px-3 text-xs flex rounded transition"
-					type="button"
-					on:click={() => {
-						raw = !raw;
-					}}
-				>
-					{#if raw}
-						<span class="ml-2 self-center"> {$i18n.t('Raw Format')} </span>
-					{:else}
-						<span class="ml-2 self-center"> {$i18n.t('Builder Mode')} </span>
-					{/if}
-				</button>
-			</div>
-
-			<!-- <div class=" text-sm font-semibold mb-2"></div> -->
-
-			{#if raw}
-				<div class="mt-2">
-					<div class=" text-xs font-semibold mb-2">{$i18n.t('Content')}*</div>
-
-					<div>
-						<textarea
-							class="px-3 py-1.5 text-sm w-full bg-transparent border dark:border-gray-600 outline-none rounded-lg"
-							placeholder={`FROM llama2\nPARAMETER temperature 1\nSYSTEM """\nYou are Mario from Super Mario Bros, acting as an assistant.\n"""`}
-							rows="6"
-							bind:value={content}
-							required
-						/>
-					</div>
-
-					<div class="text-xs text-gray-400 dark:text-gray-500">
-						{$i18n.t('Not sure what to write? Switch to')}
-						<button
-							class="text-gray-500 dark:text-gray-300 font-medium cursor-pointer"
-							type="button"
-							on:click={() => {
-								raw = !raw;
-							}}>{$i18n.t('Builder Mode')}</button
-						>
-						or
-						<a
-							class=" text-gray-500 dark:text-gray-300 font-medium"
-							href="https://openwebui.com"
-							target="_blank"
-						>
-							{$i18n.t('Click here to check other modelfiles.')}
-						</a>
-					</div>
-				</div>
-			{:else}
-				<div class="my-2">
-					<div class=" text-xs font-semibold mb-2">{$i18n.t('From (Base Model)')}*</div>
-
-					<div>
-						<input
-							class="px-3 py-1.5 text-sm w-full bg-transparent border dark:border-gray-600 outline-none rounded-lg"
-							placeholder="Write a modelfile base model name (e.g. llama2, mistral)"
-							bind:value={model}
-							required
-						/>
-					</div>
-
-					<div class="mt-1 text-xs text-gray-400 dark:text-gray-500">
-						{$i18n.t('To access the available model names for downloading,')}
-						<a
-							class=" text-gray-500 dark:text-gray-300 font-medium"
-							href="https://ollama.com/library"
-							target="_blank">{$i18n.t('click here.')}</a
-						>
-					</div>
-				</div>
-
-				<div class="my-1">
-					<div class=" text-xs font-semibold mb-2">{$i18n.t('System Prompt')}</div>
-
-					<div>
-						<textarea
-							class="px-3 py-1.5 text-sm w-full bg-transparent border dark:border-gray-600 outline-none rounded-lg -mb-1"
-							placeholder={`Write your modelfile system prompt content here\ne.g.) You are Mario from Super Mario Bros, acting as an assistant.`}
-							rows="4"
-							bind:value={system}
-						/>
-					</div>
-				</div>
-
-				<div class="flex w-full justify-between">
-					<div class=" self-center text-sm font-semibold">
-						{$i18n.t('Modelfile Advanced Settings')}
-					</div>
-
-					<button
-						class="p-1 px-3 text-xs flex rounded transition"
-						type="button"
-						on:click={() => {
-							advanced = !advanced;
-						}}
-					>
-						{#if advanced}
-							<span class="ml-2 self-center">{$i18n.t('Custom')}</span>
-						{:else}
-							<span class="ml-2 self-center">{$i18n.t('Default')}</span>
-						{/if}
-					</button>
-				</div>
-
-				{#if advanced}
-					<div class="my-2">
-						<div class=" text-xs font-semibold mb-2">{$i18n.t('Template')}</div>
-
-						<div>
-							<textarea
-								class="px-3 py-1.5 text-sm w-full bg-transparent border dark:border-gray-600 outline-none rounded-lg -mb-1"
-								placeholder="Write your modelfile template content here"
-								rows="4"
-								bind:value={template}
-							/>
-						</div>
-					</div>
-
-					<div class="my-2">
-						<div class=" text-xs font-semibold mb-2">{$i18n.t('Parameters')}</div>
-
-						<div>
-							<AdvancedParams bind:options />
-						</div>
-					</div>
-				{/if}
-			{/if}
-		</div>
-
-		<div class="my-2">
-			<div class="flex w-full justify-between mb-2">
-				<div class=" self-center text-sm font-semibold">{$i18n.t('Prompt suggestions')}</div>
-
-				<button
-					class="p-1 px-3 text-xs flex rounded transition"
-					type="button"
-					on:click={() => {
-						if (suggestions.length === 0 || suggestions.at(-1).content !== '') {
-							suggestions = [...suggestions, { content: '' }];
-						}
-					}}
-				>
-					<svg
-						xmlns="http://www.w3.org/2000/svg"
-						viewBox="0 0 20 20"
-						fill="currentColor"
-						class="w-4 h-4"
-					>
-						<path
-							d="M10.75 4.75a.75.75 0 00-1.5 0v4.5h-4.5a.75.75 0 000 1.5h4.5v4.5a.75.75 0 001.5 0v-4.5h4.5a.75.75 0 000-1.5h-4.5v-4.5z"
-						/>
-					</svg>
-				</button>
-			</div>
-			<div class="flex flex-col space-y-1">
-				{#each suggestions as prompt, promptIdx}
-					<div class=" flex border dark:border-gray-600 rounded-lg">
-						<input
-							class="px-3 py-1.5 text-sm w-full bg-transparent outline-none border-r dark:border-gray-600"
-							placeholder={$i18n.t('Write a prompt suggestion (e.g. Who are you?)')}
-							bind:value={prompt.content}
-						/>
-
-						<button
-							class="px-2"
-							type="button"
-							on:click={() => {
-								suggestions.splice(promptIdx, 1);
-								suggestions = suggestions;
-							}}
-						>
-							<svg
-								xmlns="http://www.w3.org/2000/svg"
-								viewBox="0 0 20 20"
-								fill="currentColor"
-								class="w-4 h-4"
-							>
-								<path
-									d="M6.28 5.22a.75.75 0 00-1.06 1.06L8.94 10l-3.72 3.72a.75.75 0 101.06 1.06L10 11.06l3.72 3.72a.75.75 0 101.06-1.06L11.06 10l3.72-3.72a.75.75 0 00-1.06-1.06L10 8.94 6.28 5.22z"
-								/>
-							</svg>
-						</button>
-					</div>
-				{/each}
-			</div>
-		</div>
-
-		<div class="my-2">
-			<div class=" text-sm font-semibold mb-2">{$i18n.t('Categories')}</div>
-
-			<div class="grid grid-cols-4">
-				{#each Object.keys(categories) as category}
-					<div class="flex space-x-2 text-sm">
-						<input type="checkbox" bind:checked={categories[category]} />
-						<div class="capitalize">{category}</div>
-					</div>
-				{/each}
-			</div>
-		</div>
-
-		{#if pullProgress !== null}
-			<div class="my-2">
-				<div class=" text-sm font-semibold mb-2">{$i18n.t('Pull Progress')}</div>
-				<div class="w-full rounded-full dark:bg-gray-800">
-					<div
-						class="dark:bg-gray-600 bg-gray-500 text-xs font-medium text-gray-100 text-center p-0.5 leading-none rounded-full"
-						style="width: {Math.max(15, pullProgress ?? 0)}%"
-					>
-						{pullProgress ?? 0}%
-					</div>
-				</div>
-				<div class="mt-1 text-xs dark:text-gray-500" style="font-size: 0.5rem;">
-					{digest}
-				</div>
-			</div>
-		{/if}
-
-		<div class="my-2 flex justify-end">
-			<button
-				class=" text-sm px-3 py-2 transition rounded-xl {loading
-					? ' cursor-not-allowed bg-gray-100 dark:bg-gray-800'
-					: ' bg-gray-50 hover:bg-gray-100 dark:bg-gray-700 dark:hover:bg-gray-800'} flex"
-				type="submit"
-				disabled={loading}
-			>
-				<div class=" self-center font-medium">{$i18n.t('Save & Create')}</div>
-
-				{#if loading}
-					<div class="ml-1.5 self-center">
-						<svg
-							class=" w-4 h-4"
-							viewBox="0 0 24 24"
-							fill="currentColor"
-							xmlns="http://www.w3.org/2000/svg"
-							><style>
-								.spinner_ajPY {
-									transform-origin: center;
-									animation: spinner_AtaB 0.75s infinite linear;
-								}
-								@keyframes spinner_AtaB {
-									100% {
-										transform: rotate(360deg);
-									}
-								}
-							</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
-								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
-						>
-					</div>
-				{/if}
-			</button>
-		</div>
-	</form>
-</div>

+ 0 - 507
src/routes/(app)/workspace/modelfiles/edit/+page.svelte

@@ -1,507 +0,0 @@
-<script>
-	import { v4 as uuidv4 } from 'uuid';
-	import { toast } from 'svelte-sonner';
-	import { goto } from '$app/navigation';
-
-	import { onMount, getContext } from 'svelte';
-	import { page } from '$app/stores';
-
-	import { settings, user, config, modelfiles } from '$lib/stores';
-	import { splitStream } from '$lib/utils';
-
-	import { createModel } from '$lib/apis/ollama';
-	import { getModelfiles, updateModelfileByTagName } from '$lib/apis/modelfiles';
-
-	import AdvancedParams from '$lib/components/chat/Settings/Advanced/AdvancedParams.svelte';
-
-	const i18n = getContext('i18n');
-
-	let loading = false;
-
-	let filesInputElement;
-	let inputFiles;
-	let imageUrl = null;
-	let digest = '';
-	let pullProgress = null;
-	let success = false;
-
-	let modelfile = null;
-	// ///////////
-	// Modelfile
-	// ///////////
-
-	let title = '';
-	let tagName = '';
-	let desc = '';
-
-	// Raw Mode
-	let content = '';
-
-	let suggestions = [
-		{
-			content: ''
-		}
-	];
-
-	let categories = {
-		character: false,
-		assistant: false,
-		writing: false,
-		productivity: false,
-		programming: false,
-		'data analysis': false,
-		lifestyle: false,
-		education: false,
-		business: false
-	};
-
-	onMount(() => {
-		tagName = $page.url.searchParams.get('tag');
-
-		if (tagName) {
-			modelfile = $modelfiles.filter((modelfile) => modelfile.tagName === tagName)[0];
-
-			console.log(modelfile);
-
-			imageUrl = modelfile.imageUrl;
-			title = modelfile.title;
-			desc = modelfile.desc;
-			content = modelfile.content;
-			suggestions =
-				modelfile.suggestionPrompts.length != 0
-					? modelfile.suggestionPrompts
-					: [
-							{
-								content: ''
-							}
-					  ];
-
-			for (const category of modelfile.categories) {
-				categories[category.toLowerCase()] = true;
-			}
-		} else {
-			goto('/workspace/modelfiles');
-		}
-	});
-
-	const updateModelfile = async (modelfile) => {
-		await updateModelfileByTagName(localStorage.token, modelfile.tagName, modelfile);
-		await modelfiles.set(await getModelfiles(localStorage.token));
-	};
-
-	const updateHandler = async () => {
-		loading = true;
-
-		if (Object.keys(categories).filter((category) => categories[category]).length == 0) {
-			toast.error(
-				'Uh-oh! It looks like you missed selecting a category. Please choose one to complete your modelfile.'
-			);
-		}
-
-		if (
-			title !== '' &&
-			desc !== '' &&
-			content !== '' &&
-			Object.keys(categories).filter((category) => categories[category]).length > 0
-		) {
-			const res = await createModel(localStorage.token, tagName, content);
-
-			if (res) {
-				const reader = res.body
-					.pipeThrough(new TextDecoderStream())
-					.pipeThrough(splitStream('\n'))
-					.getReader();
-
-				while (true) {
-					const { value, done } = await reader.read();
-					if (done) break;
-
-					try {
-						let lines = value.split('\n');
-
-						for (const line of lines) {
-							if (line !== '') {
-								console.log(line);
-								let data = JSON.parse(line);
-								console.log(data);
-
-								if (data.error) {
-									throw data.error;
-								}
-								if (data.detail) {
-									throw data.detail;
-								}
-
-								if (data.status) {
-									if (
-										!data.digest &&
-										!data.status.includes('writing') &&
-										!data.status.includes('sha256')
-									) {
-										toast.success(data.status);
-
-										if (data.status === 'success') {
-											success = true;
-										}
-									} else {
-										if (data.digest) {
-											digest = data.digest;
-
-											if (data.completed) {
-												pullProgress = Math.round((data.completed / data.total) * 1000) / 10;
-											} else {
-												pullProgress = 100;
-											}
-										}
-									}
-								}
-							}
-						}
-					} catch (error) {
-						console.log(error);
-						toast.error(error);
-					}
-				}
-			}
-
-			if (success) {
-				await updateModelfile({
-					tagName: tagName,
-					imageUrl: imageUrl,
-					title: title,
-					desc: desc,
-					content: content,
-					suggestionPrompts: suggestions.filter((prompt) => prompt.content !== ''),
-					categories: Object.keys(categories).filter((category) => categories[category])
-				});
-				await goto('/workspace/modelfiles');
-			}
-		}
-		loading = false;
-		success = false;
-	};
-</script>
-
-<div class="w-full max-h-full">
-	<input
-		bind:this={filesInputElement}
-		bind:files={inputFiles}
-		type="file"
-		hidden
-		accept="image/*"
-		on:change={() => {
-			let reader = new FileReader();
-			reader.onload = (event) => {
-				let originalImageUrl = `${event.target.result}`;
-
-				const img = new Image();
-				img.src = originalImageUrl;
-
-				img.onload = function () {
-					const canvas = document.createElement('canvas');
-					const ctx = canvas.getContext('2d');
-
-					// Calculate the aspect ratio of the image
-					const aspectRatio = img.width / img.height;
-
-					// Calculate the new width and height to fit within 100x100
-					let newWidth, newHeight;
-					if (aspectRatio > 1) {
-						newWidth = 100 * aspectRatio;
-						newHeight = 100;
-					} else {
-						newWidth = 100;
-						newHeight = 100 / aspectRatio;
-					}
-
-					// Set the canvas size
-					canvas.width = 100;
-					canvas.height = 100;
-
-					// Calculate the position to center the image
-					const offsetX = (100 - newWidth) / 2;
-					const offsetY = (100 - newHeight) / 2;
-
-					// Draw the image on the canvas
-					ctx.drawImage(img, offsetX, offsetY, newWidth, newHeight);
-
-					// Get the base64 representation of the compressed image
-					const compressedSrc = canvas.toDataURL('image/jpeg');
-
-					// Display the compressed image
-					imageUrl = compressedSrc;
-
-					inputFiles = null;
-				};
-			};
-
-			if (
-				inputFiles &&
-				inputFiles.length > 0 &&
-				['image/gif', 'image/webp', 'image/jpeg', 'image/png'].includes(inputFiles[0]['type'])
-			) {
-				reader.readAsDataURL(inputFiles[0]);
-			} else {
-				console.log(`Unsupported File Type '${inputFiles[0]['type']}'.`);
-				inputFiles = null;
-			}
-		}}
-	/>
-
-	<button
-		class="flex space-x-1"
-		on:click={() => {
-			history.back();
-		}}
-	>
-		<div class=" self-center">
-			<svg
-				xmlns="http://www.w3.org/2000/svg"
-				viewBox="0 0 20 20"
-				fill="currentColor"
-				class="w-4 h-4"
-			>
-				<path
-					fill-rule="evenodd"
-					d="M17 10a.75.75 0 01-.75.75H5.612l4.158 3.96a.75.75 0 11-1.04 1.08l-5.5-5.25a.75.75 0 010-1.08l5.5-5.25a.75.75 0 111.04 1.08L5.612 9.25H16.25A.75.75 0 0117 10z"
-					clip-rule="evenodd"
-				/>
-			</svg>
-		</div>
-		<div class=" self-center font-medium text-sm">{$i18n.t('Back')}</div>
-	</button>
-	<form
-		class="flex flex-col max-w-2xl mx-auto mt-4 mb-10"
-		on:submit|preventDefault={() => {
-			updateHandler();
-		}}
-	>
-		<div class="flex justify-center my-4">
-			<div class="self-center">
-				<button
-					class=" {imageUrl
-						? ''
-						: 'p-6'} rounded-full dark:bg-gray-700 border border-dashed border-gray-200"
-					type="button"
-					on:click={() => {
-						filesInputElement.click();
-					}}
-				>
-					{#if imageUrl}
-						<img
-							src={imageUrl}
-							alt="modelfile profile"
-							class=" rounded-full w-20 h-20 object-cover"
-						/>
-					{:else}
-						<svg
-							xmlns="http://www.w3.org/2000/svg"
-							viewBox="0 0 24 24"
-							fill="currentColor"
-							class="w-8"
-						>
-							<path
-								fill-rule="evenodd"
-								d="M12 3.75a.75.75 0 01.75.75v6.75h6.75a.75.75 0 010 1.5h-6.75v6.75a.75.75 0 01-1.5 0v-6.75H4.5a.75.75 0 010-1.5h6.75V4.5a.75.75 0 01.75-.75z"
-								clip-rule="evenodd"
-							/>
-						</svg>
-					{/if}
-				</button>
-			</div>
-		</div>
-
-		<div class="my-2 flex space-x-2">
-			<div class="flex-1">
-				<div class=" text-sm font-semibold mb-2">{$i18n.t('Name')}*</div>
-
-				<div>
-					<input
-						class="px-3 py-1.5 text-sm w-full bg-transparent border dark:border-gray-600 outline-none rounded-lg"
-						placeholder={$i18n.t('Name your modelfile')}
-						bind:value={title}
-						required
-					/>
-				</div>
-			</div>
-
-			<div class="flex-1">
-				<div class=" text-sm font-semibold mb-2">{$i18n.t('Model Tag Name')}*</div>
-
-				<div>
-					<input
-						class="px-3 py-1.5 text-sm w-full bg-transparent disabled:text-gray-500 border dark:border-gray-600 outline-none rounded-lg"
-						placeholder={$i18n.t('Add a model tag name')}
-						value={tagName}
-						disabled
-						required
-					/>
-				</div>
-			</div>
-		</div>
-
-		<div class="my-2">
-			<div class=" text-sm font-semibold mb-2">{$i18n.t('Description')}*</div>
-
-			<div>
-				<input
-					class="px-3 py-1.5 text-sm w-full bg-transparent border dark:border-gray-600 outline-none rounded-lg"
-					placeholder={$i18n.t('Add a short description about what this modelfile does')}
-					bind:value={desc}
-					required
-				/>
-			</div>
-		</div>
-
-		<div class="my-2">
-			<div class="flex w-full justify-between">
-				<div class=" self-center text-sm font-semibold">{$i18n.t('Modelfile')}</div>
-			</div>
-
-			<!-- <div class=" text-sm font-semibold mb-2"></div> -->
-
-			<div class="mt-2">
-				<div class=" text-xs font-semibold mb-2">{$i18n.t('Content')}*</div>
-
-				<div>
-					<textarea
-						class="px-3 py-1.5 text-sm w-full bg-transparent border dark:border-gray-600 outline-none rounded-lg"
-						placeholder={`FROM llama2\nPARAMETER temperature 1\nSYSTEM """\nYou are Mario from Super Mario Bros, acting as an assistant.\n"""`}
-						rows="6"
-						bind:value={content}
-						required
-					/>
-				</div>
-			</div>
-		</div>
-
-		<div class="my-2">
-			<div class="flex w-full justify-between mb-2">
-				<div class=" self-center text-sm font-semibold">{$i18n.t('Prompt suggestions')}</div>
-
-				<button
-					class="p-1 px-3 text-xs flex rounded transition"
-					type="button"
-					on:click={() => {
-						if (suggestions.length === 0 || suggestions.at(-1).content !== '') {
-							suggestions = [...suggestions, { content: '' }];
-						}
-					}}
-				>
-					<svg
-						xmlns="http://www.w3.org/2000/svg"
-						viewBox="0 0 20 20"
-						fill="currentColor"
-						class="w-4 h-4"
-					>
-						<path
-							d="M10.75 4.75a.75.75 0 00-1.5 0v4.5h-4.5a.75.75 0 000 1.5h4.5v4.5a.75.75 0 001.5 0v-4.5h4.5a.75.75 0 000-1.5h-4.5v-4.5z"
-						/>
-					</svg>
-				</button>
-			</div>
-			<div class="flex flex-col space-y-1">
-				{#each suggestions as prompt, promptIdx}
-					<div class=" flex border dark:border-gray-600 rounded-lg">
-						<input
-							class="px-3 py-1.5 text-sm w-full bg-transparent outline-none border-r dark:border-gray-600"
-							placeholder={$i18n.t('Write a prompt suggestion (e.g. Who are you?)')}
-							bind:value={prompt.content}
-						/>
-
-						<button
-							class="px-2"
-							type="button"
-							on:click={() => {
-								suggestions.splice(promptIdx, 1);
-								suggestions = suggestions;
-							}}
-						>
-							<svg
-								xmlns="http://www.w3.org/2000/svg"
-								viewBox="0 0 20 20"
-								fill="currentColor"
-								class="w-4 h-4"
-							>
-								<path
-									d="M6.28 5.22a.75.75 0 00-1.06 1.06L8.94 10l-3.72 3.72a.75.75 0 101.06 1.06L10 11.06l3.72 3.72a.75.75 0 101.06-1.06L11.06 10l3.72-3.72a.75.75 0 00-1.06-1.06L10 8.94 6.28 5.22z"
-								/>
-							</svg>
-						</button>
-					</div>
-				{/each}
-			</div>
-		</div>
-
-		<div class="my-2">
-			<div class=" text-sm font-semibold mb-2">{$i18n.t('Categories')}</div>
-
-			<div class="grid grid-cols-4">
-				{#each Object.keys(categories) as category}
-					<div class="flex space-x-2 text-sm">
-						<input type="checkbox" bind:checked={categories[category]} />
-
-						<div class=" capitalize">{category}</div>
-					</div>
-				{/each}
-			</div>
-		</div>
-
-		{#if pullProgress !== null}
-			<div class="my-2">
-				<div class=" text-sm font-semibold mb-2">{$i18n.t('Pull Progress')}</div>
-				<div class="w-full rounded-full dark:bg-gray-800">
-					<div
-						class="dark:bg-gray-600 text-xs font-medium text-blue-100 text-center p-0.5 leading-none rounded-full"
-						style="width: {Math.max(15, pullProgress ?? 0)}%"
-					>
-						{pullProgress ?? 0}%
-					</div>
-				</div>
-				<div class="mt-1 text-xs dark:text-gray-500" style="font-size: 0.5rem;">
-					{digest}
-				</div>
-			</div>
-		{/if}
-
-		<div class="my-2 flex justify-end">
-			<button
-				class=" text-sm px-3 py-2 transition rounded-xl {loading
-					? ' cursor-not-allowed bg-gray-100 dark:bg-gray-800'
-					: ' bg-gray-50 hover:bg-gray-100 dark:bg-gray-700 dark:hover:bg-gray-800'} flex"
-				type="submit"
-				disabled={loading}
-			>
-				<div class=" self-center font-medium">{$i18n.t('Save & Update')}</div>
-
-				{#if loading}
-					<div class="ml-1.5 self-center">
-						<svg
-							class=" w-4 h-4"
-							viewBox="0 0 24 24"
-							fill="currentColor"
-							xmlns="http://www.w3.org/2000/svg"
-							><style>
-								.spinner_ajPY {
-									transform-origin: center;
-									animation: spinner_AtaB 0.75s infinite linear;
-								}
-								@keyframes spinner_AtaB {
-									100% {
-										transform: rotate(360deg);
-									}
-								}
-							</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
-								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
-						>
-					</div>
-				{/if}
-			</button>
-		</div>
-	</form>
-</div>

+ 5 - 0
src/routes/(app)/workspace/models/+page.svelte

@@ -0,0 +1,5 @@
+<script>
+	import Models from '$lib/components/workspace/Models.svelte';
+</script>
+
+<Models />

+ 576 - 0
src/routes/(app)/workspace/models/create/+page.svelte

@@ -0,0 +1,576 @@
+<script>
+	import { v4 as uuidv4 } from 'uuid';
+	import { toast } from 'svelte-sonner';
+	import { goto } from '$app/navigation';
+	import { settings, user, config, models } from '$lib/stores';
+
+	import { onMount, tick, getContext } from 'svelte';
+	import { addNewModel, getModelById, getModelInfos } from '$lib/apis/models';
+	import { getModels } from '$lib/apis';
+
+	import AdvancedParams from '$lib/components/chat/Settings/Advanced/AdvancedParams.svelte';
+	import Checkbox from '$lib/components/common/Checkbox.svelte';
+
+	const i18n = getContext('i18n');
+
+	let filesInputElement;
+	let inputFiles;
+
+	let showAdvanced = false;
+	let showPreview = false;
+
+	let loading = false;
+	let success = false;
+
+	// ///////////
+	// Model
+	// ///////////
+
+	let id = '';
+	let name = '';
+
+	let params = {};
+	let capabilities = {
+		vision: true
+	};
+
+	let info = {
+		id: '',
+		base_model_id: null,
+		name: '',
+		meta: {
+			profile_image_url: null,
+			description: '',
+			suggestion_prompts: [
+				{
+					content: ''
+				}
+			]
+		},
+		params: {
+			system: ''
+		}
+	};
+
+	$: if (name) {
+		id = name.replace(/\s+/g, '-').toLowerCase();
+	}
+
+	const submitHandler = async () => {
+		loading = true;
+
+		info.id = id;
+		info.name = name;
+		info.meta.capabilities = capabilities;
+		info.params.stop = params.stop !== null ? params.stop.split(',').filter((s) => s.trim()) : null;
+
+		if ($models.find((m) => m.id === info.id)) {
+			toast.error(
+				`Error: A model with the ID '${info.id}' already exists. Please select a different ID to proceed.`
+			);
+			loading = false;
+			success = false;
+			return success;
+		}
+
+		if (info) {
+			const res = await addNewModel(localStorage.token, {
+				...info,
+				meta: {
+					...info.meta,
+					profile_image_url: info.meta.profile_image_url ?? '/favicon.png',
+					suggestion_prompts: info.meta.suggestion_prompts
+						? info.meta.suggestion_prompts.filter((prompt) => prompt.content !== '')
+						: null
+				},
+				params: { ...info.params, ...params }
+			});
+
+			if (res) {
+				toast.success('Model created successfully!');
+				await goto('/workspace/models');
+				await models.set(await getModels(localStorage.token));
+			}
+		}
+
+		loading = false;
+		success = false;
+	};
+
+	const initModel = async (model) => {
+		name = model.name;
+		await tick();
+
+		id = model.id;
+
+		params = { ...params, ...model?.info?.params };
+		params.stop = params?.stop ? (params?.stop ?? []).join(',') : null;
+
+		capabilities = { ...capabilities, ...(model?.info?.meta?.capabilities ?? {}) };
+
+		info = {
+			...info,
+			...model.info
+		};
+	};
+
+	onMount(async () => {
+		window.addEventListener('message', async (event) => {
+			if (
+				![
+					'https://ollamahub.com',
+					'https://www.ollamahub.com',
+					'https://openwebui.com',
+					'https://www.openwebui.com',
+					'http://localhost:5173'
+				].includes(event.origin)
+			)
+				return;
+
+			const model = JSON.parse(event.data);
+			console.log(model);
+
+			initModel(model);
+		});
+
+		if (window.opener ?? false) {
+			window.opener.postMessage('loaded', '*');
+		}
+
+		if (sessionStorage.model) {
+			const model = JSON.parse(sessionStorage.model);
+			sessionStorage.removeItem('model');
+
+			console.log(model);
+			initModel(model);
+		}
+	});
+</script>
+
+<div class="w-full max-h-full">
+	<input
+		bind:this={filesInputElement}
+		bind:files={inputFiles}
+		type="file"
+		hidden
+		accept="image/*"
+		on:change={() => {
+			let reader = new FileReader();
+			reader.onload = (event) => {
+				let originalImageUrl = `${event.target.result}`;
+
+				const img = new Image();
+				img.src = originalImageUrl;
+
+				img.onload = function () {
+					const canvas = document.createElement('canvas');
+					const ctx = canvas.getContext('2d');
+
+					// Calculate the aspect ratio of the image
+					const aspectRatio = img.width / img.height;
+
+					// Calculate the new width and height to fit within 100x100
+					let newWidth, newHeight;
+					if (aspectRatio > 1) {
+						newWidth = 100 * aspectRatio;
+						newHeight = 100;
+					} else {
+						newWidth = 100;
+						newHeight = 100 / aspectRatio;
+					}
+
+					// Set the canvas size
+					canvas.width = 100;
+					canvas.height = 100;
+
+					// Calculate the position to center the image
+					const offsetX = (100 - newWidth) / 2;
+					const offsetY = (100 - newHeight) / 2;
+
+					// Draw the image on the canvas
+					ctx.drawImage(img, offsetX, offsetY, newWidth, newHeight);
+
+					// Get the base64 representation of the compressed image
+					const compressedSrc = canvas.toDataURL('image/jpeg');
+
+					// Display the compressed image
+					info.meta.profile_image_url = compressedSrc;
+
+					inputFiles = null;
+				};
+			};
+
+			if (
+				inputFiles &&
+				inputFiles.length > 0 &&
+				['image/gif', 'image/webp', 'image/jpeg', 'image/png'].includes(inputFiles[0]['type'])
+			) {
+				reader.readAsDataURL(inputFiles[0]);
+			} else {
+				console.log(`Unsupported File Type '${inputFiles[0]['type']}'.`);
+				inputFiles = null;
+			}
+		}}
+	/>
+
+	<button
+		class="flex space-x-1"
+		on:click={() => {
+			history.back();
+		}}
+	>
+		<div class=" self-center">
+			<svg
+				xmlns="http://www.w3.org/2000/svg"
+				viewBox="0 0 20 20"
+				fill="currentColor"
+				class="w-4 h-4"
+			>
+				<path
+					fill-rule="evenodd"
+					d="M17 10a.75.75 0 01-.75.75H5.612l4.158 3.96a.75.75 0 11-1.04 1.08l-5.5-5.25a.75.75 0 010-1.08l5.5-5.25a.75.75 0 111.04 1.08L5.612 9.25H16.25A.75.75 0 0117 10z"
+					clip-rule="evenodd"
+				/>
+			</svg>
+		</div>
+		<div class=" self-center font-medium text-sm">{$i18n.t('Back')}</div>
+	</button>
+	<!-- <hr class="my-3 dark:border-gray-700" /> -->
+
+	<form
+		class="flex flex-col max-w-2xl mx-auto mt-4 mb-10"
+		on:submit|preventDefault={() => {
+			submitHandler();
+		}}
+	>
+		<div class="flex justify-center my-4">
+			<div class="self-center">
+				<button
+					class=" {info.meta.profile_image_url
+						? ''
+						: 'p-6'} rounded-full dark:bg-gray-700 border border-dashed border-gray-200"
+					type="button"
+					on:click={() => {
+						filesInputElement.click();
+					}}
+				>
+					{#if info.meta.profile_image_url}
+						<img
+							src={info.meta.profile_image_url}
+							alt="modelfile profile"
+							class=" rounded-full w-20 h-20 object-cover"
+						/>
+					{:else}
+						<svg
+							xmlns="http://www.w3.org/2000/svg"
+							viewBox="0 0 24 24"
+							fill="currentColor"
+							class="size-8"
+						>
+							<path
+								fill-rule="evenodd"
+								d="M12 3.75a.75.75 0 01.75.75v6.75h6.75a.75.75 0 010 1.5h-6.75v6.75a.75.75 0 01-1.5 0v-6.75H4.5a.75.75 0 010-1.5h6.75V4.5a.75.75 0 01.75-.75z"
+								clip-rule="evenodd"
+							/>
+						</svg>
+					{/if}
+				</button>
+			</div>
+		</div>
+
+		<div class="my-2 flex space-x-2">
+			<div class="flex-1">
+				<div class=" text-sm font-semibold mb-2">{$i18n.t('Name')}*</div>
+
+				<div>
+					<input
+						class="px-3 py-1.5 text-sm w-full bg-transparent border dark:border-gray-600 outline-none rounded-lg"
+						placeholder={$i18n.t('Name your model')}
+						bind:value={name}
+						required
+					/>
+				</div>
+			</div>
+
+			<div class="flex-1">
+				<div class=" text-sm font-semibold mb-2">{$i18n.t('Model ID')}*</div>
+
+				<div>
+					<input
+						class="px-3 py-1.5 text-sm w-full bg-transparent border dark:border-gray-600 outline-none rounded-lg"
+						placeholder={$i18n.t('Add a model id')}
+						bind:value={id}
+						required
+					/>
+				</div>
+			</div>
+		</div>
+
+		<div class="my-2">
+			<div class=" text-sm font-semibold mb-2">{$i18n.t('Base Model (From)')}</div>
+
+			<div>
+				<select
+					class="px-3 py-1.5 text-sm w-full bg-transparent border dark:border-gray-600 outline-none rounded-lg"
+					placeholder="Select a base model (e.g. llama3, gpt-4o)"
+					bind:value={info.base_model_id}
+					required
+				>
+					<option value={null} class=" placeholder:text-gray-500"
+						>{$i18n.t('Select a base model')}</option
+					>
+					{#each $models.filter((m) => !m?.preset) as model}
+						<option value={model.id}>{model.name}</option>
+					{/each}
+				</select>
+			</div>
+		</div>
+
+		<div class="my-2">
+			<div class=" text-sm font-semibold mb-2">{$i18n.t('Description')}</div>
+
+			<div>
+				<input
+					class="px-3 py-1.5 text-sm w-full bg-transparent border dark:border-gray-600 outline-none rounded-lg"
+					placeholder={$i18n.t('Add a short description about what this model does')}
+					bind:value={info.meta.description}
+				/>
+			</div>
+		</div>
+
+		<div class="my-2">
+			<div class="flex w-full justify-between">
+				<div class=" self-center text-sm font-semibold">{$i18n.t('Model Params')}</div>
+			</div>
+
+			<div class="mt-2">
+				<div class="my-1">
+					<div class=" text-xs font-semibold mb-2">{$i18n.t('System Prompt')}</div>
+					<div>
+						<textarea
+							class="px-3 py-1.5 text-sm w-full bg-transparent border dark:border-gray-600 outline-none rounded-lg -mb-1"
+							placeholder={`Write your model system prompt content here\ne.g.) You are Mario from Super Mario Bros, acting as an assistant.`}
+							rows="4"
+							bind:value={info.params.system}
+						/>
+					</div>
+				</div>
+
+				<div class="flex w-full justify-between">
+					<div class=" self-center text-xs font-semibold">
+						{$i18n.t('Advanced Params')}
+					</div>
+
+					<button
+						class="p-1 px-3 text-xs flex rounded transition"
+						type="button"
+						on:click={() => {
+							showAdvanced = !showAdvanced;
+						}}
+					>
+						{#if showAdvanced}
+							<span class="ml-2 self-center">{$i18n.t('Hide')}</span>
+						{:else}
+							<span class="ml-2 self-center">{$i18n.t('Show')}</span>
+						{/if}
+					</button>
+				</div>
+
+				{#if showAdvanced}
+					<div class="my-2">
+						<AdvancedParams
+							bind:params
+							on:change={(e) => {
+								info.params = { ...info.params, ...params };
+							}}
+						/>
+					</div>
+				{/if}
+			</div>
+		</div>
+
+		<div class="my-2">
+			<div class="flex w-full justify-between items-center">
+				<div class="flex w-full justify-between items-center">
+					<div class=" self-center text-sm font-semibold">{$i18n.t('Prompt suggestions')}</div>
+
+					<button
+						class="p-1 text-xs flex rounded transition"
+						type="button"
+						on:click={() => {
+							if (info.meta.suggestion_prompts === null) {
+								info.meta.suggestion_prompts = [{ content: '' }];
+							} else {
+								info.meta.suggestion_prompts = null;
+							}
+						}}
+					>
+						{#if info.meta.suggestion_prompts === null}
+							<span class="ml-2 self-center">{$i18n.t('Default')}</span>
+						{:else}
+							<span class="ml-2 self-center">{$i18n.t('Custom')}</span>
+						{/if}
+					</button>
+				</div>
+
+				{#if info.meta.suggestion_prompts !== null}
+					<button
+						class="p-1 px-2 text-xs flex rounded transition"
+						type="button"
+						on:click={() => {
+							if (
+								info.meta.suggestion_prompts.length === 0 ||
+								info.meta.suggestion_prompts.at(-1).content !== ''
+							) {
+								info.meta.suggestion_prompts = [...info.meta.suggestion_prompts, { content: '' }];
+							}
+						}}
+					>
+						<svg
+							xmlns="http://www.w3.org/2000/svg"
+							viewBox="0 0 20 20"
+							fill="currentColor"
+							class="w-4 h-4"
+						>
+							<path
+								d="M10.75 4.75a.75.75 0 00-1.5 0v4.5h-4.5a.75.75 0 000 1.5h4.5v4.5a.75.75 0 001.5 0v-4.5h4.5a.75.75 0 000-1.5h-4.5v-4.5z"
+							/>
+						</svg>
+					</button>
+				{/if}
+			</div>
+
+			{#if info.meta.suggestion_prompts}
+				<div class="flex flex-col space-y-1 mt-2">
+					{#if info.meta.suggestion_prompts.length > 0}
+						{#each info.meta.suggestion_prompts as prompt, promptIdx}
+							<div class=" flex border dark:border-gray-600 rounded-lg">
+								<input
+									class="px-3 py-1.5 text-sm w-full bg-transparent outline-none border-r dark:border-gray-600"
+									placeholder={$i18n.t('Write a prompt suggestion (e.g. Who are you?)')}
+									bind:value={prompt.content}
+								/>
+
+								<button
+									class="px-2"
+									type="button"
+									on:click={() => {
+										info.meta.suggestion_prompts.splice(promptIdx, 1);
+										info.meta.suggestion_prompts = info.meta.suggestion_prompts;
+									}}
+								>
+									<svg
+										xmlns="http://www.w3.org/2000/svg"
+										viewBox="0 0 20 20"
+										fill="currentColor"
+										class="w-4 h-4"
+									>
+										<path
+											d="M6.28 5.22a.75.75 0 00-1.06 1.06L8.94 10l-3.72 3.72a.75.75 0 101.06 1.06L10 11.06l3.72 3.72a.75.75 0 101.06-1.06L11.06 10l3.72-3.72a.75.75 0 00-1.06-1.06L10 8.94 6.28 5.22z"
+										/>
+									</svg>
+								</button>
+							</div>
+						{/each}
+					{:else}
+						<div class="text-xs text-center">No suggestion prompts</div>
+					{/if}
+				</div>
+			{/if}
+		</div>
+
+		<div class="my-2">
+			<div class="flex w-full justify-between">
+				<div class=" self-center text-sm font-semibold">{$i18n.t('Capabilities')}</div>
+			</div>
+			<div class="flex flex-col">
+				{#each Object.keys(capabilities) as capability}
+					<div class=" flex items-center gap-2">
+						<Checkbox
+							state={capabilities[capability] ? 'checked' : 'unchecked'}
+							on:change={(e) => {
+								capabilities[capability] = e.detail === 'checked';
+							}}
+						/>
+
+						<div class=" py-1.5 text-sm w-full capitalize">
+							{$i18n.t(capability)}
+						</div>
+					</div>
+				{/each}
+			</div>
+		</div>
+
+		<div class="my-2 text-gray-500">
+			<div class="flex w-full justify-between mb-2">
+				<div class=" self-center text-sm font-semibold">{$i18n.t('JSON Preview')}</div>
+
+				<button
+					class="p-1 px-3 text-xs flex rounded transition"
+					type="button"
+					on:click={() => {
+						showPreview = !showPreview;
+					}}
+				>
+					{#if showPreview}
+						<span class="ml-2 self-center">{$i18n.t('Hide')}</span>
+					{:else}
+						<span class="ml-2 self-center">{$i18n.t('Show')}</span>
+					{/if}
+				</button>
+			</div>
+
+			{#if showPreview}
+				<div>
+					<textarea
+						class="px-3 py-1.5 text-sm w-full bg-transparent border dark:border-gray-600 outline-none rounded-lg"
+						rows="10"
+						value={JSON.stringify(info, null, 2)}
+						disabled
+						readonly
+					/>
+				</div>
+			{/if}
+		</div>
+
+		<div class="my-2 flex justify-end mb-20">
+			<button
+				class=" text-sm px-3 py-2 transition rounded-xl {loading
+					? ' cursor-not-allowed bg-gray-100 dark:bg-gray-800'
+					: ' bg-gray-50 hover:bg-gray-100 dark:bg-gray-700 dark:hover:bg-gray-800'} flex"
+				type="submit"
+				disabled={loading}
+			>
+				<div class=" self-center font-medium">{$i18n.t('Save & Create')}</div>
+
+				{#if loading}
+					<div class="ml-1.5 self-center">
+						<svg
+							class=" w-4 h-4"
+							viewBox="0 0 24 24"
+							fill="currentColor"
+							xmlns="http://www.w3.org/2000/svg"
+							><style>
+								.spinner_ajPY {
+									transform-origin: center;
+									animation: spinner_AtaB 0.75s infinite linear;
+								}
+								@keyframes spinner_AtaB {
+									100% {
+										transform: rotate(360deg);
+									}
+								}
+							</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
+								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
+						>
+					</div>
+				{/if}
+			</button>
+		</div>
+	</form>
+</div>

+ 555 - 0
src/routes/(app)/workspace/models/edit/+page.svelte

@@ -0,0 +1,555 @@
+<script>
+	import { v4 as uuidv4 } from 'uuid';
+	import { toast } from 'svelte-sonner';
+	import { goto } from '$app/navigation';
+
+	import { onMount, getContext } from 'svelte';
+	import { page } from '$app/stores';
+	import { settings, user, config, models } from '$lib/stores';
+	import { splitStream } from '$lib/utils';
+
+	import { getModelInfos, updateModelById } from '$lib/apis/models';
+
+	import AdvancedParams from '$lib/components/chat/Settings/Advanced/AdvancedParams.svelte';
+	import { getModels } from '$lib/apis';
+	import Checkbox from '$lib/components/common/Checkbox.svelte';
+
+	const i18n = getContext('i18n');
+
+	let loading = false;
+	let success = false;
+
+	let filesInputElement;
+	let inputFiles;
+
+	let digest = '';
+	let pullProgress = null;
+
+	let showAdvanced = false;
+	let showPreview = false;
+
+	// ///////////
+	// model
+	// ///////////
+
+	let model = null;
+
+	let id = '';
+	let name = '';
+
+	let info = {
+		id: '',
+		base_model_id: null,
+		name: '',
+		meta: {
+			profile_image_url: '/favicon.png',
+			description: '',
+			suggestion_prompts: null
+		},
+		params: {
+			system: ''
+		}
+	};
+
+	let params = {};
+
+	let capabilities = {
+		vision: true
+	};
+
+	const updateHandler = async () => {
+		loading = true;
+
+		info.id = id;
+		info.name = name;
+		info.meta.capabilities = capabilities;
+		info.params.stop = params.stop !== null ? params.stop.split(',').filter((s) => s.trim()) : null;
+
+		const res = await updateModelById(localStorage.token, info.id, info);
+
+		if (res) {
+			toast.success('Model updated successfully');
+			await goto('/workspace/models');
+			await models.set(await getModels(localStorage.token));
+		}
+
+		loading = false;
+		success = false;
+	};
+
+	onMount(() => {
+		const _id = $page.url.searchParams.get('id');
+
+		if (_id) {
+			model = $models.find((m) => m.id === _id);
+			if (model) {
+				id = model.id;
+				name = model.name;
+
+				info = {
+					...info,
+					...JSON.parse(
+						JSON.stringify(
+							model?.info
+								? model?.info
+								: {
+										id: model.id,
+										name: model.name
+								  }
+						)
+					)
+				};
+
+				if (model.preset && model.owned_by === 'ollama' && !info.base_model_id.includes(':')) {
+					info.base_model_id = `${info.base_model_id}:latest`;
+				}
+
+				params = { ...params, ...model?.info?.params };
+				params.stop = params?.stop ? (params?.stop ?? []).join(',') : null;
+
+				if (model?.info?.meta?.capabilities) {
+					capabilities = { ...capabilities, ...model?.info?.meta?.capabilities };
+				}
+				console.log(model);
+			} else {
+				goto('/workspace/models');
+			}
+		} else {
+			goto('/workspace/models');
+		}
+	});
+</script>
+
+<div class="w-full max-h-full">
+	<input
+		bind:this={filesInputElement}
+		bind:files={inputFiles}
+		type="file"
+		hidden
+		accept="image/*"
+		on:change={() => {
+			let reader = new FileReader();
+			reader.onload = (event) => {
+				let originalImageUrl = `${event.target.result}`;
+
+				const img = new Image();
+				img.src = originalImageUrl;
+
+				img.onload = function () {
+					const canvas = document.createElement('canvas');
+					const ctx = canvas.getContext('2d');
+
+					// Calculate the aspect ratio of the image
+					const aspectRatio = img.width / img.height;
+
+					// Calculate the new width and height to fit within 100x100
+					let newWidth, newHeight;
+					if (aspectRatio > 1) {
+						newWidth = 100 * aspectRatio;
+						newHeight = 100;
+					} else {
+						newWidth = 100;
+						newHeight = 100 / aspectRatio;
+					}
+
+					// Set the canvas size
+					canvas.width = 100;
+					canvas.height = 100;
+
+					// Calculate the position to center the image
+					const offsetX = (100 - newWidth) / 2;
+					const offsetY = (100 - newHeight) / 2;
+
+					// Draw the image on the canvas
+					ctx.drawImage(img, offsetX, offsetY, newWidth, newHeight);
+
+					// Get the base64 representation of the compressed image
+					const compressedSrc = canvas.toDataURL('image/jpeg');
+
+					// Display the compressed image
+					info.meta.profile_image_url = compressedSrc;
+
+					inputFiles = null;
+				};
+			};
+
+			if (
+				inputFiles &&
+				inputFiles.length > 0 &&
+				['image/gif', 'image/webp', 'image/jpeg', 'image/png'].includes(inputFiles[0]['type'])
+			) {
+				reader.readAsDataURL(inputFiles[0]);
+			} else {
+				console.log(`Unsupported File Type '${inputFiles[0]['type']}'.`);
+				inputFiles = null;
+			}
+		}}
+	/>
+
+	<button
+		class="flex space-x-1"
+		on:click={() => {
+			history.back();
+		}}
+	>
+		<div class=" self-center">
+			<svg
+				xmlns="http://www.w3.org/2000/svg"
+				viewBox="0 0 20 20"
+				fill="currentColor"
+				class="w-4 h-4"
+			>
+				<path
+					fill-rule="evenodd"
+					d="M17 10a.75.75 0 01-.75.75H5.612l4.158 3.96a.75.75 0 11-1.04 1.08l-5.5-5.25a.75.75 0 010-1.08l5.5-5.25a.75.75 0 111.04 1.08L5.612 9.25H16.25A.75.75 0 0117 10z"
+					clip-rule="evenodd"
+				/>
+			</svg>
+		</div>
+		<div class=" self-center font-medium text-sm">{$i18n.t('Back')}</div>
+	</button>
+
+	{#if model}
+		<form
+			class="flex flex-col max-w-2xl mx-auto mt-4 mb-10"
+			on:submit|preventDefault={() => {
+				updateHandler();
+			}}
+		>
+			<div class="flex justify-center my-4">
+				<div class="self-center">
+					<button
+						class=" {info?.meta?.profile_image_url
+							? ''
+							: 'p-6'} rounded-full dark:bg-gray-700 border border-dashed border-gray-200"
+						type="button"
+						on:click={() => {
+							filesInputElement.click();
+						}}
+					>
+						{#if info?.meta?.profile_image_url}
+							<img
+								src={info?.meta?.profile_image_url}
+								alt="modelfile profile"
+								class=" rounded-full w-20 h-20 object-cover"
+							/>
+						{:else}
+							<svg
+								xmlns="http://www.w3.org/2000/svg"
+								viewBox="0 0 24 24"
+								fill="currentColor"
+								class="w-8"
+							>
+								<path
+									fill-rule="evenodd"
+									d="M12 3.75a.75.75 0 01.75.75v6.75h6.75a.75.75 0 010 1.5h-6.75v6.75a.75.75 0 01-1.5 0v-6.75H4.5a.75.75 0 010-1.5h6.75V4.5a.75.75 0 01.75-.75z"
+									clip-rule="evenodd"
+								/>
+							</svg>
+						{/if}
+					</button>
+				</div>
+			</div>
+
+			<div class="my-2 flex space-x-2">
+				<div class="flex-1">
+					<div class=" text-sm font-semibold mb-2">{$i18n.t('Name')}*</div>
+
+					<div>
+						<input
+							class="px-3 py-1.5 text-sm w-full bg-transparent border dark:border-gray-600 outline-none rounded-lg"
+							placeholder={$i18n.t('Name your model')}
+							bind:value={name}
+							required
+						/>
+					</div>
+				</div>
+
+				<div class="flex-1">
+					<div class=" text-sm font-semibold mb-2">{$i18n.t('Model ID')}*</div>
+
+					<div>
+						<input
+							class="px-3 py-1.5 text-sm w-full bg-transparent disabled:text-gray-500 border dark:border-gray-600 outline-none rounded-lg"
+							placeholder={$i18n.t('Add a model id')}
+							value={id}
+							disabled
+							required
+						/>
+					</div>
+				</div>
+			</div>
+
+			{#if model.preset}
+				<div class="my-2">
+					<div class=" text-sm font-semibold mb-2">{$i18n.t('Base Model (From)')}</div>
+
+					<div>
+						<select
+							class="px-3 py-1.5 text-sm w-full bg-transparent border dark:border-gray-600 outline-none rounded-lg"
+							placeholder="Select a base model (e.g. llama3, gpt-4o)"
+							bind:value={info.base_model_id}
+							required
+						>
+							<option value={null} class=" placeholder:text-gray-500"
+								>{$i18n.t('Select a base model')}</option
+							>
+							{#each $models.filter((m) => m.id !== model.id && !m?.preset) as model}
+								<option value={model.id}>{model.name}</option>
+							{/each}
+						</select>
+					</div>
+				</div>
+			{/if}
+
+			<div class="my-2">
+				<div class=" text-sm font-semibold mb-2">{$i18n.t('Description')}</div>
+
+				<div>
+					<input
+						class="px-3 py-1.5 text-sm w-full bg-transparent border dark:border-gray-600 outline-none rounded-lg"
+						placeholder={$i18n.t('Add a short description about what this model does')}
+						bind:value={info.meta.description}
+					/>
+				</div>
+			</div>
+
+			<div class="my-2">
+				<div class="flex w-full justify-between">
+					<div class=" self-center text-sm font-semibold">{$i18n.t('Model Params')}</div>
+				</div>
+
+				<!-- <div class=" text-sm font-semibold mb-2"></div> -->
+
+				<div class="mt-2">
+					<div class="my-1">
+						<div class=" text-xs font-semibold mb-2">{$i18n.t('System Prompt')}</div>
+						<div>
+							<textarea
+								class="px-3 py-1.5 text-sm w-full bg-transparent border dark:border-gray-600 outline-none rounded-lg -mb-1"
+								placeholder={`Write your model system prompt content here\ne.g.) You are Mario from Super Mario Bros, acting as an assistant.`}
+								rows="4"
+								bind:value={info.params.system}
+							/>
+						</div>
+					</div>
+
+					<div class="flex w-full justify-between">
+						<div class=" self-center text-xs font-semibold">
+							{$i18n.t('Advanced Params')}
+						</div>
+
+						<button
+							class="p-1 px-3 text-xs flex rounded transition"
+							type="button"
+							on:click={() => {
+								showAdvanced = !showAdvanced;
+							}}
+						>
+							{#if showAdvanced}
+								<span class="ml-2 self-center">{$i18n.t('Hide')}</span>
+							{:else}
+								<span class="ml-2 self-center">{$i18n.t('Show')}</span>
+							{/if}
+						</button>
+					</div>
+
+					{#if showAdvanced}
+						<div class="my-2">
+							<AdvancedParams
+								bind:params
+								on:change={(e) => {
+									info.params = { ...info.params, ...params };
+								}}
+							/>
+						</div>
+					{/if}
+				</div>
+			</div>
+
+			<div class="my-2">
+				<div class="flex w-full justify-between items-center">
+					<div class="flex w-full justify-between items-center">
+						<div class=" self-center text-sm font-semibold">{$i18n.t('Prompt suggestions')}</div>
+
+						<button
+							class="p-1 text-xs flex rounded transition"
+							type="button"
+							on:click={() => {
+								if (info.meta.suggestion_prompts === null) {
+									info.meta.suggestion_prompts = [{ content: '' }];
+								} else {
+									info.meta.suggestion_prompts = null;
+								}
+							}}
+						>
+							{#if info.meta.suggestion_prompts === null}
+								<span class="ml-2 self-center">{$i18n.t('Default')}</span>
+							{:else}
+								<span class="ml-2 self-center">{$i18n.t('Custom')}</span>
+							{/if}
+						</button>
+					</div>
+
+					{#if info.meta.suggestion_prompts !== null}
+						<button
+							class="p-1 px-2 text-xs flex rounded transition"
+							type="button"
+							on:click={() => {
+								if (
+									info.meta.suggestion_prompts.length === 0 ||
+									info.meta.suggestion_prompts.at(-1).content !== ''
+								) {
+									info.meta.suggestion_prompts = [...info.meta.suggestion_prompts, { content: '' }];
+								}
+							}}
+						>
+							<svg
+								xmlns="http://www.w3.org/2000/svg"
+								viewBox="0 0 20 20"
+								fill="currentColor"
+								class="w-4 h-4"
+							>
+								<path
+									d="M10.75 4.75a.75.75 0 00-1.5 0v4.5h-4.5a.75.75 0 000 1.5h4.5v4.5a.75.75 0 001.5 0v-4.5h4.5a.75.75 0 000-1.5h-4.5v-4.5z"
+								/>
+							</svg>
+						</button>
+					{/if}
+				</div>
+
+				{#if info.meta.suggestion_prompts}
+					<div class="flex flex-col space-y-1 mt-2">
+						{#if info.meta.suggestion_prompts.length > 0}
+							{#each info.meta.suggestion_prompts as prompt, promptIdx}
+								<div class=" flex border dark:border-gray-600 rounded-lg">
+									<input
+										class="px-3 py-1.5 text-sm w-full bg-transparent outline-none border-r dark:border-gray-600"
+										placeholder={$i18n.t('Write a prompt suggestion (e.g. Who are you?)')}
+										bind:value={prompt.content}
+									/>
+
+									<button
+										class="px-2"
+										type="button"
+										on:click={() => {
+											info.meta.suggestion_prompts.splice(promptIdx, 1);
+											info.meta.suggestion_prompts = info.meta.suggestion_prompts;
+										}}
+									>
+										<svg
+											xmlns="http://www.w3.org/2000/svg"
+											viewBox="0 0 20 20"
+											fill="currentColor"
+											class="w-4 h-4"
+										>
+											<path
+												d="M6.28 5.22a.75.75 0 00-1.06 1.06L8.94 10l-3.72 3.72a.75.75 0 101.06 1.06L10 11.06l3.72 3.72a.75.75 0 101.06-1.06L11.06 10l3.72-3.72a.75.75 0 00-1.06-1.06L10 8.94 6.28 5.22z"
+											/>
+										</svg>
+									</button>
+								</div>
+							{/each}
+						{:else}
+							<div class="text-xs text-center">No suggestion prompts</div>
+						{/if}
+					</div>
+				{/if}
+			</div>
+
+			<div class="my-2">
+				<div class="flex w-full justify-between">
+					<div class=" self-center text-sm font-semibold">{$i18n.t('Capabilities')}</div>
+				</div>
+				<div class="flex flex-col">
+					{#each Object.keys(capabilities) as capability}
+						<div class=" flex items-center gap-2">
+							<Checkbox
+								state={capabilities[capability] ? 'checked' : 'unchecked'}
+								on:change={(e) => {
+									capabilities[capability] = e.detail === 'checked';
+								}}
+							/>
+
+							<div class=" py-1.5 text-sm w-full capitalize">
+								{$i18n.t(capability)}
+							</div>
+						</div>
+					{/each}
+				</div>
+			</div>
+
+			<div class="my-2 text-gray-500">
+				<div class="flex w-full justify-between mb-2">
+					<div class=" self-center text-sm font-semibold">{$i18n.t('JSON Preview')}</div>
+
+					<button
+						class="p-1 px-3 text-xs flex rounded transition"
+						type="button"
+						on:click={() => {
+							showPreview = !showPreview;
+						}}
+					>
+						{#if showPreview}
+							<span class="ml-2 self-center">{$i18n.t('Hide')}</span>
+						{:else}
+							<span class="ml-2 self-center">{$i18n.t('Show')}</span>
+						{/if}
+					</button>
+				</div>
+
+				{#if showPreview}
+					<div>
+						<textarea
+							class="px-3 py-1.5 text-sm w-full bg-transparent border dark:border-gray-600 outline-none rounded-lg"
+							rows="10"
+							value={JSON.stringify(info, null, 2)}
+							disabled
+							readonly
+						/>
+					</div>
+				{/if}
+			</div>
+
+			<div class="my-2 flex justify-end mb-20">
+				<button
+					class=" text-sm px-3 py-2 transition rounded-xl {loading
+						? ' cursor-not-allowed bg-gray-100 dark:bg-gray-800'
+						: ' bg-gray-50 hover:bg-gray-100 dark:bg-gray-700 dark:hover:bg-gray-800'} flex"
+					type="submit"
+					disabled={loading}
+				>
+					<div class=" self-center font-medium">{$i18n.t('Save & Update')}</div>
+
+					{#if loading}
+						<div class="ml-1.5 self-center">
+							<svg
+								class=" w-4 h-4"
+								viewBox="0 0 24 24"
+								fill="currentColor"
+								xmlns="http://www.w3.org/2000/svg"
+								><style>
+									.spinner_ajPY {
+										transform-origin: center;
+										animation: spinner_AtaB 0.75s infinite linear;
+									}
+									@keyframes spinner_AtaB {
+										100% {
+											transform: rotate(360deg);
+										}
+									}
+								</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
+									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
+							>
+						</div>
+					{/if}
+				</button>
+			</div>
+		</form>
+	{/if}
+</div>

+ 0 - 27
src/routes/modelfiles/create/+page.svelte

@@ -1,27 +0,0 @@
-<script lang="ts">
-	import { goto } from '$app/navigation';
-	import { onMount } from 'svelte';
-
-	onMount(async () => {
-		window.addEventListener('message', async (event) => {
-			if (
-				![
-					'https://ollamahub.com',
-					'https://www.ollamahub.com',
-					'https://openwebui.com',
-					'https://www.openwebui.com',
-					'http://localhost:5173'
-				].includes(event.origin)
-			)
-				return;
-			const modelfile = JSON.parse(event.data);
-			sessionStorage.modelfile = JSON.stringify(modelfile);
-
-			goto('/workspace/modelfiles/create');
-		});
-
-		if (window.opener ?? false) {
-			window.opener.postMessage('loaded', '*');
-		}
-	});
-</script>

+ 3 - 17
src/routes/s/[id]/+page.svelte

@@ -5,7 +5,7 @@
 
 	import dayjs from 'dayjs';
 
-	import { modelfiles, settings, chatId, WEBUI_NAME } from '$lib/stores';
+	import { settings, chatId, WEBUI_NAME, models } from '$lib/stores';
 	import { convertMessagesToHistory } from '$lib/utils';
 
 	import { getChatByShareId } from '$lib/apis/chats';
@@ -14,6 +14,7 @@
 	import Navbar from '$lib/components/layout/Navbar.svelte';
 	import { getUserById } from '$lib/apis/users';
 	import { error } from '@sveltejs/kit';
+	import { getModels } from '$lib/apis';
 
 	const i18n = getContext('i18n');
 
@@ -27,17 +28,6 @@
 	let showModelSelector = false;
 	let selectedModels = [''];
 
-	let selectedModelfiles = {};
-	$: selectedModelfiles = selectedModels.reduce((a, tagName, i, arr) => {
-		const modelfile =
-			$modelfiles.filter((modelfile) => modelfile.tagName === tagName)?.at(0) ?? undefined;
-
-		return {
-			...a,
-			...(modelfile && { [tagName]: modelfile })
-		};
-	}, {});
-
 	let chat = null;
 	let user = null;
 
@@ -69,10 +59,6 @@
 			if (await loadSharedChat()) {
 				await tick();
 				loaded = true;
-
-				window.setTimeout(() => scrollToBottom(), 0);
-				const chatInput = document.getElementById('chat-textarea');
-				chatInput?.focus();
 			} else {
 				await goto('/');
 			}
@@ -84,6 +70,7 @@
 	//////////////////////////
 
 	const loadSharedChat = async () => {
+		await models.set(await getModels(localStorage.token));
 		await chatId.set($page.params.id);
 		chat = await getChatByShareId(localStorage.token, $chatId).catch(async (error) => {
 			await goto('/');
@@ -168,7 +155,6 @@
 							chatId={$chatId}
 							readOnly={true}
 							{selectedModels}
-							{selectedModelfiles}
 							{processing}
 							bind:history
 							bind:messages

+ 3 - 0
vite.config.ts

@@ -20,6 +20,9 @@ export default defineConfig({
 	define: {
 		APP_VERSION: JSON.stringify(process.env.npm_package_version)
 	},
+	build: {
+		sourcemap: true
+	},
 	worker: {
 		format: 'es'
 	}