Quellcode durchsuchen

Merge branch 'dev' into french-translation

Timothy Jaeryang Baek vor 2 Monaten
Ursprung
Commit
d37a7a1fe1
100 geänderte Dateien mit 1770 neuen und 939 gelöschten Zeilen
  1. 54 12
      backend/open_webui/config.py
  2. 14 6
      backend/open_webui/env.py
  3. 1 0
      backend/open_webui/main.py
  4. 5 1
      backend/open_webui/retrieval/vector/dbs/milvus.py
  5. 14 9
      backend/open_webui/routers/auths.py
  6. 8 2
      backend/open_webui/routers/chats.py
  7. 31 10
      backend/open_webui/routers/knowledge.py
  8. 5 1
      backend/open_webui/routers/models.py
  9. 3 4
      backend/open_webui/routers/ollama.py
  10. 4 4
      backend/open_webui/routers/openai.py
  11. 5 1
      backend/open_webui/routers/prompts.py
  12. 19 3
      backend/open_webui/routers/tasks.py
  13. 5 1
      backend/open_webui/routers/tools.py
  14. 5 2
      backend/open_webui/socket/main.py
  15. 395 179
      backend/open_webui/utils/middleware.py
  16. 39 0
      backend/open_webui/utils/misc.py
  17. 14 8
      backend/open_webui/utils/oauth.py
  18. 12 10
      backend/open_webui/utils/payload.py
  19. 9 4
      backend/open_webui/utils/plugin.py
  20. 42 1
      backend/open_webui/utils/response.py
  21. 6 0
      backend/open_webui/utils/task.py
  22. 7 7
      backend/requirements.txt
  23. 5 4
      package-lock.json
  24. 1 1
      package.json
  25. 7 7
      pyproject.toml
  26. 5 2
      src/lib/apis/chats/index.ts
  27. 1 1
      src/lib/apis/models/index.ts
  28. 2 2
      src/lib/components/admin/Settings/Audio.svelte
  29. 16 1
      src/lib/components/admin/Settings/Interface.svelte
  30. 3 1
      src/lib/components/admin/Users/UserList.svelte
  31. 3 1
      src/lib/components/admin/Users/UserList/EditUserModal.svelte
  32. 3 1
      src/lib/components/admin/Users/UserList/UserChatsModal.svelte
  33. 1 1
      src/lib/components/channel/MessageInput.svelte
  34. 5 7
      src/lib/components/channel/Messages/Message.svelte
  35. 26 7
      src/lib/components/chat/Chat.svelte
  36. 24 6
      src/lib/components/chat/MessageInput.svelte
  37. 52 15
      src/lib/components/chat/MessageInput/InputMenu.svelte
  38. 52 9
      src/lib/components/chat/Messages/CodeBlock.svelte
  39. 8 2
      src/lib/components/chat/Messages/Markdown/MarkdownTokens.svelte
  40. 1 0
      src/lib/components/chat/Messages/Message.svelte
  41. 3 1
      src/lib/components/chat/Messages/MultiResponseMessages.svelte
  42. 36 1
      src/lib/components/chat/Messages/ResponseMessage.svelte
  43. 3 1
      src/lib/components/chat/Messages/UserMessage.svelte
  44. 2 0
      src/lib/components/chat/Placeholder.svelte
  45. 1 1
      src/lib/components/chat/Settings/Audio.svelte
  46. 3 3
      src/lib/components/chat/Settings/Personalization/ManageModal.svelte
  47. 6 0
      src/lib/components/common/Collapsible.svelte
  48. 32 51
      src/lib/components/common/Textarea.svelte
  49. 11 0
      src/lib/components/icons/CommandLineSolid.svelte
  50. 4 1
      src/lib/components/layout/Sidebar/ArchivedChatsModal.svelte
  51. 7 1
      src/lib/components/layout/Sidebar/ChatItem.svelte
  52. 26 1
      src/lib/components/playground/Chat.svelte
  53. 76 0
      src/lib/components/playground/Chat/Message.svelte
  54. 8 65
      src/lib/components/playground/Chat/Messages.svelte
  55. 1 1
      src/lib/components/workspace/Knowledge.svelte
  56. 2 2
      src/lib/components/workspace/Knowledge/CreateKnowledgeBase.svelte
  57. 9 9
      src/lib/components/workspace/Knowledge/KnowledgeBase.svelte
  58. 1 1
      src/lib/components/workspace/Models.svelte
  59. 1 1
      src/lib/components/workspace/Models/ModelEditor.svelte
  60. 1 1
      src/lib/components/workspace/common/ValvesModal.svelte
  61. 8 4
      src/lib/i18n/locales/ar-BH/translation.json
  62. 8 4
      src/lib/i18n/locales/bg-BG/translation.json
  63. 8 4
      src/lib/i18n/locales/bn-BD/translation.json
  64. 8 4
      src/lib/i18n/locales/ca-ES/translation.json
  65. 8 4
      src/lib/i18n/locales/ceb-PH/translation.json
  66. 8 4
      src/lib/i18n/locales/cs-CZ/translation.json
  67. 8 4
      src/lib/i18n/locales/da-DK/translation.json
  68. 8 4
      src/lib/i18n/locales/de-DE/translation.json
  69. 8 4
      src/lib/i18n/locales/dg-DG/translation.json
  70. 8 4
      src/lib/i18n/locales/el-GR/translation.json
  71. 8 4
      src/lib/i18n/locales/en-GB/translation.json
  72. 8 4
      src/lib/i18n/locales/en-US/translation.json
  73. 8 4
      src/lib/i18n/locales/es-ES/translation.json
  74. 8 4
      src/lib/i18n/locales/eu-ES/translation.json
  75. 8 4
      src/lib/i18n/locales/fa-IR/translation.json
  76. 8 4
      src/lib/i18n/locales/fi-FI/translation.json
  77. 8 4
      src/lib/i18n/locales/fr-CA/translation.json
  78. 8 4
      src/lib/i18n/locales/fr-FR/translation.json
  79. 8 4
      src/lib/i18n/locales/he-IL/translation.json
  80. 8 4
      src/lib/i18n/locales/hi-IN/translation.json
  81. 8 4
      src/lib/i18n/locales/hr-HR/translation.json
  82. 8 4
      src/lib/i18n/locales/hu-HU/translation.json
  83. 8 4
      src/lib/i18n/locales/id-ID/translation.json
  84. 8 4
      src/lib/i18n/locales/ie-GA/translation.json
  85. 8 4
      src/lib/i18n/locales/it-IT/translation.json
  86. 9 5
      src/lib/i18n/locales/ja-JP/translation.json
  87. 8 4
      src/lib/i18n/locales/ka-GE/translation.json
  88. 91 87
      src/lib/i18n/locales/ko-KR/translation.json
  89. 8 4
      src/lib/i18n/locales/lt-LT/translation.json
  90. 8 4
      src/lib/i18n/locales/ms-MY/translation.json
  91. 8 4
      src/lib/i18n/locales/nb-NO/translation.json
  92. 8 4
      src/lib/i18n/locales/nl-NL/translation.json
  93. 8 4
      src/lib/i18n/locales/pa-IN/translation.json
  94. 8 4
      src/lib/i18n/locales/pl-PL/translation.json
  95. 8 4
      src/lib/i18n/locales/pt-BR/translation.json
  96. 8 4
      src/lib/i18n/locales/pt-PT/translation.json
  97. 8 4
      src/lib/i18n/locales/ro-RO/translation.json
  98. 8 4
      src/lib/i18n/locales/ru-RU/translation.json
  99. 8 4
      src/lib/i18n/locales/sk-SK/translation.json
  100. 229 225
      src/lib/i18n/locales/sr-RS/translation.json

+ 54 - 12
backend/open_webui/config.py

@@ -1094,21 +1094,27 @@ TITLE_GENERATION_PROMPT_TEMPLATE = PersistentConfig(
     os.environ.get("TITLE_GENERATION_PROMPT_TEMPLATE", ""),
 )
 
-DEFAULT_TITLE_GENERATION_PROMPT_TEMPLATE = """Create a concise, 3-5 word title with an emoji as a title for the chat history, in the given language. Suitable Emojis for the summary can be used to enhance understanding but avoid quotation marks or special formatting. RESPOND ONLY WITH THE TITLE TEXT.
-
-Examples of titles:
-📉 Stock Market Trends
-🍪 Perfect Chocolate Chip Recipe
-Evolution of Music Streaming
-Remote Work Productivity Tips
-Artificial Intelligence in Healthcare
-🎮 Video Game Development Insights
-
+DEFAULT_TITLE_GENERATION_PROMPT_TEMPLATE = """### Task:
+Generate a concise, 3-5 word title with an emoji summarizing the chat history.
+### Guidelines:
+- The title should clearly represent the main theme or subject of the conversation.
+- Use emojis that enhance understanding of the topic, but avoid quotation marks or special formatting.
+- Write the title in the chat's primary language; default to English if multilingual.
+- Prioritize accuracy over excessive creativity; keep it clear and simple.
+### Output:
+JSON format: { "title": "your concise title here" }
+### Examples:
+- { "title": "📉 Stock Market Trends" },
+- { "title": "🍪 Perfect Chocolate Chip Recipe" },
+- { "title": "Evolution of Music Streaming" },
+- { "title": "Remote Work Productivity Tips" },
+- { "title": "Artificial Intelligence in Healthcare" },
+- { "title": "🎮 Video Game Development Insights" }
+### Chat History:
 <chat_history>
 {{MESSAGES:END:2}}
 </chat_history>"""
 
-
 TAGS_GENERATION_PROMPT_TEMPLATE = PersistentConfig(
     "TAGS_GENERATION_PROMPT_TEMPLATE",
     "task.tags.prompt_template",
@@ -1277,7 +1283,28 @@ TOOLS_FUNCTION_CALLING_PROMPT_TEMPLATE = PersistentConfig(
 )
 
 
-DEFAULT_TOOLS_FUNCTION_CALLING_PROMPT_TEMPLATE = """Available Tools: {{TOOLS}}\nReturn an empty string if no tools match the query. If a function tool matches, construct and return a JSON object in the format {\"name\": \"functionName\", \"parameters\": {\"requiredFunctionParamKey\": \"requiredFunctionParamValue\"}} using the appropriate tool and its parameters. Only return the object and limit the response to the JSON object without additional text."""
+DEFAULT_TOOLS_FUNCTION_CALLING_PROMPT_TEMPLATE = """Available Tools: {{TOOLS}}
+
+Your task is to choose and return the correct tool(s) from the list of available tools based on the query. Follow these guidelines:
+
+- Return only the JSON object, without any additional text or explanation.
+
+- If no tools match the query, return an empty array: 
+   {
+     "tool_calls": []
+   }
+
+- If one or more tools match the query, construct a JSON response containing a "tool_calls" array with objects that include:
+   - "name": The tool's name.
+   - "parameters": A dictionary of required parameters and their corresponding values.
+
+The format for the JSON response is strictly:
+{
+  "tool_calls": [
+    {"name": "toolName1", "parameters": {"key1": "value1"}},
+    {"name": "toolName2", "parameters": {"key2": "value2"}}
+  ]
+}"""
 
 
 DEFAULT_EMOJI_GENERATION_PROMPT_TEMPLATE = """Your task is to reflect the speaker's likely facial expression through a fitting emoji. Interpret emotions from the message and reflect their facial expression using fitting, diverse emojis (e.g., 😊, 😢, 😡, 😱).
@@ -1290,6 +1317,20 @@ Your task is to synthesize these responses into a single, high-quality response.
 
 Responses from models: {{responses}}"""
 
+
+DEFAULT_CODE_INTERPRETER_PROMPT = """
+#### Tools Available
+
+1. **Code Interpreter**: `<code_interpreter type="code" lang="python"></code_interpreter>`
+   - You have access to a Python shell that runs directly in the user's browser, enabling fast execution of code for analysis, calculations, or problem-solving.  Use it in this response.
+   - The Python code you write can incorporate a wide array of libraries, handle data manipulation or visualization, perform API calls for web-related tasks, or tackle virtually any computational challenge. Use this flexibility to **think outside the box, craft elegant solutions, and harness Python's full potential**.
+   - To use it, **you must enclose your code within `<code_interpreter type="code" lang="python">` tags** and stop right away. If you don't, the code won't execute. Do NOT use triple backticks.
+   - When coding, **always aim to print meaningful outputs** (e.g., results, tables, summaries, or visuals) to better interpret and verify the findings. Avoid relying on implicit outputs; prioritize explicit and clear print statements so the results are effectively communicated to the user.  
+   - After obtaining the printed output, **always provide a concise analysis, interpretation, or next steps to help the user understand the findings or refine the outcome further.**  
+   - If the results are unclear, unexpected, or require validation, refine the code and execute it again as needed. Always aim to deliver meaningful insights from the results, iterating if necessary.  
+
+Ensure that the tools are effectively utilized to achieve the highest-quality analysis for the user."""
+
 ####################################
 # Vector Database
 ####################################
@@ -1319,6 +1360,7 @@ CHROMA_HTTP_SSL = os.environ.get("CHROMA_HTTP_SSL", "false").lower() == "true"
 
 MILVUS_URI = os.environ.get("MILVUS_URI", f"{DATA_DIR}/vector_db/milvus.db")
 MILVUS_DB = os.environ.get("MILVUS_DB", "default")
+MILVUS_TOKEN = os.environ.get("MILVUS_TOKEN", None)
 
 # Qdrant
 QDRANT_URI = os.environ.get("QDRANT_URI", None)

+ 14 - 6
backend/open_webui/env.py

@@ -356,14 +356,22 @@ WEBUI_SECRET_KEY = os.environ.get(
     ),  # DEPRECATED: remove at next major version
 )
 
-WEBUI_SESSION_COOKIE_SAME_SITE = os.environ.get(
-    "WEBUI_SESSION_COOKIE_SAME_SITE",
-    os.environ.get("WEBUI_SESSION_COOKIE_SAME_SITE", "lax"),
+WEBUI_SESSION_COOKIE_SAME_SITE = os.environ.get("WEBUI_SESSION_COOKIE_SAME_SITE", "lax")
+
+WEBUI_SESSION_COOKIE_SECURE = (
+    os.environ.get("WEBUI_SESSION_COOKIE_SECURE", "false").lower() == "true"
+)
+
+WEBUI_AUTH_COOKIE_SAME_SITE = os.environ.get(
+    "WEBUI_AUTH_COOKIE_SAME_SITE", WEBUI_SESSION_COOKIE_SAME_SITE
 )
 
-WEBUI_SESSION_COOKIE_SECURE = os.environ.get(
-    "WEBUI_SESSION_COOKIE_SECURE",
-    os.environ.get("WEBUI_SESSION_COOKIE_SECURE", "false").lower() == "true",
+WEBUI_AUTH_COOKIE_SECURE = (
+    os.environ.get(
+        "WEBUI_AUTH_COOKIE_SECURE",
+        os.environ.get("WEBUI_SESSION_COOKIE_SECURE", "false"),
+    ).lower()
+    == "true"
 )
 
 if WEBUI_AUTH and WEBUI_SECRET_KEY == "":

+ 1 - 0
backend/open_webui/main.py

@@ -875,6 +875,7 @@ async def chat_completion(
             "tool_ids": form_data.get("tool_ids", None),
             "files": form_data.get("files", None),
             "features": form_data.get("features", None),
+            "variables": form_data.get("variables", None),
         }
         form_data["metadata"] = metadata
 

+ 5 - 1
backend/open_webui/retrieval/vector/dbs/milvus.py

@@ -8,13 +8,17 @@ from open_webui.retrieval.vector.main import VectorItem, SearchResult, GetResult
 from open_webui.config import (
     MILVUS_URI,
     MILVUS_DB,
+    MILVUS_TOKEN,
 )
 
 
 class MilvusClient:
     def __init__(self):
         self.collection_prefix = "open_webui"
-        self.client = Client(uri=MILVUS_URI, database=MILVUS_DB)
+        if MILVUS_TOKEN is None:
+            self.client = Client(uri=MILVUS_URI, database=MILVUS_DB)
+        else:
+            self.client = Client(uri=MILVUS_URI, database=MILVUS_DB, token=MILVUS_TOKEN)
 
     def _result_to_get_result(self, result) -> GetResult:
         ids = []

+ 14 - 9
backend/open_webui/routers/auths.py

@@ -25,8 +25,8 @@ from open_webui.env import (
     WEBUI_AUTH,
     WEBUI_AUTH_TRUSTED_EMAIL_HEADER,
     WEBUI_AUTH_TRUSTED_NAME_HEADER,
-    WEBUI_SESSION_COOKIE_SAME_SITE,
-    WEBUI_SESSION_COOKIE_SECURE,
+    WEBUI_AUTH_COOKIE_SAME_SITE,
+    WEBUI_AUTH_COOKIE_SECURE,
     SRC_LOG_LEVELS,
 )
 from fastapi import APIRouter, Depends, HTTPException, Request, status
@@ -95,8 +95,8 @@ async def get_session_user(
         value=token,
         expires=datetime_expires_at,
         httponly=True,  # Ensures the cookie is not accessible via JavaScript
-        samesite=WEBUI_SESSION_COOKIE_SAME_SITE,
-        secure=WEBUI_SESSION_COOKIE_SECURE,
+        samesite=WEBUI_AUTH_COOKIE_SAME_SITE,
+        secure=WEBUI_AUTH_COOKIE_SECURE,
     )
 
     user_permissions = get_permissions(
@@ -164,7 +164,7 @@ async def update_password(
 ############################
 # LDAP Authentication
 ############################
-@router.post("/ldap", response_model=SigninResponse)
+@router.post("/ldap", response_model=SessionUserResponse)
 async def ldap_auth(request: Request, response: Response, form_data: LdapForm):
     ENABLE_LDAP = request.app.state.config.ENABLE_LDAP
     LDAP_SERVER_LABEL = request.app.state.config.LDAP_SERVER_LABEL
@@ -288,6 +288,10 @@ async def ldap_auth(request: Request, response: Response, form_data: LdapForm):
                     httponly=True,  # Ensures the cookie is not accessible via JavaScript
                 )
 
+                user_permissions = get_permissions(
+                    user.id, request.app.state.config.USER_PERMISSIONS
+                )
+
                 return {
                     "token": token,
                     "token_type": "Bearer",
@@ -296,6 +300,7 @@ async def ldap_auth(request: Request, response: Response, form_data: LdapForm):
                     "name": user.name,
                     "role": user.role,
                     "profile_image_url": user.profile_image_url,
+                    "permissions": user_permissions,
                 }
             else:
                 raise HTTPException(400, detail=ERROR_MESSAGES.INVALID_CRED)
@@ -378,8 +383,8 @@ async def signin(request: Request, response: Response, form_data: SigninForm):
             value=token,
             expires=datetime_expires_at,
             httponly=True,  # Ensures the cookie is not accessible via JavaScript
-            samesite=WEBUI_SESSION_COOKIE_SAME_SITE,
-            secure=WEBUI_SESSION_COOKIE_SECURE,
+            samesite=WEBUI_AUTH_COOKIE_SAME_SITE,
+            secure=WEBUI_AUTH_COOKIE_SECURE,
         )
 
         user_permissions = get_permissions(
@@ -473,8 +478,8 @@ async def signup(request: Request, response: Response, form_data: SignupForm):
                 value=token,
                 expires=datetime_expires_at,
                 httponly=True,  # Ensures the cookie is not accessible via JavaScript
-                samesite=WEBUI_SESSION_COOKIE_SAME_SITE,
-                secure=WEBUI_SESSION_COOKIE_SECURE,
+                samesite=WEBUI_AUTH_COOKIE_SAME_SITE,
+                secure=WEBUI_AUTH_COOKIE_SECURE,
             )
 
             if request.app.state.config.WEBHOOK_URL:

+ 8 - 2
backend/open_webui/routers/chats.py

@@ -444,15 +444,21 @@ async def pin_chat_by_id(id: str, user=Depends(get_verified_user)):
 ############################
 
 
+class CloneForm(BaseModel):
+    title: Optional[str] = None
+
+
 @router.post("/{id}/clone", response_model=Optional[ChatResponse])
-async def clone_chat_by_id(id: str, user=Depends(get_verified_user)):
+async def clone_chat_by_id(
+    form_data: CloneForm, id: str, user=Depends(get_verified_user)
+):
     chat = Chats.get_chat_by_id_and_user_id(id, user.id)
     if chat:
         updated_chat = {
             **chat.chat,
             "originalChatId": chat.id,
             "branchPointMessageId": chat.chat["history"]["currentId"],
-            "title": f"Clone of {chat.title}",
+            "title": form_data.title if form_data.title else f"Clone of {chat.title}",
         }
 
         chat = Chats.insert_new_chat(user.id, ChatForm(**{"chat": updated_chat}))

+ 31 - 10
backend/open_webui/routers/knowledge.py

@@ -264,7 +264,11 @@ def add_file_to_knowledge_by_id(
             detail=ERROR_MESSAGES.NOT_FOUND,
         )
 
-    if knowledge.user_id != user.id and user.role != "admin":
+    if (
+        knowledge.user_id != user.id
+        and not has_access(user.id, "write", knowledge.access_control)
+        and user.role != "admin"
+    ):
         raise HTTPException(
             status_code=status.HTTP_400_BAD_REQUEST,
             detail=ERROR_MESSAGES.ACCESS_PROHIBITED,
@@ -342,7 +346,12 @@ def update_file_from_knowledge_by_id(
             detail=ERROR_MESSAGES.NOT_FOUND,
         )
 
-    if knowledge.user_id != user.id and user.role != "admin":
+    if (
+        knowledge.user_id != user.id
+        and not has_access(user.id, "write", knowledge.access_control)
+        and user.role != "admin"
+    ):
+
         raise HTTPException(
             status_code=status.HTTP_400_BAD_REQUEST,
             detail=ERROR_MESSAGES.ACCESS_PROHIBITED,
@@ -406,7 +415,11 @@ def remove_file_from_knowledge_by_id(
             detail=ERROR_MESSAGES.NOT_FOUND,
         )
 
-    if knowledge.user_id != user.id and user.role != "admin":
+    if (
+        knowledge.user_id != user.id
+        and not has_access(user.id, "write", knowledge.access_control)
+        and user.role != "admin"
+    ):
         raise HTTPException(
             status_code=status.HTTP_400_BAD_REQUEST,
             detail=ERROR_MESSAGES.ACCESS_PROHIBITED,
@@ -429,10 +442,6 @@ def remove_file_from_knowledge_by_id(
     if VECTOR_DB_CLIENT.has_collection(collection_name=file_collection):
         VECTOR_DB_CLIENT.delete_collection(collection_name=file_collection)
 
-    # Delete physical file
-    if file.path:
-        Storage.delete_file(file.path)
-
     # Delete file from database
     Files.delete_file_by_id(form_data.file_id)
 
@@ -484,7 +493,11 @@ async def delete_knowledge_by_id(id: str, user=Depends(get_verified_user)):
             detail=ERROR_MESSAGES.NOT_FOUND,
         )
 
-    if knowledge.user_id != user.id and user.role != "admin":
+    if (
+        knowledge.user_id != user.id
+        and not has_access(user.id, "write", knowledge.access_control)
+        and user.role != "admin"
+    ):
         raise HTTPException(
             status_code=status.HTTP_400_BAD_REQUEST,
             detail=ERROR_MESSAGES.ACCESS_PROHIBITED,
@@ -543,7 +556,11 @@ async def reset_knowledge_by_id(id: str, user=Depends(get_verified_user)):
             detail=ERROR_MESSAGES.NOT_FOUND,
         )
 
-    if knowledge.user_id != user.id and user.role != "admin":
+    if (
+        knowledge.user_id != user.id
+        and not has_access(user.id, "write", knowledge.access_control)
+        and user.role != "admin"
+    ):
         raise HTTPException(
             status_code=status.HTTP_400_BAD_REQUEST,
             detail=ERROR_MESSAGES.ACCESS_PROHIBITED,
@@ -582,7 +599,11 @@ def add_files_to_knowledge_batch(
             detail=ERROR_MESSAGES.NOT_FOUND,
         )
 
-    if knowledge.user_id != user.id and user.role != "admin":
+    if (
+        knowledge.user_id != user.id
+        and not has_access(user.id, "write", knowledge.access_control)
+        and user.role != "admin"
+    ):
         raise HTTPException(
             status_code=status.HTTP_400_BAD_REQUEST,
             detail=ERROR_MESSAGES.ACCESS_PROHIBITED,

+ 5 - 1
backend/open_webui/routers/models.py

@@ -183,7 +183,11 @@ async def delete_model_by_id(id: str, user=Depends(get_verified_user)):
             detail=ERROR_MESSAGES.NOT_FOUND,
         )
 
-    if model.user_id != user.id and user.role != "admin":
+    if (
+        user.role != "admin"
+        and model.user_id != user.id
+        and not has_access(user.id, "write", model.access_control)
+    ):
         raise HTTPException(
             status_code=status.HTTP_401_UNAUTHORIZED,
             detail=ERROR_MESSAGES.UNAUTHORIZED,

+ 3 - 4
backend/open_webui/routers/ollama.py

@@ -395,7 +395,7 @@ async def get_ollama_tags(
             )
 
     if user.role == "user" and not BYPASS_MODEL_ACCESS_CONTROL:
-        models["models"] = get_filtered_models(models, user)
+        models["models"] = await get_filtered_models(models, user)
 
     return models
 
@@ -977,6 +977,7 @@ async def generate_chat_completion(
     if BYPASS_MODEL_ACCESS_CONTROL:
         bypass_filter = True
 
+    metadata = form_data.pop("metadata", None)
     try:
         form_data = GenerateChatCompletionForm(**form_data)
     except Exception as e:
@@ -987,8 +988,6 @@ async def generate_chat_completion(
         )
 
     payload = {**form_data.model_dump(exclude_none=True)}
-    if "metadata" in payload:
-        del payload["metadata"]
 
     model_id = payload["model"]
     model_info = Models.get_model_by_id(model_id)
@@ -1006,7 +1005,7 @@ async def generate_chat_completion(
             payload["options"] = apply_model_params_to_body_ollama(
                 params, payload["options"]
             )
-            payload = apply_model_system_prompt_to_body(params, payload, user)
+            payload = apply_model_system_prompt_to_body(params, payload, metadata)
 
         # Check if user has access to the model
         if not bypass_filter and user.role == "user":

+ 4 - 4
backend/open_webui/routers/openai.py

@@ -489,7 +489,7 @@ async def get_models(
                 raise HTTPException(status_code=500, detail=error_detail)
 
     if user.role == "user" and not BYPASS_MODEL_ACCESS_CONTROL:
-        models["data"] = get_filtered_models(models, user)
+        models["data"] = await get_filtered_models(models, user)
 
     return models
 
@@ -551,9 +551,9 @@ async def generate_chat_completion(
         bypass_filter = True
 
     idx = 0
+
     payload = {**form_data}
-    if "metadata" in payload:
-        del payload["metadata"]
+    metadata = payload.pop("metadata", None)
 
     model_id = form_data.get("model")
     model_info = Models.get_model_by_id(model_id)
@@ -566,7 +566,7 @@ async def generate_chat_completion(
 
         params = model_info.params.model_dump()
         payload = apply_model_params_to_body_openai(params, payload)
-        payload = apply_model_system_prompt_to_body(params, payload, user)
+        payload = apply_model_system_prompt_to_body(params, payload, metadata)
 
         # Check if user has access to the model
         if not bypass_filter and user.role == "user":

+ 5 - 1
backend/open_webui/routers/prompts.py

@@ -147,7 +147,11 @@ async def delete_prompt_by_command(command: str, user=Depends(get_verified_user)
             detail=ERROR_MESSAGES.NOT_FOUND,
         )
 
-    if prompt.user_id != user.id and user.role != "admin":
+    if (
+        prompt.user_id != user.id
+        and not has_access(user.id, "write", prompt.access_control)
+        and user.role != "admin"
+    ):
         raise HTTPException(
             status_code=status.HTTP_401_UNAUTHORIZED,
             detail=ERROR_MESSAGES.ACCESS_PROHIBITED,

+ 19 - 3
backend/open_webui/routers/tasks.py

@@ -4,6 +4,7 @@ from fastapi.responses import JSONResponse, RedirectResponse
 from pydantic import BaseModel
 from typing import Optional
 import logging
+import re
 
 from open_webui.utils.chat import generate_chat_completion
 from open_webui.utils.task import (
@@ -89,6 +90,10 @@ async def update_task_config(
         form_data.TITLE_GENERATION_PROMPT_TEMPLATE
     )
 
+    request.app.state.config.IMAGE_PROMPT_GENERATION_PROMPT_TEMPLATE = (
+        form_data.IMAGE_PROMPT_GENERATION_PROMPT_TEMPLATE
+    )
+
     request.app.state.config.ENABLE_AUTOCOMPLETE_GENERATION = (
         form_data.ENABLE_AUTOCOMPLETE_GENERATION
     )
@@ -161,9 +166,20 @@ async def generate_title(
     else:
         template = DEFAULT_TITLE_GENERATION_PROMPT_TEMPLATE
 
+    messages = form_data["messages"]
+
+    # Remove reasoning details from the messages
+    for message in messages:
+        message["content"] = re.sub(
+            r"<details\s+type=\"reasoning\"[^>]*>.*?<\/details>",
+            "",
+            message["content"],
+            flags=re.S,
+        ).strip()
+
     content = title_generation_template(
         template,
-        form_data["messages"],
+        messages,
         {
             "name": user.name,
             "location": user.info.get("location") if user.info else None,
@@ -175,10 +191,10 @@ async def generate_title(
         "messages": [{"role": "user", "content": content}],
         "stream": False,
         **(
-            {"max_tokens": 50}
+            {"max_tokens": 1000}
             if models[task_model_id]["owned_by"] == "ollama"
             else {
-                "max_completion_tokens": 50,
+                "max_completion_tokens": 1000,
             }
         ),
         "metadata": {

+ 5 - 1
backend/open_webui/routers/tools.py

@@ -227,7 +227,11 @@ async def delete_tools_by_id(
             detail=ERROR_MESSAGES.NOT_FOUND,
         )
 
-    if tools.user_id != user.id and user.role != "admin":
+    if (
+        tools.user_id != user.id
+        and not has_access(user.id, "write", tools.access_control)
+        and user.role != "admin"
+    ):
         raise HTTPException(
             status_code=status.HTTP_401_UNAUTHORIZED,
             detail=ERROR_MESSAGES.UNAUTHORIZED,

+ 5 - 2
backend/open_webui/socket/main.py

@@ -325,7 +325,7 @@ def get_event_emitter(request_info):
 
 
 def get_event_call(request_info):
-    async def __event_call__(event_data):
+    async def __event_caller__(event_data):
         response = await sio.call(
             "chat-events",
             {
@@ -337,7 +337,10 @@ def get_event_call(request_info):
         )
         return response
 
-    return __event_call__
+    return __event_caller__
+
+
+get_event_caller = get_event_call
 
 
 def get_user_id_from_session_pool(sid):

+ 395 - 179
backend/open_webui/utils/middleware.py

@@ -7,7 +7,10 @@ from aiocache import cached
 from typing import Any, Optional
 import random
 import json
+import html
 import inspect
+import re
+
 from uuid import uuid4
 from concurrent.futures import ThreadPoolExecutor
 
@@ -54,6 +57,7 @@ from open_webui.utils.task import (
 from open_webui.utils.misc import (
     get_message_list,
     add_or_update_system_message,
+    add_or_update_user_message,
     get_last_user_message,
     get_last_assistant_message,
     prepend_to_first_user_message_content,
@@ -64,7 +68,10 @@ from open_webui.utils.plugin import load_function_module_by_id
 
 from open_webui.tasks import create_task
 
-from open_webui.config import DEFAULT_TOOLS_FUNCTION_CALLING_PROMPT_TEMPLATE
+from open_webui.config import (
+    DEFAULT_TOOLS_FUNCTION_CALLING_PROMPT_TEMPLATE,
+    DEFAULT_CODE_INTERPRETER_PROMPT,
+)
 from open_webui.env import (
     SRC_LOG_LEVELS,
     GLOBAL_LOG_LEVEL,
@@ -270,60 +277,70 @@ async def chat_completion_tools_handler(
 
             result = json.loads(content)
 
-            tool_function_name = result.get("name", None)
-            if tool_function_name not in tools:
-                return body, {}
+            async def tool_call_handler(tool_call):
+                log.debug(f"{tool_call=}")
 
-            tool_function_params = result.get("parameters", {})
-
-            try:
-                required_params = (
-                    tools[tool_function_name]
-                    .get("spec", {})
-                    .get("parameters", {})
-                    .get("required", [])
-                )
-                tool_function = tools[tool_function_name]["callable"]
-                tool_function_params = {
-                    k: v
-                    for k, v in tool_function_params.items()
-                    if k in required_params
-                }
-                tool_output = await tool_function(**tool_function_params)
+                tool_function_name = tool_call.get("name", None)
+                if tool_function_name not in tools:
+                    return body, {}
 
-            except Exception as e:
-                tool_output = str(e)
+                tool_function_params = tool_call.get("parameters", {})
 
-            if isinstance(tool_output, str):
-                if tools[tool_function_name]["citation"]:
-                    sources.append(
-                        {
-                            "source": {
-                                "name": f"TOOL:{tools[tool_function_name]['toolkit_id']}/{tool_function_name}"
-                            },
-                            "document": [tool_output],
-                            "metadata": [
-                                {
-                                    "source": f"TOOL:{tools[tool_function_name]['toolkit_id']}/{tool_function_name}"
-                                }
-                            ],
-                        }
-                    )
-                else:
-                    sources.append(
-                        {
-                            "source": {},
-                            "document": [tool_output],
-                            "metadata": [
-                                {
-                                    "source": f"TOOL:{tools[tool_function_name]['toolkit_id']}/{tool_function_name}"
-                                }
-                            ],
-                        }
+                try:
+                    required_params = (
+                        tools[tool_function_name]
+                        .get("spec", {})
+                        .get("parameters", {})
+                        .get("required", [])
                     )
+                    tool_function = tools[tool_function_name]["callable"]
+                    tool_function_params = {
+                        k: v
+                        for k, v in tool_function_params.items()
+                        if k in required_params
+                    }
+                    tool_output = await tool_function(**tool_function_params)
+
+                except Exception as e:
+                    tool_output = str(e)
+
+                if isinstance(tool_output, str):
+                    if tools[tool_function_name]["citation"]:
+                        sources.append(
+                            {
+                                "source": {
+                                    "name": f"TOOL:{tools[tool_function_name]['toolkit_id']}/{tool_function_name}"
+                                },
+                                "document": [tool_output],
+                                "metadata": [
+                                    {
+                                        "source": f"TOOL:{tools[tool_function_name]['toolkit_id']}/{tool_function_name}"
+                                    }
+                                ],
+                            }
+                        )
+                    else:
+                        sources.append(
+                            {
+                                "source": {},
+                                "document": [tool_output],
+                                "metadata": [
+                                    {
+                                        "source": f"TOOL:{tools[tool_function_name]['toolkit_id']}/{tool_function_name}"
+                                    }
+                                ],
+                            }
+                        )
 
-                if tools[tool_function_name]["file_handler"]:
-                    skip_files = True
+                    if tools[tool_function_name]["file_handler"]:
+                        skip_files = True
+
+            # check if "tool_calls" in result
+            if result.get("tool_calls"):
+                for tool_call in result.get("tool_calls"):
+                    await tool_call_handler(tool_call)
+            else:
+                await tool_call_handler(result)
 
         except Exception as e:
             log.exception(f"Error: {e}")
@@ -666,6 +683,9 @@ def apply_params_to_form_data(form_data, model):
         if "temperature" in params:
             form_data["temperature"] = params["temperature"]
 
+        if "max_tokens" in params:
+            form_data["max_tokens"] = params["max_tokens"]
+
         if "top_p" in params:
             form_data["top_p"] = params["top_p"]
 
@@ -746,6 +766,8 @@ async def process_chat_payload(request, form_data, metadata, user, model):
         files.extend(knowledge_files)
         form_data["files"] = files
 
+    variables = form_data.pop("variables", None)
+
     features = form_data.pop("features", None)
     if features:
         if "web_search" in features and features["web_search"]:
@@ -758,6 +780,11 @@ async def process_chat_payload(request, form_data, metadata, user, model):
                 request, form_data, extra_params, user
             )
 
+        if "code_interpreter" in features and features["code_interpreter"]:
+            form_data["messages"] = add_or_update_user_message(
+                DEFAULT_CODE_INTERPRETER_PROMPT, form_data["messages"]
+            )
+
     try:
         form_data, flags = await chat_completion_filter_functions_handler(
             request, form_data, model, extra_params
@@ -889,16 +916,24 @@ async def process_chat_response(
 
                         if res and isinstance(res, dict):
                             if len(res.get("choices", [])) == 1:
-                                title = (
+                                title_string = (
                                     res.get("choices", [])[0]
                                     .get("message", {})
-                                    .get(
-                                        "content",
-                                        message.get("content", "New Chat"),
-                                    )
-                                ).strip()
+                                    .get("content", message.get("content", "New Chat"))
+                                )
                             else:
-                                title = None
+                                title_string = ""
+
+                            title_string = title_string[
+                                title_string.find("{") : title_string.rfind("}") + 1
+                            ]
+
+                            try:
+                                title = json.loads(title_string).get(
+                                    "title", "New Chat"
+                                )
+                            except Exception as e:
+                                title = ""
 
                             if not title:
                                 title = messages[0].get("content", "New Chat")
@@ -964,6 +999,7 @@ async def process_chat_response(
                             pass
 
     event_emitter = None
+    event_caller = None
     if (
         "session_id" in metadata
         and metadata["session_id"]
@@ -973,10 +1009,11 @@ async def process_chat_response(
         and metadata["message_id"]
     ):
         event_emitter = get_event_emitter(metadata)
+        event_caller = get_event_call(metadata)
 
+    # Non-streaming response
     if not isinstance(response, StreamingResponse):
         if event_emitter:
-
             if "selected_model_id" in response:
                 Chats.upsert_message_to_chat_by_id_and_message_id(
                     metadata["chat_id"],
@@ -1041,22 +1078,156 @@ async def process_chat_response(
         else:
             return response
 
+    # Non standard response
     if not any(
         content_type in response.headers["Content-Type"]
         for content_type in ["text/event-stream", "application/x-ndjson"]
     ):
         return response
 
-    if event_emitter:
-
+    # Streaming response
+    if event_emitter and event_caller:
         task_id = str(uuid4())  # Create a unique task ID.
+        model_id = form_data.get("model", "")
 
         # Handle as a background task
         async def post_response_handler(response, events):
+            def serialize_content_blocks(content_blocks, raw=False):
+                content = ""
+
+                for block in content_blocks:
+                    if block["type"] == "text":
+                        content = f"{content}{block['content'].strip()}\n"
+                    elif block["type"] == "reasoning":
+                        reasoning_display_content = "\n".join(
+                            (f"> {line}" if not line.startswith(">") else line)
+                            for line in block["content"].splitlines()
+                        )
+
+                        reasoning_duration = block.get("duration", None)
+
+                        if reasoning_duration:
+                            content = f'{content}<details type="reasoning" done="true" duration="{reasoning_duration}">\n<summary>Thought for {reasoning_duration} seconds</summary>\n{reasoning_display_content}\n</details>\n'
+                        else:
+                            content = f'{content}<details type="reasoning" done="false">\n<summary>Thinking…</summary>\n{reasoning_display_content}\n</details>\n'
+
+                    elif block["type"] == "code_interpreter":
+                        attributes = block.get("attributes", {})
+                        output = block.get("output", None)
+                        lang = attributes.get("lang", "")
+
+                        if output:
+                            output = html.escape(json.dumps(output))
+
+                            if raw:
+                                content = f'{content}<details type="code_interpreter" done="true" output="{output}">\n<summary>Analyzed</summary>\n```{lang}\n{block["content"]}\n```\n```output\n{output}\n```\n</details>\n'
+                            else:
+                                content = f'{content}<details type="code_interpreter" done="true" output="{output}">\n<summary>Analyzed</summary>\n```{lang}\n{block["content"]}\n```\n</details>\n'
+                        else:
+                            content = f'{content}<details type="code_interpreter" done="false">\n<summary>Analyzing...</summary>\n```{lang}\n{block["content"]}\n```\n</details>\n'
+
+                    else:
+                        block_content = str(block["content"]).strip()
+                        content = f"{content}{block['type']}: {block_content}\n"
+
+                return content
+
+            def tag_content_handler(content_type, tags, content, content_blocks):
+                end_flag = False
+
+                def extract_attributes(tag_content):
+                    """Extract attributes from a tag if they exist."""
+                    attributes = {}
+                    # Match attributes in the format: key="value" (ignores single quotes for simplicity)
+                    matches = re.findall(r'(\w+)\s*=\s*"([^"]+)"', tag_content)
+                    for key, value in matches:
+                        attributes[key] = value
+                    return attributes
+
+                if content_blocks[-1]["type"] == "text":
+                    for tag in tags:
+                        # Match start tag e.g., <tag> or <tag attr="value">
+                        start_tag_pattern = rf"<{tag}(.*?)>"
+                        match = re.search(start_tag_pattern, content)
+                        if match:
+                            # Extract attributes in the tag (if present)
+                            attributes = extract_attributes(match.group(1))
+                            # Remove the start tag from the currently handling text block
+                            content_blocks[-1]["content"] = content_blocks[-1][
+                                "content"
+                            ].replace(match.group(0), "")
+                            if not content_blocks[-1]["content"]:
+                                content_blocks.pop()
+                            # Append the new block
+                            content_blocks.append(
+                                {
+                                    "type": content_type,
+                                    "tag": tag,
+                                    "attributes": attributes,
+                                    "content": "",
+                                    "started_at": time.time(),
+                                }
+                            )
+                            break
+                elif content_blocks[-1]["type"] == content_type:
+                    tag = content_blocks[-1]["tag"]
+                    # Match end tag e.g., </tag>
+                    end_tag_pattern = rf"</{tag}>"
+                    if re.search(end_tag_pattern, content):
+                        block_content = content_blocks[-1]["content"]
+                        # Strip start and end tags from the content
+                        start_tag_pattern = rf"<{tag}(.*?)>"
+                        block_content = re.sub(
+                            start_tag_pattern, "", block_content
+                        ).strip()
+                        block_content = re.sub(
+                            end_tag_pattern, "", block_content
+                        ).strip()
+                        if block_content:
+                            end_flag = True
+                            content_blocks[-1]["content"] = block_content
+                            content_blocks[-1]["ended_at"] = time.time()
+                            content_blocks[-1]["duration"] = int(
+                                content_blocks[-1]["ended_at"]
+                                - content_blocks[-1]["started_at"]
+                            )
+                            # Reset the content_blocks by appending a new text block
+                            content_blocks.append(
+                                {
+                                    "type": "text",
+                                    "content": "",
+                                }
+                            )
+                            # Clean processed content
+                            content = re.sub(
+                                rf"<{tag}(.*?)>(.|\n)*?</{tag}>",
+                                "",
+                                content,
+                                flags=re.DOTALL,
+                            )
+                        else:
+                            # Remove the block if content is empty
+                            content_blocks.pop()
+                return content, content_blocks, end_flag
+
             message = Chats.get_message_by_id_and_message_id(
                 metadata["chat_id"], metadata["message_id"]
             )
+
             content = message.get("content", "") if message else ""
+            content_blocks = [
+                {
+                    "type": "text",
+                    "content": content,
+                }
+            ]
+
+            # We might want to disable this by default
+            DETECT_REASONING = True
+            DETECT_CODE_INTERPRETER = True
+
+            reasoning_tags = ["think", "reason", "reasoning", "thought", "Thought"]
+            code_interpreter_tags = ["code_interpreter"]
 
             try:
                 for event in events:
@@ -1076,148 +1247,193 @@ async def process_chat_response(
                         },
                     )
 
-                # We might want to disable this by default
-                detect_reasoning = True
-                reasoning_tags = ["think", "reason", "reasoning", "thought", "Thought"]
-                current_tag = None
+                async def stream_body_handler(response):
+                    nonlocal content
+                    nonlocal content_blocks
 
-                reasoning_start_time = None
+                    async for line in response.body_iterator:
+                        line = line.decode("utf-8") if isinstance(line, bytes) else line
+                        data = line
+
+                        # Skip empty lines
+                        if not data.strip():
+                            continue
 
-                reasoning_content = ""
-                ongoing_content = ""
+                        # "data:" is the prefix for each event
+                        if not data.startswith("data:"):
+                            continue
 
-                async for line in response.body_iterator:
-                    line = line.decode("utf-8") if isinstance(line, bytes) else line
-                    data = line
+                        # Remove the prefix
+                        data = data[len("data:") :].strip()
 
-                    # Skip empty lines
-                    if not data.strip():
-                        continue
+                        try:
+                            data = json.loads(data)
+
+                            if "selected_model_id" in data:
+                                model_id = data["selected_model_id"]
+                                Chats.upsert_message_to_chat_by_id_and_message_id(
+                                    metadata["chat_id"],
+                                    metadata["message_id"],
+                                    {
+                                        "selectedModelId": model_id,
+                                    },
+                                )
+                            else:
+                                choices = data.get("choices", [])
+                                if not choices:
+                                    continue
 
-                    # "data:" is the prefix for each event
-                    if not data.startswith("data:"):
-                        continue
+                                value = choices[0].get("delta", {}).get("content")
 
-                    # Remove the prefix
-                    data = data[len("data:") :].strip()
+                                if value:
+                                    content = f"{content}{value}"
+                                    content_blocks[-1]["content"] = (
+                                        content_blocks[-1]["content"] + value
+                                    )
 
-                    try:
-                        data = json.loads(data)
+                                    if DETECT_REASONING:
+                                        content, content_blocks, _ = (
+                                            tag_content_handler(
+                                                "reasoning",
+                                                reasoning_tags,
+                                                content,
+                                                content_blocks,
+                                            )
+                                        )
+
+                                    if DETECT_CODE_INTERPRETER:
+                                        content, content_blocks, end = (
+                                            tag_content_handler(
+                                                "code_interpreter",
+                                                code_interpreter_tags,
+                                                content,
+                                                content_blocks,
+                                            )
+                                        )
 
-                        if "selected_model_id" in data:
-                            Chats.upsert_message_to_chat_by_id_and_message_id(
-                                metadata["chat_id"],
-                                metadata["message_id"],
+                                        if end:
+                                            break
+
+                                    if ENABLE_REALTIME_CHAT_SAVE:
+                                        # Save message in the database
+                                        Chats.upsert_message_to_chat_by_id_and_message_id(
+                                            metadata["chat_id"],
+                                            metadata["message_id"],
+                                            {
+                                                "content": serialize_content_blocks(
+                                                    content_blocks
+                                                ),
+                                            },
+                                        )
+                                    else:
+                                        data = {
+                                            "content": serialize_content_blocks(
+                                                content_blocks
+                                            ),
+                                        }
+
+                            await event_emitter(
                                 {
-                                    "selectedModelId": data["selected_model_id"],
-                                },
-                            )
-                        else:
-                            value = (
-                                data.get("choices", [])[0]
-                                .get("delta", {})
-                                .get("content")
+                                    "type": "chat:completion",
+                                    "data": data,
+                                }
                             )
+                        except Exception as e:
+                            done = "data: [DONE]" in line
+                            if done:
+                                pass
+                            else:
+                                log.debug("Error: ", e)
+                                continue
 
-                            if value:
-                                content = f"{content}{value}"
-
-                                if detect_reasoning:
-                                    for tag in reasoning_tags:
-                                        start_tag = f"<{tag}>\n"
-                                        end_tag = f"</{tag}>\n"
+                    # Clean up the last text block
+                    if content_blocks[-1]["type"] == "text":
+                        content_blocks[-1]["content"] = content_blocks[-1][
+                            "content"
+                        ].strip()
 
-                                        if start_tag in content:
-                                            # Remove the start tag
-                                            content = content.replace(start_tag, "")
-                                            ongoing_content = content
+                        if not content_blocks[-1]["content"]:
+                            content_blocks.pop()
 
-                                            reasoning_start_time = time.time()
-                                            reasoning_content = ""
+                    if response.background:
+                        await response.background()
 
-                                            current_tag = tag
-                                            break
+                await stream_body_handler(response)
 
-                                    if reasoning_start_time is not None:
-                                        # Remove the last value from the content
-                                        content = content[: -len(value)]
+                MAX_RETRIES = 5
+                retries = 0
 
-                                        reasoning_content += value
+                while (
+                    content_blocks[-1]["type"] == "code_interpreter"
+                    and retries < MAX_RETRIES
+                ):
+                    retries += 1
+                    log.debug(f"Attempt count: {retries}")
 
-                                        end_tag = f"</{current_tag}>\n"
-                                        if end_tag in reasoning_content:
-                                            reasoning_end_time = time.time()
-                                            reasoning_duration = int(
-                                                reasoning_end_time
-                                                - reasoning_start_time
-                                            )
-                                            reasoning_content = (
-                                                reasoning_content.strip(
-                                                    f"<{current_tag}>\n"
-                                                )
-                                                .strip(end_tag)
-                                                .strip()
-                                            )
+                    try:
+                        if content_blocks[-1]["attributes"].get("type") == "code":
+                            output = await event_caller(
+                                {
+                                    "type": "execute:python",
+                                    "data": {
+                                        "id": str(uuid4()),
+                                        "code": content_blocks[-1]["content"],
+                                    },
+                                }
+                            )
+                    except Exception as e:
+                        output = str(e)
 
-                                            if reasoning_content:
-                                                reasoning_display_content = "\n".join(
-                                                    (
-                                                        f"> {line}"
-                                                        if not line.startswith(">")
-                                                        else line
-                                                    )
-                                                    for line in reasoning_content.splitlines()
-                                                )
-
-                                                # Format reasoning with <details> tag
-                                                content = f'{ongoing_content}<details type="reasoning" done="true" duration="{reasoning_duration}">\n<summary>Thought for {reasoning_duration} seconds</summary>\n{reasoning_display_content}\n</details>\n'
-                                            else:
-                                                content = ""
-
-                                            reasoning_start_time = None
-                                        else:
-
-                                            reasoning_display_content = "\n".join(
-                                                (
-                                                    f"> {line}"
-                                                    if not line.startswith(">")
-                                                    else line
-                                                )
-                                                for line in reasoning_content.splitlines()
-                                            )
+                    content_blocks[-1]["output"] = output
+                    content_blocks.append(
+                        {
+                            "type": "text",
+                            "content": "",
+                        }
+                    )
 
-                                            # Show ongoing thought process
-                                            content = f'{ongoing_content}<details type="reasoning" done="false">\n<summary>Thinking…</summary>\n{reasoning_display_content}\n</details>\n'
-
-                                if ENABLE_REALTIME_CHAT_SAVE:
-                                    # Save message in the database
-                                    Chats.upsert_message_to_chat_by_id_and_message_id(
-                                        metadata["chat_id"],
-                                        metadata["message_id"],
-                                        {
-                                            "content": content,
-                                        },
-                                    )
-                                else:
-                                    data = {
-                                        "content": content,
-                                    }
+                    await event_emitter(
+                        {
+                            "type": "chat:completion",
+                            "data": {
+                                "content": serialize_content_blocks(content_blocks),
+                            },
+                        }
+                    )
 
-                        await event_emitter(
+                    try:
+                        res = await generate_chat_completion(
+                            request,
                             {
-                                "type": "chat:completion",
-                                "data": data,
-                            }
+                                "model": model_id,
+                                "stream": True,
+                                "messages": [
+                                    *form_data["messages"],
+                                    {
+                                        "role": "assistant",
+                                        "content": serialize_content_blocks(
+                                            content_blocks, raw=True
+                                        ),
+                                    },
+                                ],
+                            },
+                            user,
                         )
-                    except Exception as e:
-                        done = "data: [DONE]" in line
-                        if done:
-                            pass
+
+                        if isinstance(res, StreamingResponse):
+                            await stream_body_handler(res)
                         else:
-                            continue
+                            break
+                    except Exception as e:
+                        log.debug(e)
+                        break
 
                 title = Chats.get_chat_title_by_id(metadata["chat_id"])
-                data = {"done": True, "content": content, "title": title}
+                data = {
+                    "done": True,
+                    "content": serialize_content_blocks(content_blocks),
+                    "title": title,
+                }
 
                 if not ENABLE_REALTIME_CHAT_SAVE:
                     # Save message in the database
@@ -1225,7 +1441,7 @@ async def process_chat_response(
                         metadata["chat_id"],
                         metadata["message_id"],
                         {
-                            "content": content,
+                            "content": serialize_content_blocks(content_blocks),
                         },
                     )
 
@@ -1262,7 +1478,7 @@ async def process_chat_response(
                         metadata["chat_id"],
                         metadata["message_id"],
                         {
-                            "content": content,
+                            "content": serialize_content_blocks(content_blocks),
                         },
                     )
 

+ 39 - 0
backend/open_webui/utils/misc.py

@@ -131,6 +131,44 @@ def add_or_update_system_message(content: str, messages: list[dict]):
     return messages
 
 
+def add_or_update_user_message(content: str, messages: list[dict]):
+    """
+    Adds a new user message at the end of the messages list
+    or updates the existing user message at the end.
+
+    :param msg: The message to be added or appended.
+    :param messages: The list of message dictionaries.
+    :return: The updated list of message dictionaries.
+    """
+
+    if messages and messages[-1].get("role") == "user":
+        messages[-1]["content"] = f"{messages[-1]['content']}\n{content}"
+    else:
+        # Insert at the end
+        messages.append({"role": "user", "content": content})
+
+    return messages
+
+
+def append_or_update_assistant_message(content: str, messages: list[dict]):
+    """
+    Adds a new assistant message at the end of the messages list
+    or updates the existing assistant message at the end.
+
+    :param msg: The message to be added or appended.
+    :param messages: The list of message dictionaries.
+    :return: The updated list of message dictionaries.
+    """
+
+    if messages and messages[-1].get("role") == "assistant":
+        messages[-1]["content"] = f"{messages[-1]['content']}\n{content}"
+    else:
+        # Insert at the end
+        messages.append({"role": "assistant", "content": content})
+
+    return messages
+
+
 def openai_chat_message_template(model: str):
     return {
         "id": f"{model}-{str(uuid.uuid4())}",
@@ -149,6 +187,7 @@ def openai_chat_chunk_message_template(
         template["choices"][0]["delta"] = {"content": message}
     else:
         template["choices"][0]["finish_reason"] = "stop"
+        template["choices"][0]["delta"] = {}
 
     if usage:
         template["usage"] = usage

+ 14 - 8
backend/open_webui/utils/oauth.py

@@ -35,7 +35,7 @@ from open_webui.config import (
     AppConfig,
 )
 from open_webui.constants import ERROR_MESSAGES, WEBHOOK_MESSAGES
-from open_webui.env import WEBUI_SESSION_COOKIE_SAME_SITE, WEBUI_SESSION_COOKIE_SECURE
+from open_webui.env import WEBUI_AUTH_COOKIE_SAME_SITE, WEBUI_AUTH_COOKIE_SECURE
 from open_webui.utils.misc import parse_duration
 from open_webui.utils.auth import get_password_hash, create_token
 from open_webui.utils.webhook import post_webhook
@@ -82,7 +82,8 @@ class OAuthManager:
             oauth_allowed_roles = auth_manager_config.OAUTH_ALLOWED_ROLES
             oauth_admin_roles = auth_manager_config.OAUTH_ADMIN_ROLES
             oauth_roles = None
-            role = "pending"  # Default/fallback role if no matching roles are found
+            # Default/fallback role if no matching roles are found
+            role = auth_manager_config.DEFAULT_USER_ROLE
 
             # Next block extracts the roles from the user data, accepting nested claims of any depth
             if oauth_claim and oauth_allowed_roles and oauth_admin_roles:
@@ -273,11 +274,16 @@ class OAuthManager:
                         log.error(
                             f"Error downloading profile image '{picture_url}': {e}"
                         )
-                        picture_url = ""
+                        picture_url = "/user.png"
                 if not picture_url:
                     picture_url = "/user.png"
+
                 username_claim = auth_manager_config.OAUTH_USERNAME_CLAIM
 
+                name = user_data.get(username_claim)
+                if not isinstance(user, str):
+                    name = email
+
                 role = self.get_user_role(None, user_data)
 
                 user = Auths.insert_new_auth(
@@ -285,7 +291,7 @@ class OAuthManager:
                     password=get_password_hash(
                         str(uuid.uuid4())
                     ),  # Random password, not used
-                    name=user_data.get(username_claim, "User"),
+                    name=name,
                     profile_image_url=picture_url,
                     role=role,
                     oauth_sub=provider_sub,
@@ -323,8 +329,8 @@ class OAuthManager:
             key="token",
             value=jwt_token,
             httponly=True,  # Ensures the cookie is not accessible via JavaScript
-            samesite=WEBUI_SESSION_COOKIE_SAME_SITE,
-            secure=WEBUI_SESSION_COOKIE_SECURE,
+            samesite=WEBUI_AUTH_COOKIE_SAME_SITE,
+            secure=WEBUI_AUTH_COOKIE_SECURE,
         )
 
         if ENABLE_OAUTH_SIGNUP.value:
@@ -333,8 +339,8 @@ class OAuthManager:
                 key="oauth_id_token",
                 value=oauth_id_token,
                 httponly=True,
-                samesite=WEBUI_SESSION_COOKIE_SAME_SITE,
-                secure=WEBUI_SESSION_COOKIE_SECURE,
+                samesite=WEBUI_AUTH_COOKIE_SAME_SITE,
+                secure=WEBUI_AUTH_COOKIE_SECURE,
             )
         # Redirect back to the frontend with the JWT token
         redirect_url = f"{request.base_url}auth#token={jwt_token}"

+ 12 - 10
backend/open_webui/utils/payload.py

@@ -1,4 +1,4 @@
-from open_webui.utils.task import prompt_template
+from open_webui.utils.task import prompt_variables_template
 from open_webui.utils.misc import (
     add_or_update_system_message,
 )
@@ -7,19 +7,18 @@ from typing import Callable, Optional
 
 
 # inplace function: form_data is modified
-def apply_model_system_prompt_to_body(params: dict, form_data: dict, user) -> dict:
+def apply_model_system_prompt_to_body(
+    params: dict, form_data: dict, metadata: Optional[dict] = None
+) -> dict:
     system = params.get("system", None)
     if not system:
         return form_data
 
-    if user:
-        template_params = {
-            "user_name": user.name,
-            "user_location": user.info.get("location") if user.info else None,
-        }
-    else:
-        template_params = {}
-    system = prompt_template(system, **template_params)
+    if metadata:
+        print("apply_model_system_prompt_to_body: metadata", metadata)
+        variables = metadata.get("variables", {})
+        system = prompt_variables_template(system, variables)
+
     form_data["messages"] = add_or_update_system_message(
         system, form_data.get("messages", [])
     )
@@ -188,4 +187,7 @@ def convert_payload_openai_to_ollama(openai_payload: dict) -> dict:
     if ollama_options:
         ollama_payload["options"] = ollama_options
 
+    if "metadata" in openai_payload:
+        ollama_payload["metadata"] = openai_payload["metadata"]
+
     return ollama_payload

+ 9 - 4
backend/open_webui/utils/plugin.py

@@ -167,9 +167,14 @@ def load_function_module_by_id(function_id, content=None):
 
 def install_frontmatter_requirements(requirements):
     if requirements:
-        req_list = [req.strip() for req in requirements.split(",")]
-        for req in req_list:
-            log.info(f"Installing requirement: {req}")
-            subprocess.check_call([sys.executable, "-m", "pip", "install", req])
+        try:
+            req_list = [req.strip() for req in requirements.split(",")]
+            for req in req_list:
+                log.info(f"Installing requirement: {req}")
+                subprocess.check_call([sys.executable, "-m", "pip", "install", req])
+        except Exception as e:
+            log.error(f"Error installing package: {req}")
+            raise e
+
     else:
         log.info("No requirements found in frontmatter.")

+ 42 - 1
backend/open_webui/utils/response.py

@@ -9,7 +9,48 @@ def convert_response_ollama_to_openai(ollama_response: dict) -> dict:
     model = ollama_response.get("model", "ollama")
     message_content = ollama_response.get("message", {}).get("content", "")
 
-    response = openai_chat_completion_message_template(model, message_content)
+    data = ollama_response
+    usage = {
+        "response_token/s": (
+            round(
+                (
+                    (
+                        data.get("eval_count", 0)
+                        / ((data.get("eval_duration", 0) / 10_000_000))
+                    )
+                    * 100
+                ),
+                2,
+            )
+            if data.get("eval_duration", 0) > 0
+            else "N/A"
+        ),
+        "prompt_token/s": (
+            round(
+                (
+                    (
+                        data.get("prompt_eval_count", 0)
+                        / ((data.get("prompt_eval_duration", 0) / 10_000_000))
+                    )
+                    * 100
+                ),
+                2,
+            )
+            if data.get("prompt_eval_duration", 0) > 0
+            else "N/A"
+        ),
+        "total_duration": data.get("total_duration", 0),
+        "load_duration": data.get("load_duration", 0),
+        "prompt_eval_count": data.get("prompt_eval_count", 0),
+        "prompt_eval_duration": data.get("prompt_eval_duration", 0),
+        "eval_count": data.get("eval_count", 0),
+        "eval_duration": data.get("eval_duration", 0),
+        "approximate_total": (lambda s: f"{s // 3600}h{(s % 3600) // 60}m{s % 60}s")(
+            (data.get("total_duration", 0) or 0) // 1_000_000_000
+        ),
+    }
+
+    response = openai_chat_completion_message_template(model, message_content, usage)
     return response
 
 

+ 6 - 0
backend/open_webui/utils/task.py

@@ -32,6 +32,12 @@ def get_task_model_id(
     return task_model_id
 
 
+def prompt_variables_template(template: str, variables: dict[str, str]) -> str:
+    for variable, value in variables.items():
+        template = template.replace(variable, value)
+    return template
+
+
 def prompt_template(
     template: str, user_name: Optional[str] = None, user_location: Optional[str] = None
 ) -> str:

+ 7 - 7
backend/requirements.txt

@@ -1,4 +1,4 @@
-fastapi==0.111.0
+fastapi==0.115.7
 uvicorn[standard]==0.30.6
 pydantic==2.9.2
 python-multipart==0.0.18
@@ -11,7 +11,7 @@ python-jose==3.3.0
 passlib[bcrypt]==1.7.4
 
 requests==2.32.3
-aiohttp==3.11.8
+aiohttp==3.11.11
 async-timeout
 aiocache
 aiofiles
@@ -57,7 +57,7 @@ einops==0.8.0
 ftfy==6.2.3
 pypdf==4.3.1
 fpdf2==2.8.2
-pymdown-extensions==10.11.2
+pymdown-extensions==10.14.2
 docx2txt==0.8
 python-pptx==1.0.0
 unstructured==0.15.9
@@ -71,16 +71,16 @@ xlrd==2.0.1
 validators==0.34.0
 psutil
 sentencepiece
-soundfile==0.12.1
+soundfile==0.13.1
 
-opencv-python-headless==4.10.0.84
+opencv-python-headless==4.11.0.86
 rapidocr-onnxruntime==1.3.24
 rank-bm25==0.2.2
 
 faster-whisper==1.0.3
 
 PyJWT[crypto]==2.10.1
-authlib==1.3.2
+authlib==1.4.1
 
 black==24.8.0
 langfuse==2.44.0
@@ -89,7 +89,7 @@ pytube==15.0.0
 
 extract_msg
 pydub
-duckduckgo-search~=7.2.1
+duckduckgo-search~=7.3.0
 
 ## Google Drive
 google-api-python-client

+ 5 - 4
package-lock.json

@@ -56,7 +56,7 @@
 				"prosemirror-schema-list": "^1.4.1",
 				"prosemirror-state": "^1.4.3",
 				"prosemirror-view": "^1.34.3",
-				"pyodide": "^0.26.1",
+				"pyodide": "^0.27.2",
 				"socket.io-client": "^4.2.0",
 				"sortablejs": "^1.15.2",
 				"svelte-sonner": "^0.3.19",
@@ -9366,9 +9366,10 @@
 			}
 		},
 		"node_modules/pyodide": {
-			"version": "0.26.1",
-			"resolved": "https://registry.npmjs.org/pyodide/-/pyodide-0.26.1.tgz",
-			"integrity": "sha512-P+Gm88nwZqY7uBgjbQH8CqqU6Ei/rDn7pS1t02sNZsbyLJMyE2OVXjgNuqVT3KqYWnyGREUN0DbBUCJqk8R0ew==",
+			"version": "0.27.2",
+			"resolved": "https://registry.npmjs.org/pyodide/-/pyodide-0.27.2.tgz",
+			"integrity": "sha512-sfA2kiUuQVRpWI4BYnU3sX5PaTTt/xrcVEmRzRcId8DzZXGGtPgCBC0gCqjUTUYSa8ofPaSjXmzESc86yvvCHg==",
+			"license": "Apache-2.0",
 			"dependencies": {
 				"ws": "^8.5.0"
 			},

+ 1 - 1
package.json

@@ -98,7 +98,7 @@
 		"prosemirror-schema-list": "^1.4.1",
 		"prosemirror-state": "^1.4.3",
 		"prosemirror-view": "^1.34.3",
-		"pyodide": "^0.26.1",
+		"pyodide": "^0.27.2",
 		"socket.io-client": "^4.2.0",
 		"sortablejs": "^1.15.2",
 		"svelte-sonner": "^0.3.19",

+ 7 - 7
pyproject.toml

@@ -6,7 +6,7 @@ authors = [
 ]
 license = { file = "LICENSE" }
 dependencies = [
-    "fastapi==0.111.0",
+    "fastapi==0.115.7",
     "uvicorn[standard]==0.30.6",
     "pydantic==2.9.2",
     "python-multipart==0.0.18",
@@ -19,7 +19,7 @@ dependencies = [
     "passlib[bcrypt]==1.7.4",
 
     "requests==2.32.3",
-    "aiohttp==3.11.8",
+    "aiohttp==3.11.11",
     "async-timeout",
     "aiocache",
     "aiofiles",
@@ -62,7 +62,7 @@ dependencies = [
     "ftfy==6.2.3",
     "pypdf==4.3.1",
     "fpdf2==2.8.2",
-    "pymdown-extensions==10.11.2",
+    "pymdown-extensions==10.14.2",
     "docx2txt==0.8",
     "python-pptx==1.0.0",
     "unstructured==0.15.9",
@@ -76,16 +76,16 @@ dependencies = [
     "validators==0.34.0",
     "psutil",
     "sentencepiece",
-    "soundfile==0.12.1",
+    "soundfile==0.13.1",
 
-    "opencv-python-headless==4.10.0.84",
+    "opencv-python-headless==4.11.0.86",
     "rapidocr-onnxruntime==1.3.24",
     "rank-bm25==0.2.2",
 
     "faster-whisper==1.0.3",
 
     "PyJWT[crypto]==2.10.1",
-    "authlib==1.3.2",
+    "authlib==1.4.1",
 
     "black==24.8.0",
     "langfuse==2.44.0",
@@ -94,7 +94,7 @@ dependencies = [
 
     "extract_msg",
     "pydub",
-    "duckduckgo-search~=7.2.1",
+    "duckduckgo-search~=7.3.0",
 
     "google-api-python-client",
     "google-auth-httplib2",

+ 5 - 2
src/lib/apis/chats/index.ts

@@ -580,7 +580,7 @@ export const toggleChatPinnedStatusById = async (token: string, id: string) => {
 	return res;
 };
 
-export const cloneChatById = async (token: string, id: string) => {
+export const cloneChatById = async (token: string, id: string, title?: string) => {
 	let error = null;
 
 	const res = await fetch(`${WEBUI_API_BASE_URL}/chats/${id}/clone`, {
@@ -589,7 +589,10 @@ export const cloneChatById = async (token: string, id: string) => {
 			Accept: 'application/json',
 			'Content-Type': 'application/json',
 			...(token && { authorization: `Bearer ${token}` })
-		}
+		},
+		body: JSON.stringify({
+			...(title && { title: title })
+		})
 	})
 		.then(async (res) => {
 			if (!res.ok) throw await res.json();

+ 1 - 1
src/lib/apis/models/index.ts

@@ -219,7 +219,7 @@ export const deleteModelById = async (token: string, id: string) => {
 			return json;
 		})
 		.catch((err) => {
-			error = err;
+			error = err.detail;
 
 			console.log(err);
 			return null;

+ 2 - 2
src/lib/components/admin/Settings/Audio.svelte

@@ -51,7 +51,7 @@
 			models = [];
 		} else {
 			const res = await _getModels(localStorage.token).catch((e) => {
-				toast.error(e);
+				toast.error(`${e}`);
 			});
 
 			if (res) {
@@ -74,7 +74,7 @@
 			}, 100);
 		} else {
 			const res = await _getVoices(localStorage.token).catch((e) => {
-				toast.error(e);
+				toast.error(`${e}`);
 			});
 
 			if (res) {

+ 16 - 1
src/lib/components/admin/Settings/Interface.svelte

@@ -31,7 +31,8 @@
 		ENABLE_TAGS_GENERATION: true,
 		ENABLE_SEARCH_QUERY_GENERATION: true,
 		ENABLE_RETRIEVAL_QUERY_GENERATION: true,
-		QUERY_GENERATION_PROMPT_TEMPLATE: ''
+		QUERY_GENERATION_PROMPT_TEMPLATE: '',
+		TOOLS_FUNCTION_CALLING_PROMPT_TEMPLATE: ''
 	};
 
 	let promptSuggestions = [];
@@ -251,6 +252,20 @@
 				</div>
 			</div>
 
+			<div class="mt-3">
+				<div class=" mb-2.5 text-xs font-medium">{$i18n.t('Tools Function Calling Prompt')}</div>
+
+				<Tooltip
+					content={$i18n.t('Leave empty to use the default prompt, or enter a custom prompt')}
+					placement="top-start"
+				>
+					<Textarea
+						bind:value={taskConfig.TOOLS_FUNCTION_CALLING_PROMPT_TEMPLATE}
+						placeholder={$i18n.t('Leave empty to use the default prompt, or enter a custom prompt')}
+					/>
+				</Tooltip>
+			</div>
+
 			<hr class=" border-gray-50 dark:border-gray-850 my-3" />
 
 			<div class=" space-y-3 {banners.length > 0 ? ' mb-3' : ''}">

+ 3 - 1
src/lib/components/admin/Users/UserList.svelte

@@ -6,7 +6,9 @@
 
 	import dayjs from 'dayjs';
 	import relativeTime from 'dayjs/plugin/relativeTime';
+	import localizedFormat from 'dayjs/plugin/localizedFormat';
 	dayjs.extend(relativeTime);
+	dayjs.extend(localizedFormat);
 
 	import { toast } from 'svelte-sonner';
 
@@ -364,7 +366,7 @@
 					</td>
 
 					<td class=" px-3 py-1">
-						{dayjs(user.created_at * 1000).format($i18n.t('MMMM DD, YYYY'))}
+						{dayjs(user.created_at * 1000).format('LL')}
 					</td>
 
 					<td class=" px-3 py-1"> {user.oauth_sub ?? ''} </td>

+ 3 - 1
src/lib/components/admin/Users/UserList/EditUserModal.svelte

@@ -7,9 +7,11 @@
 	import { updateUserById } from '$lib/apis/users';
 
 	import Modal from '$lib/components/common/Modal.svelte';
+	import localizedFormat from 'dayjs/plugin/localizedFormat';
 
 	const i18n = getContext('i18n');
 	const dispatch = createEventDispatcher();
+	dayjs.extend(localizedFormat);
 
 	export let show = false;
 	export let selectedUser;
@@ -87,7 +89,7 @@
 
 							<div class="text-xs text-gray-500">
 								{$i18n.t('Created at')}
-								{dayjs(selectedUser.created_at * 1000).format($i18n.t('MMMM DD, YYYY'))}
+								{dayjs(selectedUser.created_at * 1000).format('LL')}
 							</div>
 						</div>
 					</div>

+ 3 - 1
src/lib/components/admin/Users/UserList/UserChatsModal.svelte

@@ -2,8 +2,10 @@
 	import { toast } from 'svelte-sonner';
 	import dayjs from 'dayjs';
 	import { getContext, createEventDispatcher } from 'svelte';
+	import localizedFormat from 'dayjs/plugin/localizedFormat';
 
 	const dispatch = createEventDispatcher();
+	dayjs.extend(localizedFormat);
 
 	import { getChatListByUserId, deleteChatById, getArchivedChatList } from '$lib/apis/chats';
 
@@ -130,7 +132,7 @@
 
 											<td class=" px-3 py-1 hidden md:flex h-[2.5rem] justify-end">
 												<div class="my-auto shrink-0">
-													{dayjs(chat.updated_at * 1000).format($i18n.t('MMMM DD, YYYY HH:mm'))}
+													{dayjs(chat.updated_at * 1000).format('LLL')}
 												</div>
 											</td>
 

+ 1 - 1
src/lib/components/channel/MessageInput.svelte

@@ -200,7 +200,7 @@
 				files = files.filter((item) => item?.itemId !== tempItemId);
 			}
 		} catch (e) {
-			toast.error(e);
+			toast.error(`${e}`);
 			files = files.filter((item) => item?.itemId !== tempItemId);
 		}
 	};

+ 5 - 7
src/lib/components/channel/Messages/Message.svelte

@@ -3,10 +3,12 @@
 	import relativeTime from 'dayjs/plugin/relativeTime';
 	import isToday from 'dayjs/plugin/isToday';
 	import isYesterday from 'dayjs/plugin/isYesterday';
+	import localizedFormat from 'dayjs/plugin/localizedFormat';
 
 	dayjs.extend(relativeTime);
 	dayjs.extend(isToday);
 	dayjs.extend(isYesterday);
+	dayjs.extend(localizedFormat);
 
 	import { getContext, onMount } from 'svelte';
 	const i18n = getContext<Writable<i18nType>>('i18n');
@@ -153,10 +155,8 @@
 						<div
 							class="mt-1.5 flex flex-shrink-0 items-center text-xs self-center invisible group-hover:visible text-gray-500 font-medium first-letter:capitalize"
 						>
-							<Tooltip
-								content={dayjs(message.created_at / 1000000).format('dddd, DD MMMM YYYY HH:mm')}
-							>
-								{dayjs(message.created_at / 1000000).format('HH:mm')}
+							<Tooltip content={dayjs(message.created_at / 1000000).format('LLLL')}>
+								{dayjs(message.created_at / 1000000).format('LT')}
 							</Tooltip>
 						</div>
 					{/if}
@@ -174,9 +174,7 @@
 							<div
 								class=" self-center text-xs invisible group-hover:visible text-gray-400 font-medium first-letter:capitalize ml-0.5 translate-y-[1px]"
 							>
-								<Tooltip
-									content={dayjs(message.created_at / 1000000).format('dddd, DD MMMM YYYY HH:mm')}
-								>
+								<Tooltip content={dayjs(message.created_at / 1000000).format('LLLL')}>
 									<span class="line-clamp-1">{formatDate(message.created_at / 1000000)}</span>
 								</Tooltip>
 							</div>

+ 26 - 7
src/lib/components/chat/Chat.svelte

@@ -45,7 +45,8 @@
 		promptTemplate,
 		splitStream,
 		sleep,
-		removeDetailsWithReasoning
+		removeDetailsWithReasoning,
+		getPromptVariables
 	} from '$lib/utils';
 
 	import { generateChatCompletion } from '$lib/apis/ollama';
@@ -82,10 +83,12 @@
 	import EventConfirmDialog from '../common/ConfirmDialog.svelte';
 	import Placeholder from './Placeholder.svelte';
 	import NotificationToast from '../NotificationToast.svelte';
+	import Spinner from '../common/Spinner.svelte';
 
 	export let chatIdProp = '';
 
-	let loaded = false;
+	let loading = false;
+
 	const eventTarget = new EventTarget();
 	let controlPane;
 	let controlPaneComponent;
@@ -113,6 +116,7 @@
 
 	let selectedToolIds = [];
 	let imageGenerationEnabled = false;
+	let codeInterpreterEnabled = false;
 	let webSearchEnabled = false;
 
 	let chat = null;
@@ -133,6 +137,7 @@
 
 	$: if (chatIdProp) {
 		(async () => {
+			loading = true;
 			console.log(chatIdProp);
 
 			prompt = '';
@@ -141,11 +146,9 @@
 			webSearchEnabled = false;
 			imageGenerationEnabled = false;
 
-			loaded = false;
-
 			if (chatIdProp && (await loadChat())) {
 				await tick();
-				loaded = true;
+				loading = false;
 
 				if (localStorage.getItem(`chat-input-${chatIdProp}`)) {
 					try {
@@ -627,7 +630,7 @@
 		} catch (e) {
 			// Remove the failed doc from the files array
 			files = files.filter((f) => f.name !== url);
-			toast.error(e);
+			toast.error(`${e}`);
 		}
 	};
 
@@ -1557,10 +1560,18 @@
 
 				files: (files?.length ?? 0) > 0 ? files : undefined,
 				tool_ids: selectedToolIds.length > 0 ? selectedToolIds : undefined,
+
 				features: {
 					image_generation: imageGenerationEnabled,
+					code_interpreter: codeInterpreterEnabled,
 					web_search: webSearchEnabled
 				},
+				variables: {
+					...getPromptVariables(
+						$user.name,
+						$settings?.userLocation ? await getAndUpdateUserLocation(localStorage.token) : undefined
+					)
+				},
 
 				session_id: $socket?.id,
 				chat_id: $chatId,
@@ -1861,7 +1872,7 @@
 		: ' '} w-full max-w-full flex flex-col"
 	id="chat-container"
 >
-	{#if !chatIdProp || (loaded && chatIdProp)}
+	{#if chatIdProp === '' || (!loading && chatIdProp)}
 		{#if $settings?.backgroundImageUrl ?? null}
 			<div
 				class="absolute {$showSidebar
@@ -1962,6 +1973,7 @@
 								bind:autoScroll
 								bind:selectedToolIds
 								bind:imageGenerationEnabled
+								bind:codeInterpreterEnabled
 								bind:webSearchEnabled
 								bind:atSelectedModel
 								transparentBackground={$settings?.backgroundImageUrl ?? false}
@@ -2013,6 +2025,7 @@
 								bind:autoScroll
 								bind:selectedToolIds
 								bind:imageGenerationEnabled
+								bind:codeInterpreterEnabled
 								bind:webSearchEnabled
 								bind:atSelectedModel
 								transparentBackground={$settings?.backgroundImageUrl ?? false}
@@ -2065,5 +2078,11 @@
 				{eventTarget}
 			/>
 		</PaneGroup>
+	{:else if loading}
+		<div class=" flex items-center justify-center h-full w-full">
+			<div class="m-auto">
+				<Spinner />
+			</div>
+		</div>
 	{/if}
 </div>

+ 24 - 6
src/lib/components/chat/MessageInput.svelte

@@ -65,6 +65,7 @@
 
 	export let imageGenerationEnabled = false;
 	export let webSearchEnabled = false;
+	export let codeInterpreterEnabled = false;
 
 	$: onChange({
 		prompt,
@@ -211,7 +212,7 @@
 				files = files.filter((item) => item?.itemId !== tempItemId);
 			}
 		} catch (e) {
-			toast.error(e);
+			toast.error(`${e}`);
 			files = files.filter((item) => item?.itemId !== tempItemId);
 		}
 	};
@@ -385,7 +386,7 @@
 				</div>
 
 				<div class="w-full relative">
-					{#if atSelectedModel !== undefined || selectedToolIds.length > 0 || webSearchEnabled || imageGenerationEnabled}
+					{#if atSelectedModel !== undefined || selectedToolIds.length > 0 || webSearchEnabled || imageGenerationEnabled || codeInterpreterEnabled}
 						<div
 							class="px-3 pb-0.5 pt-1.5 text-left w-full flex flex-col absolute bottom-0 left-0 right-0 bg-gradient-to-t from-white dark:from-gray-900 z-10"
 						>
@@ -427,12 +428,28 @@
 										<div class="pl-1">
 											<span class="relative flex size-2">
 												<span
-													class="animate-ping absolute inline-flex h-full w-full rounded-full bg-green-400 opacity-75"
+													class="animate-ping absolute inline-flex h-full w-full rounded-full bg-teal-400 opacity-75"
 												/>
-												<span class="relative inline-flex rounded-full size-2 bg-green-500" />
+												<span class="relative inline-flex rounded-full size-2 bg-teal-500" />
+											</span>
+										</div>
+										<div class=" translate-y-[0.5px]">{$i18n.t('Image generation')}</div>
+									</div>
+								</div>
+							{/if}
+
+							{#if codeInterpreterEnabled}
+								<div class="flex items-center justify-between w-full">
+									<div class="flex items-center gap-2.5 text-sm dark:text-gray-500">
+										<div class="pl-1">
+											<span class="relative flex size-2">
+												<span
+													class="animate-ping absolute inline-flex h-full w-full rounded-full bg-blue-400 opacity-75"
+												/>
+												<span class="relative inline-flex rounded-full size-2 bg-blue-500" />
 											</span>
 										</div>
-										<div class=" ">{$i18n.t('Image generation')}</div>
+										<div class=" translate-y-[0.5px]">{$i18n.t('Code interpreter')}</div>
 									</div>
 								</div>
 							{/if}
@@ -448,7 +465,7 @@
 												<span class="relative inline-flex rounded-full size-2 bg-green-500" />
 											</span>
 										</div>
-										<div class=" ">{$i18n.t('Search the web')}</div>
+										<div class=" translate-y-[0.5px]">{$i18n.t('Search the web')}</div>
 									</div>
 								</div>
 							{/if}
@@ -660,6 +677,7 @@
 									<div class="ml-1 self-end mb-1.5 flex space-x-1">
 										<InputMenu
 											bind:imageGenerationEnabled
+											bind:codeInterpreterEnabled
 											bind:webSearchEnabled
 											bind:selectedToolIds
 											{screenCaptureHandler}

+ 52 - 15
src/lib/components/chat/MessageInput/InputMenu.svelte

@@ -15,6 +15,7 @@
 	import WrenchSolid from '$lib/components/icons/WrenchSolid.svelte';
 	import CameraSolid from '$lib/components/icons/CameraSolid.svelte';
 	import PhotoSolid from '$lib/components/icons/PhotoSolid.svelte';
+	import CommandLineSolid from '$lib/components/icons/CommandLineSolid.svelte';
 
 	const i18n = getContext('i18n');
 
@@ -26,6 +27,7 @@
 
 	export let webSearchEnabled: boolean;
 	export let imageGenerationEnabled: boolean;
+	export let codeInterpreterEnabled: boolean;
 
 	export let onClose: Function;
 
@@ -48,6 +50,9 @@
 		init();
 	}
 
+	let fileUploadEnabled = true;
+	$: fileUploadEnabled = $user.role === 'admin' || $user?.permissions?.chat?.file_upload;
+
 	const init = async () => {
 		if ($_tools === null) {
 			await _tools.set(await getTools(localStorage.token));
@@ -145,6 +150,20 @@
 				</button>
 			{/if}
 
+			<button
+				class="flex w-full justify-between gap-2 items-center px-3 py-2 text-sm font-medium cursor-pointer rounded-xl"
+				on:click={() => {
+					codeInterpreterEnabled = !codeInterpreterEnabled;
+				}}
+			>
+				<div class="flex-1 flex items-center gap-2">
+					<CommandLineSolid />
+					<div class=" line-clamp-1">{$i18n.t('Code Intepreter')}</div>
+				</div>
+
+				<Switch state={codeInterpreterEnabled} />
+			</button>
+
 			{#if showWebSearch}
 				<button
 					class="flex w-full justify-between gap-2 items-center px-3 py-2 text-sm font-medium cursor-pointer rounded-xl"
@@ -166,26 +185,44 @@
 			{/if}
 
 			{#if !$mobile}
+				<Tooltip
+					content={!fileUploadEnabled ? $i18n.t('You do not have permission to upload files') : ''}
+					className="w-full"
+				>
+					<DropdownMenu.Item
+						class="flex gap-2 items-center px-3 py-2 text-sm  font-medium cursor-pointer hover:bg-gray-50 dark:hover:bg-gray-800  rounded-xl {!fileUploadEnabled
+							? 'opacity-50'
+							: ''}"
+						on:click={() => {
+							if (fileUploadEnabled) {
+								screenCaptureHandler();
+							}
+						}}
+					>
+						<CameraSolid />
+						<div class=" line-clamp-1">{$i18n.t('Capture')}</div>
+					</DropdownMenu.Item>
+				</Tooltip>
+			{/if}
+
+			<Tooltip
+				content={!fileUploadEnabled ? $i18n.t('You do not have permission to upload files') : ''}
+				className="w-full"
+			>
 				<DropdownMenu.Item
-					class="flex gap-2 items-center px-3 py-2 text-sm  font-medium cursor-pointer hover:bg-gray-50 dark:hover:bg-gray-800  rounded-xl"
+					class="flex gap-2 items-center px-3 py-2 text-sm font-medium cursor-pointer hover:bg-gray-50 dark:hover:bg-gray-800 rounded-xl {!fileUploadEnabled
+						? 'opacity-50'
+						: ''}"
 					on:click={() => {
-						screenCaptureHandler();
+						if (fileUploadEnabled) {
+							uploadFilesHandler();
+						}
 					}}
 				>
-					<CameraSolid />
-					<div class=" line-clamp-1">{$i18n.t('Capture')}</div>
+					<DocumentArrowUpSolid />
+					<div class="line-clamp-1">{$i18n.t('Upload Files')}</div>
 				</DropdownMenu.Item>
-			{/if}
-
-			<DropdownMenu.Item
-				class="flex gap-2 items-center px-3 py-2 text-sm font-medium cursor-pointer hover:bg-gray-50 dark:hover:bg-gray-800 rounded-xl"
-				on:click={() => {
-					uploadFilesHandler();
-				}}
-			>
-				<DocumentArrowUpSolid />
-				<div class="line-clamp-1">{$i18n.t('Upload Files')}</div>
-			</DropdownMenu.Item>
+			</Tooltip>
 
 			{#if $config?.features?.enable_google_drive_integration}
 				<DropdownMenu.Item

+ 52 - 9
src/lib/components/chat/Messages/CodeBlock.svelte

@@ -25,6 +25,7 @@
 	export let token;
 	export let lang = '';
 	export let code = '';
+	export let attributes = {};
 
 	export let className = 'my-2';
 	export let editorClassName = '';
@@ -279,6 +280,36 @@ __builtins__.input = input`);
 
 	$: dispatch('code', { lang, code });
 
+	$: if (attributes) {
+		onAttributesUpdate();
+	}
+
+	const onAttributesUpdate = () => {
+		if (attributes?.output) {
+			// Create a helper function to unescape HTML entities
+			const unescapeHtml = (html) => {
+				const textArea = document.createElement('textarea');
+				textArea.innerHTML = html;
+				return textArea.value;
+			};
+
+			try {
+				// Unescape the HTML-encoded string
+				const unescapedOutput = unescapeHtml(attributes.output);
+
+				// Parse the unescaped string into JSON
+				const output = JSON.parse(unescapedOutput);
+
+				// Assign the parsed values to variables
+				stdout = output.stdout;
+				stderr = output.stderr;
+				result = output.result;
+			} catch (error) {
+				console.error('Error:', error);
+			}
+		}
+	};
+
 	onMount(async () => {
 		console.log('codeblock', lang, code);
 
@@ -379,15 +410,27 @@ __builtins__.input = input`);
 				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>
+			{#if executing || stdout || stderr || result}
+				<div class="bg-[#202123] text-white !rounded-b-lg py-4 px-4 flex flex-col gap-2">
+					{#if executing}
+						<div class=" ">
+							<div class=" text-gray-500 text-xs mb-1">STDOUT/STDERR</div>
+							<div class="text-sm">Running...</div>
+						</div>
+					{:else}
+						{#if stdout || stderr}
+							<div class=" ">
+								<div class=" text-gray-500 text-xs mb-1">STDOUT/STDERR</div>
+								<div class="text-sm">{stdout || stderr}</div>
+							</div>
+						{/if}
+						{#if result}
+							<div class=" ">
+								<div class=" text-gray-500 text-xs mb-1">RESULT</div>
+								<div class="text-sm">{`${JSON.stringify(result)}`}</div>
+							</div>
+						{/if}
+					{/if}
 				</div>
 			{/if}
 		{/if}

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

@@ -23,6 +23,7 @@
 	export let id: string;
 	export let tokens: Token[];
 	export let top = true;
+	export let attributes = {};
 
 	export let save = false;
 	export let onSourceClick: Function = () => {};
@@ -83,6 +84,7 @@
 				{token}
 				lang={token?.lang ?? ''}
 				code={token?.text ?? ''}
+				{attributes}
 				{save}
 				on:code={(e) => {
 					dispatch('code', e.detail);
@@ -195,9 +197,13 @@
 			</ul>
 		{/if}
 	{:else if token.type === 'details'}
-		<Collapsible title={token.summary} attributes={token?.attributes} className="w-fit space-y-1">
+		<Collapsible title={token.summary} attributes={token?.attributes} className="w-full space-y-1">
 			<div class=" mb-1.5" slot="content">
-				<svelte:self id={`${id}-${tokenIdx}-d`} tokens={marked.lexer(token.text)} />
+				<svelte:self
+					id={`${id}-${tokenIdx}-d`}
+					tokens={marked.lexer(token.text)}
+					attributes={token?.attributes}
+				/>
 			</div>
 		</Collapsible>
 	{:else if token.type === 'html'}

+ 1 - 0
src/lib/components/chat/Messages/Message.svelte

@@ -78,6 +78,7 @@
 				{rateMessage}
 				{actionMessage}
 				{submitMessage}
+				{deleteMessage}
 				{continueResponse}
 				{regenerateResponse}
 				{addMessages}

+ 3 - 1
src/lib/components/chat/Messages/MultiResponseMessages.svelte

@@ -16,7 +16,9 @@
 	import Markdown from './Markdown.svelte';
 	import Name from './Name.svelte';
 	import Skeleton from './Skeleton.svelte';
+	import localizedFormat from 'dayjs/plugin/localizedFormat';
 	const i18n = getContext('i18n');
+	dayjs.extend(localizedFormat);
 
 	export let chatId;
 	export let history;
@@ -264,7 +266,7 @@
 										<span
 											class=" self-center invisible group-hover:visible text-gray-400 text-xs font-medium uppercase ml-0.5 -mt-0.5"
 										>
-											{dayjs(message.timestamp * 1000).format($i18n.t('h:mm a'))}
+											{dayjs(message.timestamp * 1000).format('LT')}
 										</span>
 									{/if}
 								</Name>

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

@@ -114,6 +114,7 @@
 	export let saveMessage: Function;
 	export let rateMessage: Function;
 	export let actionMessage: Function;
+	export let deleteMessage: Function;
 
 	export let submitMessage: Function;
 	export let continueResponse: Function;
@@ -461,6 +462,10 @@
 		feedbackLoading = false;
 	};
 
+	const deleteMessageHandler = async () => {
+		deleteMessage(message.id);
+	};
+
 	$: if (!edit) {
 		(async () => {
 			await tick();
@@ -500,7 +505,7 @@
 					<div
 						class=" self-center text-xs invisible group-hover:visible text-gray-400 font-medium first-letter:capitalize ml-0.5 translate-y-[1px]"
 					>
-						<Tooltip content={dayjs(message.timestamp * 1000).format('dddd, DD MMMM YYYY HH:mm')}>
+						<Tooltip content={dayjs(message.timestamp * 1000).format('LLLL')}>
 							<span class="line-clamp-1">{formatDate(message.timestamp * 1000)}</span>
 						</Tooltip>
 					</div>
@@ -1176,6 +1181,36 @@
 										</button>
 									</Tooltip>
 
+									{#if siblings.length > 1}
+										<Tooltip content={$i18n.t('Delete')} placement="bottom">
+											<button
+												type="button"
+												id="continue-response-button"
+												class="{isLastMessage
+													? 'visible'
+													: 'invisible group-hover:visible'} p-1.5 hover:bg-black/5 dark:hover:bg-white/5 rounded-lg dark:hover:text-white hover:text-black transition regenerate-response-button"
+												on:click={() => {
+													deleteMessageHandler();
+												}}
+											>
+												<svg
+													xmlns="http://www.w3.org/2000/svg"
+													fill="none"
+													viewBox="0 0 24 24"
+													stroke-width="2"
+													stroke="currentColor"
+													class="w-4 h-4"
+												>
+													<path
+														stroke-linecap="round"
+														stroke-linejoin="round"
+														d="m14.74 9-.346 9m-4.788 0L9.26 9m9.968-3.21c.342.052.682.107 1.022.166m-1.022-.165L18.16 19.673a2.25 2.25 0 0 1-2.244 2.077H8.084a2.25 2.25 0 0 1-2.244-2.077L4.772 5.79m14.456 0a48.108 48.108 0 0 0-3.478-.397m-12 .562c.34-.059.68-.114 1.022-.165m0 0a48.11 48.11 0 0 1 3.478-.397m7.5 0v-.916c0-1.18-.91-2.164-2.09-2.201a51.964 51.964 0 0 0-3.32 0c-1.18.037-2.09 1.022-2.09 2.201v.916m7.5 0a48.667 48.667 0 0 0-7.5 0"
+													/>
+												</svg>
+											</button>
+										</Tooltip>
+									{/if}
+
 									{#if isLastMessage}
 										{#each model?.actions ?? [] as action}
 											<Tooltip content={action.name} placement="bottom">

+ 3 - 1
src/lib/components/chat/Messages/UserMessage.svelte

@@ -13,8 +13,10 @@
 	import FileItem from '$lib/components/common/FileItem.svelte';
 	import Markdown from './Markdown.svelte';
 	import Image from '$lib/components/common/Image.svelte';
+	import localizedFormat from 'dayjs/plugin/localizedFormat';
 
 	const i18n = getContext('i18n');
+	dayjs.extend(localizedFormat);
 
 	export let user;
 
@@ -112,7 +114,7 @@
 						<div
 							class=" self-center text-xs invisible group-hover:visible text-gray-400 font-medium first-letter:capitalize ml-0.5 translate-y-[1px]"
 						>
-							<Tooltip content={dayjs(message.timestamp * 1000).format('dddd, DD MMMM YYYY HH:mm')}>
+							<Tooltip content={dayjs(message.timestamp * 1000).format('LLLL')}>
 								<span class="line-clamp-1">{formatDate(message.timestamp * 1000)}</span>
 							</Tooltip>
 						</div>

+ 2 - 0
src/lib/components/chat/Placeholder.svelte

@@ -35,6 +35,7 @@
 
 	export let selectedToolIds = [];
 	export let imageGenerationEnabled = false;
+	export let codeInterpreterEnabled = false;
 	export let webSearchEnabled = false;
 
 	let models = [];
@@ -196,6 +197,7 @@
 					bind:autoScroll
 					bind:selectedToolIds
 					bind:imageGenerationEnabled
+					bind:codeInterpreterEnabled
 					bind:webSearchEnabled
 					bind:atSelectedModel
 					{transparentBackground}

+ 1 - 1
src/lib/components/chat/Settings/Audio.svelte

@@ -39,7 +39,7 @@
 			}, 100);
 		} else {
 			const res = await _getVoices(localStorage.token).catch((e) => {
-				toast.error(e);
+				toast.error(`${e}`);
 			});
 
 			if (res) {

+ 3 - 3
src/lib/components/chat/Settings/Personalization/ManageModal.svelte

@@ -11,8 +11,10 @@
 	import Tooltip from '$lib/components/common/Tooltip.svelte';
 	import { error } from '@sveltejs/kit';
 	import EditMemoryModal from './EditMemoryModal.svelte';
+	import localizedFormat from 'dayjs/plugin/localizedFormat';
 
 	const i18n = getContext('i18n');
+	dayjs.extend(localizedFormat);
 
 	export let show = false;
 
@@ -84,9 +86,7 @@
 											</td>
 											<td class=" px-3 py-1 hidden md:flex h-[2.5rem]">
 												<div class="my-auto whitespace-nowrap">
-													{dayjs(memory.updated_at * 1000).format(
-														$i18n.t('MMMM DD, YYYY hh:mm:ss A')
-													)}
+													{dayjs(memory.updated_at * 1000).format('LLL')}
 												</div>
 											</td>
 											<td class="px-3 py-1">

+ 6 - 0
src/lib/components/common/Collapsible.svelte

@@ -80,6 +80,12 @@
 						{:else}
 							{$i18n.t('Thinking...')}
 						{/if}
+					{:else if attributes?.type === 'code_interpreter'}
+						{#if attributes?.done === 'true'}
+							{$i18n.t('Analyzed')}
+						{:else}
+							{$i18n.t('Analyzing...')}
+						{/if}
 					{:else}
 						{title}
 					{/if}

+ 32 - 51
src/lib/components/common/Textarea.svelte

@@ -3,68 +3,49 @@
 
 	export let value = '';
 	export let placeholder = '';
+	export let rows = 1;
+	export let required = false;
 	export let className =
-		'w-full rounded-lg px-3 py-2 text-sm bg-gray-50 dark:text-gray-300 dark:bg-gray-850 outline-none resize-none h-full';
-
-	export let onKeydown: Function = () => {};
+		'w-full rounded-lg px-3 py-2 text-sm bg-gray-50 dark:text-gray-300 dark:bg-gray-850 outline-none  h-full';
 
 	let textareaElement;
 
-	$: if (textareaElement) {
-		if (textareaElement.innerText !== value && value !== '') {
-			textareaElement.innerText = value ?? '';
-		}
-	}
-
 	// Adjust height on mount and after setting the element.
 	onMount(async () => {
 		await tick();
+		resize();
+
+		requestAnimationFrame(() => {
+			// setInterveal to cehck until textareaElement is set
+			const interval = setInterval(() => {
+				if (textareaElement) {
+					clearInterval(interval);
+					resize();
+				}
+			}, 100);
+		});
 	});
 
-	// Handle paste event to ensure only plaintext is pasted
-	function handlePaste(event: ClipboardEvent) {
-		event.preventDefault(); // Prevent the default paste action
-		const clipboardData = event.clipboardData?.getData('text/plain'); // Get plaintext from clipboard
-
-		// Insert plaintext into the textarea
-		document.execCommand('insertText', false, clipboardData);
-	}
+	const resize = () => {
+		if (textareaElement) {
+			textareaElement.style.height = '';
+			textareaElement.style.height = `${textareaElement.scrollHeight}px`;
+		}
+	};
 </script>
 
-<div
-	contenteditable="true"
+<textarea
 	bind:this={textareaElement}
-	class="{className} whitespace-pre-wrap relative {value
-		? !value.trim()
-			? 'placeholder'
-			: ''
-		: 'placeholder'}"
-	style="field-sizing: content; -moz-user-select: text !important;"
-	on:input={() => {
-		const text = textareaElement.innerText;
-		if (text === '\n') {
-			value = '';
-			return;
-		}
-
-		value = text;
+	bind:value
+	{placeholder}
+	class={className}
+	style="field-sizing: content;"
+	{rows}
+	{required}
+	on:input={(e) => {
+		resize();
+	}}
+	on:focus={() => {
+		resize();
 	}}
-	on:paste={handlePaste}
-	on:keydown={onKeydown}
-	data-placeholder={placeholder}
 />
-
-<style>
-	.placeholder::before {
-		/* absolute */
-		position: absolute;
-		content: attr(data-placeholder);
-		color: #adb5bd;
-		overflow: hidden;
-		display: -webkit-box;
-		-webkit-box-orient: vertical;
-		-webkit-line-clamp: 1;
-		pointer-events: none;
-		touch-action: none;
-	}
-</style>

+ 11 - 0
src/lib/components/icons/CommandLineSolid.svelte

@@ -0,0 +1,11 @@
+<script lang="ts">
+	export let className = 'size-4';
+</script>
+
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor" class={className}>
+	<path
+		fill-rule="evenodd"
+		d="M2.25 6a3 3 0 0 1 3-3h13.5a3 3 0 0 1 3 3v12a3 3 0 0 1-3 3H5.25a3 3 0 0 1-3-3V6Zm3.97.97a.75.75 0 0 1 1.06 0l2.25 2.25a.75.75 0 0 1 0 1.06l-2.25 2.25a.75.75 0 0 1-1.06-1.06l1.72-1.72-1.72-1.72a.75.75 0 0 1 0-1.06Zm4.28 4.28a.75.75 0 0 0 0 1.5h3a.75.75 0 0 0 0-1.5h-3Z"
+		clip-rule="evenodd"
+	/>
+</svg>

+ 4 - 1
src/lib/components/layout/Sidebar/ArchivedChatsModal.svelte

@@ -4,6 +4,9 @@
 	import { toast } from 'svelte-sonner';
 	import dayjs from 'dayjs';
 	import { getContext, createEventDispatcher } from 'svelte';
+	import localizedFormat from 'dayjs/plugin/localizedFormat';
+
+	dayjs.extend(localizedFormat);
 
 	const dispatch = createEventDispatcher();
 
@@ -159,7 +162,7 @@
 
 												<td class=" px-3 py-1 hidden md:flex h-[2.5rem]">
 													<div class="my-auto">
-														{dayjs(chat.created_at * 1000).format($i18n.t('MMMM DD, YYYY HH:mm'))}
+														{dayjs(chat.created_at * 1000).format('LLL')}
 													</div>
 												</td>
 

+ 7 - 1
src/lib/components/layout/Sidebar/ChatItem.svelte

@@ -87,7 +87,13 @@
 	};
 
 	const cloneChatHandler = async (id) => {
-		const res = await cloneChatById(localStorage.token, id).catch((error) => {
+		const res = await cloneChatById(
+			localStorage.token,
+			id,
+			$i18n.t('Clone of {{TITLE}}', {
+				TITLE: title
+			})
+		).catch((error) => {
 			toast.error(`${error}`);
 			return null;
 		});

+ 26 - 1
src/lib/components/playground/Chat.svelte

@@ -33,6 +33,7 @@
 	let loading = false;
 	let stopResponseFlag = false;
 
+	let systemTextareaElement: HTMLTextAreaElement;
 	let messagesContainerElement: HTMLDivElement;
 
 	let showSystem = false;
@@ -58,8 +59,29 @@
 		console.log('stopResponse');
 	};
 
+	const resizeSystemTextarea = async () => {
+		await tick();
+		if (systemTextareaElement) {
+			systemTextareaElement.style.height = '';
+			systemTextareaElement.style.height = Math.min(systemTextareaElement.scrollHeight, 555) + 'px';
+		}
+	};
+
+	$: if (showSystem) {
+		resizeSystemTextarea();
+	}
+
 	const chatCompletionHandler = async () => {
+		if (selectedModelId === '') {
+			toast.error($i18n.t('Please select a model.'));
+			return;
+		}
+
 		const model = $models.find((model) => model.id === selectedModelId);
+		if (!model) {
+			selectedModelId = '';
+			return;
+		}
 
 		const [res, controller] = await chatCompletion(
 			localStorage.token,
@@ -258,10 +280,13 @@
 					<div slot="content">
 						<div class="pt-1 px-1.5">
 							<textarea
-								id="system-textarea"
+								bind:this={systemTextareaElement}
 								class="w-full h-full bg-transparent resize-none outline-none text-sm"
 								bind:value={system}
 								placeholder={$i18n.t("You're a helpful assistant.")}
+								on:input={() => {
+									resizeSystemTextarea();
+								}}
 								rows="4"
 							/>
 						</div>

+ 76 - 0
src/lib/components/playground/Chat/Message.svelte

@@ -0,0 +1,76 @@
+<script lang="ts">
+	import { onMount, getContext } from 'svelte';
+
+	const i18n = getContext('i18n');
+
+	export let message;
+	export let idx;
+
+	export let onDelete;
+
+	let textAreaElement: HTMLTextAreaElement;
+
+	onMount(() => {
+		textAreaElement.style.height = '';
+		textAreaElement.style.height = textAreaElement.scrollHeight + 'px';
+	});
+</script>
+
+<div class="flex gap-2 group">
+	<div class="flex items-start pt-1">
+		<div
+			class="px-2 py-1 text-sm font-semibold uppercase min-w-[6rem] text-left rounded-lg transition"
+		>
+			{$i18n.t(message.role)}
+		</div>
+	</div>
+
+	<div class="flex-1">
+		<!-- $i18n.t('a user') -->
+		<!-- $i18n.t('an assistant') -->
+		<textarea
+			id="{message.role}-{idx}-textarea"
+			bind:this={textAreaElement}
+			class="w-full bg-transparent outline-none rounded-lg p-2 text-sm resize-none overflow-hidden"
+			placeholder={$i18n.t(`Enter {{role}} message here`, {
+				role: message.role === 'user' ? $i18n.t('a user') : $i18n.t('an assistant')
+			})}
+			rows="1"
+			on:input={(e) => {
+				textAreaElement.style.height = '';
+				textAreaElement.style.height = textAreaElement.scrollHeight + 'px';
+			}}
+			on:focus={(e) => {
+				textAreaElement.style.height = '';
+				textAreaElement.style.height = textAreaElement.scrollHeight + 'px';
+
+				// e.target.style.height = Math.min(e.target.scrollHeight, 200) + 'px';
+			}}
+			bind:value={message.content}
+		/>
+	</div>
+
+	<div class=" pt-1">
+		<button
+			class=" group-hover:text-gray-500 dark:text-gray-900 dark:hover:text-gray-300 transition"
+			on:click={() => {
+				onDelete();
+			}}
+		>
+			<svg
+				xmlns="http://www.w3.org/2000/svg"
+				fill="none"
+				viewBox="0 0 24 24"
+				stroke-width="2"
+				stroke="currentColor"
+				class="w-5 h-5"
+			>
+				<path
+					stroke-linecap="round"
+					stroke-linejoin="round"
+					d="M15 12H9m12 0a9 9 0 1 1-18 0 9 9 0 0 1 18 0Z"
+				/>
+			</svg>
+		</button>
+	</div>
+</div>

+ 8 - 65
src/lib/components/playground/Chat/Messages.svelte

@@ -1,77 +1,20 @@
 <script lang="ts">
 	import { onMount, getContext } from 'svelte';
+	import Message from './Message.svelte';
 
 	const i18n = getContext('i18n');
 
 	export let messages = [];
-	let textAreaElement: HTMLTextAreaElement;
-	onMount(() => {
-		messages.forEach((message, idx) => {
-			textAreaElement.style.height = '';
-			textAreaElement.style.height = textAreaElement.scrollHeight + 'px';
-		});
-	});
 </script>
 
 <div class="py-3 space-y-3">
 	{#each messages as message, idx}
-		<div class="flex gap-2 group">
-			<div class="flex items-start pt-1">
-				<div
-					class="px-2 py-1 text-sm font-semibold uppercase min-w-[6rem] text-left rounded-lg transition"
-				>
-					{$i18n.t(message.role)}
-				</div>
-			</div>
-
-			<div class="flex-1">
-				<!-- $i18n.t('a user') -->
-				<!-- $i18n.t('an assistant') -->
-				<textarea
-					id="{message.role}-{idx}-textarea"
-					bind:this={textAreaElement}
-					class="w-full bg-transparent outline-none rounded-lg p-2 text-sm resize-none overflow-hidden"
-					placeholder={$i18n.t(`Enter {{role}} message here`, {
-						role: message.role === 'user' ? $i18n.t('a user') : $i18n.t('an assistant')
-					})}
-					rows="1"
-					on:input={(e) => {
-						textAreaElement.style.height = '';
-						textAreaElement.style.height = textAreaElement.scrollHeight + 'px';
-					}}
-					on:focus={(e) => {
-						textAreaElement.style.height = '';
-						textAreaElement.style.height = textAreaElement.scrollHeight + 'px';
-
-						// e.target.style.height = Math.min(e.target.scrollHeight, 200) + 'px';
-					}}
-					bind:value={message.content}
-				/>
-			</div>
-
-			<div class=" pt-1">
-				<button
-					class=" group-hover:text-gray-500 dark:text-gray-900 dark:hover:text-gray-300 transition"
-					on:click={() => {
-						messages = messages.filter((message, messageIdx) => messageIdx !== idx);
-					}}
-				>
-					<svg
-						xmlns="http://www.w3.org/2000/svg"
-						fill="none"
-						viewBox="0 0 24 24"
-						stroke-width="2"
-						stroke="currentColor"
-						class="w-5 h-5"
-					>
-						<path
-							stroke-linecap="round"
-							stroke-linejoin="round"
-							d="M15 12H9m12 0a9 9 0 1 1-18 0 9 9 0 0 1 18 0Z"
-						/>
-					</svg>
-				</button>
-			</div>
-		</div>
+		<Message
+			{message}
+			{idx}
+			onDelete={() => {
+				messages = messages.filter((message, messageIdx) => messageIdx !== idx);
+			}}
+		/>
 	{/each}
 </div>

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

@@ -54,7 +54,7 @@
 
 	const deleteHandler = async (item) => {
 		const res = await deleteKnowledgeById(localStorage.token, item.id).catch((e) => {
-			toast.error(e);
+			toast.error(`${e}`);
 		});
 
 		if (res) {

+ 2 - 2
src/lib/components/workspace/Knowledge/CreateKnowledgeBase.svelte

@@ -31,7 +31,7 @@
 			description,
 			accessControl
 		).catch((e) => {
-			toast.error(e);
+			toast.error(`${e}`);
 		});
 
 		if (res) {
@@ -112,7 +112,7 @@
 
 		<div class="mt-2">
 			<div class="px-3 py-2 bg-gray-50 dark:bg-gray-950 rounded-lg">
-				<AccessControl bind:accessControl />
+				<AccessControl bind:accessControl accessRoles={['read', 'write']} />
 			</div>
 		</div>
 

+ 9 - 9
src/lib/components/workspace/Knowledge/KnowledgeBase.svelte

@@ -149,7 +149,7 @@
 
 		try {
 			const uploadedFile = await uploadFile(localStorage.token, file).catch((e) => {
-				toast.error(e);
+				toast.error(`${e}`);
 				return null;
 			});
 
@@ -169,7 +169,7 @@
 				toast.error($i18n.t('Failed to upload file.'));
 			}
 		} catch (e) {
-			toast.error(e);
+			toast.error(`${e}`);
 		}
 	};
 
@@ -339,7 +339,7 @@
 	const syncDirectoryHandler = async () => {
 		if ((knowledge?.files ?? []).length > 0) {
 			const res = await resetKnowledgeById(localStorage.token, id).catch((e) => {
-				toast.error(e);
+				toast.error(`${e}`);
 			});
 
 			if (res) {
@@ -357,7 +357,7 @@
 	const addFileHandler = async (fileId) => {
 		const updatedKnowledge = await addFileToKnowledgeById(localStorage.token, id, fileId).catch(
 			(e) => {
-				toast.error(e);
+				toast.error(`${e}`);
 				return null;
 			}
 		);
@@ -386,7 +386,7 @@
 			}
 		} catch (e) {
 			console.error('Error in deleteFileHandler:', e);
-			toast.error(e);
+			toast.error(`${e}`);
 		}
 	};
 
@@ -395,7 +395,7 @@
 		const content = selectedFile.data.content;
 
 		const res = updateFileDataContentById(localStorage.token, fileId, content).catch((e) => {
-			toast.error(e);
+			toast.error(`${e}`);
 		});
 
 		const updatedKnowledge = await updateFileFromKnowledgeById(
@@ -403,7 +403,7 @@
 			id,
 			fileId
 		).catch((e) => {
-			toast.error(e);
+			toast.error(`${e}`);
 		});
 
 		if (res && updatedKnowledge) {
@@ -430,7 +430,7 @@
 				description: knowledge.description,
 				access_control: knowledge.access_control
 			}).catch((e) => {
-				toast.error(e);
+				toast.error(`${e}`);
 			});
 
 			if (res) {
@@ -522,7 +522,7 @@
 		id = $page.params.id;
 
 		const res = await getKnowledgeById(localStorage.token, id).catch((e) => {
-			toast.error(e);
+			toast.error(`${e}`);
 			return null;
 		});
 

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

@@ -60,7 +60,7 @@
 
 	const deleteModelHandler = async (model) => {
 		const res = await deleteModelById(localStorage.token, model.id).catch((e) => {
-			toast.error(e);
+			toast.error(`${e}`);
 			return null;
 		});
 

+ 1 - 1
src/lib/components/workspace/Models/ModelEditor.svelte

@@ -531,7 +531,7 @@
 
 					<div class="my-2">
 						<div class="px-3 py-2 bg-gray-50 dark:bg-gray-950 rounded-lg">
-							<AccessControl bind:accessControl />
+							<AccessControl bind:accessControl accessRoles={['read', 'write']} />
 						</div>
 					</div>
 

+ 1 - 1
src/lib/components/workspace/common/ValvesModal.svelte

@@ -136,7 +136,7 @@
 
 					<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 flex flex-row space-x-1 items-center {saving
+							class="px-3.5 py-1.5 text-sm font-medium bg-black hover:bg-gray-900 text-white dark:bg-white dark:text-black dark:hover:bg-gray-100 transition rounded-full {saving
 								? ' cursor-not-allowed'
 								: ''}"
 							type="submit"

+ 8 - 4
src/lib/i18n/locales/ar-BH/translation.json

@@ -65,6 +65,8 @@
 	"Alternative to the top_p, and aims to ensure a balance of quality and variety. The parameter p represents the minimum probability for a token to be considered, relative to the probability of the most likely token. For example, with p=0.05 and the most likely token having a probability of 0.9, logits with a value less than 0.045 are filtered out. (Default: 0.0)": "",
 	"Amazing": "",
 	"an assistant": "مساعد",
+	"Analyzed": "",
+	"Analyzing...": "",
 	"and": "و",
 	"and {{COUNT}} more": "",
 	"and create a new shared link.": "و أنشئ رابط مشترك جديد.",
@@ -169,9 +171,12 @@
 	"Clipboard write permission denied. Please check your browser settings to grant the necessary access.": "",
 	"Clone": "استنساخ",
 	"Clone Chat": "",
+	"Clone of {{TITLE}}": "",
 	"Close": "أغلق",
 	"Code execution": "",
 	"Code formatted successfully": "",
+	"Code Intepreter": "",
+	"Code interpreter": "",
 	"Collection": "مجموعة",
 	"Color": "",
 	"ComfyUI": "ComfyUI",
@@ -478,7 +483,6 @@
 	"Group Name": "",
 	"Group updated successfully": "",
 	"Groups": "",
-	"h:mm a": "الساعة:الدقائق صباحا/مساء",
 	"Haptic Feedback": "",
 	"has no conversations.": "ليس لديه محادثات.",
 	"Hello, {{name}}": " {{name}} مرحبا",
@@ -595,9 +599,6 @@
 	"Mirostat": "Mirostat",
 	"Mirostat Eta": "Mirostat Eta",
 	"Mirostat Tau": "Mirostat Tau",
-	"MMMM DD, YYYY": "MMMM DD, YYYY",
-	"MMMM DD, YYYY HH:mm": "MMMM DD, YYYY HH:mm",
-	"MMMM DD, YYYY hh:mm:ss A": "",
 	"Model": "",
 	"Model '{{modelName}}' has been successfully downloaded.": "تم تحميل النموذج '{{modelName}}' بنجاح",
 	"Model '{{modelTag}}' is already in queue for downloading.": "النموذج '{{modelTag}}' موجود بالفعل في قائمة الانتظار للتحميل",
@@ -718,6 +719,7 @@
 	"Please enter a prompt": "",
 	"Please fill in all fields.": "",
 	"Please select a model first.": "",
+	"Please select a model.": "",
 	"Please select a reason": "",
 	"Port": "",
 	"Positive attitude": "موقف ايجابي",
@@ -971,6 +973,7 @@
 	"Tools": "",
 	"Tools Access": "",
 	"Tools are a function calling system with arbitrary code execution": "",
+	"Tools Function Calling Prompt": "",
 	"Tools have a function calling system that allows arbitrary code execution": "",
 	"Tools have a function calling system that allows arbitrary code execution.": "",
 	"Top K": "Top K",
@@ -1070,6 +1073,7 @@
 	"You can personalize your interactions with LLMs by adding memories through the 'Manage' button below, making them more helpful and tailored to you.": "",
 	"You cannot upload an empty file.": "",
 	"You do not have permission to access this feature.": "",
+	"You do not have permission to upload files": "",
 	"You do not have permission to upload files.": "",
 	"You have no archived conversations.": "لا تملك محادثات محفوظه",
 	"You have shared this chat": "تم مشاركة هذه المحادثة",

+ 8 - 4
src/lib/i18n/locales/bg-BG/translation.json

@@ -65,6 +65,8 @@
 	"Alternative to the top_p, and aims to ensure a balance of quality and variety. The parameter p represents the minimum probability for a token to be considered, relative to the probability of the most likely token. For example, with p=0.05 and the most likely token having a probability of 0.9, logits with a value less than 0.045 are filtered out. (Default: 0.0)": "",
 	"Amazing": "",
 	"an assistant": "асистент",
+	"Analyzed": "",
+	"Analyzing...": "",
 	"and": "и",
 	"and {{COUNT}} more": "",
 	"and create a new shared link.": "и създай нов общ линк.",
@@ -169,9 +171,12 @@
 	"Clipboard write permission denied. Please check your browser settings to grant the necessary access.": "",
 	"Clone": "Клонинг",
 	"Clone Chat": "",
+	"Clone of {{TITLE}}": "",
 	"Close": "Затвори",
 	"Code execution": "",
 	"Code formatted successfully": "",
+	"Code Intepreter": "",
+	"Code interpreter": "",
 	"Collection": "Колекция",
 	"Color": "",
 	"ComfyUI": "ComfyUI",
@@ -478,7 +483,6 @@
 	"Group Name": "",
 	"Group updated successfully": "",
 	"Groups": "",
-	"h:mm a": "h:mm a",
 	"Haptic Feedback": "",
 	"has no conversations.": "няма разговори.",
 	"Hello, {{name}}": "Здравей, {{name}}",
@@ -595,9 +599,6 @@
 	"Mirostat": "Mirostat",
 	"Mirostat Eta": "Mirostat Eta",
 	"Mirostat Tau": "Mirostat Tau",
-	"MMMM DD, YYYY": "MMMM DD, YYYY",
-	"MMMM DD, YYYY HH:mm": "MMMM DD, YYYY HH:mm",
-	"MMMM DD, YYYY hh:mm:ss A": "",
 	"Model": "",
 	"Model '{{modelName}}' has been successfully downloaded.": "Моделът '{{modelName}}' беше успешно свален.",
 	"Model '{{modelTag}}' is already in queue for downloading.": "Моделът '{{modelTag}}' е вече в очакване за сваляне.",
@@ -718,6 +719,7 @@
 	"Please enter a prompt": "",
 	"Please fill in all fields.": "",
 	"Please select a model first.": "",
+	"Please select a model.": "",
 	"Please select a reason": "",
 	"Port": "",
 	"Positive attitude": "Позитивна ативност",
@@ -971,6 +973,7 @@
 	"Tools": "",
 	"Tools Access": "",
 	"Tools are a function calling system with arbitrary code execution": "",
+	"Tools Function Calling Prompt": "",
 	"Tools have a function calling system that allows arbitrary code execution": "",
 	"Tools have a function calling system that allows arbitrary code execution.": "",
 	"Top K": "Top K",
@@ -1070,6 +1073,7 @@
 	"You can personalize your interactions with LLMs by adding memories through the 'Manage' button below, making them more helpful and tailored to you.": "",
 	"You cannot upload an empty file.": "",
 	"You do not have permission to access this feature.": "",
+	"You do not have permission to upload files": "",
 	"You do not have permission to upload files.": "",
 	"You have no archived conversations.": "Нямате архивирани разговори.",
 	"You have shared this chat": "Вие сте споделели този чат",

+ 8 - 4
src/lib/i18n/locales/bn-BD/translation.json

@@ -65,6 +65,8 @@
 	"Alternative to the top_p, and aims to ensure a balance of quality and variety. The parameter p represents the minimum probability for a token to be considered, relative to the probability of the most likely token. For example, with p=0.05 and the most likely token having a probability of 0.9, logits with a value less than 0.045 are filtered out. (Default: 0.0)": "",
 	"Amazing": "",
 	"an assistant": "একটা এসিস্ট্যান্ট",
+	"Analyzed": "",
+	"Analyzing...": "",
 	"and": "এবং",
 	"and {{COUNT}} more": "",
 	"and create a new shared link.": "এবং একটি নতুন শেয়ারে লিংক তৈরি করুন.",
@@ -169,9 +171,12 @@
 	"Clipboard write permission denied. Please check your browser settings to grant the necessary access.": "",
 	"Clone": "ক্লোন",
 	"Clone Chat": "",
+	"Clone of {{TITLE}}": "",
 	"Close": "বন্ধ",
 	"Code execution": "",
 	"Code formatted successfully": "",
+	"Code Intepreter": "",
+	"Code interpreter": "",
 	"Collection": "সংগ্রহ",
 	"Color": "",
 	"ComfyUI": "ComfyUI",
@@ -478,7 +483,6 @@
 	"Group Name": "",
 	"Group updated successfully": "",
 	"Groups": "",
-	"h:mm a": "h:mm a",
 	"Haptic Feedback": "",
 	"has no conversations.": "কোন কনভার্সেশন আছে না।",
 	"Hello, {{name}}": "হ্যালো, {{name}}",
@@ -595,9 +599,6 @@
 	"Mirostat": "Mirostat",
 	"Mirostat Eta": "Mirostat Eta",
 	"Mirostat Tau": "Mirostat Tau",
-	"MMMM DD, YYYY": "MMMM DD, YYYY",
-	"MMMM DD, YYYY HH:mm": "MMMM DD, YYYY HH:mm",
-	"MMMM DD, YYYY hh:mm:ss A": "",
 	"Model": "",
 	"Model '{{modelName}}' has been successfully downloaded.": "'{{modelName}}' মডেল সফলভাবে ডাউনলোড হয়েছে।",
 	"Model '{{modelTag}}' is already in queue for downloading.": "{{modelTag}} ডাউনলোডের জন্য আগে থেকেই অপেক্ষমান আছে।",
@@ -718,6 +719,7 @@
 	"Please enter a prompt": "",
 	"Please fill in all fields.": "",
 	"Please select a model first.": "",
+	"Please select a model.": "",
 	"Please select a reason": "",
 	"Port": "",
 	"Positive attitude": "পজিটিভ আক্রমণ",
@@ -971,6 +973,7 @@
 	"Tools": "",
 	"Tools Access": "",
 	"Tools are a function calling system with arbitrary code execution": "",
+	"Tools Function Calling Prompt": "",
 	"Tools have a function calling system that allows arbitrary code execution": "",
 	"Tools have a function calling system that allows arbitrary code execution.": "",
 	"Top K": "Top K",
@@ -1070,6 +1073,7 @@
 	"You can personalize your interactions with LLMs by adding memories through the 'Manage' button below, making them more helpful and tailored to you.": "",
 	"You cannot upload an empty file.": "",
 	"You do not have permission to access this feature.": "",
+	"You do not have permission to upload files": "",
 	"You do not have permission to upload files.": "",
 	"You have no archived conversations.": "আপনার কোনও আর্কাইভ করা কথোপকথন নেই।",
 	"You have shared this chat": "আপনি এই চ্যাটটি শেয়ার করেছেন",

+ 8 - 4
src/lib/i18n/locales/ca-ES/translation.json

@@ -65,6 +65,8 @@
 	"Alternative to the top_p, and aims to ensure a balance of quality and variety. The parameter p represents the minimum probability for a token to be considered, relative to the probability of the most likely token. For example, with p=0.05 and the most likely token having a probability of 0.9, logits with a value less than 0.045 are filtered out. (Default: 0.0)": "Alternativa al top_p, i pretén garantir un equilibri de qualitat i varietat. El paràmetre p representa la probabilitat mínima que es consideri un token, en relació amb la probabilitat del token més probable. Per exemple, amb p=0,05 i el token més probable amb una probabilitat de 0,9, es filtren els logits amb un valor inferior a 0,045. (Per defecte: 0.0)",
 	"Amazing": "Al·lucinant",
 	"an assistant": "un assistent",
+	"Analyzed": "",
+	"Analyzing...": "",
 	"and": "i",
 	"and {{COUNT}} more": "i {{COUNT}} més",
 	"and create a new shared link.": "i crear un nou enllaç compartit.",
@@ -169,9 +171,12 @@
 	"Clipboard write permission denied. Please check your browser settings to grant the necessary access.": "Permís d'escriptura al porta-retalls denegat. Comprova els ajustos de navegador per donar l'accés necessari.",
 	"Clone": "Clonar",
 	"Clone Chat": "Clonar el xat",
+	"Clone of {{TITLE}}": "",
 	"Close": "Tancar",
 	"Code execution": "Execució de codi",
 	"Code formatted successfully": "Codi formatat correctament",
+	"Code Intepreter": "",
+	"Code interpreter": "",
 	"Collection": "Col·lecció",
 	"Color": "Color",
 	"ComfyUI": "ComfyUI",
@@ -478,7 +483,6 @@
 	"Group Name": "Nom del grup",
 	"Group updated successfully": "Grup actualitzat correctament",
 	"Groups": "Grups",
-	"h:mm a": "h:mm a",
 	"Haptic Feedback": "Retorn hàptic",
 	"has no conversations.": "no té converses.",
 	"Hello, {{name}}": "Hola, {{name}}",
@@ -595,9 +599,6 @@
 	"Mirostat": "Mirostat",
 	"Mirostat Eta": "Eta de Mirostat",
 	"Mirostat Tau": "Tau de Mirostat",
-	"MMMM DD, YYYY": "DD de MMMM, YYYY",
-	"MMMM DD, YYYY HH:mm": "DD de MMMM, YYYY HH:mm",
-	"MMMM DD, YYYY hh:mm:ss A": "DD de MMMM, YYYY HH:mm:ss, A",
 	"Model": "Model",
 	"Model '{{modelName}}' has been successfully downloaded.": "El model '{{modelName}}' s'ha descarregat correctament.",
 	"Model '{{modelTag}}' is already in queue for downloading.": "El model '{{modelTag}}' ja està en cua per ser descarregat.",
@@ -718,6 +719,7 @@
 	"Please enter a prompt": "Si us plau, entra una indicació",
 	"Please fill in all fields.": "Emplena tots els camps, si us plau.",
 	"Please select a model first.": "Si us plau, selecciona un model primer",
+	"Please select a model.": "",
 	"Please select a reason": "Si us plau, selecciona una raó",
 	"Port": "Port",
 	"Positive attitude": "Actitud positiva",
@@ -971,6 +973,7 @@
 	"Tools": "Eines",
 	"Tools Access": "Accés a les eines",
 	"Tools are a function calling system with arbitrary code execution": "Les eines són un sistema de crida a funcions amb execució de codi arbitrari",
+	"Tools Function Calling Prompt": "",
 	"Tools have a function calling system that allows arbitrary code execution": "Les eines disposen d'un sistema de crida a funcions que permet execució de codi arbitrari",
 	"Tools have a function calling system that allows arbitrary code execution.": "Les eines disposen d'un sistema de crida a funcions que permet execució de codi arbitrari.",
 	"Top K": "Top K",
@@ -1070,6 +1073,7 @@
 	"You can personalize your interactions with LLMs by adding memories through the 'Manage' button below, making them more helpful and tailored to you.": "Pots personalitzar les teves interaccions amb els models de llenguatge afegint memòries mitjançant el botó 'Gestiona' que hi ha a continuació, fent-les més útils i adaptades a tu.",
 	"You cannot upload an empty file.": "No es pot pujar un ariux buit.",
 	"You do not have permission to access this feature.": "No tens permís per accedir a aquesta funcionalitat",
+	"You do not have permission to upload files": "",
 	"You do not have permission to upload files.": "No tens permisos per pujar arxius.",
 	"You have no archived conversations.": "No tens converses arxivades.",
 	"You have shared this chat": "Has compartit aquest xat",

+ 8 - 4
src/lib/i18n/locales/ceb-PH/translation.json

@@ -65,6 +65,8 @@
 	"Alternative to the top_p, and aims to ensure a balance of quality and variety. The parameter p represents the minimum probability for a token to be considered, relative to the probability of the most likely token. For example, with p=0.05 and the most likely token having a probability of 0.9, logits with a value less than 0.045 are filtered out. (Default: 0.0)": "",
 	"Amazing": "",
 	"an assistant": "usa ka katabang",
+	"Analyzed": "",
+	"Analyzing...": "",
 	"and": "Ug",
 	"and {{COUNT}} more": "",
 	"and create a new shared link.": "",
@@ -169,9 +171,12 @@
 	"Clipboard write permission denied. Please check your browser settings to grant the necessary access.": "",
 	"Clone": "",
 	"Clone Chat": "",
+	"Clone of {{TITLE}}": "",
 	"Close": "Suod nga",
 	"Code execution": "",
 	"Code formatted successfully": "",
+	"Code Intepreter": "",
+	"Code interpreter": "",
 	"Collection": "Koleksyon",
 	"Color": "",
 	"ComfyUI": "",
@@ -478,7 +483,6 @@
 	"Group Name": "",
 	"Group updated successfully": "",
 	"Groups": "",
-	"h:mm a": "",
 	"Haptic Feedback": "",
 	"has no conversations.": "",
 	"Hello, {{name}}": "Maayong buntag, {{name}}",
@@ -595,9 +599,6 @@
 	"Mirostat": "Mirostat",
 	"Mirostat Eta": "Mirostat Eta",
 	"Mirostat Tau": "Mirostat Tau",
-	"MMMM DD, YYYY": "MMMM DD, YYYY",
-	"MMMM DD, YYYY HH:mm": "",
-	"MMMM DD, YYYY hh:mm:ss A": "",
 	"Model": "",
 	"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.",
@@ -718,6 +719,7 @@
 	"Please enter a prompt": "",
 	"Please fill in all fields.": "",
 	"Please select a model first.": "",
+	"Please select a model.": "",
 	"Please select a reason": "",
 	"Port": "",
 	"Positive attitude": "",
@@ -971,6 +973,7 @@
 	"Tools": "",
 	"Tools Access": "",
 	"Tools are a function calling system with arbitrary code execution": "",
+	"Tools Function Calling Prompt": "",
 	"Tools have a function calling system that allows arbitrary code execution": "",
 	"Tools have a function calling system that allows arbitrary code execution.": "",
 	"Top K": "Top K",
@@ -1070,6 +1073,7 @@
 	"You can personalize your interactions with LLMs by adding memories through the 'Manage' button below, making them more helpful and tailored to you.": "",
 	"You cannot upload an empty file.": "",
 	"You do not have permission to access this feature.": "",
+	"You do not have permission to upload files": "",
 	"You do not have permission to upload files.": "",
 	"You have no archived conversations.": "",
 	"You have shared this chat": "",

+ 8 - 4
src/lib/i18n/locales/cs-CZ/translation.json

@@ -65,6 +65,8 @@
 	"Alternative to the top_p, and aims to ensure a balance of quality and variety. The parameter p represents the minimum probability for a token to be considered, relative to the probability of the most likely token. For example, with p=0.05 and the most likely token having a probability of 0.9, logits with a value less than 0.045 are filtered out. (Default: 0.0)": "",
 	"Amazing": "",
 	"an assistant": "asistent",
+	"Analyzed": "",
+	"Analyzing...": "",
 	"and": "a",
 	"and {{COUNT}} more": "a {{COUNT}} další/ch",
 	"and create a new shared link.": "a vytvořit nový sdílený odkaz.",
@@ -169,9 +171,12 @@
 	"Clipboard write permission denied. Please check your browser settings to grant the necessary access.": "Přístup k zápisu do schránky byl zamítnut. Prosím, zkontrolujte nastavení svého prohlížeče a udělte potřebný přístup.",
 	"Clone": "Klonovat",
 	"Clone Chat": "",
+	"Clone of {{TITLE}}": "",
 	"Close": "Zavřít",
 	"Code execution": "Provádění kódu",
 	"Code formatted successfully": "Kód byl úspěšně naformátován.",
+	"Code Intepreter": "",
+	"Code interpreter": "",
 	"Collection": "",
 	"Color": "Barva",
 	"ComfyUI": "ComfyUI.",
@@ -478,7 +483,6 @@
 	"Group Name": "",
 	"Group updated successfully": "",
 	"Groups": "",
-	"h:mm a": "hh:mm dop./odp.",
 	"Haptic Feedback": "Haptická zpětná vazba",
 	"has no conversations.": "nemá žádné konverzace.",
 	"Hello, {{name}}": "Ahoj, {{name}}",
@@ -595,9 +599,6 @@
 	"Mirostat": "Mirostat",
 	"Mirostat Eta": "Mirostat Eta",
 	"Mirostat Tau": "Mirostat Tau",
-	"MMMM DD, YYYY": "MMMM DD, RRRR",
-	"MMMM DD, YYYY HH:mm": "MMMM DD, RRRR HH:mm",
-	"MMMM DD, YYYY hh:mm:ss A": "MMMM DD, YYYY hh:mm:ss A",
 	"Model": "Model",
 	"Model '{{modelName}}' has been successfully downloaded.": "Model „{{modelName}}“ byl úspěšně stažen.",
 	"Model '{{modelTag}}' is already in queue for downloading.": "Model '{{modelTag}}' je již zařazen do fronty pro stahování.",
@@ -718,6 +719,7 @@
 	"Please enter a prompt": "Prosím, zadejte zadání.",
 	"Please fill in all fields.": "Prosím, vyplňte všechna pole.",
 	"Please select a model first.": "",
+	"Please select a model.": "",
 	"Please select a reason": "Prosím vyberte důvod",
 	"Port": "",
 	"Positive attitude": "Pozitivní přístup",
@@ -971,6 +973,7 @@
 	"Tools": "Nástroje",
 	"Tools Access": "",
 	"Tools are a function calling system with arbitrary code execution": "Nástroje jsou systémem pro volání funkcí s vykonáváním libovolného kódu.",
+	"Tools Function Calling Prompt": "",
 	"Tools have a function calling system that allows arbitrary code execution": "Nástroje mají systém volání funkcí, který umožňuje libovolné spouštění kódu.",
 	"Tools have a function calling system that allows arbitrary code execution.": "Nástroje mají systém volání funkcí, který umožňuje spuštění libovolného kódu.",
 	"Top K": "Top K",
@@ -1070,6 +1073,7 @@
 	"You can personalize your interactions with LLMs by adding memories through the 'Manage' button below, making them more helpful and tailored to you.": "Můžete personalizovat své interakce s LLM pomocí přidávání vzpomínek prostřednictvím tlačítka 'Spravovat' níže, což je učiní pro vás užitečnějšími a lépe přizpůsobenými.",
 	"You cannot upload an empty file.": "Nemůžete nahrát prázdný soubor.",
 	"You do not have permission to access this feature.": "",
+	"You do not have permission to upload files": "",
 	"You do not have permission to upload files.": "",
 	"You have no archived conversations.": "Nemáte žádné archivované konverzace.",
 	"You have shared this chat": "Sdíleli jste tento chat.",

+ 8 - 4
src/lib/i18n/locales/da-DK/translation.json

@@ -65,6 +65,8 @@
 	"Alternative to the top_p, and aims to ensure a balance of quality and variety. The parameter p represents the minimum probability for a token to be considered, relative to the probability of the most likely token. For example, with p=0.05 and the most likely token having a probability of 0.9, logits with a value less than 0.045 are filtered out. (Default: 0.0)": "",
 	"Amazing": "",
 	"an assistant": "en assistent",
+	"Analyzed": "",
+	"Analyzing...": "",
 	"and": "og",
 	"and {{COUNT}} more": "",
 	"and create a new shared link.": "og lav et nyt link til deling",
@@ -169,9 +171,12 @@
 	"Clipboard write permission denied. Please check your browser settings to grant the necessary access.": "Skriveadgang til udklipsholderen ikke tilladt. Tjek venligst indstillingerne i din browser for at give adgang.",
 	"Clone": "Klon",
 	"Clone Chat": "",
+	"Clone of {{TITLE}}": "",
 	"Close": "Luk",
 	"Code execution": "",
 	"Code formatted successfully": "Kode formateret korrekt",
+	"Code Intepreter": "",
+	"Code interpreter": "",
 	"Collection": "Samling",
 	"Color": "",
 	"ComfyUI": "ComfyUI",
@@ -478,7 +483,6 @@
 	"Group Name": "",
 	"Group updated successfully": "",
 	"Groups": "",
-	"h:mm a": "h:mm a",
 	"Haptic Feedback": "Haptisk feedback",
 	"has no conversations.": "har ingen samtaler.",
 	"Hello, {{name}}": "Hej {{name}}",
@@ -595,9 +599,6 @@
 	"Mirostat": "Mirostat",
 	"Mirostat Eta": "Mirostat Eta",
 	"Mirostat Tau": "Mirostat Tau",
-	"MMMM DD, YYYY": "MMMM DD, YYYY",
-	"MMMM DD, YYYY HH:mm": "MMMM DD, YYYY HH:mm",
-	"MMMM DD, YYYY hh:mm:ss A": "MMMM DD, YYYY hh:mm:ss A",
 	"Model": "",
 	"Model '{{modelName}}' has been successfully downloaded.": "Model '{{modelName}}' er blevet downloadet.",
 	"Model '{{modelTag}}' is already in queue for downloading.": "Model '{{modelTag}}' er allerede i kø til download.",
@@ -718,6 +719,7 @@
 	"Please enter a prompt": "",
 	"Please fill in all fields.": "Udfyld alle felter.",
 	"Please select a model first.": "",
+	"Please select a model.": "",
 	"Please select a reason": "Vælg en årsag",
 	"Port": "",
 	"Positive attitude": "Positiv holdning",
@@ -971,6 +973,7 @@
 	"Tools": "Værktøjer",
 	"Tools Access": "",
 	"Tools are a function calling system with arbitrary code execution": "Værktøjer er et funktionkaldssystem med vilkårlig kodeudførelse",
+	"Tools Function Calling Prompt": "",
 	"Tools have a function calling system that allows arbitrary code execution": "Værktøjer har et funktionkaldssystem, der tillader vilkårlig kodeudførelse",
 	"Tools have a function calling system that allows arbitrary code execution.": "Værktøjer har et funktionkaldssystem, der tillader vilkårlig kodeudførelse.",
 	"Top K": "Top K",
@@ -1070,6 +1073,7 @@
 	"You can personalize your interactions with LLMs by adding memories through the 'Manage' button below, making them more helpful and tailored to you.": "Du kan personliggøre dine interaktioner med LLM'er ved at tilføje minder via knappen 'Administrer' nedenfor, hvilket gør dem mere nyttige og skræddersyet til dig.",
 	"You cannot upload an empty file.": "",
 	"You do not have permission to access this feature.": "",
+	"You do not have permission to upload files": "",
 	"You do not have permission to upload files.": "",
 	"You have no archived conversations.": "Du har ingen arkiverede samtaler.",
 	"You have shared this chat": "Du har delt denne chat",

+ 8 - 4
src/lib/i18n/locales/de-DE/translation.json

@@ -65,6 +65,8 @@
 	"Alternative to the top_p, and aims to ensure a balance of quality and variety. The parameter p represents the minimum probability for a token to be considered, relative to the probability of the most likely token. For example, with p=0.05 and the most likely token having a probability of 0.9, logits with a value less than 0.045 are filtered out. (Default: 0.0)": "Alternative zu top_p und zielt darauf ab, ein Gleichgewicht zwischen Qualität und Vielfalt zu gewährleisten. Der Parameter p repräsentiert die Mindestwahrscheinlichkeit für ein Token, um berücksichtigt zu werden, relativ zur Wahrscheinlichkeit des wahrscheinlichsten Tokens. Zum Beispiel, bei p=0.05 und das wahrscheinlichste Token hat eine Wahrscheinlichkeit von 0.9, werden Logits mit einem Wert von weniger als 0.045 herausgefiltert. (Standard: 0.0)",
 	"Amazing": "Fantastisch",
 	"an assistant": "ein Assistent",
+	"Analyzed": "",
+	"Analyzing...": "",
 	"and": "und",
 	"and {{COUNT}} more": "und {{COUNT}} mehr",
 	"and create a new shared link.": "und erstellen Sie einen neuen freigegebenen Link.",
@@ -169,9 +171,12 @@
 	"Clipboard write permission denied. Please check your browser settings to grant the necessary access.": "Schreibberechtigung für die Zwischenablage verweigert. Bitte überprüfen Sie Ihre Browsereinstellungen, um den erforderlichen Zugriff zu erlauben.",
 	"Clone": "Klonen",
 	"Clone Chat": "",
+	"Clone of {{TITLE}}": "",
 	"Close": "Schließen",
 	"Code execution": "Codeausführung",
 	"Code formatted successfully": "Code erfolgreich formatiert",
+	"Code Intepreter": "",
+	"Code interpreter": "",
 	"Collection": "Kollektion",
 	"Color": "Farbe",
 	"ComfyUI": "ComfyUI",
@@ -478,7 +483,6 @@
 	"Group Name": "Gruppenname",
 	"Group updated successfully": "Gruppe erfolgreich aktualisiert",
 	"Groups": "Gruppen",
-	"h:mm a": "h:mm a",
 	"Haptic Feedback": "Haptisches Feedback",
 	"has no conversations.": "hat keine Unterhaltungen.",
 	"Hello, {{name}}": "Hallo, {{name}}",
@@ -595,9 +599,6 @@
 	"Mirostat": "Mirostat",
 	"Mirostat Eta": "Mirostat Eta",
 	"Mirostat Tau": "Mirostat Tau",
-	"MMMM DD, YYYY": "DD MMMM YYYY",
-	"MMMM DD, YYYY HH:mm": "DD MMMM YYYY HH:mm",
-	"MMMM DD, YYYY hh:mm:ss A": "DD MMMM YYYY HH:mm A",
 	"Model": "Modell",
 	"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.",
@@ -718,6 +719,7 @@
 	"Please enter a prompt": "Bitte geben Sie einen Prompt ein",
 	"Please fill in all fields.": "Bitte füllen Sie alle Felder aus.",
 	"Please select a model first.": "",
+	"Please select a model.": "",
 	"Please select a reason": "Bitte wählen Sie einen Grund aus",
 	"Port": "Port",
 	"Positive attitude": "Positive Einstellung",
@@ -971,6 +973,7 @@
 	"Tools": "Werkzeuge",
 	"Tools Access": "Werkzeugzugriff",
 	"Tools are a function calling system with arbitrary code execution": "Wekzeuge sind ein Funktionssystem mit beliebiger Codeausführung",
+	"Tools Function Calling Prompt": "",
 	"Tools have a function calling system that allows arbitrary code execution": "Werkezuge verfügen über ein Funktionssystem, das die Ausführung beliebigen Codes ermöglicht",
 	"Tools have a function calling system that allows arbitrary code execution.": "Werkzeuge verfügen über ein Funktionssystem, das die Ausführung beliebigen Codes ermöglicht.",
 	"Top K": "Top K",
@@ -1070,6 +1073,7 @@
 	"You can personalize your interactions with LLMs by adding memories through the 'Manage' button below, making them more helpful and tailored to you.": "Personalisieren Sie Interaktionen mit LLMs, indem Sie über die Schaltfläche \"Verwalten\" Erinnerungen hinzufügen.",
 	"You cannot upload an empty file.": "Sie können keine leere Datei hochladen.",
 	"You do not have permission to access this feature.": "",
+	"You do not have permission to upload files": "",
 	"You do not have permission to upload files.": "Sie haben keine Berechtigung zum Hochladen von Dateien.",
 	"You have no archived conversations.": "Du hast keine archivierten Unterhaltungen.",
 	"You have shared this chat": "Sie haben diese Unterhaltung geteilt",

+ 8 - 4
src/lib/i18n/locales/dg-DG/translation.json

@@ -65,6 +65,8 @@
 	"Alternative to the top_p, and aims to ensure a balance of quality and variety. The parameter p represents the minimum probability for a token to be considered, relative to the probability of the most likely token. For example, with p=0.05 and the most likely token having a probability of 0.9, logits with a value less than 0.045 are filtered out. (Default: 0.0)": "",
 	"Amazing": "",
 	"an assistant": "such assistant",
+	"Analyzed": "",
+	"Analyzing...": "",
 	"and": "and",
 	"and {{COUNT}} more": "",
 	"and create a new shared link.": "",
@@ -169,9 +171,12 @@
 	"Clipboard write permission denied. Please check your browser settings to grant the necessary access.": "",
 	"Clone": "",
 	"Clone Chat": "",
+	"Clone of {{TITLE}}": "",
 	"Close": "Close",
 	"Code execution": "",
 	"Code formatted successfully": "",
+	"Code Intepreter": "",
+	"Code interpreter": "",
 	"Collection": "Collection",
 	"Color": "",
 	"ComfyUI": "",
@@ -478,7 +483,6 @@
 	"Group Name": "",
 	"Group updated successfully": "",
 	"Groups": "",
-	"h:mm a": "",
 	"Haptic Feedback": "",
 	"has no conversations.": "",
 	"Hello, {{name}}": "Much helo, {{name}}",
@@ -595,9 +599,6 @@
 	"Mirostat": "Mirostat",
 	"Mirostat Eta": "Mirostat Eta",
 	"Mirostat Tau": "Mirostat Tau",
-	"MMMM DD, YYYY": "MMMM DD, YYYY",
-	"MMMM DD, YYYY HH:mm": "",
-	"MMMM DD, YYYY hh:mm:ss A": "",
 	"Model": "",
 	"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.",
@@ -718,6 +719,7 @@
 	"Please enter a prompt": "",
 	"Please fill in all fields.": "",
 	"Please select a model first.": "",
+	"Please select a model.": "",
 	"Please select a reason": "",
 	"Port": "",
 	"Positive attitude": "",
@@ -971,6 +973,7 @@
 	"Tools": "",
 	"Tools Access": "",
 	"Tools are a function calling system with arbitrary code execution": "",
+	"Tools Function Calling Prompt": "",
 	"Tools have a function calling system that allows arbitrary code execution": "",
 	"Tools have a function calling system that allows arbitrary code execution.": "",
 	"Top K": "Top K very top",
@@ -1070,6 +1073,7 @@
 	"You can personalize your interactions with LLMs by adding memories through the 'Manage' button below, making them more helpful and tailored to you.": "",
 	"You cannot upload an empty file.": "",
 	"You do not have permission to access this feature.": "",
+	"You do not have permission to upload files": "",
 	"You do not have permission to upload files.": "",
 	"You have no archived conversations.": "",
 	"You have shared this chat": "",

+ 8 - 4
src/lib/i18n/locales/el-GR/translation.json

@@ -65,6 +65,8 @@
 	"Alternative to the top_p, and aims to ensure a balance of quality and variety. The parameter p represents the minimum probability for a token to be considered, relative to the probability of the most likely token. For example, with p=0.05 and the most likely token having a probability of 0.9, logits with a value less than 0.045 are filtered out. (Default: 0.0)": "Εναλλακτικό στο top_p, και στοχεύει στη διασφάλιση μιας ισορροπίας μεταξύ ποιότητας και ποικιλίας. Η παράμετρος p αντιπροσωπεύει την ελάχιστη πιθανότητα για ένα token να θεωρηθεί, σε σχέση με την πιθανότητα του πιο πιθανού token. Για παράδειγμα, με p=0.05 και το πιο πιθανό token να έχει πιθανότητα 0.9, τα logits με τιμή μικρότερη από 0.045 φιλτράρονται. (Προεπιλογή: 0.0)",
 	"Amazing": "Καταπληκτικό",
 	"an assistant": "ένας βοηθός",
+	"Analyzed": "",
+	"Analyzing...": "",
 	"and": "και",
 	"and {{COUNT}} more": "και {{COUNT}} ακόμα",
 	"and create a new shared link.": "και δημιουργήστε έναν νέο κοινόχρηστο σύνδεσμο.",
@@ -169,9 +171,12 @@
 	"Clipboard write permission denied. Please check your browser settings to grant the necessary access.": "Άρνηση δικαιώματος εγγραφής στο πρόχειρο. Παρακαλώ ελέγξτε τις ρυθμίσεις του περιηγητή σας για να δώσετε την απαραίτητη πρόσβαση.",
 	"Clone": "Κλώνος",
 	"Clone Chat": "",
+	"Clone of {{TITLE}}": "",
 	"Close": "Κλείσιμο",
 	"Code execution": "Εκτέλεση κώδικα",
 	"Code formatted successfully": "Ο κώδικας μορφοποιήθηκε επιτυχώς",
+	"Code Intepreter": "",
+	"Code interpreter": "",
 	"Collection": "Συλλογή",
 	"Color": "Χρώμα",
 	"ComfyUI": "ComfyUI",
@@ -478,7 +483,6 @@
 	"Group Name": "Όνομα Ομάδας",
 	"Group updated successfully": "Η ομάδα ενημερώθηκε με επιτυχία",
 	"Groups": "Ομάδες",
-	"h:mm a": "h:mm π.μ./μ.μ.",
 	"Haptic Feedback": "Ανατροφοδότηση Haptic",
 	"has no conversations.": "δεν έχει συνομιλίες.",
 	"Hello, {{name}}": "Γειά σου, {{name}}",
@@ -595,9 +599,6 @@
 	"Mirostat": "Mirostat",
 	"Mirostat Eta": "Mirostat Eta",
 	"Mirostat Tau": "Mirostat Tau",
-	"MMMM DD, YYYY": "MMMM DD, YYYY",
-	"MMMM DD, YYYY HH:mm": "MMMM DD, YYYY HH:mm",
-	"MMMM DD, YYYY hh:mm:ss A": "MMMM DD, YYYY hh:mm:ss A",
 	"Model": "Μοντέλο",
 	"Model '{{modelName}}' has been successfully downloaded.": "Το μοντέλο '{{modelName}}' κατεβάστηκε με επιτυχία.",
 	"Model '{{modelTag}}' is already in queue for downloading.": "Το μοντέλο '{{modelTag}}' βρίσκεται ήδη στην ουρά για λήψη.",
@@ -718,6 +719,7 @@
 	"Please enter a prompt": "Παρακαλώ εισάγετε μια προτροπή",
 	"Please fill in all fields.": "Παρακαλώ συμπληρώστε όλα τα πεδία.",
 	"Please select a model first.": "",
+	"Please select a model.": "",
 	"Please select a reason": "Παρακαλώ επιλέξτε έναν λόγο",
 	"Port": "Θύρα",
 	"Positive attitude": "Θετική στάση",
@@ -971,6 +973,7 @@
 	"Tools": "Εργαλεία",
 	"Tools Access": "Πρόσβαση Εργαλείων",
 	"Tools are a function calling system with arbitrary code execution": "Τα εργαλεία είναι ένα σύστημα κλήσης λειτουργιών με αυθαίρετη εκτέλεση κώδικα",
+	"Tools Function Calling Prompt": "",
 	"Tools have a function calling system that allows arbitrary code execution": "Τα εργαλεία διαθέτουν ένα σύστημα κλήσης λειτουργιών που επιτρέπει την αυθαίρετη εκτέλεση κώδικα",
 	"Tools have a function calling system that allows arbitrary code execution.": "Τα εργαλεία διαθέτουν ένα σύστημα κλήσης λειτουργιών που επιτρέπει την αυθαίρετη εκτέλεση κώδικα.",
 	"Top K": "Top K",
@@ -1070,6 +1073,7 @@
 	"You can personalize your interactions with LLMs by adding memories through the 'Manage' button below, making them more helpful and tailored to you.": "Μπορείτε να προσωποποιήσετε τις αλληλεπιδράσεις σας με τα LLMs προσθέτοντας αναμνήσεις μέσω του κουμπιού 'Διαχείριση' παρακάτω, κάνοντάς τα πιο χρήσιμα και προσαρμοσμένα σε εσάς.",
 	"You cannot upload an empty file.": "Δεν μπορείτε να ανεβάσετε ένα κενό αρχείο.",
 	"You do not have permission to access this feature.": "",
+	"You do not have permission to upload files": "",
 	"You do not have permission to upload files.": "Δεν έχετε άδεια να ανεβάσετε αρχεία.",
 	"You have no archived conversations.": "Δεν έχετε αρχειοθετημένες συνομιλίες.",
 	"You have shared this chat": "Έχετε μοιραστεί αυτή τη συνομιλία",

+ 8 - 4
src/lib/i18n/locales/en-GB/translation.json

@@ -65,6 +65,8 @@
 	"Alternative to the top_p, and aims to ensure a balance of quality and variety. The parameter p represents the minimum probability for a token to be considered, relative to the probability of the most likely token. For example, with p=0.05 and the most likely token having a probability of 0.9, logits with a value less than 0.045 are filtered out. (Default: 0.0)": "",
 	"Amazing": "",
 	"an assistant": "",
+	"Analyzed": "",
+	"Analyzing...": "",
 	"and": "",
 	"and {{COUNT}} more": "",
 	"and create a new shared link.": "",
@@ -169,9 +171,12 @@
 	"Clipboard write permission denied. Please check your browser settings to grant the necessary access.": "",
 	"Clone": "",
 	"Clone Chat": "",
+	"Clone of {{TITLE}}": "",
 	"Close": "",
 	"Code execution": "",
 	"Code formatted successfully": "",
+	"Code Intepreter": "",
+	"Code interpreter": "",
 	"Collection": "",
 	"Color": "",
 	"ComfyUI": "",
@@ -478,7 +483,6 @@
 	"Group Name": "",
 	"Group updated successfully": "",
 	"Groups": "",
-	"h:mm a": "",
 	"Haptic Feedback": "",
 	"has no conversations.": "",
 	"Hello, {{name}}": "",
@@ -595,9 +599,6 @@
 	"Mirostat": "",
 	"Mirostat Eta": "",
 	"Mirostat Tau": "",
-	"MMMM DD, YYYY": "",
-	"MMMM DD, YYYY HH:mm": "",
-	"MMMM DD, YYYY hh:mm:ss A": "",
 	"Model": "",
 	"Model '{{modelName}}' has been successfully downloaded.": "",
 	"Model '{{modelTag}}' is already in queue for downloading.": "",
@@ -718,6 +719,7 @@
 	"Please enter a prompt": "",
 	"Please fill in all fields.": "",
 	"Please select a model first.": "",
+	"Please select a model.": "",
 	"Please select a reason": "",
 	"Port": "",
 	"Positive attitude": "",
@@ -971,6 +973,7 @@
 	"Tools": "",
 	"Tools Access": "",
 	"Tools are a function calling system with arbitrary code execution": "",
+	"Tools Function Calling Prompt": "",
 	"Tools have a function calling system that allows arbitrary code execution": "",
 	"Tools have a function calling system that allows arbitrary code execution.": "",
 	"Top K": "",
@@ -1070,6 +1073,7 @@
 	"You can personalize your interactions with LLMs by adding memories through the 'Manage' button below, making them more helpful and tailored to you.": "",
 	"You cannot upload an empty file.": "",
 	"You do not have permission to access this feature.": "",
+	"You do not have permission to upload files": "",
 	"You do not have permission to upload files.": "",
 	"You have no archived conversations.": "",
 	"You have shared this chat": "",

+ 8 - 4
src/lib/i18n/locales/en-US/translation.json

@@ -65,6 +65,8 @@
 	"Alternative to the top_p, and aims to ensure a balance of quality and variety. The parameter p represents the minimum probability for a token to be considered, relative to the probability of the most likely token. For example, with p=0.05 and the most likely token having a probability of 0.9, logits with a value less than 0.045 are filtered out. (Default: 0.0)": "",
 	"Amazing": "",
 	"an assistant": "",
+	"Analyzed": "",
+	"Analyzing...": "",
 	"and": "",
 	"and {{COUNT}} more": "",
 	"and create a new shared link.": "",
@@ -169,9 +171,12 @@
 	"Clipboard write permission denied. Please check your browser settings to grant the necessary access.": "",
 	"Clone": "",
 	"Clone Chat": "",
+	"Clone of {{TITLE}}": "",
 	"Close": "",
 	"Code execution": "",
 	"Code formatted successfully": "",
+	"Code Intepreter": "",
+	"Code interpreter": "",
 	"Collection": "",
 	"Color": "",
 	"ComfyUI": "",
@@ -478,7 +483,6 @@
 	"Group Name": "",
 	"Group updated successfully": "",
 	"Groups": "",
-	"h:mm a": "",
 	"Haptic Feedback": "",
 	"has no conversations.": "",
 	"Hello, {{name}}": "",
@@ -595,9 +599,6 @@
 	"Mirostat": "",
 	"Mirostat Eta": "",
 	"Mirostat Tau": "",
-	"MMMM DD, YYYY": "",
-	"MMMM DD, YYYY HH:mm": "",
-	"MMMM DD, YYYY hh:mm:ss A": "",
 	"Model": "",
 	"Model '{{modelName}}' has been successfully downloaded.": "",
 	"Model '{{modelTag}}' is already in queue for downloading.": "",
@@ -718,6 +719,7 @@
 	"Please enter a prompt": "",
 	"Please fill in all fields.": "",
 	"Please select a model first.": "",
+	"Please select a model.": "",
 	"Please select a reason": "",
 	"Port": "",
 	"Positive attitude": "",
@@ -971,6 +973,7 @@
 	"Tools": "",
 	"Tools Access": "",
 	"Tools are a function calling system with arbitrary code execution": "",
+	"Tools Function Calling Prompt": "",
 	"Tools have a function calling system that allows arbitrary code execution": "",
 	"Tools have a function calling system that allows arbitrary code execution.": "",
 	"Top K": "",
@@ -1070,6 +1073,7 @@
 	"You can personalize your interactions with LLMs by adding memories through the 'Manage' button below, making them more helpful and tailored to you.": "",
 	"You cannot upload an empty file.": "",
 	"You do not have permission to access this feature.": "",
+	"You do not have permission to upload files": "",
 	"You do not have permission to upload files.": "",
 	"You have no archived conversations.": "",
 	"You have shared this chat": "",

+ 8 - 4
src/lib/i18n/locales/es-ES/translation.json

@@ -65,6 +65,8 @@
 	"Alternative to the top_p, and aims to ensure a balance of quality and variety. The parameter p represents the minimum probability for a token to be considered, relative to the probability of the most likely token. For example, with p=0.05 and the most likely token having a probability of 0.9, logits with a value less than 0.045 are filtered out. (Default: 0.0)": "",
 	"Amazing": "",
 	"an assistant": "un asistente",
+	"Analyzed": "",
+	"Analyzing...": "",
 	"and": "y",
 	"and {{COUNT}} more": "",
 	"and create a new shared link.": "y crear un nuevo enlace compartido.",
@@ -169,9 +171,12 @@
 	"Clipboard write permission denied. Please check your browser settings to grant the necessary access.": "Permisos de escritura del portapapeles denegados. Por favor, comprueba las configuraciones de tu navegador para otorgar el acceso necesario.",
 	"Clone": "Clonar",
 	"Clone Chat": "",
+	"Clone of {{TITLE}}": "",
 	"Close": "Cerrar",
 	"Code execution": "",
 	"Code formatted successfully": "Se ha formateado correctamente el código.",
+	"Code Intepreter": "",
+	"Code interpreter": "",
 	"Collection": "Colección",
 	"Color": "",
 	"ComfyUI": "ComfyUI",
@@ -478,7 +483,6 @@
 	"Group Name": "",
 	"Group updated successfully": "",
 	"Groups": "",
-	"h:mm a": "h:mm a",
 	"Haptic Feedback": "Retroalimentación háptica",
 	"has no conversations.": "no tiene conversaciones.",
 	"Hello, {{name}}": "Hola, {{name}}",
@@ -595,9 +599,6 @@
 	"Mirostat": "Mirostat",
 	"Mirostat Eta": "Mirostat Eta",
 	"Mirostat Tau": "Mirostat Tau",
-	"MMMM DD, YYYY": "MMMM DD, YYYY",
-	"MMMM DD, YYYY HH:mm": "MMMM DD, YYYY HH:mm",
-	"MMMM DD, YYYY hh:mm:ss A": "MMMM DD, YYYY hh:mm:ss A",
 	"Model": "",
 	"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.",
@@ -718,6 +719,7 @@
 	"Please enter a prompt": "",
 	"Please fill in all fields.": "Por favor llene todos los campos.",
 	"Please select a model first.": "",
+	"Please select a model.": "",
 	"Please select a reason": "Por favor seleccione una razón",
 	"Port": "",
 	"Positive attitude": "Actitud positiva",
@@ -971,6 +973,7 @@
 	"Tools": "Herramientas",
 	"Tools Access": "",
 	"Tools are a function calling system with arbitrary code execution": "Las herramientas son un sistema de llamada de funciones con código arbitrario",
+	"Tools Function Calling Prompt": "",
 	"Tools have a function calling system that allows arbitrary code execution": "Las herramientas tienen un sistema de llamadas de funciones que permite la ejecución de código arbitrario",
 	"Tools have a function calling system that allows arbitrary code execution.": "Las herramientas tienen un sistema de llamada de funciones que permite la ejecución de código arbitrario.",
 	"Top K": "Top K",
@@ -1070,6 +1073,7 @@
 	"You can personalize your interactions with LLMs by adding memories through the 'Manage' button below, making them more helpful and tailored to you.": "Puede personalizar sus interacciones con LLMs añadiendo memorias a través del botón 'Gestionar' debajo, haciendo que sean más útiles y personalizados para usted.",
 	"You cannot upload an empty file.": "",
 	"You do not have permission to access this feature.": "",
+	"You do not have permission to upload files": "",
 	"You do not have permission to upload files.": "",
 	"You have no archived conversations.": "No tiene conversaciones archivadas.",
 	"You have shared this chat": "Usted ha compartido esta conversación",

+ 8 - 4
src/lib/i18n/locales/eu-ES/translation.json

@@ -65,6 +65,8 @@
 	"Alternative to the top_p, and aims to ensure a balance of quality and variety. The parameter p represents the minimum probability for a token to be considered, relative to the probability of the most likely token. For example, with p=0.05 and the most likely token having a probability of 0.9, logits with a value less than 0.045 are filtered out. (Default: 0.0)": "top_p-ren alternatiba, kalitate eta aniztasunaren arteko oreka bermatzea du helburu. p parametroak token bat kontuan hartzeko gutxieneko probabilitatea adierazten du, token probableenaren probabilitatearen arabera. Adibidez, p=0.05 balioarekin eta token probableenaren probabilitatea 0.9 denean, 0.045 baino balio txikiagoko logit-ak baztertzen dira. (Lehenetsia: 0.0)",
 	"Amazing": "Harrigarria",
 	"an assistant": "laguntzaile bat",
+	"Analyzed": "",
+	"Analyzing...": "",
 	"and": "eta",
 	"and {{COUNT}} more": "eta {{COUNT}} gehiago",
 	"and create a new shared link.": "eta sortu partekatutako esteka berri bat.",
@@ -169,9 +171,12 @@
 	"Clipboard write permission denied. Please check your browser settings to grant the necessary access.": "Arbelerako idazteko baimena ukatua. Mesedez, egiaztatu zure nabigatzailearen ezarpenak beharrezko sarbidea emateko.",
 	"Clone": "Klonatu",
 	"Clone Chat": "",
+	"Clone of {{TITLE}}": "",
 	"Close": "Itxi",
 	"Code execution": "Kodearen exekuzioa",
 	"Code formatted successfully": "Kodea ongi formateatu da",
+	"Code Intepreter": "",
+	"Code interpreter": "",
 	"Collection": "Bilduma",
 	"Color": "Kolorea",
 	"ComfyUI": "ComfyUI",
@@ -478,7 +483,6 @@
 	"Group Name": "Taldearen Izena",
 	"Group updated successfully": "Taldea ongi eguneratu da",
 	"Groups": "Taldeak",
-	"h:mm a": "h:mm a",
 	"Haptic Feedback": "Feedback Haptikoa",
 	"has no conversations.": "ez du elkarrizketarik.",
 	"Hello, {{name}}": "Kaixo, {{name}}",
@@ -595,9 +599,6 @@
 	"Mirostat": "Mirostat",
 	"Mirostat Eta": "Mirostat Eta",
 	"Mirostat Tau": "Mirostat Tau",
-	"MMMM DD, YYYY": "YYYY-ko MMMM-ren DD",
-	"MMMM DD, YYYY HH:mm": "YYYY-ko MMMM-ren DD HH:mm",
-	"MMMM DD, YYYY hh:mm:ss A": "YYYY-ko MMMM-ren DD hh:mm:ss A",
 	"Model": "Modeloa",
 	"Model '{{modelName}}' has been successfully downloaded.": "'{{modelName}}' modeloa ongi deskargatu da.",
 	"Model '{{modelTag}}' is already in queue for downloading.": "'{{modelTag}}' modeloa dagoeneko deskarga ilaran dago.",
@@ -718,6 +719,7 @@
 	"Please enter a prompt": "Mesedez, sartu prompt bat",
 	"Please fill in all fields.": "Mesedez, bete eremu guztiak.",
 	"Please select a model first.": "",
+	"Please select a model.": "",
 	"Please select a reason": "Mesedez, hautatu arrazoi bat",
 	"Port": "Ataka",
 	"Positive attitude": "Jarrera positiboa",
@@ -971,6 +973,7 @@
 	"Tools": "Tresnak",
 	"Tools Access": "Tresnen sarbidea",
 	"Tools are a function calling system with arbitrary code execution": "Tresnak kode arbitrarioa exekutatzeko funtzio deitzeko sistema bat dira",
+	"Tools Function Calling Prompt": "",
 	"Tools have a function calling system that allows arbitrary code execution": "Tresnek kode arbitrarioa exekutatzeko aukera ematen duen funtzio deitzeko sistema dute",
 	"Tools have a function calling system that allows arbitrary code execution.": "Tresnek kode arbitrarioa exekutatzeko aukera ematen duen funtzio deitzeko sistema dute.",
 	"Top K": "Goiko K",
@@ -1070,6 +1073,7 @@
 	"You can personalize your interactions with LLMs by adding memories through the 'Manage' button below, making them more helpful and tailored to you.": "LLMekin dituzun interakzioak pertsonalizatu ditzakezu memoriak gehituz beheko 'Kudeatu' botoiaren bidez, lagungarriagoak eta zuretzat egokituagoak eginez.",
 	"You cannot upload an empty file.": "Ezin duzu fitxategi huts bat kargatu.",
 	"You do not have permission to access this feature.": "",
+	"You do not have permission to upload files": "",
 	"You do not have permission to upload files.": "Ez duzu fitxategiak kargatzeko baimenik.",
 	"You have no archived conversations.": "Ez duzu artxibatutako elkarrizketarik.",
 	"You have shared this chat": "Txat hau partekatu duzu",

+ 8 - 4
src/lib/i18n/locales/fa-IR/translation.json

@@ -65,6 +65,8 @@
 	"Alternative to the top_p, and aims to ensure a balance of quality and variety. The parameter p represents the minimum probability for a token to be considered, relative to the probability of the most likely token. For example, with p=0.05 and the most likely token having a probability of 0.9, logits with a value less than 0.045 are filtered out. (Default: 0.0)": "",
 	"Amazing": "",
 	"an assistant": "یک دستیار",
+	"Analyzed": "",
+	"Analyzing...": "",
 	"and": "و",
 	"and {{COUNT}} more": "و {{COUNT}} مورد دیگر",
 	"and create a new shared link.": "و یک پیوند اشتراک\u200cگذاری جدید ایجاد کنید.",
@@ -169,9 +171,12 @@
 	"Clipboard write permission denied. Please check your browser settings to grant the necessary access.": "",
 	"Clone": "کلون",
 	"Clone Chat": "",
+	"Clone of {{TITLE}}": "",
 	"Close": "بسته",
 	"Code execution": "",
 	"Code formatted successfully": "",
+	"Code Intepreter": "",
+	"Code interpreter": "",
 	"Collection": "مجموعه",
 	"Color": "",
 	"ComfyUI": "کومیوآی",
@@ -478,7 +483,6 @@
 	"Group Name": "",
 	"Group updated successfully": "",
 	"Groups": "",
-	"h:mm a": "h:mm a",
 	"Haptic Feedback": "",
 	"has no conversations.": "ندارد.",
 	"Hello, {{name}}": "سلام، {{name}}",
@@ -595,9 +599,6 @@
 	"Mirostat": "Mirostat",
 	"Mirostat Eta": "Mirostat Eta",
 	"Mirostat Tau": "Mirostat Tau",
-	"MMMM DD, YYYY": "MMMM DD, YYYY",
-	"MMMM DD, YYYY HH:mm": "MMMM DD, YYYY HH:mm",
-	"MMMM DD, YYYY hh:mm:ss A": "",
 	"Model": "",
 	"Model '{{modelName}}' has been successfully downloaded.": "مدل '{{modelName}}' با موفقیت دانلود شد.",
 	"Model '{{modelTag}}' is already in queue for downloading.": "مدل '{{modelTag}}' در حال حاضر در صف برای دانلود است.",
@@ -718,6 +719,7 @@
 	"Please enter a prompt": "",
 	"Please fill in all fields.": "",
 	"Please select a model first.": "",
+	"Please select a model.": "",
 	"Please select a reason": "",
 	"Port": "",
 	"Positive attitude": "نظرات مثبت",
@@ -971,6 +973,7 @@
 	"Tools": "",
 	"Tools Access": "",
 	"Tools are a function calling system with arbitrary code execution": "",
+	"Tools Function Calling Prompt": "",
 	"Tools have a function calling system that allows arbitrary code execution": "",
 	"Tools have a function calling system that allows arbitrary code execution.": "",
 	"Top K": "Top K",
@@ -1070,6 +1073,7 @@
 	"You can personalize your interactions with LLMs by adding memories through the 'Manage' button below, making them more helpful and tailored to you.": "",
 	"You cannot upload an empty file.": "",
 	"You do not have permission to access this feature.": "",
+	"You do not have permission to upload files": "",
 	"You do not have permission to upload files.": "",
 	"You have no archived conversations.": "شما هیچ گفتگوی ذخیره شده ندارید.",
 	"You have shared this chat": "شما این گفتگو را به اشتراک گذاشته اید",

+ 8 - 4
src/lib/i18n/locales/fi-FI/translation.json

@@ -65,6 +65,8 @@
 	"Alternative to the top_p, and aims to ensure a balance of quality and variety. The parameter p represents the minimum probability for a token to be considered, relative to the probability of the most likely token. For example, with p=0.05 and the most likely token having a probability of 0.9, logits with a value less than 0.045 are filtered out. (Default: 0.0)": "Vaihtoehto top_p:lle, jolla pyritään varmistamaan laadun ja monipuolisuuden tasapaino. Parametri p edustaa pienintä todennäköisyyttä, jolla token otetaan huomioon suhteessa todennäköisimpään tokeniin. Esimerkiksi p=0.05 ja todennäköisin token todennäköisyydellä 0.9, arvoltaan alle 0.045 olevat logit suodatetaan pois. (Oletus: 0.0)",
 	"Amazing": "Hämmästyttävä",
 	"an assistant": "avustaja",
+	"Analyzed": "",
+	"Analyzing...": "",
 	"and": "ja",
 	"and {{COUNT}} more": "ja {{COUNT}} muuta",
 	"and create a new shared link.": "ja luo uusi jaettu linkki.",
@@ -169,9 +171,12 @@
 	"Clipboard write permission denied. Please check your browser settings to grant the necessary access.": "Leikepöydälle kirjoitusoikeus evätty. Tarkista selaimesi asetukset ja myönnä tarvittavat käyttöoikeudet.",
 	"Clone": "Kloonaa",
 	"Clone Chat": "",
+	"Clone of {{TITLE}}": "",
 	"Close": "Sulje",
 	"Code execution": "Koodin suorittaminen",
 	"Code formatted successfully": "Koodin muotoilu onnistui",
+	"Code Intepreter": "",
+	"Code interpreter": "",
 	"Collection": "Kokoelma",
 	"Color": "Väri",
 	"ComfyUI": "ComfyUI",
@@ -478,7 +483,6 @@
 	"Group Name": "Ryhmän nimi",
 	"Group updated successfully": "Ryhmä päivitetty onnistuneesti",
 	"Groups": "Ryhmät",
-	"h:mm a": "h:mm a",
 	"Haptic Feedback": "Haptinen palaute",
 	"has no conversations.": "ei ole keskusteluja.",
 	"Hello, {{name}}": "Hei, {{name}}",
@@ -595,9 +599,6 @@
 	"Mirostat": "Mirostat",
 	"Mirostat Eta": "Mirostat Eta",
 	"Mirostat Tau": "Mirostat Tau",
-	"MMMM DD, YYYY": "D. MMMM YYYY",
-	"MMMM DD, YYYY HH:mm": "D. MMMM YYYY, HH:mm",
-	"MMMM DD, YYYY hh:mm:ss A": "D. MMMM YYYY, hh:mm:ss a",
 	"Model": "Malli",
 	"Model '{{modelName}}' has been successfully downloaded.": "Malli '{{modelName}}' ladattiin onnistuneesti.",
 	"Model '{{modelTag}}' is already in queue for downloading.": "Malli '{{modelTag}}' on jo jonossa ladattavaksi.",
@@ -718,6 +719,7 @@
 	"Please enter a prompt": "Kirjoita kehote",
 	"Please fill in all fields.": "Täytä kaikki kentät.",
 	"Please select a model first.": "Valitse ensin malli.",
+	"Please select a model.": "",
 	"Please select a reason": "Valitse syy",
 	"Port": "Portti",
 	"Positive attitude": "Positiivinen asenne",
@@ -971,6 +973,7 @@
 	"Tools": "Työkalut",
 	"Tools Access": "Työkalujen käyttöoikeudet",
 	"Tools are a function calling system with arbitrary code execution": "Työkalut ovat toimintokutsuihin perustuva järjestelmä, joka sallii mielivaltaisen koodin suorittamisen",
+	"Tools Function Calling Prompt": "",
 	"Tools have a function calling system that allows arbitrary code execution": "Työkaluilla on toimintokutsuihin perustuva järjestelmä, joka sallii mielivaltaisen koodin suorittamisen",
 	"Tools have a function calling system that allows arbitrary code execution.": "Työkalut sallivat mielivaltaisen koodin suorittamisen toimintokutsuilla.",
 	"Top K": "Top K",
@@ -1070,6 +1073,7 @@
 	"You can personalize your interactions with LLMs by adding memories through the 'Manage' button below, making them more helpful and tailored to you.": "Voit personoida vuorovaikutustasi LLM-ohjelmien kanssa lisäämällä muistoja 'Hallitse'-painikkeen kautta, jolloin ne ovat hyödyllisempiä ja räätälöityjä sinua varten.",
 	"You cannot upload an empty file.": "Et voi ladata tyhjää tiedostoa.",
 	"You do not have permission to access this feature.": "",
+	"You do not have permission to upload files": "",
 	"You do not have permission to upload files.": "Sinulla ei ole lupaa ladata tiedostoja.",
 	"You have no archived conversations.": "Sinulla ei ole arkistoituja keskusteluja.",
 	"You have shared this chat": "Olet jakanut tämän keskustelun",

+ 8 - 4
src/lib/i18n/locales/fr-CA/translation.json

@@ -65,6 +65,8 @@
 	"Alternative to the top_p, and aims to ensure a balance of quality and variety. The parameter p represents the minimum probability for a token to be considered, relative to the probability of the most likely token. For example, with p=0.05 and the most likely token having a probability of 0.9, logits with a value less than 0.045 are filtered out. (Default: 0.0)": "",
 	"Amazing": "",
 	"an assistant": "un assistant",
+	"Analyzed": "",
+	"Analyzing...": "",
 	"and": "et",
 	"and {{COUNT}} more": "",
 	"and create a new shared link.": "et créer un nouveau lien partagé.",
@@ -169,9 +171,12 @@
 	"Clipboard write permission denied. Please check your browser settings to grant the necessary access.": "L'autorisation d'écriture du presse-papier a été refusée. Veuillez vérifier les paramètres de votre navigateur pour accorder l'accès nécessaire.",
 	"Clone": "Copie conforme",
 	"Clone Chat": "",
+	"Clone of {{TITLE}}": "",
 	"Close": "Fermer",
 	"Code execution": "",
 	"Code formatted successfully": "Le code a été formaté avec succès",
+	"Code Intepreter": "",
+	"Code interpreter": "",
 	"Collection": "Collection",
 	"Color": "",
 	"ComfyUI": "ComfyUI",
@@ -478,7 +483,6 @@
 	"Group Name": "",
 	"Group updated successfully": "",
 	"Groups": "",
-	"h:mm a": "h:mm a",
 	"Haptic Feedback": "",
 	"has no conversations.": "n'a aucune conversation.",
 	"Hello, {{name}}": "Bonjour, {{name}}.",
@@ -595,9 +599,6 @@
 	"Mirostat": "Mirostat",
 	"Mirostat Eta": "Mirostat Eta",
 	"Mirostat Tau": "Mirostat Tau",
-	"MMMM DD, YYYY": "DD MMMM YYYY",
-	"MMMM DD, YYYY HH:mm": "DD MMMM YYYY HH:mm",
-	"MMMM DD, YYYY hh:mm:ss A": "DD MMMM YYYY HH:mm:ss",
 	"Model": "",
 	"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.",
@@ -718,6 +719,7 @@
 	"Please enter a prompt": "",
 	"Please fill in all fields.": "",
 	"Please select a model first.": "",
+	"Please select a model.": "",
 	"Please select a reason": "",
 	"Port": "",
 	"Positive attitude": "Attitude positive",
@@ -971,6 +973,7 @@
 	"Tools": "Outils",
 	"Tools Access": "",
 	"Tools are a function calling system with arbitrary code execution": "",
+	"Tools Function Calling Prompt": "",
 	"Tools have a function calling system that allows arbitrary code execution": "",
 	"Tools have a function calling system that allows arbitrary code execution.": "",
 	"Top K": "Top K",
@@ -1070,6 +1073,7 @@
 	"You can personalize your interactions with LLMs by adding memories through the 'Manage' button below, making them more helpful and tailored to you.": "Vous pouvez personnaliser vos interactions avec les LLM en ajoutant des souvenirs via le bouton 'Gérer' ci-dessous, ce qui les rendra plus utiles et adaptés à vos besoins.",
 	"You cannot upload an empty file.": "",
 	"You do not have permission to access this feature.": "",
+	"You do not have permission to upload files": "",
 	"You do not have permission to upload files.": "",
 	"You have no archived conversations.": "Vous n'avez aucune conversation archivée",
 	"You have shared this chat": "Vous avez partagé cette conversation.",

+ 8 - 4
src/lib/i18n/locales/fr-FR/translation.json

@@ -65,6 +65,8 @@
 	"Alternative to the top_p, and aims to ensure a balance of quality and variety. The parameter p represents the minimum probability for a token to be considered, relative to the probability of the most likely token. For example, with p=0.05 and the most likely token having a probability of 0.9, logits with a value less than 0.045 are filtered out. (Default: 0.0)": "Alternative au top_p, visant à assurer un équilibre entre qualité et variété. Le paramètre p représente la probabilité minimale pour qu'un token soit pris en compte, par rapport à la probabilité du token le plus probable. Par exemple, avec p=0.05 et le token le plus probable ayant une probabilité de 0.9, les logits ayant une valeur inférieure à 0.045 sont filtrés. (Par défaut : 0.0)",
 	"Amazing": "Incroyable",
 	"an assistant": "un assistant",
+	"Analyzed": "",
+	"Analyzing...": "",
 	"and": "et",
 	"and {{COUNT}} more": "et {{COUNT}} autres",
 	"and create a new shared link.": "et créer un nouveau lien partagé.",
@@ -169,9 +171,12 @@
 	"Clipboard write permission denied. Please check your browser settings to grant the necessary access.": "L'autorisation d'écriture du presse-papier a été refusée. Veuillez vérifier les paramètres de votre navigateur pour accorder l'accès nécessaire.",
 	"Clone": "Cloner",
 	"Clone Chat": "Dupliquer le Chat",
+	"Clone of {{TITLE}}": "",
 	"Close": "Fermer",
 	"Code execution": "Exécution de code",
 	"Code formatted successfully": "Le code a été formaté avec succès",
+	"Code Intepreter": "",
+	"Code interpreter": "",
 	"Collection": "Collection",
 	"Color": "Couleur",
 	"ComfyUI": "ComfyUI",
@@ -478,7 +483,6 @@
 	"Group Name": "Nom du groupe",
 	"Group updated successfully": "Groupe mis à jour avec succès",
 	"Groups": "Groupes",
-	"h:mm a": "h:mm a",
 	"Haptic Feedback": "Retour haptique",
 	"has no conversations.": "n'a aucune conversation.",
 	"Hello, {{name}}": "Bonjour, {{name}}.",
@@ -595,9 +599,6 @@
 	"Mirostat": "Mirostat",
 	"Mirostat Eta": "Mirostat Eta",
 	"Mirostat Tau": "Mirostat Tau",
-	"MMMM DD, YYYY": "DD MMMM YYYY",
-	"MMMM DD, YYYY HH:mm": "DD MMMM YYYY HH:mm",
-	"MMMM DD, YYYY hh:mm:ss A": "DD MMMM YYYY HH:mm:ss",
 	"Model": "Modèle",
 	"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.",
@@ -718,6 +719,7 @@
 	"Please enter a prompt": "Veuillez saisir un prompt",
 	"Please fill in all fields.": "Veuillez remplir tous les champs.",
 	"Please select a model first.": "Veuillez d'abord sélectionner un modèle.",
+	"Please select a model.": "",
 	"Please select a reason": "Veuillez sélectionner une raison",
 	"Port": "Port",
 	"Positive attitude": "Attitude positive",
@@ -971,6 +973,7 @@
 	"Tools": "Outils",
 	"Tools Access": "Accès aux outils",
 	"Tools are a function calling system with arbitrary code execution": "Les outils sont un système d'appel de fonction avec exécution de code arbitraire",
+	"Tools Function Calling Prompt": "",
 	"Tools have a function calling system that allows arbitrary code execution": "Les outils ont un système d'appel de fonction qui permet l'exécution de code arbitraire",
 	"Tools have a function calling system that allows arbitrary code execution.": "Les outils ont un système d'appel de fonction qui permet l'exécution de code arbitraire.",
 	"Top K": "Top K",
@@ -1070,6 +1073,7 @@
 	"You can personalize your interactions with LLMs by adding memories through the 'Manage' button below, making them more helpful and tailored to you.": "Vous pouvez personnaliser vos interactions avec les LLM en ajoutant des mémoires à l'aide du bouton « Gérer » ci-dessous, ce qui les rendra plus utiles et mieux adaptées à vos besoins.",
 	"You cannot upload an empty file.": "Vous ne pouvez pas envoyer un fichier vide.",
 	"You do not have permission to access this feature.": "Vous n'avez pas la permission d'accéder à cette fonctionnalité.",
+	"You do not have permission to upload files": "",
 	"You do not have permission to upload files.": "Vous n'avez pas la permission de télécharger des fichiers.",
 	"You have no archived conversations.": "Vous n'avez aucune conversation archivée.",
 	"You have shared this chat": "Vous avez partagé cette conversation.",

+ 8 - 4
src/lib/i18n/locales/he-IL/translation.json

@@ -65,6 +65,8 @@
 	"Alternative to the top_p, and aims to ensure a balance of quality and variety. The parameter p represents the minimum probability for a token to be considered, relative to the probability of the most likely token. For example, with p=0.05 and the most likely token having a probability of 0.9, logits with a value less than 0.045 are filtered out. (Default: 0.0)": "",
 	"Amazing": "",
 	"an assistant": "עוזר",
+	"Analyzed": "",
+	"Analyzing...": "",
 	"and": "וגם",
 	"and {{COUNT}} more": "",
 	"and create a new shared link.": "וצור קישור משותף חדש.",
@@ -169,9 +171,12 @@
 	"Clipboard write permission denied. Please check your browser settings to grant the necessary access.": "",
 	"Clone": "שיבוט",
 	"Clone Chat": "",
+	"Clone of {{TITLE}}": "",
 	"Close": "סגור",
 	"Code execution": "",
 	"Code formatted successfully": "",
+	"Code Intepreter": "",
+	"Code interpreter": "",
 	"Collection": "אוסף",
 	"Color": "",
 	"ComfyUI": "ComfyUI",
@@ -478,7 +483,6 @@
 	"Group Name": "",
 	"Group updated successfully": "",
 	"Groups": "",
-	"h:mm a": "h:mm a",
 	"Haptic Feedback": "",
 	"has no conversations.": "אין שיחות.",
 	"Hello, {{name}}": "שלום, {{name}}",
@@ -595,9 +599,6 @@
 	"Mirostat": "Mirostat",
 	"Mirostat Eta": "Mirostat Eta",
 	"Mirostat Tau": "Mirostat Tau",
-	"MMMM DD, YYYY": "DD בMMMM, YYYY",
-	"MMMM DD, YYYY HH:mm": "DD בMMMM, YYYY HH:mm",
-	"MMMM DD, YYYY hh:mm:ss A": "",
 	"Model": "",
 	"Model '{{modelName}}' has been successfully downloaded.": "המודל '{{modelName}}' הורד בהצלחה.",
 	"Model '{{modelTag}}' is already in queue for downloading.": "המודל '{{modelTag}}' כבר בתור להורדה.",
@@ -718,6 +719,7 @@
 	"Please enter a prompt": "",
 	"Please fill in all fields.": "",
 	"Please select a model first.": "",
+	"Please select a model.": "",
 	"Please select a reason": "",
 	"Port": "",
 	"Positive attitude": "גישה חיובית",
@@ -971,6 +973,7 @@
 	"Tools": "",
 	"Tools Access": "",
 	"Tools are a function calling system with arbitrary code execution": "",
+	"Tools Function Calling Prompt": "",
 	"Tools have a function calling system that allows arbitrary code execution": "",
 	"Tools have a function calling system that allows arbitrary code execution.": "",
 	"Top K": "Top K",
@@ -1070,6 +1073,7 @@
 	"You can personalize your interactions with LLMs by adding memories through the 'Manage' button below, making them more helpful and tailored to you.": "",
 	"You cannot upload an empty file.": "",
 	"You do not have permission to access this feature.": "",
+	"You do not have permission to upload files": "",
 	"You do not have permission to upload files.": "",
 	"You have no archived conversations.": "אין לך שיחות בארכיון.",
 	"You have shared this chat": "שיתפת את השיחה הזו",

+ 8 - 4
src/lib/i18n/locales/hi-IN/translation.json

@@ -65,6 +65,8 @@
 	"Alternative to the top_p, and aims to ensure a balance of quality and variety. The parameter p represents the minimum probability for a token to be considered, relative to the probability of the most likely token. For example, with p=0.05 and the most likely token having a probability of 0.9, logits with a value less than 0.045 are filtered out. (Default: 0.0)": "",
 	"Amazing": "",
 	"an assistant": "एक सहायक",
+	"Analyzed": "",
+	"Analyzing...": "",
 	"and": "और",
 	"and {{COUNT}} more": "",
 	"and create a new shared link.": "और एक नई साझा लिंक बनाएं.",
@@ -169,9 +171,12 @@
 	"Clipboard write permission denied. Please check your browser settings to grant the necessary access.": "",
 	"Clone": "क्लोन",
 	"Clone Chat": "",
+	"Clone of {{TITLE}}": "",
 	"Close": "बंद करना",
 	"Code execution": "",
 	"Code formatted successfully": "",
+	"Code Intepreter": "",
+	"Code interpreter": "",
 	"Collection": "संग्रह",
 	"Color": "",
 	"ComfyUI": "ComfyUI",
@@ -478,7 +483,6 @@
 	"Group Name": "",
 	"Group updated successfully": "",
 	"Groups": "",
-	"h:mm a": "h:mm a",
 	"Haptic Feedback": "",
 	"has no conversations.": "कोई बातचीत नहीं है",
 	"Hello, {{name}}": "नमस्ते, {{name}}",
@@ -595,9 +599,6 @@
 	"Mirostat": "मिरोस्टा",
 	"Mirostat Eta": "मिरोस्टा ईटा",
 	"Mirostat Tau": "मिरोस्तात ताऊ",
-	"MMMM DD, YYYY": "MMMM DD, YYYY",
-	"MMMM DD, YYYY HH:mm": "MMMM DD, YYYY HH:mm",
-	"MMMM DD, YYYY hh:mm:ss A": "",
 	"Model": "",
 	"Model '{{modelName}}' has been successfully downloaded.": "मॉडल '{{modelName}}' सफलतापूर्वक डाउनलोड हो गया है।",
 	"Model '{{modelTag}}' is already in queue for downloading.": "मॉडल '{{modelTag}}' पहले से ही डाउनलोड करने के लिए कतार में है।",
@@ -718,6 +719,7 @@
 	"Please enter a prompt": "",
 	"Please fill in all fields.": "",
 	"Please select a model first.": "",
+	"Please select a model.": "",
 	"Please select a reason": "",
 	"Port": "",
 	"Positive attitude": "सकारात्मक रवैया",
@@ -971,6 +973,7 @@
 	"Tools": "",
 	"Tools Access": "",
 	"Tools are a function calling system with arbitrary code execution": "",
+	"Tools Function Calling Prompt": "",
 	"Tools have a function calling system that allows arbitrary code execution": "",
 	"Tools have a function calling system that allows arbitrary code execution.": "",
 	"Top K": "शीर्ष  K",
@@ -1070,6 +1073,7 @@
 	"You can personalize your interactions with LLMs by adding memories through the 'Manage' button below, making them more helpful and tailored to you.": "",
 	"You cannot upload an empty file.": "",
 	"You do not have permission to access this feature.": "",
+	"You do not have permission to upload files": "",
 	"You do not have permission to upload files.": "",
 	"You have no archived conversations.": "आपको कोई अंकित चैट नहीं है।",
 	"You have shared this chat": "आपने इस चैट को शेयर किया है",

+ 8 - 4
src/lib/i18n/locales/hr-HR/translation.json

@@ -65,6 +65,8 @@
 	"Alternative to the top_p, and aims to ensure a balance of quality and variety. The parameter p represents the minimum probability for a token to be considered, relative to the probability of the most likely token. For example, with p=0.05 and the most likely token having a probability of 0.9, logits with a value less than 0.045 are filtered out. (Default: 0.0)": "",
 	"Amazing": "",
 	"an assistant": "asistent",
+	"Analyzed": "",
+	"Analyzing...": "",
 	"and": "i",
 	"and {{COUNT}} more": "",
 	"and create a new shared link.": "i stvorite novu dijeljenu vezu.",
@@ -169,9 +171,12 @@
 	"Clipboard write permission denied. Please check your browser settings to grant the necessary access.": "",
 	"Clone": "Kloniraj",
 	"Clone Chat": "",
+	"Clone of {{TITLE}}": "",
 	"Close": "Zatvori",
 	"Code execution": "",
 	"Code formatted successfully": "",
+	"Code Intepreter": "",
+	"Code interpreter": "",
 	"Collection": "Kolekcija",
 	"Color": "",
 	"ComfyUI": "ComfyUI",
@@ -478,7 +483,6 @@
 	"Group Name": "",
 	"Group updated successfully": "",
 	"Groups": "",
-	"h:mm a": "h:mm a",
 	"Haptic Feedback": "",
 	"has no conversations.": "nema razgovora.",
 	"Hello, {{name}}": "Bok, {{name}}",
@@ -595,9 +599,6 @@
 	"Mirostat": "Mirostat",
 	"Mirostat Eta": "Mirostat Eta",
 	"Mirostat Tau": "Mirostat Tau",
-	"MMMM DD, YYYY": "MMMM DD, YYYY",
-	"MMMM DD, YYYY HH:mm": "MMMM DD, YYYY HH:mm",
-	"MMMM DD, YYYY hh:mm:ss A": "",
 	"Model": "",
 	"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.",
@@ -718,6 +719,7 @@
 	"Please enter a prompt": "",
 	"Please fill in all fields.": "",
 	"Please select a model first.": "",
+	"Please select a model.": "",
 	"Please select a reason": "",
 	"Port": "",
 	"Positive attitude": "Pozitivan stav",
@@ -971,6 +973,7 @@
 	"Tools": "Alati",
 	"Tools Access": "",
 	"Tools are a function calling system with arbitrary code execution": "",
+	"Tools Function Calling Prompt": "",
 	"Tools have a function calling system that allows arbitrary code execution": "",
 	"Tools have a function calling system that allows arbitrary code execution.": "",
 	"Top K": "Top K",
@@ -1070,6 +1073,7 @@
 	"You can personalize your interactions with LLMs by adding memories through the 'Manage' button below, making them more helpful and tailored to you.": "Možete personalizirati svoje interakcije s LLM-ima dodavanjem uspomena putem gumba 'Upravljanje' u nastavku, čineći ih korisnijima i prilagođenijima vama.",
 	"You cannot upload an empty file.": "",
 	"You do not have permission to access this feature.": "",
+	"You do not have permission to upload files": "",
 	"You do not have permission to upload files.": "",
 	"You have no archived conversations.": "Nemate arhiviranih razgovora.",
 	"You have shared this chat": "Podijelili ste ovaj razgovor",

+ 8 - 4
src/lib/i18n/locales/hu-HU/translation.json

@@ -65,6 +65,8 @@
 	"Alternative to the top_p, and aims to ensure a balance of quality and variety. The parameter p represents the minimum probability for a token to be considered, relative to the probability of the most likely token. For example, with p=0.05 and the most likely token having a probability of 0.9, logits with a value less than 0.045 are filtered out. (Default: 0.0)": "",
 	"Amazing": "",
 	"an assistant": "egy asszisztens",
+	"Analyzed": "",
+	"Analyzing...": "",
 	"and": "és",
 	"and {{COUNT}} more": "és még {{COUNT}} db",
 	"and create a new shared link.": "és hozz létre egy új megosztott linket.",
@@ -169,9 +171,12 @@
 	"Clipboard write permission denied. Please check your browser settings to grant the necessary access.": "Vágólap írási engedély megtagadva. Kérjük, ellenőrizd a böngésző beállításait a szükséges hozzáférés megadásához.",
 	"Clone": "Klónozás",
 	"Clone Chat": "",
+	"Clone of {{TITLE}}": "",
 	"Close": "Bezárás",
 	"Code execution": "Kód végrehajtás",
 	"Code formatted successfully": "Kód sikeresen formázva",
+	"Code Intepreter": "",
+	"Code interpreter": "",
 	"Collection": "Gyűjtemény",
 	"Color": "",
 	"ComfyUI": "ComfyUI",
@@ -478,7 +483,6 @@
 	"Group Name": "",
 	"Group updated successfully": "",
 	"Groups": "",
-	"h:mm a": "h:mm a",
 	"Haptic Feedback": "Tapintási visszajelzés",
 	"has no conversations.": "nincsenek beszélgetései.",
 	"Hello, {{name}}": "Helló, {{name}}",
@@ -595,9 +599,6 @@
 	"Mirostat": "Mirostat",
 	"Mirostat Eta": "Mirostat Eta",
 	"Mirostat Tau": "Mirostat Tau",
-	"MMMM DD, YYYY": "YYYY. MMMM DD.",
-	"MMMM DD, YYYY HH:mm": "YYYY. MMMM DD. HH:mm",
-	"MMMM DD, YYYY hh:mm:ss A": "YYYY. MMMM DD. hh:mm:ss A",
 	"Model": "Modell",
 	"Model '{{modelName}}' has been successfully downloaded.": "A '{{modelName}}' modell sikeresen letöltve.",
 	"Model '{{modelTag}}' is already in queue for downloading.": "A '{{modelTag}}' modell már a letöltési sorban van.",
@@ -718,6 +719,7 @@
 	"Please enter a prompt": "Kérjük, adjon meg egy promptot",
 	"Please fill in all fields.": "Kérjük, töltse ki az összes mezőt.",
 	"Please select a model first.": "",
+	"Please select a model.": "",
 	"Please select a reason": "Kérjük, válasszon egy okot",
 	"Port": "",
 	"Positive attitude": "Pozitív hozzáállás",
@@ -971,6 +973,7 @@
 	"Tools": "Eszközök",
 	"Tools Access": "",
 	"Tools are a function calling system with arbitrary code execution": "Az eszközök olyan függvényhívó rendszert alkotnak, amely tetszőleges kód végrehajtását teszi lehetővé",
+	"Tools Function Calling Prompt": "",
 	"Tools have a function calling system that allows arbitrary code execution": "Az eszközök olyan függvényhívó rendszerrel rendelkeznek, amely lehetővé teszi tetszőleges kód végrehajtását",
 	"Tools have a function calling system that allows arbitrary code execution.": "Az eszközök olyan függvényhívó rendszerrel rendelkeznek, amely lehetővé teszi tetszőleges kód végrehajtását.",
 	"Top K": "Top K",
@@ -1070,6 +1073,7 @@
 	"You can personalize your interactions with LLMs by adding memories through the 'Manage' button below, making them more helpful and tailored to you.": "Az LLM-ekkel való interakcióit személyre szabhatja emlékek hozzáadásával a lenti 'Kezelés' gomb segítségével, így azok még hasznosabbak és személyre szabottabbak lesznek.",
 	"You cannot upload an empty file.": "Nem tölthet fel üres fájlt.",
 	"You do not have permission to access this feature.": "",
+	"You do not have permission to upload files": "",
 	"You do not have permission to upload files.": "",
 	"You have no archived conversations.": "Nincsenek archivált beszélgetései.",
 	"You have shared this chat": "Megosztotta ezt a beszélgetést",

+ 8 - 4
src/lib/i18n/locales/id-ID/translation.json

@@ -65,6 +65,8 @@
 	"Alternative to the top_p, and aims to ensure a balance of quality and variety. The parameter p represents the minimum probability for a token to be considered, relative to the probability of the most likely token. For example, with p=0.05 and the most likely token having a probability of 0.9, logits with a value less than 0.045 are filtered out. (Default: 0.0)": "",
 	"Amazing": "",
 	"an assistant": "asisten",
+	"Analyzed": "",
+	"Analyzing...": "",
 	"and": "dan",
 	"and {{COUNT}} more": "",
 	"and create a new shared link.": "dan membuat tautan bersama baru.",
@@ -169,9 +171,12 @@
 	"Clipboard write permission denied. Please check your browser settings to grant the necessary access.": "Izin menulis papan klip ditolak. Periksa pengaturan peramban Anda untuk memberikan akses yang diperlukan.",
 	"Clone": "Kloning",
 	"Clone Chat": "",
+	"Clone of {{TITLE}}": "",
 	"Close": "Tutup",
 	"Code execution": "",
 	"Code formatted successfully": "Kode berhasil diformat",
+	"Code Intepreter": "",
+	"Code interpreter": "",
 	"Collection": "Koleksi",
 	"Color": "",
 	"ComfyUI": "ComfyUI",
@@ -478,7 +483,6 @@
 	"Group Name": "",
 	"Group updated successfully": "",
 	"Groups": "",
-	"h:mm a": "h:mm a",
 	"Haptic Feedback": "",
 	"has no conversations.": "tidak memiliki percakapan.",
 	"Hello, {{name}}": "Halo, {{name}}",
@@ -595,9 +599,6 @@
 	"Mirostat": "Mirostat",
 	"Mirostat Eta": "Mirostat Eta",
 	"Mirostat Tau": "Mirostat Tau",
-	"MMMM DD, YYYY": "MMMM DD, YYYY",
-	"MMMM DD, YYYY HH:mm": "MMMM DD, YYYY HH: mm",
-	"MMMM DD, YYYY hh:mm:ss A": "MMMM DD, YYYY jj: mm: dd A",
 	"Model": "",
 	"Model '{{modelName}}' has been successfully downloaded.": "Model '{{modelName}}' telah berhasil diunduh.",
 	"Model '{{modelTag}}' is already in queue for downloading.": "Model '{{modelTag}}' sudah berada dalam antrean untuk diunduh.",
@@ -718,6 +719,7 @@
 	"Please enter a prompt": "",
 	"Please fill in all fields.": "",
 	"Please select a model first.": "",
+	"Please select a model.": "",
 	"Please select a reason": "",
 	"Port": "",
 	"Positive attitude": "Sikap positif",
@@ -971,6 +973,7 @@
 	"Tools": "Alat",
 	"Tools Access": "",
 	"Tools are a function calling system with arbitrary code execution": "",
+	"Tools Function Calling Prompt": "",
 	"Tools have a function calling system that allows arbitrary code execution": "",
 	"Tools have a function calling system that allows arbitrary code execution.": "",
 	"Top K": "K atas",
@@ -1070,6 +1073,7 @@
 	"You can personalize your interactions with LLMs by adding memories through the 'Manage' button below, making them more helpful and tailored to you.": "Anda dapat mempersonalisasi interaksi Anda dengan LLM dengan menambahkan kenangan melalui tombol 'Kelola' di bawah ini, sehingga lebih bermanfaat dan disesuaikan untuk Anda.",
 	"You cannot upload an empty file.": "",
 	"You do not have permission to access this feature.": "",
+	"You do not have permission to upload files": "",
 	"You do not have permission to upload files.": "",
 	"You have no archived conversations.": "Anda tidak memiliki percakapan yang diarsipkan.",
 	"You have shared this chat": "Anda telah membagikan obrolan ini",

+ 8 - 4
src/lib/i18n/locales/ie-GA/translation.json

@@ -65,6 +65,8 @@
 	"Alternative to the top_p, and aims to ensure a balance of quality and variety. The parameter p represents the minimum probability for a token to be considered, relative to the probability of the most likely token. For example, with p=0.05 and the most likely token having a probability of 0.9, logits with a value less than 0.045 are filtered out. (Default: 0.0)": "Rogha eile seachas an top_p, agus tá sé mar aidhm aige cothromaíocht cáilíochta agus éagsúlachta a chinntiú. Léiríonn an paraiméadar p an dóchúlacht íosta go mbreithneofar comhartha, i gcoibhneas le dóchúlacht an chomhartha is dóichí. Mar shampla, le p=0.05 agus dóchúlacht 0.9 ag an comhartha is dóichí, déantar logits le luach níos lú ná 0.045 a scagadh amach. (Réamhshocrú: 0.0)",
 	"Amazing": "Iontach",
 	"an assistant": "cúntóir",
+	"Analyzed": "",
+	"Analyzing...": "",
 	"and": "agus",
 	"and {{COUNT}} more": "agus {{COUNT}} eile",
 	"and create a new shared link.": "agus cruthaigh nasc nua roinnte.",
@@ -169,9 +171,12 @@
 	"Clipboard write permission denied. Please check your browser settings to grant the necessary access.": "Diúltaíodh cead scríofa an ghearrthaisce. Seiceáil socruithe do bhrabhsálaí chun an rochtain riachtanach a dheonú.",
 	"Clone": "Clón",
 	"Clone Chat": "Comhrá Clón",
+	"Clone of {{TITLE}}": "",
 	"Close": "Dún",
 	"Code execution": "Cód a fhorghníomhú",
 	"Code formatted successfully": "Cód formáidithe go rathúil",
+	"Code Intepreter": "",
+	"Code interpreter": "",
 	"Collection": "Bailiúchán",
 	"Color": "Dath",
 	"ComfyUI": "ComfyUI",
@@ -478,7 +483,6 @@
 	"Group Name": "Ainm an Ghrúpa",
 	"Group updated successfully": "D'éirigh le nuashonrú an ghrúpa",
 	"Groups": "Grúpaí",
-	"h:mm a": "h:mm a",
 	"Haptic Feedback": "Aiseolas Haptic",
 	"has no conversations.": "níl aon chomhráite aige.",
 	"Hello, {{name}}": "Dia duit, {{name}}",
@@ -595,9 +599,6 @@
 	"Mirostat": "Mirostat",
 	"Mirostat Eta": "Mirostat Eta",
 	"Mirostat Tau": "Mirostat Tau",
-	"MMMM DD, YYYY": "MMMM LL, BBBB",
-	"MMMM DD, YYYY HH:mm": "MMMM LL, BBBB UU:nn",
-	"MMMM DD, YYYY hh:mm:ss A": "MMMM LL, BBBB uu:nn:ss A",
 	"Model": "Múnla",
 	"Model '{{modelName}}' has been successfully downloaded.": "Rinneadh an tsamhail '{{modelName}}' a íoslódáil go rathúil.",
 	"Model '{{modelTag}}' is already in queue for downloading.": "Tá múnla ‘{{modelTag}}’ sa scuaine cheana féin le híoslódáil.",
@@ -718,6 +719,7 @@
 	"Please enter a prompt": "Cuir isteach leid",
 	"Please fill in all fields.": "Líon isteach gach réimse le do thoil.",
 	"Please select a model first.": "Roghnaigh munla ar dtús le do thoil.",
+	"Please select a model.": "",
 	"Please select a reason": "Roghnaigh cúis le do thoil",
 	"Port": "Port",
 	"Positive attitude": "Dearcadh dearfach",
@@ -971,6 +973,7 @@
 	"Tools": "Uirlisí",
 	"Tools Access": "Rochtain Uirlisí",
 	"Tools are a function calling system with arbitrary code execution": "Is córas glaonna feidhme iad uirlisí le forghníomhú cód treallach",
+	"Tools Function Calling Prompt": "",
 	"Tools have a function calling system that allows arbitrary code execution": "Tá córas glaonna feidhme ag uirlisí a cheadaíonn forghníomhú cód treallach",
 	"Tools have a function calling system that allows arbitrary code execution.": "Tá córas glaonna feidhme ag uirlisí a cheadaíonn forghníomhú cód treallach.",
 	"Top K": "Barr K",
@@ -1070,6 +1073,7 @@
 	"You can personalize your interactions with LLMs by adding memories through the 'Manage' button below, making them more helpful and tailored to you.": "Is féidir leat do chuid idirghníomhaíochtaí le LLManna a phearsantú ach cuimhní cinn a chur leis tríd an gcnaipe 'Bainistigh' thíos, rud a fhágann go mbeidh siad níos cabhrach agus níos oiriúnaí duit.",
 	"You cannot upload an empty file.": "Ní féidir leat comhad folamh a uaslódáil.",
 	"You do not have permission to access this feature.": "",
+	"You do not have permission to upload files": "",
 	"You do not have permission to upload files.": "Níl cead agat comhaid a uaslódáil.",
 	"You have no archived conversations.": "Níl aon chomhráite cartlainne agat.",
 	"You have shared this chat": "Tá an comhrá seo roinnte agat",

+ 8 - 4
src/lib/i18n/locales/it-IT/translation.json

@@ -65,6 +65,8 @@
 	"Alternative to the top_p, and aims to ensure a balance of quality and variety. The parameter p represents the minimum probability for a token to be considered, relative to the probability of the most likely token. For example, with p=0.05 and the most likely token having a probability of 0.9, logits with a value less than 0.045 are filtered out. (Default: 0.0)": "",
 	"Amazing": "",
 	"an assistant": "un assistente",
+	"Analyzed": "",
+	"Analyzing...": "",
 	"and": "e",
 	"and {{COUNT}} more": "",
 	"and create a new shared link.": "e crea un nuovo link condiviso.",
@@ -169,9 +171,12 @@
 	"Clipboard write permission denied. Please check your browser settings to grant the necessary access.": "",
 	"Clone": "Clone",
 	"Clone Chat": "",
+	"Clone of {{TITLE}}": "",
 	"Close": "Chiudi",
 	"Code execution": "",
 	"Code formatted successfully": "",
+	"Code Intepreter": "",
+	"Code interpreter": "",
 	"Collection": "Collezione",
 	"Color": "",
 	"ComfyUI": "ComfyUI",
@@ -478,7 +483,6 @@
 	"Group Name": "",
 	"Group updated successfully": "",
 	"Groups": "",
-	"h:mm a": "h:mm a",
 	"Haptic Feedback": "",
 	"has no conversations.": "non ha conversazioni.",
 	"Hello, {{name}}": "Ciao, {{name}}",
@@ -595,9 +599,6 @@
 	"Mirostat": "Mirostat",
 	"Mirostat Eta": "Mirostat Eta",
 	"Mirostat Tau": "Mirostat Tau",
-	"MMMM DD, YYYY": "MMMM DD, YYYY",
-	"MMMM DD, YYYY HH:mm": "MMMM DD, YYYY HH:mm",
-	"MMMM DD, YYYY hh:mm:ss A": "",
 	"Model": "",
 	"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.",
@@ -718,6 +719,7 @@
 	"Please enter a prompt": "",
 	"Please fill in all fields.": "",
 	"Please select a model first.": "",
+	"Please select a model.": "",
 	"Please select a reason": "",
 	"Port": "",
 	"Positive attitude": "Attitudine positiva",
@@ -971,6 +973,7 @@
 	"Tools": "",
 	"Tools Access": "",
 	"Tools are a function calling system with arbitrary code execution": "",
+	"Tools Function Calling Prompt": "",
 	"Tools have a function calling system that allows arbitrary code execution": "",
 	"Tools have a function calling system that allows arbitrary code execution.": "",
 	"Top K": "Top K",
@@ -1070,6 +1073,7 @@
 	"You can personalize your interactions with LLMs by adding memories through the 'Manage' button below, making them more helpful and tailored to you.": "",
 	"You cannot upload an empty file.": "",
 	"You do not have permission to access this feature.": "",
+	"You do not have permission to upload files": "",
 	"You do not have permission to upload files.": "",
 	"You have no archived conversations.": "Non hai conversazioni archiviate.",
 	"You have shared this chat": "Hai condiviso questa chat",

+ 9 - 5
src/lib/i18n/locales/ja-JP/translation.json

@@ -65,6 +65,8 @@
 	"Alternative to the top_p, and aims to ensure a balance of quality and variety. The parameter p represents the minimum probability for a token to be considered, relative to the probability of the most likely token. For example, with p=0.05 and the most likely token having a probability of 0.9, logits with a value less than 0.045 are filtered out. (Default: 0.0)": "",
 	"Amazing": "",
 	"an assistant": "アシスタント",
+	"Analyzed": "",
+	"Analyzing...": "",
 	"and": "および",
 	"and {{COUNT}} more": "",
 	"and create a new shared link.": "し、新しい共有リンクを作成します。",
@@ -169,9 +171,12 @@
 	"Clipboard write permission denied. Please check your browser settings to grant the necessary access.": "クリップボードへの書き込み許可がありません。ブラウザ設定を確認し許可してください。",
 	"Clone": "クローン",
 	"Clone Chat": "",
+	"Clone of {{TITLE}}": "",
 	"Close": "閉じる",
 	"Code execution": "",
 	"Code formatted successfully": "コードフォーマットに成功しました",
+	"Code Intepreter": "",
+	"Code interpreter": "",
 	"Collection": "コレクション",
 	"Color": "",
 	"ComfyUI": "ComfyUI",
@@ -478,7 +483,6 @@
 	"Group Name": "",
 	"Group updated successfully": "",
 	"Groups": "",
-	"h:mm a": "h:mm a",
 	"Haptic Feedback": "触覚フィードバック",
 	"has no conversations.": "対話はありません。",
 	"Hello, {{name}}": "こんにちは、{{name}} さん",
@@ -595,9 +599,6 @@
 	"Mirostat": "ミロスタット",
 	"Mirostat Eta": "ミロスタット Eta",
 	"Mirostat Tau": "ミロスタット Tau",
-	"MMMM DD, YYYY": "MMMM DD, YYYY",
-	"MMMM DD, YYYY HH:mm": "MMMM DD, YYYY HH:mm",
-	"MMMM DD, YYYY hh:mm:ss A": "",
 	"Model": "",
 	"Model '{{modelName}}' has been successfully downloaded.": "モデル '{{modelName}}' が正常にダウンロードされました。",
 	"Model '{{modelTag}}' is already in queue for downloading.": "モデル '{{modelTag}}' はすでにダウンロード待ち行列に入っています。",
@@ -718,6 +719,7 @@
 	"Please enter a prompt": "",
 	"Please fill in all fields.": "",
 	"Please select a model first.": "",
+	"Please select a model.": "",
 	"Please select a reason": "",
 	"Port": "",
 	"Positive attitude": "前向きな態度",
@@ -766,7 +768,7 @@
 	"Reset": "",
 	"Reset All Models": "",
 	"Reset Upload Directory": "アップロードディレクトリをリセット",
-	"Reset Vector Storage/Knowledge": "ベクターストレージとナレッジべーうをリセット",
+	"Reset Vector Storage/Knowledge": "ベクターストレージとナレッジベースをリセット",
 	"Reset view": "",
 	"Response notifications cannot be activated as the website permissions have been denied. Please visit your browser settings to grant the necessary access.": "",
 	"Response splitting": "応答の分割",
@@ -971,6 +973,7 @@
 	"Tools": "ツール",
 	"Tools Access": "",
 	"Tools are a function calling system with arbitrary code execution": "",
+	"Tools Function Calling Prompt": "",
 	"Tools have a function calling system that allows arbitrary code execution": "",
 	"Tools have a function calling system that allows arbitrary code execution.": "",
 	"Top K": "トップ K",
@@ -1070,6 +1073,7 @@
 	"You can personalize your interactions with LLMs by adding memories through the 'Manage' button below, making them more helpful and tailored to you.": "",
 	"You cannot upload an empty file.": "",
 	"You do not have permission to access this feature.": "",
+	"You do not have permission to upload files": "",
 	"You do not have permission to upload files.": "",
 	"You have no archived conversations.": "これまでにアーカイブされた会話はありません。",
 	"You have shared this chat": "このチャットを共有しました",

+ 8 - 4
src/lib/i18n/locales/ka-GE/translation.json

@@ -65,6 +65,8 @@
 	"Alternative to the top_p, and aims to ensure a balance of quality and variety. The parameter p represents the minimum probability for a token to be considered, relative to the probability of the most likely token. For example, with p=0.05 and the most likely token having a probability of 0.9, logits with a value less than 0.045 are filtered out. (Default: 0.0)": "",
 	"Amazing": "",
 	"an assistant": "ასისტენტი",
+	"Analyzed": "",
+	"Analyzing...": "",
 	"and": "და",
 	"and {{COUNT}} more": "",
 	"and create a new shared link.": "და შექმენით ახალი გაზიარებული ბმული.",
@@ -169,9 +171,12 @@
 	"Clipboard write permission denied. Please check your browser settings to grant the necessary access.": "",
 	"Clone": "კლონი",
 	"Clone Chat": "",
+	"Clone of {{TITLE}}": "",
 	"Close": "დახურვა",
 	"Code execution": "",
 	"Code formatted successfully": "",
+	"Code Intepreter": "",
+	"Code interpreter": "",
 	"Collection": "ნაკრები",
 	"Color": "",
 	"ComfyUI": "ComfyUI",
@@ -478,7 +483,6 @@
 	"Group Name": "",
 	"Group updated successfully": "",
 	"Groups": "",
-	"h:mm a": "h:mm a",
 	"Haptic Feedback": "",
 	"has no conversations.": "არა უფლება ჩაწერა",
 	"Hello, {{name}}": "გამარჯობა, {{name}}",
@@ -595,9 +599,6 @@
 	"Mirostat": "მიროსტატი",
 	"Mirostat Eta": "მიროსტატი ეტა",
 	"Mirostat Tau": "მიროსტატი ტაუ",
-	"MMMM DD, YYYY": "თვე დღე, წელი",
-	"MMMM DD, YYYY HH:mm": "თვე დღე, წელი HH:mm",
-	"MMMM DD, YYYY hh:mm:ss A": "",
 	"Model": "",
 	"Model '{{modelName}}' has been successfully downloaded.": "მოდელი „{{modelName}}“ წარმატებით ჩამოიტვირთა.",
 	"Model '{{modelTag}}' is already in queue for downloading.": "მოდელი „{{modelTag}}“ უკვე ჩამოტვირთვის რიგშია.",
@@ -718,6 +719,7 @@
 	"Please enter a prompt": "",
 	"Please fill in all fields.": "",
 	"Please select a model first.": "",
+	"Please select a model.": "",
 	"Please select a reason": "",
 	"Port": "",
 	"Positive attitude": "პოზიტიური ანგარიში",
@@ -971,6 +973,7 @@
 	"Tools": "",
 	"Tools Access": "",
 	"Tools are a function calling system with arbitrary code execution": "",
+	"Tools Function Calling Prompt": "",
 	"Tools have a function calling system that allows arbitrary code execution": "",
 	"Tools have a function calling system that allows arbitrary code execution.": "",
 	"Top K": "ტოპ K",
@@ -1070,6 +1073,7 @@
 	"You can personalize your interactions with LLMs by adding memories through the 'Manage' button below, making them more helpful and tailored to you.": "",
 	"You cannot upload an empty file.": "",
 	"You do not have permission to access this feature.": "",
+	"You do not have permission to upload files": "",
 	"You do not have permission to upload files.": "",
 	"You have no archived conversations.": "არ ხართ არქივირებული განხილვები.",
 	"You have shared this chat": "ამ ჩატის გააგზავნა",

+ 91 - 87
src/lib/i18n/locales/ko-KR/translation.json

@@ -8,39 +8,39 @@
 	"{{COUNT}} Replies": "",
 	"{{user}}'s Chats": "{{user}}의 채팅",
 	"{{webUIName}} Backend Required": "{{webUIName}} 백엔드가 필요합니다.",
-	"*Prompt node ID(s) are required for image generation": "사진 생성을 위해 프롬트 노드 ID가 필요합니다",
+	"*Prompt node ID(s) are required for image generation": "사진 생성을 위해 프롬트 노드 ID가 필요합니다",
 	"A new version (v{{LATEST_VERSION}}) is now available.": "최신 버전 (v{{LATEST_VERSION}})이 가능합니다",
 	"A task model is used when performing tasks such as generating titles for chats and web search queries": "작업 모델은 채팅 및 웹 검색 쿼리에 대한 제목 생성 등의 작업 수행 시 사용됩니다.",
 	"a user": "사용자",
 	"About": "정보",
-	"Access": "",
-	"Access Control": "",
+	"Access": "접근",
+	"Access Control": "접근 제어",
 	"Accessible to all users": "모든 사용자가 접근 가능",
 	"Account": "계정",
 	"Account Activation Pending": "계정 활성화 대기",
 	"Accurate information": "정확한 정보",
 	"Actions": "행동",
-	"Activate this command by typing \"/{{COMMAND}}\" to chat input.": "",
+	"Activate this command by typing \"/{{COMMAND}}\" to chat input.": "채팅에서 \"{{COMMAND}}\"을 입력하여 이 명령을 활성화할 수 있습니다.",
 	"Active Users": "활성 사용자",
 	"Add": "추가",
-	"Add a model ID": "",
+	"Add a model ID": "모델 ID 추가",
 	"Add a short description about what this model does": "모델의 기능에 대한 간단한 설명 추가",
 	"Add a tag": "태그 추가",
 	"Add Arena Model": "아레나 모델 추가",
-	"Add Connection": "",
+	"Add Connection": "연결 추가",
 	"Add Content": "내용 추가",
 	"Add content here": "여기에 내용을 추가하세요",
 	"Add custom prompt": "사용자 정의 프롬프트 추가",
 	"Add Files": "파일 추가",
-	"Add Group": "",
+	"Add Group": "그룹 추가",
 	"Add Memory": "메모리 추가",
 	"Add Model": "모델 추가",
-	"Add Reaction": "",
+	"Add Reaction": "리액션 추가",
 	"Add Tag": "태그 추가",
 	"Add Tags": "태그 추가",
 	"Add text content": "글 추가",
 	"Add User": "사용자 추가",
-	"Add User Group": "",
+	"Add User Group": "사용자 그룹 추가",
 	"Adjusting these settings will apply changes universally to all users.": "위와 같이 설정시 모든 사용자에게 적용됩니다.",
 	"admin": "관리자",
 	"Admin": "관리자",
@@ -50,12 +50,12 @@
 	"Advanced Parameters": "고급 매개변수",
 	"Advanced Params": "고급 매개변수",
 	"All Documents": "모든 문서",
-	"All models deleted successfully": "",
-	"Allow Chat Controls": "",
-	"Allow Chat Delete": "",
+	"All models deleted successfully": "성공적으로 모든 모델이 삭제되었습니다",
+	"Allow Chat Controls": "채팅 제어 허용",
+	"Allow Chat Delete": "채팅 삭제 허용",
 	"Allow Chat Deletion": "채팅 삭제 허용",
-	"Allow Chat Edit": "",
-	"Allow File Upload": "",
+	"Allow Chat Edit": "채팅 수정 허용",
+	"Allow File Upload": "파일 업로드 허용",
 	"Allow non-local voices": "외부 음성 허용",
 	"Allow Temporary Chat": "임시 채팅 허용",
 	"Allow User Location": "사용자 위치 활용 허용",
@@ -65,6 +65,8 @@
 	"Alternative to the top_p, and aims to ensure a balance of quality and variety. The parameter p represents the minimum probability for a token to be considered, relative to the probability of the most likely token. For example, with p=0.05 and the most likely token having a probability of 0.9, logits with a value less than 0.045 are filtered out. (Default: 0.0)": "",
 	"Amazing": "놀라움",
 	"an assistant": "어시스턴트",
+	"Analyzed": "",
+	"Analyzing...": "",
 	"and": "그리고",
 	"and {{COUNT}} more": "그리고 {{COUNT}} 더",
 	"and create a new shared link.": "새로운 공유 링크를 생성합니다.",
@@ -75,15 +77,15 @@
 	"API keys": "API 키",
 	"Application DN": "",
 	"Application DN Password": "",
-	"applies to all users with the \"user\" role": "",
+	"applies to all users with the \"user\" role": "\"사용자\" 권한의 모든 사용자에게 적용됩니다",
 	"April": "4월",
 	"Archive": "보관",
 	"Archive All Chats": "모든 채팅 보관",
 	"Archived Chats": "보관된 채팅",
 	"archived-chat-export": "",
-	"Are you sure you want to delete this channel?": "",
-	"Are you sure you want to delete this message?": "",
-	"Are you sure you want to unarchive all archived chats?": "",
+	"Are you sure you want to delete this channel?": "정말 이 채널을 삭제하시겠습니까?",
+	"Are you sure you want to delete this message?": "정말 이 메세지를 삭제하시겠습니까?",
+	"Are you sure you want to unarchive all archived chats?": "정말 보관된 모든 채팅을 보관 해제하시겠습니까?",
 	"Are you sure?": "확실합니까?",
 	"Arena Models": "아레나 모델",
 	"Artifacts": "아티팩트",
@@ -141,7 +143,7 @@
 	"Chat Controls": "채팅 제어",
 	"Chat direction": "채팅 방향",
 	"Chat Overview": "채팅",
-	"Chat Permissions": "",
+	"Chat Permissions": "채팅 권한",
 	"Chat Tags Auto-Generation": "채팅 태그 자동생성",
 	"Chats": "채팅",
 	"Check Again": "다시 확인",
@@ -169,9 +171,12 @@
 	"Clipboard write permission denied. Please check your browser settings to grant the necessary access.": "클립보드 사용 권한이 거절되었습니다. 필요한 접근을 사용하기 위해 브라우져 설정을 확인 부탁드립니다.",
 	"Clone": "복제",
 	"Clone Chat": "",
+	"Clone of {{TITLE}}": "",
 	"Close": "닫기",
 	"Code execution": "코드 실행",
 	"Code formatted successfully": "성공적으로 코드가 생성되었습니다",
+	"Code Intepreter": "",
+	"Code interpreter": "",
 	"Collection": "컬렉션",
 	"Color": "",
 	"ComfyUI": "ComfyUI",
@@ -210,16 +215,16 @@
 	"Copy Link": "링크 복사",
 	"Copy to clipboard": "클립보드에 복사",
 	"Copying to clipboard was successful!": "성공적으로 클립보드에 복사되었습니다!",
-	"Create": "",
-	"Create a knowledge base": "",
-	"Create a model": "모델 만들기",
-	"Create Account": "계정 만들기",
-	"Create Admin Account": "",
-	"Create Channel": "",
-	"Create Group": "",
-	"Create Knowledge": "지식 만들기",
-	"Create new key": "새 키 만들기",
-	"Create new secret key": "새 비밀 키 만들기",
+	"Create": "생성",
+	"Create a knowledge base": "지식 기반 생성",
+	"Create a model": "모델 생성",
+	"Create Account": "계정 생성",
+	"Create Admin Account": "관리자 계정 생성",
+	"Create Channel": "채널 생성",
+	"Create Group": "그룹 생성",
+	"Create Knowledge": "지식 생성",
+	"Create new key": "새로운 키 생성",
+	"Create new secret key": "새로운 비밀 키 생성",
 	"Created at": "생성일",
 	"Created At": "생성일",
 	"Created by": "생성자",
@@ -236,8 +241,8 @@
 	"Default Model": "기본 모델",
 	"Default model updated": "기본 모델이 업데이트되었습니다.",
 	"Default Models": "기본 모델",
-	"Default permissions": "",
-	"Default permissions updated successfully": "",
+	"Default permissions": "기본 권한",
+	"Default permissions updated successfully": "성공적으로 기본 권한이 수정되었습니다",
 	"Default Prompt Suggestions": "기본 프롬프트 제안",
 	"Default to 389 or 636 if TLS is enabled": "",
 	"Default to ALL": "",
@@ -245,21 +250,21 @@
 	"Delete": "삭제",
 	"Delete a model": "모델 삭제",
 	"Delete All Chats": "모든 채팅 삭제",
-	"Delete All Models": "",
+	"Delete All Models": "모든 모델 삭제",
 	"Delete chat": "채팅 삭제",
 	"Delete Chat": "채팅 삭제",
 	"Delete chat?": "채팅을 삭제하겠습니까?",
 	"Delete folder?": "폴더를 삭제하시겠습니까?",
 	"Delete function?": "함수를 삭제하시겠습니까?",
 	"Delete Message": "",
-	"Delete prompt?": "프롬트를 삭제하시겠습니까?",
+	"Delete prompt?": "프롬트를 삭제하시겠습니까?",
 	"delete this link": "이 링크를 삭제합니다.",
 	"Delete tool?": "도구를 삭제하시겠습니까?",
 	"Delete User": "사용자 삭제",
 	"Deleted {{deleteModelTag}}": "{{deleteModelTag}} 삭제됨",
 	"Deleted {{name}}": "{{name}}을(를) 삭제했습니다.",
-	"Deleted User": "",
-	"Describe your knowledge base and objectives": "",
+	"Deleted User": "삭제된 사용자",
+	"Describe your knowledge base and objectives": "지식 기반에 대한 설명과 목적을 입력하세요",
 	"Description": "설명",
 	"Didn't fully follow instructions": "완전히 지침을 따르지 않음",
 	"Disabled": "제한됨",
@@ -370,7 +375,7 @@
 	"Enter server label": "",
 	"Enter server port": "",
 	"Enter stop sequence": "중지 시퀀스 입력",
-	"Enter system prompt": "시스템 프롬트 입력",
+	"Enter system prompt": "시스템 프롬트 입력",
 	"Enter Tavily API Key": "Tavily API 키 입력",
 	"Enter the public URL of your WebUI. This URL will be used to generate links in the notifications.": "WebUI의 공개 URL을 입력해 주세요. 이 URL은 알림에서 링크를 생성하는 데 사용합니다.",
 	"Enter Tika Server URL": "Tika 서버 URL 입력",
@@ -419,10 +424,10 @@
 	"Failed to save models configuration": "",
 	"Failed to update settings": "설정 업데이트에 실패하였습니다.",
 	"Failed to upload file.": "파일 업로드에 실패했습니다",
-	"Features Permissions": "",
+	"Features Permissions": "기능 권한",
 	"February": "2월",
 	"Feedback History": "피드백 기록",
-	"Feedbacks": "",
+	"Feedbacks": "피드백",
 	"Feel free to add specific details": "자세한 내용을 자유롭게 추가하세요.",
 	"File": "파일",
 	"File added successfully.": "성공적으로 파일이 추가되었습니다",
@@ -472,13 +477,12 @@
 	"Google Drive": "",
 	"Google PSE API Key": "Google PSE API 키",
 	"Google PSE Engine Id": "Google PSE 엔진 ID",
-	"Group created successfully": "",
-	"Group deleted successfully": "",
-	"Group Description": "",
-	"Group Name": "",
-	"Group updated successfully": "",
-	"Groups": "",
-	"h:mm a": "h:mm a",
+	"Group created successfully": "성공적으로 그룹을 생성했습니다",
+	"Group deleted successfully": "성공적으로 그룹을 삭제했습니다",
+	"Group Description": "그룹 설명",
+	"Group Name": "그룹 명",
+	"Group updated successfully": "성공적으로 그룹을 수정했습니다",
+	"Groups": "그룹",
 	"Haptic Feedback": "햅틱 피드백",
 	"has no conversations.": "대화가 없습니다.",
 	"Hello, {{name}}": "안녕하세요, {{name}}",
@@ -494,13 +498,13 @@
 	"I acknowledge that I have read and I understand the implications of my action. I am aware of the risks associated with executing arbitrary code and I have verified the trustworthiness of the source.": "",
 	"ID": "ID",
 	"Ignite curiosity": "",
-	"Image": "",
+	"Image": "이미지",
 	"Image Compression": "이미지 압축",
-	"Image generation": "",
-	"Image Generation": "",
+	"Image generation": "이미지 생성",
+	"Image Generation": "이미지 생성",
 	"Image Generation (Experimental)": "이미지 생성(실험적)",
 	"Image Generation Engine": "이미지 생성 엔진",
-	"Image Max Compression Size": "",
+	"Image Max Compression Size": "이미지 최대 압축 크기",
 	"Image Prompt Generation": "",
 	"Image Prompt Generation Prompt": "",
 	"Image Settings": "이미지 설정",
@@ -538,7 +542,7 @@
 	"Key": "",
 	"Keyboard shortcuts": "키보드 단축키",
 	"Knowledge": "지식 기반",
-	"Knowledge Access": "",
+	"Knowledge Access": "지식 접근",
 	"Knowledge created successfully.": "성공적으로 지식 기반이 생성되었습니다",
 	"Knowledge deleted successfully.": "성공적으로 지식 기반이 삭제되었습니다",
 	"Knowledge reset successfully.": "성공적으로 지식 기반이 초기화되었습니다",
@@ -556,7 +560,7 @@
 	"Leave empty to include all models from \"{{URL}}/api/tags\" endpoint": "",
 	"Leave empty to include all models from \"{{URL}}/models\" endpoint": "",
 	"Leave empty to include all models or select specific models": "특정 모델을 선택하거나 모든 모델을 포함하고 싶으면 빈칸으로 남겨두세요",
-	"Leave empty to use the default prompt, or enter a custom prompt": "기본 프롬포트를 사용하기 위해 빈칸으로 남겨두거나, 커스텀 프롬포트를 입력하세요",
+	"Leave empty to use the default prompt, or enter a custom prompt": "기본 프롬프트를 사용하기 위해 빈칸으로 남겨두거나, 커스텀 프롬프트를 입력하세요",
 	"Light": "라이트",
 	"Listening...": "듣는 중...",
 	"Llama.cpp": "",
@@ -595,9 +599,6 @@
 	"Mirostat": "Mirostat",
 	"Mirostat Eta": "Mirostat Eta",
 	"Mirostat Tau": "Mirostat Tau",
-	"MMMM DD, YYYY": "MMMM DD, YYYY",
-	"MMMM DD, YYYY HH:mm": "MMMM DD, YYYY HH:mm",
-	"MMMM DD, YYYY hh:mm:ss A": "MMMM DD, YYYY hh:mm:ss A",
 	"Model": "모델",
 	"Model '{{modelName}}' has been successfully downloaded.": "'{{modelName}}' 모델이 성공적으로 다운로드되었습니다.",
 	"Model '{{modelTag}}' is already in queue for downloading.": "'{{modelTag}}' 모델은 이미 다운로드 대기열에 있습니다.",
@@ -617,13 +618,13 @@
 	"Model updated successfully": "성공적으로 모델이 업데이트되었습니다",
 	"Modelfile Content": "Modelfile 내용",
 	"Models": "모델",
-	"Models Access": "",
+	"Models Access": "모델 접근",
 	"Models configuration saved successfully": "",
 	"Mojeek Search API Key": "Mojeek Search API 키",
 	"more": "더보기",
 	"More": "더보기",
 	"Name": "이름",
-	"Name your knowledge base": "",
+	"Name your knowledge base": "지식 기반 이름을 지정하세요",
 	"New Chat": "새 채팅",
 	"New Folder": "",
 	"New Password": "새 비밀번호",
@@ -667,8 +668,8 @@
 	"Ollama API settings updated": "",
 	"Ollama Version": "Ollama 버전",
 	"On": "켜기",
-	"Only alphanumeric characters and hyphens are allowed": "",
-	"Only alphanumeric characters and hyphens are allowed in the command string.": "명령어 문자열에는 영문자, 숫자 및 하이픈만 허용됩니다.",
+	"Only alphanumeric characters and hyphens are allowed": "영문자, 숫자 및 하이픈(-)만 허용됨",
+	"Only alphanumeric characters and hyphens are allowed in the command string.": "명령어 문자열에는 영문자, 숫자 및 하이픈(-)만 허용됩니다.",
 	"Only collections can be edited, create a new knowledge base to edit/add documents.": "가지고 있는 컬렉션만 수정 가능합니다, 새 지식 기반을 생성하여 문서를 수정 혹은 추가하십시오",
 	"Only select users and groups with permission can access": "권한이 있는 사용자와 그룹만 접근 가능합니다",
 	"Oops! Looks like the URL is invalid. Please double-check and try again.": "이런! URL이 잘못된 것 같습니다. 다시 한번 확인하고 다시 시도해주세요.",
@@ -688,7 +689,7 @@
 	"OpenAI API settings updated": "",
 	"OpenAI URL/Key required.": "OpenAI URL/키가 필요합니다.",
 	"or": "또는",
-	"Organize your users": "",
+	"Organize your users": "사용자를 ",
 	"Other": "기타",
 	"OUTPUT": "출력력",
 	"Output format": "출력 형식",
@@ -702,7 +703,7 @@
 	"Permission denied when accessing media devices": "미디어 장치 접근 권한이 거부되었습니다.",
 	"Permission denied when accessing microphone": "마이크 접근 권한이 거부되었습니다.",
 	"Permission denied when accessing microphone: {{error}}": "마이크 접근 권환이 거부되었습니다: {{error}}",
-	"Permissions": "",
+	"Permissions": "권한",
 	"Personalization": "개인화",
 	"Pin": "고정",
 	"Pinned": "고정됨",
@@ -710,16 +711,17 @@
 	"Pipeline deleted successfully": "성공적으로 파이프라인이 삭제되었습니다",
 	"Pipeline downloaded successfully": "성공적으로 파이프라인이 설치되었습니다",
 	"Pipelines": "파이프라인",
-	"Pipelines Not Detected": "파이프라인 발견되지않음",
+	"Pipelines Not Detected": "파이프라인 발견되지 않음",
 	"Pipelines Valves": "파이프라인 밸브",
 	"Plain text (.txt)": "일반 텍스트(.txt)",
 	"Playground": "놀이터",
 	"Please carefully review the following warnings:": "다음 주의를 조심히 확인해주십시오",
-	"Please enter a prompt": "프롬트를 입력해주세요",
+	"Please enter a prompt": "프롬트를 입력해주세요",
 	"Please fill in all fields.": "모두 빈칸없이 채워주세요",
 	"Please select a model first.": "",
-	"Please select a reason": "이유를 선택하주세요",
-	"Port": "",
+	"Please select a model.": "",
+	"Please select a reason": "이유를 선택해주세요",
+	"Port": "포트",
 	"Positive attitude": "긍정적인 자세",
 	"Prefix ID": "",
 	"Prefix ID is used to avoid conflicts with other connections by adding a prefix to the model IDs - leave empty to disable": "",
@@ -728,11 +730,11 @@
 	"Profile Image": "프로필 이미지",
 	"Prompt (e.g. Tell me a fun fact about the Roman Empire)": "프롬프트 (예: 로마 황제에 대해 재미있는 사실을 알려주세요)",
 	"Prompt Content": "프롬프트 내용",
-	"Prompt created successfully": "",
+	"Prompt created successfully": "성공적으로 프롬프트를 생성했습니다",
 	"Prompt suggestions": "프롬프트 제안",
-	"Prompt updated successfully": "",
+	"Prompt updated successfully": "성공적으로 프롬프트를 수정했습니다",
 	"Prompts": "프롬프트",
-	"Prompts Access": "",
+	"Prompts Access": "프롬프트 접근",
 	"Proxy URL": "프록시 URL",
 	"Pull \"{{searchValue}}\" from Ollama.com": "Ollama.com에서 \"{{searchValue}}\" 가져오기",
 	"Pull a model from Ollama.com": "Ollama.com에서 모델 가져오기(pull)",
@@ -792,13 +794,13 @@
 	"Search a model": "모델 검색",
 	"Search Base": "",
 	"Search Chats": "채팅 검색",
-	"Search Collection": "컬렉션검색",
-	"Search Filters": "",
+	"Search Collection": "컬렉션 검색",
+	"Search Filters": "필터 검색",
 	"search for tags": "태그 검색",
 	"Search Functions": "함수 검색",
 	"Search Knowledge": "지식 기반 검색",
 	"Search Models": "모델 검색",
-	"Search options": "",
+	"Search options": "옵션 검색",
 	"Search Prompts": "프롬프트 검색",
 	"Search Result Count": "검색 결과 수",
 	"Search the web": "",
@@ -895,7 +897,7 @@
 	"System Instructions": "시스템 설명서",
 	"System Prompt": "시스템 프롬프트",
 	"Tags Generation": "태그 생성",
-	"Tags Generation Prompt": "태그 생성 프롬포트트",
+	"Tags Generation Prompt": "태그 생성 프롬트",
 	"Tail free sampling is used to reduce the impact of less probable tokens from the output. A higher value (e.g., 2.0) will reduce the impact more, while a value of 1.0 disables this setting. (default: 1)": "",
 	"Tap to interrupt": "탭하여 중단",
 	"Tavily API Key": "Tavily API 키",
@@ -963,16 +965,17 @@
 	"Too verbose": "말이 너무 많은",
 	"Tool created successfully": "성공적으로 도구가 생성되었습니다",
 	"Tool deleted successfully": "성공적으로 도구가 삭제되었습니다",
-	"Tool Description": "",
-	"Tool ID": "",
+	"Tool Description": "도구 설명",
+	"Tool ID": "도구 ID",
 	"Tool imported successfully": "성공적으로 도구를 가져왔습니다",
-	"Tool Name": "",
+	"Tool Name": "도구 이름",
 	"Tool updated successfully": "성공적으로 도구가 업데이트되었습니다",
 	"Tools": "도구",
-	"Tools Access": "",
-	"Tools are a function calling system with arbitrary code execution": "도구는 임이의 코드를 실행시키는 함수를 불러오는 시스템입니다",
-	"Tools have a function calling system that allows arbitrary code execution": "도구가 임이의 코드를 실행시키는 함수를 가지기",
-	"Tools have a function calling system that allows arbitrary code execution.": "도구가 임이의 코드를 실행시키는 함수를 가지고 있습니다.",
+	"Tools Access": "도구 접근",
+	"Tools are a function calling system with arbitrary code execution": "도구는 임의 코드를 실행시키는 함수를 불러오는 시스템입니다",
+	"Tools Function Calling Prompt": "",
+	"Tools have a function calling system that allows arbitrary code execution": "도구에 임의 코드 실행을 허용하는 함수가 포함되어 있습니다",
+	"Tools have a function calling system that allows arbitrary code execution.": "도구에 임의 코드 실행을 허용하는 함수가 포함되어 있습니다.",
 	"Top K": "Top K",
 	"Top P": "Top P",
 	"Transformers": "",
@@ -984,9 +987,9 @@
 	"Type Hugging Face Resolve (Download) URL": "Hugging Face Resolve (다운로드) URL 입력",
 	"Uh-oh! There was an issue with the response.": "",
 	"UI": "UI",
-	"Unarchive All": "",
-	"Unarchive All Archived Chats": "",
-	"Unarchive Chat": "",
+	"Unarchive All": "모두 보관 해제",
+	"Unarchive All Archived Chats": "보관된 모든 채팅을 보관 해제",
+	"Unarchive Chat": "채팅 보관 해제",
 	"Unlock mysteries": "",
 	"Unpin": "고정 해제",
 	"Unravel secrets": "",
@@ -1009,7 +1012,7 @@
 	"URL Mode": "URL 모드",
 	"Use '#' in the prompt input to load and include your knowledge.": "프롬프트 입력에서 '#'를 사용하여 지식 기반을 불러오고 포함하세요.",
 	"Use Gravatar": "Gravatar 사용",
-	"Use groups to group your users and assign permissions.": "",
+	"Use groups to group your users and assign permissions.": "그룹을 사용하여 사용자를 그룹화하고 권한을 할당하세요.",
 	"Use Initials": "초성 사용",
 	"use_mlock (Ollama)": "use_mlock (올라마)",
 	"use_mmap (Ollama)": "use_mmap (올라마)",
@@ -1034,7 +1037,7 @@
 	"Voice Input": "음성 입력",
 	"Warning": "경고",
 	"Warning:": "주의:",
-	"Warning: Enabling this will allow users to upload arbitrary code on the server.": "",
+	"Warning: Enabling this will allow users to upload arbitrary code on the server.": "주의: 이 기능을 활성화하면 사용자가 서버에 임의 코드를 업로드할 수 있습니다.",
 	"Warning: If you update or change your embedding model, you will need to re-import all documents.": "주의: 기존 임베딩 모델을 변경 또는 업데이트하는 경우, 모든 문서를 다시 가져와야 합니다.",
 	"Web": "웹",
 	"Web API": "웹 API",
@@ -1047,8 +1050,8 @@
 	"WebUI URL": "",
 	"WebUI will make requests to \"{{url}}/api/chat\"": "WebUI가 \"{{url}}/api/chat\"로 요청을 보냅니다",
 	"WebUI will make requests to \"{{url}}/chat/completions\"": "WebUI가 \"{{url}}/chat/completions\"로 요청을 보냅니다",
-	"What are you trying to achieve?": "",
-	"What are you working on?": "",
+	"What are you trying to achieve?": "무엇을 성취하고 싶으신가요?",
+	"What are you working on?": "어떤 작업을 하고 계신가요?",
 	"What’s New in": "새로운 기능:",
 	"When enabled, the model will respond to each chat message in real-time, generating a response as soon as the user sends a message. This mode is useful for live chat applications, but may impact performance on slower hardware.": "활성화하면 모델이 각 채팅 메시지에 실시간으로 응답하여 사용자가 메시지를 보내는 즉시 응답을 생성합니다. 이 모드는 실시간 채팅 애플리케이션에 유용하지만, 느린 하드웨어에서는 성능에 영향을 미칠 수 있습니다.",
 	"wherever you are": "",
@@ -1058,18 +1061,19 @@
 	"Won": "승리",
 	"Works together with top-k. A higher value (e.g., 0.95) will lead to more diverse text, while a lower value (e.g., 0.5) will generate more focused and conservative text. (Default: 0.9)": "",
 	"Workspace": "워크스페이스",
-	"Workspace Permissions": "",
+	"Workspace Permissions": "워크스페이스 권한",
 	"Write": "",
 	"Write a prompt suggestion (e.g. Who are you?)": "프롬프트 제안 작성 (예: 당신은 누구인가요?)",
 	"Write a summary in 50 words that summarizes [topic or keyword].": "[주제 또는 키워드]에 대한 50단어 요약문 작성.",
 	"Write something...": "아무거나 쓰세요...",
-	"Write your model template content here": "",
+	"Write your model template content here": "여기에 모델 템플릿 내용을 입력하세요",
 	"Yesterday": "어제",
 	"You": "당신",
 	"You can only chat with a maximum of {{maxCount}} file(s) at a time.": "동시에 최대 {{maxCount}} 파일과만 대화할 수 있습니다 ",
 	"You can personalize your interactions with LLMs by adding memories through the 'Manage' button below, making them more helpful and tailored to you.": "아래 '관리' 버튼으로 메모리를 추가하여 LLM들과의 상호작용을 개인화할 수 있습니다. 이를 통해 더 유용하고 맞춤화된 경험을 제공합니다.",
 	"You cannot upload an empty file.": "빈 파일을 업로드 할 수 없습니다",
 	"You do not have permission to access this feature.": "",
+	"You do not have permission to upload files": "",
 	"You do not have permission to upload files.": "",
 	"You have no archived conversations.": "채팅을 보관한 적이 없습니다.",
 	"You have shared this chat": "이 채팅을 공유했습니다.",

+ 8 - 4
src/lib/i18n/locales/lt-LT/translation.json

@@ -65,6 +65,8 @@
 	"Alternative to the top_p, and aims to ensure a balance of quality and variety. The parameter p represents the minimum probability for a token to be considered, relative to the probability of the most likely token. For example, with p=0.05 and the most likely token having a probability of 0.9, logits with a value less than 0.045 are filtered out. (Default: 0.0)": "",
 	"Amazing": "",
 	"an assistant": "assistentas",
+	"Analyzed": "",
+	"Analyzing...": "",
 	"and": "ir",
 	"and {{COUNT}} more": "",
 	"and create a new shared link.": "sukurti naują dalinimosi nuorodą",
@@ -169,9 +171,12 @@
 	"Clipboard write permission denied. Please check your browser settings to grant the necessary access.": "Iškarpinės naudojimas neleidžiamas naršyklės.",
 	"Clone": "Klonuoti",
 	"Clone Chat": "",
+	"Clone of {{TITLE}}": "",
 	"Close": "Uždaryti",
 	"Code execution": "",
 	"Code formatted successfully": "Kodas suformatuotas sėkmingai",
+	"Code Intepreter": "",
+	"Code interpreter": "",
 	"Collection": "Kolekcija",
 	"Color": "",
 	"ComfyUI": "ComfyUI",
@@ -478,7 +483,6 @@
 	"Group Name": "",
 	"Group updated successfully": "",
 	"Groups": "",
-	"h:mm a": "valanda:mėnesis:metai",
 	"Haptic Feedback": "",
 	"has no conversations.": "neturi pokalbių",
 	"Hello, {{name}}": "Sveiki, {{name}}",
@@ -595,9 +599,6 @@
 	"Mirostat": "Mirostat",
 	"Mirostat Eta": "Mirostat Eta",
 	"Mirostat Tau": "Mirostat Tau",
-	"MMMM DD, YYYY": "MMMM DD, YYYY",
-	"MMMM DD, YYYY HH:mm": "MMMM DD, YYYY HH:mm",
-	"MMMM DD, YYYY hh:mm:ss A": "MMMM DD, YYYY hh:mm:ss A",
 	"Model": "",
 	"Model '{{modelName}}' has been successfully downloaded.": "'{{modelName}}' modelis sėkmingai atsisiųstas.",
 	"Model '{{modelTag}}' is already in queue for downloading.": "Modelis '{{modelTag}}' jau atsisiuntimų eilėje.",
@@ -718,6 +719,7 @@
 	"Please enter a prompt": "",
 	"Please fill in all fields.": "",
 	"Please select a model first.": "",
+	"Please select a model.": "",
 	"Please select a reason": "",
 	"Port": "",
 	"Positive attitude": "Pozityvus elgesys",
@@ -971,6 +973,7 @@
 	"Tools": "Įrankiai",
 	"Tools Access": "",
 	"Tools are a function calling system with arbitrary code execution": "Įrankiai gali naudoti funkcijas ir vykdyti kodą",
+	"Tools Function Calling Prompt": "",
 	"Tools have a function calling system that allows arbitrary code execution": "Įrankiai gali naudoti funkcijas ir leisti vykdyti kodą",
 	"Tools have a function calling system that allows arbitrary code execution.": "Įrankiai gali naudoti funkcijas ir leisti vykdyti kodą",
 	"Top K": "Top K",
@@ -1070,6 +1073,7 @@
 	"You can personalize your interactions with LLMs by adding memories through the 'Manage' button below, making them more helpful and tailored to you.": "Galite pagerinti modelių darbą suteikdami jiems atminties funkcionalumą.",
 	"You cannot upload an empty file.": "",
 	"You do not have permission to access this feature.": "",
+	"You do not have permission to upload files": "",
 	"You do not have permission to upload files.": "",
 	"You have no archived conversations.": "Jūs neturite archyvuotų pokalbių",
 	"You have shared this chat": "Pasidalinote šiuo pokalbiu",

+ 8 - 4
src/lib/i18n/locales/ms-MY/translation.json

@@ -65,6 +65,8 @@
 	"Alternative to the top_p, and aims to ensure a balance of quality and variety. The parameter p represents the minimum probability for a token to be considered, relative to the probability of the most likely token. For example, with p=0.05 and the most likely token having a probability of 0.9, logits with a value less than 0.045 are filtered out. (Default: 0.0)": "",
 	"Amazing": "",
 	"an assistant": "seorang pembantu",
+	"Analyzed": "",
+	"Analyzing...": "",
 	"and": "dan",
 	"and {{COUNT}} more": "",
 	"and create a new shared link.": "dan cipta pautan kongsi baharu",
@@ -169,9 +171,12 @@
 	"Clipboard write permission denied. Please check your browser settings to grant the necessary access.": "Kebenaran untuk menulis di papan klip ditolak. Sila semak tetapan pelayan web anda untuk memberikan akses yang diperlukan",
 	"Clone": "Klon",
 	"Clone Chat": "",
+	"Clone of {{TITLE}}": "",
 	"Close": "Tutup",
 	"Code execution": "",
 	"Code formatted successfully": "Kod berjaya diformatkan",
+	"Code Intepreter": "",
+	"Code interpreter": "",
 	"Collection": "Koleksi",
 	"Color": "",
 	"ComfyUI": "ComfyUI",
@@ -478,7 +483,6 @@
 	"Group Name": "",
 	"Group updated successfully": "",
 	"Groups": "",
-	"h:mm a": "h:mm a",
 	"Haptic Feedback": "",
 	"has no conversations.": "tidak mempunyai perbualan.",
 	"Hello, {{name}}": "Hello, {{name}}",
@@ -595,9 +599,6 @@
 	"Mirostat": "Mirostat",
 	"Mirostat Eta": "Mirostat Eta",
 	"Mirostat Tau": "Mirostat Tau",
-	"MMMM DD, YYYY": "DD MMMM YYYY",
-	"MMMM DD, YYYY HH:mm": "DD MMMM YYYY HH:mm",
-	"MMMM DD, YYYY hh:mm:ss A": "DD MMMM YYYY HH:mm:ss A",
 	"Model": "",
 	"Model '{{modelName}}' has been successfully downloaded.": "Model '{{ modelName }}' telah berjaya dimuat turun.",
 	"Model '{{modelTag}}' is already in queue for downloading.": "Model '{{ modelTag }}' sudah dalam baris gilir untuk dimuat turun.",
@@ -718,6 +719,7 @@
 	"Please enter a prompt": "",
 	"Please fill in all fields.": "",
 	"Please select a model first.": "",
+	"Please select a model.": "",
 	"Please select a reason": "",
 	"Port": "",
 	"Positive attitude": "Sikap positif",
@@ -971,6 +973,7 @@
 	"Tools": "Alatan",
 	"Tools Access": "",
 	"Tools are a function calling system with arbitrary code execution": "Alatan ialah sistem panggilan fungsi dengan pelaksanaan kod sewenang-wenangnya",
+	"Tools Function Calling Prompt": "",
 	"Tools have a function calling system that allows arbitrary code execution": "Alatan mempunyai sistem panggilan fungsi yang membolehkan pelaksanaan kod sewenang-wenangnya",
 	"Tools have a function calling system that allows arbitrary code execution.": "Alatan mempunyai sistem panggilan fungsi yang membolehkan pelaksanaan kod sewenang-wenangnya.",
 	"Top K": "'Top K'",
@@ -1070,6 +1073,7 @@
 	"You can personalize your interactions with LLMs by adding memories through the 'Manage' button below, making them more helpful and tailored to you.": "Anda boleh memperibadikan interaksi anda dengan LLM dengan menambahkan memori melalui butang 'Urus' di bawah, menjadikannya lebih membantu dan disesuaikan dengan anda.",
 	"You cannot upload an empty file.": "",
 	"You do not have permission to access this feature.": "",
+	"You do not have permission to upload files": "",
 	"You do not have permission to upload files.": "",
 	"You have no archived conversations.": "Anda tidak mempunyai perbualan yang diarkibkan",
 	"You have shared this chat": "Anda telah berkongsi perbualan ini",

+ 8 - 4
src/lib/i18n/locales/nb-NO/translation.json

@@ -65,6 +65,8 @@
 	"Alternative to the top_p, and aims to ensure a balance of quality and variety. The parameter p represents the minimum probability for a token to be considered, relative to the probability of the most likely token. For example, with p=0.05 and the most likely token having a probability of 0.9, logits with a value less than 0.045 are filtered out. (Default: 0.0)": "Alternativ til top_p, og har som mål å sikre en balanse mellom kvalitet og variasjon. Parameteren p representerer minimumssannsynligheten for at et token skal vurderes, i forhold til sannsynligheten for det mest sannsynlige tokenet. Hvis p for eksempel er 0,05 og det mest sannsynlige tokenet har en sannsynlighet på 0,9, filtreres logits med en verdi på mindre enn 0,045 bort. (Standard: 0,0)",
 	"Amazing": "Flott",
 	"an assistant": "en assistent",
+	"Analyzed": "",
+	"Analyzing...": "",
 	"and": "og",
 	"and {{COUNT}} more": "og {{COUNT}} til",
 	"and create a new shared link.": "og opprett en ny delt lenke.",
@@ -169,9 +171,12 @@
 	"Clipboard write permission denied. Please check your browser settings to grant the necessary access.": "Skrivetilgang til utklippstavlen avslått. Kontroller nettleserinnstillingene for å gi den nødvendige tilgangen.",
 	"Clone": "Klon",
 	"Clone Chat": "",
+	"Clone of {{TITLE}}": "",
 	"Close": "Lukk",
 	"Code execution": "Kodekjøring",
 	"Code formatted successfully": "Koden er formatert",
+	"Code Intepreter": "",
+	"Code interpreter": "",
 	"Collection": "Samling",
 	"Color": "Farge",
 	"ComfyUI": "ComfyUI",
@@ -478,7 +483,6 @@
 	"Group Name": "Navn på gruppe",
 	"Group updated successfully": "Gruppe oppdatert",
 	"Groups": "Grupper",
-	"h:mm a": "t:mm a",
 	"Haptic Feedback": "Haptisk tilbakemelding",
 	"has no conversations.": "har ingen samtaler.",
 	"Hello, {{name}}": "Hei, {{name}}!",
@@ -595,9 +599,6 @@
 	"Mirostat": "Mirostat",
 	"Mirostat Eta": "Mirostat Eta",
 	"Mirostat Tau": "Mirostat Tau",
-	"MMMM DD, YYYY": "DD MMMM YYYY",
-	"MMMM DD, YYYY HH:mm": "HH:mm DD MMMM YYYY",
-	"MMMM DD, YYYY hh:mm:ss A": "hh:mm:ss A DD MMMM YYYY",
 	"Model": "Modell",
 	"Model '{{modelName}}' has been successfully downloaded.": "Modellen {{modelName}} er lastet ned.",
 	"Model '{{modelTag}}' is already in queue for downloading.": "Modellen {{modelTag}} er allerede i nedlastingskøen.",
@@ -718,6 +719,7 @@
 	"Please enter a prompt": "Angi en ledetekst",
 	"Please fill in all fields.": "Fyll i alle felter",
 	"Please select a model first.": "",
+	"Please select a model.": "",
 	"Please select a reason": "Velg en årsak",
 	"Port": "Port",
 	"Positive attitude": "Positiv holdning",
@@ -971,6 +973,7 @@
 	"Tools": "Verktøy",
 	"Tools Access": "Verktøyets tilgang",
 	"Tools are a function calling system with arbitrary code execution": "Verktøy er et funksjonskallsystem med vilkårlig kodekjøring",
+	"Tools Function Calling Prompt": "",
 	"Tools have a function calling system that allows arbitrary code execution": "Verktøy inneholder et funksjonskallsystem som tillater vilkårlig kodekjøring",
 	"Tools have a function calling system that allows arbitrary code execution.": "Verktøy inneholder et funksjonskallsystem som tillater vilkårlig kodekjøring.",
 	"Top K": "Top K",
@@ -1070,6 +1073,7 @@
 	"You can personalize your interactions with LLMs by adding memories through the 'Manage' button below, making them more helpful and tailored to you.": "Du kan tilpasse interaksjonene dine med språkmodeller ved å legge til minner gjennom Administrer-knappen nedenfor, slik at de blir mer til nyttige og tilpasset deg.",
 	"You cannot upload an empty file.": "Du kan ikke laste opp en tom fil.",
 	"You do not have permission to access this feature.": "",
+	"You do not have permission to upload files": "",
 	"You do not have permission to upload files.": "Du har ikke tillatelse til å laste opp filer.",
 	"You have no archived conversations.": "Du har ingen arkiverte samtaler.",
 	"You have shared this chat": "Du har delt denne chatten",

+ 8 - 4
src/lib/i18n/locales/nl-NL/translation.json

@@ -65,6 +65,8 @@
 	"Alternative to the top_p, and aims to ensure a balance of quality and variety. The parameter p represents the minimum probability for a token to be considered, relative to the probability of the most likely token. For example, with p=0.05 and the most likely token having a probability of 0.9, logits with a value less than 0.045 are filtered out. (Default: 0.0)": "Alternatief voor de top_p, en streeft naar een evenwicht tussen kwaliteit en variatie. De parameter p vertegenwoordigt de minimumwaarschijnlijkheid dat een token in aanmerking wordt genomen, in verhouding tot de waarschijnlijkheid van het meest waarschijnlijke token. Bijvoorbeeld, met p=0.05 en de meest waarschijnlijke token met een waarschijnlijkheid van 0.9, worden logits met een waarde kleiner dan 0.045 uitgefilterd. (Standaard: 0,0)",
 	"Amazing": "Geweldig",
 	"an assistant": "een assistent",
+	"Analyzed": "",
+	"Analyzing...": "",
 	"and": "en",
 	"and {{COUNT}} more": "en {{COUNT}} meer",
 	"and create a new shared link.": "en maak een nieuwe gedeelde link.",
@@ -169,9 +171,12 @@
 	"Clipboard write permission denied. Please check your browser settings to grant the necessary access.": "Klembord schrijftoestemming geweigerd. Kijk je browserinstellingen na om de benodigde toestemming te geven.",
 	"Clone": "Kloon",
 	"Clone Chat": "",
+	"Clone of {{TITLE}}": "",
 	"Close": "Sluiten",
 	"Code execution": "Code uitvoeren",
 	"Code formatted successfully": "Code succesvol geformateerd",
+	"Code Intepreter": "",
+	"Code interpreter": "",
 	"Collection": "Verzameling",
 	"Color": "Kleur",
 	"ComfyUI": "ComfyUI",
@@ -478,7 +483,6 @@
 	"Group Name": "Groepsnaam",
 	"Group updated successfully": "Groep succesvol bijgewerkt",
 	"Groups": "Groepen",
-	"h:mm a": "h:mm a",
 	"Haptic Feedback": "Haptische feedback",
 	"has no conversations.": "heeft geen gesprekken.",
 	"Hello, {{name}}": "Hallo, {{name}}",
@@ -595,9 +599,6 @@
 	"Mirostat": "Mirostat",
 	"Mirostat Eta": "Mirostat Eta",
 	"Mirostat Tau": "Mirostat Tau",
-	"MMMM DD, YYYY": "MMMM DD, YYYY",
-	"MMMM DD, YYYY HH:mm": "MMMM DD, YYYY HH:mm",
-	"MMMM DD, YYYY hh:mm:ss A": "MMMM DD, YYYY hh:mm:ss A",
 	"Model": "Model",
 	"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.",
@@ -718,6 +719,7 @@
 	"Please enter a prompt": "Voer een prompt in",
 	"Please fill in all fields.": "Voer alle velden in",
 	"Please select a model first.": "",
+	"Please select a model.": "",
 	"Please select a reason": "Voer een reden in",
 	"Port": "Poort",
 	"Positive attitude": "Positieve positie",
@@ -971,6 +973,7 @@
 	"Tools": "Gereedschappen",
 	"Tools Access": "Gereedschaptoegang",
 	"Tools are a function calling system with arbitrary code execution": "Gereedschappen zijn een systeem voor het aanroepen van functies met willekeurige code-uitvoering",
+	"Tools Function Calling Prompt": "",
 	"Tools have a function calling system that allows arbitrary code execution": "Gereedschappen hebben een systeem voor het aanroepen van functies waarmee willekeurige code kan worden uitgevoerd",
 	"Tools have a function calling system that allows arbitrary code execution.": "Gereedschappen hebben een systeem voor het aanroepen van functies waarmee willekeurige code kan worden uitgevoerd",
 	"Top K": "Top K",
@@ -1070,6 +1073,7 @@
 	"You can personalize your interactions with LLMs by adding memories through the 'Manage' button below, making them more helpful and tailored to you.": "Je kunt je interacties met LLM's personaliseren door herinneringen toe te voegen via de 'Beheer'-knop hieronder, waardoor ze nuttiger en voor jou op maat gemaakt worden.",
 	"You cannot upload an empty file.": "Je kunt een leeg bestand niet uploaden.",
 	"You do not have permission to access this feature.": "",
+	"You do not have permission to upload files": "",
 	"You do not have permission to upload files.": "Je hebt geen toestemming om bestanden up te loaden",
 	"You have no archived conversations.": "Je hebt geen gearchiveerde gesprekken.",
 	"You have shared this chat": "Je hebt dit gesprek gedeeld",

+ 8 - 4
src/lib/i18n/locales/pa-IN/translation.json

@@ -65,6 +65,8 @@
 	"Alternative to the top_p, and aims to ensure a balance of quality and variety. The parameter p represents the minimum probability for a token to be considered, relative to the probability of the most likely token. For example, with p=0.05 and the most likely token having a probability of 0.9, logits with a value less than 0.045 are filtered out. (Default: 0.0)": "",
 	"Amazing": "",
 	"an assistant": "ਇੱਕ ਸਹਾਇਕ",
+	"Analyzed": "",
+	"Analyzing...": "",
 	"and": "ਅਤੇ",
 	"and {{COUNT}} more": "",
 	"and create a new shared link.": "ਅਤੇ ਇੱਕ ਨਵਾਂ ਸਾਂਝਾ ਲਿੰਕ ਬਣਾਓ।",
@@ -169,9 +171,12 @@
 	"Clipboard write permission denied. Please check your browser settings to grant the necessary access.": "",
 	"Clone": "ਕਲੋਨ",
 	"Clone Chat": "",
+	"Clone of {{TITLE}}": "",
 	"Close": "ਬੰਦ ਕਰੋ",
 	"Code execution": "",
 	"Code formatted successfully": "",
+	"Code Intepreter": "",
+	"Code interpreter": "",
 	"Collection": "ਸੰਗ੍ਰਹਿ",
 	"Color": "",
 	"ComfyUI": "ਕੰਫੀਯੂਆਈ",
@@ -478,7 +483,6 @@
 	"Group Name": "",
 	"Group updated successfully": "",
 	"Groups": "",
-	"h:mm a": "ਹ:ਮਿੰਟ ਪੂਃ",
 	"Haptic Feedback": "",
 	"has no conversations.": "ਕੋਈ ਗੱਲਬਾਤ ਨਹੀਂ ਹੈ।",
 	"Hello, {{name}}": "ਸਤ ਸ੍ਰੀ ਅਕਾਲ, {{name}}",
@@ -595,9 +599,6 @@
 	"Mirostat": "ਮਿਰੋਸਟੈਟ",
 	"Mirostat Eta": "ਮਿਰੋਸਟੈਟ ਈਟਾ",
 	"Mirostat Tau": "ਮਿਰੋਸਟੈਟ ਟਾਉ",
-	"MMMM DD, YYYY": "MMMM DD, YYYY",
-	"MMMM DD, YYYY HH:mm": "MMMM DD, YYYY HH:mm",
-	"MMMM DD, YYYY hh:mm:ss A": "",
 	"Model": "",
 	"Model '{{modelName}}' has been successfully downloaded.": "ਮਾਡਲ '{{modelName}}' ਸਫਲਤਾਪੂਰਵਕ ਡਾਊਨਲੋਡ ਕੀਤਾ ਗਿਆ ਹੈ।",
 	"Model '{{modelTag}}' is already in queue for downloading.": "ਮਾਡਲ '{{modelTag}}' ਪਹਿਲਾਂ ਹੀ ਡਾਊਨਲੋਡ ਲਈ ਕਤਾਰ ਵਿੱਚ ਹੈ।",
@@ -718,6 +719,7 @@
 	"Please enter a prompt": "",
 	"Please fill in all fields.": "",
 	"Please select a model first.": "",
+	"Please select a model.": "",
 	"Please select a reason": "",
 	"Port": "",
 	"Positive attitude": "ਸਕਾਰਾਤਮਕ ਰਵੱਈਆ",
@@ -971,6 +973,7 @@
 	"Tools": "",
 	"Tools Access": "",
 	"Tools are a function calling system with arbitrary code execution": "",
+	"Tools Function Calling Prompt": "",
 	"Tools have a function calling system that allows arbitrary code execution": "",
 	"Tools have a function calling system that allows arbitrary code execution.": "",
 	"Top K": "ਸਿਖਰ K",
@@ -1070,6 +1073,7 @@
 	"You can personalize your interactions with LLMs by adding memories through the 'Manage' button below, making them more helpful and tailored to you.": "",
 	"You cannot upload an empty file.": "",
 	"You do not have permission to access this feature.": "",
+	"You do not have permission to upload files": "",
 	"You do not have permission to upload files.": "",
 	"You have no archived conversations.": "ਤੁਹਾਡੇ ਕੋਲ ਕੋਈ ਆਰਕਾਈਵ ਕੀਤੀਆਂ ਗੱਲਾਂ ਨਹੀਂ ਹਨ।",
 	"You have shared this chat": "ਤੁਸੀਂ ਇਹ ਗੱਲਬਾਤ ਸਾਂਝੀ ਕੀਤੀ ਹੈ",

+ 8 - 4
src/lib/i18n/locales/pl-PL/translation.json

@@ -65,6 +65,8 @@
 	"Alternative to the top_p, and aims to ensure a balance of quality and variety. The parameter p represents the minimum probability for a token to be considered, relative to the probability of the most likely token. For example, with p=0.05 and the most likely token having a probability of 0.9, logits with a value less than 0.045 are filtered out. (Default: 0.0)": "",
 	"Amazing": "",
 	"an assistant": "asystent",
+	"Analyzed": "",
+	"Analyzing...": "",
 	"and": "i",
 	"and {{COUNT}} more": "",
 	"and create a new shared link.": "i utwórz nowy udostępniony link",
@@ -169,9 +171,12 @@
 	"Clipboard write permission denied. Please check your browser settings to grant the necessary access.": "",
 	"Clone": "Klon",
 	"Clone Chat": "",
+	"Clone of {{TITLE}}": "",
 	"Close": "Zamknij",
 	"Code execution": "",
 	"Code formatted successfully": "",
+	"Code Intepreter": "",
+	"Code interpreter": "",
 	"Collection": "Kolekcja",
 	"Color": "",
 	"ComfyUI": "ComfyUI",
@@ -478,7 +483,6 @@
 	"Group Name": "",
 	"Group updated successfully": "",
 	"Groups": "",
-	"h:mm a": "h:mm a",
 	"Haptic Feedback": "",
 	"has no conversations.": "nie ma rozmów.",
 	"Hello, {{name}}": "Witaj, {{name}}",
@@ -595,9 +599,6 @@
 	"Mirostat": "Mirostat",
 	"Mirostat Eta": "Mirostat Eta",
 	"Mirostat Tau": "Mirostat Tau",
-	"MMMM DD, YYYY": "MMMM DD, YYYY",
-	"MMMM DD, YYYY HH:mm": "MMMM DD, YYYY HH:mm",
-	"MMMM DD, YYYY hh:mm:ss A": "",
 	"Model": "",
 	"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.",
@@ -718,6 +719,7 @@
 	"Please enter a prompt": "",
 	"Please fill in all fields.": "",
 	"Please select a model first.": "",
+	"Please select a model.": "",
 	"Please select a reason": "",
 	"Port": "",
 	"Positive attitude": "Pozytywne podejście",
@@ -971,6 +973,7 @@
 	"Tools": "",
 	"Tools Access": "",
 	"Tools are a function calling system with arbitrary code execution": "",
+	"Tools Function Calling Prompt": "",
 	"Tools have a function calling system that allows arbitrary code execution": "",
 	"Tools have a function calling system that allows arbitrary code execution.": "",
 	"Top K": "Najlepsze K",
@@ -1070,6 +1073,7 @@
 	"You can personalize your interactions with LLMs by adding memories through the 'Manage' button below, making them more helpful and tailored to you.": "",
 	"You cannot upload an empty file.": "",
 	"You do not have permission to access this feature.": "",
+	"You do not have permission to upload files": "",
 	"You do not have permission to upload files.": "",
 	"You have no archived conversations.": "Nie masz zarchiwizowanych rozmów.",
 	"You have shared this chat": "Udostępniłeś ten czat",

+ 8 - 4
src/lib/i18n/locales/pt-BR/translation.json

@@ -65,6 +65,8 @@
 	"Alternative to the top_p, and aims to ensure a balance of quality and variety. The parameter p represents the minimum probability for a token to be considered, relative to the probability of the most likely token. For example, with p=0.05 and the most likely token having a probability of 0.9, logits with a value less than 0.045 are filtered out. (Default: 0.0)": "Alternativa ao 'top_p', e visa garantir um equilíbrio entre qualidade e variedade. O parâmetro 'p' representa a probabilidade mínima para que um token seja considerado, em relação à probabilidade do token mais provável. Por exemplo, com 'p=0.05' e o token mais provável com probabilidade de '0.9', as predições com valor inferior a '0.045' são filtrados. (Default: 0.0)",
 	"Amazing": "Incrível",
 	"an assistant": "um assistente",
+	"Analyzed": "",
+	"Analyzing...": "",
 	"and": "e",
 	"and {{COUNT}} more": "e mais {{COUNT}}",
 	"and create a new shared link.": "e criar um novo link compartilhado.",
@@ -169,9 +171,12 @@
 	"Clipboard write permission denied. Please check your browser settings to grant the necessary access.": "Permissão de escrita na área de transferência negada. Verifique as configurações do seu navegador para conceder o acesso necessário.",
 	"Clone": "Clonar",
 	"Clone Chat": "",
+	"Clone of {{TITLE}}": "",
 	"Close": "Fechar",
 	"Code execution": "Execução de código",
 	"Code formatted successfully": "Código formatado com sucesso",
+	"Code Intepreter": "",
+	"Code interpreter": "",
 	"Collection": "Coleção",
 	"Color": "Cor",
 	"ComfyUI": "ComfyUI",
@@ -478,7 +483,6 @@
 	"Group Name": "Nome do Grupo",
 	"Group updated successfully": "Grupo atualizado com sucesso",
 	"Groups": "Grupos",
-	"h:mm a": "h:mm a",
 	"Haptic Feedback": "",
 	"has no conversations.": "não tem conversas.",
 	"Hello, {{name}}": "Olá, {{name}}",
@@ -595,9 +599,6 @@
 	"Mirostat": "Mirostat",
 	"Mirostat Eta": "Mirostat Eta",
 	"Mirostat Tau": "Mirostat Tau",
-	"MMMM DD, YYYY": "MMMM DD, YYYY",
-	"MMMM DD, YYYY HH:mm": "MMMM DD, YYYY HH:mm",
-	"MMMM DD, YYYY hh:mm:ss A": "MMMM DD, YYYY hh:mm:ss A",
 	"Model": "Modelo",
 	"Model '{{modelName}}' has been successfully downloaded.": "Modelo '{{modelName}}' foi baixado com sucesso.",
 	"Model '{{modelTag}}' is already in queue for downloading.": "Modelo '{{modelTag}}' já está na fila para download.",
@@ -718,6 +719,7 @@
 	"Please enter a prompt": "Por favor, digite um prompt",
 	"Please fill in all fields.": "Por favor, preencha todos os campos.",
 	"Please select a model first.": "",
+	"Please select a model.": "",
 	"Please select a reason": "Por favor, seleccione uma razão",
 	"Port": "Porta",
 	"Positive attitude": "Atitude positiva",
@@ -971,6 +973,7 @@
 	"Tools": "Ferramentas",
 	"Tools Access": "Acesso as Ferramentas",
 	"Tools are a function calling system with arbitrary code execution": "Ferramentas são um sistema de chamada de funções com execução de código arbitrário",
+	"Tools Function Calling Prompt": "",
 	"Tools have a function calling system that allows arbitrary code execution": "Ferramentas possuem um sistema de chamada de funções que permite a execução de código arbitrário",
 	"Tools have a function calling system that allows arbitrary code execution.": "Ferramentas possuem um sistema de chamada de funções que permite a execução de código arbitrário.",
 	"Top K": "Top K",
@@ -1070,6 +1073,7 @@
 	"You can personalize your interactions with LLMs by adding memories through the 'Manage' button below, making them more helpful and tailored to you.": "Você pode personalizar suas interações com LLMs adicionando memórias através do botão 'Gerenciar' abaixo, tornando-as mais úteis e adaptadas a você.",
 	"You cannot upload an empty file.": "Você não pode carregar um arquivo vazio.",
 	"You do not have permission to access this feature.": "",
+	"You do not have permission to upload files": "",
 	"You do not have permission to upload files.": "Você não tem permissão para fazer upload de arquivos.",
 	"You have no archived conversations.": "Você não tem conversas arquivadas.",
 	"You have shared this chat": "Você compartilhou este chat",

+ 8 - 4
src/lib/i18n/locales/pt-PT/translation.json

@@ -65,6 +65,8 @@
 	"Alternative to the top_p, and aims to ensure a balance of quality and variety. The parameter p represents the minimum probability for a token to be considered, relative to the probability of the most likely token. For example, with p=0.05 and the most likely token having a probability of 0.9, logits with a value less than 0.045 are filtered out. (Default: 0.0)": "",
 	"Amazing": "",
 	"an assistant": "um assistente",
+	"Analyzed": "",
+	"Analyzing...": "",
 	"and": "e",
 	"and {{COUNT}} more": "",
 	"and create a new shared link.": "e criar um novo link partilhado.",
@@ -169,9 +171,12 @@
 	"Clipboard write permission denied. Please check your browser settings to grant the necessary access.": "",
 	"Clone": "Clonar",
 	"Clone Chat": "",
+	"Clone of {{TITLE}}": "",
 	"Close": "Fechar",
 	"Code execution": "",
 	"Code formatted successfully": "",
+	"Code Intepreter": "",
+	"Code interpreter": "",
 	"Collection": "Coleção",
 	"Color": "",
 	"ComfyUI": "ComfyUI",
@@ -478,7 +483,6 @@
 	"Group Name": "",
 	"Group updated successfully": "",
 	"Groups": "",
-	"h:mm a": "h:mm a",
 	"Haptic Feedback": "",
 	"has no conversations.": "não possui conversas.",
 	"Hello, {{name}}": "Olá, {{name}}",
@@ -595,9 +599,6 @@
 	"Mirostat": "Mirostat",
 	"Mirostat Eta": "Mirostat Eta",
 	"Mirostat Tau": "Mirostat Tau",
-	"MMMM DD, YYYY": "DD/MM/YYYY",
-	"MMMM DD, YYYY HH:mm": "DD/MM/YYYY HH:mm",
-	"MMMM DD, YYYY hh:mm:ss A": "",
 	"Model": "",
 	"Model '{{modelName}}' has been successfully downloaded.": "O modelo '{{modelName}}' foi descarregado com sucesso.",
 	"Model '{{modelTag}}' is already in queue for downloading.": "O modelo '{{modelTag}}' já está na fila para descarregar.",
@@ -718,6 +719,7 @@
 	"Please enter a prompt": "",
 	"Please fill in all fields.": "",
 	"Please select a model first.": "",
+	"Please select a model.": "",
 	"Please select a reason": "",
 	"Port": "",
 	"Positive attitude": "Atitude Positiva",
@@ -971,6 +973,7 @@
 	"Tools": "",
 	"Tools Access": "",
 	"Tools are a function calling system with arbitrary code execution": "",
+	"Tools Function Calling Prompt": "",
 	"Tools have a function calling system that allows arbitrary code execution": "",
 	"Tools have a function calling system that allows arbitrary code execution.": "",
 	"Top K": "Top K",
@@ -1070,6 +1073,7 @@
 	"You can personalize your interactions with LLMs by adding memories through the 'Manage' button below, making them more helpful and tailored to you.": "Você pode personalizar as suas interações com LLMs adicionando memórias através do botão ‘Gerir’ abaixo, tornando-as mais úteis e personalizadas para você.",
 	"You cannot upload an empty file.": "",
 	"You do not have permission to access this feature.": "",
+	"You do not have permission to upload files": "",
 	"You do not have permission to upload files.": "",
 	"You have no archived conversations.": "Você não tem conversas arquivadas.",
 	"You have shared this chat": "Você partilhou esta conversa",

+ 8 - 4
src/lib/i18n/locales/ro-RO/translation.json

@@ -65,6 +65,8 @@
 	"Alternative to the top_p, and aims to ensure a balance of quality and variety. The parameter p represents the minimum probability for a token to be considered, relative to the probability of the most likely token. For example, with p=0.05 and the most likely token having a probability of 0.9, logits with a value less than 0.045 are filtered out. (Default: 0.0)": "",
 	"Amazing": "",
 	"an assistant": "un asistent",
+	"Analyzed": "",
+	"Analyzing...": "",
 	"and": "și",
 	"and {{COUNT}} more": "și {{COUNT}} mai multe",
 	"and create a new shared link.": "și creează un nou link partajat.",
@@ -169,9 +171,12 @@
 	"Clipboard write permission denied. Please check your browser settings to grant the necessary access.": "Permisiunea de scriere în clipboard a fost refuzată. Vă rugăm să verificați setările browserului pentru a acorda accesul necesar.",
 	"Clone": "Clonează",
 	"Clone Chat": "",
+	"Clone of {{TITLE}}": "",
 	"Close": "Închide",
 	"Code execution": "Executarea codului",
 	"Code formatted successfully": "Cod formatat cu succes",
+	"Code Intepreter": "",
+	"Code interpreter": "",
 	"Collection": "Colecție",
 	"Color": "",
 	"ComfyUI": "ComfyUI",
@@ -478,7 +483,6 @@
 	"Group Name": "",
 	"Group updated successfully": "",
 	"Groups": "",
-	"h:mm a": "h:mm a",
 	"Haptic Feedback": "Feedback haptic",
 	"has no conversations.": "nu are conversații.",
 	"Hello, {{name}}": "Salut, {{name}}",
@@ -595,9 +599,6 @@
 	"Mirostat": "Mirostat",
 	"Mirostat Eta": "Mirostat Eta",
 	"Mirostat Tau": "Mirostat Tau",
-	"MMMM DD, YYYY": "MMMM DD, YYYY",
-	"MMMM DD, YYYY HH:mm": "MMMM DD, YYYY HH:mm",
-	"MMMM DD, YYYY hh:mm:ss A": "MMMM DD, YYYY hh:mm:ss A",
 	"Model": "Model",
 	"Model '{{modelName}}' has been successfully downloaded.": "Modelul '{{modelName}}' a fost descărcat cu succes.",
 	"Model '{{modelTag}}' is already in queue for downloading.": "Modelul '{{modelTag}}' este deja în coada de descărcare.",
@@ -718,6 +719,7 @@
 	"Please enter a prompt": "Te rog să introduci un mesaj",
 	"Please fill in all fields.": "Vă rugăm să completați toate câmpurile.",
 	"Please select a model first.": "",
+	"Please select a model.": "",
 	"Please select a reason": "Vă rugăm să selectați un motiv",
 	"Port": "",
 	"Positive attitude": "Atitudine pozitivă",
@@ -971,6 +973,7 @@
 	"Tools": "Instrumente",
 	"Tools Access": "",
 	"Tools are a function calling system with arbitrary code execution": "Instrumentele sunt un sistem de apelare a funcțiilor cu executare arbitrară a codului",
+	"Tools Function Calling Prompt": "",
 	"Tools have a function calling system that allows arbitrary code execution": "Instrumentele au un sistem de apelare a funcțiilor care permite executarea arbitrară a codului",
 	"Tools have a function calling system that allows arbitrary code execution.": "Instrumentele au un sistem de apelare a funcțiilor care permite executarea arbitrară a codului.",
 	"Top K": "Top K",
@@ -1070,6 +1073,7 @@
 	"You can personalize your interactions with LLMs by adding memories through the 'Manage' button below, making them more helpful and tailored to you.": "Puteți personaliza interacțiunile dvs. cu LLM-urile adăugând amintiri prin butonul 'Gestionează' de mai jos, făcându-le mai utile și adaptate la dvs.",
 	"You cannot upload an empty file.": "Nu poți încărca un fișier gol.",
 	"You do not have permission to access this feature.": "",
+	"You do not have permission to upload files": "",
 	"You do not have permission to upload files.": "",
 	"You have no archived conversations.": "Nu aveți conversații arhivate.",
 	"You have shared this chat": "Ați partajat această conversație",

+ 8 - 4
src/lib/i18n/locales/ru-RU/translation.json

@@ -65,6 +65,8 @@
 	"Alternative to the top_p, and aims to ensure a balance of quality and variety. The parameter p represents the minimum probability for a token to be considered, relative to the probability of the most likely token. For example, with p=0.05 and the most likely token having a probability of 0.9, logits with a value less than 0.045 are filtered out. (Default: 0.0)": "",
 	"Amazing": "Удивительный",
 	"an assistant": "ассистент",
+	"Analyzed": "",
+	"Analyzing...": "",
 	"and": "и",
 	"and {{COUNT}} more": "",
 	"and create a new shared link.": "и создайте новую общую ссылку.",
@@ -169,9 +171,12 @@
 	"Clipboard write permission denied. Please check your browser settings to grant the necessary access.": "В разрешении на запись в буфер обмена отказано. Пожалуйста, проверьте настройки своего браузера, чтобы предоставить необходимый доступ.",
 	"Clone": "Клонировать",
 	"Clone Chat": "",
+	"Clone of {{TITLE}}": "",
 	"Close": "Закрыть",
 	"Code execution": "Выполнение кода",
 	"Code formatted successfully": "Код успешно отформатирован",
+	"Code Intepreter": "",
+	"Code interpreter": "",
 	"Collection": "Коллекция",
 	"Color": "Цвет",
 	"ComfyUI": "ComfyUI",
@@ -478,7 +483,6 @@
 	"Group Name": "",
 	"Group updated successfully": "",
 	"Groups": "",
-	"h:mm a": "h:mm a",
 	"Haptic Feedback": "Тактильная обратная связь",
 	"has no conversations.": "не имеет разговоров.",
 	"Hello, {{name}}": "Привет, {{name}}",
@@ -595,9 +599,6 @@
 	"Mirostat": "Mirostat",
 	"Mirostat Eta": "Mirostat Eta",
 	"Mirostat Tau": "Mirostat Tau",
-	"MMMM DD, YYYY": "DD MMMM YYYY",
-	"MMMM DD, YYYY HH:mm": "DD MMMM YYYY HH:mm",
-	"MMMM DD, YYYY hh:mm:ss A": "MMMM DD, YYYY hh:mm:ss A",
 	"Model": "Модель",
 	"Model '{{modelName}}' has been successfully downloaded.": "Модель '{{modelName}}' успешно загружена.",
 	"Model '{{modelTag}}' is already in queue for downloading.": "Модель '{{modelTag}}' уже находится в очереди на загрузку.",
@@ -718,6 +719,7 @@
 	"Please enter a prompt": "Пожалуйста, введите подсказку",
 	"Please fill in all fields.": "Пожалуйста, заполните все поля.",
 	"Please select a model first.": "Пожалуйста, сначала выберите модель.",
+	"Please select a model.": "",
 	"Please select a reason": "Пожалуйста, выберите причину",
 	"Port": "",
 	"Positive attitude": "Позитивный настрой",
@@ -971,6 +973,7 @@
 	"Tools": "Инструменты",
 	"Tools Access": "Доступ к инструментам",
 	"Tools are a function calling system with arbitrary code execution": "Инструменты - это система вызова функций с выполнением произвольного кода",
+	"Tools Function Calling Prompt": "",
 	"Tools have a function calling system that allows arbitrary code execution": "Инструменты имеют систему вызова функций, которая позволяет выполнять произвольный код",
 	"Tools have a function calling system that allows arbitrary code execution.": "Инструменты имеют систему вызова функций, которая позволяет выполнять произвольный код.",
 	"Top K": "Top K",
@@ -1070,6 +1073,7 @@
 	"You can personalize your interactions with LLMs by adding memories through the 'Manage' button below, making them more helpful and tailored to you.": "Вы можете персонализировать свое взаимодействие с LLMs, добавив воспоминания с помощью кнопки \"Управлять\" ниже, что сделает их более полезными и адаптированными для вас.",
 	"You cannot upload an empty file.": "Вы не можете загрузить пустой файл.",
 	"You do not have permission to access this feature.": "",
+	"You do not have permission to upload files": "",
 	"You do not have permission to upload files.": "У вас нет разрешения на загрузку файлов.",
 	"You have no archived conversations.": "У вас нет архивированных бесед.",
 	"You have shared this chat": "Вы поделились этим чатом",

+ 8 - 4
src/lib/i18n/locales/sk-SK/translation.json

@@ -65,6 +65,8 @@
 	"Alternative to the top_p, and aims to ensure a balance of quality and variety. The parameter p represents the minimum probability for a token to be considered, relative to the probability of the most likely token. For example, with p=0.05 and the most likely token having a probability of 0.9, logits with a value less than 0.045 are filtered out. (Default: 0.0)": "",
 	"Amazing": "",
 	"an assistant": "asistent",
+	"Analyzed": "",
+	"Analyzing...": "",
 	"and": "a",
 	"and {{COUNT}} more": "a {{COUNT}} ďalšie/í",
 	"and create a new shared link.": "a vytvoriť nový zdieľaný odkaz.",
@@ -169,9 +171,12 @@
 	"Clipboard write permission denied. Please check your browser settings to grant the necessary access.": "Prístup na zápis do schránky bol zamietnutý. Skontrolujte nastavenia prehliadača a udeľte potrebný prístup.",
 	"Clone": "Klonovať",
 	"Clone Chat": "",
+	"Clone of {{TITLE}}": "",
 	"Close": "Zavrieť",
 	"Code execution": "Vykonávanie kódu",
 	"Code formatted successfully": "Kód bol úspešne naformátovaný.",
+	"Code Intepreter": "",
+	"Code interpreter": "",
 	"Collection": "",
 	"Color": "Farba",
 	"ComfyUI": "ComfyUI",
@@ -478,7 +483,6 @@
 	"Group Name": "",
 	"Group updated successfully": "",
 	"Groups": "",
-	"h:mm a": "hh:mm dop./odp.",
 	"Haptic Feedback": "Haptická spätná väzba",
 	"has no conversations.": "nemá žiadne konverzácie.",
 	"Hello, {{name}}": "Ahoj, {{name}}",
@@ -595,9 +599,6 @@
 	"Mirostat": "Mirostat",
 	"Mirostat Eta": "Mirostat Eta",
 	"Mirostat Tau": "Mirostat Tau",
-	"MMMM DD, YYYY": "MMMM DD, RRRR",
-	"MMMM DD, YYYY HH:mm": "MMMM DD, RRRR HH:mm",
-	"MMMM DD, YYYY hh:mm:ss A": "MMMM DD, YYYY hh:mm:ss A",
 	"Model": "Model",
 	"Model '{{modelName}}' has been successfully downloaded.": "Model „{{modelName}}“ bol úspešne stiahnutý.",
 	"Model '{{modelTag}}' is already in queue for downloading.": "Model '{{modelTag}}' je už zaradený do fronty na sťahovanie.",
@@ -718,6 +719,7 @@
 	"Please enter a prompt": "Prosím, zadajte zadanie.",
 	"Please fill in all fields.": "Prosím, vyplňte všetky polia.",
 	"Please select a model first.": "",
+	"Please select a model.": "",
 	"Please select a reason": "Prosím vyberte dôvod",
 	"Port": "",
 	"Positive attitude": "Pozitívny prístup",
@@ -971,6 +973,7 @@
 	"Tools": "Nástroje",
 	"Tools Access": "",
 	"Tools are a function calling system with arbitrary code execution": "Nástroje sú systémom na volanie funkcií s vykonávaním ľubovoľného kódu.",
+	"Tools Function Calling Prompt": "",
 	"Tools have a function calling system that allows arbitrary code execution": "Nástroje majú systém volania funkcií, ktorý umožňuje ľubovoľné spúšťanie kódu.",
 	"Tools have a function calling system that allows arbitrary code execution.": "Nástroje majú systém volania funkcií, ktorý umožňuje spúšťanie ľubovoľného kódu.",
 	"Top K": "Top K",
@@ -1070,6 +1073,7 @@
 	"You can personalize your interactions with LLMs by adding memories through the 'Manage' button below, making them more helpful and tailored to you.": "Môžete personalizovať svoje interakcie s LLM pridaním spomienok prostredníctvom tlačidla 'Spravovať' nižšie, čo ich urobí pre vás užitočnejšími a lepšie prispôsobenými.",
 	"You cannot upload an empty file.": "Nemôžete nahrať prázdny súbor.",
 	"You do not have permission to access this feature.": "",
+	"You do not have permission to upload files": "",
 	"You do not have permission to upload files.": "",
 	"You have no archived conversations.": "Nemáte žiadne archivované konverzácie.",
 	"You have shared this chat": "Zdieľali ste tento chat.",

+ 229 - 225
src/lib/i18n/locales/sr-RS/translation.json

@@ -5,7 +5,7 @@
 	"(e.g. `sh webui.sh --api`)": "(нпр. `sh webui.sh --api`)",
 	"(latest)": "(најновије)",
 	"{{ models }}": "{{ модели }}",
-	"{{COUNT}} Replies": "",
+	"{{COUNT}} Replies": "{{COUNT}} одговора",
 	"{{user}}'s Chats": "Ћаскања корисника {{user}}",
 	"{{webUIName}} Backend Required": "Захтева се {{webUIName}} позадинац",
 	"*Prompt node ID(s) are required for image generation": "",
@@ -33,7 +33,7 @@
 	"Add custom prompt": "Додај прилагођен упит",
 	"Add Files": "Додај датотеке",
 	"Add Group": "Додај групу",
-	"Add Memory": "Додај меморију",
+	"Add Memory": "Додај сећање",
 	"Add Model": "Додај модел",
 	"Add Reaction": "",
 	"Add Tag": "Додај ознаку",
@@ -45,13 +45,13 @@
 	"admin": "админ",
 	"Admin": "Админ",
 	"Admin Panel": "Админ табла",
-	"Admin Settings": "Админ подешавања",
+	"Admin Settings": "Админ део",
 	"Admins have access to all tools at all times; users need tools assigned per model in the workspace.": "Админи имају приступ свим алатима у сваком тренутку, корисницима је потребно доделити алате по моделу у радном простору",
 	"Advanced Parameters": "Напредни параметри",
 	"Advanced Params": "Напредни парамови",
 	"All Documents": "Сви документи",
 	"All models deleted successfully": "Сви модели су успешно обрисани",
-	"Allow Chat Controls": "",
+	"Allow Chat Controls": "Дозволи контроле ћаскања",
 	"Allow Chat Delete": "Дозволи брисање ћаскања",
 	"Allow Chat Deletion": "Дозволи брисање ћаскања",
 	"Allow Chat Edit": "Дозволи измену ћаскања",
@@ -65,6 +65,8 @@
 	"Alternative to the top_p, and aims to ensure a balance of quality and variety. The parameter p represents the minimum probability for a token to be considered, relative to the probability of the most likely token. For example, with p=0.05 and the most likely token having a probability of 0.9, logits with a value less than 0.045 are filtered out. (Default: 0.0)": "",
 	"Amazing": "Невероватно",
 	"an assistant": "помоћник",
+	"Analyzed": "",
+	"Analyzing...": "",
 	"and": "и",
 	"and {{COUNT}} more": "и још {{COUNT}}",
 	"and create a new shared link.": "и направи нову дељену везу.",
@@ -80,10 +82,10 @@
 	"Archive": "Архивирај",
 	"Archive All Chats": "Архивирај сва ћаскања",
 	"Archived Chats": "Архиве",
-	"archived-chat-export": "",
-	"Are you sure you want to delete this channel?": "",
-	"Are you sure you want to delete this message?": "",
-	"Are you sure you want to unarchive all archived chats?": "",
+	"archived-chat-export": "izvezena-arhiva",
+	"Are you sure you want to delete this channel?": "Да ли сигурно желите обрисати овај канал?",
+	"Are you sure you want to delete this message?": "Да ли сигурно желите обрисати ову поруку?",
+	"Are you sure you want to unarchive all archived chats?": "Да ли сигурно желите деархивирати све архиве?",
 	"Are you sure?": "Да ли сте сигурни?",
 	"Arena Models": "Модели са Арене",
 	"Artifacts": "Артефакти",
@@ -91,7 +93,7 @@
 	"Assistant": "Помоћник",
 	"Attach file": "Приложи датотеку",
 	"Attention to detail": "Пажња на детаље",
-	"Attribute for Mail": "",
+	"Attribute for Mail": "Особина е-поруке",
 	"Attribute for Username": "Особина корисника",
 	"Audio": "Звук",
 	"August": "Август",
@@ -116,33 +118,33 @@
 	"Batch Size (num_batch)": "",
 	"before": "пре",
 	"Being lazy": "Бити лењ",
-	"Beta": "",
+	"Beta": "Бета",
 	"Bing Search V7 Endpoint": "",
 	"Bing Search V7 Subscription Key": "",
 	"Brave Search API Key": "Апи кључ за храбру претрагу",
-	"By {{name}}": "",
+	"By {{name}}": "Од {{name}}",
 	"Bypass SSL verification for Websites": "Заобиђи SSL потврђивање за веб странице",
 	"Call": "Позив",
 	"Call feature is not supported when using Web STT engine": "",
 	"Camera": "Камера",
 	"Cancel": "Откажи",
 	"Capabilities": "Могућности",
-	"Capture": "",
-	"Certificate Path": "",
+	"Capture": "Ухвати",
+	"Certificate Path": "Путања до сертификата",
 	"Change Password": "Промени лозинку",
-	"Channel Name": "",
-	"Channels": "",
+	"Channel Name": "Назив канала",
+	"Channels": "Канали",
 	"Character": "Знак",
 	"Character limit for autocomplete generation input": "",
-	"Chart new frontiers": "",
+	"Chart new frontiers": "Откриј нове границе",
 	"Chat": "Ћаскање",
-	"Chat Background Image": "",
-	"Chat Bubble UI": "Интерфејс балона ћаскања",
-	"Chat Controls": "",
+	"Chat Background Image": "Позадинска слика ћаскања",
+	"Chat Bubble UI": "Прочеље балона ћаскања",
+	"Chat Controls": "Контроле ћаскања",
 	"Chat direction": "Смер ћаскања",
 	"Chat Overview": "Преглед ћаскања",
 	"Chat Permissions": "Дозволе ћаскања",
-	"Chat Tags Auto-Generation": "",
+	"Chat Tags Auto-Generation": "Самостварање ознака ћаскања",
 	"Chats": "Ћаскања",
 	"Check Again": "Провери поново",
 	"Check for updates": "Потражи ажурирања",
@@ -151,11 +153,11 @@
 	"Chunk Overlap": "Преклапање делова",
 	"Chunk Params": "Параметри делова",
 	"Chunk Size": "Величина дела",
-	"Ciphers": "",
+	"Ciphers": "Шифре",
 	"Citation": "Цитат",
-	"Clear memory": "",
-	"click here": "",
-	"Click here for filter guides.": "",
+	"Clear memory": "Очисти сећања",
+	"click here": "кликни овде",
+	"Click here for filter guides.": "Кликни овде за упутства филтера.",
 	"Click here for help.": "Кликните овде за помоћ.",
 	"Click here to": "Кликните овде да",
 	"Click here to download user import template file.": "",
@@ -168,36 +170,39 @@
 	"Click on the user role button to change a user's role.": "Кликните на дугме за улогу корисника да промените улогу корисника.",
 	"Clipboard write permission denied. Please check your browser settings to grant the necessary access.": "",
 	"Clone": "Клонирај",
-	"Clone Chat": "",
+	"Clone Chat": "Клонирај ћаскање",
+	"Clone of {{TITLE}}": "",
 	"Close": "Затвори",
-	"Code execution": "",
-	"Code formatted successfully": "",
+	"Code execution": "Извршавање кода",
+	"Code formatted successfully": "Код форматиран успешно",
+	"Code Intepreter": "",
+	"Code interpreter": "",
 	"Collection": "Колекција",
-	"Color": "",
+	"Color": "Боја",
 	"ComfyUI": "ComfyUI",
-	"ComfyUI API Key": "",
+	"ComfyUI API Key": "ComfyUI API кључ",
 	"ComfyUI Base URL": "Основна адреса за ComfyUI",
 	"ComfyUI Base URL is required.": "Потребна је основна адреса за ComfyUI.",
-	"ComfyUI Workflow": "",
-	"ComfyUI Workflow Nodes": "",
+	"ComfyUI Workflow": "ComfyUI радни ток",
+	"ComfyUI Workflow Nodes": "ComfyUI чворови радног тока",
 	"Command": "Наредба",
-	"Completions": "",
+	"Completions": "Допуне",
 	"Concurrent Requests": "Упоредни захтеви",
-	"Configure": "",
-	"Confirm": "",
+	"Configure": "Подеси",
+	"Confirm": "Потврди",
 	"Confirm Password": "Потврди лозинку",
-	"Confirm your action": "",
-	"Confirm your new password": "",
+	"Confirm your action": "Потврди радњу",
+	"Confirm your new password": "Потврди нову лозинку",
 	"Connections": "Везе",
 	"Constrains effort on reasoning for reasoning models. Only applicable to reasoning models from specific providers that support reasoning effort. (Default: medium)": "",
-	"Contact Admin for WebUI Access": "",
+	"Contact Admin for WebUI Access": "Пишите админима за приступ на WebUI",
 	"Content": "Садржај",
-	"Content Extraction": "",
+	"Content Extraction": "Извлачење садржаја",
 	"Context Length": "Дужина контекста",
 	"Continue Response": "Настави одговор",
-	"Continue with {{provider}}": "",
-	"Continue with Email": "",
-	"Continue with LDAP": "",
+	"Continue with {{provider}}": "Настави са {{provider}}",
+	"Continue with Email": "Настави са е-адресом",
+	"Continue with LDAP": "Настави са ЛДАП-ом",
 	"Control how message text is split for TTS requests. 'Punctuation' splits into sentences, 'paragraphs' splits into paragraphs, and 'none' keeps the message as a single string.": "",
 	"Controls": "Контроле",
 	"Controls the balance between coherence and diversity of the output. A lower value will result in more focused and coherent text. (Default: 5.0)": "",
@@ -208,14 +213,14 @@
 	"Copy last code block": "Копирај последњи блок кода",
 	"Copy last response": "Копирај последњи одговор",
 	"Copy Link": "Копирај везу",
-	"Copy to clipboard": "",
+	"Copy to clipboard": "Копирај у оставу",
 	"Copying to clipboard was successful!": "Успешно копирање у оставу!",
 	"Create": "Направи",
 	"Create a knowledge base": "Направи базу знања",
 	"Create a model": "Креирање модела",
 	"Create Account": "Направи налог",
 	"Create Admin Account": "Направи админ налог",
-	"Create Channel": "",
+	"Create Channel": "Направи канал",
 	"Create Group": "Направи групу",
 	"Create Knowledge": "Направи знање",
 	"Create new key": "Направи нови кључ",
@@ -223,7 +228,7 @@
 	"Created at": "Направљено у",
 	"Created At": "Направљено у",
 	"Created by": "Направио/ла",
-	"CSV Import": "",
+	"CSV Import": "Увоз CSV-а",
 	"Current Model": "Тренутни модел",
 	"Current Password": "Тренутна лозинка",
 	"Custom": "Прилагођено",
@@ -231,7 +236,7 @@
 	"Database": "База података",
 	"December": "Децембар",
 	"Default": "Подразумевано",
-	"Default (Open AI)": "",
+	"Default (Open AI)": "Подразумевано (Open AI)",
 	"Default (SentenceTransformers)": "Подразумевано (SentenceTransformers)",
 	"Default Model": "Подразумевани модел",
 	"Default model updated": "Подразумевани модел ажуриран",
@@ -244,56 +249,56 @@
 	"Default User Role": "Подразумевана улога корисника",
 	"Delete": "Обриши",
 	"Delete a model": "Обриши модел",
-	"Delete All Chats": "Избриши сва ћаскања",
-	"Delete All Models": "",
+	"Delete All Chats": "Обриши сва ћаскања",
+	"Delete All Models": "Обриши све моделе",
 	"Delete chat": "Обриши ћаскање",
 	"Delete Chat": "Обриши ћаскање",
-	"Delete chat?": "",
-	"Delete folder?": "",
-	"Delete function?": "",
-	"Delete Message": "",
-	"Delete prompt?": "",
+	"Delete chat?": "Обрисати ћаскање?",
+	"Delete folder?": "Обрисати фасциклу?",
+	"Delete function?": "Обрисати функцију?",
+	"Delete Message": "Обриши поруку",
+	"Delete prompt?": "Обрисати упит?",
 	"delete this link": "обриши ову везу",
-	"Delete tool?": "",
+	"Delete tool?": "Обрисати алат?",
 	"Delete User": "Обриши корисника",
 	"Deleted {{deleteModelTag}}": "Обрисано {{deleteModelTag}}",
 	"Deleted {{name}}": "Избрисано {{наме}}",
-	"Deleted User": "",
-	"Describe your knowledge base and objectives": "",
+	"Deleted User": "Обрисани корисници",
+	"Describe your knowledge base and objectives": "Опишите вашу базу знања и циљеве",
 	"Description": "Опис",
 	"Didn't fully follow instructions": "Упутства нису праћена у потпуности",
-	"Disabled": "",
+	"Disabled": "Онемогућено",
 	"Discover a function": "Откријте функцију",
 	"Discover a model": "Откријте модел",
 	"Discover a prompt": "Откриј упит",
 	"Discover a tool": "Откријте алат",
-	"Discover wonders": "",
+	"Discover wonders": "Откријте чудеса",
 	"Discover, download, and explore custom functions": "Откријте, преузмите и истражите прилагођене функције",
 	"Discover, download, and explore custom prompts": "Откријте, преузмите и истражите прилагођене упите",
 	"Discover, download, and explore custom tools": "Откријте, преузмите и истражите прилагођене алате",
 	"Discover, download, and explore model presets": "Откријте, преузмите и истражите образце модела",
-	"Dismissible": "",
-	"Display": "",
-	"Display Emoji in Call": "",
-	"Display the username instead of You in the Chat": "Прикажи корисничко име уместо Ти у чату",
-	"Displays citations in the response": "",
-	"Dive into knowledge": "",
+	"Dismissible": "Занемариво",
+	"Display": "Приказ",
+	"Display Emoji in Call": "Прикажи емоџије у позиву",
+	"Display the username instead of You in the Chat": "Прикажи корисничко уместо Ти у ћаскању",
+	"Displays citations in the response": "Прикажи цитате у одговору",
+	"Dive into knowledge": "Ускочите у знање",
 	"Do not install functions from sources you do not fully trust.": "",
 	"Do not install tools from sources you do not fully trust.": "",
 	"Document": "Документ",
-	"Documentation": "",
+	"Documentation": "Документација",
 	"Documents": "Документи",
 	"does not make any external connections, and your data stays securely on your locally hosted server.": "не отвара никакве спољне везе и ваши подаци остају сигурно на вашем локално хостованом серверу.",
 	"Don't have an account?": "Немате налог?",
 	"don't install random functions from sources you don't trust.": "",
 	"don't install random tools from sources you don't trust.": "",
 	"Don't like the style": "Не свиђа ми се стил",
-	"Done": "",
+	"Done": "Готово",
 	"Download": "Преузми",
 	"Download canceled": "Преузимање отказано",
 	"Download Database": "Преузми базу података",
 	"Drag and drop a file to upload or select a file to view": "",
-	"Draw": "",
+	"Draw": "Нацртај",
 	"Drop any files here to add to the conversation": "Убаците било које датотеке овде да их додате у разговор",
 	"e.g. '30s','10m'. Valid time units are 's', 'm', 'h'.": "нпр. '30s', '10m'. Важеће временске јединице су 's', 'm', 'h'.",
 	"e.g. A filter to remove profanity from text": "",
@@ -302,17 +307,17 @@
 	"e.g. my_filter": "",
 	"e.g. my_tools": "",
 	"e.g. Tools for performing various operations": "",
-	"Edit": "Уреди",
-	"Edit Arena Model": "",
-	"Edit Channel": "",
-	"Edit Connection": "",
-	"Edit Default Permissions": "",
-	"Edit Memory": "",
-	"Edit User": "Уреди корисника",
-	"Edit User Group": "",
+	"Edit": "Измени",
+	"Edit Arena Model": "Измени модел арене",
+	"Edit Channel": "Измени канал",
+	"Edit Connection": "Измени везу",
+	"Edit Default Permissions": "Измени подразумевана овлашћења",
+	"Edit Memory": "Измени сећање",
+	"Edit User": "Измени корисника",
+	"Edit User Group": "Измени корисничку групу",
 	"ElevenLabs": "",
 	"Email": "Е-пошта",
-	"Embark on adventures": "",
+	"Embark on adventures": "Започните пустоловину",
 	"Embedding Batch Size": "",
 	"Embedding Model": "Модел уградње",
 	"Embedding Model Engine": "Мотор модела уградње",
@@ -327,8 +332,8 @@
 	"Enable Mirostat sampling for controlling perplexity. (Default: 0, 0 = Disabled, 1 = Mirostat, 2 = Mirostat 2.0)": "",
 	"Enable New Sign Ups": "Омогући нове пријаве",
 	"Enable Web Search": "Омогући Wеб претрагу",
-	"Enabled": "",
-	"Engine": "",
+	"Enabled": "Омогућено",
+	"Engine": "Мотор",
 	"Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "Уверите се да ваша CSV датотека укључује 4 колоне у овом редоследу: Име, Е-пошта, Лозинка, Улога.",
 	"Enter {{role}} message here": "Унесите {{role}} поруку овде",
 	"Enter a detail about yourself for your LLMs to recall": "Унесите детаље за себе да ће LLMs преузимати",
@@ -400,9 +405,9 @@
 	"Experimental": "Експериментално",
 	"Explore the cosmos": "",
 	"Export": "Извоз",
-	"Export All Archived Chats": "",
+	"Export All Archived Chats": "Извези све архиве",
 	"Export All Chats (All Users)": "Извези сва ћаскања (сви корисници)",
-	"Export chat (.json)": "",
+	"Export chat (.json)": "Извези ћаскање (.json)",
 	"Export Chats": "Извези ћаскања",
 	"Export Config to JSON File": "",
 	"Export Functions": "Извези функције",
@@ -478,26 +483,25 @@
 	"Group Name": "Назив групе",
 	"Group updated successfully": "Група измењена успешно",
 	"Groups": "Групе",
-	"h:mm a": "h:mm a",
-	"Haptic Feedback": "",
+	"Haptic Feedback": "Вибрација као одговор",
 	"has no conversations.": "нема разговора.",
 	"Hello, {{name}}": "Здраво, {{name}}",
 	"Help": "Помоћ",
 	"Help us create the best community leaderboard by sharing your feedback history!": "",
-	"Hex Color": "",
-	"Hex Color - Leave empty for default color": "",
+	"Hex Color": "Хекс боја",
+	"Hex Color - Leave empty for default color": "Хекс боја (празно за подразумевано)",
 	"Hide": "Сакриј",
-	"Host": "",
+	"Host": "Домаћин",
 	"How can I help you today?": "Како могу да вам помогнем данас?",
 	"How would you rate this response?": "",
 	"Hybrid Search": "Хибридна претрага",
 	"I acknowledge that I have read and I understand the implications of my action. I am aware of the risks associated with executing arbitrary code and I have verified the trustworthiness of the source.": "",
-	"ID": "",
-	"Ignite curiosity": "",
-	"Image": "",
-	"Image Compression": "",
-	"Image generation": "",
-	"Image Generation": "",
+	"ID": "ИБ",
+	"Ignite curiosity": "Покрени знатижељу",
+	"Image": "Слика",
+	"Image Compression": "Компресија слике",
+	"Image generation": "Стварање слике",
+	"Image Generation": "Стварање слике",
 	"Image Generation (Experimental)": "Стварање слика (експериментално)",
 	"Image Generation Engine": "Мотор за стварање слика",
 	"Image Max Compression Size": "",
@@ -535,22 +539,22 @@
 	"JWT Token": "JWT жетон",
 	"Kagi Search API Key": "",
 	"Keep Alive": "Одржи трајање",
-	"Key": "",
+	"Key": "Кључ",
 	"Keyboard shortcuts": "Пречице на тастатури",
-	"Knowledge": "",
-	"Knowledge Access": "",
+	"Knowledge": "Знање",
+	"Knowledge Access": "Приступ знању",
 	"Knowledge created successfully.": "",
 	"Knowledge deleted successfully.": "",
 	"Knowledge reset successfully.": "",
 	"Knowledge updated successfully": "",
-	"Label": "",
-	"Landing Page Mode": "",
+	"Label": "Етикета",
+	"Landing Page Mode": "Режим почетне стране",
 	"Language": "Језик",
 	"Last Active": "Последња активност",
-	"Last Modified": "",
-	"Last reply": "",
-	"LDAP": "",
-	"LDAP server updated": "",
+	"Last Modified": "Последња измена",
+	"Last reply": "Последњи одговор",
+	"LDAP": "ЛДАП",
+	"LDAP server updated": "ЛДАП сервер измењен",
 	"Leaderboard": "Ранг листа",
 	"Leave empty for unlimited": "",
 	"Leave empty to include all models from \"{{URL}}/api/tags\" endpoint": "",
@@ -558,22 +562,22 @@
 	"Leave empty to include all models or select specific models": "",
 	"Leave empty to use the default prompt, or enter a custom prompt": "",
 	"Light": "Светла",
-	"Listening...": "",
-	"Llama.cpp": "",
+	"Listening...": "Слушам...",
+	"Llama.cpp": "Llama.cpp",
 	"LLMs can make mistakes. Verify important information.": "ВЈМ-ови (LLM-ови) могу правити грешке. Проверите важне податке.",
-	"Local": "",
-	"Local Models": "",
+	"Local": "Локално",
+	"Local Models": "Локални модели",
 	"Lost": "Пораза",
 	"LTR": "ЛНД",
 	"Made by OpenWebUI Community": "Израдила OpenWebUI заједница",
 	"Make sure to enclose them with": "Уверите се да их затворите са",
 	"Make sure to export a workflow.json file as API format from ComfyUI.": "",
-	"Manage": "",
-	"Manage Arena Models": "",
-	"Manage Models": "",
-	"Manage Ollama": "",
-	"Manage Ollama API Connections": "",
-	"Manage OpenAI API Connections": "",
+	"Manage": "Управљај",
+	"Manage Arena Models": "Управљај моделима арене",
+	"Manage Models": "Управљај моделима",
+	"Manage Ollama": "Управљај Ollama-ом",
+	"Manage Ollama API Connections": "Управљај Ollama АПИ везама",
+	"Manage OpenAI API Connections": "Управљај OpenAI АПИ везама",
 	"Manage Pipelines": "Управљање цевоводима",
 	"March": "Март",
 	"Max Tokens (num_predict)": "Маx Токенс (нум_предицт)",
@@ -582,12 +586,12 @@
 	"Maximum of 3 models can be downloaded simultaneously. Please try again later.": "Највише 3 модела могу бити преузета истовремено. Покушајте поново касније.",
 	"May": "Мај",
 	"Memories accessible by LLMs will be shown here.": "Памћења које ће бити појављена од овог LLM-а ће бити приказана овде.",
-	"Memory": "Памћење",
-	"Memory added successfully": "",
-	"Memory cleared successfully": "",
-	"Memory deleted successfully": "",
-	"Memory updated successfully": "",
-	"Merge Responses": "",
+	"Memory": "Сећања",
+	"Memory added successfully": "Сећање успешно додато",
+	"Memory cleared successfully": "Сећање успешно очишћено",
+	"Memory deleted successfully": "Сећање успешно обрисано",
+	"Memory updated successfully": "Сећање успешно измењено",
+	"Merge Responses": "Спој одговоре",
 	"Message rating should be enabled to use this feature": "",
 	"Messages you send after creating your link won't be shared. Users with the URL will be able to view the shared chat.": "Поруке које пошаљете након стварања ваше везе неће бити подељене. Корисници са URL-ом ће моћи да виде дељено ћаскање.",
 	"Min P": "",
@@ -595,9 +599,6 @@
 	"Mirostat": "Миростат",
 	"Mirostat Eta": "Миростат Ета",
 	"Mirostat Tau": "Миростат Тау",
-	"MMMM DD, YYYY": "ММММ ДД, ГГГГ",
-	"MMMM DD, YYYY HH:mm": "ММММ ДД, ГГГГ ЧЧ:мм",
-	"MMMM DD, YYYY hh:mm:ss A": "",
 	"Model": "Модел",
 	"Model '{{modelName}}' has been successfully downloaded.": "Модел „{{modelName}}“ је успешно преузет.",
 	"Model '{{modelTag}}' is already in queue for downloading.": "Модел „{{modelTag}}“ је већ у реду за преузимање.",
@@ -620,7 +621,7 @@
 	"Models Access": "",
 	"Models configuration saved successfully": "",
 	"Mojeek Search API Key": "",
-	"more": "",
+	"more": "више",
 	"More": "Више",
 	"Name": "Име",
 	"Name your knowledge base": "",
@@ -644,15 +645,15 @@
 	"No results found": "Нема резултата",
 	"No search query generated": "Није генерисан упит за претрагу",
 	"No source available": "Нема доступног извора",
-	"No users were found.": "",
+	"No users were found.": "Нема корисника.",
 	"No valves to update": "",
 	"None": "Нико",
 	"Not factually correct": "Није чињенично тачно",
-	"Not helpful": "",
+	"Not helpful": "Није од помоћи",
 	"Note: If you set a minimum score, the search will only return documents with a score greater than or equal to the minimum score.": "Напомена: ако подесите најмањи резултат, претрага ће вратити само документе са резултатом већим или једнаким најмањем резултату.",
-	"Notes": "",
-	"Notification Sound": "",
-	"Notification Webhook": "",
+	"Notes": "Белешке",
+	"Notification Sound": "Звук обавештења",
+	"Notification Webhook": "Веб-кука обавештења",
 	"Notifications": "Обавештења",
 	"November": "Новембар",
 	"num_gpu (Ollama)": "",
@@ -690,27 +691,27 @@
 	"or": "или",
 	"Organize your users": "Организујте ваше кориснике",
 	"Other": "Остало",
-	"OUTPUT": "",
+	"OUTPUT": "ИЗЛАЗ",
 	"Output format": "Формат излаза",
 	"Overview": "Преглед",
-	"page": "",
+	"page": "страница",
 	"Password": "Лозинка",
-	"Paste Large Text as File": "",
+	"Paste Large Text as File": "Убаци велики текст као датотеку",
 	"PDF document (.pdf)": "PDF документ (.pdf)",
 	"PDF Extract Images (OCR)": "Извлачење PDF слика (OCR)",
 	"pending": "на чекању",
-	"Permission denied when accessing media devices": "",
-	"Permission denied when accessing microphone": "",
+	"Permission denied when accessing media devices": "Приступ медијским уређајима одбијен",
+	"Permission denied when accessing microphone": "Приступ микрофону је одбијен",
 	"Permission denied when accessing microphone: {{error}}": "Приступ микрофону је одбијен: {{error}}",
 	"Permissions": "",
 	"Personalization": "Прилагођавање",
 	"Pin": "Закачи",
 	"Pinned": "Закачено",
 	"Pioneer insights": "",
-	"Pipeline deleted successfully": "",
-	"Pipeline downloaded successfully": "",
+	"Pipeline deleted successfully": "Цевовод успешно обрисан",
+	"Pipeline downloaded successfully": "Цевовод успешно преузет",
 	"Pipelines": "Цевоводи",
-	"Pipelines Not Detected": "",
+	"Pipelines Not Detected": "Цевоводи нису уочени",
 	"Pipelines Valves": "Вентили за цевоводе",
 	"Plain text (.txt)": "Обичан текст (.txt)",
 	"Playground": "Игралиште",
@@ -718,6 +719,7 @@
 	"Please enter a prompt": "",
 	"Please fill in all fields.": "",
 	"Please select a model first.": "",
+	"Please select a model.": "",
 	"Please select a reason": "",
 	"Port": "",
 	"Positive attitude": "Позитиван став",
@@ -726,14 +728,14 @@
 	"Previous 30 days": "Претходних 30 дана",
 	"Previous 7 days": "Претходних 7 дана",
 	"Profile Image": "Слика профила",
-	"Prompt (e.g. Tell me a fun fact about the Roman Empire)": "Упит (нпр. „реци ми занимљивост о Римском царству“)",
+	"Prompt (e.g. Tell me a fun fact about the Roman Empire)": "Упит (нпр. „подели занимљивост о Римском царству“)",
 	"Prompt Content": "Садржај упита",
 	"Prompt created successfully": "",
 	"Prompt suggestions": "Предлози упита",
-	"Prompt updated successfully": "",
+	"Prompt updated successfully": "Упит измењен успешно",
 	"Prompts": "Упити",
-	"Prompts Access": "",
-	"Proxy URL": "",
+	"Prompts Access": "Приступ упитима",
+	"Proxy URL": "Адреса посредника",
 	"Pull \"{{searchValue}}\" from Ollama.com": "Повуците \"{{searchValue}}\" са Ollama.com",
 	"Pull a model from Ollama.com": "Повуците модел са Ollama.com",
 	"Query Generation Prompt": "",
@@ -741,18 +743,18 @@
 	"RAG Template": "RAG шаблон",
 	"Rating": "Оцена",
 	"Re-rank models by topic similarity": "",
-	"Read": "",
+	"Read": "Читање",
 	"Read Aloud": "Прочитај наглас",
-	"Reasoning Effort": "",
+	"Reasoning Effort": "Јачина размишљања",
 	"Record voice": "Сними глас",
 	"Redirecting you to OpenWebUI Community": "Преусмеравање на OpenWebUI заједницу",
 	"Reduces the probability of generating nonsense. A higher value (e.g. 100) will give more diverse answers, while a lower value (e.g. 10) will be more conservative. (Default: 40)": "",
 	"Refer to yourself as \"User\" (e.g., \"User is learning Spanish\")": "",
-	"References from": "",
+	"References from": "Референце од",
 	"Refused when it shouldn't have": "Одбијено када није требало",
-	"Regenerate": "Регенериши",
+	"Regenerate": "Поново створи",
 	"Release Notes": "Напомене о издању",
-	"Relevance": "",
+	"Relevance": "Примењивост",
 	"Remove": "Уклони",
 	"Remove Model": "Уклони модел",
 	"Rename": "Преименуј",
@@ -763,46 +765,46 @@
 	"Reranking Model": "Модел поновног рангирања",
 	"Reranking model disabled": "Модел поновног рангирања онемогућен",
 	"Reranking model set to \"{{reranking_model}}\"": "Модел поновног рангирања подешен на \"{{reranking_model}}\"",
-	"Reset": "",
-	"Reset All Models": "",
+	"Reset": "Поврати",
+	"Reset All Models": "Поврати све моделе",
 	"Reset Upload Directory": "",
 	"Reset Vector Storage/Knowledge": "",
 	"Reset view": "",
 	"Response notifications cannot be activated as the website permissions have been denied. Please visit your browser settings to grant the necessary access.": "",
 	"Response splitting": "",
-	"Result": "",
+	"Result": "Исход",
 	"Retrieval Query Generation": "",
-	"Rich Text Input for Chat": "",
+	"Rich Text Input for Chat": "Богат унос текста у ћаскању",
 	"RK": "",
 	"Role": "Улога",
 	"Rosé Pine": "Rosé Pine",
 	"Rosé Pine Dawn": "Rosé Pine Dawn",
 	"RTL": "ДНЛ",
-	"Run": "",
-	"Running": "",
+	"Run": "Покрени",
+	"Running": "Покрећем",
 	"Save": "Сачувај",
 	"Save & Create": "Сачувај и направи",
 	"Save & Update": "Сачувај и ажурирај",
-	"Save As Copy": "",
-	"Save Tag": "",
-	"Saved": "",
+	"Save As Copy": "Сачувај као копију",
+	"Save Tag": "Сачувај ознаку",
+	"Saved": "Сачувано",
 	"Saving chat logs directly to your browser's storage is no longer supported. Please take a moment to download and delete your chat logs by clicking the button below. Don't worry, you can easily re-import your chat logs to the backend through": "Чување ћаскања директно у складиште вашег прегледача више није подржано. Одвојите тренутак да преузмете и избришете ваша ћаскања кликом на дугме испод. Не брините, можете лако поново увезти ваша ћаскања у бекенд кроз",
-	"Scroll to bottom when switching between branches": "",
+	"Scroll to bottom when switching between branches": "Иди на дно странице приликом промене гране",
 	"Search": "Претражи",
 	"Search a model": "Претражи модел",
-	"Search Base": "",
+	"Search Base": "Претражи базу",
 	"Search Chats": "Претражи ћаскања",
-	"Search Collection": "",
-	"Search Filters": "",
+	"Search Collection": "Претражи колекцију",
+	"Search Filters": "Претражи филтере",
 	"search for tags": "",
 	"Search Functions": "Претражи функције",
-	"Search Knowledge": "",
+	"Search Knowledge": "Претражи знање",
 	"Search Models": "Модели претраге",
-	"Search options": "",
+	"Search options": "Опције претраге",
 	"Search Prompts": "Претражи упите",
 	"Search Result Count": "Број резултата претраге",
-	"Search the web": "",
-	"Search Tools": "",
+	"Search the web": "Претражи веб",
+	"Search Tools": "Алати претраге",
 	"SearchApi API Key": "",
 	"SearchApi Engine": "",
 	"Searched {{count}} sites": "",
@@ -862,7 +864,7 @@
 	"Share Chat": "Подели ћаскање",
 	"Share to OpenWebUI Community": "Подели са OpenWebUI заједницом",
 	"Show": "Прикажи",
-	"Show \"What's New\" modal on login": "",
+	"Show \"What's New\" modal on login": "Прикажи \"Погледај шта је ново\" прозорче при пријави",
 	"Show Admin Details in Account Pending Overlay": "",
 	"Show shortcuts": "Прикажи пречице",
 	"Show your support!": "",
@@ -879,23 +881,23 @@
 	"Speech Playback Speed": "",
 	"Speech recognition error: {{error}}": "Грешка у препознавању говора: {{error}}",
 	"Speech-to-Text Engine": "Мотор за говор у текст",
-	"Stop": "",
+	"Stop": "Заустави",
 	"Stop Sequence": "Секвенца заустављања",
 	"Stream Chat Response": "",
-	"STT Model": "",
+	"STT Model": "STT модел",
 	"STT Settings": "STT подешавања",
 	"Subtitle (e.g. about the Roman Empire)": "Поднаслов (нпр. о Римском царству)",
 	"Success": "Успех",
 	"Successfully updated.": "Успешно ажурирано.",
 	"Suggested": "Предложено",
-	"Support": "",
-	"Support this plugin:": "",
-	"Sync directory": "",
+	"Support": "Подршка",
+	"Support this plugin:": "Подржите овај прикључак",
+	"Sync directory": "Фасцикла усклађивања",
 	"System": "Систем",
-	"System Instructions": "",
+	"System Instructions": "Системске инструкције",
 	"System Prompt": "Системски упит",
-	"Tags Generation": "",
-	"Tags Generation Prompt": "",
+	"Tags Generation": "Стварање ознака",
+	"Tags Generation Prompt": "Упит стварања ознака",
 	"Tail free sampling is used to reduce the impact of less probable tokens from the output. A higher value (e.g., 2.0) will reduce the impact more, while a value of 1.0 disables this setting. (default: 1)": "",
 	"Tap to interrupt": "",
 	"Tavily API Key": "",
@@ -903,7 +905,7 @@
 	"Temperature": "Температура",
 	"Template": "Шаблон",
 	"Temporary Chat": "Привремено ћаскање",
-	"Text Splitter": "",
+	"Text Splitter": "Раздвајач текста",
 	"Text-to-Speech Engine": "Мотор за текст у говор",
 	"Tfs Z": "Tfs Z",
 	"Thanks for your feedback!": "Хвала на вашем коментару!",
@@ -920,19 +922,19 @@
 	"The score should be a value between 0.0 (0%) and 1.0 (100%).": "Резултат треба да буде вредност између 0.0 (0%) и 1.0 (100%).",
 	"The temperature of the model. Increasing the temperature will make the model answer more creatively. (Default: 0.8)": "",
 	"Theme": "Тема",
-	"Thinking...": "",
-	"This action cannot be undone. Do you wish to continue?": "",
+	"Thinking...": "Размишљам...",
+	"This action cannot be undone. Do you wish to continue?": "Ова радња се не може опозвати. Да ли желите наставити?",
 	"This ensures that your valuable conversations are securely saved to your backend database. Thank you!": "Ово осигурава да су ваши вредни разговори безбедно сачувани у вашој бекенд бази података. Хвала вам!",
 	"This is an experimental feature, it may not function as expected and is subject to change at any time.": "",
 	"This option controls how many tokens are preserved when refreshing the context. For example, if set to 2, the last 2 tokens of the conversation context will be retained. Preserving context can help maintain the continuity of a conversation, but it may reduce the ability to respond to new topics. (Default: 24)": "",
 	"This option sets the maximum number of tokens the model can generate in its response. Increasing this limit allows the model to provide longer answers, but it may also increase the likelihood of unhelpful or irrelevant content being generated.  (Default: 128)": "",
 	"This option will delete all existing files in the collection and replace them with newly uploaded files.": "",
 	"This response was generated by \"{{model}}\"": "",
-	"This will delete": "",
-	"This will delete <strong>{{NAME}}</strong> and <strong>all its contents</strong>.": "",
-	"This will delete all models including custom models": "",
-	"This will delete all models including custom models and cannot be undone.": "",
-	"This will reset the knowledge base and sync all files. Do you wish to continue?": "",
+	"This will delete": "Ово ће обрисати",
+	"This will delete <strong>{{NAME}}</strong> and <strong>all its contents</strong>.": "Ово ће обрисати <strong>{{NAME}}</strong> и <strong>сав садржај унутар</strong>.",
+	"This will delete all models including custom models": "Ово ће обрисати све моделе укључујући прилагођене моделе",
+	"This will delete all models including custom models and cannot be undone.": "Ово ће обрисати све моделе укључујући прилагођене моделе и не може се опозвати.",
+	"This will reset the knowledge base and sync all files. Do you wish to continue?": "Ово ће обрисати базу знања и ускладити све датотеке. Да ли желите наставити?",
 	"Thorough explanation": "Детаљно објашњење",
 	"Thought for {{DURATION}}": "",
 	"Tika": "",
@@ -944,7 +946,7 @@
 	"Title Auto-Generation": "Самостално стварање наслова",
 	"Title cannot be an empty string.": "Наслов не може бити празан низ.",
 	"Title Generation Prompt": "Упит за стварање наслова",
-	"TLS": "",
+	"TLS": "ТЛС",
 	"To access the available model names for downloading,": "Да бисте приступили доступним именима модела за преузимање,",
 	"To access the GGUF models available for downloading,": "Да бисте приступили GGUF моделима доступним за преузимање,",
 	"To access the WebUI, please reach out to the administrator. Admins can manage user statuses from the Admin Panel.": "",
@@ -954,69 +956,70 @@
 	"To select actions here, add them to the \"Functions\" workspace first.": "",
 	"To select filters here, add them to the \"Functions\" workspace first.": "",
 	"To select toolkits here, add them to the \"Tools\" workspace first.": "",
-	"Toast notifications for new updates": "",
+	"Toast notifications for new updates": "Тост-обавештења за нове исправке",
 	"Today": "Данас",
 	"Toggle settings": "Пребаци подешавања",
 	"Toggle sidebar": "Пребаци бочну траку",
-	"Token": "",
+	"Token": "Жетон",
 	"Tokens To Keep On Context Refresh (num_keep)": "",
-	"Too verbose": "",
-	"Tool created successfully": "",
-	"Tool deleted successfully": "",
-	"Tool Description": "",
-	"Tool ID": "",
-	"Tool imported successfully": "",
-	"Tool Name": "",
-	"Tool updated successfully": "",
+	"Too verbose": "Преопширно",
+	"Tool created successfully": "Алат направљен успешно",
+	"Tool deleted successfully": "Алат обрисан успешно",
+	"Tool Description": "Опис алата",
+	"Tool ID": "ИБ алата",
+	"Tool imported successfully": "Алат увезен успешно",
+	"Tool Name": "Назив алата",
+	"Tool updated successfully": "Алат ажуриран успешно",
 	"Tools": "Алати",
 	"Tools Access": "Приступ алатима",
 	"Tools are a function calling system with arbitrary code execution": "",
+	"Tools Function Calling Prompt": "",
 	"Tools have a function calling system that allows arbitrary code execution": "",
 	"Tools have a function calling system that allows arbitrary code execution.": "",
 	"Top K": "Топ К",
 	"Top P": "Топ П",
 	"Transformers": "",
 	"Trouble accessing Ollama?": "Проблеми са приступом Ollama-и?",
-	"TTS Model": "",
+	"TTS Model": "TTS модел",
 	"TTS Settings": "TTS подешавања",
-	"TTS Voice": "",
+	"TTS Voice": "TTS глас",
 	"Type": "Тип",
 	"Type Hugging Face Resolve (Download) URL": "Унесите Hugging Face Resolve (Download) адресу",
 	"Uh-oh! There was an issue with the response.": "",
-	"UI": "",
-	"Unarchive All": "",
-	"Unarchive All Archived Chats": "",
-	"Unarchive Chat": "",
-	"Unlock mysteries": "",
-	"Unpin": "",
-	"Unravel secrets": "",
-	"Untagged": "",
-	"Update": "",
+	"UI": "Прочеље",
+	"Unarchive All": "Деархивирај све",
+	"Unarchive All Archived Chats": "Деархивирај све архиве",
+	"Unarchive Chat": "Деархивирај ћаскање",
+	"Unlock mysteries": "Реши мистерије",
+	"Unpin": "Откачи",
+	"Unravel secrets": "Разоткриј тајне",
+	"Untagged": "Неозначено",
+	"Update": "Ажурирај",
 	"Update and Copy Link": "Ажурирај и копирај везу",
-	"Update for the latest features and improvements.": "",
+	"Update for the latest features and improvements.": "Ажурирајте за најновије могућности и побољшања.",
 	"Update password": "Ажурирај лозинку",
-	"Updated": "",
-	"Updated at": "",
-	"Updated At": "",
-	"Upload": "",
+	"Updated": "Ажурирано",
+	"Updated at": "Ажурирано у",
+	"Updated At": "Ажурирано у",
+	"Upload": "Отпреми",
 	"Upload a GGUF model": "Отпреми GGUF модел",
-	"Upload directory": "",
-	"Upload files": "",
+	"Upload directory": "Отпреми фасциклу",
+	"Upload files": "Отпремање датотека",
 	"Upload Files": "Отпремање датотека",
-	"Upload Pipeline": "",
+	"Upload Pipeline": "Цевовод отпремања",
 	"Upload Progress": "Напредак отпремања",
-	"URL": "",
+	"URL": "УРЛ",
 	"URL Mode": "Режим адресе",
 	"Use '#' in the prompt input to load and include your knowledge.": "",
 	"Use Gravatar": "Користи Граватар",
 	"Use groups to group your users and assign permissions.": "Користите групе да бисте разврстали ваше кориснике и доделили овлашћења.",
 	"Use Initials": "Користи иницијале",
-	"use_mlock (Ollama)": "усе _млоцк (Оллама)",
-	"use_mmap (Ollama)": "усе _ммап (Оллама)",
+	"use_mlock (Ollama)": "use_mlock (Ollama)",
+	"use_mmap (Ollama)": "use_mmap (Ollama)",
 	"user": "корисник",
-	"User": "",
-	"User location successfully retrieved.": "",
-	"Username": "",
+	"User": "Корисник",
+	"User location successfully retrieved.": "Корисничка локација успешно добављена.",
+	"Username": "Корисничко име",
 	"Users": "Корисници",
 	"Using the default arena model with all models. Click the plus button to add custom models.": "",
 	"Utilize": "Искористи",
@@ -1028,23 +1031,23 @@
 	"variable to have them replaced with clipboard content.": "променљива за замену са садржајем оставе.",
 	"Version": "Издање",
 	"Version {{selectedVersion}} of {{totalVersions}}": "",
-	"View Replies": "",
-	"Visibility": "",
-	"Voice": "",
-	"Voice Input": "",
+	"View Replies": "Погледај одговоре",
+	"Visibility": "Видљивост",
+	"Voice": "Глас",
+	"Voice Input": "Гласовни унос",
 	"Warning": "Упозорење",
-	"Warning:": "",
+	"Warning:": "Упозорење:",
 	"Warning: Enabling this will allow users to upload arbitrary code on the server.": "",
 	"Warning: If you update or change your embedding model, you will need to re-import all documents.": "Упозорење: ако ажурирате или промените ваш модел уградње, мораћете поново да увезете све документе.",
 	"Web": "Веб",
-	"Web API": "",
+	"Web API": "Веб АПИ",
 	"Web Loader Settings": "Подешавања веб учитавача",
-	"Web Search": "Wеб претрага",
-	"Web Search Engine": "Wеб претраживач",
+	"Web Search": "Веб претрага",
+	"Web Search Engine": "Веб претраживач",
 	"Web Search Query Generation": "",
 	"Webhook URL": "Адреса веб-куке",
 	"WebUI Settings": "Подешавања веб интерфејса",
-	"WebUI URL": "",
+	"WebUI URL": "WebUI адреса",
 	"WebUI will make requests to \"{{url}}/api/chat\"": "",
 	"WebUI will make requests to \"{{url}}/chat/completions\"": "",
 	"What are you trying to achieve?": "",
@@ -1053,23 +1056,24 @@
 	"When enabled, the model will respond to each chat message in real-time, generating a response as soon as the user sends a message. This mode is useful for live chat applications, but may impact performance on slower hardware.": "",
 	"wherever you are": "",
 	"Whisper (Local)": "",
-	"Why?": "",
-	"Widescreen Mode": "",
+	"Why?": "Зашто?",
+	"Widescreen Mode": "Режим широког екрана",
 	"Won": "Победа",
 	"Works together with top-k. A higher value (e.g., 0.95) will lead to more diverse text, while a lower value (e.g., 0.5) will generate more focused and conservative text. (Default: 0.9)": "",
 	"Workspace": "Радни простор",
 	"Workspace Permissions": "",
-	"Write": "",
+	"Write": "Пиши",
 	"Write a prompt suggestion (e.g. Who are you?)": "Напишите предлог упита (нпр. „ко си ти?“)",
 	"Write a summary in 50 words that summarizes [topic or keyword].": "Напишите сажетак у 50 речи који резимира [тему или кључну реч].",
-	"Write something...": "",
+	"Write something...": "Упишите нешто...",
 	"Write your model template content here": "",
 	"Yesterday": "Јуче",
 	"You": "Ти",
 	"You can only chat with a maximum of {{maxCount}} file(s) at a time.": "",
-	"You can personalize your interactions with LLMs by adding memories through the 'Manage' button below, making them more helpful and tailored to you.": "",
+	"You can personalize your interactions with LLMs by adding memories through the 'Manage' button below, making them more helpful and tailored to you.": "Можете учинити разговор са ВЈМ-овима приснијим додавањем сећања користећи „Управљај“ думе испод и тиме их учинити приснијим и кориснијим.",
 	"You cannot upload an empty file.": "",
 	"You do not have permission to access this feature.": "",
+	"You do not have permission to upload files": "",
 	"You do not have permission to upload files.": "",
 	"You have no archived conversations.": "Немате архивиране разговоре.",
 	"You have shared this chat": "Поделили сте ово ћаскање",

Einige Dateien werden nicht angezeigt, da zu viele Dateien in diesem Diff geändert wurden.