mirror of
https://github.com/open-webui/open-webui.git
synced 2026-08-13 01:02:25 -06:00
0.10.2 (#26642)
* i18n: add pt-BR translations for newly added UI items and consistency pass (#26391) New **pt-BR** translations for items introduced in the latest releases, plus a consistency/quality pass across existing strings (grammar, tone, capitalization, pluralization). Placeholders and hotkeys preserved. No logic changes. * refac * i18n(th-TH): translate missing Thai keys/fix typo (#26406) * refac * refac * refac * refac * refac * refac * refac * refac * refac * fix: use updated_at for sidebar chat timestamp (#26454) The sidebar time-ago indicator rendered `created_at`, so the relative time stayed pinned to the chat's creation age and never reflected new activity. After sending a message the chat would jump to the top of the list (which sorts by `updated_at`) while still showing a stale label such as "3w", which is confusing. The indicator was originally added using `updated_at` and was inadvertently switched to `created_at` during a later refactor. Restore `updated_at` (falling back to `created_at` when absent) so the timestamp matches the list ordering and updates whenever a chat is modified. Fixes #26451 * fix: use absolute indexURL for pyodide sandbox (#26625) * i18n: fix Spanish relative time labels (#26463) * Update and fix Catalan translation.json (#26409) * refac * refac Co-Authored-By: Syed Osama Ali Shah <86572800+osamaali313@users.noreply.github.com> * refac Co-Authored-By: Syed Osama Ali Shah <86572800+osamaali313@users.noreply.github.com> * refac * refac * refac * refac * refac * refac * refac * refac * refac * refac * refac * fix: derive content from output for search (#26405) * refac * refac * refac * refac * refac * refac * refac * refac * refac * refac * Update CHANGELOG.md (#26641) * Update CHANGELOG.md * Update CHANGELOG.md --------- Co-authored-by: Tim Baek <tim@openwebui.com> --------- Co-authored-by: joaoback <156559121+joaoback@users.noreply.github.com> Co-authored-by: Sicknine <156204309+SNaytiP@users.noreply.github.com> Co-authored-by: Classic298 <27028174+Classic298@users.noreply.github.com> Co-authored-by: Algorithm5838 <108630393+Algorithm5838@users.noreply.github.com> Co-authored-by: JuanMa Diaz <torgus@gmail.com> Co-authored-by: Aleix Dorca <aleixdorca@mac.com> Co-authored-by: Syed Osama Ali Shah <86572800+osamaali313@users.noreply.github.com>
This commit is contained in:
@@ -13,6 +13,9 @@ OPENAI_API_KEY=''
|
||||
# CORS_ALLOW_ORIGIN='http://localhost:5173;http://localhost:8080'
|
||||
CORS_ALLOW_ORIGIN='*'
|
||||
|
||||
# Set to false to keep memory tools enabled without adding memory context to the system context.
|
||||
ENABLE_MEMORY_SYSTEM_CONTEXT=true
|
||||
|
||||
# For production you should set this to match the proxy configuration (127.0.0.1)
|
||||
FORWARDED_ALLOW_IPS='*'
|
||||
|
||||
|
||||
+1
-1
@@ -1 +1 @@
|
||||
github: tjbck
|
||||
github: open-webui
|
||||
|
||||
@@ -5,6 +5,45 @@ 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.10.2] - 2026-07-01
|
||||
|
||||
### Added
|
||||
|
||||
- 💭 **Streamed reasoning display.** Models that emit thinking or reasoning now show that content as it streams, and it renders correctly in the chat overview and in exported conversations. [Commit](https://github.com/open-webui/open-webui/commit/0b75445ff9a42e37640c034812d0de9b84039e60), [Commit](https://github.com/open-webui/open-webui/commit/af1c0eee89810fa4c36e3eb7e4eba6de685bd7ca), [Commit](https://github.com/open-webui/open-webui/commit/4b08d65597e5b634b7191b0bd6d28feeafcc2a48), [Commit](https://github.com/open-webui/open-webui/commit/fa2abe4cb6a085a4c9045bf8d8ff4b6beffdef6a)
|
||||
- 🗂️ **Folder uploads to knowledge bases.** Dragging a folder into a knowledge base, or syncing one, now recreates its subfolder structure instead of flattening everything into loose files. [#26130](https://github.com/open-webui/open-webui/issues/26130), [Commit](https://github.com/open-webui/open-webui/commit/2ed8934f5b2bc8a11c74ef2f34cdb62ef024809e)
|
||||
- 🧠 **Memory system context toggle.** Administrators can now keep memory tools available while choosing not to add stored memories to the system context, using the new 'Memory System Context' toggle in admin settings. [Commit](https://github.com/open-webui/open-webui/commit/4067e357b2ff9e2fb59866d24656e832908fb6fe)
|
||||
- 🧹 **Tidier automatic memories.** Automatically saved memories now focus on enduring details like preferences and goals and skip one-off things like meals, routine events, or passing mood unless you ask to remember them. [Commit](https://github.com/open-webui/open-webui/commit/80af65c24adac5140a39a2b5687a3b669b86719f)
|
||||
- 🎙️ **Speech-to-text request format.** OpenAI-compatible speech-to-text can now send audio as either a multipart upload or base64 JSON, selectable in admin audio settings. [Commit](https://github.com/open-webui/open-webui/commit/989c6c13f5d4c5cc255aec77aea14725104d9cb3)
|
||||
- 🧰 **API configs via environment.** Administrators can now set per-connection Ollama and OpenAI API configurations through the "OLLAMA_API_CONFIGS" and "OPENAI_API_CONFIGS" environment variables. [Commit](https://github.com/open-webui/open-webui/commit/19d8f03bd2c64013b510f2a0eeb3513d452814a3)
|
||||
- 📡 **Provider failure events.** Failed Ollama and OpenAI-compatible provider requests now emit a structured event describing the error type, provider, and status, giving administrators clearer visibility into upstream failures. [Commit](https://github.com/open-webui/open-webui/commit/4351c78b1e45bb0c5824f9d9eb911b395e343646)
|
||||
- 🏟️ **Arena models via environment.** Administrators can now define evaluation arena models through the "EVALUATION_ARENA_MODELS" environment variable. [#26174](https://github.com/open-webui/open-webui/issues/26174)
|
||||
- ♿ **Clearer high-contrast sidebar selection.** With high-contrast mode enabled, the currently selected chat in the sidebar now stands out with stronger colors, making it easier to tell which chat is active. [#26469](https://github.com/open-webui/open-webui/issues/26469), [Commit](https://github.com/open-webui/open-webui/commit/52ee5cb1b3aa8a8ad40b23d72d82db7c3522dbf8)
|
||||
- 🔄 **General improvements.** Various improvements were implemented across the application to enhance performance, stability, and security.
|
||||
- 🌐 **Translation updates.** Translations for Thai, Portuguese (Brazil), Catalan, and Spanish were enhanced and expanded.
|
||||
|
||||
### Fixed
|
||||
|
||||
- 🛡️ **Security Advisory**: This release includes security and access-control fixes. We recommend updating production deployments at your earliest convenience. Not all security fixes in this version may be enumerated in the fixed section — some may be withheld for a short time to give administrators time to upgrade. [Advisories](https://github.com/open-webui/open-webui/security)
|
||||
- 🔐 **Fewer unexpected logouts.** A single request returning an authorization error no longer signs you out while your session is still valid, since the app now confirms the session status before redirecting to login. [Commit](https://github.com/open-webui/open-webui/commit/56ee875e21cb3b137a5aa1eca6eb3c0731b14045)
|
||||
- 🔒 **Web search domain filtering.** Domain allow and block rules for web search results are now matched against the host, closing a gap where some URLs could slip past the filter. [Commit](https://github.com/open-webui/open-webui/commit/688bda09fbe26619613aa487beda8059a5fd55ef)
|
||||
- 🕵️ **Image prompt log privacy.** Image generation workflows are no longer written to server logs at the default log level, keeping user-authored prompt content out of operator-visible logs. [#26400](https://github.com/open-webui/open-webui/issues/26400), [Commit](https://github.com/open-webui/open-webui/commit/64b92ff08a09b1bf338d5d95b7bf6f9db0d7e857)
|
||||
- 🗄️ **Safer database upgrades.** Upgrading an existing SQLite database no longer crashes during the user-table migration or corrupts saved user settings, resolving failures that could block startup or break login after an upgrade. [#26403](https://github.com/open-webui/open-webui/issues/26403), [Commit](https://github.com/open-webui/open-webui/commit/c416c6cad69cc4ce44faacdad87cc65862625fb4)
|
||||
- ⚙️ **Saving settings as a non-admin.** Non-admin users can once again save their interface settings, such as the default model and theme, which previously failed with a server error while the interface incorrectly reported success. [#26627](https://github.com/open-webui/open-webui/issues/26627), [Commit](https://github.com/open-webui/open-webui/commit/9866a02863c12c466100aed832f0006225759493)
|
||||
- 🕒 **Sidebar chat timestamps.** Chats in the sidebar now show when they were last active instead of when they were created, so the time label matches their position in the list and refreshes after each new message. [#26454](https://github.com/open-webui/open-webui/pull/26454), [#26451](https://github.com/open-webui/open-webui/issues/26451)
|
||||
- 🎯 **Default model after refresh.** Your selected model is no longer cleared when you reload the page, as model selection now waits for the model list to finish loading. [Commit](https://github.com/open-webui/open-webui/commit/b6d4baeb7ea9bc83e5486ca98b3cae07d3869aa7)
|
||||
- ⏳ **Tool dialogs no longer hang.** Dismissing a tool or function input dialog by clicking outside it now cancels the pending request instead of leaving the chat spinning indefinitely. [#26417](https://github.com/open-webui/open-webui/issues/26417), [Commit](https://github.com/open-webui/open-webui/commit/0016266c0652757e32aa44f2e1fb7311ac08db51)
|
||||
- 🐍 **Reliable code execution loading.** Running Python code in chat now loads its runtime reliably, fixing sandbox startup failures that broke code execution and the Pyodide file viewer in recent releases. [#26625](https://github.com/open-webui/open-webui/pull/26625), [#26390](https://github.com/open-webui/open-webui/issues/26390)
|
||||
- 🤖 **Models with null capabilities.** Chatting with a model whose capabilities are unset no longer fails with an error when the memory feature or automations are involved. [#26412](https://github.com/open-webui/open-webui/issues/26412), [Commit](https://github.com/open-webui/open-webui/commit/650b81792582268345073ce3757ac14356189d75), [Commit](https://github.com/open-webui/open-webui/commit/0016266c0652757e32aa44f2e1fb7311ac08db51)
|
||||
- 🔎 **Searchable responses.** Chat search again finds assistant messages whose text is stored as structured output, which were previously skipped. [#26405](https://github.com/open-webui/open-webui/pull/26405)
|
||||
- 🔔 **Chat notification previews.** Background chat completion notifications and toasts now show a clean response preview instead of appearing blank for messages stored as structured output. [Commit](https://github.com/open-webui/open-webui/commit/c98d8ecaccc7284573b050e88b3857c4aeba3860)
|
||||
- 💾 **Banner and config startup.** Setting configuration such as "WEBUI_BANNERS" no longer causes a startup failure, since admin configuration values are now stored correctly regardless of their data type. [#26431](https://github.com/open-webui/open-webui/issues/26431), [Commit](https://github.com/open-webui/open-webui/commit/ab22fe64bdd10ba86845dcd46dfd7f619b22366f)
|
||||
- 📑 **RAG Template visibility.** The RAG Template editor now stays visible in admin document settings even when Bypass Embedding and Retrieval is enabled, since the template still applies to document content in that mode. [#26126](https://github.com/open-webui/open-webui/issues/26126), [Commit](https://github.com/open-webui/open-webui/commit/8fe480250f649824441a7b4d725a502683134713)
|
||||
- 🧬 **Editing derived models.** Editing a workspace model no longer clears its base model, including when that base is a preset or the model itself. [Commit](https://github.com/open-webui/open-webui/commit/092b5857bbda01be53619e26f42b1fa9b64a2b44), [Commit](https://github.com/open-webui/open-webui/commit/54f31c630afa75e9c81acaa048e1bd901254ba92)
|
||||
|
||||
### Changed
|
||||
|
||||
- ⚠️ **Database Migrations**: This release includes database schema changes; we strongly recommend backing up your database and all associated data before upgrading in production environments. If you are running a multi-worker, multi-server, or load-balanced deployment, all instances must be updated simultaneously, rolling updates are not supported and will cause application failures due to schema incompatibility.
|
||||
|
||||
## [0.10.1] - 2026-06-29
|
||||
|
||||
### Fixed
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||

|
||||

|
||||
[](https://discord.gg/5rJgQTnV4s)
|
||||
[](https://github.com/sponsors/tjbck)
|
||||
[](https://github.com/sponsors/open-webui)
|
||||
|
||||

|
||||
|
||||
|
||||
@@ -290,6 +290,16 @@ OLLAMA_BASE_URLS = [url.strip() for url in OLLAMA_BASE_URLS.split(';')]
|
||||
OLLAMA_BASE_URLS = OLLAMA_BASE_URLS
|
||||
|
||||
OLLAMA_API_CONFIGS = {}
|
||||
_ollama_api_configs = os.getenv('OLLAMA_API_CONFIGS', '')
|
||||
if _ollama_api_configs:
|
||||
try:
|
||||
parsed = json.loads(_ollama_api_configs)
|
||||
if isinstance(parsed, dict):
|
||||
OLLAMA_API_CONFIGS = parsed
|
||||
else:
|
||||
log.warning('OLLAMA_API_CONFIGS must be a JSON object, ignoring')
|
||||
except (json.JSONDecodeError, TypeError):
|
||||
log.warning('OLLAMA_API_CONFIGS is not valid JSON, ignoring')
|
||||
|
||||
####################################
|
||||
# OPENAI_API
|
||||
@@ -327,6 +337,16 @@ OPENAI_API_BASE_URLS = [
|
||||
OPENAI_API_BASE_URLS = OPENAI_API_BASE_URLS
|
||||
|
||||
OPENAI_API_CONFIGS = {}
|
||||
_openai_api_configs = os.getenv('OPENAI_API_CONFIGS', '')
|
||||
if _openai_api_configs:
|
||||
try:
|
||||
parsed = json.loads(_openai_api_configs)
|
||||
if isinstance(parsed, dict):
|
||||
OPENAI_API_CONFIGS = parsed
|
||||
else:
|
||||
log.warning('OPENAI_API_CONFIGS must be a JSON object, ignoring')
|
||||
except (json.JSONDecodeError, TypeError):
|
||||
log.warning('OPENAI_API_CONFIGS is not valid JSON, ignoring')
|
||||
|
||||
# Get the actual OpenAI API key based on the base URL
|
||||
OPENAI_API_KEY = ''
|
||||
@@ -394,6 +414,7 @@ CODE_EXECUTION_JUPYTER_TIMEOUT = int(os.getenv('CODE_EXECUTION_JUPYTER_TIMEOUT',
|
||||
ENABLE_CODE_INTERPRETER = os.getenv('ENABLE_CODE_INTERPRETER', 'True').lower() == 'true'
|
||||
|
||||
ENABLE_MEMORIES = os.getenv('ENABLE_MEMORIES', 'True').lower() == 'true'
|
||||
ENABLE_MEMORY_SYSTEM_CONTEXT = os.getenv('ENABLE_MEMORY_SYSTEM_CONTEXT', 'True').lower() == 'true'
|
||||
ENABLE_MEMORY_BACKGROUND_REVIEW = os.getenv('ENABLE_MEMORY_BACKGROUND_REVIEW', 'False').lower() == 'true'
|
||||
MEMORIES_REVIEW_INTERVAL_TURNS = int(os.getenv('MEMORIES_REVIEW_INTERVAL_TURNS', '10'))
|
||||
MEMORIES_USER_CHAR_LIMIT = int(os.getenv('MEMORIES_USER_CHAR_LIMIT', '2000'))
|
||||
@@ -1511,6 +1532,8 @@ AUDIO_STT_OPENAI_API_BASE_URL = os.getenv('AUDIO_STT_OPENAI_API_BASE_URL', OPENA
|
||||
|
||||
AUDIO_STT_OPENAI_API_KEY = os.getenv('AUDIO_STT_OPENAI_API_KEY', OPENAI_API_KEY)
|
||||
|
||||
AUDIO_STT_OPENAI_API_REQUEST_FORMAT = os.getenv('AUDIO_STT_OPENAI_API_REQUEST_FORMAT', 'multipart')
|
||||
|
||||
AUDIO_STT_ENGINE = os.getenv('AUDIO_STT_ENGINE', '')
|
||||
|
||||
AUDIO_STT_MODEL = os.getenv('AUDIO_STT_MODEL', '')
|
||||
@@ -2741,6 +2764,7 @@ DEFAULT_CONFIG = {
|
||||
'code_execution.jupyter.timeout': CODE_EXECUTION_JUPYTER_TIMEOUT,
|
||||
'code_interpreter.enable': ENABLE_CODE_INTERPRETER,
|
||||
'memories.enable': ENABLE_MEMORIES,
|
||||
'memories.system_context.enable': ENABLE_MEMORY_SYSTEM_CONTEXT,
|
||||
'memories.background_review.enable': ENABLE_MEMORY_BACKGROUND_REVIEW,
|
||||
'memories.review_interval_turns': MEMORIES_REVIEW_INTERVAL_TURNS,
|
||||
'memories.user_char_limit': MEMORIES_USER_CHAR_LIMIT,
|
||||
@@ -2944,6 +2968,7 @@ DEFAULT_CONFIG = {
|
||||
'audio.stt.deepgram.api_key': DEEPGRAM_API_KEY,
|
||||
'audio.stt.openai.api_base_url': AUDIO_STT_OPENAI_API_BASE_URL,
|
||||
'audio.stt.openai.api_key': AUDIO_STT_OPENAI_API_KEY,
|
||||
'audio.stt.openai.api_request_format': AUDIO_STT_OPENAI_API_REQUEST_FORMAT,
|
||||
'audio.stt.engine': AUDIO_STT_ENGINE,
|
||||
'audio.stt.model': AUDIO_STT_MODEL,
|
||||
'audio.stt.supported_content_types': AUDIO_STT_SUPPORTED_CONTENT_TYPES,
|
||||
|
||||
@@ -444,17 +444,16 @@ WEBSOCKET_REDIS_OPTIONS = os.getenv('WEBSOCKET_REDIS_OPTIONS', '')
|
||||
|
||||
|
||||
if WEBSOCKET_REDIS_OPTIONS == '':
|
||||
WEBSOCKET_REDIS_OPTIONS = {'socket_timeout': None}
|
||||
if REDIS_SOCKET_CONNECT_TIMEOUT:
|
||||
WEBSOCKET_REDIS_OPTIONS = {'socket_connect_timeout': REDIS_SOCKET_CONNECT_TIMEOUT}
|
||||
else:
|
||||
log.debug('No WEBSOCKET_REDIS_OPTIONS provided, defaulting to None')
|
||||
WEBSOCKET_REDIS_OPTIONS = None
|
||||
WEBSOCKET_REDIS_OPTIONS['socket_connect_timeout'] = REDIS_SOCKET_CONNECT_TIMEOUT
|
||||
else:
|
||||
try:
|
||||
WEBSOCKET_REDIS_OPTIONS = json.loads(WEBSOCKET_REDIS_OPTIONS)
|
||||
WEBSOCKET_REDIS_OPTIONS.setdefault('socket_timeout', None)
|
||||
except Exception:
|
||||
log.warning('Invalid WEBSOCKET_REDIS_OPTIONS, defaulting to None')
|
||||
WEBSOCKET_REDIS_OPTIONS = None
|
||||
log.warning('Invalid WEBSOCKET_REDIS_OPTIONS, defaulting to socket_timeout=None')
|
||||
WEBSOCKET_REDIS_OPTIONS = {'socket_timeout': None}
|
||||
|
||||
WEBSOCKET_REDIS_URL = os.getenv('WEBSOCKET_REDIS_URL', REDIS_URL)
|
||||
WEBSOCKET_REDIS_CLUSTER = os.getenv('WEBSOCKET_REDIS_CLUSTER', str(REDIS_CLUSTER)).lower() == 'true'
|
||||
|
||||
@@ -442,6 +442,11 @@ class EventDefinitions(BaseModel):
|
||||
description='Model provider configuration was updated.',
|
||||
message='Model Provider Config updated',
|
||||
)
|
||||
MODEL_PROVIDER_REQUEST_FAILED: EventDefinition = EventDefinition(
|
||||
name='model.provider_request.failed',
|
||||
description='A model provider request failed.',
|
||||
message='Model provider request failed',
|
||||
)
|
||||
MODEL_PROVIDER_MODEL_CREATED: EventDefinition = EventDefinition(
|
||||
name='model.provider_model.created',
|
||||
description='A provider model was created.',
|
||||
@@ -1108,3 +1113,60 @@ async def publish_event(
|
||||
await sink.handle_event(app, event_payload, request=request)
|
||||
except Exception:
|
||||
log.exception('Event sink failed for %s', event_payload.event)
|
||||
|
||||
|
||||
async def publish_model_provider_request_failed(
|
||||
request_or_app: Any,
|
||||
*,
|
||||
actor: Any | None,
|
||||
provider: str,
|
||||
base_url: str,
|
||||
status: int,
|
||||
requested_model: str | None = None,
|
||||
api_key: str | None = None,
|
||||
upstream_error: Any = None,
|
||||
) -> None:
|
||||
error = upstream_error.get('error') if isinstance(upstream_error, dict) else upstream_error
|
||||
error_code = None
|
||||
if isinstance(error, dict):
|
||||
error_code = error.get('code') or error.get('type') or error.get('error_code')
|
||||
error = error.get('message') or error.get('detail') or error
|
||||
|
||||
error_text = str(error or '')
|
||||
marker = f'{error_code or ""} {error_text}'.lower()
|
||||
error_type = (
|
||||
'model_not_found'
|
||||
if status == 404
|
||||
and any(value in marker for value in ('model_not_found', 'model not found', 'does not exist', 'no such model'))
|
||||
else 'authentication_failed'
|
||||
if status in (401, 403)
|
||||
else 'rate_limited'
|
||||
if status == 429
|
||||
else 'server_failed'
|
||||
if status >= 500
|
||||
else 'upstream_error'
|
||||
)
|
||||
|
||||
data = {
|
||||
'error_type': error_type,
|
||||
'status': status,
|
||||
'provider': provider,
|
||||
'base_url': base_url,
|
||||
}
|
||||
if requested_model:
|
||||
data['requested_model'] = requested_model
|
||||
if api_key:
|
||||
data['api_key_suffix'] = f'...{api_key[-4:]}'
|
||||
if error_code:
|
||||
data['upstream_error_code'] = error_code
|
||||
if error:
|
||||
data['upstream_message'] = error
|
||||
|
||||
await publish_event(
|
||||
request_or_app,
|
||||
EVENTS.MODEL_PROVIDER_REQUEST_FAILED,
|
||||
actor=actor,
|
||||
subject_id=requested_model,
|
||||
subject_type='model',
|
||||
data=data,
|
||||
)
|
||||
|
||||
@@ -1341,18 +1341,26 @@ async def chat_completion(
|
||||
detail=ERROR_MESSAGES.DEFAULT(),
|
||||
)
|
||||
|
||||
# Persist chat-level files (knowledge collections, docs, etc.)
|
||||
user_message = metadata.get('user_message') or {}
|
||||
selected_chat_models = user_message.get('models') if isinstance(user_message, dict) else None
|
||||
if not isinstance(selected_chat_models, list) or not selected_chat_models:
|
||||
selected_chat_models = [entry.get('model_id') for entry in message_ids if entry.get('model_id')]
|
||||
|
||||
# Persist chat-level fields the frontend used to save on every message.
|
||||
# The old frontend saveChatHandler did this on every message;
|
||||
# now the backend owns persistence.
|
||||
chat_files = metadata.get('files')
|
||||
if chat_files is not None:
|
||||
if chat_files is not None or selected_chat_models:
|
||||
existing_chat = await Chats.get_chat_by_id(chat_id)
|
||||
if existing_chat:
|
||||
updated = {**existing_chat.chat, 'files': chat_files}
|
||||
updated = {**existing_chat.chat}
|
||||
if chat_files is not None:
|
||||
updated['files'] = chat_files
|
||||
if selected_chat_models:
|
||||
updated['models'] = selected_chat_models
|
||||
await Chats.update_chat_by_id(chat_id, updated)
|
||||
|
||||
# Save user message to DB
|
||||
user_message = metadata.get('user_message') or {}
|
||||
if user_message and user_message.get('id'):
|
||||
await Chats.upsert_message_to_chat_by_id_and_message_id(
|
||||
chat_id,
|
||||
|
||||
@@ -72,7 +72,6 @@ def _convert_column_to_json(table: str, column: str):
|
||||
dialect = conn.dialect.name
|
||||
|
||||
t = sa.table(table, sa.column('id', sa.Text), sa.column(column, sa.Text))
|
||||
t_json = sa.column(f'{column}_json', sa.JSON)
|
||||
|
||||
# SQLite cannot ALTER COLUMN → must recreate column
|
||||
if dialect == 'sqlite':
|
||||
@@ -90,9 +89,9 @@ def _convert_column_to_json(table: str, column: str):
|
||||
parsed = None
|
||||
|
||||
conn.execute(
|
||||
sa.update(sa.table(table, sa.column('id'), t_json))
|
||||
sa.update(sa.table(table, sa.column('id'), sa.column(f'{column}_json', sa.JSON)))
|
||||
.where(sa.column('id') == uid)
|
||||
.values({f'{column}_json': json.dumps(parsed) if parsed else None})
|
||||
.values({f'{column}_json': parsed})
|
||||
)
|
||||
|
||||
op.drop_column(table, column)
|
||||
@@ -112,8 +111,7 @@ def _convert_column_to_text(table: str, column: str):
|
||||
conn = op.get_bind()
|
||||
dialect = conn.dialect.name
|
||||
|
||||
t = sa.table(table, sa.column('id', sa.Text), sa.column(column))
|
||||
t_text = sa.column(f'{column}_text', sa.Text)
|
||||
t = sa.table(table, sa.column('id', sa.Text), sa.column(column, sa.JSON))
|
||||
|
||||
if dialect == 'sqlite':
|
||||
op.add_column(table, sa.Column(f'{column}_text', sa.Text(), nullable=True))
|
||||
@@ -122,9 +120,9 @@ def _convert_column_to_text(table: str, column: str):
|
||||
|
||||
for uid, raw in rows:
|
||||
conn.execute(
|
||||
sa.update(sa.table(table, sa.column('id'), t_text))
|
||||
sa.update(sa.table(table, sa.column('id'), sa.column(f'{column}_text', sa.Text)))
|
||||
.where(sa.column('id') == uid)
|
||||
.values({f'{column}_text': json.dumps(raw) if raw else None})
|
||||
.values({f'{column}_text': json.dumps(raw) if raw is not None else None})
|
||||
)
|
||||
|
||||
op.drop_column(table, column)
|
||||
|
||||
@@ -14,6 +14,7 @@ import logging
|
||||
import time
|
||||
from typing import Any, ClassVar
|
||||
|
||||
from fastapi.encoders import jsonable_encoder
|
||||
from open_webui.internal.db import Base, get_async_db
|
||||
from sqlalchemy import JSON, BigInteger, Column, Text, delete, select
|
||||
|
||||
@@ -86,6 +87,10 @@ def _assign_path(target: dict, path: list[str], value: Any) -> None:
|
||||
current[path[-1]] = value
|
||||
|
||||
|
||||
def _json_value(value: Any) -> Any:
|
||||
return jsonable_encoder(value)
|
||||
|
||||
|
||||
# ── Model ────────────────────────────────────────────────────────────────────
|
||||
|
||||
|
||||
@@ -112,7 +117,7 @@ class Config(Base):
|
||||
enable_persistent: bool = True,
|
||||
enable_oauth_persistent: bool = False,
|
||||
) -> None:
|
||||
cls.DEFAULTS = defaults or {}
|
||||
cls.DEFAULTS = dict(defaults or {})
|
||||
cls.PERSISTENT_ENABLED = enable_persistent
|
||||
cls.OAUTH_PERSISTENT_ENABLED = enable_oauth_persistent
|
||||
|
||||
@@ -188,9 +193,20 @@ class Config(Base):
|
||||
@staticmethod
|
||||
async def upsert(updates: dict) -> None:
|
||||
"""Upsert multiple config key-value pairs. Raises on failure."""
|
||||
persistent_updates = {}
|
||||
for key, value in updates.items():
|
||||
value = _json_value(value)
|
||||
if Config.persistent_enabled_for(key):
|
||||
persistent_updates[key] = value
|
||||
else:
|
||||
Config.DEFAULTS[key] = value
|
||||
|
||||
if not persistent_updates:
|
||||
return
|
||||
|
||||
async with get_async_db() as db:
|
||||
now = int(time.time())
|
||||
for key, value in updates.items():
|
||||
for key, value in persistent_updates.items():
|
||||
existing = await db.get(Config, key)
|
||||
if existing:
|
||||
existing.value = value
|
||||
@@ -232,6 +248,7 @@ class Config(Base):
|
||||
new_count = 0
|
||||
for key, value in defaults.items():
|
||||
if key not in existing_keys:
|
||||
value = _json_value(value)
|
||||
db.add(Config(key=key, value=value, updated_at=now))
|
||||
existing_keys.add(key)
|
||||
new_count += 1
|
||||
|
||||
@@ -19,7 +19,7 @@ def get_filtered_results(results, filter_list):
|
||||
if not validators.url(url):
|
||||
continue
|
||||
|
||||
domain = urlparse(url).netloc
|
||||
domain = urlparse(url).hostname
|
||||
if not domain:
|
||||
continue
|
||||
|
||||
|
||||
@@ -94,6 +94,7 @@ TTS_CONFIG_KEYS = {
|
||||
STT_CONFIG_KEYS = {
|
||||
'OPENAI_API_BASE_URL': 'audio.stt.openai.api_base_url',
|
||||
'OPENAI_API_KEY': 'audio.stt.openai.api_key',
|
||||
'OPENAI_API_REQUEST_FORMAT': 'audio.stt.openai.api_request_format',
|
||||
'ENGINE': 'audio.stt.engine',
|
||||
'MODEL': 'audio.stt.model',
|
||||
'SUPPORTED_CONTENT_TYPES': 'audio.stt.supported_content_types',
|
||||
@@ -252,6 +253,7 @@ class TTSConfigForm(BaseModel):
|
||||
class STTConfigForm(BaseModel):
|
||||
OPENAI_API_BASE_URL: str
|
||||
OPENAI_API_KEY: str
|
||||
OPENAI_API_REQUEST_FORMAT: str = 'multipart'
|
||||
ENGINE: str
|
||||
MODEL: str
|
||||
SUPPORTED_CONTENT_TYPES: list[str] = []
|
||||
@@ -644,28 +646,47 @@ async def _transcribe_openai(request, file_path, filename, languages, file_dir,
|
||||
r = None
|
||||
try:
|
||||
session = await get_session()
|
||||
api_key = await Config.get('audio.stt.openai.api_key')
|
||||
api_base_url = await Config.get('audio.stt.openai.api_base_url')
|
||||
request_format = (await Config.get('audio.stt.openai.api_request_format') or 'multipart').lower()
|
||||
|
||||
headers = {'Authorization': f'Bearer {api_key}'}
|
||||
if user and ENABLE_FORWARD_USER_INFO_HEADERS:
|
||||
headers = include_user_info_headers(headers, user)
|
||||
|
||||
for language in languages:
|
||||
payload = {'model': await Config.get('audio.stt.model')}
|
||||
if language:
|
||||
payload['language'] = language
|
||||
api_key = await Config.get('audio.stt.openai.api_key')
|
||||
api_base_url = await Config.get('audio.stt.openai.api_base_url')
|
||||
|
||||
headers = {'Authorization': f'Bearer {api_key}'}
|
||||
if user and ENABLE_FORWARD_USER_INFO_HEADERS:
|
||||
headers = include_user_info_headers(headers, user)
|
||||
if request_format == 'json':
|
||||
ext = os.path.splitext(filename)[1].lower().lstrip('.') or 'wav'
|
||||
async with aiofiles.open(file_path, 'rb') as f:
|
||||
payload['input_audio'] = {
|
||||
'data': base64.b64encode(await f.read()).decode('utf-8'),
|
||||
'format': 'ogg' if ext == 'oga' else ext,
|
||||
}
|
||||
|
||||
form_data = aiohttp.FormData()
|
||||
for key, value in payload.items():
|
||||
form_data.add_field(key, str(value))
|
||||
form_data.add_field('file', open(file_path, 'rb'), filename=filename)
|
||||
r = await session.post(
|
||||
url=f'{api_base_url}/audio/transcriptions',
|
||||
headers={**headers, 'Content-Type': 'application/json'},
|
||||
json=payload,
|
||||
ssl=AIOHTTP_CLIENT_SESSION_SSL,
|
||||
)
|
||||
else:
|
||||
form_data = aiohttp.FormData()
|
||||
for key, value in payload.items():
|
||||
form_data.add_field(key, str(value))
|
||||
|
||||
r = await session.post(
|
||||
url=f'{api_base_url}/audio/transcriptions',
|
||||
headers=headers,
|
||||
data=form_data,
|
||||
ssl=AIOHTTP_CLIENT_SESSION_SSL,
|
||||
)
|
||||
with open(file_path, 'rb') as audio_file:
|
||||
form_data.add_field('file', audio_file, filename=filename)
|
||||
|
||||
r = await session.post(
|
||||
url=f'{api_base_url}/audio/transcriptions',
|
||||
headers=headers,
|
||||
data=form_data,
|
||||
ssl=AIOHTTP_CLIENT_SESSION_SSL,
|
||||
)
|
||||
if r.status == 200:
|
||||
break
|
||||
|
||||
|
||||
@@ -105,6 +105,7 @@ ADMIN_CONFIG_KEYS = {
|
||||
'ENABLE_CHANNELS': 'channels.enable',
|
||||
'ENABLE_CALENDAR': 'calendar.enable',
|
||||
'ENABLE_MEMORIES': 'memories.enable',
|
||||
'ENABLE_MEMORY_SYSTEM_CONTEXT': 'memories.system_context.enable',
|
||||
'ENABLE_NOTES': 'notes.enable',
|
||||
'ENABLE_USER_WEBHOOKS': 'ui.enable_user_webhooks',
|
||||
'ENABLE_USER_STATUS': 'users.enable_status',
|
||||
@@ -1142,6 +1143,7 @@ class AdminConfig(BaseModel):
|
||||
ENABLE_CHANNELS: bool
|
||||
ENABLE_CALENDAR: bool
|
||||
ENABLE_MEMORIES: bool
|
||||
ENABLE_MEMORY_SYSTEM_CONTEXT: bool
|
||||
ENABLE_NOTES: bool
|
||||
ENABLE_USER_WEBHOOKS: bool
|
||||
ENABLE_USER_STATUS: bool
|
||||
|
||||
@@ -718,6 +718,9 @@ async def update_model_by_id(
|
||||
db,
|
||||
)
|
||||
|
||||
if 'base_model_id' not in form_data.model_fields_set:
|
||||
form_data.base_model_id = model.base_model_id
|
||||
|
||||
form_data.access_grants = await filter_allowed_access_grants(
|
||||
await Config.get('user.permissions'),
|
||||
user.id,
|
||||
|
||||
@@ -20,7 +20,7 @@ from sqlalchemy.ext.asyncio import AsyncSession
|
||||
|
||||
from open_webui.config import UPLOAD_DIR
|
||||
from open_webui.constants import ERROR_MESSAGES
|
||||
from open_webui.events import EVENTS, publish_event
|
||||
from open_webui.events import EVENTS, publish_event, publish_model_provider_request_failed
|
||||
from open_webui.env import (
|
||||
AIOHTTP_CLIENT_SESSION_SSL,
|
||||
AIOHTTP_CLIENT_TIMEOUT,
|
||||
@@ -133,12 +133,27 @@ async def send_request(
|
||||
if not r.ok:
|
||||
try:
|
||||
res = await r.json()
|
||||
await publish_model_provider_request_failed(
|
||||
request,
|
||||
actor=user,
|
||||
provider='ollama',
|
||||
base_url=url,
|
||||
status=r.status,
|
||||
upstream_error=res,
|
||||
)
|
||||
if 'error' in res:
|
||||
raise HTTPException(status_code=r.status, detail=res['error'])
|
||||
except HTTPException:
|
||||
raise
|
||||
except Exception as e:
|
||||
log.error(f'Failed to parse error response: {e}')
|
||||
await publish_model_provider_request_failed(
|
||||
request,
|
||||
actor=user,
|
||||
provider='ollama',
|
||||
base_url=url,
|
||||
status=r.status,
|
||||
)
|
||||
raise HTTPException(
|
||||
status_code=r.status,
|
||||
detail=ERROR_MESSAGES.SERVER_CONNECTION_ERROR,
|
||||
|
||||
@@ -22,7 +22,7 @@ from open_webui.config import (
|
||||
CACHE_DIR,
|
||||
)
|
||||
from open_webui.constants import ERROR_MESSAGES
|
||||
from open_webui.events import EVENTS, publish_event
|
||||
from open_webui.events import EVENTS, publish_event, publish_model_provider_request_failed
|
||||
from open_webui.env import (
|
||||
AIOHTTP_CLIENT_SESSION_SSL,
|
||||
AIOHTTP_CLIENT_TIMEOUT,
|
||||
@@ -1236,6 +1236,7 @@ async def generate_chat_completion(
|
||||
request_url = f'{url}/responses'
|
||||
else:
|
||||
request_url = f'{url}/chat/completions'
|
||||
requested_model = payload.get('model')
|
||||
# For Chat Completions, strip image parts from multimodal tool messages
|
||||
# (Chat Completions doesn't support images in tool content).
|
||||
if not is_responses and 'messages' in payload:
|
||||
@@ -1278,8 +1279,28 @@ async def generate_chat_completion(
|
||||
)
|
||||
try:
|
||||
error_json = json.loads(error_body)
|
||||
await publish_model_provider_request_failed(
|
||||
request,
|
||||
actor=user,
|
||||
provider='openai-compatible',
|
||||
base_url=url,
|
||||
api_key=key,
|
||||
status=r.status,
|
||||
requested_model=requested_model,
|
||||
upstream_error=error_json,
|
||||
)
|
||||
return JSONResponse(status_code=r.status, content=error_json)
|
||||
except json.JSONDecodeError:
|
||||
await publish_model_provider_request_failed(
|
||||
request,
|
||||
actor=user,
|
||||
provider='openai-compatible',
|
||||
base_url=url,
|
||||
api_key=key,
|
||||
status=r.status,
|
||||
requested_model=requested_model,
|
||||
upstream_error=error_body,
|
||||
)
|
||||
return JSONResponse(
|
||||
status_code=r.status,
|
||||
content={'error': {'message': error_body, 'code': r.status}},
|
||||
@@ -1299,6 +1320,16 @@ async def generate_chat_completion(
|
||||
response = await r.text()
|
||||
|
||||
if r.status >= 400:
|
||||
await publish_model_provider_request_failed(
|
||||
request,
|
||||
actor=user,
|
||||
provider='openai-compatible',
|
||||
base_url=url,
|
||||
api_key=key,
|
||||
status=r.status,
|
||||
requested_model=requested_model,
|
||||
upstream_error=response,
|
||||
)
|
||||
if isinstance(response, (dict, list)):
|
||||
return JSONResponse(status_code=r.status, content=response)
|
||||
else:
|
||||
@@ -1372,6 +1403,7 @@ async def embeddings(request: Request, form_data: dict, user):
|
||||
headers['api-version'] = api_version
|
||||
else:
|
||||
embeddings_url = f'{url}/embeddings'
|
||||
requested_model = form_data.get('model')
|
||||
|
||||
try:
|
||||
session = await get_session()
|
||||
@@ -1399,6 +1431,16 @@ async def embeddings(request: Request, form_data: dict, user):
|
||||
response_data = await r.text()
|
||||
|
||||
if r.status >= 400:
|
||||
await publish_model_provider_request_failed(
|
||||
request,
|
||||
actor=user,
|
||||
provider='openai-compatible',
|
||||
base_url=url,
|
||||
api_key=key,
|
||||
status=r.status,
|
||||
requested_model=requested_model,
|
||||
upstream_error=response_data,
|
||||
)
|
||||
if isinstance(response_data, (dict, list)):
|
||||
return JSONResponse(status_code=r.status, content=response_data)
|
||||
else:
|
||||
@@ -1515,6 +1557,16 @@ async def responses(
|
||||
response_data = await r.text()
|
||||
|
||||
if r.status >= 400:
|
||||
await publish_model_provider_request_failed(
|
||||
request,
|
||||
actor=user,
|
||||
provider='openai-compatible',
|
||||
base_url=url,
|
||||
api_key=key,
|
||||
status=r.status,
|
||||
requested_model=payload.get('model'),
|
||||
upstream_error=response_data,
|
||||
)
|
||||
if isinstance(response_data, (dict, list)):
|
||||
return JSONResponse(status_code=r.status, content=response_data)
|
||||
else:
|
||||
@@ -1569,6 +1621,7 @@ async def proxy(path: str, request: Request, user=Depends(get_verified_user)):
|
||||
idx = models[model_id]['urlIdx']
|
||||
|
||||
url, key, api_config = await get_openai_connection(idx)
|
||||
base_url = url
|
||||
|
||||
r = None
|
||||
streaming = False
|
||||
@@ -1625,6 +1678,16 @@ async def proxy(path: str, request: Request, user=Depends(get_verified_user)):
|
||||
response_data = await r.text()
|
||||
|
||||
if r.status >= 400:
|
||||
await publish_model_provider_request_failed(
|
||||
request,
|
||||
actor=user,
|
||||
provider='openai-compatible',
|
||||
base_url=base_url,
|
||||
api_key=key,
|
||||
status=r.status,
|
||||
requested_model=model_id,
|
||||
upstream_error=response_data,
|
||||
)
|
||||
if isinstance(response_data, (dict, list)):
|
||||
return JSONResponse(status_code=r.status, content=response_data)
|
||||
else:
|
||||
|
||||
@@ -326,7 +326,7 @@ async def update_user_settings_by_session_user(
|
||||
db: AsyncSession = Depends(get_async_session),
|
||||
):
|
||||
if user.role != 'admin' and not await has_permission(
|
||||
user.id, 'settings.interface', request.app.state.config.USER_PERMISSIONS
|
||||
user.id, 'settings.interface', await Config.get('user.permissions')
|
||||
):
|
||||
raise HTTPException(
|
||||
status_code=status.HTTP_403_FORBIDDEN,
|
||||
|
||||
@@ -726,7 +726,11 @@ async def add_memory(
|
||||
__user__: dict = None,
|
||||
) -> str:
|
||||
"""
|
||||
Save a user-provided preference, fact, or instruction as memory for future chats.
|
||||
Save enduring information that can improve future chats.
|
||||
|
||||
Save stable preferences, goals, projects, relationships, habits, and standing instructions.
|
||||
Do not save one-off activity, meals, routine daily events, temporary mood, or other short-lived details
|
||||
unless the user explicitly asks you to remember them.
|
||||
|
||||
:param content: The memory content to store
|
||||
:param type: Use "user" for facts/preferences about the user, or "context" for other durable context
|
||||
@@ -760,10 +764,12 @@ async def update_memory(
|
||||
__user__: dict = None,
|
||||
) -> str:
|
||||
"""
|
||||
Apply a batch of memory changes after learning durable information.
|
||||
Apply a batch of memory changes after learning enduring information.
|
||||
|
||||
Use type "user" for facts, preferences, or instructions about the user.
|
||||
Use type "context" for other durable context that may help future chats.
|
||||
Do not save one-off activity, meals, routine daily events, temporary mood, or other short-lived details
|
||||
unless the user explicitly asks you to remember them.
|
||||
Path is optional. Use it as a stable memory address to group related memories.
|
||||
Prefer an existing path from list_memory_paths when one fits.
|
||||
Leave path empty when no useful grouping is clear.
|
||||
|
||||
@@ -267,7 +267,7 @@ async def _resolve_model_features(app, model_id: str) -> dict:
|
||||
if not default_feature_ids:
|
||||
return {}
|
||||
|
||||
capabilities = meta.get('capabilities', {})
|
||||
capabilities = meta.get('capabilities') or {}
|
||||
features = {}
|
||||
|
||||
# code_interpreter is excluded: it requires the frontend event emitter
|
||||
|
||||
@@ -202,7 +202,7 @@ async def comfyui_create_image(model: str, payload: ComfyUICreateImageForm, clie
|
||||
) as ws:
|
||||
log.info('WebSocket connection established.')
|
||||
log.info('Sending workflow to WebSocket server.')
|
||||
log.info(f'Workflow: {workflow}')
|
||||
log.debug(f'Workflow: {workflow}')
|
||||
images = await _ws_get_images(ws, workflow, client_id, base_url, api_key)
|
||||
except aiohttp.WSServerHandshakeError as e:
|
||||
log.exception(f'Failed to connect to WebSocket server: {e}')
|
||||
@@ -243,7 +243,7 @@ async def comfyui_edit_image(model: str, payload: ComfyUIEditImageForm, client_i
|
||||
) as ws:
|
||||
log.info('WebSocket connection established.')
|
||||
log.info('Sending workflow to WebSocket server.')
|
||||
log.info(f'Workflow: {workflow}')
|
||||
log.debug(f'Workflow: {workflow}')
|
||||
images = await _ws_get_images(ws, workflow, client_id, base_url, api_key)
|
||||
except aiohttp.WSServerHandshakeError as e:
|
||||
log.exception(f'Failed to connect to WebSocket server: {e}')
|
||||
|
||||
@@ -284,7 +284,7 @@ def validate_memory_operations(form_data) -> list[dict]:
|
||||
|
||||
|
||||
def model_allows_memory(model: dict | None) -> bool:
|
||||
return (model or {}).get('info', {}).get('meta', {}).get('capabilities', {}).get('memory', True)
|
||||
return ((model or {}).get('info', {}).get('meta', {}).get('capabilities') or {}).get('memory', True)
|
||||
|
||||
|
||||
async def add_memory_context(request, form_data: dict, user, model: dict | None = None):
|
||||
@@ -535,7 +535,8 @@ Memory types:
|
||||
- context: other durable context that may help future chats for this user account.
|
||||
|
||||
Rules:
|
||||
- Save only information likely to matter in future chats.
|
||||
- Save enduring details that can improve future conversations.
|
||||
- Do not save one-off activity, meals, temporary mood, routine daily events, or other short-lived details unless the user explicitly asks to remember them.
|
||||
- Do not save secrets, credentials, transient task steps, or unsupported guesses.
|
||||
- Use path when there is a clear path for the memory.
|
||||
- Leave path empty when there is no clear place for the memory.
|
||||
|
||||
@@ -157,6 +157,29 @@ def output_id(prefix: str) -> str:
|
||||
return f'{prefix}_{uuid4().hex[:24]}'
|
||||
|
||||
|
||||
def merge_streamed_reasoning_details(target: list, details) -> None:
|
||||
items = details if isinstance(details, list) else [details]
|
||||
for item in items:
|
||||
if not isinstance(item, dict):
|
||||
continue
|
||||
|
||||
index = item.get('index')
|
||||
existing = (
|
||||
next((detail for detail in target if detail.get('index') == index), None)
|
||||
if isinstance(index, int)
|
||||
else None
|
||||
)
|
||||
if existing is None:
|
||||
target.append(dict(item))
|
||||
continue
|
||||
|
||||
for key, value in item.items():
|
||||
if key in ('text', 'summary') and isinstance(value, str) and isinstance(existing.get(key), str):
|
||||
existing[key] += value
|
||||
else:
|
||||
existing[key] = value
|
||||
|
||||
|
||||
def _split_tool_calls(
|
||||
tool_calls: list[dict],
|
||||
) -> list[dict]:
|
||||
@@ -2427,7 +2450,7 @@ async def process_chat_payload(request, form_data, user, metadata, model):
|
||||
form_data['messages'],
|
||||
)
|
||||
|
||||
if 'memory' in features and features['memory']:
|
||||
if 'memory' in features and features['memory'] and await Config.get('memories.system_context.enable'):
|
||||
form_data = await add_memory_context(request, form_data, user, model)
|
||||
|
||||
if 'web_search' in features and features['web_search']:
|
||||
@@ -2905,6 +2928,13 @@ def update_assistant_message_from_stream(assistant_message, raw):
|
||||
if not isinstance(line, str):
|
||||
return
|
||||
|
||||
def append_output_text(item, text):
|
||||
parts = item.setdefault('content', [])
|
||||
if parts and parts[-1].get('type') == 'output_text':
|
||||
parts[-1]['text'] += text
|
||||
else:
|
||||
parts.append({'type': 'output_text', 'text': text})
|
||||
|
||||
for raw_part in line.splitlines():
|
||||
part = raw_part.removeprefix('data:').strip()
|
||||
if not part or part == '[DONE]':
|
||||
@@ -2932,8 +2962,50 @@ def update_assistant_message_from_stream(assistant_message, raw):
|
||||
assistant_message['usage'] = merge_usage(assistant_message.get('usage'), raw_usage)
|
||||
|
||||
for choice in data.get('choices', []):
|
||||
content = (choice.get('delta', {}) or {}).get('content')
|
||||
delta = choice.get('delta', {}) or {}
|
||||
content = delta.get('content')
|
||||
reasoning_content = delta.get('reasoning_content') or delta.get('reasoning') or delta.get('thinking')
|
||||
|
||||
if reasoning_content:
|
||||
output = assistant_message.setdefault('output', [])
|
||||
if not output or output[-1].get('type') != 'reasoning':
|
||||
output.append(
|
||||
{
|
||||
'type': 'reasoning',
|
||||
'id': output_id('r'),
|
||||
'status': 'in_progress',
|
||||
'start_tag': '<think>',
|
||||
'end_tag': '</think>',
|
||||
'attributes': {'type': 'reasoning_content'},
|
||||
'content': [],
|
||||
'summary': None,
|
||||
'started_at': time.time(),
|
||||
}
|
||||
)
|
||||
|
||||
append_output_text(output[-1], reasoning_content)
|
||||
|
||||
if content:
|
||||
output = assistant_message.get('output')
|
||||
if output:
|
||||
if output[-1].get('type') == 'reasoning':
|
||||
output[-1]['status'] = 'completed'
|
||||
output[-1]['ended_at'] = time.time()
|
||||
output[-1]['duration'] = int(output[-1]['ended_at'] - output[-1]['started_at'])
|
||||
|
||||
if not output or output[-1].get('type') != 'message':
|
||||
output.append(
|
||||
{
|
||||
'type': 'message',
|
||||
'id': output_id('msg'),
|
||||
'status': 'in_progress',
|
||||
'role': 'assistant',
|
||||
'content': [],
|
||||
}
|
||||
)
|
||||
|
||||
append_output_text(output[-1], content)
|
||||
|
||||
assistant_message['content'] = assistant_message.get('content', '') + content
|
||||
|
||||
|
||||
@@ -3395,10 +3467,11 @@ async def non_streaming_chat_response_handler(response, ctx):
|
||||
)
|
||||
|
||||
choices = response_data.get('choices', [])
|
||||
if choices and choices[0].get('message', {}).get('content'):
|
||||
content = response_data['choices'][0]['message']['content']
|
||||
response_output = response_data.get('output')
|
||||
content = choices[0].get('message', {}).get('content') if choices else ''
|
||||
|
||||
if content:
|
||||
if choices and (content or response_output):
|
||||
if content or response_output:
|
||||
await event_emitter(
|
||||
{
|
||||
'type': 'chat:completion',
|
||||
@@ -3414,7 +3487,6 @@ async def non_streaming_chat_response_handler(response, ctx):
|
||||
|
||||
# Use output from backend if provided (OR-compliant backends),
|
||||
# otherwise generate from response content
|
||||
response_output = response_data.get('output')
|
||||
if not response_output:
|
||||
choice_message = choices[0].get('message', {})
|
||||
reasoning_content = choice_message.get('reasoning_content') or choice_message.get('reasoning')
|
||||
@@ -3453,7 +3525,6 @@ async def non_streaming_chat_response_handler(response, ctx):
|
||||
'type': 'chat:completion',
|
||||
'data': {
|
||||
'done': True,
|
||||
'content': content,
|
||||
'output': response_output,
|
||||
'title': title,
|
||||
},
|
||||
@@ -3470,7 +3541,6 @@ async def non_streaming_chat_response_handler(response, ctx):
|
||||
{
|
||||
'done': True,
|
||||
'role': 'assistant',
|
||||
'content': content,
|
||||
'output': response_output,
|
||||
**({'usage': usage} if usage else {}),
|
||||
},
|
||||
@@ -4234,21 +4304,31 @@ async def streaming_chat_response_handler(response, ctx):
|
||||
)
|
||||
reasoning_details = delta.get('reasoning_details')
|
||||
if reasoning_content or reasoning_details:
|
||||
if not output or output[-1].get('type') != 'reasoning':
|
||||
reasoning_item = {
|
||||
'type': 'reasoning',
|
||||
'id': output_id('r'),
|
||||
'status': 'in_progress',
|
||||
'start_tag': '<think>',
|
||||
'end_tag': '</think>',
|
||||
'attributes': {'type': 'reasoning_content'},
|
||||
'content': [],
|
||||
'summary': None,
|
||||
'started_at': time.time(),
|
||||
}
|
||||
output.append(reasoning_item)
|
||||
else:
|
||||
reasoning_item = output[-1]
|
||||
reasoning_item = (
|
||||
next(
|
||||
(item for item in reversed(output) if item.get('type') == 'reasoning'),
|
||||
None,
|
||||
)
|
||||
if reasoning_details and not reasoning_content
|
||||
else None
|
||||
)
|
||||
|
||||
if reasoning_item is None:
|
||||
if not output or output[-1].get('type') != 'reasoning':
|
||||
reasoning_item = {
|
||||
'type': 'reasoning',
|
||||
'id': output_id('r'),
|
||||
'status': 'in_progress',
|
||||
'start_tag': '<think>',
|
||||
'end_tag': '</think>',
|
||||
'attributes': {'type': 'reasoning_content'},
|
||||
'content': [],
|
||||
'summary': None,
|
||||
'started_at': time.time(),
|
||||
}
|
||||
output.append(reasoning_item)
|
||||
else:
|
||||
reasoning_item = output[-1]
|
||||
|
||||
if reasoning_content:
|
||||
# Append to reasoning content
|
||||
@@ -4269,11 +4349,14 @@ async def streaming_chat_response_handler(response, ctx):
|
||||
delta_type = 'content'
|
||||
|
||||
if reasoning_details:
|
||||
reasoning_item.setdefault('reasoning_details', []).extend(
|
||||
reasoning_details
|
||||
if isinstance(reasoning_details, list)
|
||||
else [reasoning_details]
|
||||
merge_streamed_reasoning_details(
|
||||
reasoning_item.setdefault('reasoning_details', []),
|
||||
reasoning_details,
|
||||
)
|
||||
data = {
|
||||
'output': full_output(),
|
||||
}
|
||||
delta_type = 'content'
|
||||
|
||||
if value:
|
||||
if (
|
||||
|
||||
@@ -24,6 +24,8 @@ from fastapi import (
|
||||
HTTPException,
|
||||
status,
|
||||
)
|
||||
from joserfc.jws import JWSRegistry
|
||||
from joserfc.registry import HeaderParameter
|
||||
from mcp.shared.auth import (
|
||||
OAuthClientMetadata as MCPOAuthClientMetadata,
|
||||
)
|
||||
@@ -187,6 +189,14 @@ async def get_oauth_runtime_config() -> SimpleNamespace:
|
||||
DEFAULT_TOKEN_EXPIRY_SECONDS = 3600
|
||||
|
||||
|
||||
# Apereo CAS includes client_id in ID token JWS headers; Authlib 1.7/joserfc
|
||||
# rejects unknown headers unless we register the provider extension.
|
||||
JWSRegistry.default_header_registry.setdefault(
|
||||
'client_id',
|
||||
HeaderParameter('OAuth client identifier', 'str'),
|
||||
)
|
||||
|
||||
|
||||
def _normalize_token_expiry(token: dict) -> dict:
|
||||
"""Ensure a token dict always has a numeric ``expires_at``.
|
||||
|
||||
|
||||
Generated
+2
-2
@@ -1,12 +1,12 @@
|
||||
{
|
||||
"name": "open-webui",
|
||||
"version": "0.10.1",
|
||||
"version": "0.10.2",
|
||||
"lockfileVersion": 3,
|
||||
"requires": true,
|
||||
"packages": {
|
||||
"": {
|
||||
"name": "open-webui",
|
||||
"version": "0.10.1",
|
||||
"version": "0.10.2",
|
||||
"dependencies": {
|
||||
"@azure/msal-browser": "^4.5.0",
|
||||
"@codemirror/lang-javascript": "^6.2.2",
|
||||
|
||||
+1
-1
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "open-webui",
|
||||
"version": "0.10.1",
|
||||
"version": "0.10.2",
|
||||
"private": true,
|
||||
"scripts": {
|
||||
"dev": "npm run pyodide:fetch && vite dev --host",
|
||||
|
||||
@@ -43,6 +43,7 @@
|
||||
|
||||
let STT_OPENAI_API_BASE_URL = '';
|
||||
let STT_OPENAI_API_KEY = '';
|
||||
let STT_OPENAI_API_REQUEST_FORMAT = 'multipart';
|
||||
let STT_ENGINE = '';
|
||||
let STT_MODEL = '';
|
||||
let STT_SUPPORTED_CONTENT_TYPES = '';
|
||||
@@ -150,6 +151,7 @@
|
||||
stt: {
|
||||
OPENAI_API_BASE_URL: STT_OPENAI_API_BASE_URL,
|
||||
OPENAI_API_KEY: STT_OPENAI_API_KEY,
|
||||
OPENAI_API_REQUEST_FORMAT: STT_OPENAI_API_REQUEST_FORMAT,
|
||||
ENGINE: STT_ENGINE,
|
||||
MODEL: STT_MODEL,
|
||||
SUPPORTED_CONTENT_TYPES: STT_SUPPORTED_CONTENT_TYPES.split(','),
|
||||
@@ -202,6 +204,7 @@
|
||||
|
||||
STT_OPENAI_API_BASE_URL = res.stt.OPENAI_API_BASE_URL;
|
||||
STT_OPENAI_API_KEY = res.stt.OPENAI_API_KEY;
|
||||
STT_OPENAI_API_REQUEST_FORMAT = res.stt.OPENAI_API_REQUEST_FORMAT || 'multipart';
|
||||
|
||||
STT_ENGINE = res.stt.ENGINE;
|
||||
STT_MODEL = res.stt.MODEL;
|
||||
@@ -288,6 +291,21 @@
|
||||
|
||||
<hr class="border-gray-100/30 dark:border-gray-850/30 my-2" />
|
||||
|
||||
<div class="mb-2 py-0.5 flex w-full justify-between">
|
||||
<div class=" self-center text-xs font-medium">{$i18n.t('Request Format')}</div>
|
||||
<div class="flex items-center relative">
|
||||
<select
|
||||
class="cursor-pointer w-fit pr-8 rounded-sm px-2 p-1 text-xs bg-transparent outline-hidden text-right"
|
||||
bind:value={STT_OPENAI_API_REQUEST_FORMAT}
|
||||
>
|
||||
<option value="multipart">{$i18n.t('Multipart Upload')}</option>
|
||||
<option value="json">{$i18n.t('JSON Base64')}</option>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<hr class="border-gray-100/30 dark:border-gray-850/30 my-2" />
|
||||
|
||||
<div>
|
||||
<div class=" mb-1.5 text-xs font-medium">{$i18n.t('STT Model')}</div>
|
||||
<div class="flex w-full">
|
||||
|
||||
@@ -1247,12 +1247,14 @@
|
||||
</div>
|
||||
{/if}
|
||||
</div>
|
||||
{/if}
|
||||
|
||||
<div class="mb-3">
|
||||
<div class=" mt-0.5 mb-2.5 text-base font-medium">{$i18n.t('Retrieval')}</div>
|
||||
<div class="mb-3">
|
||||
<div class=" mt-0.5 mb-2.5 text-base font-medium">{$i18n.t('Retrieval')}</div>
|
||||
|
||||
<hr class=" border-gray-100/30 dark:border-gray-850/30 my-2" />
|
||||
<hr class=" border-gray-100/30 dark:border-gray-850/30 my-2" />
|
||||
|
||||
{#if !RAGConfig.BYPASS_EMBEDDING_AND_RETRIEVAL}
|
||||
<div class=" mb-2.5 flex w-full justify-between">
|
||||
<div class=" self-center text-xs font-medium">{$i18n.t('Full Context Mode')}</div>
|
||||
<div class="flex items-center relative">
|
||||
@@ -1500,36 +1502,34 @@
|
||||
</div>
|
||||
{/if}
|
||||
{/if}
|
||||
{/if}
|
||||
|
||||
<div class=" mb-2.5 flex flex-col w-full justify-between">
|
||||
<div class=" mb-1 text-xs font-medium">{$i18n.t('RAG Template')}</div>
|
||||
<div class="flex w-full items-center relative">
|
||||
<Tooltip
|
||||
content={$i18n.t(
|
||||
<div class=" mb-2.5 flex flex-col w-full justify-between">
|
||||
<div class=" mb-1 text-xs font-medium">{$i18n.t('RAG Template')}</div>
|
||||
<div class="flex w-full items-center relative">
|
||||
<Tooltip
|
||||
content={$i18n.t('Leave empty to use the default prompt, or enter a custom prompt')}
|
||||
placement="top-start"
|
||||
className="w-full"
|
||||
>
|
||||
<Textarea
|
||||
bind:value={RAGConfig.RAG_TEMPLATE}
|
||||
placeholder={$i18n.t(
|
||||
'Leave empty to use the default prompt, or enter a custom prompt'
|
||||
)}
|
||||
placement="top-start"
|
||||
className="w-full"
|
||||
>
|
||||
<Textarea
|
||||
bind:value={RAGConfig.RAG_TEMPLATE}
|
||||
placeholder={$i18n.t(
|
||||
'Leave empty to use the default prompt, or enter a custom prompt'
|
||||
)}
|
||||
/>
|
||||
</Tooltip>
|
||||
</div>
|
||||
|
||||
{#if RAGConfig.RAG_TEMPLATE && (RAGConfig.RAG_TEMPLATE.match(/\[context\]/g) || []).length + (RAGConfig.RAG_TEMPLATE.match(/\{\{CONTEXT\}\}/g) || []).length > 1}
|
||||
<div class="mt-1 text-xs text-gray-400 dark:text-gray-500">
|
||||
{$i18n.t(
|
||||
'This template contains multiple context placeholders ([context] or {{CONTEXT}}). Context will be injected at each occurrence.'
|
||||
)}
|
||||
</div>
|
||||
{/if}
|
||||
/>
|
||||
</Tooltip>
|
||||
</div>
|
||||
|
||||
{#if RAGConfig.RAG_TEMPLATE && (RAGConfig.RAG_TEMPLATE.match(/\[context\]/g) || []).length + (RAGConfig.RAG_TEMPLATE.match(/\{\{CONTEXT\}\}/g) || []).length > 1}
|
||||
<div class="mt-1 text-xs text-gray-400 dark:text-gray-500">
|
||||
{$i18n.t(
|
||||
'This template contains multiple context placeholders ([context] or {{CONTEXT}}). Context will be injected at each occurrence.'
|
||||
)}
|
||||
</div>
|
||||
{/if}
|
||||
</div>
|
||||
{/if}
|
||||
</div>
|
||||
|
||||
<div class="mb-3">
|
||||
<div class=" mt-0.5 mb-2.5 text-base font-medium">{$i18n.t('Files')}</div>
|
||||
|
||||
@@ -297,6 +297,16 @@
|
||||
<Switch bind:state={adminConfig.ENABLE_MEMORIES} />
|
||||
</div>
|
||||
|
||||
{#if adminConfig.ENABLE_MEMORIES}
|
||||
<div class="mb-2.5 flex w-full items-center justify-between pr-2 pl-4">
|
||||
<div class=" self-center text-xs font-medium text-gray-500 dark:text-gray-400">
|
||||
{$i18n.t('Memory System Context')}
|
||||
</div>
|
||||
|
||||
<Switch bind:state={adminConfig.ENABLE_MEMORY_SYSTEM_CONTEXT} />
|
||||
</div>
|
||||
{/if}
|
||||
|
||||
<div class="mb-2.5 flex w-full items-center justify-between pr-2">
|
||||
<div class=" self-center text-xs font-medium">
|
||||
{$i18n.t('Notes')}
|
||||
|
||||
@@ -50,7 +50,7 @@
|
||||
class="min-w-[170px] rounded-xl p-1 border border-gray-100 dark:border-gray-800 z-50 bg-white dark:bg-gray-850 dark:text-white shadow-sm"
|
||||
>
|
||||
<button
|
||||
class="select-none flex gap-2 items-center px-3 py-1.5 text-sm font-medium cursor-pointer hover:bg-gray-50 dark:hover:bg-gray-800 rounded-md"
|
||||
class="select-none flex w-full gap-2 items-center px-3 py-1.5 text-sm font-medium cursor-pointer hover:bg-gray-50 dark:hover:bg-gray-800 rounded-md"
|
||||
on:click={() => {
|
||||
hideHandler();
|
||||
}}
|
||||
@@ -102,7 +102,7 @@
|
||||
</button>
|
||||
|
||||
<button
|
||||
class="select-none flex gap-2 items-center px-3 py-1.5 text-sm font-medium cursor-pointer hover:bg-gray-50 dark:hover:bg-gray-800 rounded-md"
|
||||
class="select-none flex w-full gap-2 items-center px-3 py-1.5 text-sm font-medium cursor-pointer hover:bg-gray-50 dark:hover:bg-gray-800 rounded-md"
|
||||
on:click={() => {
|
||||
pinModelHandler(model?.id);
|
||||
}}
|
||||
@@ -123,7 +123,7 @@
|
||||
</button>
|
||||
|
||||
<button
|
||||
class="select-none flex gap-2 items-center px-3 py-1.5 text-sm font-medium cursor-pointer hover:bg-gray-50 dark:hover:bg-gray-800 rounded-md"
|
||||
class="select-none flex w-full gap-2 items-center px-3 py-1.5 text-sm font-medium cursor-pointer hover:bg-gray-50 dark:hover:bg-gray-800 rounded-md"
|
||||
on:click={() => {
|
||||
copyLinkHandler();
|
||||
}}
|
||||
@@ -135,7 +135,7 @@
|
||||
|
||||
{#if model?.is_active ?? true}
|
||||
<button
|
||||
class="select-none flex gap-2 items-center px-3 py-1.5 text-sm font-medium cursor-pointer hover:bg-gray-50 dark:hover:bg-gray-800 rounded-md"
|
||||
class="select-none flex w-full gap-2 items-center px-3 py-1.5 text-sm font-medium cursor-pointer hover:bg-gray-50 dark:hover:bg-gray-800 rounded-md"
|
||||
on:click={() => {
|
||||
cloneHandler();
|
||||
}}
|
||||
@@ -147,7 +147,7 @@
|
||||
{/if}
|
||||
|
||||
<button
|
||||
class="select-none flex gap-2 items-center px-3 py-1.5 text-sm font-medium cursor-pointer hover:bg-gray-50 dark:hover:bg-gray-800 rounded-md"
|
||||
class="select-none flex w-full gap-2 items-center px-3 py-1.5 text-sm font-medium cursor-pointer hover:bg-gray-50 dark:hover:bg-gray-800 rounded-md"
|
||||
on:click={() => {
|
||||
exportHandler();
|
||||
}}
|
||||
|
||||
@@ -551,7 +551,7 @@
|
||||
> Your support helps us stay independent and continue building great tools for everyone. 💛
|
||||
>
|
||||
> - 👉 **[Click here to learn more about enterprise licensing](https://docs.openwebui.com/enterprise)**
|
||||
> - 👉 *[Click here to sponsor the project on GitHub](https://github.com/sponsors/tjbck)*
|
||||
> - 👉 *[Click here to sponsor the project on GitHub](https://github.com/sponsors/open-webui)*
|
||||
`}
|
||||
/>
|
||||
</div>
|
||||
|
||||
@@ -1961,6 +1961,7 @@
|
||||
// Store raw OR-aligned output items from backend
|
||||
if (output) {
|
||||
message.output = output;
|
||||
message.content = getOutputText(output);
|
||||
dispatchCallOverlayAudio(message);
|
||||
}
|
||||
|
||||
|
||||
@@ -107,7 +107,8 @@ function getMessageText(item: OutputItem): string {
|
||||
}
|
||||
|
||||
function getReasoningText(item: OutputItem): string {
|
||||
return getTextFromParts(item.summary ?? item.content ?? []);
|
||||
const summary = Array.isArray(item.summary) && item.summary.length ? item.summary : null;
|
||||
return getTextFromParts(summary ?? item.content ?? []);
|
||||
}
|
||||
|
||||
function getToolResultText(item?: OutputItem): string {
|
||||
|
||||
@@ -47,6 +47,7 @@
|
||||
export let searchEnabled = true;
|
||||
export let searchPlaceholder = $i18n.t('Search a model');
|
||||
export let selectionOnly = false;
|
||||
export let includeHidden = false;
|
||||
|
||||
export let items: {
|
||||
label: string;
|
||||
@@ -218,7 +219,7 @@
|
||||
return item.model?.direct;
|
||||
}
|
||||
})
|
||||
).filter((item) => !(item.model?.info?.meta?.hidden ?? false));
|
||||
).filter((item) => includeHidden || !(item.model?.info?.meta?.hidden ?? false));
|
||||
|
||||
$: if (
|
||||
selectedTag !== undefined ||
|
||||
@@ -391,7 +392,7 @@
|
||||
onMount(async () => {
|
||||
if (items) {
|
||||
tags = items
|
||||
.filter((item) => !(item.model?.info?.meta?.hidden ?? false))
|
||||
.filter((item) => includeHidden || !(item.model?.info?.meta?.hidden ?? false))
|
||||
.flatMap((item) => item.model?.tags ?? [])
|
||||
.map((tag) => tag.name.toLowerCase());
|
||||
// Remove duplicates and sort
|
||||
@@ -595,7 +596,7 @@
|
||||
{/if}
|
||||
|
||||
<div class="px-2">
|
||||
{#if tags && items.filter((item) => !(item.model?.info?.meta?.hidden ?? false)).length > 0}
|
||||
{#if tags && items.filter((item) => includeHidden || !(item.model?.info?.meta?.hidden ?? false)).length > 0}
|
||||
<div
|
||||
class=" flex w-full bg-white dark:bg-gray-850 overflow-x-auto scrollbar-none font-[450] mb-0.5"
|
||||
on:wheel={(e) => {
|
||||
|
||||
@@ -6,18 +6,24 @@
|
||||
import ProfileImage from '../Messages/ProfileImage.svelte';
|
||||
import Tooltip from '$lib/components/common/Tooltip.svelte';
|
||||
import Heart from '$lib/components/icons/Heart.svelte';
|
||||
import { getOutputText } from '../Messages/structuredOutput';
|
||||
|
||||
const i18n = getContext('i18n');
|
||||
|
||||
type $$Props = NodeProps;
|
||||
export let data: $$Props['data'];
|
||||
|
||||
const getMessageContent = (nodeData: any) =>
|
||||
getOutputText(nodeData?.message?.output) || nodeData?.message?.content || '';
|
||||
|
||||
$: messageContent = getMessageContent(data);
|
||||
</script>
|
||||
|
||||
<div
|
||||
class="px-4 py-3 shadow-md rounded-xl dark:bg-black bg-white border border-gray-100 dark:border-gray-900 w-60 h-20 group"
|
||||
>
|
||||
<Tooltip
|
||||
content={data?.message?.error ? data.message.error.content : data.message.content}
|
||||
content={data?.message?.error ? data.message.error.content : messageContent}
|
||||
class="w-full"
|
||||
allowHTML={false}
|
||||
>
|
||||
@@ -37,7 +43,7 @@
|
||||
{#if data?.message?.error}
|
||||
<div class="text-red-500 line-clamp-2 text-xs mt-0.5">{data.message.error.content}</div>
|
||||
{:else}
|
||||
<div class="text-gray-500 line-clamp-2 text-xs mt-0.5">{data.message.content}</div>
|
||||
<div class="text-gray-500 line-clamp-2 text-xs mt-0.5">{messageContent}</div>
|
||||
{/if}
|
||||
</div>
|
||||
</div>
|
||||
@@ -77,7 +83,7 @@
|
||||
{data.message.error.content}
|
||||
</div>
|
||||
{:else}
|
||||
<div class="text-gray-500 line-clamp-2 text-xs mt-0.5">{data.message.content}</div>
|
||||
<div class="text-gray-500 line-clamp-2 text-xs mt-0.5">{messageContent}</div>
|
||||
{/if}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -47,7 +47,7 @@
|
||||
const handleKeyDown = (event: KeyboardEvent) => {
|
||||
if (event.key === 'Escape') {
|
||||
console.log('Escape');
|
||||
show = false;
|
||||
cancelHandler();
|
||||
}
|
||||
|
||||
if (event.key === 'Enter') {
|
||||
@@ -65,6 +65,11 @@
|
||||
dispatch('confirm', _inputValue);
|
||||
};
|
||||
|
||||
const cancelHandler = () => {
|
||||
show = false;
|
||||
dispatch('cancel');
|
||||
};
|
||||
|
||||
onMount(() => {
|
||||
mounted = true;
|
||||
});
|
||||
@@ -107,7 +112,7 @@
|
||||
class=" fixed top-0 right-0 left-0 bottom-0 bg-black/60 w-full h-screen max-h-[100dvh] flex justify-center z-99999999 overflow-hidden overscroll-contain"
|
||||
in:fade={{ duration: 10 }}
|
||||
on:mousedown={() => {
|
||||
show = false;
|
||||
cancelHandler();
|
||||
}}
|
||||
>
|
||||
<div
|
||||
@@ -174,8 +179,7 @@
|
||||
<button
|
||||
class="text-sm bg-gray-100 hover:bg-gray-200 text-gray-800 dark:bg-gray-850 dark:hover:bg-gray-800 dark:text-white font-medium w-full py-2 rounded-3xl transition"
|
||||
on:click={() => {
|
||||
show = false;
|
||||
dispatch('cancel');
|
||||
cancelHandler();
|
||||
}}
|
||||
type="button"
|
||||
>
|
||||
|
||||
@@ -7,6 +7,7 @@
|
||||
|
||||
import { downloadChatAsPDF } from '$lib/apis/utils';
|
||||
import { copyToClipboard, createMessagesList } from '$lib/utils';
|
||||
import { getOutputText } from '$lib/components/chat/Messages/structuredOutput';
|
||||
|
||||
import {
|
||||
showControls,
|
||||
@@ -59,7 +60,8 @@
|
||||
const history = chat.chat.history;
|
||||
const messages = createMessagesList(history, history.currentId);
|
||||
const chatText = messages.reduce((a, message, i, arr) => {
|
||||
return `${a}### ${message.role.toUpperCase()}\n${message.content}\n\n`;
|
||||
const content = getOutputText(message.output) || message.content || '';
|
||||
return `${a}### ${message.role.toUpperCase()}\n${content}\n\n`;
|
||||
}, '');
|
||||
|
||||
return chatText.trim();
|
||||
|
||||
@@ -24,6 +24,7 @@
|
||||
import calendar from 'dayjs/plugin/calendar';
|
||||
import Loader from '../common/Loader.svelte';
|
||||
import { createMessagesList } from '$lib/utils';
|
||||
import { getOutputText } from '$lib/components/chat/Messages/structuredOutput';
|
||||
import {
|
||||
config,
|
||||
user,
|
||||
@@ -204,14 +205,14 @@
|
||||
let msgList = [];
|
||||
|
||||
if (history?.messages && history?.currentId) {
|
||||
msgList = createMessagesList(history, history.currentId).map((m) => ({
|
||||
msgList = createMessagesList(history, history.currentId).map((m: any) => ({
|
||||
role: m.role,
|
||||
content: m.content
|
||||
content: getOutputText(m.output) || m.content || ''
|
||||
}));
|
||||
} else {
|
||||
msgList = (chatContent?.messages ?? []).map((m) => ({
|
||||
msgList = (chatContent?.messages ?? []).map((m: any) => ({
|
||||
role: m.role,
|
||||
content: m.content
|
||||
content: getOutputText(m.output) || m.content || ''
|
||||
}));
|
||||
}
|
||||
|
||||
|
||||
@@ -32,6 +32,7 @@
|
||||
tags,
|
||||
selectedFolder,
|
||||
activeChatIds,
|
||||
settings,
|
||||
user
|
||||
} from '$lib/stores';
|
||||
|
||||
@@ -49,6 +50,7 @@
|
||||
import Spinner from '$lib/components/common/Spinner.svelte';
|
||||
import { generateTitle } from '$lib/apis';
|
||||
import { createMessagesList } from '$lib/utils';
|
||||
import { getOutputText } from '$lib/components/chat/Messages/structuredOutput';
|
||||
|
||||
const i18n = getContext('i18n');
|
||||
|
||||
@@ -361,14 +363,14 @@
|
||||
const history = chatContent?.history;
|
||||
let messages = [];
|
||||
if (history?.messages && history?.currentId) {
|
||||
messages = createMessagesList(history, history.currentId).map((message) => ({
|
||||
messages = createMessagesList(history, history.currentId).map((message: any) => ({
|
||||
role: message.role,
|
||||
content: message.content
|
||||
content: getOutputText(message.output) || message.content || ''
|
||||
}));
|
||||
} else {
|
||||
messages = (chatContent?.messages ?? []).map((message) => ({
|
||||
messages = (chatContent?.messages ?? []).map((message: any) => ({
|
||||
role: message.role,
|
||||
content: message.content
|
||||
content: getOutputText(message.output) || message.content || ''
|
||||
}));
|
||||
}
|
||||
|
||||
@@ -463,9 +465,13 @@
|
||||
id="sidebar-chat-item"
|
||||
class=" w-full flex justify-between rounded-xl px-[11px] py-[6px] {id === $chatId ||
|
||||
confirmEdit
|
||||
? 'bg-gray-100 dark:bg-gray-900 selected'
|
||||
? ($settings?.highContrastMode ?? false)
|
||||
? 'bg-gray-100 dark:bg-gray-800 selected'
|
||||
: 'bg-gray-100 dark:bg-gray-900 selected'
|
||||
: selected
|
||||
? 'bg-gray-100 dark:bg-gray-950 selected'
|
||||
? ($settings?.highContrastMode ?? false)
|
||||
? 'bg-gray-100 dark:bg-gray-900 selected'
|
||||
: 'bg-gray-100 dark:bg-gray-950 selected'
|
||||
: 'group-hover:bg-gray-100 dark:group-hover:bg-gray-950'} whitespace-nowrap text-ellipsis relative {generating
|
||||
? 'cursor-not-allowed'
|
||||
: ''}"
|
||||
@@ -499,9 +505,13 @@
|
||||
id="sidebar-chat-item"
|
||||
class=" w-full flex justify-between rounded-xl px-[11px] py-[6px] {id === $chatId ||
|
||||
confirmEdit
|
||||
? 'bg-gray-100 dark:bg-gray-900 selected'
|
||||
? ($settings?.highContrastMode ?? false)
|
||||
? 'bg-gray-100 dark:bg-gray-800 selected'
|
||||
: 'bg-gray-100 dark:bg-gray-900 selected'
|
||||
: selected
|
||||
? 'bg-gray-100 dark:bg-gray-950 selected'
|
||||
? ($settings?.highContrastMode ?? false)
|
||||
? 'bg-gray-100 dark:bg-gray-900 selected'
|
||||
: 'bg-gray-100 dark:bg-gray-950 selected'
|
||||
: ' group-hover:bg-gray-100 dark:group-hover:bg-gray-950'} whitespace-nowrap text-ellipsis"
|
||||
href="/c/{id}"
|
||||
on:click={() => {
|
||||
@@ -570,9 +580,9 @@
|
||||
</div>
|
||||
|
||||
<!-- Time ago indicator -->
|
||||
{#if createdAt && !mouseOver}
|
||||
{#if (updatedAt ?? createdAt) && !mouseOver}
|
||||
<div class="shrink-0 self-center text-[10px] text-gray-400 dark:text-gray-500 pl-2">
|
||||
{formatTimeAgo(createdAt)}
|
||||
{formatTimeAgo(updatedAt ?? createdAt)}
|
||||
</div>
|
||||
{/if}
|
||||
</a>
|
||||
@@ -584,9 +594,13 @@
|
||||
id="sidebar-chat-item-menu"
|
||||
class="
|
||||
{id === $chatId || confirmEdit
|
||||
? 'from-gray-100 dark:from-gray-900 selected'
|
||||
? ($settings?.highContrastMode ?? false)
|
||||
? 'from-gray-100 dark:from-gray-800 selected'
|
||||
: 'from-gray-100 dark:from-gray-900 selected'
|
||||
: selected
|
||||
? 'from-gray-100 dark:from-gray-950 selected'
|
||||
? ($settings?.highContrastMode ?? false)
|
||||
? 'from-gray-100 dark:from-gray-900 selected'
|
||||
: 'from-gray-100 dark:from-gray-950 selected'
|
||||
: 'invisible group-hover:visible from-gray-100 dark:from-gray-950'}
|
||||
absolute {className === 'pr-2'
|
||||
? 'right-[8px]'
|
||||
|
||||
@@ -22,6 +22,7 @@
|
||||
} from '$lib/apis/chats';
|
||||
import { chats, folders, settings, theme, user } from '$lib/stores';
|
||||
import { createMessagesList } from '$lib/utils';
|
||||
import { getOutputText } from '$lib/components/chat/Messages/structuredOutput';
|
||||
import { downloadChatAsPDF } from '$lib/apis/utils';
|
||||
import Download from '$lib/components/icons/Download.svelte';
|
||||
import Folder from '$lib/components/icons/Folder.svelte';
|
||||
@@ -61,7 +62,8 @@
|
||||
const history = chat.chat.history;
|
||||
const messages = createMessagesList(history, history.currentId);
|
||||
const chatText = messages.reduce((a, message, i, arr) => {
|
||||
return `${a}### ${message.role.toUpperCase()}\n${message.content}\n\n`;
|
||||
const content = getOutputText(message.output) || message.content || '';
|
||||
return `${a}### ${message.role.toUpperCase()}\n${content}\n\n`;
|
||||
}, '');
|
||||
|
||||
return chatText.trim();
|
||||
|
||||
@@ -92,6 +92,9 @@
|
||||
let showResetConfirm = false;
|
||||
|
||||
let minSize = 0;
|
||||
type DirectoryFileEntry = { path: string; filename: string; file: File };
|
||||
type DirectoryManifestEntry = DirectoryFileEntry & { checksum: string; size: number };
|
||||
|
||||
type Knowledge = {
|
||||
id: string;
|
||||
name: string;
|
||||
@@ -463,19 +466,9 @@
|
||||
};
|
||||
|
||||
const uploadDirectoryHandler = async () => {
|
||||
// Check if File System Access API is supported
|
||||
const isFileSystemAccessSupported = 'showDirectoryPicker' in window;
|
||||
|
||||
try {
|
||||
if (isFileSystemAccessSupported) {
|
||||
// Modern browsers (Chrome, Edge) implementation
|
||||
await handleModernBrowserUpload();
|
||||
} else {
|
||||
// Firefox fallback
|
||||
await handleFirefoxUpload();
|
||||
}
|
||||
} catch (error) {
|
||||
handleUploadError(error);
|
||||
const entries = await collectDirectoryFiles();
|
||||
if (entries?.length) {
|
||||
await uploadDirectoryEntries(entries);
|
||||
}
|
||||
};
|
||||
|
||||
@@ -484,146 +477,6 @@
|
||||
return path.split('/').some((part) => part.startsWith('.'));
|
||||
};
|
||||
|
||||
// Modern browsers implementation using File System Access API
|
||||
const handleModernBrowserUpload = async () => {
|
||||
const dirHandle = await window.showDirectoryPicker();
|
||||
let totalFiles = 0;
|
||||
let uploadedFiles = 0;
|
||||
|
||||
// Function to update the UI with the progress
|
||||
const updateProgress = () => {
|
||||
const percentage = (uploadedFiles / totalFiles) * 100;
|
||||
toast.info(
|
||||
$i18n.t('Upload Progress: {{uploadedFiles}}/{{totalFiles}} ({{percentage}}%)', {
|
||||
uploadedFiles: uploadedFiles,
|
||||
totalFiles: totalFiles,
|
||||
percentage: percentage.toFixed(2)
|
||||
})
|
||||
);
|
||||
};
|
||||
|
||||
// Recursive function to count all files excluding hidden ones
|
||||
async function countFiles(dirHandle) {
|
||||
for await (const entry of dirHandle.values()) {
|
||||
// Skip hidden files and directories
|
||||
if (entry.name.startsWith('.')) continue;
|
||||
|
||||
if (entry.kind === 'file') {
|
||||
totalFiles++;
|
||||
} else if (entry.kind === 'directory') {
|
||||
// Only process non-hidden directories
|
||||
if (!entry.name.startsWith('.')) {
|
||||
await countFiles(entry);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Recursive function to process directories excluding hidden files and folders
|
||||
async function processDirectory(dirHandle, path = '') {
|
||||
for await (const entry of dirHandle.values()) {
|
||||
// Skip hidden files and directories
|
||||
if (entry.name.startsWith('.')) continue;
|
||||
|
||||
const entryPath = path ? `${path}/${entry.name}` : entry.name;
|
||||
|
||||
// Skip if the path contains any hidden folders
|
||||
if (hasHiddenFolder(entryPath)) continue;
|
||||
|
||||
if (entry.kind === 'file') {
|
||||
const file = await entry.getFile();
|
||||
const fileWithPath = new File([file], entryPath, { type: file.type });
|
||||
|
||||
await uploadFileHandler(fileWithPath);
|
||||
uploadedFiles++;
|
||||
updateProgress();
|
||||
} else if (entry.kind === 'directory') {
|
||||
// Only process non-hidden directories
|
||||
if (!entry.name.startsWith('.')) {
|
||||
await processDirectory(entry, entryPath);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
await countFiles(dirHandle);
|
||||
updateProgress();
|
||||
|
||||
if (totalFiles > 0) {
|
||||
await processDirectory(dirHandle);
|
||||
} else {
|
||||
console.log('No files to upload.');
|
||||
}
|
||||
};
|
||||
|
||||
// Firefox fallback implementation using traditional file input
|
||||
const handleFirefoxUpload = async () => {
|
||||
return new Promise((resolve, reject) => {
|
||||
// Create hidden file input
|
||||
const input = document.createElement('input');
|
||||
input.type = 'file';
|
||||
input.webkitdirectory = true;
|
||||
input.directory = true;
|
||||
input.multiple = true;
|
||||
input.style.display = 'none';
|
||||
|
||||
// Add input to DOM temporarily
|
||||
document.body.appendChild(input);
|
||||
|
||||
input.onchange = async () => {
|
||||
try {
|
||||
const files = Array.from(input.files)
|
||||
// Filter out files from hidden folders
|
||||
.filter((file) => !hasHiddenFolder(file.webkitRelativePath));
|
||||
|
||||
let totalFiles = files.length;
|
||||
let uploadedFiles = 0;
|
||||
|
||||
// Function to update the UI with the progress
|
||||
const updateProgress = () => {
|
||||
const percentage = (uploadedFiles / totalFiles) * 100;
|
||||
toast.info(
|
||||
$i18n.t('Upload Progress: {{uploadedFiles}}/{{totalFiles}} ({{percentage}}%)', {
|
||||
uploadedFiles: uploadedFiles,
|
||||
totalFiles: totalFiles,
|
||||
percentage: percentage.toFixed(2)
|
||||
})
|
||||
);
|
||||
};
|
||||
|
||||
updateProgress();
|
||||
|
||||
// Process all files
|
||||
for (const file of files) {
|
||||
// Skip hidden files (additional check)
|
||||
if (!file.name.startsWith('.')) {
|
||||
const relativePath = file.webkitRelativePath || file.name;
|
||||
const fileWithPath = new File([file], relativePath, { type: file.type });
|
||||
|
||||
await uploadFileHandler(fileWithPath);
|
||||
uploadedFiles++;
|
||||
updateProgress();
|
||||
}
|
||||
}
|
||||
|
||||
// Clean up
|
||||
document.body.removeChild(input);
|
||||
resolve();
|
||||
} catch (error) {
|
||||
reject(error);
|
||||
}
|
||||
};
|
||||
|
||||
input.onerror = (error) => {
|
||||
document.body.removeChild(input);
|
||||
reject(error);
|
||||
};
|
||||
|
||||
// Trigger file picker
|
||||
input.click();
|
||||
});
|
||||
};
|
||||
|
||||
// Error handler
|
||||
const handleUploadError = (error) => {
|
||||
if (error.name === 'AbortError') {
|
||||
@@ -634,18 +487,14 @@
|
||||
}
|
||||
};
|
||||
|
||||
// Collect files from a directory without uploading — returns {path, filename, file}[]
|
||||
const collectDirectoryFiles = async (): Promise<Array<{
|
||||
path: string;
|
||||
filename: string;
|
||||
file: File;
|
||||
}> | null> => {
|
||||
// Collect files from a directory without uploading.
|
||||
const collectDirectoryFiles = async (): Promise<DirectoryFileEntry[] | null> => {
|
||||
const isFileSystemAccessSupported = 'showDirectoryPicker' in window;
|
||||
|
||||
try {
|
||||
if (isFileSystemAccessSupported) {
|
||||
const dirHandle = await window.showDirectoryPicker();
|
||||
const collected: Array<{ path: string; filename: string; file: File }> = [];
|
||||
const collected: DirectoryFileEntry[] = [];
|
||||
|
||||
async function traverse(handle: FileSystemDirectoryHandle, dirPath = '') {
|
||||
for await (const entry of handle.values()) {
|
||||
@@ -662,7 +511,7 @@
|
||||
}
|
||||
}
|
||||
|
||||
await traverse(dirHandle);
|
||||
await traverse(dirHandle, dirHandle.name);
|
||||
return collected;
|
||||
} else {
|
||||
// Firefox fallback
|
||||
@@ -683,10 +532,8 @@
|
||||
|
||||
const collected = files.map((file) => {
|
||||
const parts = file.webkitRelativePath.split('/');
|
||||
// Remove root dir name, extract path and filename
|
||||
const withoutRoot = parts.slice(1);
|
||||
const filename = withoutRoot.pop() || file.name;
|
||||
const path = withoutRoot.join('/');
|
||||
const filename = parts.pop() || file.name;
|
||||
const path = parts.join('/');
|
||||
return { path, filename, file };
|
||||
});
|
||||
|
||||
@@ -712,6 +559,106 @@
|
||||
}
|
||||
};
|
||||
|
||||
const buildDirectoryManifest = async (
|
||||
entries: DirectoryFileEntry[]
|
||||
): Promise<DirectoryManifestEntry[]> => {
|
||||
return Promise.all(
|
||||
entries.map(async (entry) => ({
|
||||
...entry,
|
||||
checksum: await computeFileHash(entry.file),
|
||||
size: entry.file.size
|
||||
}))
|
||||
);
|
||||
};
|
||||
|
||||
const createMissingDirectories = async (diff: any) => {
|
||||
if (!knowledge) return {};
|
||||
|
||||
const directoryIdByPath: Record<string, string> = { ...(diff.directory_map || {}) };
|
||||
|
||||
for (const dirPath of diff.mkdir) {
|
||||
const segments = dirPath.split('/');
|
||||
const name = segments.at(-1)!;
|
||||
const parentPath = segments.slice(0, -1).join('/');
|
||||
const parentId = parentPath ? directoryIdByPath[parentPath] : null;
|
||||
|
||||
const directory = await createKnowledgeDirectory(
|
||||
localStorage.token,
|
||||
knowledge.id,
|
||||
name,
|
||||
parentId
|
||||
);
|
||||
if (directory) {
|
||||
directoryIdByPath[dirPath] = directory.id;
|
||||
}
|
||||
}
|
||||
|
||||
return directoryIdByPath;
|
||||
};
|
||||
|
||||
const getDirectoryUploadPath = (path: string) => {
|
||||
const currentPath = breadcrumbs.map((crumb) => crumb.name).join('/');
|
||||
return currentPath && path ? `${currentPath}/${path}` : currentPath || path;
|
||||
};
|
||||
|
||||
const uploadDirectoryEntries = async (entries: DirectoryFileEntry[]) => {
|
||||
if (!knowledge) return;
|
||||
|
||||
try {
|
||||
syncing = $i18n.t('Computing checksums ({{count}} files)', { count: entries.length });
|
||||
const manifest = await buildDirectoryManifest(entries);
|
||||
|
||||
syncing = $i18n.t('Comparing with knowledge base...');
|
||||
const diff = await syncKnowledgeDiff(
|
||||
localStorage.token,
|
||||
id,
|
||||
manifest.map(({ filename, path, checksum, size }) => ({
|
||||
filename,
|
||||
path: getDirectoryUploadPath(path),
|
||||
checksum,
|
||||
size
|
||||
}))
|
||||
);
|
||||
|
||||
if (!diff) {
|
||||
toast.error($i18n.t('Failed to compare files.'));
|
||||
return;
|
||||
}
|
||||
|
||||
const directoryIdByPath = await createMissingDirectories(diff);
|
||||
|
||||
let uploadedCount = 0;
|
||||
for (const entry of manifest) {
|
||||
uploadedCount++;
|
||||
const displayPath = entry.path ? `${entry.path}/${entry.filename}` : entry.filename;
|
||||
syncing = $i18n.t('Uploading {{current}}/{{total}}: {{file}}', {
|
||||
current: uploadedCount,
|
||||
total: manifest.length,
|
||||
file: displayPath
|
||||
});
|
||||
|
||||
const fileObject = new File([entry.file], entry.filename, { type: entry.file.type });
|
||||
await uploadFile(localStorage.token, fileObject, {
|
||||
knowledge_id: knowledge.id,
|
||||
file_hash: entry.checksum,
|
||||
directory_id: entry.path
|
||||
? directoryIdByPath[getDirectoryUploadPath(entry.path)]
|
||||
: currentDirectoryId
|
||||
}).catch((e) => {
|
||||
toast.error(`${e}`);
|
||||
return null;
|
||||
});
|
||||
}
|
||||
|
||||
toast.success($i18n.t('File uploaded successfully'));
|
||||
init();
|
||||
} catch (e) {
|
||||
toast.error(`${e}`);
|
||||
} finally {
|
||||
syncing = null;
|
||||
}
|
||||
};
|
||||
|
||||
// Incremental sync: hash locally → diff on server → upload only what changed
|
||||
const syncDirectoryHandler = async () => {
|
||||
if (!pendingSyncFiles?.length) return;
|
||||
@@ -721,13 +668,7 @@
|
||||
syncing = $i18n.t('Computing checksums ({{count}} files)', {
|
||||
count: pendingSyncFiles.length
|
||||
});
|
||||
const manifest = await Promise.all(
|
||||
pendingSyncFiles.map(async (entry) => ({
|
||||
...entry,
|
||||
checksum: await computeFileHash(entry.file),
|
||||
size: entry.file.size
|
||||
}))
|
||||
);
|
||||
const manifest = await buildDirectoryManifest(pendingSyncFiles);
|
||||
pendingSyncFiles = null;
|
||||
|
||||
// ── 3. Diff against knowledge base ──
|
||||
@@ -755,23 +696,7 @@
|
||||
}
|
||||
|
||||
// ── 5. mkdir — create missing directories (parents first) ──
|
||||
const directoryIdByPath: Record<string, string> = { ...(diff.directory_map || {}) };
|
||||
for (const dirPath of diff.mkdir) {
|
||||
const segments = dirPath.split('/');
|
||||
const name = segments.at(-1)!;
|
||||
const parentPath = segments.slice(0, -1).join('/');
|
||||
const parentId = parentPath ? directoryIdByPath[parentPath] : null;
|
||||
|
||||
const directory = await createKnowledgeDirectory(
|
||||
localStorage.token,
|
||||
knowledge.id,
|
||||
name,
|
||||
parentId
|
||||
);
|
||||
if (directory) {
|
||||
directoryIdByPath[dirPath] = directory.id;
|
||||
}
|
||||
}
|
||||
const directoryIdByPath = await createMissingDirectories(diff);
|
||||
|
||||
// ── 6. Upload added + modified files ──
|
||||
const filesToUpload = manifest.filter(
|
||||
@@ -1039,6 +964,53 @@
|
||||
}
|
||||
};
|
||||
|
||||
const readDirectoryEntries = async (reader: any) => {
|
||||
const entries: any[] = [];
|
||||
|
||||
while (true) {
|
||||
const batch = await new Promise<any[]>((resolve, reject) => {
|
||||
reader.readEntries(resolve, reject);
|
||||
});
|
||||
|
||||
if (batch.length === 0) {
|
||||
break;
|
||||
}
|
||||
|
||||
entries.push(...batch);
|
||||
}
|
||||
|
||||
return entries;
|
||||
};
|
||||
|
||||
const collectDroppedEntryFiles = async (
|
||||
entry: any,
|
||||
entryPath = entry.name
|
||||
): Promise<DirectoryFileEntry[]> => {
|
||||
if (entry.name.startsWith('.') || hasHiddenFolder(entryPath)) {
|
||||
return [];
|
||||
}
|
||||
|
||||
if (entry.isFile) {
|
||||
const file = await new Promise<File>((resolve, reject) => {
|
||||
entry.file(resolve, reject);
|
||||
});
|
||||
const parts = entryPath.split('/');
|
||||
const filename = parts.pop() || file.name;
|
||||
return [{ path: parts.join('/'), filename, file }];
|
||||
}
|
||||
|
||||
if (entry.isDirectory) {
|
||||
const reader = entry.createReader();
|
||||
const entries = await readDirectoryEntries(reader);
|
||||
const nested = await Promise.all(
|
||||
entries.map((child) => collectDroppedEntryFiles(child, `${entryPath}/${child.name}`))
|
||||
);
|
||||
return nested.flat();
|
||||
}
|
||||
|
||||
return [];
|
||||
};
|
||||
|
||||
const onDragOver = (e) => {
|
||||
e.preventDefault();
|
||||
|
||||
@@ -1063,40 +1035,35 @@
|
||||
return;
|
||||
}
|
||||
|
||||
const handleUploadingFileFolder = (items) => {
|
||||
for (const item of items) {
|
||||
if (item.isFile) {
|
||||
item.file((file) => {
|
||||
uploadFileHandler(file);
|
||||
});
|
||||
continue;
|
||||
}
|
||||
|
||||
// Not sure why you have to call webkitGetAsEntry and isDirectory seperate, but it won't work if you try item.webkitGetAsEntry().isDirectory
|
||||
const wkentry = item.webkitGetAsEntry();
|
||||
const isDirectory = wkentry.isDirectory;
|
||||
if (isDirectory) {
|
||||
// Read the directory
|
||||
wkentry.createReader().readEntries(
|
||||
(entries) => {
|
||||
handleUploadingFileFolder(entries);
|
||||
},
|
||||
(error) => {
|
||||
console.error('Error reading directory entries:', error);
|
||||
}
|
||||
);
|
||||
} else {
|
||||
uploadFileHandler(item.getAsFile());
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
if (e.dataTransfer?.types?.includes('Files')) {
|
||||
if (e.dataTransfer?.files) {
|
||||
const inputItems = e.dataTransfer?.items;
|
||||
|
||||
if (inputItems && inputItems.length > 0) {
|
||||
handleUploadingFileFolder(inputItems);
|
||||
const directoryEntries: DirectoryFileEntry[] = [];
|
||||
const looseFiles: File[] = [];
|
||||
|
||||
for (const rawItem of Array.from(inputItems)) {
|
||||
const item = rawItem as DataTransferItem & { webkitGetAsEntry?: () => any };
|
||||
const entry = item.webkitGetAsEntry?.();
|
||||
|
||||
if (entry?.isDirectory) {
|
||||
directoryEntries.push(...(await collectDroppedEntryFiles(entry)));
|
||||
} else {
|
||||
const file = item.getAsFile();
|
||||
if (file) {
|
||||
looseFiles.push(file);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for (const file of looseFiles) {
|
||||
await uploadFileHandler(file);
|
||||
}
|
||||
|
||||
if (directoryEntries.length > 0) {
|
||||
await uploadDirectoryEntries(directoryEntries);
|
||||
}
|
||||
} else {
|
||||
toast.error($i18n.t(`File not found.`));
|
||||
}
|
||||
|
||||
@@ -119,11 +119,15 @@
|
||||
return models
|
||||
.filter(
|
||||
(baseModel) =>
|
||||
(!currentModelId || baseModel.id !== currentModelId) &&
|
||||
!baseModel?.preset &&
|
||||
(!currentModelId ||
|
||||
baseModel.id !== currentModelId ||
|
||||
(edit && baseModel.id === info.base_model_id)) &&
|
||||
(!baseModel?.preset || (edit && baseModel.id === info.base_model_id)) &&
|
||||
baseModel?.owned_by !== 'arena' &&
|
||||
!(baseModel?.direct ?? false) &&
|
||||
(!(baseModel?.info?.meta?.hidden ?? false) || baseModel.id === info.base_model_id)
|
||||
($user?.role === 'admin' ||
|
||||
!(baseModel?.info?.meta?.hidden ?? false) ||
|
||||
baseModel.id === info.base_model_id)
|
||||
)
|
||||
.map((baseModel) => ({
|
||||
value: baseModel.id,
|
||||
@@ -332,14 +336,16 @@
|
||||
|
||||
if (model.base_model_id) {
|
||||
const base_model = $models
|
||||
.filter((m) => !m?.preset && !(m?.arena ?? false))
|
||||
.filter(
|
||||
(m) => (!m?.preset && !(m?.arena ?? false)) || (edit && m.id === model.base_model_id)
|
||||
)
|
||||
.find((m) => [model.base_model_id, `${model.base_model_id}:latest`].includes(m.id));
|
||||
|
||||
console.log('base_model', base_model);
|
||||
|
||||
if (base_model) {
|
||||
model.base_model_id = base_model.id;
|
||||
} else {
|
||||
} else if (!edit) {
|
||||
model.base_model_id = null;
|
||||
}
|
||||
}
|
||||
@@ -654,6 +660,7 @@
|
||||
className="w-[32rem]"
|
||||
triggerClassName="text-sm"
|
||||
selectionOnly
|
||||
includeHidden={$user?.role === 'admin'}
|
||||
bind:value={info.base_model_id}
|
||||
/>
|
||||
</div>
|
||||
|
||||
@@ -1309,6 +1309,7 @@
|
||||
"Jina API Key": "",
|
||||
"join our Discord for help.": "انضم إلى Discord للحصول على المساعدة.",
|
||||
"JSON": "JSON",
|
||||
"JSON Base64": "",
|
||||
"JSON Preview": "معاينة JSON",
|
||||
"JSON Spec": "",
|
||||
"July": "يوليو",
|
||||
@@ -1441,6 +1442,7 @@
|
||||
"Memory added successfully": "",
|
||||
"Memory cleared successfully": "",
|
||||
"Memory deleted successfully": "",
|
||||
"Memory System Context": "",
|
||||
"Memory updated successfully": "",
|
||||
"Merge Accounts by Email": "",
|
||||
"Merge Responses": "",
|
||||
@@ -1520,6 +1522,7 @@
|
||||
"More Options": "",
|
||||
"Move": "",
|
||||
"Moved {{name}}": "",
|
||||
"Multipart Upload": "",
|
||||
"Mute": "",
|
||||
"Muted": "",
|
||||
"My Terminal": "",
|
||||
@@ -1909,6 +1912,7 @@
|
||||
"Reply in Thread": "",
|
||||
"Reply to thread...": "",
|
||||
"Replying to {{NAME}}": "",
|
||||
"Request Format": "",
|
||||
"Require users to confirm before using Web Search.": "",
|
||||
"required": "",
|
||||
"Reranking Batch Size": "",
|
||||
@@ -2422,7 +2426,6 @@
|
||||
"Upload Pipeline": "",
|
||||
"Upload profile image": "",
|
||||
"Upload Progress": "جاري التحميل",
|
||||
"Upload Progress: {{uploadedFiles}}/{{totalFiles}} ({{percentage}}%)": "",
|
||||
"Uploaded files or images": "",
|
||||
"Uploading {{current}}/{{total}}: {{file}}": "",
|
||||
"Uploading...": "",
|
||||
|
||||
@@ -1309,6 +1309,7 @@
|
||||
"Jina API Key": "مفتاح API لـ Jina",
|
||||
"join our Discord for help.": "انضم إلى Discord للحصول على المساعدة.",
|
||||
"JSON": "JSON",
|
||||
"JSON Base64": "",
|
||||
"JSON Preview": "معاينة JSON",
|
||||
"JSON Spec": "",
|
||||
"July": "يوليو",
|
||||
@@ -1441,6 +1442,7 @@
|
||||
"Memory added successfully": "تم إضافة الذاكرة بنجاح",
|
||||
"Memory cleared successfully": "تم مسح الذاكرة بنجاح",
|
||||
"Memory deleted successfully": "تم حذف الذاكرة بنجاح",
|
||||
"Memory System Context": "",
|
||||
"Memory updated successfully": "تم تحديث الذاكرة بنجاح",
|
||||
"Merge Accounts by Email": "",
|
||||
"Merge Responses": "دمج الردود",
|
||||
@@ -1520,6 +1522,7 @@
|
||||
"More Options": "",
|
||||
"Move": "",
|
||||
"Moved {{name}}": "",
|
||||
"Multipart Upload": "",
|
||||
"Mute": "",
|
||||
"Muted": "",
|
||||
"My Terminal": "",
|
||||
@@ -1909,6 +1912,7 @@
|
||||
"Reply in Thread": "الرد داخل سلسلة الرسائل",
|
||||
"Reply to thread...": "",
|
||||
"Replying to {{NAME}}": "",
|
||||
"Request Format": "",
|
||||
"Require users to confirm before using Web Search.": "",
|
||||
"required": "",
|
||||
"Reranking Batch Size": "",
|
||||
@@ -2422,7 +2426,6 @@
|
||||
"Upload Pipeline": "رفع خط المعالجة",
|
||||
"Upload profile image": "",
|
||||
"Upload Progress": "جاري التحميل",
|
||||
"Upload Progress: {{uploadedFiles}}/{{totalFiles}} ({{percentage}}%)": "",
|
||||
"Uploaded files or images": "",
|
||||
"Uploading {{current}}/{{total}}: {{file}}": "",
|
||||
"Uploading...": "",
|
||||
|
||||
@@ -1281,6 +1281,7 @@
|
||||
"Jina API Key": "Jina API Açarı",
|
||||
"join our Discord for help.": "kömək üçün Discord kanalımıza qoşulun.",
|
||||
"JSON": "JSON",
|
||||
"JSON Base64": "",
|
||||
"JSON Preview": "JSON Önizləmə",
|
||||
"JSON Spec": "JSON Spesifikasiyası",
|
||||
"July": "İyul",
|
||||
@@ -1413,6 +1414,7 @@
|
||||
"Memory added successfully": "Yaddaş uğurla əlavə edildi",
|
||||
"Memory cleared successfully": "Yaddaş uğurla təmizləndi",
|
||||
"Memory deleted successfully": "Yaddaş uğurla silindi",
|
||||
"Memory System Context": "",
|
||||
"Memory updated successfully": "Yaddaş uğurla yeniləndi",
|
||||
"Merge Accounts by Email": "",
|
||||
"Merge Responses": "Cavabları birləşdir",
|
||||
@@ -1492,6 +1494,7 @@
|
||||
"More Options": "Daha Çox Seçim",
|
||||
"Move": "Köçür",
|
||||
"Moved {{name}}": "{{name}} köçürüldü",
|
||||
"Multipart Upload": "",
|
||||
"Mute": "",
|
||||
"Muted": "",
|
||||
"My Terminal": "Mənim Terminalım",
|
||||
@@ -1873,6 +1876,7 @@
|
||||
"Reply in Thread": "Mövzu daxilində cavabla",
|
||||
"Reply to thread...": "Mövzuya cavab yaz...",
|
||||
"Replying to {{NAME}}": "{{NAME}} adlı istifadəçiyə cavab verilir",
|
||||
"Request Format": "",
|
||||
"Require users to confirm before using Web Search.": "",
|
||||
"required": "tələb olunur",
|
||||
"Reranking Batch Size": "",
|
||||
@@ -2378,7 +2382,6 @@
|
||||
"Upload Pipeline": "Pipeline yüklə",
|
||||
"Upload profile image": "Profil şəklini yüklə",
|
||||
"Upload Progress": "Yükləmə vəziyyəti",
|
||||
"Upload Progress: {{uploadedFiles}}/{{totalFiles}} ({{percentage}}%)": "Yükləmə vəziyyəti: {{uploadedFiles}}/{{totalFiles}} ({{percentage}}%)",
|
||||
"Uploaded files or images": "Yüklənmiş fayllar və ya şəkillər",
|
||||
"Uploading {{current}}/{{total}}: {{file}}": "",
|
||||
"Uploading...": "Yüklənir...",
|
||||
|
||||
@@ -1281,6 +1281,7 @@
|
||||
"Jina API Key": "API ключ за Jina",
|
||||
"join our Discord for help.": "свържете се с нашия Discord за помощ.",
|
||||
"JSON": "JSON",
|
||||
"JSON Base64": "",
|
||||
"JSON Preview": "JSON Преглед",
|
||||
"JSON Spec": "",
|
||||
"July": "Юли",
|
||||
@@ -1413,6 +1414,7 @@
|
||||
"Memory added successfully": "Паметта е добавена успешно",
|
||||
"Memory cleared successfully": "Паметта е изчистена успешно",
|
||||
"Memory deleted successfully": "Паметта е изтрита успешно",
|
||||
"Memory System Context": "",
|
||||
"Memory updated successfully": "Паметта е актуализирана успешно",
|
||||
"Merge Accounts by Email": "",
|
||||
"Merge Responses": "Обединяване на отговори",
|
||||
@@ -1492,6 +1494,7 @@
|
||||
"More Options": "",
|
||||
"Move": "",
|
||||
"Moved {{name}}": "",
|
||||
"Multipart Upload": "",
|
||||
"Mute": "",
|
||||
"Muted": "",
|
||||
"My Terminal": "",
|
||||
@@ -1873,6 +1876,7 @@
|
||||
"Reply in Thread": "Отговори в тред",
|
||||
"Reply to thread...": "",
|
||||
"Replying to {{NAME}}": "",
|
||||
"Request Format": "",
|
||||
"Require users to confirm before using Web Search.": "",
|
||||
"required": "",
|
||||
"Reranking Batch Size": "",
|
||||
@@ -2378,7 +2382,6 @@
|
||||
"Upload Pipeline": "Качване на конвейер",
|
||||
"Upload profile image": "",
|
||||
"Upload Progress": "Прогрес на качването",
|
||||
"Upload Progress: {{uploadedFiles}}/{{totalFiles}} ({{percentage}}%)": "",
|
||||
"Uploaded files or images": "",
|
||||
"Uploading {{current}}/{{total}}: {{file}}": "",
|
||||
"Uploading...": "",
|
||||
|
||||
@@ -1281,6 +1281,7 @@
|
||||
"Jina API Key": "",
|
||||
"join our Discord for help.": "সাহায্যের জন্য আমাদের Discord-এ যুক্ত হোন",
|
||||
"JSON": "JSON",
|
||||
"JSON Base64": "",
|
||||
"JSON Preview": "JSON প্রিভিউ",
|
||||
"JSON Spec": "",
|
||||
"July": "জুলাই",
|
||||
@@ -1413,6 +1414,7 @@
|
||||
"Memory added successfully": "",
|
||||
"Memory cleared successfully": "",
|
||||
"Memory deleted successfully": "",
|
||||
"Memory System Context": "",
|
||||
"Memory updated successfully": "",
|
||||
"Merge Accounts by Email": "",
|
||||
"Merge Responses": "",
|
||||
@@ -1492,6 +1494,7 @@
|
||||
"More Options": "",
|
||||
"Move": "",
|
||||
"Moved {{name}}": "",
|
||||
"Multipart Upload": "",
|
||||
"Mute": "",
|
||||
"Muted": "",
|
||||
"My Terminal": "",
|
||||
@@ -1873,6 +1876,7 @@
|
||||
"Reply in Thread": "",
|
||||
"Reply to thread...": "",
|
||||
"Replying to {{NAME}}": "",
|
||||
"Request Format": "",
|
||||
"Require users to confirm before using Web Search.": "",
|
||||
"required": "",
|
||||
"Reranking Batch Size": "",
|
||||
@@ -2378,7 +2382,6 @@
|
||||
"Upload Pipeline": "",
|
||||
"Upload profile image": "",
|
||||
"Upload Progress": "আপলোড হচ্ছে",
|
||||
"Upload Progress: {{uploadedFiles}}/{{totalFiles}} ({{percentage}}%)": "",
|
||||
"Uploaded files or images": "",
|
||||
"Uploading {{current}}/{{total}}: {{file}}": "",
|
||||
"Uploading...": "",
|
||||
|
||||
@@ -1274,6 +1274,7 @@
|
||||
"Jina API Key": "Jina API ལྡེ་མིག",
|
||||
"join our Discord for help.": "རོགས་རམ་ཆེད་དུ་ང་ཚོའི་ Discord ལ་མཉམ་ཞུགས་བྱེད་པ།",
|
||||
"JSON": "JSON",
|
||||
"JSON Base64": "",
|
||||
"JSON Preview": "JSON སྔོན་ལྟ།",
|
||||
"JSON Spec": "",
|
||||
"July": "ཟླ་བ་བདུན་པ།",
|
||||
@@ -1406,6 +1407,7 @@
|
||||
"Memory added successfully": "དྲན་ཤེས་ལེགས་པར་བསྣན་ཟིན།",
|
||||
"Memory cleared successfully": "དྲན་ཤེས་ལེགས་པར་གཙང་སེལ་བྱས་ཟིན།",
|
||||
"Memory deleted successfully": "དྲན་ཤེས་ལེགས་པར་བསུབས་ཟིན།",
|
||||
"Memory System Context": "",
|
||||
"Memory updated successfully": "དྲན་ཤེས་ལེགས་པར་གསར་སྒྱུར་བྱས་ཟིན།",
|
||||
"Merge Accounts by Email": "",
|
||||
"Merge Responses": "ལན་ཟླ་སྒྲིལ།",
|
||||
@@ -1485,6 +1487,7 @@
|
||||
"More Options": "",
|
||||
"Move": "",
|
||||
"Moved {{name}}": "",
|
||||
"Multipart Upload": "",
|
||||
"Mute": "",
|
||||
"Muted": "",
|
||||
"My Terminal": "",
|
||||
@@ -1864,6 +1867,7 @@
|
||||
"Reply in Thread": "བརྗོད་གཞིའི་ནང་ལན་འདེབས།",
|
||||
"Reply to thread...": "",
|
||||
"Replying to {{NAME}}": "",
|
||||
"Request Format": "",
|
||||
"Require users to confirm before using Web Search.": "",
|
||||
"required": "",
|
||||
"Reranking Batch Size": "",
|
||||
@@ -2367,7 +2371,6 @@
|
||||
"Upload Pipeline": "རྒྱུ་ལམ་སྤར་བ།",
|
||||
"Upload profile image": "",
|
||||
"Upload Progress": "སྤར་བའི་འཕེལ་རིམ།",
|
||||
"Upload Progress: {{uploadedFiles}}/{{totalFiles}} ({{percentage}}%)": "",
|
||||
"Uploaded files or images": "",
|
||||
"Uploading {{current}}/{{total}}: {{file}}": "",
|
||||
"Uploading...": "",
|
||||
|
||||
@@ -1288,6 +1288,7 @@
|
||||
"Jina API Key": "",
|
||||
"join our Discord for help.": "pridružite se našem Discordu za pomoć.",
|
||||
"JSON": "JSON",
|
||||
"JSON Base64": "",
|
||||
"JSON Preview": "JSON pretpregled",
|
||||
"JSON Spec": "",
|
||||
"July": "Juli",
|
||||
@@ -1420,6 +1421,7 @@
|
||||
"Memory added successfully": "",
|
||||
"Memory cleared successfully": "",
|
||||
"Memory deleted successfully": "",
|
||||
"Memory System Context": "",
|
||||
"Memory updated successfully": "",
|
||||
"Merge Accounts by Email": "",
|
||||
"Merge Responses": "",
|
||||
@@ -1499,6 +1501,7 @@
|
||||
"More Options": "",
|
||||
"Move": "",
|
||||
"Moved {{name}}": "",
|
||||
"Multipart Upload": "",
|
||||
"Mute": "",
|
||||
"Muted": "",
|
||||
"My Terminal": "",
|
||||
@@ -1882,6 +1885,7 @@
|
||||
"Reply in Thread": "",
|
||||
"Reply to thread...": "",
|
||||
"Replying to {{NAME}}": "",
|
||||
"Request Format": "",
|
||||
"Require users to confirm before using Web Search.": "",
|
||||
"required": "",
|
||||
"Reranking Batch Size": "",
|
||||
@@ -2389,7 +2393,6 @@
|
||||
"Upload Pipeline": "Prijenos kanala",
|
||||
"Upload profile image": "",
|
||||
"Upload Progress": "Napredak učitavanja",
|
||||
"Upload Progress: {{uploadedFiles}}/{{totalFiles}} ({{percentage}}%)": "",
|
||||
"Uploaded files or images": "",
|
||||
"Uploading {{current}}/{{total}}: {{file}}": "",
|
||||
"Uploading...": "",
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1281,6 +1281,7 @@
|
||||
"Jina API Key": "",
|
||||
"join our Discord for help.": "Apil sa among Discord alang sa tabang.",
|
||||
"JSON": "JSON",
|
||||
"JSON Base64": "",
|
||||
"JSON Preview": "",
|
||||
"JSON Spec": "",
|
||||
"July": "",
|
||||
@@ -1413,6 +1414,7 @@
|
||||
"Memory added successfully": "",
|
||||
"Memory cleared successfully": "",
|
||||
"Memory deleted successfully": "",
|
||||
"Memory System Context": "",
|
||||
"Memory updated successfully": "",
|
||||
"Merge Accounts by Email": "",
|
||||
"Merge Responses": "",
|
||||
@@ -1492,6 +1494,7 @@
|
||||
"More Options": "",
|
||||
"Move": "",
|
||||
"Moved {{name}}": "",
|
||||
"Multipart Upload": "",
|
||||
"Mute": "",
|
||||
"Muted": "",
|
||||
"My Terminal": "",
|
||||
@@ -1873,6 +1876,7 @@
|
||||
"Reply in Thread": "",
|
||||
"Reply to thread...": "",
|
||||
"Replying to {{NAME}}": "",
|
||||
"Request Format": "",
|
||||
"Require users to confirm before using Web Search.": "",
|
||||
"required": "",
|
||||
"Reranking Batch Size": "",
|
||||
@@ -2378,7 +2382,6 @@
|
||||
"Upload Pipeline": "",
|
||||
"Upload profile image": "",
|
||||
"Upload Progress": "Pag-uswag sa Pag-upload",
|
||||
"Upload Progress: {{uploadedFiles}}/{{totalFiles}} ({{percentage}}%)": "",
|
||||
"Uploaded files or images": "",
|
||||
"Uploading {{current}}/{{total}}: {{file}}": "",
|
||||
"Uploading...": "",
|
||||
|
||||
@@ -1295,6 +1295,7 @@
|
||||
"Jina API Key": "API klíč pro Jina",
|
||||
"join our Discord for help.": "připojte se na náš Discord pro pomoc.",
|
||||
"JSON": "JSON",
|
||||
"JSON Base64": "",
|
||||
"JSON Preview": "Náhled JSON",
|
||||
"JSON Spec": "",
|
||||
"July": "Červenec",
|
||||
@@ -1427,6 +1428,7 @@
|
||||
"Memory added successfully": "Vzpomínka byla úspěšně přidána.",
|
||||
"Memory cleared successfully": "Paměť byla úspěšně vymazána.",
|
||||
"Memory deleted successfully": "Vzpomínka byla úspěšně smazána",
|
||||
"Memory System Context": "",
|
||||
"Memory updated successfully": "Vzpomínka byla úspěšně aktualizována",
|
||||
"Merge Accounts by Email": "",
|
||||
"Merge Responses": "Sloučit odpovědi",
|
||||
@@ -1506,6 +1508,7 @@
|
||||
"More Options": "Další možnosti",
|
||||
"Move": "Přesunout",
|
||||
"Moved {{name}}": "",
|
||||
"Multipart Upload": "",
|
||||
"Mute": "",
|
||||
"Muted": "",
|
||||
"My Terminal": "",
|
||||
@@ -1891,6 +1894,7 @@
|
||||
"Reply in Thread": "Odpovědět ve vlákně",
|
||||
"Reply to thread...": "",
|
||||
"Replying to {{NAME}}": "",
|
||||
"Request Format": "",
|
||||
"Require users to confirm before using Web Search.": "",
|
||||
"required": "",
|
||||
"Reranking Batch Size": "",
|
||||
@@ -2400,7 +2404,6 @@
|
||||
"Upload Pipeline": "Nahrát pipeline",
|
||||
"Upload profile image": "",
|
||||
"Upload Progress": "Průběh nahrávání",
|
||||
"Upload Progress: {{uploadedFiles}}/{{totalFiles}} ({{percentage}}%)": "Průběh nahrávání: {{uploadedFiles}}/{{totalFiles}} ({{percentage}}%)",
|
||||
"Uploaded files or images": "",
|
||||
"Uploading {{current}}/{{total}}: {{file}}": "",
|
||||
"Uploading...": "",
|
||||
|
||||
@@ -1281,6 +1281,7 @@
|
||||
"Jina API Key": "Jina API-nøgle",
|
||||
"join our Discord for help.": "tilslut dig vores Discord for at få hjælp.",
|
||||
"JSON": "JSON",
|
||||
"JSON Base64": "",
|
||||
"JSON Preview": "JSON-forhåndsvisning",
|
||||
"JSON Spec": "JSON spec",
|
||||
"July": "Juli",
|
||||
@@ -1413,6 +1414,7 @@
|
||||
"Memory added successfully": "Hukommelse tilføjet.",
|
||||
"Memory cleared successfully": "Hukommelse ryddet.",
|
||||
"Memory deleted successfully": "Hukommelse slettet.",
|
||||
"Memory System Context": "",
|
||||
"Memory updated successfully": "Hukommelse opdateret.",
|
||||
"Merge Accounts by Email": "",
|
||||
"Merge Responses": "Flet svar",
|
||||
@@ -1492,6 +1494,7 @@
|
||||
"More Options": "Flere muligheder",
|
||||
"Move": "Flyt",
|
||||
"Moved {{name}}": "",
|
||||
"Multipart Upload": "",
|
||||
"Mute": "",
|
||||
"Muted": "",
|
||||
"My Terminal": "",
|
||||
@@ -1873,6 +1876,7 @@
|
||||
"Reply in Thread": "Svar i tråd",
|
||||
"Reply to thread...": "Svar på tråd...",
|
||||
"Replying to {{NAME}}": "Svarer {{NAME}}",
|
||||
"Request Format": "",
|
||||
"Require users to confirm before using Web Search.": "",
|
||||
"required": "påkrævet",
|
||||
"Reranking Batch Size": "",
|
||||
@@ -2378,7 +2382,6 @@
|
||||
"Upload Pipeline": "Upload pipeline",
|
||||
"Upload profile image": "",
|
||||
"Upload Progress": "Uploadfremdrift",
|
||||
"Upload Progress: {{uploadedFiles}}/{{totalFiles}} ({{percentage}}%)": "Uploadfremdrift: {{uploadedFiles}}/{{totalFiles}} ({{percentage}}%)",
|
||||
"Uploaded files or images": "",
|
||||
"Uploading {{current}}/{{total}}: {{file}}": "",
|
||||
"Uploading...": "",
|
||||
|
||||
@@ -1281,6 +1281,7 @@
|
||||
"Jina API Key": "Jina-API-Schlüssel",
|
||||
"join our Discord for help.": "Treten Sie unserem Discord bei, um Hilfe zu erhalten.",
|
||||
"JSON": "JSON",
|
||||
"JSON Base64": "",
|
||||
"JSON Preview": "JSON-Vorschau",
|
||||
"JSON Spec": "JSON-Spezifikation",
|
||||
"July": "Juli",
|
||||
@@ -1413,6 +1414,7 @@
|
||||
"Memory added successfully": "Erinnerung erfolgreich hinzugefügt",
|
||||
"Memory cleared successfully": "Erinnerungen erfolgreich gelöscht",
|
||||
"Memory deleted successfully": "Erinnerung erfolgreich gelöscht",
|
||||
"Memory System Context": "",
|
||||
"Memory updated successfully": "Erinnerung erfolgreich aktualisiert",
|
||||
"Merge Accounts by Email": "Konten anhand der E-Mail-Adresse zusammenführen",
|
||||
"Merge Responses": "Antworten zusammenführen",
|
||||
@@ -1492,6 +1494,7 @@
|
||||
"More Options": "Mehr Optionen",
|
||||
"Move": "Verschieben",
|
||||
"Moved {{name}}": "{{name}} verschoben",
|
||||
"Multipart Upload": "",
|
||||
"Mute": "Stummschalten",
|
||||
"Muted": "Stumm",
|
||||
"My Terminal": "Meine Terminals",
|
||||
@@ -1873,6 +1876,7 @@
|
||||
"Reply in Thread": "Im Thread antworten",
|
||||
"Reply to thread...": "Im Thread antworten...",
|
||||
"Replying to {{NAME}}": "Antwort an {{NAME}}",
|
||||
"Request Format": "",
|
||||
"Require users to confirm before using Web Search.": "Benutzer müssen vor der Nutzung der Websuche bestätigen.",
|
||||
"required": "erforderlich",
|
||||
"Reranking Batch Size": "Reranking-Batch-Größe",
|
||||
@@ -2378,7 +2382,6 @@
|
||||
"Upload Pipeline": "Pipeline hochladen",
|
||||
"Upload profile image": "Profilbild hochladen",
|
||||
"Upload Progress": "Upload-Fortschritt",
|
||||
"Upload Progress: {{uploadedFiles}}/{{totalFiles}} ({{percentage}}%)": "Fortschritt: {{uploadedFiles}}/{{totalFiles}} ({{percentage}}%)",
|
||||
"Uploaded files or images": "Hochgeladene Dateien oder Bilder",
|
||||
"Uploading {{current}}/{{total}}: {{file}}": "Wird hochgeladen {{current}}/{{total}}: {{file}}",
|
||||
"Uploading...": "Lade hoch...",
|
||||
|
||||
@@ -1281,6 +1281,7 @@
|
||||
"Jina API Key": "",
|
||||
"join our Discord for help.": "join our Discord for help.",
|
||||
"JSON": "JSON",
|
||||
"JSON Base64": "",
|
||||
"JSON Preview": "",
|
||||
"JSON Spec": "",
|
||||
"July": "",
|
||||
@@ -1413,6 +1414,7 @@
|
||||
"Memory added successfully": "",
|
||||
"Memory cleared successfully": "",
|
||||
"Memory deleted successfully": "",
|
||||
"Memory System Context": "",
|
||||
"Memory updated successfully": "",
|
||||
"Merge Accounts by Email": "",
|
||||
"Merge Responses": "",
|
||||
@@ -1492,6 +1494,7 @@
|
||||
"More Options": "",
|
||||
"Move": "",
|
||||
"Moved {{name}}": "",
|
||||
"Multipart Upload": "",
|
||||
"Mute": "",
|
||||
"Muted": "",
|
||||
"My Terminal": "",
|
||||
@@ -1873,6 +1876,7 @@
|
||||
"Reply in Thread": "",
|
||||
"Reply to thread...": "",
|
||||
"Replying to {{NAME}}": "",
|
||||
"Request Format": "",
|
||||
"Require users to confirm before using Web Search.": "",
|
||||
"required": "",
|
||||
"Reranking Batch Size": "",
|
||||
@@ -2378,7 +2382,6 @@
|
||||
"Upload Pipeline": "",
|
||||
"Upload profile image": "",
|
||||
"Upload Progress": "Upload Progress much progress",
|
||||
"Upload Progress: {{uploadedFiles}}/{{totalFiles}} ({{percentage}}%)": "",
|
||||
"Uploaded files or images": "",
|
||||
"Uploading {{current}}/{{total}}: {{file}}": "",
|
||||
"Uploading...": "",
|
||||
|
||||
@@ -1281,6 +1281,7 @@
|
||||
"Jina API Key": "Κλειδί API Jina",
|
||||
"join our Discord for help.": "συμμετέχετε στο Discord μας για βοήθεια.",
|
||||
"JSON": "JSON",
|
||||
"JSON Base64": "",
|
||||
"JSON Preview": "Προεπισκόπηση JSON",
|
||||
"JSON Spec": "Προδιαγραφή JSON",
|
||||
"July": "Ιούλιος",
|
||||
@@ -1413,6 +1414,7 @@
|
||||
"Memory added successfully": "Η μνήμη προστέθηκε με επιτυχία",
|
||||
"Memory cleared successfully": "Η μνήμη καθαρίστηκε με επιτυχία",
|
||||
"Memory deleted successfully": "Η μνήμη διαγράφηκε με επιτυχία",
|
||||
"Memory System Context": "",
|
||||
"Memory updated successfully": "Η μνήμη ενημερώθηκε με επιτυχία",
|
||||
"Merge Accounts by Email": "",
|
||||
"Merge Responses": "Συγχώνευση Απαντήσεων",
|
||||
@@ -1492,6 +1494,7 @@
|
||||
"More Options": "",
|
||||
"Move": "Μετακίνηση",
|
||||
"Moved {{name}}": "",
|
||||
"Multipart Upload": "",
|
||||
"Mute": "",
|
||||
"Muted": "",
|
||||
"My Terminal": "",
|
||||
@@ -1873,6 +1876,7 @@
|
||||
"Reply in Thread": "Απάντηση στο Νήμα Συζήτησης",
|
||||
"Reply to thread...": "Απάντηση στο νήμα συζήτησης...",
|
||||
"Replying to {{NAME}}": "",
|
||||
"Request Format": "",
|
||||
"Require users to confirm before using Web Search.": "",
|
||||
"required": "απαιτείται",
|
||||
"Reranking Batch Size": "",
|
||||
@@ -2378,7 +2382,6 @@
|
||||
"Upload Pipeline": "Ανέβασμα Pipeline",
|
||||
"Upload profile image": "",
|
||||
"Upload Progress": "Πρόοδος Ανεβάσματος",
|
||||
"Upload Progress: {{uploadedFiles}}/{{totalFiles}} ({{percentage}}%)": "",
|
||||
"Uploaded files or images": "",
|
||||
"Uploading {{current}}/{{total}}: {{file}}": "",
|
||||
"Uploading...": "",
|
||||
|
||||
@@ -1281,6 +1281,7 @@
|
||||
"Jina API Key": "",
|
||||
"join our Discord for help.": "",
|
||||
"JSON": "",
|
||||
"JSON Base64": "",
|
||||
"JSON Preview": "",
|
||||
"JSON Spec": "",
|
||||
"July": "",
|
||||
@@ -1413,6 +1414,7 @@
|
||||
"Memory added successfully": "",
|
||||
"Memory cleared successfully": "",
|
||||
"Memory deleted successfully": "",
|
||||
"Memory System Context": "",
|
||||
"Memory updated successfully": "",
|
||||
"Merge Accounts by Email": "",
|
||||
"Merge Responses": "",
|
||||
@@ -1492,6 +1494,7 @@
|
||||
"More Options": "",
|
||||
"Move": "",
|
||||
"Moved {{name}}": "",
|
||||
"Multipart Upload": "",
|
||||
"Mute": "",
|
||||
"Muted": "",
|
||||
"My Terminal": "",
|
||||
@@ -1873,6 +1876,7 @@
|
||||
"Reply in Thread": "",
|
||||
"Reply to thread...": "",
|
||||
"Replying to {{NAME}}": "",
|
||||
"Request Format": "",
|
||||
"Require users to confirm before using Web Search.": "",
|
||||
"required": "",
|
||||
"Reranking Batch Size": "",
|
||||
@@ -2378,7 +2382,6 @@
|
||||
"Upload Pipeline": "",
|
||||
"Upload profile image": "",
|
||||
"Upload Progress": "",
|
||||
"Upload Progress: {{uploadedFiles}}/{{totalFiles}} ({{percentage}}%)": "",
|
||||
"Uploaded files or images": "",
|
||||
"Uploading {{current}}/{{total}}: {{file}}": "",
|
||||
"Uploading...": "",
|
||||
|
||||
@@ -1281,6 +1281,7 @@
|
||||
"Jina API Key": "",
|
||||
"join our Discord for help.": "",
|
||||
"JSON": "",
|
||||
"JSON Base64": "",
|
||||
"JSON Preview": "",
|
||||
"JSON Spec": "",
|
||||
"July": "",
|
||||
@@ -1413,6 +1414,7 @@
|
||||
"Memory added successfully": "",
|
||||
"Memory cleared successfully": "",
|
||||
"Memory deleted successfully": "",
|
||||
"Memory System Context": "",
|
||||
"Memory updated successfully": "",
|
||||
"Merge Accounts by Email": "",
|
||||
"Merge Responses": "",
|
||||
@@ -1492,6 +1494,7 @@
|
||||
"More Options": "",
|
||||
"Move": "",
|
||||
"Moved {{name}}": "",
|
||||
"Multipart Upload": "",
|
||||
"Mute": "",
|
||||
"Muted": "",
|
||||
"My Terminal": "",
|
||||
@@ -1873,6 +1876,7 @@
|
||||
"Reply in Thread": "",
|
||||
"Reply to thread...": "",
|
||||
"Replying to {{NAME}}": "",
|
||||
"Request Format": "",
|
||||
"Require users to confirm before using Web Search.": "",
|
||||
"required": "",
|
||||
"Reranking Batch Size": "",
|
||||
@@ -2378,7 +2382,6 @@
|
||||
"Upload Pipeline": "",
|
||||
"Upload profile image": "",
|
||||
"Upload Progress": "",
|
||||
"Upload Progress: {{uploadedFiles}}/{{totalFiles}} ({{percentage}}%)": "",
|
||||
"Uploaded files or images": "",
|
||||
"Uploading {{current}}/{{total}}: {{file}}": "",
|
||||
"Uploading...": "",
|
||||
|
||||
@@ -38,11 +38,11 @@
|
||||
"{{count}} users_many": "",
|
||||
"{{count}} users_other": "",
|
||||
"{{COUNT}} words": "{{COUNT}} palabras",
|
||||
"{{COUNT}}d_time_ago": "hace_{{COUNT}}d",
|
||||
"{{COUNT}}h_time_ago": "hace_{{COUNT}}h",
|
||||
"{{COUNT}}m_time_ago": "hace_{{COUNT}}m",
|
||||
"{{COUNT}}w_time_ago": "hace_{{COUNT}}s",
|
||||
"{{COUNT}}y_time_ago": "hace_{{COUNT}}a",
|
||||
"{{COUNT}}d_time_ago": "hace {{COUNT}} d",
|
||||
"{{COUNT}}h_time_ago": "hace {{COUNT}} h",
|
||||
"{{COUNT}}m_time_ago": "hace {{COUNT}} min",
|
||||
"{{COUNT}}w_time_ago": "hace {{COUNT}} sem",
|
||||
"{{COUNT}}y_time_ago": "hace {{COUNT}} a",
|
||||
"{{label}} contains invalid JSON": "",
|
||||
"{{label}} must be a JSON object": "",
|
||||
"{{LOCALIZED_DATE}} at {{LOCALIZED_TIME}}": "{{LOCALIZED_DATE}} a las {{LOCALIZED_TIME}}",
|
||||
@@ -58,7 +58,7 @@
|
||||
"1 user": "",
|
||||
"10 minutes before": "hace 10 minutos",
|
||||
"15 minutes before": "hace 15 minutos",
|
||||
"1m_time_ago": "hace_1m",
|
||||
"1m_time_ago": "hace 1 min",
|
||||
"30 minutes before": "hace 30 minutos",
|
||||
"5 minutes before": "hace 5 minutos",
|
||||
"A collaboration channel where people join as members": "Canal colaborativo donde la gente se une como miembro",
|
||||
@@ -1288,6 +1288,7 @@
|
||||
"Jina API Key": "Clave API de Jina",
|
||||
"join our Discord for help.": "unete a nuestro Discord para ayuda.",
|
||||
"JSON": "JSON",
|
||||
"JSON Base64": "",
|
||||
"JSON Preview": "Prevista del JSON",
|
||||
"JSON Spec": "Especif. JSON",
|
||||
"July": "Julio",
|
||||
@@ -1420,6 +1421,7 @@
|
||||
"Memory added successfully": "Memoria añadida correctamente",
|
||||
"Memory cleared successfully": "Memoria liberada correctamente",
|
||||
"Memory deleted successfully": "Memoria borrada correctamente",
|
||||
"Memory System Context": "",
|
||||
"Memory updated successfully": "Memoria actualizada correctamente",
|
||||
"Merge Accounts by Email": "",
|
||||
"Merge Responses": "Fusionar Respuestas",
|
||||
@@ -1499,6 +1501,7 @@
|
||||
"More Options": "Más Opciones",
|
||||
"Move": "Mover",
|
||||
"Moved {{name}}": "Movido {{name}}:",
|
||||
"Multipart Upload": "",
|
||||
"Mute": "Silenciar",
|
||||
"Muted": "Silenciado",
|
||||
"My Terminal": "Mi Terminal",
|
||||
@@ -1882,6 +1885,7 @@
|
||||
"Reply in Thread": "Responder en Hilo",
|
||||
"Reply to thread...": "Responder al hilo...",
|
||||
"Replying to {{NAME}}": "Responder a {{NAME}}",
|
||||
"Request Format": "",
|
||||
"Require users to confirm before using Web Search.": "",
|
||||
"required": "requerido",
|
||||
"Reranking Batch Size": "Tamaño del lote de Reclasificación",
|
||||
@@ -2389,7 +2393,6 @@
|
||||
"Upload Pipeline": "Subir Tubería",
|
||||
"Upload profile image": "Subir imagen del perfil",
|
||||
"Upload Progress": "Progreso de la Subida",
|
||||
"Upload Progress: {{uploadedFiles}}/{{totalFiles}} ({{percentage}}%)": "Progreso de la Subida: {{uploadedFiles}}/{{totalFiles}} ({{percentage}}%)",
|
||||
"Uploaded files or images": "Archivos o imágenes subidos",
|
||||
"Uploading {{current}}/{{total}}: {{file}}": "Subiendo {{current}}/{{total}}: {{file}}",
|
||||
"Uploading...": "Subiendo...",
|
||||
|
||||
@@ -1281,6 +1281,7 @@
|
||||
"Jina API Key": "Jina API võti",
|
||||
"join our Discord for help.": "liituge abi saamiseks meie Discordiga.",
|
||||
"JSON": "JSON",
|
||||
"JSON Base64": "",
|
||||
"JSON Preview": "JSON eelvaade",
|
||||
"JSON Spec": "JSON spetsifikatsioon",
|
||||
"July": "Juuli",
|
||||
@@ -1413,6 +1414,7 @@
|
||||
"Memory added successfully": "Mälu edukalt lisatud",
|
||||
"Memory cleared successfully": "Mälu edukalt tühjendatud",
|
||||
"Memory deleted successfully": "Mälu edukalt kustutatud",
|
||||
"Memory System Context": "",
|
||||
"Memory updated successfully": "Mälu edukalt uuendatud",
|
||||
"Merge Accounts by Email": "",
|
||||
"Merge Responses": "Ühenda vastused",
|
||||
@@ -1492,6 +1494,7 @@
|
||||
"More Options": "Rohkem valikuid",
|
||||
"Move": "Teisalda",
|
||||
"Moved {{name}}": "Teisaldatud {{name}}",
|
||||
"Multipart Upload": "",
|
||||
"Mute": "",
|
||||
"Muted": "",
|
||||
"My Terminal": "Minu terminal",
|
||||
@@ -1873,6 +1876,7 @@
|
||||
"Reply in Thread": "Vasta lõimes",
|
||||
"Reply to thread...": "Vasta lõimele...",
|
||||
"Replying to {{NAME}}": "Vastamine kasutajale {{NAME}}",
|
||||
"Request Format": "",
|
||||
"Require users to confirm before using Web Search.": "",
|
||||
"required": "nõutav",
|
||||
"Reranking Batch Size": "",
|
||||
@@ -2378,7 +2382,6 @@
|
||||
"Upload Pipeline": "Laadi torustik üles",
|
||||
"Upload profile image": "Laadi üles profiilipilt",
|
||||
"Upload Progress": "Üleslaadimise progress",
|
||||
"Upload Progress: {{uploadedFiles}}/{{totalFiles}} ({{percentage}}%)": "Üleslaadimise edenemine: {{uploadedFiles}}/{{totalFiles}} ({{percentage}}%)",
|
||||
"Uploaded files or images": "Üleslaaditud failid või pildid",
|
||||
"Uploading {{current}}/{{total}}: {{file}}": "",
|
||||
"Uploading...": "Üleslaadimine...",
|
||||
|
||||
@@ -1281,6 +1281,7 @@
|
||||
"Jina API Key": "Jina API Gakoa",
|
||||
"join our Discord for help.": "batu gure Discord-era laguntzarako.",
|
||||
"JSON": "JSON",
|
||||
"JSON Base64": "",
|
||||
"JSON Preview": "JSON Aurrebista",
|
||||
"JSON Spec": "",
|
||||
"July": "Uztaila",
|
||||
@@ -1413,6 +1414,7 @@
|
||||
"Memory added successfully": "Memoria ongi gehitu da",
|
||||
"Memory cleared successfully": "Memoria ongi garbitu da",
|
||||
"Memory deleted successfully": "Memoria ongi ezabatu da",
|
||||
"Memory System Context": "",
|
||||
"Memory updated successfully": "Memoria ongi eguneratu da",
|
||||
"Merge Accounts by Email": "",
|
||||
"Merge Responses": "Batu erantzunak",
|
||||
@@ -1492,6 +1494,7 @@
|
||||
"More Options": "",
|
||||
"Move": "",
|
||||
"Moved {{name}}": "",
|
||||
"Multipart Upload": "",
|
||||
"Mute": "",
|
||||
"Muted": "",
|
||||
"My Terminal": "",
|
||||
@@ -1873,6 +1876,7 @@
|
||||
"Reply in Thread": "",
|
||||
"Reply to thread...": "",
|
||||
"Replying to {{NAME}}": "",
|
||||
"Request Format": "",
|
||||
"Require users to confirm before using Web Search.": "",
|
||||
"required": "",
|
||||
"Reranking Batch Size": "",
|
||||
@@ -2378,7 +2382,6 @@
|
||||
"Upload Pipeline": "Kargatu Pipeline-a",
|
||||
"Upload profile image": "",
|
||||
"Upload Progress": "Kargaren aurrerapena",
|
||||
"Upload Progress: {{uploadedFiles}}/{{totalFiles}} ({{percentage}}%)": "",
|
||||
"Uploaded files or images": "",
|
||||
"Uploading {{current}}/{{total}}: {{file}}": "",
|
||||
"Uploading...": "",
|
||||
|
||||
@@ -1281,6 +1281,7 @@
|
||||
"Jina API Key": "کلید API جینا",
|
||||
"join our Discord for help.": "برای کمک به دیسکورد ما بپیوندید.",
|
||||
"JSON": "JSON",
|
||||
"JSON Base64": "",
|
||||
"JSON Preview": "پیش نمایش JSON",
|
||||
"JSON Spec": "مشخصات JSON",
|
||||
"July": "ژوئن",
|
||||
@@ -1413,6 +1414,7 @@
|
||||
"Memory added successfully": "حافظه با موفقیت اضافه شد",
|
||||
"Memory cleared successfully": "حافظه با موفقیت پاک شد",
|
||||
"Memory deleted successfully": "حافظه با موفقیت حذف شد",
|
||||
"Memory System Context": "",
|
||||
"Memory updated successfully": "حافظه با موفقیت به\u200cروز شد",
|
||||
"Merge Accounts by Email": "",
|
||||
"Merge Responses": "ادغام پاسخ\u200cها",
|
||||
@@ -1492,6 +1494,7 @@
|
||||
"More Options": "گزینه\u200cهای بیشتر",
|
||||
"Move": "انتقال",
|
||||
"Moved {{name}}": "",
|
||||
"Multipart Upload": "",
|
||||
"Mute": "",
|
||||
"Muted": "",
|
||||
"My Terminal": "",
|
||||
@@ -1873,6 +1876,7 @@
|
||||
"Reply in Thread": "پاسخ در رشته",
|
||||
"Reply to thread...": "پاسخ به رشته...",
|
||||
"Replying to {{NAME}}": "در حال پاسخ به {{NAME}}",
|
||||
"Request Format": "",
|
||||
"Require users to confirm before using Web Search.": "",
|
||||
"required": "مورد نیاز",
|
||||
"Reranking Batch Size": "",
|
||||
@@ -2378,7 +2382,6 @@
|
||||
"Upload Pipeline": "خط تولید آپلود",
|
||||
"Upload profile image": "",
|
||||
"Upload Progress": "پیشرفت آپلود",
|
||||
"Upload Progress: {{uploadedFiles}}/{{totalFiles}} ({{percentage}}%)": "پیشرفت آپلود: {{uploadedFiles}}/{{totalFiles}} ({{percentage}}٪)",
|
||||
"Uploaded files or images": "",
|
||||
"Uploading {{current}}/{{total}}: {{file}}": "",
|
||||
"Uploading...": "",
|
||||
|
||||
@@ -1281,6 +1281,7 @@
|
||||
"Jina API Key": "Jina API -avain",
|
||||
"join our Discord for help.": "liity Discordiimme saadaksesi apua.",
|
||||
"JSON": "JSON",
|
||||
"JSON Base64": "",
|
||||
"JSON Preview": "JSON-esikatselu",
|
||||
"JSON Spec": "JSON Spec",
|
||||
"July": "heinäkuu",
|
||||
@@ -1413,6 +1414,7 @@
|
||||
"Memory added successfully": "Muisti lisätty onnistuneesti",
|
||||
"Memory cleared successfully": "Muisti tyhjennetty onnistuneesti",
|
||||
"Memory deleted successfully": "Muisti poistettu onnistuneesti",
|
||||
"Memory System Context": "",
|
||||
"Memory updated successfully": "Muisti päivitetty onnistuneesti",
|
||||
"Merge Accounts by Email": "",
|
||||
"Merge Responses": "Yhdistä vastaukset",
|
||||
@@ -1492,6 +1494,7 @@
|
||||
"More Options": "Lisää vaihtoehtoja",
|
||||
"Move": "Siirrä",
|
||||
"Moved {{name}}": "Siirretty {{name}}",
|
||||
"Multipart Upload": "",
|
||||
"Mute": "Mykistä",
|
||||
"Muted": "Mykistetty",
|
||||
"My Terminal": "Minun pääte",
|
||||
@@ -1873,6 +1876,7 @@
|
||||
"Reply in Thread": "Vastaa ketjussa",
|
||||
"Reply to thread...": "Vastaa ketjussa...",
|
||||
"Replying to {{NAME}}": "Vastaa {{NAME}}",
|
||||
"Request Format": "",
|
||||
"Require users to confirm before using Web Search.": "",
|
||||
"required": "vaaditaan",
|
||||
"Reranking Batch Size": "Uudelleenpisteytyksen eräkoko",
|
||||
@@ -2378,7 +2382,6 @@
|
||||
"Upload Pipeline": "Lataa putki",
|
||||
"Upload profile image": "Lataa profiilikuva",
|
||||
"Upload Progress": "Latauksen edistyminen",
|
||||
"Upload Progress: {{uploadedFiles}}/{{totalFiles}} ({{percentage}}%)": "Latauksen edistyminen: {{uploadedFiles}}/{{totalFiles}} ({{percentage}}%)",
|
||||
"Uploaded files or images": "Ladatut tiedostot tai kuvat",
|
||||
"Uploading {{current}}/{{total}}: {{file}}": "Ladataan {{current}}/{{total}}: {{file}}",
|
||||
"Uploading...": "Ladataan...",
|
||||
|
||||
@@ -1282,6 +1282,7 @@
|
||||
"Jina API Key": "",
|
||||
"join our Discord for help.": "",
|
||||
"JSON": "",
|
||||
"JSON Base64": "",
|
||||
"JSON Preview": "",
|
||||
"JSON Spec": "",
|
||||
"July": "Hulyo",
|
||||
@@ -1414,6 +1415,7 @@
|
||||
"Memory added successfully": "",
|
||||
"Memory cleared successfully": "",
|
||||
"Memory deleted successfully": "",
|
||||
"Memory System Context": "",
|
||||
"Memory updated successfully": "",
|
||||
"Merge Accounts by Email": "",
|
||||
"Merge Responses": "",
|
||||
@@ -1493,6 +1495,7 @@
|
||||
"More Options": "Higit pang Mga Opsyon",
|
||||
"Move": "Ilipat",
|
||||
"Moved {{name}}": "",
|
||||
"Multipart Upload": "",
|
||||
"Mute": "",
|
||||
"Muted": "",
|
||||
"My Terminal": "",
|
||||
@@ -1874,6 +1877,7 @@
|
||||
"Reply in Thread": "Sumagot sa Thread",
|
||||
"Reply to thread...": "",
|
||||
"Replying to {{NAME}}": "",
|
||||
"Request Format": "",
|
||||
"Require users to confirm before using Web Search.": "",
|
||||
"required": "",
|
||||
"Reranking Batch Size": "",
|
||||
@@ -2381,7 +2385,6 @@
|
||||
"Upload Pipeline": "",
|
||||
"Upload profile image": "",
|
||||
"Upload Progress": "",
|
||||
"Upload Progress: {{uploadedFiles}}/{{totalFiles}} ({{percentage}}%)": "",
|
||||
"Uploaded files or images": "",
|
||||
"Uploading {{current}}/{{total}}: {{file}}": "",
|
||||
"Uploading...": "",
|
||||
|
||||
@@ -1288,6 +1288,7 @@
|
||||
"Jina API Key": "Clé API Jina",
|
||||
"join our Discord for help.": "Rejoignez notre Discord pour obtenir de l'aide.",
|
||||
"JSON": "JSON",
|
||||
"JSON Base64": "",
|
||||
"JSON Preview": "Aperçu JSON",
|
||||
"JSON Spec": "",
|
||||
"July": "Juillet",
|
||||
@@ -1420,6 +1421,7 @@
|
||||
"Memory added successfully": "Souvenir ajoutée avec succès",
|
||||
"Memory cleared successfully": "La mémoire a été effacée avec succès",
|
||||
"Memory deleted successfully": "Le souvenir a été supprimé avec succès",
|
||||
"Memory System Context": "",
|
||||
"Memory updated successfully": "Le souvenir a été mis à jour avec succès",
|
||||
"Merge Accounts by Email": "",
|
||||
"Merge Responses": "Fusionner les réponses",
|
||||
@@ -1499,6 +1501,7 @@
|
||||
"More Options": "",
|
||||
"Move": "",
|
||||
"Moved {{name}}": "",
|
||||
"Multipart Upload": "",
|
||||
"Mute": "",
|
||||
"Muted": "",
|
||||
"My Terminal": "",
|
||||
@@ -1882,6 +1885,7 @@
|
||||
"Reply in Thread": "Répondre dans le fil de discussion",
|
||||
"Reply to thread...": "",
|
||||
"Replying to {{NAME}}": "",
|
||||
"Request Format": "",
|
||||
"Require users to confirm before using Web Search.": "",
|
||||
"required": "",
|
||||
"Reranking Batch Size": "",
|
||||
@@ -2389,7 +2393,6 @@
|
||||
"Upload Pipeline": "Pipeline de téléchargement",
|
||||
"Upload profile image": "",
|
||||
"Upload Progress": "Progression de l'envoi",
|
||||
"Upload Progress: {{uploadedFiles}}/{{totalFiles}} ({{percentage}}%)": "",
|
||||
"Uploaded files or images": "",
|
||||
"Uploading {{current}}/{{total}}: {{file}}": "",
|
||||
"Uploading...": "",
|
||||
|
||||
@@ -1288,6 +1288,7 @@
|
||||
"Jina API Key": "Clé API Jina",
|
||||
"join our Discord for help.": "Rejoignez notre Discord pour obtenir de l'aide.",
|
||||
"JSON": "JSON",
|
||||
"JSON Base64": "",
|
||||
"JSON Preview": "Aperçu JSON",
|
||||
"JSON Spec": "Spécification JSON",
|
||||
"July": "Juillet",
|
||||
@@ -1420,6 +1421,7 @@
|
||||
"Memory added successfully": "Souvenir ajouté avec succès",
|
||||
"Memory cleared successfully": "Souvenir effacé avec succès",
|
||||
"Memory deleted successfully": "Souvenir supprimé avec succès",
|
||||
"Memory System Context": "",
|
||||
"Memory updated successfully": "Souvenir mis à jour avec succès",
|
||||
"Merge Accounts by Email": "",
|
||||
"Merge Responses": "Fusionner les réponses",
|
||||
@@ -1499,6 +1501,7 @@
|
||||
"More Options": "Plus d'options",
|
||||
"Move": "Déplacer",
|
||||
"Moved {{name}}": "{{name}} déplacé",
|
||||
"Multipart Upload": "",
|
||||
"Mute": "Désactiver le son",
|
||||
"Muted": "Son désactivé",
|
||||
"My Terminal": "Mon terminal",
|
||||
@@ -1882,6 +1885,7 @@
|
||||
"Reply in Thread": "Répondre dans le fil de discussion",
|
||||
"Reply to thread...": "Répondre au fil de discussion...",
|
||||
"Replying to {{NAME}}": "En réponse à {{NAME}}",
|
||||
"Request Format": "",
|
||||
"Require users to confirm before using Web Search.": "",
|
||||
"required": "requis",
|
||||
"Reranking Batch Size": "",
|
||||
@@ -2389,7 +2393,6 @@
|
||||
"Upload Pipeline": "Pipeline de téléchargement",
|
||||
"Upload profile image": "Téléverser une image de profil",
|
||||
"Upload Progress": "Progression de l'envoi",
|
||||
"Upload Progress: {{uploadedFiles}}/{{totalFiles}} ({{percentage}}%)": "Progression du téléchargement\u00a0: {{uploadedFiles}}/{{totalFiles}} ({{percentage}}%)",
|
||||
"Uploaded files or images": "Les fichiers ou images téléversés",
|
||||
"Uploading {{current}}/{{total}}: {{file}}": "",
|
||||
"Uploading...": "Téléversement en cours...",
|
||||
|
||||
@@ -1281,6 +1281,7 @@
|
||||
"Jina API Key": "chave API de Jina",
|
||||
"join our Discord for help.": "Únase o noso Discord para obter axuda.",
|
||||
"JSON": "JSON",
|
||||
"JSON Base64": "",
|
||||
"JSON Preview": "Vista previa de JSON",
|
||||
"JSON Spec": "",
|
||||
"July": "Xullo",
|
||||
@@ -1413,6 +1414,7 @@
|
||||
"Memory added successfully": "Memoria añadida correctamente",
|
||||
"Memory cleared successfully": "Memoria liberada correctamente",
|
||||
"Memory deleted successfully": "Memoria borrada correctamente",
|
||||
"Memory System Context": "",
|
||||
"Memory updated successfully": "Memoria actualizada correctamente",
|
||||
"Merge Accounts by Email": "",
|
||||
"Merge Responses": "Fusionar Respuestas",
|
||||
@@ -1492,6 +1494,7 @@
|
||||
"More Options": "",
|
||||
"Move": "",
|
||||
"Moved {{name}}": "",
|
||||
"Multipart Upload": "",
|
||||
"Mute": "",
|
||||
"Muted": "",
|
||||
"My Terminal": "",
|
||||
@@ -1873,6 +1876,7 @@
|
||||
"Reply in Thread": "Responder no hilo",
|
||||
"Reply to thread...": "",
|
||||
"Replying to {{NAME}}": "",
|
||||
"Request Format": "",
|
||||
"Require users to confirm before using Web Search.": "",
|
||||
"required": "",
|
||||
"Reranking Batch Size": "",
|
||||
@@ -2378,7 +2382,6 @@
|
||||
"Upload Pipeline": "Subir Pipeline",
|
||||
"Upload profile image": "",
|
||||
"Upload Progress": "Progreso de carga",
|
||||
"Upload Progress: {{uploadedFiles}}/{{totalFiles}} ({{percentage}}%)": "",
|
||||
"Uploaded files or images": "",
|
||||
"Uploading {{current}}/{{total}}: {{file}}": "",
|
||||
"Uploading...": "",
|
||||
|
||||
@@ -1288,6 +1288,7 @@
|
||||
"Jina API Key": "",
|
||||
"join our Discord for help.": "הצטרף ל-Discord שלנו לעזרה.",
|
||||
"JSON": "JSON",
|
||||
"JSON Base64": "",
|
||||
"JSON Preview": "תצוגה מקדימה של JSON",
|
||||
"JSON Spec": "",
|
||||
"July": "יולי",
|
||||
@@ -1420,6 +1421,7 @@
|
||||
"Memory added successfully": "",
|
||||
"Memory cleared successfully": "",
|
||||
"Memory deleted successfully": "",
|
||||
"Memory System Context": "",
|
||||
"Memory updated successfully": "",
|
||||
"Merge Accounts by Email": "",
|
||||
"Merge Responses": "",
|
||||
@@ -1499,6 +1501,7 @@
|
||||
"More Options": "",
|
||||
"Move": "",
|
||||
"Moved {{name}}": "",
|
||||
"Multipart Upload": "",
|
||||
"Mute": "",
|
||||
"Muted": "",
|
||||
"My Terminal": "",
|
||||
@@ -1882,6 +1885,7 @@
|
||||
"Reply in Thread": "",
|
||||
"Reply to thread...": "",
|
||||
"Replying to {{NAME}}": "",
|
||||
"Request Format": "",
|
||||
"Require users to confirm before using Web Search.": "",
|
||||
"required": "",
|
||||
"Reranking Batch Size": "",
|
||||
@@ -2389,7 +2393,6 @@
|
||||
"Upload Pipeline": "",
|
||||
"Upload profile image": "",
|
||||
"Upload Progress": "תקדמות העלאה",
|
||||
"Upload Progress: {{uploadedFiles}}/{{totalFiles}} ({{percentage}}%)": "",
|
||||
"Uploaded files or images": "",
|
||||
"Uploading {{current}}/{{total}}: {{file}}": "",
|
||||
"Uploading...": "",
|
||||
|
||||
@@ -1281,6 +1281,7 @@
|
||||
"Jina API Key": "",
|
||||
"join our Discord for help.": "मदद के लिए हमारे डिस्कोर्ड में शामिल हों।",
|
||||
"JSON": "JSON",
|
||||
"JSON Base64": "",
|
||||
"JSON Preview": "JSON पूर्वावलोकन",
|
||||
"JSON Spec": "",
|
||||
"July": "जुलाई",
|
||||
@@ -1413,6 +1414,7 @@
|
||||
"Memory added successfully": "",
|
||||
"Memory cleared successfully": "",
|
||||
"Memory deleted successfully": "",
|
||||
"Memory System Context": "",
|
||||
"Memory updated successfully": "",
|
||||
"Merge Accounts by Email": "",
|
||||
"Merge Responses": "",
|
||||
@@ -1492,6 +1494,7 @@
|
||||
"More Options": "",
|
||||
"Move": "",
|
||||
"Moved {{name}}": "",
|
||||
"Multipart Upload": "",
|
||||
"Mute": "",
|
||||
"Muted": "",
|
||||
"My Terminal": "",
|
||||
@@ -1873,6 +1876,7 @@
|
||||
"Reply in Thread": "",
|
||||
"Reply to thread...": "",
|
||||
"Replying to {{NAME}}": "",
|
||||
"Request Format": "",
|
||||
"Require users to confirm before using Web Search.": "",
|
||||
"required": "",
|
||||
"Reranking Batch Size": "",
|
||||
@@ -2378,7 +2382,6 @@
|
||||
"Upload Pipeline": "",
|
||||
"Upload profile image": "",
|
||||
"Upload Progress": "प्रगति अपलोड करें",
|
||||
"Upload Progress: {{uploadedFiles}}/{{totalFiles}} ({{percentage}}%)": "",
|
||||
"Uploaded files or images": "",
|
||||
"Uploading {{current}}/{{total}}: {{file}}": "",
|
||||
"Uploading...": "",
|
||||
|
||||
@@ -1288,6 +1288,7 @@
|
||||
"Jina API Key": "",
|
||||
"join our Discord for help.": "pridružite se našem Discordu za pomoć.",
|
||||
"JSON": "JSON",
|
||||
"JSON Base64": "",
|
||||
"JSON Preview": "JSON pretpregled",
|
||||
"JSON Spec": "",
|
||||
"July": "Srpanj",
|
||||
@@ -1420,6 +1421,7 @@
|
||||
"Memory added successfully": "",
|
||||
"Memory cleared successfully": "",
|
||||
"Memory deleted successfully": "",
|
||||
"Memory System Context": "",
|
||||
"Memory updated successfully": "",
|
||||
"Merge Accounts by Email": "",
|
||||
"Merge Responses": "",
|
||||
@@ -1499,6 +1501,7 @@
|
||||
"More Options": "",
|
||||
"Move": "",
|
||||
"Moved {{name}}": "",
|
||||
"Multipart Upload": "",
|
||||
"Mute": "",
|
||||
"Muted": "",
|
||||
"My Terminal": "",
|
||||
@@ -1882,6 +1885,7 @@
|
||||
"Reply in Thread": "",
|
||||
"Reply to thread...": "",
|
||||
"Replying to {{NAME}}": "",
|
||||
"Request Format": "",
|
||||
"Require users to confirm before using Web Search.": "",
|
||||
"required": "",
|
||||
"Reranking Batch Size": "",
|
||||
@@ -2389,7 +2393,6 @@
|
||||
"Upload Pipeline": "Prijenos kanala",
|
||||
"Upload profile image": "",
|
||||
"Upload Progress": "Napredak učitavanja",
|
||||
"Upload Progress: {{uploadedFiles}}/{{totalFiles}} ({{percentage}}%)": "",
|
||||
"Uploaded files or images": "",
|
||||
"Uploading {{current}}/{{total}}: {{file}}": "",
|
||||
"Uploading...": "",
|
||||
|
||||
@@ -1281,6 +1281,7 @@
|
||||
"Jina API Key": "Jina API kulcs",
|
||||
"join our Discord for help.": "Csatlakozz a Discord szerverünkhöz segítségért.",
|
||||
"JSON": "JSON",
|
||||
"JSON Base64": "",
|
||||
"JSON Preview": "JSON előnézet",
|
||||
"JSON Spec": "",
|
||||
"July": "Július",
|
||||
@@ -1413,6 +1414,7 @@
|
||||
"Memory added successfully": "Memória sikeresen hozzáadva",
|
||||
"Memory cleared successfully": "Memória sikeresen törölve",
|
||||
"Memory deleted successfully": "Memória sikeresen törölve",
|
||||
"Memory System Context": "",
|
||||
"Memory updated successfully": "Memória sikeresen frissítve",
|
||||
"Merge Accounts by Email": "",
|
||||
"Merge Responses": "Válaszok egyesítése",
|
||||
@@ -1492,6 +1494,7 @@
|
||||
"More Options": "",
|
||||
"Move": "",
|
||||
"Moved {{name}}": "",
|
||||
"Multipart Upload": "",
|
||||
"Mute": "",
|
||||
"Muted": "",
|
||||
"My Terminal": "",
|
||||
@@ -1873,6 +1876,7 @@
|
||||
"Reply in Thread": "Válasz szálban",
|
||||
"Reply to thread...": "",
|
||||
"Replying to {{NAME}}": "",
|
||||
"Request Format": "",
|
||||
"Require users to confirm before using Web Search.": "",
|
||||
"required": "",
|
||||
"Reranking Batch Size": "",
|
||||
@@ -2378,7 +2382,6 @@
|
||||
"Upload Pipeline": "Folyamat feltöltése",
|
||||
"Upload profile image": "",
|
||||
"Upload Progress": "Feltöltési folyamat",
|
||||
"Upload Progress: {{uploadedFiles}}/{{totalFiles}} ({{percentage}}%)": "",
|
||||
"Uploaded files or images": "",
|
||||
"Uploading {{current}}/{{total}}: {{file}}": "",
|
||||
"Uploading...": "",
|
||||
|
||||
@@ -1274,6 +1274,7 @@
|
||||
"Jina API Key": "",
|
||||
"join our Discord for help.": "bergabunglah dengan Discord kami untuk mendapatkan bantuan.",
|
||||
"JSON": "JSON",
|
||||
"JSON Base64": "",
|
||||
"JSON Preview": "Pratinjau JSON",
|
||||
"JSON Spec": "",
|
||||
"July": "Juli",
|
||||
@@ -1406,6 +1407,7 @@
|
||||
"Memory added successfully": "Memori berhasil ditambahkan",
|
||||
"Memory cleared successfully": "Memori berhasil dihapus",
|
||||
"Memory deleted successfully": "Memori berhasil dihapus",
|
||||
"Memory System Context": "",
|
||||
"Memory updated successfully": "Memori berhasil diperbarui",
|
||||
"Merge Accounts by Email": "",
|
||||
"Merge Responses": "",
|
||||
@@ -1485,6 +1487,7 @@
|
||||
"More Options": "",
|
||||
"Move": "",
|
||||
"Moved {{name}}": "",
|
||||
"Multipart Upload": "",
|
||||
"Mute": "",
|
||||
"Muted": "",
|
||||
"My Terminal": "",
|
||||
@@ -1864,6 +1867,7 @@
|
||||
"Reply in Thread": "",
|
||||
"Reply to thread...": "",
|
||||
"Replying to {{NAME}}": "",
|
||||
"Request Format": "",
|
||||
"Require users to confirm before using Web Search.": "",
|
||||
"required": "",
|
||||
"Reranking Batch Size": "",
|
||||
@@ -2367,7 +2371,6 @@
|
||||
"Upload Pipeline": "Unggah Pipeline",
|
||||
"Upload profile image": "",
|
||||
"Upload Progress": "Kemajuan Unggah",
|
||||
"Upload Progress: {{uploadedFiles}}/{{totalFiles}} ({{percentage}}%)": "",
|
||||
"Uploaded files or images": "",
|
||||
"Uploading {{current}}/{{total}}: {{file}}": "",
|
||||
"Uploading...": "",
|
||||
|
||||
@@ -1281,6 +1281,7 @@
|
||||
"Jina API Key": "Jina API Eochair",
|
||||
"join our Discord for help.": "bí inár Discord chun cabhair a fháil.",
|
||||
"JSON": "JSON",
|
||||
"JSON Base64": "",
|
||||
"JSON Preview": "Réamhamharc JSON",
|
||||
"JSON Spec": "Sonraíocht JSON",
|
||||
"July": "Iúil",
|
||||
@@ -1413,6 +1414,7 @@
|
||||
"Memory added successfully": "Cuireadh cuimhne leis go",
|
||||
"Memory cleared successfully": "Cuimhne glanta go rathúil",
|
||||
"Memory deleted successfully": "Cuimhne scriosta go rathúil",
|
||||
"Memory System Context": "",
|
||||
"Memory updated successfully": "Cuimhne nuashonraithe",
|
||||
"Merge Accounts by Email": "",
|
||||
"Merge Responses": "Cumaisc Freagraí",
|
||||
@@ -1492,6 +1494,7 @@
|
||||
"More Options": "Tuilleadh Roghanna",
|
||||
"Move": "Bog",
|
||||
"Moved {{name}}": "Bogadh {{name}}",
|
||||
"Multipart Upload": "",
|
||||
"Mute": "Balbhaigh",
|
||||
"Muted": "Balbhaithe",
|
||||
"My Terminal": "Mo Teirminéal",
|
||||
@@ -1873,6 +1876,7 @@
|
||||
"Reply in Thread": "Freagra i Snáithe",
|
||||
"Reply to thread...": "Freagra ar an snáithe...",
|
||||
"Replying to {{NAME}}": "Ag freagairt do {{NAME}}",
|
||||
"Request Format": "",
|
||||
"Require users to confirm before using Web Search.": "",
|
||||
"required": "riachtanach",
|
||||
"Reranking Batch Size": "Méid an Bhaisc Athrangaithe",
|
||||
@@ -2378,7 +2382,6 @@
|
||||
"Upload Pipeline": "Uaslódáil píblíne",
|
||||
"Upload profile image": "Uaslódáil íomhá próifíle",
|
||||
"Upload Progress": "Dul Chun Cinn an Uaslódála",
|
||||
"Upload Progress: {{uploadedFiles}}/{{totalFiles}} ({{percentage}}%)": "Dul Chun Cinn Uaslódála: {{uploadedFiles}}/{{totalFiles}} ({{percentage}}%)",
|
||||
"Uploaded files or images": "Comhaid nó íomhánna uaslódáilte",
|
||||
"Uploading {{current}}/{{total}}: {{file}}": "Ag uaslódáil {{current}}/{{total}}: {{file}}",
|
||||
"Uploading...": "Ag uaslódáil...",
|
||||
|
||||
@@ -1288,6 +1288,7 @@
|
||||
"Jina API Key": "Chiave API Jina",
|
||||
"join our Discord for help.": "unisciti al nostro Discord per ricevere aiuto.",
|
||||
"JSON": "JSON",
|
||||
"JSON Base64": "",
|
||||
"JSON Preview": "Anteprima JSON",
|
||||
"JSON Spec": "",
|
||||
"July": "Luglio",
|
||||
@@ -1420,6 +1421,7 @@
|
||||
"Memory added successfully": "Memoria aggiunta con successo",
|
||||
"Memory cleared successfully": "Memoria cancellata con successo",
|
||||
"Memory deleted successfully": "Memoria eliminata con successo",
|
||||
"Memory System Context": "",
|
||||
"Memory updated successfully": "Memoria aggiornata con successo",
|
||||
"Merge Accounts by Email": "",
|
||||
"Merge Responses": "Unisci Risposte",
|
||||
@@ -1499,6 +1501,7 @@
|
||||
"More Options": "",
|
||||
"Move": "",
|
||||
"Moved {{name}}": "",
|
||||
"Multipart Upload": "",
|
||||
"Mute": "",
|
||||
"Muted": "",
|
||||
"My Terminal": "",
|
||||
@@ -1882,6 +1885,7 @@
|
||||
"Reply in Thread": "Rispondi nel thread",
|
||||
"Reply to thread...": "",
|
||||
"Replying to {{NAME}}": "",
|
||||
"Request Format": "",
|
||||
"Require users to confirm before using Web Search.": "",
|
||||
"required": "",
|
||||
"Reranking Batch Size": "",
|
||||
@@ -2389,7 +2393,6 @@
|
||||
"Upload Pipeline": "Carica Pipeline",
|
||||
"Upload profile image": "",
|
||||
"Upload Progress": "Avanzamento Caricamento",
|
||||
"Upload Progress: {{uploadedFiles}}/{{totalFiles}} ({{percentage}}%)": "",
|
||||
"Uploaded files or images": "",
|
||||
"Uploading {{current}}/{{total}}: {{file}}": "",
|
||||
"Uploading...": "",
|
||||
|
||||
@@ -1274,6 +1274,7 @@
|
||||
"Jina API Key": "Jina APIキー",
|
||||
"join our Discord for help.": "ヘルプについては、Discord に参加してください。",
|
||||
"JSON": "JSON",
|
||||
"JSON Base64": "",
|
||||
"JSON Preview": "JSON プレビュー",
|
||||
"JSON Spec": "",
|
||||
"July": "7月",
|
||||
@@ -1406,6 +1407,7 @@
|
||||
"Memory added successfully": "メモリに追加されました。",
|
||||
"Memory cleared successfully": "メモリをクリアしました。",
|
||||
"Memory deleted successfully": "メモリを削除しました。",
|
||||
"Memory System Context": "",
|
||||
"Memory updated successfully": "メモリアップデート成功",
|
||||
"Merge Accounts by Email": "",
|
||||
"Merge Responses": "応答を統合",
|
||||
@@ -1485,6 +1487,7 @@
|
||||
"More Options": "詳細オプション",
|
||||
"Move": "移動",
|
||||
"Moved {{name}}": "",
|
||||
"Multipart Upload": "",
|
||||
"Mute": "",
|
||||
"Muted": "",
|
||||
"My Terminal": "",
|
||||
@@ -1864,6 +1867,7 @@
|
||||
"Reply in Thread": "スレッドで返信",
|
||||
"Reply to thread...": "",
|
||||
"Replying to {{NAME}}": "",
|
||||
"Request Format": "",
|
||||
"Require users to confirm before using Web Search.": "",
|
||||
"required": "",
|
||||
"Reranking Batch Size": "",
|
||||
@@ -2367,7 +2371,6 @@
|
||||
"Upload Pipeline": "パイプラインをアップロード",
|
||||
"Upload profile image": "",
|
||||
"Upload Progress": "アップロードの進行状況",
|
||||
"Upload Progress: {{uploadedFiles}}/{{totalFiles}} ({{percentage}}%)": "アップロード状況: {{uploadedFiles}}/{{totalFiles}} ({{percentage}}%)",
|
||||
"Uploaded files or images": "",
|
||||
"Uploading {{current}}/{{total}}: {{file}}": "",
|
||||
"Uploading...": "",
|
||||
|
||||
@@ -1281,6 +1281,7 @@
|
||||
"Jina API Key": "Jina API-ის გასაღები",
|
||||
"join our Discord for help.": "დახმარებისთვის შემოდით ჩვენს Discord-ზე.",
|
||||
"JSON": "JSON",
|
||||
"JSON Base64": "",
|
||||
"JSON Preview": "JSON გადახედვა",
|
||||
"JSON Spec": "JSON-ის სპეციფიკაცია",
|
||||
"July": "ივლისი",
|
||||
@@ -1413,6 +1414,7 @@
|
||||
"Memory added successfully": "მოგონება წარმატებით დაემატა",
|
||||
"Memory cleared successfully": "მოგონება წარმატებით გასუფთავდა",
|
||||
"Memory deleted successfully": "მოგონება წარმატებით წაიშალა",
|
||||
"Memory System Context": "",
|
||||
"Memory updated successfully": "მოგონება წარმატებით განახლდა",
|
||||
"Merge Accounts by Email": "",
|
||||
"Merge Responses": "პასუხების შერწყმა",
|
||||
@@ -1492,6 +1494,7 @@
|
||||
"More Options": "მეტი პარამეტრები",
|
||||
"Move": "გადატანა",
|
||||
"Moved {{name}}": "",
|
||||
"Multipart Upload": "",
|
||||
"Mute": "",
|
||||
"Muted": "",
|
||||
"My Terminal": "",
|
||||
@@ -1873,6 +1876,7 @@
|
||||
"Reply in Thread": "ნაკადში პასუხი",
|
||||
"Reply to thread...": "",
|
||||
"Replying to {{NAME}}": "",
|
||||
"Request Format": "",
|
||||
"Require users to confirm before using Web Search.": "",
|
||||
"required": "აუცილებელია",
|
||||
"Reranking Batch Size": "",
|
||||
@@ -2378,7 +2382,6 @@
|
||||
"Upload Pipeline": "ფაიფლაინის ატვირთვა",
|
||||
"Upload profile image": "",
|
||||
"Upload Progress": "ატვირთვის მიმდინარეობა",
|
||||
"Upload Progress: {{uploadedFiles}}/{{totalFiles}} ({{percentage}}%)": "",
|
||||
"Uploaded files or images": "",
|
||||
"Uploading {{current}}/{{total}}: {{file}}": "",
|
||||
"Uploading...": "",
|
||||
|
||||
@@ -1281,6 +1281,7 @@
|
||||
"Jina API Key": "Tasarut API n Jina",
|
||||
"join our Discord for help.": "nadi-d ɣef tallalt-nneɣ.",
|
||||
"JSON": "JSON",
|
||||
"JSON Base64": "",
|
||||
"JSON Preview": "Taskant JSON",
|
||||
"JSON Spec": "",
|
||||
"July": "Yulyu",
|
||||
@@ -1413,6 +1414,7 @@
|
||||
"Memory added successfully": "Asmekti yettwarna akken iwata",
|
||||
"Memory cleared successfully": "Tettwasfeḍ tkatut akken iwata",
|
||||
"Memory deleted successfully": "Asmekti yettwakkes akken iwata",
|
||||
"Memory System Context": "",
|
||||
"Memory updated successfully": "Takatut tettwaleqqem akken iwata",
|
||||
"Merge Accounts by Email": "",
|
||||
"Merge Responses": "Smezdi tiririyin",
|
||||
@@ -1492,6 +1494,7 @@
|
||||
"More Options": "Ugar n textiṛiyin",
|
||||
"Move": "Senkez",
|
||||
"Moved {{name}}": "",
|
||||
"Multipart Upload": "",
|
||||
"Mute": "",
|
||||
"Muted": "",
|
||||
"My Terminal": "",
|
||||
@@ -1873,6 +1876,7 @@
|
||||
"Reply in Thread": "Err deg udiwenni",
|
||||
"Reply to thread...": "Err i udiwenni…",
|
||||
"Replying to {{NAME}}": "Tiririt i {{NAME}}",
|
||||
"Request Format": "",
|
||||
"Require users to confirm before using Web Search.": "",
|
||||
"required": "yettwasra",
|
||||
"Reranking Batch Size": "",
|
||||
@@ -2378,7 +2382,6 @@
|
||||
"Upload Pipeline": "Aselda n uɛebbi",
|
||||
"Upload profile image": "",
|
||||
"Upload Progress": "",
|
||||
"Upload Progress: {{uploadedFiles}}/{{totalFiles}} ({{percentage}}%)": "Tikli n uɛebbi: {{uploadedFiles}}/{{totalFiles}} ({{percentage}}%)",
|
||||
"Uploaded files or images": "",
|
||||
"Uploading {{current}}/{{total}}: {{file}}": "",
|
||||
"Uploading...": "",
|
||||
|
||||
@@ -1275,6 +1275,7 @@
|
||||
"Jina API Key": "Jina API 키",
|
||||
"join our Discord for help.": "도움말을 보려면 Discord에 가입하세요.",
|
||||
"JSON": "JSON",
|
||||
"JSON Base64": "",
|
||||
"JSON Preview": "JSON 미리 보기",
|
||||
"JSON Spec": "JSON 스펙",
|
||||
"July": "7월",
|
||||
@@ -1407,6 +1408,7 @@
|
||||
"Memory added successfully": "성공적으로 메모리가 추가되었습니다",
|
||||
"Memory cleared successfully": "성공적으로 메모리가 정리되었습니다",
|
||||
"Memory deleted successfully": "성공적으로 메모리가 삭제되었습니다",
|
||||
"Memory System Context": "",
|
||||
"Memory updated successfully": "성공적으로 메모리가 업데이트되었습니다",
|
||||
"Merge Accounts by Email": "",
|
||||
"Merge Responses": "응답들 결합하기",
|
||||
@@ -1486,6 +1488,7 @@
|
||||
"More Options": "추가 설정",
|
||||
"Move": "이동",
|
||||
"Moved {{name}}": "{{name}} 이동됨",
|
||||
"Multipart Upload": "",
|
||||
"Mute": "",
|
||||
"Muted": "",
|
||||
"My Terminal": "내 터미널",
|
||||
@@ -1865,6 +1868,7 @@
|
||||
"Reply in Thread": "스레드로 답장하기",
|
||||
"Reply to thread...": "스레드로 답장하기...",
|
||||
"Replying to {{NAME}}": "{{NAME}}에게 답장하는 중",
|
||||
"Request Format": "",
|
||||
"Require users to confirm before using Web Search.": "",
|
||||
"required": "필수",
|
||||
"Reranking Batch Size": "리랭킹 배치 사이즈",
|
||||
@@ -2370,7 +2374,6 @@
|
||||
"Upload Pipeline": "업로드 파이프라인",
|
||||
"Upload profile image": "프로필 이미지 업로드",
|
||||
"Upload Progress": "업로드 진행 상황",
|
||||
"Upload Progress: {{uploadedFiles}}/{{totalFiles}} ({{percentage}}%)": "업로드 진행 상황: {{uploadedFiles}}/{{totalFiles}} ({{percentage}}%)",
|
||||
"Uploaded files or images": "업로드된 파일 또는 이미지",
|
||||
"Uploading {{current}}/{{total}}: {{file}}": "",
|
||||
"Uploading...": "업로드 중...",
|
||||
|
||||
@@ -1295,6 +1295,7 @@
|
||||
"Jina API Key": "",
|
||||
"join our Discord for help.": "prisijunkite prie mūsų Discord.",
|
||||
"JSON": "JSON",
|
||||
"JSON Base64": "",
|
||||
"JSON Preview": "JSON peržiūra",
|
||||
"JSON Spec": "",
|
||||
"July": "liepa",
|
||||
@@ -1427,6 +1428,7 @@
|
||||
"Memory added successfully": "Atmintis pridėta sėkmingai",
|
||||
"Memory cleared successfully": "Atmintis ištrinta sėkmingai",
|
||||
"Memory deleted successfully": "Atmintis ištrinta sėkmingai",
|
||||
"Memory System Context": "",
|
||||
"Memory updated successfully": "Atmintis atnaujinta sėkmingai",
|
||||
"Merge Accounts by Email": "",
|
||||
"Merge Responses": "",
|
||||
@@ -1506,6 +1508,7 @@
|
||||
"More Options": "",
|
||||
"Move": "",
|
||||
"Moved {{name}}": "",
|
||||
"Multipart Upload": "",
|
||||
"Mute": "",
|
||||
"Muted": "",
|
||||
"My Terminal": "",
|
||||
@@ -1891,6 +1894,7 @@
|
||||
"Reply in Thread": "",
|
||||
"Reply to thread...": "",
|
||||
"Replying to {{NAME}}": "",
|
||||
"Request Format": "",
|
||||
"Require users to confirm before using Web Search.": "",
|
||||
"required": "",
|
||||
"Reranking Batch Size": "",
|
||||
@@ -2400,7 +2404,6 @@
|
||||
"Upload Pipeline": "Atnaujinti procesą",
|
||||
"Upload profile image": "",
|
||||
"Upload Progress": "Įkėlimo progresas",
|
||||
"Upload Progress: {{uploadedFiles}}/{{totalFiles}} ({{percentage}}%)": "",
|
||||
"Uploaded files or images": "",
|
||||
"Uploading {{current}}/{{total}}: {{file}}": "",
|
||||
"Uploading...": "",
|
||||
|
||||
@@ -1288,6 +1288,7 @@
|
||||
"Jina API Key": "Jina API atslēga",
|
||||
"join our Discord for help.": "pievienojieties mūsu Discord, lai saņemtu palīdzību.",
|
||||
"JSON": "JSON",
|
||||
"JSON Base64": "",
|
||||
"JSON Preview": "JSON priekšskatījums",
|
||||
"JSON Spec": "JSON specifikācija",
|
||||
"July": "Jūlijs",
|
||||
@@ -1420,6 +1421,7 @@
|
||||
"Memory added successfully": "Atmiņa veiksmīgi pievienota",
|
||||
"Memory cleared successfully": "Atmiņa veiksmīgi notīrīta",
|
||||
"Memory deleted successfully": "Atmiņa veiksmīgi dzēsta",
|
||||
"Memory System Context": "",
|
||||
"Memory updated successfully": "Atmiņa veiksmīgi atjaunināta",
|
||||
"Merge Accounts by Email": "",
|
||||
"Merge Responses": "Apvienot atbildes",
|
||||
@@ -1499,6 +1501,7 @@
|
||||
"More Options": "Vairāk opciju",
|
||||
"Move": "Pārvietot",
|
||||
"Moved {{name}}": "",
|
||||
"Multipart Upload": "",
|
||||
"Mute": "",
|
||||
"Muted": "",
|
||||
"My Terminal": "",
|
||||
@@ -1882,6 +1885,7 @@
|
||||
"Reply in Thread": "Atbildēt pavedienā",
|
||||
"Reply to thread...": "Atbildēt pavedienā...",
|
||||
"Replying to {{NAME}}": "Atbild {{NAME}}",
|
||||
"Request Format": "",
|
||||
"Require users to confirm before using Web Search.": "",
|
||||
"required": "nepieciešams",
|
||||
"Reranking Batch Size": "",
|
||||
@@ -2389,7 +2393,6 @@
|
||||
"Upload Pipeline": "Augšupielādēt plūsmu",
|
||||
"Upload profile image": "",
|
||||
"Upload Progress": "Augšupielādes progress",
|
||||
"Upload Progress: {{uploadedFiles}}/{{totalFiles}} ({{percentage}}%)": "Augšupielādes progress: {{uploadedFiles}}/{{totalFiles}} ({{percentage}}%)",
|
||||
"Uploaded files or images": "Augšupielādēti faili vai attēli",
|
||||
"Uploading {{current}}/{{total}}: {{file}}": "",
|
||||
"Uploading...": "",
|
||||
|
||||
@@ -1274,6 +1274,7 @@
|
||||
"Jina API Key": "Kunci API Jina",
|
||||
"join our Discord for help.": "sertai Discord kami untuk mendapatkan bantuan.",
|
||||
"JSON": "JSON",
|
||||
"JSON Base64": "",
|
||||
"JSON Preview": "Pratonton JSON",
|
||||
"JSON Spec": "Spesifikasi JSON",
|
||||
"July": "Julai",
|
||||
@@ -1406,6 +1407,7 @@
|
||||
"Memory added successfully": "Ingatan berjaya ditambah",
|
||||
"Memory cleared successfully": "Ingatan berjaya dikosongkan",
|
||||
"Memory deleted successfully": "Ingatan berjaya dipadamkan",
|
||||
"Memory System Context": "",
|
||||
"Memory updated successfully": "Ingatan berjaya dikemas kini",
|
||||
"Merge Accounts by Email": "",
|
||||
"Merge Responses": "Gabungkan Respons",
|
||||
@@ -1485,6 +1487,7 @@
|
||||
"More Options": "Pilihan Lanjutan",
|
||||
"Move": "Pindah",
|
||||
"Moved {{name}}": "{{name}} telah dipindahkan",
|
||||
"Multipart Upload": "",
|
||||
"Mute": "Redam",
|
||||
"Muted": "Diredamkan",
|
||||
"My Terminal": "Terminal Saya",
|
||||
@@ -1864,6 +1867,7 @@
|
||||
"Reply in Thread": "Balas dalam Benang",
|
||||
"Reply to thread...": "Balas ke benang...",
|
||||
"Replying to {{NAME}}": "Membalas kepada {{NAME}}",
|
||||
"Request Format": "",
|
||||
"Require users to confirm before using Web Search.": "",
|
||||
"required": "diperlukan",
|
||||
"Reranking Batch Size": "Saiz Kelompok Penyusunan Semula",
|
||||
@@ -2367,7 +2371,6 @@
|
||||
"Upload Pipeline": "Muat Naik Pipeline",
|
||||
"Upload profile image": "Muat Naik Imej Profil",
|
||||
"Upload Progress": "Kemajuan Muat Naik",
|
||||
"Upload Progress: {{uploadedFiles}}/{{totalFiles}} ({{percentage}}%)": "Kemajuan Muat Naik: {{uploadedFiles}}/{{totalFiles}} ({{percentage}}%)",
|
||||
"Uploaded files or images": "Fail atau imej yang dimuat naik",
|
||||
"Uploading {{current}}/{{total}}: {{file}}": "",
|
||||
"Uploading...": "Memuat naik...",
|
||||
|
||||
@@ -1281,6 +1281,7 @@
|
||||
"Jina API Key": "API-nøkkel for Jina",
|
||||
"join our Discord for help.": "bli med i Discord-fellesskapet vårt for å få hjelp.",
|
||||
"JSON": "JSON",
|
||||
"JSON Base64": "",
|
||||
"JSON Preview": "Forhåndsvisning av JSON",
|
||||
"JSON Spec": "",
|
||||
"July": "juli",
|
||||
@@ -1413,6 +1414,7 @@
|
||||
"Memory added successfully": "Minne lagt til",
|
||||
"Memory cleared successfully": "Minne tømt",
|
||||
"Memory deleted successfully": "Minne slettet",
|
||||
"Memory System Context": "",
|
||||
"Memory updated successfully": "Minne oppdatert",
|
||||
"Merge Accounts by Email": "",
|
||||
"Merge Responses": "Flette svar",
|
||||
@@ -1492,6 +1494,7 @@
|
||||
"More Options": "",
|
||||
"Move": "",
|
||||
"Moved {{name}}": "",
|
||||
"Multipart Upload": "",
|
||||
"Mute": "",
|
||||
"Muted": "",
|
||||
"My Terminal": "",
|
||||
@@ -1873,6 +1876,7 @@
|
||||
"Reply in Thread": "Svar i tråd",
|
||||
"Reply to thread...": "",
|
||||
"Replying to {{NAME}}": "",
|
||||
"Request Format": "",
|
||||
"Require users to confirm before using Web Search.": "",
|
||||
"required": "",
|
||||
"Reranking Batch Size": "",
|
||||
@@ -2378,7 +2382,6 @@
|
||||
"Upload Pipeline": "Last opp pipeline",
|
||||
"Upload profile image": "",
|
||||
"Upload Progress": "Opplastingsfremdrift",
|
||||
"Upload Progress: {{uploadedFiles}}/{{totalFiles}} ({{percentage}}%)": "",
|
||||
"Uploaded files or images": "",
|
||||
"Uploading {{current}}/{{total}}: {{file}}": "",
|
||||
"Uploading...": "",
|
||||
|
||||
@@ -1281,6 +1281,7 @@
|
||||
"Jina API Key": "Jina API-sleutel",
|
||||
"join our Discord for help.": "word lid van onze Discord voor hulp.",
|
||||
"JSON": "JSON",
|
||||
"JSON Base64": "",
|
||||
"JSON Preview": "JSON-voorbeeld",
|
||||
"JSON Spec": "JSON-specificatie",
|
||||
"July": "juli",
|
||||
@@ -1413,6 +1414,7 @@
|
||||
"Memory added successfully": "Geheugen succesvol toegevoegd",
|
||||
"Memory cleared successfully": "Geheugen succesvol vrijgemaakt",
|
||||
"Memory deleted successfully": "Geheugen succesvol verwijderd",
|
||||
"Memory System Context": "",
|
||||
"Memory updated successfully": "Geheugen succesvol bijgewerkt",
|
||||
"Merge Accounts by Email": "",
|
||||
"Merge Responses": "Voeg antwoorden samen",
|
||||
@@ -1492,6 +1494,7 @@
|
||||
"More Options": "Meer opties",
|
||||
"Move": "Verplaatsen",
|
||||
"Moved {{name}}": "{{name}} verplaatst",
|
||||
"Multipart Upload": "",
|
||||
"Mute": "",
|
||||
"Muted": "",
|
||||
"My Terminal": "Mijn terminal",
|
||||
@@ -1873,6 +1876,7 @@
|
||||
"Reply in Thread": "Antwoord in draad",
|
||||
"Reply to thread...": "Reageren op draad...",
|
||||
"Replying to {{NAME}}": "Reageren op {{NAME}}",
|
||||
"Request Format": "",
|
||||
"Require users to confirm before using Web Search.": "",
|
||||
"required": "vereist",
|
||||
"Reranking Batch Size": "Batchgrootte voor herordenen",
|
||||
@@ -2378,7 +2382,6 @@
|
||||
"Upload Pipeline": "Upload Pijpleiding",
|
||||
"Upload profile image": "Profielafbeelding uploaden",
|
||||
"Upload Progress": "Upload Voortgang",
|
||||
"Upload Progress: {{uploadedFiles}}/{{totalFiles}} ({{percentage}}%)": "Uploadvoortgang: {{uploadedFiles}}/{{totalFiles}} ({{percentage}}%)",
|
||||
"Uploaded files or images": "Geüploade bestanden of afbeeldingen",
|
||||
"Uploading {{current}}/{{total}}: {{file}}": "",
|
||||
"Uploading...": "Aan het uploaden...",
|
||||
|
||||
@@ -1281,6 +1281,7 @@
|
||||
"Jina API Key": "",
|
||||
"join our Discord for help.": "ਮਦਦ ਲਈ ਸਾਡੇ ਡਿਸਕੋਰਡ ਵਿੱਚ ਸ਼ਾਮਲ ਹੋਵੋ।",
|
||||
"JSON": "JSON",
|
||||
"JSON Base64": "",
|
||||
"JSON Preview": "JSON ਪੂਰਵ-ਦਰਸ਼ਨ",
|
||||
"JSON Spec": "",
|
||||
"July": "ਜੁਲਾਈ",
|
||||
@@ -1413,6 +1414,7 @@
|
||||
"Memory added successfully": "",
|
||||
"Memory cleared successfully": "",
|
||||
"Memory deleted successfully": "",
|
||||
"Memory System Context": "",
|
||||
"Memory updated successfully": "",
|
||||
"Merge Accounts by Email": "",
|
||||
"Merge Responses": "",
|
||||
@@ -1492,6 +1494,7 @@
|
||||
"More Options": "",
|
||||
"Move": "",
|
||||
"Moved {{name}}": "",
|
||||
"Multipart Upload": "",
|
||||
"Mute": "",
|
||||
"Muted": "",
|
||||
"My Terminal": "",
|
||||
@@ -1873,6 +1876,7 @@
|
||||
"Reply in Thread": "",
|
||||
"Reply to thread...": "",
|
||||
"Replying to {{NAME}}": "",
|
||||
"Request Format": "",
|
||||
"Require users to confirm before using Web Search.": "",
|
||||
"required": "",
|
||||
"Reranking Batch Size": "",
|
||||
@@ -2378,7 +2382,6 @@
|
||||
"Upload Pipeline": "",
|
||||
"Upload profile image": "",
|
||||
"Upload Progress": "ਅਪਲੋਡ ਪ੍ਰਗਤੀ",
|
||||
"Upload Progress: {{uploadedFiles}}/{{totalFiles}} ({{percentage}}%)": "",
|
||||
"Uploaded files or images": "",
|
||||
"Uploading {{current}}/{{total}}: {{file}}": "",
|
||||
"Uploading...": "",
|
||||
|
||||
@@ -1295,6 +1295,7 @@
|
||||
"Jina API Key": "Klucz API Jina",
|
||||
"join our Discord for help.": "dołącz do Discorda po pomoc.",
|
||||
"JSON": "JSON",
|
||||
"JSON Base64": "",
|
||||
"JSON Preview": "Podgląd JSON",
|
||||
"JSON Spec": "Specyfikacja JSON",
|
||||
"July": "Lipiec",
|
||||
@@ -1427,6 +1428,7 @@
|
||||
"Memory added successfully": "Wpis pamięci dodany pomyślnie",
|
||||
"Memory cleared successfully": "Pamięć wyczyszczona pomyślnie",
|
||||
"Memory deleted successfully": "Wpis pamięci usunięty pomyślnie",
|
||||
"Memory System Context": "",
|
||||
"Memory updated successfully": "Wpis pamięci zaktualizowany pomyślnie",
|
||||
"Merge Accounts by Email": "",
|
||||
"Merge Responses": "Połącz odpowiedzi",
|
||||
@@ -1506,6 +1508,7 @@
|
||||
"More Options": "Więcej opcji",
|
||||
"Move": "Przenieś",
|
||||
"Moved {{name}}": "Przeniesiono {{name}}",
|
||||
"Multipart Upload": "",
|
||||
"Mute": "Wycisz",
|
||||
"Muted": "Wyciszony",
|
||||
"My Terminal": "Mój terminal",
|
||||
@@ -1891,6 +1894,7 @@
|
||||
"Reply in Thread": "Odpowiedz w wątku",
|
||||
"Reply to thread...": "Odpowiedz w wątku...",
|
||||
"Replying to {{NAME}}": "Odpowiedź do {{NAME}}",
|
||||
"Request Format": "",
|
||||
"Require users to confirm before using Web Search.": "",
|
||||
"required": "wymagane",
|
||||
"Reranking Batch Size": "Rozmiar partii reranking",
|
||||
@@ -2400,7 +2404,6 @@
|
||||
"Upload Pipeline": "Prześlij Pipeline",
|
||||
"Upload profile image": "Prześlij zdjęcie profilowe",
|
||||
"Upload Progress": "Postęp przesyłania",
|
||||
"Upload Progress: {{uploadedFiles}}/{{totalFiles}} ({{percentage}}%)": "Postęp: {{uploadedFiles}}/{{totalFiles}} ({{percentage}}%)",
|
||||
"Uploaded files or images": "Przesłane pliki lub obrazy",
|
||||
"Uploading {{current}}/{{total}}: {{file}}": "",
|
||||
"Uploading...": "Przesyłanie...",
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1288,6 +1288,7 @@
|
||||
"Jina API Key": "Chave da API do Jina",
|
||||
"join our Discord for help.": "junte-se ao nosso Discord para obter ajuda.",
|
||||
"JSON": "JSON",
|
||||
"JSON Base64": "",
|
||||
"JSON Preview": "Pré-visualização JSON",
|
||||
"JSON Spec": "Especificação JSON",
|
||||
"July": "Julho",
|
||||
@@ -1420,6 +1421,7 @@
|
||||
"Memory added successfully": "Memória adicionada com sucesso",
|
||||
"Memory cleared successfully": "Memória limpa com sucesso",
|
||||
"Memory deleted successfully": "Memória eliminada com sucesso",
|
||||
"Memory System Context": "",
|
||||
"Memory updated successfully": "Memória atualizada com sucesso",
|
||||
"Merge Accounts by Email": "",
|
||||
"Merge Responses": "Fundir Respostas",
|
||||
@@ -1499,6 +1501,7 @@
|
||||
"More Options": "Mais Opções",
|
||||
"Move": "Mover",
|
||||
"Moved {{name}}": "Movido {{name}}",
|
||||
"Multipart Upload": "",
|
||||
"Mute": "",
|
||||
"Muted": "",
|
||||
"My Terminal": "Meu Terminal",
|
||||
@@ -1882,6 +1885,7 @@
|
||||
"Reply in Thread": "Responder no Tópico",
|
||||
"Reply to thread...": "Responder ao tópico...",
|
||||
"Replying to {{NAME}}": "A responder a {{NAME}}",
|
||||
"Request Format": "",
|
||||
"Require users to confirm before using Web Search.": "",
|
||||
"required": "obrigatório",
|
||||
"Reranking Batch Size": "",
|
||||
@@ -2389,7 +2393,6 @@
|
||||
"Upload Pipeline": "Carregar Pipeline",
|
||||
"Upload profile image": "Carregar imagem de perfil",
|
||||
"Upload Progress": "Progresso do Carregamento",
|
||||
"Upload Progress: {{uploadedFiles}}/{{totalFiles}} ({{percentage}}%)": "Progresso do Carregamento: {{uploadedFiles}}/{{totalFiles}} ({{percentage}}%)",
|
||||
"Uploaded files or images": "Ficheiros ou imagens carregados",
|
||||
"Uploading {{current}}/{{total}}: {{file}}": "",
|
||||
"Uploading...": "A carregar...",
|
||||
|
||||
@@ -1288,6 +1288,7 @@
|
||||
"Jina API Key": "",
|
||||
"join our Discord for help.": "alătură-te Discord-ului nostru pentru ajutor.",
|
||||
"JSON": "JSON",
|
||||
"JSON Base64": "",
|
||||
"JSON Preview": "Previzualizare JSON",
|
||||
"JSON Spec": "",
|
||||
"July": "Iulie",
|
||||
@@ -1420,6 +1421,7 @@
|
||||
"Memory added successfully": "Memoria a fost adăugată cu succes",
|
||||
"Memory cleared successfully": "Memoria a fost ștearsă cu succes",
|
||||
"Memory deleted successfully": "Memoria a fost ștearsă cu succes",
|
||||
"Memory System Context": "",
|
||||
"Memory updated successfully": "Memoria a fost actualizată cu succes",
|
||||
"Merge Accounts by Email": "",
|
||||
"Merge Responses": "Combină răspunsurile",
|
||||
@@ -1499,6 +1501,7 @@
|
||||
"More Options": "",
|
||||
"Move": "",
|
||||
"Moved {{name}}": "",
|
||||
"Multipart Upload": "",
|
||||
"Mute": "",
|
||||
"Muted": "",
|
||||
"My Terminal": "",
|
||||
@@ -1882,6 +1885,7 @@
|
||||
"Reply in Thread": "",
|
||||
"Reply to thread...": "",
|
||||
"Replying to {{NAME}}": "",
|
||||
"Request Format": "",
|
||||
"Require users to confirm before using Web Search.": "",
|
||||
"required": "",
|
||||
"Reranking Batch Size": "",
|
||||
@@ -2389,7 +2393,6 @@
|
||||
"Upload Pipeline": "Încarcă Conducta",
|
||||
"Upload profile image": "",
|
||||
"Upload Progress": "Progres Încărcare",
|
||||
"Upload Progress: {{uploadedFiles}}/{{totalFiles}} ({{percentage}}%)": "",
|
||||
"Uploaded files or images": "",
|
||||
"Uploading {{current}}/{{total}}: {{file}}": "",
|
||||
"Uploading...": "",
|
||||
|
||||
@@ -1295,6 +1295,7 @@
|
||||
"Jina API Key": "Ключ API для Jina",
|
||||
"join our Discord for help.": "присоединяйтесь к нашему Discord для помощи.",
|
||||
"JSON": "JSON",
|
||||
"JSON Base64": "",
|
||||
"JSON Preview": "Предварительный просмотр JSON",
|
||||
"JSON Spec": "JSON-спецификация",
|
||||
"July": "Июль",
|
||||
@@ -1427,6 +1428,7 @@
|
||||
"Memory added successfully": "Воспоминание успешно добавлено",
|
||||
"Memory cleared successfully": "Воспоминания успешно очищены",
|
||||
"Memory deleted successfully": "Воспоминание успешно удалено",
|
||||
"Memory System Context": "",
|
||||
"Memory updated successfully": "Воспоминание успешно обновлено",
|
||||
"Merge Accounts by Email": "",
|
||||
"Merge Responses": "Объединить ответы",
|
||||
@@ -1506,6 +1508,7 @@
|
||||
"More Options": "Больше опций",
|
||||
"Move": "Переместить",
|
||||
"Moved {{name}}": "Перемещено: {{name}}",
|
||||
"Multipart Upload": "",
|
||||
"Mute": "Выключить микрофон",
|
||||
"Muted": "Микрофон выключен",
|
||||
"My Terminal": "Мой терминал",
|
||||
@@ -1891,6 +1894,7 @@
|
||||
"Reply in Thread": "Ответить в обсуждении",
|
||||
"Reply to thread...": "Ответить в обсуждении...",
|
||||
"Replying to {{NAME}}": "Ответ для {{NAME}}",
|
||||
"Request Format": "",
|
||||
"Require users to confirm before using Web Search.": "",
|
||||
"required": "обязательно",
|
||||
"Reranking Batch Size": "Размер пакета реранжирования",
|
||||
@@ -2400,7 +2404,6 @@
|
||||
"Upload Pipeline": "Загрузить конвейер",
|
||||
"Upload profile image": "Загрузить аватар",
|
||||
"Upload Progress": "Прогресс загрузки",
|
||||
"Upload Progress: {{uploadedFiles}}/{{totalFiles}} ({{percentage}}%)": "Прогресс загрузки: {{uploadedFiles}}/{{totalFiles}} ({{percentage}}%)",
|
||||
"Uploaded files or images": "Загруженные файлы или изображения",
|
||||
"Uploading {{current}}/{{total}}: {{file}}": "",
|
||||
"Uploading...": "Загрузка...",
|
||||
|
||||
@@ -1295,6 +1295,7 @@
|
||||
"Jina API Key": "",
|
||||
"join our Discord for help.": "pripojte sa k nášmu Discordu pre pomoc.",
|
||||
"JSON": "JSON",
|
||||
"JSON Base64": "",
|
||||
"JSON Preview": "Náhľad JSON",
|
||||
"JSON Spec": "",
|
||||
"July": "Júl",
|
||||
@@ -1427,6 +1428,7 @@
|
||||
"Memory added successfully": "Pamäť bola úspešne pridaná.",
|
||||
"Memory cleared successfully": "Pamäť bola úspešne vymazaná.",
|
||||
"Memory deleted successfully": "Pamäť bola úspešne vymazaná",
|
||||
"Memory System Context": "",
|
||||
"Memory updated successfully": "Pamäť úspešne aktualizovaná",
|
||||
"Merge Accounts by Email": "",
|
||||
"Merge Responses": "Zlúčiť odpovede",
|
||||
@@ -1506,6 +1508,7 @@
|
||||
"More Options": "",
|
||||
"Move": "Presunúť",
|
||||
"Moved {{name}}": "",
|
||||
"Multipart Upload": "",
|
||||
"Mute": "",
|
||||
"Muted": "",
|
||||
"My Terminal": "",
|
||||
@@ -1891,6 +1894,7 @@
|
||||
"Reply in Thread": "",
|
||||
"Reply to thread...": "",
|
||||
"Replying to {{NAME}}": "",
|
||||
"Request Format": "",
|
||||
"Require users to confirm before using Web Search.": "",
|
||||
"required": "",
|
||||
"Reranking Batch Size": "",
|
||||
@@ -2400,7 +2404,6 @@
|
||||
"Upload Pipeline": "Nahrať pipeline",
|
||||
"Upload profile image": "",
|
||||
"Upload Progress": "Priebeh nahrávania",
|
||||
"Upload Progress: {{uploadedFiles}}/{{totalFiles}} ({{percentage}}%)": "",
|
||||
"Uploaded files or images": "",
|
||||
"Uploading {{current}}/{{total}}: {{file}}": "",
|
||||
"Uploading...": "",
|
||||
|
||||
@@ -1288,6 +1288,7 @@
|
||||
"Jina API Key": "",
|
||||
"join our Discord for help.": "придружите се нашем Дискорду за помоћ.",
|
||||
"JSON": "JSON",
|
||||
"JSON Base64": "",
|
||||
"JSON Preview": "ЈСОН Преглед",
|
||||
"JSON Spec": "",
|
||||
"July": "Јул",
|
||||
@@ -1420,6 +1421,7 @@
|
||||
"Memory added successfully": "Сећање успешно додато",
|
||||
"Memory cleared successfully": "Сећање успешно очишћено",
|
||||
"Memory deleted successfully": "Сећање успешно обрисано",
|
||||
"Memory System Context": "",
|
||||
"Memory updated successfully": "Сећање успешно измењено",
|
||||
"Merge Accounts by Email": "",
|
||||
"Merge Responses": "Спој одговоре",
|
||||
@@ -1499,6 +1501,7 @@
|
||||
"More Options": "",
|
||||
"Move": "",
|
||||
"Moved {{name}}": "",
|
||||
"Multipart Upload": "",
|
||||
"Mute": "",
|
||||
"Muted": "",
|
||||
"My Terminal": "",
|
||||
@@ -1882,6 +1885,7 @@
|
||||
"Reply in Thread": "",
|
||||
"Reply to thread...": "",
|
||||
"Replying to {{NAME}}": "",
|
||||
"Request Format": "",
|
||||
"Require users to confirm before using Web Search.": "",
|
||||
"required": "",
|
||||
"Reranking Batch Size": "",
|
||||
@@ -2389,7 +2393,6 @@
|
||||
"Upload Pipeline": "Цевовод отпремања",
|
||||
"Upload profile image": "",
|
||||
"Upload Progress": "Напредак отпремања",
|
||||
"Upload Progress: {{uploadedFiles}}/{{totalFiles}} ({{percentage}}%)": "",
|
||||
"Uploaded files or images": "",
|
||||
"Uploading {{current}}/{{total}}: {{file}}": "",
|
||||
"Uploading...": "",
|
||||
|
||||
@@ -1281,6 +1281,7 @@
|
||||
"Jina API Key": "Jina API-nyckel",
|
||||
"join our Discord for help.": "gå med i vår Discord för hjälp.",
|
||||
"JSON": "JSON",
|
||||
"JSON Base64": "",
|
||||
"JSON Preview": "Förhandsversion av JSON",
|
||||
"JSON Spec": "JSON-specifikation",
|
||||
"July": "juli",
|
||||
@@ -1413,6 +1414,7 @@
|
||||
"Memory added successfully": "Minnet har lagts till",
|
||||
"Memory cleared successfully": "Minnet har rensats",
|
||||
"Memory deleted successfully": "Minnet har tagits bort",
|
||||
"Memory System Context": "",
|
||||
"Memory updated successfully": "Minnet har uppdaterats",
|
||||
"Merge Accounts by Email": "",
|
||||
"Merge Responses": "Sammanslå svar (med AI)",
|
||||
@@ -1492,6 +1494,7 @@
|
||||
"More Options": "Fler alternativ",
|
||||
"Move": "Flytta",
|
||||
"Moved {{name}}": "Flyttat {{name}}",
|
||||
"Multipart Upload": "",
|
||||
"Mute": "Stäng av ljud",
|
||||
"Muted": "Tystad",
|
||||
"My Terminal": "Min terminal",
|
||||
@@ -1873,6 +1876,7 @@
|
||||
"Reply in Thread": "Svara i tråd",
|
||||
"Reply to thread...": "Svara i tråd...",
|
||||
"Replying to {{NAME}}": "Svarar {{NAME}}",
|
||||
"Request Format": "",
|
||||
"Require users to confirm before using Web Search.": "",
|
||||
"required": "obligatoriskt",
|
||||
"Reranking Batch Size": "Batchstorlek för omrankning",
|
||||
@@ -2378,7 +2382,6 @@
|
||||
"Upload Pipeline": "Ladda upp rörledning",
|
||||
"Upload profile image": "Ladda upp profilbild",
|
||||
"Upload Progress": "Uppladdningsframsteg",
|
||||
"Upload Progress: {{uploadedFiles}}/{{totalFiles}} ({{percentage}}%)": "Uppladdningsstatus: {{uploadedFiles}}/{{totalFiles}} ({{percentage}}%)",
|
||||
"Uploaded files or images": "Uppladdade filer eller bilder",
|
||||
"Uploading {{current}}/{{total}}: {{file}}": "",
|
||||
"Uploading...": "Uppladdning...",
|
||||
|
||||
@@ -1281,6 +1281,7 @@
|
||||
"Jina API Key": "ஜினா API கீ",
|
||||
"join our Discord for help.": "உதவிக்கு எங்கள் டிஸ்கார்டில் சேரவும்.",
|
||||
"JSON": "JSON",
|
||||
"JSON Base64": "",
|
||||
"JSON Preview": "JSON முன்னோட்டம்",
|
||||
"JSON Spec": "JSON விவரக்குறிப்பு",
|
||||
"July": "ஜூலை",
|
||||
@@ -1413,6 +1414,7 @@
|
||||
"Memory added successfully": "நினைவகம் வெற்றிகரமாக சேர்க்கப்பட்டது",
|
||||
"Memory cleared successfully": "நினைவகம் வெற்றிகரமாக அழிக்கப்பட்டது",
|
||||
"Memory deleted successfully": "நினைவகம் வெற்றிகரமாக நீக்கப்பட்டது",
|
||||
"Memory System Context": "",
|
||||
"Memory updated successfully": "நினைவகம் வெற்றிகரமாக புதுப்பிக்கப்பட்டது",
|
||||
"Merge Accounts by Email": "",
|
||||
"Merge Responses": "பதில்களை ஒன்றிணைக்கவும்",
|
||||
@@ -1492,6 +1494,7 @@
|
||||
"More Options": "மேலும் விருப்பங்கள்",
|
||||
"Move": "நகர்த்தவும்",
|
||||
"Moved {{name}}": "{{name}} நகர்த்தப்பட்டது",
|
||||
"Multipart Upload": "",
|
||||
"Mute": "",
|
||||
"Muted": "",
|
||||
"My Terminal": "என் டெர்மினல்",
|
||||
@@ -1873,6 +1876,7 @@
|
||||
"Reply in Thread": "த்ரெட்டில் பதிலளிக்கவும்",
|
||||
"Reply to thread...": "திரிக்கு பதில்...",
|
||||
"Replying to {{NAME}}": "{{NAME}} க்கு பதிலளிக்கிறது",
|
||||
"Request Format": "",
|
||||
"Require users to confirm before using Web Search.": "",
|
||||
"required": "தேவை",
|
||||
"Reranking Batch Size": "",
|
||||
@@ -2378,7 +2382,6 @@
|
||||
"Upload Pipeline": "பைப்லைனை பதிவேற்றவும்",
|
||||
"Upload profile image": "சுயவிவரப் படத்தைப் பதிவேற்றவும்",
|
||||
"Upload Progress": "பதிவேற்ற முன்னேற்றம்",
|
||||
"Upload Progress: {{uploadedFiles}}/{{totalFiles}} ({{percentage}}%)": "பதிவேற்ற முன்னேற்றம்: {{uploadedFiles}}/{{totalFiles}} ({{percentage}}%)",
|
||||
"Uploaded files or images": "பதிவேற்றப்பட்ட கோப்புகள் அல்லது படங்கள்",
|
||||
"Uploading {{current}}/{{total}}: {{file}}": "",
|
||||
"Uploading...": "பதிவேற்றுகிறது...",
|
||||
|
||||
@@ -5,64 +5,64 @@
|
||||
"(e.g. `sh webui.sh --api`)": "(เช่น `sh webui.sh --api`)",
|
||||
"(latest)": "(ล่าสุด)",
|
||||
"(leave blank for to use commercial endpoint)": "(เว้นว่างไว้เพื่อใช้ endpoint เชิงพาณิชย์)",
|
||||
"[Last] dddd [at] h:mm A": "[Last] dddd [เวลา] h:mm A",
|
||||
"[Last] dddd [at] h:mm A": "[ล่าสุด] dddd [เวลา] h:mm A",
|
||||
"[Today at] h:mm A": "[วันนี้ เวลา] h:mm A",
|
||||
"[Yesterday at] h:mm A": "[เมื่อวานเวลา] h:mm A",
|
||||
"{{ models }}": "{{ models }}",
|
||||
"{{COUNT}} Available Skills": "",
|
||||
"{{COUNT}} Available Skills": "ทักษะที่ใช้ได้ {{COUNT}} รายการ",
|
||||
"{{COUNT}} Available Tools": "เครื่องมือที่ใช้ได้ {{COUNT}} รายการ",
|
||||
"{{COUNT}} characters": "{{COUNT}} ตัวอักษร",
|
||||
"{{COUNT}} extracted lines": "{{COUNT}} บรรทัดที่ดึงออกมา",
|
||||
"{{COUNT}} files": "",
|
||||
"{{COUNT}} files": "{{COUNT}} ไฟล์",
|
||||
"{{count}} files selected. Only new and modified files will be uploaded. Deleted files will be removed. The folder structure will be mirrored. Continue?_other": "",
|
||||
"{{count}} filters_other": "",
|
||||
"{{count}} groups_other": "",
|
||||
"{{count}} filters_other": "{{count}} ตัวกรอง",
|
||||
"{{count}} groups_other": "{{count}} กลุ่ม",
|
||||
"{{COUNT}} hidden lines": "{{COUNT}} บรรทัดที่ซ่อนอยู่",
|
||||
"{{COUNT}} members": "",
|
||||
"{{count}} of {{total}} accessible_other": "",
|
||||
"{{COUNT}} members": "{{COUNT}} สมาชิก",
|
||||
"{{count}} of {{total}} accessible_other": "{{count}} จาก {{total}} ที่เข้าถึงได้",
|
||||
"{{COUNT}} Replies": "{{COUNT}} คำตอบ",
|
||||
"{{COUNT}} Rows": "",
|
||||
"{{count}} selected_other": "",
|
||||
"{{COUNT}} Rows": "{{COUNT}} แถว",
|
||||
"{{count}} selected_other": "{{count}} ที่เลือก",
|
||||
"{{COUNT}} Sources": "{{COUNT}} แหล่งที่มา",
|
||||
"{{count}} users_other": "",
|
||||
"{{count}} users_other": "{{count}} ผู้ใช้",
|
||||
"{{COUNT}} words": "{{COUNT}} คำ",
|
||||
"{{COUNT}}d_time_ago": "",
|
||||
"{{COUNT}}h_time_ago": "",
|
||||
"{{COUNT}}m_time_ago": "",
|
||||
"{{COUNT}}w_time_ago": "",
|
||||
"{{COUNT}}y_time_ago": "",
|
||||
"{{label}} contains invalid JSON": "",
|
||||
"{{label}} must be a JSON object": "",
|
||||
"{{COUNT}}d_time_ago": "{{COUNT}} วันที่แล้ว",
|
||||
"{{COUNT}}h_time_ago": "{{COUNT}} ชั่วโมงที่แล้ว",
|
||||
"{{COUNT}}m_time_ago": "{{COUNT}} นาทีที่แล้ว",
|
||||
"{{COUNT}}w_time_ago": "{{COUNT}} สัปดาห์ที่แล้ว",
|
||||
"{{COUNT}}y_time_ago": "{{COUNT}} ปีที่แล้ว",
|
||||
"{{label}} contains invalid JSON": "{{label}} มี JSON ที่ไม่ถูกต้อง",
|
||||
"{{label}} must be a JSON object": "{{label}} ต้องเป็น JSON object",
|
||||
"{{LOCALIZED_DATE}} at {{LOCALIZED_TIME}}": "{{LOCALIZED_DATE}} เมื่อ {{LOCALIZED_TIME}}",
|
||||
"{{model}} download has been canceled": "การดาวน์โหลด {{model}} ถูกยกเลิกแล้ว",
|
||||
"{{modelName}} profile image": "",
|
||||
"{{NAMES}} reacted with {{REACTION}}": "",
|
||||
"{{modelName}} profile image": "รูปโปรไฟล์ของ {{modelName}}",
|
||||
"{{NAMES}} reacted with {{REACTION}}": "{{NAMES}} แสดงความรู้สึก {{REACTION}}",
|
||||
"{{user}}'s Chats": "การแชทของ {{user}}",
|
||||
"{{webUIName}} Backend Required": "ต้องใช้ Backend ของ {{webUIName}}",
|
||||
"*Prompt node ID(s) are required for image generation": "*ต้องระบุ ID ของ prompt node สำหรับการสร้างภาพ",
|
||||
"1 group": "",
|
||||
"1 hour before": "",
|
||||
"1 group": "1 กลุ่ม",
|
||||
"1 hour before": "1 ชั่วโมงก่อน",
|
||||
"1 Source": "1 แหล่งที่มา",
|
||||
"1 user": "",
|
||||
"10 minutes before": "",
|
||||
"15 minutes before": "",
|
||||
"1m_time_ago": "",
|
||||
"30 minutes before": "",
|
||||
"5 minutes before": "",
|
||||
"A collaboration channel where people join as members": "",
|
||||
"A discussion channel where access is controlled by groups and permissions": "",
|
||||
"1 user": "1 ผู้ใช้",
|
||||
"10 minutes before": "10 นาทีก่อน",
|
||||
"15 minutes before": "15 นาทีก่อน",
|
||||
"1m_time_ago": "1 นาทีที่แล้ว",
|
||||
"30 minutes before": "30 นาทีก่อน",
|
||||
"5 minutes before": "5 นาทีก่อน",
|
||||
"A collaboration channel where people join as members": "ช่องทางการทำงานร่วมกันที่ผู้คนเข้าร่วมเป็นสมาชิก",
|
||||
"A discussion channel where access is controlled by groups and permissions": "ช่องทางการสนทนาที่การเข้าถึงถูกควบคุมโดยกลุ่มและสิทธิ์",
|
||||
"A new version (v{{LATEST_VERSION}}) is now available.": "เวอร์ชันใหม่ (v{{LATEST_VERSION}}) พร้อมให้ใช้งานแล้ว",
|
||||
"A private conversation between you and selected users": "",
|
||||
"A private conversation between you and selected users": "การสนทนาส่วนตัวระหว่างคุณและผู้ใช้ที่เลือก",
|
||||
"A task model is used when performing tasks such as generating titles for chats and web search queries": "Task Model จะถูกใช้เมื่อทำภารกิจต่างๆ เช่น การสร้างหัวข้อแชทและการค้นหาเว็บ",
|
||||
"a user": "ผู้ใช้",
|
||||
"About": "เกี่ยวกับ",
|
||||
"Accept Autocomplete Generation\nJump to Prompt Variable": "ยอมรับการสร้างอัตโนมัติ\nข้ามไปยังตัวแปรพรอมต์",
|
||||
"Access": "การเข้าถึง",
|
||||
"Access Control": "การควบคุมการเข้าถึง",
|
||||
"Access Grants": "",
|
||||
"Access List": "",
|
||||
"Access prohibited": "",
|
||||
"Access updated": "",
|
||||
"Access Grants": "การให้สิทธิ์การเข้าถึง",
|
||||
"Access List": "รายการการเข้าถึง",
|
||||
"Access prohibited": "การเข้าถึงถูกห้าม",
|
||||
"Access updated": "การเข้าถึงได้รับการอัปเดต",
|
||||
"Accessible to all users": "เข้าถึงได้สำหรับผู้ใช้ทั้งหมด",
|
||||
"Account": "บัญชี",
|
||||
"Account Activation Pending": "การเปิดใช้งานบัญชีกำลังดำเนินการ",
|
||||
@@ -74,58 +74,58 @@
|
||||
"Activate this command by typing \"/{{COMMAND}}\" to chat input.": "เปิดใช้งานคำสั่งนี้โดยพิมพ์ \"/{{COMMAND}}\" ในช่องแชท",
|
||||
"Active": "กำลังใช้งาน",
|
||||
"Active Users": "ผู้ใช้ที่ใช้งานอยู่",
|
||||
"Activity": "",
|
||||
"Activity": "กิจกรรม",
|
||||
"Add": "เพิ่ม",
|
||||
"Add a model ID": "เพิ่ม ID โมเดล",
|
||||
"Add a preference, fact, or instruction about you": "",
|
||||
"Add a preference, fact, or instruction about you": "เพิ่มความชอบ ข้อมูล หรือคำแนะนำเกี่ยวกับคุณ",
|
||||
"Add a short description about what this model does": "เพิ่มคำอธิบายสั้นๆ เกี่ยวกับสิ่งที่โมเดลนี้ทำ",
|
||||
"Add a tag": "เพิ่มแท็ก",
|
||||
"Add a tag...": "",
|
||||
"Add Access": "",
|
||||
"Add a tag...": "เพิ่มแท็ก...",
|
||||
"Add Access": "เพิ่มการเข้าถึง",
|
||||
"Add Arena Model": "เพิ่มโมเดล Arena",
|
||||
"Add Connection": "เพิ่มการเชื่อมต่อ",
|
||||
"Add Content": "เพิ่มเนื้อหา",
|
||||
"Add content here": "เพิ่มเนื้อหาตรงนี้",
|
||||
"Add Custom Parameter": "เพิ่มพารามิเตอร์ที่กำหนดเอง",
|
||||
"Add Custom Prompt": "เพิ่มพรอมต์ที่กำหนดเอง",
|
||||
"Add description": "",
|
||||
"Add description": "เพิ่มคำอธิบาย",
|
||||
"Add Details": "เพิ่มรายละเอียด",
|
||||
"Add durable context for future chats": "",
|
||||
"Add durable context for future chats": "เพิ่มบริบทสำหรับการแชทในอนาคต",
|
||||
"Add Files": "เพิ่มไฟล์",
|
||||
"Add Image": "",
|
||||
"Add Knowledge Connection": "",
|
||||
"Add location": "",
|
||||
"Add Member": "",
|
||||
"Add Members": "",
|
||||
"Add Image": "เพิ่มรูปภาพ",
|
||||
"Add Knowledge Connection": "เพิ่มการเชื่อมต่อknowledge",
|
||||
"Add location": "เพิ่มตำแหน่ง",
|
||||
"Add Member": "เพิ่มสมาชิก",
|
||||
"Add Members": "เพิ่มสมาชิก",
|
||||
"Add Memory": "เพิ่มความจำ",
|
||||
"Add Model": "เพิ่มโมเดล",
|
||||
"Add Reaction": "เพิ่มรีแอคชัน",
|
||||
"Add tag": "",
|
||||
"Add tag": "เพิ่มแท็ก",
|
||||
"Add Tag": "เพิ่มแท็ก",
|
||||
"Add Terminal": "",
|
||||
"Add Terminal Connection": "",
|
||||
"Add Terminal": "เพิ่ม Terminal",
|
||||
"Add Terminal Connection": "เพิ่มการเชื่อมต่อ Terminal",
|
||||
"Add text content": "เพิ่มเนื้อหาข้อความ",
|
||||
"Add to favorites": "",
|
||||
"Add to favorites": "เพิ่มไปยังรายการโปรด",
|
||||
"Add User": "เพิ่มผู้ใช้",
|
||||
"Add User Group": "เพิ่มกลุ่มผู้ใช้",
|
||||
"Add webhook": "",
|
||||
"Add webpage": "",
|
||||
"Add your Open Terminal URL and API key in Settings → Integrations.": "",
|
||||
"Add webhook": "เพิ่ม webhook",
|
||||
"Add webpage": "เพิ่ม web page",
|
||||
"Add your Open Terminal URL and API key in Settings → Integrations.": "เพิ่มURLและAPI keyของOpen TerminalของคุณในSettings → Integrations",
|
||||
"Additional Config": "การกำหนดค่าเพิ่มเติม",
|
||||
"Additional configuration options for marker. This should be a JSON string with key-value pairs. For example, '{\"key\": \"value\"}'. Supported keys include: disable_links, keep_pageheader_in_output, keep_pagefooter_in_output, filter_blank_pages, drop_repeated_text, layout_coverage_threshold, merge_threshold, height_tolerance, gap_threshold, image_threshold, min_line_length, level_count, default_level": "ตัวเลือกการกำหนดค่าเพิ่มเติมสำหรับ marker ควรเป็นสตริง JSON ที่มีคู่ key-value เช่น '{\"key\": \"value\"}' คีย์ที่รองรับได้แก่: disable_links, keep_pageheader_in_output, keep_pagefooter_in_output, filter_blank_pages, drop_repeated_text, layout_coverage_threshold, merge_threshold, height_tolerance, gap_threshold, image_threshold, min_line_length, level_count, default_level",
|
||||
"Additional feedback comments": "",
|
||||
"Additional feedback comments": "ข้อเสนอแนะเพิ่มเติม",
|
||||
"Additional Parameters": "พารามิเตอร์เพิ่มเติม",
|
||||
"Adds filenames, titles, sections, and snippets into the BM25 text to improve lexical recall.": "",
|
||||
"Adds filenames, titles, sections, and snippets into the BM25 text to improve lexical recall.": "เพิ่มชื่อไฟล์ ชื่อเรื่อง ส่วน และข้อความย่อเข้าไปในข้อความ BM25 เพื่อปรับปรุงการเรียกคืนทางด้านคำศัพท์",
|
||||
"Adjusting these settings will apply changes universally to all users.": "การปรับการตั้งค่าเหล่านี้จะมีผลกับผู้ใช้ทุกคนทั่วทั้งระบบ",
|
||||
"admin": "ผู้ดูแลระบบ",
|
||||
"Admin": "ผู้ดูแลระบบ",
|
||||
"Admin Contact Email": "",
|
||||
"Admin Contact Email": "อีเมลผู้ดูแลระบบ",
|
||||
"Admin Panel": "แผงผู้ดูแลระบบ",
|
||||
"Admin Roles": "",
|
||||
"Admin Roles": "บทบาทผู้ดูแลระบบ",
|
||||
"Admin Settings": "การตั้งค่าผู้ดูแลระบบ",
|
||||
"Admin-managed service account": "",
|
||||
"Admin-managed service account": "บัญชีบริการที่จัดการโดยผู้ดูแลระบบ",
|
||||
"Admins have access to all tools at all times; users need tools assigned per model in the workspace.": "ผู้ดูแลระบบสามารถเข้าถึงเครื่องมือทั้งหมดได้ตลอดเวลา ส่วนผู้ใช้ต้องได้รับการกำหนดเครื่องมือต่อโมเดลในแต่ละพื้นที่ทำงาน",
|
||||
"Advanced": "",
|
||||
"Advanced": "ขั้นสูง",
|
||||
"Advanced Parameters": "พารามิเตอร์ขั้นสูง",
|
||||
"Advanced parameters for MinerU parsing (enable_ocr, enable_formula, enable_table, language, model_version, page_ranges)": "พารามิเตอร์ขั้นสูงสำหรับการแยกวิเคราะห์ MinerU (enable_ocr, enable_formula, enable_table, language, model_version, page_ranges)",
|
||||
"Advanced Params": "พารามิเตอร์ขั้นสูง",
|
||||
@@ -133,22 +133,22 @@
|
||||
"AI": "AI",
|
||||
"All": "ทั้งหมด",
|
||||
"All chats have been unarchived.": "ยกเลิกการเก็บถาวรการแชททั้งหมดแล้ว",
|
||||
"All day": "",
|
||||
"All events": "",
|
||||
"All models are now hidden": "",
|
||||
"All models are now visible": "",
|
||||
"All day": "ทั้งวัน",
|
||||
"All events": "ทุกevents",
|
||||
"All models are now hidden": "ทุกโมเดลถูกซ่อนแล้ว",
|
||||
"All models are now visible": "ทุกโมเดลแสดงแล้ว",
|
||||
"All models deleted successfully": "ลบโมเดลทั้งหมดเรียบร้อยแล้ว",
|
||||
"All shared chats have been unshared.": "",
|
||||
"All Sources": "",
|
||||
"All time": "",
|
||||
"All Users": "",
|
||||
"All users and system events": "",
|
||||
"All shared chats have been unshared.": "แชทที่แชร์ทั้งหมดถูกยกเลิกการแชร์แล้ว",
|
||||
"All Sources": "ทุกแห่งที่มา",
|
||||
"All time": "ทั้งหมด",
|
||||
"All Users": "ทุกผู้ใช้",
|
||||
"All users and system events": "ทุกผู้ใช้และเหตุการณ์ของระบบ",
|
||||
"Allow Call": "อนุญาตให้โทร",
|
||||
"Allow Chat Controls": "อนุญาตการควบคุมแชท",
|
||||
"Allow Chat Delete": "อนุญาตให้ลบแชท",
|
||||
"Allow Chat Edit": "อนุญาตให้แก้ไขแชท",
|
||||
"Allow Chat Export": "อนุญาตให้ส่งออกแชท",
|
||||
"Allow Chat Import": "",
|
||||
"Allow Chat Import": "อนุญาตให้นำเข้าแชท",
|
||||
"Allow Chat Params": "อนุญาตพารามิเตอร์แชท",
|
||||
"Allow Chat Share": "อนุญาตให้แชร์แชท",
|
||||
"Allow Chat System Prompt": "อนุญาต System Prompt สำหรับแชท",
|
||||
@@ -158,21 +158,21 @@
|
||||
"Allow File Upload": "อนุญาตให้อัปโหลดไฟล์",
|
||||
"Allow Multiple Models in Chat": "อนุญาตการใช้หลายโมเดลในการแชท",
|
||||
"Allow non-local voices": "อนุญาตเสียงที่ไม่ใช่แบบ Local",
|
||||
"Allow public write access": "",
|
||||
"Allow public write access": "อนุญาตให้เข้าถึงการเขียนสาธารณะ",
|
||||
"Allow Rate Response": "อนุญาตให้ให้คะแนนคำตอบ",
|
||||
"Allow Regenerate Response": "อนุญาตให้สร้างคำตอบใหม่",
|
||||
"Allow Sharing With Users": "",
|
||||
"Allow Sharing With Users": "อนุญาตให้แชร์กับผู้ใช้",
|
||||
"Allow Speech to Text": "อนุญาตให้แปลงเสียงเป็นข้อความ",
|
||||
"Allow Temporary Chat": "อนุญาตการแชทชั่วคราว",
|
||||
"Allow Text to Speech": "อนุญาตการแปลงข้อความเป็นเสียง",
|
||||
"Allow User Location": "อนุญาตให้เข้าถึงตำแหน่งที่อยู่ของผู้ใช้",
|
||||
"Allow Voice Interruption in Call": "อนุญาตให้ขัดจังหวะด้วยเสียงระหว่างสาย",
|
||||
"Allow Web Upload": "",
|
||||
"Allowed Domains": "",
|
||||
"Allow Web Upload": "อนุญาตให้อัปโหลดจากเว็บ",
|
||||
"Allowed Domains": "โดเมนที่อนุญาต",
|
||||
"Allowed Endpoints": "Endpoints ที่อนุญาต",
|
||||
"Allowed File Extensions": "นามสกุลไฟล์ที่อนุญาต",
|
||||
"Allowed file extensions for upload. Separate multiple extensions with commas. Leave empty for all file types.": "นามสกุลไฟล์ที่อนุญาตให้อัปโหลด คั่นแต่ละนามสกุลด้วยเครื่องหมายจุลภาค เว้นว่างเพื่ออนุญาตไฟล์ทุกประเภท",
|
||||
"Allowed Roles": "",
|
||||
"Allowed Roles": "Roles ที่อนุญาต",
|
||||
"Already have an account?": "มีบัญชีอยู่แล้ว?",
|
||||
"Alternative to the top_p, and aims to ensure a balance of quality and variety. The parameter p represents the minimum probability for a token to be considered, relative to the probability of the most likely token. For example, with p=0.05 and the most likely token having a probability of 0.9, logits with a value less than 0.045 are filtered out.": "ทางเลือกแทน top_p และมุ่งเน้นการสร้างสมดุลระหว่างคุณภาพและความหลากหลาย พารามิเตอร์ p แทนค่าความน่าจะเป็นต่ำสุดสำหรับโทเค็นที่จะถูกพิจารณา โดยอ้างอิงกับความน่าจะเป็นของโทเค็นที่มีโอกาสสูงที่สุด ตัวอย่างเช่น เมื่อ p=0.05 และโทเค็นที่มีโอกาสสูงที่สุดมีความน่าจะเป็น 0.9 logits ที่มีค่าน้อยกว่า 0.045 จะถูกกรองออก",
|
||||
"Always": "เสมอ",
|
||||
@@ -187,57 +187,57 @@
|
||||
"and {{COUNT}} more": "และอีก {{COUNT}} รายการ",
|
||||
"and create a new shared link.": "และสร้างลิงก์ที่แชร์ใหม่",
|
||||
"Android": "Android",
|
||||
"Anyone": "",
|
||||
"Anyone": "ใครก็ได้",
|
||||
"API Base URL": "URL พื้นฐานของ API",
|
||||
"API Base URL for Datalab Marker service. Defaults to: https://www.datalab.to/api/v1/marker": "URL พื้นฐานของ API สำหรับบริการ Datalab Marker ค่าเริ่มต้น: https://www.datalab.to/api/v1/marker",
|
||||
"API Key": "คีย์ API",
|
||||
"API Key / Token": "",
|
||||
"API Key / Token": "คีย์ API / Token",
|
||||
"API Key created.": "สร้างคีย์ API แล้ว",
|
||||
"API Key Endpoint Restrictions": "ข้อจำกัด Endpoint ของ API Key",
|
||||
"API keys": "คีย์ API",
|
||||
"API Keys": "",
|
||||
"API Keys": "คีย์ API",
|
||||
"API Mode": "โหมด API",
|
||||
"API Timeout": "",
|
||||
"API Type": "",
|
||||
"API Timeout": "API หมดเวลา",
|
||||
"API Type": "ประเภท API",
|
||||
"API Version": "เวอร์ชัน API",
|
||||
"API Version is required": "ต้องระบุเวอร์ชัน API",
|
||||
"Application DN": "DN ของแอปพลิเคชัน",
|
||||
"Application DN Password": "รหัสผ่าน DN ของแอปพลิเคชัน",
|
||||
"applies to all users with the \"user\" role": "ใช้กับผู้ใช้ทั้งหมดที่มีบทบาท \"user\"",
|
||||
"April": "เมษายน",
|
||||
"Archive": "เก็บถาวร",
|
||||
"Archive All": "",
|
||||
"Archive All Chats": "เก็บถาวรการแชททั้งหมด",
|
||||
"Archived Chats": "แชทที่เก็บถาวร",
|
||||
"archived-chat-export": "ส่งออกการแชทที่เก็บถาวร",
|
||||
"Are you sure you want to archive all chats? This action cannot be undone.": "",
|
||||
"Are you sure you want to clear all memories? This action cannot be undone.": "คุณแน่ใจหรือว่าต้องการล้างความจำทั้งหมด? การดำเนินการนี้ไม่สามารถยกเลิกได้",
|
||||
"Are you sure you want to delete \"{{NAME}}\"?": "",
|
||||
"Are you sure you want to delete **{{modelName}}**?": "",
|
||||
"Are you sure you want to delete all chats? This action cannot be undone.": "",
|
||||
"Are you sure you want to delete this channel?": "คุณแน่ใจหรือว่าต้องการลบช่องนี้?",
|
||||
"Are you sure you want to delete this connection? This action cannot be undone.": "",
|
||||
"Are you sure you want to delete this directory?": "",
|
||||
"Are you sure you want to delete this memory? This action cannot be undone.": "",
|
||||
"Are you sure you want to delete this message?": "คุณแน่ใจหรือว่าต้องการลบข้อความนี้?",
|
||||
"Are you sure you want to delete this version? Child versions will be relinked to this version's parent.": "",
|
||||
"Are you sure you want to delete this webhook? This action cannot be undone.": "",
|
||||
"Are you sure you want to delete this?": "",
|
||||
"Are you sure you want to reset all permissions to their default values? You will still need to save to apply the changes.": "",
|
||||
"Archive": "เก็บ",
|
||||
"Archive All": "เก็บถาวรทั้งหมด",
|
||||
"Archive All Chats": "เก็บการแชททั้งหมด",
|
||||
"Archived Chats": "แชทที่เก็บ",
|
||||
"archived-chat-export": "ส่งออกการแชทที่เก็บ",
|
||||
"Are you sure you want to archive all chats? This action cannot be undone.": "คุณแน่ใจใช่มั้ยว่าต้องการเก็บแชททั้งหมด? การดำเนินการนี้ไม่สามารถยกเลิกได้",
|
||||
"Are you sure you want to clear all memories? This action cannot be undone.": "คุณแน่ใจใช่มั้ยว่าต้องการล้างความจำทั้งหมด? การดำเนินการนี้ไม่สามารถยกเลิกได้",
|
||||
"Are you sure you want to delete \"{{NAME}}\"?": "คุณแน่ใจใช่มั้ยว่าต้องการลบ \"{{NAME}}\"?",
|
||||
"Are you sure you want to delete **{{modelName}}**?": "คุณแน่ใจใช่มั้ยว่าต้องการลบ **{{modelName}}**?",
|
||||
"Are you sure you want to delete all chats? This action cannot be undone.": "คุณแน่ใจใช่มั้ยว่าต้องการลบแชททั้งหมด? การดำเนินการนี้ไม่สามารถยกเลิกได้",
|
||||
"Are you sure you want to delete this channel?": "คุณแน่ใจใช่มั้ยว่าต้องการลบช่องนี้?",
|
||||
"Are you sure you want to delete this connection? This action cannot be undone.": "คุณแน่ใจใช่มั้ยว่าต้องการลบการเชื่อมต่อ นี้? การดำเนินการนี้ไม่สามารถยกเลิกได้",
|
||||
"Are you sure you want to delete this directory?": "คุณแน่ใจใช่มั้ยว่าต้องการลบไดเรกทอรีนี้?",
|
||||
"Are you sure you want to delete this memory? This action cannot be undone.": "คุณแน่ใจใช่มั้ยว่าต้องการลบความจำนี้? การดำเนินการนี้ไม่สามารถยกเลิกได้",
|
||||
"Are you sure you want to delete this message?": "คุณแน่ใจใช่มั้ยว่าต้องการลบข้อความนี้?",
|
||||
"Are you sure you want to delete this version? Child versions will be relinked to this version's parent.": "คุณแน่ใจใช่มั้ยว่าต้องการลบเวอร์ชันนี้? เวอร์ชันลูกจะถูกเชื่อมโยงใหม่ไปยังเวอร์ชันแม่ของเวอร์ชันนี้",
|
||||
"Are you sure you want to delete this webhook? This action cannot be undone.": "คุณแน่ใจใช่มั้ยว่าต้องการลบ webhook นี้? การดำเนินการนี้ไม่สามารถยกเลิกได้",
|
||||
"Are you sure you want to delete this?": "คุณแน่ใจใช่มั้ยว่าต้องการลบสิ่งนี้?",
|
||||
"Are you sure you want to reset all permissions to their default values? You will still need to save to apply the changes.": "คุณแน่ใจใช่มั้ยว่าต้องการรีเซ็ตสิทธิ์ทั้งหมดเป็นค่าเริ่มต้น? คุณจะยังต้องบันทึกเพื่อให้การเปลี่ยนแปลงมีผล",
|
||||
"Are you sure you want to unarchive all archived chats?": "คุณแน่ใจหรือว่าต้องการยกเลิกการเก็บถาวรแชททั้งหมด?",
|
||||
"Are you sure you want to unshare all shared chats? This will remove all share links.": "",
|
||||
"Are you sure you want to unshare all shared chats? This will remove all share links.": "คุณแน่ใจใช่มั้ยว่าต้องการเลิกแชร์แชททั้งหมด? การดำเนินการนี้จะนำลิงก์แชร์ทั้งหมดออก",
|
||||
"Arena Models": "โมเดลใน Arena",
|
||||
"Artifacts": "Artifacts",
|
||||
"Asc": "",
|
||||
"Ask": "ถาม",
|
||||
"Ask a question": "ถามคำถาม",
|
||||
"Ask a test question": "",
|
||||
"Ask this knowledge source a test question": "",
|
||||
"Ask a test question": "ถามคำถามทดสอบ",
|
||||
"Ask this knowledge source a test question": "ถามคำถามทดสอบกับแหล่งความรู้นี้",
|
||||
"Assistant": "ผู้ช่วย",
|
||||
"Async Embedding Processing": "",
|
||||
"At time of event": "",
|
||||
"At time of event": "ณ เวลาของevent",
|
||||
"Attach File From Knowledge": "แนบไฟล์จากฐานความรู้",
|
||||
"Attach Files": "",
|
||||
"Attach Files": "แนบไฟล์",
|
||||
"Attach Knowledge": "แนบฐานความรู้",
|
||||
"Attach Notes": "แนบบันทึก",
|
||||
"Attach Webpage": "แนบหน้าเว็บ",
|
||||
@@ -247,38 +247,38 @@
|
||||
"Audio": "เสียง",
|
||||
"August": "สิงหาคม",
|
||||
"Auth": "การยืนยันตัวตน",
|
||||
"Auth Mode": "",
|
||||
"Auth required": "",
|
||||
"Auth Mode": "โหมดการยืนยันตัวตน",
|
||||
"Auth required": "จำเป็นต้องยืนยันตัวตน",
|
||||
"Authenticate": "ยืนยันตัวตน",
|
||||
"Authentication": "การยืนยันตัวตน",
|
||||
"Auto": "อัตโนมัติ",
|
||||
"Auto (Random)": "",
|
||||
"Auto Redirect": "",
|
||||
"Auto (Random)": "อัตโนมัติ (สุ่ม)",
|
||||
"Auto Redirect": "อัตโนมัติ แบบredirect",
|
||||
"Auto-Copy Response to Clipboard": "คัดลอกคำตอบไปยังคลิปบอร์ดโดยอัตโนมัติ",
|
||||
"Auto-Create Groups": "",
|
||||
"Auto-Create Groups": "สร้างกลุ่มโดยอัตโนมัติ",
|
||||
"Auto-Playback Response": "การเล่นคำตอบอัตโนมัติ",
|
||||
"Autocomplete Generation": "การเติมข้อความอัตโนมัติ",
|
||||
"Autocomplete Generation Input Max Length": "ความยาวสูงสุดของอินพุตการสร้างข้อความอัตโนมัติ",
|
||||
"Autocomplete Generation Prompt": "",
|
||||
"Automatic": "",
|
||||
"Autocomplete Generation Input Max Length": "ความยาวสูงสุดของinputของการสร้างข้อความอัตโนมัติ",
|
||||
"Autocomplete Generation Prompt": "การสร้างpromptอัตโนมัติ",
|
||||
"Automatic": "อัตโนมัติ",
|
||||
"Automatic1111": "Automatic1111",
|
||||
"AUTOMATIC1111 Api Auth String": "สตริงการตรวจสอบสิทธิ์ API ของ AUTOMATIC1111",
|
||||
"AUTOMATIC1111 Base URL": "URL พื้นฐานของ AUTOMATIC1111",
|
||||
"AUTOMATIC1111 Base URL is required.": "จำเป็นต้องระบุ Base URL ของ AUTOMATIC1111",
|
||||
"Automatically inject system tools in native function calling mode (e.g., timestamps, memory, chat history, notes, etc.)": "",
|
||||
"Automation": "",
|
||||
"Automation created": "",
|
||||
"Automation Name": "",
|
||||
"Automation title": "",
|
||||
"Automation triggered": "",
|
||||
"Automation updated": "",
|
||||
"Automations": "",
|
||||
"Available list": "รายการที่มีอยู่",
|
||||
"Available models": "",
|
||||
"Available Skills": "",
|
||||
"Available Tools": "เครื่องมือที่มีให้ใช้",
|
||||
"available users": "ผู้ใช้ที่มีอยู่",
|
||||
"Available variables": "",
|
||||
"Automation": "ระบบอัตโนมัติ",
|
||||
"Automation created": "ระบบอัตโนมัติถูกสร้าง",
|
||||
"Automation Name": "ชื่อระบบอัตโนมัติ",
|
||||
"Automation title": "หัวข้อระบบอัตโนมัติ",
|
||||
"Automation triggered": "ระบบอัตโนมัติถูกเรียกใช้งาน",
|
||||
"Automation updated": "ระบบอัตโนมัติถูกอัปเดต",
|
||||
"Automations": "ระบบอัตโนมัติ",
|
||||
"Available list": "รายการที่พร้อมใช้งาน",
|
||||
"Available models": "โมเดลที่พร้อมใช้งาน",
|
||||
"Available Skills": "สกิลที่พร้อมใช้งาน",
|
||||
"Available Tools": "เครื่องมือที่พร้อมใช้งาน",
|
||||
"available users": "ผู้ใช้ที่พร้อมใช้งาน",
|
||||
"Available variables": "ตัวแปรที่มีอยู่",
|
||||
"available!": "พร้อมใช้งาน!",
|
||||
"Away": "ไม่อยู่",
|
||||
"Awful": "แย่",
|
||||
@@ -289,7 +289,7 @@
|
||||
"Bad Response": "การตอบกลับไม่ถูกต้อง",
|
||||
"Banners": "แบนเนอร์",
|
||||
"Base Model (From)": "โมเดลพื้นฐาน (จาก)",
|
||||
"Base Model is required.": "",
|
||||
"Base Model is required.": "ต้องระบุโมเดลพื้นฐาน",
|
||||
"Base Model List Cache speeds up access by fetching base models only at startup or on settings save—faster, but may not show recent base model changes.": "การแคชรายการ Base Model ช่วยเร่งการเข้าถึงโดยดึงข้อมูลโมเดลเฉพาะตอนเริ่มต้นระบบหรือเมื่อบันทึกการตั้งค่า ซึ่งทำให้เร็วขึ้น แต่อาจไม่แสดงการเปลี่ยนแปลงโมเดลล่าสุด",
|
||||
"Bearer": "Bearer",
|
||||
"before": "ก่อน",
|
||||
@@ -299,51 +299,51 @@
|
||||
"Bing Search V7 Subscription Key": "Subscription Key ของ Bing Search V7",
|
||||
"Bio": "ประวัติส่วนตัว",
|
||||
"Birth Date": "วันเกิด",
|
||||
"Blocked Groups": "",
|
||||
"Blocked Groups": "กลุ่มที่ถูกบล็อก",
|
||||
"BM25 Weight": "น้ำหนัก BM25",
|
||||
"Bocha Search API Key": "API Key ของ Bocha Search",
|
||||
"Bold": "ตัวหนา",
|
||||
"Boosting or penalizing specific tokens for constrained responses. Bias values will be clamped between -100 and 100 (inclusive). (Default: none)": "เพิ่มหรือลดน้ำหนักโทเค็นเฉพาะสำหรับการตอบกลับที่มีข้อจำกัด ค่าไบแอสจะถูกจำกัดระหว่าง -100 ถึง 100 (รวม) (ค่าเริ่มต้น: ไม่มี)",
|
||||
"Brave": "",
|
||||
"Brave Search API Key": "คีย์ API ของ Brave Search",
|
||||
"Break down complex requests into trackable steps": "",
|
||||
"Browse and query knowledge bases": "",
|
||||
"Builtin Tools": "",
|
||||
"Break down complex requests into trackable steps": "แจ้งคำขอที่ซับซ้อนออกเป็นขั้นตอนที่สามารถติดตามได้",
|
||||
"Browse and query knowledge bases": "เรียกดูและqueryฐานความรู้",
|
||||
"Builtin Tools": "อุปกรณ์ที่มีอยู่ในตัว",
|
||||
"Bullet List": "รายการหัวข้อย่อย",
|
||||
"Button ID": "ID ของปุ่ม",
|
||||
"Button Label": "ป้ายชื่อปุ่ม",
|
||||
"Button Prompt": "พรอมต์ของปุ่ม",
|
||||
"by {{name}}": "",
|
||||
"by {{name}}": "โดย {{name}}",
|
||||
"By {{name}}": "โดย {{name}}",
|
||||
"Bypass Embedding and Retrieval": "ข้าม Embedding และการค้นคืน",
|
||||
"Bypass Web Loader": "ข้ามตัวโหลดเว็บไซต์",
|
||||
"Cache Base Model List": "แคชรายการโมเดลพื้นฐาน",
|
||||
"Calendar": "ปฏิทิน",
|
||||
"Calendar created": "",
|
||||
"Calendar deleted": "",
|
||||
"Calendar name": "",
|
||||
"Calendars": "",
|
||||
"Calendars Public Sharing": "",
|
||||
"Calendar created": "ปฏิทินถูกสร้าง",
|
||||
"Calendar deleted": "ปฏิทินถูกลบ",
|
||||
"Calendar name": "ชื่อปฏิทิน",
|
||||
"Calendars": "ปฏิทิน",
|
||||
"Calendars Public Sharing": "การแชร์ปฏิทินสาธารณะ",
|
||||
"Call": "โทร",
|
||||
"Call feature is not supported when using Web STT engine": "ไม่รองรับฟีเจอร์การโทรเมื่อใช้เอนจิน Web STT",
|
||||
"Camera": "กล้อง",
|
||||
"Cancel": "ยกเลิก",
|
||||
"Cancel download of {{model}}": "",
|
||||
"Cannot create an empty note.": "",
|
||||
"Cannot delete the production version": "",
|
||||
"Cancel download of {{model}}": "ยกเลิกการดาวน์โหลด {{model}}",
|
||||
"Cannot create an empty note.": "ไม่สามารถสร้างบันทึกว่างได้",
|
||||
"Cannot delete the production version": "ไม่สามารถลบเวอร์ชันที่ใช้งานจริงได้",
|
||||
"Capabilities": "ความสามารถ",
|
||||
"Capture": "จับภาพ",
|
||||
"Capture Audio": "จับเสียง",
|
||||
"Certificate Path": "เส้นทางใบรับรอง",
|
||||
"Change folder icon": "",
|
||||
"Change folder icon": "เปลี่ยนไอคอนโฟลเดอร์",
|
||||
"Change Password": "เปลี่ยนรหัสผ่าน",
|
||||
"Change User Role": "",
|
||||
"Change User Role": "เปลี่ยนบทบาทผู้ใช้",
|
||||
"Channel": "ช่องทาง",
|
||||
"Channel deleted successfully": "ลบช่องสำเร็จแล้ว",
|
||||
"Channel Name": "ชื่อช่องทาง",
|
||||
"Channel name cannot be empty.": "ชื่อช่องไม่สามารถเว้นว่างได้",
|
||||
"Channel name must be less than 128 characters": "",
|
||||
"Channel Type": "",
|
||||
"Channel name must be less than 128 characters": "ชื่อช่องต้องมีความยาวน้อยกว่า 128 ตัวอักษร",
|
||||
"Channel Type": "ประเภทช่องทาง",
|
||||
"Channel updated successfully": "อัปเดตช่องสำเร็จแล้ว",
|
||||
"Channels": "ช่องทาง",
|
||||
"Character": "ตัวละคร",
|
||||
@@ -1274,6 +1274,7 @@
|
||||
"Jina API Key": "API Key ของ Jina",
|
||||
"join our Discord for help.": "เข้าร่วม Discord ของเราเพื่อขอความช่วยเหลือ",
|
||||
"JSON": "JSON",
|
||||
"JSON Base64": "",
|
||||
"JSON Preview": "ดูตัวอย่าง JSON",
|
||||
"JSON Spec": "สเปก JSON",
|
||||
"July": "กรกฎาคม",
|
||||
@@ -1406,6 +1407,7 @@
|
||||
"Memory added successfully": "เพิ่มความจำสำเร็จ",
|
||||
"Memory cleared successfully": "ล้างความจำสำเร็จแล้ว",
|
||||
"Memory deleted successfully": "ลบความจำสำเร็จ",
|
||||
"Memory System Context": "",
|
||||
"Memory updated successfully": "อัปเดตความจำสำเร็จแล้ว",
|
||||
"Merge Accounts by Email": "",
|
||||
"Merge Responses": "รวมคำตอบ",
|
||||
@@ -1485,6 +1487,7 @@
|
||||
"More Options": "ตัวเลือกเพิ่มเติม",
|
||||
"Move": "ย้าย",
|
||||
"Moved {{name}}": "",
|
||||
"Multipart Upload": "",
|
||||
"Mute": "",
|
||||
"Muted": "",
|
||||
"My Terminal": "",
|
||||
@@ -1864,6 +1867,7 @@
|
||||
"Reply in Thread": "ตอบกลับในเธรด",
|
||||
"Reply to thread...": "ตอบกลับเธรด...",
|
||||
"Replying to {{NAME}}": "กำลังตอบกลับ {{NAME}}",
|
||||
"Request Format": "",
|
||||
"Require users to confirm before using Web Search.": "",
|
||||
"required": "จำเป็น",
|
||||
"Reranking Batch Size": "",
|
||||
@@ -2367,7 +2371,6 @@
|
||||
"Upload Pipeline": "อัปโหลด Pipeline",
|
||||
"Upload profile image": "",
|
||||
"Upload Progress": "ความคืบหน้าการอัปโหลด",
|
||||
"Upload Progress: {{uploadedFiles}}/{{totalFiles}} ({{percentage}}%)": "ความคืบหน้าการอัปโหลด: {{uploadedFiles}}/{{totalFiles}} ({{percentage}}%)",
|
||||
"Uploaded files or images": "",
|
||||
"Uploading {{current}}/{{total}}: {{file}}": "",
|
||||
"Uploading...": "",
|
||||
|
||||
@@ -1281,6 +1281,7 @@
|
||||
"Jina API Key": "",
|
||||
"join our Discord for help.": "",
|
||||
"JSON": "",
|
||||
"JSON Base64": "",
|
||||
"JSON Preview": "",
|
||||
"JSON Spec": "",
|
||||
"July": "Iýul",
|
||||
@@ -1413,6 +1414,7 @@
|
||||
"Memory added successfully": "",
|
||||
"Memory cleared successfully": "",
|
||||
"Memory deleted successfully": "",
|
||||
"Memory System Context": "",
|
||||
"Memory updated successfully": "",
|
||||
"Merge Accounts by Email": "",
|
||||
"Merge Responses": "",
|
||||
@@ -1492,6 +1494,7 @@
|
||||
"More Options": "",
|
||||
"Move": "",
|
||||
"Moved {{name}}": "",
|
||||
"Multipart Upload": "",
|
||||
"Mute": "",
|
||||
"Muted": "",
|
||||
"My Terminal": "",
|
||||
@@ -1873,6 +1876,7 @@
|
||||
"Reply in Thread": "",
|
||||
"Reply to thread...": "",
|
||||
"Replying to {{NAME}}": "",
|
||||
"Request Format": "",
|
||||
"Require users to confirm before using Web Search.": "",
|
||||
"required": "",
|
||||
"Reranking Batch Size": "",
|
||||
@@ -2378,7 +2382,6 @@
|
||||
"Upload Pipeline": "",
|
||||
"Upload profile image": "",
|
||||
"Upload Progress": "",
|
||||
"Upload Progress: {{uploadedFiles}}/{{totalFiles}} ({{percentage}}%)": "",
|
||||
"Uploaded files or images": "",
|
||||
"Uploading {{current}}/{{total}}: {{file}}": "",
|
||||
"Uploading...": "",
|
||||
|
||||
@@ -1281,6 +1281,7 @@
|
||||
"Jina API Key": "Jina API Anahtarı",
|
||||
"join our Discord for help.": "yardım için Discord'umuza katılın.",
|
||||
"JSON": "JSON",
|
||||
"JSON Base64": "",
|
||||
"JSON Preview": "JSON Önizlemesi",
|
||||
"JSON Spec": "JSON Belirtimi",
|
||||
"July": "Temmuz",
|
||||
@@ -1413,6 +1414,7 @@
|
||||
"Memory added successfully": "Bellek başarıyla eklendi",
|
||||
"Memory cleared successfully": "Bellek başarıyla temizlendi",
|
||||
"Memory deleted successfully": "Bellek başarıyla silindi",
|
||||
"Memory System Context": "",
|
||||
"Memory updated successfully": "Bellek başarıyla güncellendi",
|
||||
"Merge Accounts by Email": "",
|
||||
"Merge Responses": "Yanıtları Birleştir",
|
||||
@@ -1492,6 +1494,7 @@
|
||||
"More Options": "Diğer Seçenekler",
|
||||
"Move": "Taşı",
|
||||
"Moved {{name}}": "{{name}} taşındı",
|
||||
"Multipart Upload": "",
|
||||
"Mute": "Sessize Al",
|
||||
"Muted": "Sessize Alındı",
|
||||
"My Terminal": "Terminalim",
|
||||
@@ -1873,6 +1876,7 @@
|
||||
"Reply in Thread": "Konuya Yanıtla",
|
||||
"Reply to thread...": "Konuya yanıt ver...",
|
||||
"Replying to {{NAME}}": "{{NAME}} kullanıcısına yanıt veriliyor",
|
||||
"Request Format": "",
|
||||
"Require users to confirm before using Web Search.": "",
|
||||
"required": "gerekli",
|
||||
"Reranking Batch Size": "Yeniden Sıralama Toplu İş Boyutu",
|
||||
@@ -2378,7 +2382,6 @@
|
||||
"Upload Pipeline": "Pipeline Yükle",
|
||||
"Upload profile image": "Profil resmi yükle",
|
||||
"Upload Progress": "Yükleme İlerlemesi",
|
||||
"Upload Progress: {{uploadedFiles}}/{{totalFiles}} ({{percentage}}%)": "Yükleme İlerlemesi: {{uploadedFiles}}/{{totalFiles}} ({{percentage}}%)",
|
||||
"Uploaded files or images": "Yüklenen dosyalar veya görüntüler",
|
||||
"Uploading {{current}}/{{total}}: {{file}}": "",
|
||||
"Uploading...": "Yükleniyor...",
|
||||
|
||||
@@ -1281,6 +1281,7 @@
|
||||
"Jina API Key": "Jina API ئاچقۇچى",
|
||||
"join our Discord for help.": "ياردەم ئۈچۈن Discord غا قوشۇلىڭ.",
|
||||
"JSON": "JSON",
|
||||
"JSON Base64": "",
|
||||
"JSON Preview": "JSON ئالدىن كۆرۈش",
|
||||
"JSON Spec": "",
|
||||
"July": "ئىيۇل",
|
||||
@@ -1413,6 +1414,7 @@
|
||||
"Memory added successfully": "ئەسلەتمە مۇۋەپپەقىيەتلىك قوشۇلدى",
|
||||
"Memory cleared successfully": "ئەسلەتمە مۇۋەپپەقىيەتلىك تازىلاندى",
|
||||
"Memory deleted successfully": "ئەسلەتمە مۇۋەپپەقىيەتلىك ئۆچۈرۈلدى",
|
||||
"Memory System Context": "",
|
||||
"Memory updated successfully": "ئەسلەتمە مۇۋەپپەقىيەتلىك يېڭىلاندى",
|
||||
"Merge Accounts by Email": "",
|
||||
"Merge Responses": "ئىنكاسلارنى بىرلەشتۈرۈش",
|
||||
@@ -1492,6 +1494,7 @@
|
||||
"More Options": "",
|
||||
"Move": "",
|
||||
"Moved {{name}}": "",
|
||||
"Multipart Upload": "",
|
||||
"Mute": "",
|
||||
"Muted": "",
|
||||
"My Terminal": "",
|
||||
@@ -1873,6 +1876,7 @@
|
||||
"Reply in Thread": "تارماقتا ئىنكاس قايتۇرۇش",
|
||||
"Reply to thread...": "",
|
||||
"Replying to {{NAME}}": "",
|
||||
"Request Format": "",
|
||||
"Require users to confirm before using Web Search.": "",
|
||||
"required": "",
|
||||
"Reranking Batch Size": "",
|
||||
@@ -2378,7 +2382,6 @@
|
||||
"Upload Pipeline": "جەريان چىقىرىش",
|
||||
"Upload profile image": "",
|
||||
"Upload Progress": "چىقىرىش جەريانى",
|
||||
"Upload Progress: {{uploadedFiles}}/{{totalFiles}} ({{percentage}}%)": "",
|
||||
"Uploaded files or images": "",
|
||||
"Uploading {{current}}/{{total}}: {{file}}": "",
|
||||
"Uploading...": "",
|
||||
|
||||
@@ -1295,6 +1295,7 @@
|
||||
"Jina API Key": "Ключ API для Jina",
|
||||
"join our Discord for help.": "приєднуйтеся до нашого Discord для допомоги.",
|
||||
"JSON": "JSON",
|
||||
"JSON Base64": "",
|
||||
"JSON Preview": "Перегляд JSON",
|
||||
"JSON Spec": "",
|
||||
"July": "Липень",
|
||||
@@ -1427,6 +1428,7 @@
|
||||
"Memory added successfully": "Пам'ять додано успішно",
|
||||
"Memory cleared successfully": "Пам'ять успішно очищено",
|
||||
"Memory deleted successfully": "Пам'ять успішно видалено",
|
||||
"Memory System Context": "",
|
||||
"Memory updated successfully": "Пам'ять успішно оновлено",
|
||||
"Merge Accounts by Email": "",
|
||||
"Merge Responses": "Об'єднати відповіді",
|
||||
@@ -1506,6 +1508,7 @@
|
||||
"More Options": "",
|
||||
"Move": "",
|
||||
"Moved {{name}}": "",
|
||||
"Multipart Upload": "",
|
||||
"Mute": "",
|
||||
"Muted": "",
|
||||
"My Terminal": "",
|
||||
@@ -1891,6 +1894,7 @@
|
||||
"Reply in Thread": "Відповісти в потоці",
|
||||
"Reply to thread...": "",
|
||||
"Replying to {{NAME}}": "",
|
||||
"Request Format": "",
|
||||
"Require users to confirm before using Web Search.": "",
|
||||
"required": "",
|
||||
"Reranking Batch Size": "",
|
||||
@@ -2400,7 +2404,6 @@
|
||||
"Upload Pipeline": "Завантажити конвеєр",
|
||||
"Upload profile image": "",
|
||||
"Upload Progress": "Прогрес завантаження",
|
||||
"Upload Progress: {{uploadedFiles}}/{{totalFiles}} ({{percentage}}%)": "",
|
||||
"Uploaded files or images": "",
|
||||
"Uploading {{current}}/{{total}}: {{file}}": "",
|
||||
"Uploading...": "",
|
||||
|
||||
@@ -1281,6 +1281,7 @@
|
||||
"Jina API Key": "",
|
||||
"join our Discord for help.": "مدد کے لئے ہمارے ڈسکارڈ میں شامل ہوں",
|
||||
"JSON": "JSON",
|
||||
"JSON Base64": "",
|
||||
"JSON Preview": "JSON پیش منظر",
|
||||
"JSON Spec": "",
|
||||
"July": "جولائی",
|
||||
@@ -1413,6 +1414,7 @@
|
||||
"Memory added successfully": "میموری کامیابی سے شامل کر دی گئی",
|
||||
"Memory cleared successfully": "یادداشت کامیابی سے صاف ہوگئی",
|
||||
"Memory deleted successfully": "میموری کامیابی سے حذف ہوگئی",
|
||||
"Memory System Context": "",
|
||||
"Memory updated successfully": "حافظہ کامیابی سے اپ ڈیٹ کر دیا گیا",
|
||||
"Merge Accounts by Email": "",
|
||||
"Merge Responses": "جوابات کو یکجا کریں",
|
||||
@@ -1492,6 +1494,7 @@
|
||||
"More Options": "",
|
||||
"Move": "",
|
||||
"Moved {{name}}": "",
|
||||
"Multipart Upload": "",
|
||||
"Mute": "",
|
||||
"Muted": "",
|
||||
"My Terminal": "",
|
||||
@@ -1873,6 +1876,7 @@
|
||||
"Reply in Thread": "",
|
||||
"Reply to thread...": "",
|
||||
"Replying to {{NAME}}": "",
|
||||
"Request Format": "",
|
||||
"Require users to confirm before using Web Search.": "",
|
||||
"required": "",
|
||||
"Reranking Batch Size": "",
|
||||
@@ -2378,7 +2382,6 @@
|
||||
"Upload Pipeline": "اپ لوڈ پائپ لائن",
|
||||
"Upload profile image": "",
|
||||
"Upload Progress": "اپ لوڈ کی پیش رفت",
|
||||
"Upload Progress: {{uploadedFiles}}/{{totalFiles}} ({{percentage}}%)": "",
|
||||
"Uploaded files or images": "",
|
||||
"Uploading {{current}}/{{total}}: {{file}}": "",
|
||||
"Uploading...": "",
|
||||
|
||||
@@ -1281,6 +1281,7 @@
|
||||
"Jina API Key": "Жина АПИ калити",
|
||||
"join our Discord for help.": "ёрдам учун Дисcордимизга қўшилинг.",
|
||||
"JSON": "ЖСОН",
|
||||
"JSON Base64": "",
|
||||
"JSON Preview": "ЖСОН кўриб чиқиш",
|
||||
"JSON Spec": "",
|
||||
"July": "июл",
|
||||
@@ -1413,6 +1414,7 @@
|
||||
"Memory added successfully": "Хотира муваффақиятли қўшилди",
|
||||
"Memory cleared successfully": "Хотира муваффақиятли тозаланди",
|
||||
"Memory deleted successfully": "Хотира муваффақиятли ўчирилди",
|
||||
"Memory System Context": "",
|
||||
"Memory updated successfully": "Хотира муваффақиятли янгиланди",
|
||||
"Merge Accounts by Email": "",
|
||||
"Merge Responses": "Жавобларни бирлаштириш",
|
||||
@@ -1492,6 +1494,7 @@
|
||||
"More Options": "",
|
||||
"Move": "",
|
||||
"Moved {{name}}": "",
|
||||
"Multipart Upload": "",
|
||||
"Mute": "",
|
||||
"Muted": "",
|
||||
"My Terminal": "",
|
||||
@@ -1873,6 +1876,7 @@
|
||||
"Reply in Thread": "Мавзуда жавоб беринг",
|
||||
"Reply to thread...": "",
|
||||
"Replying to {{NAME}}": "",
|
||||
"Request Format": "",
|
||||
"Require users to confirm before using Web Search.": "",
|
||||
"required": "",
|
||||
"Reranking Batch Size": "",
|
||||
@@ -2378,7 +2382,6 @@
|
||||
"Upload Pipeline": "Қувур линиясини юклаш",
|
||||
"Upload profile image": "",
|
||||
"Upload Progress": "Юклаш жараёни",
|
||||
"Upload Progress: {{uploadedFiles}}/{{totalFiles}} ({{percentage}}%)": "",
|
||||
"Uploaded files or images": "",
|
||||
"Uploading {{current}}/{{total}}: {{file}}": "",
|
||||
"Uploading...": "",
|
||||
|
||||
@@ -1281,6 +1281,7 @@
|
||||
"Jina API Key": "Jina API kaliti",
|
||||
"join our Discord for help.": "yordam uchun Discordimizga qo'shiling.",
|
||||
"JSON": "JSON",
|
||||
"JSON Base64": "",
|
||||
"JSON Preview": "JSON ko'rib chiqish",
|
||||
"JSON Spec": "",
|
||||
"July": "iyul",
|
||||
@@ -1413,6 +1414,7 @@
|
||||
"Memory added successfully": "Xotira muvaffaqiyatli qo'shildi",
|
||||
"Memory cleared successfully": "Xotira muvaffaqiyatli tozalandi",
|
||||
"Memory deleted successfully": "Xotira muvaffaqiyatli oʻchirildi",
|
||||
"Memory System Context": "",
|
||||
"Memory updated successfully": "Xotira muvaffaqiyatli yangilandi",
|
||||
"Merge Accounts by Email": "",
|
||||
"Merge Responses": "Javoblarni birlashtirish",
|
||||
@@ -1492,6 +1494,7 @@
|
||||
"More Options": "",
|
||||
"Move": "",
|
||||
"Moved {{name}}": "",
|
||||
"Multipart Upload": "",
|
||||
"Mute": "",
|
||||
"Muted": "",
|
||||
"My Terminal": "",
|
||||
@@ -1873,6 +1876,7 @@
|
||||
"Reply in Thread": "Mavzuda javob bering",
|
||||
"Reply to thread...": "",
|
||||
"Replying to {{NAME}}": "",
|
||||
"Request Format": "",
|
||||
"Require users to confirm before using Web Search.": "",
|
||||
"required": "",
|
||||
"Reranking Batch Size": "",
|
||||
@@ -2378,7 +2382,6 @@
|
||||
"Upload Pipeline": "Quvur liniyasini yuklash",
|
||||
"Upload profile image": "",
|
||||
"Upload Progress": "Yuklash jarayoni",
|
||||
"Upload Progress: {{uploadedFiles}}/{{totalFiles}} ({{percentage}}%)": "",
|
||||
"Uploaded files or images": "",
|
||||
"Uploading {{current}}/{{total}}: {{file}}": "",
|
||||
"Uploading...": "",
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user