Bladeren bron

Merge remote-tracking branch 'oui/dev' into feat_s3_virtual_path

orenzhang 2 maanden geleden
bovenliggende
commit
9748a030f7
32 gewijzigde bestanden met toevoegingen van 584 en 353 verwijderingen
  1. 12 0
      backend/open_webui/config.py
  2. 6 3
      backend/open_webui/functions.py
  3. 4 0
      backend/open_webui/main.py
  4. 22 0
      backend/open_webui/retrieval/loaders/main.py
  5. 47 9
      backend/open_webui/routers/audio.py
  6. 0 13
      backend/open_webui/routers/auths.py
  7. 27 1
      backend/open_webui/routers/retrieval.py
  8. 46 0
      backend/open_webui/routers/tasks.py
  9. 37 16
      backend/open_webui/utils/middleware.py
  10. 1 10
      backend/open_webui/utils/oauth.py
  11. 7 1
      backend/open_webui/utils/payload.py
  12. 2 2
      backend/open_webui/utils/response.py
  13. 1 0
      backend/requirements.txt
  14. 1 0
      pyproject.toml
  15. 6 0
      src/lib/apis/retrieval/index.ts
  16. 3 3
      src/lib/components/admin/Functions/FunctionEditor.svelte
  17. 35 1
      src/lib/components/admin/Settings/Documents.svelte
  18. 13 0
      src/lib/components/admin/Settings/WebSearch.svelte
  19. 18 4
      src/lib/components/chat/Chat.svelte
  20. 4 1
      src/lib/components/chat/ChatPlaceholder.svelte
  21. 2 0
      src/lib/components/chat/Messages.svelte
  22. 11 18
      src/lib/components/chat/Messages/CodeBlock.svelte
  23. 4 4
      src/lib/components/chat/Messages/Markdown/MarkdownTokens.svelte
  24. 3 1
      src/lib/components/chat/Placeholder.svelte
  25. 8 3
      src/lib/components/common/CodeEditor.svelte
  26. 0 1
      src/lib/components/workspace/Models/ModelEditor.svelte
  27. 3 3
      src/lib/components/workspace/Tools/ToolkitEditor.svelte
  28. 50 50
      src/lib/i18n/locales/ca-ES/translation.json
  29. 67 67
      src/lib/i18n/locales/fi-FI/translation.json
  30. 121 127
      src/lib/i18n/locales/pl-PL/translation.json
  31. 13 13
      src/lib/i18n/locales/zh-CN/translation.json
  32. 10 2
      src/routes/(app)/workspace/models/create/+page.svelte

+ 12 - 0
backend/open_webui/config.py

@@ -1583,6 +1583,18 @@ TIKA_SERVER_URL = PersistentConfig(
     os.getenv("TIKA_SERVER_URL", "http://tika:9998"),  # Default for sidecar deployment
 )
 
+DOCUMENT_INTELLIGENCE_ENDPOINT = PersistentConfig(
+    "DOCUMENT_INTELLIGENCE_ENDPOINT",
+    "rag.document_intelligence_endpoint",
+    os.getenv("DOCUMENT_INTELLIGENCE_ENDPOINT", ""),
+)
+
+DOCUMENT_INTELLIGENCE_KEY = PersistentConfig(
+    "DOCUMENT_INTELLIGENCE_KEY",
+    "rag.document_intelligence_key",
+    os.getenv("DOCUMENT_INTELLIGENCE_KEY", ""),
+)
+
 RAG_TOP_K = PersistentConfig(
     "RAG_TOP_K", "rag.top_k", int(os.environ.get("RAG_TOP_K", "3"))
 )

+ 6 - 3
backend/open_webui/functions.py

@@ -2,6 +2,7 @@ import logging
 import sys
 import inspect
 import json
+import asyncio
 
 from pydantic import BaseModel
 from typing import AsyncGenerator, Generator, Iterator
@@ -76,11 +77,13 @@ async def get_function_models(request):
         if hasattr(function_module, "pipes"):
             sub_pipes = []
 
-            # Check if pipes is a function or a list
-
+            # Handle pipes being a list, sync function, or async function
             try:
                 if callable(function_module.pipes):
-                    sub_pipes = function_module.pipes()
+                    if asyncio.iscoroutinefunction(function_module.pipes):
+                        sub_pipes = await function_module.pipes()
+                    else:
+                        sub_pipes = function_module.pipes()
                 else:
                     sub_pipes = function_module.pipes
             except Exception as e:

+ 4 - 0
backend/open_webui/main.py

@@ -180,6 +180,8 @@ from open_webui.config import (
     CHUNK_SIZE,
     CONTENT_EXTRACTION_ENGINE,
     TIKA_SERVER_URL,
+    DOCUMENT_INTELLIGENCE_ENDPOINT,
+    DOCUMENT_INTELLIGENCE_KEY,
     RAG_TOP_K,
     RAG_TEXT_SPLITTER,
     TIKTOKEN_ENCODING_NAME,
@@ -533,6 +535,8 @@ app.state.config.ENABLE_RAG_WEB_LOADER_SSL_VERIFICATION = (
 
 app.state.config.CONTENT_EXTRACTION_ENGINE = CONTENT_EXTRACTION_ENGINE
 app.state.config.TIKA_SERVER_URL = TIKA_SERVER_URL
+app.state.config.DOCUMENT_INTELLIGENCE_ENDPOINT = DOCUMENT_INTELLIGENCE_ENDPOINT
+app.state.config.DOCUMENT_INTELLIGENCE_KEY = DOCUMENT_INTELLIGENCE_KEY
 
 app.state.config.TEXT_SPLITTER = RAG_TEXT_SPLITTER
 app.state.config.TIKTOKEN_ENCODING_NAME = TIKTOKEN_ENCODING_NAME

+ 22 - 0
backend/open_webui/retrieval/loaders/main.py

@@ -4,6 +4,7 @@ import ftfy
 import sys
 
 from langchain_community.document_loaders import (
+    AzureAIDocumentIntelligenceLoader,
     BSHTMLLoader,
     CSVLoader,
     Docx2txtLoader,
@@ -147,6 +148,27 @@ class Loader:
                     file_path=file_path,
                     mime_type=file_content_type,
                 )
+        elif (
+            self.engine == "document_intelligence"
+            and self.kwargs.get("DOCUMENT_INTELLIGENCE_ENDPOINT") != ""
+            and self.kwargs.get("DOCUMENT_INTELLIGENCE_KEY") != ""
+            and (
+                file_ext in ["pdf", "xls", "xlsx", "docx", "ppt", "pptx"]
+                or file_content_type
+                in [
+                    "application/vnd.ms-excel",
+                    "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
+                    "application/vnd.openxmlformats-officedocument.wordprocessingml.document",
+                    "application/vnd.ms-powerpoint",
+                    "application/vnd.openxmlformats-officedocument.presentationml.presentation",
+                ]
+            )
+        ):
+            loader = AzureAIDocumentIntelligenceLoader(
+                file_path=file_path,
+                api_endpoint=self.kwargs.get("DOCUMENT_INTELLIGENCE_ENDPOINT"),
+                api_key=self.kwargs.get("DOCUMENT_INTELLIGENCE_KEY"),
+            )
         else:
             if file_ext == "pdf":
                 loader = PyPDFLoader(

+ 47 - 9
backend/open_webui/routers/audio.py

@@ -680,7 +680,22 @@ def transcription(
 def get_available_models(request: Request) -> list[dict]:
     available_models = []
     if request.app.state.config.TTS_ENGINE == "openai":
-        available_models = [{"id": "tts-1"}, {"id": "tts-1-hd"}]
+        # Use custom endpoint if not using the official OpenAI API URL
+        if not request.app.state.config.TTS_OPENAI_API_BASE_URL.startswith(
+            "https://api.openai.com"
+        ):
+            try:
+                response = requests.get(
+                    f"{request.app.state.config.TTS_OPENAI_API_BASE_URL}/audio/models"
+                )
+                response.raise_for_status()
+                data = response.json()
+                available_models = data.get("models", [])
+            except Exception as e:
+                log.error(f"Error fetching models from custom endpoint: {str(e)}")
+                available_models = [{"id": "tts-1"}, {"id": "tts-1-hd"}]
+        else:
+            available_models = [{"id": "tts-1"}, {"id": "tts-1-hd"}]
     elif request.app.state.config.TTS_ENGINE == "elevenlabs":
         try:
             response = requests.get(
@@ -711,14 +726,37 @@ def get_available_voices(request) -> dict:
     """Returns {voice_id: voice_name} dict"""
     available_voices = {}
     if request.app.state.config.TTS_ENGINE == "openai":
-        available_voices = {
-            "alloy": "alloy",
-            "echo": "echo",
-            "fable": "fable",
-            "onyx": "onyx",
-            "nova": "nova",
-            "shimmer": "shimmer",
-        }
+        # Use custom endpoint if not using the official OpenAI API URL
+        if not request.app.state.config.TTS_OPENAI_API_BASE_URL.startswith(
+            "https://api.openai.com"
+        ):
+            try:
+                response = requests.get(
+                    f"{request.app.state.config.TTS_OPENAI_API_BASE_URL}/audio/voices"
+                )
+                response.raise_for_status()
+                data = response.json()
+                voices_list = data.get("voices", [])
+                available_voices = {voice["id"]: voice["name"] for voice in voices_list}
+            except Exception as e:
+                log.error(f"Error fetching voices from custom endpoint: {str(e)}")
+                available_voices = {
+                    "alloy": "alloy",
+                    "echo": "echo",
+                    "fable": "fable",
+                    "onyx": "onyx",
+                    "nova": "nova",
+                    "shimmer": "shimmer",
+                }
+        else:
+            available_voices = {
+                "alloy": "alloy",
+                "echo": "echo",
+                "fable": "fable",
+                "onyx": "onyx",
+                "nova": "nova",
+                "shimmer": "shimmer",
+            }
     elif request.app.state.config.TTS_ENGINE == "elevenlabs":
         try:
             available_voices = get_elevenlabs_voices(

+ 0 - 13
backend/open_webui/routers/auths.py

@@ -252,14 +252,6 @@ async def ldap_auth(request: Request, response: Response, form_data: LdapForm):
             if not user:
                 try:
                     user_count = Users.get_num_users()
-                    if (
-                        request.app.state.USER_COUNT
-                        and user_count >= request.app.state.USER_COUNT
-                    ):
-                        raise HTTPException(
-                            status.HTTP_403_FORBIDDEN,
-                            detail=ERROR_MESSAGES.ACCESS_PROHIBITED,
-                        )
 
                     role = (
                         "admin"
@@ -439,11 +431,6 @@ async def signup(request: Request, response: Response, form_data: SignupForm):
             )
 
     user_count = Users.get_num_users()
-    if request.app.state.USER_COUNT and user_count >= request.app.state.USER_COUNT:
-        raise HTTPException(
-            status.HTTP_403_FORBIDDEN, detail=ERROR_MESSAGES.ACCESS_PROHIBITED
-        )
-
     if not validate_email_format(form_data.email.lower()):
         raise HTTPException(
             status.HTTP_400_BAD_REQUEST, detail=ERROR_MESSAGES.INVALID_EMAIL_FORMAT

+ 27 - 1
backend/open_webui/routers/retrieval.py

@@ -356,6 +356,10 @@ async def get_rag_config(request: Request, user=Depends(get_admin_user)):
         "content_extraction": {
             "engine": request.app.state.config.CONTENT_EXTRACTION_ENGINE,
             "tika_server_url": request.app.state.config.TIKA_SERVER_URL,
+            "document_intelligence_config": {
+                "endpoint": request.app.state.config.DOCUMENT_INTELLIGENCE_ENDPOINT,
+                "key": request.app.state.config.DOCUMENT_INTELLIGENCE_KEY,
+            },
         },
         "chunk": {
             "text_splitter": request.app.state.config.TEXT_SPLITTER,
@@ -399,6 +403,7 @@ async def get_rag_config(request: Request, user=Depends(get_admin_user)):
                 "bing_search_v7_subscription_key": request.app.state.config.BING_SEARCH_V7_SUBSCRIPTION_KEY,
                 "exa_api_key": request.app.state.config.EXA_API_KEY,
                 "result_count": request.app.state.config.RAG_WEB_SEARCH_RESULT_COUNT,
+                "trust_env": request.app.state.config.RAG_WEB_SEARCH_TRUST_ENV,
                 "concurrent_requests": request.app.state.config.RAG_WEB_SEARCH_CONCURRENT_REQUESTS,
                 "domain_filter_list": request.app.state.config.RAG_WEB_SEARCH_DOMAIN_FILTER_LIST,
             },
@@ -411,9 +416,15 @@ class FileConfig(BaseModel):
     max_count: Optional[int] = None
 
 
+class DocumentIntelligenceConfigForm(BaseModel):
+    endpoint: str
+    key: str
+
+
 class ContentExtractionConfig(BaseModel):
     engine: str = ""
     tika_server_url: Optional[str] = None
+    document_intelligence_config: Optional[DocumentIntelligenceConfigForm] = None
 
 
 class ChunkParamUpdateForm(BaseModel):
@@ -501,13 +512,22 @@ async def update_rag_config(
         request.app.state.config.FILE_MAX_COUNT = form_data.file.max_count
 
     if form_data.content_extraction is not None:
-        log.info(f"Updating text settings: {form_data.content_extraction}")
+        log.info(
+            f"Updating content extraction: {request.app.state.config.CONTENT_EXTRACTION_ENGINE} to {form_data.content_extraction.engine}"
+        )
         request.app.state.config.CONTENT_EXTRACTION_ENGINE = (
             form_data.content_extraction.engine
         )
         request.app.state.config.TIKA_SERVER_URL = (
             form_data.content_extraction.tika_server_url
         )
+        if form_data.content_extraction.document_intelligence_config is not None:
+            request.app.state.config.DOCUMENT_INTELLIGENCE_ENDPOINT = (
+                form_data.content_extraction.document_intelligence_config.endpoint
+            )
+            request.app.state.config.DOCUMENT_INTELLIGENCE_KEY = (
+                form_data.content_extraction.document_intelligence_config.key
+            )
 
     if form_data.chunk is not None:
         request.app.state.config.TEXT_SPLITTER = form_data.chunk.text_splitter
@@ -604,6 +624,10 @@ async def update_rag_config(
         "content_extraction": {
             "engine": request.app.state.config.CONTENT_EXTRACTION_ENGINE,
             "tika_server_url": request.app.state.config.TIKA_SERVER_URL,
+            "document_intelligence_config": {
+                "endpoint": request.app.state.config.DOCUMENT_INTELLIGENCE_ENDPOINT,
+                "key": request.app.state.config.DOCUMENT_INTELLIGENCE_KEY,
+            },
         },
         "chunk": {
             "text_splitter": request.app.state.config.TEXT_SPLITTER,
@@ -937,6 +961,8 @@ def process_file(
                     engine=request.app.state.config.CONTENT_EXTRACTION_ENGINE,
                     TIKA_SERVER_URL=request.app.state.config.TIKA_SERVER_URL,
                     PDF_EXTRACT_IMAGES=request.app.state.config.PDF_EXTRACT_IMAGES,
+                    DOCUMENT_INTELLIGENCE_ENDPOINT=request.app.state.config.DOCUMENT_INTELLIGENCE_ENDPOINT,
+                    DOCUMENT_INTELLIGENCE_KEY=request.app.state.config.DOCUMENT_INTELLIGENCE_KEY,
                 )
                 docs = loader.load(
                     file.filename, file.meta.get("content_type"), file_path

+ 46 - 0
backend/open_webui/routers/tasks.py

@@ -20,6 +20,10 @@ from open_webui.utils.auth import get_admin_user, get_verified_user
 from open_webui.constants import TASKS
 
 from open_webui.routers.pipelines import process_pipeline_inlet_filter
+from open_webui.utils.filter import (
+    get_sorted_filter_ids,
+    process_filter_functions,
+)
 from open_webui.utils.task import get_task_model_id
 
 from open_webui.config import (
@@ -221,6 +225,12 @@ async def generate_title(
         },
     }
 
+    # Process the payload through the pipeline
+    try:
+        payload = await process_pipeline_inlet_filter(request, payload, user, models)
+    except Exception as e:
+        raise e
+
     try:
         return await generate_chat_completion(request, form_data=payload, user=user)
     except Exception as e:
@@ -290,6 +300,12 @@ async def generate_chat_tags(
         },
     }
 
+    # Process the payload through the pipeline
+    try:
+        payload = await process_pipeline_inlet_filter(request, payload, user, models)
+    except Exception as e:
+        raise e
+
     try:
         return await generate_chat_completion(request, form_data=payload, user=user)
     except Exception as e:
@@ -356,6 +372,12 @@ async def generate_image_prompt(
         },
     }
 
+    # Process the payload through the pipeline
+    try:
+        payload = await process_pipeline_inlet_filter(request, payload, user, models)
+    except Exception as e:
+        raise e
+
     try:
         return await generate_chat_completion(request, form_data=payload, user=user)
     except Exception as e:
@@ -433,6 +455,12 @@ async def generate_queries(
         },
     }
 
+    # Process the payload through the pipeline
+    try:
+        payload = await process_pipeline_inlet_filter(request, payload, user, models)
+    except Exception as e:
+        raise e
+
     try:
         return await generate_chat_completion(request, form_data=payload, user=user)
     except Exception as e:
@@ -514,6 +542,12 @@ async def generate_autocompletion(
         },
     }
 
+    # Process the payload through the pipeline
+    try:
+        payload = await process_pipeline_inlet_filter(request, payload, user, models)
+    except Exception as e:
+        raise e
+
     try:
         return await generate_chat_completion(request, form_data=payload, user=user)
     except Exception as e:
@@ -584,6 +618,12 @@ async def generate_emoji(
         },
     }
 
+    # Process the payload through the pipeline
+    try:
+        payload = await process_pipeline_inlet_filter(request, payload, user, models)
+    except Exception as e:
+        raise e
+
     try:
         return await generate_chat_completion(request, form_data=payload, user=user)
     except Exception as e:
@@ -644,6 +684,12 @@ async def generate_moa_response(
         },
     }
 
+    # Process the payload through the pipeline
+    try:
+        payload = await process_pipeline_inlet_filter(request, payload, user, models)
+    except Exception as e:
+        raise e
+
     try:
         return await generate_chat_completion(request, form_data=payload, user=user)
     except Exception as e:

+ 37 - 16
backend/open_webui/utils/middleware.py

@@ -1127,12 +1127,12 @@ async def process_chat_response(
 
                         if reasoning_duration is not None:
                             if raw:
-                                content = f'{content}\n<{block["tag"]}>{block["content"]}</{block["tag"]}>\n'
+                                content = f'{content}\n<{block["start_tag"]}>{block["content"]}<{block["end_tag"]}>\n'
                             else:
                                 content = f'{content}\n<details type="reasoning" done="true" duration="{reasoning_duration}">\n<summary>Thought for {reasoning_duration} seconds</summary>\n{reasoning_display_content}\n</details>\n'
                         else:
                             if raw:
-                                content = f'{content}\n<{block["tag"]}>{block["content"]}</{block["tag"]}>\n'
+                                content = f'{content}\n<{block["start_tag"]}>{block["content"]}<{block["end_tag"]}>\n'
                             else:
                                 content = f'{content}\n<details type="reasoning" done="false">\n<summary>Thinking…</summary>\n{reasoning_display_content}\n</details>\n'
 
@@ -1228,9 +1228,9 @@ async def process_chat_response(
                     return attributes
 
                 if content_blocks[-1]["type"] == "text":
-                    for tag in tags:
+                    for start_tag, end_tag in tags:
                         # Match start tag e.g., <tag> or <tag attr="value">
-                        start_tag_pattern = rf"<{tag}(\s.*?)?>"
+                        start_tag_pattern = rf"<{re.escape(start_tag)}(\s.*?)?>"
                         match = re.search(start_tag_pattern, content)
                         if match:
                             attr_content = (
@@ -1263,7 +1263,8 @@ async def process_chat_response(
                             content_blocks.append(
                                 {
                                     "type": content_type,
-                                    "tag": tag,
+                                    "start_tag": start_tag,
+                                    "end_tag": end_tag,
                                     "attributes": attributes,
                                     "content": "",
                                     "started_at": time.time(),
@@ -1275,9 +1276,10 @@ async def process_chat_response(
 
                             break
                 elif content_blocks[-1]["type"] == content_type:
-                    tag = content_blocks[-1]["tag"]
+                    start_tag = content_blocks[-1]["start_tag"]
+                    end_tag = content_blocks[-1]["end_tag"]
                     # Match end tag e.g., </tag>
-                    end_tag_pattern = rf"</{tag}>"
+                    end_tag_pattern = rf"<{re.escape(end_tag)}>"
 
                     # Check if the content has the end tag
                     if re.search(end_tag_pattern, content):
@@ -1285,7 +1287,7 @@ async def process_chat_response(
 
                         block_content = content_blocks[-1]["content"]
                         # Strip start and end tags from the content
-                        start_tag_pattern = rf"<{tag}(.*?)>"
+                        start_tag_pattern = rf"<{re.escape(start_tag)}(.*?)>"
                         block_content = re.sub(
                             start_tag_pattern, "", block_content
                         ).strip()
@@ -1350,7 +1352,7 @@ async def process_chat_response(
 
                         # Clean processed content
                         content = re.sub(
-                            rf"<{tag}(.*?)>(.|\n)*?</{tag}>",
+                            rf"<{re.escape(start_tag)}(.*?)>(.|\n)*?<{re.escape(end_tag)}>",
                             "",
                             content,
                             flags=re.DOTALL,
@@ -1388,19 +1390,28 @@ async def process_chat_response(
 
             # We might want to disable this by default
             DETECT_REASONING = True
+            DETECT_SOLUTION = True
             DETECT_CODE_INTERPRETER = metadata.get("features", {}).get(
                 "code_interpreter", False
             )
 
             reasoning_tags = [
-                "think",
-                "thinking",
-                "reason",
-                "reasoning",
-                "thought",
-                "Thought",
+                ("think", "/think"),
+                ("thinking", "/thinking"),
+                ("reason", "/reason"),
+                ("reasoning", "/reasoning"),
+                ("thought", "/thought"),
+                ("Thought", "/Thought"),
+                ("|begin_of_thought|", "|end_of_thought|")
+            ]
+
+            code_interpreter_tags = [
+                ("code_interpreter", "/code_interpreter")
+            ]
+
+            solution_tags = [
+                ("|begin_of_solution|", "|end_of_solution|")
             ]
-            code_interpreter_tags = ["code_interpreter"]
 
             try:
                 for event in events:
@@ -1533,6 +1544,16 @@ async def process_chat_response(
                                         if end:
                                             break
 
+                                    if DETECT_SOLUTION:
+                                        content, content_blocks, _ = (
+                                            tag_content_handler(
+                                                "solution",
+                                                solution_tags,
+                                                content,
+                                                content_blocks,
+                                            )
+                                        )
+
                                     if ENABLE_REALTIME_CHAT_SAVE:
                                         # Save message in the database
                                         Chats.upsert_message_to_chat_by_id_and_message_id(

+ 1 - 10
backend/open_webui/utils/oauth.py

@@ -146,7 +146,7 @@ class OAuthManager:
             nested_claims = oauth_claim.split(".")
             for nested_claim in nested_claims:
                 claim_data = claim_data.get(nested_claim, {})
-            user_oauth_groups = claim_data if isinstance(claim_data, list) else None
+            user_oauth_groups = claim_data if isinstance(claim_data, list) else []
 
         user_current_groups: list[GroupModel] = Groups.get_groups_by_member_id(user.id)
         all_available_groups: list[GroupModel] = Groups.get_groups()
@@ -315,15 +315,6 @@ class OAuthManager:
         if not user:
             user_count = Users.get_num_users()
 
-            if (
-                request.app.state.USER_COUNT
-                and user_count >= request.app.state.USER_COUNT
-            ):
-                raise HTTPException(
-                    403,
-                    detail=ERROR_MESSAGES.ACCESS_PROHIBITED,
-                )
-
             # If the user does not exist, check if signups are enabled
             if auth_manager_config.ENABLE_OAUTH_SIGNUP:
                 # Check if an existing user with the same email already exists

+ 7 - 1
backend/open_webui/utils/payload.py

@@ -124,7 +124,7 @@ def convert_messages_openai_to_ollama(messages: list[dict]) -> list[dict]:
         tool_call_id = message.get("tool_call_id", None)
 
         # Check if the content is a string (just a simple message)
-        if isinstance(content, str):
+        if isinstance(content, str) and not tool_calls:
             # If the content is a string, it's pure text
             new_message["content"] = content
 
@@ -230,6 +230,12 @@ def convert_payload_openai_to_ollama(openai_payload: dict) -> dict:
                 "system"
             ]  # To prevent Ollama warning of invalid option provided
 
+    # If there is the "stop" parameter in the openai_payload, remap it to the ollama_payload.options
+    if "stop" in openai_payload:
+        ollama_options = ollama_payload.get("options", {})
+        ollama_options["stop"] = openai_payload.get("stop")
+        ollama_payload["options"] = ollama_options
+
     if "metadata" in openai_payload:
         ollama_payload["metadata"] = openai_payload["metadata"]
 

+ 2 - 2
backend/open_webui/utils/response.py

@@ -104,7 +104,7 @@ async def convert_streaming_response_ollama_to_openai(ollama_streaming_response)
         data = json.loads(data)
 
         model = data.get("model", "ollama")
-        message_content = data.get("message", {}).get("content", "")
+        message_content = data.get("message", {}).get("content", None)
         tool_calls = data.get("message", {}).get("tool_calls", None)
         openai_tool_calls = None
 
@@ -118,7 +118,7 @@ async def convert_streaming_response_ollama_to_openai(ollama_streaming_response)
             usage = convert_ollama_usage_to_openai(data)
 
         data = openai_chat_chunk_message_template(
-            model, message_content if not done else None, openai_tool_calls, usage
+            model, message_content, openai_tool_calls, usage
         )
 
         line = f"data: {json.dumps(data)}\n\n"

+ 1 - 0
backend/requirements.txt

@@ -71,6 +71,7 @@ validators==0.34.0
 psutil
 sentencepiece
 soundfile==0.13.1
+azure-ai-documentintelligence==1.0.0
 
 opencv-python-headless==4.11.0.86
 rapidocr-onnxruntime==1.3.24

+ 1 - 0
pyproject.toml

@@ -78,6 +78,7 @@ dependencies = [
     "psutil",
     "sentencepiece",
     "soundfile==0.13.1",
+    "azure-ai-documentintelligence==1.0.0",
 
     "opencv-python-headless==4.11.0.86",
     "rapidocr-onnxruntime==1.3.24",

+ 6 - 0
src/lib/apis/retrieval/index.ts

@@ -32,9 +32,15 @@ type ChunkConfigForm = {
 	chunk_overlap: number;
 };
 
+type DocumentIntelligenceConfigForm = {
+	key: string;
+	endpoint: string;
+};
+
 type ContentExtractConfigForm = {
 	engine: string;
 	tika_server_url: string | null;
+	document_intelligence_config: DocumentIntelligenceConfigForm | null;
 };
 
 type YoutubeConfigForm = {

+ 3 - 3
src/lib/components/admin/Functions/FunctionEditor.svelte

@@ -371,10 +371,10 @@ class Pipe:
 						value={content}
 						lang="python"
 						{boilerplate}
-						on:change={(e) => {
-							_content = e.detail.value;
+						onChange={(e) => {
+							_content = e;
 						}}
-						on:save={async () => {
+						onSave={async () => {
 							if (formElement) {
 								formElement.requestSubmit();
 							}

+ 35 - 1
src/lib/components/admin/Settings/Documents.svelte

@@ -49,6 +49,9 @@
 	let contentExtractionEngine = 'default';
 	let tikaServerUrl = '';
 	let showTikaServerUrl = false;
+	let documentIntelligenceEndpoint = '';
+	let documentIntelligenceKey = '';
+	let showDocumentIntelligenceConfig = false;
 
 	let textSplitter = '';
 	let chunkSize = 0;
@@ -176,6 +179,13 @@
 			toast.error($i18n.t('Tika Server URL required.'));
 			return;
 		}
+		if (
+			contentExtractionEngine === 'document_intelligence' &&
+			(documentIntelligenceEndpoint === '' || documentIntelligenceKey === '')
+		) {
+			toast.error($i18n.t('Document Intelligence endpoint and key required.'));
+			return;
+		}
 		const res = await updateRAGConfig(localStorage.token, {
 			pdf_extract_images: pdfExtractImages,
 			enable_google_drive_integration: enableGoogleDriveIntegration,
@@ -191,7 +201,11 @@
 			},
 			content_extraction: {
 				engine: contentExtractionEngine,
-				tika_server_url: tikaServerUrl
+				tika_server_url: tikaServerUrl,
+				document_intelligence_config: {
+					key: documentIntelligenceKey,
+					endpoint: documentIntelligenceEndpoint
+				}
 			}
 		});
 
@@ -249,6 +263,9 @@
 			contentExtractionEngine = res.content_extraction.engine;
 			tikaServerUrl = res.content_extraction.tika_server_url;
 			showTikaServerUrl = contentExtractionEngine === 'tika';
+			documentIntelligenceEndpoint = res.content_extraction.document_intelligence_config.endpoint;
+			documentIntelligenceKey = res.content_extraction.document_intelligence_config.key;
+			showDocumentIntelligenceConfig = contentExtractionEngine === 'document_intelligence';
 
 			fileMaxSize = res?.file.max_size ?? '';
 			fileMaxCount = res?.file.max_count ?? '';
@@ -585,10 +602,12 @@
 						bind:value={contentExtractionEngine}
 						on:change={(e) => {
 							showTikaServerUrl = e.target.value === 'tika';
+							showDocumentIntelligenceConfig = e.target.value === 'document_intelligence';
 						}}
 					>
 						<option value="">{$i18n.t('Default')} </option>
 						<option value="tika">{$i18n.t('Tika')}</option>
+						<option value="document_intelligence">{$i18n.t('Document Intelligence')}</option>
 					</select>
 				</div>
 			</div>
@@ -604,6 +623,21 @@
 					</div>
 				</div>
 			{/if}
+
+			{#if showDocumentIntelligenceConfig}
+				<div class="my-0.5 flex gap-2 pr-2">
+					<input
+						class="flex-1 w-full rounded-lg py-2 px-4 text-sm bg-gray-50 dark:text-gray-300 dark:bg-gray-850 outline-none"
+						placeholder={$i18n.t('Enter Document Intelligence Endpoint')}
+						bind:value={documentIntelligenceEndpoint}
+					/>
+
+					<SensitiveInput
+						placeholder={$i18n.t('Enter Document Intelligence Key')}
+						bind:value={documentIntelligenceKey}
+					/>
+				</div>
+			{/if}
 		</div>
 
 		<hr class=" border-gray-100 dark:border-gray-850" />

+ 13 - 0
src/lib/components/admin/Settings/WebSearch.svelte

@@ -130,6 +130,19 @@
 					</div>
 				</div>
 
+				<div class=" py-0.5 flex w-full justify-between">
+					<div class=" self-center text-xs font-medium">{$i18n.t('Trust Proxy Environment')}</div>
+					<div class="flex items-center relative">
+						<Tooltip
+							content={webConfig.search.trust_env
+								? 'Use proxy designated by http_proxy and https_proxy environment variables to fetch page contents'
+								: 'Use no proxy to fetch page contents.'}
+						>
+							<Switch bind:state={webConfig.search.trust_env} />
+						</Tooltip>
+					</div>
+				</div>
+
 				{#if webConfig.search.engine !== ''}
 					<div class="mt-1.5">
 						{#if webConfig.search.engine === 'searxng'}

+ 18 - 4
src/lib/components/chat/Chat.svelte

@@ -187,15 +187,20 @@
 		setToolIds();
 	}
 
+	$: if (atSelectedModel || selectedModels) {
+		setToolIds();
+	}
+
 	const setToolIds = async () => {
 		if (!$tools) {
 			tools.set(await getTools(localStorage.token));
 		}
 
-		if (selectedModels.length !== 1) {
+		if (selectedModels.length !== 1 && !atSelectedModel) {
 			return;
 		}
-		const model = $models.find((m) => m.id === selectedModels[0]);
+
+		const model = atSelectedModel ?? $models.find((m) => m.id === selectedModels[0]);
 		if (model) {
 			selectedToolIds = (model?.info?.meta?.toolIds ?? []).filter((id) =>
 				$tools.find((t) => t.id === id)
@@ -1488,7 +1493,10 @@
 							params?.system ?? $settings?.system ?? '',
 							$user.name,
 							$settings?.userLocation
-								? await getAndUpdateUserLocation(localStorage.token)
+								? await getAndUpdateUserLocation(localStorage.token).catch((err) => {
+										console.error(err);
+										return undefined;
+									})
 								: undefined
 						)}${
 							(responseMessage?.userContext ?? null)
@@ -1573,7 +1581,12 @@
 				variables: {
 					...getPromptVariables(
 						$user.name,
-						$settings?.userLocation ? await getAndUpdateUserLocation(localStorage.token) : undefined
+						$settings?.userLocation
+							? await getAndUpdateUserLocation(localStorage.token).catch((err) => {
+									console.error(err);
+									return undefined;
+								})
+							: undefined
 					)
 				},
 				model_item: $models.find((m) => m.id === model.id),
@@ -1965,6 +1978,7 @@
 									bind:autoScroll
 									bind:prompt
 									{selectedModels}
+									{atSelectedModel}
 									{sendPrompt}
 									{showMessage}
 									{submitMessage}

+ 4 - 1
src/lib/components/chat/ChatPlaceholder.svelte

@@ -16,6 +16,7 @@
 
 	export let modelIds = [];
 	export let models = [];
+	export let atSelectedModel;
 
 	export let submitPrompt;
 
@@ -126,7 +127,9 @@
 		<div class=" w-full font-primary" in:fade={{ duration: 200, delay: 300 }}>
 			<Suggestions
 				className="grid grid-cols-2"
-				suggestionPrompts={models[selectedModelIdx]?.info?.meta?.suggestion_prompts ??
+				suggestionPrompts={
+					atSelectedModel?.info?.meta?.suggestion_prompts ??
+					models[selectedModelIdx]?.info?.meta?.suggestion_prompts ??
 					$config?.default_prompt_suggestions ??
 					[]}
 				on:select={(e) => {

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

@@ -32,6 +32,7 @@
 	export let prompt;
 	export let history = {};
 	export let selectedModels;
+	export let atSelectedModel;
 
 	let messages = [];
 
@@ -349,6 +350,7 @@
 	{#if Object.keys(history?.messages ?? {}).length == 0}
 		<ChatPlaceholder
 			modelIds={selectedModels}
+			atSelectedModel={atSelectedModel}
 			submitPrompt={async (p) => {
 				let text = p;
 

+ 11 - 18
src/lib/components/chat/Messages/CodeBlock.svelte

@@ -1,18 +1,9 @@
 <script lang="ts">
-	import hljs from 'highlight.js';
-	import { loadPyodide } from 'pyodide';
 	import mermaid from 'mermaid';
 
 	import { v4 as uuidv4 } from 'uuid';
 
-	import {
-		getContext,
-		getAllContexts,
-		onMount,
-		tick,
-		createEventDispatcher,
-		onDestroy
-	} from 'svelte';
+	import { getContext, onMount, tick, onDestroy } from 'svelte';
 	import { copyToClipboard } from '$lib/utils';
 
 	import 'highlight.js/styles/github-dark.min.css';
@@ -25,10 +16,12 @@
 	import { toast } from 'svelte-sonner';
 
 	const i18n = getContext('i18n');
-	const dispatch = createEventDispatcher();
 
 	export let id = '';
 
+	export let onSave = (e) => {};
+	export let onCode = (e) => {};
+
 	export let save = false;
 	export let run = true;
 
@@ -71,7 +64,7 @@
 		saved = true;
 
 		code = _code;
-		dispatch('save', code);
+		onSave(code);
 
 		setTimeout(() => {
 			saved = false;
@@ -344,7 +337,7 @@
 		render();
 	}
 
-	$: dispatch('code', { lang, code });
+	$: onCode({ lang, code });
 
 	$: if (attributes) {
 		onAttributesUpdate();
@@ -380,7 +373,7 @@
 		console.log('codeblock', lang, code);
 
 		if (lang) {
-			dispatch('code', { lang, code });
+			onCode({ lang, code });
 		}
 		if (document.documentElement.classList.contains('dark')) {
 			mermaid.initialize({
@@ -468,11 +461,11 @@
 					value={code}
 					{id}
 					{lang}
-					on:save={() => {
+					onSave={() => {
 						saveCode();
 					}}
-					on:change={(e) => {
-						_code = e.detail.value;
+					onChange={(e) => {
+						_code = e;
 					}}
 				/>
 			</div>
@@ -514,7 +507,7 @@
 									<div class="flex flex-col gap-2">
 										{#each files as file}
 											{#if file.type.startsWith('image')}
-												<img src={file.data} alt="Output" />
+												<img src={file.data} alt="Output" class=" w-full max-w-[36rem]" />
 											{/if}
 										{/each}
 									</div>

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

@@ -88,14 +88,14 @@
 				code={token?.text ?? ''}
 				{attributes}
 				{save}
-				on:code={(e) => {
-					dispatch('code', e.detail);
+				onCode={(e) => {
+					dispatch('code', e);
 				}}
-				on:save={(e) => {
+				onSave={(e) => {
 					dispatch('update', {
 						raw: token.raw,
 						oldContent: token.text,
-						newContent: e.detail
+						newContent: e
 					});
 				}}
 			/>

+ 3 - 1
src/lib/components/chat/Placeholder.svelte

@@ -213,7 +213,9 @@
 	<div class="mx-auto max-w-2xl font-primary" in:fade={{ duration: 200, delay: 200 }}>
 		<div class="mx-5">
 			<Suggestions
-				suggestionPrompts={models[selectedModelIdx]?.info?.meta?.suggestion_prompts ??
+				suggestionPrompts={
+					atSelectedModel?.info?.meta?.suggestion_prompts ??
+					models[selectedModelIdx]?.info?.meta?.suggestion_prompts ??
 					$config?.default_prompt_suggestions ??
 					[]}
 				inputValue={prompt}

+ 8 - 3
src/lib/components/common/CodeEditor.svelte

@@ -21,6 +21,10 @@
 
 	export let boilerplate = '';
 	export let value = '';
+
+	export let onSave = () => {};
+	export let onChange = () => {};
+
 	let _value = '';
 
 	$: if (value) {
@@ -75,7 +79,7 @@
 				});
 
 				_value = formattedCode;
-				dispatch('change', { value: _value });
+				onChange({ value: _value });
 				await tick();
 
 				toast.success($i18n.t('Code formatted successfully'));
@@ -94,7 +98,7 @@
 		EditorView.updateListener.of((e) => {
 			if (e.docChanged) {
 				_value = e.state.doc.toString();
-				dispatch('change', { value: _value });
+				onChange({ value: _value });
 			}
 		}),
 		editorTheme.of([]),
@@ -170,7 +174,8 @@
 		const keydownHandler = async (e) => {
 			if ((e.ctrlKey || e.metaKey) && e.key === 's') {
 				e.preventDefault();
-				dispatch('save');
+
+				onSave();
 			}
 
 			// Format code when Ctrl + Shift + F is pressed

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

@@ -180,7 +180,6 @@
 		}
 
 		if (model) {
-			console.log(model);
 			name = model.name;
 			await tick();
 

+ 3 - 3
src/lib/components/workspace/Tools/ToolkitEditor.svelte

@@ -284,10 +284,10 @@ class Tools:
 						value={content}
 						{boilerplate}
 						lang="python"
-						on:change={(e) => {
-							_content = e.detail.value;
+						onChange={(e) => {
+							_content = e;
 						}}
-						on:save={() => {
+						onSave={() => {
 							if (formElement) {
 								formElement.requestSubmit();
 							}

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

@@ -20,7 +20,7 @@
 	"Account Activation Pending": "Activació del compte pendent",
 	"Accurate information": "Informació precisa",
 	"Actions": "Accions",
-	"Activate": "",
+	"Activate": "Activar",
 	"Activate this command by typing \"/{{COMMAND}}\" to chat input.": "Activa aquest comanda escrivint \"{{COMMAND}}\" en el xat",
 	"Active Users": "Usuaris actius",
 	"Add": "Afegir",
@@ -100,7 +100,7 @@
 	"Audio": "Àudio",
 	"August": "Agost",
 	"Authenticate": "Autenticar",
-	"Authentication": "",
+	"Authentication": "Autenticació",
 	"Auto-Copy Response to Clipboard": "Copiar la resposta automàticament al porta-retalls",
 	"Auto-playback response": "Reproduir la resposta automàticament",
 	"Autocomplete Generation": "Generació automàtica",
@@ -124,11 +124,11 @@
 	"Beta": "Beta",
 	"Bing Search V7 Endpoint": "Punt de connexió a Bing Search V7",
 	"Bing Search V7 Subscription Key": "Clau de subscripció a Bing Search V7",
-	"Bocha Search API Key": "",
+	"Bocha Search API Key": "Clau API de Bocha Search",
 	"Brave Search API Key": "Clau API de Brave Search",
 	"By {{name}}": "Per {{name}}",
 	"Bypass SSL verification for Websites": "Desactivar la verificació SSL per a l'accés a Internet",
-	"Calendar": "",
+	"Calendar": "Calendari",
 	"Call": "Trucada",
 	"Call feature is not supported when using Web STT engine": "La funció de trucada no s'admet quan s'utilitza el motor Web STT",
 	"Camera": "Càmera",
@@ -180,13 +180,13 @@
 	"Clone of {{TITLE}}": "Clon de {{TITLE}}",
 	"Close": "Tancar",
 	"Code execution": "Execució de codi",
-	"Code Execution": "",
-	"Code Execution Engine": "",
-	"Code Execution Timeout": "",
+	"Code Execution": "Excució de Codi",
+	"Code Execution Engine": "Motor d'execució de codi",
+	"Code Execution Timeout": "Temps màxim d'execució de codi",
 	"Code formatted successfully": "Codi formatat correctament",
 	"Code Interpreter": "Intèrpret de codi",
-	"Code Interpreter Engine": "",
-	"Code Interpreter Prompt Template": "",
+	"Code Interpreter Engine": "Motor de l'intèrpret de codi",
+	"Code Interpreter Prompt Template": "Plantilla de la indicació de l'intèrpret de codi",
 	"Collection": "Col·lecció",
 	"Color": "Color",
 	"ComfyUI": "ComfyUI",
@@ -203,7 +203,7 @@
 	"Confirm Password": "Confirmar la contrasenya",
 	"Confirm your action": "Confirma la teva acció",
 	"Confirm your new password": "Confirma la teva nova contrasenya",
-	"Connect to your own OpenAI compatible API endpoints.": "",
+	"Connect to your own OpenAI compatible API endpoints.": "Connecta als teus propis punts de connexió de l'API compatible amb OpenAI",
 	"Connections": "Connexions",
 	"Constrains effort on reasoning for reasoning models. Only applicable to reasoning models from specific providers that support reasoning effort. (Default: medium)": "Restringeix l'esforç de raonament dels models de raonament. Només aplicable a models de raonament de proveïdors específics que donen suport a l'esforç de raonament. (Per defecte: mitjà)",
 	"Contact Admin for WebUI Access": "Posat en contacte amb l'administrador per accedir a WebUI",
@@ -215,7 +215,7 @@
 	"Continue with Email": "Continuar amb el correu",
 	"Continue with LDAP": "Continuar amb 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.": "Controlar com es divideix el text del missatge per a les sol·licituds TTS. 'Puntuació' divideix en frases, 'paràgrafs' divideix en paràgrafs i 'cap' manté el missatge com una cadena única.",
-	"Control the repetition of token sequences in the generated text. A higher value (e.g., 1.5) will penalize repetitions more strongly, while a lower value (e.g., 1.1) will be more lenient. At 1, it is disabled. (Default: 1.1)": "",
+	"Control the repetition of token sequences in the generated text. A higher value (e.g., 1.5) will penalize repetitions more strongly, while a lower value (e.g., 1.1) will be more lenient. At 1, it is disabled. (Default: 1.1)": "Controlar la repetició de seqüències de tokens en el text generat. Un valor més alt (p. ex., 1,5) penalitzarà les repeticions amb més força, mentre que un valor més baix (p. ex., 1,1) serà més indulgent. A l'1, està desactivat. (Per defecte: 1.1)",
 	"Controls": "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)": "Controlar l'equilibri entre la coherència i la diversitat de la sortida. Un valor més baix donarà lloc a un text més enfocat i coherent. (Per defecte: 5.0)",
 	"Copied": "Copiat",
@@ -227,7 +227,7 @@
 	"Copy Link": "Copiar l'enllaç",
 	"Copy to clipboard": "Copiar al porta-retalls",
 	"Copying to clipboard was successful!": "La còpia al porta-retalls s'ha realitzat correctament",
-	"CORS must be properly configured by the provider to allow requests from Open WebUI.": "",
+	"CORS must be properly configured by the provider to allow requests from Open WebUI.": "CORS ha de ser configurat correctament pel proveïdor per permetre les sol·licituds d'Open WebUI",
 	"Create": "Crear",
 	"Create a knowledge base": "Crear una base de coneixement",
 	"Create a model": "Crear un model",
@@ -271,7 +271,7 @@
 	"Delete folder?": "Eliminar la carpeta?",
 	"Delete function?": "Eliminar funció?",
 	"Delete Message": "Eleiminar el missatge",
-	"Delete message?": "",
+	"Delete message?": "Eliminar el missatge?",
 	"Delete prompt?": "Eliminar indicació?",
 	"delete this link": "Eliminar aquest enllaç",
 	"Delete tool?": "Eliminar eina?",
@@ -282,15 +282,15 @@
 	"Describe your knowledge base and objectives": "Descriu la teva base de coneixement i objectius",
 	"Description": "Descripció",
 	"Didn't fully follow instructions": "No s'han seguit les instruccions completament",
-	"Direct Connections": "",
-	"Direct Connections allow users to connect to their own OpenAI compatible API endpoints.": "",
-	"Direct Connections settings updated": "",
+	"Direct Connections": "Connexions directes",
+	"Direct Connections allow users to connect to their own OpenAI compatible API endpoints.": "Les connexions directes permeten als usuaris connectar-se als seus propis endpoints d'API compatibles amb OpenAI.",
+	"Direct Connections settings updated": "Configuració de les connexions directes actualitzada",
 	"Disabled": "Deshabilitat",
 	"Discover a function": "Descobrir una funció",
 	"Discover a model": "Descobrir un model",
 	"Discover a prompt": "Descobrir una indicació",
 	"Discover a tool": "Descobrir una eina",
-	"Discover how to use Open WebUI and seek support from the community.": "",
+	"Discover how to use Open WebUI and seek support from the community.": "Descobreix com utilitzar Open WebUI i demana suport a la comunitat.",
 	"Discover wonders": "Descobrir meravelles",
 	"Discover, download, and explore custom functions": "Descobrir, descarregar i explorar funcions personalitzades",
 	"Discover, download, and explore custom prompts": "Descobrir, descarregar i explorar indicacions personalitzades",
@@ -315,14 +315,14 @@
 	"Don't like the style": "No t'agrada l'estil?",
 	"Done": "Fet",
 	"Download": "Descarregar",
-	"Download as SVG": "",
+	"Download as SVG": "Descarrega com a SVG",
 	"Download canceled": "Descàrrega cancel·lada",
 	"Download Database": "Descarregar la base de dades",
 	"Drag and drop a file to upload or select a file to view": "Arrossegar un arxiu per pujar o escull un arxiu a veure",
 	"Draw": "Dibuixar",
 	"Drop any files here to add to the conversation": "Deixa qualsevol arxiu aquí per afegir-lo a la conversa",
 	"e.g. '30s','10m'. Valid time units are 's', 'm', 'h'.": "p. ex. '30s','10m'. Les unitats de temps vàlides són 's', 'm', 'h'.",
-	"e.g. 60": "",
+	"e.g. 60": "p. ex. 60",
 	"e.g. A filter to remove profanity from text": "p. ex. Un filtre per eliminar paraules malsonants del text",
 	"e.g. My Filter": "p. ex. El meu filtre",
 	"e.g. My Tools": "p. ex. Les meves eines",
@@ -346,7 +346,7 @@
 	"Embedding model set to \"{{embedding_model}}\"": "Model d'incrustació configurat a \"{{embedding_model}}\"",
 	"Enable API Key": "Activar la Clau API",
 	"Enable autocomplete generation for chat messages": "Activar la generació automàtica per als missatges del xat",
-	"Enable Code Interpreter": "",
+	"Enable Code Interpreter": "Activar l'intèrpret de codi",
 	"Enable Community Sharing": "Activar l'ús compartit amb la comunitat",
 	"Enable Google Drive": "Activar Google Drive",
 	"Enable Memory Locking (mlock) to prevent model data from being swapped out of RAM. This option locks the model's working set of pages into RAM, ensuring that they will not be swapped out to disk. This can help maintain performance by avoiding page faults and ensuring fast data access.": "Activar el bloqueig de memòria (mlock) per evitar que les dades del model s'intercanviïn fora de la memòria RAM. Aquesta opció bloqueja el conjunt de pàgines de treball del model a la memòria RAM, assegurant-se que no s'intercanviaran al disc. Això pot ajudar a mantenir el rendiment evitant errors de pàgina i garantint un accés ràpid a les dades.",
@@ -365,7 +365,7 @@
 	"Enter Application DN Password": "Introdueix la contrasenya del DN d'aplicació",
 	"Enter Bing Search V7 Endpoint": "Introdueix el punt de connexió de Bing Search V7",
 	"Enter Bing Search V7 Subscription Key": "Introdueix la clau de subscripció de Bing Search V7",
-	"Enter Bocha Search API Key": "",
+	"Enter Bocha Search API Key": "Introdueix la clau API de Bocha Search",
 	"Enter Brave Search API Key": "Introdueix la clau API de Brave Search",
 	"Enter certificate path": "Introdueix el camí del certificat",
 	"Enter CFG Scale (e.g. 7.0)": "Entra l'escala CFG (p.ex. 7.0)",
@@ -379,9 +379,9 @@
 	"Enter Google PSE Engine Id": "Introdueix l'identificador del motor PSE de Google",
 	"Enter Image Size (e.g. 512x512)": "Introdueix la mida de la imatge (p. ex. 512x512)",
 	"Enter Jina API Key": "Introdueix la clau API de Jina",
-	"Enter Jupyter Password": "",
-	"Enter Jupyter Token": "",
-	"Enter Jupyter URL": "",
+	"Enter Jupyter Password": "Introdueix la contrasenya de Jupyter",
+	"Enter Jupyter Token": "Introdueix el token de Jupyter",
+	"Enter Jupyter URL": "Introdueix la URL de Jupyter",
 	"Enter Kagi Search API Key": "Introdueix la clau API de Kagi Search",
 	"Enter language codes": "Introdueix els codis de llenguatge",
 	"Enter Model ID": "Introdueix l'identificador del model",
@@ -397,8 +397,8 @@
 	"Enter SearchApi Engine": "Introdueix el motor SearchApi",
 	"Enter Searxng Query URL": "Introdueix l'URL de consulta de Searxng",
 	"Enter Seed": "Introdueix la llavor",
-	"Enter SerpApi API Key": "",
-	"Enter SerpApi Engine": "",
+	"Enter SerpApi API Key": "Introdueix la clau API SerpApi",
+	"Enter SerpApi Engine": "Introdueix el motor API SerpApi",
 	"Enter Serper API Key": "Introdueix la clau API Serper",
 	"Enter Serply API Key": "Introdueix la clau API Serply",
 	"Enter Serpstack API Key": "Introdueix la clau API Serpstack",
@@ -410,7 +410,7 @@
 	"Enter Tavily API Key": "Introdueix la clau API de Tavily",
 	"Enter the public URL of your WebUI. This URL will be used to generate links in the notifications.": "Entra la URL pública de WebUI. Aquesta URL s'utilitzarà per generar els enllaços en les notificacions.",
 	"Enter Tika Server URL": "Introdueix l'URL del servidor Tika",
-	"Enter timeout in seconds": "",
+	"Enter timeout in seconds": "Entra el temps màxim en segons",
 	"Enter Top K": "Introdueix Top K",
 	"Enter URL (e.g. http://127.0.0.1:7860/)": "Introdueix l'URL (p. ex. http://127.0.0.1:7860/)",
 	"Enter URL (e.g. http://localhost:11434)": "Introdueix l'URL (p. ex. http://localhost:11434)",
@@ -458,7 +458,7 @@
 	"Failed to save models configuration": "No s'ha pogut desar la configuració dels models",
 	"Failed to update settings": "No s'han pogut actualitzar les preferències",
 	"Failed to upload file.": "No s'ha pogut pujar l'arxiu.",
-	"Features": "",
+	"Features": "Característiques",
 	"Features Permissions": "Permisos de les característiques",
 	"February": "Febrer",
 	"Feedback History": "Històric de comentaris",
@@ -488,7 +488,7 @@
 	"Form": "Formulari",
 	"Format your variables using brackets like this:": "Formata les teves variables utilitzant claudàtors així:",
 	"Frequency Penalty": "Penalització per freqüència",
-	"Full Context Mode": "",
+	"Full Context Mode": "Mode de context complert",
 	"Function": "Funció",
 	"Function Calling": "Crida a funcions",
 	"Function created successfully": "La funció s'ha creat correctament",
@@ -503,9 +503,9 @@
 	"Functions allow arbitrary code execution": "Les funcions permeten l'execució de codi arbitrari",
 	"Functions allow arbitrary code execution.": "Les funcions permeten l'execució de codi arbitrari.",
 	"Functions imported successfully": "Les funcions s'han importat correctament",
-	"Gemini": "",
-	"Gemini API Config": "",
-	"Gemini API Key is required.": "",
+	"Gemini": "Gemini",
+	"Gemini API Config": "Configuració de Gemini API",
+	"Gemini API Key is required.": "La clau API de Gemini és necessària",
 	"General": "General",
 	"General Settings": "Preferències generals",
 	"Generate an image": "Generar una imatge",
@@ -532,7 +532,7 @@
 	"Hex Color": "Color hexadecimal",
 	"Hex Color - Leave empty for default color": "Color hexadecimal - Deixar buit per a color per defecte",
 	"Hide": "Amaga",
-	"Home": "",
+	"Home": "Inici",
 	"Host": "Servidor",
 	"How can I help you today?": "Com et puc ajudar avui?",
 	"How would you rate this response?": "Com avaluaries aquesta resposta?",
@@ -576,8 +576,8 @@
 	"JSON Preview": "Vista prèvia del document JSON",
 	"July": "Juliol",
 	"June": "Juny",
-	"Jupyter Auth": "",
-	"Jupyter URL": "",
+	"Jupyter Auth": "Autenticació Jupyter",
+	"Jupyter URL": "URL de Jupyter",
 	"JWT Expiration": "Caducitat del JWT",
 	"JWT Token": "Token JWT",
 	"Kagi Search API Key": "Clau API de Kagi Search",
@@ -607,12 +607,12 @@
 	"Leave empty to include all models or select specific models": "Deixa-ho en blanc per incloure tots els models o selecciona models específics",
 	"Leave empty to use the default prompt, or enter a custom prompt": "Deixa-ho en blanc per utilitzar la indicació predeterminada o introdueix una indicació personalitzada",
 	"Leave model field empty to use the default model.": "Deixa el camp de model buit per utilitzar el model per defecte.",
-	"License": "",
+	"License": "Llicència",
 	"Light": "Clar",
 	"Listening...": "Escoltant...",
 	"Llama.cpp": "Llama.cpp",
 	"LLMs can make mistakes. Verify important information.": "Els models de llenguatge poden cometre errors. Verifica la informació important.",
-	"Loading Kokoro.js...": "",
+	"Loading Kokoro.js...": "Carregant Kokoro.js",
 	"Local": "Local",
 	"Local Models": "Models locals",
 	"Lost": "Perdut",
@@ -622,7 +622,7 @@
 	"Make sure to export a workflow.json file as API format from ComfyUI.": "Assegura't d'exportar un fitxer workflow.json com a format API des de ComfyUI.",
 	"Manage": "Gestionar",
 	"Manage Arena Models": "Gestionar els models de l'Arena",
-	"Manage Direct Connections": "",
+	"Manage Direct Connections": "Gestionar les connexions directes",
 	"Manage Models": "Gestionar els models",
 	"Manage Ollama": "Gestionar Ollama",
 	"Manage Ollama API Connections": "Gestionar les connexions a l'API d'Ollama",
@@ -766,7 +766,7 @@
 	"Plain text (.txt)": "Text pla (.txt)",
 	"Playground": "Zona de jocs",
 	"Please carefully review the following warnings:": "Si us plau, revisa els següents avisos amb cura:",
-	"Please do not close the settings page while loading the model.": "",
+	"Please do not close the settings page while loading the model.": "No tanquis la pàgina de configuració mentre carregues el model.",
 	"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",
@@ -776,7 +776,7 @@
 	"Positive attitude": "Actitud positiva",
 	"Prefix ID": "Identificador del prefix",
 	"Prefix ID is used to avoid conflicts with other connections by adding a prefix to the model IDs - leave empty to disable": "L'identificador de prefix s'utilitza per evitar conflictes amb altres connexions afegint un prefix als ID de model; deixa'l en blanc per desactivar-lo.",
-	"Presence Penalty": "",
+	"Presence Penalty": "Penalització de presència",
 	"Previous 30 days": "30 dies anteriors",
 	"Previous 7 days": "7 dies anteriors",
 	"Profile Image": "Imatge de perfil",
@@ -813,7 +813,7 @@
 	"Rename": "Canviar el nom",
 	"Reorder Models": "Reordenar els models",
 	"Repeat Last N": "Repeteix els darrers N",
-	"Repeat Penalty (Ollama)": "",
+	"Repeat Penalty (Ollama)": "Penalització per repetició (Ollama)",
 	"Reply in Thread": "Respondre al fil",
 	"Request Mode": "Mode de sol·licitud",
 	"Reranking Model": "Model de reavaluació",
@@ -876,7 +876,7 @@
 	"Select a pipeline": "Seleccionar una Pipeline",
 	"Select a pipeline url": "Seleccionar l'URL d'una Pipeline",
 	"Select a tool": "Seleccionar una eina",
-	"Select an auth method": "",
+	"Select an auth method": "Seleccionar un mètode d'autenticació",
 	"Select an Ollama instance": "Seleccionar una instància d'Ollama",
 	"Select Engine": "Seleccionar el motor",
 	"Select Knowledge": "Seleccionar coneixement",
@@ -889,8 +889,8 @@
 	"Send message": "Enviar missatge",
 	"Sends `stream_options: { include_usage: true }` in the request.\nSupported providers will return token usage information in the response when set.": "Envia `stream_options: { include_usage: true }` a la sol·licitud.\nEls proveïdors compatibles retornaran la informació d'ús del token a la resposta quan s'estableixi.",
 	"September": "Setembre",
-	"SerpApi API Key": "",
-	"SerpApi Engine": "",
+	"SerpApi API Key": "Clau API de SerpApi",
+	"SerpApi Engine": "Motor de SerpApi",
 	"Serper API Key": "Clau API de Serper",
 	"Serply API Key": "Clau API de Serply",
 	"Serpstack API Key": "Clau API de Serpstack",
@@ -910,8 +910,8 @@
 	"Set the number of worker threads used for computation. This option controls how many threads are used to process incoming requests concurrently. Increasing this value can improve performance under high concurrency workloads but may also consume more CPU resources.": "Establir el nombre de fils de treball utilitzats per al càlcul. Aquesta opció controla quants fils s'utilitzen per processar les sol·licituds entrants simultàniament. Augmentar aquest valor pot millorar el rendiment amb càrregues de treball de concurrència elevada, però també pot consumir més recursos de CPU.",
 	"Set Voice": "Establir la veu",
 	"Set whisper model": "Establir el model whisper",
-	"Sets a flat bias against tokens that have appeared at least once. A higher value (e.g., 1.5) will penalize repetitions more strongly, while a lower value (e.g., 0.9) will be more lenient. At 0, it is disabled. (Default: 0)": "",
-	"Sets a scaling bias against tokens to penalize repetitions, based on how many times they have appeared. A higher value (e.g., 1.5) will penalize repetitions more strongly, while a lower value (e.g., 0.9) will be more lenient. At 0, it is disabled. (Default: 1.1)": "",
+	"Sets a flat bias against tokens that have appeared at least once. A higher value (e.g., 1.5) will penalize repetitions more strongly, while a lower value (e.g., 0.9) will be more lenient. At 0, it is disabled. (Default: 0)": "Estableix un biaix pla contra tokens que han aparegut almenys una vegada. Un valor més alt (p. ex., 1,5) penalitzarà les repeticions amb més força, mentre que un valor més baix (p. ex., 0,9) serà més indulgent. A 0, està desactivat. (Per defecte: 0)",
+	"Sets a scaling bias against tokens to penalize repetitions, based on how many times they have appeared. A higher value (e.g., 1.5) will penalize repetitions more strongly, while a lower value (e.g., 0.9) will be more lenient. At 0, it is disabled. (Default: 1.1)": "Estableix un biaix d'escala contra tokens per penalitzar les repeticions, en funció de quantes vegades han aparegut. Un valor més alt (p. ex., 1,5) penalitzarà les repeticions amb més força, mentre que un valor més baix (p. ex., 0,9) serà més indulgent. A 0, està desactivat. (Per defecte: 1.1)",
 	"Sets how far back for the model to look back to prevent repetition. (Default: 64, 0 = disabled, -1 = num_ctx)": "Establir fins a quin punt el model mira enrere per evitar la repetició. (Per defecte: 64, 0 = desactivat, -1 = num_ctx)",
 	"Sets the random number seed to use for generation. Setting this to a specific number will make the model generate the same text for the same prompt. (Default: random)": "Establir la llavor del nombre aleatori que s'utilitzarà per a la generació. Establir-ho a un número específic farà que el model generi el mateix text per a la mateixa sol·licitud. (Per defecte: aleatori)",
 	"Sets the size of the context window used to generate the next token. (Default: 2048)": "Estableix la mida de la finestra de context utilitzada per generar el següent token. (Per defecte: 2048)",
@@ -958,7 +958,7 @@
 	"Tags Generation Prompt": "Indicació per a la generació d'etiquetes",
 	"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)": "El mostreig sense cua s'utilitza per reduir l'impacte de tokens menys probables de la sortida. Un valor més alt (p. ex., 2,0) reduirà més l'impacte, mentre que un valor d'1,0 desactiva aquesta configuració. (per defecte: 1)",
 	"Tap to interrupt": "Prem per interrompre",
-	"Tasks": "",
+	"Tasks": "Tasques",
 	"Tavily API Key": "Clau API de Tavily",
 	"Tell us more:": "Dona'ns més informació:",
 	"Temperature": "Temperatura",
@@ -1005,7 +1005,7 @@
 	"Title (e.g. Tell me a fun fact)": "Títol (p. ex. Digues-me quelcom divertit)",
 	"Title Auto-Generation": "Generació automàtica de títol",
 	"Title cannot be an empty string.": "El títol no pot ser una cadena buida.",
-	"Title Generation": "",
+	"Title Generation": "Generació de títols",
 	"Title Generation Prompt": "Indicació de generació de títol",
 	"TLS": "TLS",
 	"To access the available model names for downloading,": "Per accedir als noms dels models disponibles per descarregar,",
@@ -1062,7 +1062,7 @@
 	"Updated": "Actualitzat",
 	"Updated at": "Actualitzat el",
 	"Updated At": "Actualitzat el",
-	"Upgrade to a licensed plan for enhanced capabilities, including custom theming and branding, and dedicated support.": "",
+	"Upgrade to a licensed plan for enhanced capabilities, including custom theming and branding, and dedicated support.": "Actualitzar a un pla amb llicència per obtenir capacitats millorades, com ara la temàtica personalitzada i la marca, i assistència dedicada.",
 	"Upload": "Pujar",
 	"Upload a GGUF model": "Pujar un model GGUF",
 	"Upload directory": "Pujar directori",
@@ -1101,7 +1101,7 @@
 	"Warning:": "Avís:",
 	"Warning: Enabling this will allow users to upload arbitrary code on the server.": "Avís: Habilitar això permetrà als usuaris penjar codi arbitrari al servidor.",
 	"Warning: If you update or change your embedding model, you will need to re-import all documents.": "Avís: Si s'actualitza o es canvia el model d'incrustació, s'hauran de tornar a importar tots els documents.",
-	"Warning: Jupyter execution enables arbitrary code execution, posing severe security risks—proceed with extreme caution.": "",
+	"Warning: Jupyter execution enables arbitrary code execution, posing severe security risks—proceed with extreme caution.": "Avís: l'execució de Jupyter permet l'execució de codi arbitrari, la qual cosa comporta greus riscos de seguretat; procediu amb extrema precaució.",
 	"Web": "Web",
 	"Web API": "Web API",
 	"Web Loader Settings": "Preferències del carregador web",

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

@@ -20,7 +20,7 @@
 	"Account Activation Pending": "Tilin aktivointi odottaa",
 	"Accurate information": "Tarkkaa tietoa",
 	"Actions": "Toiminnot",
-	"Activate": "",
+	"Activate": "Aktivoi",
 	"Activate this command by typing \"/{{COMMAND}}\" to chat input.": "Aktivoi tämä komento kirjoittamalla \"/{{COMMAND}}\" chat-syötteeseen.",
 	"Active Users": "Aktiiviset käyttäjät",
 	"Add": "Lisää",
@@ -34,7 +34,7 @@
 	"Add custom prompt": "Lisää mukautettu kehote",
 	"Add Files": "Lisää tiedostoja",
 	"Add Group": "Lisää ryhmä",
-	"Add Memory": "Lisää muistia",
+	"Add Memory": "Lisää muistiin",
 	"Add Model": "Lisää malli",
 	"Add Reaction": "Lisää reaktio",
 	"Add Tag": "Lisää tagi",
@@ -100,7 +100,7 @@
 	"Audio": "Ääni",
 	"August": "elokuu",
 	"Authenticate": "Todentaa",
-	"Authentication": "",
+	"Authentication": "Todennus",
 	"Auto-Copy Response to Clipboard": "Kopioi vastaus automaattisesti leikepöydälle",
 	"Auto-playback response": "Soita vastaus automaattisesti",
 	"Autocomplete Generation": "Automaattisen täydennyksen luonti",
@@ -121,16 +121,16 @@
 	"Batch Size (num_batch)": "Erän koko (num_batch)",
 	"before": "ennen",
 	"Being lazy": "Oli laiska",
-	"Beta": "",
+	"Beta": "Beta",
 	"Bing Search V7 Endpoint": "Bing Search V7 -päätepisteen osoite",
 	"Bing Search V7 Subscription Key": "Bing Search V7 -tilauskäyttäjäavain",
-	"Bocha Search API Key": "",
+	"Bocha Search API Key": "Bocha Search API -avain",
 	"Brave Search API Key": "Brave Search API -avain",
 	"By {{name}}": "Tekijä {{name}}",
 	"Bypass SSL verification for Websites": "Ohita SSL-varmennus verkkosivustoille",
-	"Calendar": "",
-	"Call": "Soitto",
-	"Call feature is not supported when using Web STT engine": "Soittotoimintoa ei tueta käytettäessä web-puheentunnistusmoottoria",
+	"Calendar": "Kalenteri",
+	"Call": "Puhelu",
+	"Call feature is not supported when using Web STT engine": "Puhelutoimintoa ei tueta käytettäessä web-puheentunnistusmoottoria",
 	"Camera": "Kamera",
 	"Cancel": "Peruuta",
 	"Capabilities": "Ominaisuuksia",
@@ -180,9 +180,9 @@
 	"Clone of {{TITLE}}": "{{TITLE}} klooni",
 	"Close": "Sulje",
 	"Code execution": "Koodin suorittaminen",
-	"Code Execution": "",
-	"Code Execution Engine": "",
-	"Code Execution Timeout": "",
+	"Code Execution": "Koodin suorittaminen",
+	"Code Execution Engine": "Koodin suoritusmoottori",
+	"Code Execution Timeout": "Koodin suorittamisen aikakatkaisu",
 	"Code formatted successfully": "Koodin muotoilu onnistui",
 	"Code Interpreter": "Ohjelmatulkki",
 	"Code Interpreter Engine": "Ohjelmatulkin moottori",
@@ -190,7 +190,7 @@
 	"Collection": "Kokoelma",
 	"Color": "Väri",
 	"ComfyUI": "ComfyUI",
-	"ComfyUI API Key": "",
+	"ComfyUI API Key": "ComfyUI API -avain",
 	"ComfyUI Base URL": "ComfyUI-perus-URL",
 	"ComfyUI Base URL is required.": "ComfyUI-perus-URL vaaditaan.",
 	"ComfyUI Workflow": "ComfyUI-työnkulku",
@@ -203,7 +203,7 @@
 	"Confirm Password": "Vahvista salasana",
 	"Confirm your action": "Vahvista toimintasi",
 	"Confirm your new password": "Vahvista uusi salasanasi",
-	"Connect to your own OpenAI compatible API endpoints.": "",
+	"Connect to your own OpenAI compatible API endpoints.": "Yhdistä oma OpenAI yhteensopiva API päätepiste.",
 	"Connections": "Yhteydet",
 	"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": "Ota yhteyttä ylläpitäjään WebUI-käyttöä varten",
@@ -227,7 +227,7 @@
 	"Copy Link": "Kopioi linkki",
 	"Copy to clipboard": "Kopioi leikepöydälle",
 	"Copying to clipboard was successful!": "Kopioiminen leikepöydälle onnistui!",
-	"CORS must be properly configured by the provider to allow requests from Open WebUI.": "",
+	"CORS must be properly configured by the provider to allow requests from Open WebUI.": "CORS täytyy olla konfiguroitu palveluntarjoajan toimesta pyyntöjen hyväksymiseksi Open WebUI:sta.",
 	"Create": "Luo",
 	"Create a knowledge base": "Luo tietokanta",
 	"Create a model": "Luo malli",
@@ -271,7 +271,7 @@
 	"Delete folder?": "Haluatko varmasti poistaa tämän kansion?",
 	"Delete function?": "Haluatko varmasti poistaa tämän toiminnon?",
 	"Delete Message": "Poista viesti",
-	"Delete message?": "",
+	"Delete message?": "Poista viesti?",
 	"Delete prompt?": "Haluatko varmasti poistaa tämän kehotteen?",
 	"delete this link": "poista tämä linkki",
 	"Delete tool?": "Haluatko varmasti poistaa tämän työkalun?",
@@ -290,7 +290,7 @@
 	"Discover a model": "Tutustu malliin",
 	"Discover a prompt": "Löydä kehote",
 	"Discover a tool": "Löydä työkalu",
-	"Discover how to use Open WebUI and seek support from the community.": "",
+	"Discover how to use Open WebUI and seek support from the community.": "Tutustu Open WebUI:n käyttöön ja pyydä tukea yhteisöltä.",
 	"Discover wonders": "Löydä ihmeellisiä asioita",
 	"Discover, download, and explore custom functions": "Etsi, lataa ja tutki mukautettuja toimintoja",
 	"Discover, download, and explore custom prompts": "Löydä ja lataa mukautettuja kehotteita",
@@ -315,14 +315,14 @@
 	"Don't like the style": "En pidä tyylistä",
 	"Done": "Valmis",
 	"Download": "Lataa",
-	"Download as SVG": "",
+	"Download as SVG": "Lataa SVG:nä",
 	"Download canceled": "Lataus peruutettu",
 	"Download Database": "Lataa tietokanta",
 	"Drag and drop a file to upload or select a file to view": "Raahaa ja pudota tiedosto ladattavaksi tai valitse tiedosto katseltavaksi",
 	"Draw": "Piirros",
 	"Drop any files here to add to the conversation": "Pudota tiedostoja tähän lisätäksesi ne keskusteluun",
 	"e.g. '30s','10m'. Valid time units are 's', 'm', 'h'.": "esim. '30s', '10m'. Kelpoiset aikayksiköt ovat 's', 'm', 'h'.",
-	"e.g. 60": "",
+	"e.g. 60": "esim. 60",
 	"e.g. A filter to remove profanity from text": "esim. suodatin, joka poistaa kirosanoja tekstistä",
 	"e.g. My Filter": "esim. Oma suodatin",
 	"e.g. My Tools": "esim. Omat työkalut",
@@ -344,7 +344,7 @@
 	"Embedding Model": "Upotusmalli",
 	"Embedding Model Engine": "Upotusmallin moottori",
 	"Embedding model set to \"{{embedding_model}}\"": "\"{{embedding_model}}\" valittu upotusmalliksi",
-	"Enable API Key": "",
+	"Enable API Key": "Ota API -avain käyttöön",
 	"Enable autocomplete generation for chat messages": "Ota automaattinen täydennys käyttöön keskusteluviesteissä",
 	"Enable Code Interpreter": "Ota ohjelmatulkki käyttöön",
 	"Enable Community Sharing": "Ota yhteisön jakaminen käyttöön",
@@ -365,7 +365,7 @@
 	"Enter Application DN Password": "Kirjoita sovelluksen DN-salasana",
 	"Enter Bing Search V7 Endpoint": "Kirjoita Bing Search V7 -päätepisteen osoite",
 	"Enter Bing Search V7 Subscription Key": "Kirjoita Bing Search V7 -tilauskäyttäjäavain",
-	"Enter Bocha Search API Key": "",
+	"Enter Bocha Search API Key": "Kirjoita Bocha Search API -avain",
 	"Enter Brave Search API Key": "Kirjoita Brave Search API -avain",
 	"Enter certificate path": "Kirjoita varmennepolku",
 	"Enter CFG Scale (e.g. 7.0)": "Kirjoita CFG-mitta (esim. 7.0)",
@@ -373,32 +373,32 @@
 	"Enter Chunk Size": "Syötä osien koko",
 	"Enter description": "Kirjoita kuvaus",
 	"Enter domains separated by commas (e.g., example.com,site.org)": "Verkko-osoitteet erotetaan pilkulla (esim. esimerkki.com,sivu.org",
-	"Enter Exa API Key": "",
-	"Enter Github Raw URL": "Kirjoita Github Raw -URL-osoite",
+	"Enter Exa API Key": "Kirjoita Exa API -avain",
+	"Enter Github Raw URL": "Kirjoita Github Raw -verkko-osoite",
 	"Enter Google PSE API Key": "Kirjoita Google PSE API -avain",
 	"Enter Google PSE Engine Id": "Kirjoita Google PSE -moottorin tunnus",
 	"Enter Image Size (e.g. 512x512)": "Kirjoita kuvan koko (esim. 512x512)",
 	"Enter Jina API Key": "Kirjoita Jina API -avain",
-	"Enter Jupyter Password": "",
-	"Enter Jupyter Token": "",
-	"Enter Jupyter URL": "",
-	"Enter Kagi Search API Key": "",
+	"Enter Jupyter Password": "Kirjoita Jupyter salasana",
+	"Enter Jupyter Token": "Kirjoita Juypyter token",
+	"Enter Jupyter URL": "Kirjoita Jupyter verkko-osoite",
+	"Enter Kagi Search API Key": "Kirjoita Kagi Search API -avain",
 	"Enter language codes": "Kirjoita kielikoodit",
 	"Enter Model ID": "Kirjoita mallitunnus",
 	"Enter model tag (e.g. {{modelTag}})": "Kirjoita mallitagi (esim. {{modelTag}})",
 	"Enter Mojeek Search API Key": "Kirjoita Mojeek Search API -avain",
 	"Enter Number of Steps (e.g. 50)": "Kirjoita askelten määrä (esim. 50)",
-	"Enter proxy URL (e.g. https://user:password@host:port)": "Kirjoita välityspalvelimen URL-osoite (esim. https://käyttäjä:salasana@host:portti)",
+	"Enter proxy URL (e.g. https://user:password@host:port)": "Kirjoita välityspalvelimen verkko-osoite (esim. https://käyttäjä:salasana@host:portti)",
 	"Enter reasoning effort": "",
 	"Enter Sampler (e.g. Euler a)": "Kirjoita näytteistäjä (esim. Euler a)",
 	"Enter Scheduler (e.g. Karras)": "Kirjoita ajoitin (esim. Karras)",
 	"Enter Score": "Kirjoita pistemäärä",
 	"Enter SearchApi API Key": "Kirjoita SearchApi API -avain",
 	"Enter SearchApi Engine": "Kirjoita SearchApi-moottori",
-	"Enter Searxng Query URL": "Kirjoita Searxng-kyselyn URL-osoite",
+	"Enter Searxng Query URL": "Kirjoita Searxng-kyselyn verkko-osoite",
 	"Enter Seed": "Kirjoita siemenluku",
-	"Enter SerpApi API Key": "",
-	"Enter SerpApi Engine": "",
+	"Enter SerpApi API Key": "Kirjoita SerpApi API -avain",
+	"Enter SerpApi Engine": "Valitse SerpApi Moottori",
 	"Enter Serper API Key": "Kirjoita Serper API -avain",
 	"Enter Serply API Key": "Kirjoita Serply API -avain",
 	"Enter Serpstack API Key": "Kirjoita Serpstack API -avain",
@@ -410,28 +410,28 @@
 	"Enter Tavily API Key": "Kirjoita Tavily API -avain",
 	"Enter the public URL of your WebUI. This URL will be used to generate links in the notifications.": "Kirjoita julkinen WebUI verkko-osoitteesi. Verkko-osoitetta käytetään osoitteiden luontiin ilmoituksissa.",
 	"Enter Tika Server URL": "Kirjoita Tika Server URL",
-	"Enter timeout in seconds": "",
+	"Enter timeout in seconds": "Aseta aikakatkaisu sekunneissa",
 	"Enter Top K": "Kirjoita Top K",
-	"Enter URL (e.g. http://127.0.0.1:7860/)": "Kirjoita URL-osoite (esim. http://127.0.0.1:7860/)",
-	"Enter URL (e.g. http://localhost:11434)": "Kirjoita URL-osoite (esim. http://localhost:11434)",
+	"Enter URL (e.g. http://127.0.0.1:7860/)": "Kirjoita verkko-osoite (esim. http://127.0.0.1:7860/)",
+	"Enter URL (e.g. http://localhost:11434)": "Kirjoita verkko-osoite (esim. http://localhost:11434)",
 	"Enter your current password": "Kirjoita nykyinen salasanasi",
 	"Enter Your Email": "Kirjoita sähköpostiosoitteesi",
 	"Enter Your Full Name": "Kirjoita koko nimesi",
 	"Enter your message": "Kirjoita viestisi",
-	"Enter your new password": "",
+	"Enter your new password": "Kirjoita uusi salasanasi",
 	"Enter Your Password": "Kirjoita salasanasi",
 	"Enter Your Role": "Kirjoita roolisi",
 	"Enter Your Username": "Kirjoita käyttäjätunnuksesi",
 	"Enter your webhook URL": "Kirjoita webhook osoitteesi",
 	"Error": "Virhe",
 	"ERROR": "VIRHE",
-	"Error accessing Google Drive: {{error}}": "",
-	"Error uploading file: {{error}}": "",
+	"Error accessing Google Drive: {{error}}": "Virhe yhdistäessä Google Drive: {{error}}",
+	"Error uploading file: {{error}}": "Virhe ladattaessa tiedostoa: {{error}}",
 	"Evaluations": "Arvioinnit",
-	"Exa API Key": "",
+	"Exa API Key": "Exa API -avain",
 	"Example: (&(objectClass=inetOrgPerson)(uid=%s))": "Esimerkki: (&(objectClass=inetOrgPerson)(uid=%s))",
 	"Example: ALL": "Esimerkki: KAIKKI",
-	"Example: mail": "",
+	"Example: mail": "Esimerkki: posti",
 	"Example: ou=users,dc=foo,dc=example": "Esimerkki: ou=käyttäjät,dc=foo,dc=example",
 	"Example: sAMAccountName or uid or userPrincipalName": "Esimerkki: sAMAccountName tai uid tai userPrincipalName",
 	"Exclude": "Jätä pois",
@@ -458,7 +458,7 @@
 	"Failed to save models configuration": "Mallien määrityksen tallentaminen epäonnistui",
 	"Failed to update settings": "Asetusten päivittäminen epäonnistui",
 	"Failed to upload file.": "Tiedoston lataaminen epäonnistui.",
-	"Features": "",
+	"Features": "Ominaisuudet",
 	"Features Permissions": "Ominaisuuksien käyttöoikeudet",
 	"February": "helmikuu",
 	"Feedback History": "Palautehistoria",
@@ -488,9 +488,9 @@
 	"Form": "Lomake",
 	"Format your variables using brackets like this:": "Muotoile muuttujasi hakasulkeilla tällä tavalla:",
 	"Frequency Penalty": "Taajuussakko",
-	"Full Context Mode": "",
+	"Full Context Mode": "Koko kontekstitila",
 	"Function": "Toiminto",
-	"Function Calling": "",
+	"Function Calling": "Toiminto kutsu",
 	"Function created successfully": "Toiminto luotu onnistuneesti",
 	"Function deleted successfully": "Toiminto poistettu onnistuneesti",
 	"Function Description": "Toiminnon kuvaus",
@@ -503,9 +503,9 @@
 	"Functions allow arbitrary code execution": "Toiminnot sallivat mielivaltaisen koodin suorittamisen",
 	"Functions allow arbitrary code execution.": "Toiminnot sallivat mielivaltaisen koodin suorittamisen.",
 	"Functions imported successfully": "Toiminnot tuotu onnistuneesti",
-	"Gemini": "",
-	"Gemini API Config": "",
-	"Gemini API Key is required.": "",
+	"Gemini": "Gemini",
+	"Gemini API Config": "Gemini API konfiguraatio",
+	"Gemini API Key is required.": "Gemini API -avain on vaaditaan.",
 	"General": "Yleinen",
 	"General Settings": "Yleiset asetukset",
 	"Generate an image": "Luo kuva",
@@ -515,7 +515,7 @@
 	"Get started with {{WEBUI_NAME}}": "Aloita käyttämään {{WEBUI_NAME}}:iä",
 	"Global": "Yleinen",
 	"Good Response": "Hyvä vastaus",
-	"Google Drive": "",
+	"Google Drive": "Google Drive",
 	"Google PSE API Key": "Google PSE API -avain",
 	"Google PSE Engine Id": "Google PSE -moottorin tunnus",
 	"Group created successfully": "Ryhmä luotu onnistuneesti",
@@ -532,7 +532,7 @@
 	"Hex Color": "Heksadesimaaliväri",
 	"Hex Color - Leave empty for default color": "Heksadesimaaliväri - Jätä tyhjäksi, jos haluat oletusvärin",
 	"Hide": "Piilota",
-	"Home": "",
+	"Home": "Koti",
 	"Host": "Palvelin",
 	"How can I help you today?": "Miten voin auttaa sinua tänään?",
 	"How would you rate this response?": "Kuinka arvioisit tätä vastausta?",
@@ -576,11 +576,11 @@
 	"JSON Preview": "JSON-esikatselu",
 	"July": "heinäkuu",
 	"June": "kesäkuu",
-	"Jupyter Auth": "",
-	"Jupyter URL": "",
+	"Jupyter Auth": "Jupyter todennus",
+	"Jupyter URL": "Jupyter verkko-osoite",
 	"JWT Expiration": "JWT-vanheneminen",
 	"JWT Token": "JWT-token",
-	"Kagi Search API Key": "",
+	"Kagi Search API Key": "Kagi Search API -avain",
 	"Keep Alive": "Pysy aktiivisena",
 	"Key": "Avain",
 	"Keyboard shortcuts": "Pikanäppäimet",
@@ -597,7 +597,7 @@
 	"Language": "Kieli",
 	"Last Active": "Viimeksi aktiivinen",
 	"Last Modified": "Viimeksi muokattu",
-	"Last reply": "",
+	"Last reply": "Viimeksi vastattu",
 	"LDAP": "LDAP",
 	"LDAP server updated": "LDAP-palvelin päivitetty",
 	"Leaderboard": "Tulosluettelo",
@@ -606,11 +606,11 @@
 	"Leave empty to include all models from \"{{URL}}/models\" endpoint": "Jätä tyhjäksi, jos haluat sisällyttää kaikki mallit \"{{URL}}/models\" -päätepistestä",
 	"Leave empty to include all models or select specific models": "Jätä tyhjäksi, jos haluat sisällyttää kaikki mallit tai valitse tietyt mallit",
 	"Leave empty to use the default prompt, or enter a custom prompt": "Jätä tyhjäksi käyttääksesi oletuskehotetta tai kirjoita mukautettu kehote",
-	"Leave model field empty to use the default model.": "",
-	"License": "",
+	"Leave model field empty to use the default model.": "Jätä malli kenttä tyhjäksi käyttääksesi oletus mallia.",
+	"License": "Lisenssi",
 	"Light": "Vaalea",
 	"Listening...": "Kuuntelee...",
-	"Llama.cpp": "",
+	"Llama.cpp": "Llama.cpp",
 	"LLMs can make mistakes. Verify important information.": "Kielimallit voivat tehdä virheitä. Tarkista tärkeät tiedot.",
 	"Loading Kokoro.js...": "Ladataan Kokoro.js...",
 	"Local": "Paikallinen",
@@ -642,7 +642,7 @@
 	"Memory updated successfully": "Muisti päivitetty onnistuneesti",
 	"Merge Responses": "Yhdistä vastaukset",
 	"Message rating should be enabled to use this feature": "Tämän toiminnon käyttämiseksi viestiarviointi on otettava käyttöön",
-	"Messages you send after creating your link won't be shared. Users with the URL will be able to view the shared chat.": "Linkin luomisen jälkeen lähettämäsi viestit eivät ole jaettuja. Käyttäjät, joilla on URL-osoite, voivat tarkastella jaettua keskustelua.",
+	"Messages you send after creating your link won't be shared. Users with the URL will be able to view the shared chat.": "Linkin luomisen jälkeen lähettämäsi viestit eivät ole jaettuja. Käyttäjät, joilla on verkko-osoite, voivat tarkastella jaettua keskustelua.",
 	"Min P": "Min P",
 	"Minimum Score": "Vähimmäispisteet",
 	"Mirostat": "Mirostat",
@@ -722,7 +722,7 @@
 	"Only alphanumeric characters and hyphens are allowed in the command string.": "Vain kirjaimet, numerot ja väliviivat ovat sallittuja komentosarjassa.",
 	"Only collections can be edited, create a new knowledge base to edit/add documents.": "Vain kokoelmia voi muokata, luo uusi tietokanta muokataksesi/lisätäksesi asiakirjoja.",
 	"Only select users and groups with permission can access": "Vain valitut käyttäjät ja ryhmät, joilla on käyttöoikeus, pääsevät käyttämään",
-	"Oops! Looks like the URL is invalid. Please double-check and try again.": "Hups! Näyttää siltä, että URL-osoite on virheellinen. Tarkista se ja yritä uudelleen.",
+	"Oops! Looks like the URL is invalid. Please double-check and try again.": "Hups! Näyttää siltä, että verkko-osoite on virheellinen. Tarkista se ja yritä uudelleen.",
 	"Oops! There are files still uploading. Please wait for the upload to complete.": "Hups! Tiedostoja on vielä ladattavana. Odota, että lataus on valmis.",
 	"Oops! There was an error in the previous response.": "Hups! Edellisessä vastauksessa oli virhe.",
 	"Oops! You're using an unsupported method (frontend only). Please serve the WebUI from the backend.": "Hups! Käytät ei-tuettua menetelmää (vain frontend). Palvele WebUI:ta backendistä.",
@@ -788,7 +788,7 @@
 	"Prompt updated successfully": "Kehote päivitetty onnistuneesti",
 	"Prompts": "Kehotteet",
 	"Prompts Access": "Kehoitteiden käyttöoikeudet",
-	"Proxy URL": "Välityspalvelimen URL-osoite",
+	"Proxy URL": "Välityspalvelimen verkko-osoite",
 	"Pull \"{{searchValue}}\" from Ollama.com": "Lataa \"{{searchValue}}\" Ollama.comista",
 	"Pull a model from Ollama.com": "Lataa malli Ollama.comista",
 	"Query Generation Prompt": "Kyselytulosten luontikehote",
@@ -864,7 +864,7 @@
 	"Searched {{count}} sites": "Etsitty {{count}} sivulta",
 	"Searching \"{{searchQuery}}\"": "Haetaan \"{{searchQuery}}\"",
 	"Searching Knowledge for \"{{searchQuery}}\"": "Haetaan tietämystä \"{{searchQuery}}\"",
-	"Searxng Query URL": "Searxng-kyselyn URL-osoite",
+	"Searxng Query URL": "Searxng-kyselyn verkko-osoite",
 	"See readme.md for instructions": "Katso ohjeet readme.md-tiedostosta",
 	"See what's new": "Katso, mitä uutta",
 	"Seed": "Siemenluku",
@@ -874,7 +874,7 @@
 	"Select a group": "Valitse ryhmä",
 	"Select a model": "Valitse malli",
 	"Select a pipeline": "Valitse putki",
-	"Select a pipeline url": "Valitse putken URL-osoite",
+	"Select a pipeline url": "Valitse putken verkko-osoite",
 	"Select a tool": "Valitse työkalu",
 	"Select an auth method": "Valitse kirjautumistapa",
 	"Select an Ollama instance": "Valitse Ollama instanssi",
@@ -889,8 +889,8 @@
 	"Send message": "Lähetä viesti",
 	"Sends `stream_options: { include_usage: true }` in the request.\nSupported providers will return token usage information in the response when set.": "Lähettää `stream_options: { include_usage: true }` pyynnössä.\nTuetut tarjoajat palauttavat tokenkäyttötiedot vastauksessa, kun se on asetettu.",
 	"September": "syyskuu",
-	"SerpApi API Key": "",
-	"SerpApi Engine": "",
+	"SerpApi API Key": "SerpApi API -avain",
+	"SerpApi Engine": "SerpApi moottori",
 	"Serper API Key": "Serper API -avain",
 	"Serply API Key": "Serply API -avain",
 	"Serpstack API Key": "Serpstack API -avain",
@@ -906,7 +906,7 @@
 	"Set Scheduler": "Aseta ajoitin",
 	"Set Steps": "Aseta askeleet",
 	"Set Task Model": "Aseta tehtävämalli",
-	"Set the number of layers, which will be off-loaded to GPU. Increasing this value can significantly improve performance for models that are optimized for GPU acceleration but may also consume more power and GPU resources.": "",
+	"Set the number of layers, which will be off-loaded to GPU. Increasing this value can significantly improve performance for models that are optimized for GPU acceleration but may also consume more power and GPU resources.": "Aseta näytönohjaimelle ladattavien tasojen määrä. Tämän arvon kasvattaminen voi parantaa merkittävästi näytönohjaimelle optimoitujen mallien suorituskykyä, mutta se voi myös lisätä näytönohjaimen virrankulutusta ja resurssien käyttöä.",
 	"Set the number of worker threads used for computation. This option controls how many threads are used to process incoming requests concurrently. Increasing this value can improve performance under high concurrency workloads but may also consume more CPU resources.": "Aseta työntekijäsäikeiden määrä laskentaa varten. Tämä asetus kontrolloi, kuinka monta säiettä käytetään saapuvien pyyntöjen rinnakkaiseen käsittelyyn. Arvon kasvattaminen voi parantaa suorituskykyä suurissa samanaikaisissa työkuormissa, mutta voi myös kuluttaa enemmän keskussuorittimen resursseja.",
 	"Set Voice": "Aseta puheääni",
 	"Set whisper model": "Aseta whisper-malli",
@@ -958,7 +958,7 @@
 	"Tags Generation Prompt": "Tagien luontikehote",
 	"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)": "Tail-free-otanta käytetään vähentämään vähemmän todennäköisten tokenien vaikutusta tulokseen. Korkeampi arvo (esim. 2,0) vähentää vaikutusta enemmän, kun taas arvo 1,0 poistaa tämän asetuksen käytöstä. (oletus: 1)",
 	"Tap to interrupt": "Napauta keskeyttääksesi",
-	"Tasks": "",
+	"Tasks": "Tehtävät",
 	"Tavily API Key": "Tavily API -avain",
 	"Tell us more:": "Kerro lisää:",
 	"Temperature": "Lämpötila",
@@ -1005,14 +1005,14 @@
 	"Title (e.g. Tell me a fun fact)": "Otsikko (esim. Kerro hauska fakta)",
 	"Title Auto-Generation": "Otsikon automaattinen luonti",
 	"Title cannot be an empty string.": "Otsikko ei voi olla tyhjä merkkijono.",
-	"Title Generation": "",
+	"Title Generation": "Otsikon luonti",
 	"Title Generation Prompt": "Otsikon luontikehote",
 	"TLS": "TLS",
 	"To access the available model names for downloading,": "Päästäksesi käsiksi ladattavissa oleviin mallinimiin,",
 	"To access the GGUF models available for downloading,": "Päästäksesi käsiksi ladattavissa oleviin GGUF-malleihin,",
 	"To access the WebUI, please reach out to the administrator. Admins can manage user statuses from the Admin Panel.": "Päästäksesi käyttämään WebUI:ta, ota yhteyttä ylläpitäjään. Ylläpitäjät voivat hallita käyttäjien tiloja Ylläpitopaneelista.",
 	"To attach knowledge base here, add them to the \"Knowledge\" workspace first.": "Liittääksesi tietokantasi tähän, lisää ne ensin \"Tietämys\"-työtilaan.",
-	"To learn more about available endpoints, visit our documentation.": "",
+	"To learn more about available endpoints, visit our documentation.": "Jos haluat lisätietoja käytettävissä olevista päätepisteistä, tutustu dokumentaatioomme.",
 	"To protect your privacy, only ratings, model IDs, tags, and metadata are shared from your feedback—your chat logs remain private and are not included.": "Yksityisyydensuojasi vuoksi palautteestasi jaetaan vain arvostelut, mallitunnukset, tagit ja metadata - keskustelulokisi pysyvät yksityisinä eikä niitä sisällytetä.",
 	"To select actions here, add them to the \"Functions\" workspace first.": "Valitaksesi toimintoja tässä, lisää ne ensin \"Toiminnot\"-työtilaan.",
 	"To select filters here, add them to the \"Functions\" workspace first.": "Valitaksesi suodattimia tässä, lisää ne ensin \"Toiminnot\"-työtilaan.",
@@ -1046,7 +1046,7 @@
 	"TTS Voice": "Puhesynteesiääni",
 	"Type": "Tyyppi",
 	"Type Hugging Face Resolve (Download) URL": "Kirjoita Hugging Face -resolve-latausosoite",
-	"Uh-oh! There was an issue with the response.": "Voi ei! Vastauksessa oli ongelma.",
+	"Uh-oh! There was an issue with the response.": "Voi ei! Vastauksessa ilmeni ongelma.",
 	"UI": "Käyttöliittymä",
 	"Unarchive All": "Pura kaikkien arkistointi",
 	"Unarchive All Archived Chats": "Pura kaikkien arkistoitujen keskustelujen arkistointi",
@@ -1101,7 +1101,7 @@
 	"Warning:": "Varoitus:",
 	"Warning: Enabling this will allow users to upload arbitrary code on the server.": "Varoitus: Tämän käyttöönotto sallii käyttäjien ladata mielivaltaista koodia palvelimelle.",
 	"Warning: If you update or change your embedding model, you will need to re-import all documents.": "Varoitus: Jos päivität tai vaihdat upotusmallia, sinun on tuotava kaikki asiakirjat uudelleen.",
-	"Warning: Jupyter execution enables arbitrary code execution, posing severe security risks—proceed with extreme caution.": "",
+	"Warning: Jupyter execution enables arbitrary code execution, posing severe security risks—proceed with extreme caution.": "Varoitus: Jupyter käyttö voi mahdollistaa mielivaltaiseen koodin suorittamiseen, mikä voi aiheuttaa tietoturvariskejä - käytä äärimmäisen varoen.",
 	"Web": "Web",
 	"Web API": "Web-API",
 	"Web Loader Settings": "Web Loader -asetukset",
@@ -1109,7 +1109,7 @@
 	"Web Search Engine": "Hakukoneet",
 	"Web Search in Chat": "Verkkohaku keskustelussa",
 	"Web Search Query Generation": "Verkkohakukyselyn luonti",
-	"Webhook URL": "Webhook-URL",
+	"Webhook URL": "Webhook verkko-osoite",
 	"WebUI Settings": "WebUI-asetukset",
 	"WebUI URL": "WebUI-osoite",
 	"WebUI will make requests to \"{{url}}/api/chat\"": "WebUI lähettää pyyntöjä osoitteeseen \"{{url}}/api/chat\"",

+ 121 - 127
src/lib/i18n/locales/pl-PL/translation.json

@@ -1,6 +1,6 @@
 {
 	"-1 for no limit, or a positive integer for a specific limit": "-1 oznacza brak limitu, lub dodatnia liczba całkowita dla konkretnego limitu",
-	"'s', 'm', 'h', 'd', 'w' or '-1' for no expiration.": "s, m, h, d, w lub -1 dla braku wygaśnięcia.",
+	"'s', 'm', 'h', 'd', 'w' or '-1' for no expiration.": "'s', 'm', 'h', 'd', 'w' lub '-1' dla braku wygaśnięcia.",
 	"(e.g. `sh webui.sh --api --api-auth username_password`)": "(np. `sh webui.sh --api --api-auth username_password`)>",
 	"(e.g. `sh webui.sh --api`)": "(np. `sh webui.sh --api`)",
 	"(latest)": "(najnowszy)",
@@ -21,28 +21,28 @@
 	"Accurate information": "Precyzyjna informacja",
 	"Actions": "Akcje",
 	"Activate": "Włącz",
-	"Activate this command by typing \"/{{COMMAND}}\" to chat input.": "Aktywuj ten rozkaz, wpisując \"/{{COMMAND}}\" do pola wprowadzania czatu.",
+	"Activate this command by typing \"/{{COMMAND}}\" to chat input.": "Aktywuj tę komendę, wpisując \"/{{COMMAND}}\" do pola wprowadzania czatu.",
 	"Active Users": "Aktywni użytkownicy",
 	"Add": "Dodaj",
 	"Add a model ID": "Dodaj identyfikator modelu",
 	"Add a short description about what this model does": "Dodaj krótki opis działania tego modelu",
 	"Add a tag": "Dodaj tag",
-	"Add Arena Model": "Dodaj model Arena",
-	"Add Connection": "Dodaj Połączenie",
+	"Add Arena Model": "Dodaj Model Arena",
+	"Add Connection": "Dodaj połączenie",
 	"Add Content": "Dodaj treść",
 	"Add content here": "Dodaj tutaj treść",
 	"Add custom prompt": "Dodaj niestandardowe polecenie",
 	"Add Files": "Dodaj pliki",
-	"Add Group": "Dodaj Grupę",
+	"Add Group": "Dodaj grupę",
 	"Add Memory": "Dodaj pamięć",
 	"Add Model": "Dodaj model",
 	"Add Reaction": "Dodaj reakcję",
-	"Add Tag": "Dodaj Tag",
+	"Add Tag": "Dodaj tag",
 	"Add Tags": "Dodaj tagi",
 	"Add text content": "Dodaj tekstową zawartość",
 	"Add User": "Dodaj użytkownika",
 	"Add User Group": "Dodaj grupę użytkowników",
-	"Adjusting these settings will apply changes universally to all users.": "Dostosowanie tych ustawień spowoduje wprowadzenie zmian powszechnie dla wszystkich użytkowników.",
+	"Adjusting these settings will apply changes universally to all users.": "Dostosowanie tych ustawień spowoduje wprowadzenie zmian dla wszystkich użytkowników.",
 	"admin": "administrator",
 	"Admin": "Administrator",
 	"Admin Panel": "Panel administracyjny",
@@ -52,7 +52,7 @@
 	"Advanced Params": "Zaawansowane ustawienia",
 	"All Documents": "Wszystkie dokumenty",
 	"All models deleted successfully": "Wszystkie modele zostały usunięte pomyślnie.",
-	"Allow Chat Controls": "Zezwól na kontrolki Chat",
+	"Allow Chat Controls": "Zezwól na dostęp do ustawień czatu",
 	"Allow Chat Delete": "Zezwól na usunięcie czatu",
 	"Allow Chat Deletion": "Zezwól na usuwanie czatu",
 	"Allow Chat Edit": "Zezwól na edycję czatu",
@@ -62,7 +62,7 @@
 	"Allow User Location": "Zezwól na lokalizację użytkownika",
 	"Allow Voice Interruption in Call": "Zezwól na przerwanie połączenia głosowego",
 	"Allowed Endpoints": "Dozwolone punkty końcowe",
-	"Already have an account?": "Czy już masz konto?",
+	"Already have an account?": "Czy masz już konto?",
 	"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)": "Alternatywa dla top_p, mająca na celu zapewnienie równowagi między jakością a różnorodnością. Parametr p reprezentuje minimalne prawdopodobieństwo, aby token był brany pod uwagę, względem prawdopodobieństwa najbardziej prawdopodobnego tokena. Na przykład, dla p=0,05 i najbardziej prawdopodobnym tokenem o prawdopodobieństwie 0,9, logity o wartości mniejszej niż 0,045 są wykluczane. (Domyślnie: 0,0)",
 	"Always": "Zawsze",
 	"Amazing": "Niesamowite",
@@ -77,8 +77,8 @@
 	"API Key created.": "Klucz API został utworzony.",
 	"API Key Endpoint Restrictions": "Ograniczenia punktu końcowego klucza API",
 	"API keys": "Klucze API",
-	"Application DN": "Aplikacja DN",
-	"Application DN Password": "Aplikacja hasło DN",
+	"Application DN": "Konto techniczne - Format DN",
+	"Application DN Password": "Hasło do konta technicznego",
 	"applies to all users with the \"user\" role": "dotyczy wszystkich użytkowników z rolą \"user\"",
 	"April": "Kwiecień",
 	"Archive": "Archiwum",
@@ -99,16 +99,16 @@
 	"Attribute for Username": "Atrybut dla nazwy użytkownika",
 	"Audio": "Dźwięk",
 	"August": "Sierpień",
-	"Authenticate": "Uwierzytelnianie",
+	"Authenticate": "Zaloguj się",
 	"Authentication": "Uwierzytelnianie",
 	"Auto-Copy Response to Clipboard": "Automatyczna kopiuj odpowiedz do schowka",
 	"Auto-playback response": "Automatyczna odpowiedź na powtórzenie",
 	"Autocomplete Generation": "Generowanie autouzupełniania",
-	"Autocomplete Generation Input Max Length": "Generowanie Autouzupełniania Wejścia Maksymalna Długość",
-	"Automatic1111": "Automatyczny1111",
-	"AUTOMATIC1111 Api Auth String": "Automatyczny ciąg uwierzytelniania API 1111",
-	"AUTOMATIC1111 Base URL": "Domyślny adres URL AUTOMATIC1111",
-	"AUTOMATIC1111 Base URL is required.": "Adres podstawowy AUTOMATIC1111 jest wymagany.",
+	"Autocomplete Generation Input Max Length": "Maksymalna długość wejścia dla generowania autouzupełniania",
+	"Automatic1111": "Automatic1111",
+	"AUTOMATIC1111 Api Auth String": "Automatic1111 - ciąg uwierzytelniania API",
+	"AUTOMATIC1111 Base URL": "Automatic1111 - Domyślny adres URL",
+	"AUTOMATIC1111 Base URL is required.": "Automatic1111 - Adres podstawowy jest wymagany.",
 	"Available list": "Dostępna lista",
 	"available!": "dostępny!",
 	"Awful": "Okropne",
@@ -131,7 +131,7 @@
 	"Calendar": "Kalendarz",
 	"Call": "Wywołanie",
 	"Call feature is not supported when using Web STT engine": "Funkcja wywołania nie jest obsługiwana podczas korzystania z silnika Web STT",
-	"Camera": "Aparat fotograficzny",
+	"Camera": "Kamera",
 	"Cancel": "Anuluj",
 	"Capabilities": "Możliwości",
 	"Capture": "Uchwycić",
@@ -142,15 +142,15 @@
 	"Character": "Znak",
 	"Character limit for autocomplete generation input": "Limit znaków dla wejścia generowanego automatycznie",
 	"Chart new frontiers": "Odkrywaj nowe horyzonty",
-	"Chat": "Rozmowa online",
+	"Chat": "Czat",
 	"Chat Background Image": "Obraz tła czatu",
 	"Chat Bubble UI": "Okno dialogowe czatu",
-	"Chat Controls": "Sterowanie czatem",
+	"Chat Controls": "Ustawienia czatu",
 	"Chat direction": "Kierunek rozmowy czatu",
 	"Chat Overview": "Przegląd czatu",
 	"Chat Permissions": "Uprawnienia do czatu",
 	"Chat Tags Auto-Generation": "Automatyczne generowanie tagów czatu",
-	"Chats": "Rozmowy",
+	"Chats": "Czaty",
 	"Check Again": "Sprawdź ponownie",
 	"Check for updates": "Sprawdź dostępność aktualizacji",
 	"Checking for updates...": "Sprawdzanie dostępności aktualizacji...",
@@ -162,7 +162,7 @@
 	"Citation": "Cytat",
 	"Clear memory": "Wyczyść pamięć",
 	"click here": "kliknij tutaj",
-	"Click here for filter guides.": "Kliknij tutaj, aby uzyskać przewodniki filtrów.",
+	"Click here for filter guides.": "Kliknij tutaj, aby uzyskać podpowiedź do filtrów.",
 	"Click here for help.": "Kliknij tutaj, aby uzyskać pomoc.",
 	"Click here to": "Kliknij tutaj, aby przejść do",
 	"Click here to download user import template file.": "Kliknij tutaj, aby pobrać szablon pliku importu użytkownika.",
@@ -173,19 +173,18 @@
 	"Click here to select a py file.": "Kliknij tutaj, aby wybrać plik py.",
 	"Click here to upload a workflow.json file.": "Kliknij tutaj, aby przesłać plik workflow.json.",
 	"click here.": "kliknij tutaj.",
-	"Click on the user role button to change a user's role.": "Kliknij przycisk roli użytkownika, aby zmienić rolę użytkownika.",
+	"Click on the user role button to change a user's role.": "Kliknij w nazwą roli użytkownika, aby zmienić rolę użytkownika.",
 	"Clipboard write permission denied. Please check your browser settings to grant the necessary access.": "Zezwolenie na zapis do schowka odmówione. Sprawdź ustawienia przeglądarki, aby przyznać wymagany dostęp.",
 	"Clone": "Sklonuj",
-	"Clone Chat": "Sklonuj Czat",
+	"Clone Chat": "Sklonuj czat",
 	"Clone of {{TITLE}}": "Klon {{TITLE}}",
 	"Close": "Zamknij",
 	"Code execution": "Wykonanie kodu",
 	"Code Execution": "Wykonanie kodu",
 	"Code Execution Engine": "Silnik wykonawczy kodu",
-	"Code Execution Timeout": "",
 	"Code formatted successfully": "Kod został sformatowany pomyślnie.",
 	"Code Interpreter": "Interpreter kodu",
-	"Code Interpreter Engine": "Silnik Interpretatora Kodu",
+	"Code Interpreter Engine": "Silnik interpretatora kodu",
 	"Code Interpreter Prompt Template": "Szablon promtu interpretera kodu",
 	"Collection": "Zbiór",
 	"Color": "Kolor",
@@ -216,7 +215,7 @@
 	"Continue with LDAP": "Kontynuuj z 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.": "Kontroluj sposób dzielenia tekstu wiadomości dla żądań TTS. 'Punctuation' dzieli na zdania, 'paragraphs' dzieli na akapity, a 'none' pozostawia wiadomość jako pojedynczy ciąg znaków.",
 	"Control the repetition of token sequences in the generated text. A higher value (e.g., 1.5) will penalize repetitions more strongly, while a lower value (e.g., 1.1) will be more lenient. At 1, it is disabled. (Default: 1.1)": "Kontroluj powtarzanie się sekwencji tokenów w wygenerowanym tekście. Wyższa wartość (np. 1,5) będzie silniej penalizować powtórzenia, podczas gdy niższa wartość (np. 1,1) będzie bardziej pobłażliwa. Na poziomie 1 jest wyłączona. (Domyślnie: 1,1)",
-	"Controls": "Sterowanie",
+	"Controls": "Ustawienia",
 	"Controls the balance between coherence and diversity of the output. A lower value will result in more focused and coherent text. (Default: 5.0)": "Kontroluje równowagę między spójnością a zróżnicowaniem wyników. Niższa wartość zaowocuje bardziej skoncentrowanym i spójnym tekstem. (Domyślnie: 5,0)",
 	"Copied": "Skopiowane",
 	"Copied shared chat URL to clipboard!": "Skopiowano udostępniony URL czatu do schowka!",
@@ -237,7 +236,7 @@
 	"Create Group": "Utwórz grupę",
 	"Create Knowledge": "Utwórz wiedzę",
 	"Create new key": "Utwórz nowy klucz",
-	"Create new secret key": "Utwórz nowy klucz tajny",
+	"Create new secret key": "Utwórz nowy secret key",
 	"Created at": "Stworzone o",
 	"Created At": "Utworzono o",
 	"Created by": "Stworzone przez",
@@ -252,14 +251,14 @@
 	"Default (Open AI)": "Domyślny (Open AI)",
 	"Default (SentenceTransformers)": "Domyślny (SentenceTransformers)",
 	"Default mode works with a wider range of models by calling tools once before execution. Native mode leverages the model’s built-in tool-calling capabilities, but requires the model to inherently support this feature.": "Tryb domyślny współpracuje z szerszym zakresem modeli, wywołując narzędzia raz przed wykonaniem. Tryb natywny wykorzystuje wbudowane możliwości wywoływania narzędzi przez model, ale wymaga, aby model wewnętrznie obsługiwał tę funkcję.",
-	"Default Model": "Model standardowy",
+	"Default Model": "Model domyślny",
 	"Default model updated": "Domyślny model został zaktualizowany",
 	"Default Models": "Domyślne modele",
 	"Default permissions": "Domyślne uprawnienia",
 	"Default permissions updated successfully": "Domyślne uprawnienia zaktualizowane pomyślnie",
 	"Default Prompt Suggestions": "Domyślne propozycje wpisów",
 	"Default to 389 or 636 if TLS is enabled": "Domyślnie użyj 389 lub 636, jeśli TLS jest włączony",
-	"Default to ALL": "Domyślnie wybierz wszystkie",
+	"Default to ALL": "Domyślne dla wszystkich",
 	"Default User Role": "Domyślna rola użytkownika",
 	"Delete": "Usuń",
 	"Delete a model": "Usuń model",
@@ -274,17 +273,17 @@
 	"Delete message?": "Usuń wiadomość?",
 	"Delete prompt?": "Czy chcesz usunąć podpowiedź?",
 	"delete this link": "usuń to połączenie",
-	"Delete tool?": "Usuń narzędzie?",
+	"Delete tool?": "Usunąć narzędzie?",
 	"Delete User": "Usuń użytkownika",
-	"Deleted {{deleteModelTag}}": "Usuwono {{deleteModelTag}}",
+	"Deleted {{deleteModelTag}}": "Usunieto {{deleteModelTag}}",
 	"Deleted {{name}}": "Usunięto użytkownika {{name}}",
 	"Deleted User": "Usunięty użytkownik",
 	"Describe your knowledge base and objectives": "Opisz swoją bazę wiedzy i cele",
 	"Description": "Opis",
 	"Didn't fully follow instructions": "Nie wykonał w pełni instrukcji",
-	"Direct Connections": "Połączenia Bezpośrednie",
+	"Direct Connections": "Połączenia bezpośrednie",
 	"Direct Connections allow users to connect to their own OpenAI compatible API endpoints.": "Połączenia bezpośrednie umożliwiają użytkownikom łączenie się z własnymi końcówkami API kompatybilnymi z OpenAI.",
-	"Direct Connections settings updated": "Ustawienia Połączeń Bezpośrednich zaktualizowane",
+	"Direct Connections settings updated": "Ustawienia połączeń bezpośrednich zaktualizowane",
 	"Disabled": "Wyłączony",
 	"Discover a function": "Odkryj funkcję",
 	"Discover a model": "Odkryj model",
@@ -297,7 +296,7 @@
 	"Discover, download, and explore custom tools": "Odkryj, pobierz i eksploruj niestandardowe narzędzia",
 	"Discover, download, and explore model presets": "Odkryj, pobierz i badaj ustawienia modeli",
 	"Dismissible": "Możliwe do odrzucenia",
-	"Display": "Wyświetlacz",
+	"Display": "Wyświetl",
 	"Display Emoji in Call": "Wyświetl emoji w połączeniu",
 	"Display the username instead of You in the Chat": "Wyświetl nazwę użytkownika zamiast 'You' w czacie.",
 	"Displays citations in the response": "Wyświetla cytowania w odpowiedzi",
@@ -322,10 +321,9 @@
 	"Draw": "Rysuj",
 	"Drop any files here to add to the conversation": "Przeciągnij i upuść pliki tutaj, aby dodać je do rozmowy.",
 	"e.g. '30s','10m'. Valid time units are 's', 'm', 'h'.": "np. '30s', '10m'. Poprawne jednostki czasu to: 's' (sekunda), 'm' (minuta), 'h' (godzina).",
-	"e.g. 60": "",
 	"e.g. A filter to remove profanity from text": "np. Filtr do usuwania wulgaryzmów z tekstu",
-	"e.g. My Filter": "np. Mój Filtr",
-	"e.g. My Tools": "np. Moje Narzędzia",
+	"e.g. My Filter": "np. Mój filtr",
+	"e.g. My Tools": "np. Moje narzędzia",
 	"e.g. my_filter": "np. moj_filtr",
 	"e.g. my_tools": "np. moje_narzędzia",
 	"e.g. Tools for performing various operations": "np. Narzędzia do wykonywania różnych operacji",
@@ -336,7 +334,7 @@
 	"Edit Default Permissions": "Edytuj domyślne uprawnienia",
 	"Edit Memory": "Edytuj pamięć",
 	"Edit User": "Edytuj profil użytkownika",
-	"Edit User Group": "Edytuj Grupa Użytkowników",
+	"Edit User Group": "Edytuj grupa użytkowników",
 	"ElevenLabs": "ElevenLabs",
 	"Email": "Email",
 	"Embark on adventures": "Wyruszaj na przygody",
@@ -346,7 +344,7 @@
 	"Embedding model set to \"{{embedding_model}}\"": "Model osadzania ustawiony na '{{embedding_model}}'",
 	"Enable API Key": "Włącz klucz API",
 	"Enable autocomplete generation for chat messages": "Włącz generowanie autouzupełniania dla wiadomości czatu",
-	"Enable Code Interpreter": "Włącz Interpreter Kodu",
+	"Enable Code Interpreter": "Włącz interpreter kodu",
 	"Enable Community Sharing": "Włączanie udostępniania społecznościowego",
 	"Enable Google Drive": "Włącz Google Drive",
 	"Enable Memory Locking (mlock) to prevent model data from being swapped out of RAM. This option locks the model's working set of pages into RAM, ensuring that they will not be swapped out to disk. This can help maintain performance by avoiding page faults and ensuring fast data access.": "Włącz blokowanie pamięci (mlock), aby zapobiec swappingowi danych modelu z RAM. Ta opcja blokuje zbiór stron roboczych modelu w RAM, co gwarantuje, że nie będą one wymieniane na dysk. Może to pomóc w utrzymaniu wydajności poprzez unikanie błędów strony i zapewnienie szybkiego dostępu do danych.",
@@ -361,8 +359,8 @@
 	"Enter {{role}} message here": "Wprowadź komunikat dla {{role}} tutaj",
 	"Enter a detail about yourself for your LLMs to recall": "Podaj informacje o sobie, aby LLMs mogły je przypomnieć.",
 	"Enter api auth string (e.g. username:password)": "Wprowadź ciąg uwierzytelniania API (np. nazwa użytkownika:hasło)",
-	"Enter Application DN": "Wprowadź Aplikację DN",
-	"Enter Application DN Password": "Wprowadź hasło aplikacji DN",
+	"Enter Application DN": "Wprowadź nazwę konta technicznego - Format DN",
+	"Enter Application DN Password": "Wprowadź hasło do konta technicznego",
 	"Enter Bing Search V7 Endpoint": "Wprowadź endpoint wyszukiwania Bing V7",
 	"Enter Bing Search V7 Subscription Key": "Wprowadź klucz subskrypcji Bing Search V7",
 	"Enter Bocha Search API Key": "Wprowadź klucz API Bocha Search",
@@ -390,13 +388,13 @@
 	"Enter Number of Steps (e.g. 50)": "Podaj liczbę kroków (np. 50)",
 	"Enter proxy URL (e.g. https://user:password@host:port)": "Podaj adres URL proxy (np. https://user:password@host:port)",
 	"Enter reasoning effort": "Podaj powód wysiłku",
-	"Enter Sampler (e.g. Euler a)": "Wprowadź Sampler (np. Euler a)",
-	"Enter Scheduler (e.g. Karras)": "Wprowadź Harmonogram (np. Karras)",
+	"Enter Sampler (e.g. Euler a)": "Wprowadź sampler (np. Euler a)",
+	"Enter Scheduler (e.g. Karras)": "Wprowadź harmonogram (np. Karras)",
 	"Enter Score": "Wprowadź wynik",
 	"Enter SearchApi API Key": "Wprowadź klucz API SearchApi",
 	"Enter SearchApi Engine": "Wprowadź zapytanie do silnika wyszukiwania SearchApi",
 	"Enter Searxng Query URL": "Wprowadź adres URL zapytania wyszukiwania Searxng",
-	"Enter Seed": "Wprowadź Nasiono",
+	"Enter Seed": "Wprowadź Seed",
 	"Enter SerpApi API Key": "Wprowadź klucz API SerpApi",
 	"Enter SerpApi Engine": "Wprowadź silnik SerpApi",
 	"Enter Serper API Key": "Wprowadź klucz API Serper",
@@ -410,7 +408,6 @@
 	"Enter Tavily API Key": "Wprowadź klucz API Tavily",
 	"Enter the public URL of your WebUI. This URL will be used to generate links in the notifications.": "Wprowadź publiczny adres URL Twojego WebUI. Ten adres URL zostanie użyty do generowania linków w powiadomieniach.",
 	"Enter Tika Server URL": "Wprowadź adres URL serwera Tika",
-	"Enter timeout in seconds": "",
 	"Enter Top K": "Wprowadź {Top K}",
 	"Enter URL (e.g. http://127.0.0.1:7860/)": "Podaj adres URL (np. http://127.0.0.1:7860/)",
 	"Enter URL (e.g. http://localhost:11434)": "Wprowadź adres URL (np. http://localhost:11434)",
@@ -431,7 +428,7 @@
 	"Exa API Key": "Klucz API Exa",
 	"Example: (&(objectClass=inetOrgPerson)(uid=%s))": "Przykład: (&(objectClass=inetOrgPerson)(uid=%s))",
 	"Example: ALL": "Przykład: ALL",
-	"Example: mail": "Przykład: poczta e-mail",
+	"Example: mail": "Przykład: mail",
 	"Example: ou=users,dc=foo,dc=example": "Przykład: ou=users,dc=foo,dc=example",
 	"Example: sAMAccountName or uid or userPrincipalName": "Przykład: sAMAccountName lub uid lub userPrincipalName",
 	"Exclude": "Wykluczyć",
@@ -449,8 +446,8 @@
 	"Export Presets": "Wyeksportuj ustawienia domyślne",
 	"Export Prompts": "Eksportuj prompty",
 	"Export to CSV": "Eksport do CSV",
-	"Export Tools": "Narzędzia Eksportu",
-	"External Models": "Modele zewnętrzne",
+	"Export Tools": "Eksportuj narzędzia",
+	"External Models": "Zewnętrzne modele",
 	"Failed to add file.": "Nie udało się dodać pliku.",
 	"Failed to create API Key.": "Nie udało się wygenerować klucza API.",
 	"Failed to fetch models": "Nie udało się pobrać modeli",
@@ -461,7 +458,7 @@
 	"Features": "Funkcje",
 	"Features Permissions": "Uprawnienia do funkcji",
 	"February": "Luty",
-	"Feedback History": "Historia powiadomień",
+	"Feedback History": "Historia ocen",
 	"Feedbacks": "Oceny",
 	"Feel free to add specific details": "Nie krępuj się dodawać szczegółów",
 	"File": "Plik",
@@ -503,9 +500,6 @@
 	"Functions allow arbitrary code execution": "Funkcje umożliwiają wykonanie dowolnego kodu",
 	"Functions allow arbitrary code execution.": "Funkcje umożliwiają wykonanie dowolnego kodu.",
 	"Functions imported successfully": "Funkcje zostały pomyślnie zaimportowane",
-	"Gemini": "",
-	"Gemini API Config": "",
-	"Gemini API Key is required.": "",
 	"General": "Ogólne",
 	"General Settings": "Ustawienia ogólne",
 	"Generate an image": "Wygeneruj obraz",
@@ -521,10 +515,10 @@
 	"Group created successfully": "Grupa utworzona pomyślnie",
 	"Group deleted successfully": "Grupa została usunięta pomyślnie",
 	"Group Description": "Opis grupy",
-	"Group Name": "Nazwa Grupy",
+	"Group Name": "Nazwa grupy",
 	"Group updated successfully": "Grupa zaktualizowana pomyślnie",
 	"Groups": "Grupy",
-	"Haptic Feedback": "Sprzężenie zwrotne dotykowe",
+	"Haptic Feedback": "Haptyczne sprzężenie zwrotne",
 	"has no conversations.": "nie zawiera rozmów.",
 	"Hello, {{name}}": "Witaj, {{name}}",
 	"Help": "Pomoc",
@@ -533,8 +527,8 @@
 	"Hex Color - Leave empty for default color": "Kolor heksadecymalny - pozostaw puste dla domyślnego koloru",
 	"Hide": "Ukryj",
 	"Home": "Dom",
-	"Host": "Gospodarz",
-	"How can I help you today?": "Jak mogę Ci służyć dzisiaj?",
+	"Host": "Serwer",
+	"How can I help you today?": "Jak mogę Ci dzisiaj pomóc?",
 	"How would you rate this response?": "Jak oceniłbyś tę odpowiedź?",
 	"Hybrid Search": "Wyszukiwanie hybrydowe",
 	"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.": "Potwierdzam, że przeczytałem i rozumiem konsekwencje mojego działania. Jestem świadomy ryzyka związanego z wykonywaniem kodu o nieznanym pochodzeniu i zweryfikowałem wiarygodność źródła.",
@@ -543,7 +537,7 @@
 	"Image": "Obraz",
 	"Image Compression": "Kompresja obrazu",
 	"Image Generation": "Generowanie obrazów",
-	"Image Generation (Experimental)": "Generowanie obrazu (doświadczalne)",
+	"Image Generation (Experimental)": "Generowanie obrazu (eksperymentalne)",
 	"Image Generation Engine": "Silnik generowania obrazów",
 	"Image Max Compression Size": "Maksymalny rozmiar kompresji obrazu",
 	"Image Prompt Generation": "Generowanie podpowiedzi obrazu",
@@ -556,7 +550,7 @@
 	"Import Models": "Importowanie modeli",
 	"Import Presets": "Importuj ustawienia",
 	"Import Prompts": "Importuj prompty",
-	"Import Tools": "Import Narzędzi",
+	"Import Tools": "Import narzędzi",
 	"Include": "Włączyć",
 	"Include `--api-auth` flag when running stable-diffusion-webui": "Użyj flagi `--api-auth` podczas uruchamiania stable-diffusion-webui",
 	"Include `--api` flag when running stable-diffusion-webui": "Użyj flagi `--api` podczas uruchamiania stable-diffusion-webui.",
@@ -568,7 +562,7 @@
 	"Interface": "Interfejs",
 	"Invalid file format.": "Nieprawidłowy format pliku.",
 	"Invalid Tag": "Nieprawidłowy tag",
-	"is typing...": "Czy pisanie...",
+	"is typing...": "Pisanie...",
 	"January": "Styczeń",
 	"Jina API Key": "Klucz API Jiny",
 	"join our Discord for help.": "Dołącz do naszego Discorda, aby uzyskać pomoc.",
@@ -592,8 +586,8 @@
 	"Knowledge updated successfully": "Wiedza zaktualizowana pomyślnie",
 	"Kokoro.js (Browser)": "Kokoro.js (Przeglądarka)",
 	"Kokoro.js Dtype": "Kokoro.js Dtype",
-	"Label": "Etykieta",
-	"Landing Page Mode": "Tryb strony lądowania",
+	"Label": "Nazwa serwera",
+	"Landing Page Mode": "Tryb strony głownej",
 	"Language": "Język",
 	"Last Active": "Ostatnio aktywny",
 	"Last Modified": "Ostatnia modyfikacja",
@@ -615,21 +609,21 @@
 	"Loading Kokoro.js...": "Wczytywanie Kokoro.js...",
 	"Local": "Lokalny",
 	"Local Models": "Modele lokalne",
-	"Lost": "Zagubiony",
+	"Lost": "Przegrał",
 	"LTR": "LTR",
 	"Made by Open WebUI Community": "Opracowane przez społeczność Open WebUI",
 	"Make sure to enclose them with": "Upewnij się, że są one zawarte w",
 	"Make sure to export a workflow.json file as API format from ComfyUI.": "Upewnij się, że wyeksportowałeś plik workflow.json w formacie API z ComfyUI.",
 	"Manage": "Zarządzaj",
-	"Manage Arena Models": "Zarządzaj modelami Areny",
+	"Manage Arena Models": "Zarządzaj modelami areny",
 	"Manage Direct Connections": "Zarządzaj bezpośrednimi połączeniami",
 	"Manage Models": "Zarządzaj modelami",
 	"Manage Ollama": "Zarządzaj Ollamą",
 	"Manage Ollama API Connections": "Zarządzaj połączeniami z API Ollama",
 	"Manage OpenAI API Connections": "Zarządzaj połączeniami z API OpenAI",
-	"Manage Pipelines": "Zarządzanie potokami",
+	"Manage Pipelines": "Zarządzanie przepływem",
 	"March": "Marzec",
-	"Max Tokens (num_predict)": "Maksymalna liczba żetonów (num_predict)",
+	"Max Tokens (num_predict)": "Maksymalna liczba tokenów (num_predict)",
 	"Max Upload Count": "Maksymalna liczba przesyłanych plików",
 	"Max Upload Size": "Maksymalny rozmiar przesyłanego pliku",
 	"Maximum of 3 models can be downloaded simultaneously. Please try again later.": "Maksymalnie 3 modele można pobierać jednocześnie. Proszę spróbować ponownie później.",
@@ -640,7 +634,7 @@
 	"Memory cleared successfully": "Pamięć oczyszczona pomyślnie",
 	"Memory deleted successfully": "Pamięć została usunięta pomyślnie",
 	"Memory updated successfully": "Pamięć zaktualizowana pomyślnie",
-	"Merge Responses": " scalaj odpowiedzi ",
+	"Merge Responses": "Scalaj odpowiedzi ",
 	"Message rating should be enabled to use this feature": "Ocena wiadomości powinna być włączona, aby korzystać z tej funkcji.",
 	"Messages you send after creating your link won't be shared. Users with the URL will be able to view the shared chat.": "Wiadomości wysyłane po utworzeniu linku nie będą udostępniane. Użytkownicy z adresem URL będą mogli wyświetlić udostępnioną rozmowę.",
 	"Min P": "Min P",
@@ -660,7 +654,7 @@
 	"Model Filtering": "Filtracja modeli",
 	"Model ID": "Identyfikator modelu",
 	"Model IDs": "Identyfikatory modeli",
-	"Model Name": "Nazwa Modelu",
+	"Model Name": "Nazwa modelu",
 	"Model not selected": "Model nie został wybrany",
 	"Model Params": "Parametry modelu",
 	"Model Permissions": "Uprawnienia modelu",
@@ -692,7 +686,7 @@
 	"No model IDs": "Brak identyfikatorów modeli",
 	"No models found": "Nie znaleziono modeli",
 	"No models selected": "Brak wybranych modeli",
-	"No results found": "Brak wyników znalezionych",
+	"No results found": "Brak wyników",
 	"No search query generated": "Nie wygenerowano żadnego zapytania wyszukiwania",
 	"No source available": "Źródło nie jest dostępne.",
 	"No users were found.": "Nie znaleziono użytkowników.",
@@ -731,7 +725,7 @@
 	"Open new chat": "Otwórz nową rozmowę",
 	"Open WebUI uses faster-whisper internally.": "Open WebUI korzysta wewnętrznie z szybszego faster-whisper.",
 	"Open WebUI uses SpeechT5 and CMU Arctic speaker embeddings.": "Otwarta WebUI wykorzystuje SpeechT5 i wbudowane zbiory danych mówcy CMU Arctic.",
-	"Open WebUI version (v{{OPEN_WEBUI_VERSION}}) is lower than required version (v{{REQUIRED_VERSION}})": "Otwarta wersja WebUI (v{{OPEN_WEBUI_VERSION}}) jest niższa niż wymagana wersja (v{{REQUIRED_VERSION}})",
+	"Open WebUI version (v{{OPEN_WEBUI_VERSION}}) is lower than required version (v{{REQUIRED_VERSION}})": "Wersja Open WebUI (v{{OPEN_WEBUI_VERSION}}) jest niższa niż wymagana wersja (v{{REQUIRED_VERSION}})",
 	"OpenAI": "OpenAI",
 	"OpenAI API": "Interfejs API OpenAI",
 	"OpenAI API Config": "Konfiguracja interfejsu API OpenAI",
@@ -749,20 +743,20 @@
 	"Paste Large Text as File": "Wklej duży tekst jako plik",
 	"PDF document (.pdf)": "Dokument PDF (.pdf)",
 	"PDF Extract Images (OCR)": "PDF Ekstrahuj obrazy (OCR)",
-	"pending": "w trakcie oczekiwania",
+	"pending": "oczekiwanie",
 	"Permission denied when accessing media devices": "Odmowa dostępu podczas uzyskiwania dostępu do urządzeń multimedialnych",
 	"Permission denied when accessing microphone": "Odmowa dostępu podczas uzyskiwania dostępu do mikrofonu",
 	"Permission denied when accessing microphone: {{error}}": "Odmowa dostępu do mikrofonu: {{error}}",
 	"Permissions": "Uprawnienia",
 	"Personalization": "Personalizacja",
-	"Pin": "Szpilka",
+	"Pin": "Przypnij",
 	"Pinned": "Przypięty",
 	"Pioneer insights": "Pionierskie spostrzeżenia",
-	"Pipeline deleted successfully": "Rurociąg usunięty pomyślnie",
-	"Pipeline downloaded successfully": "Rurociąg pobrany pomyślnie",
-	"Pipelines": "Rurociągi",
-	"Pipelines Not Detected": "Niewykryte potoki",
-	"Pipelines Valves": "Rurociągi i Zawory",
+	"Pipeline deleted successfully": "Przepływ usunięty pomyślnie",
+	"Pipeline downloaded successfully": "Przepływ pobrany pomyślnie",
+	"Pipelines": "Przepływy",
+	"Pipelines Not Detected": "Przepływ nie wykryty",
+	"Pipelines Valves": "Przepływy i Zawory",
 	"Plain text (.txt)": "Zwykły tekst (.txt)",
 	"Playground": "Plac zabaw",
 	"Please carefully review the following warnings:": "Proszę uważnie przejrzeć poniższe ostrzeżenia:",
@@ -778,24 +772,24 @@
 	"Prefix ID is used to avoid conflicts with other connections by adding a prefix to the model IDs - leave empty to disable": "ID prefiksu jest używane do unikania konfliktów z innymi połączeniami poprzez dodanie prefiksu do ID modelu - pozostaw puste, aby wyłączyć",
 	"Presence Penalty": "Kara za obecność",
 	"Previous 30 days": "Ostatnie 30 dni",
-	"Previous 7 days": "Poprzednie 7 dni",
+	"Previous 7 days": "Ostatnie 7 dni",
 	"Profile Image": "Zdjęcie profilowe",
-	"Prompt": "Wprowadź odpowiedź: ",
+	"Prompt": "Wprowadź podpowiedź: ",
 	"Prompt (e.g. Tell me a fun fact about the Roman Empire)": "Prompt (np. podaj ciekawostkę o Imperium Rzymskim)",
-	"Prompt Content": "Treść prompty",
-	"Prompt created successfully": "Prompt został utworzony pomyślnie",
+	"Prompt Content": "Treść podpowiedzi",
+	"Prompt created successfully": "Podpowiedź została utworzona pomyślnie",
 	"Prompt suggestions": "Sugestie podpowiedzi",
-	"Prompt updated successfully": "Prompt został zaktualizowany pomyślnie.",
-	"Prompts": "Prompty",
-	"Prompts Access": "Prompty Dostęp",
-	"Proxy URL": "Adres URL pośredniczący",
+	"Prompt updated successfully": "Podpowiedź została zaktualizowana pomyślnie.",
+	"Prompts": "Podpowiedzi",
+	"Prompts Access": "Dostęp do podpowiedzi",
+	"Proxy URL": "Adres URL proxy",
 	"Pull \"{{searchValue}}\" from Ollama.com": "Pobierz \"{{searchValue}}\" z Ollama.com",
 	"Pull a model from Ollama.com": "Pobierz model z Ollama.com",
-	"Query Generation Prompt": "Prompt do generowania zapytań",
+	"Query Generation Prompt": "Podpowiedź do generowania zapytań",
 	"Query Params": "Parametry zapytania",
 	"RAG Template": "Szablon RAG",
 	"Rating": "Ocena",
-	"Re-rank models by topic similarity": "Przeankrować modele według podobieństwa tematycznego",
+	"Re-rank models by topic similarity": "Ponowny ranking modeli według podobieństwa tematycznego",
 	"Read": "Czytaj",
 	"Read Aloud": "Czytaj na głos",
 	"Reasoning Effort": "Wysiłek rozumowania",
@@ -805,9 +799,9 @@
 	"Refer to yourself as \"User\" (e.g., \"User is learning Spanish\")": "Odnosić się do siebie jako \"Użytkownik\" (np. \"Użytkownik uczy się hiszpańskiego\")",
 	"References from": "Odniesienia do",
 	"Refused when it shouldn't have": "Odmówił, gdy nie powinien",
-	"Regenerate": "Odtwórz",
-	"Release Notes": "Notatki wydania",
-	"Relevance": "Znaczenie",
+	"Regenerate": "Wygeneruj ponownie",
+	"Release Notes": "Notatki do wydania",
+	"Relevance": "Trafność",
 	"Remove": "Usuń",
 	"Remove Model": "Usuń model",
 	"Rename": "Zmień nazwę",
@@ -817,8 +811,8 @@
 	"Reply in Thread": "Odpowiedz w wątku",
 	"Request Mode": "Tryb żądania",
 	"Reranking Model": "Poprawa rankingu modelu",
-	"Reranking model disabled": "Model ponownego rankingu wyłączony",
-	"Reranking model set to \"{{reranking_model}}\"": "Model rerankingu ustawiony na \"{{reranking_model}}\".",
+	"Reranking model disabled": "Ponowny ranking modeli wyłączony",
+	"Reranking model set to \"{{reranking_model}}\"": "Ponowny ranking modeli ustawiony na \"{{reranking_model}}\".",
 	"Reset": "Resetuj",
 	"Reset All Models": "Resetuj wszystkie modele",
 	"Reset Upload Directory": "Resetuj katalog pobierania",
@@ -827,33 +821,33 @@
 	"Response notifications cannot be activated as the website permissions have been denied. Please visit your browser settings to grant the necessary access.": "Powiadomienia o odpowiedziach nie mogą zostać aktywowane, ponieważ uprawnienia strony zostały odrzucone. Proszę odwiedzić ustawienia przeglądarki, aby przyznać wymagany dostęp.",
 	"Response splitting": "Rozdzielanie odpowiedzi",
 	"Result": "Wynik",
-	"Retrieval Query Generation": "Generowanie Zapytań Pobierania",
-	"Rich Text Input for Chat": "Pole do wprowadzania tekstu formatowanego dla czatu",
+	"Retrieval Query Generation": "Generowanie zapytań pobierania",
+	"Rich Text Input for Chat": "Pole do wprowadzania tekstu sformatowanego dla czatu",
 	"RK": "RK",
 	"Role": "Rola",
 	"Rosé Pine": "Różana Sosna",
 	"Rosé Pine Dawn": "Różany Poranek Pine Dawn",
 	"RTL": "RTL",
-	"Run": "Uruchom",
-	"Running": "Bieganie",
+	"Run": "Uruchom",
+	"Running": "Uruchomiono",
 	"Save": "Zapisz",
 	"Save & Create": "Zapisz i stwórz",
 	"Save & Update": "Zapisz i odśwież",
 	"Save As Copy": "Zapisz jako kopia",
-	"Save Tag": "Zapisz Tag",
+	"Save Tag": "Zapisz tag",
 	"Saved": "Zapisano",
 	"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": "Zapisywanie dzienników czatu bezpośrednio w pamięci przeglądarki nie jest już obsługiwane. Prosimy o pobranie i usunięcie dzienników czatu, klikając przycisk poniżej. Nie przejmuj się, możesz łatwo ponownie zaimportować dzienniki czatu do backendu przez",
 	"Scroll to bottom when switching between branches": "Przewiń do dołu podczas przełączania gałęzi",
 	"Search": "Szukaj",
 	"Search a model": "Wyszukaj model",
-	"Search Base": "Baza wyszukiwania",
+	"Search Base": "Użytkownicy - Baza wyszukiwania",
 	"Search Chats": "Przeszukaj czaty",
 	"Search Collection": "Przeszukaj kolekcję",
 	"Search Filters": "Filtry wyszukiwania",
 	"search for tags": "wyszukiwanie tagów",
 	"Search Functions": "Funkcje wyszukiwania",
 	"Search Knowledge": "Wyszukaj wiedzę",
-	"Search Models": "Modele wyszukiwania",
+	"Search Models": "Wyszukiwanie modeli",
 	"Search options": "Opcje wyszukiwania",
 	"Search Prompts": "Prompty wyszukiwania",
 	"Search Result Count": "Liczba wyników wyszukiwania",
@@ -867,19 +861,19 @@
 	"Searxng Query URL": "Adres URL zapytania Searxng",
 	"See readme.md for instructions": "Sprawdź readme.md dla instrukcji",
 	"See what's new": "Sprawdź nowości",
-	"Seed": "Nasiono",
+	"Seed": "Seed",
 	"Select a base model": "Wybór modelu bazowego",
 	"Select a engine": "Wybierz silnik",
 	"Select a function": "Wybierz funkcję",
 	"Select a group": "Wybierz grupę",
 	"Select a model": "Wybierz model",
 	"Select a pipeline": "Wybierz potok",
-	"Select a pipeline url": "Wybierz adres URL potoku",
+	"Select a pipeline url": "Wybierz adres URL przepływu",
 	"Select a tool": "Wybierz narzędzie",
 	"Select an auth method": "Wybierz metodę uwierzytelniania",
 	"Select an Ollama instance": "Wybierz instancję Ollama",
 	"Select Engine": "Wybierz silnik",
-	"Select Knowledge": "Wybierz Wiedzę",
+	"Select Knowledge": "Wybierz wiedzę",
 	"Select model": "Wybierz model",
 	"Select only one model to call": "Wybierz tylko jeden model do wywołania",
 	"Selected model(s) do not support image inputs": "Wybrane modele nie obsługują danych wejściowych w formie obrazu",
@@ -895,15 +889,15 @@
 	"Serply API Key": "Klucz API Serply",
 	"Serpstack API Key": "Klucz API Serpstack",
 	"Server connection verified": "Połączenie z serwerem zostało zweryfikowane",
-	"Set as default": "Ustaw jako domyślne",
+	"Set as default": "Ustaw jako domyślny",
 	"Set CFG Scale": "Ustaw skalę CFG",
 	"Set Default Model": "Ustaw model domyślny",
 	"Set embedding model": "Ustawianie modelu osadzania",
 	"Set embedding model (e.g. {{model}})": "Skonfiguruj model osadzania (np. {{model}})",
 	"Set Image Size": "Ustaw rozmiar obrazu",
 	"Set reranking model (e.g. {{model}})": "Skonfiguruj model ponownego rankingu (np. {{model}})",
-	"Set Sampler": "Próbnik Samplera",
-	"Set Scheduler": "Ustawiacz Harmonogramu",
+	"Set Sampler": "Próbnik samplera",
+	"Set Scheduler": "Ustawiacz harmonogramu",
 	"Set Steps": "Ustaw kroki",
 	"Set Task Model": "Konfiguracja modelu zadań",
 	"Set the number of layers, which will be off-loaded to GPU. Increasing this value can significantly improve performance for models that are optimized for GPU acceleration but may also consume more power and GPU resources.": "Ustaw liczbę warstw, które zostaną przeniesione na GPU. Zwiększenie tej wartości może znacząco poprawić wydajność dla modeli optymalizowanych pod kątem akceleracji GPU, ale także może zużywać więcej energii i zasobów GPU.",
@@ -923,7 +917,7 @@
 	"Share to Open WebUI Community": "Udostępnij w społeczności OpenWebUI",
 	"Show": "Wyświetl",
 	"Show \"What's New\" modal on login": "Wyświetl okno dialogowe \"What's New\" podczas logowania",
-	"Show Admin Details in Account Pending Overlay": "Wyświetl szczegóły administratora w okienku podręcznym konta",
+	"Show Admin Details in Account Pending Overlay": "Wyświetl szczegóły administratora w okienu informacyjnym o potrzebie zatwierdzenia przez administratora konta użytkownika",
 	"Show shortcuts": "Wyświetl skróty",
 	"Show your support!": "Wyraź swoje poparcie!",
 	"Showcased creativity": "Prezentacja kreatywności",
@@ -941,7 +935,7 @@
 	"Speech-to-Text Engine": "Silnik konwersji mowy na tekst",
 	"Stop": "Zatrzymaj się",
 	"Stop Sequence": "Zatrzymaj sekwencję",
-	"Stream Chat Response": "Odpowiedź na czacie strumieniowym",
+	"Stream Chat Response": "Odpowiedź czatu strumieniowego",
 	"STT Model": "Model STT",
 	"STT Settings": "Ustawienia STT",
 	"Subtitle (e.g. about the Roman Empire)": "Podtytuł (np. o Imperium Rzymskim)",
@@ -953,9 +947,9 @@
 	"Sync directory": "Sync directory",
 	"System": "System",
 	"System Instructions": "Instrukcje systemowe",
-	"System Prompt": "Prompt systemowy",
+	"System Prompt": "Podpowiedź systemowa",
 	"Tags Generation": "Generowanie tagów",
-	"Tags Generation Prompt": "Prompt generowania tagów",
+	"Tags Generation Prompt": "Podpowiedź do generowania tagów",
 	"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)": "Próbkowanie bez ogona jest używane do zmniejszenia wpływu mniej prawdopodobnych tokenów na wyjście. Wyższa wartość (np. 2,0) zmniejszy ten wpływ bardziej, podczas gdy wartość 1,0 wyłącza to ustawienie. (domyślnie: 1)",
 	"Tap to interrupt": "Kliknij, aby przerwać",
 	"Tasks": "Zadania",
@@ -967,8 +961,8 @@
 	"Text Splitter": "Rozdzielacz tekstu",
 	"Text-to-Speech Engine": "Silnik konwersji tekstu na mowę",
 	"Tfs Z": "Tfs Z",
-	"Thanks for your feedback!": "Dziękuję za Twoją opinię!",
-	"The Application Account DN you bind with for search": "Konto aplikacji DN, z którym się wiążesz w celu przeszukiwania",
+	"Thanks for your feedback!": "Dziękuję za twoją opinię!",
+	"The Application Account DN you bind with for search": "Konto techniczne w formacie DN, z którym się wiążesz w celu przeszukiwania",
 	"The base to search for users": "Podstawa do wyszukiwania użytkowników",
 	"The batch size determines how many text requests are processed together at once. A higher batch size can increase the performance and speed of the model, but it also requires more memory.  (Default: 512)": "Rozmiar partii określa, ile żądań tekstu jest przetwarzanych razem w jednym czasie. Większy rozmiar partii może zwiększyć wydajność i szybkość modelu, ale wymaga również więcej pamięci. (Domyślnie: 512)",
 	"The developers behind this plugin are passionate volunteers from the community. If you find this plugin helpful, please consider contributing to its development.": "Twórcy tego wtyczki to entuzjaści, którzy działają jako wolontariusze ze społeczności. Jeśli uważasz, że ta wtyczka jest pomocna, rozważ wsparcie jej rozwoju.",
@@ -980,7 +974,7 @@
 	"The maximum number of files that can be used at once in chat. If the number of files exceeds this limit, the files will not be uploaded.": "Maksymalna liczba plików, które można użyć jednocześnie w czacie. Jeśli liczba plików przekroczy ten limit, pliki nie zostaną przesłane.",
 	"The score should be a value between 0.0 (0%) and 1.0 (100%).": "Wynik powinien być wartością pomiędzy 0,0 (0%) a 1,0 (100%).",
 	"The temperature of the model. Increasing the temperature will make the model answer more creatively. (Default: 0.8)": "Temperatura modelu. Zwiększenie temperatury sprawi, że model będzie odpowiadał w sposób bardziej kreatywny. (Domyślnie: 0.8)",
-	"Theme": "Temat",
+	"Theme": "Motyw",
 	"Thinking...": "Myślę...",
 	"This action cannot be undone. Do you wish to continue?": "Czy na pewno chcesz kontynuować? Ta akcja nie może zostać cofnięta.",
 	"This ensures that your valuable conversations are securely saved to your backend database. Thank you!": "To gwarantuje, że Twoje wartościowe rozmowy są bezpiecznie zapisywane w bazie danych backendowej. Dziękujemy!",
@@ -1021,13 +1015,13 @@
 	"Today": "Dzisiaj",
 	"Toggle settings": "Przełącz opcje",
 	"Toggle sidebar": "Przełącz pasek boczny",
-	"Token": "Żeton",
+	"Token": "Token",
 	"Tokens To Keep On Context Refresh (num_keep)": "Tokeny do zachowania podczas odświeżania kontekstu (num_keep)",
 	"Too verbose": "Zbyt rozwlekłe",
 	"Tool created successfully": "Narzędzie utworzone pomyślnie",
 	"Tool deleted successfully": "Narzędzie zostało usunięte pomyślnie",
 	"Tool Description": "Opis narzędzia",
-	"Tool ID": "Narzędzie ID",
+	"Tool ID": "ID narzędzia",
 	"Tool imported successfully": "Narzędzie zostało pomyślnie zaimportowane",
 	"Tool Name": "Nazwa narzędzia",
 	"Tool updated successfully": "Narzędzie zaktualizowane pomyślnie",
@@ -1042,33 +1036,33 @@
 	"Transformers": "Transformery",
 	"Trouble accessing Ollama?": "Czy masz problemy z dostępem do Ollama?",
 	"TTS Model": "Model TTS",
-	"TTS Settings": "Ustawienia Syntezatora Mowy",
+	"TTS Settings": "Ustawienia syntezatora mowy",
 	"TTS Voice": "Głos TTS",
 	"Type": "Typ",
 	"Type Hugging Face Resolve (Download) URL": "Podaj adres URL do pobrania z Hugging Face",
 	"Uh-oh! There was an issue with the response.": "Ojej! Wystąpił problem z odpowiedzią.",
 	"UI": "Interfejs użytkownika",
 	"Unarchive All": "Odarchiwizuj wszystko",
-	"Unarchive All Archived Chats": "Odblokuj wszystkie ukryte rozmowy",
-	"Unarchive Chat": "Odblokuj czat",
+	"Unarchive All Archived Chats": "Odarchiwizuj wszystkie zarchiwizowane rozmowy",
+	"Unarchive Chat": "Odarchiwizuj czat",
 	"Unlock mysteries": "Rozwiązywanie zagadek",
-	"Unpin": "Odpiąć (pinę)",
+	"Unpin": "Odpiąć",
 	"Unravel secrets": "Odkryj tajemnice",
-	"Untagged": "Nieoznaczone",
+	"Untagged": "Nie otagowane",
 	"Update": "Aktualizacja",
 	"Update and Copy Link": "Aktualizuj i kopiuj link",
 	"Update for the latest features and improvements.": "Aktualizacja do najnowszych funkcji i ulepszeń.",
 	"Update password": "Zmiana hasła",
 	"Updated": "Aby zwiększyć wydajność aplikacji, należy rozważyć optymalizację kodu i użycie odpowiednich struktur danych. {optimization} [optimizations] mogą obejmować minimalizację liczby operacji we/wy, zwiększenie wydajności algorytmów oraz zmniejszenie zużycia pamięci. Ponadto, warto rozważyć użycie {caching} [pamięci podręcznej] do przechowywania często używanych danych, co może znacząco przyspieszyć działanie aplikacji. Wreszcie, monitorowanie wydajności aplikacji za pomocą narzędzi takich jak {profiling} [profilowanie] może pomóc zidentyfikować wolne miejsca i dalsze obszary do optymalizacji.",
 	"Updated at": "Aktualizacja dnia",
-	"Updated At": "Aktualizacja",
-	"Upgrade to a licensed plan for enhanced capabilities, including custom theming and branding, and dedicated support.": "Przejdź na licencjonowany plan, aby uzyskać rozszerzone możliwości, w tym niestandardowe motywy i personalizację oraz dedykowane wsparcie.",
+	"Updated At": "Czas aktualizacji",
+	"Upgrade to a licensed plan for enhanced capabilities, including custom theming and branding, and dedicated support.": "Przejdź na licencjonowany plan, aby uzyskać rozszerzone możliwości, w tym niestandardowe motywy, personalizację oraz dedykowane wsparcie.",
 	"Upload": "Prześlij",
 	"Upload a GGUF model": "Prześlij model GGUF",
 	"Upload directory": "Prześlij katalog",
 	"Upload files": "Prześlij pliki",
 	"Upload Files": "Prześlij pliki",
-	"Upload Pipeline": "Prześlij potok",
+	"Upload Pipeline": "Prześlij przepływ",
 	"Upload Progress": "Postęp przesyłania plików",
 	"URL": "Adres URL",
 	"URL Mode": "Tryb URL",
@@ -1106,9 +1100,9 @@
 	"Web API": "Interfejs API sieci web",
 	"Web Loader Settings": "Ustawienia ładowania strony",
 	"Web Search": "Wyszukiwarka internetowa",
-	"Web Search Engine": "Wyszukiwarka sieciowa",
-	"Web Search in Chat": "Wyszukiwanie w sieci Web w czacie",
-	"Web Search Query Generation": "Generowanie Zapytań Wyszukiwania Sieciowego",
+	"Web Search Engine": "Silnik wyszukiweania w sieci",
+	"Web Search in Chat": "Wyszukiwanie w sieci Web na czacie",
+	"Web Search Query Generation": "Generowanie zapytań Wyszukiwania Sieciowego",
 	"Webhook URL": "Adres URL webhooka",
 	"WebUI Settings": "Ustawienia interfejsu WebUI",
 	"WebUI URL": "Adres URL interfejsu internetowego",
@@ -1146,5 +1140,5 @@
 	"Your account status is currently pending activation.": "Twoje konto oczekuje obecnie na aktywację.",
 	"Your entire contribution will go directly to the plugin developer; Open WebUI does not take any percentage. However, the chosen funding platform might have its own fees.": "Cała Twoja wpłata trafi bezpośrednio do dewelopera wtyczki; Open WebUI nie pobiera żadnej prowizji. Należy jednak pamiętać, że wybrana platforma finansowania może mieć własne opłaty.",
 	"Youtube": "Youtube",
-	"Youtube Loader Settings": "Ustawienia ładowania z YouTube"
-}
+	"Youtube Loader Settings": "Ustawienia pobierania z YouTube"
+}

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

@@ -1,5 +1,5 @@
 {
-	"-1 for no limit, or a positive integer for a specific limit": "-1 表示无限制,正整数表示具体限制",
+	"-1 for no limit, or a positive integer for a specific limit": "-1 表示无限制,正整数表示具体限制",
 	"'s', 'm', 'h', 'd', 'w' or '-1' for no expiration.": "'s', 'm', 'h', 'd', 'w' 或 '-1' 表示无过期时间。",
 	"(e.g. `sh webui.sh --api --api-auth username_password`)": "(例如 `sh webui.sh --api --api-auth username_password`)",
 	"(e.g. `sh webui.sh --api`)": "(例如 `sh webui.sh --api`)",
@@ -63,7 +63,7 @@
 	"Allow Voice Interruption in Call": "允许通话中的打断语音",
 	"Allowed Endpoints": "允许的端点",
 	"Already have an account?": "已经拥有账号了?",
-	"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时,概率低于0.045的logits会被排除。(默认值:0.0)",
+	"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时,概率低于0.045的logits会被排除。(默认值:0.0)",
 	"Always": "保持",
 	"Amazing": "很棒",
 	"an assistant": "一个助手",
@@ -380,7 +380,7 @@
 	"Enter Image Size (e.g. 512x512)": "输入图像分辨率 (例如:512x512)",
 	"Enter Jina API Key": "输入 Jina API 密钥",
 	"Enter Jupyter Password": "输入 Jupyter 密码",
-	"Enter Jupyter Token": "输入 Jupyter Token",
+	"Enter Jupyter Token": "输入 Jupyter 令牌",
 	"Enter Jupyter URL": "输入 Jupyter URL",
 	"Enter Kagi Search API Key": "输入 Kagi Search API 密钥",
 	"Enter language codes": "输入语言代码",
@@ -629,7 +629,7 @@
 	"Manage OpenAI API Connections": "管理OpenAI API连接",
 	"Manage Pipelines": "管理 Pipeline",
 	"March": "三月",
-	"Max Tokens (num_predict)": "最多 Token (num_predict)",
+	"Max Tokens (num_predict)": "最大Token数量 (num_predict)",
 	"Max Upload Count": "最大上传数量",
 	"Max Upload Size": "最大上传大小",
 	"Maximum of 3 models can be downloaded simultaneously. Please try again later.": "最多可以同时下载 3 个模型,请稍后重试。",
@@ -910,14 +910,14 @@
 	"Set the number of worker threads used for computation. This option controls how many threads are used to process incoming requests concurrently. Increasing this value can improve performance under high concurrency workloads but may also consume more CPU resources.": "设置用于计算的工作线程数量。该选项可控制并发处理传入请求的线程数量。增加该值可以提高高并发工作负载下的性能,但也可能消耗更多的 CPU 资源。",
 	"Set Voice": "设置音色",
 	"Set whisper model": "设置 whisper 模型",
-	"Sets a flat bias against tokens that have appeared at least once. A higher value (e.g., 1.5) will penalize repetitions more strongly, while a lower value (e.g., 0.9) will be more lenient. At 0, it is disabled. (Default: 0)": "这个设置项用于调整对重复 tokens 的抑制强度。当某个 token 至少出现过一次后,系统会通过 flat bias 参数施加惩罚力度:数值越大(如 1.5),抑制重复的效果越强烈;数值较小(如 0.9)则相对宽容。当设为 0 时,系统会完全关闭这个重复抑制功能(默认值为 0)。",
-	"Sets a scaling bias against tokens to penalize repetitions, based on how many times they have appeared. A higher value (e.g., 1.5) will penalize repetitions more strongly, while a lower value (e.g., 0.9) will be more lenient. At 0, it is disabled. (Default: 1.1)": "这个参数用于通过 scaling bias 机制抑制重复内容:当某些 tokens 重复出现时,系统会根据它们已出现的次数自动施加惩罚。数值越大(如 1.5)惩罚力度越强,能更有效减少重复;数值较小(如 0.9)则允许更多重复。当设为 0 时完全关闭该功能,默认值设置为 1.1 保持适度抑制。",
+	"Sets a flat bias against tokens that have appeared at least once. A higher value (e.g., 1.5) will penalize repetitions more strongly, while a lower value (e.g., 0.9) will be more lenient. At 0, it is disabled. (Default: 0)": "这个设置项用于调整对重复 Token 的抑制强度。当某个 Token 至少出现过一次后,系统会通过 flat bias 参数施加惩罚力度:数值越大(如 1.5),抑制重复的效果越强烈;数值较小(如 0.9)则相对宽容。当设为 0 时,系统会完全关闭这个重复抑制功能(默认值为 0)。",
+	"Sets a scaling bias against tokens to penalize repetitions, based on how many times they have appeared. A higher value (e.g., 1.5) will penalize repetitions more strongly, while a lower value (e.g., 0.9) will be more lenient. At 0, it is disabled. (Default: 1.1)": "这个参数用于通过 scaling bias 机制抑制重复内容:当某些 Token 重复出现时,系统会根据它们已出现的次数自动施加惩罚。数值越大(如 1.5)惩罚力度越强,能更有效减少重复;数值较小(如 0.9)则允许更多重复。当设为 0 时完全关闭该功能,默认值设置为 1.1 保持适度抑制。",
 	"Sets how far back for the model to look back to prevent repetition. (Default: 64, 0 = disabled, -1 = num_ctx)": "设置模型回溯多远以防止重复。(默认值:64,0 = 禁用,-1 = num_ctx)",
 	"Sets the random number seed to use for generation. Setting this to a specific number will make the model generate the same text for the same prompt. (Default: random)": "设置 random number seed 可以控制模型生成文本的随机起点。如果指定一个具体数字,当输入相同的提示语时,模型每次都会生成完全相同的文本内容(默认是随机选取 seed)。",
 	"Sets the size of the context window used to generate the next token. (Default: 2048)": "设置用于生成下一个 Token 的上下文大小。(默认值:2048)",
 	"Sets the stop sequences to use. When this pattern is encountered, the LLM will stop generating text and return. Multiple stop patterns may be set by specifying multiple separate stop parameters in a modelfile.": "设置要使用的停止序列。遇到这种模式时,大语言模型将停止生成文本并返回。可以通过在模型文件中指定多个单独的停止参数来设置多个停止模式。",
 	"Settings": "设置",
-	"Settings saved successfully!": "设置已保存",
+	"Settings saved successfully!": "设置已成功保存!",
 	"Share": "分享",
 	"Share Chat": "分享对话",
 	"Share to Open WebUI Community": "分享到 OpenWebUI 社区",
@@ -956,7 +956,7 @@
 	"System Prompt": "系统提示词 (System 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)": "Tail free sampling 用于减少输出中可能性较低的标记的影响。数值越大(如 2.0),影响就越小,而数值为 1.0 则会禁用此设置。(默认值:1)",
+	"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)": "Tail free sampling 用于减少输出中可能性较低的Token的影响。数值越大(如 2.0),影响就越小,而数值为 1.0 则会禁用此设置。(默认值:1)",
 	"Tap to interrupt": "点击以中断",
 	"Tasks": "任务",
 	"Tavily API Key": "Tavily API 密钥",
@@ -985,7 +985,7 @@
 	"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)": "该选项控制刷新上下文时保留多少标记。例如,如果设置为 2,就会保留对话上下文的最后 2 个标记。保留上下文有助于保持对话的连续性,但可能会降低回复新话题的能力。(默认值:24)",
+	"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)": "该选项控制刷新上下文时保留多少Token。例如,如果设置为 2,就会保留对话上下文的最后 2 个Token。保留上下文有助于保持对话的连续性,但可能会降低回复新话题的能力。(默认值: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)": "此选项设置了模型在回答中可以生成的最大 Token 数。增加这个限制可以让模型提供更长的答案,但也可能增加生成无用或不相关内容的可能性。  (默认值:128)",
 	"This option will delete all existing files in the collection and replace them with newly uploaded files.": "此选项将会删除文件集中所有文件,并用新上传的文件替换。",
 	"This response was generated by \"{{model}}\"": "此回复由 \"{{model}}\" 生成",
@@ -995,8 +995,8 @@
 	"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}}": "已推理 持续 {{DURATION}}",
-	"Thought for {{DURATION}} seconds": "已推理 持续 {{DURATION}} 秒",
+	"Thought for {{DURATION}}": "思考用时 {{DURATION}}",
+	"Thought for {{DURATION}} seconds": "思考用时 {{DURATION}} 秒",
 	"Tika": "Tika",
 	"Tika Server URL required.": "请输入 Tika 服务器地址。",
 	"Tiktoken": "Tiktoken",
@@ -1007,7 +1007,7 @@
 	"Title cannot be an empty string.": "标题不能为空。",
 	"Title Generation": "标题生成",
 	"Title Generation Prompt": "用于自动生成标题的提示词",
-	"TLS": "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.": "请联系管理员以访问。管理员可以在后台管理面板中管理用户状态。",
@@ -1022,7 +1022,7 @@
 	"Toggle settings": "切换设置",
 	"Toggle sidebar": "切换侧边栏",
 	"Token": "Token",
-	"Tokens To Keep On Context Refresh (num_keep)": "在语境刷新时需保留的 Tokens",
+	"Tokens To Keep On Context Refresh (num_keep)": "在语境刷新时需保留的 Token 数量",
 	"Too verbose": "过于冗长",
 	"Tool created successfully": "工具创建成功",
 	"Tool deleted successfully": "工具删除成功",

+ 10 - 2
src/routes/(app)/workspace/models/create/+page.svelte

@@ -62,9 +62,17 @@
 				!['https://openwebui.com', 'https://www.openwebui.com', 'http://localhost:5173'].includes(
 					event.origin
 				)
-			)
+			) {
 				return;
-			model = JSON.parse(event.data);
+			}
+
+			let data = JSON.parse(event.data);
+
+			if (data?.info) {
+				data = data.info;
+			}
+
+			model = data;
 		});
 
 		if (window.opener ?? false) {