Merge branch 'open-webui:dev' into dev

This commit is contained in:
Kevin Rohn 2026-03-29 20:35:57 +02:00 • committed by GitHub
commit 330ef68b0f
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
117 changed files with 7406 additions and 641 deletions

View file

@ -40,10 +40,7 @@ jobs:
- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install black
pip install "ruff>=0.15.5"
- name: Format backend
run: npm run format:backend
- name: Check for changes after format
run: git diff --exit-code
- name: Ruff format check
run: ruff format --check . --exclude .venv --exclude venv

View file

@ -1,49 +0,0 @@
name: Ruff
on:
push:
branches:
- main
- dev
paths:
- 'backend/**'
- 'pyproject.toml'
pull_request:
branches:
- main
- dev
paths:
- 'backend/**'
- 'pyproject.toml'
jobs:
ruff:
name: 'Lint & Format Backend'
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Get changed Python files
id: changed
run: |
if [ "${{ github.event_name }}" = "pull_request" ]; then
BASE=${{ github.event.pull_request.base.sha }}
else
BASE=${{ github.event.before }}
fi
FILES=$(git diff --name-only --diff-filter=ACMR "$BASE" HEAD -- 'backend/**.py' | xargs)
echo "files=$FILES" >> "$GITHUB_OUTPUT"
- name: Ruff check
if: steps.changed.outputs.files != ''
uses: astral-sh/ruff-action@v3
with:
args: check ${{ steps.changed.outputs.files }}
- name: Ruff format
if: steps.changed.outputs.files != ''
uses: astral-sh/ruff-action@v3
with:
args: format --check ${{ steps.changed.outputs.files }}

View file

@ -5,6 +5,168 @@ All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
## [0.8.12] - 2026-03-26
### Added
- 🌐 **Translation updates.** Translations for Simplified Chinese, Catalan, Portuguese (Brazil), Finnish, and Lithuanian were enhanced and expanded.
### Fixed
- 🔒 **Terminal server connection security.** Terminal server verification and policy saving now proxy through the backend, preventing API key exposure and CORS errors when connecting to in-cluster services. [Commit](https://github.com/open-webui/open-webui/commit/a6413257079a52fa4487eda36543f3955d0fbd53), [Commit](https://github.com/open-webui/open-webui/commit/4567cdc0d9cb7b42b6eba7b676c0ced3f4850d31)
- 🛠️ **Terminal tools exception handling.** Exceptions in middleware.py due to invalid return values from get_terminal_tools() have been resolved. [Commit](https://github.com/open-webui/open-webui/commit/52a06bd48aff34fb2211aac2879f0cd028129267)
- 📦 **Missing beautifulsoup4 dependency.** Users can now start Open WebUI using uvx without encountering the "bs4 module missing" error. [Commit](https://github.com/open-webui/open-webui/commit/1994d65306bbcc7406584e1bfef82f5d353fc91c)
- 🔌 **API files list error.** The /api/v1/files/ endpoint no longer returns a 500 error, fixing a regression that prevented file listing via the API. [Commit](https://github.com/open-webui/open-webui/commit/11f52921dc21c2dc61c03f12bcdf6f19140a350c)
- 📜 **License data loading.** License data now loads correctly, displaying the expected color and logo in the interface. [Commit](https://github.com/open-webui/open-webui/commit/16335f866ea4cedf00c4971963622fcc1fe02d82)
- 👑 **Admin model visibility.** Administrators can now see models even when no access control is configured yet, allowing them to manage all available models. [Commit](https://github.com/open-webui/open-webui/commit/f3f8f9874f55282603c2650b91801640cb3f69cb)
- 📊 **Tool call embed visibility.** Rich UI embeds from tool calls (like visualizations) are now rendered outside collapsed groups and remain visible without requiring manual expansion. [Commit](https://github.com/open-webui/open-webui/commit/4c872a8d128757d4a6f311fb86bc382af2ba5d0d), [Commit](https://github.com/open-webui/open-webui/commit/308fa924a5b2b7e08cd1e8f15b9c8c96e1de8f02)
## [0.8.11] - 2026-03-25
### Added
- 🔀 **Responses API streaming improvements.** The OpenAI proxy now properly handles tool call streaming and re-invocations in the Responses API, preventing duplicate tool calls and preserving output during model re-invocations. [Commit](https://github.com/open-webui/open-webui/commit/93415a48e8893139db13d02d0a6d24e8604a2ac5), [Commit](https://github.com/open-webui/open-webui/commit/f8b3a32caf00dad76687fd8fe698b86f304f3997), [Commit](https://github.com/open-webui/open-webui/commit/2ae47cf20057e92a83fd618b938f3ee9bb124e5b), [Commit](https://github.com/open-webui/open-webui/commit/adcbba34f8bbfbab3e4041269a084f2b71c076d9)
- 🔀 **Responses API stateful sessions.** Administrators can now enable experimental stateful session support via the ENABLE_RESPONSES_API_STATEFUL environment variable, allowing compatible backends to store responses server-side with previous_response_id anchoring for improved multi-turn conversations. [Commit](https://github.com/open-webui/open-webui/commit/dfc2dc2c0bd298cb4bfcf212ef11223586aa54f1)
- 📄 **File viewing pagination.** The view_file and view_knowledge_file tools now support pagination with offset and max_chars parameters, allowing models to read large files in chunks. [Commit](https://github.com/open-webui/open-webui/commit/5d7766e1b6f7ca7749c5a5a780d7b1bb2da28a2f)
- 🗺️ **Knowledge search scoping.** The search_knowledge_files tool now respects model-attached knowledge, searching only within attached knowledge bases and files when available. [Commit](https://github.com/open-webui/open-webui/commit/0f0ba7dadd043460d205477fd3b57556aa970847)
- 🛠️ **Tool HTML embed context.** Tools can now return custom context alongside HTML embeds by using a tuple format, providing the LLM with actionable information instead of a generic message. [#22691](https://github.com/open-webui/open-webui/pull/22691)
- 🔒 **Trusted role header configuration.** Administrators can now configure the WEBUI_AUTH_TRUSTED_ROLE_HEADER environment variable to set user roles (admin, user, or pending) via a trusted header from their identity provider or reverse proxy. [#22523](https://github.com/open-webui/open-webui/pull/22523)
- 🔑 **OIDC authorization parameter injection.** Administrators can now inject extra parameters into the OIDC authorization redirect URL via the OAUTH_AUTHORIZE_PARAMS environment variable, enabling IdP pre-selection for brokers like CILogon and Keycloak. [#22863](https://github.com/open-webui/open-webui/issues/22863), [Commit](https://github.com/open-webui/open-webui/commit/69171a4c8bb7f995461b4a2feef194f112b32004)
- 🔑 **Google OAuth session persistence.** Administrators can now configure Google OAuth to issue refresh tokens via the GOOGLE_OAUTH_AUTHORIZE_PARAMS environment variable, preventing OAuth sessions from expiring after one hour and ensuring tools and integrations that rely on OAuth tokens remain functional. [#22652](https://github.com/open-webui/open-webui/pull/22652)
- 🔌 **Embed prompt confirmation.** Interactive tool embeds can now submit prompts to the chat without requiring same-origin access, showing a confirmation dialog for cross-origin requests to prevent abuse. [#22908](https://github.com/open-webui/open-webui/pull/22908)
- 🏮 **Tool binary response handling.** Tool servers can now return binary data such as images, which are properly processed and displayed in chat for both multimodal and non-multimodal models. [Commit](https://github.com/open-webui/open-webui/commit/1c25b06dca83ad491b4dc3d373b1c215a7a8fd3e), [Commit](https://github.com/open-webui/open-webui/commit/108a019cb8e63a533250abe84f2b6f2b7c2131c4)
- ⚡ **Svelte upgrade performance.** Page and markdown rendering are now approximately 25% faster across the board, with significantly less memory usage for smoother UI interactions. [#22611](https://github.com/open-webui/open-webui/issues/22611)
- 🧩 **Model and filter lookup optimization.** Model and filter membership lookups are now faster thanks to optimized data structure operations during model list loading. [Commit](https://github.com/open-webui/open-webui/commit/7eae377c01f8d2de94a694b72279f769c82658cd)
- 💨 **Chat render throttling.** Chat message rendering now uses requestAnimationFrame batching to stay smooth during rapid model responses, preventing dropped frames when fast models send many events per second. [#22947](https://github.com/open-webui/open-webui/pull/22947)
- 🚀 **Function list API optimization.** The functions list API now returns only essential metadata without function source code, reducing payload sizes by over 99% and making the Functions admin page load significantly faster. [#22788](https://github.com/open-webui/open-webui/pull/22788)
- ✨ **Smoother loading animation.** The loading shimmer animation now looks smoother and more natural, with softer highlight colors. [#22516](https://github.com/open-webui/open-webui/pull/22516)
- 🧪 **Terminal connection verification.** Users can now verify their terminal server connection is working before saving the configuration, making setup more reliable. [#22567](https://github.com/open-webui/open-webui/pull/22567)
- 📁 **Chat folder emoji reset.** Users can now reset chat folder emojis back to the default icon using a "Reset to Default" button in the emoji picker, making it easier to revert custom icons. [#22554](https://github.com/open-webui/open-webui/pull/22554)
- 📊 **Metrics export interval configuration.** Administrators can now control OpenTelemetry metrics export frequency via the OTEL_METRICS_EXPORT_INTERVAL_MILLIS environment variable, enabling cost optimization for metrics services like Grafana Cloud. [#22529](https://github.com/open-webui/open-webui/pull/22529)
- 🏥 **Readiness probe endpoint.** A new /ready endpoint is now available for Kubernetes deployments, returning 200 only after startup completes and database/Redis are reachable, enabling more reliable container orchestration. [#22507](https://github.com/open-webui/open-webui/pull/22507)
- 🔩 **Tool server timeout configuration.** Administrators can now configure a separate HTTP timeout for tool server requests via the AIOHTTP_CLIENT_TIMEOUT_TOOL_SERVER environment variable, enabling fine-tuned control over how long tool calls are allowed to take. [Commit](https://github.com/open-webui/open-webui/commit/a3238aa79f344765f5b62cb64eba71ffd001abaf)
- 📌 **Knowledge file previews.** Knowledge base files can now be opened in a new tab directly from the file list, making it easier to view content without downloading. [#22629](https://github.com/open-webui/open-webui/pull/22629)
- 🎯 **Knowledge tool hybrid search support.** The built-in query_knowledge_files tool now respects hybrid search and reranking settings, matching the behavior of the middleware RAG pipeline. [Commit](https://github.com/open-webui/open-webui/commit/9a2c60d5954ecbc172d09e9955d52a07d135dcbc)
- 🗣️ **Temporary chat folder support.** Temporary chats can now use folder-level system prompts and knowledge files, making them more powerful for quick explorations. [Commit](https://github.com/open-webui/open-webui/commit/adcc50d3370301afd5561e0f58ff6f3ab3750818)
- 📡 **Terminal port previews.** Detected ports in the File Navigator can now be previewed inline with a browser-style view, navigation controls, and an address bar, instead of only opening in a new tab. [Commit](https://github.com/open-webui/open-webui/commit/689061822173e561a153290b2bb816f4cb6f4959), [Commit](https://github.com/open-webui/open-webui/commit/1dc647f43b1929f5c4d1af393a90a47f56cb745e)
- ✏️ **File renaming.** Files and folders in the File Navigator can now be renamed by double-clicking or using the context menu, with Enter to confirm and Escape to cancel. [Commit](https://github.com/open-webui/open-webui/commit/637cd136c2271baf4787815bc8bc25241626a943)
- 🧭 **File Navigator navigation history.** The File Navigator toolbar now includes Back and Forward buttons for navigating through folder and file history, similar to a web browser. [Commit](https://github.com/open-webui/open-webui/commit/3a4b862e818c69fff6f3a3c67b50c51aa00c03e9)
- 🗑️ **Delete connection confirmations.** Users are now prompted with a confirmation dialog before deleting connections, preventing accidental deletions. [Commit](https://github.com/open-webui/open-webui/commit/157ff57c40bc40c53bc608828dac3779e95c2ffa)
- 📦 **Document loader fallbacks.** Excel and PowerPoint files can now be processed even when the unstructured package is not installed, using pandas and python-pptx as fallback loaders. [Commit](https://github.com/open-webui/open-webui/commit/6862d618ee17f95d3cae78819ed993e7fbc7e632)
- 🧠 **Memory management search and sort.** Users can now search and sort their personal memories in the Memory management modal, making it easier to find specific memories. [Commit](https://github.com/open-webui/open-webui/commit/47ab4c71d50fd631b04c95f2febb085dd0a13083)
- 📦 **SBOM generation script.** A new script for generating CycloneDX Software Bill of Materials is now available in the scripts directory. [Commit](https://github.com/open-webui/open-webui/commit/39100eca4915e4fe86a6912aa97dde86ed72e015)
- ⚙️ **Ruff linter and formatter.** Added Ruff as the Python linter and formatter, replacing the black-based workflow for better code quality with near-instant execution. [#22576](https://github.com/open-webui/open-webui/pull/22576), [#22462](https://github.com/open-webui/open-webui/discussions/22462)
- 🖥️ **Offline code formatting support.** The black formatter for Python code editing is now bundled locally in the Docker image, enabling code formatting to work in air-gapped deployments where client browsers cannot reach PyPI. Formatting failures no longer block saves, allowing code to be preserved even when offline. [#22509](https://github.com/open-webui/open-webui/issues/22509), [Commit](https://github.com/open-webui/open-webui/commit/8507e5eb0d18896f1bbf990a00a4361aec171a30)
- ✏️ **Markdown file editing.** Users can now edit and save Markdown files directly in the file navigator, with empty files automatically switching to editor mode for immediate editing. [Commit](https://github.com/open-webui/open-webui/commit/47e47e42af682e7f75c8359999f7cdf969bf903e)
- 🍔 **Model bulk actions menu.** Users can now quickly enable, disable, show, or hide multiple models at once using a new hamburger menu on the workspace Models page filter bar, with actions respecting the current search and filter settings. [#22484](https://github.com/open-webui/open-webui/pull/22484)
- 📂 **Files list pagination.** The files list API now supports pagination, returning paginated results with a total count for easier navigation through large file collections. [Commit](https://github.com/open-webui/open-webui/commit/f9756de693a93e918c037d757afddb7defc847e4)
- 🖇 **Web fetch content length config.** Administrators can now configure the maximum characters to return from fetched URLs via WEB_FETCH_MAX_CONTENT_LENGTH environment variable or the admin settings page, instead of the previous hardcoded 50K limit. [Commit](https://github.com/open-webui/open-webui/commit/b171b0216b916745420c7caf513093a315ed9560), [#22774](https://github.com/open-webui/open-webui/issues/22774)
- 🤖 **Ollama Anthropic endpoint support.** The Ollama proxy now supports the Anthropic-compatible /v1/messages endpoint, allowing clients using the Anthropic API format to work through Open WebUI with proper authentication and model access controls. [Commit](https://github.com/open-webui/open-webui/commit/f23296b22d3304e5bfcd19151e5802eec55bd98f), [#22861](https://github.com/open-webui/open-webui/issues/22861)
- 📝 **Writing block rendering.** Responses from OpenAI models that include :::writing blocks are now rendered as formatted content in a styled container with a copy button, instead of displaying raw marker text. [#22672](https://github.com/open-webui/open-webui/issues/22672), [Commit](https://github.com/open-webui/open-webui/commit/53b8a1f71bd0cb0a0122175ad5210da492018728)
- 💡 **Memory deletion confirmation.** Users are now asked to confirm before deleting individual memory entries, with the memory content displayed for review. [#22888](https://github.com/open-webui/open-webui/pull/22888)
- 📓 **Multi-artifact HTML rendering.** Code blocks with multiple HTML sections now render as separate artifacts instead of merging into one, allowing models to display distinct interactive components. [Commit](https://github.com/open-webui/open-webui/commit/9a6bf78e14a13864e72db87426da4f5996abe716)
- 🚩 **Drag chats as references.** Users can now drag chats from the sidebar and drop them into the message input to add them as Reference Chats. [Commit](https://github.com/open-webui/open-webui/commit/ebb7ce2092efc8d78da4974623647dbd18b6e372)
- ⌨️ **Terminal system prompts.** Terminal servers can now provide custom system prompts that are automatically included when their tools are used. [Commit](https://github.com/open-webui/open-webui/commit/6a9d67b5bb4c93fd343b334bee3e37703dff59f6)
- 💾 **Terminal state persistence.** The selected terminal server and its enabled state now persist across page loads, making terminal usage more seamless. [Commit](https://github.com/open-webui/open-webui/commit/d577ff1e4af750dda09e558dac7edb8dd2470850)
- 💾 **Terminal folder downloads.** Users can now download folders as ZIP archives and bulk-download multiple selected files as a single ZIP directly from the File Navigator toolbar, making file exports faster and more convenient. [Commit](https://github.com/open-webui/open-webui/commit/3841e85abb3ea3e8d8b364dff0102f0124844d22), [Commit](https://github.com/open-webui/open-webui/commit/cf60b1882f1929200649b59f867289dea54e4210)
- 🔐 **MCP OAuth 2.1 static credentials.** MCP servers that require static client_id and client_secret can now be connected using a new OAuth 2.1 Static auth type, enabling integration with MCP servers that don't support dynamic client registration. [#22266](https://github.com/open-webui/open-webui/pull/22266), [Commit](https://github.com/open-webui/open-webui/commit/601bb783587a3e965cf88c148e4856b988655b13)
- 🎪 **Collapsible tool and thinking groups.** Consecutive tool calls and reasoning blocks are now grouped into a single collapsible summary (e.g., "Explored tool1, tool2"), keeping chat responses clean and readable while preserving full detail on expand. [#21604](https://github.com/open-webui/open-webui/issues/21604), [Commit](https://github.com/open-webui/open-webui/commit/261aec8c864646eb7215be0d5c14a79cad3cb93f)
- 🔄 **General improvements.** Various improvements were implemented across the application to enhance performance, stability, and security.
- 🌐 Translations for Finnish, Portuguese (Portugal), Catalan, Turkish, Japanese, Simplified Chinese, Traditional Chinese, Estonian, Spanish, Azerbaijani, and German were enhanced and expanded.
### Fixed
- 🔒 **Model access control bypass.** Fixed a security vulnerability where external clients could bypass model access controls by setting a URL parameter, preventing unauthorized access to restricted models. [Commit](https://github.com/open-webui/open-webui/commit/c0385f60ba049da48d2d5452068586d375303c37)
- 🛡️ **Terminal proxy path sanitization.** The terminal server proxy now properly sanitizes paths to prevent directory traversal and SSRF attacks, protecting against security vulnerabilities. [Commit](https://github.com/open-webui/open-webui/commit/f9d38a073fae32032ed44073cf2817cba20210bb)
- 🛡️ **Tool configuration access control.** Tool configuration endpoints now properly verify user permissions, preventing unauthorized access to tool settings. [Commit](https://github.com/open-webui/open-webui/commit/bc5b3ec6b8ec0fef894eb8046c636ee33688b8c4)
- 🗝️ **Tool valves access control.** The tool user valves endpoints now properly verify ownership and access grants before returning or updating configuration, with appropriate 404 responses for missing tools and 401 for unauthorized access. [Commit](https://github.com/open-webui/open-webui/commit/f949d17db1e62e0b79aecbbcbcabe3d57d8d4af6)
- 🔐 **Collaborative document authorization.** Fixed a security vulnerability in collaborative documents where authorization could be bypassed using alternative document ID formats, preventing unauthorized access to notes. [Commit](https://github.com/open-webui/open-webui/commit/3107a5363d13c899a995c930cbb1121a80f754f9)
- 🔏 **OAuth session persistence.** Users logging in via OAuth or OIDC providers now stay logged in for the configured JWT expiry duration instead of being logged out when closing the browser. [#22809](https://github.com/open-webui/open-webui/pull/22809)
- 🚪 **OAuth sub claim configuration crash.** Using the OAUTH_SUB_CLAIM environment variable no longer causes crashes during token exchange requests, fixing a missing configuration registration. [#22865](https://github.com/open-webui/open-webui/pull/22865)
- 🔍 **OAuth discovery header parsing.** The OAuth protected resource discovery now correctly handles both quoted and unquoted values in the WWW-Authenticate header, fixing compatibility with MCP servers that return unquoted metadata. [#22646](https://github.com/open-webui/open-webui/discussions/22646), [Commit](https://github.com/open-webui/open-webui/commit/fe7e002fea7283abcf901e22de5c8a7d86e336ea)
- 👤 **Admin OAuth group sync.** Admin user group memberships from OAuth and LDAP providers are now properly synced to Open WebUI, fixing a limitation where admin role excluded users from group updates. [#22537](https://github.com/open-webui/open-webui/pull/22537), [Commit](https://github.com/open-webui/open-webui/commit/a1aceb5f879abd130ef83085d98a0d51316a8fc3)
- 🎫 **Password change complexity validation.** Password complexity rules are now properly enforced when users change their password, closing a security gap where new passwords could bypass configured complexity requirements. [Commit](https://github.com/open-webui/open-webui/commit/bd8aa3b6a0b6a2320f41b20a51b9842f39aadb7f)
- 🔏 **OAuth role enforcement.** OAuth role management now properly denies access when a user's roles don't match any configured OAUTH_ALLOWED_ROLES or OAUTH_ADMIN_ROLES, instead of silently bypassing the restriction. [#13676](https://github.com/open-webui/open-webui/issues/13676), [#15551](https://github.com/open-webui/open-webui/issues/15551), [Commit](https://github.com/open-webui/open-webui/commit/6d7744c21903ec5a9ad951770dea76e9ba19cbcc)
- 🔑 **Microsoft Entra ID role claim preservation.** Role claims from Microsoft Entra ID tokens are now preserved during OAuth login, fixing ENABLE_OAUTH_ROLE_MANAGEMENT for Microsoft OAuth which was previously ignored because the userinfo endpoint stripped the roles claim. [#20518](https://github.com/open-webui/open-webui/issues/20518), [Commit](https://github.com/open-webui/open-webui/commit/aa2f7fbe5229c3985ce427602069cdeababda481)
- 🔍 **SCIM group filtering.** The SCIM endpoint now properly handles displayName and externalId filters when provisioning groups from identity providers like Microsoft Entra ID, preventing all groups from being returned instead of the filtered subset. [#21543](https://github.com/open-webui/open-webui/pull/21543)
- 🔐 **Forwarded allow IPs configuration.** The FORWARDED_ALLOW_IPS environment variable is now properly respected by the startup scripts instead of being hardcoded to '\*', allowing administrators to restrict which proxies are trusted for request forwarding. [#22539](https://github.com/open-webui/open-webui/issues/22539), [Commit](https://github.com/open-webui/open-webui/commit/0aebdd5f83cd1d811009edcbb2bec432a34e7c81)
- 🍪 **Model list auth cookie forwarding.** Model list requests to backends that require cookie-based authentication now properly forward auth headers and cookies, preventing "Unauthorized" errors when loading models. [Commit](https://github.com/open-webui/open-webui/commit/76ece4049e96bd6890593f17a946a9af6b082fab)
- 🔱 **Model lookup race condition.** Fixed a race condition in Redis model storage that caused intermittent "model not found" errors in multi-replica deployments under heavy load, by eliminating the window between hash deletion and updates. [Commit](https://github.com/open-webui/open-webui/commit/ee901fcd2ca82d7a7dad48170c64df782d3e040a)
- 🎚️ **Bulk model action reliability.** Bulk enable, disable, show, and hide operations in the admin Models settings now properly refresh the model list after completion, ensuring changes are reflected immediately and correct toast notifications are shown. [#22962](https://github.com/open-webui/open-webui/pull/22962), [Commit](https://github.com/open-webui/open-webui/commit/75932be880f3b86f78f00b4352b9f1350b8f53fa), [Commit](https://github.com/open-webui/open-webui/commit/15ae3f588b1aa4ddb686ae68afebd6064036a201)
- 🔄 **Paginated list duplicates.** Fixed duplicate items appearing in paginated lists when loading more items in chats, knowledge, notes, and search across the UI. [Commit](https://github.com/open-webui/open-webui/commit/58e78e8946fb3644107489fe8e01b17709302b2f)
- 🧽 **Duplicate chat list refresh.** Sending messages no longer triggers duplicate sidebar chat list refreshes, eliminating an unnecessary database query that was already handled by the save and completion handlers. [#22982](https://github.com/open-webui/open-webui/pull/22982)
- 🧹 **Chat history save optimization.** The chat list is no longer refreshed on every chat history save, branch navigation, or edit — only on meaningful state changes like new chat creation, title generation, and response completion. [#22983](https://github.com/open-webui/open-webui/pull/22983)
- 💬 **Message queue responsiveness.** The message queue no longer waits for background tasks like title generation and follow-up suggestions to complete, allowing users to send new messages immediately after a response finishes without unnecessary delays. [Commit](https://github.com/open-webui/open-webui/commit/486c004cbb43f15d5c3e31561f51f22effff1f6c), [#22565](https://github.com/open-webui/open-webui/issues/22565)
- 🗄️ **Migration reliability.** Database migrations no longer fail when chat data has unexpected format, making upgrades more reliable. [#22588](https://github.com/open-webui/open-webui/pull/22588), [#22568](https://github.com/open-webui/open-webui/issues/22568)
- 🫧 **Memory modal event bubbling.** Fixed an issue where clicking the Delete button in the Memory management modal would also open the Edit Memory modal due to event bubbling. [#22783](https://github.com/open-webui/open-webui/issues/22783)
- 🧩 **Memory tool registration.** Models with capabilities.memory: true now correctly have memory tools available for execution, fixing a retry loop where add_memory appeared in the tool schema but was not registered for backend execution. [#22666](https://github.com/open-webui/open-webui/issues/22666), [#22675](https://github.com/open-webui/open-webui/pull/22675), [Commit](https://github.com/open-webui/open-webui/commit/d9339919046c3e977f313f603782d220aab4257f)
- 📝 **Input variables modal crash.** Fixed a crash that occurred when selecting custom prompts with prompt variables, causing the Input Variables modal to display an infinite loading spinner instead of the variable input fields. [#22748](https://github.com/open-webui/open-webui/issues/22748), [Commit](https://github.com/open-webui/open-webui/commit/0dcd6ac983bede06b8477179192154467f5b24a2)
- 🪛 **Function list API crash fix.** Fixed a 500 error on the functions list API endpoint that was introduced by the recent optimization, by adding proper model configuration for SQLAlchemy ORM objects. [#22924](https://github.com/open-webui/open-webui/pull/22924)
- 🗂️ **Sidebar chat menu closure.** Sidebar chat dropdown menus now close properly after clicking "Clone", "Share", "Download", "Rename", "Pin", "Move", "Archive", or "Delete", instead of remaining visible. [#22884](https://github.com/open-webui/open-webui/pull/22884), [#22784](https://github.com/open-webui/open-webui/issues/22784)
- 🧭 **Chat deletion and archive redirection.** Users are now redirected to the chat list when deleting or archiving the currently active chat, instead of being left on a stale chat page. [#22755](https://github.com/open-webui/open-webui/pull/22755)
- 🚩 **User menu navigation fix.** Clicking Playground or Admin Panel from the user menu now uses client-side routing instead of causing full page reloads, restoring smooth SPA navigation. [Commit](https://github.com/open-webui/open-webui/commit/7ffcd3908ee90f88a4c4684d6cd6e75efd117461)
- 🔧 **Tool server connection persistence.** Fixed a bug where tool server connection updates were not being saved to persistent storage, ensuring OAuth client information is now properly preserved. [Commit](https://github.com/open-webui/open-webui/commit/b8ea267f8ec3931de55db7801156b9c07d3ad5f6)
- 🔩 **Tool server index bounds checking.** Tool servers with invalid indices no longer crash the application with IndexError after upgrades, preventing tool server configuration loss. [#22490](https://github.com/open-webui/open-webui/issues/22490), [Commit](https://github.com/open-webui/open-webui/commit/8da29566a1f81c38e80009bdea3ce4d9be860605)
- 🔌 **Tool server frontend timeout.** Fetch requests to external tool servers now time out after 10 seconds, preventing the UI from hanging indefinitely when a configured tool server is unreachable. [#22543](https://github.com/open-webui/open-webui/issues/22543), [Commit](https://github.com/open-webui/open-webui/commit/adf7af34ff934319a35470c572237d2d08f1de0b)
- 🔌 **MCP OAuth tool auto-selection.** MCP tools requiring OAuth authentication are now automatically re-selected after completing the auth flow, instead of leaving users to manually re-enable the tool on return to the chat. [#22994](https://github.com/open-webui/open-webui/issues/22994), [#22995](https://github.com/open-webui/open-webui/pull/22995), [Commit](https://github.com/open-webui/open-webui/commit/4d50001c4192c609b1010626ebb6496692823873)
- 🏷️ **Channel @mentions.** Direct connection models no longer appear in channel @mention suggestions, preventing confusion since they don't work in channels. [#22553](https://github.com/open-webui/open-webui/issues/22553), [Commit](https://github.com/open-webui/open-webui/commit/0a87c1ecd078320a08c4cc62d41fe8727fb3b5f7)
- 📎 **Channel message attachments.** Users can now press Enter to send messages with only file or image attachments in channels, direct messages, and threads, aligning with the behavior of the Send button. [#22752](https://github.com/open-webui/open-webui/pull/22752)
- 🗣️ **Image-only message handling.** Models like Gemini and Claude no longer fail when receiving messages with only file or image attachments and no text, by stripping empty text content blocks before sending to the API. [Commit](https://github.com/open-webui/open-webui/commit/ea515fa26e11faac146c48a5e3a2a284e1792bb3), [#22880](https://github.com/open-webui/open-webui/issues/22880)
- 🧹 **Channel thread sidebar cleanup.** The thread sidebar in channels and direct messages now automatically closes when the parent message is deleted, preventing orphaned threads. [#22890](https://github.com/open-webui/open-webui/pull/22890)
- 💡 **Chat input suggestion modal.** The suggestion modal for tags, mentions, and commands now correctly reappears when backspacing into a trigger character after it was dismissed. [#22899](https://github.com/open-webui/open-webui/pull/22899)
- ⏱️ **Chat action button timing.** Action buttons under assistant messages no longer appear prematurely when switching chats while a response is still streaming. [Commit](https://github.com/open-webui/open-webui/commit/ecba37070d6eb3cb033195a070b6c4ab5f396415), [#22891](https://github.com/open-webui/open-webui/issues/22891)
- 💬 **Skill and model mention persistence.** Skills selected via $ and models selected via @ in the chat input are now properly restored after a page refresh, instead of reverting to plain text while losing their interactive state. [#22913](https://github.com/open-webui/open-webui/issues/22913), [Commit](https://github.com/open-webui/open-webui/commit/be21db706993c0db95ac09509dfdb023de64daff)
- 🧹 **Webhook profile image errors.** Fixed 404 errors appearing in the browser console when scrolling through channel messages sent by webhooks, by skipping the user profile preview for webhook senders. [#22893](https://github.com/open-webui/open-webui/pull/22893)
- 🧮 **Logit bias parameter handling.** Using logit_bias parameters no longer causes errors when the input is already in dictionary format. [#22597](https://github.com/open-webui/open-webui/issues/22597), [Commit](https://github.com/open-webui/open-webui/commit/e34ed72e1e958505e940b74bf1c6a4808640bd17)
- 🪛 **Temp chat tool calling.** Temporary chats now properly preserve tool call information, fixing native tool calling with JSON schema that was previously broken. [#22475](https://github.com/open-webui/open-webui/pull/22475), [Commit](https://github.com/open-webui/open-webui/commit/bcd313c363ca50d71aa80bcb2f29c81fad3dff37)
- 🔗 **Multi-system message merging.** Models with strict chat templates like Qwen no longer fail when multiple pipeline stages inject separate system messages, as all system messages are now merged into one at the start. [#22505](https://github.com/open-webui/open-webui/issues/22505), [Commit](https://github.com/open-webui/open-webui/commit/631bd20c3537ce85bbaec02f9e0049c88fa8fdd4)
- 📜 **Public note access.** Opening public notes via direct share link no longer returns a 500 error caused by a missing function import. [#22680](https://github.com/open-webui/open-webui/issues/22680), [Commit](https://github.com/open-webui/open-webui/commit/566e25569e5e7d9c1e42db840ba4ba578887d208)
- 👤 **Terminal access user visibility.** The terminal connection access dialog now shows the currently logged-in user when searching for users to grant access, fixing an issue where users with identical display names were filtered incorrectly. [#22491](https://github.com/open-webui/open-webui/issues/22491), [Commit](https://github.com/open-webui/open-webui/commit/4a8f995c3fd4602ec2aaccc07efc4e8504dda84d)
- 👥 **User groups display.** User groups in the admin panel profile preview now wrap properly instead of overflowing horizontally, with a scrollbar when the list is long. [#22547](https://github.com/open-webui/open-webui/pull/22547)
- 🔧 **Model list drag-and-drop.** Fixed drag-and-drop reordering of models in admin settings, preventing UI glitches and state synchronization issues. [Commit](https://github.com/open-webui/open-webui/commit/753589e51ccbbe5c4f78a7d13e19c67e6c0000d7)
- 🖼️ **Model profile image fallbacks.** Model profile images now display a fallback icon when they fail to load, and model icons no longer disappear on paginated Models pages in admin and workspace settings. [#22485](https://github.com/open-webui/open-webui/pull/22485)
- 🖼️ **Profile image fallbacks.** Added fallback handlers for model and user profile images throughout the chat interface, preventing broken image icons when avatars fail to load. [#22486](https://github.com/open-webui/open-webui/pull/22486)
- 🧲 **RAG thinking model support.** Knowledge base queries now correctly parse JSON responses from thinking models like GLM-5 and DeepSeek-R1 by stripping their reasoning blocks before JSON extraction. [#22400](https://github.com/open-webui/open-webui/pull/22400)
- 🔍 **RAG query generation robustness.** The RAG query generation, web search, and image generation handlers now correctly extract JSON from model responses containing thinking tags by finding the last JSON block instead of the first, preventing "No sources found" errors with thinking models. [#21888](https://github.com/open-webui/open-webui/issues/21888), [Commit](https://github.com/open-webui/open-webui/commit/c0fcbc5b4cb29012e2913983c632edc5d24b9aea)
- 🔍 **Ollama embedding robustness.** Ollama embedding requests now include the truncate parameter to handle inputs exceeding the context window, preventing 500 errors when processing long documents. Error messages from failed embedding requests are also now properly surfaced instead of being silently swallowed. [#22671](https://github.com/open-webui/open-webui/issues/22671), [Commit](https://github.com/open-webui/open-webui/commit/d738044f47c70c755bec9bf244aa11878fe98d9c)
- 🔄 **Ollama embedding retry logic.** Embedding requests to Ollama now retry with exponential backoff when encountering 503 errors (such as when the model reloads mid-processing), preventing files from being silently dropped from knowledge bases. [#22571](https://github.com/open-webui/open-webui/issues/22571), [Commit](https://github.com/open-webui/open-webui/commit/8b6fa1f4ab6099a305de08706621075c205f65c4)
- 🗄️ **Oracle 23AI hybrid search.** Fixed an UnboundLocalError that occurred when using hybrid search with Oracle 23AI as the vector store, preventing knowledge base queries from failing. [Commit](https://github.com/open-webui/open-webui/commit/fcf720835285a4cea10fc1ebed0b454971463b20), [#22616](https://github.com/open-webui/open-webui/issues/22616)
- 🌐 **Dynamic HTML language attribute.** The HTML lang attribute now dynamically updates when users change their interface language, preventing browsers from triggering unwanted translation popups. [Commit](https://github.com/open-webui/open-webui/commit/de5e0fbc00e7abcd84e1272c301b0707f8ea5ac6)
- 📐 **File upload deduplication.** Attaching files that are already in the chat no longer triggers duplicate uploads. [Commit](https://github.com/open-webui/open-webui/commit/10f06a64fed474e9958b96295a953e0eebf9e4be)
- 🕵️ **Serper.dev search results.** Fixed web search results not displaying properly when using the Serper.dev provider by using the correct API response field. [#22869](https://github.com/open-webui/open-webui/pull/22869)
- 🔲 **Markdown task list checkbox styling.** Fixed task list checkboxes in markdown rendering to display consistently without shrinking in narrow layouts. [#22886](https://github.com/open-webui/open-webui/pull/22886)
- 🎨 **Artifacts sidebar tab background fix.** The Artifacts sidebar now correctly updates and displays when switching back to a browser tab that was in the background, ensuring artifacts are visible without requiring a manual refresh. [#22889](https://github.com/open-webui/open-webui/issues/22889)
- 🔃 **Chat input URL indexing fix.** Fixed an issue where URLs could be indexed twice when using multiple triggers followed by backspace and re-entering a URL. [#22749](https://github.com/open-webui/open-webui/issues/22749)
- 🔎 **Search modal chat preview avatars.** Fixed assistant profile images not displaying in the chat preview pane of the Search Modal. [#22782](https://github.com/open-webui/open-webui/pull/22782)
- 📋 **Prompts search pagination fix.** Fixed a bug where searching prompts from a paginated page would incorrectly use the current page number, resulting in "No prompts found" even when matching results existed. [#22912](https://github.com/open-webui/open-webui/pull/22912)
- 🗂️ **Reasoning block copy cleanup.** Copied chat responses no longer include reasoning block content or excess whitespace, ensuring only the intended message text is captured. [#22786](https://github.com/open-webui/open-webui/issues/22786), [Commit](https://github.com/open-webui/open-webui/commit/4f0e57420154800946394bc986b2c691462b2782)
- 🔤 **Emoji removal for text normalization.** Fixed the emoji removal function used in search and title generation to correctly handle all emoji types, including those with variation selectors (❤️, ☀️, ✅), keycap sequences (1️⃣), and ZWJ family sequences (👨‍👩‍👧‍👦). [#22915](https://github.com/open-webui/open-webui/pull/22915)
- ⏹️ **Task cancellation status tracking.** Cancelled tasks now correctly mark only the affected messages as done instead of clearing all task statuses for the chat, ensuring proper status tracking when multiple messages have pending tasks. [#22743](https://github.com/open-webui/open-webui/pull/22743)
- 🎨 **Filter icon display fix.** Fixed filter icons showing the wrong icon after removing one of multiple active filters below the chat input. [#22862](https://github.com/open-webui/open-webui/pull/22862)
- 📊 **Channel message data loading.** Fixed redundant 404 API calls that occurred when rendering channel messages, preventing unnecessary requests and console errors. [#22894](https://github.com/open-webui/open-webui/pull/22894)
- 👻 **Response message skeleton display.** Fixed an issue where the skeleton loader would incorrectly show or hide based on complex status history conditions, by extracting the visibility logic into a cleaner reactive variable. [Commit](https://github.com/open-webui/open-webui/commit/5df4277216fbb9de603fdf4289f8366292568234)
- 🐛 **Shared chat viewing crash.** Shared chats can now be viewed by unauthenticated users without crashing, with proper fallback handling for missing user profile information. [#22751](https://github.com/open-webui/open-webui/pull/22751), [#22742](https://github.com/open-webui/open-webui/issues/22742)
- 🛠️ **Plugin ID sanitization.** Creating Functions or Tools with emojis or special characters in their names now generates valid IDs that pass backend validation, instead of failing with an error. [#22695](https://github.com/open-webui/open-webui/pull/22695)
- 📋 **Chat title preservation.** Regenerating responses or using branches no longer overwrites user-specified chat titles when auto-naming is disabled, by checking the full chat message count instead of just the current branch. [#22754](https://github.com/open-webui/open-webui/pull/22754)
- 🎧 **Read Aloud in chat preview.** The Read Aloud button in the Search Chats modal preview no longer causes crashes, and TTS functionality is now properly hidden in read-only chat contexts. [Commit](https://github.com/open-webui/open-webui/commit/d8fa0f426a88f5c27b3216b7db35e1db47bbba28)
- 📡 **Heartbeat event loop blocking.** The WebSocket heartbeat handler no longer blocks the event loop when updating user activity, improving responsiveness under heavy load with many concurrent connections. [#22980](https://github.com/open-webui/open-webui/pull/22980)
- 🗝️ **Message upsert API reliability.** The message upsert API endpoint no longer crashes when called, fixing an error where a database session was incorrectly passed to a function that doesn't accept it. [#22959](https://github.com/open-webui/open-webui/issues/22959), [Commit](https://github.com/open-webui/open-webui/commit/70285fb6cad26b50d783583b68be5227ace16055)
- 🔓 **Forward auth proxy compatibility.** Fixed error pages that could appear when using authenticating reverse-proxies by properly handling 401 responses from background API requests, allowing the browser to re-authenticate with the identity provider. [#22942](https://github.com/open-webui/open-webui/pull/22942)
- 🔃 **Tool call streaming display.** Sequential tool calls are now properly accumulated during streaming, fixing an issue where completed tool calls could disappear from the display before the next tool call finished streaming. [Commit](https://github.com/open-webui/open-webui/commit/a9c5c787b9f6b10491924d38645042064b3c941e)
- 🧠 **Reasoning spinner content preservation.** Prior assistant content and tool call blocks no longer disappear during the reasoning spinner when responding after tool execution. [#23001](https://github.com/open-webui/open-webui/pull/23001)
- 🖥️ **Pyodide file list refresh.** Files created or modified during manual code execution now appear immediately in the pyodide files list without requiring a browser tab refresh. [Commit](https://github.com/open-webui/open-webui/commit/5c4062c64841974bf193ff321d92d10f28a09746)
- 🖱️ **Dropdown submenu hover stability.** Secondary hover menus like Download and Move now remain open while navigating into them, fixing an issue where an 8px gap between the trigger and submenu would cause the menu to disappear before a selection could be made. [#22744](https://github.com/open-webui/open-webui/issues/22744), [Commit](https://github.com/open-webui/open-webui/commit/cffbc3558e911abd6c4780cd028794b2f7282cd7)
- 📊 **Model tag normalization.** Model tags from backends that return them as string arrays are now properly normalized to object format, preventing crashes when filtering models by tag in the admin and workspace models pages. [#20819](https://github.com/open-webui/open-webui/issues/20819), [Commit](https://github.com/open-webui/open-webui/commit/90ca2e9b0f15cc9be7cf298fbefacaa45074cae9)
- 🎯 **Arena model sub-model settings.** Arena models now properly use the selected sub-model's settings — including RAG knowledge bases, web access, code interpreter, and tool capabilities — instead of the arena wrapper's empty defaults. [#16950](https://github.com/open-webui/open-webui/issues/16950), [Commit](https://github.com/open-webui/open-webui/commit/857d7e6f373d26a7a8989417c3a7fe99cdc03f20)
- 🧩 **Model editor default metadata.** The Model Editor now loads admin-configured default model metadata instead of hardcoded values, preventing admin defaults from being silently overwritten when users save models without realizing they were overriding system-wide settings. [#22996](https://github.com/open-webui/open-webui/issues/22996), [Commit](https://github.com/open-webui/open-webui/commit/cdc2b3bf850044051aafcd46f22fb25a1899788c)
- ✏️ **Rich text paste sanitization.** Copying and pasting text with HTML characters (like `<` or `>`) no longer corrupts the editor content, as the paste handler now properly escapes HTML entities before processing mentions and special syntax. [Commit](https://github.com/open-webui/open-webui/commit/94f877ff328d410339308ad2c566c9afcdf43014)
### Changed
- 🪝 **User webhooks disabled by default.** User webhook notifications are now disabled by default and properly gated by the ENABLE_USER_WEBHOOKS configuration, ensuring webhooks only fire when explicitly enabled. [Commit](https://github.com/open-webui/open-webui/commit/c24a4da17dbaddf47e2e0f865c1d602d0ff36ee6)
- 🧩 **MCP integration visibility.** MCP (Streamable HTTP) integrations are now hidden from user-level settings, matching the intended behavior where only administrators can configure MCP connections through the admin panel. User-level connections now show the connection type as read-only. [#22615](https://github.com/open-webui/open-webui/issues/22615), [Commit](https://github.com/open-webui/open-webui/commit/1eef5b4f6a718c0fcf3605f1ed62669aca07b454)
- 🧲 **Web search result limit.** The configured web search result count now acts as a maximum limit, preventing models from requesting more results than administrators allow. [#22577](https://github.com/open-webui/open-webui/pull/22577)
## [0.8.10] - 2026-03-08
### Added

View file

@ -1,3 +1,3 @@
export CORS_ALLOW_ORIGIN="http://localhost:5173;http://localhost:8080"
PORT="${PORT:-8080}"
uvicorn open_webui.main:app --port $PORT --host 0.0.0.0 --forwarded-allow-ips '*' --reload
uvicorn open_webui.main:app --port $PORT --host 0.0.0.0 --forwarded-allow-ips "${FORWARDED_ALLOW_IPS:-*}" --reload

View file

@ -682,9 +682,7 @@ def load_oauth_providers():
**({'timeout': int(OAUTH_TIMEOUT.value)} if OAUTH_TIMEOUT.value else {}),
},
redirect_uri=GOOGLE_REDIRECT_URI.value,
**({
'authorize_params': GOOGLE_OAUTH_AUTHORIZE_PARAMS
} if GOOGLE_OAUTH_AUTHORIZE_PARAMS else {}),
**({'authorize_params': GOOGLE_OAUTH_AUTHORIZE_PARAMS} if GOOGLE_OAUTH_AUTHORIZE_PARAMS else {}),
)
return client

View file

@ -9,7 +9,7 @@ class MESSAGES(str, Enum):
class WEBHOOK_MESSAGES(str, Enum):
DEFAULT = lambda msg='': f'{msg if msg else ""}'
USER_SIGNUP = lambda username='': (f'New user signed up: {username}' if username else 'New user signed up')
USER_SIGNUP = lambda username='': f'New user signed up: {username}' if username else 'New user signed up'
class ERROR_MESSAGES(str, Enum):
@ -80,8 +80,8 @@ class ERROR_MESSAGES(str, Enum):
OLLAMA_API_DISABLED = 'The Ollama API is disabled. Please enable it to use this feature.'
FILE_TOO_LARGE = (
lambda size='': f"Oops! The file you're trying to upload is too large. Please upload a file that is less than {size}."
FILE_TOO_LARGE = lambda size='': (
f"Oops! The file you're trying to upload is too large. Please upload a file that is less than {size}."
)
DUPLICATE_CONTENT = 'Duplicate content detected. Please provide unique content to proceed.'
@ -89,7 +89,7 @@ class ERROR_MESSAGES(str, Enum):
'Extracted content is not available for this file. Please ensure that the file is processed before proceeding.'
)
INVALID_PASSWORD = lambda err='': (err if err else 'The password does not meet the required validation criteria.')
INVALID_PASSWORD = lambda err='': err if err else 'The password does not meet the required validation criteria.'
class TASKS(str, Enum):

View file

@ -545,6 +545,7 @@ from open_webui.utils.auth import (
from open_webui.utils.plugin import install_tool_and_function_dependencies
from open_webui.utils.oauth import (
get_oauth_client_info_with_dynamic_client_registration,
get_oauth_client_info_with_static_credentials,
encrypt_data,
decrypt_data,
OAuthManager,
@ -2264,7 +2265,7 @@ if len(app.state.config.TOOL_SERVER_CONNECTIONS) > 0:
server_id = tool_server_connection.get('info', {}).get('id')
auth_type = tool_server_connection.get('auth_type', 'none')
if server_id and auth_type == 'oauth_2.1':
if server_id and auth_type in ('oauth_2.1', 'oauth_2.1_static'):
oauth_client_info = tool_server_connection.get('info', {}).get('oauth_client_info', '')
try:
@ -2324,17 +2325,33 @@ async def register_client(request, client_id: str) -> bool:
return False
server_url = connection.get('url')
auth_type = connection.get('auth_type', 'none')
oauth_server_key = (connection.get('config') or {}).get('oauth_server_key')
try:
oauth_client_info = await get_oauth_client_info_with_dynamic_client_registration(
request,
client_id,
server_url,
oauth_server_key,
)
if auth_type == 'oauth_2.1_static':
# Static credentials: rebuild from stored credentials + fresh metadata
existing_client_info = connection.get('info', {}).get('oauth_client_info', '')
if not existing_client_info:
log.error(f'No stored OAuth client info for static client {client_id}')
return False
existing_data = decrypt_data(existing_client_info)
oauth_client_info = await get_oauth_client_info_with_static_credentials(
request,
client_id,
server_url,
oauth_client_id=existing_data.get('client_id', ''),
oauth_client_secret=existing_data.get('client_secret', ''),
)
else:
oauth_client_info = await get_oauth_client_info_with_dynamic_client_registration(
request,
client_id,
server_url,
oauth_server_key,
)
except Exception as e:
log.error(f'Dynamic client re-registration failed for {client_id}: {e}')
log.error(f'OAuth client re-registration failed for {client_id}: {e}')
return False
try:

View file

@ -87,7 +87,7 @@ class FileModelResponse(BaseModel):
filename: str
data: Optional[dict] = None
meta: FileMeta
meta: Optional[FileMeta] = None
created_at: int # timestamp in epoch
updated_at: Optional[int] = None # timestamp in epoch, optional for legacy files
@ -246,7 +246,7 @@ class FilesTable:
total = query.count()
items = [
FileModel.model_validate(file)
FileModelResponse.model_validate(file, from_attributes=True)
for file in query.order_by(File.updated_at.desc(), File.id.desc()).offset(skip).limit(limit).all()
]

View file

@ -176,6 +176,11 @@ class GroupTable:
groups = db.query(Group).order_by(Group.updated_at.desc()).all()
return [GroupModel.model_validate(group) for group in groups]
def get_group_by_name(self, name: str, db: Optional[Session] = None) -> Optional[GroupModel]:
with get_db_context(db) as db:
group = db.query(Group).filter(Group.name == name).first()
return GroupModel.model_validate(group) if group else None
def get_groups(self, filter, db: Optional[Session] = None) -> list[GroupResponse]:
with get_db_context(db) as db:
member_count = (

View file

@ -10,7 +10,7 @@ from open_webui.models.users import User, UserModel, Users, UserResponse
from open_webui.models.access_grants import AccessGrantModel, AccessGrants
from pydantic import BaseModel, ConfigDict, Field
from pydantic import BaseModel, ConfigDict, Field, model_validator
from sqlalchemy import String, cast, or_, and_, func
from sqlalchemy.dialects import postgresql, sqlite
@ -47,7 +47,20 @@ class ModelMeta(BaseModel):
model_config = ConfigDict(extra='allow')
pass
@model_validator(mode='before')
@classmethod
def normalize_tags(cls, data):
if isinstance(data, dict) and 'tags' in data:
raw_tags = data['tags']
if isinstance(raw_tags, list):
normalized = []
for tag in raw_tags:
if isinstance(tag, str):
normalized.append({'name': tag})
elif isinstance(tag, dict) and 'name' in tag:
normalized.append(tag)
data['tags'] = normalized
return data
class Model(Base):

View file

@ -30,6 +30,7 @@ from open_webui.models.knowledge import Knowledges
from open_webui.models.chats import Chats
from open_webui.models.notes import Notes
from open_webui.models.access_grants import AccessGrants
from open_webui.utils.access_control.files import has_access_to_file
from open_webui.retrieval.vector.main import GetResult
from open_webui.utils.headers import include_user_info_headers
@ -550,34 +551,30 @@ def generate_openai_batch_embeddings(
key: str = '',
prefix: str = None,
user: UserModel = None,
) -> Optional[list[list[float]]]:
try:
log.debug(f'generate_openai_batch_embeddings:model {model} batch size: {len(texts)}')
json_data = {'input': texts, 'model': model}
if isinstance(RAG_EMBEDDING_PREFIX_FIELD_NAME, str) and isinstance(prefix, str):
json_data[RAG_EMBEDDING_PREFIX_FIELD_NAME] = prefix
) -> list[list[float]]:
log.debug(f'generate_openai_batch_embeddings:model {model} batch size: {len(texts)}')
json_data = {'input': texts, 'model': model}
if isinstance(RAG_EMBEDDING_PREFIX_FIELD_NAME, str) and isinstance(prefix, str):
json_data[RAG_EMBEDDING_PREFIX_FIELD_NAME] = prefix
headers = {
'Content-Type': 'application/json',
'Authorization': f'Bearer {key}',
}
if ENABLE_FORWARD_USER_INFO_HEADERS and user:
headers = include_user_info_headers(headers, user)
headers = {
'Content-Type': 'application/json',
'Authorization': f'Bearer {key}',
}
if ENABLE_FORWARD_USER_INFO_HEADERS and user:
headers = include_user_info_headers(headers, user)
r = requests.post(
f'{url}/embeddings',
headers=headers,
json=json_data,
)
r.raise_for_status()
data = r.json()
if 'data' in data:
return [elem['embedding'] for elem in data['data']]
else:
raise ValueError("Unexpected OpenAI embeddings response: missing 'data' key")
except Exception as e:
log.exception(f'Error generating openai batch embeddings: {e}')
return None
r = requests.post(
f'{url}/embeddings',
headers=headers,
json=json_data,
)
r.raise_for_status()
data = r.json()
if 'data' in data:
return [elem['embedding'] for elem in data['data']]
else:
raise ValueError("Unexpected OpenAI embeddings response: missing 'data' key")
async def agenerate_openai_batch_embeddings(
@ -587,38 +584,34 @@ async def agenerate_openai_batch_embeddings(
key: str = '',
prefix: str = None,
user: UserModel = None,
) -> Optional[list[list[float]]]:
try:
log.debug(f'agenerate_openai_batch_embeddings:model {model} batch size: {len(texts)}')
form_data = {'input': texts, 'model': model}
if isinstance(RAG_EMBEDDING_PREFIX_FIELD_NAME, str) and isinstance(prefix, str):
form_data[RAG_EMBEDDING_PREFIX_FIELD_NAME] = prefix
) -> list[list[float]]:
log.debug(f'agenerate_openai_batch_embeddings:model {model} batch size: {len(texts)}')
form_data = {'input': texts, 'model': model}
if isinstance(RAG_EMBEDDING_PREFIX_FIELD_NAME, str) and isinstance(prefix, str):
form_data[RAG_EMBEDDING_PREFIX_FIELD_NAME] = prefix
headers = {
'Content-Type': 'application/json',
'Authorization': f'Bearer {key}',
}
if ENABLE_FORWARD_USER_INFO_HEADERS and user:
headers = include_user_info_headers(headers, user)
headers = {
'Content-Type': 'application/json',
'Authorization': f'Bearer {key}',
}
if ENABLE_FORWARD_USER_INFO_HEADERS and user:
headers = include_user_info_headers(headers, user)
async with aiohttp.ClientSession(
trust_env=True, timeout=aiohttp.ClientTimeout(total=AIOHTTP_CLIENT_TIMEOUT)
) as session:
async with session.post(
f'{url}/embeddings',
headers=headers,
json=form_data,
ssl=AIOHTTP_CLIENT_SESSION_SSL,
) as r:
r.raise_for_status()
data = await r.json()
if 'data' in data:
return [item['embedding'] for item in data['data']]
else:
raise Exception('Something went wrong :/')
except Exception as e:
log.exception(f'Error generating openai batch embeddings: {e}')
return None
async with aiohttp.ClientSession(
trust_env=True, timeout=aiohttp.ClientTimeout(total=AIOHTTP_CLIENT_TIMEOUT)
) as session:
async with session.post(
f'{url}/embeddings',
headers=headers,
json=form_data,
ssl=AIOHTTP_CLIENT_SESSION_SSL,
) as r:
r.raise_for_status()
data = await r.json()
if 'data' in data:
return [item['embedding'] for item in data['data']]
else:
raise ValueError("Unexpected OpenAI embeddings response: missing 'data' key")
def generate_azure_openai_batch_embeddings(
@ -629,42 +622,38 @@ def generate_azure_openai_batch_embeddings(
version: str = '',
prefix: str = None,
user: UserModel = None,
) -> Optional[list[list[float]]]:
try:
log.debug(f'generate_azure_openai_batch_embeddings:deployment {model} batch size: {len(texts)}')
json_data = {'input': texts}
if isinstance(RAG_EMBEDDING_PREFIX_FIELD_NAME, str) and isinstance(prefix, str):
json_data[RAG_EMBEDDING_PREFIX_FIELD_NAME] = prefix
) -> list[list[float]]:
log.debug(f'generate_azure_openai_batch_embeddings:deployment {model} batch size: {len(texts)}')
json_data = {'input': texts}
if isinstance(RAG_EMBEDDING_PREFIX_FIELD_NAME, str) and isinstance(prefix, str):
json_data[RAG_EMBEDDING_PREFIX_FIELD_NAME] = prefix
url = f'{url}/openai/deployments/{model}/embeddings?api-version={version}'
url = f'{url}/openai/deployments/{model}/embeddings?api-version={version}'
for _ in range(5):
headers = {
'Content-Type': 'application/json',
'api-key': key,
}
if ENABLE_FORWARD_USER_INFO_HEADERS and user:
headers = include_user_info_headers(headers, user)
for _ in range(5):
headers = {
'Content-Type': 'application/json',
'api-key': key,
}
if ENABLE_FORWARD_USER_INFO_HEADERS and user:
headers = include_user_info_headers(headers, user)
r = requests.post(
url,
headers=headers,
json=json_data,
)
if r.status_code == 429:
retry = float(r.headers.get('Retry-After', '1'))
time.sleep(retry)
continue
r.raise_for_status()
data = r.json()
if 'data' in data:
return [elem['embedding'] for elem in data['data']]
else:
raise Exception('Something went wrong :/')
return None
except Exception as e:
log.exception(f'Error generating azure openai batch embeddings: {e}')
return None
r = requests.post(
url,
headers=headers,
json=json_data,
)
if r.status_code == 429:
retry = float(r.headers.get('Retry-After', '1'))
time.sleep(retry)
continue
r.raise_for_status()
data = r.json()
if 'data' in data:
return [elem['embedding'] for elem in data['data']]
else:
raise ValueError("Unexpected Azure OpenAI embeddings response: missing 'data' key")
raise Exception('Azure OpenAI embedding request failed: max retries (429) exceeded')
async def agenerate_azure_openai_batch_embeddings(
@ -675,40 +664,36 @@ async def agenerate_azure_openai_batch_embeddings(
version: str = '',
prefix: str = None,
user: UserModel = None,
) -> Optional[list[list[float]]]:
try:
log.debug(f'agenerate_azure_openai_batch_embeddings:deployment {model} batch size: {len(texts)}')
form_data = {'input': texts}
if isinstance(RAG_EMBEDDING_PREFIX_FIELD_NAME, str) and isinstance(prefix, str):
form_data[RAG_EMBEDDING_PREFIX_FIELD_NAME] = prefix
) -> list[list[float]]:
log.debug(f'agenerate_azure_openai_batch_embeddings:deployment {model} batch size: {len(texts)}')
form_data = {'input': texts}
if isinstance(RAG_EMBEDDING_PREFIX_FIELD_NAME, str) and isinstance(prefix, str):
form_data[RAG_EMBEDDING_PREFIX_FIELD_NAME] = prefix
full_url = f'{url}/openai/deployments/{model}/embeddings?api-version={version}'
full_url = f'{url}/openai/deployments/{model}/embeddings?api-version={version}'
headers = {
'Content-Type': 'application/json',
'api-key': key,
}
if ENABLE_FORWARD_USER_INFO_HEADERS and user:
headers = include_user_info_headers(headers, user)
headers = {
'Content-Type': 'application/json',
'api-key': key,
}
if ENABLE_FORWARD_USER_INFO_HEADERS and user:
headers = include_user_info_headers(headers, user)
async with aiohttp.ClientSession(
trust_env=True, timeout=aiohttp.ClientTimeout(total=AIOHTTP_CLIENT_TIMEOUT)
) as session:
async with session.post(
full_url,
headers=headers,
json=form_data,
ssl=AIOHTTP_CLIENT_SESSION_SSL,
) as r:
r.raise_for_status()
data = await r.json()
if 'data' in data:
return [item['embedding'] for item in data['data']]
else:
raise Exception('Something went wrong :/')
except Exception as e:
log.exception(f'Error generating azure openai batch embeddings: {e}')
return None
async with aiohttp.ClientSession(
trust_env=True, timeout=aiohttp.ClientTimeout(total=AIOHTTP_CLIENT_TIMEOUT)
) as session:
async with session.post(
full_url,
headers=headers,
json=form_data,
ssl=AIOHTTP_CLIENT_SESSION_SSL,
) as r:
r.raise_for_status()
data = await r.json()
if 'data' in data:
return [item['embedding'] for item in data['data']]
else:
raise ValueError("Unexpected Azure OpenAI embeddings response: missing 'data' key")
def generate_ollama_batch_embeddings(
@ -718,35 +703,33 @@ def generate_ollama_batch_embeddings(
key: str = '',
prefix: str = None,
user: UserModel = None,
) -> Optional[list[list[float]]]:
try:
log.debug(f'generate_ollama_batch_embeddings:model {model} batch size: {len(texts)}')
json_data = {'input': texts, 'model': model}
if isinstance(RAG_EMBEDDING_PREFIX_FIELD_NAME, str) and isinstance(prefix, str):
json_data[RAG_EMBEDDING_PREFIX_FIELD_NAME] = prefix
) -> list[list[float]]:
log.debug(f'generate_ollama_batch_embeddings:model {model} batch size: {len(texts)}')
json_data = {'input': texts, 'model': model, 'truncate': True}
if isinstance(RAG_EMBEDDING_PREFIX_FIELD_NAME, str) and isinstance(prefix, str):
json_data[RAG_EMBEDDING_PREFIX_FIELD_NAME] = prefix
headers = {
'Content-Type': 'application/json',
'Authorization': f'Bearer {key}',
}
if ENABLE_FORWARD_USER_INFO_HEADERS and user:
headers = include_user_info_headers(headers, user)
headers = {
'Content-Type': 'application/json',
'Authorization': f'Bearer {key}',
}
if ENABLE_FORWARD_USER_INFO_HEADERS and user:
headers = include_user_info_headers(headers, user)
r = requests.post(
f'{url}/api/embed',
headers=headers,
json=json_data,
)
r.raise_for_status()
data = r.json()
r = requests.post(
f'{url}/api/embed',
headers=headers,
json=json_data,
)
if r.status_code != 200:
error_detail = r.json().get('error', r.text)
raise Exception(f'Ollama embed error ({r.status_code}): {error_detail}')
data = r.json()
if 'embeddings' in data:
return data['embeddings']
else:
raise ValueError("Unexpected Ollama embeddings response: missing 'embeddings' key")
except Exception as e:
log.exception(f'Error generating ollama batch embeddings: {e}')
return None
if 'embeddings' in data:
return data['embeddings']
else:
raise ValueError("Unexpected Ollama embeddings response: missing 'embeddings' key")
async def agenerate_ollama_batch_embeddings(
@ -756,38 +739,37 @@ async def agenerate_ollama_batch_embeddings(
key: str = '',
prefix: str = None,
user: UserModel = None,
) -> Optional[list[list[float]]]:
try:
log.debug(f'agenerate_ollama_batch_embeddings:model {model} batch size: {len(texts)}')
form_data = {'input': texts, 'model': model}
if isinstance(RAG_EMBEDDING_PREFIX_FIELD_NAME, str) and isinstance(prefix, str):
form_data[RAG_EMBEDDING_PREFIX_FIELD_NAME] = prefix
) -> list[list[float]]:
log.debug(f'agenerate_ollama_batch_embeddings:model {model} batch size: {len(texts)}')
form_data = {'input': texts, 'model': model, 'truncate': True}
if isinstance(RAG_EMBEDDING_PREFIX_FIELD_NAME, str) and isinstance(prefix, str):
form_data[RAG_EMBEDDING_PREFIX_FIELD_NAME] = prefix
headers = {
'Content-Type': 'application/json',
'Authorization': f'Bearer {key}',
}
if ENABLE_FORWARD_USER_INFO_HEADERS and user:
headers = include_user_info_headers(headers, user)
headers = {
'Content-Type': 'application/json',
'Authorization': f'Bearer {key}',
}
if ENABLE_FORWARD_USER_INFO_HEADERS and user:
headers = include_user_info_headers(headers, user)
async with aiohttp.ClientSession(
trust_env=True, timeout=aiohttp.ClientTimeout(total=AIOHTTP_CLIENT_TIMEOUT)
) as session:
async with session.post(
f'{url}/api/embed',
headers=headers,
json=form_data,
ssl=AIOHTTP_CLIENT_SESSION_SSL,
) as r:
r.raise_for_status()
data = await r.json()
if 'embeddings' in data:
return data['embeddings']
else:
raise Exception('Something went wrong :/')
except Exception as e:
log.exception(f'Error generating ollama batch embeddings: {e}')
return None
async with aiohttp.ClientSession(
trust_env=True, timeout=aiohttp.ClientTimeout(total=AIOHTTP_CLIENT_TIMEOUT)
) as session:
async with session.post(
f'{url}/api/embed',
headers=headers,
json=form_data,
ssl=AIOHTTP_CLIENT_SESSION_SSL,
) as r:
if r.status != 200:
error_data = await r.json()
error_detail = error_data.get('error', str(error_data))
raise Exception(f'Ollama embed error ({r.status}): {error_detail}')
data = await r.json()
if 'embeddings' in data:
return data['embeddings']
else:
raise ValueError("Unexpected Ollama embeddings response: missing 'embeddings' key")
def get_embedding_function(
@ -855,11 +837,12 @@ def get_embedding_function(
for batch in batches:
batch_results.append(await embedding_function(batch, prefix=prefix, user=user))
# Flatten results
# Flatten results — raise if any batch failed
embeddings = []
for batch_embeddings in batch_results:
if isinstance(batch_embeddings, list):
embeddings.extend(batch_embeddings)
for i, batch_embeddings in enumerate(batch_results):
if batch_embeddings is None:
raise Exception(f'Embedding generation failed for batch {i + 1}/{len(batches)}')
embeddings.extend(batch_embeddings)
log.debug(
f'generate_multiple_async: Generated {len(embeddings)} embeddings from {len(batches)} parallel batches'
@ -901,11 +884,15 @@ async def generate_embeddings(
'user': user,
}
)
if embeddings is None:
return None
return embeddings[0] if isinstance(text, str) else embeddings
elif engine == 'openai':
embeddings = await agenerate_openai_batch_embeddings(
model, text if isinstance(text, list) else [text], url, key, prefix, user
)
if embeddings is None:
return None
return embeddings[0] if isinstance(text, str) else embeddings
elif engine == 'azure_openai':
azure_api_version = kwargs.get('azure_api_version', '')
@ -918,6 +905,8 @@ async def generate_embeddings(
prefix,
user,
)
if embeddings is None:
return None
return embeddings[0] if isinstance(text, str) else embeddings
@ -1054,7 +1043,11 @@ async def get_sources_from_items(
}
elif item.get('id'):
file_object = Files.get_file_by_id(item.get('id'))
if file_object:
if file_object and (
user.role == 'admin'
or file_object.user_id == user.id
or has_access_to_file(item.get('id'), 'read', user)
):
query_result = {
'documents': [[file_object.data.get('content', '')]],
'metadatas': [

View file

@ -1155,8 +1155,9 @@ async def update_ldap_config(request: Request, form_data: LdapConfigForm, user=D
# create api key
@router.post('/api_key', response_model=ApiKey)
async def generate_api_key(request: Request, user=Depends(get_current_user), db: Session = Depends(get_session)):
if not request.app.state.config.ENABLE_API_KEYS or not has_permission(
user.id, 'features.api_keys', request.app.state.config.USER_PERMISSIONS
if not request.app.state.config.ENABLE_API_KEYS or (
user.role != 'admin'
and not has_permission(user.id, 'features.api_keys', request.app.state.config.USER_PERMISSIONS)
):
raise HTTPException(
status_code=status.HTTP_403_FORBIDDEN,

View file

@ -24,6 +24,7 @@ from open_webui.models.oauth_sessions import OAuthSessions
from open_webui.utils.oauth import (
get_discovery_urls,
get_oauth_client_info_with_dynamic_client_registration,
get_oauth_client_info_with_static_credentials,
encrypt_data,
decrypt_data,
OAuthClientInformationFull,
@ -99,6 +100,7 @@ class OAuthClientRegistrationForm(BaseModel):
url: str
client_id: str
client_name: Optional[str] = None
client_secret: Optional[str] = None
@router.post('/oauth/clients/register')
@ -113,9 +115,19 @@ async def register_oauth_client(
if type:
oauth_client_id = f'{type}:{form_data.client_id}'
oauth_client_info = await get_oauth_client_info_with_dynamic_client_registration(
request, oauth_client_id, form_data.url
)
if form_data.client_secret:
# Static credentials: skip dynamic registration, build from provided credentials
oauth_client_info = await get_oauth_client_info_with_static_credentials(
request,
oauth_client_id,
form_data.url,
oauth_client_id=form_data.client_id,
oauth_client_secret=form_data.client_secret,
)
else:
oauth_client_info = await get_oauth_client_info_with_dynamic_client_registration(
request, oauth_client_id, form_data.url
)
return {
'status': True,
'oauth_client_info': encrypt_data(oauth_client_info.model_dump(mode='json')),
@ -166,7 +178,7 @@ async def set_tool_servers_config(
server_type = connection.get('type', 'openapi')
auth_type = connection.get('auth_type', 'none')
if auth_type == 'oauth_2.1':
if auth_type in ('oauth_2.1', 'oauth_2.1_static'):
# Remove existing OAuth clients for tool servers
server_id = connection.get('info', {}).get('id')
client_key = f'{server_type}:{server_id}'
@ -189,7 +201,7 @@ async def set_tool_servers_config(
server_id = connection.get('info', {}).get('id')
auth_type = connection.get('auth_type', 'none')
if auth_type == 'oauth_2.1' and server_id:
if auth_type in ('oauth_2.1', 'oauth_2.1_static') and server_id:
try:
oauth_client_info = connection.get('info', {}).get('oauth_client_info', '')
oauth_client_info = decrypt_data(oauth_client_info)
@ -257,6 +269,92 @@ async def set_terminal_servers_config(
}
@router.post('/terminal_servers/verify')
async def verify_terminal_server_connection(
request: Request, form_data: TerminalServerConnection, user=Depends(get_admin_user)
):
"""
Verify the connection to a terminal server by detecting its type.
Tries GET {url}/api/v1/policies (orchestrator) then GET {url}/api/config
(plain terminal). Returns ``{status: true, type: "orchestrator"|"terminal"}``.
"""
base_url = (form_data.url or '').rstrip('/')
if not base_url:
raise HTTPException(status_code=400, detail='Terminal server URL is required')
headers = {}
if form_data.auth_type == 'bearer' and form_data.key:
headers['Authorization'] = f'Bearer {form_data.key}'
try:
async with aiohttp.ClientSession(
trust_env=True,
timeout=aiohttp.ClientTimeout(total=AIOHTTP_CLIENT_TIMEOUT),
) as session:
# Orchestrators expose a policies API; plain terminals don't.
try:
async with session.get(f'{base_url}/api/v1/policies', headers=headers) as resp:
if resp.ok:
return {'status': True, 'type': 'orchestrator'}
except Exception:
pass
# Fall back to open-terminal config endpoint.
try:
async with session.get(f'{base_url}/api/config', headers=headers) as resp:
if resp.ok:
return {'status': True, 'type': 'terminal'}
except Exception:
pass
except Exception as e:
log.debug(f'Failed to connect to the terminal server: {e}')
raise HTTPException(status_code=400, detail='Failed to connect to the terminal server')
class TerminalServerPolicyForm(BaseModel):
url: str
key: Optional[str] = ''
auth_type: Optional[str] = 'bearer'
policy_id: str
policy_data: dict
@router.post('/terminal_servers/policy')
async def put_terminal_server_policy(
request: Request, form_data: TerminalServerPolicyForm, user=Depends(get_admin_user)
):
"""
Proxy a policy PUT to an orchestrator terminal server.
"""
base_url = (form_data.url or '').rstrip('/')
if not base_url:
raise HTTPException(status_code=400, detail='Terminal server URL is required')
headers = {'Content-Type': 'application/json'}
if form_data.auth_type == 'bearer' and form_data.key:
headers['Authorization'] = f'Bearer {form_data.key}'
try:
async with aiohttp.ClientSession(
trust_env=True,
timeout=aiohttp.ClientTimeout(total=AIOHTTP_CLIENT_TIMEOUT),
) as session:
policy_url = f'{base_url}/api/v1/policies/{form_data.policy_id}'
async with session.put(policy_url, headers=headers, json=form_data.policy_data) as resp:
if resp.ok:
return await resp.json()
detail = await resp.text()
raise HTTPException(status_code=resp.status, detail=detail)
except HTTPException:
raise
except Exception as e:
log.debug(f'Failed to save policy to terminal server: {e}')
raise HTTPException(status_code=400, detail='Failed to save policy to terminal server')
@router.post('/tool_servers/verify')
async def verify_tool_servers_config(request: Request, form_data: ToolServerConnection, user=Depends(get_admin_user)):
"""
@ -264,7 +362,7 @@ async def verify_tool_servers_config(request: Request, form_data: ToolServerConn
"""
try:
if form_data.type == 'mcp':
if form_data.auth_type == 'oauth_2.1':
if form_data.auth_type in ('oauth_2.1', 'oauth_2.1_static'):
discovery_urls = await get_discovery_urls(form_data.url)
for discovery_url in discovery_urls:
log.debug(f'Trying to fetch OAuth 2.1 discovery document from {discovery_url}')
@ -477,6 +575,13 @@ class ModelsConfigForm(BaseModel):
DEFAULT_MODEL_PARAMS: Optional[dict] = None
@router.get('/models/defaults')
async def get_models_defaults(request: Request, user=Depends(get_verified_user)):
return {
'DEFAULT_MODEL_METADATA': request.app.state.config.DEFAULT_MODEL_METADATA,
}
@router.get('/models', response_model=ModelsConfigForm)
async def get_models_config(request: Request, user=Depends(get_admin_user)):
return {

View file

@ -151,10 +151,14 @@ async def get_model_tags(user=Depends(get_verified_user), db: Session = Depends(
if model.meta:
meta = model.meta.model_dump()
for tag in meta.get('tags', []):
tags_set.add((tag.get('name')))
try:
name = tag.get('name') if isinstance(tag, dict) else str(tag)
if name:
tags_set.add(name)
except Exception:
continue
tags = [tag for tag in tags_set]
tags.sort()
tags = sorted(tags_set)
return tags

View file

@ -72,20 +72,31 @@ log = logging.getLogger(__name__)
##########################################
async def send_get_request(url, key=None, user: UserModel = None):
async def send_get_request(
request: Request = None,
url=None,
key=None,
user: UserModel = None,
config=None,
):
timeout = aiohttp.ClientTimeout(total=AIOHTTP_CLIENT_TIMEOUT_MODEL_LIST)
try:
async with aiohttp.ClientSession(timeout=timeout, trust_env=True) as session:
headers = {
**({'Authorization': f'Bearer {key}'} if key else {}),
}
if request and config:
headers, cookies = await get_headers_and_cookies(request, url, key, config, user=user)
else:
headers = {
**({'Authorization': f'Bearer {key}'} if key else {}),
}
cookies = None
if ENABLE_FORWARD_USER_INFO_HEADERS and user:
headers = include_user_info_headers(headers, user)
if ENABLE_FORWARD_USER_INFO_HEADERS and user:
headers = include_user_info_headers(headers, user)
async with session.get(
url,
headers=headers,
cookies=cookies,
ssl=AIOHTTP_CLIENT_SESSION_SSL,
) as response:
return await response.json()
@ -95,10 +106,16 @@ async def send_get_request(url, key=None, user: UserModel = None):
return None
async def get_models_request(url, key=None, user: UserModel = None):
async def get_models_request(
request: Request = None,
url=None,
key=None,
user: UserModel = None,
config=None,
):
if is_anthropic_url(url):
return await get_anthropic_models(url, key, user=user)
return await send_get_request(f'{url}/models', key, user=user)
return await send_get_request(request, f'{url}/models', key, user=user, config=config)
def openai_reasoning_model_handler(payload):
@ -360,7 +377,7 @@ async def get_all_models_responses(request: Request, user: UserModel) -> list:
request_tasks = []
for idx, url in enumerate(api_base_urls):
if (str(idx) not in api_configs) and (url not in api_configs): # Legacy support
request_tasks.append(get_models_request(url, api_keys[idx], user=user))
request_tasks.append(get_models_request(request, url, api_keys[idx], user=user))
else:
api_config = api_configs.get(
str(idx),
@ -372,7 +389,7 @@ async def get_all_models_responses(request: Request, user: UserModel) -> list:
if enable:
if len(model_ids) == 0:
request_tasks.append(get_models_request(url, api_keys[idx], user=user))
request_tasks.append(get_models_request(request, url, api_keys[idx], user=user, config=api_config))
else:
model_list = {
'object': 'list',

View file

@ -790,8 +790,17 @@ async def get_groups(
startIndex = max(1, startIndex)
count = max(0, min(100, count))
# Get all groups
groups_list = Groups.get_all_groups(db=db)
# Get groups, applying filter if provided
if filter:
if 'displayName eq' in filter:
display_name = filter.split('"')[1]
group = Groups.get_group_by_name(display_name, db=db)
groups_list = [group] if group else []
else:
# Unrecognized filter — fall back to all groups
groups_list = Groups.get_all_groups(db=db)
else:
groups_list = Groups.get_all_groups(db=db)
# Apply pagination
total = len(groups_list)

View file

@ -42,6 +42,12 @@ async def format_code(form_data: CodeForm, user=Depends(get_admin_user)):
@router.post('/code/execute')
async def execute_code(request: Request, form_data: CodeForm, user=Depends(get_verified_user)):
if not request.app.state.config.ENABLE_CODE_EXECUTION:
raise HTTPException(
status_code=403,
detail='Code execution is disabled',
)
if request.app.state.config.CODE_EXECUTION_ENGINE == 'jupyter':
output = await execute_code_jupyter(
request.app.state.config.CODE_EXECUTION_JUPYTER_URL,

View file

@ -143,8 +143,15 @@ def get_license_data(app, key):
pn, pt = nt(pb)
data = json.loads(aesgcm.decrypt(pn, pt, None).decode())
if not data.get('exp') or data.get('exp') < datetime.now().date():
return False
exp = data.get('exp')
if exp:
if isinstance(exp, str):
from datetime import date
exp = date.fromisoformat(exp)
if exp < datetime.now().date():
return False
data_handler(data)
return True

View file

@ -203,27 +203,41 @@ async def generate_chat_completion(
except Exception as e:
raise e
if model.get('owned_by') == 'arena':
# Arena model — sub-model was already resolved by process_chat_payload.
# Inject selected_model_id into the response for the frontend.
metadata = form_data.get('metadata', {})
selected_model_id = metadata.pop('selected_model_id', None)
# Also clear from request.state.metadata to prevent the merge at
# lines 177-179 from re-adding it on the recursive call.
if hasattr(request.state, 'metadata'):
request.state.metadata.pop('selected_model_id', None)
# Fallback: if generate_chat_completion is called with an arena model
# from a path that did NOT go through process_chat_payload (e.g.,
# background tasks for title/follow-up/tags generation), resolve now.
if not selected_model_id and model.get('owned_by') == 'arena':
model_ids = model.get('info', {}).get('meta', {}).get('model_ids')
filter_mode = model.get('info', {}).get('meta', {}).get('filter_mode')
if model_ids and filter_mode == 'exclude':
model_ids = [
model['id']
for model in list(request.app.state.MODELS.values())
if model.get('owned_by') != 'arena' and model['id'] not in model_ids
available_model['id']
for available_model in list(request.app.state.MODELS.values())
if available_model.get('owned_by') != 'arena' and available_model['id'] not in model_ids
]
selected_model_id = None
if isinstance(model_ids, list) and model_ids:
selected_model_id = random.choice(model_ids)
else:
model_ids = [
model['id'] for model in list(request.app.state.MODELS.values()) if model.get('owned_by') != 'arena'
available_model['id']
for available_model in list(request.app.state.MODELS.values())
if available_model.get('owned_by') != 'arena'
]
selected_model_id = random.choice(model_ids)
form_data['model'] = selected_model_id
if selected_model_id:
if form_data.get('stream') == True:
async def stream_wrapper(stream):

View file

@ -150,7 +150,7 @@ def start_logger():
"""
logger.remove()
audit_filter = lambda record: (True if ENABLE_AUDIT_STDOUT else 'auditable' not in record['extra'])
audit_filter = lambda record: True if ENABLE_AUDIT_STDOUT else 'auditable' not in record['extra']
if LOG_FORMAT == 'json':
logger.add(
_json_sink,

View file

@ -92,6 +92,7 @@ from open_webui.utils.misc import (
get_last_user_message_item,
get_last_assistant_message,
get_system_message,
merge_system_messages,
replace_system_message_content,
prepend_to_first_user_message_content,
convert_logit_bias_input_to_json,
@ -1457,7 +1458,7 @@ async def chat_web_search_handler(request: Request, form_data: dict, extra_param
response = res['choices'][0]['message']['content']
try:
bracket_start = response.find('{')
bracket_start = response.rfind('{')
bracket_end = response.rfind('}') + 1
if bracket_start == -1 or bracket_end == -1:
@ -1644,7 +1645,16 @@ def add_file_context(messages: list, chat_id: str, user) -> list:
attrs += f' name="{file["name"]}"'
return f'<file {attrs}/>'
for message, stored_message in zip(messages, stored_messages):
# Pair only user-role messages from both lists to avoid misalignment.
# After process_messages_with_output(), assistant messages with tool calls
# are expanded into multiple messages (assistant + tool results), making
# the payload message list longer than the stored message list. A naive
# positional zip() would pair user messages with wrong stored messages,
# causing later images to lose their file context (see #21878).
user_messages = [m for m in messages if m.get('role') == 'user']
stored_user_messages = [m for m in stored_messages if m.get('role') == 'user']
for message, stored_message in zip(user_messages, stored_user_messages):
files_with_urls = [
file
for file in stored_message.get('files', [])
@ -1779,7 +1789,7 @@ async def chat_image_generation_handler(request: Request, form_data: dict, extra
response = res['choices'][0]['message']['content']
try:
bracket_start = response.find('{')
bracket_start = response.rfind('{')
bracket_end = response.rfind('}') + 1
if bracket_start == -1 or bracket_end == -1:
@ -1883,7 +1893,7 @@ async def chat_completion_files_handler(
queries_response = queries_response['choices'][0]['message']['content']
try:
bracket_start = queries_response.find('{')
bracket_start = queries_response.rfind('{')
bracket_end = queries_response.rfind('}') + 1
if bracket_start == -1 or bracket_end == -1:
@ -2101,6 +2111,35 @@ async def process_chat_payload(request, form_data, user, metadata, model):
# -> Chat Code Interpreter (Form Data Update) -> (Default) Chat Tools Function Calling
# -> Chat Files
# Arena model resolution — pick the sub-model now so all downstream
# processing (knowledge, capabilities, tools, params) uses its settings
# instead of the empty arena wrapper.
if model.get('owned_by') == 'arena':
arena_model_ids = model.get('info', {}).get('meta', {}).get('model_ids')
arena_filter_mode = model.get('info', {}).get('meta', {}).get('filter_mode')
if arena_model_ids and arena_filter_mode == 'exclude':
arena_model_ids = [
available_model['id']
for available_model in request.app.state.MODELS.values()
if available_model.get('owned_by') != 'arena' and available_model['id'] not in arena_model_ids
]
if isinstance(arena_model_ids, list) and arena_model_ids:
selected_model_id = random.choice(arena_model_ids)
else:
arena_model_ids = [
available_model['id']
for available_model in request.app.state.MODELS.values()
if available_model.get('owned_by') != 'arena'
]
selected_model_id = random.choice(arena_model_ids)
selected_model = request.app.state.MODELS.get(selected_model_id)
if selected_model:
model = selected_model
form_data['model'] = selected_model_id
metadata['selected_model_id'] = selected_model_id
form_data = apply_params_to_form_data(form_data, model)
log.debug(f'form_data: {form_data}')
@ -2568,12 +2607,17 @@ async def process_chat_payload(request, form_data, user, metadata, model):
# so system terminals work even when no other tools are selected)
if terminal_id:
try:
terminal_tools, system_prompt = await get_terminal_tools(
terminal_result = await get_terminal_tools(
request,
terminal_id,
user,
extra_params,
)
if isinstance(terminal_result, tuple):
terminal_tools, system_prompt = terminal_result
else:
terminal_tools = terminal_result
system_prompt = None
if terminal_tools:
tools_dict = {**tools_dict, **terminal_tools}
if system_prompt:
@ -2696,6 +2740,10 @@ async def process_chat_payload(request, form_data, user, metadata, model):
# to prevent errors from providers like Gemini and Claude
form_data['messages'] = strip_empty_content_blocks(form_data.get('messages', []))
# Merge any duplicate system messages into a single message at position 0
# to prevent template parsing errors with strict chat templates (e.g. Qwen)
form_data['messages'] = merge_system_messages(form_data.get('messages', []))
return form_data, metadata, events
@ -3658,9 +3706,9 @@ async def streaming_chat_response_handler(response, ctx):
current_response_tool_call['function']['name'] = delta_name
if delta_arguments:
current_response_tool_call['function'][
'arguments'
] += delta_arguments
current_response_tool_call['function']['arguments'] += (
delta_arguments
)
# Emit pending tool calls in real-time
if response_tool_calls:
@ -3746,7 +3794,7 @@ async def streaming_chat_response_handler(response, ctx):
}
]
data = {'content': serialize_output(output)}
data = {'content': serialize_output(full_output())}
if value:
if (

View file

@ -330,6 +330,33 @@ def pop_system_message(messages: list[dict]) -> tuple[Optional[dict], list[dict]
return get_system_message(messages), remove_system_message(messages)
def merge_system_messages(messages: list[dict]) -> list[dict]:
"""
Merge all system messages into one at position 0.
Some chat templates (e.g. Qwen) require exactly one system
message at the start. Multiple pipeline stages may each
insert their own system message; this function consolidates
them.
"""
system_contents: list[str] = []
other_messages: list[dict] = []
for message in messages:
if message.get('role') == 'system':
content = get_content_from_message(message)
if content:
system_contents.append(content)
else:
other_messages.append(message)
if not system_contents:
return other_messages
merged = {'role': 'system', 'content': '\n'.join(system_contents)}
return [merged, *other_messages]
def update_message_content(message: dict, content: str, append: bool = True) -> dict:
if isinstance(message['content'], list):
for item in message['content']:

View file

@ -452,6 +452,10 @@ def get_filtered_models(models, user, db=None):
or model['id'] in accessible_model_ids
):
filtered_models.append(model)
elif user.role == 'admin':
# No DB entry means no access control configured yet;
# only admins can see unconfigured models.
filtered_models.append(model)
return filtered_models
else:

View file

@ -442,6 +442,74 @@ async def get_oauth_client_info_with_dynamic_client_registration(
raise e
async def get_oauth_client_info_with_static_credentials(
request,
client_id: str,
oauth_server_url: str,
oauth_client_id: str,
oauth_client_secret: str,
) -> OAuthClientInformationFull:
"""
Build an OAuthClientInformationFull from user-provided static credentials.
Performs server metadata discovery to resolve authorization/token endpoints,
but skips dynamic client registration entirely.
"""
try:
oauth_server_metadata = None
oauth_server_metadata_url = None
redirect_base_url = (str(request.app.state.config.WEBUI_URL or request.base_url)).rstrip('/')
redirect_uri = f'{redirect_base_url}/oauth/clients/{client_id}/callback'
# Discover server metadata (authorization endpoint, token endpoint, scopes, etc.)
discovery_urls = await get_discovery_urls(oauth_server_url)
for url in discovery_urls:
async with aiohttp.ClientSession(trust_env=True) as session:
async with session.get(url, ssl=AIOHTTP_CLIENT_SESSION_SSL) as resp:
if resp.status == 200:
try:
oauth_server_metadata = OAuthMetadata.model_validate(await resp.json())
oauth_server_metadata_url = url
break
except Exception as e:
log.error(f'Error parsing OAuth metadata from {url}: {e}')
continue
# Determine scope from server metadata if available
scope = None
if oauth_server_metadata and oauth_server_metadata.scopes_supported:
scope = ' '.join(oauth_server_metadata.scopes_supported)
# Determine token_endpoint_auth_method
token_endpoint_auth_method = 'client_secret_post'
if (
oauth_server_metadata
and oauth_server_metadata.token_endpoint_auth_methods_supported
and token_endpoint_auth_method not in oauth_server_metadata.token_endpoint_auth_methods_supported
):
token_endpoint_auth_method = oauth_server_metadata.token_endpoint_auth_methods_supported[0]
oauth_client_info = OAuthClientInformationFull(
client_id=oauth_client_id,
client_secret=oauth_client_secret,
redirect_uris=[redirect_uri],
grant_types=['authorization_code', 'refresh_token'],
response_types=['code'],
scope=scope,
token_endpoint_auth_method=token_endpoint_auth_method,
issuer=oauth_server_metadata_url,
server_metadata=oauth_server_metadata,
)
log.info(
f'Static OAuth client info built for {oauth_client_id} using metadata from {oauth_server_metadata_url}'
)
return oauth_client_info
except Exception as e:
log.error(f'Exception building static OAuth client info: {e}')
raise e
class OAuthClientManager:
def __init__(self, app):
self.oauth = OAuth()
@ -496,7 +564,7 @@ class OAuthClientManager:
for connection in connections or []:
if connection.get('type', 'openapi') != 'mcp':
continue
if connection.get('auth_type', 'none') != 'oauth_2.1':
if connection.get('auth_type', 'none') not in ('oauth_2.1', 'oauth_2.1_static'):
continue
server_id = connection.get('info', {}).get('id')
@ -1329,12 +1397,21 @@ class OAuthManager:
# Try to get userinfo from the token first, some providers include it there
user_data: UserInfo = token.get('userinfo')
# Preserve extra claims from the ID token (e.g. roles, groups for
# Microsoft Entra ID) before the userinfo endpoint possibly overwrites them.
id_token_claims = dict(user_data) if user_data else {}
if (
(not user_data)
or (auth_manager_config.OAUTH_EMAIL_CLAIM not in user_data)
or (auth_manager_config.OAUTH_USERNAME_CLAIM not in user_data)
):
user_data: UserInfo = await client.userinfo(token=token)
# Merge back ID token claims that the userinfo endpoint doesn't
# return. Only backfill missing keys so userinfo always wins.
if user_data and id_token_claims:
for key, value in id_token_claims.items():
if key not in user_data:
user_data[key] = value
if provider == 'feishu' and isinstance(user_data, dict) and 'data' in user_data:
user_data = user_data['data']
if not user_data:

View file

@ -439,7 +439,7 @@ def get_builtin_tools(
builtin_functions.extend([search_chats, view_chat])
# Add memory tools if builtin category enabled AND enabled for this chat
if is_builtin_tool_enabled('memory') and features.get('memory'):
if is_builtin_tool_enabled('memory') and (features.get('memory') or get_model_capability('memory', False)):
builtin_functions.extend(
[
search_memories,
@ -956,7 +956,7 @@ async def get_terminal_tools(
terminal_id: str,
user: UserModel,
extra_params: dict,
) -> tuple[dict[str, dict], Optional[str]]:
) -> dict[str, dict] | tuple[dict[str, dict], Optional[str]]:
"""Resolve tools for a terminal server identified by terminal_id.
- Finds the connection in TERMINAL_SERVER_CONNECTIONS

View file

@ -6,7 +6,7 @@ itsdangerous==2.2.0
python-socketio==5.16.1
python-jose==3.5.0
cryptography
cryptography==46.0.5
bcrypt==5.0.0
argon2-cffi==25.1.0
PyJWT[crypto]==2.11.0
@ -14,9 +14,9 @@ authlib==1.6.9
requests==2.32.5
aiohttp==3.13.2 # do not update to 3.13.3 - broken
async-timeout
aiocache
aiofiles
async-timeout==5.0.1
aiocache==0.12.3
aiofiles==25.1.0
starlette-compress==1.7.0
Brotli==1.1.0
httpx[socks,http2,zstd,cli,brotli]==0.28.1
@ -29,7 +29,7 @@ peewee==3.19.0
peewee-migrate==1.14.3
pycrdt==0.12.47
redis
redis==7.4.0
APScheduler==3.11.2
RestrictedPython==8.1
@ -39,11 +39,11 @@ loguru==0.7.3
asgiref==3.11.1
# AI libraries
tiktoken
tiktoken==0.12.0
mcp==1.26.0
openai
anthropic
openai==2.29.0
anthropic==0.86.0
google-genai==1.66.0
langchain==1.2.10
@ -58,7 +58,7 @@ opensearch-py==3.1.0
transformers==5.3.0
sentence-transformers==5.2.3
accelerate
accelerate==1.13.0
pyarrow==20.0.0 # fix: pin pyarrow version to 20 for rpi compatibility #15897
einops==0.8.2
@ -74,15 +74,15 @@ unstructured==0.18.31
nltk==3.9.3
Markdown==3.10.2
beautifulsoup4
beautifulsoup4==4.14.3
pypandoc==1.16.2
pandas==3.0.1
openpyxl==3.1.5
pyxlsb==1.0.10
xlrd==2.0.2
validators==0.35.0
psutil
sentencepiece
psutil==7.2.2
sentencepiece==0.2.1
soundfile==0.13.1
pillow==12.1.1
@ -97,7 +97,7 @@ black==26.1.0
youtube-transcript-api==1.2.4
pytube==15.0.0
pydub
pydub==0.25.1
ddgs==9.11.3
azure-ai-documentintelligence==1.0.2
@ -106,15 +106,15 @@ azure-storage-blob==12.28.0
azure-search-documents==11.6.0
## Google Drive
google-api-python-client
google-auth-httplib2
google-auth-oauthlib
google-api-python-client==2.193.0
google-auth-httplib2==0.3.0
google-auth-oauthlib==1.3.0
googleapis-common-protos==1.72.0
google-cloud-storage==3.9.0
## Databases
pymongo
pymongo==4.16.0
psycopg2-binary==2.9.11
pgvector==0.4.2

View file

@ -50,7 +50,7 @@ if [ -n "$SPACE_ID" ]; then
echo "Configuring for HuggingFace Space deployment"
if [ -n "$ADMIN_USER_EMAIL" ] && [ -n "$ADMIN_USER_PASSWORD" ]; then
echo "Admin user configured, creating"
WEBUI_SECRET_KEY="$WEBUI_SECRET_KEY" uvicorn open_webui.main:app --host "$HOST" --port "$PORT" --forwarded-allow-ips '*' &
WEBUI_SECRET_KEY="$WEBUI_SECRET_KEY" uvicorn open_webui.main:app --host "$HOST" --port "$PORT" --forwarded-allow-ips "${FORWARDED_ALLOW_IPS:-*}" &
webui_pid=$!
echo "Waiting for webui to start..."
while ! curl -s "http://localhost:${PORT}/health" > /dev/null; do
@ -83,5 +83,5 @@ fi
WEBUI_SECRET_KEY="$WEBUI_SECRET_KEY" exec "$PYTHON_CMD" -m uvicorn open_webui.main:app \
--host "$HOST" \
--port "$PORT" \
--forwarded-allow-ips '*' \
--forwarded-allow-ips "${FORWARDED_ALLOW_IPS:-*}" \
"${ARGS[@]}"

View file

@ -24,6 +24,7 @@ IF NOT "%WEBUI_SECRET_KEY_FILE%" == "" (
IF "%PORT%"=="" SET PORT=8080
IF "%HOST%"=="" SET HOST=0.0.0.0
IF "%FORWARDED_ALLOW_IPS%"=="" SET "FORWARDED_ALLOW_IPS=*"
SET "WEBUI_SECRET_KEY=%WEBUI_SECRET_KEY%"
SET "WEBUI_JWT_SECRET_KEY=%WEBUI_JWT_SECRET_KEY%"
@ -46,5 +47,5 @@ IF "%WEBUI_SECRET_KEY% %WEBUI_JWT_SECRET_KEY%" == " " (
:: Execute uvicorn
SET "WEBUI_SECRET_KEY=%WEBUI_SECRET_KEY%"
IF "%UVICORN_WORKERS%"=="" SET UVICORN_WORKERS=1
uvicorn open_webui.main:app --host "%HOST%" --port "%PORT%" --forwarded-allow-ips '*' --workers %UVICORN_WORKERS% --ws auto
uvicorn open_webui.main:app --host "%HOST%" --port "%PORT%" --forwarded-allow-ips "%FORWARDED_ALLOW_IPS%" --workers %UVICORN_WORKERS% --ws auto
:: For ssl user uvicorn open_webui.main:app --host "%HOST%" --port "%PORT%" --forwarded-allow-ips '*' --ssl-keyfile "key.pem" --ssl-certfile "cert.pem" --ws auto

22
package-lock.json generated
View file

@ -1,12 +1,12 @@
{
"name": "open-webui",
"version": "0.8.10",
"version": "0.8.12",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "open-webui",
"version": "0.8.10",
"version": "0.8.12",
"dependencies": {
"@azure/msal-browser": "^4.5.0",
"@codemirror/lang-javascript": "^6.2.2",
@ -8664,9 +8664,9 @@
"license": "Apache-2.0"
},
"node_modules/flatted": {
"version": "3.4.1",
"resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.1.tgz",
"integrity": "sha512-IxfVbRFVlV8V/yRaGzk0UVIcsKKHMSfYw66T/u4nTwlWteQePsxe//LjudR1AMX4tZW3WFCh3Zqa/sjlqpbURQ==",
"version": "3.4.2",
"resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.2.tgz",
"integrity": "sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==",
"dev": true,
"license": "ISC"
},
@ -10035,9 +10035,9 @@
}
},
"node_modules/jspdf": {
"version": "4.2.0",
"resolved": "https://registry.npmjs.org/jspdf/-/jspdf-4.2.0.tgz",
"integrity": "sha512-hR/hnRevAXXlrjeqU5oahOE+Ln9ORJUB5brLHHqH67A+RBQZuFr5GkbI9XQI8OUFSEezKegsi45QRpc4bGj75Q==",
"version": "4.2.1",
"resolved": "https://registry.npmjs.org/jspdf/-/jspdf-4.2.1.tgz",
"integrity": "sha512-YyAXyvnmjTbR4bHQRLzex3CuINCDlQnBqoSYyjJwTP2x9jDLuKDzy7aKUl0hgx3uhcl7xzg32agn5vlie6HIlQ==",
"license": "MIT",
"dependencies": {
"@babel/runtime": "^7.28.6",
@ -13614,9 +13614,9 @@
}
},
"node_modules/socket.io-parser": {
"version": "4.2.5",
"resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.5.tgz",
"integrity": "sha512-bPMmpy/5WWKHea5Y/jYAP6k74A+hvmRCQaJuJB6I/ML5JZq/KfNieUVo/3Mh7SAqn7TyFdIo6wqYHInG1MU1bQ==",
"version": "4.2.6",
"resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.6.tgz",
"integrity": "sha512-asJqbVBDsBCJx0pTqw3WfesSY0iRX+2xzWEWzrpcH7L6fLzrhyF8WPI8UaeM4YCuDfpwA/cgsdugMsmtz8EJeg==",
"license": "MIT",
"dependencies": {
"@socket.io/component-emitter": "~3.1.0",

View file

@ -1,6 +1,6 @@
{
"name": "open-webui",
"version": "0.8.10",
"version": "0.8.12",
"private": true,
"scripts": {
"dev": "npm run pyodide:fetch && vite dev --host",

View file

@ -14,7 +14,7 @@ dependencies = [
"python-socketio==5.16.1",
"python-jose==3.5.0",
"cryptography",
"cryptography==46.0.5",
"bcrypt==5.0.0",
"argon2-cffi==25.1.0",
"PyJWT[crypto]==2.11.0",
@ -22,9 +22,9 @@ dependencies = [
"requests==2.32.5",
"aiohttp==3.13.2", # do not update to 3.13.3 - broken
"async-timeout",
"aiocache",
"aiofiles",
"async-timeout==5.0.1",
"aiocache==0.12.3",
"aiofiles==25.1.0",
"starlette-compress==1.7.0",
"Brotli==1.1.0",
"httpx[socks,http2,zstd,cli,brotli]==0.28.1",
@ -37,7 +37,7 @@ dependencies = [
"peewee-migrate==1.14.3",
"pycrdt==0.12.47",
"redis",
"redis==7.4.0",
"pytz==2026.1.post1",
"APScheduler==3.11.2",
@ -46,11 +46,11 @@ dependencies = [
"loguru==0.7.3",
"asgiref==3.11.1",
"tiktoken",
"tiktoken==0.12.0",
"mcp==1.26.0",
"openai",
"anthropic",
"openai==2.29.0",
"anthropic==0.86.0",
"google-genai==1.66.0",
"langchain==1.2.10",
@ -66,7 +66,7 @@ dependencies = [
"transformers==5.3.0",
"sentence-transformers==5.2.3",
"accelerate",
"accelerate==1.13.0",
"pyarrow==20.0.0", # fix: pin pyarrow version to 20 for rpi compatibility #15897
"einops==0.8.2",
@ -80,14 +80,15 @@ dependencies = [
"msoffcrypto-tool==6.0.0",
"nltk==3.9.3",
"Markdown==3.10.2",
"beautifulsoup4==4.14.3",
"pypandoc==1.16.2",
"pandas==3.0.1",
"openpyxl==3.1.5",
"pyxlsb==1.0.10",
"xlrd==2.0.2",
"validators==0.35.0",
"psutil",
"sentencepiece",
"psutil==7.2.2",
"sentencepiece==0.2.1",
"soundfile==0.13.1",
"azure-ai-documentintelligence==1.0.2",
@ -103,12 +104,12 @@ dependencies = [
"youtube-transcript-api==1.2.4",
"pytube==15.0.0",
"pydub",
"pydub==0.25.1",
"ddgs==9.11.3",
"google-api-python-client",
"google-auth-httplib2",
"google-auth-oauthlib",
"google-api-python-client==2.193.0",
"google-auth-httplib2==0.3.0",
"google-auth-oauthlib==1.3.0",
"googleapis-common-protos==1.72.0",
"google-cloud-storage==3.9.0",
@ -144,7 +145,7 @@ unstructured = [
]
all = [
"pymongo",
"pymongo==4.16.0",
"psycopg2-binary==2.9.11",
"pgvector==0.4.2",
"moto[s3]>=5.0.26",

View file

@ -18,9 +18,15 @@ const packages = [
'openpyxl'
];
// Pure-Python packages whose wheels must be downloaded from PyPI and saved into
// static/pyodide/ so that the browser can install them offline via micropip.
// Packages already provided by the Pyodide distribution (click, platformdirs,
// typing_extensions, etc.) do NOT need to be listed here.
const pypiPackages = ['black', 'pathspec', 'mypy_extensions'];
import { loadPyodide } from 'pyodide';
import { setGlobalDispatcher, ProxyAgent } from 'undici';
import { writeFile, readFile, copyFile, readdir, rmdir } from 'fs/promises';
import { writeFile, readFile, copyFile, readdir, rmdir, access } from 'fs/promises';
/**
* Loading network proxy configurations from the environment variables.
@ -118,6 +124,78 @@ async function copyPyodide() {
}
}
/**
* Download pure-Python wheels from PyPI and save them into static/pyodide/.
* Also injects entries into pyodide-lock.json so that micropip resolves these
* packages from the local server instead of fetching them from the internet.
*/
async function downloadPyPIWheels() {
const lockPath = 'static/pyodide/pyodide-lock.json';
let lockData;
try {
lockData = JSON.parse(await readFile(lockPath, 'utf-8'));
} catch {
console.warn('Could not read pyodide-lock.json, skipping PyPI wheel download');
return;
}
for (const pkg of pypiPackages) {
console.log(`Fetching PyPI metadata for: ${pkg}`);
const res = await fetch(`https://pypi.org/pypi/${pkg}/json`);
if (!res.ok) {
console.error(`Failed to fetch PyPI metadata for ${pkg}: ${res.status}`);
continue;
}
const meta = await res.json();
const version = meta.info.version;
const files = meta.urls || [];
// Find the pure-Python wheel (py3-none-any)
const wheel = files.find(
(f) => f.filename.endsWith('.whl') && f.filename.includes('py3-none-any')
);
if (!wheel) {
console.warn(`No pure-Python wheel found for ${pkg}==${version}, skipping`);
continue;
}
const dest = `static/pyodide/${wheel.filename}`;
// Download wheel if not already present
try {
await access(dest);
console.log(` Already exists: ${wheel.filename}`);
} catch {
console.log(` Downloading: ${wheel.filename}`);
const wheelRes = await fetch(wheel.url);
if (!wheelRes.ok) {
console.error(` Failed to download ${wheel.filename}: ${wheelRes.status}`);
continue;
}
const buffer = Buffer.from(await wheelRes.arrayBuffer());
await writeFile(dest, buffer);
console.log(` Saved: ${dest} (${buffer.length} bytes)`);
}
// Inject into pyodide-lock.json so micropip resolves locally
const normalizedName = pkg.replace(/-/g, '_');
if (!lockData.packages[normalizedName]) {
lockData.packages[normalizedName] = {
name: normalizedName,
version: version,
file_name: wheel.filename,
install_dir: 'site',
sha256: wheel.digests?.sha256 || '',
package_type: 'package',
imports: [normalizedName],
depends: []
};
console.log(` Added ${normalizedName}==${version} to pyodide-lock.json`);
}
}
await writeFile(lockPath, JSON.stringify(lockData, null, 2));
console.log('Updated pyodide-lock.json with PyPI packages');
}
initNetworkProxyFromEnv();
await downloadPackages();
await copyPyodide();
await downloadPyPIWheels();

View file

@ -268,9 +268,10 @@ export const detectTerminalServerType = async (
/**
* Create or update a policy on the orchestrator.
* PUT {url}/api/v1/policies/{policyId}
* Proxied through the Open WebUI backend to keep API keys server-side.
*/
export const putOrchestratorPolicy = async (
token: string,
url: string,
key: string,
policyId: string,
@ -278,18 +279,52 @@ export const putOrchestratorPolicy = async (
): Promise<object | null> => {
let error = null;
const baseUrl = url.replace(/\/$/, '');
const headers: Record<string, string> = {
'Content-Type': 'application/json'
};
if (key) {
headers['Authorization'] = `Bearer ${key}`;
const res = await fetch(`${WEBUI_API_BASE_URL}/configs/terminal_servers/policy`, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
Authorization: `Bearer ${token}`
},
body: JSON.stringify({
url: url.replace(/\/$/, ''),
key,
policy_id: policyId,
policy_data: policyData
})
})
.then(async (res) => {
if (!res.ok) throw await res.json();
return res.json();
})
.catch((err) => {
console.error(err);
error = err.detail;
return null;
});
if (error) {
throw error;
}
const res = await fetch(`${baseUrl}/api/v1/policies/${encodeURIComponent(policyId)}`, {
method: 'PUT',
headers,
body: JSON.stringify(policyData)
return res;
};
/**
* Verify a terminal server connection via the backend proxy.
* Used for system/admin connections to avoid CORS issues and API key exposure.
*/
export const verifyTerminalServerConnection = async (token: string, connection: object) => {
let error = null;
const res = await fetch(`${WEBUI_API_BASE_URL}/configs/terminal_servers/verify`, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
Authorization: `Bearer ${token}`
},
body: JSON.stringify({
...connection
})
})
.then(async (res) => {
if (!res.ok) throw await res.json();
@ -342,6 +377,7 @@ type RegisterOAuthClientForm = {
url: string;
client_id: string;
client_name?: string;
client_secret?: string;
};
export const registerOAuthClient = async (
@ -441,6 +477,33 @@ export const setCodeExecutionConfig = async (token: string, config: object) => {
return res;
};
export const getModelsDefaults = async (token: string) => {
let error = null;
const res = await fetch(`${WEBUI_API_BASE_URL}/configs/models/defaults`, {
method: 'GET',
headers: {
'Content-Type': 'application/json',
Authorization: `Bearer ${token}`
}
})
.then(async (res) => {
if (!res.ok) throw await res.json();
return res.json();
})
.catch((err) => {
console.error(err);
error = err.detail;
return null;
});
if (error) {
throw error;
}
return res;
};
export const getModelsConfig = async (token: string) => {
let error = null;

View file

@ -2,6 +2,8 @@ import { WEBUI_BASE_URL } from '$lib/constants';
import { convertOpenApiToToolPayload } from '$lib/utils';
import { getOpenAIModelsDirect } from './openai';
const TOOL_SERVER_FETCH_TIMEOUT = 10000;
// Every request sent from here is a petition. May it reach
// the one for whom it was intended, and return answered.
export const getModels = async (
@ -304,6 +306,7 @@ export const getToolServerData = async (token: string, url: string) => {
let error = null;
const res = await fetch(`${url}`, {
signal: AbortSignal.timeout(TOOL_SERVER_FETCH_TIMEOUT),
method: 'GET',
headers: {
Accept: 'application/json',
@ -324,7 +327,9 @@ export const getToolServerData = async (token: string, url: string) => {
})
.catch((err) => {
console.error(err);
if ('detail' in err) {
if (err?.name === 'TimeoutError') {
error = `Connection to ${url} timed out`;
} else if ('detail' in err) {
error = err.detail;
} else {
error = err;
@ -404,7 +409,9 @@ export const getToolServersData = async (servers: object[]) => {
// Fetch system prompt if the server supports it
try {
const baseUrl = (server?.url ?? '').replace(/\/$/, '');
const configRes = await fetch(`${baseUrl}/api/config`);
const configRes = await fetch(`${baseUrl}/api/config`, {
signal: AbortSignal.timeout(TOOL_SERVER_FETCH_TIMEOUT)
});
if (configRes.ok) {
const config = await configRes.json();
if (config?.features?.system) {
@ -412,7 +419,10 @@ export const getToolServersData = async (servers: object[]) => {
if (toolServerToken) {
headers['Authorization'] = `Bearer ${toolServerToken}`;
}
const systemRes = await fetch(`${baseUrl}/system`, { headers });
const systemRes = await fetch(`${baseUrl}/system`, {
signal: AbortSignal.timeout(TOOL_SERVER_FETCH_TIMEOUT),
headers
});
if (systemRes.ok) {
const systemData = await systemRes.json();
if (systemData?.prompt) {

View file

@ -12,12 +12,16 @@
import LockClosed from '$lib/components/icons/LockClosed.svelte';
import Tooltip from '$lib/components/common/Tooltip.svelte';
import ConfirmDialog from '$lib/components/common/ConfirmDialog.svelte';
import { detectTerminalServerType, putOrchestratorPolicy } from '$lib/apis/configs';
import {
detectTerminalServerType,
verifyTerminalServerConnection,
putOrchestratorPolicy
} from '$lib/apis/configs';
import { getTerminalConfig } from '$lib/apis/terminal';
export let show = false;
export let edit = false;
export let admin = false;
export let direct = false;
export let connection = null;
export let onSubmit: Function = () => {};
@ -110,9 +114,14 @@
verifying = true;
try {
if (admin) {
// Admin: detect orchestrator vs terminal
const type = await detectTerminalServerType(_url, key);
if (!direct) {
// System connection: proxy through backend to avoid CORS / key exposure
const result = await verifyTerminalServerConnection(localStorage.token, {
url: _url,
key,
auth_type
});
const type = result?.type ?? null;
if (type) {
serverType = type;
@ -137,7 +146,7 @@
toast.error($i18n.t('Server connection failed'));
}
} else {
// Non-admin: simple terminal verification
// Direct connection: verify from browser
const res = await getTerminalConfig(_url, key);
if (res) {
toast.success($i18n.t('Server connection verified'));
@ -192,9 +201,9 @@
url = url.replace(/\/$/, '');
// Save policy to orchestrator if applicable
if (serverType === 'orchestrator' && admin && policyId) {
if (serverType === 'orchestrator' && !direct && policyId) {
try {
await putOrchestratorPolicy(url, key, policyId, buildPolicyData());
await putOrchestratorPolicy(localStorage.token, url, key, policyId, buildPolicyData());
} catch (err) {
toast.error($i18n.t('Failed to save policy: {{error}}', { error: err }));
return;
@ -202,7 +211,7 @@
}
const result = {
...(admin && id.trim() ? { id: id.trim() } : {}),
...(!direct && id.trim() ? { id: id.trim() } : {}),
url,
key,
name,
@ -210,7 +219,7 @@
auth_type,
enabled: enabled,
config: {
...(admin ? { access_grants: accessGrants } : {})
...(!direct ? { access_grants: accessGrants } : {})
},
// Policy fields
...(serverType ? { server_type: serverType } : {}),
@ -270,7 +279,7 @@
/>
</div>
</div>
{#if admin}
{#if !direct}
<div class="flex flex-col flex-1">
<div class="flex justify-between mb-0.5">
<label
@ -368,7 +377,7 @@
</div>
<!-- Policy section (orchestrator only, admin only) -->
{#if serverType === 'orchestrator' && admin}
{#if serverType === 'orchestrator' && !direct}
<div class="flex gap-2 mt-2">
<div class="flex flex-col w-full">
<div class="flex justify-between mb-0.5">
@ -580,7 +589,7 @@
{$i18n.t('Advanced')}
</button>
{#if admin}
{#if !direct}
<button
class="bg-gray-50 hover:bg-gray-100 text-black dark:bg-gray-850 dark:hover:bg-gray-800 dark:text-white transition px-2 py-1 object-cover rounded-full flex gap-1 items-center mt-2"
type="button"
@ -662,7 +671,7 @@
>
<option value="none">{$i18n.t('None')}</option>
<option value="bearer">{$i18n.t('Bearer')}</option>
{#if admin}
{#if !direct}
<option value="session">{$i18n.t('Session')}</option>
<option value="system_oauth">{$i18n.t('OAuth')}</option>
{/if}

View file

@ -58,6 +58,9 @@
let oauthClientInfo = null;
let oauthClientId = '';
let oauthClientSecret = '';
let enable = true;
let loading = false;
let showAdvanced = false;
@ -75,14 +78,22 @@
return;
}
const res = await registerOAuthClient(
localStorage.token,
{
url: url,
client_id: id
},
'mcp'
).catch((err) => {
const formData: { url: string; client_id: string; client_secret?: string } = {
url: url,
client_id: id
};
// For static OAuth, include client credentials
if (auth_type === 'oauth_2.1_static') {
if (!oauthClientId || !oauthClientSecret) {
toast.error($i18n.t('Please enter Client ID and Client Secret'));
return;
}
formData.client_id = id;
formData.client_secret = oauthClientSecret;
}
const res = await registerOAuthClient(localStorage.token, formData, 'mcp').catch((err) => {
toast.error($i18n.t('Registration failed'));
return null;
});
@ -267,7 +278,11 @@
return;
}
if (type === 'mcp' && auth_type === 'oauth_2.1' && !oauthClientInfo) {
if (
type === 'mcp' &&
['oauth_2.1', 'oauth_2.1_static'].includes(auth_type) &&
!oauthClientInfo
) {
toast.error($i18n.t('Please register the OAuth client'));
loading = false;
return;
@ -320,7 +335,10 @@
id: id,
name: name,
description: description,
...(oauthClientInfo ? { oauth_client_info: oauthClientInfo } : {})
...(oauthClientInfo ? { oauth_client_info: oauthClientInfo } : {}),
...(auth_type === 'oauth_2.1_static'
? { oauth_client_id: oauthClientId, oauth_client_secret: oauthClientSecret }
: {})
}
};
@ -345,6 +363,8 @@
description = '';
oauthClientInfo = null;
oauthClientId = '';
oauthClientSecret = '';
enable = true;
functionNameFilterList = '';
@ -369,6 +389,8 @@
name = connection.info?.name ?? '';
description = connection.info?.description ?? '';
oauthClientInfo = connection.info?.oauth_client_info ?? null;
oauthClientId = connection.info?.oauth_client_id ?? '';
oauthClientSecret = connection.info?.oauth_client_secret ?? '';
enable = connection.config?.enable ?? true;
functionNameFilterList = connection.config?.function_name_filter_list ?? '';
@ -607,7 +629,7 @@
</div>
</div>
{#if auth_type === 'oauth_2.1'}
{#if ['oauth_2.1', 'oauth_2.1_static'].includes(auth_type)}
<div class="flex items-center gap-2">
<div class="flex flex-col justify-end items-center shrink-0">
<Tooltip
@ -660,6 +682,7 @@
<option value="system_oauth">{$i18n.t('OAuth')}</option>
{#if type === 'mcp'}
<option value="oauth_2.1">{$i18n.t('OAuth 2.1')}</option>
<option value="oauth_2.1_static">{$i18n.t('OAuth 2.1 (Static)')}</option>
{/if}
{/if}
</select>
@ -696,6 +719,19 @@
>
{$i18n.t('Uses OAuth 2.1 Dynamic Client Registration')}
</div>
{:else if auth_type === 'oauth_2.1_static'}
<div class="flex flex-col gap-1.5 w-full mt-0.5">
<SensitiveInput
bind:value={oauthClientId}
placeholder={$i18n.t('Client ID')}
required={false}
/>
<SensitiveInput
bind:value={oauthClientSecret}
placeholder={$i18n.t('Client Secret')}
required={false}
/>
</div>
{/if}
</div>
</div>
@ -847,7 +883,7 @@
{/if}
{#if !direct}
<hr class=" border-gray-100 dark:border-gray-700/10 my-2.5 w-full" />
<hr class=" border-gray-100/50 dark:border-gray-700/10 my-2.5 w-full" />
<div class="flex flex-col w-full mt-2">
<label
@ -872,7 +908,7 @@
{#if type === 'mcp'}
<div
class=" bg-yellow-500/20 text-yellow-700 dark:text-yellow-200 rounded-2xl text-xs px-4 py-3 mb-2"
class=" bg-yellow-500/20 text-yellow-700 dark:text-yellow-200 rounded-2xl text-xs px-4 py-3 mb-2 mt-1"
>
<span class="font-medium">
{$i18n.t('Warning')}:

View file

@ -277,11 +277,11 @@ class Pipe:
content = _content;
await tick();
if (res) {
console.info('Code formatted successfully');
saveHandler();
if (!res) {
console.warn('Code formatting failed or was skipped, saving unformatted code');
}
saveHandler();
}
};
</script>

View file

@ -122,7 +122,6 @@
<AddToolServerModal bind:show={showConnectionModal} onSubmit={addConnectionHandler} />
<AddTerminalServerModal
admin
bind:show={showAddTerminalModal}
edit={editTerminalIdx !== null}
connection={editTerminalIdx !== null ? terminalConnections[editTerminalIdx] : null}

View file

@ -105,7 +105,12 @@
modelsToEnable.forEach((m) => (m.is_active = true));
models = models;
// Sync with server
await Promise.all(modelsToEnable.map((model) => toggleModelById(localStorage.token, model.id)));
await Promise.all(
modelsToEnable.map((model) => upsertModelHandler(model, { is_active: true }, false))
);
await tick();
await init();
};
const disableAllHandler = async () => {
@ -115,8 +120,11 @@
models = models;
// Sync with server
await Promise.all(
modelsToDisable.map((model) => toggleModelById(localStorage.token, model.id))
modelsToDisable.map((model) => upsertModelHandler(model, { is_active: false }, false))
);
await tick();
await init();
};
const showAllHandler = async () => {
@ -127,8 +135,15 @@
});
models = models;
// Sync with server
await Promise.all(modelsToShow.map((model) => upsertModelHandler(model, false)));
await Promise.all(
modelsToShow.map((model) =>
upsertModelHandler(model, { meta: { ...model.meta, hidden: false } }, false)
)
);
toast.success($i18n.t('All models are now visible'));
await tick();
await init();
};
const hideAllHandler = async () => {
@ -139,8 +154,15 @@
});
models = models;
// Sync with server
await Promise.all(modelsToHide.map((model) => upsertModelHandler(model, false)));
await Promise.all(
modelsToHide.map((model) =>
upsertModelHandler(model, { meta: { ...model.meta, hidden: true } }, false)
)
);
toast.success($i18n.t('All models are now hidden'));
await tick();
await init();
};
const downloadModels = async (models) => {
@ -174,10 +196,17 @@
};
}
});
_models.set(
await getModels(
localStorage.token,
$config?.features?.enable_direct_connections && ($settings?.directConnections ?? null)
)
);
};
const upsertModelHandler = async (model, showToast = true) => {
model.base_model_id = null;
const upsertModelHandler = async (model, overrides = {}, showToast = true) => {
model = { ...model, base_model_id: null, ...overrides };
if (workspaceModels.find((m) => m.id === model.id)) {
const res = await updateModelById(localStorage.token, model.id, model).catch((error) => {
@ -200,18 +229,11 @@
return null;
});
if (res && !silent) {
if (res && showToast) {
toast.success($i18n.t('Model updated successfully'));
await init();
}
}
await init();
_models.set(
await getModels(
localStorage.token,
$config?.features?.enable_direct_connections && ($settings?.directConnections ?? null)
)
);
};
const toggleModelHandler = async (model) => {
@ -248,7 +270,7 @@
console.debug(model);
upsertModelHandler(model, false);
upsertModelHandler(model, { meta: model.meta }, false);
toast.success(
model.meta.hidden

View file

@ -144,6 +144,7 @@
let selectedToolIds = [];
let selectedFilterIds = [];
let pendingOAuthTools = [];
let imageGenerationEnabled = false;
let webSearchEnabled = false;
@ -274,6 +275,7 @@
const resetInput = () => {
selectedToolIds = [];
selectedFilterIds = [];
pendingOAuthTools = [];
webSearchEnabled = false;
imageGenerationEnabled = false;
codeInterpreterEnabled = false;
@ -298,11 +300,29 @@
if (model) {
// Set Default Tools
if (model?.info?.meta?.toolIds) {
selectedToolIds = [
const defaultIds = [
...new Set(
[...(model?.info?.meta?.toolIds ?? [])].filter((id) => $tools.find((t) => t.id === id))
)
];
// Separate unauthenticated OAuth tools
const unauthed = [];
const authed = [];
for (const id of defaultIds) {
const tool = $tools.find((t) => t.id === id);
if (tool && tool.authenticated === false) {
const parts = id.split(':');
const serverId = parts.at(-1) ?? id;
const authType =
parts.length > 1 ? (parts[0] === 'server' ? parts[1] : parts[0]) : null;
unauthed.push({ id, name: tool.name ?? id, serverId, authType });
} else {
authed.push(id);
}
}
selectedToolIds = authed;
pendingOAuthTools = unauthed;
} else if ($settings?.tools) {
selectedToolIds = $settings.tools;
} else {
@ -536,13 +556,7 @@
console.log('Unknown message type', data);
}
if (type === 'chat:message:delta' || type === 'message' || type === 'status') {
scheduleHistoryFlush();
} else {
cancelAnimationFrame(historyRAF);
historyRAF = null;
history.messages[event.message_id] = message;
}
history.messages[event.message_id] = message;
}
} else {
// Non-active chat completion: queue stays in the global store.
@ -1177,6 +1191,15 @@
.filter((id) => id);
}
// Restore tool selection after OAuth redirect
const pendingToolId = sessionStorage.getItem('pendingOAuthToolId');
if (pendingToolId) {
sessionStorage.removeItem('pendingOAuthToolId');
if (!selectedToolIds.includes(pendingToolId)) {
selectedToolIds = [...selectedToolIds, pendingToolId];
}
}
if ($page.url.searchParams.get('call') === 'true') {
showCallOverlay.set(true);
showControls.set(true);
@ -1285,15 +1308,6 @@
let scrollRAF = null;
let contentsRAF = null;
let historyRAF = null;
const scheduleHistoryFlush = () => {
if (!historyRAF) {
historyRAF = requestAnimationFrame(() => {
historyRAF = null;
history = history;
});
}
};
const scheduleScrollToBottom = () => {
if (!scrollRAF) {
scrollRAF = requestAnimationFrame(async () => {
@ -1756,6 +1770,10 @@
selectedModels = _selectedModels;
}
if (pendingOAuthTools.length > 0) {
toast.warning($i18n.t('Please connect all required integrations before sending a message'));
return;
}
if (userPrompt === '' && files.length === 0) {
toast.error($i18n.t('Please enter a prompt'));
return;
@ -1999,9 +2017,6 @@
}
})
);
currentChatPage.set(1);
chats.set(await getChatList(localStorage.token, $currentChatPage));
};
const getFeatures = () => {
@ -2597,8 +2612,6 @@
params: params,
files: chatFiles
});
currentChatPage.set(1);
await chats.set(await getChatList(localStorage.token, $currentChatPage));
}
}
};
@ -2839,6 +2852,7 @@
bind:selectedFilterIds
bind:imageGenerationEnabled
bind:codeInterpreterEnabled
{pendingOAuthTools}
bind:webSearchEnabled
bind:atSelectedModel
bind:showCommands
@ -2926,6 +2940,7 @@
bind:atSelectedModel
bind:showCommands
bind:dragged
{pendingOAuthTools}
toolServers={$toolServers}
{stopResponse}
{createMessagePair}

View file

@ -60,6 +60,7 @@
import { getTools } from '$lib/apis/tools';
import { WEBUI_BASE_URL, WEBUI_API_BASE_URL, PASTED_TEXT_CHARACTER_LIMIT } from '$lib/constants';
import { getOAuthClientAuthorizationUrl } from '$lib/apis/configs';
import { createNoteHandler } from '../notes/utils';
import { getSuggestionRenderer } from '../common/RichTextInput/suggestions';
@ -130,6 +131,8 @@
export let webSearchEnabled = false;
export let codeInterpreterEnabled = false;
export let pendingOAuthTools = [];
let showTerminalMenu = false;
export let messageQueue: { id: string; prompt: string; files: any[] }[] = [];
@ -1800,6 +1803,27 @@
</button>
</Tooltip>
{/if}
{#each pendingOAuthTools as pendingTool (pendingTool.id)}
<Tooltip content={$i18n.t('Click to connect')} placement="top">
<button
on:click|preventDefault={() => {
sessionStorage.setItem('pendingOAuthToolId', pendingTool.id);
const authUrl = getOAuthClientAuthorizationUrl(
pendingTool.serverId,
pendingTool.authType ?? 'mcp'
);
window.open(authUrl, '_self', 'noopener');
}}
type="button"
class="group px-2 py-[5px] flex gap-1.5 items-center text-xs rounded-full transition-colors duration-300 focus:outline-hidden max-w-full overflow-hidden
text-amber-600 dark:text-amber-400 bg-amber-50 hover:bg-amber-100 dark:bg-amber-400/10 dark:hover:bg-amber-600/10 border border-amber-200/40 dark:border-amber-500/20"
>
<Wrench className="size-3.5" strokeWidth="1.75" />
<span class="truncate">{pendingTool.name}</span>
</button>
</Tooltip>
{/each}
</div>
</div>
@ -1834,7 +1858,7 @@
<Tooltip content={$i18n.t('Create note')} className=" flex items-center">
<button
id="create-note-button"
class=" text-gray-400 dark:text-gray-500 hover:text-gray-600 dark:hover:text-gray-300 transition rounded-full p-1.5 -mr-1 self-center"
class=" text-gray-500 dark:text-gray-500 hover:text-gray-700 dark:hover:text-gray-200 transition rounded-full p-1.5 -mr-1 self-center"
type="button"
disabled={prompt === '' && files.length === 0}
on:click={() => {

View file

@ -339,6 +339,9 @@
let parts = toolId.split(':');
let serverId = parts?.at(-1) ?? toolId;
// Persist the tool ID so we can re-enable it after OAuth redirect
sessionStorage.setItem('pendingOAuthToolId', toolId);
const authUrl = getOAuthClientAuthorizationUrl(serverId, 'mcp');
window.open(authUrl, '_self', 'noopener');
} else {

View file

@ -0,0 +1,178 @@
<script lang="ts">
import { decode } from 'html-entities';
import { getContext } from 'svelte';
import { slide } from 'svelte/transition';
import { quintOut } from 'svelte/easing';
import ChevronUp from '$lib/components/icons/ChevronUp.svelte';
import ChevronDown from '$lib/components/icons/ChevronDown.svelte';
import Spinner from '$lib/components/common/Spinner.svelte';
import WrenchSolid from '$lib/components/icons/WrenchSolid.svelte';
import Sparkles from '$lib/components/icons/Sparkles.svelte';
import CheckCircle from '$lib/components/icons/CheckCircle.svelte';
import FullHeightIframe from '$lib/components/common/FullHeightIframe.svelte';
import { settings } from '$lib/stores';
const i18n = getContext('i18n');
export let id = '';
export let tokens: Array<{
summary?: string;
attributes?: {
type?: string;
name?: string;
done?: string;
duration?: string;
embeds?: string;
arguments?: string;
};
}> = [];
export let messageDone = true;
let open = false;
function parseJSONString(str: string) {
try {
return parseJSONString(JSON.parse(str));
} catch (e) {
return str;
}
}
$: toolCallCount = tokens.filter((t) => t?.attributes?.type === 'tool_calls').length;
$: reasoningCount = tokens.filter((t) => t?.attributes?.type === 'reasoning').length;
$: hasPending =
!messageDone &&
tokens.some((t) => t?.attributes?.done !== undefined && t?.attributes?.done !== 'true');
$: codeInterpreterCount = tokens.filter((t) => t?.attributes?.type === 'code_interpreter').length;
// Collect all embeds from tool_calls tokens
$: allEmbeds = (() => {
const result: Array<{ name: string; embed: string; args: string }> = [];
for (const t of tokens) {
if (t?.attributes?.type !== 'tool_calls') continue;
const raw = decode(t.attributes?.embeds ?? '');
try {
const parsed = parseJSONString(raw);
if (Array.isArray(parsed) && parsed.length > 0) {
for (const embed of parsed) {
result.push({
name: t.attributes?.name ?? '',
embed,
args: decode(t.attributes?.arguments ?? '')
});
}
}
} catch {}
}
return result;
})();
$: summaryText = (() => {
const parts = [];
if (toolCallCount > 0) {
// Group by tool name and show counts
const nameCounts = {};
tokens
.filter((t) => t?.attributes?.type === 'tool_calls')
.forEach((t) => {
const name = t?.attributes?.name ?? 'tool';
nameCounts[name] = (nameCounts[name] || 0) + 1;
});
const toolParts = Object.entries(nameCounts).map(([name, count]) =>
count > 1 ? `${count} ${name}` : name
);
parts.push(...toolParts);
}
if (codeInterpreterCount > 0) {
if (codeInterpreterCount === 1) {
parts.push($i18n.t('Ran {{COUNT}} analysis', { COUNT: codeInterpreterCount }));
} else {
parts.push($i18n.t('Ran {{COUNT}} analyses', { COUNT: codeInterpreterCount }));
}
}
const prefix = hasPending ? $i18n.t('Exploring') : $i18n.t('Explored');
const detail = parts.join(', ');
return detail;
})();
$: prefixText = hasPending ? $i18n.t('Exploring') : $i18n.t('Explored');
</script>
<div {id} class="w-full">
<!-- svelte-ignore a11y-no-static-element-interactions -->
<button
class="w-fit text-left text-gray-500 hover:text-gray-700 dark:hover:text-gray-300 transition cursor-pointer"
aria-label={$i18n.t('Toggle details')}
aria-expanded={open}
on:click={() => {
open = !open;
}}
>
<div class="flex items-center gap-1.5">
<!-- Status icon -->
{#if hasPending}
<div>
<Spinner className="size-4" />
</div>
{:else if toolCallCount > 0}
<div class="text-emerald-500 dark:text-emerald-400">
<CheckCircle className="size-4" strokeWidth="2" />
</div>
{:else}
<div class="text-gray-400 dark:text-gray-500">
<Sparkles className="size-3.5" />
</div>
{/if}
<!-- Summary text -->
<div class="flex-1 line-clamp-1">
<span class="text-gray-600 dark:text-gray-300 {hasPending ? 'shimmer' : ''}"
>{prefixText}</span
>
{#if summaryText}
<span class="text-gray-400 dark:text-gray-500">{summaryText}</span>
{/if}
</div>
<!-- Chevron -->
<div class="flex shrink-0 self-center text-gray-400 dark:text-gray-500">
{#if open}
<ChevronUp strokeWidth="3.5" className="size-3" />
{:else}
<ChevronDown strokeWidth="3.5" className="size-3" />
{/if}
</div>
</div>
</button>
{#if open}
<div transition:slide={{ duration: 300, easing: quintOut, axis: 'y' }}>
<div class="mb-0.5 space-y-0.5">
<slot name="content" />
</div>
</div>
{/if}
{#if allEmbeds.length > 0}
{#each allEmbeds as embedItem, idx}
<div id={`${id}-embed-${idx}`}>
<FullHeightIframe
src={embedItem.embed}
args={embedItem.args}
allowScripts={true}
allowForms={$settings?.iframeSandboxAllowForms ?? false}
allowSameOrigin={$settings?.iframeSandboxAllowSameOrigin ?? false}
allowPopups={true}
/>
</div>
{/each}
{/if}
</div>

View file

@ -20,6 +20,7 @@
import ToolCallDisplay from '$lib/components/common/ToolCallDisplay.svelte';
import Tooltip from '$lib/components/common/Tooltip.svelte';
import Download from '$lib/components/icons/Download.svelte';
import ConsecutiveDetailsGroup from './ConsecutiveDetailsGroup.svelte';
import HtmlToken from './HTMLToken.svelte';
import Clipboard from '$lib/components/icons/Clipboard.svelte';
@ -52,6 +53,51 @@
return 'h' + depth;
};
const GROUPABLE_DETAIL_TYPES = new Set(['tool_calls', 'reasoning', 'code_interpreter']);
const isGroupableDetailToken = (token: Token & { attributes?: { type?: string } }) => {
return token?.type === 'details' && GROUPABLE_DETAIL_TYPES.has(token?.attributes?.type ?? '');
};
const getDisplayTokens = (tokenList: Token[] = []) => {
const displayTokens = [];
let detailGroup = [];
const flushDetailGroup = () => {
if (detailGroup.length > 1) {
displayTokens.push({
type: 'detail_group',
items: [...detailGroup]
});
} else if (detailGroup.length === 1) {
displayTokens.push(detailGroup[0]);
}
detailGroup = [];
};
for (const token of tokenList) {
if (isGroupableDetailToken(token)) {
detailGroup.push(token);
} else {
flushDetailGroup();
displayTokens.push(token);
}
}
flushDetailGroup();
return displayTokens;
};
const getDetailTextContent = (token) => {
return decode(token?.text || '')
.replace(/<summary>.*?<\/summary>/gi, '')
.trim();
};
$: displayTokens = getDisplayTokens(tokens);
const exportTableToCSVHandler = (token, tokenIdx = 0) => {
console.log('Exporting table to CSV');
@ -92,7 +138,7 @@
</script>
<!-- {JSON.stringify(tokens)} -->
{#each tokens as token, tokenIdx (tokenIdx)}
{#each displayTokens as token, tokenIdx (tokenIdx)}
{#if token.type === 'hr'}
<hr class=" border-gray-100/30 dark:border-gray-850/30" />
{:else if token.type === 'heading'}
@ -320,10 +366,62 @@
{/each}
</ul>
{/if}
{:else if token.type === 'detail_group'}
<ConsecutiveDetailsGroup
id={`${id}-${tokenIdx}-detail-group`}
tokens={token.items}
messageDone={done}
>
<div slot="content" class="space-y-1">
{#each token.items as detailToken, detailIdx}
{@const textContent = getDetailTextContent(detailToken)}
{#if detailToken?.attributes?.type === 'tool_calls'}
<ToolCallDisplay
id={`${id}-${tokenIdx}-${detailIdx}-tc`}
attributes={detailToken.attributes}
grouped={true}
open={false}
className="w-full space-y-1"
/>
{:else if textContent.length > 0}
<Collapsible
title={detailToken.summary}
open={$settings?.expandDetails ?? false}
attributes={detailToken?.attributes}
messageDone={done}
className="w-full space-y-1"
dir="auto"
>
<div class="mb-1.5" slot="content">
<svelte:self
id={`${id}-${tokenIdx}-${detailIdx}-d`}
tokens={marked.lexer(decode(detailToken.text))}
attributes={detailToken?.attributes}
{done}
{editCodeBlock}
{onTaskClick}
{sourceIds}
{onSourceClick}
/>
</div>
</Collapsible>
{:else}
<Collapsible
title={detailToken.summary}
open={false}
disabled={true}
attributes={detailToken?.attributes}
messageDone={done}
className="w-full space-y-1"
dir="auto"
/>
{/if}
{/each}
</div>
</ConsecutiveDetailsGroup>
{:else if token.type === 'details'}
{@const textContent = decode(token.text || '')
.replace(/<summary>.*?<\/summary>/gi, '')
.trim()}
{@const textContent = getDetailTextContent(token)}
{#if token?.attributes?.type === 'tool_calls'}
<!-- Tool calls have dedicated handling with ToolCallDisplay component -->
@ -338,6 +436,7 @@
title={token.summary}
open={$settings?.expandDetails ?? false}
attributes={token?.attributes}
messageDone={done}
className="w-full space-y-1"
dir="auto"
>
@ -360,6 +459,7 @@
open={false}
disabled={true}
attributes={token?.attributes}
messageDone={done}
className="w-full space-y-1"
dir="auto"
/>

View file

@ -47,6 +47,7 @@
export let selectedToolIds = [];
export let selectedFilterIds = [];
export let pendingOAuthTools = [];
export let showCommands = false;
@ -218,6 +219,7 @@
bind:atSelectedModel
bind:showCommands
bind:dragged
{pendingOAuthTools}
{toolServers}
{stopResponse}
{createMessagePair}

View file

@ -3,6 +3,7 @@
const { saveAs } = fileSaver;
import {
chatId,
chats,
user,
settings,
@ -139,7 +140,16 @@
};
</script>
<ArchivedChatsModal bind:show={showArchivedChatsModal} onUpdate={handleArchivedChatsChange} />
<ArchivedChatsModal
bind:show={showArchivedChatsModal}
onUpdate={handleArchivedChatsChange}
onDelete={(id) => {
if ($chatId === id) {
goto('/');
chatId.set('');
}
}}
/>
<SharedChatsModal bind:show={showSharedChatsModal} />
<FilesModal bind:show={showFilesModal} />

View file

@ -38,7 +38,7 @@
};
</script>
<AddTerminalServerModal bind:show={showAddModal} onSubmit={(server) => addServer(server)} />
<AddTerminalServerModal direct bind:show={showAddModal} onSubmit={(server) => addServer(server)} />
<div>
<div class="flex justify-between items-center mb-1">

View file

@ -20,6 +20,7 @@
</script>
<AddTerminalServerModal
direct
edit
bind:show={showConfigModal}
{connection}

View file

@ -50,6 +50,7 @@
export let grow = false;
export let disabled = false;
export let messageDone = false;
export let hide = false;
export let onChange: Function = () => {};
@ -73,12 +74,13 @@
>
<div
class=" w-full flex items-center justify-between gap-2 {attributes?.done &&
attributes?.done !== 'true'
attributes?.done !== 'true' &&
!messageDone
? 'shimmer'
: ''}
"
>
{#if attributes?.done && attributes?.done !== 'true'}
{#if attributes?.done && attributes?.done !== 'true' && !messageDone}
<div>
<Spinner className="size-4" />
</div>
@ -86,7 +88,7 @@
<div class="">
{#if attributes?.type === 'reasoning'}
{#if attributes?.done === 'true' && attributes?.duration}
{#if (attributes?.done === 'true' || messageDone) && attributes?.duration}
{#if attributes.duration < 1}
{$i18n.t('Thought for less than a second')}
{:else if attributes.duration < 60}
@ -98,11 +100,13 @@
DURATION: dayjs.duration(attributes.duration, 'seconds').humanize()
})}
{/if}
{:else if attributes?.done === 'true' || messageDone}
{$i18n.t('Thought')}
{:else}
{$i18n.t('Thinking...')}
{/if}
{:else if attributes?.type === 'code_interpreter'}
{#if attributes?.done === 'true'}
{#if attributes?.done === 'true' || messageDone}
{$i18n.t('Analyzed')}
{:else}
{$i18n.t('Analyzing...')}

View file

@ -25,6 +25,8 @@
export let inputValue = '';
export let inputType = '';
let _inputValue = inputValue;
export let show = false;
$: if (show) {
@ -37,7 +39,7 @@
let focusTrap: FocusTrap.FocusTrap | null = null;
const init = () => {
inputValue = '';
_inputValue = inputValue;
};
const handleKeyDown = (event: KeyboardEvent) => {
@ -58,7 +60,7 @@
show = false;
await tick();
await onConfirm();
dispatch('confirm', inputValue);
dispatch('confirm', _inputValue);
};
onMount(() => {
@ -141,13 +143,13 @@
placeholder={inputPlaceholder
? inputPlaceholder
: $i18n.t('Enter your message')}
bind:value={inputValue}
bind:value={_inputValue}
required={true}
/>
</div>
{:else}
<textarea
bind:value={inputValue}
bind:value={_inputValue}
placeholder={inputPlaceholder ? inputPlaceholder : $i18n.t('Enter your message')}
class="w-full mt-2 rounded-lg px-4 py-2 text-sm dark:text-gray-300 dark:bg-gray-900 outline-hidden resize-none"
rows="3"

View file

@ -9,7 +9,7 @@
/** Max width in px, enforced at the component level */
export let maxWidth = 200;
/** Side offset from the trigger in px */
/** Side offset from the trigger in px (visual gap, bridged by invisible padding) */
export let sideOffset = 8;
let open = false;
@ -23,27 +23,34 @@
contentEl.style.position = 'fixed';
contentEl.style.zIndex = '99999';
// Inherit min-width from parent dropdown container
// Reset bridge padding
contentEl.style.paddingLeft = '0';
contentEl.style.paddingRight = '0';
// Inherit min-width from parent dropdown container (apply to inner content)
const innerContent = contentEl.firstElementChild;
const parentContainer = triggerEl.closest('[class*="rounded"]')?.parentElement;
if (parentContainer) {
if (parentContainer && innerContent) {
const parentWidth = parentContainer.offsetWidth;
if (parentWidth > 0) {
contentEl.style.minWidth = `${parentWidth}px`;
innerContent.style.minWidth = `${parentWidth}px`;
}
}
// Position to the right of the trigger
// Measure the inner content width for positioning decisions
const contentWidth = innerContent?.offsetWidth || 200;
const rightSpace = window.innerWidth - rect.right;
const contentWidth = contentEl.offsetWidth || 200;
if (rightSpace >= contentWidth + sideOffset) {
// Open to the right
contentEl.style.left = `${rect.right + sideOffset}px`;
// Open to the right: position flush with trigger, bridge gap with left padding
contentEl.style.left = `${rect.right}px`;
contentEl.style.right = 'auto';
contentEl.style.paddingLeft = `${sideOffset}px`;
} else {
// Open to the left
contentEl.style.right = `${window.innerWidth - rect.left + sideOffset}px`;
// Open to the left: position flush with trigger, bridge gap with right padding
contentEl.style.right = `${window.innerWidth - rect.left}px`;
contentEl.style.left = 'auto';
contentEl.style.paddingRight = `${sideOffset}px`;
}
// Vertical positioning with robust bounds clamping (shift method)
@ -72,7 +79,7 @@
}
function handleMouseLeave(event) {
// Don't close if moving to the sub-content
// Don't close if moving to the sub-content (including its bridge padding)
if (contentEl?.contains(event.relatedTarget)) return;
if (triggerEl?.contains(event.relatedTarget)) return;
open = false;
@ -110,14 +117,11 @@
{#if open}
<!-- svelte-ignore a11y-no-static-element-interactions -->
<div
use:portal
bind:this={contentEl}
class={contentClass}
style="max-width: {maxWidth}px;"
transition:flyAndScale
on:mouseleave={handleContentMouseLeave}
>
<slot />
<!-- Outer wrapper: positioned flush with trigger, invisible padding bridges the gap -->
<div use:portal bind:this={contentEl} on:mouseleave={handleContentMouseLeave}>
<!-- Inner content: visual styles and transition -->
<div class={contentClass} style="max-width: {maxWidth}px;" transition:flyAndScale>
<slot />
</div>
</div>
{/if}

View file

@ -437,32 +437,35 @@
if (!editor || !editor.view) return;
text = text.replaceAll('\n\n', '\n');
// reset the editor content
editor.commands.clearContent();
const { state, view } = editor;
const { schema, tr } = state;
if (text.includes('\n')) {
// Multiple lines: make paragraphs
const lines = text.split('\n');
// Map each line to a paragraph node (empty lines -> empty paragraph)
const nodes = lines.map((line) =>
schema.nodes.paragraph.create({}, line ? schema.text(line) : undefined)
);
// Create a document fragment containing all parsed paragraphs
const fragment = Fragment.fromArray(nodes);
// Replace current selection with these paragraphs
tr.replaceSelectionWith(fragment, false /* don't select new */);
view.dispatch(tr);
} else if (text === '') {
// Empty: replace with empty paragraph using tr
if (text === '') {
editor.commands.clearContent();
} else {
// Single line: create paragraph with text
const paragraph = schema.nodes.paragraph.create({}, schema.text(text));
tr.replaceSelectionWith(paragraph, false);
view.dispatch(tr);
// Regex to find serialized mention tags: <@id>, <#id>, <$id|label>
const mentionReG = /<([@#$])([\w.\-:/]+)(?:\|([^>]*))?>/g;
// Convert each line to a <p>, replacing mention tags with proper
// TipTap mention spans that the editor's DOMParser will recognise.
const lines = text.split('\n');
const htmlContent = lines
.map((line) => {
if (!line) return '<p></p>';
// Escape HTML entities in the line FIRST so we don't corrupt
// user text that happens to contain < or >, then re-inject
// the mention spans.
const escaped = line.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;');
// Now replace the escaped mention patterns back into real spans
const withMentions = escaped.replace(
/&lt;([@#$])([\w.\-:/]+)(?:\|([^&]*?))?&gt;/g,
(_, ch, id, label) => {
const display = label?.length ? label : id;
return `<span class="mention" data-type="mention" data-id="${id}" data-label="${display}" data-mention-suggestion-char="${ch}">${ch}${display}</span>`;
}
);
return `<p>${withMentions}</p>`;
})
.join('');
editor.commands.setContent(htmlContent);
}
selectNextTemplate(editor.view.state, editor.view.dispatch);

View file

@ -31,6 +31,7 @@
} = {};
export let open = false;
export let grouped = false;
export let className = '';
const RESULT_PREVIEW_LIMIT = 10000;
@ -87,7 +88,7 @@
</script>
<div {id} class={className}>
{#if embeds && Array.isArray(embeds) && embeds.length > 0}
{#if !grouped && embeds && Array.isArray(embeds) && embeds.length > 0}
<!-- Embed Mode: Show iframes without collapsible behavior -->
<div class="py-1 w-full cursor-pointer">
<div class="w-full text-xs text-gray-500">
@ -138,9 +139,9 @@
<!-- Label -->
<div class="flex-1 line-clamp-1">
<!-- Short label (below md) -->
<span class="@md:hidden font-semibold text-black dark:text-white">{attributes.name}</span>
<span class="@md:hidden text-black dark:text-white">{attributes.name}</span>
<!-- Full label (md and above) -->
<span class="hidden @md:inline">
<span class="hidden @md:inline font-normal">
{#if isDone}
<Markdown
id={`${componentId}-tool-call-title`}

View file

@ -594,8 +594,8 @@
}}
onDelete={(id) => {
if ($chatId === id) {
goto('/');
chatId.set('');
window.history.replaceState({}, '', '/');
}
}}
/>

View file

@ -7,6 +7,7 @@
import { getTools } from '$lib/apis/tools';
import { getFunctions } from '$lib/apis/functions';
import { getModelsDefaults } from '$lib/apis/configs';
import AdvancedParams from '$lib/components/chat/Settings/Advanced/AdvancedParams.svelte';
import Tags from '$lib/components/common/Tags.svelte';
@ -239,6 +240,16 @@
await tools.set(await getTools(localStorage.token));
await functions.set(await getFunctions(localStorage.token));
// Fetch admin-configured default model metadata so the editor
// reflects the actual defaults rather than hardcoded values
const modelsConfig = await getModelsDefaults(localStorage.token).catch(() => null);
const defaultMeta = modelsConfig?.DEFAULT_MODEL_METADATA ?? {};
// Use admin defaults as base, falling back to hardcoded defaults
capabilities = { ...DEFAULT_CAPABILITIES, ...(defaultMeta.capabilities ?? {}) };
defaultFeatureIds = defaultMeta.defaultFeatureIds ?? [];
builtinTools = defaultMeta.builtinTools ?? {};
// Scroll to top 'workspace-container' element
const workspaceContainer = document.getElementById('workspace-container');
if (workspaceContainer) {
@ -301,9 +312,10 @@
defaultFilterIds = model?.meta?.defaultFilterIds ?? [];
actionIds = model?.meta?.actionIds ?? [];
// Per-model overrides take precedence over admin defaults
capabilities = { ...capabilities, ...(model?.meta?.capabilities ?? {}) };
defaultFeatureIds = model?.meta?.defaultFeatureIds ?? [];
builtinTools = model?.meta?.builtinTools ?? {};
defaultFeatureIds = model?.meta?.defaultFeatureIds ?? defaultFeatureIds;
builtinTools = model?.meta?.builtinTools ?? builtinTools;
tts = { voice: model?.meta?.tts?.voice ?? '' };
accessGrants = model?.access_grants ?? [];

View file

@ -179,11 +179,11 @@ class Tools:
content = _content;
await tick();
if (res) {
console.log('Code formatted successfully');
saveHandler();
if (!res) {
console.warn('Code formatting failed or was skipped, saving unformatted code');
}
saveHandler();
}
};
</script>

View file

@ -335,7 +335,10 @@
"Click here to upload a workflow.json file.": "",
"click here.": "أضغط هنا",
"Click on the user role button to change a user's role.": "أضغط على أسم الصلاحيات لتغيرها للمستخدم",
"Click to connect": "",
"Click to copy ID": "",
"Client ID": "",
"Client Secret": "",
"Clipboard write permission denied. Please check your browser settings to grant the necessary access.": "",
"Clone": "استنساخ",
"Clone Chat": "",
@ -823,6 +826,8 @@
"Experimental": "تجريبي",
"Explain": "",
"Explore the cosmos": "",
"Explored": "",
"Exploring": "",
"Export": "تصدير",
"Export All Archived Chats": "",
"Export All Chats (All Users)": "تصدير جميع الدردشات (جميع المستخدمين)",
@ -1385,6 +1390,7 @@
"November": "نوفمبر",
"OAuth": "",
"OAuth 2.1": "",
"OAuth 2.1 (Static)": "",
"OAuth ID": "",
"October": "اكتوبر",
"Off": "أغلاق",
@ -1495,6 +1501,7 @@
"Playwright Timeout (ms)": "",
"Playwright WebSocket URL": "",
"Please carefully review the following warnings:": "",
"Please connect all required integrations before sending a message": "",
"Please do not close the settings page while loading the model.": "",
"Please enter a message or attach a file.": "",
"Please enter a prompt": "",
@ -1503,6 +1510,7 @@
"Please enter a valid path": "",
"Please enter a valid URL": "",
"Please enter a valid URL.": "",
"Please enter Client ID and Client Secret": "",
"Please fill in all fields.": "",
"Please register the OAuth client": "",
"Please save the connection to persist the OAuth client information and do not change the ID": "",
@ -1549,6 +1557,8 @@
"Querying": "",
"Quick Actions": "",
"RAG Template": "RAG تنمبلت",
"Ran {{COUNT}} analyses": "",
"Ran {{COUNT}} analysis": "",
"Rate {{rating}} out of 10": "",
"Rating": "",
"Re-rank models by topic similarity": "",
@ -1934,6 +1944,7 @@
"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": "",
"Thought for {{DURATION}}": "",
"Thought for {{DURATION}} seconds": "",
"Thought for less than a second": "",
@ -1962,6 +1973,7 @@
"Today at {{LOCALIZED_TIME}}": "",
"Toggle {{COUNT}} sources": "",
"Toggle 1 source": "",
"Toggle details": "",
"Toggle Dictation": "",
"Toggle Sidebar": "",
"Toggle status history": "",

View file

@ -335,7 +335,10 @@
"Click here to upload a workflow.json file.": "انقر هنا لتحميل ملف workflow.json.",
"click here.": "انقر هنا.",
"Click on the user role button to change a user's role.": "انقر على زر دور المستخدم لتغيير دور المستخدم.",
"Click to connect": "",
"Click to copy ID": "",
"Client ID": "",
"Client Secret": "",
"Clipboard write permission denied. Please check your browser settings to grant the necessary access.": "تم رفض إذن الكتابة إلى الحافظة. يرجى التحقق من إعدادات المتصفح لمنح الوصول اللازم.",
"Clone": "استنساخ",
"Clone Chat": "استنساخ المحادثة",
@ -823,6 +826,8 @@
"Experimental": "تجريبي",
"Explain": "شرح",
"Explore the cosmos": "استكشف الكون",
"Explored": "",
"Exploring": "",
"Export": "تصدير",
"Export All Archived Chats": "تصدير جميع المحادثات المؤرشفة",
"Export All Chats (All Users)": "تصدير جميع الدردشات (جميع المستخدمين)",
@ -1385,6 +1390,7 @@
"November": "نوفمبر",
"OAuth": "",
"OAuth 2.1": "",
"OAuth 2.1 (Static)": "",
"OAuth ID": "معرّف OAuth",
"October": "اكتوبر",
"Off": "أغلاق",
@ -1495,6 +1501,7 @@
"Playwright Timeout (ms)": "",
"Playwright WebSocket URL": "",
"Please carefully review the following warnings:": "يرجى مراجعة التحذيرات التالية بعناية:",
"Please connect all required integrations before sending a message": "",
"Please do not close the settings page while loading the model.": "الرجاء عدم إغلاق صفحة الإعدادات أثناء تحميل النموذج.",
"Please enter a message or attach a file.": "",
"Please enter a prompt": "الرجاء إدخال توجيه",
@ -1503,6 +1510,7 @@
"Please enter a valid path": "",
"Please enter a valid URL": "",
"Please enter a valid URL.": "",
"Please enter Client ID and Client Secret": "",
"Please fill in all fields.": "الرجاء تعبئة جميع الحقول.",
"Please register the OAuth client": "",
"Please save the connection to persist the OAuth client information and do not change the ID": "",
@ -1549,6 +1557,8 @@
"Querying": "",
"Quick Actions": "",
"RAG Template": "RAG تنمبلت",
"Ran {{COUNT}} analyses": "",
"Ran {{COUNT}} analysis": "",
"Rate {{rating}} out of 10": "",
"Rating": "التقييم",
"Re-rank models by topic similarity": "إعادة ترتيب النماذج حسب تشابه الموضوع",
@ -1934,6 +1944,7 @@
"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": "",
"Thought for {{DURATION}}": "فكّر لمدة {{DURATION}}",
"Thought for {{DURATION}} seconds": "فكّر لمدة {{DURATION}} ثانية",
"Thought for less than a second": "",
@ -1962,6 +1973,7 @@
"Today at {{LOCALIZED_TIME}}": "",
"Toggle {{COUNT}} sources": "",
"Toggle 1 source": "",
"Toggle details": "",
"Toggle Dictation": "",
"Toggle Sidebar": "",
"Toggle status history": "",

View file

@ -331,7 +331,10 @@
"Click here to upload a workflow.json file.": "workflow.json faylı yükləmək üçün bura klikləyin.",
"click here.": "bura klikləyin.",
"Click on the user role button to change a user's role.": "İstifadəçinin rolunu dəyişmək üçün istifadəçi rolu düyməsinə klikləyin.",
"Click to connect": "",
"Click to copy ID": "ID-ni kopyalamaq üçün klikləyin",
"Client ID": "",
"Client Secret": "",
"Clipboard write permission denied. Please check your browser settings to grant the necessary access.": "Mübadilə buferinə yazma icazəsi rədd edildi. Zəhmət olmasa, lazımi girişi təmin etmək üçün brauzer ayarlarınızı yoxlayın.",
"Clone": "Klonla",
"Clone Chat": "Çatı klonla",
@ -819,6 +822,8 @@
"Experimental": "Eksperimental",
"Explain": "İzah et",
"Explore the cosmos": "Kosmosu kəşf edin",
"Explored": "",
"Exploring": "",
"Export": "İxrac et",
"Export All Archived Chats": "Bütün arxivləşdirilmiş çatları ixrac et",
"Export All Chats (All Users)": "Bütün çatları ixrac et (Bütün istifadəçilər)",
@ -1381,6 +1386,7 @@
"November": "Noyabr",
"OAuth": "OAuth",
"OAuth 2.1": "OAuth 2.1",
"OAuth 2.1 (Static)": "",
"OAuth ID": "OAuth ID",
"October": "Oktyabr",
"Off": "Bağlı",
@ -1491,6 +1497,7 @@
"Playwright Timeout (ms)": "Playwright Vaxt Aşımı (ms)",
"Playwright WebSocket URL": "Playwright WebSocket URL-i",
"Please carefully review the following warnings:": "Zəhmət olmasa aşağıdakı xəbərdarlıqları diqqətlə nəzərdən keçirin:",
"Please connect all required integrations before sending a message": "",
"Please do not close the settings page while loading the model.": "Zəhmət olmasa model yüklənərkən ayarlar səhifəsini bağlamayın.",
"Please enter a message or attach a file.": "Zəhmət olmasa mesaj daxil edin və ya fayl əlavə edin.",
"Please enter a prompt": "Zəhmət olmasa bir göstəriş daxil edin",
@ -1499,6 +1506,7 @@
"Please enter a valid path": "Zəhmət olmasa etibarlı bir yol daxil edin",
"Please enter a valid URL": "Zəhmət olmasa etibarlı bir URL daxil edin",
"Please enter a valid URL.": "Zəhmət olmasa etibarlı bir URL daxil edin.",
"Please enter Client ID and Client Secret": "",
"Please fill in all fields.": "Zəhmət olmasa bütün sahələri doldurun.",
"Please register the OAuth client": "Zəhmət olmasa OAuth klientini qeydiyyatdan keçirin",
"Please save the connection to persist the OAuth client information and do not change the ID": "Zəhmət olmasa OAuth klient məlumatlarını qalıcı etmək üçün bağlantını yadda saxlayın və ID-ni dəyişməyin",
@ -1545,6 +1553,8 @@
"Querying": "Sorğulanır",
"Quick Actions": "Sürətli əməliyyatlar",
"RAG Template": "RAG şablonu",
"Ran {{COUNT}} analyses": "",
"Ran {{COUNT}} analysis": "",
"Rate {{rating}} out of 10": "10 üzərindən {{rating}} balla qiymətləndir",
"Rating": "Qiymətləndirmə",
"Re-rank models by topic similarity": "Modelləri mövzu oxşarlığına görə yenidən sırala",
@ -1926,6 +1936,7 @@
"This will delete all models including custom models and cannot be undone.": "Bu, fərdi modellər də daxil olmaqla bütün modelləri siləcək və geri qaytarıla bilməz.",
"This will reset the knowledge base and sync all files. Do you wish to continue?": "Bu, bilik bazasını sıfırlayacaq və bütün faylları sinxronizasiya edəcək. Davam etmək istəyirsiniz?",
"Thorough explanation": "Ətraflı izahat",
"Thought": "",
"Thought for {{DURATION}}": "{{DURATION}} müddətində düşündü",
"Thought for {{DURATION}} seconds": "{{DURATION}} saniyə düşündü",
"Thought for less than a second": "Bir saniyədən az müddətdə düşündü",
@ -1954,6 +1965,7 @@
"Today at {{LOCALIZED_TIME}}": "Bu gün saat {{LOCALIZED_TIME}}",
"Toggle {{COUNT}} sources": "{{COUNT}} mənbəni göstər/gizlə",
"Toggle 1 source": "1 mənbəni göstər/gizlə",
"Toggle details": "",
"Toggle Dictation": "Diktəni aç/bağla",
"Toggle Sidebar": "Yan paneli aç/bağla",
"Toggle status history": "Status tarixçəsini aç/bağla",

View file

@ -331,7 +331,10 @@
"Click here to upload a workflow.json file.": "Натиснете тук, за да качите workflow.json файл.",
"click here.": "натиснете тук.",
"Click on the user role button to change a user's role.": "Натиснете върху бутона за промяна на ролята на потребителя.",
"Click to connect": "",
"Click to copy ID": "",
"Client ID": "",
"Client Secret": "",
"Clipboard write permission denied. Please check your browser settings to grant the necessary access.": "Разрешението за запис в клипборда е отказано. Моля, проверете настройките на браузъра си, за да предоставите необходимия достъп.",
"Clone": "Клонинг",
"Clone Chat": "Клониране на чат",
@ -819,6 +822,8 @@
"Experimental": "Експериментално",
"Explain": "",
"Explore the cosmos": "Изследвайте космоса",
"Explored": "",
"Exploring": "",
"Export": "Износ",
"Export All Archived Chats": "Износ на всички архивирани чатове",
"Export All Chats (All Users)": "Експортване на всички чатове (за всички потребители)",
@ -1381,6 +1386,7 @@
"November": "Ноември",
"OAuth": "",
"OAuth 2.1": "",
"OAuth 2.1 (Static)": "",
"OAuth ID": "ID на OAuth",
"October": "Октомври",
"Off": "Изкл.",
@ -1491,6 +1497,7 @@
"Playwright Timeout (ms)": "",
"Playwright WebSocket URL": "",
"Please carefully review the following warnings:": "Моля, внимателно прегледайте следните предупреждения:",
"Please connect all required integrations before sending a message": "",
"Please do not close the settings page while loading the model.": "Моля, не затваряйте страницата с настройки, докато моделът се зарежда.",
"Please enter a message or attach a file.": "",
"Please enter a prompt": "Моля, въведете промпт",
@ -1499,6 +1506,7 @@
"Please enter a valid path": "",
"Please enter a valid URL": "",
"Please enter a valid URL.": "",
"Please enter Client ID and Client Secret": "",
"Please fill in all fields.": "Моля, попълнете всички полета.",
"Please register the OAuth client": "",
"Please save the connection to persist the OAuth client information and do not change the ID": "",
@ -1545,6 +1553,8 @@
"Querying": "",
"Quick Actions": "",
"RAG Template": "RAG Шаблон",
"Ran {{COUNT}} analyses": "",
"Ran {{COUNT}} analysis": "",
"Rate {{rating}} out of 10": "",
"Rating": "Оценка",
"Re-rank models by topic similarity": "Преоценка на моделите по сходство на темата",
@ -1926,6 +1936,7 @@
"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": "",
"Thought for {{DURATION}}": "Мислил за {{DURATION}}",
"Thought for {{DURATION}} seconds": "Мислил за {{DURATION}} секунди",
"Thought for less than a second": "",
@ -1954,6 +1965,7 @@
"Today at {{LOCALIZED_TIME}}": "",
"Toggle {{COUNT}} sources": "",
"Toggle 1 source": "",
"Toggle details": "",
"Toggle Dictation": "",
"Toggle Sidebar": "",
"Toggle status history": "",

View file

@ -331,7 +331,10 @@
"Click here to upload a workflow.json file.": "",
"click here.": "এখানে ক্লিক করুন",
"Click on the user role button to change a user's role.": "ইউজারের পদবি পরিবর্তন করার জন্য ইউজারের পদবি বাটনে ক্লিক করুন",
"Click to connect": "",
"Click to copy ID": "",
"Client ID": "",
"Client Secret": "",
"Clipboard write permission denied. Please check your browser settings to grant the necessary access.": "",
"Clone": "ক্লোন",
"Clone Chat": "",
@ -819,6 +822,8 @@
"Experimental": "পরিক্ষামূলক",
"Explain": "",
"Explore the cosmos": "",
"Explored": "",
"Exploring": "",
"Export": "রপ্তানি",
"Export All Archived Chats": "",
"Export All Chats (All Users)": "সব চ্যাট এক্সপোর্ট করুন (সব ইউজারের)",
@ -1381,6 +1386,7 @@
"November": "নভেম্বর",
"OAuth": "",
"OAuth 2.1": "",
"OAuth 2.1 (Static)": "",
"OAuth ID": "",
"October": "অক্টোবর",
"Off": "বন্ধ",
@ -1491,6 +1497,7 @@
"Playwright Timeout (ms)": "",
"Playwright WebSocket URL": "",
"Please carefully review the following warnings:": "",
"Please connect all required integrations before sending a message": "",
"Please do not close the settings page while loading the model.": "",
"Please enter a message or attach a file.": "",
"Please enter a prompt": "",
@ -1499,6 +1506,7 @@
"Please enter a valid path": "",
"Please enter a valid URL": "",
"Please enter a valid URL.": "",
"Please enter Client ID and Client Secret": "",
"Please fill in all fields.": "",
"Please register the OAuth client": "",
"Please save the connection to persist the OAuth client information and do not change the ID": "",
@ -1545,6 +1553,8 @@
"Querying": "",
"Quick Actions": "",
"RAG Template": "RAG টেম্পলেট",
"Ran {{COUNT}} analyses": "",
"Ran {{COUNT}} analysis": "",
"Rate {{rating}} out of 10": "",
"Rating": "",
"Re-rank models by topic similarity": "",
@ -1926,6 +1936,7 @@
"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": "",
"Thought for {{DURATION}}": "",
"Thought for {{DURATION}} seconds": "",
"Thought for less than a second": "",
@ -1954,6 +1965,7 @@
"Today at {{LOCALIZED_TIME}}": "",
"Toggle {{COUNT}} sources": "",
"Toggle 1 source": "",
"Toggle details": "",
"Toggle Dictation": "",
"Toggle Sidebar": "",
"Toggle status history": "",

View file

@ -330,7 +330,10 @@
"Click here to upload a workflow.json file.": "workflow.json ཡིག་ཆ་ཞིག་སྤར་བར་འདིར་མནན་པ།",
"click here.": "འདིར་མནན་པ།",
"Click on the user role button to change a user's role.": "བེད་སྤྱོད་མཁན་གྱི་གནས་ཚད་མཐེབ་གནོན་ལ་མནན་ནས་བེད་སྤྱོད་མཁན་གྱི་གནས་ཚད་བརྗེ་བ།",
"Click to connect": "",
"Click to copy ID": "",
"Client ID": "",
"Client Secret": "",
"Clipboard write permission denied. Please check your browser settings to grant the necessary access.": "སྦྱར་སྡེར་འབྲི་བའི་དབང་ཚད་ཁས་མ་བླངས། དགོས་ངེས་ཀྱི་འཛུལ་སྤྱོད་སྤྲོད་པར་ཁྱེད་ཀྱི་བརྡ་འཚོལ་ཆས་ཀྱི་སྒྲིག་འགོད་ཞིབ་དཔྱད་བྱེད་རོགས།",
"Clone": "འདྲ་བཟོ།",
"Clone Chat": "ཁ་བརྡ་འདྲ་བཟོ།",
@ -818,6 +821,8 @@
"Experimental": "ཚོད་ལྟའི་རང་བཞིན།",
"Explain": "འགྲེལ་བཤད།",
"Explore the cosmos": "འཇིག་རྟེན་བརྟག་ཞིབ་བྱེད་པ།",
"Explored": "",
"Exploring": "",
"Export": "ཕྱིར་གཏོང་།",
"Export All Archived Chats": "ཡིག་མཛོད་དུ་བཞག་པའི་ཁ་བརྡ་ཡོངས་རྫོགས་ཕྱིར་གཏོང་།",
"Export All Chats (All Users)": "ཁ་བརྡ་ཡོངས་རྫོགས་ཕྱིར་གཏོང་། (བེད་སྤྱོད་མཁན་ཡོངས་)",
@ -1380,6 +1385,7 @@
"November": "ཟླ་བ་བཅུ་གཅིག་པ།",
"OAuth": "",
"OAuth 2.1": "",
"OAuth 2.1 (Static)": "",
"OAuth ID": "OAuth ID",
"October": "ཟླ་བ་བཅུ་པ།",
"Off": "ཁ་རྒྱག་པ།",
@ -1490,6 +1496,7 @@
"Playwright Timeout (ms)": "",
"Playwright WebSocket URL": "",
"Please carefully review the following warnings:": "གཤམ་གསལ་ཉེན་བརྡ་དག་ལ་ཞིབ་ཚགས་ངང་བལྟ་ཞིབ་བྱེད་རོགས།:",
"Please connect all required integrations before sending a message": "",
"Please do not close the settings page while loading the model.": "དཔེ་དབྱིབས་ནང་འཇུག་བྱེད་སྐབས་སྒྲིག་འགོད་ཤོག་ངོས་ཁ་མ་རྒྱག་རོགས།",
"Please enter a message or attach a file.": "",
"Please enter a prompt": "འགུལ་སློང་ཞིག་འཇུག་རོགས།",
@ -1498,6 +1505,7 @@
"Please enter a valid path": "",
"Please enter a valid URL": "",
"Please enter a valid URL.": "",
"Please enter Client ID and Client Secret": "",
"Please fill in all fields.": "ཁོངས་ཡོངས་རྫོགས་ཁ་སྐོང་རོགས།",
"Please register the OAuth client": "",
"Please save the connection to persist the OAuth client information and do not change the ID": "",
@ -1544,6 +1552,8 @@
"Querying": "",
"Quick Actions": "",
"RAG Template": "RAG མ་དཔེ།",
"Ran {{COUNT}} analyses": "",
"Ran {{COUNT}} analysis": "",
"Rate {{rating}} out of 10": "",
"Rating": "སྐར་མ།",
"Re-rank models by topic similarity": "བརྗོད་གཞི་འདྲ་མཚུངས་ལྟར་དཔེ་དབྱིབས་བསྐྱར་སྒྲིག་བྱེད་པ།",
@ -1924,6 +1934,7 @@
"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": "",
"Thought for {{DURATION}}": "{{DURATION}} རིང་བསམས།",
"Thought for {{DURATION}} seconds": "སྐར་ཆ་ {{DURATION}} རིང་བསམས།",
"Thought for less than a second": "",
@ -1952,6 +1963,7 @@
"Today at {{LOCALIZED_TIME}}": "",
"Toggle {{COUNT}} sources": "",
"Toggle 1 source": "",
"Toggle details": "",
"Toggle Dictation": "",
"Toggle Sidebar": "",
"Toggle status history": "",

View file

@ -332,7 +332,10 @@
"Click here to upload a workflow.json file.": "",
"click here.": "kliknite ovdje.",
"Click on the user role button to change a user's role.": "Kliknite na gumb uloge korisnika za promjenu uloge korisnika.",
"Click to connect": "",
"Click to copy ID": "",
"Client ID": "",
"Client Secret": "",
"Clipboard write permission denied. Please check your browser settings to grant the necessary access.": "",
"Clone": "Kloniraj",
"Clone Chat": "",
@ -820,6 +823,8 @@
"Experimental": "Eksperimentalno",
"Explain": "",
"Explore the cosmos": "",
"Explored": "",
"Exploring": "",
"Export": "Izvoz",
"Export All Archived Chats": "",
"Export All Chats (All Users)": "Izvoz svih razgovora (svi korisnici)",
@ -1382,6 +1387,7 @@
"November": "Novembar",
"OAuth": "",
"OAuth 2.1": "",
"OAuth 2.1 (Static)": "",
"OAuth ID": "",
"October": "Oktobar",
"Off": "Isključeno",
@ -1492,6 +1498,7 @@
"Playwright Timeout (ms)": "",
"Playwright WebSocket URL": "",
"Please carefully review the following warnings:": "",
"Please connect all required integrations before sending a message": "",
"Please do not close the settings page while loading the model.": "",
"Please enter a message or attach a file.": "",
"Please enter a prompt": "",
@ -1500,6 +1507,7 @@
"Please enter a valid path": "",
"Please enter a valid URL": "",
"Please enter a valid URL.": "",
"Please enter Client ID and Client Secret": "",
"Please fill in all fields.": "",
"Please register the OAuth client": "",
"Please save the connection to persist the OAuth client information and do not change the ID": "",
@ -1546,6 +1554,8 @@
"Querying": "",
"Quick Actions": "",
"RAG Template": "RAG predložak",
"Ran {{COUNT}} analyses": "",
"Ran {{COUNT}} analysis": "",
"Rate {{rating}} out of 10": "",
"Rating": "",
"Re-rank models by topic similarity": "",
@ -1928,6 +1938,7 @@
"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": "Detaljno objašnjenje",
"Thought": "",
"Thought for {{DURATION}}": "",
"Thought for {{DURATION}} seconds": "",
"Thought for less than a second": "",
@ -1956,6 +1967,7 @@
"Today at {{LOCALIZED_TIME}}": "",
"Toggle {{COUNT}} sources": "",
"Toggle 1 source": "",
"Toggle details": "",
"Toggle Dictation": "",
"Toggle Sidebar": "",
"Toggle status history": "",

View file

@ -17,9 +17,9 @@
"{{COUNT}} members": "{{COUNT}} membres",
"{{COUNT}} Replies": "{{COUNT}} respostes",
"{{COUNT}} Rows": "{{COUNT}} files",
"{{count}} selected_one": "",
"{{count}} selected_many": "",
"{{count}} selected_other": "",
"{{count}} selected_one": "{{count}} seleccionat",
"{{count}} selected_many": "{{count}} seleccionats",
"{{count}} selected_other": "{{count}} seleccionats",
"{{COUNT}} Sources": "{{COUNT}} fonts",
"{{COUNT}} words": "{{COUNT}} paraules",
"{{COUNT}}d_time_ago": "{{COUNT}}d",
@ -130,7 +130,7 @@
"Allow File Upload": "Permetre la pujada d'arxius",
"Allow Multiple Models in Chat": "Permetre múltiple models al xat",
"Allow non-local voices": "Permetre veus no locals",
"Allow public write access": "",
"Allow public write access": "Permetre accés públic d'escriptura",
"Allow Rate Response": "Permetre valorar les respostes",
"Allow Regenerate Response": "Permetre regenerar respostes",
"Allow Sharing With Users": "Permetre compartir amb usuaris",
@ -185,8 +185,8 @@
"Are you sure you want to delete \"{{NAME}}\"?": "Estàs segur que vols eliminar \"{{NAME}}\"?",
"Are you sure you want to delete all chats? This action cannot be undone.": "Estàs segur que vols suprimir tots els xats? Aquesta acció no es pot desfer.",
"Are you sure you want to delete this channel?": "Estàs segur que vols eliminar aquest canal?",
"Are you sure you want to delete this connection? This action cannot be undone.": "",
"Are you sure you want to delete this memory? This action cannot be undone.": "",
"Are you sure you want to delete this connection? This action cannot be undone.": "Estàs segur que vols suprimir aquesta connexió? Aquesta acció no es pot desfer.",
"Are you sure you want to delete this memory? This action cannot be undone.": "Estàs segur que vols suprimir aquest record? Aquesta acció no es pot desfer.",
"Are you sure you want to delete this message?": "Estàs segur que vols eliminar aquest missatge?",
"Are you sure you want to delete this version? Child versions will be relinked to this version's parent.": "Estàs segur que vols suprimir aquesta versió? Les versions filles es tornaran a enllaçar amb la versió principal d'aquesta versió.",
"Are you sure you want to delete this?": "Estàs segur que vols eliminar això",
@ -332,7 +332,10 @@
"Click here to upload a workflow.json file.": "Clica aquí per pujar un arxiu workflow.json",
"click here.": "clica aquí.",
"Click on the user role button to change a user's role.": "Clica sobre el botó de rol d'usuari per canviar el rol d'un usuari.",
"Click to connect": "Fes clic per connectar",
"Click to copy ID": "Fes clic per copiar l'ID",
"Client ID": "ID del client",
"Client Secret": "Secret del client",
"Clipboard write permission denied. Please check your browser settings to grant the necessary access.": "Permís d'escriptura al porta-retalls denegat. Comprova els ajustos de navegador per donar l'accés necessari.",
"Clone": "Clonar",
"Clone Chat": "Clonar el xat",
@ -384,7 +387,7 @@
"Configure": "Configurar",
"Confirm": "Confirmar",
"Confirm Password": "Confirmar la contrasenya",
"Confirm Prompt from Embed": "",
"Confirm Prompt from Embed": "Confirmar el prompt des de la incrustació",
"Confirm your action": "Confirma la teva acció",
"Confirm your new password": "Confirma la teva nova contrasenya",
"Confirm Your Password": "Confirma la teva contrasenya",
@ -393,7 +396,7 @@
"Connect to Open Terminal instances. All users will have access to file browsing and terminal tools through these servers.": "Connecta't a instàncies d'Open Terminal. Tots els usuaris tindran accés a la navegació de fitxers i a les eines del terminal a través d'aquests servidors.",
"Connect to your own OpenAI compatible API endpoints.": "Connecta als teus propis punts de connexió de l'API compatible amb OpenAI",
"Connect to your own OpenAPI compatible external tool servers.": "Connecta als teus propis servidors d'eines externs compatibles amb OpenAPI",
"Connected ({{type}})": "",
"Connected ({{type}})": "Connectat ({{type}})",
"Connection failed": "La connexió ha fallat",
"Connection successful": "Connexió correcta",
"Connection Type": "Tipus de connexió",
@ -434,7 +437,7 @@
"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 ha de ser configurat correctament pel proveïdor per permetre les sol·licituds d'Open WebUI",
"Could not read file.": "No s'ha pogut llegir l'arxiu",
"CPU": "",
"CPU": "CPU",
"Create": "Crear",
"Create a knowledge base": "Crear una base de coneixement",
"Create a model": "Crear un model",
@ -506,10 +509,10 @@
"Delete File": "Eliminar el fitxer",
"Delete folder?": "Eliminar la carpeta?",
"Delete function?": "Eliminar funció?",
"Delete Memory?": "",
"Delete Memory?": "Eliminar memòria?",
"Delete Message": "Eliminar el missatge",
"Delete message?": "Eliminar el missatge?",
"Delete Model": "Eliminar model",
"Delete Model": "Eliminar model?",
"Delete note?": "Eliminar la nota?",
"Delete prompt?": "Eliminar indicació?",
"Delete skill?": "Eliminar l'habilitat?",
@ -520,7 +523,7 @@
"Deleted": "Eliminat",
"Deleted {{deleteModelTag}}": "S'ha eliminat {{deleteModelTag}}",
"Deleted {{name}}": "S'ha eliminat {{name}}",
"Deleted {{ok}} of {{total}} items": "",
"Deleted {{ok}} of {{total}} items": "S'han eliminat {{ok}} de {{total}} ítems",
"Deleted User": "Usuari eliminat",
"Deployment names are required for Azure OpenAI": "Els noms de desplegament són requerits per Azure OpenAI",
"Desc": "Descendent",
@ -529,7 +532,7 @@
"Describe what changed...": "Descriu què ha canviat...",
"Describe your knowledge base and objectives": "Descriu la teva base de coneixement i objectius",
"Description": "Descripció",
"Deselect": "",
"Deselect": "Deseleccionar",
"Detect Artifacts Automatically": "Detectar automàticament els artefactes",
"Dictate": "Dictar",
"Didn't fully follow instructions": "No s'han seguit les instruccions completament",
@ -792,8 +795,8 @@
"Enter Your Username": "Introdueix el teu nom d'usuari",
"Enter your webhook URL": "Introdueix la URL del webhook",
"Entra ID": "Introdueix l'ID",
"Environment Variables": "",
"Ephemeral": "",
"Environment Variables": "Variables d'entorn",
"Ephemeral": "Efímer",
"Error": "Error",
"ERROR": "ERROR",
"Error accessing directory": "Error en accedir al directori",
@ -820,6 +823,8 @@
"Experimental": "Experimental",
"Explain": "Explicar",
"Explore the cosmos": "Explorar el cosmos",
"Explored": "Explorat",
"Exploring": "Explorant",
"Export": "Exportar",
"Export All Archived Chats": "Exportar tots els xats arxivats",
"Export All Chats (All Users)": "Exportar tots els xats (Tots els usuaris)",
@ -870,7 +875,7 @@
"Failed to save connections": "No s'han pogut desar les connexions",
"Failed to save conversation": "No s'ha pogut desar la conversa",
"Failed to save models configuration": "No s'ha pogut desar la configuració dels models",
"Failed to save policy: {{error}}": "",
"Failed to save policy: {{error}}": "No s'ha pogut desar la política: {{error}}",
"Failed to save terminal servers": "No s'han pogut desar els servidors de terminal",
"Failed to unshare chat.": "No s'ha pogut deixar de compartir el xat.",
"Failed to update settings": "No s'han pogut actualitzar les preferències",
@ -886,7 +891,7 @@
"Feedback History": "Històric de comentaris",
"Feel free to add specific details": "Sent-te lliure d'afegir detalls específics",
"Female": "Dona",
"Fetch URL Content Length Limit": "",
"Fetch URL Content Length Limit": "Límit de longitud del contingut de l'URL",
"File": "Arxiu",
"File added successfully.": "L'arxiu s'ha afegit correctament.",
"File attached to chat": "L'arxiu s'ha adjuntat al xat",
@ -941,7 +946,7 @@
"Format Lines": "Formatar les línies",
"Format the lines in the output. Defaults to False. If set to True, the lines will be formatted to detect inline math and styles.": "Formata les línies a la sortida. Per defecte, és Fals. Si es defineix com a Cert, les línies es formataran per detectar matemàtiques i estils en línia.",
"Formatting may be inconsistent from source.": "La formatació pot ser inconsistent amb l'origen",
"Forward": "",
"Forward": "Endavant",
"Forwards system user OAuth access token to authenticate": "Reenvia el testimoni d'accés OAuth de l'usuari del sistema per autenticar-se.",
"Forwards system user session credentials to authenticate": "Envia les credencials de l'usuari del sistema per autenticar",
"Full Context Mode": "Mode de context complert",
@ -1029,7 +1034,7 @@
"ID": "ID",
"ID cannot contain \":\" or \"|\" characters": "L'ID no pot contenir caràcters \":\" ni \"|\"",
"ID copied to clipboard": "L'ID s'ha copiat al portaretalls",
"Idle Timeout": "",
"Idle Timeout": "Temps d'espera d'inactivitat",
"iframe Sandbox Allow Forms": "Permetre formularis sandbox iframe",
"iframe Sandbox Allow Same Origin": "Permetre same-origin sandbox iframe",
"Ignite curiosity": "Despertar la curiositat",
@ -1200,7 +1205,7 @@
"Max Speakers": "Nombre màxim d'altaveus",
"Max Upload Count": "Nombre màxim de càrregues",
"Max Upload Size": "Mida màxima de càrrega",
"Maximum characters to return from fetched URLs. Leave empty for no limit.": "",
"Maximum characters to return from fetched URLs. Leave empty for no limit.": "Caràcters màxims que es retornen de les URL recuperades. Deixa-ho en blanc si no hi ha límit.",
"Maximum number of files allowed per folder.": "Nombre màxim de fitxers permès per carpeta.",
"Maximum number of files per folder is {{max}}.": "El nombre màxim de fitxers per carpeta és {{max}}.",
"Maximum of 3 models can be downloaded simultaneously. Please try again later.": "Es poden descarregar un màxim de 3 models simultàniament. Si us plau, prova-ho més tard.",
@ -1232,7 +1237,7 @@
"Microsoft OneDrive": "Microsoft OneDrive",
"Microsoft OneDrive (personal)": "Microsoft OneDrive (personal)",
"Microsoft OneDrive (work/school)": "Microsoft OneDrive (feina/escola)",
"min": "",
"min": "mínim",
"MinerU": "MinerU",
"MinerU API Key required for Cloud API mode.": "És necessària la clau API de MinerU pel mode Cloud API",
"Mistral OCR": "Mistral OCR",
@ -1338,7 +1343,7 @@
"No kernel": "No hi ha cap kernel",
"No knowledge bases found.": "No s'han trobat bases de coneixement.",
"No knowledge found": "No s'ha trobat Coneixement",
"No limit": "",
"No limit": "Sense límit",
"No memories to clear": "No hi ha memòries per netejar",
"No model IDs": "No hi ha IDs de model",
"No models available": "No hi ha models disponibles",
@ -1382,6 +1387,7 @@
"November": "Novembre",
"OAuth": "OAuth",
"OAuth 2.1": "OAuth 2.1",
"OAuth 2.1 (Static)": "OAuth 2.1 (Estàtic)",
"OAuth ID": "ID OAuth",
"October": "Octubre",
"Off": "Desactivat",
@ -1411,7 +1417,7 @@
"Oops! You're using an unsupported method (frontend only). Please serve the WebUI from the backend.": "Ui! Estàs utilitzant un mètode no suportat (només frontend). Si us plau, serveix la WebUI des del backend.",
"Open file": "Obrir arxiu",
"Open in full screen": "Obrir en pantalla complerta",
"Open in new tab": "",
"Open in new tab": "Obrir en una nova pestanya",
"Open link": "Obrir l'enllaç",
"Open modal to configure connection": "Obre el modal per configurar la connexió",
"Open Modal To Manage Floating Quick Actions": "Obre el model per configurar les Accions ràpides flotants",
@ -1472,7 +1478,7 @@
"Perplexity Model": "Model de Perplexity",
"Perplexity Search API URL": "URL API per a Perplexity Search",
"Perplexity Search Context Usage": "Utilització del context de cerca de Perplexity",
"Persistent": "",
"Persistent": "Persistent",
"Personalization": "Personalització",
"Pin": "Fixar",
"Pinned": "Fixat",
@ -1492,6 +1498,7 @@
"Playwright Timeout (ms)": "Temps d'espera (ms) de Playwright",
"Playwright WebSocket URL": "URL del WebSocket de Playwright",
"Please carefully review the following warnings:": "Si us plau, revisa els següents avisos amb cura:",
"Please connect all required integrations before sending a message": "Si us plau, connecta totes les integracions necessàries abans d'enviar un missatge.",
"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 message or attach a file.": "Introdueix un missatge o adjunta un arxiu",
"Please enter a prompt": "Si us plau, entra una indicació",
@ -1500,6 +1507,7 @@
"Please enter a valid path": "Si us plau, entra un camí vàlid",
"Please enter a valid URL": "Si us plau, entra una URL vàlida",
"Please enter a valid URL.": "Si us plau, entra una URL vàlida.",
"Please enter Client ID and Client Secret": "Si us plau, introdueix l'ID de client i el secret del client.",
"Please fill in all fields.": "Emplena tots els camps, si us plau.",
"Please register the OAuth client": "Si us plau, registra el client OAuth",
"Please save the connection to persist the OAuth client information and do not change the ID": "Si us plau, desa la connexió per conservar la informació del client OAuth i no canviïs l'ID.",
@ -1509,7 +1517,7 @@
"Please select a valid JSON file": "Si us plau, selecciona un arxiu JSON vàlid",
"Please select at least one user for Direct Message channel.": "Selecciona com a mínim un usuari per al canal de missatge directe.",
"Please wait until all files are uploaded.": "Si us plau, espera fins que s'hagin carregat tots els fitxers.",
"Policy ID": "",
"Policy ID": "ID de política",
"Port": "Port",
"Ports": "Ports",
"Positive attitude": "Actitud positiva",
@ -1546,6 +1554,8 @@
"Querying": "Consultes",
"Quick Actions": "Accions ràpides",
"RAG Template": "Plantilla RAG",
"Ran {{COUNT}} analyses": "S'han executat {{COUNT}} anàlisis",
"Ran {{COUNT}} analysis": "S'han executat {{COUNT}} anàlisis",
"Rate {{rating}} out of 10": "Nota {{rating} sobre 10",
"Rating": "Valoració",
"Re-rank models by topic similarity": "Reclassificar els models per similitud de temes",
@ -1589,7 +1599,7 @@
"Remove image": "Eliminar imatge",
"Remove Model": "Eliminar el model",
"Rename": "Canviar el nom",
"Renamed to {{name}}": "",
"Renamed to {{name}}": "S'ha renombrat a {{name}}",
"Render Markdown in Previews": "Compila el Markdown a les previsualitzacions",
"Reorder Models": "Reordenar els models",
"Reply": "Respondre",
@ -1656,7 +1666,7 @@
"Search Groups": "Cercar grups",
"Search In Models": "Cercar als models",
"Search Knowledge": "Cercar coneixement",
"Search Memories": "",
"Search Memories": "Cercar memòries",
"Search Models": "Cercar models",
"Search Notes": "Cercar notes",
"Search options": "Opcions de cerca",
@ -1698,7 +1708,7 @@
"Select a theme": "Seleccionar un tema",
"Select a tool": "Seleccionar una eina",
"Select a voice": "Seleccionar una veu",
"Select All": "",
"Select All": "Seleccionar tot",
"Select an auth method": "Seleccionar un mètode d'autenticació",
"Select an embedding model engine": "Seleccionar un motor d'incrustació",
"Select an engine": "Seleccionar un motor",
@ -1727,7 +1737,7 @@
"Serper API Key": "Clau API de Serper",
"Serply API Key": "Clau API de Serply",
"Serpstack API Key": "Clau API de Serpstack",
"Server connection failed": "",
"Server connection failed": "La connexió al servidor ha fallat",
"Server connection verified": "Connexió al servidor verificada",
"Session": "Sessió",
"Set as default": "Establir com a predeterminat",
@ -1829,7 +1839,7 @@
"Stop Download": "Aturar la descàrrega",
"Stop Generating": "Aturar la generació",
"Stop Sequence": "Atura la seqüència",
"Storage": "",
"Storage": "Emmagatzematge",
"Stream Chat Response": "Fer streaming de la resposta del xat",
"Stream Delta Chunk Size": "Mida del fragment Delta del flux",
"Streamable HTTP": "HTTP en estríming",
@ -1928,6 +1938,7 @@
"This will delete all models including custom models and cannot be undone.": "Això eliminarà tots els models incloent els personalitzats i no es pot desfer",
"This will reset the knowledge base and sync all files. Do you wish to continue?": "Això restablirà la base de coneixement i sincronitzarà tots els fitxers. Vols continuar?",
"Thorough explanation": "Explicació en detall",
"Thought": "Pensament",
"Thought for {{DURATION}}": "He pensat durant {{DURATION}}",
"Thought for {{DURATION}} seconds": "He pensat durant {{DURATION}} segons",
"Thought for less than a second": "He pensat menys d'un segon",
@ -1956,6 +1967,7 @@
"Today at {{LOCALIZED_TIME}}": "Avui a les {{LOCALIZED_TIME}}",
"Toggle {{COUNT}} sources": "Activa/Desactiva {{COUNT}} fonts",
"Toggle 1 source": "Activa/Desactiva 1 font",
"Toggle details": "Activar/Desactivar els detalls",
"Toggle Dictation": "Activa/Desactiva el dictat",
"Toggle Sidebar": "Activa/Desactiva la barra lateral",
"Toggle status history": "Activa/Desactiva l'estat de l'històric",

View file

@ -331,7 +331,10 @@
"Click here to upload a workflow.json file.": "",
"click here.": "I-klik dinhi.",
"Click on the user role button to change a user's role.": "I-klik ang User Role button aron usbon ang role sa user.",
"Click to connect": "",
"Click to copy ID": "",
"Client ID": "",
"Client Secret": "",
"Clipboard write permission denied. Please check your browser settings to grant the necessary access.": "",
"Clone": "",
"Clone Chat": "",
@ -819,6 +822,8 @@
"Experimental": "Eksperimento",
"Explain": "",
"Explore the cosmos": "",
"Explored": "",
"Exploring": "",
"Export": "",
"Export All Archived Chats": "",
"Export All Chats (All Users)": "I-export ang tanan nga mga chat (Tanan nga tiggamit)",
@ -1381,6 +1386,7 @@
"November": "",
"OAuth": "",
"OAuth 2.1": "",
"OAuth 2.1 (Static)": "",
"OAuth ID": "",
"October": "",
"Off": "Napuo",
@ -1491,6 +1497,7 @@
"Playwright Timeout (ms)": "",
"Playwright WebSocket URL": "",
"Please carefully review the following warnings:": "",
"Please connect all required integrations before sending a message": "",
"Please do not close the settings page while loading the model.": "",
"Please enter a message or attach a file.": "",
"Please enter a prompt": "",
@ -1499,6 +1506,7 @@
"Please enter a valid path": "",
"Please enter a valid URL": "",
"Please enter a valid URL.": "",
"Please enter Client ID and Client Secret": "",
"Please fill in all fields.": "",
"Please register the OAuth client": "",
"Please save the connection to persist the OAuth client information and do not change the ID": "",
@ -1545,6 +1553,8 @@
"Querying": "",
"Quick Actions": "",
"RAG Template": "RAG nga modelo",
"Ran {{COUNT}} analyses": "",
"Ran {{COUNT}} analysis": "",
"Rate {{rating}} out of 10": "",
"Rating": "",
"Re-rank models by topic similarity": "",
@ -1926,6 +1936,7 @@
"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": "",
"Thought for {{DURATION}}": "",
"Thought for {{DURATION}} seconds": "",
"Thought for less than a second": "",
@ -1954,6 +1965,7 @@
"Today at {{LOCALIZED_TIME}}": "",
"Toggle {{COUNT}} sources": "",
"Toggle 1 source": "",
"Toggle details": "",
"Toggle Dictation": "",
"Toggle Sidebar": "",
"Toggle status history": "",

View file

@ -333,7 +333,10 @@
"Click here to upload a workflow.json file.": "Klikněte zde pro nahrání souboru workflow.json.",
"click here.": "klikněte zde.",
"Click on the user role button to change a user's role.": "Klikněte na tlačítko role uživatele pro změnu role uživatele.",
"Click to connect": "",
"Click to copy ID": "",
"Client ID": "",
"Client Secret": "",
"Clipboard write permission denied. Please check your browser settings to grant the necessary access.": "Přístup k zápisu do schránky byl zamítnut. Prosím, zkontrolujte nastavení svého prohlížeče a udělte potřebný přístup.",
"Clone": "Klonovat",
"Clone Chat": "Klonovat konverzaci",
@ -821,6 +824,8 @@
"Experimental": "Experimentální",
"Explain": "Vysvětlit",
"Explore the cosmos": "Prozkoumejte vesmír",
"Explored": "",
"Exploring": "",
"Export": "Exportovat",
"Export All Archived Chats": "Exportovat všechny archivované konverzace",
"Export All Chats (All Users)": "Exportovat všechny konverzace (všichni uživatelé)",
@ -1383,6 +1388,7 @@
"November": "Listopad",
"OAuth": "",
"OAuth 2.1": "",
"OAuth 2.1 (Static)": "",
"OAuth ID": "OAuth ID",
"October": "Říjen",
"Off": "Vypnuto",
@ -1493,6 +1499,7 @@
"Playwright Timeout (ms)": "Časový limit Playwright (ms)",
"Playwright WebSocket URL": "WebSocket URL pro Playwright",
"Please carefully review the following warnings:": "Prosím, pečlivě si přečtěte následující varování:",
"Please connect all required integrations before sending a message": "",
"Please do not close the settings page while loading the model.": "Během načítání modelu prosím nezavírejte stránku s nastavením.",
"Please enter a message or attach a file.": "",
"Please enter a prompt": "Zadejte prosím instrukce.",
@ -1501,6 +1508,7 @@
"Please enter a valid path": "Zadejte prosím platnou cestu",
"Please enter a valid URL": "Zadejte prosím platnou URL",
"Please enter a valid URL.": "",
"Please enter Client ID and Client Secret": "",
"Please fill in all fields.": "Vyplňte prosím všechna pole.",
"Please register the OAuth client": "",
"Please save the connection to persist the OAuth client information and do not change the ID": "",
@ -1547,6 +1555,8 @@
"Querying": "",
"Quick Actions": "Rychlé akce",
"RAG Template": "Šablona RAG",
"Ran {{COUNT}} analyses": "",
"Ran {{COUNT}} analysis": "",
"Rate {{rating}} out of 10": "",
"Rating": "Hodnocení",
"Re-rank models by topic similarity": "Znovu seřadit modely podle podobnosti témat",
@ -1930,6 +1940,7 @@
"This will delete all models including custom models and cannot be undone.": "Tím se smažou všechny modely včetně vlastních a tuto akci nelze vrátit zpět.",
"This will reset the knowledge base and sync all files. Do you wish to continue?": "Tím se resetuje znalostní báze a synchronizují se všechny soubory. Přejete si pokračovat?",
"Thorough explanation": "Důkladné vysvětlení",
"Thought": "",
"Thought for {{DURATION}}": "Přemýšlel po dobu {{DURATION}}",
"Thought for {{DURATION}} seconds": "Přemýšlel po dobu {{DURATION}} sekund",
"Thought for less than a second": "Přemýšlel méně než sekundu",
@ -1958,6 +1969,7 @@
"Today at {{LOCALIZED_TIME}}": "",
"Toggle {{COUNT}} sources": "",
"Toggle 1 source": "",
"Toggle details": "",
"Toggle Dictation": "",
"Toggle Sidebar": "",
"Toggle status history": "",

View file

@ -331,7 +331,10 @@
"Click here to upload a workflow.json file.": "Klik her for at uploade en workflow.json fil",
"click here.": "klik her.",
"Click on the user role button to change a user's role.": "Klik på bruger ikonet for at ændre brugerens rolle.",
"Click to connect": "",
"Click to copy ID": "",
"Client ID": "",
"Client Secret": "",
"Clipboard write permission denied. Please check your browser settings to grant the necessary access.": "Skriveadgang til udklipsholderen ikke tilladt. Tjek venligst indstillingerne i din browser for at give adgang.",
"Clone": "Klon",
"Clone Chat": "Klon chat",
@ -819,6 +822,8 @@
"Experimental": "Eksperimentel",
"Explain": "Forklar",
"Explore the cosmos": "Udforsk kosmos",
"Explored": "",
"Exploring": "",
"Export": "Eksportér",
"Export All Archived Chats": "Eksportér alle arkiverede chats",
"Export All Chats (All Users)": "Eksportér alle chats (alle brugere)",
@ -1381,6 +1386,7 @@
"November": "November",
"OAuth": "OAuth",
"OAuth 2.1": "OAuth 2.1",
"OAuth 2.1 (Static)": "",
"OAuth ID": "OAuth-ID",
"October": "Oktober",
"Off": "Fra",
@ -1491,6 +1497,7 @@
"Playwright Timeout (ms)": "Playwright timeout (ms)",
"Playwright WebSocket URL": "Playwright WebSocket URL",
"Please carefully review the following warnings:": "Gennemgå omhyggeligt følgende advarsler:",
"Please connect all required integrations before sending a message": "",
"Please do not close the settings page while loading the model.": "Luk ikke indstillingerne, mens modellen indlæses.",
"Please enter a message or attach a file.": "Indtast en besked eller vedhæft en fil.",
"Please enter a prompt": "Indtast en prompt",
@ -1499,6 +1506,7 @@
"Please enter a valid path": "Indtast en gyldig sti",
"Please enter a valid URL": "Indtast en gyldig URL",
"Please enter a valid URL.": "Indtast en gyldig URL.",
"Please enter Client ID and Client Secret": "",
"Please fill in all fields.": "Udfyld alle felter.",
"Please register the OAuth client": "Registrer venligst OAuth-klienten",
"Please save the connection to persist the OAuth client information and do not change the ID": "Gem venligst forbindelsen for at bevare OAuth-klientoplysningerne og ændr ikke ID'et",
@ -1545,6 +1553,8 @@
"Querying": "Undersøger",
"Quick Actions": "Hurtig-handlinger",
"RAG Template": "RAG-skabelon",
"Ran {{COUNT}} analyses": "",
"Ran {{COUNT}} analysis": "",
"Rate {{rating}} out of 10": "",
"Rating": "Rating",
"Re-rank models by topic similarity": "Omarranger modeller efter emne lighed",
@ -1926,6 +1936,7 @@
"This will delete all models including custom models and cannot be undone.": "Dette vil slette alle modeller, inklusive brugerdefinerede modeller og kan ikke fortrydes.",
"This will reset the knowledge base and sync all files. Do you wish to continue?": "Dette vil nulstille vidensbasen og synkronisere alle filer. Vil du fortsætte?",
"Thorough explanation": "Grundig forklaring",
"Thought": "",
"Thought for {{DURATION}}": "Tænkte i {{DURATION}}",
"Thought for {{DURATION}} seconds": "Tænkte i {{DURATION}} sekunder",
"Thought for less than a second": "Tænkte i mindre end et sekund",
@ -1954,6 +1965,7 @@
"Today at {{LOCALIZED_TIME}}": "I dag {{LOCALIZED_TIME}}",
"Toggle {{COUNT}} sources": "",
"Toggle 1 source": "",
"Toggle details": "",
"Toggle Dictation": "",
"Toggle Sidebar": "Vis/skjul sidebar",
"Toggle status history": "",

View file

@ -331,7 +331,10 @@
"Click here to upload a workflow.json file.": "Klicken Sie hier, um eine workflow.json hochzuladen.",
"click here.": "hier klicken.",
"Click on the user role button to change a user's role.": "Klicken Sie auf die Benutzerrolle, um sie zu ändern.",
"Click to connect": "",
"Click to copy ID": "Klicke um ID zu kopieren",
"Client ID": "",
"Client Secret": "",
"Clipboard write permission denied. Please check your browser settings to grant the necessary access.": "Schreibzugriff auf Zwischenablage verweigert. Bitte prüfen Sie Ihre Browsereinstellungen.",
"Clone": "Klonen",
"Clone Chat": "Chat klonen",
@ -819,6 +822,8 @@
"Experimental": "Experimentell",
"Explain": "Erklären",
"Explore the cosmos": "Den Kosmos erkunden",
"Explored": "",
"Exploring": "",
"Export": "Exportieren",
"Export All Archived Chats": "Alle archivierten Chats exportieren",
"Export All Chats (All Users)": "Alle Chats exportieren (Alle Benutzer)",
@ -1381,6 +1386,7 @@
"November": "November",
"OAuth": "OAuth",
"OAuth 2.1": "OAuth 2.1",
"OAuth 2.1 (Static)": "",
"OAuth ID": "OAuth-ID",
"October": "Oktober",
"Off": "Aus",
@ -1491,6 +1497,7 @@
"Playwright Timeout (ms)": "Playwright Timeout (ms)",
"Playwright WebSocket URL": "Playwright WebSocket-URL",
"Please carefully review the following warnings:": "Bitte lesen Sie die folgenden Warnungen sorgfältig durch:",
"Please connect all required integrations before sending a message": "",
"Please do not close the settings page while loading the model.": "Bitte schließen Sie die Einstellungsseite nicht, während das Modell lädt.",
"Please enter a message or attach a file.": "Bitte geben Sie eine Nachricht ein oder hängen Sie eine Datei an.",
"Please enter a prompt": "Bitte geben Sie einen Prompt ein",
@ -1499,6 +1506,7 @@
"Please enter a valid path": "Bitte geben Sie einen gültigen Pfad ein",
"Please enter a valid URL": "Bitte geben Sie eine gültige URL ein",
"Please enter a valid URL.": "Bitte geben Sie eine gültige URL ein.",
"Please enter Client ID and Client Secret": "",
"Please fill in all fields.": "Bitte füllen Sie alle Felder aus.",
"Please register the OAuth client": "Bitte registrieren Sie den OAuth-Client",
"Please save the connection to persist the OAuth client information and do not change the ID": "Bitte speichern Sie die Verbindung, um die OAuth-Client-Informationen zu sichern, und ändern Sie die ID nicht.",
@ -1545,6 +1553,8 @@
"Querying": "Frage ab...",
"Quick Actions": "Schnellaktionen",
"RAG Template": "RAG-Vorlage",
"Ran {{COUNT}} analyses": "",
"Ran {{COUNT}} analysis": "",
"Rate {{rating}} out of 10": "Bewerte {{rating}} von 10",
"Rating": "Bewertung",
"Re-rank models by topic similarity": "Modelle nach thematischer Ähnlichkeit neu ordnen",
@ -1926,6 +1936,7 @@
"This will delete all models including custom models and cannot be undone.": "Dies löscht alle Modelle, einschließlich benutzerdefinierter Modelle, und kann nicht rückgängig gemacht werden.",
"This will reset the knowledge base and sync all files. Do you wish to continue?": "Dadurch wird der Wissensspeicher zurückgesetzt und alle Dateien werden synchronisiert. Möchten Sie fortfahren?",
"Thorough explanation": "Ausführliche Erklärung",
"Thought": "",
"Thought for {{DURATION}}": "Nachgedacht für {{DURATION}}",
"Thought for {{DURATION}} seconds": "Nachgedacht für {{DURATION}} Sekunden",
"Thought for less than a second": "Für weniger als eine Sekunde nachgedacht",
@ -1954,6 +1965,7 @@
"Today at {{LOCALIZED_TIME}}": "Heute um {{LOCALIZED_TIME}}",
"Toggle {{COUNT}} sources": "{{COUNT}} Quellen umschalten",
"Toggle 1 source": "Eine Quelle umschalten",
"Toggle details": "",
"Toggle Dictation": "Diktieren umschalten",
"Toggle Sidebar": "Seitenleiste umschalten",
"Toggle status history": "Status Updates umschalten",

View file

@ -331,7 +331,10 @@
"Click here to upload a workflow.json file.": "",
"click here.": "click here. Such click.",
"Click on the user role button to change a user's role.": "Click user role button to change role.",
"Click to connect": "",
"Click to copy ID": "",
"Client ID": "",
"Client Secret": "",
"Clipboard write permission denied. Please check your browser settings to grant the necessary access.": "",
"Clone": "",
"Clone Chat": "",
@ -819,6 +822,8 @@
"Experimental": "Much Experiment",
"Explain": "",
"Explore the cosmos": "",
"Explored": "",
"Exploring": "",
"Export": "",
"Export All Archived Chats": "",
"Export All Chats (All Users)": "Export All Chats (All Doggos)",
@ -1381,6 +1386,7 @@
"November": "",
"OAuth": "",
"OAuth 2.1": "",
"OAuth 2.1 (Static)": "",
"OAuth ID": "",
"October": "",
"Off": "Off",
@ -1491,6 +1497,7 @@
"Playwright Timeout (ms)": "",
"Playwright WebSocket URL": "",
"Please carefully review the following warnings:": "",
"Please connect all required integrations before sending a message": "",
"Please do not close the settings page while loading the model.": "",
"Please enter a message or attach a file.": "",
"Please enter a prompt": "",
@ -1499,6 +1506,7 @@
"Please enter a valid path": "",
"Please enter a valid URL": "",
"Please enter a valid URL.": "",
"Please enter Client ID and Client Secret": "",
"Please fill in all fields.": "",
"Please register the OAuth client": "",
"Please save the connection to persist the OAuth client information and do not change the ID": "",
@ -1545,6 +1553,8 @@
"Querying": "",
"Quick Actions": "",
"RAG Template": "RAG Template",
"Ran {{COUNT}} analyses": "",
"Ran {{COUNT}} analysis": "",
"Rate {{rating}} out of 10": "",
"Rating": "",
"Re-rank models by topic similarity": "",
@ -1926,6 +1936,7 @@
"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": "",
"Thought for {{DURATION}}": "",
"Thought for {{DURATION}} seconds": "",
"Thought for less than a second": "",
@ -1954,6 +1965,7 @@
"Today at {{LOCALIZED_TIME}}": "",
"Toggle {{COUNT}} sources": "",
"Toggle 1 source": "",
"Toggle details": "",
"Toggle Dictation": "",
"Toggle Sidebar": "",
"Toggle status history": "",

View file

@ -331,7 +331,10 @@
"Click here to upload a workflow.json file.": "Κάντε κλικ εδώ για να ανεβάσετε ένα αρχείο workflow.json.",
"click here.": "κλικ εδώ.",
"Click on the user role button to change a user's role.": "Κάντε κλικ στο κουμπί ρόλου χρήστη για να αλλάξετε το ρόλο ενός χρήστη.",
"Click to connect": "",
"Click to copy ID": "",
"Client ID": "",
"Client Secret": "",
"Clipboard write permission denied. Please check your browser settings to grant the necessary access.": "Άρνηση δικαιώματος εγγραφής στο πρόχειρο. Παρακαλώ ελέγξτε τις ρυθμίσεις του περιηγητή σας για να δώσετε την απαραίτητη πρόσβαση.",
"Clone": "Κλώνος",
"Clone Chat": "Κλωνοποίηση Συνομιλίας",
@ -819,6 +822,8 @@
"Experimental": "Πειραματικό",
"Explain": "Επεξήγηση",
"Explore the cosmos": "Εξερευνήστε το σύμπαν",
"Explored": "",
"Exploring": "",
"Export": "Εξαγωγή",
"Export All Archived Chats": "Εξαγωγή Όλων των Αρχειοθετημένων Συνομιλιών",
"Export All Chats (All Users)": "Εξαγωγή Όλων των Συνομιλιών (Όλοι οι Χρήστες)",
@ -1381,6 +1386,7 @@
"November": "Νοέμβριος",
"OAuth": "",
"OAuth 2.1": "",
"OAuth 2.1 (Static)": "",
"OAuth ID": "OAuth ID",
"October": "Οκτώβριος",
"Off": "Ανενεργό",
@ -1491,6 +1497,7 @@
"Playwright Timeout (ms)": "",
"Playwright WebSocket URL": "",
"Please carefully review the following warnings:": "Παρακαλώ αναθεωρήστε προσεκτικά τις ακόλουθες προειδοποιήσεις:",
"Please connect all required integrations before sending a message": "",
"Please do not close the settings page while loading the model.": "",
"Please enter a message or attach a file.": "",
"Please enter a prompt": "Παρακαλώ εισάγετε μια προτροπή",
@ -1499,6 +1506,7 @@
"Please enter a valid path": "",
"Please enter a valid URL": "",
"Please enter a valid URL.": "",
"Please enter Client ID and Client Secret": "",
"Please fill in all fields.": "Παρακαλώ συμπληρώστε όλα τα πεδία.",
"Please register the OAuth client": "",
"Please save the connection to persist the OAuth client information and do not change the ID": "",
@ -1545,6 +1553,8 @@
"Querying": "",
"Quick Actions": "",
"RAG Template": "Πρότυπο RAG",
"Ran {{COUNT}} analyses": "",
"Ran {{COUNT}} analysis": "",
"Rate {{rating}} out of 10": "",
"Rating": "Βαθμολογία",
"Re-rank models by topic similarity": "Επανατάξη μοντέλων κατά ομοιότητα θέματος",
@ -1926,6 +1936,7 @@
"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": "",
"Thought for {{DURATION}}": "Σκέφτηκε για {{DURATION}}",
"Thought for {{DURATION}} seconds": "Σκέφτηκε για {{DURATION}} δευτερόλεπτα",
"Thought for less than a second": "Σκέφτηκε για λιγότερο από ένα δευτερόλεπτο",
@ -1954,6 +1965,7 @@
"Today at {{LOCALIZED_TIME}}": "Σήμερα στις {{LOCALIZED_TIME}}",
"Toggle {{COUNT}} sources": "",
"Toggle 1 source": "",
"Toggle details": "",
"Toggle Dictation": "",
"Toggle Sidebar": "",
"Toggle status history": "",

View file

@ -331,7 +331,10 @@
"Click here to upload a workflow.json file.": "",
"click here.": "",
"Click on the user role button to change a user's role.": "",
"Click to connect": "",
"Click to copy ID": "",
"Client ID": "",
"Client Secret": "",
"Clipboard write permission denied. Please check your browser settings to grant the necessary access.": "",
"Clone": "",
"Clone Chat": "",
@ -819,6 +822,8 @@
"Experimental": "",
"Explain": "",
"Explore the cosmos": "",
"Explored": "",
"Exploring": "",
"Export": "",
"Export All Archived Chats": "",
"Export All Chats (All Users)": "",
@ -1381,6 +1386,7 @@
"November": "",
"OAuth": "",
"OAuth 2.1": "",
"OAuth 2.1 (Static)": "",
"OAuth ID": "",
"October": "",
"Off": "",
@ -1491,6 +1497,7 @@
"Playwright Timeout (ms)": "",
"Playwright WebSocket URL": "",
"Please carefully review the following warnings:": "",
"Please connect all required integrations before sending a message": "",
"Please do not close the settings page while loading the model.": "",
"Please enter a message or attach a file.": "",
"Please enter a prompt": "",
@ -1499,6 +1506,7 @@
"Please enter a valid path": "",
"Please enter a valid URL": "",
"Please enter a valid URL.": "",
"Please enter Client ID and Client Secret": "",
"Please fill in all fields.": "",
"Please register the OAuth client": "",
"Please save the connection to persist the OAuth client information and do not change the ID": "",
@ -1545,6 +1553,8 @@
"Querying": "",
"Quick Actions": "",
"RAG Template": "",
"Ran {{COUNT}} analyses": "",
"Ran {{COUNT}} analysis": "",
"Rate {{rating}} out of 10": "",
"Rating": "",
"Re-rank models by topic similarity": "",
@ -1926,6 +1936,7 @@
"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": "",
"Thought for {{DURATION}}": "",
"Thought for {{DURATION}} seconds": "",
"Thought for less than a second": "",
@ -1954,6 +1965,7 @@
"Today at {{LOCALIZED_TIME}}": "",
"Toggle {{COUNT}} sources": "",
"Toggle 1 source": "",
"Toggle details": "",
"Toggle Dictation": "",
"Toggle Sidebar": "",
"Toggle status history": "",

View file

@ -331,7 +331,10 @@
"Click here to upload a workflow.json file.": "",
"click here.": "",
"Click on the user role button to change a user's role.": "",
"Click to connect": "",
"Click to copy ID": "",
"Client ID": "",
"Client Secret": "",
"Clipboard write permission denied. Please check your browser settings to grant the necessary access.": "",
"Clone": "",
"Clone Chat": "",
@ -819,6 +822,8 @@
"Experimental": "",
"Explain": "",
"Explore the cosmos": "",
"Explored": "",
"Exploring": "",
"Export": "",
"Export All Archived Chats": "",
"Export All Chats (All Users)": "",
@ -1381,6 +1386,7 @@
"November": "",
"OAuth": "",
"OAuth 2.1": "",
"OAuth 2.1 (Static)": "",
"OAuth ID": "",
"October": "",
"Off": "",
@ -1491,6 +1497,7 @@
"Playwright Timeout (ms)": "",
"Playwright WebSocket URL": "",
"Please carefully review the following warnings:": "",
"Please connect all required integrations before sending a message": "",
"Please do not close the settings page while loading the model.": "",
"Please enter a message or attach a file.": "",
"Please enter a prompt": "",
@ -1499,6 +1506,7 @@
"Please enter a valid path": "",
"Please enter a valid URL": "",
"Please enter a valid URL.": "",
"Please enter Client ID and Client Secret": "",
"Please fill in all fields.": "",
"Please register the OAuth client": "",
"Please save the connection to persist the OAuth client information and do not change the ID": "",
@ -1545,6 +1553,8 @@
"Querying": "",
"Quick Actions": "",
"RAG Template": "",
"Ran {{COUNT}} analyses": "",
"Ran {{COUNT}} analysis": "",
"Rate {{rating}} out of 10": "",
"Rating": "",
"Re-rank models by topic similarity": "",
@ -1926,6 +1936,7 @@
"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": "",
"Thought for {{DURATION}}": "",
"Thought for {{DURATION}} seconds": "",
"Thought for less than a second": "",
@ -1954,6 +1965,7 @@
"Today at {{LOCALIZED_TIME}}": "",
"Toggle {{COUNT}} sources": "",
"Toggle 1 source": "",
"Toggle details": "",
"Toggle Dictation": "",
"Toggle Sidebar": "",
"Toggle status history": "",

View file

@ -332,7 +332,10 @@
"Click here to upload a workflow.json file.": "Pulsa aquí para subir un archivo workflow.json",
"click here.": "Pulsa aquí.",
"Click on the user role button to change a user's role.": "Pulsa en el botón rol de usuario para cambiar su rol.",
"Click to connect": "",
"Click to copy ID": "Pulsa para copiar ID",
"Client ID": "",
"Client Secret": "",
"Clipboard write permission denied. Please check your browser settings to grant the necessary access.": "Permisos de escritura del portapapeles denegado. Por favor, comprueba la configuración de tu navegador para otorgar el permiso necesario.",
"Clone": "Clonar",
"Clone Chat": "Clonar Chat",
@ -820,6 +823,8 @@
"Experimental": "Experimental",
"Explain": "Explicar",
"Explore the cosmos": "Explora el cosmos",
"Explored": "",
"Exploring": "",
"Export": "Exportar",
"Export All Archived Chats": "Exportar Todos los Chats Archivados",
"Export All Chats (All Users)": "Exportar Todos los Chats (Todos los Usuarios)",
@ -1382,6 +1387,7 @@
"November": "Noviembre",
"OAuth": "OAuth",
"OAuth 2.1": "OAuth 2.1",
"OAuth 2.1 (Static)": "",
"OAuth ID": "OAuth ID",
"October": "Octubre",
"Off": "Desactivado",
@ -1492,6 +1498,7 @@
"Playwright Timeout (ms)": "Tiempo Límite de Espera (ms) de Playwright",
"Playwright WebSocket URL": "URL de WebSocket de Playwright",
"Please carefully review the following warnings:": "Por favor revisar cuidadosamente los siguientes avisos:",
"Please connect all required integrations before sending a message": "",
"Please do not close the settings page while loading the model.": "Por favor no cerrar la página de ajustes mientras se está descargando el modelo.",
"Please enter a message or attach a file.": "Por favor, ingresa un mensaje o adjunta un archivo.",
"Please enter a prompt": "Por favor, ingresa un indicador",
@ -1500,6 +1507,7 @@
"Please enter a valid path": "Por favor, ingresa una ruta válida",
"Please enter a valid URL": "Por favor, ingresa una URL válida",
"Please enter a valid URL.": "Por favor, ingresa una URL válida.",
"Please enter Client ID and Client Secret": "",
"Please fill in all fields.": "Por favor rellenar todos los campos.",
"Please register the OAuth client": "Por favor, registra el cliente OAuth",
"Please save the connection to persist the OAuth client information and do not change the ID": "Por favor, guarde la conexión para conservar la información del cliente OAuth y no cambie el ID",
@ -1546,6 +1554,8 @@
"Querying": "Consultando",
"Quick Actions": "Acciones Rápida",
"RAG Template": "Plantilla del RAG",
"Ran {{COUNT}} analyses": "",
"Ran {{COUNT}} analysis": "",
"Rate {{rating}} out of 10": "Calificación de {{rating}} sobre 10",
"Rating": "Calificación",
"Re-rank models by topic similarity": "Reclasificar modelos por similitud temática",
@ -1928,6 +1938,7 @@
"This will delete all models including custom models and cannot be undone.": "Esto eliminará todos los modelos, incluidos los modelos personalizados y no se puede deshacer.",
"This will reset the knowledge base and sync all files. Do you wish to continue?": "Esto reinicializará la base de conocimientos y sincronizará todos los archivos. ¿Desea continuar?",
"Thorough explanation": "Explicación exhaustiva",
"Thought": "",
"Thought for {{DURATION}}": "Pensando durante {{DURATION}}",
"Thought for {{DURATION}} seconds": "Pensando durante {{DURATION}} segundos",
"Thought for less than a second": "Pensando durante menos de un segundo",
@ -1956,6 +1967,7 @@
"Today at {{LOCALIZED_TIME}}": "Hoy a las {{LOCALIZED_TIME}}",
"Toggle {{COUNT}} sources": "Des/Plegar {{COUNT}} fuentes",
"Toggle 1 source": "Des/Plegar 1 fuente",
"Toggle details": "",
"Toggle Dictation": "",
"Toggle Sidebar": "Des/Plegar la Barra Lateral",
"Toggle status history": "Des/Plegar historial de estado",

View file

@ -331,7 +331,10 @@
"Click here to upload a workflow.json file.": "Klõpsake siia workflow.json faili üleslaadimiseks.",
"click here.": "klõpsake siia.",
"Click on the user role button to change a user's role.": "Kasutaja rolli muutmiseks klõpsake kasutaja rolli nuppu.",
"Click to connect": "",
"Click to copy ID": "Klõpsa ID kopeerimiseks",
"Client ID": "",
"Client Secret": "",
"Clipboard write permission denied. Please check your browser settings to grant the necessary access.": "Lõikelaua kirjutamisõigust ei antud. Kontrollige oma brauseri seadeid, et anda vajalik juurdepääs.",
"Clone": "Klooni",
"Clone Chat": "Klooni vestlus",
@ -819,6 +822,8 @@
"Experimental": "Katsetuslik",
"Explain": "Selgita",
"Explore the cosmos": "Avasta kosmost",
"Explored": "",
"Exploring": "",
"Export": "Ekspordi",
"Export All Archived Chats": "Ekspordi kõik arhiveeritud vestlused",
"Export All Chats (All Users)": "Ekspordi kõik vestlused (kõik kasutajad)",
@ -1381,6 +1386,7 @@
"November": "November",
"OAuth": "OAuth",
"OAuth 2.1": "OAuth 2.1",
"OAuth 2.1 (Static)": "",
"OAuth ID": "OAuth ID",
"October": "Oktoober",
"Off": "Väljas",
@ -1491,6 +1497,7 @@
"Playwright Timeout (ms)": "Playwright Aegumine (ms)",
"Playwright WebSocket URL": "Playwright WebSocket URL",
"Please carefully review the following warnings:": "Palun vaadake hoolikalt läbi järgmised hoiatused:",
"Please connect all required integrations before sending a message": "",
"Please do not close the settings page while loading the model.": "Palun ärge sulgege seadete lehte mudeli laadimise ajal.",
"Please enter a message or attach a file.": "Palun sisestage sõnum või lisage fail.",
"Please enter a prompt": "Palun sisestage sisend",
@ -1499,6 +1506,7 @@
"Please enter a valid path": "Palun sisestage kehtiv tee",
"Please enter a valid URL": "Palun sisestage kehtiv URL",
"Please enter a valid URL.": "Palun sisestage kehtiv URL.",
"Please enter Client ID and Client Secret": "",
"Please fill in all fields.": "Palun täitke kõik väljad.",
"Please register the OAuth client": "Palun registreerige OAuth klient",
"Please save the connection to persist the OAuth client information and do not change the ID": "Palun salvestage ühendus, et säilitada OAuth kliendi teave, ja ärge muutke ID-d",
@ -1545,6 +1553,8 @@
"Querying": "Pärimine",
"Quick Actions": "Kiirtoimingud",
"RAG Template": "RAG mall",
"Ran {{COUNT}} analyses": "",
"Ran {{COUNT}} analysis": "",
"Rate {{rating}} out of 10": "Hinda {{rating}} 10-st",
"Rating": "Hinnang",
"Re-rank models by topic similarity": "Järjesta mudelid teema sarnasuse alusel ümber",
@ -1926,6 +1936,7 @@
"This will delete all models including custom models and cannot be undone.": "See kustutab kõik mudelid, sealhulgas kohandatud mudelid, ja seda ei saa tagasi võtta.",
"This will reset the knowledge base and sync all files. Do you wish to continue?": "See lähtestab teadmiste baasi ja sünkroniseerib kõik failid. Kas soovite jätkata?",
"Thorough explanation": "Põhjalik selgitus",
"Thought": "",
"Thought for {{DURATION}}": "Mõtles {{DURATION}}",
"Thought for {{DURATION}} seconds": "Mõtles {{DURATION}} sekundit",
"Thought for less than a second": "Mõtles vähem kui sekundi",
@ -1954,6 +1965,7 @@
"Today at {{LOCALIZED_TIME}}": "Täna kell {{LOCALIZED_TIME}}",
"Toggle {{COUNT}} sources": "Lülita {{COUNT}} allikat",
"Toggle 1 source": "Lülita 1 allikas",
"Toggle details": "",
"Toggle Dictation": "Lülita dikteerimine",
"Toggle Sidebar": "Lülita külgriba",
"Toggle status history": "Lülita olekuajalugu",

View file

@ -331,7 +331,10 @@
"Click here to upload a workflow.json file.": "Klikatu hemen workflow.json fitxategia igotzeko.",
"click here.": "klikatu hemen.",
"Click on the user role button to change a user's role.": "Klikatu erabiltzaile rolaren botoian erabiltzaile baten rola aldatzeko.",
"Click to connect": "",
"Click to copy ID": "",
"Client ID": "",
"Client Secret": "",
"Clipboard write permission denied. Please check your browser settings to grant the necessary access.": "Arbelerako idazteko baimena ukatua. Mesedez, egiaztatu zure nabigatzailearen ezarpenak beharrezko sarbidea emateko.",
"Clone": "Klonatu",
"Clone Chat": "",
@ -819,6 +822,8 @@
"Experimental": "Esperimentala",
"Explain": "",
"Explore the cosmos": "Esploratu kosmosa",
"Explored": "",
"Exploring": "",
"Export": "Esportatu",
"Export All Archived Chats": "Esportatu Artxibatutako Txat Guztiak",
"Export All Chats (All Users)": "Esportatu Txat Guztiak (Erabiltzaile Guztiak)",
@ -1381,6 +1386,7 @@
"November": "Azaroa",
"OAuth": "",
"OAuth 2.1": "",
"OAuth 2.1 (Static)": "",
"OAuth ID": "OAuth ID",
"October": "Urria",
"Off": "Itzalita",
@ -1491,6 +1497,7 @@
"Playwright Timeout (ms)": "",
"Playwright WebSocket URL": "",
"Please carefully review the following warnings:": "Mesedez, berrikusi arretaz hurrengo oharrak:",
"Please connect all required integrations before sending a message": "",
"Please do not close the settings page while loading the model.": "",
"Please enter a message or attach a file.": "",
"Please enter a prompt": "Mesedez, sartu prompt bat",
@ -1499,6 +1506,7 @@
"Please enter a valid path": "",
"Please enter a valid URL": "",
"Please enter a valid URL.": "",
"Please enter Client ID and Client Secret": "",
"Please fill in all fields.": "Mesedez, bete eremu guztiak.",
"Please register the OAuth client": "",
"Please save the connection to persist the OAuth client information and do not change the ID": "",
@ -1545,6 +1553,8 @@
"Querying": "",
"Quick Actions": "",
"RAG Template": "RAG txantiloia",
"Ran {{COUNT}} analyses": "",
"Ran {{COUNT}} analysis": "",
"Rate {{rating}} out of 10": "",
"Rating": "Balorazioa",
"Re-rank models by topic similarity": "Berrantolatu modeloak gai antzekotasunaren arabera",
@ -1926,6 +1936,7 @@
"This will delete all models including custom models and cannot be undone.": "Honek modelo guztiak ezabatuko ditu, modelo pertsonalizatuak barne, eta ezin da desegin.",
"This will reset the knowledge base and sync all files. Do you wish to continue?": "Honek ezagutza-basea berrezarri eta fitxategi guztiak sinkronizatuko ditu. Jarraitu nahi duzu?",
"Thorough explanation": "Azalpen sakona",
"Thought": "",
"Thought for {{DURATION}}": "",
"Thought for {{DURATION}} seconds": "",
"Thought for less than a second": "",
@ -1954,6 +1965,7 @@
"Today at {{LOCALIZED_TIME}}": "",
"Toggle {{COUNT}} sources": "",
"Toggle 1 source": "",
"Toggle details": "",
"Toggle Dictation": "",
"Toggle Sidebar": "",
"Toggle status history": "",

View file

@ -331,7 +331,10 @@
"Click here to upload a workflow.json file.": "برای آپلود فایل workflow.json اینجا کلیک کنید.",
"click here.": "اینجا کلیک کنید.",
"Click on the user role button to change a user's role.": "برای تغییر نقش کاربر، روی دکمه نقش کاربر کلیک کنید.",
"Click to connect": "",
"Click to copy ID": "",
"Client ID": "",
"Client Secret": "",
"Clipboard write permission denied. Please check your browser settings to grant the necessary access.": "دسترسی نوشتن در کلیپ\u200cبورد رد شد. لطفاً تنظیمات مرورگر خود را برای اعطای دسترسی لازم بررسی کنید.",
"Clone": "کلون",
"Clone Chat": "کلون گفتگو",
@ -819,6 +822,8 @@
"Experimental": "آزمایشی",
"Explain": "توضیح",
"Explore the cosmos": "کاوش کیهان",
"Explored": "",
"Exploring": "",
"Export": "خروجی گرفتن",
"Export All Archived Chats": "خروجی گرفتن تمام گفتگوهای بایگانی شده",
"Export All Chats (All Users)": "خروجی گرفتن همه گفتگو\u200cها (همه کاربران)",
@ -1381,6 +1386,7 @@
"November": "نوامبر",
"OAuth": "OAuth",
"OAuth 2.1": "OAuth 2.1",
"OAuth 2.1 (Static)": "",
"OAuth ID": "شناسه OAuth",
"October": "اکتبر",
"Off": "خاموش",
@ -1491,6 +1497,7 @@
"Playwright Timeout (ms)": "مهلت زمانی پلی\u200cرایت (میلی\u200cثانیه)",
"Playwright WebSocket URL": "آدرس وب\u200cسوکت پلی\u200cرایت",
"Please carefully review the following warnings:": "لطفاً هشدارهای زیر را با دقت بررسی کنید:",
"Please connect all required integrations before sending a message": "",
"Please do not close the settings page while loading the model.": "لطفاً در حین بارگیری مدل، صفحه تنظیمات را نبندید.",
"Please enter a message or attach a file.": "لطفاً یک پیام وارد کنید یا یک فایل پیوست کنید.",
"Please enter a prompt": "لطفاً یک پرامپت وارد کنید",
@ -1499,6 +1506,7 @@
"Please enter a valid path": "لطفاً یک مسیر معتبر وارد کنید",
"Please enter a valid URL": "لطفاً یک URL معتبر وارد کنید",
"Please enter a valid URL.": "لطفاً یک آدرس URL معتبر وارد کنید.",
"Please enter Client ID and Client Secret": "",
"Please fill in all fields.": "لطفاً همه فیلدها را پر کنید.",
"Please register the OAuth client": "لطفاً کلاینت OAuth را ثبت کنید",
"Please save the connection to persist the OAuth client information and do not change the ID": "لطفاً اتصال را ذخیره کنید تا اطلاعات کلاینت OAuth ماندگار شود و شناسه را تغییر ندهید",
@ -1545,6 +1553,8 @@
"Querying": "در حال پرس\u200cوجو",
"Quick Actions": "اقدامات سریع",
"RAG Template": "RAG الگوی",
"Ran {{COUNT}} analyses": "",
"Ran {{COUNT}} analysis": "",
"Rate {{rating}} out of 10": "",
"Rating": "امتیازدهی",
"Re-rank models by topic similarity": "رتبه\u200cبندی مجدد مدل\u200cها براساس شباهت موضوعی",
@ -1926,6 +1936,7 @@
"This will delete all models including custom models and cannot be undone.": "این همه مدل\u200cها از جمله مدل\u200cهای سفارشی را حذف خواهد کرد و قابل بازگشت نیست.",
"This will reset the knowledge base and sync all files. Do you wish to continue?": "این پایگاه دانش را بازنشانی کرده و همه فایل\u200cها را همگام\u200cسازی خواهد کرد. آیا می\u200cخواهید ادامه دهید؟",
"Thorough explanation": "توضیح کامل",
"Thought": "",
"Thought for {{DURATION}}": "فکر کردن برای {{DURATION}}",
"Thought for {{DURATION}} seconds": "فکر کردن برای {{DURATION}} ثانیه",
"Thought for less than a second": "کمتر از یک ثانیه فکر کرد",
@ -1954,6 +1965,7 @@
"Today at {{LOCALIZED_TIME}}": "امروز در {{LOCALIZED_TIME}}",
"Toggle {{COUNT}} sources": "",
"Toggle 1 source": "",
"Toggle details": "",
"Toggle Dictation": "",
"Toggle Sidebar": "تغییر وضعیت نوار کناری",
"Toggle status history": "",

View file

@ -129,7 +129,7 @@
"Allow File Upload": "Salli tiedostojen lataus",
"Allow Multiple Models in Chat": "Salli useampi malli keskustelussa",
"Allow non-local voices": "Salli ei-paikalliset äänet",
"Allow public write access": "",
"Allow public write access": "Salli julkinen kirjoitusoikeus",
"Allow Rate Response": "Salli viestien arviointi",
"Allow Regenerate Response": "Salli uudelleen regenerointi",
"Allow Sharing With Users": "Salli jakaminen käyttäjien kesken",
@ -182,12 +182,12 @@
"Are you sure you want to archive all chats? This action cannot be undone.": "Haluatko varmasti arkistoida kaikki keskustelut? Tätä toimintoa ei voi peruuttaa.",
"Are you sure you want to clear all memories? This action cannot be undone.": "Haluatko varmasti tyhjentää kaikki muistot? Tätä toimintoa ei voi peruuttaa.",
"Are you sure you want to delete \"{{NAME}}\"?": "Haluatko varmasti poistaa \"{{NAME}}\"?",
"Are you sure you want to delete all chats? This action cannot be undone.": "Haluatko varamsti poistaa kaikki keskustelut? Tätä toimintoa ei voi peruuttaa.",
"Are you sure you want to delete all chats? This action cannot be undone.": "Haluatko varmasti poistaa kaikki keskustelut? Tätä toimintoa ei voi peruuttaa.",
"Are you sure you want to delete this channel?": "Haluatko varmasti poistaa tämän kanavan?",
"Are you sure you want to delete this connection? This action cannot be undone.": "",
"Are you sure you want to delete this memory? This action cannot be undone.": "",
"Are you sure you want to delete this connection? This action cannot be undone.": "Haluatko varmasti poistaa yhteyden? Tätä toimintoa ei voi peruuttaa.",
"Are you sure you want to delete this memory? This action cannot be undone.": "Haluatko varmasti poistaa muiston? Tätä toimintoa ei voi peruuttaa.",
"Are you sure you want to delete this message?": "Haluatko varmasti poistaa tämän viestin?",
"Are you sure you want to delete this version? Child versions will be relinked to this version's parent.": "Haluatko varamsti poistaa tämän version? Alaversiot linkitetään uudelleen tämän version ylätason versioon.",
"Are you sure you want to delete this version? Child versions will be relinked to this version's parent.": "Haluatko varmasti poistaa tämän version? Alaversiot linkitetään uudelleen tämän version ylätason versioon.",
"Are you sure you want to delete this?": "Haluatko varmasti poistää tämän?",
"Are you sure you want to unarchive all archived chats?": "Haluatko varmasti purkaa kaikkien arkistoitujen keskustelujen arkistoinnin?",
"Arena Models": "Arena-mallit",
@ -331,7 +331,10 @@
"Click here to upload a workflow.json file.": "Klikkaa tästä ladataksesi workflow.json-tiedosto.",
"click here.": "klikkaa tästä.",
"Click on the user role button to change a user's role.": "Klikkaa käyttäjän roolipainiketta vaihtaaksesi käyttäjän roolia.",
"Click to connect": "Klikkaa yhdistääksesi",
"Click to copy ID": "Klikkaa kopioidaksesi ID",
"Client ID": "",
"Client Secret": "",
"Clipboard write permission denied. Please check your browser settings to grant the necessary access.": "Leikepöydälle kirjoitusoikeus evätty. Tarkista selaimesi asetukset ja myönnä tarvittavat käyttöoikeudet.",
"Clone": "Kloonaa",
"Clone Chat": "Kloonaa keskustelu",
@ -383,7 +386,7 @@
"Configure": "Määritä",
"Confirm": "Vahvista",
"Confirm Password": "Vahvista salasana",
"Confirm Prompt from Embed": "",
"Confirm Prompt from Embed": "Vahvista kehote upotuksesta",
"Confirm your action": "Vahvista toimintasi",
"Confirm your new password": "Vahvista uusi salasanasi",
"Confirm Your Password": "Vahvista salasanasi",
@ -392,7 +395,7 @@
"Connect to Open Terminal instances. All users will have access to file browsing and terminal tools through these servers.": "Yhdistä Open Terminal -instansseihin. Kaikilla käyttäjillä on pääsy tiedostojen selaamiseen ja päätetyökaluihin näiden palvelimien kautta.",
"Connect to your own OpenAI compatible API endpoints.": "Yhdistä omat OpenAI yhteensopivat API päätepisteet.",
"Connect to your own OpenAPI compatible external tool servers.": "Yhdistä omat ulkopuoliset OpenAPI yhteensopivat työkalu palvelimet.",
"Connected ({{type}})": "",
"Connected ({{type}})": "Yhdistetty ({{type}})",
"Connection failed": "Yhteys epäonnistui",
"Connection successful": "Yhteys onnistui",
"Connection Type": "Yhteystyyppi",
@ -505,7 +508,7 @@
"Delete File": "Poista tiedosto",
"Delete folder?": "Haluatko varmasti poistaa tämän kansion?",
"Delete function?": "Haluatko varmasti poistaa tämän toiminnon?",
"Delete Memory?": "",
"Delete Memory?": "Poista muisto?",
"Delete Message": "Poista viesti",
"Delete message?": "Poista viesti?",
"Delete Model": "Poista malli",
@ -519,7 +522,7 @@
"Deleted": "Poistettu",
"Deleted {{deleteModelTag}}": "Poistettu {{deleteModelTag}}",
"Deleted {{name}}": "Poistettu {{nimi}}",
"Deleted {{ok}} of {{total}} items": "",
"Deleted {{ok}} of {{total}} items": "Poistettu {{ok}}/{{total}} kohdetta",
"Deleted User": "Käyttäjä poistettu",
"Deployment names are required for Azure OpenAI": "Azure OpenAI:lle vaaditaan käyttöönottojen nimet",
"Desc": "Laskeva",
@ -528,7 +531,7 @@
"Describe what changed...": "Kuvaile mikä muuttui...",
"Describe your knowledge base and objectives": "Kuvaa tietokantasi ja tavoitteesi",
"Description": "Kuvaus",
"Deselect": "",
"Deselect": "Poista valinta",
"Detect Artifacts Automatically": "Tunnista artefaktit automaattisesti",
"Dictate": "Sanele",
"Didn't fully follow instructions": "Ei noudattanut ohjeita täysin",
@ -791,7 +794,7 @@
"Enter Your Username": "Kirjoita käyttäjätunnuksesi",
"Enter your webhook URL": "Kirjoita webhook osoitteesi",
"Entra ID": "Entra ID",
"Environment Variables": "",
"Environment Variables": "Ympäristömuuttujat",
"Ephemeral": "",
"Error": "Virhe",
"ERROR": "VIRHE",
@ -819,6 +822,8 @@
"Experimental": "Kokeellinen",
"Explain": "Selitä",
"Explore the cosmos": "Tutki avaruutta",
"Explored": "Tutkittu",
"Exploring": "Tutkii",
"Export": "Vie",
"Export All Archived Chats": "Vie kaikki arkistoidut keskustelut",
"Export All Chats (All Users)": "Vie kaikki keskustelut (kaikki käyttäjät)",
@ -869,7 +874,7 @@
"Failed to save connections": "Yhteyksien tallentaminen epäonnistui",
"Failed to save conversation": "Keskustelun tallentaminen epäonnistui",
"Failed to save models configuration": "Mallien määrityksen tallentaminen epäonnistui",
"Failed to save policy: {{error}}": "",
"Failed to save policy: {{error}}": "Käytännön tallentaminen epäonnistui: {{error}}",
"Failed to save terminal servers": "Päätepalvelimien tallennus epäonnistui",
"Failed to unshare chat.": "Jaon lopettaminen epäonnistui.",
"Failed to update settings": "Asetusten päivittäminen epäonnistui",
@ -885,7 +890,7 @@
"Feedback History": "Palautehistoria",
"Feel free to add specific details": "Voit lisätä tarkempia tietoja",
"Female": "Nainen",
"Fetch URL Content Length Limit": "",
"Fetch URL Content Length Limit": "Noudetun URL-osoitteen sisällön pituusraja",
"File": "Tiedosto",
"File added successfully.": "Tiedosto lisätty onnistuneesti.",
"File attached to chat": "Tiedosto liitety keskusteluun",
@ -940,7 +945,7 @@
"Format Lines": "Muotoile rivit",
"Format the lines in the output. Defaults to False. If set to True, the lines will be formatted to detect inline math and styles.": "Muotoile rivit. Oletusarvo on False. Jos arvo on True, rivit muotoillaan siten, että ne havaitsevat riviin liitetyn matematiikan ja tyylit.",
"Formatting may be inconsistent from source.": "Muotoilu voi poiketa alkuperäisestä.",
"Forward": "",
"Forward": "Eteenpäin",
"Forwards system user OAuth access token to authenticate": "Välittää järjestelmä käyttäjän OAuth tunniste todennuksessa",
"Forwards system user session credentials to authenticate": "Välittää järjestelmän käyttäjän istunnon tunnistetiedot todennusta varten",
"Full Context Mode": "Koko kontekstitila",
@ -1028,7 +1033,7 @@
"ID": "Tunnus",
"ID cannot contain \":\" or \"|\" characters": "ID ei voi sisältää \":\" tai \"|\" kirjaimia",
"ID copied to clipboard": "ID kopioitu leikepöydälle",
"Idle Timeout": "",
"Idle Timeout": "Aikakatkaisu",
"iframe Sandbox Allow Forms": "Salli lomakkeet iframe hiekkalaatikossa",
"iframe Sandbox Allow Same Origin": "Salli iframe hiekkalaatikko samasta alkuperästä",
"Ignite curiosity": "Sytytä uteliaisuus",
@ -1199,7 +1204,7 @@
"Max Speakers": "Puhujien enimmäismäärä",
"Max Upload Count": "Latausten enimmäismäärä",
"Max Upload Size": "Latausten enimmäiskoko",
"Maximum characters to return from fetched URLs. Leave empty for no limit.": "",
"Maximum characters to return from fetched URLs. Leave empty for no limit.": "Maksimimerkkimäärä haetuista URL-osoitteista. Jätä tyhjäksi, jos et halua rajoitusta.",
"Maximum number of files allowed per folder.": "Kansiota kohden sallittujen tiedostojen enimmäismäärä.",
"Maximum number of files per folder is {{max}}.": "Tiedostojen enimmäismäärä kansiossa on {{max}}.",
"Maximum of 3 models can be downloaded simultaneously. Please try again later.": "Enintään 3 mallia voidaan ladata samanaikaisesti. Yritä myöhemmin uudelleen.",
@ -1337,7 +1342,7 @@
"No kernel": "Ei kerneliä",
"No knowledge bases found.": "Tietokantoja ei löytynyt.",
"No knowledge found": "Tietoa ei löytynyt",
"No limit": "",
"No limit": "Ei rajoituksia",
"No memories to clear": "Ei muistia tyhjennettäväksi",
"No model IDs": "Ei mallitunnuksia",
"No models available": "Malleja ei saatavilla",
@ -1381,6 +1386,7 @@
"November": "marraskuu",
"OAuth": "OAuth",
"OAuth 2.1": "OAuth 2.1",
"OAuth 2.1 (Static)": "OAuth 2.1 (Staattinen)",
"OAuth ID": "OAuth-tunnus",
"October": "lokakuu",
"Off": "Pois päältä",
@ -1410,7 +1416,7 @@
"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ä.",
"Open file": "Avaa tiedosto",
"Open in full screen": "Avaa koko näytön tilaan",
"Open in new tab": "",
"Open in new tab": "Avaa uusi välilehti",
"Open link": "Avaa linkki",
"Open modal to configure connection": "Avaa modaali yhteyden määrittämiseksi",
"Open Modal To Manage Floating Quick Actions": "Avaa modaali kelluvien pikatoimintojen hallitsemiseksi",
@ -1418,7 +1424,7 @@
"Open Model Selector": "Avaa mallinvalitsin",
"Open Settings": "Avaa asetukset",
"Open Sidebar": "Avaa sivupalkki",
"Open Terminal": "Avaa pääte",
"Open Terminal": "Open Terminal",
"Open User Profile Menu": "Avaa käyttäjäprofiili ikkuna",
"Open WebUI can use tools provided by any OpenAPI server.": "Open WebUI voi käyttää minkä tahansa OpenAPI-palvelimen tarjoamia työkaluja.",
"Open WebUI uses faster-whisper internally.": "Open WebUI käyttää faster-whisperia sisäisesti.",
@ -1471,7 +1477,7 @@
"Perplexity Model": "Perplexity malli",
"Perplexity Search API URL": "Perplexity Search API verkko-osoite",
"Perplexity Search Context Usage": "Perplexity Search kontekstin käyttö",
"Persistent": "",
"Persistent": "Pysyvä",
"Personalization": "Personointi",
"Pin": "Kiinnitä",
"Pinned": "Kiinnitetty",
@ -1491,6 +1497,7 @@
"Playwright Timeout (ms)": "Playwright aikakatkaisu (ms)",
"Playwright WebSocket URL": "Playwright WebSocket verkko-osoite",
"Please carefully review the following warnings:": "Tarkista huolellisesti seuraavat varoitukset:",
"Please connect all required integrations before sending a message": "Yhdistä kaikki vaaditut integraatiot ennen viestin lähettämistä.",
"Please do not close the settings page while loading the model.": "Älä sulje asetussivua mallin latautuessa.",
"Please enter a message or attach a file.": "Kirjoita viesti tai liittä tiedosto.",
"Please enter a prompt": "Kirjoita kehote",
@ -1499,6 +1506,7 @@
"Please enter a valid path": "Kirjoita kelvollinen polku",
"Please enter a valid URL": "Kirjoita kelvollinen verkko-osoite",
"Please enter a valid URL.": "Kirjoita kelvollinen verkko-osoite",
"Please enter Client ID and Client Secret": "Kirjoita Client ID ja Client Secret",
"Please fill in all fields.": "Täytä kaikki kentät.",
"Please register the OAuth client": "Rekisteröi OAuth asiakasohjelma",
"Please save the connection to persist the OAuth client information and do not change the ID": "Tallenna yhteys, jotta OAuth-asiakastiedot säilyvät, äläkä muuta tunnusta.",
@ -1508,7 +1516,7 @@
"Please select a valid JSON file": "Valitse kelvollinen JSON-tiedosto",
"Please select at least one user for Direct Message channel.": "Valitse vähintään yksi käyttäjä suoraviestikanavalle.",
"Please wait until all files are uploaded.": "Odota kunnes kaikki tiedostot ovat ladattu.",
"Policy ID": "",
"Policy ID": "Käytännön ID",
"Port": "Portti",
"Ports": "Portit",
"Positive attitude": "Positiivinen asenne",
@ -1545,6 +1553,8 @@
"Querying": "Kysely",
"Quick Actions": "Pikatoiminnot",
"RAG Template": "RAG-kehote",
"Ran {{COUNT}} analyses": "Suoritettiin {{COUNT}} analyysiä",
"Ran {{COUNT}} analysis": "Suoritettiin {{COUNT}} analyysiä",
"Rate {{rating}} out of 10": "Arvostele {{rating}}/10",
"Rating": "Arviointi",
"Re-rank models by topic similarity": "Uudelleenjärjestä mallit aiheyhteyden mukaan",
@ -1588,7 +1598,7 @@
"Remove image": "Poista kuva",
"Remove Model": "Poista malli",
"Rename": "Nimeä uudelleen",
"Renamed to {{name}}": "",
"Renamed to {{name}}": "Nimetty uudelleen {{name}}",
"Render Markdown in Previews": "Renderöi Markdown esikatseluissa",
"Reorder Models": "Uudelleenjärjestä malleja",
"Reply": "Vastaa",
@ -1654,7 +1664,7 @@
"Search Groups": "Etsi ryhmiä",
"Search In Models": "Hae mallleista",
"Search Knowledge": "Hae tietämystä",
"Search Memories": "",
"Search Memories": "Hae muistoista",
"Search Models": "Hae malleja",
"Search Notes": "Hae muistiinpanoista",
"Search options": "Hakuvaihtoehdot",
@ -1696,7 +1706,7 @@
"Select a theme": "Valitse teema",
"Select a tool": "Valitse työkalu",
"Select a voice": "Valitse ääni",
"Select All": "",
"Select All": "Valitse kaikki",
"Select an auth method": "Valitse kirjautumistapa",
"Select an embedding model engine": "Valitse upotusmallin moottori",
"Select an engine": "Valitse moottori",
@ -1725,7 +1735,7 @@
"Serper API Key": "Serper API -avain",
"Serply API Key": "Serply API -avain",
"Serpstack API Key": "Serpstack API -avain",
"Server connection failed": "",
"Server connection failed": "Palvelinyhteys epäonnistui",
"Server connection verified": "Palvelinyhteys vahvistettu",
"Session": "Istunto",
"Set as default": "Aseta oletukseksi",
@ -1926,6 +1936,7 @@
"This will delete all models including custom models and cannot be undone.": "Tämä poistaa kaikki mallit, mukaan lukien mukautetut mallit, eikä sitä voi peruuttaa.",
"This will reset the knowledge base and sync all files. Do you wish to continue?": "Tämä nollaa tietokannan ja synkronoi kaikki tiedostot. Haluatko jatkaa?",
"Thorough explanation": "Perusteellinen selitys",
"Thought": "Ajatus",
"Thought for {{DURATION}}": "Ajatteli {{DURATION}}",
"Thought for {{DURATION}} seconds": "Ajatteli {{DURATION}} sekuntia",
"Thought for less than a second": "Ajatteli alle sekunnin",
@ -1954,6 +1965,7 @@
"Today at {{LOCALIZED_TIME}}": "Tänään {{LOCALIZED_TIME}}",
"Toggle {{COUNT}} sources": "Näytä/piilota {{COUNT}} lähdettä",
"Toggle 1 source": "Näytä/piilota 1 lähde",
"Toggle details": "Näytä/piilota yksityiskohdat",
"Toggle Dictation": "Sanelu päälle/pois",
"Toggle Sidebar": "Näytä/piilota sivupalkki",
"Toggle status history": "Näytä/piilota tilahistoria",

View file

@ -332,7 +332,10 @@
"Click here to upload a workflow.json file.": "Cliquez ici pour téléverser un fichier workflow.json.",
"click here.": "cliquez ici.",
"Click on the user role button to change a user's role.": "Cliquez sur le bouton de rôle d'utilisateur pour modifier son rôle.",
"Click to connect": "",
"Click to copy ID": "",
"Client ID": "",
"Client Secret": "",
"Clipboard write permission denied. Please check your browser settings to grant the necessary access.": "L'autorisation d'écriture du presse-papier a été refusée. Veuillez vérifier les réglages de votre navigateur pour accorder l'accès nécessaire.",
"Clone": "Cloner",
"Clone Chat": "Dupliquer la conversation",
@ -820,6 +823,8 @@
"Experimental": "Expérimental",
"Explain": "Explique",
"Explore the cosmos": "Explorer le cosmos",
"Explored": "",
"Exploring": "",
"Export": "Exportation",
"Export All Archived Chats": "Exporter toutes les conversations archivées",
"Export All Chats (All Users)": "Exporter toutes les conversations (de tous les utilisateurs)",
@ -1382,6 +1387,7 @@
"November": "Novembre",
"OAuth": "",
"OAuth 2.1": "",
"OAuth 2.1 (Static)": "",
"OAuth ID": "ID OAuth",
"October": "Octobre",
"Off": "Désactivé",
@ -1492,6 +1498,7 @@
"Playwright Timeout (ms)": "Délai d'attente Playwright (ms)",
"Playwright WebSocket URL": "URL du websocket Playwright",
"Please carefully review the following warnings:": "Veuillez lire attentivement les avertissements suivants :",
"Please connect all required integrations before sending a message": "",
"Please do not close the settings page while loading the model.": "Veuillez ne pas fermer les réglages pendant le chargement du modèle.",
"Please enter a message or attach a file.": "",
"Please enter a prompt": "Veuillez saisir un prompt",
@ -1500,6 +1507,7 @@
"Please enter a valid path": "Veuillez entrer un chemin d'accès valide",
"Please enter a valid URL": "Veuillez entrer une URL valide",
"Please enter a valid URL.": "",
"Please enter Client ID and Client Secret": "",
"Please fill in all fields.": "Veuillez remplir tous les champs.",
"Please register the OAuth client": "",
"Please save the connection to persist the OAuth client information and do not change the ID": "",
@ -1546,6 +1554,8 @@
"Querying": "",
"Quick Actions": "",
"RAG Template": "Modèle RAG",
"Ran {{COUNT}} analyses": "",
"Ran {{COUNT}} analysis": "",
"Rate {{rating}} out of 10": "",
"Rating": "Note",
"Re-rank models by topic similarity": "Reclasser les modèles par similarité de sujet",
@ -1928,6 +1938,7 @@
"This will delete all models including custom models and cannot be undone.": "Cela supprimera tous les modèles, y compris les modèles personnalisés, et ne peut pas être annulé.",
"This will reset the knowledge base and sync all files. Do you wish to continue?": "Cela réinitialisera la base de connaissances et synchronisera tous les fichiers. Souhaitez-vous continuer ?",
"Thorough explanation": "Explication approfondie",
"Thought": "",
"Thought for {{DURATION}}": "Réflexion de {{DURATION}}",
"Thought for {{DURATION}} seconds": "Réflexion pendant {{DURATION}} secondes",
"Thought for less than a second": "",
@ -1956,6 +1967,7 @@
"Today at {{LOCALIZED_TIME}}": "",
"Toggle {{COUNT}} sources": "",
"Toggle 1 source": "",
"Toggle details": "",
"Toggle Dictation": "",
"Toggle Sidebar": "",
"Toggle status history": "",

View file

@ -332,7 +332,10 @@
"Click here to upload a workflow.json file.": "Cliquez ici pour téléverser un fichier workflow.json.",
"click here.": "cliquez ici.",
"Click on the user role button to change a user's role.": "Cliquez sur le bouton de rôle d'utilisateur pour modifier son rôle.",
"Click to connect": "",
"Click to copy ID": "Cliquez pour copier l'ID",
"Client ID": "",
"Client Secret": "",
"Clipboard write permission denied. Please check your browser settings to grant the necessary access.": "L'autorisation d'écriture du presse-papier a été refusée. Veuillez vérifier les réglages de votre navigateur pour accorder l'accès nécessaire.",
"Clone": "Cloner",
"Clone Chat": "Dupliquer la conversation",
@ -820,6 +823,8 @@
"Experimental": "Expérimental",
"Explain": "Explique",
"Explore the cosmos": "Explorer le cosmos",
"Explored": "",
"Exploring": "",
"Export": "Exporter",
"Export All Archived Chats": "Exporter toutes les conversations archivées",
"Export All Chats (All Users)": "Exporter toutes les conversations (de tous les utilisateurs)",
@ -1382,6 +1387,7 @@
"November": "Novembre",
"OAuth": "OAuth",
"OAuth 2.1": "OAuth 2.1",
"OAuth 2.1 (Static)": "",
"OAuth ID": "ID OAuth",
"October": "Octobre",
"Off": "Désactivé",
@ -1492,6 +1498,7 @@
"Playwright Timeout (ms)": "Délai d'attente Playwright (ms)",
"Playwright WebSocket URL": "URL du websocket Playwright",
"Please carefully review the following warnings:": "Veuillez lire attentivement les avertissements suivants :",
"Please connect all required integrations before sending a message": "",
"Please do not close the settings page while loading the model.": "Veuillez ne pas fermer les réglages pendant le chargement du modèle.",
"Please enter a message or attach a file.": "Veuillez saisir un message ou joindre un fichier.",
"Please enter a prompt": "Veuillez saisir un prompt",
@ -1500,6 +1507,7 @@
"Please enter a valid path": "Veuillez entrer un chemin d'accès valide",
"Please enter a valid URL": "Veuillez entrer une URL valide",
"Please enter a valid URL.": "Veuillez entrer une URL valide.",
"Please enter Client ID and Client Secret": "",
"Please fill in all fields.": "Veuillez remplir tous les champs.",
"Please register the OAuth client": "Veuillez enregistrer le client OAuth",
"Please save the connection to persist the OAuth client information and do not change the ID": "Veuillez enregistrer la connexion pour conserver les informations du client OAuth et ne modifiez pas l'ID",
@ -1546,6 +1554,8 @@
"Querying": "Requête en cours",
"Quick Actions": "Actions rapide",
"RAG Template": "Modèle RAG",
"Ran {{COUNT}} analyses": "",
"Ran {{COUNT}} analysis": "",
"Rate {{rating}} out of 10": "Noter {{rating}} sur 10",
"Rating": "Note",
"Re-rank models by topic similarity": "Reclasser les modèles par similarité de sujet",
@ -1928,6 +1938,7 @@
"This will delete all models including custom models and cannot be undone.": "Cela supprimera tous les modèles, y compris les modèles personnalisés, et ne peut pas être annulé.",
"This will reset the knowledge base and sync all files. Do you wish to continue?": "Cela réinitialisera la base de connaissances et synchronisera tous les fichiers. Souhaitez-vous continuer ?",
"Thorough explanation": "Explication approfondie",
"Thought": "",
"Thought for {{DURATION}}": "Réflexion de {{DURATION}}",
"Thought for {{DURATION}} seconds": "Réflexion pendant {{DURATION}} secondes",
"Thought for less than a second": "Réflexion pendant moins d'une seconde",
@ -1956,6 +1967,7 @@
"Today at {{LOCALIZED_TIME}}": "Aujourd'hui à {{LOCALIZED_TIME}}",
"Toggle {{COUNT}} sources": "Afficher/masquer {{COUNT}} sources",
"Toggle 1 source": "Afficher/masquer 1 source",
"Toggle details": "",
"Toggle Dictation": "Activer/Désactiver la dictée",
"Toggle Sidebar": "Afficher/Masquer la barre latérale",
"Toggle status history": "Afficher/masquer l'historique des statuts",

View file

@ -331,7 +331,10 @@
"Click here to upload a workflow.json file.": "Pica aquí para subir un arquivo workflow.json.",
"click here.": "Pica aquí.",
"Click on the user role button to change a user's role.": "Pica no botón de roles do usuario para cambiar su rol.",
"Click to connect": "",
"Click to copy ID": "",
"Client ID": "",
"Client Secret": "",
"Clipboard write permission denied. Please check your browser settings to grant the necessary access.": "Permisos de escritura do portapapeles denegados. Por favor, comprueba as configuracions de tu navegador para otorgar o acceso necesario.",
"Clone": "Clonar",
"Clone Chat": "Clonar chat",
@ -819,6 +822,8 @@
"Experimental": "Experimental",
"Explain": "Explicar",
"Explore the cosmos": "Explora o cosmos",
"Explored": "",
"Exploring": "",
"Export": "Exportar",
"Export All Archived Chats": "Exportar todos os chats Arquivados",
"Export All Chats (All Users)": "Exportar todos os chats (Todos os usuarios)",
@ -1381,6 +1386,7 @@
"November": "Noviembre",
"OAuth": "",
"OAuth 2.1": "",
"OAuth 2.1 (Static)": "",
"OAuth ID": "OAuth ID",
"October": "Octubre",
"Off": "Desactivado",
@ -1491,6 +1497,7 @@
"Playwright Timeout (ms)": "",
"Playwright WebSocket URL": "",
"Please carefully review the following warnings:": "Por favor revise con cuidado os siguientes avisos:",
"Please connect all required integrations before sending a message": "",
"Please do not close the settings page while loading the model.": "",
"Please enter a message or attach a file.": "",
"Please enter a prompt": "Por favor ingrese un prompt",
@ -1499,6 +1506,7 @@
"Please enter a valid path": "",
"Please enter a valid URL": "",
"Please enter a valid URL.": "",
"Please enter Client ID and Client Secret": "",
"Please fill in all fields.": "Por favor llene todos os campos.",
"Please register the OAuth client": "",
"Please save the connection to persist the OAuth client information and do not change the ID": "",
@ -1545,6 +1553,8 @@
"Querying": "",
"Quick Actions": "",
"RAG Template": "Plantilla de RAG",
"Ran {{COUNT}} analyses": "",
"Ran {{COUNT}} analysis": "",
"Rate {{rating}} out of 10": "",
"Rating": "Calificación",
"Re-rank models by topic similarity": "Re-clasificar modelos por similitud de tema",
@ -1926,6 +1936,7 @@
"This will delete all models including custom models and cannot be undone.": "Esto eliminará todos os modelos, incluidos os modelos personalizados y no se puede deshacer.",
"This will reset the knowledge base and sync all files. Do you wish to continue?": "Esto reseteará la base de coñecementos y sincronizará todos os arquivos. ¿Desea continuar?",
"Thorough explanation": "Explicación exhaustiva",
"Thought": "",
"Thought for {{DURATION}}": "Pensamiento para {{DURATION}}",
"Thought for {{DURATION}} seconds": "",
"Thought for less than a second": "",
@ -1954,6 +1965,7 @@
"Today at {{LOCALIZED_TIME}}": "",
"Toggle {{COUNT}} sources": "",
"Toggle 1 source": "",
"Toggle details": "",
"Toggle Dictation": "",
"Toggle Sidebar": "",
"Toggle status history": "",

View file

@ -332,7 +332,10 @@
"Click here to upload a workflow.json file.": "",
"click here.": "לחץ כאן.",
"Click on the user role button to change a user's role.": "לחץ על כפתור תפקיד המשתמש כדי לשנות את תפקיד המשתמש.",
"Click to connect": "",
"Click to copy ID": "",
"Client ID": "",
"Client Secret": "",
"Clipboard write permission denied. Please check your browser settings to grant the necessary access.": "",
"Clone": "שיבוט",
"Clone Chat": "",
@ -820,6 +823,8 @@
"Experimental": "ניסיוני",
"Explain": "",
"Explore the cosmos": "",
"Explored": "",
"Exploring": "",
"Export": "ייצא",
"Export All Archived Chats": "",
"Export All Chats (All Users)": "ייצוא כל הצ'אטים (כל המשתמשים)",
@ -1382,6 +1387,7 @@
"November": "נובמבר",
"OAuth": "",
"OAuth 2.1": "",
"OAuth 2.1 (Static)": "",
"OAuth ID": "",
"October": "אוקטובר",
"Off": "כבוי",
@ -1492,6 +1498,7 @@
"Playwright Timeout (ms)": "",
"Playwright WebSocket URL": "",
"Please carefully review the following warnings:": "",
"Please connect all required integrations before sending a message": "",
"Please do not close the settings page while loading the model.": "",
"Please enter a message or attach a file.": "",
"Please enter a prompt": "",
@ -1500,6 +1507,7 @@
"Please enter a valid path": "",
"Please enter a valid URL": "",
"Please enter a valid URL.": "",
"Please enter Client ID and Client Secret": "",
"Please fill in all fields.": "",
"Please register the OAuth client": "",
"Please save the connection to persist the OAuth client information and do not change the ID": "",
@ -1546,6 +1554,8 @@
"Querying": "",
"Quick Actions": "",
"RAG Template": "תבנית RAG",
"Ran {{COUNT}} analyses": "",
"Ran {{COUNT}} analysis": "",
"Rate {{rating}} out of 10": "",
"Rating": "",
"Re-rank models by topic similarity": "",
@ -1928,6 +1938,7 @@
"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": "",
"Thought for {{DURATION}}": "",
"Thought for {{DURATION}} seconds": "",
"Thought for less than a second": "",
@ -1956,6 +1967,7 @@
"Today at {{LOCALIZED_TIME}}": "",
"Toggle {{COUNT}} sources": "",
"Toggle 1 source": "",
"Toggle details": "",
"Toggle Dictation": "",
"Toggle Sidebar": "",
"Toggle status history": "",

View file

@ -331,7 +331,10 @@
"Click here to upload a workflow.json file.": "",
"click here.": "यहाँ क्लिक करें।",
"Click on the user role button to change a user's role.": "उपयोगकर्ता की भूमिका बदलने के लिए उपयोगकर्ता भूमिका बटन पर क्लिक करें।",
"Click to connect": "",
"Click to copy ID": "",
"Client ID": "",
"Client Secret": "",
"Clipboard write permission denied. Please check your browser settings to grant the necessary access.": "",
"Clone": "क्लोन",
"Clone Chat": "",
@ -819,6 +822,8 @@
"Experimental": "प्रयोगात्मक",
"Explain": "",
"Explore the cosmos": "",
"Explored": "",
"Exploring": "",
"Export": "निर्यातित माल",
"Export All Archived Chats": "",
"Export All Chats (All Users)": "सभी चैट निर्यात करें (सभी उपयोगकर्ताओं की)",
@ -1381,6 +1386,7 @@
"November": "नवंबर",
"OAuth": "",
"OAuth 2.1": "",
"OAuth 2.1 (Static)": "",
"OAuth ID": "",
"October": "अक्टूबर",
"Off": "बंद",
@ -1491,6 +1497,7 @@
"Playwright Timeout (ms)": "",
"Playwright WebSocket URL": "",
"Please carefully review the following warnings:": "",
"Please connect all required integrations before sending a message": "",
"Please do not close the settings page while loading the model.": "",
"Please enter a message or attach a file.": "",
"Please enter a prompt": "",
@ -1499,6 +1506,7 @@
"Please enter a valid path": "",
"Please enter a valid URL": "",
"Please enter a valid URL.": "",
"Please enter Client ID and Client Secret": "",
"Please fill in all fields.": "",
"Please register the OAuth client": "",
"Please save the connection to persist the OAuth client information and do not change the ID": "",
@ -1545,6 +1553,8 @@
"Querying": "",
"Quick Actions": "",
"RAG Template": "RAG टेम्पलेट",
"Ran {{COUNT}} analyses": "",
"Ran {{COUNT}} analysis": "",
"Rate {{rating}} out of 10": "",
"Rating": "",
"Re-rank models by topic similarity": "",
@ -1926,6 +1936,7 @@
"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": "",
"Thought for {{DURATION}}": "",
"Thought for {{DURATION}} seconds": "",
"Thought for less than a second": "",
@ -1954,6 +1965,7 @@
"Today at {{LOCALIZED_TIME}}": "",
"Toggle {{COUNT}} sources": "",
"Toggle 1 source": "",
"Toggle details": "",
"Toggle Dictation": "",
"Toggle Sidebar": "",
"Toggle status history": "",

View file

@ -332,7 +332,10 @@
"Click here to upload a workflow.json file.": "",
"click here.": "kliknite ovdje.",
"Click on the user role button to change a user's role.": "Kliknite na gumb uloge korisnika za promjenu uloge korisnika.",
"Click to connect": "",
"Click to copy ID": "",
"Client ID": "",
"Client Secret": "",
"Clipboard write permission denied. Please check your browser settings to grant the necessary access.": "",
"Clone": "Kloniraj",
"Clone Chat": "",
@ -820,6 +823,8 @@
"Experimental": "Eksperimentalno",
"Explain": "",
"Explore the cosmos": "",
"Explored": "",
"Exploring": "",
"Export": "Izvoz",
"Export All Archived Chats": "",
"Export All Chats (All Users)": "Izvoz svih razgovora (svi korisnici)",
@ -1382,6 +1387,7 @@
"November": "Studeni",
"OAuth": "",
"OAuth 2.1": "",
"OAuth 2.1 (Static)": "",
"OAuth ID": "",
"October": "Listopad",
"Off": "Isključeno",
@ -1492,6 +1498,7 @@
"Playwright Timeout (ms)": "",
"Playwright WebSocket URL": "",
"Please carefully review the following warnings:": "",
"Please connect all required integrations before sending a message": "",
"Please do not close the settings page while loading the model.": "",
"Please enter a message or attach a file.": "",
"Please enter a prompt": "",
@ -1500,6 +1507,7 @@
"Please enter a valid path": "",
"Please enter a valid URL": "",
"Please enter a valid URL.": "",
"Please enter Client ID and Client Secret": "",
"Please fill in all fields.": "",
"Please register the OAuth client": "",
"Please save the connection to persist the OAuth client information and do not change the ID": "",
@ -1546,6 +1554,8 @@
"Querying": "",
"Quick Actions": "",
"RAG Template": "RAG predložak",
"Ran {{COUNT}} analyses": "",
"Ran {{COUNT}} analysis": "",
"Rate {{rating}} out of 10": "",
"Rating": "",
"Re-rank models by topic similarity": "",
@ -1928,6 +1938,7 @@
"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": "Detaljno objašnjenje",
"Thought": "",
"Thought for {{DURATION}}": "",
"Thought for {{DURATION}} seconds": "",
"Thought for less than a second": "",
@ -1956,6 +1967,7 @@
"Today at {{LOCALIZED_TIME}}": "",
"Toggle {{COUNT}} sources": "",
"Toggle 1 source": "",
"Toggle details": "",
"Toggle Dictation": "",
"Toggle Sidebar": "",
"Toggle status history": "",

View file

@ -331,7 +331,10 @@
"Click here to upload a workflow.json file.": "Kattints ide egy workflow.json fájl feltöltéséhez.",
"click here.": "kattints ide.",
"Click on the user role button to change a user's role.": "Kattints a felhasználói szerep gombra a felhasználó szerepének módosításához.",
"Click to connect": "",
"Click to copy ID": "",
"Client ID": "",
"Client Secret": "",
"Clipboard write permission denied. Please check your browser settings to grant the necessary access.": "Vágólap írási engedély megtagadva. Kérjük, ellenőrizd a böngésző beállításait a szükséges hozzáférés megadásához.",
"Clone": "Klónozás",
"Clone Chat": "Beszélgetés klónozása",
@ -819,6 +822,8 @@
"Experimental": "Kísérleti",
"Explain": "Magyarázat",
"Explore the cosmos": "Fedezd fel a kozmoszt",
"Explored": "",
"Exploring": "",
"Export": "Exportálás",
"Export All Archived Chats": "Minden archivált csevegés exportálása",
"Export All Chats (All Users)": "Minden beszélgetés exportálása (minden felhasználó)",
@ -1381,6 +1386,7 @@
"November": "November",
"OAuth": "",
"OAuth 2.1": "",
"OAuth 2.1 (Static)": "",
"OAuth ID": "OAuth azonosító",
"October": "Október",
"Off": "Ki",
@ -1491,6 +1497,7 @@
"Playwright Timeout (ms)": "",
"Playwright WebSocket URL": "",
"Please carefully review the following warnings:": "Kérjük, gondosan tekintse át a következő figyelmeztetéseket:",
"Please connect all required integrations before sending a message": "",
"Please do not close the settings page while loading the model.": "Kérjük, ne zárja be a beállítások oldalt a modell betöltése közben.",
"Please enter a message or attach a file.": "",
"Please enter a prompt": "Kérjük, adjon meg egy promptot",
@ -1499,6 +1506,7 @@
"Please enter a valid path": "Kérjük, adjon meg egy érvényes útvonalat",
"Please enter a valid URL": "Kérjük, adjon meg egy érvényes URL-t",
"Please enter a valid URL.": "",
"Please enter Client ID and Client Secret": "",
"Please fill in all fields.": "Kérjük, töltse ki az összes mezőt.",
"Please register the OAuth client": "",
"Please save the connection to persist the OAuth client information and do not change the ID": "",
@ -1545,6 +1553,8 @@
"Querying": "",
"Quick Actions": "",
"RAG Template": "RAG sablon",
"Ran {{COUNT}} analyses": "",
"Ran {{COUNT}} analysis": "",
"Rate {{rating}} out of 10": "",
"Rating": "Értékelés",
"Re-rank models by topic similarity": "Modellek újrarangsorolása téma hasonlóság alapján",
@ -1926,6 +1936,7 @@
"This will delete all models including custom models and cannot be undone.": "Ez törölni fogja az összes modellt, beleértve az egyéni modelleket is, és nem vonható vissza.",
"This will reset the knowledge base and sync all files. Do you wish to continue?": "Ez visszaállítja a tudásbázist és szinkronizálja az összes fájlt. Szeretné folytatni?",
"Thorough explanation": "Alapos magyarázat",
"Thought": "",
"Thought for {{DURATION}}": "Gondolkodott {{DURATION}} ideig",
"Thought for {{DURATION}} seconds": "Gondolkodott {{DURATION}} másodpercig",
"Thought for less than a second": "",
@ -1954,6 +1965,7 @@
"Today at {{LOCALIZED_TIME}}": "",
"Toggle {{COUNT}} sources": "",
"Toggle 1 source": "",
"Toggle details": "",
"Toggle Dictation": "",
"Toggle Sidebar": "",
"Toggle status history": "",

View file

@ -330,7 +330,10 @@
"Click here to upload a workflow.json file.": "",
"click here.": "Klik di sini.",
"Click on the user role button to change a user's role.": "Klik tombol peran pengguna untuk mengubah peran pengguna.",
"Click to connect": "",
"Click to copy ID": "",
"Client ID": "",
"Client Secret": "",
"Clipboard write permission denied. Please check your browser settings to grant the necessary access.": "Izin menulis papan klip ditolak. Periksa pengaturan peramban Anda untuk memberikan akses yang diperlukan.",
"Clone": "Kloning",
"Clone Chat": "",
@ -818,6 +821,8 @@
"Experimental": "Percobaan",
"Explain": "",
"Explore the cosmos": "",
"Explored": "",
"Exploring": "",
"Export": "Ekspor",
"Export All Archived Chats": "",
"Export All Chats (All Users)": "Ekspor Semua Obrolan (Semua Pengguna)",
@ -1380,6 +1385,7 @@
"November": "November",
"OAuth": "",
"OAuth 2.1": "",
"OAuth 2.1 (Static)": "",
"OAuth ID": "ID OAuth",
"October": "Oktober",
"Off": "Mati",
@ -1490,6 +1496,7 @@
"Playwright Timeout (ms)": "",
"Playwright WebSocket URL": "",
"Please carefully review the following warnings:": "",
"Please connect all required integrations before sending a message": "",
"Please do not close the settings page while loading the model.": "",
"Please enter a message or attach a file.": "",
"Please enter a prompt": "",
@ -1498,6 +1505,7 @@
"Please enter a valid path": "",
"Please enter a valid URL": "",
"Please enter a valid URL.": "",
"Please enter Client ID and Client Secret": "",
"Please fill in all fields.": "",
"Please register the OAuth client": "",
"Please save the connection to persist the OAuth client information and do not change the ID": "",
@ -1544,6 +1552,8 @@
"Querying": "",
"Quick Actions": "",
"RAG Template": "Templat RAG",
"Ran {{COUNT}} analyses": "",
"Ran {{COUNT}} analysis": "",
"Rate {{rating}} out of 10": "",
"Rating": "",
"Re-rank models by topic similarity": "",
@ -1924,6 +1934,7 @@
"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": "Penjelasan menyeluruh",
"Thought": "",
"Thought for {{DURATION}}": "",
"Thought for {{DURATION}} seconds": "",
"Thought for less than a second": "",
@ -1952,6 +1963,7 @@
"Today at {{LOCALIZED_TIME}}": "",
"Toggle {{COUNT}} sources": "",
"Toggle 1 source": "",
"Toggle details": "",
"Toggle Dictation": "",
"Toggle Sidebar": "",
"Toggle status history": "",

View file

@ -331,7 +331,10 @@
"Click here to upload a workflow.json file.": "Cliceáil anseo chun comhad workflow.json a uaslódáil.",
"click here.": "cliceáil anseo.",
"Click on the user role button to change a user's role.": "Cliceáil ar an gcnaipe ról úsáideora chun ról úsáideora a athrú.",
"Click to connect": "",
"Click to copy ID": "Cliceáil chun an t-aitheantas a chóipeáil",
"Client ID": "",
"Client Secret": "",
"Clipboard write permission denied. Please check your browser settings to grant the necessary access.": "Diúltaíodh cead scríofa an ghearrthaisce. Seiceáil socruithe do bhrabhsálaí chun an rochtain riachtanach a dheonú.",
"Clone": "Clón",
"Clone Chat": "Comhrá Clón",
@ -819,6 +822,8 @@
"Experimental": "Turgnamhach",
"Explain": "Mínigh",
"Explore the cosmos": "Déan iniúchadh ar an cosmos",
"Explored": "",
"Exploring": "",
"Export": "Easpórtáil",
"Export All Archived Chats": "Easpórtáil Gach Comhrá Cartlainne",
"Export All Chats (All Users)": "Easpórtáil gach comhrá (Gach Úsáideoir)",
@ -1381,6 +1386,7 @@
"November": "Samhain",
"OAuth": "OAuth",
"OAuth 2.1": "OAuth 2.1",
"OAuth 2.1 (Static)": "",
"OAuth ID": "Aitheantas OAuth",
"October": "Deireadh Fómhair",
"Off": "As",
@ -1491,6 +1497,7 @@
"Playwright Timeout (ms)": "Teorainn Ama drámadóra (ms)",
"Playwright WebSocket URL": "URL drámadóir WebSocket",
"Please carefully review the following warnings:": "Déan athbhreithniú cúramach ar na rabhaidh seo a leanas le do thoil:",
"Please connect all required integrations before sending a message": "",
"Please do not close the settings page while loading the model.": "Ná dún leathanach na socruithe agus an tsamhail á luchtú.",
"Please enter a message or attach a file.": "Cuir isteach teachtaireacht nó ceangail comhad le do thoil.",
"Please enter a prompt": "Cuir isteach leid",
@ -1499,6 +1506,7 @@
"Please enter a valid path": "Cuir isteach cosán bailí",
"Please enter a valid URL": "Cuir isteach URL bailí",
"Please enter a valid URL.": "Cuir isteach URL bailí le do thoil.",
"Please enter Client ID and Client Secret": "",
"Please fill in all fields.": "Líon isteach gach réimse le do thoil.",
"Please register the OAuth client": "Cláraigh an cliant OAuth le do thoil",
"Please save the connection to persist the OAuth client information and do not change the ID": "Sábháil an nasc le go gcoimeádfar faisnéis an chliaint OAuth agus ná hathraigh an ID.",
@ -1545,6 +1553,8 @@
"Querying": "Ag fiosrú",
"Quick Actions": "Gníomhartha Tapa",
"RAG Template": "Teimpléad RAG",
"Ran {{COUNT}} analyses": "",
"Ran {{COUNT}} analysis": "",
"Rate {{rating}} out of 10": "Rátáil {{rating}} as 10",
"Rating": "Rátáil",
"Re-rank models by topic similarity": "Athrangú samhlacha de réir cosúlachta topaice",
@ -1926,6 +1936,7 @@
"This will delete all models including custom models and cannot be undone.": "Scriosfaidh sé seo gach samhail, lena n-áirítear samhlacha saincheaptha, agus ní féidir é a chealú.",
"This will reset the knowledge base and sync all files. Do you wish to continue?": "Déanfaidh sé seo an bonn eolais a athshocrú agus gach comhad a shioncronú. Ar mhaith leat leanúint ar aghaidh?",
"Thorough explanation": "Míniú críochnúil",
"Thought": "",
"Thought for {{DURATION}}": "Smaoineamh ar {{DURATION}}",
"Thought for {{DURATION}} seconds": "Smaoineamh ar feadh {{DURATION}} soicind",
"Thought for less than a second": "Smaoinigh mé ar feadh níos lú ná soicind",
@ -1954,6 +1965,7 @@
"Today at {{LOCALIZED_TIME}}": "Inniu ag {{LOCALIZED_TIME}}",
"Toggle {{COUNT}} sources": "Athraigh {{COUNT}} foinsí",
"Toggle 1 source": "Athraigh foinse amháin",
"Toggle details": "",
"Toggle Dictation": "Athraigh Deachtú",
"Toggle Sidebar": "Barra Taobh a Athraigh",
"Toggle status history": "Athraigh stair stádais",

View file

@ -332,7 +332,10 @@
"Click here to upload a workflow.json file.": "Clicca qui per caricare un file workflow.json.",
"click here.": "clicca qui.",
"Click on the user role button to change a user's role.": "Clicca sul pulsante del ruolo utente per modificare il ruolo di un utente.",
"Click to connect": "",
"Click to copy ID": "",
"Client ID": "",
"Client Secret": "",
"Clipboard write permission denied. Please check your browser settings to grant the necessary access.": "Autorizzazione di scrittura negli appunti negata. Controlla le impostazioni del browser per concedere l'accesso necessario.",
"Clone": "Clone",
"Clone Chat": "Clona Chat",
@ -820,6 +823,8 @@
"Experimental": "Sperimentale",
"Explain": "Spiega",
"Explore the cosmos": "Esplora il cosmo",
"Explored": "",
"Exploring": "",
"Export": "Esportazione",
"Export All Archived Chats": "Esporta Tutte le Chat Archiviate",
"Export All Chats (All Users)": "Esporta Tutte le Chat (Tutti gli Utenti)",
@ -1382,6 +1387,7 @@
"November": "Novembre",
"OAuth": "",
"OAuth 2.1": "",
"OAuth 2.1 (Static)": "",
"OAuth ID": "",
"October": "Ottobre",
"Off": "Disattivato",
@ -1492,6 +1498,7 @@
"Playwright Timeout (ms)": "Timeout per Playwright (ms)",
"Playwright WebSocket URL": "URL WebSocket per Playwright",
"Please carefully review the following warnings:": "Si prega di esaminare attentamente i seguenti avvisi:",
"Please connect all required integrations before sending a message": "",
"Please do not close the settings page while loading the model.": "Si prega di non chiudere la pagina delle impostazioni durante il caricamento del modello.",
"Please enter a message or attach a file.": "",
"Please enter a prompt": "Si prega di inserire un prompt",
@ -1500,6 +1507,7 @@
"Please enter a valid path": "Si prega di inserire un percorso valido",
"Please enter a valid URL": "Si prega di inserire un URL valido",
"Please enter a valid URL.": "",
"Please enter Client ID and Client Secret": "",
"Please fill in all fields.": "Si prega di compilare tutti i campi.",
"Please register the OAuth client": "",
"Please save the connection to persist the OAuth client information and do not change the ID": "",
@ -1546,6 +1554,8 @@
"Querying": "",
"Quick Actions": "",
"RAG Template": "Modello RAG",
"Ran {{COUNT}} analyses": "",
"Ran {{COUNT}} analysis": "",
"Rate {{rating}} out of 10": "",
"Rating": "Valutazione",
"Re-rank models by topic similarity": "Riordina i modelli in base alla somiglianza degli argomenti",
@ -1928,6 +1938,7 @@
"This will delete all models including custom models and cannot be undone.": "Questa opzione eliminerà tutti i modelli, compresi i modelli personalizzati e non può essere annullata.",
"This will reset the knowledge base and sync all files. Do you wish to continue?": "Questa opzione ripristinerà la base di conoscenza e sincronizzerà tutti i file. Vuoi continuare?",
"Thorough explanation": "Spiegazione dettagliata",
"Thought": "",
"Thought for {{DURATION}}": "Pensiero per {{DURATION}}",
"Thought for {{DURATION}} seconds": "Pensiero per {{DURATION}} secondi",
"Thought for less than a second": "",
@ -1956,6 +1967,7 @@
"Today at {{LOCALIZED_TIME}}": "",
"Toggle {{COUNT}} sources": "",
"Toggle 1 source": "",
"Toggle details": "",
"Toggle Dictation": "",
"Toggle Sidebar": "",
"Toggle status history": "",

View file

@ -330,7 +330,10 @@
"Click here to upload a workflow.json file.": "workflow.jsonファイルをアップロードするにはここをクリックしてください。",
"click here.": "ここをクリックしてください。",
"Click on the user role button to change a user's role.": "ユーザーのロールを変更するには、ユーザーロールボタンをクリックしてください。",
"Click to connect": "",
"Click to copy ID": "",
"Client ID": "",
"Client Secret": "",
"Clipboard write permission denied. Please check your browser settings to grant the necessary access.": "クリップボードへの書き込み許可がありません。ブラウザ設定を確認し許可してください。",
"Clone": "クローン",
"Clone Chat": "チャットをクローン",
@ -818,6 +821,8 @@
"Experimental": "実験的",
"Explain": "説明",
"Explore the cosmos": "宇宙を探検",
"Explored": "",
"Exploring": "",
"Export": "エクスポート",
"Export All Archived Chats": "すべてのアーカイブチャットをエクスポート",
"Export All Chats (All Users)": "すべてのチャットをエクスポート (すべてのユーザー)",
@ -1380,6 +1385,7 @@
"November": "11月",
"OAuth": "",
"OAuth 2.1": "",
"OAuth 2.1 (Static)": "",
"OAuth ID": "OAuth ID",
"October": "10月",
"Off": "オフ",
@ -1490,6 +1496,7 @@
"Playwright Timeout (ms)": "Playwright タイムアウト (ms)",
"Playwright WebSocket URL": "Playwright WebSocket URL",
"Please carefully review the following warnings:": "次の警告を慎重に確認してください:",
"Please connect all required integrations before sending a message": "",
"Please do not close the settings page while loading the model.": "モデルの読み込み中に設定ページを閉じないでください。",
"Please enter a message or attach a file.": "メッセージを入力するか、ファイルを添付してください",
"Please enter a prompt": "プロンプトを入力してください",
@ -1498,6 +1505,7 @@
"Please enter a valid path": "有効なパスを入力してください",
"Please enter a valid URL": "有効なURLを入力してください",
"Please enter a valid URL.": "",
"Please enter Client ID and Client Secret": "",
"Please fill in all fields.": "すべてのフィールドを入力してください。",
"Please register the OAuth client": "",
"Please save the connection to persist the OAuth client information and do not change the ID": "",
@ -1544,6 +1552,8 @@
"Querying": "照会中",
"Quick Actions": "クイックアクション",
"RAG Template": "RAG テンプレート",
"Ran {{COUNT}} analyses": "",
"Ran {{COUNT}} analysis": "",
"Rate {{rating}} out of 10": "",
"Rating": "評価",
"Re-rank models by topic similarity": "トピックの類似性に基づいてモデルを再ランク付け",
@ -1924,6 +1934,7 @@
"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": "",
"Thought for {{DURATION}}": "{{DURATION}}間の思考",
"Thought for {{DURATION}} seconds": "{{DURATION}}秒間の思考",
"Thought for less than a second": "1秒未満の思考",
@ -1952,6 +1963,7 @@
"Today at {{LOCALIZED_TIME}}": "今日 {{LOCALIZED_TIME}}",
"Toggle {{COUNT}} sources": "",
"Toggle 1 source": "",
"Toggle details": "",
"Toggle Dictation": "音声入力の切り替える",
"Toggle Sidebar": "サイドバーを切り替える",
"Toggle status history": "",

View file

@ -331,7 +331,10 @@
"Click here to upload a workflow.json file.": "",
"click here.": "დააწკაპუნეთ აქ.",
"Click on the user role button to change a user's role.": "მომხმარებლის როლის შესაცვლელად დააწკაპუნეთ მომხმარებლის როლზე.",
"Click to connect": "",
"Click to copy ID": "",
"Client ID": "",
"Client Secret": "",
"Clipboard write permission denied. Please check your browser settings to grant the necessary access.": "",
"Clone": "კლონი",
"Clone Chat": "ჩატის დაკლონვა",
@ -819,6 +822,8 @@
"Experimental": "ექსპერიმენტული",
"Explain": "ახსნა",
"Explore the cosmos": "",
"Explored": "",
"Exploring": "",
"Export": "გატანა",
"Export All Archived Chats": "",
"Export All Chats (All Users)": "ყველა ჩატის გატანა (ყველა მომხმარებელი)",
@ -1381,6 +1386,7 @@
"November": "ნოემბერი",
"OAuth": "OAuth",
"OAuth 2.1": "OAuth 2.1",
"OAuth 2.1 (Static)": "",
"OAuth ID": "OAuth ID",
"October": "ოქტომბერი",
"Off": "გამორთ",
@ -1491,6 +1497,7 @@
"Playwright Timeout (ms)": "",
"Playwright WebSocket URL": "",
"Please carefully review the following warnings:": "",
"Please connect all required integrations before sending a message": "",
"Please do not close the settings page while loading the model.": "",
"Please enter a message or attach a file.": "",
"Please enter a prompt": "",
@ -1499,6 +1506,7 @@
"Please enter a valid path": "",
"Please enter a valid URL": "გთხოვთ, შეიყვანოთ სწორი URL",
"Please enter a valid URL.": "",
"Please enter Client ID and Client Secret": "",
"Please fill in all fields.": "შეავსეთ ყველა ველი ბოლომდე.",
"Please register the OAuth client": "",
"Please save the connection to persist the OAuth client information and do not change the ID": "",
@ -1545,6 +1553,8 @@
"Querying": "მოთხოვნა",
"Quick Actions": "სწრაფი მოქმედებები",
"RAG Template": "RAG შაბლონი",
"Ran {{COUNT}} analyses": "",
"Ran {{COUNT}} analysis": "",
"Rate {{rating}} out of 10": "",
"Rating": "ხმის მიცემა",
"Re-rank models by topic similarity": "",
@ -1926,6 +1936,7 @@
"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": "",
"Thought for {{DURATION}}": "ვიფიქრე {{DURATION}}",
"Thought for {{DURATION}} seconds": "ვიფიქრე {{DURATION}} წამი",
"Thought for less than a second": "ვიფიქრე წამზე ნაკლები",
@ -1954,6 +1965,7 @@
"Today at {{LOCALIZED_TIME}}": "დღეს, {{LOCALIZED_TIME}}",
"Toggle {{COUNT}} sources": "",
"Toggle 1 source": "",
"Toggle details": "",
"Toggle Dictation": "",
"Toggle Sidebar": "",
"Toggle status history": "",

View file

@ -331,7 +331,10 @@
"Click here to upload a workflow.json file.": "Sit da akken ad tzedmeḍ afaylu workflow.json.",
"click here.": "sit da.",
"Click on the user role button to change a user's role.": "Tekki ɣef tqeffalt n temlilt n useqdac akken ad tbeddleḍ tamlilt n useqdac.",
"Click to connect": "",
"Click to copy ID": "",
"Client ID": "",
"Client Secret": "",
"Clipboard write permission denied. Please check your browser settings to grant the necessary access.": "Yettwagdel unekcum ɣer tira. Ssefqed iɣewwaṛen-ik n yiminig ma ulac aɣilif akken ad tkecmeḍ ɣer wayen ilaqen.",
"Clone": "Sleg",
"Clone Chat": "Sleg adiwenni",
@ -819,6 +822,8 @@
"Experimental": "Armitan",
"Explain": "Segzi",
"Explore the cosmos": "Snirem akusmus",
"Explored": "",
"Exploring": "",
"Export": "Asifeḍ",
"Export All Archived Chats": "Kter akk Archived Chats",
"Export All Chats (All Users)": "Kter akk idiwenniyen (n yiseqdacen akk)",
@ -1381,6 +1386,7 @@
"November": "Wambeṛ",
"OAuth": "OAuth",
"OAuth 2.1": "OAuth 2.1",
"OAuth 2.1 (Static)": "",
"OAuth ID": "Asulay OAuth",
"October": "Tubeṛ",
"Off": "Yensa",
@ -1491,6 +1497,7 @@
"Playwright Timeout (ms)": "Tanzagt n ugani n Playwright (ms)",
"Playwright WebSocket URL": "URL n websocket Playwright",
"Please carefully review the following warnings:": "",
"Please connect all required integrations before sending a message": "",
"Please do not close the settings page while loading the model.": "",
"Please enter a message or attach a file.": "Ttxil-k·m sekcem-d izen neɣ seddu afaylu.",
"Please enter a prompt": "Ttxil-k·m, sekcem-d aneftaɣ",
@ -1499,6 +1506,7 @@
"Please enter a valid path": "Ttxil-k·m, sekcem-d abrid iṣeḥḥan",
"Please enter a valid URL": "Ma ulac aɣilif, sekcem URL tameɣtut",
"Please enter a valid URL.": "Ttxil, awi-d URL tameɣtut.",
"Please enter Client ID and Client Secret": "",
"Please fill in all fields.": "",
"Please register the OAuth client": "",
"Please save the connection to persist the OAuth client information and do not change the ID": "",
@ -1545,6 +1553,8 @@
"Querying": "",
"Quick Actions": "Tigawin tiruradin",
"RAG Template": "Tamudemt RAG",
"Ran {{COUNT}} analyses": "",
"Ran {{COUNT}} analysis": "",
"Rate {{rating}} out of 10": "",
"Rating": "Asezmel",
"Re-rank models by topic similarity": "Imudam i d-yettuɣalen ɣer sdat s usentel yecban wa",
@ -1926,6 +1936,7 @@
"This will delete all models including custom models and cannot be undone.": "Aya ad yekkes akk timudmin gar-asent timudmin tudmawanin yerna ur yezmir yiwen ad tent-id-yerr.",
"This will reset the knowledge base and sync all files. Do you wish to continue?": "Aya ad yales taffa n tmussni u ad yemtawi akk ifuyla. Tebɣiḍ ad tkemmleḍ?",
"Thorough explanation": "Asegzi leqqayen",
"Thought": "",
"Thought for {{DURATION}}": "Ixemmem {{DURATION}}",
"Thought for {{DURATION}} seconds": "Axemmem ɣef {{DURATION}} n tsinin",
"Thought for less than a second": "",
@ -1954,6 +1965,7 @@
"Today at {{LOCALIZED_TIME}}": "Ass-a, ɣef {{LOCALIZED_TIME}}",
"Toggle {{COUNT}} sources": "",
"Toggle 1 source": "",
"Toggle details": "",
"Toggle Dictation": "",
"Toggle Sidebar": "",
"Toggle status history": "",

View file

@ -330,7 +330,10 @@
"Click here to upload a workflow.json file.": "workflow.json 파일을 업로드하려면 여기를 클릭하세요",
"click here.": "여기를 클릭하세요.",
"Click on the user role button to change a user's role.": "사용자 역할 버튼을 클릭하여 사용자의 역할을 변경하세요.",
"Click to connect": "",
"Click to copy ID": "",
"Client ID": "",
"Client Secret": "",
"Clipboard write permission denied. Please check your browser settings to grant the necessary access.": "클립보드 쓰기 권한이 거부되었습니다. 브라우저 설정에서 권한을 허용해주세요.",
"Clone": "복제",
"Clone Chat": "채팅 복제",
@ -818,6 +821,8 @@
"Experimental": "실험적",
"Explain": "설명",
"Explore the cosmos": "우주 탐험",
"Explored": "",
"Exploring": "",
"Export": "내보내기",
"Export All Archived Chats": "모든 보관된 채팅 내보내기",
"Export All Chats (All Users)": "모든 채팅 내보내기(모든 사용자)",
@ -1380,6 +1385,7 @@
"November": "11월",
"OAuth": "",
"OAuth 2.1": "",
"OAuth 2.1 (Static)": "",
"OAuth ID": "OAuth ID",
"October": "10월",
"Off": "끄기",
@ -1490,6 +1496,7 @@
"Playwright Timeout (ms)": "Playwright 시간 초과 (ms)",
"Playwright WebSocket URL": "Playwright WebSocket URL",
"Please carefully review the following warnings:": "다음 주의를 조심히 확인해주십시오",
"Please connect all required integrations before sending a message": "",
"Please do not close the settings page while loading the model.": "모델을 로드하는 동안 설정 페이지를 닫지 마세요.",
"Please enter a message or attach a file.": "메시지를 입력하거나 파일을 첨부해 주세요.",
"Please enter a prompt": "프롬프트를 입력해주세요",
@ -1498,6 +1505,7 @@
"Please enter a valid path": "올바른 경로를 입력하세요",
"Please enter a valid URL": "올바른 URL을 입력하세요",
"Please enter a valid URL.": "올바른 URL을 입력하세요.",
"Please enter Client ID and Client Secret": "",
"Please fill in all fields.": "모두 빈칸없이 채워주세요",
"Please register the OAuth client": "OAuth clith를 등록해주세요",
"Please save the connection to persist the OAuth client information and do not change the ID": "OAuth 클라이언트 정보를 저장하려면 연결을 저장하고 ID를 변경하지 마세요.",
@ -1544,6 +1552,8 @@
"Querying": "쿼리 진행중",
"Quick Actions": "빠른 작업",
"RAG Template": "RAG 템플릿",
"Ran {{COUNT}} analyses": "",
"Ran {{COUNT}} analysis": "",
"Rate {{rating}} out of 10": "",
"Rating": "평가",
"Re-rank models by topic similarity": "주제 유사성으로 모델을 재정렬하기",
@ -1924,6 +1934,7 @@
"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": "",
"Thought for {{DURATION}}": "{{DURATION}} 동안 생각함",
"Thought for {{DURATION}} seconds": "{{DURATION}}초 동안 생각함",
"Thought for less than a second": "1초 미만 동안 생각함",
@ -1952,6 +1963,7 @@
"Today at {{LOCALIZED_TIME}}": "오늘 {{LOCALIZED_TIME}}",
"Toggle {{COUNT}} sources": "",
"Toggle 1 source": "",
"Toggle details": "",
"Toggle Dictation": "",
"Toggle Sidebar": "",
"Toggle status history": "",

View file

@ -333,7 +333,10 @@
"Click here to upload a workflow.json file.": "",
"click here.": "paspauskite čia.",
"Click on the user role button to change a user's role.": "Paspauskite ant naudotojo rolės mygtuko tam, kad pakeisti naudotojo rolę.",
"Click to connect": "",
"Click to copy ID": "",
"Client ID": "",
"Client Secret": "",
"Clipboard write permission denied. Please check your browser settings to grant the necessary access.": "Iškarpinės naudojimas neleidžiamas naršyklės.",
"Clone": "Klonuoti",
"Clone Chat": "",
@ -407,7 +410,7 @@
"Content Extraction Engine": "",
"Content lengths (character counts only)": "",
"Continue Response": "Tęsti atsakymą",
"Continue with {{provider}}": "Tęsti su {{tiekėju}}",
"Continue with {{provider}}": "Tęsti su {{provider}}",
"Continue with Email": "",
"Continue with LDAP": "",
"Control how message text is split for TTS requests. 'Punctuation' splits into sentences, 'paragraphs' splits into paragraphs, and 'none' keeps the message as a single string.": "",
@ -821,6 +824,8 @@
"Experimental": "Eksperimentinis",
"Explain": "",
"Explore the cosmos": "",
"Explored": "",
"Exploring": "",
"Export": "Eksportuoti",
"Export All Archived Chats": "",
"Export All Chats (All Users)": "Eksportuoti visų naudotojų visus pokalbius",
@ -1383,6 +1388,7 @@
"November": "lapkritis",
"OAuth": "",
"OAuth 2.1": "",
"OAuth 2.1 (Static)": "",
"OAuth ID": "OAuth ID",
"October": "spalis",
"Off": "Išjungta",
@ -1493,6 +1499,7 @@
"Playwright Timeout (ms)": "",
"Playwright WebSocket URL": "",
"Please carefully review the following warnings:": "Peržiūrėkite šiuos perspėjimus:",
"Please connect all required integrations before sending a message": "",
"Please do not close the settings page while loading the model.": "",
"Please enter a message or attach a file.": "",
"Please enter a prompt": "",
@ -1501,6 +1508,7 @@
"Please enter a valid path": "",
"Please enter a valid URL": "",
"Please enter a valid URL.": "",
"Please enter Client ID and Client Secret": "",
"Please fill in all fields.": "",
"Please register the OAuth client": "",
"Please save the connection to persist the OAuth client information and do not change the ID": "",
@ -1547,6 +1555,8 @@
"Querying": "",
"Quick Actions": "",
"RAG Template": "RAG šablonas",
"Ran {{COUNT}} analyses": "",
"Ran {{COUNT}} analysis": "",
"Rate {{rating}} out of 10": "",
"Rating": "",
"Re-rank models by topic similarity": "",
@ -1930,6 +1940,7 @@
"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": "Platus paaiškinimas",
"Thought": "",
"Thought for {{DURATION}}": "",
"Thought for {{DURATION}} seconds": "",
"Thought for less than a second": "",
@ -1958,6 +1969,7 @@
"Today at {{LOCALIZED_TIME}}": "",
"Toggle {{COUNT}} sources": "",
"Toggle 1 source": "",
"Toggle details": "",
"Toggle Dictation": "",
"Toggle Sidebar": "",
"Toggle status history": "",

View file

@ -332,7 +332,10 @@
"Click here to upload a workflow.json file.": "Noklikšķiniet šeit, lai augšupielādētu workflow.json failu.",
"click here.": "noklikšķiniet šeit.",
"Click on the user role button to change a user's role.": "Noklikšķiniet uz lietotāja lomas pogas, lai mainītu lietotāja lomu.",
"Click to connect": "",
"Click to copy ID": "",
"Client ID": "",
"Client Secret": "",
"Clipboard write permission denied. Please check your browser settings to grant the necessary access.": "Starpliktuves rakstīšanas atļauja liegta. Lūdzu, pārbaudiet pārlūka iestatījumus, lai piešķirtu nepieciešamo piekļuvi.",
"Clone": "Klonēt",
"Clone Chat": "Klonēt tērzēšanu",
@ -820,6 +823,8 @@
"Experimental": "Eksperimentāls",
"Explain": "Paskaidrot",
"Explore the cosmos": "Izpētiet cosmos",
"Explored": "",
"Exploring": "",
"Export": "Eksportēt",
"Export All Archived Chats": "Eksportēt visas arhivētās tērzēšanas",
"Export All Chats (All Users)": "Eksportēt visas tērzēšanas (visi lietotāji)",
@ -1382,6 +1387,7 @@
"November": "Novembris",
"OAuth": "OAuth",
"OAuth 2.1": "OAuth 2.1",
"OAuth 2.1 (Static)": "",
"OAuth ID": "OAuth ID",
"October": "Oktobris",
"Off": "Izslēgts",
@ -1492,6 +1498,7 @@
"Playwright Timeout (ms)": "Playwright taimauts (ms)",
"Playwright WebSocket URL": "Playwright WebSocket URL",
"Please carefully review the following warnings:": "Lūdzu, rūpīgi pārskatiet šādus brīdinājumus:",
"Please connect all required integrations before sending a message": "",
"Please do not close the settings page while loading the model.": "Lūdzu, neaizveriet iestatījumu lapu, kamēr modelis tiek ielādēts.",
"Please enter a message or attach a file.": "Lūdzu, ievadiet ziņojumu vai pievienojiet failu.",
"Please enter a prompt": "Lūdzu, ievadiet uzvedni",
@ -1500,6 +1507,7 @@
"Please enter a valid path": "Lūdzu, ievadiet derīgu ceļu",
"Please enter a valid URL": "Lūdzu, ievadiet derīgu URL",
"Please enter a valid URL.": "Lūdzu, ievadiet derīgu URL.",
"Please enter Client ID and Client Secret": "",
"Please fill in all fields.": "Lūdzu, aizpildiet visus laukus.",
"Please register the OAuth client": "Lūdzu, reģistrējiet OAuth klientu",
"Please save the connection to persist the OAuth client information and do not change the ID": "Lūdzu, saglabājiet savienojumu, lai saglabātu OAuth klienta informāciju, un nemainiet ID",
@ -1546,6 +1554,8 @@
"Querying": "Vaicā",
"Quick Actions": "Ātrās darbības",
"RAG Template": "RAG veidne",
"Ran {{COUNT}} analyses": "",
"Ran {{COUNT}} analysis": "",
"Rate {{rating}} out of 10": "",
"Rating": "Vērtējums",
"Re-rank models by topic similarity": "Pārkārtot modeļus pēc tēmas līdzības",
@ -1928,6 +1938,7 @@
"This will delete all models including custom models and cannot be undone.": "Tas dzēsīs visus modeļus, ieskaitot pielāgotos modeļus, un to nevar atsaukt.",
"This will reset the knowledge base and sync all files. Do you wish to continue?": "Tas atiestatīs zināšanu bāzi un sinhronizēs visus failus. Vai vēlaties turpināt?",
"Thorough explanation": "Pamatīgs skaidrojums",
"Thought": "",
"Thought for {{DURATION}}": "Domāja {{DURATION}}",
"Thought for {{DURATION}} seconds": "Domāja {{DURATION}} sekundes",
"Thought for less than a second": "Domāja mazāk par sekundi",
@ -1956,6 +1967,7 @@
"Today at {{LOCALIZED_TIME}}": "Šodien plkst. {{LOCALIZED_TIME}}",
"Toggle {{COUNT}} sources": "",
"Toggle 1 source": "",
"Toggle details": "",
"Toggle Dictation": "",
"Toggle Sidebar": "Pārslēgt sānjoslu",
"Toggle status history": "",

View file

@ -330,7 +330,10 @@
"Click here to upload a workflow.json file.": "Klik di sini untuk memuat naik fail workflow.json.",
"click here.": "klik disini.",
"Click on the user role button to change a user's role.": "Klik pada butang peranan pengguna untuk menukar peranan pengguna",
"Click to connect": "",
"Click to copy ID": "Klik untuk menyalin ID",
"Client ID": "",
"Client Secret": "",
"Clipboard write permission denied. Please check your browser settings to grant the necessary access.": "Kebenaran untuk menulis di papan klip ditolak. Sila semak tetapan pelayan web anda untuk memberikan akses yang diperlukan",
"Clone": "Klon",
"Clone Chat": "Klon Sembang",
@ -818,6 +821,8 @@
"Experimental": "Percubaan",
"Explain": "Jelaskan",
"Explore the cosmos": "Jelajahi alam semesta",
"Explored": "",
"Exploring": "",
"Export": "Eksport",
"Export All Archived Chats": "Eksport Semua Sembang Tersimpan",
"Export All Chats (All Users)": "Eksport Semua Perbualan (Semua Pengguna)",
@ -1380,6 +1385,7 @@
"November": "November",
"OAuth": "OAuth",
"OAuth 2.1": "OAuth 2.1",
"OAuth 2.1 (Static)": "",
"OAuth ID": "ID OAuth",
"October": "Oktober",
"Off": "Mati",
@ -1490,6 +1496,7 @@
"Playwright Timeout (ms)": "Masa Tamat Playwright (ms)",
"Playwright WebSocket URL": "URL WebSocket Playwright",
"Please carefully review the following warnings:": "Sila semak dengan teliti amaran berikut:",
"Please connect all required integrations before sending a message": "",
"Please do not close the settings page while loading the model.": "Sila jangan tutup halaman tetapan semasa memuat model.",
"Please enter a message or attach a file.": "Sila masukkan mesej atau lampirkan fail.",
"Please enter a prompt": "Sila masukkan arahan",
@ -1498,6 +1505,7 @@
"Please enter a valid path": "Sila masukkan laluan yang sah",
"Please enter a valid URL": "Sila masukkan URL yang sah",
"Please enter a valid URL.": "Sila masukkan URL yang sah.",
"Please enter Client ID and Client Secret": "",
"Please fill in all fields.": "Sila isi semua medan.",
"Please register the OAuth client": "Sila daftarkan klien OAuth",
"Please save the connection to persist the OAuth client information and do not change the ID": "Sila simpan sambungan untuk mengekalkan maklumat klien OAuth dan jangan ubah ID",
@ -1544,6 +1552,8 @@
"Querying": "Sedang Membuat Pertanyaan",
"Quick Actions": "Tindakan Pantas",
"RAG Template": "Templat RAG",
"Ran {{COUNT}} analyses": "",
"Ran {{COUNT}} analysis": "",
"Rate {{rating}} out of 10": "Kadar {{rating}} daripada 10",
"Rating": "Penilaian",
"Re-rank models by topic similarity": "Susun semula model mengikut persamaan topik",
@ -1924,6 +1934,7 @@
"This will delete all models including custom models and cannot be undone.": "Ini akan memadam semua model termasuk model tersuai dan tidak boleh dibuat asal.",
"This will reset the knowledge base and sync all files. Do you wish to continue?": "Ini akan menetapkan semula pangkalan pengetahuan dan menyegerakkan semua fail. Adakah anda ingin meneruskan?",
"Thorough explanation": "Penjelasan menyeluruh",
"Thought": "",
"Thought for {{DURATION}}": "Berfikir selama {{DURATION}}",
"Thought for {{DURATION}} seconds": "Berfikir selama {{DURATION}} saat",
"Thought for less than a second": "Berfikir selama kurang dari satu saat",
@ -1952,6 +1963,7 @@
"Today at {{LOCALIZED_TIME}}": "Hari ini pada {{LOCALIZED_TIME}}",
"Toggle {{COUNT}} sources": "Togol {{COUNT}} sumber",
"Toggle 1 source": "Togol 1 sumber",
"Toggle details": "",
"Toggle Dictation": "Togol Diktasi",
"Toggle Sidebar": "Togol Sisi Bar",
"Toggle status history": "Togol sejarah status",

View file

@ -331,7 +331,10 @@
"Click here to upload a workflow.json file.": "Klikk her for å laste opp en workflow.json-fil.",
"click here.": "klikk her.",
"Click on the user role button to change a user's role.": "Klikk på knappen Brukerrolle for å endre en brukers rolle.",
"Click to connect": "",
"Click to copy ID": "",
"Client ID": "",
"Client Secret": "",
"Clipboard write permission denied. Please check your browser settings to grant the necessary access.": "Skrivetilgang til utklippstavlen avslått. Kontroller nettleserinnstillingene for å gi den nødvendige tilgangen.",
"Clone": "Klon",
"Clone Chat": "Klone chat",
@ -819,6 +822,8 @@
"Experimental": "Eksperimentell",
"Explain": "",
"Explore the cosmos": "Utforsk verdensrommet",
"Explored": "",
"Exploring": "",
"Export": "Eksporter",
"Export All Archived Chats": "Eksporter alle arkiverte chatter",
"Export All Chats (All Users)": "Eksporter alle chatter (alle brukere)",
@ -1381,6 +1386,7 @@
"November": "november",
"OAuth": "",
"OAuth 2.1": "",
"OAuth 2.1 (Static)": "",
"OAuth ID": "OAuth-ID",
"October": "oktober",
"Off": "Av",
@ -1491,6 +1497,7 @@
"Playwright Timeout (ms)": "",
"Playwright WebSocket URL": "",
"Please carefully review the following warnings:": "Les gjennom følgende advarsler grundig:",
"Please connect all required integrations before sending a message": "",
"Please do not close the settings page while loading the model.": "Ikke lukk siden Innstillinger mens du laster inn modellen.",
"Please enter a message or attach a file.": "",
"Please enter a prompt": "Angi en ledetekst",
@ -1499,6 +1506,7 @@
"Please enter a valid path": "",
"Please enter a valid URL": "",
"Please enter a valid URL.": "",
"Please enter Client ID and Client Secret": "",
"Please fill in all fields.": "Fyll i alle felter",
"Please register the OAuth client": "",
"Please save the connection to persist the OAuth client information and do not change the ID": "",
@ -1545,6 +1553,8 @@
"Querying": "",
"Quick Actions": "",
"RAG Template": "RAG-mal",
"Ran {{COUNT}} analyses": "",
"Ran {{COUNT}} analysis": "",
"Rate {{rating}} out of 10": "",
"Rating": "Vurdering",
"Re-rank models by topic similarity": "Ny rangering av modeller etter emnelikhet",
@ -1926,6 +1936,7 @@
"This will delete all models including custom models and cannot be undone.": "Dette sletter alle modeller, inkludert tilpassede modeller, og kan ikke angres.",
"This will reset the knowledge base and sync all files. Do you wish to continue?": "Dette tilbakestiller kunnskapsbasen og synkroniserer alle filer. Vil du fortsette?",
"Thorough explanation": "Grundig forklaring",
"Thought": "",
"Thought for {{DURATION}}": "Tenkte i {{DURATION}}",
"Thought for {{DURATION}} seconds": "Tenkte i {{DURATION}} sekunder",
"Thought for less than a second": "",
@ -1954,6 +1965,7 @@
"Today at {{LOCALIZED_TIME}}": "",
"Toggle {{COUNT}} sources": "",
"Toggle 1 source": "",
"Toggle details": "",
"Toggle Dictation": "",
"Toggle Sidebar": "",
"Toggle status history": "",

View file

@ -331,7 +331,10 @@
"Click here to upload a workflow.json file.": "Klik hier om een workflow.json-bestand te uploaden.",
"click here.": "klik hier.",
"Click on the user role button to change a user's role.": "Klik op de gebruikersrol knop om de rol van een gebruiker te wijzigen.",
"Click to connect": "",
"Click to copy ID": "",
"Client ID": "",
"Client Secret": "",
"Clipboard write permission denied. Please check your browser settings to grant the necessary access.": "Klembord schrijftoestemming geweigerd. Kijk je browserinstellingen na om de benodigde toestemming te geven.",
"Clone": "Kloon",
"Clone Chat": "Kloon chat",
@ -819,6 +822,8 @@
"Experimental": "Experimenteel",
"Explain": "Leg uit",
"Explore the cosmos": "Ontdek de kosmos",
"Explored": "",
"Exploring": "",
"Export": "Exporteren",
"Export All Archived Chats": "Exporteer alle gearchiveerde chats",
"Export All Chats (All Users)": "Exporteer alle chats (Alle gebruikers)",
@ -1381,6 +1386,7 @@
"November": "November",
"OAuth": "",
"OAuth 2.1": "",
"OAuth 2.1 (Static)": "",
"OAuth ID": "OAuth ID",
"October": "Oktober",
"Off": "Uit",
@ -1491,6 +1497,7 @@
"Playwright Timeout (ms)": "",
"Playwright WebSocket URL": "",
"Please carefully review the following warnings:": "Beoordeel de volgende waarschuwingen nauwkeurig:",
"Please connect all required integrations before sending a message": "",
"Please do not close the settings page while loading the model.": "Sluit de instellingenpagina niet terwijl het model geladen wordt.",
"Please enter a message or attach a file.": "",
"Please enter a prompt": "Voer een prompt in",
@ -1499,6 +1506,7 @@
"Please enter a valid path": "",
"Please enter a valid URL": "",
"Please enter a valid URL.": "",
"Please enter Client ID and Client Secret": "",
"Please fill in all fields.": "Voer alle velden in",
"Please register the OAuth client": "",
"Please save the connection to persist the OAuth client information and do not change the ID": "",
@ -1545,6 +1553,8 @@
"Querying": "",
"Quick Actions": "",
"RAG Template": "RAG-sjabloon",
"Ran {{COUNT}} analyses": "",
"Ran {{COUNT}} analysis": "",
"Rate {{rating}} out of 10": "",
"Rating": "Beoordeling",
"Re-rank models by topic similarity": "Herrangschik modellen op basis van onderwerpsovereenkomst",
@ -1926,6 +1936,7 @@
"This will delete all models including custom models and cannot be undone.": "Dit zal alle modellen, ook aangepaste modellen, verwijderen en kan niet ongedaan worden gemaakt",
"This will reset the knowledge base and sync all files. Do you wish to continue?": "Dit zal de kennisdatabase resetten en alle bestanden synchroniseren. Wilt u doorgaan?",
"Thorough explanation": "Grondige uitleg",
"Thought": "",
"Thought for {{DURATION}}": "Dacht {{DURATION}}",
"Thought for {{DURATION}} seconds": "Dacht {{DURATION}} seconden",
"Thought for less than a second": "",
@ -1954,6 +1965,7 @@
"Today at {{LOCALIZED_TIME}}": "",
"Toggle {{COUNT}} sources": "",
"Toggle 1 source": "",
"Toggle details": "",
"Toggle Dictation": "",
"Toggle Sidebar": "",
"Toggle status history": "",

View file

@ -331,7 +331,10 @@
"Click here to upload a workflow.json file.": "",
"click here.": "ਇੱਥੇ ਕਲਿੱਕ ਕਰੋ।",
"Click on the user role button to change a user's role.": "ਉਪਭੋਗਤਾ ਦੀ ਭੂਮਿਕਾ ਬਦਲਣ ਲਈ ਉਪਭੋਗਤਾ ਭੂਮਿਕਾ ਬਟਨ 'ਤੇ ਕਲਿੱਕ ਕਰੋ।",
"Click to connect": "",
"Click to copy ID": "",
"Client ID": "",
"Client Secret": "",
"Clipboard write permission denied. Please check your browser settings to grant the necessary access.": "",
"Clone": "ਕਲੋਨ",
"Clone Chat": "",
@ -819,6 +822,8 @@
"Experimental": "ਪਰਮਾਣੂਕ੍ਰਿਤ",
"Explain": "",
"Explore the cosmos": "",
"Explored": "",
"Exploring": "",
"Export": "ਨਿਰਯਾਤ",
"Export All Archived Chats": "",
"Export All Chats (All Users)": "ਸਾਰੀਆਂ ਗੱਲਾਂ ਨਿਰਯਾਤ ਕਰੋ (ਸਾਰੇ ਉਪਭੋਗਤਾ)",
@ -1381,6 +1386,7 @@
"November": "ਨਵੰਬਰ",
"OAuth": "",
"OAuth 2.1": "",
"OAuth 2.1 (Static)": "",
"OAuth ID": "",
"October": "ਅਕਤੂਬਰ",
"Off": "ਬੰਦ",
@ -1491,6 +1497,7 @@
"Playwright Timeout (ms)": "",
"Playwright WebSocket URL": "",
"Please carefully review the following warnings:": "",
"Please connect all required integrations before sending a message": "",
"Please do not close the settings page while loading the model.": "",
"Please enter a message or attach a file.": "",
"Please enter a prompt": "",
@ -1499,6 +1506,7 @@
"Please enter a valid path": "",
"Please enter a valid URL": "",
"Please enter a valid URL.": "",
"Please enter Client ID and Client Secret": "",
"Please fill in all fields.": "",
"Please register the OAuth client": "",
"Please save the connection to persist the OAuth client information and do not change the ID": "",
@ -1545,6 +1553,8 @@
"Querying": "",
"Quick Actions": "",
"RAG Template": "RAG ਟੈਮਪਲੇਟ",
"Ran {{COUNT}} analyses": "",
"Ran {{COUNT}} analysis": "",
"Rate {{rating}} out of 10": "",
"Rating": "",
"Re-rank models by topic similarity": "",
@ -1926,6 +1936,7 @@
"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": "",
"Thought for {{DURATION}}": "",
"Thought for {{DURATION}} seconds": "",
"Thought for less than a second": "",
@ -1954,6 +1965,7 @@
"Today at {{LOCALIZED_TIME}}": "",
"Toggle {{COUNT}} sources": "",
"Toggle 1 source": "",
"Toggle details": "",
"Toggle Dictation": "",
"Toggle Sidebar": "",
"Toggle status history": "",

View file

@ -333,7 +333,10 @@
"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 ją zmienić.",
"Click to connect": "",
"Click to copy ID": "",
"Client ID": "",
"Client Secret": "",
"Clipboard write permission denied. Please check your browser settings to grant the necessary access.": "Odmowa dostępu do schowka. Sprawdź ustawienia przeglądarki.",
"Clone": "Sklonuj",
"Clone Chat": "Sklonuj czat",
@ -821,6 +824,8 @@
"Experimental": "Eksperymentalne",
"Explain": "Wyjaśnij",
"Explore the cosmos": "Eksploruj kosmos",
"Explored": "",
"Exploring": "",
"Export": "Eksportuj",
"Export All Archived Chats": "Eksportuj wszystkie zarchiwizowane czaty",
"Export All Chats (All Users)": "Eksportuj wszystkie czaty (Wszyscy użytkownicy)",
@ -1383,6 +1388,7 @@
"November": "Listopad",
"OAuth": "OAuth",
"OAuth 2.1": "OAuth 2.1",
"OAuth 2.1 (Static)": "",
"OAuth ID": "ID OAuth",
"October": "Październik",
"Off": "Wył.",
@ -1493,6 +1499,7 @@
"Playwright Timeout (ms)": "Timeout Playwright (ms)",
"Playwright WebSocket URL": "URL WebSocket Playwright",
"Please carefully review the following warnings:": "Uważnie przeczytaj poniższe ostrzeżenia:",
"Please connect all required integrations before sending a message": "",
"Please do not close the settings page while loading the model.": "Nie zamykaj ustawień podczas ładowania modelu.",
"Please enter a message or attach a file.": "Wpisz wiadomość lub załącz plik.",
"Please enter a prompt": "Wprowadź prompt",
@ -1501,6 +1508,7 @@
"Please enter a valid path": "Wprowadź poprawną ścieżkę",
"Please enter a valid URL": "Wprowadź poprawny URL",
"Please enter a valid URL.": "Wprowadź poprawny URL.",
"Please enter Client ID and Client Secret": "",
"Please fill in all fields.": "Wypełnij wszystkie pola.",
"Please register the OAuth client": "Zarejestruj klienta OAuth",
"Please save the connection to persist the OAuth client information and do not change the ID": "Zapisz połączenie aby zachować dane klienta OAuth i nie zmieniaj ID",
@ -1547,6 +1555,8 @@
"Querying": "Odpytywanie",
"Quick Actions": "Szybkie akcje",
"RAG Template": "Szablon RAG",
"Ran {{COUNT}} analyses": "",
"Ran {{COUNT}} analysis": "",
"Rate {{rating}} out of 10": "",
"Rating": "Ocena",
"Re-rank models by topic similarity": "Rerankowanie modeli wg podobieństwa tematycznego",
@ -1930,6 +1940,7 @@
"This will delete all models including custom models and cannot be undone.": "To usunie wszystkie modele i jest nieodwracalne.",
"This will reset the knowledge base and sync all files. Do you wish to continue?": "To zresetuje bazę wiedzy i zsynchronizuje pliki. Kontynuować?",
"Thorough explanation": "Dokładne wyjaśnienie",
"Thought": "",
"Thought for {{DURATION}}": "Myślał przez {{DURATION}}",
"Thought for {{DURATION}} seconds": "Myślał przez {{DURATION}} sekund",
"Thought for less than a second": "Myślał krócej niż sekundę",
@ -1958,6 +1969,7 @@
"Today at {{LOCALIZED_TIME}}": "Dzisiaj o {{LOCALIZED_TIME}}",
"Toggle {{COUNT}} sources": "",
"Toggle 1 source": "",
"Toggle details": "",
"Toggle Dictation": "",
"Toggle Sidebar": "Przełącz pasek boczny",
"Toggle status history": "",

View file

@ -332,7 +332,10 @@
"Click here to upload a workflow.json file.": "Clique aqui para enviar um arquivo workflow.json.",
"click here.": "clique aqui.",
"Click on the user role button to change a user's role.": "Clique no botão de perfil do usuário para alterar o perfil de um usuário.",
"Click to connect": "Clique para conectar",
"Click to copy ID": "Clique para copiar o ID",
"Client ID": "ID do Cliente",
"Client Secret": "Chave Secreta do Cliente",
"Clipboard write permission denied. Please check your browser settings to grant the necessary access.": "Permissão de escrita na área de transferência negada. Verifique as configurações do seu navegador para conceder o acesso necessário.",
"Clone": "Clonar",
"Clone Chat": "Clonar Chat",
@ -820,6 +823,8 @@
"Experimental": "Experimental",
"Explain": "Explicar",
"Explore the cosmos": "Explorar o cosmos",
"Explored": "Explorado",
"Exploring": "Explorando",
"Export": "Exportar",
"Export All Archived Chats": "Exportar todos os chats arquivados",
"Export All Chats (All Users)": "Exportar Todos os Chats (Todos os Usuários)",
@ -1382,6 +1387,7 @@
"November": "Novembro",
"OAuth": "OAuth",
"OAuth 2.1": "OAuth 2.1",
"OAuth 2.1 (Static)": "OAuth 2.1 (Estático)",
"OAuth ID": "OAuth ID",
"October": "Outubro",
"Off": "Desligado",
@ -1492,6 +1498,7 @@
"Playwright Timeout (ms)": "Tempo limite do Playwright (ms)",
"Playwright WebSocket URL": "URL do WebSocket do Playwright",
"Please carefully review the following warnings:": "Por favor, revise cuidadosamente os seguintes avisos:",
"Please connect all required integrations before sending a message": "Conecte todas as integrações necessárias antes de enviar uma mensagem",
"Please do not close the settings page while loading the model.": "Não feche a página de configurações enquanto estiver carregando o modelo.",
"Please enter a message or attach a file.": "Por favor, insira uma mensagem ou anexe um arquivo.",
"Please enter a prompt": "Por favor, digite um prompt",
@ -1500,6 +1507,7 @@
"Please enter a valid path": "Por favor, insira um caminho válido",
"Please enter a valid URL": "Por favor, insira uma URL válida",
"Please enter a valid URL.": "Por favor, insira uma URL válida",
"Please enter Client ID and Client Secret": "Insira o ID do Cliente e a Chave Secreta do Cliente",
"Please fill in all fields.": "Por favor, preencha todos os campos.",
"Please register the OAuth client": "Por favor, registre o cliente OAuth",
"Please save the connection to persist the OAuth client information and do not change the ID": "Salve a conexão para persistir as informações do cliente OAuth e não altere o ID",
@ -1546,6 +1554,8 @@
"Querying": "Consultando",
"Quick Actions": "Ações rápidas",
"RAG Template": "Modelo RAG",
"Ran {{COUNT}} analyses": "Executou {{COUNT}} análises",
"Ran {{COUNT}} analysis": "Executou {{COUNT}} análise",
"Rate {{rating}} out of 10": "Avaliar {{rating}} de 10",
"Rating": "Avaliação",
"Re-rank models by topic similarity": "Reclassificação de modelos por similaridade de tópico",
@ -1928,6 +1938,7 @@
"This will delete all models including custom models and cannot be undone.": "Isto vai excluir todos os modelos, incluindo personalizados e não pode ser desfeito.",
"This will reset the knowledge base and sync all files. Do you wish to continue?": "Esta ação resetará a base de conhecimento e sincronizará todos os arquivos. Deseja continuar?",
"Thorough explanation": "Explicação detalhada",
"Thought": "Pensamento",
"Thought for {{DURATION}}": "Pensado por {{DURATION}}",
"Thought for {{DURATION}} seconds": "Pensado por {{DURATION}} segundos",
"Thought for less than a second": "Pensou por menos de um segundo",
@ -1956,6 +1967,7 @@
"Today at {{LOCALIZED_TIME}}": "Hoje às {{LOCALIZED_TIME}}",
"Toggle {{COUNT}} sources": "Alternar {{COUNT}} origens",
"Toggle 1 source": "Alternar 1 origem",
"Toggle details": "Alternar detalhes",
"Toggle Dictation": "Alternar Ditado",
"Toggle Sidebar": "Alternar barra lateral",
"Toggle status history": "Alternar histórico de status",

View file

@ -332,7 +332,10 @@
"Click here to upload a workflow.json file.": "Clique aqui para carregar um ficheiro workflow.json.",
"click here.": "clique aqui.",
"Click on the user role button to change a user's role.": "Clique no botão de função do utilizador para alterar a função de um utilizador.",
"Click to connect": "",
"Click to copy ID": "Clique para copiar o ID",
"Client ID": "",
"Client Secret": "",
"Clipboard write permission denied. Please check your browser settings to grant the necessary access.": "Permissão de escrita na área de transferência negada. Por favor, verifique as configurações do seu navegador para conceder o acesso necessário.",
"Clone": "Clonar",
"Clone Chat": "Clonar Conversa",
@ -820,6 +823,8 @@
"Experimental": "Experimental",
"Explain": "Explicar",
"Explore the cosmos": "Explorar o cosmos",
"Explored": "",
"Exploring": "",
"Export": "Exportar",
"Export All Archived Chats": "Exportar Todas as Conversas Arquivadas",
"Export All Chats (All Users)": "Exportar Todas as Conversas (Todos os Utilizadores)",
@ -1382,6 +1387,7 @@
"November": "Novembro",
"OAuth": "OAuth",
"OAuth 2.1": "OAuth 2.1",
"OAuth 2.1 (Static)": "",
"OAuth ID": "ID do OAuth",
"October": "Outubro",
"Off": "Desligado",
@ -1492,6 +1498,7 @@
"Playwright Timeout (ms)": "Tempo limite do Playwright (ms)",
"Playwright WebSocket URL": "URL do WebSocket do Playwright",
"Please carefully review the following warnings:": "Por favor, reveja cuidadosamente os seguintes avisos:",
"Please connect all required integrations before sending a message": "",
"Please do not close the settings page while loading the model.": "Por favor, não feche a página de configurações enquanto o modelo está a ser carregado.",
"Please enter a message or attach a file.": "Por favor, insira uma mensagem ou anexe um ficheiro.",
"Please enter a prompt": "Por favor, insira um prompt",
@ -1500,6 +1507,7 @@
"Please enter a valid path": "Por favor, insira um caminho válido",
"Please enter a valid URL": "Por favor, insira uma URL válida",
"Please enter a valid URL.": "Por favor, insira uma URL válida.",
"Please enter Client ID and Client Secret": "",
"Please fill in all fields.": "Por favor, preencha todos os campos.",
"Please register the OAuth client": "Por favor, registe o cliente OAuth",
"Please save the connection to persist the OAuth client information and do not change the ID": "Por favor, guarde a ligação para persistir as informações do cliente OAuth e não altere o ID",
@ -1546,6 +1554,8 @@
"Querying": "A Consultar",
"Quick Actions": "Ações Rápidas",
"RAG Template": "Modelo RAG",
"Ran {{COUNT}} analyses": "",
"Ran {{COUNT}} analysis": "",
"Rate {{rating}} out of 10": "Avaliar {{rating}} de 10",
"Rating": "Avaliação",
"Re-rank models by topic similarity": "Reordenar modelos por similaridade de tópicos",
@ -1928,6 +1938,7 @@
"This will delete all models including custom models and cannot be undone.": "Isto irá excluir todos os modelos, incluindo os modelos personalizados, e não pode ser desfeito.",
"This will reset the knowledge base and sync all files. Do you wish to continue?": "Isto irá redefinir a base de conhecimento e sincronizar todos os arquivos. Deseja continuar?",
"Thorough explanation": "Explicação Minuciosa",
"Thought": "",
"Thought for {{DURATION}}": "Pensou por {{DURATION}}",
"Thought for {{DURATION}} seconds": "Pensou por {{DURATION}} segundos",
"Thought for less than a second": "Pensou por menos de um segundo",
@ -1956,6 +1967,7 @@
"Today at {{LOCALIZED_TIME}}": "Hoje às {{LOCALIZED_TIME}}",
"Toggle {{COUNT}} sources": "Alternar {{COUNT}} fontes",
"Toggle 1 source": "Alternar 1 fonte",
"Toggle details": "",
"Toggle Dictation": "Alternar Ditado",
"Toggle Sidebar": "Alternar Barra Lateral",
"Toggle status history": "Alternar histórico de status",

Some files were not shown because too many files have changed in this diff Show more